geomview-1.9.5/0000755000175000017500000000000012310165605010350 500000000000000geomview-1.9.5/m4/0000755000175000017500000000000012310165601010664 500000000000000geomview-1.9.5/m4/check-package.m40000644000175000017500000002352212310110176013515 00000000000000dnl GEOMVIEW_CHECK_PACKAGE() dnl dnl Check for a library + header files dnl dnl Arguments: dnl dnl $1: symbolic name (fancy) dnl $2: library name (base name, lib$2[.so|.a] dnl $3: library path (-L$3) dnl $4: additional libraries needed (e.g. -lm -lGL) dnl $5: header name dnl $6: include path for $5 (-I$6) dnl $7: additional include paths (e.g. when $5 includes some other headers) dnl $8: a space separated list of the keywords dnl dnl optional, required, disabled, enabled dnl dnl optional: failing to detect the package is not fatal dnl required: configure is terminated when the package is not detected dnl (default) dnl disabled: package is initially disabled and needs the appropriate dnl --with-blah switch, otherwise the package is not checked for dnl enabled: package is initially enabled (the default) dnl dnl Default is to check for libraries below $prefix/lib/ and for header-files dnl below $prefix/include/ dnl dnl $5 may be empty (e.g. to check for a Fortran library). In this case dnl $6 and $7 are ignored dnl dnl This Macro defines the following variables (UPNAME means a dnl canonicalized version of $1: i.e. uppercase and - converted to _) dnl dnl Makefile-substitution dnl dnl UPNAME[]_INCLUDE_PATH dnl UPNAME[]_LIB_PATH dnl UPNAME[]_INCLUDE dnl UPNAME[]_LIB linker flags excluding $4 dnl UPNAME[]_ALL_LIB linker flags including $4 dnl dnl config.h preprocessor macros dnl dnl HAVE_LIB$2 dnl HAVE_$5_H dnl dnl Automake conditional dnl dnl AM_CONDITIONAL([HAVE_]UPNAME, [test -n "$[]UPNAME[_LIB]"]) dnl dnl Helper-macros dnl dnl dnl GEOMVIEW_CHECK_PKG_OPT(PKGNAME) dnl AC_DEFUN([GEOMVIEW_CHECK_PKG_OPT], [m4_define([UPNAME], [m4_bpatsubst(m4_toupper([$1]),-,_)]) m4_if($2,enabled, [m4_define([NEGDEFAULT],[without]) m4_define([NEGVERB],[disable]) m4_define([DEFAULT],[autodetect])], [m4_define([NEGDEFAULT],[with]) m4_define([NEGVERB],[enable]) m4_define([DEFAULT],[disabled])]) AC_ARG_WITH($1, AC_HELP_STRING(--[]NEGDEFAULT[]-$1, [NEGVERB use of package $1 (default: DEFAULT)]), [if test -z "$[]UPNAME[_DISABLE]"; then case "$withval" in yes) UPNAME[_DISABLE]=no ;; no) UPNAME[_DISABLE]=yes AC_MSG_RESULT([Disabling "$1"]) ;; *) AC_MSG_ERROR(["$withval" should have been either "yes" or "no"]) ;; esac fi], [if test -z "$[]UPNAME[_DISABLE]"; then m4_if($2,enabled, [UPNAME[_DISABLE]=no], [UPNAME[_DISABLE]=yes]) fi]) ]) dnl dnl GEOMVIEW_CHECK_PKG_HDR_OPT(PKGNAME, INCLUDEPATH) dnl AC_DEFUN([GEOMVIEW_CHECK_PKG_HDR_OPT], [m4_define([UPNAME], [m4_bpatsubst(m4_toupper([$1]),-,_)]) AC_ARG_WITH($1-headers, m4_if($2,[], [AC_HELP_STRING([--with-$1-headers=DIR], [use $1 include files below directory DIR (default: PREFIX/include/)])], [AC_HELP_STRING([--with-$1-headers=DIR], [use $1 include files below directory DIR (default: $2)])]), [case "$withval" in yes) AC_MSG_ERROR("option \"--with-$1-headers\" requires an argument") ;; no) AC_MSG_ERROR("option \"--with-$1-headers\" requires an argument") ;; *) UPNAME[_INCLUDE_PATH]="$withval" ;; esac], test -z "`eval eval eval echo ${UPNAME[_INCLUDE_PATH]}`" && UPNAME[_INCLUDE_PATH]="${DEFAULT_INCDIR}") ]) dnl dnl headers and libraries below the same directory :( dnl AC_DEFUN([GEOMVIEW_CHECK_PKG_DIR_OPT], [m4_define([UPNAME], [m4_bpatsubst(m4_toupper([$1]),-,_)]) AC_ARG_WITH($1-dir, AC_HELP_STRING([--with-$1-dir=DIR], [use $1 library (and headers) below directory DIR (no default)]), [case "$withval" in yes) AC_MSG_ERROR("option \"--with-$1-dir\" requires an argument") ;; no) AC_MSG_ERROR("option \"--with-$1-dir\" requires an argument") ;; *) UPNAME[_LIB_PATH]="$withval" UPNAME[_INCLUDE_PATH]="$withval" ;; esac]) ]) dnl dnl the macro itself dnl AC_DEFUN([GEOMVIEW_CHECK_PACKAGE], [AC_REQUIRE([GEOMVIEW_SET_PREFIX]) dnl m4_if($#,8,, dnl [m4_if($#,9,, dnl [errprint([$0] needs eight (8) or nine (9) arguments, but got $# dnl ) dnl m4exit(1)])]) dnl dnl upcase $1 dnl m4_define([UPNAME], [m4_bpatsubst(m4_toupper([$1]),-,_)]) dnl dnl need to use m4_if, the $i arguments are not shell variables dnl m4_define([ENABLED],[enabled]) m4_define([OPTIONAL],[required]) m4_if($#,8,[ m4_foreach_w([ac_gv_lvar],[$8], [m4_if(ac_gv_lvar,[disabled], [m4_define([ENABLED],ac_gv_lvar)], ac_gv_lvar,[enabled], [m4_define([ENABLED],ac_gv_lvar)], ac_gv_lvar,[optional], [m4_define([OPTIONAL],ac_gv_lvar)], ac_gv_lvar,[required], [m4_define([OPTIONAL],ac_gv_lvar)])])]) m4_if(OPTIONAL,[optional],[GEOMVIEW_CHECK_PKG_OPT([$1],[ENABLED])]) dnl dnl bail out if package is completely disabled dnl if test "${UPNAME[_DISABLE]}" = yes; then : else m4_if($3,[],[DEFAULT_LIBDIR="${libdir}"], [DEFAULT_LIBDIR="$3"]) if test "${DEFAULT_LIBDIR}" = '' then DEFAULT_LIBDIR="'${libdir}'" fi dnl dnl Optionally use an alternate name (e.g. MesaGL instead of GL etc.) dnl AC_ARG_WITH($1-name, AC_HELP_STRING([--with-$1-name=NAME], [use NAME as the name of the $1 library (without leading "lib" prefix and trailing suffix). Default: "$2"]), [case "$withval" in yes) AC_MSG_ERROR("option \"--with-$1-name\" requires an argument") ;; no) AC_MSG_ERROR("option \"--with-$1-name\" requires an argument") ;; *) UPNAME[_NAME]="$withval" ;; esac], UPNAME[_NAME]="$2") dnl dnl headers and libraries below the same directory :( dnl If we have no header to check for, then this additional option does not dnl make sense, hence the m4_if() dnl m4_if($5,[],[],[GEOMVIEW_CHECK_PKG_DIR_OPT([$1])]) dnl dnl location of library dnl AC_ARG_WITH($1-lib, m4_if($3,[], [AC_HELP_STRING([--with-$1-lib=DIR], [use $1 library below directory DIR (default: EPREFIX/lib/)])], [AC_HELP_STRING([--with-$1-lib=DIR], [use $1 library below directory DIR (default: $3)])]), [case "$withval" in yes) AC_MSG_ERROR("option \"--with-$1-lib\" requires an argument") ;; no) AC_MSG_ERROR("option \"--with-$1-lib\" requires an argument") ;; *) UPNAME[_LIB_PATH]="$withval" ;; esac], test -z "`eval eval eval echo ${UPNAME[_LIB_PATH]}`" && UPNAME[_LIB_PATH]="${DEFAULT_LIBDIR}") dnl dnl now for the header file dnl m4_if($5,[],[], [m4_if($6,[],[DEFAULT_INCDIR="${includedir}" GEOMVIEW_CHECK_PKG_HDR_OPT([$1], [PREFIX/include/])], [DEFAULT_INCDIR="$6" GEOMVIEW_CHECK_PKG_HDR_OPT([$1], [$6/])])]) dnl dnl now check if the library and header files exist dnl m4_if(OPTIONAL,[optional], [AC_CHECK_LIB(${UPNAME[_NAME]}, main, [UPNAME[_LIB]="-L${UPNAME[_LIB_PATH]} -l${UPNAME[_NAME]}" UPNAME[_ALL_LIB]="-L${UPNAME[_LIB_PATH]} -l${UPNAME[_NAME]} $4"], [UPNAME[_LIB]="" UPNAME[_ALL_LIB]="" UPNAME[_LIB_PATH]="" UPNAME[_INCLUDE_PATH]=""], -L`eval eval eval echo ${UPNAME[_LIB_PATH]}` $4)], [AC_CHECK_LIB(${UPNAME[_NAME]}, main, [UPNAME[_LIB]="-L${UPNAME[_LIB_PATH]} -l${UPNAME[_NAME]}" UPNAME[_ALL_LIB]="-L${UPNAME[_LIB_PATH]} -l${UPNAME[_NAME]} $4"], [case "$host" in *darwin*) AC_MSG_RESULT([Running the test for "$1" again with -framework switch]) ;; *) AC_MSG_ERROR([Library "lib${UPNAME[_NAME]}" was not found]) ;; esac], -L`eval eval eval echo $UPNAME[_LIB_PATH]` `eval eval eval echo $4`)]) dnl dnl On MacOS X we have that funky -framework switch ... dnl So just run the test again with the framework switch in case the dnl package was not found. dnl if test "x${UPNAME[_LIB]}" = "x" ; then case "$host" in *darwin*) eval "unset ac_cv_lib_${UPNAME[_NAME]}___main" m4_if(OPTIONAL,[optional], [AC_CHECK_FRAMEWORK(${UPNAME[_NAME]}, main, [UPNAME[_LIB]="-F${UPNAME[_LIB_PATH]} -framework ${UPNAME[_NAME]}" UPNAME[_ALL_LIB]="-F${UPNAME[_LIB_PATH]} -framework ${UPNAME[_NAME]} $4"], [UPNAME[_LIB]="" UPNAME[_ALL_LIB]="" UPNAME[_LIB_PATH]="" UPNAME[_INCLUDE_PATH]=""], -F`eval eval eval echo ${UPNAME[_LIB_PATH]}` `eval eval eval echo $4`)], [AC_CHECK_FRAMEWORK(${UPNAME[_NAME]}, main, [UPNAME[_LIB]="-F${UPNAME[_LIB_PATH]} -framework ${UPNAME[_NAME]}" UPNAME[_ALL_LIB]="-F${UPNAME[_LIB_PATH]} -framework ${UPNAME[_NAME]} $4"], [AC_MSG_ERROR([Framework "${UPNAME[_NAME]}" was not found])], -F`eval eval eval echo $UPNAME[_LIB_PATH]` `eval eval eval echo $4`)]) ;; esac fi if test "x${UPNAME[_LIB]}" = "x" ; then : else m4_if($5,[],,[ dnl dnl check for the header file dnl [gv_ac_]UPNAME[_save_CPPFLAGS]="$CPPFLAGS" m4_define([gv_ac_inctemp],[m4_bpatsubst([gv_ac_$5],[[].-[]],_)]) unset gv_ac_inctemp for incdir in "${UPNAME[_INCLUDE_PATH]}"; do if test -n "`eval eval eval echo ${incdir}`"; then CPPFLAGS="-I`eval eval eval echo ${incdir}` $7 ${[gv_ac_]UPNAME[_save_CPPFLAGS]}" fi AC_CHECK_HEADERS($5,[gv_ac_inctemp="$5"]) if ! test "${gv_ac_inctemp}" = "$5"; then eval "[unset ac_cv_header_]m4_bpatsubst([$5],[[].-[]],_)" else break fi done if ! test "${gv_ac_inctemp}" = "$5"; then m4_if(OPTIONAL,[optional], [UPNAME[_LIB]="" UPNAME[_ALL_LIB]="" UPNAME[_LIB_PATH]="" UPNAME[_INCLUDE_PATH]=""], [AC_MSG_ERROR([Header file "$5" was not found])]) else UPNAME[_ALL_INCLUDES]="-I${incdir} $7" UPNAME[_INCLUDES]="-I${incdir}" UPNAME[_INCLUDE_PATH]="${incdir}" fi CPPFLAGS="${[gv_ac_]UPNAME[_save_CPPFLAGS]}" ]) dnl dnl define makefile substitutions and config.h macros dnl if test "x${UPNAME[_LIB]}" = "x" ; then : else AC_DEFINE(m4_bpatsubst(m4_toupper([HAVE_LIB$2]),-,_), 1, Define to 1 if you have lib$2) fi fi fi dnl disable fi AM_CONDITIONAL([HAVE_]UPNAME, [test -n "$[]UPNAME[_LIB]"]) AC_SUBST(UPNAME[_INCLUDE_PATH]) AC_SUBST(UPNAME[_INCLUDES]) AC_SUBST(UPNAME[_ALL_INCLUDES]) AC_SUBST(UPNAME[_LIB_PATH]) AC_SUBST(UPNAME[_LIB]) AC_SUBST(UPNAME[_ALL_LIB]) AC_SUBST(UPNAME[_NAME]) ]) geomview-1.9.5/m4/frameworks.m40000644000175000017500000000567712310110176013242 00000000000000# AC_SEARCH_FRAMEWORKS(FUNCTION, SEARCH-FRAMEWORKS, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], # [OTHER-LIBRARIES]) # -------------------------------------------------------- # Search for a library defining FUNC, if it's not already available. AC_DEFUN([AC_SEARCH_FRAMEWORKS], [AC_CACHE_CHECK([for library containing $1], [ac_cv_search_$1], [ac_func_search_save_LIBS=$LIBS ac_cv_search_$1=no AC_LINK_IFELSE([AC_LANG_CALL([], [$1])], [ac_cv_search_$1="none required"]) if test "$ac_cv_search_$1" = no; then for ac_lib in $2; do LIBS="-framework $ac_lib $5 $ac_func_search_save_LIBS" AC_LINK_IFELSE([AC_LANG_CALL([], [$1])], [ac_cv_search_$1="-framework $ac_lib" break]) done fi LIBS=$ac_func_search_save_LIBS]) AS_IF([test "$ac_cv_search_$1" != no], [test "$ac_cv_search_$1" = "none required" || LIBS="$ac_cv_search_$1 $LIBS" $3], [$4])dnl ]) # AC_CHECK_LIB(LIBRARY, FUNCTION, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], # [OTHER-LIBRARIES]) # ------------------------------------------------------ # # Use a cache variable name containing both the library and function name, # because the test really is for library $1 defining function $2, not # just for library $1. Separate tests with the same $1 and different $2s # may have different results. # # Note that using directly AS_VAR_PUSHDEF([ac_Lib], [ac_cv_lib_$1_$2]) # is asking for troubles, since AC_CHECK_LIB($lib, fun) would give # ac_cv_lib_$lib_fun, which is definitely not what was meant. Hence # the AS_LITERAL_IF indirection. # # FIXME: This macro is extremely suspicious. It DEFINEs unconditionally, # whatever the FUNCTION, in addition to not being a *S macro. Note # that the cache does depend upon the function we are looking for. # # It is on purpose we used `ac_check_lib_save_LIBS' and not just # `ac_save_LIBS': there are many macros which don't want to see `LIBS' # changed but still want to use AC_CHECK_LIB, so they save `LIBS'. # And ``ac_save_LIBS' is too tempting a name, so let's leave them some # freedom. AC_DEFUN([AC_CHECK_FRAMEWORK], [m4_ifval([$3], , [AH_CHECK_FRAMEWORK([$1])])dnl AS_LITERAL_IF([$1], [AS_VAR_PUSHDEF([ac_Lib], [ac_cv_lib_$1_$2])], [AS_VAR_PUSHDEF([ac_Lib], [ac_cv_lib_$1''_$2])])dnl AC_CACHE_CHECK([for $2 in -framework $1], ac_Lib, [ac_check_lib_save_LIBS=$LIBS LIBS="-framework $1 $5 $LIBS" AC_LINK_IFELSE([AC_LANG_CALL([], [$2])], [AS_VAR_SET(ac_Lib, yes)], [AS_VAR_SET(ac_Lib, no)]) LIBS=$ac_check_lib_save_LIBS]) AS_IF([test AS_VAR_GET(ac_Lib) = yes], [m4_default([$3], [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_LIB$1)) LIBS="-framework $1 $LIBS" ])], [$4])dnl AS_VAR_POPDEF([ac_Lib])dnl ])# AC_CHECK_FRAMEWORK # AH_CHECK_FRAMEWORK(LIBNAME) # --------------------- m4_define([AH_CHECK_FRAMEWORK], [AH_TEMPLATE(AS_TR_CPP(HAVE_LIB$1), [Define to 1 if you have the `]$1[' library (-framework ]$1[).])]) geomview-1.9.5/m4/geom_local.m40000644000175000017500000002144412310110176013151 00000000000000dnl dnl dnl GEOM_LOG_MSG(MESSAGE) define(GEOM_LOG_MSG, [echo "configure:__oline__: $1" >&AC_FD_CC]) dnl dnl GEOM_FIND_L_OPTION(LIB, FUNC, DIRS, OTHERLIBS) dnl dnl Figure out what -L option might be needed to link with the library dnl LIB. FUNC should be some function from that library. DIRS should be a dnl list of directories to try, one of them can be "" which means use no dnl -L option. OTHERLIBS, if present, can be a list of other libraries to dnl link with. Upon return: dnl dnl * If linking was successful, then the shell variable GEOM_L_OPTION dnl is set to the first -L option (including the "-L") that worked, dnl unless what worked was linking with no -L option, in which case dnl GEOM_L_OPTION is the empty string. dnl dnl * If linking didn't work with any of the dirs in DIRS, then dnl GEOM_L_OPTION is 0. dnl AC_DEFUN([GEOM_FIND_L_OPTION],[ geom_lib=$1 geom_func=$2 geom_dirs='$3' geom_otherlibs=$4 geom_saved_LIBS=$LIBS #AC_MSG_CHECKING([how to link with $geom_lib]) GEOM_L_OPTION=0 for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_l_option= test -n "$geom_z" && geom_l_option="-L$geom_z" LIBS="$geom_l_option $geom_lib $geom_otherlibs" GEOM_LOG_MSG([checking for $geom_func with $geom_l_option]) AC_TRY_LINK_FUNC($geom_func, [ GEOM_L_OPTION="$geom_l_option" break ] ) done LIBS=$geom_saved_LIBS #if test "$GEOM_L_OPTION" != "0" ; then # AC_MSG_RESULT([$geom_l_option $geom_lib]) #else # AC_MSG_RESULT([not found]) #fi ]) dnl dnl dnl dnl dnl dnl dnl dnl GEOM_FIND_I_OPTION(HEADER, DIRS) dnl # Find out what -I argument we need in order to get the header file HEADER. # DIRS should be a list of strings to use as -I arguments; the empty # string corresponds to no -I option at all. If we're successful, return # with GEOM_I_OPTION set to the relevant -I option (including the "-I" itself). # Note that this might be the empty string, which corresponds to no -I # option at all. If we don't find HEADER in any of the dirs listed in DIRS, # return with GEOM_I_OPTION = "0". AC_DEFUN([GEOM_FIND_I_OPTION],[ geom_header=$1 geom_dirs='$2' geom_saved_CPPFLAGS=$CPPFLAGS GEOM_I_OPTION="0" #AC_MSG_CHECKING([for $geom_header]) for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_i_option= test -n "$geom_z" && geom_i_option="-I$geom_z" CPPFLAGS="$geom_i_option $geom_saved_CPPFLAGS" GEOM_LOG_MSG([checking for $geom_header with $geom_i_option]) AC_TRY_CPP([ #include <$geom_header> ], [ GEOM_I_OPTION="$geom_i_option" break ] ) done CPPFLAGS=$geom_saved_CPPFLAGS #if test "$GEOM_I_OPTION" = "0" ; then # AC_MSG_RESULT([not found]) #else # if test "$GEOM_I_OPTION" != "" ; then # AC_MSG_RESULT($GEOM_I_OPTION) # else # AC_MSG_RESULT([(found with no -I required)]) # fi #fi ]) dnl dnl dnl GEOM_FIND_LIBC_VERSION dnl dnl Try to figure out which version of the libc library is installed on dnl a linux system. Return with GEOM_LIBC_VERSION set to: dnl dnl 5 for the old libc (libc.so.5) dnl 6 for glibc (i.e., libc.so.6) (RedHat 5.0 and later) dnl dnl default to 6 if we can't figure it out. Note that this test is dnl not really correct; I think there is yet another version of libc dnl that we probably need to distinguish, but I'm not sure and I don't dnl know how to detect it, so this'll have to do for now. If you know dnl more about this, please email me at mbp@geomtech.com. dnl AC_DEFUN([GEOM_FIND_LIBC_VERSION],[ if test -e "/lib/libc.so.6" ; then GEOM_LIBC_VERSION="6" else if test -e "/lib/libc.so.5" ; then GEOM_LIBC_VERSION="5" else GEOM_LIBC_VERSION="6" fi fi ]) dnl dnl GEOM_AC_PROG_CXX (and its internally used GEOM_AC_PROG_CXX_WORKS) is a dnl replacement that I wrote for the standard AC_PROG_CXX (and dnl AC_PROG_CXX_WORKS). It differs from the standard one only in that it dnl does not abort if a C++ compiler isn't found --- it just sets CXX to dnl the empty string. If anyone knows a better way to test for the dnl presense of a C++ compiler without exiting if it isn't found, let me dnl know! [mbp@geomtech.com, Sat Oct 14 00:33:38 2000] dnl AC_DEFUN([GEOM_AC_PROG_CXX_WORKS], [AC_MSG_CHECKING([whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works]) AC_LANG_SAVE AC_LANG_CPLUSPLUS AC_TRY_COMPILER([int main(){return(0);}], ac_cv_prog_cxx_works, ac_cv_prog_cxx_cross) AC_LANG_RESTORE AC_MSG_RESULT($ac_cv_prog_cxx_works) AC_MSG_CHECKING([whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler]) AC_MSG_RESULT($ac_cv_prog_cxx_cross) cross_compiling=$ac_cv_prog_cxx_cross ]) AC_DEFUN([GEOM_AC_PROG_CXX], [AC_BEFORE([$0], [AC_PROG_CXXCPP])dnl AC_CHECK_PROGS(CXX, $CCC c++ g++ gcc CC cxx cc++ cl, gcc) GEOM_AC_PROG_CXX_WORKS if test $ac_cv_prog_cxx_works = no; then CXX= else AC_PROG_CXX_GNU if test $ac_cv_prog_gxx = yes; then GXX=yes else GXX= fi dnl Check whether -g works, even if CXXFLAGS is set, in case the package dnl plays around with CXXFLAGS (such as to build both debugging and dnl normal versions of a library), tasteless as that idea is. ac_test_CXXFLAGS="${CXXFLAGS+set}" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= AC_PROG_CXX_G 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 fi ]) dnl dnl AC_DEFUN([GEOM_GET_CACHED_VALUE],[ AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(ac_cv_$1,[ AC_MSG_ERROR([ Can't find cached value for $1. You're not trying to run 'configure' from $PACKAGE's source directory, are you? You should only run Geomview's top-level 'configure' script, not this one directly. See the file INSTALL in $PACKAGE's source directory for details. ])]) eval $ac_cv_$1 AC_MSG_RESULT([done.]) ]) dnl dnl AC_DEFUN([GEOM_REQUIRE_XFORMS],[ AC_MSG_CHECKING([for xforms]) AC_CACHE_VAL(ac_cv_have_xforms,[:]) eval $ac_cv_have_xforms if test "$have_xforms" != "yes" ; then AC_MSG_RESULT([no]) AC_MSG_ERROR([ $PACKAGE requires the xforms library, but I can't find it in Geomview's top-level config.cache. Please install an xforms distribution appropriate to your machine in the 'xforms' directory under the top-level Geomview directory, delete any existing 'config.cache' file in that directory, and re-run 'configure' in that directory. You should only run Geomview's top-level 'configure' script, not this one directly. See the file INSTALL in $PACKAGE's source directory for details. ]) else XFORMSINCLUDE=$ac_xforms_include XFORMSLIBS=$ac_xforms_libs AC_MSG_RESULT([headers '$ac_xforms_include', libraries '$ac_xforms_libs']) fi ]) dnl Less severe version of the above: just check and WARN dnl AC_DEFUN([GEOM_CHECK_XFORMS],[ AC_MSG_CHECKING([for xforms]) AC_CACHE_VAL(ac_cv_have_xforms,[:]) eval $ac_cv_have_xforms if test "$have_xforms" != "yes" ; then AC_MSG_RESULT([no]) AC_MSG_WARN([ $PACKAGE requires the xforms library, but I can't find it in Geomview's top-level config.cache. Please install an xforms distribution appropriate to your machine in the 'xforms' directory under the top-level Geomview directory, delete any existing 'config.cache' file in that directory, and re-run 'configure' in that directory. You should only run Geomview's top-level 'configure' script, not this one directly. See the file INSTALL in $PACKAGE's source directory for details. ]) else XFORMSINCLUDE=$ac_xforms_include XFORMSLIBS=$ac_xforms_libs AC_MSG_RESULT([headers '$ac_xforms_include', libraries '$ac_xforms_libs']) fi ]) dnl dnl GEOM_REQUIRE_GEOMVIEW_VERSION(TOPDIR,MAJOR_OP,MAJOR,MINOR_OP,MINOR_COND) dnl $1 $2 $3, $4, $5 dnl AC_DEFUN([GEOM_REQUIRE_GEOMVIEW_VERSION],[ if test -f "$1/configure.in"; then GVCFGFILE="$1/configure.in" else test -f "$1/configure.ac" GVCFGFILE="$1/configure.ac" fi if test "z${GVCFGFILE}" = "z"; then AC_MSG_ERROR([Geomview configure file not found ("$1/configure.in/ac")]) fi changequote(<<, >>)dnl if test "z${GVCFGFILE}" = "zconfigure.in"; then gv_version=`sed -e 's/#.*$//' ${GVCFGFILE} | grep AM_INIT_AUTOMAKE | sed -e 's/^.*geomview,//' | sed -e 's/)//'` else gv_version=`grep <> ${GVCFGFILE}|cut -d ',' -f 2| sed -e 's/[][]//g'` changequote([,])dnl AC_MSG_NOTICE(version: $gv_version) changequote(<<, >>)dnl fi gv_major=`echo $gv_version | sed -e 's/\..*//'` gv_rest=`echo $gv_version | sed -e 's/^[^\.]\.//'` gv_minor=`echo $gv_rest | sed -e 's/\..*//'` gv_rev=`echo $gv_rest | sed -e 's/^[^\.]\.//'` changequote([,])dnl gv_major_ok=`expr $gv_major '$2' $3` gv_minor_ok=`expr $gv_minor '$4' $5` if test "$gv_major_ok" != "1" -o "$gv_minor_ok" != "1" ; then AC_MSG_ERROR([ $PACKAGE requires Geomview version N.M, where N$2$3 and M$4$5. Your version of Geomview seems to be $gv_major.$gv_minor.$gv_rev. ]) fi ]) geomview-1.9.5/m4/iso-c99.m40000644000175000017500000000224212310110176012237 00000000000000# # We need (at least) two features from the C99 standard: variadic # macros and variable length arrays. We check here whether or those # are available. # # Note that we do not further modify the compiler flags, we just check # whether variadic macros and variable length arrays are available. # # The macro takes 2 arguments: # # $1: optional: a set of compiler flags in addition to CFLAGS # AC_DEFUN([GEOMVIEW_ISO_C99_CHECK], [AC_REQUIRE([AC_PROG_CC]) _alberta_save_cflags="${CFLAGS}" m4_if($#,1,[CFLAGS="$1"]) AC_LANG_PUSH([C]) AC_MSG_CHECKING([for ISO C99 features with "${CC} ${CFLAGS}"]) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[extern void exit(int status); #define FOO(a, ...) (a, __VA_ARGS__) extern int foo(int a, int b, int c);]], [[int bar[foo FOO(3, 4, 5)]; exit(bar[0]);]])], [HAVE_ISO_C99=1 AC_MSG_RESULT([variadic macros and variable length arrays are available])], [HAVE_ISO_C99=0 AC_MSG_RESULT([variadic macros and/or vairable length arrays are NOT available])]) AC_LANG_POP([C]) CFLAGS="${_alberta_save_cflags}" AC_DEFINE_UNQUOTED([HAVE_ISO_C99],[${HAVE_ISO_C99}], [Define to 1 if ISO C99 features are available (e.g. variadic macros and variable length arrays)]) ]) geomview-1.9.5/m4/lf_local.m40000644000175000017500000001122312310110176012615 00000000000000dnl Copyright (C) 1988 Eleftherios Gkioulekas dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. # ------------------------------------------------------------------------ # The following macro is useful for deep packages. It allows you to # link all the header files *.h under a certain set of directories # to be linked under an include directory from the toplevel. # To use this feature in your configure.in call: # LF_LINK_HEADERS(dir1 dir2 dir3 .... , [directory] ) # where directory -> put links under include/directory # dir1 ... -> the directories with header files we want to link # WARNING: This macro will do --> rm -rf include # ------------------------------------------------------------------------ AC_DEFUN([LF_LINK_HEADERS],[ # Find out how to link files if we haven't already if test -z "$LN_S" then AC_PROG_LN_S fi # Remove the include directory if we haven't done that yet if test -z "$lf_link_headers" then lf_link_headers="we are all Kosh" rm -rf "$srcdir/include" fi # Get the directory from the second argument which is optional ifelse([$2], , [lf_directory="include"] , [lf_directory="include/$2"]) # ${srcdir}/mkinstalldirs "$lf_directory" mkdir $lf_directory if test -d "`pwd`/$srcdir"; then lf_srcdir="`pwd`/$srcdir" else lf_srcdir="$srcdir" fi # Link them lf_subdirs="`echo $1`" for lf_dir in $lf_subdirs do echo "linking headers from $srcdir/$lf_dir" # Check if the Headers file exists if test -f "$srcdir/$lf_dir/Headers" then for lf_file in `(cd $srcdir/$lf_dir; cat Headers)` do rm -f $lf_directory/$lf_file if test -f "$lf_srcdir/$lf_dir/$lf_file"; then $LN_S "$lf_srcdir/$lf_dir/$lf_file" "$lf_directory/$lf_file" else # assume it will be located in the build-directory $LN_S "`pwd`/$lf_dir/$lf_file" "$lf_directory/$lf_file" fi if echo ${lf_file}|fgrep 'P.h' > /dev/null 2>&1; then GEOMVIEWPRIVHDRFILES="${GEOMVIEWPRIVHDRFILES} include/${lf_file}" else GEOMVIEWHDRFILES="${GEOMVIEWHDRFILES} include/${lf_file}" fi done else echo "Warning: No Headers file for $srcdir/$lf_dir" fi done AC_SUBST(GEOMVIEWHDRFILES) AC_SUBST(GEOMVIEWPRIVHDRFILES) ]) # -------------------------------------------------------------------------- # The following macro is useful for deep packages. # To use it in your configure.in call # LF_SET_INCLUDES(dir1 dir2 dir3 ...) # and in your Makefile.am set # @default-includes@ # Then this symbol will be substituted with # INCLUDES = -I$(prefix) -I$(top_builddir)/include/dir1 ... # The prefix entry will be skipped if the prefix is equal to /usr/local # or /usr # -------------------------------------------------------------------------- AC_DEFUN([LF_SET_INCLUDES],[ # See whether to put an entry for the prefix if test "$prefix" = "/usr" || test "$prefix" = "/usr/local" then default_includes="" else default_includes="-I\$(prefix) " fi # Get the directory list lf_dirs="`echo $1`" # Check whether we have a lib directory. If so put it in AC_MSG_CHECKING([whether sources have a lib directory]) if test -d "`pwd`/$srcdir/lib" then AC_MSG_RESULT([yes]) default_includes="$default_includes -I\$(top_srcdir)/lib" else AC_MSG_RESULT([no]) fi # Now add in the directories. If the list is empty then just add include/ # If the list is not empty then add the subdirectories. if test -z "$lf_dirs" then default_includes="$default_includes -I\$(top_builddir)/include" else for lf_dir in $lf_dirs do default_includes="$default_includes -I\$(top_builddir)/include/$lf_dir" done fi # And that's it AC_SUBST(default_includes) ]) geomview-1.9.5/m4/libtool.m40000644000175000017500000106002312310165543012521 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi # Handle Gentoo/FreeBSD as it was Linux case $host_vendor in gentoo) version_type=linux ;; *) version_type=freebsd-$objformat ;; esac case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; linux) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' need_lib_prefix=no need_version=no ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS geomview-1.9.5/m4/ltoptions.m40000644000175000017500000003007312310165544013112 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) geomview-1.9.5/m4/ltsugar.m40000644000175000017500000001042412310165544012536 00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) geomview-1.9.5/m4/ltversion.m40000644000175000017500000000126212310165544013102 00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) geomview-1.9.5/m4/lt~obsolete.m40000644000175000017500000001375612310165544013442 00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) geomview-1.9.5/m4/set-prefix.m40000644000175000017500000000113112310110176013125 00000000000000dnl set prefix to its proper value, so that one can define substitutions dnl depending on the value of prefix AC_DEFUN([GEOMVIEW_SET_PREFIX], [AC_ARG_VAR([DEFAULT_PREFIX],[Default installation prefix]) test "x${DEFAULT_PREFIX}" = "x" && DEFAULT_PREFIX="${ac_default_prefix}" test "x$prefix" = xNONE && prefix="${DEFAULT_PREFIX}" PREFIX="${prefix}" # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' expanded_prefix=`eval eval eval echo ${prefix}` AC_SUBST(expanded_prefix) expanded_exec_prefix=`eval eval eval echo ${exec_prefix}` AC_SUBST(expanded_exec_prefix) ]) geomview-1.9.5/m4/withtool.m40000644000175000017500000001000612310110176012711 00000000000000dnl Copyright (C) 2007 Claus-Justus Heine dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. # Find a program, with user override. # # $1: symbolic name, fancy. Converted to uppercase for the defintion # of variables # $2: default program to check for. Should be _without_ path, # just the name # $3: optional search path # $4: keyword: optional/required, bail out if required and prog is not found # # Example: # # GV_PATH_PROG(tk-interpreter, wish, [$PATH:blah]) AC_DEFUN([GV_PATH_PROG], [m4_define([UPNAME], [m4_bpatsubst(m4_toupper([$1]),-,_)]) m4_if($#,1, [m4_define([PROG],[$1])],[m4_define([PROG],[$2])]) AC_ARG_WITH($1, AC_HELP_STRING([--with-$1=PROGRAM], [Set PROGRAM to the name of the `$1' program (usually `PROG'). (default: autodetected)]), [case "${withval}" in no) AC_MSG_ERROR(["--without-$1" or "--with-$1=no" is not an option here]) ;; yes) # simply ignore that, use auto-detection ;; *) UPNAME[OPT]="${withval}" ;; esac], [UPNAME[OPT]=PROG]) acgv_path=`dirname "${UPNAME[OPT]}"|sed -e 's|^\./\?||g'` test "${acgv_path}" = "." && acgv_path="" if test -n "${acgv_path}"; then UPNAME[PROG]=`basename "${UPNAME[OPT]}"` if echo "${acgv_path}" | egrep '^/' > /dev/null 2>&1 ; then acgv_path="${acgv_path}" else acgv_path="`pwd`/${acgv_path}" fi else UPNAME[PROG]="${UPNAME[OPT]}" m4_if($#,3,[acgv_path="$3:${PATH}"],[acgv_path="${PATH}"]) fi AC_PATH_PROGS(UPNAME, ${UPNAME[PROG]}, [not found], [${acgv_path}]) acgv_required=optional m4_if($#,4,[acgv_required="$4"]) if test "${UPNAME}" = "not found" -a "${acgv_required}" = "required"; then AC_MSG_ERROR([`$1' executable not found. Check your installation.]) exit 1 fi AM_CONDITIONAL(UPNAME,[! test "${UPNAME}" = "not found"]) ]) AC_DEFUN([GV_CHECK_PROG], [m4_define([UPNAME], [m4_bpatsubst(m4_toupper([$1]),-,_)]) m4_if($2,[], [m4_define([PROG],[$1])],[m4_define([PROG],[$2])]) AC_ARG_WITH($1, AC_HELP_STRING([--with-$1=PROGRAM], [Set PROGRAM to the name of the `$1' program (usually `PROG'). (default: autodetected)]), [case "${withval}" in no) AC_MSG_ERROR(["--without-$1" or "--with-$1=no" is not an option here]) ;; yes) # simply ignore that, use auto-detection ;; *) UPNAME[OPT]="${withval}" ;; esac], [UPNAME[OPT]=PROG]) acgv_path=`dirname "${UPNAME[OPT]}"|sed -e 's|^\./\?||g'` if test -n "${acgv_path}"; then UPNAME[PROG]=`basename "${UPNAME[OPT]}"` if echo "${acgv_path}" | egrep '^/' > /dev/null 2>&1 ; then acgv_path="${acgv_path}" else acgv_path="`pwd`/${acgv_path}" fi AC_PATH_PROGS(UPNAME, ${UPNAME[PROG]}, [not found], [${acgv_path}]) else UPNAME[PROG]="${UPNAME[OPT]}" m4_if($3,[],[acgv_path="${PATH}"],[acgv_path="$3:${PATH}"]) AC_CHECK_PROGS(UPNAME, ${UPNAME[PROG]}, [not found], [${acgv_path}]) fi acgv_required=optional m4_if($#,4,[acgv_required="$4"]) if test "${UPNAME}" = "not found" -a "${acgv_required}" = "required"; then AC_MSG_ERROR([`$1' executable not found. Check your installation.]) exit 1 fi AM_CONDITIONAL(UPNAME,[! test "${UPNAME}" = "not found"]) ]) geomview-1.9.5/INSTALL0000644000175000017500000003661012310165551011327 00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, Inc. 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 warranty of any kind. Basic Installation ================== Briefly, the shell command `./configure && make && make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. geomview-1.9.5/NEWS0000644000175000017500000002203312310110201010745 000000000000001.9.5 March 2014 * vastly extended lisp-interpreter, including lambda-expression, defun, let, while, setq, eval * `(process-events)' lisp function to branch out of a command-script and temporarily give the control back to the main command-loop * Proper handling of quoted input tokens: those cannot serve as function or variable names * other bug-fixes (notably: multi-object geometry-only files work again) * memory allocation fixes * compilation and build fixes 1.9.4 August 2007 * Translation of the manual to Brazilian Portuguese, courtesy of Jorge Barros de Abreu . * Image-stream filter bug fixes. * Fixed (transform ...), (transform-incr ...) interests (broken by previous change since 1.9.0) * Improved computation of averaged per-vertex polygon normals (taking the relative orientation of the facets in to account). * Loading of textured meshes was broken by a previous change since 1.9.0, fix that. * GEOMROOT environment variable has been resurrected, needed by some external modules (e.g. StageTools). 1.9.3 June 2007 * Drawing of spheres was severely broken. 1.9.2 June 2007 * Bug-fix release for 1.9.0 (see ChangeLog) * ND-picking was not fully implemented; should work now * PICKFUNC() interface has changed 1.9.1 May 2007 * Bug-fix release for 1.9.0 * versions strings were wrong in some places * textures would not be reloaded after deleting all cameras (OpenGL MG-backend) 1.9.0 April 2007 * the OpenGL `MG' back-end is now able to display translucent object _correctly_. More specifically: translucency will be displayed correctly for each separate top-level object (those which appear in the object browser). Different translucent top-level objects will not be rendered correctly w.r.t. to each other. Translucency also works for non-flat or concave polygons if the Geomview is configured for OpenGL and if libGLU is found; in that case the GLU tesselator is used to compute a triangulation of concave or even self-intersecting polygons. * new GCL object: Image. Image data for textures or background can now be embedded into the ordinary GCL data stream. Images can be given symbolic names via (read image { define ... }) and (hdefine...). * Appearances can now be given symbolic names via `define' and `hdefine' * RenderMan output now supports texturing. I had to write some more shaders to support this. The new shaders do not seem to work with the old BMRT (Blue Moon Render Tools) package, because BMRT does not seem to understand the `textureinfo' command. More recent renderers like Aqsis, 3Delight and Pixie seem to work. Also, writing bianry RIB files was broken on Big-Endian machines in all previous releases of Geomview. * Textures can be applied in "replace" mode: the texture colour simply replaces the surface color. * support for translucent textures * The Sphere OOGL objects now have support for texture-xmapping; the details are documented in the Geomview manual. * new GCL command `hdelete' (lazy deletion of global handles) * new GCL commands (dump-handles) and (write-handle FILENAME) to aid debugging * All emodules which need the XForms library have been moved to the separate package `gvemodules-xforms', the `ndutils', `NDview', `Crayola' and `Labeler' emodules have been moved to separate packages. * External extension modules ("emodules") no longer neeed to be compiled inside the Geomview source-tree; they can now be built separately, using an installed version of the OOGL library and the header files. Compiling external add-ons inside the source tree is no longer supported. I have ported `Maniview' and the `Orrery' to this new scheme. * another bunch of internal fixes, most notably fixing of reference counts * The manual now has cross-references for individual GCL commands. cH 1.8.2 November 2006 (never released) * I/O with release <= 1.8.1 was just broken, they used internals of opaque data-types (e.g. the FILE handle of the stdio library) * Maple V8 interface * VRML2 interface * build-system fixes (ported to recent automake/autoconf combo) * standard GNU installation paths: PREFIX/bin, PREFIX/share/geomview, PREFIX/libexec/geomview etc. * variable argument fixes, was also broken in <= 1.8.1 releases. * Documentation can be regenerated with recent texinfo releases. * OpenGL is now optional * one big shared libgeomview library * fmemopen() by using temporary files (not using stdio internals) * I have resurrected a couple of old modules: NDview, clipboard, cplxview, crayola, flythrough, gvclock, hinge, labeler, ndutils. * New "BBox Center" toggle in the tools menu (use the center of the current object's bouding box for the CENTER object) * optionally use the window-manager's idea of the focus for the camera windows instead of forcing a mouse-cross policy -- new GCL function (ui-cam-focus [focus-change|mouse-cross]) * Fixed a couple (Ups!) of long-standing memory leaks. * The Nd code in Geomview was one big ugly memory leak. Fixed that. * ND transformations and vectors now have their homogeneous component at index 0. * It is now possible to define handles for "ntransform" objects, i.e. "(read ntransfrom { define fred ... })" works now. * Each camera of a cluster now has it's (additional) private 3d transform, the focal-length hack has gone. * The look commands work now in the context of ND-viewing. * Basic INST support for ND transformations. * Picking works now with ND-viewing. cH 1.8.1 March, 2001 This is a bugfix release. * No segfaults at startup on linux. * Toggle buttons are visible again. * Binary I/O on linux works. 1.8.0 November 17, 2000 The software in this release is almost the same as in the 1.7.* series. The main difference is that it has an improved configure script and Makefiles that allow for several new things. (a) VPATH builds now supported (b) Additional external modules can simply be dropped into place in the "src/bin" directory, and Geomview's configure script will notice their presence and configure/build them when you configure/build Geomview. (This only works with module distributions that have been specifically packed up for this purpose; see http://www.geomview.org/download for more details.) (c) The binary Intel/Linux XFORMS distribution is no longer a part of the Geomview source distribution. Users who want it can download it separately, unpack it into the Geomview source tree, and Geomview's configure script will notice it's there and use it. (This works with the binary XFORMS distribution for any system, not just Intel/Linux.) (d) 'togeomview' program now included in the release (this program, used to facilitate communication between Geomview and other programs, got temporarily dropped in release 1.7.0, but now is back). (e) a few minor bug fixes; see ChangeLog for details 1.7.10 Nov 1, 2000 Attempted to fix bug which caused Geomview to crash immediately upon startup on some newer GNU/Linux systems. The bug has to do with Geomview's use of the 'fmemopen' system function. This release attempts to autodetect which version of this function to use. If it still crashes for you, pass the flag "--enable-fstropen-1" to "configure" and try again. If you still have problems, let me [mbp@geomtech.com] know. Misc fixes to allow compilation on wider variety of platforms 1.7.9 Oct 20, 2000 Minor change to allow compilation with Mesa-3.3 (related to how Mesa-3.3 declares prototypes for GL extention functions). No change in functionality, but this version compiles without errors with Mesa-3.3, which previous versions didn't. 1.7.8 Oct 14, 2000 Fixed bug which prevented compressed textures from working on some Linux systems Fixed several compilation/configuration problems. Now tested on: Linux: RedHat 6.1, 7.0 Mandrake 7.0 Caldera-2.3 Mandrake-7.0 Slackware-7.0 Solaris-2.6 (SunOS 5.6) AIX 4.3.2 IRIX 6.3 1.7.7 August 22, 2000 Added some of the external modules to the distribution, but haven't actually tested them. Updated the documentation to reflect the fact that the geomview-users mailing list is now hosted at lists.sourceforge.net. 1.7.6 May 25, 2000 This is the first release of Geomview to use GNU autoconf. The autoconf script has been tested on Linux (RedHat 6.1), IRIX 6.3, and AIX 4.3.2. It's untested on other platforms and may need tweaking to work on them. Also, note that this release does not include the external modules. If you want any of them, use an older release, or wait for a future one. geomview-1.9.5/README0000644000175000017500000002554212310110201011136 00000000000000 Geomview/OOGL Release 1.9.5 February 2009 ------------- CONTENTS -------- Introduction Note to Users of Previous Geomview Versions Installation More about Geomview External Modules Auxiliary Programs Documentation Geomview Support History Miscellaneous Known Bugs Improvements/Wish list Bug Reports and Comments INTRODUCTION ------------ This is version 1.9.5 of Geomview/OOGL. See the file NEWS for a summary of changes in this release, and the file ChangeLog for specific details. Geomview is an interactive geometry viewing program. OOGL, which stands for Object Oriented Graphics Library, is the library upon which Geomview is built. Geomview runs on many unix-like platforms including but not limited to GNU/Linux, Solaris, IRIX, and AIX. It requires X windows, OpenGL, and Motif (or OpenMotif). It also works with Mesa, which is a free-software replacement to OpenGL. See www.geomview.org for more information. In addition, if you use geomview please consider joining the geomview-users mailing list; send an empty note with 'subscribe' in the subject line to geomview-users-request@lists.sourceforge.net, or visit the list web page at http://lists.sourceforge.net/mailman/listinfo/geomview-users. NOTE TO USERS OF PREVIOUS GEOMVIEW VERSIONS ------------------------------------------- If you're a user of a really old (version 1.6 or earlier) version of Geomview and you're looking for some of the external modules that were included in the older versions but that are not present in this release, you can still download the old versions of Geomview from http://www.geom.uiuc.edu/software/download/geomview.html. INSTALLATION ------------ See the files INSTALL.Geomview and INSTALL for instructions on compiling and installing Geomview. MORE ABOUT GEOMVIEW ------------------- Geomview is the product of an effort at the Geometry Center at the University of Minnesota to provide interactive geometry software which is particularly appropriate for mathematics research and education. In particular, geomview can display things in hyperbolic and spherical space as well as Euclidean space. Geomview allows multiple independently controllable objects and cameras. It provides interactive control for motion, appearances (including lighting, shading, and materials), picking on an object, edge or vertex level, snapshots in SGI image file or Renderman RIB format, and adding or deleting objects is provided through direct mouse manipulation, control panels, and keyboard shortcuts. External programs can drive desired aspects of the viewer (such as continually loading changing geometry or controlling the motion of certain objects) while allowing interactive control of everything else. Geomview supports the following simple data types: polyhedra with shared vertices (.off), quadrilaterals, rectangular meshes, vectors, and Bezier surface patches of arbitrary degree including rational patches. Object hierarchies can be constructed with lists of objects and instances of object(s) transformed by one or many 4x4 matrices. Arbitrary portions of changing hierarchies may be transmitted by creating named references. Geomview can display Mathematica and Maple 3-D graphics output; for information on this see the files OOGL.m.txt and gvplot.txt, respectively, in the "doc" subdirectory. EXTERNAL MODULES ---------------- Geomview comes with several "external modules" (emodules) -- programs that communicate with geomview through a command language. The list of currently installed modules appears in the "Modules" browser on geomview's main panel. To invoke a module, click the mouse on the appropriate line in this browser. The modules in this distribution are: MODULE DESCRIPTION ~~~~~~ ~~~~~~~~~~~ Animate: flip through a sequence of objects Clipboard: save a single OOGL object to a clipboard Gvclock: an animated clock Nose: debugging/example for picking (see Geomview manual) Modules involving extra libraries like XForms or Tcl/Tk have been moved to separate packages to make the maintenance of the Geomview main-package easier. The packages can be downloaded from the Geomview download area at Sourceforge.net. The names of the emodule packages, and the emodules they contain, are as follows: Package gvemod-xforms-example -- example XForms-based emodule ************************************************************* MODULE DESCRIPTION ~~~~~~ ~~~~~~~~~~~ Example: generic FORMS example external module Package gvemodules-xforms -- emodules which require the XForms package ********************************************************************** MODULE DESCRIPTION ~~~~~~ ~~~~~~~~~~~ Cplxview: visualize the graphs of complex functions Example: generic FORMS example external module Flythrough: "Not Knot" visualisation (hyperbolic space) Ginsu: interactively slice objects (see "clip") Graffiti: draw line segments on objects Hinge: "copy-rotate" a polyhedron around edges of itself Stereo: stereo vision module Sweep: generate objects of rotation from line segments Tackdown: redefine an object's "home" position Transformer: explicitly control an object's transformation matrix Package maniview -- requires XForms *********************************** MODULE DESCRIPTION ~~~~~~ ~~~~~~~~~~~ Maniview visualize 3d manifolds and orbifolds Pacakge gvemod-crayola -- requires Tcl/Tk ***************************************** MODULE DESCRIPTION ~~~~~~ ~~~~~~~~~~~ Crayola: interactive colouring of OOGL objects Package gvemod-labeler -- requires Tcl/Tk ***************************************** MODULE DESCRIPTION ~~~~~~ ~~~~~~~~~~~ Labeler: somewhat crude generation of text as OOGL object gvemod-ndview -- requires Tcl/Tk **************************************************** MODULE DESCRIPTION ~~~~~~ ~~~~~~~~~~~ 3D-Snapshot: Save a 3D projection of an ND object Colormap: Coloring of ND objects w.r.t. the "invisible" directions NDview: visualization of objects in > 3D NDdemo: a demo for ND visualization Origin: draw a coordinate frame for an OOGL object Slicer: Slice ND objects (see also Ginsu above) AUXILIARY PROGRAMS ------------------ PROGRAM DESCRIPTION anytooff: convert any OOGL object into OFF format anytoucd: convert any OOGL object into UCD format bdy: compute the boundary edges of a geom as a VECT file bez2mesh: convert Bezier object to MESH clip: clip OOGL objects against planes or other surfaces hvectext: produce VECT text from Ghostscript Hershey fonts math2oogl: convert Mathematica graphics object to OOGL format offconsol: consolidate duplicate vertices in an OFF file oogl2rib: convert OOGL to RenderMan RIB (see doc/OOGL.m.txt) oogl2vrml: convert OOGL to VRML version 1 oogl2vrml2: convert OOGL to VRML version 2 polymerge: merge vertices, edges, and faces in an OFF file togeomview: pipe GCL commands or geometry to a copy of geomview, invoking geomview if necessary ucdtooff: convert UCD format file into an OFF OOGL file COMPUTER ALGEBRA INTERFACES --------------------------- gvplot.mapleVx: plot interface to Maple (tm). `x' is in {3, 4, 8}. The source code and Maple V8 work-sheets which can be used to generate a Maple library are installed below PREFIX/share/geomview/Maple/. After installation the documentation can be found in PREFIX/share/doc/geomview-VERISION/README.gvplot math2oogl: convert Mathematica graphics object to OOGL format DOCUMENTATION ------------- A comprehensive manual is in the "doc" subdirectory. You can also read or download the manual from the Geomview web site, www.geomview.org. "make install" installs the documentation under PREFIX/share/doc/geomview-VERSION/ The manual comes in Info, PDF and HTML format. The file doc/oogltour gives an introduction to the OOGL file format, which is the format of geometry files that geomview reads. More details are in the manual. Further documentation can be found in several manual pages; the manual pages are installed in their proper locations by "make install". Some of the external modules, as well as geomview itself, has a manual page. Of particular interest are: geomview(1) geomview man page geomview(5) geomview command language reference oogl(5) OOGL file format reference Other documentation is also moved to PREFIX/share/doc/geomview-VERSION/ by "make install", e.g. OOGL.m.txt documentation for interface to Mathematica README.gvplot documentation for interface to Maple GEOMVIEW MAILING LIST --------------------- geomview-users@lists@sourceforge.net This is a mailing list of people using geomview and can be used for communication between users regarding geomview problems, questions, experiences, etc. The geomview authors are also a part of this list and sometimes respond to questions posted to it. We also use this list to make announcements about new releases and other things of interest to users. To join the list, go the list web page at http://lists.sourceforge.net/mailman/listinfo/geomview-users. GEOMVIEW WEB SITE ----------------- The geomview web site is http://www.geomview.org. HISTORY ------- This project began in the summer of 1988 at the University of Minnesota's Geometry Center with the work of Pat Hanrahan on a viewing program called MinneView. Shortly thereafter Charlie Gunn begin developing OOGL in conjunction with MinneView. In 1991 a team of programmers headed by Mark Phillips, Stuart Levy, and Tamara Munzner set about developing a revised version of OOGL and a new viewer which they named Geomview. In the time since then, many people have contributed, including (in alphabetical order): Jorge Barros de Abreu, Steve Anderson, Rex Dieter, Celeste Fowler, Claus-Justus Heine, Todd Kaplan, Daniel Krech, Mario Lopez, Mark Meuer, Daeron Meyer, Steve Robbins, Timothy Rowley, Raphael Straub, Nathaniel Thurston, Scott Wisdom, Lloyd Wood and others. MISCELLANEOUS ------------- For a list of changes between versions, see the file ChangeLog. Geomview is distributed under the terms of the GNU Lesser Public License (LGPL); see the file COPYING for details. The file MANIFEST contains a list of the files in this distribution. KNOWN BUGS ---------- Picking can fail if any part of any object is behind the camera plane. (SNX) BUG REPORTS AND COMMENTS ------------------------ Please send bug reports and comments about Geomview to geomview-users@sourceforge.net. ======================================================================== This release packed up by: Claus-Justus Heine geomview-1.9.5/AUTHORS0000644000175000017500000000030712310110201011316 00000000000000Many people have contributed to Geomview. See the file README for a list of the authors. This release (1.9.5) was put together by: Claus-Justus Heine geomview-1.9.5/ChangeLog0000644000175000017500000114710212310154643012050 000000000000002014-03-12 * Finally, release version 1.9.5 to bring this to an end. v1.9.5 brings real nice new features (but those were implemented ages ago, around 2007/2008. Somehow lost track. 2014-03-12 Claus-Justus Heine * doc/.cvsignore: Again, ignore version.texi. * configure.ac: Fix bug introduced by previous commit (trying to get rid of pesky OSX "finite is deprecated" and why should I care for this messages. * NEWS: Update my email address. * doc/version-pt_BR.texi, doc/version.texi: These _are_ auto-generated. * GeomviewInstall.OSX: Blah about OSX. May or may not be helpful for others. * src/bin/NDview/Makefile.am, src/bin/NDview/NDdemo, src/bin/NDview/NDdemo.tcl, src/bin/NDview/NDview, src/bin/NDview/NDview.tcl, src/bin/NDview/ndview.c, src/bin/cplxview/Makefile.am, src/bin/crayola/Crayola, src/bin/crayola/tkcrayola.c, src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/labeler/Labeler, src/bin/ndutils/GeExDir.c, src/bin/ndutils/slicer.c, src/bin/ndutils/snapshot.c, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am: Maintenance commit, make it compile. * doc/Makefile.am: Include the FAQ in the dist. * .cvsignore, AUTHORS, NEWS, README, configure.ac, doc/geomview-pt_BR.texi, doc/geomview.texi, doc/version-pt_BR.texi, doc/version.texi, rcs2log, src/bin/animate/glob.c, src/bin/animate/xanimate.c, src/bin/geomutil/vrml2oogl/lib/QvToWebOOGL.c++, src/bin/geomview/common/help.c, src/bin/geomview/x11/gvui.c, src/bin/togeomview/togeomview.c, src/lib/fexpr/complex.c, src/lib/fexpr/fexpr.h, src/lib/gprim/comment/commentsave.c, src/lib/gprim/mesh/meshsave.c, src/lib/gprim/ndmesh/ndmeshsave.c, src/lib/shade/image.c: Just a maintenance commit, make the stuff compile etc. 2013-07-28 Jorge Barros de Abreu * doc/FAQ/FAQ-pt_BR.html, doc/FAQ/FAQ-pt_BR.tex, doc/FAQ/FAQ.html, doc/FAQ/README: Adding FAQ.html, FAQ-pt_BR.html and FAQ-pt_BR.tex to FAQ directory * doc/FAQ/FAQ.tex, doc/FAQ/README: Adding README and FAQ.tex to FAQ directory * doc/geomview-pt_BR.texi: pt_BR translation - change manipular to controlar and other minor changes 2013-01-19 Jorge Barros de Abreu * doc/geomview.texi: safer to saver * doc/geomview.texi: miscellaneous small adjusts 2013-01-17 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Change Figure to Figura and others changes 2011-12-13 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Adjust in pt_BR for update to 1.77 version of geomview.texi * doc/geomview.texi: An empty line adjust * doc/geomview.texi: Moving the "normalization" for new position in "Appearance Panel" * doc/geomview-pt_BR.texi: partial pt_BR translation 2011-11-27 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: partial pt_BR translation 2011-10-13 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: partial pt_BR translation 2011-10-13 Steve M. Robbins * src/lib/mg/rib/mgrib.c: Revert previous change. * src/lib/mg/rib/mgrib.c: Ensure format strings are literals. See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=643382. * src/lib/oogl/util/glob.c: Fix segfault on startup. 2011-09-29 Jorge Barros de Abreu * doc/geomview.texi: changing ")w" to ")" * doc/geomview.texi: adjusting modulename to module NAME 2011-09-18 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: small adusts * doc/pt_BR/texinfo.tex: see and See to portuguese veja and Veja 2011-08-28 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Command reference (partial) translation * doc/geomview.texi: small adjust "Not that" to "Note that" 2011-08-21 Jorge Barros de Abreu * doc/pt_BR/geomview_cvs.sh: add the "pt" code language into script 2011-08-20 Jorge Barros de Abreu * doc/pt_BR/acentos_texinfo_utf8.sh: script that convert from utf8 to texi diacritical marks. * doc/version-pt_BR.texi: translation of February to Fevereiro * doc/pt_BR/geomview_cvs.sh: adjusting for convert /figs/*.ps to pdf. * doc/oogltour, doc/oogltour-pt_BR: oogltour-pt_BR conversion to utf8 charset oogltour -> Inspect to Inspect/Appearence and Normalization to Normalize. * doc/geomview-pt_BR.texi: General update from english cvs ancient version 1.65 to current version 1.72. 2010-09-07 Jorge Barros de Abreu * doc/geomview.texi: Adjusting "differene" to "difference" 2010-08-15 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Manual Portuguese Translation. more work in geomview-pt_BR * doc/pt_BR/acentos_texinfo.sh: Manual Portuguese Translation. Commit of acentos_texinfo.sh 2010-08-07 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Manual Portuguese Translation. Partial update for exemple 3. 2010-07-31 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Manual Portuguese Translation. Many small adjusts. Updating exemple 2. 2010-07-25 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Manual Portuguese Translation. Many small adjusts. * doc/geomview.texi: Replacing "Lighting" by "Lights" due to the painel caption is "Lights" * doc/pt_BR/geomview_cvs.sh: Manual Portuguese Translation. Updating locally compilation script. * doc/geomview-pt_BR.texi: Manual Portuguese Translation. Updating from English cvs version to 1.70. * doc/pt_BR/geomview-pt_BR.texi: Manual Portuguese Translation. Removing geomview-pt_BR that was putted in a worng directory. * doc/pt_BR/geomview-pt_BR.texi: Manual Portuguese Translation. Updating from English cvs version to 1.70. 2010-03-14 Claus-Justus Heine * configure.ac, m4/geomview.m4: Remove RANLIB. * m4/.cvsignore: Ignore the new libtool files. * src/bin/geomview/x11/gvui.c: FORTIFY_SOURC stuff. * src/bin/geomview/x11/gvcamui.c: Unused variable. * src/bin/geomview/common/help.c: FORTIFY_SOURCE stuff. * src/bin/geomview/common/event.c: Fix a strict-aliasing issue. * src/bin/geomview/common/comm.c, src/bin/togeomview/togeomview.c: FORTIFY_SOURCE stuff. * src/lib/geometry/cmodel/cm_geometry.c, src/lib/geometry/geomtypes.h, src/lib/geometry/hpointn/hpointn.h: Handle some strict aliasing stuff. * m4/geomview.m4, configure.ac: Add AC_CONFIG_MACRODIR() * src/lib/geometry/hpoint3/hpoint3.h, src/lib/geometry/hpointn/hpointn.h, src/lib/oogl/refcomm/streampool.c, src/lib/gprim/mesh/meshP.h, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshP.h, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/npolylist/npolylistP.h, src/lib/gprim/polylist/polylistP.h, src/lib/gprim/quad/quadP.h, src/lib/gprim/quad/quaddraw.c: Deal with strict aliasing issues. * src/bin/geomutil/vrml2oogl/lib/QvToWebOOGL.c++: Fix a format string. * src/bin/geomutil/math2oogl/math2oogl.c, src/bin/geomutil/ucd/ucdtooff.c, src/bin/animate/xanimate.c: Deal with FORTIFY_SOURCE warnings. * src/bin/geomutil/vrml2oogl/lib/QvToWebOOGL.c++: Fix a format issue. * src/lib/gprim/ndmesh/ndmeshsave.c, src/lib/gprim/mesh/meshsave.c: Get rid of some "warn unused result" warnings. * src/lib/gprim/sphere/spheremisc.c, src/lib/mg/common/mg.c: Address an aliasing issue between HPoint3 and Point3. * src/lib/mg/rib/mgrib.c: Replace bogus calls to sprintf() by strcpy(). 2010-03-13 Claus-Justus Heine * src/lib/gprim/comment/commentsave.c: New function ign_fwrite(), an error-ignorant fwrite() trampoline in order to get rid of some annoying compiler warnings. * src/lib/gprim/discgrp/weeks_dirdom.c: Fix some broken access to excess array elements. * src/lib/gprim/geom/geomstream.c: Forcibly ignore the return value of dup(). * src/lib/shade/image.c: New function ign_fwrite(), an error-ignorant fwrite() trampoline in order to get rid of some annoying compiler warnings. * src/lib/oogl/util/ppopen.c: ppopen(): use fprintf(stderr, ...), not write(2, ...). Otherwise the error message might get garbled because later we use perror(), which goes through the stdio library. * src/lib/oogl/util/futil.c: fputnf(): allow fwrite() to fail. * src/lib/oogl/lisp/lisp.c: Lsummarize(): allow fread() to fail. 2010-01-12 Claus-Justus Heine * src/lib/gprim/list/listdraw.c: Fix a silly allocation bug of mine. 2009-09-16 Claus-Justus Heine * m4/geomview.m4: Add some more tests. 2009-06-09 Claus-Justus Heine * src/lib/oogl/refcomm/streampool.c: PoolIn() had one possibility to return with a destroyed handle. * src/bin/ndutils/wrappers.c: Tk_PhotoPutBlock() fix. 2009-02-18 Claus-Justus Heine * ChangeLog, README, doc/Makefile.am, doc/version-pt_BR.texi: Build-system fixes. 2009-02-08 Claus-Justus Heine * doc/geomview.texi, doc/version-pt_BR.texi, doc/version.texi: Fix some documentation bugs. * src/bin/geomview/common/drawer.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/transform.c: New virtual "bbox-center" object id to allow motions relative to the center of the bounding box of an object (which can be very different from the origin of the co-ordinate system). * src/bin/geomview/common/ui.c: "bbox center" toggle did not really reset the center of motion. * src/bin/geomview/common/worldio.c: New "bbox" keyword for write command: just dump the bounding box of the respective object to disc. 2009-02-08 Claus-Justus Heine * doc/geomview.texi, doc/version-pt_BR.texi, doc/version.texi: Fix some documentation bugs. * src/bin/geomview/common/drawer.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/transform.c: New virtual "bbox-center" object id to allow motions relative to the center of the bounding box of an object (which can be very different from the origin of the co-ordinate system). * src/bin/geomview/common/ui.c: "bbox center" toggle did not really reset the center of motion. * src/bin/geomview/common/worldio.c: New "bbox" keyword for write command: just dump the bounding box of the respective object to disc. 2009-02-07 Lloyd Wood * doc/geomview.texi: Manual grammar fix. * doc/geomview-pt_BR.texi, doc/geomview.texi: Manual typo fixes - bouding -> bounding. 2009-01-09 Claus-Justus Heine * src/bin/geomview/x11/gvcamui.c: Optionally scale an offscreep ppm image. 2008-10-07 Claus-Justus Heine * src/lib/gprim/geom/bsptree.c: Forgot a "break" statement in a switch-clause. Gnah. 2008-08-24 Jorge Barros de Abreu * TODO: Including a note about font code translation * doc/geomview.texi, doc/geomview-pt_BR.texi: adjusting duplicate node "camera" * doc/geomview-pt_BR.texi: The command texinfo was causing unexpected @enumerate closing change @heading by @emph * doc/geomview.texi, doc/geomview-pt_BR.texi: puting a "@c " comment before @pxref{Forms} * doc/geomview-pt_BR.texi: inclusion for translate "section", "chapter" and "page" * doc/pt_BR/texinfo.tex: changed for pt_BR * doc/pt_BR/acentos_texinfo.sh, doc/pt_BR/geomview_cvs.sh: script for manual pt_BR creation only (adjust) script for diacritical marks in pt_BR * doc/pt_BR/geomview_cvs.sh: script for manual pt_BR creation only * doc/geomview-pt_BR.texi: geomview-pt_BR.texi --> partial translation, nodes translation 2008-08-23 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi --> partial translation, nodes translation 2008-08-03 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi --> partial translation 2008-07-28 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi --> partial translation * doc/geomview.texi: geomview.texi --> Adjusting "winddow" to "window" * TODO: TODO ---> Adding a TODO list. 2008-07-26 Jorge Barros de Abreu * ChangeLog, NEWS, rcs2log: NEWS, ChangeLog ---> changing e-mail adress for Jorge. rcs2log ---> adding new entrie for new e-mail for Jorge. * doc/geomview.texi, doc/geomview-pt_BR.texi: geomview-pt_BR.texi --> partial translation geomview.texi --> adjusting man page location for oogl: changing "man/cat5/oogl.5" to "/share/man/man5/oogl.5gv" 2008-07-25 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi --> partial translation * doc/geomview.texi: geomview.texi --> adjusting $path to $PATH * doc/geomview.texi: geomview.texi --> adjusting local directory for modules instalation for all users 2008-07-24 Jorge Barros de Abreu * doc/geomview-pt_BR.texi, doc/geomview.texi: geomview-pt_BR.texi --> adjusting local directory for modules instalation for all users geomview-pt_BR.texi --> echo for the above * doc/geomview-pt_BR.texi: geomview-pt_BR.texi --> partial pt_BR manual translation 2008-07-15 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi --> partial pt_BR manual translation * doc/geomview.texi: geomview.texi --> removing "red" for external modules browser panel 2008-07-12 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi --> partial translation 2008-06-03 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi --> partial translation 2008-06-02 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi --> partial translation 2008-05-28 Claus-Justus Heine * src/lib/gprim/list/listdraw.c: Hopefully fixed this time. 2008-05-25 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi --> adusting right margin for some pages * doc/geomview-pt_BR.texi, doc/version-pt_BR.texi: geomview-pt_BR.texi --> updating to 1.59 english cvs version (1.95 manual version) version-pt_BR.texi --> adjusting 17 to 19 2008-05-23 Claus-Justus Heine * src/lib/gprim/list/listdraw.c: Something still seems to be wrong ... * src/lib/gprim/list/listdraw.c: allocsz was used uninitialized. * src/bin/geomutil/clip/clipoogl.c: Keep booth, vertex and poly colour, if both are present. 2008-05-20 Claus-Justus Heine * src/lib/gprim/polylist/plsave.c, src/lib/gprim/npolylist/nplsave.c: Save the per-polygon colors even if we have vertex colours; which color-set is selected depends then on the shading. 2008-05-19 Claus-Justus Heine * doc/figs/mat.ps, doc/version.texi: Update. * doc/geomview.texi: Document the new translucency settings. * doc/figs/mat.ps: Update (new widgets). * src/lib/oogl/refcomm/handle.c: Free-list pruning. * src/lib/mg/opengl/mgopenglmesh.c, src/lib/mg/opengl/mgopenglshade.c, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/opengl/mgopengl.c: Support sort of screen-door translucency. * src/lib/mg/opengl/Makefile.am: Add mgopenglstipple.[ch] * src/lib/gprim/sphere/spheredice.c: Ref-count bug-fix. * src/lib/gprim/sphere/spherecreate.c: Cache the tlists needed to generate the different spheres. * src/lib/gprim/tlist/tlcreate.c: Free-list pruning. * src/lib/gprim/polylist/pldraw.c, src/lib/gprim/npolylist/npldraw.c: Shut-up a compiler warning. * src/lib/gprim/mesh/meshdelete.c: Forgot to release the per-quad normals. * src/lib/gprim/list/listdraw.c: memory allocation cleanup. * src/lib/gprim/geom/nodedata.h: Free-list pruning. * src/lib/gprim/geom/geomclass.h: Account for different translucency models. * src/lib/gprim/geom/draw.c, src/lib/gprim/geom/bsptree.c: Free-list pruning. * src/lib/gprim/bezier/bezcreate.c: Use HandleDoCreate(), no need to check for existing handles here. * src/lib/gprim/bbox/bboxcreate.c: BBoxFreeListPrune(): new, release the memory allocated by the free-list. * src/lib/geometry/hpointn/hpointn.h: HPtNFReeListPrune(): new, release the memory allocated by the free-list. * src/lib/shade/apstream.c, src/lib/shade/appearance.c, src/lib/shade/appearance.h, src/bin/geomview/x11/interface/Material.mib, src/bin/geomview/x11/gvmaterial.c, src/bin/geomview/x11/gvmain.c, src/bin/geomview/common/ui.h, src/bin/geomview/common/ui.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/drawer.c: Support different translucency styles. * src/lib/mg/opengl/mgopenglstipple.c, src/lib/mg/opengl/mgopenglstipple.h: Initial revision. 2008-05-17 Claus-Justus Heine * ChangeLog, src/lib/gprim/list/listdraw.c: Reduce memory consumption and drawing time for huge LIST objects. * src/lib/oogl/refcomm/handle.c, src/lib/oogl/refcomm/handle.h, src/lib/gprim/sphere/spherecreate.c: Reduce the load-time of "bulk"-sphere files. * ChangeLog, NEWS: Update. * m4/geomview.m4: Define VARARRAY() macros to select either alloca() or C99 variadic arrays. * INSTALL.Geomview: Add Raphael's install notes for OS/X * README: Add Raphael. * AUTHORS: Dump version to 1.9.5 * src/lib/shade/material.c, src/lib/shade/light.c, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/discgrp/weeks_dirdom.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/geometry/hpoint3/hpoint3.h, src/lib/geomutil/plutil/anytopl.c, src/bin/geomview/common/pickfunc.h, src/bin/geomview/common/transform.c, src/lib/geometry/cmodel/cmodel.c, src/bin/geomview/common/lights.c, src/bin/geomview/common/drawer.c, src/bin/geomutil/plutil/polymerge.c, src/bin/geomview/common/comm.c, src/bin/animate/glob.c, src/bin/geomutil/clip/clipoogl.c, doc/version-pt_BR.texi: Fix a couple of "strict aliasing" warnings. * src/lib/oogl/lisp/lisp.c, src/lib/gprim/sphere/spheremisc.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/list/listdraw.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/bbox/bboxtransform.c, src/lib/gprim/geom/bsptree.c, src/lib/geometry/hpointn/hpointn.h, src/lib/geomutil/plutil/anytopl.c, src/lib/gprim/bbox/bboxdraw.c, src/bin/geomview/x11/gvcamui.c: Get rid of alloca in a variety of places, most notably fix an allocation bug in the list-drawing code. * src/bin/geomview/common/drawer.c: Get rid of alloca. 2008-05-17 Claus-Justus Heine * src/lib/gprim/list/listdraw.c: Reduce memory consumption and drawing time for huge LIST objects. * src/lib/oogl/refcomm/handle.c, src/lib/oogl/refcomm/handle.h, src/lib/gprim/sphere/spherecreate.c: Reduce the load-time of "bulk"-sphere files. * ChangeLog, NEWS: Update. 2008-05-17 Claus-Justus Heine * NEWS: Update. * m4/geomview.m4: Define VARARRAY() macros to select either alloca() or C99 variadic arrays. * INSTALL.Geomview: Add Raphael's install notes for OS/X * README: Add Raphael. * AUTHORS: Dump version to 1.9.5 * src/lib/shade/material.c, src/lib/shade/light.c, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/discgrp/weeks_dirdom.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/geometry/hpoint3/hpoint3.h, src/lib/geomutil/plutil/anytopl.c, src/bin/geomview/common/pickfunc.h, src/bin/geomview/common/transform.c, src/lib/geometry/cmodel/cmodel.c, src/bin/geomview/common/lights.c, src/bin/geomview/common/drawer.c, src/bin/geomutil/plutil/polymerge.c, src/bin/geomview/common/comm.c, src/bin/animate/glob.c, src/bin/geomutil/clip/clipoogl.c, doc/version-pt_BR.texi: Fix a couple of "strict aliasing" warnings. * src/lib/oogl/lisp/lisp.c, src/lib/gprim/sphere/spheremisc.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/list/listdraw.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/bbox/bboxtransform.c, src/lib/gprim/geom/bsptree.c, src/lib/geometry/hpointn/hpointn.h, src/lib/geomutil/plutil/anytopl.c, src/lib/gprim/bbox/bboxdraw.c, src/bin/geomview/x11/gvcamui.c: Get rid of alloca in a variety of places, most notably fix an allocation bug in the list-drawing code. * src/bin/geomview/common/drawer.c: Get rid of alloca. 2008-05-11 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi --> updating to 1.58 english cvs version (1.95 manual version) 2008-05-07 Claus-Justus Heine * src/lib/oogl/util/iobuffer.c: Forgot to commit the LSEEKO -> LSEEK change. 2008-05-06 Claus-Justus Heine * src/bin/geomview/common/event.c: Fix use of uninitialized variable. * src/lib/shade/image.c: Fix error handling when image data cannot be read. 2008-05-05 Claus-Justus Heine * src/bin/geomview/common/lang.c (write-handle ...): reset h->obj_saved (this is just a debugging function). 2008-05-04 Claus-Justus Heine * src/bin/geomview/common/lang.c: (write-handle ...) : accept - as stdout. * doc/version.texi, doc/geomview.texi: Sync. * src/lib/oogl/refcomm/handle.c: Fix reverse-logic bug in HandleOpsByName(). * src/lib/oogl/lisp/lisp.c: Do not force strings to LSTRING type, otherwise parameter substitution fails. * src/lib/gprim/inst/instdraw.c: translucency INST fixes. Hopefully. 2008-05-03 Claus-Justus Heine * doc/version.texi, doc/version-pt_BR.texi: Update (both files do not belong to the CVS). * doc/geomview.texi: Document nested Tlist's. * src/bin/geomview/common/worldio.c: Fix an error diagnostices message (wrong position of args reported). * src/bin/geomview/common/lang.c: Fix online help for write-handle function. * src/bin/geomview/common/comm.c: Delete command pools on close. * src/bin/geomview/x11/gvevent.c, src/bin/geomview/x11/gvmnpanel.c, src/bin/geomview/x11/gvcameras.c, src/bin/animate/animate.c, src/bin/animate/glob.c: Get rid of signed/unsigned comparison warnings * src/lib/geometry/geomtypes.h, src/lib/geometry/hpointn/hpointn.h: Remember the size of a hpoint, and do not free the data when moving the beast to the free-list. * src/lib/gprim/inst/instmisc.c: InstTransform(): forgot to decrease ref-count when moving a Tlist behind a single-transform Tlist. * src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/sphere/spherecreate.c: Use free-list allocation. * src/lib/gprim/geom/create.c, src/lib/gprim/geom/delete.c, src/lib/gprim/geom/geomclass.h: Optionally use free-list allocation for Geom's. * src/lib/gprim/tlist/tlcreate.c, src/lib/gprim/tlist/tlistP.h: Use a free-list for Tlists. * src/lib/mg/opengl/mgopengl.c: fix some signed/assigned comparison warnings. * src/lib/shade/light.c: Use free-list allocation for LtLight in order to avoid calling malloc() all the time. * src/lib/oogl/refcomm/streampool.c: PoolIn(): delete pools on EOF (if backed by seekable files). * src/lib/oogl/util/ooglutil.h: Use some inline functions to be able to set break-points on the memory-allocation functions (without having to set a break-point in malloc). * src/lib/oogl/util/iobuffer.c: EOF-recognition was broken with POSIX_SHORTCUT. * src/lib/oogl/util/freelist.h: Initialize allocated memory. * gvcl-mode.el: Some more keywords. * doc/geomview.texi: Cosmetics. * data/geom/textured/image.gcl: Initial revision. 2008-05-03 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi --> partial translation geomview.texi --> "MASK" to "DATEMASK" 2008-04-15 Jorge Barros de Abreu * doc/geomview-pt_BR.texi, doc/geomview.texi: geomview-pt_BR.texi --> partial translation geomview.texi --> "or or" to "or" 2008-04-14 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi --> partial translation 2008-03-30 Jorge Barros de Abreu * doc/geomview.texi, doc/geomview-pt_BR.texi: geomview.texi --> adjusting missing end of line geomview-pt_BR.texi --> partial translation 2008-03-27 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: partial translation. 2008-03-26 Jorge Barros de Abreu * doc/geomview.texi: ajusting line break in line 3749 - geomview.texi * doc/geomview.texi, doc/geomview-pt_BR.texi: Partial pt_BR translation of geomview-pt_BR Changing "Thease" to "These" in geomview.texi 2008-03-18 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Partial pt_BR translation of geomview-pt_BR Its ok for keeping version-pt_BR.texi. 2008-03-17 Claus-Justus Heine * src/lib/shade/image.c: New "zlib" filter which reads data in zlib format, i.e. without gzip header. File extension is ".zlib". Also: don't spawn gzip if not necessary, use zlib directly * doc/version.texi, doc/version-pt_BR.texi: Update (these files do not belong to the CVS archives). * src/lib/oogl/util/iobuffer.c, configure.ac: Try to use read(2) directly rather than unbuffered stdio. * src/lib/color/color.c, src/lib/fexpr/complex.c, src/lib/fexpr/real.c, src/lib/geometry/hpointn/hpointn.h, src/lib/geometry/transformn/transformn.h, src/lib/geometry/transobj/transobj.c, src/lib/gprim/bbox/bboxsave.c, src/lib/gprim/bezier/beztransform.c, src/lib/gprim/comment/commentclass.c, src/lib/gprim/comment/commentsave.c, src/lib/gprim/discgrp/dgbound.c, src/lib/gprim/discgrp/dgenum.c, src/lib/gprim/discgrp/dgpick.c, src/lib/gprim/discgrp/dgstream.c, src/lib/gprim/discgrp/dgtransform.c, src/lib/gprim/geom/bsptree.c: Signed/unsigned warning and/or unused parameter warning. 2008-03-16 Claus-Justus Heine * src/lib/gprim/geom/pick.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshnormal.c, src/lib/gprim/mesh/meshtransform.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/ndmesh/ndmeshload.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/npolylist/nplsave.c, src/lib/gprim/npolylist/npltransform.c, src/lib/gprim/polylist/plsave.c, src/lib/gprim/polylist/pltransform.c, src/lib/gprim/quad/quadsave.c, src/lib/gprim/skel/skelcreate.c, src/lib/gprim/skel/skeltransform.c, src/lib/gprim/sphere/spheresave.c, src/lib/mg/opengl/mgopenglP.h, src/lib/mg/opengl/mgopenglshade.c: Signed/unsigned warning and/or unused parameter warning. * src/lib/mg/rib/mgribtoken.c: Empty if body. * src/lib/mg/x11/mgx11windows.c, src/lib/oogl/lisp/lisp.c, src/lib/oogl/refcomm/handle.c, src/lib/oogl/refcomm/reference.h, src/lib/oogl/refcomm/streampool.c: Signed/unsigned warning and/or unused parameter warning. * src/lib/oogl/util/ppopen.c: Signed/unsigned warning. * src/lib/oogl/util/vvec.h: Unused parameter. * src/lib/shade/apstream.c: Signed/unsigned warning. * src/lib/shade/light.c: Unused parameter. * src/lib/shade/material.c: signed/unsigned warning. * src/lib/shade/texture.c: Unused parameter warning. * src/lib/window/winstream.c: signed/unsigned compiler warning. 2008-03-10 Claus-Justus Heine * configure.ac: Check for read(2), write(2) in preparation for Mac OS/X fixes for iobuffer.c * src/lib/oogl/refcomm/streampool.c: Protect PoolInAll() against pool deletion. Should be ok now. * src/lib/shade/texture.c: Cosmetics on error message. 2008-03-09 Jorge Barros de Abreu * doc/geomview-pt_BR.texi, doc/version-pt_BR.texi: Partial pt_BR translation of geomview-pt_BR Removing @letterpaper in geomview-pt_BR updating version-pt_BR.texi 2008-03-03 Claus-Justus Heine * doc/geomview-pt_BR.texi, doc/geomview.texi: Fixes for broken case-insensitive file-systems. * data/gcl/events.gcl: Contained non-working debugging left-over code. Fix that. 2008-03-02 Claus-Justus Heine * doc/version-pt_BR.texi, doc/version.texi, NEWS: Update. * src/lib/oogl/util/iobuffer.c: Missing #endif. Gnah. * src/lib/oogl/util/iobuffer.c: Only disable stdio buffering if __GLIBC__ is defined. In particular this should fix performance problems with MAC OS/X. * src/lib/oogl/refcomm/streampool.c: Reference count for "pool-handles" was increased too often for multi-object files. * src/bin/geomview/common/comm.c: Do attach temporary pool-handles to geoemtries; this is needed to read sequences of objects from non-command-language files. * src/bin/geomview/common/lang.c: New debugging function (dump-pools) which dumps the list of currently active pools to stderr. * src/lib/oogl/refcomm/handle.c: Only close and delete pools attached to non-permanent handles. * src/lib/shade/image.c: Default to "raw" filter if no filter was specified; fix a NULL-pointer reference. 2008-02-19 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Partial pt_BR translation 2008-02-18 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Partial pt_BR translation 2007-11-29 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Partial pt_BR translation 2007-11-28 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Partial pt_BR translation and fouth line adjust 2007-11-25 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Adjusting diacritical marks only * doc/geomview-pt_BR.texi: Partial translation pt_BR 2007-11-18 Jorge Barros de Abreu * doc/geomview.texi: changing "N < 3" to "N > 3" 2007-11-16 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi partial translation 2007-11-15 Jorge Barros de Abreu * doc/geomview-pt_BR.texi, doc/geomview.texi: geomview.texi - changing "normalizaton" to "normalization" geomview-pt_BR.texi partial translation 2007-11-04 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi partial translation 2007-11-03 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi partial translation 2007-10-22 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi partial translation 2007-10-20 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi partial translation 2007-10-09 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: geomview-pt_BR.texi partial translation * doc/version-pt_BR.texi: Translating month name to portuguese 2007-10-03 Claus-Justus Heine * src/bin/geomview/common/comm.c: (echo ...) command: for compatibility switch back to the old and inconsistent behaviour: strings are printed without quotes, but if the argument is the result of a function evaluating to string, do not omit the quote. This way (echo (real-id focus)) will be printed with quotes (e.g. as `"Camera"'), but (echo "Camera") will be printed without quotes. * ChangeLog: Update. * doc/version-pt_BR.texi, doc/version.texi: Update. These files to not belong to the CVS archive. * data/Makefile.am: Add GCL examples to demonstrate the new lisp-features. * configure.ac: Version to 1.9.5. * NEWS: Cosmetics. 2007-09-27 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Partial pt-BR translation and adjusts 2007-09-24 Claus-Justus Heine * data/gcl/events.gcl: Cosmetics. 2007-09-23 Claus-Justus Heine * .cvsignore: No longer ignore gvcl-mode.el 2007-09-22 Claus-Justus Heine * gvcl-mode.el, data/gcl/arithmetic.gcl, data/gcl/events.gcl: Initial revision. 2007-09-21 Claus-Justus Heine * configure.ac, doc/version-pt_BR.texi, src/lib/oogl/lisp/lisp.c, src/lib/oogl/lisp/lisp.h, src/lib/oogl/lisp/lisp2c, src/lib/oogl/wa/fsaparse.l, src/lib/oogl/wa/fsaparse.y: Some cleanup after examining the diff w.r.t. 1.9.4. 2007-09-20 Claus-Justus Heine * doc/geomview.texi: Also mention redefining of builtin-functions. * doc/geomview.texi, doc/version-pt_BR.texi: Update. * doc/version.texi: Document the new lisp-features. * src/lib/oogl/lisp/lisp.c: Doc typos. * NEWS, configure.ac: Update. * src/lib/oogl/lisp/lisp.c: Use stdout as default output channel of a lake if nothing else is specified. * src/bin/geomview/x11/gvevent.c, src/lib/oogl/refcomm/streampool.c, src/lib/oogl/refcomm/streampool.h: Make use of pool->awaken (and set it!). * geomview.sh: Add LC_NUMERIC=POSIX * src/bin/geomview/x11/gvui.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/event.c, src/bin/geomview/common/lang.h, src/bin/geomview/common/ui.c: Introduce NOT_A_KEYWORD as undefined keyword value and fix some stereowin related issues. 2007-09-19 Claus-Justus Heine * src/lib/shade/light.c: LmCopyLights(): really copy the lights. * src/bin/geomview/common/drawer.c, src/bin/geomview/common/comm.c: Mostly cosmetics. * src/bin/stereo/stereo.c: Update to changed lisp stuff. 2007-09-18 Claus-Justus Heine * src/lib/oogl/refcomm/streampool.c: addtime() wrongly called, caused by previous change. * src/lib/oogl/lisp/lisp.c: Interests were broken by previous changes. * src/bin/nose/nose.c: If no edge was picked then one must not try to access the edge co-ordintates. * src/lib/oogl/refcomm/streampool.c, src/lib/oogl/refcomm/streampool.h, src/bin/geomview/x11/gvevent.c: New lisp-function (process-events) which passes control back to geomview event-loop, in principle it is now possible to control geomview entirely out of a lisp-script. * src/lib/oogl/lisp/lisp.c: Fix the name-space implementation. * src/lib/oogl/lisp/lisp.c: &rest/&optional fix. 2007-09-17 Claus-Justus Heine * src/lib/oogl/lisp/lisp.c, src/lib/oogl/lisp/lisp.h: let function, local variables, &rest and &optional for defun * doc/version-pt_BR.texi, doc/version.texi: Update. 2007-09-16 Claus-Justus Heine * src/bin/geomview/common/comm.c, src/bin/geomview/common/lang.c, src/bin/geomview/common/lispext.c, src/bin/geomview/common/worldio.c, src/lib/oogl/lisp/lisp.c, src/lib/oogl/lisp/lisp.h, src/lib/oogl/lisp/lisp2c: Distinguish between quoted and un-quoted strings. Function names have to be unquoted, also parameters and global variables (i.e. setq). Quoted strings are never bound to function, parameter or variable names. A quoted paren cannot terminate or begin a S-expr, it just stands for itself. * src/bin/geomview/common/help.c: Fix help messages for synonymous commands. * src/bin/animate/animate.c: char ch = (char)NULL -> char ch = '\0' 2007-09-16 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Partial pt-BR translation 2007-09-16 Claus-Justus Heine * doc/geomview-pt_BR.texi, doc/version-pt_BR.texi, doc/version.texi: Fix a copy'n paste "bug". * src/bin/geomview/common/comm.c, src/bin/geomview/common/event.c, src/bin/geomview/x11/gvcamui.c, src/lib/oogl/lisp/lisp.c, src/lib/oogl/lisp/lisp.h: Basic lambda-expression/defun/setq support. * src/bin/geomview/x11/gvmnpanel.c: Replace (char)NULL by (char)0. * doc/.cvsignore: Add translated manual output files. * src/lib/oogl/lisp/lisp2c: Just pick up the first LDECLARE after an LDEFINE. * src/lib/oogl/refcomm/streampool.c: Move gettimeofday() stuff to ../util/time.c * src/lib/oogl/util/ooglutil.h: inline vvec stuff, proto-types. * src/lib/oogl/util/futil.c: char * <-> const char * * src/lib/oogl/util/iobfutil.c: Optionally report the quote-state of a token. * src/lib/oogl/wa/.cvsignore: Ignore autogenerated wa.... stuff. * src/lib/oogl/util/time.c, src/lib/oogl/util/vvec.h: Initial revision. * src/lib/oogl/util/fsa.c, src/lib/oogl/util/fsa.h: New function fsa_delete() to get rid of an entire parser, needed by lambda-expression stuff. * src/lib/oogl/util/Makefile.am: Add time.c * src/lib/oogl/util/Headers: Add vvec.h 2007-09-08 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Partial pt-BR translation * doc/geomview.texi: {RG}b to {RGB} * doc/geomview.texi: "Draw" to "Show" and "right" to "left" in Appearence panel. Faces, Edges, Normals, BBox and Vects are under "show" and not under "draw" and in "upper left corner" and not in "upper right corner". 2007-09-05 Jorge Barros de Abreu * doc/version-pt_BR.texi: Update day of month in version-pt_BR.texi 2007-09-04 Jorge Barros de Abreu * doc/version-pt_BR.texi: Update day of month in version-pt_BR.texi * doc/geomview-pt_BR.texi, doc/version-pt_BR.texi: Partial Translation pt_BR of geomview-pt_BR.texi Update of month in version-pt_BR.texi 2007-09-02 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Partial Translation pt_BR 2007-09-01 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Partial Translation pt_BR 2007-08-30 Claus-Justus Heine * src/lib/gprim/list/listdraw.c: Use alloca() less often. 2007-08-29 Claus-Justus Heine * src/bin/geomview/common/drawer.c: Optional timing stuff. 2007-08-27 Claus-Justus Heine * ChangeLog: Claim to have released v1.9.4 2007-08-27 * Release of Geomview 1.9.4 2007-08-23 Claus-Justus Heine * NEWS: Mention GEOMROOT environment variable. * doc/Makefile.am: install/uninstall-local hook for the html stuff. * src/bin/geomview/common/help.c: Undo a debugging message. * doc/Makefile.am, src/bin/geomview/common/help.c: Support for installing and viewing a language specific manual (by examining the LANG environment variable). * doc/Makefile.am: Forgot to distribute geomview-pt_BR.pdf. * doc/version-pt_BR.texi, doc/version.texi: Update to 1.9.4. * rcs2log: Initial revision. * ChangeLog: Update. * AUTHORS, NEWS: Version to 1.9.4 * README: Add Jorge Barros, bump version to 1.9.4. * geomview.sh: Revive the GEOMROOT environment variable, because the StageTools suite needs its presence. * configure.ac: Use a more verbose MACHTYPE. * doc/geomview-pt_BR.texi, doc/geomview.texi, doc/version-pt_BR.texi, doc/version.texi: Update. 2007-08-22 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Translation pt_BR small corrections. Thanks to Patrice Dumas. 2007-08-19 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Partial translation pt_BR 2007-08-12 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Partial translation pt_BR 2007-08-05 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Partial translation pt_BR 2007-08-04 Jorge Barros de Abreu * doc/geomview-pt_BR.texi, doc/version-pt_BR.texi: Removing version-pt_BR.texi for keeping only version.texi Adjusting geomview-pt_BR.texi pointing to version.texi * doc/geomview-pt_BR.texi, doc/version-pt_BR.texi: Partial pt_BR translation 2007-08-03 Claus-Justus Heine * doc/Makefile.am: Fix typo (ooglttour-pt_BR -> oogltour-pt_BR). 2007-08-01 Claus-Justus Heine * doc/.cvsignore, doc/Makefile.am, doc/geomview-pt_BR.texi, doc/oogltour-pt_BR, doc/version-pt_BR.texi, doc/version.texi: Restructuring pt_BR translation. 2007-07-31 Claus-Justus Heine * src/lib/shade/image.c: run_filter(): did not close the write-end of the pipe. ImgStreamIn(): need to save the contents of w = iobfdelimtok(), it is overwritten on the next call to iobfdelimtok(). 2007-07-29 Jorge Barros de Abreu * doc/geomview.texi: replacing "and and" by "and" 2007-07-28 Jorge Barros de Abreu * doc/oogltour: adjusting "Obscure panel" to "Inspect pull-down menu" * doc/oogltour: adjusting "More panels" to "Inspect pull-down menu" 2007-07-20 Claus-Justus Heine * doc/geomview.texi: Some button names were wrong in the Tutorial (reported by Jorge Barros de Abreu ) 2007-07-19 Claus-Justus Heine * src/bin/geomview/common/motion.c: Revert a previous change and do NOT call drawer_transform() directly, instead go throught he Lisp-functions (transform ...) and (transform-incr ...). Otherwise interest stuff does not work as before. * configure.ac: Give OPENGLINCLUDE an empty value instead of giving it a value of 0 if OpengGL cannot be found. * doc/geomview.texi: Fix a typo. 2007-07-18 Claus-Justus Heine * src/bin/geomview/common/comm.c: Fix not restoring pool->outf for a temporary (from string) command pool. * src/lib/oogl/util/iobuffer.c: Typo in comment. 2007-07-11 Claus-Justus Heine * src/lib/mg/opengl/mgopengldraw.c: Only use the GLU tesselator if APF_CONCAVE is set (as was the previous behaviour) * src/lib/mg/opengl/mgopenglshade.c: Set GL_UNPACK_ALIGNMENT to 1 before scaling images; the default is 4. * src/lib/mg/opengl/mgopengldraw.c: Typo. * src/lib/gprim/polylist/plnormal.c: Use fneg() to evaluate the sign of scalar products. 2007-07-10 Claus-Justus Heine * src/lib/gprim/polylist/plnormal.c: Improved computation of per-vertex normals. 2007-07-07 Claus-Justus Heine * src/lib/gprim/mesh/meshload.c: Fix a bug introduced by the previous change. 2007-07-05 Claus-Justus Heine * src/lib/gprim/polylist/plsphere.c: Fix a memory leak; bounding sphere was created twice. 2007-06-21 Claus-Justus Heine * doc/version.texi: Update. 2007-06-21 * Release of Geomview 1.9.3 2007-06-21 Claus-Justus Heine * AUTHORS, NEWS, README, configure.ac: Bump version to 1.9.3; spheres were severely broken in > 1.8.2 < 1.9.2 * src/lib/gprim/sphere/spheredice.c: Drawing of sheres with center != 0 was severely broken. 2007-06-09 Claus-Justus Heine * ChangeLog: Update. * configure.ac, geomview.sh, src/bin/geomview/common/main.c, src/bin/gvclock/gvclock.in: Locale stuff. 2007-06-09 * Release of Geomview 1.9.2 2007-06-09 Claus-Justus Heine * configure.ac, geomview.sh, src/bin/geomview/common/main.c, src/bin/gvclock/gvclock.in: Locale stuff. 2007-06-07 Claus-Justus Heine * ChangeLog, AUTHORS, NEWS, README: Version to 1.9.2 * geomview.sh: Set LC_ALL to C to avoid problems with native language support. Geomview does not know about this stuff. 2007-06-07 Claus-Justus Heine * AUTHORS, NEWS, README: Version to 1.9.2 * geomview.sh: Set LC_ALL to C to avoid problems with native language support. Geomview does not know about this stuff. 2007-05-21 Claus-Justus Heine * doc/geomview.texi, doc/version.texi: Document changed picking interface. * NEWS, configure.ac: Update for 1.9.2 * src/lib/oogl/lisp/lisp.c, src/bin/geomview/common/comm.c, src/bin/geomview/common/event.c, src/bin/geomview/common/transform.c: (morehelp ...) docs: Use "\n\n" as hard-line break, use any following tabs as indentation. Paragraphs are generated by "\n\n\n\n". * src/bin/geomview/common/pickfunc.h: Execute 3d picking code if pn <= 4 (i.e. the 3d block is also responsible for void pick events). * src/bin/nose/nose.c: Add myself to the copyright notice. * src/lib/gprim/geom/Makefile.am: Add nodedata.h to library sources. * src/lib/mg/x11/mgx11windows.c: Xmg_showdisplaylist(): do nothing if (xmin > xmax || ymin > ymax), otherwise calling X[Shm]PutImage() causes (justly) an X-error, which previously was caught by a custom error handler. 2007-05-20 Claus-Justus Heine * src/bin/ndutils/.cvsignore: Bump version stamps. * doc/example3.c: Update to recent pick changes. * src/bin/geomview/common/pickfunc.h: Fix PICKFUNC() macro. (most recent ND-pick changes) * src/bin/cplxview/Makefile.am, src/bin/example/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am: First link with libgeomview, then with all other libs. * src/bin/graffiti/lang.c, src/bin/hinge/lang.c: ND-picking update. * src/bin/crayola/callbacks.c, src/bin/geomview/common/event.c, src/bin/geomview/common/pickfunc.h, src/bin/nose/nose.c: Pick events now use the new LVARARRAY stuff; this also means that picking of ND-objects is now fully (mmh, really?) supported. At least Nose seems to do the right things ... * src/bin/crayola/Makefile.am: First link with libgeomview, then with Tcl/Tk. * src/bin/geomview/common/drawer.c: drawer_dgeom(): Use NULL arg to GeomBSPTree(..., BSPTREE_CREATE) to trigger recreation. * src/bin/geomview/common/drawer.h, src/bin/geomview/common/ndshade.c: Comment out the last relicts of the most recent optimization attempts. * src/bin/geomview/common/lispext.c: List-type extension methods should be "static". Fix that. * src/bin/geomview/common/transform.c: Typo in error message. * src/bin/geomview/common/ndshade.c: Try to optimize ND-projections. Unluckily, it did not work out. Keep the source code embedded into "#if 0" brackets. See the comments in ndshade.c * src/lib/oogl/lisp/lisp.c, src/lib/oogl/lisp/lisp.h, src/lib/oogl/lisp/lisp2c: Implement new LVARARRAY lisp object: variable sized arrays, the argument parsing code just allocats as much space as needed. This comes in very handy -- e.g. -- for interest in pick objects. * src/lib/oogl/lisp/Makefile.am: Let clisp.c depend on lisp.h. * src/lib/oogl/lisp/Headers: lisp2.h was a duplicate, remove it. * src/lib/gprim/geom/Headers, src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/bsptree.h, src/lib/gprim/geom/bsptreeP.h, src/lib/gprim/geom/delete.c, src/lib/gprim/geom/geomclass.h, src/lib/gprim/geom/nodedata.h, src/lib/gprim/geom/pick.c, src/lib/gprim/geom/pickP.h, src/lib/gprim/geom/replace.c, src/lib/gprim/inst/instcreate.c, src/lib/gprim/list/listcreate.c: Fix BSP-tree invalidation. * src/lib/gprim/npolylist/nplcreate.c: Formatting (while re-reading the stuff). * src/lib/gprim/polylist/plsphere.c: Nd stuff fixes. * src/lib/geomutil/crayplutil/Makefile.am, src/lib/geomutil/crayplutil/crayNPolylist.c, src/lib/geomutil/crayplutil/crayola.c, src/lib/geomutil/crayplutil/crayolaP.h: Add colouring support for NPolyList objects. Only NDMeshes are still missing. But the ND-Mesh concept is broken anyway. * src/lib/geomutil/crayplutil/crayVect.c: Get rid of a compiler warning. * src/lib/geometry/hpointn/hpointn.h: HPt3NTransform(): used wrong permutation (inverted). * src/lib/geometry/transform3/tm3print.c: Geeh, this stuff still used printf instead of fprintf. * src/lib/geometry/transformn/transformn.h: Formatting of comments. * m4/geomview.m4: Check for Geomview in bindir first. 2007-05-18 Claus-Justus Heine * src/bin/geomview/common/drawer.c: Shut-off a compiler warnings. * src/lib/mg/x11/mgx11windows.c: Revert to hiding a bug of this broken stuff. 2007-05-16 Claus-Justus Heine * src/lib/oogl/util/iobuffer.c, src/lib/oogl/refcomm/streampool.c: Issue an error if non-blocking IO flags are not defined. * src/bin/geomview/common/comm.c: emodule_run() tiny fixes, shouldn't change anything. * data/Makefile.am: Distribute some more texture images. * src/lib/geometry/hpoint3/hpoint3.h: Hpt3MinMax(): catch the w == 0 case. * data/geom/textured/themi.bez: Use texturing. * data/geom/textured/Antenna.geom, data/geom/textured/GCGball, data/geom/textured/NASA.pgm.gz, data/geom/textured/dodec.off, data/geom/textured/geologo.pgm.gz, data/geom/textured/grid.pgm.gz, data/geom/textured/lunar-t.oogl, data/geom/textured/square.off, data/geom/textured/themi.bez, data/geom/textured/white.pgm.gz: Add missing texture images. * data/geom/textured/sphere.gcl, data/Makefile.am, data/geom/textured/Earth.pam.bz2: Initial revision of textured sphere (new replace apply flag + textured sphere support). * src/lib/gprim/bezier/bezbound.c: Bezier bounding boxes were totally broken. * src/lib/oogl/util/error.c, src/lib/oogl/util/futil.c, src/lib/oogl/util/glob.c, src/lib/oogl/util/iobfutil.c, src/lib/oogl/util/iobuffer.c, src/lib/shade/appearance.h, src/lib/shade/texture.c, src/bin/geomview/x11/gvlights.c, src/bin/geomview/x11/gvload.c, src/bin/geomview/x11/gvmaterial.c, src/bin/geomview/x11/gvmnpanel.c, src/bin/geomview/x11/gvsave.c, src/bin/geomview/x11/gvtoolui.c, src/bin/geomview/x11/gvui.c, src/bin/togeomview/Makefile.am, src/lib/geomutil/crayplutil/crayVect.c, src/lib/geomutil/plutil/anytopl.c, src/lib/gprim/discgrp/dgdraw.c, src/lib/gprim/discgrp/dgsave.c, src/lib/gprim/discgrp/dgstream.c, src/lib/gprim/discgrp/polyhedron.c, src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/delete.c, src/lib/gprim/geom/geomstream.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshpick.c, src/lib/gprim/mesh/meshsave.c, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshpick.c, src/lib/gprim/npolylist/nplcreate.c, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/skel/skelload.c, src/lib/gprim/skel/skelpick.c, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/sphere/spheremisc.c, src/lib/gprim/vect/vectpick.c, src/lib/mg/buf/mgbuf.c, src/lib/mg/buf/mgbufdraw.c, src/lib/mg/common/mg.c, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/ps/mgps.c, src/lib/mg/ps/mgpsdraw.c, src/lib/mg/ps/mgpstri.c, src/lib/mg/ps/mgpswindows.c, src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribP.h, src/lib/mg/x11/mgx11.c, src/lib/mg/x11/mgx11draw.c, src/lib/mg/x11/mgx11windows.c, src/lib/mib/mibScale.c, src/lib/mib/mibload.c, src/lib/oogl/lisp/lisp.c, src/bin/geomutil/oogl2rib/Makefile.am, src/bin/geomutil/oogl2rib/oogl2rib.c, src/bin/geomutil/oogl2vrml/Makefile.am, src/bin/geomutil/ucd/Makefile.am, src/bin/geomutil/ucd/anytoucd.c, src/bin/geomutil/ucd/ucdtooff.c, src/bin/geomutil/vrml2oogl/lib/QvFieldData.c++, src/bin/geomview/common/comm.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/event.c, src/bin/geomview/common/lang.c, src/bin/geomview/common/lang.h, src/bin/geomview/common/lights.c, src/bin/geomview/common/lispext.c, src/bin/geomview/common/shaders.c, src/bin/geomview/common/transform.c, src/bin/geomview/common/ui.c, src/bin/geomview/x11/gvappear.c, src/bin/geomview/x11/gvcameras.c, src/bin/geomview/x11/gvcolor.c, src/bin/geomview/x11/gvcommands.c, src/bin/geomview/x11/gvcredits.c, src/bin/animate/Makefile.am, src/bin/animate/animate.c, src/bin/clipboard/clipboard.c, src/bin/geomutil/clip/Makefile.am: Get rid of quite a bunch of SGI compiler warnings. * data/geom/torus8.oogl: Formatting. * m4/withtool.m4, m4/lf_local.m4: Don't use -qs (SGI compatibility issue). * src/lib/oogl/refcomm/streampool.c: StreamPoolTemp(): sizeof(dummy) was too small, bug introduced by an attempt to make the stuff 64-bit clean (actually: to make it independent from sizeof(void *)). * src/lib/oogl/refcomm/reference.c: No longer needed (inlined). * src/bin/geomutil/bdy/Makefile.am, src/bin/geomutil/bdy/drawbdy.sh: Installation directory layout change broke the drawbdy script (which already was somewhat broken anyway) 2007-05-15 Claus-Justus Heine * src/bin/geomview/common/worldio.c: Pool->level increment/decrement did not match. * src/bin/geomutil/vrml2oogl/lib/QvPList.c++: Another AIX fix. * src/lib/mg/opengl/mgopengldraw.c: Never release stuff without testing ... * data/Makefile.am, data/shaders/Makefile.am: Use "dist_" prefix instead of EXTRA_DIST for .._DATA stuff, distribute the compiled shader source. * src/lib/geometry/cmodel/cmodel.c: Do not use alloc for large arrays. Don't. * src/lib/gprim/geom/bsptree.c, src/lib/mg/opengl/mgopengldraw.c: Although otherwise documented the "vertex_data" argument to the GLU tesselator combine-callbine does _NOT_ always contain valid pointers. Also make sure that a zero homogeneous component does not produce NaNs; this leads to memory corruption or infinite loops in the tesselator. * src/lib/gprim/mesh/meshdraw.c: cm_mesh_draw() needs the per-point normals. * configure.ac, doc/Makefile.am, src/bin/geomutil/oogl2rib/oogl2rib.c, src/bin/geomutil/plutil/polymerge.c, src/lib/oogl/util/porting.h: Fix (hopefully) some issues concerning IBM AIX. 2007-05-12 Claus-Justus Heine * src/bin/geomview/common/event.c: Cosmetics. * src/bin/geomview/common/event.c: tog_ap_flag(): initialize ApStruct. * src/bin/geomutil/oogl2rib/Makefile.am: Add newline at end of file. 2007-05-07 Claus-Justus Heine * Release of Geomview 1.9.1 2007-05-07 Claus-Justus Heine * ChangeLog, doc/version.texi: Release 1.9.1 2007-05-04 Claus-Justus Heine * README: Bump version to 1.9.1 * NEWS: Update. * doc/geomview.texi: Some sort of spell-checking. Not complete. ispell and TeXinfo is a real nightmare. * src/lib/mg/common/mg.c: When we delete a context then we must make sure that textures are pruned which only belong to this context, otherwise mgopengl thinks the texture is still loaded, even when the last (shared) OpenGL context has gone. * src/lib/mg/common/mgtexture.c: Cosmetics. * doc/Makefile.am: Tweak TEXINPUTS. 2007-05-03 Claus-Justus Heine * doc/Makefile.am: Try to provide working html doc in the build-directory. * configure.ac: Use automake 1.10. 2007-05-01 Claus-Justus Heine * doc/version.texi: Update. * doc/Makefile.am: Prevent automake from including Emacs backup-files into the distro. * AUTHORS, Makefile.am, NEWS, configure.ac: Bump version to 1.9.1 * AUTHORS, README: Version stamps were wrong. * src/lib/aclib/putenv.c, src/lib/aclib/strdup.c: Fix bug "[ 1687598 ] Check return codes everywhere" where it was appropriate. 2007-04-29 Lloyd Wood * doc/geomview.texi: Fixing minor typo. 2007-04-27 Claus-Justus Heine * Release of Geomview 1.9.0 2007-04-27 Claus-Justus Heine * ChangeLog: Update. * configure.ac: Use default docdir. * src/bin/togeomview/togeomview.c: Really fix the ipv4/v6 issue. 2007-04-26 Claus-Justus Heine * src/lib/oogl/util/iobuffer.c: Cosmetics. * src/lib/oogl/refcomm/streampool.c: initialization of pool->infd was broken. 2007-04-27 Claus-Justus Heine * configure.ac: Use default docdir. * src/bin/togeomview/togeomview.c: Really fix the ipv4/v6 issue. 2007-04-26 Claus-Justus Heine * src/lib/oogl/util/iobuffer.c: Cosmetics. * src/lib/oogl/refcomm/streampool.c: initialization of pool->infd was broken. * src/bin/togeomview/togeomview.c: Forgot an #ifdef (for IpV4/V6). 2007-04-25 Claus-Justus Heine * m4/geomview.m4: Search under DEFAULT_PREFIX/lib/ and libdir for libgeomview. * configure.ac, src/lib/gprim/geom/bsptree.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/mg/opengl/mgopengldraw.c: Use ISO C99 variable size arrays through a VARARRAY() macro that falls back to alloca is ISOC99 is not available. * src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshdraw.c: Try to avoid alloca for large arrays. * src/lib/geomutil/crayplutil/crayolaP.h: missing proto-type * src/bin/togeomview/togeomview.c: Some uninitialized variables. * src/bin/nose/nose.c: main() should return something. * configure.ac: Check for ISO C99 features. * m4/iso-c99.m4: Initial revision. 2007-04-24 Claus-Justus Heine * INSTALL.Geomview, NEWS, README, README.cvs: Doc update. 2007-04-21 Claus-Justus Heine * configure.ac: Call GEOMVIEW_SET_PREFIX (DEFAULT_PREFIX env var etc) 2007-04-20 Claus-Justus Heine * m4/geomview.m4: Check for libgeomview under DEFAULT_PREFIX, disable (per default) --enable-geomview-query if --prefix was given (can be re-enabled). * m4/set-prefix.m4: Iterate with eval. 2007-04-19 Claus-Justus Heine * src/bin/geomview/common/space.c: Fix ND-view scale bug, introduced by earlier changes. * src/bin/geomview/common/motion.c: Formatting. * src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/nplcopy.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/sphere/spherecreate.c, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/ps/mgpsdraw.c, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.h, src/lib/mg/x11/mgx11draw.c, src/lib/shade/image.c: Compiler warnings. 2007-04-18 Claus-Justus Heine * src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quaddraw.c, src/lib/mg/opengl/mgopengldraw.c: Partial support for flat-shaded facets with smooth color interpolation between the vertices. * src/lib/gprim/mesh/meshnormal.c: Fill per-quad normals for all mesh points to support shading=vcflat. * src/lib/gprim/mesh/meshdraw.c: Support shading=vcflat in draw_projected_mesh(). * src/lib/shade/apstream.c: Support shading=vcflat * src/lib/mg/opengl/mgopenglmesh.c: Fix a bug missing () bug in mgopenglsubmesh(). 2007-04-17 Claus-Justus Heine * src/bin/geomview/common/event.c, src/bin/geomview/common/ui.c, src/bin/geomview/common/ui.h, src/lib/gprim/polylist/plload.c, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/opengl/mgopenglmesh.c, src/lib/shade/appearance.h, src/lib/shade/apstream.c: New shading option VCflat: smooth interpolated per-vertex colours, but with flat lighting. * m4/geomview.m4: Make --enable-geomview-query the default, i.e. ask the installed version of Geomview about the installation directories if not disabled via --disable-geomview-query. * m4/check-package.m4: Iterate with eval over the extra framework search paths. * m4/check-package.m4: Revert previous two changes. 2007-04-16 Claus-Justus Heine * m4/check-package.m4: Need to use LDFLAGS; the library path passed to AC_CHECK_LIB() in the last argument really is passed as last argument to the linker; and linker paths are position sensitive. 2007-04-15 Claus-Justus Heine * src/lib/oogl/util/iobuffer.c: iobffileopen(): bail out if istream argument is NULL. * src/lib/oogl/refcomm/streampool.c: Handle drive-letter in file name. 2007-04-12 Claus-Justus Heine * src/lib/mg/rib/mgribtoken.c: Again: The world is not Big-Endian (luckily). So fix the damn RIB-stuff to not misbehave. Also: Binary RIB was missing some tokens the ASCII stuff already was aware of. * src/lib/mg/rib/mgribtoken.c: The world is not Big-Endian (luckily). So fix the damn RIB-stuff to not misbehave. * src/bin/geomview/common/drawer.c, src/bin/geomview/common/lang.c, src/bin/geomview/common/worldio.c, src/bin/geomview/x11/gvsave.c: Make sure we can save the universe (i.e. include aliens). 2007-04-11 Claus-Justus Heine * src/bin/ndutils/TransformGeom.c, src/bin/ndutils/WithColor.c: Support 3d-snapshots for Insts (colored or not). * src/bin/ndutils/TransformGeom.c: 3d snapshot without colour works for INSTs, colour snapshots still to be done (but should now be trivial). * src/bin/ndutils/TransformGeom.c, src/bin/ndutils/Clip.h, src/bin/ndutils/GeomtoNoff.c: Trying to make 3d snapshots work again ... (not yet). 2007-04-10 Claus-Justus Heine * src/bin/geomview/common/worldio.c: Use bool true/false * src/bin/ndutils/snapshot.c: Quote geometry names. * src/bin/ndutils/clip.c: clip_all_vertices(): the list head may be deleted, cope with that. * src/bin/ndutils/clipoogl.c: readNDPoly() was broken (my fault). * src/bin/ndutils/testwish.c: Emacs stuff. * src/bin/ndutils/GeomtoNoff.c: Make it work for lists and insts, fix toNoffNPolyList() (did modify stuff instead of copying). * src/bin/ndutils/Clip.h: Bool data type. * src/lib/gprim/npolylist/nplcreate.c: CR_POINT: homogeneous component is now at index 0 for ND stuff. * src/lib/gprim/npolylist/nplcopy.c: Only copy per-vertex colour if they are present. * src/lib/gprim/geom/geomstream.c: GeomStreamOut(): _always_ surround geometries by braces, some geometries (INSTs) have a variable number of "sections" which may be there or not. * src/bin/geomview/common/worldio.c: save_dgeom_geom(): only decrease the pool-level is wrap == true. * src/lib/oogl/refcomm/streampool.c: PoolIncLevel(): debugging code. 2007-04-09 Claus-Justus Heine * src/lib/geometry/ntransobj/ntransobj.c: Forgot the closing brace. * src/bin/ndutils/GeomtoNoff.c: Try to support Inst objects. * src/lib/geomutil/crayplutil/craySkel.c: cray_skel_UseFColor(): allocation bug. * src/bin/crayola/callbacks.c, src/bin/geomview/common/lispext.c: Stringe geom-ids have to be quoted, they might contain spaces. * doc/geomview.texi, src/lib/gprim/inst/inststream.c: Allow texture transform in the on-disk format. * src/lib/gprim/inst/instcreate.c: InstCopy(): need to initialize txtlist. * m4/check-package.m4: Some more m4 fixes. 2007-04-08 Claus-Justus Heine * data/Makefile.am: Add moebius.skel * src/bin/crayola/callbacks.c: Cosmetics. * src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelload.c, src/lib/gprim/skel/skelpick.c: Pick related fixes. * src/lib/geomutil/crayplutil/Makefile.am, src/lib/geomutil/crayplutil/crayPolylist.c, src/lib/geomutil/crayplutil/craySkel.c, src/lib/geomutil/crayplutil/crayola.c: Some smaller fixes + support for SKEL objects. 2007-04-07 Claus-Justus Heine * m4/withtool.m4: Fix empty path issue in GV_PATH_PROG (dirname perl == ., not empty). * configure.ac: Make sure to use new CHECK_PACKAGE stuff. * src/lib/geomutil/crayplutil/crayMesh.c, src/lib/geomutil/crayplutil/crayPolylist.c, src/lib/geomutil/crayplutil/crayQuad.c: Colouring edge picks should really only colour the edge. Fix that. MISSING: colouring of SKEL objects. * doc/version.texi, src/bin/NDview/Makefile.am, src/bin/crayola/Makefile.am, src/bin/labeler/Makefile.am, src/bin/ndutils/Makefile.am: Make sure to use new CHECK_PACKAGE stuff. * src/bin/crayola/callbacks.c: Cosmetics. * src/bin/cplxview/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am: Use new CHECK_PACKAGE() stuff etc. * src/bin/example/Makefile.am: XFORMS_ALL_INCLUDES already contains ${X_CFLAGS} * m4/check-package.m4, m4/geomview.m4: FreeBSD seems to work now (with this emodule) * m4/check-package.m4: Cosmetics. * m4/check-package.m4, src/bin/example/Makefile.am: We need to be a little bit more careful when checking for packages; Linux is not the world. * src/bin/crayola/Makefile.am, src/bin/crayola/tkcrayola.c: Fix checking for tcl/tk headers. * Makefile.am, m4/lf_local.m4: Fix header link & install issue for auto-generated headers. 2007-04-06 Claus-Justus Heine * src/bin/cplxview/Makefile.am, src/bin/example/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/ndutils/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am: Fix include path for private headers. * m4/check-package.m4, m4/geomview.m4: Fix include path stuff for tcl and geomview * src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quaddraw.c: Fix faulty alloca #ifdef's * src/lib/shade/image.c: Need to include signal.h * configure.ac: Fix --help texts. * src/bin/geomview/common/main.c, src/bin/togeomview/togeomview.c, src/bin/geomview/common/comm.c, src/bin/geomview/geomview.1gv, doc/geomview.texi: Support IPv4/v6 sockets. Somewhat dangerous, but so what. * src/bin/geomview/x11/gvcamui.c: Remove spaces from version string. * src/lib/oogl/refcomm/streampool.c: Cosmetics. * configure.ac, src/bin/geomview/common/comm.c, src/bin/geomview/common/main.c, src/bin/togeomview/togeomview.c: Try to support IPv4/v6 sockets. * src/bin/geomutil/math2oogl/math2oogl.c, src/lib/oogl/refcomm/streampool.c: Cosmetics: use PF_xxx insteadof AF_xxx as argument to connect. 2007-04-05 Claus-Justus Heine * src/bin/crayola/callbacks.c, src/bin/crayola/tkcrayola.c: Replace the functionality of Tcl_CreateFileHandler() by polling via timer events. * src/bin/cplxview/.cvsignore: Add .geomview. * src/bin/flythrough/data/Makefile.am: EXTRA_DIST stuff. * src/bin/geomview/common/comm.c: Typo. * src/bin/geomview/x11/gvmain.c: Local variables section. 2007-04-04 Claus-Justus Heine * src/lib/oogl/refcomm/streampool.c: HandleReferringTo(): ref-count cleanups introduced some bugs which made it impossible to read from a named pipe, fix that (always return with a handle if the file could be opened, even when it does not have (yet) data available). * data/Makefile.am: dodec.vec belongs to cplxview. * src/bin/nose/nose.c: Fix some compiler warnings. 2007-04-03 Claus-Justus Heine * src/bin/flythrough/Makefile.am, src/bin/flythrough/data/Makefile.am: Move flythrough data to flythrough emodule. * src/bin/flythrough/data/.cvsignore: Add Makefile[.in] * data/groups/equi.1.gv, data/groups/equi.2.gv, data/groups/equi.3.gv, data/groups/equi.4.gv, data/groups/loop.1.gv, data/groups/loop.2.gv, data/groups/loop.3.gv, data/groups/loop.4.gv, data/groups/quart.1.gv, data/groups/quart.2.gv, data/groups/quart.3.gv, data/groups/quart.4.gv, data/Makefile.am, data/geom/dodec.vect, data/geom/flythrough_diagram.gv, data/groups/br4.0.tlist, data/groups/br4.1.tlist, data/groups/br4.2.tlist, data/groups/br4.3.tlist, data/groups/dir.1.gv, data/groups/dir.2.gv, data/groups/dir.3.gv, data/groups/dir.4.gv: Move flythrough data to flythrough emodule. * src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am, src/bin/example/Makefile.am, src/bin/NDview/Makefile.am, src/bin/cplxview/Makefile.am, src/bin/crayola/Makefile.am, src/bin/ndutils/Makefile.am: Add path to X11 include files via X_CFLAGS. * src/lib/gprim/geom/Makefile.am: OPENGLINCLUDE without trailing s. * src/lib/gprim/geom/geomclass.h: free-list fix. * src/lib/gprim/geom/bsptree.c, src/lib/mg/opengl/mgopengldraw.c: Fix a compiler warning. * src/lib/mib/Makefile.am: Use X_CFLAGS for the proper location of the X11-headers. * src/lib/oogl/util/malloc-debug.c: Only use malloc.h and mallinfo() when found by configure. * src/lib/shade/image.c: compressBound() is not always available, replace by a macro in that case. * src/lib/geometry/hpointn/hpointn.h, src/lib/geometry/transformn/transformn.h, src/lib/oogl/util/freelist.h: Fix w.r.t. to local/extern/declaration only free-lists. * src/lib/geometry/hpoint3/Makefile.am, src/lib/geometry/hpointn/Makefile.am: Do not create empty archives. * src/bin/geomview/x11/Makefile.am, src/bin/labeler/Makefile.am, src/lib/mg/x11/Makefile.am: Use X_CFLAGS; on older systems the X11 headers are still below X11R6/include/ * configure.ac: Do not try to generate empty archives, this is not supported on all platforms. Check for compressBound() if zlib is found (then it is pre-1.2.x). Check for malloc.h and mallinfo() (debugging only). * data/shaders/Makefile.am: Forgot to add .sdl files to clean-local: * configure.ac: AC_CHECK_TYPES takes a comma separated list. Gnah. Autoconf is really inconsistent. 2007-04-02 Claus-Justus Heine * src/bin/nose/nose.c: Fix the nose emodule; need to use IOBFILEs not FILEs. * src/bin/example/.cvsignore, src/bin/labeler/.cvsignore: Ignore .geomview. * src/bin/example/Makefile.am: Typo. * src/bin/geomview/common/event.c: Keyboard short-cuts for help browsers (html/pdf). * src/bin/NDview/Makefile.am: EXTRA_DIST was doubly defined. 2007-04-01 Claus-Justus Heine * doc/geomview.texi: Finish the docs for (ui-html-browser ......... * src/bin/geomview/common/help.c, Makefile.am, configure.ac, geomview.sh, src/Makefile.am, src/bin/geomview/common/Makefile.am, src/bin/geomview/common/ui.h, src/bin/geomview/geomview.1gv, src/bin/geomview/x11/gvmnpanel.c: Add a real "Help" button the the main-menu; the user manual may be viewed by external browsers (either PDF or HTML, browsers are configurable). * src/lib/oogl/lisp/lisp.c: Fix an ugliness. * doc/geomview.texi: Document (ui-html-browser...) and (ui-pdf-viewer...) configuration commands. * src/bin/geomview/x11/gvcredits.c, src/bin/geomview/x11/interface/Credits.mib: Convert the "credits" stuff into an "about" panel, add myself and the others from the README. * src/bin/geomview/x11/Makefile.am: Use %Y format for date, not %y. * src/lib/mib/mibload.c: Cosmetics. * src/bin/geomview/x11/gvcredits.c: Add myself. * src/bin/geomview/x11/gvui.c, src/bin/geomview/common/lang.c, src/bin/geomview/common/lang.h, src/bin/geomview/x11/gvmnpanel.c: Defined a (ui-motion ...) command to give access to the motion menu through GCL. * doc/geomview.texi, doc/version.texi: Document new (ui-motion...) GCL command. * src/bin/NDview/.cvsignore, src/bin/NDview/Makefile.am, src/bin/crayola/Makefile.am, src/bin/labeler/Makefile.am, src/bin/ndutils/.cvsignore, src/bin/ndutils/Makefile.am: --enable-[local-emodule,geomview-query] support. * src/bin/flythrough/.cvsignore, src/bin/ginsu/.cvsignore, src/bin/graffiti/.cvsignore, src/bin/hinge/.cvsignore, src/bin/stereo/.cvsignore, src/bin/sweep/.cvsignore, src/bin/tackdown/.cvsignore, src/bin/transformer/.cvsignore: Ignore .geomview. * src/bin/hinge/Makefile.am: Typo. * src/bin/cplxview/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am: Support the --enable-[local-emodule,geomview-query] switches. * data/Makefile.am: Move Hinge... objects to gvemodules-xforms * data/geom/HingeCube, data/geom/HingeDiamond, data/geom/HingeDodec, data/geom/HingeLongcube, data/geom/HingeTetra, data/geom/HingeTriangle: Moved to gvemodules-xforms/src/hinge/ * src/bin/example/Makefile.am: Changes w.r.t. to template-like automake stuff. * src/bin/example/Makefile.am: Use abs_builddir as path to the executable for the local .geomview emodule definition. * src/bin/crayola/Makefile.am: Generate .geomview for local testing (without the need to install the stuff). * src/bin/crayola/.cvsignore: Ignore .geomview. * m4/geomview.m4: Fix help text (kill reference to "example" emodule). * src/lib/gprim/geom/Makefile.am: bsptree.c needs the correct path to the glu.h header file 'cause it is using the GLU tesselator for complicated polygons. 2007-03-24 Claus-Justus Heine * NEWS, doc/geomview.texi: Docment most recent translucency progress (by means of the GLU tesselator). * src/lib/gprim/geom/bsptree.c: Use a very large floating point tolerance (1e-3). This still seems to give good results in most cases, and prevents consumption of tremendous amounts of memory for translucent ND-objects and for Adrian's fancy self-intersecting polygons. * src/lib/gprim/geom/bsptreeP.h, src/lib/gprim/geom/draw.c, src/lib/gprim/geom/geomclass.h, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quaddraw.c: Various ND-viewing translucency fixes; the stuff was broken again. Gnah. * src/lib/oogl/util/dbllist.h: New function DblListMove(): move the entire list from one head to another (this implies adjusting the back pointers to the list head as well 'cause it is a doubly linked list). * src/lib/mg/common/mg.c: Fix of a very silly beginners bug. What a shame. 2007-03-23 Claus-Justus Heine * src/lib/mg/opengl/mgopengldraw.c: Clean up of the "tricky" polygon code. * src/lib/gprim/geom/bsptree.c: Give the GLU tesselator the (already computed) normal. * src/lib/gprim/geom/bsptree.c: Use the GLU tesselator for non-convex quadrilaterals and for all polygons with more than 4 vertices. Should still need some performance tuning (e.g. we should pass the polygon normal to the tesselator etc.) * src/lib/gprim/geom/bsptree.c: Untested "#if 0"ed GLU tesselation for non-convex or non-flat polygons. * configure.ac, src/lib/gprim/geom/bsptree.c, src/lib/mg/opengl/mgopengldraw.c: Define HAVE_LIBGLU is that library is actually there, only compile trickypolygon() if GLU is found. The stuff still needs cleanup. The first attempt at the combine callback was really incomplete (textures, colors etc); and it could probably be sped up a little bit. First attempts to use the GLU tesselator for the BSP-tree stuff. * src/lib/gprim/discgrp/Makefile.am, src/lib/gprim/discgrp/discgrp.5gv: Resurrect the discgrp manual page. * data/NDview/cplxview/.cvsignore, data/NDview/cplxview/Makefile.am: Compose an cplxview emodule. * data/Makefile.am: Move cplxviewdata to that module. * data/NDview/.cvsignore, data/NDview/Makefile.am: Move NDview data to the nd-view module where it belongs to. * src/bin/nose/Makefile.am: Typos. * data/Makefile.am: Move NDview data to NDview module where it belongs to. * configure.ac: Get rid of "foreign" automake flag. * README, configure.ac, src/bin/Makefile.am: Add nose emodule. * src/bin/geomutil/math2oogl/Makefile.am: Add man-page to EXTRA_DIST. * src/bin/nose/.cvsignore, src/bin/nose/Makefile.am, src/bin/nose/nose.1gv, src/bin/nose/nose.c: Nose module / example, debugging for picking. * m4/check-package.m4, m4/geomview.m4: Writing autoconf test is really a little bit complicated ... * m4/geomview.m4: Check also in standard places for geomview include files. 2007-03-22 Claus-Justus Heine * doc/geomview.texi, doc/version.texi: Version bumped to 1.9.0 * src/lib/geomutil/Makefile.am, src/lib/geomutil/bdy/Makefile.am, src/lib/geomutil/plutil/Makefile.am, src/lib/oogl/wa/Makefile.am: Man-page move (NR -> NRgv). * doc/Makefile.am: Man page update. * doc/gvplot.txt: This really is README.gvplot. * src/lib/Makefile.am: Versioning. * src/bin/togeomview/Makefile.am, doc/geomview.5gv, doc/lisp.3gv, doc/oogl.5gv, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am, src/bin/example/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/geomutil/bdy/Makefile.am, src/bin/geomutil/clip/Makefile.am, src/bin/geomutil/hvectext/Makefile.am, src/bin/geomutil/oogl2rib/Makefile.am, src/bin/geomutil/oogl2vrml/Makefile.am, src/bin/geomutil/plutil/Makefile.am, src/bin/geomutil/ucd/Makefile.am, src/bin/geomutil/vrml2oogl/Makefile.am, src/bin/geomview/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/sweep/Makefile.am, doc/Makefile.am, src/bin/animate/Makefile.am, src/bin/cplxview/Makefile.am, src/bin/crayola/Makefile.am, src/lib/geomutil/bdy/bdy.3gv, src/lib/geomutil/plutil/anytopl.3gv, src/lib/geomutil/plutil/plcombine.3gv, src/lib/geomutil/plutil/plconsol.3gv, src/lib/oogl/wa/fsaparse.3gv, src/bin/geomview/geomview.1gv, src/bin/ginsu/ginsu.1gv, src/bin/graffiti/graffiti.1gv, src/bin/hinge/hinge.1gv, src/bin/sweep/sweep.1gv, src/bin/sweep/sweep.3gv, src/bin/tackdown/tackdown.1gv, src/bin/togeomview/togeomview.1gv, src/bin/transformer/transformer.1gv, src/lib/geomutil/geomutil.3gv, src/bin/geomutil/clip/clip.1gv, src/bin/geomutil/hvectext/hvectext.1gv, src/bin/geomutil/math2oogl/OOGL.m.txt, src/bin/geomutil/math2oogl/math2oogl.1gv, src/bin/geomutil/oogl2rib/oogl2rib.1gv, src/bin/geomutil/oogl2vrml/oogl2vrml.1gv, src/bin/geomutil/plutil/anytooff.1gv, src/bin/geomutil/plutil/bez2mesh.1gv, src/bin/geomutil/plutil/offconsol.1gv, src/bin/geomutil/plutil/polymerge.1gv, src/bin/geomutil/ucd/anytoucd.1gv, src/bin/geomutil/ucd/ucdtooff.1gv, src/bin/geomutil/vrml2oogl/vrml2oogl.1gv, src/bin/animate/animate.1gv, src/bin/cplxview/cplxview.1gv, src/bin/crayola/crayola.1gv, src/bin/example/example.1gv, src/bin/flythrough/flythrough.1gv, src/bin/geomutil/bdy/bdy.1gv, src/lib/geomutil/bdy/bdy.3, src/lib/geomutil/plutil/anytopl.3, src/lib/geomutil/plutil/plcombine.3, src/lib/geomutil/plutil/plconsol.3, src/lib/oogl/wa/fsaparse.3, src/lib/geomutil/geomutil.3, src/bin/tackdown/tackdown.1, src/bin/togeomview/togeomview.1, src/bin/transformer/transformer.1, src/bin/geomview/geomview.1, src/bin/ginsu/ginsu.1, src/bin/graffiti/graffiti.1, src/bin/hinge/hinge.1, src/bin/sweep/sweep.1, src/bin/sweep/sweep.3, src/bin/geomutil/plutil/bez2mesh.1, src/bin/geomutil/plutil/offconsol.1, src/bin/geomutil/plutil/polymerge.1, src/bin/geomutil/ucd/anytoucd.1, src/bin/geomutil/ucd/ucdtooff.1, src/bin/geomutil/vrml2oogl/vrml2oogl.1, src/bin/geomutil/oogl2rib/oogl2rib.1, src/bin/geomutil/oogl2vrml/oogl2vrml.1, src/bin/geomutil/plutil/anytooff.1, src/bin/geomutil/hvectext/hvectext.1, src/bin/geomutil/maple2oogl/Makefile.am, src/bin/geomutil/math2oogl/Makefile.am, src/bin/geomutil/math2oogl/math2oogl.1, src/bin/geomutil/bdy/bdy.1, src/bin/geomutil/clip/clip.1, src/bin/flythrough/flythrough.1, src/bin/example/example.1, src/bin/cplxview/cplxview.1, src/bin/crayola/crayola.1, doc/oogl.5, src/bin/animate/animate.1, doc/geomview.5, doc/lisp.3: Give all manual pages a gv suffix, some of the names are just too short. * doc/README.gvplot: Initial revision. * .cvsignore: Blah. * src/lib/Makefile.am: Versioning. * doc/version.texi: Update. * doc/Makefile.am: Use globally defined docdir. * README: Update. * configure.ac: No longer use /usr/local/Geomview/ as default prefix. * NEWS: Update. * m4/geomview.m4: Fix version check. Move most of the generic autoconf initialization to the GV_INIT_GEOMVIEW() macro. * NEWS, configure.ac: Call the beast 1.9.0 * m4/geomview.m4: Small fixes (check for -lm, math.h, other minor stuff). * m4/geomview.m4, m4/set-prefix.m4: Some fine-tuning * src/bin/example/Makefile.am: Emodule definition stuff. * README: Cosmetics. * geomview.sh: Add $HOME to the search path for emodule definitions. * data/shaders/Makefile.am: Add blue-moon compiled shaders to EXTRA_DIST. * src/lib/oogl/util/Makefile.am: Add freelist.h to sources. * m4/geomview.m4: Feature local installation. * m4/check-package.m4, m4/geomview.m4, src/bin/example/Makefile.am: Autoconf madness. * src/bin/cplxview/Makefile.am, src/bin/example/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am: Separate emodules, using xforms library. * src/bin/crayola/Makefile.am: Add man-pages to EXTRA_DIST. * configure.ac, src/bin/Makefile.am: Move xforms modules and Tcl/Tk modules to the separate packages gvemod-ndview gvemodules-xforms gvemodules-tcltk * src/bin/crayola/Makefile.am, src/bin/labeler/Makefile.am: External gvemodules-xforms and gvemodules-tcltk packages. 2007-03-21 Claus-Justus Heine * src/bin/NDview/Makefile.am, src/bin/ndutils/Makefile.am: Emodule strip-off should be finished now. * src/bin/ndutils/GeomExtentDirection.c: Cosmetics. * Makefile.am: Also install the private header files to enable stripping off emodules into separate package; private header files go to PKGINCLUDEDIR/private/ * src/bin/Makefile.am: Remove NDview and ndutils, moved to a separate package. * doc/geomview.texi: Add some more cross-references for GCL commands. * doc/geomview.texi: Convert the GCL reference into subsections; the stuff can now be referenced and there is a menu node for each command. * doc/geomview.texi: Cosmetics * doc/geomview.texi: Forgot a closing bracket. * doc/geomview.texi, doc/version.texi, src/bin/geomview/common/comm.c: New command (hdelete [type] name) which can be used to actually delete a named global handle. * src/lib/gprim/geom/delete.c, src/lib/oogl/refcomm/handle.c: HandleRefIterate(), HandlePoolIterate() were not safe w.r.t. to the deletion of handles. Fix that. * src/bin/geomview/common/comm.c: commandclose(): should we really keep Pools with command-language? ATM I'm calling PoolDelete(). Mmmh. * src/bin/geomview/common/worldio.c: Lwrite(): also delete the tempoaray pool. * src/bin/geomview/common/lang.c: Lwrite_handle(): don't forget to delete the temporary pool. * src/bin/geomview/common/drawer.c: Lwrite_comments(): also delete the temporary pool. What else. * src/bin/geomview/common/comm.c: Slight changes for reading from command strings. * src/lib/oogl/refcomm/streampool.c: HandleReferringTo(): accessing a handle via ": blahhandle" automatically converts "blahhandle" into a global one. PoolClose(): revert back to not deleting the closed Pool. But maybe we should get rid of all the opened emodule pools nevertheless ... * src/lib/oogl/refcomm/handleP.h: Move the list-node to the top of the structure; this way (hack!) we can use the double-list node for the free-list without overwriting the "deleted" tag. * src/lib/oogl/refcomm/handle.c: HandleCreateGlobal(): do not reset the attached object when converting a temporary handle to a permanent one. * src/lib/gprim/geom/geomstream.c: GeomInvokeTranslator(): do not forget to really delete the temporary pool. * src/bin/geomview/x11/gvsave.c: PoolClose() takes care of stdout/stdin for itself. * src/lib/gprim/discgrp/dgclass.c, src/lib/gprim/discgrp/dgcreate.c, src/lib/gprim/discgrp/dgstream.c, src/lib/gprim/discgrp/discgrp.h, src/lib/gprim/discgrp/discgrpP.h: Sanitize the handling of geom, camgeom, ddgeom and their associated handles. Define a Get() method, so maniview no longer needs to access private data-structures. * configure.ac, src/lib/oogl/util/porting.h: Should use AC_CHECK_DECLS() before defining proto-types. The mere fact the function does not exist as a symbol does not mean that it is not declared. * m4/geomview.m4: Use GeomGet()/GeomSet() instead of accessing private data-structures. Make sure the damn stuff compiles as external module, outside the Geomview source-tree. * m4/geomview.m4: Fix unbalanced if-fi * Makefile.am, configure.ac, data/shaders/Makefile.am, geomview.sh, m4/geomview.m4, src/Makefile.am: Build system fixes. * m4/geomview.m4: Optionally check for the version of Geomview. * src/bin/NDview/Makefile.am: Cosmetics. * m4/withtool.m4: CHECK_PROG/PATH_PROG duality. * m4/withtool.m4: Absolute/relative path-name support. 2007-03-20 Claus-Justus Heine * m4/withtool.m4, m4/geomview.m4: Initial revision. * src/lib/mg/opengl/mgopengldraw.c: Back-face culling cannot work with transparency, so disable it while drawing translucent facets. * src/lib/gprim/geom/geomclass.h, src/lib/gprim/inst/instcreate.c, src/lib/oogl/lisp/Makefile.am, src/lib/oogl/lisp/lisp.c, src/lib/oogl/refcomm/handle.c, src/lib/oogl/refcomm/streampool.c, src/lib/oogl/util/Headers, src/lib/oogl/util/freelist.h, src/bin/geomview/common/lispext.c, src/bin/geomview/common/lispext.h, src/lib/geometry/hpointn/hpointn.h, src/lib/geometry/ntransobj/ntransobj.c, src/lib/geometry/transformn/transformn.h, src/lib/geometry/transobj/transobj.c, src/lib/gprim/geom/delete.c: Implement a simplistic free-list approach for small objects which are allocated/deallocated very often. * src/lib/gprim/geom/bsptreeP.h, src/lib/gprim/geom/delete.c, src/lib/gprim/geom/draw.c, src/lib/gprim/geom/geomclass.h: Handle tagging of appearance and the necessary per-node data madness more efficiently (i.e. do _not_ allocate and check for per-node data if transparency is not enabled). * src/lib/mg/common/mgP.h: Cosmetics. * src/lib/shade/texture.c: TxMerge() did not correctly increase the ref.-count in all cases. * src/lib/oogl/util/ooglutil.h: Fix memory debug definitions. * src/lib/mg/common/mg.c: Don't forget to set ap->tx to NULL after calling TxDelete(). * src/lib/geometry/transobj/transobj.c: TransStreamIn(): TransObjStreamIn() can (successfully) return with an empty handle, in which case we must not try to access the (non-existing) TransObj. * src/bin/geomview/common/comm.c: TransObj handling had a memory leak. * src/bin/NDview/Makefile.am, src/bin/crayola/Makefile.am, src/bin/labeler/Makefile.am, src/bin/ndutils/Makefile.am, geomview.sh: Adjust environment variables in preparation for Orrery and maniview autoconf revision. * configure.ac: Fix debug malloc definitions. * configure.ac, data/shaders/Makefile.am: Check for shader compilers sdrc (Pixie) and shaderdl (3Delight). Luckily Aqsis, Pixie and 3Delight produce shader files with different suffixes. * data/shaders/GVblendconstant.sl, data/shaders/GVblendplastic.sl, data/shaders/GVdecalconstant.sl, data/shaders/GVdecalplastic.sl, data/shaders/GVmodulateconstant.sl, data/shaders/GVmodulateplastic.sl, data/shaders/GVreplaceconstant.sl, data/shaders/GVreplaceplastic.sl: Use texture(..., "width", 0.0); at least aqsis otherwise produces textures which are just overblurred. 2007-03-19 Claus-Justus Heine * doc/geomview.texi: Image object doc fixes. * src/lib/gprim/sphere/spherecreate.c: Typo (CR_SPHERETEX -> CR_SPHERETX) * src/lib/gprim/sphere/spherecreate.c: Undo previous commit. * src/lib/shade/image.c, src/lib/gprim/sphere/spherecreate.c: Fix handling of raw image data. * src/bin/geomutil/maple2oogl/README.gvplot, src/bin/geomutil/maple2oogl/gvplot.mapleV8, src/bin/geomutil/maple2oogl/gvplot.mws, src/bin/geomutil/maple2oogl/savegvplot.mws: Most documentation. * src/bin/geomview/common/drawer.h, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c, src/bin/geomview/common/transform.h, src/bin/geomview/common/drawer.c: ND-fixes. 2007-03-18 Claus-Justus Heine * configure.ac, doc/geomview.texi, doc/version.texi, src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezdice.c, src/lib/gprim/bezier/bezdraw.c, src/lib/gprim/bezier/bezierP.h, src/lib/gprim/bezier/bezload.c, src/lib/gprim/bezier/bezsave.c, src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/bsptreeP.h, src/lib/gprim/geom/geom.h, src/lib/gprim/geom/geomstream.c, src/lib/gprim/geom/iterate.c, src/lib/gprim/inst/instP.h, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instdraw.c, src/lib/gprim/mesh/meshP.h, src/lib/gprim/mesh/meshcopy.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshload.c, src/lib/gprim/mesh/meshsave.c, src/lib/gprim/ndmesh/ndmeshP.h, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshload.c, src/lib/gprim/ndmesh/ndmeshsave.c, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/nplsave.c, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/plsave.c, src/lib/gprim/polylist/polylistP.h, src/lib/gprim/sphere/sphereP.h, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/sphere/spheredice.c, src/lib/gprim/sphere/sphereload.c, src/lib/gprim/sphere/spheresave.c, src/lib/mg/common/mg.c, src/lib/mg/common/mg.h, src/lib/mg/common/mgP.h, src/lib/mg/opengl/mgopengl.c, src/lib/mg/opengl/mgopenglmesh.c, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/oogl/util/create.h, src/lib/shade/appearance.h: Support for textured spheres/define TxST structure + transforms, support for texture transform stacks. * src/bin/geomview/common/worldio.c: Comment/cosmetics. * Makefile.am: Use absolute path-names for build-dir geomview script. 2007-03-16 Claus-Justus Heine * src/lib/mg/opengl/mgopenglshade.c, src/lib/mg/ps/mgps.c, src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/x11/mgx11.c, src/lib/mg/buf/mgbuf.c, src/lib/mg/common/mg.c, src/lib/mg/common/mg.h, src/lib/mg/common/mgP.h, src/lib/mg/opengl/mgopengl.c: Prepare for texture transform stacks to support texturing of objects pasted together via INSTs and TLists. * src/lib/gprim/sphere/spherecreate.c: Compilation fix. * src/lib/gprim/sphere/sphereP.h: Get rid of a compiler warning. * doc/version.texi: This file should not be kept in the CVS. * src/lib/gprim/sphere/spherecreate.c: Start defining texture transformations. * src/lib/gprim/sphere/sphere.h, src/lib/gprim/sphere/sphereP.h, src/lib/gprim/sphere/sphereclass.c, src/lib/gprim/sphere/spherecreate.c, configure.ac, src/lib/gprim/sphere/Makefile.am: Optionally use a polar mesh for drawing spheres, should also make it much easier to define spheres with textures. * src/lib/gprim/bezier/bezdice.c: BSP-tree invalidation now done via call-back. * src/lib/gprim/sphere/spheredice.c, src/lib/gprim/sphere/spheredraw.c: Initial revision. * src/lib/mg/rib/mgribdraw.c: Fix textured beziers (up-side down issue). * src/lib/gprim/bezier/bezdice.c: Cosmetics. * src/lib/mg/opengl/mgopenglmesh.c: Turn-off texturing before drawing edges, otherwise at least GL_REPLACE leads to the wrong colors (for the edges). * src/bin/geomview/common/drawer.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/event.c, src/bin/geomview/common/lights.c, src/bin/geomview/common/rman.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c, src/bin/geomview/common/transform.h, src/bin/geomview/common/ui.h, src/bin/geomview/common/worldio.c: Try to be a little bit more consistent in the choice of data-types in some places. * src/lib/gprim/bezier/bezbound.c: Fix bbox for pdim == 4 with 3d drawing. * src/lib/shade/texture.c, src/lib/shade/appearance.h: tex->background really is only RGB, _not_ RGBA (see glTexEnvf(3)). * src/lib/shade/apstream.c, src/lib/shade/light.c: Use 8 digits for output of float. * src/lib/mg/opengl/mgopenglshade.c: mgopengl_needtexture(): always load tex->tfm, even if the texture in the cache is otherwise identical to the desired texture. * src/lib/mg/common/mgtexture.c: mg_same_texture(): tex->background is only relevant for tex->apply == blend. 2007-03-15 Claus-Justus Heine * src/lib/gprim/sphere/spherecreate.c: Cosmetics. * src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.c, src/lib/mg/rib/mgribtoken.h: Debugging, correctly draw flat shaded stuff (i.e. emit per-vertex normals in this case). Shading logic was broken in mgribmesh.c and mgribdraw.c. Leave the texture clipping to RiMakeTexture(). Disable texture alpha-channel when transparency is not enabled (exception GL_BLEND, cause the the alpha channel of the texture only influences the colouring, not the transparency). * doc/version.texi: Update, this file does not belong to the CVS. * data/shaders/GVblendconstant.sl, data/shaders/GVblendplastic.sl, data/shaders/GVdecalconstant.sl, data/shaders/GVmodulateconstant.sl, data/shaders/GVmodulateplastic.sl, data/shaders/GVreplaceplastic.sl, data/shaders/Makefile.am: Shader debugging, should work now, more or less. * data/shaders/GVreplaceconst.sl, data/shaders/GVreplaceconstant.sl: Renamed. * src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.c, src/lib/mg/rib/mgribtoken.h: Further progress with texture and alpha-aware shaders. * doc/version.texi: Update. This file should not be in the CVS. * data/shaders/GVblendplastic.sl, data/shaders/GVdecalplastic.sl, data/shaders/GVmodulateplastic.sl, data/shaders/GVreplaceplastic.sl: Fixed some silly bugs. We still need some shaders which ignore the alpha channel if transparency is enabled; or give all of them another float parameter which is used to switch off the alpha channel. 2007-03-14 Claus-Justus Heine * configure.ac: Check for aqsl, the aqsis shader language compiler. * data/shaders/.cvsignore: Ignore Makefile.in. * data/Makefile.am: Conditionally compile shader sources for the Aqsis renderer. * data/shaders/Makefile.am: Initial revision; conditionally compile shader sources for the Aqsis renderer. * src/lib/gprim/geom/geomclass.h, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/opengl/mgopenglmesh.c: Also honor the alpha channel provided by the texture. Do some restructering of mgopengl_bsptreerecursive(). * src/lib/shade/appearance.h: Comment stuff. * data/shaders/GVreplaceconst.sl, data/shaders/GVreplaceplastic.sl, data/shaders/GVblendconstant.sl, data/shaders/GVblendplastic.sl, data/shaders/GVdecalplastic.sl, data/shaders/GVmodulateconstant.sl, data/shaders/GVmodulateplastic.sl: Bring the stuff (hopefully) into accordance with the OpenGL docs (because this is what Geomview also uses). * src/bin/geomview/common/drawer.c, src/bin/geomview/common/transform.c: Hang the BSP-tree to dg->Lgeom, not dg->Item. Otherwise transformations would need special handling. * src/lib/mg/opengl/mgopenglP.h, src/lib/mg/opengl/mgopenglshade.c: Even for constantly shaded objects we should allow override of the alpha channel by material->diffuse[3]. Fix that. * src/lib/mg/opengl/mgopenglshade.c, src/lib/shade/appearance.h, src/lib/shade/texture.c: Implement "apply = replace" mode; texture color simply replaces the surface color. * data/shaders/rgbmaskpaintedconstant.sl, data/shaders/rgbmaskpaintedplastic.sl: Renamed * data/shaders/GVblendconstant.sl, data/shaders/GVblendplastic.sl, data/shaders/GVdecalconstant.sl, data/shaders/GVdecalplastic.sl, data/shaders/GVmodulateconstant.sl, data/shaders/GVmodulateplastic.sl: Initial revision. 2007-03-13 Claus-Justus Heine * doc/version.texi: Should not be in the CVS. * src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgrib.h, src/lib/mg/rib/mgribP.h, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.c, src/lib/mg/rib/mgribtoken.h: Texture stuff seems to work. We need some shaders to actually implement texturing the same way as the OpenGL backend is doing it. * src/lib/mg/buf/mgbuf.c, src/lib/mg/common/mg.c, src/lib/mg/common/mg.h, src/lib/mg/opengl/mgopengl.c, src/lib/mg/ps/mgps.c, src/lib/mg/x11/mgx11.c: mgctxset() has now a return value: -1 on error, 0 on success. * data/shaders/rgbapaintedconstant.sl, data/shaders/rgbmaskpaintedconstant.sl: Initial revision. * src/lib/mg/rib/mgrib.c: Comment. * doc/version.texi: Update. This file should not be in the CVS. * configure.ac: Provide PATH_MAX. * src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribP.h, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.c, src/lib/mg/rib/mgribtoken.h: Fiddle with texture stuff. * src/bin/geomview/common/rman.c: Undo a previous change. * src/lib/shade/image.c: Remove some unneeded variables. * data/shaders/rgbapaintedplastic.sl, data/shaders/rgbmaskpaintedplastic.sl, data/shaders/.cvsignore: Initial revision. 2007-03-12 Claus-Justus Heine * configure.ac, doc/geomview.texi, src/bin/geomview/common/rman.c, src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribP.h, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.c, src/lib/mg/rib/mgribtoken.h: Substantial progress in supporting textures with RenderMan. Not really complete yet. * src/lib/shade/appearance.h, src/lib/shade/image.c: New function ImgWriteFilter() to dump the image to disk through an external filter program (i.e. convert to tiff for RenderMan texture support). * configure.ac: Check for pamtotiff in anticipation of RenderMan texture support. * src/lib/shade/appearance.h, src/lib/shade/image.c: New globally defined functions ImgWritePGM() and ImgWritePNM(), in preparation for real RenderMan texture support. * doc/version.texi: Update. * src/lib/shade/image.c: Sanity checks for write_pmm/pgm. 2007-03-11 Claus-Justus Heine * src/lib/mg/rib/mgribmesh.c, src/lib/mg/rib/mgrib.c: Fix the (rudimentory) texture support. This really needs to be reworked. * src/lib/gprim/list/liststream.c: ListStreamOut(): Proper indent of inferior geometries. * src/lib/shade/image.c: Continue parsing, even if reading of specific channels fails. This increases the chance of skipping over broken binary data. * src/bin/geomview/common/worldio.c, src/lib/camera/camstream.c, src/lib/geometry/ntransobj/ntransobj.c, src/lib/geometry/transobj/transobj.c, src/lib/gprim/geom/geomstream.c, src/lib/gprim/inst/inststream.c, src/lib/gprim/list/listdraw.c, src/lib/gprim/list/liststream.c, src/lib/oogl/refcomm/handle.c, src/lib/oogl/refcomm/handle.h, src/lib/oogl/refcomm/handleP.h, src/lib/oogl/refcomm/streampool.c, src/lib/oogl/refcomm/streampool.h, src/lib/shade/appearance.c, src/lib/shade/appearance.h, src/lib/shade/apstream.c, src/lib/shade/image.c, src/lib/shade/light.c, src/lib/shade/material.c, src/lib/shade/texture.c: Dump handles as handles if possible (but take care to dump every referenced object also). ppath fix for lists. Formatting of StreamOut() (proper -- or at least better -- indentation where possible). * doc/geomview.texi: Bring command line switches in sync with the stuff acutally supported, add some notes about translucency. * src/lib/gprim/inst/instmisc.c: No need to free bsptree->tree when transforming an INST. * src/lib/gprim/geom/bsptreeP.h: Delete the no longer needed structure component geomflags. * src/bin/geomview/geomview.1: Move -noopengl explanation closer to the other "-no..." options. * doc/geomview.texi, doc/version.texi: Document new image OOGL object. 2007-03-10 Claus-Justus Heine * src/lib/gprim/geom/draw.c: Undo faulty optimizations. Gnah. * src/lib/gprim/geom/geomclass.h: Protect GeomNodeDataByPath() and GeomNodeDataCreate() against an undefined (NULL) object path. * src/lib/camera/camera.c: Use the same bgcolor default as the GUI. * src/bin/geomview/common/main.c: Use 1.0/3.0 and leave it to the comiler to generate the best approximation ... * doc/geomview.texi, doc/version.texi: Start update of docs. * src/lib/shade/texture.c, src/lib/window/winstream.c, src/bin/geomview/common/comm.c, src/bin/geomview/common/lang.c, src/lib/gprim/bezier/bezdice.c, src/lib/gprim/geom/draw.c, src/lib/gprim/geom/geomclass.h, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/quad/quaddraw.c, src/lib/shade/image.c: Get rid of some compiler warnings. * doc/Makefile.am: Install man-pages. * src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/draw.c: Tagged appearance logic was somewhat broken. * doc/Makefile.am: Remove geomview.1, oogl.5.man and geomview.5.man. * doc/geomview.1: generated from (and in) src/bin/geomview/ * doc/oogl.5.man: Just a duplicate of oogl.5 * doc/geomview.5.man: Just a duplicate of geomview.5 * src/bin/geomview/x11/gvcamui.c: ui_ppmglxsnapshot(): get rid of some unused variables. * src/lib/camera/camstream.c, src/lib/gprim/geom/geomstream.c, src/lib/window/winstream.c: Cleanup and unification w.r.t. to Handles; applies also to all other xxxStreamIn() routines. * src/lib/camera/camera.c: Handle handling cleanup, was maybe unnecessary, but the current code works. Also: A camera now (optionally) has a background image and a background color. IMHO those things do not belong to the mg-layer. It is questionabble, though, whether stuff like this belongs to the camera. * src/lib/camera/camera.h: New atributes: CAM_BGCOLOR, CAM_BGIMAGE, CAM_BGIMGHANDLE. A camera now (optionally) has a background image and a background color. IMHO those things do not belong to the mg-layer. It is questionabble, though, whether stuff like this belongs to the camera. * src/lib/camera/cameraP.h: A camera now (optionally) has a background image and a background color. IMHO those things do not belong to the mg-layer. It is questionabble, though, whether stuff like this belongs to the camera. * src/lib/window/window.c: Ref->handle has been replaced by a list of handles and is properly handled in RefInit() now. * src/lib/window/windowP.h: Get rid of the silly "long" data type. * src/lib/gprim/inst/instdraw.c, src/lib/gprim/list/listdraw.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quaddraw.c: BSP-tree cleanup: properly handle the case that a geometry can belong to several nodes in the object hierarchy (referenced through handles). * src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezdice.c, src/lib/gprim/bezier/bezdraw.c, src/lib/gprim/bezier/bezierP.h: Use a Handle to define callbacks for invalidating BSP-trees. The issue is that a geometry can belong to several nodes in the object hierarchy when it is referenced by handles, and hence can belong to several BSP-trees, and may have to be entered more than once to the same BSP-tree (with a different position or appearance). * src/lib/gprim/inst/instP.h, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/inststream.c, src/lib/gprim/list/listP.h, src/lib/gprim/list/listcreate.c, src/lib/gprim/list/liststream.c: BSP-tree cleanup: can now live again with the standard HandleUpdRef() callback. * src/lib/gprim/inst/instmisc.c: Transform[To](): installed a 3d transform now leaves any ND-transform alone and vice-versa. Needed to allow for simplification in the top-level ND-drawing code in really_draw_view()@src/bin/geomview/common/drawer.c * src/lib/gprim/polylist/plcreate.c: PolyListCreate(): always delete the temporary projected polylist used to speed up ND-drawing. * src/lib/gprim/polylist/plcopy.c, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/polylistP.h: ND-drawing: allocate on demand an additional polylist; it is not necessary and inefficient to copy over the structure of the polylist on every draw. This way it has to be done only once. * src/lib/gprim/polylist/plsphere.c: Treat VERT_4D pl's as projective things in 3d. * src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/npolylist/nplcreate.c, src/lib/gprim/polylist/plcreate.c: BSPTree alloc/dealloc is done at a higher level now. * src/lib/gprim/mesh/meshcopy.c: Ansification. * src/bin/geomview/common/worldio.c, src/bin/geomview/common/space.c: Cosmetics. * src/bin/geomview/common/main.c: Remove unnecessary handle ops external declaration. * src/bin/geomview/common/comm.c: Image and appearance objects. Handle ref-count related fixes. * src/bin/geomview/common/lang.c, src/bin/geomview/common/lang.h, src/bin/geomview/common/lispext.c, src/bin/geomview/common/lispext.h: Image and appearance objects. * src/bin/geomview/common/drawer.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/ndshade.c, src/bin/geomview/common/transform.c: internal ND-view simplification * src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/bsptree.h, src/lib/gprim/geom/bsptreeP.h, src/lib/gprim/geom/copy.c, src/lib/gprim/geom/create.c, src/lib/gprim/geom/delete.c, src/lib/gprim/geom/draw.c, src/lib/gprim/geom/geom.h, src/lib/gprim/geom/geomclass.h: BSP-tree stuff was broken: as geometries can be referenced by handles we need to take special precaution when attaching global data to geoms. * src/lib/oogl/util/Makefile.am, src/lib/oogl/util/Headers: Add dbllist.h header. * src/lib/oogl/util/ppopen.c: Program flow logic was broken. Fix that. * src/lib/oogl/util/create.h: Delete unused CR_HANDLE attribute. * src/lib/shade/Makefile.am, src/lib/shade/appearance.c, src/lib/shade/appearance.h, src/lib/shade/apstream.c: Strip off texture and material stuff. Allow defining global handles for appearances. * src/lib/geometry/ntransobj/ntransobj.c, src/lib/geometry/ntransobj/ntransobj.h, src/lib/geometry/transobj/transobj.c, src/lib/geometry/transobj/transobj.h, src/lib/oogl/refcomm/Makefile.am, src/lib/oogl/refcomm/handle.c, src/lib/oogl/refcomm/handle.h, src/lib/oogl/refcomm/handleP.h, src/lib/oogl/refcomm/reference.c, src/lib/oogl/refcomm/reference.h, src/lib/oogl/refcomm/streampool.c, src/lib/oogl/refcomm/streampool.h: Fix the deeply broken handle reference count stuff. Gnah. * src/lib/geometry/transform3/transform3.h: Cosmetics. 2007-03-09 Claus-Justus Heine * src/lib/gprim/bezier/bezbound.c, src/lib/gprim/inst/instbound.c, src/lib/gprim/mesh/meshbound.c, src/lib/gprim/polylist/plbound.c, src/lib/gprim/quad/quadbound.c, src/lib/gprim/skel/skelbound.c, src/lib/gprim/vect/vectbound.c: Handle VERT_4D co-ordinates as homogeneous coords if no ND-transform is given. * src/lib/mg/common/mg.c, src/lib/mg/common/mgP.h, src/lib/mg/common/mgtexture.c, src/lib/mg/opengl/mgopengl.c, src/lib/mg/opengl/mgopenglP.h, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/opengl/mgopenglshade.c: Texture cleanup and some translucency changes. * src/lib/mg/buf/mgbufdraw.c, src/lib/mg/ps/mgpsdraw.c, src/lib/mg/x11/mgx11draw.c: Copy with numerical instabilities which everting normals. * src/lib/mg/common/mg.h: Add a pointer to the current BSP-tree to mgNDctx, part of a larger BSP-tree cleanup. * src/lib/mg/rib/mgrib.c, src/lib/mg/x11/mgx11.c, src/lib/mg/buf/mgbuf.c: Return the new ap. There is just no point in returning the user specified ap pointer. * src/lib/gprim/comment/commentstream.c: Get rid of just another memory leak. * src/lib/gprim/comment/commentcreate.c: Cosmetics. * src/lib/geometry/transform3/tm3print.c: Change the output format. * src/lib/geometry/transformn/transformn.h: Slight changes, typos mostly. * src/lib/geometry/hpointn/hpointn.h: Typo. * src/lib/geometry/hpoint3/hpoint3.h: Support for denormalized linear combination. * src/lib/Makefile.am: link (optionally) with libz * configure.ac: false/true/bool definition. Also (optionally) check for zlib/bzlib. * src/lib/oogl/util/malloc-debug.c: Fix alloc size accounting. * src/lib/oogl/util/iobfutil.c, src/lib/oogl/util/iobuffer.h: Fix iobfcontext(); syntax error messages should work again now. * src/lib/shade/image.c, src/lib/shade/material.c, src/lib/shade/texture.c, src/lib/oogl/util/dbllist.h: Initial revision. 2007-02-19 Claus-Justus Heine * src/lib/mg/common/mgtexture.c: Add pngtopnm filter. 2007-02-17 Claus-Justus Heine * src/lib/mg/opengl/mgopengldraw.c: Merge Adrian Rossiter's changes for concave and self-intersecting polygons. 2007-02-16 Claus-Justus Heine * src/lib/mg/opengl/mgopenglshade.c, src/lib/mg/opengl/mgopengl.c, src/lib/mg/opengl/mgopengldraw.c: Fix logic concerning alpha blending. * src/lib/gprim/inst/instdraw.c: BSP-tree fixes. * src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/bsptreeP.h, src/lib/gprim/mesh/meshdraw.c: Change BSPTreePushAppearance(): appearances are only set when geom->ap_tagged != NULL. * src/lib/mg/common/mgtexture.c: Remove a crazy comment. * src/lib/shade/appearance.c: TxStreamOut(): fix file: -> alphafile bug. * src/bin/geomview/x11/gvcamui.c: Some cleanup w.r.t. to the logic of gv_no_opengl and the pre-processor symbols MGGL, MGOPENGL and MGX11. Also, `#define' gv_no_opengl to `true' if !(MGGL || MGOPENGL) to simplify some of the gv_no_opengl/MG... related conditionals. * src/lib/mg/common/mg.c: mg_untagappearance(): Only delete texture and light if the appearance slot is not currently in use; delete astk->texture, not ctx->astk->texture (copy and paste bug). * src/bin/geomview/x11/gvcamui.c: Remove and/or document some slightly confusing preprocessor constructs. * src/lib/gprim/inst/instdraw.c: Fix a BSP-tree related bug: do not loop over the transformation if when not adding to the tree, but just distributing the tree-handle to all sub-geometries (when running InstBSPTree(..., action = BSPTREE_CREATE), in contrast to action == BSPTREE_ADDGEOM). * configure.ac: Disable OSMesa because it just does not work, unluckily. 2007-02-15 Claus-Justus Heine * src/lib/mg/common/mgtexture.c: Support bzip2 for compression of texture files. * src/bin/NDview/NDdemo, src/bin/NDview/NDview: Remove invalid script interpreter * configure.ac: Get rid of the CONFIG_SUBDIR stuff. * configure.ac, src/bin/geomview/x11/gvcamui.c, src/bin/geomview/x11/gvsave.c, src/bin/geomview/x11/interface/Save.mib: Implement a GLX off-screen snapshot by rendering into a GLX pixmap. The idea is that off-screen rendering does not suffer from partially obscured windows, screen-saver etc. * configure.ac: Gnah. Should read twice through my changes before committing. * configure.ac: Should check for glXAllocateMemoryMESA() not GLX_MESA_allocate_memory. * configure.ac, src/bin/geomview/x11/gvcamui.c, src/bin/geomview/x11/gvsave.c, src/bin/geomview/x11/interface/Save.mib: Check for libOSMesa if we are using Mesa and re-enable ppmmesasnapshot() in gvcamui.c 2007-02-14 Claus-Justus Heine * src/lib/oogl/wa/wa.lex.c, src/lib/oogl/wa/wa.yacc.c, src/lib/oogl/wa/wa.yacc.h: Auto-generated. * src/lib/oogl/wa/Makefile.am: Split-out rule for lex.yy.c, otherwise a dependency for "all:" cannot be resolved. * src/bin/geomview/common/main.c, src/bin/geomview/common/main.h, src/bin/geomview/geomview.1, src/bin/geomview/x11/gvcamui.c, src/bin/geomview/x11/gvmain.c: Implement a -noopengl option. * Makefile.am, geomview.sh: --print-BLAH switches to figure out the location of the data directory etc. of an already installed geomview. * configure.ac: Cosmetics (some help strings and such). * src/lib/mg/common/mgtexture.c: Cosmetics. 2007-02-13 Claus-Justus Heine * src/lib/gprim/geom/geomstream.c: Get rid of the infamous "can't seek back for enough (on pipe?)" error message because it is no longer adequate and misleading. * src/lib/mg/rib/mgribdraw.c: Cosmetics. * src/lib/mg/opengl/mgopenglshade.c: Do the obvious fixes for tex_adequate(). * src/lib/mg/opengl/mgopengldraw.c: Fix texture handling during BSP-tree traversal. * doc/version.texi, doc/geomview.texi: Document "linear" texture option. * src/lib/gprim/geom/bsptree.c: Hack around round-off error w.r.t. to plane equations. * src/lib/gprim/list/listcreate.c: cosmetics. * src/lib/mg/common/mg.c: Fix lazy deletion of sticky (tagged) appearances. * src/lib/oogl/refcomm/handle.c: Cosmetics. * src/lib/mg/opengl/mgopenglmesh.c: Braces around && inside ||. * src/lib/gprim/mesh/meshtransform.c, src/lib/gprim/polylist/pltransform.c, src/lib/gprim/quad/quadtransform.c: Handle NormalTransform() correctly. * src/lib/gprim/inst/instP.h, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instdraw.c, src/lib/gprim/inst/inststream.c, src/lib/gprim/list/listP.h, src/lib/gprim/list/listcreate.c, src/lib/gprim/list/liststream.c: Invalidate the BSP-tree if any object underlying a handle changes. * src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/bsptreeP.h: Handle NormalTransform() correctly (i.e. use the dual of T). * src/lib/gprim/geom/replace.c: Call BSPTreeFreeTree(). * src/lib/gprim/bezier/bezdraw.c: Cleanup. * src/lib/geometry/transobj/transobj.c, src/lib/geometry/transform3/tm3adjoint.c, src/lib/geometry/transform3/tm3dual.c, src/lib/geometry/transform3/tm3invert.c: Cosmetics. * src/lib/geometry/point3/point3.h: Simplify NormalTransform(), add a comment stating that NormalTransform(Tdual, ...) should be called with the dual of T. * src/lib/geometry/ntransobj/ntransobj.c: Cosmetics. 2007-02-12 Claus-Justus Heine * src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/delete.c, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instmisc.c, src/lib/gprim/list/listcreate.c, src/lib/gprim/mesh/meshdelete.c, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/quad/quaddelete.c: Move deletion of BSP-trees to GeomDelete(). 2007-02-10 Claus-Justus Heine * m4/lf_local.m4: Hopefully LF_LINK_HEADERS() works _NOW_ for in-path and VPATH builds. * m4/lf_local.m4: Undo a bug introduced previously by myself. 2007-02-09 Claus-Justus Heine * src/lib/gprim/ndmesh/ndmeshclass.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/nplclass.c, src/lib/gprim/npolylist/npldraw.c: Implement BSP-tree stuff for ND objects. Not tested. Needs testing. * src/lib/gprim/mesh/meshcreate.c: nu*nv, not nu+nv, fixing myself. * src/bin/geomview/common/drawer.c: Give every object accesible through the browser a BSP-tree. Transluceny is now correctly implemented for OpenGL (and RMAN, of course, as RMAN handles translucency by itself). Supported is a single translucent compound object (like the list of SaVI's coverage cones) which is drawn on a solid scene consisting of arbitrarily many objects. * src/bin/geomview/common/rman.c, src/bin/geomview/common/worldio.c: Small changes w.r.t. to unneeded (?FIXME) appearance copies * src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/bezier/bezbound.c, src/lib/gprim/bezier/bezclass.c, src/lib/gprim/bezier/bezdice.c, src/lib/gprim/bezier/bezdraw.c, src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/bsptree.h, src/lib/gprim/geom/bsptreeP.h, src/lib/gprim/geom/create.c, src/lib/gprim/geom/dice.c, src/lib/gprim/geom/draw.c, src/lib/gprim/geom/geom.h, src/lib/gprim/geom/geomclass.h, src/lib/gprim/inst/inst.h, src/lib/gprim/inst/instclass.c, src/lib/gprim/inst/instdraw.c, src/lib/gprim/list/listP.h, src/lib/gprim/list/listclass.c, src/lib/gprim/list/listdraw.c, src/lib/gprim/mesh/mesh.h, src/lib/gprim/mesh/meshclass.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/mesh/meshevert.c, src/lib/gprim/polylist/plclass.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quad.h, src/lib/gprim/quad/quadclass.c: Support BSP-trees consisting of multiple geoms. * src/lib/oogl/refcomm/reference.c: The reference count should be an int, not a long. * src/lib/mg/buf/mgbuf.c, src/lib/mg/buf/mgbufdraw.c, src/lib/mg/common/mg.c, src/lib/mg/common/mg.h, src/lib/mg/common/mgP.h, src/lib/mg/opengl/mgopengl.c, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/opengl/mgopenglmesh.c, src/lib/mg/opengl/mgopenglshade.c, src/lib/mg/ps/mgps.c, src/lib/mg/ps/mgpsdraw.c, src/lib/mg/ps/mgpswindows.c, src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/x11/mgx11.c, src/lib/mg/x11/mgx11draw.c, src/lib/mg/x11/mgx11shade.c: Introduce a "tagged" appearance which can safely be re-used while traversing a BSP-tree. Needed to implement BSP-trees for geoms consisting of multiple parts like lists and insts. * src/lib/gprim/sphere/spherecreate.c: Run GeomDecorate() to have the chance to define a sphere with an attached appearance. * src/lib/camera/cameraP.h, src/lib/geometry/geomtypes.h, src/lib/geometry/ntransobj/ntransobj.h, src/lib/geometry/transobj/transobj.h: Remove the semicolon from the end of REFERENCEFIELDS, just looks more natural when defining a derived "class". * src/lib/shade/appearance.c, src/lib/shade/appearance.h: Remove the semicolon from the end of REFERENCEFIELDS, just looks more natural when defining a derived "class". Introducde some "const" keywords in some places. * src/lib/window/windowP.h, src/lib/oogl/refcomm/handleP.h, src/lib/oogl/refcomm/reference.h: Remove the semicolon from the end of REFERENCEFIELDS, just looks more natural when defining a derived "class". * src/lib/pointlist/ptlMesh.c, src/lib/gprim/vect/vectP.h, src/lib/gprim/vect/vectcreate.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/vect/vectload.c, src/lib/gprim/vect/vectsphere.c, src/lib/gprim/quad/quadP.h, src/lib/gprim/quad/quadcopy.c, src/lib/gprim/quad/quadcreate.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/quad/quadload.c, src/lib/gprim/quad/quadnormal.c, src/lib/gprim/quad/quadsave.c, src/lib/gprim/quad/quadtransform.c, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/polylist/plevert.c, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/plnormal.c, src/lib/gprim/polylist/plsave.c, src/lib/gprim/polylist/pltransform.c, src/lib/gprim/polylist/polylist.h, src/lib/gprim/polylist/polylistP.h, src/lib/gprim/ndmesh/ndmeshP.h, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/ndmesh/ndmeshload.c, src/lib/gprim/ndmesh/ndmeshpick.c, src/lib/gprim/ndmesh/ndmeshsave.c, src/lib/gprim/npolylist/nplcreate.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/nplsave.c, src/lib/gprim/npolylist/npolylistP.h, src/lib/gprim/mesh/meshcopy.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshflag.h, src/lib/gprim/mesh/meshload.c, src/lib/gprim/mesh/meshnormal.c, src/lib/gprim/mesh/meshpick.c, src/lib/gprim/mesh/meshsave.c, src/lib/gprim/mesh/meshsphere.c, src/lib/gprim/mesh/meshtransform.c, src/lib/gprim/mesh/meshP.h, src/lib/gprim/bezier/bezier.h, src/lib/gprim/bezier/bezsphere.c, src/lib/gprim/bezier/bezsave.c, src/lib/gprim/bezier/bezpick.c, src/lib/gprim/bezier/bezload.c, src/lib/gprim/bezier/bezevert.c, src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezierP.h, src/lib/gprim/lincoln/lincolnload.c, src/lib/geomutil/plutil/anytopl.c, src/lib/geomutil/plutil/plcombine.c, src/lib/geomutil/crayplutil/crayBezier.c, src/lib/geomutil/crayplutil/crayMesh.c, src/lib/geomutil/crayplutil/crayPolylist.c, src/lib/geomutil/crayplutil/crayQuad.c, src/lib/geometry/cmodel/cmodel.c, src/bin/ndutils/GeomtoNoff.c, src/bin/ndutils/WithColor.c, src/bin/ndutils/clipoogl.c, src/bin/geomutil/ucd/anytoucd.c, src/bin/geomutil/oogl2vrml/oogl2vrml.c, src/bin/geomutil/oogl2vrml/oogl2vrml2.c, src/bin/geomutil/clip/clipoogl.c: Move some more flag values to geom->geomflags, kind of unification. 2007-02-04 Claus-Justus Heine * src/lib/gprim/bezier/bezbound.c: Treat VERT_4D bez's as homogeneous coords (undo my previous changes). 2007-01-29 Claus-Justus Heine * src/lib/aclib/obstack.c: Hack around exitfail and gettext, should compile now with cygwin. 2007-01-27 Claus-Justus Heine * src/lib/oogl/util/iobuffer.c: setmark()/seekmark() has to take the ungetc() value into account. 2007-01-21 Claus-Justus Heine * src/bin/geomview/common/drawer.c: Reset "center-bbox" feature at reset. 2007-01-20 Claus-Justus Heine * src/bin/geomview/common/transform.c: Comment. * src/lib/gprim/skel/skeldraw.c, src/lib/gprim/skel/skelload.c: Remove unused variable warnings. 2007-01-15 Claus-Justus Heine * configure.ac, doc/version.texi, src/lib/aclib/obstack.c: Include obstack.c from glibc-2.5; my fault, thought obstack was implemented as a pure macro stuff. 2007-01-14 Claus-Justus Heine * configure.ac: Use "foreing" automake option to prevent the latest and greatest automake from complaining about using GNU extensions. 2007-01-08 Claus-Justus Heine * doc/version.texi, src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelcreate.c, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/skel/skelload.c, src/lib/gprim/skel/skelsave.c, doc/geomview.texi: Allow per-vertex colors for SKEL filec, i.e. support a C[4][n]SKEL format. Document the change in the TeXInfo manual 2007-01-07 Claus-Justus Heine * src/lib/gprim/polylist/plnormal.c: New per-vertex normal computation was borken. 2007-01-06 Claus-Justus Heine * src/lib/gprim/geom/bsptree.c: SplitPolyNode(): v0 <-> v1 typo. 2007-01-04 Claus-Justus Heine * src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quaddelete.c, src/lib/gprim/quad/quaddraw.c: Remove some compiler warnings. * src/lib/gprim/polylist/plnormal.c: missing initialization bug (n_edges). 2007-01-03 Claus-Justus Heine * doc/geomview.texi, doc/version.texi: Fix VECT binary documentation bug and work around a figure cross-referencing bug in GNU makeinfo. 2007-01-02 Claus-Justus Heine * src/lib/gprim/geom/bsptree.c: Work around a strange "-fstrict-aliasing" comiler bug. At least I think it is a compiler bug ... 2006-12-28 Steve M. Robbins * ChangeLog, configure.ac: Fix probe for Tcl_CreateFileHandler to use ${TCL_ALL_LIB}, rather than "-ltcl". 2006-12-27 Steve M. Robbins * configure.ac: Use ${TCL_ALL_LIB}, not "-ltcl", to check for function Tcl_CreateFileHandler. 2006-11-05 Claus-Justus Heine * src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribP.h, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.c, src/lib/mg/rib/mgribtoken.h: Rudimentary texture support; also scale points s.t. they remain visible even at large distances. Use "ReverseOrientation" to prevent the renderer from inverting explicitly specified normals. * src/lib/mg/ps/mgpstri.c: Point-plotting was broken. * src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribP.h: Make sure Push/PopAppearance is not called outsde WorldBegin/WorldEnd * configure.ac: Bump version to rc10. * NEWS: Document ND changes. * doc/version.texi: Update. 2006-11-04 Claus-Justus Heine * doc/geomview.texi: Picking does work now with ND viewing, so remove the note saying otherwise from the documentation. * doc/figs/tools.ps: Use a half-size screenshot. * src/bin/geomview/common/transform.c: Cosmetics. * src/lib/gprim/ndmesh/Makefile.am, src/lib/gprim/ndmesh/ndmesh.h, src/lib/gprim/ndmesh/ndmeshclass.c, src/lib/gprim/ndmesh/ndmeshpick.c: Native "picking" for ND-meshes. * src/lib/gprim/ndmesh/ndmeshbound.c: Bail out if meshd > 2. * src/lib/gprim/npolylist/Makefile.am, src/lib/gprim/npolylist/nplclass.c, src/lib/gprim/npolylist/nplpick.c: Add "pick" support. * src/lib/gprim/skel/skelpick.c: Remove an unused variable. * src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelbound.c, src/lib/gprim/skel/skelpick.c: Pick support for SKEL, just clone the vect code (skelpick.c contains a code fragment which seemingly was meant as a draft; however, the VECT code works and really just naturally carries "itself" over to the SKEL case). * src/lib/gprim/skel/skelload.c: Fix a 3d bug caused by moving the homogeneous component to index 0 in ND. * src/lib/gprim/mesh/meshpick.c, src/lib/gprim/polylist/plpick.c, src/lib/gprim/quad/quadpick.c, src/lib/gprim/vect/vectpick.c: Rename NTransPt3() to HPt3NTransPt3(). * src/lib/geometry/hpointn/hpointn.c, src/lib/geometry/hpointn/hpointn.h: Rename NTransPt3() to HPt3NTransPt3(), new function HPtNNTransPt3(). * data/NDview/geom/klein4d.skel, data/geom/moebius.skel: Initial revision. * src/lib/gprim/quad/quadP.h, src/lib/gprim/quad/quadpick.c, src/lib/gprim/vect/vectP.h, src/lib/gprim/vect/vectpick.c: ND picking. * src/lib/gprim/geom/pick.c: Fix GenericPick() for ND picking. * src/lib/gprim/inst/instpick.c, src/lib/gprim/list/listpick.c: ND-pick support. * src/lib/gprim/npolylist/nplload.c: Homogeneous divisor sits at index 0 for ND vectors, fix that. * src/lib/gprim/polylist/plpick.c, src/lib/gprim/polylist/polylistP.h: ND-pick support. * src/lib/gprim/mesh/meshpick.c: Move some support functions to hpointn.c * src/lib/gprim/inst/instdraw.c: Cosmetics. * src/lib/geometry/hpointn/hpointn.c, src/lib/geometry/hpointn/hpointn.h: New functions NTransPt3() and HPt3NTransHPt3() to support ND-picking. * src/lib/geometry/hpoint3/hpoint3.c: Remove a stray hash. * src/bin/geomview/common/transform.c: Forgot to delete an HPointN temporary. 2006-11-03 Claus-Justus Heine * src/lib/geometry/hpoint3/hpoint3b.c: Remove a stray hash * src/lib/gprim/list/listpick.c, src/lib/gprim/polylist/plbound.c, src/lib/gprim/polylist/plpick.c, src/lib/gprim/polylist/polylistP.h, src/lib/gprim/quad/quadP.h, src/lib/gprim/quad/quadpick.c, src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelpick.c, src/lib/gprim/vect/vectP.h, src/lib/gprim/vect/vectpick.c, src/lib/gprim/bezier/bezier.h, src/lib/gprim/bezier/bezpick.c, src/lib/gprim/comment/commentclass.c, src/lib/gprim/discgrp/dgpick.c, src/lib/gprim/discgrp/discgrp.h, src/lib/gprim/discgrp/weeks_dirdom.c, src/lib/gprim/inst/instpick.c, src/lib/gprim/list/listP.h: Adapt to changed pick interface (ND-picking not yet working except for MESHes). * src/lib/gprim/mesh/mesh.h, src/lib/gprim/mesh/meshP.h, src/lib/gprim/mesh/meshpick.c: Support ND-picking. * src/bin/geomview/common/lights.c: Adapt to changed pick interface. * src/bin/geomview/common/event.c, src/lib/gprim/geom/geomclass.h, src/lib/gprim/geom/pick.c, src/lib/gprim/geom/pick.h, src/lib/gprim/geom/pickP.h: Support ND-picks. * src/bin/geomview/common/drawer.h, src/bin/geomview/common/transform.c: New function drawer_ND_CamView() which is the ND-equivalent for the CamView() function. Allow ND-picks in make-center_from_pick(). * src/lib/geometry/hpointn/hpointn.c, src/lib/geometry/hpointn/hpointn.h: Use HPoint3 parameter-type instead of HPt3Coord * for some Pt4...() stuff. * src/lib/geometry/hpoint3/hpoint3.c: Remove HPt3Transform(). * src/lib/aclib/Headers, src/lib/aclib/Makefile.am: Symlink the obstack.h header for use by (e.g.) ndutils. * src/bin/ndutils/ColorPoint.c, src/bin/ndutils/TransformGeom.c, src/bin/ndutils/WithColor.c: Remove some variable decl which are no longer needed. * src/bin/geomview/common/ui.h: Missing proto-type for set_ui_wm_focus(). * src/bin/geomview/common/ui.c: Need to include transform.h for make_center_from_bbox(). 2006-10-30 Claus-Justus Heine * src/bin/ndutils/Clip.h, src/bin/ndutils/clip.c, src/bin/ndutils/clipoogl.c, src/lib/aclib/obstack.h: Use an obstack to clean up after ND clipping. 2006-10-29 Claus-Justus Heine * src/bin/NDview/NDdemo, src/bin/NDview/NDview, src/bin/geomview/common/drawer.c, src/bin/geomview/common/motion.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c, src/bin/geomview/common/transform.h, src/bin/geomview/common/ui.c, src/bin/geomview/x11/gvtoolui.c, src/bin/geomview/x11/gvui.c, src/bin/geomview/x11/interface/Tool.mib, src/bin/gvclock/gvclock.in: The "origin/bbox-center" keyword to transform and transform-incr was a bad idea. There is still a new button in the Tools-menu which translates the CENTER object to the currently selected geom's bounding box. * src/bin/geomview/common/comm.c: Document ntransform keyword in online-help for (read ...) command. * src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/inststream.c: HandleRegister() needs &inst->NDaxis, not inst->NDaxis, otherwise inst->NDaxis (originally NULL) cannot be modified. * src/lib/gprim/inst/instdraw.c: Insert once-only warning message if somebody wants to use origin != NONE (i.e. LOCAL) with ND-drawing. * src/lib/gprim/bbox/bboxload.c: Handle 4d/Nd correctly. * src/bin/geomview/common/worldio.c: Document "ntransform" keyword in the online help. * doc/figs/tools.ps, doc/geomview.texi, doc/version.texi: Update the documentation to the latest changes. 2006-10-26 Claus-Justus Heine * src/bin/ndutils/GeomtoNoff.h, src/bin/ndutils/LoadMap.c, src/bin/ndutils/LoadMap.h, src/bin/ndutils/MakeGoodTransforms.c, src/bin/ndutils/MakeGoodTransforms.h, src/bin/ndutils/Makefile.am, src/bin/ndutils/Random.c, src/bin/ndutils/TransformGeom.c, src/bin/ndutils/TransformGeom.h, src/bin/ndutils/WithColor.c, src/bin/ndutils/WithColor.h, src/bin/ndutils/clip.c, src/bin/ndutils/clipoogl.c, src/bin/ndutils/init.c, src/bin/ndutils/init.h, src/bin/ndutils/slicer.c, src/bin/ndutils/slicer.h, src/bin/ndutils/snapshot.c, src/bin/ndutils/snapshot.h, src/bin/ndutils/testwish.c, src/bin/ndutils/wrappers.c, src/bin/ndutils/wrappers.h, data/NDview/cplxview/scripts/4d.cplx, data/NDview/cplxview/scripts/startup.script, data/NDview/scripts/4d.2bigwins, data/NDview/scripts/4d.3wins, data/NDview/scripts/4d.4wins, data/NDview/scripts/4d.cplx, data/NDview/scripts/4d.xyw, data/NDview/scripts/4d.xyz, data/NDview/scripts/4d.xzw, data/NDview/scripts/4d.yzw, data/NDview/scripts/5d.123, data/NDview/scripts/5d.5wins, data/NDview/scripts/startup.big.script, data/NDview/scripts/startup.small.script, src/bin/NDview/NDdemo, src/bin/NDview/NDview, src/bin/NDview/ndview.c, src/bin/ndutils/BasicFns.c, src/bin/ndutils/BasicFns.h, src/bin/ndutils/Clip.h, src/bin/ndutils/ColorMapDefs.h, src/bin/ndutils/ColorPoint.c, src/bin/ndutils/ColorPoint.h, src/bin/ndutils/GeExDir.c, src/bin/ndutils/GeExDir.h, src/bin/ndutils/GeomExtentDirection.c, src/bin/ndutils/GeomExtentDirection.h, src/bin/ndutils/GeomtoNoff.c: Fixed a BUNCH of memory leaks and other errors. But the main-work was to move thehomogeneous component to index 0. And the most important change was that each camera of an ND-cluster now has additionally its own 3d transform. * src/bin/gvclock/gvclock.in: Calling convention for transfrom-incr has changed (will undo that later). * src/bin/geomview/common/drawer.c, src/bin/geomview/common/lispext.c, src/bin/geomview/common/ndshade.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c: Homogeneous component for ND-viewing moved to index 0. Some other changes. ndshade.c changed such that INST stuff works even for ND. * src/bin/stereo/stereo.c: fucking ugliness removement. * src/lib/gprim/skel/skelsave.c, src/lib/gprim/skel/skelsphere.c, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/sphere/spheremisc.c, src/lib/gprim/vect/vectbound.c, src/lib/gprim/vect/vectcreate.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/quad/quadcreate.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/quad/quadsphere.c, src/lib/gprim/skel/skelbound.c, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/skel/skelload.c, src/lib/gprim/npolylist/nplsphere.c, src/lib/gprim/npolylist/npolylistP.h, src/lib/gprim/polylist/plbound.c, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/plsphere.c, src/lib/gprim/polylist/polylistP.h, src/lib/gprim/quad/quadbound.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshdelete.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/mesh/meshnormal.c, src/lib/gprim/mesh/meshsphere.c, src/lib/gprim/mesh/meshtransform.c, src/lib/gprim/ndmesh/ndmesh.h, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshload.c, src/lib/gprim/ndmesh/ndmeshsave.c, src/lib/gprim/ndmesh/ndmeshtransform.c, src/lib/gprim/npolylist/nplbound.c, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/nplsave.c, src/lib/gprim/geom/vert.h, src/lib/gprim/inst/instbound.c, src/lib/gprim/inst/instsphere.c, src/lib/gprim/mesh/meshbound.c, src/lib/gprim/geom/transform.c, src/lib/gprim/bbox/bboxunion.c, src/lib/gprim/bezier/bezbound.c, src/lib/gprim/geom/boundsphere.c, src/lib/gprim/geom/geomclass.h, src/lib/gprim/bbox/bboxminmax.c, src/lib/gprim/bbox/bboxsave.c, src/lib/gprim/bbox/bboxtransform.c, src/lib/gprim/bbox/bboxcopy.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/bbox/bboxload.c, src/lib/gprim/bbox/bboxbound.c, src/lib/gprim/bbox/bboxcenter.c: The homoegenous component for ND is now at index 0. VERT_4D flag is now only a mere input-flag for ND. Fixed several bugs. Forgot about the rest. (but the damn thing seems to work). * src/lib/geometry/hpoint3/hpoint3.c, src/lib/geometry/hpoint3/hpoint3.h, src/lib/geometry/hpoint3/hpoint3b.c: Some more utility functions concerning the conversion between ND<->3d. ND has its homogeneous component at index 0 now. * src/lib/mg/rib/mgribdraw.c: HPt3Normalize() is dead, changed everything to HPt3Dehomogenize. * src/lib/geometry/transformn/tmNpolardecomp.c, src/lib/geometry/transformn/transformn.c, src/lib/geometry/transformn/transformn.h: Moved the homogeneous component to position 0, this really MUCH more handy with varying ND-dimensions. * src/lib/geometry/hpointn/Makefile.am, src/lib/geometry/hpointn/hpointn.c, src/lib/geometry/hpointn/hpointn.h, src/lib/geometry/hpointn/hpointnb.c: Move everything to hpointn.c * src/lib/geomutil/plutil/anytopl.c: Adapt to changed TransformComponents() calling convention. * configure.ac, src/lib/oogl/util/malloc-debug.c: strdup() replacement for detecting memory leaks. * src/bin/geomview/common/ui.h, src/bin/geomview/x11/gvcamui.c, src/bin/geomview/x11/gvevent.c, src/bin/geomview/x11/gvui.c, src/bin/geomview/x11/gvui.h, src/bin/geomview/common/lang.c, src/bin/geomview/common/lang.h, src/bin/geomview/common/ui.c: Optionally change the active camera only on focus-change events; this is most desirable in the context of multiple windows when it starts to become complicated to move the mouse cursor back to the tool panel without crossing another camera window. * src/lib/oogl/lisp/lisp.c: Fix a severe memory leak in AssignArgs(): if the argument type is LLOBJECT and the argument itself is either not a list or the LHOLD modifyer is in effect, then the ref-count of the object would be increased one times too often which had the effect that constructs like (e.g.) (if (real-id blah) (echo foo) (echo bar)) would not free there arguments lists. Very bad. 2006-10-22 Claus-Justus Heine * src/bin/geomview/common/drawer.c: Correct drawing of ND cameras. * src/bin/geomview/common/worldio.c: lisp function (camera-prop ...): handle keyword args correctly, including checking for the correct keyword. * src/bin/geomview/common/ui.h: Cosmetics. * src/bin/geomview/common/transform.c: drawer_transform(): now returns success status. * src/bin/geomview/common/space.c: Unused variable compile warning. * src/bin/geomview/common/ndshade.c: Account for changes in mgNDctx struct. * src/bin/geomview/common/lang.h: Remove comma at end of enum. * src/bin/geomview/x11/gvui.h: Proto-type for ui_tool_center_origin_set() (to get rid of a compiler warning). * src/lib/geometry/hpointn/hpointnb.c, src/lib/geometry/transformn/transformn.c, src/lib/geometry/transformn/transformn.h: Do not use "short" for parameters; that doesn't make too much sense. New function TmNPermute() which applies a permutations to an ND-Transform (to map an x,y,z 3d sub-space to some other 3d-subspace). Some more fixes w.r.t. to prolongation and restriction of ND vectors/matrices. * src/lib/gprim/inst/instdraw.c: Better handling of ND-drawing; also: support non-local locations with ND-drawing. Non-local origins, however, are not (and probably will not be) supported with ND-drawing. * src/lib/gprim/inst/instmisc.c: Cosmetics. * src/lib/geometry/ntransobj/ntransobj.c: Remove unused variables. * src/lib/gprim/tlist/tlist.h, src/lib/gprim/tlist/tltransform.c: Handle TransformN argument to TListTransform(). * src/lib/gprim/vect/vectdraw.c: Fix ND drawing of VECTs: use the VECTs colors of no ND cmap is defined (same handling as in SKEL). * src/lib/mg/common/mg.h: restructured mgNDctx struct and hook functions; we can now push a 3-Transform (make INST support much easier). * src/lib/mg/common/mg.c, src/lib/mg/common/mgP.h: mgc->T4 and associated 3To4() stuff has gone because it was unused; seems to be a relict of beginning ND-support. * src/lib/oogl/lisp/lisp.c: include ctype.h, fix compiler warning in print_help_formatted(). 2006-10-20 Claus-Justus Heine * src/lib/oogl/util/create.h: New define CR_NCENTER to retrieve the center of a bounding box with GeomGet(bbox, ...) * src/bin/geomview/x11/gvcredits.c, src/bin/geomview/x11/gvfiles.c, src/bin/geomview/x11/gvlights.c, src/bin/geomview/x11/gvload.c, src/bin/geomview/x11/gvmaterial.c, src/bin/geomview/x11/gvmnpanel.c, src/bin/geomview/x11/gvsave.c, src/bin/geomview/x11/gvtoolui.c, src/bin/geomview/x11/gvui.c, src/bin/geomview/x11/gvui.h, src/bin/geomview/x11/interface/Tool.mib, src/bin/geomview/common/drawer.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/motion.c, src/bin/geomview/common/transform.c, src/bin/geomview/common/transform.h, src/bin/geomview/common/ui.c, src/bin/geomview/common/ui.h, src/bin/geomview/x11/gvappear.c, src/bin/geomview/x11/gvcameras.c, src/bin/geomview/x11/gvcolor.c, src/bin/geomview/x11/gvcommands.c: New toggle "Origin BBox": if set and a geometry is the center of motion (except the world), then the center of the geometry's bounding box is used as origin of the coordinate system (instead of just using the origin of the center-object's co-ordinate system). The idea is that this makes it much easier to look at objects which are translated out of the center of their own coordinate frame, e.g. by using an INST geometry. * src/bin/geomview/common/lang.c, src/bin/geomview/common/lang.h, src/bin/geomview/common/lispext.c, src/bin/geomview/common/lispext.h: The list of keyword names is now generated on the fly in define_keyword(). * src/lib/gprim/bbox/bboxP.h, src/lib/gprim/bbox/bboxclass.c, src/lib/gprim/bbox/bboxcreate.c: CR_4MIN/4MAX do not cause VERT_4D to be set (why should), but simply install an HPoint3. Bounding boxes now compute their center point, it can be fetched from the bounding box via GeomGet(bbox, CR_CENTER/CR_NCENTER, &point) to retrieve the center as HPoint3 or HPointN. * src/lib/gprim/bbox/bboxbound.c, src/lib/gprim/bbox/bboxunion.c: Use CR_4MIN/4MAX. * src/lib/oogl/lisp/lisp.c: Automatically format the help text to be indented by 8 chars, and wrapped at column 72. This simplifies modifying help texts (no need to format manually). A double \n\n is interpreted as paragraph, all other embedded spaces, tabs and newlines are converted to a single space. * src/lib/gprim/bezier/bezbound.c, src/lib/gprim/mesh/meshbound.c, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/npolylist/nplbound.c, src/lib/gprim/polylist/plbound.c, src/lib/gprim/quad/quadbound.c, src/lib/gprim/skel/skelbound.c, src/lib/gprim/vect/vectbound.c: Use CR_4MIN/4MAX to generate the bounding box. VERT_4D can be set separately via CR_4D. 2006-10-19 Claus-Justus Heine * src/lib/gprim/inst/instbound.c: Typo. * src/bin/NDview/ndview.c, src/bin/ndutils/ColorPoint.c, src/bin/ndutils/GeExDir.c, src/bin/ndutils/slicer.c, src/bin/ndutils/snapshot.c, src/lib/geometry/ntransobj/ntransobj.c, src/lib/geometry/transformn/transformn.c, src/lib/geometry/transformn/transformn.h: Prepare for binary ntransform format. 2006-10-18 Claus-Justus Heine * src/bin/geomview/common/drawer.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/ndshade.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c, src/lib/gprim/bbox/bboxclass.c, src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/discgrp/dgdraw.c, src/lib/gprim/inst/instP.h, src/lib/gprim/inst/instbound.c, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instdraw.c, src/lib/gprim/inst/instmisc.c, src/lib/gprim/inst/instsphere.c, src/lib/gprim/inst/inststream.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/vect/vectdraw.c, src/lib/mg/buf/mgbuf.c, src/lib/mg/common/mg.c, src/lib/mg/common/mg.h, src/lib/mg/common/mgP.h, src/lib/mg/opengl/mgopengl.c, src/lib/mg/ps/mgps.c, src/lib/mg/rib/mgrib.c, src/lib/mg/x11/mgx11.c: ND-INST support (origin and location local only, no multi-transform stuff, i.e. there are no NTLISTs). * src/lib/gprim/inst/inststream.c: The attempt to introduce ND-INSTs broke saving of the transformation matrix (axis), fix that. * src/lib/gprim/vect/vectbound.c: Fogot to intialize "min". * src/lib/gprim/vect/vectload.c: Initialize flag to 0. * src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/npolylist/nplbound.c, src/lib/gprim/skel/skelbound.c: Fix previously introduced ND-bug. * src/lib/gprim/geom/create.c: GeomInit(): set pdim to 4 by default. * src/lib/gprim/bbox/bboxcenter.c, src/lib/gprim/bbox/bboxunion.c: Fix bugs previously introduced by my ND-changes. 2006-10-17 Claus-Justus Heine * src/lib/gprim/inst/instbound.c: First glimpse at ndaxis support. * src/lib/gprim/bbox/bboxbound.c: Some ND fixes. * src/lib/gprim/sphere/spherecreate.c: Fix a long-standing memory leakage bug: a sphere's Bezier-mesh and tlist were NEVER freed. * src/bin/geomview/common/transform.c: id_bsphere(): fix a memory leak (ND-case). * src/lib/gprim/geom/boundsphere.c: Fix a memory leak (ND-case). 2006-10-16 Claus-Justus Heine * src/lib/gprim/inst/instcreate.c, src/lib/gprim/sphere/spherecreate.c: Forgot the initialization of inst->ndaxis in some places. * src/bin/geomview/common/transform.c: Forgot yet another TmNDelete() * src/lib/gprim/inst/instP.h, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instmisc.c, src/lib/gprim/inst/inststream.c: Preparations for ND-Transform INST objects (not working yet). * src/lib/gprim/inst/instsphere.c, src/lib/gprim/inst/instbound.c: Fix handling of ND-Transform if present. * src/lib/oogl/util/create.h, src/bin/ndutils/TransformGeom.c, src/bin/ndutils/WithColor.c, src/lib/gprim/inst/instP.h, src/lib/gprim/inst/instcreate.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quadP.h, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/quad/quadload.c, src/lib/gprim/quad/quadsphere.c, src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/skel/skelload.c, src/lib/gprim/sphere/sphereP.h, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/vect/vectdraw.c: Some cleanup w.r.t. to ND drawing of 3d objects. * src/bin/geomview/common/comm.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/worldio.c: include ntransobj.h. * src/bin/geomview/common/transform.c: Pass Transfrom, not (Transform *) to HPt3Tranform. 2006-10-15 Claus-Justus Heine * src/bin/geomview/common/comm.c, src/bin/geomview/common/comm.h, src/bin/geomview/common/lang.c, src/bin/geomview/common/lang.h, src/bin/geomview/common/lispext.c, src/bin/geomview/common/worldio.c: Support ntransform as real lisp-object. * src/bin/geomview/common/transform.c: look-recenter: only set the 3d transform if ND-viewing is NOT enabled. * src/lib/geometry/Makefile.am: Add ntransobj/ subdir. * configure.ac: Add src/lib/geometry/ntransobj/Makefile * src/lib/geometry/ntransobj/.cvsignore, src/lib/geometry/ntransobj/Headers, src/lib/geometry/ntransobj/Makefile.am, src/lib/geometry/ntransobj/ntransobj.c, src/lib/geometry/ntransobj/ntransobj.h: Initial revision. * src/bin/geomview/common/transform.c: apply_ND_transform(): need to delete Tmp, drawer_set_ND_xform() just makes a copy. * src/lib/gprim/sphere/spheremisc.c: Fix off-by-one loop-count errors in SphereEncompassXXXN(). * src/lib/gprim/npolylist/nplsphere.c: Fix silly typos and complete the implementation (stopped somewhere in middle, unnoticed because the file was never compiled). * src/lib/gprim/npolylist/npolylistP.h: Proto-type for NPolyListSphere(). * src/lib/gprim/npolylist/Makefile.am: Forgot to add nplsphere.c * src/lib/gprim/ndmesh/ndmeshclass.c, src/lib/gprim/npolylist/nplclass.c, src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelclass.c: Do not forget to install BoundSphere() method. * src/lib/gprim/mesh/meshclass.c, src/lib/gprim/polylist/plclass.c: Cosmetics. * src/lib/gprim/geom/boundsphere.c: GeomBoundSphereFromBBox(): handle ND-BBoxes correctly. * src/lib/gprim/bezier/bezbound.c, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/npolylist/nplbound.c, src/lib/gprim/quad/quadbound.c, src/lib/gprim/skel/skelbound.c: Array loop-count was off by one; bug introduced by myself. * src/lib/gprim/bbox/bboxminmax.c: Handle ND-BBoxes correctly. * src/lib/geometry/hpointn/hpointnb.c: Cosmetic changes to HPtNToHPt3(). * src/bin/NDview/.cvsignore, src/bin/clipboard/.cvsignore, src/bin/ndutils/.cvsignore, src/lib/oogl/wa/.cvsignore: Ignore some files generated during compilation. 2006-10-14 Claus-Justus Heine * src/lib/geometry/transformn/transformn.c: TmNRead(): release ->a array on error. 2006-10-13 Claus-Justus Heine * src/bin/geomview/common/drawer.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c: ND-stuff cleanup: just use the cameras C2W and W2C instead of using additional (unmotivated ...) entries in DView. Seems to work quite nice ... * src/lib/oogl/wa/wa.yacc.h, src/lib/gprim/quad/quadbound.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/quad/quadsphere.c, src/lib/gprim/skel/Makefile.am, src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelbound.c, src/lib/gprim/skel/skelcreate.c, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/skel/skelload.c, src/lib/gprim/skel/skelsave.c, src/lib/gprim/skel/skelsphere.c, src/lib/gprim/skel/skeltransform.c, src/lib/gprim/sphere/sphere.h, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/sphere/spheremisc.c, src/lib/gprim/vect/vectbound.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/vect/vectsphere.c, src/lib/oogl/wa/wa.lex.c, src/lib/oogl/wa/wa.yacc.c, src/lib/gprim/inst/instbound.c, src/lib/gprim/list/list.h, src/lib/gprim/list/listmisc.c, src/lib/gprim/mesh/mesh.h, src/lib/gprim/mesh/meshbound.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/mesh/meshsphere.c, src/lib/gprim/ndmesh/Makefile.am, src/lib/gprim/ndmesh/ndmesh.h, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/ndmesh/ndmeshsphere.c, src/lib/gprim/npolylist/nplbound.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/npolylist/nplsphere.c, src/lib/gprim/npolylist/npolylist.h, src/lib/gprim/polylist/plbound.c, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/plsphere.c, src/lib/gprim/polylist/polylist.h, src/lib/gprim/quad/quad.h, src/lib/gprim/bbox/bboxclass.c, src/lib/gprim/bbox/bboxcopy.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/bbox/bboxload.c, src/lib/gprim/bbox/bboxminmax.c, src/lib/gprim/bbox/bboxsave.c, src/lib/gprim/bbox/bboxtransform.c, src/lib/gprim/bbox/bboxunion.c, src/lib/gprim/bezier/bezbound.c, src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezload.c, src/lib/gprim/discgrp/dgbound.c, src/lib/gprim/discgrp/discgrp.h, src/lib/gprim/geom/bound.c, src/lib/gprim/geom/boundsphere.c, src/lib/gprim/geom/create.c, src/lib/gprim/geom/geom.h, src/lib/gprim/geom/geomclass.h, src/lib/gprim/geom/pick.c, src/lib/gprim/inst/inst.h, src/lib/geomutil/dim/dim.c, src/lib/geomutil/plutil/anytopl.c, src/lib/gprim/bbox/bbox.h, src/lib/gprim/bbox/bboxP.h, src/lib/gprim/bbox/bboxbound.c, src/lib/gprim/bbox/bboxcenter.c, src/bin/geomutil/oogl2rib/oogl2rib.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/motion.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c, src/bin/gvclock/Makefile.am, src/bin/ndutils/GeomExtentDirection.c, src/bin/ndutils/GeomtoNoff.c, src/bin/ndutils/TransformGeom.c, src/bin/ndutils/WithColor.c, src/lib/geometry/hpoint3/hpoint3.c, src/lib/geometry/hpoint3/hpoint3.h, src/lib/geometry/hpoint3/hpoint3b.c, src/lib/geometry/hpointn/hpointn.h, src/lib/geometry/hpointn/hpointnb.c, src/lib/geometry/point3/point3.c, src/lib/geometry/transform3/tm3conjugate.c, src/lib/geometry/transform3/tm3polardecomp.c, src/lib/geometry/transformn/tmNpolardecomp.c, src/lib/geometry/transformn/transformn.c, src/lib/geometry/transformn/transformn.h: Quite a lot of ND drawing changes: look-encompass/-recenter etc. should work now; every camera of an ND-cluster now additionally has a 3d transform attached which acts on the 3d sub-space it is looking at; this is used by look-encompass. The prevous ND paradigm focal-len == translation in z direction was just an ugly hack. Motions are not applied to the 3d transforms while in Nd mode. Mouse-scaling now works while in Nd-mode, however, it is no longer treated as a motion: mouse initiated scaling in Nd is never incremental; changing this would require quite some more changes. Picking still does not work in Nd. Nd drawing honours the 3d transformations set by the xform/xform-set commands. But the result may look very funny. * src/bin/geomutil/hvectext/Makefile.am: Fix all-local: rule. * src/bin/NDview/NDview: Disable normalization, do not disable bboxes, they work in Nd now. * src/lib/oogl/wa/.cvsignore: Ignore some files. 2006-10-06 Claus-Justus Heine * m4/lf_local.m4: Prefix fix for header linking was wrong. Correct that. * src/lib/gprim/comment/commentP.h, src/lib/gprim/discgrp/discgrpP.h, src/lib/gprim/inst/instP.h, src/lib/gprim/list/listP.h, src/lib/gprim/mesh/meshP.h, src/lib/gprim/ndmesh/ndmeshP.h, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/npolylistP.h, src/lib/gprim/polylist/polylistP.h, src/lib/gprim/quad/quadP.h, src/lib/gprim/quad/quadcreate.c, src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelload.c, src/lib/gprim/tlist/tlistP.h, src/lib/gprim/vect/vectP.h, src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezierP.h, src/lib/gprim/geom/geomclass.h: Add "pdim" component to GEOMFIELDS * src/lib/gprim/geom/vert.h: Add new flag VERT_ND. Unused yet. * src/lib/geometry/hpointn/hpointn.h, src/lib/geometry/hpointn/hpointnb.c: New function Pt4ToHPtN(). * src/bin/geomview/common/transform.c: look-toward seems to start to work for ND objects. Maybe. * src/lib/gprim/bbox/Makefile.am, src/lib/gprim/bbox/bbox.h, src/lib/gprim/bbox/bboxP.h, src/lib/gprim/bbox/bboxcenter.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/bbox/bboxminmax.c, src/lib/gprim/bbox/bboxunion.c: Support for ND bounding boxes. * src/bin/NDview/Makefile.am: Use $(realpath ..) for the in-tree emodule definitions. * doc/version.texi: Update. * m4/lf_local.m4: Take relative/non relative source locations into account. 2006-10-04 Claus-Justus Heine * src/lib/gprim/ndmesh/ndmeshtransform.c, src/lib/gprim/npolylist/npltransform.c: Initial revision. * src/lib/gprim/polylist/pltransform.c, src/lib/gprim/polylist/polylist.h, src/lib/gprim/quad/quad.h, src/lib/gprim/quad/quadbound.c, src/lib/gprim/quad/quadsphere.c, src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelbound.c, src/lib/gprim/skel/skelload.c, src/lib/gprim/skel/skeltransform.c, src/lib/gprim/sphere/spheremisc.c, src/lib/gprim/tlist/tlist.h, src/lib/gprim/vect/vectbound.c, src/lib/gprim/vect/vectsphere.c, src/lib/oogl/util/create.h, src/lib/gprim/list/list.h, src/lib/gprim/list/listclass.c, src/lib/gprim/list/listmisc.c, src/lib/gprim/list/listsphere.c, src/lib/gprim/mesh/mesh.h, src/lib/gprim/mesh/meshbound.c, src/lib/gprim/mesh/meshclass.c, src/lib/gprim/mesh/meshsphere.c, src/lib/gprim/mesh/meshtransform.c, src/lib/gprim/ndmesh/Makefile.am, src/lib/gprim/ndmesh/ndmesh.h, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/ndmesh/ndmeshclass.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshload.c, src/lib/gprim/ndmesh/ndmeshsave.c, src/lib/gprim/npolylist/Makefile.am, src/lib/gprim/npolylist/nplbound.c, src/lib/gprim/npolylist/nplclass.c, src/lib/gprim/npolylist/nplcreate.c, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/npolylist.h, src/lib/gprim/npolylist/npolylistP.h, src/lib/gprim/polylist/plbound.c, src/lib/gprim/polylist/plclass.c, src/lib/gprim/polylist/plsphere.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/bbox/bboxload.c, src/lib/gprim/bbox/bboxminmax.c, src/lib/gprim/bbox/bboxsave.c, src/lib/gprim/bbox/bboxtransform.c, src/lib/gprim/bbox/bboxunion.c, src/lib/gprim/bezier/bezbound.c, src/lib/gprim/bezier/bezclass.c, src/lib/gprim/bezier/bezier.h, src/lib/gprim/bezier/bezsphere.c, src/lib/gprim/bezier/beztransform.c, src/lib/gprim/discgrp/dgbound.c, src/lib/gprim/discgrp/discgrp.h, src/lib/gprim/geom/bound.c, src/lib/gprim/geom/boundsphere.c, src/lib/gprim/geom/geom.h, src/lib/gprim/geom/geomclass.h, src/lib/gprim/geom/pick.c, src/lib/gprim/geom/pick.h, src/lib/gprim/geom/transform.c, src/lib/gprim/inst/inst.h, src/lib/gprim/inst/instbound.c, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instmisc.c, src/lib/gprim/inst/instsphere.c, data/NDview/text/axeshelp.txt, doc/version.texi, src/bin/NDview/ndview.c, src/bin/geomutil/oogl2rib/oogl2rib.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/lights.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c, src/bin/geomview/common/worldio.c, src/bin/geomview/x11/gvcamui.c, src/bin/ndutils/slicer.c, src/bin/tackdown/origin.common.c, src/bin/tackdown/tackdown.main.c, src/lib/geometry/hpoint3/hpoint3.c, src/lib/geometry/hpointn/hpointn.c, src/lib/geometry/transform3/3d.h, src/lib/geometry/transformn/Makefile.am, src/lib/geometry/transformn/tmNpolardecomp.c, src/lib/geometry/transformn/transformn.h, src/lib/geomutil/plutil/plutil.h, src/lib/gprim/bbox/bbox.h, src/lib/gprim/bbox/bboxP.h, src/lib/gprim/bbox/bboxbound.c, src/lib/gprim/bbox/bboxclass.c, src/lib/gprim/bbox/bboxcopy.c: Preparation for some ND-view changes; I plan support for working "look" and "positioning" commands. Needed quite some changes. I tagged everything with the GEOMVIEW_PRE_NDVIEW_CHANGE tag; so we can revert if it does not work out. * src/lib/mg/buf/mgbuf.c: Complete my previous fix concerning the orietation of "alien" objects. 2006-10-03 Mark Phillips * doc/geomview.5, doc/geomview.5.man, doc/geomview.texi: add list of mode strings to documentation for event-mode gcl command * src/bin/geomview/x11/gvcamui.c: fixed snapshot setup code (used in ppmscreen snapshots) so that delay works on 64-bit systems 2006-10-03 Claus-Justus Heine * src/lib/mg/opengl/mgopengldraw.c: Applied Adrian Rossiter's fix for non-concave quadrilaterals. * src/lib/mg/buf/mgbuf.c: Flipping of the the coordinate system has to be done on a per-object basis because there are objects which do not belong to the world (e.g. SaVI's logo). This leaves, of course, room for optimization: as most objects belong to the world, we should flip the world's coordinate system (y-coordinate) and only do a per-object flipping for those few objects not belonging to the world. * src/lib/mg/x11/mgx11.c: Add a comment to some disabled code in mgx11_worldbegin(). * src/bin/geomview/common/space.c: A more understandable help text for ND-xform. * src/bin/geomview/common/drawer.c: The previous code accessed components of obj after obj already had been deleted. Gnah. Buuh. * src/bin/geomview/common/comm.c: Cosmetics. * src/lib/oogl/lisp/lisp.c, src/lib/oogl/lisp/lisp2.h: "not", "or" and "and" functions. * data/NDview/scripts/4d.3wins, data/NDview/scripts/4d.4wins: Correct some more-or-LESS cosmetic errors. 2006-10-02 Lloyd Wood * ChangeLog: Correcting typo in my name. Plus expanding on doc/ build note. 2006-10-01 Claus-Justus Heine * src/bin/geomview/x11/gvmnpanel.c, src/lib/mib/mibload.c: One of the more obscure features of the variable argument functions of the Xt toolkit is the handling of mnemonic's (in short keyboard short-cuts for menus etc): internally they are expected to be of type XID, which means "unsigned long int" outside of the X-server and CARD32 inside the X-server (we are talking about X-toolkits, and so we are outside the X-server and have "unsigned long int"). Now, at least on some 64bit archs passing 64bit variable arguments or 32bit variable arguments makes a difference. The solution is to use a type-cast to XID for mnemonic chars. This was the reason for the Warning: Name: button_0 Class: XmCascadeButtonGadget Illegal mnemonic character; Could not convert X KEYSYM to a keycode messages received on (some, at least) 64bit systems. * src/bin/geomview/x11/gvmnpanel.c: Prevent automatic resizing of the main-panel; otherwise it will suffer an unnecessary change each a module is started. 2006-09-30 Claus-Justus Heine * configure.ac, doc/version.texi: Bump version to post-rc9 * ChangeLog: Update. * NEWS: Document the Nd-code bugfix. * configure.ac, doc/version.texi: Bump version to rc9. * src/bin/stereo/stereo.c: Fix unused variable warning. * src/lib/geometry/transformn/transformn.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c: The nD stuff was really badly broken. I'm tempted to say that it did not have memory leaks, but _was_ one single big memory leak. * doc/version.texi: Update. 2006-09-30 Claus-Justus Heine * rc9 checkpoint. * NEWS: Document the Nd-code bugfix. * configure.ac, doc/version.texi: Bump version to rc9. * src/bin/stereo/stereo.c: Fix unused variable warning. * src/lib/geometry/transformn/transformn.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c: The nD stuff was really badly broken. I'm tempted to say that it did not have memory leaks, but _was_ one single big memory leak. * doc/version.texi: Update. 2006-09-13 Claus-Justus Heine * doc/geomview.texi: The menu entry for the GCL reference somehow vanished in the previous commit. * doc/version.texi: Update. * src/lib/gprim/comment/commentcreate.c: Undo a debugging relict that broke comment objects. 2006-08-30 Claus-Justus Heine * src/lib/gprim/vect/vectload.c: Typo. * doc/version.texi, doc/geomview.texi: Document binary SKEL format. * src/lib/gprim/skel/skelload.c: Binary SKEL format. * src/lib/gprim/npolylist/nplload.c: Fix Emacs per-file variable spec. * doc/version.texi: Update time-stamp. 2006-08-27 Claus-Justus Heine * doc/version.texi, doc/geomview.texi: The node- and menu structure was partially garbled which confused the html output, at least. Get rid of most @ifFORMAT constructs; use @uref{} to refer to URL's (works nowadays). * src/lib/oogl/util/iobuffer.c: Debugging stuff. 2006-08-24 Claus-Justus Heine * README.cvs: At least mention flex and bison (although the parser is now included in the CVS). 2006-08-23 Lloyd Wood * geomview.sh: This is the same Cygwin filesystem check that SaVi uses. It's less complex than if test "`uname | grep CYGWIN`"; then /cygdrive only exists if cygwin is running... 2006-08-21 Claus-Justus Heine * src/lib/oogl/wa/.cvsignore, src/lib/oogl/wa/wa.lex.c, src/lib/oogl/wa/wa.yacc.c, src/lib/oogl/wa/wa.yacc.h: Re-add scanner/parser output files. 2006-08-07 Claus-Justus Heine * doc/version.texi: Update to post-rc8 version. 2006-08-07 Lloyd Wood * Makefile.am: Building doc/ at end -- so that if there's a problem with the tex or ps stuff, the C build has already completed and is unaffected. make geomview can be used if the C build has completed and the doc/ build fails, to create the ./geomview script than runs Geomview. 2006-08-07 Claus-Justus Heine * src/bin/NDview/.cvsignore, src/bin/clipboard/.cvsignore, src/bin/cplxview/.cvsignore, src/bin/flythrough/.cvsignore, src/bin/ginsu/.cvsignore, src/bin/graffiti/.cvsignore, src/bin/hinge/.cvsignore, src/bin/ndutils/.cvsignore, src/bin/stereo/.cvsignore, src/bin/sweep/.cvsignore, src/bin/tackdown/.cvsignore, src/bin/transformer/.cvsignore: CVS ignore stuff. * src/lib/oogl/wa/Makefile.am: The dependency of the parser/scanner files should be on $(srcdir)/Makefile.in, not on Makefile. * src/lib/gprim/geom/geomstream.c: Remove a double file-close. * configure.ac: Use a fancy "post-rc8-CVS" version string. * src/lib/oogl/wa/.cvsignore: Ignore wa.yacc.c * doc/.cvsignore, doc/version.texi: Include version.texi into the CVS. IMHO this is a bad idea, but the maintainer-mode concept seems to be too complicated. * src/bin/NDview/.cvsignore, src/bin/clipboard/.cvsignore, src/bin/ndutils/.cvsignore: Ignore .deps directory. * configure.ac: Unconditionally check for ps2epsi, epstopdf, pdfimags and pnmtopng, even without MAINTAINERMODE: * reconf: Use "$@" not $* (expansion of arguments in quoted words). 2006-08-04 Claus-Justus Heine * README.cvs, doc/Makefile.am, src/lib/oogl/lisp/Makefile.am, src/lib/oogl/wa/Makefile.am: Letting targets to create "maintainermode"-files depend on the automake-conditional MAINTAINERMODE was a very stupid idea. 2006-08-03 Claus-Justus Heine * README.cvs: Mention that we need --enable-maintainer-mode ... 2006-08-02 Claus-Justus Heine * NEWS: Meanwhile it's August 2006 ... tempus fugit. * ChangeLog: Update to 1.8.2-rc8 state. * configure.ac: Apply David's Darwin patch. * src/lib/mg/x11/mgx11.c, src/lib/mg/x11/mgx11windows.c: Quick and dirty hack to fix upside-down bug with MGX11 driver. * src/bin/labeler/Makefile.am: Fix the local (i.e. in build-tree) .geomview-labeler module def. * src/bin/geomview/common/transform.c: When doing "look-recenter" we do not want to apply the object transformation to the camera, because the object-trafo may contain arbitrary deformations (at least I do not like being deformed when watching Geomview). Instead, us a polar decomposition of the object's transform and apply only the orthogonal factor to the camera. * src/lib/Makefile.am: Maybe do not install the library if not using shared libraries (we do install ATM). * src/lib/oogl/wa/yystype.h, src/lib/oogl/wa/Headers, src/lib/oogl/wa/Makefile.am, src/lib/oogl/wa/fsaparse.l, src/lib/oogl/wa/fsaparse.y, src/lib/oogl/wa/wa.yystype.h: Renamed yystype.h to wa.yystype.h * src/lib/geometry/transform3/Makefile.am, src/lib/geometry/transform3/tm3polardecomp.c, src/lib/geometry/transform3/transform.h, src/lib/geometry/transform3/transform3.h: Polar decomposition of 3x3 matrix. * Makefile.am: Install non-private header-files in pkginclude. * configure.ac: Adapt xforms include and library paths to the xforms source distro at savannah. * src/lib/geometry/transform3/tm3polardecomp.c: Initial revision. 2006-08-02 Claus-Justus Heine * configure.ac: Apply David's Darwin patch. * src/lib/mg/x11/mgx11.c, src/lib/mg/x11/mgx11windows.c: Quick and dirty hack to fix upside-down bug with MGX11 driver. * src/bin/labeler/Makefile.am: Fix the local (i.e. in build-tree) .geomview-labeler module def. * src/bin/geomview/common/transform.c: When doing "look-recenter" we do not want to apply the object transformation to the camera, because the object-trafo may contain arbitrary deformations (at least I do not like being deformed when watching Geomview). Instead, us a polar decomposition of the object's transform and apply only the orthogonal factor to the camera. * src/lib/Makefile.am: Maybe do not install the library if not using shared libraries (we do install ATM). * src/lib/oogl/wa/yystype.h, src/lib/oogl/wa/Headers, src/lib/oogl/wa/Makefile.am, src/lib/oogl/wa/fsaparse.l, src/lib/oogl/wa/fsaparse.y, src/lib/oogl/wa/wa.yystype.h: Renamed yystype.h to wa.yystype.h * src/lib/geometry/transform3/Makefile.am, src/lib/geometry/transform3/tm3polardecomp.c, src/lib/geometry/transform3/transform.h, src/lib/geometry/transform3/transform3.h: Polar decomposition of 3x3 matrix. * Makefile.am: Install non-private header-files in pkginclude. * configure.ac: Adapt xforms include and library paths to the xforms source distro at savannah. * src/lib/geometry/transform3/tm3polardecomp.c: Initial revision. 2006-08-01 Claus-Justus Heine * configure.ac: Disable building a shared library by default. * src/lib/oogl/util/futil.c, src/lib/oogl/util/iobfutil.c: htons/l -> gv_htons/l (bug reported by David Morisson). * src/bin/geomutil/bdy/Makefile.am, src/bin/geomutil/clip/Makefile.am, src/bin/geomutil/oogl2rib/Makefile.am, src/bin/geomutil/oogl2vrml/Makefile.am, src/bin/geomutil/plutil/Makefile.am, src/bin/geomutil/ucd/Makefile.am, src/bin/geomview/x11/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/labeler/Makefile.am, src/bin/ndutils/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/NDview/Makefile.am, src/bin/animate/Makefile.am, src/bin/clipboard/Makefile.am, src/bin/cplxview/Makefile.am, src/bin/crayola/Makefile.am, src/bin/example/Makefile.am: Remove -rpath, not needed and not wanted by Debian. 2006-08-01 Steve M. Robbins * src/bin/ChangeLog, src/bin/geomutil/plutil/offconsol.1: Fix manpage section. * ChangeLog, configure.ac, src/bin/ChangeLog, src/bin/stereo/stereo.c: Search for /usr/gfx/setmon at configure time; may be overridden by setting shell variable SETMON_PATH. If not found, diagnostic is emitted at runtime by stereo. * src/lib/ChangeLog, src/lib/gprim/geom/knownclass.c: Fix bug in list of function prototypes, arising from the fact that the "*" in C attaches to the declarator rather than the type. * ChangeLog, geomview.sh: Specifying -help should only print help and not bring up geomview windows. Fix diagnostic emitted when invoked with "-graphics" and no alternatives exist. * src/bin/ChangeLog, src/bin/example/oogl.c, src/bin/flythrough/main.c, src/bin/hinge/hui.c: Remove or rename function getline() to avoid clash with standard C library function. * src/lib/ChangeLog, src/lib/oogl/util/ooglutil.h: Remove duplicate declaration of fmemopen(). 2006-07-31 Claus-Justus Heine * configure.ac: AM_CONDITIONALS _must_ _not_ be defined conditionally. Gnah. * src/bin/Makefile.am: Forward the src_bin_module_subdirs to "make distclean" via distclean-local. * ChangeLog: *** empty log message *** * configure.ac: Search for GL/gl.h and GL/glx.h and make sure the beast still compiles without OpenGL. * geomview.sh: Set TCL/TK_LIBRARY variables on Cygwin, the Cygwin Tcl/Tk port is buggy in this respect. * src/bin/geomview/x11/gvcamui.c: Missing closing " after contact info update. 2006-07-30 Claus-Justus Heine * configure.ac: Use PREFIX/share/geomview as data-dir (instead of PREFIX/share/geomview/data). * src/bin/ndutils/ColorPoint.c: Off-by-1 bug: in C (in contrast to maybe Fortran ...) the last array index is (size-1). Ups. * src/bin/ndutils/GeExDir.c: Debugging message. * src/bin/ndutils/slicer.c, src/bin/ndutils/snapshot.c: Consume the fourth number of the ND-axes command. * doc/geomview.texi, src/bin/geomview/common/space.c: The "ND-axes" command was not correctly documented: it accepts 4 numbers, not 3, and return 4 numbers, not 3, when called without camera cluster ID. The last number seems to be hard-wired to -1. But??????? 2006-07-31 Steve M. Robbins * configure.ac: Search for /usr/gfx/setmon; may be overridden by setting shell variable SETMON_PATH. Used in stereo module. * geomview.sh: Specifying -help should only print help and not bring up geomview windows. Fix diagnostic emitted when invoked with "-graphics" and no alternatives exist. 2006-07-31 Claus-Justus Heine * 1.8.2-rc7 release. * configure.ac: Search for GL/gl.h and GL/glx.h and make sure the beast still compiles without OpenGL. * geomview.sh: Set TCL/TK_LIBRARY variables on Cygwin, the Cygwin Tcl/Tk port is buggy in this respect. * src/bin/geomview/x11/gvcamui.c: Missing closing " after contact info update. 2006-07-30 Claus-Justus Heine * configure.ac: Use PREFIX/share/geomview as data-dir (instead of PREFIX/share/geomview/data). * src/bin/ndutils/ColorPoint.c: Off-by-1 bug: in C (in contrast to maybe Fortran ...) the last array index is (size-1). Ups. * src/bin/ndutils/GeExDir.c: Debugging message. * src/bin/ndutils/slicer.c, src/bin/ndutils/snapshot.c: Consume the fourth number of the ND-axes command. * doc/geomview.texi, src/bin/geomview/common/space.c: The "ND-axes" command was not correctly documented: it accepts 4 numbers, not 3, and return 4 numbers, not 3, when called without camera cluster ID. The last number seems to be hard-wired to -1. But??????? * configure.ac, src/bin/Makefile.am: Cygwin (and maybe other non-Unix systems) do not have the Tcl_CreateFileHandler() function. Check for it and disable the crayola module if the function is not found. * src/bin/ndutils/clipoogl.c, src/bin/ndutils/slicer.c, src/bin/ndutils/wrappers.c, src/lib/mg/x11/mgx11draw.c, src/lib/mg/x11/mgx11windows.c: Remove some compiler warnings. * src/lib/oogl/lisp/Makefile.am: clisp.h must be copied to $(srcdir), otherwise the headers sym-link stuff does not work. * ChangeLog: Update email addresses; I need to be more careful to run rcs2log with the correct -u options. * doc/Makefile.am: Cleaned up as suggested by Steve M. Robbins. * data/Makefile.am: Erroneously included the groups/CVS/ subdir. * src/bin/gvclock/Makefile.am: CLEANFILES was set twice. * src/bin/sweep/.geomview-sweep, src/bin/tackdown/.geomview-tackdown, src/bin/transformer/.geomview-transformer, src/bin/hinge/.geomview-hinge, src/bin/stereo/.geomview-stereo, src/bin/graffiti/.geomview-graffiti, src/bin/flythrough/.geomview-flythrough, src/bin/ginsu/.geomview-ginsu, src/bin/cplxview/.geomview-cplxview: Generated by make * src/bin/geomview/common/comm.c: LDEFINE(read, ...): Fix a long standing memory bug; (read blah {stuff}) treats blah just as keyword, the resulting lisp-object (e.g. a string "geometry") is never referenced again; so we _must_ free the keyword in this function, not only on error, but in any case. * src/bin/clipboard/clipx.c: Use the "default" grey as backgound for the clibboard view. * src/bin/transformer/Makefile.am, data/Makefile.am, src/bin/NDview/Makefile.am, src/bin/animate/Makefile.am, src/bin/clipboard/Makefile.am, src/bin/cplxview/Makefile.am, src/bin/crayola/Makefile.am, src/bin/example/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/gvclock/Makefile.am, src/bin/hinge/Makefile.am, src/bin/labeler/Makefile.am, src/bin/ndutils/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am: Some fixes after running "make distchek". * README: Update modules list. * NEWS: Update list of resurrected modules. * INSTALL.Geomview: Note that we are back to "vanilla" installation layout (with the exception of the different prefix default). * configure.ac: Again build a shared library. * src/bin/ndutils/Slicer: Bail out if we are not in ND with N > 3. * src/bin/maniview/maniview.h: xforms issue. * src/bin/orrery/Makefile.am: Let .geomview-orrery depend on the Makefile * src/bin/tackdown/Makefile.am: origin module. * src/bin/ndutils/.cvsignore: Initial revision. * src/bin/hinge/hui.c: Mmmh. * src/bin/flythrough/flythrough.h: Xforms issue. * src/bin/flythrough/main.c: Check for NULL before trying to close files. * src/bin/cplxview/Makefile.am: Help text now in top-level directory. * src/bin/NDview/Makefile.am: Moved all data-files to top-level directory. * configure.ac: ndutils * data/Makefile.am: Install all data-files from here. * src/bin/cplxview/cplxpanels2.c, src/bin/cplxview/cplxpanels2.fd, src/bin/cplxview/cplxpanels2.h, src/bin/example/panel.c, src/bin/example/panel.fd, src/bin/example/panel.h, src/bin/flythrough/panel.c, src/bin/flythrough/panel.fd, src/bin/flythrough/panel.h, src/bin/ginsu/ginsuF.c, src/bin/ginsu/ginsuF.fd, src/bin/ginsu/ginsuF.h, src/bin/hinge/panel.c, src/bin/hinge/panel.fd, src/bin/hinge/panel.h, src/bin/maniview/controlpanel.c, src/bin/maniview/controlpanel.fd, src/bin/maniview/controlpanel.h, src/bin/stereo/sterui.c, src/bin/stereo/sterui.fd, src/bin/stereo/sterui.h, src/bin/sweep/panel.c, src/bin/sweep/panel.fd, src/bin/sweep/panel.h, src/bin/tackdown/origin.panel.c, src/bin/tackdown/origin.panel.fd, src/bin/tackdown/origin.panel.h, src/bin/tackdown/panel.c, src/bin/tackdown/panel.fd, src/bin/tackdown/panel.h, src/bin/transformer/panel.c, src/bin/transformer/panel.fd, src/bin/transformer/panel.h: Re-ran the fdesign program; several button, widges etc. just did not look too good with the newer xforms stuff. * src/bin/Makefile.am: Resurrect ndutils. * src/lib/oogl/util/iobuffer.c: Make iobfrewind() more efficient. * src/bin/ndutils/init.h, src/bin/ndutils/slicer.c, src/bin/ndutils/slicer.h, src/bin/ndutils/snapshot.c, src/bin/ndutils/snapshot.h, src/bin/ndutils/testwish.c, src/bin/ndutils/wrappers.c, src/bin/ndutils/wrappers.h, src/bin/ndutils/3D-Snapshot, src/bin/ndutils/BasicFns.c, src/bin/ndutils/BasicFns.h, src/bin/ndutils/Clip.h, src/bin/ndutils/ColorMapDefs.h, src/bin/ndutils/ColorPoint.c, src/bin/ndutils/ColorPoint.h, src/bin/ndutils/Colormap, src/bin/ndutils/GeExDir.c, src/bin/ndutils/GeExDir.h, src/bin/ndutils/GeomExtentDirection.c, src/bin/ndutils/GeomExtentDirection.h, src/bin/ndutils/GeomtoNoff.c, src/bin/ndutils/GeomtoNoff.h, src/bin/ndutils/LoadMap.c, src/bin/ndutils/LoadMap.h, src/bin/ndutils/MakeGoodTransforms.c, src/bin/ndutils/MakeGoodTransforms.h, src/bin/ndutils/Makefile.am, src/bin/ndutils/Random.c, src/bin/ndutils/Random.h, src/bin/ndutils/Slicer, src/bin/ndutils/TransformGeom.c, src/bin/ndutils/TransformGeom.h, src/bin/ndutils/WithColor.c, src/bin/ndutils/WithColor.h, src/bin/ndutils/clip.c, src/bin/ndutils/clipoogl.c, src/bin/ndutils/init.c, data/NDview/geom/demo/axes, data/NDview/geom/demo/cubew, data/NDview/geom/demo/cubew+, data/NDview/geom/demo/point, data/NDview/geom/demo/points, data/NDview/geom/demo/segmentw+x+z, data/NDview/geom/demo/segmentw+x+z+, data/NDview/geom/demo/squarew+x, data/NDview/geom/demo/squarew+x+, data/NDview/geom/demo/tesseract, data/NDview/scripts/reset.script, data/NDview/scripts/startup.big.script, data/NDview/scripts/startup.small.script, data/NDview/text/axeshelp.txt, data/NDview/text/cube.txt, data/NDview/text/cubed.txt, data/NDview/text/demohelp.txt, data/NDview/text/introhelp.txt, data/NDview/text/point.txt, data/NDview/text/pointd.txt, data/NDview/text/prefabhelp.txt, data/NDview/text/segment.txt, data/NDview/text/segmentd.txt, data/NDview/text/square.txt, data/NDview/text/squared.txt, data/NDview/text/tesseract.txt, data/NDview/text/toolkithelp.txt, data/NDview/scripts/.ndview, data/NDview/scripts/4d.2bigwins, data/NDview/scripts/4d.3wins, data/NDview/scripts/4d.4wins, data/NDview/scripts/4d.cplx, data/NDview/scripts/4d.earthcolor, data/NDview/scripts/4d.wildcolor, data/NDview/scripts/4d.xyw, data/NDview/scripts/4d.xyz, data/NDview/scripts/4d.xzw, data/NDview/scripts/4d.yzw, data/NDview/scripts/4dcol.w.rb, data/NDview/scripts/4dcol.x.rb, data/NDview/scripts/4dcol.y.rb, data/NDview/scripts/4dcol.z.rb, data/NDview/scripts/5d.123, data/NDview/scripts/5d.5wins, data/NDview/scripts/5dcol.1.rb, data/NDview/scripts/5dcol.2.rb, data/NDview/scripts/5dcol.3.rb, data/NDview/scripts/5dcol.4.rb, data/NDview/scripts/5dcol.5.rb, data/NDview/scripts/color.script, data/NDview/scripts/delete_all.script, data/NDview/scripts/deletecams.script, data/NDview/scripts/eitherwindow, data/NDview/scripts/nocolor.script, data/NDview/cplxview/geom/funcplane, data/NDview/cplxview/scripts/4d.colorcplx, data/NDview/cplxview/scripts/4d.cplx, data/NDview/cplxview/scripts/del_c0, data/NDview/cplxview/scripts/reset.script, data/NDview/cplxview/scripts/startup.script, data/NDview/cplxview/text/cplxhelp.txt, data/NDview/geom/4cube, data/NDview/geom/4daxes, data/NDview/geom/5daxes, data/NDview/geom/6daxes, data/NDview/geom/crosscap, data/NDview/geom/dodecaplex.skel, data/NDview/geom/flattorus, data/NDview/geom/funcplane, data/NDview/geom/hypercube.skel, data/NDview/geom/octaplex.skel, data/NDview/geom/orthoplex.skel, data/NDview/geom/pluker23col.4d, data/NDview/geom/simplex.skel, data/NDview/geom/tetraplex.skel: Resurrected from older Geomview releases. 2006-07-30 Claus-Justus Heine * src/bin/ndutils/clipoogl.c, src/bin/ndutils/slicer.c, src/bin/ndutils/wrappers.c, src/lib/mg/x11/mgx11draw.c, src/lib/mg/x11/mgx11windows.c: Remove some compiler warnings. * src/lib/oogl/lisp/Makefile.am: clisp.h must be copied to $(srcdir), otherwise the headers sym-link stuff does not work. * ChangeLog: Update email addresses; I need to be more careful to run rcs2log with the correct -u options. * doc/Makefile.am: Cleaned up as suggested by Steve M. Robbins. * data/Makefile.am: Erroneously included the groups/CVS/ subdir. * src/bin/gvclock/Makefile.am: CLEANFILES was set twice. * src/bin/sweep/.geomview-sweep, src/bin/tackdown/.geomview-tackdown, src/bin/transformer/.geomview-transformer, src/bin/hinge/.geomview-hinge, src/bin/stereo/.geomview-stereo, src/bin/graffiti/.geomview-graffiti, src/bin/flythrough/.geomview-flythrough, src/bin/ginsu/.geomview-ginsu, src/bin/cplxview/.geomview-cplxview: Generated by make * src/bin/geomview/common/comm.c: LDEFINE(read, ...): Fix a long standing memory bug; (read blah {stuff}) treats blah just as keyword, the resulting lisp-object (e.g. a string "geometry") is never referenced again; so we _must_ free the keyword in this function, not only on error, but in any case. * src/bin/clipboard/clipx.c: Use the "default" grey as backgound for the clibboard view. * src/bin/transformer/Makefile.am, data/Makefile.am, src/bin/NDview/Makefile.am, src/bin/animate/Makefile.am, src/bin/clipboard/Makefile.am, src/bin/cplxview/Makefile.am, src/bin/crayola/Makefile.am, src/bin/example/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/gvclock/Makefile.am, src/bin/hinge/Makefile.am, src/bin/labeler/Makefile.am, src/bin/ndutils/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am: Some fixes after running "make distchek". * README: Update modules list. * NEWS: Update list of resurrected modules. * INSTALL.Geomview: Note that we are back to "vanilla" installation layout (with the exception of the different prefix default). * configure.ac: Again build a shared library. * src/bin/ndutils/Slicer: Bail out if we are not in ND with N > 3. * src/bin/maniview/maniview.h: xforms issue. * src/bin/orrery/Makefile.am: Let .geomview-orrery depend on the Makefile * src/bin/tackdown/Makefile.am: origin module. * src/bin/ndutils/.cvsignore: Initial revision. * src/bin/hinge/hui.c: Mmmh. * src/bin/flythrough/flythrough.h: Xforms issue. * src/bin/flythrough/main.c: Check for NULL before trying to close files. * src/bin/cplxview/Makefile.am: Help text now in top-level directory. * src/bin/NDview/Makefile.am: Moved all data-files to top-level directory. * configure.ac: ndutils * data/Makefile.am: Install all data-files from here. * src/bin/cplxview/cplxpanels2.c, src/bin/cplxview/cplxpanels2.fd, src/bin/cplxview/cplxpanels2.h, src/bin/example/panel.c, src/bin/example/panel.fd, src/bin/example/panel.h, src/bin/flythrough/panel.c, src/bin/flythrough/panel.fd, src/bin/flythrough/panel.h, src/bin/ginsu/ginsuF.c, src/bin/ginsu/ginsuF.fd, src/bin/ginsu/ginsuF.h, src/bin/hinge/panel.c, src/bin/hinge/panel.fd, src/bin/hinge/panel.h, src/bin/maniview/controlpanel.c, src/bin/maniview/controlpanel.fd, src/bin/maniview/controlpanel.h, src/bin/stereo/sterui.c, src/bin/stereo/sterui.fd, src/bin/stereo/sterui.h, src/bin/sweep/panel.c, src/bin/sweep/panel.fd, src/bin/sweep/panel.h, src/bin/tackdown/origin.panel.c, src/bin/tackdown/origin.panel.fd, src/bin/tackdown/origin.panel.h, src/bin/tackdown/panel.c, src/bin/tackdown/panel.fd, src/bin/tackdown/panel.h, src/bin/transformer/panel.c, src/bin/transformer/panel.fd, src/bin/transformer/panel.h: Re-ran the fdesign program; several button, widges etc. just did not look too good with the newer xforms stuff. * src/bin/Makefile.am: Resurrect ndutils. * src/lib/oogl/util/iobuffer.c: Make iobfrewind() more efficient. * src/bin/ndutils/init.h, src/bin/ndutils/slicer.c, src/bin/ndutils/slicer.h, src/bin/ndutils/snapshot.c, src/bin/ndutils/snapshot.h, src/bin/ndutils/testwish.c, src/bin/ndutils/wrappers.c, src/bin/ndutils/wrappers.h, src/bin/ndutils/3D-Snapshot, src/bin/ndutils/BasicFns.c, src/bin/ndutils/BasicFns.h, src/bin/ndutils/Clip.h, src/bin/ndutils/ColorMapDefs.h, src/bin/ndutils/ColorPoint.c, src/bin/ndutils/ColorPoint.h, src/bin/ndutils/Colormap, src/bin/ndutils/GeExDir.c, src/bin/ndutils/GeExDir.h, src/bin/ndutils/GeomExtentDirection.c, src/bin/ndutils/GeomExtentDirection.h, src/bin/ndutils/GeomtoNoff.c, src/bin/ndutils/GeomtoNoff.h, src/bin/ndutils/LoadMap.c, src/bin/ndutils/LoadMap.h, src/bin/ndutils/MakeGoodTransforms.c, src/bin/ndutils/MakeGoodTransforms.h, src/bin/ndutils/Makefile.am, src/bin/ndutils/Random.c, src/bin/ndutils/Random.h, src/bin/ndutils/Slicer, src/bin/ndutils/TransformGeom.c, src/bin/ndutils/TransformGeom.h, src/bin/ndutils/WithColor.c, src/bin/ndutils/WithColor.h, src/bin/ndutils/clip.c, src/bin/ndutils/clipoogl.c, src/bin/ndutils/init.c, data/NDview/geom/demo/axes, data/NDview/geom/demo/cubew, data/NDview/geom/demo/cubew+, data/NDview/geom/demo/point, data/NDview/geom/demo/points, data/NDview/geom/demo/segmentw+x+z, data/NDview/geom/demo/segmentw+x+z+, data/NDview/geom/demo/squarew+x, data/NDview/geom/demo/squarew+x+, data/NDview/geom/demo/tesseract, data/NDview/scripts/reset.script, data/NDview/scripts/startup.big.script, data/NDview/scripts/startup.small.script, data/NDview/text/axeshelp.txt, data/NDview/text/cube.txt, data/NDview/text/cubed.txt, data/NDview/text/demohelp.txt, data/NDview/text/introhelp.txt, data/NDview/text/point.txt, data/NDview/text/pointd.txt, data/NDview/text/prefabhelp.txt, data/NDview/text/segment.txt, data/NDview/text/segmentd.txt, data/NDview/text/square.txt, data/NDview/text/squared.txt, data/NDview/text/tesseract.txt, data/NDview/text/toolkithelp.txt, data/NDview/scripts/.ndview, data/NDview/scripts/4d.2bigwins, data/NDview/scripts/4d.3wins, data/NDview/scripts/4d.4wins, data/NDview/scripts/4d.cplx, data/NDview/scripts/4d.earthcolor, data/NDview/scripts/4d.wildcolor, data/NDview/scripts/4d.xyw, data/NDview/scripts/4d.xyz, data/NDview/scripts/4d.xzw, data/NDview/scripts/4d.yzw, data/NDview/scripts/4dcol.w.rb, data/NDview/scripts/4dcol.x.rb, data/NDview/scripts/4dcol.y.rb, data/NDview/scripts/4dcol.z.rb, data/NDview/scripts/5d.123, data/NDview/scripts/5d.5wins, data/NDview/scripts/5dcol.1.rb, data/NDview/scripts/5dcol.2.rb, data/NDview/scripts/5dcol.3.rb, data/NDview/scripts/5dcol.4.rb, data/NDview/scripts/5dcol.5.rb, data/NDview/scripts/color.script, data/NDview/scripts/delete_all.script, data/NDview/scripts/deletecams.script, data/NDview/scripts/eitherwindow, data/NDview/scripts/nocolor.script, data/NDview/cplxview/geom/funcplane, data/NDview/cplxview/scripts/4d.colorcplx, data/NDview/cplxview/scripts/4d.cplx, data/NDview/cplxview/scripts/del_c0, data/NDview/cplxview/scripts/reset.script, data/NDview/cplxview/scripts/startup.script, data/NDview/cplxview/text/cplxhelp.txt, data/NDview/geom/4cube, data/NDview/geom/4daxes, data/NDview/geom/5daxes, data/NDview/geom/6daxes, data/NDview/geom/crosscap, data/NDview/geom/dodecaplex.skel, data/NDview/geom/flattorus, data/NDview/geom/funcplane, data/NDview/geom/hypercube.skel, data/NDview/geom/octaplex.skel, data/NDview/geom/orthoplex.skel, data/NDview/geom/pluker23col.4d, data/NDview/geom/simplex.skel, data/NDview/geom/tetraplex.skel: Resurrected from older Geomview releases. 2006-07-29 Claus-Justus Heine * src/bin/flythrough/main.c: Do not try to call flcose() with NULL pointer. 2006-07-29 Steve M. Robbins * ChangeLog, configure.ac: FIX setting of AM_CONDITIONAL HAVE_TCLTK. 2006-07-29 Claus-Justus Heine * src/bin/NDview/ndview.c: We have no fscanf() for IOBFILE files. Work around that. * src/bin/NDview/Makefile.am, src/bin/NDview/NDdemo, src/bin/NDview/NDview: Enable in-build-tree use of NDview and NDdemo. * Makefile.am: Back to using top_srcdir for preliminary GEOMROOT. * src/bin/NDview/Makefile.am: Fiddle with in-builddir module definition. * src/bin/orrery/Makefile.am: Look under GEOMDATA/modules/orrery/orrery * src/lib/oogl/util/iobuffer.c, src/lib/oogl/util/iobuffer.h: Fix iobfgetbuffer() should return 1 if iobf->ungetc != EOF; that ungetc counts for one char of data :) * src/lib/aclib/lstat.c, src/lib/aclib/stat.c: Real wrappers for stat/lstat/fstat in case configure detects bugs in the system's stat() implementations. * src/bin/clipboard/.cvsignore: Add Makefile.in/Makefile. * src/bin/animate/Makefile.am, src/bin/togeomview/Makefile.am: Link against libgeomview.la (to get stat replacement functions). * src/bin/NDview/Makefile.am: Do not copy data to toplevel build-directory. * src/bin/NDview/.cvsignore: Ignore Makefile, Makefile.in * configure.ac: Provide wrappers for stat and lstat and fstat. * data/Makefile.am: Include shaders into the distro. * .cvsignore: Ignore directories starting with "build". * data/shaders/hplastic.sl, data/shaders/hplastic.slo, data/shaders/README, data/shaders/hlight.sl, data/shaders/hlight.slo, data/shaders/hmatte.sl, data/shaders/hmatte.slo: Initial revision. * src/bin/orrery/configure.ac: Fixed configure.ac: AM_INIT_AUTOMAKE/AC_CONFIG_AUXDIR order. 2006-07-29 Claus-Justus Heine * src/bin/flythrough/main.c: Do not try to call flcose() with NULL pointer. 2006-07-29 Steve M. Robbins * ChangeLog, configure.ac: FIX setting of AM_CONDITIONAL HAVE_TCLTK. 2006-07-29 Claus-Justus Heine * src/bin/NDview/ndview.c: We have no fscanf() for IOBFILE files. Work around that. * src/bin/NDview/Makefile.am, src/bin/NDview/NDdemo, src/bin/NDview/NDview: Enable in-build-tree use of NDview and NDdemo. * Makefile.am: Back to using top_srcdir for preliminary GEOMROOT. * src/bin/NDview/Makefile.am: Fiddle with in-builddir module definition. * src/bin/orrery/Makefile.am: Look under GEOMDATA/modules/orrery/orrery * src/lib/oogl/util/iobuffer.c, src/lib/oogl/util/iobuffer.h: Fix iobfgetbuffer() should return 1 if iobf->ungetc != EOF; that ungetc counts for one char of data :) * src/lib/aclib/lstat.c, src/lib/aclib/stat.c: Real wrappers for stat/lstat/fstat in case configure detects bugs in the system's stat() implementations. * src/bin/clipboard/.cvsignore: Add Makefile.in/Makefile. * src/bin/animate/Makefile.am, src/bin/togeomview/Makefile.am: Link against libgeomview.la (to get stat replacement functions). * src/bin/NDview/Makefile.am: Do not copy data to toplevel build-directory. * src/bin/NDview/.cvsignore: Ignore Makefile, Makefile.in * configure.ac: Provide wrappers for stat and lstat and fstat. * data/Makefile.am: Include shaders into the distro. * .cvsignore: Ignore directories starting with "build". * data/shaders/hplastic.sl, data/shaders/hplastic.slo, data/shaders/README, data/shaders/hlight.sl, data/shaders/hlight.slo, data/shaders/hmatte.sl, data/shaders/hmatte.slo: Initial revision. * src/bin/orrery/configure.ac: Fixed configure.ac: AM_INIT_AUTOMAKE/AC_CONFIG_AUXDIR order. 2006-07-28 Claus-Justus Heine * src/bin/orrery/data/orr/.cvsignore: Initial revision. * src/bin/orrery/data/.cvsignore, src/bin/maniview/.cvsignore: The usual ignore blah. * src/bin/maniview/.cvsignore: The usual ignore stuff. * src/bin/maniview/Makefile.am: automake stuff. * src/bin/orrery/data/Makefile.am, src/bin/orrery/data/orr/Makefile.am, src/bin/orrery/Makefile.am: Automake stuff. * src/bin/orrery/.cvsignore: CVS ignore pattern. * src/bin/orrery/configure.ac, src/bin/orrery/configure.in: Renamed. * configure.ac: Restore PREFIX_DEFAULT to /usr/local/Geomview. * src/bin/NDview/ndview.c: Remove a debugging message. * src/bin/NDview/Makefile.am: Fiddle with vpath data installation. * src/lib/oogl/util/iobuffer.c: Programs seem to assume that rewind() just flushed the buffer of the input stream ... * src/lib/oogl/util/futil.c, src/lib/oogl/util/iobfutil.c: Use gv_htons() etc. * src/lib/oogl/util/malloc-debug.c: Remove a compiler warning. * src/lib/oogl/wa/Makefile.am: Only rebuild the parser with maintainer-mode enabled. * src/lib/oogl/lisp/Makefile.am: Do not remove clisp.[ch] with make distclean. * src/lib/oogl/lisp/lisp.c: AssignArgs() should not call va_end() itself (although va_end() is a no-op on many machines). * src/lib/mg/x11/mgx11dither.c, src/lib/mg/x11/mgx11draw.c, src/lib/mg/x11/mgx11render1.c, src/lib/mg/x11/mgx11render16.c, src/lib/mg/x11/mgx11render8.c, src/lib/mg/x11/mgx11shade.c, src/lib/mg/x11/mgx11windows.c, src/lib/mg/x11/mgx11.c, src/lib/mg/x11/mgx11clip.c: Compiler warnings. * src/bin/geomview/x11/Makefile.am: Probably clang.h, not clang.hy * src/bin/geomview/x11/gvcamui.c: Default to MGOPENGL if both, MGX11 and MGOPENGL are defined. * src/bin/geomview/x11/gvmain.c: Compiler warning (main without return type). * src/bin/animate/Makefile.am, src/bin/example/Makefile.am: Slight changes (library order or so, man-page installation). * src/bin/clipboard/.cvsignore: Initial revision. * src/bin/Makefile.am: Add some more modules. * doc/Makefile.am: Do not try to build maintainer-files when doing VPATH builds. * data/Makefile.am: Use "nobase_" prefix to properly install into subdirectories. * configure.ac: Always build mgx11 (needed for clipboar and does not hurt). Disable shared libraries by default 'cause I have problems with gcc-4.1.1 with the big libgeomview.so. Compiler error??? * .cvsignore: ignore it ignore it ignore it ignore it ... * src/bin/NDview/NDdemo, src/bin/NDview/NDview, src/bin/NDview/ndview.c, src/bin/NDview/testwish.c, src/bin/NDview/.cvsignore, src/bin/NDview/Makefile.am: Forthcoming NDview module, but needs more work. * src/bin/clipboard/clip.h, src/bin/clipboard/clipboard.c, src/bin/clipboard/clipboard.mib, src/bin/clipboard/clipx.c, src/bin/clipboard/Makefile.am: Initial revision. * src/bin/maniview/configure.in: Renamed to configure.ac * src/bin/hinge/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am, src/bin/cplxview/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/graffiti/Makefile.am: Install man-pages. 2006-07-27 Claus-Justus Heine * src/bin/Makefile.am, src/bin/geomutil/Makefile.am, src/bin/geomutil/clip/Makefile.am, src/bin/ginsu/Makefile.am, configure.ac: Some additional modules. * src/bin/gvclock/.cvsignore, src/bin/labeler/.cvsignore, src/bin/crayola/.cvsignore, src/bin/geomutil/hvectext/.cvsignore: The usual ignore stuff. * src/bin/geomutil/hvectext/Makefile.am, src/bin/geomutil/hvectext/hvectext.1, src/bin/geomutil/hvectext/hvectext.in, src/bin/crayola/Crayola, src/bin/crayola/Makefile.am, src/bin/crayola/callbacks.c, src/bin/crayola/callbacks.h, src/bin/crayola/crayola.1, src/bin/crayola/testwish.c, src/bin/crayola/tkcrayola.c, src/bin/crayola/ui.h, src/bin/labeler/Labeler, src/bin/labeler/Makefile.am, src/bin/labeler/labeler.c, src/bin/labeler/testwish.c, src/bin/gvclock/Makefile.am, src/bin/gvclock/gvclock.in, m4/check-package.m4, m4/frameworks.m4, m4/set-prefix.m4: Initial revision. * data/Makefile.am: Install group definitions. * data/groups/quart.4.gv, data/groups/sample.proj.dgp, data/groups/sample.uhs.dgp, data/groups/spaceshipSpace.geom, data/groups/tetra2.dgp, data/groups/wholecube.geom, data/groups/klein.wa, data/groups/klein_bricks.dgp, data/groups/klein_whole.dgp, data/groups/loop.1.gv, data/groups/loop.2.gv, data/groups/loop.3.gv, data/groups/loop.4.gv, data/groups/notknot.dgp, data/groups/quart.1.gv, data/groups/quart.2.gv, data/groups/quart.3.gv, data/groups/equi.3.gv, data/groups/equi.4.gv, data/groups/fig8.dgp, data/groups/g233.prj, data/groups/g234.prj, data/groups/g235.prj, data/groups/g236.prj, data/groups/g237.prj, data/groups/good_klein_quick.dgp, data/groups/hook.off, data/groups/br4.3.tlist, data/groups/dir.1.gv, data/groups/dir.2.gv, data/groups/dir.3.gv, data/groups/dir.4.gv, data/groups/dodec.vect, data/groups/equi.1.gv, data/groups/equi.2.gv, data/groups/94a.dgp, data/groups/94b.dgp, data/groups/borrom.dgp, data/groups/borrom2.dgp, data/groups/borrom3.dgp, data/groups/borrom4.dgp, data/groups/borrom4.wa, data/groups/br4.0.tlist, data/groups/br4.1.tlist, data/groups/br4.2.tlist, data/groups/101a.dgp, data/groups/101b.dgp, data/groups/120.dgp, data/groups/230data, data/groups/230data.Conway, data/groups/230data.lat, data/groups/230data.names, data/groups/3torus.dgp, data/groups/3torus2.dgp: Resurrected from Geomview v1.7 2006-07-27 Mark Phillips * src/lib/oogl/wa/fsaparse.3, AUTHORS, ChangeLog, README, doc/geomview.1, doc/geomview.texi, doc/lisp.3, doc/newsletter_article.txt, src/bin/animate/animate.1, src/bin/example/example.1, src/bin/flythrough/flyhelp, src/bin/flythrough/flyhelp.h, src/bin/flythrough/flythrough.1, src/bin/geomutil/bdy/bdy.1, src/bin/geomutil/maple2oogl/gvplot.mapleV3, src/bin/geomutil/maple2oogl/gvplot.mapleV4, src/bin/geomutil/maple2oogl/gvplot.mapleV8, src/bin/geomutil/math2oogl/OOGL.m, src/bin/geomutil/plutil/anytooff.1, src/bin/geomutil/plutil/offconsol.1, src/bin/geomutil/ucd/anytoucd.1, src/bin/geomutil/ucd/ucdtooff.1, src/bin/geomview/common/drawer.c, src/bin/geomview/geomview.1, src/bin/geomview/x11/gvcamui.c, src/bin/ginsu/ginsu.1, src/bin/hinge/hinge.1, src/bin/sweep/sweep.1, src/bin/sweep/sweep.3, src/bin/tackdown/tackdown.1, src/bin/transformer/transformer.1, src/lib/geomutil/bdy/bdy.3, src/lib/geomutil/geomutil.3, src/lib/geomutil/plutil/anytopl.3, src/lib/geomutil/plutil/plcombine.3, src/lib/geomutil/plutil/plconsol.3: updated contact info in docs and text files 2006-07-26 Claus-Justus Heine * AUTHORS, NEWS, README: Update some email addresses, time stamps, NEWs file. 2006-07-26 Lloyd Wood * INSTALL.Geomview: Pointing to Claus's new README.cvs textfile instead. * README: Updating credits list. * INSTALL.Geomview: Noting requirements for reconf to work. * reconf: Passing parameters through to the autoreconf command -- if reconf warns about --force to replace all files, saying reconf --force will do the expected thing. 2006-07-26 Claus-Justus Heine * src/bin/Makefile.am: Fix handling of XFORMS_SUBDIRS. 2006-07-25 Claus-Justus Heine * ChangeLog: Blah. * ChangeLog: *** empty log message *** * configure.ac: Bump version to 1.8.2-rc6 * src/bin/Makefile.am: hinge, cplxview and flythrough need xforms, disable when xforms is not found. 2006-07-24 Claus-Justus Heine * doc/Makefile.am: Don't include the PS version of the manual in the distro. * ChangeLog: Update. * configure.ac: Fogot to apply BE patch, bump version to rc5. * src/lib/oogl/util/futil.c, src/lib/oogl/util/iobfutil.c: Finally apply _AND_ commit (!) Rex Dieter's patch. * src/bin/stereo/stereo.c: Use PoolInputFile() instead of calling iobfileopen(stdin) a second time. * doc/Makefile.am: Fix pnm->png target. * src/lib/oogl/wa/Makefile.am: Fix dependencies. * doc/Makefile.am: Do not use convert, doesn't work on Cygwin (at least not for me). Use pnmtopng from the netpbm package. * configure.ac: Do not search for xforms dir in source/build directory. * configure: Do not keep it in CVS. * README.cvs: A list of tools needed to rebuild the documentation. * INSTALL.Geomview: Update xforms notice. 2006-07-22 Claus-Justus Heine * configure.ac: Bump version to rc4. 2006-07-20 Claus-Justus Heine * src/lib/aclib/Makefile.am: Should use LTLIBOBJS, not LIBOBJS. 2006-07-19 Claus-Justus Heine * Makefile.am: *** empty log message *** * Makefile.am: Blah * src/lib/oogl/util/iobuffer.c: Remove debugging statements. * src/lib/oogl/refcomm/streampool.c: Open named pipes RDWR to always leave one active writer, PoolSleepFor() is no longer necessary then. 2006-07-18 Claus-Justus Heine * src/lib/oogl/refcomm/streampool.c: Additional comments about why better opening a pipe in read-write mode; opening O_RDWR leaves at least one writer on the pipe: ourselves. This way select may work as usual ... * src/lib/oogl/refcomm/streampool.c: I'm still a little bit puzzled w.r.t. to named pipes and select and blocking/non-blocking IO. * src/lib/oogl/util/iobuffer.c: Correct handling of O_NONBLOCK if HAVE_FCNTL (for efficiency, if iobuffer.c is still broken, we have force HAVE_FCNTL to 0). 2006-07-16 Claus-Justus Heine * src/bin/maniview/.cvsignore, src/bin/maniview/INSTALL, src/bin/maniview/Makefile.am, src/bin/maniview/callbacks.c, src/bin/maniview/configure.ac, src/bin/maniview/controlpanel.c, src/bin/maniview/maniview.c, src/bin/maniview/maniview.h: Ported to new geomview stuff. * src/lib/oogl/util/iobuffer.c, src/lib/oogl/util/malloc-debug.c, src/lib/oogl/util/mallocp.c, src/lib/oogl/util/ooglutil.h, Makefile.am, configure, configure.ac, doc/Makefile.am, geomview.sh, src/bin/flythrough/Makefile.am, src/bin/hinge/Makefile.am, src/lib/fexpr/Makefile.am, src/lib/gprim/comment/commentcreate.c, src/lib/oogl/util/Makefile.am: Slight changes; named pipes must not be run in non-blocking mode, I think. 2006-07-15 Claus-Justus Heine * src/lib/oogl/refcomm/streampool.h, src/lib/oogl/util/findfile.c, src/lib/oogl/util/futil.c, src/lib/oogl/util/glob.c, src/lib/oogl/util/iobfutil.c, src/lib/oogl/util/iobuffer.c, src/lib/oogl/util/iobuffer.h, src/lib/oogl/util/mallocp.c, src/lib/oogl/util/porting.h, src/lib/oogl/util/vvec.c, src/lib/pointlist/pointlist.h, src/lib/shade/appearance.c, src/lib/shade/light.c, src/lib/window/window.c, src/lib/window/winstream.c, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/plnormal.c, src/lib/gprim/polylist/plpick.c, src/lib/gprim/polylist/plsave.c, src/lib/gprim/quad/quadbound.c, src/lib/gprim/quad/quadcopy.c, src/lib/gprim/quad/quadcreate.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/quad/quadevert.c, src/lib/gprim/quad/quadload.c, src/lib/gprim/quad/quadnormal.c, src/lib/gprim/quad/quadsave.c, src/lib/gprim/skel/skelbound.c, src/lib/gprim/skel/skelcreate.c, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/skel/skelpick.c, src/lib/gprim/tlist/tlcreate.c, src/lib/gprim/tlist/tltransform.c, src/lib/gprim/vect/vectbound.c, src/lib/gprim/vect/vectcreate.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/vect/vectload.c, src/lib/gprim/vect/vectpick.c, src/lib/gprim/vect/vectsave.c, src/lib/mg/buf/MGRdolines.h, src/lib/mg/buf/MGRline.h, src/lib/mg/buf/mgbuf.c, src/lib/mg/buf/mgbufdraw.c, src/lib/mg/common/mg.c, src/lib/mg/common/mgshade.c, src/lib/mg/common/mgtexture.c, src/lib/mg/opengl/mgopengl.c, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/opengl/mgopenglmesh.c, src/lib/mg/opengl/mgopenglshade.c, src/lib/mg/ps/mgps.c, src/lib/mg/ps/mgpsdraw.c, src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/x11/mgx11.c, src/lib/mg/x11/mgx11dither.c, src/lib/mg/x11/mgx11draw.c, src/lib/mg/x11/mgx11shade.c, src/lib/oogl/lisp/lisp.c, src/lib/oogl/refcomm/handle.c, src/lib/oogl/refcomm/handle.h, src/lib/oogl/refcomm/reference.c, src/lib/oogl/refcomm/streampool.c, src/lib/gprim/bezier/bezsave.c, src/lib/gprim/comment/commentcreate.c, src/lib/gprim/comment/commentsave.c, src/lib/gprim/comment/commentstream.c, src/lib/gprim/discgrp/complex.c, src/lib/gprim/discgrp/dgbound.c, src/lib/gprim/discgrp/dgcopy.c, src/lib/gprim/discgrp/dgcreate.c, src/lib/gprim/discgrp/dgdirdom.c, src/lib/gprim/discgrp/dgdraw.c, src/lib/gprim/discgrp/dgenum.c, src/lib/gprim/discgrp/matlist.c, src/lib/gprim/discgrp/projective.c, src/lib/gprim/discgrp/xform.c, src/lib/gprim/geom/class.c, src/lib/gprim/geom/create.c, src/lib/gprim/geom/extend.c, src/lib/gprim/geom/geomstream.c, src/lib/gprim/geom/iterate.c, src/lib/gprim/geom/knownclass.c, src/lib/gprim/geom/pick.c, src/lib/gprim/inst/instbound.c, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instmisc.c, src/lib/gprim/inst/instsphere.c, src/lib/gprim/inst/inststream.c, src/lib/gprim/lincoln/lincolnload.c, src/lib/gprim/list/listcreate.c, src/lib/gprim/list/listdraw.c, src/lib/gprim/list/listmisc.c, src/lib/gprim/list/listpick.c, src/lib/gprim/list/listsphere.c, src/lib/gprim/mesh/meshbound.c, src/lib/gprim/mesh/meshcopy.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/mesh/meshload.c, src/lib/gprim/mesh/meshnormal.c, src/lib/gprim/mesh/meshpick.c, src/lib/gprim/mesh/meshsave.c, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/ndmesh/ndmeshsave.c, src/lib/gprim/npolylist/nplcreate.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/nplsave.c, src/lib/gprim/polylist/plbound.c, src/lib/gprim/polylist/plcopy.c, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/polylist/plevert.c, src/bin/geomutil/oogl2vrml/oogl2vrml2.c, src/bin/geomutil/plutil/polymerge.c, src/bin/geomutil/ucd/anytoucd.c, src/bin/geomutil/ucd/stack.c, src/bin/geomview/common/comm.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/event.c, src/bin/geomview/common/lispext.c, src/bin/geomview/common/shaders.c, src/bin/geomview/common/space.c, src/bin/geomview/common/ui.c, src/bin/geomview/common/ui.h, src/bin/geomview/common/worldio.c, src/bin/geomview/x11/gvcamui.c, src/bin/geomview/x11/gvmnpanel.c, src/bin/geomview/x11/gvtoolui.c, src/bin/hinge/panel.c, src/lib/aclib/alloca.c, src/lib/aclib/putenv.c, src/lib/camera/camcompat.c, src/lib/camera/camera.c, src/lib/camera/camstream.c, src/lib/color/mergein.c, src/lib/color/mergeout.c, src/lib/color/mergeover.c, src/lib/color/mergeunder.c, src/lib/color/paintcopy.c, src/lib/color/paintover.c, src/lib/fexpr/lex.yy.c, src/lib/forms/xforms-compat.h, src/lib/geometry/hpoint3/hg4.c, src/lib/geometry/hpoint3/hpoint3.c, src/lib/geometry/hpointn/hpointnb.c, src/lib/geometry/point3/point3.c, src/lib/geometry/point3/segments.c, src/lib/geometry/transform3/ctm3rotate.c, src/lib/geometry/transform3/ctm3scale.c, src/lib/geometry/transform3/ctm3translate.c, src/lib/geometry/transform3/tm3adjoint.c, src/lib/geometry/transform3/tm3concat.c, src/lib/geometry/transform3/tm3invert.c, src/lib/geometry/transform3/tm3transpose.c, src/lib/geometry/transformn/transformn.c, src/lib/geometry/transobj/transobj.c, src/lib/geomutil/plutil/anytopl.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/bbox/bboxtransform.c, src/lib/gprim/bbox/bboxunion.c, src/lib/gprim/bezier/bezbound.c, src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezevert.c, src/bin/animate/glob.c, src/bin/animate/glob.h, src/bin/cplxview/computegraph.c, src/bin/example/oogl.c: Do not use the "register" keyword. Modern compilers do this kind of stuff themselves. * configure.ac: Unix domain socket stuff (listen, accept, socket etc) * m4/geom_local.m4: configure.in -> configure.ac * doc/Makefile.am: Do not delete html and pdf with "make clean". * src/lib/oogl/util/glibglue.C, src/lib/oogl/util/seekpipe.c: No longer needed. 2006-07-14 Claus-Justus Heine * src/lib/aclib/strcasecmp.c, src/lib/aclib/strdup.c, src/lib/aclib/strncasecmp.c, src/lib/aclib/acosh.c, src/lib/aclib/popen.c, src/lib/aclib/putenv.c: Initial revision, copied here from "porting.c" * src/lib/oogl/util/ppopen.c, src/lib/oogl/util/vvec.c, src/lib/pointlist/pointlist.c, src/lib/pointlist/ptlBezier.c, src/lib/pointlist/ptlInst.c, src/lib/pointlist/ptlList.c, src/lib/pointlist/ptlMesh.c, src/lib/pointlist/ptlPolylist.c, src/lib/pointlist/ptlQuad.c, src/lib/pointlist/ptlVect.c, src/lib/shade/appearance.c, src/lib/shade/apstream.c, src/lib/shade/light.c, src/lib/window/window.c, src/lib/window/winstream.c, src/lib/mib/mibDrawArea.c, src/lib/mib/mibFrame.c, src/lib/mib/mibLabel.c, src/lib/mib/mibList.c, src/lib/mib/mibMenu.c, src/lib/mib/mibRadioBox.c, src/lib/mib/mibScale.c, src/lib/mib/mibScrollBar.c, src/lib/mib/mibTextBig.c, src/lib/mib/mibTextBox.c, src/lib/mib/mibToggle.c, src/lib/mib/mibload.c, src/lib/oogl/refcomm/handle.c, src/lib/oogl/refcomm/reference.c, src/lib/oogl/refcomm/streampool.c, src/lib/oogl/refcomm/streampool.h, src/lib/oogl/util/Makefile.am, src/lib/oogl/util/error.c, src/lib/oogl/util/findfile.c, src/lib/oogl/util/fsa.c, src/lib/oogl/util/glob.c, src/lib/oogl/util/iobuffer.c, src/lib/oogl/util/mallocp.c, src/lib/oogl/util/porting.c, src/lib/oogl/util/porting.h, src/lib/mg/buf/mgbufrender.c, src/lib/mg/buf/mgbufrender24.c, src/lib/mg/common/mg.c, src/lib/mg/common/mgshade.c, src/lib/mg/common/mgtexture.c, src/lib/mg/opengl/mgopengl.c, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/opengl/mgopenglmesh.c, src/lib/mg/opengl/mgopenglshade.c, src/lib/mg/ps/mgps.c, src/lib/mg/ps/mgpsclip.c, src/lib/mg/ps/mgpsdraw.c, src/lib/mg/ps/mgpstri.c, src/lib/mg/ps/mgpswindows.c, src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.c, src/lib/mg/rib/mgributil.c, src/lib/mg/x11/mgx11.c, src/lib/mg/x11/mgx11clip.c, src/lib/mg/x11/mgx11dither.c, src/lib/mg/x11/mgx11draw.c, src/lib/mg/x11/mgx11render1.c, src/lib/mg/x11/mgx11render16.c, src/lib/mg/x11/mgx11render8.c, src/lib/mg/x11/mgx11shade.c, src/lib/mg/x11/mgx11visual.c, src/lib/mg/x11/mgx11windows.c, src/lib/mib/mibButton.c, src/lib/gprim/stub/inst.c, src/lib/gprim/stub/lincoln.c, src/lib/gprim/stub/list.c, src/lib/gprim/stub/mesh.c, src/lib/gprim/stub/ndmesh.c, src/lib/gprim/stub/npolylist.c, src/lib/gprim/stub/polylist.c, src/lib/gprim/stub/quad.c, src/lib/gprim/stub/skel.c, src/lib/gprim/stub/sphere.c, src/lib/gprim/stub/stub.c, src/lib/gprim/stub/stubdraw.c, src/lib/gprim/stub/tlist.c, src/lib/gprim/stub/vect.c, src/lib/gprim/tlist/tlclass.c, src/lib/gprim/tlist/tlcreate.c, src/lib/gprim/tlist/tlstream.c, src/lib/gprim/tlist/tltransform.c, src/lib/gprim/vect/vectbound.c, src/lib/gprim/vect/vectclass.c, src/lib/gprim/vect/vectcreate.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/vect/vectload.c, src/lib/gprim/vect/vectpick.c, src/lib/gprim/vect/vectsave.c, src/lib/gprim/vect/vectsphere.c, src/lib/gprim/vect/vecttransform.c, src/lib/mg/buf/mgbuf.c, src/lib/mg/buf/mgbufclip.c, src/lib/mg/buf/mgbufdraw.c, src/lib/gprim/polylist/plevert.c, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/plnormal.c, src/lib/gprim/polylist/plpick.c, src/lib/gprim/polylist/plsave.c, src/lib/gprim/polylist/plsphere.c, src/lib/gprim/polylist/pltransform.c, src/lib/gprim/quad/quadbound.c, src/lib/gprim/quad/quadclass.c, src/lib/gprim/quad/quadcopy.c, src/lib/gprim/quad/quadcreate.c, src/lib/gprim/quad/quaddelete.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/quad/quadevert.c, src/lib/gprim/quad/quadload.c, src/lib/gprim/quad/quadnormal.c, src/lib/gprim/quad/quadpick.c, src/lib/gprim/quad/quadsave.c, src/lib/gprim/quad/quadsphere.c, src/lib/gprim/quad/quadtransform.c, src/lib/gprim/skel/skelbound.c, src/lib/gprim/skel/skelclass.c, src/lib/gprim/skel/skelcreate.c, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/skel/skelload.c, src/lib/gprim/skel/skelpick.c, src/lib/gprim/skel/skelsave.c, src/lib/gprim/skel/skeltransform.c, src/lib/gprim/sphere/sphereclass.c, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/sphere/sphereload.c, src/lib/gprim/sphere/spheremisc.c, src/lib/gprim/sphere/spheresave.c, src/lib/gprim/stub/bbox.c, src/lib/gprim/stub/bezier.c, src/lib/gprim/stub/bezierlist.c, src/lib/gprim/stub/comment.c, src/lib/gprim/stub/discgrp.c, src/lib/gprim/mesh/meshevert.c, src/lib/gprim/mesh/meshload.c, src/lib/gprim/mesh/meshnormal.c, src/lib/gprim/mesh/meshpick.c, src/lib/gprim/mesh/meshsave.c, src/lib/gprim/mesh/meshsphere.c, src/lib/gprim/mesh/meshtransform.c, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/ndmesh/ndmeshclass.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/ndmesh/ndmeshload.c, src/lib/gprim/ndmesh/ndmeshsave.c, src/lib/gprim/npolylist/nplbound.c, src/lib/gprim/npolylist/nplclass.c, src/lib/gprim/npolylist/nplcopy.c, src/lib/gprim/npolylist/nplcreate.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/nplsave.c, src/lib/gprim/polylist/plbound.c, src/lib/gprim/polylist/plclass.c, src/lib/gprim/polylist/plcopy.c, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/inst/instclass.c, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instdraw.c, src/lib/gprim/inst/instmisc.c, src/lib/gprim/inst/instpick.c, src/lib/gprim/inst/instsphere.c, src/lib/gprim/inst/inststream.c, src/lib/gprim/lincoln/lincolnclass.c, src/lib/gprim/lincoln/lincolnload.c, src/lib/gprim/list/listclass.c, src/lib/gprim/list/listcreate.c, src/lib/gprim/list/listdraw.c, src/lib/gprim/list/listmisc.c, src/lib/gprim/list/listpick.c, src/lib/gprim/list/listsphere.c, src/lib/gprim/list/liststream.c, src/lib/gprim/mesh/meshbound.c, src/lib/gprim/mesh/meshclass.c, src/lib/gprim/mesh/meshcopy.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshdelete.c, src/lib/gprim/mesh/meshdice.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/discgrp/dgpick.c, src/lib/gprim/discgrp/dgsave.c, src/lib/gprim/discgrp/dgstream.c, src/lib/gprim/discgrp/dgtransform.c, src/lib/gprim/discgrp/dhpoint3.c, src/lib/gprim/discgrp/matlist.c, src/lib/gprim/discgrp/outstack.c, src/lib/gprim/discgrp/polyhedron.c, src/lib/gprim/discgrp/projective.c, src/lib/gprim/discgrp/stack.c, src/lib/gprim/discgrp/util.c, src/lib/gprim/discgrp/weeks_dirdom.c, src/lib/gprim/discgrp/xform.c, src/lib/gprim/geom/bound.c, src/lib/gprim/geom/boundsphere.c, src/lib/gprim/geom/class.c, src/lib/gprim/geom/copy.c, src/lib/gprim/geom/create.c, src/lib/gprim/geom/delete.c, src/lib/gprim/geom/dice.c, src/lib/gprim/geom/draw.c, src/lib/gprim/geom/evert.c, src/lib/gprim/geom/extend.c, src/lib/gprim/geom/geomstream.c, src/lib/gprim/geom/handlescan.c, src/lib/gprim/geom/iterate.c, src/lib/gprim/geom/knownclass.c, src/lib/gprim/geom/message.c, src/lib/gprim/geom/name.c, src/lib/gprim/geom/pick.c, src/lib/gprim/geom/replace.c, src/lib/gprim/geom/transform.c, src/lib/gprim/inst/instbound.c, src/lib/gprim/bezier/bezbound.c, src/lib/gprim/bezier/bezclass.c, src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezdice.c, src/lib/gprim/bezier/bezdraw.c, src/lib/gprim/bezier/bezevert.c, src/lib/gprim/bezier/bezload.c, src/lib/gprim/bezier/bezpick.c, src/lib/gprim/bezier/bezsave.c, src/lib/gprim/bezier/bezsphere.c, src/lib/gprim/bezier/beztransform.c, src/lib/gprim/comment/commentclass.c, src/lib/gprim/comment/commentcreate.c, src/lib/gprim/comment/commentsave.c, src/lib/gprim/comment/commentstream.c, src/lib/gprim/discgrp/colormap.c, src/lib/gprim/discgrp/complex.c, src/lib/gprim/discgrp/dgbound.c, src/lib/gprim/discgrp/dgclass.c, src/lib/gprim/discgrp/dgconstraint.c, src/lib/gprim/discgrp/dgcopy.c, src/lib/gprim/discgrp/dgcreate.c, src/lib/gprim/discgrp/dgdelete.c, src/lib/gprim/discgrp/dgdirdom.c, src/lib/gprim/discgrp/dgdraw.c, src/lib/gprim/discgrp/dgenum.c, src/lib/gprim/discgrp/dgevert.c, src/lib/gprim/discgrp/dgmisc.c, src/lib/geometry/transform3/tm3stack.c, src/lib/geometry/transform3/tm3tetrad.c, src/lib/geometry/transform3/tm3translate.c, src/lib/geometry/transform3/tm3transpose.c, src/lib/geometry/transformn/transformn.c, src/lib/geometry/transobj/transobj.c, src/lib/geomutil/bdy/bdy.c, src/lib/geomutil/crayplutil/crayBezier.c, src/lib/geomutil/crayplutil/crayInst.c, src/lib/geomutil/crayplutil/crayList.c, src/lib/geomutil/crayplutil/crayMesh.c, src/lib/geomutil/crayplutil/crayPolylist.c, src/lib/geomutil/crayplutil/crayQuad.c, src/lib/geomutil/crayplutil/crayVect.c, src/lib/geomutil/crayplutil/crayola.c, src/lib/geomutil/dim/dim.c, src/lib/geomutil/plutil/anytopl.c, src/lib/geomutil/plutil/plcombine.c, src/lib/geomutil/plutil/plconsol.c, src/lib/gprim/bbox/bboxbound.c, src/lib/gprim/bbox/bboxclass.c, src/lib/gprim/bbox/bboxcopy.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/bbox/bboxload.c, src/lib/gprim/bbox/bboxminmax.c, src/lib/gprim/bbox/bboxsave.c, src/lib/gprim/bbox/bboxtransform.c, src/lib/gprim/bbox/bboxunion.c, src/lib/geometry/hpoint3/hpoint3b.c, src/lib/geometry/hpointn/hpointn.c, src/lib/geometry/hpointn/hpointnb.c, src/lib/geometry/point3/point3.c, src/lib/geometry/point3/polyint.c, src/lib/geometry/point3/segments.c, src/lib/geometry/transform3/ctm3align.c, src/lib/geometry/transform3/ctm3ortho.c, src/lib/geometry/transform3/ctm3persp.c, src/lib/geometry/transform3/ctm3perspfov.c, src/lib/geometry/transform3/ctm3rotate.c, src/lib/geometry/transform3/ctm3scale.c, src/lib/geometry/transform3/ctm3tetrad.c, src/lib/geometry/transform3/ctm3translate.c, src/lib/geometry/transform3/tm3adjoint.c, src/lib/geometry/transform3/tm3align.c, src/lib/geometry/transform3/tm3concat.c, src/lib/geometry/transform3/tm3conjugate.c, src/lib/geometry/transform3/tm3copy.c, src/lib/geometry/transform3/tm3dual.c, src/lib/geometry/transform3/tm3identity.c, src/lib/geometry/transform3/tm3invert.c, src/lib/geometry/transform3/tm3ortho.c, src/lib/geometry/transform3/tm3persp.c, src/lib/geometry/transform3/tm3perspfov.c, src/lib/geometry/transform3/tm3print.c, src/lib/geometry/transform3/tm3rotate.c, src/lib/geometry/transform3/tm3scale.c, src/lib/color/color.c, src/lib/color/mergein.c, src/lib/color/mergeout.c, src/lib/color/mergeover.c, src/lib/color/mergeplus.c, src/lib/color/mergeunder.c, src/lib/color/paintcopy.c, src/lib/color/paintover.c, src/lib/fexpr/binfuncs.c, src/lib/fexpr/complex.c, src/lib/fexpr/evaluate.c, src/lib/fexpr/exprs.c, src/lib/fexpr/lex.yy.c, src/lib/fexpr/monfuncs.c, src/lib/fexpr/real.c, src/lib/fexpr/vars.c, src/lib/geometry/cmodel/cm_geometry.c, src/lib/geometry/cmodel/cmodel.c, src/lib/geometry/cmodel/cmodel_data.c, src/lib/geometry/hpoint3/hg4.c, src/lib/geometry/hpoint3/hline3.c, src/lib/geometry/hpoint3/hplane3.c, src/lib/geometry/hpoint3/hpoint3.c, src/lib/geometry/hpoint3/hpoint3a.c, src/bin/geomview/x11/gvappear.c, src/bin/geomview/x11/gvcameras.c, src/bin/geomview/x11/gvcolor.c, src/bin/geomview/x11/gvcommands.c, src/bin/geomview/x11/gvcredits.c, src/bin/geomview/x11/gvevent.c, src/bin/geomview/x11/gvfiles.c, src/bin/geomview/x11/gvlights.c, src/bin/geomview/x11/gvload.c, src/bin/geomview/x11/gvmain.c, src/bin/geomview/x11/gvmaterial.c, src/bin/geomview/x11/gvmnpanel.c, src/bin/geomview/x11/gvsave.c, src/bin/geomview/x11/gvtoolui.c, src/bin/geomview/x11/gvui.c, src/bin/togeomview/Makefile.am, src/bin/togeomview/togeomview.c, src/lib/Makefile.am, src/lib/camera/camcompat.c, src/lib/camera/camera.c, src/lib/camera/camstream.c, src/bin/geomview/common/ndshade.c, src/bin/geomview/common/rman.c, src/bin/geomview/common/shaders.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c, src/bin/geomview/common/ui.c, src/bin/geomview/common/version.h, src/bin/geomview/common/worldio.c, src/bin/geomview/common/mouse.c, src/bin/animate/glob.c, src/bin/animate/xanimate.c, src/bin/geomutil/math2oogl/math2oogl.c, src/bin/geomutil/vrml2oogl/Makefile.am, src/bin/geomview/common/comm.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/event.c, src/bin/geomview/common/lang.c, src/bin/geomview/common/lights.c, src/bin/geomview/common/lispext.c, src/bin/geomview/common/main.c, src/bin/geomview/common/motion.c, configure, configure.ac, doc/Makefile.am, src/bin/animate/animate.c: Mostly cosmetic changes, still something wrong ... * src/lib/oogl/util/Makefile.am, src/lib/oogl/util/error.c, src/lib/oogl/util/futil.c, src/lib/oogl/util/glob.c, src/lib/oogl/util/iobfutil.c, src/lib/oogl/util/iobuffer.c, src/lib/oogl/util/iobuffer.h, src/lib/oogl/util/ooglutil.h, src/lib/oogl/wa/.cvsignore, src/lib/oogl/wa/Makefile.am, src/lib/pointlist/.cvsignore, src/lib/pointlist/Makefile.am, src/lib/shade/.cvsignore, src/lib/shade/Makefile.am, src/lib/shade/appearance.c, src/lib/shade/appearance.h, src/lib/shade/light.c, src/lib/window/.cvsignore, src/lib/window/Makefile.am, src/lib/window/winstream.c, src/lib/gprim/npolylist/Makefile.am, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/npolylist.h, src/lib/gprim/polylist/.cvsignore, src/lib/gprim/polylist/Makefile.am, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/polylist.h, src/lib/gprim/quad/.cvsignore, src/lib/gprim/quad/Makefile.am, src/lib/gprim/quad/quad.h, src/lib/gprim/quad/quadload.c, src/lib/gprim/skel/.cvsignore, src/lib/gprim/skel/Makefile.am, src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelload.c, src/lib/gprim/sphere/.cvsignore, src/lib/gprim/sphere/Makefile.am, src/lib/gprim/sphere/sphereP.h, src/lib/gprim/sphere/sphereload.c, src/lib/gprim/stub/.cvsignore, src/lib/gprim/stub/Makefile.am, src/lib/gprim/tlist/.cvsignore, src/lib/gprim/tlist/Makefile.am, src/lib/gprim/tlist/tlstream.c, src/lib/gprim/vect/.cvsignore, src/lib/gprim/vect/Makefile.am, src/lib/gprim/vect/vectload.c, src/lib/mg/.cvsignore, src/lib/mg/Makefile.am, src/lib/mg/buf/.cvsignore, src/lib/mg/buf/Makefile.am, src/lib/mg/common/.cvsignore, src/lib/mg/common/Makefile.am, src/lib/mg/common/mgtexture.c, src/lib/mg/opengl/.cvsignore, src/lib/mg/opengl/Makefile.am, src/lib/mg/ps/.cvsignore, src/lib/mg/ps/Makefile.am, src/lib/mg/rib/.cvsignore, src/lib/mg/rib/Makefile.am, src/lib/mg/x11/.cvsignore, src/lib/mg/x11/Makefile.am, src/lib/mib/.cvsignore, src/lib/oogl/.cvsignore, src/lib/oogl/Makefile.am, src/lib/oogl/lisp/.cvsignore, src/lib/oogl/lisp/Makefile.am, src/lib/oogl/lisp/lisp.c, src/lib/oogl/lisp/lisp.h, src/lib/oogl/refcomm/.cvsignore, src/lib/oogl/refcomm/Makefile.am, src/lib/oogl/refcomm/handleP.h, src/lib/oogl/refcomm/streampool.c, src/lib/oogl/refcomm/streampool.h, src/lib/oogl/util/.cvsignore, src/lib/oogl/util/Headers, src/lib/geometry/transobj/transobj.c, src/lib/geomutil/.cvsignore, src/lib/geomutil/bdy/.cvsignore, src/lib/geomutil/bdy/Makefile.am, src/lib/geomutil/crayplutil/.cvsignore, src/lib/geomutil/crayplutil/Makefile.am, src/lib/geomutil/dim/.cvsignore, src/lib/geomutil/dim/Makefile.am, src/lib/geomutil/plutil/.cvsignore, src/lib/geomutil/plutil/Makefile.am, src/lib/geomutil/plutil/anytopl.c, src/lib/gprim/.cvsignore, src/lib/gprim/bbox/.cvsignore, src/lib/gprim/bbox/Makefile.am, src/lib/gprim/bbox/bboxload.c, src/lib/gprim/bezier/.cvsignore, src/lib/gprim/bezier/Makefile.am, src/lib/gprim/bezier/bezload.c, src/lib/gprim/comment/.cvsignore, src/lib/gprim/comment/Makefile.am, src/lib/gprim/comment/commentstream.c, src/lib/gprim/discgrp/.cvsignore, src/lib/gprim/discgrp/Makefile.am, src/lib/gprim/discgrp/complex.h, src/lib/gprim/discgrp/dgstream.c, src/lib/gprim/geom/.cvsignore, src/lib/gprim/geom/Makefile.am, src/lib/gprim/geom/geom.h, src/lib/gprim/geom/geomclass.h, src/lib/gprim/geom/geomstream.c, src/lib/gprim/inst/.cvsignore, src/lib/gprim/inst/Makefile.am, src/lib/gprim/inst/inststream.c, src/lib/gprim/lincoln/.cvsignore, src/lib/gprim/lincoln/Makefile.am, src/lib/gprim/lincoln/lincolnload.c, src/lib/gprim/list/.cvsignore, src/lib/gprim/list/Makefile.am, src/lib/gprim/list/liststream.c, src/lib/gprim/mesh/.cvsignore, src/lib/gprim/mesh/Makefile.am, src/lib/gprim/mesh/mesh.h, src/lib/gprim/mesh/meshload.c, src/lib/gprim/ndmesh/.cvsignore, src/lib/gprim/ndmesh/Makefile.am, src/lib/gprim/ndmesh/ndmesh.h, src/lib/gprim/ndmesh/ndmeshload.c, src/lib/gprim/npolylist/.cvsignore, src/bin/graffiti/graffiti.h, src/bin/graffiti/gui.c, src/bin/graffiti/lang.c, src/bin/graffiti/lang.h, src/bin/hinge/.cvsignore, src/bin/hinge/Makefile.am, src/bin/hinge/hinge.c, src/bin/hinge/hinge.h, src/bin/hinge/hui.c, src/bin/hinge/hui.h, src/bin/hinge/lang.c, src/bin/hinge/lang.h, src/bin/stereo/.cvsignore, src/bin/stereo/Makefile.am, src/bin/stereo/stereo.c, src/bin/sweep/.cvsignore, src/bin/sweep/Makefile.am, src/bin/sweep/sweep.main.c, src/bin/tackdown/.cvsignore, src/bin/tackdown/Makefile.am, src/bin/tackdown/origin.common.c, src/bin/tackdown/tackdown.main.c, src/bin/togeomview/.cvsignore, src/bin/transformer/.cvsignore, src/bin/transformer/Makefile.am, src/lib/.cvsignore, src/lib/Makefile.am, src/lib/aclib/.cvsignore, src/lib/camera/.cvsignore, src/lib/camera/Makefile.am, src/lib/camera/camcompat.c, src/lib/camera/camera.h, src/lib/camera/camstream.c, src/lib/color/.cvsignore, src/lib/color/Makefile.am, src/lib/fexpr/.cvsignore, src/lib/fexpr/Makefile.am, src/lib/forms/.cvsignore, src/lib/geometry/.cvsignore, src/lib/geometry/cmodel/.cvsignore, src/lib/geometry/cmodel/Makefile.am, src/lib/geometry/hpoint3/.cvsignore, src/lib/geometry/hpoint3/Makefile.am, src/lib/geometry/hpointn/.cvsignore, src/lib/geometry/hpointn/Makefile.am, src/lib/geometry/point3/.cvsignore, src/lib/geometry/point3/Makefile.am, src/lib/geometry/transform3/.cvsignore, src/lib/geometry/transform3/Makefile.am, src/lib/geometry/transformn/.cvsignore, src/lib/geometry/transformn/Makefile.am, src/lib/geometry/transformn/transformn.c, src/lib/geometry/transformn/transformn.h, src/lib/geometry/transobj/.cvsignore, src/lib/geometry/transobj/Makefile.am, src/bin/flythrough/data/.cvsignore, src/bin/flythrough/main.c, src/bin/flythrough/panel.h, src/bin/geomutil/.cvsignore, src/bin/geomutil/bdy/.cvsignore, src/bin/geomutil/bdy/Makefile.am, src/bin/geomutil/bdy/bdy.c, src/bin/geomutil/clip/.cvsignore, src/bin/geomutil/clip/Makefile.am, src/bin/geomutil/clip/clipmain.c, src/bin/geomutil/maple2oogl/.cvsignore, src/bin/geomutil/maple2oogl/gvplot.mapleV8, src/bin/geomutil/maple2oogl/gvplot.mws, src/bin/geomutil/maple2oogl/savegvplot.mws, src/bin/geomutil/math2oogl/.cvsignore, src/bin/geomutil/oogl2rib/.cvsignore, src/bin/geomutil/oogl2rib/Makefile.am, src/bin/geomutil/oogl2rib/oogl2rib.c, src/bin/geomutil/oogl2vrml/.cvsignore, src/bin/geomutil/oogl2vrml/Makefile.am, src/bin/geomutil/oogl2vrml/oogl2vrml.c, src/bin/geomutil/oogl2vrml/oogl2vrml2.c, src/bin/geomutil/plutil/.cvsignore, src/bin/geomutil/plutil/Makefile.am, src/bin/geomutil/plutil/anytooff.main.c, src/bin/geomutil/plutil/bez2mesh.c, src/bin/geomutil/plutil/offconsol.main.c, src/bin/geomutil/plutil/polymerge.c, src/bin/geomutil/ucd/.cvsignore, src/bin/geomutil/ucd/Makefile.am, src/bin/geomutil/ucd/anytoucd.c, src/bin/geomutil/ucd/ucdtooff.c, src/bin/geomutil/vrml2oogl/.cvsignore, src/bin/geomutil/vrml2oogl/lib/.cvsignore, src/bin/geomview/.cvsignore, src/bin/geomview/common/.cvsignore, src/bin/geomview/common/comm.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/lights.c, src/bin/geomview/common/lispext.c, src/bin/geomview/common/worldio.c, src/bin/geomview/x11/.cvsignore, src/bin/geomview/x11/Makefile.am, src/bin/geomview/x11/bitmaps/.cvsignore, src/bin/geomview/x11/gvcamui.c, src/bin/geomview/x11/gvsave.c, src/bin/geomview/x11/interface/.cvsignore, src/bin/ginsu/.cvsignore, src/bin/ginsu/Makefile.am, src/bin/ginsu/ginsu.c, src/bin/graffiti/.cvsignore, src/bin/graffiti/Makefile.am, src/bin/graffiti/graffiti.c, .cvsignore, INSTALL.Geomview, README.cvs, configure, configure.ac, data/.cvsignore, data/geom/.cvsignore, data/geom/pieces/.cvsignore, data/geom/polyhedra/.cvsignore, data/geom/spherical/.cvsignore, data/geom/textured/.cvsignore, doc/.cvsignore, doc/figs/.cvsignore, geomview.sh, m4/.cvsignore, src/.cvsignore, src/bin/.cvsignore, src/bin/Makefile.am, src/bin/animate/.cvsignore, src/bin/animate/Makefile.am, src/bin/animate/interface/.cvsignore, src/bin/cplxview/.cvsignore, src/bin/cplxview/Makefile.am, src/bin/cplxview/computegraph.c, src/bin/cplxview/cplxview.c, src/bin/example/.cvsignore, src/bin/example/Makefile.am, src/bin/flythrough/.cvsignore, src/bin/flythrough/Makefile.am: * use one shared library (i.e. libgeomview.so) * do not use undocumented stdio internals * src/lib/aclib/fmemopen.c -- fmemopen replacement * src/lib/oogl/utilt/iobuffer.[ch] -- totally buffered input, with seekback (pipes) * a bunch of autoconf changes * OpenGL is optional again * reenable hinge module * reenable flythrough module * reenable cplxview module * src/lib/aclib/Makefile.am, src/lib/aclib/alloca.c, src/lib/aclib/fmemopen.c, src/lib/aclib/lstat.c, src/lib/aclib/memcmp.c, src/lib/aclib/stat.c, src/lib/aclib/strtod.c: Initial revision. 2006-07-11 Claus-Justus Heine * src/lib/oogl/util/iobuffer.c: Initial revision, not working yet. 2006-07-10 Claus-Justus Heine * src/lib/pointlist/ptlInst.c, src/lib/pointlist/ptlList.c, src/lib/pointlist/ptlMesh.c, src/lib/pointlist/ptlPolylist.c, src/lib/pointlist/ptlQuad.c, src/lib/pointlist/ptlVect.c, src/lib/geomutil/crayplutil/crayMesh.c, src/lib/geomutil/crayplutil/crayPolylist.c, src/lib/geomutil/crayplutil/crayQuad.c, src/lib/geomutil/crayplutil/crayVect.c, src/lib/geomutil/crayplutil/crayola.c, src/lib/geomutil/dim/dim.c, src/lib/oogl/lisp/lisp.c, src/lib/oogl/refcomm/streampool.c, src/lib/pointlist/pointlist.c, src/lib/pointlist/ptlBezier.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/lispext.c, src/bin/geomview/common/space.c, src/bin/geomview/x11/gvappear.c, src/bin/geomview/x11/gvcameras.c, src/bin/geomview/x11/gvcamui.c, src/bin/geomview/x11/gvcolor.c, src/bin/geomview/x11/gvevent.c, src/bin/geomview/x11/gvmaterial.c, src/bin/geomview/x11/gvmnpanel.c, src/bin/geomview/x11/gvsave.c, src/bin/geomview/x11/gvtoolui.c, src/lib/geomutil/crayplutil/crayBezier.c, src/lib/geomutil/crayplutil/crayInst.c, src/lib/geomutil/crayplutil/crayList.c: Remove a couple of "cast from pointer to integer of different size" warnings (and vice versa). 2006-07-08 Claus-Justus Heine * .cvsignore, doc/.cvsignore, src/bin/.cvsignore, src/bin/animate/.cvsignore, src/bin/example/.cvsignore, src/bin/geomutil/bdy/.cvsignore, src/bin/geomutil/oogl2vrml/.cvsignore, src/bin/geomview/x11/.cvsignore, src/lib/geometry/cmodel/.cvsignore: Ignore some stuff. * src/lib/mib/mibTextBox.c, src/lib/mib/mibToggle.c, src/lib/mib/mibload.c, src/lib/mib/mibload.h, src/lib/oogl/lisp/lisp.c, src/lib/oogl/lisp/lisp.h, src/lib/oogl/refcomm/handle.c, src/lib/oogl/refcomm/reference.c, src/lib/oogl/refcomm/streampool.c, src/lib/oogl/util/error.c, src/lib/oogl/util/findfile.c, src/lib/oogl/util/fsa.c, src/lib/oogl/util/futil.c, src/lib/oogl/util/glob.c, src/lib/oogl/util/mallocp.c, src/lib/oogl/util/porting.c, src/lib/oogl/util/ppopen.c, src/lib/oogl/util/seekpipe.c, src/lib/oogl/util/vvec.c, src/lib/oogl/wa/Makefile.am, src/lib/oogl/wa/fsaparse.y, src/lib/oogl/wa/wa.h, src/lib/oogl/wa/yystype.h, src/lib/pointlist/pointlist.c, src/lib/pointlist/ptlBezier.c, src/lib/pointlist/ptlInst.c, src/lib/pointlist/ptlList.c, src/lib/pointlist/ptlMesh.c, src/lib/pointlist/ptlPolylist.c, src/lib/pointlist/ptlQuad.c, src/lib/pointlist/ptlVect.c, src/lib/shade/appearance.c, src/lib/shade/apstream.c, src/lib/shade/light.c, src/lib/window/window.c, src/lib/window/window.h, src/lib/window/winstream.c, src/lib/gprim/stub/vect.c, src/lib/gprim/tlist/tlclass.c, src/lib/gprim/tlist/tlcreate.c, src/lib/gprim/tlist/tlstream.c, src/lib/gprim/tlist/tltransform.c, src/lib/gprim/vect/vect.h, src/lib/gprim/vect/vectbound.c, src/lib/gprim/vect/vectclass.c, src/lib/gprim/vect/vectcreate.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/vect/vectload.c, src/lib/gprim/vect/vectpick.c, src/lib/gprim/vect/vectsave.c, src/lib/gprim/vect/vectsphere.c, src/lib/gprim/vect/vecttransform.c, src/lib/mg/buf/mgbuf.c, src/lib/mg/buf/mgbufclip.c, src/lib/mg/buf/mgbufdraw.c, src/lib/mg/buf/mgbufrender.c, src/lib/mg/buf/mgbufrender24.c, src/lib/mg/common/mg.c, src/lib/mg/common/mgshade.c, src/lib/mg/common/mgtexture.c, src/lib/mg/opengl/mgopengl.c, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/opengl/mgopenglmesh.c, src/lib/mg/opengl/mgopenglshade.c, src/lib/mg/ps/mgps.c, src/lib/mg/ps/mgpsclip.c, src/lib/mg/ps/mgpsdraw.c, src/lib/mg/ps/mgpstri.c, src/lib/mg/ps/mgpswindows.c, src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.c, src/lib/mg/rib/mgributil.c, src/lib/mg/x11/mgx11.c, src/lib/mg/x11/mgx11clip.c, src/lib/mg/x11/mgx11draw.c, src/lib/mg/x11/mgx11render1.c, src/lib/mg/x11/mgx11render16.c, src/lib/mg/x11/mgx11render8.c, src/lib/mg/x11/mgx11shade.c, src/lib/mg/x11/mgx11visual.c, src/lib/mg/x11/mgx11windows.c, src/lib/mib/mibButton.c, src/lib/mib/mibDrawArea.c, src/lib/mib/mibFrame.c, src/lib/mib/mibLabel.c, src/lib/mib/mibList.c, src/lib/mib/mibMenu.c, src/lib/mib/mibRadioBox.c, src/lib/mib/mibScale.c, src/lib/mib/mibScrollBar.c, src/lib/mib/mibTextBig.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/ndmesh/ndmeshload.c, src/lib/gprim/ndmesh/ndmeshsave.c, src/lib/gprim/npolylist/nplbound.c, src/lib/gprim/npolylist/nplclass.c, src/lib/gprim/npolylist/nplcopy.c, src/lib/gprim/npolylist/nplcreate.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/nplsave.c, src/lib/gprim/polylist/plbound.c, src/lib/gprim/polylist/plclass.c, src/lib/gprim/polylist/plcopy.c, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/polylist/plevert.c, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/plnormal.c, src/lib/gprim/polylist/plpick.c, src/lib/gprim/polylist/plsave.c, src/lib/gprim/polylist/plsphere.c, src/lib/gprim/polylist/pltransform.c, src/lib/gprim/quad/quadbound.c, src/lib/gprim/quad/quadclass.c, src/lib/gprim/quad/quadcopy.c, src/lib/gprim/quad/quadcreate.c, src/lib/gprim/quad/quaddelete.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/quad/quadevert.c, src/lib/gprim/quad/quadload.c, src/lib/gprim/quad/quadnormal.c, src/lib/gprim/quad/quadpick.c, src/lib/gprim/quad/quadsave.c, src/lib/gprim/quad/quadsphere.c, src/lib/gprim/quad/quadtransform.c, src/lib/gprim/skel/skelbound.c, src/lib/gprim/skel/skelclass.c, src/lib/gprim/skel/skelcreate.c, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/skel/skelload.c, src/lib/gprim/skel/skelpick.c, src/lib/gprim/skel/skelsave.c, src/lib/gprim/skel/skeltransform.c, src/lib/gprim/sphere/sphereclass.c, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/sphere/sphereload.c, src/lib/gprim/sphere/spheremisc.c, src/lib/gprim/sphere/spheresave.c, src/lib/gprim/stub/bbox.c, src/lib/gprim/stub/bezier.c, src/lib/gprim/stub/bezierlist.c, src/lib/gprim/stub/comment.c, src/lib/gprim/stub/discgrp.c, src/lib/gprim/stub/inst.c, src/lib/gprim/stub/lincoln.c, src/lib/gprim/stub/list.c, src/lib/gprim/stub/mesh.c, src/lib/gprim/stub/ndmesh.c, src/lib/gprim/stub/npolylist.c, src/lib/gprim/stub/polylist.c, src/lib/gprim/stub/quad.c, src/lib/gprim/stub/skel.c, src/lib/gprim/stub/sphere.c, src/lib/gprim/stub/stub.c, src/lib/gprim/stub/stubdraw.c, src/lib/gprim/stub/tlist.c, src/lib/gprim/geom/draw.c, src/lib/gprim/geom/evert.c, src/lib/gprim/geom/extend.c, src/lib/gprim/geom/geomstream.c, src/lib/gprim/geom/handlescan.c, src/lib/gprim/geom/iterate.c, src/lib/gprim/geom/knownclass.c, src/lib/gprim/geom/message.c, src/lib/gprim/geom/name.c, src/lib/gprim/geom/pick.c, src/lib/gprim/geom/replace.c, src/lib/gprim/geom/transform.c, src/lib/gprim/inst/instbound.c, src/lib/gprim/inst/instclass.c, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instdraw.c, src/lib/gprim/inst/instmisc.c, src/lib/gprim/inst/instpick.c, src/lib/gprim/inst/instsphere.c, src/lib/gprim/inst/inststream.c, src/lib/gprim/lincoln/lincolnclass.c, src/lib/gprim/lincoln/lincolnload.c, src/lib/gprim/list/listclass.c, src/lib/gprim/list/listcreate.c, src/lib/gprim/list/listdraw.c, src/lib/gprim/list/listmisc.c, src/lib/gprim/list/listpick.c, src/lib/gprim/list/listsphere.c, src/lib/gprim/list/liststream.c, src/lib/gprim/mesh/meshbound.c, src/lib/gprim/mesh/meshclass.c, src/lib/gprim/mesh/meshcopy.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshdelete.c, src/lib/gprim/mesh/meshdice.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/mesh/meshevert.c, src/lib/gprim/mesh/meshload.c, src/lib/gprim/mesh/meshnormal.c, src/lib/gprim/mesh/meshpick.c, src/lib/gprim/mesh/meshsave.c, src/lib/gprim/mesh/meshsphere.c, src/lib/gprim/mesh/meshtransform.c, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/ndmesh/ndmeshclass.c, src/lib/gprim/bbox/bboxclass.c, src/lib/gprim/bbox/bboxcopy.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/bbox/bboxload.c, src/lib/gprim/bbox/bboxminmax.c, src/lib/gprim/bbox/bboxsave.c, src/lib/gprim/bbox/bboxtransform.c, src/lib/gprim/bbox/bboxunion.c, src/lib/gprim/bezier/bezbound.c, src/lib/gprim/bezier/bezclass.c, src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezdice.c, src/lib/gprim/bezier/bezdraw.c, src/lib/gprim/bezier/bezevert.c, src/lib/gprim/bezier/bezload.c, src/lib/gprim/bezier/bezpick.c, src/lib/gprim/bezier/bezsave.c, src/lib/gprim/bezier/bezsphere.c, src/lib/gprim/bezier/beztransform.c, src/lib/gprim/comment/commentclass.c, src/lib/gprim/comment/commentcreate.c, src/lib/gprim/comment/commentsave.c, src/lib/gprim/comment/commentstream.c, src/lib/gprim/discgrp/colormap.c, src/lib/gprim/discgrp/complex.c, src/lib/gprim/discgrp/dgbound.c, src/lib/gprim/discgrp/dgclass.c, src/lib/gprim/discgrp/dgconstraint.c, src/lib/gprim/discgrp/dgcopy.c, src/lib/gprim/discgrp/dgcreate.c, src/lib/gprim/discgrp/dgdelete.c, src/lib/gprim/discgrp/dgdirdom.c, src/lib/gprim/discgrp/dgdraw.c, src/lib/gprim/discgrp/dgenum.c, src/lib/gprim/discgrp/dgevert.c, src/lib/gprim/discgrp/dgmisc.c, src/lib/gprim/discgrp/dgpick.c, src/lib/gprim/discgrp/dgsave.c, src/lib/gprim/discgrp/dgstream.c, src/lib/gprim/discgrp/dgtransform.c, src/lib/gprim/discgrp/dhpoint3.c, src/lib/gprim/discgrp/matlist.c, src/lib/gprim/discgrp/outstack.c, src/lib/gprim/discgrp/polyhedron.c, src/lib/gprim/discgrp/projective.c, src/lib/gprim/discgrp/stack.c, src/lib/gprim/discgrp/util.c, src/lib/gprim/discgrp/weeks_dirdom.c, src/lib/gprim/discgrp/xform.c, src/lib/gprim/geom/bound.c, src/lib/gprim/geom/boundsphere.c, src/lib/gprim/geom/class.c, src/lib/gprim/geom/copy.c, src/lib/gprim/geom/create.c, src/lib/gprim/geom/delete.c, src/lib/gprim/geom/dice.c, src/lib/fexpr/real.c, src/lib/fexpr/vars.c, src/lib/forms/xforms-compat.h, src/lib/geometry/cmodel/cm_geometry.c, src/lib/geometry/cmodel/cmodel.c, src/lib/geometry/cmodel/cmodel_data.c, src/lib/geometry/hpoint3/hg4.c, src/lib/geometry/hpoint3/hline3.c, src/lib/geometry/hpoint3/hplane3.c, src/lib/geometry/hpoint3/hpoint3.c, src/lib/geometry/hpoint3/hpoint3a.c, src/lib/geometry/hpoint3/hpoint3b.c, src/lib/geometry/hpointn/hpointn.c, src/lib/geometry/hpointn/hpointnb.c, src/lib/geometry/point3/point3.c, src/lib/geometry/point3/polyint.c, src/lib/geometry/point3/segments.c, src/lib/geometry/transform3/ctm3align.c, src/lib/geometry/transform3/ctm3ortho.c, src/lib/geometry/transform3/ctm3persp.c, src/lib/geometry/transform3/ctm3perspfov.c, src/lib/geometry/transform3/ctm3rotate.c, src/lib/geometry/transform3/ctm3scale.c, src/lib/geometry/transform3/ctm3tetrad.c, src/lib/geometry/transform3/ctm3translate.c, src/lib/geometry/transform3/tm3adjoint.c, src/lib/geometry/transform3/tm3align.c, src/lib/geometry/transform3/tm3concat.c, src/lib/geometry/transform3/tm3conjugate.c, src/lib/geometry/transform3/tm3copy.c, src/lib/geometry/transform3/tm3dual.c, src/lib/geometry/transform3/tm3identity.c, src/lib/geometry/transform3/tm3invert.c, src/lib/geometry/transform3/tm3ortho.c, src/lib/geometry/transform3/tm3persp.c, src/lib/geometry/transform3/tm3perspfov.c, src/lib/geometry/transform3/tm3print.c, src/lib/geometry/transform3/tm3rotate.c, src/lib/geometry/transform3/tm3scale.c, src/lib/geometry/transform3/tm3stack.c, src/lib/geometry/transform3/tm3tetrad.c, src/lib/geometry/transform3/tm3translate.c, src/lib/geometry/transform3/tm3transpose.c, src/lib/geometry/transformn/transformn.c, src/lib/geometry/transobj/transobj.c, src/lib/geomutil/bdy/bdy.c, src/lib/geomutil/crayplutil/crayBezier.c, src/lib/geomutil/crayplutil/crayInst.c, src/lib/geomutil/crayplutil/crayList.c, src/lib/geomutil/crayplutil/crayMesh.c, src/lib/geomutil/crayplutil/crayPolylist.c, src/lib/geomutil/crayplutil/crayQuad.c, src/lib/geomutil/crayplutil/crayVect.c, src/lib/geomutil/crayplutil/crayola.c, src/lib/geomutil/dim/dim.c, src/lib/geomutil/plutil/anytopl.c, src/lib/geomutil/plutil/plcombine.c, src/lib/geomutil/plutil/plconsol.c, src/lib/gprim/bbox/bboxbound.c, src/bin/geomview/common/ui.c, src/bin/geomview/common/worldio.c, src/bin/geomview/x11/bitmaps/icon, src/bin/geomview/x11/gvappear.c, src/bin/geomview/x11/gvcameras.c, src/bin/geomview/x11/gvcamui.c, src/bin/geomview/x11/gvcolor.c, src/bin/geomview/x11/gvcommands.c, src/bin/geomview/x11/gvcredits.c, src/bin/geomview/x11/gvevent.c, src/bin/geomview/x11/gvfiles.c, src/bin/geomview/x11/gvlights.c, src/bin/geomview/x11/gvload.c, src/bin/geomview/x11/gvmain.c, src/bin/geomview/x11/gvmaterial.c, src/bin/geomview/x11/gvmnpanel.c, src/bin/geomview/x11/gvsave.c, src/bin/geomview/x11/gvtoolui.c, src/bin/geomview/x11/gvui.c, src/bin/ginsu/ginsu.c, src/bin/graffiti/graffiti.c, src/bin/graffiti/graffiti.h, src/bin/graffiti/gui.c, src/bin/graffiti/lang.c, src/bin/hinge/hinge.c, src/bin/hinge/hui.c, src/bin/hinge/lang.c, src/bin/stereo/stereo.c, src/bin/stereo/sterui.c, src/bin/sweep/sweep.c, src/bin/sweep/sweep.main.c, src/bin/tackdown/origin.common.c, src/bin/tackdown/origin.common.h, src/bin/tackdown/origin.main.c, src/bin/tackdown/tackdown.main.c, src/bin/togeomview/togeomview.c, src/bin/transformer/transformer.main.c, src/lib/camera/camcompat.c, src/lib/camera/camera.c, src/lib/camera/camstream.c, src/lib/color/color.c, src/lib/color/mergein.c, src/lib/color/mergeout.c, src/lib/color/mergeover.c, src/lib/color/mergeplus.c, src/lib/color/mergeunder.c, src/lib/color/paintcopy.c, src/lib/color/paintover.c, src/lib/fexpr/binfuncs.c, src/lib/fexpr/complex.c, src/lib/fexpr/evaluate.c, src/lib/fexpr/exprs.c, src/lib/fexpr/lex.yy.c, src/lib/fexpr/monfuncs.c, src/lib/fexpr/parse.tab.c-saved, src/bin/animate/xanimate.c, src/bin/cplxview/computegraph.c, src/bin/cplxview/cplxview.c, src/bin/example/callbacks.c, src/bin/example/main.c, src/bin/example/oogl.c, src/bin/flythrough/main.c, src/bin/geomutil/bdy/bdy.c, src/bin/geomutil/clip/Clip.h, src/bin/geomutil/clip/clip.c, src/bin/geomutil/clip/clipmain.c, src/bin/geomutil/clip/clipoogl.c, src/bin/geomutil/math2oogl/math2oogl.c, src/bin/geomutil/oogl2rib/oogl2rib.c, src/bin/geomutil/oogl2vrml/oogl2vrml.c, src/bin/geomutil/oogl2vrml/oogl2vrml2.c, src/bin/geomutil/plutil/anytooff.main.c, src/bin/geomutil/plutil/bez2mesh.c, src/bin/geomutil/plutil/offconsol.main.c, src/bin/geomutil/plutil/polymerge.c, src/bin/geomutil/ucd/anytoucd.c, src/bin/geomutil/ucd/make_frame.c, src/bin/geomutil/ucd/stack.c, src/bin/geomutil/ucd/ucdtooff.c, src/bin/geomview/common/comm.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/event.c, src/bin/geomview/common/lang.c, src/bin/geomview/common/lights.c, src/bin/geomview/common/lispext.c, src/bin/geomview/common/main.c, src/bin/geomview/common/motion.c, src/bin/geomview/common/mouse.c, src/bin/geomview/common/ndshade.c, src/bin/geomview/common/rman.c, src/bin/geomview/common/shaders.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c, configure.ac, src/bin/animate/animate.c, src/bin/animate/glob.c: This is the big "no warnings" patch. Warnings that remain: length of string constants, and some unput() functions in the two scanners, those are defined but not used. 2006-07-05 Lloyd Wood * src/lib/mg/rib/mgribdraw.c: Checking in rendering transparency patch: http://sourceforge.net/tracker/index.php?func=detail&aid=1231146&group_id=9736&atid=309736 provided by Chun-Chung Chen - cjj. 2006-06-26 Claus-Justus Heine * src/lib/oogl/util/seekpipe.c: seekpipe_read() was severly broken (end of function reached without return statement. Gnah. * src/lib/camera/camera.c, src/lib/geometry/cmodel/cmodel.c, src/lib/geomutil/crayplutil/crayBezier.c, src/lib/geomutil/crayplutil/crayInst.c, src/lib/geomutil/crayplutil/crayList.c, src/lib/geomutil/crayplutil/crayMesh.c, src/lib/geomutil/crayplutil/crayPolylist.c, src/lib/geomutil/crayplutil/crayQuad.c, src/lib/geomutil/crayplutil/crayola.c, src/lib/geomutil/crayplutil/crayolaP.h, src/lib/geomutil/dim/dim.c, src/lib/gprim/bbox/bboxclass.c, src/lib/gprim/bezier/bezdice.c, src/lib/gprim/discgrp/dgdirdom.c, src/lib/gprim/discgrp/dgenum.c, src/lib/gprim/discgrp/matlist.c, src/lib/gprim/discgrp/stack.c, src/lib/gprim/discgrp/weeks_dirdom.c, src/lib/gprim/geom/extend.c, src/lib/gprim/geom/geom.h, src/lib/gprim/mesh/meshpick.c, src/lib/gprim/sphere/sphereP.h, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/tlist/tlstream.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/vect/vectpick.c, src/lib/mg/common/mgtexture.c, src/lib/oogl/lisp/lisp.c, src/lib/oogl/util/futil.c, src/lib/oogl/wa/Makefile.am, src/lib/oogl/wa/fsaparse.l, src/lib/pointlist/ptlBezier.c, src/lib/shade/appearance.c, src/lib/shade/appearance.h: va_args issues, sphere command works again. * configure.ac: Bump version to 1.8.2-rc1 2006-06-25 Lloyd Wood * configure: It's INSTALL.Geomview with a capital G. * INSTALL.Geomview, configure: Updating text of documentation referring to reconf to reflect recent changes by rotdrop. (It's still a good idea to direct users to the reconf script, rather than just autoreconf -i, in case the reconf script needs to do anything else in future.) 2006-06-24 Claus-Justus Heine * doc/Makefile.am: Install png figures in info directory (although at least _MY_ emacs/xemacs cannot handle them). * src/lib/oogl/wa/.cvsignore, doc/figs/.cvsignore: Ignore some more auto-generated files. * doc/Makefile.am: It is "dist-hook", not "distlocal". * .cvsignore: Add geomview dist directory (created during "make dist"). * Makefile.am: Remove almost everything with "make maintainer-clean". * .cvsignore: Ignore INSTALL (auto-generated). * .cvsignore: Remove build/packbuild. * acconfig.h: use new autoheader interface. * INSTALL: Auto-generated. * configure: Resurrect dummy configure script. * NEWS: Update, add 1.8.2 release note (for future use). * Makefile.am: Remove traces of old build-system. * reconf: Just redirect to "autoreconf -i" as should be. * build.in, packbuild.in: People should use the normal "configure && make" stuff. * .cvsignore: Ignore the tar-balls generated by "make dist". * configure: Don't keep auto-generated files in CVS. Use 'autoreconf -i' instead. * configure.in: Renamed to configure.ac. * configure.ac: Renamed. * src/lib/oogl/wa/yystype.h: Define YYSTYPE_IS_DECLARD, otherwise recent flex/bison combo's define it to int, which is not what we want. * src/lib/oogl/wa/fsaparse.l, src/lib/oogl/wa/fsaparse.y: Include string.h (missing prototype issue). * src/lib/oogl/wa/Makefile.am: Include "BUILT_SOURCES", i.e. wa.lex.c etc into the distro. Remove stuff with "make maintainer-clean". * src/lib/oogl/wa/wa.lex.c, src/lib/oogl/wa/y.tab.h, src/lib/oogl/lisp/clisp.h, src/bin/example/.geomview-example, src/bin/animate/.geomview-animate: Not in CVS, because the maintainers can generate them. * src/bin/geomutil/bdy/Makefile.am, src/bin/geomview/Makefile.am, src/bin/geomview/x11/Makefile.am, src/lib/oogl/lisp/Makefile.am, src/bin/animate/Makefile.am, src/bin/example/Makefile.am: Make sure "make distclean" deletes everything which is not included in the distributions, because that is what distclean is for. * src/bin/geomutil/oogl2vrml/.cvsignore: Ignore oogl2vrml2 * src/bin/geomutil/bdy/.geomview-drawbdy: Generated during "make". * m4/geom_local.m4, m4/lf_local.m4: Fix "underquoted" AC_DEFUN's * doc/.cvsignore, doc/Makefile.am, doc/README, doc/geomview.texi: Move to a recent TeXinfo release, this simplifies things a lot, even support for HTML is now built into makeinfo. * doc/figs/.cvsignore: Ignore .png, .eps, .pdf * doc/figs/eps2pdf1.sh: Use epstopdf, if available. * doc/figs/trefdodecinter.pdf, doc/figs/tools.pdf, doc/figs/initial.pdf, doc/figs/light.pdf, doc/figs/load.pdf, doc/figs/main.pdf, doc/figs/mat.pdf, doc/figs/myfilelist.pdf, doc/figs/save.pdf, doc/figs/secondlinelist.pdf, doc/figs/cam.pdf, doc/figs/color.pdf, doc/figs/command.pdf, doc/figs/fig2.pdf, doc/figs/ap.pdf: Only keep the original PS files, everything else can be generated. * doc/figs/color.ps, doc/figs/command.ps, doc/figs/initial.ps, doc/figs/light.ps, doc/figs/load.ps, doc/figs/main.ps: Those files were in Landscape mode, unluckily. Back-converted to portrait, kept care to do this pixel-wise, so the pictures should be unchanged. 2006-06-23 Claus-Justus Heine * configure.in: Explicitly link with -lXpm, at least I need it. 2006-06-23 Lloyd Wood * INSTALL.Geomview: Adding explanatory note about reconf use. * reconf: Indicate revision of reconf script. * configure: Adding some hints concerning autoreconf and automake. * reconf: autoconf presumes that any existing configure file is a good configure file. So moving any existing file to configure-old first to allow a new one to be created. * configure: Adding placeholder configure file as hint to new CVS users to run reconf to autoconf/automake configure and Makefiles. 2005-10-31 Claus-Justus Heine * src/lib/gprim/geom/create.c, src/lib/gprim/geom/geomclass.h: Some more va_list stuff; actually, my previous patch was incomplete (submitted over 18 months ago ...). Here comes the fix; the cvs version should work again with with patch, even on x86 and not only on x86_64 ... See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14557 The problem is that va_list is not only opaque, but ReallyOpaque (maybe (tm)??). va_list may even be an array_type. Then in the context of foo(va_list foo) {} already is not of type "va_list" _BUT_ of type "&va_list[0]". So: foo(va_list foo) { bar(&foo); } passes _NOT_ the base address of va_list to "bar()" _BUT_ the address of the piece of storage which holds the parameter "foo" which is _NOT_ what we want (think about it!! This is JAIOCABD (JustAnotherInstanceOfCArrayBrainDamegedness) Oops. I did all this to make Geomview work on AMD64 with Linux. Actually, I DO NOT like the libc implementation of va_list, but we have to cope with it. Also, the changes _should_ not break archs/compilers where va_list is a structure and not of array-type. Hope this will be portable (_should_ be, but FIXME if not). * Makefile.am: Don't try to include stuff into the distro which is not there, the smr_SOMETHING macros are still missing in m4/ 2005-02-21 Mark Phillips * reconf: remove system-specific '--with-motif' option when ./configure is run 2004-05-02 Claus-Justus Heine * src/lib/oogl/util/seekpipe.c: My previous commit did not even compile, I _very_ deeply apologize. * src/lib/oogl/util/futil.c: Binary formats where severely broken w.r.t. little-endian 64-bit archs. Keep the following in mind: _NEVER_ use "long" if you mean "32-bit wide". Either use bit-types defined by the OS (libc header-files), or assume that int's are 32-bits (maybe wrong) and that you do not have any knowledge about the size of long's. * src/lib/oogl/util/seekpipe.c: Add debugging code. To actually switch on debugging, the environment variable SEEKPIPE_DEBUG has to be set (to whatever value). The name of the output-file is controlled via SEEKPIPE_DEBUGFILE. The default is /tmp/seekpipe-foo. If set the data-stream will be copied to SEEKPIPE_DEBUGFILE. * src/bin/geomview/common/comm.c: On the client: Close the pipe-fd's after duping them to stdin and stdout, they are no longer needed. 2004-04-27 Claus-Justus Heine * configure.in: Set CFLAGS to -O0 when checking for math-lib, some compilers already inline math-functions when used with -O2. * ChangeLog: Update. * src/bin/geomutil/oogl2vrml/Makefile.am, src/bin/geomutil/oogl2vrml/oogl2vrml2.c: Use oogl2vrml to create an oogl->VRML 2.0 converter. Most modern viewers do not understand VRML 1.0. 2004-03-15 Claus-Justus Heine * src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelcreate.c, src/lib/gprim/tlist/tlcreate.c, src/lib/gprim/tlist/tlistP.h, src/lib/gprim/vect/vectP.h, src/lib/gprim/vect/vectcreate.c, src/lib/gprim/list/listcreate.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/npolylist/nplclass.c, src/lib/gprim/npolylist/nplcreate.c, src/lib/gprim/npolylist/npolylistP.h, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/polylist/polylistP.h, src/lib/gprim/quad/quadcreate.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezierP.h, src/lib/gprim/comment/commentP.h, src/lib/gprim/comment/commentcreate.c, src/lib/gprim/discgrp/dgcreate.c, src/lib/gprim/inst/instP.h, src/lib/gprim/inst/instcreate.c, src/lib/gprim/list/listP.h: See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14557 The problem is that va_list is not only opaque, but ReallyOpaque (maybe (tm)??). va_list may even be an array_type. Then in the context of foo(va_list foo) {} already is not of type "va_list" _BUT_ of type "&va_list[0]". So: foo(va_list foo) { bar(&foo); } passes _NOT_ the base address of va_list to "bar()" _BUT_ the address of the piece of storage which holds the parameter "foo" which is _NOT_ what we want (think about it!! This is JAIOCABD (JustAnotherInstanceOfCArrayBrainDamegedness) Oops. I did all this to make Geomview work on AMD64 with Linux. Actually, I DO NOT like the libc implementation of va_list, but we have to cope with it. Also, the changes _should_ not break archs/compilers where va_list is a structure and not of array-type. Hope this will be portable (_should_ be, but FIXME if not). * configure.in: Remove ALISTADDR and add check for /bin/csh versus /bin/sh. * acconfig.h: Remove ALISTADDR (was a BUG!). See notes for the big bunch of the other changed files. * src/lib/oogl/wa/wa.yacc.c: Auto-generated. * src/lib/oogl/util/glob.c: Resort to /bin/sh if /bin/csh is not found. At least _I_ don't have csh installed (don't like it, but that's OT). Default is to use /bin/csh as before. * src/lib/oogl/util/futil.c: fmemopen() is a GNU-stuff (AFAIK). So define _GNU_SOURCE to get the proper proto-type (makes a _MAJOR_ difference on 64-bit systems!!!!!!!!!!) 2004-02-22 Steve M. Robbins * m4/lf_local.m4, Makefile.am, configure.in, ChangeLog: *** empty log message *** * ChangeLog: entries for previous configure and Makefile change. * Makefile.am, configure.in, m4/Makefile.am: * m4/Makefile.am: Remove. * Makefile.am (m4_files): Distribute the m4/*.m4 files. * configure.in: Take care to avoid using MS Windows "find" command. Do not create m4/Makefile. 2004-02-21 Steve M. Robbins * configure.in: Run autoupdate from autoconf 1.8. * m4/lf_local.m4 (LF_LINK_HEADERS): Generate the include symlink farm in $(top_builddir), as $(top_srcdir) may not be writable. Use "mkdir" to make the common include directory. Newer autoconf no longer provides shell script mkinstalldirs. * Makefile.am (EXTRA_DIST): Do not list mkinstalldirs. * m4/Makefile.am: Remove. * Makefile.am (m4_files): Distribute the m4/*.m4 files. * configure.in: Take care to avoid using MS Windows "find" command. Do not create m4/Makefile. 2002-10-26 Steve M. Robbins * configure.in: Bump version to 1.8.2. 2002-04-13 Steve M. Robbins * Makefile.am (ACLOCAL_AMFLAGS): Set to "-I m4" so that the proper option is passed when aclocal is run. 2002-04-06 Steve M. Robbins * INSTALL.Geomview: Document --with-xforms as the configure flag. 2001-03-24 Steve M. Robbins * configure.in: Do not add -XSVR4 and -common to CFLAGS when configuring with IRIX cc. 2001-03-21 Steve M. Robbins * doc/Makefile.am (EXTRA_DIST): Remove motion.pdf. * configure.in: Set revision to 1.8.1. * m4/geom_local.m4 (GEOM_FIND_I_OPTION): Respect prior setting of $CPPFLAGS while probing. 2001-03-19 Mark Phillips * doc/motion.tex: new file added to release; documents the mathematics behind Geomview's motion model. For use by developers (not needed by regular users). 2001-02-21 Steve M. Robbins * configure.in: Add AC_FUNC_SETPGRP. 2001-02-18 Steve M. Robbins * configure.in: Add option --with-build-path. Use AC_PATH_XTRA. Correct the X library link order. Make sure to check /usr/local/lib for all libraries that check /usr/local/include. Check for in $x_includes and $x_includes/X11. Make sure both the includes and the libs are correct before using FORMS. Announce whether Xmu is found. General tidying up. 2001-02-17 Steve Robbins * acconfig.h: Close comment above define for HAVE_FMEMOPEN. * configure.in: Check endianness and check for header netinet/in.h. * doc/Makefile.am: Only build "geomview.pdf" on target "pdf". 2001-02-11 Steve Robbins * m4/geom_local.m4 (GEOM_CHECK_XFORMS): New. If XFORMS library is available, set variables for finding includes and libraries, emit warning if XFORMS is not available. 2001-01-16 Steve Robbins * configure.in: removed redundant --with-forms argument; its effects got overwritten by --with-xforms, anyway. 2000-11-23 Steve Robbins * src/Makefile.am (geomview): look for "gvx" in $(moduledir) rather than $(bindir). (CLEANFILES): clean geomview script. 2000-11-20 Mark Phillips * release 1.8.0 (see NEWS file for summary) 2000-11-19 Mark Phillips * texi2pdf doesn't seem to include figures; for now revert to dvipdf to generate pdf version of manual 2000-11-17 Mark Phillips * doc/Makefile.am: refer to $(srcdir)/geomview.texi rather than geomview.texi when invoking tex 2000-11-15 Mark Phillips * removed 'stamp-h.in' and 'aclocal.m4' from CVS, since they are derived files. * cleaned up & documented 'reconf' script, used to bootstrap a fresh Geomview tree checked out from CVS. * INSTALL.Geomview: re-wrote XFORMS configuration instructions to reflect the fact that XFORMS (Linux Intel version) is no longer part of the Geomview distribution; users who want it now download it separately and unpack it into the top-level Geomview directory before configuring Geomview. * src/lib/Makefile.am: explicitly mention 'forms' dir in SUBDIRS now, rather than having it be conditional based on whether xforms is present, since this dir only contains a .h file which can be installed even if xforms isn't present. * configure.in: Changed all variables that mention forms to say 'xforms' instead, for consistency. Added caching of many variables so their values can be shared with other configure scripts. Changed OOGLLIBS to use top_geom_builddir instead of top_builddir, so that its value can be used in other configure scripts. Added check to detect subdirs of src/bin having additional configure.in's, and to call AC_CONFIG_SUBDIRS with them. * m4/geom_local.m4: added macros GEOM_LOG_MSG, GEOM_GET_CACHED_VALUE, and GEOM_REQUIRE_XFORMS. Removed verbosity from GEOM_FIND_I_OPTION and GEOM_FIND_L_OPTION operate quietly so that whoever would call them can print messages even if the corresponding values are coming from the cache (rather than actually calling GEOM_FIND_I_OPTION/GEOM_FIND_L_OPTION). * Makefile.am: removed xforms from SUBDIRS * removed xforms directory from distribution; re-wrote configure.in & friends to just notice whether xforms is present and use it if so, or quietly (with a warning) ignore it if not. 2000-11-09 Mark Phillips * configure.in: improvements to the test for -lgl so that it gives a false negative less often; added message to output saying what geomview version is being configured, to aid in deciphering other people's 'configure' output * src/bin/geomutil/vrml2oogl/Makefile.am: added -lm to vrml2oogl link line where necessary * src/lib/oogl/util/futil.c: corrected USE_FSTROPEN_1 definition for AIX/__osf__/__hpux/__FreeBSD__ case 2000-11-05 Steve Robbins * Makefile.am (distclean-local): Remove "include" directory. * doc/html/Makefile.am (EXTRA_DIST): * doc/Makefile.am (EXTRA_DIST): List files explicitly, to avoid distributing CVS directory. * configure.in: Check for either "texi2pdf" or "dvipdf". * doc/Makefile.am (.texi.pdf): Build PDF files using "texi2pdf" (from GNU Texinfo package), if available. * data/Makefile.am (geomdata_DATA): List data files to install. * configure.in: Set geomdatadir variable, allowing easy overriding at configure time. * src/Makefile.am (geomview): * Makefile.am (geomview): * geomview.sh (GEOMVIEW_LOAD_PATH): Do not assume data lives in a subdirectory of $GEOMROOT. 2000-11-04 Steve Robbins * src/Makefile.am (geomview): * Makefile.am (geomview): * geomview.sh (GEOMVIEW_EMODULE_PATH): Do not assume that modules live in a subdirectory of $GEOMROOT. * configure.in: Change "modulesdir" to "moduledir", so that "module_PROGRAMS" 2000-11-02 Steve Robbins * doc/html/Makefile.am (geomview_toc.html): Use $srcdir to refer to a file in the sources. * Makefile.am (geomview): * src/Makefile.am (geomview): Refer to `geomview.sh' using $top_srcdir. * configure.in: The macro AC_OUTPUT will only create a single directory level at a time, so we must list the files in directory `a/b' before those in directory `a/b/c'. 2000-11-01 Mark Phillips * release 1.7.10 (see NEWS file for summary) * src/lib/oogl/util/futil.c: Added tests to 'configure' to decide whether to use fmemopen() instead of CC_fmemopen__FPci() on linux systems in the implementation of fstropen. Also added "--enable-fstropen-1" flag to 'configure' to allow forced use of manual implementation of fstropen. These changes are in response to reports of Geomview crashing upon startup, while reading the default appearance (via a call to fstropen), on some newer Linux systems. [thanks to Mikhail Tchernychev and Belinda Marchand ] * src/lib/oogl/wa/fsaparse.l: removed duplicate rules for "min" and "bfs" [sent by Steve Robbins ] * src/bin/geomview/common/comm.c: added preprocessor condition to allow compilation on the Alpha [sent by Tamara Munzner ] 2000-10-29 Steve Robbins * configure.in: also try $x_includes when searching for Xm/Xm.h 2000-10-20 * release 1.7.9 (see NEWS file for summary) 2000-10-14 * release 1.7.8 (see NEWS file for summary) 1.7.7 August 22, 2000 Added some of the external modules to the distribution, but haven't actually tested them. Updated the documentation to reflect the fact that the geomview-users mailing list is now hosted at lists.sourceforge.net. 1.7.6 May 25, 2000 Converted source tree (geomview only; no external modules yet) to use GNU autoconf gv_rawevent now actually is passed an 'unsigned long' (which is what it expected all along, but previous was passed an 'int') for the time value. This had been causing mouse motions to fail on 64bit RS6000 running AIX 4.3.2. Many function prototypes fixed, and other warnings turned up by 'gcc -Wall' fixed. (Most of them had to do with functions that were implictly declared to return an int not returning a value). Changed Geomview's X application name from "gv" to "geomview", to avoid possible conflicts with other applications named "gv, such as ghostview. This affects the name used for X resources that apply to Geomview. If you want to force Geomview to use the old "gv" name for backward compatability, set the environment variable GEOMVIEW_X_NAME=gv in the "geomview" shell script (be sure to 'export' this variable too). 1.7 February 13, 2000 This version of the software is the same as 1.6.1p9d; the only difference is in the documentation, which has been substantially changed to reflect the fact that the Geometry Center is now closed and that the new home for Geomview is http://www.geomview.org. 1.6.1p9d August 18, 1998 Fixed coloring of N-D OFF objects noted by James Lawrence. Fixes to many obscure bugs and great wads of lint, suggested by David Kaelbling of SGI. 1.6.1p8 March 13, 1998 Fixes to compile with GNU glibc, and on Linux under non-x86 machines. Geomview panels: don't limit FOV < 180 if in orthographic mode. Fix more bugs in anytooff: convert VECTs even if appearance suppresses faces and edges; preserve edgecolor property in vects. Fix togeomview "Bad address" error: execvp() with no trailing NULL! 1.6.1p7 November 20, 1997 Geomview: Fix egregious vertex-picking bug, present in all earlier 1.6.1 versions, where the returned vertex index was wrong (it returned one of the adjacent vertices instead). Include lighting properly in saved .rib files. Use OpenGL texture_object extension if available; this improves multiple-texture performance dramatically on some systems. Automated making multiple gvx binary versions (MESA, native, etc.). Distribute MapleV4 version of gvplot as well as earlier ones. Thanks to Loris Renggli, loris@math.fsu.edu, for supplying a patch. Repaired geomview/x11/geomview-x11 script so its Makefile can customize it properly again (broken in 1.6.1p6). Fix togeomview, which sometimes could fail spuriously with "Bad address". 1.6.1p6 August 29, 1997 Geomview: Now seems to work, more or less, with lesstif. Avoid crashing in X11 renderer: work around DEC Alpha cc and gcc bugs. Don't draw into iconified windows, even if told to redraw via GCL. Postscript-save mode produces postscript which doesn't fail when invoked with non-empty Postscript stack. New "ppmmesa" snapshot type. If compiled with MESA OpenGL-like library, allow arbitrary-res off-screen rendering using (snapshot CAMID FILENAME ppmmesa ...) Presence of this indicated by "(MESA)" in (geomview-version) string. Allow control over texture-mapping quality (interpolated or not). Try to produce usable display colors (not all black) on 8-bit Indigos. I'm told this still doesn't work, though. geomview script accepts "-opengl", "-mesa", "-x11" etc. flags, and selects alternate gvx.{OGL,MESA,X11} binaries if installed. anytooff handles "dice" appearance tag for Bezier & Sphere objects, and gets the right color for colored VECTs. emodule_wish.sh script sets tcl/tk envariables, making it easier for emodules to use "wish". Make math2oogl really, really turn off non-blocking mode on its named pipe. vrml2oogl now invokes gzip to read compressed files, passes color into OOGL edgecolor as well as surface color, and handles text by invoking "hvectext". OOGL library changes: prototypes at last for geometry functions. new cleaner way to organize mg lights; they're now shared and refcounted. 1.6.1 December 10, 1996 Source distribution no longer uses GL-based FORMS library. Geomview's X/Motif interface is now the primary version, which the manual now describes. Many modules rewritten by Nils McCarthy, Tim Rowley, and others using Tcl/Tk. Many FORMS-based external modules adapted to use XForms (object libraries available from ftp://laue.phys.uwm.edu/pub/Xforms; see INSTALL). This release finally supports the extensions needed for Tamara Munzner's weboogl package. Known problems: Many changes aren't mentioned in this CHANGES file (though I think the significant ones are). Porting: Should now work under FreeBSD, and HP-UX 10.x. Has been tried in some new environments, including Sun UltraSparc with Creator3D card under Open GL, and Mesa Open-GL-like clone under Linux and HP-UX. Various portability problems fixed in the source code. Modules: Some modules from earlier releases are omitted here: PS Snapshot's functionality is superceded by Geomview's PS Save mode. 4dview is superceded by NDview, and in any case it depends on some GL-based FORMS code which hasn't been ported. Crayola, Warp, and parts of NDview depend on old FORMS code. Some new modules are added: Crayola, NDview, NDdemo, and Labeler are now in Tcl/Tk. You'll need to install Tcl/Tk in order to compile them; see INSTALL. Also in Tcl/Tk are some new N-dimensional utilities by Brian Luense: 3D-Snapshot (save a projected copy of the current N-D object), Colormap (interactive N-D colormap controls), and Slicer (N-dimensional clipping). FORMS modules were only minimally ported to X-Forms. You can't use the new Forms designer to change their interfaces, since the new designer writes .c files in an incompatible (though superior) way. The FORMS section in the Geomview manual needs to be updated. Applications: New "vrml2oogl" and "oogl2vrml" converters, written by Daeron Meyer and Tamara Munzner respectively. "vrml2oogl" uses the C++ QvLib library, included here; if you use GNU g++ to compile it, it seems to require 2.7.2. "anytooff" now more efficient on large data sets, and preserves appearance information where possible. Maple graphics now pay attention to color, and can now be displayed on remote computers; see doc/gvplot.doc. New command-line text generator "hvectext" uses Hershey stroke fonts. Benchmarks for various platforms, with a Makefile to run your own, are in data/speedtests. Geomview graphics: Supports Open GL as well as GL and X renderers. Future development will most likely focus on Open GL. Texture mapping available in GL and Open GL (but not plain X11) renderers. Texture coordinate must be explicitly specified. Images may be sgi, ppm/pgm/pbm, or tiff or gif if netpbm toolkit installed. See data/geom/textured/* for some examples. New built-in PostScript renderer by Tim Rowley replaces PS Snapshot module -- respects appearances, but still uses only painter's algorithm for hidden-surface removal. New in-memory renderer (related to X renderer) writes arbitrary-size PPM images of geomview scenes. Single/double-buffered switching works in Motif version too. You can specify an image as a window background. X11 renderer on 8-bit colormapped displays defaults to 5x5x5 color cube, to leave more color-table slots available. New GEOMVIEW_COLORLEVELS environment variable may be set to "6" to get the old 6x6x6 behavior. Some binary distributions include two geomview binaries, both bin/*/gvx with X11 renderer, and bin/*/gvx.OGL, with Mesa OpenGL-clone libraries. "geomview -opengl" invokes the Open GL version. OOGL data formats: More-robust geometry parser never backtracks on valid input, and should now reliably read data from pipes (rather than almost-reliably as before). "Lincoln" objects no longer supported. New "origin" and "location" fields in INSTs allow fixing objects in screen or camera or etc. coordinates, e.g. to paste text or UI elements onto objects or onto the screen. (No built-in geomview text yet, though.) "input-translator" command allows specifying an external program to translate a file beginning with a particular string into OOGL format. This hack lets us read ASCII VRML files directly using vrml2oogl. New appearance attributes for texture-mapping, concave polygons, shaded lines, back-face culling, Bezier patch dicing. Geomview command language: (snapshot ...) commands -- except SGI format -- allow piping PPM or PostScript data to a shell command as well as writing to a file. PPM images may be arbitrary size. (background-image ...) puts an image up as a window background. (pick-invisible ...) lets picking depend on appearance (though the default is still to ignore appearances). Geomview UI: Keyboard shortcuts work in Motif panels! Single ESC no longer exits from geomview; use ESC ESC. Motif panels are now resizable. GL/FORMS user interface is no longer available in this release. Now terminates cleanly, notifying any running modules, if sent interrupt/hangup/terminate signals. Geomview documentation: Manual now included in HTML form (see doc/geomview_toc.html) as well as Texinfo and (in binary packages) Postscript. Manual updated to describe the Motif user interface. It also includes a Tcl/Tk sample module, though without commentary. The commentary for modules using the FORMS library is no longer accurate, though probably still somewhat useful. 1.5 October 21, 1994 Source distribution now includes support for generic X/Motif (Sun, HP-UX, Linux, probably other systems) as well as SGI and NeXT graphics. Geomview motions: INCOMPATIBLE bug fix in the GCL command language: Motions defined with respect to the object itself, e.g. (transform world world world translate 0 0 1) had been interpreted with the wrong sign. This is now fixed. Application programs which depended on this bug (including gvclock and stereo) need to change accordingly. Documentation fix: GCL rotations (transform/transform-incr/transform-set) are given in radians, not degrees. New motion-animation commands: The (transform ...) command now allows a simple form of animation. If given an amount of time, it arranges to move by exactly that amount during approximately that many seconds, either at constant speed or with smooth start and stop. Scaling now happens with respect to the selected "center" object, not the object's own origin. There's a new (transform ... scale ...) subcommand. Keyboard input: New (event-keys) and (event-pick) commands can suppress geomview interpreting keyboard input as commands and rightmouse-clicks as picking, in graphics windows. Useful for modules which want to impose their own interpretations on events. Non-Euclidean spaces: Newly created cameras now correctly live in the current (possibly non-Euclidean) space. They had been always Euclidean, despite misleading window titles. N-D projection: New "nOFF" object is a collection of 0-, 1- or 2-dimensional polygons in N-dimensional space. N-D coloring projection axes can be with respect to any coordinate system. Two-sided surface coloring: The "backdiffuse" material field, if defined, is interpreted as the reverse-side's diffuse color. Works whenever software shading is enabled (i.e. always on generic-X systems); also works on those SGI systems whose hardware supports two-sided GL lighting. There's no control panel for this feature yet but GCL commands can, e.g. (merge-ap world { material { backdiffuse .7 .5 0 } }) There were a number of portability improvements in the X version, fixing bugs for Sun/Solaris, HP-UX, Linux, DEC OSF, AIX. Code is now more careful to avoid floating-point exceptions, which cause trouble on some machines. Yacc and lex, which were needed for one library, are no longer essential. Substantial improvements to the 3D graphics in the X11 version of Geomview: - Uses X Shared Memory extension (when available) for quick rendering of polygons and lines to X11 framebuffer - Support for 1, 8, or 24 bit deep X displays added - Optional dithering for 8 bit displays - Dithers 1 bit displays - Optional zbuffering (for hidden line/surface removal) added - Smooth shading added - Support for line thickness > 1 added - Clipping planes added Numerous fixes/additions to the X11 Geomview Motif interface: - Window positioning commands work (under most window managers) except for the Load and Save panels - fixed edit menu - added ability to type in RGB values in color panel - added numeric displays for sliders on material panel - added option menu on camera panel for choosing hidden surface removal method - added toggle button on camera panel for activating/deactivating dithering of colors (only shows up in 8 bit mode) Unlike the beta-release X graphics, the new version transmits complete images, not polygons, to the X server. It's faster for local displays; can be slow when the display-to-geomview connection traverses a slow network link. New associated packages: gvplot/writeoogl, a Maple package for displaying Maple 3-D graphics objects in Geomview or saving them as OOGL files. See doc/gvplot.doc. clip, a new command-line program based on Ginsu. Allows clipping OOGL objects against spheres and cylinders as well as planes. 1.4.3 July 24, 1994 Most changes since 1.4.2 were to fix minor bugs & improve portability. Documentation Documented the OOGL "COMMENT" object. Clarified explanation of transparency. Geomview New ui-freeze command (effective on SGI only) allows suspending/resuming updates to UI panels, for decent performance when lots of things are changing. Portability mods: ensure FNDELAY is defined; pass the proper argument type to wait3/waitpid (union wait vs int). Fix ``normalization'' command; it had failed on "all" and "keep". Fix ``ND-xform-get'' command; it had returned the inverse of the correct matrix. Make ``set-conformal-refine'' command process its arguments properly. Call proper version of setpgrp() when spawning external modules; ensures we can properly kill them when exiting. Work around lost SIGCHLD signals when we kill an e-module invoked with ``(emodule-run exec program ...)''; this caused geomview to hang when trying to quit while such a module was running. Erase comm link (named pipe/socket) if it already exists but is of the wrong type (-M option). ["togeomview" and "math2oogl" fixed similarly.] OOGL libraries COMMENT objects can't be picked. (Due to bugs fixed here, scenes with COMMENTs could sometimes yield totally spurious pick results.) Compute bounding spheres of 3-D objects properly, even when not normalized to w=1. Affects geomview's Look command. Draw N-D SKEL objects even when not in N-D mode. Maintain mg drawing flags correctly, so driver applies proper colors, etc., when drawing SKEL and VECT objects. Draw SPHERE objects with degenerate corner at x=1, so the Bezier normals come out right. Allow binding an appearance to a reference to a handle, e.g. { appearance { +edge } : fred }, by inserting an INST to hold the handle. Concentrate all stdio dependencies in src/lib/oogl/util/futil.c. Handle Linux 1.0. Implement acosh() correctly! X graphics Allow drawing into subregions of the graphics window; needed for stereo. External modules PSSnap Make isolated points visible. Ensure lightness values don't exceed 1.0. mgexample Handle lighting properly. Allow giving data file on command line. Configuration New "make clobber" rule cleans and removes targets (except libraries). Handy for saving space after building & installing the source distribution. "all" is now the sole first target in Makerules.src, to avoid confusing RS/6000 make. Expect Motif include files in /usr/include/X11/Xm/... on HP-UX. Define default settings for CPLUSPLUS (compiler name) for SGI and RS/6000. Compile on RS/6000 with "-ma" flag to allow unrestricted use of alloca(). SunOS 4.x: set "BSD" flag, initially for choosing version of setpgrp(). Finish incorporating SYSLIBS, etc. macros into makefiles. Omit -lXt when linking with mgexample, to avoid spurious link errors on Sun. 1.4.2 April 20, 1994 Beta X11 source distribution supports HP PA-RISC, DEC Alpha, RS/6000, Solaris, and Linux (0.99), in addition to SunOS 4.x. New external modules: SGI version: Maniview (3-manifold viewer), NDview and NDdemo (N-dimensional viewer and demonstration program) X11 version now includes Animate and PS Snapshot modules. Configuration Make SYSLIBS, SYSXLIBS, etc. settings -- set in makefiles/mk.* files -- be used when compiling all programs. Ditto for ALLOOGLLIBS, so new OOGL libraries can be added in one place. Geomview Picking now works in X11 Geomview. Maintain reference counts better, avoiding memory leaks. Fix various cases that caused core dumps: - (interest ...) command entered in the Command panel - sending message to an external module started with -start option. - (echo (ND-xform ...)) Make RIB snapshotting work in conformal and N-D viewing modes. (dimension) command now returns the correct setting, and (dimension N) does nothing if we're already in that dimension. Correctly choose a new current camera when the "focus" camera is deleted. Don't crash when sending messages to an external module started with -start command-line option. Make a crude estimate of bounding-box size for N-D objects, so "Look At" can begin to work. It's only roughly right, and that only for objects roughly centered on the origin. Automatically switch all cameras into N-D mode when (dimension) is set, if (ND-axes) have not yet been specified. New (ND-xform-get) command returns N-D transform between two objects. More documentation on ND-axes, ND-xform, ND-color commands. SGI Geomview (actually FORMS library) Add X copy/paste facility to FORMS text input fields. NeXT Geomview Deactivate color panel while changing its color -- don't be fooled into thinking the user selected a new color. PS Snapshot Make isolated points visible. Draw uncolored points and lines in black; default had been nearly white, almost invisible. Mathematica -> OOGL converter Add an XDisplay option, allowing mathematica to run on one machine, geomview on another, and send geomview's X display to a third machine. Handle escaped newlines in Mathematica's output, preventing strange parsing errors. OOGL libraries New N-dimensional OOGL object types: nSKEL and nMESH. pick.h now correctly describes interpretation of pick arguments, and gives brief usage example. Waste less memory when loading Quads. malloc(big)/realloc(small) can lose! GL graphics: leave mixed-model GL/X windows alone. Next graphics: allow setting window depth; allow lights to live in other coordinate systems. New "keepcolor" appearance keyword tags objects as being immune to N-D recoloring. OOGL objects containing an appearance attached to a handle/file reference now work correctly, rather than modifying the handle; the reference is silently wrapped in an INST. Various minor bug & portability fixes. 1.4.1 November 9, 1993 Distribution includes both NeXT and SGI versions. New modules included: crayola (SGI and NeXT) coloring program warp (SGI and NeXT) interactive object warping ndviewer (SGI only) N-dimensional viewer (currently only 4D objects) cplxview (SGI only) graphs of complex functions clipboard (SGI only) cut, copy and paste objects drawbdy (SGI and NeXT) find and draw the boundary of an object flythrough (SGI only) Not Knot hyperbolic gvclock (SGI and NeXT) 3D clock, demonstrates real-time motion maniview (SGI only) 3-manifold viewer trigrp (SGI only) explore triangle symmetry groups plus source for all the existing modules. Documentation: New manual! doc/geomview.tex (TeX version) and doc/geomview-* (GNU texinfo version) explain Geomview in far more detail than previous documentation. They strictly describe Geomview on the Iris, but much also applies to the Next. Configuration: SITE makefile variable selects one of several site-specific configuration settings, namely installation directories for binaries (BINDIR), manual pages (MANDIR), and Mathematica scripts (MMAPACKAGEDIR). Settings stored in makefiles/mk.site.{default,private,public}. ``make instprivate'' and ``make instpublic'' are ``make install'' variants that use the latter two. Prevent 'make' from failing if C++ compiler isn't present; just don't compile the C++ programs. Geomview, General: Extend implementation of conformal transformations. Conformal mode, which had been allowed only in hyperbolic space, is now also meaningful in Euclidean space, where it amounts to inversion in the unit sphere, and spherical space, where it's a stereographic projection from the 3-sphere into Euclidean 3-space. New command (set-conformal-refine). Read both ~/.geomview and ./.geomview, in that order. New -noinit command-line option suppress reading all .geomview files. Implement Olaf Holt's design for N-D viewing by projection. New commands (ND-axes) (ND-xform) (ND-color). (Invoked by ndviewer and cplxview modules.) Keep track correctly of which window the mouse is in. Had sometimes gotten confused if a window was uncovered. Allow disabling "override" status. New Override button & (ap-override) command selects whether appearance controls should suppress objects' own settings, or just provide default values. New (camera-prop) command allows setting the object used to show cameras when "Draw Other Cameras" selected (e.g. see file "camera-frustum"). Mention Next variants to mouse usage (alt + left = middle, etc.) in Help message. SGI Interface: Add transparency controls to materials panel. (No transparency supported on NeXT.) Color picker has numeric RGB input. Buttons for motion controls (Obscure) and Override control (Appearance). Add focal length and software shading controls to camera panel. "vl" keyboard shortcut sets camera focal length. Limit picked projected Z values to -1 .. +1, so we can only pick things that lie between the clipping planes! Motions: Really stop motions of objects when we reset them. Controllable inertia, constrained motion, own-coordinate-frame motion ('ui', 'uc', 'uo' key sequences). Make more use of the ``focal plane''. Look At button sets focal distance. Shift-rightmouse-click selects a focal point; also becomes center of rotation. Translations are interpreted as at the focal plane, so objects at the focal distance should move with the mouse. Use ordinary, no longer scaled, translations. Let the scaling be based on the frame camera's focal length, set e.g. by Look or etc. operations. Pay attention to window aspect ratio and camera focal length when moving. Add more parameters to (look-encompass-size ...) indicating desired margins for setting near and far clipping planes. Geomview, Graphics: Pay proper attention to override bits in Next and RenderMan drawing libraries; ensures that objects will be the color chosen on the panel. Position SGI windows in exactly the specified place. Draw degenerate polylist (OFF) objects correctly for Next and RenderMan: use points and lines where they have 1- or 2-vertex "faces". Correctly handle lights whose positions don't lie within the model space (as the default lights are) in hyperbolic & spherical shaders. Geomview, Saving: Save window positions when saving cameras in command form. Use a unique name when saving geom objects as commands; avoids the problem of saving as object X and having it automatically renamed X in case of conflict, making further commands ineffective. Geomview, RenderMan: Include both NeXT and SGI (etc) standard shader directories; we don't know where .rib files will be rendered. RenderMan saving no longer enforces adding four-digit numeric suffix. Geomview, Communications: GCL command files containing multiple commands now work sensibly: geomview always reads entire contents, one command per display loop. (Use (progn ... ) to swallow all at once.) emodule-run command: all e-module directories are appended to $PATH when the program is started, so emodule-run may mention module programs without requiring full pathnames. Both SGI and NeXT versions can read from either named pipes or UNIX-domain sockets; -M[gc][sp] command-line option specifies data type and communications mechanism. Software shading now implements fog; density set by lighting attenconst. External-module programs are invoked by their full path names when possible. Allow L)ooking at cameras. Allow reading either geometry or commands from either UNIX-domain sockets or named pipes, using '-M[gc][sp] name' command-line option. (camera-prop) command specifies how to draw other cameras. (cursor) command (for SGI) controls GL cursor and/or loads from .pbm file. (setenv) command allows setting environment of e.g. external modules. Assorted bug fixes. Utility programs: New programs ucdtooff, anytoucd convert AVS "UCD" format to/from OOGL. Anytooff accepts (multiple) arguments, and combines their contents. Mathematica to OOGL software: Improve installation document; be more robust about locating math2oogl, geomview, etc. executables, and warning the user if we can't. Allow specifying user name when displaying on remote host. Don't fail if graphics contain complex values (just plot real part). New BezierPlot[] in BezierPlot.m allows plotting Bezier patches directly. FORMS: Include FORMS-2.0-PATCHES, all differences from FORMS 2.0 release. Change summary: FORMS Library: New color-picker module. New fouraxis module, derived from positioner.c. Allows specifying a direction in 4-space. Be more intelligent about frozen forms: only redraw if some object changed while the form was frozen. Use the sign bit of the form->frozen field to tell. Add '@I' prefix to embed FL_ICON_STYLE (symbol font) items in a browser. Tie mouse (x,y) position to all mouse clicks. Use this to ensure that we always register a mouse click in its correct position, not the place where the mouse lies when we get a chance to read it! Click position is fed to the next caller to ask for the mouse position after a click; later calls read the live mouse position. Seems to work. Cache stuff as much as possible. Don't load fonts or read color map unless (until) we actually need them. Might allow programs to start up at a reasonable speed, since the SGI font manager is slower in 4.0.x than 3.3. Handle Icon font usefully -- use the Symbol font, and allow it to be scaled. Accommodate new font-sizing rule in IRIX 4.0.5: fonts are now scaled to constant real size rather than constant size in pixels. On IRIX 4.0.5 or greater, we discover the error this will cause and scale all font sizes by its reciprocal (!). Optimize drawing bitmaps. Cache fl_getmcolor() values; use pointers to scan input & output pixel arrays. ~sixfold speedup. Save 64K data size. FORMS designer: Add fdesign2c, batch-mode translator from *.fd to *.{c,h}. Added colorwheel and fouraxis objects. 1.3.2 March 1, 1993 Fix RenderMan file saving bug. New OOGL classes: discrete groups and spheres. Underlying support for stereo added. Fix replace world bug. Rotate about CENTERID, not the target geom, in orbit mode. Add slow-motion controls (invoked with Shift key). Scaled translation procedures now take world size into account, not distance from target object. Use this mode in fly and orbit. Add "emodule-defined" command: returns the given emodule's shell command (& tests whether any such is defined). Add cull-backface as a command. 1.3.1 January 31, 1993 IMPORTANT: the "pick" command has changed completely and is incompatible with previous versions. If you have an external module that uses the "pick" command you should change it to use the new "interest" command instead. Change the way system-dependent information is specified; everything is now specified in the "geomview" shell script which sets environment variables and then invokes the binary. Nothing that is system-dependent (e.g. pathnames) are compiled in; not even default values. External modules now appear in alphabetical order in the applications browser. Geomview finds out about them via files named .geomview-* in the modules directory, rather than in the system-wide .geomview file. So there is no need to edit the system-wide .geomview when installing a module now. See man/cat1/geomview.1 for more information on how to install a module. The space browser is now on the main panel. Different models of hyperbolic space are now available: virtual (the insider's view of the projective model), projective (outsider's view), and conformal-ball. The conformal-ball model is only partially implemented; it works only for polylist (OFF) objects and only in constant-color and smooth-shading modes (not in flat-shading mode). The model is per-camera attribute and is settable via a browser in the camera panel. The camera, when drawn, now fits inside the unit sphere. Fixed RenderMan saving bug: file is now opened properly. "Fly" mode now uses scaled z-translation. A color wheel replaces the RGB sliders for picking colors. Several "look" functions added for positioning a camera to look at an object. "Look At [L]" button added to tools panel positions the current camera to place the target object nicely in the view. Look At and look-encompass compute and use a bounding sphere for the object rather than using its bounding box. Add "Orbit [o]" mode. Like fly mode, but rotates the camera about the center of the selected object. Better error reporting; syntax errors in input files are now reported with messages including the input line where the error was detected. Picking code improved; picking now works in more cases than before. Still broken if any part of any object is behind the camera plane. Null geoms now allowed, denoted { }. Added "interest" command which allows external modules to express interest in a command; the module is then notified whenever geomview executes the command. Useful for modules that need to know when things in geomview happen. Reduced sensitivity to accidental mouse twitches -- it's now easier to make an object stop moving. Motion now proceeds wrt real elapsed time. transform-incr allows specifying rate of motion. Control over when commands are executed: sleep-for, sleep-until, clock, set-clock, time-interest commands. A "load" command simplifies reading files. Added stereo viewing support: hardware, crosseyed, red/cyan modes. (An external module is needed to control it.) Lights may be specified (from command language only) in camera or object coordinates, as well as world coordinates. Allows depth cueing. "emodule-transmit" command allows sending messages to running modules. "real-id" gives an object's canonical name. "all" gives a list of all items (geometry, emodules, ...) of a kind. "soft-shader" selects whether to use new software shading. New "v~" keyboard shortcut does, too. "echo" can be used to print results of evaluating lisp expressions. Now reads all commands from command files; used to sometimes read only the first command. Modules may continue sending messages after being killed. Modules receive SIGHUP signal when killed. 1.2.3 October 22, 1992 Geomview: Add outside-hyperbolic space mode ("mo" keyboard shortcut). "mh" still selects a view inside hyperbolic space. A "spherical" language keyword ``(space spherical)'' is now recognized. Implementation of spherical motion is improved. Do a better job of adjusting camera setup when switching spaces. The first directory in the "Files" browser is initially selected, so its files are visible when the panel is first displayed. (This directory is the first one given to "load-path", by default "."). A new "Vects" button and "aV" keyboard shortcut select whether vect objects (lines and points) are visible; they're now controlled separately from polygon edges. Make hyperbolic translation behave better when the center-of-motion is literally "target" (the default); such translations are now along an axis through the origin, avoiding spurious rotation. If "center" is anything else, it's taken at face value. Use color to indicate status of Appearance-panel buttons: highlighted yellow when true, gray when false. Buttons lie flat on the panel if they've never been changed, and depressed if they have been. (The "Revert [ax]" button restores the never-set status, and shows objects as they naturally appear.) Add half-baked transparency: "aT" keyboard sequence. Fix supersensitive behavior of Applications browser; running modules now appear in boldface red. Add "-nopanels" command-line option. trigrp: Switch between euclidean and hyperbolic space when changing groups. FORMS library: Adapt to new IRIX 4.0.5 font manager's sizing behavior. Since FORMS panels are fixed in pixel units, we rescale fonts to be constant pixel size rather than 4.0.5's constant real size. [Still works on older systems.] External modules in general: A list of all external-module definitions is now kept in "data/.geomview-modules"; it's automatically updated when new modules are installed in the geomview binary directory. It's also safe to edit this file by hand. General distribution: Distributed files are now writable by the owner, to make it easier to apply upgrades. Once this 1.2.3 distribution package is installed, it should be possible to install future distributions without being the superuser, since "tar" will be able to overwrite the old files. 1.2.2 October 3, 1992 Geomview: Repaired ANSI C incompatibilities -- this version compiles under Irix 4.0.4. Several memory leaks were fixed. Don't corrupt memory when new-geometry command is used. Avoid crashing when a camera is deleted. Bezier patch dicing level is now properly recorded and applied to newly loaded Bezier objects. Bezier's saved in RenderMan format are written as true patches, not polygonal meshes. Texture coordinates also saved for STBBP's. Don't lose commands sent by external modules just before they die. Don't continuously redraw the display when camera drawing is on. Make hyperbolic translation, which was approximately correct, exact. Repair "position", "position-at", "position-toward" commands. Fix -b (background color) command-line option. Added performance metering (control-T keyboard character). Libraries: New libformsx.a library has some handy FORMS-related functions: enabling/disabling objects, reading numbers from input fields, etc. Maximum Bezier degree is now 12 rather than 6. Bounding boxes of Bezier patches now at least fairly meaningful. Avoid crashing when encountering erroneous OFF files. Invert the sense of QUAD normals to be consistent with other objects. Makefile configuration: Removed "make lib" warning in multiple-source library directories. Ensured that the FORMS library is installed by the time it's needed. 1.2.1 September 17, 1992 Fixed a problem with src/lib/forms/Makefile which prevented successful compilation on systems that don't already have the FORMS library installed. 1.2.1 is not really a new release --- it's just a re-packing of the tar file with a new src/lib/forms/Makefile. [ Details of the problem: modified src/lib/forms/Makefile so that it installs libforms.a in bin/sgi upon "make all" rather than just "make install". This is now consistent with the way the other .a files are installed, and fixes a problem which prevented successful makes on systems that don't already have FORMS installed. In previous releases libforms.a was installed by geomview/gl/O.sgi/Makefile before it attempted to link geomview; in 1.2, however, the "example" program links with libforms.a but doesn't install it first. Since "e" comes before "g", "example" is compiled by "make all" before geomview, with the result that the compilation fails since libforms.a is not yet in place. I created geomview-1.2.1.tar.Z by unpacking the 1.2 tar file into a fresh dir, replacing the files ./src/lib/forms/Makefile and ./CHANGES (this file), and re-packing. ] 1.2 September 4, 1992 Panels ------ New iconic tool panel replaces parts of old main panel. "Zoom" now changes camera field of view: add "scale" to change size of geometry. (Can also change apparent size by z-translating object or camera.) Reorganized panels. Camera panel has camera-related things, appearance panel has geometry-related things. Obscure panel now only has normalization and space things. Add save panel. Now through user interface can save: Renderman or .sgi snapshot, text file of commands, geometry, cameras, transforms, windows for any (or all) objects, and position information for all panels. Appearance controls now override all lower levels (before if lower level had appearance of its own it was left unchanged). Added revert button to appearance panel. New "?" button on main panel same as "?" keyboard shortcut (dumps keyboard shortcut summary to tty). Add "CSmooth" mode to shading browser of appearance panel. This is a constant-shaded style (shading depends only on vertex colors, not on lighting) but with smooth interpolation where colors vary across a face. Keyboard Shortcuts ------------------ Lines-closer shortcut "ac" now also "vc" since it's a per-camera option at the moment. Add backface culling (only accessible through keyboard toggle "vb"). "g" keyboard prefix now picks world not most recently picked geometry. "." new prefix for target object, i.e. "self". "P*" keyboard shortcut to bring up panels. "[se|sh]" shortcut changed to "[me|mh|ms]". (m for metric since s for space got taken over by "scale"). "TV" toggles NTSC video mode. "vs" toggles single vs. double-buffered windows. Commands ------------- Add complete help messages for all command language functions and new commands "?" and "??". The syntax of the write command has changed. See geomview.5. Added position, position-at, position-toward commands. Added rawevent, winenter, freeze commands (intended for development not for general use.) External module command name changes: emodule-define is the new name for ui-emotion-program. emodule-start is the new name for ui-emotion-run. emodule-run is the new name for "|". Eliminated ui-emotion-modename: awkward event-shipping to external modules. More useful access to functionality that is presently hidden internally is under development now. Motion ------- Totally new motion paradigm. Most old functions are mimicked. New functionality added. Can now specify a center of motion (orbit mode used to be camera around center of world: now can be any object orbiting any other object. See "ui-center" command.). Can specify rotations and translations in x, y, z instead of a raw 4x4 matrix (see "transform*" commands). Fly mode changed yet again: now left mouse rotates camera, middle mouse flies camera forward/backward. Flight Sim mode eliminated. External Modules ---------------- Distributing external modules separately from geomview proper, except for a few examples. Added example external module with accompanying tutorial document. Improved handling of external modules; can now run multiple concurrent modules and can finally terminate them. See command language changes above. External modules MUST now run in the foreground, lest geomview think they've died. FORMS/GL modules need to call foreground(). See emodule-run documentation in geomview(5). Do a better job of killing off external modules when geomview exits and suspending them when geomview is suspended. Can now invoke external modules from geomview's command line and can pass (globbed) parameters through to their command lines. Geomview general ---------------- Better Renderman support, especially for automated generation of movie frames. Can specify whether to render directly to framebuffer or to a tiff disk file. Can give file prefix which is then autoincremented on each Renderman snapshot. Tiff file name is constructed from rib file name (used to always be called "image.tiff"). Snapshot pops window to prevent obscuration, and redraws in singlebuffered mode to minimize dithering artifacts, and to avoid a "scrsave" bug which sometimes caused the previous image to be saved. In hyperbolic mode the camera starts out inside the sphere instead of outside the sphere, and the bounding sphere is not automatically drawn. Add spherical space mode. Add new special id's: self, universe, primitive (for coordinate systems). Pick data can be written in any of several coordinate systems. Make picking work on views with dedicated scenes. Better camera geometry for default camera drawn. (Development feature that may change in the future: uses "cam.oogl" file instead if it exists.) Number new objects according to their id, so camera c2 == "Camera<2>", etc. OOGL ---- Better error detection and recovery in OOGL loading rountines. Added method extension mechanism for geom objects. Various internal reorganizations --- renaming variables, etc. Added support for variable-length arrays (vvec's). Added geom transform methods. Print a useful error message if a camera file can't be found. Fixed binary mesh loading bug; binary meshes now load properly. Fixed bug which caused sometimes-wrong screen z computation associated with picking. Fixed picking of closed VECT object. Don't draw VECTs when edge drawing is off. Objects loaded from files are no longer tied to the contents of those files; the sequence "load object, change file, load other object from same file" now yields two distinct objects, not two identical copies of the new version. General ------- Made source code more ANSI-compliant. Many optimizations; code runs faster. Fixed bugs assocaited with communication via pipes; close them Fixed bugs associated with reference counting and memory allocation and freeing. New configuration setup; more robust Overhaul Makefile structure; rely more on common Makefiles referenced via "include" Completely new lisp interpreter; much more general and easier to use than previous version. See the man page man/cat3/lisp.3 for details. Fixed various minor bugs. Known problems: --------------- Spherical mode doesn't work on VGXes. Zoom and Scale have no inertia. Constrained motion (to X or Y axis) no longer works. Sometimes core dumps on bad input files. ------------------------------------------------------------------------------- 1.1 May 27 1992 Slightly better documentation; lang.doc renamed geomview.5. Four more sample external modules added. Control panel settings override objects' own appearances. Object vertex/edge/face picking (rightmouse), w/command-language feedback. New flight-simulator motion mode. More state-saving operations, 'write' and 'snapshot' language commands. Command-language control over windows & panels (placement, visibility). Can save scenes in RenderMan .rib format. Many bug fixes including: Memory should now be freed properly when objects are deleted. Code now compiles under IRIX 4.0.1 ANSI C. Input panels now accept input properly under 4.0 (input focus bug fixed). Known problems: IRIX 4.0 remote display (DGL) doesn't work; geomview must run on the machine where it's displaying. ------------------------------------------------------------------------------- 1.0.1 February 25 1992: Miscellaneous minor bug fixes Slightly better documentation ------------------------------------------------------------------------------- 1.0 January 31 1992 initial release geomview-1.9.5/Makefile.in0000644000175000017500000007702312310165551012346 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = . DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in mkinstalldirs COPYING TODO compile \ config.guess config.sub depcomp install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SCRIPTS = $(noinst_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" \ "$(DESTDIR)$(pkgincludeprivdir)" HEADERS = $(nodist_pkginclude_HEADERS) \ $(nodist_pkgincludepriv_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # 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 DIST_SUBDIRS = $(SUBDIRS) 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) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).tar.xz GZIP_ENV = --best DIST_TARGETS = dist-xz 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@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 SUBDIRS = src data doc EXTRA_DIST = reconf geomview.sh INSTALL.Geomview mkmodulesdir noinst_SCRIPTS = geomview nodist_pkginclude_HEADERS = @GEOMVIEWHDRFILES@ pkgincludeprivdir = ${pkgincludedir}/private nodist_pkgincludepriv_HEADERS = @GEOMVIEWPRIVHDRFILES@ EXTRA_HEADERS = DISTCLEANFILES = geomview MAINTAINERCLEANFILES = \ configure config.guess config.h.in config.sub depcomp geomview*.tar.* \ install-sh missing INSTALL aclocal.m4 all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-nodist_pkgincludeHEADERS: $(nodist_pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(nodist_pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || 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_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-nodist_pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(nodist_pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) install-nodist_pkgincludeprivHEADERS: $(nodist_pkgincludepriv_HEADERS) @$(NORMAL_INSTALL) @list='$(nodist_pkgincludepriv_HEADERS)'; test -n "$(pkgincludeprivdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludeprivdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludeprivdir)" || 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_HEADER) $$files '$(DESTDIR)$(pkgincludeprivdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludeprivdir)" || exit $$?; \ done uninstall-nodist_pkgincludeprivHEADERS: @$(NORMAL_UNINSTALL) @list='$(nodist_pkgincludepriv_HEADERS)'; test -n "$(pkgincludeprivdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludeprivdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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-recursive 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 distdir: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || 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) | GZIP=$(GZIP_ENV) gzip -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 shar distribution archives 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 distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -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*) \ GZIP=$(GZIP_ENV) gzip -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*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(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 \ && ../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 check: check-recursive all-am: Makefile $(SCRIPTS) $(HEADERS) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgincludeprivdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-local distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-nodist_pkgincludeHEADERS \ install-nodist_pkgincludeprivHEADERS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-nodist_pkgincludeHEADERS \ uninstall-nodist_pkgincludeprivHEADERS .MAKE: $(am__recursive_targets) all install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool 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-generic \ distclean-hdr distclean-libtool distclean-local distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-nodist_pkgincludeHEADERS \ install-nodist_pkgincludeprivHEADERS install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-nodist_pkgincludeHEADERS \ uninstall-nodist_pkgincludeprivHEADERS geomview: geomview.sh Makefile echo top_builddir is $(abs_top_builddir) sed -e 's|%GEOMROOT%|$(abs_top_srcdir)|g' \ -e 's|%GEOMVIEW_GVX%|$(abs_top_builddir)/src/bin/geomview/x11/gvx|g' \ -e 's|%GEOMVIEW_LTGVX%|$(abs_top_builddir)/src/bin/geomview/x11/.libs/lt-gvx|g' \ -e 's|%MACHTYPE%|$(MACHTYPE)|g' \ -e 's|%GEOMDATA%|$(abs_top_srcdir)/data|g' \ -e 's|%MODULESDIR%|$(abs_top_builddir)/modules|g' \ -e "s|%LD_LIBRARY_PATH_SETTINGS%|$(LD_LIBRARY_PATH_SETTINGS)|g" \ -e "s|%GEOMVIEW_LIB%|$(libdir)|g" \ -e "s|%GEOMVIEW_INCLUDE%|$(pkgincludedir)|g" \ -e "s|%PACKAGE_VERSION%|$(PACKAGE_VERSION)|g" \ -e "s|%GEOMDOCDIR%|$(abs_top_builddir)/doc|g" \ < $(top_srcdir)/geomview.sh > geomview chmod +x geomview distclean-local: rm -rf include modules find . -name "*~" -exec rm -f \{\} \; # 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: geomview-1.9.5/Makefile.am0000644000175000017500000000243612310110201012307 00000000000000ACLOCAL_AMFLAGS = -I m4 SUBDIRS = src data doc EXTRA_DIST = reconf geomview.sh INSTALL.Geomview mkmodulesdir noinst_SCRIPTS = geomview nodist_pkginclude_HEADERS = @GEOMVIEWHDRFILES@ pkgincludeprivdir = ${pkgincludedir}/private nodist_pkgincludepriv_HEADERS = @GEOMVIEWPRIVHDRFILES@ EXTRA_HEADERS = geomview: geomview.sh Makefile echo top_builddir is $(abs_top_builddir) sed -e 's|%GEOMROOT%|$(abs_top_srcdir)|g' \ -e 's|%GEOMVIEW_GVX%|$(abs_top_builddir)/src/bin/geomview/x11/gvx|g' \ -e 's|%GEOMVIEW_LTGVX%|$(abs_top_builddir)/src/bin/geomview/x11/.libs/lt-gvx|g' \ -e 's|%MACHTYPE%|$(MACHTYPE)|g' \ -e 's|%GEOMDATA%|$(abs_top_srcdir)/data|g' \ -e 's|%MODULESDIR%|$(abs_top_builddir)/modules|g' \ -e "s|%LD_LIBRARY_PATH_SETTINGS%|$(LD_LIBRARY_PATH_SETTINGS)|g" \ -e "s|%GEOMVIEW_LIB%|$(libdir)|g" \ -e "s|%GEOMVIEW_INCLUDE%|$(pkgincludedir)|g" \ -e "s|%PACKAGE_VERSION%|$(PACKAGE_VERSION)|g" \ -e "s|%GEOMDOCDIR%|$(abs_top_builddir)/doc|g" \ < $(top_srcdir)/geomview.sh > geomview chmod +x geomview DISTCLEANFILES = geomview distclean-local: rm -rf include modules find . -name "*~" -exec rm -f \{\} \; MAINTAINERCLEANFILES = \ configure config.guess config.h.in config.sub depcomp geomview*.tar.* \ install-sh missing INSTALL aclocal.m4 geomview-1.9.5/configure0000755000175000017500000265114712310165550012216 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for geomview 1.9.5. # # Report bugs to >. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and Claus-Justus Heine $0: about your $0: system, including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a 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'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='geomview' PACKAGE_TARNAME='geomview' PACKAGE_VERSION='1.9.5' PACKAGE_STRING='geomview 1.9.5' PACKAGE_BUGREPORT='Claus-Justus Heine ' PACKAGE_URL='' ac_unique_file="src/bin/geomview/x11/gvmain.c" # 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_config_libobj_dir=src/lib/aclib ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS default_includes GEOMVIEWPRIVHDRFILES GEOMVIEWHDRFILES STUBLIB MOTIFUILIB OOGLLIB OOGLLIBS top_geom_builddir geomdatadir moduledir HAVE_CXX_FALSE HAVE_CXX_TRUE BEZIER_SPHERES_FALSE BEZIER_SPHERES_TRUE LD_LIBRARY_PATH_SETTINGS ZLIB_NAME ZLIB_ALL_LIB ZLIB_LIB ZLIB_LIB_PATH ZLIB_ALL_INCLUDES ZLIB_INCLUDES ZLIB_INCLUDE_PATH HAVE_ZLIB_FALSE HAVE_ZLIB_TRUE MGGL_FALSE MGGL_TRUE MGX11_FALSE MGX11_TRUE MGOPENGL_FALSE MGOPENGL_TRUE OPENGLINCLUDE OPENGLLIBS MESAGL MOTIFLIBS MOTIFINCLUDE XMULIBS XLIBS X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS XMKMF PDFVIEWER HTMLBROWSER MACHTYPE SOCKETLIBS POW_LIB LIBOBJS ALLOCA DELIGHT_SHADER_COMPILER_FALSE DELIGHT_SHADER_COMPILER_TRUE DELIGHT_SHADER_COMPILER PIXIE_SHADER_COMPILER_FALSE PIXIE_SHADER_COMPILER_TRUE PIXIE_SHADER_COMPILER AQSIS_SHADER_COMPILER_FALSE AQSIS_SHADER_COMPILER_TRUE AQSIS_SHADER_COMPILER PAMTOTIFF PNMTOPNG PDFIMAGESPROG EPSTOPDF PS2EPSI GLOB_SHELL GLOB_SHELL_PATH FIND CXXCPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED LIBTOOL INSTALL_LIBGEOMVIEW_FALSE INSTALL_LIBGEOMVIEW_TRUE YFLAGS YACC LEXLIB LEX_OUTPUT_ROOT LEX CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX expanded_exec_prefix expanded_prefix DEFAULT_PREFIX abs_top_srcdir abs_top_builddir MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode with_build_path enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock with_aqsis_shader_compiler with_pixie_shader_compiler with_delight_shader_compiler with_htmlbrowser with_pdfviewer with_motif with_opengl with_x with_zlib with_zlib_name with_zlib_dir with_zlib_lib with_zlib_headers enable_d1debug enable_motion_averaging ' ac_precious_vars='build_alias host_alias target_alias DEFAULT_PREFIX CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP YACC YFLAGS CXXCPP XMKMF' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures geomview 1.9.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/geomview] --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 X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of geomview 1.9.5:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-d1debug turn on D1 level debugging output --enable-motion-averaging turn on experimental motion averaging (default is off) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-build-path=DIR use DIR/include DIR/lib --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-aqsis-shader-compiler=PROGRAM Set PROGRAM to the name of the `aqsis-shader-compiler' program (usually `aqsl'). (default: autodetected) --with-pixie-shader-compiler=PROGRAM Set PROGRAM to the name of the `pixie-shader-compiler' program (usually `sdrc'). (default: autodetected) --with-delight-shader-compiler=PROGRAM Set PROGRAM to the name of the `delight-shader-compiler' program (usually `shaderdl'). (default: autodetected) --with-htmlbrowser=BROWSER Use BROWSER for viewing the HTML version of the manual when the `Manual (HTML)' menu item is selected. This setting can be changed at runtime through the '(ui-html-browser BROWSER)' GCL-command. (default: firefox) --with-pdfviewer=VIEWER Use BROWSER for viewing the PDF version of the manual when the `Manual (PDF)' menu item is selected. This setting can be changed at runtime through the '(ui-pdf-viewer VIEWER)' GCL-command. (default: xpdf) --with-motif=DIR Set DIR to motif installation prefix. It is not possible to compile Geomview without Motif. --with-opengl=DIR Set DIR to opengl installation prefix. OpenGL is optional. The default is to auto-detect OpenGL and use it if available. Use `--without-opengl' to disable OpenGL. --with-x use the X Window System --without-zlib disable use of package zlib (default: autodetect) --with-zlib-name=NAME use NAME as the name of the zlib library (without leading "lib" prefix and trailing suffix). Default: "z" --with-zlib-dir=DIR use zlib library (and headers) below directory DIR (no default) --with-zlib-lib=DIR use zlib library below directory DIR (default: EPREFIX/lib/) --with-zlib-headers=DIR use zlib include files below directory DIR (default: PREFIX/include/) Some influential environment variables: DEFAULT_PREFIX Default installation prefix 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 CC C compiler command CFLAGS C compiler flags CPP C preprocessor YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to $YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CXXCPP C++ preprocessor XMKMF Path to xmkmf, Makefile generator for X Window System 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 geomview configure 1.9.5 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_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_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { 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 eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=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 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_type # 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 Claus-Justus Heine ## ## ---------------------------------------------------------------------------- ##" ) | 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_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _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_decl 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 geomview $as_me 1.9.5, 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: configuring $PACKAGE_NAME $PACKAGE_VERSION" >&5 $as_echo "configuring $PACKAGE_NAME $PACKAGE_VERSION" >&6; } ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- am__api_version='1.14' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='geomview' VERSION='1.9.5' 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. 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE ac_config_headers="$ac_config_headers config.h" test "x${DEFAULT_PREFIX}" = "x" && DEFAULT_PREFIX="${ac_default_prefix}" test "x$prefix" = xNONE && prefix="${DEFAULT_PREFIX}" PREFIX="${prefix}" # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' expanded_prefix=`eval eval eval echo ${prefix}` expanded_exec_prefix=`eval eval eval echo ${exec_prefix}` # Check whether --with-build-path was given. if test "${with_build_path+set}" = set; then : withval=$with_build_path; for d in `echo $withval | tr : ' '`; do test -d $d/include && CPPFLAGS="$CPPFLAGS -I$d/include" test -d $d/lib && LDFLAGS="$LDFLAGS -L$d/lib" done fi ## Autoheader stuff. ################################################################################ # # What follows was originally output from autoscan. We do some generic # checking before overiding specific stuff (ACCEPT_ARG3_TYPE) for # certain known systems. # # 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" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$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 if test "$CXX" = "" ; then HAVE_CXX=false { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Configuring without a C++ compiler (couldn't find one on your system). C++ is only used only to compile the vrml->OOGL converter, so your distribution will be compiled without it. " >&5 $as_echo "$as_me: WARNING: Configuring without a C++ compiler (couldn't find one on your system). C++ is only used only to compile the vrml->OOGL converter, so your distribution will be compiled without it. " >&2;} else HAVE_CXX=true 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 _alberta_save_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 ISO C99 features with \"${CC} ${CFLAGS}\"" >&5 $as_echo_n "checking for ISO C99 features with \"${CC} ${CFLAGS}\"... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern void exit(int status); #define FOO(a, ...) (a, __VA_ARGS__) extern int foo(int a, int b, int c); int main () { int bar[foo FOO(3, 4, 5)]; exit(bar[0]); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_ISO_C99=1 { $as_echo "$as_me:${as_lineno-$LINENO}: result: variadic macros and variable length arrays are available" >&5 $as_echo "variadic macros and variable length arrays are available" >&6; } else HAVE_ISO_C99=0 { $as_echo "$as_me:${as_lineno-$LINENO}: result: variadic macros and/or vairable length arrays are NOT available" >&5 $as_echo "variadic macros and/or vairable length arrays are NOT available" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="${_alberta_save_cflags}" cat >>confdefs.h <<_ACEOF #define HAVE_ISO_C99 ${HAVE_ISO_C99} _ACEOF 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 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 for ac_prog in flex lex 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_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # 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_LEX="$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 LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" 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 "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "#define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi for ac_prog in 'bison -y' byacc 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_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # 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_YACC="$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 YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" if true || test "z${enable_shared}" = "zyes"; then INSTALL_LIBGEOMVIEW_TRUE= INSTALL_LIBGEOMVIEW_FALSE='#' else INSTALL_LIBGEOMVIEW_TRUE='#' INSTALL_LIBGEOMVIEW_FALSE= fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi # Handle Gentoo/FreeBSD as it was Linux case $host_vendor in gentoo) version_type=linux ;; *) version_type=freebsd-$objformat ;; esac case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; linux) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' need_lib_prefix=no need_version=no ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi # Handle Gentoo/FreeBSD as it was Linux case $host_vendor in gentoo) version_type=linux ;; *) version_type=freebsd-$objformat ;; esac case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; linux) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' need_lib_prefix=no need_version=no ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: # Search path for "find" executable. Use "find" unless # the bogus MS Windows version is first on the path, in # which case we use the full pathname. This AC_CHECK_PROG # macro is very strange. # Extract the first word of "find", so it can be a program name with args. set dummy find; 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_FIND+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$FIND"; then ac_cv_prog_FIND="$FIND" # 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" = "/cygdrive/c/WINNT/system32/find"; then ac_prog_rejected=yes continue fi ac_cv_prog_FIND="find" $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_FIND 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 FIND to just the basename; use the full file name. shift ac_cv_prog_FIND="$as_dir/$ac_word${1+' '}$@" fi fi test -z "$ac_cv_prog_FIND" && ac_cv_prog_FIND="no" fi fi FIND=$ac_cv_prog_FIND if test -n "$FIND"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FIND" >&5 $as_echo "$FIND" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$FIND" = "no"; then as_fn_error $? "No find found. Cannot continue." "$LINENO" 5 fi # Check for availability of /bin/csh for file-name globbing. Try /bin/sh # if not found. for ac_prog in csh sh do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GLOB_SHELL_PATH+:} false; then : $as_echo_n "(cached) " >&6 else case $GLOB_SHELL_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_GLOB_SHELL_PATH="$GLOB_SHELL_PATH" # 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_GLOB_SHELL_PATH="$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 GLOB_SHELL_PATH=$ac_cv_path_GLOB_SHELL_PATH if test -n "$GLOB_SHELL_PATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLOB_SHELL_PATH" >&5 $as_echo "$GLOB_SHELL_PATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GLOB_SHELL_PATH" && break done test -n "$GLOB_SHELL_PATH" || GLOB_SHELL_PATH="/bin/csh" if echo ${GLOB_SHELL_PATH} | grep csh > /dev/null 2>&1; then GLOB_SHELL="${GLOB_SHELL_PATH} -f -c " else GLOB_SHELL="${GLOB_SHELL_PATH} -c " fi cat >>confdefs.h <<_ACEOF #define GLOB_SHELL "${GLOB_SHELL}" _ACEOF # for ac_prog in ps2epsi 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_PS2EPSI+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PS2EPSI"; then ac_cv_prog_PS2EPSI="$PS2EPSI" # 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_PS2EPSI="$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 PS2EPSI=$ac_cv_prog_PS2EPSI if test -n "$PS2EPSI"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PS2EPSI" >&5 $as_echo "$PS2EPSI" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PS2EPSI" && break done for ac_prog in epstopdf 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_EPSTOPDF+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$EPSTOPDF"; then ac_cv_prog_EPSTOPDF="$EPSTOPDF" # 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_EPSTOPDF="$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 EPSTOPDF=$ac_cv_prog_EPSTOPDF if test -n "$EPSTOPDF"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EPSTOPDF" >&5 $as_echo "$EPSTOPDF" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$EPSTOPDF" && break done for ac_prog in pdfimages 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_PDFIMAGESPROG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PDFIMAGESPROG"; then ac_cv_prog_PDFIMAGESPROG="$PDFIMAGESPROG" # 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_PDFIMAGESPROG="$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 PDFIMAGESPROG=$ac_cv_prog_PDFIMAGESPROG if test -n "$PDFIMAGESPROG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PDFIMAGESPROG" >&5 $as_echo "$PDFIMAGESPROG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PDFIMAGESPROG" && break done for ac_prog in pnmtopng 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_PNMTOPNG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PNMTOPNG"; then ac_cv_prog_PNMTOPNG="$PNMTOPNG" # 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_PNMTOPNG="$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 PNMTOPNG=$ac_cv_prog_PNMTOPNG if test -n "$PNMTOPNG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PNMTOPNG" >&5 $as_echo "$PNMTOPNG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PNMTOPNG" && break done # For rman texture support. If not found we can only output RGB pnm images # without alpha channel. for ac_prog in pamtotiff 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_PAMTOTIFF+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PAMTOTIFF"; then ac_cv_prog_PAMTOTIFF="$PAMTOTIFF" # 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_PAMTOTIFF="$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 PAMTOTIFF=$ac_cv_prog_PAMTOTIFF if test -n "$PAMTOTIFF"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PAMTOTIFF" >&5 $as_echo "$PAMTOTIFF" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PAMTOTIFF" && break done if test "${PAMTOTIFF}" = "pamtotiff"; then cat >>confdefs.h <<_ACEOF #define HAVE_PAMTOTIFF "$PAMTOTIFF" _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: \`pamtotiff' executable not found; textures in RenderMan output will not have an alpha-channel. Consider installing a newer NetPBM package." >&5 $as_echo "$as_me: \`pamtotiff' executable not found; textures in RenderMan output will not have an alpha-channel. Consider installing a newer NetPBM package." >&6;} fi # Check for various shader language comilers; we try to compile and # install our RenderMan shaders for any of the shader compilers; I # have included only those which are free of charge. # # Check whether --with-aqsis-shader-compiler was given. if test "${with_aqsis_shader_compiler+set}" = set; then : withval=$with_aqsis_shader_compiler; case "${withval}" in no) as_fn_error $? "\"--without-aqsis-shader-compiler\" or \"--with-aqsis-shader-compiler=no\" is not an option here" "$LINENO" 5 ;; yes) # simply ignore that, use auto-detection ;; *) AQSIS_SHADER_COMPILEROPT="${withval}" ;; esac else AQSIS_SHADER_COMPILEROPT=aqsl fi acgv_path=`dirname "${AQSIS_SHADER_COMPILEROPT}"|sed -e 's|^\./\?||g'` if test -n "${acgv_path}"; then AQSIS_SHADER_COMPILERPROG=`basename "${AQSIS_SHADER_COMPILEROPT}"` if echo "${acgv_path}" | egrep '^/' > /dev/null 2>&1 ; then acgv_path="${acgv_path}" else acgv_path="`pwd`/${acgv_path}" fi for ac_prog in ${AQSIS_SHADER_COMPILERPROG} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_AQSIS_SHADER_COMPILER+:} false; then : $as_echo_n "(cached) " >&6 else case $AQSIS_SHADER_COMPILER in [\\/]* | ?:[\\/]*) ac_cv_path_AQSIS_SHADER_COMPILER="$AQSIS_SHADER_COMPILER" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${acgv_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_AQSIS_SHADER_COMPILER="$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 AQSIS_SHADER_COMPILER=$ac_cv_path_AQSIS_SHADER_COMPILER if test -n "$AQSIS_SHADER_COMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AQSIS_SHADER_COMPILER" >&5 $as_echo "$AQSIS_SHADER_COMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AQSIS_SHADER_COMPILER" && break done test -n "$AQSIS_SHADER_COMPILER" || AQSIS_SHADER_COMPILER="not found" else AQSIS_SHADER_COMPILERPROG="${AQSIS_SHADER_COMPILEROPT}" acgv_path="${PATH}" for ac_prog in ${AQSIS_SHADER_COMPILERPROG} 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_AQSIS_SHADER_COMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AQSIS_SHADER_COMPILER"; then ac_cv_prog_AQSIS_SHADER_COMPILER="$AQSIS_SHADER_COMPILER" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${acgv_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_AQSIS_SHADER_COMPILER="$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 AQSIS_SHADER_COMPILER=$ac_cv_prog_AQSIS_SHADER_COMPILER if test -n "$AQSIS_SHADER_COMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AQSIS_SHADER_COMPILER" >&5 $as_echo "$AQSIS_SHADER_COMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AQSIS_SHADER_COMPILER" && break done test -n "$AQSIS_SHADER_COMPILER" || AQSIS_SHADER_COMPILER="not found" fi acgv_required=optional if test "${AQSIS_SHADER_COMPILER}" = "not found" -a "${acgv_required}" = "required"; then as_fn_error $? "\`aqsis-shader-compiler' executable not found. Check your installation." "$LINENO" 5 exit 1 fi if ! test "${AQSIS_SHADER_COMPILER}" = "not found"; then AQSIS_SHADER_COMPILER_TRUE= AQSIS_SHADER_COMPILER_FALSE='#' else AQSIS_SHADER_COMPILER_TRUE='#' AQSIS_SHADER_COMPILER_FALSE= fi # Check whether --with-pixie-shader-compiler was given. if test "${with_pixie_shader_compiler+set}" = set; then : withval=$with_pixie_shader_compiler; case "${withval}" in no) as_fn_error $? "\"--without-pixie-shader-compiler\" or \"--with-pixie-shader-compiler=no\" is not an option here" "$LINENO" 5 ;; yes) # simply ignore that, use auto-detection ;; *) PIXIE_SHADER_COMPILEROPT="${withval}" ;; esac else PIXIE_SHADER_COMPILEROPT=sdrc fi acgv_path=`dirname "${PIXIE_SHADER_COMPILEROPT}"|sed -e 's|^\./\?||g'` if test -n "${acgv_path}"; then PIXIE_SHADER_COMPILERPROG=`basename "${PIXIE_SHADER_COMPILEROPT}"` if echo "${acgv_path}" | egrep '^/' > /dev/null 2>&1 ; then acgv_path="${acgv_path}" else acgv_path="`pwd`/${acgv_path}" fi for ac_prog in ${PIXIE_SHADER_COMPILERPROG} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PIXIE_SHADER_COMPILER+:} false; then : $as_echo_n "(cached) " >&6 else case $PIXIE_SHADER_COMPILER in [\\/]* | ?:[\\/]*) ac_cv_path_PIXIE_SHADER_COMPILER="$PIXIE_SHADER_COMPILER" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${acgv_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_PIXIE_SHADER_COMPILER="$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 PIXIE_SHADER_COMPILER=$ac_cv_path_PIXIE_SHADER_COMPILER if test -n "$PIXIE_SHADER_COMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PIXIE_SHADER_COMPILER" >&5 $as_echo "$PIXIE_SHADER_COMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PIXIE_SHADER_COMPILER" && break done test -n "$PIXIE_SHADER_COMPILER" || PIXIE_SHADER_COMPILER="not found" else PIXIE_SHADER_COMPILERPROG="${PIXIE_SHADER_COMPILEROPT}" acgv_path="${PATH}" for ac_prog in ${PIXIE_SHADER_COMPILERPROG} 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_PIXIE_SHADER_COMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PIXIE_SHADER_COMPILER"; then ac_cv_prog_PIXIE_SHADER_COMPILER="$PIXIE_SHADER_COMPILER" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${acgv_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_PIXIE_SHADER_COMPILER="$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 PIXIE_SHADER_COMPILER=$ac_cv_prog_PIXIE_SHADER_COMPILER if test -n "$PIXIE_SHADER_COMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PIXIE_SHADER_COMPILER" >&5 $as_echo "$PIXIE_SHADER_COMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PIXIE_SHADER_COMPILER" && break done test -n "$PIXIE_SHADER_COMPILER" || PIXIE_SHADER_COMPILER="not found" fi acgv_required=optional if test "${PIXIE_SHADER_COMPILER}" = "not found" -a "${acgv_required}" = "required"; then as_fn_error $? "\`pixie-shader-compiler' executable not found. Check your installation." "$LINENO" 5 exit 1 fi if ! test "${PIXIE_SHADER_COMPILER}" = "not found"; then PIXIE_SHADER_COMPILER_TRUE= PIXIE_SHADER_COMPILER_FALSE='#' else PIXIE_SHADER_COMPILER_TRUE='#' PIXIE_SHADER_COMPILER_FALSE= fi # Check whether --with-delight-shader-compiler was given. if test "${with_delight_shader_compiler+set}" = set; then : withval=$with_delight_shader_compiler; case "${withval}" in no) as_fn_error $? "\"--without-delight-shader-compiler\" or \"--with-delight-shader-compiler=no\" is not an option here" "$LINENO" 5 ;; yes) # simply ignore that, use auto-detection ;; *) DELIGHT_SHADER_COMPILEROPT="${withval}" ;; esac else DELIGHT_SHADER_COMPILEROPT=shaderdl fi acgv_path=`dirname "${DELIGHT_SHADER_COMPILEROPT}"|sed -e 's|^\./\?||g'` if test -n "${acgv_path}"; then DELIGHT_SHADER_COMPILERPROG=`basename "${DELIGHT_SHADER_COMPILEROPT}"` if echo "${acgv_path}" | egrep '^/' > /dev/null 2>&1 ; then acgv_path="${acgv_path}" else acgv_path="`pwd`/${acgv_path}" fi for ac_prog in ${DELIGHT_SHADER_COMPILERPROG} do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_DELIGHT_SHADER_COMPILER+:} false; then : $as_echo_n "(cached) " >&6 else case $DELIGHT_SHADER_COMPILER in [\\/]* | ?:[\\/]*) ac_cv_path_DELIGHT_SHADER_COMPILER="$DELIGHT_SHADER_COMPILER" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${acgv_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_DELIGHT_SHADER_COMPILER="$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 DELIGHT_SHADER_COMPILER=$ac_cv_path_DELIGHT_SHADER_COMPILER if test -n "$DELIGHT_SHADER_COMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DELIGHT_SHADER_COMPILER" >&5 $as_echo "$DELIGHT_SHADER_COMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DELIGHT_SHADER_COMPILER" && break done test -n "$DELIGHT_SHADER_COMPILER" || DELIGHT_SHADER_COMPILER="not found" else DELIGHT_SHADER_COMPILERPROG="${DELIGHT_SHADER_COMPILEROPT}" acgv_path="${PATH}" for ac_prog in ${DELIGHT_SHADER_COMPILERPROG} 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_DELIGHT_SHADER_COMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DELIGHT_SHADER_COMPILER"; then ac_cv_prog_DELIGHT_SHADER_COMPILER="$DELIGHT_SHADER_COMPILER" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${acgv_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_DELIGHT_SHADER_COMPILER="$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 DELIGHT_SHADER_COMPILER=$ac_cv_prog_DELIGHT_SHADER_COMPILER if test -n "$DELIGHT_SHADER_COMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DELIGHT_SHADER_COMPILER" >&5 $as_echo "$DELIGHT_SHADER_COMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DELIGHT_SHADER_COMPILER" && break done test -n "$DELIGHT_SHADER_COMPILER" || DELIGHT_SHADER_COMPILER="not found" fi acgv_required=optional if test "${DELIGHT_SHADER_COMPILER}" = "not found" -a "${acgv_required}" = "required"; then as_fn_error $? "\`delight-shader-compiler' executable not found. Check your installation." "$LINENO" 5 exit 1 fi if ! test "${DELIGHT_SHADER_COMPILER}" = "not found"; then DELIGHT_SHADER_COMPILER_TRUE= DELIGHT_SHADER_COMPILER_FALSE='#' else DELIGHT_SHADER_COMPILER_TRUE='#' DELIGHT_SHADER_COMPILER_FALSE= fi # Checks for libraries. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $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 cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=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_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi # Checks for header files. ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 $as_echo_n "checking for working alloca.h... " >&6; } if ${ac_cv_working_alloca_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_working_alloca_h=yes else ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 $as_echo "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 $as_echo_n "checking for alloca... " >&6; } if ${ac_cv_func_alloca_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ void *alloca (size_t); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_alloca_works=yes else ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 $as_echo "$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext $as_echo "#define C_ALLOCA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } if ${ac_cv_os_cray+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then : ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 $as_echo "$ac_cv_os_cray" >&6; } if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 $as_echo_n "checking stack direction for C alloca... " >&6; } if ${ac_cv_c_stack_direction+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_stack_direction=0 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } int main (int argc, char **argv) { return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_stack_direction=1 else ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 $as_echo "$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} 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 opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; 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_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} 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 opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; 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_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 $as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } if ${ac_cv_header_sys_wait_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_sys_wait_h=yes else ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 $as_echo "$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then $as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h fi for ac_header in errno.h fcntl.h getopt.h inttypes.h libgen.h libintl.h \ limits.h locale.h malloc.h \ netinet/in.h stddef.h stdlib.h string.h sys/file.h sys/param.h sys/select.h \ sys/socket.h sys/systeminfo.h sys/time.h sys/types.h unistd.h io.h math.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 fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes 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_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for M_PI" >&5 $as_echo_n "checking for M_PI... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if HAVE_MATH_H # include #endif int main () { double blah = M_PI; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_M_PI 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_fn_c_check_type "$LINENO" "dev_t" "ac_cv_type_dev_t" "$ac_includes_default" if test "x$ac_cv_type_dev_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DEV_T 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "ino_t" "ac_cv_type_ino_t" "$ac_includes_default" if test "x$ac_cv_type_ino_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INO_T 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "time_t" "ac_cv_type_time_t" "$ac_includes_default" if test "x$ac_cv_type_time_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_TIME_T 1 _ACEOF fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of dev_t" >&5 $as_echo_n "checking size of dev_t... " >&6; } if ${ac_cv_sizeof_dev_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (dev_t))" "ac_cv_sizeof_dev_t" "$ac_includes_default"; then : else if test "$ac_cv_type_dev_t" = yes; 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 77 "cannot compute sizeof (dev_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_dev_t=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_dev_t" >&5 $as_echo "$ac_cv_sizeof_dev_t" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_DEV_T $ac_cv_sizeof_dev_t _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of ino_t" >&5 $as_echo_n "checking size of ino_t... " >&6; } if ${ac_cv_sizeof_ino_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (ino_t))" "ac_cv_sizeof_ino_t" "$ac_includes_default"; then : else if test "$ac_cv_type_ino_t" = yes; 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 77 "cannot compute sizeof (ino_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_ino_t=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_ino_t" >&5 $as_echo "$ac_cv_sizeof_ino_t" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_INO_T $ac_cv_sizeof_ino_t _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5 $as_echo_n "checking size of time_t... " >&6; } if ${ac_cv_sizeof_time_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))" "ac_cv_sizeof_time_t" "$ac_includes_default"; then : else if test "$ac_cv_type_time_t" = yes; 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 77 "cannot compute sizeof (time_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_time_t=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_time_t" >&5 $as_echo "$ac_cv_sizeof_time_t" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_TIME_T $ac_cv_sizeof_time_t _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 $as_echo_n "checking size of long... " >&6; } if ${ac_cv_sizeof_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : else if test "$ac_cv_type_long" = yes; 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 77 "cannot compute sizeof (long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 $as_echo "$ac_cv_sizeof_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 $as_echo_n "checking size of int... " >&6; } if ${ac_cv_sizeof_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : else if test "$ac_cv_type_int" = yes; 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 77 "cannot compute sizeof (int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 $as_echo "$ac_cv_sizeof_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF # Checks for library functions { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5 $as_echo_n "checking whether closedir returns void... " >&6; } if ${ac_cv_func_closedir_void+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_closedir_void=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include <$ac_header_dirent> #ifndef __cplusplus int closedir (); #endif int main () { return closedir (opendir (".")) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_closedir_void=no else ac_cv_func_closedir_void=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5 $as_echo "$ac_cv_func_closedir_void" >&6; } if test $ac_cv_func_closedir_void = yes; then $as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" if test "x$ac_cv_type_pid_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi for ac_header in vfork.h do : ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default" if test "x$ac_cv_header_vfork_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VFORK_H 1 _ACEOF fi done for ac_func in fork vfork do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_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 if test "x$ac_cv_func_fork" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5 $as_echo_n "checking for working fork... " >&6; } if ${ac_cv_func_fork_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_fork_works=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* By Ruediger Kuhlmann. */ return fork () < 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_fork_works=yes else ac_cv_func_fork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5 $as_echo "$ac_cv_func_fork_works" >&6; } else ac_cv_func_fork_works=$ac_cv_func_fork fi if test "x$ac_cv_func_fork_works" = xcross; then case $host in *-*-amigaos* | *-*-msdosdjgpp*) # Override, as these systems have only a dummy fork() stub ac_cv_func_fork_works=no ;; *) ac_cv_func_fork_works=yes ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} fi ac_cv_func_vfork_works=$ac_cv_func_vfork if test "x$ac_cv_func_vfork" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5 $as_echo_n "checking for working vfork... " >&6; } if ${ac_cv_func_vfork_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_vfork_works=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Thanks to Paul Eggert for this test. */ $ac_includes_default #include #ifdef HAVE_VFORK_H # include #endif /* On some sparc systems, changes by the child to local and incoming argument registers are propagated back to the parent. The compiler is told about this with #include , but some compilers (e.g. gcc -O) don't grok . Test for this by using a static variable whose address is put into a register that is clobbered by the vfork. */ static void #ifdef __cplusplus sparc_address_test (int arg) # else sparc_address_test (arg) int arg; #endif { static pid_t child; if (!child) { child = vfork (); if (child < 0) { perror ("vfork"); _exit(2); } if (!child) { arg = getpid(); write(-1, "", 0); _exit (arg); } } } int main () { pid_t parent = getpid (); pid_t child; sparc_address_test (0); child = vfork (); if (child == 0) { /* Here is another test for sparc vfork register problems. This test uses lots of local variables, at least as many local variables as main has allocated so far including compiler temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should reuse the register of parent for one of the local variables, since it will think that parent can't possibly be used any more in this routine. Assigning to the local variable will thus munge parent in the parent process. */ pid_t p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); /* Convince the compiler that p..p7 are live; otherwise, it might use the same hardware register for all 8 local variables. */ if (p != p1 || p != p2 || p != p3 || p != p4 || p != p5 || p != p6 || p != p7) _exit(1); /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent from child file descriptors. If the child closes a descriptor before it execs or exits, this munges the parent's descriptor as well. Test for this by closing stdout in the child. */ _exit(close(fileno(stdout)) != 0); } else { int status; struct stat st; while (wait(&status) != child) ; return ( /* Was there some problem with vforking? */ child < 0 /* Did the child fail? (This shouldn't happen.) */ || status /* Did the vfork/compiler bug occur? */ || parent != getpid() /* Did the file descriptor bug occur? */ || fstat(fileno(stdout), &st) != 0 ); } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_vfork_works=yes else ac_cv_func_vfork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5 $as_echo "$ac_cv_func_vfork_works" >&6; } fi; if test "x$ac_cv_func_fork_works" = xcross; then ac_cv_func_vfork_works=$ac_cv_func_vfork { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} fi if test "x$ac_cv_func_vfork_works" = xyes; then $as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h else $as_echo "#define vfork fork" >>confdefs.h fi if test "x$ac_cv_func_fork_works" = xyes; then $as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5 $as_echo_n "checking for working memcmp... " >&6; } if ${ac_cv_func_memcmp_working+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_memcmp_working=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Some versions of memcmp are not 8-bit clean. */ char c0 = '\100', c1 = '\200', c2 = '\201'; if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) return 1; /* The Next x86 OpenStep bug shows up only when comparing 16 bytes or more and with at least one buffer not starting on a 4-byte boundary. William Lewis provided this test program. */ { char foo[21]; char bar[21]; int i; for (i = 0; i < 4; i++) { char *a = foo + i; char *b = bar + i; strcpy (a, "--------01111111"); strcpy (b, "--------10000000"); if (memcmp (a, b, 16) >= 0) return 1; } return 0; } ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_memcmp_working=yes else ac_cv_func_memcmp_working=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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working" >&5 $as_echo "$ac_cv_func_memcmp_working" >&6; } test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in *" memcmp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for obstacks" >&5 $as_echo_n "checking for obstacks... " >&6; } if ${ac_cv_func_obstack+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include "obstack.h" int main () { struct obstack mem; #define obstack_chunk_alloc malloc #define obstack_chunk_free free obstack_init (&mem); obstack_free (&mem, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_obstack=yes else ac_cv_func_obstack=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_obstack" >&5 $as_echo "$ac_cv_func_obstack" >&6; } if test $ac_cv_func_obstack = yes; then $as_echo "#define HAVE_OBSTACK 1" >>confdefs.h else case " $LIBOBJS " in *" obstack.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS obstack.$ac_objext" ;; esac fi #AC_FUNC_MALLOC It is ok when malloc(0) returns NULL. Why not? #AC_FUNC_REALLOC It is ok when realloc(0, 0) returns NULL. Why not? { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setpgrp takes no argument" >&5 $as_echo_n "checking whether setpgrp takes no argument... " >&6; } if ${ac_cv_func_setpgrp_void+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : as_fn_error $? "cannot check setpgrp when cross compiling" "$LINENO" 5 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* If this system has a BSD-style setpgrp which takes arguments, setpgrp(1, 1) will fail with ESRCH and return -1, in that case exit successfully. */ return setpgrp (1,1) != -1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_setpgrp_void=no else ac_cv_func_setpgrp_void=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_setpgrp_void" >&5 $as_echo "$ac_cv_func_setpgrp_void" >&6; } if test $ac_cv_func_setpgrp_void = yes; then $as_echo "#define SETPGRP_VOID 1" >>confdefs.h fi if ${ac_cv_func_setvbuf_reversed+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_func_setvbuf_reversed=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 $as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; } if ${ac_cv_func_lstat_dereferences_slashed_symlink+:} false; then : $as_echo_n "(cached) " >&6 else rm -f conftest.sym conftest.file echo >conftest.file if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then if test "$cross_compiling" = yes; then : ac_cv_func_lstat_dereferences_slashed_symlink=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; /* Linux will dereference the symlink and fail, as required by POSIX. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_lstat_dereferences_slashed_symlink=yes else ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else # If the `ln -s' command failed, then we probably don't even # have an lstat function. ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f conftest.sym conftest.file fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 $as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && cat >>confdefs.h <<_ACEOF #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 _ACEOF if test "x$ac_cv_func_lstat_dereferences_slashed_symlink" = xno; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5 $as_echo_n "checking whether stat accepts an empty string... " >&6; } if ${ac_cv_func_stat_empty_string_bug+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_stat_empty_string_bug=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; return stat ("", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_stat_empty_string_bug=no else ac_cv_func_stat_empty_string_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_stat_empty_string_bug" >&5 $as_echo "$ac_cv_func_stat_empty_string_bug" >&6; } if test $ac_cv_func_stat_empty_string_bug = yes; then case " $LIBOBJS " in *" stat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS stat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF #define HAVE_STAT_EMPTY_STRING_BUG 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat accepts an empty string" >&5 $as_echo_n "checking whether lstat accepts an empty string... " >&6; } if ${ac_cv_func_lstat_empty_string_bug+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_lstat_empty_string_bug=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; return lstat ("", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_lstat_empty_string_bug=no else ac_cv_func_lstat_empty_string_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_empty_string_bug" >&5 $as_echo "$ac_cv_func_lstat_empty_string_bug" >&6; } if test $ac_cv_func_lstat_empty_string_bug = yes; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF #define HAVE_LSTAT_EMPTY_STRING_BUG 1 _ACEOF fi #AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strtod" >&5 $as_echo_n "checking for working strtod... " >&6; } if ${ac_cv_func_strtod+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_strtod=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifndef strtod double strtod (); #endif int main() { { /* Some versions of Linux strtod mis-parse strings with leading '+'. */ char *string = " +69"; char *term; double value; value = strtod (string, &term); if (value != 69 || term != (string + 4)) return 1; } { /* Under Solaris 2.4, strtod returns the wrong value for the terminating character under some conditions. */ char *string = "NaN"; char *term; strtod (string, &term); if (term != string && *(term - 1) == 0) return 1; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_strtod=yes else ac_cv_func_strtod=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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strtod" >&5 $as_echo "$ac_cv_func_strtod" >&6; } if test $ac_cv_func_strtod = no; then case " $LIBOBJS " in *" strtod.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strtod.$ac_objext" ;; esac ac_fn_c_check_func "$LINENO" "pow" "ac_cv_func_pow" if test "x$ac_cv_func_pow" = xyes; then : fi if test $ac_cv_func_pow = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pow in -lm" >&5 $as_echo_n "checking for pow in -lm... " >&6; } if ${ac_cv_lib_m_pow+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $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 pow (); int main () { return pow (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_pow=yes else ac_cv_lib_m_pow=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_m_pow" >&5 $as_echo "$ac_cv_lib_m_pow" >&6; } if test "x$ac_cv_lib_m_pow" = xyes; then : POW_LIB=-lm else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot find library containing definition of pow" >&5 $as_echo "$as_me: WARNING: cannot find library containing definition of pow" >&2;} fi fi fi for ac_func in vprintf do : ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" if test "x$ac_cv_func_vprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VPRINTF 1 _ACEOF ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" if test "x$ac_cv_func__doprnt" = xyes; then : $as_echo "#define HAVE_DOPRNT 1" >>confdefs.h fi fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wait3 that fills in rusage" >&5 $as_echo_n "checking for wait3 that fills in rusage... " >&6; } if ${ac_cv_func_wait3_rusage+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_wait3_rusage=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include #include #include /* HP-UX has wait3 but does not fill in rusage at all. */ int main () { struct rusage r; int i; /* Use a field that we can force nonzero -- voluntary context switches. For systems like NeXT and OSF/1 that don't set it, also use the system CPU time. And page faults (I/O) for Linux. */ r.ru_nvcsw = 0; r.ru_stime.tv_sec = 0; r.ru_stime.tv_usec = 0; r.ru_majflt = r.ru_minflt = 0; switch (fork ()) { case 0: /* Child. */ sleep(1); /* Give up the CPU. */ _exit(0); break; case -1: /* What can we do? */ _exit(0); break; default: /* Parent. */ wait3(&i, 0, &r); /* Avoid "text file busy" from rm on fast HP-UX machines. */ sleep(2); return (r.ru_nvcsw == 0 && r.ru_majflt == 0 && r.ru_minflt == 0 && r.ru_stime.tv_sec == 0 && r.ru_stime.tv_usec == 0); } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_wait3_rusage=yes else ac_cv_func_wait3_rusage=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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_wait3_rusage" >&5 $as_echo "$ac_cv_func_wait3_rusage" >&6; } if test $ac_cv_func_wait3_rusage = yes; then $as_echo "#define HAVE_WAIT3 1" >>confdefs.h fi for ac_func in fmemopen do : ac_fn_c_check_func "$LINENO" "fmemopen" "ac_cv_func_fmemopen" if test "x$ac_cv_func_fmemopen" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FMEMOPEN 1 _ACEOF ac_fn_c_check_decl "$LINENO" "fmemopen" "ac_cv_have_decl_fmemopen" "$ac_includes_default" if test "x$ac_cv_have_decl_fmemopen" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FMEMOPEN $ac_have_decl _ACEOF else case " $LIBOBJS " in *" fmemopen.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS fmemopen.$ac_objext" ;; esac fi done ac_fn_c_check_func "$LINENO" "acosh" "ac_cv_func_acosh" if test "x$ac_cv_func_acosh" = xyes; then : $as_echo "#define HAVE_ACOSH 1" >>confdefs.h else case " $LIBOBJS " in *" acosh.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS acosh.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "popen" "ac_cv_func_popen" if test "x$ac_cv_func_popen" = xyes; then : $as_echo "#define HAVE_POPEN 1" >>confdefs.h else case " $LIBOBJS " in *" popen.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS popen.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv" if test "x$ac_cv_func_putenv" = xyes; then : $as_echo "#define HAVE_PUTENV 1" >>confdefs.h else case " $LIBOBJS " in *" putenv.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS putenv.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp" if test "x$ac_cv_func_strcasecmp" = xyes; then : $as_echo "#define HAVE_STRCASECMP 1" >>confdefs.h else case " $LIBOBJS " in *" strcasecmp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strcasecmp.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup" if test "x$ac_cv_func_strdup" = xyes; then : $as_echo "#define HAVE_STRDUP 1" >>confdefs.h else case " $LIBOBJS " in *" strdup.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strdup.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "strncasecmp" "ac_cv_func_strncasecmp" if test "x$ac_cv_func_strncasecmp" = xyes; then : $as_echo "#define HAVE_STRNCASECMP 1" >>confdefs.h else case " $LIBOBJS " in *" strncasecmp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strncasecmp.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "lstat" "ac_cv_func_lstat" if test "x$ac_cv_func_lstat" = xyes; then : $as_echo "#define HAVE_LSTAT 1" >>confdefs.h else case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "stat" "ac_cv_func_stat" if test "x$ac_cv_func_stat" = xyes; then : $as_echo "#define HAVE_STAT 1" >>confdefs.h else case " $LIBOBJS " in *" stat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS stat.$ac_objext" ;; esac fi ac_fn_c_check_decl "$LINENO" "putenv" "ac_cv_have_decl_putenv" "$ac_includes_default" if test "x$ac_cv_have_decl_putenv" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PUTENV $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "strdup" "ac_cv_have_decl_strdup" "$ac_includes_default" if test "x$ac_cv_have_decl_strdup" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRDUP $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "acosh" "ac_cv_have_decl_acosh" "$ac_includes_default" if test "x$ac_cv_have_decl_acosh" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ACOSH $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "strcasecmp" "ac_cv_have_decl_strcasecmp" "$ac_includes_default" if test "x$ac_cv_have_decl_strcasecmp" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRCASECMP $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "strncasecmp" "ac_cv_have_decl_strncasecmp" "$ac_includes_default" if test "x$ac_cv_have_decl_strncasecmp" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRNCASECMP $ac_have_decl _ACEOF for ac_func in fstat do : ac_fn_c_check_func "$LINENO" "fstat" "ac_cv_func_fstat" if test "x$ac_cv_func_fstat" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FSTAT 1 _ACEOF fi done for ac_func in vfscanf do : ac_fn_c_check_func "$LINENO" "vfscanf" "ac_cv_func_vfscanf" if test "x$ac_cv_func_vfscanf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VFSCANF 1 _ACEOF fi done for ac_header in sys/select.h sys/socket.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 fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for select" >&5 $as_echo_n "checking types of arguments for select... " >&6; } if ${ac_cv_func_select_args+:} false; then : $as_echo_n "(cached) " >&6 else for ac_arg234 in 'fd_set *' 'int *' 'void *'; do for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifdef HAVE_SYS_SELECT_H # include #endif #ifdef HAVE_SYS_SOCKET_H # include #endif int main () { extern int select ($ac_arg1, $ac_arg234, $ac_arg234, $ac_arg234, $ac_arg5); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done done done # Provide a safe default value. : "${ac_cv_func_select_args=int,int *,struct timeval *}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args" >&5 $as_echo "$ac_cv_func_select_args" >&6; } ac_save_IFS=$IFS; IFS=',' set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` IFS=$ac_save_IFS shift cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG1 $1 _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG234 ($2) _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG5 ($3) _ACEOF rm -f conftest* ac_fn_c_check_func "$LINENO" "select" "ac_cv_func_select" if test "x$ac_cv_func_select" = xyes; then : $as_echo "#define HAVE_SELECT 1" >>confdefs.h ac_fn_c_check_decl "$LINENO" "select" "ac_cv_have_decl_select" " #if HAVE_SYS_SELECT_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_SYS_TIME_H # include #endif #if HAVE_SYS_TYPES_H # include #endif " if test "x$ac_cv_have_decl_select" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_SELECT $ac_have_decl _ACEOF fi ac_fn_c_check_decl "$LINENO" "errno" "ac_cv_have_decl_errno" " #if HAVE_ERRNO_H # include #endif " if test "x$ac_cv_have_decl_errno" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ERRNO $ac_have_decl _ACEOF ac_gv_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE" for ac_func in lseek64 llseek lseek do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_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 ac_fn_c_check_decl "$LINENO" "lseek64" "ac_cv_have_decl_lseek64" "$ac_includes_default" if test "x$ac_cv_have_decl_lseek64" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_LSEEK64 $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "llseek" "ac_cv_have_decl_llseek" "$ac_includes_default" if test "x$ac_cv_have_decl_llseek" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_LLSEEK $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "lseek" "ac_cv_have_decl_lseek" "$ac_includes_default" if test "x$ac_cv_have_decl_lseek" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_LSEEK $ac_have_decl _ACEOF ac_fn_c_check_type "$LINENO" "off64_t" "ac_cv_type_off64_t" "$ac_includes_default" if test "x$ac_cv_type_off64_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_OFF64_T 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "loff_t" "ac_cv_type_loff_t" "$ac_includes_default" if test "x$ac_cv_type_loff_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LOFF_T 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" if test "x$ac_cv_type_off_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_OFF_T 1 _ACEOF fi CPPFLAGS="${ac_gv_save_CPPFLAGS}" for ac_func in alarm basename bzero bcopy dirname dup2 floor fcntl finite \ gethostname getopt gettimeofday isascii mallinfo memset mkdir pow read rint \ select sqrt strchr strcspn strdup strerror strncasecmp strpbrk \ strrchr strstr strtol strerror sysinfo waitpid wait3 write do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_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 ac_fn_c_check_decl "$LINENO" "getopt" "ac_cv_have_decl_getopt" "$ac_includes_default" if test "x$ac_cv_have_decl_getopt" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETOPT $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "optarg" "ac_cv_have_decl_optarg" "$ac_includes_default" if test "x$ac_cv_have_decl_optarg" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_OPTARG $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "optind" "ac_cv_have_decl_optind" "$ac_includes_default" if test "x$ac_cv_have_decl_optind" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_OPTIND $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "opterr" "ac_cv_have_decl_opterr" "$ac_includes_default" if test "x$ac_cv_have_decl_opterr" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_OPTERR $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "optopt" "ac_cv_have_decl_optopt" "$ac_includes_default" if test "x$ac_cv_have_decl_optopt" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_OPTOPT $ac_have_decl _ACEOF for ac_func in setlocale do : ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" if test "x$ac_cv_func_setlocale" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SETLOCALE 1 _ACEOF ac_fn_c_check_decl "$LINENO" "LC_ALL" "ac_cv_have_decl_LC_ALL" " #if HAVE_LOCALE_H # include #endif " if test "x$ac_cv_have_decl_LC_ALL" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_LC_ALL $ac_have_decl _ACEOF fi done # # we can use AC_COMPILE, because we check later for the existence of # socket() # ################################################################################ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Unix domain sockets" >&5 $as_echo_n "checking for Unix domain sockets... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if HAVE_SYS_SOCKET_H # include #endif int main () { int s = socket(PF_UNIX, SOCK_STREAM, 0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_UNIX_SOCKETS=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else HAVE_UNIX_SOCKETS=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ################################################################################ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IPv4 sockets" >&5 $as_echo_n "checking for IPv4 sockets... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if HAVE_SYS_SOCKET_H # include #endif int main () { int s = socket(PF_INET, SOCK_STREAM, 0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_INET_SOCKETS=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else HAVE_INET_SOCKETS=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ################################################################################ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IPv6 sockets" >&5 $as_echo_n "checking for IPv6 sockets... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if HAVE_SYS_SOCKET_H # include #endif int main () { int s = socket(PF_INET6, SOCK_STREAM, 0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_INET6_SOCKETS=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else HAVE_INET6_SOCKETS=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ################################################################################ if test "z${HAVE_UNIX_SOCKETS}" != "zno"\ -o "z${HAVE_INET_SOCKETS}" != "zno"\ -o "z${HAVE_INET6_SOCKETS}" != "zno"; then # # Try to figure out how to get at the "socket()" function # { $as_echo "$as_me:${as_lineno-$LINENO}: Checking whether we need to link -lsocket to get socket() ..." >&5 $as_echo "$as_me: Checking whether we need to link -lsocket to get socket() ..." >&6;} for ac_func in socket do : ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket" if test "x$ac_cv_func_socket" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SOCKET 1 _ACEOF $as_echo "#define HAVE_SOCKET 1" >>confdefs.h SOCKETLIBS= { $as_echo "$as_me:${as_lineno-$LINENO}: result: -lsocket not needed" >&5 $as_echo "-lsocket not needed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5 $as_echo_n "checking for socket in -lsocket... " >&6; } if ${ac_cv_lib_socket_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $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 socket (); int main () { return socket (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_socket=yes else ac_cv_lib_socket_socket=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_socket_socket" >&5 $as_echo "$ac_cv_lib_socket_socket" >&6; } if test "x$ac_cv_lib_socket_socket" = xyes; then : $as_echo "#define HAVE_SOCKET 1" >>confdefs.h SOCKETLIBS=-lsocket { $as_echo "$as_me:${as_lineno-$LINENO}: result: -lsocket is needed" >&5 $as_echo "-lsocket is needed" >&6; } else SOCKETLIBS= HAVE_UNIX_SOCKETS=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: socket() not available" >&5 $as_echo "socket() not available" >&6; } fi fi done fi # HAVE_UNIX/INET/INET6_SOCKETS=yes ac_save_LIBS="${LIBS}" LIBS="${SOCKETLIBS} ${LIBS}" if test "z${HAVE_UNIX_SOCKETS}" != "zno"; then for ac_func in accept bind connect listen socket do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_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 else SOCKETLIBS= HAVE_UNIX_SOCKETS=no fi done fi LIBS="${ac_save_LIBS}" if test "z${HAVE_UNIX_SOCKETS}" != "zno"\ -o "z${HAVE_INET_SOCKETS}" != "zno"\ -o "z${HAVE_INET6_SOCKETS}" != "zno"; then # # Try to figure out what the 3rd argument of accept should be. The # third argument is an integer type, ideally it is "socklent_t". As # the third argument is a pointer, we cannot just check for a # declaration of accept() and leave the rest to the comiler: the size # of the type should match. On little-endian machines we could just # choose the largest integer type available, on big-endian machines # this would not work. Gnah. # ac_fn_c_check_decl "$LINENO" "accept" "ac_cv_have_decl_accept" " #if HAVE_SYS_SOCKET_H # include #endif " if test "x$ac_cv_have_decl_accept" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ACCEPT $ac_have_decl _ACEOF ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" " #if HAVE_SYS_SOCKET_H # include #endif " if test "x$ac_cv_type_socklen_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SOCKLEN_T 1 _ACEOF ACCEPT_ARG3_TYPE=socklen_t else ACCEPT_ARG3_TYPE=int fi fi # HAVE_UNIX/INET/INET6_SOCKETS=yes if test "z${HAVE_UNIX_SOCKETS}" != "zno"; then $as_echo "#define HAVE_UNIX_SOCKETS 1" >>confdefs.h fi if test "z${HAVE_INET_SOCKETS}" != "zno"; then $as_echo "#define HAVE_INET_SOCKETS 1" >>confdefs.h fi if test "z${HAVE_INET6_SOCKETS}" != "zno"; then $as_echo "#define HAVE_INET6_SOCKETS 1" >>confdefs.h fi # # End autoscan stuff. # ################################################################################ # The following vars contain info about the local system: # (AC_CANONICAL_TARGET([]) sets them) # var value on RedHat 6.1 # --- ------------------- # build i686-pc-linux-gnu # host i686-pc-linux-gnu # target i686-pc-linux-gnu # build_alias i686-pc-linux-gnu # host_alias i686-pc-linux-gnu # target_alias i686-pc-linux-gnu # build_cpu i686 # build_vendor pc # build_os linux-gnu # host_cpu i686 # host_vendor pc # host_os linux-gnu # target_cpu i686 # target_vendor pc # target_os linux-gnu case "$target" in *linux*) MACHTYPE=`echo ${target}|sed 's/unknown/pc/g'` ;; *irix*) MACHTYPE="${target}" $as_echo "#define sgi 1" >>confdefs.h if test "$CC" = "cc" ; then CFLAGS="$CFLAGS -float" LIBS="$LIBS -lmalloc" fi ;; *darwin*) MACHTYPE="${target}" $as_echo "#define unix 1" >>confdefs.h ;; *rs6000*) MACHTYPE="${target}" $as_echo "#define AIX 1" >>confdefs.h ACCEPT_ARG3_TYPE="unsigned long" $as_echo "#define unix 1" >>confdefs.h ;; *) MACHTYPE="${target}" ;; esac cat >>confdefs.h <<_ACEOF #define MACHTYPE "$MACHTYPE" _ACEOF cat >>confdefs.h <<_ACEOF #define ACCEPT_ARG3_TYPE $ACCEPT_ARG3_TYPE _ACEOF # Search for necessary programs. # Check whether --with-htmlbrowser was given. if test "${with_htmlbrowser+set}" = set; then : withval=$with_htmlbrowser; DFLTHTMLBROWSER="${withval}" else DFLTHTMLBROWSER="firefox" fi cat >>confdefs.h <<_ACEOF #define DFLTHTMLBROWSER "${DFLTHTMLBROWSER}" _ACEOF for ac_prog in ${DFLTHTMLBROWSER} 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_HTMLBROWSER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HTMLBROWSER"; then ac_cv_prog_HTMLBROWSER="$HTMLBROWSER" # 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_HTMLBROWSER="$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 HTMLBROWSER=$ac_cv_prog_HTMLBROWSER if test -n "$HTMLBROWSER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HTMLBROWSER" >&5 $as_echo "$HTMLBROWSER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$HTMLBROWSER" && break done if ! test "${HTMLBROWSER}" = "${DFLTHTMLBROWSER}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: HTML browser executable not found, online viewing of the HTML manual will probably not be possible." >&5 $as_echo "$as_me: HTML browser executable not found, online viewing of the HTML manual will probably not be possible." >&6;} fi # Check whether --with-pdfviewer was given. if test "${with_pdfviewer+set}" = set; then : withval=$with_pdfviewer; DFLTPDFVIEWER="${withval}" else DFLTPDFVIEWER="xpdf" fi cat >>confdefs.h <<_ACEOF #define DFLTPDFVIEWER "${DFLTPDFVIEWER}" _ACEOF for ac_prog in ${DFLTPDFVIEWER} 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_PDFVIEWER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PDFVIEWER"; then ac_cv_prog_PDFVIEWER="$PDFVIEWER" # 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_PDFVIEWER="$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 PDFVIEWER=$ac_cv_prog_PDFVIEWER if test -n "$PDFVIEWER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PDFVIEWER" >&5 $as_echo "$PDFVIEWER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PDFVIEWER" && break done if ! test "${PDFVIEWER}" = "${DFLTPDFVIEWER}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: PDF viewr executable not found, online viewing of the PDF manual will probably not be possible." >&5 $as_echo "$as_me: PDF viewr executable not found, online viewing of the PDF manual will probably not be possible." >&6;} fi ######################################################################## ######################################################################## ######################################################################## # If --with-motif=DIR was specified, set MOTIF_DIR to DIR # Check whether --with-motif was given. if test "${with_motif+set}" = set; then : withval=$with_motif; MOTIF_DIR=$withval fi # Check whether --with-opengl was given. if test "${with_opengl+set}" = set; then : withval=$with_opengl; OPENGL_DIR=$withval fi ######################################################################## # # Store X library link line in XLIBS # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" 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 XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $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 dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=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_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $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 dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=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_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $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 gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=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_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if ${ac_cv_lib_bsd_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $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 gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=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_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_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 connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=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_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = xyes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if ${ac_cv_lib_posix_remove+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $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 remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=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_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = xyes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if ${ac_cv_lib_ipc_shmat+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $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 shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=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_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_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 IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=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_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi XLIBS="$X_LIBS $X_PRE_LIBS -lXt -lXext -lX11 $X_EXTRA_LIBS" if ${ac_cv_XLIBS+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_XLIBS="XLIBS='$XLIBS'" fi ######################################################################## { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xmu" >&5 $as_echo_n "checking for Xmu... " >&6; } result="no" geom_lib=-lXmu geom_func=XmuLookupStandardColormap geom_dirs='"" "$x_libraries" "$MOTIF_DIR/lib"' geom_otherlibs=$XLIBS geom_saved_LIBS=$LIBS #AC_MSG_CHECKING([how to link with $geom_lib]) GEOM_L_OPTION=0 for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_l_option= test -n "$geom_z" && geom_l_option="-L$geom_z" LIBS="$geom_l_option $geom_lib $geom_otherlibs" echo "configure:20651: checking for $geom_func with $geom_l_option" >&5 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 $geom_func (); int main () { return $geom_func (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : GEOM_L_OPTION="$geom_l_option" break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done LIBS=$geom_saved_LIBS #if test "$GEOM_L_OPTION" != "0" ; then # AC_MSG_RESULT([$geom_l_option $geom_lib]) #else # AC_MSG_RESULT([not found]) #fi if test "$GEOM_L_OPTION" != "0" ; then result="yes" $as_echo "#define HAVE_XMU 1" >>confdefs.h if test "$GEOM_L_OPTION" != "" ; then XMULIBS="$GEOM_L_OPTION -lXmu" else XMULIBS="-lXmu" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 $as_echo "$result" >&6; } ######################################################################## { $as_echo "$as_me:${as_lineno-$LINENO}: checking for motif" >&5 $as_echo_n "checking for motif... " >&6; } if test "$MOTIF_DIR" != "" ; then USER_MOTIF_DIR="$MOTIF_DIR/include" else USER_MOTIF_DIR="" fi geom_header=Xm/Xm.h geom_dirs='"$USER_MOTIF_DIR" "" "$x_includes" "/usr/local/include"' geom_saved_CPPFLAGS=$CPPFLAGS GEOM_I_OPTION="0" #AC_MSG_CHECKING([for $geom_header]) for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_i_option= test -n "$geom_z" && geom_i_option="-I$geom_z" CPPFLAGS="$geom_i_option $geom_saved_CPPFLAGS" echo "configure:20722: checking for $geom_header with $geom_i_option" >&5 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$geom_header> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : GEOM_I_OPTION="$geom_i_option" break fi rm -f conftest.err conftest.i conftest.$ac_ext done CPPFLAGS=$geom_saved_CPPFLAGS #if test "$GEOM_I_OPTION" = "0" ; then # AC_MSG_RESULT([not found]) #else # if test "$GEOM_I_OPTION" != "" ; then # AC_MSG_RESULT($GEOM_I_OPTION) # else # AC_MSG_RESULT([(found with no -I required)]) # fi #fi if test "$GEOM_I_OPTION" = "0" ; then as_fn_error $? " Can't find Motif header file Xm/Xm.h. Geomview requires Motif (or Lesstif). See the file INSTALL.Geomview for details. " "$LINENO" 5 fi MOTIFINCLUDE=$GEOM_I_OPTION ######################################################################## if test "$MOTIFLIBS" = "" ; then MOTIFLIBS="-lXm" fi if test "$MOTIF_DIR" != "" ; then USER_MOTIF_DIR="$MOTIF_DIR/lib" else USER_MOTIF_DIR="" fi geom_lib=$MOTIFLIBS geom_func=XmCreateForm geom_dirs='"$USER_MOTIF_DIR" "" "$x_libraries" "/usr/local/lib"' geom_otherlibs=$XLIBS geom_saved_LIBS=$LIBS #AC_MSG_CHECKING([how to link with $geom_lib]) GEOM_L_OPTION=0 for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_l_option= test -n "$geom_z" && geom_l_option="-L$geom_z" LIBS="$geom_l_option $geom_lib $geom_otherlibs" echo "configure:20783: checking for $geom_func with $geom_l_option" >&5 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 $geom_func (); int main () { return $geom_func (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : GEOM_L_OPTION="$geom_l_option" break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done LIBS=$geom_saved_LIBS #if test "$GEOM_L_OPTION" != "0" ; then # AC_MSG_RESULT([$geom_l_option $geom_lib]) #else # AC_MSG_RESULT([not found]) #fi if test "$GEOM_L_OPTION" = "0" ; then as_fn_error $? " Can't find Motif libraries. Geomview requires Motif (or Lesstif). See the file INSTALL.Geomview for details. " "$LINENO" 5 fi MOTIF_L_OPTION=$GEOM_L_OPTION MOTIFLIBS="$GEOM_L_OPTION $MOTIFLIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: headers $MOTIFINCLUDE, libraries $MOTIFLIBS" >&5 $as_echo "headers $MOTIFINCLUDE, libraries $MOTIFLIBS" >&6; } ######################################################################## if test "z${OPENGL_DIR}" != "zno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for opengl" >&5 $as_echo_n "checking for opengl... " >&6; } if test "$OPENGL_DIR" != "" ; then USER_OPENGL_DIR="$OPENGL_DIR/include" else USER_OPENGL_DIR="" fi geom_header=GL/gl.h geom_dirs='"$USER_OPENGL_DIR" "" "/usr/local/include"' geom_saved_CPPFLAGS=$CPPFLAGS GEOM_I_OPTION="0" #AC_MSG_CHECKING([for $geom_header]) for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_i_option= test -n "$geom_z" && geom_i_option="-I$geom_z" CPPFLAGS="$geom_i_option $geom_saved_CPPFLAGS" echo "configure:20854: checking for $geom_header with $geom_i_option" >&5 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$geom_header> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : GEOM_I_OPTION="$geom_i_option" break fi rm -f conftest.err conftest.i conftest.$ac_ext done CPPFLAGS=$geom_saved_CPPFLAGS #if test "$GEOM_I_OPTION" = "0" ; then # AC_MSG_RESULT([not found]) #else # if test "$GEOM_I_OPTION" != "" ; then # AC_MSG_RESULT($GEOM_I_OPTION) # else # AC_MSG_RESULT([(found with no -I required)]) # fi #fi if test "$GEOM_I_OPTION" = "0" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Can't find OpenGL header file GL/gl.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. " >&5 $as_echo "$as_me: WARNING: Can't find OpenGL header file GL/gl.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. " >&2;} OPENGLINCLUDE="" # $GEOM_I_OPTION fi GL_I_OPTION=$GEOM_I_OPTION # Geomview does not require OpenGL, _BUT_ an OpenGL implementation # through the X11 GLX extension; so check for glx.h as well. # # geom_header=GL/glx.h geom_dirs='"$USER_OPENGL_DIR" "" "/usr/local/include"' geom_saved_CPPFLAGS=$CPPFLAGS GEOM_I_OPTION="0" #AC_MSG_CHECKING([for $geom_header]) for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_i_option= test -n "$geom_z" && geom_i_option="-I$geom_z" CPPFLAGS="$geom_i_option $geom_saved_CPPFLAGS" echo "configure:20907: checking for $geom_header with $geom_i_option" >&5 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$geom_header> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : GEOM_I_OPTION="$geom_i_option" break fi rm -f conftest.err conftest.i conftest.$ac_ext done CPPFLAGS=$geom_saved_CPPFLAGS #if test "$GEOM_I_OPTION" = "0" ; then # AC_MSG_RESULT([not found]) #else # if test "$GEOM_I_OPTION" != "" ; then # AC_MSG_RESULT($GEOM_I_OPTION) # else # AC_MSG_RESULT([(found with no -I required)]) # fi #fi if test "$GEOM_I_OPTION" = "0" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Can't find OpenGL header file GL/glx.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. " >&5 $as_echo "$as_me: WARNING: Can't find OpenGL header file GL/glx.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. " >&2;} GL_I_OPTION=0 else GL_I_OPTION="${GL_I_OPTION} ${GEOM_I_OPTION}" OPENGLINCLUDE="${OPENGLINCLUDE} ${GEOM_I_OPTION}" fi ######################################################################## if test "$OPENGL_DIR" != "" ; then USER_OPENGL_DIR="$OPENGL_DIR/lib" else USER_OPENGL_DIR="" fi geom_lib=-lGL geom_func=glBegin geom_dirs='"$USER_OPENGL_DIR" "" "$x_libraries" "/usr/local/lib"' geom_otherlibs="$XLIBS -lm" geom_saved_LIBS=$LIBS #AC_MSG_CHECKING([how to link with $geom_lib]) GEOM_L_OPTION=0 for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_l_option= test -n "$geom_z" && geom_l_option="-L$geom_z" LIBS="$geom_l_option $geom_lib $geom_otherlibs" echo "configure:20968: checking for $geom_func with $geom_l_option" >&5 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 $geom_func (); int main () { return $geom_func (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : GEOM_L_OPTION="$geom_l_option" break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done LIBS=$geom_saved_LIBS #if test "$GEOM_L_OPTION" != "0" ; then # AC_MSG_RESULT([$geom_l_option $geom_lib]) #else # AC_MSG_RESULT([not found]) #fi if test "$GEOM_L_OPTION" = "0" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Can't find OpenGL header file GL/gl.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. " >&5 $as_echo "$as_me: WARNING: Can't find OpenGL header file GL/gl.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. " >&2;} fi GL_L_OPTION=$GEOM_L_OPTION geom_lib=-lGLU geom_func=gluBeginPolygon geom_dirs='"$USER_OPENGL_DIR" "" "$x_libraries" "/usr/local/lib"' geom_otherlibs="$GL_L_OPTION -lGL $XLIBS -lm" geom_saved_LIBS=$LIBS #AC_MSG_CHECKING([how to link with $geom_lib]) GEOM_L_OPTION=0 for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_l_option= test -n "$geom_z" && geom_l_option="-L$geom_z" LIBS="$geom_l_option $geom_lib $geom_otherlibs" echo "configure:21029: checking for $geom_func with $geom_l_option" >&5 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 $geom_func (); int main () { return $geom_func (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : GEOM_L_OPTION="$geom_l_option" break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done LIBS=$geom_saved_LIBS #if test "$GEOM_L_OPTION" != "0" ; then # AC_MSG_RESULT([$geom_l_option $geom_lib]) #else # AC_MSG_RESULT([not found]) #fi if test "$GEOM_L_OPTION" != "$GL_L_OPTION" ; then GLU_L_OPTION=$GEOM_L_OPTION else GLU_L_OPTION="" fi if test "z${GLU_L_OPTION}" = "z0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: libGLU not found. libGLU is required to render non-flat or concave polygons." >&5 $as_echo "libGLU not found. libGLU is required to render non-flat or concave polygons." >&6; } OPENGLLIBS="$GL_L_OPTION -lGL" $as_echo "#define HAVE_LIBGLU 0" >>confdefs.h else OPENGLLIBS="$GL_L_OPTION -lGL $GLU_L_OPTION -lGLU" $as_echo "#define HAVE_LIBGLU 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: headers $OPENGLINCLUDE, libraries $OPENGLLIBS" >&5 $as_echo "headers $OPENGLINCLUDE, libraries $OPENGLLIBS" >&6; } ############################################################################# # Check for the OSMesa library which can be used for high quality # off-screen snapshots, including texture. This is beneficial over # making a snapshot of a window, because the latter only works when # the window is mapped and not obscured by other windows. However, # this can only work if libGL is indeed based on Mesa because # libOSMesa overrides the OpenGL API entries. ### ### unluckily, this just does not seem to work. Sad story. Disable the ### stuff. The good news: we can use glXCreateGLXPixmap() and render ### into that pixmap. ### # ac_gv_save_LIBS="${LIBS}" # LIBS="${OPENGLLIBS} ${XLIBS} ${LIBS}" # AC_CHECK_FUNCS([glXAllocateMemoryMESA],[MESAGL=1],[MESAGL=0]) # if test "${MESAGL}" = "1"; then # AC_CHECK_LIB([OSMesa], [OSMesaCreateContext], # [OPENGLLIBS="$GL_L_OPTION -lOSMesa -lGL $GLU_L_OPTION -lGLU"], # [],[${OPENGLLIBS}]) # fi # LIBS="${ac_gv_save_LIBS}" MESAGL=0 cat >>confdefs.h <<_ACEOF #define MESAGL ${MESAGL} _ACEOF # Even without libOSMesa it is possible to generate off-screen snapshots # by using glXCrateGLXPixmap(). ac_gv_save_LIBS="${LIBS}" LIBS="${OPENGLLIBS} ${XLIBS} ${LIBS}" for ac_func in glXCreateGLXPixmap do : ac_fn_c_check_func "$LINENO" "glXCreateGLXPixmap" "ac_cv_func_glXCreateGLXPixmap" if test "x$ac_cv_func_glXCreateGLXPixmap" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GLXCREATEGLXPIXMAP 1 _ACEOF fi done LIBS="${ac_gv_save_LIBS}" fi # without-opengl # # substitute, even if empty # # # MGX11 is always defined, does not hurt to include it in the library. # if test "z${GL_I_OPTION}" != "z0" && \ test "z${GL_L_OPTION}" != "z0" && \ test "z${OPENGL_DIR}" != "zno"; then MGOPENGL=1 MGX11=1 else MGOPENGL=0 MGX11=1 fi MGGL=0 if test "${MGOPENGL}" = 1; then MGOPENGL_TRUE= MGOPENGL_FALSE='#' else MGOPENGL_TRUE='#' MGOPENGL_FALSE= fi cat >>confdefs.h <<_ACEOF #define MGOPENGL ${MGOPENGL} _ACEOF if test "${MGX11}" = 1; then MGX11_TRUE= MGX11_FALSE='#' else MGX11_TRUE='#' MGX11_FALSE= fi cat >>confdefs.h <<_ACEOF #define MGX11 ${MGX11} _ACEOF if test "${MGGL}" = 1; then MGGL_TRUE= MGGL_FALSE='#' else MGGL_TRUE='#' MGGL_FALSE= fi cat >>confdefs.h <<_ACEOF #define MGGL ${MGGL} _ACEOF ######################################################################## # Check for zlib (and maybe bzlib? (image compression/decompression)) #GEOMVIEW_CHECK_PACKAGE([bz2lib],[bz2],[],[],[bzlib.h],[],[],[optional enabled]) # Check whether --with-zlib was given. if test "${with_zlib+set}" = set; then : withval=$with_zlib; if test -z "$ZLIB_DISABLE"; then case "$withval" in yes) ZLIB_DISABLE=no ;; no) ZLIB_DISABLE=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: Disabling \"zlib\"" >&5 $as_echo "Disabling \"zlib\"" >&6; } ;; *) as_fn_error $? "\"$withval\" should have been either \"yes\" or \"no\"" "$LINENO" 5 ;; esac fi else if test -z "$ZLIB_DISABLE"; then ZLIB_DISABLE=no fi fi if test "${ZLIB_DISABLE}" = yes; then : else DEFAULT_LIBDIR="${libdir}" if test "${DEFAULT_LIBDIR}" = '' then DEFAULT_LIBDIR="'${libdir}'" fi # Check whether --with-zlib-name was given. if test "${with_zlib_name+set}" = set; then : withval=$with_zlib_name; case "$withval" in yes) as_fn_error $? ""option \"--with-zlib-name\" requires an argument"" "$LINENO" 5 ;; no) as_fn_error $? ""option \"--with-zlib-name\" requires an argument"" "$LINENO" 5 ;; *) ZLIB_NAME="$withval" ;; esac else ZLIB_NAME="z" fi # Check whether --with-zlib-dir was given. if test "${with_zlib_dir+set}" = set; then : withval=$with_zlib_dir; case "$withval" in yes) as_fn_error $? ""option \"--with-zlib-dir\" requires an argument"" "$LINENO" 5 ;; no) as_fn_error $? ""option \"--with-zlib-dir\" requires an argument"" "$LINENO" 5 ;; *) ZLIB_LIB_PATH="$withval" ZLIB_INCLUDE_PATH="$withval" ;; esac fi # Check whether --with-zlib-lib was given. if test "${with_zlib_lib+set}" = set; then : withval=$with_zlib_lib; case "$withval" in yes) as_fn_error $? ""option \"--with-zlib-lib\" requires an argument"" "$LINENO" 5 ;; no) as_fn_error $? ""option \"--with-zlib-lib\" requires an argument"" "$LINENO" 5 ;; *) ZLIB_LIB_PATH="$withval" ;; esac else test -z "`eval eval eval echo ${ZLIB_LIB_PATH}`" && ZLIB_LIB_PATH="${DEFAULT_LIBDIR}" fi DEFAULT_INCDIR="${includedir}" # Check whether --with-zlib-headers was given. if test "${with_zlib_headers+set}" = set; then : withval=$with_zlib_headers; case "$withval" in yes) as_fn_error $? ""option \"--with-zlib-headers\" requires an argument"" "$LINENO" 5 ;; no) as_fn_error $? ""option \"--with-zlib-headers\" requires an argument"" "$LINENO" 5 ;; *) ZLIB_INCLUDE_PATH="$withval" ;; esac else test -z "`eval eval eval echo ${ZLIB_INCLUDE_PATH}`" && ZLIB_INCLUDE_PATH="${DEFAULT_INCDIR}" fi as_ac_Lib=`$as_echo "ac_cv_lib_${ZLIB_NAME}''_main" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -l${ZLIB_NAME}" >&5 $as_echo_n "checking for main in -l${ZLIB_NAME}... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ZLIB_NAME} -L`eval eval eval echo ${ZLIB_LIB_PATH}` $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_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 : ZLIB_LIB="-L${ZLIB_LIB_PATH} -l${ZLIB_NAME}" ZLIB_ALL_LIB="-L${ZLIB_LIB_PATH} -l${ZLIB_NAME} " else ZLIB_LIB="" ZLIB_ALL_LIB="" ZLIB_LIB_PATH="" ZLIB_INCLUDE_PATH="" fi if test "x${ZLIB_LIB}" = "x" ; then case "$host" in *darwin*) eval "unset ac_cv_lib_${ZLIB_NAME}___main" as_ac_Lib=`$as_echo "ac_cv_lib_${ZLIB_NAME}''_main" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -framework ${ZLIB_NAME}" >&5 $as_echo_n "checking for main in -framework ${ZLIB_NAME}... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-framework ${ZLIB_NAME} -F`eval eval eval echo ${ZLIB_LIB_PATH}` `eval eval eval echo ` $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_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 test `eval 'as_val=${'$as_ac_Lib'};$as_echo "$as_val"'` = yes; then : ZLIB_LIB="-F${ZLIB_LIB_PATH} -framework ${ZLIB_NAME}" ZLIB_ALL_LIB="-F${ZLIB_LIB_PATH} -framework ${ZLIB_NAME} " else ZLIB_LIB="" ZLIB_ALL_LIB="" ZLIB_LIB_PATH="" ZLIB_INCLUDE_PATH="" fi ;; esac fi if test "x${ZLIB_LIB}" = "x" ; then : else gv_ac_ZLIB_save_CPPFLAGS="$CPPFLAGS" unset gv_ac_zlib_h for incdir in "${ZLIB_INCLUDE_PATH}"; do if test -n "`eval eval eval echo ${incdir}`"; then CPPFLAGS="-I`eval eval eval echo ${incdir}` ${gv_ac_ZLIB_save_CPPFLAGS}" fi for ac_header in zlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ZLIB_H 1 _ACEOF gv_ac_zlib_h="zlib.h" fi done if ! test "${gv_ac_zlib_h}" = "zlib.h"; then eval "unset ac_cv_header_zlib_h" else break fi done if ! test "${gv_ac_zlib_h}" = "zlib.h"; then ZLIB_LIB="" ZLIB_ALL_LIB="" ZLIB_LIB_PATH="" ZLIB_INCLUDE_PATH="" else ZLIB_ALL_INCLUDES="-I${incdir} " ZLIB_INCLUDES="-I${incdir}" ZLIB_INCLUDE_PATH="${incdir}" fi CPPFLAGS="${gv_ac_ZLIB_save_CPPFLAGS}" if test "x${ZLIB_LIB}" = "x" ; then : else $as_echo "#define HAVE_LIBZ 1" >>confdefs.h fi fi fi if test -n "$ZLIB_LIB"; then HAVE_ZLIB_TRUE= HAVE_ZLIB_FALSE='#' else HAVE_ZLIB_TRUE='#' HAVE_ZLIB_FALSE= fi gv_ac_save_LIBS="${LIBS}" LIBS="${LIBS} ${ZLIB_ALL_LIB}" for ac_func in compressBound do : ac_fn_c_check_func "$LINENO" "compressBound" "ac_cv_func_compressBound" if test "x$ac_cv_func_compressBound" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_COMPRESSBOUND 1 _ACEOF fi done # pre-1.2 zlib? LIBS="${gv_ac_save_LIBS}" ######################################################################## OPENGL_LD_LIBRARY_PATH=`expr "$GL_L_OPTION" : '-L\(.*\)'` MOTIF_LD_LIBRARY_PATH=`expr "$MOTIF_L_OPTION" : '-L\(.*\)'` if test "$OPENGL_LD_LIBRARY_PATH" != "0" ; then LOCAL_LD_LIBRARY_PATH=$OPENGL_LD_LIBRARY_PATH fi if test "$MOTIF_LD_LIBRARY_PATH" != "0" ; then if test "$LOCAL_LD_LIBRARY_PATH" != "" ; then LOCAL_LD_LIBRARY_PATH="$LOCAL_LD_LIBRARY_PATH:$MOTIF_LD_LIBRARY_PATH" else LOCAL_LD_LIBRARY_PATH="$MOTIF_LD_LIBRARY_PATH" fi fi if test "$LOCAL_LD_LIBRARY_PATH" != "" ; then LD_LIBRARY_PATH_SETTINGS="LD_LIBRARY_PATH=$LOCAL_LD_LIBRARY_PATH" fi ######################################################################## ######################################################################## ######################################################################## # Check whether --enable-d1debug was given. if test "${enable_d1debug+set}" = set; then : enableval=$enable_d1debug; if test "$enableval" != "no" ; then $as_echo "#define D1_DEBUG 1" >>confdefs.h fi else $as_echo "#define D1_DEBUG 0" >>confdefs.h fi # Check whether --enable-motion-averaging was given. if test "${enable_motion_averaging+set}" = set; then : enableval=$enable_motion_averaging; if test "$enableval" = "no" ; then $as_echo "#define EXPERIMENTAL_MOTION_AVERAGING 0" >>confdefs.h else $as_echo "#define EXPERIMENTAL_MOTION_AVERAGING 1" >>confdefs.h fi else $as_echo "#define EXPERIMENTAL_MOTION_AVERAGING 0" >>confdefs.h fi BEZIER_SPHERES=0 if test "${BEZIER_SPHERES}" = 1; then BEZIER_SPHERES_TRUE= BEZIER_SPHERES_FALSE='#' else BEZIER_SPHERES_TRUE='#' BEZIER_SPHERES_FALSE= fi cat >>confdefs.h <<_ACEOF #define BEZIER_SPHERES ${BEZIER_SPHERES} _ACEOF ######################################################################## ######################################################################## ######################################################################## 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 popen(CMD, MODE) needs/accepts MODE = \"rb\" for binary files" >&5 $as_echo_n "checking whether popen(CMD, MODE) needs/accepts MODE = \"rb\" for binary files... " >&6; } if test "$cross_compiling" = yes; 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 $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *pipe = popen("${SHELL}", "rb"); if (pipe == NULL) return 1; else return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define POPEN_ACCEPTS_RB 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext 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 x$HAVE_CXX = xtrue; then HAVE_CXX_TRUE= HAVE_CXX_FALSE='#' else HAVE_CXX_TRUE='#' HAVE_CXX_FALSE= fi ######################################################################## cat >>confdefs.h <<_ACEOF #define DOCDIR "`eval eval echo ${docdir}`" _ACEOF moduledir="\$(libexecdir)/geomview" geomdatadir="\$(datadir)/geomview" ######################################################################## top_geom_builddir='$(top_builddir)' OOGLLIBS="\$(top_geom_builddir)/src/lib/oogl/wa/libwa.la \ \$(top_geom_builddir)/src/lib/camera/libcamera.la \ \$(top_geom_builddir)/src/lib/color/libcolor.la \ \$(top_geom_builddir)/src/lib/fexpr/libfexpr.la \ \$(top_geom_builddir)/src/lib/geomutil/bdy/libbdy.la \ \$(top_geom_builddir)/src/lib/geomutil/crayplutil/libcrayplutil.la \ \$(top_geom_builddir)/src/lib/geomutil/dim/libdim.la \ \$(top_geom_builddir)/src/lib/geomutil/plutil/libplutil.la \ \$(top_geom_builddir)/src/lib/gprim/bbox/libbbox.la \ \$(top_geom_builddir)/src/lib/gprim/bezier/libbezier.la \ \$(top_geom_builddir)/src/lib/gprim/comment/libcomment.la \ \$(top_geom_builddir)/src/lib/gprim/discgrp/libdg.la \ \$(top_geom_builddir)/src/lib/gprim/geom/libgeom.la \ \$(top_geom_builddir)/src/lib/gprim/inst/libinst.la \ \$(top_geom_builddir)/src/lib/gprim/lincoln/liblincoln.la \ \$(top_geom_builddir)/src/lib/gprim/list/liblist.la \ \$(top_geom_builddir)/src/lib/gprim/mesh/libmesh.la \ \$(top_geom_builddir)/src/lib/gprim/ndmesh/libndmesh.la \ \$(top_geom_builddir)/src/lib/gprim/npolylist/libnpolylist.la \ \$(top_geom_builddir)/src/lib/gprim/polylist/libpolylist.la \ \$(top_geom_builddir)/src/lib/gprim/quad/libquad.la \ \$(top_geom_builddir)/src/lib/gprim/skel/libskel.la \ \$(top_geom_builddir)/src/lib/gprim/sphere/libsphere.la \ \$(top_geom_builddir)/src/lib/gprim/tlist/libtlist.la \ \$(top_geom_builddir)/src/lib/gprim/vect/libvect.la \ \$(top_geom_builddir)/src/lib/mg/buf/liblibmgbuf.la \ \$(top_geom_builddir)/src/lib/mg/common/libmgcommon.la \ \$(top_geom_builddir)/src/lib/mg/ps/libmgps.la \ \$(top_geom_builddir)/src/lib/mg/rib/libmgrib.la \ \$(top_geom_builddir)/src/lib/pointlist/libpointlist.la \ \$(top_geom_builddir)/src/lib/shade/libshade.la \ \$(top_geom_builddir)/src/lib/window/libwindow.la \ \$(top_geom_builddir)/src/lib/geometry/cmodel/libcmodel.la \ \$(top_geom_builddir)/src/lib/geometry/point3/libpoint3.la \ \$(top_geom_builddir)/src/lib/geometry/transform3/libtransform3.la \ \$(top_geom_builddir)/src/lib/geometry/transformn/libtransformn.la \ \$(top_geom_builddir)/src/lib/geometry/transobj/libtransobj.la \ \$(top_geom_builddir)/src/lib/geometry/ntransobj/libntransobj.la \ \$(top_geom_builddir)/src/lib/oogl/lisp/liblisp.la \ \$(top_geom_builddir)/src/lib/oogl/refcomm/librefcomm.la \ \$(top_geom_builddir)/src/lib/oogl/util/libooglutil.la \ \$(top_geom_builddir)/src/lib/aclib/libacgeomview.la" if test "z${MGOPENGL}" = "z1"; then OOGLLIBS="${OOGLLIBS} \$(top_geom_builddir)/src/lib/mg/opengl/libmgopengl.la" fi if test "z${MGX11}" = "z1"; then OOGLLIBS="${OOGLLIBS} \$(top_geom_builddir)/src/lib/mg/x11/libmgx11.la" fi if ${ac_cv_OOGLLIBS+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_OOGLLIBS="OOGLLIBS='$OOGLLIBS'" fi OOGLLIB='$(top_geom_builddir)/src/lib/libgeomview.la' if ${ac_cv_OOGLLIB+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_OOGLLIB="OOGLLIB='$OOGLLIB'" fi MOTIFUILIB='$(top_geom_builddir)/src/lib/mib/libmib.a' if ${ac_cv_MOTIFUILIB+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_MOTIFUILIB="MOTIFUILIB='$MOTIFUILIB'" fi STUBLIB="\$(top_builddir)/src/lib/gprim/stub/libstub.la" ######################################################################## # Find out how to link files if we haven't already if test -z "$LN_S" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi fi # Remove the include directory if we haven't done that yet if test -z "$lf_link_headers" then lf_link_headers="we are all Kosh" rm -rf "$srcdir/include" fi # Get the directory from the second argument which is optional lf_directory="include" # ${srcdir}/mkinstalldirs "$lf_directory" mkdir $lf_directory if test -d "`pwd`/$srcdir"; then lf_srcdir="`pwd`/$srcdir" else lf_srcdir="$srcdir" fi # Link them lf_subdirs="`echo src/lib/aclib \ src/lib/oogl/lisp \ src/lib/oogl/refcomm \ src/lib/oogl/util \ src/lib/oogl/wa \ src/lib/geometry/ \ src/lib/geometry/cmodel \ src/lib/geometry/hpoint3 \ src/lib/geometry/hpointn \ src/lib/geometry/point3 \ src/lib/geometry/transform3 \ src/lib/geometry/transformn \ src/lib/geometry/transobj \ src/lib/geometry/ntransobj \ src/lib/camera \ src/lib/color \ src/lib/fexpr \ src/lib/geomutil/bdy \ src/lib/geomutil/crayplutil \ src/lib/geomutil/dim \ src/lib/geomutil/plutil \ src/lib/gprim/bbox \ src/lib/gprim/bezier \ src/lib/gprim/comment \ src/lib/gprim/discgrp \ src/lib/gprim/geom \ src/lib/gprim/inst \ src/lib/gprim/lincoln \ src/lib/gprim/list \ src/lib/gprim/mesh \ src/lib/gprim/polylist \ src/lib/gprim/ndmesh \ src/lib/gprim/npolylist \ src/lib/gprim/quad \ src/lib/gprim/skel \ src/lib/gprim/sphere \ src/lib/gprim/stub \ src/lib/gprim/tlist \ src/lib/gprim/vect \ src/lib/mg/buf \ src/lib/mg/common \ src/lib/mg/opengl \ src/lib/mg/x11 \ src/lib/mg/ps \ src/lib/mg/rib \ src/lib/mib \ src/lib/pointlist \ src/lib/shade \ src/lib/window \ src/lib/forms \ src/bin/geomview/common \ `" for lf_dir in $lf_subdirs do echo "linking headers from $srcdir/$lf_dir" # Check if the Headers file exists if test -f "$srcdir/$lf_dir/Headers" then for lf_file in `(cd $srcdir/$lf_dir; cat Headers)` do rm -f $lf_directory/$lf_file if test -f "$lf_srcdir/$lf_dir/$lf_file"; then $LN_S "$lf_srcdir/$lf_dir/$lf_file" "$lf_directory/$lf_file" else # assume it will be located in the build-directory $LN_S "`pwd`/$lf_dir/$lf_file" "$lf_directory/$lf_file" fi if echo ${lf_file}|fgrep 'P.h' > /dev/null 2>&1; then GEOMVIEWPRIVHDRFILES="${GEOMVIEWPRIVHDRFILES} include/${lf_file}" else GEOMVIEWHDRFILES="${GEOMVIEWHDRFILES} include/${lf_file}" fi done else echo "Warning: No Headers file for $srcdir/$lf_dir" fi done # See whether to put an entry for the prefix if test "$prefix" = "/usr" || test "$prefix" = "/usr/local" then default_includes="" else default_includes="-I\$(prefix) " fi # Get the directory list lf_dirs="`echo `" # Check whether we have a lib directory. If so put it in { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sources have a lib directory" >&5 $as_echo_n "checking whether sources have a lib directory... " >&6; } if test -d "`pwd`/$srcdir/lib" then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } default_includes="$default_includes -I\$(top_srcdir)/lib" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Now add in the directories. If the list is empty then just add include/ # If the list is not empty then add the subdirectories. if test -z "$lf_dirs" then default_includes="$default_includes -I\$(top_builddir)/include" else for lf_dir in $lf_dirs do default_includes="$default_includes -I\$(top_builddir)/include/$lf_dir" done fi # And that's it ac_config_files="$ac_config_files Makefile data/Makefile data/shaders/Makefile doc/Makefile src/Makefile src/lib/Makefile src/lib/aclib/Makefile src/lib/camera/Makefile src/lib/color/Makefile src/lib/fexpr/Makefile src/lib/oogl/Makefile src/lib/oogl/lisp/Makefile src/lib/oogl/refcomm/Makefile src/lib/oogl/util/Makefile src/lib/oogl/wa/Makefile src/lib/geometry/Makefile src/lib/geometry/cmodel/Makefile src/lib/geometry/hpoint3/Makefile src/lib/geometry/hpointn/Makefile src/lib/geometry/point3/Makefile src/lib/geometry/transform3/Makefile src/lib/geometry/transformn/Makefile src/lib/geometry/transobj/Makefile src/lib/geometry/ntransobj/Makefile src/lib/geomutil/Makefile src/lib/geomutil/bdy/Makefile src/lib/geomutil/crayplutil/Makefile src/lib/geomutil/dim/Makefile src/lib/geomutil/plutil/Makefile src/lib/gprim/Makefile src/lib/gprim/bbox/Makefile src/lib/gprim/bezier/Makefile src/lib/gprim/comment/Makefile src/lib/gprim/discgrp/Makefile src/lib/gprim/geom/Makefile src/lib/gprim/inst/Makefile src/lib/gprim/lincoln/Makefile src/lib/gprim/list/Makefile src/lib/gprim/mesh/Makefile src/lib/gprim/polylist/Makefile src/lib/gprim/ndmesh/Makefile src/lib/gprim/npolylist/Makefile src/lib/gprim/quad/Makefile src/lib/gprim/skel/Makefile src/lib/gprim/sphere/Makefile src/lib/gprim/stub/Makefile src/lib/gprim/tlist/Makefile src/lib/gprim/vect/Makefile src/lib/mg/Makefile src/lib/mg/buf/Makefile src/lib/mg/common/Makefile src/lib/mg/opengl/Makefile src/lib/mg/x11/Makefile src/lib/mg/ps/Makefile src/lib/mg/rib/Makefile src/lib/mib/Makefile src/lib/pointlist/Makefile src/lib/shade/Makefile src/lib/window/Makefile src/lib/forms/Makefile src/bin/Makefile src/bin/geomview/Makefile src/bin/geomview/common/Makefile src/bin/geomview/x11/Makefile src/bin/geomview/x11/bitmaps/Makefile src/bin/geomview/x11/interface/Makefile src/bin/animate/Makefile src/bin/animate/interface/Makefile src/bin/clipboard/Makefile src/bin/gvclock/gvclock src/bin/gvclock/Makefile src/bin/geomutil/Makefile src/bin/geomutil/bdy/Makefile src/bin/geomutil/clip/Makefile src/bin/geomutil/hvectext/Makefile src/bin/geomutil/hvectext/hvectext src/bin/geomutil/maple2oogl/Makefile src/bin/geomutil/math2oogl/Makefile src/bin/geomutil/oogl2rib/Makefile src/bin/geomutil/oogl2vrml/Makefile src/bin/geomutil/plutil/Makefile src/bin/geomutil/ucd/Makefile src/bin/geomutil/vrml2oogl/Makefile src/bin/geomutil/vrml2oogl/lib/Makefile src/bin/nose/Makefile src/bin/togeomview/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}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__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 "${INSTALL_LIBGEOMVIEW_TRUE}" && test -z "${INSTALL_LIBGEOMVIEW_FALSE}"; then as_fn_error $? "conditional \"INSTALL_LIBGEOMVIEW\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AQSIS_SHADER_COMPILER_TRUE}" && test -z "${AQSIS_SHADER_COMPILER_FALSE}"; then as_fn_error $? "conditional \"AQSIS_SHADER_COMPILER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${PIXIE_SHADER_COMPILER_TRUE}" && test -z "${PIXIE_SHADER_COMPILER_FALSE}"; then as_fn_error $? "conditional \"PIXIE_SHADER_COMPILER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DELIGHT_SHADER_COMPILER_TRUE}" && test -z "${DELIGHT_SHADER_COMPILER_FALSE}"; then as_fn_error $? "conditional \"DELIGHT_SHADER_COMPILER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MGOPENGL_TRUE}" && test -z "${MGOPENGL_FALSE}"; then as_fn_error $? "conditional \"MGOPENGL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MGX11_TRUE}" && test -z "${MGX11_FALSE}"; then as_fn_error $? "conditional \"MGX11\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MGGL_TRUE}" && test -z "${MGGL_FALSE}"; then as_fn_error $? "conditional \"MGGL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ZLIB_TRUE}" && test -z "${HAVE_ZLIB_FALSE}"; then as_fn_error $? "conditional \"HAVE_ZLIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BEZIER_SPHERES_TRUE}" && test -z "${BEZIER_SPHERES_FALSE}"; then as_fn_error $? "conditional \"BEZIER_SPHERES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CXX_TRUE}" && test -z "${HAVE_CXX_FALSE}"; then as_fn_error $? "conditional \"HAVE_CXX\" 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 geomview $as_me 1.9.5, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to >." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ geomview config.status 1.9.5 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;; "data/shaders/Makefile") CONFIG_FILES="$CONFIG_FILES data/shaders/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/lib/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/Makefile" ;; "src/lib/aclib/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/aclib/Makefile" ;; "src/lib/camera/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/camera/Makefile" ;; "src/lib/color/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/color/Makefile" ;; "src/lib/fexpr/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/fexpr/Makefile" ;; "src/lib/oogl/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/oogl/Makefile" ;; "src/lib/oogl/lisp/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/oogl/lisp/Makefile" ;; "src/lib/oogl/refcomm/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/oogl/refcomm/Makefile" ;; "src/lib/oogl/util/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/oogl/util/Makefile" ;; "src/lib/oogl/wa/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/oogl/wa/Makefile" ;; "src/lib/geometry/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/Makefile" ;; "src/lib/geometry/cmodel/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/cmodel/Makefile" ;; "src/lib/geometry/hpoint3/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/hpoint3/Makefile" ;; "src/lib/geometry/hpointn/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/hpointn/Makefile" ;; "src/lib/geometry/point3/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/point3/Makefile" ;; "src/lib/geometry/transform3/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/transform3/Makefile" ;; "src/lib/geometry/transformn/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/transformn/Makefile" ;; "src/lib/geometry/transobj/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/transobj/Makefile" ;; "src/lib/geometry/ntransobj/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/ntransobj/Makefile" ;; "src/lib/geomutil/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geomutil/Makefile" ;; "src/lib/geomutil/bdy/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geomutil/bdy/Makefile" ;; "src/lib/geomutil/crayplutil/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geomutil/crayplutil/Makefile" ;; "src/lib/geomutil/dim/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geomutil/dim/Makefile" ;; "src/lib/geomutil/plutil/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geomutil/plutil/Makefile" ;; "src/lib/gprim/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/Makefile" ;; "src/lib/gprim/bbox/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/bbox/Makefile" ;; "src/lib/gprim/bezier/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/bezier/Makefile" ;; "src/lib/gprim/comment/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/comment/Makefile" ;; "src/lib/gprim/discgrp/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/discgrp/Makefile" ;; "src/lib/gprim/geom/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/geom/Makefile" ;; "src/lib/gprim/inst/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/inst/Makefile" ;; "src/lib/gprim/lincoln/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/lincoln/Makefile" ;; "src/lib/gprim/list/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/list/Makefile" ;; "src/lib/gprim/mesh/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/mesh/Makefile" ;; "src/lib/gprim/polylist/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/polylist/Makefile" ;; "src/lib/gprim/ndmesh/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/ndmesh/Makefile" ;; "src/lib/gprim/npolylist/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/npolylist/Makefile" ;; "src/lib/gprim/quad/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/quad/Makefile" ;; "src/lib/gprim/skel/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/skel/Makefile" ;; "src/lib/gprim/sphere/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/sphere/Makefile" ;; "src/lib/gprim/stub/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/stub/Makefile" ;; "src/lib/gprim/tlist/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/tlist/Makefile" ;; "src/lib/gprim/vect/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/vect/Makefile" ;; "src/lib/mg/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/mg/Makefile" ;; "src/lib/mg/buf/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/mg/buf/Makefile" ;; "src/lib/mg/common/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/mg/common/Makefile" ;; "src/lib/mg/opengl/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/mg/opengl/Makefile" ;; "src/lib/mg/x11/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/mg/x11/Makefile" ;; "src/lib/mg/ps/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/mg/ps/Makefile" ;; "src/lib/mg/rib/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/mg/rib/Makefile" ;; "src/lib/mib/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/mib/Makefile" ;; "src/lib/pointlist/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/pointlist/Makefile" ;; "src/lib/shade/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/shade/Makefile" ;; "src/lib/window/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/window/Makefile" ;; "src/lib/forms/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/forms/Makefile" ;; "src/bin/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/Makefile" ;; "src/bin/geomview/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomview/Makefile" ;; "src/bin/geomview/common/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomview/common/Makefile" ;; "src/bin/geomview/x11/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomview/x11/Makefile" ;; "src/bin/geomview/x11/bitmaps/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomview/x11/bitmaps/Makefile" ;; "src/bin/geomview/x11/interface/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomview/x11/interface/Makefile" ;; "src/bin/animate/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/animate/Makefile" ;; "src/bin/animate/interface/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/animate/interface/Makefile" ;; "src/bin/clipboard/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/clipboard/Makefile" ;; "src/bin/gvclock/gvclock") CONFIG_FILES="$CONFIG_FILES src/bin/gvclock/gvclock" ;; "src/bin/gvclock/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/gvclock/Makefile" ;; "src/bin/geomutil/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/Makefile" ;; "src/bin/geomutil/bdy/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/bdy/Makefile" ;; "src/bin/geomutil/clip/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/clip/Makefile" ;; "src/bin/geomutil/hvectext/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/hvectext/Makefile" ;; "src/bin/geomutil/hvectext/hvectext") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/hvectext/hvectext" ;; "src/bin/geomutil/maple2oogl/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/maple2oogl/Makefile" ;; "src/bin/geomutil/math2oogl/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/math2oogl/Makefile" ;; "src/bin/geomutil/oogl2rib/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/oogl2rib/Makefile" ;; "src/bin/geomutil/oogl2vrml/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/oogl2vrml/Makefile" ;; "src/bin/geomutil/plutil/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/plutil/Makefile" ;; "src/bin/geomutil/ucd/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/ucd/Makefile" ;; "src/bin/geomutil/vrml2oogl/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/vrml2oogl/Makefile" ;; "src/bin/geomutil/vrml2oogl/lib/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/vrml2oogl/lib/Makefile" ;; "src/bin/nose/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/nose/Makefile" ;; "src/bin/togeomview/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/togeomview/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_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; 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 geomview-1.9.5/configure.ac0000644000175000017500000010570112310160766012565 00000000000000AC_PREREQ(2.59) AC_INIT(geomview, [1.9.5], Claus-Justus Heine ) AC_MSG_RESULT([configuring $PACKAGE_NAME $PACKAGE_VERSION]) AC_CANONICAL_TARGET([]) AM_INIT_AUTOMAKE([dist-bzip2 dist-xz 1.14]) AM_MAINTAINER_MODE AC_CONFIG_SRCDIR([src/bin/geomview/x11/gvmain.c]) AC_CONFIG_HEADER([config.h]) AC_CONFIG_MACRO_DIR([m4]) AC_SUBST(abs_top_builddir) AC_SUBST(abs_top_srcdir) GEOMVIEW_SET_PREFIX dnl Add extra include or link directories AC_ARG_WITH(build-path,[ --with-build-path[=DIR] use DIR/include DIR/lib ],[ for d in `echo $withval | tr : ' '`; do test -d $d/include && CPPFLAGS="$CPPFLAGS -I$d/include" test -d $d/lib && LDFLAGS="$LDFLAGS -L$d/lib" done ]) ## Autoheader stuff. AH_TOP([#ifndef CONFIG_H_INCLUDED #define CONFIG_H_INCLUDED /* AIX requires this to be the first thing in the file. */ #ifndef __GNUC__ # if HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif #endif]) AH_BOTTOM([#if D1_DEBUG #define D1PRINT(args) printf args #else #define D1PRINT(args) #endif #define _FILE_OFFSET_BITS 64 #define _LARGEFILE64_SOURCE #if !HAVE_WORKING_FORK # error FIXME! We need fork() #endif #if !HAVE_LSTAT || \ !LSTAT_FOLLOWS_SLASHED_SYMLINK || \ HAVE_LSTAT_EMPTY_STRING_BUG # define lstat(path, buf) gv_lstat(path, buf) #endif #if !HAVE_STAT || HAVE_STAT_EMPTY_STRING_BUG # define stat(path, buf) gv_stat(path, buf) # define fstat(fd, buf) gv_fstat(fd, buf) #endif #if HAVE_MATH_H # include #endif #ifdef isfinite # ifdef finite # undef finite # endif # define finite(x) isfinite(x) #endif #ifdef HAVE_STDBOOL_H # include #else # ifndef HAVE__BOOL # ifdef __cplusplus typedef bool _Bool; # else # define _Bool signed char # endif # endif # define bool _Bool # define false 0 # define true 1 # define __bool_true_false_are_defined 1 #endif /* make sure we have PATH_MAX */ #if HAVE_LIMITS_H # include #endif #if HAVE_SYS_PARAM # include #endif #ifndef PATH_MAX # ifndef _POSIX_PATH_MAX # ifndef MAXPATHLEN # define PATH_MAX 4096 # else # define PATH_MAX MAXPATHLEN # endif # else # define PATH_MAX _POSIX_PATH_MAX # endif #endif #if HAVE_ISO_C99 # define VARARRAY(name, type, len) type name[len] # define VARARRAY2(name, type, len1, len2) type name[len1][len2] #else # define VARARRAY(name, type, len) type *name = alloca((len)*sizeof(type)) # define VARARRAY2(name, type, len1, len2) \ type (*name)[len2] = alloca((len1)*(len2)*sizeof(type)) #endif #if 0 #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #undef malloc #undef free #undef realloc #undef calloc #undef strdup extern void *malloc_record(size_t size, const char *file, const char *func, int line); extern void *realloc_record(void *ptr, size_t size, const char *file, const char *func, int line); extern void *calloc_record(size_t nmemb, size_t size, const char *file, const char *func, int line); extern char *strdup_record(const char *string, const char *file, const char *func, int line); extern void free_record(void *ptr); #define malloc(size) malloc_record(size, __FILE__, __FUNCTION__, __LINE__) #define realloc(ptr, size) realloc_record(ptr, size, __FILE__, __FUNCTION__, __LINE__) #define calloc(nmemb, size) calloc_record(nmemb, size, __FILE__, __FUNCTION__, __LINE__) #define strdup(str) strdup_record(str, __FILE__, __FUNCTION__, __LINE__) #define free(ptr) free_record(ptr) #define OOG_NewP(size) malloc(size) #define OOG_RenewP(p, size) realloc(p, size) #define OOG_NewE(size, blah) malloc(size) #define OOG_RenewE(p, size, blah) realloc(p, size) #define OOGLFree(p) free(p) #endif #endif /* CONFIG_H_INCLUDED */ ]) ################################################################################ # # What follows was originally output from autoscan. We do some generic # checking before overiding specific stuff (ACCEPT_ARG3_TYPE) for # certain known systems. # # Checks for programs. AC_PROG_CXX if test "$CXX" = "" ; then HAVE_CXX=false AC_MSG_WARN([ Configuring without a C++ compiler (couldn't find one on your system). C++ is only used only to compile the vrml->OOGL converter, so your distribution will be compiled without it. ]) else HAVE_CXX=true fi AC_PROG_CC GEOMVIEW_ISO_C99_CHECK AC_PROG_AWK AC_PROG_INSTALL AC_PROG_CPP AC_PROG_LEX AC_PROG_YACC AM_CONDITIONAL([INSTALL_LIBGEOMVIEW],[true || test "z${enable_shared}" = "zyes"]) AC_PROG_LIBTOOL # Search path for "find" executable. Use "find" unless # the bogus MS Windows version is first on the path, in # which case we use the full pathname. This AC_CHECK_PROG # macro is very strange. AC_CHECK_PROG([FIND],[find],[find],[no],,[/cygdrive/c/WINNT/system32/find]) if test "$FIND" = "no"; then AC_MSG_ERROR([No find found. Cannot continue.]) fi # Check for availability of /bin/csh for file-name globbing. Try /bin/sh # if not found. AC_PATH_PROGS(GLOB_SHELL_PATH, [csh sh], [/bin/csh]) if echo ${GLOB_SHELL_PATH} | grep csh > /dev/null 2>&1; then GLOB_SHELL="${GLOB_SHELL_PATH} -f -c " else GLOB_SHELL="${GLOB_SHELL_PATH} -c " fi AC_DEFINE_UNQUOTED([GLOB_SHELL], ["${GLOB_SHELL}"], [Define to path and arguments of shell used for file name globbing]) AC_SUBST([GLOB_SHELL]) # AC_CHECK_PROGS(PS2EPSI, ps2epsi) AC_CHECK_PROGS(EPSTOPDF, epstopdf) AC_CHECK_PROGS(PDFIMAGESPROG, pdfimages) AC_CHECK_PROGS(PNMTOPNG, pnmtopng) # For rman texture support. If not found we can only output RGB pnm images # without alpha channel. AC_CHECK_PROGS(PAMTOTIFF, pamtotiff) if test "${PAMTOTIFF}" = "pamtotiff"; then AC_DEFINE_UNQUOTED([HAVE_PAMTOTIFF], "$PAMTOTIFF", [pamtotiff program]) else AC_MSG_NOTICE([`pamtotiff' executable not found; textures in RenderMan output will not have an alpha-channel. Consider installing a newer NetPBM package.]) fi # Check for various shader language comilers; we try to compile and # install our RenderMan shaders for any of the shader compilers; I # have included only those which are free of charge. # GV_CHECK_PROG(aqsis-shader-compiler, aqsl) GV_CHECK_PROG(pixie-shader-compiler, sdrc) GV_CHECK_PROG(delight-shader-compiler, shaderdl) # Checks for libraries. AC_CHECK_LIB([m], [cos]) # Checks for header files. AC_FUNC_ALLOCA AC_HEADER_DIRENT AC_HEADER_STDC AC_HEADER_SYS_WAIT AC_CHECK_HEADERS([errno.h fcntl.h getopt.h inttypes.h libgen.h libintl.h \ limits.h locale.h malloc.h \ netinet/in.h stddef.h stdlib.h string.h sys/file.h sys/param.h sys/select.h \ sys/socket.h sys/systeminfo.h sys/time.h sys/types.h unistd.h io.h math.h]) # Checks for typedefs, structures, and compiler characteristics. AC_C_BIGENDIAN AC_C_CONST AC_HEADER_STDBOOL AC_C_INLINE AC_TYPE_SIZE_T AC_HEADER_TIME AC_STRUCT_TM AC_LANG_PUSH([C]) AC_MSG_CHECKING([for M_PI]) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [#if HAVE_MATH_H # include #endif ], [double blah = M_PI;])], [AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_M_PI, 1, [Define to 1 if M_PI is defined])], [AC_MSG_RESULT([no])]) AC_LANG_POP([C]) AC_CHECK_TYPES([dev_t, ino_t, time_t]) AC_CHECK_SIZEOF([dev_t]) AC_CHECK_SIZEOF([ino_t]) AC_CHECK_SIZEOF([time_t]) AC_CHECK_SIZEOF([long]) AC_CHECK_SIZEOF([int]) # Checks for library functions AC_CONFIG_LIBOBJ_DIR([src/lib/aclib]) AC_FUNC_CLOSEDIR_VOID AC_FUNC_FORK AC_FUNC_MEMCMP AC_FUNC_OBSTACK #AC_FUNC_MALLOC It is ok when malloc(0) returns NULL. Why not? #AC_FUNC_REALLOC It is ok when realloc(0, 0) returns NULL. Why not? AC_FUNC_SETPGRP AC_FUNC_SETVBUF_REVERSED AC_TYPE_SIGNAL AC_FUNC_STAT AC_FUNC_LSTAT #AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK AC_FUNC_STRTOD AC_FUNC_VPRINTF AC_FUNC_WAIT3 AC_CHECK_FUNCS([fmemopen], [AC_CHECK_DECLS([fmemopen])], [AC_LIBOBJ([fmemopen])]) AC_REPLACE_FUNCS([acosh popen putenv strcasecmp strdup strncasecmp lstat stat]) AC_CHECK_DECLS([putenv, strdup, acosh, strcasecmp, strncasecmp]) AC_CHECK_FUNCS([fstat]) AC_CHECK_FUNCS([vfscanf]) AC_FUNC_SELECT_ARGTYPES AC_CHECK_FUNC([select], [AC_DEFINE(HAVE_SELECT, 1, [Define to 1 if you have the `select' function.]) AC_CHECK_DECLS([select],[],[],[ #if HAVE_SYS_SELECT_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_SYS_TIME_H # include #endif #if HAVE_SYS_TYPES_H # include #endif])]) AC_CHECK_DECLS([errno],[],[],[ #if HAVE_ERRNO_H # include #endif]) ac_gv_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE" AC_CHECK_FUNCS([lseek64 llseek lseek]) AC_CHECK_DECLS([lseek64, llseek, lseek]) AC_CHECK_TYPES([off64_t, loff_t, off_t]) CPPFLAGS="${ac_gv_save_CPPFLAGS}" AC_CHECK_FUNCS([alarm basename bzero bcopy dirname dup2 floor fcntl finite \ gethostname getopt gettimeofday isascii mallinfo memset mkdir pow read rint \ select sqrt strchr strcspn strdup strerror strncasecmp strpbrk \ strrchr strstr strtol strerror sysinfo waitpid wait3 write]) AC_CHECK_DECLS([getopt, optarg, optind, opterr, optopt],[],[]) AC_CHECK_FUNCS([setlocale], [AC_CHECK_DECLS([LC_ALL],[],[],[ #if HAVE_LOCALE_H # include #endif ])]) # # we can use AC_COMPILE, because we check later for the existence of # socket() # ################################################################################ AC_MSG_CHECKING([for Unix domain sockets]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ #if HAVE_SYS_SOCKET_H # include #endif ],[int s = socket(PF_UNIX, SOCK_STREAM, 0); ]) ],[ HAVE_UNIX_SOCKETS=yes AC_MSG_RESULT([yes]) ],[ HAVE_UNIX_SOCKETS=no AC_MSG_RESULT([no])]) ################################################################################ AC_MSG_CHECKING([for IPv4 sockets]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ #if HAVE_SYS_SOCKET_H # include #endif ],[int s = socket(PF_INET, SOCK_STREAM, 0); ]) ],[ HAVE_INET_SOCKETS=yes AC_MSG_RESULT([yes]) ],[ HAVE_INET_SOCKETS=no AC_MSG_RESULT([no])]) ################################################################################ AC_MSG_CHECKING([for IPv6 sockets]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ #if HAVE_SYS_SOCKET_H # include #endif ],[int s = socket(PF_INET6, SOCK_STREAM, 0); ]) ],[ HAVE_INET6_SOCKETS=yes AC_MSG_RESULT([yes]) ],[ HAVE_INET6_SOCKETS=no AC_MSG_RESULT([no])]) ################################################################################ if test "z${HAVE_UNIX_SOCKETS}" != "zno"\ -o "z${HAVE_INET_SOCKETS}" != "zno"\ -o "z${HAVE_INET6_SOCKETS}" != "zno"; then # # Try to figure out how to get at the "socket()" function # AC_MSG_NOTICE([Checking whether we need to link -lsocket to get socket() ...]) AC_CHECK_FUNCS([socket],[ AC_DEFINE([HAVE_SOCKET],1,[Define to 1 if you have socket()]) SOCKETLIBS= AC_MSG_RESULT([-lsocket not needed]) ],[ AC_CHECK_LIB([socket],[socket],[ AC_DEFINE([HAVE_SOCKET],1,[Define to 1 if you have socket()]) SOCKETLIBS=-lsocket AC_MSG_RESULT([-lsocket is needed]) ],[ SOCKETLIBS= HAVE_UNIX_SOCKETS=no AC_MSG_RESULT([socket() not available]) ]) ]) fi # HAVE_UNIX/INET/INET6_SOCKETS=yes ac_save_LIBS="${LIBS}" LIBS="${SOCKETLIBS} ${LIBS}" if test "z${HAVE_UNIX_SOCKETS}" != "zno"; then AC_CHECK_FUNCS([accept bind connect listen socket],[],[ SOCKETLIBS= HAVE_UNIX_SOCKETS=no]) fi LIBS="${ac_save_LIBS}" if test "z${HAVE_UNIX_SOCKETS}" != "zno"\ -o "z${HAVE_INET_SOCKETS}" != "zno"\ -o "z${HAVE_INET6_SOCKETS}" != "zno"; then # # Try to figure out what the 3rd argument of accept should be. The # third argument is an integer type, ideally it is "socklent_t". As # the third argument is a pointer, we cannot just check for a # declaration of accept() and leave the rest to the comiler: the size # of the type should match. On little-endian machines we could just # choose the largest integer type available, on big-endian machines # this would not work. Gnah. # AC_CHECK_DECLS([accept],[],[],[ #if HAVE_SYS_SOCKET_H # include #endif ]) AC_CHECK_TYPES([socklen_t],[ ACCEPT_ARG3_TYPE=socklen_t ],[ ACCEPT_ARG3_TYPE=int ],[ #if HAVE_SYS_SOCKET_H # include #endif ]) fi # HAVE_UNIX/INET/INET6_SOCKETS=yes AC_SUBST(SOCKETLIBS) if test "z${HAVE_UNIX_SOCKETS}" != "zno"; then AC_DEFINE([HAVE_UNIX_SOCKETS],1, [Define to 1 if Unix domain sockets are available]) fi if test "z${HAVE_INET_SOCKETS}" != "zno"; then AC_DEFINE([HAVE_INET_SOCKETS],1, [Define to 1 if IPv4 sockets are available]) fi if test "z${HAVE_INET6_SOCKETS}" != "zno"; then AC_DEFINE([HAVE_INET6_SOCKETS],1, [Define to 1 if IPv6 sockets are available]) fi # # End autoscan stuff. # ################################################################################ # The following vars contain info about the local system: # (AC_CANONICAL_TARGET([]) sets them) # var value on RedHat 6.1 # --- ------------------- # build i686-pc-linux-gnu # host i686-pc-linux-gnu # target i686-pc-linux-gnu # build_alias i686-pc-linux-gnu # host_alias i686-pc-linux-gnu # target_alias i686-pc-linux-gnu # build_cpu i686 # build_vendor pc # build_os linux-gnu # host_cpu i686 # host_vendor pc # host_os linux-gnu # target_cpu i686 # target_vendor pc # target_os linux-gnu case "$target" in *linux*) MACHTYPE=`echo ${target}|sed 's/unknown/pc/g'` ;; *irix*) MACHTYPE="${target}" AC_DEFINE(sgi, 1, [Define to 1 if we are compiling for sgi]) if test "$CC" = "cc" ; then CFLAGS="$CFLAGS -float" LIBS="$LIBS -lmalloc" fi ;; *darwin*) MACHTYPE="${target}" AC_DEFINE(unix, 1, [Define to 1 since we are compiling for unix]) ;; *rs6000*) MACHTYPE="${target}" AC_DEFINE(AIX, 1, [Define to 1 if we are compiling for AIX]) ACCEPT_ARG3_TYPE="unsigned long" AC_DEFINE(unix, 1, [Define to 1 if we are compiling for unix???]) ;; *) MACHTYPE="${target}" ;; esac AC_DEFINE_UNQUOTED(MACHTYPE, "$MACHTYPE",[Define to the machine type]) AC_SUBST(MACHTYPE) AC_DEFINE_UNQUOTED(ACCEPT_ARG3_TYPE, $ACCEPT_ARG3_TYPE,[ ACCEPT_ARG3_TYPE should be the datatype of the 3rd arg to the 'accept' system call. It's 'int' on some systems, 'unsigned long' on some, and could be something else on others. Default to int]) # Search for necessary programs. AC_ARG_WITH(htmlbrowser, AC_HELP_STRING([--with-htmlbrowser=BROWSER], [Use BROWSER for viewing the HTML version of the manual when the `Manual (HTML)' menu item is selected. This setting can be changed at runtime through the '(ui-html-browser BROWSER)' GCL-command. (default: firefox)]), [DFLTHTMLBROWSER="${withval}"], [DFLTHTMLBROWSER="firefox"]) AC_DEFINE_UNQUOTED(DFLTHTMLBROWSER, ["${DFLTHTMLBROWSER}"], [Define to the name of the html browser for online viewing of the HTML manual.]) AC_CHECK_PROGS(HTMLBROWSER, ${DFLTHTMLBROWSER}) if ! test "${HTMLBROWSER}" = "${DFLTHTMLBROWSER}"; then AC_MSG_NOTICE([HTML browser executable not found, online viewing of the HTML manual will probably not be possible.]) fi AC_ARG_WITH(pdfviewer, AC_HELP_STRING([--with-pdfviewer=VIEWER], [Use BROWSER for viewing the PDF version of the manual when the `Manual (PDF)' menu item is selected. This setting can be changed at runtime through the '(ui-pdf-viewer VIEWER)' GCL-command. (default: xpdf)]), [DFLTPDFVIEWER="${withval}"], [DFLTPDFVIEWER="xpdf"]) AC_DEFINE_UNQUOTED(DFLTPDFVIEWER, ["${DFLTPDFVIEWER}"], [Define to the name of the html browser for online viewing of the PDF manual.]) AC_CHECK_PROGS(PDFVIEWER, ${DFLTPDFVIEWER}) if ! test "${PDFVIEWER}" = "${DFLTPDFVIEWER}"; then AC_MSG_NOTICE([PDF viewr executable not found, online viewing of the PDF manual will probably not be possible.]) fi ######################################################################## ######################################################################## ######################################################################## # If --with-motif=DIR was specified, set MOTIF_DIR to DIR AC_ARG_WITH(motif, AC_HELP_STRING([--with-motif=DIR], [Set DIR to motif installation prefix. It is not possible to compile Geomview without Motif.]), [MOTIF_DIR=$withval]) AC_ARG_WITH(opengl, AC_HELP_STRING([--with-opengl=DIR], [Set DIR to opengl installation prefix. OpenGL is optional. The default is to auto-detect OpenGL and use it if available. Use `--without-opengl' to disable OpenGL.]), [OPENGL_DIR=$withval]) ######################################################################## # # Store X library link line in XLIBS # AC_PATH_XTRA XLIBS="$X_LIBS $X_PRE_LIBS -lXt -lXext -lX11 $X_EXTRA_LIBS" AC_SUBST(XLIBS) AC_CACHE_VAL(ac_cv_XLIBS,[ac_cv_XLIBS="XLIBS='$XLIBS'"]) ######################################################################## AC_MSG_CHECKING([for Xmu]) result="no" GEOM_FIND_L_OPTION(-lXmu, XmuLookupStandardColormap, ["" "$x_libraries" "$MOTIF_DIR/lib"], $XLIBS) if test "$GEOM_L_OPTION" != "0" ; then result="yes" AC_DEFINE(HAVE_XMU, 1, [Does -lXmu exist on this system?]) if test "$GEOM_L_OPTION" != "" ; then XMULIBS="$GEOM_L_OPTION -lXmu" else XMULIBS="-lXmu" fi fi AC_SUBST(XMULIBS) AC_MSG_RESULT([$result]) ######################################################################## AC_MSG_CHECKING([for motif]) if test "$MOTIF_DIR" != "" ; then USER_MOTIF_DIR="$MOTIF_DIR/include" else USER_MOTIF_DIR="" fi GEOM_FIND_I_OPTION(Xm/Xm.h, ["$USER_MOTIF_DIR" "" "$x_includes" "/usr/local/include"]) if test "$GEOM_I_OPTION" = "0" ; then AC_MSG_ERROR([ Can't find Motif header file Xm/Xm.h. Geomview requires Motif (or Lesstif). See the file INSTALL.Geomview for details. ]) fi MOTIFINCLUDE=$GEOM_I_OPTION AC_SUBST(MOTIFINCLUDE) ######################################################################## if test "$MOTIFLIBS" = "" ; then MOTIFLIBS="-lXm" fi if test "$MOTIF_DIR" != "" ; then USER_MOTIF_DIR="$MOTIF_DIR/lib" else USER_MOTIF_DIR="" fi GEOM_FIND_L_OPTION($MOTIFLIBS, XmCreateForm, ["$USER_MOTIF_DIR" "" "$x_libraries" "/usr/local/lib"], $XLIBS ) if test "$GEOM_L_OPTION" = "0" ; then AC_MSG_ERROR([ Can't find Motif libraries. Geomview requires Motif (or Lesstif). See the file INSTALL.Geomview for details. ]) fi MOTIF_L_OPTION=$GEOM_L_OPTION MOTIFLIBS="$GEOM_L_OPTION $MOTIFLIBS" AC_SUBST(MOTIFLIBS) AC_MSG_RESULT([headers $MOTIFINCLUDE, libraries $MOTIFLIBS]) ######################################################################## if test "z${OPENGL_DIR}" != "zno"; then AC_MSG_CHECKING([for opengl]) if test "$OPENGL_DIR" != "" ; then USER_OPENGL_DIR="$OPENGL_DIR/include" else USER_OPENGL_DIR="" fi GEOM_FIND_I_OPTION(GL/gl.h, ["$USER_OPENGL_DIR" "" "/usr/local/include"]) if test "$GEOM_I_OPTION" = "0" ; then AC_MSG_WARN([ Can't find OpenGL header file GL/gl.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. ]) OPENGLINCLUDE="" # $GEOM_I_OPTION fi GL_I_OPTION=$GEOM_I_OPTION # Geomview does not require OpenGL, _BUT_ an OpenGL implementation # through the X11 GLX extension; so check for glx.h as well. # # GEOM_FIND_I_OPTION(GL/glx.h, ["$USER_OPENGL_DIR" "" "/usr/local/include"]) if test "$GEOM_I_OPTION" = "0" ; then AC_MSG_WARN([ Can't find OpenGL header file GL/glx.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. ]) GL_I_OPTION=0 else GL_I_OPTION="${GL_I_OPTION} ${GEOM_I_OPTION}" OPENGLINCLUDE="${OPENGLINCLUDE} ${GEOM_I_OPTION}" fi ######################################################################## if test "$OPENGL_DIR" != "" ; then USER_OPENGL_DIR="$OPENGL_DIR/lib" else USER_OPENGL_DIR="" fi GEOM_FIND_L_OPTION(-lGL, glBegin, ["$USER_OPENGL_DIR" "" "$x_libraries" "/usr/local/lib"], "$XLIBS -lm") if test "$GEOM_L_OPTION" = "0" ; then AC_MSG_WARN([ Can't find OpenGL header file GL/gl.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. ]) fi GL_L_OPTION=$GEOM_L_OPTION GEOM_FIND_L_OPTION(-lGLU, gluBeginPolygon, ["$USER_OPENGL_DIR" "" "$x_libraries" "/usr/local/lib"], "$GL_L_OPTION -lGL $XLIBS -lm") if test "$GEOM_L_OPTION" != "$GL_L_OPTION" ; then GLU_L_OPTION=$GEOM_L_OPTION else GLU_L_OPTION="" fi if test "z${GLU_L_OPTION}" = "z0"; then AC_MSG_RESULT([libGLU not found. libGLU is required to render non-flat or concave polygons.]) OPENGLLIBS="$GL_L_OPTION -lGL" AC_DEFINE([HAVE_LIBGLU], 0, [Define to 1 if you have libGLU]) else OPENGLLIBS="$GL_L_OPTION -lGL $GLU_L_OPTION -lGLU" AC_DEFINE([HAVE_LIBGLU], 1, [Define to 1 if you have libGLU]) fi AC_MSG_RESULT([headers $OPENGLINCLUDE, libraries $OPENGLLIBS]) ############################################################################# # Check for the OSMesa library which can be used for high quality # off-screen snapshots, including texture. This is beneficial over # making a snapshot of a window, because the latter only works when # the window is mapped and not obscured by other windows. However, # this can only work if libGL is indeed based on Mesa because # libOSMesa overrides the OpenGL API entries. ### ### unluckily, this just does not seem to work. Sad story. Disable the ### stuff. The good news: we can use glXCreateGLXPixmap() and render ### into that pixmap. ### # ac_gv_save_LIBS="${LIBS}" # LIBS="${OPENGLLIBS} ${XLIBS} ${LIBS}" # AC_CHECK_FUNCS([glXAllocateMemoryMESA],[MESAGL=1],[MESAGL=0]) # if test "${MESAGL}" = "1"; then # AC_CHECK_LIB([OSMesa], [OSMesaCreateContext], # [OPENGLLIBS="$GL_L_OPTION -lOSMesa -lGL $GLU_L_OPTION -lGLU"], # [],[${OPENGLLIBS}]) # fi # LIBS="${ac_gv_save_LIBS}" MESAGL=0 AC_DEFINE_UNQUOTED([MESAGL],${MESAGL}, [Define to 1 if your are using the Mesa OpenGL implementation]) AC_SUBST(MESAGL) # Even without libOSMesa it is possible to generate off-screen snapshots # by using glXCrateGLXPixmap(). ac_gv_save_LIBS="${LIBS}" LIBS="${OPENGLLIBS} ${XLIBS} ${LIBS}" AC_CHECK_FUNCS([glXCreateGLXPixmap]) LIBS="${ac_gv_save_LIBS}" fi # without-opengl # # substitute, even if empty # AC_SUBST(OPENGLLIBS) AC_SUBST(OPENGLINCLUDE) # # MGX11 is always defined, does not hurt to include it in the library. # if test "z${GL_I_OPTION}" != "z0" && \ test "z${GL_L_OPTION}" != "z0" && \ test "z${OPENGL_DIR}" != "zno"; then MGOPENGL=1 MGX11=1 else MGOPENGL=0 MGX11=1 fi MGGL=0 AM_CONDITIONAL([MGOPENGL],[test "${MGOPENGL}" = 1]) AC_DEFINE_UNQUOTED([MGOPENGL],${MGOPENGL}, [Define to 1 if OpenGL (or Mesa or anything equivalent) is available and should be used for rendering]) AM_CONDITIONAL([MGX11],[test "${MGX11}" = 1]) AC_DEFINE_UNQUOTED([MGX11],${MGX11}, [Define to 1 if all rendering should be performed through the X library (i.e. no accelerated 3D rendering, no textures)]) AM_CONDITIONAL([MGGL],[test "${MGGL}" = 1]) AC_DEFINE_UNQUOTED([MGGL],${MGGL}, [Leave this at 0]) ######################################################################## # Check for zlib (and maybe bzlib? (image compression/decompression)) #GEOMVIEW_CHECK_PACKAGE([bz2lib],[bz2],[],[],[bzlib.h],[],[],[optional enabled]) GEOMVIEW_CHECK_PACKAGE([zlib],[z],[],[],[zlib.h],[],[],[optional enabled]) gv_ac_save_LIBS="${LIBS}" LIBS="${LIBS} ${ZLIB_ALL_LIB}" AC_CHECK_FUNCS([compressBound]) # pre-1.2 zlib? LIBS="${gv_ac_save_LIBS}" ######################################################################## OPENGL_LD_LIBRARY_PATH=`expr "$GL_L_OPTION" : '-L\(.*\)'` MOTIF_LD_LIBRARY_PATH=`expr "$MOTIF_L_OPTION" : '-L\(.*\)'` if test "$OPENGL_LD_LIBRARY_PATH" != "0" ; then LOCAL_LD_LIBRARY_PATH=$OPENGL_LD_LIBRARY_PATH fi if test "$MOTIF_LD_LIBRARY_PATH" != "0" ; then if test "$LOCAL_LD_LIBRARY_PATH" != "" ; then LOCAL_LD_LIBRARY_PATH="$LOCAL_LD_LIBRARY_PATH:$MOTIF_LD_LIBRARY_PATH" else LOCAL_LD_LIBRARY_PATH="$MOTIF_LD_LIBRARY_PATH" fi fi if test "$LOCAL_LD_LIBRARY_PATH" != "" ; then LD_LIBRARY_PATH_SETTINGS="LD_LIBRARY_PATH=$LOCAL_LD_LIBRARY_PATH" AC_SUBST(LD_LIBRARY_PATH_SETTINGS) fi ######################################################################## ######################################################################## ######################################################################## AC_ARG_ENABLE(d1debug, [ --enable-d1debug turn on D1 level debugging output], [ if test "$enableval" != "no" ; then AC_DEFINE(D1_DEBUG, 1) fi ], [AC_DEFINE(D1_DEBUG, 0, [D1 debugging?])] ) AC_ARG_ENABLE([motion-averaging], AC_HELP_STRING([--enable-motion-averaging], [turn on experimental motion averaging (default is off)]), [if test "$enableval" = "no" ; then AC_DEFINE(EXPERIMENTAL_MOTION_AVERAGING, 0, [Use experimental motion averaging code?]) else AC_DEFINE(EXPERIMENTAL_MOTION_AVERAGING, 1) fi], [AC_DEFINE(EXPERIMENTAL_MOTION_AVERAGING, 0)]) dnl AC_ARG_ENABLE([bezier-spheres], dnl AC_HELP_STRING([--disable-bezier-spheres],[Use a mesh based on a polar dnl co-ordinate system instead of using Bezier-splines to approximate a sphere. dnl This simplifies drawing textured spheres if the texture co-ordinates live dnl in a polar co-ordinate system, e.g. when trying to paste a world-map onto dnl a sphere. (default: use Bezier splines)]), dnl [case "$enableval" in dnl yes) BEZIER_SPHERES=1 ;; dnl no) BEZIER_SPHERES=0 ;; dnl *) AC_MSG_ERROR([--disable-bezier-spheres does not take any arguments beside "yes" and "no"]) ;; dnl esac], dnl [BEZIER_SPHERES=1]) BEZIER_SPHERES=0 AM_CONDITIONAL([BEZIER_SPHERES],[test "${BEZIER_SPHERES}" = 1]) AC_DEFINE_UNQUOTED([BEZIER_SPHERES], [${BEZIER_SPHERES}], [Define to 0 to use polar meshes for drawing of spheres]) ######################################################################## ######################################################################## ######################################################################## AC_LANG_PUSH([C]) AC_MSG_CHECKING( [whether popen(CMD, MODE) needs/accepts MODE = "rb" for binary files]) AC_RUN_IFELSE( [AC_LANG_PROGRAM( [#include ], [FILE *pipe = popen("${SHELL}", "rb"); if (pipe == NULL) return 1; else return 0;])],[AC_MSG_RESULT([yes]) AC_DEFINE(POPEN_ACCEPTS_RB, 1, [Define to 1 if popen(CMD, MODE) accepts "rb" for MODE])], [AC_MSG_RESULT([no])]) AC_LANG_POP([C]) AM_CONDITIONAL(HAVE_CXX, test x$HAVE_CXX = xtrue) ######################################################################## dnl docdir='${datarootdir}/doc/${PACKAGE_TARNAME}-${PACKAGE_VERSION}' AC_SUBST(docdir) AC_DEFINE_UNQUOTED(DOCDIR, ["`eval eval echo ${docdir}`"], ["Define to the root of the Geomview documentation"]) moduledir="\$(libexecdir)/geomview" AC_SUBST(moduledir) geomdatadir="\$(datadir)/geomview" AC_SUBST(geomdatadir) ######################################################################## top_geom_builddir='$(top_builddir)' AC_SUBST(top_geom_builddir) OOGLLIBS="\$(top_geom_builddir)/src/lib/oogl/wa/libwa.la \ \$(top_geom_builddir)/src/lib/camera/libcamera.la \ \$(top_geom_builddir)/src/lib/color/libcolor.la \ \$(top_geom_builddir)/src/lib/fexpr/libfexpr.la \ \$(top_geom_builddir)/src/lib/geomutil/bdy/libbdy.la \ \$(top_geom_builddir)/src/lib/geomutil/crayplutil/libcrayplutil.la \ \$(top_geom_builddir)/src/lib/geomutil/dim/libdim.la \ \$(top_geom_builddir)/src/lib/geomutil/plutil/libplutil.la \ \$(top_geom_builddir)/src/lib/gprim/bbox/libbbox.la \ \$(top_geom_builddir)/src/lib/gprim/bezier/libbezier.la \ \$(top_geom_builddir)/src/lib/gprim/comment/libcomment.la \ \$(top_geom_builddir)/src/lib/gprim/discgrp/libdg.la \ \$(top_geom_builddir)/src/lib/gprim/geom/libgeom.la \ \$(top_geom_builddir)/src/lib/gprim/inst/libinst.la \ \$(top_geom_builddir)/src/lib/gprim/lincoln/liblincoln.la \ \$(top_geom_builddir)/src/lib/gprim/list/liblist.la \ \$(top_geom_builddir)/src/lib/gprim/mesh/libmesh.la \ \$(top_geom_builddir)/src/lib/gprim/ndmesh/libndmesh.la \ \$(top_geom_builddir)/src/lib/gprim/npolylist/libnpolylist.la \ \$(top_geom_builddir)/src/lib/gprim/polylist/libpolylist.la \ \$(top_geom_builddir)/src/lib/gprim/quad/libquad.la \ \$(top_geom_builddir)/src/lib/gprim/skel/libskel.la \ \$(top_geom_builddir)/src/lib/gprim/sphere/libsphere.la \ \$(top_geom_builddir)/src/lib/gprim/tlist/libtlist.la \ \$(top_geom_builddir)/src/lib/gprim/vect/libvect.la \ \$(top_geom_builddir)/src/lib/mg/buf/liblibmgbuf.la \ \$(top_geom_builddir)/src/lib/mg/common/libmgcommon.la \ \$(top_geom_builddir)/src/lib/mg/ps/libmgps.la \ \$(top_geom_builddir)/src/lib/mg/rib/libmgrib.la \ \$(top_geom_builddir)/src/lib/pointlist/libpointlist.la \ \$(top_geom_builddir)/src/lib/shade/libshade.la \ \$(top_geom_builddir)/src/lib/window/libwindow.la \ \$(top_geom_builddir)/src/lib/geometry/cmodel/libcmodel.la \ \$(top_geom_builddir)/src/lib/geometry/point3/libpoint3.la \ \$(top_geom_builddir)/src/lib/geometry/transform3/libtransform3.la \ \$(top_geom_builddir)/src/lib/geometry/transformn/libtransformn.la \ \$(top_geom_builddir)/src/lib/geometry/transobj/libtransobj.la \ \$(top_geom_builddir)/src/lib/geometry/ntransobj/libntransobj.la \ \$(top_geom_builddir)/src/lib/oogl/lisp/liblisp.la \ \$(top_geom_builddir)/src/lib/oogl/refcomm/librefcomm.la \ \$(top_geom_builddir)/src/lib/oogl/util/libooglutil.la \ \$(top_geom_builddir)/src/lib/aclib/libacgeomview.la" if test "z${MGOPENGL}" = "z1"; then OOGLLIBS="${OOGLLIBS} \$(top_geom_builddir)/src/lib/mg/opengl/libmgopengl.la" fi if test "z${MGX11}" = "z1"; then OOGLLIBS="${OOGLLIBS} \$(top_geom_builddir)/src/lib/mg/x11/libmgx11.la" fi AC_CACHE_VAL(ac_cv_OOGLLIBS,[ac_cv_OOGLLIBS="OOGLLIBS='$OOGLLIBS'"]) AC_SUBST(OOGLLIBS) OOGLLIB='$(top_geom_builddir)/src/lib/libgeomview.la' AC_CACHE_VAL(ac_cv_OOGLLIB, [ac_cv_OOGLLIB="OOGLLIB='$OOGLLIB'"]) AC_SUBST(OOGLLIB) MOTIFUILIB='$(top_geom_builddir)/src/lib/mib/libmib.a' AC_CACHE_VAL(ac_cv_MOTIFUILIB, [ac_cv_MOTIFUILIB="MOTIFUILIB='$MOTIFUILIB'"]) AC_SUBST(MOTIFUILIB) STUBLIB="\$(top_builddir)/src/lib/gprim/stub/libstub.la" AC_SUBST(STUBLIB) ######################################################################## LF_LINK_HEADERS(src/lib/aclib \ src/lib/oogl/lisp \ src/lib/oogl/refcomm \ src/lib/oogl/util \ src/lib/oogl/wa \ src/lib/geometry/ \ src/lib/geometry/cmodel \ src/lib/geometry/hpoint3 \ src/lib/geometry/hpointn \ src/lib/geometry/point3 \ src/lib/geometry/transform3 \ src/lib/geometry/transformn \ src/lib/geometry/transobj \ src/lib/geometry/ntransobj \ src/lib/camera \ src/lib/color \ src/lib/fexpr \ src/lib/geomutil/bdy \ src/lib/geomutil/crayplutil \ src/lib/geomutil/dim \ src/lib/geomutil/plutil \ src/lib/gprim/bbox \ src/lib/gprim/bezier \ src/lib/gprim/comment \ src/lib/gprim/discgrp \ src/lib/gprim/geom \ src/lib/gprim/inst \ src/lib/gprim/lincoln \ src/lib/gprim/list \ src/lib/gprim/mesh \ src/lib/gprim/polylist \ src/lib/gprim/ndmesh \ src/lib/gprim/npolylist \ src/lib/gprim/quad \ src/lib/gprim/skel \ src/lib/gprim/sphere \ src/lib/gprim/stub \ src/lib/gprim/tlist \ src/lib/gprim/vect \ src/lib/mg/buf \ src/lib/mg/common \ src/lib/mg/opengl \ src/lib/mg/x11 \ src/lib/mg/ps \ src/lib/mg/rib \ src/lib/mib \ src/lib/pointlist \ src/lib/shade \ src/lib/window \ src/lib/forms \ src/bin/geomview/common \ ) LF_SET_INCLUDES AC_CONFIG_FILES([Makefile data/Makefile data/shaders/Makefile doc/Makefile src/Makefile src/lib/Makefile src/lib/aclib/Makefile src/lib/camera/Makefile src/lib/color/Makefile src/lib/fexpr/Makefile src/lib/oogl/Makefile src/lib/oogl/lisp/Makefile src/lib/oogl/refcomm/Makefile src/lib/oogl/util/Makefile src/lib/oogl/wa/Makefile src/lib/geometry/Makefile src/lib/geometry/cmodel/Makefile src/lib/geometry/hpoint3/Makefile src/lib/geometry/hpointn/Makefile src/lib/geometry/point3/Makefile src/lib/geometry/transform3/Makefile src/lib/geometry/transformn/Makefile src/lib/geometry/transobj/Makefile src/lib/geometry/ntransobj/Makefile src/lib/geomutil/Makefile src/lib/geomutil/bdy/Makefile src/lib/geomutil/crayplutil/Makefile src/lib/geomutil/dim/Makefile src/lib/geomutil/plutil/Makefile src/lib/gprim/Makefile src/lib/gprim/bbox/Makefile src/lib/gprim/bezier/Makefile src/lib/gprim/comment/Makefile src/lib/gprim/discgrp/Makefile src/lib/gprim/geom/Makefile src/lib/gprim/inst/Makefile src/lib/gprim/lincoln/Makefile src/lib/gprim/list/Makefile src/lib/gprim/mesh/Makefile src/lib/gprim/polylist/Makefile src/lib/gprim/ndmesh/Makefile src/lib/gprim/npolylist/Makefile src/lib/gprim/quad/Makefile src/lib/gprim/skel/Makefile src/lib/gprim/sphere/Makefile src/lib/gprim/stub/Makefile src/lib/gprim/tlist/Makefile src/lib/gprim/vect/Makefile src/lib/mg/Makefile src/lib/mg/buf/Makefile src/lib/mg/common/Makefile src/lib/mg/opengl/Makefile src/lib/mg/x11/Makefile src/lib/mg/ps/Makefile src/lib/mg/rib/Makefile src/lib/mib/Makefile src/lib/pointlist/Makefile src/lib/shade/Makefile src/lib/window/Makefile src/lib/forms/Makefile src/bin/Makefile src/bin/geomview/Makefile src/bin/geomview/common/Makefile src/bin/geomview/x11/Makefile src/bin/geomview/x11/bitmaps/Makefile src/bin/geomview/x11/interface/Makefile src/bin/animate/Makefile src/bin/animate/interface/Makefile src/bin/clipboard/Makefile src/bin/gvclock/gvclock src/bin/gvclock/Makefile src/bin/geomutil/Makefile src/bin/geomutil/bdy/Makefile src/bin/geomutil/clip/Makefile src/bin/geomutil/hvectext/Makefile src/bin/geomutil/hvectext/hvectext src/bin/geomutil/maple2oogl/Makefile src/bin/geomutil/math2oogl/Makefile src/bin/geomutil/oogl2rib/Makefile src/bin/geomutil/oogl2vrml/Makefile src/bin/geomutil/plutil/Makefile src/bin/geomutil/ucd/Makefile src/bin/geomutil/vrml2oogl/Makefile src/bin/geomutil/vrml2oogl/lib/Makefile src/bin/nose/Makefile src/bin/togeomview/Makefile ]) AC_OUTPUT geomview-1.9.5/aclocal.m40000644000175000017500000012565112310165547012147 00000000000000# generated automatically by aclocal 1.14.1 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' 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.14.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.14.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-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. 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. 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 Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_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-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/check-package.m4]) m4_include([m4/frameworks.m4]) m4_include([m4/geom_local.m4]) m4_include([m4/iso-c99.m4]) m4_include([m4/lf_local.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([m4/set-prefix.m4]) m4_include([m4/withtool.m4]) geomview-1.9.5/config.h.in0000644000175000017500000004636312310165551012327 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ #ifndef CONFIG_H_INCLUDED #define CONFIG_H_INCLUDED /* AIX requires this to be the first thing in the file. */ #ifndef __GNUC__ # if HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif #endif /* ACCEPT_ARG3_TYPE should be the datatype of the 3rd arg to the 'accept' system call. It's 'int' on some systems, 'unsigned long' on some, and could be something else on others. Default to int */ #undef ACCEPT_ARG3_TYPE /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* Define to 1 if we are compiling for AIX */ #undef AIX /* Define to 0 to use polar meshes for drawing of spheres */ #undef BEZIER_SPHERES /* Define to 1 if the `closedir' function returns void instead of `int'. */ #undef CLOSEDIR_VOID /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* D1 debugging? */ #undef D1_DEBUG /* Define to the name of the html browser for online viewing of the HTML manual. */ #undef DFLTHTMLBROWSER /* Define to the name of the html browser for online viewing of the PDF manual. */ #undef DFLTPDFVIEWER /* "Define to the root of the Geomview documentation" */ #undef DOCDIR /* Use experimental motion averaging code? */ #undef EXPERIMENTAL_MOTION_AVERAGING /* Define to path and arguments of shell used for file name globbing */ #undef GLOB_SHELL /* Define to 1 if you have the `accept' function. */ #undef HAVE_ACCEPT /* Define to 1 if you have the `acosh' function. */ #undef HAVE_ACOSH /* Define to 1 if you have the `alarm' function. */ #undef HAVE_ALARM /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the `basename' function. */ #undef HAVE_BASENAME /* Define to 1 if you have the `bcopy' function. */ #undef HAVE_BCOPY /* Define to 1 if you have the `bind' function. */ #undef HAVE_BIND /* Define to 1 if you have the `bzero' function. */ #undef HAVE_BZERO /* Define to 1 if you have the `compressBound' function. */ #undef HAVE_COMPRESSBOUND /* Define to 1 if you have the `connect' function. */ #undef HAVE_CONNECT /* Define to 1 if you have the declaration of `accept', and to 0 if you don't. */ #undef HAVE_DECL_ACCEPT /* Define to 1 if you have the declaration of `acosh', and to 0 if you don't. */ #undef HAVE_DECL_ACOSH /* Define to 1 if you have the declaration of `errno', and to 0 if you don't. */ #undef HAVE_DECL_ERRNO /* Define to 1 if you have the declaration of `fmemopen', and to 0 if you don't. */ #undef HAVE_DECL_FMEMOPEN /* Define to 1 if you have the declaration of `getopt', and to 0 if you don't. */ #undef HAVE_DECL_GETOPT /* Define to 1 if you have the declaration of `LC_ALL', and to 0 if you don't. */ #undef HAVE_DECL_LC_ALL /* Define to 1 if you have the declaration of `llseek', and to 0 if you don't. */ #undef HAVE_DECL_LLSEEK /* Define to 1 if you have the declaration of `lseek', and to 0 if you don't. */ #undef HAVE_DECL_LSEEK /* Define to 1 if you have the declaration of `lseek64', and to 0 if you don't. */ #undef HAVE_DECL_LSEEK64 /* Define to 1 if you have the declaration of `optarg', and to 0 if you don't. */ #undef HAVE_DECL_OPTARG /* Define to 1 if you have the declaration of `opterr', and to 0 if you don't. */ #undef HAVE_DECL_OPTERR /* Define to 1 if you have the declaration of `optind', and to 0 if you don't. */ #undef HAVE_DECL_OPTIND /* Define to 1 if you have the declaration of `optopt', and to 0 if you don't. */ #undef HAVE_DECL_OPTOPT /* Define to 1 if you have the declaration of `putenv', and to 0 if you don't. */ #undef HAVE_DECL_PUTENV /* Define to 1 if you have the declaration of `select', and to 0 if you don't. */ #undef HAVE_DECL_SELECT /* Define to 1 if you have the declaration of `strcasecmp', and to 0 if you don't. */ #undef HAVE_DECL_STRCASECMP /* Define to 1 if you have the declaration of `strdup', and to 0 if you don't. */ #undef HAVE_DECL_STRDUP /* Define to 1 if you have the declaration of `strncasecmp', and to 0 if you don't. */ #undef HAVE_DECL_STRNCASECMP /* Define to 1 if the system has the type `dev_t'. */ #undef HAVE_DEV_T /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the `dirname' function. */ #undef HAVE_DIRNAME /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the `dup2' function. */ #undef HAVE_DUP2 /* Define to 1 if you have the header file. */ #undef HAVE_ERRNO_H /* Define to 1 if you have the `fcntl' function. */ #undef HAVE_FCNTL /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `finite' function. */ #undef HAVE_FINITE /* Define to 1 if you have the `floor' function. */ #undef HAVE_FLOOR /* Define to 1 if you have the `fmemopen' function. */ #undef HAVE_FMEMOPEN /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* Define to 1 if you have the `fstat' function. */ #undef HAVE_FSTAT /* Define to 1 if you have the `gethostname' function. */ #undef HAVE_GETHOSTNAME /* Define to 1 if you have the `getopt' function. */ #undef HAVE_GETOPT /* Define to 1 if you have the header file. */ #undef HAVE_GETOPT_H /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the `glXCreateGLXPixmap' function. */ #undef HAVE_GLXCREATEGLXPIXMAP /* Define to 1 if IPv6 sockets are available */ #undef HAVE_INET6_SOCKETS /* Define to 1 if IPv4 sockets are available */ #undef HAVE_INET_SOCKETS /* Define to 1 if the system has the type `ino_t'. */ #undef HAVE_INO_T /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_IO_H /* Define to 1 if you have the `isascii' function. */ #undef HAVE_ISASCII /* Define to 1 if ISO C99 features are available (e.g. variadic macros and variable length arrays) */ #undef HAVE_ISO_C99 /* Define to 1 if you have the header file. */ #undef HAVE_LIBGEN_H /* Define to 1 if you have libGLU */ #undef HAVE_LIBGLU /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* Define to 1 if you have libz */ #undef HAVE_LIBZ /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the `listen' function. */ #undef HAVE_LISTEN /* Define to 1 if you have the `llseek' function. */ #undef HAVE_LLSEEK /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if the system has the type `loff_t'. */ #undef HAVE_LOFF_T /* Define to 1 if you have the `lseek' function. */ #undef HAVE_LSEEK /* Define to 1 if you have the `lseek64' function. */ #undef HAVE_LSEEK64 /* Define to 1 if you have the `lstat' function. */ #undef HAVE_LSTAT /* Define to 1 if `lstat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_LSTAT_EMPTY_STRING_BUG /* Define to 1 if you have the `mallinfo' function. */ #undef HAVE_MALLINFO /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MATH_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the `mkdir' function. */ #undef HAVE_MKDIR /* Define to 1 if M_PI is defined */ #undef HAVE_M_PI /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if libc includes obstacks. */ #undef HAVE_OBSTACK /* Define to 1 if the system has the type `off64_t'. */ #undef HAVE_OFF64_T /* Define to 1 if the system has the type `off_t'. */ #undef HAVE_OFF_T /* pamtotiff program */ #undef HAVE_PAMTOTIFF /* Define to 1 if you have the `popen' function. */ #undef HAVE_POPEN /* Define to 1 if you have the `pow' function. */ #undef HAVE_POW /* Define to 1 if you have the `putenv' function. */ #undef HAVE_PUTENV /* Define to 1 if you have the `read' function. */ #undef HAVE_READ /* Define to 1 if you have the `rint' function. */ #undef HAVE_RINT /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Define to 1 if the system has the type `socklen_t'. */ #undef HAVE_SOCKLEN_T /* Define to 1 if you have the `sqrt' function. */ #undef HAVE_SQRT /* Define to 1 if you have the `stat' function. */ #undef HAVE_STAT /* Define to 1 if `stat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_STAT_EMPTY_STRING_BUG /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strcspn' function. */ #undef HAVE_STRCSPN /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strncasecmp' function. */ #undef HAVE_STRNCASECMP /* Define to 1 if you have the `strpbrk' function. */ #undef HAVE_STRPBRK /* Define to 1 if you have the `strrchr' function. */ #undef HAVE_STRRCHR /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the `sysinfo' function. */ #undef HAVE_SYSINFO /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILE_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSTEMINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if the system has the type `time_t'. */ #undef HAVE_TIME_T /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if Unix domain sockets are available */ #undef HAVE_UNIX_SOCKETS /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if you have the `vfscanf' function. */ #undef HAVE_VFSCANF /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define to 1 if you have the `wait3' function. */ #undef HAVE_WAIT3 /* Define to 1 if you have the `waitpid' function. */ #undef HAVE_WAITPID /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Define to 1 if you have the `write' function. */ #undef HAVE_WRITE /* Does -lXmu exist on this system? */ #undef HAVE_XMU /* Define to 1 if you have the header file. */ #undef HAVE_ZLIB_H /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to 1 if `lstat' dereferences a symlink specified with a trailing slash. */ #undef LSTAT_FOLLOWS_SLASHED_SYMLINK /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Define to the machine type */ #undef MACHTYPE /* Define to 1 if your are using the Mesa OpenGL implementation */ #undef MESAGL /* Leave this at 0 */ #undef MGGL /* Define to 1 if OpenGL (or Mesa or anything equivalent) is available and should be used for rendering */ #undef MGOPENGL /* Define to 1 if all rendering should be performed through the X library (i.e. no accelerated 3D rendering, no textures) */ #undef MGX11 /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if popen(CMD, MODE) accepts "rb" for MODE */ #undef POPEN_ACCEPTS_RB /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* Define to the type of arg 1 for `select'. */ #undef SELECT_TYPE_ARG1 /* Define to the type of args 2, 3 and 4 for `select'. */ #undef SELECT_TYPE_ARG234 /* Define to the type of arg 5 for `select'. */ #undef SELECT_TYPE_ARG5 /* Define to 1 if the `setpgrp' function takes no argument. */ #undef SETPGRP_VOID /* The size of `dev_t', as computed by sizeof. */ #undef SIZEOF_DEV_T /* The size of `ino_t', as computed by sizeof. */ #undef SIZEOF_INO_T /* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG /* The size of `time_t', as computed by sizeof. */ #undef SIZEOF_TIME_T /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* Version number of package */ #undef VERSION /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a `char[]'. */ #undef YYTEXT_POINTER /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to `int' if does not define. */ #undef pid_t /* Define to 1 if we are compiling for sgi */ #undef sgi /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to 1 if we are compiling for unix??? */ #undef unix /* Define as `fork' if `vfork' does not work. */ #undef vfork #if D1_DEBUG #define D1PRINT(args) printf args #else #define D1PRINT(args) #endif #define _FILE_OFFSET_BITS 64 #define _LARGEFILE64_SOURCE #if !HAVE_WORKING_FORK # error FIXME! We need fork() #endif #if !HAVE_LSTAT || \ !LSTAT_FOLLOWS_SLASHED_SYMLINK || \ HAVE_LSTAT_EMPTY_STRING_BUG # define lstat(path, buf) gv_lstat(path, buf) #endif #if !HAVE_STAT || HAVE_STAT_EMPTY_STRING_BUG # define stat(path, buf) gv_stat(path, buf) # define fstat(fd, buf) gv_fstat(fd, buf) #endif #if HAVE_MATH_H # include #endif #ifdef isfinite # ifdef finite # undef finite # endif # define finite(x) isfinite(x) #endif #ifdef HAVE_STDBOOL_H # include #else # ifndef HAVE__BOOL # ifdef __cplusplus typedef bool _Bool; # else # define _Bool signed char # endif # endif # define bool _Bool # define false 0 # define true 1 # define __bool_true_false_are_defined 1 #endif /* make sure we have PATH_MAX */ #if HAVE_LIMITS_H # include #endif #if HAVE_SYS_PARAM # include #endif #ifndef PATH_MAX # ifndef _POSIX_PATH_MAX # ifndef MAXPATHLEN # define PATH_MAX 4096 # else # define PATH_MAX MAXPATHLEN # endif # else # define PATH_MAX _POSIX_PATH_MAX # endif #endif #if HAVE_ISO_C99 # define VARARRAY(name, type, len) type name[len] # define VARARRAY2(name, type, len1, len2) type name[len1][len2] #else # define VARARRAY(name, type, len) type *name = alloca((len)*sizeof(type)) # define VARARRAY2(name, type, len1, len2) \ type (*name)[len2] = alloca((len1)*(len2)*sizeof(type)) #endif #if 0 #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #undef malloc #undef free #undef realloc #undef calloc #undef strdup extern void *malloc_record(size_t size, const char *file, const char *func, int line); extern void *realloc_record(void *ptr, size_t size, const char *file, const char *func, int line); extern void *calloc_record(size_t nmemb, size_t size, const char *file, const char *func, int line); extern char *strdup_record(const char *string, const char *file, const char *func, int line); extern void free_record(void *ptr); #define malloc(size) malloc_record(size, __FILE__, __FUNCTION__, __LINE__) #define realloc(ptr, size) realloc_record(ptr, size, __FILE__, __FUNCTION__, __LINE__) #define calloc(nmemb, size) calloc_record(nmemb, size, __FILE__, __FUNCTION__, __LINE__) #define strdup(str) strdup_record(str, __FILE__, __FUNCTION__, __LINE__) #define free(ptr) free_record(ptr) #define OOG_NewP(size) malloc(size) #define OOG_RenewP(p, size) realloc(p, size) #define OOG_NewE(size, blah) malloc(size) #define OOG_RenewE(p, size, blah) realloc(p, size) #define OOGLFree(p) free(p) #endif #endif /* CONFIG_H_INCLUDED */ geomview-1.9.5/mkinstalldirs0000755000175000017500000000672212310165555013111 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2009-04-28.21; # UTC # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' IFS=" "" $nl" errstatus=0 dirmode= usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit $? ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit $? ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the 'mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because '.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac for file do case $file in /*) pathcomp=/ ;; *) pathcomp= ;; esac oIFS=$IFS IFS=/ set fnord $file shift IFS=$oIFS for d do test "x$d" = x && continue pathcomp=$pathcomp$d case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr= chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp=$pathcomp/ done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: geomview-1.9.5/COPYING0000644000175000017500000006006412310110201011307 00000000000000GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provy at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used foobject code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library alreser has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distrib not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBR It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the library's name and an idea of what it does. Copyright (C) year name of author This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. signature of Ty Coon, 1 April 1990 Ty Coon, President of Vice That's all there is to it! geomview-1.9.5/TODO0000644000175000017500000000020312310110201010731 00000000000000* adjust the format for oogl.5gv * update example2.c, example3.c and example4.tcl * Font code translations. ? Use .po or .ts files?geomview-1.9.5/compile0000755000175000017500000001624512310165551011656 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: geomview-1.9.5/config.guess0000755000175000017500000012425712310165551012623 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-02-12' # 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. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/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 ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -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 # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) eval $set_cc_for_build X86_64_ABI= # If there is a compiler, see if it is configured for 32-bit objects. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_X32 >/dev/null then X86_64_ABI=x32 fi fi echo x86_64-unknown-linux-gnu${X86_64_ABI} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: geomview-1.9.5/config.sub0000755000175000017500000010577012310165551012265 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-01-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx | dvp \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mipsEE* | ee | ps2) basic_machine=mips64r5900el-scei case $os in -linux*) ;; *) os=-elf ;; esac ;; iop) basic_machine=mipsel-scei os=-irx ;; dvp) basic_machine=dvp-scei os=-elf ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* | -irx* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: geomview-1.9.5/depcomp0000755000175000017500000005601612310165555011661 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: geomview-1.9.5/install-sh0000755000175000017500000003325512310165551012304 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: geomview-1.9.5/missing0000755000175000017500000001533012310165551011671 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the '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 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: geomview-1.9.5/ltmain.sh0000644000175000017500000105152212310165543012117 00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 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. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.2 TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 geomview-1.9.5/reconf0000754000175000017500000000004312310110201011444 00000000000000#! /bin/sh -x autoreconf -i "$@" geomview-1.9.5/geomview.sh0000755000175000017500000000740712310110201012437 00000000000000#! /bin/sh # geomview shell script driver if test -x %GEOMVIEW_LTGVX%; then GEOMVIEW_GVX=%GEOMVIEW_LTGVX% else GEOMVIEW_GVX=%GEOMVIEW_GVX% fi ######################################################################## # # DO NOT CHANGE ANYTHING BELOW HERE # # ######################################################################## %LD_LIBRARY_PATH_SETTINGS% export LD_LIBRARY_PATH # Really necessary? export LC_NUMERIC="POSIX" ### Geomview and/or its modules use the following environment ### variables. For each of these that does not already have a value, ### this shell script assigns a value based on the setting of ### geomview_dir above. You can override these values if you want by ### setting them in your shell environment before invoking this ### script. ### ### GEOMVIEW_GVX: pathname of executable file "gvx" ### GEOMVIEW_LOAD_PATH: colon-separated list of directories to search ### for files ### GEOMVIEW_EMODULE_PATH: colon-separated list of directories to search ### for modules ### GEOMVIEW_SYSTEM_INITFILE: pathname of an initialization file to ### read upon startup ### GEOMDATA: [ used only by some modules; for backward compatibility ] ### pathname of the data directory MACHTYPE=%MACHTYPE% suf= : ${GEOMROOT=%GEOMROOT%} : ${GEOMDATA=%GEOMDATA%} : ${GEOMVIEW_DATA_DIR=%GEOMDATA%} : ${GEOMVIEW_LOAD_PATH=.:${GEOMDATA}/geom:${GEOMDATA}} : ${GEOMVIEW_EMODULE_DIR=%MODULESDIR%} : ${GEOMVIEW_EMODULE_PATH=${HOME}:${GEOMVIEW_EMODULE_DIR}} : ${GEOMVIEW_SYSTEM_INITFILE=${GEOMDATA}/.geomview} : ${GEOMVIEW_DOC_DIR=%GEOMDOCDIR%} export GEOMVIEW_GVX GEOMVIEW_LOAD_PATH GEOMVIEW_DATA_DIR GEOMDATA export GEOMVIEW_EMODULE_PATH GEOMVIEW_EMODULE_DIR export GEOMVIEW_SYSTEM_INITFILE export GEOMVIEW_DOC_DIR if [ -d /cygdrive ]; then TCL_LIBRARY=/usr/share/tcl8.4 TK_LIBRARY=/usr/share/tk8.4 export TCL_LIBRARY TK_LIBRARY fi gvx="${GEOMVIEW_GVX}" case "$gvx" in *gvx.[a-zA-Z3]) gvx="`expr match \"${GEOMVIEW_GVX}\" '(.*)\.[^./]*' \| \"${GEOMVIEW_GVX}\"`" ;; esac if [ -f "$gvx$suf" ]; then GEOMVIEW_GVX="$gvx$suf" elif [ -f "$gvx$suf2" ]; then GEOMVIEW_GVX="$gvx$suf2" elif [ -f "$gvx" ]; then GEOMVIEW_GVX="$gvx" fi export GEOMVIEW_GVX case "$1" in -dbx) GEOMVIEW_DEBUG=1 exec dbx ${GEOMVIEW_GVX} ;; -edge) GEOMVIEW_DEBUG=1 exec edge ${GEOMVIEW_GVX} ;; -gdb) GEOMVIEW_DEBUG=1 exec gdb ${GEOMVIEW_GVX} ;; -xdb) GEOMVIEW_DEBUG=1 exec xdb ${GEOMVIEW_GVX} ;; -ddd) GEOMVIEW_DEBUG=1 exec ddd ${GEOMVIEW_GVX} ;; -h|--help) cat < (e.g. /usr/X11R6). In this case, the following switches are needed: ./configure --with-motif=/usr/X11R6 --with-opengl=/usr/X11R6 OTHERSWICHES Mac OS X -------- Reported by Raphael Straub: X11 (on the Mac OS X Install DVD) and the X11SDK (part of the Xcode Developer Tools) must be installed before Geomview can be compiled. OpenMotif or Lesstif can be manually compiled from source or installed with a package manager like Fink (http://www.finkproject.org/) or MacPorts (http://www.macports.org/). Both package managers also provide their own Geomview package. On Mac OS X 10.5 please execute the following line before running configure (see: http://developer.apple.com/qa/qa2007/qa1567.html) export LDFLAGS="-dylib_file \ /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:\ /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib" In most cases Geomview can be configured with ./configure --with-opengl=/usr/X11R6 --with-htmlbrowser=open \ --with-pdfviewer=open \ --with-motif=/path/to/your/motif/installation This enables OpenGL support and uses your default HTML browser and PDF viewer for viewing the Geomview documentation. geomview-1.9.5/mkmodulesdir0000755000175000017500000000154612310110201012701 00000000000000#! /bin/sh # usage: mkmodulesdir ROOT # where ROOT is the pathname (can be relative) of the geomview source tree MODULES="$1/modules" if test -d $MODULES ; then : else mkdir $MODULES fi cat > $MODULES/README <&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@ target_triplet = @target@ subdir = src DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(bindir)" SCRIPTS = $(bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir 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 DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = lib bin bin_SCRIPTS = geomview CLEANFILES = geomview all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; 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 \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | 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; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$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_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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" cscopelist: cscopelist-recursive 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(SCRIPTS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binSCRIPTS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binSCRIPTS .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binSCRIPTS install-data \ install-data-am 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 installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binSCRIPTS geomview: $(top_srcdir)/geomview.sh Makefile sed -e 's|%GEOMROOT%|$(prefix)|g' \ -e 's|%GEOMVIEW_GVX%|$(moduledir)/gvx|g' \ -e 's|%MACHTYPE%|$(MACHTYPE)|g' \ -e 's|%GEOMDATA%|$(geomdatadir)|g' \ -e 's|%MODULESDIR%|$(moduledir)|g' \ -e "s|%LD_LIBRARY_PATH_SETTINGS%|$(LD_LIBRARY_PATH_SETTINGS)|" \ -e "s|%GEOMVIEW_LIB%|$(libdir)|g" \ -e "s|%GEOMVIEW_INCLUDE%|$(pkgincludedir)|g" \ -e "s|%PACKAGE_VERSION%|$(PACKAGE_VERSION)|g" \ -e "s|%GEOMDOCDIR%|$(docdir)|g" \ < $(top_srcdir)/geomview.sh > geomview chmod +x geomview # 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: geomview-1.9.5/src/Makefile.am0000644000175000017500000000142112310110201013067 00000000000000SUBDIRS = lib bin bin_SCRIPTS = geomview CLEANFILES = geomview geomview: $(top_srcdir)/geomview.sh Makefile sed -e 's|%GEOMROOT%|$(prefix)|g' \ -e 's|%GEOMVIEW_GVX%|$(moduledir)/gvx|g' \ -e 's|%MACHTYPE%|$(MACHTYPE)|g' \ -e 's|%GEOMDATA%|$(geomdatadir)|g' \ -e 's|%MODULESDIR%|$(moduledir)|g' \ -e "s|%LD_LIBRARY_PATH_SETTINGS%|$(LD_LIBRARY_PATH_SETTINGS)|" \ -e "s|%GEOMVIEW_LIB%|$(libdir)|g" \ -e "s|%GEOMVIEW_INCLUDE%|$(pkgincludedir)|g" \ -e "s|%PACKAGE_VERSION%|$(PACKAGE_VERSION)|g" \ -e "s|%GEOMDOCDIR%|$(docdir)|g" \ < $(top_srcdir)/geomview.sh > geomview chmod +x geomview geomview-1.9.5/src/lib/0000755000175000017500000000000012310165603011703 500000000000000geomview-1.9.5/src/lib/Makefile.in0000644000175000017500000006177212310165552013710 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = am_libgeomview_la_OBJECTS = libgeomview_la_OBJECTS = $(am_libgeomview_la_OBJECTS) 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 = libgeomview_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libgeomview_la_LDFLAGS) $(LDFLAGS) -o \ $@ @INSTALL_LIBGEOMVIEW_FALSE@am_libgeomview_la_rpath = @INSTALL_LIBGEOMVIEW_TRUE@am_libgeomview_la_rpath = -rpath $(libdir) 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@ -I$(top_builddir) COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgeomview_la_SOURCES) DIST_SOURCES = $(libgeomview_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir 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 DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = geometry camera color oogl shade window gprim fexpr geomutil \ pointlist mg mib forms aclib @INSTALL_LIBGEOMVIEW_TRUE@lib_LTLIBRARIES = libgeomview.la @INSTALL_LIBGEOMVIEW_FALSE@noinst_LTLIBRARIES = libgeomview.la libgeomview_la_SOURCES = libgeomview_la_LIBADD = \ $(OOGLLIBS) $(OPENGLLIBS) $(SOCKETLIBS) $(XLIBS) $(ZLIB_LIB) libgeomview_la_DEPENDENCIES = $(OOGLLIBS) Makefile.am libgeomview_la_LDFLAGS = -release @PACKAGE_VERSION@ all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgeomview.la: $(libgeomview_la_OBJECTS) $(libgeomview_la_DEPENDENCIES) $(EXTRA_libgeomview_la_DEPENDENCIES) $(AM_V_CCLD)$(libgeomview_la_LINK) $(am_libgeomview_la_rpath) $(libgeomview_la_OBJECTS) $(libgeomview_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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" cscopelist: cscopelist-recursive 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libLTLIBRARIES \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-libLTLIBRARIES # 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: geomview-1.9.5/src/lib/Makefile.am0000644000175000017500000000065312310110201013643 00000000000000SUBDIRS = geometry camera color oogl shade window gprim fexpr geomutil \ pointlist mg mib forms aclib if INSTALL_LIBGEOMVIEW lib_LTLIBRARIES = libgeomview.la else noinst_LTLIBRARIES = libgeomview.la endif libgeomview_la_SOURCES = libgeomview_la_LIBADD = \ $(OOGLLIBS) $(OPENGLLIBS) $(SOCKETLIBS) $(XLIBS) $(ZLIB_LIB) libgeomview_la_DEPENDENCIES = $(OOGLLIBS) Makefile.am libgeomview_la_LDFLAGS = -release @PACKAGE_VERSION@ geomview-1.9.5/src/lib/ChangeLog0000644000175000017500000000423712310110201013363 000000000000002006-07-31 Steve M. Robbins * gprim/geom/knownclass.c: In list of function prototypes, fix bug arising from the fact that the "*" in C attaches to the declarator rather than the type. Patch from Karl Chen (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=366381). * oogl/util/ooglutil.h: Remove declaration of fmemopen(), as it is already in porting.h, included by this header. 2002-10-26 Steve M. Robbins * oogl/util/futil.c: Add defined(__CYGWIN__) to __FreeBSD__ version of stdio buffer fields. * oogl/util/error.c (sperrno): Add !defined(__CYGWIN__) to list of conditions. * oogl/lisp/lisp.c (ulongpull): Use "unsigned long" (not ulong) as second argument. 2002-04-13 Steve M. Robbins * mg/opengl/mgopenglshade.c: Update the declarations for glBindTextureEXT and glDeleteTexturesEXT. * fexpr/real.c: Use variables to compute 0/0. * gprim/geom/geomstream.c: * mg/common/mgtexture.c: * oogl/util/findfile.c: * oogl/util/glob.c: Add __unix__ to list of CPP symbols used to detect unix systems. * oogl/refcomm/handleP.h: Include . * shade/appearance.c: Bugfix; variable 'c' was used uninitialized. 2001-03-21 Steve M. Robbins * mib/mibToggle.c (mib_create_Toggle, mib_load_Toggle): * mib/mibload.c (mib_load_public, mib_reset_size): Set width and height only if non-zero. 2001-02-17 Steve Robbins * oogl/util/futil.c: Use WORDS_BIGENDIAN instead of old BIG_ENDIAN; the latter is defined on some linux machines, even little-endian ones. Clean code a bit to placate "gcc -Wall". * oogl/util/glibglue.C: Convert FILE* to istdiostream class from which we obtain the rdbuf structure that can set and seek to marks. 2000-11-05 Steve Robbins * oogl/lisp/Makefile.am (BUILT_SOURCES): Declare clisp.c and clisp.h. 2000-10-29 Steve Robbins * oogl/lisp/Makefile.am (clisp.c): * oogl/wa/Makefile.am (wa.yacc.c, wa.lex.c): * fexpr/Makefile.am (parse.tab.c): Use $srcdir to refer to files in the source hierarchy. geomview-1.9.5/src/lib/geometry/0000755000175000017500000000000012310165601013534 500000000000000geomview-1.9.5/src/lib/geometry/Makefile.in0000644000175000017500000004751712310165553015545 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir 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 DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = cmodel hpoint3 hpointn point3 transform3 transformn transobj ntransobj EXTRA_DIST = Headers geomtypes.h all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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" cscopelist: cscopelist-recursive 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am 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 \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/geometry/Makefile.am0000644000175000017500000000016412310110200015472 00000000000000SUBDIRS = cmodel hpoint3 hpointn point3 transform3 transformn transobj ntransobj EXTRA_DIST = Headers geomtypes.h geomview-1.9.5/src/lib/geometry/Headers0000644000175000017500000000001412310110200014726 00000000000000geomtypes.h geomview-1.9.5/src/lib/geometry/geomtypes.h0000644000175000017500000000606612310110200015632 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* geometric types, the include structure of the various * [h]point[3n].h etc. files is a little bit complicated, so I have * separated the typedefs from the function definitions. This way we * can use inline functions easily. This file may be included multiple * times. */ #ifndef HG4TENSOR_TYPEDEF # define HG4TENSOR_TYPEDEF 1 typedef float Hg4Coord; typedef Hg4Coord Hg4Tensor1[4]; typedef Hg4Coord *Hg4Tensor1Ptr; typedef Hg4Coord Hg4Tensor2[4][4]; typedef Hg4Tensor1 *Hg4Tensor2Ptr; #endif #ifndef POINT3_TYPEDEF # define POINT3_TYPEDEF typedef float Pt3Coord; typedef struct { Pt3Coord x, y, z; } Point3; #endif #ifndef HPOINT3_TYPEDEF # define HPOINT3_TYPEDEF 1 typedef Pt3Coord HPt3Coord; typedef struct { HPt3Coord x, y, z, w; } HPoint3; static inline Point3 *HPoint3Point3(HPoint3 *hpt3) { typedef union { HPt3Coord array[4]; HPoint3 hpt3; Point3 pt3; } HPoint3Cast; return &((HPoint3Cast *)hpt3)->pt3; } static inline HPt3Coord *HPoint3Data(HPoint3 *hpt3) { typedef union { HPt3Coord array[4]; HPoint3 hpt3; Point3 pt3; } HPoint3Cast; return ((HPoint3Cast *)hpt3)->array; } #endif #ifndef TRANSFORM3_TYPEDEF # define TRANSFORM3_TYPEDEF 1 typedef float Tm3Coord; typedef Tm3Coord Transform3[4][4]; typedef Tm3Coord (*TransformPtr)[4]; #endif #ifndef HPLANE3_TYPEDEF # define HPLANE3_TYPEDEF 1 typedef float HPl3Coord; typedef struct { HPl3Coord a, b, c, d; } HPlane3; #endif #ifndef HLINE3_TYPEDEF # define HLINE3_TYPEDEF 1 typedef float HLn3Coord; typedef struct { HLn3Coord L[4][4]; int type; } HLine3; #endif #ifndef HPOINTN_TYPEDEF # define HPOINTN_TYPEDEF 1 typedef float HPtNCoord; typedef struct HPtN { int dim; /* Dimension, including homogeneous divisor */ int flags; /* Space tag */ int size; /* allocated size */ HPtNCoord *v; /* Array of coordinates; v[0] is the homogenous divisor */ } HPointN; #endif #ifndef TRANSFORMN_TYPEDEF # define TRANSFORMN_TYPEDEF 1 /* N-dimensional transformation matrix. * Transforms row vectors (multiplied on the left) of dimension 'idim', * yielding row vectors of dimension 'odim'. */ #include "reference.h" typedef struct TmN { REFERENCEFIELDS; int idim, odim; int flags; HPtNCoord *a; /* Array of idim rows, odim columns */ } TransformN; #endif geomview-1.9.5/src/lib/geometry/cmodel/0000755000175000017500000000000012310165601014777 500000000000000geomview-1.9.5/src/lib/geometry/cmodel/Makefile.in0000644000175000017500000004622612310165553017004 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry/cmodel DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libcmodel_la_LIBADD = am_libcmodel_la_OBJECTS = cm_geometry.lo cmodel.lo cmodel_data.lo libcmodel_la_OBJECTS = $(am_libcmodel_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libcmodel_la_SOURCES) DIST_SOURCES = $(libcmodel_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcmodel.la libcmodel_la_SOURCES = cm_geometry.c cmodel.c cmodel_data.c cmodel.h cmodelP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/cmodel/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/cmodel/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libcmodel.la: $(libcmodel_la_OBJECTS) $(libcmodel_la_DEPENDENCIES) $(EXTRA_libcmodel_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libcmodel_la_OBJECTS) $(libcmodel_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cm_geometry.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmodel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmodel_data.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/geometry/cmodel/Makefile.am0000644000175000017500000000025012310110200016731 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcmodel.la libcmodel_la_SOURCES = cm_geometry.c cmodel.c cmodel_data.c cmodel.h cmodelP.h geomview-1.9.5/src/lib/geometry/cmodel/cm_geometry.c0000644000175000017500000001177312310110200017367 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* do the actual geometric computation parts of the "cmodel" program */ #include #include "cmodelP.h" void projective_to_conformal(int curv, HPoint3 *proj, Transform T, Point3 *conf) { double norm, scale; HPoint3 pt; HPt3Transform(T, proj, &pt); norm = pt.x*pt.x + pt.y*pt.y + pt.z*pt.z; if (curv) { norm = curv*norm + pt.w*pt.w; norm = (norm < 0)? 0 : sqrt(norm); scale = pt.w-curv*norm; } else scale = -norm/pt.w; Pt3Mul(1 / scale, HPoint3Point3(&pt), conf); return; } void TgtTransform(Transform T, HPoint3 *p, Point3 *v, HPoint3 *tp, Point3 *tv) { HPoint3 hv, thv; Pt3Copy(v, HPoint3Point3(&hv)); hv.w = 0; HPt3Transform(T, p, tp); HPt3Transform(T, &hv, &thv); Pt3Comb(1/tp->w, HPoint3Point3(&thv), -thv.w/tp->w/tp->w, (Point3 *)(void *)tp, tv); return; } /* map a tangent vector from Projective model to Conformal model */ void projective_vector_to_conformal(int curv, HPoint3 *pt, Point3 *v, Transform T, Point3 *ppt, Point3 *pv) { HPoint3 tp; Point3 tv; double norm,scale; /* transform point */ TgtTransform(T, pt, v, &tp, &tv); norm = tp.x*tp.x + tp.y*tp.y + tp.z*tp.z; if (curv) { norm = curv*norm + tp.w*tp.w; norm = (norm < 0)? 0 : sqrt(norm); scale = tp.w-curv*norm; } else scale = -norm/tp.w; Pt3Mul(1 / scale, HPoint3Point3(&tp), ppt); if (curv) Pt3Comb(norm/scale, &tv, Pt3Dot(ppt, &tv), ppt, pv); else Pt3Comb(tp.w/scale, &tv, 2*Pt3Dot(ppt, &tv), ppt, pv); Pt3Unit(pv); return; } /* given three vertices of a triangle in the conformal model this computes the center of the sphere on which the triangle lies. */ void triangle_polar_point(int curv, const Point3 *a, const Point3 *b, const Point3 *c, HPoint3 *p) { Point3 ab, bc, ca; Pt3Cross(a, b, &ab); Pt3Cross(b, c, &bc); Pt3Cross(c, a, &ca); p->w = 2*Pt3Dot(a, &bc); Pt3Mul(Pt3Dot(a, a) - curv, &bc, &bc); Pt3Mul(Pt3Dot(b, b) - curv, &ca, &ca); Pt3Mul(Pt3Dot(c, c) - curv, &ab, &ab); Pt3Add(&ab, &bc, (Point3 *)p); Pt3Add(&ca, (Point3 *)p, (Point3 *)p); /*fprintf(stderr,"In triangle_polar got %f %f %f %f\n",p->x,p->y,p->z,p->w);*/ return; } /* given two points on a geodesic in the conformal model this computes the centre of the euclidean circle formed by the geodesic */ void edge_polar_point(int curv, const Point3 *a, const Point3 *b, HPoint3 *p) { double aa, ab, bb, ca, cb; aa = Pt3Dot(a, a); ab = Pt3Dot(a, b); bb = Pt3Dot(b, b); ca = (aa-ab)*bb + curv*(ab - bb); cb = (bb-ab)*aa + curv*(ab - aa); Pt3Comb(ca, a, cb, b, (Point3 *)p); p->w = 2 * (aa * bb - ab * ab); return; } struct vertex *edge_split(struct edge *e, double cosmaxbend) { double cosbend, w; Point3 m, mp, x, y, *a, *b, p; double aa,ab,bb,ma,mb; a = (Point3 *)(void *)&e->v1->V.pt; b = (Point3 *)(void *)&e->v2->V.pt; w = e->polar.w; /*fprintf(stderr,"In edge_split\n");*/ if (w < .001) return NULL; Pt3Mul(1./w, (Point3 *)(void *)&e->polar, &p); Pt3Sub(a, &p, &x); Pt3Sub(b, &p, &y); cosbend = Pt3Dot(&x,&y)/sqrt(Pt3Dot(&x,&x) * Pt3Dot(&y,&y)); if (cosmaxbend < cosbend) return NULL; /*fprintf(stderr,"end pts %f %f %f, %f %f %f, polar %f %f %f %f\n", a->x,a->y,a->z, b->x,b->y,b->z, e->polar.x,e->polar.y,e->polar.z,e->polar.w);*/ Pt3Add(&x, &y, &m); Pt3Mul(sqrt(Pt3Dot(&x, &x) / Pt3Dot(&m, &m)), &m, &m); Pt3Add(&p, &m, &mp); aa = Pt3Dot(a,a); ab = Pt3Dot(a,b); bb = Pt3Dot(b,b); ma = Pt3Dot(a,&mp); mb = Pt3Dot(b,&mp); if (aa*mb < ab*ma || bb*ma < ab*mb) Pt3Sub(&p,&m,&mp); /* to check we're doing the right thing we could do: ma = Pt3Dot(a,&mp); mb = Pt3Dot(b,&mp); if (aa*mb < ab*ma || bb*ma < ab*mb) fprintf(stderr,"Can't find right subdivision\n"); */ return new_vertex(&mp, e->v1, e->v2); } geomview-1.9.5/src/lib/geometry/cmodel/cmodel.c0000644000175000017500000004076512310110200016323 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* conformal model graphics for geomview */ #include #include "cmodelP.h" #include "mgP.h" static int cm_show_subdivision = 0; static int cm_maxrefine = 6; /*static double cm_cosmaxbend = .95;*/ static double cm_cosmaxbend = .98; static int alldone = TRUE; static int curv; struct vertex *edge_start(struct edge *e, int ori); void split_triangle(struct triangle *t); void split_edge(struct edge *e, splitfunc split); void refine_once(splitfunc split); void refine(); struct edge *new_edge_p(struct vertex *v1, struct vertex *v2); void make_new_quad(Transform T, HPoint3 *p, ColorA *c); void make_new_triangle(HPoint3 *a, HPoint3 *b, HPoint3 *c, ColorA *col, Transform T, Poly *p, int allvisible); void set_cm_refine(double cm_cmb, int cm_mr, int cm_ss) { /* These tests allow us to call this routine in a way that sets only some of the values; parameters with out-of-range values are not set. */ if (cm_cmb >= -1 && cm_cmb <=1) cm_cosmaxbend = cm_cmb; if (cm_mr >=0) cm_maxrefine = cm_mr; if (cm_mr >=0) cm_show_subdivision = cm_ss; return; } void cmodel_clear(int space) { static int initialized = FALSE; if (initialized) { clear_all_vertexs(); clear_all_edges(); clear_all_triangles(); } else { initialize_vertexs(); initialize_edges(); initialize_triangles(); initialized = TRUE; } if (space & TM_SPHERICAL) curv = 1; else if (space & TM_HYPERBOLIC) curv = -1; else if (space & TM_EUCLIDEAN) curv = 0; /* else error */ } void cm_read_quad(Quad *q) { int i = q->maxquad; QuadP *qp = q->p; QuadC *qc = q->c; Transform T; mggettransform(T); if (q->geomflags & QUAD_C) { while (i-- > 0) make_new_quad(T, (HPoint3 *)qp++, (ColorA *)qc++); } else { while (i-- > 0) make_new_quad(T, (HPoint3 *)qp++, NULL); } return; } void make_new_quad(Transform T, HPoint3 *p, ColorA *c) { HPoint3 tp, polar; int i; struct vertex *v[4]; struct edge *e1, *e2, *e3, *e4, *e5; int apflags = _mgc->astk->ap.flag; if ((apflags & (APF_EDGEDRAW | APF_FACEDRAW | APF_NORMALDRAW)) == 0) return; /* make 4 new vertices */ tp.w = 1.; if (c) { /* vertex colors defined */ for (i = 0; i < 4; i++) { projective_to_conformal(curv, p++, T, (Point3 *)(void *)&tp); v[i] = simple_new_vertex(&tp, c++); } } else { /* no vertex colors so get color from appearance stack */ c = (ColorA*)&_mgc->astk->ap.mat->diffuse; for (i = 0; i < 4; i++) { projective_to_conformal(curv, p++, T, (Point3 *)(void *)&tp); v[i] = simple_new_vertex(&tp, c); } } triangle_polar_point(curv, (Point3 *)(void *)&v[0]->V.pt, (Point3 *)(void *)&v[1]->V.pt, (Point3 *)(void *)&v[2]->V.pt, &polar); for (i=0; i<4; i++) v[i]->polar = polar; e1 = new_edge_p(v[0], v[1]); e2 = new_edge_p(v[1], v[2]); e4 = new_edge_p(v[2], v[3]); e5 = new_edge_p(v[3], v[0]); if (apflags & (APF_FACEDRAW|APF_NORMALDRAW)) { /* make two triangles and five edges */ new_triangle(e1, e2, e3 = new_edge_p(v[2], v[0]), TRUE, TRUE, TRUE, NULL); new_triangle(e3, e4, e5, FALSE, TRUE, TRUE, NULL); } /* set the four original edges visible if required */ if (apflags & APF_EDGEDRAW) { e1->visible = TRUE; e2->visible = TRUE; e4->visible = TRUE; e5->visible = TRUE; } return; } void cm_draw_mesh(Mesh *m) { HPoint3 *pt, *newpt, *ppt; Point3 *n, *newn, *pn; ColorA *c = NULL, *newc = NULL, *pc = NULL; mgshadefunc shader = _mgc->astk->shader; int i, npt; Transform T; mggettransform(T); mgpushtransform(); mgidentity(); npt = m->nu * m->nv; pt = m->p; n = m->n; newpt = ppt = OOGLNewNE(HPoint3, npt, "CModel mesh points"); newn = pn = OOGLNewNE(Point3, npt, "CModel mesh normals"); if (_mgc->astk->flags & MGASTK_SHADER) { newc = pc = OOGLNewNE(ColorA, npt, "CModel mesh color"); c = m->c ? m->c : (ColorA *)&_mgc->astk->mat.diffuse; } for (i = 0; i < npt; ++i) { projective_vector_to_conformal(curv, pt, n, T, (Point3 *)ppt, pn); ppt->w = 1.; if (newc) { (*shader)(1, ppt, pn, c, pc); pc++; if (m->c) c++; } ++pt; ++n; ++ppt; ++pn; } mgmesh(MESH_MGWRAP(m->geomflags), m->nu, m->nv, newpt, newn, NULL, newc ? newc : m->c, m->geomflags); OOGLFree(newpt); OOGLFree(newn); if (newc) { OOGLFree(newc); } mgpoptransform(); } void cm_read_vect(Vect *v) { int i, nv, nc; HPoint3 pt, *p = v->p; ColorA *c = v->c, *col = (ColorA *)(void *)&_mgc->astk->mat.edgecolor; struct vertex *v0, *v1, *v2; struct edge *e; Transform T; mggettransform(T); pt.w = 1.; for (i = 0; i < v->nvec; i++) { nv = abs(v->vnvert[i]); nc = v->vncolor[i]; /* get position, color and make a new vertex */ projective_to_conformal(curv, p++, T, (Point3 *)(void *)&pt); if (nc > 0) {nc--; col = c++;} v0 = v1 = simple_new_vertex(&pt, col); if (nv == 1) { /* point, not polyline */ v0->visible = TRUE; continue; } do { /* copy polyline */ /* get position, color and make a new vertex */ projective_to_conformal(curv, p++, T, (Point3 *)(void *)&pt); if (nc > 0) {nc--; col = c++;} v2 = simple_new_vertex(&pt, col); e = new_edge_p(v1, v2); e->visible = e->hascolor = TRUE; v1 = v2; } while(--nv > 1); if (v->vnvert[i] < 0) { /* if polyline is closed */ e = new_edge_p(v2, v0); e->visible = e->hascolor = TRUE; } } } void cm_read_polylist(PolyList *polylist) { int i, j, nv, n, vertcolors, facecolors; HPoint3 center; ColorA *col; Transform T; Poly *p; mggettransform(T); p = polylist->p; n = polylist->n_polys; vertcolors = (polylist->geomflags & (PL_HASVCOL|PL_HASPCOL)) == PL_HASVCOL; facecolors = (polylist->geomflags & PL_HASPCOL); col = (ColorA*)&_mgc->astk->mat.diffuse; for (i = 0; i < n; i++) { if (facecolors) col = &p->pcol; nv = p->n_vertices; if (nv == 3) { make_new_triangle(&p->v[0]->pt, &p->v[1]->pt, &p->v[2]->pt, col, T, p, TRUE); } else { center.x = center.y = center.z = center.w = 0; for (j = 0; j < nv; j++) HPt3Add(¢er, &p->v[j]->pt, ¢er); for (j = 1; j < nv; j++) make_new_triangle(&p->v[j-1]->pt, &p->v[j]->pt, ¢er, vertcolors ? &p->v[j]->vcol : col, T, p, FALSE); make_new_triangle(&p->v[nv-1]->pt, &p->v[0]->pt, ¢er, vertcolors ? &p->v[0]->vcol : col, T, p, FALSE); } ++p; } } void make_new_triangle(HPoint3 *a, HPoint3 *b, HPoint3 *c, ColorA *col, Transform T, Poly *p, int allvisible) { struct vertex v, *v1, *v2, *v3; Point3 ap, bp, cp; struct edge *e1, *e2, *e3; int apflags = _mgc->astk->ap.flag; projective_to_conformal(curv, a, T, &ap); projective_to_conformal(curv, b, T, &bp); projective_to_conformal(curv, c, T, &cp); /*fprintf(stderr,"Making tri %.1f %.1f %.1f, %.1f %.1f %.1f, %.1f %.1f %.1f\n",ap.x,ap.y,ap.z,bp.x,bp.y,bp.z,cp.x,cp.y,cp.z);*/ /* convert to the conformal model */ /* make a model vertex */ triangle_polar_point(curv,&ap, &bp, &cp, &v.polar); v.V.vcol = *col; v1 = new_vertex(&ap, &v, NULL); v2 = new_vertex(&bp, &v, NULL); v3 = new_vertex(&cp, &v, NULL); e1 = new_edge_p(v1, v2); e2 = new_edge_p(v2, v3); e3 = new_edge_p(v3, v1); if (apflags & (APF_FACEDRAW|APF_NORMALDRAW)) new_triangle(e1, e2, e3, TRUE, TRUE, TRUE, p); if (apflags & APF_EDGEDRAW) { e1->visible = TRUE; if (allvisible) { e2->visible = TRUE; e3->visible = TRUE; } } return; } struct edge *new_edge_p(struct vertex *v1, struct vertex *v2) { HPoint3 polar; edge_polar_point(curv,(Point3 *)(void *)&v1->V.pt,(Point3 *)(void *)&v2->V.pt, &polar); return new_edge(v1,v2,&polar); } void set_normal(HPoint3 *point, HPoint3 *polar, Point3 *normal) { Point3 t; if (polar == NULL) return; Pt3Mul(polar->w, (Point3 *)point, &t); Pt3Sub((Point3 *)polar, &t, normal); /*fprintf(stderr,"sn gives %.2f %.2f %.2f (%.2f) for polar %.2f %.2f %.2f %.2f\n",normal->x,normal->y,normal->z,sqrt(Pt3Dot(normal,normal)),polar->x,polar->y,polar->z,polar->w);*/ Pt3Unit(normal); } void cmodel_draw(int plflags) { struct triangle *tp; struct edge *ep; struct vertex *vp; ColorA col[2]; HPoint3 pts[2]; Vertex *Vertp = NULL, *verts = NULL; Poly *Polyp = NULL, *polys = NULL; int npolys, keepflags, nverts, useshader, shading; mgshadefunc shader; refine(); /* set the transform to the identity before displaying anything since Poincare model data is already transformed */ mgpushtransform(); mgidentity(); if ((npolys = triangle_count()) != 0) { polys = Polyp = OOGLNewNE(Poly, npolys, "CModel Polys"); } if ((nverts = vertex_count()) != 0) { verts = Vertp = OOGLNewNE(Vertex, nverts, "CModel Vertices"); } shading = _mgc->astk->ap.shading; useshader = _mgc->astk->flags & MGASTK_SHADER; shader = _mgc->astk->shader; vp = first_vertex(); while (vp != NULL) { Vertp->pt = vp->V.pt; /* visible vertices must be displayed invisible vertices are part of faces so we must compute normals */ if (vp->visible) { mgpolyline(1, &Vertp->pt, 1, &vp->V.vcol, 0); } else if (IS_SMOOTH(shading)) { set_normal(&vp->V.pt, &vp->polar, &Vertp->vn); if (useshader) (*shader)(1, &Vertp->pt, &Vertp->vn, &vp->V.vcol, &Vertp->vcol); else Vertp->vcol = vp->V.vcol; } vp->vxp = Vertp++; vp = vp->next; } ep = first_edge(); while (ep != NULL) { /* draw visible edges */ if (ep->visible) { pts[0] = ep->v1->V.pt; pts[1] = ep->v2->V.pt; if (ep->hascolor) { col[0] = ep->v1->V.vcol; col[1] = ep->v2->V.vcol; mgpolyline(2, pts, 2, col, 0); } else { col[0].r = _mgc->astk->ap.mat->edgecolor.r; col[0].g = _mgc->astk->ap.mat->edgecolor.g; col[0].b = _mgc->astk->ap.mat->edgecolor.b; } col[0].a = 1; mgpolyline(2, pts, 1, &col[0], 0); } ep = ep->next; } tp = first_triangle(); while (tp != NULL) { tp->v[0] = edge_start(tp->e1, tp->o1)->vxp; tp->v[1] = edge_start(tp->e2, tp->o2)->vxp; tp->v[2] = edge_start(tp->e3, tp->o3)->vxp; Polyp->flags = plflags & (PL_HASPCOL|PL_HASVCOL); Polyp->n_vertices = 3; Polyp->v = tp->v; /* computation is not exact here: assume triangle is small so center and vertex are very close together */ if (IS_SHADED(shading)) { set_normal(&tp->e1->v1->V.pt, &tp->e1->v1->polar, (Point3 *)&Polyp->pn); Polyp->flags |= PL_HASPN; } if (IS_SMOOTH(shading)) { Polyp->flags |= PL_HASVN; } if (useshader) { (*shader)(1, &tp->v[0]->pt, (Point3 *)&Polyp->pn, &tp->e1->v1->V.vcol, &Polyp->pcol); } else { Polyp->pcol = tp->e1->v1->V.vcol; } Polyp++; tp = tp->next; } if (npolys) { keepflags = _mgc->astk->ap.flag; if (!cm_show_subdivision) _mgc->astk->ap.flag &= ~APF_EDGEDRAW; plflags = (plflags &~ (PL_HASPCOL|PL_HASVCOL)) | (IS_SMOOTH(shading) ? PL_HASVCOL : PL_HASPCOL); mgpolylist(npolys, polys, nverts, verts, plflags); _mgc->astk->ap.flag = keepflags; } /* restore the current transform */ mgpoptransform(); if (polys) { OOGLFree(polys); } if (verts) { OOGLFree(verts); } } void refine() { int maxsteps = cm_maxrefine; alldone = FALSE; /* should do edges at infinity here first */ while (!alldone && maxsteps-- > 0) { alldone = TRUE; refine_once(edge_split); } return; } void refine_once(splitfunc split) { struct edge *ep = first_edge(), *le = get_last_edge(); struct triangle *tp = first_triangle(), *lt = get_last_triangle(); /* split all long edges */ while (ep != NULL) { split_edge(ep, split); if (ep == le) break; ep = ep->next; } if (alldone) return; /* now split all triangles that have had edges split */ while (tp != NULL) { split_triangle(tp); if (tp == lt) break; tp = tp->next; } return; } /* decides whether to split an edge and if so sets the split flag, creates a new edge and drops it into the structure */ void split_edge(struct edge *e, splitfunc split) { struct vertex *mid; if (e->small) return; mid = (*split)(e, cm_cosmaxbend); if (mid == NULL) { e->split = FALSE; e->small = TRUE; return; } e->split = TRUE; e->other_half = new_edge(mid, e->v2, &e->polar); e->other_half->visible = e->visible; e->other_half->hascolor = e->hascolor; e->v2 = mid; alldone = FALSE; return; } struct vertex *edge_start(struct edge *e, int ori) { return ori ? e->v1 : e->v2; } struct vertex *edge_mid(struct edge *e) { return e->v2; } struct edge *first_half(struct edge *e, int ori) { return ori ? e : e->other_half; } void split_triangle_at_one_edge(struct edge **e1, struct edge **e2, struct edge **e3, int *o1, int *o2, int *o3, Poly *orig) { struct edge *ne; ne = new_edge_p(edge_mid(*e1), edge_start(*e3, *o3)); new_triangle(first_half(*e1, !*o1), *e2, ne, *o1, *o2, FALSE, orig); *e1 = first_half(*e1, *o1); *e2 = ne; *o2 = TRUE; return; } void split_triangle_at_two_edges(struct edge **e1, struct edge **e2, struct edge **e3, int *o1, int *o2, int *o3, Poly *orig) { struct edge *ne1, *ne2; ne1 = new_edge_p(edge_mid(*e1), edge_start(*e3, *o3)); ne2 = new_edge_p(edge_mid(*e1), edge_mid(*e2)); new_triangle(first_half(*e1, !*o1), first_half(*e2, *o2), ne2, *o1, *o2, FALSE, orig); new_triangle(first_half(*e2, !*o2), ne1, ne2, *o2, FALSE, TRUE, orig); *e1 = first_half(*e1, *o1); *e2 = ne1; *o2 = TRUE; return; } void split_triangle_at_three_edges(struct edge **e1, struct edge **e2, struct edge **e3, int *o1, int *o2, int *o3, Poly *orig) { struct edge *ne1, *ne2, *ne3; ne1 = new_edge_p(edge_mid(*e1), edge_mid(*e2)); ne2 = new_edge_p(edge_mid(*e2), edge_mid(*e3)); ne3 = new_edge_p(edge_mid(*e3), edge_mid(*e1)); new_triangle(first_half(*e1, !*o1), first_half(*e2, *o2), ne1, *o1, *o2, FALSE, orig); new_triangle(first_half(*e2, !*o2), first_half(*e3, *o3), ne2, *o2, *o3, FALSE, orig); new_triangle(ne1, ne2, ne3, TRUE, TRUE, TRUE, orig); *e1 = first_half(*e1, *o1); *e2 = ne3; *o2 = FALSE; *e3 = first_half(*e3, !*o3); return; } void split_triangle(struct triangle *t) { int magic; Poly *orig; if (t->small) return; orig = t->orig_poly; magic = t->e1->split + 2 * t->e2->split + 4 * t->e3->split; switch (magic) { case 0: t->small = TRUE; break; case 1: split_triangle_at_one_edge(&t->e1, &t->e2, &t->e3, &t->o1, &t->o2, &t->o3, orig); break; case 2: split_triangle_at_one_edge(&t->e2, &t->e3, &t->e1, &t->o2, &t->o3, &t->o1, orig); break; case 4: split_triangle_at_one_edge(&t->e3, &t->e1, &t->e2, &t->o3, &t->o1, &t->o2, orig); break; case 3: split_triangle_at_two_edges(&t->e1, &t->e2, &t->e3, &t->o1, &t->o2, &t->o3, orig); break; case 6: split_triangle_at_two_edges(&t->e2, &t->e3, &t->e1, &t->o2, &t->o3, &t->o1, orig); break; case 5: split_triangle_at_two_edges(&t->e3, &t->e1, &t->e2, &t->o3, &t->o1, &t->o2, orig); break; case 7: split_triangle_at_three_edges(&t->e1, &t->e2, &t->e3, &t->o1, &t->o2, &t->o3, orig); break; default: break; } return; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/geometry/cmodel/cmodel_data.c0000644000175000017500000001670412310110200017310 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "cmodelP.h" /* created from link_list.c */ struct vertex_block { struct vertex_block *next; struct vertex block[ vertexBLOCKSIZE ]; }; static struct vertex_block first_vertex_block, *curr_vertex_block; static struct vertex *last_vertex; static int vx_count = 0; int vertex_count() { return vx_count; } /* once off initialization at the start */ void initialize_vertexs() { curr_vertex_block = &first_vertex_block; first_vertex_block.next = NULL; last_vertex = first_vertex_block.block; first_vertex_block.block->next = NULL; vx_count = 0; return; } struct vertex *first_vertex() { return first_vertex_block.block->next; } void clear_all_vertexs() { struct vertex_block *this_block, *tmp; /* free each block */ this_block = first_vertex_block.next; while(this_block != NULL) { tmp = this_block->next; free(this_block); this_block = tmp; } initialize_vertexs(); return; } struct vertex_block *new_vertex_block() { struct vertex_block *n_block; curr_vertex_block->next = n_block = (struct vertex_block *)malloc(sizeof(struct vertex_block)); n_block->next = NULL; return curr_vertex_block = n_block; } struct vertex *new_vertex(Point3 *pt, struct vertex *v1, struct vertex *v2) { struct vertex *n_vertex; /* allocate a new vertex and link it in */ n_vertex = last_vertex + 1; if (n_vertex - curr_vertex_block->block >= vertexBLOCKSIZE) n_vertex = (new_vertex_block())->block; last_vertex->next = n_vertex; n_vertex->next = NULL; last_vertex = n_vertex; vx_count++; /* now initialize n_vertex */ Pt3Copy(pt, (Point3 *)(void *)&n_vertex->V.pt); n_vertex->V.pt.w = 1.; /* interpolate between two vertex colors */ if (v2 != NULL) { n_vertex->V.vcol.r = .5 * v1->V.vcol.r + .5 * v2->V.vcol.r; n_vertex->V.vcol.g = .5 * v1->V.vcol.g + .5 * v2->V.vcol.g; n_vertex->V.vcol.b = .5 * v1->V.vcol.b + .5 * v2->V.vcol.b; n_vertex->V.vcol.a = .5 * v1->V.vcol.a + .5 * v2->V.vcol.a; } else n_vertex->V.vcol = v1->V.vcol; n_vertex->visible = FALSE; HPt3Copy(&v1->polar, &n_vertex->polar); return n_vertex; } struct vertex *simple_new_vertex(HPoint3 *pt, ColorA *col) { struct vertex *n_vertex; /* allocate a new vertex and link it in */ n_vertex = last_vertex + 1; if (n_vertex - curr_vertex_block->block >= vertexBLOCKSIZE) n_vertex = (new_vertex_block())->block; last_vertex->next = n_vertex; n_vertex->next = NULL; last_vertex = n_vertex; vx_count++; /* now initialize n_vertex */ HPt3Copy(pt, &n_vertex->V.pt); n_vertex->V.vcol = *col; n_vertex->visible = FALSE; /* polar is not used in this case */ return n_vertex; } struct edge_block { struct edge_block *next; struct edge block[ edgeBLOCKSIZE ]; }; static struct edge_block first_edge_block, *curr_edge_block; static struct edge *last_edge; /* once off initialization at the start */ void initialize_edges() { curr_edge_block = &first_edge_block; first_edge_block.next = NULL; last_edge = first_edge_block.block; first_edge_block.block->next = NULL; return; } struct edge *first_edge() { return first_edge_block.block->next; } struct edge *get_last_edge() { return last_edge; } void clear_all_edges() { struct edge_block *this_block, *tmp; /* free each block */ this_block = first_edge_block.next; while(this_block != NULL) { tmp = this_block->next; free(this_block); this_block = tmp; } initialize_edges(); return; } struct edge_block *new_edge_block() { struct edge_block *n_block; curr_edge_block->next = n_block = (struct edge_block *)malloc(sizeof(struct edge_block)); n_block->next = NULL; return curr_edge_block = n_block; } struct edge *new_edge(struct vertex *v1, struct vertex *v2, HPoint3 *polar) { struct edge *n_edge; /* allocate a new edge and link it in */ n_edge = last_edge + 1; if (n_edge - curr_edge_block->block >= edgeBLOCKSIZE) n_edge = (new_edge_block())->block; last_edge->next = n_edge; n_edge->next = NULL; last_edge = n_edge; /* now initialize n_edge */ n_edge->v1 = v1; n_edge->v2 = v2; HPt3Copy(polar, &n_edge->polar); n_edge->small = n_edge->split = n_edge->visible = n_edge->hascolor = FALSE; n_edge->other_half = NULL; return n_edge; } /* created from link_list.c */ struct triangle_block { struct triangle_block *next; struct triangle block[ triangleBLOCKSIZE ]; }; static struct triangle_block first_triangle_block, *curr_triangle_block; static struct triangle *last_triangle; static int tri_count = 0; int triangle_count() { return tri_count; } /* once off initialization at the start */ void initialize_triangles() { curr_triangle_block = &first_triangle_block; first_triangle_block.next = NULL; last_triangle = first_triangle_block.block; first_triangle_block.block->next = NULL; tri_count = 0; return; } struct triangle *first_triangle() { return first_triangle_block.block->next; } struct triangle *get_last_triangle() { return last_triangle; } void clear_all_triangles() { struct triangle_block *this_block, *tmp; /* free each block */ this_block = first_triangle_block.next; while(this_block != NULL) { tmp = this_block->next; free(this_block); this_block = tmp; } initialize_triangles(); return; } struct triangle_block *new_triangle_block() { struct triangle_block *n_block; curr_triangle_block->next = n_block = (struct triangle_block *)malloc(sizeof(struct triangle_block)); n_block->next = NULL; return curr_triangle_block = n_block; } struct triangle *new_triangle(struct edge *e1, struct edge *e2, struct edge *e3, int o1, int o2, int o3, Poly *orig) { struct triangle *t; /* allocate a new triangle and link it in */ t = last_triangle + 1; if (t - curr_triangle_block->block >= triangleBLOCKSIZE) t = (new_triangle_block())->block; last_triangle->next = t; t->next = NULL; last_triangle = t; /* now initialize t */ t->small = FALSE; t->e1 = e1; t->e2 = e2; t->e3 = e3; t->o1 = o1; t->o2 = o2; t->o3 = o3; t->orig_poly = orig; ++tri_count; return t; } geomview-1.9.5/src/lib/geometry/cmodel/cmodel.h0000644000175000017500000000262112310110200016315 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * cmodel.h: declarations for functions dealing with * conformal model of hyperbolic or spherical space */ #ifndef CMODEL_H #define CMODEL_H #include "polylistP.h" #include "vectP.h" #include "meshP.h" #include "quadP.h" void set_cm_refine(double cosmaxbend, int maxrefine, int show_subdivision); void cmodel_clear(int space); void cm_read_polylist(PolyList *polylist); void cm_read_vect(Vect *v); void cm_read_quad(Quad *q); void cmodel_draw(int plflags); void cm_draw_mesh(Mesh *m); #endif /* CMODEL_H */ geomview-1.9.5/src/lib/geometry/cmodel/cmodelP.h0000644000175000017500000000674112310110200016444 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef PMH #define PMH #include "point3.h" #include "hpoint3.h" #include "polylistP.h" #include "color.h" #include "vectP.h" #include "quadP.h" #include "cmodel.h" /* decls for cmodel_data.c */ struct vertex { Vertex V, *vxp; int visible; HPoint3 polar; struct vertex *next; }; #undef small /* Blast Windows. How can they co-opt "small"? */ struct edge { struct vertex *v1, *v2; HPoint3 polar; int small, /* says the edge is too short to consider splitting */ visible, /* says we should display this edge */ hascolor, split; /* says we just split this edge, this is one half ...*/ struct edge *other_half, /* .. and the other half is here */ *next; }; struct triangle { int small, /* says the triangle has 3 short edges */ o1, o2, o3; struct edge *e1, *e2, *e3; Poly *orig_poly; Vertex *v[3]; /* only used at the end */ struct triangle *next; }; #define edgeBLOCKSIZE 120 void initialize_edges(void); void clear_all_edges(void); struct edge *new_edge(struct vertex *v1, struct vertex *v2, HPoint3 *polar); struct edge *first_edge(void); struct edge *get_last_edge(void); #define triangleBLOCKSIZE 80 int triangle_count(void); void initialize_triangles(void); void clear_all_triangles(void); struct triangle *new_triangle(struct edge *e1, struct edge *e2, struct edge *e3, int o1, int o2, int o3, Poly *p); struct triangle *first_triangle(void); struct triangle *get_last_triangle(void); #define vertexBLOCKSIZE 40 void initialize_vertexs(void); void clear_all_vertexs(void); int vertex_count(void); struct vertex *new_vertex(Point3 *pt, struct vertex *v1, struct vertex *v2); struct vertex *simple_new_vertex(HPoint3 *pt, ColorA *col); struct vertex *first_vertex(void); struct vertex *get_last_vertex(void); /* decls for cm_geometry.c */ /* any function of type "splitfunc" takes an edge, decides whether to split it or not and then returns either a pointer to the midpoint or a null pointer. */ typedef struct vertex *(*splitfunc)(struct edge *e, double cosmaxbend); void projective_to_conformal(int curv, HPoint3 *proj, Transform T, Point3 *poinc); void projective_vector_to_conformal(int curv, HPoint3 *pt, Point3 *v, Transform T, Point3 *ppt, Point3 *pv); struct vertex * edge_split(struct edge *e, double cosmaxbend); void edge_polar_point(int curv, const Point3 *a, const Point3 *b, HPoint3 *p); void triangle_polar_point(int curv, const Point3 *a, const Point3 *b, const Point3 *c, HPoint3 *p); int vertex_count(void); int triangle_count(void); #define FALSE 0 #define TRUE 1 #endif geomview-1.9.5/src/lib/geometry/cmodel/Headers0000644000175000017500000000002312310110200016171 00000000000000cmodel.h cmodelP.h geomview-1.9.5/src/lib/geometry/hpoint3/0000755000175000017500000000000012310165601015120 500000000000000geomview-1.9.5/src/lib/geometry/hpoint3/Makefile.in0000644000175000017500000003342212310165553017117 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry/hpoint3 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers\ hg4.h hline3.h hplane3.h hpoint3.h line.h plane.h point.h tolerance.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/hpoint3/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/hpoint3/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am #noinst_LTLIBRARIES = libhpoint3.la # #libhpoint3_la_SOURCES = \ # hg4.h hline3.h hplane3.h hpoint3.h line.h plane.h point.h tolerance.h # 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: geomview-1.9.5/src/lib/geometry/hpoint3/Makefile.am0000644000175000017500000000041212310110200017052 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers\ hg4.h hline3.h hplane3.h hpoint3.h line.h plane.h point.h tolerance.h #noinst_LTLIBRARIES = libhpoint3.la # #libhpoint3_la_SOURCES = \ # hg4.h hline3.h hplane3.h hpoint3.h line.h plane.h point.h tolerance.h geomview-1.9.5/src/lib/geometry/hpoint3/Headers0000644000175000017500000000010612310110200016314 00000000000000hg4.h hline3.h hplane3.h hpoint3.h line.h plane.h point.h tolerance.h geomview-1.9.5/src/lib/geometry/hpoint3/hg4.h0000644000175000017500000002753512310110200015670 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GV_HG4_H_ #define _GV_HG4_H_ # include # include #include "tolerance.h" #include "ooglutil.h" #include "geomtypes.h" static inline char *Hg4Create(void); static inline void Hg4Delete(Hg4Tensor1 p); static inline void Hg4Print(Hg4Tensor1 p); static inline void Hg4From(Hg4Tensor1 p, Hg4Coord x, Hg4Coord y, Hg4Coord z, Hg4Coord w); static inline void Hg4Copy(Hg4Tensor1 a, Hg4Tensor1 b); static inline void Hg4Add(Hg4Tensor1 p1, Hg4Tensor1 p2, Hg4Tensor1 p3); static inline int Hg4Compare(Hg4Tensor1 p1, Hg4Tensor1 p2); static inline int Hg4Coincident(Hg4Tensor1 p1, Hg4Tensor1 p2); static inline int Hg4Undefined(Hg4Tensor1 a); static inline int Hg4Infinity(Hg4Tensor1 p, int dual); static inline void Hg4Normalize(Hg4Tensor1 p, Hg4Tensor1 q); static inline void Hg4Pencil(Hg4Coord t1, Hg4Tensor1 p1, Hg4Coord t2, Hg4Tensor1 p2, Hg4Tensor1 p); static inline void Hg4Transform(Transform3 T, Hg4Tensor1 p1, Hg4Tensor1 p2); static inline void Hg4Print2(Hg4Tensor2 L); static inline void Hg4Copy2(Hg4Tensor2 L, Hg4Tensor2 K); static inline int Hg4Compare2(Hg4Tensor2 L, Hg4Tensor2 K); static inline int Hg4Undefined2(Hg4Tensor2 L); static inline int Hg4Infinity2(Hg4Tensor2 L, int dual); static inline void Hg4Transform2(Transform3 T, Hg4Tensor2 p1, Hg4Tensor2 p2); static inline void Hg4AntiProductPiQj(Hg4Tensor2 L, Hg4Tensor1 p1, Hg4Tensor1 p2); static inline Hg4Coord Hg4ContractPiQi(Hg4Tensor1 pl, Hg4Tensor1 pt); static inline void Hg4AntiContractPijQj(Hg4Tensor2 L, Hg4Tensor1 p1, Hg4Tensor1 p2); static inline void Hg4ContractPijQjk(Hg4Tensor2 a, Hg4Tensor2 b, Hg4Tensor2 c); static inline Hg4Coord Hg4ContractPii(Hg4Tensor2 L); static inline int Hg4Intersect2(Hg4Tensor2 L, Hg4Tensor1 a, Hg4Tensor1 b); static inline int Hg4Intersect3(Hg4Tensor1 a, Hg4Tensor1 b, Hg4Tensor1 c, Hg4Tensor1 p, int dual); static inline int Hg4Intersect4(Hg4Tensor2 K, Hg4Tensor2 L, Hg4Tensor1 pl, Hg4Tensor1 pt); static inline void Hg4Dual(Hg4Tensor2 L, Hg4Tensor2 K); #include "transform3.h" /* Tensor of Order 1 */ static inline char * Hg4Create(void) { return (char *) OOGLNewE(Hg4Tensor1, "Hg4Create"); } static inline void Hg4Delete(Hg4Tensor1 p) { OOGLFree( (char *) p ); } static inline void Hg4Print(Hg4Tensor1 p) { if( p ) printf( "%g %g %g %g\n", p[TMX], p[TMY], p[TMZ], p[TMW] ); } static inline void Hg4From(Hg4Tensor1 p, Hg4Coord x, Hg4Coord y, Hg4Coord z, Hg4Coord w) { p[TMX] = x; p[TMY] = y; p[TMZ] = z; p[TMW] = w; } static inline void Hg4Copy(Hg4Tensor1 a, Hg4Tensor1 b) { memcpy( (char *)b, (char *)a, sizeof(Hg4Tensor1) ); } static inline void Hg4Add(Hg4Tensor1 p1, Hg4Tensor1 p2, Hg4Tensor1 p3) { int i; for (i=0; i<4; ++i) p3[i] = p1[i] + p2[i]; } static inline int Hg4Compare(Hg4Tensor1 p1, Hg4Tensor1 p2) { Hg4Coord test; test = p1[TMX]*p2[TMY] - p1[TMY]*p2[TMX]; if( fneg(test) ) return -1; if( fpos(test) ) return 1; test = p1[TMX]*p2[TMZ] - p1[TMZ]*p2[TMX]; if( fneg(test) ) return -1; if( fpos(test) ) return 1; test = p1[TMY]*p2[TMZ] - p1[TMZ]*p2[TMY]; if( fneg(test) ) return -1; if( fpos(test) ) return 1; test = p1[TMX]*p2[TMW] - p1[TMW]*p2[TMX]; if( fneg(test) ) return -1; if( fpos(test) ) return 1; test = p1[TMY]*p2[TMW] - p1[TMW]*p2[TMY]; if( fneg(test) ) return -1; if( fpos(test) ) return 1; test = p1[TMZ]*p2[TMW] - p1[TMW]*p2[TMZ]; if( fneg(test) ) return -1; if( fpos(test) ) return 1; return 0; } static inline int Hg4Coincident(Hg4Tensor1 p1, Hg4Tensor1 p2) { return Hg4Compare( p1, p2 ) == 0; } static inline int Hg4Undefined(Hg4Tensor1 a) { if( !fzero(a[TMX]) ) return 0; if( !fzero(a[TMY]) ) return 0; if( !fzero(a[TMZ]) ) return 0; if( !fzero(a[TMW]) ) return 0; return 1; } static inline int Hg4Infinity(Hg4Tensor1 p, int dual) { /* Assume not undefined */ if( dual ) { /* plane */ if( !fzero(p[TMX]) ) return 0; if( !fzero(p[TMY]) ) return 0; if( !fzero(p[TMZ]) ) return 0; return 1; } else { /* point */ if( !fzero(p[TMW]) ) return 0; return 1; } } static inline void Hg4Normalize(Hg4Tensor1 p, Hg4Tensor1 q) { Hg4Copy( p, q ); if( q[TMW] != 1. && q[TMW] != 0. ) { q[TMX] /= q[TMW]; q[TMY] /= q[TMW]; q[TMZ] /= q[TMW]; q[TMW] = 1.; } } static inline void Hg4Pencil(Hg4Coord t1, Hg4Tensor1 p1, Hg4Coord t2, Hg4Tensor1 p2, Hg4Tensor1 p) { p[TMW] = t1 * p1[TMW] + t2 * p2[TMW]; /* Keep W positive */ if( p[TMW] < 0. ) { p[TMW] = -p[TMW]; t1 = -t1; t2 = -t2; } p[TMX] = t1 * p1[TMX] + t2 * p2[TMX]; p[TMY] = t1 * p1[TMY] + t2 * p2[TMY]; p[TMZ] = t1 * p1[TMZ] + t2 * p2[TMZ]; } /* * transform a 3d point * * pt2 = pt1 * [a] * */ static inline void Hg4Transform(Transform3 T, Hg4Tensor1 p1, Hg4Tensor1 p2) { Tm3Coord *aptr; Hg4Coord *pptr; Hg4Coord x, y, z, w; int cnt; x = p1[TMX]; y = p1[TMY]; z = p1[TMZ]; w = p1[TMW]; aptr= T[0]; pptr= p2; cnt=4; do{ *pptr++ = aptr[0]*x + aptr[4]*y + aptr[8]*z + aptr[12]*w; ++aptr; } while(--cnt); } /* Tensor of Order 2 */ static inline void Hg4Print2(Hg4Tensor2 L) { printf( "[%g %g %g %g\n", L[TMX][TMX], L[TMX][TMY], L[TMX][TMZ], L[TMX][TMW] ); printf( " %g %g %g %g\n", L[TMY][TMX], L[TMY][TMY], L[TMY][TMZ], L[TMY][TMW] ); printf( " %g %g %g %g\n", L[TMZ][TMX], L[TMZ][TMY], L[TMZ][TMZ], L[TMZ][TMW] ); printf( " %g %g %g %g]\n", L[TMW][TMX], L[TMW][TMY], L[TMW][TMZ], L[TMW][TMW] ); } static inline void Hg4Copy2(Hg4Tensor2 L, Hg4Tensor2 K) { memcpy( (char *)K, (char *)L, sizeof(Hg4Tensor2) ); } static inline int Hg4Compare2(Hg4Tensor2 L, Hg4Tensor2 K) { Hg4Coord t; Hg4Tensor2 N; Hg4ContractPijQjk( K, L, N ); t = Hg4ContractPii( N ); if( fzero(t) ) return 0; if( t < 0. ) return -1; return 1; } static inline int Hg4Undefined2(Hg4Tensor2 L) { if( !fzero(L[TMX][TMY]) ) return 0; if( !fzero(L[TMX][TMZ]) ) return 0; if( !fzero(L[TMX][TMW]) ) return 0; if( !fzero(L[TMY][TMZ]) ) return 0; if( !fzero(L[TMY][TMW]) ) return 0; if( !fzero(L[TMZ][TMW]) ) return 0; return 1; } static inline int Hg4Infinity2(Hg4Tensor2 L, int dual) { /* plane form */ if( dual ) { if( !fzero(L[TMX][TMY]) ) return 0; if( !fzero(L[TMX][TMZ]) ) return 0; if( !fzero(L[TMY][TMZ]) ) return 0; return 1; } else { if( !fzero(L[TMX][TMW]) ) return 0; if( !fzero(L[TMY][TMW]) ) return 0; if( !fzero(L[TMZ][TMW]) ) return 0; return 1; } } static inline void Hg4Transform2(Transform3 T, Hg4Tensor2 p1, Hg4Tensor2 p2) { Transform3 Tt; fprintf(stderr,"\nWARNING: dubious procedure Hg4Transform2 being called.\n\ This procedure may not have been correctly updated for new transform\n\ library. Ask me about this. --- mbp Mon Aug 19 10:38:19 1991.\n\n"); /* In fact, this procedure has not been updated at all. This is the old version. I don't know whether this depends on a notion of col vs row vectors, or right vs left mult. I think it does but I'm not sure how, so I'll deal with it later. -- mbp */ /* Assume p1 is the plane-form */ Tm3Transpose(T, Tt); Hg4ContractPijQjk( T, p1, p2 ); Hg4ContractPijQjk( p2, Tt, p2 ); } static inline void Hg4AntiProductPiQj(Hg4Tensor2 L, Hg4Tensor1 p1, Hg4Tensor1 p2) { L[TMX][TMX] = L[TMY][TMY] = L[TMZ][TMZ] = L[TMW][TMW] = 0.; L[TMX][TMY] = p1[TMX]*p2[TMY] - p1[TMY]*p2[TMX]; L[TMX][TMZ] = p1[TMX]*p2[TMZ] - p1[TMZ]*p2[TMX]; L[TMX][TMW] = p1[TMX]*p2[TMW] - p1[TMW]*p2[TMX]; L[TMY][TMZ] = p1[TMY]*p2[TMZ] - p1[TMZ]*p2[TMY]; L[TMY][TMW] = p1[TMY]*p2[TMW] - p1[TMW]*p2[TMY]; L[TMZ][TMW] = p1[TMZ]*p2[TMW] - p1[TMW]*p2[TMZ]; L[TMY][TMX] = -L[TMX][TMY]; L[TMZ][TMX] = -L[TMX][TMZ]; L[TMW][TMX] = -L[TMX][TMW]; L[TMZ][TMY] = -L[TMY][TMZ]; L[TMW][TMY] = -L[TMY][TMW]; L[TMW][TMZ] = -L[TMZ][TMW]; } /* contraction of various tensors */ static inline Hg4Coord Hg4ContractPiQi(Hg4Tensor1 pl, Hg4Tensor1 pt) { Hg4Coord sum; sum = 0.; sum += pl[TMX] * pt[TMX]; sum += pl[TMY] * pt[TMY]; sum += pl[TMZ] * pt[TMZ]; sum += pl[TMW] * pt[TMW]; return sum; } static inline void Hg4AntiContractPijQj(Hg4Tensor2 L, Hg4Tensor1 p1, Hg4Tensor1 p2) { Hg4Coord x, y, z, w; Hg4Coord xy, xz, xw, yz, yw, zw; x = p1[TMX]; y = p1[TMY]; z = p1[TMZ]; w = p1[TMW]; xy = L[TMX][TMY]; xz = L[TMX][TMZ]; xw = L[TMX][TMW]; yz = L[TMY][TMZ]; yw = L[TMY][TMW]; zw = L[TMZ][TMW]; p2[TMX] = xy * y + xz * z + xw * w; p2[TMY] = -xy * x + yz * z + yw * w; p2[TMZ] = -xz * x - yz * y + zw * w; p2[TMW] = -xw * x - yw * y - zw * z; } static inline void Hg4ContractPijQjk(Hg4Tensor2 a, Hg4Tensor2 b, Hg4Tensor2 c) { Hg4Tensor2 d; int i, j, k; /* This can be made more efficient */ for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) { d[i][j] = 0.; for( k=0; k<4; k++ ) d[i][j] += a[i][k] * b[k][j]; } Hg4Copy2( d, c ); } static inline Hg4Coord Hg4ContractPii(Hg4Tensor2 L) { return L[TMX][TMX] + L[TMY][TMY] + L[TMZ][TMZ] + L[TMW][TMW]; } static inline int Hg4Intersect2(Hg4Tensor2 L, Hg4Tensor1 a, Hg4Tensor1 b) { Hg4AntiContractPijQj( L, a, b ); return Hg4Undefined( b ); } static inline int Hg4Intersect3(Hg4Tensor1 a, Hg4Tensor1 b, Hg4Tensor1 c, Hg4Tensor1 p, int dual) { Hg4Tensor2 L; Hg4AntiProductPiQj( L, a, b ); if( dual ) Hg4Dual( L, L ); Hg4AntiContractPijQj( L, c, p ); return Hg4Undefined( p ); } /* ** Hg4Intersect4 - predicate which tests for 3d line intersection and ** if an intersection is found returns the point at which th ** two lines cross and the plane in which the two lines lie. ** ** Note: One of the lines should be in the "plane-form" and the ** other in the "point-form." ** ** Assume K is plane-form, L is point-form */ static inline int Hg4Intersect4(Hg4Tensor2 K, Hg4Tensor2 L, Hg4Tensor1 pl, Hg4Tensor1 pt) { int flag; int i, j; Hg4Tensor2 N; Hg4Coord t; Hg4ContractPijQjk( K, L, N ); Hg4From( pl, 0., 0., 0., 0. ); Hg4From( pt, 0., 0., 0., 0. ); t = Hg4ContractPii( N ); if( fzero(t) ) { /* Look for a non-zero row */ flag = 0; for( i=0; i<4; i++ ) { for( j=0; j<4; j++ ) { pt[j] = N[i][j]; if( !fzero( pt[j] ) ) flag++; } if( flag ) break; } /* Look for a non-zero col */ flag = 0; for( i=0; i<4; i++ ) { for( j=0; j<4; j++ ) { pl[j] = N[j][i]; if( !fzero( pl[j] ) ) flag++; } if( flag ) break; } } return fzero(t); } static inline void Hg4Dual(Hg4Tensor2 L, Hg4Tensor2 K) { Hg4Coord p, q, r, u, t, s; /* t = xy; xy = -zw; zw = -t; t = xz; xz = yw; yw = t; t = yz; yz = -xw; xw = -t; */ if( L != K ) Hg4Copy2( L, K ); p = K[TMX][TMY]; u = K[TMZ][TMW]; K[TMZ][TMW] = -p; K[TMW][TMZ] = p; K[TMX][TMY] = -u; K[TMY][TMX] = u; q = K[TMZ][TMX]; t = K[TMW][TMY]; K[TMY][TMW] = -q; K[TMW][TMY] = q; K[TMX][TMZ] = -t; K[TMZ][TMX] = t; s = K[TMY][TMZ]; r = K[TMX][TMW]; K[TMX][TMW] = -s; K[TMW][TMX] = s; K[TMY][TMZ] = -r; K[TMZ][TMY] = r; } #endif /* _GV_HG4_H_ */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/geometry/hpoint3/hline3.h0000644000175000017500000001557612310110200016372 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* ** hline3.h - procedural interface to 3D line geometry ** ** pat hanrahan */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GV_HLINE3_H_ #define _GV_HLINE3_H_ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "ooglutil.h" #include "geomtypes.h" static inline HLine3 *HLn3Create(void); static inline void HLn3Delete(HLine3 *ln); static inline void HLn3Print(HLine3 *ln); static inline void HLn3Copy(HLine3 *ln1, HLine3 *ln2); static inline int HLn3From2HPt3s(HLine3 *ln, HPoint3 *pt1, HPoint3 *pt2); static inline int HLn3From2HPl3s(HLine3 *ln, HPlane3 *pl1, HPlane3 *pl2); static inline int HLn3IntersectHPl3(HLine3 * ln, HPlane3 * pl, HPoint3 * pt); static inline int HLn3IntersectHPt3(HLine3 * ln, HPoint3 * pt, HPlane3 * pl); static inline int HLn3IntersectHLn3(HLine3 * ln1, HLine3 * ln2, HPlane3 * pl, HPoint3 * pt); static inline int HLn3Undefined(HLine3 * ln); static inline int HLn3Infinity(HLine3 * ln); static inline int HLn3Compare(HLine3 * ln1, HLine3 * ln2); static inline int HLn3CoincidentHPt3(HLine3 * ln, HPoint3 * pt); static inline int HLn3CoincidentHLn3(HLine3 * ln1, HLine3 * ln2); static inline int HLn3CoincidentHPl3(HLine3 * ln, HPlane3 * pl); static inline void HLn3Transform(Transform3 T, HLine3 * ln1, HLine3 * ln2); static inline void HLn3Dual(HLine3 * ln, HLine3 * lndual); static inline void HLn3Perp(HLine3 * ln, HLine3 * lnperp); #include "hg4.h" #include "hpoint3.h" #include "hplane3.h" #include "transform3.h" #define HLN3_POINT_FORM -1 #define HLN3_PLANE_FORM 1 #define HLN3_DUAL_FORM(f) (-(f)) static inline HLine3 *HLn3Create(void) { return OOGLNewE(HLine3, "HLine3"); } static inline void HLn3Delete(HLine3 *ln) { OOGLFree(ln); } static inline void HLn3Print(HLine3 *ln) { printf("ln(%s) \n", ln->type == HLN3_POINT_FORM ? "pt" : "pl"); Hg4Print2(ln->L); } static inline void HLn3Copy(HLine3 *ln1, HLine3 *ln2) { memcpy((char *) ln2, (char *) ln1, sizeof(HLine3)); } /* ** Form the anti-symmetric line tensor from two points. ** ** Note: pt * L = pl. ** (1) pl is the plane formed from the line and the pt. ** (2) each col of L is a plane containing the line. ** (3) if pl is identically 0 then the pt lies on the line. */ static inline int HLn3From2HPt3s(HLine3 *ln, HPoint3 *pt1, HPoint3 *pt2) { ln->type = HLN3_POINT_FORM; Hg4AntiProductPiQj(ln->L, (Hg4Tensor1Ptr)pt1, (Hg4Tensor1Ptr)pt2); return Hg4Undefined2(ln->L); } /* ** Form the anti-symmetric line tensor from two planes. ** ** Note: K * pl = pt. ** (1) pt is the point formed from the line and the pl. ** (2) each row of K is a point on the line. ** (3) if pt is identically 0 then the pl lies on the line. */ static inline int HLn3From2HPl3s(HLine3 *ln, HPlane3 *pl1, HPlane3 *pl2) { ln->type = HLN3_PLANE_FORM; Hg4AntiProductPiQj(ln->L, (Hg4Tensor1Ptr)pl1, (Hg4Tensor1Ptr)pl2); return Hg4Undefined2(ln->L); } static inline int HLn3IntersectHPl3(HLine3 * ln, HPlane3 * pl, HPoint3 * pt) { HLine3 aln; if (ln->type == HLN3_PLANE_FORM) { HLn3Dual(ln, &aln); ln = &aln; } return Hg4Intersect2(ln->L, (Hg4Tensor1Ptr)pl, (Hg4Tensor1Ptr)pt); } static inline int HLn3IntersectHPt3(HLine3 * ln, HPoint3 * pt, HPlane3 * pl) { HLine3 aln; if (ln->type == HLN3_POINT_FORM) { HLn3Dual(ln, &aln); ln = &aln; } return Hg4Intersect2(ln->L, (Hg4Tensor1Ptr)pt, (Hg4Tensor1Ptr)pl); } /* ** predicate which tests for 3d line intersection and ** if an intersection is found returns the point at which th ** two lines cross and the plane in which the two lines lie. ** ** Note: One of the lines should be in the "plane-form" and the ** other in the "point-form." */ static inline int HLn3IntersectHLn3(HLine3 * ln1, HLine3 * ln2, HPlane3 * pl, HPoint3 * pt) { HLine3 ln; if (ln1->type == ln2->type) { Hg4Dual((Hg4Tensor2Ptr)(void *)ln2, (Hg4Tensor2Ptr)(void *)&ln); ln2 = &ln; } if (ln1->type == HLN3_POINT_FORM) return Hg4Intersect4(ln1->L, ln2->L, (Hg4Tensor1Ptr)pt, (Hg4Tensor1Ptr)pl); else return Hg4Intersect4(ln1->L, ln2->L, (Hg4Tensor1Ptr)pl, (Hg4Tensor1Ptr)pt); } static inline int HLn3Undefined(HLine3 * ln) { return Hg4Undefined2(ln->L); } static inline int HLn3Infinity(HLine3 * ln) { return Hg4Infinity2(ln->L, ln->type == HLN3_PLANE_FORM); } static inline int HLn3Compare(HLine3 * ln1, HLine3 * ln2) { /* Do the types have to agree? */ return Hg4Compare2(ln1->L, ln2->L); } static inline int HLn3CoincidentHPt3(HLine3 * ln, HPoint3 * pt) { HPlane3 pl; return HLn3IntersectHPt3(ln, pt, &pl); } static inline int HLn3CoincidentHLn3(HLine3 * ln1, HLine3 * ln2) { HPlane3 pl; HPoint3 pt; if (HLn3IntersectHLn3(ln1, ln2, &pl, &pt)) return HPl3Undefined(&pl); return 0; } static inline int HLn3CoincidentHPl3(HLine3 * ln, HPlane3 * pl) { HPoint3 pt; return HLn3IntersectHPl3(ln, pl, &pt); } static inline void HLn3Transform(Transform3 T, HLine3 * ln1, HLine3 * ln2) { /* Assume T is a point transform */ if (ln1->type == HLN3_PLANE_FORM) { HLn3Dual(ln1, ln2); Hg4Transform2(T, ln2->L, ln2->L); HLn3Dual(ln2, ln2); } else { Hg4Transform2(T, ln1->L, ln2->L); ln2->type = ln1->type; } } /* ** Convert the matrix formed from planes/points to that formed ** from points/planes. ** ** Note: ** (1) pu-qt+sr=0. ** (2) (s,q,p,0) is parallel to the line. ** (3) (-r,t,-u,0) is a plane containing the line and the origin. ** (4) K*L = 0. */ static inline void HLn3Dual(HLine3 * ln, HLine3 * lndual) { Hg4Dual(ln->L, lndual->L); lndual->type = HLN3_DUAL_FORM(ln->type); } static inline void HLn3Perp(HLine3 * ln, HLine3 * lnperp) { HPoint3 pt; HPlane3 pl; /* LnIntersectPl( ln, &HPl3Ideal, &pt ); */ HPt3Copy((HPoint3 *) ln->L[3], &pt); HPt3Dual(&pt, &pl); HLn3From2HPl3s(lnperp, &pl, (HPlane3 *)&HPl3Ideal); } #endif /* _GV_HLINE3_H_ */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/geometry/hpoint3/hplane3.h0000644000175000017500000001307012310110200016525 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* ** hplane3.c - procedural interface to 3D plane geometry ** ** pat hanrahan */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GV_HPLANE3_H_ #define _GV_HPLANE3_H_ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "tolerance.h" #include "geomtypes.h" static inline HPlane3 *HPl3Create(void); static inline void HPl3Delete(HPlane3 *pl); static inline void HPl3Print(HPlane3 *pl); static inline void HPl3Copy(HPlane3 *pl1, HPlane3 *pl2); static inline void HPl3From(HPlane3 *pl, HPl3Coord a, HPl3Coord b, HPl3Coord c, HPl3Coord d); static inline int HPl3From3HPt3s(HPlane3 *pl, HPoint3 *pt1, HPoint3 *pt2, HPoint3 *pt3); static inline int HPl3From2HLn3s(HPlane3 *pl, HLine3 *ln1, HLine3 *ln2); static inline int HPl3IntersectHPl3(HPlane3 *pl1, HPlane3 *pl2, HLine3 *ln); static inline void HPl3Pencil( HPl3Coord t1, HPlane3 *pl1, HPl3Coord t2, HPlane3 *pl2, HPlane3 *pl3 ); static inline HPt3Coord HPl3DotHPt3(HPlane3 *pl, HPoint3 *pt); static inline int HPl3Undefined(HPlane3 *pl); static inline int HPl3Infinity(HPlane3 *pl); static inline int HPl3Compare(HPlane3 *pl1, HPlane3 *pl2); static inline int HPl3CoincidentHPt3(HPlane3 *pl, HPoint3 *pt); static inline int HPl3CoincidentHLn3(HPlane3 *pl, HLine3 *ln); static inline int HPl3CoincidentHPl3( HPlane3 *pl1, HPlane3 *pl2 ); static inline void HPl3Transform(Transform3 T, HPlane3 *pl1, HPlane3 *pl2); static inline void HPl3TransformN(Transform3 T, HPlane3 *pl1, HPlane3 *pl2, int n ); static inline void HPl3Dual(HPlane3 *pl, HPoint3 *pt); static inline void HPl3Perp(HPlane3 *pl, HPoint3 *pt); #include "hg4.h" #include "hline3.h" #include "transform3.h" static const HPlane3 HPl3Ideal = { 0., 0., 0., 1. }; static inline HPlane3 * HPl3Create(void) { return (HPlane3 *) Hg4Create(); } static inline void HPl3Delete( HPlane3 *pl ) { Hg4Delete( (Hg4Tensor1Ptr)pl ); } static inline void HPl3Print( HPlane3 *pl ) { Hg4Print( (Hg4Tensor1Ptr)pl ); } static inline void HPl3Copy( HPlane3 *pl1, HPlane3 *pl2 ) { Hg4Copy( (Hg4Tensor1Ptr)pl1, (Hg4Tensor1Ptr)pl2 ); } static inline void HPl3From( HPlane3 *pl, HPl3Coord a, HPl3Coord b, HPl3Coord c, HPl3Coord d ) { Hg4From( (Hg4Tensor1Ptr)pl, a, b, c, d ); } static inline int HPl3From3HPt3s( HPlane3 *pl, HPoint3 *pt1, HPoint3 *pt2, HPoint3 *pt3 ) { return Hg4Intersect3( (Hg4Tensor1Ptr)pt1, (Hg4Tensor1Ptr)pt2, (Hg4Tensor1Ptr)pt3, (Hg4Tensor1Ptr)pl, 1 ); } static inline int HPl3From2HLn3s( HPlane3 *pl, HLine3 *ln1, HLine3 *ln2 ) { HPoint3 pt; return HLn3IntersectHLn3( ln1, ln2, pl, &pt ); } static inline int HPl3IntersectHPl3( HPlane3 *pl1, HPlane3 *pl2, HLine3 *ln ) { return HLn3From2HPl3s( ln, pl1, pl2 ); } static inline void HPl3Pencil( HPl3Coord t1, HPlane3 *pl1, HPl3Coord t2, HPlane3 *pl2, HPlane3 *pl3 ) { Hg4Pencil( t1, (Hg4Tensor1Ptr)pl1, t2, (Hg4Tensor1Ptr)pl2, (Hg4Tensor1Ptr)pl3 ); } static inline HPt3Coord HPl3DotHPt3( HPlane3 *pl, HPoint3 *pt ) { return Hg4ContractPiQi( (Hg4Tensor1Ptr)pl, (Hg4Tensor1Ptr)pt ); } static inline int HPl3Undefined( HPlane3 *pl ) { return Hg4Undefined( (Hg4Tensor1Ptr)pl ); } static inline int HPl3Infinity( HPlane3 *pl ) { return Hg4Infinity( (Hg4Tensor1Ptr) pl, 1 ); } static inline int HPl3Compare( HPlane3 *pl1, HPlane3 *pl2 ) { return Hg4Compare( (Hg4Tensor1Ptr)pl1, (Hg4Tensor1Ptr)pl2 ); } static inline int HPl3CoincidentHPt3( HPlane3 *pl, HPoint3 *pt ) { return fzero(HPl3DotHPt3(pl,pt)); } static inline int HPl3CoincidentHLn3( HPlane3 *pl, HLine3 *ln ) { HPoint3 pt; return HLn3IntersectHPl3( ln, pl, &pt ); } static inline int HPl3CoincidentHPl3( HPlane3 *pl1, HPlane3 *pl2 ) { return Hg4Coincident( (Hg4Tensor1Ptr)pl1, (Hg4Tensor1Ptr)pl2 ); } static inline void HPl3Transform( Transform3 T, HPlane3 *pl1, HPlane3 *pl2 ) { Hg4Transform( T, (Hg4Tensor1Ptr)pl1, (Hg4Tensor1Ptr)pl2 ); } static inline void HPl3TransformN( Transform3 T, HPlane3 *pl1, HPlane3 *pl2, int n ) { while( n-- ) Hg4Transform( T, (Hg4Tensor1Ptr)pl1++, (Hg4Tensor1Ptr)pl2++ ); } static inline void HPl3Dual( HPlane3 *pl, HPoint3 *pt ) { pt->x = pl->a; pt->y = pl->b; pt->z = pl->c; pt->w = pl->d; } static inline void HPl3Perp( HPlane3 *pl, HPoint3 *pt ) { /* HLine3 ln, lndual; HQuadric Q; HLn3From2HPl3s( &ln, pl, &HPl3Ideal ); HLn3CorrelateHLn3( &ln, Q, &lndual ); HLn3Perp( &lndual, pt ): */ /* if HPl3Ideal == (0,0,0,1) */ pt->x = pl->a; pt->y = pl->b; pt->z = pl->c; pt->w = 0; } #endif /* _GV_HPLANE3_H_ */ geomview-1.9.5/src/lib/geometry/hpoint3/hpoint3.h0000644000175000017500000004521712310110200016567 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* ** hpoint3.h - procedural interface to 3D point geometry ** ** pat hanrahan */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GV_HPOINT3_H_ #define _GV_HPOINT3_H_ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "tolerance.h" /* for safety we make forward declarations for all functions defined * * here, only then we include other header files containing inline * functions, they will follow the same scheme and everything will * work. */ #include "geomtypes.h" static inline HPoint3 *HPt3Create(void); static inline void HPt3Delete(HPoint3 *pt); static inline void HPt3Print(HPoint3 *pt); static inline void HPt3Copy(HPoint3 *pt1, HPoint3 *pt2); static inline void HPt3Add(HPoint3 *pt1, HPoint3 *pt2, HPoint3 *pt3); static inline void HPt3From(HPoint3 *pt, HPt3Coord x, HPt3Coord y, HPt3Coord z, HPt3Coord w); static inline int HPt3From3HPl3s(HPoint3 *pt, HPlane3 *pl1, HPlane3 *pl2, HPlane3 *pl3); static inline int HPt3From2HLn3s( HPoint3 *pt, HLine3 *ln1, HLine3 *ln2 ); static inline int HPt3IntersectHPt3( HPoint3 *pt1, HPoint3 *pt2, HLine3 *ln ); static inline void HPt3Pencil(HPt3Coord t1, HPoint3 *pt1, HPt3Coord t2, HPoint3 *pt2, HPoint3 *pt3 ); static inline HPt3Coord HPt3DotHPl3(HPoint3 *pt, HPlane3 *pl); static inline int HPt3Compare(HPoint3 *pt1, HPoint3 *pt2); static inline int HPt3Undefined(HPoint3 *pt); static inline int HPt3Infinity(HPoint3 *pt); static inline int HPt3CoincidentHPl3(HPoint3 *pt, HPlane3 *pl); static inline int HPt3CoincidentHLn3(HPoint3 *pt, HLine3 *ln); static inline int HPt3CoincidentHPt3(HPoint3 *pt1, HPoint3 *pt2); static inline void HPt3Transform(Transform3 T, HPoint3 *pt1, HPoint3 *pt2); static inline int HPt3TransformN(Transform3 T, HPoint3 *pt1, HPoint3 *pt2, int n); static inline HPt3Coord HPt3TransPt3(Transform3 T, HPoint3 *pin, Point3 *pout); static inline void Pt3ToHPt3(Point3 *v3, HPoint3 *v4, int n); static inline void HPt3ToPt3(HPoint3 *hp, Point3 *p); static inline void Pt4ToHPt3(HPoint3 *pt4, int *axes, HPoint3 *hp3); static inline void HPt3Dehomogenize(HPoint3 *hp1, HPoint3 *hp2); static inline void HPt3Dual(HPoint3 *pt, HPlane3 *pl); static inline void HPt3LinSum(HPt3Coord scale1, HPoint3 *in1, HPt3Coord scale2, HPoint3 *in2, HPoint3 *out); static inline void HPt3LinSumDenorm(HPt3Coord scale1, HPoint3 *in1, HPt3Coord scale2, HPoint3 *in2, HPoint3 *out); static inline void HPt3SizeOne(HPoint3 *pt, HPoint3 *out); static inline HPt3Coord HPt3R40Dot(HPoint3 *a, HPoint3 *b); static inline HPt3Coord HPt3R31Dot(HPoint3 *a, HPoint3 *b); static inline HPt3Coord HPt3R30Dot(HPoint3 *a, HPoint3 *b); static inline HPt3Coord HPt3SpaceDot(HPoint3 *a, HPoint3 *b, int space); static inline HPt3Coord HPt3DotPt3(HPoint3 *a, Point3 *b); static inline void HPt3R40Normalize(HPoint3 *a); static inline void HPt3R31Normalize(HPoint3 *a); static inline void HPt3R30Normalize(HPoint3 *a); static inline void HPt3SpaceNormalize(HPoint3 *a, int space); static inline HPt3Coord HPt3HypDistance(HPoint3 *a, HPoint3 *b); static inline HPt3Coord HPt3Distance(HPoint3 *a, HPoint3 *b); static inline HPt3Coord HPt3SphDistance(HPoint3 *a, HPoint3 *b); static inline HPt3Coord HPt3SpaceDistance(HPoint3 *a, HPoint3 *b, int space); static inline void HPt3Sub(HPoint3 *a, HPoint3 *b, HPoint3 *aminusb); static inline void HPt3Scale(HPt3Coord s, HPoint3 *a, HPoint3 *sa); static inline void HPt3GramSchmidt(HPoint3 *base, HPoint3 *v); static inline void HPt3HypGramSchmidt(HPoint3 *base, HPoint3 *v); static inline void HPt3SphGramSchmidt(HPoint3 *base, HPoint3 *v); static inline void HPt3SpaceGramSchmidt(HPoint3 *base, HPoint3 *v, int space); #if 0 static inline HPt3Coord HPt3Angle(HPoint3 *base, HPoint3 *v1, HPoint3 *v2); static inline HPt3Coord HPt3HypAngle(HPoint3 *base, HPoint3 *v1, HPoint3 *v2); static inline HPt3Coord HPt3SphAngle(HPoint3 *base, HPoint3 *v1, HPoint3 *v2); static inline HPt3Coord HPt3SpaceAngle(HPoint3 *base, HPoint3 *v1, HPoint3 *v2, int space); #endif static inline void HPt3SubPt3(HPoint3 *p1, HPoint3 *p2, Point3 *v); static inline void HPt3MinMax(HPoint3 *min, HPoint3 *max, HPoint3 *other); static inline void Pt3MinMax(HPoint3 *min, HPoint3 *max, HPoint3 *other); static inline void Pt4MinMax(HPoint3 *min, HPoint3 *max, HPoint3 *other); #include "hg4.h" #include "hline3.h" #include "hplane3.h" #include "point3.h" static inline HPoint3 *HPt3Create(void) { return (HPoint3 *) Hg4Create(); } static inline void HPt3Delete( HPoint3 *pt ) { Hg4Delete( (Hg4Tensor1Ptr) pt ); } static inline void HPt3Print( HPoint3 *pt ) { Hg4Print( (Hg4Tensor1Ptr) pt ); } static inline void HPt3Copy(HPoint3 *pt1, HPoint3 *pt2) { *pt2 = *pt1; } static inline void HPt3Add(HPoint3 *pt1, HPoint3 *pt2, HPoint3 *pt3) { Hg4Add( (Hg4Tensor1Ptr) pt1, (Hg4Tensor1Ptr) pt2 , (Hg4Tensor1Ptr) pt3); } static inline void HPt3From(HPoint3 *pt, HPt3Coord x, HPt3Coord y, HPt3Coord z, HPt3Coord w) { Hg4From( (Hg4Tensor1Ptr)pt, x, y, z, w ); } static inline int HPt3From3HPl3s( HPoint3 *pt, HPlane3 *pl1, HPlane3 *pl2, HPlane3 *pl3 ) { return Hg4Intersect3( (Hg4Tensor1Ptr)pl1, (Hg4Tensor1Ptr)pl2, (Hg4Tensor1Ptr)pl3, (Hg4Tensor1Ptr)pt, 1 ); } static inline int HPt3From2HLn3s( HPoint3 *pt, HLine3 *ln1, HLine3 *ln2 ) { HPlane3 pl; return HLn3IntersectHLn3( ln1, ln2, &pl, pt ); } static inline int HPt3IntersectHPt3( HPoint3 *pt1, HPoint3 *pt2, HLine3 *ln ) { return HLn3From2HPt3s( ln, pt1, pt2 ); } static inline void HPt3Pencil( HPt3Coord t1, HPoint3 *pt1, HPt3Coord t2, HPoint3 *pt2, HPoint3 *pt3 ) { Hg4Pencil( t1, (Hg4Tensor1Ptr)pt1, t2, (Hg4Tensor1Ptr)pt2, (Hg4Tensor1Ptr)pt3); } static inline HPt3Coord HPt3DotHPl3( HPoint3 *pt, HPlane3 *pl ) { return Hg4ContractPiQi( (Hg4Tensor1Ptr)pt, (Hg4Tensor1Ptr)pl ); } static inline int HPt3Compare( HPoint3 *pt1, HPoint3 *pt2 ) { return Hg4Compare( (Hg4Tensor1Ptr)pt1, (Hg4Tensor1Ptr)pt2 ); } static inline int HPt3Undefined( HPoint3 *pt ) { return Hg4Undefined( (Hg4Tensor1Ptr)pt ); } static inline int HPt3Infinity( HPoint3 *pt ) { return Hg4Infinity( (Hg4Tensor1Ptr)pt, 0 ); } static inline int HPt3CoincidentHPl3( HPoint3 *pt, HPlane3 *pl ) { return fzero(HPt3DotHPl3(pt,pl)); } static inline int HPt3CoincidentHLn3( HPoint3 *pt, HLine3 *ln ) { HPlane3 pl; return HLn3IntersectHPt3( ln, pt, &pl ); } static inline int HPt3CoincidentHPt3( HPoint3 *pt1, HPoint3 *pt2 ) { return Hg4Coincident( (Hg4Tensor1Ptr)pt1, (Hg4Tensor1Ptr)pt2 ); } /* * pt2 = pt1 * T */ static inline void HPt3Transform(Transform3 T, HPoint3 *pt1, HPoint3 *pt2) { HPt3Coord x = pt1->x, y = pt1->y, z = pt1->z, w = pt1->w; pt2->x = x*T[0][0] + y*T[1][0] + z*T[2][0] + w*T[3][0]; pt2->y = x*T[0][1] + y*T[1][1] + z*T[2][1] + w*T[3][1]; pt2->z = x*T[0][2] + y*T[1][2] + z*T[2][2] + w*T[3][2]; pt2->w = x*T[0][3] + y*T[1][3] + z*T[2][3] + w*T[3][3]; } static inline int HPt3TransformN(Transform3 T, HPoint3 *pt1, HPoint3 *pt2, int n) { int res = 0; while (--n >= 0) { HPt3Transform(T, pt1++, pt2); if ((pt2++)->w != 1.0) { res = 1; } } return res; } /* * Transform and project an HPoint3 onto a plain Point3. * Transforms pin . T -> pout, * then projects pout.{x,y,z} /= pout.w. * Returns pout.w. */ static inline HPt3Coord HPt3TransPt3( Transform3 T, HPoint3 *pin, Point3 *pout ) { HPoint3 tp; HPt3Transform( T, pin, &tp ); if(tp.w != 1.0 && tp.w != 0.0) { pout->x = tp.x / tp.w; pout->y = tp.y / tp.w; pout->z = tp.z / tp.w; } else { pout->x = tp.x; pout->y = tp.y; pout->z = tp.z; } return tp.w; } /* * Pt3ToHPt4: convert 3-vectors to 4-vectors by padding with 1.0 's. * * Charlie Gunn * Nov 26, 1991: originally written */ static inline void Pt3ToHPt3(Point3 *v3, HPoint3 *v4, int n) { int i; for (i = 0; i < n; ++i) { v4[i].x = v3[i].x; v4[i].y = v3[i].y; v4[i].z = v3[i].z; v4[i].w = 1.0; } } static inline void HPt3ToPt3( HPoint3 *hp, Point3 *p ) { if(hp->w == 1.0 || hp->w == 0.0) { memcpy(p, hp, sizeof(Point3)); } else { p->x = hp->x / hp->w; p->y = hp->y / hp->w; p->z = hp->z / hp->w; } } /* Transform a 4-point to a 3-point according to the mapping defined * in "axes" */ static inline void Pt4ToHPt3(HPoint3 *pt4, int *axes, HPoint3 *hp3) { HPt3Coord *from = (HPt3Coord *)pt4, *to = (HPt3Coord *)hp3; HPoint3 tmp; int i; if (!axes) { if (pt4 != hp3) { hp3->x = pt4->x; hp3->y = pt4->y; hp3->z = pt4->z; } hp3->w = 1.0; return; } if (pt4 == hp3) { tmp = *pt4; from = (HPt3Coord *)&tmp; } for (i = 0; i < 3; i++) { if (axes[i] > 3) { to[i] = 0.0; } else if (axes[i] != -1) { to[i] = from[axes[i]]; } } hp3->w = 1.0; } /* also need an in-place dehomogenization routine which sets the w-coordinate to 1.0, unless the original one is zero */ static inline void HPt3Dehomogenize(HPoint3 *hp1, HPoint3 *hp2) { HPt3Coord inv; if (hp1->w == 1.0 || hp1->w == 0.0) { if (true || hp2 != hp1) *hp2 = *hp1; return; } /* else if ( || hp->w == 0.0) hp->w = .000001;*/ inv = 1.0 / hp1->w; hp2->x = hp1->x * inv; hp2->y = hp1->y * inv; hp2->z = hp1->z * inv; hp2->w = 1.0; } /* Fishy procedure */ static inline void HPt3Dual( HPoint3 *pt, HPlane3 *pl ) { pl->a = pt->x; pl->b = pt->y; pl->c = pt->z; pl->d = pt->w; } static inline void HPt3LinSum (HPt3Coord scale1, HPoint3 *in1, HPt3Coord scale2, HPoint3 *in2, HPoint3 *out) { if ((in1->w == 0) || (in2->w == 0)) { out->w = 0; out->x = scale1 * in1->x + scale2 * in2->x; out->y = scale1 * in1->y + scale2 * in2->y; out->z = scale1 * in1->z + scale2 * in2->z; return; } out->w = 1; out->x = scale1 * (in1->x/in1->w) + scale2 * (in2->x/in2->w); out->y = scale1 * (in1->y/in1->w) + scale2 * (in2->y/in2->w); out->z = scale1 * (in1->z/in1->w) + scale2 * (in2->z/in2->w); } static inline void HPt3LinSumDenorm(HPt3Coord scale1, HPoint3 *in1, HPt3Coord scale2, HPoint3 *in2, HPoint3 *out) { if ((in1->w == 0) || (in2->w == 0)) { out->w = 0; out->x = scale1 * in1->x + scale2 * in2->x; out->y = scale1 * in1->y + scale2 * in2->y; out->z = scale1 * in1->z + scale2 * in2->z; return; } out->w = scale1 * in1->w + scale2 * in2->w; scale1 = scale1 * out->w / in1->w; scale2 = scale2 * out->w / in2->w; out->x = scale1 * in1->x + scale2 * in2->x; out->y = scale1 * in1->y + scale2 * in2->y; out->z = scale1 * in1->z + scale2 * in2->z; } static inline void HPt3SizeOne ( HPoint3 *pt, HPoint3 *out ) { HPt3Coord size; size = sqrt (pt->x * pt->x + pt->y * pt->y + pt->z * pt->z); if (size == 0) return; out->x = pt->x / size; out->y = pt->y / size; out->z = pt->z / size; out->w = 1.; } /* inner product of R4 */ static inline HPt3Coord HPt3R40Dot(HPoint3 *a, HPoint3 *b) { return a->x*b->x + a->y*b->y + a->z*b->z + a->w*b->w; } /* inner product of R(3,1) */ static inline HPt3Coord HPt3R31Dot(HPoint3 *a, HPoint3 *b) { return a->x*b->x + a->y*b->y + a->z*b->z - a->w*b->w; } /* inner product of R(3,0) */ static inline HPt3Coord HPt3R30Dot(HPoint3 *a, HPoint3 *b) { double w2 = a->w*b->w; if (w2 == 1.0 || w2 == 0.0) return a->x*b->x + a->y*b->y + a->z*b->z; else return (a->x*b->x + a->y*b->y + a->z*b->z) / w2; } static inline HPt3Coord HPt3SpaceDot(HPoint3 *a, HPoint3 *b, int space) { switch (space) { case TM_EUCLIDEAN: default: return HPt3R30Dot(a,b); break; case TM_HYPERBOLIC: return HPt3R31Dot(a,b); break; case TM_SPHERICAL: return HPt3R40Dot(a,b); break; } } static inline HPt3Coord HPt3DotPt3(HPoint3 *a, Point3 *b) { HPt3Coord scp; scp = a->x*b->x + a->y*b->y + a->z*b->z; if (a->w != 0 && a->w != 1.0) { return scp / a->w; } else { return scp; } } /* normalize a point a in R4 so that = 1 */ static inline void HPt3R40Normalize(HPoint3 *a) { float len = sqrt( (double)(HPt3R40Dot(a,a)) ); if (len > 0) { len = 1 / len; a->x *= len; a->y *= len; a->z *= len; a->w *= len; } } /* normalize a point a in R(3,1) so that = sign() */ static inline void HPt3R31Normalize(HPoint3 *a) { float len = sqrt( fabs( (double)(HPt3R31Dot(a,a)) ) ); if (len > 0) { len = 1 / len; a->x *= len; a->y *= len; a->z *= len; a->w *= len; } } /* normalize a point a in R(3,0) so that = 1 */ static inline void HPt3R30Normalize(HPoint3 *a) { float len = sqrt( (double)(HPt3R30Dot(a,a)) ); if (len > 0) { len = 1 / len; a->x *= len; a->y *= len; a->z *= len; } } static inline void HPt3SpaceNormalize(HPoint3 *a, int space) { switch (space) { case TM_EUCLIDEAN: default: HPt3R30Normalize(a); break; case TM_HYPERBOLIC: HPt3R31Normalize(a); break; case TM_SPHERICAL: HPt3R40Normalize(a); break; } } static inline HPt3Coord HPt3HypDistance(HPoint3 *a, HPoint3 *b) { float aa, bb, ab; aa = HPt3R31Dot(a,a); bb = HPt3R31Dot(b,b); ab = HPt3R31Dot(a,b); return acosh( fabs(ab / sqrt( aa * bb ) )); } static inline HPt3Coord HPt3Distance(HPoint3 *a, HPoint3 *b) { float dx, dy, dz; float w1w2; w1w2 = a->w * b->w; if( w1w2 == 0. ) return 0.; dx = b->w * a->x - b->x * a->w; dy = b->w * a->y - b->y * a->w; dz = b->w * a->z - b->z * a->w; return (sqrt( dx*dx + dy*dy + dz*dz )) / w1w2; } static inline HPt3Coord HPt3SphDistance(HPoint3 *a, HPoint3 *b) { return acos( HPt3R40Dot(a,b) / sqrt( HPt3R40Dot(a,a) * HPt3R40Dot(b,b) ) ); } static inline HPt3Coord HPt3SpaceDistance(HPoint3 *a, HPoint3 *b, int space) { switch (space) { case TM_EUCLIDEAN: default: return HPt3Distance(a,b); break; case TM_HYPERBOLIC: return HPt3HypDistance(a,b); break; case TM_SPHERICAL: return HPt3SphDistance(a,b); break; } } static inline void HPt3Sub(HPoint3 *a, HPoint3 *b, HPoint3 *aminusb) { aminusb->x = a->x - b->x; aminusb->y = a->y - b->y; aminusb->z = a->z - b->z; aminusb->w = a->w - b->w; } static inline void HPt3Scale(HPt3Coord s, HPoint3 *a, HPoint3 *sa) { sa->x = s * a->x; sa->y = s * a->y; sa->z = s * a->z; sa->w = s * a->w; } static inline void HPt3GramSchmidt(HPoint3 *base, HPoint3 *v) { HPt3SpaceGramSchmidt(base, v, TM_EUCLIDEAN); } static inline void HPt3HypGramSchmidt(HPoint3 *base, HPoint3 *v) { HPt3SpaceGramSchmidt(base, v, TM_HYPERBOLIC); } static inline void HPt3SphGramSchmidt(HPoint3 *base, HPoint3 *v) { HPt3SpaceGramSchmidt(base, v, TM_SPHERICAL); } /* Modifies v to arrange that = 0, i.e. v is a tangent vector based at base */ static inline void HPt3SpaceGramSchmidt(HPoint3 *base, HPoint3 *v, int space) { HPt3Coord d,e; HPoint3 tmp; d = HPt3SpaceDot(base,v,space); e = HPt3SpaceDot(base,base,space); if (e == 0.0) { fprintf(stderr, "GramSchmidt: invalid base point.\n"); e = 1.0; } HPt3Scale((HPt3Coord)(d / e), base, &tmp); HPt3Sub(v, &tmp, v); } #if 0 /* This stuff doesn't compile yet; in progress: */ static inline HPt3Coord HPt3Angle(HPoint3 *base, HPoint3 *v1, HPoint3 *v2) { /* * I'm not sure that this will work in the euclidean case!!! mbp */ return HPt3SpaceAngle(base, v1, v2, TM_EUCLIDEAN); } static inline HPt3Coord HPt3HypAngle(HPoint3 *base, HPoint3 *v1, HPoint3 *v2) { return HPt3SpaceAngle(base, v1, v2, TM_HYPERBOLIC); } static inline HPt3Coord HPt3SphAngle(HPoint3 *base, HPoint3 *v1, HPoint3 *v2) { return HPt3SpaceAngle(base, v1, v2, TM_SPHERICAL); } static inline HPt3Coord HPt3SpaceAngle(HPoint3 *base, HPoint3 *v1, HPoint3 *v2, int space) { double d, n; HPoint3 v1n = *v1; HPoint3 v2n = *v2; HPt3SpaceGramSchmidt(base, &v1n, space); HPt3SpaceGramSchmidt(base, &v2n, space); d = HPt3SpaceDot(&v1n,&v1n,space) * HPt3SpaceDot(&v2n,&v2n,space); if (d <= 0.0) { fprintf(stderr,"HPt3SpaceAngle: invalid denominator\n"); return 0.0; } n = HPt3SpaceDot(&v1n, &v2n, space); return acos( n / sqrt(d) ); } #endif static inline void HPt3SubPt3(HPoint3 *p1, HPoint3 *p2, Point3 *v) { if (p1->w == p2->w) { v->x = p1->x - p2->x; v->y = p1->y - p2->y; v->z = p1->z - p2->z; } else if (p1->w == 0) { *v = *(Point3 *)p1; return; } else if (p2->w == 0) { *v = *HPoint3Point3(p2); Pt3Mul(-1.0, v, v); return; } else { HPt3Coord s = p2->w / p1->w; v->x = p1->x*s - p2->x; v->y = p1->y*s - p2->y; v->z = p1->z*s - p2->z; } if(p2->w != 1.0 && p2->w != 0.0) v->x /= p2->w, v->y /= p2->w, v->z /= p2->w; } /* assume that min and max are dehomogenized */ static inline void HPt3MinMax(HPoint3 *min, HPoint3 *max, HPoint3 *other) { HPt3Coord oc = other->w; if (oc == 0.0) { oc = 1.0; } if(oc * min->x > other->x) min->x = other->x / oc; else if(oc * max->x < other->x) max->x = other->x / oc; if(oc * min->y > other->y) min->y = other->y / oc; else if(oc * max->y < other->y) max->y = other->y / oc; if(oc * min->z > other->z) min->z = other->z / oc; else if(oc * max->z < other->z) max->z = other->z / oc; } static inline void Pt3MinMax(HPoint3 *min, HPoint3 *max, HPoint3 *other) { if(min->x > other->x) min->x = other->x; else if(max->x < other->x) max->x = other->x; if(min->y > other->y) min->y = other->y; else if(max->y < other->y) max->y = other->y; if(min->z > other->z) min->z = other->z; else if(max->z < other->z) max->z = other->z; } static inline void Pt4MinMax(HPoint3 *min, HPoint3 *max, HPoint3 *other) { if(min->x > other->x) min->x = other->x; else if(max->x < other->x) max->x = other->x; if(min->y > other->y) min->y = other->y; else if(max->y < other->y) max->y = other->y; if(min->z > other->z) min->z = other->z; else if(max->z < other->z) max->z = other->z; if(min->w > other->w) min->w = other->w; else if(max->w < other->w) max->w = other->w; } #endif /* _GV_HPOINT3_H_ */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/geometry/hpoint3/line.h0000644000175000017500000000322312310110200016121 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef LINEDEFS #define LINEDEFS #include "hline3.h" typedef HLine3 Line; #define LnCreate HLn3Create #define LnDelete HLn3Delete #define LnPrint HLn3Print #define LnCopy HLn3Copy #define LnFrom2Pts HLn3From2HPt3s #define LnFrom2Pls HLn3From2HPl3s #define LnUndefined HLn3Undefined #define LnInfinity HLn3Infinity #define LnCompare HLn3Compare #define LnCoincidentPt HLn3CoincidentHPt3 #define LnCoincidentLn HLn3CoincidentHLn3 #define LnCoincidentPl HLn3CoincidentHPl3 #define LnTransform HLn3Transform #define LnIntersectPt HLn3IntersectHPt3 #define LnIntersectPl HLn3IntersectHPl3 #define LnIntersectLn HLn3IntersectHLn3 #define LnDual HLn3Dual #define LnPerp HLn3Perp #endif geomview-1.9.5/src/lib/geometry/hpoint3/plane.h0000644000175000017500000000351312310110200016273 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef PLANEDEFS #define PLANEDEFS #include "hplane3.h" typedef HPlane3 Plane; #define PlCreate HPl3Create #define PlDelete HPl3Delete #define PlPrint HPl3Print #define PlCopy HPl3Copy #define PlFrom HPl3From #define PlFrom3Pls HPl3From3HPl3s #define PlFrom2Lns HPl3From2HLn3s #define PlIntersectPl HPl3IntersectHPl3 #define PlPencil HPl3Pencil #define PlDotPt HPl3DotHPt3 /* Not used? mbp Tue May 16 16:51:40 2000 */ /*#define PlNormalize HPl3Normalize*/ #define PlUndefined HPl3Undefined #define PlInfinity HPl3Infinity #define PlCompare HPl3Compare #define PlCoincidentPl HPl3CoincidentHPl3 #define PlCoincidentLn HPl3CoincidentHLn3 #define PlCoincidentPl HPl3CoincidentHPl3 #define PlTransform HPl3Transform #define PlTransformN HPl3TransformN #define PlDual HPl3Dual #define PlIdeal HPl3Ideal #define PlPerp HPl3Perp #define PlAngle HPl3Angle #endif geomview-1.9.5/src/lib/geometry/hpoint3/point.h0000644000175000017500000000344712310110200016333 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef POINTDEFS #define POINTDEFS #include "hpoint3.h" typedef HPoint3 Point; #define PtCreate HPt3Create #define PtDelete HPt3Delete #define PtPrint HPt3Print #define PtCopy HPt3Copy #define PtFrom HPt3From #define PtFrom3Pls HPt3From3HPl3s #define PtFrom2Lns HPt3From2HLn3s #define PtIntersectPt HPt3IntersectHPt3 #define PtPencil HPt3Pencil #define PtDotPl HPt3DotHPl3 #define PtNormalize HPt3Normalize #define PtUndefined HPt3Undefined #define PtInfinity HPt3Infinity #define PtCompare HPt3Compare #define PtCoincidentPt HPt3CoincidentHPt3 #define PtCoincidentLn HPt3CoincidentHLn3 #define PtCoincidentPl HPt3CoincidentHPl3 #define PtTransform HPt3Transform #define PtTransformN HPt3TransformN #define PtDistance HPt3Distance #define PtDual HPt3Dual #define PtLinSum HPt3LinSum #define PtSizeOne HPt3SizeOne #endif geomview-1.9.5/src/lib/geometry/hpoint3/tolerance.h0000644000175000017500000000241612310110200017151 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GV_TOLERANVE_H_ # define _GV_TOLERANVE_H_ /* FLT_EPSILON: 1.19209290e-7F */ # define TOLERANCE 1e-6 # define fneg(a) ((a)<-TOLERANCE) # define fpos(a) ((a)> TOLERANCE) # define fzero(a) (((a)-TOLERANCE)) # define fz(a) fzero(a) # define fnz(a) (!fzero(a)) #endif geomview-1.9.5/src/lib/geometry/hpointn/0000755000175000017500000000000012310165601015213 500000000000000geomview-1.9.5/src/lib/geometry/hpointn/Makefile.in0000644000175000017500000003322012310165553017206 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry/hpointn DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers hpointn.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/hpointn/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/hpointn/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am #noinst_LTLIBRARIES = libhpointn.la # #libhpointn_la_SOURCES = hpointn.h # 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: geomview-1.9.5/src/lib/geometry/hpointn/Makefile.am0000644000175000017500000000021012310110200017141 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers hpointn.h #noinst_LTLIBRARIES = libhpointn.la # #libhpointn_la_SOURCES = hpointn.h geomview-1.9.5/src/lib/geometry/hpointn/Headers0000644000175000017500000000001212310110200016403 00000000000000hpointn.h geomview-1.9.5/src/lib/geometry/hpointn/hpointn.h0000644000175000017500000005670112310110200016755 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, * Mark Phillips, Claus-Justus Heine */ #ifndef _GV_HPOINTN_H_ #define _GV_HPOINTN_H_ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include #include "geomtypes.h" #include "freelist.h" extern DEF_FREELIST(HPointN); static inline HPointN *HPtNCreate(int dim, const HPtNCoord *vec); static inline void HPtNDelete(HPointN *pt); static inline HPointN *HPtNCopy(const HPointN *pt1, HPointN *pt2); static inline HPointN *Pt4ToHPtN(const HPoint3 *v4, HPointN *vN); static inline HPointN *Pt3ToHPtN(Point3 *v3, HPointN *vN); static inline HPointN *HPt3ToHPtN(const HPoint3 *v4, int *perm, HPointN *vN); static inline HPoint3 *HPtNToHPt3(const HPointN *from, int *axes, HPoint3 *hp3); static inline HPointN *HPtNPad(const HPointN *pt1, int dim2, HPointN *pt2); static inline HPointN *HPtNAdd(const HPointN *pt1, const HPointN *pt2, HPointN *sum); static inline int HPtNSpace(const HPointN *pt); static inline HPointN *HPtNSetSpace(HPointN *pt, int space); static inline HPointN *HPtNComb(HPtNCoord s1, const HPointN *pt1, HPtNCoord s2, const HPointN *pt2, HPointN *sum); static inline HPtNCoord HPtNDot(const HPointN *p1, const HPointN *p2); static inline HPtNCoord HPtNDehomogenize(const HPointN *from, HPointN *to); static inline HPointN *HPtNTransform3(Transform3 T, int *perm, const HPointN *from, HPointN *to); static inline HPointN *HPtNTransform(const TransformN *T, const HPointN *from, HPointN *to); static inline HPointN *HPtNTTransform(const TransformN *T, const HPointN *from, HPointN *to); static inline HPoint3 *HPtNTransProj(const TransformN *T, const HPointN *from, HPoint3 *result); static inline HPoint3 *HPtNTransformComponents(const TransformN *T, const HPointN *from, int *perm, HPoint3 *results); static inline HPointN *HPt3NTransform(const TransformN *T, const HPoint3 *from, HPointN *to); static inline HPointN *Pt4NTransform(const TransformN *T, const HPoint3 *from, HPointN *to); static inline HPt3Coord HPtNNTransPt3(TransformN *TN, int *axes, const HPointN *ptN, Point3 *result); static inline HPt3Coord HPt3NTransPt3(TransformN *TN, int *axes, const HPoint3 *hpt4, int v4d, Point3 *result); static inline void HPt3NTransHPt3(TransformN *TN, int *axes, const HPoint3 *hpt4, int v4d, HPoint3 *result); static inline void HPtNMinMax(HPointN *min, HPointN *max, HPointN *other); #include "transform3.h" #ifndef max # define _gv_hptn_max_ # define max(a,b) ((a) > (b) ? (a) : (b)) #endif #ifndef min # define _gv_hptn_min_ # define min(a,b) ((a) < (b) ? (a) : (b)) #endif static inline void HPtNFreeListPrune(void) { FreeListNode *old; HPointN *oldpt; size_t size = 0; while (HPointNFreeList) { old = HPointNFreeList; HPointNFreeList = old->next; oldpt = (HPointN *)old; if (oldpt->size && oldpt->v) { OOGLFree(oldpt->v); size += oldpt->size * sizeof(HPtNCoord); } OOGLFree(old); size += sizeof(HPointN); } OOGLWarn("Freed %ld bytes.\n", size); } static inline HPointN * HPtNCreate(int dim, const HPtNCoord *vec) { HPointN *pt; FREELIST_NEW(HPointN, pt); if(dim <= 0) { dim = 1; } pt->dim = dim; pt->flags = 0; /* for now */ if (pt->size < dim) { pt->v = OOGLRenewNE(HPtNCoord, pt->v, dim, "new HPointN data"); pt->size = dim; } if(vec == NULL) { memset(pt->v+1, 0, (dim-1)*sizeof(HPtNCoord)); pt->v[0] = 1.0; } else { memcpy(pt->v, vec, dim*sizeof(HPtNCoord)); } return pt; } static inline void HPtNDelete(HPointN *pt) { if(pt) { /* if(pt->v) OOGLFree(pt->v); */ FREELIST_FREE(HPointN, pt); } } static inline HPointN * HPtNCopy(const HPointN *pt1, HPointN *pt2) { if(pt2 == NULL) { pt2 = HPtNCreate(pt1->dim, pt1->v); } else { if(pt2->dim != pt1->dim) { pt2->v = OOGLRenewNE(HPtNCoord, pt2->v, pt1->dim, "renew HPointN"); pt2->dim = pt1->dim; } memcpy(pt2->v, pt1->v, pt1->dim*sizeof(HPtNCoord)); } return pt2; } /* Convert a HPoint3 into a HPointN while interpreting the HPoint3 as * a 4-point. This means that we do NOT perfom dehomogenization here. */ static inline HPointN * Pt4ToHPtN(const HPoint3 *v4, HPointN *vN) { int i; if (!vN) { vN = HPtNCreate(5, NULL); } else if (vN->dim < 5) { vN->v = OOGLRenewNE(HPtNCoord, vN->v, 5, "renew HPointN"); vN->dim = 5; } vN->v[0] = 1.0; for (i = 0; i < 4; ++i) { vN->v[i+1] = ((HPt3Coord *)v4)[i]; } for (++i; i < vN->dim; i++) { vN->v[i] = 0.0; } return vN; } /* Convert a Point3 into a HPointN */ static inline HPointN * Pt3ToHPtN(Point3 *v3, HPointN *vN) { int i; if (!vN) { vN = HPtNCreate(4, NULL); } else if (vN->dim < 4) { vN->v = OOGLRenewNE(HPtNCoord, vN->v, 4, "renew HPointN"); vN->dim = 5; } vN->v[0] = 1.0; for (i = 0; i < 3; ++i) { vN->v[i+1] = ((HPt3Coord *)v3)[i]; } for (++i; i < vN->dim; i++) { vN->v[i] = 0.0; } return vN; } /* Convert a HPoint3 into a HPointN while interpreting the HPoint3 as * a 3-point. The homogeneous component of v4 is moved to vN->v[0]. */ static inline HPointN * HPt3ToHPtN(const HPoint3 *v4, int *perm, HPointN *vN) { const int d3 = 4; int i; int perm_dim; if (!perm) { perm_dim = 4; } else { perm_dim = perm[0]; for (i = 0; i < d3; i++) { perm_dim = max(perm[i], perm_dim); } ++perm_dim; } if (!vN) { vN = HPtNCreate(perm_dim, NULL); } else if (vN->dim < perm_dim) { vN->v = OOGLRenewNE(HPtNCoord, vN->v, perm_dim, "renew HPointN"); vN->dim = perm_dim; } if (!perm) { vN->v[0] = v4->w; vN->v[1] = v4->x; vN->v[2] = v4->y; vN->v[3] = v4->z; for (i = 4; i < vN->dim; i++) { vN->v[i] = 0.0; } } else { memset(vN->v, 0, vN->dim*sizeof(HPtNCoord)); for (i = 0; i < d3; i++) { vN->v[perm[i]] = ((HPt3Coord *)v4)[i]; } } return vN; } /* Transform a 4-point to a 3-point according to the mapping defined * in "axes". */ static inline HPoint3 * HPtNToHPt3(const HPointN *from, int *axes, HPoint3 *hp3) { HPt3Coord *to = (HPt3Coord *)hp3; int i, dim = from->dim; if (!axes) { hp3->w = from->v[0]; hp3->x = from->v[1]; hp3->y = from->v[2]; hp3->z = from->v[3]; } else { for (i = 0; i < 4; i++) { if (axes[i] > dim-1) { to[i] = 0.0; } else { to[i] = from->v[axes[i]]; } } } return hp3; } /* Copy pt1 to pt2 and make sure that pt2 has dimension dim2. If * pt1->dim < dim2, then pt1 is implicitly padded with zeros. */ static inline HPointN * HPtNPad(const HPointN *pt1, int dim2, HPointN *pt2) { int dim1 = pt1->dim; if( dim2 < 1 ) { /* Uhh? */ return(NULL); } if(pt1 == NULL) { pt2 = HPtNCreate(dim2, NULL); return pt2; } if(pt1 != pt2) { if(pt2 == NULL) { pt2 = HPtNCreate(dim2,NULL); } else if (pt2->dim != dim2) { pt2->v = OOGLRenewNE(HPtNCoord, pt2->v, dim2, "renew HPointN"); pt2->dim = dim2; } if (dim1 <= dim2) { memcpy(pt2->v, pt1->v, dim1* sizeof(HPtNCoord)); memset(pt2->v+dim1, 0, (dim2-dim1)*sizeof(HPtNCoord)); } else { memcpy(pt2->v, pt1->v, dim2*sizeof(HPtNCoord)); } } else { /* now that the homogeneous component is at 0 this is a simple * padding operation. */ if (pt2->dim != dim2) { pt2->v = OOGLRenewNE(HPtNCoord, pt2->v, dim2, "renew HPointN"); } if (dim2 > pt2->dim) { memset(pt2->v+pt2->dim, 0, (dim2-pt2->dim)*sizeof(HPtNCoord)); } } return pt2; } /* Add two HPointN's */ static inline HPointN * HPtNAdd(const HPointN *pt1, const HPointN *pt2, HPointN *sum) { int dim1 = pt1->dim, dim2 = pt2->dim; HPtNCoord c1 = pt1->v[0], c2 = pt2->v[0]; int i; if (dim1 == dim2) { if (sum == NULL) { sum = HPtNCreate(dim1, NULL); } else if(sum->dim < dim1) { sum->v = OOGLRenewNE(HPtNCoord, sum->v, dim1, "renew HPointN"); sum->dim = dim1; } sum->v[0] = c1*c2; for (i = 1; i < dim1; i++) { sum->v[i] = c2*pt1->v[i] + c1*pt2->v[i]; } } else { /* make sure pt1 is the larger one */ if (dim1 < dim2) { const HPointN *swap = pt1; pt1 = pt2; pt2 = swap; dim2 = dim1; dim1 = pt1->dim; } if (sum == NULL) { sum = HPtNCreate(dim1,NULL); } else if(sum->dim < dim1) { sum->v = OOGLRenewNE(HPtNCoord, sum->v, dim1, "renew HPointN"); sum->dim = dim1; } sum->v[0] = c1*c2; for (i = 1; i < dim2; i++) { sum->v[i] = c2*pt1->v[i] + c1*pt2->v[i]; } for (; i < dim1; i++) { sum->v[i] = c2*pt1->v[i]; } } return sum; } /* Space */ static inline int HPtNSpace(const HPointN *pt) { (void)pt; return TM_EUCLIDEAN; } static inline HPointN * HPtNSetSpace(HPointN *pt, int space) { if (space != TM_EUCLIDEAN) { OOGLError(1, "Non-Euclidean space not support in higher dimensions.\n"); return NULL; } return pt; } /* Linear combination */ static inline HPointN * HPtNComb(HPtNCoord s1, const HPointN *pt1, HPtNCoord s2, const HPointN *pt2, HPointN *sum) { int dim1 = pt1->dim, dim2 = pt2->dim; HPtNCoord c1 = pt1->v[0], c2 = pt2->v[0]; int i; if (dim1 == dim2) { if (sum == NULL) { sum = HPtNCreate(dim1, NULL); } else if(sum->dim < dim1) { sum->v = OOGLRenewNE(HPtNCoord, sum->v, dim1, "renew HPointN"); sum->dim = dim1; } sum->v[0] = c1*c2; for (i = 1; i < dim1; i++) { sum->v[i] = c2*s1*pt1->v[i] + c1*s2*pt2->v[i]; } } else { /* make sure pt1 is the larger one */ if (dim1 < dim2) { const HPointN *swap = pt1; pt1 = pt2; pt2 = swap; dim2 = dim1; dim1 = pt1->dim; } if (sum == NULL) { sum = HPtNCreate(dim1,NULL); } else if(sum->dim < dim1) { sum->v = OOGLRenewNE(HPtNCoord, sum->v, dim1, "renew HPointN"); sum->dim = dim1; } sum->v[0] = c1*c2; for (i = 1; i < dim2; i++) { sum->v[i] = c2*s1*pt1->v[i] + c1*s2*pt2->v[i]; } for (; i < dim1; i++) { sum->v[i] = c2*s1*pt1->v[i]; } } return sum; } /* Dot product of two vectors */ static inline HPtNCoord HPtNDot(const HPointN *p1, const HPointN *p2) { HPtNCoord result; int i; int dim = p1->dim; if (p2->dim < dim) { dim = p2->dim; } result = 0; for(i = 1; i< dim; i++) result += p1->v[i] * p2->v[i]; return result / (p1->v[0] * p2->v[0]); } /* Dehomogenize */ static inline HPtNCoord HPtNDehomogenize(const HPointN *from, HPointN *to) { int dim = from->dim; HPtNCoord c = from->v[0], inv = 1.0 / c; int i; if (c == 1.0 || c == 0.0) { if (from != to) { HPtNCopy(from, to); } return (HPtNCoord)0.0; } if (to == NULL) { to = HPtNCreate(dim, NULL); } else if (to->dim != dim) { to->v = OOGLRenewNE(HPtNCoord, to->v, dim, "renew HPointN"); to->dim = dim; } for( i=1; i < dim; i++) to->v[i] = from->v[i] * inv; to->v[0] = 1.0; return c; } /* Transform an HPointN according to a 3d transform acting only on the * sub-space defined by "axes". The standard axes should look like * {dx,dy,dz,0} because the homogeneous divisor of HPoint3's is * located at index 3. */ static inline HPointN * HPtNTransform3(Transform3 T, int *perm, const HPointN *from, HPointN *to) { const int d3 = 4; int i; HPoint3 from3; HPt3Coord *from3data = HPoint3Data(&from3); int perm_dim; if (!perm) { perm_dim = 4; } else { perm_dim = perm[0]; for (i = 0; i < d3; i++) { perm_dim = max(perm[i], perm_dim); } ++perm_dim; } HPtNToHPt3(from, perm, &from3); HPt3Transform(T, &from3, &from3); if (from->dim < perm_dim) { to = HPtNPad(from, perm_dim, to); } else { to = HPtNCopy(from, to); } if (perm) { for (i = 0; i < 4; i++) { to->v[perm[i]] = from3data[i]; } } else { to->v[0] = from3data[3]; to->v[1] = from3data[0]; to->v[2] = from3data[1]; to->v[3] = from3data[2]; } return to; } /* Apply a TransformN to an HPointN. * * If from->dim < T->idim, then from is implicitly padded with zeros, * if from->dim > T->idim, then T is interpreted as identity on the * sub-space defined by T->idim < idx < T->odim, the remaining input * components are mapped to zero. */ static inline HPointN * HPtNTransform(const TransformN *T, const HPointN *from, HPointN *to) { int idim, odim, dim = from->dim; int i, j; VARARRAY(vspace, HPtNCoord, dim); HPtNCoord *v; if (!T) { return HPtNCopy(from, to); } idim = T->idim; odim = T->odim; if (from == to) { v = vspace; for (i = 0; i < dim; i++) { v[i] = from->v[i]; } } else { v = from->v; } if(to == NULL) { to = HPtNCreate(odim, NULL); } else if (to->dim != odim) { to->v = OOGLRenewNE(HPtNCoord, to->v, odim, "renew HPointN"); to->dim = odim; } if (idim == dim) { /* the easy case */ for (i = 0; i < odim; i++) { to->v[i] = 0; for (j = 0; j < idim; j++) { to->v[i] += v[j] * T->a[j*odim+i]; } } } else if (idim > dim) { /* pad with zeroes, the homogeneous component sits at index zero and is automatically handled correctly. */ for(i = 0; i < odim; i++) { to->v[i] = 0; for (j = 0; j < dim; j++) { to->v[i] += v[j] * T->a[j*odim+i]; } } } else { /* obviously the case idim < dim */ /* implicitly pad the matrix, i.e. T acts as unity on the missing * dimens+ions. */ for (i = 0; i < odim; i++) { to->v[i] = 0; for (j = 0; j < idim; j++) { to->v[i] += v[j] * T->a[j*odim+i]; } if (i >= idim && i < dim) { to->v[i] += v[i]; } } } return to; } /* Apply the transpose of a TransformN to an HPointN. * * If from->dim < T->odim, then form is implicitly padded with zeros, * if from->dim > T->odim, then T is interpreted as identity on the * sub-space defined by T->odim < idx < T->idim, the remaining input * components are mapped to zero. */ static inline HPointN * HPtNTTransform(const TransformN *T, const HPointN *from, HPointN *to) { int idim, odim, dim = from->dim; int i, j; VARARRAY(vspace, HPtNCoord, dim); HPtNCoord *v; if (!T) { return HPtNCopy(from, to); } idim = T->idim; odim = T->odim; if (from == to) { v = vspace; for (i = 0; i < dim; i++) { v[i] = from->v[i]; } } else { v = from->v; } if(to == NULL) { to = HPtNCreate(odim, NULL); } else if (to->dim != idim) { to->v = OOGLRenewNE(HPtNCoord, to->v, idim, "renew HPointN"); to->dim = idim; } if (odim == dim) { /* the easy case */ for (i = 0; i < idim; i++) { to->v[i] = 0; for (j = 0; j < odim; j++) { to->v[i] += v[j] * T->a[i*odim+j]; } } } else if (odim > dim) { /* pad with zeroes, the homogeneous component sits at index zero and is automatically handled correctly. */ for(i = 0; i < idim; i++) { to->v[i] = 0; for (j = 0; j < dim; j++) { to->v[i] += v[j] * T->a[i*odim+j]; } } } else { /* obviously the case odim < dim */ /* implicitly pad the matrix, i.e. T acts as unity on the missing * dimens+ions. */ for (i = 0; i < idim; i++) { to->v[i] = 0; for (j = 0; j < odim; j++) { to->v[i] += v[j] * T->a[i*odim+j]; } if (i >= odim && i < dim) { to->v[i] += v[i]; } } } return to; } /* A short and efficient routine. This routine assumes that T is the * result of a call to TmNProject() and is therefor non-NULL. "from" * may have more or less dimensions than T->idim, it is padded with * zeroes or truncated as necessary. from must have dimension 1 at * least. * * T already contains all necessary permutations and the projection to * map "from" to result "properly". */ static inline HPoint3 * HPtNTransProj(const TransformN *T, const HPointN *from, HPoint3 *result) { HPtNCoord *v = from->v; int idim; const int odim = 4; /* must be 4 */ int i; idim = T->idim > from->dim ? from->dim : T->idim; result->x = v[0] * T->a[0*odim+0]; result->y = v[0] * T->a[0*odim+1]; result->z = v[0] * T->a[0*odim+2]; result->w = v[0] * T->a[0*odim+3]; for (i = 1; i < idim; i++) { result->x += v[i] * T->a[i*odim+0]; result->y += v[i] * T->a[i*odim+1]; result->z += v[i] * T->a[i*odim+2]; result->w += v[i] * T->a[i*odim+3]; } return result; } /* Transform p by T and then project to the sub-space defined by * "perm". */ static inline HPoint3 * HPtNTransformComponents(const TransformN *T, const HPointN *from, int *perm, HPoint3 *results) { int idim = T->idim, odim = T->odim, dim = from->dim; int i, j, k; HPt3Coord *res = (HPt3Coord *)results; if (idim == dim) { /* the easy case */ for (k = 0; k < 4; k++) { i = perm[k]; if (i > odim) continue; res[k] = 0; for (j = 0; j < idim; j++) { res[k] += from->v[j] * T->a[j*odim+i]; } } } else if (idim > dim) { /* pad with zeroes, the homogeneous component sits at index zero and is automatically handled correctly. */ for (k = 0; k < 4; k++) { i = perm[k]; if (i > odim) continue; res[k] = 0; for (j = 0; j < dim; j++) { res[k] += from->v[j] * T->a[j*odim+i]; } } } else { /* obviously the case idim < dim */ /* implicitly pad the matrix, i.e. T acts as unity on the missing * dimens+ions. */ for (k = 0; k < 4; k++) { i = perm[k]; if (i > odim) continue; res[k] = 0; for (j = 0; j < idim; j++) { res[k] += from->v[j] * T->a[j*odim+i]; } if (i >= idim && i < dim) { res[k] += from->v[i]; } } } return results; } static inline HPointN * HPt3NTransform(const TransformN *T, const HPoint3 *from, HPointN *to) { int idim, odim; int i, j; HPtNCoord *v; if (!T) { return HPt3ToHPtN(from, NULL, to); } v = (HPtNCoord *)from; idim = T->idim; odim = T->odim; if(to == NULL) { to = HPtNCreate(odim, NULL); } else if (to->dim != odim) { to->v = OOGLRenewNE(HPtNCoord, to->v, odim, "renew HPointN"); to->dim = odim; } if (idim == 4) { /* the easy case */ for (i = 0; i < odim; i++) { to->v[i] = 0; for (j = 0; j < idim; j++) { to->v[i] += v[(j+3)%4] * T->a[j*odim+i]; } } } else if (idim > 4) { /* pad with zeroes, the homogeneous component sits at index zero and is automatically handled correctly. */ for(i = 0; i < odim; i++) { to->v[i] = 0; for (j = 0; j < 4; j++) { to->v[i] += v[(j+3)%4] * T->a[j*odim+i]; } } } else { /* obviously the case idim < dim */ /* implicitly pad the matrix, i.e. T acts as unity on the missing * dimens+ions. */ for (i = 0; i < odim; i++) { to->v[i] = 0; for (j = 0; j < idim; j++) { to->v[i] += v[(j+3) % 4] * T->a[j*odim+i]; } if (i >= idim && i < 4) { to->v[i] += v[i]; } } } return to; } static inline HPointN * Pt4NTransform(const TransformN *T, const HPoint3 *from, HPointN *to) { int idim, odim; int i, j; HPtNCoord *v; if (!T) { return Pt4ToHPtN(from, to); } v = (HPtNCoord *)from; idim = T->idim; odim = T->odim; if(to == NULL) { to = HPtNCreate(odim, NULL); } else if (to->dim != odim) { to->v = OOGLRenewNE(HPtNCoord, to->v, odim, "renew HPointN"); to->dim = odim; } if (idim == 5) { /* the easy case */ for (i = 0; i < odim; i++) { to->v[i] = T->a[i]; for (j = 1; j < idim; j++) { to->v[i] += v[j-1] * T->a[j*odim+i]; } } } else if (idim > 5) { /* pad with zeroes, the homogeneous component sits at index zero and is automatically handled correctly. */ for(i = 0; i < odim; i++) { to->v[i] = T->a[i]; for (j = 1; j < 5; j++) { to->v[i] += v[j-1] * T->a[j*odim+i]; } } } else { /* obviously the case idim < dim */ /* implicitly pad the matrix, i.e. T acts as unity on the missing * dimens+ions. */ for (i = 0; i < odim; i++) { to->v[i] = T->a[i]; for (j = 0; j < idim; j++) { to->v[i] += v[j-1] * T->a[j*odim+i]; } if (i >= idim && i < 5) { to->v[i] += v[i-1]; } } } return to; } static inline HPt3Coord HPtNNTransPt3(TransformN *TN, int *axes, const HPointN *ptN, Point3 *result) { HPoint3 tmp; HPtNTransformComponents(TN, ptN, axes, &tmp); result->x = tmp.x / tmp.w; result->y = tmp.y / tmp.w; result->z = tmp.z / tmp.w; return tmp.w; } static inline HPt3Coord HPt3NTransPt3(TransformN *TN, int *axes, const HPoint3 *hpt4, int v4d, Point3 *result) { HPointN *tmp; HPt3Coord retval; /* axes[3] should be 0 */ if (v4d) { tmp = Pt4NTransform(TN, hpt4, NULL); } else { tmp = HPt3NTransform(TN, hpt4, NULL); } result->x = tmp->v[axes[0]] / tmp->v[axes[3]]; result->y = tmp->v[axes[1]] / tmp->v[axes[3]]; result->z = tmp->v[axes[2]] / tmp->v[axes[3]]; retval = tmp->v[axes[3]]; HPtNDelete(tmp); return retval; } static inline void HPt3NTransHPt3(TransformN *TN, int *axes, const HPoint3 *hpt4, int v4d, HPoint3 *result) { HPointN *tmp; if (v4d) { tmp = Pt4NTransform(TN, hpt4, NULL); } else { tmp = HPt3NTransform(TN, hpt4, NULL); } result->w = tmp->v[axes[3]]; result->x = tmp->v[axes[0]]; result->y = tmp->v[axes[1]]; result->z = tmp->v[axes[2]]; HPtNDelete(tmp); } /* Utility function for bounding box computations. We assume that min * and max are dehomogenized (third part of the #if clause below), and * that they are large enough (min->dim >= other->dim <= max->dim) */ static inline void HPtNMinMax(HPointN *min, HPointN *max, HPointN *other) { #if 0 int i; for (i = 1; i < other->dim; i++) { if (min->v[i] > other->v[i]) { min->v[i] = other->v[i]; } else if (max->v[i] < other->v[i]) { max->v[i] = other->v[i]; } } #elif 0 int i; HPtNCoord c = min->v[0], C = max->v[0], oc = other->v[0]; for (i = 1; i < other->dim; i++) { if (oc * min->v[i] > c * other->v[i]) { min->v[i] = other->v[i] * c / oc ; } else if (oc * max->v[i] < C * other->v[i]) { max->v[i] = other->v[i] * C / oc; } } #else int i; HPtNCoord oc = other->v[0]; for (i = 1; i < other->dim; i++) { if (oc * min->v[i] > other->v[i]) { min->v[i] = other->v[i] / oc ; } else if (oc * max->v[i] < other->v[i]) { max->v[i] = other->v[i] / oc; } } #endif } #ifdef _gv_hptn_max_ # undef max #endif #ifdef _gv_hptn_min_ # undef min #endif #endif /* _GV_HPOINTN_H_ */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/geometry/point3/0000755000175000017500000000000012310165601014750 500000000000000geomview-1.9.5/src/lib/geometry/point3/Makefile.in0000644000175000017500000004604612310165553016755 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry/point3 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libpoint3_la_LIBADD = am_libpoint3_la_OBJECTS = polyint.lo segments.lo libpoint3_la_OBJECTS = $(am_libpoint3_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libpoint3_la_SOURCES) DIST_SOURCES = $(libpoint3_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libpoint3.la libpoint3_la_SOURCES = polyint.c segments.c point3.h polyint.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/point3/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/point3/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libpoint3.la: $(libpoint3_la_OBJECTS) $(libpoint3_la_DEPENDENCIES) $(EXTRA_libpoint3_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libpoint3_la_OBJECTS) $(libpoint3_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polyint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/segments.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/geometry/point3/Makefile.am0000644000175000017500000000022712310110200016706 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libpoint3.la libpoint3_la_SOURCES = polyint.c segments.c point3.h polyint.h geomview-1.9.5/src/lib/geometry/point3/polyint.c0000644000175000017500000002256012310110200016520 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "point3.h" #include "transform.h" #include "ooglutil.h" #include "polyint.h" #define FUDGE2 1.e-12 #define PT3SUB_XY(a, b, dst) { (dst).x = (a).x - (b).x; \ (dst).y = (a).y - (b).y; \ (dst).z = (a).z - (b).z; } #define PT3LENGTH_XY(a) sqrt((a).x*(a).x + (a).y*(a).y) #define PT3DOT_XY(a, b) ((a).x*(b).x + (a).y*(b).y) struct PolyHit { Point3 hitpt; int vno; int edgevno; }; /* * Internal routines. These should not need to be called directly. */ static int PolyInt_InBBox(int n_verts, Point3 *verts, float tol); static int PolyInt_Origin(int n_verts, Point3 *verts, Point3 *origin); int PolyZInt(int n_verts, Point3 *verts, float tol, int wanted, vvec *hits) { int i; int count = 0; struct PolyHit *ph; Point3 pt, bma, *thisp, *nextp; float thisd2, nextd2, od2, tol2, len2, f; float angsum = 0.0; /* Do test for trivial rejection */ if (!PolyInt_InBBox(n_verts, verts, tol)) return 0; /* If we have just one vertex, and passed the above test, it's a hit. */ if(n_verts == 1 && wanted&PW_VERT) { ph = VVAPPEND(*hits, struct PolyHit); ph->vno = 0; ph->edgevno = -1; ph->hitpt = verts[0]; return 1; } tol2 = tol*tol; /* Go through the edges of the polygon looking for edge and vertex hits. */ thisp = &verts[n_verts-1]; thisd2 = PT3DOT_XY(*thisp, *thisp); nextp = &verts[0]; for (i = 0; i < n_verts; i++, thisp = nextp++, thisd2 = nextd2) { /* Line equation: this + t*(next-this)/|next-this|, for 0<=t<=1 */ /* Find closest point on line to origin. */ nextd2 = PT3DOT_XY(*nextp, *nextp); PT3SUB_XY(*thisp, *nextp, bma); len2 = PT3DOT_XY(bma, bma); if(nextd2 < tol2 && wanted&PW_VERT) { count++; ph = VVAPPEND(*hits, struct PolyHit); ph->hitpt = *nextp; ph->vno = i; ph->edgevno = -1; } else if(len2 > 0) { f = -PT3DOT_XY(*thisp, bma) / len2; pt.x = thisp->x + f*bma.x; pt.y = thisp->y + f*bma.y; od2 = PT3DOT_XY(pt, pt); if(od2 < tol2 && wanted&PW_EDGE && (thisd2 > tol2 || !(wanted&PW_VERT))) { count++; ph = VVAPPEND(*hits, struct PolyHit); pt.z = thisp->z + f*bma.z; ph->hitpt = pt; ph->vno = -1; ph->edgevno = (i==0) ? n_verts-1 : i-1; } if(len2 > FUDGE2) { /* Add in the (signed) angle subtended by this edge as seen from * the origin: atan2( this cross next, this dot next ) */ angsum += atan2( thisp->x * nextp->y - thisp->y * nextp->x, PT3DOT_XY(*thisp, *nextp) ); } } } /* Look for the face hits */ if (wanted&PW_FACE && count == 0 && n_verts > 2 && fabs(angsum) > M_PI && PolyInt_Origin(n_verts, verts, &pt)) { count++; ph = VVAPPEND(*hits, struct PolyHit); ph->hitpt = pt; ph->vno = -1; ph->edgevno = -1; } return(count); } int PolyNearPosZInt(int n_verts, Point3 *verts, float tol, Point3 *ip, int *vertex, int *edge, Point3 *ep, int wanted, float zclose) { int i; vvec hits; struct PolyHit *ph, *closest, phits[32]; VVINIT(hits, struct PolyHit, 32); vvuse(&hits, phits, 32); if (!PolyZInt(n_verts, verts, tol, wanted, &hits)) return 0; closest = NULL; for (i = 0, ph = VVEC(hits, struct PolyHit); i < VVCOUNT(hits); i++, ph++) { if (ph->hitpt.z > -1.0 && ph->hitpt.z < zclose) { closest = ph; zclose = ph->hitpt.z; } } if (closest) { *ip = closest->hitpt; *vertex = closest->vno; *edge = closest->edgevno; *ep = closest->hitpt; } vvfree(&hits); return (closest ? 1 : 0); } #ifdef UNUSED int PolyLineInt(Point3 *pt1, Point3 *pt2, int n_verts, Point3 *verts, float tol, vvec *ip, vvec *vertices, vvec *edges, vvec *ep) { int i; int n_hits, old_n_hits; Point3 *vertcopy; Transform T, Tinv; PolyInt_Align(pt1, pt2, T); TmInvert(T, Tinv); vertcopy = OOGLNewNE(Point3, n_verts, msg); for (i = 0; i < n_verts; i++) Pt3Transform(T, &verts[i], &vertcopy[i]); old_n_hits = VVCOUNT(*ip); n_hits = PolyZInt(n_verts, vertcopy, tol, ip, vertices, edges, ep, PW_EDGE|PW_VERT); for (i = 0; i < n_hits; i++) { Pt3Transform(Tinv, VVINDEX(*ip, Point3, old_n_hits + i), VVINDEX(*ip, Point3, old_n_hits + i)); Pt3Transform(Tinv, VVINDEX(*ep, Point3, old_n_hits + i), VVINDEX(*ep, Point3, old_n_hits + i)); } OOGLFree(vertcopy); return n_hits; } int PolyRayInt(Point3 *pt1, Point3 *pt2, int n_verts, Point3 *verts, float tol, vvec *ip, vvec *vertices, vvec *edges, vvec *ep) { int i, j; int n_hits, old_n_hits; Point3 *vertcopy; Transform T, Tinv; PolyInt_Align(pt1, pt2, T); TmInvert(T, Tinv); vertcopy = OOGLNewNE(Point3, n_verts, msg); for (i = 0; i < n_verts; i++) Pt3Transform(T, &verts[i], &vertcopy[i]); old_n_hits = VVCOUNT(*ip); n_hits = PolyZInt(n_verts, vertcopy, tol, ip, vertices, edges, ep, PW_EDGE|PW_VERT); for (i = j = 0; i < n_hits; i++) if (VVINDEX(*ip, Point3, old_n_hits + i)->z <= 0) { Pt3Transform(Tinv, VVINDEX(*ip, Point3, old_n_hits + i), VVINDEX(*ip, Point3, old_n_hits + j)); Pt3Transform(Tinv, VVINDEX(*ep, Point3, old_n_hits + i), VVINDEX(*ep, Point3, old_n_hits + j)); j++; } OOGLFree(vertcopy); return j; } int PolySegmentInt(Point3 *pt1, Point3 *pt2, int n_verts, Point3 *verts, float tol, vvec *ip, vvec *vertices, vvec *edges, vvec *ep) { int i, j; int n_hits, old_n_hits; Point3 *vertcopy; Transform T, Tinv; PolyInt_Align(pt1, pt2, T); TmInvert(T, Tinv); vertcopy = OOGLNewNE(Point3, n_verts, msg); for (i = 0; i < n_verts; i++) Pt3Transform(T, &verts[i], &vertcopy[i]); old_n_hits = VVCOUNT(*ip); n_hits = PolyZInt(n_verts, vertcopy, tol, ip, vertices, edges, ep, PW_EDGE|PW_VERT); for (i = j = 0; i < n_hits; i++) if ((VVINDEX(*ip, Point3, old_n_hits + i)->z <= 0) && (VVINDEX(*ip, Point3, old_n_hits + i)->z >= -1.0)) { Pt3Transform(Tinv, VVINDEX(*ip, Point3, old_n_hits + i), VVINDEX(*ip, Point3, old_n_hits + j)); Pt3Transform(Tinv, VVINDEX(*ep, Point3, old_n_hits + i), VVINDEX(*ep, Point3, old_n_hits + j)); j++; } OOGLFree(vertcopy); VVCOUNT(*ip) = old_n_hits + j; vvtrim(ip); return j; } #endif /*UNUSED*/ void PolyInt_Align(Point3 *pt1, Point3 *pt2, Transform T) { Point3 newpt2; Transform Ttmp; if (!memcmp(pt1, pt2, sizeof(Point3))) { OOGLError(1, "PolyInt_Align called with identical points."); TmIdentity(T); return; } TmTranslate(T, -pt1->x, -pt1->y, -pt1->z); Pt3Transform(T, pt2, &newpt2); TmRotateY(Ttmp, -atan2(newpt2.x, -newpt2.z)); TmConcat(T, Ttmp, T); Pt3Transform(T, pt2, &newpt2); TmRotateX(Ttmp, -atan2(newpt2.y, -newpt2.z)); TmConcat(T, Ttmp, T); Pt3Transform(T, pt2, &newpt2); if (newpt2.z == 0.0) { OOGLError(1, "Second point too close to first point in PolyInt_Align"); TmIdentity(T); return; } TmScale(Ttmp, -1.0 / newpt2.z, -1.0 / newpt2.z, -1.0 / newpt2.z); TmConcat(T, Ttmp, T); } /* * PolyInt_InBBox * Returns non-zero if the origin is inside the polygon described by * verts or within tol of begin so; returns 0 otherwise. */ static int PolyInt_InBBox(int n_verts, Point3 *verts, float tol) { int i; int posx = 0, negx = 0, posy = 0, negy = 0; for (i = 0; i < n_verts; i++, verts++) { if (verts->x < tol) negx |= 1; if (verts->x > -tol) posx |= 1; if (verts->y < tol) negy |= 1; if (verts->y > -tol) posy |= 1; } return (posx & negx & posy & negy); } static int PolyInt_Origin(int n_verts, Point3 *verts, Point3 *origin) { int bi, ci; float pz = 0, pw; /* Find the first vertex different from the 0th vertex */ for (bi = 0; bi < n_verts && !memcmp(&verts[0], &verts[bi], sizeof(Point3)); bi++); if (bi >= n_verts) { Pt3Copy(&verts[0], origin); return 0; } /* Find the first vertex not collinear with the other two vertices */ for (ci = bi+1; ci < n_verts; ci++) { pz = (verts[0].x * (verts[bi].y - verts[ci].y) - verts[0].y * (verts[bi].x - verts[ci].x) + (verts[bi].x * verts[ci].y - verts[bi].y * verts[ci].x)); if (pz*pz > FUDGE2) break; } if (ci >= n_verts) { Pt3Copy(&verts[0], origin); return 0; } pw = (verts[0].x * (verts[bi].z*verts[ci].y - verts[bi].y*verts[ci].z) - verts[0].y * (verts[bi].z*verts[ci].x - verts[bi].x*verts[ci].z) + verts[0].z * (verts[bi].y*verts[ci].x - verts[bi].x*verts[ci].y)); origin->x = origin->y = 0.0; origin->z = -pw / pz; return 1; } geomview-1.9.5/src/lib/geometry/point3/segments.c0000644000175000017500000002052512310110200016646 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include "3d.h" #include "ooglutil.h" static void PtNormalPlane(Point3 *base, Point3 *normal, HPoint3 *ans); static void Proj(Point3 *a, Point3 *b, Point3 *ans); static void Orth(Point3 *a, Point3 *b, Point3 *ans); static float ParSgSgDistance(Point3 *a1, Point3 *a2, Point3 *adir, Point3 *b1, Point3 *b2); static float SgPtDistance(Point3 *p, Point3 *a1, Point3 *a2, Point3 *dir); static void SgPlMinPoint(HPoint3 *pl, Point3 *a, Point3 *b, Point3 *dir, Point3 *ans); static void TComb(Point3 *a, float t, Point3 *dir, Point3 *b); static int LnPlIntersect(HPoint3 *pl, Point3 *a, Point3 *dir, float *t); /*----------------------------------------------------------------------- * Function: SgSgDistance * Description: distance between two line segments * Args: a1,a2: first segment * b1,b2: second segment * Returns: distance between segment [a1,a2] and segment [b1,b2] * Author: mbp * Date: Mon Dec 23 15:17:30 1991 * Notes: This procedure is totally general; either or both * segments may in fact be points. */ Pt3Coord SgSgDistance(Point3 *a1, Point3 *a2, Point3 *b1, Point3 *b2) { Point3 adir, bdir, amin, bmin, na, nb; HPoint3 aplane, bplane; Pt3Coord alen, blen, d, cosang; Pt3Sub(a2,a1, &adir); alen = Pt3Length( &adir ); Pt3Sub(b2,b1, &bdir); blen = Pt3Length( &bdir ); switch ( ((alen<1.e-12)<<1) | (blen<1.e-12) ) { case 1: /* b is a point, a is not */ d = SgPtDistance(b1, a1,a2,&adir); return d; case 2: /* a is a point, b is not */ d = SgPtDistance(a1, b1,b2,&bdir); return d; case 3: /* both a and b are points */ d = Pt3Distance(a1,b1); return d; } /* * We fall thru the above switch if neither segment is a point. * Now check for parallelism. */ cosang = Pt3Dot(&adir,&bdir) / ( alen * blen ); if ( fabs((double)cosang) > .99 ) { /* segments are essentially parallel */ d = ParSgSgDistance(a1,a2,&adir,b1,b2); } else { /* segments are skew */ Orth(&adir, &bdir, &na); Orth(&bdir, &adir, &nb); PtNormalPlane(a1, &na, &aplane); PtNormalPlane(b1, &nb, &bplane); SgPlMinPoint(&aplane, b1, b2, &bdir, &bmin); SgPlMinPoint(&bplane, a1, b2, &adir, &amin); d = Pt3Distance(&amin, &bmin); } return d; } /*----------------------------------------------------------------------- * Function: PtNormalPlane * Description: compute homog coords of a plane * Args: *base: point on plane * *normal: normal vector to plane * *ans: homog coords of plane * Returns: nothing * Author: mbp * Date: Mon Dec 23 15:08:46 1991 */ static void PtNormalPlane(Point3 *base, Point3 *normal, HPoint3 *ans) { ans->x = normal->x; ans->y = normal->y; ans->z = normal->z; ans->w = - Pt3Dot(base, normal); } /*----------------------------------------------------------------------- * Function: Proj * Description: projection of a onto b * Args IN: a,b * OUT: ans * Returns: nothing * Author: mbp * Date: Mon Dec 23 15:09:29 1991 */ static void Proj(Point3 *a, Point3 *b, Point3 *ans) { Pt3Mul( Pt3Dot(a,b) / Pt3Dot(a,a), a, ans ); } /*----------------------------------------------------------------------- * Function: Orth * Description: orthogonalization of b wrt a * Args IN: a, b * OUT: ans * Returns: nothing * Author: mbp * Date: Mon Dec 23 15:09:54 1991 * Notes: answer is vector in plane spanned * by a & b, orthogonal to a. */ static void Orth(Point3 *a, Point3 *b, Point3 *ans) { Point3 p; Proj(a,b,&p); Pt3Sub(b, &p, ans); } /*----------------------------------------------------------------------- * Function: ParSgSgDistance * Description: compute distance between two line segments on * parallel lines * Args: a1, a2: first segment * *adir: a2 - a1 * b1,b2: second segment * Returns: distance between segments [a1,a2] and [b1,b2] * Author: mbp * Date: Mon Dec 23 15:11:38 1991 * Notes: segments must lie on parallel lines in order for * this to work. * adir must be exactly a2 - a1 upon input. It appears * as an argument to this procedure because we assume * the caller has already computed it, and we need it * here, so why recompute it?!! */ static Pt3Coord ParSgSgDistance(Point3 *a1, Point3 *a2, Point3 *adir, Point3 *b1, Point3 *b2) { Point3 b1p,b2p; HPoint3 b1plane, b2plane; Pt3Coord d,t1 = 0.0 ,t2 = 0.0; Pt3Sub(a2,a1,adir); PtNormalPlane(b1, adir, &b1plane); LnPlIntersect(&b1plane, a1, adir, &t1); TComb(a1, t1, adir, &b1p); d = Pt3Distance(b1, &b1p); if ( (t1>=0) && (t1<=1) ) return d; PtNormalPlane(b2, adir, &b2plane); LnPlIntersect(&b2plane, a1, adir, &t2); TComb(a1, t2, adir, &b2p); if ( (t2>=0) && (t2<=1) ) return d; if ( t2 > t1 ) { if ( t1 > 1 ) d = Pt3Distance(a2,b1); else d = Pt3Distance(a1,b2); } else { if ( t2 > 1 ) d = Pt3Distance(a2,b2); else d = Pt3Distance(a1,b1); } return d; } /*----------------------------------------------------------------------- * Function: SgPtDistance * Description: distance from a segment to a point * Args: p: the point * a1,a2: the segment * *dir: a2 - a1 * Returns: the distance from p to segment [a1,a2] * Author: mbp * Date: Mon Dec 23 15:15:19 1991 * Notes: dir must be a2 - a1 upon input */ static Pt3Coord SgPtDistance(Point3 *p, Point3 *a1, Point3 *a2, Point3 *dir) { HPoint3 pl; Point3 min; Pt3Coord d; PtNormalPlane(p, dir, &pl); SgPlMinPoint(&pl, a1, a2, dir, &min); d = Pt3Distance(p, &min); return d; } /*----------------------------------------------------------------------- * Function: SgPlMinPoint * Description: find the point of a segment closest to a plane * Args: pl: homog coords of the plane * a,b: the segment * dir: b - a * ans: the point of segment [a,b] closest to plane * Returns: nothing * Author: mbp * Date: Mon Dec 23 15:19:02 1991 * Notes: dir must be b - a upon input */ static void SgPlMinPoint(HPoint3 *pl, Point3 *a, Point3 *b, Point3 *dir, Point3 *ans) { Pt3Coord t = 0.0; LnPlIntersect(pl, a, dir, &t); if (t <= 0) *ans = *a; else if (t >= 1) *ans = *b; else TComb(a, t, dir, ans); } /*----------------------------------------------------------------------- * Function: TComb * Description: form a t combination: b = a + t * dir * Args IN: a,dir,t * OUT: b: a + t * dir * Returns: nothing * Author: mbp * Date: Mon Dec 23 15:20:43 1991 */ static void TComb(Point3 *a, Pt3Coord t, Point3 *dir, Point3 *b) { b->x = a->x + t * dir->x; b->y = a->y + t * dir->y; b->z = a->z + t * dir->z; } /*----------------------------------------------------------------------- * Function: LnPlIntersect * Description: intersect a plane with a line * Arg IN: pl: the plane * a: base point of line * dir: direction vector of line * OUT: t: t value such that a + t * dir lies on plane * Returns: 1 if successful, 0 if not * Author: mbp * Date: Mon Dec 23 15:22:25 1991 * Notes: return value of 0 means line is parallel to plane */ static int LnPlIntersect(HPoint3 *pl, Point3 *a, Point3 *dir, Pt3Coord *t) { Pt3Coord d; d = pl->x*dir->x + pl->y*dir->y + pl->z*dir->z; if (d == 0) return 0; *t = - ( a->x * pl->x + a->y * pl->y + a->z * pl->z + pl->w ) / d; return 1; } geomview-1.9.5/src/lib/geometry/point3/point3.h0000644000175000017500000001754012310110200016245 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #ifndef _GV_POINT3_H_ #define _GV_POINT3_H_ /* ** point3.c - 3D vector arithmetic module. ** ** pat hanrahan ** ** cH: now as inline functions for efficiency ** */ #include #include #include "tolerance.h" #include "geomtypes.h" #define Pt3X(pt) (pt)->x #define Pt3Y(pt) (pt)->y #define Pt3Z(pt) (pt)->z extern Pt3Coord SgSgDistance(Point3 *a1, Point3 *a2, Point3 *b1, Point3 *b2); static const Point3 Pt3Origin = { 0., 0., 0. }; static inline void Pt3Print(const Point3 *v); static inline void Pt3From(Point3 *v, double x, double y, double z); static inline void Pt3Copy(const Point3 *v1, Point3 *v2); static inline void Pt3Add(const Point3 *v1, const Point3 *v2, Point3 *v3); static inline void Pt3Sub(const Point3 *v1, const Point3 *v2, Point3 *v3); static inline void Pt3Mul(double s, const Point3 *v1, Point3 *v2); static inline Pt3Coord Pt3Dot(const Point3 *v1, const Point3 *v2); static inline void Pt3Cross(const Point3 *v1, const Point3 *v2, Point3 *v3); static inline Pt3Coord Pt3TripleDot(const Point3 *v1, const Point3 *v2, const Point3 *v3); static inline void Pt3TripleCross(const Point3 *v1, const Point3 *v2, const Point3 *v3, Point3 *v4); static inline Pt3Coord Pt3Length(const Point3 *v); static inline Pt3Coord Pt3Distance(const Point3 *v1, const Point3 *v2); static inline Pt3Coord Pt3Angle(const Point3 *v1, const Point3 *v2); static inline void Pt3Unit(Point3 *v); static inline void Pt3Lerp(double t, const Point3 *v1, const Point3 *v2, Point3 *v3); static inline void Pt3Comb(double t1, const Point3 *v1, double t2, const Point3 *v2, Point3 *v3); static inline int Pt3Equal(const Point3 *v1, const Point3 *v2); static inline int Pt3Parallel(const Point3 *v1, const Point3 *v2); static inline int Pt3Perpendicular(const Point3 *v1, const Point3 *v2); static inline void Pt3Transform(Transform3 T, Point3 *p1, Point3 *p2); static inline void Pt3TransformN(Transform3 T, Point3 *p1, Point3 *p2, int n); static inline void NormalTransform(Transform3 T, Point3 *a, Point3 *b); static inline void NormalTransformN(Transform3 T, Point3 *a, Point3 *b, int n); #include "transform3.h" /* print vector */ static inline void Pt3Print(const Point3 *v) { /* Only works if Pt3Coord is a float */ printf("[%g %g %g]\n", v->x, v->y, v->z); } static inline void Pt3From(Point3 *v, double x, double y, double z) { v->x = x; v->y = y; v->z = z; } /* v2 = v1 */ static inline void Pt3Copy( const Point3 *v1, Point3 *v2 ) { v2->x = v1->x; v2->y = v1->y; v2->z = v1->z; } /* v3 = v1 + v2 */ static inline void Pt3Add( const Point3 *v1, const Point3 *v2, Point3 *v3 ) { v3->x = v1->x + v2->x; v3->y = v1->y + v2->y; v3->z = v1->z + v2->z; } /* v3 = v1 - v2 */ static inline void Pt3Sub( const Point3 *v1, const Point3 *v2, Point3 *v3) { v3->x = v1->x - v2->x; v3->y = v1->y - v2->y; v3->z = v1->z - v2->z; } /* v2 = s * v1 */ static inline void Pt3Mul( double s, const Point3 *v1, Point3 *v2 ) { v2->x = s*v1->x; v2->y = s*v1->y; v2->z = s*v1->z; } /* v1 . v2 */ static inline Pt3Coord Pt3Dot( const Point3 *v1, const Point3 *v2 ) { return v1->x*v2->x+v1->y*v2->y+v1->z*v2->z; } /* v3 = v1 x v2 */ static inline void Pt3Cross( const Point3 *v1, const Point3 *v2, Point3 *v3 ) { v3->x = v1->y*v2->z-v1->z*v2->y; v3->y = v1->z*v2->x-v1->x*v2->z; v3->z = v1->x*v2->y-v1->y*v2->x; } /* v1 . (v2 x v3) */ static inline Pt3Coord Pt3TripleDot( const Point3 *v1, const Point3 *v2, const Point3 *v3 ) { return v1->x*(v2->y*v3->z-v2->z*v3->y) + v1->y*(v2->z*v3->x-v2->x*v3->z) + v1->z*(v2->x*v3->y-v2->y*v3->x); } /* v4 = (v1 x v2) x v3 */ static inline void Pt3TripleCross( const Point3 *v1, const Point3 *v2, const Point3 *v3, Point3 *v4 ) { Point3 v; Pt3Cross( v1, v2, &v ); Pt3Cross( &v, v3, v4 ); } static inline Pt3Coord Pt3Length( const Point3 *v ) { return sqrt( v->x*v->x + v->y*v->y + v->z*v->z ); } static inline Pt3Coord Pt3Distance( const Point3 *v1, const Point3 *v2 ) { Point3 v12; Pt3Sub(v1,v2,&v12); return Pt3Length(&v12); } static inline Pt3Coord Pt3Angle( const Point3 *v1, const Point3 *v2 ) { return(acos(Pt3Dot(v1, v2) / (Pt3Length(v1) * Pt3Length(v2)))); } static inline void Pt3Unit( Point3 *v ) { Pt3Coord len; len = Pt3Length(v); if( len != 0. && len != 1. ) Pt3Mul( 1./len, v, v ); } /* * lerp - linear interpolation * * v3 = (1-t)*v1 + t*v2 */ static inline void Pt3Lerp( double t, const Point3 *v1, const Point3 *v2, Point3 *v3 ) { v3->x = (1.-t)*v1->x + t*v2->x; v3->y = (1.-t)*v1->y + t*v2->y; v3->z = (1.-t)*v1->z + t*v2->z; } static inline void Pt3Comb( double t1, const Point3 *v1, double t2, const Point3 *v2, Point3 *v3 ) { v3->x = t1*v1->x + t2*v2->x; v3->y = t1*v1->y + t2*v2->y; v3->z = t1*v1->z + t2*v2->z; } /* vectors equal */ static inline int Pt3Equal( const Point3 *v1, const Point3 *v2 ) { Pt3Coord v; v = Pt3Distance(v1, v2); return fz(v); } /* parallel vectors */ static inline int Pt3Parallel( const Point3 *v1, const Point3 *v2 ) { Point3 v3; Pt3Coord v; Pt3Cross(v1,v2,&v3); v=Pt3Length(&v3); return fz(v); } /* perpendicular vectors */ static inline int Pt3Perpendicular( const Point3 *v1, const Point3 *v2 ) { Pt3Coord v; v=Pt3Dot(v1,v2); return fz(v); } static inline void Pt3Transform( Transform3 T, Point3 *p1, Point3 *p2 ) { Pt3Coord x, y, z, w; x = p1->x; y = p1->y; z = p1->z; w = (T[TMX][TMW]*x + T[TMY][TMW]*y + T[TMZ][TMW]*z + T[TMW][TMW]); if(w != 1.0) { w = 1.0 / w; p2->x = w * (x*T[TMX][TMX] + y*T[TMY][TMX] + z*T[TMZ][TMX] + T[TMW][TMX]); p2->y = w * (x*T[TMX][TMY] + y*T[TMY][TMY] + z*T[TMZ][TMY] + T[TMW][TMY]); p2->z = w * (x*T[TMX][TMZ] + y*T[TMY][TMZ] + z*T[TMZ][TMZ] + T[TMW][TMZ]); } else { p2->x = x*T[TMX][TMX] + y*T[TMY][TMX] + z*T[TMZ][TMX] + T[TMW][TMX]; p2->y = x*T[TMX][TMY] + y*T[TMY][TMY] + z*T[TMZ][TMY] + T[TMW][TMY]; p2->z = x*T[TMX][TMZ] + y*T[TMY][TMZ] + z*T[TMZ][TMZ] + T[TMW][TMZ]; } } static inline void Pt3TransformN( Transform3 T, Point3 *p1, Point3 *p2, int n ) { while( n-- ) Pt3Transform( T, p1++, p2++ ); } /* Behold: if T is not orthogonal, then this function has to be called * with T^{-tr}, or the adj(T)^{tr}, otherwise the result will be * wrong. */ static inline void NormalTransform(Transform3 Tdual, Point3 *a, Point3 *b) { #if 0 Pt3Transform(T, a, b); b->x -= T[TMW][TMX]; b->y -= T[TMW][TMY]; b->z -= T[TMW][TMZ]; #else Pt3Coord x, y, z; x = a->x; y = a->y; z = a->z; b->x = x*Tdual[TMX][TMX] + y*Tdual[TMY][TMX] + z*Tdual[TMZ][TMX]; b->y = x*Tdual[TMX][TMY] + y*Tdual[TMY][TMY] + z*Tdual[TMZ][TMY]; b->z = x*Tdual[TMX][TMZ] + y*Tdual[TMY][TMZ] + z*Tdual[TMZ][TMZ]; #endif Pt3Unit(b); } static inline void NormalTransformN( Transform3 T, Point3 *a, Point3 *b, int n ) { while ( n-- ) NormalTransform( T, a++, b++ ); } #endif /* _GV_POINT3_H_ */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/geometry/point3/polyint.h0000644000175000017500000001343712310110200016530 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef POLYINT_H #define POLYINT_H #define PW_VERT 1 /* What kinds of polygon intersections do we want? */ #define PW_EDGE 2 #define PW_FACE 4 #define PW_VISIBLE 8 /* * Tolerance - a good value to pass to PolyZInt and its subsidiaries. */ #define POLYINT_TOL 1.e-6 /* * PolyZInt * Finds intersection of z-axis and arbitrary flat polygon. * * Input: * n_verts # of vertices in polygon (the length of the verts array) * verts vertices of polygon * tol Tolerance. Any point whose distance from the z-axis * is less than tol will be considered hit. * * Output: * All output values are vvecs (See ooglutil.h). They must already be * initialized when passed to PolyZInt. Any new intersection points found * by PolyZInt will be appended onto the vvec. The count field of all the * vvecs must be up to date. When PolyZInt returns, this field will reflect * any new elements that have been added to the vvec (ie, the new count * field will be equal to the old count field plus the number of intersection * points found by PolyZInt). Note that all the vvecs will be the same * length. PolyZInt will return the number of intersection points found. * ip Intersection points (Point3). These are the points where * the Z-axis intersects the plane containing the polygon. * Note that if tol > 0.0, these points may not actually * be inside the polygon. * vertices Vertex intersections (ints - indices into verts). If no * vertex intersection was found, the corresponding element * in this vvec will be set to -1. * edges Edge intersections (ints - indices of first point in * verts list). If no edge intersection was found, the * corresponding element in this vvec will be set to -1. * ep Edge intersection locations, if any were found (Point3). * An element of this array will contain valid data iff * the corresponding element of the edges vvec is not equal * to -1. The elements of this are guarenteed to be points * on the edge, but, because of the tolerance, may not be * equal to the corresponding elements of the ip array. * For every intersection point found, ip will be filled in. vertices will * be filled in only if a vertices was within tol of the intersection point. * If a vertices was within tol of the intersection point, the edges to which * the point belongs will not be considered to have been hit. */ int PolyZInt(int n_verts, Point3 *verts, float tol, int wanted, vvec *hits); /* * PolyNearNegZInt * Wrapper for PolyZInt designed for mouse picking. Finds the * intersection closest to the origin on the positive Z axis. * Returns non-zero if there was a hit. * * Input: * (See above) * Output: * ip Intersection point. * vertex Index of vertex or -1 if there was no vertex hit. * edge Index of first vertex of edge or -1 if there was no * edge hit. * ep Edge point. * wanted Bit-mask of PW_{FACE|VERT|EDGE}: want which kinds of picks? * zmin Only accept picks where z&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@ target_triplet = @target@ subdir = src/lib/geometry/transform3 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libtransform3_la_LIBADD = am_libtransform3_la_OBJECTS = ctm3align.lo ctm3ortho.lo ctm3persp.lo \ ctm3perspfov.lo ctm3rotate.lo ctm3scale.lo ctm3tetrad.lo \ ctm3translate.lo tm3adjoint.lo tm3align.lo tm3concat.lo \ tm3conjugate.lo tm3copy.lo tm3dual.lo tm3identity.lo \ tm3invert.lo tm3ortho.lo tm3persp.lo tm3perspfov.lo \ tm3print.lo tm3rotate.lo tm3scale.lo tm3stack.lo tm3tetrad.lo \ tm3translate.lo tm3transpose.lo tm3polardecomp.lo libtransform3_la_OBJECTS = $(am_libtransform3_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libtransform3_la_SOURCES) DIST_SOURCES = $(libtransform3_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libtransform3.la libtransform3_la_SOURCES = \ ctm3align.c ctm3ortho.c ctm3persp.c ctm3perspfov.c ctm3rotate.c ctm3scale.c ctm3tetrad.c ctm3translate.c tm3adjoint.c tm3align.c tm3concat.c tm3conjugate.c tm3copy.c tm3dual.c tm3identity.c tm3invert.c tm3ortho.c tm3persp.c tm3perspfov.c tm3print.c tm3rotate.c tm3scale.c tm3stack.c tm3tetrad.c tm3translate.c tm3transpose.c tm3polardecomp.c \ 3d.h radians.h transform3.h transform.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/transform3/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/transform3/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libtransform3.la: $(libtransform3_la_OBJECTS) $(libtransform3_la_DEPENDENCIES) $(EXTRA_libtransform3_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libtransform3_la_OBJECTS) $(libtransform3_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctm3align.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctm3ortho.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctm3persp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctm3perspfov.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctm3rotate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctm3scale.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctm3tetrad.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctm3translate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3adjoint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3align.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3concat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3conjugate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3copy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3dual.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3identity.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3invert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3ortho.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3persp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3perspfov.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3polardecomp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3print.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3rotate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3scale.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3stack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3tetrad.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3translate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3transpose.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/geometry/transform3/Makefile.am0000644000175000017500000000100112310110200017557 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libtransform3.la libtransform3_la_SOURCES = \ ctm3align.c ctm3ortho.c ctm3persp.c ctm3perspfov.c ctm3rotate.c ctm3scale.c ctm3tetrad.c ctm3translate.c tm3adjoint.c tm3align.c tm3concat.c tm3conjugate.c tm3copy.c tm3dual.c tm3identity.c tm3invert.c tm3ortho.c tm3persp.c tm3perspfov.c tm3print.c tm3rotate.c tm3scale.c tm3stack.c tm3tetrad.c tm3translate.c tm3transpose.c tm3polardecomp.c \ 3d.h radians.h transform3.h transform.h geomview-1.9.5/src/lib/geometry/transform3/ctm3align.c0000644000175000017500000000314312310110200017561 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" void Ctm3AlignX( Transform3 T, Point3 *axis ) { Ctm3Align( T, axis, &TM3_XAXIS ); } void Ctm3AlignY( Transform3 T, Point3 *axis ) { Ctm3Align( T, axis, &TM3_YAXIS ); } void Ctm3AlignZ( Transform3 T, Point3 *axis ) { Ctm3Align( T, axis, &TM3_ZAXIS ); } void Ctm3Align( Transform3 T, Point3 *axis, Point3 *newaxis ) { Transform3 Ta; Tm3Align( Ta, axis, newaxis ); Tm3Concat(Ta, T, T); } geomview-1.9.5/src/lib/geometry/transform3/ctm3ortho.c0000644000175000017500000000257512310110200017632 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" void Ctm3Orthographic( Transform3 T, float l, float r, float b, float t, float n, float f ) { Transform3 P; Tm3Orthographic( P, l, r, b, t, n, f ); Tm3Concat(P, T, T); } geomview-1.9.5/src/lib/geometry/transform3/ctm3persp.c0000644000175000017500000000307212310110200017621 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /* * Premultiply T by the given perspective projection. * Probably not too useful; a projection matrix should be postmultiplied, * not premultiplied, by a world-to-camera transform. */ void Ctm3Perspective( Transform3 T, float l, float r, float b, float t, float n, float f ) { Transform3 P; Tm3Perspective( P, l, r, b, t, n, f ); Tm3Concat( P, T, T ); } geomview-1.9.5/src/lib/geometry/transform3/ctm3perspfov.c0000644000175000017500000000257112310110200020337 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" void Ctm3PerspectiveFOV( Transform3 T, float fov, float aspect, float n, float f ) { Transform3 P; Tm3PerspectiveFOV( P, fov, aspect, n, f ); Tm3Concat( P, T, T ); } geomview-1.9.5/src/lib/geometry/transform3/ctm3rotate.c0000644000175000017500000000571212310110200017771 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "radians.h" #include "transform3.h" /* * Pre-multiply a matrix by a rotate about the x axis. * * ( 1 0 0 0 ) * ( 0 c s 0 ) * [a] = ( 0 -s c 0 ) * [a] * ( 0 0 0 1 ) */ void Ctm3RotateX( Transform3 T, float angle ) { int i; double t,s,c; s=sin(angle); c=cos(angle); for (i=0; i<4; ++i) { t = T[1][i] * c + T[2][i] * s; T[2][i] = T[2][i] * c - T[1][i] * s; T[1][i] = t; } } /* * Pre-multiply a matrix by a rotate about the y axis. * * ( c 0 s 0 ) * ( 0 1 0 0 ) * [a] = ( -s 0 c 0 ) * [a] * ( 0 0 0 1 ) */ void Ctm3RotateY( Transform3 T, float angle ) { int i; double t,s,c; s=sin(angle); c=cos(angle); for (i=0; i<4; ++i) { t = T[2][i] * c - T[0][i] * s; T[0][i] = T[0][i] * c + T[2][i] * s; T[2][i] = t; } } /* * Pre-multiply a matrix by a rotate about the z axis. * * ( c s 0 0 ) * ( -s c 0 0 ) * [a] = ( 0 0 1 0 ) * [a] * ( 0 0 0 1 ) */ void Ctm3RotateZ( Transform3 T, float angle ) { int i; double t,s,c; s=sin(angle); c=cos(angle); for (i=0; i<4; ++i) { t = T[0][i] * c + T[1][i] * s; T[1][i] = T[1][i] * c - T[0][i] * s; T[0][i] = t; } } /* * Pre-multiply a matrix by a rotate about an arbitrary axis * * [a] = [ rotation] * [a] * */ void Ctm3Rotate( Transform3 T, float angle, Point3 *axis ) { if( axis == &TM3_XAXIS ) Ctm3RotateX( T, angle ); else if( axis == &TM3_YAXIS ) Ctm3RotateY( T, angle ); else if( axis == &TM3_ZAXIS ) Ctm3RotateZ( T, angle ); else { Transform3 Ta; Tm3Rotate( Ta, angle, axis ); Tm3Concat(Ta, T, T); } } geomview-1.9.5/src/lib/geometry/transform3/ctm3scale.c0000644000175000017500000000340512310110200017557 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /* pre-multiply a matrix by scale * * ( sx 0 0 0 ) * ( 0 sy 0 0 ) * [a] = ( 0 0 sz 0 ) * [a] * ( 0 0 0 1 ) */ void Ctm3Scale( Transform3 T, float sx, float sy, float sz ) { Tm3Coord *aptr; aptr=T[0]; /* row 1 */ *aptr++ *= sx; *aptr++ *= sx; *aptr++ *= sx; *aptr++ *= sx; /* row 2 */ *aptr++ *= sy; *aptr++ *= sy; *aptr++ *= sy; *aptr++ *= sy; /* row 3 */ *aptr++ *= sz; *aptr++ *= sz; *aptr++ *= sz; *aptr++ *= sz; /* row 4 is unchanged */ } geomview-1.9.5/src/lib/geometry/transform3/ctm3tetrad.c0000644000175000017500000000356512310110200017762 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /*----------------------------------------------------------------------- * Function: Ctm3Tetrad * Description: concatenate a transform with given columns to the right * of another transform * Args: T: the transform to modify * x: column 1 of right factor * y: column 2 of right factor * z: column 3 of right factor * w: column 4 of right factor * Returns: nothing * Author: hanrahan, mbp * Date: Thu Aug 8 14:54:56 1991 * Notes: sets T to T * S, where S is the transform with * columns x, y, z, w. */ void Ctm3Tetrad( T, x, y, z, w ) Transform3 T; HPoint3 *x, *y, *z, *w; { Transform3 Ta; Tm3Tetrad( Ta, x, y, z, w ); Tm3Concat(Ta, T, T); } geomview-1.9.5/src/lib/geometry/transform3/ctm3translate.c0000644000175000017500000000310212310110200020457 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /* * Pre-multiply a matrix by translation * * ( 1 0 0 0 ) * ( 0 1 0 0 ) * [a] = ( 0 0 1 0 ) * [a] * ( tx ty tz 1 ) */ void Ctm3Translate( Transform3 T, float tx, float ty, float tz ) { Tm3Coord *aptr; int cnt; aptr=T[0]; cnt=4; do{ aptr[12] += aptr[0]*tx+aptr[4]*ty+aptr[8]*tz; ++aptr; }while (--cnt); } geomview-1.9.5/src/lib/geometry/transform3/tm3adjoint.c0000644000175000017500000000702012310110200017752 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" #define det( a1, a2, a3, b1, b2, b3, c1, c2, c3 ) \ (a1*(b2*c3-c2*b3) - a2*(b1*c3-c1*b3) + a3*(b1*c2-c1*b2)) static float cofactor(Transform3 T, int x, int y) { static Tm3Coord mat3x3[3][3]; Tm3Coord *dst = mat3x3[0]; Tm3Coord *src = T[0]; int i; for( i=0; i<4; i++, src += 4 ) { if(i == x) continue; if(y != 0) *dst++ = src[0]; if(y != 1) *dst++ = src[1]; if(y != 2) *dst++ = src[2]; if(y != 3) *dst++ = src[3]; } return det( mat3x3[0][0], mat3x3[0][1], mat3x3[0][2], mat3x3[1][0], mat3x3[1][1], mat3x3[1][2], mat3x3[2][0], mat3x3[2][1], mat3x3[2][2] ); } static void adjoint(Transform3 T, Transform3 Tadj) { int x, y; float cof; for( x=0; x<4; x++ ) for( y=0; y<4; y++ ) { cof = cofactor( T, y, x ); Tadj[x][y] = ((x+y)&1) ? -cof : cof; } } /*----------------------------------------------------------------------- * Function: Tm3Adjoint * Description: compute the adjoint of a transform * Args: T: the transform (INPUT) * Tadj: the adjoint of T (OUTPUT) * Returns: nothing * Author: hanrahan, mbp * Date: Thu Aug 8 15:38:56 1991 * Notes: */ void Tm3Adjoint(Transform3 T, Transform3 Tadj) { if( T == Tadj ) { Transform3 Ttmp; adjoint( T, Ttmp ); Tm3Copy( Ttmp, Tadj ); } else { adjoint( T, Tadj ); } } /*----------------------------------------------------------------------- * Function: determinant * Description: compute the determinant of a transform, using an already * computed adjoint transform * Args: T: the transform (INPUT) * Tadj: T's adjoint transform (INPUT) * Returns: det(T) * Author: hanrahan, mbp * Date: Thu Aug 8 15:23:53 1991 * Notes: */ static float determinant( T, Tadj ) Transform3 T, Tadj; { return T[0][0]*Tadj[0][0] + T[0][1]*Tadj[1][0] + T[0][2]*Tadj[2][0] + T[0][3]*Tadj[3][0]; } /*----------------------------------------------------------------------- * Function: Tm3Determinant * Description: compute the determinant of a transform * Args: T: the transform (INPUT) * Returns: det(T) * Author: mbp * Date: Thu Aug 8 15:27:52 1991 * Notes: */ float Tm3Determinant(Transform3 T) { Transform3 Tadj; Tm3Adjoint( T, Tadj ); return determinant( T, Tadj ); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/geometry/transform3/tm3align.c0000644000175000017500000000377712310110200017433 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" void Tm3AlignX( Transform3 T, Point3 *axis ) { Tm3Align( T, axis, &TM3_XAXIS ); } void Tm3AlignY( Transform3 T, Point3 *axis ) { Tm3Align( T, axis, &TM3_YAXIS ); } void Tm3AlignZ( Transform3 T, Point3 *axis ) { Tm3Align( T, axis, &TM3_ZAXIS ); } void Tm3Align( Transform3 T, Point3 *axis, Point3 *newaxis ) { Transform3 Tr; Transform3 Tinv; Point3 o, zaxis, yaxis, newyaxis; o.x = o.y = o.z = 0.; Pt3Cross( axis, newaxis, &zaxis ); Pt3Cross( &zaxis, axis, &yaxis ); Pt3Cross( &zaxis, newaxis, &newyaxis ); Pt3Unit(axis); Pt3Unit(&yaxis); Pt3Unit(&zaxis); Tm3Tetrad3( T, axis, &yaxis, &zaxis, &o ); Tm3Invert( T, Tinv ); Pt3Unit(newaxis); Pt3Unit(&newyaxis); Tm3Tetrad3( Tr, newaxis, &newyaxis, &zaxis, &o ); Tm3Concat(Tinv, Tr, T); } geomview-1.9.5/src/lib/geometry/transform3/tm3concat.c0000644000175000017500000000733312310110200017600 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include "transform3.h" /************************************************************************ * NOTE: we're taking out PostConcat and PreConcat. They're being left * * here for a short while longer as a memorial. * ************************************************************************/ /*----------------------------------------------------------------------- * Function: Tm3PostConcat * Description: concatenate one transform to another on the right * Args: Ta: left transform (INPUT & OUTPUT) * Tb: right transform (INPUT) * Returns: nothing * Author: hanrahan, mbp * Date: Thu Aug 8 13:31:35 1991 * Notes: Sets Ta to Ta * Tb. */ void Tm3PostConcat( Ta, Tb ) Transform3 Ta, Tb; { fprintf(stderr, "WARNING: obsolete function Tm3PostConcat called. Use\n\ Tm3Concat instead.\n"); Tm3Concat( Ta, Tb, Ta ); } /*----------------------------------------------------------------------- * Function: Tm3PreConcat * Description: concatenate one transform to another on the left * Args: Ta: left transform (INPUT) * Tb: right transform (INPUT & OUTPUT) * Returns: nothing * Author: hanrahan, mbp * Date: Thu Aug 8 13:31:35 1991 * Notes: Sets Tb to Ta * Tb. */ void Tm3PreConcat( Ta, Tb ) Transform3 Ta, Tb; { fprintf(stderr, "WARNING: obsolete function Tm3PreConcat called. Use\n\ Tm3Concat instead.\n"); Tm3Concat( Ta, Tb, Tb ); } /*----------------------------------------------------------------------- * Function: Tm3Concat * Description: concatenate two transforms * Args: Ta: left factor (INPUT) * Tb: right factor (INPUT) * Tprod: product (OUTPUT) * Returns: nothing * Author: hanrahan, mbp * Date: Thu Aug 8 13:15:08 1991 * Notes: Passing the same transform for either factor and the * product is allowed. */ void Tm3Concat( Ta, Tb, Tprod ) Transform3 Ta, Tb, Tprod; { int i; #define MAKEPRODUCT(T) \ for( i=0; i<4; i++ ) { \ T[i][0] = Ta[i][0]*Tb[0][0] + \ Ta[i][1]*Tb[1][0] + \ Ta[i][2]*Tb[2][0] + \ Ta[i][3]*Tb[3][0]; \ T[i][1] = Ta[i][0]*Tb[0][1] + \ Ta[i][1]*Tb[1][1] + \ Ta[i][2]*Tb[2][1] + \ Ta[i][3]*Tb[3][1]; \ T[i][2] = Ta[i][0]*Tb[0][2] + \ Ta[i][1]*Tb[1][2] + \ Ta[i][2]*Tb[2][2] + \ Ta[i][3]*Tb[3][2]; \ T[i][3] = Ta[i][0]*Tb[0][3] + \ Ta[i][1]*Tb[1][3] + \ Ta[i][2]*Tb[2][3] + \ Ta[i][3]*Tb[3][3]; \ } if( Ta == Tprod || Tb == Tprod ) { Transform3 T; MAKEPRODUCT(T); memcpy( Tprod, T, sizeof(Transform3) ); } else { MAKEPRODUCT(Tprod); } #undef MAKEPRODUCT } geomview-1.9.5/src/lib/geometry/transform3/tm3conjugate.c0000644000175000017500000000403012310110200020277 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /*----------------------------------------------------------------------- * Function: Tm3Conjugate * Description: conjugate one transform by another * Args: T: one transform ("conjugatee") (INPUT) * Tcon: another transform ("conjugater") (INPUT) * Tres: the result * Returns: nothing * Author: mbp * Date: Thu Aug 8 15:42:41 1991 * Notes: Sets Tres = Inverse[Tcon} * T * Tcon */ void Tm3Conjugate( T, Tcon, Tres ) Transform3 T, Tcon, Tres; { Transform3 Tconinv; /* We actually use adjoint instead of inverse, because the det factors would cancel out anyway cH: the above is obviously not true, maybe this routine was only used for conformal geometry; then it is true. Otherwise not. */ Tm3Adjoint( Tcon, Tconinv ); Tm3Concat( Tconinv, T, Tres ); Tm3Concat( Tres, Tcon, Tres ); } geomview-1.9.5/src/lib/geometry/transform3/tm3copy.c0000644000175000017500000000435012310110200017277 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" #include #include /*----------------------------------------------------------------------- * Function: Tm3Copy * Description: copy a transform * Args: Tsrc: source transform (INPUT) * Tdst: destination transform (OUTPUT) * Returns: nothing * Author: hanrahan, mbp * Date: Thu Aug 8 15:40:09 1991 * Notes: */ void Tm3Copy( Tsrc, Tdst ) Transform3 Tsrc, Tdst; { memcpy( (char *)Tdst, (char *)Tsrc, sizeof(Transform3) ); } /*----------------------------------------------------------------------- * Function: Tm3Compare * Description: compare 2 transforms * Args: T1, T2: the two transforms * tol: tolerance * Returns: 1 if equal, 0 if not * Author: hanrahan, mbp * Date: Thu Aug 8 15:40:09 1991 * Notes: "equal" means corresponding elements are within tol of * each other. */ int Tm3Compare( Transform3 T1, Transform3 T2, float tol ) { int i,j; double d; for (i=0; i<4; ++i) for (j=0; j<4; ++j) { d = T1[i][j] - T2[i][j]; if (fabs(d) > tol) { return 0; } } return 1; } geomview-1.9.5/src/lib/geometry/transform3/tm3dual.c0000644000175000017500000000322212310110200017247 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /*----------------------------------------------------------------------- * Function: Tm3Dual * Description: compute the dual of a matrix * Args: T: the matrix to compute the dual of (INPUT) * Tdual: the dual matrix (OUTPUT) * Returns: nothing * Author: mbp * Date: Thu Aug 8 14:43:24 1991 * Notes: dual = transpose of adjoint matrix */ void Tm3Dual(Transform3 T, Transform3 Tdual) { Tm3Adjoint( T, Tdual ); Tm3Transpose( Tdual, Tdual ); } geomview-1.9.5/src/lib/geometry/transform3/tm3identity.c0000644000175000017500000000303612310110200020156 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" Transform3 TM3_IDENTITY = { {1.0, 0.0, 0.0, 0.0}, {0.0, 1.0, 0.0, 0.0}, {0.0, 0.0, 1.0, 0.0}, {0.0, 0.0, 0.0, 1.0} }; /* * Initialize a matrix to identity * * ( 1 0 0 0 ) * ( 0 1 0 0 ) * [a] = ( 0 0 1 0 ) * ( 0 0 0 1 ) */ void Tm3Identity( T ) Transform3 T; { Tm3Copy( TM3_IDENTITY, T ); } geomview-1.9.5/src/lib/geometry/transform3/tm3invert.c0000644000175000017500000000511112310110200017630 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /*----------------------------------------------------------------------- * Function: Tm3Invert * Description: compute the inverse of a Transform * Args: m: the transform (INPUT) * mi: the inverse transform (OUTPUT) * Returns: nothing * Author: njt * Date: Sat Jul 18 12:04:19 CDT 1992 */ float Tm3Invert(Transform3 m, Transform3 mi) { int i, j; int k; float x; Transform3 t; float f; Tm3Copy(m, t); Tm3Copy(TM3_IDENTITY, mi); /* Components of unrolled inner loops: */ #define SUB(v,k) v[j][k] -= f*v[i][k] #define SWAP(v,k) x = v[i][k], v[i][k] = v[largest][k], v[largest][k] = x for (i = 0; i < 4; i++) { int largest = i; float largesq = t[i][i]*t[i][i]; for (j = i+1; j < 4; j++) if ((x = t[j][i]*t[j][i]) > largesq) largest = j, largesq = x; /* swap t[i][] with t[largest][] */ SWAP(t,0); SWAP(t,1); SWAP(t,2); SWAP(t,3); SWAP(mi,0); SWAP(mi,1); SWAP(mi,2); SWAP(mi,3); for (j = i+1; j < 4; j++) { f = t[j][i] / t[i][i]; /* subtract f*t[i][] from t[j][] */ SUB(t,0); SUB(t,1); SUB(t,2); SUB(t,3); SUB(mi,0); SUB(mi,1); SUB(mi,2); SUB(mi,3); } } for (i = 0; i < 4; i++) { f = t[i][i]; for (k = 0; k < 4; k++) { t[i][k] /= f; mi[i][k] /= f; } } for (i = 3; i >= 0; i--) for (j = i-1; j >= 0; j--) { f = t[j][i]; SUB(t,0); SUB(t,1); SUB(t,2); SUB(t,3); SUB(mi,0); SUB(mi,1); SUB(mi,2); SUB(mi,3); } return 1; } geomview-1.9.5/src/lib/geometry/transform3/tm3ortho.c0000644000175000017500000000414112310110200017456 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "transform3.h" /* * ( 2/(r-l) 0 0 0 ) * ( 0 2/(t-b) 0 0 ) * T = ( 0 0 -2/(f-n) 0 ) * ( -(r+l)/(r-l) -(t+b)/(t-b) -(f+n)/(f-n) 1 ) * * Transform to the unit cube! Also flips from rh to lh. */ void Tm3Orthographic( Transform3 T, float l, float r, float b, float t, float n, float f ) { Tm3Identity( T ); if( l == r ) { fprintf( stderr, "Tm3Orthographic: l and r must be different.\n" ); return; } if( b == t ) { fprintf( stderr, "Tm3Orthographic: b and t must be different.\n" ); return; } if( n == f ) { fprintf( stderr, "Tm3Orthographic: n and f must be different.\n" ); return; } T[TMX][TMX] = 2/(r-l); T[TMY][TMY] = 2/(t-b); T[TMZ][TMZ] = -2/(f-n); T[TMW][TMX] = -(r+l)/(r-l); T[TMW][TMY] = -(t+b)/(t-b); T[TMW][TMZ] = -(f+n)/(f-n); } geomview-1.9.5/src/lib/geometry/transform3/tm3persp.c0000644000175000017500000000521412310110200017456 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include "transform3.h" #include "ooglutil.h" /* For OOGLError */ /* * ( 2*n/(r-l) 0 0 0 ) * ( 0 2*n/(t-b) 0 0 ) * T = ( (r+l)/(r-l) (t+b)/(t-b) (f+n)/(n-f) -1 ) * ( 0 0 2*f*n/(n-f) 0 ) * * Transform a row vector {xw,yw,zw,w} * T => {X,Y,Z,-z} * mapping the given viewing frustum into the cube -1 <= {X,Y,Z} <= 1, * with Z = -1 at near plane (z = -n), +1 at far plane (z = -f) * since the camera is looking in its -Z direction. * Here l and r are the x coordinates, and b and t the y coordinates, * of the edges of the viewing frustum at the near plane, z = -n. * * Note that n and f should be the positive distances to the near & far planes, * not the negative Z coordinates of those planes. */ void Tm3Perspective( Transform3 T, float l, float r, float b, float t, float n, float f ) { Tm3Identity( T ); if( l == r ) { OOGLError(1/*UserError*/, "Tm3Perspective: l and r must be different." ); return; } if( b == t ) { OOGLError(1/*UserError*/, "Tm3Perspective: b and t must be different." ); return; } if( n == f ) { OOGLError(1/*UserError*/, "Tm3Perspective: n and f must be different." ); return; } T[TMX][TMX] = 2*n/(r-l); T[TMY][TMY] = 2*n/(t-b); T[TMZ][TMZ] = -(f+n)/(f-n); T[TMW][TMW] = 0.; T[TMZ][TMW] = -1; T[TMZ][TMX] = (r+l)/(r-l); T[TMZ][TMY] = (t+b)/(t-b); T[TMW][TMZ] = 2*n*f/(n-f); } geomview-1.9.5/src/lib/geometry/transform3/tm3perspfov.c0000644000175000017500000000430412310110200020170 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include "radians.h" #include "transform3.h" #include "ooglutil.h" /* For OOGLError() */ /* * * ( cot(fov/2)/aspect 0 0 0 ) * ( 0 cot(fov/2) 0 0 ) * T = ( 0 0 -(f+n)/(f-n) -1 ) * ( 0 0 -2*f*n/(f-n) 0 ) * * Transform to the unit cube. Also flip from rh to lh. */ void Tm3PerspectiveFOV( Transform3 T, float fov, float aspect, float n, float f ) { float cotfov; Tm3Identity( T ); if( n == f ) { OOGLError(1/*UserError*/, "Tm3Perspective: n and f must be different" ); return; } if( fov == 0. ) { OOGLError(1/*UserError*/, "Tm3Perspective: fov must not equal 0" ); return; } cotfov = tan( RADIANS(fov)/2.0 ); if( cotfov != 0. ) cotfov = 1. / cotfov; T[TMX][TMX] = cotfov/aspect; T[TMY][TMY] = cotfov; T[TMZ][TMZ] = -2*(f+n)/(f-n); T[TMW][TMZ] = -2*f*n/(f-n); T[TMX][TMW] = -1.; T[TMW][TMW] = 0.; } geomview-1.9.5/src/lib/geometry/transform3/tm3print.c0000644000175000017500000000311112310110200017453 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "transform3.h" void Tm3Print(FILE *f, Transform3 T) { int i, j; if (f == NULL) { return; } fprintf(f, "transform {\n"); for (i=0; i<4; i++) { fprintf(f, " "); for (j=0; j<4; j++) { fprintf(f, "%10.7f ", T[i][j] ); } fprintf(f, "\n" ); } fprintf(f, "}\n" ); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/geometry/transform3/tm3rotate.c0000644000175000017500000001321212310110200017620 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips, Nathaniel Thurston */ #include #include "radians.h" #include "transform3.h" #include "point3.h" Point3 TM3_XAXIS = { 1.0, 0.0, 0.0 }; Point3 TM3_YAXIS = { 0.0, 1.0, 0.0 }; Point3 TM3_ZAXIS = { 0.0, 0.0, 1.0 }; void Tm3RotateX( Transform3 T, float angle ) { Tm3Identity( T ); Ctm3RotateX( T, angle ); } void Tm3RotateY( Transform3 T, float angle ) { Tm3Identity( T ); Ctm3RotateY( T, angle ); } void Tm3RotateZ( Transform3 T, float angle ) { Tm3Identity( T ); Ctm3RotateZ( T, angle ); } /* * Construct the matrix for a rotation about an axis. */ void Tm3Rotate( Transform3 T, float angle, Point3 *axis ) { Point3 Vu; float sinA, cosA, versA; if( axis == &TM3_XAXIS ) Tm3RotateX( T, angle ); else if( axis == &TM3_YAXIS ) Tm3RotateY( T, angle ); else if( axis == &TM3_ZAXIS ) Tm3RotateZ( T, angle ); else { Pt3Copy( axis, (Point3 *)&Vu ); Pt3Unit( &Vu ); sinA = sin(angle); cosA = cos(angle); versA = 1 - cosA; Tm3Identity( T ); T[TMX][TMX] = Vu.x*Vu.x*versA + cosA; T[TMY][TMX] = Vu.x*Vu.y*versA - Vu.z*sinA; T[TMZ][TMX] = Vu.x*Vu.z*versA + Vu.y*sinA; T[TMX][TMY] = Vu.y*Vu.x*versA + Vu.z*sinA; T[TMY][TMY] = Vu.y*Vu.y*versA + cosA; T[TMZ][TMY] = Vu.y*Vu.z*versA - Vu.x*sinA; T[TMX][TMZ] = Vu.x*Vu.z*versA - Vu.y*sinA; T[TMY][TMZ] = Vu.y*Vu.z*versA + Vu.x*sinA; T[TMZ][TMZ] = Vu.z*Vu.z*versA + cosA; } } /* * Construct the matrix for the geodesic rotation between two vectors. */ void Tm3RotateBetween( Transform3 T, Point3 *vfrom, Point3 *vto ) { Point3 Vu; float len, sinA, cosA, versA; Tm3Identity( T ); len = sqrt(Pt3Dot(vfrom,vfrom) * Pt3Dot(vto,vto)); if(len == 0) return; cosA = Pt3Dot(vfrom,vto) / len; versA = 1 - cosA; Pt3Cross( vfrom, vto, &Vu ); sinA = Pt3Length( &Vu ) / len; if(sinA == 0) return; Pt3Mul( 1/(len*sinA), &Vu, &Vu ); /* Normalize Vu */ T[TMX][TMX] = Vu.x*Vu.x*versA + cosA; T[TMY][TMX] = Vu.x*Vu.y*versA - Vu.z*sinA; T[TMZ][TMX] = Vu.x*Vu.z*versA + Vu.y*sinA; T[TMX][TMY] = Vu.y*Vu.x*versA + Vu.z*sinA; T[TMY][TMY] = Vu.y*Vu.y*versA + cosA; T[TMZ][TMY] = Vu.y*Vu.z*versA - Vu.x*sinA; T[TMX][TMZ] = Vu.x*Vu.z*versA - Vu.y*sinA; T[TMY][TMZ] = Vu.y*Vu.z*versA + Vu.x*sinA; T[TMZ][TMZ] = Vu.z*Vu.z*versA + cosA; } /*----------------------------------------------------------------------- * Function: Tm3RotateTowardZ * Description: Rotation of 3-space moving pt to positive z-axis * Args: T: output matrix * pt: input point * Returns: nothing * Author: njt (comments by mbp) * Date: (before) Tue Aug 18 23:31:58 1992 */ void Tm3RotateTowardZ( Transform3 T, HPoint3 *pt ) { Transform3 S; float r = pt->z; /* Construct T = rotation about x-axis moving pt into x-z plane */ Tm3Identity(T); r = sqrt(pt->y*pt->y + r*r); if (r > 0) { T[2][1] = -(T[1][2] = pt->y/r); T[2][2] = T[1][1] = pt->z/r; } /* Construct S = rotation about y axis moving T(pt) into y-z plane */ Tm3Identity(S); r = sqrt(pt->x*pt->x + r*r); if (r > 0) { S[2][0] = -(S[0][2] = pt->x/r); S[2][2] = S[0][0] = sqrt(pt->z*pt->z + pt->y*pt->y)/r; } /* Desired transform is then S * T */ Tm3Concat(T, S, T); } /* Tm3CarefulRotateTowardZ gives a matrix which rotates the world * about an axis perpendicular to both pos and the z axis, which moves * the -Z axis to pos (so [0,0,-1,0] * T = pos). * Unlike Tm3RotateTowardZ, the "twist" is well-defined * provided that it is not asked to rotate the negative z axis toward * the positive z axis. */ void Tm3CarefulRotateTowardZ( Transform3 T, HPoint3 *pos ) { Transform3 S; Transform3 Sinv; static HPoint3 minusZ = { 0,0,-1,0 }; HPoint3 perp, axis, posxy; double dist, c, s; /* first, find a rotation takes both pos and the z axis into the xy plane */ perp.x = -pos->y; perp.y = pos->x; perp.z = 0; perp.w = 1; Tm3RotateTowardZ(S, &perp); /* now, rotate pos and the -Z axis to this plane */ HPt3Transform(S, &minusZ, &axis); HPt3Transform(S, pos, &posxy); /* find the rotation matrix for the transformed points */ c = axis.x * posxy.x + axis.y * posxy.y; s = axis.x * posxy.y - axis.y * posxy.x; dist = sqrt(c*c+s*s); Tm3Identity(T); if (dist > 0) { c /= dist; s /= dist; T[0][0] = c; T[0][1] = s; T[1][0] = -s; T[1][1] = c; } else if(pos->z > 0) { T[1][1] = T[2][2] = -1; /* Singular rotation: arbitrarily flip YZ */ } /* else no rotation */ /* Finally, conjugate the result back to the original coordinate system */ Tm3Invert(S, Sinv); Tm3Concat(S, T, T); Tm3Concat(T, Sinv, T); } geomview-1.9.5/src/lib/geometry/transform3/tm3scale.c0000644000175000017500000000247412310110200017421 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" void Tm3Scale( Transform3 T, float sx, float sy, float sz ) { Tm3Identity( T ); Ctm3Scale( T, sx, sy, sz ); } geomview-1.9.5/src/lib/geometry/transform3/tm3stack.c0000644000175000017500000000315512310110200017434 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stdio.h" #include "transform3.h" # define MAXSTACK 32 static int maxstack = 0; static Transform3 stack[MAXSTACK]; void Tm3Push( T ) Transform3 T; { if( maxstack < MAXSTACK ) Tm3Copy( T, stack[maxstack++] ); else fprintf( stderr, "Stack Overflow at 32\n" ); } void Tm3Pop( T ) Transform3 T; { if( maxstack > 0 ) Tm3Copy( stack[--maxstack], T ); else fprintf( stderr, "Stack Underflow\n" ); } geomview-1.9.5/src/lib/geometry/transform3/tm3tetrad.c0000644000175000017500000000473212310110200017614 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /*----------------------------------------------------------------------- * Function: Tm3Tetrad * Description: create a matrix with given vectors as rows * Args: T: the created matrix (OUTPUT) * x: row 1 (INPUT) * y: row 2 (INPUT) * z: row 3 (INPUT) * w: row 4 (INPUT) * Returns: nothing * Author: hanrahan, mbp * Date: Thu Aug 8 13:06:48 1991 * Notes: */ void Tm3Tetrad( Transform3 T, HPoint3 *x, HPoint3 *y, HPoint3 *z, HPoint3 *w ) { T[TMX][TMX] = x->x; T[TMX][TMY] = x->y; T[TMX][TMZ] = x->z; T[TMX][TMW] = x->w; T[TMY][TMX] = y->x; T[TMY][TMY] = y->y; T[TMY][TMZ] = y->z; T[TMY][TMW] = y->w; T[TMZ][TMX] = z->x; T[TMZ][TMY] = z->y; T[TMZ][TMZ] = z->z; T[TMZ][TMW] = z->w; T[TMW][TMX] = w->x; T[TMW][TMY] = w->y; T[TMW][TMZ] = w->z; T[TMW][TMW] = w->w; } void Tm3Tetrad3( Transform3 T, Point3 *x, Point3 *y, Point3 *z, Point3 *w ) { T[TMX][TMX] = x->x; T[TMX][TMY] = x->y; T[TMX][TMZ] = x->z; T[TMX][TMW] = 0; T[TMY][TMX] = y->x; T[TMY][TMY] = y->y; T[TMY][TMZ] = y->z; T[TMY][TMW] = 0; T[TMZ][TMX] = z->x; T[TMZ][TMY] = z->y; T[TMZ][TMZ] = z->z; T[TMZ][TMW] = 0; T[TMW][TMX] = w->x; T[TMW][TMY] = w->y; T[TMW][TMZ] = w->z; T[TMW][TMW] = 1; } geomview-1.9.5/src/lib/geometry/transform3/tm3translate.c0000644000175000017500000001017112310110200020320 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips, Nathaniel Thurston */ #include "transform.h" #include #include void Tm3Translate( Transform3 T, Tm3Coord tx, Tm3Coord ty, Tm3Coord tz ) { HPoint3 pt; pt.x = tx; pt.y = ty; pt.z = tz; pt.w = 1; Tm3TranslateOrigin(T, &pt); } void Tm3TranslateOrigin( Transform3 T, HPoint3 *pt ) { Tm3Identity(T); T[3][0] = pt->x / pt->w; T[3][1] = pt->y / pt->w; T[3][2] = pt->z / pt->w; } /************************************************************************/ void Tm3HypTranslate( Transform3 T, Tm3Coord tx, Tm3Coord ty, Tm3Coord tz ) { HPoint3 pt; float t = sqrt( tx*tx + ty*ty + tz*tz ); if(t > 0) { pt.x = sinh(t) * tx / t; pt.y = sinh(t) * ty / t; pt.z = sinh(t) * tz / t; pt.w = cosh(t); Tm3HypTranslateOrigin(T, &pt); } else { Tm3Identity(T); } } static void minkowski_normalize( HPoint3 *pt ) { float f = sqrt( pt->w*pt->w - pt->x*pt->x - pt->y*pt->y - pt->z*pt->z ); pt->x /= f; pt->y /= f; pt->z /= f; pt->w /= f; } void Tm3HypTranslateOrigin( Transform3 T, HPoint3 *pt ) { Transform R, Rinv; minkowski_normalize(pt); Tm3Identity(T); T[2][3] = T[3][2] = sqrt(pt->x*pt->x + pt->y*pt->y + pt->z*pt->z); T[2][2] = T[3][3] = pt->w; Tm3RotateTowardZ(R, pt); Tm3Invert(R, Rinv); Tm3Concat(R, T, T); Tm3Concat(T, Rinv, T); } /***********************************************************************/ void Tm3SphTranslate( Transform3 T, Tm3Coord tx, Tm3Coord ty, Tm3Coord tz ) { HPoint3 pt; float t = sqrt( tx*tx + ty*ty + tz*tz ); if(t > 0) { pt.x = sin(t) * tx / t; pt.y = sin(t) * ty / t; pt.z = sin(t) * tz / t; pt.w = cos(t); Tm3SphTranslateOrigin(T, &pt); } else { Tm3Identity(T); } } static void sph_normalize(HPoint3 *pt) { /* the following line originally did not have sqrt; but I think it should. Right? -- mbp Thu Dec 10 11:02:46 1992 */ float t = sqrt( pt->x*pt->x + pt->y*pt->y + pt->z*pt->z + pt->w*pt->w ); if(t > 0) { pt->x /= t; pt->y /= t; pt->z /= t; pt->w /= t; } } void Tm3SphTranslateOrigin( Transform3 T, HPoint3 *pt ) { Transform R, Rinv; sph_normalize(pt); Tm3Identity(T); T[2][3] = -(T[3][2] = sqrt(pt->x*pt->x + pt->y*pt->y + pt->z*pt->z)); T[2][2] = T[3][3] = pt->w; Tm3RotateTowardZ(R, pt); Tm3Invert(R, Rinv); Tm3Concat(R, T, T); Tm3Concat(T, Rinv, T); } void Tm3SpaceTranslate( Transform3 T, Tm3Coord tx, Tm3Coord ty, Tm3Coord tz, int space) { switch (TM_SPACE(space)) { case TM_EUCLIDEAN: default: Tm3Translate(T, tx, ty, tz); break; case TM_HYPERBOLIC: Tm3HypTranslate(T, tx, ty, tz); break; case TM_SPHERICAL: Tm3SphTranslate(T, tx, ty, tz); break; } } void Tm3SpaceTranslateOrigin( Transform3 T, HPoint3 *pt, int space) { switch (TM_SPACE(space)) { case TM_EUCLIDEAN: default: Tm3TranslateOrigin(T, pt); break; case TM_HYPERBOLIC: Tm3HypTranslateOrigin(T, pt); break; case TM_SPHERICAL: Tm3SphTranslateOrigin(T, pt); break; } } geomview-1.9.5/src/lib/geometry/transform3/tm3transpose.c0000644000175000017500000000363512310110200020350 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /*----------------------------------------------------------------------- * Function: Tm3Transpose * Description: transpose a matrix * Args: T: the matrix to transpose (INPUT) * Ttrans: the transposed matrix (OUTPUT) * Returns: nothing * Author: hanrahan, mbp * Date: Thu Aug 8 14:41:24 1991 * Notes: */ void Tm3Transpose( T, Ttrans ) Transform3 T, Ttrans; { int i, j; double t; if( T != Ttrans ) { for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) Ttrans[i][j] = T[j][i]; } else { for( i=0; i<4; i++ ) for( j=0; j #include "transform3.h" /* Compute the polar decomposition of a 3x3 matrix by means of a fast * Newton's iteration: * * A. A. DUBRULLE. AN OPTIMUM ITERATION FOR THE MATRIX POLAR DECOMPOSITION. * Electronic Transactions on Numerical Analysis, Volume 8, 1999, pp. 21-25, * Kent State University. * * Actually, we just compute the ortogonal factor Q, for any square * matrix A we have A=SQ with S symmetric pos. semi-definite and Q an * orthogonal matrix. Q is unique (up to renumbering of basis vectors) * if S is spd. */ static Tm3Coord frob_norm(Transform3 A); static void invt3x3(Transform3 A, Transform3 Ainv); static inline void axpbyt3x3(Tm3Coord a, Transform3 x, Tm3Coord b, Transform3 y, Transform3 res); #define EPS 1e-8 void Tm3PolarDecomp(Transform3 A, Transform3 Q) { Tm3Coord limit, g, f, pf; Transform3 a; Tm3Copy(A, Q); limit = (1.0+EPS)*sqrt(3.0); invt3x3(Q, a); g = sqrt(frob_norm(a)/frob_norm(Q)); axpbyt3x3(0.5*g, Q, 0.5/g, a, Q); f = frob_norm(Q); pf = 1e8; while (f > limit && f < pf) { pf = f; invt3x3(Q, a); g = sqrt(frob_norm(a) / f); axpbyt3x3(0.5*g, Q, 0.5/g, a, Q); f = frob_norm(Q); } } static Tm3Coord frob_norm(Transform3 A) { int i, j; Tm3Coord res = 0.0; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { res += A[i][j]* A[i][j]; } } return sqrt(res); } static void wedge(Tm3Coord v[3], Tm3Coord w[3], Tm3Coord z[3]) { z[0] = v[1]*w[2] - v[2]*w[1]; z[1] = v[2]*w[0] - v[0]*w[2]; z[2] = v[0]*w[1] - v[1]*w[0]; } static Tm3Coord scp(Tm3Coord v[3], Tm3Coord w[3]) { return v[0]*w[0] + v[1]*w[1] + v[2]*w[2]; } static void invt3x3(Transform3 A, Transform3 Ainv) { Tm3Coord det_1; int i, j; wedge(A[1], A[2], Ainv[0]); wedge(A[2], A[0], Ainv[1]); wedge(A[0], A[1], Ainv[2]); det_1 = 1.0/scp(A[0], Ainv[0]); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { Ainv[i][j] *= det_1; } } } static inline void axpbyt3x3(Tm3Coord a, Transform3 x, Tm3Coord b, Transform3 y, Transform3 res) { int i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { res[i][j] = a * x[i][j] + b * y[j][i]; } } } geomview-1.9.5/src/lib/geometry/transform3/3d.h0000644000175000017500000000240112310110200016207 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _3dDEFS_ #define _3dDEFS_ #include #include #include "point.h" #include "plane.h" #include "line.h" #include "point3.h" #include "hpointn.h" #include "transform.h" #include "transformn.h" #include "radians.h" #include "ooglutil.h" #include "polyint.h" #endif geomview-1.9.5/src/lib/geometry/transform3/radians.h0000644000175000017500000000231212310110200017323 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef RADIANSDEF #define RADIANSDEF /* From Knuth: vol I */ #ifndef PI #define PI 3.1415926535897932384626433832795028841972 #endif #define RADIANS(angle) ((PI/180.0)*(angle)) #define DEGREES(angle) ((180.0/PI)*(angle)) #endif geomview-1.9.5/src/lib/geometry/transform3/transform3.h0000644000175000017500000001424412310110200020007 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GV_TRANSFORM3_H_ #define _GV_TRANSFORM3_H_ #include #include "geomtypes.h" /* * Space & model flags; used to specify what space we're in, and * a model for hyperbolic space. The actual value may be a logical * OR of a space and a model value. */ #define TM_HYPERBOLIC 0x0001 #define TM_EUCLIDEAN 0x0002 #define TM_SPHERICAL 0x0004 #define TM_SPACE(x) (x & 0x00ff) #define TM_MODEL(x) (x & 0xff00) #define TM_VIRTUAL 0x0100 #define TM_PROJECTIVE 0x0200 #define TM_CONFORMAL_BALL 0x0400 #define TMNULL ((TransformPtr)NULL) /* How to pass a NULL Transform3 ptr */ #define TMX 0 #define TMY 1 #define TMZ 2 #define TMW 3 extern Point3 TM3_XAXIS; extern Point3 TM3_YAXIS; extern Point3 TM3_ZAXIS; extern Transform3 TM3_IDENTITY; extern void Tm3Adjoint( Transform3, Transform3 ); extern float Tm3Invert( Transform3 T, Transform3 Tinv ); extern float Tm3Determinant( Transform3 T ); extern void Tm3Dual( Transform3 T, Transform3 Tdual ); extern void Tm3Transpose( Transform3 Ta, Transform3 Tb ); extern void Tm3PostConcat( Transform3 Ta, Transform3 Tb ); extern void Tm3PreConcat( Transform3 Ta, Transform3 Tb ); extern void Tm3Concat( Transform3 Ta, Transform3 Tb, Transform3 Tc ); extern void Tm3PolarDecomp( Transform3, Transform3 ); extern void Tm3Print(FILE *f, Transform3 T); extern void Tm3Copy( Transform3 Tsrc, Transform3 Tdst ); extern int Tm3Compare( Transform3 T1, Transform3 T2, float tol ); extern void Tm3Push( Transform3 T ); extern void Tm3Pop( Transform3 T ); extern void Tm3Conjugate( Transform3 T, Transform3 Tcon, Transform3 Tres ); extern void Tm3Identity( Transform3 T ); extern void Tm3Tetrad( Transform3 T, HPoint3 *x,HPoint3 *y,HPoint3 *z,HPoint3 *w ); extern void Tm3Tetrad3( Transform3 T, Point3 *x,Point3 *y,Point3 *z,Point3 *w ); extern void Tm3Translate( Transform3 T, Tm3Coord tx, Tm3Coord ty, Tm3Coord tz ); extern void Tm3TranslateOrigin( Transform3 T, HPoint3 *pt ); extern void Tm3HypTranslate( Transform3 T, Tm3Coord tx, Tm3Coord ty, Tm3Coord tz ); extern void Tm3HypTranslateOrigin( Transform3 T, HPoint3 *pt ); extern void Tm3SphTranslate( Transform3 T, Tm3Coord tx, Tm3Coord ty, Tm3Coord tz ); extern void Tm3SphTranslateOrigin( Transform3 T, HPoint3 *pt ); extern void Tm3SpaceTranslate( Transform3 T, Tm3Coord tx, Tm3Coord ty, Tm3Coord tz, int space ); extern void Tm3SpaceTranslateOrigin( Transform3 T, HPoint3 *pt, int space ); extern void Tm3RotateX( Transform3 T, float angle ); extern void Tm3RotateY( Transform3 T, float angle ); extern void Tm3RotateZ( Transform3 T, float angle ); extern void Tm3Rotate( Transform3 T, float angle, Point3 *axis ); extern void Tm3RotateBetween( Transform3 T, Point3 *from, Point3 *to ); extern void Tm3CarefulRotateTowardZ( Transform3 T, HPoint3 *pos ); extern void Tm3RotateTowardZ( Transform3 T, HPoint3 *pos ); extern void Tm3AlignX( Transform3 T, Point3 *axis ); extern void Tm3AlignY( Transform3 T, Point3 *axis ); extern void Tm3AlignZ( Transform3 T, Point3 *axis ); extern void Tm3Align( Transform3 T, Point3 *axis, Point3 *newaxis ); extern void Tm3Scale( Transform3 T, float sx, float sy, float sz ); extern void Tm3Skew( Transform3 T, float angle, Point3 *axis1, Point3 *axis2 ); extern void Tm3Shear( Transform3 T, Point3 *pt, HPlane3 *pl ); extern void Tm3Reflect( Transform3 T, HPlane3 *pl ); extern int Tm3Refract( Transform3 T, HPlane3 *pl, float eta ); extern int Tm3Refract2( Transform3 T, HPlane3 *pl, float eta ); extern void Tm3Project( Transform3 T, HPlane3 *pl, Point3 *pt ); extern void Tm3Orthographic( Transform3 T, float l, float r, float b, float t, float n, float f ); extern void Tm3Perspective( Transform3 T, float l, float r, float b, float t, float n, float f ); extern void Tm3Window( Transform3 T, float l, float r, float b, float t ); extern void Tm3PerspectiveFOV( Transform3 T, float fov, float aspect, float n, float f ); extern void Ctm3Translate( Transform3 T, float tx, float ty, float tz ); extern void Ctm3RotateX( Transform3 T, float angle ); extern void Ctm3RotateY( Transform3 T, float angle ); extern void Ctm3RotateZ( Transform3 T, float angle ); extern void Ctm3Rotate( Transform3 T, float angle, Point3 *axis ); extern void Ctm3AlignX( Transform3 T, Point3 *axis ); extern void Ctm3AlignY( Transform3 T, Point3 *axis ); extern void Ctm3AlignZ( Transform3 T, Point3 *axis ); extern void Ctm3Align( Transform3 T, Point3 *axis, Point3 *newaxis ); extern void Ctm3Scale( Transform3 T, float sx, float sy, float sz ); extern void Ctm3Skew( Transform3 T, float angle, Point3 *axis1, Point3 *axis2 ); extern void Ctm3Shear( Transform3 T, Point3 *pt, HPlane3 *pl ); extern void Ctm3Reflect( Transform3 T, HPlane3 *pl ); extern int Ctm3Refract( Transform3 T, HPlane3 *pl, float eta ); extern int Ctm3Refract2( Transform3 T, HPlane3 *pl, float eta ); extern void Ctm3Project( Transform3 T, HPlane3 *pl, Point3 *pt ); extern void Ctm3Orthographic( Transform3 T, float l, float r, float b, float t, float n, float f ); extern void Ctm3Perspective( Transform3 T, float l, float r, float b, float t, float n, float f ); extern void Ctm3Window( Transform3 T, float l, float r, float b, float t ); /* include it after defining all prototypes */ #include "point3.h" #include "hpoint3.h" #endif /* _GV_TRANSFORM3_H_ */ geomview-1.9.5/src/lib/geometry/transform3/transform.h0000644000175000017500000000635712310110200017732 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef TRANSFORMDEFS #define TRANSFORMDEFS #include "transform3.h" typedef Transform3 Transform; typedef Tm3Coord TmCoord; #define TmAdjoint Tm3Adjoint #define TmInvert Tm3Invert #define TmDeterminant Tm3Determinant #define TmDual Tm3Dual #define TmTranspose Tm3Transpose #define TmPostConcat Tm3PostConcat #define TmPreConcat Tm3PreConcat #define TmConcat Tm3Concat #define TmConjugate Tm3Conjugate #define TmPolarDecomp Tm3PolarDecomp #define TmPrint Tm3Print #define TmCopy Tm3Copy #define TmCompare Tm3Compare #define TmPush Tm3Push #define TmPop Tm3Pop #define TmIdentity Tm3Identity #define TmScale Tm3Scale #define TmRotateX Tm3RotateX #define TmRotateY Tm3RotateY #define TmRotateZ Tm3RotateZ #define TmRotate Tm3Rotate #define TmRotateBetween Tm3RotateBetween #define TmRotateTowardZ Tm3RotateTowardZ #define TmCarefulRotateTowardZ Tm3CarefulRotateTowardZ #define TmAlignX Tm3AlignX #define TmAlignY Tm3AlignY #define TmAlignZ Tm3AlignZ #define TmAlign Tm3Align #define CtmTranslate Ctm3Translate #define CtmScale Ctm3Scale #define CtmRotateX Ctm3RotateX #define CtmRotateY Ctm3RotateY #define CtmRotateZ Ctm3RotateZ #define CtmRotate Ctm3Rotate #define CtmAlignX Ctm3AlignX #define CtmAlignY Ctm3AlignY #define CtmAlignZ Ctm3AlignZ #define CtmAlign Ctm3Align #define TM_XAXIS TM3_XAXIS #define TM_YAXIS TM3_YAXIS #define TM_ZAXIS TM3_ZAXIS #define TM_IDENTITY TM3_IDENTITY #define TmTranslate Tm3Translate #define TmTranslateOrigin Tm3TranslateOrigin #define TmHypTranslate Tm3HypTranslate #define TmHypTranslateOrigin Tm3HypTranslateOrigin #define TmSphTranslate Tm3SphTranslate #define TmSphTranslateOrigin Tm3SphTranslateOrigin #define TmSpaceTranslate Tm3SpaceTranslate #define TmSpaceTranslateOrigin Tm3SpaceTranslateOrigin #define TmProject Tm3Project #define CtmProject Ctm3Project #define TmReflect Tm3Reflect #define CtmReflect Ctm3Reflect #define CtmRefract Ctm3Refract #define CtmRefract2 Ctm3Refract2 #define TmRefract Tm3Refract #define TmRefract2 Tm3Refract2 #define TmSkew Tm3Skew #define TmShear Tm3Shear #define TmPerspective Tm3Perspective #define TmOrthographic Tm3Orthographic #define TmWindow Tm3Window #define CtmSkew Ctm3Skew #define CtmShear Ctm3Shear #define CtmWindow Ctm3Window #define CtmPerspective Ctm3Perspective #define CtmOrthographic Ctm3Orthographic #endif geomview-1.9.5/src/lib/geometry/transform3/Headers0000644000175000017500000000005012310110200017024 000000000000003d.h radians.h transform.h transform3.h geomview-1.9.5/src/lib/geometry/transformn/0000755000175000017500000000000012310165601015725 500000000000000geomview-1.9.5/src/lib/geometry/transformn/Makefile.in0000644000175000017500000004604612310165553017732 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry/transformn DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libtransformn_la_LIBADD = am_libtransformn_la_OBJECTS = tmNpolardecomp.lo libtransformn_la_OBJECTS = $(am_libtransformn_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libtransformn_la_SOURCES) DIST_SOURCES = $(libtransformn_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libtransformn.la libtransformn_la_SOURCES = \ tmNpolardecomp.c \ transformn.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/transformn/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/transformn/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libtransformn.la: $(libtransformn_la_OBJECTS) $(libtransformn_la_DEPENDENCIES) $(EXTRA_libtransformn_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libtransformn_la_OBJECTS) $(libtransformn_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tmNpolardecomp.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/geometry/transformn/Makefile.am0000644000175000017500000000024112310110200017657 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libtransformn.la libtransformn_la_SOURCES = \ tmNpolardecomp.c \ transformn.h geomview-1.9.5/src/lib/geometry/transformn/tmNpolardecomp.c0000644000175000017500000000521612310110200020762 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include "transformn.h" /* Compute the polar decomposition of a NxN matrix by means of a fast * Newton's iteration: * * A. A. DUBRULLE. AN OPTIMUM ITERATION FOR THE MATRIX POLAR DECOMPOSITION. * Electronic Transactions on Numerical Analysis, Volume 8, 1999, pp. 21-25, * Kent State University. * * Actually, we just compute the ortogonal factor Q, for any square * matrix A we have A=SQ with S symmetric pos. semi-definite and Q an * orthogonal matrix. Q is unique (up to renumbering of basis vectors) * if S is spd. * * We leave the translation and homogeneous part as is, that is * axpbyNxN() only copies the lower NxN square. */ #define EPS 1e-8 static inline HPtNCoord frob_norm(TransformN *A) { int i, j; HPtNCoord res = 0.0; int idim = A->idim, odim = A->odim; for (i = 1; i < idim; i++) { for (j = 1; j < odim; j++) { res += A->a[i*odim+j]* A->a[i*odim+j]; } } return sqrt(res); } /* a X + b Y^t */ static inline void axpbytNxN(HPtNCoord a, TransformN *x, HPtNCoord b, TransformN *y, TransformN *res) { int i, j; int dim = x->idim; for (i = 1; i < dim; i++) { for (j = 1; j < dim; j++) { res->a[i*dim+j] = a * x->a[i*dim+j] + b * y->a[j*dim+i]; } } } TransformN *TmNPolarDecomp(const TransformN *A, TransformN *Q) { HPtNCoord limit, g, f, pf; TransformN *a; Q = TmNCopy(A, Q); limit = (1.0+EPS)*sqrt((float)(A->odim-1)); a = TmNInvert(Q, NULL); g = sqrt(frob_norm(a)/frob_norm(Q)); axpbytNxN(0.5*g, Q, 0.5/g, a, Q); f = frob_norm(Q); pf = 1e8; while (f > limit && f < pf) { pf = f; TmNInvert(Q, a); g = sqrt(frob_norm(a) / f); axpbytNxN(0.5*g, Q, 0.5/g, a, Q); f = frob_norm(Q); } TmNDelete(a); return Q; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/geometry/transformn/transformn.h0000644000175000017500000010111412310110200020166 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, * Mark Phillips, Olaf Holt, Claus-Justus Heine */ #ifndef _GV_TRANSFORMN_H_ #define _GV_TRANSFORMN_H_ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "geomtypes.h" #include "freelist.h" #define TMNMAGIC OOGLMagic('T', 1) extern DEF_FREELIST(TransformN); /* Refer to the (i,j)'th entry in a TransformN object; * beware that (i,j) are not checked! */ #define TmNentry(T, i, j) ((T)->a[(i)*(T)->odim + (j)]) extern TransformN *TmNPolarDecomp(const TransformN *A, TransformN *Q); static inline TransformN *TmNCreate(int idim, int odim, HPtNCoord *a); static inline void TmNDelete(TransformN *T); static inline int TmNSpace(const TransformN *T); static inline TransformN *TmNSetSpace(TransformN *T, int space); static inline TransformN *TmNInvert(const TransformN *T, TransformN *Tinv); static inline TransformN *TmNTranspose(const TransformN *from, TransformN *to); static inline TransformN *TmNConcat(const TransformN *A, const TransformN *B, TransformN *result); static inline TransformN *TmNCopy(const TransformN *Tsrc, TransformN *Tdst); static inline TransformN *TmNIdentity(TransformN *T); static inline TransformN *TmNTranslateOrigin(TransformN *T, const HPointN *pt); static inline TransformN *TmNPad(const TransformN *Tin, int idim, int odim, TransformN *Tout); static inline TransformN *TmNPadZero(const TransformN *Tin, int idim, int odim, TransformN *Tout); static inline TransformN *TmNSpaceTranslateOrigin( TransformN *T, HPointN *pt ); static inline TransformN *TmNScale(TransformN *T, const HPointN *amount); static inline TransformN *TmNRotate(TransformN *T, const HPointN *from, const HPointN *toward); static inline TransformN *TmNApplyDN(TransformN *mat, int *perm, Transform3 delta); static inline TransformN *TmNApplyT3TN(Transform3 T3, int *perm, TransformN *mat); static inline TransformN *TmNMap(const TransformN *from, int *axes, TransformN *to); static inline TransformN *TmNProject(const TransformN *from, int *perm, TransformN *to); static inline int TmNGetSize(const TransformN *T, int *idim, int *odim); static inline void TmNPrint(FILE *f, const TransformN *T); static inline TransformN *TmNRead(IOBFILE *f, int binary); #include "hpointn.h" #include "hpoint3.h" #ifndef max # define _gv_tmn_max_ # define max(a,b) ((a) > (b) ? (a) : (b)) #endif #ifndef min # define _gv_tmn_min_ # define min(a,b) ((a) < (b) ? (a) : (b)) #endif /* BIG FAT NOTE: internally the homogeneous component of a vector is * located at 0, consequently the translation part of a transform is * stored in the 0-th row of a matrix. This just makes concatenation * etc. much easier when the dimensions of objects do not match. * * Prolongation/truncation is defined as follows: if an input vectors * dim does not match a TransformN's idim, then the input vector is * implicitly padded with zero's (if idim > dim) or the matrix is * interpreted as identity on the "missing" dimensions up to odim (if * dim > idim). The part of the vector with dim > odim is mapped to 0 * (during padding) */ /* Construct a transform. NULL a => identity */ static inline TransformN * TmNCreate(int idim, int odim, HPtNCoord *a) { TransformN *T; FREELIST_NEW(TransformN, T); RefInit((Ref *)T, TMNMAGIC); if (idim <= 0) idim = 1; if (odim <= 0) odim = 1; T->idim = idim; T->odim = odim; T->a = OOGLNewNE(HPtNCoord, idim*odim, "new TransformN data"); if (a == NULL) memset(T->a, 0, idim*odim*sizeof(HPtNCoord)); else memcpy(T->a, a, idim*odim*sizeof(HPtNCoord)); return T; } /* Destroy */ static inline void TmNDelete(TransformN *T) { if (T && RefDecr((Ref*)T) == 0) { if (T->a) { OOGLFree(T->a); } FREELIST_FREE(TransformN, T); } } /* Get and set space */ static inline int TmNSpace(const TransformN *T) { (void)T; return TM_EUCLIDEAN; } static inline TransformN * TmNSetSpace(TransformN *T, int space) { if (space != TM_EUCLIDEAN) { OOGLError(1, "Non-Euclidean space not support in higher dimensions.\n"); return NULL; } return T; } /* Invert */ static inline TransformN * TmNInvert(const TransformN *T, TransformN *Tinv) { int i, j, k; HPtNCoord x; HPtNCoord f; int dim = T->idim; TransformN *t = TmNCreate(dim, dim, T->a); if (T->odim != dim) { OOGLError(1, "Matrix for inversion is not square"); return 0; } if (Tinv == NULL) { Tinv = TmNCreate(dim, dim, NULL); } else if (Tinv->idim != dim || Tinv->odim != dim) { Tinv->a = OOGLRenewNE(HPtNCoord, Tinv->a, dim*dim, "renew TransformN"); Tinv->idim = dim; Tinv->odim = dim; } TmNIdentity(Tinv); /* Components of unrolled inner loops: */ #define SUB(v, k) v[j*dim+k] -= f*v[i*dim+k] #define SWAP(v, k) x = v[i*dim+k], v[i*dim+k] = v[largest*dim+k], v[largest*dim+k] = x for (i = 0; i < dim; i++) { int largest = i; HPtNCoord largesq = t->a[i*dim+i]*t->a[i*dim+i]; for (j = i+1; j < dim; j++) if ((x = t->a[j*dim+i]*t->a[j*dim+i]) > largesq) largest = j, largesq = x; /* swap t->a[i][] with t->a[largest][] */ for(k = 0; k < dim; k++) { SWAP(t->a, k); SWAP(Tinv->a, k); } for (j = i+1; j < dim; j++) { f = t->a[j*dim+i] / t->a[i*dim+i]; /* subtract f*t->a[i][] from t->a[j][] */ for(k = 0; k < dim; k++) { SUB(t->a, k); SUB(Tinv->a, k); } } } for (i = 0; i < dim; i++) { f = t->a[i*dim+i]; for (k = 0; k < dim; k++) { t->a[i*dim+k] /= f; Tinv->a[i*dim+k] /= f; } } for (i = dim-1; i >= 0; i--) for (j = i-1; j >= 0; j--) { f = t->a[j*dim+i]; for(k = 0; k < dim; k++) { SUB(t->a, k); SUB(Tinv->a, k); } } #undef SUB #undef SWAP TmNDelete(t); /* those Geometry Center peoples forgot that ... (cH) */ return Tinv; } /* Transpose */ static inline TransformN * TmNTranspose(const TransformN *from, TransformN *to) { int i, j; int idim = from->idim, odim = from->odim; HPtNCoord t; if (from != to) { if (to == NULL) to = TmNCreate(odim, idim, NULL); else if (to->idim != odim || to->odim != idim) { to->a = OOGLRenewNE(HPtNCoord, to->a, idim*odim, "renew TransformN"); to-> idim = odim; to->odim = idim; } for (i = 0; i < idim; i++) for( j=0; ja[j*idim+i] = from->a[i*odim+j]; } else { #define SWITCH(a, b) t = a; a = b; b = t; if (idim == odim) { for (i = 0; i < idim; i++) for (j = 0; j < i; j++) { SWITCH(to->a[i*odim+j], to->a[j*odim+i]); } } else { int remainder, dividend; to->idim = odim; to->odim = idim; for(i=0; i < idim; i++) for(j=0; j < odim; j++) { remainder = (i*idim +j)%odim; dividend = (i*idim + j -remainder)/odim; SWITCH(to->a[i*odim+j], to->a[dividend*odim+remainder]); } } #undef SWITCH } return to; } /* Multiply transforms * * We pad as necessary, filling diagonals down with 1's as * appropriate. We do not use PadZero(), because the concatenation * would not commute with the matrix operation; i.e. (v A) B should be * the same as v (A B). */ static inline TransformN * TmNConcat(const TransformN *A, const TransformN *B, TransformN *result) { int i, j, k; int dim1, dim2, dim3; if (A == NULL && B == NULL) { return NULL; } else if (A == NULL) { return TmNCopy(B, result); } else if (B == NULL) { return TmNCopy(A, result); } dim1 = A->idim; dim2 = A->odim; dim3 = B->odim; #define MAKEPRODUCT(T, A, B) \ T->idim = dim1; T->odim = dim3; \ for( i=0; ia[i*dim3+j] = 0; \ for( k=0; ka[i*dim3+j] += A->a[i*dim2+k] * B->a[k*dim3+j]; \ } if (B->idim == dim2) { /* the easy case, padding not necessary */ if ( A == result || B == result ) { TransformN *T = TmNCreate( dim1, dim3, NULL); MAKEPRODUCT(T, A, B); TmNCopy(T, result); TmNDelete(T); } else { if (result == NULL) result = TmNCreate(dim1, dim3, NULL); else if (result->idim != dim1 || result->odim != dim3) { result->a = OOGLRenewNE(HPtNCoord, result->a, dim1*dim3, "renew TransformN"); result->idim = dim1; result->odim = dim3; } MAKEPRODUCT(result, A, B); } } else if ( B->idim > dim2) { TransformN *Atmp = TmNCreate(dim1, dim2, NULL); dim2 = B->idim; TmNPad(A, dim1, dim2, Atmp); if ( B == result ) { TransformN *T = TmNCreate( dim1, dim3, NULL); MAKEPRODUCT(T, Atmp, B); TmNCopy(T, result); TmNDelete(T); } else { if (result == NULL) result = TmNCreate(dim1, dim3, NULL); else if (result->idim != dim1 || result->odim != dim3) { result->a = OOGLRenewNE(HPtNCoord, result->a, dim1*dim3, "renew TransformN"); result->idim = dim1; result->odim = dim3; } MAKEPRODUCT(result, Atmp, B); } TmNDelete(Atmp); } else { /* B->idim < dim2 */ TransformN *Btmp = TmNCreate(dim2, dim3, NULL); TmNPad(B, dim2, dim3, Btmp); if ( A == result ) { TransformN *T = TmNCreate( dim1, dim3, NULL); MAKEPRODUCT(T, A, Btmp); TmNCopy(T, result); TmNDelete(T); } else { if (result == NULL) result = TmNCreate(dim1, dim3, NULL); else if (result->idim != dim1 || result->odim != dim3) { result->a = OOGLRenewNE(HPtNCoord, result->a, dim1*dim3, "renew TransformN"); result->idim = dim1; result->odim = dim3; } MAKEPRODUCT(result, A, Btmp); } TmNDelete(Btmp); } #undef MAKEPRODUCT return result; } /* Copy */ static inline TransformN * TmNCopy(const TransformN *Tsrc, TransformN *Tdst) { if (Tsrc != Tdst) { if (Tdst == NULL) { Tdst = TmNCreate(Tsrc->idim, Tsrc->odim, Tsrc->a); } else { if (Tdst->idim != Tsrc->idim || Tdst->odim != Tsrc->odim) { Tdst->a = OOGLRenewNE(HPtNCoord, Tdst->a, Tsrc->idim*Tsrc->odim, "renew TransformN"); Tdst->idim = Tsrc->idim; Tdst->odim = Tsrc->odim; } memcpy(Tdst->a, Tsrc->a, Tsrc->idim*Tsrc->odim*sizeof(HPtNCoord)); } } return Tdst; } /* Set to identity */ static inline TransformN * TmNIdentity(TransformN *T) { if (T == NULL) { T = TmNCreate(1, 1, NULL); T->a[0] = 1; } else { int i; int idim = T->idim, odim = T->odim; memset(T->a, 0, idim*odim*sizeof(HPtNCoord)); if (idim == odim || idim < odim) { for(i = 0; i < idim; i++) T->a[i*odim+i] = 1; } else { /* idim > odim */ for(i = 0; i < odim; i++) T->a[i*odim+i] = 1; } } return T; } /* Euclidean translations * * Be careful: the homogeneous component is now located at index 0. */ static inline TransformN * TmNTranslateOrigin(TransformN *T, const HPointN *pt) { int i; HPtNCoord c = pt->v[0]; int dim = pt->dim; /* first make sure T has the appropriate size etc. */ if (T == NULL) { T = TmNCreate(dim, dim, NULL); TmNIdentity(T); } else { TmNIdentity(T); if (dim > T->odim) { TmNPad(T, T->idim, dim, T); } } /* its so easy now! */ for(i = 1; i < dim; i++) { T->a[i] = pt->v[i] / c; } return T; } /* Pad the transform, with ones down the main diagonal, not assuming a * homogeneous coordinate that needs special attention. This function * explicitly performs the padding which is used implicitly by, * e.g. HPtNTransform() if the dimensions do not match. * * Padding is really simple now because the homogeneous component is * (internally) located at index 0 for HPointN and TransformN. * Therefor TmNPadSimple() has simply be renamed to TmNPad() because * it does the right thing automatically now. */ static inline TransformN * TmNPad(const TransformN *Tin, int idim, int odim, TransformN *Tout) { if (Tin == NULL) { if (Tout == NULL) { Tout = TmNCreate(idim, odim, NULL); } else { Tout->a = OOGLRenewNE(HPtNCoord, Tout->a, idim*odim, "renew TransformN"); Tout->idim = idim; Tout->odim = odim; } TmNIdentity(Tout); } else if ( odim <= 0 || idim <= 0 ) { ; /* do nothing */ } else { int oldidim = Tin->idim, oldodim = Tin->odim; int i, j; if (Tin != Tout) { if (Tout == NULL) { Tout = TmNCreate(idim, odim, NULL); } else if (Tout->idim != idim || Tout->odim != odim) { Tout->a = OOGLRenewNE(HPtNCoord, Tout->a, idim*odim, "renew TransformN"); Tout->idim = idim; Tout->odim = odim; } if (oldidim < idim && oldodim < odim) { /* copy over first oldidim rows */ for (i = 0; i < oldidim; i++) { /* copy start of row */ for(j = 0; j < oldodim; j++) Tout->a[i*odim+j] = Tin->a[i*oldodim+j]; /* fill remaining part */ for(; j < odim; j++) if (i == j) Tout->a[i*odim+j] = 1.0; else Tout->a[i*odim+j] = 0.0; } /* fill remaining rows */ for (; i < idim; i++) { for(j = 0; j < odim; j++) if (i==j) Tout->a[i*odim+j] = 1; else Tout->a[i*odim+j] = 0; } } else if (oldidim < idim && oldodim >= odim) { /* copy over the first oldidim rows, excess colomns are discarded */ for (i = 0; i < oldidim; i++) { for(j = 0; j < odim; j++) Tout->a[i*odim+j] = Tin->a[i*oldodim+j]; } /* copy over the remaining rows, discarding excess columns */ for (; ia[i*odim+j] = 1.0; else Tout->a[i*odim+j] = 0.0; } } else if (oldidim >= idim && oldodim < odim) { /* copy over the first idim rows, excess rows are discarded */ for (i=0; i < idim; i++) { for(j = 0; j < oldodim; j++) Tout->a[i*odim+j] = Tin->a[i*oldodim+j]; for(; j < odim; j++) if (i == j) Tout->a[i*odim+j] = 1; else Tout->a[i*odim+j] = 0; } } else if (oldidim >= idim && oldodim >= odim) { /* copy operation, discard excess columns and rows */ for (i = 0; i < idim; i++) for(j = 0; j < odim; j++) Tout->a[i*odim+j] = Tin->a[i*oldodim+j]; } } else { TransformN *Tnew = TmNCreate(idim, odim, NULL); if ( oldidim < idim && oldodim < odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; for( j=oldodim; ja[i*odim+j] = 1; } for ( i=oldidim; ia[i*odim+j] = 1; } } else if ( oldidim < idim && oldodim >= odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } for ( i=oldidim; ia[i*odim+j] = 1; } } else if ( oldidim >= idim && oldodim < odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; for( j=oldodim; ja[i*odim+j] = 1; } } else if ( oldidim >= idim && oldodim >= odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } TmNCopy(Tnew, Tout); TmNDelete(Tnew); } } return Tout; } /* Pad with zeroes */ static inline TransformN * TmNPadZero(const TransformN *Tin, int idim, int odim, TransformN *Tout) { if (Tin == NULL) { if (Tout == NULL) { Tout = TmNCreate(idim, odim, NULL); } else { Tout->a = OOGLRenewNE(HPtNCoord, Tout->a, idim*odim, "renew TransformN"); memset(Tout->a, 0, idim*odim*sizeof(HPtNCoord)); Tout->idim = idim; Tout->odim = odim; } } else if ( odim <= 0 || idim <= 0 ) { ; /* do nothing */ } else { int oldidim = Tin->idim, oldodim = Tin->odim; int i, j; if (Tin != Tout) { if (Tout == NULL) { Tout = TmNCreate(idim, odim, NULL); } else if (Tout->idim != idim || Tout->odim != odim) { Tout->a = OOGLRenewNE(HPtNCoord, Tout->a, idim*odim, "renew TransformN"); Tout->idim = idim; Tout->odim = odim; } memset(Tout->a, 0, idim*odim*sizeof(HPtNCoord) ); if ( oldidim < idim && oldodim < odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } } else if ( oldidim < idim && oldodim >= odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } } else if ( oldidim >= idim && oldodim < odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } } else if ( oldidim >= idim && oldodim >= odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } } else { TransformN *Tnew = TmNCreate(idim, odim, NULL); if ( oldidim < idim && oldodim < odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } } else if ( oldidim < idim && oldodim >= odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } } else if ( oldidim >= idim && oldodim < odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } } else if ( oldidim >= idim && oldodim >= odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } TmNCopy(Tnew, Tout); TmNDelete(Tnew); } } return Tout; } /* Translations by the space of 'pt' */ static inline TransformN * TmNSpaceTranslateOrigin( TransformN *T, HPointN *pt ) { /* this has not yet been implemented * for now, just call the euclidean one */ return TmNTranslateOrigin(T, pt); } /* Scale by the components of 'amount' * * I.e. generate a matrix which acts as such a scaling. Therefore, if * T != NULL, we resize T such that idim >= dim and odim >= dim. */ static inline TransformN * TmNScale(TransformN *T, const HPointN *amount) { int i; int dim = amount->dim; if (T == NULL) { T = TmNCreate(dim, dim, NULL); } TmNIdentity(T); if (dim != T->idim || dim != T->odim) { #if 0 /* this seems overly complicated ??? */ int idim = T->idim, odim = T->odim; switch( (dim > idim) + 2*(dim>odim) + 4*(idim>odim) ) { case 0: /* odim > idim > dim */ idim = odim; break; case 1: /* odim > dim > idim */ idim = odim; break; case 2: /* impossible */ OOGLError(1, "incorrect switch"); break; case 3: /* dim > odim > idim */ odim = dim; idim = dim; break; case 4: /* idim > odim > dim */ odim = idim; break; case 5: /* impossible */ OOGLError(1, "incorrect switch"); break; case 6: /* idim > dim > odim */ odim = idim; break; case 7: /* dim > idim > odim */ odim = dim; idim = dim; break; } #else /* T shall act as a scaling, so we just have to make sure that * input and output dimension are >= dim. */ int idim = max(T->idim, dim), odim = max(T->odim, dim); #endif TmNPad(T, idim, odim, T); } for(i = 0; i < dim; i++) { T->a[i*T->odim+i] = amount->v[i]; } return T; } /* Construct a geodesic rotation taking vector 'from' to 'toward' */ static inline TransformN * TmNRotate(TransformN *T, const HPointN *from, const HPointN *toward) { int i, j, k; int dim = from->dim; HPtNCoord len, proj, cosA, sinA; HPtNCoord *planebasis1, *planebasis2; /* not homogeneous coords!*/ HPtNCoord planecoord1, planecoord2; planebasis1 = OOGLNewNE(HPtNCoord, 2*dim, "TmNRotate data"); planebasis2 = planebasis1 + dim; #define NORMALIZE(v, vout) \ len = 0; \ for (k = 1; k < dim; k++) \ len += v[k] * v[k]; \ if (len == 0) { \ len = 1; \ } else \ len = sqrt(len); \ for(k = 1; k < dim; k++) \ vout[k] = v[k] / len; #define DOTPRODUCT(v1, v2, result) \ result = 0; \ for (i = 1; i < dim; i++) \ result += v1[i] * v2[i]; if (dim != toward->dim) { if (toward->dim < dim) { HPointN *towardtmp = HPtNCreate(dim, NULL); HPtNPad((HPointN *)toward, dim, towardtmp); if (T == NULL) T = TmNCreate(dim, dim, NULL); else if (T->idim != dim || T->odim != dim) { T->a = OOGLRenewNE(HPtNCoord, T->a, dim*dim, "renew TransformN"); T->idim = dim; T->odim = dim; } memset(T->a+1, 0, (dim*dim-1)*sizeof(HPtNCoord)); T->a[0] = 1.0; NORMALIZE(from->v, planebasis1); DOTPRODUCT(towardtmp->v, planebasis1, proj); for (i = 1; i < dim; i++) planebasis2[i] = towardtmp->v[i] - proj * planebasis1[i]; NORMALIZE(planebasis2, planebasis2); DOTPRODUCT(towardtmp->v, towardtmp->v, len); if ((len = sqrt(len)) == 0) { OOGLError(1, "zero vector unexpected"); return NULL; } cosA = proj / len; sinA = sqrt(1-cosA*cosA); for(i = 1; i < dim; i++) { /* each basis vector */ planecoord1 = (cosA - 1) * planebasis1[i] + sinA * planebasis2[i]; planecoord2 = -sinA * planebasis1[i] + (cosA - 1) * planebasis2[i]; for(j = 1; j < dim; j++) { if (i == j) { T->a[j*dim+i] = 1 + planecoord1*planebasis1[j] + planecoord2*planebasis2[j]; } else { T->a[j*dim+i] = planecoord1*planebasis1[j] + planecoord2*planebasis2[j]; } } } } else { HPointN *fromtmp = HPtNCreate(dim, NULL); dim = toward->dim; HPtNPad((HPointN *)from, dim, fromtmp); if (T == NULL) T = TmNCreate(dim, dim, NULL); else if (T->idim != dim || T->odim != dim) { T->a = OOGLRenewNE(HPtNCoord, T->a, dim*dim, "renew TransformN"); T->idim = dim; T->odim = dim; } memset(T->a+1, 0, (dim*dim-1)*sizeof(HPtNCoord)); T->a[0] = 1.0; NORMALIZE(fromtmp->v, planebasis1); DOTPRODUCT(toward->v, planebasis1, proj); for (i = 1; i < dim; i++) planebasis2[i] = toward->v[i] - proj * planebasis1[i]; NORMALIZE(planebasis2, planebasis2); DOTPRODUCT(toward->v, toward->v, len); if ((len = sqrt(len)) == 0) { OOGLError(1, "zero vector unexpected"); return NULL; } cosA = proj / len; sinA = sqrt(1-cosA*cosA); for (i = 1; i < dim; i++) { /* each basis vector */ planecoord1 = (cosA - 1) * planebasis1[i] + sinA * planebasis2[i]; planecoord2 = -sinA * planebasis1[i] + (cosA - 1) * planebasis2[i]; for (j = 1; j < dim; j++) { if (i == j) { T->a[j*dim+i] = 1 + planecoord1*planebasis1[j] + planecoord2*planebasis2[j]; } else { T->a[j*dim+i] = planecoord1*planebasis1[j] + planecoord2*planebasis2[j]; } } } } } else { if (T == NULL) T = TmNCreate(dim, dim, NULL); else if (T->idim != dim || T->odim != dim) { T->a = OOGLRenewNE(HPtNCoord, T->a, dim*dim, "renew TransformN"); T->idim = dim; T->odim = dim; } memset(T->a+1, 0, (dim*dim-1)*sizeof(HPtNCoord)); T->a[0] = 1; /* form orthonormal basis for plane */ NORMALIZE(from->v, planebasis1); DOTPRODUCT(toward->v, planebasis1, proj); for (i = 1; i < dim; i++) planebasis2[i] = toward->v[i] - proj * planebasis1[i]; NORMALIZE(planebasis2, planebasis2); /* now that we have the basis vectors for the plane, calculate the rotation matrix */ DOTPRODUCT(toward->v, toward->v, len); if ((len = sqrt(len)) == 0) { OOGLError(1, "zero vector unexpected"); return NULL; } cosA = proj / len; sinA = sqrt(1-cosA*cosA); for(i = 1; i < dim; i++) { /* each basis vector */ planecoord1 = (cosA - 1) * planebasis1[i] + sinA * planebasis2[i]; planecoord2 = -sinA * planebasis1[i] + (cosA - 1) * planebasis2[i]; for(j = 1; j < dim; j++) if (i == j) T->a[j*dim+i] = 1 + planecoord1*planebasis1[j] + planecoord2*planebasis2[j]; else T->a[j*dim+i] = planecoord1*planebasis1[j] + planecoord2*planebasis2[j]; } } #undef DOTPRODUCT #undef NORMALIZE OOGLFree(planebasis1); return T; } /* special operation for computing n-d counterpart for movement in a * subspace * * permute tells which dimensions are projected * * delta is the usual 4x4 matrix used in Geomview * * NOTE: this functions computes mat * delta, i.e. delta is applied * from the right */ static inline TransformN * TmNApplyDN(TransformN *mat, int *perm, Transform3 delta) { HPtNCoord sum; int idim, odim; const int d3 = 4; /* this is the dimension of the delta matrix */ HPtNCoord *tmp; int i, j, k; int perm_dim; static const int dflt_perm[] = { 1, 2, 3, 0 }; if (!perm) { perm = (int *)dflt_perm; } perm_dim = perm[0]; for (i = 0; i < d3; i++) { perm_dim = max(perm[i], perm_dim); } ++perm_dim; idim = mat->idim; if (mat->odim < perm_dim) { odim = max(mat->odim, perm_dim); TmNPad(mat, idim, odim, mat); /* Note: the input matrix is changed here */ } else { odim = mat->odim; } /* Make a "copy" of mat, copying only the COLUMNS mentioned in perm. * As delta operates from the right, we need only those columns, but * all rows of mat. */ tmp = OOGLNewNE(HPtNCoord, idim*d3, "TmNApplyDN data"); for (i = 0; i < idim; i++) { for (j= 0; j < d3; j++) { tmp[i*d3+j] = mat->a[i*odim+perm[j]]; } } /* apply delta to the appropriate columns and copy the result back * to mat */ for(i = 0; i < idim; i++) { for (j= 0; j < d3; j++) { sum = 0; for(k = 0; k < d3; k++) { sum += tmp[i*d3+k] * delta[k][j]; } mat->a[i*odim + perm[j]] = sum; } } OOGLFree(tmp); return mat; } /* Apply a 3d transformation from the left (in contrast to * TmNApplyDN() which applies it from the right. */ static inline TransformN * TmNApplyT3TN(Transform3 T3, int *perm, TransformN *mat) { HPtNCoord sum; int idim, odim, d3 = 4; /* this is the dimension of the delta matrix */ HPtNCoord *tmp; int i, j, k; int perm_dim; static const int dflt_perm[] = { 1, 2, 3, 0 }; if (!perm) { perm = (int *)dflt_perm; } /* As TransfromN's are virtually infinite (i.e. act as identity if * the input dimensions do not match), we only have to make sure * that "mat" has enough space such that perm can be applied. */ perm_dim = perm[0]; for (i = 0; i < d3; i++) { perm_dim = max(perm[i], perm_dim); } ++perm_dim; if (!mat) { idim = odim = perm_dim; mat = TmNCreate(idim, odim, NULL); TmNIdentity(mat); } else { odim = mat->odim; if (mat->idim < perm_dim) { idim = max(mat->idim, perm_dim); TmNPad(mat, idim, odim, mat); /* Note: the input matrix is changed here */ } else { idim = mat->idim; } } /* Make a "copy" of mat, copying only the ROWS mentioned in perm. * As delta operates from the right, we need only those rows, but * all columns of mat. */ tmp = OOGLNewNE(HPtNCoord, odim*d3, "TmNApplyDN data"); for(i = 0; i < d3; i++) { for(j= 0; j < odim; j++) { tmp[i*odim+j] = mat->a[perm[i]*odim+j]; } } for (i = 0; i < d3; i++) { for (j = 0; j < odim; j++) { sum = 0; for(k = 0; k < d3; k++) { sum += T3[i][k] * tmp[k*odim+j]; } mat->a[perm[i]*odim + j] = sum; } } OOGLFree(tmp); return mat; } /* concatenate (from the left) with a permutation matrix which maps x, * y, z to the 3d sub-space described by "perm". This means that we * simply have to interchange the rows of from. * * This is meant to map a 3d object to another 3d sub-space, * e.g. a camera geometry. This means that we really want to use * * dflt_perm^{-1} perm * * as permutation. */ static inline TransformN * TmNMap(const TransformN *from, int *axes, TransformN *to) { const int d3 = 4; int odim; int row1, row2, col; int perm_dim, i; static const int dflt_perm[] = { 1, 2, 3, 0 }; static const int inv_perm[] = { 3, 0, 1, 2 }; int perm[4]; if (!axes) { axes = (int *)dflt_perm; } perm_dim = axes[0]; for (i = 1; i < d3; i++) { perm_dim = max(axes[i], perm_dim); } ++perm_dim; for (i = 0; i < d3; i++) { perm[i] = axes[inv_perm[i]]; } if (from == NULL) { odim = perm_dim; to = TmNPadZero(to, d3, odim, to); for (i = 0; i < d3; i++) { to->a[odim*i+perm[i]] = 1.0; } return to; } if (to != from) { odim = from->odim; to = TmNPadZero(to, d3, odim, to); for (row1 = 0; row1 < d3; row1++) { row2 = perm[row1]; for (col = 0; col < odim; col++) { to->a[row1*odim+col] = from->a[row2*odim+col]; } } return to; } /* from == to, need to swap rows in place */ if (to->odim < perm_dim) { TmNPad(to, from->idim, perm_dim, to); } odim = to->odim; for (row1 = 0; row1 < d3; row1++) { row2 = perm[row1]; for (col = 0; col < odim; col++) { HPtNCoord swap = to->a[row1*odim+col]; to->a[row1*odim+col] = to->a[row2*odim+col]; to->a[row2*odim+col] = swap; } } /* simply discard all excess rows */ to->a = OOGLRenewNE(HPtNCoord, to->a, d3*odim, "renew TransformN"); to->idim = d3; return to; } /* Concatenate (from the right) from with the permutation and * projection defined by perm. This function creates an N-transform * which has the effect of HPtNTransformComponents(), but doing the * projection and permutation by a single matrix multiplication spares * a lot of floating point operations, especially in higher * diemensions. * * To will be an idim x 4 matrix. If "perm" contains dimensions not * present in "from", then we can simply ignore those. */ static inline TransformN * TmNProject(const TransformN *from, int *perm, TransformN *to) { static const int dflt_perm[] = { 1, 2, 3, 0 }; const int d3 = 4; /* grin */ int perm_dim, i, j, idim, odim; if (!perm) { perm = (int *)dflt_perm; } perm_dim = perm[0]; for (i = 0; i < d3; i++) { perm_dim = max(perm[i], perm_dim); } ++perm_dim; if (from == NULL) { idim = perm_dim; odim = 0; } else { idim = from->idim; odim = from->odim; } if (to == NULL) { to = TmNCreate(max(perm_dim, idim), d3, NULL); } else { to->idim = max(perm_dim, idim); to->odim = d3; to->a = OOGLRenewNE(HPtNCoord, to->a, to->idim*d3, "renew TransformN"); memset(to->a, 0, perm_dim*d3*sizeof(HPtNCoord)); } for (j = 0; j < d3; j++) { if (perm[j] < odim) { for (i = 0; i < idim; i++) { to->a[i*d3+j] = from->a[i*odim+perm[j]]; } } else { to->a[perm[j]*d3+j] = 1.0; } } return to; } /* Return dimensions of a TransformN. Value is first dimension. */ /* idim and/or odim may be NULL, in which case they're not returned */ static inline int TmNGetSize(const TransformN *T, int *idim, int *odim) { if ( T == NULL) return 0; if (idim) *idim = T->idim; if (odim) *odim = T->odim; return T->idim; } static inline void TmNPrint(FILE *f, const TransformN *T) { int i, j; int idim = T->idim, odim = T->odim; if (f == NULL) { return; } fprintf(f, "ntransform { %d %d\n", idim, odim); for(i = 0; i < idim; i++) { for(j = 0; j < odim; j++) { fprintf(f, "%10.7f ", T->a[i*odim+j]); } fprintf(f, "\n"); } fprintf(f, "}\n"); } static inline TransformN * TmNRead(IOBFILE *f, int binary) { HPtNCoord *a; int got, n, brack = 0; int dim[2]; iobfexpecttoken(f, "ntransform"); if (iobfnextc(f, 0) == '{') brack = iobfgetc(f); if (iobfgetni(f, 2, dim, binary) < 2 || dim[0] <= 0 || dim[1] <= 0) { OOGLSyntax(f, "Expected dimensions of N-D transform"); return NULL; } n = dim[0]*dim[1]; a = OOGLNewNE(HPtNCoord, n, "new TransformN data"); got = iobfgetnf(f, n, a, binary); if (got < n) { OOGLSyntax(f, "N-D transform: error reading %d'th of %d values.", got, n); OOGLFree(a); return NULL; } if (brack) iobfexpecttoken(f, "}"); return TmNCreate(dim[0], dim[1], a); } #ifdef _gv_tmn_max_ # undef max # undef _gv_tmn_max_ #endif #ifdef _gv_tmn_min_ # undef min # undef _gv_tmn_min_ #endif #endif /* _GV_TRANSFORMN_H_ */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/geometry/transformn/Headers0000644000175000017500000000001512310110200017120 00000000000000transformn.h geomview-1.9.5/src/lib/geometry/transobj/0000755000175000017500000000000012310165601015356 500000000000000geomview-1.9.5/src/lib/geometry/transobj/Makefile.in0000644000175000017500000004576012310165553017365 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry/transobj DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libtransobj_la_LIBADD = am_libtransobj_la_OBJECTS = transobj.lo libtransobj_la_OBJECTS = $(am_libtransobj_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libtransobj_la_SOURCES) DIST_SOURCES = $(libtransobj_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libtransobj.la libtransobj_la_SOURCES = \ transobj.c \ transobj.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/transobj/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/transobj/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libtransobj.la: $(libtransobj_la_OBJECTS) $(libtransobj_la_DEPENDENCIES) $(EXTRA_libtransobj_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libtransobj_la_OBJECTS) $(libtransobj_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transobj.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/geometry/transobj/Makefile.am0000644000175000017500000000022512310110200017312 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libtransobj.la libtransobj_la_SOURCES = \ transobj.c \ transobj.h geomview-1.9.5/src/lib/geometry/transobj/transobj.c0000644000175000017500000001431012310110200017244 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform.h" #include "transobj.h" #include "handleP.h" #include "freelist.h" /* * Operations on TransObj objects. */ void TransPosition(TransObj *tobj, Transform T) /* Get transform into T */ { TmCopy(tobj->T, T); } void TransTransformTo(TransObj *tobj, Transform T) /* Set transform from T */ { TmCopy(T, tobj->T); } static DEF_FREELIST(TransObj); void TransDelete(TransObj *tobj) { if(tobj == NULL) { return; } if(tobj->magic != TRANSMAGIC) { OOGLWarn("Internal warning: TransDelete'ing non-TransObj %x (%x != %x)", tobj, tobj->magic, TRANSMAGIC); return; } if(tobj != NULL && RefDecr((Ref *)tobj) <= 0) { FREELIST_FREE(TransObj, tobj); } } TransObj * TransCreate(Transform T) { TransObj *tobj; FREELIST_NEW(TransObj, tobj); RefInit((Ref*)tobj, TRANSMAGIC); if (T != NULL) { TmCopy(T, tobj->T); } return tobj; } /* * Communications */ HandleOps TransOps = { "trans", (int ((*)()))TransObjStreamIn, (int ((*)()))TransObjStreamOut, (void ((*)()))TransDelete, NULL, }; void TransUpdate(Handle **hp, Ref *ignored, Transform Tfixme) { Handle *h = *hp; (void)ignored; if (h != NULL && h->object != NULL) { TmCopy(((TransObj *)(h->object))->T, Tfixme); } } int TransStreamIn(Pool *p, Handle **hp, Transform T) { TransObj *tobj = NULL; if (TransObjStreamIn(p, hp, &tobj)) { if (tobj) { TmCopy(tobj->T, T); TransDelete(tobj); } return true; } return false; } int TransObjStreamIn(Pool *p, Handle **hp, TransObj **tobjp) { Handle *h = NULL; Handle *hname = NULL; TransObj *tobj = NULL; char *w, *raww; int c; int more = 0; int brack = 0; IOBFILE *inf; if(p == NULL || (inf = PoolInputFile(p)) == NULL) { return 0; } do { more = 0; switch(c = iobfnextc(inf, 0)) { case '{': brack++; iobfgetc(inf); break; case '}': if(brack--) iobfgetc(inf); break; case 't': if(iobfexpectstr(inf, "transform")) { return 0; } more = 1; break; case 'd': if(iobfexpectstr(inf, "define")) { return 0; } w = iobftoken(inf, 0); hname = HandleCreateGlobal(w, &TransOps); break; case '<': case ':': case '@': iobfgetc(inf); w = iobfdelimtok("{}()", inf, 0); if (c == '<' && (h = HandleByName(w, &TransOps)) == NULL) { w = findfile(PoolName(p), raww = w); if(w == NULL) { OOGLSyntax(inf, "Reading transform from \"%s\": can't find file \"%s\"", PoolName(p), raww); } } else if (h) { HandleDelete(h); } h = HandleReferringTo(c, w, &TransOps, NULL); if (h) { /* Increment the ref. count. This way we can call * HandleDelete() and TransDelete() independently. */ tobj = REFGET(TransObj, HandleObject(h)); } break; default: /* * Anything else should be a 4x4 matrix */ if(tobj == NULL) { tobj = TransCreate(NULL); } if(iobfgettransform(inf, 1, &tobj->T[0][0], 0) <= 0) { return 0; } } } while(brack || more); if(hname != NULL) { if (tobj) { HandleSetObject(hname, (Ref *)tobj); } if (h) { /* HandleReferringTo() has passed the ownership to use, so * delete h because we do not need it anymore. */ HandleDelete(h); } h = hname; } /* Pass the ownership of h and tobj to the caller if requested */ if (hp != NULL) { /* pass on ownership of the handle h to the caller of this function */ if (*hp) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } else if (h) { /* Otherwise delete h because we are its owner. Note that * HandleReferringTo() has passed the ownership of h to us; * explicitly defined handles (hdefine and define constructs) * will not be deleted by this call. */ HandleDelete(h); } /* same logic as for hp */ if (tobjp != NULL) { if (*tobjp) { TransDelete(*tobjp); } *tobjp = tobj; } else if(tobj) { TransDelete(tobj); } return (h != NULL || tobj != NULL); } int TransObjStreamOut(Pool *p, Handle *h, TransObj *tobj) { return TransStreamOut(p, h, tobj->T); } int TransStreamOut(Pool *p, Handle *h, Transform T) { FILE *outf; if ((outf = PoolOutputFile(p)) == NULL) { return false; } fprintf(outf, "transform {\n"); PoolIncLevel(p, 1); if (PoolStreamOutHandle(p, h, true)) { fputtransform(outf, 1, &T[0][0], 0); } PoolIncLevel(p, -1); PoolFPrint(p, outf, "}\n"); return !ferror(outf); } TransObj *TransObjFSave(TransObj *t, FILE *outf, char *fname) { Pool *p; int ok; p = PoolStreamTemp(fname, NULL, outf, 1, NULL); PoolSetOType(p, PO_DATA); PoolIncLevel(p, 1); ok = TransObjStreamOut(p, NULL, t); PoolDelete(p); return ok ? t : NULL; } TransformPtr TransFSave(Transform T, FILE *outf, char *fname) { Pool *p; int ok; p = PoolStreamTemp(fname, NULL, outf, 1, NULL); PoolSetOType(p, PO_DATA); PoolIncLevel(p, 1); ok = TransStreamOut(p, NULL, T); PoolDelete(p); return ok ? T : NULL; } /* * Local Variables: *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/geometry/transobj/transobj.h0000644000175000017500000000356312310110200017261 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GV_TRANSOBJ_H_ #define _GV_TRANSOBJ_H_ #include "reference.h" #include "handle.h" #include "transform.h" #define TRANSMAGIC OOGLMagic('t', 1) typedef struct TransObj { REFERENCEFIELDS; Transform T; } TransObj; extern void TransPosition(TransObj *tobj, Transform Tinto); extern void TransTransformTo(TransObj *tobj, Transform Tfrom); extern void TransDelete(TransObj *tobj); extern int TransStreamIn(Pool *, Handle **, Transform T); extern int TransStreamOut(Pool *, Handle *, Transform T); extern TransformPtr TransFSave(Transform T, FILE *outf, char *fname); extern int TransObjStreamIn(Pool *p, Handle **hp, TransObj **tobjp); extern int TransObjStreamOut(Pool *, Handle *, TransObj *tobj); extern TransObj *TransObjFSave(TransObj *t, FILE *outf, char *fname); extern void TransUpdate(Handle **hp, Ref *ignored, Transform Tfixme); extern TransObj *TransCreate(Transform); #endif /*_TRANSOBJ_*/ geomview-1.9.5/src/lib/geometry/transobj/Headers0000644000175000017500000000001312310110200016547 00000000000000transobj.h geomview-1.9.5/src/lib/geometry/ntransobj/0000755000175000017500000000000012310165601015534 500000000000000geomview-1.9.5/src/lib/geometry/ntransobj/Makefile.in0000644000175000017500000004600512310165553017534 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry/ntransobj DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libntransobj_la_LIBADD = am_libntransobj_la_OBJECTS = ntransobj.lo libntransobj_la_OBJECTS = $(am_libntransobj_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libntransobj_la_SOURCES) DIST_SOURCES = $(libntransobj_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libntransobj.la libntransobj_la_SOURCES = \ ntransobj.c \ ntransobj.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/ntransobj/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/ntransobj/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libntransobj.la: $(libntransobj_la_OBJECTS) $(libntransobj_la_DEPENDENCIES) $(EXTRA_libntransobj_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libntransobj_la_OBJECTS) $(libntransobj_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntransobj.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/geometry/ntransobj/Makefile.am0000644000175000017500000000023112310110200017465 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libntransobj.la libntransobj_la_SOURCES = \ ntransobj.c \ ntransobj.h geomview-1.9.5/src/lib/geometry/ntransobj/ntransobj.c0000644000175000017500000001252412310110200017605 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "transformn.h" #include "ntransobj.h" #include "handleP.h" #include "freelist.h" DEF_FREELISTHEAD(TransformN); DEF_FREELISTHEAD(HPointN); /* * Operations on NTransObj objects. */ void NTransPosition(TransformN *ntobj, TransformN *T) /* Get transform into T */ { TmNCopy(ntobj, T); } void NTransTransformTo(TransformN *ntobj, TransformN *T) /* Set transform from T */ { TmNCopy(T, ntobj); } void NTransDelete(TransformN *ntobj) { if (ntobj == NULL) { return; } if (ntobj->magic != TMNMAGIC) { OOGLWarn("Internal warning: " "NTransDelete'ing non-TransformN %x (%x != %x)", ntobj, ntobj->magic, TMNMAGIC); return; } if (ntobj != NULL && RefDecr((Ref *)ntobj) <= 0) { TmNDelete(REFGET(TransformN, ntobj)); } } TransformN * NTransCreate(TransformN *T) { TransformN *ntobj; if (T) { ntobj = TmNCopy(T, NULL); } else { ntobj = TmNCreate(0, 0, NULL); } return ntobj; } /* * Communications */ HandleOps NTransOps = { "ntrans", (int ((*)()))NTransStreamIn, (int ((*)()))NTransStreamOut, (void ((*)()))NTransDelete, NULL, NULL }; int NTransStreamIn(Pool *p, Handle **hp, TransformN **ntobjp) { Handle *h = NULL; Handle *hname = NULL; TransformN *ntobj = NULL; TransformN *tmp = NULL; char *w, *raww; int c; int more = 0; int brack = 0; IOBFILE *inf; if (p == NULL || (inf = PoolInputFile(p)) == NULL) return 0; do { more = 0; switch(c = iobfnextc(inf, 0)) { case '{': brack++; iobfgetc(inf); break; case '}': if (brack--) iobfgetc(inf); break; case 'n': if (iobfexpectstr(inf, "ntransform")) return 0; more = 1; break; case 'd': if (iobfexpectstr(inf, "define")) { return 0; } hname = HandleCreateGlobal(iobftoken(inf, 0), &NTransOps); break; case '<': case ':': case '@': iobfgetc(inf); w = iobfdelimtok("{}()", inf, 0); if (c == '<' && (h = HandleByName(w, &NTransOps)) == NULL) { w = findfile(PoolName(p), raww = w); if (w == NULL) { OOGLSyntax(inf, "Reading ntransform from \"%s\": " "can't find file \"%s\"", PoolName(p), raww); } } h = HandleReferringTo(c, w, &NTransOps, NULL); if (h) { ntobj = (TransformN *)HandleObject(h); /* Increment the ref. count. This way we can call * HandleDelete() and NTransDelete() independently. */ RefIncr((Ref*)ntobj); } break; default: /* * Anything else should be the ntransform data. */ if (ntobj != NULL) { tmp = ntobj; } ntobj = TmNRead(inf, 0); if (ntobj == NULL) { OOGLSyntax(inf, "Reading ntransform from \"%s\": " "can't read ntransform data", PoolName(p)); } else if (tmp) { TmNCopy(ntobj, tmp); TmNDelete(ntobj); ntobj = tmp; } break; } } while (brack || more); if (hname != NULL) { if (ntobj != NULL) { HandleSetObject(hname, (Ref *)ntobj); } if (h) { /* HandleReferringTo() has passed the ownership to use, so * delete h because we do not need it anymore. */ HandleDelete(h); } h = hname; } /* Pass the ownership of h and ntobj to the caller if requested */ if (hp != NULL) { /* pass on ownership of the handle h to the caller of this function */ if (*hp) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } else if (h) { /* Otherwise delete h because we are its owner. Note that * HandleReferringTo() has passed the ownership of h to us; * explicitly defined handles (hdefine and define constructs) * will not be deleted by this call. */ HandleDelete(h); } /* same logic as for hp */ if (ntobjp != NULL) { if (*ntobjp) { NTransDelete(*ntobjp); } *ntobjp = ntobj; } else if(ntobj) { NTransDelete(ntobj); } return (h != NULL || ntobj != NULL); } int NTransStreamOut(Pool *p, Handle *h, TransformN *T) { int i, j; int idim = T->idim, odim = T->odim; FILE *outf; if ((outf = PoolOutputFile(p)) == NULL) { return 0; } fprintf(outf, "ntransform {\n"); PoolIncLevel(p, 1); if (PoolStreamOutHandle(p, h, T != NULL)) { PoolFPrint(p, outf, "%d %d\n", idim, odim); for(i = 0; i < idim; i++) { PoolFPrint(p, outf, ""); for(j = 0; j < odim; j++) { fprintf(outf, "%10.7f ", T->a[i*odim+j]); } fprintf(outf, "\n"); } } PoolIncLevel(p, -1); PoolFPrint(p, outf, "}\n"); return !ferror(outf); } /* * Local Variables: *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/geometry/ntransobj/ntransobj.h0000644000175000017500000000243312310110200017610 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _NTRANSOBJ_H_ #define _NTRANSOBJ_H_ #ifndef _HANDLE_ # include "handle.h" #endif /*_HANDLE_*/ extern void NTransPosition(TransformN *tobj, TransformN *Tinto); extern void NTransTransformTo(TransformN *tobj, TransformN *Tfrom); extern void NTransDelete(TransformN *ntobj); extern int NTransStreamIn(Pool *, Handle **, TransformN **); extern int NTransStreamOut(Pool *, Handle *, TransformN *); extern TransformN *NTransCreate(TransformN *); #endif /*_TRANSOBJ_*/ geomview-1.9.5/src/lib/geometry/ntransobj/Headers0000644000175000017500000000001412310110200016726 00000000000000ntransobj.h geomview-1.9.5/src/lib/camera/0000755000175000017500000000000012310165601013131 500000000000000geomview-1.9.5/src/lib/camera/Makefile.in0000644000175000017500000004617312310165553015137 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/camera DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libcamera_la_LIBADD = am_libcamera_la_OBJECTS = camcompat.lo camera.lo camstream.lo libcamera_la_OBJECTS = $(am_libcamera_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libcamera_la_SOURCES) DIST_SOURCES = $(libcamera_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcamera.la libcamera_la_SOURCES = \ camcompat.c camera.c camstream.c \ camera.h cameraP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/camera/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/camera/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libcamera.la: $(libcamera_la_OBJECTS) $(libcamera_la_DEPENDENCIES) $(EXTRA_libcamera_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libcamera_la_OBJECTS) $(libcamera_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/camcompat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/camera.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/camstream.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/camera/Makefile.am0000644000175000017500000000025712310110177015107 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcamera.la libcamera_la_SOURCES = \ camcompat.c camera.c camstream.c \ camera.h cameraP.h geomview-1.9.5/src/lib/camera/camcompat.c0000644000175000017500000001174612310110177015170 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include "ooglutil.h" #include "handle.h" #include "streampool.h" #include "cameraP.h" #include "transobj.h" extern HandleOps CamOps; Camera * CamFLoad(Camera *proto, IOBFILE *inf, char *fname) { Pool *p; Camera *cam = NULL; p = PoolStreamTemp(fname, inf, NULL, 0, &CamOps); if(p == NULL) return NULL; if(proto != NULL) OOGLError(1, "Note: CamFLoad(cam, ...) can't handle cam != NULL"); (void) CamStreamIn(p, NULL, &cam); PoolDelete(p); return cam; } void CamFSave(Camera *cam, FILE *outf, char *fname) { Pool *p = PoolStreamTemp(fname, NULL, outf, 1, &CamOps); if(p == NULL) return; (void) CamStreamOut(p, NULL, cam); PoolDelete(p); } Camera * CamLoad(Camera *cam, char *name) { IOBFILE *f; if((f = iobfopen(name,"r")) == NULL) { perror(name); return NULL; } cam = CamFLoad(cam, f, name); iobfclose(f); return cam; } void CamSave(Camera *cam, char *name) { FILE *f; if((f = fopen(name, "w")) == NULL) { perror(name); return; } CamFSave(cam, f, name); fclose(f); } /* I'm not sure what to do with the following procedure. On one hand I think it should come out and be replaced by get-only attributes?? On the other hand, it's nice to be able to get both eyes in one call. I need to understand more about how stereo works. Until then, I'm commenting this procedure out. -- mbp Fri Aug 9 00:32:36 1991 */ #ifdef notdef int CamCurrentStereo( Camera *cam, Transform leye, Transform reye ) { if(leye != TMNULL) TmCopy(cam->stereyes[0], leye); if(reye != TMNULL) TmCopy(cam->stereyes[1], reye); return cam->whicheye; } #endif /************************************************************************ * The following procedures are on death row; they will be taken out * * soon because they have been superceded by CamGet and CamSet * ************************************************************************/ void CamCurrentPosition( Camera *cam, Transform T ) { TmCopy( cam->camtoworld, T ); } /* * Return world -> camera coordinate transform in T. * Note this is the inverse of the transform given by CamCurrentPosition(). */ void CamViewWorld( Camera *cam, Transform T ) { if (cam->flag & CAMF_NEWC2W ) { TmInvert( cam->camtoworld, cam->worldtocam ); cam->flag &= ~CAMF_NEWC2W; } /* else we have the actual worldtocam transform already computed */ TmCopy( cam->worldtocam, T ); } void CamFocus( Camera *cam, float focus ) { cam->focus = focus; } float CamCurrentFocus( Camera *cam ) { return cam->focus; } float CamCurrentAspect( Camera *cam ) { return cam->frameaspect; } /* * Set aspect ratio; preserve minimum field-of-view. */ void CamFrameAspect( Camera *cam, float aspect ) { cam->frameaspect = aspect; } void CamTransformTo( Camera *cam, Transform T ) { TmCopy( T, cam->camtoworld ); cam->flag |= CAMF_NEWC2W; } /* * Select which eye to view through in stereo mode. */ /* incorporate into CamSet & remove: */ void CamStereoEye( Camera *cam, int whicheye ) { if(whicheye > 1) whicheye = 1; cam->whicheye = whicheye; } void CamClipping( Camera *cam, float cnear, float cfar ) { cam->cnear = cnear; cam->cfar = cfar; } void CamCurrentClipping( Camera *cam, float *cnear, float *cfar ) { *cnear = cam->cnear; *cfar = cam->cfar; } void CamHalfYField( Camera *cam, float halfyfov ) { cam->halfyfield = halfyfov; } float CamCurrentHalfYField( Camera *cam ) { return cam->halfyfield; } float CamCurrentHalfField( Camera *cam ) { return cam->frameaspect > 1 ? cam->halfyfield : cam->halfyfield * cam->frameaspect; } void CamPerspective( Camera *cam, int persp ) { if (persp) cam->flag |= CAMF_PERSP; else cam->flag &= ~CAMF_PERSP; } int CamIsPerspective( Camera *cam ) { return ((cam->flag & CAMF_PERSP) != 0); } geomview-1.9.5/src/lib/camera/camera.c0000644000175000017500000004263012310110177014450 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "geomclass.h" #include "cameraP.h" #include "mg.h" #include "reference.h" Camera * _CamSet(Camera *cam, int attr, va_list *a_list); #define SETFLAG(flag, bit, value) \ if (value) flag |= bit; \ else flag &= ~bit #define GETFLAG(flag, bit) ( (flag & bit) != 0 ) static float GetHalfField( Camera *cam ); static void SetHalfField( Camera *cam, float halffield ); static void CamStereoCompute( Camera *cam ); Camera * CamCreate(int a1, ...) { Camera *thiscam; va_list a_list; thiscam = OOGLNewE(Camera, "CamCreate: unable to allocate camera\n"); memset(thiscam, 0, sizeof(Camera)); if (thiscam == NULL) return(NULL); RefInit((Ref *)thiscam, CAMMAGIC); CamDefault(thiscam); thiscam->changed = 0; va_start( a_list, a1 ); _CamSet(thiscam, a1, &a_list); va_end(a_list); return thiscam; } void CamDefault(Camera *cam) { cam->flag = CAMF_PERSP; cam->frameaspect = 4.0/3.0; cam->focus = 3.0; cam->stereo_sep = 0.5; cam->stereo_angle = .08; cam->c2whandle = NULL; cam->w2chandle = NULL; cam->sterhandle[0] = NULL; cam->sterhandle[1] = NULL; CamStereoCompute(cam); cam->whicheye = 0; /* only applies to stereo */ cam->space = TM_EUCLIDEAN; cam->bgcolor.r = cam->bgcolor.g = cam->bgcolor.b = 1.0/3.0; cam->bgcolor.a = 1.0; cam->bgimage = NULL; cam->bgimghandle = NULL; CamReset( cam ); } Camera * CamSet(Camera *cam, int a1, ...) { va_list a_list; va_start(a_list, a1); return ( _CamSet(cam, a1, &a_list) ); } Camera * _CamSet(Camera *cam, int attr, va_list *alist) { TransformPtr tt; int sethalffield = 0, setaspect = 0, setstereogeom = 0; double halffield = 0, v; Handle *h; int bit, unbit; char **ablock = NULL; #define NEXT(type) OOGL_VA_ARG(type,alist,ablock) while (attr != CAM_END) { bit = unbit = 0; switch(attr) { case CAM_ABLOCK: ablock = NEXT(char**); break; case CAM_C2W: tt = NEXT(TransformPtr); bit = CAMF_NEWC2W, unbit = CAMF_W2C; TmCopy(tt, cam->camtoworld); TmInvert(cam->camtoworld, cam->worldtocam); break; case CAM_W2C: tt = NEXT(TransformPtr); bit = CAMF_W2C, unbit = CAMF_NEWC2W; TmCopy(tt, cam->worldtocam); TmInvert(cam->worldtocam, cam->camtoworld); break; case CAM_FOV: v = NEXT(double) / 2; bit = CAMF_FOV; if(cam->flag & CAMF_PERSP) { if(v >= 180/2) v = 120/2; v = tan( RADIANS(v) ); } halffield = v; sethalffield = 1; break; case CAM_HALFYFIELD: cam->halfyfield = NEXT(double); if(cam->flag & CAMF_PERSP) cam->halfyfield *= cam->focus; bit = CAMF_FOV; break; case CAM_HALFFIELD: halffield = NEXT(double); sethalffield = 1; bit = CAMF_FOV; break; case CAM_ASPECT: if((v = NEXT(double)) > 0.) { if (!sethalffield) halffield = GetHalfField(cam); cam->frameaspect = v; bit = CAMF_ASPECT; setaspect = 1; } break; case CAM_FOCUS: if((v = NEXT(double)) > 0) { if(cam->flag & CAMF_PERSP) cam->halfyfield *= v / cam->focus; cam->focus = v; bit = CAMF_FOCUS; } break; case CAM_NEAR: cam->cnear = NEXT(double); bit = CAMF_NEAR; break; case CAM_FAR: cam->cfar = NEXT(double); bit = CAMF_FAR; break; case CAM_STEREOSEP: cam->stereo_sep = NEXT(double); bit = CAMF_STEREOGEOM, unbit = CAMF_STEREOXFORM; setstereogeom = 1; break; case CAM_STEREOANGLE: cam->stereo_angle = NEXT(double); bit = CAMF_STEREOGEOM, unbit = CAMF_STEREOXFORM; setstereogeom = 1; break; case CAM_STEREOEYE: cam->whicheye = NEXT(int); bit = CAMF_EYE; break; case CAM_PERSPECTIVE: bit = CAMF_PERSP; goto flagbit; case CAM_STEREO: bit = CAMF_STEREO; goto flagbit; flagbit: SETFLAG(cam->flag, bit, NEXT(int)); break; case CAM_STEREYES: memcpy(cam->stereyes, NEXT(TransformPtr), 2*sizeof(Transform)); bit = CAMF_STEREOXFORM, unbit = CAMF_STEREOGEOM; break; case CAM_STERHANDLES: memcpy(cam->sterhandle, NEXT(Handle **), 2*sizeof(Handle *)); bit = CAMF_STEREOXFORM, unbit = CAMF_STEREOGEOM; break; case CAM_C2WHANDLE: h = NEXT(Handle *); if (cam->c2whandle) { HandlePDelete(&cam->c2whandle); } cam->c2whandle = REFGET(Handle, h); if (h) { HandleRegister(&cam->c2whandle, (Ref *)cam, cam->camtoworld, CamTransUpdate); } bit = CAMF_NEWC2W, unbit = CAMF_W2C; break; case CAM_W2CHANDLE: h = NEXT(Handle *); if (cam->w2chandle) { HandlePDelete(&cam->w2chandle); } cam->w2chandle = REFGET(Handle, h); if (h) { HandleRegister(&cam->w2chandle, (Ref *)cam, cam->worldtocam, CamTransUpdate); } bit = CAMF_W2C, unbit = CAMF_NEWC2W; break; case CAM_SPACE: { int space = NEXT(int); if ( space != TM_EUCLIDEAN && space != TM_HYPERBOLIC && space != TM_SPHERICAL) { OOGLError(0,"illegal space value %1d\n", space); } else { cam->space = space; bit = CAMF_SPACE; } } break; case CAM_BGCOLOR: cam->bgcolor = *NEXT(ColorA *); break; case CAM_BGIMAGE: if (cam->bgimghandle) { HandlePDelete(&cam->bgimghandle); } if (cam->bgimage) { ImgDelete(cam->bgimage); } cam->bgimage = REFGET(Image, NEXT(Image *)); break; case CAM_BGIMGHANDLE: if (cam->bgimghandle) { HandlePDelete(&cam->bgimghandle); } cam->bgimghandle = REFGET(Handle, NEXT(Handle *)); if (cam->bgimghandle) { HandleRegister(&cam->bgimghandle, (Ref *)cam, &cam->bgimage, HandleUpdRef); } break; default: OOGLError (0, "CamSet: Undefined attribute: %d", attr); return NULL; } cam->changed &= ~unbit; cam->changed |= bit; attr = NEXT(int); } /* (sethalffield) means we have a new halffield value, stored in local var "halffield". (setaspect) means we have a new aspect ratio, and the halffield must be updated in accordance with this. In this case, "halffield" holds either the original halffield value, if a new one hasn't been explicitly set with CAM_HALFFIELD or CAM_FOV, or the new value, if it was explicitly set. All of these cases are dealt with by the following call to SetHalfField. */ if (setaspect || sethalffield) SetHalfField(cam, halffield); /* following works since the only way to change stereo parameters is by using this routine */ if (setstereogeom) CamStereoCompute(cam); return cam; #undef NEXT } /*----------------------------------------------------------------------- * Function: CamGet * Description: query a camera * Args: *cam: the camera to query * attr: the attribute to query * value: attr's value is written here * Returns: 1: attr is valid and value has been written * 0: attr is valid but currently does not * have a value * -1: invalid attr * Author: mbp * Date: Thu Aug 8 10:09:10 1991 * Notes: At present, there are no camera attr's that might * not be set, so 0 is never returned. This might change * in the future. */ int CamGet(Camera *cam, int attr, void *value) { #define VALUE(type) ((type*)value) switch (attr) { case CAM_PERSPECTIVE: *VALUE(int) = GETFLAG(cam->flag, CAMF_PERSP); break; case CAM_STEREO: *VALUE(int) = GETFLAG(cam->flag, CAMF_STEREO); break; case CAM_C2W: /* camtoworld is always up to date, so just copy */ TmCopy(cam->camtoworld, (TransformPtr)value); break; case CAM_W2C: /* worldtocam is not always up to date, so update if necessary ... */ if (cam->flag & CAMF_NEWC2W ) { TmInvert( cam->camtoworld, cam->worldtocam ); cam->flag &= ~CAMF_NEWC2W; } /* ... then copy */ TmCopy( cam->worldtocam, (TransformPtr)value ); break; case CAM_FOV: *VALUE(float) = 2 * ( (cam->flag & CAMF_PERSP) ? DEGREES( atan( (double)(GetHalfField(cam)) ) ) : GetHalfField(cam)); break; case CAM_HALFYFIELD: *VALUE(float) = (cam->flag & CAMF_PERSP) ? cam->halfyfield / cam->focus : cam->halfyfield; break; case CAM_HALFFIELD: *VALUE(float) = GetHalfField(cam); break; case CAM_ASPECT: *VALUE(float) = cam->frameaspect; break; case CAM_FOCUS: *VALUE(float) = cam->focus; break; case CAM_NEAR: *VALUE(float) = cam->cnear; break; case CAM_FAR: *VALUE(float) = cam->cfar; break; case CAM_STEREOSEP: *VALUE(float) = cam->stereo_sep; break; case CAM_STEREOANGLE: *VALUE(float) = cam->stereo_angle; break; case CAM_STEREOEYE: *VALUE(int) = cam->whicheye; break; case CAM_C2WHANDLE: *VALUE(Handle *) = cam->c2whandle; break; case CAM_W2CHANDLE: *VALUE(Handle *) = cam->w2chandle; break; case CAM_STEREYES: memcpy(value, cam->stereyes, 2*sizeof(Transform)); break; case CAM_STERHANDLES: memcpy(value, cam->sterhandle, 2*sizeof(Handle *)); break; case CAM_SPACE: *VALUE(int) = cam->space; break; case CAM_BGCOLOR: *VALUE(ColorA) = cam->bgcolor; break; case CAM_BGIMAGE: *VALUE(Image *) = cam->bgimage; break; case CAM_BGIMGHANDLE: *VALUE(Handle *) = cam->bgimghandle; break; default: return -1; break; } return 1; #undef VALUE } void CamDelete( Camera *cam ) { if(cam == NULL) return; if(cam->magic != CAMMAGIC) { OOGLWarn("Internal warning: trying to CamDelete non-Camera %x (%x != %x)", cam, cam->magic, CAMMAGIC); return; } if(RefDecr((Ref *)cam) <= 0) { cam->magic ^= 0x80000000; /* Invalidate */ if(cam->c2whandle) HandlePDelete( &cam->c2whandle ); if(cam->w2chandle) HandlePDelete( &cam->w2chandle ); if(cam->sterhandle[0]) HandlePDelete( &cam->sterhandle[0] ); if(cam->sterhandle[1]) HandlePDelete( &cam->sterhandle[1] ); if (cam->bgimghandle) HandlePDelete(&cam->bgimghandle); if (cam->bgimage) ImgDelete(cam->bgimage); OOGLFree(cam); } } Camera * CamCopy( Camera *src, Camera *dst ) { if (src == NULL) { return NULL; } if (dst == NULL) { dst = OOGLNewE(Camera, "CamCopy Camera"); } #if 0 else HandleDelete(dst->handle); #endif *dst = *src; dst->ref_count = 1; /*dst->handle = NULL;*/ return dst; } void CamReset( Camera *cam ) { Transform T; int persp; CamGet(cam, CAM_PERSPECTIVE, &persp); switch (cam->space) { case TM_EUCLIDEAN: CamSet( cam, CAM_NEAR, .07, CAM_FAR, 100.0, CAM_FOCUS, 3.0, CAM_FOV, persp ? 40.0 : 2.2, CAM_END); break; case TM_HYPERBOLIC: CamSet( cam, CAM_NEAR, .07, CAM_FAR, 100.0, CAM_FOCUS, 2.5, CAM_FOV, persp ? 40.0 : 2.2, CAM_END); break; case TM_SPHERICAL: CamSet( cam, CAM_NEAR, .05, CAM_FAR, -.05, CAM_FOCUS, 0.5, CAM_FOV, persp ? 90.0 : 2.2, CAM_END); break; } TmSpaceTranslate( T, 0.0, 0.0, cam->focus, cam->space ); CamSet(cam, CAM_C2W, T, CAM_END); } /* * Return camera's projection transform in proj. * See CamView below for the range of the projection. */ void CamViewProjection( Camera *cam, Transform proj ) { float y; float x; y = cam->halfyfield; if(cam->flag & CAMF_PERSP) y *= cam->cnear / cam->focus; x = cam->frameaspect * y; if(cam->flag & CAMF_PERSP) { TmPerspective( proj, -x, x, -y, y, cam->cnear, cam->cfar ); } else { TmOrthographic( proj, -x, x, -y, y, cam->cnear, cam->cfar ); } if (cam->flag & CAMF_STEREO) TmConcat( cam->stereyes[cam->whicheye], proj, proj ); } /* * Computes complete transformation from world -> projected coordinates * and leaves it in T. * Projected coordinates map the visible world into -1 <= {X,Y,Z} <= 1, * with Z = -1 at the near plane and Z = +1 at the far plane. */ void CamView( Camera *cam, Transform T ) { Transform t; CamViewProjection( cam, t ); if(cam->flag & CAMF_NEWC2W) { TmInvert( cam->camtoworld, cam->worldtocam ); cam->flag &= ~CAMF_NEWC2W; } TmConcat( cam->worldtocam, t, T ); } void CamRotateX( Camera *cam, float angle ) { CtmRotateX( cam->camtoworld, angle ); cam->flag |= CAMF_NEWC2W; } void CamRotateY( Camera *cam, float angle ) { CtmRotateY( cam->camtoworld, angle ); cam->flag |= CAMF_NEWC2W; } void CamRotateZ( Camera *cam, float angle ) { CtmRotateZ( cam->camtoworld, angle ); cam->flag |= CAMF_NEWC2W; } /* translate the camera, using the camera's notion of what space it is in */ void CamTranslate( Camera *cam, float tx, float ty, float tz ) { Transform T; TmSpaceTranslate( T, tx, ty, tz, cam->space ); TmConcat(T, cam->camtoworld, cam->camtoworld); cam->flag |= CAMF_NEWC2W; } /* CamScale is a noop if the camera is not in Euclidean space */ void CamScale( Camera *cam, float sx, float sy, float sz ) { if (cam->space == TM_EUCLIDEAN) { CtmScale( cam->camtoworld, sx, sy, sz ); cam->flag |= CAMF_NEWC2W; } } void CamAlignZ( Camera *cam, float x, float y, float z ) { Point3 axis; axis.x = x; axis.y = y; axis.z = z; CtmAlignZ( cam->camtoworld, &axis ); cam->flag |= CAMF_NEWC2W; } /* * Apply T to camera as seen by world (== T^-1 to world, as seen by camera) */ void CamTransform( Camera *cam, Transform T ) { TmConcat(T, cam->camtoworld, cam->camtoworld); cam->flag |= CAMF_NEWC2W; } static void CamStereoCompute( Camera *cam ) { float tanconv = tan(cam->stereo_angle); TmTranslate( cam->stereyes[CAM_RIGHT], cam->stereo_sep, 0., 0. ); TmTranslate( cam->stereyes[CAM_LEFT], -cam->stereo_sep, 0., 0. ); cam->stereyes[CAM_RIGHT][TMZ][TMX] = -tanconv; cam->stereyes[CAM_LEFT][TMZ][TMX] = tanconv; } /*----------------------------------------------------------------------- * Function: SetHalfField * Description: set camera's "halffield" value * Args: *cam: the camera * halffield: the halffied value to set to * Returns: nothing * Author: mbp * Date: Wed Aug 21 14:26:43 1991 * Notes: This procedure modifies the halfyfield member of cam * in such a way as to guarantee that the min half-width * of the view window is halffield. This depends on the * camera's current aspect ratio. */ static void SetHalfField( Camera *cam, float halffield ) { cam->halfyfield = (cam->frameaspect < 1 && cam->frameaspect > 0) ? halffield / cam->frameaspect : halffield; if(cam->flag & CAMF_PERSP) cam->halfyfield *= cam->focus; } /*----------------------------------------------------------------------- * Function: GetHalfField * Description: return camera's "halffield" value * Args: *cam: the camera * Returns: the halffield value * Author: mbp * Date: Wed Aug 21 14:29:31 1991 * Notes: the "halffield" is the min half-width of the view * window. If the aspect ratio is >= 1, this is * the vertical half-width (halfyfield). If the aspect * ratio is < 1, this is the horizontal half-width. */ static float GetHalfField( Camera *cam ) { float v = cam->halfyfield; if(cam->frameaspect < 1) v *= cam->frameaspect; if(cam->flag & CAMF_PERSP) v /= cam->focus; return v; } /* * Merge one Camera's changed values into another Camera */ Camera * CamMerge(Camera *src, Camera *dst) { int chg; float fov; if(src == NULL) return dst; if(dst == NULL) return NULL; chg = src->changed; if(chg & CAMF_NEWC2W) CamSet(dst, CAM_C2WHANDLE, src->c2whandle, CAM_C2W, src->camtoworld, CAM_END); if(chg & CAMF_STEREOGEOM) CamSet(dst, CAM_STEREOSEP, src->stereo_sep, CAM_STEREOANGLE, src->stereo_angle, CAM_END); if(chg & CAMF_STEREOXFORM) CamSet(dst, CAM_STEREYES, src->stereyes, CAM_STERHANDLES, src->sterhandle, CAM_END); if(chg & CAMF_W2C) CamSet(dst, CAM_W2CHANDLE, src->w2chandle, CAM_W2C, src->worldtocam, CAM_END); CamGet(src, CAM_FOV, &fov); if(chg & CAMF_FOCUS) CamSet(dst, CAM_FOCUS, src->focus, CAM_END); if(chg & CAMF_PERSP) CamSet(dst,CAM_PERSPECTIVE,src->flag&CAMF_PERSP,CAM_END); if(chg & CAMF_FOV) CamSet(dst, CAM_FOV, fov, CAM_END); if(chg & CAMF_ASPECT) CamSet(dst, CAM_ASPECT, src->frameaspect, CAM_END); if(chg & CAMF_NEAR) dst->cnear = src->cnear; if(chg & CAMF_FAR) dst->cfar = src->cfar; if(chg & CAMF_EYE) dst->whicheye = src->whicheye; if(chg & CAMF_STEREO) CamSet(dst,CAM_STEREO,src->flag&CAMF_STEREO,CAM_END); if(chg & CAMF_SPACE) dst->space = src->space; return dst; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/camera/camstream.c0000644000175000017500000002517612310110177015202 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "handleP.h" #include "cameraP.h" #include "transobj.h" HandleOps CamOps = { "cam", (int ((*)()))CamStreamIn, (int ((*)()))CamStreamOut, (void ((*)()))CamDelete, NULL, /* Resync */ NULL /* close pool */ }; /* * Load Camera from file. * Syntax: * [camera] < "filename_containing_camera" [or] * [camera] { keyword value keyword value ... } * */ int CamStreamIn(Pool *p, Handle **hp, Camera **camp) { char *w, *raww; IOBFILE *f; Handle *h = NULL; Handle *hname = NULL; Camera *cam = NULL; int credible = 0; int i; int got; float v; int brack = 0; int empty = 1, braces = 0; static struct kw { char *name; char args; int kbit; } kw[] = { { "camtoworld", 0, CAMF_NEWC2W }, { "worldtocam", 0, CAMF_W2C }, { "flag", 1, CAMF_PERSP|CAMF_STEREO }, { "halfyfield", 1, CAMF_FOV }, { "frameaspect",1, CAMF_ASPECT }, { "focus", 1, CAMF_FOCUS }, /* 5 */ { "near", 1, CAMF_NEAR }, { "far", 1, CAMF_FAR }, { "stereo_sep", 1, CAMF_STEREOGEOM }, { "stereo_angle",1, CAMF_STEREOGEOM }, { "stereyes", 0, CAMF_STEREOXFORM }, /* 10 */ { "whicheye", 1, CAMF_EYE }, { "define", 0, 0 }, { "camera", 0, 0 }, { "perspective",1, CAMF_PERSP }, { "stereo", 1, CAMF_STEREO }, /* 15 */ { "hyperbolic", 1, 0 /* CAMF_HYPERBOLIC is now obsolete */ }, { "fov", 1, CAMF_FOV }, { "bgcolor", 0, 0 }, { "bgimage", 0, 0 }, }; if ((f = PoolInputFile(p)) == NULL) return 0; for(;;) { switch(i = iobfnextc(f, 0)) { case '<': case ':': case '@': iobfgetc(f); w = iobfdelimtok("(){}", f, 0); if (i == '<' && (h = HandleByName(w, &CamOps)) == NULL && w[0] != '\0') { w = findfile(PoolName(p), raww = w); if (w == NULL) { OOGLSyntax(f, "Reading camera from \"%s\": can't find file \"%s\"", PoolName(p), raww); } } else if (h) { /* HandleByName() increases the ref. count s.t. the * caller of HandleByName() owns the returned handle. */ HandleDelete(h); } if ((h = HandleReferringTo(i, w, &CamOps, hp)) != NULL) { cam = (Camera *)h->object; /* Increment the ref. count. This way we can call * HandleDelete() and CamDelete() independently. */ RefIncr((Ref*)cam); } if (!brack) goto done; break; case '{': brack++; iobfgetc(f); break; case '}': if (brack > 0) { iobfgetc(f); braces = 1; } if (--brack <= 0) goto done; /* Otherwise, fall through into... */ default: empty = 0; w = iobfdelimtok("(){}", f, 0); if (w == NULL) goto done; for(i = sizeof(kw)/sizeof(kw[0]); --i >= 0; ) if (!strcmp(w, kw[i].name)) break; if (i < 0) { if (credible) OOGLSyntax(f, "Reading camera from \"%s\": unknown camera keyword \"%s\"", PoolName(p), w); if (cam) CamDelete(cam); return 0; } else if ( (got= iobfgetnf(f, kw[i].args, &v, 0)) != kw[i].args ) { OOGLSyntax(f, "Reading camera from \"%s\": \"%s\" expects %d values, got %d", PoolName(p), w, kw[i].args, got); CamDelete(cam); return false; } if (i != 13 && cam == NULL) { cam = CamCreate(CAM_END); credible = 1; } if (cam) { cam->changed |= kw[i].kbit; } switch (i) { case 0: { TransObj *tobj = NULL; Handle *thandle = NULL; if (TransObjStreamIn(p, &thandle, &tobj)) { CamSet(cam, CAM_C2W, tobj->T, CAM_C2WHANDLE, thandle, CAM_END); HandleDelete(thandle); TransDelete(tobj); } break; } case 1: { TransObj *tobj = NULL; Handle *thandle = NULL; if (TransObjStreamIn(p, &thandle, &tobj)) { CamSet(cam, CAM_W2C, tobj, CAM_W2CHANDLE, thandle, CAM_END); HandleDelete(thandle); TransDelete(tobj); } break; } case 2: cam->flag = (int)v; break; case 3: CamSet(cam, CAM_HALFYFIELD, v, CAM_END); break; case 4: CamSet(cam, CAM_ASPECT, v, CAM_END); break; case 5: CamSet(cam, CAM_FOCUS, v, CAM_END); break; case 6: cam->cnear = v; break; case 7: cam->cfar = v; break; case 8: CamSet(cam, CAM_STEREOSEP, v, CAM_END); break; case 9: CamSet(cam, CAM_STEREOANGLE, v, CAM_END); break; case 10: { TransObj *tobj[2] = { NULL, NULL }; Handle *thandle[2] = { NULL, NULL }; int i; if (TransObjStreamIn(p, &thandle[0], &tobj[0]) && TransObjStreamIn(p, &thandle[1], &tobj[1])) { TmCopy(tobj[0]->T, cam->stereyes[0]); TmCopy(tobj[1]->T, cam->stereyes[1]); CamSet(cam, CAM_STEREYES, cam->stereyes, CAM_STERHANDLES, thandle, CAM_END); } for (i = 0; i < 2; i++) { HandleDelete(thandle[i]); TransDelete(tobj[i]); } } break; case 11: cam->whicheye = (int)v; break; case 12: /* "define" */ hname = HandleCreateGlobal(iobfdelimtok("(){}", f, 0), &CamOps); break; case 13: /* "camera" */ break; case 14: /* "perspective" */ case 15: /* "stereo" */ cam->flag &= ~kw[i].kbit; if (v != 0) cam->flag |= kw[i].kbit; break; case 16: /* "hyperbolic" */ /* The "hyperbolic" field is obsolete (replaced by the "space" field. Ignore it for now [ Mon Dec 7 14:05:50 1992 ]. After a few months [ say in March 1993 ] add a warning message to be printed out at this point in the code, and after a few more months [ say June 1993 ], remove it completely. -- mbp */ break; case 17: /* "fov" */ CamSet(cam, CAM_FOV, v, CAM_END); break; case 18: /* bgcolor */ /* we always expect RGB values in the range 0..1 as floating * point values. */ if ((got = iobfgetnf(f, 3, (float *)&cam->bgcolor, 0)) != 3) { OOGLSyntax(f, "Reading camera from \"%s\": \"%s\" expects " "an RGB(A) color specification " "(got only %d values, not 3 or 4)", PoolName(p), "bgcolor", got); CamDelete(cam); return false; } if (got == 3 && iobfgetnf(f, 1, (float *)&cam->bgcolor+3, 0) != 1) { cam->bgcolor.a = 1.0; } break; case 19: /* bgimage */ if (!ImgStreamIn(p, &cam->bgimghandle, &cam->bgimage)) { OOGLSyntax(f, "Reading camera from \"%s\": " "unable to read background image", PoolName(p)); CamDelete(cam); return false; } break; } } } done: if (hname) { if (cam) { HandleSetObject(hname, (Ref *)cam); } if (h) { /* HandleReferringTo() has passed the ownership to use, so * delete h because we do not need it anymore. */ HandleDelete(h); } h = hname; } /* Pass the ownership of h and cam to the caller if requested */ if (hp != NULL) { /* pass on ownership of the handle h to the caller of this function */ if (*hp != NULL) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } else if (h) { /* Otherwise delete h because we are its owner. Note that * HandleReferringTo() has passed the ownership of h to us; * explicitly defined handles (hdefine and define constructs) * will not be deleted by this call. */ HandleDelete(h); } /* same logic as for hp */ if (camp != NULL) { if (*camp) { CamDelete(*camp); } *camp = cam; } else if(cam) { CamDelete(cam); } return (cam != NULL || h != NULL || (empty && braces)); } int CamStreamOut(Pool *p, Handle *h, Camera *cam) { float fov; FILE *outf; if ((outf = PoolOutputFile(p)) == NULL) { return 0; } fprintf(outf, "camera {\n"); PoolIncLevel(p, 1); if (cam == NULL && h != NULL && h->object != NULL) { cam = (Camera *)h->object; } if (PoolStreamOutHandle(p, h, cam != NULL)) { if (cam->w2chandle) { PoolFPrint(p, outf, "worldtocam "); TransStreamOut(p, cam->w2chandle, cam->worldtocam); } else { PoolFPrint(p, outf, "camtoworld "); TransStreamOut(p, cam->c2whandle, cam->camtoworld); } PoolFPrint(p, outf, "perspective %d stereo %d\n", cam->flag & CAMF_PERSP ? 1 : 0, cam->flag & CAMF_STEREO ? 1 : 0); CamGet(cam, CAM_FOV, &fov); PoolFPrint(p, outf, "fov %g\n", fov); PoolFPrint(p, outf, "frameaspect %g\n", cam->frameaspect); PoolFPrint(p, outf, "focus %g\n", cam->focus); PoolFPrint(p, outf, "near %g\n", cam->cnear); PoolFPrint(p, outf, "far %g\n", cam->cfar); if (cam->flag & CAMF_STEREOGEOM) { PoolFPrint(p, outf, "stereo_sep %g\n", cam->stereo_sep); PoolFPrint(p, outf, "stereo_angle %g\n", cam->stereo_angle); } if (cam->flag & CAMF_EYE) PoolFPrint(p, outf, "whicheye %d\n", cam->whicheye); if (cam->flag & CAMF_STEREOXFORM) { PoolFPrint(p, outf, "stereyes\n"); TransStreamOut(p, cam->sterhandle[0], cam->stereyes[0]); fputc('\n', outf); TransStreamOut(p, cam->sterhandle[1], cam->stereyes[1]); } PoolFPrint(p, outf, "bgcolor %g %g %g %g\n", cam->bgcolor.r, cam->bgcolor.g, cam->bgcolor.b, cam->bgcolor.a); if (cam->bgimage) { PoolFPrint(p, outf, "bg"); ImgStreamOut(p, cam->bgimghandle, cam->bgimage); } } PoolIncLevel(p, -1); PoolFPrint(p, outf, "}\n"); return !ferror(outf); } void CamHandleScan( Camera *cam, int (*func)(), void *arg ) { if (cam) { if (cam->c2whandle) (*func)(&cam->c2whandle, cam, arg); if (cam->w2chandle) (*func)(&cam->w2chandle, cam, arg); } } void CamTransUpdate(Handle **hp, Camera *cam, Transform T) { TransUpdate(hp, (Ref *)cam, T); if (hp == &cam->c2whandle) { TmInvert(cam->camtoworld, cam->worldtocam); } else if (hp == &cam->w2chandle) { TmInvert(cam->worldtocam, cam->camtoworld); } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/camera/camera.h0000644000175000017500000001505612310110177014457 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef CAMERA_H #define CAMERA_H #include "3d.h" #include "handle.h" #include "color.h" #include typedef struct Camera Camera; /* Public Camera methods (more below): */ Camera *CamCreate( int attr1, ... ); Camera *CamSet( Camera *, int attr1, ... ); Camera * _CamSet(Camera *cam, int attr, va_list *a_list); int CamGet( Camera *, int attr, void *value); void CamDelete( Camera * ); Camera *CamCopy( Camera *src, Camera *dst ); Camera *CamMerge( Camera *src, Camera *dst ); /* Camera attributes: */ /* Set/Create type Get type */ #define CAM_END 800 /* --------------- -------- */ #define CAM_PERSPECTIVE 801 /* int int * */ #define CAM_C2W 802 /* Transform Transform */ #define CAM_W2C 803 /* Transform Transform */ #define CAM_FOV 804 /* float float * */ #define CAM_HALFYFIELD 805 /* float float * */ #define CAM_HALFFIELD 806 /* float float * */ #define CAM_ASPECT 807 /* float float * */ #define CAM_FOCUS 808 /* float float * */ #define CAM_NEAR 809 /* float float * */ #define CAM_FAR 810 /* float float * */ #define CAM_STEREO 811 /* int int * */ #define CAM_STEREOSEP 812 /* float float * */ #define CAM_STEREOANGLE 813 /* float float * */ #define CAM_STEREOEYE 814 /* int int * */ #define CAM_C2WHANDLE 815 /* Handle * Handle ** */ #define CAM_W2CHANDLE 816 /* Handle * Handle ** */ #define CAM_STEREYES 817 /* Transform [2] Transform [2] */ #define CAM_STERHANDLES 818 /* Handle *[2] Handle *[2] */ #define CAM_SPACE 819 /* int int * */ #define CAM_BGCOLOR 820 /* ColorA * ColorA * */ #define CAM_BGIMAGE 821 /* Image * Image ** */ #define CAM_BGIMGHANDLE 822 /* Handle * Handle ** */ #define CAM_ABLOCK 899 /* void **ablock */ /* CAM_END: end of attribute list CAM_PERSPECTIVE: perspective (1) or ortho (0) projection (default:1) CAM_C2W: camera-to-world transform: * C2W = CAM_W2C: world-to-camera transform (inverse of CAM_C2W) CAM_C2WHANDLE: Handle onto CAM_C2W CAM_W2CHANDLE: Handle onto CAM_W2C CAM_FOV: field of view (in degrees) CAM_HALFYFIELD: FOV half-width at z=1 (Y direction) CAM_HALFFIELD: min FOV half-width CAM_ASPECT: aspect ratio, X/Y CAM_FOCUS: nominal focal distance for perspec<->ortho CAM_NEAR: near clipping plane CAM_FAR: far clipping plane CAM_STEREO: stereo (1) or mono (0) (default:0) CAM_STEREOSEP: separation distance between stereo eyes CAM_STEREOANGLE: angle between stereo eyes (degrees) CAM_STEREYES: array of two transforms resp. for left & right eye, applied as * C2W * STEREYE * projection CAM_STERHANDLES: Handles for left and right eye transforms CAM_STEREOEYE: Which stereo eye selected: CAM_LEFT or CAM_RIGHT CAM_SPACE: TM_EUCLIDEAN, TM_HYPERBOLIC, or TM_SPHERICAL */ #define CAM_LEFT 0 #define CAM_RIGHT 1 /* * Additional public Camera methods: */ /* Reset to defaults */ void CamReset( Camera * ); /* return Camera's projection xform; doesn't change camera at all */ void CamViewProjection( Camera *, Transform ); /* Complete cam world->proj xform; doesn't change camera at all */ void CamView( Camera *, Transform ); /* Apply T to camtoworld xform */ void CamTransform( Camera *, Transform T ); /* Rotate camera about X */ void CamRotateX( Camera *, float angle ); /* Rotate about Y (radians) */ void CamRotateY( Camera *, float ); /* Rotate about Z */ void CamRotateZ( Camera *, float ); /* Translate X,Y,Z */ void CamTranslate( Camera *, float,float,float ); /* Hyperbolic xlate */ void CamHypTranslate( Camera *, float,float,float, float ); /* Zoom in X,Y,Z */ void CamScale( Camera *, float,float,float ); /* ??? */ void CamAlignZ( Camera *, float,float,float ); /* Save to file */ void CamSave(Camera *, char *); void CamFSave(Camera *, FILE *, char *); /* Load from file */ Camera *CamLoad(Camera *, char *); Camera *CamFLoad(Camera *, IOBFILE *, char *); /************************************************************************ * The following procedures are on death row; they will be taken out * * soon because they have been superceded by CamGet and CamSet * ************************************************************************/ /* Get object xform */ void CamCurrentPosition( Camera *, Transform ); /* Camera's world->camera xform (inverse of CamCurrentPosition) */ void CamViewWorld( Camera *, Transform ); /* Set "focal" length */ void CamFocus( Camera *, float focus ); /* Get focal length */ float CamCurrentFocus( Camera * ); /* Set X/Y aspect */ void CamFrameAspect( Camera *, float aspectratio ); /* Get X/Y aspect */ float CamCurrentAspect( Camera * ); /* camtoworld xform = T */ void CamTransformTo( Camera *, Transform T ); /* Left/Right/Mono */ void CamStereoEye( Camera *cam, int whicheye ); /* Set clip planes */ void CamClipping( Camera *, float near, float far ); /* Get clipping */ void CamCurrentClipping( Camera *, float *near, float *far ); /* Set field: minfov/2 */ void CamHalfField( Camera *, float halffield ); /* Set field: Yfov/2 */ void CamHalfYField( Camera *, float halfyfield ); /* perspective/ortho */ void CamPerspective( Camera *, int perspective ); /* or orthographic */ int CamIsPerspective( Camera * ); /* Get fov/2 (max way) */ float CamCurrentHalfField( Camera * ); /* Get fov/2 (Y dir) */ float CamCurrentHalfYField( Camera * ); /* Get xfms, cur eye */ int CamCurrentStereo( Camera *, Transform leye, Transform reye ); void CamDefault(Camera *cam); int CamStreamIn(Pool *p, Handle **hp, Camera **camp); int CamStreamOut(Pool *p, Handle *hp, Camera *cam); void CamHandleScan( Camera *cam, int (*func)(), void *arg ); #endif /* !CAMERA_H */ geomview-1.9.5/src/lib/camera/cameraP.h0000644000175000017500000000672712310110177014604 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef CAMERAP_H #define CAMERAP_H #include "camera.h" #include "appearance.h" #define CAMMAGIC 0x9c816301 struct Camera { REFERENCEFIELDS; Handle *c2whandle; /* Handle for external camtoworld's */ Transform camtoworld; /* this moves the camera to its spot */ Handle *w2chandle; /* Handle for external worldtocam's */ Transform worldtocam; /* this puts the camera at the origin, etc*/ int flag; /* perspective? stereo? */ float halfyfield, /* FOV half-width at z=1 (Y direction) */ frameaspect, /* Aspect ratio, X/Y */ focus, /* Nominal focal distance for perspec<->ortho*/ cnear, cfar, /* Near & far clipping distances */ stereo_sep, stereo_angle; Handle *sterhandle[2]; Transform stereyes[2]; /* For stereo separation */ int whicheye; /* Current stereo eye selection */ int changed; /* Mask of "changed" fields, for CamMerge */ int space; /* TM_EUCLIDEAN, TM_HYPERBOLIC, or TM_SPHERICAL */ #if 1 /* cH: Background information. Does this belong here? I think * so. The background layout is clearly no property of the drawing * routines (mg-layer), and it has nothing to do with the window * system. Arguably it also has nothing to do with the camera, but * would be a global property of the entire scene. OTH, it is nice * to have cameras with different backgrounds, at least with * different background colours. * * Note that this image is not scaled, it just sits at the center * of the window (if the underlying mg-routines support a * background image at all). The mg-layer may or may not use alpha * blending with the background color if this is a four channel * image. */ ColorA bgcolor; /* background color */ Image *bgimage; /* background image, potentionally with alpha */ Handle *bgimghandle; /* handle for background image */ #endif }; /* bits for 'flag' and 'changed' fields */ #define CAMF_PERSP 0x01 #define CAMF_STEREO 0x02 #define CAMF_NEWC2W 0x04 /* bits for 'changed' only */ #define CAMF_EYE 0x20 #define CAMF_STEREOXFORM 0x40 #define CAMF_STEREOGEOM 0x80 #define CAMF_W2C 0x100 #define CAMF_FOV 0x200 #define CAMF_ASPECT 0x400 #define CAMF_FOCUS 0x800 #define CAMF_NEAR 0x1000 #define CAMF_FAR 0x2000 #define CAMF_SPACE 0x4000 /* * routine for updating transforms */ void CamTransUpdate(Handle **, Camera *, Transform); #endif /* !CAMERAP_H */ /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/camera/Headers0000644000175000017500000000002312310110177014340 00000000000000camera.h cameraP.h geomview-1.9.5/src/lib/color/0000755000175000017500000000000012310165601013017 500000000000000geomview-1.9.5/src/lib/color/Makefile.in0000644000175000017500000004712012310165553015016 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/color DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libcolor_la_LIBADD = am_libcolor_la_OBJECTS = color.lo mergein.lo mergeout.lo mergeover.lo \ mergeplus.lo mergeunder.lo paintcopy.lo paintover.lo libcolor_la_OBJECTS = $(am_libcolor_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libcolor_la_SOURCES) DIST_SOURCES = $(libcolor_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcolor.la libcolor_la_SOURCES = \ color.c mergein.c mergeout.c mergeover.c mergeplus.c mergeunder.c paintcopy.c paintover.c \ color.h merge.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/color/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/color/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libcolor.la: $(libcolor_la_OBJECTS) $(libcolor_la_DEPENDENCIES) $(EXTRA_libcolor_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libcolor_la_OBJECTS) $(libcolor_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/color.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mergein.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mergeout.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mergeover.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mergeplus.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mergeunder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paintcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paintover.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/color/Makefile.am0000644000175000017500000000034312310110177014771 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcolor.la libcolor_la_SOURCES = \ color.c mergein.c mergeout.c mergeover.c mergeplus.c mergeunder.c paintcopy.c paintover.c \ color.h merge.h geomview-1.9.5/src/lib/color/color.c0000644000175000017500000000631512310110177014224 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "color.h" #include void CoPrint( Color *c ) { (void)c; } void CoCopy( Color *c1, Color *c2 ) { *c2 = *c1; } void CoACopy( ColorA *c1, ColorA *c2 ) { *c2 = *c1; } void CoFrom( Color *c, float r, float g, float b ) { c->r = r; c->g = g; c->b = b; } void CoAdd( Color *c1,Color *c2, Color *c3 ) { c3->r = c1->r + c2->r; c3->g = c1->g + c2->g; c3->b = c1->b + c2->b; } void CoSub( Color *c1, Color *c2, Color *c3 ) { c3->r = c1->r - c2->r; c3->g = c1->g - c2->g; c3->b = c1->b - c2->b; } void CoFilter( Color *c1, Color *c2, Color *c3 ) { c3->r = c1->r * c2->r; c3->g = c1->g * c2->g; c3->b = c1->b * c2->b; } #define vH (hsv->r) #define vS (hsv->g) #define vV (hsv->b) /* HSV to RGB conversion from Ken Fishkin, pixar!fishkin */ void hsv2rgb(Color *hsv, Color *rgb) { float h = 6.0 * (vH < 0 ? vH + (1 - (int)vH) : vH - (int)vH); int sextant = (int) h; /* implicit floor */ float fract = h - sextant; float vsf = vS*vV*fract; float min = (1-vS)*vV; float mid1 = min + vsf; float mid2 = vV - vsf; switch (sextant%6) { case 0: rgb->r = vV; rgb->g = mid1; rgb->b = min; break; case 1: rgb->r = mid2; rgb->g = vV; rgb->b = min; break; case 2: rgb->r = min; rgb->g = vV; rgb->b = mid1; break; case 3: rgb->r = min; rgb->g = mid2; rgb->b = vV; break; case 4: rgb->r = mid1; rgb->g = min; rgb->b = vV; break; case 5: rgb->r = vV; rgb->g = min; rgb->b = mid2; break; } } void rgb2hsv(Color *rgb, Color *hsv) { #define cRGB (&rgb->r) int min, max; float dv; if(cRGB[0] < cRGB[1]) min = 0, max = 1; else min = 1, max = 0; if(cRGB[min] > cRGB[2]) min = 2; else if(cRGB[max] < cRGB[2]) max = 2; vV = cRGB[max]; dv = cRGB[max] - cRGB[min]; if(dv == 0) { vH = 0; /* hue undefined, use 0 */ vS = 0; } else { float dh = (cRGB[3 - max - min] - cRGB[min]) / (6*dv); vH = (3+max-min)%3==1 ? max/3.0 + dh : max/3.0 - dh; if(vH < 0) vH += 1 + (int)vH; if(vH > 1) vH -= (int)vH; vS = dv / cRGB[max]; } } geomview-1.9.5/src/lib/color/mergein.c0000644000175000017500000000304312310110177014527 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "color.h" void MergeIn( ColorA *f, ColorA *b,ColorA * t ) { float a = b->a; t->r = a * f->r; t->g = a * f->g; t->b = a * f->b; t->a = a * f->a; } void MergeInN( ColorA *f,ColorA * b,ColorA * t,int n ) { float a; while( n-- ) { a = b->a; t->r = a * f->r; t->g = a * f->g; t->b = a * f->b; t->a = a * f->a; f++; b++; t++; } } geomview-1.9.5/src/lib/color/mergeout.c0000644000175000017500000000306712310110177014736 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "color.h" void MergeOut( f, b, t ) ColorA *f, *b, *t; { float a = 1.0 - b->a; t->r = a * f->r; t->g = a * f->g; t->b = a * f->b; t->a = a * f->a; } void MergeOutN( f, b, t, n ) ColorA *f, *b, *t; int n; { float a; while( n-- ) { a = 1.0 - b->a; t->r = a * f->r; t->g = a * f->g; t->b = a * f->b; t->a = a * f->a; f++; b++; t++; } } geomview-1.9.5/src/lib/color/mergeover.c0000644000175000017500000000315212310110177015075 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "color.h" void MergeOver( f, b, t ) ColorA *f, *b, *t; { float a = 1.0 - f->a; t->r = f->r + a * b->r; t->g = f->g + a * b->g; t->b = f->b + a * b->b; t->a = f->a + a * b->a; } void MergeOverN( f, b, t, n ) ColorA *f, *b, *t; int n; { float a; while( n-- ) { a = 1.0 - f->a; t->r = f->r + a * b->r; t->g = f->g + a * b->g; t->b = f->b + a * b->b; t->a = f->a + a * b->a; f++; b++; t++; } } geomview-1.9.5/src/lib/color/mergeplus.c0000644000175000017500000000300612310110177015103 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "color.h" void MergePlus( ColorA *f,ColorA *b, ColorA *t ) { t->r = f->r + b->r; t->g = f->g + b->g; t->b = f->b + b->b; t->a = f->a + b->a; } void MergePlusN( ColorA *f,ColorA * b,ColorA * t, int n ) { while( n-- ) { t->r = f->r + b->r; t->g = f->g + b->g; t->b = f->b + b->b; t->a = f->a + b->a; f++; b++; t++; } } geomview-1.9.5/src/lib/color/mergeunder.c0000644000175000017500000000315412310110177015241 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "color.h" void MergeUnder( f, b, t ) ColorA *f, *b, *t; { float a = 1.0 - b->a; t->r = a * f->r + b->r; t->g = a * f->g + b->g; t->b = a * f->b + b->b; t->a = a * f->a + b->a; } void MergeUnderN( f, b, t, n ) ColorA *f, *b, *t; int n; { float a; while( n-- ) { a = 1.0 - b->a; t->r = a * f->r + b->r; t->g = a * f->g + b->g; t->b = a * f->b + b->b; t->a = a * f->a + b->a; f++; b++; t++; } } geomview-1.9.5/src/lib/color/paintcopy.c0000644000175000017500000000326612310110177015116 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "color.h" void PaintCopy( f, b, t, m ) ColorA *f, *b, *t; float *m; { float a = 1.0 - *m; t->r = *m * f->r + a * b->r; t->g = *m * f->g + a * b->g; t->b = *m * f->b + a * b->b; t->a = *m * f->a + a * b->a; } void PaintCopyN( f, b, t, m, n ) ColorA *f, *b, *t; float *m; int n; { float a; while( n-- ) { a = 1.0 - *m; t->r = *m * f->r + a * b->r; t->g = *m * f->g + a * b->g; t->b = *m * f->b + a * b->b; t->a = *m * f->a + a * b->a; f++; b++; t++; m++; } } geomview-1.9.5/src/lib/color/paintover.c0000644000175000017500000000330412310110177015110 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "color.h" void PaintOver( f, b, t, m ) ColorA *f, *b, *t; float *m; { float a = 1.0 - *m * f->a; t->r = *m * f->r + a * b->r; t->g = *m * f->g + a * b->g; t->b = *m * f->b + a * b->b; t->a = *m * f->a + a * b->a; } void PaintOverN( f, b, t, m, n ) ColorA *f, *b, *t; float *m; int n; { float a; while( n-- ) { a = 1.0 - *m * f->a; t->r = *m * f->r + a * b->r; t->g = *m * f->g + a * b->g; t->b = *m * f->b + a * b->b; t->a = *m * f->a + a * b->a; f++; b++; t++; m++; } } geomview-1.9.5/src/lib/color/color.h0000644000175000017500000000300212310110177014217 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef COLORDEFS #define COLORDEFS typedef struct { float r, g, b; } Color; typedef struct { float r, g, b, a; } ColorA; extern void CoPrint(Color *c); extern void CoCopy(Color *c0, Color *c1); extern void CoACopy(ColorA *c0, ColorA *c1); extern void CoFrom(Color *c, float r, float g, float b); extern void CoAdd(Color *c0, Color *c1, Color *c2); extern void CoSub(Color *c0, Color *c1, Color *c2); extern void CoFilter(Color *c0, Color *c1, Color *c2); extern void hsv2rgb(Color *hsv, Color *rgb); extern void rgb2hsv(Color *rgb, Color *hsv); #endif geomview-1.9.5/src/lib/color/merge.h0000644000175000017500000000244112310110177014206 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef MERGEDEFS #define MERGEDEFS #include "color.h" extern void MergePlus(), MergePlusN(); extern void MergeIn(), MergeInN(); extern void MergeOut(), MergeOutN(); extern void MergeOver(), MergeOverN(); extern void MergeUnder(), MergeUnderN(); extern void PaintCopy(), PaintCopyN(); extern void PaintOver(), PaintOverN(); #endif geomview-1.9.5/src/lib/color/Headers0000644000175000017500000000002012310110177014223 00000000000000color.h merge.h geomview-1.9.5/src/lib/oogl/0000755000175000017500000000000012310165601012641 500000000000000geomview-1.9.5/src/lib/oogl/Makefile.in0000644000175000017500000004736012310165555014650 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/oogl DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir 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 DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = lisp refcomm util wa all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/oogl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/oogl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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" cscopelist: cscopelist-recursive 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am 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 \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/oogl/Makefile.am0000644000175000017500000000004012310110201014571 00000000000000SUBDIRS = lisp refcomm util wa geomview-1.9.5/src/lib/oogl/lisp/0000755000175000017500000000000012310165601013610 500000000000000geomview-1.9.5/src/lib/oogl/lisp/Makefile.in0000644000175000017500000004661712310165555015623 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/oogl/lisp DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) liblisp_la_LIBADD = am_liblisp_la_OBJECTS = lisp.lo liblisp_la_OBJECTS = $(am_liblisp_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(liblisp_la_SOURCES) DIST_SOURCES = $(liblisp_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) BUILT_SOURCES = clisp.c clisp.h EXTRA_DIST = Headers lisp2c $(BUILT_SOURCES) noinst_LTLIBRARIES = liblisp.la liblisp_la_SOURCES = lisp.c clisp.h lisp2.h lisp.h MAINTAINERCLEANFILES = $(BUILT_SOURCES) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/oogl/lisp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/oogl/lisp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } liblisp.la: $(liblisp_la_OBJECTS) $(liblisp_la_DEPENDENCIES) $(EXTRA_liblisp_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(liblisp_la_OBJECTS) $(liblisp_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lisp.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) all-local installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \ clean-generic clean-libtool clean-noinstLTLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am all-local: clisp.c clisp.h clisp.h: clisp.c clisp.c: lisp.c lisp.h $(srcdir)/lisp2c -o $(srcdir)/clisp $(srcdir)/lisp.c # 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: geomview-1.9.5/src/lib/oogl/lisp/Makefile.am0000644000175000017500000000054612310110201015553 00000000000000INCLUDES = $(default_includes) BUILT_SOURCES = clisp.c clisp.h EXTRA_DIST = Headers lisp2c $(BUILT_SOURCES) noinst_LTLIBRARIES = liblisp.la liblisp_la_SOURCES = lisp.c clisp.h lisp2.h lisp.h all-local: clisp.c clisp.h clisp.h: clisp.c clisp.c: lisp.c lisp.h $(srcdir)/lisp2c -o $(srcdir)/clisp $(srcdir)/lisp.c MAINTAINERCLEANFILES = $(BUILT_SOURCES) geomview-1.9.5/src/lib/oogl/lisp/lisp.c0000644000175000017500000025742712310110201014646 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #ifdef HAVE_CONFIG_H # include "config.h" #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ /* * lisp.c: minimal (but less minimal than before) lisp interpreter */ #include #include #include #include #include #include "lisp.h" #include "clisp.c" #include "freelist.h" #define MAXPAT 10 #define MAXPATLEN 128 typedef struct _pattern { int n; char p0[MAXPATLEN]; char *pat[MAXPAT]; int len[MAXPAT]; } pattern; static bool match(const char *str, pattern *p); static void compile(const char *str, pattern *p); static int LCompare(const char *name, LObject *expr1, LObject *expr2); typedef struct Help { const char *key; const char *message; struct Help *next; } Help; static Help *helps = NULL; static char nomatch[] = "No commands match \"%s\"; see \"(? *)\" for a list.\n"; static bool FilterArgMatch(LList *filter, LList *args); static void InterestOutput(char *name, LList *args, LInterest *interest); static LFilter FAny = {ANY, NULL}; static LFilter FNil = {NIL, NULL}; static LObject LFAny[1] = {{ LFILTER, 1, { &FAny } }}; static LObject LFNil[1] = {{ LFILTER, 1, { &FNil } }}; static bool obj2array(LObject *obj, LType *type, char *x, int *n, bool hold); static bool obj2vararray(LObject *obj, LType *type, char **x, int *n, bool hold); LObject *LMakeArray(LType *basetype, char *array, int count); /* Use -1 as the item size of special type markers * for quick detection in LParseArgs()/AssignArgs(). */ LType Larray = { NULL, -1, }; LType Lvararray = { NULL, -1, }; LType Lend = { NULL, -1, }; LType Lrest = { NULL, -1, }; LType Lhold = { NULL, -1, }; LType Lliteral = { NULL, -1, }; LType Loptional = { NULL, -1, }; #define REJECT -1 typedef struct { LObjectFunc fptr; LObject *lambda; /* != NULL for non-builtins */ char *name; char *help; LInterest *interested; } LFunction; extern LType LFuncp; #define LFUNC (&LFuncp) #define LFUNCVAL(obj) ((int)((obj)->cell.i)) vvec funcvvec; #define functable VVEC(funcvvec,LFunction) static Fsa func_fsa; /* lambda expression parameters */ typedef struct LNameSpace LNameSpace; struct LNameSpace { vvec table; Fsa parser; LNameSpace *next; }; static LNameSpace *lambda_namespace; /* we also support a global variable name-space, accessible via * * (setq ...) * * Note that (setq symbol value) does not mean that you can bind, * e.g. geometries to a lisp variable: the return value of (geometry * BLAH) will just be Lt in the case of success, or Lnil in the case * of error. So: (setq foo (geometry blah)) will just bind foo the Lt * or Lnil. */ static LNameSpace setq_namespace[1]; /* * function prototypes */ static LParseResult AssignArgs(const char *name, LList *args, va_list a_list); static int funcindex(const char *name); static inline LObject *LSexpr0(Lake *lake, int listhow); #define LIST_LITERAL 0 #define LIST_FUNCTION 1 #define LIST_EVAL 2 /* Parse with intention to evaluate */ LObject *Linterest(Lake *lake, LList *args); LObject *Luninterest(Lake *lake, LList *args); LObject *Lregtable(Lake *lake, LList *args); static LObject *do_interest(Lake *lake, LList *call, char *action); static void RemoveInterests(LInterest **interest, Lake *lake, int usefilter, LList *filter); static bool InterestMatch(LInterest *interest, Lake *lake, bool usefilter, LList *filter); static bool FilterMatch(LFilter *f1, LFilter *f2); static void DeleteInterest(LInterest *interest); static LInterest *NewInterest(); static void AppendInterest(LInterest **head, LInterest *new); static LList *FilterList(LList *args); static inline bool lambdafromobj(LObject *lambda, LList **args, LList **body); static inline bool namespace_put(LNameSpace *ns, char *name, LObject *value, bool overwrite); static inline LObject *namespace_get(LNameSpace *ns, char *name); static inline LObject *ParseArg(LType *type, Lake *lake); /* * nil object implementation */ static LObject nil = {LLIST, 1, { NULL } }; LObject *Lnil = &nil; /* * t object implementation */ static void twrite(FILE *fp, void *value) { (void)value; fprintf(fp,"t"); } static LType ttype = { "t", sizeof(int), NULL, NULL, NULL, twrite, NULL, NULL, NULL, LTypeMagic } ; static LObject t = {&ttype, 1, { NULL } }; LObject *Lt = &t; /* * int object implementation */ static bool intfromobj(LObject *obj, int *x) { if (obj->type == LSTRING || obj->type == LSYMBOL) { char *cp = LSTRINGVAL(obj); char *end; long value; double dval; if (strcmp(cp, "nil") == 0) { *x = 0; return true; } *x = value = strtol(cp, &end, 0); if (((size_t)end - (size_t)cp) == strlen(cp)) { return (long)(int)value == value; } *x = dval = strtod(cp, &end); if (((size_t)end - (size_t)cp) == strlen(cp)) { return (double)*x == dval; } return false; } else if (obj->type == LINT) { *x = LINTVAL(obj); } else if (obj->type == LLONG) { long val = LLONGVAL(obj); *x = (int)val; return (long)(int)val == val; } else if (obj == Lnil) { *x = 0; } else if (obj->type == LFLOAT) { float val = LFLOATVAL(obj); *x = (int)val; return (float)(int)val == val; } else if (obj->type == LDOUBLE) { double val = LDOUBLEVAL(obj); *x = (int)val; return (double)(int)val == val; } else { return false; } return true; } static LObject *int2obj(int *x) { return LNew( LINT, x ); } static void intfree(int *x) { (void)x; } static bool intmatch(int *a, int *b) { return *a == *b; } static void intwrite(FILE *fp, int *x) { fprintf(fp, "%1d", *x); } static void intpull(va_list *a_list, int *x) { *x = va_arg(*a_list, int); } static LObject *intparse(Lake *lake) { /* parse the next thing from the lake */ LObject *obj = LSexpr(lake); /* if it's a string, promote it to an int, otherwise leave it as it is */ if (obj->type == LSTRING || obj->type == LSYMBOL) { char *cp = LSTRINGVAL(obj); char *end; int val; if (strcmp(cp, "nil") == 0) { val = 0; end = cp + 3; } else { val = strtol(cp, &end, 0); } if (((size_t)end - (size_t)cp) == strlen(cp)) { free(LSTRINGVAL(obj)); obj->type = LINT; obj->cell.i = val; } } return obj; } LType LIntp = { "int", sizeof(int), intfromobj, int2obj, intfree, intwrite, intmatch, intpull, intparse, LTypeMagic }; /* * long object implementation */ static bool longfromobj(LObject *obj, long *x) { if (obj->type == LSTRING || obj->type == LSYMBOL) { char *cp = LSTRINGVAL(obj); char *end; double dval; if (strcmp(cp, "nil") == 0) { *x = 0; return true; } *x = strtol(cp, &end, 0); if (((size_t)end - (size_t)cp) == strlen(cp)) { return true; } *x = dval = strtod(cp, &end); if (((size_t)end - (size_t)cp) == strlen(cp)) { return (double)*x == dval; } return false; } else if (obj->type == LLONG) { *x = LLONGVAL(obj); } else if (obj->type == LINT) { *x = LINTVAL(obj); } else if (obj == Lnil) { *x = 0; } else if (obj->type == LFLOAT) { float val = LFLOATVAL(obj); *x = (long)val; return (float)(long)val == val; } else if (obj->type == LDOUBLE) { double val = LDOUBLEVAL(obj); *x = (long)val; return (double)(long)val == val; } else { return false; } return true; } static LObject *long2obj(long *x) { return LNew( LLONG, x ); } static void longfree(long *x) { (void)x; } static bool longmatch(long *a, long *b) { return *a == *b; } static void longwrite(FILE *fp, long *x) { fprintf(fp, "%1lu", *x); } static void longpull(va_list *a_list, long *x) { *x = va_arg(*a_list, long); } static LObject *longparse(Lake *lake) { /* parse the next thing from the lake */ LObject *obj = LSexpr(lake); /* if it's a string, promote it to a long, otherwise leave it as it is */ if (obj->type == LSTRING || obj->type == LSYMBOL) { char *cp = LSTRINGVAL(obj); char *end; long val; if (strcmp(cp, "nil") == 0) { val = 0; end = cp + 3; } else { val = strtol(cp, &end, 0); } if (((size_t)end - (size_t)cp) == strlen(cp)) { free(LSTRINGVAL(obj)); obj->type = LLONG; obj->cell.l = val; } } return obj; } LType LLongp = { "long", sizeof(long), longfromobj, long2obj, longfree, longwrite, longmatch, longpull, longparse, LTypeMagic }; /* * float object implementation */ static bool floatfromobj(LObject *obj, float *x) { if (obj->type == LSTRING || obj->type == LSYMBOL) { char *cp = LSTRINGVAL(obj); char *end; if (strcmp(cp, "nil") == 0) { *x = 0; return true; } *x = strtod(cp, &end); return ((size_t)end - (size_t)cp) == strlen(cp) ? true : false; } else if (obj->type == LFLOAT) { *x = LFLOATVAL(obj); } else if (obj->type == LLONG) { *x = LLONGVAL(obj); } else if (obj->type == LINT) { *x = LINTVAL(obj); } else { return false; } return true; } static LObject *float2obj(float *x) { return LNew( LFLOAT, x ); } static void floatfree(float *x) { (void)x; } static bool floatmatch(float *a, float *b) { return *a == *b; } static void floatwrite(FILE *fp, float *x) { fprintf(fp, "%1g", *x); } static void floatpull(va_list *a_list, float *x) { *x = va_arg(*a_list, double); } static LObject *floatparse(Lake *lake) { /* parse the next thing from the lake */ LObject *obj = LSexpr(lake); /* if it's a string or another numerical value, promote it to a float, otherwise leave it as it is */ if (obj->type == LSTRING || obj->type == LSYMBOL) { char *cp = LSTRINGVAL(obj); char *end; float val = strtod(cp, &end); /* Allow a conversion only if the entire string is a float; * otherwise reject it. There is no point in converting 1.4foobar * to a float. */ if (((size_t)end - (size_t)cp) == strlen(cp)) { free(LSTRINGVAL(obj)); obj->type = LFLOAT; obj->cell.f = val; } } else if (obj->type == LINT) { obj->type = LFLOAT; obj->cell.f = LINTVAL(obj); } else if (obj->type == LLONG) { obj->type = LFLOAT; obj->cell.f = LLONGVAL(obj); } else if (obj->type == LDOUBLE) { obj->type = LFLOAT; obj->cell.f = LDOUBLEVAL(obj); } return obj; } LType LFloatp = { "float", sizeof(float), floatfromobj, float2obj, floatfree, floatwrite, floatmatch, floatpull, floatparse, LTypeMagic }; /* * double object implementation */ static bool doublefromobj(LObject *obj, double *x) { if (obj->type == LSTRING || obj->type == LSYMBOL) { char *cp = LSTRINGVAL(obj); char *end; if (strcmp(cp, "nil") == 0) { *x = 0; return true; } *x = strtod(cp, &end); return ((size_t)end - (size_t)cp) == strlen(cp) ? true : false; } else if (obj->type == LDOUBLE) { *x = LDOUBLEVAL(obj); } else if (obj->type == LFLOAT) { *x = LFLOATVAL(obj); } else if (obj->type == LLONG) { *x = LLONGVAL(obj); } else if (obj->type == LINT) { *x = LINTVAL(obj); } else { return false; } return true; } static LObject *double2obj(double *x) { return LNew( LDOUBLE, x ); } static void doublefree(double *x) { (void)x; } static bool doublematch(double *a, double *b) { return *a == *b; } static void doublewrite(FILE *fp, double *x) { fprintf(fp, "%1g", *x); } static void doublepull(va_list *a_list, double *x) { *x = va_arg(*a_list, double); } static LObject *doubleparse(Lake *lake) { /* parse the next thing from the lake */ LObject *obj = LSexpr(lake); /* if it's a string or another numerical value, promote it to a double, otherwise leave it as it is */ if (obj->type == LSTRING || obj->type == LSYMBOL) { char *cp = LSTRINGVAL(obj); char *end; double val = strtod(cp, &end); /* Allow a conversion only if the entire string is a double; * otherwise reject it. There is no point in converting 1.4foobar * to a double. */ if (((size_t)end - (size_t)cp) == strlen(cp)) { free(LSTRINGVAL(obj)); obj->type = LDOUBLE; obj->cell.d = val; } } else if (obj->type == LINT) { obj->type = LDOUBLE; obj->cell.f = LINTVAL(obj); } else if (obj->type == LLONG) { obj->type = LDOUBLE; obj->cell.f = LLONGVAL(obj); } else if (obj->type == LFLOAT) { obj->type = LDOUBLE; obj->cell.f = LFLOATVAL(obj); } return obj; } LType LDoublep = { "double", sizeof(double), doublefromobj, double2obj, doublefree, doublewrite, doublematch, doublepull, doubleparse, LTypeMagic }; /* * string object implementation */ static bool stringfromobj(LObject *obj, char **x) { if (obj->type == LSTRING || obj->type == LSYMBOL) { *x = LSTRINGVAL(obj); } else { return false; } return true; } static LObject *string2obj(char **x) { char *copy = *x ? strdup(*x) : NULL; return LNew( LSTRING, © ); } static void stringfree(char **x) { if (*x) free(*x); } static bool stringmatch(char **a, char **b) { if (!*a) return *b==NULL; if (!*b) return *a==NULL; return strcmp(*a,*b)==0 ; } static void stringwrite(FILE *fp, char **x) { fprintf(fp, "\"%s\"", *x); } static void stringpull(va_list *a_list, char **x) { *x = va_arg(*a_list, char *); } static LObject *stringparse(Lake *lake) { LObject *obj = LSexpr(lake); #if 0 /* Don't otherwise unquoted strings will not be bound to argument * valus; or I would have to edit all LDEFUN() invocations. */ if (obj->type == LSYMBOL) { obj->type = LSTRING; } #endif return obj; } LType LStringp = { "string", sizeof(char *), stringfromobj, string2obj, stringfree, stringwrite, stringmatch, stringpull, stringparse, LTypeMagic }; /* * Symbol object implementation. We treat symbols and strings * interchangeably, with the exception that symbols can bind to * values, but strings cannot. This makes a difference during the * evaluation of lambda expressions. */ static bool symbolfromobj(LObject *obj, char **x) { if (obj->type == LSYMBOL) { *x = LSYMBOLVAL(obj); } else { return false; } return true; } static LObject *symbol2obj(char **x) { char *copy = *x ? strdup(*x) : NULL; return LNew(LSYMBOL, ©); } static void symbolwrite(FILE *fp, char **x) { fprintf(fp, "%s", *x); } static LObject *symbolparse(Lake *lake) { LObject *obj = LSexpr(lake); /* Mmmh. Shouldn't it be the otherway round: somebody requesting an * LSYMBOL in the input stream would rather expect to get the symbol * value; so maybe we should promote from LSYMBOL to LSTRING * here. Maybe not. Leave it as is for the moment. */ if (obj->type == LSTRING) { obj->type = LSYMBOL; } return obj; } LType LSymbolp = { "symbol", sizeof(char *), symbolfromobj, symbol2obj, stringfree, symbolwrite, stringmatch, stringpull, symbolparse, LTypeMagic }; /* * list implementation */ static DEF_FREELIST(LList); LList *LListNew(void) { LList *new; FREELIST_NEW(LList, new); new->cdr = NULL; return new; } LList *LListCopy(LList *list) { LList *new; if (!list) { return NULL; } new = LListNew(); if (list->car) { new->car = LCopy(list->car); } else { new->car = NULL; } new->cdr = LListCopy(list->cdr); return new; } LList *LListShallowCopy(LList *list) { LList *new; if (!list) { return NULL; } new = LListNew(); if (list->car) { new->car = LRefIncr(list->car); } else { new->car = NULL; } new->cdr = LListShallowCopy(list->cdr); return new; } void LListFree(LList *list) { if (!list) { return; } if (list->cdr) { LListFree(list->cdr); } LFree(list->car); FREELIST_FREE(LList, list); } void LListWrite(FILE *fp, LList *list) { int first = 1; if (list == NULL) { fprintf(fp, "nil"); } else { fprintf(fp,"("); while (list != NULL) { if (!first) { fprintf(fp," "); } first = 0; LWrite(fp, list->car); list = list->cdr; } fprintf(fp,")"); } } /**********************************************************************/ bool listfromobj(LObject *obj, LList **x) { if (obj->type != LLIST) { return false; } *x = LLISTVAL(obj); return true; } LObject *list2obj(LList **x) { LList *list = *x ? LListCopy(*x) : NULL; return LNew( LLIST, &list ); } void listfree(LList **x) { if (*x) { LListFree(*x); } } bool listmatch(LList **a, LList **b) { return *a == *b; } void listwrite(FILE *fp, LList **x) { LListWrite(fp, *x); } void listpull(va_list *a_list, LList **x) { *x = va_arg(*a_list, LList *); } LType LListp = { "list", sizeof(LList *), listfromobj, list2obj, listfree, listwrite, listmatch, listpull, LSexpr, LTypeMagic }; bool objfromobj(LObject *obj, LObject **x) { *x = obj; return true; } LObject *obj2obj(LObject **x) { if (*x) LRefIncr(*x); return *x; } void objpull(va_list *a_list, LObject **x) { *x = va_arg(*a_list, LObject *); } bool objmatch(LObject **a, LObject **b) { return *a == *b; } LType LObjectp = { "lisp object", sizeof(LObject *), objfromobj, obj2obj, NULL, NULL, objmatch, objpull, LSexpr, LTypeMagic }; /* * Lake implementation */ Lake *LakeDefine(IOBFILE *streamin, FILE *streamout, void *river) { Lake *lake = OOGLNewE(Lake, "new Lake"); lake->streamin = streamin; lake->streamout = streamout ? streamout : stdout; lake->river = river; lake->timing_interests = 0; return lake; } void LakeFree(Lake *lake) { OOGLFree(lake); } /* * Lake object implementation * ( Not the same as the Lake itself; the lake object is a lisp * object type whose value is a Lake pointer. ) */ static bool lakefromobj(LObject *obj, Lake **x) { if (obj->type == LLAKE) { *x = LLAKEVAL(obj); return true; } return false; } static LObject *lake2obj(Lake **x) { return LNew( LLAKE, x ); } static void lakefree(Lake **x) { (void)x; } static void lakewrite(FILE *fp, Lake **x) { (void)x; fprintf(fp,"-lake-"); } LType LLakep = { "lake", sizeof(Lake *), lakefromobj, lake2obj, lakefree, lakewrite, NULL, NULL, NULL, LTypeMagic }; /* * function object implementation */ bool funcfromobj(LObject *obj, int *x) { if (obj->type == LSYMBOL) { *x = funcindex(LSYMBOLVAL(obj)); if (*x == REJECT) return false; } else if (obj->type == LFUNC) { *x = LFUNCVAL(obj); } else if (obj->type == LLIST) { if (lambdafromobj(obj, NULL, NULL)) { *x = funcindex("\a\bEvalLambda"); } } else { return false; } return true; } LObject *func2obj(int *x) { return LNew( LFUNC, x ); } void funcfree(int *x) { (void)x; } bool funcmatch(int *a, int *b) { return *a == *b; } void funcwrite(FILE *fp, int *x) { fprintf(fp, "%s", functable[*x].name); } void funcpull(va_list *a_list, int *x) { *x = va_arg(*a_list, int); } LType LFuncp = { "lisp function", sizeof(int), funcfromobj, func2obj, funcfree, funcwrite, funcmatch, funcpull, LSexpr, LTypeMagic }; static inline LObject *FUNCTOOBJ(const char *name) { int idx = funcindex(name); if (idx < 0) { return Lnil; } return func2obj(&idx); } /**********************************************************************/ void LInit() { /* Function name-space */ VVINIT(funcvvec, LFunction, 256); func_fsa = fsa_initialize( NULL, (void*)REJECT ); /* estabilish the global setq name-space */ VVINIT(setq_namespace->table, LObject *, 256); setq_namespace->parser = fsa_initialize(NULL, (void *)REJECT); lambda_namespace = setq_namespace; { extern LObject *Lhelp(Lake *lake, LList *args); extern LObject *Lmorehelp(Lake *lake, LList *args); LDefun("?", Lhelp, "(? [command])" "Command may include \"*\"s as wildcards; see also \"??\". " "One-line command help; lists names only if multiple commands match." "? is a synonym for \"help\"."); LDefun("??", Lmorehelp, "(?? command)\n" "\"command\" may include \"*\" wildcards" "Prints more info than \"(? command)\". ?? is a synonym " "for \"morehelp\"."); } clisp_init(); LHelpDef("STATEMENT", "\nSTATEMENT represents a function call. Function calls have " "the form \"( func arg1 arg2 ... )\", where func is the name " "of the function and arg1, arg2, ... are the arguments."); } LDEFINE(quote, LLOBJECT, "(quote EXPR)\n" "returns the symbolic lisp expression EXPR without evaluating it.") { LObject *arg; LDECLARE(("quote", LBEGIN, LHOLD, LLOBJECT, &arg, LEND)); LRefIncr(arg); return arg; } /* The purpose of the function below is to allow the evaluation of * quoted lists, or lists constructed via cons, car, cdr, or the &rest * argument of defun: if the car of a list is a symbol and not a * function call, then it is first replaced by a matching function * call if possible, and a lake argument is added as second arg. */ static void LListSexpr(LList *expr, Lake *lake) { LList *subexpr, *cdr = expr->cdr; int fidx; if (expr->car && expr->car->type != LFUNC && funcfromobj(expr->car, &fidx)) { /* try to convert into a function name and add a lake argument. */ LList *lakenode = LListNew(); lakenode->cdr = cdr; lakenode->car = lake2obj(&lake); if (expr->car->type == LSYMBOL) { /* Builtin function or defun */ LFree(expr->car); expr->car = LNew(LFUNC, &fidx); expr->cdr = lakenode; } else { /* anonymous lambda expression */ expr->cdr = LListNew(); expr->cdr->car = expr->car; expr->car = LNew(LFUNC, &fidx); expr->cdr->cdr = lakenode; } } while (cdr) { if (expr->car) { if (expr->car->type == LLAKE) { expr->car->cell.p = lake; } else if (listfromobj(expr->car, &subexpr)) { LListSexpr(subexpr, lake); } } cdr = cdr->cdr; } } LDEFINE(eval, LLOBJECT, "(eval EXPR)\n" "Evaluate a lisp expression. If EXPR is an unevaluated S-expression " "as returned by the \"(quote ...)\" command then the effect will be " "as if calling the un-quoted expression directly.") { LObject *arg; LList *sexpr; Lake *caller; LDECLARE(("eval", LBEGIN, LLAKE, &caller, LLOBJECT, &arg, LEND)); if (listfromobj(arg, &sexpr)) { LListSexpr(sexpr, caller); } return LEval(arg); } LDEFINE(lambda, LLOBJECT, "(lambda (arg1 arg2 ...) EXPR1 ... EXPRN)\n" "A lambda expression is like a function. " "To \"call\" a lambda expression, it has to be evoked like a " "function:\n\n" "((lambda (arg) (+ 1 arg)) 2)\n\n" "In this example, the value of the entire expression would be 3. " "In general, the value of the call will be the value of exprN. " "The first list serves to define formal parameters. The values " "of the formal parameters can be changed using `(setq ...)'. The " "binding will only be in effect during the evaluation of the " "lambda-expression. The lambda " "expression itself is just a list, starting with the key-word lambda, " "followed by several quoted lists; it evaluates to itself if not " "called as a function.") { LObject *lambda; LList *arglist; LList *body; LDECLARE(("lambda", LBEGIN, LLITERAL, LLIST, &arglist, LHOLD, LREST, &body, LEND)); /* We avaluate to ourselves */ lambda = list2obj(&args); return lambda; } LDEFINE(let, LLOBJECT, "(let ARGUMENTS EXPR1 ... EXPRN)\n" "Generate a lambda expression from EXRP1 ... EXPRN, with the " "argument bindings described by ARGUMENTS. ARGUMENTS is a list " "of symbols (bound to nil by default) or lists of the form " "`(ARG VALUE)' where ARG is a symbol and not evaluated and VALUE " "is a S-expr which is first evaluated, then its value is bound to " "ARG. The entire expression evaluates to the value of EXPRN, the " "last expression in the body of the statement. The argument list " "must be present, but can be empty; in the latter case the " "`(let () ...)' statement is equivalent to a `(progn ...)'") { if (!LPARSEMODE) { return LEvalLambda(NULL, args); } else { /* We cannot use LParseArgs() to parse the lake into ARGLIST, * otherwise the parameter names would be turned into function * calls, and in case of a matching function name the following * data would be parsed according to the rules of the function * which is not appropriate here. The strategy is to convert the * let-expression into an equivalent lambda-expression during * parsing. */ LList *lambda; LList **arglistp; int quote; bool par; if (!LakeMore(lake) || !LakeNewSexpr(lake)) { OOGLSyntax(lake->streamin, "Llet(): Reading \"%s\": missing parameter list", LakeName(lake)); } /* lambda-expression */ lambda = LListNew(); LListAppend(args, LNew(LLIST, &lambda)); args = args->cdr; /* head of lambda expression */ lambda->car = FUNCTOOBJ("lambda"); /* lambda argument list */ lambda->cdr = LListNew(); lambda->cdr->car = LNew(LLIST, NULL); arglistp = (LList **)&lambda->cdr->car->cell.p; /* stash the lake as first argument value */ LListAppend(args, lake2obj(&lake)); args = args->cdr; /* argument values then go to args->cdr, if present */ LakeNextToken(lake, "e); /* consume '(' */ while (LakeMore(lake)) { LObject *larg, *lval; char *arg; if ((par = LakeNewSexpr(lake))) { /* (ARG VALUE) */ LakeNextToken(lake, "e); /* consume '(' */ } /* fetch the argument name */ if ((larg = LLiteral(lake)) == Lnil || !symbolfromobj(larg, &arg)) { OOGLSyntax(lake->streamin, "Llet(): Reading \"%s\": " "argument name missing or not a symbol (`%s'?!)", LakeName(lake), LSummarize(larg)); goto parsebad; } if (par) { /* fetch the argument value */ lval = LSexpr(lake); if (LakeMore(lake)) { OOGLSyntax(lake->streamin, "Llet(): Reading \"%s\": " "excess data in argument definition", LakeName(lake)); LFree(lval); goto parsebad; } LakeNextToken(lake, "e); /* consume ')' */ } else { lval = Lnil; } /* put the argument name into the argument list of the lambda * expression */ *arglistp = LListNew(); (*arglistp)->car = larg; arglistp = &(*arglistp)->cdr; /* put the argument value into the value list of the lambda * function call, i.e. just append to args. */ LListAppend(args, lval); args = args->cdr; } LakeNextToken(lake, "e); /* consume ')' */ /* suck the body of the let statement in */ args = lambda->cdr; LDECLARE(("let", LBEGIN, LHOLD, LREST, NULL, LEND)); return Lt; /* not reached */ parsebad: /* Consume the remainder of the expression */ while (LakeMore(lake)) { LFree(LSexpr(lake)); } LakeNextToken(lake, "e); /* consume ')' */ if (par) { par = false; goto parsebad; } /* this was for the argument list, now go for the body */ while (LakeMore(lake)) { LFree(LSexpr(lake)); } return Lnil; } } LDEFINE(defun, LLOBJECT, "(defun NAME (ARG1 ...) [DOCSTRING] EXPR1 ...)\n" "Define a named lambda-expression, that is: define NAME to evaluate " "to the lambda-expression \"(lambda (ARG1...) (EXPR1...))\" when " "called as a function. Also, install DOCSTRING as response to the " "commands \"(help NAME)\" and \"(morehelp NAME)\". Not that DOCSTRING " "need not contain the command-synopsis, it is generated automatically. " "EXPR1 cannot be a string if DOCSTRING is omitted; it " "would be interpreted as the doc-string. The return value of " "(defun ...) is the function name.") { char *name; char *helpstring = NULL; LList *arglist, *body, *arg; LObject *lambda; int fidx, nargs, helpsize; char *help, *argname; /* Not pretty standard: in order that our Sexpr0() uses the correct * function for parsing the arguments of the defun we have to add a * dummy function entry right at the start. That entry points to * EvalDefun(), which makes sure we have a LAKE and the remaining * arguments as LREST list. */ if (!LPARSEMODE) { LDECLARE(("defun", LBEGIN, LSYMBOL, &name, LLITERAL, LLIST, &arglist, LHOLD, LREST, &body, LEND)); } else { LObject *lname; char *name; /* Dequeue the function name */ if (!LakeMore(lake) || (lname = LLiteral(lake)) == Lnil || !symbolfromobj(lname, &name)) { OOGLSyntax(lake->streamin, "Ldefun(): Reading \"%s\": missing function name", LakeName(lake)); return Lnil; } /* Append the function name to the argument list */ LListAppend(args, lname); /* Bind it. Error recovery is flakey here, because we bind the new * name even though we do not know yet whether the following * S-expr is syntactically correct. */ LDefun(name, LEvalDefun, NULL); /* Then proceed with normal argument parsing; this will already * use the new function binding and the parsing rules of * LEvalDefun(). */ LDECLARE(("defun", LBEGIN, LLITERAL, LLIST, &arglist, LHOLD, LREST, &body, LEND)); } /* evaluation mode */ /* Fetch the index into the jump table */ if ((fidx = funcindex(name)) < 0) { OOGLError(0, "Ldefun(%s): Error: LDefun(%s) failed.", name, name); return Lnil; } /* Extract doc-string and body */ if (body && LFROMOBJ(LSTRING)(body->car, &helpstring)) { body = body->cdr; } /* Construct a suitable help-string. The heading is auto-generated. */ if (helpstring == NULL) { helpstring = "Undocumented lisp-function."; } helpsize = strlen(helpstring) + strlen(name) + strlen("()\n"); for (nargs = 0, arg = arglist; arg && arg->car; arg = arg->cdr, ++nargs) { if (!LFROMOBJ(LSYMBOL)(arg->car, &argname)) { OOGLError(0, "Ldefun(%s): Error: " "argument name -- %s -- is not a symbol (an unquoted token).", name, LSummarize(arg->car)); return Lnil; } helpsize += strlen(argname); } helpsize += nargs; /* spaces */ help = malloc(helpsize+1+ /* safeguard */ 10); switch (nargs) { case 0: sprintf(help, "(%s)\n%s", name, helpstring); break; case 1: LFROMOBJ(LSYMBOL)(arglist->car, &argname); sprintf(help, "(%s %s)\n%s", name, argname, helpstring); break; default: helpsize = sprintf(help, "(%s", name); for (arg = arglist; arg; arg = arg->cdr) { LFROMOBJ(LSYMBOL)(arg->car, &argname); helpsize += sprintf(help + helpsize, " %s", argname); } strcpy(help + helpsize, ")\n"); helpsize += 2; strcpy(help + helpsize, helpstring); break; } /* Defining a function should not really be timing critical, so we * use the slow C-interface here: */ lambda = LEvalFunc("lambda", LLIST, arglist, LREST, body, LEND); if (lambda == Lnil) { free(help); OOGLError(0, "Ldefun(%s): Error: could not generate lambda-expression.", name); return Lnil; } functable[fidx].lambda = lambda; functable[fidx].help = help; LHelpDef(functable[fidx].name, functable[fidx].help); return LTOOBJ(LSYMBOL)(&name); } LDEFINE(setq, LLOBJECT, "(setq SYM SEXPR)\n" "Bind the symbold SYM to the value of SEXPR. SYM must be an " "unqualified symbol, i.e. not quoted, and literal:\n\n" "(setq \"foo\" bar)\n\n" "will not work. Likewise\n\n" "(setq (bar STUFF) foo)\n\n" "will also not work, even if (bar ...) would evaluate to an " "unqualified symbol: varible names must be literals. " "Note that calling `(setq SYM ...)' will alter the value of " "SYM within the current name-space: if SYM, e.g., is bound as " "local variable by a lambda, let or defun expression, then " "`(setq SYM ...)' will change the value of the local variable, " "the global binding will remain unchanged. " "It is NOT possible to un-bind a symbol. However, subsequent " "`(setq SYM ...)' invocations will re-bind SYM to another value " "and free the lisp-object previously bound to SYM.") { Lake *caller; LObject *sym, *val; LDECLARE(("setq", LBEGIN, LLAKE, &caller, LLITERAL, LLOBJECT, &sym, LLOBJECT, &val, LEND)); if (sym->type != LSYMBOL) { OOGLSyntax(caller->streamin, "Lsetq(): Reading \"%s\": " "trying to bind symbol(?) `%s': " "variable names need to be literals (unquoted atoms)", LakeName(caller), LSummarize(sym)); return Lnil; } namespace_put(lambda_namespace, LSYMBOLVAL(sym), val, true); return LRefIncr(val); } /* A (while ...) statement is very imported: although in principle a * loop can be emulated by a recursion, such thing as _wanted_ * infinite loops can only be constructed by a real loop-statemnt like * this. Actually, one would want to be able to enter Geomview's * main-loop from inside a lisp script. This, however, is not our * concern. This module does not need to pay attention to that stuff. */ LDEFINE(while, LVOID, "(while TEST BODY)\n" "Iterate: \"evaluate TEST, if non nil, evaluate BODY\".") { LObject *test, *body, *val, *cp; LDECLARE(("while", LBEGIN, LHOLD, LLOBJECT, &test, LHOLD, LLOBJECT, &body, LEND)); while ((val = LEval(cp = LCopy(test))) != Lnil) { LFree(val); LFree(cp); val = LEval(cp = LCopy(body)); LFree(val); LFree(cp); } LFree(val); LFree(cp); return Lt; } LDEFINE(if, LLOBJECT, "(if TEST EXPR1 [EXPR2])\n\ Evaluates TEST; if TEST returns a non-nil value, returns the\n\ value of EXPR1. If TEST returns nil, returns the value of\n\ EXPR2 if EXPR2 is present, otherwise returns nil.") { LObject *test, *tclause, *fclause=NULL; LDECLARE(("if", LBEGIN, LLOBJECT, &test, LHOLD, LLOBJECT, &tclause, LOPTIONAL, LHOLD, LLOBJECT, &fclause, LEND)); if (test != Lnil) { return LEval(tclause); } else if (fclause) { return LEval(fclause); } else { return Lnil; } } LDEFINE(not, LINT, "(not EXPR)\n\ Evaluates EXPR; if EXPR returns a non-nil value, returns nil,\n\ if EXPR returns nil, return t.") { LObject *expr; LDECLARE(("not", LBEGIN, LLOBJECT, &expr, LEND)); if (expr != Lnil) { return Lnil; } else { return Lt; } } LDEFINE(or, LLOBJECT, "(or EXPR1 EXPR2\n\ Evaluates EXPR1; if EXPR1 returns non-nil, return its value,\n\ if EXPR1 returns nil, evaluate EXPR2 and return its value.") { LObject *expr1, *expr2; LDECLARE(("or", LBEGIN, LLOBJECT, &expr1, LHOLD, LLOBJECT, &expr2, LEND)); if (expr1 != Lnil) { /* arguments do not survive the life-time of a function */ return LRefIncr(expr1); } else { return LEval(expr2); } } LDEFINE(and, LLOBJECT, "(and EXPR1 EXPR2\n\ Evaluate EXPR1 and EXPR2 and return t if both return non-nil,\n\ otherwise return nil.") { LObject *expr1, *expr2; LDECLARE(("and", LBEGIN, LLOBJECT, &expr1, LLOBJECT, &expr2, LEND)); return (expr1 != Lnil && expr2 != Lnil) ? Lt : Lnil; } LDEFINE(greater, LLOBJECT, "(> EXPR1 EXPR2)\n\ Returns t if EXPR1 is greater than EXPR2. EXPR1 and EXPR2 should\n\ be either both integers or floats, or both strings.") { LObject *expr1, *expr2; LDECLARE((">", LBEGIN, LLOBJECT, &expr1, LLOBJECT, &expr2, LEND)); if (LCompare(">", expr1, expr2)==1) return Lt; else return Lnil; } LDEFINE(less, LINT, "(< EXPR1 EXPR2)\n\ Returns t if EXPR1 is less than EXPR2. EXPR1 and EXPR2 should\n\ be either both integers or floats, or both strings.") { LObject *expr1, *expr2; LDECLARE(("<", LBEGIN, LLOBJECT, &expr1, LLOBJECT, &expr2, LEND)); if (LCompare("<", expr1, expr2)==-1) return Lt; else return Lnil; } LDEFINE(equal, LINT, "(= EXPR1 EXPR2)\n\ Returns t if EXPR1 is equal to EXPR2. EXPR1 and EXPR2 should\n\ be either both integers or floats, or both strings.") { LObject *expr1, *expr2; LDECLARE(("=", LBEGIN, LLOBJECT, &expr1, LLOBJECT, &expr2, LEND)); if (LCompare("=", expr1, expr2)==0) return Lt; else return Lnil; } /* Note: comparison is promoted to the weakest numerical type, with * the ordering LINT < LLONG < LFLOAT < LSTRING. * * The return value is ((expr1 > expr2) - (expr1 < expr2)) */ static int LCompare(const char *name, LObject *expr1, LObject *expr2) { char *s1, *s2; double d1, d2; long l1, l2; int i1, i2; if (LFROMOBJ(LINT)(expr1, &i1) && LFROMOBJ(LINT)(expr2, &i2)) { return (i1 > i2) - (i1 < i2); } if (LFROMOBJ(LLONG)(expr1, &l1) && LFROMOBJ(LLONG)(expr2, &l2)) { return (l1 > l2) - (l1 < l2); } if (LFROMOBJ(LDOUBLE)(expr1, &d1) && LFROMOBJ(LDOUBLE)(expr2, &d2)) { return (d1 > d2) - (d1 < d2); } if (LFROMOBJ(LSTRING)(expr1, &s1) && LFROMOBJ(LSTRING)(expr2, &s2)) { return strcmp(s1, s2); } OOGLError(0, "%s: arg1 and arg2 must at least be strings to be compared.", name); return 0; } LDEFINE(add, LLOBJECT, "(+ EXPR1 EXPR2)\n" "Adds EXPR1 to EXPR2 if both convert to a numerical value.") { LObject *expr1, *expr2; double d1, d2; long l1, l2; int i1, i2; LDECLARE(("+", LBEGIN, LLOBJECT, &expr1, LLOBJECT, &expr2, LEND)); if (LFROMOBJ(LINT)(expr1, &i1) && LFROMOBJ(LINT)(expr2, &i2)) { return LINTTOOBJ(i1 + i2); } if (LFROMOBJ(LLONG)(expr1, &l1) && LFROMOBJ(LLONG)(expr2, &l2)) { return LLONGTOOBJ(l1 + l2); } if (LFROMOBJ(LDOUBLE)(expr1, &d1) && LFROMOBJ(LDOUBLE)(expr2, &d2)) { return LDOUBLETOOBJ(d1 + d2); } OOGLError(0, "\"+\": ARG1 and ARG2 must be numerical values."); OOGLError(0, "\"+\": ARG1: %s", LSummarize(expr1)); OOGLError(0, "\"+\": ARG2: %s", LSummarize(expr2)); return Lnil; } LDEFINE(substract, LLOBJECT, "(- EXPR1 [EXPR2])\n" "Substracts EXPR1 from EXPR2 if both convert to a numerical value. " "If EXPR2 is omitted negate EXPR1 if it converts to a numerical value.") { LObject *expr1, *expr2 = NULL; double d1, d2; long l1, l2; int i1, i2; LDECLARE(("-", LBEGIN, LLOBJECT, &expr1, LOPTIONAL, LLOBJECT, &expr2, LEND)); if (expr2) { if (LFROMOBJ(LINT)(expr1, &i1) && LFROMOBJ(LINT)(expr2, &i2)) { return LINTTOOBJ(i1 - i2); } if (LFROMOBJ(LLONG)(expr1, &l1) && LFROMOBJ(LLONG)(expr2, &l2)) { return LLONGTOOBJ(l1 - l2); } if (LFROMOBJ(LDOUBLE)(expr1, &d1) && LFROMOBJ(LDOUBLE)(expr2, &d2)) { return LDOUBLETOOBJ(d1 - d2); } OOGLError(0, "\"-\": ARG1 and ARG2 must be numerical values."); OOGLError(0, "\"-\": ARG1: %s", LSummarize(expr1)); OOGLError(0, "\"-\": ARG2: %s", LSummarize(expr2)); } else { if (LFROMOBJ(LINT)(expr1, &i1)) { if (i1 == 0 || -i1 != i1) { return LINTTOOBJ(-i1); } } if (LFROMOBJ(LLONG)(expr1, &l1)) { if (l1 == 0 || -l1 != l1) { return LLONGTOOBJ(-l1); } } if (LFROMOBJ(LDOUBLE)(expr1, &d1)) { return LDOUBLETOOBJ(-d1); } OOGLError(0, "\"-\": ARG %s must be a numerical value.", LSummarize(expr1)); } return Lnil; } LDEFINE(multiply, LLOBJECT, "(* EXPR1 EXPR2)\n" "Multiplies EXPR1 with EXPR2 if both convert to a numerical value.") { LObject *expr1, *expr2; double d1, d2; long l1, l2; int i1, i2; LDECLARE(("*", LBEGIN, LLOBJECT, &expr1, LLOBJECT, &expr2, LEND)); if (LFROMOBJ(LINT)(expr1, &i1) && LFROMOBJ(LINT)(expr2, &i2)) { return LLONGTOOBJ((long)i1 * (long)i2); } if (LFROMOBJ(LLONG)(expr1, &l1) && LFROMOBJ(LLONG)(expr2, &l2)) { if ((l2 == 0 || l1 * l2 / l2 == l1) || (l1 == 0 || l2 * l1 / l1 == l2)) { return LLONGTOOBJ(l1 * l2); } } if (LFROMOBJ(LDOUBLE)(expr1, &d1) && LFROMOBJ(LDOUBLE)(expr2, &d2)) { return LDOUBLETOOBJ(d1 * d2); } OOGLError(0, "\"*\": ARG1 and ARG2 must be numerical values."); OOGLError(0, "\"*\": ARG1: %s", LSummarize(expr1)); OOGLError(0, "\"*\": ARG2: %s", LSummarize(expr2)); return Lnil; } LDEFINE(divide, LLOBJECT, "(/ EXPR1 EXPR2)\n" "Divides EXPR1 by EXPR2 if both convert to a numerical value.") { LObject *expr1, *expr2; double d1, d2; LDECLARE(("/", LBEGIN, LLOBJECT, &expr1, LLOBJECT, &expr2, LEND)); if (LFROMOBJ(LDOUBLE)(expr1, &d1) && LFROMOBJ(LDOUBLE)(expr2, &d2)) { return LDOUBLETOOBJ(d1 / d2); } OOGLError(0, "\"/\": ARG1 and ARG2 must be numerical values."); OOGLError(0, "\"/\": ARG1: %s", LSummarize(expr1)); OOGLError(0, "\"/\": ARG2: %s", LSummarize(expr2)); return Lnil; } LDEFINE(remainder, LLOBJECT, "(mod EXPR1 EXPR2)\n" "Divides EXPR1 by EXPR2 which must be integers and " "returns the remainder.") { LObject *expr1, *expr2; long l1, l2; int i1, i2; LDECLARE(("mod", LBEGIN, LLOBJECT, &expr1, LLOBJECT, &expr2, LEND)); if (LFROMOBJ(LINT)(expr1, &i1) && LFROMOBJ(LINT)(expr2, &i2)) { return LINTTOOBJ(i1 % i2); } if (LFROMOBJ(LLONG)(expr1, &l1) && LFROMOBJ(LLONG)(expr2, &l2)) { return LLONGTOOBJ(l1 % l2); } OOGLError(0, "\"mod\": ARG1 and ARG2 must be integer values."); OOGLError(0, "\"mod\": ARG1: %s", LSummarize(expr1)); OOGLError(0, "\"mod\": ARG2: %s", LSummarize(expr2)); return Lnil; } LDEFINE(truncate, LLOBJECT, "(truncate EXPR\n" "Truncates EXPR which must convert to a numerical value, that is, " "round EXPR towards zero to an integral value.") { LObject *expr1; double d1; long l1; int i1; LDECLARE(("truncate", LBEGIN, LLOBJECT, &expr1, LEND)); if (LFROMOBJ(LINT)(expr1, &i1)) { return LINTTOOBJ(i1); } if (LFROMOBJ(LLONG)(expr1, &l1)) { return LLONGTOOBJ(l1); } if (LFROMOBJ(LDOUBLE)(expr1, &d1)) { return LLONGTOOBJ((long)d1); } OOGLError(0, "\"-\": ARG %s must be a numerical value.", LSummarize(expr1)); return Lnil; } LDEFINE(sgi, LINT, "(sgi)\n\ Returns t if running on an sgi machine, nil if not") { LDECLARE(("sgi", LBEGIN, LEND)); if (strcmp(MACHTYPE,"sgi")==0) return Lt; return Lnil; } LDEFINE(NeXT, LINT, "(NeXT)\n\ Returns t if running on a NeXT, nil if not") { LDECLARE(("NeXT", LBEGIN, LEND)); if (strcmp(MACHTYPE,"next")==0) return Lt; return Lnil; } LDEFINE(progn, LLOBJECT, "(progn STATEMENT [ ... ])\n\ evaluates each STATEMENT in order and returns the value of the\n\ last one. Use progn to group a collection of commands together,\n\ forcing them to be treated as a single command.") { LObject *val=NULL; LList *arglist = NULL; LDECLARE(("progn", LBEGIN, LHOLD, LREST, &arglist, LEND)); for( ; arglist != NULL; arglist = arglist->cdr) { LFree(val); val = LEval(arglist->car); } return val; } void LListShow(LList *list) { LListWrite(stderr, list); } const char *LListSummarize(LList *list) { const char *msg; LObject *lobj; lobj = LNew(LLIST, &list); msg = LSummarize(lobj); lobj->cell.p = NULL; LFree(lobj); return msg; } /* * Lisp object implementation */ static DEF_FREELIST(LObject); LObject *LNew(LType *type, void *vcell) { LCell *cell = (LCell *)vcell; LObject *obj; FREELIST_NEW(LObject, obj); obj->type = type; obj->ref = 1; if (!cell) { memset(&obj->cell, 0, sizeof(obj->cell)); } else { memcpy(&obj->cell, cell, LSIZE(type)); } return obj; } void LWrite(FILE *fp, LObject *obj) { (*obj->type->write)(fp, &(obj->cell)); } void LWriteFile(const char *fname, LObject *obj) { FILE *fp = fopen(fname, "w"); if (fp != NULL) { LWrite(fp, obj); fclose(fp); } else { OOGLError(0, "LWriteFile: can't create file %s",fname); } } void LShow(LObject *obj) { LWrite(stderr, obj); } void _LFree(LObject *obj) { (*obj->type->free)(&(obj->cell)); FREELIST_FREE(LObject, obj); } #if 0 /* now as inline functions in lisp.h */ LObject *LCopy(LObject *obj) { if (obj == Lnil) return Lnil; if (obj == Lt) return Lt; return LTOOBJ(obj->type)(&(obj->cell)); } LObject *LRefIncr(LObject *obj) { ++(obj->ref); return obj; } void LRefDecr(LObject *obj) { --(obj->ref); } #endif /* lambda-expression argument name-space handling */ /* push a new namespace */ static inline void namespace_push(LNameSpace **ns, LNameSpace *new_ns) { if (new_ns) { new_ns->parser = fsa_initialize(NULL, (void *)REJECT); VVINIT(new_ns->table, LObject *, 8); new_ns->next = *ns; *ns = new_ns; } } /* pop the current name-space and destroy it */ static inline void namespace_pop(LNameSpace **ns) { int i; if (*ns) { for (i = 0; i < VVCOUNT((*ns)->table); i++) { LFree(VVEC((*ns)->table, LObject *)[i]); } vvfree(&(*ns)->table); fsa_delete((*ns)->parser); } *ns = (*ns)->next; } static inline LObject **_namespace_get(LNameSpace *ns, char *name) { int idx = REJECT; idx = (int)(long)fsa_parse(ns->parser, name); if (idx == REJECT) { return NULL; } return VVEC(ns->table, LObject *)+idx; } static inline LObject *namespace_get(LNameSpace *ns, char *name) { LObject **obj; if (ns == NULL) { return NULL; } do { obj = _namespace_get(ns, name); } while (obj == NULL && (ns = ns->next) != NULL); return obj ? LRefIncr(*obj) : NULL; } static inline bool namespace_put(LNameSpace *ns, char *name, LObject *value, bool overwrite) { int idx; LObject **var; if ((var = _namespace_get(ns, name)) != NULL) { if (!overwrite) { return false; } LFree(*var); } else { /* create a new entry */ idx = VVCOUNT(ns->table); var = VVAPPEND(ns->table, LObject *); fsa_install(ns->parser, name, (void *)(long)idx); } *var = LRefIncr(value); return true; } /********************** end of argument name-space ****************************/ /* Extract body, parameter names and parameter values from a lambda * expression. Return false if LAMBDA is not a lambda expression. * * args and body maybe NULL in which case only the checking is done. */ static inline bool lambdafromobj(LObject *lambda, LList **args, LList **body) { int idx; LList *llist; if (lambda == NULL || !LFROMOBJ(LLIST)(lambda, &llist)) { return false; /* lambda expressions are lists */ } if (!funcfromobj(llist->car, &idx) || functable[idx].fptr != Llambda) { return false; /* not a lambda expression */ } if (llist->cdr == NULL || llist->cdr->car == NULL || llist->cdr->car->type != LLIST) { return false; /* parameters must be stored in a list (and there * must be a parameter list, at least an empty * one) */ } if (args) { LFROMOBJ(LLIST)(llist->cdr->car, args); } /* Remaining stuff is generic, further checking is done when * assigning the parameter values. */ if (body) { *body = llist->cdr->cdr; /* body is the tail of the entire list */ } return true; } /* Bind the values given in ARGVALS to the names given in ARGS within * the name-space defined by ARGNS. LAKE and CALL are only used to * report syntax errors. */ static inline bool BindLambdaParameters(Lake *lake, LList *call, LNameSpace *argns, LList *args, LList *argvals) { LObject *lval; bool rest = false, optional = false; int ngot = 0; int nreq = 0; int nargs = 0; for (; args; args = args->cdr) { char *argname; lval = NULL; if (!LFROMOBJ(LSYMBOL)(args->car, &argname)) { char *sumcall = strdup(LListSummarize(call)); OOGLSyntax(lake->streamin, "LParseLambda: Reading \"%s\": parsing \"%s\": " "parameter name `%s' is not a symbol (unquoted atom)", LakeName(lake), sumcall, LSummarize(args->car)); free(sumcall); goto errorout; } if (strcmp("&rest", argname) == 0) { optional = rest = true; /* rest implies optional */ continue; } else if (strcmp("&optional", argname) == 0) { optional = true; continue; } ++nargs; nreq += !optional; if (rest) { lval = argvals ? LLISTTOOBJ(argvals) : Lnil; } else { lval = argvals ? LRefIncr(argvals->car) : Lnil; } if (!namespace_put(argns, argname, lval, false)) { OOGLSyntax(lake->streamin, "BindLambdaParameters: Reading \"%s\": parsing \"%s\": " "duplicate parameter name `%s'", LakeName(lake), LListSummarize(call), argname); goto errorout; } ngot += argvals != NULL; LFree(lval); if (rest) { args = args->cdr; break; } if (argvals) { argvals = argvals->cdr; } } /* Error checking */ if (rest && args) { char *sumcall = strdup(LListSummarize(call)); OOGLSyntax(lake->streamin, "BindLambdaParameters: Reading \"%s\": parsing \"%s\": " "excess argument names after `&rest' parameter: `%s'", LakeName(lake), sumcall, LListSummarize(args)); free(sumcall); goto errorout; } else if (ngot < nreq) { OOGLSyntax(lake->streamin, "BindLambdaParameters: Reading \"%s\": parsing \"%s\": " "missing parameter values", LakeName(lake), LListSummarize(call)); goto errorout; } else if (ngot > nargs) { char *sumcall = strdup(LListSummarize(call)); OOGLSyntax(lake->streamin, "BindLambdaParameters: Reading \"%s\": parsing \"%s\": " "excess parameter values: `%s'", LakeName(lake), sumcall, LListSummarize(argvals)); free(sumcall); goto errorout; } return true; errorout: LFree(lval); return false; } /* Copy the body of a lambda expression and substitute LAKE for each * lake argument. This is necessary because (setq ...) can operate on a * lambda-expression, and the lambda-expression could also stem from a * (defun ...). In both case the lake arguments stored in the original * body are out of date. */ static LList *LBody(LList *lbody, Lake *lake) { LList *body; if (!lbody) { return NULL; } body = LListNew(); if (lbody->car) { body->car = LCopy(lbody->car); if (body->car->type == LLAKE) { body->car->cell.p = lake; } } body->cdr = LBody(lbody->cdr, lake); return body; } /* Evaluate a lambda-expression or a defun; convert an anonymous * lambda-expression into a progn, convert a defun into the named * function. This function has a special calling convention during * parse-mode: it must be called like * * (\a\bEvalLambda (lambda ...) ...) * * That is, the argument list already contains the lambda expression * as first argument. */ LDEFINE(EvalLambda, LLOBJECT, "\a\b(EvalLambda (lambda ...) (args))\n" "Evaluate the given lambda-expression with the given arguments. " "Internal use only. DO NOT USE THIS FUNCTION.") { LNameSpace lambda_ns; Lake *caller; LList *argvals, *largs, *lbody; LObject *val, *lexpr, *body; if (!LPARSEMODE) { /* The first LDECLARE after LDEFINE wins, so make sure this is the definition suitable for l_EvalLambda(). */ LDECLARE(("\a\bEvalLambda", LBEGIN, LHOLD, LLOBJECT, &lexpr, LLAKE, &caller, LREST, &argvals, LEND)); } else { /* In parse mode there is no lambda expression, it is added by * LSexpr0() automatically. */ LDECLARE(("\a\bEvalLambda", LBEGIN, LLAKE, &caller, LREST, &argvals, LEND)); } /* When we reach here we are in execution mode. */ if (!lambdafromobj(lexpr, &largs, &lbody)) { return Lnil; } /* push a new name-space */ namespace_push(&lambda_namespace, &lambda_ns); if (!BindLambdaParameters(caller, args->cdr, &lambda_ns, largs, argvals)) { namespace_pop(&lambda_namespace); return Lnil; } /* We have to copy the lambda-expression because assign args will * substitute the evaluated function calls into the argument lists. */ body = LLISTTOOBJ(NULL); body->cell.p = LListNew(); LLISTVAL(body)->car = FUNCTOOBJ("progn"); LLISTVAL(body)->cdr = LBody(lbody, caller); /* copy with lake substitution */ /* We can now simply return LEval() which will evaluate body in the * context of the given name-space; we use Lprogn() for this * purpose. */ val = LEval(body); LFree(body); /* pop the saved name-space */ namespace_pop(&lambda_namespace); return val; } /* Evaluate a (defun ...). This function is what is entered into the * function-table to evaluate a named lambda expression. The hard work * is done in LEvalLambda(), we simply call that function with the * lambda expression saved in the function table. * * To allow recursion we must be careful; the actual parsing of the * substituted lambda-expression must go to the evaluation pass. For * this purpose we must remember the lake as hidden argument. */ LDEFINE(EvalDefun, LLOBJECT, "(\a\bEvalDefun EXPR)\n" "Internal function which evaluates EXPR as a defun, i.e. a named " "lambda-expression. DO NOT USE THIS FUNCTION.") { Lake *caller; LList *lambda, *argvals; LObject *val; int fidx; LDECLARE(("\a\bEvalDefun", LBEGIN, LLAKE, &caller, LREST, &argvals, LEND)); /* Forward everything to the eval-step of LEvalLambda(), then * evaluate the object returned by LEvalLambda() and return that * value to the caller. */ if (!LFROMOBJ(LFUNC)(args->car, &fidx) || functable[fidx].lambda == NULL) { /* should not happen, but ... */ return Lnil; } lambda = LListNew(); lambda->car = LRefIncr(functable[fidx].lambda); lambda->cdr = args->cdr; args->cdr = lambda; /* Invoke LEvalLambda() in evaluation mode */ val = LEvalLambda(NULL, args); args->cdr = lambda->cdr; lambda->cdr = NULL; /* avoid freeing the argument list */ LListFree(lambda); return val; } /* LSexpr() uses special parsing on lists; changes function names to function pointers, and calls the function to parse the arguments */ LObject *LSexpr(Lake *lake) { return LSexpr0(lake, LIST_FUNCTION); } /* LLiteral() uses literal parsing; lists are not interpreted as function calls */ LObject *LLiteral(Lake *lake) { return LSexpr0(lake, LIST_LITERAL); } /* LEvalSexpr() both parses and evaluates the requested expression. */ LObject *LEvalSexpr(Lake *lake) { LObject *args, *val; args = LSexpr0(lake, LIST_EVAL); val = LEval(args); LFree(args); return val; } static inline LObject *ParseArg(LType *type, Lake *lake) { if (LakeNewSexpr(lake)) { /* ok, its a S-expr, do not invoke the type specific parser, but * parse it as a sexpr. */ return LSexpr(lake); } else { /* otherwise invoke the type-specific parser */ return LPARSE(type)(lake); } } /* LSexpr0() does the work of both LSexpr() and LLiteral(); special says whether to interpret lists specially */ static inline LObject *LSexpr0(Lake *lake, int listhow) { LObject *obj, *head; int i, quote; const char *tok; if ((tok = LakeNextToken(lake, "e)) == NULL) { return Lnil; } if (quote == '\0' && *tok == '(') { obj = LNew(LLIST, NULL); if(listhow == LIST_LITERAL) { while (LakeMore(lake)) { obj->cell.p = (void*) LListAppend((LList*)(obj->cell.p), LSexpr0(lake, LIST_LITERAL)); } } else if (LakeMore(lake)) { /* if we have a non-empty list ... */ /* ... get the first element and see if it's a function name */ head = LEvalSexpr(lake); obj->cell.p = (void*) LListAppend(LLISTVAL(obj), head); if (funcfromobj(head, &i)) { /* It's a function name. Enter the function as the first element of our list, and then call the function in parse mode to construct the rest of the list (arguments to the function) */ if (head->type == LSYMBOL) { /* Builtin function or defun */ LFree(head); LLISTVAL(obj)->car = head = LNew(LFUNC, &i); } else { /* anonymous lambda expression */ LLISTVAL(obj)->cdr = LListNew(); LLISTVAL(obj)->cdr->car = LLISTVAL(obj)->car; LLISTVAL(obj)->car = head = LNew(LFUNC, &i); } if ( (*functable[i].fptr)(lake, LLISTVAL(obj)) == Lnil ) { LFree(obj); obj = Lnil; } } else { /* It's not a function name. Probably this part will only be called in error, because plain lists should always be quoted. This should probably be replaced by more robust error detection and recovery code. For now, just parse as a plain list. LEval() will emit an error message if this list is ever evaluated. */ if(listhow == LIST_EVAL) OOGLSyntax(lake->streamin, "Reading \"%s\": call to unknown function \"%s\"", LakeName(lake), LSummarize(head)); while (LakeMore(lake)) { obj->cell.p = (void*) LListAppend(LLISTVAL(obj), LSexpr0(lake, listhow)); } } } tok = LakeNextToken(lake, "e); } else { obj = LNew(quote == '\0' ? LSYMBOL : LSTRING, NULL); obj->cell.p = strdup(tok); } return obj; } LObject *LEval(LObject *obj) { LObject *ans; LList *list, *args; LInterest *interest; LFunction *fentry; /* Lists are function calls, symbols may have values bound to them, * everything else evaluates to itself. */ if (obj->type == LSYMBOL) { LObject *val; val = namespace_get(lambda_namespace, LSYMBOLVAL(obj)); if (val != NULL) { return val; } val = namespace_get(setq_namespace, LSYMBOLVAL(obj)); if (val != NULL) { return val; } } if (obj->type != LLIST) { LRefIncr(obj); return obj; } list = LLISTVAL(obj); /* the empty list evaluates to itself */ if (list == NULL || list->car == NULL) { return Lnil; } /* a nonempty list corresponds to a function call; the list's value is the value returned by the function */ if (list->car->type == LFUNC) { fentry = &functable[LFUNCVAL(list->car)]; #if 0 /* deal with any interests in the function first */ if ((interest=fentry->interested) != NULL) { args = list->cdr; while (interest) { if (FilterArgMatch(interest->filter, args)) { InterestOutput(fentry->name, args, interest); } interest = interest->next; } } #endif /* then call the function */ ans = fentry->fptr(NULL, list); /* deal with any interests in the function after calling the * function; otherwise the arguments are in an unevaluated state. */ if ((interest=fentry->interested) != NULL) { args = list->cdr; while (interest) { if (FilterArgMatch(interest->filter, args)) { InterestOutput(fentry->name, args, interest); } interest = interest->next; } } return ans; } else { OOGLError(0, "lisp error: call to unknown function %s", LSummarize(list->car)); return Lnil; } } LList *LListAppend(LList *list, LObject *obj) { LList *l, *new = LListNew(); new->car = obj; if ((l = list) != NULL) { while (l->cdr) l = l->cdr; l->cdr = new; return list; } return new; } int LListLength(LList *list) { int n=0; while (list) { ++n; list = list->cdr; } return n; } LObject *LListEntry(LList *list, int n) { if (n < 0) n = LListLength(list) + 1 + n; while (list && --n) list = list->cdr; if (list) return list->car; else return NULL; } LDEFINE(car, LLOBJECT, "(car LIST)\n" "returns the first element of LIST.") { LList *list; LDECLARE(("car", LBEGIN, LLIST, &list, LEND)); if (list && list->car) { return LRefIncr(list->car); } return Lnil; } LDEFINE(cdr, LLOBJECT, "(cdr LIST)\n" "returns the list obtained by removing the first element of LIST.") { LList *list; LDECLARE(("cdr", LBEGIN, LLIST, &list, LEND)); if (list && list->cdr) { LList *copy = LListShallowCopy(list->cdr); return LNew(LLIST, ©); } return Lnil; } LDEFINE(cons, LLOBJECT, "(cons EXPR LIST)\n" "returns the list obtained by adding EXPR as first element of LIST.") { LObject *llist; LObject *car; LList *cdr; LDECLARE(("cons", LBEGIN, LLOBJECT, &car, LLIST, &cdr, LEND)); llist = LNew(LLIST, NULL); llist->cell.p = LListNew(); LLISTVAL(llist)->car = LRefIncr(car); LLISTVAL(llist)->cdr = LListShallowCopy(cdr); return llist; } /* * function definition implementation */ bool LDefun(const char *name, LObjectFunc func, const char *help) { int index = funcindex(name); LFunction *lfunction; if (index >= 0) { lfunction = VVINDEX(funcvvec, LFunction, index); if (lfunction->lambda == NULL) { VARARRAY(builtin, char, strlen(name)+sizeof("-builtin--")); OOGLWarn("Warning: replacing existing definition of builtin function\n" " \"%s\"\n" "The old definition is still available under the new name\n" " \"-builtin-%s-\"", name, name); sprintf(builtin, "-builtin-%s-", name); LDefun(builtin, lfunction->fptr, lfunction->help); } lfunction = VVINDEX(funcvvec, LFunction, index); if (lfunction->lambda) { LFree(lfunction->lambda); } if (lfunction->help) { free(lfunction->help); } } else { index = VVCOUNT(funcvvec)++; lfunction = VVINDEX(funcvvec, LFunction, index); lfunction->name = strdup(name); } lfunction->fptr = func; lfunction->help = NULL; lfunction->lambda = NULL; lfunction->interested = NULL; fsa_install(func_fsa, lfunction->name, (void *)(long)index); if (help) { lfunction->help = strdup(help); LHelpDef(lfunction->name, lfunction->help); } return true; } /* Function is called in one of three modes: lake != NULL, args != NULL: parse mode In this mode, upon entry args is a list containing one element, the function object itself. We parse arguments from lake, appending them to the args list. We return Lt if the parsing was successful, Lnil if not. lake == NULL: evaluate mode In this mode, upon entry args is a list containing the arguments to the function. We return the function's value on the arguments. */ static int funcindex(const char *name) { return (int)(long)fsa_parse( func_fsa, name ); } /* * The LDECLARE() macro calls this function. */ LParseResult LParseArgs(const char *name, Lake *lake, LList *args, ...) { bool moreargspecs = true, literal = false; int argsgot = 0, argsrequired= -1, argspecs = 0; LType *argclass; va_list a_list; va_start(a_list, args); if (lake == NULL) { LParseResult val = AssignArgs(name, args->cdr, a_list); va_end(a_list); return val; } while (moreargspecs) { argclass=va_arg(a_list, LType *); if (argclass->size < 0) { if (argclass == LEND) { moreargspecs = false; } else if (argclass == LOPTIONAL) { argsrequired = argspecs; } else if (argclass == LHOLD) { /* "LHOLD" has no meaning during the parsing stage */ } else if (argclass == LLITERAL) { /* literal affects the way an argument is parsed (as well as implying "hold" in the assignment stage). It should only be used on LLOBJECT or LLIST. It means: "parse the argument literally". In non-literal parsing, lists are treated as function calls and the function is called to parse the arguments. In literal parsing, we don't treat lists as function calls. Just parse them as lists. */ literal = true; } else if (argclass == LARRAY) { /* special case for this because it takes 3 args: the base type, the array itself, and a count */ (void)va_arg(a_list, LType *); (void)va_arg(a_list, void *); (void)va_arg(a_list, int *); ++argspecs; if (LakeMore(lake)) { LListAppend(args, LSexpr(lake)); ++argsgot; } } else if (argclass == LVARARRAY) { /* special case for this because it takes 3 args: the base type, the array-pointer itself, and a count */ (void)va_arg(a_list, LType *); (void)va_arg(a_list, void **); (void)va_arg(a_list, int *); ++argspecs; if (LakeMore(lake)) { LListAppend(args, LSexpr(lake)); ++argsgot; } } else if(argclass == LREST) { /* * Gather up any remaining arguments into an LList. * If the caller provides a NULL pointer, discard them; * otherwise store the list there. Note that we yield an LList, * not an LLIST-typed LObject. */ LList **restp = va_arg(a_list, LList **); (void)restp; while(LakeMore(lake)) { /* Stash args for AssignArgs to grab */ LListAppend(args, literal ? LLiteral(lake) : LSexpr(lake)); } moreargspecs = false; } } else if(argclass == LLAKE) { (void)va_arg(a_list, Lake **); LListAppend(args, LTOOBJ(LLAKE)(&lake)); } else { ++argspecs; (void)va_arg(a_list, void *); if (LakeMore(lake)) { LObject *arg; if (literal) { /* literal should only be used on LLOBJECT or LLIST types, both of which use the LSexpr() parse method; in the literal case, we use LLiteral() instead. */ arg = LLiteral(lake); literal = false; } else { /* ParseArg() invokes SExpr() on S-expr and the * type-specific parser otherwise. */ arg = ParseArg(argclass, lake); } LListAppend(args, arg); ++argsgot; } } } if (argsrequired < 0) { argsrequired = argspecs; } va_end(a_list); if (argsgot < argsrequired) { OOGLSyntax(lake->streamin, "Reading from \"%s\": %s requires %d args, got %d", PoolName(POOL(lake)),name,argsrequired,argsgot); return LPARSE_BAD; } if (LakeMore(lake)) { OOGLSyntax(lake->streamin, "In \"%s\": %s: ignoring additional arguments (expected %1d)\n", PoolName((Pool *)(lake->river)), name, argsgot); while (LakeMore(lake)) { LFree(LSexpr(lake)); } } return LPARSE_GOOD; } static bool obj2array(LObject *obj, LType *type, char *x, int *n, bool hold) { int max= abs(*n); LList *list; char *tmp; *n = 0; /* interprete the nil object as an empty list */ if ((obj == Lnil) || (stringfromobj(obj, &tmp) && strcmp(tmp, "nil") == 0)) { return true; } list = LLISTVAL(obj); if (obj->type != LLIST) { return false; } if (list == NULL || list->car == NULL) { return true; } if (list->car->type == LLAKE) { list = list->cdr; } while (list && list->car && *n < max) { LObject *obj = hold ? LRefIncr(list->car) : LEval(list->car); if (!LFROMOBJ(type)(obj, (void*)(x + (*n)*LSIZE(type)))) { LFree(obj); return false; } LFree(obj); (*n)++; list = list->cdr; } if (*n == max && list) { return false; } return true; } /* variable length array */ static bool obj2vararray(LObject *obj, LType *type, char **x, int *n, bool hold) { LList *list; char *tmp; /* interprete the nil object as an empty list */ if ((obj == Lnil) || (stringfromobj(obj, &tmp) && strcmp(tmp, "nil") == 0)) { if (*x) { OOGLFree(*x); } *x = NULL; *n = 0; return true; } list = LLISTVAL(obj); if (obj->type != LLIST) { if (*x) { OOGLFree(*x); } *x = NULL; *n = 0; return false; } if (list == NULL || list->car == NULL) { if (*x) { OOGLFree(*x); } *x = NULL; return true; } if (list->car->type == LLAKE) { list = list->cdr; } *n = LListLength(list); *x = OOGLRenewNE(char, *x, (*n)*LSIZE(type), "C-lisp vararray"); *n = 0; while (list && list->car) { LObject *obj = hold ? LRefIncr(list->car) : LEval(list->car); if (!LFROMOBJ(type)(list->car, (void * )((*x) + (*n)*LSIZE(type)))) { LFree(obj); return false; } LFree(obj); (*n)++; list = list->cdr; } return true; } LObject *LMakeArray(LType *basetype, char *array, int count) { int i; LList *list = NULL; LObject *obj; for (i=0; icar && lakefromobj(args->car, &lake)) { args = args->cdr; } argtype=va_arg(a_list, LType *); if (argtype->size < 0) { if (argtype == LEND) { moreargspecs = false; } else if (argtype == LOPTIONAL) { argsrequired = argspecs; } else if (argtype == LHOLD) { hold = true; /* do not evaluate the arguments */ } else if (argtype == LLITERAL) { /* in the assignment stage, literal means the same as hold */ hold = true; } else if (argtype == LARRAY) { /* get the base type of the array */ argtype=va_arg(a_list, LType *); ++argspecs; if (args) { void *array = va_arg(a_list, void*); int *count = va_arg(a_list, int*); int origcount = abs(*count); if (hold) { arg = LRefIncr(args->car); } else { arg = LEval(args->car); } ++argsgot; convok = obj2array(arg, argtype, array, count, hold); if (!convok) { OOGLError(0, "%s: array of at most %1d %ss expected in\n" "arg position %1d (got %s)\n", name, origcount, argtype->name, argsgot, LSummarize(arg)); } args = args->cdr; } else { (void)va_arg(a_list, void *); (void)va_arg(a_list, void *); } hold = false; } else if (argtype == LVARARRAY) { /* get the base type of the array */ argtype=va_arg(a_list, LType *); ++argspecs; if (args) { void *arrayp = va_arg(a_list, void*); int *countp = va_arg(a_list, int*); if (hold) { arg = LRefIncr(args->car); } else { arg = LEval(args->car); } ++argsgot; convok = obj2vararray(arg, argtype, arrayp, countp, hold); if (!convok) { OOGLError(0, "%s: variable length array conversion failed " "after converting %1d %ss in\n" "arg position %1d (got %s)\n", name, *countp, argtype->name, argsgot, LSummarize(arg)); } args = args->cdr; } else { (void)va_arg(a_list, void *); (void)va_arg(a_list, void *); } hold = false; } else if(argtype == LREST) { LList **restp = va_arg(a_list, LList **); if(restp) { *restp = args; } if (!hold) { /* Evaluate the arguments if !hold */ while (args) { LObject *car = args->car; args->car = LEval(car); LFree(car); args = args->cdr; } } moreargspecs = false; args = NULL; /* Don't complain of excess args */ } } else if (argtype == LLAKE) { if (lake) { *va_arg(a_list, Lake **) = lake; } else { OOGLError(0, "%s: internal lake assignment out of whack.", name); return LASSIGN_BAD; } } else { ++argspecs; if (args) { if (!hold) { /* Evaluate the object and replace it in the argument list * such that the caller can free the result. The original * S-expr is free-ed here. */ arg = LEval(args->car); LFree(args->car); args->car = arg; } ++argsgot; convok = LFROMOBJ(argtype)(args->car, va_arg(a_list, void *)); if (!convok) { OOGLError(0,"%s: %s expected in arg position %1d (got %s)\n", name, LNAME(argtype), argsgot, LSummarize(args->car)); return LASSIGN_BAD; } args = args->cdr; } else { (void)va_arg(a_list, void *); } hold = false; } } if (argsrequired < 0) { argsrequired = argspecs; } if (argsgot < argsrequired) { OOGLError(0, "%s: internal argument list deficit; require %1d, got %1d", name, argsrequired, argsgot); return LASSIGN_BAD; } if (args) { OOGLError(1, "%s: internal argument list excess", name); return LASSIGN_BAD; } return LASSIGN_GOOD; } bool LArgClassValid(LType *type) { return (type->magic == LTypeMagic); } LObject *LEvalFunc(const char *name, ...) { va_list a_list; LList *list, *tail, *rest = NULL; LObject *obj, *val; int i; LType *a; LCell cell; if ((i = funcindex(name)) != REJECT) { list = LListAppend(NULL, LNew(LFUNC, &i)); } else { list = LListAppend(NULL, LNew(LSYMBOL, &name)); } tail = list; va_start(a_list, name); while ((a = va_arg(a_list, LType *)) != LEND) { if (a == LHOLD || a == LLITERAL || a == LOPTIONAL) { /* do nothing */ } else if (a == LARRAY || a == LVARARRAY) { LType *basetype=va_arg(a_list, LType *); void *array = va_arg(a_list, void *); int count = abs(va_arg(a_list, int)); tail->cdr = LListAppend(NULL, LMakeArray(basetype, array, count)); tail = tail->cdr; } else if (a == LREST) { /* This is a special case: the argument list is terminated, and * "rest" is treated as the tail of the argument list. */ LPULL(LLIST)(&a_list, &rest); tail->cdr = rest; if (va_arg(a_list, LType *) != LEND) { OOGLError(0, "LEvalFunc%(s): Error: excess arguments after LREST.", name); LListFree(list); return Lnil; } break; } else { LPULL(a)(&a_list, &cell); tail->cdr = LListAppend(NULL, LTOOBJ(a)(&cell)); tail = tail->cdr; } } /* This makes a copy of "list", slow but safe. */ obj = LNew(LLIST, &list); val = LEval(obj); tail->cdr = NULL; /* Do not delete rest! */ LFree(obj); return val; } static bool filterfromobj(LObject *obj, LFilter **x) { if (obj->type != LFILTER) return false; *x = LFILTERVAL(obj); return true; } static LObject *filter2obj(LFilter **x) { LFilter *copy = OOGLNew(LFilter); copy->flag = (*x)->flag; copy->value = (*x)->value ? LCopy((*x)->value) : NULL; return LNew( LFILTER, © ); } static void filterfree(LFilter **x) { if (*x) { if ((*x)->value) LFree((*x)->value); OOGLFree(*x); } } static void filterwrite(FILE *fp, LFilter **x) { switch ((*x)->flag) { case VAL: fprintf(fp, "filter[VAL,"); LWrite(fp, (*x)->value); fprintf(fp, "]"); break; case ANY: fprintf(fp, "filter[ANY]"); break; case NIL: fprintf(fp, "filter[NIL]"); break; default: fprintf(fp, "filter[???"); break; } } LType LFilterp = { "filter", sizeof(LFilter *), filterfromobj, filter2obj, filterfree, filterwrite, NULL, NULL, LSexpr, LTypeMagic }; LDEFINE(interest, LVOID, "(interest (COMMAND [args]))\n\ \n\ Allows you to express interest in a command. When geomview\n\ executes that command in the future it will echo it to the\n\ communication pool from which the interest command came.\n\ COMMAND can be any command. Args specify restrictions on the\n\ values of the arguments; if args are present in the interest\n\ command, geomview will only echo calls to the command in which\n\ the arguments match those given in the interest command. Two\n\ special argument values may appear in the argument list. \"*\"\n\ matches any value. \"nil\" matches any value but supresses the\n\ reporting of that value; its value is reported as \"nil\".\n\ \n\ The purpose of the interest command is to allow external\n\ modules to find out about things happening inside geomview.\n\ For example, a module interested in knowing when a geom called\n\ \"foo\" is deleted could say \"(interest (delete foo))\" and would\n\ receive the string \"(delete foo)\" when foo is deleted.\n\ \n\ Picking is a special case of this. For most modules\n\ interested in pick events the command \"(interest (pick\n\ world))\" is sufficient. This causes geomview to send a string\n\ of the form \"(pick world ...)\" every time a pick event (right\n\ mouse double click). See the \"pick\" command for details.") { Lake *calhoun; LList *call; LDECLARE(("interest", LBEGIN, LLAKE, &calhoun, LLITERAL, LLIST, &call, LEND)); return do_interest(calhoun, call, "interest"); } LDEFINE(uninterest, LVOID, "(uninterest (COMMAND [args]))\n\ Undoes the effect of an \"interest\" command. (COMMAND [args]) must\n\ be identical to those used in the \"interest\" command.") { Lake *calhoun; LList *call; LDECLARE(("uninterest", LBEGIN, LLAKE, &calhoun, LLITERAL, LLIST, &call, LEND)); return do_interest(calhoun, call, "uninterest"); } LDEFINE(time_interests, LVOID, "(time-interests deltatime initial prefix [suffix])\n\ Indicates that all interest-related messages, when separated by at\n\ least \"deltatime\" seconds of real time, should be preceded by\n\ the string ``prefix'' and followed by ``suffix''; the first message\n\ is preceded by ``initial''. All three are printf format strings,\n\ whose argument is the current clock time (in seconds) on that stream.\n\ A \"deltatime\" of zero timestamps every message. Typical usage:\n\ (time-interests .1 \"(set-clock %g)\" \"(sleep-until %g)\") or\n\ (time-interests .1 \"(set-clock %g)\"\n\ \"(sleep-until %g) (progn (set-clock %g)\" \")\") or\n\ (time-interests .1 \"(set-clock %g)\"\n\ \"(if (> 0 (sleep-until %g)) (\" \"))\".") { Lake *l; float dt; char *initial = NULL, *prefix = NULL, *suffix = NULL; LDECLARE(("time-interests", LBEGIN, LLAKE, &l, LOPTIONAL, LFLOAT, &dt, LSTRING, &initial, LSTRING, &prefix, LSTRING, &suffix, LEND)); if(l->timing_interests) { l->timing_interests = 0; if(l->initial) free((char *)l->initial); if(l->prefix) free((char *)l->prefix); if(l->suffix) free((char *)l->suffix); } if(initial) { l->timing_interests = 1; l->initial = strdup(initial); l->prefix = prefix ? strdup(prefix) : NULL; l->suffix = suffix ? strdup(suffix) : NULL; l->deltatime = dt; l->nexttime = -1e10; } return Lt; } static LObject *do_interest(Lake *lake, LList *call, char *action) { int i; LList *filter, *cargs; char *command; LInterest *new; if (!call || !call->car) { fprintf(stderr,"%s: COMMAND required.\n", action); return Lnil; } if (!symbolfromobj(call->car, &command)) { fprintf(stderr, "%s: COMMAND must be a symbol (got `%s')\n", action, LSummarize(call->car)); return Lnil; } /* any remaining args are the command's args */ cargs = call->cdr; if ( (i=funcindex(command)) < 0 ) { fprintf(stderr, "%s: no such command \"%s\"\n", action,command); return Lnil; } filter = FilterList(cargs); if (strcmp(action, "interest")==0) { new = NewInterest(); new->lake = lake; new->filter = filter; AppendInterest(&(functable[i].interested), new); } else { RemoveInterests(&(functable[i].interested), lake, 1, filter); LListFree(filter); } return Lt; } static void RemoveInterests(LInterest **interest, Lake *lake, int usefilter, LList *filter) { LInterest *rest; while (*interest) { if (InterestMatch(*interest, lake, usefilter, filter)) { rest = (*interest)->next; DeleteInterest(*interest); *interest = rest; } else { interest = &((*interest)->next); } } } void RemoveLakeInterests(Lake *lake) { int i; for (i=0; ilake != lake) return false; if (!usefilter) return true; ifilter = interest->filter; while (filter) { if (!ifilter) return false; if (!FilterMatch(LFILTERVAL(filter->car), LFILTERVAL(ifilter->car))) return false; filter = filter->cdr; ifilter = ifilter->cdr; } if (ifilter) return false; return true; } static bool FilterMatch(LFilter *f1, LFilter *f2) { if (f1 && !f2) return false; if (f2 && !f1) return false; if (!f1 && !f2) return true; if (f1->flag != f2->flag) return false; switch (f1->flag) { case ANY: case NIL: return true; case VAL: if (f1->value->type != f2->value->type) return false; return LMATCH(f1->value->type)( &(f1->value->cell), &(f2->value->cell) ); default: OOGLError(0,"invalid filter flag value. Please report this."); return false; } } static void DeleteInterest(LInterest *interest) { if (interest) { if (interest->filter) LListFree(interest->filter); OOGLFree(interest); } } static LInterest *NewInterest() { LInterest *new = OOGLNewE(LInterest, "interest"); new->filter = NULL; new->next = NULL; return new; } static void AppendInterest(LInterest **head, LInterest *new) { if (!head) { OOGLError(0,"Null head pointer in AppendInterest"); return; } while (*head) head = &((*head)->next); *head = new; } static LList *FilterList(LList *args) { LList *filterlist; LFilter *filter; if (!args) return NULL; filterlist = NULL; while (args) { if (!args->car) { OOGLError(1,"FilterList internal error"); return NULL; } if ((strcmp(LSTRINGVAL(args->car),"*")==0) || (args->car==Lt)) { filterlist = LListAppend(filterlist, LRefIncr(LFAny)); } else if ((strcmp(LSTRINGVAL(args->car),"nil")==0) || (args->car==Lnil) ) { filterlist = LListAppend(filterlist, LRefIncr(LFNil)); } else { filter = OOGLNew(LFilter); filter->flag = VAL; filter->value = LRefIncr(args->car); filterlist = LListAppend(filterlist, LNew(LFILTER, &filter)); } args = args->cdr; } return filterlist; } static bool FilterArgMatch(LList *filter, LList *args) { int filterflag; LObject *filterobj; LCell filterval, argval; while (args) { if (filter) { filterflag = LFILTERVAL(filter->car)->flag; filterobj = LFILTERVAL(filter->car)->value; filter=filter->cdr; } else filterflag = ANY; switch (filterflag) { case VAL: LFROMOBJ(args->car->type)(args->car, &argval); LFROMOBJ(args->car->type)(filterobj, &filterval); if (! LMATCH(args->car->type)(&filterval, &argval)) return false; break; case ANY: case NIL: break; } args = args->cdr; } return true; } static void InterestOutput(char *name, LList *args, LInterest *interest) { Lake *lake = interest->lake; FILE *outf = lake->streamout; LList *filter = interest->filter; const char *suffix = NULL; int filterflag; float now = 0.0; if (!outf) return; if(lake->timing_interests && (now = PoolTimeAt(POOL(lake), NULL)) > lake->nexttime) { if(lake->initial) { fprintf(outf, lake->initial, now,now,now); free((char *)lake->initial); lake->initial = NULL; } if(lake->prefix) fprintf(outf, lake->prefix, now,now,now); suffix = lake->suffix; } fprintf(outf, "(%s", name); /* first remove any hidden lake arg */ if (args && args->car && args->car->type == LLAKE) args = args->cdr; while (args) { if (filter) { filterflag = LFILTERVAL(filter->car)->flag; filter=filter->cdr; } else filterflag = ANY; switch (filterflag) { case VAL: case ANY: fputc(' ', outf); LWrite(outf, args->car); break; case NIL: fprintf(outf, " nil"); break; } args = args->cdr; } fprintf(outf, ")\n"); if(suffix) fprintf(outf, suffix, now,now,now); fflush(outf); } LDEFINE(regtable, LVOID, "(regtable) --- shows the registry table") { int i; Lake *outlake; FILE *outf; LInterest *interest; LDECLARE(("regtable", LBEGIN, LLAKE, &outlake, LEND)); outf = outlake->streamout; for (i=0; ifilter); fprintf(outf, "\n"); fflush(outf); interest = interest->next; } fprintf(outf, "\n"); } } return Lt; } static void compile(const char *str, pattern *p) { int n; char *rest, *tail; strncpy(p->p0, str, MAXPATLEN-1); p->p0[MAXPATLEN-1] = '\0'; for(rest = p->p0, n = 0; (tail = strchr(rest, '*')) && n < MAXPAT; n++) { p->pat[n] = rest; p->len[n] = tail-rest; *tail = '\0'; rest = tail+1; } p->pat[n] = rest; p->len[n] = strlen(rest); p->n = n; } /* Keep the first line unchanged and wrap the remaining lines to 80 * chars with 8 chars indent on the left. */ static void print_help_formatted(FILE *outf, const char *message) { char *nl; int printed, wordlen, nnl; /* print the first line unchanged */ if ((nl = strchr(message, '\n')) && message[0]=='(') { fprintf(outf, "%.*s", (int)(nl - message), message); } if (!nl) { return; } message = nl+1; while (*message) { fprintf(outf, "\n "); printed = 7; while (*message && printed < 72) { nnl = 0; /* keep \n\n as hard line break marker */ while (isspace(*message)) { if (*message++ == '\n') { ++nnl; } if (nnl == 2) { fprintf(outf, "\n "); printed = 7; /* use \n\n\t\t\t as indentation hint */ while (*message == '\t') { fprintf(outf, " "); printed += 8; message++; } nnl = 0; } } wordlen = 0; while (message[wordlen] && !isspace(message[wordlen])) { wordlen++; } if (printed + wordlen < 72) { printed += wordlen+1; putc(' ', outf); while (wordlen--) { putc((int)*message++, outf); } } else { break; } } } putc('\n', outf); fflush(outf); } static bool match(const char *str, pattern *p) { int i; const char *rest; if(strncmp(str, p->pat[0], p->len[0])) return false; /* Failed */ rest = str + p->len[0]; for(i = 1; i <= p->n; i++) { if(p->len[i]) { if((rest = strstr(rest, p->pat[i])) == NULL) break; rest += p->len[i]; } } return i > p->n && rest && (p->len[p->n] == 0 || *rest == '\0') ? 1 : 0; } void LHelpDef(const char *key, const char *message) { Help **h = &helps; Help *new; int cmp = -1; /* insertion sort... */ while (*h && (*h)->key && (cmp = strcmp(key,(*h)->key)) > 0) { h = &((*h)->next); } if (cmp == 0) { /* replace an existing message */ new = *h; } else { new = OOGLNew(Help); new->key = key; new->next = *h; *h = new; } new->message = message; } LDEFINE(help, LVOID, "(help [COMMAND])\n" "\"COMMAND\" may include \"*\"s as wildcards; see also \"??\". " "One-line command help; lists names only if multiple commands match.") { char *pat = "*"; char *nl; pattern p; int seen = 0; Help *h, *last = NULL; Lake *brownie; FILE *outf; LDECLARE(("help", LBEGIN, LLAKE, &brownie, LOPTIONAL, LSTRING, &pat, LEND)); if((outf = brownie->streamout) == NULL) outf = stdout; compile(pat, &p); for(h=helps; h!=NULL; h=h->next) { if(match(h->key, &p)) { if(++seen >= 2) { if(seen == 2) fprintf(outf,"%-15s ", last->key); fprintf(outf, seen%4 ? "%-15s " : "%s\n", h->key); } last = h; } } switch(seen) { default: if(seen%4) fprintf(outf, "\n"); break; case 0: fprintf(outf, nomatch, pat); break; case 1: nl = strchr(last->message, '\n'); fprintf(outf, "%.*s\n", (int)(nl && last->message[0]=='(' ? nl - last->message : 9999), last->message); break; } fflush(outf); return Lt; } LDEFINE(morehelp, LVOID, "(morehelp COMMAND)\n" "\"COMMAND\" may include \"*\" wildcards\n" "Prints more info than \"(help COMMAND)\".") { char *pat; pattern p; int seen = 0; Help *h; Lake *cedar; FILE *outf; LDECLARE(("morehelp", LBEGIN, LLAKE, &cedar, LSTRING, &pat, LEND)); if((outf = cedar->streamout) == NULL) outf = stdout; compile(pat, &p); for(h=helps; h!=NULL; h=h->next) { if(match(h->key, &p)) { #if 0 fprintf(outf, "%s\n", h->message); #else print_help_formatted(outf, h->message); #endif seen++; } } if(seen==0) fprintf(outf, nomatch, pat); fflush(outf); return Lt; } LInterest *LInterestList(const char *funcname) { int index = funcindex(funcname); if (index == REJECT) return NULL; return functable[index].interested; } const char *LakeName(Lake *lake) { return lake ? PoolName(lake->river) : NULL; } const char *LSummarize(LObject *obj) { int len; static FILE *f; static char *summary; if(f == NULL) { f = tmpfile(); if(f == NULL) { return strdup("???"); } } rewind(f); LWrite(f, obj); fflush(f); len = ftell(f); rewind(f); if(len >= 80) len = 79; if(summary) { free(summary); } summary = malloc(len+1); summary[len] = '\0'; if (fread(summary, len, 1, f) != 1) { free(summary); return strdup("???"); } if(len >= 79) { strcpy(summary+75, " ..."); } return summary; } /************************************************************************/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/oogl/lisp/clisp.h0000644000175000017500000000244012310110201014775 00000000000000LObject * l_quote(LObject * a1); LObject * l_eval(LObject * a1); LObject * l_lambda(LList * a1, LList * a2); LObject * l_let(LList * a1); LObject * l_defun(char * a1, LList * a2, LList * a3); LObject * l_setq(LObject * a1, LObject * a2); void l_while(LObject * a1, LObject * a2); LObject * l_if(LObject * a1, LObject * a2, LObject * a3); int l_not(LObject * a1); LObject * l_or(LObject * a1, LObject * a2); LObject * l_and(LObject * a1, LObject * a2); LObject * l_greater(LObject * a1, LObject * a2); int l_less(LObject * a1, LObject * a2); int l_equal(LObject * a1, LObject * a2); LObject * l_add(LObject * a1, LObject * a2); LObject * l_substract(LObject * a1, LObject * a2); LObject * l_multiply(LObject * a1, LObject * a2); LObject * l_divide(LObject * a1, LObject * a2); LObject * l_remainder(LObject * a1, LObject * a2); LObject * l_truncate(LObject * a1); int l_sgi(); int l_NeXT(); LObject * l_progn(LList * a1); LObject * l_EvalLambda(LObject * a1, LList * a2); LObject * l_EvalDefun(LList * a1); LObject * l_car(LList * a1); LObject * l_cdr(LList * a1); LObject * l_cons(LObject * a1, LList * a2); void l_interest(LList * a1); void l_uninterest(LList * a1); void l_time_interests(float a1, char * a2, char * a3, char * a4); void l_regtable(); void l_help(char * a1); void l_morehelp(char * a1); geomview-1.9.5/src/lib/oogl/lisp/lisp2.h0000644000175000017500000001654512310110201014727 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef LISP_H #define LISP_H #include #include "ooglutil.h" #include "fsa.h" #include "streampool.h" typedef struct LType LType; typedef struct LObject LObject; typedef union { int i; float f; void *p; } LCell; struct LType { /* name of type */ char *name; /* size of corresponding C type */ int size; /* extract cell value from obj */ int (*fromobj)(/* LObject *obj, void *x */); /* create a new LObject of this type */ LObject *(*toobj)(/* void *x */); /* free a cell of this type */ void (*free)(/* void *x */); /* write a cell value to a stream */ void (*write)(/* FILE *fp, void *x */); /* test equality of two cells of this type */ int (*match)(/* void *a, void *b */); /* pull a cell value from a va_list */ void (*pull)(/* va_list *a_list, void *x */); /* parse an object of this type */ LObject *(*parse)(/* Lake *lake */); /* magic number; always set to LTypeMagic */ int magic; }; #define LTypeMagic 314159 #define LNAME(type) (type->name) #define LSIZE(type) (type->size) #define LFROMOBJ(type) (*(type->fromobj)) #define LTOOBJ(type) (*(type->toobj)) #define LFREE(type) (*(type->free)) #define LMATCH(type) (*(type->match)) #define LWRITE(type) (*(type->write)) #define LPULL(type) (*(type->pull)) #define LPARSE(type) (*(type->parse)) struct LObject { LType *type; int ref; LCell cell; }; typedef struct { FILE *streamin; FILE *streamout; Pool *river; int timing_interests; /* Are we time-stamping interest reports? */ float deltatime; /* delta time between timestamps */ float nexttime; /* Pool time when next timestamp'll be needed */ char *initial, *prefix, *suffix; /* printf format strings */ } Lake; #define LakeMore(lake,c) ((c=fnextc(lake->streamin,0)) != ')' && c != EOF) #define POOL(lake) ((lake)->river) typedef struct LList { LObject * car; struct LList *cdr; } LList; typedef LObject *(*LObjectFunc)(); typedef struct LInterest { Lake *lake; LList *filter; struct LInterest *next; } LInterest; typedef struct { enum { ANY, /* match anything */ VAL, /* match only our value */ NIL /* match anything but report nil */ } flag; LObject *value; } LFilter; #define LFILTERVAL(lobject) ((LFilter *)(lobject->cell.p)) extern LType LFilterp; #define LFILTER (&LFilterp) /* * Built-in objects: Lnil and Lt: */ extern LObject *Lnil, *Lt; /* * Built-in object types: string, list, and function. Function type * is only used internally. See lisp.c for the code that initializes * these type pointers. */ extern LType LStringp; #define LSTRING (&LStringp) #define LSTRINGVAL(obj) ((char*)((obj)->cell.p)) extern LType LIntp; #define LINT (&LIntp) #define LINTVAL(obj) ((obj)->cell.i) extern LType LFloatp; #define LFLOAT (&LFloatp) #define LFLOATVAL(obj) ((obj)->cell.f) extern LType LListp; #define LLIST (&LListp) #define LLISTVAL(obj) ((LList*)((obj)->cell.p)) #define LLAKEVAL(obj) ((Lake*)(obj->cell.p)) extern LType LLakep; #define LLAKE (&LLakep) extern LType LObjectp; #define LLOBJECT (&LObjectp) /* * Function definition stuff: */ #define LASSIGN_GOOD 1 #define LASSIGN_BAD 2 #define LPARSE_GOOD 3 #define LPARSE_BAD 4 #define LDECLARE(stuff) \ switch (LParseArgs stuff) { \ case LASSIGN_BAD: case LPARSE_BAD: return Lnil; \ case LPARSE_GOOD: return Lt; \ default: case LASSIGN_GOOD: break; \ } extern LType Larray; #define LARRAY (&Larray) extern LType Lend; #define LEND (&Lend) extern LType Lhold; #define LHOLD (&Lhold) extern LType Lliteral; #define LLITERAL (&Lliteral) extern LType Loptional; #define LOPTIONAL (&Loptional) extern LType Lrest; #define LREST (&Lrest) /* * Function prototypes: */ void RemoveLakeInterests(Lake *lake); void LInit(); Lake * LakeDefine(FILE *streamin, FILE *streamout, void *river); void LakeFree(Lake *lake); LObject * _LNew(LType *type, LCell *cell); #define LNew(type,cell) _LNew(type,(LCell*)cell) LObject * LRefIncr(LObject *obj); void LRefDecr(LObject *obj); void LWrite(FILE *fp, LObject *obj); void LFree(LObject *obj); LObject * LCopy(LObject *obj); LObject * LSexpr(Lake *lake); LObject * LEvalSexpr(Lake *lake); LObject * LEval(LObject *obj); LList * LListNew(); LList * LListAppend(LList *list, LObject *obj); void LListFree(LList *list); LList * LListCopy(LList *list); LObject * LListEntry(LList *list, int n); int LListLength(LList *list); int LParseArgs(char *name, Lake *lake, LList *args, ...); int LDefun(char *name, LObjectFunc func, char *help); void LListWrite(FILE *fp, LList *list); LInterest * LInterestList(char *funcname); LObject * LEvalFunc(char *name, ...); int LArgClassValid(LType *type); void LHelpDef(char *key, char *message); void LHelpRedef(char *key, char *newmessage); char * LakeName(Lake *lake); char * LSummarize(LObject *obj); LObject * LMakeArray(LType *basetype, char *data, int count); void LShow(LObject *obj); /* for debugging; writes obj to stderr */ void LListShow(LList *list); void LWriteFile(char *fname, LObject *obj); #include "clisp.h" /* LDEFINE(name, ltype, doc) is the header used to declare a lisp function. It should be followed by the body of a function (beginning with '{' and ending with '}'). LDEFINE delcares the function's name to be "Lname" (the "name" argument with "L" prepended to it). It also defines a string named "Hname" initialized to "doc". The "ltype" argument gives the lisp object type returned by the function (all functions defined via LDEFINE *must* return a lisp object.) LDEFINE actually ignores this but read the next paragraph. LDEFINE is intended for use in conjunction with the "lisp2c" shell script which searches for calls to LDEFINE and builds a C language interface to the functions so defined. This script makes use of all 3 arguments to LDEFINE, plus the use of the LDECLARE macro in the function body that follows, to build the files clang.c and clang.h. It makes certain assumptions about the way LDEFINE and LDECLARE are used. See the comments at the top of lisp2c for details. (I don't want to write the assumptions down here because if they change I'll forget to update this comment!). */ #if defined(__STDC__) || defined(__ANSI_CPP__) #define LDEFINE( name, ltype, doc ) \ char H##name[] = doc ; LObject *L##name(Lake *lake, LList *args) #else #define LDEFINE( name, ltype, doc ) \ char H/**/name[] = doc ; LObject *L/**/name(Lake *lake, LList *args) #endif #define LBEGIN lake, args #endif /* ! LISP_H */ geomview-1.9.5/src/lib/oogl/lisp/lisp.h0000644000175000017500000002453312310110201014641 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef LISP_H #define LISP_H #include #include "ooglutil.h" #include "fsa.h" #include "streampool.h" typedef struct LType LType; typedef struct LObject LObject; typedef union { void *p; int i; unsigned long l; float f; double d; } LCell; struct LType { /* name of type */ const char *name; /* size of corresponding C type */ int size; /* extract cell value from obj */ bool (*fromobj)(/* LObject *obj, void *x */); /* create a new LObject of this type */ LObject *(*toobj)(/* void *x */); /* free a cell of this type */ void (*free)(/* void *x */); /* write a cell value to a stream */ void (*write)(/* FILE *fp, void *x */); /* test equality of two cells of this type */ bool (*match)(/* void *a, void *b */); /* pull a cell value from a va_list */ void (*pull)(/* va_list *a_list, void *x */); /* parse an object of this type */ LObject *(*parse)(/* Lake *lake */); /* magic number; always set to LTypeMagic */ int magic; }; #define LTypeMagic 314159 #define LNAME(type) (type->name) #define LSIZE(type) (type->size) #define LFROMOBJ(type) (*(type->fromobj)) #define LTOOBJ(type) (*(type->toobj)) #define LFREE(type) (*(type->free)) #define LMATCH(type) (*(type->match)) #define LWRITE(type) (*(type->write)) #define LPULL(type) (*(type->pull)) #define LPARSE(type) (*(type->parse)) struct LObject { LType *type; int ref; LCell cell; }; typedef struct Lake { IOBFILE *streamin; FILE *streamout; Pool *river; int timing_interests; /* Are we time-stamping interest reports? */ float deltatime; /* delta time between timestamps */ float nexttime; /* Pool time when next timestamp'll be needed */ const char *initial, *prefix, *suffix; /* printf format strings */ } Lake; #define POOL(lake) ((lake)->river) /* Return true if the next character starts a new S-expr, i.e. if the * next character is an opening parenthesis. */ static inline bool LakeNewSexpr(Lake *lake) { return (iobfnextc(lake->streamin, 0) == '('); } /* Return true if the next token is NOT a closing parenthesis. */ static inline bool LakeMore(Lake *lake) { int c; return (c = iobfnextc(lake->streamin,0)) != ')' && c != EOF; } /* Return the next token from LAKE or NULL. If the token was quoted * then store the quote character in *QUOTE. */ static inline const char *LakeNextToken(Lake *lake, int *quote) { return iobfquotedelimtok("()", lake->streamin, 0, quote); } /************************ end of lake stuff ***********************************/ typedef struct LList { LObject * car; struct LList *cdr; } LList; typedef LObject *(*LObjectFunc)(); typedef struct LInterest { Lake *lake; LList *filter; struct LInterest *next; } LInterest; typedef struct { enum { ANY, /* match anything */ VAL, /* match only our value */ NIL /* match anything but report nil */ } flag; LObject *value; } LFilter; #define LFILTERVAL(lobject) ((LFilter *)(lobject->cell.p)) extern LType LFilterp; #define LFILTER (&LFilterp) /* * Built-in objects: Lnil and Lt: */ extern LObject *Lnil, *Lt; /* * Built-in object types: string, list, and function. Function type * is only used internally. See lisp.c for the code that initializes * these type pointers. */ /* A symbol is just a string which can be bound to a value in a lambda * expression. Symbols can be parsed into strings. */ extern LType LSymbolp; #define LSYMBOL (&LSymbolp) #define LSYMBOLVAL(obj) ((char*)((obj)->cell.p)) /* A string is just a symbol which cannot be bound to a value in a * lambda expression. Strings can be parsed into symbols, however. */ extern LType LStringp; #define LSTRING (&LStringp) #define LSTRINGVAL(obj) ((char*)((obj)->cell.p)) extern LType LIntp; #define LINT (&LIntp) #define LINTVAL(obj) ((obj)->cell.i) extern LType LLongp; #define LLONG (&LLongp) #define LLONGVAL(obj) ((obj)->cell.l) extern LType LFloatp; #define LFLOAT (&LFloatp) #define LFLOATVAL(obj) ((obj)->cell.f) extern LType LDoublep; #define LDOUBLE (&LDoublep) #define LDOUBLEVAL(obj) ((obj)->cell.d) extern LType LListp; #define LLIST (&LListp) #define LLISTVAL(obj) ((LList*)((obj)->cell.p)) #define LLAKEVAL(obj) ((Lake*)(obj->cell.p)) extern LType LLakep; #define LLAKE (&LLakep) extern LType LObjectp; #define LLOBJECT (&LObjectp) /* Convenience functions for generating objects */ static inline LObject *LLISTTOOBJ(LList *list) { return LTOOBJ(LLIST)(&list); } static inline LObject *LSYMBOLTOOBJ(const char *string) { return LTOOBJ(LSYMBOL)(&string); } static inline LObject *LSTRINGTOOBJ(const char *string) { return LTOOBJ(LSTRING)(&string); } static inline LObject *LINTTOOBJ(int value) { return LTOOBJ(LINT)(&value); } static inline LObject *LLONGTOOBJ(long value) { return LTOOBJ(LLONG)(&value); } static inline LObject *LFLOATTOOBJ(float value) { return LTOOBJ(LFLOAT)(&value); } static inline LObject *LDOUBLETOOBJ(double value) { return LTOOBJ(LDOUBLE)(&value); } static inline bool LSTRINGFROMOBJ(LObject *obj, char **str) { if (obj->type == LSTRING || obj->type == LSYMBOL) { *str = LSTRINGVAL(obj); return true; } return false; } /* * Function definition stuff: */ enum lparseresult { LASSIGN_GOOD, LASSIGN_BAD, LPARSE_GOOD, LPARSE_BAD }; typedef enum lparseresult LParseResult; #define LPARSEMODE (lake != NULL) #define LEVALMODE (!LPARSEMODE) #define LDECLARE(stuff) \ switch (LParseArgs stuff) { \ case LASSIGN_BAD: case LPARSE_BAD: return Lnil; \ case LPARSE_GOOD: return Lt; \ default: case LASSIGN_GOOD: break; \ } extern LType Larray; #define LARRAY (&Larray) extern LType Lvararray; #define LVARARRAY (&Lvararray) extern LType Lend; #define LEND (&Lend) extern LType Lhold; #define LHOLD (&Lhold) extern LType Lliteral; #define LLITERAL (&Lliteral) extern LType Loptional; #define LOPTIONAL (&Loptional) extern LType Lrest; #define LREST (&Lrest) /* * Function prototypes: */ void RemoveLakeInterests(Lake *lake); void LInit(); Lake * LakeDefine(IOBFILE *streamin, FILE *streamout, void *river); void LakeFree(Lake *lake); LObject * LNew(LType *type, void *cell); /* LObject * LRefIncr(LObject *obj); */ /* void LRefDecr(LObject *obj); */ void LWrite(FILE *fp, LObject *obj); /* void LFree(LObject *obj); */ /* LObject *LCopy(LObject *obj); */ LObject * LSexpr(Lake *lake); LObject * LLiteral(Lake *lake); LObject * LEvalSexpr(Lake *lake); LObject * LEval(LObject *obj); LList * LListNew(); LList * LListAppend(LList *list, LObject *obj); void LListFree(LList *list); LList * LListCopy(LList *list); LObject * LListEntry(LList *list, int n); int LListLength(LList *list); LParseResult LParseArgs(const char *name, Lake *lake, LList *args, ...); bool LDefun(const char *name, LObjectFunc func, const char *help); void LListWrite(FILE *fp, LList *list); LInterest * LInterestList(const char *funcname); LObject * LEvalFunc(const char *name, ...); bool LArgClassValid(LType *type); void LHelpDef(const char *key, const char *message); const char * LakeName(Lake *lake); const char * LSummarize(LObject *obj); const char * LListSummarize(LList *list); LObject * LMakeArray(LType *basetype, char *data, int count); static inline LObject *LRefIncr(LObject *obj) { ++(obj->ref); return obj; } static inline int LRefDecr(LObject *obj) { return --(obj->ref); } static inline void LFree(LObject *obj) { extern void _LFree(LObject *); if (obj == NULL || obj == Lnil || obj == Lt) return; if (LRefDecr(obj) == 0) { _LFree(obj); } } static inline LObject *LCopy(LObject *obj) { if (obj == Lnil) return Lnil; if (obj == Lt) return Lt; return LTOOBJ(obj->type)(&(obj->cell)); } void LShow(LObject *obj); /* for debugging; writes obj to stderr */ void LListShow(LList *list); void LWriteFile(const char *fname, LObject *obj); #include "clisp.h" /* LDEFINE(name, ltype, doc) is the header used to declare a lisp function. It should be followed by the body of a function (beginning with '{' and ending with '}'). LDEFINE delcares the function's name to be "Lname" (the "name" argument with "L" prepended to it). It also defines a string named "Hname" initialized to "doc". The "ltype" argument gives the lisp object type returned by the function (all functions defined via DEFILE *must* return a lisp object.) LDEFINE actually ignores this but read the next paragraph. LDEFINE is intended for use in conjunction with the "lisp2c" shell script which searches for calls to LDEFINE and builds a C language interface to the functions so defined. This script makes use of all 3 arguments to LDEFINE, plus the use of the LDECLARE macro in the function body that follows, to build the files clang.c and clang.h. It makes certain assumptions about the way LDEFINE and LDECLARE are used. See the comments at the top of lisp2c for details. (I don't want to write the assumptions down here because if they change I'll forget to update this comment!). */ #if defined(__STDC__) || defined(__ANSI_CPP__) #define LDEFINE( name, ltype, doc ) \ char H##name[] = doc ; LObject *L##name(Lake *lake, LList *args) #else #define LDEFINE( name, ltype, doc ) \ char H/**/name[] = doc ; LObject *L/**/name(Lake *lake, LList *args) #endif #define LBEGIN lake, args #endif /* ! LISP_H */ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/oogl/lisp/Headers0000644000175000017500000000001712310110201015006 00000000000000clisp.h lisp.h geomview-1.9.5/src/lib/oogl/lisp/lisp2c0000754000175000017500000002013612310110201014635 00000000000000#! /bin/sh ######################################################################## # usage: lisp2c [-cprefix prefix] -o OUTFILE [ FILE1 ... ] # # writes OUTFILE.c and OUTFILE.h, if results would differ from # existing files of those names. # # If -cprefix is specified, uses "prefix_" as the prefix for C # function names. Default prefix is "l_". # # This script scans the input files, or standard input if no input # files are specified, generating a C interface to each lisp function # defined via the "DEFINE" and "LDECLARE" macros (defined in # geomview's "lispext.h" file). It assumes usage of the following # form in the input files: # # DEFINE(name, ltype, # docstring) # { # # LDECLARE(("lname", LBEGIN, # , # ..., # LEND)); # ... # return L...; # } # # Specifically: # # # 1. The first line of the call to DEFINE must contain exactly, in # this order: # 1.1. the word DEFINE # 1.2. a left paren # 1.3. a name which is a valid C identifier. There must be no # spaces between the left paren and the name. This name with # an "L" prepended becomes the name of the low-level C # procedure (the one whose body follows the DEFINE call), # and with a "l_" prepended becomes the name of the C # interface to the corresponding lisp function (unless an # alternate prefix is specified with the -cprefix argument # to this script). # 1.4 a comma (possibly preceeded and/or followed by spaces or # tabs) # 1.5 a lisp type name (like LINT or LGEOM etc) which indicates # the type of the lisp object returned by this function. # 1.6 a comma (possibly preceeded and/or followed by spaces or # tabs) # # 2. The rest of the DEFINE call consists of the docstring argument, # which must be a single string and may be broken over any number # of lines. # # # 3. The first line of the call to LDECLARE must contain, in this order: # 1.1. the word LDECLARE # 1.2. two left parens # 1.3. a string which becomes the lisp name of the function # 1.4 a comma (possibly preceeded and/or followed by spaces or # tabs) # 1.5 the word LBEGIN # 1.6 a comma (possibly preceeded and/or followed by spaces or # tabs) # # 4. Intermediate lines of the LDECLARE call must contain one # per line; where is either the word LOPTIONAL # or something with the syntax # # [ modifier, ] ltype, address # # where modifier is one of LHOLD or LLITERAL, ltype is a lisp type # name, and address is the address of a local variable into which # the corresponding argument's value is to be loaded. Any # arguments following LOPTIONAL are taken to be optional. # # 5. The last line of the LDECLARE call must contain just the string # "LEND));" possibly preceeded by spaces or tabs. # # This script generates the C interface (consisting of the function # declaration in OUTFILE.h and the function itself in OUTFILE.c) only # for functions which use both the DEFINE and LDECLARE macros. To # prevent the generation of a C interface for a particular function, # preceed the word LDECLARE by a comment on the same line, as in: # # # /*NOC*/ LDECLARE(("foo, LBEGIN, # # The contents of the comment are irrelvant; its purpose is simply # to arrange that LDECLARE is not the first thing on its line. cprefix="l_" ; outfile="" while : ; do case $1 in -cprefix) cprefix=$2 ; shift 2 ; ;; -o) outfile=$2 ; outstem=`basename $outfile` shift 2 ; ;; *) break ; ;; esac done cfile=/tmp/lisp2c.out.c hfile=/tmp/lisp2c.out.h /bin/rm -f $cfile $hfile # start with an empty .h file in case the awk script below doesn't # output anything to it: touch $hfile cat $* | # first turn all parens, semicolons, and commas into spaces tr '();,' ' ' | # now let awk do its thing awk ' BEGIN { cprefix="'$cprefix'" ; outfile="'$outfile'" ; outstem="'$outstem'" ; hfile="'$hfile'" ; fcount = 0 ; inldeclare=0 ; type["LINT"] = "int" ; type["LLONG"] = "long" ; type["LFLOAT"] = "float" ; type["LDOUBLE"] = "double" ; type["LSYMBOL"] = "char *" ; type["LSTRING"] = "char *" ; type["LLIST"] = "LList *" ; type["LLOBJECT"] = "LObject *" ; type["LID"] = "int" ; type["LKEYWORD"] = "int" ; type["LSTRINGS"] = "char *" ; type["LGEOM"] = "GeomStruct *" ; type["LCAMERA"] = "CameraStruct *" ; type["LWINDOW"] = "WindowStruct *" ; type["LAP"] = "ApStruct *" ; type["LIMAGE"] = "ImgStruct *" ; type["LTRANSFORM"] = "TransformStruct *" ; type["LTRANSFORMN"] = "TmNStruct *" ; type["LVOID"] = "void" ; type["LREST"] = "LList *" ; } $1 == "LDEFINE" { haveldefine = 1; # allow only one LDECLARE per LDEFINE fstem = $2 ; # stem from which function names are built ftype = $3 ; # functions return type next ; } $1 == "LDECLARE" { name = substr($2,2,length($2)-2) ; # lisp function name inldeclare=haveldefine ; lakearg = 0; argc = 0 ; next } $NF == "LEND" || atend == 1 { if (haveldefine && inldeclare) { # remember data for this function ++fcount; cname = cprefix fstem ; fstems[fcount] = fstem ; cnames[fcount] = cname ; names[fcount] = name ; # build the declaration dec = sprintf("%s %s(", type[ftype], cname); for (i=1; i<=argc; ++i) { if (i>1) dec = dec sprintf(", "); if (arg[i] == "LARRAY") { dec = dec sprintf("%s *a%1d, int a%1dn", type[basetype[i]], i, i); } else if (arg[i] == "LVARARRAY") { dec = dec sprintf("%s *a%1d, int a%1dn", type[basetype[i]], i, i); } else { if (type[arg[i]] != "") dec = dec sprintf("%s ", type[arg[i]]); else dec = dec sprintf("??? "); dec = dec sprintf("a%1d", i); } } dec = dec sprintf(")"); # print the declaration, possibly also in header file printf "%s\n", dec ; if (outfile != "") printf "%s;\n", dec > hfile ; # print the function body printf "{\n" ; printf " LObject *val = LEvalFunc(\"%s\",\n", name ; for (i=1; i<=argc; ++i) { if (arg[i] == "LARRAY") { printf "\t\t\t LARRAY, %s, a%1d, a%1dn,\n", basetype[i], i, i ; } else if (arg[i] == "LVARARRAY") { printf "\t\t\t LVARARRAY, %s, a%1d, a%1dn,\n", basetype[i], i, i ; } else { printf "\t\t\t %s, a%1d,\n", arg[i], i ; } } printf "\t\t\t LEND);\n" if (type[ftype] != "void") { printf " %s retval;\n", type[ftype] ; printf " LFROMOBJ(%s)(val, &retval);\n", ftype ; } printf " LFree(val);\n" if (type[ftype] != "void") printf " return retval;\n" printf "}\n\n" haveldefine = 0; inldeclare = 0; atend = 0; next } } { if (inldeclare) { i = 1; while (i <= NF) { if ($i == "LLAKE") { lakearg = 1; next; } else if ($i == "LOPTIONAL") { ++i; continue; } else if ($i == "LHOLD") { ++i; continue; } else if ($i == "LLITERAL") { ++i; continue; } else if ($i == "LARRAY" || $i == "LVARARRAY") { ++argc ; arg[argc] = $i; ++i; basetype[argc] = $i; next; } else if ($i == "LREST") { ++argc; arg[argc] = $i ; atend = 1; next ; } else { ++argc ; arg[argc] = $i ; next ; } } } } END { printf "\n" ; for (i=1; i<=fcount; ++i) { printf "extern LObject *L%s(Lake *, LList *);\n", fstems[i] ; } printf "\n" ; for (i=1; i<=fcount; ++i) { printf "extern char H%s[];\n", fstems[i] ; } printf "\n" ; printf "\nvoid %s_init()\n{\n", outstem ; for (i=1; i<=fcount; ++i) { printf " LDefun(\"%s\", L%s, H%s);\n", names[i], fstems[i], fstems[i] ; } printf "}\n\n" ; } ' | # and send output to "outfile.c" if -o specified, otherwise # to standard output if [ "$outfile" != "" ] ; then cat > $cfile ; if [ -f $cfile ] && cmp $cfile $outfile.c 1>&- 2>&- ; then : # no change to $outfile.c else /bin/rm -f $outfile.c ; /bin/mv $cfile $outfile.c echo $outfile.c fi if [ -f $hfile ] && cmp $hfile $outfile.h 1>&- 2>&- ; then : # no change to $outfile.h else /bin/rm -f $outfile.h ; /bin/mv $hfile $outfile.h echo $outfile.h fi else cat ; fi /bin/rm -f $cfile $hfile geomview-1.9.5/src/lib/oogl/lisp/clisp.c0000644000175000017500000002335112310110201014774 00000000000000LObject * l_quote(LObject * a1) { LObject *val = LEvalFunc("quote", LLOBJECT, a1, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_eval(LObject * a1) { LObject *val = LEvalFunc("eval", LLOBJECT, a1, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_lambda(LList * a1, LList * a2) { LObject *val = LEvalFunc("lambda", LLIST, a1, LREST, a2, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_let(LList * a1) { LObject *val = LEvalFunc("let", LREST, a1, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_defun(char * a1, LList * a2, LList * a3) { LObject *val = LEvalFunc("defun", LSYMBOL, a1, LLIST, a2, LREST, a3, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_setq(LObject * a1, LObject * a2) { LObject *val = LEvalFunc("setq", LLOBJECT, a1, LLOBJECT, a2, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } void l_while(LObject * a1, LObject * a2) { LObject *val = LEvalFunc("while", LLOBJECT, a1, LLOBJECT, a2, LEND); LFree(val); } LObject * l_if(LObject * a1, LObject * a2, LObject * a3) { LObject *val = LEvalFunc("if", LLOBJECT, a1, LLOBJECT, a2, LLOBJECT, a3, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } int l_not(LObject * a1) { LObject *val = LEvalFunc("not", LLOBJECT, a1, LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } LObject * l_or(LObject * a1, LObject * a2) { LObject *val = LEvalFunc("or", LLOBJECT, a1, LLOBJECT, a2, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_and(LObject * a1, LObject * a2) { LObject *val = LEvalFunc("and", LLOBJECT, a1, LLOBJECT, a2, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_greater(LObject * a1, LObject * a2) { LObject *val = LEvalFunc(">", LLOBJECT, a1, LLOBJECT, a2, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } int l_less(LObject * a1, LObject * a2) { LObject *val = LEvalFunc("<", LLOBJECT, a1, LLOBJECT, a2, LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } int l_equal(LObject * a1, LObject * a2) { LObject *val = LEvalFunc("=", LLOBJECT, a1, LLOBJECT, a2, LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } LObject * l_add(LObject * a1, LObject * a2) { LObject *val = LEvalFunc("+", LLOBJECT, a1, LLOBJECT, a2, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_substract(LObject * a1, LObject * a2) { LObject *val = LEvalFunc("-", LLOBJECT, a1, LLOBJECT, a2, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_multiply(LObject * a1, LObject * a2) { LObject *val = LEvalFunc("*", LLOBJECT, a1, LLOBJECT, a2, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_divide(LObject * a1, LObject * a2) { LObject *val = LEvalFunc("/", LLOBJECT, a1, LLOBJECT, a2, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_remainder(LObject * a1, LObject * a2) { LObject *val = LEvalFunc("mod", LLOBJECT, a1, LLOBJECT, a2, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_truncate(LObject * a1) { LObject *val = LEvalFunc("truncate", LLOBJECT, a1, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } int l_sgi() { LObject *val = LEvalFunc("sgi", LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } int l_NeXT() { LObject *val = LEvalFunc("NeXT", LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } LObject * l_progn(LList * a1) { LObject *val = LEvalFunc("progn", LREST, a1, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_EvalLambda(LObject * a1, LList * a2) { LObject *val = LEvalFunc("\a\bEvalLambda", LLOBJECT, a1, LREST, a2, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_EvalDefun(LList * a1) { LObject *val = LEvalFunc("\a\bEvalDefun", LREST, a1, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_car(LList * a1) { LObject *val = LEvalFunc("car", LLIST, a1, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_cdr(LList * a1) { LObject *val = LEvalFunc("cdr", LLIST, a1, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_cons(LObject * a1, LList * a2) { LObject *val = LEvalFunc("cons", LLOBJECT, a1, LLIST, a2, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } void l_interest(LList * a1) { LObject *val = LEvalFunc("interest", LLIST, a1, LEND); LFree(val); } void l_uninterest(LList * a1) { LObject *val = LEvalFunc("uninterest", LLIST, a1, LEND); LFree(val); } void l_time_interests(float a1, char * a2, char * a3, char * a4) { LObject *val = LEvalFunc("time-interests", LFLOAT, a1, LSTRING, a2, LSTRING, a3, LSTRING, a4, LEND); LFree(val); } void l_regtable() { LObject *val = LEvalFunc("regtable", LEND); LFree(val); } void l_help(char * a1) { LObject *val = LEvalFunc("help", LSTRING, a1, LEND); LFree(val); } void l_morehelp(char * a1) { LObject *val = LEvalFunc("morehelp", LSTRING, a1, LEND); LFree(val); } extern LObject *Lquote(Lake *, LList *); extern LObject *Leval(Lake *, LList *); extern LObject *Llambda(Lake *, LList *); extern LObject *Llet(Lake *, LList *); extern LObject *Ldefun(Lake *, LList *); extern LObject *Lsetq(Lake *, LList *); extern LObject *Lwhile(Lake *, LList *); extern LObject *Lif(Lake *, LList *); extern LObject *Lnot(Lake *, LList *); extern LObject *Lor(Lake *, LList *); extern LObject *Land(Lake *, LList *); extern LObject *Lgreater(Lake *, LList *); extern LObject *Lless(Lake *, LList *); extern LObject *Lequal(Lake *, LList *); extern LObject *Ladd(Lake *, LList *); extern LObject *Lsubstract(Lake *, LList *); extern LObject *Lmultiply(Lake *, LList *); extern LObject *Ldivide(Lake *, LList *); extern LObject *Lremainder(Lake *, LList *); extern LObject *Ltruncate(Lake *, LList *); extern LObject *Lsgi(Lake *, LList *); extern LObject *LNeXT(Lake *, LList *); extern LObject *Lprogn(Lake *, LList *); extern LObject *LEvalLambda(Lake *, LList *); extern LObject *LEvalDefun(Lake *, LList *); extern LObject *Lcar(Lake *, LList *); extern LObject *Lcdr(Lake *, LList *); extern LObject *Lcons(Lake *, LList *); extern LObject *Linterest(Lake *, LList *); extern LObject *Luninterest(Lake *, LList *); extern LObject *Ltime_interests(Lake *, LList *); extern LObject *Lregtable(Lake *, LList *); extern LObject *Lhelp(Lake *, LList *); extern LObject *Lmorehelp(Lake *, LList *); extern char Hquote[]; extern char Heval[]; extern char Hlambda[]; extern char Hlet[]; extern char Hdefun[]; extern char Hsetq[]; extern char Hwhile[]; extern char Hif[]; extern char Hnot[]; extern char Hor[]; extern char Hand[]; extern char Hgreater[]; extern char Hless[]; extern char Hequal[]; extern char Hadd[]; extern char Hsubstract[]; extern char Hmultiply[]; extern char Hdivide[]; extern char Hremainder[]; extern char Htruncate[]; extern char Hsgi[]; extern char HNeXT[]; extern char Hprogn[]; extern char HEvalLambda[]; extern char HEvalDefun[]; extern char Hcar[]; extern char Hcdr[]; extern char Hcons[]; extern char Hinterest[]; extern char Huninterest[]; extern char Htime_interests[]; extern char Hregtable[]; extern char Hhelp[]; extern char Hmorehelp[]; void clisp_init() { LDefun("quote", Lquote, Hquote); LDefun("eval", Leval, Heval); LDefun("lambda", Llambda, Hlambda); LDefun("let", Llet, Hlet); LDefun("defun", Ldefun, Hdefun); LDefun("setq", Lsetq, Hsetq); LDefun("while", Lwhile, Hwhile); LDefun("if", Lif, Hif); LDefun("not", Lnot, Hnot); LDefun("or", Lor, Hor); LDefun("and", Land, Hand); LDefun(">", Lgreater, Hgreater); LDefun("<", Lless, Hless); LDefun("=", Lequal, Hequal); LDefun("+", Ladd, Hadd); LDefun("-", Lsubstract, Hsubstract); LDefun("*", Lmultiply, Hmultiply); LDefun("/", Ldivide, Hdivide); LDefun("mod", Lremainder, Hremainder); LDefun("truncate", Ltruncate, Htruncate); LDefun("sgi", Lsgi, Hsgi); LDefun("NeXT", LNeXT, HNeXT); LDefun("progn", Lprogn, Hprogn); LDefun("\a\bEvalLambda", LEvalLambda, HEvalLambda); LDefun("\a\bEvalDefun", LEvalDefun, HEvalDefun); LDefun("car", Lcar, Hcar); LDefun("cdr", Lcdr, Hcdr); LDefun("cons", Lcons, Hcons); LDefun("interest", Linterest, Hinterest); LDefun("uninterest", Luninterest, Huninterest); LDefun("time-interests", Ltime_interests, Htime_interests); LDefun("regtable", Lregtable, Hregtable); LDefun("help", Lhelp, Hhelp); LDefun("morehelp", Lmorehelp, Hmorehelp); } geomview-1.9.5/src/lib/oogl/refcomm/0000755000175000017500000000000012310165601014271 500000000000000geomview-1.9.5/src/lib/oogl/refcomm/Makefile.in0000644000175000017500000004615212310165555016276 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/oogl/refcomm DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) librefcomm_la_LIBADD = am_librefcomm_la_OBJECTS = handle.lo streampool.lo librefcomm_la_OBJECTS = $(am_librefcomm_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(librefcomm_la_SOURCES) DIST_SOURCES = $(librefcomm_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = librefcomm.la librefcomm_la_SOURCES = \ handle.c streampool.c handle.h handleP.h reference.h streampool.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/oogl/refcomm/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/oogl/refcomm/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } librefcomm.la: $(librefcomm_la_OBJECTS) $(librefcomm_la_DEPENDENCIES) $(EXTRA_librefcomm_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(librefcomm_la_OBJECTS) $(librefcomm_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handle.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/streampool.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am #librefcomm_la_LDFLAGS = -r # 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: geomview-1.9.5/src/lib/oogl/refcomm/Makefile.am0000644000175000017500000000032412310110201016226 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = librefcomm.la librefcomm_la_SOURCES = \ handle.c streampool.c handle.h handleP.h reference.h streampool.h #librefcomm_la_LDFLAGS = -rgeomview-1.9.5/src/lib/oogl/refcomm/handle.c0000644000175000017500000002752112310110201015601 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "handleP.h" #include "freelist.h" static DBLLIST(AllHandles); static DEF_FREELIST(HRef); static DEF_FREELIST(Handle); void HRefFreeListPrune(void) { FreeListNode *old; size_t size = 0; while (HRefFreeList) { old = HRefFreeList; HRefFreeList = old->next; OOGLFree(old); size += sizeof(HRef); } OOGLWarn("Freed %ld bytes.\n", size); } void HandleFreeListPrune(void) { FreeListNode *old; size_t size = 0; while (HandleFreeList) { old = HandleFreeList; HandleFreeList = old->next; OOGLFree(old); size += sizeof(Handle); } OOGLWarn("Freed %ld bytes.\n", size); } #define HANDLE_DEBUG 0 void handle_dump(void); static HandleOps NullOps = { "null", }; void HandlesSetObjSaved(bool obj_saved) { HandleOps *ops; Handle *h; DblListIterateNoDelete(&AllHandles, HandleOps, node, ops) { DblListIterateNoDelete(&ops->handles, Handle, opsnode, h) { h->obj_saved = obj_saved; } } } /* Iterate over Ref->handles. * * This function increases the ref-count of the handle, only this way * the caller may safely delete the returned handle; if pos != NULL, * then we first iterate to the next element in the list, and then * call HandleDelete() for pos to undo the REFGET from the previous * call. The caller should always iterate until we return NULL, * otherwise spurious ref-counts will be the result. */ Handle *HandleRefIterate(Ref *r, Handle *pos) { if (pos == NULL) { return DblListEmpty(&r->handles) ? NULL : REFGET(Handle, DblListContainer(r->handles.next, Handle, objnode)); } else { DblListNode *next = pos->objnode.next; HandleDelete(pos); /* undo REFGET(), possibly really delete the handle */ return next == &r->handles ? NULL : REFGET(Handle, DblListContainer(next, Handle, objnode)); } } /* iterate over Pool->handles */ Handle *HandlePoolIterate(Pool *pool, Handle *pos) { if (pos == NULL) { return DblListEmpty(&pool->handles) ? NULL : REFGET(Handle, DblListContainer(pool->handles.next, Handle, poolnode)); } else { DblListNode *next = pos->objnode.next; HandleDelete(pos); return next == &pool->handles ? NULL : REFGET(Handle, DblListContainer(next, Handle, poolnode)); } } void HandleUpdRef(Handle **hp, Ref *parent, Ref **objp) { Handle *h; (void)parent; if((h = *hp) != NULL && objp != NULL && h->object != *objp) { if (*objp) { if (h->ops->delete) { (*h->ops->delete)(*objp); } else { REFPUT(*objp); } } *objp = REFGET(Ref, h->object); } } void HandleUnregister(Handle **hp) { Handle *h; HRef *r, *rn; if (hp == NULL || (h = *hp) == NULL) { return; } DblListIterate(&h->refs, HRef, node, r, rn) { if(r->hp == hp) { DblListDelete(&r->node); memset(r, 0, sizeof(*r)); FREELIST_FREE(HRef, r); REFPUT(h); } } } void HandleUnregisterJust(Handle **hp, Ref *obj, void *info, void (*update) P((Handle **, Ref *, void *))) { Handle *h; HRef *rp, *rnext; if(hp == NULL || (h = *hp) == NULL) { return; } DblListIterate(&h->refs, HRef, node, rp, rnext) { if(rp->hp == hp && (obj == NULL || rp->parentobj == obj) && (info == NULL || rp->info == info) && (update == NULL || rp->update == update)) { DblListDelete(&rp->node); memset(rp, 0, sizeof(*rp)); FREELIST_FREE(HRef, rp); REFPUT(h); } } } /* * Remove all callbacks on any handle with the given properties. */ void HandleUnregisterAll(Ref *obj, void *info, void (*update) P((Handle **, Ref *, void *))) { HandleOps *ops; Handle *h; HRef *r, *rn; DblListIterateNoDelete(&AllHandles, HandleOps, node, ops) { DblListIterateNoDelete(&ops->handles, Handle, opsnode, h) { DblListIterate(&h->refs, HRef, node, r, rn) { if((obj == NULL || r->parentobj == obj) && (info == NULL || r->info == info) && (update == NULL || r->update == update)) { DblListDelete(&r->node); memset(r, 0, sizeof(*r)); FREELIST_FREE(HRef, r); REFPUT(h); } } } } } static void handleupdate(Handle *h, HRef *rp) { if(rp->update && h == *rp->hp) { (*rp->update)(rp->hp, rp->parentobj, rp->info); } else { /* BUG */ OOGLError(1, "handleupdate mismatch: h %x %s, rp->hp %x, *rp->hp %x, rp->parentobj %x, rp->update %x", h, h->name, rp->hp, *rp->hp, rp->parentobj, rp->update); if(*rp->hp) { OOGLError(1, "... *rp->hp->name %s", (*rp->hp)->name); } } } int HandleRegister(Handle **hp, Ref *parentobj, void *info, void (*update) P((Handle **, Ref *, void *))) { Handle *h; HRef *rp; if (hp == NULL || (h = *hp) == NULL) { return false; } DblListIterateNoDelete(&h->refs, HRef, node, rp) { if (rp->hp == hp && rp->parentobj == parentobj && rp->info == info) { goto update_out; } } FREELIST_NEW(HRef, rp); REFINCR(h); rp->hp = hp; rp->parentobj = parentobj; rp->info = info; DblListAdd(&h->refs, &rp->node); update_out: rp->update = update; handleupdate(h, rp); return true; } char * HandleName(Handle *h) { return h ? h->name : NULL; } HandleOps *HandleOpsByName(char *name) { HandleOps *ops; DblListIterateNoDelete(&AllHandles, HandleOps, node, ops) { if (strcmp(name, ops->prefix) == 0) { return ops; } } return NULL; } Handle * HandleByName(char *name, HandleOps *ops) { Handle *h; if (ops == NULL) { DblListIterateNoDelete(&AllHandles, HandleOps, node, ops) { DblListIterateNoDelete(&ops->handles, Handle, opsnode, h) { if (strcmp(h->name, name) == 0) { return REFGET(Handle, h); } } } } else { if (ops->handles.next == NULL) { DblListInit(&ops->handles); DblListAdd(&AllHandles, &ops->node); } DblListIterateNoDelete(&ops->handles, Handle, opsnode, h) { if (strcmp(h->name, name) == 0) { return REFGET(Handle, h); } } } return NULL; } static Handle * handlecreate(char *name, HandleOps *ops) { Handle *h; #if HANDLE_DEBUG OOGLWarn("Creating handle with name \"%s\"", name); #endif FREELIST_NEW(Handle, h); RefInit((Ref *)h, HANDLEMAGIC); h->ops = ops = ops ? ops : &NullOps; h->name = strdup(name); h->object = NULL; h->whence = NULL; h->permanent = false; DblListInit(&h->refs); /* The following two are nodes, not list-heads, but this way we can * safely call DblListDelete(), even if there is no associated list. */ DblListInit(&h->objnode); DblListInit(&h->poolnode); if (ops->handles.next == NULL) { DblListInit(&ops->handles); DblListAdd(&AllHandles, &ops->node); } DblListAddTail(&ops->handles, &h->opsnode); /* handle_dump();*/ return h; } /* * Assign a new object to a Handle. */ int HandleSetObject(Handle *h, Ref *object) { HRef *ref; if(h == NULL) { return false; } if(h->object == object) { return true; } DblListDelete(&h->objnode); if (h->object) { if (h->ops->delete != NULL) { (*h->ops->delete)(h->object); } else { REFPUT(h->object); } } h->object = REFGET(Ref, object); if (object) { DblListAddTail(&object->handles, &h->objnode); } DblListIterateNoDelete(&h->refs, HRef, node, ref) { handleupdate(h, ref); } return true; } /* * Unconditionally create a new handle. */ Handle * HandleDoCreate(char *name, HandleOps *ops) { Handle *h; h = handlecreate(name, ops); return h; } /* * Create a Handle, don't reassign its value. */ Handle * HandleCreate(char *name, HandleOps *ops) { Handle *h; h = HandleByName(name, ops); if (h == NULL) { h = handlecreate(name, ops); } return h; } /* * Global handle: increase the ref-count twice. */ Handle * HandleCreateGlobal(char *name, HandleOps *ops) { Handle *h; h = HandleCreate(name, ops); if (!h->permanent) { h->permanent = true; return REFGET(Handle, h); } else { return h; } } /* * Create a Handle (or reassign its value if it already exists) */ Handle * HandleAssign(char *name, HandleOps *ops, Ref *object) { Handle *h; h = HandleCreate(name, ops); HandleSetObject(h, object); return h; } /* * Return the current object held by a Handle. */ Ref * HandleObject(Handle *h) { return h->object; } Pool * HandlePool(Handle *h) { return h->whence; } void HandlePDelete(Handle **hp) { if(hp && *hp) { HandleUnregister(hp); HandleDelete(*hp); *hp = NULL; } } /* Simple debugging aid: dump the list of currently defined handles * and their ref-counts, and the ref. counts of the attached object * (if any). */ void handle_dump(void) { HandleOps *ops; Handle *h; OOGLWarn("Active handles:"); DblListIterateNoDelete(&AllHandles, HandleOps, node, ops) { DblListIterateNoDelete(&ops->handles, Handle, opsnode, h) { OOGLWarn(" %s[%s]@%p (%s: #%d, o: #%d )", ops->prefix, h->name, (void *)h, h->permanent ? "H" : "h", RefCount((Ref *)h), h->object ? RefCount((Ref *)h->object) : -1); } } } /* In principle, it is not necessary to distinguish between permanent * and non-permanent handles IF the ref-counts are kept up to date. */ void HandleDelete(Handle *h) { if (h == NULL) { return; } if (h->magic != HANDLEMAGIC) { OOGLWarn("Internal warning: HandleDelete of non-Handle %x (%x != %x)", h, h->magic, HANDLEMAGIC); return; } if (REFPUT(h) > 0) { return; } #if HANDLE_DEBUG OOGLWarn("Deleting handle with name \"%s\"", h->name); if (!DblListEmpty(&h->refs)) { OOGLWarn("Deleting handle with active back references."); abort(); } #endif /* remove ourselves from various lists */ DblListDelete(&h->objnode); DblListDelete(&h->opsnode); DblListDelete(&h->poolnode); if (h->object) { /* undo RefIncr() from HandleSetObject() */ if (h->ops->delete) { (*h->ops->delete)(h->object); } else { REFPUT(h->object); } } /* Don't let Pool code think we have something cached in this handle! */ if (h->whence && h->whence->seekable) { h->whence->flags &= ~PF_ANY; if (!h->permanent) { #if 1 /* Should we do this? If we are not permanent and attached to a * pool, then we are a dummy pool-handle assigned to an object * just read from the pool. Still the pool could belong to a * pipe, and maybe we should not close and delete the pool. * * I think closing and deleting is ok here ... * * If we are permanent, then we should not close whence. */ PoolClose(h->whence); PoolDelete(h->whence); #endif } } if(h->name) { free(h->name); } memset(h, 0, sizeof(*h)); FREELIST_FREE(Handle, h); /* handle_dump();*/ } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/oogl/refcomm/streampool.c0000644000175000017500000006315012310110201016531 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include #include #include #include /* for decl of 'free'; mbp Tue May 16 19:21:59 2000 */ #include "handleP.h" /* Includes stdio.h, etc. too */ #include "freelist.h" #if defined(unix) || defined(__unix) # include # include # include #elif defined(_WIN32) # include #endif #ifndef S_IFMT # define S_IFMT _S_IFMT # define S_IFIFO _S_IFIFO #endif #ifdef _WIN32 #undef FD_ISSET int FD_ISSET(SOCKET fd, fd_set *fds) { int i = fds->fd_count; while(--i >= 0) { if (fds->fd_array[i] == fd) return 1; } return 0; } void gettimeofday(struct timeval *tv, struct timezone *tz) { fprintf(stderr, "Call to stub gettimeofday()\n"); tv->tv_sec = tv->tv_usec = 0; } #endif /*_WIN32*/ #include static const int o_nonblock = #ifdef O_NONBLOCK O_NONBLOCK | #endif #ifdef O_NDELAY O_NDELAY | #endif #ifdef FNONBLK FNONBLK | #endif #ifdef FNDELAY FNDELAY | #endif 0; #if !defined(O_NONBLOCK) && !defined(O_NDELAY) \ && !defined(FNONBLK) && !defined(FNDELAY) # error Do not know how to achieve non-blocking IO #endif static DBLLIST(AllPools); static DEF_FREELIST(Pool); static fd_set poolwatchfds; static int poolmaxfd = 0; static fd_set poolreadyfds; static int poolnready = 0; #define FOREVER ((((unsigned)1)<<31)-1) static struct timeval nexttowake = { FOREVER, }; static Pool *newPool(char *name); /* * Does the whole job of handling stream references to named objects. * Interprets strings of the forms: * name:file * referring to a specific named object to be read from a * specific file, or * file * referring to the nameless content of that file, or * name: * referring to a specific named object from any source. * * In the first two cases, we open (as a Pool) the specified file and * attempt to read it using the functions in *ops. * * The caller of this function owns the returned handle and should * call HandleDelete() when it doesn't need the return value. */ Handle * HandleReferringTo(int prefixch, char *str, HandleOps *ops, Handle **hp) { Pool *p = NULL; Handle *h = NULL, *ph = NULL; Handle *hknown = NULL; char *sep; char *fname; char *name; char nb[128]; if (str == NULL || ops == NULL) return 0; sep = strrchr(str, ':'); if (prefixch == ':') { /* : name -- take 'name' from anywhere */ name = str; fname = NULL; } else if (sep == NULL) { /* < file -- read from file 'name' */ fname = str; name = NULL; } else { /* < file:name */ name = sep+1; fname = nb; if ((size_t)(sep-str) >= sizeof(nb)) { sep = &str[sizeof(nb)-1]; } memcpy(fname, str, sep-str); fname[sep-str] = '\0'; /* The ':' introduces an ambiguity: at least on MS win it can * also mean a drive letter, and on other systems it could * also be a legal part of the name. We only hack around the * drive-letter stuff: if we have a one-letter file-name, then * we assume it is a drive letter. */ if (fname[1] == '\0' && findfile(NULL, fname) == NULL) { fname = str; } } if (fname != NULL && *fname != '\0') { p = PoolStreamOpen(fname, NULL, 0, ops); hknown = HandleCreate(fname, ops); } if (p && ((p->flags & (PF_ANY|PF_REREAD)) != PF_ANY || hknown != NULL)) { ph = PoolIn(p); /* Try reading one item. */ } if (name) { /* Accessing a handle via ':' makes the handle global */ h = HandleCreateGlobal(name, ops); } if (ph) { if (h) { /* If we were told to assign to a specific named handle * then do so and get rid of the handle returned by * PoolIn(). */ HandleSetObject(h, HandleObject(ph)); HandleDelete(ph); } else { h = ph; /* otherwise we return the handle returned by PoolIn(). */ } HandleDelete(hknown); } else if (p) { /* If we have a pool but not handle, then generate one for * this pool; callers of this functinos treat handle == NULL * as error case. */ REFGET(Handle, hknown); HandleSetObject(hknown, NULL); h = hknown; if (h->whence) { if (h->whence != p) { /* steal the pool pointer */ DblListDelete(&h->poolnode); h->whence = p; DblListAdd(&p->handles, &h->poolnode); } REFPUT(h); /* no need to call HandleDelete() */ } else { h->whence = p; DblListAdd(&p->handles, &h->poolnode); } } if (hp) { if (*hp) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } return h; } char * PoolName(Pool *p) { return p ? p->poolname : NULL; } Pool * PoolByName(char *fname, HandleOps *ops) { Pool *p; DblListIterateNoDelete(&AllPools, Pool, node, p) { if ((ops == NULL || p->ops == ops) && strcmp(fname, p->poolname) == 0) { return p; } } return NULL; } void pool_dump(void) { Pool *p; Handle *h; OOGLWarn("Active Pools:"); DblListIterateNoDelete(&AllPools, Pool, node, p) { OOGLWarn(" %s[%s]%p", p->ops ? p->ops->prefix : "none", p->poolname, (void *)p); OOGLWarn(" Attached Handles:"); DblListIterateNoDelete(&p->handles, Handle, poolnode, h) { OOGLWarn(" %s", h->name); } } } static void watchfd(int fd) { if (fd < 0 || fd >= FD_SETSIZE || FD_ISSET(fd, &poolwatchfds)) return; FD_SET(fd, &poolwatchfds); if (poolmaxfd <= fd) poolmaxfd = fd+1; } static void unwatchfd(int fd) { int i; if (fd < 0 || fd >= FD_SETSIZE) return; if (FD_ISSET(fd, &poolwatchfds)) { FD_CLR(fd, &poolwatchfds); } if (fd+1 >= poolmaxfd) { for(i = poolmaxfd; --i >= 0 && !FD_ISSET(i, &poolwatchfds); ) ; poolmaxfd = i+1; } if (FD_ISSET(fd, &poolreadyfds)) { FD_CLR(fd, &poolreadyfds); poolnready--; } } static Pool * newPool(char *name) { Pool *p; FREELIST_NEW(Pool, p); memset(p, 0, sizeof(Pool)); DblListInit(&p->node); DblListInit(&p->handles); p->poolname = strdup(name); return p; } Pool * PoolStreamTemp(char *name, IOBFILE *inf, FILE *outf, int rw, HandleOps *ops) { Pool *p; char dummy[3+sizeof(unsigned long)*2+1]; FILE *f = NULL; if (name==NULL) { sprintf(name=dummy, "_p@%lx", (unsigned long)(inf ? (void *)inf : (void *)outf)); } if (inf == NULL && outf == NULL && name != NULL) { f = fopen(name, rw ? (rw>1 ? "w+b":"wb") : "rb"); if (f == NULL) { OOGLError(0, "Can't open %s: %s", name, sperror()); return NULL; } } if (f == NULL && inf == NULL && outf == NULL) { OOGLError(0, "PoolStreamTemp(%s): file == NULL\n", name); return NULL; } if (f) { switch(rw) { case 0: inf = iobfileopen(f); outf = NULL; break; case 1: outf = f; inf = NULL; break; case 2: inf = iobfileopen(f); outf = fdopen(dup(fileno(f)), "wb"); break; } } else if (rw != 1 && inf == NULL) { inf = iobfileopen(fdopen(dup(fileno(outf)), "rb")); } else if (rw != 0 && outf == NULL) { outf = fdopen(dup(iobfileno(inf)), "wb"); } if ((rw != 1 && inf == NULL) || (rw != 0 && outf == NULL)) { OOGLError(0, "PoolStreamTemp(%s): file == NULL\n", name); return NULL; } p = newPool(name); p->ops = ops; p->type = P_STREAM; p->outf = outf; p->inf = inf; p->infd = p->inf ? iobfileno(p->inf) : -1; /*p->handles = NULL;*/ p->resyncing = NULL; p->otype = PO_ALL; p->mode = inf && outf ? 2 : (outf ? 1 : 0); p->seekable = (p->inf && lseek(iobfileno(p->inf),0,SEEK_CUR) != -1 && !isatty(iobfileno(p->inf))); p->softEOF = !p->seekable; p->level = (p->outf && lseek(fileno(p->outf),0,SEEK_CUR) != -1 && !isatty(fileno(p->outf))) ? 0 : 1; p->flags = PF_TEMP; p->client_data = NULL; #if HAVE_FCNTL if (p->inf && p->infd >= 0) { fcntl(p->infd, F_SETFL, fcntl(p->infd, F_GETFL) & ~o_nonblock); } if (p->outf && fileno(p->outf) >= 0) { int fd = fileno(p->outf); fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~o_nonblock); } #endif /*unix*/ return p; } Pool * PoolStreamOpen(char *name, FILE *f, int rw, HandleOps *ops) { Pool *p; struct stat st; p = PoolByName(name, ops); if (p == NULL) { p = newPool(name); p->ops = ops; p->type = P_STREAM; p->inf = NULL; p->infd = -1; p->outf = NULL; p->mode = rw; /*p->handles = NULL;*/ p->resyncing = NULL; p->otype = PO_ALL; p->level = 0; p->flags = 0; p->client_data = NULL; } else { if (rw == 0 && p->mode == 0 && p->inf != NULL && p->softEOF == 0 && (p->flags & PF_REREAD) == 0 && stat(name, &st) == 0 && st.st_mtime == p->inf_mtime) { iobfrewind(p->inf); return p; } /* * Combine modes. Allows e.g. adding write stream to read-only pool. */ p->mode = ((p->mode+1) | (rw+1)) - 1; if (p->inf && rw != 1) { if (iobfile(p->inf) == stdin) { iobfileclose(p->inf); /* leaves stdin open */ } else { iobfclose(p->inf); } p->inf = NULL; } } if (f == NULL || f == (FILE *)-1) { if (rw != 1) { if (strcmp(name, "-") == 0) { f = stdin; } else { /* Try opening read/write first in case it's a Linux named pipe */ int fd; /* Linux 2.0 is said to prefer that someone always has * a named pipe open for writing as well as reading. * But if we do that, we seem to lose the ENXIO error given * to a process which opens that pipe for non-blocking write. * Let's not do this now, even on Linux. * Note that we do use PoolSleepFor() to slow down polling * of pipes which claim to have data ready, but actually don't; * I think that's what O_RDWR mode is intended to fix. */ /* BTW, this is not Linux, but common Unix * behaviour. Reading from a pipe with no writers will * just return. * * cH: In principle we would want to avoid that * O_NONBLOCK; but then the call to open() may * actually block. Using O_RDONLY, however, seems to * render the select stuff unusable. * * cH: update: at least on Linux, O_RDWR means that we * always have a writer for this pipe (ourselves). It * is probably more poratble to use a second file * descriptor in write mode. However, leave it as is * for now. */ fd = open(name, O_RDWR | o_nonblock); if (fd < 0) fd = open(name, O_RDONLY | o_nonblock); #if HAVE_UNIX_SOCKETS /* Unix-domain socket? */ if (fd < 0 && errno == EOPNOTSUPP) { struct sockaddr_un sa; sa.sun_family = AF_UNIX; strncpy(sa.sun_path, name, sizeof(sa.sun_path)); fd = socket(PF_UNIX, SOCK_STREAM, 0); if (connect(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0) { close(fd); fd = -1; } } #endif /* HAVE_UNIX_SOCKETS */ if (fd < 0) OOGLError(0, "Cannot open file \"%s\": %s", name, sperror()); else f = fdopen(fd, "rb"); } p->inf = iobfileopen(f); } if (rw > 0) { if (strcmp(name, "-") == 0) p->outf = stdout; else if ((p->outf = fopen(name, "wb")) == NULL) OOGLError(0, "Cannot create \"%s\": %s", name, sperror()); } } else { if (rw != 1) { p->inf = iobfileopen(f); } if (rw > 0) { p->outf = (rw == 2) ? fdopen(dup(fileno(f)), "wb") : f; } } if (p->inf == NULL && p->outf == NULL) { PoolDelete(p); return NULL; } /* We're committed now. */ if (DblListEmpty(&p->node)) { DblListAddTail(&AllPools, &p->node); } p->seekable = false; p->softEOF = false; if (p->inf != NULL) { p->infd = iobfileno(p->inf); if (p->infd != -1) { if (isatty(p->infd)) { p->softEOF = true; } else if (lseek(p->infd,0,SEEK_CUR) != -1) { p->seekable = true; } if (fstat(p->infd, &st) < 0 || (st.st_mode & S_IFMT) == S_IFIFO) { p->softEOF = true; } p->inf_mtime = st.st_mtime; watchfd(p->infd); #if HAVE_FCNTL fcntl(p->infd, F_SETFL, fcntl(p->infd, F_GETFL) & ~o_nonblock); #endif /* HAVE_FCNTL */ } } #if HAVE_FCNTL if (p->outf && fileno(p->outf) >= 0) { int fd = fileno(p->outf); fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~o_nonblock); } #endif /* HAVE_FCNTL */ if (p->level == 0 && p->outf && (lseek(fileno(p->outf),0,SEEK_CUR) == -1 || isatty(fileno(p->outf)))) p->level = 1; return p; } /* Return "true" if succesful */ int PoolSetMark(Pool *p) { return iobfsetmark(PoolInputFile(p)) == 0; } /* Return "true" if succesful */ int PoolSeekMark(Pool *p) { return iobfseekmark(PoolInputFile(p)) == 0; } /* Return "true" if succesful. BUT WHO CARES. Grin. */ int PoolClearMark(Pool *p) { return iobfclearmark(PoolInputFile(p)) == 0; } int PoolIncLevel(Pool *p, int incr) { if (p) { p->level += incr; if (p->level < 0) { OOGLError(0, "PoolIncLevel(): negative level.\n"); } return p->level; } else { return incr; } } int PoolOType(Pool *p, int otype) { (void)otype; return p->otype; } void PoolSetOType(Pool *p, int otype) { p->otype = otype; } IOBFILE * PoolInputFile(Pool *p) { return (p && p->type == P_STREAM) ? p->inf : NULL; } FILE * PoolOutputFile(Pool *p) { return (p && p->type == P_STREAM) ? p->outf : NULL; } void * PoolClientData(Pool *p) { return (p ? p->client_data : NULL); } void PoolSetClientData(Pool *p, void *data) { p->client_data = data; } void PoolDoReread(Pool *p) { p->flags |= PF_REREAD; /* Reread when asked */ } void PoolClose(Pool *p) { if (p->ops->close && (p->flags & PF_CLOSING) == 0) { p->flags |= PF_CLOSING; if ((*p->ops->close)(p)) { return; } } if (p->type == P_STREAM) { if (p->inf != NULL) { unwatchfd(iobfileno(p->inf)); if (iobfile(p->inf) == stdin) { iobfileclose(p->inf); } else { iobfclose(p->inf); } p->inf = NULL; p->infd = -1; } if (p->outf != NULL) { if (p->outf != stdout) fclose(p->outf); p->outf = NULL; } /* PoolDelete(p); */ /* Shouldn't we delete the Pool? */ } } void PoolDelete(Pool *p) { Handle *h, *hn; if (p == NULL || (p->flags & PF_DELETED) != 0) { return; } p->flags |= PF_DELETED; if ((p->flags & PF_TEMP) == 0) { DblListDelete(&p->node); DblListIterate(&p->handles, Handle, poolnode, h, hn) { h->whence = NULL; DblListDelete(&h->poolnode); HandleDelete(h); } } free(p->poolname); FREELIST_FREE(Pool, p); } void PoolDetach(Pool *p) { if ((p->flags & PF_TEMP) == 0) { DblListDelete(&p->node); } } void PoolReattach(Pool *p) { if ((p->flags & PF_TEMP) == 0) { if (DblListEmpty(&p->node)) { DblListAddTail(&AllPools, &p->node); } } } /* * Marks a Pool as being awake. Doesn't update nexttowake; * so this should only be called where awaken_until() gets a chance to run. */ static void awaken(Pool *p) { p->flags &= ~PF_ASLEEP; timerclear(&p->awaken); if (p->infd >= 0) { watchfd(p->infd); if (iobfhasdata(p->inf) && !FD_ISSET(p->infd, &poolreadyfds)) { FD_SET(p->infd, &poolreadyfds); poolnready++; } } } static void awaken_until(struct timeval *until) { Pool *p; nexttowake.tv_sec = FOREVER; DblListIterateNoDelete(&AllPools, Pool, node, p) { if (p->flags & PF_ASLEEP) { if (timercmp(&p->awaken, until, <)) { awaken(p); } else if (p->inf != NULL && timercmp(&p->awaken, &nexttowake, <)) { nexttowake = p->awaken; } } } } /* * PoolInputFDs(fds, maxfd) * supplies a list of file descriptors for select() to watch for input. * Sets *fds to the set of pool input file descriptors * Sets *maxfd to the max+1 file descriptor in fds. * Returns max time to sleep in seconds; 0 if some Pools have input immediately * available (so select() shouldn't block). */ float PoolInputFDs(fd_set *fds, int *maxfd) { float timeleft = FOREVER; #if defined(unix) || defined(__unix) if (nexttowake.tv_sec != FOREVER) { struct timeval now; gettimeofday(&now, NULL); if (timercmp(&nexttowake, &now, <)) awaken_until(&now); timeleft = (nexttowake.tv_sec - now.tv_sec) + .000001 * (nexttowake.tv_usec - now.tv_usec); } #endif *fds = poolwatchfds; *maxfd = poolmaxfd; return poolnready != 0 || timeleft < 0 ? 0 : timeleft; } /* * PoolInAll(fd_set *fds, int nfds) * Read from all available pools, given a set of file descriptors * which claim to have some input. We also import from all those which * already have buffered input. * nfds is an advisory upper bound on the number of fd's in *fds; * if the caller doesn't keep the return value from select(), just use * FD_SETSIZE or other huge number. * Each fd used is removed from *fds, and *nfds is decremented. * The return value is 1 if anything was read from any pool, 0 otherwise. */ int PoolInAll(fd_set *fds, int *nfds) { Pool *p; int got = 0; /* We use DblListIterateNoDelete() _NOT_ because PoolIn() could * not delete the current Pool p, because PoolIn() can delete * _ANY_ pool so we need to work harder to make this * PoolInAll()-loop failsafe. */ DblListIterateNoDelete(&AllPools, Pool, node, p) { if (p->type != P_STREAM || p->inf == NULL || p->infd < 0) { continue; } if (FD_ISSET(p->infd, &poolreadyfds)) { FD_CLR(p->infd, &poolreadyfds); poolnready--; if (PoolIn(p)) { got++; } } else if (FD_ISSET(p->infd, fds)) { FD_CLR(p->infd, fds); (*nfds)--; if (PoolIn(p)) { got++; } } /* We need to be very careful here: PoolIn() can have _ANY_ * sort of side effect, in particular it might delete _ANY_ * pool. Luckily we do not really delete pools; if "p" is * actually in the deleted state, then it has its PF_DELETED * flag set. In this case we simply restart the loop. * * NOTE: Just using &AllPools triggers a strict aliasing * warning with gcc. Of course, I don't know if the funny * "next->prev" stuff simply confuses the compiler such that * it does no longer emit the warning, but still emits wrong * code. In principle the construct should be ok. "next->prev" * should always point back to &AllPools. Of course, the * compiler cannot know this. Maybe this is the difference. */ if (p->flags & PF_DELETED) { p = DblListContainer(AllPools.next->prev, Pool, node); } } return got; } static void asleep(Pool *p, struct timeval *base, double offset) { struct timeval until; base = timeof(base); if (p->inf != NULL) { p->flags |= PF_ASLEEP; addtime(&until, base, offset); if (timercmp(&until, &nexttowake, <)) { nexttowake = until; } p->awaken = until; if (p->infd >= 0) { unwatchfd(p->infd); if (FD_ISSET(p->infd, &poolreadyfds)) { FD_CLR(p->infd, &poolreadyfds); poolnready--; } } } } void PoolSleepUntil(Pool *p, double until) { asleep(p, &p->timebase, until); } void PoolSleepFor(Pool *p, double naptime) { asleep(p, NULL, naptime); } void PoolSetTime(Pool *p, struct timeval *base, double time_at_base) { base = timeof(base); addtime(&p->timebase, base, -time_at_base); } double PoolTimeAt(Pool *p, struct timeval *then) { if (p->timebase.tv_sec == 0) timeof(&p->timebase); then = timeof(then); return then->tv_sec - p->timebase.tv_sec + .000001*(then->tv_usec - p->timebase.tv_usec); } void PoolAwaken(Pool *p) { awaken(p); if (timercmp(&p->awaken, &nexttowake, <=)) awaken_until(&nexttowake); } bool PoolASleep(Pool *p) { if (p->flags & PF_ASLEEP) { struct timeval now; gettimeofday(&now, NULL); if (timercmp(&p->awaken, &now, >)) { return true; } awaken(p); } return false; } #if 0 static void poolresync(Pool *p, int (*resync)()) { /* XXX implement this */ } #endif #define CBRA '{' #define CKET '}' /* The caller of this functions owns the returned handle and must call * HandleDelete() to get rid of the handle. */ Handle *PoolIn(Pool *p) { int c = 0; Handle *h = NULL; Ref *r = NULL; if (p->type != P_STREAM) { return NULL; /* Do shared memory here someday XXX */ } if (p->inf == NULL || p->ops == NULL || p->ops->strmin == NULL) { return NULL; /* No way to read */ } if ((p->flags & PF_NOPREFETCH) || ((c = async_iobfnextc(p->inf, 3)) != NODATA && c != EOF)) { if ((*p->ops->strmin)(p, &h, &r)) { /* Attach nameless objects to a handle named for the Pool. * Putting this code here in PoolIn() ensures we just bind * names to top-level objects, not those nested inside a * hierarchy. */ if (h == NULL) { h = HandleCreate(p->poolname, p->ops); if (r != NULL) { HandleSetObject(h, r); /* Decrement reference count since we're handing * ownership of the object to the Handle. */ REFPUT(r); if (h->whence == NULL) { /* Increment the reference count lest PoolDelete() * will also consume the attached object. */ REFGET(Handle, h); } } } else { /* Increment the count such that the calling function * can safely HandleDelete(retval) without destroying a * handle explicitly declared in the pool (with define * or hdefine). */ REFGET(Handle, h); } if (h->whence) { if (h->whence != p) { /* steal the pool pointer */ DblListDelete(&h->poolnode); h->whence = p; DblListAdd(&p->handles, &h->poolnode); } REFPUT(h); /* no need to call HandleDelete() */ } else { h->whence = p; DblListAdd(&p->handles, &h->poolnode); } /* Remember whether we've read (PF_ANY) at least one and * (PF_REREAD) at least two objects from this pool. * There'll be a nontrivial side effect of rereading a file * containing multiple objects, so we actually do reread if asked. */ p->flags |= (p->flags & PF_ANY) ? PF_REREAD : PF_ANY; /* handle_dump(); */ } else { if (p->flags & PF_DELETED) return NULL; if (p->ops->resync) { (*p->ops->resync)(p); } else if (p->softEOF) { iobfrewind(p->inf); } else if (p->inf != NULL) { /* Careful lest already PoolClose()d */ if (p->infd >= 0) { if (FD_ISSET(p->infd, &poolreadyfds)) { FD_CLR(p->infd, &poolreadyfds); poolnready--; } } PoolClose(p); return NULL; } } if (p->seekable && p->inf != NULL) c = iobfnextc(p->inf, 0); /* Notice EOF if appropriate */ } if (c == EOF && iobfeof(p->inf)) { if (p->softEOF) { iobfrewind(p->inf); /* cH: opening O_RDWR should fix this, as this leaves one * active writer attached to the FIFO: ourselves. */ /*PoolSleepFor(p, 1.0);*/ /* Give us a rest */ /* SVR4 poll() doesn't allow us to * wait quietly when the sender closes a named pipe; * any poll() for reading returns immediately with POLLHUP. * Then, attempts to read return EOF. We loop at full speed. * Can't see any better way to throttle this than to * quit listening for a while, at the cost of being slow to * respond if another sender connects. We wait 1 second. */ } else { PoolClose(p); REFGET(Handle, h); /* PoolDelete() deletes also the handle. */ PoolDelete(p); return h; } } if (p->inf && !(p->flags & PF_ASLEEP) && p->infd >= 0) { /* * Anything left in stdio buffer? If so, * remember to try reading next time without waiting for select(). */ if (iobfhasdata(p->inf)) { if (!FD_ISSET(p->infd, &poolreadyfds)) { FD_SET(p->infd, &poolreadyfds); poolnready++; } } else { if (FD_ISSET(p->infd, &poolreadyfds)) { FD_CLR(p->infd, &poolreadyfds); poolnready--; } } } return h; } /* * Support routine for writing {handle, object} pairs to Pools. * Checks the Pool's output type (PO_HANDLES/PO_DATA/PO_ALL). If * appropriate, writes something to the Pool representing the given * Handle. Returns nonzero if the associated object should also be * written literally. * * For global handles: also emit a "define" statement. */ int PoolStreamOutHandle(Pool *p, Handle *h, int havedata) { if (p == NULL || p->outf == NULL) { return 0; } if (h == NULL || (p->otype & PO_DATA)) { return havedata; } if (havedata && !h->obj_saved) { h->obj_saved = true; PoolFPrint(p, p->outf, "define \"%s\"\n", h->name); return true; } if (h->whence != NULL && h->whence->seekable) { PoolFPrint(p, p->outf, " < \""); if (strcmp(h->name, p->poolname) == 0) { fprintf(p->outf, "%s\"\n", h->whence->poolname); } else { fprintf(p->outf, "%s:%s\"\n", h->whence->poolname, h->name); } } else { PoolFPrint(p, p->outf, ": \"%s\"\n", h->name); } return havedata && !h->obj_saved && (p->otype & (PO_DATA|PO_HANDLES)) == PO_ALL; } void PoolFPrint(Pool *p, FILE *f, const char *format, ...) { va_list alist; if (p) { fprintf(f, "%*s", p->level*2, ""); } va_start(alist, format); vfprintf(f, format, alist); va_end(alist); } void PoolPrint(Pool *p, const char *format, ...) { va_list alist; if (p) { fprintf(PoolOutputFile(p), "%*s", p->level*2, ""); } va_start(alist, format); vfprintf(PoolOutputFile(p), format, alist); va_end(alist); } /* * Local Variables: *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/oogl/refcomm/handle.h0000644000175000017500000001373312310110201015606 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _HANDLE_ #define _HANDLE_ /* * Communications -- Public definitions for Handle package. */ #include "ooglutil.h" #include "reference.h" #include "dbllist.h" typedef struct Handle Handle; typedef struct Pool Pool; int HandleSetObject( Handle *, Ref *object ); Ref *HandleObject( Handle * ); void HandlePDelete(Handle **hp); char *HandleName( Handle * ); void HandleDelete( Handle * ); Pool *HandlePool( Handle * ); Handle *HandleRefIterate(Ref *r, Handle *pos); Handle *HandlePoolIterate(Pool *p, Handle *pos); /* set obj_saved flag of all handles */ void HandlesSetObjSaved(bool obj_saved); #if 0 /* stuff which is nowhere defined nor referenced */ #define IO_HANDLES 1 #define IO_COMPLETE 2 int HandleExport( Handle *, Pool * ); /* Export */ int HandleUnExport( Handle * ); /* Cancel exported object if possible */ int HandleImport( Handle * ); /* Import now (possibly blocking) */ int PoolOutMode( int poflags ); /* Returns old IO mode */ #endif /* * Data-specific operations for (stream-type) Pools (files, pipes). */ typedef struct HandleOps { char *prefix; /* Prefix for unique external naming */ int (*strmin) P((Pool *, Handle **, Ref **)); /* Read from stream */ int (*strmout) P((Pool *, Handle *, Ref *)); /* Write */ void (*delete) P((Ref *)); /* Delete object */ int (*resync) P((Pool *)); /* Resync pool on import err */ int (*close) P((Pool *)); /* Close pool */ DblListNode handles; /* list of all handles with these ops */ DblListNode node; /* node into list of all ops */ } HandleOps; /* * Given a string using the reference syntax, * e.g. ``name:file'' or ``name:'', * do whatever's necessary to create and return a handle to it. * Might entail a lookup of an existing handle, * or opening and possibly reading a file (as a stream-type Pool). * * The caller of this functions owns the returned handle and * must call HandleDelete() to get rid of the returned handle. */ extern Handle *HandleReferringTo(int prefixch, char *str, HandleOps *ops, Handle **hp); /* * Search for ops matching prefix. */ extern HandleOps *HandleOpsByName(char *prefix); /* * Given a Handle's name and type (as given by HandleOps), * return it or NULL if it doesn't exist. * * The caller owns the returned handle, i.e. the reference * count of the handle is incremented by this function. */ extern Handle *HandleByName( char *, HandleOps * ); /* * If a Handle with this name already exists, return it; * otherwise, create a new one with NULL value. * * If the handle already exists then its reference count is * incremented by this function. */ extern Handle *HandleCreate( char *name, HandleOps *ops ); /* * Unconditionally create a new Handle with NULL value. */ extern Handle *HandleDoCreate( char *name, HandleOps *ops ); /* * Same as HandleCreate() for an existing global handle, but * if the handle does not already exist increment the * ref-count twice s.t. the handle cannot be deleted. */ extern Handle *HandleCreateGlobal( char *name, HandleOps *ops); /* * Set a Handle's object to obj, creating the Handle if necessary. * Update all registered references to the Handle's value. * Return the (possibly new) Handle. * * If the handle already exists then its reference count is * incremented by this function. */ extern Handle *HandleAssign( char *name, HandleOps *ops, Ref *obj ); /* * Register a reference to a Handle's value. * Whenever the value changes, a call is made to: * (*update)(Handle **hp, Ref *parentobject, void *info) * It's intended that "info" will be a key used by the update * procedure to know which reference to update. * The update procedure is automatically called once when * registration is done. */ extern int HandleRegister( Handle **hp, Ref *parent, void *info, void (*update)()); /* * Un(all callbacks on) a reference to a Handle's value. * It's important to do this when deleting an object, * lest dangling pointers cause trouble. * It's harmless to remove a reference which was never registered. */ extern void HandleUnregister(Handle **hp); /* Unjust one callback on a reference to a Handle's value. * HandleUnregister() is the one to use when deleting an object. * The viewer needs this to keep track of callbacks it plants * throughout Geom trees, which trigger e.g. BBox recomputation. */ extern void HandleUnregisterJust(Handle **hp, Ref *par, void *info, void (*upd)()); /* * Unall callbacks matching a given pattern, no matter * which Handle they're associated with. Another routine needed * for the viewer, called whenever a Geom tree is replaced. */ extern void HandleUnregisterAll(Ref *par, void *info, void (*upd)()); /* * Suitable update() func for HandleRegister in many cases. * Just deletes *objp then assigns *objp = (*hp)->object when called. */ extern void HandleUpdRef(Handle **hp, Ref *parent, Ref **objp); #endif /*_HANDLE_*/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/oogl/refcomm/handleP.h0000644000175000017500000001056712310110201015730 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _HANDLEPOOLP_ #define _HANDLEPOOLP_ /* * Communications -- Private definitions for Pools and Handles. */ #include #include "ooglutil.h" #include "streampool.h" /*#include "sm.h"*/ #define HANDLEMAGIC OOGLMagic('h',1) typedef struct HRef { DblListNode node; Handle **hp; Ref *parentobj; void *info; void (*update) P((Handle **, Ref *, void *)); } HRef; struct Handle { REFERENCEFIELDS; HandleOps *ops; /* Comm-related operations on our datatype */ char *name; /* Char-string name */ Ref *object; /* Current object value if any */ DblListNode opsnode; /* node in list of all handles with given ops */ DblListNode poolnode; /* node in list of all handles with given pool*/ DblListNode objnode; /* node in list of all handles pointing to a given object */ Pool *whence; /* Where did this handle's value come from? */ DblListNode refs; /* list of references to this Handle, * which we update when the Handle's * object changes. */ bool permanent; /* Retain even when last reference goes away? */ bool obj_saved; /* Set during saving of objects when * the handle has been dumped as * reference to indicate that its * objects also already has been * saved. */ /* * Pool-type-specific state */ #if 0 SMSym *sym; /* Address of our SM symbol */ int version; /* Version number of shared-memory symbol */ Pool *smpool; /* Pool in which our symbol lies */ Handle *samepool; /* Link in list of handles on this pool */ #endif }; #define P_SM 1 #define P_STREAM 2 struct Pool { DblListNode node; /* Link in list of all Pools (or free pools) */ int type; /* P_SM or P_STREAM */ char *poolname; /* Name of this pool: typically a filename */ DblListNode handles; /* All handles using this Pool */ HandleOps *ops; /* I/O operations */ long await; /* Unix time until which we should wait */ int (*resyncing)(); /* We're resyncing, call this ... if non-NULL */ /* * State for P_STREAM pools. */ char otype; /* PO_HANDLES, PO_DATA, PO_ALL */ char mode; /* read/write status: 0, 1, 2 as with open() */ char seekable; /* 1 for plain file, 0 for pipe/socket */ char softEOF; /* Can we hope to read more after EOF? * 1 for tty or named pipe, 0 otherwise. */ IOBFILE *inf; int infd; FILE *outf; short flags; /* Miscellaneous internal flags: */ #define PF_TEMP 1 /* "Temporary pool" -- not in AllPools list */ #define PF_ANY 2 /* any objects read from this Pool? */ #define PF_REREAD 4 /* actually re-read on "<" */ #define PF_CLOSING 0x10 /* Internal flag to avoid PoolClose() recursion */ #define PF_ASLEEP 0x20 /* PoolSleep() called on this Pool. */ #define PF_DELETED 0x40 /* Pool is on free list - don't touch! */ #define PF_NOPREFETCH 0x80 /* Don't let PoolIn() prefetch the first char */ short level; /* {} Bracket counter */ long inf_mtime; /* modification time of p->inf file */ /* A second explicit reference to the same * file can cause it to be re-read if it's * been changed since last time, or if it's * a stream (not seekable). */ struct timeval awaken; /* Resume reading at this time */ struct timeval timebase; /* Basis for our clock */ /* * State for P_SM pools. */ #if 0 SMRegion *sm; /* for shared-memory Pools */ #endif /* * client data pointer, used by clients for whatever they want */ void *client_data; }; #endif /*_HANDLEPOOLP_*/ geomview-1.9.5/src/lib/oogl/refcomm/reference.h0000644000175000017500000000453012310110201016304 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GV_REFERENCE_H_ #define _GV_REFERENCE_H_ #include "ooglutil.h" #include "dbllist.h" /* * Public definitions for Reference & Communications package */ #define REFERENCEFIELDS \ unsigned magic; \ int ref_count; \ DblListNode handles typedef struct Ref { REFERENCEFIELDS; } Ref ; #define REFCNT(obj) RefCount((Ref *)(obj)) #define REFINCR(obj) RefIncr((Ref *)(obj)) #define REFDECR(obj) RefDecr((Ref *)(obj)) #define REFGET(type, obj) (REFINCR((obj)), (type *)(obj)) #define REFPUT(obj) REFDECR(obj) /* Initializes a Reference */ static inline void RefInit(Ref *ref, int magic) { ref->ref_count = 1; ref->magic = magic; DblListInit(&ref->handles); } /* Returns current ref count */ static inline int RefCount(Ref *ref) { return ref != NULL ? ref->ref_count : 0; } /* Increments count, returns object */ static inline int RefIncr(Ref *ref) { if (ref != NULL) { return ++ref->ref_count; } else { return 0; } } /* Decrements count, returns it */ static inline int RefDecr(Ref *ref) { if (ref == NULL) { return 0; } if (--ref->ref_count < 0) { OOGLError(1, "RefDecr: ref %x count %d < 0!", ref, ref->ref_count); abort(); } return ref->ref_count; } /* Returns magic number */ static inline int RefMagic(Ref *ref) { return ref->magic; } #endif /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/oogl/refcomm/streampool.h0000644000175000017500000001146612310110201016541 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _STREAMPOOL_ #define _STREAMPOOL_ #if defined(HAVE_CONFIG_H) && ! defined(CONFIG_H_INCLUDED) # include "config.h" #endif #ifdef AIX # include /* RS-6000 needs this */ #endif #include #if defined(unix) || defined(__unix) # include #elif defined(_WIN32) # include #endif #include #include "handle.h" /* * Common stream syntax */ #define CBRA '{' #define CKET '}' /* * Open a stream-type Pool. * Uses stream f if != NULL, otherwise opens the named file. * The name is required anyway, to uniquely identify the pool. */ extern Pool *PoolStreamOpen(char *name, FILE *f, int rw, HandleOps *ops); /* * Open a temporary Pool. Like PoolStreamOpen, but: * - the opened Pool is not listed as a input source for PoolInputFDs * - it is not added to the table of known Pools, so * it won't conflict with other Pools known by the same name. * Uses stream f if != NULL, otherwise opens the named file. * The name is not required -- it may be NULL. */ extern Pool *PoolStreamTemp(char *name, IOBFILE *inf, FILE *outf, int rw, HandleOps *ops); /* * Return the set of file descriptors pool file descriptors we'd like * polled for input. Fills *maxfd with the highest+1 file descriptor. * Returns 0 if some pool holds buffered input (i.e. don't let select() * block), otherwise the time in seconds until the next sleeping Pool * awakens. If no Pools are asleep, returns a large positive number. */ extern float PoolInputFDs( fd_set *fds, int *maxfd ); /* Try to read something from the pool, in case of success a * handle is returned, possibly with an object attached to it. * The caller of this function owns the handle. */ extern Handle *PoolIn(Pool *p); /* * Given the fd mask returned by select(), call import() on * all pools which have input. Removes used fd's from *fds; * decrements count for each fd used. * Returns 1 if anything read from any pool, 0 otherwise. */ extern int PoolInAll( fd_set *fds, int *count ); /* * Utility routine for XXXOut functions. * Writes relevant text of h to the Pool based on p's output setup; * returns 1 if associated data should be written too, 0 if not. */ extern int PoolStreamOutHandle(Pool *p, Handle *h, int havedata); /* * Set a pool's client data pointer. Pool users may use * this for whatever they want. */ void PoolSetClientData(Pool *p, void *data); /* * Return a pool's client data pointer. */ void *PoolClientData(Pool *p); extern void PoolDelete(Pool *p); /* How much to export when we do so? */ /* Pass these values to PoolSetOType(). */ #define PO_ALL 0 /* - use all handles and all data */ #define PO_HANDLES 1 /* - use handles wherever possible, avoid data */ #define PO_DATA 2 /* - data, no external refs */ extern IOBFILE *PoolInputFile(Pool *); extern FILE *PoolOutputFile(Pool *); extern void PoolDoReread(Pool *); extern void PoolClose(Pool *p); extern int PoolOType(Pool *, int otype); extern void PoolSetOType(Pool *, int otype); extern Pool *PoolByName(char *name, HandleOps *ops); extern char *PoolName(Pool *); extern void PoolSleepFor(Pool *, double seconds); extern void PoolSleepUntil(Pool *, double seconds); extern void PoolSetTime(Pool *, struct timeval *basis, double time_at_basis); extern double PoolTimeAt(Pool *, struct timeval *at_this_time); extern void PoolAwaken(Pool *); extern bool PoolASleep(Pool *p); extern int PoolIncLevel(Pool *p, int incr); extern int PoolSetMark(Pool *p); extern int PoolSeekMark(Pool *p); extern int PoolClearMark(Pool *p); extern void PoolFPrint(Pool *p, FILE *f, const char *format, ...); extern void PoolPrint(Pool *p, const char *format, ...); extern void PoolDetach(Pool *p); extern void PoolReattach(Pool *p); #endif /*_STREAMPOOL_*/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/oogl/refcomm/Headers0000644000175000017500000000005412310110201015470 00000000000000handle.h handleP.h reference.h streampool.h geomview-1.9.5/src/lib/oogl/util/0000755000175000017500000000000012310165601013616 500000000000000geomview-1.9.5/src/lib/oogl/util/Makefile.in0000644000175000017500000004766312310165555015633 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/oogl/util DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libooglutil_la_LIBADD = am_libooglutil_la_OBJECTS = error.lo findfile.lo fsa.lo futil.lo \ glob.lo mallocp.lo ppopen.lo iobuffer.lo iobfutil.lo \ malloc-debug.lo time.lo libooglutil_la_OBJECTS = $(am_libooglutil_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libooglutil_la_SOURCES) DIST_SOURCES = $(libooglutil_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libooglutil.la libooglutil_la_SOURCES = \ error.c findfile.c fsa.c futil.c glob.c mallocp.c ppopen.c vvec.h\ create.h fsa.h ooglutil.h porting.h ray.h surf.h \ iobuffer.c iobuffer.h iobfutil.c malloc-debug.c dbllist.h freelist.h\ time.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/oogl/util/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/oogl/util/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libooglutil.la: $(libooglutil_la_OBJECTS) $(libooglutil_la_DEPENDENCIES) $(EXTRA_libooglutil_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libooglutil_la_OBJECTS) $(libooglutil_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/findfile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsa.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/futil.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iobfutil.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iobuffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloc-debug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mallocp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppopen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/oogl/util/Makefile.am0000644000175000017500000000047412310110201015561 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libooglutil.la libooglutil_la_SOURCES =\ error.c findfile.c fsa.c futil.c glob.c mallocp.c ppopen.c vvec.h\ create.h fsa.h ooglutil.h porting.h ray.h surf.h \ iobuffer.c iobuffer.h iobfutil.c malloc-debug.c dbllist.h freelist.h\ time.c geomview-1.9.5/src/lib/oogl/util/error.c0000644000175000017500000000627012310110201015022 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include "ooglutil.h" char *_GFILE; /* Name of file where error is found */ int _GLINE; /* Line number in file where error is found */ int OOGL_Errorcode; /* Unique integer error code */ int _OOGLError(int errorcode, char* fmt,...) { va_list args; va_start(args, fmt); if(errorcode & OE_VERBOSE) fprintf(stderr, "Error <%d>: ",errorcode); if (fmt != NULL) vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); if(errorcode & OE_VERBOSE) fprintf(stderr, "File: %s, Line: %d\n\n",_GFILE,_GLINE); OOGL_Errorcode = errorcode; va_end(args); return 0; } /*\ * Report syntax error */ void OOGLSyntax(IOBFILE *f, char *fmt, ...) { static IOBFILE *oldf; static char oldtext[32]; char *context; va_list args; va_start(args, fmt); vfprintf(stderr, fmt, args); context = iobfcontext(f); if(f == oldf && strcmp(context, oldtext) == 0) { fprintf(stderr, " [ditto]\n"); } else { fprintf(stderr, context[0] != '\0' ? ":\n%s" : " [no text available]\n", context); oldf = f; memcpy(oldtext, context, sizeof(oldtext)); oldtext[sizeof(oldtext)-1] = '\0'; } va_end(args); } void OOGLWarn(char *fmt, ...) { va_list args; #if 0 int level = 2; if(fmt[0] < ' ' && fmt[0] != '\0') level = *fmt++; /* Maybe we have a current warning level below which we don't print * * cH: seemingly not implemented. */ #endif va_start (args, fmt); vfprintf (stderr, fmt, args); fputc('\n', stderr); fflush(stderr); va_end (args); } const char * sperrno(unsigned int err) { #if HAVE_STRERROR return strerror((int)err); #else # if !defined(__FreeBSD__) && !defined(__GLIBC__) && !defined(__CYGWIN__) extern int sys_nerr; extern char *sys_errlist[]; # endif static char errstr[16]; if(err < sys_nerr) return(sys_errlist[err]); sprintf(errstr, "Error %d", err & 0xffff); return(errstr); #endif } const char * sperror(void) { #ifndef HAVE_DECL_ERRNO extern int errno; #endif return sperrno(errno); } geomview-1.9.5/src/lib/oogl/util/findfile.c0000644000175000017500000001537112310110201015453 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/oogl/util/findfile.c,v 1.6 2006/07/15 19:06:00 rotdrop Exp $ */ #include #include #include #include "ooglutil.h" #if defined(unix) || defined(__unix) || defined(__unix__) # ifdef NeXT # include # else # include /* needed for access() */ # endif #else /* Win32 */ # include # define R_OK 4 /* No Windows include file defines this?! */ #endif #include static char **dirlist = NULL; static void dirprefix(char *file, char *dir); char *envexpand(char *s); /*----------------------------------------------------------------------- * Function: filedirs * Description: set the list of directories to search for files * Args: dirs: NULL-terminated array of pointers to directory * strings * Author: mbp * Date: Wed Feb 12 14:09:48 1992 * Notes: This function sets the list of directories searched by * findfile(). It makes an internal copy of these directories * and expands all environment variables in them. */ void filedirs(char *dirs[]) { char buf[1024], **p; int i,ndirs; if (dirlist) { for (p=dirlist; *p!=NULL; ++p) free(*p); OOGLFree(dirlist); } for (ndirs=0; dirs[ndirs]!=NULL; ++ndirs); dirlist = OOGLNewNE(char *,ndirs+1, "filedirs: dirlist"); for (i=0; i= dir && *end != '/') --end; if (end >= dir) *(end+1) = '\0'; else dir[0] = '\0'; } /*----------------------------------------------------------------------- * Function: envexpand * Description: expand environment variables in a string * Args: *s: the string * Returns: s * Author: mbp * Date: Fri Feb 14 09:46:22 1992 * Notes: expansion is done inplace; there better be enough room! */ char * envexpand(char *s) { char *c, *env, *envend, *tail; c = s; if (*c == '~' && (env = getenv("HOME"))) { tail = strdup(c+1); strcpy(c, env); strcat(c, tail); c += strlen(env); free(tail); } while (*c != '\0') { if (*c == '$') { for(envend = c; isalnum(*++envend) || *envend == '_'; ) ; tail = strdup(envend); *envend = '\0'; if((env = getenv(c+1)) == NULL) { OOGLError(1, "%s : No %s environment variable",s,c+1); strcpy(c,tail); } else { strcpy(c,env); strcat(c,tail); c += strlen(env); } free(tail); } else ++c; } return s; } geomview-1.9.5/src/lib/oogl/util/fsa.c0000644000175000017500000002403712310110201014443 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Id: fsa.c,v 1.5 2007/09/16 09:50:46 rotdrop Exp $ * * fsa.c: finite state automaton for matching a finite set of strings * * The procedures in this file are documented in the manual page fsa.1, * a formatted copy of which is in ../../../doc/fsa.man. * * Mark Phillips * April 17, 1989: originally written * Nov 18 1991: modified to allow > 1 fsa */ #include #include "ooglutil.h" /* size of blocks in which to allocate state nodes */ #define BLKSIZ 5 /* Special states and flags */ #define ACCEPT -1 #define REJECT -2 #define ERROR -3 /* Operation flags */ #define PROGRAM 1 #define PARSE 2 typedef struct Trule_s { char c; /* char for this rule */ int ns; /* state to switch to */ struct Trule_s *next; /* ptr to next rule for this state */ } Trule; typedef struct State_s { Trule *tlist; /* list of transition rules for this state */ void *return_value; /* value to return if we end in this state */ } State; struct Fsa_s { State **state; int state_count; void *reject_value; int initial_state; void *return_value; }; /* This must be included *after* the typedef struct Fsa_s above: */ #include "fsa.h" static Trule *new_trule_node(Fsa, int); static void *fsa_execute(Fsa, const char *, void *, int); static int next_state(Fsa, int, char, void *, int); static int new_state(Fsa); static void delete_trule_list(Trule *); /*----------------------------------------------------------------------- * Function: fsa_initialize * Description: Initialize an FSA * Args IN: fsa: the fsa to initialize; if NULL, a new one is created * reject: value to return when parsing unacceptable * string */ Fsa fsa_initialize(Fsa fsa, void *reject) { if (fsa == NULL) fsa = OOGLNewE(struct Fsa_s, "struct Fsa"); else { /* Clear out current program: */ while (fsa->state_count--) { delete_trule_list( (fsa->state[fsa->state_count])->tlist ); OOGLFree((char*)(fsa->state[fsa->state_count])); } OOGLFree((char*)(fsa->state)); } fsa->state_count = 0; fsa->reject_value = reject; fsa->initial_state = new_state(fsa); return fsa; } /*----------------------------------------------------------------------- * Function: fsa_delete * Description: Delete an FSA * Args IN: fsa: the fsa to delete; */ void fsa_delete(Fsa fsa) { if (fsa == NULL) { return; } /* Clear out current program: */ while (fsa->state_count--) { delete_trule_list( (fsa->state[fsa->state_count])->tlist ); OOGLFree((char*)(fsa->state[fsa->state_count])); } OOGLFree((char*)(fsa->state)); OOGLFree(fsa); } /*----------------------------------------------------------------------- * Function: fsa_install * Description: Install a string in an FSA * Args IN: fsa: the fsa to install into * s: the string to install * v: the value to return when s is parsed * Returns: v, unless there is not enough room in the FSA, in * which case the fsa's reject value is returned */ void * fsa_install(Fsa fsa, const char *s, void *v) { return fsa_execute(fsa, s, v, PROGRAM); } /*----------------------------------------------------------------------- * Function: fsa_parse * Description: Parse a string * Args IN: fsa: the fsa to use * s: the string to parse * Returns: If s is acceptable, returns the value v that was * specified when s was installed with fsa_install(). If * v is not acceptable, returns the value of reject given * in the most recent call to fsa_initialize(). * Notes: */ void * fsa_parse(Fsa fsa, const char *s) { return fsa_execute(fsa, s, 0, PARSE); } /*----------------------------------------------------------------------- * Function: fsa_execute * Description: parse or program (install) a string * Args IN: fsa: the fsa to use * s: the string * v: value to correspond to string * op: PROGRAM or PARSE * Returns: Result of parsing or installing. If op==PROGRAM, this * is always v, unless there is no more room in the FSA, * in which case it is the fsa' reject value. If op==PARSE, * it is either v, or the reject value. * * The philosophy of this procedure and procedure * next_state() is that programming the FSA and parsing a * string using the FSA are very similar processes; the * only difference is in what is done when there is no * rule for the current state corresponding to the * current input char. When parsing, we return a * rejection. When programming, we add a rule, and * possibly a new state. * * If op==PROGRAM, s is added to list of acceptable * strings, and the FSA is programmed to return v for s. * If op==PARSE, the FSA is executed and returns value * corresponding to s, or reject value if s is not * acceptable. */ static void *fsa_execute(Fsa fsa, const char *s, void *v, int op) { int cs; /* current state */ if (s==NULL) return fsa->reject_value; cs = fsa->initial_state; fsa->return_value = fsa->reject_value; while ( (cs != ACCEPT) && (cs != REJECT) && (cs != ERROR) ) { cs = next_state(fsa, cs, *s, v, op); ++s; } return( (cs == ERROR) ? fsa->reject_value : fsa->return_value ); } /*----------------------------------------------------------------------- * Function: next_state * Description: Get the next state based on current state and char * Args IN: fsa: the fsa to use * cs: current state * c: current char * v: return value when programing * op: PROGRAM or PARSE * Returns: index of next state, or ERROR * Notes: If op==PROGRAM and no transition rule for c exists for * the current state, a new state is created and a * transition rule to that state is added to the current * state. * * See also comments for fsa_execute(). */ static int next_state(Fsa fsa, int cs, char c, void *v, int op) { Trule *t; /* Check tlist of current state for rule for c */ t = (fsa->state[cs])->tlist; while (t != NULL) { if (t->c == c) { /* We found rule for c; if next state is ACCEPT, set return value. */ /* Then return next state. */ if (t->ns == ACCEPT) { if (op==PROGRAM) fsa->return_value = (fsa->state[cs])->return_value = v; else fsa->return_value = (fsa->state[cs])->return_value; } return(t->ns); } t = t->next; } /* No rule for c present; if just parsing, return rejection */ if (op == PARSE) return(REJECT); /* Otherwise, add a rule for c to current state */ /* Install a rule node for c in current state's tlist */ t = new_trule_node(fsa, cs); if (t == NULL) return(ERROR); t->c = c; /* Now specify the next state for this rule */ if (c == '\0') { /* '\0' means end of a word, so set return value for this state */ /* to v and set the next state for this rule to ACCEPT */ fsa->return_value = (fsa->state[cs])->return_value = v; t->ns = ACCEPT; } else { /* Not '\0' means another char in word, so create a new state */ t->ns = new_state(fsa); if (t->ns == ERROR) return(ERROR); } return(t->ns); } /*----------------------------------------------------------------------- * Function: new_trule_node * Description: return a ptr to a new trule node in the tlist of a state * Args IN: fsa: the fsa to use * n: index of state to add node to * Returns: ptr to newly allowcated rule node */ static Trule * new_trule_node(Fsa fsa, int n) { Trule *t, *tnew; /* Allocate and initialize the node */ tnew = OOGLNewE(Trule, "Trule *"); if (tnew == NULL) return(NULL); tnew->c = '\1'; tnew->ns = REJECT; tnew->next = NULL; /* Install it in tlist of state n */ if (fsa->state[n]->tlist == NULL) { /* List is empty: */ fsa->state[n]->tlist = tnew; } else { /* List is not empty; set t = last node in list, then add tnew to end */ t = fsa->state[n]->tlist; while (t->next != NULL) t = t->next; t->next = tnew; } /* Return ptr to the new trule node */ return(tnew); } /*----------------------------------------------------------------------- * Function: new_state * Description: get a new state for an fsa * Args: fsa: the fsa to use * Returns: index (an int) of new state */ static int new_state(Fsa fsa) { if (fsa->state_count == 0) { fsa->state = OOGLNewNE(State *, BLKSIZ, "State *"); } else if ((fsa->state_count % BLKSIZ == 0)) { fsa->state = OOGLRenewNE(State *, fsa->state, (fsa->state_count/BLKSIZ+1)*BLKSIZ, "reallocating for State *"); } fsa->state[fsa->state_count] = OOGLNewE(State, "State"); if (fsa->state[fsa->state_count] == NULL) return(ERROR); fsa->state[fsa->state_count]->return_value = fsa->reject_value; fsa->state[fsa->state_count]->tlist = NULL; ++fsa->state_count; return(fsa->state_count-1); } /*----------------------------------------------------------------------- * Function: delete_trule_list * Description: Delete a trule list, freeing up its nodes * Args IN: tlist: ptr to first node in list */ static void delete_trule_list(Trule *tlist) { Trule *t; while (tlist != NULL) { t = tlist; tlist = tlist->next; OOGLFree((char*)t); } } geomview-1.9.5/src/lib/oogl/util/futil.c0000644000175000017500000004156112310110201015016 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2002-2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/oogl/util/futil.c,v 1.20 2010/03/13 16:41:35 rotdrop Exp $ */ /* * Geometry object routines. These routines have their "back-seekable" * counterparts in iobfutil.c, the routines below are just kept for * convenience for add-on modules. * * int fputtransform(FILE *f, int ntransforms, float *transforms, int binary) * Writes 4x4 matrices to FILE. Returns the number written, i.e. * ntransforms unless an error occurs. * * int fputnf(FILE *f, int nfloats, float *fv, int binary) * Writes 'nfloats' floats to the given file. ASCII is in %g format, * separated by blanks. * * int * fgetnf(file, nfloats, floatp, binary) * Read an array of floats from a file in "ascii" or "binary" format. * Returns number of floats successfully read, should = nfloats. * "Binary" means "IEEE 32-bit floating-point" format. * * int * fgetni(FILE *file, int nints, int *intsp, int binary) * Read an array of ints from a file in "ascii" or "binary" format. * Returns number of ints successfully read, should = nints. * "Binary" means "32-bit big-endian" integer format. * * int * fgetns(FILE *file, int nshorts, short *intsp, int binary) * Read an array of shorts from a file in "ascii" or "binary" format. * Returns number of shorts successfully read, should = nints. * "Binary" means "16-bit big-endian" integer format. * * int * fexpectstr(FILE *file, char *string) * Expect the given string to appear immediately on file. * Return 0 if the complete string is found, * else the offset+1 of the last matched char within string. * The first unmatched char is ungetc'd. * * int * fexpecttoken(FILE *file, char *string) * Expect the given string to appear on the file, possibly after * skipping some white space and comments. * Return 0 if found, else the offset+1 of last matched char in string. * The first unmatched char is ungetc'd. * * int fnextc(FILE *f, int flags) * Advances f to the next "interesting" character and * returns it. The returned char is ungetc'ed so the next getc() * will yield the same value. * Interesting depends on flags: * 0 : Skip blanks, tabs, newlines, and comments (#...\n). * 1 : Skip blanks, tabs, and comments, but newlines are interesting * (including the \n that terminates a comment). * 2 : Skip blanks, tabs, and newlines, but stop at #. * 3 : Skip blanks and tabs but stop at # or \n. * * char *ftoken(FILE *f, int flags) * Skips uninteresting characters with fnextc(f, flags), * then returns a "token" - string of consecutive interesting characters. * Returns NULL if EOF is reached with no token, or if * flags specifies stopping at end-of-line and this is encountered with * no token found. * The token is effectively statically allocated and will be * overwritten by the next ftoken() call. * * char *fdelimtok(char *delims, FILE *f, int flags) * Like ftoken(), but specially handles the characters in delims[]. * If one appears at the beginning of the token, it's returned as * a single-character token. * If a member of delims[] appears after other characters have been * accumulated, it's considered to terminate the token. * So successive calls to fdelimtok("()", f, 0) * on a file containing (fred smith) * would return "(", "fred", "smith", and ")". * Behavior is undefined if one of the predefined delimiters * (white space or #) appears in delims[]. Explicit quoting * (with ", ' or \) overrides detection of delimiters. * * int fgettransform(FILE *f, int ntransforms, float *transforms, int binary) * Reads 4x4 matrices from FILE. Returns the number of matrices found, * up to ntransforms. Returns 0 if no numbers are found. * On finding incomplete matrices (not a multiple of 16 floats) * returns -1, regardless of whether any whole matrices were found. * Matrices are expected in the form used to transform a row vector * multiplied on the left, i.e. p * T -> p'; thus Euclidean translations * appear in the last row. * */ #include #include #include #include #include "ooglutil.h" #ifndef WORDS_BIGENDIAN static inline int gv_ntohl(unsigned int v) { return (((v >> 24) & 0x000000FF) | ((v << 24) & 0xFF000000) | ((v >> 8) & 0x0000FF00) | ((v << 8) & 0x00FF0000)); } static inline short gv_ntohs(unsigned short s) { return (((s >> 8) & 0x00FF) | ((s << 8) & 0xFF00)); } #else static inline int gv_ntohl(unsigned int v) { return v; } static inline short gv_ntohs(unsigned short s) { return s; } #endif static inline short gv_htons(unsigned short s) { return gv_ntohs(s); } static inline int gv_htonl(unsigned int v) { return gv_ntohl(v); } int fputnf(FILE *file, int count, float *v, int binary) { int i; if(binary) { #if WORDS_BIGENDIAN return fwrite(v, sizeof(float), count, file); #else long w; for(i = 0; i < count; i++) { w = gv_htonl(*(long *)&v[i]); if (fwrite(&w, sizeof(float), 1, file) != 1) { return i; } } return count; #endif } fprintf(file, "%g", v[0]); for(i = 1; i < count; i++) fprintf(file, " %g", v[i]); return count; } int fputtransform(FILE *file, int ntrans, float *trans, int binary) { int i, n; float *p; if(binary) { #if WORDS_BIGENDIAN return fwrite(trans, 4*4*sizeof(float), ntrans, file); #else union { int wi; float wf; } w; int j; for (i = 0; i < ntrans; i++) { for (j = 0; j < 16; j++) { w.wf = trans[i*16 + j]; w.wi = gv_htonl(w.wi); if (fwrite(&w, sizeof(float), 1, file) != 1) { return i; } } } return i; #endif } /* ASCII. */ for(n = 0; n < ntrans; n++) { p = trans + n*16; for(i = 0; i < 4; i++, p += 4) { fprintf(file, " %12.8g %12.8g %12.8g %12.8g\n", p[0], p[1], p[2], p[3]); } if(ferror(file)) return n; fprintf(file, "\n"); } return ntrans; } int fnextc(FILE *f, int flags) { int c; c = getc(f); for(;;) { switch(c) { case EOF: return(EOF); case ' ': case '\t': break; /* Always skip blanks and tabs */ case '#': if(flags & 2) /* 2: stop on comments, else skip */ goto fim; while((c = getc(f)) != '\n' && c != EOF) ; continue; /* Rescan this c */ case '\n': if(!(flags & 1)) /* 1: stop on \n's, else skip them */ break; /* flags&1 => fall into default */ default: fim: ungetc(c, f); return(c); } c = getc(f); } } /* Read an array of white-space-separated floats from file 'f' in * ASCII, fast. Returns the number successfully read. */ int fgetnd(FILE *f, int maxd, double *dv, int binary) { int ngot; double v = 0; int c = EOF; long n; int s, es, nd, any; if(binary) { #if WORDS_BIGENDIAN /* Easy -- our native floating point == big-endian IEEE */ return fread((char *)dv, sizeof(double), maxd, f); #else /* not native big-endian IEEE */ union { int wi[2]; double wd; } w; int tmp; for(n=0; n 0; n++) { tmp = gv_ntohl(w.wi[0]); w.wi[0] = gv_ntohl(w.wi[1]); w.wi[1] = tmp; dv[n] = w.wd; } return n; #endif /* not native big-endian IEEE */ } /* Read ASCII format floats */ for(ngot = 0; ngot < maxd; ngot++) { if(fnextc(f, 0) == EOF) return(ngot); n = 0; s = 0; nd = 0; any = 0; if((c = fgetc(f)) == '-') { s = 1; c = fgetc(f); } while(c >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; if(n >= 214748364) { /* 2^31 / 10 */ v = any ? v*pow(10.0, nd) + (float)n : (float)n; nd = n = 0; any = 1; } c = fgetc(f); } v = any ? v*pow(10.0, (double)nd) + (float)n : (float)n; any += nd; if(c == '.') { nd = n = 0; while((c = fgetc(f)) >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; if(n >= 214748364) { v += (float)n / pow(10.0, (double)nd); n = 0; } } v += (float)n / pow(10.0, (double)nd); } if(any == 0 && nd == 0) break; if(c == 'e' || c == 'E') { es = nd = 0; switch(c = fgetc(f)) { case '-': es = 1; /* And fall through */ case '+': c = fgetc(f); } n = 0; while(c >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; c = fgetc(f); } if(nd == 0) break; if(es) v /= pow(10.0, (double)n); else v *= pow(10, n); } dv[ngot] = s ? -v : v; } if(c!=EOF) ungetc(c, f); return(ngot); } /* * Read an array of white-space-separated floats from file 'f' in ASCII, fast. * Returns the number successfully read. */ int fgetnf(FILE *f, int maxf, float *fv, int binary) { int ngot; float v = 0; int c = EOF; long n; int s, es, nd, any; if(binary) { #if WORDS_BIGENDIAN /* Easy -- our native floating point == big-endian IEEE */ return fread((char *)fv, sizeof(float), maxf, f); #else /* not native big-endian IEEE */ union { int wi; float wf; } w; for(n=0; n 0; n++) { w.wi = gv_ntohl(w.wi); fv[n] = w.wf; } return n; #endif /* not native big-endian IEEE */ } /* Read ASCII format floats */ for(ngot = 0; ngot < maxf; ngot++) { if(fnextc(f, 0) == EOF) return(ngot); n = 0; s = 0; nd = 0; any = 0; if((c = getc(f)) == '-') { s = 1; c = getc(f); } while(c >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; if(n >= 214748364) { /* 2^31 / 10 */ v = any ? v*pow(10.0, nd) + (float)n : (float)n; nd = n = 0; any = 1; } c = getc(f); } v = any ? v*pow(10.0, nd) + (float)n : (float)n; any += nd; if(c == '.') { nd = n = 0; while((c = getc(f)) >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; if(n >= 214748364) { v += (float)n / pow(10.0, nd); n = 0; } } v += (float)n / pow(10.0, nd); } if(any == 0 && nd == 0) break; if(c == 'e' || c == 'E') { es = nd = 0; switch(c = getc(f)) { case '-': es = 1; /* And fall through */ case '+': c = getc(f); } n = 0; while(c >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; c = getc(f); } if(nd == 0) break; if(es) v /= pow(10.0, n); else v *= pow(10.0, n); } fv[ngot] = s ? -v : v; } if(c!=EOF) ungetc(c, f); return(ngot); } int fgetni(FILE *f, int maxi, int *iv, int binary) { int ngot; int c = EOF; long n; int s, any; if(binary) { #if WORDS_BIGENDIAN /* Easy -- our native floating point == big-endian IEEE */ return fread((char *)iv, sizeof(int), maxi, f); #else /* not native big-endian int's */ int w; for(n = 0; n < maxi && fread(&w,4,1,f) > 0; n++) iv[n] = gv_ntohl(w); return n; #endif /* not native big-endian int's */ } /* Read ASCII format floats */ for(ngot = 0; ngot < maxi; ngot++) { if(fnextc(f, 0) == EOF) return(ngot); n = 0; s = 0; any = 0; if((c = getc(f)) == '-') { s = 1; c = getc(f); } while(c >= '0' && c <= '9') { n = n*10 + c - '0'; any = 1; c = getc(f); } if(!any) break; iv[ngot] = s ? -n : n; } if(c!=EOF) ungetc(c, f); return(ngot); } int fgetns(FILE *f, int maxs, short *sv, int binary) { int ngot; int c = EOF; long n; int s, any; if(binary) { #if WORDS_BIGENDIAN /* Easy -- our native floating point == big-endian IEEE */ return fread((char *)sv, sizeof(short), maxs, f); #else /* not native big-endian int's */ short w; for(n = 0; n < maxs && fread(&w,2,1,f) > 0; n++) sv[n] = gv_ntohs(w); return n; #endif /* not native big-endian int's */ } /* Read ASCII format floats */ for(ngot = 0; ngot < maxs; ngot++) { if(fnextc(f, 0) == EOF) return(ngot); n = s = any = 0; if((c = getc(f)) == '-') { s = 1; c = getc(f); } while(c >= '0' && c <= '9') { n = n*10 + c - '0'; any = 1; c = getc(f); } if(!any) break; sv[ngot] = s ? -n : n; } if(c!=EOF) ungetc(c, f); return(ngot); } /* * Check for a string on a file. * If found, return 0. * If not, return the offset of the last matched char +1 * and ungetc the failed char so the caller can see it. */ int fexpectstr(FILE *file, char *str) { char *p = str; int c; while(*p != '\0') { if((c = getc(file)) != *p++) { if(c != EOF) ungetc(c, file); return(p - str); } } return 0; } /* * Check for a string on a file, skipping leading blanks. */ int fexpecttoken(FILE *file, char *str) { (void) fnextc(file, 0); return fexpectstr(file, str); } int fescape(FILE *f) { int n, k, c = fgetc(f); switch(c) { case 'n': return '\n'; case 'b': return '\b'; case 't': return '\t'; case 'r': return '\r'; } if(c < '0' || c > '7') return c; n = c-'0'; k = 2; while((c = fgetc(f)) >= '0' && c <= '7') { n = (n*8) | (c-'0'); if(--k <= 0) return n; } if(c != EOF) ungetc(c, f); return n; } /* * Get a token, return a string or NULL. * Tokens may be "quoted" or 'quoted'; backslashes accepted. * The string is statically allocated and should be copied if * needed before the next call to ftoken(). */ char * ftoken(FILE *file, int flags) { static char *token = NULL; static int troom = 0; int c; char *p; int term; if((term = fnextc(file, flags)) == EOF) return NULL; if(token == NULL) { troom = 50; token = malloc(troom * sizeof(char)); if(token == NULL) return NULL; } p = token; switch(term) { case '"': case '\'': (void) fgetc(file); for(;;) { if((c = getc(file)) == EOF || c == term) break; else if(c == '\\') c = fescape(file); *p++ = c; if(p == &token[troom]) { token = realloc(token, troom * 2); if(token == NULL) return NULL; p = &token[troom]; troom *= 2; } } break; default: if(isspace(term)) return NULL; while((c = getc(file)) != EOF && !isspace(c)) { if(c == '\\') c = fescape(file); *p++ = c; if(p == &token[troom]) { token = realloc(token, troom * 2); if(token == NULL) return NULL; p = &token[troom]; troom *= 2; } } break; } *p = '\0'; return token; } /* * Get a token, return a string or NULL. * Tokens may be "quoted" or 'quoted'; backslashes accepted. * The string is statically allocated and should be copied if * needed before the next call to ftoken(). */ char * fdelimtok(const char *delims, FILE *file, int flags) { static char *token = NULL; static int troom = 0; int c; char *p; const char *q; int term; if((term = fnextc(file, flags)) == EOF) return NULL; if(token == NULL) { troom = 50; token = malloc(troom * sizeof(char)); if(token == NULL) return NULL; } p = token; switch(term) { case '"': case '\'': (void) fgetc(file); for(;;) { if((c = getc(file)) == EOF || c == term) break; else if(c == '\\') c = fescape(file); *p++ = c; if(p == &token[troom]) { token = realloc(token, troom * 2); if(token == NULL) return NULL; p = &token[troom]; troom *= 2; } } break; default: if(isspace(term)) return NULL; while((c = getc(file)) != EOF && !isspace(c)) { if(c == '\\') c = fescape(file); *p = c; if(++p == &token[troom]) { token = realloc(token, troom * 2); if(token == NULL) return NULL; p = &token[troom]; troom *= 2; } for(q = delims; *q && c != *q; q++) ; if(*q) { if(p > token+1) { p--; ungetc(c, file); } break; } } break; } *p = '\0'; return token; } /* * Load one or more Transforms from a file. * Return 1 on success, 0 on failure. */ int fgettransform(FILE *file, int ntrans, float *trans /* float trans[ntrans][4][4] */, int binary) { float *T; int nt; for(nt = 0; nt < ntrans; nt++) { T = trans + 16*nt; switch(fgetnf(file, 16, T, binary)) { case 16: break; case 0: return nt; default: return -1; } } return ntrans; } geomview-1.9.5/src/lib/oogl/util/glob.c0000644000175000017500000000527212310110201014615 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #if defined(unix) || defined(__unix) || defined(__unix__) /* Don't try to compile for Windows */ #include #include #include #include "ooglutil.h" #include #if POPEN_ACCEPTS_RB # define POPEN_RB "rb" #else # define POPEN_RB "r" #endif #define FBUFSIZ 1024 #define INITSIZ 10 /*----------------------------------------------------------------------- * Function: *ooglglob * Description: C-shell globbing * Args: *s: the string to glob * Returns: pointer to array of pointers to expanded strings; ends * with NULL * Author: mbp * Date: Tue Aug 25 12:42:21 1992 * Notes: Invokes a subshell (/bin/csh) to do the work. * Caller should free the returned value by * first calling ooglblkfree() then free(): * * char **g; * g = ooglglob(string); * ... * ooglblkfree(g); * free(g); */ char **ooglglob(char *s) { FILE *fp; char cmd[FBUFSIZ]; vvec vp; char *c; #ifdef SIGCHLD /* Avoid NeXT pclose() bug: don't catch subprocess' SIGCHLD */ void (*oldsigchld)() = signal(SIGCHLD, SIG_DFL); #endif sprintf(cmd, GLOB_SHELL"\"echo %s\" 2>&1", s); fp = popen(cmd, POPEN_RB); if (fp == NULL) { OOGLError(1, "Could not popen(\"%s\", \"r\"): %s\n", cmd, sperror()); return NULL; } VVINIT(vp, char *, INITSIZ); while (!feof(fp)) if ((c=ftoken(fp, 2)) != NULL) *VVAPPEND(vp,char*) = strdup(c); *VVAPPEND(vp,char*) = NULL; vvtrim(&vp); pclose(fp); #ifdef SIGCHLD signal(SIGCHLD, oldsigchld); #endif return VVEC(vp,char*); } void ooglblkfree(av0) char **av0; { char **av = av0; while (*av) free(*av++); } #endif /*unix*/ geomview-1.9.5/src/lib/oogl/util/mallocp.c0000644000175000017500000000416112310110201015315 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include /* Declare malloc() */ #include "ooglutil.h" /* Declare OOGLError */ #undef malloc #undef free #undef realloc #undef calloc #undef OOG_NewE #undef OOG_RenewE #undef OOGLFree /* * Pointers needed for OOGLNew(), etc. Placed in a separate module so * non-shared-memory users needn't link with that code. */ void *OOG_CurSM = NULL; void *(*OOG_NewP)(size_t) = malloc; void (*OOGLFree)(void *) = free; void *(*OOG_RenewP)(void *, size_t) = realloc; void * OOG_NewE(int n, char *msg) { void *p; p = (*OOG_NewP)(n); if(p == NULL && n != 0) { OOGLError(1/*Fatal mem alloc*/, "OOGLNew: couldn't allocate %d bytes: %s: %s", n, msg, sperror()); exit(1); } return p; } void * OOG_RenewE(void *p, int n, char *msg) { p = (*OOG_RenewP)(p, n); if(p == NULL && n != 0) { OOGLError(1/*Fatal mem alloc*/, "OOGLRenewN: couldn't reallocate %d bytes (from %x): %s: %s", n, p, msg, sperror()); exit(1); } return p; } geomview-1.9.5/src/lib/oogl/util/ppopen.c0000644000175000017500000000664212310110201015175 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * int ppopen(char *pgm, FILE **frompgm, FILE **topgm) * int ppclose(FILE *fromcmd, FILE *tocmd) * * Like popen(), but hooks up both input and output FILE pointers to a program. * The "program" may be any valid /bin/sh command. * ppopen() returns the program's process id if successful, else 0. * If successful, ``*frompgm'' and ``*topgm'' are filled in with FILE *'s * * Take care when using this; deadlock is possible if the program writes a * large amount of data (> about 8K bytes) to its output while you're still * writing to its input. * * Typical usage might be: * FILE *frompgm, *topgm; * ppopen("polymerge", &frompgm, &topgm); * GeomFSave(g, topgm, "polymerge"); * gg = GeomFLoad(frompgm, "polymerged data"); * ppclose(topgm, frompgm); */ #include #include #include #include /* for pipe(), etc */ #include /* for bzero() */ #if defined(unix) || defined(__unix) /* Don't try to compile this for Windows */ static unsigned npps = 0; static unsigned short *pps; int ppopen(char *cmd, FILE **frompgm, FILE **topgm) { struct pipe { int r, w; } pfrom, pto; int pid; /* create the communication pipes */ pfrom.r = pfrom.w = -1; if(pipe((int*)&pfrom) < 0 || pipe((int*)&pto) < 0) { perror("Can't make pipe"); close(pfrom.r); close(pfrom.w); return 0; } switch(pid = fork()) { case -1: perror("Can't fork"); return 0; case 0: { close(pfrom.r); close(pto.w); dup2(pto.r, 0); dup2(pfrom.w, 1); execl("/bin/sh", "sh", "-c", cmd, NULL); fprintf(stderr, "Can't exec external module: "); perror(cmd); exit(1); } } close(pto.r); close(pfrom.w); *frompgm = fdopen(pfrom.r, "r"); *topgm = fdopen(pto.w, "w"); if(pfrom.r < (int)npps) { int newsize = (pfrom.r + 10)*sizeof(pps[0]); npps = pfrom.r + 10; pps = (unsigned short *) (pps ? realloc(pps, newsize) : malloc(newsize)); bzero(&pps[npps], newsize - npps*sizeof(pps[0])); pps[pfrom.r] = pid; } return pid; } int ppclose(FILE *frompgm, FILE *topgm) { #ifdef NeXT union wait w; #else int w; #endif unsigned int fd; int pid; if(frompgm == NULL) return -1; if(topgm) fclose(topgm); fd = fileno(frompgm); fclose(frompgm); if(fd < npps && pps[fd] != 0) { while((pid = wait(&w)) != pps[fd] && pid > 0) ; pps[fd] = 0; } return 0; } #endif geomview-1.9.5/src/lib/oogl/util/vvec.h0000644000175000017500000000761612310110201014646 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _GV_VVVEC_H_ #define _GV_VVVEC_H_ #include /* * Variable-sized arrays ("vectors"). */ static inline void vvinit(vvec *v, int elsize, int minelems); static inline void vvuse(vvec *v, void *buf, int allocated); static inline void vvzero(vvec *v); static inline void vvtrim(vvec *v); static inline void vvfree(vvec *v); static inline void vvneeds(vvec *v, int needed); static inline void *vvindex(vvec *v, int index); static inline void vvcopy(vvec *src, vvec *dest); static inline void vvinit(vvec *v, int elsize, int minelems) { v->elsize = elsize; v->count = 0; v->malloced = 0; v->dozero = 0; v->allocated = -minelems; v->base = NULL; } static inline void vvuse(vvec *v, void *buf, int allocated) { vvfree(v); v->base = buf; v->allocated = allocated; } static inline void vvzero(vvec *v) { v->dozero = 1; if(v->allocated > v->count) memset(v->base + v->elsize*v->count, 0, v->elsize * (v->allocated - v->count)); } /* * Trim vvec to minimum size; ensure its buffer is malloced if it wasn't. */ static inline void vvtrim(vvec *v) { int newalloc = (v->count > 0 ? v->count : 1); int want = newalloc * v->elsize; static char why[] = "trimming vvec"; (void)why; if(!v->malloced) { void *base = OOGLNewNE(char, want, why); if(v->base) memcpy(base, v->base, want); else memset(base, '\0', want); v->base = base; v->malloced = 1; } else if(v->allocated > v->count) { v->base = (void *)OOGLRenewNE(char, v->base, want, why); } else return; v->allocated = newalloc; } static inline void vvfree(vvec *v) { if(v->malloced) { OOGLFree(v->base); v->base = NULL; v->malloced = 0; } } static inline void vvneeds(vvec *v, int needed) { if(needed > v->allocated) { int had = v->allocated; int want = needed + (needed>>2) + 1; if(had < 0) { if(want < -had) want = -had; had = 0; } else { int next = had + (had>>1) + 2; if(next > needed) want = next; } if(v->malloced) { v->base = OOGLRenewNE(char, v->base, want * v->elsize, "extending vvec"); if(had > v->count) had = v->count; } else { void *was = v->base; v->base = OOGLNewNE(char, want * v->elsize, "allocating vvec"); if(v->count > 0 && had > 0) memcpy(v->base, was, (v->countcount:had) * v->elsize); } v->allocated = want; v->malloced = 1; if(v->dozero) memset(v->base + v->elsize * had, 0, v->elsize * (want-had)); } } static inline void * vvindex(vvec *v, int index) { if(index < 0) { OOGLError(1, "negative array index: %d", index); return v->base; } if(index >= v->allocated) vvneeds(v, index+1); if(index >= v->count) v->count = index+1; return v->base + index*v->elsize; } static inline void vvcopy(vvec *src, vvec *dest) { char *newbase; if(src->base == NULL) { *dest = *src; } else { vvneeds(dest, src->allocated); newbase = dest->base; *dest = *src; dest->base = newbase; memcpy(dest->base, src->base, dest->allocated * dest->elsize); } } #endif geomview-1.9.5/src/lib/oogl/util/create.h0000644000175000017500000001331312310110201015135 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef CR_DEF #define CR_DEF #include /* So we only have to do it once, here. */ /* This stuff should be an enum, not a define */ /* Generic attributes */ #define CR_END 0 /* Marks end of create list (any object) */ #define CR_COPY 1 /* no argument (any object) */ #define CR_NOCOPY 2 /* no argument (any object) */ /* Generic Geom attributes */ #define CR_APPEAR 8 /* marks beginning of Appearance create list) */ #define CR_POINT 9 /* Point3 [] (any Geom with vertices) */ #define CR_POINT4 18 /* HPoint3 [] (any Geom with 4D vertices) */ #define CR_NORMAL 10 /* Point3 [] (any Geom w/per-vtx normals) */ #define CR_COLOR 11 /* ColorA [] (any Geom w/per-vtx colors) */ #define CR_OPACITY 12 /* XXX Not used yet XXX */ #define CR_FLAG 13 /* int flags (patch,Mesh,PolyList,Quad) */ #define CR_FLAGMERGE 14 /* int flags, int flagmask */ /* Control of 'override' mask for mergeable things (Appearance) */ #define CR_OVERMERGE 15 /* int override, int ovmask */ /* BBox attributes */ #define CR_MAX 16 /* Point3 * (BBox) */ #define CR_MIN 17 /* Point3 * (BBox) */ #define CR_4MAX 1492 /* HPoint3 * (BBox) */ #define CR_4MIN 1066 /* HPoint3 * (BBox) */ #define CR_NMIN 2048 /* HPointN * (BBox) */ #define CR_NMAX 2049 /* HPointN * (BBox) */ #define CR_NCENTER 2050 /* HPointN * (return NDcenter of BBox) */ #define CR_4D 19 /* is this object a true 4D item? */ /* Hierarchy object (Inst, List, TList) attributes */ #define CR_AXIS 20 /* Transform (Inst) */ #define CR_AXISHANDLE 28 /* Handle * to TransObj (for Inst) */ #define CR_NDAXIS 202 /* Transform (Inst) */ #define CR_NDAXISHANDLE 203 /* Handle * to NTransObj (for Inst) */ #define CR_GEOM 21 /* Geom *child (Inst,List) */ #define CR_GEOMHANDLE 22 /* Handle *childname (Inst,List) */ #define CR_TLIST 23 /* Geom *tlist (Inst,TList) */ #define CR_TLISTHANDLE 24 /* Handle *tlistname (Inst,TList) */ #define CR_TXTLIST 204 /* Geom *txtlist (Inst) */ #define CR_TXTLISTHANDLE 205 /* Handle *txtlistname (Inst) */ #define CR_ELEM 25 /* Transform [] (TList) */ #define CR_NELEM 26 /* int nxforms(TList), int nquads (Quad)*/ #define CR_CDR 27 /* List * (List) (obsolescent?) */ #define CR_HANDLE_GEOM 29 /* Handle *, Geom * (Inst, List) */ #define CR_CAR CR_GEOM /* Geom * (List) (obsolescent) */ #define CR_UNIT CR_GEOM /* Geom * (Inst) (obsolescent) */ #define CR_LOCATION 201 /* int (Inst) L_LOCAL, L_CAMERA, ...*/ /* Mesh attributes */ #define CR_NU 30 /* int nu (Mesh) */ #define CR_NV 31 /* int nv (Mesh) */ #define CR_UWRAP 32 /* int uwrapped (Mesh) */ #define CR_VWRAP 33 /* int vwrapped (Mesh) */ #define CR_U 34 /* Point3 texturecoords[] (Mesh) */ #define CR_UMIN 35 /* int umin (Mesh) [submesh] */ #define CR_UMAX 36 /* int umax (Mesh) */ #define CR_VMIN 37 /* int vmin (Mesh) */ #define CR_VMAX 38 /* int vmax (Mesh) */ /* Patch attributes */ #define CR_DEGU 40 /* int u_degree (patches) */ #define CR_DEGV 41 /* int v_degree (patches) */ #define CR_MESH 42 /* Mesh * (patches) */ #define CR_DIM 43 /* int vertex_dim (= 3 or 4) (patches) */ #define CR_ST 44 /* struct { float s, t; } stcoords[4]; */ /* (texture coords at corners (Mesh,Patch) */ #define CR_MESHDIM 45 /* mesh surface dimension (typ. 2) */ #define CR_MESHSIZE 46 /* int meshsize[meshdim] */ /* Vect attributes */ #define CR_NVECT 48 /* int nvectors (Vect) */ #define CR_NVERT 49 /* int nvertices (Vect) */ #define CR_NCOLR 50 /* int ncolors (Vect) */ #define CR_VECTC 51 /* short nverts_per_vector[nvect] (Vect)*/ #define CR_COLRC 52 /* short ncolors_per_vector[nvect] (Vect)*/ /* PolyList attributes */ #define CR_NPOLY 56 /* int npolygons (PolyList) */ /* CR_NVERT (48) int nvertperpol[npoly] */ #define CR_VERT 57 /* int vertindex[sum(nvertperpol[])] */ #define CR_POLYNORMAL 58 /* Point3 facenormal[npoly] */ #define CR_POLYCOLOR 59 /* ColorA facecolor[npoly] */ #define CR_POLYFLAGS 300 /* per poly concave/not-flat flags */ /* Sphere attributes */ #define CR_CENTER 60 /* HPoint3 *center (also bbox) */ #define CR_RADIUS 61 /* float radius */ #define CR_SPACE 64 /* Space - TM_EUCLIDEAN is default */ #define CR_NENCOMPASS_POINTS 65 /* int - Number of points to be * put inside sphere */ #define CR_ENCOMPASS_POINTS 66 /* Hpoint3 * - points to be inside * sphere (for bounding spheres */ /* CR_AXIS 20 Transform to apply to points before making bounding sphere */ #define CR_SPHERETX 67 /* texture mapping for sphere */ /* tokens for Camera moved to camera.h */ /* tokens for Appearances, Lights, Materials moved to shade/appearance.h */ #define CR_POLICE 62 /* enforce strong checking on input data? */ #define CR_NOPOLICE 63 /* enforce strong checking on input data? */ #endif geomview-1.9.5/src/lib/oogl/util/fsa.h0000644000175000017500000000232112310110201014440 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef FSA_H #define FSA_H typedef struct Fsa_s *Fsa; extern Fsa fsa_initialize(Fsa, void *); extern void fsa_delete(Fsa); extern void *fsa_install(Fsa fsa, const char *s, void *v); extern void *fsa_parse(Fsa fsa, const char *s); #endif /* ! FSA_H */ geomview-1.9.5/src/lib/oogl/util/ooglutil.h0000644000175000017500000002764112310110201015541 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef OOGLUTILDEF #define OOGLUTILDEF #include #include #include "iobuffer.h" #ifdef _WIN32 # define M_PI 3.14159265358979323 extern int finite(double v); extern int strcasecmp(char *s1, char *s2); #endif /* * Definition so that (obsolete Irix 3) SGIs won't barf on member function prototypes. */ #ifdef no_prototypes #define P(foo) () #else #define P(foo) foo #endif #define COUNT(array) (int)(sizeof(array)/sizeof(array[0])) /* * Public definitions for miscellaneous useful OOGL internal stuff. */ #define OOGLMagic(key, vers) (0x9c800000 | (((key)&0x7f)<<16) | ((vers)&0xffff) ) #define OOGLIsMagic(magic) (((magic) & 0xff800000) == 0x9c800000) /* * Memory allocation */ #ifndef OOG_NewP extern void *(*OOG_NewP)(size_t); #endif #ifndef OOG_RenewP extern void *(*OOG_RenewP)(void *, size_t); #endif #ifndef OOGLFree extern void (*OOGLFree)(void *); #endif #ifndef OOG_NewE extern void *OOG_NewE(int, char *); #endif #ifndef OOG_RenewE extern void *OOG_RenewE(void *, int, char *); #endif static inline void *_OOGLNew(size_t size) { return OOG_NewP(size); } static inline void *_OOGLRenew(void *p, size_t size) { return OOG_RenewP(p, size); } #define OOGLNew(t) (t *)_OOGLNew(sizeof(t)) #define OOGLNewN(t,N) (t *)_OOGLNew(sizeof(t)*(N)) #define OOGLRenewN(t,p,N) (t *)_OOGLRenew(p, sizeof(t)*(N)) #define OOGLRealloc(t,p) (t *)_OOGLRenew(p, sizeof(t)) #define OOGLNewE(t, errmsg) (t *)OOG_NewE(sizeof(t), errmsg) #define OOGLNewNE(t,N, errmsg) (t *)OOG_NewE(sizeof(t)*(N), errmsg) #define OOGLRenewNE(t,p,N, errmsg) (t *)OOG_RenewE(p, sizeof(t)*(N), errmsg) /* * Backward compatibility */ #define GeomNew(t) OOGLNew(t) #define GeomNewN(t,N) OOGLNewN(t,N) #define GeomFree(p) OOGLFree(p) #define GeomError OOGLError /* * Error handling */ extern char *_GFILE; /* Name of file where error is found */ extern int _GLINE; /* Line number in file where error is found */ extern int OOGL_Errorcode; /* Unique integer error code */ extern void OOGLWarn (char *fmt, ...); extern const char *sperrno(unsigned int); extern const char *sperror(void); /* Kludge for obtaining file name and line number of error: */ #define OOGLError (_GFILE= __FILE__, _GLINE=__LINE__,0)?0:_OOGLError extern int _OOGLError(int, char *fmt, ...); extern void OOGLSyntax(IOBFILE *, char *fmt, ...); /* Bit fields in error codes */ #define OE_VERBOSE 0x1 #define OE_FATAL 0x2 /* * Variable-sized arrays ("vectors"). Manipulates variables of type "vvec". * Maintains the data they point to, but doesn't allocate the vvec's themselves; * typical use might be * vvec myvec; * VVINIT(myvec, float, 10); * while( ... ) { * *VVAPPEND(myvec, float) = something; * } * for(i = 0; i < VVSIZE(myvec); i++) * ... VVEC(myvec, float)[i] ... * */ typedef struct vvec { char *base; /* The real data */ int count; /* Number of elements in use (indices 0..count-1) */ int allocated; /* Number of elements allocated */ int elsize; /* sizeof(element type) */ char dozero; /* Zero-fill all new elements */ char malloced; /* "base" has been malloced */ char spare1, spare2; /* for future extensions */ } vvec; #include /* inline vv-functions */ /* * Macros take 'vvec' arguments, while functions take addresses of vvec's. * VVINIT() : initialize new empty array; first malloc will grab >= 'minelems'. * VVZERO() : request that all newly allocated elements be cleared to zeros * VVINDEX() : return address of index'th element, ensuring that it exists. * VVAPPEND() : increments array size, returning address of new last element * VVEC() : returns address of array base; VVEC()[i] is the i'th element * assuming that its existence was ensured by earlier call to * VVAPPEND() or VVINDEX() or vvneeds(). * VVCOUNT() : number of valid elements in array. Maintained by user. */ #define VVINIT(vv,type,minelems) vvinit(&(vv), sizeof(type), minelems) #define VVEC(vv, type) ((type *)((vv).base)) #define VVCOUNT(vv) (vv).count #define VVINDEX(vv,type,index) ((type *)vvindex(&(vv), (index))) #define VVAPPEND(vv, type) VVINDEX(vv, type, (vv).count++) /* Functions take addresses of vvec's. Besides the above, there are * vvtrim() : trim allocated but unused space (beyond VVCOUNT()'th element). * vvfree() : free malloced array. * vvneeds(): ensure that at least this many elements are allocated * vvzero() : all newly allocated elements will be filled with binary zeros * vvuse() : Use the given non-malloced buffer until more room is needed; * call vvuse() after vvinit() but before allocating anything. * vvcopy() : copies one vvec into another, allocating space in the * destination to accommodate the data and copying everything. */ static inline void vvinit(vvec *v, int elsize, int minelems); static inline void vvuse(vvec *v, void *buf, int allocated); static inline void vvtrim(vvec *v); /* Trim allocated but unused data */ static inline void vvfree(vvec *v); /* Free all malloced data */ static inline void vvneeds(vvec *v, int needed); static inline void *vvindex(vvec *v, int index); static inline void vvzero(vvec *v); static inline void vvcopy(vvec *src, vvec *dest); /* * File-I/O utility routines */ /* * int iobfnextc(IOBFILE *f, int flags) * Advances f to the next "interesting" character and * returns it. The returned char is ungetc'ed so the next getc() * will yield the same value. * Interesting depends on flags: * 0 : Skip blanks, tabs, newlines, and comments (#...\n). * 1 : Skip blanks, tabs, and comments, but newlines are interesting * (including the \n that terminates a comment). * 2 : Skip blanks, tabs, and newlines, but stop at #. * 3 : Skip blanks and tabs but stop at # or \n. * * int * iobfexpectstr(IOBFILE *file, char *string) * Expect the given string to appear immediately on file. * Return 0 if the complete string is found, * else the offset+1 of the last matched char within string. * The first unmatched char is ungetc'd. * * int * iobfexpecttoken(IOBFILE *file, char *string) * Expect the given string to appear on the file, possibly after * skipping some white space and comments. * Return 0 if found, else the offset+1 of last matched char in string. * The first unmatched char is ungetc'd. * * char *iobftoken(IOBFILE *f, int flags) * Skips uninteresting characters with fnextc(f, flags), * then returns a "token" - string of consecutive interesting characters. * Returns NULL if EOF is reached with no token, or if * flags specifies stopping at end-of-line and this is encountered with * no token found. * The token is effectively statically allocated and will be * overwritten by the next ftoken() call. * * int iobfgetnd(file, ndouble, doublep, binary) * Read an array of doubles from a file in "ascii" or "binary" format. * Returns number of doubles successfully read, should = nfloats. * "Binary" means "Bit-Endian IEEE 64-bit floating-point" format. * * int iobfgetnf(file, nfloats, floatp, binary) * Read an array of floats from a file in "ascii" or "binary" format. * Returns number of floats successfully read, should = nfloats. * "Binary" means "Big-Endian IEEE 32-bit floating-point" format. * * int iobfgetni(IOBFILE *file, int nints, int *intsp, int binary) * Read an array of ints from a file in "ascii" or "binary" format. * Returns number of ints successfully read, should = nints. * "Binary" means "32-bit big-endian" integer format. * * int iobfgetns(IOBFILE *file, int nshorts, short *intsp, int binary) * Read an array of shorts from a file in "ascii" or "binary" format. * Returns number of shorts successfully read, should = nints. * "Binary" means "16-bit big-endian" integer format. * * int iobfgettransform(IOBFILE *f, * int ntransforms, float *transforms, int binary) * Reads 4x4 matrices from IOBFILE. Returns the number of matrices found, * up to ntransforms. Returns 0 if no numbers are found. * On finding incomplete matrices (not a multiple of 16 floats) * returns -1, regardless of whether any whole matrices were found. * In ASCII (binary==0) mode, matrices are read in conventional order * which is the transpose of the internal form. Binary mode reads * 32-bit IEEE floats in internal order. * * int fputtransform(FILE *f, int ntransforms, float *transforms, int binary) * Writes 4x4 matrices to FILE. Returns the number written, i.e. * ntransforms unless an error occurs. See fgettransform() for format. * */ #define NODATA -2 /* async_fnextc() and async_getc() return NODATA if * none is immediately available */ extern int async_iobfgetc(IOBFILE *f); extern int async_iobfnextc(IOBFILE *f, int flags); extern char *iobfcontext(IOBFILE *f); extern char *iobftoken(IOBFILE *iobf, int flags); extern char *iobfquotetoken(IOBFILE *iobf, int flags, int *quote); extern char * iobfquotedelimtok(const char *delims, IOBFILE *iobf, int flags, int *quote); extern char *iobfdelimtok(const char *delims, IOBFILE *iobf, int flags); extern int iobfescape(IOBFILE *f); extern int iobfexpectstr(IOBFILE *iobf, char *str); extern int iobfexpecttoken(IOBFILE *iobf, char *str); extern int iobfgetnd(IOBFILE *f, int maxd, double *dv, int binary); extern int iobfgetnf(IOBFILE *f, int maxf, float *fv, int binary); extern int iobfgetni(IOBFILE *f, int maxi, int *iv, int binary); extern int iobfgetns(IOBFILE *f, int maxs, short *sv, int binary); extern int iobfgettransform(IOBFILE *iobf, int ntrans, float *trans, int bin); extern int iobfhasdata(IOBFILE *f); extern int iobfnextc(IOBFILE *f, int flags); extern char *fdelimtok(const char *delims, FILE *f, int flags); extern int fescape(FILE *f); extern int fexpectstr(FILE *f, char *str); extern int fexpecttoken(FILE *f, char *str); extern int fgetnd(FILE *f, int maxd, double *dv, int binary); extern int fgetnf(FILE *f, int maxf, float *fv, int binary); extern int fgetni(FILE *f, int maxi, int *iv, int binary); extern int fgetns(FILE *f, int maxs, short *sv, int binary); extern int fgettransform(FILE *f, int ntrans, float *trans, int bin); extern int fnextc(FILE *f, int flags); extern char *ftoken(FILE *f, int flags); extern int fputnf(FILE *, int nfloats, float *floatp, int binary); extern int fputtransform(FILE *, int ntrans, float *transforms, int binary); extern char *findfile(char *superfile, char *file); extern void filedirs(char *dirs[]); extern char **getfiledirs(); char *envexpand(char *s); extern char **ooglglob(char *s); extern void ooglblkfree(char **av0); /* gettimeofday, where WHEN may be NULL */ struct timeval *timeof(struct timeval *when); /* Add offset to base, yielding result */ void addtime(struct timeval *result, struct timeval *base, double offset); /* Time in second since base */ double timeoffset(struct timeval *base, struct timeval *when); /* * macro for grabbing the next value from either a region of * memory or a va_list. * al should be the address of the va_list * p should be the address of a poiner to the region of memory, * or NULL, which means use the va_list instead. */ #define OOGL_VA_ARG(type,al,p) (p ? ((type*)((*p)+=sizeof(type)))[-1] \ : (va_arg (*al, type))) #include "porting.h" #endif geomview-1.9.5/src/lib/oogl/util/porting.h0000644000175000017500000000501512310110201015354 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * porting.h: Declarations for porting to brain-damaged operating systems. * * ooglutil.h includes this file */ #ifndef GV_PORTING_H #define GV_PORTING_H #if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_SYS_TYPE_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_GETOPT_H # include #endif #if HAVE_UNISTD_H /* getopt() on AIX */ # include #endif #if !HAVE_M_PI # define M_PI 3.14159265358979323846 /* pi */ #endif #if !HAVE_BCOPY static inline void bcopy(char *src, char *dst, int len) { memcpy(dst, src, len); } #endif #if !HAVE_BZERO static inline void bzero(char *mem, int len) { memset(mem, 0, len); } #endif #if !HAVE_FINITE static inline int finite(double v) { return (! (v <= 0.0 || v > 0.0)); } #endif #if !HAVE_DECL_STRCASECMP extern int strcasecmp(char *s1, char *s2); #endif #if !HAVE_DECL_STRNCASECMP extern int strncasecmp(char *a, char *b, int n); #endif #if !HAVE_DECL_ACOSH double acosh(double c); #endif #if !HAVE_DECL_STRDUP extern char *strdup(const char *); #endif #if !HAVE_DECL_PUTENV extern putenv(char *name); #endif /* supply missing declaration for fmemopen */ #if !HAVE_DECL_FMEMOPEN extern FILE *fmemopen(void *buf, size_t buflen, char *mode); #endif #if !HAVE_DECL_GETOPT extern int getopt(int argc, char * const argv[], const char *optstring); #endif #if !HAVE_DECL_OPTARG extern char *optarg; #endif #if !HAVE_DECL_OPTIND extern int optind; #endif #if !HAVE_DECL_OPTERR extern int opterr; #endif #if !HAVE_DECL_OPTOPT extern int optopt; #endif #endif /* GV_PORTING_H */ geomview-1.9.5/src/lib/oogl/util/ray.h0000644000175000017500000000217112310110201014465 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ typedef struct { Point3 o, d; Float dist; } Ray; extern void RayTransform( Ray *ray, Transform3 ); extern void RayNormalize( Ray *ray ); #define RAY_EPSILON 1e-5 geomview-1.9.5/src/lib/oogl/util/surf.h0000644000175000017500000000407512310110201014656 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "material.h" #include "3d.h" /*********************************************************************** * a surf is a primitive bit of surface, conveys the geometrical * information about an intersection ***********************************************************************/ #define SURF_NEEDS_SET(p, n, s) ((n)&(p) && !((s)&(p))) #define SURF_SET(p, f) ((f) |= (p)) #define SURF_NONE 0x0 #define SURF_P 0x1 #define SURF_N 0x2 #define SURF_NG 0x4 #define SURF_DPDU 0x8 #define SURF_DPDV 0x10 #define SURF_UV 0x20 #define SURF_DUDV 0x40 #define SURF_ST 0x80 #define SURF_I 0x100 #define SURF_CS 0x200 #define SURF_OS 0x400 typedef struct surf { int flag ; /* copied mostly from Renderman */ Point3 P ; /* location of the point */ Point3 dPdu ; /* derivatives */ Point3 dPdv ; Point3 N ; /* shading normal vector */ Point3 Ng ; /* geometric normal */ Point2 uv ; /* location on the surface */ Point2 dudv ; /* derivatives of u, v */ Point2 st ; /* texture coordinates */ Point3 I ; /* incident ray direction */ Material mat; Transform3 T; Geom *geom; } Surf ; geomview-1.9.5/src/lib/oogl/util/iobuffer.c0000644000175000017500000005047612310110201015501 00000000000000/* * Copyright (C) 2006-2008 Claus-Justus Heine This program is free software; you can redistribute 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; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * This file implements setpos()/getpos() facilities for non-seekable * files by generating a secondary dynamic file buffering of arbitrary * size on top of stdio. */ /* As a special exception the author of this files permits the * distribution of this software with Geomview. As long as this file * is distributed with Geomview, the conditions of the GNU Lesser * Public Licence apply. See the file "COPYING" in the top-level * directory. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #define _FILE_OFFSET_BITS 64 #define _LARGEFILE64_SOURCE #include #include #include #include #include #include #if HAVE_FCNTL_H && HAVE_FCNTL # include static const int o_nonblock = #ifdef O_NONBLOCK O_NONBLOCK | #endif #ifdef O_NDELAY O_NDELAY | #endif #ifdef FNONBLK FNONBLK | #endif #ifdef FNDELAY FNDELAY | #endif 0; #if !defined(O_NONBLOCK) && !defined(O_NDELAY) \ && !defined(FNONBLK) && !defined(FNDELAY) # error Do not know how to achieve non-blocking IO #endif #endif #if HAVE_OFF64_T && HAVE_LSEEK64 # define HAVE_SOME_LSEEK 1 typedef off64_t offset_t; # define LSEEK lseek64 # ifndef HAVE_DECL_LSEEK64 extern off64_t lseek64(int fd, off64_t offset, int whence); # endif #elif HAVE_LOFF_T && HAVE_LLSEEK # define HAVE_SOME_LSEEK 1 typedef loff_t offset_t; # define LSEEK llseek # ifndef HAVE_DECL_LLSEEK loff_t llseek(int fd, loff_t offset, int whence); # endif #elif HAVE_OFF_T && HAVE_LSEEK # define HAVE_SOME_LSEEK 1 typedef off_t offset_t; # define LSEEK lseek # ifndef HAVE_DECL_LSEEK off_t lseek(int fd, off_t offset, int whence); # endif #endif #define POSIX_SHORTCUT (HAVE_READ && HAVE_SOME_LSEEK) #include "iobuffer.h" #ifndef DEBUG # define DEBUG 0 #endif #ifndef min # define min(a, b) (((a) <= (b)) ? (a) : (b)) #endif #ifndef BUFSIZ # define BUFFER_SIZE 8192 #else # define BUFFER_SIZE BUFSIZ #endif typedef struct IOBuffer { struct IOBuffer *next; char buffer[BUFFER_SIZE]; } IOBuffer; typedef struct IOBufferList { IOBuffer *buf_head; /**< Head of linked list of buffers */ IOBuffer *buf_tail; /**< Pointer to tail of buffer list */ IOBuffer *buf_ptr; /**< Pointer to current buffer */ size_t buf_pos; /**< Byte pos into buf_ptr */ size_t tail_size; /**< Size used inside *buf_ptr */ size_t tot_pos; size_t tot_size; } IOBLIST; struct IOBFILE { FILE *istream; /**< The underlying stdio FILE */ IOBLIST ioblist; IOBLIST ioblist_mark; int can_seek:1; int mark_wrap:1; /**< Set when the buffer no longer covers the position of the mark. */ int mark_set:1; int eof:2; int ungetc; fpos_t stdiomark; /**< stdio mark interface */ #if POSIX_SHORTCUT offset_t posixmark; /**< using read(), write() and a flavour of lseek() */ #endif size_t mark_pos; /**< Offset into our buffer structures (pipe, tty) */ int mark_ungetc; /**< Copy of what ungetc was when setmark() was called */ int fd; #if HAVE_FCNTL int fflags; #endif #if DEBUG size_t read_count; #endif }; #if DEBUG static int n_total_buffers; static int max_total_buffers; static int n_fopen; static int max_fopen; static int n_fileopen; static int max_fileopen; static int n_popen; static int max_popen; #endif static void iob_release_buffer(IOBLIST *ioblist) { IOBuffer *iob, *prev; prev = ioblist->buf_head; iob = prev->next; prev->next = NULL; while (iob) { prev = iob; iob = iob->next; free(prev); #if DEBUG n_total_buffers --; #endif } memset(ioblist, 0, sizeof(*ioblist)); } static void iob_init_buffer(IOBLIST *ioblist) { ioblist->buf_head = malloc(sizeof(IOBuffer)); #if DEBUG n_total_buffers ++; if (n_total_buffers > max_total_buffers) { max_total_buffers = n_total_buffers; fprintf(stderr, "MAX BUFFERS: %d\n", max_total_buffers); } #endif ioblist->buf_head->next = ioblist->buf_head; ioblist->buf_ptr = ioblist->buf_head; ioblist->buf_tail = ioblist->buf_head; ioblist->tot_pos = 0; ioblist->tot_size = 0; ioblist->tail_size = 0; ioblist->buf_pos = 0; } static void iob_copy_buffer(IOBLIST *to, IOBLIST *from) { IOBuffer *iob; iob_init_buffer(to); for (iob = from->buf_head; iob->next != from->buf_head; iob = iob->next) { if (iob == from->buf_ptr) { to->buf_ptr = to->buf_tail; } memcpy(to->buf_tail->buffer, iob->buffer, BUFFER_SIZE); to->buf_tail->next = malloc(sizeof(IOBuffer)); #if DEBUG n_total_buffers ++; if (n_total_buffers > max_total_buffers) { max_total_buffers = n_total_buffers; fprintf(stderr, "MAX BUFFERS: %d\n", max_total_buffers); } #endif to->buf_tail = to->buf_tail->next; to->buf_tail->next = to->buf_head; } to->tot_pos = from->tot_pos; to->tot_size = from->tot_size; to->tail_size = from->tail_size; to->buf_pos = from->buf_pos; } FILE *iobfile(IOBFILE *iobf) { return iobf ? iobf->istream : NULL; } int iobfileno(IOBFILE *iobf) { return iobf ? iobf->fd : -1; } IOBFILE *iobfileopen(FILE *istream) { IOBFILE *iobf; if (istream == NULL) { return NULL; } iobf = calloc(1, sizeof(IOBFILE)); iobf->istream = istream; iobf->fd = fileno(istream); iobf->ungetc = EOF; if (iobf->fd >= 0) { /* Determine whether we have file positioning support */ if (lseek(iobf->fd, 0, SEEK_CUR) != -1 && !isatty(iobf->fd)) { iobf->can_seek = -1; } /* If we have read(2) and write(2), then we disable stdio * completely and use the system calls directly. */ #if SETVBUF_REVERSED setvbuf(istream, _IONBF, NULL, 0); #else setvbuf(istream, NULL, _IONBF, 0); #endif #if HAVE_FCNTL iobf->fflags = fcntl(iobf->fd, F_GETFL); if (iobf->fflags != -1 && (iobf->fflags & o_nonblock)) { iobf->fflags &= ~o_nonblock; if (fcntl(iobf->fd, F_SETFL, iobf->fflags) < 0) { fprintf(stderr, "iobfileopen(): unable to clear O_NONBLOCK: \"%s\"\n", strerror(errno)); } } } else { iobf->fflags = -1; #endif } iob_init_buffer(&iobf->ioblist); iobf->ungetc = EOF; #if DEBUG n_fileopen++; if (n_fileopen > max_fileopen) { max_fileopen = n_fileopen; fprintf(stderr, "max fileopen: %d\n", max_fileopen); } #endif return iobf; } IOBFILE *iobfopen(const char *name, const char *mode) { FILE *stream; if (strchr(mode, 'a') != NULL || strchr(mode, 'w') != NULL) { fprintf(stderr, "iobfopen(): Write mode is unsupported\n"); return NULL; } stream = fopen(name, mode); if (stream == NULL) return NULL; #if DEBUG n_fopen++; if (n_fopen > max_fopen) { max_fopen = n_fopen; fprintf(stderr, "max fopen: %d\n", max_fopen); } #endif return iobfileopen(stream); } int iobfileclose(IOBFILE *iobf) { iob_release_buffer(&iobf->ioblist); if (iobf->ioblist_mark.buf_head) { iob_release_buffer(&iobf->ioblist_mark); } free(iobf); #if DEBUG n_fileopen--; #endif return 0; } int iobfclose(IOBFILE *iobf) { int result; result = fclose(iobf->istream); (void)iobfileclose(iobf); #if DEBUG n_fopen--; #endif return result; } #if HAVE_POPEN IOBFILE *iobpopen(const char *cmd, const char *mode) { FILE *stream; if (strchr(mode, 'a') != NULL || strchr(mode, 'w') != NULL) { fprintf(stderr, "iobfopen(): Write mode is unsupported\n"); return NULL; } stream = popen(cmd, mode); if (stream == NULL) return NULL; #if DEBUG n_popen++; if (n_popen > max_popen) { max_popen = n_popen; fprintf(stderr, "max popen: %d\n", max_popen); } #endif return iobfileopen(stream); } int iobpclose(IOBFILE *iobf) { int result; result = pclose(iobf->istream); (void)iobfileclose(iobf); #if DEBUG n_popen--; #endif return result; } #endif long iobftell(IOBFILE *iobf) { long pos; if (!iobf->can_seek) { return ~0L; } #if POSIX_SHORTCUT pos = (long)LSEEK(iobf->fd, 0, SEEK_CUR); #else pos = ftell(iobf->istream); #endif return pos < 0 ? pos : (long)(pos - (iobf->ioblist.tot_size - iobf->ioblist.tot_pos)); } int iobfseek(IOBFILE *iobf, long offset, int whence) { if (iobf->can_seek) { #if POSIX_SHORTCUT if ((long)LSEEK(iobf->fd, (offset_t)offset, whence) < 0) { return -1; } #else if (fseek(iobf->istream, offset, whence) != 0) { return -1; } #endif iob_release_buffer(&iobf->ioblist); iob_init_buffer(&iobf->ioblist); return 0; } return -1; } char *iobfgets(char *s, int size, IOBFILE *iobf) { char *p = s; int c = 0; while (--size) { *p++ = c = iobfgetc(iobf); if (c == '\n' || c == EOF) { break; } } if (c == EOF) { p--; } *p = '\0'; if (s == p && size) { return NULL; } else { return s; } } /* Copy the buffer contents between tot_pos and tot_pos - size t * ptr */ size_t iobfgetbuffer(IOBFILE *iobf, void *ptr, size_t size, int direction) { IOBLIST *ioblist = &iobf->ioblist; IOBuffer *iob; int skip, i; size_t offset, cpsz, rval, tot_space = ioblist->tot_size - ioblist->tot_pos; char *buf = ptr; if (iobf->ungetc != EOF) { ++tot_space; } if (ptr == NULL) { return direction < 0 ? ioblist->tot_pos : tot_space; } if (direction < 0) { rval = size = min(size, ioblist->tot_pos); skip = (ioblist->tot_pos - size) / BUFFER_SIZE; for (i = 0, iob = ioblist->buf_head; i < skip; iob = iob->next, i++); offset = (ioblist->tot_pos - size) % BUFFER_SIZE; cpsz = min(size, BUFFER_SIZE - offset); memcpy(buf, iob->buffer + offset, cpsz); buf += cpsz; size -= cpsz; while (size) { iob = iob->next; cpsz = min(size, BUFFER_SIZE); memcpy(buf, iob->buffer, cpsz); buf += cpsz; size -= cpsz; } } else { rval = size = min(size, tot_space); if (size > 0 && iobf->ungetc != EOF) { *buf++ = iobf->ungetc; --size; } iob = ioblist->buf_ptr; offset = ioblist->buf_pos; cpsz = min(size, BUFFER_SIZE - offset); memcpy(buf, iob->buffer + offset, cpsz); size -= cpsz; buf += cpsz; while (size) { iob = iob->next; cpsz = min(size, BUFFER_SIZE); memcpy(buf, iob->buffer, cpsz); buf += cpsz; size -= cpsz; } } return rval; } static size_t iobfread_buffer(void *ptr, size_t size, IOBFILE *iobf) { IOBLIST *ioblist = &iobf->ioblist; size_t tot_space, rq_sz, rq_sz_pos, rd_sz; char *buf = ptr; tot_space = ioblist->tot_size - ioblist->tot_pos; if (iobf->ungetc != EOF) { ++tot_space; } rq_sz = min(size, tot_space); if (rq_sz == 0) { return 0; } rd_sz = 0; if (iobf->ungetc != EOF) { buf[0] = iobf->ungetc & 0xff; iobf->ungetc = EOF; ++buf; ++rd_sz; --rq_sz; #if DEBUG --iobf->read_count; #endif } while (rq_sz) { rq_sz_pos = min(rq_sz, BUFFER_SIZE - ioblist->buf_pos); memcpy(buf, ioblist->buf_ptr->buffer + ioblist->buf_pos, rq_sz_pos); ioblist->buf_pos += rq_sz_pos; ioblist->tot_pos += rq_sz_pos; buf += rq_sz_pos; rd_sz += rq_sz_pos; rq_sz -= rq_sz_pos; if (ioblist->buf_pos == BUFFER_SIZE && ioblist->buf_ptr != ioblist->buf_tail) { /* advance to next buffer */ ioblist->buf_ptr = ioblist->buf_ptr->next; ioblist->buf_pos = 0; if ((!iobf->mark_set || iobf->can_seek) && ioblist->buf_head->next->next != ioblist->buf_head) { /* Release buffers no longer needed. */ ioblist->buf_tail->next = ioblist->buf_head->next; free(ioblist->buf_head); #if DEBUG n_total_buffers --; #endif ioblist->buf_head = ioblist->buf_tail->next; ioblist->tot_pos -= BUFFER_SIZE; ioblist->tot_size -= BUFFER_SIZE; } } } return rd_sz; } static void iob_check_space(IOBFILE *iobf) { IOBLIST *ioblist = &iobf->ioblist; if (ioblist->tail_size < BUFFER_SIZE) { return; } if ((!iobf->can_seek && iobf->mark_set) || ioblist->buf_head->next == ioblist->buf_head) { /* allocate up to two buffers in normal operation and as many as * needed for files without seek capabilities. */ ioblist->buf_tail->next = malloc(sizeof(IOBuffer)); #if DEBUG n_total_buffers ++; if (n_total_buffers > max_total_buffers) { max_total_buffers = n_total_buffers; fprintf(stderr, "MAX BUFFERS: %d\n", max_total_buffers); } #endif ioblist->buf_tail = ioblist->buf_tail->next; ioblist->buf_tail->next = ioblist->buf_head; ioblist->tail_size = 0; } else { /* rotate list */ ioblist->buf_tail = ioblist->buf_tail->next; ioblist->buf_head = ioblist->buf_head->next; ioblist->tot_pos -= BUFFER_SIZE; ioblist->tot_size -= BUFFER_SIZE; ioblist->tail_size = 0; iobf->mark_wrap = ~0; } } /* Flush the buffer as much as possible, but we have to be careful not * to discard data if tot_pos < tot_size. In this case we discard all * data < tot_pos and leave the rest as is. */ static void iob_flush_buffer(IOBLIST *ioblist) { while (ioblist->buf_head != ioblist->buf_ptr) { ioblist->buf_tail->next = ioblist->buf_head->next; free(ioblist->buf_head); #if DEBUG n_total_buffers --; #endif ioblist->buf_head = ioblist->buf_tail->next; ioblist->tot_pos -= BUFFER_SIZE; ioblist->tot_size -= BUFFER_SIZE; } /* Check for the special case where we have one and only one buffer * and tot_pos points to the very end of it. In this case, discard * this buffer, too. The other possibility would be to allocate a * second buffer. */ if (ioblist->buf_head == ioblist->buf_head->next && ioblist->tot_pos == BUFFER_SIZE) { #if 1 ioblist->tot_pos = ioblist->tot_size = ioblist->buf_pos = ioblist->tail_size = 0; #else ioblist->buf_tail->next = malloc(sizeof(IOBuffer)); #if DEBUG n_total_buffers ++; if (n_total_buffers > max_total_buffers) { max_total_buffers = n_total_buffers; fprintf(stderr, "MAX BUFFERS: %d\n", max_total_buffers); } #endif ioblist->buf_tail = ioblist->buf_tail->next; ioblist->buf_tail->next = ioblist->buf_head; ioblist->tail_size = ioblist->buf_pos = 0; #endif } } void iobfrewind(IOBFILE *iobf) { rewind(iobf->istream); #if 0 if (1 || iobf->can_seek) { iob_release_buffer(&iobf->ioblist); iob_init_buffer(&iobf->ioblist); } else { iobf->ioblist.tot_pos = iobf->ioblist.buf_pos = 0; iobf->ioblist.buf_ptr = iobf->ioblist.buf_head; } #else /* The fastest way is: simply move the position pointer to end of buffer */ iobf->ioblist.tot_pos = iobf->ioblist.tot_size; iobf->ioblist.buf_pos = iobf->ioblist.tail_size; #endif if (iobf->ioblist_mark.buf_head) { iob_release_buffer(&iobf->ioblist_mark); } iobf->mark_set = 0; iobf->mark_wrap = 0; iobf->mark_pos = ~0; memset(&iobf->stdiomark, ~0, sizeof(iobf->stdiomark)); iobf->posixmark = -1; /* Clear status flags */ iobf->ungetc = EOF; iobf->eof = 0; } size_t iobfread(void *ptr, size_t size, size_t nmemb, IOBFILE *iobf) { IOBLIST *ioblist = &iobf->ioblist; size_t rq_size = size * nmemb, rd_size, rd_tot; ssize_t tail_rd; char *buf = ptr; #if HAVE_FCNTL int first = 1; int fcntl_err = 0; #endif int cnt; if (size*nmemb == 0) { return 0; } rd_tot = 0; tail_rd = ~0; cnt = 0; do { ++cnt; rd_size = iobfread_buffer(buf, rq_size, iobf); rq_size -= rd_size; rd_tot += rd_size; buf += rd_size; if (iobf->eof && rq_size) { iobf->eof = -1; break; } if (tail_rd && rq_size && !iobf->eof) { ssize_t tail_space; iob_check_space(iobf); tail_space = BUFFER_SIZE - ioblist->tail_size; #if HAVE_FCNTL if (!iobf->can_seek) { if (first && iobf->fflags != -1) { fcntl_err = fcntl(iobf->fd, F_SETFL, iobf->fflags | o_nonblock); } if (!first || (iobf->fd >= 0 && iobf->fflags == -1) || fcntl_err) { tail_space = min(tail_space, (ssize_t)rq_size); } } #else if (!iobf->can_seek && iobf->fd >= 0) tail_space = min(tail_space, rq_size); #endif #if POSIX_SHORTCUT if (iobf->fd >= 0) { tail_rd = read(iobf->fd, ioblist->buf_tail->buffer + ioblist->tail_size, tail_space); if (tail_rd < 0) { if (errno == EAGAIN) { tail_rd = 0; /* probably a pipe */ } else { tail_rd = 0; /* maybe do something else in this case */ } } else { /* EOF is indicated by returning 0 for a request size > 0 */ if (tail_rd == 0 && tail_space > 0) { iobf->eof = 1; /* eof is a counter! */ } } ioblist->tail_size += tail_rd; ioblist->tot_size += tail_rd; } else { #endif tail_rd = fread(ioblist->buf_tail->buffer + ioblist->tail_size, 1, tail_space, iobf->istream); ioblist->tail_size += tail_rd; ioblist->tot_size += tail_rd; if (tail_rd < tail_space && feof(iobf->istream)) { iobf->eof = 1; } } #if HAVE_FCNTL if (!iobf->can_seek && first && iobf->fflags != -1 && !fcntl_err) { first = 0; clearerr(iobf->istream); if ((fcntl_err = fcntl(iobf->fd, F_SETFL, iobf->fflags)) < 0) { fprintf(stderr, "iobfread(): unable to clear O_NONBLOCK: \"%s\"\n", strerror(errno)); } if (tail_rd == 0 && rq_size) { tail_rd = ~0; /* retry with blocking IO */ iobf->eof = 0; } } #endif } } while (tail_rd && rq_size); #if DEBUG iobf->read_count += rd_tot; #endif return rd_tot / size; } int iobfgetc(IOBFILE *iobf) { int c = EOF; unsigned char c_char; if (iobf->eof != -1 && iobfread(&c_char, 1, 1, iobf) == 1) { c = c_char; } return c; } int iobfsetmark(IOBFILE *iobf) { IOBLIST *ioblist = &iobf->ioblist; int result = 0; if (iobf->mark_set) { iobfclearmark(iobf); } /* FIXME: generate error if EOF condition is set? */ if (iobf->eof == -1) { return -1; } iob_flush_buffer(ioblist); iobf->mark_set = ~0; iobf->mark_wrap = 0; iobf->mark_pos = ioblist->tot_pos; iobf->mark_ungetc = iobf->ungetc; if (iobf->can_seek) { #if POSIX_SHORTCUT if ((iobf->posixmark = LSEEK(iobf->fd, 0, SEEK_CUR)) < 0) { result = -1; } #else result = fgetpos(iobf->istream, &iobf->stdiomark); #endif iob_copy_buffer(&iobf->ioblist_mark, &iobf->ioblist); } return result; } int iobfseekmark(IOBFILE *iobf) { IOBLIST *ioblist; if (!iobf->mark_set) { return -1; } if (iobf->mark_wrap) { /* implies can_seek */ #if POSIX_SHORTCUT if (LSEEK(iobf->fd, iobf->posixmark, SEEK_SET) != iobf->posixmark) { return -1; } #else if (fsetpos(iobf->istream, &iobf->stdiomark) != 0) { return -1; } #endif iob_release_buffer(&iobf->ioblist); iob_copy_buffer(&iobf->ioblist, &iobf->ioblist_mark); iobf->mark_wrap = 0; } ioblist = &iobf->ioblist; ioblist->buf_ptr = ioblist->buf_head; ioblist->tot_pos = iobf->mark_pos; ioblist->buf_pos = iobf->mark_pos % BUFFER_SIZE; iobf->ungetc = iobf->mark_ungetc; /* Clear status flags on success */ if (iobf->eof == -1) { iobf->eof = 1; } #if DEBUG iobf->read_count = ioblist->tot_pos; #endif return 0; } int iobfclearmark(IOBFILE *iobf) { if (!iobf->mark_set) { return -1; } iobf->mark_set = 0; iobf->mark_wrap = 0; if (iobf->ioblist_mark.buf_head != NULL) { iob_release_buffer(&iobf->ioblist_mark); } return 0; } int iobfungetc(int c, IOBFILE *iobf) { if (c == EOF) { /* ??? */ iobf->ungetc = EOF; } else { iobf->ungetc = c & 0xff; if (iobf->eof == -1){ iobf->eof = 1; } } return c; } int iobfeof(IOBFILE *iobf) { if (iobf->ungetc != EOF) { return 0; } else if (iobf->ioblist.tot_pos < iobf->ioblist.tot_size) { return 0; } else if (iobf->eof == -1) { if (POSIX_SHORTCUT && iobf->fd >= 0) { return 1; } else if (feof(iobf->istream)) { return 1; } iobf->eof = 0; return 0; } else { return 0; } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/oogl/util/iobuffer.h0000644000175000017500000000436512310110201015502 00000000000000/* * Copyright (C) 2006 Claus-Justus Heine This program is free software; you can redistribute 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; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * This file implements setpos()/getpos() facilities for non-seekable * files by generating a secondary dynamic file buffering of arbitrary * size on top of stdio. */ /* As a special exception the author of this files permits the * distribution of this software with Geomview. As long as this file * is distributed with Geomview, the conditions of the GNU Lesser * Public Licence apply. See the file "COPYING" in the top-level * directory. */ #ifndef _CH_IOBUFFER_H_ #define _CH_IOBUFFER_H_ #include #include #include typedef struct IOBFILE IOBFILE; extern IOBFILE *iobfileopen(FILE *istream); extern int iobfileclose(IOBFILE *iobf); extern IOBFILE *iobfopen(const char *name, const char *mode); extern int iobfclose(IOBFILE *iobf); #if HAVE_POPEN extern IOBFILE *iobpopen(const char *name, const char *mode); extern int iobpclose(IOBFILE *iobf); #endif extern FILE *iobfile(IOBFILE *iobf); extern size_t iobfread(void *ptr, size_t size, size_t nmemb, IOBFILE *iobf); extern int iobfgetc(IOBFILE *iobf); extern int iobfungetc(int c, IOBFILE *iobf); extern void iobfrewind(IOBFILE *iobf); extern long iobftell(IOBFILE *iobf); extern int iobfseek(IOBFILE *stream, long offset, int whence); extern char *iobfgets(char *s, int size, IOBFILE *iobf); extern int iobfeof(IOBFILE *iobf); extern int iobfileno(IOBFILE *iobf); extern size_t iobfgetbuffer(IOBFILE *iobf, void *ptr, size_t size, int direction); extern int iobfsetmark(IOBFILE *iobf); extern int iobfseekmark(IOBFILE *iobf); extern int iobfclearmark(IOBFILE *iobf); #endif geomview-1.9.5/src/lib/oogl/util/iobfutil.c0000644000175000017500000004656512310110201015521 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2002-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2, or (at * your option) any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * Geometry object routines, like in futil.c, but FILE replace with * IOBFILE implemented in iobuffer.c. This way we can seek back safely * on pipes, sockets, etc. * * Utility routines, useful for many objects * * int * iobfgetnf(iobf, nfloats, floatp, binary) * Read an array of floats from a file in "ascii" or "binary" format. * Returns number of floats successfully read, should = nfloats. * "Binary" means "IEEE 32-bit floating-point" format. * * int * iobfgetni(IOBFILE *iobf, int nints, int *intsp, int binary) * Read an array of ints from a file in "ascii" or "binary" format. * Returns number of ints successfully read, should = nints. * "Binary" means "32-bit big-endian" integer format. * * int * iobfgetns(IOBFILE *iobf, int nshorts, short *intsp, int binary) * Read an array of shorts from a file in "ascii" or "binary" format. * Returns number of shorts successfully read, should = nints. * "Binary" means "16-bit big-endian" integer format. * * int * iobfexpectstr(IOBFILE *iobf, char *string) * Expect the given string to appear immediately on file. * Return 0 if the complete string is found, * else the offset+1 of the last matched char within string. * The first unmatched char is ungetc'd. * * int * iobfexpecttoken(IOBFILE *iobf, char *string) * Expect the given string to appear on the iobf, possibly after * skipping some white space and comments. * Return 0 if found, else the offset+1 of last matched char in string. * The first unmatched char is ungetc'd. * * int iobfnextc(IOBFILE *f, int flags) * Advances f to the next "interesting" character and * returns it. The returned char is ungetc'ed so the next getc() * will yield the same value. * Interesting depends on flags: * 0 : Skip blanks, tabs, newlines, and comments (#...\n). * 1 : Skip blanks, tabs, and comments, but newlines are interesting * (including the \n that terminates a comment). * 2 : Skip blanks, tabs, and newlines, but stop at #. * 3 : Skip blanks and tabs but stop at # or \n. * * int async_iobfnextc(IOBFILE *f, int flags) * Like fnextc() above, but guarantees not to block if no data is * immediately available. It returns either an interesting character, * EOF, or the special code NODATA (== -2). * if fd == -1, then fileno(f) is used, otherwise fd. * * int async_iobfgetc(IOBFILE *f, false) * Like getc(), but guarantees not to block. Returns NODATA if * nothing is immediately available. * * char *iobftoken(IOBFILE *f, int flags) * Skips uninteresting characters with fnextc(f, flags), * then returns a "token" - string of consecutive interesting characters. * Returns NULL if EOF is reached with no token, or if * flags specifies stopping at end-of-line and this is encountered with * no token found. * The token is effectively statically allocated and will be * overwritten by the next ftoken() call. * * char *iobfdelimtok(char *delims, IOBFILE *f, int flags) * Like ftoken(), but specially handles the characters in delims[]. * If one appears at the beginning of the token, it's returned as * a single-character token. * If a member of delims[] appears after other characters have been * accumulated, it's considered to terminate the token. * So successive calls to fdelimtok("()", f, 0) * on a file containing (fred smith) * would return "(", "fred", "smith", and ")". * Behavior is undefined if one of the predefined delimiters * (white space or #) appears in delims[]. Explicit quoting * (with ", ' or \) overrides detection of delimiters. * * int iobfgettransform(IOBFILE *f, int ntransforms, * float *transforms, int binary) * Reads 4x4 matrices from IOBFILE. Returns the number of matrices found, * up to ntransforms. Returns 0 if no numbers are found. * On finding incomplete matrices (not a multiple of 16 floats) * returns -1, regardless of whether any whole matrices were found. * Matrices are expected in the form used to transform a row vector * multiplied on the left, i.e. p * T -> p'; thus Euclidean translations * appear in the last row. * * int iobfputtransform(IOBFILE *f, int ntransforms, * float *transforms, int binary) * Writes 4x4 matrices to IOBFILE. Returns the number written, i.e. * ntransforms unless an error occurs. * * int iobfputnf(IOBFILE *f, int nfloats, float *fv, int binary) * Writes 'nfloats' floats to the given file. ASCII is in %g format, * separated by blanks. * */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include /* Try to get the prototype for select */ #if HAVE_SYS_SELECT_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_SYS_TIME_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #include #include #include #include "ooglutil.h" #include "iobuffer.h" #undef getc #define getc gobble #define ungetc gobble #define fgetc gobble #ifndef WORDS_BIGENDIAN static inline int gv_ntohl(unsigned int v) { return (((v >> 24) & 0x000000FF) | ((v << 24) & 0xFF000000) | ((v >> 8) & 0x0000FF00) | ((v << 8) & 0x00FF0000)); } static inline short gv_ntohs(unsigned short s) { return (((s >> 8) & 0x00FF) | ((s << 8) & 0xFF00)); } #else static inline int gv_ntohl(unsigned int v) { return v; } static inline short gv_ntohs(unsigned short s) { return s; } #endif static inline short gv_htons(unsigned short s) { return gv_ntohs(s); } static inline int gv_htonl(unsigned int v) { return gv_ntohl(v); } int iobfnextc(IOBFILE *f, int flags) { int c; c = iobfgetc(f); for(;;) { switch(c) { case EOF: return EOF; case ' ': case '\t': break; /* Always skip blanks and tabs */ case '#': if(flags & 2) /* 2: stop on comments, else skip */ goto fim; while((c = iobfgetc(f)) != '\n' && c != EOF) ; continue; /* Rescan this c */ case '\n': if(!(flags & 1)) /* 1: stop on \n's, else skip them */ break; /* flags&1 => fall into default */ default: fim: iobfungetc(c, f); return c; } c = iobfgetc(f); } } /* Read an array of white-space-separated floats from file 'f' in * ASCII, fast. Returns the number successfully read. */ int iobfgetnf(IOBFILE *f, int maxf, float *fv, int binary) { int ngot; float v = 0; int c = EOF; long n; int s, es, nd, any; if(binary) { #if WORDS_BIGENDIAN /* Easy -- our native floating point == big-endian IEEE */ return iobfread((char *)fv, sizeof(float), maxf, f); #else /* not native big-endian IEEE */ union { int wi; float wf; } w; for(n=0; n 0; n++) { w.wi = gv_ntohl(w.wi); fv[n] = w.wf; } return n; #endif /* not native big-endian IEEE */ } /* Read ASCII format floats */ for(ngot = 0; ngot < maxf; ngot++) { if(iobfnextc(f, 0) == EOF) return(ngot); n = 0; s = 0; nd = 0; any = 0; if((c = iobfgetc(f)) == '-') { s = 1; c = iobfgetc(f); } while(c >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; if(n >= 214748364) { /* 2^31 / 10 */ v = any ? v*pow(10.0, nd) + (float)n : (float)n; nd = n = 0; any = 1; } c = iobfgetc(f); } v = any ? v*pow(10.0, nd) + (float)n : (float)n; any += nd; if(c == '.') { nd = n = 0; while((c = iobfgetc(f)) >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; if(n >= 214748364) { v += (float)n / pow(10.0f, nd); n = 0; } } v += (float)n / pow(10.0, nd); } if(any == 0 && nd == 0) break; if(c == 'e' || c == 'E') { es = nd = 0; switch(c = iobfgetc(f)) { case '-': es = 1; /* And fall through */ case '+': c = iobfgetc(f); } n = 0; while(c >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; c = iobfgetc(f); } if(nd == 0) break; if(es) v /= pow(10.0, n); else v *= pow(10.0, n); } fv[ngot] = s ? -v : v; } if(c!=EOF) iobfungetc(c, f); return(ngot); } /* Read an array of white-space-separated floats from file 'f' in * ASCII, fast. Returns the number successfully read. */ int iobfgetnd(IOBFILE *f, int maxd, double *dv, int binary) { int ngot; double v = 0; int c = EOF; long n; int s, es, nd, any; if(binary) { #if WORDS_BIGENDIAN /* Easy -- our native floating point == big-endian IEEE */ return iobfread((char *)dv, sizeof(double), maxd, f); #else /* not native big-endian IEEE */ union { int wi[2]; double wd; } w; int tmp; for(n=0; n 0; n++) { tmp = gv_ntohl(w.wi[0]); w.wi[0] = gv_ntohl(w.wi[1]); w.wi[1] = tmp; dv[n] = w.wd; } return n; #endif /* not native big-endian IEEE */ } /* Read ASCII format floats */ for(ngot = 0; ngot < maxd; ngot++) { if(iobfnextc(f, 0) == EOF) return(ngot); n = 0; s = 0; nd = 0; any = 0; if((c = iobfgetc(f)) == '-') { s = 1; c = iobfgetc(f); } while(c >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; if(n >= 214748364) { /* 2^31 / 10 */ v = any ? v*pow(10.0, nd) + (float)n : (float)n; nd = n = 0; any = 1; } c = iobfgetc(f); } v = any ? v*pow(10.0, (double)nd) + (float)n : (float)n; any += nd; if(c == '.') { nd = n = 0; while((c = iobfgetc(f)) >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; if(n >= 214748364) { v += (float)n / pow(10.0, (double)nd); n = 0; } } v += (float)n / pow(10.0, (double)nd); } if(any == 0 && nd == 0) break; if(c == 'e' || c == 'E') { es = nd = 0; switch(c = iobfgetc(f)) { case '-': es = 1; /* And fall through */ case '+': c = iobfgetc(f); } n = 0; while(c >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; c = iobfgetc(f); } if(nd == 0) break; if(es) v /= pow(10.0, (double)n); else v *= pow(10.0, n); } dv[ngot] = s ? -v : v; } if(c!=EOF) iobfungetc(c, f); return(ngot); } int iobfgetni(IOBFILE *f, int maxi, int *iv, int binary) { int ngot; int c = EOF; long n; int s, any; if(binary) { #if WORDS_BIGENDIAN /* Easy -- our native floating point == big-endian IEEE */ return iobfread((char *)iv, sizeof(int), maxi, f); #else /* not native big-endian int's */ int w; for(n = 0; n < maxi && iobfread(&w,4,1,f) > 0; n++) iv[n] = gv_ntohl(w); return n; #endif /* not native big-endian int's */ } /* Read ASCII format floats */ for(ngot = 0; ngot < maxi; ngot++) { if(iobfnextc(f, 0) == EOF) return(ngot); n = 0; s = 0; any = 0; if((c = iobfgetc(f)) == '-') { s = 1; c = iobfgetc(f); } while(c >= '0' && c <= '9') { n = n*10 + c - '0'; any = 1; c = iobfgetc(f); } if(!any) break; iv[ngot] = s ? -n : n; } if(c!=EOF) iobfungetc(c, f); return(ngot); } int iobfgetns(IOBFILE *f, int maxs, short *sv, int binary) { int ngot; int c = EOF; long n; int s, any; if(binary) { #if WORDS_BIGENDIAN /* Easy -- our native floating point == big-endian IEEE */ return iobfread((char *)sv, sizeof(short), maxs, f); #else /* not native big-endian int's */ short w; for(n = 0; n < maxs && iobfread(&w,2,1,f) > 0; n++) sv[n] = gv_ntohs(w); return n; #endif /* not native big-endian int's */ } /* Read ASCII format floats */ for(ngot = 0; ngot < maxs; ngot++) { if(iobfnextc(f, 0) == EOF) return(ngot); n = s = any = 0; if((c = iobfgetc(f)) == '-') { s = 1; c = iobfgetc(f); } while(c >= '0' && c <= '9') { n = n*10 + c - '0'; any = 1; c = iobfgetc(f); } if(!any) break; sv[ngot] = s ? -n : n; } if(c!=EOF) iobfungetc(c, f); return(ngot); } /* * Check for a string on a file. * If found, return 0. * If not, return the offset of the last matched char +1 * and iobfungetc the failed char so the caller can see it. */ int iobfexpectstr(IOBFILE *iobf, char *str) { char *p = str; int c; while(*p != '\0') { if((c = iobfgetc(iobf)) != *p++) { if(c != EOF) iobfungetc(c, iobf); return(p - str); } } return 0; } /* * Check for a string on a iobf, skipping leading blanks. */ int iobfexpecttoken(IOBFILE *iobf, char *str) { (void) iobfnextc(iobf, 0); return iobfexpectstr(iobf, str); } int iobfescape(IOBFILE *f) { int n, k, c = iobfgetc(f); switch (c) { case 'n': return '\n'; case 'b': return '\b'; case 't': return '\t'; case 'r': return '\r'; } if (c < '0' || c > '7') return c; n = c-'0'; k = 2; while ((c = iobfgetc(f)) >= '0' && c <= '7') { n = (n*8) | (c-'0'); if(--k <= 0) return n; } if (c != EOF) iobfungetc(c, f); return n; } /* * Get a token, return a string or NULL. * Tokens may be "quoted" or 'quoted'; backslashes accepted. * The string is statically allocated and should be copied if * needed before the next call to ftoken(). */ char * iobfquotedelimtok(const char *delims, IOBFILE *iobf, int flags, int *quote) { static char *token = NULL; static int troom = 0; int c; char *p; const char *q; int term; if((term = iobfnextc(iobf, flags)) == EOF) return NULL; if(token == NULL) { troom = 50; token = malloc(troom * sizeof(char)); if(token == NULL) return NULL; } p = token; switch (term) { case '"': case '\'': *quote = term; (void)iobfgetc(iobf); for(;;) { if((c = iobfgetc(iobf)) == EOF || c == term) break; else if (c == '\\') c = iobfescape(iobf); *p++ = c; if(p == &token[troom]) { token = realloc(token, troom * 2); if(token == NULL) return NULL; p = &token[troom]; troom *= 2; } } break; default: *quote = '\0'; if(isspace(term)) return NULL; while((c = iobfgetc(iobf)) != EOF && !isspace(c)) { if(c == '\\') c = iobfescape(iobf); *p = c; if(++p == &token[troom]) { token = realloc(token, troom * 2); if(token == NULL) return NULL; p = &token[troom]; troom *= 2; } for(q = delims; *q && c != *q; q++) ; if(*q) { if(p > token+1) { p--; iobfungetc(c, iobf); } break; } } break; } *p = '\0'; return token; } char *iobfdelimtok(const char *delims, IOBFILE *iobf, int flags) { int tmp; return iobfquotedelimtok(delims, iobf, flags, &tmp); } /* * Get a token, return a string or NULL. * Tokens may be "quoted" or 'quoted'; backslashes accepted. * The string is statically allocated and should be copied if * needed before the next call to ftoken(). */ char * iobfquotetoken(IOBFILE *iobf, int flags, int *quote) { return iobfquotedelimtok("", iobf, flags, quote); } char * iobftoken(IOBFILE *iobf, int flags) { return iobfdelimtok("", iobf, flags); } /* * Load one or more Transforms from a file. * Return 1 on success, 0 on failure. */ int iobfgettransform(IOBFILE *iobf, int ntrans, float *trans /* float trans[ntrans][4][4] */, int binary) { float *T; int nt; for(nt = 0; nt < ntrans; nt++) { T = trans + 16*nt; switch(iobfgetnf(iobf, 16, T, binary)) { case 16: break; case 0: return nt; default: return -1; } } return ntrans; } /* * Given a file pointer, return a string attempting to show the context * of its current position. If no data is available, returns the empty string. */ #define CONTEXT_SIZE 256 char * iobfcontext(IOBFILE *f) { static char *cont = NULL; static char dflt[] = ""; char buf[1024]; int npre, nlpre, nlpost, tab, len; int predots = 4, postdots = 4; char *p, *q; char *lastline, *lastnonblank; char base[CONTEXT_SIZE], *ptr; int cnt; if (f == NULL) return dflt; if (iobfeof(f)) { return "> END OF IOBFILE\n"; } cnt = iobfgetbuffer(f, base, sizeof(base), -1); if(cnt <= 0) { return dflt; } ptr = base + cnt; p = ptr; for(npre = nlpre = 0; --p >= base && npre < CONTEXT_SIZE; npre++) { if(*p == '\n') { if(++nlpre > 2 || npre > 60) { predots = 0; break; } } else if(*p & 0x80 || *p == 0) { /* binary data? */ break; } } strcpy(buf, "> ... "); q = buf + 2 + predots; tab = 2 + predots; for(p = ptr - npre; p < ptr; ) { switch(*q++ = *p++) { case '\n': case '\r': *q++ = '>'; *q++ = ' '; tab = 2; break; case '\t': tab += 8-(tab&7); break; default: tab++; } } len = npre; nlpost = 0; lastline = lastnonblank = q; for(p = ptr; p < ptr + cnt && len < CONTEXT_SIZE; len++, q++) { *q = *p++; if(*q == '\n') { if(nlpost == 0) { while(--tab > 0) *++q = '-'; /* Point ---^ to error */ *++q = '^'; *++q = '\n'; } if((++nlpost >= 2 || len > 80) && len > 32) { postdots = 0; break; } lastline = q; *++q = '>'; *++q = ' '; } else if(*q & 0x80 || *q == 0) /* Binary data */ break; else if(isprint(*q)) lastnonblank = q; } if(postdots && lastnonblank < lastline) { q = lastline; /* Suppress trailing white space */ postdots = 0; /* to avoid final ``> ...'' */ } strcpy(q, " ...\n" + 4-postdots); if(nlpost == 0) { q += strlen(q); while(--tab > 0) *q++ = '-'; strcpy(q, "^\n"); } if(cont) { free(cont); } return (cont = strdup(buf)); } /***************************************************************************/ int iobfhasdata(IOBFILE *f) { return iobfgetbuffer(f, NULL, 0, 1) > 0; } int async_iobfgetc(IOBFILE *f) { #if HAVE_SELECT fd_set fds; int fd; static struct timeval notime = { 0, 0 }; fd = iobfileno(f); if(iobfhasdata(f)) return iobfgetc(f); if (fd < 0) return NODATA; FD_ZERO(&fds); FD_SET(fd, &fds); if(select(fd+1, &fds, NULL, NULL, ¬ime) == 1) return iobfgetc(f); return NODATA; #else return iobfgetc(f); #endif } int async_iobfnextc(IOBFILE *f, int flags) { int c; c = async_iobfgetc(f); for(;;) { switch(c) { case EOF: case NODATA: return(c); case ' ': case '\t': break; /* Always skip blanks and tabs */ case '#': if(flags & 2) /* 2: stop on comments, else skip */ goto fim; while((c = iobfgetc(f)) != '\n' && c != EOF) ; continue; /* Rescan this c */ case '\n': if(!(flags & 1)) /* 1: stop on \n's, else skip them */ break; /* flags&1 => fall into default */ default: fim: iobfungetc(c, f); return(c); } c = async_iobfgetc(f); } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/oogl/util/malloc-debug.c0000644000175000017500000000632512310110201016225 00000000000000/* GNAH. Nothing more to be said ... */ #include #include #include #if HAVE_MALLOC_H # include #endif #define N_RECORDS 10000 #define REC_FREE 0 struct alloc_record { void *ptr; size_t size; unsigned long seq; const char *file; const char *func; int line; }; static struct alloc_record records[N_RECORDS]; unsigned long malloc_seq; int n_alloc; size_t alloc_size; static void record_alloc(void *ptr, size_t size, const char *file, const char *func, int line) { unsigned long seq_min; int i, seq_min_i = 0; for (seq_min = ~0, i = 0; i < N_RECORDS; i++) { if (records[i].seq == REC_FREE) { seq_min_i = i; break; } else if (records[i].seq < seq_min) { seq_min = records[i].seq; seq_min_i = i; } } records[seq_min_i].seq = ++malloc_seq; records[seq_min_i].ptr = ptr; records[seq_min_i].size = size; records[seq_min_i].file = file; records[seq_min_i].func = func; records[seq_min_i].line = line; ++n_alloc; alloc_size += size; } static void record_free(void *ptr) { int i; if (ptr == NULL) { return; } for (i = 0; i < N_RECORDS; i++) { if (ptr == records[i].ptr) { alloc_size -= records[i].size; memset(&records[i], 0, sizeof(records[i])); records[i].seq = REC_FREE; --n_alloc; break; } } } void *malloc_record(size_t size, const char *file, const char *func, int line) { void *ptr; if (size == 0) { return NULL; } ptr = malloc(size); record_alloc(ptr, size, file, func, line); return ptr; } void free_record(void *ptr) { record_free(ptr); /* it is not an error if we do not find the ptr in our list; we only * store the last N_RECORDS allocations */ free(ptr); } char *strdup_record(const char *string, const char *file, const char *func, int line) { size_t len = strlen(string); char *newstring; newstring = malloc_record(len+1, file, func, line); memcpy(newstring, string, len+1); return newstring; } void *realloc_record(void *ptr, size_t size, const char *file, const char *func, int line) { record_free(ptr); ptr = realloc(ptr, size); record_alloc(ptr, size, file, func, line); return ptr; } void *calloc_record(size_t nmemb, size_t size, const char *file, const char *func, int line) { void *ptr; size *= nmemb; ptr = malloc_record(size, file, func, line); memset(ptr, 0, size); return ptr; } static int seq_cmp(const void *_a, const void *_b) { const struct alloc_record *a = _a, *b = _b; if (a->seq < b->seq) { return 1; } if (a->seq > b->seq) { return -1; } return 0; } void print_alloc_records(void) { int i; qsort(records, N_RECORDS, sizeof(struct alloc_record), seq_cmp); for (i = 0; i < N_RECORDS; i++) { if (records[i].seq == REC_FREE) { break; } fprintf(stderr, "%ld: %d@%p (%s, %s(), %d)\n", records[i].seq, (int)records[i].size, records[i].ptr, records[i].file, records[i].func, records[i].line); } fprintf(stderr, "#records: %d\n", i); } #if HAVE_MALLINFO struct mallinfo gv_mallinfo(void) { return mallinfo(); } #endif /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/oogl/util/dbllist.h0000644000175000017500000000703612310110201015334 00000000000000/* * Copyright (C) 2007 Claus-Justus Heine This program is free software; you can redistribute 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; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. Simple doubly linked list implementation. Somewhat inspired from the stuff used in the Linux kernel. */ #ifndef _GV_LIST_H_ #define _GV_LIST_H_ typedef struct dbllistnode { struct dbllistnode *next; struct dbllistnode *prev; } DblListNode; /* DblListNode Head = DBLLISTINIT(Head); */ #define DBLLISTINIT(name, head) { &name.head, &name.head } #define DBLLIST(name) DblListNode name = { &name, &name } /* list is empty if the list head is the only member */ static inline void DblListInit(DblListNode *head) { head->next = head; head->prev = head; } static inline bool DblListEmpty(DblListNode *head) { return head->next == head; } /* add in front, right after head */ static inline void DblListAdd(DblListNode *head, DblListNode *node) { node->next = head->next; head->next->prev = node; head->next = node; node->prev = head; } /* add at the tail, right before head */ static inline void DblListAddTail(DblListNode *head, DblListNode *node) { node->prev = head->prev; head->prev->next = node; head->prev = node; node->next = head; } /* One nice feature of doubly linked lists is that one does not need a * pointer to the head to do a deletion. */ static inline void DblListDelete(DblListNode *node) { node->next->prev = node->prev; node->prev->next = node->next; DblListInit(node); } /* Copy an entire DblList, i.e. reparent it, give it a new head. */ static inline void DblListMove(DblListNode *fromhead, DblListNode *tohead) { fromhead->next->prev = tohead; fromhead->prev->next = tohead; tohead->next = fromhead->next; tohead->prev = fromhead->prev; } /* Given a list-node "node" construct a pointer to the containing * structure of type "ctype" which has a member with name "nodename" * (of type DblListNode). */ #define DblListContainer(node, ctype, nodename) \ ((ctype *)((char *)(node) - (char *)&((ctype *)0)->nodename)) /* Iterate over the list; head is the list-head, ctype the type of the * containing structure, nodemember the name of the list-head inside * ctype, pos is the loop variable and must be of type ctype, next is * a temporary helper variable to protect against deletion of list * members. */ #define DblListIterate(head, ctype, nodename, pos, nextp) \ for (pos = DblListContainer((head)->next, ctype, nodename), \ nextp = DblListContainer(pos->nodename.next, ctype, nodename); \ pos->nodename.next != (head)->next; \ pos = nextp, \ nextp = DblListContainer(pos->nodename.next, ctype, nodename)) #define DblListIterateNoDelete(head, ctype, nodename, pos) \ for (pos = DblListContainer((head)->next, ctype, nodename); \ pos->nodename.next != (head)->next; \ pos = DblListContainer(pos->nodename.next, ctype, nodename)) #endif /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/oogl/util/freelist.h0000644000175000017500000000343312310110201015511 00000000000000/* * Copyright (C) 2007 Claus-Justus Heine This program is free software; you can redistribute 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; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Support for allocating objects from a free-list (instead of using * malloc() small fixed-size objects which are allocated frequently). */ #ifndef _GV_FREE_LIST_H_ #define _GV_FREE_LIST_H_ typedef struct FreeListNode { struct FreeListNode *next; } FreeListNode; #define DEF_FREELISTHEAD(type) FreeListNode *type##FreeList #define DEF_FREELIST(type) \ DEF_FREELISTHEAD(type); \ typedef union type##FreeNode { \ FreeListNode node; \ type data; \ } type##FreeNode #define FREELIST_NEW(type, name) \ if (type##FreeList == NULL) { \ name = OOGLNewE(type, #type); \ memset(name, 0, sizeof(type)); \ } else { \ type##FreeNode *reused; \ reused = (type##FreeNode *)type##FreeList; \ type##FreeList = reused->node.next; \ name = &reused->data; \ } #define FREELIST_FREE(type, name) \ { \ type##FreeNode *reuse = (type##FreeNode *)(name); \ reuse->node.next = type##FreeList; \ type##FreeList = &reuse->node; \ } #endif /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/oogl/util/time.c0000644000175000017500000000356212310110201014630 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Claus-Justus Heine */ /* * Handle NULL or uninitialized times. */ struct timeval *timeof(struct timeval *when) { static struct timeval now; if ((when == NULL && (when = &now)) || !timerisset(when)) gettimeofday(when, NULL); return when; } void addtime(struct timeval *result, const struct timeval *base, double offset) { double osec = floor(offset); result->tv_sec = base->tv_sec + osec; result->tv_usec = base->tv_usec + (int)((offset - osec)*1000000); while(result->tv_usec >= 1000000) { result->tv_sec++; result->tv_usec -= 1000000; } } double timeoffset(struct timeval *when, struct timeval *base) { return (double)(when->tv_sec - base->tv_sec) + 1e-6*(double)(when->tv_usec - base->tv_usec); } geomview-1.9.5/src/lib/oogl/util/Headers0000644000175000017500000000013012310110201015010 00000000000000create.h fsa.h ooglutil.h porting.h ray.h surf.h iobuffer.h dbllist.h freelist.h vvec.h geomview-1.9.5/src/lib/oogl/wa/0000755000175000017500000000000012310165602013251 500000000000000geomview-1.9.5/src/lib/oogl/wa/Makefile.in0000644000175000017500000005606512310165555015261 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/oogl/wa DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libwa_la_LIBADD = am_libwa_la_OBJECTS = wa.lex.lo wa.yacc.lo libwa_la_OBJECTS = $(am_libwa_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libwa_la_SOURCES) DIST_SOURCES = $(libwa_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man3dir = $(mandir)/man3 am__installdirs = "$(DESTDIR)$(man3dir)" NROFF = nroff MANS = $(man_MANS) 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) man_MANS = fsaparse.3gv EXTRA_DIST = Headers fsaparse.y fsaparse.l $(BUILT_SOURCES) $(man_MANS) noinst_LTLIBRARIES = libwa.la BUILT_SOURCES = wa.lex.c wa.yacc.c wa.yacc.h y.tab.h y.tab.c lex.yy.c libwa_la_SOURCES = \ wa.lex.c wa.yacc.c wa.yacc.h \ wa.h wa.yystype.h MAINTAINERCLEANFILES = $(BUILT_SOURCES) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/oogl/wa/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/oogl/wa/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libwa.la: $(libwa_la_OBJECTS) $(libwa_la_DEPENDENCIES) $(EXTRA_libwa_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libwa_la_OBJECTS) $(libwa_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wa.lex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wa.yacc.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man3: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man3dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.3[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ done; } uninstall-man3: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man3dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.3[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man3dir)'; $(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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(MANS) installdirs: for dir in "$(DESTDIR)$(man3dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man3 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man3 .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man3 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-man \ uninstall-man3 y.tab.c y.tab.h: $(srcdir)/fsaparse.y $(srcdir)/Makefile.in $(YACC) -d $(srcdir)/fsaparse.y wa.yacc.c: y.tab.c $(srcdir)/Makefile.in sed -e '/^\#include/!s/yy/wafsa/g' -e '/#ident/d' $< >$@ wa.yacc.h: y.tab.h $(srcdir)/Makefile.in sed -e '/^\#include/!s/yy/wafsa/g' -e '/#ident/d' $< >$@ lex.yy.c: wa.yacc.h $(srcdir)/fsaparse.l $(srcdir)/Makefile.in rm -f $@ $(LEX) $(srcdir)/fsaparse.l wa.lex.c: lex.yy.c $(srcdir)/Makefile.in sed -e '/^\#include/!s/yy/wafsa/g' \ -e 's/YYSTYPE wafsalval/extern &/' \ -e '/#ident/d' \ -e 's/lex.wafsa.c/wa.lex.c/g' \ -e 's/y.tab.h/wa.yacc.h/g' lex.yy.c >$@ # 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: geomview-1.9.5/src/lib/oogl/wa/Makefile.am0000644000175000017500000000170012310110201015204 00000000000000INCLUDES = $(default_includes) man_MANS = fsaparse.3gv EXTRA_DIST = Headers fsaparse.y fsaparse.l $(BUILT_SOURCES) $(man_MANS) noinst_LTLIBRARIES = libwa.la BUILT_SOURCES = wa.lex.c wa.yacc.c wa.yacc.h y.tab.h y.tab.c lex.yy.c libwa_la_SOURCES = \ wa.lex.c wa.yacc.c wa.yacc.h \ wa.h wa.yystype.h y.tab.c y.tab.h: $(srcdir)/fsaparse.y $(srcdir)/Makefile.in $(YACC) -d $(srcdir)/fsaparse.y wa.yacc.c: y.tab.c $(srcdir)/Makefile.in sed -e '/^\#include/!s/yy/wafsa/g' -e '/#ident/d' $< >$@ wa.yacc.h: y.tab.h $(srcdir)/Makefile.in sed -e '/^\#include/!s/yy/wafsa/g' -e '/#ident/d' $< >$@ lex.yy.c: wa.yacc.h $(srcdir)/fsaparse.l $(srcdir)/Makefile.in rm -f $@ $(LEX) $(srcdir)/fsaparse.l wa.lex.c: lex.yy.c $(srcdir)/Makefile.in sed -e '/^\#include/!s/yy/wafsa/g' \ -e 's/YYSTYPE wafsalval/extern &/' \ -e '/#ident/d' \ -e 's/lex.wafsa.c/wa.lex.c/g' \ -e 's/y.tab.h/wa.yacc.h/g' lex.yy.c >$@ MAINTAINERCLEANFILES = $(BUILT_SOURCES) geomview-1.9.5/src/lib/oogl/wa/wa.lex.c0000644000175000017500000014743112310165601014544 00000000000000 #line 3 "wa.lex.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 37 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define wafsaconst const #else #define wafsaconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (wafsa_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((wafsa_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE wafsarestart(wafsain ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(wafsa_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct wafsa_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t wafsa_size_t; #endif extern wafsa_size_t wafsaleng; extern FILE *wafsain, *wafsaout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define wafsaless(n) \ do \ { \ /* Undo effects of setting up wafsatext. */ \ int wafsaless_macro_arg = (n); \ YY_LESS_LINENO(wafsaless_macro_arg);\ *wafsa_cp = (wafsa_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (wafsa_c_buf_p) = wafsa_cp = wafsa_bp + wafsaless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up wafsatext again */ \ } \ while ( 0 ) #define unput(c) wafsaunput( c, (wafsatext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct wafsa_buffer_state { FILE *wafsa_input_file; char *wafsa_ch_buf; /* input buffer */ char *wafsa_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ wafsa_size_t wafsa_buf_size; /* Number of characters read into wafsa_ch_buf, not including EOB * characters. */ wafsa_size_t wafsa_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int wafsa_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int wafsa_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int wafsa_at_bol; int wafsa_bs_lineno; /**< The line count. */ int wafsa_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int wafsa_fill_buffer; int wafsa_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via wafsarestart()), so that the user can continue scanning by * just pointing wafsain at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t wafsa_buffer_stack_top = 0; /**< index of top of stack. */ static size_t wafsa_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * wafsa_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (wafsa_buffer_stack) \ ? (wafsa_buffer_stack)[(wafsa_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (wafsa_buffer_stack)[(wafsa_buffer_stack_top)] /* wafsa_hold_char holds the character lost when wafsatext is formed. */ static char wafsa_hold_char; static wafsa_size_t wafsa_n_chars; /* number of characters read into wafsa_ch_buf */ wafsa_size_t wafsaleng; /* Points to current character in buffer. */ static char *wafsa_c_buf_p = (char *) 0; static int wafsa_init = 0; /* whether we need to initialize */ static int wafsa_start = 0; /* start state number */ /* Flag which is used to allow wafsawrap()'s to do buffer switches * instead of setting up a fresh wafsain. A bit of a hack ... */ static int wafsa_did_buffer_switch_on_eof; void wafsarestart (FILE *input_file ); void wafsa_switch_to_buffer (YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE wafsa_create_buffer (FILE *file,int size ); void wafsa_delete_buffer (YY_BUFFER_STATE b ); void wafsa_flush_buffer (YY_BUFFER_STATE b ); void wafsapush_buffer_state (YY_BUFFER_STATE new_buffer ); void wafsapop_buffer_state (void ); static void wafsaensure_buffer_stack (void ); static void wafsa_load_buffer_state (void ); static void wafsa_init_buffer (YY_BUFFER_STATE b,FILE *file ); #define YY_FLUSH_BUFFER wafsa_flush_buffer(YY_CURRENT_BUFFER ) YY_BUFFER_STATE wafsa_scan_buffer (char *base,wafsa_size_t size ); YY_BUFFER_STATE wafsa_scan_string (wafsaconst char *wafsa_str ); YY_BUFFER_STATE wafsa_scan_bytes (wafsaconst char *bytes,wafsa_size_t len ); void *wafsaalloc (wafsa_size_t ); void *wafsarealloc (void *,wafsa_size_t ); void wafsafree (void * ); #define wafsa_new_buffer wafsa_create_buffer #define wafsa_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ wafsaensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ wafsa_create_buffer(wafsain,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->wafsa_is_interactive = is_interactive; \ } #define wafsa_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ wafsaensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ wafsa_create_buffer(wafsain,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->wafsa_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->wafsa_at_bol) /* Begin user sect3 */ typedef unsigned char YY_CHAR; FILE *wafsain = (FILE *) 0, *wafsaout = (FILE *) 0; typedef int wafsa_state_type; extern int wafsalineno; int wafsalineno = 1; extern char *wafsatext; #define wafsatext_ptr wafsatext static wafsa_state_type wafsa_get_previous_state (void ); static wafsa_state_type wafsa_try_NUL_trans (wafsa_state_type current_state ); static int wafsa_get_next_buffer (void ); static void wafsa_fatal_error (wafsaconst char msg[] ); /* Done after the current pattern has been matched and before the * corresponding action - sets up wafsatext. */ #define YY_DO_BEFORE_ACTION \ (wafsatext_ptr) = wafsa_bp; \ wafsaleng = (size_t) (wafsa_cp - wafsa_bp); \ (wafsa_hold_char) = *wafsa_cp; \ *wafsa_cp = '\0'; \ (wafsa_c_buf_p) = wafsa_cp; #define YY_NUM_RULES 26 #define YY_END_OF_BUFFER 27 /* This struct is not used in this scanner, but its presence is necessary. */ struct wafsa_trans_info { flex_int32_t wafsa_verify; flex_int32_t wafsa_nxt; }; static wafsaconst flex_int16_t wafsa_accept[91] = { 0, 0, 0, 27, 25, 1, 20, 17, 18, 25, 1, 23, 22, 19, 21, 25, 25, 25, 25, 25, 25, 25, 25, 15, 16, 25, 1, 23, 22, 1, 23, 23, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 25, 25, 7, 25, 4, 14, 8, 25, 25, 25, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 11, 25, 25, 25, 2, 25, 12, 3, 25, 5, 25, 25, 25, 25, 6, 25, 10, 13, 25, 9, 0 } ; static wafsaconst flex_int32_t wafsa_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 4, 5, 1, 6, 7, 6, 8, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 10, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 14, 1, 1, 15, 16, 1, 17, 18, 1, 1, 19, 20, 21, 22, 23, 1, 24, 25, 26, 1, 27, 1, 1, 28, 1, 29, 1, 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static wafsaconst flex_int32_t wafsa_meta[31] = { 0, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2 } ; static wafsaconst flex_int16_t wafsa_base[92] = { 0, 0, 0, 107, 0, 29, 108, 108, 108, 24, 32, 97, 29, 108, 108, 83, 16, 88, 18, 82, 84, 18, 88, 108, 108, 0, 43, 91, 39, 47, 0, 90, 74, 74, 83, 70, 70, 80, 65, 70, 77, 69, 64, 78, 66, 68, 70, 0, 63, 0, 67, 0, 27, 67, 62, 70, 65, 64, 57, 62, 50, 47, 57, 49, 57, 43, 54, 52, 40, 40, 0, 39, 44, 48, 0, 46, 0, 0, 45, 0, 34, 39, 31, 31, 0, 40, 0, 0, 27, 0, 108, 40 } ; static wafsaconst flex_int16_t wafsa_def[92] = { 0, 90, 1, 90, 91, 90, 90, 90, 90, 91, 91, 91, 91, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 90, 90, 91, 90, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 0, 90 } ; static wafsaconst flex_int16_t wafsa_nxt[139] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 4, 18, 4, 19, 4, 20, 4, 4, 4, 4, 21, 4, 22, 4, 23, 24, 26, 27, 28, 26, 33, 26, 31, 28, 29, 36, 25, 34, 37, 40, 26, 41, 31, 28, 26, 26, 61, 89, 62, 29, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 55, 64, 63, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 30, 42, 39, 38, 35, 32, 30, 90, 3, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90 } ; static wafsaconst flex_int16_t wafsa_chk[139] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 9, 9, 10, 16, 5, 12, 12, 10, 18, 91, 16, 18, 21, 26, 21, 28, 28, 29, 26, 52, 88, 52, 29, 85, 83, 82, 81, 80, 78, 75, 73, 72, 71, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 50, 48, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 27, 22, 20, 19, 17, 15, 11, 3, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90 } ; static wafsa_state_type wafsa_last_accepting_state; static char *wafsa_last_accepting_cpos; extern int wafsa_flex_debug; int wafsa_flex_debug = 0; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define wafsamore() wafsamore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *wafsatext; #line 1 "../../../../../src/lib/oogl/wa/fsaparse.l" #line 2 "../../../../../src/lib/oogl/wa/fsaparse.l" /* * fsaparse.l (wa.lex.c) * * Lex definitions for lexical scanner for parsing word-acceptor * automata. See fsaparse.y for more info. * * mbp Sat Mar 23 21:58:12 1991 * mbp@thales.urich.edu */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include /* for atof() */ #include #include #include "wa.yystype.h" #include "wa.yacc.h" extern YYSTYPE wafsalval; /* disable output of unmatched input */ #undef output #define output(c) #line 538 "wa.lex.c" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int wafsa_init_globals (void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int wafsalex_destroy (void ); int wafsaget_debug (void ); void wafsaset_debug (int debug_flag ); YY_EXTRA_TYPE wafsaget_extra (void ); void wafsaset_extra (YY_EXTRA_TYPE user_defined ); FILE *wafsaget_in (void ); void wafsaset_in (FILE * in_str ); FILE *wafsaget_out (void ); void wafsaset_out (FILE * out_str ); wafsa_size_t wafsaget_leng (void ); char *wafsaget_text (void ); int wafsaget_lineno (void ); void wafsaset_lineno (int line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int wafsawrap (void ); #else extern int wafsawrap (void ); #endif #endif static void wafsaunput (int c,char *buf_ptr ); #ifndef wafsatext_ptr static void wafsa_flex_strncpy (char *,wafsaconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int wafsa_flex_strlen (wafsaconst char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int wafsainput (void ); #else static int input (void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( wafsatext, wafsaleng, 1, wafsaout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->wafsa_is_interactive ) \ { \ int c = '*'; \ size_t n; \ for ( n = 0; n < max_size && \ (c = getc( wafsain )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( wafsain ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = fread(buf, 1, max_size, wafsain))==0 && ferror(wafsain)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(wafsain); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "wafsaterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef wafsaterminate #define wafsaterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) wafsa_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int wafsalex (void); #define YY_DECL int wafsalex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after wafsatext and wafsaleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register wafsa_state_type wafsa_current_state; register char *wafsa_cp, *wafsa_bp; register int wafsa_act; if ( !(wafsa_init) ) { (wafsa_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (wafsa_start) ) (wafsa_start) = 1; /* first start state */ if ( ! wafsain ) wafsain = stdin; if ( ! wafsaout ) wafsaout = stdout; if ( ! YY_CURRENT_BUFFER ) { wafsaensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = wafsa_create_buffer(wafsain,YY_BUF_SIZE ); } wafsa_load_buffer_state( ); } { #line 37 "../../../../../src/lib/oogl/wa/fsaparse.l" #line 750 "wa.lex.c" while ( 1 ) /* loops until end-of-file is reached */ { wafsa_cp = (wafsa_c_buf_p); /* Support of wafsatext. */ *wafsa_cp = (wafsa_hold_char); /* wafsa_bp points to the position in wafsa_ch_buf of the start of * the current run. */ wafsa_bp = wafsa_cp; wafsa_current_state = (wafsa_start); wafsa_match: do { register YY_CHAR wafsa_c = wafsa_ec[YY_SC_TO_UI(*wafsa_cp)] ; if ( wafsa_accept[wafsa_current_state] ) { (wafsa_last_accepting_state) = wafsa_current_state; (wafsa_last_accepting_cpos) = wafsa_cp; } while ( wafsa_chk[wafsa_base[wafsa_current_state] + wafsa_c] != wafsa_current_state ) { wafsa_current_state = (int) wafsa_def[wafsa_current_state]; if ( wafsa_current_state >= 91 ) wafsa_c = wafsa_meta[(unsigned int) wafsa_c]; } wafsa_current_state = wafsa_nxt[wafsa_base[wafsa_current_state] + (unsigned int) wafsa_c]; ++wafsa_cp; } while ( wafsa_base[wafsa_current_state] != 108 ); wafsa_find_action: wafsa_act = wafsa_accept[wafsa_current_state]; if ( wafsa_act == 0 ) { /* have to back up */ wafsa_cp = (wafsa_last_accepting_cpos); wafsa_current_state = (wafsa_last_accepting_state); wafsa_act = wafsa_accept[wafsa_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( wafsa_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *wafsa_cp = (wafsa_hold_char); wafsa_cp = (wafsa_last_accepting_cpos); wafsa_current_state = (wafsa_last_accepting_state); goto wafsa_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 39 "../../../../../src/lib/oogl/wa/fsaparse.l" ; YY_BREAK case 2: YY_RULE_SETUP #line 41 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(FORMAT); } YY_BREAK case 3: YY_RULE_SETUP #line 42 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(FORMAT); } YY_BREAK case 4: YY_RULE_SETUP #line 43 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(FSA); } YY_BREAK case 5: YY_RULE_SETUP #line 44 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(STATES); } YY_BREAK case 6: YY_RULE_SETUP #line 45 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(SYMBOLS); } YY_BREAK case 7: YY_RULE_SETUP #line 46 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(BFS); } YY_BREAK case 8: YY_RULE_SETUP #line 47 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(MIN); } YY_BREAK case 9: YY_RULE_SETUP #line 48 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(VARIABLES); } YY_BREAK case 10: YY_RULE_SETUP #line 49 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(ALPHABET); } YY_BREAK case 11: YY_RULE_SETUP #line 50 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(START); } YY_BREAK case 12: YY_RULE_SETUP #line 51 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(ATABLE); } YY_BREAK case 13: YY_RULE_SETUP #line 52 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(INVERSES); } YY_BREAK case 14: YY_RULE_SETUP #line 53 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(INV); } YY_BREAK case 15: YY_RULE_SETUP #line 55 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(LEFT_BRACE); } YY_BREAK case 16: YY_RULE_SETUP #line 56 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(RIGHT_BRACE); } YY_BREAK case 17: YY_RULE_SETUP #line 57 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(LEFT_PAREN); } YY_BREAK case 18: YY_RULE_SETUP #line 58 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(RIGHT_PAREN); } YY_BREAK case 19: YY_RULE_SETUP #line 59 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(SEMICOLON); } YY_BREAK case 20: YY_RULE_SETUP #line 60 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(PERCENT); } YY_BREAK case 21: YY_RULE_SETUP #line 61 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(EQUAL); } YY_BREAK case 22: YY_RULE_SETUP #line 63 "../../../../../src/lib/oogl/wa/fsaparse.l" { wafsalval.i = atoi(wafsatext); return(INT); } YY_BREAK case 23: YY_RULE_SETUP #line 64 "../../../../../src/lib/oogl/wa/fsaparse.l" { wafsalval.d = atof(wafsatext); return(REAL); } YY_BREAK case 24: YY_RULE_SETUP #line 65 "../../../../../src/lib/oogl/wa/fsaparse.l" { wafsalval.d = atof(wafsatext); return(REAL); } YY_BREAK case 25: YY_RULE_SETUP #line 67 "../../../../../src/lib/oogl/wa/fsaparse.l" { strcpy(wafsalval.s, wafsatext); return(STRING); } YY_BREAK case 26: YY_RULE_SETUP #line 69 "../../../../../src/lib/oogl/wa/fsaparse.l" ECHO; YY_BREAK #line 938 "wa.lex.c" case YY_STATE_EOF(INITIAL): wafsaterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int wafsa_amount_of_matched_text = (int) (wafsa_cp - (wafsatext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *wafsa_cp = (wafsa_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->wafsa_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed wafsain at a new source and called * wafsalex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (wafsa_n_chars) = YY_CURRENT_BUFFER_LVALUE->wafsa_n_chars; YY_CURRENT_BUFFER_LVALUE->wafsa_input_file = wafsain; YY_CURRENT_BUFFER_LVALUE->wafsa_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for wafsa_c_buf_p "<=" to the position * of the first EOB in the buffer, since wafsa_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (wafsa_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[(wafsa_n_chars)] ) { /* This was really a NUL. */ wafsa_state_type wafsa_next_state; (wafsa_c_buf_p) = (wafsatext_ptr) + wafsa_amount_of_matched_text; wafsa_current_state = wafsa_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * wafsa_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ wafsa_next_state = wafsa_try_NUL_trans( wafsa_current_state ); wafsa_bp = (wafsatext_ptr) + YY_MORE_ADJ; if ( wafsa_next_state ) { /* Consume the NUL. */ wafsa_cp = ++(wafsa_c_buf_p); wafsa_current_state = wafsa_next_state; goto wafsa_match; } else { wafsa_cp = (wafsa_c_buf_p); goto wafsa_find_action; } } else switch ( wafsa_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (wafsa_did_buffer_switch_on_eof) = 0; if ( wafsawrap( ) ) { /* Note: because we've taken care in * wafsa_get_next_buffer() to have set up * wafsatext, we can now set up * wafsa_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (wafsa_c_buf_p) = (wafsatext_ptr) + YY_MORE_ADJ; wafsa_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (wafsa_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (wafsa_c_buf_p) = (wafsatext_ptr) + wafsa_amount_of_matched_text; wafsa_current_state = wafsa_get_previous_state( ); wafsa_cp = (wafsa_c_buf_p); wafsa_bp = (wafsatext_ptr) + YY_MORE_ADJ; goto wafsa_match; case EOB_ACT_LAST_MATCH: (wafsa_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[(wafsa_n_chars)]; wafsa_current_state = wafsa_get_previous_state( ); wafsa_cp = (wafsa_c_buf_p); wafsa_bp = (wafsatext_ptr) + YY_MORE_ADJ; goto wafsa_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of user's declarations */ } /* end of wafsalex */ /* wafsa_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int wafsa_get_next_buffer (void) { register char *dest = YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf; register char *source = (wafsatext_ptr); register int number_to_move, i; int ret_val; if ( (wafsa_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[(wafsa_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->wafsa_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (wafsa_c_buf_p) - (wafsatext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((wafsa_c_buf_p) - (wafsatext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->wafsa_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->wafsa_n_chars = (wafsa_n_chars) = 0; else { wafsa_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->wafsa_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int wafsa_c_buf_p_offset = (int) ((wafsa_c_buf_p) - b->wafsa_ch_buf); if ( b->wafsa_is_our_buffer ) { wafsa_size_t new_size = b->wafsa_buf_size * 2; if ( new_size <= 0 ) b->wafsa_buf_size += b->wafsa_buf_size / 8; else b->wafsa_buf_size *= 2; b->wafsa_ch_buf = (char *) /* Include room in for 2 EOB chars. */ wafsarealloc((void *) b->wafsa_ch_buf,b->wafsa_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->wafsa_ch_buf = 0; if ( ! b->wafsa_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (wafsa_c_buf_p) = &b->wafsa_ch_buf[wafsa_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->wafsa_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[number_to_move]), (wafsa_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->wafsa_n_chars = (wafsa_n_chars); } if ( (wafsa_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; wafsarestart(wafsain ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->wafsa_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((wafsa_size_t) ((wafsa_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->wafsa_buf_size) { /* Extend the array by 50%, plus the number we really need. */ wafsa_size_t new_size = (wafsa_n_chars) + number_to_move + ((wafsa_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf = (char *) wafsarealloc((void *) YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in wafsa_get_next_buffer()" ); } (wafsa_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[(wafsa_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[(wafsa_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (wafsatext_ptr) = &YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[0]; return ret_val; } /* wafsa_get_previous_state - get the state just before the EOB char was reached */ static wafsa_state_type wafsa_get_previous_state (void) { register wafsa_state_type wafsa_current_state; register char *wafsa_cp; wafsa_current_state = (wafsa_start); for ( wafsa_cp = (wafsatext_ptr) + YY_MORE_ADJ; wafsa_cp < (wafsa_c_buf_p); ++wafsa_cp ) { register YY_CHAR wafsa_c = (*wafsa_cp ? wafsa_ec[YY_SC_TO_UI(*wafsa_cp)] : 1); if ( wafsa_accept[wafsa_current_state] ) { (wafsa_last_accepting_state) = wafsa_current_state; (wafsa_last_accepting_cpos) = wafsa_cp; } while ( wafsa_chk[wafsa_base[wafsa_current_state] + wafsa_c] != wafsa_current_state ) { wafsa_current_state = (int) wafsa_def[wafsa_current_state]; if ( wafsa_current_state >= 91 ) wafsa_c = wafsa_meta[(unsigned int) wafsa_c]; } wafsa_current_state = wafsa_nxt[wafsa_base[wafsa_current_state] + (unsigned int) wafsa_c]; } return wafsa_current_state; } /* wafsa_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = wafsa_try_NUL_trans( current_state ); */ static wafsa_state_type wafsa_try_NUL_trans (wafsa_state_type wafsa_current_state ) { register int wafsa_is_jam; register char *wafsa_cp = (wafsa_c_buf_p); register YY_CHAR wafsa_c = 1; if ( wafsa_accept[wafsa_current_state] ) { (wafsa_last_accepting_state) = wafsa_current_state; (wafsa_last_accepting_cpos) = wafsa_cp; } while ( wafsa_chk[wafsa_base[wafsa_current_state] + wafsa_c] != wafsa_current_state ) { wafsa_current_state = (int) wafsa_def[wafsa_current_state]; if ( wafsa_current_state >= 91 ) wafsa_c = wafsa_meta[(unsigned int) wafsa_c]; } wafsa_current_state = wafsa_nxt[wafsa_base[wafsa_current_state] + (unsigned int) wafsa_c]; wafsa_is_jam = (wafsa_current_state == 90); return wafsa_is_jam ? 0 : wafsa_current_state; } static void wafsaunput (int c, register char * wafsa_bp ) { register char *wafsa_cp; wafsa_cp = (wafsa_c_buf_p); /* undo effects of setting up wafsatext */ *wafsa_cp = (wafsa_hold_char); if ( wafsa_cp < YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register wafsa_size_t number_to_move = (wafsa_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[ YY_CURRENT_BUFFER_LVALUE->wafsa_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf ) *--dest = *--source; wafsa_cp += (int) (dest - source); wafsa_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->wafsa_n_chars = (wafsa_n_chars) = YY_CURRENT_BUFFER_LVALUE->wafsa_buf_size; if ( wafsa_cp < YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--wafsa_cp = (char) c; (wafsatext_ptr) = wafsa_bp; (wafsa_hold_char) = *wafsa_cp; (wafsa_c_buf_p) = wafsa_cp; } #ifndef YY_NO_INPUT #ifdef __cplusplus static int wafsainput (void) #else static int input (void) #endif { int c; *(wafsa_c_buf_p) = (wafsa_hold_char); if ( *(wafsa_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* wafsa_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (wafsa_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[(wafsa_n_chars)] ) /* This was really a NUL. */ *(wafsa_c_buf_p) = '\0'; else { /* need more input */ wafsa_size_t offset = (wafsa_c_buf_p) - (wafsatext_ptr); ++(wafsa_c_buf_p); switch ( wafsa_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because wafsa_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ wafsarestart(wafsain ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( wafsawrap( ) ) return EOF; if ( ! (wafsa_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return wafsainput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (wafsa_c_buf_p) = (wafsatext_ptr) + offset; break; } } } c = *(unsigned char *) (wafsa_c_buf_p); /* cast for 8-bit char's */ *(wafsa_c_buf_p) = '\0'; /* preserve wafsatext */ (wafsa_hold_char) = *++(wafsa_c_buf_p); return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void wafsarestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ wafsaensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = wafsa_create_buffer(wafsain,YY_BUF_SIZE ); } wafsa_init_buffer(YY_CURRENT_BUFFER,input_file ); wafsa_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void wafsa_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * wafsapop_buffer_state(); * wafsapush_buffer_state(new_buffer); */ wafsaensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(wafsa_c_buf_p) = (wafsa_hold_char); YY_CURRENT_BUFFER_LVALUE->wafsa_buf_pos = (wafsa_c_buf_p); YY_CURRENT_BUFFER_LVALUE->wafsa_n_chars = (wafsa_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; wafsa_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (wafsawrap()) processing, but the only time this flag * is looked at is after wafsawrap() is called, so it's safe * to go ahead and always set it. */ (wafsa_did_buffer_switch_on_eof) = 1; } static void wafsa_load_buffer_state (void) { (wafsa_n_chars) = YY_CURRENT_BUFFER_LVALUE->wafsa_n_chars; (wafsatext_ptr) = (wafsa_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->wafsa_buf_pos; wafsain = YY_CURRENT_BUFFER_LVALUE->wafsa_input_file; (wafsa_hold_char) = *(wafsa_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE wafsa_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) wafsaalloc(sizeof( struct wafsa_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in wafsa_create_buffer()" ); b->wafsa_buf_size = size; /* wafsa_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->wafsa_ch_buf = (char *) wafsaalloc(b->wafsa_buf_size + 2 ); if ( ! b->wafsa_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in wafsa_create_buffer()" ); b->wafsa_is_our_buffer = 1; wafsa_init_buffer(b,file ); return b; } /** Destroy the buffer. * @param b a buffer created with wafsa_create_buffer() * */ void wafsa_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->wafsa_is_our_buffer ) wafsafree((void *) b->wafsa_ch_buf ); wafsafree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a wafsarestart() or at EOF. */ static void wafsa_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; wafsa_flush_buffer(b ); b->wafsa_input_file = file; b->wafsa_fill_buffer = 1; /* If b is the current buffer, then wafsa_init_buffer was _probably_ * called from wafsarestart() or through wafsa_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->wafsa_bs_lineno = 1; b->wafsa_bs_column = 0; } b->wafsa_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void wafsa_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->wafsa_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->wafsa_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->wafsa_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->wafsa_buf_pos = &b->wafsa_ch_buf[0]; b->wafsa_at_bol = 1; b->wafsa_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) wafsa_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void wafsapush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; wafsaensure_buffer_stack(); /* This block is copied from wafsa_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(wafsa_c_buf_p) = (wafsa_hold_char); YY_CURRENT_BUFFER_LVALUE->wafsa_buf_pos = (wafsa_c_buf_p); YY_CURRENT_BUFFER_LVALUE->wafsa_n_chars = (wafsa_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (wafsa_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from wafsa_switch_to_buffer. */ wafsa_load_buffer_state( ); (wafsa_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void wafsapop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; wafsa_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((wafsa_buffer_stack_top) > 0) --(wafsa_buffer_stack_top); if (YY_CURRENT_BUFFER) { wafsa_load_buffer_state( ); (wafsa_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void wafsaensure_buffer_stack (void) { wafsa_size_t num_to_alloc; if (!(wafsa_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (wafsa_buffer_stack) = (struct wafsa_buffer_state**)wafsaalloc (num_to_alloc * sizeof(struct wafsa_buffer_state*) ); if ( ! (wafsa_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in wafsaensure_buffer_stack()" ); memset((wafsa_buffer_stack), 0, num_to_alloc * sizeof(struct wafsa_buffer_state*)); (wafsa_buffer_stack_max) = num_to_alloc; (wafsa_buffer_stack_top) = 0; return; } if ((wafsa_buffer_stack_top) >= ((wafsa_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (wafsa_buffer_stack_max) + grow_size; (wafsa_buffer_stack) = (struct wafsa_buffer_state**)wafsarealloc ((wafsa_buffer_stack), num_to_alloc * sizeof(struct wafsa_buffer_state*) ); if ( ! (wafsa_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in wafsaensure_buffer_stack()" ); /* zero only the new slots.*/ memset((wafsa_buffer_stack) + (wafsa_buffer_stack_max), 0, grow_size * sizeof(struct wafsa_buffer_state*)); (wafsa_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE wafsa_scan_buffer (char * base, wafsa_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) wafsaalloc(sizeof( struct wafsa_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in wafsa_scan_buffer()" ); b->wafsa_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->wafsa_buf_pos = b->wafsa_ch_buf = base; b->wafsa_is_our_buffer = 0; b->wafsa_input_file = 0; b->wafsa_n_chars = b->wafsa_buf_size; b->wafsa_is_interactive = 0; b->wafsa_at_bol = 1; b->wafsa_fill_buffer = 0; b->wafsa_buffer_status = YY_BUFFER_NEW; wafsa_switch_to_buffer(b ); return b; } /** Setup the input buffer state to scan a string. The next call to wafsalex() will * scan from a @e copy of @a str. * @param wafsastr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * wafsa_scan_bytes() instead. */ YY_BUFFER_STATE wafsa_scan_string (wafsaconst char * wafsastr ) { return wafsa_scan_bytes(wafsastr,strlen(wafsastr) ); } /** Setup the input buffer state to scan the given bytes. The next call to wafsalex() will * scan from a @e copy of @a bytes. * @param wafsabytes the byte buffer to scan * @param _wafsabytes_len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE wafsa_scan_bytes (wafsaconst char * wafsabytes, wafsa_size_t _wafsabytes_len ) { YY_BUFFER_STATE b; char *buf; wafsa_size_t n; wafsa_size_t i; /* Get memory for full buffer, including space for trailing EOB's. */ n = _wafsabytes_len + 2; buf = (char *) wafsaalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in wafsa_scan_bytes()" ); for ( i = 0; i < _wafsabytes_len; ++i ) buf[i] = wafsabytes[i]; buf[_wafsabytes_len] = buf[_wafsabytes_len+1] = YY_END_OF_BUFFER_CHAR; b = wafsa_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in wafsa_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->wafsa_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void wafsa_fatal_error (wafsaconst char* msg ) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine wafsaless() so it works in section 3 code. */ #undef wafsaless #define wafsaless(n) \ do \ { \ /* Undo effects of setting up wafsatext. */ \ int wafsaless_macro_arg = (n); \ YY_LESS_LINENO(wafsaless_macro_arg);\ wafsatext[wafsaleng] = (wafsa_hold_char); \ (wafsa_c_buf_p) = wafsatext + wafsaless_macro_arg; \ (wafsa_hold_char) = *(wafsa_c_buf_p); \ *(wafsa_c_buf_p) = '\0'; \ wafsaleng = wafsaless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int wafsaget_lineno (void) { return wafsalineno; } /** Get the input stream. * */ FILE *wafsaget_in (void) { return wafsain; } /** Get the output stream. * */ FILE *wafsaget_out (void) { return wafsaout; } /** Get the length of the current token. * */ wafsa_size_t wafsaget_leng (void) { return wafsaleng; } /** Get the current token. * */ char *wafsaget_text (void) { return wafsatext; } /** Set the current line number. * @param line_number * */ void wafsaset_lineno (int line_number ) { wafsalineno = line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param in_str A readable stream. * * @see wafsa_switch_to_buffer */ void wafsaset_in (FILE * in_str ) { wafsain = in_str ; } void wafsaset_out (FILE * out_str ) { wafsaout = out_str ; } int wafsaget_debug (void) { return wafsa_flex_debug; } void wafsaset_debug (int bdebug ) { wafsa_flex_debug = bdebug ; } static int wafsa_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from wafsalex_destroy(), so don't allocate here. */ (wafsa_buffer_stack) = 0; (wafsa_buffer_stack_top) = 0; (wafsa_buffer_stack_max) = 0; (wafsa_c_buf_p) = (char *) 0; (wafsa_init) = 0; (wafsa_start) = 0; /* Defined in main.c */ #ifdef YY_STDINIT wafsain = stdin; wafsaout = stdout; #else wafsain = (FILE *) 0; wafsaout = (FILE *) 0; #endif /* For future reference: Set errno on error, since we are called by * wafsalex_init() */ return 0; } /* wafsalex_destroy is for both reentrant and non-reentrant scanners. */ int wafsalex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ wafsa_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; wafsapop_buffer_state(); } /* Destroy the stack itself. */ wafsafree((wafsa_buffer_stack) ); (wafsa_buffer_stack) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * wafsalex() is called, initialization will occur. */ wafsa_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef wafsatext_ptr static void wafsa_flex_strncpy (char* s1, wafsaconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int wafsa_flex_strlen (wafsaconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *wafsaalloc (wafsa_size_t size ) { return (void *) malloc( size ); } void *wafsarealloc (void * ptr, wafsa_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void wafsafree (void * ptr ) { free( (char *) ptr ); /* see wafsarealloc() for (char *) cast */ } #define YYTABLES_NAME "wafsatables" #line 69 "../../../../../src/lib/oogl/wa/fsaparse.l" int wafsawrap() { return(1); } geomview-1.9.5/src/lib/oogl/wa/wa.yacc.c0000644000175000017500000015277012310165601014675 00000000000000/* A Bison parser, made by GNU Bison 2.7.12-4996. */ /* Bison implementation for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 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, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with wafsa or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.7.12-4996" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Push parsers. */ #define YYPUSH 0 /* Pull parsers. */ #define YYPULL 1 /* Copy the first part of user declarations. */ /* Line 371 of yacc.c */ #line 16 "../../../../../src/lib/oogl/wa/fsaparse.y" #if 0 static char copyright[] = "Copyright (C) 1991 Mark B. Phillips, The Geometry Center"; #endif #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include "wa.h" #include "wa.yystype.h" #include "wa.yacc.h" #define MAXSTATES 100 #define MAXGENS 128 static int adj[MAXSTATES]; static int adj_index = 0; static void install_adjacency(); static void wafsaerror(char *s); extern int wafsalex(void); static wa *fsa; /* Line 371 of yacc.c */ #line 99 "y.tab.c" # ifndef YY_NULL # if defined __cplusplus && 201103L <= __cplusplus # define YY_NULL nullptr # else # define YY_NULL 0 # endif # endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* In a future release of Bison, this section will be replaced by #include "y.tab.h". */ #ifndef YY_YY_Y_TAB_H_INCLUDED # define YY_YY_Y_TAB_H_INCLUDED /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int wafsadebug; #endif /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum wafsatokentype { FORMAT = 258, FSA = 259, STATES = 260, SYMBOLS = 261, BFS = 262, MIN = 263, VARIABLES = 264, ALPHABET = 265, START = 266, ATABLE = 267, INVERSES = 268, INV = 269, LEFT_BRACE = 270, RIGHT_BRACE = 271, LEFT_PAREN = 272, RIGHT_PAREN = 273, SEMICOLON = 274, PERCENT = 275, INT = 276, EQUAL = 277, STRING = 278, REAL = 279 }; #endif /* Tokens. */ #define FORMAT 258 #define FSA 259 #define STATES 260 #define SYMBOLS 261 #define BFS 262 #define MIN 263 #define VARIABLES 264 #define ALPHABET 265 #define START 266 #define ATABLE 267 #define INVERSES 268 #define INV 269 #define LEFT_BRACE 270 #define RIGHT_BRACE 271 #define LEFT_PAREN 272 #define RIGHT_PAREN 273 #define SEMICOLON 274 #define PERCENT 275 #define INT 276 #define EQUAL 277 #define STRING 278 #define REAL 279 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED # define wafsastype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 #endif extern YYSTYPE wafsalval; #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int wafsaparse (void *YYPARSE_PARAM); #else int wafsaparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int wafsaparse (void); #else int wafsaparse (); #endif #endif /* ! YYPARSE_PARAM */ #endif /* !YY_YY_Y_TAB_H_INCLUDED */ /* Copy the second part of user declarations. */ /* Line 390 of yacc.c */ #line 212 "y.tab.c" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 wafsatype_uint8; #else typedef unsigned char wafsatype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 wafsatype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char wafsatype_int8; #else typedef short int wafsatype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 wafsatype_uint16; #else typedef unsigned short int wafsatype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 wafsatype_int16; #else typedef short int wafsatype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ # define YY_(Msgid) Msgid # endif #endif #ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ # if (! defined __GNUC__ || __GNUC__ < 2 \ || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)) # define __attribute__(Spec) /* empty */ # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(E) ((void) (E)) #else # define YYUSE(E) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(N) (N) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int wafsai) #else static int YYID (wafsai) int wafsai; #endif { return wafsai; } #endif #if ! defined wafsaoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined wafsaoverflow || YYERROR_VERBOSE */ #if (! defined wafsaoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union wafsaalloc { wafsatype_int16 wafsass_alloc; YYSTYPE wafsavs_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union wafsaalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (wafsatype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ do \ { \ YYSIZE_T wafsanewbytes; \ YYCOPY (&wafsaptr->Stack_alloc, Stack, wafsasize); \ Stack = &wafsaptr->Stack_alloc; \ wafsanewbytes = wafsastacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ wafsaptr += wafsanewbytes / sizeof (*wafsaptr); \ } \ while (YYID (0)) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED /* Copy COUNT objects from SRC to DST. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(Dst, Src, Count) \ __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) # else # define YYCOPY(Dst, Src, Count) \ do \ { \ YYSIZE_T wafsai; \ for (wafsai = 0; wafsai < (Count); wafsai++) \ (Dst)[wafsai] = (Src)[wafsai]; \ } \ while (YYID (0)) # endif # endif #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 4 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 44 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 25 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 18 /* YYNRULES -- Number of rules. */ #define YYNRULES 29 /* YYNRULES -- Number of states. */ #define YYNSTATES 56 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 279 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? wafsatranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const wafsatype_uint8 wafsatranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const wafsatype_uint8 wafsaprhs[] = { 0, 0, 3, 7, 17, 20, 23, 25, 28, 30, 32, 35, 37, 40, 42, 44, 49, 51, 54, 58, 63, 69, 71, 74, 77, 79, 81, 84, 89, 91 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const wafsatype_int8 wafsarhs[] = { 26, 0, -1, 3, 24, 27, -1, 4, 15, 28, 29, 30, 32, 20, 39, 16, -1, 5, 21, -1, 6, 21, -1, 31, -1, 31, 30, -1, 7, -1, 8, -1, 9, 21, -1, 33, -1, 33, 32, -1, 34, -1, 37, -1, 10, 15, 35, 16, -1, 36, -1, 35, 36, -1, 21, 22, 23, -1, 11, 15, 21, 16, -1, 11, 15, 21, 38, 16, -1, 21, -1, 21, 38, -1, 12, 40, -1, 12, -1, 41, -1, 41, 40, -1, 21, 23, 42, 19, -1, 21, -1, 42, 21, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const wafsatype_uint8 wafsarline[] = { 0, 58, 58, 61, 73, 81, 98, 99, 104, 105, 106, 110, 111, 114, 115, 121, 124, 125, 128, 136, 138, 143, 144, 148, 149, 152, 153, 156, 160, 164 }; #endif #if YYDEBUG || YYERROR_VERBOSE || 0 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const wafsatname[] = { "$end", "error", "$undefined", "FORMAT", "FSA", "STATES", "SYMBOLS", "BFS", "MIN", "VARIABLES", "ALPHABET", "START", "ATABLE", "INVERSES", "INV", "LEFT_BRACE", "RIGHT_BRACE", "LEFT_PAREN", "RIGHT_PAREN", "SEMICOLON", "PERCENT", "INT", "EQUAL", "STRING", "REAL", "$accept", "fsa_file", "fsa_format", "states", "symbols", "fsa_characteristics", "fsa_characteristic", "info_items", "info_item", "alphabet", "symbol_names", "symbol_name", "start_states", "int_list", "fsa_table", "acstates", "acstate", "adjacency", YY_NULL }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const wafsatype_uint16 wafsatoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const wafsatype_uint8 wafsar1[] = { 0, 25, 26, 27, 28, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 34, 35, 35, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 42, 42 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const wafsatype_uint8 wafsar2[] = { 0, 2, 3, 9, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 4, 1, 2, 3, 4, 5, 1, 2, 2, 1, 1, 2, 4, 1, 2 }; /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. Performed when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const wafsatype_uint8 wafsadefact[] = { 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 4, 0, 0, 5, 8, 9, 0, 0, 6, 10, 0, 0, 0, 11, 13, 14, 7, 0, 0, 0, 12, 0, 0, 16, 0, 24, 0, 0, 15, 17, 19, 21, 0, 0, 23, 25, 3, 18, 22, 20, 0, 26, 28, 0, 27, 29 }; /* YYDEFGOTO[NTERM-NUM]. */ static const wafsatype_int8 wafsadefgoto[] = { -1, 2, 6, 9, 12, 17, 18, 22, 23, 24, 32, 33, 25, 42, 36, 44, 45, 53 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -17 static const wafsatype_int8 wafsapact[] = { 5, -11, 12, 10, -17, 1, -17, 13, -6, 11, -17, -2, -5, -17, -17, -17, -1, 0, -5, -17, 6, 7, 3, 0, -17, -17, -17, 4, 8, 14, -17, 2, -16, -17, -15, 9, 15, 16, -17, -17, -17, 17, 18, 19, -17, 9, -17, -17, -17, -17, 20, -17, -17, -12, -17, -17 }; /* YYPGOTO[NTERM-NUM]. */ static const wafsatype_int8 wafsapgoto[] = { -17, -17, -17, -17, -17, 22, -17, 21, -17, -17, -17, -4, -17, -14, -17, -13, -17, -17 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1 static const wafsatype_uint8 wafsatable[] = { 38, 40, 14, 15, 16, 31, 41, 54, 1, 55, 20, 21, 4, 3, 5, 10, 7, 11, 8, 13, 19, 27, 28, 29, 37, 31, 35, 48, 39, 34, 43, 46, 51, 0, 49, 0, 0, 0, 41, 47, 26, 52, 50, 0, 30 }; #define wafsapact_value_is_default(Yystate) \ (!!((Yystate) == (-17))) #define wafsatable_value_is_error(Yytable_value) \ YYID (0) static const wafsatype_int8 wafsacheck[] = { 16, 16, 7, 8, 9, 21, 21, 19, 3, 21, 10, 11, 0, 24, 4, 21, 15, 6, 5, 21, 21, 15, 15, 20, 22, 21, 12, 41, 32, 21, 21, 16, 45, -1, 16, -1, -1, -1, 21, 23, 18, 21, 23, -1, 23 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const wafsatype_uint8 wafsastos[] = { 0, 3, 26, 24, 0, 4, 27, 15, 5, 28, 21, 6, 29, 21, 7, 8, 9, 30, 31, 21, 10, 11, 32, 33, 34, 37, 30, 15, 15, 20, 32, 21, 35, 36, 21, 12, 39, 22, 16, 36, 16, 21, 38, 21, 40, 41, 16, 23, 38, 16, 23, 40, 21, 42, 19, 21 }; #define wafsaerrok (wafsaerrstatus = 0) #define wafsaclearin (wafsachar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto wafsaacceptlab #define YYABORT goto wafsaabortlab #define YYERROR goto wafsaerrorlab /* Like YYERROR except do call wafsaerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. However, YYFAIL appears to be in use. Nevertheless, it is formally deprecated in Bison 2.4.2's NEWS entry, where a plan to phase it out is discussed. */ #define YYFAIL goto wafsaerrlab #if defined YYFAIL /* This is here to suppress warnings from the GCC cpp's -Wunused-macros. Normally we don't worry about that warning, but some users do, and we want to make it easy for users to remove YYFAIL uses, which will produce warnings from Bison 2.5. */ #endif #define YYRECOVERING() (!!wafsaerrstatus) #define YYBACKUP(Token, Value) \ do \ if (wafsachar == YYEMPTY) \ { \ wafsachar = (Token); \ wafsalval = (Value); \ YYPOPSTACK (wafsalen); \ wafsastate = *wafsassp; \ goto wafsabackup; \ } \ else \ { \ wafsaerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) /* Error token number */ #define YYTERROR 1 #define YYERRCODE 256 /* This macro is provided for backward compatibility. */ #ifndef YY_LOCATION_PRINT # define YY_LOCATION_PRINT(File, Loc) ((void) 0) #endif /* YYLEX -- calling `wafsalex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX wafsalex (YYLEX_PARAM) #else # define YYLEX wafsalex () #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (wafsadebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (wafsadebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ wafsa_symbol_print (stderr, \ Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void wafsa_symbol_value_print (FILE *wafsaoutput, int wafsatype, YYSTYPE const * const wafsavaluep) #else static void wafsa_symbol_value_print (wafsaoutput, wafsatype, wafsavaluep) FILE *wafsaoutput; int wafsatype; YYSTYPE const * const wafsavaluep; #endif { FILE *wafsao = wafsaoutput; YYUSE (wafsao); if (!wafsavaluep) return; # ifdef YYPRINT if (wafsatype < YYNTOKENS) YYPRINT (wafsaoutput, wafsatoknum[wafsatype], *wafsavaluep); # else YYUSE (wafsaoutput); # endif YYUSE (wafsatype); } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void wafsa_symbol_print (FILE *wafsaoutput, int wafsatype, YYSTYPE const * const wafsavaluep) #else static void wafsa_symbol_print (wafsaoutput, wafsatype, wafsavaluep) FILE *wafsaoutput; int wafsatype; YYSTYPE const * const wafsavaluep; #endif { if (wafsatype < YYNTOKENS) YYFPRINTF (wafsaoutput, "token %s (", wafsatname[wafsatype]); else YYFPRINTF (wafsaoutput, "nterm %s (", wafsatname[wafsatype]); wafsa_symbol_value_print (wafsaoutput, wafsatype, wafsavaluep); YYFPRINTF (wafsaoutput, ")"); } /*------------------------------------------------------------------. | wafsa_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void wafsa_stack_print (wafsatype_int16 *wafsabottom, wafsatype_int16 *wafsatop) #else static void wafsa_stack_print (wafsabottom, wafsatop) wafsatype_int16 *wafsabottom; wafsatype_int16 *wafsatop; #endif { YYFPRINTF (stderr, "Stack now"); for (; wafsabottom <= wafsatop; wafsabottom++) { int wafsabot = *wafsabottom; YYFPRINTF (stderr, " %d", wafsabot); } YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (wafsadebug) \ wafsa_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void wafsa_reduce_print (YYSTYPE *wafsavsp, int wafsarule) #else static void wafsa_reduce_print (wafsavsp, wafsarule) YYSTYPE *wafsavsp; int wafsarule; #endif { int wafsanrhs = wafsar2[wafsarule]; int wafsai; unsigned long int wafsalno = wafsarline[wafsarule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", wafsarule - 1, wafsalno); /* The symbols being reduced. */ for (wafsai = 0; wafsai < wafsanrhs; wafsai++) { YYFPRINTF (stderr, " $%d = ", wafsai + 1); wafsa_symbol_print (stderr, wafsarhs[wafsaprhs[wafsarule] + wafsai], &(wafsavsp[(wafsai + 1) - (wafsanrhs)]) ); YYFPRINTF (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (wafsadebug) \ wafsa_reduce_print (wafsavsp, Rule); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int wafsadebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef wafsastrlen # if defined __GLIBC__ && defined _STRING_H # define wafsastrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T wafsastrlen (const char *wafsastr) #else static YYSIZE_T wafsastrlen (wafsastr) const char *wafsastr; #endif { YYSIZE_T wafsalen; for (wafsalen = 0; wafsastr[wafsalen]; wafsalen++) continue; return wafsalen; } # endif # endif # ifndef wafsastpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define wafsastpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * wafsastpcpy (char *wafsadest, const char *wafsasrc) #else static char * wafsastpcpy (wafsadest, wafsasrc) char *wafsadest; const char *wafsasrc; #endif { char *wafsad = wafsadest; const char *wafsas = wafsasrc; while ((*wafsad++ = *wafsas++) != '\0') continue; return wafsad - 1; } # endif # endif # ifndef wafsatnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for wafsaerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from wafsatname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T wafsatnamerr (char *wafsares, const char *wafsastr) { if (*wafsastr == '"') { YYSIZE_T wafsan = 0; char const *wafsap = wafsastr; for (;;) switch (*++wafsap) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++wafsap != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (wafsares) wafsares[wafsan] = *wafsap; wafsan++; break; case '"': if (wafsares) wafsares[wafsan] = '\0'; return wafsan; } do_not_strip_quotes: ; } if (! wafsares) return wafsastrlen (wafsastr); return wafsastpcpy (wafsares, wafsastr) - wafsares; } # endif /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message about the unexpected token YYTOKEN for the state stack whose top is YYSSP. Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is not large enough to hold the message. In that case, also set *YYMSG_ALLOC to the required number of bytes. Return 2 if the required number of bytes is too large to store. */ static int wafsasyntax_error (YYSIZE_T *wafsamsg_alloc, char **wafsamsg, wafsatype_int16 *wafsassp, int wafsatoken) { YYSIZE_T wafsasize0 = wafsatnamerr (YY_NULL, wafsatname[wafsatoken]); YYSIZE_T wafsasize = wafsasize0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ const char *wafsaformat = YY_NULL; /* Arguments of wafsaformat. */ char const *wafsaarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per "expected"). */ int wafsacount = 0; /* There are many possibilities here to consider: - Assume YYFAIL is not used. It's too flawed to consider. See for details. YYERROR is fine as it does not invoke this function. - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected tokens because there are none. - The only way there can be no lookahead present (in wafsachar) is if this state is a consistent state with a default action. Thus, detecting the absence of a lookahead is sufficient to determine that there is no unexpected or expected token to report. In that case, just report a simple "syntax error". - Don't assume there isn't a lookahead just because this state is a consistent state with a default action. There might have been a previous inconsistent state, consistent state with a non-default action, or user semantic action that manipulated wafsachar. - Of course, the expected token list depends on states to have correct lookahead information, and it depends on the parser not to perform extra reductions after fetching a lookahead from the scanner and before detecting a syntax error. Thus, state merging (from LALR or IELR) and default reductions corrupt the expected token list. However, the list is correct for canonical LR with one exception: it will still contain any token that will not be accepted due to an error action in a later state. */ if (wafsatoken != YYEMPTY) { int wafsan = wafsapact[*wafsassp]; wafsaarg[wafsacount++] = wafsatname[wafsatoken]; if (!wafsapact_value_is_default (wafsan)) { /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. In other words, skip the first -YYN actions for this state because they are default actions. */ int wafsaxbegin = wafsan < 0 ? -wafsan : 0; /* Stay within bounds of both wafsacheck and wafsatname. */ int wafsachecklim = YYLAST - wafsan + 1; int wafsaxend = wafsachecklim < YYNTOKENS ? wafsachecklim : YYNTOKENS; int wafsax; for (wafsax = wafsaxbegin; wafsax < wafsaxend; ++wafsax) if (wafsacheck[wafsax + wafsan] == wafsax && wafsax != YYTERROR && !wafsatable_value_is_error (wafsatable[wafsax + wafsan])) { if (wafsacount == YYERROR_VERBOSE_ARGS_MAXIMUM) { wafsacount = 1; wafsasize = wafsasize0; break; } wafsaarg[wafsacount++] = wafsatname[wafsax]; { YYSIZE_T wafsasize1 = wafsasize + wafsatnamerr (YY_NULL, wafsatname[wafsax]); if (! (wafsasize <= wafsasize1 && wafsasize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; wafsasize = wafsasize1; } } } } switch (wafsacount) { # define YYCASE_(N, S) \ case N: \ wafsaformat = S; \ break YYCASE_(0, YY_("syntax error")); YYCASE_(1, YY_("syntax error, unexpected %s")); YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); # undef YYCASE_ } { YYSIZE_T wafsasize1 = wafsasize + wafsastrlen (wafsaformat); if (! (wafsasize <= wafsasize1 && wafsasize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; wafsasize = wafsasize1; } if (*wafsamsg_alloc < wafsasize) { *wafsamsg_alloc = 2 * wafsasize; if (! (wafsasize <= *wafsamsg_alloc && *wafsamsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) *wafsamsg_alloc = YYSTACK_ALLOC_MAXIMUM; return 1; } /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ { char *wafsap = *wafsamsg; int wafsai = 0; while ((*wafsap = *wafsaformat) != '\0') if (*wafsap == '%' && wafsaformat[1] == 's' && wafsai < wafsacount) { wafsap += wafsatnamerr (wafsap, wafsaarg[wafsai++]); wafsaformat += 2; } else { wafsap++; wafsaformat++; } } return 0; } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void wafsadestruct (const char *wafsamsg, int wafsatype, YYSTYPE *wafsavaluep) #else static void wafsadestruct (wafsamsg, wafsatype, wafsavaluep) const char *wafsamsg; int wafsatype; YYSTYPE *wafsavaluep; #endif { YYUSE (wafsavaluep); if (!wafsamsg) wafsamsg = "Deleting"; YY_SYMBOL_PRINT (wafsamsg, wafsatype, wafsavaluep, wafsalocationp); YYUSE (wafsatype); } /* The lookahead symbol. */ int wafsachar; #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_END #endif #ifndef YY_INITIAL_VALUE # define YY_INITIAL_VALUE(Value) /* Nothing. */ #endif /* The semantic value of the lookahead symbol. */ YYSTYPE wafsalval YY_INITIAL_VALUE(wafsaval_default); /* Number of syntax errors so far. */ int wafsanerrs; /*----------. | wafsaparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int wafsaparse (void *YYPARSE_PARAM) #else int wafsaparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int wafsaparse (void) #else int wafsaparse () #endif #endif { int wafsastate; /* Number of tokens to shift before error messages enabled. */ int wafsaerrstatus; /* The stacks and their tools: `wafsass': related to states. `wafsavs': related to semantic values. Refer to the stacks through separate pointers, to allow wafsaoverflow to reallocate them elsewhere. */ /* The state stack. */ wafsatype_int16 wafsassa[YYINITDEPTH]; wafsatype_int16 *wafsass; wafsatype_int16 *wafsassp; /* The semantic value stack. */ YYSTYPE wafsavsa[YYINITDEPTH]; YYSTYPE *wafsavs; YYSTYPE *wafsavsp; YYSIZE_T wafsastacksize; int wafsan; int wafsaresult; /* Lookahead token as an internal (translated) token number. */ int wafsatoken = 0; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE wafsaval; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char wafsamsgbuf[128]; char *wafsamsg = wafsamsgbuf; YYSIZE_T wafsamsg_alloc = sizeof wafsamsgbuf; #endif #define YYPOPSTACK(N) (wafsavsp -= (N), wafsassp -= (N)) /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int wafsalen = 0; wafsassp = wafsass = wafsassa; wafsavsp = wafsavs = wafsavsa; wafsastacksize = YYINITDEPTH; YYDPRINTF ((stderr, "Starting parse\n")); wafsastate = 0; wafsaerrstatus = 0; wafsanerrs = 0; wafsachar = YYEMPTY; /* Cause a token to be read. */ goto wafsasetstate; /*------------------------------------------------------------. | wafsanewstate -- Push a new state, which is found in wafsastate. | `------------------------------------------------------------*/ wafsanewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ wafsassp++; wafsasetstate: *wafsassp = wafsastate; if (wafsass + wafsastacksize - 1 <= wafsassp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T wafsasize = wafsassp - wafsass + 1; #ifdef wafsaoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *wafsavs1 = wafsavs; wafsatype_int16 *wafsass1 = wafsass; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if wafsaoverflow is a macro. */ wafsaoverflow (YY_("memory exhausted"), &wafsass1, wafsasize * sizeof (*wafsassp), &wafsavs1, wafsasize * sizeof (*wafsavsp), &wafsastacksize); wafsass = wafsass1; wafsavs = wafsavs1; } #else /* no wafsaoverflow */ # ifndef YYSTACK_RELOCATE goto wafsaexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= wafsastacksize) goto wafsaexhaustedlab; wafsastacksize *= 2; if (YYMAXDEPTH < wafsastacksize) wafsastacksize = YYMAXDEPTH; { wafsatype_int16 *wafsass1 = wafsass; union wafsaalloc *wafsaptr = (union wafsaalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (wafsastacksize)); if (! wafsaptr) goto wafsaexhaustedlab; YYSTACK_RELOCATE (wafsass_alloc, wafsass); YYSTACK_RELOCATE (wafsavs_alloc, wafsavs); # undef YYSTACK_RELOCATE if (wafsass1 != wafsassa) YYSTACK_FREE (wafsass1); } # endif #endif /* no wafsaoverflow */ wafsassp = wafsass + wafsasize - 1; wafsavsp = wafsavs + wafsasize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) wafsastacksize)); if (wafsass + wafsastacksize - 1 <= wafsassp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", wafsastate)); if (wafsastate == YYFINAL) YYACCEPT; goto wafsabackup; /*-----------. | wafsabackup. | `-----------*/ wafsabackup: /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to lookahead token. */ wafsan = wafsapact[wafsastate]; if (wafsapact_value_is_default (wafsan)) goto wafsadefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ if (wafsachar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); wafsachar = YYLEX; } if (wafsachar <= YYEOF) { wafsachar = wafsatoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { wafsatoken = YYTRANSLATE (wafsachar); YY_SYMBOL_PRINT ("Next token is", wafsatoken, &wafsalval, &wafsalloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ wafsan += wafsatoken; if (wafsan < 0 || YYLAST < wafsan || wafsacheck[wafsan] != wafsatoken) goto wafsadefault; wafsan = wafsatable[wafsan]; if (wafsan <= 0) { if (wafsatable_value_is_error (wafsan)) goto wafsaerrlab; wafsan = -wafsan; goto wafsareduce; } /* Count tokens shifted since error; after three, turn off error status. */ if (wafsaerrstatus) wafsaerrstatus--; /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", wafsatoken, &wafsalval, &wafsalloc); /* Discard the shifted token. */ wafsachar = YYEMPTY; wafsastate = wafsan; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++wafsavsp = wafsalval; YY_IGNORE_MAYBE_UNINITIALIZED_END goto wafsanewstate; /*-----------------------------------------------------------. | wafsadefault -- do the default action for the current state. | `-----------------------------------------------------------*/ wafsadefault: wafsan = wafsadefact[wafsastate]; if (wafsan == 0) goto wafsaerrlab; goto wafsareduce; /*-----------------------------. | wafsareduce -- Do a reduction. | `-----------------------------*/ wafsareduce: /* wafsan is the number of a rule to reduce with. */ wafsalen = wafsar2[wafsan]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ wafsaval = wafsavsp[1-wafsalen]; YY_REDUCE_PRINT (wafsan); switch (wafsan) { case 3: /* Line 1787 of yacc.c */ #line 70 "../../../../../src/lib/oogl/wa/fsaparse.y" { return(0); } break; case 4: /* Line 1787 of yacc.c */ #line 74 "../../../../../src/lib/oogl/wa/fsaparse.y" { fsa->nstates = (wafsavsp[(2) - (2)].i); fsa->action = (int**)malloc((fsa->nstates+1)*sizeof(int*)); } break; case 5: /* Line 1787 of yacc.c */ #line 82 "../../../../../src/lib/oogl/wa/fsaparse.y" { int i,j; fsa->ngens = (wafsavsp[(2) - (2)].i); for (i=0; i<=fsa->nstates; ++i) { fsa->action[i] = (int*)malloc((fsa->ngens+1)*sizeof(int)); for (j=0; j<=fsa->ngens; ++j) fsa->action[i][j] = 0; } fsa->genlist=(char**)malloc(fsa->ngens*sizeof(char*)); for (i=0; ingens; ++i) fsa->genlist[i] = ""; } break; case 14: /* Line 1787 of yacc.c */ #line 116 "../../../../../src/lib/oogl/wa/fsaparse.y" { fsa->start= (wafsavsp[(1) - (1)].i); } break; case 18: /* Line 1787 of yacc.c */ #line 129 "../../../../../src/lib/oogl/wa/fsaparse.y" { fsa->genlist[(wafsavsp[(1) - (3)].i)-1] = (char*)malloc((strlen((wafsavsp[(3) - (3)].s))+1)*sizeof(char)); strcpy(fsa->genlist[(wafsavsp[(1) - (3)].i)-1], (wafsavsp[(3) - (3)].s)); } break; case 19: /* Line 1787 of yacc.c */ #line 137 "../../../../../src/lib/oogl/wa/fsaparse.y" { (wafsaval.i) = (wafsavsp[(3) - (4)].i); } break; case 20: /* Line 1787 of yacc.c */ #line 139 "../../../../../src/lib/oogl/wa/fsaparse.y" { (wafsaval.i) = (wafsavsp[(3) - (5)].i); } break; case 27: /* Line 1787 of yacc.c */ #line 157 "../../../../../src/lib/oogl/wa/fsaparse.y" { install_adjacency((wafsavsp[(1) - (4)].i)); adj_index = 0; } break; case 28: /* Line 1787 of yacc.c */ #line 161 "../../../../../src/lib/oogl/wa/fsaparse.y" { adj[adj_index++] = (wafsavsp[(1) - (1)].i); } break; case 29: /* Line 1787 of yacc.c */ #line 165 "../../../../../src/lib/oogl/wa/fsaparse.y" { adj[adj_index++] = (wafsavsp[(2) - (2)].i); } break; /* Line 1787 of yacc.c */ #line 1525 "y.tab.c" default: break; } /* User semantic actions sometimes alter wafsachar, and that requires that wafsatoken be updated with the new translation. We take the approach of translating immediately before every use of wafsatoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering wafsachar or if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", wafsar1[wafsan], &wafsaval, &wafsaloc); YYPOPSTACK (wafsalen); wafsalen = 0; YY_STACK_PRINT (wafsass, wafsassp); *++wafsavsp = wafsaval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ wafsan = wafsar1[wafsan]; wafsastate = wafsapgoto[wafsan - YYNTOKENS] + *wafsassp; if (0 <= wafsastate && wafsastate <= YYLAST && wafsacheck[wafsastate] == *wafsassp) wafsastate = wafsatable[wafsastate]; else wafsastate = wafsadefgoto[wafsan - YYNTOKENS]; goto wafsanewstate; /*------------------------------------. | wafsaerrlab -- here on detecting error | `------------------------------------*/ wafsaerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ wafsatoken = wafsachar == YYEMPTY ? YYEMPTY : YYTRANSLATE (wafsachar); /* If not already recovering from an error, report this error. */ if (!wafsaerrstatus) { ++wafsanerrs; #if ! YYERROR_VERBOSE wafsaerror (YY_("syntax error")); #else # define YYSYNTAX_ERROR wafsasyntax_error (&wafsamsg_alloc, &wafsamsg, \ wafsassp, wafsatoken) { char const *wafsamsgp = YY_("syntax error"); int wafsasyntax_error_status; wafsasyntax_error_status = YYSYNTAX_ERROR; if (wafsasyntax_error_status == 0) wafsamsgp = wafsamsg; else if (wafsasyntax_error_status == 1) { if (wafsamsg != wafsamsgbuf) YYSTACK_FREE (wafsamsg); wafsamsg = (char *) YYSTACK_ALLOC (wafsamsg_alloc); if (!wafsamsg) { wafsamsg = wafsamsgbuf; wafsamsg_alloc = sizeof wafsamsgbuf; wafsasyntax_error_status = 2; } else { wafsasyntax_error_status = YYSYNTAX_ERROR; wafsamsgp = wafsamsg; } } wafsaerror (wafsamsgp); if (wafsasyntax_error_status == 2) goto wafsaexhaustedlab; } # undef YYSYNTAX_ERROR #endif } if (wafsaerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (wafsachar <= YYEOF) { /* Return failure if at end of input. */ if (wafsachar == YYEOF) YYABORT; } else { wafsadestruct ("Error: discarding", wafsatoken, &wafsalval); wafsachar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto wafsaerrlab1; /*---------------------------------------------------. | wafsaerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ wafsaerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label wafsaerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto wafsaerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (wafsalen); wafsalen = 0; YY_STACK_PRINT (wafsass, wafsassp); wafsastate = *wafsassp; goto wafsaerrlab1; /*-------------------------------------------------------------. | wafsaerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ wafsaerrlab1: wafsaerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { wafsan = wafsapact[wafsastate]; if (!wafsapact_value_is_default (wafsan)) { wafsan += YYTERROR; if (0 <= wafsan && wafsan <= YYLAST && wafsacheck[wafsan] == YYTERROR) { wafsan = wafsatable[wafsan]; if (0 < wafsan) break; } } /* Pop the current state because it cannot handle the error token. */ if (wafsassp == wafsass) YYABORT; wafsadestruct ("Error: popping", wafsastos[wafsastate], wafsavsp); YYPOPSTACK (1); wafsastate = *wafsassp; YY_STACK_PRINT (wafsass, wafsassp); } YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++wafsavsp = wafsalval; YY_IGNORE_MAYBE_UNINITIALIZED_END /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", wafsastos[wafsan], wafsavsp, wafsalsp); wafsastate = wafsan; goto wafsanewstate; /*-------------------------------------. | wafsaacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ wafsaacceptlab: wafsaresult = 0; goto wafsareturn; /*-----------------------------------. | wafsaabortlab -- YYABORT comes here. | `-----------------------------------*/ wafsaabortlab: wafsaresult = 1; goto wafsareturn; #if !defined wafsaoverflow || YYERROR_VERBOSE /*-------------------------------------------------. | wafsaexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ wafsaexhaustedlab: wafsaerror (YY_("memory exhausted")); wafsaresult = 2; /* Fall through. */ #endif wafsareturn: if (wafsachar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ wafsatoken = YYTRANSLATE (wafsachar); wafsadestruct ("Cleanup: discarding lookahead", wafsatoken, &wafsalval); } /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (wafsalen); YY_STACK_PRINT (wafsass, wafsassp); while (wafsassp != wafsass) { wafsadestruct ("Cleanup: popping", wafsastos[*wafsassp], wafsavsp); YYPOPSTACK (1); } #ifndef wafsaoverflow if (wafsass != wafsassa) YYSTACK_FREE (wafsass); #endif #if YYERROR_VERBOSE if (wafsamsg != wafsamsgbuf) YYSTACK_FREE (wafsamsg); #endif /* Make sure YYID is used. */ return YYID (wafsaresult); } /* Line 2050 of yacc.c */ #line 171 "../../../../../src/lib/oogl/wa/fsaparse.y" static void wafsaerror(char *s) { printf("wafsaerror: %s\n", s); } static void install_adjacency(n) int n; { int i; for (i=0; iaction[n][i+1] = adj[i]; } void parse_init(f) wa *f; { fsa = f; fsa->fail = fsa->state = 0; } /*----------------------------------------------------------------------- * Function: fsaparse * Description: parse a .wa file into an wa struct * Args IN: fp: .wa file pointer * OUT: *fsa: the resulting fsa struct * Returns: 1 for success, 0 for error * Author: mbp * Date: Sat Mar 23 21:47:04 1991 * Notes: Does not recognize the full grammar defined by * "Data Exchange for Automatic Groups". Only recognizes * files of the form used by several examples I was * using at the time I wrote this. I think, but am not * at all sure, that this includes all word-acceptor * automata. */ int fsaparse(fp, fsa) FILE *fp; wa *fsa; { extern FILE *wafsain; int ret; parse_init(fsa); wafsain = fp; ret = wafsaparse(); return(ret ==0); } geomview-1.9.5/src/lib/oogl/wa/wa.yacc.h0000644000175000017500000000634312310165601014674 00000000000000/* A Bison parser, made by GNU Bison 2.7.12-4996. */ /* Bison interface for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 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, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ #ifndef YY_YY_Y_TAB_H_INCLUDED # define YY_YY_Y_TAB_H_INCLUDED /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int wafsadebug; #endif /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum wafsatokentype { FORMAT = 258, FSA = 259, STATES = 260, SYMBOLS = 261, BFS = 262, MIN = 263, VARIABLES = 264, ALPHABET = 265, START = 266, ATABLE = 267, INVERSES = 268, INV = 269, LEFT_BRACE = 270, RIGHT_BRACE = 271, LEFT_PAREN = 272, RIGHT_PAREN = 273, SEMICOLON = 274, PERCENT = 275, INT = 276, EQUAL = 277, STRING = 278, REAL = 279 }; #endif /* Tokens. */ #define FORMAT 258 #define FSA 259 #define STATES 260 #define SYMBOLS 261 #define BFS 262 #define MIN 263 #define VARIABLES 264 #define ALPHABET 265 #define START 266 #define ATABLE 267 #define INVERSES 268 #define INV 269 #define LEFT_BRACE 270 #define RIGHT_BRACE 271 #define LEFT_PAREN 272 #define RIGHT_PAREN 273 #define SEMICOLON 274 #define PERCENT 275 #define INT 276 #define EQUAL 277 #define STRING 278 #define REAL 279 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED # define wafsastype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 #endif extern YYSTYPE wafsalval; #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int wafsaparse (void *YYPARSE_PARAM); #else int wafsaparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int wafsaparse (void); #else int wafsaparse (); #endif #endif /* ! YYPARSE_PARAM */ #endif /* !YY_YY_Y_TAB_H_INCLUDED */ geomview-1.9.5/src/lib/oogl/wa/wa.h0000644000175000017500000000212212310110201013727 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _WA_H_ #define _WA_H_ /* Word acceptor structure: */ typedef struct { int start, fail, state; int nstates, ngens; char **genlist; int **action; } wa; void wfsaerror(char *s); #endif geomview-1.9.5/src/lib/oogl/wa/wa.yystype.h0000644000175000017500000000212312310110201015455 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _YYSTYPE_H_ #define _YYSTYPE_H_ typedef union stackunion { double d; int i; char s[80]; } YYSTYPE; extern YYSTYPE yylval; #define YYSTYPE_IS_DECLARED 1 void wfsaerror(char *s); #endif geomview-1.9.5/src/lib/oogl/wa/Headers0000644000175000017500000000003412310110201014445 00000000000000wa.h wa.yacc.h wa.yystype.h geomview-1.9.5/src/lib/oogl/wa/fsaparse.y0000644000175000017500000000757412310110201015165 00000000000000/* * fsaparse.y * * Yacc grammar for parsing word-acceptor automata in the format * described by DEAGL ("Data Exchange for Automata and Groups * Language"). * * This grammar does NOT recognize the entire language described * in DEAGL. The main function is fsaparse(), defined below. See * the comments in that function for more info. * * mbp Sat Mar 23 21:56:30 1991 * mbp@thales.urich.edu */ %{ #if 0 static char copyright[] = "Copyright (C) 1991 Mark B. Phillips, The Geometry Center"; #endif #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include "wa.h" #include "wa.yystype.h" #include "wa.yacc.h" #define MAXSTATES 100 #define MAXGENS 128 static int adj[MAXSTATES]; static int adj_index = 0; static void install_adjacency(); static void yyerror(char *s); extern int yylex(void); static wa *fsa; %} %start fsa_file %token FORMAT FSA STATES SYMBOLS BFS MIN VARIABLES ALPHABET START ATABLE INVERSES INV LEFT_BRACE RIGHT_BRACE LEFT_PAREN RIGHT_PAREN SEMICOLON PERCENT INT EQUAL %token STRING %token REAL %type start_states %% fsa_file : FORMAT REAL fsa_format ; fsa_format : FSA LEFT_BRACE states symbols fsa_characteristics info_items PERCENT fsa_table RIGHT_BRACE { return(0); } ; states : STATES INT { fsa->nstates = $2; fsa->action = (int**)malloc((fsa->nstates+1)*sizeof(int*)); } ; symbols : SYMBOLS INT { int i,j; fsa->ngens = $2; for (i=0; i<=fsa->nstates; ++i) { fsa->action[i] = (int*)malloc((fsa->ngens+1)*sizeof(int)); for (j=0; j<=fsa->ngens; ++j) fsa->action[i][j] = 0; } fsa->genlist=(char**)malloc(fsa->ngens*sizeof(char*)); for (i=0; ingens; ++i) fsa->genlist[i] = ""; } ; fsa_characteristics : fsa_characteristic | fsa_characteristic fsa_characteristics ; fsa_characteristic : BFS | MIN | VARIABLES INT ; info_items : info_item | info_item info_items ; info_item : alphabet | start_states { fsa->start= $1; } ; alphabet : ALPHABET LEFT_BRACE symbol_names RIGHT_BRACE ; symbol_names : symbol_name | symbol_names symbol_name ; symbol_name : INT EQUAL STRING { fsa->genlist[$1-1] = (char*)malloc((strlen($3)+1)*sizeof(char)); strcpy(fsa->genlist[$1-1], $3); } ; start_states : START LEFT_BRACE INT RIGHT_BRACE { $$ = $3; } | START LEFT_BRACE INT int_list RIGHT_BRACE { $$ = $3; } ; int_list : INT | INT int_list ; fsa_table : ATABLE acstates | ATABLE ; acstates : acstate | acstate acstates ; acstate : INT STRING adjacency SEMICOLON { install_adjacency($1); adj_index = 0; } ; adjacency : INT { adj[adj_index++] = $1; } | adjacency INT { adj[adj_index++] = $2; } ; %% static void yyerror(char *s) { printf("yyerror: %s\n", s); } static void install_adjacency(n) int n; { int i; for (i=0; iaction[n][i+1] = adj[i]; } void parse_init(f) wa *f; { fsa = f; fsa->fail = fsa->state = 0; } /*----------------------------------------------------------------------- * Function: fsaparse * Description: parse a .wa file into an wa struct * Args IN: fp: .wa file pointer * OUT: *fsa: the resulting fsa struct * Returns: 1 for success, 0 for error * Author: mbp * Date: Sat Mar 23 21:47:04 1991 * Notes: Does not recognize the full grammar defined by * "Data Exchange for Automatic Groups". Only recognizes * files of the form used by several examples I was * using at the time I wrote this. I think, but am not * at all sure, that this includes all word-acceptor * automata. */ int fsaparse(fp, fsa) FILE *fp; wa *fsa; { extern FILE *yyin; int ret; parse_init(fsa); yyin = fp; ret = yyparse(); return(ret ==0); } geomview-1.9.5/src/lib/oogl/wa/fsaparse.l0000644000175000017500000000270712310110201015141 00000000000000%{ /* * fsaparse.l (lex.yy.c) * * Lex definitions for lexical scanner for parsing word-acceptor * automata. See fsaparse.y for more info. * * mbp Sat Mar 23 21:58:12 1991 * mbp@thales.urich.edu */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include /* for atof() */ #include #include #include "wa.yystype.h" #include "wa.yacc.h" YYSTYPE yylval; /* disable output of unmatched input */ #undef output #define output(c) %} DIGIT [0-9] WS [ \t\n,] LETTER [A-Za-z] SIGN [+-] %% /* RULES SECTION */ {WS}+ ; "Format" { return(FORMAT); } "format" { return(FORMAT); } "fsa" { return(FSA); } "states" { return(STATES); } "symbols" { return(SYMBOLS); } "bfs" { return(BFS); } "min" { return(MIN); } "variables" { return(VARIABLES); } "alphabet" { return(ALPHABET); } "start" { return(START); } "atable" { return(ATABLE); } "inverses" { return(INVERSES); } "inv" { return(INV); } "{" { return(LEFT_BRACE); } "}" { return(RIGHT_BRACE); } "(" { return(LEFT_PAREN); } ")" { return(RIGHT_PAREN); } ";" { return(SEMICOLON); } "%" { return(PERCENT); } "=" { return(EQUAL); } {SIGN}?{DIGIT}+ { yylval.i = atoi(yytext); return(INT); } {SIGN}?{DIGIT}*\.{DIGIT}? { yylval.d = atof(yytext); return(REAL); } {SIGN}?{DIGIT}+\.{DIGIT}* { yylval.d = atof(yytext); return(REAL); } [^ \t\n{};%()=]+ { strcpy(yylval.s, yytext); return(STRING); } %% /* SUBPROGRAMS SECTION */ int yywrap() { return(1); } geomview-1.9.5/src/lib/oogl/wa/y.tab.h0000644000175000017500000000631312310165601014361 00000000000000/* A Bison parser, made by GNU Bison 2.7.12-4996. */ /* Bison interface for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 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, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ #ifndef YY_YY_Y_TAB_H_INCLUDED # define YY_YY_Y_TAB_H_INCLUDED /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int yydebug; #endif /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { FORMAT = 258, FSA = 259, STATES = 260, SYMBOLS = 261, BFS = 262, MIN = 263, VARIABLES = 264, ALPHABET = 265, START = 266, ATABLE = 267, INVERSES = 268, INV = 269, LEFT_BRACE = 270, RIGHT_BRACE = 271, LEFT_PAREN = 272, RIGHT_PAREN = 273, SEMICOLON = 274, PERCENT = 275, INT = 276, EQUAL = 277, STRING = 278, REAL = 279 }; #endif /* Tokens. */ #define FORMAT 258 #define FSA 259 #define STATES 260 #define SYMBOLS 261 #define BFS 262 #define MIN 263 #define VARIABLES 264 #define ALPHABET 265 #define START 266 #define ATABLE 267 #define INVERSES 268 #define INV 269 #define LEFT_BRACE 270 #define RIGHT_BRACE 271 #define LEFT_PAREN 272 #define RIGHT_PAREN 273 #define SEMICOLON 274 #define PERCENT 275 #define INT 276 #define EQUAL 277 #define STRING 278 #define REAL 279 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 #endif extern YYSTYPE yylval; #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (void); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ #endif /* !YY_YY_Y_TAB_H_INCLUDED */ geomview-1.9.5/src/lib/oogl/wa/y.tab.c0000644000175000017500000014644512310165601014367 00000000000000/* A Bison parser, made by GNU Bison 2.7.12-4996. */ /* Bison implementation for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 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, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.7.12-4996" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Push parsers. */ #define YYPUSH 0 /* Pull parsers. */ #define YYPULL 1 /* Copy the first part of user declarations. */ /* Line 371 of yacc.c */ #line 16 "../../../../../src/lib/oogl/wa/fsaparse.y" #if 0 static char copyright[] = "Copyright (C) 1991 Mark B. Phillips, The Geometry Center"; #endif #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include "wa.h" #include "wa.yystype.h" #include "wa.yacc.h" #define MAXSTATES 100 #define MAXGENS 128 static int adj[MAXSTATES]; static int adj_index = 0; static void install_adjacency(); static void yyerror(char *s); extern int yylex(void); static wa *fsa; /* Line 371 of yacc.c */ #line 99 "y.tab.c" # ifndef YY_NULL # if defined __cplusplus && 201103L <= __cplusplus # define YY_NULL nullptr # else # define YY_NULL 0 # endif # endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* In a future release of Bison, this section will be replaced by #include "y.tab.h". */ #ifndef YY_YY_Y_TAB_H_INCLUDED # define YY_YY_Y_TAB_H_INCLUDED /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int yydebug; #endif /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { FORMAT = 258, FSA = 259, STATES = 260, SYMBOLS = 261, BFS = 262, MIN = 263, VARIABLES = 264, ALPHABET = 265, START = 266, ATABLE = 267, INVERSES = 268, INV = 269, LEFT_BRACE = 270, RIGHT_BRACE = 271, LEFT_PAREN = 272, RIGHT_PAREN = 273, SEMICOLON = 274, PERCENT = 275, INT = 276, EQUAL = 277, STRING = 278, REAL = 279 }; #endif /* Tokens. */ #define FORMAT 258 #define FSA 259 #define STATES 260 #define SYMBOLS 261 #define BFS 262 #define MIN 263 #define VARIABLES 264 #define ALPHABET 265 #define START 266 #define ATABLE 267 #define INVERSES 268 #define INV 269 #define LEFT_BRACE 270 #define RIGHT_BRACE 271 #define LEFT_PAREN 272 #define RIGHT_PAREN 273 #define SEMICOLON 274 #define PERCENT 275 #define INT 276 #define EQUAL 277 #define STRING 278 #define REAL 279 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 #endif extern YYSTYPE yylval; #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (void); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ #endif /* !YY_YY_Y_TAB_H_INCLUDED */ /* Copy the second part of user declarations. */ /* Line 390 of yacc.c */ #line 212 "y.tab.c" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ # define YY_(Msgid) Msgid # endif #endif #ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ # if (! defined __GNUC__ || __GNUC__ < 2 \ || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)) # define __attribute__(Spec) /* empty */ # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(E) ((void) (E)) #else # define YYUSE(E) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(N) (N) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int yyi) #else static int YYID (yyi) int yyi; #endif { return yyi; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss_alloc; YYSTYPE yyvs_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ Stack = &yyptr->Stack_alloc; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED /* Copy COUNT objects from SRC to DST. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(Dst, Src, Count) \ __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) # else # define YYCOPY(Dst, Src, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (Dst)[yyi] = (Src)[yyi]; \ } \ while (YYID (0)) # endif # endif #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 4 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 44 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 25 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 18 /* YYNRULES -- Number of rules. */ #define YYNRULES 29 /* YYNRULES -- Number of states. */ #define YYNSTATES 56 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 279 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 7, 17, 20, 23, 25, 28, 30, 32, 35, 37, 40, 42, 44, 49, 51, 54, 58, 63, 69, 71, 74, 77, 79, 81, 84, 89, 91 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 26, 0, -1, 3, 24, 27, -1, 4, 15, 28, 29, 30, 32, 20, 39, 16, -1, 5, 21, -1, 6, 21, -1, 31, -1, 31, 30, -1, 7, -1, 8, -1, 9, 21, -1, 33, -1, 33, 32, -1, 34, -1, 37, -1, 10, 15, 35, 16, -1, 36, -1, 35, 36, -1, 21, 22, 23, -1, 11, 15, 21, 16, -1, 11, 15, 21, 38, 16, -1, 21, -1, 21, 38, -1, 12, 40, -1, 12, -1, 41, -1, 41, 40, -1, 21, 23, 42, 19, -1, 21, -1, 42, 21, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 58, 58, 61, 73, 81, 98, 99, 104, 105, 106, 110, 111, 114, 115, 121, 124, 125, 128, 136, 138, 143, 144, 148, 149, 152, 153, 156, 160, 164 }; #endif #if YYDEBUG || YYERROR_VERBOSE || 0 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "FORMAT", "FSA", "STATES", "SYMBOLS", "BFS", "MIN", "VARIABLES", "ALPHABET", "START", "ATABLE", "INVERSES", "INV", "LEFT_BRACE", "RIGHT_BRACE", "LEFT_PAREN", "RIGHT_PAREN", "SEMICOLON", "PERCENT", "INT", "EQUAL", "STRING", "REAL", "$accept", "fsa_file", "fsa_format", "states", "symbols", "fsa_characteristics", "fsa_characteristic", "info_items", "info_item", "alphabet", "symbol_names", "symbol_name", "start_states", "int_list", "fsa_table", "acstates", "acstate", "adjacency", YY_NULL }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 25, 26, 27, 28, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 34, 35, 35, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 42, 42 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 3, 9, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 4, 1, 2, 3, 4, 5, 1, 2, 2, 1, 1, 2, 4, 1, 2 }; /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. Performed when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 4, 0, 0, 5, 8, 9, 0, 0, 6, 10, 0, 0, 0, 11, 13, 14, 7, 0, 0, 0, 12, 0, 0, 16, 0, 24, 0, 0, 15, 17, 19, 21, 0, 0, 23, 25, 3, 18, 22, 20, 0, 26, 28, 0, 27, 29 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 2, 6, 9, 12, 17, 18, 22, 23, 24, 32, 33, 25, 42, 36, 44, 45, 53 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -17 static const yytype_int8 yypact[] = { 5, -11, 12, 10, -17, 1, -17, 13, -6, 11, -17, -2, -5, -17, -17, -17, -1, 0, -5, -17, 6, 7, 3, 0, -17, -17, -17, 4, 8, 14, -17, 2, -16, -17, -15, 9, 15, 16, -17, -17, -17, 17, 18, 19, -17, 9, -17, -17, -17, -17, 20, -17, -17, -12, -17, -17 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -17, -17, -17, -17, -17, 22, -17, 21, -17, -17, -17, -4, -17, -14, -17, -13, -17, -17 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { 38, 40, 14, 15, 16, 31, 41, 54, 1, 55, 20, 21, 4, 3, 5, 10, 7, 11, 8, 13, 19, 27, 28, 29, 37, 31, 35, 48, 39, 34, 43, 46, 51, 0, 49, 0, 0, 0, 41, 47, 26, 52, 50, 0, 30 }; #define yypact_value_is_default(Yystate) \ (!!((Yystate) == (-17))) #define yytable_value_is_error(Yytable_value) \ YYID (0) static const yytype_int8 yycheck[] = { 16, 16, 7, 8, 9, 21, 21, 19, 3, 21, 10, 11, 0, 24, 4, 21, 15, 6, 5, 21, 21, 15, 15, 20, 22, 21, 12, 41, 32, 21, 21, 16, 45, -1, 16, -1, -1, -1, 21, 23, 18, 21, 23, -1, 23 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 3, 26, 24, 0, 4, 27, 15, 5, 28, 21, 6, 29, 21, 7, 8, 9, 30, 31, 21, 10, 11, 32, 33, 34, 37, 30, 15, 15, 20, 32, 21, 35, 36, 21, 12, 39, 22, 16, 36, 16, 21, 38, 21, 40, 41, 16, 23, 38, 16, 23, 40, 21, 42, 19, 21 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. However, YYFAIL appears to be in use. Nevertheless, it is formally deprecated in Bison 2.4.2's NEWS entry, where a plan to phase it out is discussed. */ #define YYFAIL goto yyerrlab #if defined YYFAIL /* This is here to suppress warnings from the GCC cpp's -Wunused-macros. Normally we don't worry about that warning, but some users do, and we want to make it easy for users to remove YYFAIL uses, which will produce warnings from Bison 2.5. */ #endif #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY) \ { \ yychar = (Token); \ yylval = (Value); \ YYPOPSTACK (yylen); \ yystate = *yyssp; \ goto yybackup; \ } \ else \ { \ yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) /* Error token number */ #define YYTERROR 1 #define YYERRCODE 256 /* This macro is provided for backward compatibility. */ #ifndef YY_LOCATION_PRINT # define YY_LOCATION_PRINT(File, Loc) ((void) 0) #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (YYLEX_PARAM) #else # define YYLEX yylex () #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; #endif { FILE *yyo = yyoutput; YYUSE (yyo); if (!yyvaluep) return; # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif YYUSE (yytype); } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) #else static void yy_stack_print (yybottom, yytop) yytype_int16 *yybottom; yytype_int16 *yytop; #endif { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) { int yybot = *yybottom; YYFPRINTF (stderr, " %d", yybot); } YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule) #else static void yy_reduce_print (yyvsp, yyrule) YYSTYPE *yyvsp; int yyrule; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) ); YYFPRINTF (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message about the unexpected token YYTOKEN for the state stack whose top is YYSSP. Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is not large enough to hold the message. In that case, also set *YYMSG_ALLOC to the required number of bytes. Return 2 if the required number of bytes is too large to store. */ static int yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yytype_int16 *yyssp, int yytoken) { YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]); YYSIZE_T yysize = yysize0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ const char *yyformat = YY_NULL; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per "expected"). */ int yycount = 0; /* There are many possibilities here to consider: - Assume YYFAIL is not used. It's too flawed to consider. See for details. YYERROR is fine as it does not invoke this function. - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected tokens because there are none. - The only way there can be no lookahead present (in yychar) is if this state is a consistent state with a default action. Thus, detecting the absence of a lookahead is sufficient to determine that there is no unexpected or expected token to report. In that case, just report a simple "syntax error". - Don't assume there isn't a lookahead just because this state is a consistent state with a default action. There might have been a previous inconsistent state, consistent state with a non-default action, or user semantic action that manipulated yychar. - Of course, the expected token list depends on states to have correct lookahead information, and it depends on the parser not to perform extra reductions after fetching a lookahead from the scanner and before detecting a syntax error. Thus, state merging (from LALR or IELR) and default reductions corrupt the expected token list. However, the list is correct for canonical LR with one exception: it will still contain any token that will not be accepted due to an error action in a later state. */ if (yytoken != YYEMPTY) { int yyn = yypact[*yyssp]; yyarg[yycount++] = yytname[yytoken]; if (!yypact_value_is_default (yyn)) { /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. In other words, skip the first -YYN actions for this state because they are default actions. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yyx; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR && !yytable_value_is_error (yytable[yyx + yyn])) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; break; } yyarg[yycount++] = yytname[yyx]; { YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; yysize = yysize1; } } } } switch (yycount) { # define YYCASE_(N, S) \ case N: \ yyformat = S; \ break YYCASE_(0, YY_("syntax error")); YYCASE_(1, YY_("syntax error, unexpected %s")); YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); # undef YYCASE_ } { YYSIZE_T yysize1 = yysize + yystrlen (yyformat); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; yysize = yysize1; } if (*yymsg_alloc < yysize) { *yymsg_alloc = 2 * yysize; if (! (yysize <= *yymsg_alloc && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; return 1; } /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ { char *yyp = *yymsg; int yyi = 0; while ((*yyp = *yyformat) != '\0') if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyformat += 2; } else { yyp++; yyformat++; } } return 0; } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) #else static void yydestruct (yymsg, yytype, yyvaluep) const char *yymsg; int yytype; YYSTYPE *yyvaluep; #endif { YYUSE (yyvaluep); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); YYUSE (yytype); } /* The lookahead symbol. */ int yychar; #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_END #endif #ifndef YY_INITIAL_VALUE # define YY_INITIAL_VALUE(Value) /* Nothing. */ #endif /* The semantic value of the lookahead symbol. */ YYSTYPE yylval YY_INITIAL_VALUE(yyval_default); /* Number of syntax errors so far. */ int yynerrs; /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void) #else int yyparse () #endif #endif { int yystate; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* The stacks and their tools: `yyss': related to states. `yyvs': related to semantic values. Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs; YYSTYPE *yyvsp; YYSIZE_T yystacksize; int yyn; int yyresult; /* Lookahead token as an internal (translated) token number. */ int yytoken = 0; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; yyssp = yyss = yyssa; yyvsp = yyvs = yyvsa; yystacksize = YYINITDEPTH; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); if (yystate == YYFINAL) YYACCEPT; goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yytable_value_is_error (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token. */ yychar = YYEMPTY; yystate = yyn; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 3: /* Line 1787 of yacc.c */ #line 70 "../../../../../src/lib/oogl/wa/fsaparse.y" { return(0); } break; case 4: /* Line 1787 of yacc.c */ #line 74 "../../../../../src/lib/oogl/wa/fsaparse.y" { fsa->nstates = (yyvsp[(2) - (2)].i); fsa->action = (int**)malloc((fsa->nstates+1)*sizeof(int*)); } break; case 5: /* Line 1787 of yacc.c */ #line 82 "../../../../../src/lib/oogl/wa/fsaparse.y" { int i,j; fsa->ngens = (yyvsp[(2) - (2)].i); for (i=0; i<=fsa->nstates; ++i) { fsa->action[i] = (int*)malloc((fsa->ngens+1)*sizeof(int)); for (j=0; j<=fsa->ngens; ++j) fsa->action[i][j] = 0; } fsa->genlist=(char**)malloc(fsa->ngens*sizeof(char*)); for (i=0; ingens; ++i) fsa->genlist[i] = ""; } break; case 14: /* Line 1787 of yacc.c */ #line 116 "../../../../../src/lib/oogl/wa/fsaparse.y" { fsa->start= (yyvsp[(1) - (1)].i); } break; case 18: /* Line 1787 of yacc.c */ #line 129 "../../../../../src/lib/oogl/wa/fsaparse.y" { fsa->genlist[(yyvsp[(1) - (3)].i)-1] = (char*)malloc((strlen((yyvsp[(3) - (3)].s))+1)*sizeof(char)); strcpy(fsa->genlist[(yyvsp[(1) - (3)].i)-1], (yyvsp[(3) - (3)].s)); } break; case 19: /* Line 1787 of yacc.c */ #line 137 "../../../../../src/lib/oogl/wa/fsaparse.y" { (yyval.i) = (yyvsp[(3) - (4)].i); } break; case 20: /* Line 1787 of yacc.c */ #line 139 "../../../../../src/lib/oogl/wa/fsaparse.y" { (yyval.i) = (yyvsp[(3) - (5)].i); } break; case 27: /* Line 1787 of yacc.c */ #line 157 "../../../../../src/lib/oogl/wa/fsaparse.y" { install_adjacency((yyvsp[(1) - (4)].i)); adj_index = 0; } break; case 28: /* Line 1787 of yacc.c */ #line 161 "../../../../../src/lib/oogl/wa/fsaparse.y" { adj[adj_index++] = (yyvsp[(1) - (1)].i); } break; case 29: /* Line 1787 of yacc.c */ #line 165 "../../../../../src/lib/oogl/wa/fsaparse.y" { adj[adj_index++] = (yyvsp[(2) - (2)].i); } break; /* Line 1787 of yacc.c */ #line 1525 "y.tab.c" default: break; } /* User semantic actions sometimes alter yychar, and that requires that yytoken be updated with the new translation. We take the approach of translating immediately before every use of yytoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); #else # define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ yyssp, yytoken) { char const *yymsgp = YY_("syntax error"); int yysyntax_error_status; yysyntax_error_status = YYSYNTAX_ERROR; if (yysyntax_error_status == 0) yymsgp = yymsg; else if (yysyntax_error_status == 1) { if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); if (!yymsg) { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; yysyntax_error_status = 2; } else { yysyntax_error_status = YYSYNTAX_ERROR; yymsgp = yymsg; } } yyerror (yymsgp); if (yysyntax_error_status == 2) goto yyexhaustedlab; } # undef YYSYNTAX_ERROR #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval); yychar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #if !defined yyoverflow || YYERROR_VERBOSE /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = YYTRANSLATE (yychar); yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval); } /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } /* Line 2050 of yacc.c */ #line 171 "../../../../../src/lib/oogl/wa/fsaparse.y" static void yyerror(char *s) { printf("yyerror: %s\n", s); } static void install_adjacency(n) int n; { int i; for (i=0; iaction[n][i+1] = adj[i]; } void parse_init(f) wa *f; { fsa = f; fsa->fail = fsa->state = 0; } /*----------------------------------------------------------------------- * Function: fsaparse * Description: parse a .wa file into an wa struct * Args IN: fp: .wa file pointer * OUT: *fsa: the resulting fsa struct * Returns: 1 for success, 0 for error * Author: mbp * Date: Sat Mar 23 21:47:04 1991 * Notes: Does not recognize the full grammar defined by * "Data Exchange for Automatic Groups". Only recognizes * files of the form used by several examples I was * using at the time I wrote this. I think, but am not * at all sure, that this includes all word-acceptor * automata. */ int fsaparse(fp, fsa) FILE *fp; wa *fsa; { extern FILE *yyin; int ret; parse_init(fsa); yyin = fp; ret = yyparse(); return(ret ==0); } geomview-1.9.5/src/lib/oogl/wa/lex.yy.c0000644000175000017500000014272312310165601014575 00000000000000 #line 3 "lex.yy.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 37 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart(yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ yy_size_t yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart (FILE *input_file ); void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); void yy_delete_buffer (YY_BUFFER_STATE b ); void yy_flush_buffer (YY_BUFFER_STATE b ); void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); void yypop_buffer_state (void ); static void yyensure_buffer_stack (void ); static void yy_load_buffer_state (void ); static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); #define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ); void *yyalloc (yy_size_t ); void *yyrealloc (void *,yy_size_t ); void yyfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ typedef unsigned char YY_CHAR; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; typedef int yy_state_type; extern int yylineno; int yylineno = 1; extern char *yytext; #define yytext_ptr yytext static yy_state_type yy_get_previous_state (void ); static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); static int yy_get_next_buffer (void ); static void yy_fatal_error (yyconst char msg[] ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 26 #define YY_END_OF_BUFFER 27 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[91] = { 0, 0, 0, 27, 25, 1, 20, 17, 18, 25, 1, 23, 22, 19, 21, 25, 25, 25, 25, 25, 25, 25, 25, 15, 16, 25, 1, 23, 22, 1, 23, 23, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 25, 25, 7, 25, 4, 14, 8, 25, 25, 25, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 11, 25, 25, 25, 2, 25, 12, 3, 25, 5, 25, 25, 25, 25, 6, 25, 10, 13, 25, 9, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 4, 5, 1, 6, 7, 6, 8, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 10, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 14, 1, 1, 15, 16, 1, 17, 18, 1, 1, 19, 20, 21, 22, 23, 1, 24, 25, 26, 1, 27, 1, 1, 28, 1, 29, 1, 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[31] = { 0, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2 } ; static yyconst flex_int16_t yy_base[92] = { 0, 0, 0, 107, 0, 29, 108, 108, 108, 24, 32, 97, 29, 108, 108, 83, 16, 88, 18, 82, 84, 18, 88, 108, 108, 0, 43, 91, 39, 47, 0, 90, 74, 74, 83, 70, 70, 80, 65, 70, 77, 69, 64, 78, 66, 68, 70, 0, 63, 0, 67, 0, 27, 67, 62, 70, 65, 64, 57, 62, 50, 47, 57, 49, 57, 43, 54, 52, 40, 40, 0, 39, 44, 48, 0, 46, 0, 0, 45, 0, 34, 39, 31, 31, 0, 40, 0, 0, 27, 0, 108, 40 } ; static yyconst flex_int16_t yy_def[92] = { 0, 90, 1, 90, 91, 90, 90, 90, 90, 91, 91, 91, 91, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 90, 90, 91, 90, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 0, 90 } ; static yyconst flex_int16_t yy_nxt[139] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 4, 18, 4, 19, 4, 20, 4, 4, 4, 4, 21, 4, 22, 4, 23, 24, 26, 27, 28, 26, 33, 26, 31, 28, 29, 36, 25, 34, 37, 40, 26, 41, 31, 28, 26, 26, 61, 89, 62, 29, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 55, 64, 63, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 30, 42, 39, 38, 35, 32, 30, 90, 3, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90 } ; static yyconst flex_int16_t yy_chk[139] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 9, 9, 10, 16, 5, 12, 12, 10, 18, 91, 16, 18, 21, 26, 21, 28, 28, 29, 26, 52, 88, 52, 29, 85, 83, 82, 81, 80, 78, 75, 73, 72, 71, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 50, 48, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 27, 22, 20, 19, 17, 15, 11, 3, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90 } ; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 0; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; #line 1 "../../../../../src/lib/oogl/wa/fsaparse.l" #line 2 "../../../../../src/lib/oogl/wa/fsaparse.l" /* * fsaparse.l (lex.yy.c) * * Lex definitions for lexical scanner for parsing word-acceptor * automata. See fsaparse.y for more info. * * mbp Sat Mar 23 21:58:12 1991 * mbp@thales.urich.edu */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include /* for atof() */ #include #include #include "wa.yystype.h" #include "wa.yacc.h" YYSTYPE yylval; /* disable output of unmatched input */ #undef output #define output(c) #line 538 "lex.yy.c" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals (void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy (void ); int yyget_debug (void ); void yyset_debug (int debug_flag ); YY_EXTRA_TYPE yyget_extra (void ); void yyset_extra (YY_EXTRA_TYPE user_defined ); FILE *yyget_in (void ); void yyset_in (FILE * in_str ); FILE *yyget_out (void ); void yyset_out (FILE * out_str ); yy_size_t yyget_leng (void ); char *yyget_text (void ); int yyget_lineno (void ); void yyset_lineno (int line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap (void ); #else extern int yywrap (void ); #endif #endif static void yyunput (int c,char *buf_ptr ); #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void ); #else static int input (void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ size_t n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (void); #define YY_DECL int yylex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_load_buffer_state( ); } { #line 37 "../../../../../src/lib/oogl/wa/fsaparse.l" #line 750 "lex.yy.c" while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 91 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 108 ); yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 39 "../../../../../src/lib/oogl/wa/fsaparse.l" ; YY_BREAK case 2: YY_RULE_SETUP #line 41 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(FORMAT); } YY_BREAK case 3: YY_RULE_SETUP #line 42 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(FORMAT); } YY_BREAK case 4: YY_RULE_SETUP #line 43 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(FSA); } YY_BREAK case 5: YY_RULE_SETUP #line 44 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(STATES); } YY_BREAK case 6: YY_RULE_SETUP #line 45 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(SYMBOLS); } YY_BREAK case 7: YY_RULE_SETUP #line 46 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(BFS); } YY_BREAK case 8: YY_RULE_SETUP #line 47 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(MIN); } YY_BREAK case 9: YY_RULE_SETUP #line 48 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(VARIABLES); } YY_BREAK case 10: YY_RULE_SETUP #line 49 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(ALPHABET); } YY_BREAK case 11: YY_RULE_SETUP #line 50 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(START); } YY_BREAK case 12: YY_RULE_SETUP #line 51 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(ATABLE); } YY_BREAK case 13: YY_RULE_SETUP #line 52 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(INVERSES); } YY_BREAK case 14: YY_RULE_SETUP #line 53 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(INV); } YY_BREAK case 15: YY_RULE_SETUP #line 55 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(LEFT_BRACE); } YY_BREAK case 16: YY_RULE_SETUP #line 56 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(RIGHT_BRACE); } YY_BREAK case 17: YY_RULE_SETUP #line 57 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(LEFT_PAREN); } YY_BREAK case 18: YY_RULE_SETUP #line 58 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(RIGHT_PAREN); } YY_BREAK case 19: YY_RULE_SETUP #line 59 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(SEMICOLON); } YY_BREAK case 20: YY_RULE_SETUP #line 60 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(PERCENT); } YY_BREAK case 21: YY_RULE_SETUP #line 61 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(EQUAL); } YY_BREAK case 22: YY_RULE_SETUP #line 63 "../../../../../src/lib/oogl/wa/fsaparse.l" { yylval.i = atoi(yytext); return(INT); } YY_BREAK case 23: YY_RULE_SETUP #line 64 "../../../../../src/lib/oogl/wa/fsaparse.l" { yylval.d = atof(yytext); return(REAL); } YY_BREAK case 24: YY_RULE_SETUP #line 65 "../../../../../src/lib/oogl/wa/fsaparse.l" { yylval.d = atof(yytext); return(REAL); } YY_BREAK case 25: YY_RULE_SETUP #line 67 "../../../../../src/lib/oogl/wa/fsaparse.l" { strcpy(yylval.s, yytext); return(STRING); } YY_BREAK case 26: YY_RULE_SETUP #line 69 "../../../../../src/lib/oogl/wa/fsaparse.l" ECHO; YY_BREAK #line 938 "lex.yy.c" case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of user's declarations */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart(yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 91 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 91 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 90); return yy_is_jam ? 0 : yy_current_state; } static void yyunput (int c, register char * yy_bp ) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart(yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return EOF; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_init_buffer(YY_CURRENT_BUFFER,input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void yy_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer(b,file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yy_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree((void *) b->yy_ch_buf ); yyfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; yy_flush_buffer(b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yy_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer(b ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) { return yy_scan_bytes(yystr,strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param yybytes the byte buffer to scan * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n; yy_size_t i; /* Get memory for full buffer, including space for trailing EOB's. */ n = _yybytes_len + 2; buf = (char *) yyalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yy_fatal_error (yyconst char* msg ) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int yyget_lineno (void) { return yylineno; } /** Get the input stream. * */ FILE *yyget_in (void) { return yyin; } /** Get the output stream. * */ FILE *yyget_out (void) { return yyout; } /** Get the length of the current token. * */ yy_size_t yyget_leng (void) { return yyleng; } /** Get the current token. * */ char *yyget_text (void) { return yytext; } /** Set the current line number. * @param line_number * */ void yyset_lineno (int line_number ) { yylineno = line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param in_str A readable stream. * * @see yy_switch_to_buffer */ void yyset_in (FILE * in_str ) { yyin = in_str ; } void yyset_out (FILE * out_str ) { yyout = out_str ; } int yyget_debug (void) { return yy_flex_debug; } void yyset_debug (int bdebug ) { yy_flex_debug = bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ (yy_buffer_stack) = 0; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = (char *) 0; (yy_init) = 0; (yy_start) = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = (FILE *) 0; yyout = (FILE *) 0; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } /* Destroy the stack itself. */ yyfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return (void *) malloc( size ); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 69 "../../../../../src/lib/oogl/wa/fsaparse.l" int yywrap() { return(1); } geomview-1.9.5/src/lib/oogl/wa/fsaparse.3gv0000644000175000017500000000235112310110201015400 00000000000000.TH fsaparse 3gv "Sat Mar 23 22:01:32 1991" .SH NAME fsaparse \- parse a word-acceptor automaton file .SH SYNOPSIS .nf #include "wa.h" .sp fsafparse(fp, fsa) FILE *fp; Fsa *fsa; .fi .SH DESCRIPTION fsafparse parses a word-acceptor automaton file in the format described by DEAGL ("Data Exchange for Automata and Groups Language") (but see the BUGS section below). fp should be a pointer to an open file containing the automaton. fsa should be a pointer to an Fsa struture as defined in "fsa.h". Upon return, the automaton will have been written into this structure. .SH "RETURN VALUES" On success, fsafparse() returns 1. On failure, it returns 0. .SH "SEE ALSO" .nf getwordlist(3), getmatlist(3), fgetmatlist(3), getmatlist(1), automata(1) .fi .SH BUGS fsafparse is meant specifically for use with getwordlist(3) and getmatlist(3). It does not recognize the full language described by DEAGL. It only recognizes that part of it which was present in the word-acceptor files that I was working with when I wrote it. I think this may be sufficient for all word-acceptor automata, but I am not sure of this. Please let me know if you find word-acceptor files for which this doesn't work. .SH AUTHOR .nf Mark Phillips The Geometry Center .fi geomview-1.9.5/src/lib/shade/0000755000175000017500000000000012310165602012766 500000000000000geomview-1.9.5/src/lib/shade/Makefile.in0000644000175000017500000004656312310165555015000 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/shade DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libshade_la_LIBADD = am_libshade_la_OBJECTS = appearance.lo apstream.lo texture.lo \ material.lo light.lo image.lo libshade_la_OBJECTS = $(am_libshade_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libshade_la_SOURCES) DIST_SOURCES = $(libshade_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libshade.la libshade_la_SOURCES = \ appearance.c apstream.c appearance.h \ texture.c material.c light.c image.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/shade/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/shade/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libshade.la: $(libshade_la_OBJECTS) $(libshade_la_DEPENDENCIES) $(EXTRA_libshade_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libshade_la_OBJECTS) $(libshade_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/appearance.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/apstream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/image.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/light.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/material.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/texture.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/shade/Makefile.am0000644000175000017500000000027612310110201014730 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libshade.la libshade_la_SOURCES = \ appearance.c apstream.c appearance.h \ texture.c material.c light.c image.c geomview-1.9.5/src/lib/shade/appearance.c0000644000175000017500000002565312310110201015145 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "appearance.h" #include "transobj.h" #include "handleP.h" #include #include #define MAXSHININESS 1024.0 extern LmLighting * _LmSet(LmLighting *, int attr1, va_list *); extern Material * _MtSet(Material *, int attr1, va_list *); Appearance * _ApSet(Appearance *ap, int attr1, va_list *alist) { int mask; int attr; #define NEXT(type) va_arg(*alist, type) if (ap == NULL) { /* * New Appearance created here. */ ap = OOGLNewE(Appearance, "ApCreate Appearance"); ApDefault(ap); } for ( attr = attr1; attr != AP_END; attr = NEXT(int)) { switch (attr) { /* parse argument list */ case AP_DO: mask = NEXT(int); ap->flag |= mask; ap->valid |= mask; break; case AP_DONT: mask = NEXT(int); ap->flag &= ~mask; ap->valid |= mask; break; case AP_INVALID: ap->valid &= ~NEXT(int); break; case AP_OVERRIDE: ap->override |= NEXT(int); break; case AP_NOOVERRIDE: ap->override &= ~NEXT(int); break; case AP_MAT: ap->mat = NEXT(Material*); break; case AP_MtSet: ap->mat = _MtSet(ap->mat, va_arg(*alist, int), alist); break; case AP_LGT: ap->lighting = NEXT(LmLighting*); break; case AP_LmSet: if (!ap->lighting) ap->lighting = LmCreate(LM_END); ap->lighting = _LmSet(ap->lighting, va_arg(*alist, int), alist); break; case AP_NORMSCALE: ap->nscale = NEXT(double); ap->valid |= APF_NORMSCALE; break; case AP_LINEWIDTH: ap->linewidth = NEXT(int); ap->valid |= APF_LINEWIDTH; break; case AP_SHADING: /* should be APF_{CONSTANT,FLAT,SMOOTH} */ ap->shading = NEXT(int); ap->valid |= APF_SHADING; break; case AP_TRANSLUCENCY: /* should be APF_ALPHA_BLENDING or APF_SCREEN_DOOR */ ap->translucency = NEXT(int); ap->valid |= APF_TRANSP; break; case AP_DICE: ap->dice[0] = NEXT(int); ap->dice[1] = NEXT(int); ap->valid |= APF_DICE; break; default: OOGLError (0, "_ApSet: undefined option: %d\n", attr); return NULL; break; } } return ap; #undef NEXT } Appearance * ApCreate(int a1, ...) { va_list alist; Appearance *ap; va_start(alist,a1); ap = _ApSet(NULL, a1, &alist); va_end(alist); return ap; } Appearance * ApSet(Appearance *ap, int a1, ... ) { va_list alist; va_start(alist,a1); ap = _ApSet(ap, a1, &alist); va_end(alist); return ap; } int ApGet(Appearance *ap, int attr, void *value) { if (!ap) return -1; switch (attr) { case AP_DO: case AP_DONT: *(int *) value = ap->flag; break; case AP_OVERRIDE: case AP_NOOVERRIDE: *(int *) value = ap->override; break; case AP_VALID: case AP_INVALID: *(int *) value = ap->valid; break; case AP_MAT: *(Material **) value = ap->mat; break; case AP_LGT: *(LmLighting **) value = ap->lighting; break; case AP_NORMSCALE: *(double *) value = ap->nscale; break; case AP_LINEWIDTH: *(int *) value = ap->linewidth; break; case AP_SHADING: *(int *)value = ap->shading; break; case AP_TRANSLUCENCY: *(int *)value = ap->translucency; break; case AP_DICE: ((int *)value)[0] = ap->dice[0]; ((int *)value)[1] = ap->dice[1]; break; default: OOGLError (0, "ApGet: undefined option: %d\n", attr); return -1; break; } return attr; } void ApDelete(Appearance *ap) { if (ap == NULL || RefDecr((Ref *)ap) > 0) return; if (ap->magic != APMAGIC) { OOGLError(1, "ApDelete(%x) of non-Appearance: magic %x != %x", ap, ap->magic, APMAGIC); return; } if (ap->mat) MtDelete(ap->mat); if (ap->lighting) LmDelete(ap->lighting); if (ap->tex) TxDelete(ap->tex); OOGLFree(ap); } /* * Copies just the Appearance part, not its Material and LmLighting children. * Pointers to the latter are retained BUT their reference counts are NOT * incremented. The caller MUST either RefIncr() or reassign mat and lighting. */ Appearance * ApCopyShallow(const Appearance *ap, Appearance *into ) { if (ap == NULL) return NULL; if (into == NULL) { into = OOGLNewE(Appearance, "ApCopy: Appearance"); *into = *ap; into->mat = NULL; into->backmat = NULL; into->lighting = NULL; into->tex = NULL; RefInit((Ref *)into, APMAGIC); } else { into->flag = ap->flag; into->valid = ap->valid; into->override = ap->override; into->nscale = ap->nscale; into->linewidth = ap->linewidth; into->shading = ap->shading; into->translucency = ap->translucency; into->dice[0] = ap->dice[0]; into->dice[1] = ap->dice[1]; } return into; } Appearance * ApCopy(const Appearance *ap, Appearance *into ) { if (ap == NULL) return into; into = ApCopyShallow( ap, into ); if (ap->mat) into->mat = MtCopy(ap->mat, into->mat); if (ap->backmat) into->backmat = MtCopy(ap->backmat, into->backmat); if (ap->lighting) into->lighting = LmCopy(ap->lighting, into->lighting); if (ap->tex) into->tex = TxCopy(ap->tex, into->tex); return into; } Appearance * ApCopyShared(const Appearance *ap, Appearance *into ) { if (ap == NULL) return into; into = ApCopyShallow( ap, into ); if (ap->mat) { if (into->mat) MtCopy(ap->mat, into->mat); else RefIncr((Ref *)(into->mat = ap->mat)); } if (ap->backmat) { if (into->backmat) MtCopy(ap->backmat, into->backmat); else RefIncr((Ref *)(into->backmat = ap->backmat)); } if (ap->lighting) { if (into->lighting) LmCopy(ap->lighting, into->lighting); else RefIncr((Ref *)(into->lighting = ap->lighting)); } if (ap->tex) { if (into->tex) TxCopy(ap->tex, into->tex); else RefIncr((Ref *)(into->tex = ap->tex)); } return into; } /* * Merges appearance properties of src into dst. * If "inplace" is true, data are modified in place. * Otherwise if any modifications are needed to dst, a copy is made & returned. * If no modifications are necessary, the returned Appearance's reference * count is still incremented. * Thus, in all cases, the caller should ApDelete() the returned value * when finished with it. */ Appearance * ApMerge(const Appearance *src, Appearance *dst, int mergeflags ) { int mask; Material *mt, *bmt; LmLighting *lts; Texture *tex; if (dst == NULL) return ApCopy(src, NULL); if (src == NULL) { RefIncr((Ref *)dst); return dst; } /* Mask of fields to copy to dst */ mask = (mergeflags & APF_OVEROVERRIDE) ? src->valid : src->valid &~ ( dst->override &~ src->override); mt = MtMerge(src->mat, dst->mat, mergeflags); bmt = MtMerge(src->backmat, dst->backmat, mergeflags); lts = LmMerge(src->lighting, dst->lighting, mergeflags); tex = TxMerge(src->tex, dst->tex, mergeflags); if ((mergeflags & APF_INPLACE) || (mask == 0 && mt == dst->mat && lts == dst->lighting && bmt == dst->backmat && tex == dst->tex)) { /* * No changes, or we're asked to merge in place. Bump ref count. */ RefIncr((Ref *)dst); } else { /* * Another special case: Copy appearance, don't copy the items already * copied by {Mt,Lm}Merge. We're about to overwrite these values, so * toss the old ones. Pretty kludgy, but what can we do? */ dst = ApCopyShallow(dst, NULL); } #if 0 if (mt != dst->mat) MtDelete(dst->mat); if (bmt != dst->backmat) MtDelete(dst->backmat); if (lts != dst->lighting) LmDelete(dst->lighting); if (tex != dst->tex && dst->tex) TxDelete(dst->tex); #else MtDelete(dst->mat); MtDelete(dst->backmat); LmDelete(dst->lighting); TxDelete(dst->tex); #endif dst->mat = mt; dst->backmat = bmt; dst->lighting = lts; dst->tex = tex; if (mask) { /* Merge together appearance-specific data */ dst->flag = (src->flag & mask) | (dst->flag & ~mask); dst->valid = (src->valid & mask) | (dst->valid & ~mask); dst->override = (src->override & mask) | (dst->override & ~mask); if (mask & APF_NORMSCALE) dst->nscale = src->nscale; if (mask & APF_LINEWIDTH) dst->linewidth = src->linewidth; if (mask & APF_SHADING) dst->shading = src->shading; if (mask & APF_TRANSP) dst->translucency = src->translucency; if (mask & APF_DICE) { dst->dice[0] = src->dice[0]; dst->dice[1] = src->dice[1]; } } return dst; } Appearance * ApDefault(Appearance *ap) { ap->valid = ap->override = 0; memset(ap, 0, sizeof(Appearance)); RefInit((Ref *)ap, APMAGIC); ap->mat = NULL; ap->lighting = NULL; return ap; } void ApUseOverrides(Appearance *ap, int use_overrides) { Material *mat; if (ap == NULL) return; ap->override = ap->valid & use_overrides; if ((mat = ap->mat) != NULL) { mat->override = mat->valid & use_overrides; mat->changed = 1; } if ((mat = ap->backmat) != NULL) { mat->override = mat->valid & use_overrides; mat->changed = 1; } if (ap->lighting) { ap->lighting->override = ap->lighting->valid & use_overrides; ap->lighting->changed = 1; } } /* * We assume dst is a child of src in the inheritance tree. * Erase all settings in dst that are defined in src, * so that src's settings can propagate to (the children of) dst. */ void ApLetPropagate(Appearance *src, Appearance *dst) { if (src == NULL || dst == NULL) return; dst->valid &= ~src->valid; dst->override &= ~src->valid; if (dst->mat && src->mat) { dst->mat->valid &= ~src->mat->valid; dst->mat->override &= ~src->mat->valid; dst->mat->changed = 1; } if (dst->backmat && src->backmat) { dst->backmat->valid &= ~src->backmat->valid; dst->backmat->override &= ~src->backmat->valid; dst->backmat->changed = 1; } if (dst->lighting && src->lighting) { dst->lighting->valid &= ~src->lighting->valid; dst->lighting->override &= ~src->lighting->valid; } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/shade/apstream.c0000644000175000017500000003070012310110201014647 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "appearance.h" #include "handleP.h" HandleOps AppearanceOps = { "ap", (int ((*)(Pool *p, Handle **hp, Ref **rp)))ApStreamIn, (int ((*)(Pool *p, Handle *h, Ref *r)))ApStreamOut, (void ((*)(Ref *rp)))ApDelete, NULL, NULL, }; static struct { char *word; int amask; enum { _flag = 0, _appearance, _shading, _normscale, _linewidth, _material, _backmaterial, _patchdice, _light, _texture, _translucency, _ap_alpha_blending = AP_TRANSLUCENCY + APF_ALPHA_BLENDING, _ap_screen_door = AP_TRANSLUCENCY + APF_SCREEN_DOOR, _ap_naive_blending = AP_TRANSLUCENCY + APF_NAIVE_BLENDING, _ap_smooth = AP_SHADING + APF_SMOOTH, _ap_flat = AP_SHADING + APF_FLAT, _ap_constant = AP_SHADING + APF_CONSTANT, _ap_csmooth = AP_SHADING + APF_CSMOOTH, _ap_vcflat = AP_SHADING + APF_VCFLAT, } aval; } ap_kw[] = { { "appearance", 0, _appearance }, { "face", APF_FACEDRAW, _flag }, { "edge", APF_EDGEDRAW, _flag }, { "vect", APF_VECTDRAW, _flag }, { "transparent", APF_TRANSP, _translucency }, { "screendoor", APF_TRANSP, _ap_screen_door }, { "blending", APF_TRANSP, _ap_alpha_blending }, { "naive", APF_TRANSP, _ap_naive_blending }, { "evert", APF_EVERT, _flag }, { "keepcolor", APF_KEEPCOLOR, _flag }, { "texturing", APF_TEXTURE, _flag }, { "backcull", APF_BACKCULL, _flag }, { "shadelines", APF_SHADELINES, _flag }, { "concave", APF_CONCAVE, _flag }, { "shading", APF_SHADING, _shading }, { "smooth", APF_SHADING, _ap_smooth }, { "flat", APF_SHADING, _ap_flat }, { "constant", APF_SHADING, _ap_constant }, { "csmooth", APF_SHADING, _ap_csmooth }, { "vcflat", APF_VCFLAT, _ap_vcflat }, { "mipmap", APF_TXMIPMAP, _flag }, { "mipinterp", APF_TXMIPINTERP, _flag }, { "linear", APF_TXLINEAR, _flag }, { "normal", APF_NORMALDRAW, _flag }, { "normscale", APF_NORMSCALE, _normscale }, { "linewidth", APF_LINEWIDTH, _linewidth }, { "material", 0, _material }, { "backmaterial", 0, _backmaterial }, { "patchdice", APF_DICE, _patchdice }, { "light", 0, _light }, { "lighting", 0, _light }, { "texture", 0, _texture }, }; int ApStreamIn(Pool *p, Handle **hp, Appearance **app) { Handle *h = NULL; Handle *hname = NULL; Appearance *ap = NULL; IOBFILE *inf; char *fname; char *w, *raww; int c, i; int brack = 0; bool over, not, more, empty, braces; int value; int mask, flagmask; bool mine = true; /* Questionable -- we'll report all errors */ if (p == NULL || (inf = PoolInputFile(p)) == NULL) { return 0; } fname = PoolName(p); over = not = false; value = ~0; more = false; empty = true; braces = false; do { switch(c = iobfnextc(inf, 0)) { case '{': brack++; braces = true; iobfgetc(inf); break; case '}': if (brack--) iobfgetc(inf); break; case '+': value = ~0; iobfgetc(inf); break; case '-': value = 0; iobfgetc(inf); break; case '!': not = 1; iobfgetc(inf); break; case '*': over = 1; iobfgetc(inf); break; case '<': case ':': case '@': iobfgetc(inf); w = iobfdelimtok("{}()", inf, 0); if (c == '<' && (h = HandleByName(w, &ImageOps)) == NULL && w[0] != '/') { w = findfile(PoolName(p), raww = w); if (w == NULL) { OOGLSyntax(inf, "Reading image from \"%s\": " "can't find file \"%s\"", PoolName(p), raww); return false; } } else if (h) { /* HandleByName() increases the ref. count s.t. the * caller of HandleByName() owns the returned handle. */ HandleDelete(h); } h = HandleReferringTo(c, w, &AppearanceOps, NULL); if (h) { ap = (Appearance *)HandleObject(h); /* Increment the ref. count. This way we can call * HandleDelete() and ImgDelete() independently. */ REFGET(Appearance, ap); } break; default: more = 0; w = iobfdelimtok("{}()", inf, 0); if (w == NULL) { break; } if (strcmp(w, "define") == 0) { hname = HandleCreateGlobal(iobftoken(inf, 0), &AppearanceOps); break; } for (i = sizeof(ap_kw)/sizeof(ap_kw[0]); --i >= 0; ) { if (!strcmp(ap_kw[i].word, w)) { break; } } if (i < 0) { if (mine) { OOGLError(1, "ApStreamIn: file %s: unknown appearance keyword %s", fname, w); ApDelete(ap); return false; } } if (ap == NULL) { ap = ApCreate(AP_END); } empty = false; mask = flagmask = ap_kw[i].amask; if (not) { switch(ap_kw[i].aval) { case _material: MtDelete(ap->mat); ap->mat = NULL; break; case _backmaterial: MtDelete(ap->backmat); ap->mat = NULL; break; case _light: LmDelete(ap->lighting); ap->lighting = NULL; break; case _texture: TxDelete(ap->tex); ap->tex = NULL; break; default: break; } ap->flag &= ~mask; if (!over) ap->valid &= ~mask; ap->override &= ~mask; } else { switch(ap_kw[i].aval) { case _flag: break; case _appearance: mine = more = 1; break; case _translucency: ap->translucency = APF_ALPHA_BLENDING; iobfgetni(inf, 1, (int *)&ap->translucency, 0); break; case _ap_alpha_blending: case _ap_screen_door: case _ap_naive_blending: ap->translucency = ap_kw[i].aval - AP_TRANSLUCENCY; break; case _shading: iobfgetni(inf, 1, (int *)&ap->shading, 0); break; case _ap_smooth: case _ap_flat: case _ap_constant: case _ap_csmooth: case _ap_vcflat: ap->shading = ap_kw[i].aval - AP_SHADING; break; case _normscale: if (iobfgetnf(inf, 1, &ap->nscale, 0) <= 0) { OOGLError(1,"ApFLoad: %s: \"normscale\": value expected", fname); } break; case _linewidth: if (iobfgetni(inf, 1, &ap->linewidth, 0) <= 0) { OOGLSyntax(inf, "%s \"linewidth\": value expected", fname); } break; case _material: if ((ap->mat = MtFLoad(ap->mat, inf, fname)) == NULL) { OOGLSyntax(inf,"Can't read material in %s", fname); } break; case _backmaterial: if ((ap->backmat = MtFLoad(ap->backmat, inf, fname)) == NULL) { OOGLError(1,"Can't read backmaterial, file %s", fname); } break; case _light: ap->lighting = LmFLoad(ap->lighting, inf, fname); if (ap->lighting == NULL) { OOGLError(1,"Can't read lighting, file %s", fname); } break; case _texture: if (!TxStreamIn(p, NULL, &ap->tex)) { OOGLError(1, "%s: Can't read texture", fname); } break; case _patchdice: if (iobfgetni(inf, 2, ap->dice, 0) < 2) { OOGLSyntax(inf, "%s \"patchdice\": " "expected integer u- and v- dicing values", fname); } break; default: OOGLSyntax(inf, "%s unknown appearance keyword", fname); } if (value) { ap->flag |= flagmask; } else { ap->flag &= ~flagmask; } ap->valid |= mask; if (over) { ap->override |= mask; } } /* Reset for next keyword */ over = not = 0; value = ~0; } } while(brack > 0 || more); if (hname != NULL) { if (ap) { HandleSetObject(hname, (Ref *)ap); } if (h) { /* HandleReferringTo() has passed the ownership to use, so * delete h because we do not need it anymore. */ HandleDelete(h); } h = hname; } /* Pass the ownership of h and ap to the caller if requested */ if (hp != NULL) { /* pass on ownership of the handle h to the caller of this function */ if (*hp != NULL) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } else if (h) { /* Otherwise delete h because we are its owner. Note that * HandleReferringTo() has passed the ownership of h to us; * explicitly defined handles (hdefine and define constructs) * will not be deleted by this call. */ HandleDelete(h); } /* same logic as for hp */ if (app != NULL) { if (*app != NULL) { ApDelete(*app); } *app = ap; } else if(ap) { ApDelete(ap); } return (h != NULL || ap != NULL || (empty && braces)); } int Apsavepfx(int valid, int override, int mask, char *keyword, FILE *f, Pool *p) { if ((valid & mask) == 0) { return 0; } PoolFPrint(p, f, ""); if (override & mask) { fputc('*', f); } if (keyword && *keyword) { fprintf(f, "%s ", keyword); } return 1; } int ApStreamOut(Pool *p, Handle *h, Appearance *ap) { FILE *f = PoolOutputFile(p); int valid; int mask; int i; if (f == NULL || (ap == NULL && (h == NULL || (ap = (Appearance *)HandleObject(h)) == NULL))) { return false; } valid = ap->valid; fprintf(f, "appearance {\n"); PoolIncLevel(p, 1); if (PoolStreamOutHandle(p, h, ap != NULL)) { for (i = 0; i < (int)(sizeof(ap_kw)/sizeof(ap_kw[0])); i++) { mask = ap_kw[i].amask; if ((valid & mask) == 0) { continue; } Apsavepfx(valid, ap->override, mask, "", f, p); if (ap_kw[i].aval == 0 || ap_kw[i].aval == _translucency) { if ((mask & ap->flag) == 0) { fputc('-', f); } fputs(ap_kw[i].word, f); } valid &= ~mask; switch (mask) { case APF_TRANSP: if ((mask & ap->flag) != 0) { switch (ap->translucency) { case APF_SCREEN_DOOR: fputs(" screendoor", f); break; case APF_NAIVE_BLENDING: fputs(" naive", f); break; case APF_ALPHA_BLENDING: fputs(" blending", f); break; default: fprintf(f, "%d", ap->translucency); break; break; } } break; case APF_SHADING: fputs("shading ", f); switch(ap->shading) { case APF_SMOOTH: fputs("smooth", f); break; case APF_FLAT: fputs("flat", f); break; case APF_CONSTANT: fputs("constant", f); break; case APF_CSMOOTH: fputs("csmooth", f); break; case APF_VCFLAT: fputs("vcflat", f); break; default: fprintf(f, "%d", ap->shading); break; } break; case APF_NORMSCALE: fprintf(f, "normscale %.8g", ap->nscale); break; case APF_LINEWIDTH: fprintf(f, "linewidth %d ", ap->linewidth); break; case APF_DICE: fprintf(f, "patchdice %d %d", ap->dice[0], ap->dice[1]); break; } fputc('\n', f); } if (ap->mat) { PoolFPrint(p, f, "material {\n"); PoolIncLevel(p, 1); MtFSave(ap->mat, f, p); PoolIncLevel(p, -1); PoolFPrint(p, f, "}\n"); } if (ap->backmat) { PoolFPrint(p, f, "backmaterial {\n"); PoolIncLevel(p, 1); MtFSave(ap->backmat, f, p); PoolIncLevel(p, -1); PoolFPrint(p, f, "}\n"); } if (ap->lighting) { PoolFPrint(p, f, "lighting {\n"); PoolIncLevel(p, 1); LmFSave(ap->lighting, f, p->poolname, p); PoolIncLevel(p, -1); PoolFPrint(p, f, "}\n"); } if (ap->tex) { TxStreamOut(p, NULL, ap->tex); } } PoolIncLevel(p, -1); PoolFPrint(p, f, "}\n"); return !ferror(f); } Appearance * ApFLoad(IOBFILE *inf, char *fname) { Pool *p; Appearance *ap = NULL; p = PoolStreamTemp(fname, inf, NULL, 0, &AppearanceOps); ApStreamIn(p, NULL, &ap); PoolDelete(p); return ap; } Appearance * ApFSave(Appearance *ap, FILE *outf, char *fname) { Pool *p; int ok; p = PoolStreamTemp(fname, NULL, outf, 1, NULL); PoolSetOType(p, PO_DATA); PoolIncLevel(p, 1); ok = ApStreamOut(p, NULL, ap); PoolDelete(p); return ok ? ap : NULL; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/shade/appearance.h0000644000175000017500000005573412310110201015155 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef APPEARANCEDEF #define APPEARANCEDEF /* #define AP_IDEBUG before #including this file to compile for debugging */ #include #include "ooglutil.h" #include "transobj.h" #include "3d.h" #include "color.h" #include "streampool.h" #include "dbllist.h" #define DONE 1 #define ANOTHER 2 typedef struct LtLight { REFERENCEFIELDS; Color ambient; Color color; Point position; /* application-specified light position */ Point globalposition; /* real light position; set & used only by mg */ float intensity; int Private; /* private part; used only by mg */ short location; /* How to interpret the "position": */ #define LTF_GLOBAL 0x0 /* global coordinate system */ #define LTF_CAMERA 0x1 /* camera coordinates */ #define LTF_LOCAL 0x2 /* local coordinates * where appearance is attached. */ short changed; } LtLight; #define AP_MAXLIGHTS 8 typedef struct LmLighting { REFERENCEFIELDS; int valid, override; /* LMF_* inheritance bits */ Color ambient; int localviewer; float attenconst, attenmult, attenmult2; LtLight *lights[AP_MAXLIGHTS]; int Private; int changed; } LmLighting; #define LM_ANY_LIGHTS(lm) ((lm)->lights[0] != NULL) #define LM_FOR_ALL_LIGHTS(lm, i,lp) for((i)=0, (lp) = &(lm)->lights[0]; \ (i) 8 then the * most significant byte comes first (BIG-ENDIAN). */ } Image; typedef struct TxUser TxUser; /* Textures are bulky and need active management! */ struct TxUser { struct TxUser *next; /* Next user in tx->users list */ struct Texture *tx; /* Which texture is ours? */ int id; /* Slot for e.g. graphics-system texture id */ void *ctx; /* Slot for e.g. mg context */ void *data; /* Any other data the user needs */ int flags; /* flags for user to determine usage */ int (*needed)(TxUser *); /* user answers "d'you still need this?" */ void (*purge)(TxUser *); /* request to user to purge this texture */ }; typedef struct Texture { REFERENCEFIELDS; Image *image; /* underlying pixmap */ Handle *imghandle; Transform tfm; /* texture-coord transformation */ Handle *tfmhandle; unsigned int flags; /* clamp, etc. */ enum apply_enum { tx_modulate, tx_decal, tx_blend, tx_replace } apply; /* Application style * (TXF_DECAL, TXF_MODULATE, TXF_BLEND, TXF_REPLACE) */ Color background; /* background color for TXF_BLEND */ TxUser *users; /* Users of this texture register here */ #if 0 int coords; /* Texture-coord auto generation (not implemented) */ #endif /*****************************************/ /* the old and deprecated way to do stuff */ char *filename; /* ppm or pgm (.Z) file */ char *alphafilename; /* If present, this is a .pgm (.Z) file */ /*****************************************/ DblListNode loadnode; } Texture; extern DblListNode AllLoadedTextures; /* List of em */ typedef struct Appearance { REFERENCEFIELDS; Material *mat, *backmat; /* material properties */ LmLighting *lighting; /* attached lighting */ Texture *tex; /* Texture-map object */ unsigned int flag; /* APF_* shading,faces/edges,normals,transparency */ unsigned int valid; /* APF_* bits control inheritance of these fields */ unsigned int override; /* same APF_* flags: parent overrides child */ float nscale; /* scale factor for drawing normals */ int linewidth; /* how wide do lines appear (pixels) ? */ enum { apf_constant = 0, apf_flat, apf_smooth, apf_csmooth, apf_vcflat, apf_num_shadings } shading; enum { apf_alpha_blending = 0, /* translucency using alpha-blending. */ apf_screen_door, /* translucency by stipple patterns. */ apf_naive_blending, apf_num_translucencies } translucency; int dice[2]; /* u, v patch dicing parameters */ } Appearance; extern HandleOps AppearanceOps; extern HandleOps ImageOps; extern HandleOps TextureOps; /* the following tokens are used in LtSet and LtGet */ #define LT_END 700 #define LT_AMBIENT 701 /* Color ambient */ #define LT_COLOR 702 /* Color color */ #define LT_POSITION 703 /* Point position */ #define LT_INTENSITY 704 /* double intensity */ #define LT_LOCATION 705 /* int location: LTF_{GLOBAL,CAMERA,LOCAL} */ #define LT_ABLOCK 706 /* void **ablock ??? cH: unimplemented ??? */ /* the following tokens are used in LmSet and LmGet */ #define LM_END 600 #define LM_AMBIENT 601 /* Color ambient */ #define LM_LOCALVIEWER 602 /* int localviewer */ #define LM_ATTENC 603 /* double attenconst */ #define LM_ATTENM 604 /* double attenmult */ #define LM_ATTEN2 612 /* double attenmult2 */ #define LM_LtSet 605 /* ... */ #define LM_LIGHT 606 /* LtLight *light */ #define LM_VALID 607 /* int mask (Get only) */ #define LM_INVALID 608 /* int mask (unsets valid bits) */ #define LM_OVERRIDE 609 /* int mask (sets override bits) */ #define LM_NOOVERRIDE 610 /* int mask (unsets override bits) */ #define LM_REPLACELIGHTS 611 /* int replace */ #define LM_ABLOCK 613 /* void **ablock ??? cH: unimplemented ??? */ /* the following tokens are used in MtSet and MtGet */ #define MT_END 500 #define MT_EMISSION 501 /* Color *emission */ #define MT_AMBIENT 502 /* Color *ambient */ #define MT_DIFFUSE 503 /* Color *diffuse */ #define MT_SPECULAR 504 /* Color *specular */ #define MT_Ka 505 /* double ka */ #define MT_Kd 506 /* double kd */ #define MT_Ks 507 /* double ks */ #define MT_ALPHA 508 /* double alpha */ #define MT_SHININESS 509 /* double shininess */ #define MT_EDGECOLOR 510 /* Color *edgecolor (for edges & vectors) */ #define MT_NORMALCOLOR 511 /* Color *normalcolor (for surface normals) */ #define MT_VALID 512 /* int mask (Get only) */ #define MT_INVALID 513 /* int mask (unsets valid bits) */ #define MT_OVERRIDE 514 /* int mask (sets override bits) */ #define MT_NOOVERRIDE 515 /* int mask (unsets override bits) */ #define MT_ABLOCK 516 /* void **ablock ??? cH: unimplemented ??? */ /* the following tokens are used in ApSet and ApGet */ #define AP_END 400 #define AP_DO 401 /* int mask (set flag bits) */ #define AP_DONT 402 /* int mask (unset flag bits) */ #define AP_MAT 403 /* Material *mat */ #define AP_MtSet 404 /* ... */ #define AP_LGT 405 /* LmLighting *lgt */ #define AP_LmSet 406 /* ... */ #define AP_NORMSCALE 407 /* float nscale */ #define AP_LINEWIDTH 408 /* int linewidth */ #define AP_VALID 409 /* int mask (Get only) */ #define AP_INVALID 410 /* int mask (unsets valid bits) */ #define AP_OVERRIDE 411 /* int mask (sets override bits) */ #define AP_NOOVERRIDE 412 /* int mask (unsets override bits) */ #define AP_SHADING 413 /* int shading (set to APF_{CONSTANT,FLAT,SMOOTH} */ #define AP_BACKMAT 414 /* Material *backmaterial */ #define AP_ABLOCK 415 /* void **ablock ??? cH: unimplemented ??? */ #define AP_DICE 416 /* int udice, vdice (set); int dice[2] (get) */ #define AP_TEXTURE 417 /* Texture *tx */ #define AP_TxSet 418 /* ... */ /* int translucency (set to APF_{ALPHA_BLENDING,SCREEN_DOOR,NAIVE_BLENDING} */ #define AP_TRANSLUCENCY 419 /* Flags to ApMerge, etc. */ #define APF_INPLACE 0x1 /* Merge in place */ #define APF_OVEROVERRIDE 0x2 /* src replaces dst even without src override */ /* This model of texture-mapping shamelessly stolen * from GL/Open-GL */ #define TXMAGIC OOGLMagic('t', 1) #define TX_DOCLAMP 450 #define TXF_SCLAMP 0x1 /* Clamp if s outside 0..1 (else wrap) */ #define TXF_TCLAMP 0x2 /* Clamp if t outside 0..1 (else wrap) */ #define TXF_LOADED 0x4 /* Has this texture been loaded? * (tried to read those files yet?) */ #define TXF_RGBA 0x8 /* In loaded data, is R first byte? (else ABGR) */ #define TXF_USED 0x10 /* "Recently rendered a geom containing this texture"*/ #define TX_APPLY 451 /* Interpret texture values to... */ #define TXF_MODULATE tx_modulate #define TXF_DECAL tx_decal #define TXF_BLEND tx_blend #define TXF_REPLACE tx_replace #define TX_HANDLE_IMAGE 452 #define TX_HANDLE_TRANSFORM 453 #define TX_BACKGROUND 454 #define TX_FILE 455 /* deprecated (really?) */ #define TX_ALPHAFILE 456 /* deprecated (really?) */ #define TX_CHANNELS 457 /* deprecated (really?) */ #define TX_XSIZE 458 /* deprecated (really?) */ #define TX_YSIZE 459 /* deprecated (really?) */ #if 0 /* not implemented */ #define TX_COORDS 458 /* Texture coordinates come from... */ #define TXF_COORD_GIVEN 0 /* given as part of object (default) In * fact, only TXF_COORD_GIVEN works now. */ # define TXF_COORD_LOCAL 1 /* In coord system of texture map */ # define TXF_COORD_CAMERA 2 /* In camera coords */ # define TXF_COORD_NORMAL 3 /* Taken from surface-normal, for env map */ #endif #define TX_ABLOCK 464 /* ??? cH: unimplemented ??? */ #define TX_END 465 #define IMGMAGIC OOGLMagic('i', 1) /* ImgSet() commands */ #define IMG_WIDTH 1000 #define IMG_HEIGHT 1001 #define IMG_CHANNELS 1002 #define IMG_MAXVAL 1003 #define IMG_DATA 1004 #define IMG_DATA_CHAN_FILE 1005 /* CHMASK, FILTER/NULL, FILENAME */ #define IMG_DATA_CHAN_DATA 1006 /* CHMASK, FILTER/NULL, DATA, DATASZ */ #define IMGF_LUMINANCE 0x1 #define IMGF_LUMINANCE_ALPHA 0x3 #define IMGF_RGB 0x7 #define IMGF_RGBA 0xf #define IMGF_ALPHA 0x100 #define IMGF_AUTO 0x200 #define IMG_END 1042 typedef struct TxST { float s; float t; } TxST; /* Transformation of (s,t)-texture co-ordinates. (s,t,r,q) with r = 0, * q = 1 */ static inline void TxSTTransform(Transform T, TxST *in, TxST *out) { float s, t, q; if (T == NULL || T == TM_IDENTITY) { *out = *in; return; } s = in->s; t = in->t; q = T[TMX][TMW]*s + T[TMY][TMW]*t + T[TMW][TMW]; if(q != 1.0) { q = 1.0 / q; out->s = q * (s*T[TMX][TMX] + t*T[TMY][TMX] + T[TMW][TMX]); out->t = q * (s*T[TMX][TMY] + t*T[TMY][TMY] + T[TMW][TMY]); } else { out->s = s*T[TMX][TMX] + t*T[TMY][TMX] + T[TMW][TMX]; out->t = s*T[TMX][TMY] + t*T[TMY][TMY] + T[TMW][TMY]; } } Appearance * ApCreate( int attr, ... ); Appearance * ApSet( Appearance *ap, int attr, ... ); Appearance * _ApSet(Appearance *ap, int attr1, va_list *alist); int ApGet( Appearance *ap, int attr, void *valuep ); void ApDelete( Appearance *ap ); Appearance * ApDefault( Appearance *ap ); Appearance * ApCopy(const Appearance *from, Appearance *into ); Appearance * ApMerge(const Appearance *src, Appearance *dst, int inplace ); Appearance * ApFLoad(IOBFILE *inf, char *fname); Appearance * ApCopyShared(const Appearance *ap, Appearance *into ); Appearance * ApFSave(Appearance *ap, FILE *f, char *fname); int ApStreamIn(Pool *p, Handle **hp, Appearance **app); int ApStreamOut(Pool *p, Handle *h, Appearance *ap); /* Force 'override' bits on (for all valid fields) * or off, in an Appearance. */ void ApUseOverrides( Appearance *ap, int use_overrides ); /* Erase fields in 'dst' corresponding to any in 'src'; * allows 'src' settings to propagate through 'dst', * when 'dst' is its child. */ void ApLetPropagate( Appearance *src, Appearance *dst ); int TxStreamIn( Pool *, Handle **, Texture ** ); int TxStreamOut( Pool *, Handle *, Texture * ); void TxDelete( Texture * ); int ImgStreamIn(Pool *p, Handle **hp, Image **imgp); int ImgStreamOut(Pool *p, Handle *h, Image *tx); Image *ImgFSave(Image *img, FILE *outf, char *fname); void ImgDelete(Image *img); Image *ImgCreate(int a1, ...); int ImgWritePGM(Image *img, int channel, bool compressed, char **buffer); int ImgWritePNM(Image *img, unsigned chmask, bool compressed, char **buffer); int ImgWritePAM(Image *img, unsigned chmask, bool compressed, char **buffer); bool ImgWriteFilter(Image *img, unsigned chmask, const char *filter); Texture * TxFLoad( IOBFILE *inf, char *fname ); Texture * TxFSave(Texture *tx, FILE *outf, char *fname); Texture * TxSet( Texture *, int attr, ... ); Texture * TxCreate( int attr, ... ); Texture * TxCopy( Texture *src, Texture *dst ); Texture * TxMerge( Texture *src, Texture *dst, int mergeflags ); void TxPurge( Texture * ); TxUser *TxAddUser(Texture *, int id, int (*needed)(TxUser *), void (*purge)(TxUser *)); void TxRemoveUser(TxUser *user); #ifndef AP_IDEBUG Material * MtCreate( int attr, ... ); Material * MtSet( Material *, int attr, ... ); #endif int MtGet( Material *, int attr, void *valuep ); void MtDelete( Material * ); Material * MtDefault( Material * ); Material * MtLoad( Material *, char *filename ); Material * MtCopy( Material *from, Material *into ); Material * MtMerge( Material *src, Material *dst, int inplace ); Material * MtFLoad( Material *into, IOBFILE *stream, char *filename ); int MtSave( Material *, char *filename ); int MtFSave( Material *mat, FILE *stream, Pool *p ); void MtPrint( Material * ); #ifndef AP_IDEBUG LtLight * LtCreate( int attr, ... ); LtLight * LtSet( LtLight *, int attr, ... ); #endif int LtGet( LtLight *, int attr, void *valuep ); void LtDelete( LtLight * ); LtLight * LtCopy( LtLight *, LtLight * ); LtLight * LtMerge( LtLight *, LtLight * ); LtLight * LtDefault( LtLight * ); void LtProperties( LtLight *, float, Color *, Point * ); LtLight * LtFLoad( LtLight *, IOBFILE *, char *filename); #define LTMAGIC OOGLMagic('l', 2) #ifndef AP_IDEBUG LmLighting * LmCreate( int attr, ... ); LmLighting * LmSet( LmLighting *, int attr, ... ); #endif int LmGet( LmLighting *, int attr, void *valuep ); void LmDelete( LmLighting * ); void LmDelete( LmLighting * ); void LmDefault( LmLighting * ); LmLighting * LmLoad( LmLighting *, char *filename ); LmLighting * LmFLoad( LmLighting *, IOBFILE *, char *filename ); void LmSave( LmLighting *, char *filename ); void LmFSave( LmLighting *, FILE *, char *filename, Pool *p ); LmLighting * LmMerge( LmLighting *src, LmLighting *dst, int inplace ); LmLighting * LmCopy( LmLighting *src, LmLighting *dst ); void LmAddLight( LmLighting *dst, LtLight *light ); void LmRemoveLight( LmLighting *dst, LtLight *light ); void LmCopyLights( LmLighting *src, LmLighting *dst ); void LmDeleteLights( LmLighting *lm ); #define LIGHTINGMAGIC OOGLMagic('l', 1) #define LMF_LOCALVIEWER 0x1 /* Local viewer (flag valid) */ #define LMF_AMBIENT 0x2 /* Ambient light color */ #define LMF_ATTENC 0x4 /* attenuation constant factor */ #define LMF_ATTENM 0x8 /* attenuation linear factor */ #define LMF_ATTEN2 0x20 /* 1/r^2 attenuation factor */ #define LMF_REPLACELIGHTS 0x10 /* When merging, use only new lights, not union */ #define MATMAGIC OOGLMagic('m', 1) #define MTF_EMISSION 0x1 #define MTF_AMBIENT 0x2 #define MTF_DIFFUSE 0x4 #define MTF_SPECULAR 0x8 #define MTF_Ka 0x10 #define MTF_Kd 0x20 #define MTF_Ks 0x40 #define MTF_ALPHA 0x80 #define MTF_SHININESS 0x100 #define MTF_EDGECOLOR 0x200 #define MTF_NORMALCOLOR 0x400 #define APMAGIC OOGLMagic('a', 1) /* The following bits are used in 'flag', 'valid', 'override' */ #define APF_FACEDRAW 0x2 /* Draw faces */ #define APF_EDGEDRAW 0x10 /* Draw edges */ #define APF_TRANSP 0x20 /* Enable transparency */ #define APF_TRANSLUCENT APF_TRANSP /* "transparent" is the wrong word */ #define APF_EVERT 0x40 /* Evert surface normals */ #define APF_NORMALDRAW 0x80 /* Draw surface normals */ #define APF_VECTDRAW 0x100 /* Draw vectors/points */ #define APF_KEEPCOLOR 0x200 /* Not susceptible to N-D coloring */ #define APF_TEXTURE 0x400 /* Enable texture mapping */ #define APF_BACKCULL 0x800 /* Enable back-face culling */ #define APF_SHADELINES 0x2000 /* Enable line (edge & vect) lighting&shading */ #define APF_CONCAVE 0x4000 /* Expect concave polygons */ #define APF_TXMIPMAP 0x8000 /* Mip-mapped textures */ #define APF_TXMIPINTERP 0x10000 /* Interpolate between mipmaps */ #define APF_TXLINEAR 0x20000 /* Interpolate between texture pixels */ /* The following bits are used in 'valid', 'override' */ #define APF_SHADING 0x1 /* Use 'shading' value */ #define APF_NORMSCALE 0x4 /* Use 'nscale' value to draw normals */ #define APF_LINEWIDTH 0x8 /* Use 'linewidth' value */ #define APF_DICE 0x1000 /* Dicing (use udice, vdice fields) */ /* Possible values for ap->shading field; these MUST be consecutive !! (code outside the appearance library depends on this fact) */ #define APF_CONSTANT apf_constant /* constant-colored (unlighted) faces */ #define APF_FLAT apf_flat /* Flat-shaded, lighted faces */ #define APF_SMOOTH apf_smooth /* Gouraud-shaded faces, with lighting */ #define APF_CSMOOTH apf_csmooth /* Gouraud-shaded faces, without lighting */ #define APF_VCFLAT apf_vcflat /* Gouraud-coloured, but flat faces */ #define APF_NUM_SHADINGS apf_num_shadings #define IS_SMOOTH(shading) ((shading) >= APF_SMOOTH) #define IS_SHADED(shading) \ ((1<<(shading)) & ((1<translucency; ALPHA_BLENDING requests * alpha-blending with correct ordering of faces, SCREEN_DOOR requests * masking by a stipple patterns, NAIVE_BLENDING requests * alpha-blending without sorting the polygons. */ #define APF_ALPHA_BLENDING apf_alpha_blending #define APF_SCREEN_DOOR apf_screen_door #define APF_NAIVE_BLENDING apf_naive_blending #ifdef AP_IDEBUG Appearance * ApCreate(); Appearance * ApSet(); Material * MtCreate(); Material * MtSet(); LtLight * LtCreate(); LtLight * LtSet(); LmLighting * LmCreate(); LmLighting * LmSet(); int lt_end = LT_END; int lt_ambient = LT_AMBIENT; int lt_color = LT_COLOR; int lt_position = LT_POSITION; int lt_intensity = LT_INTENSITY; int lm_end = LM_END; int lm_ambient = LM_AMBIENT; int lm_localviewer = LM_LOCALVIEWER; int lm_attenc = LM_ATTENC; int lm_attenm = LM_ATTENM; int lm_ltset = LM_LtSet; int lm_light = LM_LIGHT; int lm_valid = LM_VALID; int lm_invalid = LM_INVALID; int lm_override = LM_OVERRIDE; int lm_nooverride = LM_NOOVERRIDE; int mt_end = MT_END; int mt_emission = MT_EMISSION; int mt_ambient = MT_AMBIENT; int mt_diffuse = MT_DIFFUSE; int mt_specular = MT_SPECULAR; int mt_ka = MT_Ka; int mt_kd = MT_Kd; int mt_ks = MT_Ks; int mt_alpha = MT_ALPHA; int mt_shininess = MT_SHININESS; int mt_valid = MT_VALID; int mt_invalid = MT_INVALID; int mt_override = MT_OVERRIDE; int mt_nooverride = MT_NOOVERRIDE; int ap_end = AP_END; int ap_do = AP_DO; int ap_dont = AP_DONT ; int ap_mat = AP_MAT; int ap_mtset = AP_MtSet; int ap_lgt = AP_LGT; int ap_lmset = AP_LmSet; int ap_normscale = AP_NORMSCALE; int ap_linewidth = AP_LINEWIDTH; int ap_valid = AP_VALID; int ap_invalid = AP_INVALID; int ap_override = AP_OVERRIDE; int ap_nooverride = AP_NOOVERRIDE; int ap_shading = AP_SHADING; int lmf_localviewer = LMF_LOCALVIEWER; int lmf_ambient = LMF_AMBIENT; int lmf_attenc = LMF_ATTENC; int lmf_attenm = LMF_ATTENM; int lmf_replacelights = LMF_REPLACELIGHTS; int mtf_emission = MTF_EMISSION; int mtf_ambient = MTF_AMBIENT; int mtf_diffuse = MTF_DIFFUSE; int mtf_specular = MTF_SPECULAR; int mtf_ka = MTF_Ka; int mtf_kd = MTF_Kd; int mtf_ks = MTF_Ks; int mtf_alpha = MTF_ALPHA; int mtf_shininess = MTF_SHININESS; int apf_facedraw = APF_FACEDRAW; int apf_edgedraw = APF_EDGEDRAW; int apf_transp = APF_TRANSP; int apf_transmaskp = APF_TRANSMASKP; int apf_evert = APF_EVERT; int apf_shading = APF_SHADING; int apf_normscale = APF_NORMSCALE; int apf_linewidth = APF_LINEWIDTH; int apf_constant = APF_CONSTANT; int apf_flat = APF_FLAT; int apf_smooth = APF_SMOOTH; #endif /* AP_IDEBUG */ #endif /* APPEARANCEDEF */ /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/shade/texture.c0000644000175000017500000005124312310110201014540 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include "appearance.h" #include "transobj.h" #include "handleP.h" #include "dbllist.h" DBLLIST(AllLoadedTextures); Texture * TxFLoad(IOBFILE *inf, char *fname) { Pool *p; Texture *tx = NULL; p = PoolStreamTemp(fname, inf, NULL, 0, &TextureOps); TxStreamIn(p, NULL, &tx); PoolDelete(p); return tx; } Texture * TxFSave(Texture *tx, FILE *outf, char *fname) { Pool *p; int ok; p = PoolStreamTemp(fname, NULL, outf, 1, NULL); PoolSetOType(p, PO_DATA); PoolIncLevel(p, 1); ok = TxStreamOut(p, NULL, tx); PoolDelete(p); return ok ? tx : NULL; } void TxUpdateImage(Handle **hp, Ref *parentobj, Image **imgp) { Texture *tx = (Texture *)parentobj; TxPurge(tx); HandleUpdRef(hp, parentobj, (Ref **)imgp); } static inline Texture *TxDefault(Texture *tx) { memset((char *)tx, 0, sizeof(Texture)); RefInit((Ref *)tx, TXMAGIC); TmIdentity(tx->tfm); DblListInit(&tx->loadnode); return tx; } Texture * _TxSet(Texture *tx, int attr1, va_list *alist) { int mask; Handle *h; Image *img; TransformPtr f; int attr; char *str; bool do_purge = false; bool img_files = false; bool do_delete = false; if (tx == NULL) { tx = OOGLNewE(Texture, "TxCreate Texture"); TxDefault(tx); do_delete = true; } #define NEXT(type) va_arg(*alist, type) for ( attr = attr1; attr != TX_END; attr = NEXT(int)) { switch (attr) { /* parse argument list */ case TX_DOCLAMP: mask = NEXT(int); tx->flags = (tx->flags & ~(TXF_SCLAMP|TXF_TCLAMP)) | (mask & (TXF_SCLAMP|TXF_TCLAMP)); break; case TX_APPLY: mask = NEXT(int); if (mask < TXF_MODULATE || mask > TXF_REPLACE) { OOGLError(1, "TxSet: bad value for TX_APPLY: %d must be %d..%d", mask, TXF_MODULATE, TXF_DECAL); goto nope; } tx->apply = (enum apply_enum)mask; break; case TX_FILE: str = NEXT(char *); if (str && tx->filename && strcmp(str, tx->filename) == 0) { break; } if (tx->filename) { OOGLFree(tx->filename); } tx->filename = str ? strdup(str) : NULL; do_purge = true; img_files = true; break; case TX_ALPHAFILE: str = NEXT(char *); if (str && tx->alphafilename && strcmp(str, tx->alphafilename) == 0) { break; } if (tx->alphafilename) { OOGLFree(tx->alphafilename); } tx->alphafilename = str ? strdup(str) : NULL; do_purge = true; img_files = true; break; #if 0 case TX_DATA: str = NEXT(char *); if (tx->data && str != tx->data) OOGLFree(tx->data); tx->data = str; if (str) tx->flags |= TXF_LOADED; break; case TX_XSIZE: mask = NEXT(int); if (mask != tx->xsize) tx->flags &= ~TXF_LOADED; tx->xsize = mask; break; case TX_YSIZE: mask = NEXT(int); if (mask != tx->ysize) tx->flags &= ~TXF_LOADED; tx->ysize = mask; break; case TX_CHANNELS: mask = NEXT(int); if (mask != tx->channels) tx->flags &= ~TXF_LOADED; tx->channels = mask; break; #endif #if 0 /* not implemented */ case TX_COORDS: mask = NEXT(int); if (mask < TXF_COORD_GIVEN||mask > TXF_COORD_NORMAL) { OOGLError(1, "TxSet: bad value for TX_APPLY: %d must be %d..%d", mask, TXF_MODULATE, TXF_DECAL); goto nope; } tx->coords = mask; break; #endif case TX_BACKGROUND: tx->background = *NEXT(Color *); break; case TX_HANDLE_IMAGE: h = NEXT(Handle *); img = NEXT(Image *); if (tx->imghandle) { HandlePDelete(&tx->imghandle); } tx->imghandle = REFGET(Handle, h); if (h) { HandleRegister(&tx->imghandle, (Ref *)tx, &tx->image, TxUpdateImage); HandleSetObject(tx->imghandle, (Ref *)img); } else { tx->image = REFGET(Image, img); } do_purge = true; break; case TX_HANDLE_TRANSFORM: h = NEXT(Handle *); f = NEXT(TransformPtr); if (tx->tfmhandle) { HandlePDelete( &tx->tfmhandle ); } tx->tfmhandle = REFGET(Handle, h); TmCopy(f, tx->tfm); if (h) { HandleRegister(&tx->tfmhandle, (Ref *)tx, tx->tfm, TransUpdate); } break; default: OOGLError(1, "TxSet: unknown attribute %d", attr); goto nope; } } if (do_purge) { tx->flags &= ~TXF_LOADED; TxPurge(tx); } if (img_files) { } return tx; nope: if (do_delete) { TxDelete(tx); } return NULL; } Texture * TxCreate(int a1, ...) { va_list alist; Texture *tx; va_start(alist,a1); tx = _TxSet(NULL, a1, &alist); va_end(alist); return tx; } Texture * TxSet(Texture *tx, int a1, ... ) { va_list alist; va_start(alist,a1); tx = _TxSet(tx, a1, &alist); va_end(alist); return tx; } TxUser * TxAddUser(Texture *tx, int id, int (*needed)(TxUser *), void (*purge)(TxUser *)) { TxUser *tu = OOGLNew(TxUser); memset((void *)tu, 0, sizeof(TxUser)); /* flags = 0, ctx = NULL, data = NULL */ tu->tx = tx; tu->id = id; tu->needed = needed; tu->purge = purge; tu->next = tx->users; tx->users = tu; if (DblListEmpty(&tx->loadnode)) { /* Ensure this texture is on the AllLoadedTextures list. */ DblListAdd(&AllLoadedTextures, &tx->loadnode); } return tu; } void TxRemoveUser(TxUser *tu) { TxUser **tup; Texture *tx; if (tu == NULL) { return; } tx = tu->tx; for (tup = &tx->users; *tup != NULL; tup = &(*tup)->next) { if (tu == *tup) { *tup = tu->next; if (tu->purge) { (*tu->purge)(tu); } OOGLFree(tu); break; } } if (tx->users == NULL) { TxPurge(tx); } } /* Reclaim memory from texture, but don't discard essential stuff * Notify all users to purge their information. This will be their * only notice. */ void TxPurge(Texture *tx) { /* Tell each user to get lost */ TxUser *u, *nextu; DblListDelete(&tx->loadnode); for (u = tx->users; u != NULL; u = nextu) { nextu = u->next; if (u->purge) { (*u->purge)(u); } OOGLFree(u); } tx->users = NULL; tx->flags &= ~TXF_USED; } void TxDelete(Texture *tx) { if (tx == NULL) { return; } if (tx->magic != TXMAGIC) { OOGLWarn("Internal warning: TxDelete on non-Texture %x (%x != %x)", tx, tx->magic, TXMAGIC); return; } if (RefDecr((Ref *)tx) > 0) { return; } TxPurge(tx); if (tx->filename) OOGLFree(tx->filename); if (tx->alphafilename) OOGLFree(tx->alphafilename); if (tx->tfmhandle) HandlePDelete(&tx->tfmhandle); if (tx->imghandle) HandlePDelete(&tx->imghandle); if (tx->image) ImgDelete(tx->image); OOGLFree(tx); } HandleOps TextureOps = { "texture", (int ((*)()))TxStreamIn, (int ((*)()))TxStreamOut, (void ((*)()))TxDelete, NULL, NULL, }; static struct txkw { char *word; unsigned int aval; /* attribute or attribute value value for _TxSet() */ int args; /* > 0: number of following args, * < 0: -number of following keywords determine * attribute value. */ } tx_kw[] = { { "texture", 0, 1 }, { "clamp", TX_DOCLAMP, -4 }, { "none", 0, 0 }, { "s", TXF_SCLAMP, 0 }, { "t", TXF_TCLAMP, 0 }, { "st", TXF_SCLAMP|TXF_TCLAMP, 0 }, { "image", TX_HANDLE_IMAGE, 0 }, { "apply", TX_APPLY, -4 }, { "blend", TXF_BLEND, 0 }, { "modulate", TXF_MODULATE, 0 }, { "decal", TXF_DECAL, 0 }, { "replace", TXF_REPLACE, 0 }, { "transform", TX_HANDLE_TRANSFORM, 0 }, /*(s,t,r,q) . tfm = tx coords */ { "background", TX_BACKGROUND, 3 }, /* deprecated, maybe */ { "file", TX_FILE, 0 }, { "alphafile", TX_ALPHAFILE, 0 }, #if 0 { "xsize", TX_XSIZE, 1 }, { "ysize", TX_YSIZE, 1 }, { "channels", TX_CHANNELS, 1 }, #endif /********************/ #if 0 /* not implemented ... original comment: */ /* Let's not implement this initially */ { "coords", TX_COORDS, -4 }, { "given", TXF_COORD_GIVEN, 0 }, { "local", TXF_COORD_LOCAL, 0 }, { "camera", TXF_COORD_CAMERA, 0 }, { "normal", TXF_COORD_NORMAL, 0 }, #endif }; #if SIZEOF_INO_T == 0 # undef SIZEOF_INO_T # define SIZEOF_INO_T SIZEOF_LONG #endif #if SIZEOF_DEV_T == 0 # undef SIZEOF_DEV_T # define SIZEOF_DEV_T SIZEOF_LONG #endif #if SIZEOF_TIME_T == 0 # undef SIZEOF_TIME_T # define SIZEOF_TIME_T SIZEOF_LONG #endif #define INO_T_LSIZE (SIZEOF_INO_T+SIZEOF_INO_T-1)/SIZEOF_LONG #define DEV_T_LSIZE (SIZEOF_DEV_T+SIZEOF_DEV_T-1)/SIZEOF_LONG #define TIME_T_LSIZE (SIZEOF_TIME_T+SIZEOF_TIME_T-1)/SIZEOF_LONG #define LONG_CHARS (SIZEOF_LONG*2) static inline int stat_to_handle(char *str, dev_t dev, ino_t ino, time_t time) { union { ino_t ino; long data[INO_T_LSIZE]; } ino_t_conv; union { dev_t dev; long data[DEV_T_LSIZE]; } dev_t_conv; union { time_t time; long data[TIME_T_LSIZE]; } time_t_conv; int i, cnt, len; strcpy(str, "::"); str += (cnt = 2); ino_t_conv.ino = ino; for (i = 0; i < INO_T_LSIZE; i++) { #if 0 len = sprintf(str, "%0*lx", LONG_CHARS, ino_t_conv.data[i]); #else len = sprintf(str, "%lx", ino_t_conv.data[i]); #endif str += len; cnt += len; } *str++ = '@'; cnt++; dev_t_conv.dev = dev; for (i = 0; i < DEV_T_LSIZE; i++) { #if 0 len = sprintf(str, "%0*lx", LONG_CHARS, dev_t_conv.data[i]); #else len = sprintf(str, "%lx", dev_t_conv.data[i]); #endif str += len; cnt += len; } *str++ = '@'; cnt++; time_t_conv.time = time; for (i = 0; i < TIME_T_LSIZE; i++) { #if 0 len = sprintf(str, "%0*lx", LONG_CHARS, time_t_conv.data[i]); #else len = sprintf(str, "%lx", time_t_conv.data[i]); #endif str += len; cnt += len; } return cnt; } /* see the comments in src/lib/gprim/geom/geomstream.c */ int TxStreamIn(Pool *p, Handle **hp, Texture **txp) { IOBFILE *stream; char *fname; Handle *h = NULL; Texture *tx = NULL; float val[16]; struct txkw *kw; char *w, *raww; int i, k = 0; int brack = 0; int empty = 1; bool braces = true; /*int plus = 0;*/ bool more, mine = true; /* Questionable -- we'll report all errors */ if ((stream = PoolInputFile(p)) == NULL) { return 0; } fname = PoolName(p); more = false; do { iobfnextc(stream, 0); switch(i = iobfgetc(stream)) { case ':': case '<': w = iobfdelimtok("{}()", stream, 0); /* * Consider doing a path search. * Do this before calling HandleReferringTo() * to prevent spurious error messages. */ if (i == '<' && (h = HandleByName(w, &TextureOps)) == NULL && w[0] != '/') { w = findfile(fname, raww = w); if (w == NULL) { OOGLSyntax(PoolInputFile(p), "Error reading \"%s\": can't find file \"%s\"", fname, raww); } } else if (h) { HandleDelete(h); } h = HandleReferringTo(i, w, &TextureOps, NULL); if (h != NULL) { tx = (Texture *)HandleObject(h); RefIncr((Ref*)tx); } break; case EOF: brack = 0; break; case '{': brack++; braces = true; break; case '}': if (brack-- <= 0) { iobfungetc(i, stream); } break; case '-': case '!': /*plus = -1;*/ break; case '+': /*plus = 1;*/ break; case '*': break; default: more = false; iobfungetc(i, stream); w = iobfdelimtok("{}()", stream, 0); if (w == NULL) { break; } for (i = sizeof(tx_kw)/sizeof(tx_kw[0]), kw = tx_kw; --i >= 0; kw++) if (!strcmp(kw->word, w)) break; if (i < 0) { if (mine) OOGLSyntax(stream, "%s: unknown texture keyword %s", fname, w); return 0; } if (tx == NULL) { tx = TxCreate(TX_END); } if (kw->args < 0) { char allowed[256], *tail = allowed; w = iobfdelimtok("{}()", stream, 0); if (w == NULL) w = ""; allowed[0] = '\0'; for (k = 1; strcmp((kw+k)->word, w); k++) { sprintf(tail, " %s", (kw+k)->word); tail += strlen(tail); if (k + kw->args >= 0) { OOGLSyntax(stream, "%s: %s %s: expected one of: %s", fname, kw->word, w, allowed); TxDelete(tx); return 0; } } } else if (kw->args > 0) { int n = iobfgetnf(stream, kw->args, val, 0); if (n != kw->args) { OOGLSyntax(stream, "%s: %s expected %d numeric values", fname, w, kw->args); TxDelete(tx); return 0; } } empty++; switch((int)kw->aval) { case -1: mine = more = true; empty--; break; case TX_APPLY: tx->apply = (enum apply_enum)(kw+k)->aval; break; case TX_FILE: case TX_ALPHAFILE: raww = iobfdelimtok("{}()", stream, 0); w = findfile(fname, raww); if (w == NULL) { OOGLSyntax(stream, "Warning: reading \"%s\": can't find file \"%s\", ignoring texture", fname, raww); } else { TxSet(tx, kw->aval, w, TX_END); } break; #if 0 /* does not belong here */ case TX_XSIZE: case TX_YSIZE: case TX_CHANNELS: if (val[0] < 1 || val[0] > (tx_kw[i].aval==TX_CHANNELS) ? 4 : 100000) { OOGLSyntax(stream, "%s: Bad value for %s: %s", fname, kw->word, w); TxDelete(tx); return 0; } TxSet(tx, kw->aval, (int)val[0], TX_END); break; #endif #if 0 /* not implemented */ case TX_COORDS: tx->coords = (kw+k)->aval; break; #endif case TX_BACKGROUND: { /* We allow ColorA for compatibility, but the texture * background color really is only RGB, not RGBA (see * glTexEnvf(3)). So: if the next character is not a closing * brace and not '\n', consume the next float which should be * the alpha component */ float dummy; int c; if ((c = iobfnextc(stream, 1)) != '\n' && c != '}' && c != EOF) { if (iobfgetnf(stream, 1, &dummy, 0) < 1) { OOGLSyntax(stream, "%s: background color expected", fname); TxDelete(tx); return false; } } TxSet(tx, kw->aval, val, TX_END); break; } case TX_HANDLE_IMAGE: if (!ImgStreamIn(p, &tx->imghandle, &tx->image)) { OOGLSyntax(stream, "%s: texture image definition expected", fname); TxDelete(tx); return false; } if (tx->filename) { OOGLFree(tx->filename); tx->filename = NULL; } if (tx->alphafilename) { OOGLFree(tx->alphafilename); tx->alphafilename = NULL; } if (tx->imghandle) { HandleRegister(&tx->imghandle, (Ref *)tx, &tx->image, TxUpdateImage); } break; case TX_HANDLE_TRANSFORM: if (!TransStreamIn(p, &tx->tfmhandle, tx->tfm)) { OOGLSyntax(stream, "%s: 4x4 texture transform expected", fname); TxDelete(tx); return false; } if (tx->tfmhandle) { HandleRegister(&tx->tfmhandle, (Ref *)tx, tx->tfm, TransUpdate); } break; case TX_DOCLAMP: tx->flags = (kw+k)->aval; break; default: break; } /*plus = 0;*/ } } while (brack > 0 || more); /* handle file and alphafile constructs */ if (h == NULL && tx->filename) { struct stat st; char hname[2*(4+(INO_T_LSIZE+DEV_T_LSIZE+TIME_T_LSIZE)*SIZEOF_LONG)+1]; char *ptr; if (tx->imghandle) { HandlePDelete(&tx->imghandle); tx->imghandle = NULL; } if (tx->image) { ImgDelete(tx->image); tx->image = NULL; } if (stat(tx->filename, &st) < 0) { OOGLSyntax(stream, "%s: cannot stat file %s", fname, tx->filename); TxDelete(tx); return 0; } ptr = hname; ptr += stat_to_handle(ptr, st.st_dev, st.st_ino, st.st_mtime); if (tx->alphafilename) { if (stat(tx->alphafilename, &st) < 0) { OOGLSyntax(stream, "%s: cannot stat file %s", fname, tx->filename); TxDelete(tx); return 0; } ptr += stat_to_handle(ptr, st.st_dev, st.st_ino, st.st_mtime); } /* we share texture images defined by the same files, as was * the previous behaviour. However, this is implemented using * references and handles to image objects. */ tx->imghandle = HandleByName(hname, &ImageOps); if (tx->imghandle != NULL) { tx->image = REFGET(Image, HandleObject(tx->imghandle)); } else { /* This means there is no image, create one */ tx->image = tx->alphafilename ? ImgCreate(IMG_DATA_CHAN_FILE, IMGF_AUTO, NULL, tx->filename, IMG_DATA_CHAN_FILE, IMGF_ALPHA, NULL, tx->alphafilename, IMG_END) : ImgCreate(IMG_DATA_CHAN_FILE, IMGF_AUTO, NULL, tx->filename, IMG_END); if (!tx->image) { OOGLSyntax(stream, "%s: cannot create image from given file(s) " "(\"%s\"/\"%s\"", fname, tx->filename, tx->alphafilename); TxDelete(tx); return 0; } /* Generate a new reference */ tx->imghandle = HandleAssign(hname, &ImageOps, (Ref *)tx->image); tx->imghandle->permanent = false; } } /* Pass the ownership of h and tx to the caller if requested */ if (hp != NULL) { /* pass on ownership of the handle h to the caller of this function */ if (*hp != NULL) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } else if (h) { /* Otherwise delete h because we are its owner. Note that * HandleReferringTo() has passed the ownership of h to us; * explicitly defined handles (hdefine and define constructs) * will not be deleted by this call. */ HandleDelete(h); } /* same logic as for hp */ if (txp != NULL) { if (*txp != NULL) { TxDelete(*txp); } *txp = tx; } else if(tx) { TxDelete(tx); } return (tx != NULL || h != NULL || (empty && braces)); } int TxStreamOut(Pool *p, Handle *h, Texture *tx) { static const char *clamps[] = {"none", "s", "t", "st"}; static const char *applies[] = {"modulate", "decal", "blend", "replace"}; FILE *f = PoolOutputFile(p); (void)h; if (f == NULL) { return 0; } PoolFPrint(p, f, "texture {\n"); PoolIncLevel(p, 1); PoolFPrint(p, f, "clamp %s\n", clamps[tx->apply & (TXF_SCLAMP|TXF_TCLAMP)]); PoolFPrint(p, f, "apply %s\n", (unsigned int)tx->apply < COUNT(applies) ? applies[tx->apply] : "???"); PoolFPrint(p, f, "background %.8g %.8g %.8g\n", tx->background.r, tx->background.g, tx->background.b); PoolFPrint(p, f, ""); TransStreamOut(p, tx->tfmhandle, tx->tfm); if (tx->filename) { PoolFPrint(p, f, "file %s\n", tx->filename); if (tx->alphafilename) { PoolFPrint(p, f, "alphafile %s\n", tx->alphafilename); } } else { PoolFPrint(p, f, ""); ImgStreamOut(p, tx->imghandle, tx->image); } PoolIncLevel(p, -1); PoolFPrint(p, f, "}\n"); return !ferror(f); } Texture * TxCopy(Texture *src, Texture *dst) { Ref r; if (src == NULL) { if (dst) { TxDelete(dst); } return NULL; } else if (src == dst) { return dst; } else { if (dst == NULL) { dst = TxCreate(TX_END); } else { TxPurge(dst); if (dst->filename) OOGLFree(dst->filename); if (dst->alphafilename) OOGLFree(dst->alphafilename); if (dst->tfmhandle) HandlePDelete(&dst->tfmhandle); if (dst->imghandle) HandlePDelete(&dst->imghandle); if (dst->image) ImgDelete(dst->image); } r = *(Ref *)dst; *dst = *src; *(Ref *)dst = r; if (dst->filename) dst->filename = strdup(dst->filename); if (dst->alphafilename) dst->alphafilename = strdup(dst->alphafilename); if (dst->tfmhandle) dst->tfmhandle = REFGET(Handle, dst->tfmhandle); if (dst->imghandle) dst->imghandle = REFGET(Handle, dst->imghandle); if (dst->image) dst->image = REFGET(Image, dst->image); return dst; } } Texture * TxMerge(Texture *src, Texture *dst, int mergeflags) { (void)mergeflags; if (src == NULL) return REFGET(Texture, dst); if (dst == NULL) { return REFGET(Texture, src); } /* Oh, well. XXX. Leave real merging for later, if at all. * Meanwhile, any new texture completely replaces any old one. */ return REFGET(Texture, src); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/shade/material.c0000644000175000017500000002711012310110201014632 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "appearance.h" #include "transobj.h" #include "handleP.h" #include #include extern int Apsavepfx(int valid, int override, int mask, char *keyword, FILE *f, Pool *p); Material * _MtSet(Material *mat, int attr1, va_list *alist) { int attr; #define NEXT(type) va_arg(*alist, type) if (mat == NULL) { /* * New Material created here. */ mat = OOGLNewE(Material, "new Material"); MtDefault(mat); } for (attr = attr1; attr != MT_END; attr = NEXT(int)) { switch (attr) { /* parse argument list */ case MT_AMBIENT: mat->ambient = *NEXT(Color *); mat->valid |= MTF_AMBIENT; break; case MT_DIFFUSE: { Color tmp; tmp = *NEXT(Color *); mat->diffuse.r = tmp.r; mat->diffuse.g = tmp.g; mat->diffuse.b = tmp.b; mat->valid |= MTF_DIFFUSE; break; } case MT_SPECULAR: mat->specular = *NEXT(Color *); mat->valid |= MTF_SPECULAR; break; case MT_EMISSION: mat->emission = *NEXT(Color *); mat->valid |= MTF_EMISSION; break; case MT_ALPHA: mat->diffuse.a = NEXT(double); mat->valid |= MTF_ALPHA; break; case MT_Ka: mat->ka = NEXT(double); mat->valid |= MTF_Ka; break; case MT_Kd: mat->kd = NEXT(double); mat->valid |= MTF_Kd; break; case MT_Ks: mat->ks = NEXT(double); mat->valid |= MTF_Ks; break; case MT_SHININESS: mat->shininess = NEXT(double); mat->valid |= MTF_SHININESS; break; case MT_EDGECOLOR: mat->edgecolor = *NEXT(Color *); mat->valid |= MTF_EDGECOLOR; break; case MT_NORMALCOLOR: mat->normalcolor = *NEXT(Color *); mat->valid |= MTF_NORMALCOLOR; break; case MT_INVALID: mat->valid &= ~NEXT(int); break; case MT_OVERRIDE: mat->override |= NEXT(int); break; case MT_NOOVERRIDE: mat->override &= ~NEXT(int); break; default: OOGLError (0, "_MtSet: undefined option: %d\n", attr); return NULL; break; } } return mat; #undef NEXT } Material * MtCreate(int a1, ... ) { va_list alist; Material *mat; va_start(alist,a1); mat = _MtSet(NULL, a1, &alist); va_end(alist); return mat; } Material * MtSet(Material *mat, int attr, ... ) { va_list alist; va_start(alist,attr); mat = _MtSet(mat,attr,&alist); va_end(alist); return mat; } int MtGet(Material *mat, int attr, void * value) { if (mat == NULL) return -1; switch (attr) { case MT_AMBIENT: *(Color *)value = mat->ambient; break; case MT_DIFFUSE: { ((Color *)value)->r = mat->diffuse.r; ((Color *)value)->g = mat->diffuse.g; ((Color *)value)->b = mat->diffuse.b; break; } case MT_SPECULAR: *(Color *)value = mat->specular; break; case MT_EMISSION: *(Color *) value = mat->emission; break; case MT_ALPHA: *(double *) value = mat->diffuse.a; break; case MT_Ka: *(double *) value = mat->ka; break; case MT_Kd: *(double *) value = mat->kd; break; case MT_Ks: *(double *) value = mat->ks; break; case MT_SHININESS: *(double *) value = mat->shininess; break; case MT_EDGECOLOR: *(Color *)value = mat->edgecolor; break; case MT_NORMALCOLOR: *(Color *)value = mat->normalcolor; break; case MT_OVERRIDE: case MT_NOOVERRIDE: *(int *) value = mat->override; break; case MT_VALID: case MT_INVALID: *(int *) value = mat->valid; break; default: OOGLError (0, "MtGet: undefined option: %d\n", attr); return -1; break; } return 1; } void MtDelete(Material *mat) { if (mat && RefDecr((Ref *)mat) <= 0) { if (mat->magic != MATMAGIC) { OOGLError(1, "MtDelete(%x) of non-Material: magic %x != %x", mat, mat->magic, MATMAGIC); return; } mat->magic = MATMAGIC ^ 0x80000000; OOGLFree(mat); } } Material * MtDefault( Material *mat ) { memset(mat, 0, sizeof(Material)); RefInit((Ref *)mat, MATMAGIC); mat->valid = mat->override = 0; mat->diffuse.a = 1.0; mat->Private = 0; mat->changed = 1; return mat; } Material * MtCopy( Material *src, Material *dst ) { if (!src) return NULL; if (dst == NULL) dst = OOGLNewE(Material, "MtCopy: Material"); *dst = *src; dst->Private = 0; RefInit((Ref *)dst, MATMAGIC); dst->changed = 1; return dst; } #ifndef max # define max(a,b) ((a) > (b) ? (a) : (b)) #endif #if 0 static void norm( color, coeff ) Color *color; float *coeff; { *coeff = max(color->r, color->g); *coeff = max(color->b, *coeff); if ( *coeff != 0.0 ) { color->r /= *coeff; color->g /= *coeff; color->b /= *coeff; } } #endif /* * MtMerge(src, dst, mergeflags) * Merge Material values: src into dst, controlled by flag. * If "inplace" is true, changes are made in dst itself; otherwise, * the dst material is copied if any changes need be made to it. * The returned Material's reference count is incremented as appropriate; * thus the caller should MtDelete() the returned Material when done. */ Material * MtMerge(Material *src, Material *dst, int mergeflags) { int mask; if (dst == NULL) return MtCopy(src, NULL); /* Fields to merge in */ mask = src ? (mergeflags & APF_OVEROVERRIDE) ? src->valid : src->valid & ~(dst->override &~ src->override) : 0; if (mergeflags & APF_INPLACE) RefIncr((Ref *)dst); else dst = MtCopy(dst, NULL); if (mask == 0) /* No changes to dst */ return dst; dst->changed |= src->changed; dst->valid = (src->valid & mask) | (dst->valid & ~mask); dst->override = (src->override & mask) | (dst->override & ~mask); if (mask & MTF_EMISSION) dst->emission = src->emission; if (mask & MTF_AMBIENT) dst->ambient = src->ambient; if (mask & MTF_DIFFUSE) { dst->diffuse.r = src->diffuse.r; dst->diffuse.g = src->diffuse.g; dst->diffuse.b = src->diffuse.b; } if (mask & MTF_SPECULAR) dst->specular = src->specular; if (mask & MTF_Ka) dst->ka = src->ka; if (mask & MTF_Kd) dst->kd = src->kd; if (mask & MTF_Ks) dst->ks = src->ks; if (mask & MTF_ALPHA) dst->diffuse.a = src->diffuse.a; if (mask & MTF_SHININESS) dst->shininess = src->shininess; if (mask & MTF_EDGECOLOR) dst->edgecolor = src->edgecolor; if (mask & MTF_NORMALCOLOR) dst->normalcolor = src->normalcolor; return dst; } int MtSave(Material *mat, char *name) { FILE *f; int ok; f = fopen(name,"w"); if (!f) { perror(name); return -1; } ok = MtFSave(mat, f, NULL); fclose(f); return ok; } Material *MtLoad(Material *mat, char *name) { IOBFILE *f = iobfopen(name,"rb"); if (f == NULL) { OOGLError(0, "MtLoad: can't open %s: %s", name, sperror()); return NULL; } mat = MtFLoad(mat, f, name); iobfclose(f); return mat; } /* * Load Material from file. * Syntax: * < "filename_containing_material" [or] * { keyword value keyword value ... } * * Each keyword may be prefixed by "*", indicating that its value should * override corresponding settings in child objects. [By default, * children's appearance values supercede those of their parents.] * * Note: don't overwrite ka, kd, ks if they're already set when we read in * the corresponding color. */ static char *mt_kw[] = { "shininess", "ka", "kd", "ks", "alpha", "backdiffuse", "emission", "ambient", "diffuse", "specular", "edgecolor", "normalcolor", "material" }; static unsigned short mt_flags[] = { MTF_SHININESS, MTF_Ka, MTF_Kd, MTF_Ks, MTF_ALPHA, MTF_EMISSION, MTF_EMISSION, MTF_AMBIENT, MTF_DIFFUSE, MTF_SPECULAR, MTF_EDGECOLOR, MTF_NORMALCOLOR, 0 }; static char mt_args[] = { 1,1,1,1,1, 3,3,3,3,3,3,3, 0 }; /* fname used for error msgs, may be NULL */ Material * MtFLoad(Material *mat, IOBFILE *f, char *fname) { char *w; int i; float v[3]; int brack = 0; int over, not; int got; Material m; MtDefault(&m); over = not = 0; for (;;) { switch(iobfnextc(f, 0)) { case '<': iobfgetc(f); if (MtLoad(&m, iobfdelimtok("{}()", f, 0)) == NULL) return NULL; if (!brack) goto done; break; case '{': brack++; iobfgetc(f); break; case '}': if (brack) { iobfgetc(f); } goto done; case '*': over = 1; iobfgetc(f); break; /* 'override' prefix */ case '!': not = 1; iobfgetc(f); break; default: w = iobfdelimtok("{}()", f, 0); if (w == NULL) return MtCopy(&m, mat); /* break; */ /* done */ for (i = sizeof(mt_kw)/sizeof(mt_kw[0]); --i >= 0; ) if (!strcmp(w, mt_kw[i])) break; if ( i < 0) { OOGLError(1, "MtFLoad: %s: unknown material keyword %s",fname,w); return NULL; } else if ( !not && (got=iobfgetnf(f, mt_args[i], v, 0)) != mt_args[i] ) { OOGLError(1, "MtFLoad: %s: \"%s\" expects %d values, got %d", fname, w, mt_args[i], got); return NULL; } if (not) { if (!over) m.valid &= ~mt_flags[i]; m.override &= ~mt_flags[i]; } else { switch(i) { case 0: m.shininess = v[0]; break; case 1: m.ka = v[0]; break; case 2: m.kd = v[0]; break; case 3: m.ks = v[0]; break; case 4: m.diffuse.a = v[0]; break; case 5: case 6: memcpy(&m.emission, v, sizeof(Color)); break; case 7: memcpy(&m.ambient, v, sizeof(Color)); break; case 8: memcpy(&m.diffuse, v, sizeof(Color)); break; case 9: memcpy(&m.specular, v, sizeof(Color)); break; case 10: memcpy(&m.edgecolor, v, sizeof(Color)); break; case 11: memcpy(&m.normalcolor, v, sizeof(Color)); break; } m.valid |= mt_flags[i]; if (over) m.override |= mt_flags[i]; } over = not = 0; } } done: return MtCopy(&m, mat); } int MtFSave(Material *mat, FILE *f, Pool *p) { int i; float v; Color *c; for (i = 0; i < (int)(sizeof(mt_kw)/sizeof(mt_kw[0])); i++) { if (Apsavepfx(mat->valid, mat->override, mt_flags[i], mt_kw[i], f, p)) { switch(mt_flags[i]) { case MTF_Ka: v = mat->ka; goto pfloat; case MTF_Kd: v = mat->kd; goto pfloat; case MTF_Ks: v = mat->ks; goto pfloat; case MTF_SHININESS: v = mat->shininess; goto pfloat; case MTF_ALPHA: v = mat->diffuse.a; goto pfloat; pfloat: fprintf(f, "%f\n", v); break; case MTF_DIFFUSE: c = (Color *)(void *)&mat->diffuse; goto pcolor; case MTF_AMBIENT: c = &mat->ambient; goto pcolor; case MTF_EMISSION: c = &mat->emission; goto pcolor; case MTF_SPECULAR: c = &mat->specular; goto pcolor; case MTF_EDGECOLOR: c = &mat->edgecolor; goto pcolor; case MTF_NORMALCOLOR: c = &mat->normalcolor; goto pcolor; pcolor: fprintf(f, "%f %f %f\n", c->r, c->g, c->b); break; } } } return ferror(f); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/shade/light.c0000644000175000017500000004130512310110201014145 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * light - * Support for describing light sources and lists of * light sources. * * Pat Hanrahan 1989 */ #include "appearance.h" #include "ooglutil.h" static inline void norm(Color *color, float *coeff); DEF_FREELIST(LtLight); #if 0 #define NewLtLight() OOGLNewE(LtLight, "new LtLight") #define FreeLtLight(lt) OOGLFree(lt) #else static inline LtLight* NewLtLight(void) { LtLight *newlt; FREELIST_NEW(LtLight, newlt); return newlt; } static inline void FreeLtLight(LtLight *old) { FREELIST_FREE(LtLight, old); } #endif /* * Default light is full white and position along the z-axis. */ static Color black = { 0.0, 0.0, 0.0 }; LtLight * _LtSet(LtLight *light, int a1, va_list *alist) { int attr; #define NEXT(type) va_arg(*alist, type) if (light == NULL) { /* * New LtLight created here. */ light = NewLtLight(); LtDefault(light); } for(attr = a1; attr != LT_END; attr = NEXT(int)) { switch (attr) { /* parse argument list */ case LT_AMBIENT: light->ambient = *NEXT(Color *); light->changed = 1; break; case LT_COLOR: light->color = *NEXT(Color *); light->changed = 1; break; case LT_POSITION: light->position = *NEXT(HPoint3 *); light->changed = 1; break; case LT_INTENSITY: light->intensity = NEXT(double); light->changed = 1; break; case LT_LOCATION: light->location = NEXT(int); light->changed = 1; break; default: OOGLError (0, "_LtSet: undefined option: %d\n", attr); return NULL; break; } } return light; #undef NEXT } LtLight * LtCreate(int a1, ... ) { va_list alist; LtLight *light; va_start(alist,a1); light = _LtSet(NULL, a1, &alist); va_end(alist); return light; } LtLight * LtSet(LtLight *light, int attr, ...) { va_list alist; va_start(alist,attr); light = _LtSet(light,attr,&alist); va_end(alist); return light; } int LtGet(LtLight *light, int attr, void * value) { if (!light) return 0; switch (attr) { case LT_AMBIENT: *(Color *) value = light->ambient; break; case LT_COLOR: *(Color *) value = light->color; break; case LT_POSITION: *(Point *) value = light->position; break; case LT_INTENSITY: *(double *) value = light->intensity; break; case LT_LOCATION: *(int *)value = light->location; break; default: OOGLError (0, "LtGet: undefined option: %d\n", attr); return -1; break; } return 1; } void LtDelete(LtLight *l) { if(l == NULL || RefDecr((Ref *)l) > 0) return; if(l->magic != LTMAGIC) { OOGLError(1, "LtDelete(%x) of non-light: magic %x != %x", l, l->magic, LTMAGIC); return; } l->magic = LTMAGIC ^ 0x80000000; FreeLtLight(l); } LtLight * LtCopy( LtLight *l1, LtLight *l2 ) { if(l2 == NULL) l2 = NewLtLight(); *l2 = *l1; /* Don't reset the 'changed' & 'Private' fields */ /* Reset private and changed flags */ l2->Private = 0; l2->changed = 1; RefInit((Ref *)l2, LTMAGIC); return l2; } LtLight * LtDefault( LtLight *light ) { static HPoint3 defposition = { 0.0, 0.0, 1.0, 0.0 }; static Color deflight = { 1.0, 1.0, 1.0 }; light->intensity = 1.0; light->ambient = black; light->color = deflight; light->position = defposition; light->location = LTF_GLOBAL; light->Private = 0; light->changed = 1; return light; } /* * Set the intensity, color and position of a light. */ void LtProperties( LtLight *light, float intensity, Color *color, Point *position ) { light->intensity = intensity; light->color = *color; light->position = *position; light->location = LTF_GLOBAL; light->changed = 1; } /* * Load a lighting description from a file. */ LtLight * LtLoad(LtLight *li, char *name) { IOBFILE *f; if(name == NULL || (f = iobfopen(name, "r")) == NULL) { OOGLError(1, "Can't find light file %s: %s", name, sperror()); return NULL; } li = LtFLoad(li, f, name); iobfclose(f); return li; } /* * Load Light from file. * Syntax: * < "filename_containing_material" [or] * { keyword value keyword value ... } * */ LtLight * LtFLoad(LtLight *lite, IOBFILE *f, char *fname) { char *w; int i; float v[4]; int brack = 0; static char *lkeys[] = { "ambient", "color", "position", "location", "global", "camera", "local" }; static short largs[] = { 3, 3, 4, 0, ~LTF_GLOBAL, ~LTF_CAMERA, ~LTF_LOCAL }; int got; LtLight l; LtDefault(&l); for(;;) { switch(iobfnextc(f, 0)) { case '<': iobfgetc(f); if(LtLoad(&l, iobfdelimtok("(){}", f, 0)) == NULL) return NULL; if(!brack) goto done; break; case '{': brack++; iobfgetc(f); break; case '}': if(brack) { iobfgetc(f); } goto done; default: w = iobftoken(f, 0); if(w == NULL) goto done; for(i = sizeof(lkeys)/sizeof(lkeys[0]); --i >= 0; ) if(!strcmp(w, lkeys[i])) break; if( i < 0) { OOGLSyntax(f, "Reading light from %s: unknown keyword %s",fname,w); return NULL; } else if( largs[i] > 0 && (got=iobfgetnf(f, largs[i], v, 0)) != largs[i] ) { OOGLSyntax(f, "Reading light from %s: \"%s\" expects %d values, got %d", fname, w, largs[i], got); return NULL; } switch(i) { case 0: memcpy(&l.ambient, v, sizeof(Color)); break; case 1: memcpy(&l.color, v, sizeof(Color)); norm( &l.color, &l.intensity ); break; case 2: memcpy(&l.position, v, sizeof(HPoint3)); break; case 3: break; default: l.location = ~largs[i]; break; } } } done: lite = LtCopy(&l, lite); return lite; } void LtFSave(LtLight *l, FILE *f, Pool *p) { PoolFPrint(p, f, "ambient %f %f %f\n", l->ambient.r, l->ambient.g, l->ambient.b); PoolFPrint(p, f, "color %f %f %f\n", l->intensity*l->color.r, l->intensity*l->color.g, l->intensity*l->color.b); PoolFPrint(p, f, "position %f %f %f %f\n", l->position.x, l->position.y, l->position.z, l->position.w); if(l->location != LTF_GLOBAL) PoolFPrint(p, f, "location %s\n", l->location == LTF_CAMERA ? "camera" : "local"); /* PoolFPrint(p, f,"intensity %f\n", la->intensity); */ } /* * Create a list of lights and a lighting model. */ LmLighting * _LmSet(LmLighting *lgt, int a1, va_list *alist) { int attr; #define NEXT(type) va_arg(*alist, type) if (!alist) return lgt; if (lgt == NULL) { /* * New Lighting created here. */ lgt = OOGLNewE(LmLighting, "LmCreate Lighting"); LmDefault(lgt); } for(attr = a1; attr != LM_END; attr = NEXT(int)) { switch (attr) { /* parse argument list */ case LM_LtSet: LmAddLight(lgt, _LtSet(NULL, va_arg(*alist, int), alist)); break; case LM_LIGHT: LmAddLight(lgt, NEXT(LtLight *)); break; case LM_REPLACELIGHTS: if (NEXT(int)) lgt->valid |= LMF_REPLACELIGHTS; else lgt->valid &= ~LMF_REPLACELIGHTS; break; case LM_AMBIENT: lgt->ambient = *NEXT(Color *); lgt->valid |= LMF_AMBIENT; break; case LM_LOCALVIEWER: lgt->localviewer = NEXT(int); lgt->valid |= LMF_LOCALVIEWER; break; case LM_ATTENC: lgt->attenconst = NEXT(double); lgt->valid |= LMF_ATTENC; break; case LM_ATTENM: lgt->attenmult = NEXT(double); lgt->valid |= LMF_ATTENM; break; case LM_OVERRIDE: lgt->override |= NEXT(int); break; case LM_NOOVERRIDE: lgt->override &= ~NEXT(int); break; case LM_INVALID: lgt->valid &= ~NEXT(int); break; default: OOGLError (0, "_LmSet: undefined option: %d\n", attr); return NULL; break; } } return lgt; #undef NEXT } LmLighting * LmCreate(int attr, ... ) { va_list alist; LmLighting *lgt; va_start(alist,attr); lgt = _LmSet(NULL, attr, &alist); va_end(alist); return lgt; } LmLighting * LmSet(LmLighting *lgt, int a1, ... ) { va_list alist; va_start(alist,a1); lgt = _LmSet(lgt, a1, &alist); va_end(alist); return lgt; } int LmGet(LmLighting *lgt, int attr, void *value) { if (!lgt) return 0; switch (attr) { case LM_LIGHT: *(LtLight ***) value = &lgt->lights[0]; break; case LM_REPLACELIGHTS: *(int*)value = lgt->valid & LMF_REPLACELIGHTS; break; case LM_AMBIENT: *(Color *) value = lgt->ambient; break; case LM_LOCALVIEWER: *(double *) value = lgt->localviewer; break; case LM_ATTENC: *(double *) value = lgt->attenconst; break; case LM_ATTENM: *(double *) value = lgt->attenmult; break; case LM_ATTEN2: *(double *) value = lgt->attenmult2; break; case LM_OVERRIDE: case LM_NOOVERRIDE: *(int *) value = lgt->override; break; case LM_VALID: case LM_INVALID: *(int *) value = lgt->valid; break; default: OOGLError (0, "LmGet: undefined option: %d\n", attr); return -1; break; } return 1; } LmLighting * LmMerge(LmLighting *src, LmLighting *dst, int mergeflags) { unsigned int mask; if(dst == NULL) return LmCopy(src, NULL); mask = src ? (mergeflags & APF_OVEROVERRIDE) ? src->valid : src->valid & ~(dst->override &~ src->override) : 0; if(src == NULL || (mask == 0 && src->lights == NULL)) { RefIncr((Ref *)dst); return dst; } if(mask && !(mergeflags & APF_INPLACE)) dst = LmCopy(dst, NULL); dst->changed |= src->changed; dst->valid = (src->valid & mask) | (dst->valid & ~mask); dst->override = (src->override & mask) | (dst->override & ~mask); if(mask & LMF_LOCALVIEWER) dst->localviewer = src->localviewer; if(mask & LMF_AMBIENT) dst->ambient = src->ambient; if(mask & LMF_ATTENC) dst->attenconst = src->attenconst; if(mask & LMF_ATTENM) dst->attenmult = src->attenmult; if(mask & LMF_ATTEN2) dst->attenmult2 = src->attenmult2; /* LMF_REPLACELIGHTS: replace lights rather than merging with them */ if((mask & LMF_REPLACELIGHTS)) LmDeleteLights(dst); if(LM_ANY_LIGHTS(src)) LmCopyLights(src, dst); RefIncr((Ref *)dst); return dst; } LmLighting * LmCopy(LmLighting *from, LmLighting *to) { Ref r; if (from == NULL || from == to) return NULL; if(to == NULL) { to = OOGLNewE(LmLighting, "LmCopy LmLighting"); RefInit((Ref *)&r, LIGHTINGMAGIC); } else { r = *(Ref *)to; } *to = *from; RefInit((Ref *)to, LIGHTINGMAGIC); to->Private = 0; memset(&to->lights, 0, AP_MAXLIGHTS*sizeof(LtLight *)); LmCopyLights(from, to); *(Ref *)to = r; /* Restore ref header */ return to; } void LmCopyLights(LmLighting *from, LmLighting *to) { int i; LtLight **lp, *tmp; LM_FOR_ALL_LIGHTS(from, i, lp) { LmAddLight(to, tmp = LtCopy(*lp, NULL)); LtDelete(tmp); } } void LmDefault( LmLighting *l ) { RefInit((Ref *)l, LIGHTINGMAGIC); l->valid = l->override = 0; l->ambient = black; l->localviewer = 1; l->attenconst = 1.0; l->attenmult = 0.0; l->attenmult2 = 0.0; l->changed = 1; l->Private = 0; memset(&l->lights, 0, AP_MAXLIGHTS*sizeof(LtLight *)); } /* * Delete a list of lights and all the lights in the list. */ void LmDelete(LmLighting *lm) { if(lm == NULL || RefDecr((Ref *)lm) > 0) return; if(lm->magic != LIGHTINGMAGIC) { OOGLError(1, "LmDelete(%x) of non-LmLighting: magic %x != %x", lm, lm->magic, LIGHTINGMAGIC); return; } LmDeleteLights(lm); lm->magic = LIGHTINGMAGIC ^ 0x80000000; OOGLFree(lm); } void LmRemoveLight(LmLighting *lm, LtLight *lt) { LtLight **lp; LtLight **found = NULL, **last = NULL; int i; LM_FOR_ALL_LIGHTS(lm, i,lp) { if(*lp == lt) found = lp; last = lp; } if(found != NULL) { *found = *last; *last = NULL; } } void LmAddLight(LmLighting *lm, LtLight *lt) { LtLight **lp; int i; if(lt == NULL) return; LM_FOR_ALL_LIGHTS(lm, i,lp) { if(*lp == lt) { OOGLWarn("add dup light?"); break; } } if(i < AP_MAXLIGHTS) { *lp = lt; RefIncr((Ref *)lt); } else { OOGLError(1, "Can't have more than AP_MAXLIGHTS (%d) lights.", AP_MAXLIGHTS); } } void LmDeleteLights(LmLighting *lm) { LtLight **lp; int i; LM_FOR_ALL_LIGHTS(lm, i,lp) { LtDelete(*lp); *lp = NULL; } } #ifndef max # define max(a, b) ((a) > (b) ?( a) : (b)) #endif static inline void norm(Color *color, float *coeff) { *coeff = max(color->r, color->g); *coeff = max(color->b, *coeff); if( *coeff != 0.0 ) { color->r /= *coeff; color->g /= *coeff; color->b /= *coeff; } } /* * Load Lighting from file. * Syntax: * < "filename_containing_material" [or] * { keyword value keyword value ... } * * Each keyword may be prefixed by "*", indicating that its value should * override corresponding settings in child objects. [By default, * children's appearance values supercede those of their parents.] * */ LmLighting * LmLoad(LmLighting *lgt, char *fname) { IOBFILE *f = iobfopen(fname, "r"); if(f == NULL) return NULL; lgt = LmFLoad(lgt, f, fname); iobfclose(f); return lgt; } LmLighting * LmFLoad(LmLighting *lgt, IOBFILE *f, char *fname) { char *w; int i; float v[3]; int brack = 0; int over, not; static char *lkeys[] = { "ambient", "localviewer", "attenconst", "attenmult", "attenmult2", "light", "replacelights" }; static char largs[] = { 3, 1, 1, 1, 1, 0, 0}; static unsigned short lbits[] = { LMF_AMBIENT, LMF_LOCALVIEWER, LMF_ATTENC, LMF_ATTENM, LMF_ATTEN2, 0, LMF_REPLACELIGHTS }; int got; LmLighting l; if(lgt == NULL) lgt = LmCreate(LM_END); over = not = 0; for(;;) { switch(iobfnextc(f, 0)) { case '<': iobfgetc(f); if(LmLoad(&l, iobftoken(f, 0)) == NULL) return NULL; if(!brack) goto done; break; case '{': brack++; iobfgetc(f); break; case '}': if(brack) { iobfgetc(f); } goto done; case '*': over = 1; iobfgetc(f); break; /* 'override' prefix */ case '!': not = 1; iobfgetc(f); break; default: w = iobftoken(f, 0); if(w == NULL) return lgt; for(i = sizeof(lkeys)/sizeof(lkeys[0]); --i >= 0; ) if(!strcmp(w, lkeys[i])) break; if( i < 0) { OOGLError(1, "LmFLoad: %s: unknown lighting keyword %s",fname,w); return NULL; } else if( !not && (got=iobfgetnf(f, largs[i], v, 0)) != largs[i] ) { OOGLError(1, "LmFLoad: %s: \"%s\" expects %d values, got %d", fname, w, largs[i], got); return NULL; } if(not) { if(!over) lgt->valid &= ~lbits[i]; lgt->override &= ~lbits[i]; } else { lgt->valid |= lbits[i]; if(over) lgt->override |= lbits[i]; switch(i) { case 0: memcpy(&lgt->ambient, v, sizeof(Color)); break; case 1: lgt->localviewer = v[0]; break; case 2: lgt->attenconst = v[0]; break; case 3: lgt->attenmult = v[0]; break; case 4: lgt->attenmult2 = v[0]; break; case 5: LmAddLight( lgt, LtFLoad( NULL, f, fname ) ); break; } } over = not = 0; } } done: return lgt; } /* * Save a light description in a file. */ void LmFSave(LmLighting *li, FILE *f, char *fname, Pool *p) { LtLight **lp; int i; (void)fname; PoolFPrint(p, f, "ambient %.8g %.8g %.8g\n", li->ambient.r, li->ambient.g, li->ambient.b); PoolFPrint(p, f, "localviewer %d\n", li->localviewer); PoolFPrint(p, f, "attenconst %.8g\n", li->attenconst); PoolFPrint(p, f, "attenmult %.8g\n", li->attenmult); if(li->valid & LMF_ATTEN2) { PoolFPrint(p, f,"attenmult2 %.8g\n", li->attenmult2); } if (li->valid & LMF_REPLACELIGHTS) { PoolFPrint(p, f, "replacelights\n"); } LM_FOR_ALL_LIGHTS(li, i,lp) { PoolFPrint(p, f, "light {\n"); PoolIncLevel(p, 1); LtFSave( *lp, f, p ); PoolIncLevel(p, -1); PoolFPrint(p, f, "}\n"); } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/shade/image.c0000644000175000017500000014235112310110201014123 00000000000000/* Copyright (C) 2007-2008 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include #include #include /*#undef HAVE_LIBZ*/ #ifndef HAVE_LIBZ # define HAVE_LIBZ 0 #endif #if HAVE_LIBZ # include #endif #include "appearance.h" #include "handleP.h" #ifndef max # define max(a, b) ((a) >= (b) ? (a) : (b)) #endif #ifndef min # define min(a, b) ((a) <= (b) ? (a) : (b)) #endif HandleOps ImageOps = { "img", (int ((*)(Pool *p, Handle **hp, Ref **rp)))ImgStreamIn, (int ((*)(Pool *p, Handle *h, Ref *r)))ImgStreamOut, (void ((*)(Ref *rp)))ImgDelete, NULL, NULL, }; struct imgheader { int xsize, ysize, channels, maxval; enum _format { IMGF_BYTE, IMGF_BIT, IMGF_ASCII, IMGF_SGIRLE, /* SGI RLE image */ IMGF_SGIRAW /* for (z) for (y=bottom to top) { data } */ } format; int *rleoff; /* For IMGF_SGIRLE: offsets[z][y], then lengths[z][y] */ char *rledata; /* For IMGF_SGIRLE: all data * (don't fseek so we can read from pipe) */ }; static bool readimage(Image *img, unsigned *chmask, char *filter, char *imgfname, char *imgdata, int datalen); static bool parseheader(Image *img, IOBFILE *imgf, unsigned *chmask, const char *type, struct imgheader *header); static bool readdata(Image *img, IOBFILE *imgf, unsigned chmask, struct imgheader *header); static int run_filter(const char *filter, int fdin, bool wronly, int *cpidp); static int data_pipe(const char *data, int datalen, int *cpidp); #if HAVE_LIBZ static int zlib_data_pipe(const char *data, int datalen, int *cpidp); static int gzip_data_pipe(const char *data, int datalen, int *cpidp); static int gv_compress2(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level); #endif Image *ImgDefault(Image *img) { memset((char *)img, 0, sizeof(*img)); RefInit((Ref *)img, IMGMAGIC); img->maxval = 255; return img; } Image *_ImgSet(Image *img, int attr1, va_list *alist) { int attr, val; bool newimg = false; char *chanfile, *filter; unsigned chmask; void *chandata; int chansize = 0; #undef NEXT #define NEXT(type) va_arg(*alist, type) if (img == NULL) { /* * New Image created here. */ img = OOGLNewE(Image, "ImgCreate Image"); ImgDefault(img); newimg = true; } for (attr = attr1; attr != IMG_END; attr = NEXT(int)) { switch (attr) { /* parse argument list */ case IMG_WIDTH: val = NEXT(int); if (val != img->width && img->data != NULL) { OOGLFree(img->data); img->data = NULL; } img->width = val; break; case IMG_HEIGHT: val = NEXT(int); if (val != img->height && img->data != NULL) { OOGLFree(img->data); img->data = NULL; } img->height = val; break; case IMG_CHANNELS: val = NEXT(int); if (val != img->channels && img->data != NULL) { OOGLFree(img->data); img->data = NULL; } img->channels = val; break; case IMG_MAXVAL: val = NEXT(int); if (val != img->maxval && img->data != NULL) { OOGLFree(img->data); img->data = NULL; } img->maxval = val; if (img->maxval != 255) { OOGLError(1, "ImgSet: " "maxval is tied to 255, nothing else is implemented"); goto nope; } break; case IMG_DATA: if (img->data) { OOGLFree(img->data); } img->data = NEXT(char *); break; case IMG_DATA_CHAN_FILE: case IMG_DATA_CHAN_DATA: chmask = NEXT(unsigned); filter = NEXT(char *); /* can be NULL */ if (attr == IMG_DATA_CHAN_FILE) { chanfile = NEXT(char *); chandata = NULL; } else { chandata = NEXT(void *); chansize = NEXT(int); chanfile = NULL; } if (chmask == IMGF_ALPHA) { if (img->channels == 0) { OOGLError(1, "ImgSet(): data: " "don't know which channel is the alpha mask"); goto nope; } switch (img->channels) { case 1: case 2: chmask = 0x2; break; case 3: case 4: chmask = 0x8; break; } } else if (chmask == IMGF_AUTO) { chmask = 0; } /* try to suck it in, readimage() will examine filter * and the suffix of imgfname and the magic bytes at * the beginning of the image data. An explicitly * specified filter will take precedence. */ if (!readimage(img, &chmask, filter, chanfile, chandata, chansize)) { goto nope; } break; default: OOGLError(1, "ImgSet: unknown attribute %d", attr); break; } } return img; nope: if (newimg) { ImgDelete(img); } return NULL; } Image *ImgCreate(int a1, ...) { va_list alist; Image *img; va_start(alist, a1); img = _ImgSet(NULL, a1, &alist); va_end(alist); return img; } void ImgDelete(Image *img) { if (img == NULL) { return; } if (img->magic != IMGMAGIC) { OOGLWarn("Internal warning: ImgDelete on non-Imag %x (%x != %x)", img, img->magic, IMGMAGIC); return; } if (RefDecr((Ref *)img) > 0) { return; } if (img->data) { OOGLFree(img->data); } OOGLFree(img); } Image *ImgSet(Image *img, int a1, ...) { va_list alist; va_start(alist, a1); img = _ImgSet(img, a1, &alist); va_end(alist); return img; } /* see the comments in src/lib/gprim/geom/geomstream.c */ int ImgStreamIn(Pool *p, Handle **hp, Image **imgp) { Handle *h = NULL; Handle *hname = NULL; Image *img = NULL; char *w, *raww = NULL; int c, i, val; int moredata; int brack = 0; IOBFILE *inf; char *fname, *imgfname = NULL, *filter, *imgdata = NULL; char filterpath[PATH_MAX]; long datasize = 0; unsigned long chmask; bool have_chdata; static const struct imgkw { const char *word; int aval; int nargs; int min; int max; } imgkw[] = { { "width", IMG_WIDTH, 1, 1, 0 }, { "height", IMG_HEIGHT, 1, 1, 0 }, { "channels", IMG_CHANNELS, 1, 1, 4 }, { "maxval", IMG_MAXVAL, 1, 255, 255 }, { "data", IMG_DATA, -1, 1, 0 } /* data chmask filter DATA */ }; const struct imgkw *kw; static const struct chflkw { const char *word; int value; } chflkw[] = { { "LUMINANCE", IMGF_LUMINANCE }, { "LUMINANCE_ALPHA", IMGF_LUMINANCE_ALPHA }, { "RGB", IMGF_RGB }, { "RGBA", IMGF_RGBA }, { "ALPHA", IMGF_ALPHA }, { "AUTO", IMGF_AUTO } }; const struct chflkw *chfl; #undef N_ITEMS #define N_ITEMS(array) (sizeof(array)/sizeof(*(array))) if (p == NULL || (inf = PoolInputFile(p)) == NULL) { return 0; } fname = PoolName(p); have_chdata = false; do { switch(c = iobfnextc(inf, 0)) { case '{': brack++; iobfgetc(inf); break; case '}': if (brack--) iobfgetc(inf); break; case '<': case ':': case '@': iobfgetc(inf); w = iobfdelimtok("{}()", inf, 0); if (c == '<' && (h = HandleByName(w, &ImageOps)) == NULL && w[0] != '/') { w = findfile(PoolName(p), raww = w); if (w == NULL) { OOGLSyntax(inf, "Reading image from \"%s\": " "can't find file \"%s\"", PoolName(p), raww); return false; } } else if (h) { /* HandleByName() increases the ref. count s.t. the * caller of HandleByName() owns the returned handle. */ HandleDelete(h); } h = HandleReferringTo(c, w, &ImageOps, NULL); if (h) { img = (Image *)HandleObject(h); /* Increment the ref. count. This way we can call * HandleDelete() and ImgDelete() independently. */ REFGET(Image, img); } break; default: w = iobfdelimtok("{}()", inf, 0); if (w == NULL) { break; } if (strcmp(w, "define") == 0) { hname = HandleCreateGlobal(iobftoken(inf, 0), &ImageOps); break; } for (i = N_ITEMS(imgkw), kw = imgkw; --i >= 0; kw++) { if (!strcmp(kw->word, w)) { break; } } if (i < 0) { OOGLSyntax(inf, "%s: unknown image keyword %s", fname, w); ImgDelete(img); return false; } if (img == NULL) { img = ImgCreate(IMG_END); } if (kw->nargs == 1) { int val, n; if (have_chdata) { OOGLSyntax(inf, "%s: %s must be specified before defining the image data", fname, w); ImgDelete(img); return false; } n = iobfgetni(inf, kw->nargs, &val, 0); if (n != kw->nargs) { OOGLSyntax(inf, "%s: %s expected %d numeric values", fname, w, kw->nargs); ImgDelete(img); return false; } if (kw->min <= kw->max && (val < kw->min || val > kw->max)) { OOGLSyntax(inf, "%s: %s value %d out of range (min %d, max %d", fname, w, val, kw->min, kw->max); } ImgSet(img, kw->aval, val, IMG_END); } else { /* data CHANNELMASK [FILTER] [{] < FILENAME [}] * * or * * data CHANNELMASK [FILTER] DATASIZE [{]\nDATA ... [}] * * FILTER may be a program or one of the know types, i.e. one * of raw, png, tif[f], jpeg, gif, gzip, bzip2, compress. If * FILTER is a program, then it must convert FILENAME to pnm * and the output must be presented at stdout. If no type is * specified, then the data must bin SGIRAW or SGIRLE or PNM * format. These formats are autodetected. If no SGIRAW, * SGIRLE or PNM format could be detected, then "raw" is * assumed. * * If the FILENAME has a known suffix (Z, z, gz, bz2, * raw, tiff, tif, png, gif) then the input filter is * deduced from the suffix. * * DATASIZE _must_ be specified for embedded images and gives * the size of the embedded data. */ w = iobfdelimtok("{}()", inf, 0); if (w == NULL) { OOGLSyntax(inf, "%s: data: expected the channel mask", fname); ImgDelete(img); return false; } for (i = N_ITEMS(chflkw), chfl = chflkw; --i >= 0; chfl++) { if (!strcmp(chfl->word, w)) { chmask = chfl->value; break; } } if (i < 0) { /* should be a numerical value */ chmask = strtol(w, NULL, 0); if (datasize == LONG_MIN || datasize == LONG_MAX) { OOGLSyntax(inf, "%s: data: bogus channel mask definition: \"%s\"", fname, w); ImgDelete(img); return false; } chmask &= 0xf; } imgfname = NULL; filter = NULL; moredata = 0; datasize = -1; do { switch(c = iobfnextc(inf, 1)) { case '{': /* allow brackets around data and file-name, i.e. * data MASK [FILTER] { < FILENAME } * or * data MASK [FILTER] DATASIZE {\n * data bytes ... * } */ brack++; iobfgetc(inf); moredata = 1; break; case '<': /* read from a file, find and open it */ iobfgetc(inf); /* consume '<' */ w = iobfdelimtok("{}()", inf, 0); imgfname = findfile(fname, w); if (imgfname == NULL) { OOGLSyntax(inf, "Warning: reading \"%s\": can't find file \"%s\"", fname, raww); ImgDelete(img); return false; } moredata = 0; break; case '\n': /* read embedded data from _this_ file */ if (datasize < 0) { /* this means that the "filter" token is actually the * size of the data section */ if (filter == NULL) { OOGLSyntax(inf, "%s: the size of the embedded image data is missing", fname); ImgDelete(img); return false; } datasize = strtol(filter, NULL, 0); if (datasize == LONG_MIN || datasize == LONG_MAX) { OOGLSyntax(inf, "%s: bogus size definition: \"%s\"", fname, filter); ImgDelete(img); return false; } filter = NULL; } iobfgetc(inf); /* consume '\n', image data follows */ /* read all the stuff in, we do it here to maintain the * file position */ imgdata = OOGLNewNE(char, datasize, "embedded image data"); if (iobfread(imgdata, datasize, 1, inf) <= 0) { OOGLError(0, "%s: can't read embedded image data", fname); OOGLFree(imgdata); ImgDelete(img); return false; } moredata = 0; break; default: /* assume that it is a filter definition _or_ the data-size. */ if (filter) { /* must be the data-size */ if (iobfgetni(inf, 1, &val, 0) != 1) { OOGLSyntax(inf, "%s: expected the data size", fname); ImgDelete(img); return false; } datasize = val; } else { /* maybe a filter of the data size, decide later */ filter = iobfdelimtok("{}()", inf, 0); if (filter == NULL) { OOGLSyntax(inf, "%s: expected an input filter or " "the size of the data-section", fname); ImgDelete(img); return false; } /* we leave it to readimage() to determine * whether this is a valid filter program, or * prefix, file type spec. * * We have to save the filter because thiobfdelimtok() * would otherwise overwrite it with the next token. */ strncpy(filterpath, filter, PATH_MAX); filterpath[PATH_MAX-1] = '\0'; filter = filterpath; moredata = 1; } break; } } while (moredata); if ((imgfname ? ImgSet(img, IMG_DATA_CHAN_FILE, chmask, filter, imgfname, IMG_END) : ImgSet(img, IMG_DATA_CHAN_DATA, chmask, filter, imgdata, (int)datasize, IMG_END)) == NULL) { #if 1 OOGLSyntax(inf, "%s: unable to read data for channelmask 0x%x, " "continuing anyway", fname, (int)chmask); #else ImgDelete(img); if (imgdata) { /* free buffer for embedded data */ OOGLFree(imgdata); } return false; #endif } if (imgdata) { /* free buffer for embedded data */ OOGLFree(imgdata); imgdata = NULL; } else { imgfname = NULL; } have_chdata = true; } break; } } while (brack); if (hname != NULL) { if (img) { HandleSetObject(hname, (Ref *)img); } if (h) { /* HandleReferringTo() has passed the ownership to us, so delete * h because we do not need it anymore. */ HandleDelete(h); } h = hname; } /* Pass the ownership of h and img to the caller if requested */ if (hp != NULL) { /* pass on ownership of the handle h to the caller of this function */ if (*hp != NULL) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } else if (h) { /* Otherwise delete h because we are its owner. Note that * HandleReferringTo() has passed the ownership of h to us; * explicitly defined handles (hdefine and define constructs) * will not be deleted by this call. */ HandleDelete(h); } /* same logic as for hp */ if (imgp != NULL) { if (*imgp != NULL) { ImgDelete(*imgp); } *imgp = img; } else if(img) { ImgDelete(img); } return (h != NULL || img != NULL); } static void ign_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) { size_t result; result = fwrite(ptr, size, nmemb, stream); (void)result; } /* We do not record the file-name, so we can only output raw image * data. What format to choose? Highly compressed would be best; we * choose "gzip --best" or "bzip --best" if available; the * alpha-channel is output as pgm and the image data as RGB pnm * (channels == 4) or also as pgm (channels == 2). */ int ImgStreamOut(Pool *p, Handle *h, Image *img) { FILE *f = PoolOutputFile(p); char *obuf; int olen; if (f == NULL || (img == NULL && (h == NULL || (img = (Image *)HandleObject(h)) == NULL))) { return false; } fprintf(f, "image {\n"); PoolIncLevel(p, 1); if (PoolStreamOutHandle(p, h, img != NULL)) { PoolFPrint(p, f, "width %d\n", img->width); PoolFPrint(p, f, "height %d\n", img->height); PoolFPrint(p, f, "channels %d\n", img->channels); PoolFPrint(p, f, "maxval %d\n", img->maxval); /* For convenience we dump the stuff in pnm/pgm format with separate * alpha channel. */ switch (img->channels) { case 2: /* two greymaps, luminance and alpha */ #if 1 olen = ImgWritePAM(img, 0x3, HAVE_LIBZ, &obuf); PoolFPrint(p, f, "data LUMINANCE_ALPHA %s%d {\n", HAVE_LIBZ ? "gzip " : "", olen); ign_fwrite(obuf, olen, 1, f); fprintf(f, "\n"); PoolFPrint(p, f, "}\n"); OOGLFree(obuf); break; #else olen = ImgWritePGM(img, 1, HAVE_LIBZ, obuf); PoolFPrint(p, f, "data ALPHA %s%d {\n", HAVE_LIBZ ? "gzip " : "", olen); ign_fwrite(obuf, olen, 1, f); fprintf(f, "\n"); PoolFPrint(p, f, "}\n"); OOGLFree(obuf); /* fall through to luminance only */ #endif case 1: /* greymap, luminance */ olen = ImgWritePGM(img, 0, HAVE_LIBZ, &obuf); PoolFPrint(p, f, "data LUMINANCE %s%d {\n", HAVE_LIBZ ? "gzip " : "", olen); ign_fwrite(obuf, olen, 1, f); fprintf(f, "\n"); PoolFPrint(p, f, "}\n"); OOGLFree(obuf); break; case 4: /* RGBA */ #if 1 olen = ImgWritePAM(img, 0xf, HAVE_LIBZ, &obuf); PoolFPrint(p, f, "data RGBA %s%d {\n", HAVE_LIBZ ? "gzip " : "", olen); ign_fwrite(obuf, olen, 1, f); fprintf(f, "\n"); PoolFPrint(p, f, "}\n"); OOGLFree(obuf); break; #else olen = ImgWritePGM(img, 3, HAVE_LIBZ, &obuf); PoolFPrint(p, f, "data ALPHA %s%d {\n", HAVE_LIBZ ? "gzip " : "", olen); ign_fwrite(obuf, olen, 1, f); fprintf(f, "\n"); PoolFPrint(p, f, "}\n"); OOGLFree(obuf); /* fall through to RGB */ #endif case 3: /* RGB only */ olen = ImgWritePNM(img, 0x07, HAVE_LIBZ, &obuf); PoolFPrint(p, f, "data RGB %s%d {\n", HAVE_LIBZ ? "gzip " : "", olen); ign_fwrite(obuf, olen, 1, f); fprintf(f, "\n"); PoolFPrint(p, f, "}\n"); OOGLFree(obuf); break; } } PoolIncLevel(p, -1); PoolFPrint(p, f, "}\n"); return !ferror(f); } Image *ImgFSave(Image *img, FILE *outf, char *fname) { Pool *p; int ok; p = PoolStreamTemp(fname, NULL, outf, 1, NULL); PoolSetOType(p, PO_DATA); PoolIncLevel(p, 1); ok = ImgStreamOut(p, NULL, img); PoolDelete(p); return ok ? img : NULL; } Image *ImgFLoad(IOBFILE *inf, char *fname) { Pool *p; Image *img = NULL; p = PoolStreamTemp(fname, inf, NULL, 0, &ImageOps); ImgStreamIn(p, NULL, &img); PoolDelete(p); return img; } /* Compress the contents of *buffer, free *buffer and return the * compressed buffer in a newly allocated chunk pointed to by * *buffer. Return the amount of compressed data. */ static inline int maybe_compress_buffer(char **buffer, int n_bytes) { #if HAVE_LIBZ # if !HAVE_COMPRESSBOUND # define compressBound(slen) ((slen) + ((slen) >> 12) + ((slen) >> 14) + 11) # endif char *bufptr; unsigned long c_n_bytes; /* we do it inefficient and quick and dirty: we simply call the * compress() function and compress the entire buffer */ bufptr = *buffer; c_n_bytes = compressBound(n_bytes); *buffer = OOGLNewNE(char, c_n_bytes, "compressed buffer"); if (gv_compress2((Bytef *)*buffer, &c_n_bytes, (Bytef *)bufptr, n_bytes, 9) != Z_OK) { OOGLFree(*buffer); *buffer = bufptr; } else { OOGLFree(bufptr); n_bytes = c_n_bytes; } #endif return n_bytes; } #define PNM_HEADER_LEN (2 + 1 + 10 + 1 + 10 + 1 + 5 + 1) /* P5 1000000000 1000000000 65535\n */ /* Pack one channel of the image data into an PGM image and write that * data to *buffer. *buffer is allocated in this function, its length * is returned. If channel >= img->channel, then the result will be an * all-black PGM image. Optionally compress the image. */ int ImgWritePGM(Image *img, int channel, bool compressed, char **buffer) { int row, col, stride, rowlen, depth; unsigned long n_bytes, h_len; char *imgptr, *bufptr; depth = (img->maxval > 255) + 1; rowlen = depth * img->width; n_bytes = rowlen * img->height + PNM_HEADER_LEN; bufptr = *buffer = OOGLNewNE(char, n_bytes, "PGM buffer"); bufptr += h_len = sprintf(*buffer, "P5 %d %d %d\n", img->width, img->height, img->maxval); n_bytes -= PNM_HEADER_LEN - h_len; if (channel >= img->channels) { memset(*buffer, 0, n_bytes); } else { stride = img->channels * depth; for (row = img->height-1; row >= 0; row--) { imgptr = img->data + channel + rowlen * img->channels * row; for (col = 0; col < img->width; col++) { *bufptr++ = *imgptr; if (depth == 2) { *bufptr++ = *(imgptr+1); } imgptr += stride; } } } return compressed ? maybe_compress_buffer(buffer, n_bytes) : (int)n_bytes; } /* Pack up to 3 channels of the image data into an PNM image and write * that data to *buffer. *buffer is allocated in this function, its * length is returned. Missing channels are filled with 0's. * * Optionally compress the image. */ int ImgWritePNM(Image *img, unsigned chmask, bool compressed, char **buffer) { int row, col, stride, depth, rowlen; unsigned long n_bytes, h_len; int channels[3], i, j; char *imgptr, *bufptr; depth = (img->maxval > 255) + 1; rowlen = 3 * depth * img->width; n_bytes = rowlen * img->height + PNM_HEADER_LEN; bufptr = *buffer = OOGLNewNE(char, n_bytes, "PNM buffer"); channels[0] = channels[1] = channels[2] = -1; for (i = j = 0; i < img->channels && j < 3 && chmask; i++, chmask >>= 1) { if (chmask & 1) { channels[j++] = i; } } bufptr += h_len = sprintf(*buffer, "P6 %d %d %d\n", img->width, img->height, img->maxval); n_bytes -= PNM_HEADER_LEN - h_len; imgptr = img->data; stride = img->channels * depth; for (row = img->height-1; row >= 0; row--) { imgptr = img->data + stride * img->width * row; for (col = 0; col < img->width; col++) { for (j = 0; j < 3; j++) { if (channels[j] >= 0) { for (i = 0; i < depth; i++) { *bufptr++ = *(imgptr + channels[j] + i); } } else { for (i = 0; i < depth; i++) { *bufptr++ = '\0'; } } } imgptr += stride; } } return compressed ? maybe_compress_buffer(buffer, n_bytes) : (int)n_bytes; } /* Pack any number of channels into a PAM image. Optionally compress * the image. Excess bits set in chmask are ignored. The destination * image will have min(img->channels, #chmask bits) channels (i.e. at * most 4). * * The destination image is written into memory, allocated in * *buffer. The amount of data in *buffer is returned (size after * compression). */ /* worst case header length for our case */ #define PAM_HEADER_LEN \ sizeof("P7\n" \ "WIDTH 1000000000\n" \ "HEIGHT 1000000000\n" \ "DEPTH 4\n" \ "MAXVAL 65535\n" \ "ENDHDR\n") int ImgWritePAM(Image *img, unsigned chmask, bool compressed, char **buffer) { int row, col, stride, depth, rowlen; unsigned long n_bytes, h_len; int channels[4], n_chan, i, j; char *imgptr, *bufptr; for (i = n_chan = 0; i < img->channels && chmask; i++, chmask >>= 1) { if (chmask & 1) { channels[n_chan++] = i; } } depth = (img->maxval > 255) + 1; /* #bytes for a single channel */ rowlen = n_chan * depth * img->width; n_bytes = rowlen * img->height + PAM_HEADER_LEN; bufptr = *buffer = OOGLNewNE(char, n_bytes, "PAM buffer"); bufptr += h_len = sprintf(*buffer, "P7\nWIDTH %d\nHEIGHT %d\nDEPTH %d\nMAXVAL %d\nENDHDR\n", img->width, img->height, n_chan, img->maxval); n_bytes -= PAM_HEADER_LEN - h_len; imgptr = img->data; stride = img->channels * depth; for (row = img->height-1; row >= 0; row--) { imgptr = img->data + stride * img->width * row; for (col = 0; col < img->width; col++) { for (j = 0; j < n_chan; j++) { for (i = 0; i < depth; i++) { *bufptr++ = *(imgptr + channels[j] + i); } } imgptr += stride; } } return compressed ? maybe_compress_buffer(buffer, n_bytes) : (int)n_bytes; } /* Dump an image to disk through the given filter. The filter must * read from stdin. The output of the filter is discarded, it is * assumed that "filter" writes the data to disk or to whatever * destination itself. * * This is mainly to support textures with the RenderMan MG backend. * * The image filter must understand PAM image data if chmask has 2 or * 4 bits set, otherwise it must understand PNM data. * * This routine is ugly: we simply convert the image data into a PGM, * PNM or PAM image in memory using ImgWritePGM/PNM/PAM() and then * pipe the resulting data with data_pipe() to the stdin of the * filter. * * E.g.: * * ImgWriteFilter(img, 0xf, "pamtotiff -lzw -truecolor > img.tiff"); * */ bool ImgWriteFilter(Image *img, unsigned chmask, const char *filter) { int n_chan, buflen = 0; unsigned mask; char *buf = NULL; int data_fd = -1; int data_pid = -1, filter_pid = -1; int result = false; void (*old_sigchld)(int); for (n_chan = 0, mask = chmask; mask; n_chan += mask & 1, mask >>= 1); n_chan = min(img->channels, n_chan); switch (n_chan) { case 1: buflen = ImgWritePGM(img, 0, false, &buf); break; case 3: buflen = ImgWritePNM(img, chmask, false, &buf); break; case 2: case 4: buflen = ImgWritePAM(img, chmask, false, &buf); break; } if ((data_fd = data_pipe(buf, buflen, &data_pid)) <= 0) { OOGLError(1, "ImgWriteFilter(): unable to generate data pipe"); goto out; } if (run_filter(filter, data_fd, true, &filter_pid) < 0) { OOGLError(1, "ImgWriteFilter(): unable to run image filter"); goto out; } result = true; out: if (buf) { OOGLFree(buf); } if (data_fd) { close(data_fd); } /* This could cause problems when an emodule exits during the short * period of SIGDFLT being in action ... */ signal(SIGCHLD, old_sigchld = signal(SIGCHLD, SIG_DFL)); if (old_sigchld != SIG_DFL && old_sigchld != SIG_IGN && old_sigchld != SIG_ERR) { /* ... send ourselves a SIGCHLD in this case. */ kill(getpid(), SIGCHLD); } else { /* possibly wait for the filter processes. */ while (filter_pid != -1 || data_pid != -1) { int cpid, status; cpid = wait(&status); if (cpid == filter_pid) { filter_pid = -1; } else if (cpid == data_pid) { data_pid = -1; } if (cpid == -1) { break; } } } return result; } /* reading of images */ struct filter { struct filter *next; const char *program; int (*builtin)(const char *data, int datalen, int *cpidp); const char *suffixes[10]; }; static struct filter decompressors[] = { { decompressors+1, "gzip -dc", gzip_data_pipe, { "z", "gz", "gzip", NULL } }, { decompressors+2, "bzip2 -dc", NULL, { "bz2", "bzip2", NULL } }, { NULL, NULL, zlib_data_pipe, { "zlib", NULL } }, }; static struct filter converters[] = { { converters+1, "tifftopnm", NULL, { "tiff", "tif", NULL } }, { converters+2, "pngtopnm", NULL, { "png", NULL } }, { converters+3, "giftoppm", NULL, { "gif", NULL } }, { NULL, "jpegtopnm", NULL, { "jpeg", "jpg", NULL } }, }; static bool readimage(Image *img, unsigned *chmask, char *filtertype, char *imgfname, char *imgdata, int datalen) { struct filter *filters[2] = { decompressors, converters }, *filter; int filterpids[2] = { -1, -1 }, datapid = -1; int filterfds[2] = { -1, -1 }; IOBFILE *imgf = NULL; int imgfd = -1; char *suffix, *explicit_filter = NULL; struct imgheader header; int i, j; bool result = true; void (*old_sigchld)(int); if (imgfname) { if ((imgfd = open(imgfname, O_RDONLY)) == -1) { OOGLError(0, "can't open file \"%s\"", imgfname); return false; } } else { /* What to do with imgdata? If we do not need a filter, then we * could just use the data-block we have already read in. If we * need a filter, then we fork a child that pipes imgdata to the * filter (in order to prevent deadlocks). */ } if (filtertype == NULL) { filtertype = imgfname ? strdup(imgfname) : NULL; } else { filtertype = strdup(filtertype); explicit_filter = filtertype; } for (j = 0; j < 2; j++) { if (filtertype == NULL || (suffix = strrchr(filtertype, '.')) == NULL) { suffix = filtertype; } else { suffix++; /* advance past '.' */ } if (suffix) { for (filter = filters[j]; filter != NULL; filter = filter->next) { for (i = 0; filter->suffixes[i] != NULL; i++) { if (strcasecmp(suffix, filter->suffixes[i]) == 0) { if (imgfd == -1 && filter->builtin != NULL) { /* tail-filter: maybe use builtin */ imgfd = filter->builtin(imgdata, datalen, &datapid); if (imgfd < 0) { result = false; goto out; } } else { if (imgfd == -1) { imgfd = data_pipe(imgdata, datalen, &datapid); if (imgfd < 0) { result = false; goto out; } } filterfds[j] = run_filter(filter->program, imgfd, false, &filterpids[j]); if (filterfds[j] < 0) { result = false; goto out; } } if (suffix != filtertype) { suffix--; } *suffix = '\0'; /* mark this part as handled */ break; } } if (filterfds[j] >= 0) { close(imgfd); imgfd = filterfds[j]; break; } } } } /* try to run any explicitly specified filter, but omit the dummy * filter "raw", which just means to interprete the stuff literally. */ if (filterfds[1] < 0 && explicit_filter && *explicit_filter != '\0' && strcasecmp(suffix, "raw") != 0) { /* explicitly specified filter */ filterfds[1] = run_filter(explicit_filter, imgfd, false, &filterpids[1]); if (filterfds[1] < 0) { result = false; goto out; } else { close(imgfd); imgfd = filterfds[1]; } } /* at this point we assume that reading from imgfd will give us raw, * SGI or PNM data. We generate an IOBFILE, simply because we want * to be able to use those iobfgetni() etc. functions, and because * parseheader() might want to set a file-marker. */ if (imgfd == -1) { if ((imgf = iobfileopen(fmemopen(imgdata, datalen, "r"))) == NULL) { result = false; goto out; } } else { if ((imgf = iobfileopen(fdopen(imgfd, "r"))) == NULL) { result = false; goto out; } } if (filtertype == NULL || (suffix = strrchr(filtertype, '.')) == NULL) { suffix = filtertype; } else { suffix++; /* advance past '.' */ } if (!parseheader(img, imgf, chmask, suffix, &header) || !readdata(img, imgf, *chmask, &header)) { result = false; goto out; } out: free(filtertype); /* undo strdup() */ /* This could cause problems when an emodule exits during the short * period of SIGDFLT being in action ... */ signal(SIGCHLD, old_sigchld = signal(SIGCHLD, SIG_DFL)); if (old_sigchld != SIG_DFL && old_sigchld != SIG_IGN && old_sigchld != SIG_ERR) { /* ... send us a SIGCHLD in this case. */ kill(getpid(), SIGCHLD); } else { /* possibly wait for the filter processes. */ while (filterpids[0] != -1 || filterpids[1] != -1 || datapid != -1) { int cpid, status; cpid = wait(&status); for (j = 0; j < 2; j++) { if (cpid == filterpids[j]) { filterpids[j] = -1; } } if (cpid == datapid) { datapid = -1; } if (cpid == -1) { break; } } } if (imgf) { iobfclose(imgf); } return result; } static bool parseheader(Image *img, IOBFILE *imgf, unsigned *chmask, const char *type, struct imgheader *header) { char scratch[1024]; char *w; int chmask_channels; unsigned mask; int i, c; char *msg = NULL; IOBFILE *f = NULL; header->rleoff = NULL; header->rledata = NULL; chmask_channels = 0; for (i = 0, mask = *chmask; i < 4 && mask; i++, mask >>= 1) { if (mask & 1) { chmask_channels++; } } if (type && strcasecmp(type, "raw") == 0) { if (*chmask == IMGF_AUTO) { OOGLError(1, "parseheader(): " "chmask == AUTO cannot work with raw image data"); return false; } header->format = IMGF_BYTE; header->xsize = img->width; header->ysize = img->height; header->maxval = img->maxval ? img->maxval : 255; header->channels = chmask_channels; } else { if (iobfsetmark(imgf) < 0) { OOGLError(1, "parseheader(): cannot set file mark"); return false; } c = iobfgetc(imgf); if (c == 0x01 && (c = iobfgetc(imgf)) == 0xDA) { /* SGI image file */ short shorts[3]; int storage = iobfgetc(imgf); int bpp = iobfgetc(imgf); if (bpp != 1) { msg = "%s: must have 8-bit image values"; goto nope; } iobfgetc(imgf); iobfgetc(imgf); /* Skip "dimension" */ iobfgetns(imgf, 3, shorts, 1); /* Read big-endian 16-bit values */ header->xsize = shorts[0]; header->ysize = shorts[1]; header->channels = shorts[2]; header->maxval = 255; if (iobfread(scratch, 4+4+492, 1, imgf) <= 0) { /* Skip min, max, pad data */ msg = "can't consume pad data"; goto nope; } header->format = (storage == 0x01) ? IMGF_SGIRLE : IMGF_SGIRAW; if (header->format == IMGF_SGIRLE) { /* Inhale offset&length table */ int n = header->ysize * header->channels; int max = 0; header->rleoff = OOGLNewNE(int, n*2, "IMGF_SGIRLE offsets"); msg = "%s: can't read RLE offsets"; if (iobfgetni(imgf, n*2, header->rleoff, 1) != n*2) { goto nope; } if (iobftell(imgf) < 0) { for (i = 0; i < n; i++) { if (max < header->rleoff[i]) { max = header->rleoff[i] + header->rleoff[i+n]; } } header->rledata = OOGLNewNE(char, max+1, "IMGF_SGIRLE data"); if (iobfread(header->rledata, max, 1, f) <= 0) { goto nope; } } } } else if (c == 'P' && (c = iobfgetc(imgf)) >= '1' && c <= '7') { if (c <= '6') { msg = "%s: Bad header on PNM image"; header->channels = (c == '3' || c == '6') ? 3 : 1; if (iobfgetni(imgf, 1, &header->xsize, 0) != 1) { goto nope; } if (iobfgetni(imgf, 1, &header->ysize, 0) != 1) { goto nope; } if (c != '1' && c != '4') { if (iobfgetni(imgf, 1, &header->maxval, 0) <= 0) { goto nope; } } else { header->maxval = 255; } switch(c) { case '1': case '2': case '3': header->format = IMGF_ASCII; break; case '4': header->format = IMGF_BIT; break; case '5': case '6': header->format = IMGF_BYTE; break; } while((c = iobfgetc(imgf)) != '\n' && c != EOF); } else { int need = 4; /* newer PAM format, possibly including an alpha channel */ msg = "%s: Bad header on PAM image"; while ((w = iobftoken(imgf, 0)) != NULL) { if (strncmp(w, "ENDHDR", 6) == 0) { break; } else if (strncmp(w, "HEIGHT", 6) == 0) { if (iobfgetni(imgf, 1, &header->ysize, 0) != 1) { goto nope; } --need; } else if (strncmp(w, "WIDTH", 5) == 0) { if (iobfgetni(imgf, 1, &header->xsize, 0) != 1) { goto nope; } --need; } else if (strncmp(w, "DEPTH", 5) == 0) { if (iobfgetni(imgf, 1, &header->channels, 0) != 1) { goto nope; } --need; } else if (strncmp(w, "MAXVAL", 5) == 0) { if (iobfgetni(imgf, 1, &header->maxval, 0) != 1) { goto nope; } if (header->maxval > 255) { msg = "%s: PAM herader: sorry, 16 bits per channel is unsupported"; goto nope; } --need; } else { /* just skip everything else, i.e. the tuple type. We * interprete 1 channel as luminance, 2 channels as * luminance & alpha, 3 channels as RGB and 4 channels as * RGBA, no matter what the header says. */ } } if (need != 0) { goto nope; /* did not find all required fields */ } header->format = IMGF_BYTE; /* will work */ } } else { /* assume raw pixel data */ iobfseekmark(imgf); iobfclearmark(imgf); if (*chmask == 0xf) { OOGLError(1, "parseheader(): " "chmask == AUTO cannot work with raw image data"); return false; } header->format = IMGF_BYTE; header->xsize = img->width; header->ysize = img->height; header->maxval = img->maxval ? img->maxval : 255; header->channels = chmask_channels; } } /* set image dimensions from the data if the user did not specify * them explicitly. */ if (img->width <= 0) { img->width = header->xsize; } if (img->height <= 0) { img->height = header->ysize; } /* Check for consistency. The number of channels can be different, * but the x- and y-size must match the width and height of the * image. */ if (img->width != header->xsize || img->height != header->ysize) { msg = "%s: specified image dimensions do not match the image data"; goto nope; } if (*chmask == 0) { /* determine channels from image header */ *chmask = (1 << header->channels) - 1; } else if (chmask_channels > header->channels && header->channels != 1) { /* We allow to fill several destination channels with a single * grey-level image, but otherwise the user has to provide enough * channels such that the number destination and source channels * match. */ OOGLError(1, "parseheader(): " "source image has only %d channels, needed are %d channels", header->channels, chmask_channels); msg = NULL; goto nope; } return true; nope: header->xsize = header->ysize = header->channels = 0; if (msg) { OOGLError(0, msg, "parseheader()"); } return false; } static bool readdata(Image *img, IOBFILE *imgf, unsigned chmask, struct imgheader *header) { int val, bit, i, j, k, depth; int chan_map[4] = { -1, -1, -1, -1 }; int n_chan, maxval, mask_channels; unsigned mask; int rowsize, stride, yup, rlebase; if (header->xsize <= 0 || header->ysize <= 0) { return false; } /* readdata() only works with maxval == 255; and nothing else is * used elsewhere in Geomview, so what. */ if (img->maxval != 255) { OOGLError(0, "readdata(): maxval != 255 is not supported yet"); return false; } maxval = 255; /* chan_map[j] == i: stuff the j-th source channel into the i-th * destination channel */ for (i = mask_channels = 0, mask = chmask; i < 4 && mask != 0; i++, mask >>= 1) { if (mask & 1) { chan_map[mask_channels++] = i; } } n_chan = max(img->channels, i); depth = ((maxval > 255) + 1); stride = n_chan * depth; rowsize = img->width * stride; if (img->data == NULL || img->channels < n_chan) { char *old_data = img->data; char *new_data; int old_stride; char *old_buf = old_data; img->data = new_data = OOGLNewNE(char, img->height * rowsize, "New image data"); old_stride = old_data ? img->channels : 0; for (i = 0; i < img->height * img->width; i++) { for (k = 0; k < old_stride; k++) { new_data[k] = old_data[k]; } /* Also initialize any new fields. This would only be needed for * channels not set in chmask, but the conditional would * probably eat up more time than the assignment. Reverting the * loop-order would also do no good because this is a pixmap: * iterating over the channels in the outer loop would be very * unfriendly for the cache. */ for (; k < stride-1; k++) { new_data[k] = '\0'; } new_data[stride-1] = (char)0xff; /* alpha channel defaults to 0xff */ old_data += old_stride; new_data += stride; } OOGLFree(old_buf); img->channels = n_chan; } switch (header->format) { case IMGF_SGIRAW: for (k = 0; k < min(mask_channels, header->channels); k++) { int dst_chan = chan_map[k]; for (i = 0; i < header->ysize; i++) { char *pix = img->data + dst_chan + rowsize * i; j = header->xsize; do { *pix = iobfgetc(imgf); pix += stride; } while(--j > 0); } if (iobfeof(imgf)) { goto nope; } } break; case IMGF_SGIRLE: yup = header->rleoff[0] < header->rleoff[1]; rlebase = 512 + header->channels*header->ysize*4; for (k = 0; k < min(mask_channels, header->channels); k++) { int dst_chan = chan_map[k]; for (i = 0; i < header->ysize; i++) { char *rle = NULL; int row = (yup ? i : header->ysize-i-1); char *pix = img->data + dst_chan + rowsize * row; int foff = header->rleoff[k*header->ysize + row]; /*int len = header->rleoff[(k+header->channels)*header->ysize + row];*/ int count; j = header->xsize; if (header->rledata) { rle = header->rledata + foff - rlebase; } else { iobfseek(imgf, foff, SEEK_SET); } while ((count = rle ? *rle++ : iobfgetc(imgf)) > 0) { if (count & 0x80) { count &= 0x7F; do { *pix = rle ? *rle++ : iobfgetc(imgf); pix += stride; } while(--count > 0); } else { int val = rle ? *rle++ : iobfgetc(imgf); do { *pix = val; pix += stride; } while(--count > 0); } } if (iobfeof(imgf)) { goto nope; } } } case IMGF_BYTE: case IMGF_BIT: case IMGF_ASCII: for (i = 0; i < header->ysize; i++) { char *row = img->data + rowsize * (header->ysize - i - 1); if (img->channels == header->channels && header->format == IMGF_BYTE && (chmask ^ ((1 << n_chan) - 1)) == 0 && header->maxval == 255){ /* all channels specified, so just copy the row in one run */ j = iobfread(row, header->channels, header->xsize, imgf); } else { char *pix = row; j = header->xsize; switch(header->format) { case IMGF_BYTE: do { for (k = 0; k < min(mask_channels, header->channels); k++) { pix[chan_map[k]] = iobfgetc(imgf) * 255 / header->maxval; } for (; k < header->channels; k++) { iobfgetc(imgf); /* consume any remaining channels */ } pix += stride; } while(--j); break; case IMGF_BIT: bit = 0; do { if (--bit < 0) { bit = 7; k = iobfgetc(imgf); } pix[chan_map[0]] = (k >> bit) & 1; pix += stride; } while(--j > 0); break; case IMGF_ASCII: do { for (k = 0; k < min(mask_channels, header->channels); k++) { iobfgetni(imgf, 1, &val, 0); pix[chan_map[k]] = val * 255 / header->maxval; } for (; k < header->channels; k++) { iobfgetni(imgf, 1, &val, 0); /* consume any remaining channels */ } pix += stride; } while(--j > 0); break; default: break; } } if (iobfeof(imgf)) break; } } if (header->channels == 1 && mask_channels > 1) { /* clone the data from chan_map[0] into all other channels; this * allows to generate an RGB(A) image from a single grey-map */ char *pix = img->data; for (i = 0; i < img->height * rowsize; i++) { for (j = 1; j < mask_channels; j++) { for (k = 0; k < depth; k++) { pix[chan_map[j]+k] = pix[chan_map[0]+k]; } } pix += stride; } } nope: if (header->rleoff) { OOGLFree(header->rleoff); } if (header->rledata) { OOGLFree(header->rledata); } header->rleoff = NULL; header->rledata = NULL; if (i < header->ysize) { OOGLError(0, "readdata(): Error reading image row %d of %d", i, header->ysize); return false; } return true; } /* Take a file-descriptor and connect it to the stdin of a filter * program, return a file descriptor which is connected to stdout of * the filter. * * If wronly == true, then also close the read-part of the pipe and * return 0 on success. */ static int run_filter(const char *filter, int fdin, bool wronly, int *cpidp) { int pfd[2]; int cpid; if (!wronly) { if (pipe(pfd) == -1) { OOGLError(1, "%s: pipe() failed", filter); return -1; } } if ((cpid = fork()) == -1) { OOGLError(1, "%s: fork() failed", filter); return -1; } if (cpid == 0) { /* child (filter process), close pdf[0] (the reader), connect fdin * to stdin, and pdf[1] to stdout. */ close(STDIN_FILENO); if (dup2(fdin, STDIN_FILENO) != STDIN_FILENO) { OOGLError(1, "%s: cannot reassign STDIN_FILENO"); _exit(EXIT_FAILURE); } close(fdin); if (wronly) { /* close stdout and duplicate it on stderr, otherwise a process * listening on our stdout might get confused. */ close(STDOUT_FILENO); if (dup2(STDERR_FILENO, STDOUT_FILENO) != STDOUT_FILENO) { OOGLError(1, "%s: cannot reassign STDOUT_FILENO"); _exit(EXIT_FAILURE); } } else { /* if !wronly close the read-end of the pipe and dup the write * end on STDOUT. */ close(pfd[0]); close(STDOUT_FILENO); if (dup2(pfd[1], STDOUT_FILENO) != STDOUT_FILENO) { OOGLError(1, "%s: cannot reassign STDOUT_FILENO"); _exit(EXIT_FAILURE); } close(pfd[1]); } /* now run the filter process, run it through sh 'cause `filter' * can be a command with arguments (and possibly file descriptor * redirections). */ execl("/bin/sh", "sh", "-c", filter, NULL); OOGLError(1, "execl(%s) failed.", filter); _exit(EXIT_FAILURE); } else { /* parent */ if (cpidp) { *cpidp = cpid; } if (!wronly) { close(pfd[1]); /* close the write end */ } } return wronly ? 0 : pfd[0]; /* return the read end */ } /* Fork a child which pipes data through a pipe to the parent. * * The return value is a pipe descriptor connected to the child's * output. */ static int data_pipe(const char *data, int datalen, int *cpidp) { int pfd[2]; int cpid; if (pipe(pfd) == -1) { OOGLError(1, "data_pipe(): pipe() failed"); return -1; } if ((cpid = fork()) == -1) { OOGLError(1, "data_pipe(): fork() failed"); return -1; } if (cpid == 0) { /* child */ /* NOTE: we use _exit() and not exit() to avoid calling atexit() * functions inherited from the parent. */ close(pfd[0]); /* close the reader */ if (write(pfd[1], data, datalen) != datalen) { OOGLError(1, "data_pipe(): write() failed"); _exit(EXIT_FAILURE); } if (close(pfd[1]) < 0) { OOGLError(1, "data_pipe(): close() failed"); _exit(EXIT_FAILURE); } _exit(EXIT_SUCCESS); } else { /* parent */ if (cpidp) { *cpidp = cpid; } close(pfd[1]); /* close the write end */ } return pfd[0]; /* return the read end */ } #if HAVE_LIBZ /* Same as data_pipe(), but also decompress the data, assuming it is * in zlib format. * * NOTE: we use _exit() and not exit() to avoid calling atexit() * functions inherited from the parent. */ static inline int __zlib_data_pipe(const char *data, int datalen, int *cpidp, bool gzip) { int pfd[2]; int cpid; if (pipe(pfd) == -1) { OOGLError(1, "data_pipe(): pipe() failed"); return -1; } if ((cpid = fork()) == -1) { OOGLError(1, "data_pipe(): fork() failed"); return -1; } if (cpid == 0) { /* child */ Bytef outBuffer[32*1024]; /* 32k, so what */ z_stream stream; int err, chunklen; close(pfd[0]); /* close the reader */ /* Initialize the zlib interface */ memset(&stream, 0, sizeof(stream)); /* safety */ stream.next_in = (Bytef*)data; stream.avail_in = (uInt)datalen; stream.next_out = outBuffer; stream.avail_out = (uInt)sizeof(outBuffer); err = inflateInit2(&stream, MAX_WBITS + (gzip ? 16 : 0)); if (err != Z_OK) { OOGLError(1, "zlib_data_pipe(): infalteInite2() failed"); _exit(EXIT_FAILURE); } do { err = inflate(&stream, false /* no flush */); if (err != Z_OK && err != Z_STREAM_END) { OOGLError(1, "zlib_data_pipe(): inflate() returned %d", err); _exit(EXIT_FAILURE); } chunklen = sizeof(outBuffer) - stream.avail_out; if (write(pfd[1], outBuffer, chunklen) != chunklen) { OOGLError(1, "zlib_data_pipe(): write() failed"); _exit(EXIT_FAILURE); } /* reset output buffer state to idle */ stream.next_out = outBuffer; stream.avail_out = (uInt)sizeof(outBuffer); } while (err != Z_STREAM_END); inflateEnd(&stream); /* cleanup (should be a no-op here) */ if (close(pfd[1]) < 0) { OOGLError(1, "zlib_data_pipe(): close() failed"); _exit(EXIT_FAILURE); } _exit(EXIT_SUCCESS); } else { /* parent */ if (cpidp) { *cpidp = cpid; } close(pfd[1]); /* close the write end */ } return pfd[0]; /* return the read end */ } static int zlib_data_pipe(const char *data, int datalen, int *cpidp) { return __zlib_data_pipe(data, datalen, cpidp, false); } static int gzip_data_pipe(const char *data, int datalen, int *cpidp) { return __zlib_data_pipe(data, datalen, cpidp, true); } /* Munge a little bit with zlib's interna. The magic bits are the * "+16" in the "..., MAX_WBITS+16, ..." argument: it instructs zlib * to emit a gzip header, instead of the simpler zlib header. Mmmh. */ static int gv_compress2(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level) { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; stream.opaque = (voidpf)0; err = deflateInit2(&stream, level, Z_DEFLATED, MAX_WBITS+16, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY); if (err != Z_OK) return err; err = deflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { deflateEnd(&stream); return err == Z_OK ? Z_BUF_ERROR : err; } *destLen = stream.total_out; err = deflateEnd(&stream); return err; } #endif /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/shade/Headers0000644000175000017500000000001512310110201014161 00000000000000appearance.h geomview-1.9.5/src/lib/window/0000755000175000017500000000000012310165602013211 500000000000000geomview-1.9.5/src/lib/window/Makefile.in0000644000175000017500000004603012310165555015210 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/window DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libwindow_la_LIBADD = am_libwindow_la_OBJECTS = window.lo winstream.lo libwindow_la_OBJECTS = $(am_libwindow_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libwindow_la_SOURCES) DIST_SOURCES = $(libwindow_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libwindow.la libwindow_la_SOURCES = \ window.c winstream.c \ window.h windowP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/window/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/window/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libwindow.la: $(libwindow_la_OBJECTS) $(libwindow_la_DEPENDENCIES) $(EXTRA_libwindow_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libwindow_la_OBJECTS) $(libwindow_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/window.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/winstream.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/window/Makefile.am0000644000175000017500000000024312310110201015145 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libwindow.la libwindow_la_SOURCES = \ window.c winstream.c \ window.h windowP.h geomview-1.9.5/src/lib/window/window.c0000644000175000017500000002003012310110201014560 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "ooglutil.h" #include "windowP.h" #define SETFLAG(flag, bit, value) \ if (value) flag |= bit; \ else flag &= ~bit #define GETFLAG(flag, bit) ( (flag & bit) != 0 ) static void WnSetName(WnWindow *win, char *name); WnWindow * WnCreate(int firstattr, ...) { WnWindow *win; va_list a_list; win = OOGLNewE ( WnWindow, "WnCreate WnWindow" ); RefInit((Ref *)win, WINDOWMAGIC); win->xsize = -1; win->ysize = -1; win->pixaspect = 1.0; win->win_name = NULL; win->changed = win->flag = WNF_ENLARGE | WNF_SHRINK; va_start(a_list, firstattr); win = _WnSet(win, firstattr, &a_list); va_end( a_list ); return win; } static void WnSetName(WnWindow *win, char *name) { if (win->win_name != NULL) free(win->win_name); win->win_name = name ? strdup(name) : NULL; } WnWindow * WnSet(WnWindow *win, int firstattr, ...) { va_list a_list; va_start(a_list, firstattr); win = _WnSet(win, firstattr, &a_list); va_end( a_list ); return win; } WnWindow * _WnSet(WnWindow *win, int firstattr, va_list *alist) { int attr; WnPosition *pos; int oldflag; char *name; char **ablock = NULL; #define NEXT(type) OOGL_VA_ARG(type,alist,ablock) /* Parse args */ for(attr = firstattr; attr != WN_END; attr = NEXT(int)) { switch (attr) { case WN_ABLOCK: ablock = NEXT(char **); break; case WN_XSIZE: win->xsize = NEXT(int); goto sized; case WN_YSIZE: win->ysize = NEXT(int); sized: win->flag |= WNF_HASSIZE; win->changed |= WNF_HASSIZE; break; case WN_CURPOS: pos = NEXT(WnPosition *); if(pos) { win->cur = *pos; win->aspect = (pos->ymax != pos->ymin) ? (double)(pos->xmax - pos->xmin) / (double)(pos->ymax - pos->ymin) : 1.0; win->xsize = win->cur.xmax - win->cur.xmin + 1; win->ysize = win->cur.ymax - win->cur.ymin + 1; win->flag |= WNF_HASCUR|WNF_HASSIZE; } else { win->flag &= ~WNF_HASCUR; } win->changed |= WNF_HASCUR; break; case WN_PREFPOS: pos = NEXT(WnPosition *); if(pos) { win->pref = *pos; win->flag |= WNF_HASPREF; } else win->flag &= ~WNF_HASPREF; win->changed |= WNF_HASPREF; break; case WN_VIEWPORT: pos = NEXT(WnPosition *); if(pos) { win->viewport = *pos; win->flag |= WNF_HASVP; } else { win->flag &= ~WNF_HASVP; } win->changed |= WNF_HASVP; break; case WN_NAME: name = NEXT(char *); WnSetName(win, name); if (name != NULL) win->flag |= WNF_HASNAME; else win->flag &= ~WNF_HASNAME; win->changed |= WNF_HASNAME; break; case WN_ENLARGE: oldflag = win->flag; SETFLAG(win->flag, WNF_ENLARGE, NEXT(int)); if (oldflag != win->flag) win->changed |= WNF_ENLARGE; break; case WN_SHRINK: oldflag = win->flag; SETFLAG(win->flag, WNF_SHRINK, NEXT(int)); if (oldflag != win->flag) win->changed |= WNF_SHRINK; break; case WN_NOBORDER: oldflag = win->flag; SETFLAG(win->flag, WNF_NOBORDER, NEXT(int)); if (oldflag != win->flag) win->changed |= WNF_NOBORDER; break; case WN_PIXELASPECT: win->pixaspect = NEXT(double); win->changed |= WNF_HASPIXASPECT; win->flag |= WNF_HASPIXASPECT; break; default: OOGLError (0, "_WnSet: Undefined attribute: %d", attr); return NULL; } } return(win); #undef NEXT } /* * Get a value. * Returns -1 for invalid attribute, 0 if no value set, 1 if valid value. */ int WnGet(WnWindow *win, int attr, void *valp) { int bit; #define WnPos WnPosition switch(attr) { case WN_XSIZE: case WN_YSIZE: bit = WNF_HASSIZE; if(win->flag & WNF_HASCUR) { win->xsize = win->cur.xmax - win->cur.xmin + 1; win->ysize = win->cur.ymax - win->cur.ymin + 1; bit = WNF_HASCUR; } else if((win->flag & (WNF_HASPREF|WNF_HASSIZE)) == WNF_HASPREF) { win->xsize = win->pref.xmax - win->pref.xmin + 1; win->ysize = win->pref.ymax - win->pref.ymin + 1; bit = WNF_HASPREF; } *(int *)valp = attr == WN_XSIZE ? win->xsize : win->ysize; break; case WN_CURPOS: if(!(win->flag & WNF_HASCUR)) { win->cur.xmin = win->cur.ymin = 0; win->cur.xmax = win->xsize + 1; win->cur.ymax = win->ysize + 1; } *(WnPos *)valp = win->cur; bit=WNF_HASCUR; break; case WN_PREFPOS: *(WnPos *)valp = win->pref; bit=WNF_HASPREF; break; case WN_VIEWPORT: if(!(win->flag & WNF_HASVP)) { /* Fill in viewport structure with something reasonable, if we can. */ win->viewport.xmin = 0; win->viewport.ymin = 0; if(win->flag & WNF_HASCUR) { win->viewport.xmax = win->cur.xmax - win->cur.xmin + 1; win->viewport.ymax = win->cur.ymax - win->cur.ymin + 1; } else if(win->flag & WNF_HASSIZE) { win->viewport.xmax = win->xsize; win->viewport.ymax = win->ysize; } else { win->viewport.xmax = win->pref.xmax - win->pref.xmin + 1; win->viewport.ymax = win->pref.ymax - win->pref.ymin + 1; } } *(WnPos *)valp = win->viewport; bit=WNF_HASVP; break; case WN_NAME: *(char**)valp = win->win_name; bit=WNF_HASNAME; break; case WN_ENLARGE: *(int*)valp = GETFLAG(win->flag,WNF_ENLARGE); return 1; case WN_SHRINK: *(int*)valp = GETFLAG(win->flag,WNF_SHRINK); return 1; case WN_NOBORDER: *(int*)valp = GETFLAG(win->flag,WNF_NOBORDER); return 1; case WN_ASPECT: *(float*)valp = win->aspect*win->pixaspect; return 1; case WN_PIXELASPECT: *(float*)valp = win->pixaspect; return 1; default: return -1; } return win->flag & bit ? 1 : 0; } void WnDelete(WnWindow *win) { if(win == NULL) return; if(win->magic != WINDOWMAGIC) { OOGLWarn("Internal warning: WnDelete on non-WnWindow %x (%x != %x)", win, win->magic, WINDOWMAGIC); return; } if(RefDecr((Ref *)win) > 0) return; win->magic ^= 0x80000000; OOGLFree(win); } WnWindow * WnCopy(WnWindow *win) { WnWindow *nw = WnCreate(WN_END); if(win) { *nw = *win; RefInit((Ref *)nw, WINDOWMAGIC); /* * This code assumes there are no (other) pointers in a WnWindow, * i.e. a bitwise copy is enough. */ if(nw->win_name) nw->win_name = strdup(nw->win_name); } return nw; } WnWindow * WnMerge(WnWindow *src, WnWindow *dst) { int chg; if(src == NULL) return dst; if(dst == NULL) return NULL; chg = src->changed; dst->flag = (dst->flag & ~chg) | (src->flag & chg); dst->changed |= chg; if(chg & WNF_HASPREF) dst->pref = src->pref; if(chg & WNF_HASCUR) dst->cur = src->cur, dst->aspect = src->aspect; if(chg & WNF_HASSIZE) { dst->xsize = src->xsize; dst->ysize = src->ysize; /* If "size" is set and not cur/pref/vp, invalidate those. */ dst->flag &= ~((WNF_HASCUR|WNF_HASPREF|WNF_HASVP) & ~chg); } if(chg & WNF_HASVP) dst->viewport = src->viewport; if(chg & src->flag & WNF_HASNAME) WnSetName(dst, src->win_name); if(chg & WNF_HASPIXASPECT) dst->pixaspect = src->pixaspect; return dst; } geomview-1.9.5/src/lib/window/winstream.c0000644000175000017500000001510612310110201015272 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #include "windowP.h" int WnStreamIn( Pool *, Handle **, WnWindow ** ); int WnStreamOut( Pool *, Handle *, WnWindow * ); HandleOps WindowOps = { "window", (int ((*)()))WnStreamIn, (int ((*)()))WnStreamOut, (void ((*)()))WnDelete, NULL, NULL }; static struct winkeyword { char *kw; int flag; } wn_kw[] = { { "window", 0 }, { "define", 0 }, { "size", WNF_HASSIZE }, { "position", WNF_HASPREF }, { "noborder", WNF_NOBORDER }, { "border", WNF_NOBORDER }, { "pixelaspect", WNF_HASPIXASPECT }, { "resize", WNF_ENLARGE|WNF_SHRINK }, { "curpos", WNF_HASCUR }, { "viewport", WNF_HASVP }, { "title", WNF_HASNAME }, }; /* See the comments in src/lib/gprim/geom/geomstream.c for the logic * behind HandleDelete(), RefIncr(), RefDecr() etc. */ int WnStreamIn( Pool *p, Handle **hp, WnWindow **wp ) { Handle *h = NULL; Handle *hname = NULL; WnWindow *win = NULL; IOBFILE *inf; char *w, *raww, *err, *title; int i, c; int more, unset; int brack = 0; static char poserr[] = "xmin xmax ymin ymax"; if(p == NULL || (inf = PoolInputFile(p)) == NULL) return 0; win = WnCreate(WN_END); do { more = unset = 0; switch(c = iobfnextc(inf, 0)) { case '{': brack++; iobfgetc(inf); break; case '}': if(brack--) iobfgetc(inf); break; case '<': case ':': case '@': iobfgetc(inf); w = iobfdelimtok("{}()", inf, 0); if(c == '<' && (h = HandleByName(w, &WindowOps)) == NULL) { w = findfile(PoolName(p), raww = w); if(w == NULL) { OOGLSyntax(inf, "Reading window from \"%s\": can't find file \"%s\"", PoolName(p), raww); break; } } else if (h) { HandleDelete(h); /* undo HandleByName() */ } h = HandleReferringTo(c, w, &WindowOps, NULL); if(h) { win = (WnWindow *)HandleObject(h); RefIncr((Ref *)win); } break; case '-': iobfgetc(inf); unset = 1; /* and fall into... */ default: w = iobfdelimtok("{}()", inf, 0); if(w == NULL) goto error; for(i = sizeof(wn_kw)/sizeof(wn_kw[0]); strcmp(w, wn_kw[--i].kw); ) if(i == 0) { OOGLSyntax(inf, "Reading window from \"%s\": unknown keyword \"%s\"", PoolName(p), w); goto error; } win->changed |= wn_kw[i].flag; if(unset) { win->flag &= ~wn_kw[i].flag; continue; } win->flag |= wn_kw[i].flag; switch(i) { case 0: more = 1; break; /* window */ case 1: /* define */ hname = HandleCreateGlobal(iobftoken(inf, 0), &WindowOps); more = 1; break; case 2: /* size */ err = "xsize ysize"; if(iobfgetni(inf, 1, (int *)(void *)&win->xsize, 0) <= 0 || iobfgetni(inf, 1, (int *)(void *)&win->ysize, 0) <= 0) goto expect; break; case 3: /* position */ err = poserr; if(iobfgetni(inf, 4, (int *)&win->pref, 0) != 4) goto expect; break; /* "noborder" and "resize" are just flag manipulation */ case 5: /* border */ win->flag &= ~wn_kw[i].flag; break; case 6: /* pixelaspect */ err = "pixel-aspect-ratio(X/Y)"; if(iobfgetnf(inf, 1, &win->pixaspect, 0) <= 0) goto expect; break; case 8: /* curpos */ err = poserr; if(iobfgetni(inf, 4, (int *)&win->cur, 0) != 4) goto expect; break; case 9: /* viewport */ err = poserr; if(iobfgetni(inf, 4, (int *)&win->viewport, 0) != 4) goto expect; break; case 10: err = "window title string"; title = iobfdelimtok("{}()", inf, 0); if(title == NULL) goto expect; WnSet(win, WN_NAME, title, WN_END); break; } break; expect: OOGLSyntax(inf, "Reading window from \"%s\": \"%s\" expects %s", PoolName(p), w, err); error: if(win && !h) WnDelete(win); return 0; } } while (brack || more); if (hname != NULL) { if (win) { HandleSetObject(hname, (Ref *)win); } if (h) { HandleDelete(h); } h = hname; } /* Pass the ownership of h and win to the caller if requested */ if (hp != NULL) { /* pass on ownership of the handle h to the caller of this function */ if (*hp != NULL) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } else if (h) { /* Otherwise delete h because we are its owner. Note that * HandleReferringTo() has passed the ownership of h to us; * explicitly defined handles (hdefine and define constructs) * will not be deleted by this call. */ HandleDelete(h); } /* same logic as for hp */ if (wp != NULL) { if (*wp != NULL) { WnDelete(*wp); } *wp = win; } else if(win) { WnDelete(win); } return (h != NULL || win != NULL); } int WnStreamOut( Pool *p, Handle *h, WnWindow *win ) { int i; WnPosition *wp; FILE *f; if((f = PoolOutputFile(p)) == NULL) return 0; fprintf(f, "window {"); if(PoolStreamOutHandle( p, h, win != NULL)) { for(i = 2; i < (int)(sizeof(wn_kw)/sizeof(wn_kw[0])); i++) { if(win->flag & wn_kw[i].flag) { if(wn_kw[i].flag & WNF_HASNAME) continue; fprintf(f, " %s", wn_kw[i].kw); switch(i) { case 2: fprintf(f, " %d %d", win->xsize, win->ysize); break; case 3: wp = &win->pref; goto dowp; case 6: fprintf(f, " %g", win->pixaspect); break; case 10: break; case 8: wp = &win->cur; goto dowp; case 9: wp = &win->viewport; /* Fall into dowp */ dowp: fprintf(f, " %d %d %d %d", wp->xmin, wp->xmax, wp->ymin, wp->ymax); break; } } } } fputs(" }\n", f); return 1; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/window/window.h0000644000175000017500000000710712310110201014577 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef WINDOWDEF #define WINDOWDEF #include #include #include "reference.h" #include "ooglutil.h" #include "streampool.h" typedef struct { int xmin, xmax, ymin, ymax; } WnPosition; typedef struct WnWindow WnWindow; /* Public WnWindow methods: */ extern WnWindow *WnCreate(int firstattr, ... /*, WN_END */); extern WnWindow *WnSet(WnWindow *, int firstattr, ... /*, WN_END */); extern int WnGet(WnWindow *, int attr, void *value); extern void WnDelete(WnWindow *); extern WnWindow *WnCopy(WnWindow *); extern WnWindow *WnMerge(WnWindow *src, WnWindow *dst); extern WnWindow *_WnSet(WnWindow *win, int firstattr, va_list *alist); extern int WnStreamOut( Pool *, Handle *, WnWindow * ); extern int WnStreamIn( Pool *p, Handle **hp, WnWindow **wp ); /* * Attributes for WnCreate(), WnSet(), WnGet(). * * Supplying a NULL pointer, or -1 value, for one of these * unsets the corresponding value. * * Initially, all values are unset. * * WnGet()'s returned value * on an invalid token is -1 * on an unset value is 0 * on a set value is 1 */ /* Set/Create type Get type */ #define WN_END 900 /* --------------- -------- */ #define WN_XSIZE 901 /* int int * */ #define WN_YSIZE 902 /* int int * */ #define WN_PREFPOS 903 /* WnPosition * WnPosition * */ #define WN_VIEWPORT 904 /* WnPosition * WnPosition * */ #define WN_CURPOS 905 /* WnPosition * WnPosition * */ #define WN_NAME 906 /* char * char ** */ /* * The following attributes always have a value (may not be "unset"): */ #define WN_ENLARGE 907 /* int int * */ #define WN_SHRINK 908 /* int int * */ #define WN_NOBORDER 909 /* int int * */ #define WN_ASPECT 910 /* --- unsettable --- float * */ #define WN_PIXELASPECT 911 /* float float * */ #define WN_ABLOCK 912 /* void **ablock --ungettable-- */ /* WN_END: end of attribute list WN_XSIZE: desired window width in pixels WN_YSIZE: desired window height in pixels WN_PREFPOS: desired absolute position of window (pixels) WN_VIEWPORT: viewport relative to window (pixels) WN_CURPOS: window's real position (pixels) WN_NAME: window name WN_ENLARGE: window enlargable from pref size? (1=yes, 0=no) (default:1) WN_SHRINK: window shrinkable from pref size? (1=yes, 0=no) (default:1) WN_NOBORDER: draw window without border? (1=yes, 0=no) (default:0) WN_ASPECT: the window's current aspect ratio; the window package updates this automatically when you set the CURPOS attribute. WN_PIXELASPECT: pixel aspect ratio, i.e. screen X pixel size / Y pixel size. Default is 1.0, but may change e.g. for stereo hardware. Taken into account by WN_ASPECT */ #endif /* WINDOWDEF */ geomview-1.9.5/src/lib/window/windowP.h0000644000175000017500000000466112310110201014721 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef WINDOWPDEF #define WINDOWPDEF #include #include "window.h" /* Private definitions for Window package */ /* * Private flag bits: * "flag" indicates whether corresponding field valid, * "changed" indicates whether changed since someone last unset "changed". */ #define WNF_ENLARGE 0x01 /* Allow window to be enlarged from pref size*/ #define WNF_SHRINK 0x02 /* Allow window to be shrunk */ #define WNF_NOBORDER 0x04 /* Draw window without frame */ #define WNF_HASPREF 0x10 /* Requested position */ #define WNF_HASSIZE 0x20 /* Requested size */ #define WNF_HASVP 0x40 /* Drawing viewport within window */ #define WNF_HASCUR 0x80 /* Window's "current position" */ #define WNF_HASNAME 0x100 /* Window's title */ #define WNF_HASPIXASPECT 0x200 /* pixel aspect ratio? */ struct WnWindow { REFERENCEFIELDS; int flag; /* Which fields are set? */ int xsize, ysize; /* Window size */ WnPosition pref; /* Requested abs win position */ WnPosition cur; /* Current position */ WnPosition viewport; /* Relative viewport in win */ char *win_name; /* Window title */ float aspect; /* X/Y Aspect ratio (of cur pos) */ float pixaspect; /* Aspect ratio of hardware pixels */ int changed; /* These fields changed */ }; extern WnWindow *_WnSet(WnWindow *, int firstattr, va_list *alist); #define WINDOWMAGIC OOGLMagic('w', 1) #endif /* WINDOWPDEF */ /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/window/Headers0000644000175000017500000000002312310110201014403 00000000000000window.h windowP.h geomview-1.9.5/src/lib/gprim/0000755000175000017500000000000012310165603013021 500000000000000geomview-1.9.5/src/lib/gprim/Makefile.in0000644000175000017500000004762712310165553015032 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir 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 DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = \ bbox \ bezier \ comment \ discgrp \ geom \ inst \ lincoln \ list \ mesh \ ndmesh \ npolylist \ polylist \ quad \ skel \ sphere \ stub \ tlist \ vect all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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" cscopelist: cscopelist-recursive 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am 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 \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/Makefile.am0000644000175000017500000000030412310110200014751 00000000000000SUBDIRS = \ bbox \ bezier \ comment \ discgrp \ geom \ inst \ lincoln \ list \ mesh \ ndmesh \ npolylist \ polylist \ quad \ skel \ sphere \ stub \ tlist \ vect geomview-1.9.5/src/lib/gprim/bbox/0000755000175000017500000000000012310165602013752 500000000000000geomview-1.9.5/src/lib/gprim/bbox/Makefile.in0000644000175000017500000004762412310165553015761 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/bbox DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libbbox_la_LIBADD = am_libbbox_la_OBJECTS = bboxbound.lo bboxclass.lo bboxcopy.lo \ bboxcreate.lo bboxdraw.lo bboxload.lo bboxminmax.lo \ bboxcenter.lo bboxsave.lo bboxtransform.lo bboxunion.lo libbbox_la_OBJECTS = $(am_libbbox_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libbbox_la_SOURCES) DIST_SOURCES = $(libbbox_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libbbox.la libbbox_la_SOURCES = \ bboxbound.c bboxclass.c bboxcopy.c bboxcreate.c bboxdraw.c bboxload.c \ bboxminmax.c bboxcenter.c bboxsave.c bboxtransform.c bboxunion.c \ bbox.h bboxP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/bbox/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/bbox/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libbbox.la: $(libbbox_la_OBJECTS) $(libbbox_la_DEPENDENCIES) $(EXTRA_libbbox_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libbbox_la_OBJECTS) $(libbbox_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxcenter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxminmax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxtransform.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxunion.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/bbox/Makefile.am0000644000175000017500000000041212310110200015703 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libbbox.la libbbox_la_SOURCES = \ bboxbound.c bboxclass.c bboxcopy.c bboxcreate.c bboxdraw.c bboxload.c \ bboxminmax.c bboxcenter.c bboxsave.c bboxtransform.c bboxunion.c \ bbox.h bboxP.h geomview-1.9.5/src/lib/gprim/bbox/bboxbound.c0000644000175000017500000000567712310110200016017 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" BBox *BBoxBound(BBox *bbox, Transform T, TransformN *TN) { if (bbox == NULL) return NULL; if (bbox->pdim < 4) return NULL; /* should not happen */ if (!T && !TN) { return (BBox *)GeomCopy((Geom *)bbox); } if (TN) { /* real ND bbox */ int i; HPointN *minN; HPointN *maxN; HPtNCoord tmp; BBox *result; minN = HPtNTransform(TN, bbox->min, NULL); maxN = HPtNTransform(TN, bbox->max, NULL); HPtNDehomogenize(minN, minN); HPtNDehomogenize(maxN, maxN); /* and now swap coordinates between min and max as necessary */ for (i = 1; i < TN->odim; i++) { if (minN->v[i] > maxN->v[i]) { tmp = maxN->v[i]; maxN->v[i] = minN->v[i]; minN->v[i] = tmp; } } /* At this point we are ready to generate an Nd bounding box */ result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(minN); HPtNDelete(maxN); return result; } if (T) { HPoint3 min, max; HPt3Coord tmp; HPtNToHPt3(bbox->min, NULL, &min); HPtNToHPt3(bbox->max, NULL, &max); HPt3Transform(T, &min, &min); HPt3Transform(T, &max, &max); HPt3Dehomogenize(&min, &min); HPt3Dehomogenize(&max, &max); /* and now swap coordinates between min and max as necessary */ if (min.x > max.x) { tmp = max.x; max.x = min.x; min.x = tmp; } if (min.y > max.y) { tmp = max.y; max.y = min.y; min.y = tmp; } if (min.z > max.z) { tmp = max.z; max.z = min.z; min.z = tmp; } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/bbox/bboxclass.c0000644000175000017500000000454112310110200016002 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" static GeomClass *aBBoxMethods = NULL; int BBoxPresent = 1; static char bboxName[] = "bbox"; extern BBox *BBoxCopy ( BBox * ); extern BBox *BBoxDelete ( BBox * ); extern BBox *BBoxCreate (BBox *exist, GeomClass *classp, va_list *a_list); extern BBox *BBoxFSave( BBox *, FILE *, char * ); extern BBox *BBoxFLoad( FILE *, char * ); extern int BBoxGet(BBox *bbox, int attr, void *attrp); char * BBoxName() { return bboxName; } GeomClass * BBoxMethods() { if (!aBBoxMethods) { aBBoxMethods = GeomClassCreate(bboxName); aBBoxMethods->name = (GeomNameFunc *) BBoxName; aBBoxMethods->bound = (GeomBoundFunc *) BBoxBound; aBBoxMethods->copy = (GeomCopyFunc *) BBoxCopy; aBBoxMethods->create = (GeomCreateFunc *) BBoxCreate; aBBoxMethods->Delete = (GeomDeleteFunc *) BBoxDelete; aBBoxMethods->draw = (GeomDrawFunc *) BBoxDraw; aBBoxMethods->methods = (GeomMethodsFunc *) BBoxMethods; aBBoxMethods->name = (GeomNameFunc *) BBoxName; aBBoxMethods->transform = (GeomTransformFunc *) BBoxTransform; aBBoxMethods->fsave = (GeomFSaveFunc *) BBoxFSave; aBBoxMethods->fload = (GeomFLoadFunc *) BBoxFLoad; aBBoxMethods->get = (GeomGetFunc *)BBoxGet; } return aBBoxMethods; } geomview-1.9.5/src/lib/gprim/bbox/bboxcopy.c0000644000175000017500000000305612310110200015647 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" BBox *BBoxCopy(BBox *source_bbox) { BBox *dest_bbox; if(source_bbox == NULL) return NULL; if ((dest_bbox = GeomNew(BBox)) == NULL) { GeomError(0, "Can't allocate space for BBox"); return NULL; } *dest_bbox = *source_bbox; dest_bbox->min = HPtNCopy(dest_bbox->min, NULL); dest_bbox->max = HPtNCopy(dest_bbox->max, NULL); return (dest_bbox); } geomview-1.9.5/src/lib/gprim/bbox/bboxcreate.c0000644000175000017500000001544112310110200016141 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" #include "appearance.h" DEF_FREELIST(BBox); void BBoxFreeListPrune(void) { FreeListNode *old; size_t size = 0; HPtNFreeListPrune(); while (BBoxFreeList) { old = BBoxFreeList; BBoxFreeList = old->next; OOGLFree(old); size += sizeof(BBox); } OOGLWarn("Freed %ld bytes.\n", size); } #ifndef max # define max(a,b) ((a) > (b) ? (a) : (b)) #endif #ifndef min # define min(a,b) ((a) < (b) ? (a) : (b)) #endif /* Retrieve min/max/center of bbox */ int BBoxGet(BBox *bbox, int attr, void *attrp) { HPoint3 min3, max3; switch (attr) { case CR_FLAG: *(int *)attrp = 0; break; case CR_MIN: HPtNToHPt3(bbox->min, NULL, &min3); HPt3Dehomogenize(&min3, &min3); memcpy(attrp, &min3, sizeof(Point3)); break; case CR_MAX: HPtNToHPt3(bbox->max, NULL, &max3); HPt3Dehomogenize(&max3, &max3); memcpy(attrp, &max3, sizeof(Point3)); break; case CR_4MIN: HPtNToHPt3(bbox->min, NULL, (HPoint3 *)attrp); break; case CR_4MAX: HPtNToHPt3(bbox->max, NULL, (HPoint3 *)attrp); break; case CR_NMIN: *(HPointN **)attrp = HPtNCopy(bbox->min, NULL); break; case CR_NMAX: *(HPointN **)attrp = HPtNCopy(bbox->max, NULL); break; case CR_CENTER: HPtNToHPt3(bbox->center, NULL, (HPoint3 *)attrp); break; case CR_NCENTER: *(HPointN **)attrp = HPtNCopy(bbox->center, NULL); break; default: return -1; } return 1; } /*-------------------------------------------------------------------------- * Function: BBoxCreate * Description: creates or edits a bounding box * Args: BBox *exist: existing bbox to be edited, if using editing. * NULL otherwise. * GeomClass *classp: * a_list: List of option type - option pairs. Option types * are specified by integers, with 0 signifying end of * list. * Returns: Pointer to BBox created or edited. */ BBox *BBoxCreate (BBox *exist, GeomClass *classp, va_list *a_list) { HPoint3 min3, max3; int min3p = 0, max3p = 0; HPointN *minN = NULL, *maxN = NULL; int minNp = 0, maxNp = 0; BBox *bbox; int attr, copy = 1, need_update = 0; if (exist == NULL) { FREELIST_NEW(BBox, bbox); GGeomInit(bbox, classp, BBOXMAGIC, NULL); bbox->freelisthead = &BBoxFreeList; bbox->min = HPtNCreate(4, NULL); bbox->max = HPtNCreate(4, NULL); bbox->center = HPtNCreate(4, NULL); } else { /* FIXME: Check that exist is in fact a BBox. */ bbox = exist; } while ((attr = va_arg (*a_list, int))) { switch (attr) { case CR_FLAG: break; case CR_MIN: if (minNp || maxNp) { OOGLError(1, "BBoxCreate(): ND minimum already specified.\n"); goto error; } Pt3ToHPt3(va_arg(*a_list, Point3 *), &min3, 1); min3p = need_update = 1; break; case CR_MAX: if (minNp || maxNp) { OOGLError(1, "BBoxCreate(): ND maximum already specified.\n"); goto error; } Pt3ToHPt3(va_arg(*a_list, Point3 *), &max3, 1); max3p = need_update = 1; break; case CR_4MIN: if (minNp || maxNp) { OOGLError(1, "BBoxCreate(): ND minimum already specified.\n"); goto error; } min3 = *va_arg(*a_list, HPoint3 *); min3p = need_update = 1; break; case CR_4MAX: if (minNp || maxNp) { OOGLError(1, "BBoxCreate(): ND maximum already specified.\n"); goto error; } max3 = *va_arg(*a_list, HPoint3 *); max3p = need_update = 1; break; case CR_NMIN: if (min3p || max3p) { OOGLError(1, "BBoxCreate(): 3D minimum already specified.\n"); goto error; } minN = va_arg(*a_list, HPointN *); minNp = need_update = 1; break; case CR_NMAX: if (min3p || max3p) { OOGLError(1, "BBoxCreate(): 3D maximum already specified.\n"); goto error; } maxN = va_arg(*a_list, HPointN *); maxNp = need_update = 1; break; default: if (GeomDecorate (bbox, ©, attr, a_list) && exist == NULL) { OOGLError(0, "BBoxCreate: Undefined attribute: %d", attr); HPtNDelete(bbox->min); HPtNDelete(bbox->max); HPtNDelete(bbox->center); FREELIST_FREE(BBox, bbox); return NULL; } } } /* The VERT_4D flag is set by GeomDecorate(), so it is only now that * we can decide what to do. */ if (need_update) { int pdim = bbox->pdim; if (min3p && max3p) { if (bbox->geomflags & VERT_4D) pdim = 5; else pdim = 4; } if (minNp) { pdim = max(pdim, minN->dim); } if (maxNp) { pdim = max(pdim, maxN->dim); } if (bbox->min->dim != pdim) { bbox->min->v = OOGLRenewNE(HPtNCoord, bbox->min->v, pdim, "Renew min coords"); bbox->min->dim = pdim; } if (bbox->max->dim != pdim) { bbox->max->v = OOGLRenewNE(HPtNCoord, bbox->max->v, pdim, "Renew max coords"); bbox->max->dim = pdim; } if (min3p) { if (bbox->geomflags & VERT_4D) Pt4ToHPtN(&min3, bbox->min); else HPt3ToHPtN(&min3, NULL, bbox->min); } if (max3p) { if (bbox->geomflags & VERT_4D) Pt4ToHPtN(&max3, bbox->max); else HPt3ToHPtN(&max3, NULL, bbox->max); } if (minNp) { HPtNCopy(minN, bbox->min); } if (maxNp) { HPtNCopy(maxN, bbox->max); } bbox->pdim = pdim; bbox->center = BBoxCenterND(bbox, bbox->center); } bbox->geomflags &= ~VERT_4D; /* bboxes are always N-dim */ if (exist != NULL) return exist; return bbox; error: if (exist == NULL) { HPtNDelete(bbox->min); HPtNDelete(bbox->max); HPtNDelete(bbox->center); FREELIST_FREE(BBox, bbox); } return NULL; } void BBoxDelete(BBox *bbox) { if (bbox) { HPtNDelete(bbox->min); HPtNDelete(bbox->max); HPtNDelete(bbox->center); } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/bbox/bboxdraw.c0000644000175000017500000001023212310110200015624 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" #include "mg.h" #include "hpointn.h" #include static void draw_projected_bbox(mgNDctx *NDctx, BBox *bbox, const Appearance *ap) { int i, e, numvert, dim; ColorA edgecolor; HPointN *ptN; mgNDmapfunc mapHPtN = NDctx->mapHPtN; edgecolor.r = ap->mat->edgecolor.r; edgecolor.g = ap->mat->edgecolor.g; edgecolor.b = ap->mat->edgecolor.b; edgecolor.a = 1; dim = bbox->pdim-1; HPtNDehomogenize(bbox->min, bbox->min); HPtNDehomogenize(bbox->max, bbox->max); ptN = HPtNCreate(dim+1, NULL); numvert = 1 << dim; { VARARRAY(pts3, HPoint3, numvert); for (i = 0; i < numvert; i++) { int mask; for (mask = 1, e = 1; e < dim+1; e++, mask <<= 1) { ptN->v[e] = (i & mask) ? bbox->min->v[e] : bbox->max->v[e]; } mapHPtN(NDctx, ptN, &pts3[i], NULL); } HPtNDelete(ptN); edgecolor.r = ap->mat->edgecolor.r; edgecolor.g = ap->mat->edgecolor.g; edgecolor.b = ap->mat->edgecolor.b; edgecolor.a = 1; for(i = 0; i < numvert; i++) { int j, incr; HPoint3 edge[2]; for(j = 0; j < dim; j ++) { /* connect this vertex to its nearest neighbors if they * follow it in lexicographical order */ incr = 1 << j; /* is the j_th bit a zero? */ if ( ! (i & incr) ) { /* if so, draw the edge to the vertex whose number is * gotten from i by making the j_th bit a one */ edge[0] = pts3[i]; edge[1] = pts3[i + incr]; mgpolyline(2, edge, 1, &edgecolor, 0) ; } } } } } BBox *BBoxDraw(BBox *bbox) { int i, numvert; const int dimn = 3; HPoint3 vert[16]; HPoint3 min, max; ColorA edgecolor; const Appearance *ap = mggetappearance(); mgNDctx *NDctx = NULL; if(!(ap->flag & APF_EDGEDRAW)) return bbox; mgctxget(MG_NDCTX, &NDctx); if (NDctx) { draw_projected_bbox(NDctx, bbox, ap); return bbox; } HPtNToHPt3(bbox->min, NULL, &min); HPtNToHPt3(bbox->max, NULL, &max); /* dehomogenize min, max vals */ HPt3Dehomogenize(&min, &min); HPt3Dehomogenize(&max, &max); /* fill in the vertices of the (hyper) cube */ for(i = 0; i < (1 << dimn); i++) { vert[i].x = i&1 ? min.x : max.x; vert[i].y = i&2 ? min.y : max.y; vert[i].z = i&4 ? min.z : max.z; vert[i].w = 1.0; } numvert = 1 << dimn; /* turn on the edge color to draw the bbox */ edgecolor.r = ap->mat->edgecolor.r; edgecolor.g = ap->mat->edgecolor.g; edgecolor.b = ap->mat->edgecolor.b; edgecolor.a = 1; for(i = 0; i < numvert; i++) { int j, incr; HPoint3 edge[2]; for(j = 0; j < dimn; j ++) { /* connect this vertex to its nearest neighbors if they * follow it in lexicographical order */ incr = 1 << j; /* is the j_th bit a zero? */ if ( ! (i & incr) ) { /* if so, draw the edge to the vertex whose number is * gotten from i by making the j_th bit a one */ edge[0] = vert[i]; edge[1] = vert[i + incr]; mgpolyline(2, edge, 1, &edgecolor, 0) ; } } } return bbox; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/bbox/bboxload.c0000644000175000017500000000474212310110200015617 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" BBox * BBoxFLoad(IOBFILE *f, char *fname) { BBox *bbox; char *token = GeomToken(f); int dimn = 3, nd = 0, pdim = 4; HPointN *min, *max; HPtNCoord *minv, *maxv; if(*token == '4') { dimn = 4; token++; } if(*token == 'n') { nd = 1; token++; } if(strcmp(token, "BBOX")) return NULL; if(nd) { if(iobfgetni(f, 1, &pdim, 0) <= 0) { OOGLSyntax(f, "Reading nBBOX from \"%s\": Expected dimension", fname); return NULL; } ++pdim; } if (pdim == 4) { if (dimn == 4) { pdim++; } min = HPtNCreate(pdim, NULL); max = HPtNCreate(pdim, NULL); minv = min->v+1; maxv = max->v+1; } else { min = HPtNCreate(pdim, NULL); max = HPtNCreate(pdim, NULL); if (dimn == 4) { minv = min->v; maxv = max->v; } else { minv = min->v+1; maxv = max->v+1; dimn = pdim-1; } } if(iobfgetnf(f, dimn, minv, 0) != dimn || iobfgetnf(f, dimn, maxv, 0) != dimn) { OOGLSyntax(f, "Reading BBOX from \"%s\": expected %d floats", fname, dimn * 2); HPtNDelete(min); HPtNDelete(max); return NULL; } bbox = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, min, CR_NMAX, max, CR_END); return bbox; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/bbox/bboxminmax.c0000644000175000017500000000335612310110200016171 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" BBox *BBoxMinMax(BBox *bbox, HPoint3 *min, HPoint3 *max) { static HPoint3 nullpoint = {0,0,0,1}; if (bbox != NULL) { HPtNToHPt3(bbox->min, NULL, min); HPtNToHPt3(bbox->max, NULL, max); } else { *min = nullpoint; *max = nullpoint; } return bbox; } BBox *BBoxMinMaxND(BBox *bbox, HPointN **min, HPointN **max) { if (bbox != NULL) { *min = HPtNCopy(bbox->min, *min); *max = HPtNCopy(bbox->max, *max); } else { *min = NULL; *max = NULL; } return bbox; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/bbox/bboxcenter.c0000644000175000017500000000333712310110200016157 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "bboxP.h" static void _BBoxCenter(BBox *bbox, HPtNCoord *center) { int i; HPtNDehomogenize(bbox->min, bbox->min); HPtNDehomogenize(bbox->max, bbox->max); center[0] = 1.0; for (i = 1; i < bbox->pdim; i++) { center[i] = 0.5 * (bbox->min->v[i] + bbox->max->v[i]); } } HPointN *BBoxCenterND(BBox *bbox, HPointN *center) { if (!center) { center = HPtNCreate(bbox->pdim, NULL); } else if (center->dim != bbox->pdim) { center->v= OOGLRenewNE(HPtNCoord, center->v, bbox->pdim, "renew HPointN"); center->dim = bbox->pdim; } _BBoxCenter(bbox, (HPtNCoord *)center->v); return center; } void BBoxCenter(BBox *bbox, HPoint3 *center) { HPointN *Ncenter; Ncenter = BBoxCenterND(bbox, NULL); HPtNToHPt3(Ncenter, NULL, center); HPtNDelete(Ncenter); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/bbox/bboxsave.c0000644000175000017500000000320012310110200015622 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" BBox *BBoxFSave(BBox *bbox, FILE *f, char *fname) { int i; (void)fname; if (bbox->pdim == 4) { fprintf(f, "BBOX\n"); } else { fprintf(f, "nBBOX %d\n", bbox->pdim-1); } for (i = 1; i < bbox->pdim; i++) { fprintf(f, " %g", bbox->min->v[i]); } fprintf(f, "\n"); for (i = 1; i < bbox->pdim; i++) { fprintf(f, " %g", bbox->max->v[i]); } return bbox; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/bbox/bboxtransform.c0000644000175000017500000000653112310110200016711 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" static BBox *BBoxTransformN(BBox *bbox, TransformN *TN) { HPointN *p; HPtNCoord c = bbox->min->v[0] != 1.0 ? bbox->min->v[0] : 1.0; HPtNCoord C = bbox->max->v[0] != 1.0 ? bbox->max->v[0] : 1.0; int dim = bbox->pdim-1; int numvert = 1 << dim; VARARRAY(ptN, HPointN *, numvert); int i, j; if (!TN) { return bbox; } for (i = 0; i < numvert; i++) { ptN[i] = HPtNCreate(bbox->pdim, NULL); for (j = 1; j < bbox->pdim; j++) { ptN[i]->v[j] = (i & (1 << j)) ? bbox->min->v[j]/c : bbox->max->v[j]/C; } } p = ptN[0]; HPtNTransform(TN, p, p); HPtNDehomogenize(p, p); HPtNCopy(p, bbox->min); HPtNCopy(p, bbox->max); HPtNDelete(p); for (i = 1; i < numvert; i++) { p = ptN[i]; HPtNTransform(TN, p, p); HPtNDehomogenize(p, p); for (j = 1; j < bbox->pdim; j++) { if (p->v[j] < bbox->min->v[j]) bbox->min->v[j] = p->v[j]; else if (p->v[j] > bbox->max->v[j]) bbox->max->v[j] = p->v[j]; } HPtNDelete(p); } return bbox; } BBox *BBoxTransform(BBox *bbox, Transform T, TransformN *TN) { int dim, numvert, i, j; HPointN **ptN, *p; HPtNCoord c = bbox->min->v[0] != 1.0 ? bbox->min->v[0] : 1.0; HPtNCoord C = bbox->max->v[0] != 1.0 ? bbox->max->v[0] : 1.0; if ((!T || T == TM_IDENTITY) && !TN) return bbox; if (TN) { return BBoxTransformN(bbox, TN); } dim = bbox->pdim-1; numvert = 1 << dim; ptN = (HPointN **)alloca(numvert*sizeof(HPointN *)); for (i = 0; i < numvert; i++) { ptN[i] = HPtNCreate(bbox->pdim, NULL); for (j = 1; j < bbox->pdim; j++) { ptN[i]->v[j] = (i & (1 << j)) ? bbox->min->v[j]/c : bbox->max->v[j]/C; } } p = ptN[0]; HPtNTransform3(T, NULL, p, p); HPtNDehomogenize(p, p); HPtNCopy(p, bbox->min); HPtNCopy(p, bbox->max); HPtNDelete(p); for (i = 1; i < numvert; i++) { p = ptN[i]; HPtNTransform3(T, NULL, p, p); HPtNDehomogenize(p, p); for (j = 1; j < bbox->pdim; j++) { if (p->v[j] < bbox->min->v[j]) bbox->min->v[j] = p->v[j]; else if (p->v[j] > bbox->max->v[j]) bbox->max->v[j] = p->v[j]; } HPtNDelete(p); } return bbox; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/bbox/bboxunion.c0000644000175000017500000000473312310110200016030 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" #define BB_MIN(a,b) ( (a) <= (b) ? a : b ) #define BB_MAX(a,b) ( (a) >= (b) ? a : b ) BBox * BBoxUnion(BBox *bbox1, BBox *bbox2) { return BBoxUnion3(bbox1, bbox2, NULL); } BBox * BBoxUnion3(BBox *bbox1, BBox *bbox2, BBox *result) { /* TAKE CARE OF THE CASE OF EITHER CUBE BEING NULL */ if (!bbox1) { if(!bbox2) { static Point Max = { -1e10,-1e10,-1e10, 1 }; static Point Min = { 1e10, 1e10, 1e10, 1 }; return (BBox *)GeomCCreate((Geom *)result, BBoxMethods(), CR_4MIN, Min, CR_4MAX, Max, CR_END); } bbox1 = bbox2; bbox2 = NULL; } /* Make sure bbox1 is the one with the larger dimension */ if (bbox2 && bbox2->pdim > bbox1->pdim) { BBox *bboxswap = bbox1; bbox1 = bbox2; bbox2 = bboxswap; } result = (BBox *)GeomCCreate((Geom *)result, BBoxMethods(), CR_NMIN, bbox1->min, CR_NMAX, bbox1->max, CR_END); if (bbox2) { int i; for (i = 1; i < bbox2->pdim; i++) { if (result->min->v[i] > bbox2->min->v[i]) { result->min->v[i] = bbox2->min->v[i]; } if (result->max->v[i] < bbox2->max->v[i]) { result->max->v[i] = bbox2->max->v[i]; } } result->center = BBoxCenterND(result, result->center); } return result; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/bbox/bbox.h0000644000175000017500000000337712310110200014767 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef BBOXDEF #define BBOXDEF #include "geom.h" #define BBOXMAGIC GeomMagic ('x', 1) typedef struct BBox BBox; extern GeomClass *BBoxMethods( void ); extern char *BBoxName( void ); extern BBox *BBoxBound( BBox *, Transform T, TransformN *TN); extern BBox *BBoxDraw( BBox * ); extern BBox *BBoxTransform( BBox *, Transform T, TransformN *TN ); extern BBox *BBoxMinMax( BBox *, HPoint3 *min, HPoint3 *max ); extern BBox *BBoxMinMaxND( BBox *, HPointN **min, HPointN **max ); extern void BBoxCenter(BBox *bbox, HPoint3 *center); extern HPointN *BBoxCenterND(BBox *bbox, HPointN *center); extern BBox *BBoxUnion( BBox *, BBox * ); extern BBox *BBoxUnion3( BBox *b1, BBox *b2, BBox *result ); #ifdef GEOM_SM extern int BBoxShare( Geom *obj, GeomSMRegion *sm ); extern BBox *BBoxPrivate(); #endif #endif geomview-1.9.5/src/lib/gprim/bbox/bboxP.h0000644000175000017500000000333512310110200015101 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef BBOXPDEF #define BBOXPDEF #include "geomclass.h" #include "bbox.h" #include "hpointn.h" /* * The vert[] array lists vertices, indexed by binary order of initial axes, * where X has weight 1, Y weight 2, Z weight 4. * Initially "min" corresponds to 0, "max" to 1. * Specifically GeomCreate("bbox", CR_MIN, min, CR_MAX, max) makes a bbox with: * vert[0] = (min.x, min.y, min.z) * vert[1] = (max.x, min.y, min.z) * vert[2] = (min.x, max.y, min.z) ... * vert[7] = (max.x, max.y, max.z). * Note this property isn't necessarily preserved if the bbox is transformed. */ /* We always use projective coordinates, i.e. min and max are vectors * of length pdim */ struct BBox { GEOMFIELDS; HPointN *center; HPointN *min, *max; }; #endif /* ! BBOXPDEF */ geomview-1.9.5/src/lib/gprim/bbox/Headers0000644000175000017500000000001712310110200015146 00000000000000bbox.h bboxP.h geomview-1.9.5/src/lib/gprim/bezier/0000755000175000017500000000000012310165602014300 500000000000000geomview-1.9.5/src/lib/gprim/bezier/Makefile.in0000644000175000017500000004762612310165553016311 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/bezier DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libbezier_la_LIBADD = am_libbezier_la_OBJECTS = bezbound.lo bezclass.lo bezcreate.lo \ bezdice.lo bezdraw.lo bezevert.lo bezload.lo bezpick.lo \ bezsave.lo bezsphere.lo beztransform.lo libbezier_la_OBJECTS = $(am_libbezier_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libbezier_la_SOURCES) DIST_SOURCES = $(libbezier_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libbezier.la libbezier_la_SOURCES = \ bezbound.c bezclass.c bezcreate.c bezdice.c bezdraw.c bezevert.c bezload.c bezpick.c bezsave.c bezsphere.c beztransform.c \ bezier.h bezierP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/bezier/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/bezier/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libbezier.la: $(libbezier_la_OBJECTS) $(libbezier_la_DEPENDENCIES) $(EXTRA_libbezier_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libbezier_la_OBJECTS) $(libbezier_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezdice.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezevert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/beztransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/bezier/Makefile.am0000644000175000017500000000041012310110200016227 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libbezier.la libbezier_la_SOURCES = \ bezbound.c bezclass.c bezcreate.c bezdice.c bezdraw.c bezevert.c bezload.c bezpick.c bezsave.c bezsphere.c beztransform.c \ bezier.h bezierP.h geomview-1.9.5/src/lib/gprim/bezier/bezbound.c0000644000175000017500000001004512310110200016154 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bezierP.h" BBox *BezierBound(Bezier *bezier, Transform T, TransformN *TN) { float *p; int n; HPoint3 min, max, clean; p = bezier->CtrlPnts; n = (bezier->degree_u + 1) * (bezier->degree_v + 1); /* First handle the case without transformations, this means that we return a 3d bbox for 3d beziers, and a 4d bbox for 4d beziers. */ if ((T == TM_IDENTITY || !T) && !TN) { min = *(HPoint3 *)p; if (bezier->dimn == 4) { if (!T) { max = min; while(--n > 0) { p += 4; Pt4MinMax(&min, &max, (HPoint3 *)p); } } else { HPt3Dehomogenize(&min, &min); max = min; while(--n > 0) { p += 4; HPt3MinMax(&min, &max, (HPoint3 *)p); } } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_4D, 1, CR_END); } else { min.w = 1.0; max = min; while(--n > 0) { p += 3; Pt3MinMax(&min, &max, (HPoint3 *)p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *ptN; HPointN *minN; HPointN *maxN; BBox *result; ptN = HPtNCreate(5, NULL); if (bezier->dimn == 3) { Pt3ToHPtN((Point3 *)p, ptN); } else if (!(bezier->geomflags & VERT_4D)) { HPt3ToHPtN((HPoint3 *)p, NULL, ptN); } else { Pt4ToHPtN((HPoint3 *)p, ptN); } minN = HPtNTransform(TN, ptN, NULL); HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); while(--n > 0) { if (bezier->dimn == 3) { p += 3; Pt3ToHPtN((Point3 *)p, ptN); } else { p += 4; if (!(bezier->geomflags & VERT_4D)) { HPt3ToHPtN((HPoint3 *)p, NULL, ptN); } else { Pt4ToHPtN((HPoint3 *)p, ptN); } } HPtNTransform(TN, ptN, ptN); HPtNMinMax(minN, maxN, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(ptN); HPtNDelete(minN); HPtNDelete(maxN); return result; } /* A 3d bbox is requested, with transformations */ if (T) { int stride = bezier->dimn; /* ordinary 3d transform, treat 4d co-ordinates as homogeneous * co-ordinates. */ if (stride == 3) { Pt3ToHPt3((Point3 *)p, &min, 1); } else { min = *(HPoint3 *)p; } HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n > 0) { p += stride; if (stride == 3) { Pt3ToHPt3((Point3 *)p, &clean, 1); } else { clean = *(HPoint3 *)p; } HPt3Transform(T, &clean, &clean); HPt3MinMax(&min, &max, &clean); } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/bezier/bezclass.c0000644000175000017500000000575012310110200016161 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bezierP.h" static GeomClass *aBezierMethods = NULL; static GeomClass *aBezierListMethods = NULL; int BezierPresent = 1; int BezierListPresent = 1; static char nameBezier[] = "bezier"; static char nameBezierList[] = "bezierlist"; char * BezierName() { return nameBezier; } char * BezierListName() { return nameBezierList; } GeomClass * BezierMethods() { if( !aBezierMethods ) { aBezierMethods = GeomClassCreate(nameBezier); aBezierMethods->name = BezierName; aBezierMethods->methods = (GeomMethodsFunc *)BezierMethods; aBezierMethods->create = (GeomCreateFunc *)BezierCreate; aBezierMethods->evert = (GeomEvertFunc *)BezierEvert; aBezierMethods->Delete = (GeomDeleteFunc *)BezierDelete; aBezierMethods->bound = (GeomBoundFunc *)BezierBound; aBezierMethods->boundsphere = (GeomBoundSphereFunc *)BezierBoundSphere; aBezierMethods->draw = (GeomDrawFunc *)BezierDraw; aBezierMethods->bsptree = (GeomBSPTreeFunc *)BezierBSPTree; aBezierMethods->copy = (GeomCopyFunc *)BezierCopy; aBezierMethods->pick = (GeomPickFunc *)BezierPick; aBezierMethods->dice = (GeomDiceFunc *)BezierDice; aBezierMethods->transform = (GeomTransformFunc *)BezierTransform; aBezierMethods->transformto = (GeomTransformToFunc *)BezierTransform; } return aBezierMethods; } GeomClass * BezierListMethods() { if( !aBezierListMethods ) { (void) ListMethods(); aBezierListMethods = GeomSubClassCreate("list", "bezierlist"); aBezierListMethods->name = BezierListName; aBezierListMethods->methods = (GeomMethodsFunc *)BezierListMethods; aBezierListMethods->fload = (GeomFLoadFunc *)BezierListFLoad; aBezierListMethods->fsave = (GeomFSaveFunc *)BezierListFSave; aBezierListMethods->import = NULL; aBezierListMethods->export = NULL; } return aBezierListMethods; } geomview-1.9.5/src/lib/gprim/bezier/bezcreate.c0000644000175000017500000001111612310110200016310 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bezierP.h" /* * Bezier creation, deletion and editing. */ static inline void bez_make_meshhandle(Bezier *bezier) { char meshhname[sizeof("\aBezier::")+sizeof(void *)*2]; extern HandleOps GeomOps; sprintf(meshhname, "\aBezier::%lx", (unsigned long)bezier); bezier->meshhandle = HandleDoCreate(meshhname, &GeomOps); HandleSetObject(bezier->meshhandle, (Ref *)bezier->mesh); } Bezier * BezierCopy(Bezier *ob) { Bezier *b; int n; if (ob == NULL) { return NULL; } b = OOGLNewE(Bezier, "new Bezier"); *b = *ob; /* Copy all fields */ GGeomInit(b, BezierMethods(), BEZIERMAGIC, NULL); if (ob->CtrlPnts != NULL) { n = (b->degree_u + 1) * (b->degree_v + 1) * b->dimn; b->CtrlPnts = OOGLNewNE(float, n, "Bezier control points"); memcpy(b->CtrlPnts, ob->CtrlPnts, n * sizeof(float)); } if (ob->mesh != NULL && (b->geomflags & BEZ_REMESH) == 0) { /* just increment the refcount, no need to do a real copy * here; the mesh will be regenerated on demand as needed. */ b->mesh = REFGET(Mesh, ob->mesh); } else { b->mesh = NULL; } bez_make_meshhandle(b); return b; } void BezierDelete(Bezier *bezier) { if (bezier) { if (bezier->CtrlPnts != NULL) { OOGLFree(bezier->CtrlPnts); } if (bezier->mesh != NULL) { GeomDelete((Geom *)bezier->mesh); } if (bezier->meshhandle != NULL) { HandlePDelete(&bezier->meshhandle); } } } /* ZZZ: note: BezierCreate doesn't observe the copy directive: always copies pointers */ Bezier * BezierCreate( Bezier *exist, GeomClass *classp, va_list *a_list ) { Bezier *bezier; int attr, copy = 1, i; ColorA *color = NULL; if (exist == NULL) { bezier = OOGLNewE(Bezier, "BezierCreate Bezier"); memset(bezier, 0, sizeof(Bezier)); GGeomInit (bezier, classp, BEZIERMAGIC, NULL); bezier->CtrlPnts = NULL; bezier->nu = bezier->nv = 0; /* no mesh yet */ bezier->mesh = NULL; bez_make_meshhandle(bezier); } else { /* Check that exist is a Bezier. */ bezier = exist; } bezier->pdim = 4; /* hard-wired */ while ((attr = va_arg (*a_list, int))) switch (attr) { case CR_FLAG: bezier->geomflags = va_arg (*a_list, int); break; case CR_DEGU: bezier->degree_u = va_arg (*a_list, int); break; case CR_DEGV: bezier->degree_v = va_arg (*a_list, int); break; case CR_DIM: bezier->dimn = va_arg (*a_list, int); if (bezier->dimn == bezier->pdim) { bezier->geomflags |= VERT_4D; } break; case CR_NU: bezier->nu = va_arg (*a_list, int); break; case CR_NV: bezier->nv = va_arg (*a_list, int); break; case CR_POINT: bezier->CtrlPnts = va_arg (*a_list, float *); break; case CR_MESH: bezier->mesh = va_arg (*a_list, Mesh *); break; case CR_ST: memcpy(bezier->STCoords, va_arg(*a_list, TxST *), 4*sizeof(TxST)); break; case CR_COLOR: color = va_arg (*a_list, ColorA *); if (color != NULL) for (i=0; i<4; i++) bezier->c[i] = color[i]; break; default: if (GeomDecorate (bezier, ©, attr, a_list)) { OOGLError (0, "BezierCreate: undefined option: %d", attr); OOGLFree (bezier); return NULL; } } if (bezier->dimn > MAX_BEZ_DIMN) { OOGLError (0, "BezierCreate: dimension (%d) too high.", bezier->dimn); OOGLFree (bezier); return NULL; } if (exist != NULL) return exist; return bezier; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/bezier/bezdice.c0000644000175000017500000002452512310110200015761 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Silvio Levy, Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "math.h" #include "bezierP.h" #include "bsptreeP.h" void bezier_interp(); Bezier * BezierDice(Bezier *bezier, int nu, int nv) { if(nu < 2) nu = BEZ_DEFAULT_MESH_SIZE; if(nv < 2) nv = BEZ_DEFAULT_MESH_SIZE; if(nu != bezier->nu || nv != bezier->nv) { bezier->geomflags |= BEZ_REMESH; bezier->nu = nu; bezier->nv = nv; } return bezier; } /* this gets called when it's time to remesh, so the current mesh is destroyed and a new one is allocated */ Mesh *BezierReDice(Bezier *bezier) { int u, v, d; int dimn, nu, nv, degree_u, degree_v; float *tmpp0, *tmpp1, *tmpp2, *p; float *tmpdv, *tmpdv0, *tmpdv1, *tmpdv2, *dv; float *tmpdu, *tmpdu0, *tmpdu1, *tmpdu2, *du; float norm; HPoint3 *bmp; Point3 *bmn; TxST *bmt; Mesh m; dimn = bezier->dimn; degree_u = bezier->degree_u; degree_v = bezier->degree_v; if (bezier->nu <= 1) bezier->nu = BEZ_DEFAULT_MESH_SIZE; if (bezier->nv <= 1) bezier->nv = BEZ_DEFAULT_MESH_SIZE; nu = bezier->nu; nv = bezier->nv; m.nu = nv; m.nv = nu; m.geomflags = MESH_N; if (bezier->geomflags & BEZ_C) { m.geomflags |= MESH_C; } m.p = NULL; m.c = NULL; m.n = NULL; m.u = NULL; m.p = OOGLNewNE(HPoint3, nu*nv, "BezierReDice: mesh points"); m.n = OOGLNewNE(Point3, nu*nv, "BezierReDice: mesh normals"); if(bezier->geomflags & BEZ_C) m.c = OOGLNewNE(ColorA, nu*nv, "BezierReDice: mesh colors"); if(bezier->geomflags & BEZ_ST) m.u = OOGLNewNE(TxST, nu*nv, "BezierReDice: mesh txcoords"); /* compute first pass: interpolate mesh points in u direction */ tmpdv = OOGLNewNE(float, dimn * degree_v * (degree_u+1), "BezierReDice: tempdv"); for (v=0; vCtrlPnts + dimn * ((v+1)*(degree_u+1)+u)+d)- *(bezier->CtrlPnts + dimn * (v*(degree_u+1)+u)+d); /* printf("%f ", *(tmpdv+dimn*(v*(degree_u+1)+u)+d)); */ } /* printf("\n"); */ } tmpdu = OOGLNewNE(float,dimn*(degree_v+1)*degree_u,"BezierReDice:tmpdu"); /* printf("this is du\n"); */ for (v=0; vCtrlPnts + dimn * (v*(degree_u+1)+u+1)+d)- *(bezier->CtrlPnts + dimn * (v*(degree_u+1)+u)+d); /* printf("%f ", *(tmpdv+dimn*(v*degree_u+u)+d)); */ } /* printf("\n"); */ } /* printf("this is tmpp0\n"); */ tmpp0 = OOGLNewNE(float, dimn * (degree_v+1) * nu, "BezierReDice: tmpp0"); for (v=0; vCtrlPnts + v * dimn * (degree_u+1), tmpp0 + v * dimn * nu, degree_u, nu, dimn); tmpdv0 = OOGLNewNE(float, dimn * degree_v * nu, "BezierReDice: tmpdv0"); /* printf("this is tmpdv0\n"); */ for (v=0; vSTCoords[0].s*(1-tu) + bezier->STCoords[1].s*tu; txds = bezier->STCoords[2].s*(1-tu) + bezier->STCoords[3].s*tu - txs0; txt0 = bezier->STCoords[0].t*(1-tu) + bezier->STCoords[1].t*tu; txdt = bezier->STCoords[2].t*(1-tu) + bezier->STCoords[3].t*tu - txt0; } for (v=0, p=tmpp2, dv=tmpdv2, du=tmpdu2; vw = 1.; bmp++; bmn->x = -du[1]*dv[2]+du[2]*dv[1]; bmn->y = -du[2]*dv[0]+du[0]*dv[2]; bmn->z = -du[0]*dv[1]+du[1]*dv[0]; norm=bmn->x *bmn->x +bmn->y *bmn->y +bmn->z *bmn->z; if (norm==0.0) {bmn->x=1.; norm=1.;} norm=sqrt(norm); bmn->x /= norm; bmn->y /= norm; bmn->z /= norm; bmn++; if(bmt) { float tv = (float)v/(nv-1); bmt->s = txs0 + txds*tv; bmt->t = txt0 + txdt*tv; bmt++; } } } GeomFree(tmpp0); GeomFree(tmpp1); GeomFree(tmpp2); GeomFree(tmpdu); GeomFree(tmpdu0); GeomFree(tmpdu1); GeomFree(tmpdu2); GeomFree(tmpdv); GeomFree(tmpdv0); GeomFree(tmpdv1); GeomFree(tmpdv2); bezier->geomflags &= ~BEZ_REMESH; /* turn off this bit */ if(bezier->geomflags & BEZ_C) { float fu, unu, fv, unv; ColorA u0, u1; ColorA *cp; #define INTC(c0, c1, t, unt, dest) /* Interpolate color */ \ dest.r = c0.r * unt + c1.r * t; \ dest.g = c0.g * unt + c1.g * t; \ dest.b = c0.b * unt + c1.b * t; \ dest.a = c0.a * unt + c1.a * t; cp = m.c; for(v = 0; v < nv; v++) { fv = (float) v / (nv - 1); unv = 1 - fv; INTC(bezier->c[0], bezier->c[1], fv, unv, u0); INTC(bezier->c[2], bezier->c[3], fv, unv, u1); for(u = 0; u < nu; u++) { fu = (float) u / (nu - 1); unu = 1 - fu; INTC(u0, u1, fu, unu, (*cp)); cp++; } } } GeomDelete((Geom *)bezier->mesh); HandleSetObject(bezier->meshhandle, NULL); bezier->mesh = (Mesh *) GeomCreate("mesh", CR_NOCOPY, /* For now, assume these are rational beziers hence belong in 3-space CR_4D, (dimn == 4) ? 1 : 0, */ CR_FLAG, m.geomflags, CR_NU, m.nu, CR_NV, m.nv, CR_POINT4, m.p, CR_NORMAL, m.n, CR_COLOR, m.c, CR_U, m.u, CR_END); if (bezier->mesh == NULL) { OOGLError(1, "BezierReDice: can't create Mesh"); return NULL; } HandleSetObject(bezier->meshhandle, (Ref *)bezier->mesh); /*GeomCCreate(bezier->mesh, NULL, CR_COPY, CR_APPEAR, bezier->ap, CR_END);*/ #if 0 /* should be handled by a call-back now */ if (bezier->bsptree != NULL && bezier->bsptree->tree != NULL) { /* simply free the tree */ BSPTreeFreeTree(bezier->bsptree); } #endif return bezier->mesh; } /* Takes a list of control points describing a spline */ /* and produces values for the spline */ /* at n equally spaced points. */ #if 0 float *in; /* input array of control points */ float *out; /* output array */ int deg; /* degree of spline */ int n; /* number of points to interpolate */ int dimn; /* dimension of range */ #endif void bezier_interp(float *in, float *out, int deg, int n, int dimn) { int m, offset, k, j; float p[(MAX_BEZ_DEGREE+1)*MAX_BEZ_DIMN]; float t; /* for (j=0; j0) { mgbezier (bezier->degree_u, bezier->degree_v , bezier->dimn, bezier->CtrlPnts, (bezier->geomflags & BEZ_ST) ? bezier->STCoords : NULL, (bezier->geomflags & BEZ_C) ? bezier->c : NULL); } else { GeomMakePath(bezier, 'B', path, pathlen); if (ap->valid & APF_DICE) { bezier->nu = ap->dice[0]; bezier->nv = ap->dice[1]; } if (bezier->mesh == NULL || bezier->mesh->nu != bezier->nu || bezier->mesh->nv != bezier->nv) bezier->geomflags |= BEZ_REMESH; if (bezier->geomflags & BEZ_REMESH) { BezierReDice(bezier); } bezier->mesh->ppath = path; bezier->mesh->ppathlen = pathlen; GeomDraw( (Geom *)bezier->mesh ); } return bezier; } Bezier *BezierBSPTree(Bezier *bezier, BSPTree *bsptree, int action) { if (never_translucent((Geom *)bezier)) { return bezier; } switch (action) { case BSPTREE_CREATE: HandleRegister(&bezier->meshhandle, (Ref *)bezier, bsptree, BSPTreeInvalidate); return bezier; case BSPTREE_DELETE: HandleUnregisterJust(&bezier->meshhandle, (Ref *)bezier, bsptree,BSPTreeInvalidate); return bezier; case BSPTREE_ADDGEOM: if (bezier->mesh == NULL || bezier->mesh->nu != bezier->nu || bezier->mesh->nv != bezier->nv) { bezier->geomflags |= BEZ_REMESH; } if (bezier->geomflags & BEZ_REMESH) { BezierReDice(bezier); } BSPTreeAddObject(bsptree, (Geom *)bezier->mesh); return bezier; default: return NULL; } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/bezier/bezevert.c0000644000175000017500000000412312310110200016172 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bezierP.h" /* * evert patch by transposing control points. * If mesh has been computed, also call MeshEvert * Next time mesh is computed, its normals will be correct. */ Bezier * BezierEvert( bezier ) Bezier *bezier; { #ifdef FOO int index0, index1, i,j,k; /* index0 will be linear index of control point... */ for( i = 0; i< bezier->degree+1; ++i) for( j = i+1; j< bezier->degree+1; ++j) { /* ... compute index1 for transpose control point */ index1 = bezier->dimn * (j * (bezier->degree+1) + i); index0 = bezier->dimn * (i * (bezier->degree+1) + j); for( k = 0; k< bezier->dimn; ++k) { tmp = bezier->CtrlPnts[index0+k]; bezier->CtrlPnts[index0+k] = bezier->CtrlPnts[index1+k]; bezier->CtrlPnts[index1+k] = tmp; } } #endif if (bezier->geomflags & BEZ_REMESH || bezier->mesh == NULL) BezierReDice(bezier); MeshEvert(bezier->mesh); return bezier; } geomview-1.9.5/src/lib/gprim/bezier/bezload.c0000644000175000017500000001235112310110200015766 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "bezierP.h" /* a hack: introduce new names of the form BEZUVM and BEZUVM_ST, where U is u-degree of the polynomial and V is v-degree of the polynomial and M is the dimension of the points involved */ static int bezierheader(IOBFILE *file, Bezier *bezier) { int binary = 0; char *token; /* Parse {BBP|STBBP|BEZuvn[_ST]} [BINARY] */ bezier->geomflags = BEZ_REMESH; bezier->dimn = 3; bezier->degree_u = bezier->degree_v = 3; /* Default bicubic 3-D patch */ bezier->nu = bezier->nv = 0; token = GeomToken(file); if(strncmp(token, "ST", 2) == 0) { bezier->geomflags |= BEZ_ST; token += 2; } if(*token == 'C') { bezier->geomflags |= BEZ_C; token++; } if(strncmp(token, "BEZ", 3) == 0) { int haveuvn = 0; token += 3; if(*token >= '0' && *token <= '9') { haveuvn = 1; bezier->degree_u = *token++ - '0'; bezier->degree_v = *token++ - '0'; bezier->dimn = *token++ - '0'; } if(strcmp(token, "_ST") == 0) { token += 3; bezier->geomflags |= BEZ_ST; } if(!haveuvn) { /* [C]BEZ[_ST] u v n -- expect u, v, n as separate numbers */ if(iobfgetni(file, 1, &bezier->degree_u, 0) <= 0 || iobfgetni(file, 1, &bezier->degree_v, 0) <= 0 || iobfgetni(file, 1, &bezier->dimn, 0) <= 0) return -1; } if(bezier->degree_u <= 0 || bezier->degree_u > MAX_BEZ_DEGREE || bezier->degree_v <= 0 || bezier->degree_v > MAX_BEZ_DEGREE || bezier->dimn < 3 || bezier->dimn > MAX_BEZ_DIMN) return -1; } else if(strcmp(token, "BBP") != 0) { return -1; } GeomAcceptToken(); if(iobfnextc(file, 1) == 'B') { if(iobfexpectstr(file, "BINARY")) return -1; binary = 1; if(iobfnextc(file, 1) == '\n') (void) iobfgetc(file); /* Toss \n */ } bezier->CtrlPnts = NULL; bezier->mesh = NULL; return(binary); } List * BezierListFLoad(IOBFILE *file, char *fname) { Geom *bezierlist; Bezier proto, bez; int totalfloats; int nf, ok, c; int binary; Geom *geom; binary = bezierheader( file, &proto ); if(binary < 0) return NULL; /* begin a list with empty list */ bezierlist = NULL; for(;;) { /* get new space */ ok = 0; bez = proto; /* should be a call to GeomCopy */ /* copy over header info */ totalfloats = (proto.degree_u+1)*(proto.degree_v+1)*proto.dimn; bez.CtrlPnts = OOGLNewNE(float,totalfloats, "Bezier control pnts"); nf = iobfgetnf(file, totalfloats, bez.CtrlPnts, binary); if(nf < totalfloats) { if(nf != 0) break; /* Incomplete array of control points -> error */ /* Maybe another Bezier header follows. * Take care not to call bezierheader(), which will * invoke GeomToken(), unless we actually seem to have * another letter following. Without the isalpha() * test, we might consume e.g. a close-brace which * doesn't belong to us. */ c = iobfnextc(file, 0); if((isascii(c) && isalpha(c)) && (binary = bezierheader( file, &proto )) >= 0) continue; /* No. If this doesn't look like the end of a * Bezier list, it's an error. */ if(c == EOF || c == CKET || c == ';') ok = 1; break; } if (bez.geomflags & BEZ_ST) { if(iobfgetnf(file, 8, (float *)bez.STCoords, binary) != 8) break; } if (bez.geomflags & BEZ_C) { /* Load 4 colors, for the 4 corners of the patch, v-major order. */ if(iobfgetnf(file, 16, (float *)bez.c, binary) != 16) break; } /* successful read; append to list */ geom = GeomCCreate (NULL,BezierMethods(), CR_NOCOPY, CR_FLAG, bez.geomflags | BEZ_REMESH, CR_DEGU, bez.degree_u, CR_DEGV, bez.degree_v, CR_DIM, bez.dimn, CR_POINT, bez.CtrlPnts, CR_ST, bez.STCoords, CR_COLOR, bez.c, CR_END); if(bezierlist) ListAppend(bezierlist, geom); else bezierlist = GeomCCreate(NULL, BezierListMethods(), CR_GEOM, geom, CR_END); } if(!ok) { OOGLSyntax(file, "Reading Bezier from \"%s\"", fname); GeomDelete(bezierlist); /* Scrap everything on error */ return NULL; } return (List *)bezierlist; } /* * Local Variables: *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/bezier/bezpick.c0000644000175000017500000000323012310110200015771 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "mg.h" #include "bezierP.h" Geom * BezierPick( Bezier *bezier, Pick *pick, Appearance *ap, Transform T, TransformN *TN, int *axes ) { if (bezier->mesh == NULL || bezier->mesh->nu != bezier->nu || bezier->mesh->nv != bezier->nv) bezier->geomflags |= BEZ_REMESH; if (bezier->geomflags & BEZ_REMESH) { BezierReDice(bezier); } return GeomPick( (Geom *)bezier->mesh, pick, ap, T, TN, axes ); } /* * Local Variables: *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/bezier/bezsave.c0000644000175000017500000000636012310110200016010 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bezierP.h" #include "listP.h" List * BezierListSave(bezierlist, fname) List *bezierlist; char *fname; { List *q; FILE *f; if((f = fopen(fname, "w")) == NULL) return NULL; q = BezierListFSave(bezierlist, f); fclose(f); return q; } List * BezierListFSave(bezierlist, f) List *bezierlist; FILE *f; { List *bl; Bezier *bez; float *p; int u, v; int dimwas = -1, uwas = -1, vwas = -1, flagwas = -1; for(bl = bezierlist; bl != NULL; bl = bl->cdr) { if(bl->car == NULL) continue; if((bez = (Bezier *)(bl->car)) == NULL) continue; if(bez->magic != BEZIERMAGIC) { GeomError(1/*warning-mismatch*/, "BezierListFSave: Non-Bezier object on BezierList: %x magic %x", bez, bez->magic); continue; } if(bez->dimn != dimwas || bez->geomflags != flagwas || bez->degree_u != uwas || bez->degree_v != vwas) { if(bez->dimn == 3 && bez->degree_u == 3 && bez->degree_v == 3 && !(bez->geomflags & BEZ_C)) { fputs(bez->geomflags & BEZ_ST ? "STBBP" : "BBP", f); } else { if(bez->geomflags & BEZ_C) fputc('C', f); fprintf(f, "BEZ%c%c%c", bez->degree_u + '0', bez->degree_v + '0', bez->dimn + '0'); if(bez->geomflags & BEZ_ST) fputs("_ST", f); } dimwas = bez->dimn; flagwas = bez->geomflags; uwas = bez->degree_u; vwas = bez->degree_v; } fputc('\n', f); p = bez->CtrlPnts; for(v = 0; v <= bez->degree_v; v++) { fputc('\n', f); for(u = 0; u <= bez->degree_u; u++) { if(bez->dimn == 4) fprintf(f, "%11.8g ", *p++); fprintf(f, "%11.8g %11.8g %11.8g\n", p[0], p[1], p[2]); p += 3; } } if(bez->geomflags & BEZ_ST) { fputc('\n', f); for(u = 0; u < 4; u++) fprintf(f, "%8g %8g ", bez->STCoords[u].s, bez->STCoords[u].t); } if(bez->geomflags & BEZ_C && bez->c != NULL) { fputc('\n', f); for(u = 0, p = (float *)bez->c; u < 4; u++, p += 4) fprintf(f, "%6g %6g %6g %6g\n", p[0], p[1], p[2], p[3]); } } return bezierlist; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/bezier/bezsphere.c0000644000175000017500000000274712310110200016345 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "create.h" #include "bezierP.h" Geom *BezierBoundSphere(Bezier *bezier, Transform T, TransformN *TN, int *axes, int space) { if(bezier->geomflags & BEZ_REMESH || bezier->mesh == NULL || bezier->mesh->p == NULL) { if(BezierReDice(bezier) == NULL) return NULL; /* Oh no */ } return MeshBoundSphere( bezier->mesh, T, TN, axes, space ); } geomview-1.9.5/src/lib/gprim/bezier/beztransform.c0000644000175000017500000000352212310110200017062 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include "hpoint3.h" #include "point3.h" #include "bezierP.h" Bezier * BezierTransform(Bezier *b, Transform T, TransformN *dummy) { int i; Point3 *p; HPoint3 *hp; int limit = (b->degree_u + 1)*(b->degree_v + 1); (void)dummy; if (b->CtrlPnts != NULL) { if (b->dimn == 3) for (i = 0, p = (Point3 *)b->CtrlPnts; i < limit; i++, p++) Pt3Transform(T, p, p); else if (b->dimn == 4) for (i = 0, hp = (HPoint3 *)b->CtrlPnts; i < limit; i++, hp++) HPt3Transform(T, hp, hp); else { OOGLError(1, "Bezier patch of unfamiliar dimensions."); return NULL; } } GeomDelete((Geom *)b->mesh); b->mesh = NULL; return(b); } geomview-1.9.5/src/lib/gprim/bezier/bezier.h0000644000175000017500000000430212310110200015630 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef BEZIERDEFS #define BEZIERDEFS #include "mesh.h" #include "list.h" #include "bsptree.h" #define BEZIERMAGIC GeomMagic ('b', 1) #define BEZ_ST VERT_ST #define BEZ_C VERT_C #define BEZ_4D VERT_4D #define BEZ_BINARY GEOMFLAG(0x01) #define BEZ_REMESH GEOMFLAG(0x02) /* need to recompute mesh */ #define MAX_BEZ_DEGREE 12 #define MAX_BEZ_DIMN 4 #define BEZ_DEFAULT_MESH_SIZE 10 typedef struct Bezier Bezier; GeomClass *BezierMethods(), *BezierListMethods(); Mesh *BezierReDice( Bezier * ); Bezier *BezierDice( Bezier *, int nu, int nv ); char *BezierListName(); List *BezierListLoad(); List *BezierListFLoad(); List *BezierListSave(); List *BezierListFSave(); char *BezierName(); BBox *BezierBound(); Geom *BezierBoundSphere( Bezier *, Transform T, TransformN *TN, int *axes, int ); Bezier *BezierEvert(); Bezier *BezierDraw( Bezier *bezier ); Bezier *BezierBSPTree(Bezier *bezier, BSPTree *tree, int action); Geom *BezierPick( Bezier *, Pick *, Appearance *, Transform, TransformN *, int *axes ); Bezier *BezierTransform( Bezier *, Transform, TransformN * ); int BezierExport(); int BezierUnexport(); Bezier *BezierImport(); #endif /* ! BEZIERDEFS */ geomview-1.9.5/src/lib/gprim/bezier/bezierP.h0000644000175000017500000000325312310110200015754 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef BEZIERPDEFS #define BEZIERPDEFS #include "geomclass.h" #include "bezier.h" #include "meshP.h" struct Bezier { GEOMFIELDS; int degree_u, degree_v, dimn; int nu, nv; /* these must match mesh dimensions or remake mesh */ float *CtrlPnts; TxST STCoords[4]; Mesh *mesh; Handle *meshhandle; /* to be able to define call-backs when remeshing */ ColorA c[4]; /* if flag & BEZ_C */ }; /* * Hidden routines, not user-callable */ extern Bezier *BezierCreate( Bezier *exist, GeomClass *, va_list *attrlist ); extern void BezierDelete( Bezier * ); extern Bezier *BezierCopy( Bezier * ); #endif /* ! BEZIERPDEFS */ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/bezier/Headers0000644000175000017500000000002312310110200015471 00000000000000bezier.h bezierP.h geomview-1.9.5/src/lib/gprim/comment/0000755000175000017500000000000012310165602014462 500000000000000geomview-1.9.5/src/lib/gprim/comment/Makefile.in0000644000175000017500000004646612310165553016474 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/comment DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libcomment_la_LIBADD = am_libcomment_la_OBJECTS = commentclass.lo commentcreate.lo \ commentsave.lo commentstream.lo libcomment_la_OBJECTS = $(am_libcomment_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libcomment_la_SOURCES) DIST_SOURCES = $(libcomment_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcomment.la libcomment_la_SOURCES = \ commentclass.c commentcreate.c commentsave.c commentstream.c \ comment.h commentP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/comment/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/comment/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libcomment.la: $(libcomment_la_OBJECTS) $(libcomment_la_DEPENDENCIES) $(EXTRA_libcomment_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libcomment_la_OBJECTS) $(libcomment_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commentclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commentcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commentsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commentstream.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/comment/Makefile.am0000644000175000017500000000031712310110200016417 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcomment.la libcomment_la_SOURCES = \ commentclass.c commentcreate.c commentsave.c commentstream.c \ comment.h commentP.h geomview-1.9.5/src/lib/gprim/comment/commentclass.c0000644000175000017500000000417612310110200017226 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Nathaniel Thurston */ #include "commentP.h" GeomClass *CommentClass = NULL; int CommentPresent = 1; static char commentName[] = "comment"; char * CommentName() { return commentName; } /* Comments should NOT be pickable... Mon Jun 20 19:46:55 1994 TMM */ static Geom * CommentPick(Geom *g, Pick *p, Appearance *ap, Transform T, TransformN *TN) { (void)g; (void)p; (void)ap; (void)T; (void)TN; return NULL; } GeomClass * CommentMethods() { if( !CommentClass ) { CommentClass = GeomClassCreate(commentName); CommentClass->name = CommentName; CommentClass->methods = (GeomMethodsFunc *)CommentMethods; CommentClass->create = (GeomCreateFunc *)CommentCreate; CommentClass->Delete = (GeomDeleteFunc *)CommentDelete; CommentClass->copy = (GeomCopyFunc *)CommentCopy; CommentClass->pick = (GeomPickFunc *)CommentPick; CommentClass->import = CommentImport; CommentClass->export = (GeomExportFunc *)CommentExport; } return CommentClass; } geomview-1.9.5/src/lib/gprim/comment/commentcreate.c0000644000175000017500000000557612310110200017371 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Nathaniel Thurston */ /* * Comment creation, editing, retrieval and deletion. */ #include "commentP.h" #include "transobj.h" void CommentDelete(Comment *comment) { if (comment) { if (comment->name) OOGLFree(comment->name); if (comment->type) OOGLFree(comment->type); if (comment->data) OOGLFree(comment->data); } } Comment * CommentCopy(Comment *comment) { Comment *nc; int datalength = comment->length; if (datalength == 0) datalength = strlen(comment->data)+1; nc = OOGLNewE(Comment, "CommentCopy: Comment"); GGeomInit(nc, comment->Class, comment->magic, NULL); nc->name = OOGLNewNE(char, strlen(comment->name)+1, "Comment name"); nc->type = OOGLNewNE(char, strlen(comment->type)+1, "Comment type"); nc->data = OOGLNewNE(char, datalength, "Comment data"); strcpy(nc->name, comment->name); strcpy(nc->type, comment->type); nc->length = comment->length; strcpy(nc->data, comment->data); return(nc); } Comment * CommentCreate (Comment *exist, GeomClass *classp, va_list *a_list) { Comment *comment; int attr; int copy = 1; if (exist == NULL) { comment = OOGLNewE(Comment, "CommentCreate comment"); GGeomInit (comment, classp, COMMENTMAGIC, NULL); comment->name = NULL; comment->type = NULL; comment->length = 0; comment->data = NULL; } else { /* Check that exist is an comment. */ comment = exist; } while ((attr = va_arg (*a_list, int))) { switch(attr) { default: if (GeomDecorate(comment, ©, attr, a_list)) { OOGLError (0, "CommentCreate: Undefined option: %d", attr); if (exist == NULL) GeomDelete ((Geom *)comment); return NULL; } } } return comment; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/comment/commentsave.c0000644000175000017500000000420112310110200017044 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Nathaniel Thurston */ /* * Save an Comment in a file. */ #include #include "commentP.h" static void ign_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) { size_t result; result = fwrite(ptr, size, nmemb, stream); (void)result; } Comment *CommentFSave(Comment *comment, FILE *file, char *fname) { (void)fname; if(comment == NULL || file == NULL) return NULL; fprintf(file, "COMMENT %s %s", comment->name, comment->type); if (comment->length == 0) fprintf(file, " {%s}\n", comment->data); else { fprintf(file, " %d ", comment->length); ign_fwrite(comment->data, comment->length, 1, file); fprintf(file, "\n"); } return comment; } Comment * CommentSave( comment, name ) Comment *comment; char *name; { FILE *file; file = fopen( name, "w" ); if( file == NULL ) { perror( name ); return NULL; } comment = CommentFSave( comment, file, name ); fclose(file); return comment; } geomview-1.9.5/src/lib/gprim/comment/commentstream.c0000644000175000017500000000615412310110200017412 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Nathaniel Thurston */ #include #include "commentP.h" #include "streampool.h" #include "handleP.h" static char * fbalanced(IOBFILE *file) { int depth = 1; int bufsize = 10240; char *buf = OOGLNewNE(char, bufsize, "Comment data"); char *bufp = buf; if (iobfexpectstr(file, "{")) return NULL; do { int c = EOF; if (bufp - buf >= bufsize - 2) buf = OOGLRenewNE(char, buf, bufsize += 10240, "Comment data"); while (bufp - buf < bufsize - 2) { *bufp++ = c = iobfgetc(file); if (c == '{' || c == '}') { break; } } switch(c) { case '}': depth--; break; case '{': depth++; break; } } while (depth > 0); *--bufp = '\0'; return OOGLRenewNE(char, buf, strlen(buf)+1, "Comment data"); } Geom * CommentImport( Pool *p ) { char *str; Comment *comment; IOBFILE *file; if (p == NULL || (file = PoolInputFile(p)) == NULL) return NULL; if (strcmp(GeomToken(file), "COMMENT")) return NULL; comment = (Comment *)GeomCCreate(NULL, CommentMethods(), NULL); if ((str = iobftoken(file, 0)) == NULL) return NULL; comment->name = OOGLNewNE(char, strlen(str)+1, "Comment name"); strcpy(comment->name, str); if ((str = iobftoken(file, 0)) == NULL) return NULL; comment->type = OOGLNewNE(char, strlen(str)+1, "Comment type"); strcpy(comment->type, str); if (iobfnextc(file, 0) == '{' ) { comment->data = fbalanced(file); /* read until '}' */ } else { if (iobfgetni(file, 1, &comment->length, 0) != 1) return NULL; if (comment->length == 0) return NULL; if (iobfexpectstr(file, " ")) return NULL; comment->data = OOGLNewNE(char, comment->length, "Comment data"); if (iobfread(comment->data, comment->length, 1, file) != 1) return NULL; } return (Geom *)comment; } int CommentExport( Comment *comment, Pool *pool ) { if (comment == NULL || pool == NULL || pool->outf == NULL) return 0; (void) CommentFSave(comment, pool->outf, ""); return 1; } geomview-1.9.5/src/lib/gprim/comment/comment.h0000644000175000017500000000312212310110200016173 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Nathaniel Thurston */ #ifndef COMMENTDEFS #define COMMENTDEFS /* * Private definitions for Comments */ #include "bbox.h" typedef struct Comment Comment; extern GeomClass *CommentClass; /* Public read-only; valid only * after first call to CommentMethods() */ extern GeomClass *CommentMethods( void ); extern Geom *CommentImport( Pool *p ); extern int CommentExport( Comment *, Pool * ); extern Comment *CommentLoad( char * ); extern Comment *CommentFLoad( FILE *, char *name ); extern Comment *CommentSave( Comment *, char * ); extern Comment *CommentFSave( Comment *, FILE *, char * ); #endif /*COMMENTDEFS*/ geomview-1.9.5/src/lib/gprim/comment/commentP.h0000644000175000017500000000324312310110200016317 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Nathaniel Thurston */ #ifndef COMMENTPDEFS #define COMMENTPDEFS /* * Private definitions for Comments. */ #include "comment.h" #include "bboxP.h" /* includes geomclass.h */ #define COMMENTMAGIC GeomMagic('c', 1) struct Comment { GEOMFIELDS; char *name; char *type; int length; /* 0 if data is ASCII */ char *data; }; extern GeomClass *CommentClass; /* Public read-only; valid only * after first call to CommentMethods() */ extern Comment *CommentCreate( Comment *exist, GeomClass *Class, va_list *attrs ); extern void CommentDelete( Comment * ); extern Comment *CommentCopy( Comment * ); extern Comment *CommentDice( Comment *, int nu, int nv ); #endif /*COMMENTPDEFS*/ geomview-1.9.5/src/lib/gprim/comment/Headers0000644000175000017500000000002512310110200015655 00000000000000comment.h commentP.h geomview-1.9.5/src/lib/gprim/discgrp/0000755000175000017500000000000012310165602014453 500000000000000geomview-1.9.5/src/lib/gprim/discgrp/Makefile.in0000644000175000017500000006060012310165554016450 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/discgrp DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libdg_la_LIBADD = am_libdg_la_OBJECTS = colormap.lo complex.lo dgbound.lo dgclass.lo \ dgconstraint.lo dgcopy.lo dgcreate.lo dgdelete.lo dgdirdom.lo \ dgdraw.lo dgenum.lo dgevert.lo dgmisc.lo dgpick.lo dgsave.lo \ dgstream.lo dgtransform.lo dhpoint3.lo matlist.lo outstack.lo \ polyhedron.lo projective.lo stack.lo util.lo weeks_dirdom.lo \ xform.lo libdg_la_OBJECTS = $(am_libdg_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libdg_la_SOURCES) DIST_SOURCES = $(libdg_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man5dir = $(mandir)/man5 am__installdirs = "$(DESTDIR)$(man5dir)" NROFF = nroff MANS = $(man_MANS) 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) man_MANS = discgrp.5gv EXTRA_DIST = Headers $(man_MANS) noinst_LTLIBRARIES = libdg.la libdg_la_SOURCES = \ colormap.c complex.c dgbound.c dgclass.c dgconstraint.c dgcopy.c dgcreate.c dgdelete.c dgdirdom.c dgdraw.c dgenum.c dgevert.c dgmisc.c dgpick.c dgsave.c dgstream.c dgtransform.c dhpoint3.c matlist.c outstack.c polyhedron.c projective.c stack.c util.c weeks_dirdom.c xform.c \ complex.h dgflag.h discgrp.h discgrpP.h enum.h extern.h options.h projective.h vec4.h winged_edge.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/discgrp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/discgrp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libdg.la: $(libdg_la_OBJECTS) $(libdg_la_DEPENDENCIES) $(EXTRA_libdg_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libdg_la_OBJECTS) $(libdg_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/colormap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgconstraint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgdelete.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgdirdom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgenum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgevert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgmisc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgstream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgtransform.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dhpoint3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matlist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/outstack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polyhedron.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/projective.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/weeks_dirdom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man5: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man5dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.5[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ done; } uninstall-man5: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man5dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.5[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man5dir)'; $(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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(MANS) installdirs: for dir in "$(DESTDIR)$(man5dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man5 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man5 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man5 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-man \ uninstall-man5 # 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: geomview-1.9.5/src/lib/gprim/discgrp/Makefile.am0000644000175000017500000000101612310110200016405 00000000000000INCLUDES = $(default_includes) man_MANS = discgrp.5gv EXTRA_DIST = Headers $(man_MANS) noinst_LTLIBRARIES = libdg.la libdg_la_SOURCES = \ colormap.c complex.c dgbound.c dgclass.c dgconstraint.c dgcopy.c dgcreate.c dgdelete.c dgdirdom.c dgdraw.c dgenum.c dgevert.c dgmisc.c dgpick.c dgsave.c dgstream.c dgtransform.c dhpoint3.c matlist.c outstack.c polyhedron.c projective.c stack.c util.c weeks_dirdom.c xform.c \ complex.h dgflag.h discgrp.h discgrpP.h enum.h extern.h options.h projective.h vec4.h winged_edge.h geomview-1.9.5/src/lib/gprim/discgrp/colormap.c0000644000175000017500000000555012310110200016340 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include #include "ooglutil.h" #include "color.h" ColorA builtin[] = { { 0.8, 0.1, 0.1, 0.75}, { 0.1, 0.65, 0.4, 0.75}, { 0.1, 0.1, 0.8, 0.75}, { 0.9, 0.6, 0, 0.75}, { 0, 0.6, 0.8, 0.75}, { 0.5, 0, 0.9, 0.75}, {.7, .15, .1, .75}, {.2, .2, .8, .75}, {.9, .6, .02, .75}, {.1, .3, .8, .75}, {.1, .7, .2, .75}, {.8, .8, .4, .75}, {.7, .7, 0, .75}, {.7, 0, .7, .75}, {0, .7, .7, .75}, {.9, 0, .2, .75}, {.2, .9, 0, .75}, {0, .2, .9, .75}, {.75, .75, .75, .75}, {.8, .4, 0, .75}, {.8, .4, 0, .75}, {0, .4, .8, .75}, {0, .4, .8, .75}, {0, .8, .4, .75}, {0, .8, .4, .75}, {.4, 0, .8, .75} }; ColorA *colormap = NULL; static int cnt; static int doneread = 0; static char default_name[] = "sample.cmap"; int readcmap(cmapfname) char *cmapfname; { FILE *fp; int size = 256; if (cmapfname == NULL) cmapfname = getenv("CMAP_FILE"); if (cmapfname == NULL) cmapfname = findfile(NULL, default_name); doneread = 1; fp = fopen(cmapfname,"r"); if (fp == NULL) goto ZXCV; cnt = 0; colormap = (ColorA *) malloc(sizeof(ColorA) * size); while (fscanf(fp, "%f%f%f%f", &colormap[cnt].r, &colormap[cnt].g, &colormap[cnt].b, &colormap[cnt].a) == 4) { cnt++; if (cnt > size) { size *= 2; colormap = (ColorA *) realloc(colormap, sizeof(ColorA) * size); if (colormap == NULL) goto ZXCV; } } return(cnt); /* fprintf(stderr,"readcmap: %d entries read\n",cnt); */ ZXCV: colormap = builtin; cnt = sizeof(builtin); return(cnt); } ColorA GetCmapEntry(n) int n; { if (!doneread) { char *cmapfile; cmapfile = getenv("CMAP_FILE"); fprintf(stderr,"Using CMAP_FILE environment variable to read color map\n"); readcmap(cmapfile); } if (n < 0 || n > cnt) return(colormap[0]); else return (colormap[n]); } geomview-1.9.5/src/lib/gprim/discgrp/complex.c0000644000175000017500000001151212310110200016166 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "options.h" #include "complex.h" complex one = {1.0, 0.0}; complex zero = {0.0, 0.0}; complex cplx_plus(z0, z1) complex z0, z1; { complex sum; sum.real = z0.real + z1.real; sum.imag = z0.imag + z1.imag; return(sum); } complex cplx_minus(z0, z1) complex z0, z1; { complex diff; diff.real = z0.real - z1.real; diff.imag = z0.imag - z1.imag; return(diff); } complex cplx_div(z0, z1) complex z0, z1; { double mod_sq; complex quotient; mod_sq = z1.real * z1.real + z1.imag * z1.imag; quotient.real = (z0.real * z1.real + z0.imag * z1.imag)/mod_sq; quotient.imag = (z0.imag * z1.real - z0.real * z1.imag)/mod_sq; return(quotient); } complex cplx_mult(z0, z1) complex z0, z1; { complex product; product.real = z0.real * z1.real - z0.imag * z1.imag; product.imag = z0.real * z1.imag + z0.imag * z1.real; return(product); } double modulus(z0) complex z0; { return( sqrt(z0.real * z0.real + z0.imag * z0.imag) ); } complex cplx_sqrt(z) complex z; { double mod, arg; complex result; mod = sqrt(modulus(z)); if (mod == 0.0) return(zero); arg = 0.5 * atan2(z.imag, z.real); result.real = mod * cos(arg); result.imag = mod * sin(arg); return(result); } void sl2c_mult(a, b, product) sl2c_matrix a, b, product; { sl2c_matrix temp; temp[0][0] = cplx_plus(cplx_mult(a[0][0], b[0][0]), cplx_mult(a[0][1], b[1][0])); temp[0][1] = cplx_plus(cplx_mult(a[0][0], b[0][1]), cplx_mult(a[0][1], b[1][1])); temp[1][0] = cplx_plus(cplx_mult(a[1][0], b[0][0]), cplx_mult(a[1][1], b[1][0])); temp[1][1] = cplx_plus(cplx_mult(a[1][0], b[0][1]), cplx_mult(a[1][1], b[1][1])); product[0][0] = temp[0][0]; product[0][1] = temp[0][1]; product[1][0] = temp[1][0]; product[1][1] = temp[1][1]; return; } void sl2c_copy(a, b) sl2c_matrix a, b; { a[0][0] = b[0][0]; a[0][1] = b[0][1]; a[1][0] = b[1][0]; a[1][1] = b[1][1]; return; } /* normalizes a matrix to have determinant one */ void sl2c_normalize(a) sl2c_matrix a; { complex det, factor; double arg, mod; /* compute determinant */ det = cplx_minus(cplx_mult(a[0][0], a[1][1]), cplx_mult(a[0][1], a[1][0])); if (det.real == 0.0 && det.imag == 0.0) { printf("singular sl2c_matrix\n"); exit(0); } /* convert to polar coordinates */ arg = atan2(det.imag, det.real); mod = modulus(det); /* take square root */ arg *= 0.5; mod = sqrt(mod); /* take reciprocal */ arg = -arg; mod = 1.0/mod; /* return to rectangular coordinates */ factor.real = mod * cos(arg); factor.imag = mod * sin(arg); /* normalize matrix */ a[0][0] = cplx_mult(a[0][0], factor); a[0][1] = cplx_mult(a[0][1], factor); a[1][0] = cplx_mult(a[1][0], factor); a[1][1] = cplx_mult(a[1][1], factor); return; } /* inverts a matrix; assumes determinant is already one */ void sl2c_invert(a, a_inv) sl2c_matrix a, a_inv; { complex temp; temp = a[0][0]; a_inv[0][0] = a[1][1]; a_inv[1][1] = temp; a_inv[0][1].real = -a[0][1].real; a_inv[0][1].imag = -a[0][1].imag; a_inv[1][0].real = -a[1][0].real; a_inv[1][0].imag = -a[1][0].imag; return; } /* computes the square of the norm of a matrix */ /* relies on the assumption that the sl2c matrix is stored in memory as 8 consecutive doubles */ /* IS THIS RELIABLE? */ double sl2c_norm_squared(a) sl2c_matrix a; { int i; double *p; double sum; p = (double *) a; sum = 0.0; for (i=8; --i>=0; ) { sum += *p * *p; p++; } return(sum); } void sl2c_adjoint(a, ad_a) sl2c_matrix a, ad_a; { complex temp; /* transpose */ temp = a[0][1]; ad_a[0][0] = a[0][0]; ad_a[0][1] = a[1][0]; ad_a[1][0] = temp; ad_a[1][1] = a[1][1]; /* conjugate */ ad_a[0][0].imag = -ad_a[0][0].imag; ad_a[0][1].imag = -ad_a[0][1].imag; ad_a[1][0].imag = -ad_a[1][0].imag; ad_a[1][1].imag = -ad_a[1][1].imag; return; } geomview-1.9.5/src/lib/gprim/discgrp/dgbound.c0000644000175000017500000000503212310110200016141 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" #include "discgrpP.h" BBox * DiscGrpBound(DiscGrp *discgrp, Transform T, TransformN *TN) { BBox *geombbox; Transform Tnew; GeomIter *it; #ifdef BADVELOCITY /* strange flying mode velocity comps require this */ int nels; #endif (void)TN; if( discgrp == NULL) return NULL; if (T == NULL) T = TM_IDENTITY; if (discgrp->geom == NULL) return NULL; it = GeomIterate( (Geom *)discgrp, DEEP ); geombbox = NULL; /* this is a horrible hack to allow us to continue to fly around at * reasonable speeds when in centercam mode, since the speed is * proportional to the bbox of the world. Solution: we only look * at the identity element's bbox */ #ifdef BADVELOCITY /* strange flying mode velocity comps require this */ if (discgrp->attributes & DG_SPHERICAL || discgrp->flag & DG_CENTERCAM) { nels = discgrp->big_list->num_el; discgrp->big_list->num_el = 1; } #endif while(NextTransform(it, Tnew) > 0) { BBox *box; TmConcat( Tnew, T, Tnew ); if((box = (BBox *)GeomBound(discgrp->geom, Tnew, NULL)) != NULL) { if(geombbox) { BBoxUnion3(geombbox, box, geombbox); GeomDelete((Geom *)box); } else geombbox = box; } } #ifdef BADVELOCITY if (discgrp->attributes & DG_SPHERICAL || discgrp->flag & DG_CENTERCAM) discgrp->big_list->num_el = nels; #endif return geombbox; } geomview-1.9.5/src/lib/gprim/discgrp/dgclass.c0000644000175000017500000000520012310110200016134 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "discgrpP.h" GeomClass *DiscGrpClass = NULL; int DiscGrpPresent = 1; static char discgrpName[] = "discgrp"; extern DiscGrp *DiscGrpCreate( DiscGrp *, GeomClass *, va_list * ); extern DiscGrp *DiscGrpDelete( DiscGrp * ); extern DiscGrp *DiscGrpCopy( DiscGrp * ); extern int DiscGrpGet( DiscGrp *, int attr, void *attrp ); extern GeomScanFunc DiscGrpHandleScan; char * DiscGrpName() { return discgrpName; } GeomClass * DiscGrpMethods() { if (!DiscGrpClass) { DiscGrpClass = GeomClassCreate(discgrpName); DiscGrpClass->name = DiscGrpName; DiscGrpClass->methods = (GeomMethodsFunc *) DiscGrpMethods; DiscGrpClass->create = (GeomCreateFunc *) DiscGrpCreate; DiscGrpClass->Delete = (GeomDeleteFunc *) DiscGrpDelete; DiscGrpClass->copy = (GeomCopyFunc *) DiscGrpCopy; DiscGrpClass->fsave = (GeomFSaveFunc *) DiscGrpFSave; DiscGrpClass->bound = (GeomBoundFunc *) DiscGrpBound; DiscGrpClass->pick = (GeomPickFunc *) DiscGrpPick; DiscGrpClass->draw = (GeomDrawFunc *) DiscGrpDraw; DiscGrpClass->scan = (GeomScanFunc *)DiscGrpHandleScan; DiscGrpClass->import = (GeomImportFunc *) DiscGrpImport; DiscGrpClass->get = (GeomGetFunc *) DiscGrpGet; /* DiscGrpClass->fload = (GeomFLoadFunc *) DiscGrpFLoad; DiscGrpClass->evert = (GeomEvertFunc *) DiscGrpEvert; DiscGrpClass->transform = (GeomTransformFunc *) DiscGrpTransform; DiscGrpClass->transformto = (GeomTransformToFunc *) DiscGrpTransformTo; */ } return DiscGrpClass; } geomview-1.9.5/src/lib/gprim/discgrp/dgconstraint.c0000644000175000017500000000407512310110200017224 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "discgrpP.h" static int constraint_depth; static float constraint_stored, constraint_printd; void DiscGrpInitStandardConstraint(int depth, float ind0, float ind1) { constraint_depth = depth; constraint_stored = ind0; constraint_printd = ind1; } static HPoint3 origin = {0.0, 0.0, 0.0, 1.0}; int DiscGrpStandardConstraint(DiscGrpEl *dgel) { int big=0, l; float d; HPoint3 image; int metric = dgel->attributes & DG_METRIC_BITS; extern double getnorm(); if ((l = strlen(dgel->word)) > constraint_depth) return(DG_CONSTRAINT_LONG); if (l == constraint_depth) big |= DG_CONSTRAINT_MAXLEN; /* find hyperbolic distance of image from origin: take short cut */ HPt3Transform(dgel->tform, &origin, &image); d = HPt3SpaceDistance(&origin, &image, metric); if ( d < constraint_stored) { big |= DG_CONSTRAINT_STORE; if ( d < constraint_printd) { big |= DG_CONSTRAINT_PRINT; } } else { big |= DG_CONSTRAINT_TOOFAR; } return(big); } geomview-1.9.5/src/lib/gprim/discgrp/dgcopy.c0000644000175000017500000000274612310110200016015 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "discgrpP.h" DiscGrp * DiscGrpCopy(obj) DiscGrp *obj; { DiscGrp *m; DiscGrp *om = obj; if (om == NULL) return (NULL); if ( (m = OOGLNew(DiscGrp)) == NULL ) { OOGLError(0,"Can't allocate space for discgrp"); return (NULL); } *m = *om; /* copy scalar fields */ return m; } geomview-1.9.5/src/lib/gprim/discgrp/dgcreate.c0000644000175000017500000002457512310110200016312 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "discgrp.h" #include "discgrpP.h" DiscGrp * DiscGrpSetPreDraw( DiscGrp *dg, void (*predraw)() ) { dg->predraw = predraw; return (dg); } DiscGrpElList * DiscGrpElListCreate (DiscGrpElList *exist, ...) { va_list a_list; DiscGrpElList *dgellist; DiscGrpEl *passedin; Transform *tformin; ColorA *colorin; char (*wordin)[DG_WORDLENGTH] = NULL; int *attrin; int attr, copy = 1; int i; va_start (a_list, exist); if (exist == NULL) { dgellist = OOGLNewE(DiscGrpElList, "DiscGrpElListCreate discgrp"); memset(dgellist, 0, sizeof(DiscGrpElList)); } else (dgellist = exist); while ((attr = va_arg (a_list, int))) switch (attr) { case CR_NELEM: dgellist->num_el = va_arg (a_list, int); if (dgellist->el_list) OOGLFree(dgellist->el_list); dgellist->el_list = OOGLNewNE(DiscGrpEl, dgellist->num_el, "DiscGrpElListCreate: unable to allocate"); memset(dgellist->el_list, 0, sizeof(DiscGrpEl) * dgellist->num_el); break; case DGCR_ELEM: /* already packed up */ passedin = va_arg (a_list, DiscGrpEl *); if (copy) { for (i=0; inum_el; ++i) { dgellist->el_list[i] = passedin[i]; TmCopy(passedin[i].tform, dgellist->el_list[i].tform); } } else { if (dgellist->el_list) OOGLFree(dgellist->el_list); dgellist->el_list = passedin; } break; case CR_ELEM: tformin = va_arg (a_list, Transform *); for (i=0; inum_el; ++i) TmCopy(tformin[i], dgellist->el_list[i].tform); break; case CR_COLOR: colorin = va_arg (a_list, ColorA *); for (i=0; inum_el; ++i) dgellist->el_list[i].color = colorin[i]; break; /* we assume attributes is constant for this list */ case DGCR_ATTRIBUTE: attr = va_arg (a_list, int); for (i=0; inum_el; ++i) dgellist->el_list[i].attributes = attr; break; /* or can be passed in as a list */ case DGCR_ATTRIBUTELIST: attrin = va_arg (a_list, int *); for (i=0; inum_el; ++i) dgellist->el_list[i].attributes = attrin[i]; break; case DGCR_WORD: wordin = (char (*)[DG_WORDLENGTH] ) va_arg (a_list, char *); for (i=0; inum_el; ++i) strcpy(dgellist->el_list[i].word, wordin[i]); break; default: if (GeomDecorate (dgellist, ©, attr, &a_list)) { GeomError (0, "DiscGrpElListCreate: Undefined option: %d", attr); OOGLFree (dgellist); return NULL; } } va_end (a_list); return(dgellist); } int DiscGrpGet(DiscGrp *discgrp, int attr, void *attrp) { switch (attr) { case DGCR_NAME: *(char **)attrp = discgrp->name; break; case DGCR_COMMENT: *(char **)attrp = discgrp->comment; break; case DGCR_FLAG: *(unsigned *)attrp = discgrp->flag; break; case DGCR_ATTRIBUTE: *(int *)attrp = discgrp->attributes; break; case DGCR_GENS: *(DiscGrpElList **)attrp = discgrp->gens; break; case DGCR_BIGLIST: *(DiscGrpElList **)attrp = discgrp->big_list; break; case DGCR_CPOINT: *(HPoint3 *)attrp = discgrp->cpoint; break; case DGCR_ENUMDEPTH: *(int *)attrp = discgrp->enumdepth; break; case DGCR_ENUMDIST: *(float *)attrp = discgrp->enumdist; break; case DGCR_DRAWDIST: *(float *)attrp = discgrp->drawdist; break; case DGCR_SCALE: *(float *)attrp = discgrp->scale; break; case DGCR_CAMGEOM: *(Geom **)attrp = discgrp->camgeom; break; case DGCR_CAMGEOMHANDLE: *(Handle **)attrp = discgrp->camgeomhandle; break; case DGCR_DDGEOM: *(Geom **)attrp = discgrp->ddgeom; break; case DGCR_DDGEOMHANDLE: *(Handle **)attrp = discgrp->ddgeomhandle; break; case CR_GEOM: *(Geom **)attrp = discgrp->geom; break; case CR_GEOMHANDLE: *(Handle **)attrp = discgrp->geomhandle; break; default: return -1; } return 1; } DiscGrp * DiscGrpCreate (DiscGrp *exist, GeomClass *classp, va_list *a_list) { DiscGrp *discgrp; int attr, copy = 1; Geom *g; Handle *h; if (exist == NULL) { discgrp = OOGLNewE(DiscGrp, "DiscGrpCreate discgrp"); memset(discgrp, 0, sizeof(DiscGrp)); GGeomInit (discgrp, classp, DISCGRPMAGIC, NULL); discgrp->flag = DG_DDSLICE; /* default is to slice off cusps */ discgrp->name = NULL; discgrp->comment = NULL; discgrp->attributes = 0; discgrp->c2m = NULL; discgrp->fsa = NULL; discgrp->dimn = 3; /* make a guess */ discgrp->gens = NULL; discgrp->nhbr_list = NULL; discgrp->big_list = NULL; discgrp->cpoint = DGorigin; discgrp->camgeom = NULL; discgrp->ddgeom = NULL; discgrp->geom = NULL; discgrp->camgeomhandle = NULL; discgrp->ddgeomhandle = NULL; discgrp->geomhandle = NULL; discgrp->scale = .2; discgrp->enumdepth = 2; discgrp->enumdist = 5.0; discgrp->drawdist = 5.0; discgrp->predraw = NULL; } else { /* Check that exist is a DiscGrp... */ discgrp = exist; } while ((attr = va_arg (*a_list, int))) switch (attr) { case DGCR_NAME: discgrp->name = va_arg (*a_list, char *); break; case DGCR_COMMENT: discgrp->comment = va_arg (*a_list, char *); break; case DGCR_FLAG: discgrp->flag = va_arg (*a_list, int); break; case DGCR_ATTRIBUTE: discgrp->attributes = va_arg (*a_list, int); break; case DGCR_GENS: discgrp->gens = va_arg (*a_list, DiscGrpElList *); break; case DGCR_BIGLIST: discgrp->big_list = va_arg (*a_list, DiscGrpElList *); break; case DGCR_CPOINT: { HPoint3 *cptr; cptr = va_arg (*a_list, HPoint3 *); discgrp->cpoint = *cptr; } break; case DGCR_ENUMDEPTH: discgrp->enumdepth = va_arg (*a_list, int); break; case DGCR_ENUMDIST: discgrp->enumdist = ((float) va_arg (*a_list, double)); break; case DGCR_DRAWDIST: discgrp->drawdist = ((float) va_arg (*a_list, double)); break; case DGCR_SCALE: discgrp->scale = ((float) va_arg (*a_list, double)); break; /* Geometries and their handles: copy the logic from InstCreate() and * duplicate it for ddgeom and camgeom. */ case CR_GEOMHANDLE: h = va_arg(*a_list, Handle *); if (copy) { REFINCR(h); } if (discgrp->geomhandle) { HandlePDelete(&discgrp->geomhandle); } discgrp->geomhandle = h; HandleRegister(&discgrp->geomhandle, (Ref *)discgrp, &discgrp->geom, HandleUpdRef); break; case CR_HANDLE_GEOM: h = va_arg(*a_list, Handle *); g = va_arg(*a_list, Geom *); if (copy) { REFINCR(h); REFINCR(g); } if (discgrp->geomhandle) { HandlePDelete(&discgrp->geomhandle); } if (discgrp->geom) { GeomDelete(discgrp->geom); } discgrp->geomhandle = h; discgrp->geom = g; if (h) { HandleRegister(&discgrp->geomhandle, (Ref *)discgrp, &discgrp->geom, HandleUpdRef); HandleSetObject(discgrp->geomhandle, (Ref *)g); } break; case CR_GEOM: g = va_arg (*a_list, Geom *); if (copy) { REFINCR(g); } if (discgrp->geom) { GeomDelete(discgrp->geom); } discgrp->geom = g; if (discgrp->geomhandle) { HandlePDelete(&discgrp->geomhandle); } break; case DGCR_CAMGEOMHANDLE: h = va_arg(*a_list, Handle *); if (copy) { REFINCR(h); } if (discgrp->camgeomhandle) { HandlePDelete(&discgrp->camgeomhandle); } discgrp->camgeomhandle = h; HandleRegister(&discgrp->camgeomhandle, (Ref *)discgrp, &discgrp->camgeom, HandleUpdRef); break; case DGCR_HANDLE_CAMGEOM: h = va_arg(*a_list, Handle *); g = va_arg(*a_list, Geom *); if (copy) { REFINCR(h); REFINCR(g); } if (discgrp->camgeomhandle) { HandlePDelete(&discgrp->camgeomhandle); } if (discgrp->camgeom) { GeomDelete(discgrp->camgeom); } discgrp->camgeomhandle = h; discgrp->camgeom = g; if (h) { HandleRegister(&discgrp->camgeomhandle, (Ref *)discgrp, &discgrp->camgeom, HandleUpdRef); HandleSetObject(discgrp->camgeomhandle, (Ref *)g); } break; case DGCR_CAMGEOM: g = va_arg (*a_list, Geom *); if (copy) { REFINCR(g); } if (discgrp->camgeom) { GeomDelete(discgrp->camgeom); } discgrp->camgeom = g; if (discgrp->camgeomhandle) { HandlePDelete(&discgrp->camgeomhandle); } break; case DGCR_DDGEOMHANDLE: h = va_arg(*a_list, Handle *); if (copy) { REFINCR(h); } if (discgrp->ddgeomhandle) { HandlePDelete(&discgrp->ddgeomhandle); } discgrp->ddgeomhandle = h; HandleRegister(&discgrp->ddgeomhandle, (Ref *)discgrp, &discgrp->ddgeom, HandleUpdRef); break; case DGCR_HANDLE_DDGEOM: h = va_arg(*a_list, Handle *); g = va_arg(*a_list, Geom *); if (copy) { REFINCR(h); REFINCR(g); } if (discgrp->ddgeomhandle) { HandlePDelete(&discgrp->ddgeomhandle); } if (discgrp->ddgeom) { GeomDelete(discgrp->ddgeom); } discgrp->ddgeomhandle = h; discgrp->ddgeom = g; if (h) { HandleRegister(&discgrp->ddgeomhandle, (Ref *)discgrp, &discgrp->ddgeom, HandleUpdRef); HandleSetObject(discgrp->ddgeomhandle, (Ref *)g); } break; case DGCR_DDGEOM: g = va_arg (*a_list, Geom *); if (copy) { REFINCR(g); } if (discgrp->ddgeom) { GeomDelete(discgrp->ddgeom); } discgrp->ddgeom = g; if (discgrp->ddgeomhandle) { HandlePDelete(&discgrp->ddgeomhandle); } break; default: if (GeomDecorate (discgrp, ©, attr, a_list)) { GeomError (0, "DiscGrpCreate: Undefined option: %d", attr); OOGLFree (discgrp); return NULL; } } return discgrp; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/discgrp/dgdelete.c0000644000175000017500000000377112310110200016304 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "discgrpP.h" DiscGrpElList * DiscGrpElListDelete (DiscGrpElList *exist) { if (exist) { if (exist->el_list) OOGLFree(exist->el_list); OOGLFree(exist); } return NULL; } DiscGrp * DiscGrpDelete(dg) DiscGrp *dg; { if (dg) { if (dg->name) OOGLFree(dg->name); if (dg->comment) OOGLFree(dg->comment); if (dg->fsa) OOGLFree(dg->fsa); if (dg->gens) { if (dg->gens->el_list) OOGLFree(dg->gens->el_list); OOGLFree(dg->gens); } if (dg->nhbr_list) { if (dg->nhbr_list->el_list) OOGLFree(dg->nhbr_list->el_list); OOGLFree(dg->nhbr_list); } if (dg->big_list) { if (dg->big_list->el_list) OOGLFree(dg->big_list->el_list); OOGLFree(dg->big_list); } if (dg->geom && dg->geom != dg->ddgeom) GeomDelete(dg->geom); if (dg->ddgeom) GeomDelete(dg->ddgeom); } return NULL; } geomview-1.9.5/src/lib/gprim/discgrp/dgdirdom.c0000644000175000017500000002710212310110200016312 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "polylistP.h" #include "discgrpP.h" #include "point.h" #include "winged_edge.h" #include "transform.h" #include "math.h" static WEpolyhedron *wepoly1, **wepoly2; HPoint3 DGorigin = {0,0,0,1}; HPoint3 DGrandom = {.1,.2,.3,.4}; extern void do_weeks_code(); static int is_id(Transform t) { int i,j; for (i=0; i<4; ++i) for (j=0; j<4; ++j) if (fabs(t[i][j] - (i == j)) > .0005) return(0); return(1); } /* make sure that the center point attached to the discrete group isn't fixed by some generator; if it is; redefine the center point to be the center of gravity of the orbit by the generators */ void DiscGrpCheckCPoint(DiscGrp *dg) { int i, cnt, fixed; HPoint3 tmp, out; float d; if (dg->gens == NULL) { return; } /* go through the generators, checking for fixed-pointed-ness */ for (i = 0, fixed = 0 ; i < dg->gens->num_el; ++i ) { HPt3Transform(dg->gens->el_list[i].tform, &dg->cpoint, &tmp); d = HPt3SpaceDistance(&dg->cpoint, &tmp, dg->attributes & DG_METRIC_BITS); if (fabs(d) < .0005) { fixed = 1; break; } } /* no fixed points */ if (fixed == 0) return; /* clean out the special bit */ for (i = 0 ; i < dg->gens->num_el; ++i ) dg->gens->el_list[i].attributes &= ~DG_TMP; out.x = out.y = out.z = out.w = 0.0; /* don't average but one of each generator, inverse pair */ for (cnt = 0, i = 0 ; i < dg->gens->num_el; ++i ) { if (!(dg->gens->el_list[i].attributes & DG_TMP)) { HPt3Transform(dg->gens->el_list[i].tform, &DGrandom, &tmp); HPt3Add(&tmp, &out, &out); dg->gens->el_list[i].inverse->attributes |= DG_TMP; cnt++; } } HPt3Dehomogenize(&out, &out); /* return it or set cpoint?? */ dg->cpoint = out; } void DiscGrpAddInverses(DiscGrp *discgrp) { int i, j, found = 0; Transform product; DiscGrpElList *newgens; /* remove all identity matrices */ for (j=0, i=0; igens->num_el; ++i) { if ( !is_id(discgrp->gens->el_list[i].tform) ) { /* ought to have a DiscGrpElCopy() */ discgrp->gens->el_list[j] = discgrp->gens->el_list[i]; TmCopy(discgrp->gens->el_list[i].tform, discgrp->gens->el_list[j].tform); j++; } } /* store the new count */ discgrp->gens->num_el = j; for (i=0; igens->num_el; ++i) { if (discgrp->gens->el_list[i].inverse == NULL) { /* look for inverse among the existing generators */ for (j=i; jgens->num_el; ++j) { TmConcat(discgrp->gens->el_list[i].tform, discgrp->gens->el_list[j].tform, product); if ( is_id(product) ) { discgrp->gens->el_list[i].inverse = &discgrp->gens->el_list[j]; discgrp->gens->el_list[j].inverse = &discgrp->gens->el_list[i]; found++; } } } else found++; } newgens = OOGLNew(DiscGrpElList); newgens->num_el = 2 * discgrp->gens->num_el - found; newgens->el_list = OOGLNewN(DiscGrpEl, newgens->num_el ); memcpy(newgens->el_list, discgrp->gens->el_list, sizeof(DiscGrpEl) * discgrp->gens->num_el); /* now go through looking for group elements without inverses */ { char c; j = discgrp->gens->num_el; for (i=0; igens->num_el; ++i) { if (newgens->el_list[i].inverse == NULL) { newgens->el_list[j+i] = newgens->el_list[i]; /* make the symbol of the inverse be the 'other case' */ c = newgens->el_list[i].word[0]; if (c < 'a') newgens->el_list[j+i].word[0] = c + 32; else newgens->el_list[j+i].word[0] = c - 32; TmInvert( newgens->el_list[i].tform, newgens->el_list[j+i].tform); newgens->el_list[j+i].inverse = &newgens->el_list[i]; newgens->el_list[i].inverse = &newgens->el_list[j+i]; } else j--; } } DiscGrpElListDelete(discgrp->gens); discgrp->gens = newgens; } void DiscGrpSetupDirdom(DiscGrp *discgrp) { WEpolyhedron *dd; if ( discgrp->nhbr_list ) { OOGLFree(discgrp->nhbr_list->el_list); OOGLFree(discgrp->nhbr_list); } /* worry about fixed points */ DiscGrpCheckCPoint(discgrp); dd = DiscGrpMakeDirdom(discgrp, &discgrp->cpoint, 0); discgrp->nhbr_list = DiscGrpExtractNhbrs(dd); } /* find the group element whose 'center point' is closest to the point poi */ DiscGrpEl * DiscGrpClosestGroupEl(DiscGrp *discgrp, HPoint3 *poi) { int count, i, closeri; int metric; float min = 0, d; HPoint3 pt0, pt1; DiscGrpEl *closer = NULL, *closest = OOGLNew(DiscGrpEl); Transform cinv; TmIdentity(closest->tform); closest->attributes = 0; if (!discgrp->nhbr_list) DiscGrpSetupDirdom(discgrp); metric = discgrp->attributes & (DG_METRIC_BITS); /* iterate until we're in the fundamental domain */ count = 0; closeri = -1; pt0 = *poi; while (count < 1000 && closeri != 0) { for (i = 0; inhbr_list->num_el; ++i) { HPt3Transform(discgrp->nhbr_list->el_list[i].tform, &discgrp->cpoint, &pt1); d = HPt3SpaceDistance(&pt0, &pt1, metric); if (i==0) { min = d; closer = &discgrp->nhbr_list->el_list[i]; closeri = i; } else if (d < min) { min = d; closer = &discgrp->nhbr_list->el_list[i]; closeri = i; } } count++; if (closeri) { TmConcat(closer->tform, closest->tform, closest->tform); /* move the point of interest by the inverse of the closest nhbr and iterate */ TmInvert(closest->tform, cinv); HPt3Transform(cinv, poi, &pt0); } /* if (needstuneup(closest->tform)) tuneup(closest->tform, metric); */ } if (is_id(closest->tform)) closest->attributes |= DGEL_IS_IDENTITY; return (closest); } static ColorA white = {1,1,1,1}; /* return a list of group elements corresponding to the faces of the dirichlet domain */ DiscGrpElList * DiscGrpExtractNhbrs( WEpolyhedron *wepoly ) { int i,j,k; WEface *fptr; DiscGrpElList *mylist; ColorA GetCmapEntry(); if (!wepoly) return(NULL); /* should use realloc() here to take care of large groups...*/ mylist = OOGLNew(DiscGrpElList); mylist->el_list = OOGLNewN(DiscGrpEl, wepoly->num_faces + 1); mylist->num_el = wepoly->num_faces + 1; /* include the identity matrix */ TmIdentity( mylist->el_list[0].tform); mylist->el_list[0].color = white; mylist->el_list[0].attributes = DGEL_IS_IDENTITY; /* read the matrices corresponding to the faces of dirichlet domain */ for (fptr = wepoly->face_list, k = 1; k<=wepoly->num_faces && fptr != NULL; k++, fptr = fptr->next) { for (i=0; i<4; ++i) for (j=0; j<4; ++j) /* the group elements stored in fptr are transposed! */ mylist->el_list[k].tform[j][i] = fptr->group_element[i][j]; mylist->el_list[k].color = GetCmapEntry(fptr->fill_tone); } if (mylist->num_el != k) OOGLError(1,"Incorrect number of nhbrs.\n");; return(mylist); } /* attempt to create a scaled copy of fundamental domain for spherical groups by taking weighted sum of vertices with the distinguished point */ static void DiscGrpScalePolyList(DiscGrp *dg, PolyList *dirdom, HPoint3 *pt0, float scale) { int i, metric; HPoint3 tmp1, tmp2, tpt0, tpt1; HPt3Copy(pt0, &tpt0); metric = dg->attributes & DG_METRIC_BITS; if (metric != DG_EUCLIDEAN) { HPt3SpaceNormalize(&tpt0, metric); HPt3Scale( 1.0 - scale, &tpt0, &tmp2); for (i=0; in_verts; ++i) { HPt3Copy(&dirdom->vl[i].pt, &tpt1); HPt3SpaceNormalize(&tpt1, metric); HPt3SpaceNormalize(&tpt1, metric); HPt3Scale( scale, &tpt1, &tmp1); HPt3Add(&tmp1, &tmp2, &dirdom->vl[i].pt); } } else { Transform T, TT, ITT, tmp; static HPoint3 average = {0,0,0,0}; /* compute average */ for (i=0; in_verts; ++i) HPt3Add(&average, &dirdom->vl[i].pt, &average); HPt3Dehomogenize(&average, &average); TmTranslate(TT, average.x, average.y, average.z ); TmInvert(TT, ITT); TmScale(T, scale, scale, scale); TmConcat(ITT, T, tmp); TmConcat(tmp, TT, tmp); for (i=0; in_verts; ++i) HPt3Transform(tmp, &dirdom->vl[i].pt, &dirdom->vl[i].pt); } } Geom *small_dd, *large_dd; Geom * DiscGrpDirDom(DiscGrp *dg) { Geom *oogldirdom; WEpolyhedron *dd; extern Geom *WEPolyhedronToPolyList(); Geom *mylist, *smlist; if (dg->flag & DG_DDBEAM) { WEpolyhedron *poly = DiscGrpMakeDirdom( dg, &dg->cpoint, 0); Geom *beams; beams = WEPolyhedronToBeams(poly, dg->scale); return(beams); } else { float scale; /* first a full-size, wireframe version of dd */ dd = DiscGrpMakeDirdom(dg, &dg->cpoint, 0); if (dd) { oogldirdom = WEPolyhedronToPolyList(dd); scale = 1.0; DiscGrpScalePolyList(dg, (PolyList *)oogldirdom, &dg->cpoint, scale); large_dd = oogldirdom; large_dd->ap = ApCreate(AP_DO, APF_EDGEDRAW, AP_DONT, APF_FACEDRAW, AP_END); } else return((Geom *) NULL); /* next a scaled version with cusps cut off */ dd = DiscGrpMakeDirdom(dg, &dg->cpoint, 1); if (dd) { oogldirdom = WEPolyhedronToPolyList(dd); DiscGrpScalePolyList(dg, (PolyList *)oogldirdom, &dg->cpoint, dg->scale); small_dd = oogldirdom; small_dd->ap = ApCreate(AP_DONT, APF_EDGEDRAW, AP_DO, APF_FACEDRAW, AP_END); } else return((Geom *) NULL); smlist = GeomCreate("list", CR_GEOM, small_dd, CR_END); mylist = GeomCreate("list", CR_GEOM, large_dd, CR_CDR, smlist, CR_END); return(mylist); } } WEpolyhedron * DiscGrpMakeDirdom(DiscGrp *gamma, HPoint3 *poi, int slice) { int i, j, k; proj_matrix *gen_list; point origin; int metric, transp; transp = gamma->attributes & DG_TRANSPOSED; /* transform from floating point to double, essentially */ gen_list = OOGLNewNE(proj_matrix, gamma->gens->num_el, "DiscGrp gens"); /* jeff week's code basically uses transposed matrices, so if the transposed flag is set, we do nothing, otherwise we have to transpose! */ for (i=0; igens->num_el; ++i) for (j=0; j<4; ++j) for (k=0; k<4; ++k) { if (transp) gen_list[i][j][k] = gamma->gens->el_list[i].tform[j][k]; else gen_list[i][k][j] = gamma->gens->el_list[i].tform[j][k]; } origin[0] = poi->x; origin[1] = poi->y; origin[2] = poi->z; origin[3] = poi->w; wepoly2 = &wepoly1; metric = (gamma->attributes & DG_METRIC_BITS); do_weeks_code(wepoly2, origin, gen_list, gamma->gens->num_el, metric,slice); OOGLFree(gen_list); /* turn off the 'new dirdom' bit */ gamma->flag &= ~DG_NEWDIRDOM; return(*wepoly2); } geomview-1.9.5/src/lib/gprim/discgrp/dgdraw.c0000644000175000017500000002176312310110200016000 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "discgrpP.h" #include "mgP.h" #include "math.h" /* this method is called before drawing, to set up a standard data * structure containing a description of the camera; the user can * replace it with his/her own routine that gets this information * from somewhere else. */ void DiscGrpStandardPreDraw(DiscGrp *discgrp) { float halfy, aspect, halfx; static float magic_scale = 1.2; /* we're about to mess around with the camera matrix; before doing so, get the current one (it's already been set for this frame) to use in culling later on */ if (discgrp->flag & (DG_DRAWCAM | DG_ZCULL | DG_CENTERCAM)) { /* get the pieces of the model to viewing transform */ CamGet(_mgc->cam, CAM_W2C, discgrp->viewinfo.w2c); TmInvert(discgrp->viewinfo.w2c, discgrp->viewinfo.c2w); /* concatenate the model to world coordinate transform */ mg_gettransform(discgrp->viewinfo.m2w); TmInvert(discgrp->viewinfo.m2w, discgrp->viewinfo.w2m); TmConcat(discgrp->viewinfo.m2w, discgrp->viewinfo.w2c, discgrp->viewinfo.m2c); TmInvert(discgrp->viewinfo.m2c, discgrp->viewinfo.c2m); CamGet(_mgc->cam, CAM_HALFYFIELD, &halfy); CamGet(_mgc->cam, CAM_ASPECT, &aspect); halfy = halfy * magic_scale; halfx = aspect * halfy; /* Hack to get culling to work -Celeste */ halfx = (halfx > halfy) ? halfx : halfy; halfy = halfx; /* the frustrum planes evaluate positive on cull-able points */ #define INITPT(ptr,xx,yy,zz,ww) { ((ptr)->x) = (xx); \ ((ptr)->y) = (yy); \ ((ptr)->z) = (zz); \ ((ptr)->w) = (ww); } INITPT(&discgrp->viewinfo.frustrum[0], -1, 0, halfx, 0) INITPT(&discgrp->viewinfo.frustrum[1], 1, 0, halfx, 0) INITPT(&discgrp->viewinfo.frustrum[2], 0, -1, halfy, 0) INITPT(&discgrp->viewinfo.frustrum[3], 0, 1, halfy, 0) } } static float visd1 = 2.0; /* for debugging */ DiscGrp * DiscGrpDraw(DiscGrp *discgrp) { static HPoint3 origin = {0,0,0,1}, cpos; Transform c2wprime; DiscGrpEl *nhbr; int metric; /* set up the viewing system dependent matrices, etc */ if (discgrp->predraw) (*discgrp->predraw)(discgrp); else DiscGrpStandardPreDraw(discgrp); metric = discgrp->attributes & DG_METRIC_BITS; /* make sure we have some geometry to display; the control code * is a bit suspiciously topheavy */ if (discgrp->geom == NULL || discgrp->flag & DG_NEWDIRDOM || (discgrp->flag & DG_DRAWDIRDOM && discgrp->ddgeom == NULL)) { discgrp->ddgeom = DiscGrpDirDom(discgrp); if (discgrp->geom == NULL ) discgrp->geom = discgrp->ddgeom; /* turn off the alarm */ discgrp->flag &= ~DG_NEWDIRDOM; if (!discgrp->ddgeom) { OOGLError(1,"DiscGrpDraw: Unable to create dirichlet domain\n"); } } /* be sure we have some group elements */ if (discgrp->big_list == NULL ) { if (discgrp->nhbr_list != NULL) { discgrp->big_list = discgrp->nhbr_list; } else { return(discgrp); } } /* * the main idea here is to find out the position of the current camera * and use it to make sure the group elements used are centered at the * camera. We do this by looking at the orbit of the origin and seeing * if the camera is closer to */ if (discgrp->flag & DG_CENTERCAM ) { Transform cinv, hprime, h; /* use it to derive the model coordinates of the camera */ HPt3Transform(discgrp->viewinfo.c2m, &origin, &cpos); /* compute the group element which is 'closest' to the camera */ nhbr = DiscGrpClosestGroupEl(discgrp, &cpos); /* apply the inverse of this transform to the camera */ TmInvert(nhbr->tform, h); /* this requires conjugating cinv by the w2m transform: * * C --- c2w ---> W ---- w2m ----> M * \ | | * \ h' h = nhbr->tform inverse * c2w' | | * \---------> W <--- m2w ----- M * * In the above diagram we want c2w' = c2w h' */ TmConcat(h, discgrp->viewinfo.m2w, cinv); TmConcat(discgrp->viewinfo.w2m, cinv, hprime); TmConcat(discgrp->viewinfo.c2w, hprime, c2wprime); if (discgrp->attributes & DG_HYPERBOLIC && needstuneup(c2wprime)) { tuneup(c2wprime, metric); if (needstuneup(c2wprime)) OOGLError(1,"DiscGrpDraw: tuneup failed\n"); } CamSet(_mgc->cam, CAM_C2W, c2wprime, CAM_END); } { int viscnt = 0; /*float ratio = 1.0;*/ HPoint3 image; int vis; float d; Transform tile2c; #ifdef UNNECESSARY extern Geom *large_dd, *small_dd; /*very ugly but appearances don't work correctly when pushed down into a list */ #endif Transform Tnew; GeomIter *it; it = GeomIterate( (Geom *)discgrp, DEEP ); /* loop through them */ while(NextTransform(it, Tnew) > 0) { vis = 1; if (discgrp->flag & DG_ZCULL) { TmConcat(Tnew, discgrp->viewinfo.m2c, tile2c); HPt3Transform(tile2c, &discgrp->cpoint, &image); d = HPt3SpaceDistance(&image, &discgrp->cpoint, metric); /* discard images that are too far away */ if (d > discgrp->drawdist) vis = 0; /* some close copies are guaranteed to be drawn... */ else if (d > visd1 ) { /* only discard far-away tiles */ /* first discard the ones behind the eye, if that makes sense */ if (metric != DG_SPHERICAL && image.z*image.w > 0.0) vis = 0; else { /* then test outside the camera frustrum */ { int i; for (i=0; i<4; ++i) { d = HPt3R40Dot(&image, &discgrp->viewinfo.frustrum[i]); if ( d > 0) { vis = 0; break; } } } } } } /* if the tile has passed the visibility tests... */ if (vis) { viscnt++; mgpushtransform(); mgtransform( Tnew ); /* while the appearance stuff doesn't work correctly, we have to * commit some pretty terrible crimes...we'd like to be able to * just say GeomDraw(discgrp->geom)...but we can't as long as * appearances don't work as advertised */ if (discgrp->ddgeom && discgrp->flag & DG_DRAWDIRDOM) { if (discgrp->flag & DG_DDBEAM) GeomDraw(discgrp->ddgeom); else { GeomDraw(discgrp->ddgeom); #ifdef UNNECESSARY mgpushappearance(); mgctxset(MG_ApSet, AP_DONT, APF_FACEDRAW, AP_DO, APF_EDGEDRAW, AP_END, MG_END); GeomDraw(large_dd); mgpopappearance(); mgpushappearance(); mgctxset(MG_ApSet, AP_DO, APF_FACEDRAW, AP_END, MG_END); GeomDraw(small_dd); mgpopappearance(); #endif /*UNNECESSARY*/ } } if (discgrp->flag & DG_DRAWGEOM && discgrp->geom && discgrp->geom != discgrp->ddgeom) GeomDraw( discgrp->geom ); if ((discgrp->flag & DG_DRAWCAM) && (discgrp->camgeom)) { mgpushtransform(); mgtransform( discgrp->viewinfo.c2m ); GeomDraw(discgrp->camgeom); mgpoptransform(); } mgpoptransform(); } } /* for debugging to see how culling works */ /*ratio = viscnt / ((double) discgrp->big_list->num_el);*/ } return(discgrp); } #ifdef REASONABLE TmScale( scaler, discgrp->scale, discgrp->scale, discgrp->scale); large = DiscGrpDirDom(discgrp, &discgrp->cpoint); large->ap = ApCreate(AP_DO, APF_EDGEDRAW, AP_DONT, APF_FACEDRAW, AP_END); ap = ApCreate(AP_DONT, APF_EDGEDRAW, AP_DO, APF_FACEDRAW, AP_END); small = GeomCreate("inst", CR_GEOM, large, CR_AXIS, scaler, CR_APPEAR, ap, CR_END); smlist = GeomCreate("list", CR_GEOM, small, CR_END); mylist = GeomCreate("list", CR_GEOM, large, CR_CDR, smlist, CR_END); discgrp->ddgeom = mylist; TmScale( scaler, discgrp->scale, discgrp->scale, discgrp->scale); Tm3SpaceTranslateOrigin(tlate, &discgrp->cpoint, metric); /* perform translation so cpoint is at origin */ TmInvert(tlate, invtlate); /* apply scaling transform centered at cpoint */ TmConcat(invtlate, scaler, tmp); /* and move cpoint back to where it started */ TmConcat(tmp, tlate, tmp); d = HPt3SpaceDistance( &discgrp->cpoint, &image, metric); #else #endif geomview-1.9.5/src/lib/gprim/discgrp/dgenum.c0000644000175000017500000001371612310110200016006 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "wa.h" #include "vec4.h" #include "dgflag.h" #include "enum.h" #include "color.h" #include "3d.h" #include "ooglutil.h" #include "discgrpP.h" static DiscGrp *mydg; static ColorA white = {1,1,1,.75}; /*static DiscGrpEl grpel;*/ static Transform mlist[128]; static int (*constraintfn)(); int check_big = 1, /* this is currently never non-zero */ check_new = 1, /* ditto */ have_matrices = 1, metric = DG_HYPERBOLIC, stringent = 0; int long_cnt = 0, same_cnt = 0, far_cnt = 0, print_cnt = 0, store_cnt = 0; /*static int numchunks = 1;*/ static int ngens = 0; int debug = 0; static char symbollist[64]; static void get_matrices(); int getindex(c) char c; { int i; for (i=0; itform); if (is_n) { is_big = constraintfn(dgel); if (is_big & DG_CONSTRAINT_LONG) long_cnt++; if (is_big & DG_CONSTRAINT_PRINT) print_cnt++; if (is_big & DG_CONSTRAINT_STORE) store_cnt++; if (is_big & DG_CONSTRAINT_TOOFAR) far_cnt++; } else same_cnt++; return(is_big | is_n ); } static int process(DiscGrpEl *dgel, int stacking) { int is_ok = 0; if (have_matrices) { is_ok = is_big_and_new(dgel); /* remember that only NEW and PRINT are required to be here */ if (is_ok & DG_CONSTRAINT_NEW ) { if (!(is_ok & DG_CONSTRAINT_LONG)) { if (is_ok & (DG_CONSTRAINT_STORE | DG_CONSTRAINT_PRINT)) { if (check_new) { insert_mat(dgel->tform); /* and put it on the stack */ if (stacking) push_new_stack(dgel->word); } if (is_ok & DG_CONSTRAINT_PRINT) enumpush(dgel); } } } } return(is_ok); } static int enumerate(int state, int depth, DiscGrpEl *dgel) { int i, newstate, pval; if ( ! ((pval = process(dgel, 0)) & DG_CONSTRAINT_STORE)) return 0; if (pval & DG_CONSTRAINT_MAXLEN) return 0; if (depth > MAXDEPTH) return 0; for (i=1; ifsa->ngens; ++i) { newstate = mydg->fsa->action[state][i]; if ( newstate != mydg->fsa->fail) { dgel->word[depth] = mydg->fsa->genlist[i-1][0]; dgel->word[depth+1] = 0; /* null-terminate */ word_to_mat(dgel->word, dgel->tform); enumerate(newstate, depth+1, dgel); } } return 1; } static int dumb_enumerate(int depth, DiscGrpEl *dgel) { int i, j; char *word; extern char *pop_old_stack(); (void)depth; init_stack(); process(dgel, 1); for (j = 0; j < MAXDEPTH ; ++j) { make_new_old(); /* are we interested in his descendents ? */ while ( (word = pop_old_stack()) != NULL) { /* these words have length j */ strcpy(dgel->word, word); for (i=0; iword[j] = symbollist[i]; dgel->word[j+1] = 0; /* null-terminate */ word_to_mat(dgel->word, dgel->tform); process(dgel, 1); } } } return 1; } /*static char emptyword[64] = "";*/ /* * hack together an enumerate routine */ DiscGrpElList * DiscGrpEnum(DiscGrp *discgrp, int (* constraint)(void) ) { DiscGrpElList *enum_list = OOGLNewE(DiscGrpElList, "DiscGrpEnum"); extern DiscGrpEl *enumgetstack(); DiscGrpEl dgel; /* initialize the local variables */ constraintfn = constraint; have_matrices = 1; same_cnt = 0; far_cnt = 0; print_cnt = 0; store_cnt = 0; long_cnt = 0; ngens = discgrp->gens->num_el; metric = discgrp->attributes & DG_METRIC_BITS; memset(dgel.word, 0, sizeof(dgel.word)); dgel.attributes = discgrp->attributes; TmIdentity(dgel.tform); dgel.color = white; mydg = discgrp; init_out_stack(); get_matrices(); if (mydg->fsa) enumerate(mydg->fsa->start, 0, &dgel); else dumb_enumerate(0,&dgel); /* clean up the mess */ delete_list(); enum_list->num_el = enumgetsize(); enum_list->el_list = enumgetstack(); if (mydg->flag & DG_DEBUG) { fprintf(stderr,"%d elements printed \n",print_cnt); fprintf(stderr,"%d elements stored \n",store_cnt); fprintf(stderr,"%d elements move too far \n",far_cnt); fprintf(stderr,"%d elements too long \n",long_cnt); fprintf(stderr,"%d elements duplicates \n",same_cnt); } return(enum_list); } static void get_matrices() { int i; for (i=0; igens->num_el; ++i) { symbollist[i] = mydg->gens->el_list[i].word[0]; TmCopy(mydg->gens->el_list[i].tform, mlist[i]); } fprintf(stderr,"%d generators read\n",i); } geomview-1.9.5/src/lib/gprim/discgrp/dgevert.c0000644000175000017500000000240212310110200016155 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "discgrpP.h" DiscGrp * DiscGrpEvert(dg) DiscGrp *dg; { return dg; } geomview-1.9.5/src/lib/gprim/discgrp/dgmisc.c0000644000175000017500000000307212310110200015767 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "discgrpP.h" void DiscGrpHandleScan( DiscGrp *dg, int (*func)(), void *arg ) { if(dg == NULL) return; if(dg->geomhandle) (*func)(&dg->geomhandle, dg, arg); if(dg->ddgeomhandle) (*func)(&dg->ddgeomhandle, dg, arg); if(dg->camgeomhandle) (*func)(&dg->camgeomhandle, dg, arg); if(dg->geom) GeomHandleScan(dg->geom, func, arg); if(dg->ddgeom) GeomHandleScan(dg->ddgeom, func, arg); if(dg->camgeom) GeomHandleScan(dg->camgeom, func, arg); } geomview-1.9.5/src/lib/gprim/discgrp/dgpick.c0000644000175000017500000000364712310110200015772 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include "discgrpP.h" #include "ooglutil.h" #include "pickP.h" DiscGrp * DiscGrpPick(DiscGrp *dg, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { int elem = 0, pathInd; Transform t; GeomIter *it; DiscGrp *v = NULL; (void)axes; if (TN) return NULL; if(dg == NULL || dg->geom == NULL) return NULL; pathInd = VVCOUNT(p->gcur); vvneeds(&p->gcur, pathInd + 1); VVCOUNT(p->gcur)++; it = GeomIterate((Geom *)dg, DEEP); while(NextTransform(it, t)) { *VVINDEX(p->gcur, int, pathInd) = elem; TmConcat(t,T, t); if(GeomPick(dg->geom, p, ap, t, NULL, NULL)) v = dg; elem++; } VVCOUNT(p->gcur)--; return v; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/discgrp/dgsave.c0000644000175000017500000000661012310110200015773 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "discgrpP.h" extern keytokenpair attr_list[], dspyattr_list[]; DiscGrp * DiscGrpFSave(DiscGrp *dg, FILE *fp, char *fname) { int i; fprintf(fp,"DISCGRP\n"); if (dg->name) fprintf(fp,"(group \" %s \" )\n",dg->name); if (dg->comment) fprintf(fp,"(comment \" %s \" )\n",dg->comment); for (i=0; iattributes & attr_list[i].token) fprintf(fp,"(attribute %s )\n",attr_list[i].key); } for (i=0; iflag & dspyattr_list[i].token) fprintf(fp,"(display %s )\n",dspyattr_list[i].key); } fprintf(fp,"(dimn %d )\n",dg->dimn); fprintf(fp,"(ngens %d )\n",dg->gens->num_el); fprintf(fp,"(gens\n"); for (i=0; igens->num_el; ++i) { fprintf(fp,"%s\n",dg->gens->el_list[i].word); fputtransform(fp, 1, (float *)dg->gens->el_list[i].tform, 0); } fprintf(fp,")\n"); if (dg->flag & DG_SAVEBIGLIST && dg->big_list) { fprintf(fp,"(nels %d )\n",dg->big_list->num_el); fprintf(fp,"(els\n"); for (i=0; ibig_list->num_el; ++i) { fprintf(fp,"# %s\n",dg->big_list->el_list[i].word); fputtransform(fp, 1, (float *)dg->big_list->el_list[i].tform, 0); } fprintf(fp,")\n"); } fprintf(fp,"(cpoint %f %f %f %f )\n", dg->cpoint.x, dg->cpoint.y, dg->cpoint.z, dg->cpoint.w); if (dg->c2m) { fprintf(fp,"(c2m "); fputtransform(fp, 1, (float *) dg->c2m, 0); fprintf(fp,")\n"); } fprintf(fp,"(enumdepth %d )\n",dg->enumdepth); fprintf(fp,"(enumdist %g )\n",dg->enumdist); fprintf(fp,"(drawdist %g )\n",dg->drawdist); fprintf(fp,"(scale %g )\n",dg->scale); if (dg->geom && dg->geom != dg->ddgeom) { fprintf(fp,"(geom\n"); GeomFSave(dg->geom, fp, fname); fprintf(fp,")\n"); } else if (dg->ddgeom && dg->flag & DG_SAVEDIRDOM ) { fprintf(fp,"(geom\n"); GeomFSave(dg->ddgeom, fp, fname); fprintf(fp,")\n"); } if (dg->camgeom) { fprintf(fp,"(camgeom\n"); GeomFSave(dg->camgeom, fp, fname); fprintf(fp,")\n"); } return(dg); } DiscGrp* DiscGrpSave(DiscGrp *dg, char *name) { DiscGrp *tdg; FILE *outf; outf = fopen(name, "w"); if (!outf) { OOGLError(1,"Unable to open file %s\n",name); return NULL; } tdg = DiscGrpFSave(dg, outf, name); fclose(outf); return (tdg); } geomview-1.9.5/src/lib/gprim/discgrp/dgstream.c0000644000175000017500000003017512310110200016333 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "discgrpP.h" #include "options.h" #include "complex.h" /* in case file has elements of SL(2,C) */ #include #include "mgP.h" #include "streampool.h" #include "transobj.h" #include "handleP.h" #include "projective.h" int fsaparse(); #define DG_GROUPNAME 1 #define DG_COMMENT 2 #define DG_ATTRIBUTE 3 #define DG_MODEL 4 #define DG_NGENS 5 #define DG_NELS 6 #define DG_GENS 7 #define DG_ELS 8 #define DG_DIMN 9 #define DG_CAMGEOM 10 #define DG_GEOM 11 #define DG_CAMGEOMFILE 12 #define DG_GEOMFILE 13 #define DG_WAFILE 14 #define DG_MATRIXGROUP 15 #define DG_CPOINT 16 #define DG_ENUMDEPTH 17 #define DG_ENUMDIST 18 #define DG_DSPYATTR 19 #define DG_SCALE 20 #define DG_C2M 21 #define DG_DRAWDIST 22 #define DG_NUMKEYWORDS 24 /* 2 redundant keywords */ keytokenpair keytokenlist[] = { {"group", DG_GROUPNAME}, {"comment", DG_COMMENT}, {"attribute", DG_ATTRIBUTE}, {"model", DG_MODEL}, {"ngens", DG_NGENS}, {"nels", DG_NELS}, {"gens", DG_GENS}, {"els", DG_ELS}, {"dimn", DG_DIMN}, {"dimension", DG_DIMN}, {"camgeom", DG_CAMGEOM}, {"geom", DG_GEOM}, {"camgeomfile", DG_CAMGEOMFILE}, {"geomfile", DG_GEOMFILE}, {"wafile", DG_WAFILE}, {"matrixgroup", DG_MATRIXGROUP}, {"mgroup", DG_MATRIXGROUP}, {"cpoint", DG_CPOINT}, {"enumdepth", DG_ENUMDEPTH}, {"enumdist", DG_ENUMDIST}, {"drawdist", DG_DRAWDIST}, {"display", DG_DSPYATTR}, {"scale", DG_SCALE}, {"cam2model", DG_C2M} }; keytokenpair attr_list[DG_NUM_ATTR] = { {"hyperbolic", DG_HYPERBOLIC}, {"euclidean", DG_EUCLIDEAN}, {"spherical", DG_SPHERICAL}, {"finite", DG_FINITE}, {"transposed", DG_TRANSPOSED}, {"conformalball", DG_CONFORMALBALL}, {"upperhalfspace", DG_UPPERHALFSPACE}, {"projective", DG_PROJECTIVEMODEL} }; keytokenpair dspyattr_list[DG_NUM_DSPYATTR] = { {"centercam", DG_CENTERCAM}, {"zcull", DG_ZCULL}, {"drawcam", DG_DRAWCAM}, {"drawdirdom", DG_DRAWDIRDOM}, {"drawgeom", DG_DRAWGEOM} }; /* Name can be {GL | SL | SO } ( {n},{k},{R | C} ) */ matrixgroup cgroup = { DG_GENERAL | DG_REAL, 4, 0}; static char delims[] = "%{}();"; static char errfmt[] = "Reading discrete group from \"%s\": %s"; static int token_from_string(char *s, keytokenpair *kl, int n) { int i; for (i=0; inum_el; ++i) { dgellist->el_list[i].attributes = 0; dgellist->el_list[i].color = white; dgellist->el_list[i].inverse = NULL; c = iobfnextc(fp, 0); /* get the name if it's alphabetic */ if ( c >= 'A' && c <= 'z' ) { name = iobfdelimtok(delims, fp, 0); if (strlen(name) > DG_WORDLENGTH) { OOGLSyntax(fp,"Reading discrete group from \"%s\": Words limited to length %d", fname, DG_WORDLENGTH); return; } strcpy(dgellist->el_list[i].word, name); } else { /* make up a name for this gen */ dgellist->el_list[i].word[0] = 'a' + i; dgellist->el_list[i].word[1] = 0; } switch(discgrp->attributes & DG_MODEL_BITS){ case DG_CONFORMALBALL: OOGLSyntax(fp,errfmt,fname,"Unimplemented conformal model"); break; case DG_UPPERHALFSPACE: { sl2c_matrix mylf; proj_matrix mypm; int k,m; for (k=0; k<2; ++k) for (m=0; m<2; ++m) { iobfgetnd(fp, 1, &mylf[k][m].real, 0); iobfgetnd(fp, 1, &mylf[k][m].imag, 0); } sl2c_to_proj(mylf, mypm); for (k=0; k<4; ++k) for (m=0; m<4; ++m) dgellist->el_list[i].tform[k][m] = mypm[k][m]; } break; default: if (iobfgettransform(fp,1,(float *)dgellist->el_list[i].tform,0) != 1) { OOGLSyntax(fp,errfmt,fname,"Error reading generator"); return; } if (discgrp->attributes & DG_TRANSPOSED) TmTranspose(dgellist->el_list[i].tform, discgrp->big_list->el_list[i].tform); break; } } discgrp->attributes &= ~DG_UPPERHALFSPACE; } Geom * DiscGrpImport(Pool *p) { char *name, *fname; char keyword[DG_KEYWORDSIZE]; DiscGrp *discgrp; IOBFILE *fp; FILE *wafp; char *expect; if(p == NULL || (fp = PoolInputFile(p)) == NULL) return 0; /* check for 'DISCGRP' at head of file */ if(strcmp(GeomToken(fp), "DISCGRP")) return(NULL); /* now the parentheses begin */ if (iobfnextc(fp, 0) != '(') return(NULL); discgrp = (DiscGrp*)GeomCreate("discgrp",CR_END); while (get_keyword(fp, keyword,p->poolname)) { switch ( token_from_string(keyword, keytokenlist,sizeof(keytokenlist)/sizeof(keytokenpair) )) { case DG_WAFILE: name = iobfdelimtok(delims, fp, 0); fname = findfile(PoolName(p), name); if(fname == NULL || (wafp = fopen(fname, "rb")) == NULL) { OOGLSyntax(fp, "Reading discrete group from \"%s\": can't open wafile \"%s\"", p->poolname, name); return(NULL); } discgrp->fsa = OOGLNew(wa); fsaparse(wafp, discgrp->fsa); fclose(wafp); break; case DG_DSPYATTR: name = iobfdelimtok(delims, fp, 0); discgrp->flag |= token_from_string(name, dspyattr_list,sizeof(dspyattr_list)/sizeof(keytokenpair)); break; case DG_ATTRIBUTE: case DG_MODEL: name = iobfdelimtok(delims, fp, 0); discgrp->attributes |= token_from_string(name, attr_list,sizeof(attr_list)/sizeof(keytokenpair)); break; case DG_COMMENT: discgrp->comment = strdup(iobfdelimtok(delims, fp, 0)); break; case DG_MATRIXGROUP: parse_group_name(iobfdelimtok(delims, fp, 0)); break; case DG_SCALE: if(iobfgetnf(fp, 1, &discgrp->scale, 0) <= 0) { OOGLSyntax(fp,errfmt, p->poolname, "Invalid scale"); return(NULL); } break; case DG_C2M: discgrp->c2m = (float (*)[4])OOGLNewNE(float, 16, "Transform"); if (iobfgettransform(fp,1,(float *)discgrp->c2m,0) != 1) { OOGLSyntax(fp,errfmt,p->poolname,"Error reading cam2model"); return(NULL); } break; case DG_ENUMDEPTH: if(iobfgetni(fp, 1, &discgrp->enumdepth, 0) <= 0) { OOGLSyntax(fp,errfmt, p->poolname, "Invalid enumdepth"); return(NULL); } break; case DG_ENUMDIST: if(iobfgetnf(fp, 1, &discgrp->enumdist, 0) <= 0) { OOGLSyntax(fp,errfmt, p->poolname, "Invalid enumdist"); return(NULL); } break; case DG_DRAWDIST: if(iobfgetnf(fp, 1, &discgrp->drawdist, 0) <= 0) { OOGLSyntax(fp,errfmt, p->poolname, "Invalid drawdist"); return(NULL); } break; case DG_CPOINT: if(iobfgetnf(fp, 4, (float *)&discgrp->cpoint, 0) <= 0) { OOGLSyntax(fp,errfmt, p->poolname, "Invalid Cpoint"); return(NULL); } break; case DG_CAMGEOM: expect = "camgeometry"; if(!GeomStreamIn(p, &discgrp->camgeomhandle, &discgrp->camgeom)) goto failed; if(discgrp->camgeomhandle) HandleRegister(&discgrp->camgeomhandle, (Ref *)discgrp, &discgrp->camgeom, HandleUpdRef); break; case DG_ELS: discgrp->big_list->mgroup = cgroup; get_el_list(discgrp, discgrp->big_list, fp, p->poolname); discgrp->flag |= DG_SAVEBIGLIST; break; case DG_GROUPNAME: discgrp->name = strdup(iobfdelimtok(delims, fp, 0)); break; case DG_GENS: { int i; static char name[2] = "a"; discgrp->gens->mgroup = cgroup; get_el_list(discgrp, discgrp->gens, fp, p->poolname); /* make up names for the generators if not given */ if (strcmp(discgrp->gens->el_list[0].word, "") == 0) { for (i=0; igens->num_el; ++i) { strcpy(discgrp->gens->el_list[i].word,name); name[0]++; } } } break; case DG_GEOM: expect = "geometry"; if(!GeomStreamIn(p, &discgrp->geomhandle, &discgrp->geom)) goto failed; if(discgrp->geomhandle) HandleRegister(&discgrp->geomhandle, (Ref *)discgrp, &discgrp->geom, HandleUpdRef); break; case DG_DIMN: if(iobfgetni(fp, 1, &discgrp->dimn, 0) <= 0 || discgrp->dimn > 4) { OOGLSyntax(fp,errfmt, p->poolname, "Invalid Dimension"); return(NULL); } cgroup.dimn = discgrp->dimn+1; /* default matrix group */ break; case DG_NGENS: { int ngens; if(iobfgetni(fp, 1, &ngens, 0) <= 0 || ngens <= 0) { OOGLSyntax(fp,errfmt,p->poolname, "Invalid generator count"); return(NULL); } discgrp->gens = OOGLNewE(DiscGrpElList, "DiscGrp gens"); discgrp->gens->num_el = ngens; discgrp->gens->el_list = OOGLNewNE(DiscGrpEl, discgrp->gens->num_el, "DiscGrp gens elem list"); } break; case DG_NELS: { int nels; if(iobfgetni(fp, 1, &nels, 0) <= 0 || nels <= 0) { OOGLSyntax(fp,errfmt,p->poolname, "Invalid generator count"); return(NULL); } discgrp->big_list = OOGLNewE(DiscGrpElList, "DiscGrp el_list"); discgrp->big_list->num_el = nels; discgrp->big_list->el_list = OOGLNewNE(DiscGrpEl, discgrp->big_list->num_el, "DiscGrp elem list"); } break; failed: OOGLSyntax(fp, "Couldn't read DISCGRP in \"%s\": expected %s", PoolName(p), expect); break; default: OOGLError(1,"Bad keyword DiscGrpFLoad %s",keyword); break; } if ( !(get_matching_parenthesis(fp,p->poolname))) break; } /* make sure the generator list includes all inverses */ DiscGrpAddInverses(discgrp); /* if (discgrp->geom == NULL) { discgrp->flag |= DG_DRAWDIRDOM; DiscGrpSetupDirdom(discgrp); discgrp->ddgeom = DiscGrpDirDom(discgrp); } */ if (discgrp->big_list == NULL) { DiscGrpInitStandardConstraint(discgrp->enumdepth, discgrp->enumdist, discgrp->enumdist); discgrp->big_list = DiscGrpEnum(discgrp, DiscGrpStandardConstraint); } return(( Geom *) discgrp); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/discgrp/dgtransform.c0000644000175000017500000000263512310110200017053 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include "3d.h" #include "discgrpP.h" DiscGrp * DiscGrpTransform(DiscGrp *dg, Transform T) { (void)T; return dg; } DiscGrp * DiscGrpTransformTo( dg, T ) DiscGrp *dg; Transform T; { return(DiscGrpTransform(dg, T)); } geomview-1.9.5/src/lib/gprim/discgrp/dhpoint3.c0000644000175000017500000000614712310110200016257 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "vec4.h" #include "dgflag.h" #include "math.h" double DHPt3Dot(point4 v0, point4 v1, int metric) { switch (metric) { case DG_EUCLIDEAN: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3]); break; case DG_HYPERBOLIC: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] - v0[3]*v1[3]); break; case DG_SPHERICAL: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3]); break; } return (double)0; } double DHPt3Dot3(point4 v0, point4 v1, int metric) { switch (metric) { case DG_EUCLIDEAN: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2]); break; case DG_HYPERBOLIC: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] - v0[3]*v1[3]); break; case DG_SPHERICAL: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3]); break; } return (double)0; } double DHPt3Distance(point4 p0, point4 p1, int metric) { double d0, d1; point4 diff; switch (metric) { case DG_EUCLIDEAN: VSUB3(p0,p1, diff); return(MAGNITUDE3(diff)); break; case DG_HYPERBOLIC: d0 =INPRO31(p0, p0); d1 =INPRO31(p1, p1); if (d0 >= 0.0 || d1 >= 0.0) { fprintf(stderr,"Invalid points in dist_proj3\n"); return(0.0); } return(acosh( ABS( INPRO31(p0, p1) / sqrt(d0 * d1)))); break; case DG_SPHERICAL: d0 =INPRO31(p0, p0); d1 =INPRO31(p1, p1); return(acos( ABS( INPRO4(p0, p1) / sqrt(d0 * d1)))); break; } return (double)0; } void DHPt3PerpBisect(point4 p0, point4 p1, point4 result, int metric) { switch (metric) { case DG_EUCLIDEAN: { point4 tmp; VSUB3(p1, p0, result) VADD3(p0, p1, tmp) VSCALE3(tmp, .5, tmp) result[3] = -(VDOT3(tmp, result)); } break; case DG_HYPERBOLIC: NORMALIZE31(p0); NORMALIZE31(p1); VSUB4(p0, p1, result) if (INPRO31(p0, result) > 0.0) VSCALE4(result, -1, result) break; case DG_SPHERICAL: NORMALIZE4(p0); NORMALIZE4(p1); VSUB4(p0, p1, result) if (INPRO4(p0, result) > 0.0) VSCALE4(result, -1, result) break; } } geomview-1.9.5/src/lib/gprim/discgrp/matlist.c0000644000175000017500000001300112310110200016167 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include #include "vec4.h" #include "enum.h" #include "transform.h" #include "dgflag.h" extern int debug, stringent, metric; static float epsilon = .005; void traverse_list(); int is_same(); struct node { Transform t; struct node *l,*r, *p; /* left, right, parent */ struct node *same; /* if it's "close" to this one */ int num; int type; /* process but don't print? */ float norm; char *word; } ; static struct node *head; double getnorm(int metric, Transform t) { switch (metric) { case DG_EUCLIDEAN: return(sqrt(t[3][0]*t[3][0] + t[3][1]*t[3][1] + t[3][2]*t[3][2])); break; case DG_HYPERBOLIC: if (ABS(t[3][3]) < 1.0) return(0.0); return ( acosh( ABS( t[3][3])) ); break; case DG_SPHERICAL: { float sum = 0; int i,j; for (i=0; i<4; ++i) for (j=0; j<4; ++j) sum += fabs(t[i][j] - (i==j)); return(sum); } break; } return (double)0; } static struct node * alloc_node() { struct node *n; n = (struct node *) malloc(sizeof(struct node) ); if (n == NULL) exit(printf("Unable to allocate: alloc_node\n")); n->p = n->l = n->r = n->same = NULL; n->num = 1; return(n); } int insert_or_match_mat(mat, mode) Transform mat; int mode; /* insert or match? */ { struct node *n = NULL, *p; float d; struct node tnode; double getnorm(); if (debug == 4) traverse_list(head); if (mode & INSERT ) n = alloc_node(); else if (mode & MATCH) n = &tnode; else n->type = 0; n->norm = getnorm(metric, mat); TmCopy(mat, n->t); if (head == NULL) { if (mode & MATCH) return(0); /* no match */ else if (mode & INSERT) { head = n; return(1); /* successful insert */ } } /* ...else... */ for (p = head; p != NULL; ) { d = fabs(p->norm - n->norm); if (ABS(d) < epsilon) { /* insert! */ if (mode & INSERT) { /* and stick it at the end of the cluster */ p->num++; /* count this one */ for ( ; p->same != NULL; p = p->same) ; /* back up one */ p->same = n; n->p = p; /* mark the parent */ return(1); } else { /* look here for a match */ for ( ; p != NULL; p = p->same) if (is_same(p->t, n->t)) return( 1 ); /* matched! */ return(0); } } else if (d > 0) { /* go right */ if (p->r == NULL) { if (mode & INSERT) { p->r = n; n->p = p; return(1); } else { /* no match */ return(0); } } else p = p->r; /* continue search */ } else if (d < 0) { /* go left */ if (p->l == NULL) { if (mode & INSERT) { p->l = n; n->p = p; return(1); } else { /* no match */ return(0); } } else p = p->l; /* continue search */ } } return 0; } int is_same(t0, t1) Transform t0, t1; { int i, j, same = 1; if (stringent) { float factor, fepsilon; Transform tt1, tt2; Tm3Invert(t0, tt1); Tm3Concat(t1,tt1,tt2); /* is tt2 the identity, or a multiple of the identity? */ factor = tt2[0][0]; fepsilon = ABS(factor * epsilon); for (i=0; i<4; ++i) for (j=0; j<4; ++j) { /* check against identity matrix */ if ( ABS( tt2[i][j] - factor * ((i == j) ? 1 : 0) ) > fepsilon ) { same = 0; goto OUT; } } } else { for (i=0; i<4; ++i) { for (j=0; j<4; ++j) if (ABS(t0[i][j] - t1[i][j]) > epsilon) { same = 0; goto OUT; } } } OUT: return(same); } int is_new(t) Transform t; { if ( insert_or_match_mat(t, MATCH) ) { return(0); } return(DG_CONSTRAINT_NEW); } void traverse_list(n) struct node *n; { if (n == NULL) return; traverse_list(n->l); fprintf(stderr,"%10f\t%d\n",n->t[3][3], n->num); traverse_list(n->r); } static void _delete_list(n) struct node *n; { struct node *nt, *ot; if (n == NULL) return; _delete_list(n->l); _delete_list(n->r); /* erase the cluster of equal values at this node */ /* first go to the end of the cluster ... */ for (ot = n ; ot->same != NULL; ot = ot->same) ; /* ... then climb back up, erasing as you go */ if (ot != n) for ( ; ot->p != n; ) { nt = ot->p; free(ot); ot = nt; } /* erase the evidence of this node in its parent */ if (n->p) { if (n->p->l == n) n->p->l = NULL; if (n->p->r == n) n->p->r = NULL; } free(n); } void delete_list() { _delete_list(head); head = NULL; } geomview-1.9.5/src/lib/gprim/discgrp/outstack.c0000644000175000017500000000436512310110200016364 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* This file is for managing the output stack of group elements */ #include "discgrpP.h" static int BlockSize, array_size; static DiscGrpEl *mystack = NULL, *stackptr = NULL; static int count = 0, debug = 0; int init_out_stack() { array_size = 1; BlockSize = 1024; count = 0; if ((mystack = OOGLNewN (DiscGrpEl, BlockSize )) == (DiscGrpEl *) NULL) return(0); stackptr = mystack; return(1); } int enumpush(pp) DiscGrpEl *pp; { if (stackptr >= &mystack[BlockSize*array_size]) { if (debug) fprintf(stderr,"allocating again: size is now %d\n",array_size*BlockSize); array_size = array_size*2; if ((mystack = OOGLRenewN(DiscGrpEl,mystack, array_size*BlockSize)) == (DiscGrpEl *) NULL) return (0); stackptr = &mystack[count]; } *stackptr = *pp; TmCopy(pp->tform, stackptr->tform); stackptr++; count++; return(1); } int enumgetsize() { return(count); } DiscGrpEl * enumgetstack() { DiscGrpEl *thisptr; thisptr = OOGLNewN (DiscGrpEl, count ); if (thisptr == NULL) return ( (DiscGrpEl *) NULL); memcpy(thisptr, mystack, sizeof(DiscGrpEl) * count); OOGLFree(mystack); return(thisptr); } geomview-1.9.5/src/lib/gprim/discgrp/polyhedron.c0000644000175000017500000001442212310110200016705 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * polyhedron.c: routines which operate on the polyhedron data structure */ /* */ #include "geom.h" #include "geomclass.h" #include "polylistP.h" #include "ooglutil.h" #include "point.h" #include "winged_edge.h" #include "extern.h" Geom * WEPolyhedronToVect(WEpolyhedron *poly, HPoint3 origin) { int i, ii, jj; Geom *orbit; HPoint3 gorigin; /*static HPoint3 origin2 = {0,0,0,1};*/ WEface *fptr; Transform T; short *vnvert; short *vncolor; HPoint3 *p; ColorA *c; vnvert = OOGLNewN(short, poly->num_faces); vncolor = OOGLNewN(short, poly->num_faces); p = OOGLNewN(HPoint3, 2*poly->num_faces); c = OOGLNewN(ColorA, poly->num_faces); for (i=0, fptr=poly->face_list; inum_faces; ++i, fptr = fptr->next) { vnvert[i] = 2; /* line segment! */ vncolor[i] = 1; /* next two lines assume the indices in two sorts of groups match */ c[i] = GetCmapEntry( fptr->fill_tone); for (ii=0; ii<4; ++ii) for (jj=0; jj<4; ++jj) /* fptr's tforms are transposed! */ T[jj][ii] = fptr->group_element[ii][jj]; HPt3Transform( T, &origin, &gorigin); p[2*i] = origin; p[2*i+1] = gorigin; } orbit = GeomCreate("vect", CR_NOCOPY, CR_NVECT, poly->num_faces, CR_NVERT, 2*poly->num_faces, CR_NCOLR, poly->num_faces, CR_VECTC, vnvert, CR_COLRC, vncolor, CR_POINT4, p, CR_COLOR, c, CR_4D, 1, CR_END); return(orbit); } /*static ColorA white = {1,1,1,1};*/ Geom * WEPolyhedronToPolyList(poly) WEpolyhedron *poly; { ColorA *colors = NULL; HPoint3 *points = NULL; int *nvert = NULL; int *vindex = NULL; WEvertex *vptr; WEedge *eptr; WEface *fptr; int cnt, cnt2, total; Geom *plist; points = OOGLNewN(HPoint3, poly->num_vertices); colors = OOGLNewN(ColorA,poly->num_faces); nvert = OOGLNewN(int, poly->num_faces); vptr = poly->vertex_list; cnt = 0; do { points[cnt].x = vptr->x[0]; points[cnt].y = vptr->x[1]; points[cnt].z = vptr->x[2]; points[cnt].w = vptr->x[3]; vptr->ideal = cnt++; vptr = vptr->next; } while (vptr != NULL); cnt = 0; fptr = poly->face_list; total = 0; do { colors[cnt] = GetCmapEntry(fptr->fill_tone); nvert[cnt] = fptr->order; total += nvert[cnt++]; fptr = fptr->next; } while (fptr != NULL); vindex = OOGLNewN(int, total); cnt = 0; fptr = poly->face_list; do { eptr = fptr->some_edge; cnt2 = 0; do { if (eptr->fL == fptr) { vindex[cnt+cnt2] = eptr->v0->ideal; cnt2++; eptr = eptr->e1L; } else { vindex[cnt+cnt2] = eptr->v1->ideal; cnt2++; eptr = eptr->e0R; } } while (eptr != fptr->some_edge); cnt+= fptr->order; fptr = fptr->next; } while (fptr != NULL); plist = GeomCreate("polylist", /*CR_NOCOPY, isn't supported for polylists! */ CR_4D, 1, CR_NPOLY, poly->num_faces, CR_NVERT, nvert, CR_VERT, vindex, CR_POINT4, points, CR_POLYCOLOR, colors, CR_FLAG, PL_HASPCOL, /* put this here or meet a bug libpolylist */ CR_END); return(plist); } Geom * WEPolyhedronToBeams( WEpolyhedron *poly, float alpha) { WEedge *eptr; WEvertex *vptr; Geom *beams; HPoint3 *points, p0, p1, v0, v1; ColorA *colors; int *nvert, *vindex, vcnt, fcnt; float omega; static ColorA white = {1,1,1,1}; points = OOGLNewN(HPoint3, 4 * poly->num_edges); colors = OOGLNewN(ColorA, poly->num_edges); nvert = OOGLNewN(int, poly->num_edges); vindex = OOGLNewN(int, 4*poly->num_edges); omega = 1.0 - alpha; vcnt = fcnt = 0; eptr = poly->edge_list; #define CCOPY( d4, hpt3) \ (hpt3)->x = d4[0]; \ (hpt3)->y = d4[1]; \ (hpt3)->z = d4[2]; \ (hpt3)->w = d4[3]; do { CCOPY( eptr->v0->x, &v0); if ((eptr->e0L->v0 = eptr->v0)) vptr = eptr->e0L->v1; else vptr = eptr->e0L->v0; CCOPY( vptr->x, &v1); HPt3Scale(omega, &v0, &p0); HPt3Scale(alpha, &v1, &p1); HPt3Add(&p0, &p1, &points[vcnt]); vindex[vcnt] = vcnt; vcnt++; if (eptr->fR == eptr->e0R->fR) if ((eptr->e0R->v0 = eptr->v0)) vptr = eptr->e0R->v1; else vptr = eptr->e0R->v0; else if ((eptr->e0L->v0 = eptr->v0)) vptr = eptr->e0L->v1; else vptr = eptr->e0L->v0; CCOPY( vptr->x, &v1); HPt3Scale(alpha, &v1, &p1); HPt3Add(&p0, &p1, &points[vcnt]); vindex[vcnt] = vcnt; vcnt++; CCOPY( eptr->v1->x, &v0); if ((eptr->e1R->v0 = eptr->v1)) vptr = eptr->e1R->v1; else vptr = eptr->e1R->v0; CCOPY( vptr->x, &v1); HPt3Scale(omega, &v0, &p0); HPt3Scale(alpha, &v1, &p1); HPt3Add(&p0, &p1, &points[vcnt]); vindex[vcnt] = vcnt; vcnt++; if ((eptr->e1L->v0 = eptr->v1)) vptr = eptr->e1L->v1; else vptr = eptr->e1L->v0; CCOPY( vptr->x, &v1); HPt3Scale(alpha, &v1, &p1); HPt3Add(&p0, &p1, &points[vcnt]); vindex[vcnt] = vcnt; vcnt++; colors[fcnt] = white; nvert[fcnt] = 4; fcnt++; eptr = eptr->next; } while (eptr != NULL); beams = GeomCreate("polylist", CR_NPOLY, poly->num_edges, CR_NVERT, nvert, CR_VERT, vindex, CR_POINT4, points, CR_POLYCOLOR, colors, CR_FLAG, PL_HASPCOL, /* put this here or meet a bug libpolyli st */ CR_END); return(beams); } geomview-1.9.5/src/lib/gprim/discgrp/projective.c0000644000175000017500000001260212310110200016672 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "options.h" #include "complex.h" #include "projective.h" /* sl2c_to_proj() converts sl2c_matrices to proj_matrices. It is based on an explanation provided by Craig Hodgson of a program written by Diane Hoffoss which in turn was based on an algorithm explained to her by Bill Thurston. */ void sl2c_to_proj(s, p) sl2c_matrix s; proj_matrix p; { int j; /* which column of p */ sl2c_matrix ad_s, /* s* = adjoint of s */ fs, /* f(s) = s m s* */ temp; static sl2c_matrix m[4] = {{{{ 0.0, 0.0},{ 0.0, 1.0}}, {{ 0.0,-1.0},{ 0.0, 0.0}}}, {{{ 0.0, 0.0},{ 1.0, 0.0}}, {{ 1.0, 0.0},{ 0.0, 0.0}}}, {{{-1.0, 0.0},{ 0.0, 0.0}}, {{ 0.0, 0.0},{ 1.0, 0.0}}}, {{{ 1.0, 0.0},{ 0.0, 0.0}}, {{ 0.0, 0.0},{ 1.0, 0.0}}}}; for (j=0; j<4; j++) { sl2c_adjoint(s, ad_s); sl2c_mult(s, m[j], temp); sl2c_mult(temp, ad_s, fs); p[0][j] = fs[0][1].imag; p[1][j] = fs[0][1].real; p[2][j] = 0.5 * (fs[1][1].real - fs[0][0].real); p[3][j] = 0.5 * (fs[1][1].real + fs[0][0].real); } return; } void proj_to_sl2c(p, s) proj_matrix p; sl2c_matrix s; { double t2, t3, aa, bb; /* Notation: The entries of s are a, b, c, d (as is standard). */ /* The complex conjugate of a is written as a' (read "a-bar"). */ /* Outline of algorithm: Write down the four matrices {sM0s*, */ /* sM1s*, sM2s*, sM3s*} in terms of {a, b, c, d}, and find */ /* expressions for {2a'a, 2a'b, 2a'c, 2a'd} as differences of */ /* matrix entries. Express these differences as functions of */ /* the entries of p. The matrix (2a'a, 2a'b; 2a'c, 2a'd) is a */ /* multiple of the desired matrix (a, b; c, d), so when we */ /* normalize the former we get the latter (we'd have to */ /* normalize in any case, since this scheme can find */ /* (a, b; c, d) only up to multiplication by a complex number */ /* of modulus one). */ /* a may be zero, but a and b can't both be zero. We'll use */ /* the one with the bigger norm. */ t2 = p[3][2] - p[2][2]; /* 00 entry of F(M2) */ t3 = p[3][3] - p[2][3]; /* 00 entry of F(M3) */ aa = t3 - t2; /* aa = 2 * |a|^2 */ bb = t3 + t2; /* bb = 2 * |b|^2 */ if (aa > bb) { s[0][0].real = aa; s[0][0].imag = 0.0; s[0][1].real = p[3][1] - p[2][1]; s[0][1].imag = p[3][0] - p[2][0]; s[1][0].real = p[1][3] - p[1][2]; s[1][0].imag = p[0][2] - p[0][3]; s[1][1].real = p[0][0] + p[1][1]; s[1][1].imag = p[1][0] - p[0][1]; } else { s[0][0].real = p[3][1] - p[2][1]; s[0][0].imag = p[2][0] - p[3][0]; s[0][1].real = bb; s[0][1].imag = 0.0; s[1][0].real = p[1][1] - p[0][0]; s[1][0].imag = - p[0][1] - p[1][0]; s[1][1].real = p[1][3] + p[1][2]; s[1][1].imag = - p[0][2] - p[0][3]; } sl2c_normalize(s); return; } void proj_mult(a, b, product) proj_matrix a, b, product; { int i, j, k; double sum; proj_matrix temp; for (i=0; i<4; i++) for (j=0; j<4; j++) { sum = 0.0; for (k=0; k<4; k++) sum += a[i][k] * b[k][j]; temp[i][j] = sum; } for (i=0; i<4; i++) for (j=0; j<4; j++) product[i][j] = temp[i][j]; return; } void proj_copy(a, b) proj_matrix a, b; { int i, j; for (i=0; i<4; i++) for (j=0; j<4; j++) a[i][j] = b[i][j]; return; } /* proj_invert() assumes the matrix a is nonsingular, as will always */ /* be the case for matrices representing isometries of H^3. */ void proj_invert(m, m_inv) proj_matrix m, m_inv; { int i, j, k; double scratch[4][8], *a[4], *temp; /* set up */ for (i=4; --i>=0; ) { for (j=4; --j>=0; ) { scratch[i][j] = m[i][j]; scratch[i][j+4] = (i == j) ? 1.0 : 0.0; } a[i] = scratch[i]; } /* do the forward part of Gaussian elimination */ for (j=0; j<4; j++) { /* find the best pivot */ for (i=j+1; i<4; i++) if (fabs(a[i][j]) > fabs(a[j][j])) { temp = a[i]; a[i] = a[j]; a[j] = temp; } /* normalize row j */ for (i=j+1; i<8; i++) a[j][i] /= a[j][j]; /* clear the lower part of column j */ for (i=j+1; i<4; i++) for (k=j+1; k<8; k++) a[i][k] -= a[i][j] * a[j][k]; } /* do the back substitution */ for (j=4; --j>=0; ) for (i=j; --i>=0; ) for (k=4; k<8; k++) a[i][k] -= a[i][j] * a[j][k]; /* copy the answer into m_inv */ for (i=4; --i>=0; ) for (j=4; --j>=0; ) m_inv[i][j] = a[i][j+4]; return; } geomview-1.9.5/src/lib/gprim/discgrp/stack.c0000644000175000017500000000473312310110200015633 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include #include "enum.h" #include "ooglutil.h" #define CHUNKSIZE 10000 typedef struct entry {char word[MAXDEPTH]; } entry; static entry *stack = NULL, *old, *oldtop, *oldbase, *new; static int numchunks = 1; /* new points to the next empty space in the stack */ /* old points to the first non-empty space in the stack */ void init_stack() { if (stack) OOGLFree(stack); stack = OOGLNewN(entry, CHUNKSIZE); if (stack == NULL) exit(fprintf(stderr,"init_stack: no space\n")); old = oldbase = new = stack; oldtop = stack - 1; } void make_new_old() { /* oldbase and oldtop are inclusive limits if non-empty words */ oldbase = oldtop+1; old = oldtop = new-1; } char * pop_old_stack() { if (old >= oldbase) return((old--)->word); else return(NULL); } int push_new_stack(word) char *word; { entry * oldstack; if (new >= stack + numchunks * CHUNKSIZE) { oldstack = stack; numchunks *= 2; if ((stack = OOGLRenewN(entry, stack, numchunks * CHUNKSIZE )) == (entry *) NULL) return (0); new = (entry *) stack + (new - oldstack); old = (entry *) stack + (old - oldstack); oldtop = (entry *) stack + (oldtop - oldstack); oldbase = (entry *) stack + (oldbase - oldstack); if (stack == NULL) exit(fprintf(stderr,"push_new_stack: no space\n")); } strcpy(new->word, word); new++; return 0; } geomview-1.9.5/src/lib/gprim/discgrp/util.c0000644000175000017500000000437112310110200015501 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* routines for making sure matrix is orthogonal in Minkowski metric */ #include "3d.h" /* row-orthogonalize an isometry of Minkowski space */ void tuneup(Transform m1, int metric) { HPt3SpaceNormalize((HPoint3 *)m1[0], metric); HPt3SpaceGramSchmidt((HPoint3 *)m1[0], (HPoint3 *)m1[1], metric); HPt3SpaceNormalize((HPoint3 *)m1[1], metric); HPt3SpaceGramSchmidt((HPoint3 *)m1[0], (HPoint3 *)m1[2], metric); HPt3SpaceGramSchmidt((HPoint3 *)m1[1], (HPoint3 *)m1[2], metric); HPt3SpaceNormalize((HPoint3 *)m1[2], metric); HPt3SpaceGramSchmidt((HPoint3 *)m1[0], (HPoint3 *)m1[3], metric); HPt3SpaceGramSchmidt((HPoint3 *)m1[1], (HPoint3 *)m1[3], metric); HPt3SpaceGramSchmidt((HPoint3 *)m1[2], (HPoint3 *)m1[3], metric); HPt3SpaceNormalize((HPoint3 *)m1[3], metric); } /* following only works now with hyperbolic mode */ int needstuneup(Transform m1) { int i,j; float d; for (i=0; i<4; ++i) for (j=i; j<4; ++j) { d = m1[i][0] * m1[j][0] + m1[i][1] * m1[j][1] + m1[i][2] * m1[j][2] - m1[i][3] * m1[j][3]; if (i == 3) d *= -1; if (fabs ( d - ( i == j ) ) > .01 ) return (1); } return (0); } geomview-1.9.5/src/lib/gprim/discgrp/weeks_dirdom.c0000644000175000017500000013043712310110200017203 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Comments on numerical issues: Dirichlet() uses two constants, namely VERTEX_EPSILON and MATRIX_EPSILON, to decide when two real numbers are equal. Setting the values of these constants is tricky. In situations where the polyhedron has very tiny faces and the initial list of generators is sufficiently precise (e.g. (40, 1) surgery on the figure eight knot) the constants should be set fairly small. In situations where the polyhedron has no small faces and the generators are very imprecise (e.g. (1,-1)(-5,1)(-5,1) surgery on the Borromean rings, which gives the manifold of volume 0.94...) the constants must be fairly large. (The more complicated Dehn fillings give less precise generators not because the original solution to the gluing equations is less accurate, but because the original set of generators is far from the canonical set, and a lot of roundoff error accumulates in the basepoint finding routine.) */ /* #define PRECISE_GENERATORS 1 for high precision generators and tiny faces, or #define PRECISE_GENERATORS 0 for low precision generators and large faces. */ #define PRECISE_GENERATORS 0 /* Dirichlet() uses an algorithm based on checking that that corresponding faces do in fact match up. Specifically, for each face it checks that (the image of) its matching face does not extend beyond the perimeter of the given face. It checks that the matching face does not extend beyond any Dirichlet plane determined by a group element (alpha)(beta), where alpha is the group element associated with the matching face, and beta is the group element associated with one of the faces bordering the given face. When the faces do match up correctly the program can verify the fact very quickly, because in the typical case where the edges are of order three the group element (alpha)(beta) is exactly the group element associated with a face bordering on the matching face. So the program can traverse the original face counterclockwise while simultaneously traversing the matching face clockwise and noting that group elements correspond correctly. If a group element fails to correspond, then the program must check that no vertices of the matching face lie beyond the Dirichlet plane corresponding to (alpha)(beta). But even this is pretty fast--it just needs to evaluate some inner products and check that none are positive. In the event that some vertices do lie beyond the Dirichlet plane corresponding to (alpha)(beta), the program knows to add this plane (and its inverse) to the collection of faces of the polyhedron. Thus the program adds only faces that are actually needed. This allows it to quickly find Dirichlet domains whose vertices (and face planes) are too far from the origin to be found by enumerating all group elements at that distance (e.g. (40,1) Dehn filling on a knot complement). The results of this algorithm can be made rigorous by checking that the sum of the dihedral angles around each edge add up to 2pi and that the face pairings are sufficient to generate the original group, but I haven't written the code to do this yet. (In fact, the condition that the face pairings generate the original group might be satisfied automatically given that we start with a generating set that includes all group elements up to some norm. Perhaps there's also a way to prove that the edge angles must add up correctly.) */ /* Note: Dirichlet() does not require inverses of generators */ /* to be present. It provides any inverses which may be */ /* missing. */ #include "options.h" #include "projective.h" #include "complex.h" #include "winged_edge.h" #include "3d.h" #include "dgflag.h" #include #include "extern.h" #include "discgrpP.h" #define free32(ptr) free(ptr) #define malloc32(size) malloc(size) #if PRECISE_GENERATORS #define VERTEX_EPSILON (1e9 * HARDWARE_PRECISION) #define MATRIX_EPSILON (1e7 * HARDWARE_PRECISION) #else #define VERTEX_EPSILON 1e-3 #define MATRIX_EPSILON 1e-5 #endif #define MIN_DL_FILL_TONE 0 #define MAX_DL_FILL_TONE 64 typedef double vector[4]; /*static void convert_generators(sl2c_matrix *m, proj_matrix **mm, int foo);*/ static void make_cube(WEpolyhedron *poly); /*static void make_hypercube(WEpolyhedron *poly);*/ static void initialize_polyhedron(WEpolyhedron *poly, proj_matrix *m, int n); static int find_Dirichlet_domain(WEpolyhedron *poly); static int check_face(WEpolyhedron *poly, WEface *face); static int all_dirty_faces_unmatched(WEpolyhedron *poly); static int unsophisticated_search(WEpolyhedron *poly); static int add_element(WEpolyhedron *poly, proj_matrix m); static void slice_off_cusps(WEpolyhedron *poly); static int add_face(WEpolyhedron *poly, proj_matrix m, WEface *face); static void cut_edges(WEpolyhedron *poly); static void adjust_f_e_ptrs(WEpolyhedron *poly); static void cut_faces(WEpolyhedron *poly, WEface *face); static void remove_dead_edges(WEpolyhedron *poly); static void remove_dead_vertices(WEpolyhedron *poly); static void number_faces(WEpolyhedron *poly); /*static void read_vertices(WEface *face, double (*foo)[3]);*/ /*static void print_statistics(WEpolyhedron *poly);*/ static void print_poly(WEpolyhedron *poly); static void print_vef(WEpolyhedron *poly); /*static void print_vertex_distances(WEpolyhedron *poly);*/ static void print_vertices(WEpolyhedron *poly); /*static void print_edge_lengths(WEpolyhedron *poly);*/ /*static void print_face_distances(WEpolyhedron *poly);*/ /*static void saveOOGL(WEpolyhedron *poly);*/ /*static void free_polyhedron(WEpolyhedron *poly);*/ static void roundoff_message(char *message); static int matrix_epsilon_message_given, vertex_epsilon_message_given; static point origin; static int metric, debug; static WEpolyhedron the_polyhedron; /* we'd use the geometry library routines here if they were double precision */ extern double DHPt3Dot3(); extern double DHPt3Dot(); static WEedge edgeheap[1024]; static int heapcount = 0; int proj_same_matrix(); void do_weeks_code(WEpolyhedron **wepolyhedron, point oo, proj_matrix *gen_list, int n, int met, int slice) { int i; for (i=0; i<4; ++i) origin[i] = oo[i]; heapcount = 0; metric = met; *wepolyhedron = &the_polyhedron; /* if (metric == DG_SPHERICAL) make_hypercube(*wepolyhedron); else make_cube(*wepolyhedron); */ make_cube(*wepolyhedron); initialize_polyhedron(*wepolyhedron, gen_list, n); if (find_Dirichlet_domain(*wepolyhedron) == 0) *wepolyhedron = NULL; else { if (debug == 2) print_poly(*wepolyhedron); number_faces(*wepolyhedron); } if (slice && (metric == DG_HYPERBOLIC)) slice_off_cusps(*wepolyhedron); } #define MAGIC_SCALE .99 static void slice_off_cusps(poly) WEpolyhedron *poly; { WEvertex *vptr, *vlist; Transform tlate; proj_matrix dtlate; HPoint3 tlatept; int i,j; /* make a copy of the vertex list as it stands now */ vlist = (WEvertex *) malloc32(poly->num_vertices * sizeof(WEvertex)); vptr = poly->vertex_list; i = 0; do { vlist[i] = *vptr; vlist[i].next = &vlist[i+1]; vptr = vptr->next; i++; } while (vptr != NULL); vlist[i-1].next = NULL; /* now cycle through these vertices */ vptr = vlist; do { vptr->ideal = ( (DHPt3Dot(vptr->x, vptr->x, metric)) >= -.00005) ? 1 : 0; if (vptr->ideal) { tlatept.x = vptr->x[0] * MAGIC_SCALE; tlatept.y = vptr->x[1] * MAGIC_SCALE; tlatept.z = vptr->x[2] * MAGIC_SCALE; tlatept.w = vptr->x[3]; Tm3HypTranslateOrigin(tlate, &tlatept); for (i=0;i<4;++i) for (j=0;j<4;++j) dtlate[j][i] = tlate[i][j]; add_element(poly, dtlate); } vptr = vptr->next; } while (vptr != NULL); } #if 0 static void convert_generators(sl2c_generators, proj_generators_ptr, num_generators) sl2c_matrix *sl2c_generators; proj_matrix **proj_generators_ptr; int num_generators; { int i; *proj_generators_ptr = (proj_matrix *) malloc32((MyInt32) num_generators * sizeof(proj_matrix)); for (i=num_generators; --i>=0; ) sl2c_to_proj(sl2c_generators[i], (*proj_generators_ptr)[i]); return; } #endif #if 0 static void make_hypercube(polyhedron) WEpolyhedron *polyhedron; { int i; WEvertex *initial_vertices[16]; WEedge *initial_edges[24]; WEface *initial_faces[12]; static int edata[24][8] = { {0, 4, 8, 4, 9, 6, 1,0}, {2, 6, 4, 16, 6, 11, 0,8}, {1, 5, 20, 8, 7, 9, 5,1}, {3, 11, 10, 5, 22, 17, 7,6}, {0, 2, 0, 8, 1, 10, 0,2}, {1, 3, 8, 20, 10, 3, 2,6}, {4, 6, 12, 0, 11, 1, 3,0}, {5, 13, 2, 9, 14, 21, 5, 4}, {0, 1, 4, 0, 5, 2, 2,1}, {4, 5, 0, 12, 2, 7, 1,4}, {2, 3, 16, 4, 3, 5, 7,2}, {6, 14, 6, 1, 18, 13, 3,8}, {4, 4+8, 9, 6, 9+12, 6+12, 4,3}, {2+8, 6+8, 4+12, 10+12, 11, 11+12, 8,10}, {1+8, 5+8, 5+12, 8+12, 7+12, 7, 9,5}, {3+8, 7+8, 10+12, 5+12, 11+12, 7+12, 10,9}, {2, 2+8, 1, 10, 1+12, 10+12, 8,7}, {1+8, 3+8, 8+12, 2+12, 3, 3+12, 6,9}, {4+8, 6+8, 9+12, 0+12, 11+12, 11, 11,3}, {5+8, 7+8, 2+12, 9+12, 3+12, 11+12, 9,11}, {1, 1+8, 5, 2, 5+12, 2+12, 6,5}, {4+8, 5+8, 0+12, 6+12, 7, 7+12, 4,11}, {2+8, 3+8, 1+12, 4+12, 3+12, 3, 10,7}, {6+8, 7+8, 6+12, 1+12, 7+12, 3+12, 11,10}}; static int fdata[12] = {0, 8,4,6,9,2,5,10,1,15,23,19}; polyhedron->num_vertices = 16; polyhedron->num_edges = 24; polyhedron->num_faces = 12; /* vt = (WEvertex *) malloc32( 16 * sizeof(WEvertex)); et = (WEedge *) malloc32( 24 * sizeof(WEedge)); ft = (WEface *) malloc32( 12 * sizeof(WEface)); */ for (i=16; --i>=0; ) initial_vertices[i] = (WEvertex *) malloc32((MyInt32) sizeof(WEvertex)); for (i=24; --i>=0; ) initial_edges[i] = (WEedge *) malloc32((MyInt32) sizeof(WEedge)); for (i=12; --i>=0; ) initial_faces[i] = (WEface *) malloc32((MyInt32) sizeof(WEface)); /* for (i=0; i<16; ++i) initial_vertices[i] = &vt[i]; for (i=0; i<24; ++i ) initial_edges[i] = &et[i]; for (i=0; i <12; ++i ) initial_faces[i] = &ft[i]; */ polyhedron->vertex_list = initial_vertices[0]; polyhedron->edge_list = initial_edges[0]; polyhedron->face_list = initial_faces[0]; polyhedron->dirty0.nxt = initial_faces[0]; polyhedron->dirty0.prv = NULL; /* should be unnecessary */ polyhedron->dirty1.nxt = NULL; /* should be unnecessary */ polyhedron->dirty1.prv = initial_faces[11]; polyhedron->clean0.nxt = &polyhedron->clean1; polyhedron->clean0.prv = NULL; /* should be unnecessary */ polyhedron->clean1.nxt = NULL; /* should be unnecessary */ polyhedron->clean1.prv = &polyhedron->clean0; for (i=0; i<16; ++i ) { initial_vertices[i]->x[0] = (i & 8) ? 1.0 : -1.0; initial_vertices[i]->x[1] = (i & 4) ? 1.0 : -1.0; initial_vertices[i]->x[2] = (i & 2) ? 1.0 : -1.0; initial_vertices[i]->x[3] = (i & 1) ? 1.0 : -1.0; initial_vertices[i]->next = initial_vertices[i+1]; } initial_vertices[15]->next = NULL; /* delete vertices # 7 and 8 */ initial_vertices[6]->next = initial_vertices[9]; polyhedron->num_vertices = 14; for (i=0; i< 24; ++i ) { initial_edges[i]->v0 = initial_vertices[edata[i][0]]; initial_edges[i]->v1 = initial_vertices[edata[i][1]]; initial_edges[i]->e0L = initial_edges[edata[i][2]]; initial_edges[i]->e0R = initial_edges[edata[i][3]]; initial_edges[i]->e1L = initial_edges[edata[i][4]]; initial_edges[i]->e1R = initial_edges[edata[i][5]]; initial_edges[i]->fL = initial_faces[edata[i][6]]; initial_edges[i]->fR = initial_faces[edata[i][7]]; initial_edges[i]->next = initial_edges[i+1]; } initial_edges[23]->next = NULL; for (i=0; i<12; ++i) { initial_faces[i]->order = 4; initial_faces[i]->fill_tone = -2; initial_faces[i]->some_edge = initial_edges[fdata[i]]; initial_faces[i]->inverse = NULL; initial_faces[i]->next = initial_faces[i+1]; initial_faces[i]->prv = initial_faces[i-1]; initial_faces[i]->nxt = initial_faces[i+1]; } initial_faces[11]->next = NULL; initial_faces[0]->prv = &polyhedron->dirty0; initial_faces[11]->nxt = &polyhedron->dirty1; return; } #endif static void make_cube(polyhedron) WEpolyhedron *polyhedron; { int i; WEvertex *initial_vertices[8]; WEedge *initial_edges[12]; WEface *initial_faces[6]; static int edata[12][8] = { {0, 4, 8, 4, 9, 6, 2, 4}, {2, 6, 4, 10, 6, 11, 4, 3}, {1, 5, 5, 8, 7, 9, 5, 2}, {3, 7, 10, 5, 11, 7, 3, 5}, {0, 2, 0, 8, 1, 10, 4, 0}, {1, 3, 8, 2, 10, 3, 0, 5}, {4, 6, 9, 0, 11, 1, 1, 4}, {5, 7, 2, 9, 3, 11, 5, 1}, {0, 1, 4, 0, 5, 2, 0, 2}, {4, 5, 0, 6, 2, 7, 2, 1}, {2, 3, 1, 4, 3, 5, 3, 0}, {6, 7, 6, 1, 7, 3, 1, 3}}; static int fdata[6] = {4, 6, 0, 1, 0, 2}; polyhedron->num_vertices = 8; polyhedron->num_edges = 12; polyhedron->num_faces = 6; for (i=8; --i>=0; ) initial_vertices[i] = (WEvertex *) malloc32((MyInt32) sizeof(WEvertex)); for (i=12; --i>=0; ) initial_edges[i] = (WEedge *) malloc32((MyInt32) sizeof(WEedge)); for (i=6; --i>=0; ) initial_faces[i] = (WEface *) malloc32((MyInt32) sizeof(WEface)); polyhedron->vertex_list = initial_vertices[0]; polyhedron->edge_list = initial_edges[0]; polyhedron->face_list = initial_faces[0]; polyhedron->dirty0.nxt = initial_faces[0]; polyhedron->dirty0.prv = NULL; /* should be unnecessary */ polyhedron->dirty1.nxt = NULL; /* should be unnecessary */ polyhedron->dirty1.prv = initial_faces[5]; polyhedron->clean0.nxt = &polyhedron->clean1; polyhedron->clean0.prv = NULL; /* should be unnecessary */ polyhedron->clean1.nxt = NULL; /* should be unnecessary */ polyhedron->clean1.prv = &polyhedron->clean0; for (i=8; --i>=0; ) { initial_vertices[i]->x[0] = (i & 4) ? 17.0 : -17.0; initial_vertices[i]->x[1] = (i & 2) ? 17.0 : -17.0; initial_vertices[i]->x[2] = (i & 1) ? 17.0 : -17.0; /* if (metric & DG_SPHERICAL) initial_vertices[i]->x[3] = 0.0; else */ initial_vertices[i]->x[3] = 1.0; initial_vertices[i]->next = initial_vertices[i+1]; } initial_vertices[7]->next = NULL; for (i=12; --i>=0; ) { initial_edges[i]->v0 = initial_vertices[edata[i][0]]; initial_edges[i]->v1 = initial_vertices[edata[i][1]]; initial_edges[i]->e0L = initial_edges[edata[i][2]]; initial_edges[i]->e0R = initial_edges[edata[i][3]]; initial_edges[i]->e1L = initial_edges[edata[i][4]]; initial_edges[i]->e1R = initial_edges[edata[i][5]]; initial_edges[i]->fL = initial_faces[edata[i][6]]; initial_edges[i]->fR = initial_faces[edata[i][7]]; initial_edges[i]->next = initial_edges[i+1]; } initial_edges[11]->next = NULL; for (i=6; --i>=0; ) { initial_faces[i]->order = 4; initial_faces[i]->fill_tone = -2; initial_faces[i]->some_edge = initial_edges[fdata[i]]; initial_faces[i]->inverse = NULL; if (i < 5) { initial_faces[i]->next = initial_faces[i+1]; } if (i > 0) { initial_faces[i]->prv = initial_faces[i-1]; } initial_faces[i]->nxt = initial_faces[i+1]; } initial_faces[5]->next = NULL; initial_faces[0]->prv = &polyhedron->dirty0; initial_faces[5]->nxt = &polyhedron->dirty1; return; } static void initialize_polyhedron(polyhedron, proj_generators, num_generators) WEpolyhedron *polyhedron; proj_matrix *proj_generators; int num_generators; { int i; WEface *face; for (i=num_generators; --i>=0; ) { add_element(polyhedron, proj_generators[i]); if (debug == 2) print_poly(polyhedron); } /* make sure no faces of the original cube remain */ for (face=polyhedron->face_list; face; face=face->next) if (debug) if (face->fill_tone == -2) { fprintf(stderr, "A face of the original cube is inside the polyhedron\n"); fprintf(stderr, "determined by the initial generators. This program\n"); fprintf(stderr, "could be modified to deal with this situation, but\n"); fprintf(stderr, "it's not ready yet.\n"); /* the solution would be to tile to some small */ /* radius (or increase the size of the cube!) */ return; } return; } static int check_face(polyhedron, face) WEpolyhedron *polyhedron; WEface *face; { /* We want to see whether the image of the matching face */ /* is entirely contained within the given face. To do this */ /* we'll examine the edges of the given face one at a time */ /* and make sure the image of the matching face doesn't */ /* extend past any edge. We do this as follows. Let alpha */ /* be the inverse of the group element associated with the */ /* given face, and beta be the group element associated */ /* with one of its neighboring faces. We want to make sure */ /* that none of the vertices of the matching face extend */ /* beyond the Dirichlet plane determined by (alpha)(beta). */ /* This will be true for all beta iff the image of the */ /* matching face is contained within the given face. */ /* */ /* We want this routine to run correctly in all cases and */ /* to run quickly in the typical case. In the typical case */ /* the faces will already match exactly, and the edges will */ /* all be of order three, so (alpha)(beta) will in fact */ /* be the group element associated with one of the faces */ /* bordering on the matching face. So in this case we */ /* simply traverse the given face in the counterclockwise */ /* while simultaneously traversing the matching face in the */ /* clockwise direction, and check that each (alpha)(beta) */ /* coincides with a gamma bordering the matching face. If */ /* this fails (as will occur when the faces do not coincide */ /* or the edges are not of order 3) then our fallback plan */ /* is to check that all vertices of the matching face lie */ /* on the correct side of the Dirichlet plane determined by */ /* (alpha)(beta). */ /* */ /* (Note: there may be a better way to structure the */ /* algorithm so that we check edges instead of faces. For */ /* a typical edge (of order three) we want to check that */ /* the product of the three surrounding group elements is */ /* the identity. But that will wait for another day.) */ WEface *match_face; WEedge *edge, *edge0, *placeholder; WEvertex *vertex; double (*alpha)[4], /* these are proj_matrices with */ (*beta)[4], /* no storage attached */ (*gamma)[4]; vector planne; proj_matrix alphabeta; int alphabeta_found; point gorigin; /* If the given face doesn't have an active matching face */ /* (i.e. its mate lies entirely outside the polyhedron) */ /* then we put it at the end of the dirty list and hope it */ /* goes away. */ /* Dec. 8, 92: don't bother with putting the original faces of */ /* the cube on the dirty list. */ if (face->inverse == NULL) { if (face->fill_tone != -2) { face->nxt = &polyhedron->dirty1; face->prv = polyhedron->dirty1.prv; polyhedron->dirty1.prv->nxt = face; polyhedron->dirty1.prv = face; polyhedron->pending0.nxt = &polyhedron->pending1; polyhedron->pending1.prv = &polyhedron->pending0; } /* Be sure the dirty queue contains at least one */ /* face with an active inverse face. If it doesn't */ /* call a routine to try to create some new faces. */ /* If that fails, print a message and exit. */ while (all_dirty_faces_unmatched(polyhedron)) { if (debug) fprintf(stderr, "searching for more group elements\n"); if ( ! unsophisticated_search(polyhedron)) { if (debug) fprintf(stderr, "The dirty list in Dirichlet.c contains only unmatched faces.\n"); return(0); } } return(1); } match_face = face->inverse; alpha = match_face->group_element; /* The value of edge0 is maintained from one use of the */ /* inner loop to the next to improve efficiency in the */ /* case where the faces match exactly. */ edge0 = match_face->some_edge; /* traverse the face */ edge = face->some_edge; do { if (edge->fL == face) { /* edge points counterclockwise */ beta = edge->fR->group_element; edge = edge->e1L; } else { /* edge points clockwise */ beta = edge->fL->group_element; edge = edge->e0R; } proj_mult(alpha, beta, alphabeta); /* is alphabeta the matrix associated with a */ /* neighbor of match_face? */ alphabeta_found = 0; placeholder = edge0; do { /* edge points counterclockwise */ if (edge0->fL == match_face) { gamma = edge0->fR->group_element; edge0 = edge0->e0L; /* traverse CLOCKWISE */ } else { /* edge points clockwise */ gamma = edge0->fL->group_element; edge0 = edge0->e1R; /* traverse CLOCKWISE */ } if (proj_same_matrix(alphabeta, gamma)) { alphabeta_found = 1; break; } } while (edge0 != placeholder); /* If alphabeta_found == 1 we know the image of the */ /* match_face doesn't extend beyond this edge. If */ /* alphabeta_found == 0 we need to investigate */ /* further by checking whether the vertices of the */ /* match_face all lie on the correct side of the */ /* Dirichlet plane determined by alphabeta. */ if ( ! alphabeta_found) { /* see comments in add_face() */ /* first get the image of origin */ matvecmul4(alphabeta, origin, gorigin); DHPt3PerpBisect( origin, gorigin, planne,metric); do { if (edge0->fL == match_face) { /* CCL */ vertex = edge0->v0; edge0 = edge0->e1L; } else { /* CL */ vertex = edge0->v1; edge0 = edge0->e0R; } if (DHPt3Dot(planne, vertex->x,metric) > VERTEX_EPSILON) { /* add the new group element */ add_element(polyhedron, alphabeta); /* if face has been modified, go home */ if (polyhedron->pending0.nxt != face) return(1); /* otherwise if match_face still exists, */ /* keep checking face */ if (face->inverse) { edge0 = match_face->some_edge; break; } /* otherwise put face on the dirty list and */ /* go home */ face->nxt = &polyhedron->dirty1; face->prv = polyhedron->dirty1.prv; polyhedron->dirty1.prv->nxt = face; polyhedron->dirty1.prv = face; polyhedron->pending0.nxt = &polyhedron->pending1; polyhedron->pending1.prv = &polyhedron->pending0; return(1); } } while (edge0 != placeholder); } } while (edge != face->some_edge); return(1); } static int find_Dirichlet_domain(polyhedron) WEpolyhedron *polyhedron; { /* By the time this routine is called the faces */ /* corresponding to the initial generators should all */ /* be on the dirty list, and the clean list should be */ /* empty. The faces are examined one at a time to see */ /* whether (the image of) the matching face is entirely */ /* contained within the given face. If it is, the face */ /* is put on the clean list. If it's not, a new face */ /* is added to the polyhedron. New faces, and old */ /* faces which have been cut, are put on the dirty list.*/ WEface *face; while (polyhedron->dirty0.nxt != &polyhedron->dirty1) { /* pull a face off the dirty list */ face = polyhedron->dirty0.nxt; polyhedron->dirty0.nxt = face->nxt; face->nxt->prv = &polyhedron->dirty0; /* put the face on the pending list so that if */ /* add_face() feels the need to put it on the */ /* dirty list, it will have a list to remove */ /* it from */ face->nxt = &polyhedron->pending1; face->prv = &polyhedron->pending0; polyhedron->pending0.nxt = face; polyhedron->pending1.prv = face; /* check the face */ if (check_face(polyhedron, face) == 0) /* don't worry if original faces hang around */ if (face->fill_tone != -2) return 0; /* if the face is still on the pending list, */ /* move it to the clean list */ if (polyhedron->pending0.nxt == face) { face->nxt = polyhedron->clean0.nxt; face->prv = &polyhedron->clean0; polyhedron->clean0.nxt->prv = face; polyhedron->clean0.nxt = face; } } return 1; } static int all_dirty_faces_unmatched(polyhedron) WEpolyhedron *polyhedron; { WEface *face; int realdirty = 0; /* If at least one face on the dirty list has a */ /* matching face, or the dirty list is empty, */ /* return 0. Otherwise return 1. */ /* Make a change to this routine to ignore faces of the original cube */ if (polyhedron->dirty0.next == &polyhedron->dirty1) return(0); /* shouldn't occur in practice */ for (face = polyhedron->dirty0.nxt; face != &polyhedron->dirty1; face = face->nxt) { if (face->fill_tone != -2) /* not face of original cube */ { if ( face->inverse) return(0); else realdirty = 1; /* there exist unmatched, real faces */ } } return(realdirty); } /* unsophisticated_search() returns 1 if it */ /* manages to add a new face, 0 if it doesn't. */ static int unsophisticated_search(polyhedron) WEpolyhedron *polyhedron; { /* This routine serves as a backup for the more efficient */ /* algorithm which is normally used. On rare occasions */ /* (e.g. for wh_left) the usual algorithm ends up with only */ /* unmatched faces on the dirty list, so it cannot proceed. */ /* This routine tries looking at all products of two */ /* elements in an effort to scare up a new face. */ WEface *face0, *face1; proj_matrix alpha; for (face0=polyhedron->face_list; face0; face0=face0->next) for (face1=polyhedron->face_list; face1; face1=face1->next) { proj_mult(face0->group_element, face1->group_element, alpha); if (add_element(polyhedron, alpha)) return(1); } return(0); } /* Faces are created in matched pairs (corresponding to a */ /* group element and its inverse) by add_element(). If one */ /* element of a pair is killed, the inverse pointer of its */ /* mate is set to NULL. */ /* add_element() returns 1 if it adds a face, 0 if it doesn't */ static int add_element(polyhedron, m0) WEpolyhedron *polyhedron; proj_matrix m0; { proj_matrix m1; WEface *new_face0, *new_face1; int result0, result1, order2 = 0; /* compute the inverse matrix */ proj_invert(m0, m1); if (proj_same_matrix(m0, m1)) order2 = 1; /* create the new faces */ new_face0 = (WEface *) malloc32((MyInt32) sizeof(WEface)); new_face1 = (WEface *) malloc32((MyInt32) sizeof(WEface)); /* set their inverse pointers */ new_face0->inverse = new_face1; new_face1->inverse = new_face0; /* attempt to add the faces */ /* If for any reason one (or both) is unnecessary, */ /* add_face() will free the one and adjust the */ /* inverse pointer of the other. */ if (order2) { new_face0->inverse = new_face0; result0 = add_face(polyhedron, m0, new_face0); return(result0 ); } else { result0 = add_face(polyhedron, m0, new_face0); result1 = add_face(polyhedron, m1, new_face1); return(result0 || result1); } } /* add_face() returns 1 if it adds a face, 0 if it doesn't */ static int add_face(polyhedron, matrix, new_face) WEpolyhedron *polyhedron; proj_matrix matrix; WEface *new_face; { vector planne, gorigin; WEvertex *vertex; int face_is_needed; /* get the normal (in the Minkowski metric) */ /* to the Dirichlet hyperplane */ /* first get the image of origin */ matvecmul4(matrix,origin, gorigin); DHPt3PerpBisect(origin, gorigin, planne,metric); /* Compute the "distance" from each vertex to the */ /* Dirichlet plane. Count the number of vertices */ /* on or beyond the plane. Vertices within */ /* VERTEX_EPSILON of the plane are assumed to lie */ /* on the plane. */ face_is_needed = 0; for (vertex=polyhedron->vertex_list; vertex; vertex=vertex->next) { vertex->dist = DHPt3Dot( planne, vertex->x, metric); if (vertex->dist > VERTEX_EPSILON) face_is_needed = 1; else if (vertex->dist > - VERTEX_EPSILON) { if (fabs(vertex->dist) > 1e-2 * VERTEX_EPSILON && ! vertex_epsilon_message_given) { if (debug) roundoff_message("VERTEX_EPSILON"); vertex_epsilon_message_given = 1; } vertex->dist = 0.0; } } if ( ! face_is_needed) { if (new_face->inverse) new_face->inverse->inverse = NULL; free32(new_face); return(0); } /* put a vertex in the middle of each cut edge */ cut_edges(polyhedron); /* set the new face */ new_face->order = 0; new_face->fill_tone = -1; proj_copy(new_face->group_element, matrix); /* install the new face in the polyhedron */ adjust_f_e_ptrs(polyhedron); cut_faces(polyhedron, new_face); remove_dead_edges(polyhedron); remove_dead_vertices(polyhedron); /* put the new face on the face lists */ new_face->next = polyhedron->face_list; polyhedron->face_list = new_face; new_face->nxt = polyhedron->dirty0.nxt; new_face->prv = &polyhedron->dirty0; polyhedron->dirty0.nxt->prv = new_face; polyhedron->dirty0.nxt = new_face; polyhedron->num_faces++; return(1); } static void cut_edges(polyhedron) WEpolyhedron *polyhedron; { int i; double d0, d1, t, s; WEedge *edge, *new_edge, *nbr_edge; WEvertex *new_vertex; for (edge=polyhedron->edge_list; edge; edge=edge->next) { d0 = edge->v0->dist; d1 = edge->v1->dist; if ((d0 < 0.0 && d1 > 0.0) || (d0 > 0.0 && d1 < 0.0)) { new_vertex = (WEvertex *) malloc32((MyInt32) sizeof(WEvertex)); new_edge = (WEedge *) malloc32((MyInt32) sizeof(WEedge)); t = -d0/(d1 - d0); s = 1.0 - t; for (i=4; --i>=0; ) new_vertex->x[i] = s * edge->v0->x[i] + t * edge->v1->x[i]; new_vertex->dist = 0.0; new_vertex->next = polyhedron->vertex_list; polyhedron->vertex_list = new_vertex; polyhedron->num_vertices++; new_edge->v1 = edge->v1; new_edge->v0 = new_vertex; edge->v1 = new_vertex; nbr_edge = edge->e1L; new_edge->e1L = nbr_edge; if (nbr_edge->e0L == edge) nbr_edge->e0L = new_edge; else nbr_edge->e1R = new_edge; nbr_edge = edge->e1R; new_edge->e1R = nbr_edge; if (nbr_edge->e0R == edge) nbr_edge->e0R = new_edge; else nbr_edge->e1L = new_edge; new_edge->e0L = edge; new_edge->e0R = edge; edge->e1L = new_edge; edge->e1R = new_edge; new_edge->fL = edge->fL; new_edge->fR = edge->fR; edge->fL->order++; edge->fR->order++; new_edge->next = polyhedron->edge_list; polyhedron->edge_list = new_edge; polyhedron->num_edges++; } } return; } static void adjust_f_e_ptrs(polyhedron) WEpolyhedron *polyhedron; { WEedge *edge; /* make sure each good face "sees" a good edge */ for (edge=polyhedron->edge_list; edge; edge=edge->next) if (edge->v0->dist < 0.0 || edge->v1->dist < 0.0) { edge->fL->some_edge = edge; edge->fR->some_edge = edge; } return; } /* check each old face: */ /* (1) if a face is entirely >= 0, remove it */ /* (this can be checked immediately, because each */ /* good face sees a good edge at this point) */ /* (check that removing dead faces doesn't */ /* change the group) */ /* (2) if a face is entirely <=0, leave it alone */ /* (but make sure any 0-0 edges "see" the new face */ /* and the new face sees the 0-0 edges) */ /* also set order of new face */ /* (3) otherwise bisect the face with a new edge, and */ /* make sure the new edge "sees" the new new face */ /* and the old face "sees" a valid edge */ static void cut_faces(polyhedron, new_face) WEpolyhedron *polyhedron; WEface *new_face; { int zero_count, count, count1 = 0, count3 = 0; double d0, d1; WEvertex *v01, *v23; WEedge *edge, *next_edge, *new_edge, *e0 = NULL, *e1 = NULL, *e2 = NULL, *e3 = NULL; WEface *f_list, *face; /* to facilitate removing unneeded faces, first move all */ /* the faces onto f_list, then move the good faces back */ /* onto polyhedron->face_list as they are processed */ f_list = polyhedron->face_list; polyhedron->face_list = NULL; /* we'll count the order of the new_face as we go */ new_face->order = 0; while (f_list) { /* pull a face off f_list */ face = f_list; f_list = f_list->next; /* Is the face entirely >= 0 ? */ /* Note: adjust_f_e_ptrs() has been called, */ /* so all good faces see good edges. */ /* Some fL and fR pointers on 0-0 edges may */ /* temporarily be left dangling when face is freed. */ if (face->some_edge->v0->dist >= 0 && face->some_edge->v1->dist >= 0) { if (face->inverse) face->inverse->inverse = NULL; face->prv->nxt = face->nxt; face->nxt->prv = face->prv; free32(face); --polyhedron->num_faces; continue; } /* cut the face if necessary */ /* counts number of vertices at dist 0 (two consecutive */ /* vertices at dist 0 are counted as one (or none) */ /* because we don't need to cut such a face) */ zero_count = 0; /* We'll traverse the face counterwise to find the */ /* edges going in and out of the "zero vertices" (i.e. */ /* the vertices at dist 0) */ /* e0 = negative to zero */ /* e1 = zero to positive */ /* e2 = positive to zero */ /* e3 = zero to negative */ count = 0; /* for use in finding order of new face */ edge = face->some_edge; do { /* which way does the edge point? */ /* edge points counterclockwise */ if (edge->fL == face) { d0 = edge->v0->dist; d1 = edge->v1->dist; next_edge = edge->e1L; } else { /* edge points clockwise */ d0 = edge->v1->dist; d1 = edge->v0->dist; next_edge = edge->e0R; } if (d0 == 0.0) { if (d1 == 0.0) { if (edge->fL == face) edge->fR = new_face; else edge->fL = new_face; new_face->some_edge = edge; new_face->order++; break; } zero_count++; if (d1 < 0.0) { e3 = edge; count3 = count; } else { /* d1 > 0.0 */ e1 = edge; count1 = count; } } else if (d1 == 0.0) { if (d0 < 0.0) e0 = edge; else /* d0 > 0.0 */ e2 = edge; } edge = next_edge; count++; } while (edge != face->some_edge); if (zero_count == 2) { /* we need to make a cut */ new_edge = &edgeheap[heapcount++]; new_edge = (WEedge *) malloc32((MyInt32) sizeof(WEedge)); polyhedron->num_edges++; new_edge->next = polyhedron->edge_list; polyhedron->edge_list = new_edge; /* v01 = vertex between edges e0 and e1 */ /* v23 = vertex between edges e2 and e3 */ v01 = (e0->v0->dist == 0.0) ? e0->v0 : e0->v1; v23 = (e2->v0->dist == 0.0) ? e2->v0 : e2->v1; new_edge->v0 = v01; new_edge->v1 = v23; new_edge->e0L = e0; new_edge->e0R = e1; new_edge->e1L = e3; new_edge->e1R = e2; new_edge->fL = face; new_edge->fR = new_face; if (e0->v0 == v01) e0->e0R = new_edge; else e0->e1L = new_edge; if (e1->v0 == v01) e1->e0L = new_edge; else e1->e1R = new_edge; if (e2->v0 == v23) e2->e0R = new_edge; else e2->e1L = new_edge; if (e3->v0 == v23) e3->e0L = new_edge; else e3->e1R = new_edge; new_face->some_edge = new_edge; new_face->order++; face->order = (count1 - count3 + face->order)%face->order + 1; /* transfer face to dirty list */ face->prv->nxt = face->nxt; face->nxt->prv = face->prv; face->nxt = polyhedron->dirty0.nxt; face->prv = &polyhedron->dirty0; polyhedron->dirty0.nxt->prv = face; polyhedron->dirty0.nxt = face; } /* put the face back on polyhedron->face_list */ face->next = polyhedron->face_list; polyhedron->face_list = face; } return; } static void remove_dead_edges(polyhedron) WEpolyhedron *polyhedron; { WEedge *e_list, *edge; /* Move all edges onto e_list, then move the good edges */ /* back onto polyhedron->edge_list. */ e_list = polyhedron->edge_list; polyhedron->edge_list = NULL; while (e_list) { /* pull an edge off e_list */ edge = e_list; e_list = e_list->next; /* if it has one or more bad vertices, throw it away */ if (edge->v0->dist > 0.0 || edge->v1->dist > 0.0) { /* first tidy up at vertices of dist 0.0 */ if (edge->v0->dist == 0.0) { if (edge->e0L->e0R == edge) edge->e0L->e0R = edge->e0R; else edge->e0L->e1L = edge->e0R; if (edge->e0R->e0L == edge) edge->e0R->e0L = edge->e0L; else edge->e0R->e1R = edge->e0L; } if (edge->v1->dist == 0.0) { if (edge->e1L->e1R == edge) edge->e1L->e1R = edge->e1R; else edge->e1L->e0L = edge->e1R; if (edge->e1R->e1L == edge) edge->e1R->e1L = edge->e1L; else edge->e1R->e0R = edge->e1L; } /* throw away the edge */ free32(edge); --polyhedron->num_edges; } else { /* put it back on polyhedron->edge_list */ edge->next = polyhedron->edge_list; polyhedron->edge_list = edge; } } return; } static void remove_dead_vertices(polyhedron) WEpolyhedron *polyhedron; { WEvertex *v_list, *vertex; /* Move all vertices onto v_list, then move the */ /* good vertices back onto polyhedron->vertex_list. */ v_list = polyhedron->vertex_list; polyhedron->vertex_list = NULL; while (v_list) { /* pull an vertex off v_list */ vertex = v_list; v_list = v_list->next; /* if it's been cut off, throw it away */ if (vertex->dist > 0.0) { free32(vertex); --polyhedron->num_vertices; } else { /* put it back on polyhedron->vertex_list */ vertex->next = polyhedron->vertex_list; polyhedron->vertex_list = vertex; } } return; } static void number_faces(polyhedron) WEpolyhedron *polyhedron; { int count; WEface *face; /* at this point just assign consecutive indices to the */ /* faces, and let the routines for making display lists,*/ /* saving in other file formats, etc. set the actual */ /* fill tones */ count = 0; for (face=polyhedron->face_list; face; face=face->next) { /* skip faces which were already assigned fill_tones */ /* when their inverses were found */ if (face->fill_tone >= 0) continue; if (face->inverse == NULL) { if (debug) fprintf(stderr, "unmatched faces in Dirichlet.c\n"); } face->fill_tone = count; if (face->inverse) face->inverse->fill_tone = count; count++; } return; } #if 0 static void read_vertices(face, v) WEface *face; double (*v)[3]; { int i; WEedge *edge; edge = face->some_edge; do { if (edge->fL == face) { /* edge points counterclockwise */ for (i=3; --i>=0; ) (*v)[i] = edge->v0->x[i]; v++; edge = edge->e1L; } else { /* edge points clockwise */ for (i=3; --i>=0; ) (*v)[i] = edge->v1->x[i]; v++; edge = edge->e0R; } } while (edge != face->some_edge); return; } #endif static void print_poly(polyhedron) WEpolyhedron *polyhedron; { print_vef(polyhedron); print_vertices(polyhedron); } #if 0 static void print_statistics(polyhedron) WEpolyhedron *polyhedron; { print_vef(polyhedron); print_vertex_distances(polyhedron); print_edge_lengths(polyhedron); print_face_distances(polyhedron); return; } #endif static void print_vef(polyhedron) WEpolyhedron *polyhedron; { if (debug) fprintf(stderr, "%d vertices, %d edges, %d faces\n", polyhedron->num_vertices, polyhedron->num_edges, polyhedron->num_faces); if (polyhedron->num_vertices - polyhedron->num_edges + polyhedron->num_faces != 2) { if (debug) fprintf(stderr, "Euler characteristic error in Dirichlet.c\n"); return; } return; } #if 0 static void saveOOGL(polyhedron) WEpolyhedron *polyhedron; { FILE *fp = fopen("/tmp/test.off","w"); GeomFSave(WEPolyhedronToPolyList(polyhedron), fp, "/tmp/test.off"); fclose(fp); } #endif static void print_vertices(polyhedron) WEpolyhedron *polyhedron; { WEvertex *vertex; fprintf(stderr, "Vertices:\n"); for (vertex=polyhedron->vertex_list; vertex; vertex=vertex->next) fprintf(stderr, "%f\t%f\t%f\t%f\n",vertex->x[0], vertex->x[1], vertex->x[2], vertex->x[3]); } #if 0 static void print_vertex_distances(polyhedron) WEpolyhedron *polyhedron; { WEvertex *vertex; int ideal_vertex_present, finite_vertex_present, i; double norm, max, min, ideal_point_norm; /* Note: the following statement revealed that "infinity" */ /* is at a distance of about 17 on a Mac. */ /* fprintf(stderr, "infinity = %lf\n", acosh(1.0/ideal_point_norm)); */ ideal_point_norm = sqrt(1e5 * HARDWARE_PRECISION); ideal_vertex_present = 0; finite_vertex_present = 0; min = cosh(17.0); max = 0.0; if (metric == DG_HYPERBOLIC) { for (vertex=polyhedron->vertex_list; vertex; vertex=vertex->next) { norm = sqrt(fabs(DHPt3Dot3(vertex->x, vertex->x, metric))); if (norm < ideal_point_norm) { vertex->ideal = 1; ideal_vertex_present = 1; } else { vertex->ideal = 0; for (i=4; --i>=0; ) vertex->x[i] /= norm; if (vertex->x[3] < min) min = vertex->x[3]; if (vertex->x[3] > max) max = vertex->x[3]; finite_vertex_present = 1; } } if (finite_vertex_present) { fprintf(stderr, "closest vertex %.6f\n", acosh(min)); if (ideal_vertex_present) fprintf(stderr, "furthest finite vertex %.6f\n", acosh(max)); else fprintf(stderr, "furthest vertex %.6f\n", acosh(max)); } else fprintf(stderr, "all vertices are at infinity\n"); } return; } #endif /* Note: print_edge_lengths() assumes print_vertex_distances() */ /* has already been called to normalize the vertices. */ #if 0 static void print_edge_lengths(polyhedron) WEpolyhedron *polyhedron; { WEedge *edge; int finite_edge_present, infinite_edge_present; double dot, min, max; min = cosh(17.0); max = 1.0; finite_edge_present = 0; infinite_edge_present = 0; for (edge=polyhedron->edge_list; edge; edge=edge->next) if (edge->v0->ideal || edge->v1->ideal) infinite_edge_present = 1; else { finite_edge_present = 1; dot = -DHPt3Dot3( edge->v0->x,edge->v1->x, metric); if (dot < min) min = dot; if (dot > max) max = dot; } if (finite_edge_present) if (infinite_edge_present) { fprintf(stderr, "shortest finite edge %.6f\n", acosh(min)); fprintf(stderr, "longest finite edge %.6f\n", acosh(max)); } else { fprintf(stderr, "shortest edge %.6f\n", acosh(min)); fprintf(stderr, "longest edge %.6f\n", acosh(max)); } else fprintf(stderr, "all edges are infinite\n"); return; } #endif #if 0 static void print_face_distances(polyhedron) WEpolyhedron *polyhedron; { WEface *face; double min, max; min = 1e308; /* ieee max double */ max = 0; for (face=polyhedron->face_list; face; face=face->next) { if (face->group_element[3][3] < min) min = face->group_element[3][3]; if (face->group_element[3][3] > max) max = face->group_element[3][3]; } fprintf(stderr, "closest face plane %.6f\n", 0.5 * acosh(min)); fprintf(stderr, "furthest face plane %.6f\n", 0.5 * acosh(max)); return; } #endif #if 0 static void free_polyhedron(polyhedron) WEpolyhedron *polyhedron; { WEvertex *dead_vertex; WEedge *dead_edge; WEface *dead_face; while (polyhedron->vertex_list) { dead_vertex = polyhedron->vertex_list; polyhedron->vertex_list = dead_vertex->next; free32(dead_vertex); } while (polyhedron->edge_list) { dead_edge = polyhedron->edge_list; polyhedron->edge_list = dead_edge->next; free32(dead_edge); } while (polyhedron->face_list) { dead_face = polyhedron->face_list; polyhedron->face_list = dead_face->next; free32(dead_face); } return; } #endif static void roundoff_message(epsilon_name) char *epsilon_name; { #if PRECISE_GENERATORS fprintf(stderr,"\nWARNING: roundoff error is getting a bit large. (%s)\n", epsilon_name); #else fprintf(stderr,"\nWARNING: roundoff error is getting perilously large. (%s)\n", epsilon_name); #endif fprintf(stderr,"To verify the correctness of the final Dirichlet domain,\n"); fprintf(stderr,"move off to another point in the Dehn filling plane, then\n"); fprintf(stderr,"return to the present point, recompute the Dirichlet domain,\n"); fprintf(stderr,"and see whether you get the same number of vertices, edges\n"); fprintf(stderr,"and faces. (Moving to a different point and then returning\n"); fprintf(stderr,"will randomize the roundoff error.)\n\n"); return; } int proj_same_matrix(m0, m1) proj_matrix m0, m1; { int i, j; double diff; for (i=4; --i>=0; ) for (j=4; --j>=0; ) { diff = fabs(m0[i][j] - m1[i][j]); if (diff > MATRIX_EPSILON) return(0); if (diff > 1e-2 * MATRIX_EPSILON && ! matrix_epsilon_message_given) { if (debug) roundoff_message("MATRIX_EPSILON"); matrix_epsilon_message_given = 1; } } return(1); } geomview-1.9.5/src/lib/gprim/discgrp/xform.c0000644000175000017500000000400412310110200015650 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif typedef double point4[4]; typedef double plane4[4]; typedef double matrix4[4][4]; void matvecmul4(m,v1,v2) matrix4 m; point4 v1,v2; { int i,j; double tmp[4], *tv1, *tv2; tv1 = (double *) v1; tv2 = (double *) v2; for (i=0; i<4; ++i) for (tmp[i]=0, j = 0; j<4; ++j) tmp[i] += m[i][j] * tv1[j]; for (i=0; i<4; ++i) tv2[i] = tmp[i]; } void vecmatmul4(v1,m,v2) matrix4 m; point4 v1,v2; { int i,j; double tmp[4], *tv1, *tv2; tv1 = (double *) v1; tv2 = (double *) v2; for (i=0; i<4; ++i) for (tmp[i]=0, j = 0; j<4; ++j) tmp[i] += m[j][i] * tv1[j]; for (i=0; i<4; ++i) tv2[i] = tmp[i]; } void matmatmul4 (mat1, mat2, mat3) matrix4 mat1, mat2, mat3; { int i, j, k; double tmp[4]; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { tmp[j] = 0.0; for (k = 0; k < 4; k++) { tmp[j] += mat1[i][k] * mat2[k][j]; } mat3[i][j] = tmp[j]; } } } geomview-1.9.5/src/lib/gprim/discgrp/complex.h0000644000175000017500000000361512310110200016200 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _complex_ #define _complex_ #include typedef struct { double real, imag; } complex; typedef complex sl2c_matrix[2][2]; #ifndef PROTOTYPES Please #include options.h BEFORE complex.h. #endif #if PROTOTYPES extern complex cplx_minus(complex, complex), cplx_plus(complex, complex), cplx_mult(complex, complex), cplx_div(complex, complex); extern double modulus(complex); extern complex cplx_sqrt(complex); extern void sl2c_mult(sl2c_matrix, sl2c_matrix, sl2c_matrix); extern void sl2c_copy(sl2c_matrix, sl2c_matrix); extern void sl2c_normalize(sl2c_matrix); extern void sl2c_invert(sl2c_matrix, sl2c_matrix); extern double sl2c_norm_squared(sl2c_matrix); extern void sl2c_adjoint(sl2c_matrix, sl2c_matrix); extern double acosh(double); #else extern complex cplx_minus(), cplx_plus(), cplx_mult(), cplx_div(); extern double modulus(); extern complex cplx_sqrt(); extern double sl2c_norm_squared(); /*extern double acosh();*/ #endif extern complex zero; extern complex one; #endif geomview-1.9.5/src/lib/gprim/discgrp/dgflag.h0000644000175000017500000000544112310110200015754 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef DGFLAGDEFS #define DGFLAGDEFS #define DG_HYPERBOLIC 1 #define DG_EUCLIDEAN 2 #define DG_SPHERICAL 4 #define DG_FINITE 8 #define DG_TRANSPOSED 16 #define DG_CONFORMALBALL 32 #define DG_UPPERHALFSPACE 64 #define DG_PROJECTIVEMODEL 128 #define DG_NUM_ATTR 8 /* the above are the attributes */ #define DG_METRIC_BITS (DG_HYPERBOLIC | DG_EUCLIDEAN | DG_SPHERICAL) #define DG_MODEL_BITS (DG_CONFORMALBALL | DG_UPPERHALFSPACE | DG_PROJECTIVE) /* for the matrix group entries */ #define DG_GENERAL 0x000 /* general invertible group: default */ #define DG_SPECIAL 0x100 /* determinant +/- 1 */ #define DG_ORTHOGONAL 0x200 /* M.Transpose(M) = d.I */ #define DG_PROJECTIVE 0x400 /* M.Transpose(M) = d.I */ #define DG_REAL 0x000 /* default is real */ #define DG_COMPLEX 0x800 /* default is real */ #define DG_TMP 0x10000 /* flag */ #define DG_CENTERCAM 1 #define DG_NEWDIRDOM 2 /* recompute dirdom */ #define DG_DRAWDIRDOM 4 #define DG_ZCULL 8 /* don't draw those behind the camera */ #define DG_DRAWCAM 0x10 #define DG_DDBEAM 0x20 /* compute beamed dirichlet domain */ #define DG_DDSLICE 0x40 /* slice off cusps in dirichlet domain */ #define DG_DEBUG 0x100 #define DG_SAVEBIGLIST 0x200 /* does DiscGrpSave write out the group elements? */ #define DG_SAVEDIRDOM 0x400 /* does DiscGrpSave write out the dirichlet domain? */ #define DG_DRAWGEOM 0x800 /* draw other geometry? */ #define DG_NUM_DSPYATTR 5 /* zcull, cenercam, drawcam, drawdirdom, and drawgeom are externally settable */ /* constraint return values (only DG_CONSTRAINT_VALID is required) */ #define DG_CONSTRAINT_PRINT 1 #define DG_CONSTRAINT_TOOFAR 2 #define DG_CONSTRAINT_STORE 4 #define DG_CONSTRAINT_LONG 8 #define DG_CONSTRAINT_NEW 16 #define DG_CONSTRAINT_MAXLEN 32 /* bits in DiscGrpEl.attributes */ #define DGEL_IS_IDENTITY 0x1 /* need to mark the identity matrix */ #endif /*DGFLAGDEFS*/ geomview-1.9.5/src/lib/gprim/discgrp/discgrp.h0000644000175000017500000000723112310110200016162 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef DISCGRPDEF #define DISCGRPDEF #include "bbox.h" #include "dgflag.h" #include "create.h" #include "appearance.h" #include "pick.h" #include "streampool.h" #ifndef NULL #define NULL 0 #endif #ifndef FALSE #define FALSE 0 #endif #define DISCGRPMAGIC GeomMagic('d',1) typedef struct DiscGrp DiscGrp ; extern DiscGrp * DiscGrpPick( DiscGrp *, Pick *, Appearance *, Transform, TransformN *, int * ); extern GeomClass *DiscGrpMethods( void ); extern char *DiscGrpName( void ); /* extern DiscGrp *DiscGrpFLoad( FILE *, char * ); extern DiscGrp *DiscGrpLoad( char * ); */ extern Geom *DiscGrpImport (Pool * ); extern DiscGrp *DiscGrpSave( DiscGrp *, char * ); extern DiscGrp *DiscGrpFSave( DiscGrp *, FILE *, char * ); extern BBox *DiscGrpBound( DiscGrp *, Transform T, TransformN *TN); extern DiscGrp *DiscGrpDraw( DiscGrp * ); /* extern DiscGrpElList *DiscGrpElListCreate(DiscGrpElList *, ...); extern DiscGrp *DiscGrpEvert( DiscGrp * ); extern DiscGrp *DiscGrpTransform( DiscGrp *, Transform ); extern DiscGrp *DiscGrpTransformTo( DiscGrp *, Transform ); */ /* tokens used by the create routines, not duplicated in create.h */ /* we'll use the '900' region: this ought to be registered somewhere */ /* DGELC == DiscGrpElListCreate DGC == DiscGrpCreate */ enum { DGCR_ATTRIBUTE = 900, /* int : attributes in both DGC and DGELC */ DGCR_ATTRIBUTELIST, /* int * : list of attributes in DGELC */ DGCR_WORD, /* char (*)[DG_WORDLENGTH] : used by * DiscGrpElListCreate */ DGCR_ELEM, /* DiscGrpEl * : used in DGELC note that * CR_ELEM is also used here */ DGCR_CPOINT, /* HPoint3 * :base point of dirichlet domain: */ DGCR_CAMGEOM, /* Geom * :geometry used to represent the observer*/ DGCR_CAMGEOMHANDLE, /* Handle * */ DGCR_HANDLE_CAMGEOM, /* Handle *, Geom * */ DGCR_DDGEOM, /* Geom * :geometry for Dirichlet domain */ DGCR_DDGEOMHANDLE, /* Handle * */ DGCR_HANDLE_DDGEOM, /* Handle *, Geom * */ DGCR_GENS, /* DiscGrpElList * : generators */ DGCR_BIGLIST, /* DiscGrpElList * : general list */ DGCR_ENUMDEPTH, /* int : depth to compute wordlist */ DGCR_ENUMDIST, /* float : maximum distance of tiles */ DGCR_SCALE, /* float : scaling factor for dirdom */ DGCR_FLAG, /* the flag field of the DiscGrp */ DGCR_NAME, /* the flag field of the DiscGrp */ DGCR_COMMENT, /* the flag field of the DiscGrp */ DGCR_DRAWDIST, /* max distance grp el moves cpoint for * drawing purposes (generally less than * enumdist)_ */ DGCR_END }; #endif /*DISCGRPDEF*/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/discgrp/discgrpP.h0000644000175000017500000001037112310110200016301 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef DISCGRPPDEF #define DISCGRPPDEF #include "geomclass.h" #include "discgrp.h" #include "3d.h" #include "wa.h" #include "winged_edge.h" /* attributes */ #define DG_KEYWORDSIZE 32 #define DG_NAMESIZE 128 #define DG_LABELSIZE 256 #define DG_WORDLENGTH 32 #define DG_MAXGENS 128 /* MAXGENS appears in fsa.h */ struct DiscGrpEl { int attributes; /* type? fixed points, etc? */ char word[DG_WORDLENGTH]; /* the 'string' in the generators? */ Transform tform; ColorA color; struct DiscGrpEl *inverse; }; typedef struct DiscGrpEl DiscGrpEl; typedef struct keytokenpair { char key[32]; int token; } keytokenpair; typedef struct { int attributes; /* special, orthogonal, projective, etc */ /* plus entry type ... */ int dimn; /* dimension of matrix */ int sig; /* signature of group */ } matrixgroup; typedef struct { int num_el; matrixgroup mgroup; DiscGrpEl *el_list; } DiscGrpElList; typedef struct { #define FRUS_LEFT 0 #define FRUS_RIGHT 1 #define FRUS_TOP 2 #define FRUS_BOTOM 3 HPoint3 frustrum[4]; /* planes for culling against view frustum */ Transform m2w, w2m, c2w, w2c, c2m, m2c; } dgviewinfo; struct DiscGrp { GEOMFIELDS; char *name; char *comment; unsigned flag; /* graphics flags */ int attributes; /* group attributes */ int dimn; float (*c2m)[4]; /* record the transform taking cam->model*/ wa *fsa; /* word acceptor */ DiscGrpElList *gens; /* generators */ DiscGrpElList *nhbr_list; /* dirdom neighbors */ DiscGrpElList *big_list; /* some arbitrary list of group el's */ HPoint3 cpoint; /* center point for dirichlet domain */ Geom *camgeom; /* camera geom: moves w/ camera */ Handle *camgeomhandle; Geom *ddgeom; /* special geom*/ Handle *ddgeomhandle; Geom *geom; /* geometry for one fund domain */ Handle *geomhandle; float scale; /* shrink dirdom before drawing... */ int enumdepth; /* max word length for big_list */ float enumdist; /* max distance grp el moves cpoint */ float drawdist; /* max distance grp el moves cpoint for drawing purposes (generally less than enumdist)_ */ void (*predraw)(); dgviewinfo viewinfo; /* camera position, etc */ } ; extern HPoint3 DGorigin; extern GeomClass *DiscGrpClass; /* private methods */ extern void DiscGrpSetupDirdom( DiscGrp *discgrp); extern DiscGrpEl *DiscGrpClosestGroupEl( DiscGrp *discgrp, HPoint3 *poi); extern DiscGrpElList *DiscGrpExtractNhbrs( WEpolyhedron *wepoly ); extern Geom *DiscGrpDirDom( DiscGrp *dg); extern Geom *WEPolyhedronToBeams( WEpolyhedron *poly, float alpha); extern WEpolyhedron *DiscGrpMakeDirdom( DiscGrp *dg, HPoint3 *pt0, int slice); extern DiscGrpElList *DiscGrpEnum( DiscGrp *dg, int (*constraintfn)()); extern void DiscGrpInitStandardConstraint( int depth, float d0, float d1); extern int DiscGrpStandardConstraint( DiscGrpEl *dgel); extern DiscGrpElList *DiscGrpElListDelete (DiscGrpElList *exist); extern void DiscGrpAddInverses(DiscGrp *discgrp); void DHPt3PerpBisect(/*point4 p0, point4 p1, point4 result, int metric*/); extern int needstuneup(); extern void tuneup(); extern int is_new(); extern int insert_or_match_mat(); extern int push_new_stack(); extern int enumpush(); extern void init_stack(); extern void make_new_old(); extern int init_out_stack(); extern void delete_list(); extern int enumgetsize(); #endif /* ! DISCGRPPDEF */ geomview-1.9.5/src/lib/gprim/discgrp/enum.h0000644000175000017500000000225012310110200015467 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #define MAXDEPTH 32 #define INSERT 1 #define MATCH 2 #define BEGIN 4 /* loaded at beginning: don't print it */ #define insert_mat(xxx) insert_or_match_mat(xxx, INSERT) #define match_mat(xxx) insert_or_match_mat(xxx, MATCH) #define begin_mat(xxx) insert_or_match_mat(xxx, INSERT | BEGIN) geomview-1.9.5/src/lib/gprim/discgrp/extern.h0000644000175000017500000000255612310110200016041 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #include #include "color.h" typedef double vec4[4]; /* in xform.c */ extern proj_matrix *matmatmul4 (); extern vec4 *vecmatmul4 (); extern vec4 *matvecmul4 (); /* in projective.c */ extern vec4 *conf2proj (); extern vec4 *proj2conf (); extern vec4 *hs2ball (); extern proj_matrix *sl2c2proj (); /* in polyhedron.c */ extern Geom *WEPolyhedronToPolyList(); extern Geom *WEPolyhedronToVect(); /* colormap.c */ extern int readcmap(); extern ColorA GetCmapEntry(); geomview-1.9.5/src/lib/gprim/discgrp/options.h0000644000175000017500000000410012310110200016212 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _options_ #define _options_ #define MAC 0 #define SUN 1 #define VAX 2 #define CRAY 3 #define GENERIC 4 #define HOST GENERIC /* LightspeedC has a few idiosyncracies which vary from one version to the next. If you are using LightspeedC (a.k.a. THINK C) define the appropriate version number here (e.g. #define LSC 4 for version 4.0). If you aren't using LightspeedC (and perhaps not even using a Mac at all) you should #define LSC 0. */ #if (HOST == MAC) #define LSC 4 #else #define LSC 0 #endif #define PROTOTYPES 1 #if (LSC == 3) #define _MC68881_ #endif #if (HOST == MAC) typedef long int MyInt32; #else #include /* to get size_t definition */ typedef size_t MyInt32; #endif /* The constant HARDWARE_PRECISION gives the accuracy of a double */ /* precision floating point number on the host hardware. I.e. if */ /* the mantissa of a double has b bits, HARDWARE_PRECISION is 2^-b. */ /* Note: in the unlikely event that HARDWARE_PRECISION < 1e-21 */ /* you'll have to provide more coefficients in the series for the */ /* Lobachevsky function in volume.c. */ #if (HOST == MAC) #define HARDWARE_PRECISION 6e-20 #else #define HARDWARE_PRECISION 4e-15 #endif #endif geomview-1.9.5/src/lib/gprim/discgrp/projective.h0000644000175000017500000000257512310110200016707 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _projective_ #define _projective_ #ifndef _proj_matrix_ #define _proj_matrix_ typedef double proj_matrix[4][4]; typedef double point[4]; #endif #if PROTOTYPES /* in sl2c_to_proj.c */ extern void sl2c_to_proj(/*sl2c_matrix, proj_matrix*/); extern void proj_to_sl2c(/*proj_matrix, sl2c_matrix*/); extern void proj_mult(/*proj_matrix, proj_matrix, proj_matrix*/); extern void proj_copy(/*proj_matrix, proj_matrix*/); extern void proj_invert(/*proj_matrix, proj_matrix*/); #endif #endif geomview-1.9.5/src/lib/gprim/discgrp/vec4.h0000644000175000017500000000750612310110200015375 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #include typedef double point4[4]; typedef double plane4[4]; typedef double matrix4[4][4]; #define ABS(aaa) (( (aaa) > 0) ? (aaa) : -(aaa)) #define VDOT3(v0,v1) (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2]) #define INPRO31(v0,v1) (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] - v0[3]*v1[3]) #define INPRO4(v0,v1) (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3]) #define MAGNITUDE3(v0) (sqrt (VDOT3(v0, v0))) #define MAGNITUDE31(v0) (sqrt (ABS (INPRO31(v0, v0)))) #define MAGNITUDE4(v0) (sqrt (INPRO4(v0, v0))) #define PROJECT4(v0) \ {float d = v0[3]; \ if (d) { \ d = 1.0/d; \ v0[0] = v0[0] * d; \ v0[1] = v0[1] * d; \ v0[2] = v0[2] * d; \ v0[3] = 1.0; }} #define NORMALIZE3(v0) \ {double xxx; \ if (xxx = MAGNITUDE3(v0)) \ {v0[0] /= xxx; v0[1] /= xxx; v0[2] /= xxx; } } #define NORMALIZE31(v) \ {double tmp = INPRO31(v,v); \ if (tmp) { tmp = 1.0/sqrt(ABS(tmp)); v[0] *= tmp; v[1] *= tmp; v[2] *= tmp; v[3] *= tmp; }} #define NORMALIZE4(v) \ {double tmp = INPRO4(v,v); \ if (tmp) { tmp = 1.0/sqrt(ABS(tmp)); v[0] *= tmp; v[1] *= tmp; v[2] *= tmp; v[3] *= tmp; }} #define VPRINT3(name,v) printf("name\t%f %f %f\n",v[0],v[1],v[2]); #define VPRINT4(name,v) printf("name\t%f %f %f %f %f\n",v[0],v[1],v[2],v[3]); #define VADD3(v0,v1,v2) \ {v2[0] = v0[0] + v1[0]; \ v2[1] = v0[1] + v1[1]; \ v2[2] = v0[2] + v1[2]; \ v2[3] = 1.0; } #define VADD4(v0,v1,v2) \ {v2[0] = v0[0] + v1[0]; \ v2[1] = v0[1] + v1[1]; \ v2[2] = v0[2] + v1[2]; \ v2[3] = v0[3] + v1[3]; } #define VSUB3(v0,v1,v2) \ {v2[0] = v0[0] - v1[0]; \ v2[1] = v0[1] - v1[1]; \ v2[2] = v0[2] - v1[2]; \ v2[3] = 1.0;} #define VSUB4(v0,v1,v2) \ {v2[0] = v0[0] - v1[0]; \ v2[1] = v0[1] - v1[1]; \ v2[2] = v0[2] - v1[2]; \ v2[3] = v0[3] - v1[3];} #define MIDPOINT4(v0,v1,v2) \ {v2[0] = (v0[0] + v1[0])/2.0; \ v2[1] = (v0[1] + v1[1])/2.0; \ v2[2] = (v0[2] + v1[2])/2.0; \ v2[3] = (v0[3] + v1[3])/2.0; } #define VISZERO4(v) (v[0] == 0 && v[1] == 0 && v[2] == 0 && v[3] == 0) #define MIDPOINT31(v0,v1,v2) \ {float m00, m11, a,v3[4]; \ VSUB4(v0, v1, v3); \ if (VISZERO4(v3)) \ VCOPY4(v0,v2) \ else { \ m00 = INPRO31(v0,v3); \ m11 = INPRO31(v1,v3); \ v2[0] = m11*v0[0] - m00*v1[0]; \ v2[1] = m11*v0[1] - m00*v1[1]; \ v2[2] = m11*v0[2] - m00*v1[2]; \ v2[3] = m11*v0[3] - m00*v1[3]; }} #define XPRO3(v0,v1,v2) \ {v2[0] = v0[1]*v1[2] - v0[2]*v1[1]; \ v2[1] = v0[2]*v1[0] - v0[0]*v1[2]; \ v2[2] = v0[0]*v1[1] - v0[1]*v1[0]; } #define VSCALE3(v0, s, v1) \ {v1[0] = s * v0[0]; \ v1[1] = s * v0[1]; \ v1[2] = s * v0[2]; } #define VSCALE4(v0, s, v1) \ {v1[0] = s * v0[0]; \ v1[1] = s * v0[1]; \ v1[2] = s * v0[2]; \ v1[3] = s * v0[3]; } #define VCOPY3(v0, v1) \ {v1[0] = v0[0]; \ v1[1] = v0[1]; \ v1[2] = v0[2]; } #define VCOPY4(v0, v1) \ {v1[0] = v0[0]; \ v1[1] = v0[1]; \ v1[2] = v0[2]; \ v1[3] = v0[3];} #define VZERO3(v0) \ {v0[0] = 0; \ v0[1] = 0; \ v0[2] = 0; \ v0[3] = 1.0; } #define COPYMAT4(m1, m2) \ memcpy(m2, m1, (sizeof(m1[0][0]) * 16)); geomview-1.9.5/src/lib/gprim/discgrp/winged_edge.h0000644000175000017500000000417012310110200016767 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _winged_edge_ #define _winged_edge_ #ifndef _proj_matrix_ #define _proj_matrix_ typedef double proj_matrix[4][4]; typedef double point[4]; #endif typedef struct WEvertex { double x[4]; /* coordinates (x[3] == 1) */ double dist; /* distance from slicing plane (used locally) */ int ideal; /* is this an ideal vertex (used locally) */ struct WEvertex *next; } WEvertex; typedef struct WEedge { struct WEvertex *v0, /* tail */ *v1; /* tip */ struct WEedge *e0L, /* back left */ *e0R, /* back right */ *e1L, /* front left */ *e1R; /* front right */ struct WEface *fL, /* left face */ *fR; /* right face */ struct WEedge *next; } WEedge; typedef struct WEface { int order; int fill_tone; struct WEedge *some_edge; proj_matrix group_element; struct WEface *inverse; struct WEface *next; /* general use */ struct WEface *prv; /* used for clean and dirty lists */ struct WEface *nxt; } WEface; typedef struct { int num_vertices, num_edges, num_faces; WEvertex *vertex_list; WEedge *edge_list; WEface *face_list; WEface dirty0, /* dummy faces to serve as start and */ dirty1, /* finish of doubly linked lists */ clean0, clean1, pending0, pending1; } WEpolyhedron; #endif geomview-1.9.5/src/lib/gprim/discgrp/Headers0000644000175000017500000000014412310110200015650 00000000000000complex.h dgflag.h discgrp.h discgrpP.h enum.h extern.h options.h projective.h vec4.h winged_edge.h geomview-1.9.5/src/lib/gprim/discgrp/discgrp.5gv0000644000175000017500000001154112310110200016433 00000000000000.TH discgrp 5gv "Date: 92/08/26" " " "Geometry Project Programs" .SH NAME discrete group file formats .SH SYNOPSIS An ascii file representation of a discrete geometric group. .SH SUMMARY This file format applies to a wide variety of groups encountered in topology and geometry. At the beginning of the file is the string DISCGRP, in conformity with other OOGL file formats (see oogl(5)). The remainder of the file is a series of parenthesized expressions. The file format is based on an expandable set of key markers and values. A typical entry would be .RS .nf (group borromean ) .fi .RE where parentheses enclose the expression. The string 'group' is called the key marker. The remaining text contains a value, in this case a character string which is the name of the group. .Pp Key markers currently recognized and their values include: .RS .nf group A name for this group. comment An arbitrary comment [maximum length 256 bytes] [must be enclosed in double quotes] attribute One of a several keyword identifiers including: euclidean is a euclidean group hyperbolic is a hyperbolic group spherical is a spherical group transposed the matrices are transposed finite this is a finite group model In the case that 'hyperbolic' is an attribute, and the dimension is three, this keyword sets the model that is expected for reading subsequent isometries, i.e., expects elements of SL(2,C) if the model is upperhalfspace or conformalball and O(3,1,R) if it is projective. projective default upperhalfspace conformalball [not currently implemented] display These values set characteristics of the the display of the discrete group. centercam keeps the camera centered in central dirichlet domain. zcull removes tiles which lie behind the camera. showcam if centercam is set, displays camgeom, if provided (see below). dimn The dimension of the space. ngens Number of generators. gens List of generators. nels Number of group elements. els List of group elements. wafile Word acceptor file (in DEAGL format version 2.2) camgeom An OOGL-format geometry description to represent the observer. geom An OOGL-format geometry description. Will replace the default Dirichlet domain computation. .fi .RE .PP String-matching of key markers and attribute values is case-insensitive. .PP Currently all matrices must be 4x4 real matrices. Hence the only valid dimensions are 2,3, or 4. The typical case is dimension 3 where there are projective models for hyperbolic, euclidean, and spherical geometry. Dimension 2 groups should leave the z-coordinate unchanged. .PP Matrices are considered transposed if they are considered to act on column vectors as in: M.v = v'. This is the usual mathematical convention convention. So, if you use this convention you must mark your matrices as being transposed. .PP Group elements are specified by an optional character string followed by a list of 16 real numbers. For the case of generators, the character string represents the name of that generator. Its main use is with the automatic group software: the name used here should match that of the generator in the word acceptor file. It should, for example, be a single character for the software to work reliably. For composite elements, the string is the word in the generators which describes this group element. .PP OOGL libraries expect discrete group files to use the '.dgp' suffix. .PP A file which describes the group of the three dimensional torus follows: .RS .nf DISCGRP (group 3torus ) (comment " This is a test of the new discrete group library. " ) (attribute Euclidean ) (display centercam ) (enumdepth 3 ) # look at all words of length 3 or less in generators (enumdist 10.0 ) # and which don't move the origin more than 10.0 (dimn 3 ) (ngens 3 ) (gens a 1 0 0 0 0 1 0 0 0 0 1 0 1 0 -0.1 1 b 1 0 0 0 0 1 0 0 0 0 1 0 0.1 1 0 1 c 1 0 0 0 0 1 0 0 0 0 1 0 0 0.2 1 1 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) (camgeom { = OFF 5 2 5 0 0 0 -0.1 0 0.5 0.1 0 0.5 0 -0.1 0.5 0 0.1 0.5 3 0 1 2 200 200 0 .8 3 0 3 4 0 200 200 .8 } ) .fi .RE .PP .SH FILES Example group files are to be found in the OOGL release in ${GEOM}/data/groups, where e.g., GEOM = /u/gcg/ngrap. See also discgrp(3) and automata(1). .SH AUTHORS Charlie Gunn. .SH BUGS For dimension 2, the code should read and write 3 x 3 matrices. geomview-1.9.5/src/lib/gprim/geom/0000755000175000017500000000000012310165602013747 500000000000000geomview-1.9.5/src/lib/gprim/geom/Makefile.in0000644000175000017500000005147612310165554015757 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/geom DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgeom_la_LIBADD = am_libgeom_la_OBJECTS = bound.lo boundsphere.lo class.lo copy.lo \ create.lo delete.lo dice.lo draw.lo evert.lo extend.lo \ geomstream.lo handlescan.lo iterate.lo knownclass.lo \ message.lo name.lo pick.lo replace.lo transform.lo bsptree.lo libgeom_la_OBJECTS = $(am_libgeom_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgeom_la_SOURCES) DIST_SOURCES = $(libgeom_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ # # $(OPENGLINCLUDE) is needed for bsptree.c to get the correct # location of the glu.h header file. # INCLUDES = $(default_includes) $(OPENGLINCLUDE) EXTRA_DIST = Headers noinst_LTLIBRARIES = libgeom.la libgeom_la_SOURCES = \ bound.c boundsphere.c class.c copy.c create.c delete.c dice.c draw.c \ evert.c extend.c geomstream.c handlescan.c iterate.c knownclass.c message.c \ name.c pick.c replace.c transform.c \ geomclass.h geomclass_sm.h geom.h pick.h pickP.h vert.h \ bsptree.c bsptree.h bsptreeP.h nodedata.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/geom/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/geom/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgeom.la: $(libgeom_la_OBJECTS) $(libgeom_la_DEPENDENCIES) $(EXTRA_libgeom_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgeom_la_OBJECTS) $(libgeom_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boundsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bsptree.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/class.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/delete.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dice.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/draw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extend.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geomstream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handlescan.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iterate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/knownclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/message.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/name.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/replace.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/geom/Makefile.am0000644000175000017500000000101212310110200015675 00000000000000# # $(OPENGLINCLUDE) is needed for bsptree.c to get the correct # location of the glu.h header file. # INCLUDES = $(default_includes) $(OPENGLINCLUDE) EXTRA_DIST = Headers noinst_LTLIBRARIES = libgeom.la libgeom_la_SOURCES = \ bound.c boundsphere.c class.c copy.c create.c delete.c dice.c draw.c \ evert.c extend.c geomstream.c handlescan.c iterate.c knownclass.c message.c \ name.c pick.c replace.c transform.c \ geomclass.h geomclass_sm.h geom.h pick.h pickP.h vert.h \ bsptree.c bsptree.h bsptreeP.h nodedata.h geomview-1.9.5/src/lib/gprim/geom/bound.c0000644000175000017500000000302612310110200015123 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" /* * Compute the bounding box of a geom. * If a transform T is supplied, compute bbox of geom transformed by T; * if T is NULL, compute bbox of geom in its native coordinates. */ Geom *GeomBound(Geom *geom, Transform T, TransformN *TN) { if (geom && geom->Class->bound) { return (*geom->Class->bound) (geom, T, TN); } return NULL; } geomview-1.9.5/src/lib/gprim/geom/boundsphere.c0000644000175000017500000000540112310110200016331 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "hpoint3.h" #include "geomclass.h" #include "geom.h" #include "bbox.h" #include "create.h" /* Take this out once the create flags are all in the right place */ #include "sphereP.h" Geom *GeomBoundSphereFromBBox(Geom *geom, Transform T, TransformN *TN, int *axes, int space) { Geom *sphere, *bbox; HPoint3 minmax[2]; /* The BoundSphere really is something 3-dimensional */ if (axes == NULL) { static int dflt_axes[] = { 1, 2, 3, 0 }; axes = dflt_axes; } bbox = GeomBound(geom, T, TN); if (bbox == NULL) return NULL; if (TN) { HPointN *minmaxN[2] = { NULL, NULL }; BBoxMinMaxND((BBox *)bbox, &minmaxN[0], &minmaxN[1]); GeomDelete(bbox); HPtNToHPt3(minmaxN[0], axes, &minmax[0]); HPtNToHPt3(minmaxN[1], axes, &minmax[1]); HPtNDelete(minmaxN[0]); HPtNDelete(minmaxN[1]); } else { BBoxMinMax((BBox *)bbox, &minmax[0], &minmax[1]); GeomDelete(bbox); } HPt3Dehomogenize(&minmax[0], &minmax[0]); HPt3Dehomogenize(&minmax[1], &minmax[1]); sphere = GeomCreate("sphere", CR_ENCOMPASS_POINTS, minmax, CR_NENCOMPASS_POINTS, 2, CR_SPACE, space, CR_END); #if 0 /* ???? is this correct? The bounding box has already been transformed by T ... */ if (sphere != NULL && T != NULL) GeomTransform(sphere, T, TN); #endif return sphere; } Geom *GeomBoundSphere(Geom *geom, Transform T, TransformN *TN, int *axes, int space) { if (geom && geom->Class->boundsphere) { return (*geom->Class->boundsphere) (geom, T, TN, axes, space); } return GeomBoundSphereFromBBox(geom, T, TN, axes, space); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/geom/class.c0000644000175000017500000000564612310110200015133 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "string.h" #include "geomclass.h" static struct classtable { struct classtable *next; char *classname; GeomClass *Class; } *table = NULL; GeomClass * GeomClassLookup( name ) char *name; { static char done = 0; struct classtable *cp; if(!done) { done = 1; GeomKnownClassInit(); } for(cp = table; cp != NULL; cp = cp->next) if( strcmp( cp->classname, name ) == 0 ) return cp->Class; return NULL; } static void GeomClassInstall( name, Class ) char *name; GeomClass *Class; { struct classtable *cp; cp = OOGLNewE(struct classtable, "GeomClass table"); cp->next = table; table = cp; cp->classname = strdup(name); cp->Class = Class; } GeomClass * GeomSubClassCreate( classname, subclassname ) char *classname, *subclassname; { GeomClass *Class, *subclass; Class = GeomClassLookup( classname ); if( !Class ) { Class = OOGLNewE(GeomClass, "GeomClass"); memset( (char *)Class, 0, sizeof(GeomClass) ); GeomClassInstall( classname, Class ); } subclass = OOGLNewE(GeomClass, "GeomClass"); memcpy( (char *)subclass, (char *)Class, sizeof(GeomClass) ); subclass->super = Class; GeomClassInstall( subclassname, subclass ); return subclass; } GeomClass * GeomClassCreate( name ) char *name; { return GeomSubClassCreate( "geom", name ); } GeomClass * GeomMethods( object ) Geom *object; { return object ? object->Class : NULL; } /* * Call a function for all known classes. */ void * GeomClassIterate( ) { return (void *)table; } GeomClass * GeomNextClass( it ) void *it; { GeomClass *c; #define iter ((struct classtable **)it) if(*iter == NULL) return NULL; c = (*iter)->Class; *iter = (*iter)->next; return c; #undef iter } geomview-1.9.5/src/lib/gprim/geom/copy.c0000644000175000017500000000406512310110200014772 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" /* this needs to be here so that the shared memory code can work */ Geom * GGeomCopy(Geom *g, Geom *object) { RefInit((Ref *)g, object->magic); g->Class = object->Class; g->ap = object->ap; if(g->ap != NULL) { g->ap = ApCopy(g->ap, NULL); } g->aphandle = NULL; DblListInit(&g->handles); DblListInit(&g->pernode); return g; } Geom * GeomCopy(Geom *object) { Geom *g; /* this is a little tricky */ if( object == NULL ) return NULL; if( object->Class->copy ) { g = (*object->Class->copy)(object); if(g != NULL) { GGeomCopy(g, object); } } else { GeomError(1/*Warning-unimpl*/,"GeomCopy: no copy method for %s: %x", GeomName(object), object); RefIncr((Ref *)object); /* Copy by reference -- XXX stopgap! */ g = object; } return g; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/geom/create.c0000644000175000017500000001026012310110200015255 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" Geom * GeomCreate(char *type, ...) { va_list a_list; Geom *newgeom = (Geom *) NULL; GeomClass *Class = (GeomClass *) NULL; va_start (a_list, type); Class = GeomClassLookup(type); /* now use the create method to get a new geom ... */ if (Class == NULL) { GeomError(0/*Unknown Class XXX*/, "GeomCreate: unknown object class %s", type); va_end (a_list); return NULL; } if (Class->create) newgeom = (Geom *) (*Class->create)(NULL, Class, &a_list); /* need error check here */ va_end (a_list); return newgeom; } int GeomSet(Geom *g, ...) { int ok = -1; va_list a_list; va_start (a_list, g); if (g && g->Class && g->Class->create) if((*g->Class->create)(g, g->Class, &a_list)) ok = 1; va_end (a_list); return ok; } int GeomGet(Geom *g, int attr, void *attrp) { if(g == NULL) return -1; switch(attr) { case CR_APPEAR: *(Appearance **)attrp = g->ap; break; #if 0 case CR_HANDLE: *(Handle **)attrp = g->handle; break; #endif default: if(g->Class->get) return (*g->Class->get)(g, attr, attrp); } return 0; } Geom * GeomCCreate(Geom *g, GeomClass *c, ...) { va_list a_list; Geom *newgeom = g; GeomClass *Class = c; va_start (a_list, c); if(Class == NULL && newgeom != NULL) Class = newgeom->Class; if (Class && Class->create) newgeom = (Geom *) (*Class->create)(newgeom, Class, &a_list); /* need error check here */ va_end (a_list); return newgeom; } /* * Initialize common data for Geom objects */ void GGeomInit(Geom *g, GeomClass *Class, int magic, Appearance *ap) { RefInit((Ref *)g, magic); g->Class = Class; g->ap = ap; if(ap != NULL) { /* If it's a real Appearance, bump its ref count */ RefIncr((Ref *)ap); } g->aphandle = NULL; g->geomflags = 0; g->pdim = 4; g->freelisthead = NULL; /* has to be overridden by derived class */ g->bsptree = NULL; g->ppath = NULL; g->ppathlen = 0; DblListInit(&g->pernode); } /* * Handle one exceptional item from a GeomCreate() arg list. * We know how to set common Geom fields. */ /* copyp: Flag: "copy" parameters passed by reference? */ /* feature: Attribute -- value already va_arg'ed by caller */ int GeomDecorate(Geom *g, int *copyp, int feature, va_list *ap) { Appearance *nap; int val; if(feature == 0 || g == NULL) return 1; switch(feature) { case CR_4D: /* this is a token, value pair so it can be set conditionally */ val = va_arg(*ap, int); g->geomflags &= ~VERT_4D; g->geomflags |= val ? VERT_4D : 0; break; case CR_APPEAR: /* Assign or remove Appearance. */ nap = va_arg(*ap, Appearance *); if(nap && *copyp) RefIncr((Ref *)nap); if(g->ap) ApDelete(g->ap); g->ap = nap; break; case CR_COPY: *copyp = 1; break; case CR_NOCOPY: *copyp = 0; break; default: return 1; /* Unknown attribute */ } return 0; } Appearance * GeomAppearance(Geom *g) { return g ? g->ap : NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/geom/delete.c0000644000175000017500000000644512310110200015266 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" #include "handleP.h" #include "mg.h" #include "nodedata.h" int PoolDoCacheFiles; DEF_FREELISTHEAD(NodeData); void GeomDelete(Geom *object) { Handle *h; int np; if (object == NULL) { return; } if (!GeomIsMagic(object->magic)) { OOGLWarn("Internal warning: GeomDelete of non-Geom %x (%x !~ %xxxxx)", object, object->magic, (GeomMagic(0,0)>>16)&0xFFFF); return; } /* If we're not caching contents of files, and this object was loaded * from a file, and the sole reference to it is from the Handle, * delete it now (and delete the handle and possibly close the file). */ for (np = 0, h = HandleRefIterate((Ref *)object, NULL); h; h = HandleRefIterate((Ref *)object, h)) { if (HandlePool(h) != NULL && !PoolDoCacheFiles) { np++; } } if (REFPUT(object) == np && np > 0) { /* can this happen??? at all ??? */ for (h = HandleRefIterate((Ref *)object, NULL); h; h = HandleRefIterate((Ref *)object, h)) { if (HandlePool(h) != NULL && !PoolDoCacheFiles) { /* REFPUT() is enough, HandleRefIterate() will call * HandleDelete() */ REFPUT(h); } } return; } else if (REFCNT(object) < 0 || REFCNT(object) > 100000) { /* XXX debug */ OOGLError(1, "GeomDelete(%x) -- ref count %d?", object, REFCNT(object)); return; } else if (REFCNT(object) > 0) { return; } /* Actually delete it */; /* we may need to iterate over a list, or access INST->geom, so * call the destructor for the BSP-tree before calling * Class->Delete() */ GeomBSPTree(object, NULL, BSPTREE_DELETE); GeomNodeDataPrune(object); if(object->aphandle) { HandlePDelete(&object->aphandle); } if(object->ap) { ApDelete(object->ap); object->ap = NULL; } if(object->Class->Delete) { (*object->Class->Delete)(object); } object->magic ^= 0x80000000; if (object->freelisthead) { FreeListNode *reuse = (FreeListNode *)object; reuse->next = *object->freelisthead; *object->freelisthead = reuse; } else { OOGLFree(object); } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/geom/dice.c0000644000175000017500000000323312310110200014720 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" Geom * GeomDice( Geom *g, int nu, int nv ) { if (g == NULL) { return NULL; } if(g->ap && g->ap->valid & APF_DICE) { nu = g->ap->dice[0]; /* Propagate "dice" appearance values */ nv = g->ap->dice[1]; /* Note we ignore overrides, so this may not be * correct in some cases. */ } if(g->Class->dice ) { (*g->Class->dice)(g, nu, nv); } return g; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/geom/draw.c0000644000175000017500000000514012310110200014750 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" #include "mg.h" #include "bsptreeP.h" void GeomDrawNodeDataFreeListPrune(void) { NodeDataFreeListPrune(); } static inline void maybe_tag_appearance(Geom *geom, const Appearance *ap) { NodeData *data; if (GeomHasAlpha(geom, ap)) { data = GeomNodeDataCreate(geom, NULL); if (data->tagged_ap) { mguntagappearance(data->tagged_ap); data->tagged_ap = NULL; } data->tagged_ap = mgtagappearance(); } else if ((data = GeomNodeDataByPath(geom, NULL)) && data->tagged_ap) { mguntagappearance(data->tagged_ap); data->tagged_ap = NULL; } } Geom *GeomDraw(Geom *geom) { if (geom && geom->Class->draw) { const Appearance *ap; if (geom->bsptree != NULL) { mgNDctx *NDctx = NULL; mgctxget(MG_NDCTX, &NDctx); if (NDctx != NULL) { NDctx->bsptree = geom->bsptree; BSPTreeSet(NDctx->bsptree, BSPTREE_ONESHOT, true, BSPTREE_END); BSPTreeSetId(geom->bsptree); } } if (geom->ap != NULL) { mgpushappearance(); ap = mgsetappearance(geom->ap, 1); /* Merge into inherited ap */ } else { ap = mggetappearance(); } maybe_tag_appearance(geom, ap); (*geom->Class->draw)(geom); if(geom->ap != NULL) { mgpopappearance(); } if (geom->bsptree != NULL && (geom->geomflags & GEOM_ALPHA)) { GeomBSPTreeDraw(geom); } } return geom; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/geom/evert.c0000644000175000017500000000250612310110200015143 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" Geom * GeomEvert( object ) Geom *object; { if( object && object->Class->evert ) (*object->Class->evert)(object); return object; } geomview-1.9.5/src/lib/gprim/geom/extend.c0000644000175000017500000000773012310110200015311 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "string.h" #include "geomclass.h" #include static struct extmethods { char *methodname; GeomExtFunc *defaultfunc; } *extmethods = NULL; static int n_extmethods = 1, max_extmethods = 0; int GeomMethodSel(char *methodname) { struct extmethods *m; int i; for(i = 1; i < n_extmethods; i++) if((m = &extmethods[i])->methodname != NULL && strcmp(m->methodname, methodname) == 0) return i; return 0; } int GeomNewMethod(char *methodname, GeomExtFunc *defaultfunc) { int sel; int oldmax = max_extmethods; sel = GeomMethodSel(methodname); if(sel > 0) return 0; sel = n_extmethods++; if(sel >= oldmax) { extmethods = (oldmax == 0) ? OOGLNewNE(struct extmethods, (max_extmethods = 7), "Extension methods") : OOGLRenewNE(struct extmethods, extmethods, (max_extmethods *= 2), "Extension methods"); memset(&extmethods[oldmax], 0, (max_extmethods - oldmax) * sizeof(struct extmethods)); } extmethods[sel].defaultfunc = defaultfunc; extmethods[sel].methodname = strdup(methodname); return sel; } char * GeomMethodName(int sel) { return (sel <= 0 || sel >= n_extmethods) ? NULL : extmethods[sel].methodname; } GeomExtFunc * GeomSpecifyMethod( int sel, GeomClass *Class, GeomExtFunc *func ) { int oldmax; int need; GeomExtFunc *oldfunc; if(Class == NULL || sel <= 0 || sel >= n_extmethods) return NULL; oldmax = Class->n_extensions; if(sel >= oldmax) { need = (oldmax == 0) ? 7 : oldmax*2; if(need <= sel) need = sel+1; Class->extensions = (oldmax == 0) ? OOGLNewNE(GeomExtFunc *, need, "Extension func vector") : OOGLRenewNE(GeomExtFunc *, Class->extensions, need, "Extension func vector"); Class->n_extensions = need; memset(&Class->extensions[oldmax], 0, (need - oldmax) * sizeof(GeomExtFunc *)); } oldfunc = Class->extensions[sel]; Class->extensions[sel] = func; return oldfunc; } void * GeomCall(int sel, Geom *geom, ...) { GeomClass *C; GeomExtFunc *ext = NULL; void *result = NULL; va_list args; if(geom == NULL || sel <= 0 || sel >= n_extmethods) return NULL; C = geom->Class; while(sel >= C->n_extensions || (ext = C->extensions[sel]) == NULL) { if((C = C->super) == NULL) { ext = extmethods[sel].defaultfunc; break; } } if(ext) { va_start(args, geom); result = (*ext)(sel, geom, &args); va_end(args); } return result; } void * GeomCallV(int sel, Geom *geom, va_list *args) { GeomClass *C; GeomExtFunc *ext = NULL; if(geom == NULL || sel <= 0 || sel >= n_extmethods) return NULL; C = geom->Class; while(sel >= C->n_extensions || (ext = C->extensions[sel]) == NULL) { if((C = C->super) == NULL) { ext = extmethods[sel].defaultfunc; break; } } return ext ? (*ext)(sel, geom, args) : NULL; } geomview-1.9.5/src/lib/gprim/geom/geomstream.c0000644000175000017500000003155212310110200016164 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include "geomclass.h" #include "streampool.h" #include "handleP.h" #if HAVE_UNISTD_H # include #endif #if HAVE_IO_H # include /* _WIN32 */ #endif #include #if POPEN_ACCEPTS_RB # define POPEN_RB "rb" #else # define POPEN_RB "r" #endif HandleOps GeomOps = { "geom", (int ((*)()))GeomStreamIn, (int ((*)()))GeomStreamOut, (void ((*)()))GeomDelete, NULL, /* resync */ NULL, /* close pool */ }; Geom * GeomLoad(char *fname) { IOBFILE *inf = iobfopen(fname, "rb"); Geom *g; if (inf == NULL) { OOGLError(0, "GeomLoad: can't open %s: %s", fname, sperror()); return NULL; } g = GeomFLoad(inf, fname); iobfclose(inf); return g; } Geom * GeomFLoad(IOBFILE *inf, char *fname) { Pool *p; Geom *g = NULL; p = PoolStreamTemp(fname, inf, NULL, 0, NULL); GeomStreamIn(p, NULL, &g); PoolDelete(p); return g; } int GeomFLoadEmbedded( Geom **gp, Handle **hp, IOBFILE *inf, char *fname ) { Pool *p; int nope; p = PoolStreamTemp(fname, inf, NULL, 0, NULL); nope = GeomStreamIn(p, hp, gp); PoolDelete(p); return !nope; } Geom * GeomSave(Geom *g, char *fname) { Pool *p; int ok; FILE *outf; if ((outf = fopen(fname, "wb")) == NULL) { OOGLError(0, "GeomSave: Can't open %s: %s", fname, sperror()); return NULL; } p = PoolStreamTemp(fname, NULL, outf, 1, &GeomOps); if (p == NULL) { OOGLError(0, "GeomSave: Can't open %s: %s", fname, sperror()); return NULL; } PoolSetOType(p, PO_DATA); ok = GeomStreamOut(p, NULL, g); PoolClose(p); PoolDelete(p); return ok ? g : NULL; } Geom * GeomFSave(Geom *g, FILE *outf, char *fname) { Pool *p; int ok; p = PoolStreamTemp(fname, NULL, outf, 1, NULL); PoolSetOType(p, PO_DATA); PoolIncLevel(p,1); ok = GeomStreamOut(p, NULL, g); PoolDelete(p); return ok ? g : NULL; } Geom * GeomFSaveEmbedded( Geom *g, Handle *handle, FILE *outf, char *fname ) { Pool *p; int ok; p = PoolStreamTemp(fname, NULL, outf, 1, NULL); PoolSetOType(p, PO_HANDLES); PoolIncLevel(p, 1); /* Enforce level > 0 to get { braces } */ ok = GeomStreamOut(p, handle, g); PoolDelete(p); return ok ? g : NULL; } int GeomEmbedPrefix(int c) { return (c == '{' || c == '=' || c == '@' || c == '<'); } static char *geomtoken; char * GeomToken(IOBFILE *f) { if (geomtoken) return geomtoken; geomtoken = iobfdelimtok("{}()<:@=", f, 0); return geomtoken ? geomtoken : ""; } void GeomAcceptToken() { geomtoken = NULL; } vvec geomtransl; int comment_translators = 0; struct GeomTranslator { int prefixlen; char *prefix; char *cmd; }; void GeomAddTranslator(char *prefix, char *cmd) { struct GeomTranslator *gt; int i; if (VVCOUNT(geomtransl) == 0) VVINIT(geomtransl, struct GeomTranslator, 4); cmd = cmd && cmd[0] ? strdup(cmd) : ""; if (prefix[0] == '#') comment_translators = 1; gt = VVEC(geomtransl, struct GeomTranslator); for (i = VVCOUNT(geomtransl); --i >= 0; gt++) { if (strcmp(prefix, gt->prefix) == 0) { if (gt->cmd) OOGLFree(gt->cmd); gt->cmd = cmd[0]!='\0' ? cmd : NULL; return; } } gt = VVAPPEND(geomtransl, struct GeomTranslator); gt->prefixlen = strlen(prefix); gt->prefix = strdup(prefix); gt->cmd = cmd[0]!='\0' ? cmd : NULL; } int GeomInvokeTranslator(Pool *p, char *prefix, char *cmd, Handle **hp, Geom **gp) { IOBFILE *tf, *pf = PoolInputFile(p); long pos = iobftell(pf) - strlen(prefix); int ok, oldstdin; Pool *tp; void (*oldchld)(); #if defined(unix) || defined(__unix) /* Rewind file descriptor to previous position */ if (iobfseek(pf, pos, SEEK_SET) < 0) { OOGLError(1, "%s: can only use external format-translators on disk files", PoolName(p)); return 0; } oldstdin = dup(0); close(0); if (dup(iobfileno(pf)) < 0) { /* ignorance */ } oldchld = signal(SIGCHLD, SIG_DFL); tf = iobpopen(cmd, POPEN_RB); close(0); if (oldstdin > 0) { if (dup(oldstdin) < 0) { /* ignorance */ } close(oldstdin); } tp = PoolStreamTemp(PoolName(p), tf, NULL, 0, &GeomOps); ok = GeomStreamIn(tp, hp, gp); iobpclose(tf); PoolClose(tp); PoolDelete(tp); signal(SIGCHLD, oldchld); iobfseek(pf, 0, SEEK_END); /* Seek input to EOF to avoid confusion */ return ok; #else /* non-unix -- give up */ return 0; #endif } int GeomStreamIn(Pool *p, Handle **hp, Geom **gp) { IOBFILE *f; Handle *h = NULL; Handle *hname = NULL; Geom *g = NULL; Handle *aphandle = NULL; Appearance *ap = NULL; GeomClass *Class; void *it; int i, first; int empty = 1, braces = 0; int c; char *w, *raww; int brack = 0; int more; if (p == NULL || (f = PoolInputFile(p)) == NULL) return 0; /* Hack for external support for additional file formats, VRML/Inventor in * particular, which alas use a # convention for its header, so we must * bypass default comment parsing. * If first character is a #, grab first line as a token and * match against known patterns. */ if (comment_translators) { struct GeomTranslator *gt; char prefix[256]; if ((c = iobfgetc(f)) == '#') { prefix[0] = '#'; iobfgets(prefix+1, sizeof(prefix)-1, f); gt = VVEC(geomtransl, struct GeomTranslator); for (i = VVCOUNT(geomtransl); --i >= 0; gt++) { if (strncmp(gt->prefix, prefix, gt->prefixlen) == 0) { return GeomInvokeTranslator(p, prefix, gt->cmd, hp, gp); } } /* Nope, not one we recognize. Finish consuming comment line * in case the prefix[] buffer didn't hold it all. */ if (strchr(prefix, '\n') == NULL) while((c = iobfgetc(f)) != '\n' && c != EOF) ; } else if (c != EOF) iobfungetc(c, f); } /* Skip a semicolon if it's the first thing we see -- 'stuff' compatibility. */ if (iobfnextc(f, 0) == ';') iobfgetc(f); do { more = 0; geomtoken = NULL; /* Fetch a new token */ w = GeomToken(f); c = w[0]; geomtoken = NULL; /* Clear cache unless we know we'll need it */ switch(c) { case '<': case ':': case '@': w = iobfdelimtok("{}()", f, 0); /* Consider doing a path search. * Do this before calling HandleReferringTo() * to prevent spurious error messages. */ if (c == '<' && (h = HandleByName(w, &GeomOps)) == NULL && w[0] != '/') { w = findfile(PoolName(p), raww = w); if (w == NULL) { OOGLSyntax(f, "Error reading \"%s\": can't find file \"%s\"", PoolName(p), raww); } } else if (h) { /* HandleByName() increases the ref. count s.t. the * caller of HandleByName() owns the returned handle. */ HandleDelete(h); } h = HandleReferringTo(c, w, &GeomOps, NULL); if (h != NULL) { /* Increment the ref. count. This way we can call * HandleDelete() and GeomDelete() independently. */ g = REFGET(Geom, HandleObject(h)); } break; case '{': brack++; break; case '}': if (brack--) braces = 1; else iobfungetc(c, f); break; case '=': more = 1; break; default: if (strcmp(w, "geom") == 0) { more = 1; break; } if (strcmp(w, "define") == 0) { more = 1; hname = HandleCreateGlobal(iobftoken(f, 0), &GeomOps); break; } if (strcmp(w, "appearance") == 0) { more = 1; if (!ApStreamIn(p, &aphandle, &ap)) { OOGLSyntax(f, "%s: appearance definition expected", PoolName(p)); GeomDelete(g); return false; } break; } /* Stuff token in the cache so all geom readers can see it */ geomtoken = w; /* * Load literal object. * First try to guess object type from its file name. */ empty = 0; PoolSetMark(p); Class = GeomFName2Class( PoolName(p) ); g = NULL; first = 1; if (Class) { if (Class->import) g = (*Class->import)(p); else if (Class->fload) g = (*Class->fload)(f, PoolName(p)); first = 0; if (g) break; } /* * If not, try all known classes. */ GeomKnownClassInit(); /* Ensure all classes entered */ it = GeomClassIterate(); while (g == NULL && (Class = GeomNextClass(&it)) != NULL) { if (Class->import == NULL && Class->fload == NULL) continue; /* * Try to seek back to our initial position. */ if (!first && !PoolSeekMark(p)) { /* No luck. Might as well give up right now. */ OOGLSyntax(f, "Error reading \"%s\": PoolSetMark() failed.", PoolName(p)); break; } if (Class->import) g = (*Class->import)(p); else if (Class->fload) g = (*Class->fload)(f, PoolName(p)); first = 0; } geomtoken = NULL; if (g == NULL) { PoolClearMark(p); return 0; } } } while (brack > 0 || more); /* Leave results where we're told to */ if (ap != NULL || aphandle != NULL) { Geom *container; /* If we're given an appearance and a reference to a handle, * insert an INST to hang the appearance onto. * (But still allow { define X appearance { ... } } to bind * an appearance to a handle. Just disallow it when referring to * an existing handle.) */ if (h != NULL) { container = GeomCreate("inst", CR_HANDLE_GEOM, h, g, CR_END); HandleDelete(h); /* Decr ref count; the INST now owns it. */ GeomDelete(g); g = container; h = NULL; } else if (g == NULL) { g = GeomCreate("inst", CR_END); } if (g->ap) { ApDelete(g->ap); } if (g->aphandle) { HandlePDelete(&g->aphandle); } g->ap = ap; g->aphandle = aphandle; if (g->aphandle) { HandleRegister(&g->aphandle, (Ref *)g, &g->ap, HandleUpdRef); } } if (hname != NULL) { if (g) { HandleSetObject(hname, (Ref *)g); } if (h) { /* HandleReferringTo() has passed the ownership to us, so * delete h because we do not need it anymore. */ HandleDelete(h); } h = hname; } /* Pass the ownership of h and g to the caller if requested */ if (hp != NULL) { /* pass on ownership of the handle h to the caller of this function */ if (*hp != NULL) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } else if (h) { /* Otherwise delete h because we are its owner. Note that * HandleReferringTo() has passed the ownership of h to us; * explicitly defined handles (hdefine and define constructs) * will not be deleted by this call. */ HandleDelete(h); } /* same logic as for hp */ if (gp != NULL) { if (*gp != NULL) { GeomDelete(*gp); } *gp = g; } else if (g) { GeomDelete(g); } PoolClearMark(p); return (g != NULL || h != NULL || (empty && braces)); } int GeomStreamOut(Pool *p, Handle *h, Geom *g) { int brack; if (PoolOutputFile(p) == NULL) return 0; if (g == NULL && h != NULL && h->object != NULL) g = (Geom *)h->object; if (g == NULL && h == NULL) { fprintf(PoolOutputFile(p), "{ }\n"); return 1; } brack = true || (p->level > 0 || (g && (g->ap || g->aphandle)) || h != NULL); if (brack) { fprintf(PoolOutputFile(p), "{"); PoolIncLevel(p, 1); } if (p->otype & 4) { fprintf(PoolOutputFile(p), " # %d refs\n", g->ref_count); /* debug */ } else { fprintf(PoolOutputFile(p), "\n"); } if (g && (g->ap || g->aphandle)) { PoolPrint(p, ""); /* use the proper indentation */ ApStreamOut(p, g->aphandle, g->ap); } if (PoolStreamOutHandle(p, h, g != NULL)) { if (g->Class->export) (*g->Class->export)(g, p); else if (g->Class->fsave) (*g->Class->fsave)(g, PoolOutputFile(p), PoolName(p)); } if (brack) { PoolIncLevel(p, -1); PoolPrint(p, "}\n"); } return !ferror(PoolOutputFile(p)); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/geom/handlescan.c0000644000175000017500000000273112310110200016116 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" void GeomHandleScan(Geom *g, int (*func)(), void *arg) { if(g == NULL) return; if(g->aphandle) (*func)(&g->aphandle, g, arg); if(g->ap && g->ap->tex && g->ap->tex->tfmhandle) (*func)(&g->ap->tex->tfmhandle, g, arg); if(g->Class->scan) (*g->Class->scan)(g, func, arg); } geomview-1.9.5/src/lib/gprim/geom/iterate.c0000644000175000017500000001624212310110200015455 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * iterate.c -- iteration over OOGL hierarchies */ #include #include "listP.h" #include "tlistP.h" #include "instP.h" #include "sphereP.h" #include "discgrpP.h" #define UNKNOWN 0 #define LIST 1 #define TLIST 2 #define INST 3 #define SPHERE 4 #define DISCGRP 5 #define OTHER 6 #define VALID 0x13ac2480 /* Magic number */ struct istate { /* Iteration state structure: per nest lvl */ struct istate *parent; Geom *g; int kind; int seq; /* Seq number within Tlist */ Transform Ti; }; struct GeomIter { struct istate *stack; int flags; }; static union itpool { union itpool *next; struct GeomIter iter; } *itpool; static struct istate *ispool; #define NewIter(it) \ if (itpool) { \ it = &itpool->iter; \ itpool = itpool->next; \ } else { \ it = OOGLNewE(GeomIter, "GeomIter"); \ } #define NewIstate(is) \ if (ispool) { \ is = ispool; \ ispool = ispool->parent; \ } else { \ is = OOGLNewE(struct istate, "GeomIter state"); \ } #define FreeIter(it) \ ((union itpool *)(it))->next = itpool, itpool = (union itpool *)(it) #define FreeIstate(is) (is)->parent = ispool, ispool = (is) GeomIter *_GeomIterate(Geom *g, int flags) { GeomIter *it; struct istate *is; NewIter(it); it->flags = (flags & 0xf) | VALID; NewIstate(is); it->stack = is; is->kind = UNKNOWN; is->g = g; is->parent = NULL; return it; } /* * Iterate over an OOGL hierarchy, producing one Transform per call. * Returns 1 normally, 0 when no more Transforms remain. * Destroys the GeomIter upon returning 0. * * To make this work as a coroutine we effectively unroll the recursive * hierarchy traversal, so please excuse the goto's. * * For speed, we act as a friend to the List, TList, Inst, and Sphere * classes. XXX * * This function has to be called through the inline function * NextTransform(); we assume here that iter != NULL and it->stack != * NULL. */ int _NextTransform(GeomIter *it, Transform T) { struct istate *is; Geom *g; if ((is = it->stack) == NULL) { goto gone; } g = is->g; again: switch(is->kind) { case UNKNOWN: /* Determine type */ discover: if(g->Class == TlistClass) { if(g->magic != TLISTMAGIC) { GeomError(0,"NextTransform: Surprise Tlist %x", g); goto pop; } is->kind = TLIST; is->seq = 0; goto isTLIST; } if(g->Class == DiscGrpClass) { if(g->magic != DISCGRPMAGIC) { GeomError(0,"NextTransform: Surprise DiscGrp %x", g); goto pop; } is->kind = DISCGRP; is->seq = 0; goto isDISCGRP; } if(g->Class == ListClass) { if(g->magic != LISTMAGIC) { GeomError(0,"NextTransform: Surprise List %x", g); goto pop; } is->kind = LIST; goto isLIST; } if(g->Class == InstClass || g->Class == SphereClass) { Inst *inst = (Inst *)g; if(inst->magic != INSTMAGIC && inst->magic != SPHEREMAGIC) { GeomError(0,"NextTransform: Surprise Inst %x", g); goto pop; } if(inst->tlist == NULL) { /* * Just use this transform. We're a leaf, so return it now. * Also pop stack for next iteration. */ if((is = is->parent)) TmConcat(inst->axis, is->Ti, T); else TmCopy(inst->axis, T); FreeIstate(it->stack); it->stack = is; return 1; } else { /* * Inst has a child. * The axis field is *ignored* in this case; just * traverse the child. */ is->g = g = inst->tlist; /*is->kind = UNKNOWN;*/ goto discover; } } /* Other objects aren't relevant for NextTransform(), so discard. */ goto pop; case TLIST: isTLIST: { Tlist *TL = (Tlist *)g; TransformPtr Tp; /* ought to be ``Transform *Tp'' */ if(is->seq >= TL->nelements) goto pop; Tp = TL->elements[is->seq++]; if(TL->tlist != NULL && !(it->flags & SHALLOW)) { if(is->parent) TmConcat(Tp, is->parent->Ti, is->Ti); else TmCopy(Tp, is->Ti); g = TL->tlist; goto push; } /* We're a leaf -- return a matrix now */ if(is->parent) TmConcat(Tp, is->parent->Ti, T); else TmCopy(Tp, T); return 1; } case DISCGRP: isDISCGRP: { DiscGrp *dg = (DiscGrp *)g; TransformPtr Tp; /* ought to be ``Transform *Tp'' */ if(is->seq >= dg->big_list->num_el) goto pop; Tp = dg->big_list->el_list[is->seq++].tform; /* if it's another discrete group ... */ if(dg->geom != NULL && dg->geom->magic == DISCGRPMAGIC && !(it->flags & SHALLOW)) { if(is->parent) TmConcat(Tp, is->parent->Ti, is->Ti); else TmCopy(Tp, is->Ti); g = dg->geom; goto push; } /* We're a leaf -- return a matrix now */ if(is->parent) TmConcat(Tp, is->parent->Ti, T); else TmCopy(Tp, T); return 1; } case LIST: isLIST: { /* Might need some intra-List state too if List format * gets fancier -- if we have one List object which contains a * bundle of Geom's. */ List *L = (List *)g; if(L == NULL) goto pop; while(L->car == NULL) { L = L->cdr; if(L == NULL) goto pop; } g = L->car; is->g = (Geom *)L->cdr; if(is->parent) TmCopy(is->parent->Ti, is->Ti); else TmIdentity(is->Ti); goto push; } default: GeomError(1,"NextTransform: called with invalid GeomIter (%x)", it); return 0; } push: /* Push g as a new element */ /* is->Ti *must* be set correctly before getting here! */ NewIstate(is); is->g = g; is->parent = it->stack; it->stack = is; goto discover; /* Recurse */ pop: is = is->parent; FreeIstate(it->stack); it->stack = is; if(is != NULL) { g = is->g; goto again; /* Recurse -- type already determined */ } /* stack empty -- finished */ gone: it->flags = 0; it->stack = NULL; FreeIter(it); return 0; } void DestroyIter(it) GeomIter *it; { if((it->flags & 0xfffffff0) == VALID) { it->flags = 0; it->stack = NULL; FreeIter(it); } else { GeomError(1,"DestroyIter -- already destroyed %x", it); } } /* * Local Variables: *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/geom/knownclass.c0000644000175000017500000001015312310110200016175 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * $Header: /cvsroot/geomview/geomview/src/lib/gprim/geom/knownclass.c,v 1.6 2006/08/01 03:38:48 smr99 Exp $ */ #include #include "geomclass.h" /* * Here's we list all classes known to this object library. * Edit this if you add a new class for general use. * It's not mandatory to list a class here, but it helps -- generic * GeomLoad, GeomPrivate, GeomClassForAll routines benefit from this. * * Some may not really be linked in, but only ghosts from the stub library. * We tell ghosts from warm bodies by their "present" tag -- an int * which is 1 for real object routines, 0 for stubs. * * If you call GeomKnownClassInit(), better link either with all * object libraries or with the stub library! * */ extern int BBoxPresent, BezierListPresent, BezierPresent, CommentPresent, DiscGrpPresent, InstPresent, LincolnPresent, ListPresent, MeshPresent, NDMeshPresent, NPolyListPresent, PolyListPresent, QuadPresent, SkelPresent, SpherePresent, TlistPresent, VectPresent; typedef GeomClass *GeomClassPtr; extern GeomClassPtr BBoxMethods(), BezierListMethods(), BezierMethods(), CommentMethods(), DiscGrpMethods(), InstMethods(), LincolnMethods(), ListMethods(), MeshMethods(), NDMeshMethods(), NPolyListMethods(), PolyListMethods(), QuadMethods(), SkelMethods(), SphereMethods(), TlistMethods(), VectMethods(); static struct knownclass { int *presenttag; GeomClass *(*methods)(); char *loadsuffix; } known[] = { /* Testing _WIN32 here is wrong, but the Visual C++ compiler * has an ANSI C preprocessor but doesn't define either of these. */ #if defined(__STDC__) || defined(__ANSI_CPP__) || defined(_WIN32) #define KNOWN(name, suffix) \ { &name##Present, (GeomClass *(*)())name##Methods, suffix } #else /* non-ANSI */ #define KNOWN(name, suffix) \ { &name/**/Present, (GeomClass *(*)())name/**/Methods, suffix } #endif KNOWN(Bezier, NULL), KNOWN(BezierList, "bez"), KNOWN(BezierList, "bbp"), KNOWN(Comment, NULL), KNOWN(DiscGrp, "dgp"), KNOWN(PolyList, "off"), KNOWN(Sphere, "sph"), KNOWN(Tlist, "tl"), KNOWN(Tlist, "prj"), KNOWN(BBox, NULL), KNOWN(Inst, NULL), KNOWN(List, "list"), KNOWN(Quad, "quad"), KNOWN(Mesh, "mesh"), KNOWN(NDMesh, "mesh"), KNOWN(Vect, "vect"), KNOWN(Skel, "skel"), KNOWN(NPolyList, "off"), KNOWN(Lincoln, "iL"), {NULL, NULL, NULL} }; void GeomKnownClassInit() { struct knownclass *k; static char done = 0; if(!done) { done = 1; for(k = known; k->presenttag != NULL; k++) if(*k->presenttag) (void) (*k->methods)(); } } /* * This should really be in per-class attributes, not this * centralized table, but there's no mechanism for that yet. */ GeomClass * GeomFName2Class(str) char *str; { char *p; struct knownclass *k; if(str == NULL || (p = strrchr(str, '.')) == NULL) return NULL; p++; for(k = known; k->presenttag != NULL; k++) if(*k->presenttag && k->loadsuffix != NULL && strcmp(p, k->loadsuffix) == 0) return((*k->methods)()); return NULL; } geomview-1.9.5/src/lib/gprim/geom/message.c0000644000175000017500000000256612310110200015450 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" Geom * GeomMessage( object, ac, av ) Geom *object; int ac; char *av[]; { if( object && object->Class->message ) (*object->Class->message)(object,ac,av); return object; } geomview-1.9.5/src/lib/gprim/geom/name.c0000644000175000017500000000251412310110200014735 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" char * GeomName( object ) Geom *object; { if( object && object->Class->name ) { return (*object->Class->name)(); } return NULL; } geomview-1.9.5/src/lib/gprim/geom/pick.c0000644000175000017500000002033312310110200014742 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include "geomclass.h" #include "pickP.h" #include "bbox.h" #define PICK_WANTED(pick, ap) \ (pick->want & (!(pick->want & PW_VISIBLE) \ || ap == NULL || (ap->flag & APF_FACEDRAW) \ ? PW_VERT | PW_EDGE | PW_FACE : \ (ap->flag & (APF_EDGEDRAW|APF_VECTDRAW)) \ ? PW_VERT|PW_EDGE : 0)) int PickFace(int n_verts, Point3 *verts, Pick *pick, Appearance *ap) { Point3 got, ep; int v, e; if (PolyNearPosZInt(n_verts, verts, pick->thresh, &got, &v, &e, &ep, PICK_WANTED(pick, ap), pick->got.z)) return PickFillIn(pick, n_verts, &got, v, e, ap); else return 0; } int PickFillIn(Pick *pick, int n_verts, Point3 *got, int vertex, int edge, Appearance *ap) { int found = 0; (void)ap; pick->got = *got; vvcopy(&pick->gcur, &pick->gpath); found = 0; if (vertex != -1) { found |= PW_VERT; pick->vi = vertex; } if (edge != -1) { found |= PW_EDGE; pick->ei[0] = edge; pick->ei[1] = (edge + 1) % n_verts; } if (pick->want & PW_FACE) { found |= PW_FACE; pick->fn = n_verts; } if (found) { pick->found = found; if (pick->f != NULL) OOGLFree(pick->f); pick->f = NULL; } return found; } Geom * GeomMousePick(Geom *g, Pick *p, Appearance *ap, Transform Tg, TransformN *TgN, int *axes, double x, double y) { Pick *pick = NULL; Transform Txy, T; TransformN *TN = NULL; if (!p) pick = p = PickSet(NULL, PA_END); p->x0 = x; p->y0 = y; if (TgN) { HPointN *tmp = HPtNCreate(TgN->odim, NULL); tmp->v[axes[0]] = -x; tmp->v[axes[1]] = -y; TN = TmNTranslateOrigin(NULL, tmp); HPtNDelete(tmp); TmNConcat(TgN, TN, TN); } else { TmTranslate(Txy, -x, -y, 0.); TmConcat(Tg, Txy, T); } g = GeomPick(g, p, ap, T, TN, axes); if (g && !pick) { /* Only bother if the caller will get to see these */ if (TN) { p->TmirpN = TmNInvert(p->TprimN, p->TmirpN); p->TwN = TmNInvert(TN, p->TwN); } else { TmInvert(p->Tprim, p->Tmirp); TmInvert(T, p->Tw); } } if (pick) PickDelete(pick); if (TN) TmNDelete(TN); return g; } /* * Simple generic Pick routine based on bounding-box intersection. * We succeed if the picked point lies within the screen projection of the * object, i.e. if the picked point lies within the smallest screen square * surrounding the object. The depth is that of the midpoint of the * bounding box: average of min and max depth. */ static Geom * GenericPick(Geom *g, Pick *p, Appearance *ap, Transform T, TransformN *TN, int axes[4]) { Geom *bbox; HPoint3 min, max; (void)ap; if (TN) { TransformN *proj; int i; proj = TmNCreate(TN->idim, 4, NULL); for (i = 0; i < TN->idim; i++) { proj->a[i*4+0] = TN->a[i*TN->odim+axes[3]]; proj->a[i*4+1] = TN->a[i*TN->odim+axes[0]]; proj->a[i*4+2] = TN->a[i*TN->odim+axes[1]]; proj->a[i*4+3] = TN->a[i*TN->odim+axes[2]]; } bbox = GeomBound(g, NULL, proj); TmNDelete(proj); } else { bbox = GeomBound(g, T, NULL); } BBoxMinMax((BBox*)bbox, &min, &max); if (min.x <= 0 && max.x >= 0 && min.y <= 0 && max.y >= 0 && .5*(min.z + max.z) <= p->got.z) { p->got.x = p->got.y = 0; p->got.z = .5 * (min.z + max.z); p->gprim = g; if (TN) { p->TprimN = TmNCopy(TN, p->TprimN); memcpy(p->axes, axes, sizeof(p->axes)); } else { TmCopy(T, p->Tprim); } return g; } return NULL; } Geom * GeomPick(Geom *g, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { Appearance *nap = ap; Geom *result; if(g == NULL) return NULL; if(g->Class->pick == NULL) { /* OOGLError(1, "Note: using GenericPick for class %s", (*g->Class->name)()); */ g->Class->pick = (GeomPickFunc *)GenericPick; } if(g->ap && (p->want & PW_VISIBLE)) nap = ApMerge( g->ap, ap, 0 ); result = (*g->Class->pick)(g, p, nap, T, TN, axes); if(ap != nap) ApDelete(nap); return result; } void PickDelete(Pick *p) { /* Note we don't GeomDelete(p->gprim); it wasn't RefIncr'd */ if(p) { if (p->f) OOGLFree(p->f); /* free the face list, if any */ if (p->TprimN) TmNDelete(p->TprimN); if (p->TmirpN) TmNDelete(p->TmirpN); if (p->TwN) TmNDelete(p->TwN); if (p->TselfN) TmNDelete(p->TselfN); vvfree(&p->gcur); vvfree(&p->gpath); OOGLFree(p); } } Pick * PickSet(Pick *p, int attr, ...) { va_list al; int a; if(p == NULL) { /* * Create new Pick structure */ p = OOGLNewE(Pick, "new Pick"); p->got.x = 0; p->got.y = 0; p->got.z = 1; p->thresh = 0.02; p->want = 0; p->found = 0; VVINIT(p->gcur, int, 1); VVINIT(p->gpath, int, 1); p->gprim = NULL; p->TprimN = NULL; p->TmirpN = NULL; p->TwN = NULL; p->TselfN = NULL; HPt3From(&p->v, 0.0, 0.0, 0.0, 1.0); p->vi = -1; HPt3From(&p->e[0], 0.0, 0.0, 0.0, 1.0); HPt3From(&p->e[1], 0.0, 0.0, 0.0, 1.0); p->ei[0] = -1; p->ei[1] = -1; p->f = NULL; p->fn = 0; p->fi = -1; TmIdentity(p->Tw2n); TmIdentity(p->Tc2n); TmIdentity(p->Ts2n); TmIdentity(p->Tprim); TmIdentity(p->Tmirp); TmIdentity(p->Tw); TmIdentity(p->Tself); } va_start(al, attr); for(a = attr; a != PA_END; a = va_arg(al, int)) { switch(a) { case PA_WANT: p->want = va_arg(al, int); break; case PA_THRESH: p->thresh = va_arg(al, double); break; case PA_POINT: p->got = *va_arg(al, Point3 *); break; case PA_DEPTH: p->got.z = va_arg(al, double); break; case PA_GPRIM: p->gprim = va_arg(al, Geom *); break; case PA_TPRIM: TmCopy(*va_arg(al, Transform *), p->Tprim); break; case PA_TPRIMN: p->TprimN = TmNCopy(*va_arg(al, TransformN **), p->TprimN); break; case PA_VERT: p->v = *va_arg(al, HPoint3 *); break; case PA_EDGE: { HPoint3 *e = va_arg(al, HPoint3 *); p->e[0] = e[0]; p->e[1] = e[1]; } break; case PA_FACE: p->f = va_arg(al, HPoint3 *); break; case PA_FACEN: p->fn = va_arg(al, int); break; case PA_TW2N: TmCopy(*va_arg(al, Transform *), p->Tw2n); break; case PA_TC2N: TmCopy(*va_arg(al, Transform *), p->Tc2n); break; case PA_TS2N: TmCopy(*va_arg(al, Transform *), p->Ts2n); break; default: OOGLError(1, "PickSet: unknown attribute %d", a); va_end(al); return p; } } va_end(al); return p; } int PickGet(Pick *p, int attr, void *attrp) { if(p == NULL) return -1; switch(attr) { case PA_WANT: *(int *)attrp = p->want; return 1; case PA_THRESH: *(float *)attrp = p->thresh; return 1; case PA_POINT: *(Point3 *)attrp = p->got; break; case PA_DEPTH: *(float *)attrp = p->got.z; break; case PA_GPRIM: *(Geom **)attrp = p->gprim; break; case PA_TPRIM: TmCopy(p->Tprim, *(Transform *)attrp); break; case PA_TPRIMN: *((TransformN **)attrp) = TmNCopy(p->TprimN, *((TransformN **)attrp)); break; case PA_TWORLD: TmCopy(p->Tw, *(Transform *)attrp); break; case PA_VERT: *(HPoint3 *)attrp = p->v; break; case PA_EDGE: ((HPoint3 *)attrp)[0] = p->e[0]; ((HPoint3 *)attrp)[1] = p->e[1]; break; case PA_FACE: *(HPoint3 **)attrp = p->f; break; case PA_FACEN: *(int *)attrp = p->fn; break; default: return -1; } return p->found; } /* * Local Variables: *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/geom/replace.c0000644000175000017500000000300712310110200015426 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" #include "nodedata.h" void GeomReplace(Geom *parent, Geom *newchild) { if(parent != NULL && parent->Class->replace != NULL) { RefIncr((Ref *)newchild); GeomDelete((*parent->Class->replace)(parent, newchild)); GeomNodeDataPrune(parent); } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/geom/transform.c0000644000175000017500000000333212310110200016027 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" Geom * GeomPosition(Geom *object, Transform T) { if( object && object->Class->position ) (*object->Class->position)(object, T); else if (T) TmIdentity(T); return object; } Geom *GeomTransformTo(Geom *object, Transform T, TransformN *TN) { if( object && object->Class->transformto ) (*object->Class->transformto)(object, T, TN); return object; } Geom *GeomTransform(Geom *object, Transform T, TransformN *TN) { if( object && object->Class->transform ) (*object->Class->transform)(object, T, TN); return object; } geomview-1.9.5/src/lib/gprim/geom/geomclass.h0000644000175000017500000002074412310110200016004 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef GEOMCLASSDEF #define GEOMCLASSDEF #undef GEOM_SM #include "geom.h" #include "appearance.h" #include "ooglutil.h" #include "pick.h" #include "bsptree.h" #include "freelist.h" #include "dbllist.h" typedef char *GeomNameFunc( void ); typedef GeomClass *GeomMethodsFunc( Geom *object ); typedef Geom *GeomMessageFunc( Geom *, int ac, char *av[] ); typedef Geom *GeomCopyFunc( Geom *object ); typedef Geom *GeomCreateFunc( Geom *existing, GeomClass *Class, va_list *args ); typedef int GeomGetFunc( Geom *g, int attribute, void *attrp ); typedef int GeomDeleteFunc( Geom *object ); typedef Geom *GeomReplaceFunc( Geom *object, Geom *newchild ); typedef Geom *GeomIterateFunc( GeomIter *iter, int op ); /* What should the interface be? */ typedef Geom *GeomLoadFunc( char *name ); typedef Geom *GeomFLoadFunc( IOBFILE *file, char *name ); typedef Geom *GeomSaveFunc( Geom *object, char *name ); typedef Geom *GeomFSaveFunc( Geom *object, FILE *file, char *name ); typedef Geom *GeomPositionFunc( Geom *object, Transform T ); typedef Geom *GeomTransformFunc( Geom *object, Transform T, TransformN *TN ); typedef Geom *GeomTransformToFunc( Geom *object, Transform T, TransformN *TN ); typedef Geom *GeomRotateFunc( Geom *object, float angle, Point3 *axis ); typedef Geom *GeomTranslateFunc( Geom *object, float x, float y, float z ); typedef Geom *GeomScaleFunc( Geom *object, float x, float y, float z ); typedef Geom *GeomEvertFunc( Geom *object ); typedef Geom *GeomBoundFunc( Geom *object, Transform T, TransformN *TN ); typedef Geom *GeomBoundSphereFunc( Geom *object, Transform T, TransformN *TN, int * axes, int space ); typedef Geom *GeomEvalFunc( Geom *object, float u, float v ); typedef Geom *GeomDiceFunc( Geom *object, int nu, int nv ); typedef Geom *GeomSubdivideFunc( /* Geom *object */ ); typedef Geom * GeomPickFunc(Geom *, Pick *, Appearance *, Transform, TransformN *, int *axes); typedef Geom *GeomFacingFunc( /* Geom *object, ... */ ); typedef Geom *GeomDrawFunc(Geom *object); typedef Geom *GeomBSPTreeFunc(Geom *object, BSPTree *tree, int action); /* GeomBSPTree action values */ enum { BSPTREE_CREATE = 0, /* simply record tree in geom-struct */ BSPTREE_DELETE = 1, /* delete the tree or the reference to it */ BSPTREE_ADDGEOM = 2 /* add polyhedrons to the tree's poly-list */ }; typedef int GeomExportFunc( Geom *object, Pool *p ); typedef Geom *GeomImportFunc( Pool *p ); typedef Geom *GeomUnexportFunc( Handle *h ); typedef Geom *GeomScanFunc( Geom *g, int (*func)(/*Geom*,Handle**,void *arg*/), void *arg ); typedef Geom *GeomAppendFunc( Geom *g, Handle *h, Geom *newitem ); struct GeomClass { /* General Methods */ GeomClass *super; /* superclass of this class */ GeomNameFunc *name; GeomMethodsFunc *methods; GeomMessageFunc *message; GeomGetFunc *get; GeomCreateFunc *create; GeomDeleteFunc *Delete; GeomCopyFunc *copy; GeomReplaceFunc *replace; GeomFLoadFunc *fload; GeomFSaveFunc *fsave; GeomExtFunc **extensions; /* Extension methods live here */ int n_extensions; /* Size of extensions[] array */ /* Geometric Methods */ GeomPositionFunc *position; GeomTransformFunc *transform; GeomTransformToFunc *transformto; GeomEvertFunc *evert; GeomBoundFunc *bound; GeomEvalFunc *eval; GeomDiceFunc *dice; GeomSubdivideFunc *subdivide; /* Picking methods */ GeomPickFunc *pick; GeomBoundSphereFunc *boundsphere; GeomIterateFunc *iterate; GeomAppendFunc *append; /* Append new item to hierarchy object */ GeomScanFunc *scan; /* Graphics Methods */ GeomFacingFunc *facing; GeomDrawFunc *draw; GeomBSPTreeFunc *bsptree; /* Communications methods */ GeomExportFunc *export; GeomImportFunc *import; GeomUnexportFunc *unexport; }; extern GeomClass *GeomClassCreate(); extern GeomClass *GeomSubClassCreate(); extern GeomClass *GeomClassLookup(char *classname); extern void *GeomClassIterate(); extern GeomClass *GeomNextClass( void *iter ); extern GeomClass *GeomFName2Class( char *fname ); extern Geom *GeomBoundSphereFromBBox(Geom *, Transform, TransformN *, int *axes, int space); /* internal routine used by file-reading routines */ extern char *GeomToken(IOBFILE *f); /* flag values for "geomflags" */ #define VERT_N (1 << 0) #define VERT_C (1 << 1) #define VERT_4D (1 << 2) #define VERT_ST (1 << 3) /* texture */ #define FACET_C (1 << 4) #define COLOR_ALPHA (1 << 5) /* VERT_C or FACET_C have alpha != 1 */ #define GEOM_ALPHA (1 << 6) /* geom color or mat. color have alpha != 1 */ #define GEOM_COLOR (VERT_C|FACET_C) #define GEOMFL_SHIFT 8 #define GEOMFL_MASK ~(~0U << GEOMFL_SHIFT) /* per class additions should be defined using this macro: */ #define GEOMFLAG(bits) ((bits) << GEOMFL_SHIFT) /* 32-bit magic numbers for OOGL data types */ #define GeomMagic(key, ver) OOGLMagic('g', ((key) << 8) | ((ver)&0xff)) #define GeomIsMagic(magic) (((magic) & 0xffff0000) == GeomMagic(0,0)) /* This is the "common" geom stuff which starts every geom */ #define GEOMFIELDS \ REFERENCEFIELDS; /* magic, ref_count, handle */ \ struct GeomClass *Class; \ Appearance *ap; \ Handle *aphandle; \ int geomflags; \ int pdim; /* does this belong here? */ \ FreeListNode **freelisthead; /* memory management */ \ /* The following three fields are used to attach data to a geometry \ * objects which depends on the position of the Geom in the object \ * hierarchy. As a Geom object can be referenced by Handles the Geom \ * might occur in many positions inside the hierarchy. See also the \ * comment in front of "struct NodeData" below. \ * \ * The components "ppath" and "ppathlen" newpl.ppath = pl->ppath; newpl.ppathlen = pl->ppathlen; are non-persistent and only \ * valid through tree traversal with GeomDraw(). \ */ \ DblListNode pernode; /* per-node data */ \ char *ppath; /* parent path */ \ int ppathlen; /* its length */ \ /* Also a non-persistent entry: the bsptree for correct rendering of \ * translucent objects with alpha-blending. If non-NULL, this is the \ * tree for the object sub-hierarchy starting at this object. \ */ \ BSPTree *bsptree struct Geom { /* common data structures for all Geom's */ GEOMFIELDS; }; typedef struct HGeom { /* This tuple appears in hierarchy objects */ Handle *h; Geom *g; } HGeom; static inline bool GeomHasAlpha(Geom *geom, const Appearance *ap) { if ((ap->flag & APF_TRANSP) && (ap->flag & APF_FACEDRAW) && ap->translucency == APF_ALPHA_BLENDING) { if ((ap->flag & APF_TEXTURE) && ap->tex && ap->tex->apply != TXF_DECAL && ap->tex->image && (ap->tex->image->channels % 2 == 0)) { /* maybe the picture code should set a flag if the alpha channel * indeed has values != 255. */ geom->geomflags |= GEOM_ALPHA; return true; } else if ((ap->mat->valid & MTF_ALPHA) && ((ap->mat->override & MTF_ALPHA) || !(geom->geomflags & GEOM_COLOR))) { if (ap->mat->diffuse.a != 1.0) { geom->geomflags |= GEOM_ALPHA; return true; } } else if (geom->geomflags & COLOR_ALPHA) { geom->geomflags |= GEOM_ALPHA; return true; } } geom->geomflags &= ~GEOM_ALPHA; return false; } #endif /*GEOMCLASSDEF*/ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/geom/geomclass_sm.h0000644000175000017500000000304012310110200016471 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GEOMCLASS_SM_ #define _GEOMCLASS_SM_ #define IsInSM(addr, sm) ((sm)->sm_base <= (char *)(addr) && \ (char *)(addr) < (sm)->sm_base + (sm)->sm_mapped) #define GeomRefreshSM(sm) ((sm)->sm_mapped < ROOTSYM(sm)->s_size ? GeomRemapSM(sm) : (sm)->sm_mapped) #define ROOTSYM(sm) ((GeomSMSym *)(sm)->sm_base) #define GOffset(sym, type, ptr) ((type *)(((char *)(ptr)) + \ (((char *)(sym)) - (sym)->s_here))) #define MAXSM 4 /* Max number of simultaneous shared mem's */ #define SM_MAGIC 0x4AB3B8B9 /* s_version field for SM root symbol */ #endif _GEOMCLASS_SM_ geomview-1.9.5/src/lib/gprim/geom/geom.h0000644000175000017500000001534112310110200014753 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef GEOMDEF #define GEOMDEF #include "handle.h" #include "3d.h" #include "create.h" #ifndef __cplusplus typedef struct Geom Geom; /* Complete OOGL object */ typedef struct GeomClass GeomClass; /* Virtual func tbl for Geom */ typedef struct GeomIter GeomIter; /* opaque iteration handle */ #else struct Geom; struct GeomClass; struct GeomIter; #endif struct BSPTree; extern char *GeomName( Geom *obj ); extern GeomClass *GeomMethods( Geom * ); extern Geom *GeomMessage( Geom *obj, int ac, char *av[] ); extern Geom *GeomCopy( Geom *obj ); extern Geom *GeomCreate( char *classname, ... ); extern Geom *GeomCCreate( Geom *existing_value, GeomClass *Class, ... ); extern void GeomDelete( Geom *obj ); extern Geom *GeomLoad( char *name ); extern Geom *GeomFLoad( IOBFILE *inf, char *fname ); /* name for errs & type-guessing, may be NULL */ extern int GeomFLoadEmbedded( Geom **obj, Handle **handlep, IOBFILE *inf, char *fname ); extern int GeomStreamIn( Pool *, Handle **handlep, Geom **geomp ); extern int GeomStreamOut( Pool *, Handle *h, Geom *g ); extern Geom *GeomSave( Geom *obj, char *name ); extern Geom *GeomFSave( Geom *obj, FILE *outf, char *fname ); extern Geom *GeomFSaveEmbedded( Geom *obj, Handle *handle, FILE *inf, char *fname ); extern void GeomReplace( Geom *parent, Geom *newchild ); extern Geom *GeomEvert( Geom *obj ); extern Geom *GeomBound( Geom *obj, Transform T, TransformN *TN); extern Geom *GeomBoundSphere( Geom *obj, Transform T, TransformN *, int *axes, int space ); extern Geom *GeomEval( Geom *obj ); extern Geom *GeomDice( Geom *obj, int nu, int nv ); extern Geom *GeomSubdivide( Geom *obj ); extern Geom *GeomPosition( Geom *obj, Transform T ); extern Geom *GeomTransform( Geom *obj, Transform T, TransformN *TN ); extern Geom *GeomTransformTo( Geom *obj, Transform T, TransformN *TN ); extern int GeomSet( Geom *g, /* int attr, */ ... /* , CR_END */ ); extern int GeomGet( Geom *g, int attr, void *attrp ); extern void GeomHandleScan( Geom *g, int (*func)(), void *arg ); extern Geom *GeomDraw( Geom *obj ); /* Using current mg context */ extern struct BSPTree * GeomBSPTree(Geom *geom, struct BSPTree *tree, int action); extern Geom *GeomBSPTreeDraw(Geom *geom); /* only for transparency */ /* Extensions. These are roughly objective-C style. * Extension-functions are named with ASCII strings; for efficiency, * the library interface uses integer "selectors". Typical usage: * int sel = GeomNewMethod( "new_method_name", my_default_func ); * to define a new method, and/or * GeomDefineMethod( sel, PolyListMethods(), my_func_for_polylists ); * GeomDefineMethod( sel, InstMethods(), my_func_for_insts ); * ... * to define a new method & its behavior on various object types. Or: * int sel = GeomMethodSel( "method_name" ); * returns the selector of an already-defined extension. * (GeomMethodSel() returns 0 for undefined extensions). * To use the new method: * result = GeomCall( sel, geom, ... ); */ typedef void *GeomExtFunc( int sel, Geom *geom, va_list *args ); extern int GeomMethodSel( char *name ); /* name -> selector, or 0 */ extern char *GeomMethodName( int sel ); /* selector -> name or NULL */ extern int GeomNewMethod( char *name, GeomExtFunc *defaultfunc );/* -> selector */ GeomExtFunc *GeomSpecifyMethod( int sel, GeomClass *Class, GeomExtFunc *func ); extern void *GeomCall( int sel, Geom *geom, ... ); extern void *GeomCallV( int sel, Geom *geom, va_list *args ); /* Notes: * GeomMethodSel() returns the selector for a given extension; 0 = unknown. * GeomMethodName() returns the string naming an extension; NULL = unknown. * GeomNewMethod() returns the newly assigned selector. * GeomSpecifyMethod() returns the old method function, or NULL if none. * GeomCall() invokes a method function; if none was specified for that * object class, the method's default function is called. * GeomCallV() takes a va_list rather than GeomCall's explicit param list. */ /* Iteration */ /* Iterate() flag bits: */ #define SHALLOW 1 /* Shallow traversal */ #define DEEP 0 /* vs. Fully recursive */ #define TRANSFORMED 2 /* Fully flatten all Geom's */ #define INSTANCED 0 /* vs. Return Inst -> Geom's (saves copying data) */ #define RETAIN 4 /* Retain returned Geom's indefinitely */ #define DESTROY 0 /* vs. Destroy returned Geom's at next iteration step */ extern GeomIter *_GeomIterate( Geom *root, int flags ); extern Geom *NextGeom( GeomIter * ); extern int _NextTransform( GeomIter *, Transform T ); extern void DestroyIter( GeomIter * ); static inline GeomIter *GeomIterate(Geom *root, int flags) { if (!root) { return NULL; } else { return _GeomIterate(root, flags); } } static inline int NextTransform(GeomIter *iter, Transform T) { if (iter == NULL) { return 0; } return _NextTransform(iter, T); } /* Import/export */ extern int GeomUpdate( Geom *obj, int doImport ); /* Recursive bind */ /* to support compatibility with the old way of doing it */ #define GeomScale(ggg, sx, sy, sz) { \ Transform t; \ Tm3Scale(t, sz, sy, sz); \ GeomTransform(ggg, t); } #define GeomTranslate(ggg, tx, ty, tz) { \ Transform t; \ Tm3Translate(t, tz, ty, tz); \ GeomTransform(ggg, t); } #define GeomRotate(ggg, aa, axis) { \ Transform t; \ Tm3Rotate(t, aa, axis); \ GeomTransform(ggg, t); } extern Geom *GeomCCreate(Geom *g, GeomClass *c, ...); extern int GeomDecorate(/* Geom *g, int *copyp, int feature, va_list *ap */); extern void GeomAcceptToken(); extern void GGeomInit(/*Geom *g, GeomClass *Class, int magic, Appearance *ap*/); extern void GeomKnownClassInit(); extern void GeomAddTranslator(char *prefix, char *cmd); #endif /*GEOMDEF*/ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/geom/pick.h0000644000175000017500000001153112310110200014747 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef PICKDEF #define PICKDEF /* * Public definitions for Geom Picking. */ typedef struct Pick Pick; /* Things to look for while picking * Specify PW_VERT|PW_EDGE|PW_FACE for all, * or a subset for more specific picks. * PW_VISIBLE checks Appearance to see what's * actually visible. */ #define PW_VERT 1 #define PW_EDGE 2 #define PW_FACE 4 #define PW_VISIBLE 8 #define PA_END 100 #define PA_THRESH 101 /* float; x/y threshold (in projected space) */ #define PA_POINT 102 /* Point3 *; Picked 3D point (object space) */ /* Note PA_POINT gives a Point3, not an HPoint3! */ #define PA_DEPTH 103 /* float; depth (== PA_POINT's screen z component) */ #define PA_GPRIM 104 /* Geom *; geometric primitive picked if any */ #define PA_TPRIM 105 /* Transform; from PA_GPRIM to PA_POINT, PA_VERT, etc. */ #define PA_TPRIMN 128 /* TransformN; from PA_GPRIM to PA_POINT, PA_VERT, etc. */ #define PA_TWORLD 111 /* Transform; from PA_POINT, PA_VERT, etc. to * world coords */ #define PA_TWORLDN 129 /* Transform; from PA_POINT, PA_VERT, etc. to * world coords */ #define PA_WANT 106 /* int; bitmask of desirable values */ #define PA_VERT 107 /* HPoint3 v; picked vertex, if any */ #define PA_EDGE 108 /* HPoint3 e[2]; endpoints of picked edge, if any */ #define PA_FACE 109 /* HPoint3 *f; pointer to array of vertices of picked face, if any */ #define PA_FACEN 110 /* number of elements in PA_FACE array; NOTE: when setting PA_FACE you must also set PA_FACEN. */ /* Stuff to specify via PickSet() to allow * INSTs with "location" fields to be pickable. */ #define PA_TC2N 112 /* Tfm camera coords to NDC (-1..+1) */ #define PA_TW2N 113 /* Tfm global coords to NDC */ #define PA_TS2N 114 /* Tfm screen (pixels; 0,0=lower left) to NDC */ extern Pick *PickSet( Pick *, int attr, ... ); extern int PickGet( Pick *, int attr, void *attrp ); extern void PickDelete( Pick * ); /* * Geometric Picking routines. * GeomMousePick() is intended for normal use by application programs. * g is the root of the Geom tree * p is the Pick structure created by PickSet(), etc., or NULL for default; * If p!=NULL, it is modified in place, so results of the pick can be * retrieved by later PickGet() calls. * ap is the Appearance in effect when g is drawn, used to determine * visibility of features if PW_VISIBLE is set; * Tproj is the complete object-to-screen projection matrix; * it normally maps world coordinates in g's space to * the unit cube -1 <= {x, y, z} <= 1, * with z = -1 at the near and z = +1 at the far clipping plane, * x = y = 0 at the center of the screen; * xpick and ypick are the relative (-1 <= {x,y} <= 1) window * coordinates of the pick. * * Typical use: * Point3 rawpt, pickworld, pickprim; * double mousex, mousey; ( each reduced to range -1 .. +1; 0=center ) * Geom *world, *g; * Pick *p = PickSet(NULL, PA_END); * Transform Tworld2screen, Tpick2world, Tpick2prim; * CamView( camera, Tworld2screen ); ( camera's world to screen ) * * g = GeomMousePick( world, p, ap, Tworld2screen, mousex, mousey ); * if(g != NULL) { (then g == world) * PickGet(p, PA_POINT, &rawpt); * PickGet(p, PA_TWORLD, Tpick2world); * Pt3Transform(Tpick2world, &rawpt, &pickworld); (in "world"'s coords) * * PickGet(p, PA_TPRIM, Tpick2prim); * Pt3Transform(Tpick2prim, &rawpt, &pickprim); (in leaf-level gprim's coords) * } */ extern Geom *GeomMousePick(Geom *g, Pick *p, Appearance *ap, Transform Tproj, TransformN *TNproj, int *axes, double xpick, double ypick ); /* * GeomPick() is an internal routine: * g, p, ap are as above for GeomMousePick. * T is adapted for convenience in pick calculations; * it is translated such that the pick goes through (x,y) = (0,0). */ extern Geom *GeomPick(Geom *g, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes); #endif /*PICKDEF*/ geomview-1.9.5/src/lib/gprim/geom/pickP.h0000644000175000017500000001031712310110200015070 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #ifndef PICKPDEF #define PICKPDEF /* * Private definitions for picking. */ #include "pick.h" #include "ooglutil.h" struct Pick { Point3 got; float thresh; int want; /* Fields wanted */ int found; /* Fields found */ vvec gcur; /* Path to the current primitive - used for recursion */ vvec gpath; /* Path to picked primitive */ Geom *gprim; /* Picked primitive */ HPoint3 v; /* picked vertex, if any */ int vi; /* index of picked vertex */ HPoint3 e[2]; /* endpoints of picked edge, if any */ int ei[2]; /* indices of endpoints of picked edge */ Transform Tprim; /* gprim -> screen */ Transform Tmirp; Transform Tw; Transform Tself; /* for ND-viewing. */ TransformN *TprimN; TransformN *TmirpN; int axes[4]; /* the relevant sub-space of the output of * TprimN. */ TransformN *TwN; TransformN *TselfN; HPoint3 *f; /* array of vertices of picked face, if any */ int fn; /* number of vertices in array f */ int fi; /* index of picked face */ Transform Ts2n; /* NDC to screen tfm */ Transform Tc2n; /* NDC to camera tfm */ Transform Tw2n; /* NDC to world (global) tfm */ float x0, y0; /* NDC coords of original pick */ }; /* * PickFace() is used to test a face for a pick and modify the pick * structure if necessary. * n_verts is the number of vertices in the face. * verts is the list of vertices in the face. * pick is the pick structure. * ap is the appearance (not currently used). * The following fields of the pick structure will be filled in: * found - what has been found. * vi - index of the picked vertex in the verts array. * ei - indices of the endpoints of the picked edge in the verts array. * f - freed if non-NULL and set to NULL * PickFace() returns nonzero if something was picked. The calling * program is responsible for using the data returned in the pick * structure to fill in the actual points and correct the indices. */ int PickFace(int n_verts, Point3 *verts, Pick *pick, Appearance *ap); /* * PickFillIn() is used to fill in the fields of a pick structure once * a pick has been found. * pick is the pick structure. * n_verts is the number of points in the face. * got is the interesection of the pick ray with the face. * vertex is the index of the picked vertex (-1 if none). * edge is the index of the first vertex of the hit line (-1 if none). * ep is the picked point on the edge. * The routine fills in the following fields of the pick structure: * got - filled in with the parameter got. * found - filled in with what was found. * vi - the index of the picked vertex. * ei - the indices of the endpoints of the picked edge. * f - freed if non-null and set to null. * fn - the number of vertices in the face * gpath - the path to the picked primitive (copy of gcur) * The rest of the fields are left unchanged. * Returns pick->found. */ int PickFillIn(Pick *pick, int n_verts, Point3 *got, int vertex, int edge, Appearance *ap); #endif /*PICKPDEF*/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/geom/vert.h0000644000175000017500000000213312310110200014777 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef VERTDEFS #define VERTDEFS #define VERT_P 0 #define VERT_N (1 << 0) #define VERT_C (1 << 1) #define VERT_4D (1 << 2) #endif geomview-1.9.5/src/lib/gprim/geom/bsptree.c0000644000175000017500000012324212310110200015463 00000000000000/* Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif /* BSP-tree implementation. The members of the BSP-tree will be * polyhedrons, but the goal is to generate BSP-trees for QUADs and * MESHes too. Not for ND-objects, would probably not work. */ #include "geomclass.h" #include "polylistP.h" #include "mg.h" #include "mesh.h" #include "meshP.h" #include "quadP.h" #include "meshflag.h" #include "bsptree.h" #include "bsptreeP.h" #define BSPTREE_STATS 0 #if BSPTREE_STATS static int n_initial_polys; static int n_tree_polys; static int tree_depth; #endif #if 1 /* maybe lower the floating point tolerances a little bit? */ /* FLT_EPSILON: 1.19209290e-7F */ # undef TOLERANCE # undef fneg # undef fpos # undef fzero # undef fz # undef fnz /* BIG FAT NOTE: even 1e-3 seems to give reasonable rendering results, * though 1-e3 is quite large a tolerance. We should weight the * tolerance by the modulus of the co-ordinate data, this would make * the stuff more sane. */ # define TOLERANCE 1e-3 # define fneg(a) ((a)<-TOLERANCE) # define fpos(a) ((a)> TOLERANCE) # define fzero(a) (((a)-TOLERANCE)) # define fz(a) fzero(a) # define fnz(a) (!fzero(a)) #endif #define obstack_chunk_alloc malloc #define obstack_chunk_free free #define POLY_SCRATCH 0x80000000 /* Flag indicates that this polylives * on our obstack */ void BSPTreeNodeDataFreeListPrune(void) { NodeDataFreeListPrune(); } static void check_poly(Poly *poly) { int i; for (i = 0; i < poly->n_vertices; i++) { if (!finite(poly->v[i]->pt.x + poly->v[i]->pt.y + poly->v[i]->pt.z + poly->v[i]->pt.w)) { abort(); } } } #define ListPush(head, new_node) \ { \ PolyListNode *_lp_tmp_ = (new_node); \ _lp_tmp_->next = (head); (head) = _lp_tmp_; \ } #define ListPop(head, car) \ (car) = (head); (head) = (head)->next; (car)->next = NULL; typedef enum PolyPos { BACKOF = -1, COPLANAR = 0, INFRONTOF = 1, BOTH_SIDES = 2 } PolyPos; typedef struct EdgeIntersection { int v[2]; /* The vertex number of the enclosing points */ HPt3Coord scp[2]; /* The position of the vertices relative to the * intersection plane. */ } EdgeIntersection; static void BSPTreeCreateRecursive(BSPTreeNode *tree, PolyListNode *pllist, #if BSPTREE_STATS int depth, #endif struct obstack *scratch); static inline Poly *new_poly(int nv, Vertex **v, struct obstack *scratch) { Poly *newp; newp = obstack_alloc(scratch, sizeof(Poly)); memset(newp, 0, sizeof(Poly)); newp->flags = POLY_SCRATCH; newp->n_vertices = nv; if (v) { newp->v = v; } else { newp->v = obstack_alloc(scratch, nv*sizeof(Vertex *)); } if (newp->v) { memset(newp->v, 0, nv*sizeof(Vertex *)); } return newp; } static inline PolyListNode *new_poly_list_node(const void **tagged_app, struct obstack *scratch) { PolyListNode *new_pn; new_pn = obstack_alloc(scratch, sizeof(PolyListNode)); new_pn->pn = NULL; new_pn->tagged_app = tagged_app; return new_pn; } /* Generate a transformed copy of poly. */ static inline Poly *transform_poly(Transform T, Transform Tdual, Transform TxT, Poly *poly, struct obstack *scratch) { Poly *newp; int i; newp = new_poly(poly->n_vertices, NULL, scratch); for (i = 0; i < poly->n_vertices; i++) { newp->v[i] = obstack_alloc(scratch, sizeof(Vertex)); HPt3Transform(T, &poly->v[i]->pt, &newp->v[i]->pt); if (poly->flags & PL_HASVCOL) { newp->v[i]->vcol = poly->v[i]->vcol; } if (poly->flags & PL_HASVN) { NormalTransform(Tdual, &poly->v[i]->vn, &newp->v[i]->vn); } if (poly->flags & PL_HASST) { TxSTTransform (TxT, &poly->v[i]->st, &newp->v[i]->st); } } if (poly->flags & PL_HASPCOL) { newp->pcol = poly->pcol; } if (poly->flags & PL_HASPN) { NormalTransform(Tdual, &poly->pn, &newp->pn); } newp->flags = poly->flags; return newp; } /* Split the given polygon -- which must describe a quadrilateral -- * along the diagonal starting at "vertex". Used for splitting * non-flat or concave quadrilaterals. */ static inline void split_quad_poly(int vertex, Poly *poly0, PolyListNode **plist, const void **tagged_app, struct obstack *scratch) { PolyListNode *new_pn; Poly *poly[2]; Poly savedp; Vertex *savedv[4]; int i, v; if (poly0->flags & POLY_SCRATCH) { /* reuse the space */ savedp = *poly0; savedp.v = savedv; memcpy(savedp.v, poly0->v, 4*sizeof(Vertex *)); new_pn = new_poly_list_node(tagged_app, scratch); new_pn->poly = poly[0] = poly0; poly[0]->n_vertices = 3; ListPush(*plist, new_pn); poly0 = &savedp; } for (i = (poly0->flags & POLY_SCRATCH) != 0; i < 2; i++) { new_pn = new_poly_list_node(tagged_app, scratch); new_pn->poly = poly[i] = new_poly(3, NULL, scratch); ListPush(*plist, new_pn); } for (i = 0; i < 2; i++) { poly[i]->pcol = poly0->pcol; poly[i]->pn = poly0->pn; poly[i]->flags |= poly0->flags; } /* copy over vertex information, the _REAL_ poly normal will be * computed later, the need for that is flagged by POLY_SCRATCH. */ v = vertex; for (i = 0; i < 3; i++) { poly[0]->v[i] = poly0->v[v++]; v %= 4; } v = (v - 1 + 4) % 4; for (i = 0; i < 3; i++) { poly[1]->v[i] = poly0->v[v++]; v %= 4; } } static inline void meshv_to_polyv(Vertex *pv, Mesh *mesh, int vidx) { memset(pv, 0, sizeof(Vertex)); pv->pt = mesh->p[vidx]; #if 0 #if 0 HPt3Dehomogenize(&pv->pt, &pv->pt); #else Pt3ToHPt3((Point3 *)(void *)&pv->pt, &pv->pt, 1); #endif #endif if (mesh->geomflags & MESH_N) { pv->vn = mesh->n[vidx]; } if (mesh->geomflags & MESH_C) { pv->vcol = mesh->c[vidx]; } if (mesh->geomflags & MESH_U) { pv->st = mesh->u[vidx]; } } static inline void meshv_to_polyv_trans(Transform T, Transform Tdual, Transform TxT, Vertex *pv, Mesh *mesh, int vidx) { memset(pv, 0, sizeof(Vertex)); HPt3Transform(T, &mesh->p[vidx], &pv->pt); #if 0 /* why should we */ #if 0 HPt3Dehomogenize(&pv->pt, &pv->pt); #else Pt3ToHPt3((Point3 *)(void *)&pv->pt, &pv->pt, 1); #endif #endif if (mesh->geomflags & MESH_N) { NormalTransform(Tdual, &mesh->n[vidx], &pv->vn); } if (mesh->geomflags & MESH_C) { pv->vcol = mesh->c[vidx]; } if (mesh->geomflags & MESH_U) { TxSTTransform(TxT, &mesh->u[vidx], &pv->st); } } static PolyListNode * QuadToLinkedPolyList(Transform T, Transform Tdual, Transform TxT, const void **tagged_app, PolyListNode **plistp, Quad *quad, struct obstack *scratch) { PolyListNode *plist = NULL; Poly *qpoly; int i, j, concave; (void)Tdual; (void)TxT; if (!plistp) { plistp = &plist; } if(!(quad->geomflags & QUAD_N)) { QuadComputeNormals(quad); } qpoly = NULL; for (i = 0; i < quad->maxquad; i++) { /* First try to create a single polygon, if that mesh-cell is * non-flat or concave, then sub-divide it. */ if (!qpoly) { qpoly = new_poly(4, NULL, scratch); for (j = 0; j < 4; j++) { qpoly->v[j] = obstack_alloc(scratch, sizeof(Vertex)); } } if (T && T != TM_IDENTITY) { for (j = 0; j < 4; j++) { memset(qpoly->v[j], 0, sizeof(Vertex)); HPt3Transform(T, &quad->p[i][j], &qpoly->v[j]->pt); NormalTransform(T, &quad->n[i][j], &qpoly->v[j]->vn); } } else { for (j = 0; j < 4; j++) { memset(qpoly->v[j], 0, sizeof(Vertex)); qpoly->v[j]->pt = quad->p[i][j]; qpoly->v[j]->vn = quad->n[i][j]; } } qpoly->flags |= PL_HASVN; if (quad->geomflags & QUAD_C) { qpoly->flags |= PL_HASVCOL; for (j = 0; j < 4; j++) { qpoly->v[j]->vcol = quad->c[i][j]; } } if (quad->geomflags & COLOR_ALPHA) { qpoly->flags |= COLOR_ALPHA; } PolyNormal(qpoly, &qpoly->pn, quad->geomflags & VERT_4D, false, &qpoly->flags, &concave); qpoly->flags |= PL_HASPN; if (qpoly->flags & POLY_NOPOLY) { /* degenerated, skip it, but reuse the memory region. */ qpoly->flags = 0; } else if (qpoly->flags & (POLY_CONCAVE|POLY_NONFLAT)) { /* we need to split it */ split_quad_poly(concave, qpoly, plistp, tagged_app, scratch); qpoly = NULL; } else { PolyListNode *new_pn; new_pn = new_poly_list_node(tagged_app, scratch); new_pn->poly = qpoly; ListPush(*plistp, new_pn); qpoly = NULL; } } return *plistp; } /* Convert a Mesh into linked list of PolyListNodes, subdivide * non-flat or concave quadrilaterals. */ static PolyListNode * MeshToLinkedPolyList(Transform T, Transform Tdual, Transform TxT, const void **tagged_app, PolyListNode **plistp, Mesh *mesh, struct obstack *scratch) { PolyListNode *plist = NULL; Poly *qpoly; int v0 = 1, prev0v = 0; int u0 = 1, prev0u = 0; int u, v, prevu, prevv; int concave; int i; if (!plistp) { plistp = &plist; } MeshComputeNormals(mesh, MESH_N); if(mesh->geomflags & MESH_UWRAP) { v0 = 0, prev0v = mesh->nv-1; } if(mesh->geomflags & MESH_VWRAP) { u0 = 0, prev0u = mesh->nu-1; } #define MESHIDX(u, v, mesh) ((v)*(mesh)->nu + (u)) qpoly = NULL; for(prevv = prev0v, v = v0; v < mesh->nv; prevv = v, v++) { for(prevu = prev0u, u = u0; u < mesh->nu; prevu = u, u++) { /* First try to create a single polygon, if that mesh-cell is * non-flat or concave, then sub-divide it. */ if (!qpoly) { qpoly = new_poly(4, NULL, scratch); for (i = 0; i < 4; i++) { qpoly->v[i] = obstack_alloc(scratch, sizeof(Vertex)); } } if (T && T != TM_IDENTITY) { meshv_to_polyv_trans(T, Tdual, TxT, qpoly->v[0], mesh, MESHIDX(prevu, prevv, mesh)); meshv_to_polyv_trans(T, Tdual, TxT, qpoly->v[1], mesh, MESHIDX(u, prevv, mesh)); meshv_to_polyv_trans(T, Tdual, TxT, qpoly->v[2], mesh, MESHIDX(u, v, mesh)); meshv_to_polyv_trans(T, Tdual, TxT, qpoly->v[3], mesh, MESHIDX(prevu, v, mesh)); } else { meshv_to_polyv(qpoly->v[0], mesh, MESHIDX(prevu, prevv, mesh)); meshv_to_polyv(qpoly->v[1], mesh, MESHIDX(u, prevv, mesh)); meshv_to_polyv(qpoly->v[2], mesh, MESHIDX(u, v, mesh)); meshv_to_polyv(qpoly->v[3], mesh, MESHIDX(prevu, v, mesh)); } if (mesh->geomflags & MESH_C) { qpoly->flags |= PL_HASVCOL; } if (mesh->geomflags & COLOR_ALPHA) { qpoly->flags |= COLOR_ALPHA; } if (mesh->geomflags & MESH_N) { qpoly->flags |= PL_HASVN; } if (mesh->geomflags & MESH_U) { qpoly->flags |= PL_HASST; } PolyNormal(qpoly, &qpoly->pn, mesh->geomflags & VERT_4D, false, &qpoly->flags, &concave); qpoly->flags |= PL_HASPN; if (qpoly->flags & POLY_NOPOLY) { /* polygon is degenerated, we just do NOT draw it, edges are * drawn by other methods. Just do nothing, qpoly will be * re-used for the next quad. */ qpoly->flags = 0; } else if (qpoly->flags & (POLY_CONCAVE|POLY_NONFLAT)) { /* we need to split it */ split_quad_poly(concave, qpoly, plistp, tagged_app, scratch); qpoly = NULL; } else { PolyListNode *new_pn; new_pn = new_poly_list_node(tagged_app, scratch); new_pn->poly = qpoly; ListPush(*plistp, new_pn); qpoly = NULL; } } } #undef MESHIDX return *plistp; } #if HAVE_LIBGLU # include # include /* GLU tesselator interface for non-convex multi-vertex (> 4) * polygons. We allocate new vertices using the BSPTree obstack. */ struct tess_data { PolyListNode **plistp; const void **tagged_app; Poly *trickyp; /* original polygon */ unsigned polyflags; Point3 *pn; GLenum type; Poly *p; /* current polygon */ int vcnt; /* vertex count after begin() callback */ Vertex *v[2]; /* for TRIANGLE_STRIP and TRIANGLE_FAN */ struct obstack *scratch; }; void tess_combine_data(GLdouble coords[3], Vertex *vertex_data[4], GLfloat weight[4], Vertex **outData, struct tess_data *data) { Vertex *v = obstack_alloc(data->scratch, sizeof(Vertex)); HPt3Coord w; int i, n; /* Although otherwise documented at least the Mesa version of the * GLU tesselator sometimes does not fill vertex_data with valid * pointers. */ for (n = 3; n >= 0 && vertex_data[n] == NULL; --n); ++n; if (data->polyflags & VERT_ST) { /* texture co-ordinates */ for (i = 0; i < n; i++) { v->st.s += weight[i] * vertex_data[i]->st.s; v->st.t += weight[i] * vertex_data[i]->st.t; } /* same linear combination stuff as in SplitPolyNode(); be careful * not to dehomogenize, otherwise texturing might come out wrong. */ for (i = 0, w = 0.0; i < n; i++) { w += weight[i] * vertex_data[i]->pt.w; } } else { /* just use whatever has been passed in coords */ w = 1.0; } v->pt.x = coords[0] * w; v->pt.y = coords[1] * w; v->pt.z = coords[2] * w; v->pt.w = w; if (data->polyflags & VERT_C) { /* colors */ memset(&v->vcol, 0, sizeof(v->vcol)); for (i = 0; i < n; i++) { v->vcol.r += weight[i] * vertex_data[i]->vcol.r; v->vcol.g += weight[i] * vertex_data[i]->vcol.g; v->vcol.b += weight[i] * vertex_data[i]->vcol.b; v->vcol.a += weight[i] * vertex_data[i]->vcol.a; } } if (true || (data->polyflags & VERT_N)) { /* we _have_ normals */ /* The averaged vertex normals do not have an orientation, so try * to orient them w.r.t. the polygon normal before computing the * linear combination. */ memset(&v->vn, 0, sizeof(v->vn)); for (i = 0; i < n; i++) { Point3 *vn = &vertex_data[i]->vn; if (Pt3Dot(vn, data->pn) < 0.0) { Pt3Comb(-weight[i], vn, 1.0, &v->vn, &v->vn); } else { Pt3Comb(weight[i], vn, 1.0, &v->vn, &v->vn); } } Pt3Unit(&v->vn); } *outData = v; } void tess_begin_data(GLenum type, struct tess_data *data) { data->type = type; data->vcnt = 0; /* reset counter */ } void tess_vertex_data(Vertex *v, struct tess_data *data) { /* Here we have to do all the work, depending on what flag * previously has been passed to the begin() callback. */ if (data->vcnt == 0) { /* create a new polygon */ data->p = new_poly(3, NULL, data->scratch); data->p->flags |= data->polyflags; if (data->polyflags & FACET_C) { data->p->pcol = data->trickyp->pcol; } data->p->pn = *data->pn; /* always inherit the normal */ } switch (data->type) { case GL_TRIANGLES: /* the easy case */ /* add the vertex */ data->p->v[data->vcnt] = v; if (++data->vcnt == 3) { /* add the polygon to *data->plistp */ PolyListNode *new_pn; data->vcnt = 0; new_pn = new_poly_list_node(data->tagged_app, data->scratch); new_pn->poly = data->p; data->p = NULL; ListPush(*data->plistp, new_pn); } break; case GL_TRIANGLE_STRIP: /* pairs of triangles, all with the same orientation */ if (data->vcnt > 2) { /* create a new polygon */ data->p = new_poly(3, NULL, data->scratch); data->p->flags |= data->polyflags; if (data->polyflags & FACET_C) { data->p->pcol = data->trickyp->pcol; } data->p->pn = *data->pn; /* always inherit the normal */ data->p->v[0] = data->v[0]; data->p->v[1] = data->v[1]; /* add the vertex */ data->p->v[2] = v; } else { /* add the vertex */ data->p->v[data->vcnt] = v; } if (++data->vcnt > 2) { /* add the polygon to *data->plistp */ PolyListNode *new_pn; if (data->vcnt & 1) { data->v[0] = data->p->v[2]; data->v[1] = data->p->v[1]; } else { data->v[0] = data->p->v[0]; data->v[1] = data->p->v[2]; } new_pn = new_poly_list_node(data->tagged_app, data->scratch); new_pn->poly = data->p; ListPush(*data->plistp, new_pn); } break; case GL_TRIANGLE_FAN: if (data->vcnt > 2) { /* create a new polygon */ data->p = new_poly(3, NULL, data->scratch); data->p->flags |= data->polyflags; if (data->polyflags & FACET_C) { data->p->pcol = data->trickyp->pcol; } data->p->pn = *data->pn; /* always inherit the normal */ data->p->v[0] = data->v[0]; data->p->v[1] = data->v[1]; /* add the vertex */ data->p->v[2] = v; } else { if (data->vcnt == 0) { data->v[0] = v; } data->p->v[data->vcnt] = v; } if (++data->vcnt > 2) { /* add the polygon to *data->plistp */ PolyListNode *new_pn; data->v[1] = data->p->v[2]; new_pn = new_poly_list_node(data->tagged_app, data->scratch); new_pn->poly = data->p; ListPush(*data->plistp, new_pn); } break; default: break; } } #endif /* convert a PolyList into a linked list of PolyListNodes, subdivide * non-flat or concave polgons */ static PolyListNode * PolyListToLinkedPoyList(Transform T, Transform Tdual, Transform TxT, const void **tagged_app, PolyListNode **plistp, PolyList *pl, struct obstack *scratch) { PolyListNode *plist = NULL; int pnr; if (!plistp) { plistp = &plist; } PolyListComputeNormals(pl, PL_HASVN|PL_HASPN|PL_HASPFL); for (pnr = 0; pnr < pl->n_polys; pnr++) { PolyListNode *new_pn; Poly *poly; if (pl->p[pnr].flags & POLY_NOPOLY) { /* degenerated, just skip it */ continue; } poly = &pl->p[pnr]; poly->flags |= pl->geomflags; if (T && T != TM_IDENTITY) { poly = transform_poly(T, Tdual, TxT, poly, scratch); } switch (pl->p[pnr].n_vertices) { case 3: /* ok */ new_pn = new_poly_list_node(tagged_app, scratch); new_pn->poly = poly; ListPush(*plistp, new_pn); break; #if !HAVE_LIBGLU case 4: /* supported */ if (pl->p[pnr].flags & (POLY_NONFLAT|POLY_CONCAVE)) { /* split this polygon along a diagonal, if the polygon is * concave: split across the unique concave vertex. */ int concave; if (pl->p[pnr].flags & POLY_CONCAVE) { Point3 nu; /* We need to determine the concave vertex */ PolyNormal(poly, &nu, pl->geomflags & VERT_4D, false, NULL, &concave); } else { concave= 0; } split_quad_poly(concave, poly, plistp, tagged_app, scratch); } else { new_pn = new_poly_list_node(tagged_app, scratch); new_pn->poly = poly; ListPush(*plistp, new_pn); } break; default: if (pl->p[pnr].flags & (POLY_NONFLAT|POLY_CONCAVE)) { static int was_here; if (!was_here ) { GeomError(1, "Non-flat or concave polygons not supported yet.\n"); was_here = 1; } } new_pn = new_poly_list_node(tagged_app, scratch); new_pn->poly = poly; ListPush(*plistp, new_pn); break; #else case 4: /* if we want to be able to render polygons with * self-intersections "correctly", then we always have to use * the GLU tesselater for polygons with more than 4 vertices and * for non-convex quadrilaterals. We can handle non-flat * quadrilaterals ourselves. */ if ((pl->p[pnr].flags & (POLY_NONFLAT|POLY_CONCAVE)) == POLY_NONFLAT) { /* Split this polygon along a diagonal. Leave concave * quadrilaterals to the GLU tesselator; they could have * self-intersections. */ split_quad_poly(0, poly, plistp, tagged_app, scratch); } else if ((pl->p[pnr].flags & POLY_CONCAVE) == 0) { new_pn = new_poly_list_node(tagged_app, scratch); new_pn->poly = poly; ListPush(*plistp, new_pn); } break; /* otherwise fall into the > 4 vertices case and leave * everything to the GLU tesselator. */ default: { /* We use the GLU tesselator here, if available. It is not * necessary to reinvent the wheel; also, the OpenGL MG backend * also uses the tesselator (so we will get comparable shapes * w/o translucency). */ static GLUtesselator *glutess; struct tess_data tessdata[1]; VARARRAY2(dv, GLdouble, poly->n_vertices, 3); Vertex **vp; int i; if (glutess == NULL) { glutess = gluNewTess(); gluTessProperty(glutess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO); gluTessCallback(glutess, GLU_TESS_BEGIN_DATA, (GLvoid (*)())tess_begin_data); gluTessCallback(glutess, GLU_TESS_VERTEX_DATA, (GLvoid (*)())tess_vertex_data); gluTessCallback(glutess, GLU_TESS_COMBINE_DATA, (GLvoid (*)())tess_combine_data); } tessdata->trickyp = poly; tessdata->polyflags = poly->flags; tessdata->pn = &poly->pn; tessdata->scratch = scratch; tessdata->plistp = plistp; tessdata->tagged_app = tagged_app; /* tell GLU what we think is a good approximation for the normal */ gluTessNormal(glutess, poly->pn.x, poly->pn.y, poly->pn.z); /* rest is done in the callback functions */ gluTessBeginPolygon(glutess, tessdata); gluTessBeginContour(glutess); for (i = 0, vp = poly->v; i < poly->n_vertices; i++, vp++) { HPt3Coord w = (*vp)->pt.w ? (*vp)->pt.w : 1e20; if (w == 1.0) { dv[i][0] = (*vp)->pt.x; dv[i][1] = (*vp)->pt.y; dv[i][2] = (*vp)->pt.z; } else { dv[i][0] = (*vp)->pt.x / w; dv[i][1] = (*vp)->pt.y / w; dv[i][2] = (*vp)->pt.z / w; } gluTessVertex(glutess, dv[i], *vp); } gluTessEndContour(glutess); gluTessEndPolygon(glutess); break; /* out of switch */ } /* default */ #endif } /* switch */ } /* for */ return *plistp; } /* Create an empty BSP-tree and attach "object" to it. */ BSPTree *BSPTreeCreate(BSPTree *tree, Geom *object) { if (tree) { BSPTreeFreeTree(tree); } else { tree = OOGLNewE(BSPTree, "new BSP tree root"); memset(tree, 0, sizeof(BSPTree)); obstack_init(&tree->obst); } tree->geom = object; tree->T = TM_IDENTITY; tree->TxT = TM_IDENTITY; tree->tagged_app = NULL; return tree; } /* Add "object" to "bsptree"'s _INITIAL_ list of polygons; * bsptree->tree has to be NULL at this point, otherwise this is a * no-op. * * BUG: this should probably converted into a "method" which is * attached to each instance of a Geom. Do that later. If I find the * time. Never do that ... */ void BSPTreeAddObject(BSPTree *bsptree, Geom *object) { if (bsptree->tree) { static int was_here; if (!was_here ) { GeomError(1, "Adding polygons to a finalized BSP-tree is " "not implemented.\n"); was_here = 1; } return; /* Cannot add to finalized tree */ } /* Make a linked list of polyhedrons from object */ switch (object->magic) { case PLMAGIC: PolyListToLinkedPoyList(bsptree->T, bsptree->Tdual, bsptree->TxT, bsptree->tagged_app, &bsptree->init_lpl, (PolyList *)object, &bsptree->obst); break; case MESHMAGIC: MeshToLinkedPolyList(bsptree->T, bsptree->Tdual, bsptree->TxT, bsptree->tagged_app, &bsptree->init_lpl, (Mesh *)object, &bsptree->obst); break; case QUADMAGIC: QuadToLinkedPolyList(bsptree->T, bsptree->Tdual, bsptree->TxT, bsptree->tagged_app, &bsptree->init_lpl, (Quad *)object, &bsptree->obst); break; default: /* Do nothing */ break; } } /* The work-horse: really generate the tree, sub-divide as necessary. * We build a complete bsp-tree, i.e. each leaf-node contains only * co-planar polygons. */ void BSPTreeFinalize(BSPTree *bsptree) { if (bsptree->tree) { return; } #if BSPTREE_STATS { PolyListNode *pos; n_initial_polys = 0; for (pos = bsptree->init_lpl; pos; pos = pos->next) { ++n_initial_polys; } OOGLWarn("#initial polygons: %d", n_initial_polys); } #endif /* After bsptree->tree has been allocated adding to the tree is no * longer possible. */ bsptree->tree = obstack_alloc(&bsptree->obst, sizeof(BSPTreeNode)); if (!bsptree->init_lpl) { /* create an empty tree */ memset(bsptree->tree, 0, sizeof(BSPTreeNode)); return; } #if BSPTREE_STATS n_tree_polys = n_initial_polys; tree_depth = 0; #endif /* Do it. */ BSPTreeCreateRecursive(bsptree->tree, bsptree->init_lpl, #if BSPTREE_STATS 0, #endif &bsptree->obst); /* We build a complete tree, and discard all degenerated polygons, * so the polygon list is empty after creating the tree. */ bsptree->init_lpl = NULL; #if BSPTREE_STATS OOGLWarn("#tree polygons: %d", n_tree_polys); OOGLWarn("tree depth: %d", tree_depth); #endif } void BSPTreeFreeTree(const BSPTree *_tree) { BSPTree *tree = (BSPTree *)_tree; if (tree->tree != NULL || tree->init_lpl != NULL) { obstack_free(&tree->obst, NULL); obstack_init(&tree->obst); tree->tree = NULL; tree->init_lpl = NULL; tree->Tid = NULL; tree->Tidinv = NULL; tree->tagged_app = NULL; tree->oneshot = false; } } /* Geometries attached to INSTs or LISTs can be deleted underneath the * BSP-tree; so INSTs and LISTs must register a callback with their * handles. */ void BSPTreeInvalidate(Handle **chp, Ref *unused, BSPTree *self) { (void)unused; BSPTreeFreeTree(self); } /* This is really easy, 'cause we are using an obstack. */ void BSPTreeFree(BSPTree *tree) { if (tree != NULL) { obstack_free(&tree->obst, NULL); OOGLFree(tree); } } BSPTree *BSPTreeSet(BSPTree *tree, int attr1, ...) { int attr; va_list alist; #undef NEXT #define NEXT(type) va_arg(alist, type) va_start(alist, attr1); for (attr = attr1; attr != BSPTREE_END; attr = NEXT(int)) { switch (attr) { case BSPTREE_ONESHOT: tree->oneshot = NEXT(int); break; default: OOGLError(1, "BSPTreeSet: unknown attribute %d", attr); break; } } va_end(alist); return tree; } BSPTree *GeomBSPTree(Geom *geom, BSPTree *tree, int action) { const void **tagged_app = NULL; NodeData *pernode; if (!geom) { return NULL; } if (!geom->Class->bsptree) { return NULL; } switch (action) { case BSPTREE_CREATE: if (tree == NULL) { geom->bsptree = tree = BSPTreeCreate(geom->bsptree, geom); } pernode = GeomNodeDataCreate(geom, NULL); pernode->node_tree = tree; break; case BSPTREE_ADDGEOM: if (geom == tree->geom) { BSPTreeSetId(tree); } tagged_app = BSPTreePushAppearance(tree, geom); break; case BSPTREE_DELETE: if (tree == NULL || (tree = geom->bsptree) == NULL) { return NULL; } break; default: break; } (*geom->Class->bsptree)(geom, tree, action); switch (action) { case BSPTREE_DELETE: pernode = GeomNodeDataByPath(geom, NULL); pernode->node_tree = NULL; if (tree->geom == geom) { BSPTreeFree(tree); tree = geom->bsptree = NULL; } break; case BSPTREE_ADDGEOM: BSPTreePopAppearance(tree, tagged_app); break; default: break; } return tree; } Geom *GeomBSPTreeDraw(Geom *geom) { BSPTree *tree = geom->bsptree; if (tree == NULL || !(geom->geomflags & GEOM_ALPHA)) { return NULL; } /* 3d-view: tree might be persistent, but is only created on * demand. Do that now. * * Nd-view: tree is not persistent, but tree->init_lpl should be != * NULL at this stage. */ if (tree->tree == NULL) { if (tree->init_lpl == NULL) { GeomBSPTree((Geom *)geom, tree, BSPTREE_ADDGEOM); } BSPTreeFinalize(tree); } mgbsptree(tree); if (tree->oneshot) { /* This means we have an INST with location/origin != LOCAL; or * ND-drawing. Free the tree now. */ BSPTreeFreeTree(tree); } return geom; } static inline void CoLinSum(float a, ColorA *ca, float b, ColorA *cb, ColorA *cres) { cres->r = a*ca->r + b*cb->r; cres->g = a*ca->g + b*cb->g; cres->b = a*ca->b + b*cb->b; cres->a = a*ca->a + b*cb->a; } /* Split plnode along plane. We know that plane really intersects * plnode->poly. We also know that plnode->poly is planar and convex. * * Given this assumptions we know that plnode->poly has to be split * into exactly two pieces. */ static inline void SplitPolyNode(PolyListNode *plnode, PolyListNode **front, PolyListNode **back, EdgeIntersection edges[2], struct obstack *scratch) { const void **tagged_app = plnode->tagged_app; Poly *poly = plnode->poly, savedp; VARARRAY(savedv, Vertex *, poly->n_vertices); Vertex *v0, *v1, **vpos; int istart[2], iend[2], i, nv[2]; Vertex *vstart[2], *vend[2]; #if BSPTREE_STATS ++n_tree_polys; #endif vstart[0] = vstart[1] = vend[0] = vend[1] = NULL; istart[0] = istart[1] = iend[0] = iend[1] = -1; /* first point of intersection */ if (fzero(edges[0].scp[0])) { v0 = poly->v[edges[0].v[0]]; if (fpos(edges[0].scp[1])) { istart[0] = edges[0].v[0]; iend[1] = edges[0].v[0]; } else { istart[1] = edges[0].v[0]; iend[0] = edges[0].v[0]; } } else if (fzero(edges[0].scp[1])) { v0 = poly->v[edges[0].v[1]]; if (fpos(edges[0].scp[0])) { istart[1] = edges[0].v[1]; iend[0] = edges[0].v[1]; } else { istart[0] = edges[0].v[1]; iend[1] = edges[0].v[1]; } } else { HPt3Coord mu0, mu1; Vertex *V0 = poly->v[edges[0].v[0]]; Vertex *V1 = poly->v[edges[0].v[1]]; v0 = obstack_alloc(scratch, sizeof(Vertex)); mu0 = edges[0].scp[1]/(edges[0].scp[1]-edges[0].scp[0]); #if 0 mu1 = edges[0].scp[0]/(edges[0].scp[0]-edges[0].scp[1]); #else mu1 = 1.0 - mu0; #endif /* Use denormalized variant; otherwise textures may come out wrong * because the homogeneous divisor is used for perspective * corrections. */ if (poly->flags & VERT_ST) { v0->st.s = mu0 * V0->st.s + mu1 * V1->st.s; v0->st.t = mu0 * V0->st.t + mu1 * V1->st.t; HPt3LinSumDenorm(mu0, &V0->pt, mu1, &V1->pt, &v0->pt); } else { HPt3LinSum(mu0, &V0->pt, mu1, &V1->pt, &v0->pt); } if (!finite(v0->pt.x + v0->pt.y + v0->pt.z)){ abort(); } if (poly->flags & VERT_C) { CoLinSum(mu0, &V0->vcol, mu1, &V1->vcol, &v0->vcol); } if (true || (poly->flags & VERT_N)) { /* The averaged vertex normals do not have an orientation, so * try to orient them w.r.t. the polygon normal before computing * the linear combination. */ if (Pt3Dot(&V0->vn, &poly->pn)*Pt3Dot(&V1->vn, &poly->pn) < 0) { Pt3Comb(-mu0, &V0->vn, mu1, &V1->vn, &v0->vn); } else { Pt3Comb(mu0, &V0->vn, mu1, &V1->vn, &v0->vn); } Pt3Unit(&v0->vn); } if (fpos(edges[0].scp[0])) { vstart[1] = vend[0] = v0; istart[1] = edges[0].v[1]; iend[0] = edges[0].v[0]; } else { vstart[0] = vend[1] = v0; istart[0] = edges[0].v[1]; iend[1] = edges[0].v[0]; } } /* second point of intersection */ if (fzero(edges[1].scp[0])) { v1 = poly->v[edges[1].v[0]]; if (fpos(edges[1].scp[1])) { istart[0] = edges[1].v[0]; iend[1] = edges[1].v[0]; } else { istart[1] = edges[1].v[0]; iend[0] = edges[1].v[0]; } } else if (fzero(edges[1].scp[1])) { v1 = poly->v[edges[1].v[1]]; if (fpos(edges[1].scp[0])) { istart[1] = edges[1].v[1]; iend[0] = edges[1].v[1]; } else { istart[0] = edges[1].v[1]; iend[1] = edges[1].v[1]; } } else { HPt3Coord mu0, mu1; Vertex *V0 = poly->v[edges[1].v[0]]; Vertex *V1 = poly->v[edges[1].v[1]]; v1 = obstack_alloc(scratch, sizeof(Vertex)); mu0 = edges[1].scp[1]/(edges[1].scp[1]-edges[1].scp[0]); #if 0 mu1 = edges[1].scp[0]/(edges[1].scp[0]-edges[1].scp[1]); #else mu1 = 1.0 - mu0; #endif if (poly->flags & VERT_ST) { v1->st.s = mu0 * V0->st.s + mu1 * V1->st.s; v1->st.t = mu0 * V0->st.t + mu1 * V1->st.t; HPt3LinSumDenorm(mu0, &V0->pt, mu1, &V1->pt, &v1->pt); } else { HPt3LinSum(mu0, &V0->pt, mu1, &V1->pt, &v1->pt); } if (!finite(v1->pt.x + v1->pt.y + v1->pt.z)) abort(); if (poly->flags & VERT_C) { CoLinSum(mu0, &V0->vcol, mu1, &V1->vcol, &v1->vcol); } if (true || (poly->flags & VERT_N)) { if (Pt3Dot(&V0->vn, &poly->pn)*Pt3Dot(&V1->vn, &poly->pn) < 0) { Pt3Comb(-mu0, &V0->vn, mu1, &V1->vn, &v1->vn); } else { Pt3Comb(mu0, &V0->vn, mu1, &V1->vn, &v1->vn); } Pt3Unit(&v1->vn); } if (fpos(edges[1].scp[0])) { vstart[1] = vend[0] = v1; istart[1] = edges[1].v[1]; iend[0] = edges[1].v[0]; } else { vstart[0] = vend[1] = v1; istart[0] = edges[1].v[1]; iend[1] = edges[1].v[0]; } } ListPush(*front, plnode); ListPush(*back, new_poly_list_node(tagged_app, scratch)); if ((poly->flags & POLY_NONFLAT)) { if (!(*front)->pn) { /* Compute the normal on the parent element to avoid numerical * instabilities on increasingly degenerated polygons. */ (*front)->pn = obstack_alloc(scratch, sizeof(Point3)); PolyNormal(poly, (*front)->pn, true /* 4d */, false /* evert */, NULL, NULL); } (*back)->pn = (*front)->pn; } for (i = 0; i < 2; i++) { nv[i] = iend[i] - istart[i] + 1; if (nv[i] < 0) { nv[i] += poly->n_vertices; } nv[i] += (vstart[i] != NULL) + (vend[i] != NULL); } if (poly->flags & POLY_SCRATCH) { savedp = *poly; memcpy(savedv, poly->v, poly->n_vertices*sizeof(Vertex *)); if (nv[0] <= poly->n_vertices) { poly->n_vertices = nv[0]; (*front)->poly = poly; (*back)->poly = new_poly(nv[1], NULL, scratch); } else { if (nv[1] > poly->n_vertices) { abort(); } poly->n_vertices = nv[1]; (*back)->poly = poly; (*front)->poly = new_poly(nv[0], NULL, scratch); } /* Attention: gcc had problems with this code snippet with * -fstrict-aliasing, the "#if 1" stuff seems to work. In the * "#else" version gcc somehow lost the "savedp.v = savedv" * assignment. I think this is a compiler bug. */ poly = &savedp; #if 1 poly->v = savedv; #else savedp.v = savedv; #endif } else { (*front)->poly = new_poly(nv[0], NULL, scratch); (*back)->poly = new_poly(nv[1], NULL, scratch); } for (i = 0; i < 2; i++) { PolyListNode *half = (i == 0) ? *front : *back; int j; vpos = half->poly->v; if (vstart[i] != NULL) { *vpos++ = vstart[i]; } if (istart[i] <= iend[i]) { for (j = istart[i]; j <= iend[i] && j < poly->n_vertices; j++) { *vpos++ = poly->v[j]; } } else { for (j = istart[i]; j < poly->n_vertices; j++) { *vpos++ = poly->v[j]; } for (j = 0; j <= iend[i]; j++) { *vpos++ = poly->v[j]; } } if (vend[i] != NULL) { *vpos++ = vend[i]; } half->poly->pcol = poly->pcol; half->poly->pn = poly->pn; half->poly->flags = poly->flags|POLY_SCRATCH; check_poly(half->poly); } } /* Compute the plane equation for this polygon; copy the normal for * originally flat polygons, really compute it for polygons created by * sub-division from non-flat polygons. */ static inline void PolyPlane(PolyListNode *plnode, HPoint3 *plane) { if (plnode->pn) { *(Point3 *)plane = *plnode->pn; } else if (plnode->poly->flags & POLY_NONFLAT) { /* The polygon actually _IS_ flat -- BSPTreeCreate() is * responsible to make that sure, but we have to compute the * normal ourselves. We do not need to remember the normal because * when this function is called, then plnode has found its "home" * tree-node. */ PolyNormal(plnode->poly, (Point3 *)(void *)plane, true /* fourd */, false /* evert */, NULL, NULL); } else { *(Point3 *)plane = plnode->poly->pn; } plane->w = HPt3DotPt3(&plnode->poly->v[0]->pt, (Point3 *)(void *)plane); } static inline HPt3Coord PlaneDistance(HPoint3 *plane, HPoint3 *v) { HPt3Coord dist; dist = HPt3DotPt3(v, (Point3 *)plane) - plane->w; if (!finite(dist)) { dist = 1e8; /* infinity */ } return dist; } /* Loop over all vertices and determine on which side of the plane * defined by "n" we live, if not on both sides. We assume at this * point that the polygon is _FLAT_. The main entry-point * BSPTreeCreate() has to split polygons such that this is true. Maybe * we will allow for non-convex polygons here, but _FLAT_ is a must. */ static inline PolyPos ClassifyPoly(HPoint3 *plane, Poly *poly, EdgeIntersection edges[2]) { HPt3Coord scp0, scp1 = 0.0, scp2, scp3 = 0.0; PolyPos sign0, sign1 = COPLANAR, sign2, sign3 = COPLANAR; int i, i0, i2; scp0 = PlaneDistance(plane, &poly->v[0]->pt); sign0 = (PolyPos)(fpos(scp0) - fneg(scp0)); if (sign0 == COPLANAR) { for (i = 1; i < poly->n_vertices; i++) { scp1 = PlaneDistance(plane, &poly->v[i]->pt); sign1 = (PolyPos)(fpos(scp1) - fneg(scp1)); if (sign1 != COPLANAR) { break; } scp0 = scp1; sign0 = sign1; } if (i >= 2) { return sign1; } /* at this point: sign0 == 0 and sign1 != 0, loop until we find * the next zero crossing. */ i0 = 0; sign2 = sign1; scp2 = scp1; for (++i; i < poly->n_vertices; i++) { scp3 = PlaneDistance(plane, &poly->v[i]->pt); sign3 = (PolyPos)(fpos(scp3) - fneg(scp3)); if (sign3 != sign2) { break; } scp2 = scp3; sign2 = sign3; } if (i == poly->n_vertices) { return sign1; } /* At this point we have sign0 == 0 != sign1 == sign2 != sign3. If * sign3 == 0, then the next vertex may also be located on the * plane => sign1 == sign2 determine the side we are located on. * * Otherwise sign3 must be != sign1 and we have to sub-divide this * polygon. */ if (sign3 == COPLANAR) { if (i == poly->n_vertices-1) { return sign1; } scp2 = scp3; sign2 = sign3; scp3 = PlaneDistance(plane, &poly->v[++i]->pt); sign3 = (PolyPos)(fpos(scp3) - fneg(scp3)); if (sign3 == COPLANAR) { return sign1; } else if (sign3 == sign1) { /* impossible case with exact arithmetic; this should mean * that we are in the COPLANAR case. Assume that? Or retry * with increased telerance? */ return COPLANAR; /* FIXME */ } } /* At this point we have sign0 == 0 != sign1. sign2 may be 0, then * sign3 != sign1. Or 0 == sign0 != sign1 == sign2 != sign 3. At * any rate we are located on both sides. */ i2 = i-1; } else { /* Loop until we find a change of sign */ for (i = 1; i < poly->n_vertices; i++) { scp1 = PlaneDistance(plane, &poly->v[i]->pt); sign1 = (PolyPos)(fpos(scp1) - fneg(scp1)); if (sign1 != sign0) { break; } scp0 = scp1; sign0 = sign1; } if (i == poly->n_vertices) { return sign1; } i0 = i-1; sign2 = sign1; scp2 = scp1; if (sign2 == COPLANAR) { /* if sign2 is accidentally 0, then the next point must be != 0, * or sign0 determines the proper side. */ ++i; i %= poly->n_vertices; scp3 = PlaneDistance(plane, &poly->v[i]->pt); sign3 = (PolyPos)(fpos(scp3) - fneg(scp3)); if (sign3 == COPLANAR || sign3 == sign0) { return sign0; } scp2 = scp3; sign2 = sign3; } /* loop until we find the next zero crossing, at this point we * have 0 != sign0 != sign1, 0 != sign2 != sign0, the polygon * cannot be on one side of the plane. */ for (++i; i < poly->n_vertices; i++) { scp3 = PlaneDistance(plane, &poly->v[i]->pt); sign3 = (PolyPos)(fpos(scp3) - fneg(scp3)); if (sign3 != sign2) { break; } scp2 = scp3; sign2 = sign3; } if (i == poly->n_vertices) { if (i0 == 0) { scp3 = scp0; sign3 = sign0; } else { scp3 = PlaneDistance(plane, &poly->v[0]->pt); sign3 = (PolyPos)(fpos(scp3) - fneg(scp3)); } } i2 = i-1; } /* points of intersection between [i0,i0+1], [i2,i2+1] */ edges[0].v[0] = i0; edges[0].v[1] = i0+1; edges[0].scp[0] = scp0; edges[0].scp[1] = scp1; edges[1].v[0] = i2; edges[1].v[1] = (i2+1) % poly->n_vertices; edges[1].scp[0] = scp2; edges[1].scp[1] = scp3; return BOTH_SIDES; } static void BSPTreeCreateRecursive(BSPTreeNode *tree, PolyListNode *pllist, #if BSPTREE_STATS int depth, #endif struct obstack *scratch) { PolyListNode *plnode, *front, *back; EdgeIntersection edges[2]; tree->front = tree->back = NULL; ListPop(pllist, plnode); tree->polylist = plnode; check_poly(plnode->poly); PolyPlane(plnode, &tree->plane); front = back = NULL; while (pllist) { ListPop(pllist, plnode); check_poly(plnode->poly); switch (ClassifyPoly(&tree->plane, plnode->poly, edges)) { case BACKOF: check_poly(plnode->poly); ListPush(back, plnode); break; case COPLANAR: check_poly(plnode->poly); ListPush(tree->polylist, plnode); break; case INFRONTOF: check_poly(plnode->poly); ListPush(front, plnode); break; case BOTH_SIDES: check_poly(plnode->poly); SplitPolyNode(plnode, &front, &back, edges, scratch); break; } } if (front) { tree->front = obstack_alloc(scratch, sizeof(*tree->front)); BSPTreeCreateRecursive(tree->front, front, #if BSPTREE_STATS depth+1, #endif scratch); } if (back) { tree->back = obstack_alloc(scratch, sizeof(*tree->back)); BSPTreeCreateRecursive(tree->back, back, #if BSPTREE_STATS depth+1, #endif scratch); } #if BSPTREE_STATS if (depth > tree_depth) { tree_depth = depth; } #endif } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/geom/bsptree.h0000644000175000017500000000323612310110200015470 00000000000000/* Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _GV_BSPTREE_H_ #define _GV_BSPTREE_H_ #include "geom.h" typedef struct BSPTree BSPTree; extern BSPTree *BSPTreeCreate(BSPTree *tree, Geom *object); extern void BSPTreeAddObject(BSPTree *bsp_tree, Geom *object); extern void BSPTreeFinalize(BSPTree *bsp); extern void BSPTreeFree(BSPTree *bsp); extern void BSPTreeFreeTree(const BSPTree *tree); extern void BSPTreeSetAppearance(Geom *object); extern BSPTree *BSPTreeSet(BSPTree *tree, int attr1, ...); /* Geometries attached to INSTs or LISTs can be deleted underneath the * BSP-tree; so INSTs and LISTs must register a callback with their * handles. */ extern void BSPTreeInvalidate(Handle **chp, Ref *unused, BSPTree *tree); /* Attributes for BSPTreeSet */ #define BSPTREE_ONESHOT 42001 #define BSPTREE_END 42999 #endif /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/geom/bsptreeP.h0000644000175000017500000001326312310110200015611 00000000000000/* Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _GV_BSPTREE_P_H_ #define _GV_BSPTREE_P_H_ #include "geomclass.h" #include "nodedata.h" #include "bsptree.h" #include "obstack.h" struct Poly; typedef struct PolyListNode PolyListNode; struct PolyListNode { PolyListNode *next; struct Poly *poly; Point3 *pn; /* If we split a polygon we compute the normal on * the parent to avoid numerical instabilities * caused by increasingly degenerated polygons. */ const void **tagged_app; /* pointer to shared storage for the * return value of mgtagappearance(). */ }; typedef struct BSPTreeNode BSPTreeNode; struct BSPTreeNode { BSPTreeNode *front; BSPTreeNode *back; HPoint3 plane; PolyListNode *polylist; }; struct BSPTree { BSPTreeNode *tree; /* The root of the BSPtree itself */ Geom *geom; /* The top-level Geom we belong to */ bool oneshot; /* Tree is destroyed after drawing; useful * for location/oring != LOCAL INSTs and * during ND-drawing. The oneshot flag is * reset after it took affect. */ PolyListNode *init_lpl; /* While tree == NULL elements can be * added to this list */ TransformPtr Tid; /* INST support: to support absolute * positioning (location and origin != * LOCAL) we need the position of the * top-level geometry (the one who owns the * tree, i.e. tree->geom). */ TransformPtr Tidinv; /* Inverse of Tid, only computed on demand */ TransformPtr T; /* INST support: transform polygons during * tree generation, i.e. before adding * them to init_lpl. */ Transform Tdual; /* We need the dual of T to transform the normals * correctly ( y^t x = 0 <=> y^t T T^{-tr}x = 0). */ TransformPtr TxT; /* texture transform */ const void **tagged_app; struct obstack obst; /* Scratch space for new polygons etc */ }; /* if we have an appearance (but no handle to an appearance ) which * overrides the transparency flag to false _or_ a material which * overrides the alpha value to 1.0 (and no own color spec with alpha * != 1.0) then we need not add ourselves to the BSP-tree: no facet of * this Geom will ever be translucent. * * This does, of course, not work with INSTs or LISTs, but only with * "atomic" Geom's */ static inline bool never_translucent(Geom *geom) { Appearance *ap = geom->ap; return (ap && !geom->aphandle && (((ap->override & APF_FACEDRAW) && (ap->flag & APF_FACEDRAW) == 0) || ((ap->override & APF_TRANSP) && (ap->flag & APF_TRANSP) == 0) || ((geom->geomflags & COLOR_ALPHA) == 0 && ap->mat && (ap->mat->override & MTF_ALPHA) && ap->mat->diffuse.a == 1.0))); } /* Load the current transform form the MG-layer into tree->Tid */ static inline void BSPTreeSetId(BSPTree *tree) { Transform T; if (tree->geom == NULL || tree != tree->geom->bsptree) { abort(); } /* make sure the top-level geom has per-node data */ GeomNodeDataCreate(tree->geom, NULL); mggettransform(T); if (memcmp(T, TM_IDENTITY, sizeof(Transform)) != 0) { tree->Tid = obstack_alloc(&tree->obst, sizeof(Transform)); TmCopy(T, tree->Tid); } else { tree->Tid = TM_IDENTITY; } tree->Tidinv = NULL; } static inline const void **BSPTreePushAppearance(BSPTree *bsptree, Geom *geom) { NodeData *data = GeomNodeDataCreate(geom, NULL); const void **tagged_app = bsptree->tagged_app; bsptree->tagged_app = &data->tagged_ap; return tagged_app; } static inline void BSPTreePopAppearance(BSPTree *bsptree, const void **old_tagged_app) { if (bsptree != NULL && old_tagged_app != NULL) { bsptree->tagged_app = old_tagged_app; } } static inline TransformPtr BSPTreePushTransform(BSPTree *tree, TransformPtr T) { TransformPtr old_T; if (tree != NULL) { old_T = tree->T; tree->T = T; if (T != TM_IDENTITY) { TmDual(T, tree->Tdual); } return old_T; } else { return TM_IDENTITY; } } static inline void BSPTreeSetTransform(BSPTree *tree, TransformPtr T) { if (tree != NULL) { tree->T = T; if (T != TM_IDENTITY) { TmDual(T, tree->Tdual); } } } static inline void BSPTreePopTransform(BSPTree *tree, TransformPtr old_T) { if (tree != NULL) { tree->T = old_T; if (old_T != TM_IDENTITY) { TmDual(old_T, tree->Tdual); } } } static inline TransformPtr BSPTreePushTxTransform(BSPTree *tree, TransformPtr T) { TransformPtr old_TxT; if (tree != NULL) { old_TxT = tree->TxT; tree->TxT = T; return old_TxT; } else { return TM_IDENTITY; } } static inline void BSPTreeSetTxTransform(BSPTree *tree, TransformPtr T) { if (tree != NULL) { tree->TxT = T; } } static inline void BSPTreePopTxTransform(BSPTree *tree, TransformPtr old_T) { if (tree != NULL) { tree->TxT = old_T; } } #endif /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/geom/nodedata.h0000644000175000017500000000773212310110200015610 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _GV_NODEDATA_H_ #define _GV_NODEDATA_H_ #include "geomclass.h" #include "mg.h" /* A geometry hierarchy may refer aribitrarily often to the same * Geometry object via "Handle" references. In some cases, however, we * need data which is attached to a node in the hierarchy tree. For * the time being the only case is the "tagged apperance" handle used * to refer to appearances out of BSPTree nodes. * * "path" is a unique tag and is computed during hierarchy * traversal. 'L' stands for a list element, 'I' for Inst. * * L -> (L) -> nil * | | * G1 I * | * G2 * * The leaf-nodes of the hierarchy will have the paths "L" and * "LI". This should be a unique id for earch hierarchy node, because * it records the history of the path through the hierarchy to the * node. Only the head of a list is included in the path, so the * second id is "LI" and not "LLI" in the example above. */ typedef struct NodeData { DblListNode node; /* Link into Geom->pernode */ char *ppath; /* The path to this geom in the hierarchy (copy).*/ const void *tagged_ap; /* tagged appearance pointer */ const BSPTree *node_tree; /* BSP-tree we belong to, if any */ } NodeData; #define GeomMakePath(geom, c, path, pathlen) \ int pathlen = (geom)->ppathlen+1; \ char *path = alloca(pathlen+1); \ \ memcpy(path, (geom)->ppath, (geom)->ppathlen); \ path[pathlen-1] = c; \ path[pathlen] = '\0' /* Transfer one Geom's per-node data to another Geom. Priamrily meant * as hack during ND-drawing */ static inline void GeomNodeDataMove(Geom *from, Geom *to) { DblListMove(&from->pernode, &to->pernode); to->ppath = from->ppath; to->ppathlen = from->ppathlen; } static inline NodeData *GeomNodeDataByPath(Geom *geom, const char *ppath) { NodeData *pos; if (!ppath) { ppath = geom->ppath ? geom->ppath : ""; } DblListIterateNoDelete(&geom->pernode, NodeData, node, pos) { if (strcmp(pos->ppath, ppath) == 0) { return pos; } } return NULL; } extern DEF_FREELIST(NodeData); static inline NodeData *GeomNodeDataCreate(Geom *geom, const char *ppath) { NodeData *data; if (!ppath) { ppath = geom->ppath ? geom->ppath : ""; } data = GeomNodeDataByPath(geom, ppath); if (data == NULL) { FREELIST_NEW(NodeData, data); data->ppath = strdup(ppath); data->tagged_ap = NULL; data->node_tree = NULL; DblListAdd(&geom->pernode, &data->node); } return data; } static inline void GeomNodeDataPrune(Geom *geom) { NodeData *data, *data_next; DblListIterate(&geom->pernode, NodeData, node, data, data_next) { DblListDelete(&data->node); if (data->tagged_ap) { mguntagappearance(data->tagged_ap); } if (data->node_tree) { BSPTreeFreeTree(data->node_tree); } if (data->ppath) { free(data->ppath); data->ppath = NULL; } FREELIST_FREE(NodeData, data); } } static inline void NodeDataFreeListPrune(void) { FreeListNode *old; size_t size = 0; while (NodeDataFreeList) { old = NodeDataFreeList; NodeDataFreeList = old->next; OOGLFree(old); size += sizeof(NodeData); } OOGLWarn("Freed %ld bytes.\n", size); } #endif geomview-1.9.5/src/lib/gprim/geom/Headers0000644000175000017500000000013012310110200015137 00000000000000geom.h geomclass.h geomclass_sm.h pick.h pickP.h vert.h bsptree.h bsptreeP.h nodedata.h geomview-1.9.5/src/lib/gprim/inst/0000755000175000017500000000000012310165602013775 500000000000000geomview-1.9.5/src/lib/gprim/inst/Makefile.in0000644000175000017500000004714512310165554016003 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/inst DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libinst_la_LIBADD = am_libinst_la_OBJECTS = instbound.lo instclass.lo instcreate.lo \ instdraw.lo instmisc.lo instpick.lo instsphere.lo \ inststream.lo libinst_la_OBJECTS = $(am_libinst_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libinst_la_SOURCES) DIST_SOURCES = $(libinst_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libinst.la libinst_la_SOURCES = \ instbound.c instclass.c instcreate.c instdraw.c instmisc.c instpick.c instsphere.c inststream.c \ inst.h instP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/inst/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/inst/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libinst.la: $(libinst_la_OBJECTS) $(libinst_la_DEPENDENCIES) $(EXTRA_libinst_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libinst_la_OBJECTS) $(libinst_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/instbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/instclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/instcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/instdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/instmisc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/instpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/instsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inststream.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/inst/Makefile.am0000644000175000017500000000034612310110200015734 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libinst.la libinst_la_SOURCES = \ instbound.c instclass.c instcreate.c instdraw.c instmisc.c instpick.c instsphere.c inststream.c \ inst.h instP.h geomview-1.9.5/src/lib/gprim/inst/instbound.c0000644000175000017500000000720312310110200016050 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Compute bounding box of an Inst */ #include "instP.h" BBox * InstBound(Inst *inst, Transform T, TransformN *TN) { BBox *geombbox; Transform Tnew; GeomIter *it; if( inst == NULL || inst->geom == NULL) return NULL; /* Insts which tie themselves to particular locations have no * bounding box, either. */ if( inst->location > L_LOCAL || inst->origin > L_LOCAL ) return NULL; /* FIXME: if inst->NDaxis != NULL and/or TN != NULL we have to do * something here. * * If TN != NULL, then Tnew should be prepended to TN w.r.t. to * the default x,y,z space (because this is the way we interprete * 3d objects in Nd). * * GeomIterate() should not be necessary in this case; MMmh. */ if (inst->NDaxis == NULL) { if (T == NULL) T = TM_IDENTITY; if (TN == NULL) { it = GeomIterate( (Geom *)inst, DEEP ); geombbox = NULL; while(NextTransform(it, Tnew) > 0) { BBox *box; TmConcat( Tnew, T, Tnew ); if((box = (BBox *)GeomBound( inst->geom, Tnew, NULL)) != NULL) { if(geombbox) { BBoxUnion3(geombbox, box, geombbox); GeomDelete((Geom *)box); } else geombbox = box; } } } else { TransformN *TnewN = TmNCopy(TN, NULL); static int dflt_axes[] = { 1, 2, 3, 0 }; it = GeomIterate( (Geom *)inst, DEEP ); geombbox = NULL; while(NextTransform(it, Tnew) > 0) { BBox *box; TmNCopy(TN, TnewN); TmNApplyT3TN(Tnew, dflt_axes, TnewN); if((box = (BBox *)GeomBound( inst->geom, NULL, TnewN)) != NULL) { if(geombbox) { BBoxUnion3(geombbox, box, geombbox); GeomDelete((Geom *)box); } else geombbox = box; } } TmNDelete(TnewN); } } else { /* we do not support ND-TLISTs yet, so we assume here that we have * only one ND-transformation, hence we do not call GeomIterate() * here. */ if (TN) { TransformN *TnewN; TnewN = TmNConcat(inst->NDaxis, TN, NULL); geombbox = (BBox *)GeomBound(inst->geom, NULL, TnewN); TmNDelete(TnewN); } else if (T) { TransformN *TnewN = TmNCopy(inst->NDaxis, NULL); static int dflt_axes[] = { 1, 2, 3, 0 }; BBox *box; TmNApplyDN(TnewN, dflt_axes, T); box = (BBox *)GeomBound(inst->geom, NULL, TnewN); geombbox = (BBox *)GeomBound((Geom *)box, TM_IDENTITY, NULL); GeomDelete((Geom *)box); TmNDelete(TnewN); } else { geombbox = (BBox *)GeomBound(inst->geom, NULL, inst->NDaxis); } } return geombbox; } geomview-1.9.5/src/lib/gprim/inst/instclass.c0000644000175000017500000000507212310110200016050 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "instP.h" #include "pick.h" GeomClass *InstClass = NULL; int InstPresent = 1; static char instName[] = "inst"; char * InstName() { return instName; } extern Geom *InstPick( Geom *, Pick *, Appearance *, Transform ); extern GeomScanFunc InstHandleScan; GeomClass * InstMethods() { if( !InstClass ) { InstClass = GeomClassCreate(instName); InstClass->name = InstName; InstClass->methods = (GeomMethodsFunc *)InstMethods; InstClass->create = (GeomCreateFunc *)InstCreate; InstClass->Delete = (GeomDeleteFunc *)InstDelete; InstClass->copy = (GeomCopyFunc *)InstCopy; InstClass->bound = (GeomBoundFunc *)InstBound; InstClass->boundsphere = (GeomBoundSphereFunc *)InstBoundSphere; InstClass->evert = (GeomEvertFunc *)InstEvert; InstClass->dice = (GeomDiceFunc *)InstDice; InstClass->position = (GeomPositionFunc *)InstPosition; InstClass->transformto = (GeomTransformToFunc *)InstTransformTo; InstClass->transform = (GeomTransformFunc *)InstTransform; InstClass->pick = (GeomPickFunc *)InstPick; InstClass->draw = (GeomDrawFunc *)InstDraw; InstClass->bsptree = (GeomBSPTreeFunc *)InstBSPTree; InstClass->replace = (GeomReplaceFunc *)InstReplace; InstClass->get = (GeomGetFunc *)InstGet; InstClass->scan = (GeomScanFunc *)InstHandleScan; InstClass->import = InstImport; InstClass->export = (GeomExportFunc *)InstExport; } return InstClass; } geomview-1.9.5/src/lib/gprim/inst/instcreate.c0000644000175000017500000001742212310110200016210 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Inst creation, editing, retrieval and deletion. */ #include "instP.h" #include "transobj.h" #include "ntransobj.h" #include "freelist.h" #include "nodedata.h" void InstDelete(Inst *inst) { if (inst) { if (inst->geomhandle) HandlePDelete(&inst->geomhandle); if (inst->geom) GeomDelete(inst->geom); if (inst->tlisthandle) HandlePDelete(&inst->tlisthandle); if (inst->tlist) GeomDelete(inst->tlist); if (inst->txtlisthandle) HandlePDelete(&inst->txtlisthandle); if (inst->txtlist) GeomDelete(inst->txtlist); if (inst->axishandle) HandlePDelete(&inst->axishandle); if (inst->NDaxishandle) HandlePDelete(&inst->NDaxishandle); if (inst->NDaxis) NTransDelete(inst->NDaxis); } } Inst *InstCopy(Inst *inst) { Inst *ni; ni = OOGLNewE(Inst, "InstCopy: Inst"); GGeomInit(ni, inst->Class, inst->magic, NULL); TmCopy(inst->axis, ni->axis); if (inst->NDaxis) { ni->NDaxis = NTransCreate(inst->NDaxis); } ni->geom = GeomCopy(inst->geom); ni->geomhandle = NULL; ni->tlist = GeomCopy(inst->tlist); ni->tlisthandle = NULL; ni->txtlist = GeomCopy(inst->txtlist); ni->txtlisthandle = NULL; ni->axishandle = NULL; ni->NDaxishandle = NULL; ni->geomflags = inst->geomflags; ni->location = inst->location; ni->origin = inst->origin; ni->originpt = inst->originpt; return ni; } Geom *InstReplace(Inst *inst, Geom *geom) { Geom *old; if(inst == NULL) return NULL; old = inst->geom; inst->geom = geom; return old; } int InstGet(Inst *inst, int attr, void *attrp) { switch(attr) { case CR_GEOM: *(Geom **)attrp = inst->geom; break; case CR_GEOMHANDLE: *(Handle **)attrp = inst->geomhandle; break; case CR_TLIST: *(Geom **)attrp = inst->tlist; break; case CR_TLISTHANDLE: *(Geom **)attrp = (Geom *)inst->tlisthandle; break; case CR_TXTLIST: *(Geom **)attrp = inst->txtlist; break; case CR_TXTLISTHANDLE: *(Geom **)attrp = (Geom *)inst->txtlisthandle; break; case CR_NDAXISHANDLE: *(Handle **)attrp = inst->NDaxishandle; break; case CR_NDAXIS: *(TransformN **)attrp = inst->NDaxis; break; case CR_AXISHANDLE: *(Handle **)attrp = inst->axishandle; break; case CR_AXIS: TmCopy(inst->axis, (void *)attrp); return (inst->tlist == NULL && inst->tlisthandle == NULL) ? 1 : 0; case CR_LOCATION: *(int *)attrp = inst->location; break; default: return -1; } return 1; } Inst *InstCreate(Inst *exist, GeomClass *classp, va_list *a_list) { Inst *inst; int attr; int copy = 1; TransformPtr t; TransformN *nt; Geom *g; Handle *h; bool tree_changed = false; if (exist == NULL) { inst = OOGLNewE(Inst, "InstCreate inst"); GGeomInit (inst, classp, INSTMAGIC, NULL); TmIdentity(inst->axis); inst->NDaxis = NULL; inst->geomhandle = NULL; inst->geom = NULL; inst->tlisthandle = NULL; inst->tlist = NULL; inst->txtlisthandle = NULL; inst->txtlist = NULL; inst->axishandle = NULL; inst->NDaxishandle = NULL; inst->location = L_NONE; inst->origin = L_NONE; } else { /* Check that exist is an inst. */ inst = exist; } while ((attr = va_arg (*a_list, int))) { switch(attr) { case CR_GEOMHANDLE: h = va_arg(*a_list, Handle *); if (copy) { REFINCR(h); } if (inst->geomhandle) { HandlePDelete(&inst->geomhandle); } inst->geomhandle = h; HandleRegister(&inst->geomhandle, (Ref *)inst, &inst->geom, HandleUpdRef); tree_changed = true; break; case CR_HANDLE_GEOM: h = va_arg(*a_list, Handle *); g = va_arg(*a_list, Geom *); if (copy) { REFINCR(h); REFINCR(g); } if (inst->geomhandle) { HandlePDelete(&inst->geomhandle); } if (inst->geom) { GeomDelete(inst->geom); } inst->geomhandle = h; inst->geom = g; if (h) { HandleRegister(&inst->geomhandle, (Ref *)inst, &inst->geom, HandleUpdRef); HandleSetObject(inst->geomhandle, (Ref *)g); } tree_changed = true; break; case CR_GEOM: g = va_arg(*a_list, Geom *); if (copy) { REFINCR(g); } if (inst->geom) { GeomDelete(inst->geom); } inst->geom = g; if (inst->geomhandle) { HandlePDelete(&inst->geomhandle); } tree_changed = true; break; case CR_AXIS: t = va_arg(*a_list, TransformPtr); InstTransformTo(inst, t, NULL); tree_changed = true; break; case CR_NDAXIS: nt = va_arg(*a_list, TransformN *); InstTransformTo(inst, NULL, nt); tree_changed = true; break; case CR_AXISHANDLE: h = va_arg(*a_list, Handle *); if (copy) { REFINCR(h); } if (inst->axishandle) { HandlePDelete(&inst->axishandle); } inst->axishandle = h; if (h) { HandleRegister(&inst->axishandle, (Ref *)inst, inst->axis, TransUpdate); } tree_changed = true; break; case CR_NDAXISHANDLE: h = va_arg(*a_list, Handle *); if(copy) { REFINCR(h); } if(inst->NDaxishandle) { HandlePDelete(&inst->NDaxishandle); } inst->NDaxishandle = h; HandleRegister(&inst->NDaxishandle, (Ref *)inst, &inst->NDaxis, HandleUpdRef); tree_changed = true; break; case CR_TLIST: g = va_arg (*a_list, Geom *); if(copy) { REFINCR(g); } if(inst->tlist) { GeomDelete(inst->tlist); } inst->tlist = g; tree_changed = true; break; case CR_TLISTHANDLE: h = va_arg(*a_list, Handle *); if(copy) { REFINCR(h); } if(inst->tlisthandle != NULL) { HandlePDelete(&inst->tlisthandle); } inst->tlisthandle = h; HandleRegister(&inst->tlisthandle, (Ref *)inst, &inst->tlist, HandleUpdRef); tree_changed = true; break; case CR_TXTLIST: g = va_arg (*a_list, Geom *); if(copy) { REFINCR(g); } if(inst->txtlist) { GeomDelete(inst->txtlist); } inst->txtlist = g; break; case CR_TXTLISTHANDLE: h = va_arg(*a_list, Handle *); if(copy) { REFINCR(h); } if(inst->txtlisthandle != NULL) { HandlePDelete(&inst->txtlisthandle); } inst->txtlisthandle = h; HandleRegister(&inst->txtlisthandle, (Ref *)inst, &inst->txtlist, HandleUpdRef); break; case CR_LOCATION: inst->location = va_arg(*a_list, int); break; default: if(GeomDecorate(inst, ©, attr, a_list)) { OOGLError (0, "InstCreate: Undefined option: %d", attr); if(exist == NULL) { GeomDelete ((Geom *)inst); } return NULL; } } } if (tree_changed) { GeomNodeDataPrune((Geom *)inst); } return inst; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/inst/instdraw.c0000644000175000017500000002452212310110200015701 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Draw an Inst using the mg library. */ #include "instP.h" #include "mgP.h" #include "bsptreeP.h" static inline TmCoord (*coords2W(int system, TransformPtr T))[4] { WnPosition vp; static Transform Tndc; switch(system) { case L_GLOBAL: return TM3_IDENTITY; case L_CAMERA: return _mgc->C2W; case L_SCREEN: return _mgc->S2W; case L_NDC: WnGet(_mgc->win, WN_VIEWPORT, &vp); TmScale(Tndc, .5*(vp.xmax-vp.xmin+1), .5*(vp.ymax-vp.ymin+1), 1.0); CtmTranslate(Tndc, 1.0, 1.0, 0.0); TmConcat(Tndc, _mgc->S2W, Tndc); return Tndc; default: return T; /* Default is local coords: obj->world */ } } static inline TmCoord (*coordsto(int from, int to, TransformPtr T, TransformPtr Tinv))[4] { WnPosition vp; static Transform Tmap; if(from == L_NONE) from = L_LOCAL; if(to == L_NONE) to = L_LOCAL; if(from == to) return TM3_IDENTITY; switch(to) { case L_GLOBAL: return coords2W(from, T); case L_LOCAL: if(!(_mgc->has & HAS_S2O)) mg_findS2O(); switch(from) { case L_GLOBAL: return Tinv; /* W2O */ case L_SCREEN: return _mgc->S2O; } break; case L_SCREEN: switch(from) { case L_GLOBAL: return _mgc->W2S; case L_LOCAL: if(!(_mgc->has & HAS_S2O)) mg_findS2O(); return _mgc->O2S; case L_NDC: WnGet(_mgc->win, WN_VIEWPORT, &vp); TmScale(Tmap, .5*(vp.xmax-vp.xmin+1), .5*(vp.ymax-vp.ymin+1), 1.0); CtmTranslate(Tmap, 1.0, 1.0, 0.0); return Tmap; } break; case L_CAMERA: if(from == L_GLOBAL) return _mgc->W2C; break; case L_NDC: switch(from) { case L_GLOBAL: TmConcat(_mgc->W2S, coordsto(L_SCREEN, L_NDC, T, Tinv), Tmap); return Tmap; case L_SCREEN: WnGet(_mgc->win, WN_VIEWPORT, &vp); TmTranslate(Tmap, -1.0, -1.0, 0.0); CtmScale(Tmap, 2.0/(vp.xmax-vp.xmin+1), 2.0/(vp.ymax-vp.ymin+1), 1.0); return Tmap; } break; default: OOGLError(1, "InstDraw: internal error: unknown coord system 0x%x in coordsto(0x%x, 0x%x)", to, from, to); return TM3_IDENTITY; } /* It's safe to call both of these, since coords2W() can never return Tmap. */ TmConcat(coords2W(from, T), coordsto(L_GLOBAL, to, T, Tinv), Tmap); return Tmap; } Inst *InstDraw(Inst *inst) { GeomIter *it, *txit = NULL; Transform T, tT, Tl2o, Ttx; mgNDctx *NDctx = NULL; void *saved_ctx; GeomMakePath(inst, 'I', path, pathlen); if (inst->geom == NULL) { return inst; } inst->geom->ppath = path; inst->geom->ppathlen = pathlen; inst->geomflags &= ~GEOM_ALPHA; mgctxget(MG_NDCTX, &NDctx); if (NDctx) { if (inst->location > L_LOCAL) { /* temporarily disable ND-drawing, makes sense only for * L_LOCAL, really. The universe is 3d in Geomview, in * some sense. */ mgctxset(MG_NDCTX, NULL, MG_END); } else if (inst->origin != L_NONE) { static int was_here; if (!was_here) OOGLError(1, "FIXME: don't know how to handle origin != L_LOCAL " "with ND-drawing.\n"); return NULL; } else { if (inst->NDaxis) { saved_ctx = NDctx->saveCTX(NDctx); NDctx->pushTN(NDctx, inst->NDaxis); GeomDraw(inst->geom); NDctx->restoreCTX(NDctx, saved_ctx); } else { it = GeomIterate((Geom *)inst, DEEP); txit = GeomIterate((Geom *)inst->txtlist, DEEP); while (NextTransform(it, T)) { if (!NextTransform(txit, Ttx)) { txit = NULL; } else { mgpushtxtransform(); mgtxtransform(Ttx); } saved_ctx = NDctx->saveCTX(NDctx); NDctx->pushT(NDctx, T); GeomDraw(inst->geom); NDctx->restoreCTX(NDctx, saved_ctx); if (txit != NULL) { mgpoptxtransform(); } } } if (inst->geom->geomflags & GEOM_ALPHA) { inst->geomflags |= GEOM_ALPHA; } return inst; } } it = GeomIterate((Geom *)inst, DEEP); txit = GeomIterate((Geom *)inst->txtlist, DEEP); while (NextTransform(it, T)) { mgpushtransform(); if (!NextTransform(txit, Ttx)) { txit = NULL; } else { mgpushtxtransform(); mgtxtransform(Ttx); } /* Compute origin *before* changing mg tfm */ if (inst->origin != L_NONE) { Point3 originwas, delta; TmCoord (*l2o)[4], (*o2W)[4]; static HPoint3 zero = { 0, 0, 0, 1 }; /* We have location2W, origin2W. We want to translate * in 'origin' coords such that (0,0,0) in location * coords maps to originpt in origin coords. */ o2W = coords2W(inst->origin, _mgc->xstk->T); l2o = coordsto(inst->location, inst->origin, _mgc->xstk->T, _mgc->xstk->Tinv); HPt3TransPt3(l2o, &zero, &originwas); Pt3Sub(&inst->originpt, &originwas, &delta); TmTranslate(tT, delta.x, delta.y, delta.z); TmConcat(l2o, tT, Tl2o); TmConcat(T, Tl2o, tT); TmConcat(tT, o2W, T); mgsettransform(T); } else if (inst->location > L_LOCAL) { TmConcat(T, coords2W(inst->location, _mgc->xstk->T), T); mgsettransform(T); } else { mgtransform(T); } GeomDraw(inst->geom); mgpoptransform(); if (txit != NULL) { mgpoptxtransform(); } } if(NDctx) { /* restore the ND-context, also: if we have a BSP-tree, then we * need to add our object to the tree, because GeomBSPTreeDraw() * does not do so for ND drawing. */ if (NDctx->bsptree != NULL && (inst->geom->geomflags & GEOM_ALPHA)) { GeomBSPTree((Geom *)inst, NDctx->bsptree, BSPTREE_ADDGEOM); } mgctxset(MG_NDCTX, NDctx, MG_END); } if (inst->geom->geomflags & GEOM_ALPHA) { inst->geomflags |= GEOM_ALPHA; } return inst; } Inst *InstBSPTree(Inst *inst, BSPTree *bsptree, int action) { TransformPtr oldT, oldTxT; GeomIter *it, *txit; Transform T, tT, Tl2o, TxT; Transform oldTinv; if (inst->geom) { GeomMakePath(inst, 'I', path, pathlen); inst->geom->ppath = path; inst->geom->ppathlen = pathlen; } /* No need to loop over all transforms unless action == BSPTREE_ADDGEOM */ switch (action) { case BSPTREE_CREATE: GeomBSPTree(inst->geom, bsptree, action); HandleRegister(&inst->geomhandle, (Ref *)inst, bsptree, BSPTreeInvalidate); HandleRegister(&inst->tlisthandle, (Ref *)inst, bsptree, BSPTreeInvalidate); HandleRegister(&inst->axishandle, (Ref *)inst, bsptree, BSPTreeInvalidate); HandleRegister(&inst->NDaxishandle, (Ref *)inst, bsptree, BSPTreeInvalidate); return inst; case BSPTREE_DELETE: /* unregister any pending callback */ HandleUnregisterJust(&inst->geomhandle, (Ref *)inst, bsptree, BSPTreeInvalidate); HandleUnregisterJust(&inst->tlisthandle, (Ref *)inst, bsptree, BSPTreeInvalidate); HandleUnregisterJust(&inst->axishandle, (Ref *)inst, bsptree, BSPTreeInvalidate); HandleUnregisterJust(&inst->NDaxishandle, (Ref *)inst, bsptree, BSPTreeInvalidate); GeomBSPTree(inst->geom, bsptree, action); return inst; case BSPTREE_ADDGEOM: if (inst->NDaxis) { /* No need to add to the BSPTree here, will be handled by the * various draw_projected_BLAH() stuff. */ return inst; } if ((inst->origin != L_NONE || inst->location > L_LOCAL)) { BSPTreeSet(bsptree, BSPTREE_ONESHOT, true, BSPTREE_END); if (bsptree->Tidinv == NULL) { if (bsptree->Tid != TM_IDENTITY) { bsptree->Tidinv = obstack_alloc(&bsptree->obst, sizeof(Transform)); TmInvert(bsptree->Tid, bsptree->Tidinv); } else { bsptree->Tidinv = TM_IDENTITY; } } } oldT = BSPTreePushTransform(bsptree, TM_IDENTITY); oldTxT = BSPTreePushTxTransform(bsptree, TM_IDENTITY); if (inst->origin != L_NONE) { TmInvert(oldT, oldTinv); } it = GeomIterate((Geom *)inst, DEEP); txit = GeomIterate((Geom *)inst->txtlist, DEEP); while (NextTransform(it, T)) { /* Compute origin *before* changing mg tfm */ if (inst->origin != L_NONE) { Point3 originwas, delta; TmCoord (*l2o)[4], (*o2W)[4]; static HPoint3 zero = { 0, 0, 0, 1 }; /* We have location2W, origin2W. We want to translate * in 'origin' coords such that (0,0,0) in location * coords maps to originpt in origin coords. */ o2W = coords2W(inst->origin, oldT); l2o = coordsto(inst->location, inst->origin, oldT, oldTinv); HPt3TransPt3(l2o, &zero, &originwas); Pt3Sub(&inst->originpt, &originwas, &delta); TmTranslate(tT, delta.x, delta.y, delta.z); TmConcat(l2o, tT, Tl2o); TmConcat(T, Tl2o, tT); TmConcat(tT, o2W, T); /* finally concat with tree->Tid^{-1} to get the correct * absolute positioning. */ if (inst->location > L_LOCAL) { if (bsptree->Tid != TM_IDENTITY) { TmConcat(T, bsptree->Tidinv, T); } } } else if (inst->location > L_LOCAL) { TmConcat(T, coords2W(inst->location, oldT), T); if (bsptree->Tid != TM_IDENTITY) { TmConcat(T, bsptree->Tidinv, T); } } else { TmConcat(T, oldT, T); } BSPTreeSetTransform(bsptree, T); if (!NextTransform(txit, TxT)) { txit = NULL; } else { TmConcat(TxT, oldTxT, TxT); BSPTreeSetTxTransform(bsptree, TxT); } GeomBSPTree(inst->geom, bsptree, action); } BSPTreePopTxTransform(bsptree, oldT); BSPTreePopTransform(bsptree, oldT); return inst; default: return NULL; } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/inst/instmisc.c0000644000175000017500000001061512310110200015675 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "instP.h" #include "tlistP.h" #include "ntransobj.h" Inst * InstDice( Inst *inst, int nu, int nv ) { GeomDice(inst->geom, nu, nv); return inst; } Inst * InstEvert( Inst *inst ) { GeomEvert( inst->geom ); return inst; } void InstHandleScan( Inst *inst, int (*func)(), void *arg ) { if(inst == NULL) return; if(inst->axishandle) (*func)(&inst->axishandle, inst, arg); if(inst->tlisthandle) (*func)(&inst->tlisthandle, inst, arg); if(inst->geomhandle) (*func)(&inst->geomhandle, inst, arg); if(inst->geom) GeomHandleScan(inst->geom, func, arg); if(inst->tlist) GeomHandleScan(inst->tlist, func, arg); } Inst *InstPosition(Inst *inst, Transform T) { GeomIter *it; it = GeomIterate((Geom *)inst, DEEP); if(NextTransform(it, T) > 0) { if(NextTransform(it, T) == 0) return inst; DestroyIter(it); return NULL; /* Error -- InstPosition on a multi-element inst */ } return NULL; /* Bizarre but possible -- no transforms at all */ } /* * Force a single transform equal to T. * We discard any tlist/tlisthandle and just assign to axis. * * Note: setting T leaves any installed TN alone, setting TN lets T * settings alone. */ Inst * InstTransformTo(Inst *inst, Transform T, TransformN *TN) { if(inst->tlist) { GeomDelete(inst->tlist); inst->tlist = NULL; } if(inst->tlisthandle) { HandlePDelete(&inst->tlisthandle); inst->tlisthandle = NULL; } if (T && inst->axishandle) { HandlePDelete(&inst->axishandle); inst->axishandle = NULL; } if (TN && inst->NDaxishandle) { HandlePDelete(&inst->NDaxishandle); inst->NDaxishandle = NULL; } if (TN) { if (inst->NDaxis && RefCount((Ref *)inst->NDaxis) > 1) { NTransDelete(inst->NDaxis); inst->NDaxis = NULL; } inst->NDaxis = TmNCopy(TN, inst->NDaxis); } else { if (0 && inst->NDaxis) { NTransDelete(inst->NDaxis); inst->NDaxis = NULL; } TmCopy(T ? T : TM_IDENTITY, inst->axis); } return inst; } /* * Postmultiply inst by transform T. Tricky: * - If this is a simple inst, just apply transform to axis. * - Otherwise, if leading node of tlist is an unshared, single-element TList, * multiply our transform into its matrix. * - Failing that, insert a single-element TList as top of hierarchy. */ Inst * InstTransform(Inst *inst, Transform T, TransformN *TN) { Tlist *tl; if (TN == NULL && (T == NULL || T == TM_IDENTITY)) { return inst; } if (inst->tlist == NULL && inst->tlisthandle == NULL) { if (TN) { if (inst->NDaxis) { TmNConcat(inst->NDaxis, TN, inst->NDaxis); } else { inst->NDaxis = TmNCopy(TN, NULL); } } else { TmConcat(inst->axis, T, inst->axis); } } else if (TN == NULL) { tl = (Tlist *)inst->tlist; if(tl != NULL && tl->Class == TlistClass && tl->nelements == 1 && tl->ref_count == 1) { TmConcat( tl->elements[0], T, tl->elements[0] ); } else { inst->tlist = GeomCCreate(NULL, TlistMethods(), CR_NELEM, 1, CR_ELEM, T, CR_HANDLE_GEOM, inst->tlisthandle, tl, CR_END); GeomDelete((Geom *)tl); /* tl now belongs to the new Tlist */ inst->tlisthandle = NULL; } } return inst; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/inst/instpick.c0000644000175000017500000001072012310110200015665 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include "instP.h" #include "ooglutil.h" #include "pickP.h" static TmCoord (*coords2NDC(int system, Pick *p, Transform Tl2n))[4] { switch(system) { case L_CAMERA: return p->Tc2n; case L_NDC: return TM3_IDENTITY; case L_SCREEN: return p->Ts2n; case L_GLOBAL: return p->Tw2n; default: return Tl2n; } } static TmCoord (*coordsbtwn(int from, int to, Pick *p, Transform Tl2n))[4] { static Transform Tmap; if(from == L_NONE) from = L_LOCAL; if(to == L_NONE) to = L_LOCAL; if(from == to) return TM3_IDENTITY; if(to == L_NDC) return coords2NDC(from, p, Tl2n); TmInvert( coords2NDC(to, p, Tl2n), Tmap ); TmConcat( coords2NDC(from, p, Tl2n), Tmap, Tmap ); return Tmap; } Geom * InstPick(Inst *inst, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { int elem = 0, pathInd; Transform tT; GeomIter *it; Geom *v = NULL; if(inst == NULL || inst->geom == NULL) return NULL; if (TN && inst->origin != L_NONE) { static int was_here; if (!was_here) OOGLError(1, "FIXME: \"origin\" unsupported int ND-context.\n"); return NULL; } if (inst->NDaxis) { TransformN *tT; if (TN) { pathInd = VVCOUNT(p->gcur); vvneeds(&p->gcur, pathInd + 1); *VVINDEX(p->gcur, int, pathInd) = elem; tT = TmNConcat(inst->NDaxis, TN, NULL); if (GeomPick(inst->geom, p, ap, NULL, tT, axes)) v = (Geom *)inst; TmNDelete(tT); } return v; } if (inst->origin > L_LOCAL || inst->location > L_LOCAL) { TmTranslate( tT, p->x0, p->y0, 0. ); TmConcat( T, tT, T ); if (inst->origin > L_LOCAL) { Point3 originwas, delta; TmCoord (*l2o)[4], (*o2N)[4]; Transform Tl2o; static HPoint3 zero = { 0, 0, 0, 1 }; /* We have location2W, origin2W. * We want to translate in 'origin' coords such that * (0,0,0) in location coords maps to originpt in origin coords. */ o2N = coords2NDC(inst->origin, p, T); l2o = coordsbtwn(inst->location, inst->origin, p, T); HPt3TransPt3(l2o, &zero, &originwas); Pt3Sub(&inst->originpt, &originwas, &delta); TmTranslate( tT, delta.x, delta.y, delta.z ); TmConcat( l2o, tT, Tl2o ); TmConcat( T, Tl2o, tT ); TmConcat( tT, o2N, T ); } else { TmCopy( coords2NDC(inst->location, p, T), T ); } TmTranslate( tT, -p->x0, -p->y0, 0. ); TmConcat( T, tT, T ); } if (!TN || inst->location > L_LOCAL) { pathInd = VVCOUNT(p->gcur); vvneeds(&p->gcur, pathInd + 1); VVCOUNT(p->gcur)++; it = GeomIterate((Geom *)inst, DEEP); while (NextTransform(it, tT)) { *VVINDEX(p->gcur, int, pathInd) = elem; TmConcat(tT, T, tT); if (GeomPick(inst->geom, p, ap, tT, NULL, NULL)) v = (Geom *)inst; elem++; } VVCOUNT(p->gcur)--; return v; } else { TransformN *tTN = NULL; pathInd = VVCOUNT(p->gcur); vvneeds(&p->gcur, pathInd + 1); VVCOUNT(p->gcur)++; it = GeomIterate((Geom *)inst, DEEP); while (NextTransform(it, tT)) { *VVINDEX(p->gcur, int, pathInd) = elem; tTN = TmNCopy(TN, tTN); TmNApplyT3TN(tT, NULL, tTN); if (GeomPick(inst->geom, p, ap, NULL, tTN, axes)) v = (Geom *)inst; elem++; } VVCOUNT(p->gcur)--; if (tTN) { TmNDelete(tTN); } return v; } return v; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/inst/instsphere.c0000644000175000017500000000631112310110200016226 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "create.h" #include "instP.h" #include "sphere.h" Geom *InstBoundSphere(Inst *inst, Transform T, TransformN *TN, int *axes, int space) { Sphere *geomsphere, *sphere; Transform Tnew; GeomIter *it; if (inst == NULL || inst->geom == NULL) return NULL; if (inst->location > L_LOCAL || inst->origin > L_LOCAL) return NULL; if (T == NULL) T = TM_IDENTITY; if (inst->NDaxis == NULL) { if (TN == NULL) { it = GeomIterate((Geom *)inst, DEEP); geomsphere = NULL; while (NextTransform(it, Tnew) > 0) { TmConcat(Tnew, T, Tnew); sphere = (Sphere *)GeomBoundSphere(inst->geom, Tnew, NULL, NULL, space); if (sphere != NULL) { if (geomsphere != NULL) { SphereUnion3(geomsphere, sphere, geomsphere); GeomDelete((Geom *)sphere); } else geomsphere = sphere; } } } else { TransformN *TnewN = TmNCopy(TN, NULL); static int dflt_axes[] = { 1, 2, 3, 0 }; it = GeomIterate((Geom *)inst, DEEP); geomsphere = NULL; while (NextTransform(it, Tnew) > 0) { /* If TN != NULL, then Tnew is first applied to the x,y,z * sub-space of the object, then folded into TN, and finally * the product is projected down to the sub-space defined by * the "axes" argument. */ TmNCopy(TN, TnewN); TmNApplyT3TN(Tnew, dflt_axes, TnewN); sphere = (Sphere *)GeomBoundSphere(inst->geom, NULL, TnewN, axes, space); if (sphere != NULL) { if (geomsphere != NULL) { SphereUnion3(geomsphere, sphere, geomsphere); GeomDelete((Geom *)sphere); } else geomsphere = sphere; } } TmNDelete(TnewN); } } else { if (TN) { TransformN *TnewN; TnewN = TmNConcat(inst->NDaxis, TN, NULL); geomsphere = (Sphere *)GeomBoundSphere(inst->geom, NULL, TnewN, axes, space); TmNDelete(TnewN); } else { TransformN *TnewN = TmNCopy(inst->NDaxis, NULL); static int dflt_axes[] = { 1, 2, 3, 0 }; TmNApplyDN(TnewN, dflt_axes, T); geomsphere = (Sphere *)GeomBoundSphere(inst->geom, NULL, TnewN, dflt_axes, space); TmNDelete(TnewN); } } return (Geom *)geomsphere; } geomview-1.9.5/src/lib/gprim/inst/inststream.c0000644000175000017500000001641612310110200016242 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "instP.h" #include "streampool.h" #include "transobj.h" #include "ntransobj.h" #include "handleP.h" static char *locations[] = { "none", /* L_NONE */ "local", /* L_LOCAL */ "global", /* L_GLOBAL */ "camera", /* L_CAMERA */ "ndc", /* L_NDC */ "screen", /* L_SCREEN */ }; static int getlocation(char *name) { int i; if(name == NULL) { return -1; } for(i = COUNT(locations); --i >= 0 && strcasecmp(name, locations[i]) != 0; ) ; return i; /* Return location number, or -1 if not found. */ } Geom *InstImport(Pool *p) { Inst *inst = NULL; IOBFILE *file; char *expect = NULL; int c; if(p == NULL || (file = PoolInputFile(p)) == NULL) { return 0; } if(strcmp(GeomToken(file), "INST")) { return 0; } for(;;) { switch((c = iobfnextc(file, 0))) { case EOF: case CKET: goto done; case 'l': if(iobfexpectstr(file, expect = "location")) { goto syntax; } if(inst == NULL) { inst = (Inst *)GeomCCreate(NULL, InstMethods(), NULL); } inst->location = getlocation( iobfdelimtok("(){}", file, 0) ); expect = "location [local|global|camera|ndc|screen]"; if(inst->location < 0) { goto syntax; } break; case 'o': if(iobfexpectstr(file, expect = "origin")) { goto syntax; } if(inst == NULL) { inst = (Inst *)GeomCCreate(NULL, InstMethods(), NULL); } expect = "origin [local|global|camera|ndc|screen] X Y Z"; inst->origin = getlocation( iobfdelimtok("(){}", file, 0) ); if(inst->origin < 0) { goto syntax; } if(iobfgetnf(file, 3, &inst->originpt.x, 0) < 3) { goto syntax; } break; case 'u': if(iobfexpectstr(file, expect = "unit")) { goto syntax; } goto geom; case 'g': if(iobfexpectstr(file, expect = "geom")) goto syntax; geom: if(inst == NULL) { inst = (Inst *)GeomCCreate(NULL, InstMethods(), NULL); } expect = "geometry"; if(!GeomStreamIn(p, &inst->geomhandle, &inst->geom)) { goto failed; } if(inst->geomhandle) { HandleRegister(&inst->geomhandle, (Ref *)inst, &inst->geom, HandleUpdRef); } break; case 'n': /* ntransform */ if(iobfexpectstr(file, (expect = "ntransform"))) { goto syntax; } if(inst == NULL) { inst = (Inst *)GeomCCreate(NULL, InstMethods(), NULL); } expect = "ntransform matrix"; if(!NTransStreamIn(p, &inst->NDaxishandle, &inst->NDaxis)) { goto failed; } if(inst->NDaxishandle) { HandleRegister(&inst->NDaxishandle, (Ref *)inst, &inst->NDaxis, HandleUpdRef); } break; case 't': /* tlist ... or transform ... */ if(inst == NULL) { inst = (Inst *)GeomCCreate(NULL, InstMethods(), NULL); } iobfgetc(file); switch((c = iobfgetc(file))) { case 'l': if(iobfexpectstr(file, (expect = "tlist")+2)) { /* "tlist" */ goto syntax; } transforms: if(inst == NULL) { inst = (Inst *)GeomCCreate(NULL, InstMethods(), NULL); } expect = "TLIST object"; if(!GeomStreamIn(p, &inst->tlisthandle, &inst->tlist)) { goto failed; } if(inst->tlisthandle) { HandleRegister(&inst->tlisthandle, (Ref *)inst, &inst->tlist, HandleUpdRef); } break; case 'r': if(iobfexpectstr(file, (expect = "transform")+2)) { /* "transform" */ goto syntax; } if(iobfexpectstr(file, "s") == 0) { /* transforms = tlist */ goto transforms; } if(inst == NULL) { inst = (Inst *)GeomCCreate(NULL, InstMethods(), NULL); } expect = "transform matrix"; if (!TransStreamIn(p, &inst->axishandle, inst->axis)) { goto failed; } if (inst->axishandle) { HandleRegister(&inst->axishandle, (Ref *)inst, inst->axis, TransUpdate); } break; case 'x': if (iobfexpectstr(file, (expect = "txtransforms")+2)) { goto syntax; } if(inst == NULL) { inst = (Inst *)GeomCCreate(NULL, InstMethods(), NULL); } expect = "TLIST object"; if(!GeomStreamIn(p, &inst->txtlisthandle, &inst->txtlist)) { goto failed; } if(inst->txtlisthandle) { HandleRegister(&inst->txtlisthandle, (Ref *)inst, &inst->txtlist, HandleUpdRef); } break; default: expect = "something"; goto syntax; } break; default: syntax: OOGLSyntax(file, "Couldn't read INST in \"%s\": " "syntax error, expected %s, got char %c", p->poolname, expect, c); goto bogus; failed: OOGLSyntax(file, "Couldn't read INST in \"%s\": expected %s", PoolName(p), expect); bogus: GeomDelete((Geom *)inst); return NULL; } } done: return (Geom *)inst; } int InstExport(Inst *inst, Pool *pool) { FILE *outf; int ok = 1; if(inst == NULL || pool == NULL || (outf = PoolOutputFile(pool)) == NULL) return 0; PoolFPrint(pool, outf, "INST\n"); if(inst->origin != L_NONE && (unsigned)inst->origin < COUNT(locations)) { PoolFPrint(pool, outf, "origin %s ", locations[inst->origin]); fputnf(pool->outf, 3, &inst->originpt.x, 0); fputc('\n', pool->outf); } if(inst->location != L_LOCAL && inst->location != L_NONE && (unsigned)inst->location < COUNT(locations)) PoolFPrint(pool, outf, "location %s\n", locations[inst->location]); if(inst->tlist != NULL || inst->tlisthandle != NULL) { PoolFPrint(pool, outf, "transforms "); ok &= GeomStreamOut(pool, inst->tlisthandle, inst->tlist); } else if(inst->tlist != NULL || inst->tlisthandle != NULL) { PoolFPrint(pool, outf, "txtransforms "); ok &= GeomStreamOut(pool, inst->tlisthandle, inst->tlist); } else if (memcmp(inst->axis, TM_IDENTITY, sizeof(Transform)) != 0) { PoolFPrint(pool, outf, ""); ok &= TransStreamOut(pool, inst->axishandle, inst->axis); } else if (inst->NDaxis != NULL) { PoolFPrint(pool, outf, ""); ok &= NTransStreamOut(pool, inst->NDaxishandle, inst->NDaxis); } if(inst->geom != NULL || inst->geomhandle != NULL) { PoolFPrint(pool, outf, "geom "); ok &= GeomStreamOut(pool, inst->geomhandle, inst->geom); } return ok; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/inst/inst.h0000644000175000017500000000470112310110200015025 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef INSTDEFS #define INSTDEFS /* * Private definitions for Inst's. */ #include "bbox.h" #include "bsptree.h" enum InstLocation { /* Coordinate system where inst lives */ L_NONE = 0, L_LOCAL = 1, /* local coordinates in hierarchy (default) */ L_GLOBAL = 2, /* Global (just above Geomview world) */ L_CAMERA = 3, /* In 3-D camera space (cam=0,0,0, look=-Z) */ L_NDC = 4, /* NDC space: -1 <= X,Y,Z <= 1 */ L_SCREEN = 5 /* screen space: X,Y in 0..screensize, Z in -1..1 */ }; typedef struct Inst Inst; extern GeomClass *InstClass; /* Public read-only; valid only * after first call to InstMethods() */ extern GeomClass *InstMethods( void ); extern Geom *InstImport( Pool *p ); extern int InstExport( Inst *, Pool * ); extern int InstGet( Inst *, int attr, void *attrp ); extern Inst *InstLoad( char * ); extern Inst *InstFLoad( FILE *, char *name ); extern Inst *InstSave( Inst *, char * ); extern Inst *InstFSave( Inst *, FILE *, char * ); extern BBox *InstBound( Inst *, Transform T, TransformN *TN); extern Geom *InstBoundSphere( Inst *, Transform T, TransformN *TN, int *axes, int ); extern Inst *InstPosition( Inst *, Transform T ); extern Inst *InstTransformTo( Inst *, Transform T, TransformN *TN ); extern Inst *InstTransform( Inst *, Transform T, TransformN *TN ); extern Inst *InstEvert( Inst * ); extern Inst *InstDraw( Inst * ); extern Geom *InstReplace( Inst *, Geom * ); extern Inst *InstBSPTree(Inst *inst, BSPTree *tree, int action); #endif /*INSTDEFS*/ geomview-1.9.5/src/lib/gprim/inst/instP.h0000644000175000017500000000404012310110200015141 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef INSTPDEFS #define INSTPDEFS /* * Private definitions for Inst's. */ #include "inst.h" #include "bboxP.h" /* includes geomclass.h */ #define INSTMAGIC GeomMagic('i', 3) #define INSTFIELDS \ GEOMFIELDS; \ Geom *geom; \ Handle *geomhandle; \ Transform axis; /* this ought to go... */ \ Handle *axishandle; \ TransformN *NDaxis; /* maybe not. */ \ Handle *NDaxishandle; \ Geom *tlist; \ Handle *tlisthandle; \ Geom *txtlist; \ Handle *txtlisthandle; \ int location; /* L_LOCAL, etc. */ \ int origin; /* L_NONE, L_LOCAL, etc. */ \ Point3 originpt /* Only if origin != L_NONE */ struct Inst { INSTFIELDS; }; extern GeomClass *InstClass; /* Public read-only; valid only * after first call to InstMethods() */ extern Inst *InstCreate( Inst *exist, GeomClass *Class, va_list *attrs ); extern void InstDelete( Inst * ); extern Inst *InstCopy( Inst * ); extern Inst *InstDice( Inst *, int nu, int nv ); #endif /*INSTPDEFS*/ /* * Local Variables *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/inst/Headers0000644000175000017500000000001712310110200015171 00000000000000inst.h instP.h geomview-1.9.5/src/lib/gprim/lincoln/0000755000175000017500000000000012310165602014456 500000000000000geomview-1.9.5/src/lib/gprim/lincoln/Makefile.in0000644000175000017500000004613012310165554016455 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/lincoln DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) liblincoln_la_LIBADD = am_liblincoln_la_OBJECTS = lincolnclass.lo lincolnload.lo liblincoln_la_OBJECTS = $(am_liblincoln_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(liblincoln_la_SOURCES) DIST_SOURCES = $(liblincoln_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = liblincoln.la liblincoln_la_SOURCES = \ lincolnclass.c lincolnload.c \ lincolndefs.h lincoln.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/lincoln/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/lincoln/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } liblincoln.la: $(liblincoln_la_OBJECTS) $(liblincoln_la_DEPENDENCIES) $(EXTRA_liblincoln_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(liblincoln_la_OBJECTS) $(liblincoln_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lincolnclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lincolnload.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/lincoln/Makefile.am0000644000175000017500000000026212310110200016412 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = liblincoln.la liblincoln_la_SOURCES = \ lincolnclass.c lincolnload.c \ lincolndefs.h lincoln.h geomview-1.9.5/src/lib/gprim/lincoln/lincolnclass.c0000644000175000017500000000350312310110200017207 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: * Return the geometry class structure for Lincoln * */ #include "polylistP.h" #include "lincolndefs.h" static GeomClass *aLincolnMethods = NULL; int LincolnPresent = 1; static char lincolnName[] = "lincoln"; char * LincolnName() { return lincolnName; } GeomClass * LincolnMethods() { if (!aLincolnMethods) { PolyListMethods(); /* Create the polylist class first, */ aLincolnMethods = GeomSubClassCreate("polylist", lincolnName); aLincolnMethods->fload = (GeomFLoadFunc *) LincolnFLoad; aLincolnMethods->name = (GeomNameFunc *) LincolnName; } return aLincolnMethods; } geomview-1.9.5/src/lib/gprim/lincoln/lincolnload.c0000644000175000017500000001001612310110200017016 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Load a polylist in the Lincoln file format. */ #include "polylistP.h" #include "lincoln.h" #define CONV(ptr,list) if (ptr) (ptr) = list + ((long)(ptr) - 1); PolyList * LincolnFLoad(IOBFILE *inf) { struct data header; struct vertex *vertex_list; struct edge *edge_list; struct face *face_list; struct vertex *vp; struct edge *ep; struct face *fp; int i,j; Vertex *v_list; PolyList *new; if(iobfnextc(inf,0) != '\0') /* Demand null title string */ return NULL; if(iobfread(&header,sizeof(struct data),1,inf) <= 0) return NULL; vertex_list = OOGLNewNE(struct vertex, header.nvertices, "Lincoln vertices"); edge_list = OOGLNewNE(struct edge, header.nedges, "Lincoln edges"); face_list = OOGLNewNE(struct face, header.nfaces, "Lincoln faces"); if(iobfread(vertex_list,sizeof(struct vertex),header.nvertices,inf) <= 0 || iobfread(edge_list,sizeof(struct edge),header.nedges,inf) <= 0 || iobfread(face_list,sizeof(struct face),header.nfaces,inf) <= 0) return NULL; for (vp = vertex_list; vpe,edge_list); } for (ep = edge_list; epf0,face_list); CONV(ep->f1,face_list); CONV(ep->v0,vertex_list); CONV(ep->v1,vertex_list); CONV(ep->e00,edge_list); CONV(ep->e01,edge_list); CONV(ep->e10,edge_list); CONV(ep->e11,edge_list); } for (fp= face_list; fp < face_list+header.nfaces; fp++) { CONV(fp->e,edge_list); } new = OOGLNewE(PolyList, "Lincoln"); /* should do a PolyListCreate here but time's short...*/ GGeomInit(new, PolyListMethods(), PLMAGIC, NULL); v_list = new->vl = OOGLNewNE(Vertex, header.nvertices, "Lincoln verts"); new->p = OOGLNewNE(Poly, header.nfaces, "Lincoln faces"); memset(v_list, 0, header.nvertices * sizeof(Vertex)); new->geomflags = PL_HASPCOL; /* We have a color-per-face, no normals */ new->n_polys = header.nfaces; new->n_verts = header.nvertices; v_list = new->vl; for (i = 0; i < header.nfaces; i++) { Poly *p; fp = face_list + i; ep = fp->e; if (ep->f1 == fp) vp = ep->v0; else vp = ep->v1; p = &new->p[i]; p->n_vertices = fp->order; p->v = OOGLNewNE(Vertex *, fp->order, "Lincoln face"); p->pcol.r = ((fp->chars.color>>16) &0xFF) / 255.0; p->pcol.g = ((fp->chars.color>>8) &0xFF) / 255.0; p->pcol.b = ((fp->chars.color) &0xFF) / 255.0; p->pcol.a = (fp->chars.color&0xFF000000) ? (((fp->chars.color>>24) & 0xFF) / 255.0) : 1.0; for (j = 0; j < fp->order; j++) { Vertex *v = &v_list[vp - vertex_list]; p->v[j]= v; v->pt.x = vp->pos.x; v->pt.y = vp->pos.y; v->pt.z = vp->pos.z; if (ep->v0 == vp) { vp = ep->v1; ep = ((ep->f0==fp) ? (ep->e01) : (ep->e11)) ; } else { vp = ep->v0; ep = ((ep->f0==fp) ? (ep->e00) : (ep->e10)) ; } } } OOGLFree((char*)vertex_list); OOGLFree((char*)edge_list); OOGLFree((char*)face_list); return new; } geomview-1.9.5/src/lib/gprim/lincoln/lincolndefs.h0000644000175000017500000000236612310110200017036 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* Geometry Routines Geometry Supercomputer Project ROUTINE DESCRIPTION: The header file for the lincoln object */ #ifndef LINCOLNDEFS #define LINCOLNDEFS /* FUNCTION DECLARATIONS */ extern GeomClass *LincolnMethods(); extern PolyList *LincolnFLoad(); #endif /*LINCOLNDEFS*/ geomview-1.9.5/src/lib/gprim/lincoln/lincoln.h0000644000175000017500000000433412310110200016171 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* Winged edge data structure represented in Lincoln file format \ / \ / \ / \ / e00\ /e10 \ / \ / v0 | | | f0 |e f1 | | | | v1 / \ / \ e01/ \e11 / \ / \ / \ */ #define BUFSIZE 256 struct position { float x,y,z,w; }; struct equation { float x,y,z,w; }; /* struct vertexchars { information will be stored here to give the characteristics of an vertex (e.g. pointtype, color,...) } */ struct vertex { struct position pos; struct edge *e; int order; /* struct vertexchars chars; */ }; /* struct edgechars { information will be stored here to give the characteristics of an edge (e.g. thickness, color,...) } */ struct edge { struct vertex *v0,*v1; struct face *f0,*f1; struct edge *e00,*e01,*e10,*e11; /* struct edgechars chars; */ }; struct facechars { int color; }; struct face { struct equation eqn; struct edge *e; int order; struct facechars chars; }; struct data { char title[BUFSIZE]; int dim, nvertices, nedges, nfaces, nobjects ;} ; geomview-1.9.5/src/lib/gprim/lincoln/Headers0000644000175000017500000000003012310110200015645 00000000000000lincoln.h lincolndefs.h geomview-1.9.5/src/lib/gprim/list/0000755000175000017500000000000012310165602013773 500000000000000geomview-1.9.5/src/lib/gprim/list/Makefile.in0000644000175000017500000004677712310165554016013 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/list DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) liblist_la_LIBADD = am_liblist_la_OBJECTS = listclass.lo listcreate.lo listdraw.lo \ listmisc.lo listpick.lo listsphere.lo liststream.lo liblist_la_OBJECTS = $(am_liblist_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(liblist_la_SOURCES) DIST_SOURCES = $(liblist_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = liblist.la liblist_la_SOURCES = \ listclass.c listcreate.c listdraw.c listmisc.c listpick.c listsphere.c liststream.c \ list.h listP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/list/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/list/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } liblist.la: $(liblist_la_OBJECTS) $(liblist_la_DEPENDENCIES) $(EXTRA_liblist_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(liblist_la_OBJECTS) $(liblist_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listmisc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liststream.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/list/Makefile.am0000644000175000017500000000033212310110200015725 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = liblist.la liblist_la_SOURCES = \ listclass.c listcreate.c listdraw.c listmisc.c listpick.c listsphere.c liststream.c \ list.h listP.h geomview-1.9.5/src/lib/gprim/list/listclass.c0000644000175000017500000000511412310110200016041 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "listP.h" GeomClass *ListClass = NULL; int ListPresent = 1; static char listName[] = "list"; char *ListName(void) { return listName; } extern void ListHandleScan( List *, int (*func)(), void *arg ); GeomClass *ListMethods(void) { if( !ListClass ) { ListClass = GeomClassCreate(listName); ListClass->name = ListName; ListClass->methods = (GeomMethodsFunc *)ListMethods; ListClass->create = (GeomCreateFunc *)ListCreate; ListClass->get = (GeomGetFunc *)ListGet; ListClass->Delete = (GeomDeleteFunc *)ListDelete; ListClass->bound = (GeomBoundFunc *)ListBound; ListClass->boundsphere = (GeomBoundSphereFunc *)ListBoundSphere; ListClass->evert = (GeomEvertFunc *)ListEvert; ListClass->dice = (GeomDiceFunc *)ListDice; ListClass->transform = (GeomTransformFunc *)ListTransform; ListClass->transformto = (GeomTransformToFunc *)ListTransform; ListClass->pick = (GeomPickFunc *)ListPick; ListClass->copy = (GeomCopyFunc *)ListCopy; ListClass->draw = (GeomDrawFunc *)ListDraw; ListClass->bsptree = (GeomBSPTreeFunc *)ListBSPTree; ListClass->replace = (GeomReplaceFunc *)ListReplace; ListClass->scan = (GeomScanFunc *)ListHandleScan; ListClass->import = (GeomImportFunc *)ListImport; ListClass->export = (GeomExportFunc *)ListExport; } return ListClass; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/list/listcreate.c0000644000175000017500000001431612310110200016203 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "listP.h" #include "nodedata.h" /* * List editing, deletion and creation. */ Geom *ListReplace(List *list, Geom *geom) { Geom *g; if(list == NULL) { return NULL; } g = list->car; list->car = geom; return g; } Geom *ListRemove(Geom *list, Geom *g) { List *l; List **prev; if (list == NULL) { return NULL; } if (list->Class != ListClass) { OOGLError(1, "ListRemove: %x is a %s not a List!", list, GeomName(list)); return NULL; } for (prev = (List **)(void *)&list; (l = *prev) != NULL; prev = &l->cdr) { if (l->car == g) { *prev = l->cdr; l->cdr = NULL; GeomDelete( (Geom *)l ); break; } } return list; } /* * Delete a List. * Don't use a for-loop over all the list elements; * someone else might have pointers to them. */ void ListDelete(List *l) { if (l->cdr) GeomDelete((Geom *)l->cdr); if (l->car) GeomDelete(l->car); if (l->carhandle) HandlePDelete(&l->carhandle); } List *ListCopy(List *list) { List *l, *nl; Geom *newcar; List *newlist; List **tailp = &newlist; for (l = list; l != NULL; l = l->cdr) { newcar = GeomCopy(l->car); if (newcar == NULL) continue; nl = OOGLNewE(List, "ListCopy: List"); GGeomInit(nl, list->Class, list->magic, NULL); *tailp = nl; tailp = &nl->cdr; nl->car = newcar; nl->carhandle = NULL; } *tailp = NULL; return newlist; } int ListGet(List *l, int attr, void *attrp) { switch(attr) { case CR_GEOM: *(Geom **)attrp = l->car; break; case CR_GEOMHANDLE: *(Handle **)attrp = l->carhandle; break; case CR_CDR: *(Geom **)attrp = (Geom *)l->cdr; break; default: return -1; } return 1; } Geom *ListAppend(Geom *lg, Geom *g) { List *new = OOGLNewE(List, "ListAppend: List"); List *l = (List*)lg; if (l && l->Class->Delete != (GeomDeleteFunc *)ListDelete) { OOGLError(0, "ListAppend: attempt to append to a %s, not a List", GeomName((Geom *)l)); return NULL; } new->car = g; new->cdr = NULL; if (l) { while (l->cdr) l = l->cdr; l->cdr = new; GGeomInit(new, lg->Class, lg->magic, NULL); } else { l = new; GGeomInit(new, ListClass, LISTMAGIC, NULL); } new->carhandle = NULL; return lg ? lg : (Geom *)new; } List *ListCreate (List *exist, GeomClass *Classp, va_list *a_list ) { List *list, *l; int attr, copy = 1; Handle *h; Geom *g; bool tree_changed = false; if (exist == NULL) { list = OOGLNewE( List, "ListCreate: new List" ); GGeomInit(list, Classp, LISTMAGIC, NULL); list->cdr = NULL; list->carhandle = NULL; list->car = NULL; } else { if (exist->Class != Classp) { OOGLError(0, "ListCreate: existing_value %x (magic %x) not a List", exist, exist->magic); return NULL; } list = exist; } while ((attr = va_arg (*a_list, int))) switch (attr) { case CR_HANDLE_GEOM: /* * Like GeomReplace, but takes a Handle too. */ h = va_arg(*a_list, Handle *); g = va_arg(*a_list, Geom *); if (g == NULL && h != NULL) g = (Geom *)HandleObject(h); if (copy) { if (h) RefIncr((Ref *)h); RefIncr((Ref *)g); } GeomDelete(list->car); HandlePDelete(&list->carhandle); list->carhandle = h; list->car = g; if (h) { HandleRegister(&list->carhandle, (Ref *)list, &list->car, HandleUpdRef); HandleSetObject(list->carhandle, (Ref *)g); } tree_changed = true; break; case CR_GEOM: /* == CR_CAR */ if (list->car != NULL || list->carhandle != NULL) { l = OOGLNewE(List, "ListCreate: List"); GGeomInit(l, Classp, LISTMAGIC, NULL); l->car = list->car; l->carhandle = list->carhandle; RefIncr((Ref *)list->carhandle); l->cdr = list->cdr; list->cdr = l; } list->car = va_arg (*a_list, Geom *); if (copy) { RefIncr((Ref *)list->car); } tree_changed = true; break; case CR_GEOMHANDLE: if (list->car != NULL || list->carhandle != NULL) { l = OOGLNewE(List, "ListCreate: List"); l->car = list->car; l->carhandle = list->carhandle; l->cdr = list->cdr; list->cdr = l; list->car = NULL; } h = va_arg(*a_list, Handle *); if (copy) RefIncr((Ref *)h); HandlePDelete(&list->carhandle); list->carhandle = h; HandleRegister(&list->carhandle, (Ref *)list, &list->car, HandleUpdRef); tree_changed = true; break; case CR_CDR: l = va_arg (*a_list, List *); if (l && l->Class != Classp) { OOGLError(0, "ListCreate: CDR %x (magic %x) not a List", l, l->magic); goto fail; } if (list->cdr) { GeomDelete((Geom *)list->cdr); } if (copy) { RefIncr((Ref *)l); } list->cdr = l; tree_changed = true; break; default: if (GeomDecorate (list, ©, attr, a_list)) { OOGLError (0, "ListCreate: Undefined attribute: %d", attr); fail: if (exist == NULL) { GeomDelete ((Geom *)list); } return NULL; } } if (tree_changed) { GeomNodeDataPrune((Geom *)list); } return list; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/list/listdraw.c0000644000175000017500000001324312310110200015673 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "listP.h" #include "mg.h" #include "bsptreeP.h" #define INITIAL_ALLOC_SIZE (1 << 5) List *ListDraw(List *list) { List *l; char *lpath = NULL; int lpathlen, allocsz; GeomMakePath(list, 'L', path, pathlen); list->geomflags &= ~GEOM_ALPHA; /* Use alloca() for moderately large lists, fall back to malloc * afterwards. */ allocsz = INITIAL_ALLOC_SIZE; if (pathlen < allocsz) { lpath = alloca(allocsz); memcpy(lpath, path, pathlen+1); } else { lpath = path; } for (lpathlen = pathlen+1, l = list; l != NULL; l = l->cdr, ++lpathlen) { if (lpathlen >= allocsz) { /* give up on alloca */ bool doFree = allocsz > INITIAL_ALLOC_SIZE; while (lpathlen >= allocsz) { allocsz <<= 1; } path = OOGLNewNE(char, allocsz, "List PATH"); memcpy(path, lpath, lpathlen-1); if (doFree) { OOGLFree(lpath); } lpath = path; } lpath[lpathlen-1] = 'l'; lpath[lpathlen] = '\0'; if (l->car) { l->car->ppath = lpath; l->car->ppathlen = lpathlen; GeomDraw(l->car); if (l->car->geomflags & GEOM_ALPHA) { list->geomflags |= GEOM_ALPHA; } } } if (allocsz > INITIAL_ALLOC_SIZE) { OOGLFree(lpath); } return list; } List *ListBSPTree(List *list, BSPTree *bsptree, int action) { List *l; char *lpath = NULL; int lpathlen, allocsz; GeomMakePath(list, 'L', path, pathlen); switch (action) { case BSPTREE_CREATE: /* Use alloca() for moderately large lists, fall back to malloc * afterwards. */ allocsz = INITIAL_ALLOC_SIZE; if (pathlen < allocsz) { lpath = alloca(allocsz); memcpy(lpath, path, pathlen+1); } else { lpath = path; } for (lpathlen = pathlen+1, l = list; l != NULL; l = l->cdr, ++lpathlen) { if (lpathlen >= allocsz) { /* give up on alloca */ bool doFree = allocsz > INITIAL_ALLOC_SIZE; while (lpathlen >= allocsz) { allocsz <<= 1; } path = OOGLNewNE(char, allocsz, "List PATH"); memcpy(path, lpath, lpathlen-1); if (doFree) { OOGLFree(lpath); } lpath = path; } lpath[lpathlen-1] = 'l'; lpath[lpathlen] = '\0'; if (l->car) { l->car->ppath = lpath; l->car->ppathlen = lpathlen; GeomBSPTree(l->car, bsptree, action); } HandleRegister(&l->carhandle, (Ref *)l, bsptree, BSPTreeInvalidate); } if (allocsz > INITIAL_ALLOC_SIZE) { OOGLFree(lpath); } return list; case BSPTREE_DELETE: /* Use alloca() for moderately large lists, fall back to malloc * afterwards. */ allocsz = INITIAL_ALLOC_SIZE; if (pathlen < allocsz) { lpath = alloca(allocsz); memcpy(lpath, path, pathlen+1); } else { lpath = path; } for (lpathlen = pathlen+1, l = list; l != NULL; l = l->cdr, ++lpathlen) { if (lpathlen >= allocsz) { /* give up on alloca */ bool doFree = allocsz > INITIAL_ALLOC_SIZE; while (lpathlen >= allocsz) { allocsz <<= 1; } path = OOGLNewNE(char, allocsz, "List PATH"); memcpy(path, lpath, lpathlen-1); if (doFree) { OOGLFree(lpath); } lpath = path; } lpath[lpathlen-1] = 'l'; lpath[lpathlen] = '\0'; if (l->car) { l->car->ppath = lpath; l->car->ppathlen = lpathlen; GeomBSPTree(l->car, bsptree, action); } HandleUnregisterJust(&l->carhandle, (Ref *)l, bsptree, BSPTreeInvalidate); } if (allocsz > INITIAL_ALLOC_SIZE) { OOGLFree(lpath); } return list; case BSPTREE_ADDGEOM: /* Use alloca() for moderately large lists, fall back to malloc * afterwards. */ allocsz = INITIAL_ALLOC_SIZE; if (pathlen < allocsz) { lpath = alloca(allocsz); memcpy(lpath, path, pathlen+1); } else { lpath = path; } for (lpathlen = pathlen+1, l = list; l != NULL; l = l->cdr, ++lpathlen) { if (lpathlen >= allocsz) { /* give up on alloca */ bool doFree = allocsz > INITIAL_ALLOC_SIZE; while (lpathlen >= allocsz) { allocsz <<= 1; } path = OOGLNewNE(char, allocsz, "List PATH"); memcpy(path, lpath, lpathlen-1); if (doFree) { OOGLFree(lpath); } lpath = path; } lpath[lpathlen-1] = 'l'; lpath[lpathlen] = '\0'; if (l->car) { l->car->ppath = lpath; l->car->ppathlen = lpathlen; GeomBSPTree(l->car, bsptree, action); } } if (allocsz > INITIAL_ALLOC_SIZE) { OOGLFree(lpath); } return list; default: return NULL; } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/list/listmisc.c0000644000175000017500000000435112310110200015671 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include "listP.h" void ListHandleScan( List *list, int (*func)(), void *arg ) { while(list) { if(list->carhandle) (*func)(&list->carhandle, list, arg); GeomHandleScan( list->car, func, arg ); list = list->cdr; } } List * ListDice( List *list, int nu, int nv ) { List *l; for(l = list; l != NULL; l = l->cdr) GeomDice(l->car, nu, nv); return list; } List * ListEvert( List *list ) { List *l; for(l = list; l != NULL; l = l->cdr) GeomEvert( l->car ); return list; } BBox *ListBound(List *list, Transform T, TransformN *TN) { Geom *carbox = NULL; BBox *bbox = NULL; List *l; for(l = list; l != NULL; l = l->cdr) { carbox = GeomBound( l->car, T, TN ); if(carbox == NULL) continue; if(bbox) { BBoxUnion3(bbox, (BBox *)carbox, bbox); GeomDelete( carbox ); } else { bbox = (BBox *)carbox; } } return bbox; } List *ListTransform(List *list, Transform T, TransformN *TN) { List *l; for(l = list; l != NULL; l = l->cdr) GeomTransform( l->car, T, TN ); return list; } geomview-1.9.5/src/lib/gprim/list/listpick.c0000644000175000017500000000337512310110200015671 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include "listP.h" #include "ooglutil.h" #include "pickP.h" Geom * ListPick(List *list, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { int elem = 0, pathInd; List *l; Geom *v = NULL; pathInd = VVCOUNT(p->gcur); vvneeds(&p->gcur, pathInd + 1); VVCOUNT(p->gcur)++; for(l = list; l != NULL; l = l->cdr) { *VVINDEX(p->gcur, int, pathInd) = elem; if(l->car) if(GeomPick(l->car, p, ap, T, TN, axes)) v = (Geom *)list; elem++; } VVCOUNT(p->gcur)--; return v; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/list/listsphere.c0000644000175000017500000000321212310110200016217 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "create.h" #include "listP.h" #include "sphere.h" Geom *ListBoundSphere(List *list, Transform T, TransformN *TN, int *axes, int space) { Geom *carsphere = NULL, *sphere = NULL; List *l; for (l = list; l != NULL; l = l->cdr) { carsphere = GeomBoundSphere(l->car, T, TN, axes, space); if (carsphere == NULL) continue; if (sphere != NULL) { SphereUnion3((Sphere *)sphere, (Sphere *)carsphere, (Sphere *)sphere); GeomDelete(carsphere); } else sphere = carsphere; } return sphere; } geomview-1.9.5/src/lib/gprim/list/liststream.c0000644000175000017500000000650412310110200016233 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "inst.h" #include "streampool.h" #include "transobj.h" #include "handleP.h" #include "listP.h" List * ListImport( Pool *p ) { List *list = NULL; List *new, **tailp = &list; int c, prevc = 0; int brack = 0; int any = 0; IOBFILE *file; if(p == NULL || (file = PoolInputFile(p)) == NULL) return NULL; if(strcmp(GeomToken(file), "LIST") != 0) return NULL; while((c = iobfnextc(file, 0)) != EOF) { switch(c) { case ';': case ')': goto done; case CBRA: brack++; iobfgetc(file); continue; case CKET: if(--brack < 0) goto done; iobfgetc(file); if(prevc == CBRA) { /* Interpret "{ }" as a NULL entry in a list. Leave it * there as a placeholder -- could be deliberate. */ new = (List *)GeomCCreate(NULL, ListMethods(), CR_END); *tailp = new; tailp = &new->cdr; any = 1; } break; default: new = (List *)GeomCCreate(NULL, ListMethods(), CR_END); if(GeomStreamIn(p, &new->carhandle, &new->car)) { *tailp = new; tailp = &new->cdr; if(new->carhandle) HandleRegister(&new->carhandle, (Ref *)new, (Ref **)(void *)&new->car, HandleUpdRef); } else { OOGLSyntax(file, "Couldn't read LIST in \"%s\": error reading embedded object", p->poolname); GeomDelete((Geom *)new); GeomDelete((Geom *)list); return NULL; } any = 1; break; } prevc = c; } /* * If no list members appeared at all, call it a valid, empty List. * But if there were list members but none were readable, fail. * Hence the "any" flag. */ done: if(brack > 0) OOGLSyntax(file, "Couldn't read LIST in \"%s\": too many %c's", p->poolname, CBRA); if(!any) return (List *)GeomCCreate(NULL, ListMethods(), CR_END); /* null LIST */ return list; } int ListExport(List *l, Pool *p) { if(p == NULL || p->outf == NULL) { return 0; } PoolFPrint(p, p->outf, "LIST\n"); while(l != NULL) { PoolFPrint(p, p->outf, ""); if(!GeomStreamOut( p, l->carhandle, l->car )) { return 0; } l = l->cdr; } return 1; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/list/list.h0000644000175000017500000000406712310110200015026 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef LISTDEF #define LISTDEF #include "bbox.h" #define LISTMAGIC GeomMagic ('l', 1) typedef struct List List; extern Geom *ListRemove( Geom *list, Geom *car_of_member ); extern Geom *ListAppend( Geom *list, Geom *new_member_car ); extern GeomClass *ListClass; extern GeomClass *ListMethods( void ); extern char *ListName( void ); extern List *ListLoad( char *fname ); extern List *ListFLoad( FILE *f, char *fname ); extern BBox *ListBound( List *, Transform, TransformN *TN); extern Geom *ListBoundSphere( List *, Transform, TransformN *TN, int *axes, int ); extern List *ListTransform( List *, Transform, TransformN* ); extern List *ListRotate( List *, float, Point * ); extern List *ListTranslate( List *, float, float, float ); extern List *ListScale( List *, float, float, float ); extern List *ListEvert( List * ); extern Geom *ListReplace( List *, Geom * ); extern List *ListDraw( List * ); extern List *ListSave( List *, char * ); extern List *ListFSave( List *, FILE *file, char *fname ); extern int ListGet( List *, int attr, void *attrp ); extern List *ListImport( Pool * ); #endif /*LISTDEF*/ geomview-1.9.5/src/lib/gprim/list/listP.h0000644000175000017500000000311712310110200015141 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef LISTPDEF #define LISTPDEF #include "geomclass.h" #include "list.h" struct List { GEOMFIELDS; Geom *car; Handle *carhandle; struct List *cdr; }; extern List *ListCreate( List *exist, GeomClass *, va_list *a_list); extern void ListDelete( List * ); extern List *ListCopy( List * ); extern List *ListImport( Pool * ); extern int ListExport( List *, Pool * ); extern Geom *ListPick(List *list, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes); extern List *ListBSPTree(List *list, BSPTree *bsptree, int action); extern List *ListDice(List *list, int nu, int nv); #endif /*LISTPDEF*/ geomview-1.9.5/src/lib/gprim/list/Headers0000644000175000017500000000001712310110200015167 00000000000000list.h listP.h geomview-1.9.5/src/lib/gprim/mesh/0000755000175000017500000000000012310165602013754 500000000000000geomview-1.9.5/src/lib/gprim/mesh/Makefile.in0000644000175000017500000005031312310165554015751 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/mesh DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libmesh_la_LIBADD = am_libmesh_la_OBJECTS = meshbound.lo meshclass.lo meshcopy.lo \ meshcreate.lo meshdelete.lo meshdice.lo meshdraw.lo \ meshevert.lo meshload.lo meshnormal.lo meshpick.lo meshsave.lo \ meshsphere.lo meshtransform.lo libmesh_la_OBJECTS = $(am_libmesh_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libmesh_la_SOURCES) DIST_SOURCES = $(libmesh_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmesh.la libmesh_la_SOURCES = \ meshbound.c meshclass.c meshcopy.c meshcreate.c meshdelete.c meshdice.c meshdraw.c meshevert.c meshload.c meshnormal.c meshpick.c meshsave.c meshsphere.c meshtransform.c \ meshflag.h mesh.h meshP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/mesh/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/mesh/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libmesh.la: $(libmesh_la_OBJECTS) $(libmesh_la_DEPENDENCIES) $(EXTRA_libmesh_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libmesh_la_OBJECTS) $(libmesh_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshdelete.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshdice.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshevert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshnormal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshtransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/mesh/Makefile.am0000644000175000017500000000047312310110200015714 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmesh.la libmesh_la_SOURCES = \ meshbound.c meshclass.c meshcopy.c meshcreate.c meshdelete.c meshdice.c meshdraw.c meshevert.c meshload.c meshnormal.c meshpick.c meshsave.c meshsphere.c meshtransform.c \ meshflag.h mesh.h meshP.h geomview-1.9.5/src/lib/gprim/mesh/meshbound.c0000644000175000017500000000743512310110200016015 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" #include "meshP.h" BBox *MeshBound(Mesh *mesh, Transform T, TransformN *TN) { int n; HPoint3 *p; HPoint3 min, max; HPoint3 clean, tmp; n = mesh->nu * mesh->nv; p = mesh->p; min = *p; while(--n >= 0 && !finite(p->x + p->y + p->z + p->w)) p++; if(n <= 0) return NULL; /* No finite elements! */ /* First handle the case without transformations, this means that we return a 3d bbox for 3d meshs, and a 4d bboy for 4d meshs. */ if ((T == TM_IDENTITY || !T) && !TN) { if (!T && (mesh->geomflags & VERT_4D)) { max = min; while(--n >= 0) { Pt4MinMax(&min, &max, ++p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_4D, 1, CR_END); } else { HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { HPt3MinMax(&min, &max, ++p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *ptN; HPointN *minN; HPointN *maxN; BBox *result; ptN = HPtNCreate(5, NULL); if (mesh->geomflags & VERT_4D) { Pt4ToHPtN(&min, ptN); } else { HPt3ToHPtN(&min, NULL, ptN); } minN = HPtNTransform(TN, ptN, NULL); HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); while(--n >= 0) { if (mesh->geomflags & VERT_4D) { Pt4ToHPtN(++p, ptN); } else { HPt3ToHPtN(++p, NULL, ptN); } HPtNTransform(TN, ptN, ptN); HPtNMinMax(minN, maxN, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(ptN); HPtNDelete(minN); HPtNDelete(maxN); return result; } /* A 3d bbox is requested, with transformations */ if (T) { /* ordinary 3d transform */ if (false && (mesh->geomflags & VERT_4D)) { /* We operate on the 3d x,y,z space */ min.w = 1.0; HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { tmp = *(++p); tmp.w = 1.0; HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } } else { /* ordinary 3d object */ HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { tmp = *(++p); HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/mesh/meshclass.c0000644000175000017500000000462312310110200016007 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "meshP.h" static GeomClass *aMeshMethods = NULL; int MeshPresent = 1; static char meshName[] = "mesh"; extern Mesh *MeshCreate( va_list ); extern Mesh *MeshDelete( Mesh * ); extern Mesh *MeshCopy( Mesh * ); char * MeshName() { return meshName; } GeomClass *MeshMethods(void) { if (!aMeshMethods) { aMeshMethods = GeomClassCreate(meshName); aMeshMethods->name = MeshName; aMeshMethods->methods = (GeomMethodsFunc *) MeshMethods; aMeshMethods->create = (GeomCreateFunc *) MeshCreate; aMeshMethods->Delete = (GeomDeleteFunc *) MeshDelete; aMeshMethods->copy = (GeomCopyFunc *) MeshCopy; aMeshMethods->fload = (GeomFLoadFunc *) MeshFLoad; aMeshMethods->fsave = (GeomFSaveFunc *) MeshFSave; aMeshMethods->bound = (GeomBoundFunc *) MeshBound; aMeshMethods->boundsphere = (GeomBoundSphereFunc *) MeshBoundSphere; aMeshMethods->evert = (GeomEvertFunc *) MeshEvert; aMeshMethods->draw = (GeomDrawFunc *) MeshDraw; aMeshMethods->bsptree = (GeomBSPTreeFunc *) MeshBSPTree; aMeshMethods->pick = (GeomPickFunc *) MeshPick; aMeshMethods->transform = (GeomTransformFunc *) MeshTransform; aMeshMethods->transformto = (GeomTransformToFunc *) MeshTransform; } return aMeshMethods; } geomview-1.9.5/src/lib/gprim/mesh/meshcopy.c0000644000175000017500000000462112310110200015652 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "meshP.h" Mesh * MeshCopy(Mesh *obj) { Mesh *m; Mesh *om = obj; int n; if (om == NULL) return (NULL); if ( (m = GeomNew(Mesh)) == NULL ) { GeomError(0,"Can't allocate space for mesh"); return (NULL); } *m = *om; /* copy scalar fields */ n = m->nu * m->nv; if ((m->p = GeomNewN(HPoint3, n)) == NULL) { GeomError(0,"Can't allocate space for mesh vertices"); return (NULL); } memcpy(m->p, om->p, n * sizeof(HPoint3)); if (m->geomflags & MESH_N) { if ((m->n = GeomNewN(Point3, n)) == NULL) { GeomError(0,"Can't allocate space for mesh normals"); return(NULL); } memcpy(m->n, om->n, n * sizeof(Point3)); } else m->n = NULL; if (m->geomflags & MESH_C) { if ((m->c = GeomNewN(ColorA, n)) == NULL) { GeomError(0,"Can't allocate space for mesh colors"); return(NULL); } memcpy(m->c, om->c, n * sizeof(ColorA)); } else { m->c = NULL; } if (m->geomflags & MESH_U) { if ((m->u = GeomNewN(TxST, n)) == NULL) { GeomError(0,"Can't allocate space for mesh texture"); return(NULL); } memcpy(m->u, om->u, n * sizeof(TxST)); } else m->u = NULL; return m; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/mesh/meshcreate.c0000644000175000017500000001210612310110200016140 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "meshP.h" static int tossmesh(Mesh *); static int meshfield(int copy, int amount, void **fieldp, void *value, char *name); Mesh * MeshCreate (Mesh *exist, GeomClass *classp, va_list *a_list) { Mesh *mesh; int attr, copy = 1; int npts; Point3 *p3; ColorA *c; c = NULL; p3 = NULL; if (exist == NULL) { mesh = OOGLNewE(Mesh, "MeshCreate mesh"); memset(mesh, 0, sizeof(Mesh)); GGeomInit (mesh, classp, MESHMAGIC, NULL); mesh->bsptree = NULL; mesh->nu = 1; mesh->nv = 1; mesh->umin = -1; mesh->umax = -1; mesh->vmin = -1; mesh->vmax = -1; } else { /* Check that exist is a Mesh... */ mesh = exist; } npts = mesh->nu * mesh->nv; mesh->pdim = 4; /* hard-wired */ while ((attr = va_arg (*a_list, int))) switch (attr) { case CR_FLAG: mesh->geomflags = va_arg (*a_list, int); break; case CR_NU: mesh->nu = va_arg (*a_list, int); tossmesh(mesh); npts = mesh->nu * mesh->nv; break; case CR_NV: mesh->nv = va_arg (*a_list, int); tossmesh(mesh); npts = mesh->nu * mesh->nv; break; case CR_UMIN: mesh->umin = va_arg (*a_list, int); break; case CR_UMAX: mesh->umax = va_arg (*a_list, int); break; case CR_VMIN: mesh->vmin = va_arg (*a_list, int); break; case CR_VMAX: mesh->vmax = va_arg (*a_list, int); break; case CR_POINT: mesh->geomflags &= ~MESH_NQ; if(mesh->p) OOGLFree(mesh->p); mesh->p = OOGLNewNE(HPoint3, npts, "mesh points"); p3 = va_arg(*a_list, Point3 *); Pt3ToHPt3(p3, mesh->p, npts); if(!copy) OOGLFree(p3); break; case CR_POINT4: mesh->geomflags &= ~MESH_NQ; meshfield(copy, npts*sizeof(HPoint3), (void **)(void *)&mesh->p, (void *)va_arg (*a_list, HPoint3 *), "mesh points"); break; case CR_NORMAL: mesh->geomflags = (mesh->geomflags & ~MESH_N) | (MESH_N & meshfield(copy, npts*sizeof(Point3), (void **)(void *)&mesh->n, (void *)va_arg (*a_list, Point3 *), "mesh normals")); break; case CR_U: mesh->geomflags = (mesh->geomflags & ~MESH_U) | (MESH_U & meshfield(copy, npts*sizeof(TxST), (void **)(void *)&mesh->u, (void *)va_arg (*a_list, TxST *), "mesh texture coords")); break; case CR_COLOR: mesh->geomflags &= ~COLOR_ALPHA; mesh->geomflags = (mesh->geomflags & ~MESH_C) | (MESH_C & meshfield(copy, npts*sizeof(ColorA), (void **)(void *)&mesh->c, (void *)(c = va_arg (*a_list, ColorA *)), "mesh colors")); break; default: if (GeomDecorate (mesh, ©, attr, a_list)) { GeomError (0, "MeshCreate: Undefined option: %d", attr); OOGLFree (mesh); return NULL; } } /* set submesh dimensions if not otherwise set */ if (mesh->umin == -1) mesh->umin = 0; if (mesh->umax == -1) mesh->umax = mesh->nu-1; if (mesh->vmin == -1) mesh->vmin = 0; if (mesh->vmax == -1) mesh->vmax = mesh->nv-1; if (c) { int i; for (i = 0; i < mesh->nu*mesh->nv; i++) { if (mesh->c[i].a < 1.0) { mesh->geomflags |= COLOR_ALPHA; } } } return mesh; } static int tossmesh(Mesh *m) { if(m->p) OOGLFree(m->p); if(m->n) OOGLFree(m->n); if(m->nq) OOGLFree(m->nq); if(m->c) OOGLFree(m->c); if(m->u) OOGLFree(m->u); m->p = NULL; m->n = NULL; m->nq = NULL; m->c = NULL; m->u = NULL; m->umin = m->umax = m->vmin = m->vmax = -1; m->geomflags &= ~MESH_NQ; return 0; } static int meshfield(int copy, int amount, void **fieldp, void *value, char *name) { (void)name; if(value) { if(copy) { if(*fieldp == NULL) *fieldp = OOGLNewNE(char, amount, name); memcpy(*fieldp, value, amount); } else { if(*fieldp) OOGLFree(*fieldp); *fieldp = value; } return ~0; } else { if(*fieldp) OOGLFree(*fieldp); *fieldp = NULL; return 0; } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/mesh/meshdelete.c0000644000175000017500000000264612310110200016147 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "meshP.h" Mesh * MeshDelete(Mesh *m) { if (m) { if (m->p) GeomFree(m->p); if (m->n) GeomFree(m->n); if (m->nq) GeomFree(m->nq); if (m->c) GeomFree(m->c); if (m->u) GeomFree(m->u); } return NULL; } geomview-1.9.5/src/lib/gprim/mesh/meshdice.c0000644000175000017500000000343512310110200015606 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "meshP.h" Mesh * MeshDice(m, proc) Mesh *m; int (*proc) (); { int u, v; int nu, nv; float umin, umax, vmin, vmax; float fu, fv; Point3 *n; HPoint3 *p; if (m && proc) { umin = m->umin; umax = m->umax; vmin = m->vmin; vmax = m->vmax; nu = m->nu; nv = m->nv; p = m->p; n = m->n; for (v = 0; v < nv; v++) { for (u = 0; u < nu; u++) { fu = umin + ((umax - umin) * u) / (nu - 1); fv = vmin + ((vmax - vmin) * v) / (nv - 1); (*proc) (fu, fv, p, n); if (n) n++; p++; } } } return m; } geomview-1.9.5/src/lib/gprim/mesh/meshdraw.c0000644000175000017500000001514612310110200015641 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "meshP.h" #include "mgP.h" #include "hpointn.h" #include "cmodel.h" #include "bsptreeP.h" static int draw_projected_mesh(mgNDctx *NDctx, Mesh *mesh) { Mesh m = *mesh; HPointN *h; HPoint3 *op, *np; int i, colored = 0, alpha = 0; int npts = m.nu * m.nv; mgNDmapfunc mapHPtN = NDctx->mapHPtN; const Appearance *ap = &_mgc->astk->ap; const Material *mat = &_mgc->astk->mat; int normal_need; m.p = OOGLNewNE(HPoint3, npts, "projected points"); m.n = NULL; m.nq = NULL; m.c = OOGLNewNE(ColorA, npts, "ND colors"); m.ap = NULL; RefInit(MeshRef(&m), mesh->magic); DblListInit(&m.pernode); h = HPtNCreate(5, NULL); if (ap->flag & APF_KEEPCOLOR) { colored = 0; } else { HPoint3 dummyv; ColorA dummyc; /* Dummy transform to determine whether we have ND colors or not */ colored = mapHPtN(NDctx, h, &dummyv, &dummyc); } m.geomflags &= ~VERT_4D; for(i = 0, op = mesh->p, np = m.p; i < npts; i++, op++, np++) { if (mesh->geomflags & VERT_4D) { /* Set the point's first four components from our 4-D mesh vertex */ Pt4ToHPtN(op, h); } else { /* Set the point's first THREE components from our 4-D mesh vertex */ HPt3ToHPtN(op, NULL, h); } if (colored) { mapHPtN(NDctx, h, np, &m.c[i]); if (m.c[i].a < 1.0) { alpha = 1; } } else { mapHPtN(NDctx, h, np, NULL); } } if (colored) { if (alpha) { m.geomflags |= COLOR_ALPHA; } else { m.geomflags &= ~COLOR_ALPHA; } m.geomflags |= MESH_C; } /* The drawing routines might need either polygon or vertex normals, * so if either is missing and either might be needed, we force it * to be computed. */ m.geomflags &= ~(MESH_N|MESH_NQ); normal_need = (ap->flag & APF_NORMALDRAW) ? MESH_N|MESH_NQ : 0; if (ap->flag & APF_FACEDRAW) { switch (ap->shading) { case APF_FLAT: case APF_VCFLAT: normal_need |= MESH_NQ; break; case APF_SMOOTH: normal_need |= MESH_N; break; default: break; } if (GeomHasAlpha(MeshGeom(&m), ap)) { /* could re-use per quad normals here */ } } if (normal_need) { MeshComputeNormals(&m, normal_need); } if ((_mgc->astk->flags & MGASTK_SHADER) && !(m.geomflags & GEOM_ALPHA)) { ColorA *c = colored ? m.c : (mat->override & MTF_DIFFUSE) ? NULL : mesh->c; Point3 *n; switch (ap->shading) { case APF_FLAT: case APF_VCFLAT: n = m.nq; break; case APF_SMOOTH: n = m.n; break; default: n = NULL; break; } if (c) { (*_mgc->astk->shader)(npts, m.p, n, c, m.c); } else { for(i = 0; i < npts; i++) { (*_mgc->astk->shader)(1, m.p + i, n + i, (ColorA *)&_mgc->astk->mat.diffuse, m.c + i); } } colored = true; } mgmeshst(MESH_MGWRAP(m.geomflags), m.nu, m.nv, m.p, m.n, m.nq, colored ? m.c : mesh->c, mesh->u, m.geomflags); /* Generate a BSP-tree if the object or parts of it might be * translucent. */ if (NDctx->bsptree && (m.geomflags & GEOM_ALPHA)) { GeomNodeDataMove(MeshGeom(mesh), MeshGeom(&m)); GeomBSPTree(MeshGeom(&m), NDctx->bsptree, BSPTREE_ADDGEOM); GeomNodeDataMove(MeshGeom(&m), MeshGeom(mesh)); } if (m.n) { OOGLFree(m.n); } if (m.nq) { OOGLFree(m.nq); } HPtNDelete(h); OOGLFree(m.p); OOGLFree(m.c); return 0; } Mesh * MeshDraw(Mesh *mesh) { mgNDctx *NDctx = NULL; const Appearance *ap = &_mgc->astk->ap; mgctxget(MG_NDCTX, &NDctx); if(NDctx) { draw_projected_mesh(NDctx, mesh); return mesh; } if ((mesh->geomflags & (MESH_N|MESH_NQ)) != (MESH_N|MESH_NQ)) { int need = 0; if (ap->flag & APF_NORMALDRAW) { need = MESH_N|MESH_NQ; } else if (ap->flag & APF_FACEDRAW) { switch (ap->shading) { case APF_FLAT: case APF_VCFLAT: need |= MESH_NQ; break; case APF_SMOOTH: need |= MESH_N; break; default: break; } } if (need) { MeshComputeNormals(mesh, need); } } if (_mgc->space & TM_CONFORMAL_BALL) { cmodel_clear(_mgc->space); if (!(mesh->geomflags & MESH_N)) { MeshComputeNormals(mesh, MESH_N); } cm_draw_mesh(mesh); return mesh; } else if((_mgc->astk->flags & MGASTK_SHADER) && !(mesh->geomflags & GEOM_ALPHA)) { int i, npts = mesh->nu * mesh->nv; #if !NO_ALLOCA ColorA *c = (ColorA *)alloca(npts * sizeof(ColorA)); #else ColorA *c = OOGLNewNE(ColorA, npts, "software shaded mesh colors"); #endif Point3 *n; switch (ap->shading) { case APF_FLAT: case APF_VCFLAT: n = mesh->nq; break; case APF_SMOOTH: n = mesh->n; break; default: n = NULL; break; } if(mesh->c && !(_mgc->astk->mat.override & MTF_DIFFUSE)) { (*_mgc->astk->shader)(npts, mesh->p, n, mesh->c, c); } else { for(i = 0; i < npts; i++) { (*_mgc->astk->shader)(1, mesh->p + i, n + i, (ColorA *)&_mgc->astk->mat.diffuse, c + i); } } mgmeshst(MESH_MGWRAP(mesh->geomflags), mesh->nu, mesh->nv, mesh->p, mesh->n, mesh->nq, c, mesh->u, mesh->geomflags | MESH_C); #if !!NO_ALLOCA OOGLFree(c); #endif } else { mgmeshst(MESH_MGWRAP(mesh->geomflags), mesh->nu, mesh->nv, mesh->p, mesh->n, mesh->nq, mesh->c, mesh->u, mesh->geomflags); } return mesh; } Mesh *MeshBSPTree(Mesh *mesh, BSPTree *tree, int action) { if (!never_translucent((Geom *)mesh) && action == BSPTREE_ADDGEOM) { BSPTreeAddObject(tree, (Geom *)mesh); } return mesh; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/mesh/meshevert.c0000644000175000017500000000331012310110200016017 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "meshP.h" Mesh *MeshEvert(Mesh *m) { int i; Point3 *n; if (m) { if (m->geomflags & MESH_EVERT) m->geomflags &= ~MESH_EVERT; else m->geomflags |= MESH_EVERT; if (m->geomflags & MESH_N) { for (i = 0, n = m->n; i < m->nu*m->nv; i++,n++){ n->x = -n->x; n->y = -n->y; n->z = -n->z; } } if (m->geomflags & MESH_NQ) { for (i = 0, n = m->nq; i < m->nu*m->nv; i++,n++){ n->x = -n->x; n->y = -n->y; n->z = -n->z; } } MeshComputeNormals(m, MESH_N|MESH_NQ); } return m; } geomview-1.9.5/src/lib/gprim/mesh/meshload.c0000644000175000017500000001130212310110200015611 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "meshP.h" /* actually u, the texture parameter */ static bool getmeshvert(IOBFILE *file, int flag, int u, int v, HPoint3 *p, Point3 *n, ColorA *c, TxST *st) { int binary = flag&MESH_BINARY; if (flag & MESH_Z) { p->x = (float) u; p->y = (float) v; p->w = 1.0; if (iobfgetnf(file, 1, &p->z, binary) <= 0) { return false; } } else if (flag & MESH_4D) { if (iobfgetnf(file, 4, (float *)p, binary) < 4) { return false; } } else { if (iobfgetnf(file, 3, (float *)p, binary) < 3) { return false; } p->w = 1.0; } if ((flag & MESH_N) && iobfgetnf(file, 3, (float *)n, binary) < 3) { return false; } if ((flag & MESH_C) && iobfgetnf(file, 4, (float *)c, binary) < 4) { return false; } if (flag & MESH_U) { if (iobfgetnf(file, 2, (float *)st, binary) < 2) { return false; } else { /* consume unused "r" component for compatibility */ float dummy; int c; if ((c = iobfnextc(file, 1)) != '\n' && c != '}' && c != EOF) { if (iobfgetnf(file, 1, &dummy, 0) < 1) { return false; } } } } return true; } /* static char oldbinary; *//* Old binary format -- has 3-component colors */ static int getheader(IOBFILE *file) { int i, flag; char *token; static char keys[] = "UCNZ4Uuv"; static int bit[] = { MESH_U, MESH_C, MESH_N, MESH_Z, MESH_4D, MESH_U, MESH_UWRAP, MESH_VWRAP }; /* Parse [ST][C][N][Z][4][U][u][v]MESH[ BINARY]\n */ flag = 0; token = GeomToken(file); for (i = 0; keys[i] != '\0'; i++) { if (*token == keys[i]) { flag |= bit[i]; token++; } } if (strcmp(token, "MESH") != 0) { return(-1); } if (iobfnextc(file, 1) == 'B') { if (iobfexpectstr(file, "BINARY")) { return(-1); } flag |= MESH_BINARY; if (iobfnextc(file, 1) == '\n') { (void) iobfgetc(file); /* Toss \n */ } } return(flag); } Mesh * MeshFLoad(IOBFILE *file, char *fname) { Mesh m; int n; int i, u, v; int binary; if (!file) return NULL; if ((m.geomflags = getheader(file)) == -1) return NULL; binary = m.geomflags & MESH_BINARY; if (iobfgetni(file, 1, &m.nu, binary) <= 0 || iobfgetni(file, 1, &m.nv, binary) <= 0) { OOGLSyntax(file,"Reading MESH from \"%s\": expected mesh grid size", fname); return NULL; } if (m.nu <= 0 || m.nv <= 0 || m.nu > 9999999 || m.nv > 9999999) { OOGLSyntax(file,"Reading MESH from \"%s\": invalid mesh size %d %d", fname,m.nu,m.nv); return NULL; } n = m.nu * m.nv; m.p = OOGLNewNE(HPoint3, n, "MeshFLoad: vertices"); m.n = NULL; m.u = NULL; m.c = NULL; if (m.geomflags & MESH_N) { m.n = OOGLNewNE(Point3, n, "MeshFLoad: normals"); } if (m.geomflags & MESH_C) { m.c = OOGLNewNE(ColorA, n, "MeshFLoad: colors"); } if (m.geomflags & MESH_U) { m.u = OOGLNewNE(TxST, n, "MeshFLoad: texture coords"); } for (i = 0, v = 0; v < m.nv; v++) { for (u = 0; u < m.nu; u++, i++) { if (getmeshvert(file, m.geomflags, u, v, &m.p[i], &m.n[i], &m.c[i], &m.u[i]) == 0) { OOGLSyntax(file, "Reading MESH from \"%s\": bad element (%d,%d) of (%d,%d)", fname, u,v, m.nu, m.nv); return NULL; } } } return (Mesh *)GeomCCreate (NULL, MeshMethods(), CR_NOCOPY, CR_4D, (m.geomflags & MESH_4D), CR_FLAG, m.geomflags, CR_NU, m.nu, CR_NV, m.nv, CR_POINT4, m.p, CR_COLOR, m.c, CR_NORMAL, m.n, CR_U, m.u, NULL); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/mesh/meshnormal.c0000644000175000017500000001745412310110200016200 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Claus-Justus Heine */ #include "meshP.h" static void mnorm(HPoint3 *ap, Point3 *an, int nu, int nv, bool uwrap, bool vwrap, bool evert); static void mnormq(HPoint3 *ap, Point3 *an, int nu, int nv, bool uwrap, bool vwrap, bool evert); Mesh * MeshComputeNormals(Mesh *m, int need) { HPoint3 *normp = NULL, *normptr, *pptr; int i; need &= ~m->geomflags; if (!(need & (MESH_N|MESH_NQ))) { return m; } /* if this a '4D' mesh, we need to truncate (temporarily) * before computing the normals */ if (m->geomflags & VERT_4D) { normp = GeomNewN(HPoint3, m->nu * m->nv); for (normptr = normp, pptr = m->p, i=0; i < m->nu * m->nv; ++i, ++pptr, ++normptr) { #if 0 HPt3Dehomogenize(pptr, normptr); #else Pt3ToHPt3((Point3 *)pptr, normptr, 1); #endif } } if (need & MESH_N) { if (m->n) { GeomFree(m->n); } m->n = GeomNewN(Point3, m->nu * m->nv); m->geomflags |= MESH_N; mnorm(m->geomflags & VERT_4D ? normp : m->p, m->n, m->nu, m->nv, m->geomflags & MESH_UWRAP, m->geomflags & MESH_VWRAP, m->geomflags & MESH_EVERT); } if (need & MESH_NQ) { if (m->nq) { GeomFree(m->nq); } m->nq = GeomNewN(Point3, m->nu * m->nv); m->geomflags |= MESH_NQ; mnormq(m->geomflags & VERT_4D ? normp : m->p, m->nq, m->nu, m->nv, m->geomflags & MESH_UWRAP, m->geomflags & MESH_VWRAP, m->geomflags & MESH_EVERT); } if (m->geomflags & VERT_4D) GeomFree(normp); return m; } static void QuadNormal(HPoint3 *v[4], Point3 *nu_av) { int n; HPoint3 *v1, *v2, *v3, **vp; Point3 nu; nu_av->x = nu_av->y = nu_av->z = 0.0; n = 4; v1 = v[n-2]; v2 = v[n-1]; vp = v; #define ANTI(P,Q) \ ((v2->P - v1->P) * (v3->Q - v1->Q) - \ (v2->Q - v1->Q) * (v3->P - v1->P)) do { v3 = *vp++; nu.x = ANTI(y,z); nu.y = ANTI(z,x); nu.z = ANTI(x,y); if (Pt3Dot(&nu, nu_av) >= 0) { Pt3Add(nu_av, &nu, nu_av); } else { Pt3Sub(nu_av, &nu, nu_av); } v1 = v2; v2 = v3; } while(--n > 0); Pt3Unit(nu_av); } static void mnormq(HPoint3 *ap, Point3 *an, int nu, int nv, bool uwrap, bool vwrap, bool evert) { int v0 = 1, prev0v = 0; int u0 = 1, prev0u = 0; int u, v, prevu, prevv; HPoint3 *vq[4]; (void)evert; if (vwrap) { v0 = 0, prev0v = nv-1; } if (uwrap) { u0 = 0, prev0u = nu-1; } #define MESHIDX(u, v) ((v)*nu + (u)) for (prevv = prev0v, v = v0; v < nv; prevv = v, v++) { for (prevu = prev0u, u = u0; u < nu; prevu = u, u++) { /* quad normals are ordered according to the least-numbered * vertex, i.e. the normal of the quad * * (v,u) (v,u+1) * (v+1,u) (v+1,u+1) * * is to be found at position MESHIDX(v, u) */ vq[0] = ap + MESHIDX(prevu, prevv); vq[1] = ap + MESHIDX(u, prevv); vq[2] = ap + MESHIDX(u, v); vq[3] = ap + MESHIDX(prevu, v); QuadNormal(vq, an + MESHIDX(u, prevv /*prevu, prevv*/)); } /* Also initialize the normal at position 0 (if !u_wrap) */ if (!uwrap) { an[MESHIDX(0, prevv)] = an[MESHIDX(1, prevv)]; } } if (!vwrap) { for (u = 0; u < nu; u++) { an[MESHIDX(u, nv-1)] = an[MESHIDX(u, nv-2)]; } } #undef MESHIDX } static void mnorm(HPoint3 *ap, Point3 *an, int nu, int nv, bool uwrap, bool vwrap, bool evert) { HPoint3 *prev, *next; Point3 *n; int k; int u, v; Pt3Coord x,y,z, norm; Pt3Coord unit; /* * We set the normal at each point to be the mean of the * cross products at the four adjacent points. I.e.: * n Given mesh point p and its four orthogonal neighbors * w p e e, n, w, s we define displacements E=e-p, N=n-p, ... * s and compute normal(p) = ExN + NxW + WxS + SxE * This turns out to be equal to (e-w) x (n-s) -- independent of p! * * Since the index arithmetic gets a bit messy at the boundaries * we make two passes. Pass 1 computes e-w and holds it in * the array to be filled with normals. * Pass 2 computes n-s, takes the cross product and normalizes. */ unit = evert ? -1.0 : 1.0; for (u = 0; u < nu; u++) { if (u == 0) { prev = &ap[uwrap ? nu-1 : 0]; next = &ap[u+1]; } else if (u == nu-1) { prev = &ap[u-1]; next = &ap[uwrap ? 0 : u]; } else { prev = &ap[u-1]; next = &ap[u+1]; } n = &an[u]; k = nv; do { n->x = next->x - prev->x; /* e - w */ n->y = next->y - prev->y; n->z = next->z - prev->z; n += nu; /* advance to next v row */ prev += nu; next += nu; } while(--k > 0); } for (v = 0; v < nv; v++) { if (v == 0) { prev = &ap[vwrap ? nu*(nv-1) : 0]; next = &ap[nu*1]; } else if (v == nv-1) { prev = &ap[nu*(v-1)]; next = &ap[vwrap ? 0 : nu*v]; } else { prev = &ap[nu*(v-1)]; next = &ap[nu*(v+1)]; } n = &an[nu*v]; k = nu; do { Point3 t; t.x = next->x - prev->x; t.y = next->y - prev->y; t.z = next->z - prev->z; x = n->y * t.z - n->z * t.y; y = n->z * t.x - n->x * t.z; z = n->x * t.y - n->y * t.x; norm = x*x + y*y + z*z; if (norm == 0.0) { /* * Oh no, degenerate norm. * Let's hope it happened because (part of) a row of * mesh points coincided -- maybe even though N=S, * NE != SE or NW != SW. */ if (t.x == 0.0 && t.y == 0.0 && t.z == 0.0) { if (k > 1) { t.x = (next+1)->x - (prev+1)->x; t.y = (next+1)->y - (prev+1)->y; t.z = (next+1)->z - (prev+1)->z; } if (t.x == 0.0 && t.y == 0.0 && t.z == 0.0 && k < nu) { t.x = (next-1)->x - (prev-1)->x; t.y = (next-1)->y - (prev-1)->y; t.z = (next-1)->z - (prev-1)->z; } } if (n->x == 0.0 && n->y == 0.0 && n->z == 0.0) { /* Do likewise in E-W direction. */ HPoint3 *cur = &ap[nu*(v+1) - k]; if (k == 1) cur--; else if (k == nu) cur++; if (v > 0) { cur -= nu; /* SE-SW */ n->x = (cur+1)->x - (cur-1)->x; n->y = (cur+1)->y - (cur-1)->y; n->z = (cur+1)->z - (cur-1)->z; } if (n->x==0.0 && n->y==0.0 && n->z==0.0 && v < nv-1) { cur += 2*nu; /* NE-NW */ n->x = (cur+1)->x - (cur-1)->x; n->y = (cur+1)->y - (cur-1)->y; n->z = (cur+1)->z - (cur-1)->z; } } x = n->y * t.z - n->z * t.y; y = n->z * t.x - n->x * t.z; z = n->x * t.y - n->y * t.x; norm = x*x + y*y + z*z; if (norm == 0.0) { /* Oh well. */ n->x = unit; norm = 1.0; } } norm = unit / sqrt(norm); n->x = x*norm; n->y = y*norm; n->z = z*norm; n++; /* Next u column */ prev++; next++; } while(--k > 0); } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/mesh/meshpick.c0000644000175000017500000001176412310110200015634 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include "meshP.h" #include "pickP.h" #include "appearance.h" Mesh * MeshPick(Mesh *mesh, Pick *pick, Appearance *ap, Transform T, TransformN *TN, int *axes) { Point3 plist[4]; int nu, nv, maxnu, maxnv; int foundu, foundv, v4d; unsigned int apflag = 0; HPt3Coord xa, xb, xc, xd; foundu = foundv = -1; v4d = (mesh->geomflags & VERT_4D) != 0; maxnu = mesh->nu; maxnv = mesh->nv; /* Make sure that vects do not as visible - otherwise they * will wreak havoc with the edge picking stuff. */ if (ap != NULL) { apflag = ap->flag; ap->flag &= ~APF_VECTDRAW; } for (nv = 0; nv < ((mesh->geomflags & MESH_VWRAP) ? maxnv : maxnv-1); nv++) { for (nu =0; nu < ((mesh->geomflags & MESH_UWRAP) ? maxnu : maxnu-1); nu++) { /* Demand that at least 1 of the vertices be in front of the viewer. * Note: we must ensure that all four are evaluated! */ if (TN) { xa = HPt3NTransPt3(TN, axes, &MESHPOINT(nu, nv, mesh, mesh->p), v4d, &plist[0]); xb = HPt3NTransPt3(TN, axes, &MESHPOINT(nu+1, nv, mesh, mesh->p), v4d, &plist[1]); xc = HPt3NTransPt3(TN, axes, &MESHPOINT(nu+1, nv+1, mesh, mesh->p), v4d, &plist[2]); xd = HPt3NTransPt3(TN, axes, &MESHPOINT(nu, nv+1, mesh, mesh->p), v4d, &plist[3]); } else { xa = HPt3TransPt3(T, &MESHPOINT(nu, nv, mesh, mesh->p), &plist[0]); xb = HPt3TransPt3(T, &MESHPOINT(nu+1, nv, mesh, mesh->p), &plist[1]); xc = HPt3TransPt3(T, &MESHPOINT(nu+1, nv+1, mesh, mesh->p), &plist[2]); xd = HPt3TransPt3(T, &MESHPOINT(nu, nv+1, mesh, mesh->p), &plist[3]); } if((0 < xa) || (0 < xb) || (0 < xc) || (0 < xd)) { if (PickFace(4, plist, pick, ap)) { foundu = nu; foundv = nv; } } } } if (ap != NULL) ap->flag = apflag; if (foundu == -1) return NULL; if (pick->found & PW_VERT) { pick->vi = MESHINDEX(foundu + ((pick->vi == 1 || pick->vi == 2) ? 1 : 0), foundv + pick->vi/2, mesh); if (TN) HPt3NTransHPt3(TN, axes, &mesh->p[pick->vi], v4d, &pick->v); else HPt3Transform(T, &mesh->p[pick->vi], &pick->v); } if (pick->found & PW_EDGE) { pick->ei[0] = MESHINDEX(foundu + ((pick->ei[0] == 1 || pick->ei[0] == 2) ? 1 : 0), foundv + pick->ei[0]/2, mesh); pick->ei[1] = MESHINDEX(foundu + ((pick->ei[1] == 1 || pick->ei[1] == 2) ? 1 : 0), foundv + pick->ei[1]/2, mesh); if (TN) { HPt3NTransHPt3(TN, axes, &mesh->p[pick->ei[0]], v4d, &pick->e[0]); HPt3NTransHPt3(TN, axes, &mesh->p[pick->ei[1]], v4d, &pick->e[1]); } else { HPt3Transform(T, &mesh->p[pick->ei[0]], &pick->e[0]); HPt3Transform(T, &mesh->p[pick->ei[1]], &pick->e[1]); } } if (pick->found & PW_FACE) { if(pick->f) OOGLFree(pick->f); pick->f = OOGLNewNE(HPoint3, 4, "Mesh pick"); pick->fi = MESHINDEX(foundu, foundv, mesh); if (TN) { HPt3NTransHPt3(TN, axes, &MESHPOINT(foundu, foundv, mesh, mesh->p), v4d, &pick->f[0]); HPt3NTransHPt3(TN, axes, &MESHPOINT(foundu+1, foundv, mesh, mesh->p), v4d, &pick->f[1]); HPt3NTransHPt3(TN, axes, &MESHPOINT(foundu+1, foundv+1, mesh, mesh->p), v4d, &pick->f[2]); HPt3NTransHPt3(TN, axes, &MESHPOINT(foundu, foundv+1, mesh, mesh->p), v4d, &pick->f[3]); } else { HPt3Transform(T, &MESHPOINT(foundu, foundv, mesh, mesh->p), &pick->f[0]); HPt3Transform(T, &MESHPOINT(foundu+1, foundv, mesh, mesh->p), &pick->f[1]); HPt3Transform(T, &MESHPOINT(foundu+1, foundv+1, mesh, mesh->p), &pick->f[2]); HPt3Transform(T, &MESHPOINT(foundu, foundv+1, mesh, mesh->p), &pick->f[3]); } } if (TN) { pick->TprimN = TmNCopy(TN, pick->TprimN); memcpy(pick->axes, axes, sizeof(pick->axes)); } else TmCopy(T, pick->Tprim); return mesh; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/mesh/meshsave.c0000644000175000017500000000671712310110200015646 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "meshP.h" static void ign_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) { size_t result; result = fwrite(ptr, size, nmemb, stream); (void)result; } Mesh *MeshFSave(Mesh *m, FILE *outf) { int i, j; HPoint3 *p = m->p; Point3 *n = m->n; ColorA *c = m->c; TxST *u = m->u; if (!outf || !m) return NULL; if (m->n == NULL) m->geomflags &= ~MESH_N; if (m->c == NULL) m->geomflags &= ~MESH_C; if (m->u == NULL) m->geomflags &= ~MESH_U; if (m->geomflags & MESH_C) fputc('C', outf); if (m->geomflags & MESH_N) fputc('N', outf); if (m->geomflags & MESH_Z) fputc('Z', outf); if (m->geomflags & VERT_4D) fputc('4', outf); if (m->geomflags & MESH_U) fputc('U', outf); if (m->geomflags & MESH_UWRAP) fputc('u', outf); if (m->geomflags & MESH_VWRAP) fputc('v', outf); if (m->geomflags & MESH_BINARY) /* Hack -- should be sent by context */ { fprintf(outf, "MESH BINARY\n"); ign_fwrite(&m->nu, 4, 1, outf); ign_fwrite(&m->nv, 4, 1, outf); for (i = 0; i < m->nv; i++) { for (j = 0; j < m->nu; j++) { if (m->geomflags & MESH_Z) ign_fwrite(&p->z, 4, 1, outf); else if (m->geomflags & MESH_4D) ign_fwrite(p, 4, 4, outf); else ign_fwrite(p, 4, 3, outf); p++; if (m->geomflags & MESH_N) { ign_fwrite(n, 4, 3, outf); n++; } if (m->geomflags & MESH_C) { ign_fwrite(c, 4, 4, outf); c++; } if (m->geomflags & MESH_U) { ign_fwrite(u, 4, 3, outf); u++; } } } } else { fprintf(outf, "MESH\n%d %d\n", m->nu, m->nv); for (i = 0; i < m->nv; i++) { for (j = 0; j < m->nu; j++) { if(!(m->geomflags & MESH_Z)) fprintf(outf, "%.8g %.8g ", p->x, p->y); fprintf(outf, "%.8g ", p->z); if (m->geomflags & VERT_4D) fprintf(outf, "%.8g ", p->w); p++; if (m->geomflags & MESH_N) { fprintf(outf, " %.8g %.8g %.8g ", n->x, n->y, n->z); n++; } if (m->geomflags & MESH_C) { fprintf(outf, " %.3g %.3g %.3g %.3g ", c->r, c->g, c->b, c->a); c++; } if (m->geomflags & MESH_U) { fprintf(outf, " %.8g %.8g 0", u->s, u->t); u++; } fputc('\n', outf); } fputc('\n', outf); } } return m; } Mesh *MeshSave(Mesh *m, char *name) { Mesh *tm; FILE *outf; outf = fopen(name, "w"); if (!outf) { perror(name); return NULL; } tm = MeshFSave(m, outf); fclose(outf); return tm; } geomview-1.9.5/src/lib/gprim/mesh/meshsphere.c0000644000175000017500000000355412310110200016172 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "create.h" #include "meshP.h" #include "sphere.h" Geom *MeshBoundSphere(Mesh *mesh, Transform T, TransformN *TN, int *axes, int space) { Geom *sphere; if (TN) { /* Create a dummy sphere, the center will be corrected later */ sphere = GeomCreate("sphere", CR_SPACE, space, CR_END); SphereEncompassPoints((Sphere *)sphere, (float *)mesh->p, (mesh->geomflags & MESH_4D) != 0, 4, mesh->nu * mesh->nv, NULL, TN, axes); } else { if(mesh->geomflags & MESH_4D) return GeomBoundSphereFromBBox((Geom *)mesh, T, TN, axes, space); sphere = GeomCreate("sphere", CR_ENCOMPASS_POINTS, mesh->p, CR_NENCOMPASS_POINTS, (mesh->nu * mesh->nv), CR_AXIS, T, CR_SPACE, space, CR_END); } return sphere; } geomview-1.9.5/src/lib/gprim/mesh/meshtransform.c0000644000175000017500000000323612310110200016714 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include "hpoint3.h" #include "point3.h" #include "meshP.h" Mesh *MeshTransform(Mesh *m, Transform T, TransformN *TN) { (void)TN; if (!T) { return m; } m->geomflags &= ~MESH_Z; if (HPt3TransformN(T, m->p, m->p, m->nu * m->nv)) { m->geomflags |= VERT_4D; } if (m->geomflags & MESH_N) { Transform Tit; TmDual(T, Tit); NormalTransformN(Tit, m->n, m->n, m->nu * m->nv); } return m; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/mesh/meshflag.h0000644000175000017500000000263612310110200015622 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef MESHFLAGDEFS #define MESHFLAGDEFS #include "mg.h" #include "geomclass.h" #define MESH_C VERT_C #define MESH_N VERT_N #define MESH_4D VERT_4D #define MESH_U VERT_ST #define MESH_UWRAP GEOMFLAG(0x001) #define MESH_VWRAP GEOMFLAG(0x002) #define MESH_NQ GEOMFLAG(0x020) #define MESH_EVERT GEOMFLAG(0x040) #define MESH_BINARY GEOMFLAG(0x080) #define MESH_Z GEOMFLAG(0x100) #define MESH_MGWRAP(mfl) ((mfl) >> GEOMFL_SHIFT) #endif /*MESHFLAGDEFS*/ geomview-1.9.5/src/lib/gprim/mesh/mesh.h0000644000175000017500000000366112310110200014767 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef MESHDEF #define MESHDEF #include "bbox.h" #include "meshflag.h" #include "bsptree.h" #ifndef NULL #define NULL 0 #endif #ifndef FALSE #define FALSE 0 #endif #define MESHMAGIC GeomMagic ('m', 1) typedef struct Mesh Mesh; extern GeomClass *MeshMethods( void ); extern char *MeshName( void ); extern Mesh *MeshFLoad( IOBFILE *, char * ); extern Mesh *MeshLoad( char * ); extern Mesh *MeshSave( Mesh *, char * ); extern Mesh *MeshFSave( Mesh *, FILE * ); extern BBox *MeshBound( Mesh *, Transform T, TransformN *TN); extern Geom *MeshBoundSphere( Mesh *, Transform T, TransformN *TN, int *axes, int ); extern Mesh *MeshDice( Mesh *, int (*proc)() ); extern Mesh *MeshEvert( Mesh * ); extern Mesh *MeshDraw( Mesh * ); extern Mesh *MeshBSPTree(Mesh *mesh, BSPTree *bsptree, int action); extern Mesh *MeshPick( Mesh *, Pick *, Appearance *, Transform, TransformN *, int *axes ); extern Mesh *MeshTransform( Mesh *, Transform, TransformN * ); #endif /*MESHDEF*/ geomview-1.9.5/src/lib/gprim/mesh/meshP.h0000644000175000017500000000426212310110200015105 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef MESHPDEF #define MESHPDEF #include "geomclass.h" #include "mesh.h" #include "bsptree.h" struct Mesh { GEOMFIELDS; int seq; int nu, nv; int umin, umax, vmin, vmax; HPoint3 *p; Point3 *n; Point3 *nq; /* per quad normals */ TxST *u; ColorA *c; }; static inline Ref *MeshRef(Mesh *m) { union castit { Ref ref; Mesh mesh; }; return &((union castit *)m)->ref; } static inline Geom *MeshGeom(Mesh *m) { union castit { Geom geom; Mesh mesh; }; return &((union castit *)m)->geom; } #define nuverts(m) (m)->nu #define nvverts(m) (m)->nv #define nuquads(m) (((m)->flag & MESH_UWRAP) ? (m)->nu : (m)->nu - 1) #define nvquads(m) (((m)->flag & MESH_VWRAP) ? (m)->nv : (m)->nv - 1) /* * MESHINDEX(u, v, mesh) * Returns the index of a point into the mesh->array given its u & v * coordinates. */ #define MESHINDEX(u, v, mesh) \ (((v)%(mesh)->nv)*(mesh)->nu + ((u)%(mesh)->nu)) /* * MESHPOINT(u, v, mesh, plist) * Returns plist[MESHINDEX(u, v, mesh)] */ #define MESHPOINT(u, v, mesh, plist) ((plist)[MESHINDEX(u, v, mesh)]) extern Mesh *MeshComputeNormals(Mesh *m, int need); #endif /* ! MESHPDEF */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/mesh/Headers0000644000175000017500000000003212310110200015145 00000000000000mesh.h meshP.h meshflag.h geomview-1.9.5/src/lib/gprim/ndmesh/0000755000175000017500000000000012310165602014276 500000000000000geomview-1.9.5/src/lib/gprim/ndmesh/Makefile.in0000644000175000017500000004747512310165554016312 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/ndmesh DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libndmesh_la_LIBADD = am_libndmesh_la_OBJECTS = ndmeshbound.lo ndmeshclass.lo \ ndmeshcreate.lo ndmeshdraw.lo ndmeshload.lo ndmeshsave.lo \ ndmeshtransform.lo ndmeshsphere.lo ndmeshpick.lo libndmesh_la_OBJECTS = $(am_libndmesh_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libndmesh_la_SOURCES) DIST_SOURCES = $(libndmesh_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libndmesh.la libndmesh_la_SOURCES = \ ndmeshbound.c ndmeshclass.c ndmeshcreate.c ndmeshdraw.c ndmeshload.c \ ndmeshsave.c ndmeshtransform.c ndmeshsphere.c \ ndmeshflag.h ndmesh.h ndmeshP.h ndmeshpick.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/ndmesh/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/ndmesh/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libndmesh.la: $(libndmesh_la_OBJECTS) $(libndmesh_la_DEPENDENCIES) $(EXTRA_libndmesh_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libndmesh_la_OBJECTS) $(libndmesh_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshtransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/ndmesh/Makefile.am0000644000175000017500000000044112310110200016231 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libndmesh.la libndmesh_la_SOURCES = \ ndmeshbound.c ndmeshclass.c ndmeshcreate.c ndmeshdraw.c ndmeshload.c \ ndmeshsave.c ndmeshtransform.c ndmeshsphere.c \ ndmeshflag.h ndmesh.h ndmeshP.h ndmeshpick.c geomview-1.9.5/src/lib/gprim/ndmesh/ndmeshbound.c0000644000175000017500000000622012310110200016650 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" #include "ndmeshP.h" BBox *NDMeshBound(NDMesh *mesh, Transform T, TransformN *TN) { BBox *result; int n; HPoint3 min, max, tmp, clean; HPointN **p; if (mesh->meshd > 2) return NULL; n = mesh->mdim[0]*mesh->mdim[1]; /* more is not implemented yet */ p = mesh->p; /* First handle the case without transformations, this means that we * return an Nd bbox. */ if (!T && !TN) { HPointN *min; HPointN *max; min = HPtNCopy(p[0], NULL); HPtNDehomogenize(min, min); max = HPtNCopy(min, NULL); while(--n > 0) { HPtNMinMax(min, max, *(++p)); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, min, CR_NMAX, max, CR_END); HPtNDelete(min); HPtNDelete(max); return result; } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *minN; HPointN *maxN; HPointN *ptN; BBox *result; minN = HPtNTransform(TN, p[0], NULL); HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); ptN = HPtNCreate(TN->odim, NULL); while(--n > 0) { HPtNTransform(TN, *(++p), ptN); HPtNMinMax(minN, maxN, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(ptN); HPtNDelete(minN); HPtNDelete(maxN); return result; } /* A 3d bbox is requested, with transformations */ if (T) { /* ordinary 3d transform, we simply operate on the x, y, z sub-space. */ HPtNToHPt3(*p, NULL, &min); HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n > 0) { HPtNToHPt3(*(++p), NULL, &tmp); HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/ndmesh/ndmeshclass.c0000644000175000017500000000467712310110200016664 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "ndmeshP.h" static GeomClass *aNDMeshMethods = NULL; int NDMeshPresent = 1; static char ndmeshName[] = "ndmesh"; extern NDMesh *NDMeshCreate( va_list ); extern NDMesh *NDMeshDelete( NDMesh * ); extern NDMesh *NDMeshCopy( NDMesh * ); extern NDMesh *NDMeshBSPTree(NDMesh *mesh, BSPTree *tree, int action); char * NDMeshName() { return ndmeshName; } GeomClass *NDMeshMethods(void) { if (!aNDMeshMethods) { aNDMeshMethods = GeomClassCreate(ndmeshName); aNDMeshMethods->name = NDMeshName; aNDMeshMethods->methods = (GeomMethodsFunc *) NDMeshMethods; aNDMeshMethods->create = (GeomCreateFunc *) NDMeshCreate; aNDMeshMethods->Delete = (GeomDeleteFunc *) NDMeshDelete; aNDMeshMethods->fload = (GeomFLoadFunc *) NDMeshFLoad; aNDMeshMethods->fsave = (GeomFSaveFunc *) NDMeshFSave; aNDMeshMethods->bound = (GeomBoundFunc *) NDMeshBound; aNDMeshMethods->boundsphere = (GeomBoundSphereFunc *) NDMeshBoundSphere; aNDMeshMethods->draw = (GeomDrawFunc *) NDMeshDraw; aNDMeshMethods->bsptree = (GeomBSPTreeFunc *)NDMeshBSPTree; aNDMeshMethods->transform = (GeomTransformFunc *) NDMeshTransform; aNDMeshMethods->transformto = (GeomTransformToFunc *) NDMeshTransform; aNDMeshMethods->pick = (GeomPickFunc *) NDMeshPick; } return aNDMeshMethods; } geomview-1.9.5/src/lib/gprim/ndmesh/ndmeshcreate.c0000644000175000017500000001132212310110200017003 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "ndmeshP.h" static int ndmeshfield(int copy, int amount, void **fieldp, void *value, char *name); static int ndmeshsize(NDMesh *m) { int i, s; for(i = m->meshd, s = 1; --i >= 0; ) s *= m->mdim[i]; return s; } static void tosspoints(NDMesh *m) { int n; HPointN **p; if(m->mdim && m->p) { for(n = ndmeshsize(m), p = m->p; --n >= 0; p++) if(*p) HPtNDelete( *p ); } } static void tossmesh(NDMesh *m) { tosspoints(m); if(m->p) OOGLFree(m->p); if(m->c) OOGLFree(m->c); if(m->u) OOGLFree(m->u); m->p = NULL; m->c = NULL; m->u = NULL; } NDMesh * NDMeshCreate (NDMesh *exist, GeomClass *classp, va_list *a_list) { NDMesh *m; int attr, copy = 1; int i; int npts; ColorA *c; c = NULL; if (exist == NULL) { m = OOGLNewE(NDMesh, "NDMeshCreate mesh"); memset(m, 0, sizeof(NDMesh)); GGeomInit (m, classp, NDMESHMAGIC, NULL); m->geomflags = 0; m->meshd = 2; m->mdim = OOGLNewNE(int, m->meshd, "NDMesh dim"); memset(m->mdim, 0, m->meshd * sizeof(int)); } else { /* Check that exist is a NDMesh... */ m = exist; } npts = ndmeshsize( m ); while ((attr = va_arg (*a_list, int))) switch (attr) { case CR_FLAG: m->geomflags = va_arg (*a_list, int); break; case CR_MESHDIM: i = va_arg (*a_list, int); if(i <= 0 || i >= 1000) { OOGLError(1, "Incredible NDMesh dimension %d", i); return NULL; } m->meshd = i; OOGLFree(m->mdim); m->mdim = OOGLNewNE(int, m->meshd, "NDMesh dim"); memset(m->mdim, 0, m->meshd * sizeof(int)); tossmesh(m); npts = 0; break; case CR_MESHSIZE: memcpy(m->mdim, va_arg (*a_list, int *), m->meshd*sizeof(int)); tossmesh(m); npts = ndmeshsize(m); break; case CR_DIM: m->pdim = va_arg(*a_list, int); if (m->pdim < 4) { OOGLError(1, "Dimension %d < 4", m->pdim); return NULL; } m->pdim++; /* should be the projective dimension */ break; case CR_POINT: case CR_POINT4: tosspoints(m); ndmeshfield(copy, npts*sizeof(HPointN *), (void **)(void *)&m->p, (void *)va_arg (*a_list, HPointN **), "ND mesh points"); break; case CR_U: m->geomflags = (m->geomflags & ~MESH_U) | (MESH_U & ndmeshfield(copy, npts*sizeof(TxST), (void **)(void *)&m->u, (void *)va_arg (*a_list, TxST *), "ndmesh texture coords")); break; case CR_COLOR: m->geomflags &= ~COLOR_ALPHA; m->geomflags = (m->geomflags & ~MESH_C) | (MESH_C & ndmeshfield(copy, npts*sizeof(ColorA), (void **)(void *)&m->c, (void *)(c = va_arg (*a_list, ColorA *)), "ndmesh colors")); break; default: if (GeomDecorate (m, ©, attr, a_list)) { GeomError (0, "NDMeshCreate: Undefined option: %d", attr); OOGLFree (m); return NULL; } } if (c) { int i; for (i = 0; i < m->mdim[0]*m->mdim[1]; i++) { if (m->c[i].a < 1.0) { m->geomflags |= COLOR_ALPHA; } } } return m; } static int ndmeshfield(int copy, int amount, void **fieldp, void *value, char *name) { (void)name; if(value) { if(copy) { if(*fieldp == NULL) *fieldp = OOGLNewNE(char, amount, name); memcpy(*fieldp, value, amount); } else { if(*fieldp) OOGLFree(*fieldp); *fieldp = value; } return ~0; } else { if(*fieldp) OOGLFree(*fieldp); *fieldp = NULL; return 0; } } NDMesh * NDMeshDelete(NDMesh *m) { if (m) { tossmesh(m); OOGLFree(m->mdim); } return NULL; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/ndmesh/ndmeshdraw.c0000644000175000017500000001111412310110200016474 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "ndmeshP.h" #include "mesh.h" /* plain old 3-D mesh */ #include "mgP.h" #include "meshP.h" #include "mg.h" #include "hpointn.h" #include "bsptreeP.h" #include static void draw_projected_ndmesh(mgNDctx *NDctx, NDMesh *mesh) { Mesh m; HPointN **op; HPoint3 *np; int i, colored = 0, alpha = 0; int npts = mesh->mdim[0] * mesh->mdim[1]; mgNDmapfunc mapHPtN = NDctx->mapHPtN; Appearance *ap = &_mgc->astk->ap; Material *mat = &_mgc->astk->mat; int normal_need; memset(&m, 0, sizeof(m)); GGeomInit((Geom *)(void *)&m, MeshMethods(), MESHMAGIC, NULL); m.p = OOGLNewNE(HPoint3, npts, "projected points"); m.n = NULL; m.c = OOGLNewNE(ColorA, npts, "ND colors"); m.nu = mesh->mdim[0]; m.nv = mesh->mdim[1]; m.geomflags = mesh->geomflags & ~MESH_4D; if (ap->flag & APF_KEEPCOLOR) { colored = 0; } else { HPoint3 dummyv; ColorA dummyc; /* Dummy transform to determine whether we have ND colors or not */ colored = mapHPtN(NDctx, *mesh->p, &dummyv, &dummyc); } for(i = 0, op = mesh->p, np = m.p; i < npts; i++, op++, np++) { /* Set the point's first four components from our N-D mesh vertex */ if (colored) { mapHPtN(NDctx, *op, np, &m.c[i]); if (m.c[i].a < 1.0) { alpha = 1; } } else { mapHPtN(NDctx, *op, np, NULL); } } if (colored) { if (alpha) { m.geomflags |= COLOR_ALPHA; } else { m.geomflags &= ~COLOR_ALPHA; } m.geomflags |= MESH_C; } /* The drawing routines might need either polygon or vertex normals, * so if either is missing and either might be needed, we force it * to be computed. */ normal_need = 0; m.geomflags &= ~(MESH_N|MESH_NQ); if (ap->flag & APF_NORMALDRAW) { normal_need = MESH_N|MESH_NQ; } else if (ap->flag & APF_FACEDRAW) { switch (ap->shading) { case APF_FLAT: case APF_VCFLAT: normal_need |= MESH_NQ; break; case APF_SMOOTH: normal_need |= MESH_N; break; default: break; } if (GeomHasAlpha(MeshGeom(&m), ap)) { /* could re-use per quad normals here */ } } if (normal_need) { MeshComputeNormals(&m, normal_need); } if(_mgc->astk->flags & MGASTK_SHADER) { ColorA *c = colored ? m.c : (mat->override & MTF_DIFFUSE) ? NULL : mesh->c; if(c) { (*_mgc->astk->shader)(npts, m.p, m.n ? m.n : m.nq, c, mesh->c); } else { for(i = 0; i < npts; i++) { (*_mgc->astk->shader)(1, m.p + i, m.n + i, (ColorA *)&_mgc->astk->mat.diffuse, m.c + i); } } colored = 1; } mgmesh(MESH_MGWRAP(m.geomflags), m.nu, m.nv, m.p, m.n, m.nq, colored ? m.c : mesh->c, m.geomflags); /* Generate a BSP-tree if the object or parts of it might be * translucent. */ if (NDctx->bsptree && (m.geomflags & GEOM_ALPHA)) { GeomNodeDataMove(NDMeshGeom(mesh), MeshGeom(&m)); GeomBSPTree(MeshGeom(&m), NDctx->bsptree, BSPTREE_ADDGEOM); GeomNodeDataMove(MeshGeom(&m), NDMeshGeom(mesh)); } if (m.n) { OOGLFree(m.n); } if (m.nq) { OOGLFree(m.nq); } OOGLFree(m.p); OOGLFree(m.c); } NDMesh * NDMeshDraw(NDMesh *mesh) { mgNDctx *NDctx = NULL; mgctxget(MG_NDCTX, &NDctx); if(NDctx) { draw_projected_ndmesh(NDctx, mesh); } return mesh; } /* A dummy, just to make GeomBSPTree() not bail out. */ NDMesh *NDMeshBSPTree(NDMesh *mesh, BSPTree *tree, int action) { (void)tree; (void)action; return mesh; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/ndmesh/ndmeshload.c0000644000175000017500000001112412310110200016457 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "ndmeshP.h" static bool getmeshvert(IOBFILE *file, int flag, int pdim, int u, int v, HPointN **p, ColorA *c, TxST *st) { float inputs[128]; /* really plenty */ float *readv = flag&MESH_4D ? inputs : inputs+1; int readdim = flag&MESH_4D ? pdim : pdim - 1; int binary = flag&MESH_BINARY; (void)u; (void)v; inputs[0] = 1.0; if (iobfgetnf(file, readdim, readv, binary) < readdim) { return false; } *p = HPtNCreate(pdim, inputs); if ((flag & MESH_C) && iobfgetnf(file, 4, (float *)c, binary) < 4) { return false; } if (flag & MESH_U && iobfgetnf(file, 2, (float *)st, binary) < 2) { return false; } else { /* consume unused "r" component for compatibility */ float dummy; int c; if ((c = iobfnextc(file, 1)) != '\n' && c != '}' && c != EOF) { if (iobfgetnf(file, 1, &dummy, 0) < 1) { return false; } } } return true; } static int getheader(IOBFILE *file, const char *fname, int *dimp) { int i, flag; char *token; static char keys[] = "UCN4HUuv"; static short bit[] = { MESH_U, MESH_C, MESH_N, MESH_4D, MESH_4D, MESH_U, MESH_UWRAP, MESH_VWRAP }; /* Parse [U][C][N][Z][4][u][v]MESH[ BINARY]\n */ flag = 0; token = GeomToken(file); for(i = 0; keys[i] != '\0'; i++) { if (*token == keys[i]) { flag |= bit[i]; token++; } } if (strcmp(token, "nMESH")) return -1; if (iobfgetni(file, 1, dimp, 0) <= 0) return -1; if (*dimp < 4) { OOGLSyntax(file, "Reading nMESH from \"%s\": dimension %d < 4", fname, *dimp); } (*dimp)++; if (iobfnextc(file, 1) == 'B') { if (iobfexpectstr(file, "BINARY")) return(-1); flag |= MESH_BINARY; if (iobfnextc(file, 1) == '\n') (void) iobfgetc(file); /* Toss \n */ } return flag; } NDMesh * NDMeshFLoad(IOBFILE *file, char *fname) { NDMesh m; int n; int i, u, v; int size[2]; int binary; if (!file) return NULL; if ((m.geomflags = getheader(file, fname, &m.pdim)) == -1) return NULL; m.meshd = 2; /* Hack. Should allow general meshes */ binary = m.geomflags & MESH_BINARY; if (iobfgetni(file, m.meshd, size, binary) < 2) { OOGLSyntax(file,"Reading nMESH from \"%s\": expected mesh grid size", fname); return NULL; } if (size[0] <= 0 || size[1] <= 0 || size[0] > 9999999 || size[1] > 9999999) { OOGLSyntax(file,"Reading nMESH from \"%s\": invalid mesh size %d %d", fname,size[0],size[1]); return NULL; } n = size[0] * size[1]; m.p = OOGLNewNE(HPointN *, n, "NDMeshFLoad: vertices"); m.u = NULL; m.c = NULL; if (m.geomflags & MESH_C) { m.c = OOGLNewNE(ColorA, n, "NDMeshFLoad: colors"); } if (m.geomflags & MESH_U) { m.u = OOGLNewNE(TxST, n, "NDMeshFLoad: texture coords"); } for (i = 0, v = 0; v < size[1]; v++) { for (u = 0; u < size[0]; u++, i++) { if (getmeshvert(file, m.geomflags, m.pdim, u, v, &m.p[i], &m.c[i], &m.u[i]) == 0) { OOGLSyntax(file, "Reading nMESH from \"%s\": bad element (%d,%d) of (%d,%d)", fname, u, v, size[0], size[1]); return NULL; } } } return (NDMesh *)GeomCCreate(NULL, NDMeshMethods(), CR_NOCOPY, CR_MESHDIM, 2, CR_MESHSIZE, size, CR_DIM, m.pdim-1, CR_4D, (m.geomflags & MESH_4D), CR_FLAG, m.geomflags, CR_POINT4, m.p, CR_COLOR, m.c, CR_U, m.u, CR_END); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/ndmesh/ndmeshsave.c0000644000175000017500000000577712310110200016517 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "ndmeshP.h" static void ign_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) { size_t result; result = fwrite(ptr, size, nmemb, stream); (void)result; } NDMesh * NDMeshFSave(NDMesh *m, FILE *outf) { int i, j, k, wdim, offset; HPointN **p = m->p; ColorA *c = m->c; TxST *u = m->u; if (!outf || !m) return NULL; if (m->c == NULL) m->geomflags &= ~MESH_C; if (m->u == NULL) m->geomflags &= ~MESH_U; wdim = m->pdim; if (m->geomflags & MESH_C) fputc('C', outf); if (m->geomflags & VERT_4D) { fputc('4', outf); offset = 0; } else { --wdim; offset = 1; } if (m->geomflags & MESH_U) fputc('U', outf); if (m->geomflags & MESH_UWRAP) fputc('u', outf); if (m->geomflags & MESH_VWRAP) fputc('v', outf); /* dim is always pdim-1, even for 4nMESH */ fprintf(outf, "nMESH %d", m->pdim-1); if (m->geomflags & MESH_BINARY) { /* Hack -- should be sent by context */ fprintf(outf, "BINARY\n"); ign_fwrite(&m->mdim, sizeof(int), m->meshd, outf); for (i = 0; i < m->mdim[1]; i++) { for (j = 0; j < m->mdim[0]; j++) { ign_fwrite((*p)->v+offset, sizeof(float), wdim, outf); p++; if (m->geomflags & MESH_C) { ign_fwrite(c, 4, 4, outf); c++; } if (m->geomflags & MESH_U) { ign_fwrite(u, 4, 3, outf); u++; } } } } else { fprintf(outf, "\n%d %d\n", m->mdim[0], m->mdim[1]); for (i = 0; i < m->mdim[1]; i++) { for (j = 0; j < m->mdim[0]; j++) { for(k = 0; k < wdim; k++) fprintf(outf, "%g ", (*p)->v[k+offset]); p++; if (m->geomflags & MESH_C) { fprintf(outf, " %.3g %.3g %.3g %.3g ", c->r, c->g, c->b, c->a); c++; } if (m->geomflags & MESH_U) { fprintf(outf, " %g %g 0", u->s, u->t); u++; } fputc('\n', outf); } fputc('\n', outf); } } return m; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/ndmesh/ndmeshtransform.c0000644000175000017500000000265712310110200017566 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "ndmeshP.h" /* */ NDMesh *NDMeshTransform(NDMesh *m, Transform T, TransformN *TN) { if (TN) { HPointN **p; int i, n = m->mdim[0] * m->mdim[1]; for (p = m->p, i = 0; i < n; i++, p++) { HPtNTransform(TN, *p, *p); HPtNDehomogenize(*p, *p); } } if (T) { HPointN **p; int i, n = m->mdim[0] * m->mdim[1]; for (p = m->p, i = 0; i < n; i++, p++) { HPtNTransform3(T, NULL, *p, *p); HPtNDehomogenize(*p, *p); } } return m; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/ndmesh/ndmeshsphere.c0000644000175000017500000000250012310110200017024 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "geom.h" #include "create.h" #include "ndmeshP.h" #include "sphere.h" Geom *NDMeshBoundSphere(NDMesh *mesh, Transform T, TransformN *TN, int *axes, int space) { Geom *sphere; /* Create a dummy sphere, the center will be corrected later */ sphere = GeomCreate("sphere", CR_SPACE, space, CR_END); SphereEncompassHPtNN((Sphere *)sphere, mesh->p, mesh->mdim[0]*mesh->mdim[1], T, TN, axes); return sphere; } geomview-1.9.5/src/lib/gprim/ndmesh/ndmeshflag.h0000644000175000017500000000244712310110200016466 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef MESHFLAGDEFS #define MESHFLAGDEFS #define MESH_UWRAP 0x1 #define MESH_VWRAP 0x2 #define MESH_C 0x4 #define MESH_N 0x8 #define MESH_U 0x10 #define MESH_D 0x20 #define MESH_EVERT 0x40 #define MESH_BINARY 0x80 #define MESH_Z 0x100 #define MESH_4D 0x200 /* Special 4-D flag to MeshCreate; not stored */ #endif /*MESHFLAGDEFS*/ geomview-1.9.5/src/lib/gprim/ndmesh/ndmesh.h0000644000175000017500000000361312310110200015630 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef NDMESHDEF #define NDMESHDEF #include "bbox.h" #include "meshflag.h" #ifndef NULL #define NULL 0 #endif #ifndef FALSE #define FALSE 0 #endif #define NDMESHMAGIC GeomMagic ('N', 1) typedef struct NDMesh NDMesh; extern GeomClass *NDMeshMethods( void ); extern char *NDMeshName( void ); extern NDMesh *NDMeshFLoad( IOBFILE *, char * ); extern NDMesh *NDMeshLoad( char * ); extern NDMesh *NDMeshSave( NDMesh *, char * ); extern NDMesh *NDMeshFSave( NDMesh *, FILE * ); extern BBox *NDMeshBound(NDMesh *, Transform T, TransformN *TN); extern Geom *NDMeshBoundSphere(NDMesh *mesh, Transform T, TransformN *TN, int *axes, int space); extern NDMesh *NDMeshDice( NDMesh *, int (*proc)() ); extern NDMesh *NDMeshDraw( NDMesh * ); extern NDMesh *NDMeshPick( NDMesh *, Pick *, Appearance *, Transform, TransformN *TN, int *axes ); extern NDMesh *NDMeshTransform(NDMesh *m, Transform T, TransformN *TN); #endif /*MESHDEF*/ geomview-1.9.5/src/lib/gprim/ndmesh/ndmeshP.h0000644000175000017500000000422412310110200015747 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef NDMESHPDEF #define NDMESHPDEF #include "geomclass.h" #include "hpointn.h" #include "ndmesh.h" struct NDMesh { GEOMFIELDS; int seq; /* cH: what is this??? */ int meshd; /* mesh dimension */ int *mdim; /* mesh size, indexed 0..meshd-1 */ HPointN **p; /* N-D vertices; dim[0] axis varies fastest */ ColorA *c; /* vertex colors, indexed likewise */ TxST *u; /* texture coordinates, should we need any */ }; static inline Ref *NDMeshRef(NDMesh *m) { union castit { Ref ref; NDMesh mesh; }; return &((union castit *)m)->ref; } static inline Geom *NDMeshGeom(NDMesh *m) { union castit { Geom geom; NDMesh mesh; }; return &((union castit *)m)->geom; } /* NOTE that these meshes may have missing vertices; some of the p[] * and c[] entries may be NULL. */ /* * mesh indexing: * given a mesh index vector (of length 'meshd') i[0] i[1] ... i[meshd-1] * the corresponding index into the p[] and c[] arrays is given by * index = 0; size = 1; * for(k = 0; k < meshd; k++) { index += size*i[k]; size *= dim[k]; } */ #endif /* ! NDMESHPDEF */ geomview-1.9.5/src/lib/gprim/ndmesh/ndmeshpick.c0000644000175000017500000001002512310110200016465 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "ndmeshP.h" #include "pickP.h" #include "appearance.h" /* from meshP.h, works only has long as mdim is fixed at 2 */ #define MESHINDEX(u, v, mesh) \ (((v)%(mesh)->mdim[1])*(mesh)->mdim[0] + ((u)%(mesh)->mdim[0])) #define MESHPOINT(u, v, mesh, plist) ((plist)[MESHINDEX(u, v, mesh)]) NDMesh * NDMeshPick(NDMesh *mesh, Pick *pick, Appearance *ap, Transform T, TransformN *TN, int *axes) { Point3 plist[4]; int nu, nv, maxnu, maxnv; int foundu, foundv; unsigned int apflag = 0; HPt3Coord xa, xb, xc, xd; if (!TN) return NULL; /* no 3d pick for ND object. */ if (mesh->meshd > 2) return NULL; foundu = foundv = -1; maxnu = mesh->mdim[0]; maxnv = mesh->mdim[1]; /* Make sure that vects do not as visible - otherwise they * will wreak havoc with the edge picking stuff. */ if (ap != NULL) { apflag = ap->flag; ap->flag &= ~APF_VECTDRAW; } for (nv = 0; nv < ((mesh->geomflags & MESH_VWRAP) ? maxnv : maxnv-1); nv++) { for (nu =0; nu < ((mesh->geomflags & MESH_UWRAP) ? maxnu : maxnu-1); nu++) { /* Demand that at least 1 of the vertices be in front of the viewer. * Note: we must ensure that all four are evaluated! */ xa = HPtNNTransPt3(TN, axes, MESHPOINT(nu, nv, mesh, mesh->p), &plist[0]); xb = HPtNNTransPt3(TN, axes, MESHPOINT(nu+1, nv, mesh, mesh->p), &plist[1]); xc = HPtNNTransPt3(TN, axes, MESHPOINT(nu+1, nv+1, mesh, mesh->p), &plist[2]); xd = HPtNNTransPt3(TN, axes, MESHPOINT(nu, nv+1, mesh, mesh->p), &plist[3]); if((0 < xa) || (0 < xb) || (0 < xc) || (0 < xd)) { if (PickFace(4, plist, pick, ap)) { foundu = nu; foundv = nv; } } } } if (ap != NULL) ap->flag = apflag; if (foundu == -1) return NULL; if (pick->found & PW_VERT) { pick->vi = MESHINDEX(foundu + ((pick->vi == 1 || pick->vi == 2) ? 1 : 0), foundv + pick->vi/2, mesh); HPtNTransformComponents(TN, mesh->p[pick->vi], axes, &pick->v); } if (pick->found & PW_EDGE) { pick->ei[0] = MESHINDEX(foundu + ((pick->ei[0] == 1 || pick->ei[0] == 2) ? 1 : 0), foundv + pick->ei[0]/2, mesh); pick->ei[1] = MESHINDEX(foundu + ((pick->ei[1] == 1 || pick->ei[1] == 2) ? 1 : 0), foundv + pick->ei[1]/2, mesh); HPtNTransformComponents(TN, mesh->p[pick->ei[0]], axes, &pick->e[0]); HPtNTransformComponents(TN, mesh->p[pick->ei[1]], axes, &pick->e[1]); } if (pick->found & PW_FACE) { if(pick->f) OOGLFree(pick->f); pick->f = OOGLNewNE(HPoint3, 4, "Mesh pick"); pick->fi = MESHINDEX(foundu, foundv, mesh); HPtNTransformComponents(TN, MESHPOINT(foundu, foundv, mesh, mesh->p), axes, &pick->f[0]); HPtNTransformComponents(TN, MESHPOINT(foundu+1, foundv, mesh, mesh->p), axes, &pick->f[1]); HPtNTransformComponents(TN, MESHPOINT(foundu+1, foundv+1, mesh, mesh->p), axes, &pick->f[2]); HPtNTransformComponents(TN, MESHPOINT(foundu, foundv+1, mesh, mesh->p), axes, &pick->f[3]); } if (TN) { pick->TprimN = TmNCopy(TN, pick->TprimN); memcpy(pick->axes, axes, sizeof(pick->axes)); } else TmCopy(T, pick->Tprim); return mesh; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/ndmesh/Headers0000644000175000017500000000004012310110200015466 00000000000000ndmesh.h ndmeshP.h ndmeshflag.h geomview-1.9.5/src/lib/gprim/npolylist/0000755000175000017500000000000012310165602015055 500000000000000geomview-1.9.5/src/lib/gprim/npolylist/Makefile.in0000644000175000017500000004755712310165554017072 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/npolylist DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libnpolylist_la_LIBADD = am_libnpolylist_la_OBJECTS = nplbound.lo nplclass.lo nplcopy.lo \ nplcreate.lo npldraw.lo nplload.lo nplsave.lo npltransform.lo \ nplsphere.lo nplpick.lo libnpolylist_la_OBJECTS = $(am_libnpolylist_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libnpolylist_la_SOURCES) DIST_SOURCES = $(libnpolylist_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libnpolylist.la libnpolylist_la_SOURCES = \ nplbound.c nplclass.c nplcopy.c nplcreate.c npldraw.c nplload.c nplsave.c \ npolylist.h npolylistP.h npltransform.c nplsphere.c nplpick.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/npolylist/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/npolylist/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libnpolylist.la: $(libnpolylist_la_OBJECTS) $(libnpolylist_la_DEPENDENCIES) $(EXTRA_libnpolylist_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libnpolylist_la_OBJECTS) $(libnpolylist_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nplbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nplclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nplcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nplcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/npldraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nplload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nplpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nplsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nplsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/npltransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/npolylist/Makefile.am0000644000175000017500000000041112310110200017005 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libnpolylist.la libnpolylist_la_SOURCES = \ nplbound.c nplclass.c nplcopy.c nplcreate.c npldraw.c nplload.c nplsave.c \ npolylist.h npolylistP.h npltransform.c nplsphere.c nplpick.c geomview-1.9.5/src/lib/gprim/npolylist/nplbound.c0000644000175000017500000000655312310110200016753 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: Return the bounding box of a polylist. * * if T != NULL then we act only on the 3d sub-space of the first 3 * components. */ #include "npolylistP.h" BBox *NPolyListBound(NPolyList *np, Transform T, TransformN *TN) { BBox *result; int n, pdim; HPoint3 min, max, tmp, clean; HPointN ptN[1]; n = np->n_verts; pdim = np->pdim; ptN->v = np->v; ptN->dim = pdim; /* First handle the case without transformations, this means that we * return an Nd bbox. */ if (!T && !TN) { HPointN *min = HPtNCreate(pdim, np->v); HPointN *max; HPtNDehomogenize(min, min); max = HPtNCopy(min, NULL); while(--n > 0) { ptN->v += pdim; HPtNMinMax(min, max, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, min, CR_NMAX, max, CR_END); HPtNDelete(min); HPtNDelete(max); return result; } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *minN; HPointN *maxN; HPointN *clean; BBox *result; minN = HPtNTransform(TN, ptN, NULL); HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); clean = HPtNCreate(np->pdim, NULL); while(--n > 0) { ptN->v += pdim; HPtNTransform(TN, ptN, clean); HPtNMinMax(minN, maxN, clean); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(minN); HPtNDelete(maxN); HPtNDelete(clean); return result; } /* A 3d bbox is requested, with transformations */ if (T) { /* ordinary 3d transform */ HPtNToHPt3(ptN, NULL, &min); HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n > 0) { ptN->v += pdim; HPtNToHPt3(ptN, NULL, &tmp); HPt3Transform(T, &tmp, &clean); HPt3Dehomogenize(&clean, &clean); Pt3MinMax(&min, &max, &clean); } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/npolylist/nplclass.c0000644000175000017500000000612212310110200016741 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/gprim/npolylist/nplclass.c,v 1.9 2007/02/09 17:40:13 rotdrop Exp $ */ /* * Initialize the PolyList class record. */ #include "npolylistP.h" static GeomClass *aNPolyListMethods = NULL; extern NPolyList *NPolyListDraw(NPolyList *); extern NPolyList *NPolyListCreate(NPolyList *exist, GeomClass *classp, va_list *a_list); extern NPolyList *NPolyListCopy(NPolyList *); extern NPolyList *NPolyListFSave(NPolyList *, FILE *outf, char *fname); extern NPolyList *NPolyListDelete(NPolyList *); extern NPolyList *NPolyListPick(NPolyList *pl, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes); extern NPolyList *NPolyListBSPTree(NPolyList *mesh, BSPTree *tree, int action); int NPolyListPresent = 1; static char npolylistName[] = "npolylist"; char * NPolyListName() { return npolylistName; } GeomClass *NPolyListMethods(void) { if (!aNPolyListMethods) { aNPolyListMethods = GeomClassCreate(npolylistName); aNPolyListMethods->name = (GeomNameFunc *) NPolyListName; aNPolyListMethods->methods = (GeomMethodsFunc *) NPolyListMethods; aNPolyListMethods->draw = (GeomDrawFunc *) NPolyListDraw; aNPolyListMethods->bsptree = (GeomBSPTreeFunc *) NPolyListBSPTree; aNPolyListMethods->bound = (GeomBoundFunc *) NPolyListBound; aNPolyListMethods->boundsphere = (GeomBoundSphereFunc *) NPolyListSphere; aNPolyListMethods->create = (GeomCreateFunc *) NPolyListCreate; aNPolyListMethods->copy = (GeomCopyFunc *) NPolyListCopy; aNPolyListMethods->fsave = (GeomFSaveFunc *) NPolyListFSave; aNPolyListMethods->Delete = (GeomDeleteFunc *) NPolyListDelete; aNPolyListMethods->fload = (GeomFLoadFunc *) NPolyListFLoad; aNPolyListMethods->transform = (GeomTransformFunc *) NPolyListTransform; aNPolyListMethods->transformto = (GeomTransformToFunc *) NPolyListTransform; aNPolyListMethods->pick = (GeomPickFunc *) NPolyListPick; } return aNPolyListMethods; } geomview-1.9.5/src/lib/gprim/npolylist/nplcopy.c0000644000175000017500000000574512310110200016620 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/gprim/npolylist/nplcopy.c,v 1.7 2007/04/19 00:05:17 rotdrop Exp $ */ /* * Geometry object routines * * Copy an NPolyList. */ #include "npolylistP.h" NPolyList * NPolyListCopy(NPolyList *pl) { NPolyList *newpl; Poly *newp; Vertex *newvl; HPtNCoord *newv; int *newvi; int *newpv; ColorA *newvcol = NULL; Vertex **newvp; int i, k; if (pl == NULL) { return NULL; } newv = OOGLNewNE(HPtNCoord, pl->pdim*pl->n_verts, "NPolyList verts"); newvl = OOGLNewNE(Vertex, pl->n_verts, "NPolyList verts description"); newp = OOGLNewNE(Poly, pl->n_polys, "NPolyList polygons"); newvi = OOGLNewNE(int, pl->nvi, "NPolyList vert indices"); newpv = OOGLNewNE(int, pl->n_polys, "NPolyList polygon vertices"); if (pl->vcol) { newvcol = OOGLNewNE(ColorA, pl->n_verts, "NPolyList vertex colors"); } newpl = OOGLNewE(NPolyList, "NPolyList"); *newpl = *pl; newpl->vi = newvi; newpl->pv = newpv; newpl->v = newv; newpl->vcol = pl->vcol ? newvcol : NULL; newpl->p = newp; newpl->vl = newvl; memcpy(newvi, pl->vi, pl->nvi * sizeof(int)); memcpy(newpv, pl->pv, pl->n_polys * sizeof(int)); memcpy(newv, pl->v, pl->n_verts * pl->pdim * sizeof(HPtNCoord)); if (pl->vcol) { memcpy(newvcol, pl->vcol, pl->n_verts * sizeof(ColorA)); } memcpy(newp, pl->p, pl->n_polys * sizeof(Poly)); memcpy(newvl, pl->vl, pl->n_verts * sizeof(Vertex)); newvp = OOGLNewNE(Vertex *, pl->nvi, "NPolyList 3d connectivity"); for (i = 0; i < newpl->n_polys; i++) { Poly *p = &newpl->p[i]; p->v = newvp; newvp += p->n_vertices; for (k = 0; k < p->n_vertices; k++) { p->v[k] = &newpl->vl[newpl->vi[newpl->pv[i]+k]]; } } return newpl; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/npolylist/nplcreate.c0000644000175000017500000001514512310110200017104 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * NPolyList creation, editing, and deletion. */ #include "npolylistP.h" /* * Free a NPolyList. */ #include "npolylistP.h" NPolyList * NPolyListDelete( NPolyList *np ) { if (np == NULL) return NULL; OOGLFree(np->vi); OOGLFree(np->pv); OOGLFree(np->v); OOGLFree(np->vcol); OOGLFree(np->p[0].v); OOGLFree(np->p); OOGLFree(np->vl); np->vi = NULL; np->pv = NULL; np->v = NULL; np->vcol = NULL; np->p = NULL; np->vl = NULL; return NULL; } NPolyList * NPolyListCreate(NPolyList *exist, GeomClass *classp, va_list *a_list) { NPolyList *pl; int *nvertperpol=NULL, *verts=NULL; int npolyflag=0, nvertflag=0, vertflag=0, pointflag=0, pointhomog = 0; float *v = NULL; ColorA *vc = NULL, *pc = NULL; int attr, copy=1; int numentries=0, numvertices=0; int i; int j,k=0; if (exist == NULL) { pl = OOGLNewE(NPolyList,"NPolyListCreate npolylist"); memset(pl, 0, sizeof(NPolyList)); GGeomInit(pl, classp, NPLMAGIC, NULL); pl->pdim = 4; /* 3-D plus homogeneous component */ } else { pl = exist; } while ((attr = va_arg(*a_list, int))) switch (attr) { case CR_NOCOPY: OOGLError(0,"Note: NOCOPY option not used by NPolyListCreate()"); break; case CR_FLAG: pl->geomflags = va_arg(*a_list, int); break; case CR_NPOLY: pl->n_polys = va_arg(*a_list, int); npolyflag = 1; break; case CR_NVERT: /* number of verts of each polygon */ nvertperpol = va_arg(*a_list, int*); nvertflag = 1; break; case CR_VERT: /* indices of all verts of all polygons, concatenated */ /* verts[] contains sum(nvertperpol[]) elements */ verts = va_arg(*a_list, int*); vertflag = 1; break; case CR_DIM: pl->pdim = va_arg(*a_list, int) + 1; break; case CR_POINT4: /* CR_POINT4, */ pointhomog = 1; /* Fall into CR_POINT */ case CR_POINT: /* CR_POINT, */ v = va_arg(*a_list, HPtNCoord *); pointflag = 1; break; case CR_COLOR: /* CR_COLOR, geomflags &= ~COLOR_ALPHA; vc = va_arg(*a_list, ColorA *); if (vc) { pl->geomflags |= PL_HASVCOL; } break; case CR_POLYCOLOR: pl->geomflags &= ~COLOR_ALPHA; pc = va_arg(*a_list, ColorA *); if (pc) { pl->geomflags |= PL_HASPCOL; } break; default: if (GeomDecorate(pl, ©, attr, a_list)) { OOGLError(0,"Undefined PolyList option: %d", attr); if (!exist) GeomDelete((Geom *)pl); return NULL; } } if (!exist && (!npolyflag || !nvertflag || !vertflag || !pointflag)) { if (!npolyflag) OOGLError(0,"Must specify number of polygons"); if (!nvertflag) OOGLError(0,"Must specify NVERT array"); if (!vertflag) OOGLError(0,"Must specify VERT array"); if (!pointflag) OOGLError(0,"Must specify vertices"); if (pl->pdim < 5)OOGLError(0, "Dimension %d too small, " "please use ordinary OFF format", pl->pdim-1); GeomDelete((Geom *)pl); return NULL; } if(nvertflag && vertflag) { numentries = 0; for (i=0; in_polys; i++) { numentries += nvertperpol[i]; } for (i=0; i numvertices) { numvertices = verts[i]; } } pl->n_verts = numvertices + 1; if(pl->v) { OOGLFree(pl->v); } pl->v = OOGLNewNE(HPtNCoord, pl->n_verts * pl->pdim, "polylist vertices"); if (pl->vl) { OOGLFree(pl->vl); } pl->vl = OOGLNewNE(Vertex, pl->n_verts, "polylist vertex info"); } if(pointflag) { /* if dimn == 3, copy over into 4-vector area and add a '1' in * the 4th coordinate */ if (pointhomog) { memcpy(pl->v, v, pl->pdim*pl->n_verts*sizeof(HPtNCoord)); } else { float *pv; for(i = pl->n_verts, pv = pl->v; --i >= 0; ) { *pv++ = 1.0; /* Add homogenous '1' */ for(j = 1; j < pl->pdim; j++) *pv++ = *v++; } } } if(npolyflag) { if(pl->p) { if (pl->p[0].v) { OOGLFree(pl->p[0].v); } OOGLFree(pl->p); } pl->p = OOGLNewNE(Poly, pl->n_polys, "nPolyListCreate polygons"); if (pl->pv) { OOGLFree(pl->pv); } pl->pv = OOGLNewNE(int, pl->n_polys, "nPolyListCreate polygon verts"); } if(nvertflag && vertflag) { Vertex **vp; k = 0; for (i=0; in_polys; i++) { pl->pv[i] = k; k += (pl->p[i].n_vertices = nvertperpol[i]); } if(pl->vi) { OOGLFree(pl->vi); } pl->vi = OOGLNewNE(int, numentries, "nPolyListCreate vertex indices"); pl->nvi = k; memcpy(pl->vi, verts, k*sizeof(int)); /* Also update the connectivity info stored in pl->p[] */ vp = OOGLNewNE(Vertex *, numentries, "nPolyListCreate connectivity"); for (i = 0; i < pl->n_polys; i++) { Poly *p = &pl->p[i]; p->v = vp; vp += p->n_vertices; for (k = 0; k < p->n_vertices; k++) { p->v[k] = &pl->vl[pl->vi[pl->pv[i]+k]]; } } } if(vc) { for (i = 0; i < pl->n_verts; i++) { pl->vcol[i] = pl->vl[i].vcol = vc[i]; if (vc[i].a != 1.0) { pl->geomflags |= COLOR_ALPHA; } } pl->geomflags |= NPL_HASVLVCOL; } if (pc) { for (i = 0; i < pl->n_polys; i++) { pl->p[i].pcol = pc[i]; if (pc[i].a != 1.0) { pl->geomflags |= COLOR_ALPHA; } } } return pl; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/npolylist/npldraw.c0000644000175000017500000001477412310110200016605 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/gprim/npolylist/npldraw.c,v 1.21 2010/03/14 13:29:48 rotdrop Exp $ */ /* * Draw a PolyList using mg library. */ #include "npolylistP.h" #include "polylistP.h" /* Need plain PolyList, too, for mgpolylist() */ #include "appearance.h" #include "mgP.h" /* need mgP.h (instead of mg.h) for _mgc below */ #include "bsptreeP.h" #include "hpointn.h" #include static void draw_projected_polylist(mgNDctx *NDctx, NPolyList *pl) { PolyList npl; HPointN *h; Poly *np; Vertex *nv; float *ov; ColorA *oc; int i, j; bool colored = false, alpha = false; float *hdata; mgNDmapfunc mapHPtN = NDctx->mapHPtN; Appearance *ap = &_mgc->astk->ap; Material *mat = &_mgc->astk->mat; int normal_need; /* Copy the PolyList onto the stack. */ memset(&npl, 0, sizeof(PolyList)); GGeomInit(PolyListGeom(&npl), PolyListMethods(), PLMAGIC, NULL); npl.n_polys = pl->n_polys; npl.n_verts = pl->n_verts; npl.geomflags = pl->geomflags; npl.vl = pl->vl; npl.p = pl->p; h = HPtNCreate(pl->pdim, NULL); if (ap->flag & APF_KEEPCOLOR) { colored = false; } else { HPoint3 dummyv; ColorA dummyc; /* Dummy transform to determine whether we have ND colors or not */ colored = mapHPtN(NDctx, h, &dummyv, &dummyc) != 0; } /* Transform vertices */ hdata = h->v; npl.geomflags &= ~VERT_4D; for(i = 0, ov = pl->v, nv = npl.vl; i < pl->n_verts; i++, nv++) { h->v = ov; if (colored) { mapHPtN(NDctx, h, &nv->pt, &nv->vcol); if (nv->vcol.a != 1.0) { alpha = true; } } else { mapHPtN(NDctx, h, &nv->pt, NULL); } ov += pl->pdim; } if (colored) { if (alpha) { npl.geomflags |= COLOR_ALPHA; } else { npl.geomflags &= ~COLOR_ALPHA; } npl.geomflags &= ~PL_HASPCOL; npl.geomflags |= PL_HASVCOL; pl->geomflags &= ~NPL_HASVLVCOL; /* mark as invalid */ } else if ((pl->geomflags & PL_HASVCOL) && !(pl->geomflags & NPL_HASVLVCOL)) { /* copy per vertex colors into vertex list */ for(i = 0, nv = npl.vl, oc = pl->vcol; i < pl->n_verts; ++i, ++nv, ++oc) { nv->vcol = *oc; } pl->geomflags |= NPL_HASVLVCOL; /* mark as valid */ } else if (npl.geomflags & GEOM_COLOR) { colored = true; } /* The drawing routines might need either polygon or vertex normals, * so if either is missing and either might be needed, we force it * to be computed. */ npl.geomflags &= ~(PL_HASVN|PL_HASPN|PL_HASPFL); normal_need = (ap->flag & APF_NORMALDRAW) ? PL_HASPN|PL_HASVN : 0; if (ap->flag & APF_FACEDRAW) { switch (ap->shading) { case APF_FLAT: case APF_VCFLAT: normal_need |= PL_HASPN; break; case APF_SMOOTH: normal_need |= PL_HASVN; break; default: break; } if (GeomHasAlpha(PolyListGeom(&npl), ap)) { normal_need |= PL_HASPFL|PL_HASPN; } } if (normal_need) { PolyListComputeNormals(&npl, normal_need); } if((_mgc->astk->flags & MGASTK_SHADER) && !(npl.geomflags & GEOM_ALPHA)) { ColorA *c = !colored || (mat->override & MTF_DIFFUSE) ? (ColorA *)&mat->diffuse : NULL; switch (ap->shading) { case APF_SMOOTH: if (!(npl.geomflags & PL_HASVCOL)) { if (npl.geomflags & PL_HASPCOL) { for (i = 0, np = npl.p; i < npl.n_polys; i++, np++) { for (j = 0; j < np->n_vertices; j++) { np->v[j]->vcol = np->pcol; } } } } for (i = 0, nv = npl.vl; i < npl.n_verts; i++, nv++) { (*_mgc->astk->shader)(1, &nv->pt, &nv->vn, c ? c : &nv->vcol, &nv->vcol); } npl.geomflags |= PL_HASVCOL; mgpolylist(npl.n_polys, npl.p, npl.n_verts, npl.vl, npl.geomflags); break; case APF_FLAT: for (i = 0, np = npl.p; i < npl.n_polys; i++, np++) { (*_mgc->astk->shader)(1, &np->v[0]->pt, (Point3 *)&np->pn, c ? c : &np->pcol, &np->pcol); } npl.geomflags |= PL_HASPCOL; mgpolylist(npl.n_polys, npl.p, npl.n_verts, npl.vl, npl.geomflags); break; case APF_VCFLAT: for (i = 0, np = npl.p; i < npl.n_polys; i++, np++) { VARARRAY(V, HPoint3, np->n_vertices); VARARRAY(C, ColorA, np->n_vertices); for (j = 0; j < np->n_vertices; j++) { V[j] = np->v[j]->pt; C[j] = (npl.geomflags & PL_HASVCOL) ? np->v[j]->vcol : ((npl.geomflags & PL_HASPCOL) ? np->pcol : *c); (*_mgc->astk->shader)(1, &V[j], (Point3 *)&np->pn, &C[j], &C[j]); } mgpolygon(np->n_vertices, V, 1, &np->pn, np->n_vertices, C); } break; default: break; } } else { /* ordinary shading */ mgpolylist(npl.n_polys, npl.p, npl.n_verts, npl.vl, npl.geomflags); } /* Generate a BSP-tree if the object or parts of it might be * translucent. */ if (NDctx->bsptree && (npl.geomflags & GEOM_ALPHA)) { GeomNodeDataMove(NPolyListGeom(pl), PolyListGeom(&npl)); GeomBSPTree(PolyListGeom(&npl), NDctx->bsptree, BSPTREE_ADDGEOM); GeomNodeDataMove(PolyListGeom(&npl), NPolyListGeom(pl)); } h->v = hdata; HPtNDelete(h); } NPolyList *NPolyListDraw(NPolyList *pl) { mgNDctx *NDctx = NULL; mgctxget(MG_NDCTX, &NDctx); if(NDctx) { draw_projected_polylist(NDctx, pl); return pl; } return NULL; } /* A dummy, just to make GeomBSPTree() not bail out. */ NPolyList *NPolyListBSPTree(NPolyList *pl, BSPTree *tree, int action) { (void)tree; (void)action; return pl; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/npolylist/nplload.c0000644000175000017500000001700212310110200016552 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Load a NPolyList object from an "nOFF"-format file. * */ #include #include "npolylistP.h" #define SIZEOF_CMAP 256 static ColorA *colormap; static void LoadCmap(char *file) { IOBFILE *fp; colormap = OOGLNewNE(ColorA, 256, "PolyList colormap"); if((file = findfile(NULL, file)) != NULL && (fp = iobfopen(file,"r")) != NULL) { iobfgetnf(fp, SIZEOF_CMAP*4, (float *)colormap, 0); iobfclose(fp); } } NPolyList * NPolyListFLoad(IOBFILE *file, char *fname) { NPolyList *pl; Vertex **vp; int edges; int i; float *v; int binary = 0; int headerseen = 0; int flags = 0; char *token; int dimn = 3, pdim; static ColorA black = { 0,0,0,0 }; vvec vi; if (file == NULL) return NULL; token = GeomToken(file); if(strncmp(token, "ST", 2) == 0) { flags |= PL_HASST; token += 2; } if(*token == 'C') { flags = PL_HASVCOL; /* Per-vertex colors */ token++; } if(*token == '4') { dimn = 4; token++; } if(*token == 'S') { /* "smooth surface": we compute vtx normals */ /* ??? normals ??? */ token++; } if(strcmp(token, "nOFF") == 0) { headerseen = 1; if(iobfgetni(file, 1, &pdim, binary) == 0) { OOGLSyntax(file, "nOFF %s: expected dimension", fname); return NULL; } if (pdim < 4) { OOGLSyntax(file, "nOFF %s: dimension %d must be > 4", fname, pdim); return NULL; } if(iobfnextc(file, 1) == 'B' && iobfexpectstr(file, "BINARY") == 0) { binary = 1; if(iobfnextc(file, 1) != '\n') /* Expect \n after BINARY */ return NULL; (void) iobfgetc(file); /* Toss \n */ } } else { return NULL; } pl = OOGLNewE(NPolyList, "NPolyListFLoad NPolyList"); memset(pl, 0, sizeof(NPolyList)); GGeomInit(pl, NPolyListMethods(), NPLMAGIC, NULL); pl->geomflags = flags | ((dimn == 4) ? VERT_4D : 0); #if 0 /* wrong: the Ndim number of the nOFF and 4nOFF file formats does _NOT_ include the homogeneous component */ pl->pdim = pdim + (dimn == 4 ? 0 : 1); #else pl->pdim = pdim + 1; pdim += dimn == 4; /* number of coordinates specified in OFF file */ #endif if(iobfgetni(file, 1, &pl->n_verts, binary) <= 0 || iobfgetni(file, 1, &pl->n_polys, binary) <= 0 || iobfgetni(file, 1, &edges, binary) <= 0) { if(headerseen) OOGLSyntax(file, "PolyList %s: Bad vertex/face/edge counts", fname); goto bogus; } VVINIT(vi, int, 5*pl->n_polys); pl->v = OOGLNewNE(HPtNCoord, pl->n_verts*pl->pdim, "NPolyListFLoad vertices"); pl->vl = OOGLNewNE(Vertex, pl->n_verts, "NPolyListFLoad vertex descriptions"); if(pl->geomflags & PL_HASVCOL) pl->vcol = OOGLNewNE(ColorA, pl->n_verts, "NPolyListFLoad vertex colors"); for(v = pl->v, i = 0; i < pl->n_verts; v += pl->pdim, i++) { if(iobfgetnf(file, pdim, v + (pdim != pl->pdim ? 1 : 0), binary) < pdim || ((flags & PL_HASVCOL) && iobfgetnf(file, 4, (float *)&pl->vcol[i], binary) < 4) || ((flags & PL_HASST) && iobfgetnf(file, 2, (float *)&pl->vl[i].st, binary) < 2)) { OOGLSyntax(file, "nOFF %s: Bad vertex %d (of %d)", fname, i, pl->n_verts); goto bogus; } if (flags & PL_HASVCOL) { pl->vl[i].vcol = pl->vcol[i]; if (pl->vcol[i].a != 1.0) { pl->geomflags |= COLOR_ALPHA; } } if (dimn == 3) v[0] = 1.0; } if (flags & PL_HASVCOL) { /* vcol and vl[].vcol are in sync */ pl->geomflags |= NPL_HASVLVCOL; } pl->pv = OOGLNewNE(int, pl->n_polys, "NPolyListFLoad polygon vertices"); pl->p = OOGLNewNE(Poly, pl->n_polys, "NPolyListFLoad polygons"); for(i = 0; i < pl->n_polys; ++i) { Poly *p; int k, index; p = &pl->p[i]; if(iobfgetni(file, 1, &p->n_vertices, binary) <= 0 || p->n_vertices <= 0) { OOGLSyntax(file, "PolyList %s: bad %d'th polygon (of %d)", fname, i, pl->n_polys); goto bogus_face; } pl->pv[i] = VVCOUNT(vi); VVCOUNT(vi) += p->n_vertices; vvneeds(&vi, VVCOUNT(vi)); for(k = 0; k < p->n_vertices; k++) { int index; if(iobfgetni(file, 1, &index, binary) <= 0 || index < 0 || index >= pl->n_verts) { OOGLSyntax(file, "PolyList: %s: bad index %d on %d'th polygon (of %d)", fname, index, i, p->n_vertices); goto bogus_face; } VVEC(vi, int)[pl->pv[i]+k] = index; } /* Pick up the color, if any. * In ASCII format, take whatever's left before end-of-line */ p->pcol = black; if(binary) { int ncol; if(iobfgetni(file, 1, &ncol, 1) <= 0 || iobfgetnf(file, ncol, (float *)&p->pcol, 1) < ncol) goto bogus_face_color; k = ncol; } else { for(k = 0; k < 4 && iobfnextc(file, 1) != '\n'; k++) { if(iobfgetnf(file, 1, ((float *)(&p->pcol))+k, 0) < 1) goto bogus_face_color; } } if((flags & PL_HASVCOL) == 0) { if(k > 0) pl->geomflags |= PL_HASPCOL; if(k != 1 && (p->pcol.r>1||p->pcol.g>1||p->pcol.b>1||p->pcol.a>1)) { p->pcol.r /= 255, p->pcol.g /= 255, p->pcol.b /= 255, p->pcol.a /= 255; } switch(k) { case 0: p->pcol.r = 170/255.0; /* Gray */ p->pcol.g = p->pcol.r; case 2: p->pcol.b = p->pcol.g; case 3: p->pcol.a = 170/255.0; /* Semitransparent */ break; case 1: /* use colormap */ if ( colormap == NULL ) LoadCmap("cmap.fmap"); index = p->pcol.r; if((unsigned)index >= SIZEOF_CMAP) index = 0; p->pcol = colormap[index]; } /* case 4, all components supplied */ } if ((pl->geomflags & PL_HASPCOL) && p->pcol.a != 1.0) { pl->geomflags |= COLOR_ALPHA; } } /* Hand the list of vertex-indices on to the new object */ vvtrim(&vi); pl->nvi = VVCOUNT(vi); pl->vi = VVEC(vi, int); /* Now generate the necessary information for pl->p[], i.e. insert * the pointers to the 3d vertices in the proper places; there * really is no need to do this evertime again and again when * drawing the object. */ vp = OOGLNewNE(Vertex *, pl->nvi, "NPolyList 3d connectivity"); for (i = 0; i < pl->n_polys; i++) { Poly *p = &pl->p[i]; int k; p->v = vp; vp += p->n_vertices; for (k = 0; k < p->n_vertices; k++) { p->v[k] = &pl->vl[pl->vi[pl->pv[i]+k]]; } } return pl; bogus_face_color: OOGLSyntax(file, "PolyList %s: bad face color on face %d (of %d)", fname, i, pl->n_polys); bogus_face: pl->n_polys = i; bogus: GeomDelete((Geom *)pl); return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/npolylist/nplsave.c0000644000175000017500000000624412310110200016577 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Claus-Justus Heine */ /* * Save a NPolyList (in .off format). */ #include "npolylistP.h" NPolyList * NPolyListFSave(NPolyList *pl, FILE *outf, char *fname) { int i, k; HPtNCoord *v; ColorA *c; (void)fname; /* We don't really know the number of edges and it's a pain to count. * Assume Euler number 2. */ if (pl->pdim == 4) { fprintf(outf, "%s%s%sOFF\n%d %d %d\n", pl->geomflags & PL_HASST ? "ST" : "", pl->geomflags & PL_HASVCOL ? "C" : "", pl->geomflags & VERT_4D ? "4" : "", pl->n_verts, pl->n_polys, 0); } else { fprintf(outf, "%s%s%snOFF %d\n%d %d %d\n", pl->geomflags & PL_HASST ? "ST" : "", pl->geomflags & PL_HASVCOL ? "C" : "", pl->geomflags & VERT_4D ? "4" : "", pl->pdim - 1, pl->n_verts, pl->n_polys, 0); } for(i = 0, v = pl->v, c = pl->vcol; i < pl->n_verts; ++i, ++c) { if(pl->geomflags & VERT_4D) { if (pl->pdim == 4) { float denom = *v++; for(k = pl->pdim-1; --k >= 0; ) { fprintf(outf, "%.8g ", *v++); } fprintf(outf, "%.8g ", denom); } else { for(k = pl->pdim; --k >= 0; ) fprintf(outf, "%.8g ", *v++); } } else { float denom = *v++; for(k = pl->pdim; --k > 0; ) fprintf(outf, "%.8g ", *v++/denom); } if(pl->geomflags & PL_HASVCOL) { fprintf(outf, " %.8g %.8g %.8g %.8g", c->r, c->g, c->b, c->a); } if (pl->geomflags & PL_HASST) { fprintf(outf, " %.8g %.8g", pl->vl[i].st.s, pl->vl[i].st.t); } fputc('\n', outf); } fputc('\n', outf); for(i = 0; i < pl->n_polys; i++) { Poly *p = &pl->p[i]; fprintf(outf, "\n%d ", p->n_vertices); for(k = 0; k < p->n_vertices; k++) fprintf(outf, " %d", pl->vi[pl->pv[i] + k]); if((pl->geomflags & PL_HASPCOL)) { fprintf(outf, "\t%.8g %.8g %.8g %.8g", p->pcol.r, p->pcol.g, p->pcol.b, p->pcol.a); } } fputc('\n', outf); return (ferror(outf) ? NULL : pl); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: * */ geomview-1.9.5/src/lib/gprim/npolylist/npolylist.h0000644000175000017500000000301612310110200017163 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef NPOLYLISTDEFS #define NPOLYLISTDEFS /* * Public definitions for PolyList's */ #include "bbox.h" typedef struct NPolyList NPolyList; extern NPolyList *NPolyListDraw( NPolyList * ); extern BBox *NPolyListBound(NPolyList *np, Transform T, TransformN *TN); extern NPolyList *NPolyListEvert( NPolyList * ); extern NPolyList *NPolyListLoad( char * ); /* Loads "off" files */ extern NPolyList *NPolyListFLoad( IOBFILE *, char *fname ); extern char *NPolyListName( void ); extern NPolyList *NPolyListFSave( NPolyList *, FILE *, char * ); #endif/*NPOLYLISTDEFS*/ geomview-1.9.5/src/lib/gprim/npolylist/npolylistP.h0000644000175000017500000000534512310110200017312 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef NPOLYLISTPDEFS #define NPOLYLISTPDEFS /* * Private definitions for PolyList's */ #include "geom.h" #include "bboxP.h" #include "polylistP.h" #include "npolylist.h" #define NPLMAGIC GeomMagic ('P', 1) struct NPolyList { GEOMFIELDS; int n_polys; int n_verts; int *vi; /* array of vertex indices (all faces) */ int nvi; /* room allocated for vertex indices */ int *pv; /* start index for each poly into vi */ HPtNCoord *v; /* v[n_verts][pdim] */ ColorA *vcol; /* per vertex colors */ Poly *p; /* list of polygons, including projected vertices * when drawing the list. */ Vertex *vl; /* 3d vertex definitions, including texture * coordinates and per vertex colors, * projected vertices and normals when * drawing. */ }; static inline Ref *NPolyListRef(NPolyList *pl) { union castit { Ref ref; NPolyList pl; }; return &((union castit *)pl)->ref; } static inline Geom *NPolyListGeom(NPolyList *pl) { union castit { Geom geom; NPolyList pl; }; return &((union castit *)pl)->geom; } #define NPL_HASVLVCOL GEOMFLAG(0x8000) /* pl->vl[i].vcol is uptodate */ extern NPolyList *NPolyListCreate(NPolyList *exist, GeomClass *Class, va_list *a_list); extern NPolyList *NPolyListCopy( NPolyList *poly ); extern NPolyList *NPolyListDelete( NPolyList *poly ); extern NPolyList *NPolyListTransform(NPolyList *np, Transform T, TransformN *TN); extern Geom *NPolyListSphere(NPolyList *npl, Transform T, TransformN *TN, int *axes, int space); extern GeomClass *NPolyListMethods(); #endif/*NPOLYLISTPDEFS*/ /* * Local Variables: *** * c-basic-offset: 2 *** * End: * */ geomview-1.9.5/src/lib/gprim/npolylist/npltransform.c0000644000175000017500000000262712310110200017655 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif /* N-transform of an NPolylist */ #include "npolylistP.h" NPolyList *NPolyListTransform(NPolyList *np, Transform dummy, TransformN *T) { (void)dummy; if (T != NULL && T != (void *)TM_IDENTITY) { HPointN *tmp = HPtNCreate(np->pdim, NULL); float *tmp_data = tmp->v; int i; for (tmp->v = np->v, i = 0; i < np->n_verts; i++, tmp->v += np->pdim) { HPtNTransform(T, tmp, tmp); } tmp->v = tmp_data; HPtNDelete(tmp); } return np; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/npolylist/nplsphere.c0000644000175000017500000000250012310110200017116 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "geom.h" #include "create.h" #include "npolylistP.h" #include "sphere.h" Geom *NPolyListSphere(NPolyList *npl, Transform T, TransformN *TN, int *axes, int space) { Geom *sphere; /* Create a dummy sphere, the center will be corrected later */ sphere = GeomCreate("sphere", CR_SPACE, space, CR_END); SphereEncompassPoints((Sphere *)sphere, npl->v, 0 /* vert_4d */, npl->pdim, npl->n_verts, T, TN, axes); return sphere; } geomview-1.9.5/src/lib/gprim/npolylist/nplpick.c0000644000175000017500000000614112310110200016563 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include "ooglutil.h" #include "npolylistP.h" #include "point3.h" #include "hpoint3.h" #include "polyint.h" #include "pickP.h" #include "appearance.h" NPolyList * NPolyListPick(NPolyList *pl, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { int i; vvec plist; int fi, vi, ok, found = -1; Poly *poly; unsigned int apflag = 0; HPointN ptN[1]; if (!TN) return NULL; /* no 3d pick for ND object. */ /* we have full-featured ND-points here. */ ptN->flags = 0; ptN->dim = pl->pdim; /* Make sure that vects do not count as visible - otherwise they * will wreak havoc with the edge picking stuff. */ if (ap != NULL) { apflag = ap->flag; ap->flag &= ~APF_VECTDRAW; } VVINIT(plist, Point3, 0); found = -1; for (fi = 0, poly = pl->p; fi < pl->n_polys; ++fi, ++poly) { int *idx = pl->vi + pl->pv[fi]; vvneeds(&plist, poly->n_vertices); ok = 0; for (vi= 0 ; vi < poly->n_vertices; vi++) { ptN->v = pl->v + idx[vi]*pl->pdim; if (0 < HPtNNTransPt3(TN, axes, ptN, VVINDEX(plist, Point3, vi))) ok = 1; } if (ok && PickFace(poly->n_vertices, VVINDEX(plist, Point3, 0), p, ap)) found = fi; } vvfree(&plist); if (ap != NULL) ap->flag = apflag; if (found == -1) return NULL; if (p->found & PW_VERT) { p->vi = pl->vi[pl->pv[found]+p->vi]; ptN->v = pl->v + p->vi*pl->pdim; HPtNTransformComponents(TN, ptN, axes, &p->v); } if (p->found & PW_EDGE) { p->ei[0] = pl->vi[pl->pv[found]+p->ei[0]]; p->ei[1] = pl->vi[pl->pv[found]+p->ei[1]]; ptN->v = pl->v + p->ei[0]*pl->pdim; HPtNTransformComponents(TN, ptN, axes, &p->e[0]); ptN->v = pl->v + p->ei[1]*pl->pdim; HPtNTransformComponents(TN, ptN, axes, &p->e[1]); } if (p->found & PW_FACE) { if(p->f) OOGLFree(p->f); p->f = OOGLNewNE(HPoint3, p->fn, "PolyList pick"); for (i = 0; i < p->fn; i++) { ptN->v = pl->v + pl->vi[pl->pv[found]+i]*pl->pdim; HPtNTransformComponents(TN, ptN, axes, &p->f[i]); } p->fi = found; } if (TN) { p->TprimN = TmNCopy(TN, p->TprimN); memcpy(p->axes, axes, sizeof(p->axes)); } else TmCopy(T, p->Tprim); return pl; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/npolylist/Headers0000644000175000017500000000003112310110200016245 00000000000000npolylist.h npolylistP.h geomview-1.9.5/src/lib/gprim/polylist/0000755000175000017500000000000012310165602014677 500000000000000geomview-1.9.5/src/lib/gprim/polylist/Makefile.in0000644000175000017500000004777312310165554016714 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/polylist DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libpolylist_la_LIBADD = am_libpolylist_la_OBJECTS = plbound.lo plclass.lo plcopy.lo \ plcreate.lo pldraw.lo plevert.lo plload.lo plnormal.lo \ plpick.lo plsave.lo plsphere.lo pltransform.lo libpolylist_la_OBJECTS = $(am_libpolylist_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libpolylist_la_SOURCES) DIST_SOURCES = $(libpolylist_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libpolylist.la libpolylist_la_SOURCES = \ plbound.c plclass.c plcopy.c plcreate.c pldraw.c plevert.c plload.c plnormal.c plpick.c plsave.c plsphere.c pltransform.c \ polylist.h polylistP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/polylist/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/polylist/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libpolylist.la: $(libpolylist_la_OBJECTS) $(libpolylist_la_DEPENDENCIES) $(EXTRA_libpolylist_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libpolylist_la_OBJECTS) $(libpolylist_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pldraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plevert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plnormal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pltransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/polylist/Makefile.am0000644000175000017500000000042012310110200016627 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libpolylist.la libpolylist_la_SOURCES = \ plbound.c plclass.c plcopy.c plcreate.c pldraw.c plevert.c plload.c plnormal.c plpick.c plsave.c plsphere.c pltransform.c \ polylist.h polylistP.h geomview-1.9.5/src/lib/gprim/polylist/plbound.c0000644000175000017500000001143312310110200016410 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: Return the bounding box of a polylist. * * T TN AXES BBOX * NULL NULL NULL return the objects "native" bounding box * !NULL NULL NULL return a transformed bounding box, Nd objects * interprete T as acting on the x,y,z sub-space. * NULL !NULL NULL return a "native" transformed bounding box, Nd objects * just let TN act on their coordinates, 3d objects are * implicitly padded with zeros * NULL !NULL !NULL return a transformed and projected 3d bounding box. * 3d objects are implicitly padded with zeroes before * the projection is applied. * * All other combinations are unsupported. */ #include "polylistP.h" BBox *PolyListBound(PolyList *polylist, Transform T, TransformN *TN) { int n; Vertex *v; HPoint3 min, max; HPoint3 clean, tmp; n = polylist->n_verts; v = polylist->vl; min = v->pt; /* We assume all the vertices in vl[] are actually used... */ while(--n >= 0 && !finite(v->pt.x + v->pt.y + v->pt.z + v->pt.w)) v++; if(n <= 0) return NULL; /* No finite points */ /* First handle the case without transformations, this means that we return a 3d bbox for 3d polylists, and a 4d bboy for 4d polylists. */ if ((T == TM_IDENTITY || !T) && !TN) { if (!T && (polylist->geomflags & VERT_4D)) { max = min; while(--n >= 0) { Pt4MinMax(&min, &max, &(++v)->pt); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_4D, 1, CR_END); } else { HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { HPt3MinMax(&min, &max, &(++v)->pt); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *ptN; HPointN *minN; HPointN *maxN; BBox *result; ptN = HPtNCreate(5, NULL); if (polylist->geomflags & VERT_4D) { minN = Pt4NTransform(TN, &min, NULL); } else { minN = HPt3NTransform(TN, &min, NULL); } HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); while(--n >= 0) { if (polylist->geomflags & VERT_4D) { Pt4NTransform(TN, &(++v)->pt, ptN); } else { HPt3NTransform(TN, &(++v)->pt, ptN); } HPtNMinMax(minN, maxN, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(ptN); HPtNDelete(minN); HPtNDelete(maxN); return result; } /* A 3d bbox is requested, with transformations */ if (T) { /* ordinary 3d transform */ if (false && polylist->geomflags & VERT_4D) { /* We operate on the 3x3 x,y,z space, this means that we just * have to omit the "w" coordinate. */ min.w = 1.0; HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { tmp = (++v)->pt; tmp.w = 1.0; HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } } else { /* ordinary 3d object */ HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { tmp = (++v)->pt; HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/polylist/plclass.c0000644000175000017500000000516512310110200016413 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/gprim/polylist/plclass.c,v 1.7 2007/02/09 17:15:35 rotdrop Exp $ */ /* * Initialize the PolyList class record. */ #include "polylistP.h" static GeomClass *aPolyListMethods = NULL; int PolyListPresent = 1; static char polylistName[] = "polylist"; char * PolyListName() { return polylistName; } GeomClass *PolyListMethods(void) { if (!aPolyListMethods) { aPolyListMethods = GeomClassCreate(polylistName); aPolyListMethods->name = (GeomNameFunc *) PolyListName; aPolyListMethods->methods = (GeomMethodsFunc *) PolyListMethods; aPolyListMethods->draw = (GeomDrawFunc *) PolyListDraw; aPolyListMethods->bsptree = (GeomBSPTreeFunc *) PolyListBSPTree; aPolyListMethods->bound = (GeomBoundFunc *) PolyListBound; aPolyListMethods->boundsphere = (GeomBoundSphereFunc *) PolyListSphere; aPolyListMethods->evert = (GeomEvertFunc *) PolyListEvert; aPolyListMethods->create = (GeomCreateFunc *) PolyListCreate; aPolyListMethods->copy = (GeomCopyFunc *) PolyListCopy; aPolyListMethods->fsave = (GeomFSaveFunc *) PolyListFSave; aPolyListMethods->Delete = (GeomDeleteFunc *) PolyListDelete; aPolyListMethods->fload = (GeomFLoadFunc *) PolyListFLoad; aPolyListMethods->pick = (GeomPickFunc *) PolyListPick; aPolyListMethods->transform = (GeomTransformFunc *) PolyListTransform; aPolyListMethods->transformto = (GeomTransformToFunc *) PolyListTransform; } return aPolyListMethods; } geomview-1.9.5/src/lib/gprim/polylist/plcopy.c0000644000175000017500000000437412310110200016261 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/gprim/polylist/plcopy.c,v 1.6 2007/03/10 12:57:54 rotdrop Exp $ */ /* * Geometry object routines * * Copy a PolyList. */ #include "polylistP.h" PolyList *PolyListCopy(PolyList *polylist) { PolyList *newpl; Poly *newp; Vertex *newvl; int i, j; Poly *op, *np; if(polylist == NULL) return NULL; newvl = OOGLNewNE(Vertex, polylist->n_verts, "PolyList verts"); newp = OOGLNewNE(Poly, polylist->n_polys, "PolyList polygons"); newpl = OOGLNewE(PolyList, "PolyList"); *newpl = *polylist; newpl->p = newp; newpl->vl = newvl; memcpy(newvl, polylist->vl, polylist->n_verts * sizeof(Vertex)); memcpy(newp, polylist->p, polylist->n_polys * sizeof(Poly)); for(i = polylist->n_polys, op = polylist->p, np = newp; --i >= 0; op++, np++) { np->v = OOGLNewNE(Vertex *, op->n_vertices, "PolyList vert list"); for(j = op->n_vertices; --j >= 0; ) np->v[j] = &newvl[ op->v[j] - polylist->vl ]; } newpl->plproj = NULL; return newpl; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/polylist/plcreate.c0000644000175000017500000001500712310110200016545 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * PolyList creation, editing, and deletion. */ #include "polylistP.h" #include "bsptree.h" /* * Free a PolyList. */ #include "polylistP.h" PolyList * PolyListDelete(PolyList *pl) { int i; Poly *p; if (pl == NULL) { return NULL; } if((p = pl->p) != NULL) { for(i = pl->n_polys; --i >= 0; p++) { if(p->v != NULL) OOGLFree(p->v); } OOGLFree(pl->p); } if(pl->vl != NULL) { OOGLFree(pl->vl); } PolyListDelete(pl->plproj); return NULL; } PolyList * PolyListCreate(PolyList *exist, GeomClass *classp, va_list *a_list) { PolyList *pl; Vertex *v; int *nvertperpol=NULL, *verts=NULL; int npolyflag=0, nvertflag=0, vertflag=0, pointflag=0; HPoint3 *v4 = NULL; Point3 *v3 = NULL, *vn = NULL, *pn = NULL; ColorA *vc = NULL, *pc = NULL; int *pf = NULL; int attr, copy=1; int numentries=0, numvertices=0; int i; int j, k=0, dimn = 3; if (exist == NULL) { pl = OOGLNewE(PolyList,"PolyListCreate polylist"); GGeomInit(pl, classp, PLMAGIC, NULL); pl->geomflags = pl->n_polys = pl->n_verts = 0; pl->pdim = 4; pl->p = (Poly *)NULL; pl->vl = (Vertex *)NULL; pl->plproj = NULL; } else { pl = exist; PolyListDelete(pl->plproj); /* better delete it. */ pl->plproj = NULL; } while ((attr = va_arg(*a_list, int))) switch (attr) { case CR_NOCOPY: OOGLError(0,"Note: NOCOPY option not used by PolyListCreate()"); break; case CR_FLAG: pl->geomflags = va_arg(*a_list, int); break; case CR_NPOLY: pl->n_polys = va_arg(*a_list, int); npolyflag = 1; break; case CR_NVERT: /* number of verts of each polygon */ nvertperpol = va_arg(*a_list, int*); nvertflag = 1; break; case CR_VERT: /* indices of all verts of all polygons, concatenated */ /* verts[] contains sum(nvertperpol[]) elements */ verts = va_arg(*a_list, int*); vertflag = 1; break; case CR_POINT: v3 = va_arg(*a_list, Point3 *); pointflag = 1; dimn = 3; pl->geomflags &= ~(PL_HASVN | PL_HASPN | PL_HASPFL); break; case CR_POINT4: v4 = va_arg(*a_list, HPoint3 *); pointflag = 1; dimn = 4; pl->geomflags &= ~(PL_HASVN | PL_HASPN | PL_HASPFL); break; case CR_NORMAL: vn = va_arg(*a_list, Point3 *); /* if no normal bit has been set... */ if (vn) pl->geomflags |= PL_HASVN; break; case CR_COLOR: pl->geomflags &= ~COLOR_ALPHA; vc = va_arg(*a_list, ColorA *); if (vc) { pl->geomflags |= PL_HASVCOL; } break; case CR_POLYNORMAL: pn = va_arg(*a_list, Point3 *); if (pn) pl->geomflags |= PL_HASPN; break; case CR_POLYFLAGS: pf = va_arg(*a_list, int *); if (pf) pl->geomflags |= PL_HASPFL; break; case CR_POLYCOLOR: pl->geomflags &= ~COLOR_ALPHA; pc = va_arg(*a_list, ColorA *); if (pc) { pl->geomflags |= PL_HASPCOL; } break; default: if (GeomDecorate(pl, ©, attr, a_list)) { OOGLError(0,"Undefined PolyList option: %d", attr); if (!exist) GeomDelete((Geom *)pl); return NULL; } } if (!exist && (!npolyflag || !nvertflag || !vertflag || !pointflag)) { if (!npolyflag) OOGLError(0,"Must specify number of polygons"); if (!nvertflag) OOGLError(0,"Must specify NVERT array"); if (!vertflag) OOGLError(0,"Must specify VERT array"); if (!pointflag) OOGLError(0,"Must specify vertices"); GeomDelete((Geom *)pl); return NULL; } if(nvertflag) { for (i=0; in_polys; i++) numentries += nvertperpol[i]; for (i=0; i numvertices) numvertices = verts[i]; pl->n_verts = numvertices + 1; if(pl->vl) OOGLFree(pl->vl); pl->vl = OOGLNewNE(Vertex, pl->n_verts, "polylist vertices"); } if(pointflag) { /* if dimn == 3, copy over into 4-vector area and add a '1' in * the 4th coordinate */ int needhomog = 0; v = pl->vl; i = pl->n_verts; if (dimn == 3) { while(--i >= 0) { v->pt.x = v3->x; v->pt.y = v3->y; v->pt.z = v3->z; v->pt.w = 1.0; v++; v3++; } } else { while(--i >= 0) { v->pt = *v4++; if(v->pt.w != 1) needhomog = VERT_4D; v++; } } pl->geomflags = (pl->geomflags & ~VERT_4D) | needhomog; } if(nvertflag) { pl->p = OOGLNewNE(Poly, pl->n_polys, "PolyListCreate polygons"); k = 0; for (i=0; i < pl->n_polys; i++) { int nv = nvertperpol[i]; pl->p[i].flags = 0; pl->p[i].n_vertices = nv; pl->p[i].v = OOGLNewNE(Vertex *, nvertperpol[i], "PolyListCreate poly vert pointers"); for (j = 0; j < nv; j++) pl->p[i].v[j] = &pl->vl[verts[k++]]; } } if (vn) for (i = 0, v = pl->vl; i < pl->n_verts; i++, v++) v->vn = vn[i]; if (pn) for (i = 0; i < pl->n_polys; i++) pl->p[i].pn = pn[i]; if (pf) for (i = 0; i < pl->n_polys; i++) pl->p[i].flags = pf[i]; if (vc) { for (i = 0, v = pl->vl; i < pl->n_verts; i++, v++) { v->vcol = vc[i]; if (vc[i].a != 1.0) { pl->geomflags |= COLOR_ALPHA; } } } if (pc) { for (i = 0; i < pl->n_polys; i++) { pl->p[i].pcol = pc[i]; if (pc[i].a != 1.0) { pl->geomflags |= COLOR_ALPHA; } } } return pl; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/polylist/pldraw.c0000644000175000017500000002267212310110200016245 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/gprim/polylist/pldraw.c,v 1.20 2008/05/19 04:46:23 rotdrop Exp $ */ /* * Draw a PolyList using mg library. */ #include #include "polylistP.h" #include "appearance.h" #include "mgP.h" /* need mgP.h (instead of mg.h) for _mgc below */ #include "cmodel.h" #include "hpointn.h" #include "bsptreeP.h" static void draw_projected_polylist(mgNDctx *NDctx, PolyList *pl) { PolyList *npl; HPointN *h; Poly *np; Vertex *ov, *nv; int i, j; bool colored = false, alpha = false; mgNDmapfunc mapHPtN = NDctx->mapHPtN; Appearance *ap = &_mgc->astk->ap; Material *mat = &_mgc->astk->mat; int normal_need; if (pl->plproj == NULL) { pl->plproj = (PolyList *)GeomCopy((Geom *)pl); ApDelete(pl->plproj->ap); } npl = pl->plproj; h = HPtNCreate(5, NULL); if (ap->flag & APF_KEEPCOLOR) { colored = false; } else { HPoint3 dummyv; ColorA dummyc; /* Dummy transform to determine whether we have ND colors or not */ colored = mapHPtN(NDctx, h, &dummyv, &dummyc) != 0; } /* Transform vertices */ npl->geomflags &= ~VERT_4D; for(i = 0, ov = pl->vl, nv = npl->vl; i < pl->n_verts; i++, ov++, nv++) { if (pl->geomflags & VERT_4D) { /* Set the point's first four components from our 4-D vertex */ Pt4ToHPtN(&ov->pt, h); } else { /* Set the point's first THREE components from our 4-D vertex */ HPt3ToHPtN(&ov->pt, NULL, h); } if (colored) { mapHPtN(NDctx, h, &nv->pt, &nv->vcol); if (nv->vcol.a < 1.0) { alpha = true; } } else { nv->vcol = ov->vcol; mapHPtN(NDctx, h, &nv->pt, NULL); } } if (colored) { if (alpha) { npl->geomflags |= COLOR_ALPHA; } else { npl->geomflags &= ~COLOR_ALPHA; } npl->geomflags &= ~PL_HASPCOL; npl->geomflags |= PL_HASVCOL; } else if (npl->geomflags & GEOM_COLOR) { colored = true; } /* The drawing routines might need either polygon or vertex normals, * so if either is missing and either might be needed, we force it * to be computed. */ npl->geomflags &= ~(PL_HASVN|PL_HASPN|PL_HASPFL); normal_need = (ap->flag & APF_NORMALDRAW) ? PL_HASPN|PL_HASVN : 0; if (ap->flag & APF_FACEDRAW) { switch (ap->shading) { case APF_FLAT: case APF_VCFLAT: normal_need |= PL_HASPN; break; case APF_SMOOTH: normal_need |= PL_HASVN; break; default: break; } if (GeomHasAlpha((Geom *)npl, ap)) { normal_need |= PL_HASPFL|PL_HASPN; } } if (normal_need) { PolyListComputeNormals(npl, normal_need); } if ((_mgc->astk->flags & MGASTK_SHADER) && !(npl->geomflags & GEOM_ALPHA)) { ColorA *c = !colored || (mat->override & MTF_DIFFUSE) ? (ColorA *)&mat->diffuse : NULL; switch (ap->shading) { case APF_SMOOTH: for (i = 0, nv = npl->vl; i < npl->n_verts; i++, nv++) { (*_mgc->astk->shader)(1, &nv->pt, &nv->vn, c ? c : &nv->vcol, &nv->vcol); } npl->geomflags |= PL_HASVCOL; mgpolylist(npl->n_polys, npl->p, npl->n_verts, npl->vl, npl->geomflags); break; case APF_FLAT: for (i = 0, np = npl->p; i < npl->n_polys; i++, np++) { (*_mgc->astk->shader)(1, &np->v[0]->pt, &np->pn, c ? c : &np->pcol, &np->pcol); } npl->geomflags |= PL_HASPCOL; mgpolylist(npl->n_polys, npl->p, npl->n_verts, npl->vl, npl->geomflags); break; case APF_VCFLAT: for (i = 0, np = npl->p; i < npl->n_polys; i++, np++) { VARARRAY(V, HPoint3, np->n_vertices); VARARRAY(C, ColorA, np->n_vertices); for (j = 0; j < np->n_vertices; j++) { V[j] = np->v[j]->pt; C[j] = (npl->geomflags & PL_HASVCOL) ? np->v[j]->vcol : ((npl->geomflags & PL_HASPCOL) || c == NULL ? np->pcol : *c); (*_mgc->astk->shader)(1, &V[j], (Point3 *)&np->pn, &C[j], &C[j]); } mgpolygon(np->n_vertices, V, 1, &np->pn, np->n_vertices, C); } break; default: break; } } else { /* ordinary shading */ mgpolylist(npl->n_polys, npl->p, npl->n_verts, npl->vl, npl->geomflags); } /* Generate a BSP-tree if the object or parts of it might be * translucent. */ if (NDctx->bsptree && (npl->geomflags & GEOM_ALPHA)) { GeomNodeDataMove((Geom *)pl, (Geom *)npl); GeomBSPTree((Geom *)npl, NDctx->bsptree, BSPTREE_ADDGEOM); GeomNodeDataMove((Geom *)npl, (Geom *)pl); } HPtNDelete(h); } PolyList *PolyListDraw(PolyList *pl) { mgNDctx *NDctx = NULL; Appearance *ap = &_mgc->astk->ap; mgctxget(MG_NDCTX, &NDctx); if (NDctx) { draw_projected_polylist(NDctx, pl); return pl; } /* The drawing routines might need either polygon or vertex normals, * so if either is missing and either might be needed, we force it * to be computed. */ if ((pl->geomflags & (PL_HASVN|PL_HASPN|PL_HASPFL)) != (PL_HASVN|PL_HASPN|PL_HASPFL)) { int need = PL_HASPFL; if (ap->flag & APF_NORMALDRAW) { need |= PL_HASPN|PL_HASVN; } else if (ap->flag & APF_FACEDRAW) { switch (ap->shading) { case APF_FLAT: case APF_VCFLAT: need |= PL_HASPN; break; case APF_SMOOTH: need |= PL_HASVN; break; default: break; } } if (need) { PolyListComputeNormals(pl, need); } } if (_mgc->space & TM_CONFORMAL_BALL) { cmodel_clear(_mgc->space); cm_read_polylist(pl); cmodel_draw(pl->geomflags); } else if (!(pl->geomflags & GEOM_ALPHA) && _mgc->astk->flags & MGASTK_SHADER) { /* * Software shading */ Poly *p; ColorA *c0 = (ColorA *)&_mgc->astk->mat.diffuse; ColorA pc, *nc = NULL, *savedc = NULL; int i, j; int flags = pl->geomflags; /* Smooth or facetted? */ switch (ap->shading) { case APF_SMOOTH: { Vertex *v; if (flags & PL_HASVCOL) { savedc = OOGLNewNE(ColorA, pl->n_verts, "saved colours"); } else if(flags & PL_HASPCOL) { /* Rats. We need vertex colors, but only face colors are * supplied. Associate a face with each vertex. */ p = pl->p; for(i = 0; i < pl->n_polys; i++, p++) for(j = p->n_vertices; --j >= 0; ) p->v[j]->vcol = p->pcol; c0 = &pc; } for (i = 0, nc = savedc, v = pl->vl; i < pl->n_verts; i++, v++) { if (savedc) { /* If we had per-vertex colors, save & use them */ *nc = v->vcol; (*_mgc->astk->shader)(1, &v->pt, &v->vn, nc, &v->vcol); nc++; } else { /* If no per-vertex colors, use material default */ if (flags & PL_HASPCOL) { pc = v->vcol; } (*_mgc->astk->shader)(1, &v->pt, &v->vn, c0, &v->vcol); } } mgpolylist(pl->n_polys, pl->p, pl->n_verts, pl->vl, flags|PL_HASVCOL); /* Restore colors if trashed */ if(savedc) { for(i = 0, v = pl->vl, nc = savedc; i < pl->n_verts; i++, v++) { v->vcol = *nc++; } OOGLFree(savedc); } break; } case APF_FLAT: if (flags & PL_HASPCOL) { nc = savedc = OOGLNewNE(ColorA, pl->n_polys, "saved colours"); } for (i = 0, p = pl->p; i < pl->n_polys; i++, p++) { if (savedc) { *nc = p->pcol; (*_mgc->astk->shader)(1, &p->v[0]->pt, (Point3 *)&p->pn, nc, &p->pcol); nc++; } else { (*_mgc->astk->shader)(1, &p->v[0]->pt, (Point3 *)&p->pn, flags & PL_HASVCOL ? &p->v[0]->vcol : c0, &p->pcol); } } mgpolylist(pl->n_polys, pl->p, pl->n_verts, pl->vl, flags|PL_HASPCOL); /* Restore colors if trashed */ if (savedc) { for (i = 0, p = pl->p, nc = savedc; i < pl->n_polys; i++, p++) { p->pcol = *nc++; } OOGLFree(savedc); } break; case APF_VCFLAT: for (i = 0, p = pl->p; i < pl->n_polys; i++, p++) { VARARRAY(V, HPoint3, p->n_vertices); VARARRAY(C, ColorA, p->n_vertices); for (j = 0; j < p->n_vertices; j++) { V[j] = p->v[j]->pt; C[j] = (flags & PL_HASVCOL) ? p->v[j]->vcol : ((flags & PL_HASPCOL) ? p->pcol : *c0); (*_mgc->astk->shader)(1, &V[j], (Point3 *)&p->pn, &C[j], &C[j]); } mgpolygon(p->n_vertices, V, 1, &p->pn, p->n_vertices, C); } break; default: break; } } else { /* * Ordinary shading */ mgpolylist(pl->n_polys, pl->p, pl->n_verts, pl->vl, pl->geomflags); } return pl; } PolyList *PolyListBSPTree(PolyList *pl, BSPTree *tree, int action) { if (!never_translucent((Geom *)pl) && action == BSPTREE_ADDGEOM) { BSPTreeAddObject(tree, (Geom *)pl); } return pl; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/polylist/plevert.c0000644000175000017500000000410012310110200016417 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/gprim/polylist/plevert.c,v 1.7 2007/02/09 17:02:35 rotdrop Exp $ */ /* $Source: /cvsroot/geomview/geomview/src/lib/gprim/polylist/plevert.c,v $ */ /* * Evert all the normals in a polylist. */ #include "polylistP.h" PolyList * PolyListEvert( PolyList *polylist ) { Poly *p; Vertex *v; int i; polylist->geomflags ^= PL_EVNORM; if ((polylist->geomflags & (PL_HASVN|PL_HASPN)) == 0) { PolyListComputeNormals(polylist, PL_HASVN|PL_HASPN|PL_HASPFL); } else { i = polylist->n_polys; for (p = polylist->p; --i >= 0; p++) { p->pn.x = -p->pn.x; p->pn.y = -p->pn.y; p->pn.z = -p->pn.z; } i = polylist->n_verts; for (v = polylist->vl; --i >= 0; v++) { v->vn.x = -v->vn.x; v->vn.y = -v->vn.y; v->vn.z = -v->vn.z; } } return (polylist); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/polylist/plload.c0000644000175000017500000001514412310110200016223 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Load a PolyList object from an "off"-format file. * */ #include #include #include "polylistP.h" #define SIZEOF_CMAP 256 static ColorA *colormap; static void LoadCmap(char *file) { IOBFILE *fp; colormap = OOGLNewNE(ColorA, 256, "PolyList colormap"); if((file = findfile(NULL, file)) != NULL && (fp = iobfopen(file,"r")) != NULL) { iobfgetnf(fp, SIZEOF_CMAP*4, (float *)colormap, 0); iobfclose(fp); } } PolyList * PolyListFLoad(IOBFILE *file, char *fname) { PolyList *pl; int edges; int i; char *token; Vertex *v; int binary = 0; int preread = 0; int headerseen = 0; int flags = 0; bool makenorm = false; int dimn = 3; static ColorA black = { 0,0,0,0 }; if (file == NULL) return NULL; token = GeomToken(file); if(strncmp(token, "ST", 2) == 0) { flags |= PL_HASST; token += 2; } if(*token == 'C') { flags |= PL_HASVCOL; /* Per-vertex colors */ token++; } if(*token == 'N') { flags |= PL_HASVN; /* Per-vertex normals */ token++; } if(*token == '4') { dimn = 4; token++; } if(*token == 'S') { /* "smooth surface": we compute vtx normals */ makenorm = true; token++; } if(strcmp(token, "OFF") == 0) { headerseen = 1; if(iobfnextc(file, 1) == 'B' && iobfexpectstr(file, "BINARY") == 0) { binary = 1; if(iobfnextc(file, 1) != '\n') /* Expect \n after BINARY */ return NULL; (void) iobfgetc(file); /* Toss \n */ } } else { /* Hack, in case first token was a number */ if(dimn == 4) token--; preread = strtol(token, &token, 10); if(*token != '\0') return NULL; /* May be a header-less OFF */ flags = 0; dimn = 3; } pl = OOGLNewE(PolyList, "PolyListFLoad PolyList"); GGeomInit(pl, PolyListMethods(), PLMAGIC, NULL); pl->p = NULL; pl->vl = NULL; pl->n_verts = preread; /* In case prefetched token was our vert count */ pl->geomflags = flags | ((dimn == 4) ? VERT_4D : 0); pl->pdim = 4; pl->plproj = NULL; if((!preread && iobfgetni(file, 1, &pl->n_verts, binary) <= 0) || iobfgetni(file, 1, &pl->n_polys, binary) <= 0 || iobfgetni(file, 1, &edges, binary) <= 0) { if(headerseen) OOGLSyntax(file, "PolyList %s: Bad vertex/face/edge counts", fname); goto bogus; } pl->vl = OOGLNewNE(Vertex, pl->n_verts, "PolyListFLoad vertices"); for(v = pl->vl, i = 0; i < pl->n_verts; v++, i++) { if((iobfgetnf(file, dimn, (float *)&v->pt, binary) < dimn) || (flags & PL_HASVN && iobfgetnf(file, 3, (float *)&v->vn, binary) < 3) || (flags & PL_HASVCOL && iobfgetnf(file, 4, (float *)&v->vcol, binary) < 4) || (flags & PL_HASST && iobfgetnf(file, 2, (float *)&v->st, binary) < 2) ) { OOGLSyntax(file, "PolyList %s: Bad vertex %d (of %d)", fname, i, pl->n_verts); goto bogus; } if (dimn == 3) v->pt.w = 1.0; if ((flags & PL_HASVCOL) && v->vcol.a != 1.0) { pl->geomflags |= COLOR_ALPHA; } } pl->p = OOGLNewNE(Poly, pl->n_polys, "PolyListFLoad polygons"); for(i = 0; i < pl->n_polys; ) { Poly *p; int k,index; p = &pl->p[i]; if(iobfgetni(file, 1, &p->n_vertices, binary) <= 0 || p->n_vertices <= 0) { OOGLSyntax(file, "PolyList %s: bad %d'th polygon (of %d)", fname, i, pl->n_polys); goto bogus_face; } p->v = OOGLNewNE(Vertex *, p->n_vertices, "PolyListFLoad polygon"); i++; for(k = 0; k < p->n_vertices; k++) { int index; if(iobfgetni(file, 1, &index, binary) <= 0 || index < 0 || index >= pl->n_verts) { OOGLSyntax(file, "PolyList: %s: bad index %d on %d'th polygon (of %d)", fname, index, i, p->n_vertices); goto bogus_face; } p->v[k] = &pl->vl[index]; } /* Pick up the color, if any. * In ASCII format, take whatever's left before end-of-line * (or end-of-file, or close-brace) */ p->pcol = black; if(binary) { int ncol; if(iobfgetni(file, 1, &ncol, 1) <= 0 || iobfgetnf(file, ncol, (float *)&p->pcol, 1) < ncol) goto bogus_face_color; k = ncol; } else { int c; for(k = 0; k < 4 && (c = iobfnextc(file, 1)) != '\n' && c!='}' && c!=EOF; k++) { if(iobfgetnf(file, 1, ((float *)(&p->pcol))+k, 0) < 1) { goto bogus_face_color; } } } if(true || (flags & PL_HASVCOL) == 0) { if(k > 0) pl->geomflags |= PL_HASPCOL; if(k != 1 && (p->pcol.r>1||p->pcol.g>1||p->pcol.b>1||p->pcol.a>1)) { p->pcol.r /= 255, p->pcol.g /= 255, p->pcol.b /= 255, p->pcol.a /= 255; } switch(k) { case 0: p->pcol.r = 170/255.0; /* Gray */ p->pcol.g = p->pcol.r; case 2: p->pcol.b = p->pcol.g; case 3: p->pcol.a = 170/255.0; /* Semitransparent */ break; case 1: /* use colormap */ if ( colormap == NULL ) LoadCmap("cmap.fmap"); index = p->pcol.r; if((unsigned)index >= SIZEOF_CMAP) index = 0; p->pcol = colormap[index]; } /* case 4, all components supplied */ } if ((pl->geomflags & PL_HASPCOL) && p->pcol.a != 1.0) { pl->geomflags |= COLOR_ALPHA; } } if(makenorm && !(flags & PL_HASVN)) { pl->geomflags |= PL_HASVN; /* ???? where ???? */ } return pl; bogus_face_color: OOGLSyntax(file, "PolyList %s: bad face color on face %d (of %d)", fname, i, pl->n_polys); bogus_face: pl->n_polys = i; bogus: GeomDelete((Geom *)pl); return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/polylist/plnormal.c0000644000175000017500000002260112310110200016570 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Compute the normals to each surface in a polylist. */ #include "polylistP.h" void PolyNormal(Poly *p, Point3 *nu_av, int fourd, int evert, int *flagsp, int *first_concave) { int flags = 0, n; Vertex **vp; Vertex *v1, *v2, *v3; Pt3Coord w1, w2, w3, len; Point3 nu; if (first_concave){ *first_concave = 0; } nu_av->x = nu_av->y = nu_av->z = 0.0; if((n = p->n_vertices) >= 3) { v1 = p->v[n-2]; v2 = p->v[n-1]; vp = p->v; if (fourd) { #undef ANTI_4D #define ANTI_4D(P,Q) \ ((v2->pt.P*w2 - v1->pt.P*w1) * (v3->pt.Q*w3 - v1->pt.Q*w1) - \ (v2->pt.Q*w2 - v1->pt.Q*w1) * (v3->pt.P*w3 - v1->pt.P*w1)) w1 = !fzero(v1->pt.w) ? 1.0 / v1->pt.w : 1.0; w2 = !fzero(v2->pt.w) ? 1.0 / v2->pt.w : 1.0; do { v3 = *vp++; w3 = !fzero(v3->pt.w) ? 1.0 / v3->pt.w : 1.0; nu.x = ANTI_4D(y,z); nu.y = ANTI_4D(z,x); nu.z = ANTI_4D(x,y); if (!fneg(Pt3Dot(&nu, nu_av))) { Pt3Add(nu_av, &nu, nu_av); } else { Pt3Sub(nu_av, &nu, nu_av); flags |= POLY_CONCAVE; if (first_concave) { *first_concave = p->n_vertices - n; first_concave = NULL; } } v1 = v2; w1 = w2; v2 = v3; w2 = w3; } while(--n > 0); #undef ANTI_4D } else { #undef ANTI #define ANTI(P,Q) \ ((v2->pt.P - v1->pt.P) * (v3->pt.Q - v1->pt.Q) - \ (v2->pt.Q - v1->pt.Q) * (v3->pt.P - v1->pt.P)) do { v3 = *vp++; nu.x = ANTI(y,z); nu.y = ANTI(z,x); nu.z = ANTI(x,y); /*Pt3Unit(&nu);*/ if (!fneg(Pt3Dot(&nu, nu_av))) { Pt3Add(nu_av, &nu, nu_av); } else { Pt3Sub(nu_av, &nu, nu_av); flags |= POLY_CONCAVE; if (first_concave) { *first_concave = p->n_vertices - n; first_concave = NULL; } } /*Pt3Unit(nu_av);*/ v1 = v2; v2 = v3; } while(--n > 0); #undef ANTI } } len = Pt3Length(nu_av); #if 0 static Pt3Coord min_len = 1e8; if (!fzero(len) && len < min_len) { min_len = len; fprintf(stderr, "min_len: %e\n", min_len); } #endif if (fzero(len)) { /* degenerated */ flags |= POLY_NOPOLY; } else { if(evert) len = -len; Pt3Mul(1.0/len, nu_av, nu_av); if (flagsp && (n = p->n_vertices) > 3) { /* determine whether this polygon is flat or not */ Point3 diff; v1 = p->v[n-1]; vp = p->v; do { v2 = *vp++; if (fourd) { HPt3SubPt3(&v2->pt, &v1->pt, &diff); } else { Pt3Sub((Point3 *)(void *)&v2->pt, (Point3 *)(void *)&v1->pt, &diff); } if (!fzero(Pt3Dot(nu_av, &diff))) { p->flags |= POLY_NONFLAT; break; } v1 = v2; } while (--n > 0); } } if (flagsp) { *flagsp |= flags; } } PolyList * PolyListComputeNormals(PolyList *polylist, int need) { int i, n, fourd, evert; Poly *p; Vertex **vp; Pt3Coord len; Point3 nu_av; if (!polylist) return NULL; need &= ~polylist->geomflags; fourd = (polylist->geomflags & VERT_4D) != 0; evert = (polylist->geomflags & PL_EVNORM) != 0; if (need & (PL_HASPN|PL_HASPFL)) { /* Create per-polygon normals */ for (i = polylist->n_polys, p = polylist->p; --i >= 0; p++) { if((n = p->n_vertices) >= 3) { if (need & PL_HASPFL) { p->flags = 0; PolyNormal(p, &nu_av, evert, fourd, &p->flags, NULL); } else { PolyNormal(p, &nu_av, evert, fourd, NULL, NULL); } if (need & PL_HASPN) { p->pn = nu_av; } } } } if (need & PL_HASVN) { #if 0 for(i = polylist->n_verts, v = polylist->vl; --i >= 0; v++) { v->vn.x = v->vn.y = v->vn.z = 0.0; } for(i = polylist->n_polys, p = polylist->p; --i >= 0; p++) { for(n = p->n_vertices, vp = p->v; --n >= 0; vp++) { v = *vp; if (fneg(Pt3Dot(&v->vn, &p->pn))) { Pt3Sub(&p->pn, &v->vn, &v->vn); } else { Pt3Add(&p->pn, &v->vn, &v->vn); } } } for(i = polylist->n_verts, v = polylist->vl; --i >= 0; v++) { len = Pt3Length(&v->vn); if(fpos(len)) { if(polylist->flags & PL_EVNORM) len = -len; Pt3Mul(1.0/len, &v->vn, &v->vn); } } #else int *e_idx = OOGLNewNE(int, polylist->n_verts+1, "Adjacent edge indexes"); HPoint3 **edges; int n_edges = 0; Vertex *vl; #define V_IDX(elem, base) \ (int)((long)((char *)(elem) - (char *)(base))/sizeof(*elem)) memset(e_idx, 0, polylist->n_verts*sizeof(int)); for(i = polylist->n_polys, p = polylist->p; --i >= 0; p++) { for(n = p->n_vertices, vp = p->v; --n >= 0; vp++) { int v_idx = V_IDX(*vp, polylist->vl); e_idx[v_idx] += 2; n_edges += 2; } } edges = OOGLNewNE(HPoint3 *, n_edges, "Adjacent edges"); n_edges = e_idx[0]; e_idx[0] = 0; edges[e_idx[0]] = (void *)(long)(n_edges-1); for (i = 1; i < polylist->n_verts; i++) { int v_n_edges = e_idx[i]; e_idx[i] = n_edges; n_edges += v_n_edges; edges[e_idx[i]] = (void *)(long)(v_n_edges-1); } e_idx[i] = n_edges; for(i = polylist->n_polys, p = polylist->p; --i >= 0; p++) { int v_idx, cnt, j; vp = p->v; v_idx = V_IDX(*vp, polylist->vl); cnt = (int)(long)edges[e_idx[v_idx]]; edges[e_idx[v_idx]+cnt--] = &vp[p->n_vertices-1]->pt; edges[e_idx[v_idx]+cnt--] = &vp[1]->pt; if (cnt > 0) { edges[e_idx[v_idx]] = (void *)(long)cnt; } for (j = 1, ++vp; j < p->n_vertices-1; ++j, ++vp) { v_idx = V_IDX(*vp, polylist->vl); cnt = (int)(long)edges[e_idx[v_idx]]; edges[e_idx[v_idx]+cnt--] = &vp[1]->pt; edges[e_idx[v_idx]+cnt--] = &vp[-1]->pt; if (cnt > 0) { edges[e_idx[v_idx]] = (void *)(long)cnt; } } v_idx = V_IDX(*vp, polylist->vl); cnt = (int)(long)edges[e_idx[v_idx]]; edges[e_idx[v_idx]+cnt--] = &p->v[0]->pt; edges[e_idx[v_idx]+cnt--] = &vp[-1]->pt; if (cnt > 0) { edges[e_idx[v_idx]] = (void *)(long)cnt; } } for (i = 0, vl = polylist->vl; i < polylist->n_verts; ++i, ++vl) { bool patch_end; Point3 patch_nu; HPt3Coord w = 0.0; int v_idx, j, k; v_idx = V_IDX(vl, polylist->vl); vl->vn.x = vl->vn.y = vl->vn.z = 0.0; if (fourd) { w = 1.0/vl->pt.w; } patch_nu.x = patch_nu.y = patch_nu.z = 0.0; patch_end = false; for (j = e_idx[v_idx]; j < e_idx[v_idx+1]; j += 2) { HPoint3 *swap; HPoint3 *p1, *p2; Point3 nu; HPt3Coord w1, w2; p1 = edges[j]; p2 = edges[j+1]; if (fourd) { #undef ANTI_4D #define ANTI_4D(P, Q) \ ((p1->P*w1 - vl->pt.P*w) * (p2->Q*w2 - vl->pt.Q*w) - \ (p1->Q*w1 - vl->pt.Q*w) * (p2->P*w2 - vl->pt.P*w)) w1 = 1.0/p1->w; w2 = 1.0/p2->w; nu.x = ANTI_4D(y,z); nu.y = ANTI_4D(z,x); nu.z = ANTI_4D(x,y); #undef ANTI_4D } else { #undef ANTI #define ANTI(P, Q) \ ((p1->P - vl->pt.P) * (p2->Q - vl->pt.Q) - \ (p1->Q - vl->pt.Q) * (p2->P - vl->pt.P)) nu.x = ANTI(y,z); nu.y = ANTI(z,x); nu.z = ANTI(x,y); #undef ANTI } Pt3Add(&patch_nu, &nu, &patch_nu); /* Try to find the next adjacent edges pair and give it the proper orientation. */ if (j+2 < e_idx[v_idx+1]) { if (edges[j+2] == edges[j+1]) { /* ok */ } else if (edges[j+3] == edges[j+1]) { swap = edges[j+2]; edges[j+2] = edges[j+3]; edges[j+3] = swap; } else { for (k = j + 4; k < e_idx[v_idx+1]; k += 2) { if (edges[k] == edges[j+1]) { swap = edges[j+2]; edges[j+2] = edges[k]; edges[k] = swap; swap = edges[j+3]; edges[j+3] = edges[k+1]; edges[k+1] = swap; break; } else if (edges[k+1] == edges[j+1]) { swap = edges[j+2]; edges[j+2] = edges[k+1]; edges[k+1] = swap; swap = edges[j+3]; edges[j+3] = edges[k]; edges[k] = swap; break; } } if (k >= e_idx[v_idx+1]) { patch_end = true; } } } else { patch_end = true; } if (patch_end) { /* try to match the orientation with the normal of the * previous patch-component (if any). */ if (fneg(Pt3Dot(&patch_nu, &vl->vn))) { Pt3Sub(&vl->vn, &patch_nu, &vl->vn); } else { Pt3Add(&vl->vn, &patch_nu, &vl->vn); } patch_nu.x = patch_nu.y = patch_nu.z = 0.0; patch_end = false; } } len = Pt3Length(&vl->vn); if(len > 0.0) { if(polylist->geomflags & PL_EVNORM) len = -len; Pt3Mul(1.0/len, &vl->vn, &vl->vn); } } OOGLFree(edges); OOGLFree(e_idx); #endif } polylist->geomflags |= need; return polylist; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/polylist/plpick.c0000644000175000017500000000715312310110200016233 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include #include "ooglutil.h" #include "polylistP.h" #include "point3.h" #include "hpoint3.h" #include "polyint.h" #include "pickP.h" #include "appearance.h" PolyList * PolyListPick(PolyList *pl, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { int i; vvec plist; int fi, vi, ok, found = -1, v4d; Poly *poly; unsigned int apflag = 0; /* Make sure that vects do not count as visible - otherwise they * will wreak havoc with the edge picking stuff. */ if (ap != NULL) { apflag = ap->flag; ap->flag &= ~APF_VECTDRAW; } v4d = (pl->geomflags & VERT_4D) != 0; VVINIT(plist, Point3, 0); found = -1; for (fi=0, poly=pl->p; fin_polys; ++fi, ++poly) { vvneeds(&plist, poly->n_vertices); ok = 0; if (TN) { for (vi=0; vin_vertices; vi++) { if (0 < HPt3NTransPt3(TN, axes, &poly->v[vi]->pt, v4d, VVINDEX(plist, Point3, vi))) ok = 1; } } else { for (vi=0; vin_vertices; vi++) { if (0 < HPt3TransPt3(T, &poly->v[vi]->pt, VVINDEX(plist, Point3, vi))) ok = 1; } } if (ok && PickFace(poly->n_vertices, VVINDEX(plist, Point3, 0), p, ap)) found = fi; } vvfree(&plist); if (ap != NULL) ap->flag = apflag; if (found == -1) return NULL; if (p->found & PW_VERT) { p->vi = pl->p[found].v[p->vi] - pl->vl; if (TN) HPt3NTransHPt3(TN, axes, &pl->vl[p->vi].pt, v4d, &p->v); else HPt3Transform(T, &pl->vl[p->vi].pt, &p->v); } if (p->found & PW_EDGE) { p->ei[0] = pl->p[found].v[p->ei[0]] - pl->vl; p->ei[1] = pl->p[found].v[p->ei[1]] - pl->vl; if (TN) { HPt3NTransHPt3(TN, axes, &pl->vl[p->ei[0]].pt, v4d, &p->e[0]); HPt3NTransHPt3(TN, axes, &pl->vl[p->ei[1]].pt, v4d, &p->e[1]); } else { HPt3Transform(T, &pl->vl[p->ei[0]].pt, &p->e[0]); HPt3Transform(T, &pl->vl[p->ei[1]].pt, &p->e[1]); } } if (p->found & PW_FACE) { if(p->f) OOGLFree(p->f); p->f = OOGLNewNE(HPoint3, p->fn, "PolyList pick"); if (TN) { for (i = 0; i < p->fn; i++) HPt3NTransHPt3(TN, axes, &pl->p[found].v[i]->pt, v4d, &p->f[i]); } else { for (i = 0; i < p->fn; i++) HPt3Transform(T, &pl->p[found].v[i]->pt, &p->f[i]); } p->fi = found; } if (TN) { p->TprimN = TmNCopy(TN, p->TprimN); memcpy(p->axes, axes, sizeof(p->axes)); } else TmCopy(T, p->Tprim); return pl; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/polylist/plsave.c0000644000175000017500000000542312310110200016241 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Save a PolyList (in .off format). */ #include "polylistP.h" PolyList * PolyListFSave(PolyList *polylist, FILE *outf, char *fname) { int i, n; Poly *p; Vertex **vp, *v; (void)fname; /* We don't really know the number of edges and it's a pain to count. * Assume Euler number 2. */ fprintf(outf, "%s%s%s%sOFF\n%d %d %d\n", &"ST"[polylist->geomflags & PL_HASST ? 0 : 2], &"C"[polylist->geomflags & PL_HASVCOL ? 0 : 1], &"N"[polylist->geomflags & PL_HASVN ? 0 : 1], &"4"[polylist->geomflags & VERT_4D ? 0 : 1], polylist->n_verts, polylist->n_polys, polylist->n_verts + polylist->n_polys - 2); for(i = polylist->n_verts, v = polylist->vl; --i >= 0; v++) { if (polylist->geomflags & VERT_4D) fprintf(outf, "\n%.8g %.8g %.8g %.8g", v->pt.x, v->pt.y, v->pt.z, v->pt.w); else fprintf(outf, "\n%.8g %.8g %.8g", v->pt.x, v->pt.y, v->pt.z); if(polylist->geomflags & PL_HASVN) fprintf(outf, " %.8g %.8g %.8g", v->vn.x, v->vn.y, v->vn.z); if(polylist->geomflags & PL_HASVCOL) fprintf(outf, " %g %g %g %g", v->vcol.r, v->vcol.g, v->vcol.b, v->vcol.a); if(polylist->geomflags & PL_HASST) fprintf(outf, " %.8g %.8g", v->st.s, v->st.t); } fputc('\n', outf); for(i = polylist->n_polys, p = polylist->p; --i >= 0; p++) { n = p->n_vertices; fprintf(outf, "\n%d ", n); for(vp = p->v; --n >= 0; vp++) fprintf(outf, " %d", (int)((*vp) - polylist->vl)); if ((polylist->geomflags & PL_HASPCOL)) { fprintf(outf, "\t%g %g %g %g", p->pcol.r, p->pcol.g, p->pcol.b, p->pcol.a); } } fputc('\n', outf); return (ferror(outf) ? NULL : polylist); } geomview-1.9.5/src/lib/gprim/polylist/plsphere.c0000644000175000017500000001054112310110200016566 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "create.h" #include "polylistP.h" #include "sphere.h" Geom *PolyListSphere(PolyList *p, Transform T, TransformN *TN, int *axes, int space) { int i; Sphere *sphere; if (p == NULL || p->n_verts == 0 || p->n_polys == 0) return NULL; if (TN) { HPointN *tmp = HPtNCreate(5, NULL); HPointN *spanPts[2*4]; HPoint3 spanPts3[2*4]; /* Create a dummy sphere, the center will be corrected later */ sphere = (Sphere *)GeomCreate("sphere", CR_CENTER, &p->vl[0].pt, CR_RADIUS, 0.0, CR_AXIS, T, CR_SPACE, space, CR_END); if(p->geomflags & VERT_4D) { for (i = 0; i < 2*4; i++) { spanPts[i] = HPtNCreate(5, NULL); Pt4ToHPtN(&p->vl[0].pt, spanPts[i]); } for (i = 1; i < p->n_verts; i++) { Pt4ToHPtN(&p->vl[i].pt, tmp); MaxDimensionalSpanHPtN(spanPts, tmp); } for (i = 0; i < 2*4; i++) { HPtNTransformComponents(TN, spanPts[i], axes, &spanPts3[i]); HPtNDelete(spanPts[i]); } SphereEncompassBoundsN(sphere, spanPts3, 4); for (i = 0; i < p->n_verts; i++) { Pt4ToHPtN(&p->vl[i].pt, tmp); SphereAddHPtN(sphere, tmp, NULL, TN, axes); } } else { for (i = 0; i < 2*4; i++) { spanPts[i] = HPtNCreate(5, NULL); HPt3ToHPtN(&p->vl[0].pt, NULL, spanPts[i]); } for (i = 0; i < p->n_verts; i++) { HPt3ToHPtN(&p->vl[i].pt, NULL, tmp); MaxDimensionalSpanHPtN(spanPts, tmp); } for (i = 0; i < 2*4; i++) { HPtNTransformComponents(TN, spanPts[i], axes, &spanPts3[i]); /*HPt3Dehomogenize(&spanPts3[i], &spanPts3[i]);*/ HPtNDelete(spanPts[i]); } SphereEncompassBoundsN(sphere, spanPts3, 4); for (i = 0; i < p->n_verts; i++) { HPt3ToHPtN(&p->vl[i].pt, NULL, tmp); SphereAddHPtN(sphere, tmp, NULL, TN, axes); } } HPtNDelete(tmp); } else { HPoint3 spanPts[6]; if(false && (p->geomflags & VERT_4D)) { /* 4d, but no 4d transform, act on x,y,z sub-space */ HPoint3 tmp; Pt4ToHPt3(&p->vl[0].pt, NULL, &tmp); sphere = (Sphere *)GeomCreate("sphere", CR_CENTER, &tmp, CR_RADIUS, 0.0, CR_AXIS, T, CR_SPACE, space, CR_END); /* For convenience (if not efficiency) assume all the vertices * are used */ for (i = 0; i < 6; i++) { Pt4ToHPt3(&p->vl[0].pt, NULL, &spanPts[i]); } for (i = 0; i < p->n_verts; i++) { Pt4ToHPt3(&p->vl[i].pt, NULL, &tmp); MaxDimensionalSpan(spanPts, &tmp); } HPt3TransformN(T, spanPts, spanPts, 6); SphereEncompassBounds(sphere, spanPts); for (i = 0; i < p->n_verts; i++) { Pt4ToHPt3(&p->vl[i].pt, NULL, &tmp); SphereAddHPt3(sphere, &tmp, T); } } else { sphere = (Sphere *)GeomCreate("sphere", CR_CENTER, &p->vl[0].pt, CR_RADIUS, 0.0, CR_AXIS, T, CR_SPACE, space, CR_END); /* For convenience (if not efficiency) assume all the vertices * are used */ for (i = 0; i < 6; i++) spanPts[i] = p->vl[0].pt; for (i = 0; i < p->n_verts; i++) MaxDimensionalSpan(spanPts, &p->vl[i].pt); HPt3TransformN(T, spanPts, spanPts, 6); SphereEncompassBounds(sphere, spanPts); for (i = 0; i < p->n_verts; i++) SphereAddHPt3(sphere, &p->vl[i].pt, T); } } return (Geom *)sphere; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/polylist/pltransform.c0000644000175000017500000000361112310110200017313 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include "point3.h" #include "polylistP.h" PolyList *PolyListTransform(PolyList *p, Transform T, TransformN *TN) { int i; (void)TN; if (!T) { return p; } for (i = 0; i < p->n_verts; i++) { HPt3Transform(T, &p->vl[i].pt, &p->vl[i].pt); } if (p->geomflags & (PL_HASVN|PL_HASPN)) { Transform Tit; TmDual(T, Tit); if (p->geomflags & PL_HASVN) { for (i = 0; i < p->n_verts; i++) { NormalTransform(Tit, &p->vl[i].vn, &p->vl[i].vn); } } if (p->geomflags & PL_HASPN) { for (i = 0; i < p->n_polys; i++) { NormalTransform(T, &p->p[i].pn, &p->p[i].pn); } } } return p; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/polylist/polylist.h0000644000175000017500000000372712310110200016640 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef POLYLISTDEFS #define POLYLISTDEFS /* * Public definitions for PolyList's */ #include "bbox.h" typedef struct PolyList PolyList; /* Per-polygon flags, set with CR_POLYFLAGS */ #define POLY_CONCAVE GEOMFLAG(0x0100) /* polygon is not convex */ #define POLY_NONFLAT GEOMFLAG(0x0200) /* polygon is not flat */ #define POLY_NOPOLY GEOMFLAG(0x0400) /* polygon is degenerated */ extern PolyList *PolyListDraw( PolyList * ); extern BBox *PolyListBound(PolyList *polylist, Transform T, TransformN *TN); extern Geom *PolyListSphere( PolyList *, Transform, TransformN *TN, int *axes, int ); extern PolyList *PolyListEvert( PolyList * ); extern PolyList *PolyListLoad( char * ); /* Loads "off" files */ extern PolyList *PolyListFLoad( IOBFILE *, char *fname ); extern char *PolyListName( void ); extern PolyList *PolyListSave( PolyList *, char * ); extern PolyList *PolyListFSave( PolyList *, FILE *, char * ); extern PolyList *PolyListTransform( PolyList *, Transform, TransformN * ); #endif/*POLYLISTDEFS*/ geomview-1.9.5/src/lib/gprim/polylist/polylistP.h0000644000175000017500000000636012310110200016754 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef POLYLISTPDEFS #define POLYLISTPDEFS /* * Private definitions for PolyList's */ #include "bboxP.h" #include "polylist.h" #include "bsptree.h" #define PLMAGIC GeomMagic ('p', 1) typedef struct Vertex { HPoint3 pt; ColorA vcol; Point3 vn; TxST st; } Vertex; typedef struct Poly { int n_vertices; Vertex **v; ColorA pcol; Point3 pn; /* average normal */ int flags; /* the flags below are valid if PL_HASPFL is set */ } Poly; struct PolyList { GEOMFIELDS; int n_polys; int n_verts; Poly *p; Vertex *vl; PolyList *plproj; /* Projected list during ND-drawing. The idea is * to get rid of alloca() and not to have to * regenerated the connectivity structure all the * time. */ # define PL_HASVN VERT_N /* Per-vertex normals (vn) valid */ # define PL_HASVCOL VERT_C /* Per-vertex colors (vcol) valid */ # define PL_HASST VERT_ST /* Has s,t texture coords */ # define PL_HASPCOL FACET_C /* Per-polygon colors (pcol) valid */ # define PL_HASPN GEOMFLAG(0x01) /* Per-polygon normals (pn) valid */ # define PL_EVNORM GEOMFLAG(0x04) /* Normals are everted */ # define PL_HASPFL GEOMFLAG(0x08) /* Has per-poly flags */ /* For 4-D points, see geomflags & VERT_4D */ }; static inline Ref *PolyListRef(PolyList *pl) { union castit { Ref ref; PolyList pl; }; return &((union castit *)pl)->ref; } static inline Geom *PolyListGeom(PolyList *pl) { union castit { Geom geom; PolyList pl; }; return &((union castit *)pl)->geom; } extern PolyList *PolyListCreate(PolyList *exist, GeomClass *Class, va_list *a_list); extern PolyList *PolyListCopy( PolyList *poly ); extern PolyList *PolyListDelete( PolyList *poly ); extern PolyList *PolyListPick( PolyList *, Pick *, Appearance *, Transform T, TransformN *TN, int *axes ); extern GeomClass *PolyListMethods(); extern PolyList *PolyListComputeNormals(PolyList *polyList, int flags_needed); extern void PolyNormal(Poly *p, Point3 *nu_av, int fourd, int evert, int *flagsp, int *first_concave); extern PolyList *PolyListBSPTree(PolyList *poly, BSPTree *bsptree, int action); #endif /*POLYLISTPDEFS*/ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/polylist/Headers0000644000175000017500000000002712310110200016074 00000000000000polylist.h polylistP.h geomview-1.9.5/src/lib/gprim/quad/0000755000175000017500000000000012310165602013752 500000000000000geomview-1.9.5/src/lib/gprim/quad/Makefile.in0000644000175000017500000005014012310165554015745 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/quad DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libquad_la_LIBADD = am_libquad_la_OBJECTS = quadbound.lo quadclass.lo quadcopy.lo \ quadcreate.lo quaddelete.lo quaddraw.lo quadevert.lo \ quadload.lo quadnormal.lo quadpick.lo quadsave.lo \ quadsphere.lo quadtransform.lo libquad_la_OBJECTS = $(am_libquad_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libquad_la_SOURCES) DIST_SOURCES = $(libquad_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libquad.la libquad_la_SOURCES = \ quadbound.c quadclass.c quadcopy.c quadcreate.c quaddelete.c quaddraw.c quadevert.c quadload.c quadnormal.c quadpick.c quadsave.c quadsphere.c quadtransform.c \ quad.h quadP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/quad/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/quad/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libquad.la: $(libquad_la_OBJECTS) $(libquad_la_DEPENDENCIES) $(EXTRA_libquad_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libquad_la_OBJECTS) $(libquad_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quaddelete.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quaddraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadevert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadnormal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadtransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/quad/Makefile.am0000644000175000017500000000044512310110200015711 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libquad.la libquad_la_SOURCES = \ quadbound.c quadclass.c quadcopy.c quadcreate.c quaddelete.c quaddraw.c quadevert.c quadload.c quadnormal.c quadpick.c quadsave.c quadsphere.c quadtransform.c \ quad.h quadP.h geomview-1.9.5/src/lib/gprim/quad/quadbound.c0000644000175000017500000000736012310110200016006 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "quadP.h" BBox *QuadBound(Quad *q, Transform T, TransformN *TN) { int n; HPoint3 min, max, clean, tmp, *p; n = q->maxquad * 4; p = q->p[0]; min = *p; /* First handle the case without transformations, this means that we return a 3d bbox for 3d quads, and a 4d bboy for 4d quads. */ if ((T == TM_IDENTITY || !T) && !TN) { if (!T && (q->geomflags & VERT_4D)) { max = min; while(--n >= 0) { Pt4MinMax(&min, &max, ++p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_4D, 1, CR_END); } else { HPt3Dehomogenize(&min, &min); max = min; while(--n > 0) { HPt3MinMax(&min, &max, ++p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *ptN; HPointN *minN; HPointN *maxN; BBox *result; ptN = HPtNCreate(5, NULL); if (q->geomflags & VERT_4D) { Pt4ToHPtN(&min, ptN); } else { HPt3ToHPtN(&min, NULL, ptN); } minN = HPtNTransform(TN, ptN, NULL); HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); while(--n > 0) { if (q->geomflags & VERT_4D) { Pt4ToHPtN(++p, ptN); } else { HPt3ToHPtN(++p, NULL, ptN); } HPtNTransform(TN, ptN, ptN); HPtNMinMax(minN, maxN, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(ptN); HPtNDelete(minN); HPtNDelete(maxN); return result; } /* A 3d bbox is requested, with transformations */ if (T) { /* ordinary 3d transform */ if (false && (q->geomflags & VERT_4D)) { /* We operate on the 3x3 x,y,z space */ min.w = 1.0; HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n > 0) { tmp = *(++p); tmp.w = 1.0; HPt3Transform(T, &tmp, &clean); HPt3Dehomogenize(&clean, &clean); Pt3MinMax(&min, &max, &clean); } } else { /* ordinary 3d object */ HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n > 0) { tmp = *(++p); HPt3Transform(T, &tmp, &clean); HPt3Dehomogenize(&clean, &clean); Pt3MinMax(&min, &max, &clean); } } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/quad/quadclass.c0000644000175000017500000000465712310110200016012 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "quadP.h" static GeomClass *aQuadMethods = NULL; /* these are known only to the library, not the user */ extern Quad *QuadCopy( Quad * ); extern Quad *QuadDelete( Quad * ); extern Geom *QuadCreate ( va_list); int QuadPresent = 1; static char quadName[] = "quad"; char * QuadName() { return quadName; } GeomClass * QuadMethods() { if( !aQuadMethods ) { aQuadMethods = GeomClassCreate(quadName); aQuadMethods->name = QuadName; aQuadMethods->methods = (GeomMethodsFunc *)QuadMethods; aQuadMethods->copy = (GeomCopyFunc *)QuadCopy; aQuadMethods->create = (GeomCreateFunc *)QuadCreate; aQuadMethods->fload = (GeomFLoadFunc *)QuadFLoad; aQuadMethods->fsave = (GeomFSaveFunc *)QuadFSave; aQuadMethods->Delete = (GeomDeleteFunc *)QuadDelete; aQuadMethods->bound = (GeomBoundFunc *)QuadBound; aQuadMethods->boundsphere = (GeomBoundSphereFunc *)QuadSphere; aQuadMethods->evert = (GeomEvertFunc *)QuadEvert; aQuadMethods->draw = (GeomDrawFunc *)QuadDraw; aQuadMethods->bsptree = (GeomBSPTreeFunc *)QuadBSPTree; aQuadMethods->pick = (GeomPickFunc *) QuadPick; aQuadMethods->transform = (GeomTransformFunc *) QuadTransform; aQuadMethods->transformto = (GeomTransformToFunc *) QuadTransformTo; } return aQuadMethods; } geomview-1.9.5/src/lib/gprim/quad/quadcopy.c0000644000175000017500000000345312310110200015650 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "quadP.h" Quad * QuadCopy(oq) Quad *oq; { Quad *q; if (!oq) return NULL; q = OOGLNewE(Quad, "new Quad"); q->p = OOGLNewNE(QuadP, oq->maxquad, "quad verts"); q->geomflags = oq->geomflags; q->maxquad = oq->maxquad; memcpy(q->p, oq->p, oq->maxquad * sizeof(QuadP)); if(oq->geomflags & QUAD_N) { q->n = OOGLNewNE(QuadN, oq->maxquad, "quad normals"); memcpy(q->n, oq->n, oq->maxquad * sizeof(QuadN)); } else q->n = NULL; if(oq->geomflags & QUAD_C) { q->c = OOGLNewNE(QuadC, oq->maxquad, "quad colors"); memcpy(q->c, oq->c, oq->maxquad * sizeof(QuadC)); } else q->c = NULL; return q; } geomview-1.9.5/src/lib/gprim/quad/quadcreate.c0000644000175000017500000001047212310110200016140 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "quadP.h" Quad * QuadCreate (Quad *exist, GeomClass *classp, va_list *a_list) { Quad *q; QuadP *p = (QuadP *)NULL; Point3 *p3; QuadN *n = (QuadN *)NULL; QuadC *c = (QuadC *)NULL; int attr, i; int copy = 1; if (exist == NULL) { q = OOGLNewE(Quad, "QuadCreate: new Quad"); GGeomInit (q, classp, QUADMAGIC, NULL); q->geomflags = q->maxquad = 0; q->p = (QuadP *)NULL; q->n = (QuadN *)NULL; q->c = (QuadC *)NULL; } else { /* Check that exist is a Quad. */ q = exist; } q->pdim = 4; while ((attr = va_arg(*a_list, int))) /* parse argument list */ switch (attr) { case CR_FLAG: q->geomflags = va_arg(*a_list, int); break; case CR_NELEM: q->maxquad = va_arg(*a_list, int); break; case CR_POINT4: p = va_arg(*a_list, QuadP *); if (exist) OOGLFree(q->p); if (p == NULL) { q->p = NULL; q->maxquad = 0; } else if (copy) { q->p = OOGLNewNE(QuadP,q->maxquad,"QuadCreate vertices"); memcpy(q->p, p, q->maxquad * sizeof(QuadP)); } else { q->p = p; /* caller relinquishes ownership of data */ } break; case CR_POINT: p3 = va_arg(*a_list, Point3 *); if (exist) OOGLFree(q->p); if (p3 == NULL) { q->p = NULL; q->maxquad = 0; } else if (copy) { q->p = OOGLNewNE(QuadP,q->maxquad,"QuadCreate vertices"); Pt3ToHPt3(p3, &q->p[0][0], q->maxquad * 4); } else { Pt3ToHPt3(p3, &q->p[0][0], q->maxquad * 4); } break; case CR_NORMAL: q->geomflags &= ~QUAD_N; if (exist && q->n) OOGLFree(q->n); n = va_arg(*a_list, QuadN *); if (n == NULL) { q->n = NULL; } else if (copy) { q->n = OOGLNewNE(QuadN,q->maxquad,"QuadCreate normals"); memcpy(q->n, n, q->maxquad*sizeof(QuadN)); q->geomflags |= QUAD_N; } else { q->n = n; q->geomflags |= QUAD_N; } break; case CR_COLOR: q->geomflags &= ~COLOR_ALPHA; q->geomflags &= ~QUAD_C; if (exist && q->c) OOGLFree(q->c); c = va_arg(*a_list, QuadC *); if (c == NULL) { q->c = NULL; } else { q->geomflags |= QUAD_C; if (copy) { q->c = OOGLNewNE(QuadC, q->maxquad, "QuadCreate: colors"); memcpy(q->c, c, q->maxquad*sizeof(QuadC)); } else { q->c = c; q->geomflags |= QUAD_C; } for (i = 0; i < q->maxquad; i++) { if (q->c[i][0].a < 1.0 || q->c[i][1].a < 1.0 || q->c[i][2].a < 1.0 || q->c[i][3].a < 1.0) { q->geomflags |= COLOR_ALPHA; } } } break; default: if (GeomDecorate(q, ©, attr, a_list)) { OOGLError (0, "QuadCreate: Undefined option: %d",attr); if (!exist) GeomDelete((Geom *)q); return NULL; } } if ((q->p == NULL && q->maxquad > 0) || (q->p != NULL && q->maxquad <= 0) ) { OOGLError (0,"QuadCreate: inconsistent number of quads"); if (!exist) GeomDelete((Geom *)q); return NULL; } return (Quad *) q; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/gprim/quad/quaddelete.c0000644000175000017500000000253612310110200016141 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "quadP.h" Quad * QuadDelete(Quad *q) { if(q) { if(q->p != NULL) GeomFree(q->p); if(q->c != NULL) GeomFree(q->c); if(q->n != NULL) GeomFree(q->n); } return NULL; } geomview-1.9.5/src/lib/gprim/quad/quaddraw.c0000644000175000017500000001242412310110200015631 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "quadP.h" #include "mgP.h" #include "cmodel.h" #include "hpointn.h" #include "bsptreeP.h" static void draw_projected_quad(mgNDctx *NDctx, Quad *qquad) { Quad q = *qquad; HPointN *h; HPoint3 *op, *np; ColorA *nc; int npts = 4 * qquad->maxquad; int i, colored = 0, alpha = 0; mgNDmapfunc mapHPtN = NDctx->mapHPtN; Appearance *ap = &_mgc->astk->ap; /* TODO: do NOT use alloca */ #if !!NO_ALLOCA q.p = (QuadP *)alloca(npts*sizeof(HPoint3)); q.c = (QuadC *)alloca(npts*sizeof(ColorA)); #else q.p = OOGLNewNE(QuadP, npts, "projected QUAD points"); q.c = OOGLNewNE(QuadC, npts, "ND QUAD colors"); #endif q.n = NULL; q.ap = NULL; RefInit(QuadRef(&q), qquad->magic); DblListInit(&q.pernode); nc = q.c[0]; np = q.p[0]; op = qquad->p[0]; h = HPtNCreate(5, NULL); if (ap->flag & APF_KEEPCOLOR) { colored = 0; } else { HPoint3 dummyv; ColorA dummyc; /* Dummy transform to determine whether we have ND colors or not */ colored = mapHPtN(NDctx, h, &dummyv, &dummyc); } q.geomflags &= ~VERT_4D; for(i = 0; i < npts; i++, op++, np++, nc++) { if (qquad->geomflags & VERT_4D) { /* Set the point's first THREE components from our 4-D vertex */ Pt4ToHPtN(op, h); } else { /* Set the point's first four components from our 4-D vertex */ HPt3ToHPtN(op, NULL, h); } if (colored) { mapHPtN(NDctx, h, np, nc); if (nc->a < 1.0) { alpha = 1; } } else { mapHPtN(NDctx, h, np, NULL); } } if(colored) { if (alpha) { q.geomflags |= COLOR_ALPHA; } else { q.geomflags &= ~COLOR_ALPHA; } q.geomflags |= QUAD_C; } if (ap->flag & APF_FACEDRAW) { if (IS_SHADED(ap->shading)) { QuadComputeNormals(&q); } if (GeomHasAlpha(QuadGeom(&q), ap)) { /* could re-use per quad normals here ? */ } } mgquads(q.maxquad, q.p[0], q.n[0], colored ? q.c[0] : qquad->c[0], q.geomflags); if (NDctx->bsptree && (q.geomflags & GEOM_ALPHA)) { GeomNodeDataMove(QuadGeom(qquad), QuadGeom(&q)); GeomBSPTree(QuadGeom(&q), NDctx->bsptree, BSPTREE_ADDGEOM); GeomNodeDataMove(QuadGeom(&q), QuadGeom(qquad)); } OOGLFree(q.n); HPtNDelete(h); #if !!NO_ALLOCA OOGLFree(q.p); OOGLFree(q.c); #endif } Quad * QuadDraw(Quad *q) { mgNDctx *NDctx = NULL; mgctxget(MG_NDCTX, &NDctx); if(NDctx) { draw_projected_quad(NDctx, q); return q; } if ((((Quad *)q)->geomflags & VERT_N) == 0) { const Appearance *ap = mggetappearance(); if ((ap->flag & APF_NORMALDRAW) || (ap->flag & APF_FACEDRAW && IS_SHADED(ap->shading))) { QuadComputeNormals(q); q->geomflags |= VERT_N; } } if (_mgc->space & TM_CONFORMAL_BALL) { cmodel_clear(_mgc->space); cm_read_quad(q); cmodel_draw(PL_HASVN|PL_HASPN|PL_HASVCOL); } else if ((_mgc->astk->flags & MGASTK_SHADER) && !(q->geomflags & GEOM_ALPHA)) { /* * Special software shading */ int i, step, lim = q->maxquad * 4; HPoint3 *v = q->p[0]; Point3 *n = q->n[0]; int cquad = q->c && !(_mgc->astk->mat.override & MTF_DIFFUSE); ColorA *oc = cquad ? q->c[0] : (ColorA *)&_mgc->astk->mat.diffuse; #if !NO_ALLOCA ColorA *c = (ColorA *)alloca(lim * sizeof(ColorA)); #else c = OOGLNewNE(ColorA, lim, "software shaded QUAD colors"); #endif ColorA *tc = c; step = (_mgc->astk->ap.shading == APF_SMOOTH) ? 1 : 4; for(i = 0; i < lim; i += step) { (*_mgc->astk->shader)(1, v, n, oc, tc); if(cquad) oc += step; if(step == 4) { tc[1] = *tc; tc[2] = *tc; tc[3] = *tc; v += 4; n += 4; tc += 4; } else { v++; n++; tc++; } } mgquads(q->maxquad, q->p[0], q->n[0], c, q->geomflags); #if !!NO_ALLOCA OOGLFree(c); #endif } else { /* * Ordinary shading */ mgquads(q->maxquad, q->p[0], q->n[0], q->c[0], q->geomflags); } return q; } Quad *QuadBSPTree(Quad *q, BSPTree *tree, int action) { if (!never_translucent((Geom *)q) && action == BSPTREE_ADDGEOM) { BSPTreeAddObject(tree, (Geom *)q); } return q; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/quad/quadevert.c0000644000175000017500000000274312310110200016024 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "quadP.h" /* * Note: Calling QuadNormal will undo this! */ Quad * QuadEvert( q ) Quad *q; { int i; Point3 *np; if(q != NULL && (np = &q->n[0][0]) != NULL) { for(i = 4 * q->maxquad; --i >= 0; np++) { np->x = -np->x; np->y = -np->y; np->z = -np->z; } } return q; } geomview-1.9.5/src/lib/gprim/quad/quadload.c0000644000175000017500000001227612310110200015620 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "quadP.h" static int getquads(IOBFILE *file, Quad *pquad, int off, int binary, int dimn) { HPoint3 *p; Point3 *n; ColorA *c; int k; p = &pquad->p[off][0]; n = (pquad->geomflags & QUAD_N) ? &pquad->n[off][0] : NULL; c = (pquad->geomflags & QUAD_C) ? &pquad->c[off][0] : NULL; for (k = 4 * (pquad->maxquad - off); --k >= 0; ) { if (iobfgetnf(file, dimn, (float *)p, binary) < dimn) break; /* set the w-coordinate if the points are 3 dim'nal */ if (dimn == 3) p->w = 1.0; p++; if (n != NULL) { if(iobfgetnf(file, 3, (float *)n, binary) < 3) return -1; n++; } if (c != NULL) { if (iobfgetnf(file, 4, (float *)c, binary) < 4) return -1; if (c->a < 1.0) pquad->geomflags |= COLOR_ALPHA; c++; } } k++; if (k % 4 != 0) return(-1); return pquad->maxquad - k/4; } Quad * QuadFLoad( IOBFILE *file, char *fname ) { Quad q; int binary = 0; char *token; int ngot; int dimn = 3; q.geomflags = 0; q.p = NULL; q.n = NULL; q.c = NULL; token = GeomToken(file); /* Parse [C][N][4]{QUAD|POLY}[ BINARY]\n */ if(*token == 'C') { q.geomflags = QUAD_C; token++; } if(*token == 'N') { q.geomflags |= QUAD_N; token++; } if(*token == '4') { q.geomflags |= VERT_4D; dimn = 4; token++; } if(strcmp(token, "POLY") && strcmp(token, "QUAD")) { return NULL; } /* Got valid header, now read the file. */ if(iobfnextc(file, 1) == 'B' && iobfexpectstr(file, "BINARY") == 0) { binary = 1; if(iobfnextc(file, 1) != '\n') { /* Expect \n after BINARY */ OOGLSyntax(file,"QuadFLoad: bad QUAD file header on %s", fname); return NULL; } (void) iobfgetc(file); /* Toss \n */ } if(binary) { /* * Binary case is easy. * Read the q count, then the P, N and C arrays. * Error if we get less than the q count promised. */ if(iobfgetni(file, 1, &q.maxquad, 1) <= 0) return NULL; if(q.maxquad <= 0 || q.maxquad > 10000000) { OOGLError(0, "Reading QUAD BINARY from \"%s\": incredible q count 0x%x", fname, q.maxquad); return NULL; } q.p = OOGLNewNE(QuadP, q.maxquad, "QuadFLoad: vertices"); if(q.geomflags & QUAD_N) q.n = OOGLNewNE(QuadN, q.maxquad, "QuadFLoad: normals"); if(q.geomflags & QUAD_C) q.c = OOGLNewNE(QuadC, q.maxquad, "QuadFLoad: colors"); ngot = getquads(file, &q, 0, 1, dimn); if(ngot != q.maxquad) { OOGLFree(q.p); if(q.n) OOGLFree(q.n); if(q.c) OOGLFree(q.c); goto fail; } } else { /* * ASCII case is harder. * Guess how many quads we need, and realloc() if we need more. */ #define TRYQUADS 1000 QuadP qp[TRYQUADS]; QuadN qn[TRYQUADS]; QuadC qc[TRYQUADS]; vvec vp, vn, vc; VVINIT(vp, QuadP, TRYQUADS); vvuse(&vp, qp, TRYQUADS); if(q.geomflags & QUAD_N) { VVINIT(vn, QuadN, TRYQUADS); vvuse(&vn, qn, TRYQUADS); } if(q.geomflags & QUAD_C) { VVINIT(vc, QuadC, TRYQUADS); vvuse(&vc, qc, TRYQUADS); } q.maxquad = TRYQUADS; ngot = 0; for(;;) { q.p = VVEC(vp, QuadP); if(q.geomflags & QUAD_N) q.n = VVEC(vn, QuadN); if(q.geomflags & QUAD_C) q.c = VVEC(vc, QuadC); ngot = getquads(file, &q, ngot, 0, dimn); VVCOUNT(vp) = VVCOUNT(vn) = VVCOUNT(vc) = ngot; if(ngot < q.maxquad) break; q.maxquad *= 2; vvneeds(&vp, q.maxquad); if(q.geomflags & QUAD_N) vvneeds(&vn, q.maxquad); if(q.geomflags & QUAD_C) vvneeds(&vc, q.maxquad); } if(ngot <= 0) { vvfree(&vp); vvfree(&vn); vvfree(&vc); goto fail; } /* Release unneeded storage */ q.maxquad = ngot; vvtrim(&vp); q.p = VVEC(vp, QuadP); if (q.geomflags & QUAD_N) { vvtrim(&vn); q.n = VVEC(vn, QuadN); } if (q.geomflags & QUAD_C) { vvtrim(&vc); q.c = VVEC(vc, QuadC); } } return (Quad *) GeomCCreate(NULL, QuadMethods(), CR_4D, (dimn == 4) ? 1 : 0, CR_NOCOPY, CR_FLAG, q.geomflags, CR_NELEM, q.maxquad, CR_POINT4, q.p, CR_NORMAL, q.n, CR_COLOR, q.c, 0); fail: OOGLSyntax(file, "Error reading QUADs in \"%s\"", fname); return NULL; } geomview-1.9.5/src/lib/gprim/quad/quadnormal.c0000644000175000017500000000410412310110200016160 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "quadP.h" Quad * QuadComputeNormals( Quad *q ) { int i; Point3 nor; float len; HPoint3 *p; Point3 *n; /* * Only compute if not present! */ if( !(q->geomflags & QUAD_N) ) { if(q->n == NULL) q->n = OOGLNewNE(QuadN, q->maxquad, "QuadComputeNormals normals"); p = &q->p[0][0]; n = &q->n[0][0]; for( i = q->maxquad; --i >= 0; p += 4) { #define TERM(S, T) (p[0].S - p[1].S) * (p[1].T + p[0].T) + \ (p[1].S - p[2].S) * (p[2].T + p[1].T) + \ (p[2].S - p[3].S) * (p[3].T + p[2].T) + \ (p[3].S - p[0].S) * (p[0].T + p[3].T) nor.x = TERM(y, z); nor.y = TERM(z, x); nor.z = TERM(x, y); len = nor.x*nor.x + nor.y*nor.y + nor.z*nor.z; if( len != 0.0 ) { len = 1.0 / sqrt(len); nor.x *= len; nor.y *= len; nor.z *= len; } *n++ = nor; *n++ = nor; *n++ = nor; *n++ = nor; } q->geomflags |= QUAD_N; } return q; } geomview-1.9.5/src/lib/gprim/quad/quadpick.c0000644000175000017500000000757712310110200015637 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include #include "quadP.h" #include "hpoint3.h" #include "point3.h" #include "pickP.h" #include "appearance.h" Quad *QuadPick(Quad *q, Pick *pick, Appearance *ap, Transform T, TransformN *TN, int *axes) { Point3 plist[4]; int i; int found, v4d; unsigned int apflag = 0; HPt3Coord xa, xb, xc, xd; found = -1; v4d = (q->geomflags & VERT_4D) != 0; /* Make sure that vectors do not appear visible to the pick code - * otherwise they will screw up edge picking */ if (ap != NULL) { apflag = ap->flag; ap->flag &= ~APF_VECTDRAW; } for (i = 0; i < q->maxquad; i++) { if (TN) { xa = HPt3NTransPt3(TN, axes, &q->p[i][0], v4d, &plist[0]); xb = HPt3NTransPt3(TN, axes, &q->p[i][1], v4d, &plist[1]); xc = HPt3NTransPt3(TN, axes, &q->p[i][2], v4d, &plist[2]); xd = HPt3NTransPt3(TN, axes, &q->p[i][3], v4d, &plist[3]); } else { xa = HPt3TransPt3(T, &q->p[i][0], &plist[0]); xb = HPt3TransPt3(T, &q->p[i][1], &plist[1]); xc = HPt3TransPt3(T, &q->p[i][2], &plist[2]); xd = HPt3TransPt3(T, &q->p[i][3], &plist[3]); } /* Note -- we need to be sure that all four are evaluated!! */ if((xa > 0) || (xb > 0) || (xc > 0) || (xd > 0)) { if(PickFace(4, plist, pick, ap)) found = i; } } if (ap != NULL) ap->flag = apflag; if (found == -1) return NULL; if (pick->found & PW_VERT) { if (TN) { HPt3NTransHPt3(TN, axes, &q->p[found][pick->vi], v4d, &pick->v); } else { HPt3Transform(T, &q->p[found][pick->vi], &pick->v); } pick->vi = found*4 + pick->vi; } if (pick->found & PW_EDGE) { if (TN) { HPt3NTransHPt3(TN, axes, &q->p[found][pick->ei[0]], v4d, &pick->e[0]); HPt3NTransHPt3(TN, axes, &q->p[found][pick->ei[1]], v4d, &pick->e[1]); } else { HPt3Transform(T, &q->p[found][pick->ei[0]], &pick->e[0]); HPt3Transform(T, &q->p[found][pick->ei[1]], &pick->e[1]); } pick->ei[0] = found*4 + pick->ei[0]; pick->ei[1] = found*4 + pick->ei[1]; } if (pick->found & PW_FACE) { if(pick->f) OOGLFree(pick->f); pick->f = OOGLNewNE(HPoint3, 4, "Quad pick"); if (TN) { HPt3NTransHPt3(TN, axes, &q->p[found][0], v4d, &pick->f[0]); HPt3NTransHPt3(TN, axes, &q->p[found][1], v4d, &pick->f[1]); HPt3NTransHPt3(TN, axes, &q->p[found][2], v4d, &pick->f[2]); HPt3NTransHPt3(TN, axes, &q->p[found][3], v4d, &pick->f[3]); } else HPt3TransformN(T, q->p[found], pick->f, 4); pick->fi = found; } if (TN) { pick->TprimN = TmNCopy(TN, pick->TprimN); memcpy(pick->axes, axes, sizeof(pick->axes)); } else TmCopy(T, pick->Tprim); return q; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/quad/quadsave.c0000644000175000017500000000406412310110200015633 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "quadP.h" Quad * QuadFSave(Quad *q, FILE *f, char *fname) { int i; HPoint3 *p; Point3 *n; ColorA *c; (void)fname; if(q == NULL || f == NULL) return(NULL); if(q->geomflags & QUAD_C) fputc('C', f); if(q->geomflags & QUAD_N) fputc('N', f); if(q->geomflags & VERT_4D) fputc('4', f); fprintf(f, "QUAD\n"); p = &q->p[0][0]; n = (q->geomflags & QUAD_N) ? &q->n[0][0] : NULL; c = (q->geomflags & QUAD_C) ? &q->c[0][0] : NULL; for(i = 4 * q->maxquad; --i >= 0 && !ferror(f); ) { if (q->geomflags & VERT_4D) fprintf(f, "%g %g %g %g", p->x, p->y, p->z, p->w); else fprintf(f, "%g %g %g", p->x, p->y, p->z); p++; if(n) { fprintf(f, " %g %g %g", n->x, n->y, n->z); n++; } if(c) { fprintf(f, " %.3g %.3g %.3g %.3g", c->r, c->g, c->b, c->a); c++; } fputc('\n', f); if((i & 3) == 0) fputc('\n', f); } return(ferror(f) ? NULL : q); } geomview-1.9.5/src/lib/gprim/quad/quadsphere.c0000644000175000017500000000304212310110200016156 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "create.h" #include "quadP.h" #include "sphere.h" Geom *QuadSphere(Quad *q, Transform T, TransformN *TN, int *axes, int space) { Geom *sphere; /* Create a dummy sphere, the center will be corrected later */ sphere = GeomCreate("sphere", CR_SPACE, space, CR_END); SphereEncompassPoints((Sphere *)sphere, (float *)q->p, (q->geomflags & VERT_4D) != 0, 4, q->maxquad * 4, T, TN, axes); return sphere; } geomview-1.9.5/src/lib/gprim/quad/quadtransform.c0000644000175000017500000000333112310110200016704 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include "hpoint3.h" #include "point3.h" #include "quadP.h" Quad *QuadTransform(Quad *q, Transform T) { int i; for (i = 0; i < q->maxquad; i++) { HPt3TransformN(T, q->p[i], q->p[i], 4); } if (q->geomflags & QUAD_N) { Transform Tit; TmDual(T, Tit); for (i = 0; i < q->maxquad; i++) { NormalTransformN(Tit, q->n[i], q->n[i], 4); } } return q; } Quad *QuadTransformTo(Quad *q, Transform T) { return QuadTransform(q, T); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/quad/quad.h0000644000175000017500000000334512310110200014762 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef QUADDEFS #define QUADDEFS #include "bbox.h" #include "bsptree.h" #define QUADMAGIC GeomMagic ('q', 1) typedef struct Quad Quad; extern GeomClass *QuadMethods( void ); extern char *QuadName( void ); extern Quad *QuadLoad( char * ); extern Quad *QuadFLoad( IOBFILE *, char *fname ); extern Quad *QuadSave( Quad *, char * ); extern Quad *QuadFSave( Quad *, FILE *, char *fname ); extern BBox *QuadBound(Quad *q, Transform T, TransformN *TN); extern Geom *QuadSphere(Quad *q, Transform T, TransformN *TN, int *axes, int space); extern Quad *QuadEvert( Quad * ); extern Quad *QuadDraw( Quad * ); extern Quad *QuadBSPTree(Quad *quad, BSPTree *bsptree, int action); extern Quad *QuadTransform( Quad *, Transform ); extern Quad *QuadTransformTo( Quad *, Transform ); #endif geomview-1.9.5/src/lib/gprim/quad/quadP.h0000644000175000017500000000343512310110200015102 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef QUADPDEFS #define QUADPDEFS #include "geomclass.h" #include "quad.h" #include "bsptree.h" #define QUAD_N VERT_N #define QUAD_C VERT_C #define QUAD_BINARY GEOMFLAG(0x01) typedef HPoint3 QuadP[4]; typedef Point3 QuadN[4]; typedef ColorA QuadC[4]; struct Quad { GEOMFIELDS; int maxquad; QuadP *p; QuadN *n; QuadC *c; }; Quad *QuadPick(Quad *, Pick *, Appearance *, Transform, TransformN *, int *axes); Quad *QuadComputeNormals(Quad *q); static inline Ref *QuadRef(Quad *q) { union castit { Ref ref; Quad quad; }; return &((union castit *)q)->ref; } static inline Geom *QuadGeom(Quad *q) { union castit { Geom geom; Quad quad; }; return &((union castit *)q)->geom; } #endif /* ! QUADPDEFS */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/quad/Headers0000644000175000017500000000001712310110200015146 00000000000000quad.h quadP.h geomview-1.9.5/src/lib/gprim/skel/0000755000175000017500000000000012310165602013756 500000000000000geomview-1.9.5/src/lib/gprim/skel/Makefile.in0000644000175000017500000004732412310165554015763 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/skel DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libskel_la_LIBADD = am_libskel_la_OBJECTS = skelbound.lo skelclass.lo skelcreate.lo \ skeldraw.lo skelload.lo skelpick.lo skelsave.lo \ skeltransform.lo skelsphere.lo libskel_la_OBJECTS = $(am_libskel_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libskel_la_SOURCES) DIST_SOURCES = $(libskel_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libskel.la libskel_la_SOURCES = \ skelbound.c skelclass.c skelcreate.c skeldraw.c skelload.c skelpick.c \ skelsave.c skeltransform.c skelsphere.c \ skel.h skelP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/skel/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/skel/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libskel.la: $(libskel_la_OBJECTS) $(libskel_la_DEPENDENCIES) $(EXTRA_libskel_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libskel_la_OBJECTS) $(libskel_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skelbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skelclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skelcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skeldraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skelload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skelpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skelsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skelsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skeltransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/skel/Makefile.am0000644000175000017500000000037212310110200015714 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libskel.la libskel_la_SOURCES = \ skelbound.c skelclass.c skelcreate.c skeldraw.c skelload.c skelpick.c \ skelsave.c skeltransform.c skelsphere.c \ skel.h skelP.h geomview-1.9.5/src/lib/gprim/skel/skelbound.c0000644000175000017500000001361412310110200016015 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: Return the bounding box of a collection of vectors. * */ #include "skelP.h" /* An extra function for the pure ND case */ static BBox *NSkelBound(Skel *s, Transform T, TransformN *TN) { BBox *result; int n, pdim; HPoint3 min, max, tmp, clean; HPointN ptN[1]; n = s->nvert; pdim = s->pdim; ptN->v = s->p; ptN->dim = pdim; /* First handle the case without transformations, this means that we * return an Nd bbox. */ if (!T && !TN) { HPointN *min; HPointN *max; min = HPtNCopy(ptN, NULL); HPtNDehomogenize(min, min); max = HPtNCopy(min, NULL); while(--n > 0) { ptN->v += pdim; HPtNMinMax(min, max, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, min, CR_NMAX, max, CR_END); HPtNDelete(min); HPtNDelete(max); return result; } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *minN; HPointN *maxN; HPointN *clean; BBox *result; minN = HPtNTransform(TN, ptN, NULL); HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); clean = HPtNCreate(s->pdim, NULL); while(--n > 0) { ptN->v += pdim; HPtNTransform(TN, ptN, clean); HPtNMinMax(minN, maxN, clean); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(minN); HPtNDelete(maxN); HPtNDelete(clean); return result; } /* A 3d bbox is requested, with transformations */ if (T) { /* ordinary 3d transform */ HPtNToHPt3(ptN, NULL, &min); HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n > 0) { ptN->v += pdim; HPtNToHPt3(ptN, NULL, &tmp); HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } BBox *SkelBound(Skel *s, Transform T, TransformN *TN) { int n; HPoint3 min, max, clean, tmp, *p; if (s->pdim > 4) { /* extra function for ND case. */ return NSkelBound(s, T, TN); } n = s->nvert; p = (HPoint3 *)s->p; while(--n >= 0 && !finite(p->x + p->y + p->z + p->w)) ++p; if(n < 0) return NULL; min = *p; /* First handle the case without transformations, this means that we return a 3d bbox for 3d ss, and a 4d bboy for 4d ss. */ if ((T == TM_IDENTITY || !T) && !TN) { if (!T && (s->geomflags & VERT_4D)) { max = min; while(--n >= 0) { Pt4MinMax(&min, &max, ++p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_4D, 1, CR_END); } else { HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { HPt3MinMax(&min, &max, ++p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *ptN; HPointN *minN; HPointN *maxN; BBox *result; ptN = HPtNCreate(5, NULL); if (s->geomflags & VERT_4D) { Pt4ToHPtN(&min, ptN); } else { HPt3ToHPtN(&min, NULL, ptN); } minN = HPtNTransform(TN, ptN, NULL); HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); while(--n >= 0) { if (s->geomflags & VERT_4D) { Pt4ToHPtN(++p, ptN); } else { HPt3ToHPtN(++p, NULL, ptN); } HPtNTransform(TN, ptN, ptN); HPtNMinMax(minN, maxN, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(ptN); HPtNDelete(minN); HPtNDelete(maxN); return result; } /* A 3d bbox is requested, with transformations */ if (T) { /* ordinary 3d transform */ if (false && (s->geomflags & VERT_4D)) { /* We operate on the 3x3 x,y,z space */ min.w = 1.0; HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { tmp = *(++p); tmp.w = 1.0; HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } } else { /* ordinary 3d object */ HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { tmp = *(++p); HPt3Transform(T, &tmp, &clean); Pt3MinMax(&min, &max, &clean); } } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/skel/skelclass.c0000644000175000017500000000425012310110200016007 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "skelP.h" static GeomClass *aSkelMethods = NULL; int SkelPresent = 1; static char skelName[] = "skel"; char * SkelName() { return skelName; } GeomClass *SkelMethods(void) { if (!aSkelMethods) { aSkelMethods = GeomClassCreate(skelName); aSkelMethods->name = SkelName; aSkelMethods->methods = (GeomMethodsFunc *) SkelMethods; aSkelMethods->create = (GeomCreateFunc *) SkelCreate; aSkelMethods->fload = (GeomFLoadFunc *) SkelFLoad; aSkelMethods->fsave = (GeomFSaveFunc *) SkelFSave; aSkelMethods->bound = (GeomBoundFunc *) SkelBound; aSkelMethods->boundsphere = (GeomBoundSphereFunc *) SkelBoundSphere; aSkelMethods->Delete = (GeomDeleteFunc *) SkelDelete; aSkelMethods->draw = (GeomDrawFunc *) SkelDraw; aSkelMethods->copy = (GeomCopyFunc *) SkelCopy; aSkelMethods->pick = (GeomPickFunc *) SkelPick; aSkelMethods->transform = (GeomTransformFunc *) SkelTransform; aSkelMethods->transformto = (GeomTransformToFunc *) SkelTransform; } return aSkelMethods; } geomview-1.9.5/src/lib/gprim/skel/skelcreate.c0000644000175000017500000001270112310110200016145 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "skelP.h" /* * Vect object creation, editing, copying, deletion. */ Skel *SkelCopy(Skel *os) { Skel *s; if (os == NULL) return (NULL); s = OOGLNewE(Skel, "new SKEL"); *s = *os; s->p = OOGLNewNE(float, os->nvert * os->pdim, "Skel vertices"); s->c = os->nc > 0 ? OOGLNewNE(ColorA, os->nc, "Skel colors") : NULL; s->l = OOGLNewNE(Skline, os->nlines, "Skel lines"); s->vi = OOGLNewNE(int, os->nvi, "Skel nverts"); if (s->vc) { s->vc = OOGLNewNE(ColorA, os->nvert, "Skel vertex colors"); } memcpy(s->p, os->p, os->nvert * os->pdim * sizeof(float)); memcpy(s->l, os->l, os->nlines * sizeof(Skline)); if(os->nc > 0) memcpy(s->c, os->c, os->nc * sizeof(ColorA)); memcpy(s->vi, os->vi, os->nvi * sizeof(int)); if (os->vc) memcpy(s->vc, os->vc, os->nvert * sizeof(ColorA)); return s; } void SkelDelete(Skel *s) { if (s) { if (s->p != NULL) OOGLFree(s->p); if (s->c != NULL) OOGLFree(s->c); if (s->vi != NULL) OOGLFree(s->vi); if (s->vc != NULL) OOGLFree(s->vc); } } Skel *SkelCreate(Skel *exist, GeomClass *classp, va_list *a_list) { Skel *s; (void)a_list; if (exist == NULL) { s = OOGLNewE(Skel, "new skel"); GGeomInit (s, classp, SKELMAGIC, NULL); s->nlines = 0; s->nvert = 0; s->nvi = 0; s->p = NULL; s->c = NULL; s->vi = NULL; s->vc = NULL; } else { /* Should check that exist is a vect */ s = exist; } #ifdef notyet while (attr = va_arg (*a_list, int)) switch (attr) { case CR_FLAG: vect->flag = va_arg (*a_list, int); break; case CR_NVECT: vect->nvec = va_arg (*a_list, int); break; case CR_NVERT: vect->nvert = va_arg (*a_list, int); break; case CR_NCOLR: vect->ncolor = va_arg (*a_list, int); break; case CR_VECTC: vectcounts = va_arg (*a_list, short *); if (vectcounts == NULL) { vect->vnvert = NULL; vect->nvert = 0; } else if (copy) { vect->vnvert = OOGLNewNE(short, vect->nvec, "vect vert counts"); memcpy(vect->vnvert, vectcounts, vect->nvec*sizeof(*vect->vnvert)); } else { vect->vnvert = vectcounts; } break; case CR_COLRC: colorcounts = va_arg (*a_list, short *); if (colorcounts == NULL) { vect->vncolor = NULL; vect->nvert = 0; } else if (copy) { vect->vncolor = OOGLNewNE(short, vect->nvec, "vect vert counts"); memcpy(vect->vncolor, colorcounts, vect->nvec*sizeof(*vect->vncolor)); } else { vect->vncolor = colorcounts; } break; case CR_POINT: v3 = va_arg (*a_list, Point3 *); if (v3 == NULL) { vect->p = NULL; vect->nvert = 0; } else if (copy) { vect->p = OOGLNewNE(HPoint3, vect->nvert, "vect points"); Pt3ToPt4(v3, vect->p, vect->nvert); } else { Pt3ToPt4(v3, vect->p, vect->nvert); } break; case CR_POINT4: v4 = va_arg (*a_list, HPoint3 *); if (v4 == NULL) { vect->p = NULL; vect->nvert = 0; } else if (copy) { vect->p = OOGLNewNE(HPoint3, vect->nvert, "vect points"); memcpy(vect->p, v4, vect->nvert*sizeof(HPoint3)); } else { vect->p = v4; } break; case CR_COLOR: colors = va_arg (*a_list, ColorA *); if (colors == NULL) { vect->c = NULL; vect->ncolor = 0; } else if (copy) { vect->c = OOGLNewNE(ColorA, vect->ncolor, "vect colors"); memcpy(vect->c, colors, vect->ncolor*sizeof(ColorA)); } else { vect->c = colors; } break; default: if (GeomDecorate (s, ©, attr, a_list)) { OOGLError (0, "VectCreate: Undefined option: %d\n", attr); OOGLFree (vect); return NULL; } } if (!SkelSane(s)) { OOGLError (0, "SkelCreate: Bogus data supplied"); GeomDelete((Geom *)s); return NULL; } /* end police work */ if (exist != NULL) return exist; #endif return s; } int SkelSane(Skel *s) { int i; Skline *l; if (s == NULL || s->vi==NULL || s->p==NULL || s->nlines < 0 || s->nvert < 0 || s->nc < 0 || (s->nc>0 && s->c==NULL)) return 0; for (i = s->nlines, l = s->l; --i >= 0; ) { if (l->v0 < 0 || l->nv < 0 || l->nv + l->v0 > s->nvi) return 0; if (l->nc < 0 || l->c0 < 0 || l->c0 + l->nc > s->nc) return 0; } for (i = 0; i < s->nvi; i++) if ((unsigned)s->vi[i] >= (unsigned)s->nvi) return 0; return 1; } geomview-1.9.5/src/lib/gprim/skel/skeldraw.c0000644000175000017500000001437712310110200015652 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: * Draw a Vect (collection of vectors). * */ #include "mgP.h" #include "skelP.h" #include "hpointn.h" #include "transformn.h" #include "cmodel.h" #include #ifndef alloca #include #endif #define MAXPLINE 32 /* Temp buffer size. Must be a power of 2! */ static void draw_projected_skel(mgNDctx *NDctx, Skel *s, int flags, int penultimate, int hascolor) { HPointN *h; float *op; HPoint3 *np, *newp; Skline *l; ColorA *c, *lastcolor, *newc; int i, colored = 0; HPoint3 tv[MAXPLINE]; ColorA tc[MAXPLINE]; mgNDmapfunc mapHPtN = NDctx->mapHPtN; Appearance *ap = &_mgc->astk->ap; #if !NO_ALLOCA newp = (HPoint3 *)alloca(s->nvert*sizeof(HPoint3)); #else newp = OOGLNewNE(HPoint3, s->nvert, "projected SKEL points"); #endif h = HPtNCreate(s->pdim, NULL); if (ap->flag & APF_KEEPCOLOR) { colored = 0; } else { HPoint3 dummyv; ColorA dummyc; /* Dummy transform to determine whether we have ND colors or not */ colored = mapHPtN(NDctx, h, &dummyv, &dummyc); } if (colored) { newc = (ColorA *)alloca(s->nvert*sizeof(ColorA)); } else { newc = s->vc; } /* VERT_4D is only honoured here if pdim == 4 */ if (s->pdim == 4) { for (i = 0, op = s->p, np = newp; i < s->nvert; i++, op += s->pdim, np++) { if (s->geomflags & VERT_4D) { Pt4ToHPtN((HPoint3 *)op, h); } else { HPt3ToHPtN((HPoint3 *)op, NULL, h); } if (colored) { mapHPtN(NDctx, h, np, &newc[i]); } else { mapHPtN(NDctx, h, np, NULL); } } } else { /* Real ND case, i.e. pdim >= 5 */ float *hdata= h->v; for (i = 0, op = s->p, np = newp; i < s->nvert; i++, op += s->pdim, np++) { h->v = op; if (colored) { mapHPtN(NDctx, h, np, &newc[i]); } else { mapHPtN(NDctx, h, np, NULL); } } h->v = hdata; } HPtNDelete(h); if (!hascolor) { colored = 0; } else if (newc) { colored = 1; } lastcolor = (ColorA *)(void *)&_mgc->astk->mat.edgecolor; for(i = 0, l = s->l, c = colored ? newc : s->c; i < s->nlines; i++, l++) { int nleft = l->nv; int *vleft = &s->vi[l->v0]; int j; if(l->nc > 0 && hascolor) lastcolor = &s->c[l->c0]; while(nleft > MAXPLINE) { if(colored) { for(np = tv, c = tc, j = MAXPLINE; --j >= 0; vleft++) { *np++ = newp[*vleft]; *c++ = newc[*vleft]; } mgpolyline(MAXPLINE, tv, MAXPLINE, tc, flags); } else { for(np = tv, j = MAXPLINE; --j >= 0; vleft++) *np++ = newp[*vleft]; mgpolyline(MAXPLINE, tv, 1, lastcolor, flags); } nleft -= MAXPLINE-1; vleft--; flags = 6; } if(colored) { for(np = tv, c = tc, j = nleft; --j >= 0; vleft++) { *np++ = newp[*vleft]; *c++ = newc[*vleft]; } flags = (i < penultimate) ? 6 : 2; mgpolyline(nleft, tv, nleft, tc, flags); } else { for(np = tv, j = nleft; --j >= 0; vleft++) *np++ = newp[*vleft]; flags = (i < penultimate) ? 6 : 2; mgpolyline(nleft, tv, 1, lastcolor, flags); } } #if !!NO_ALLOCA OOGLFree(newp); #endif } Skel *SkelDraw(Skel *s) { int i, hascolor; Skline *l; int flags, penultimate; ColorA *lastcolor=NULL; HPoint3 tv[MAXPLINE]; ColorA tc[MAXPLINE]; mgNDctx *NDctx = NULL; /* Don't draw if vect-drawing is off. */ if (s == NULL || (_mgc->astk->ap.flag & APF_VECTDRAW) == 0) return NULL; /* draw in conformal model if necessary */ if (_mgc->space & TM_CONFORMAL_BALL) { cmodel_clear(_mgc->space); /* cm_read_skel(s); */ cmodel_draw(0); return s; } hascolor = !(_mgc->astk->mat.override & MTF_EDGECOLOR); penultimate = s->nlines - 2; flags = penultimate>0 ? 4 : 0; /* 4: not last mbr of batch of lines */ mgctxget(MG_NDCTX, &NDctx); if (NDctx) { draw_projected_skel(NDctx, s, flags, penultimate, hascolor); return s; } lastcolor = (ColorA *)(void *)&_mgc->astk->mat.edgecolor; for (i = 0, l = s->l; i < s->nlines; i++, l++) { int nleft = l->nv; int *vleft = &s->vi[l->v0]; int j; if (l->nc > 0 && hascolor) lastcolor = &s->c[l->c0]; while (nleft > MAXPLINE) { for (j = 0; j < MAXPLINE; j++) { if (hascolor && s->vc) tc[j] = s->vc[*vleft]; tv[j] = *(HPoint3 *)&(s->p)[(*vleft++)*s->pdim]; if (s->pdim < 4) { if (s->pdim < 3) { tv[j].y = 0; } tv[j].z = 0; tv[j].w = 1; } } if (hascolor && s->vc) mgpolyline(MAXPLINE, tv, MAXPLINE, tc, flags); else mgpolyline(MAXPLINE, tv, 1, lastcolor, flags); nleft -= MAXPLINE-1; vleft--; flags = 6; } for(j = 0; j < nleft; j++) { if (hascolor && s->vc) tc[j] = s->vc[*vleft]; tv[j] = *(HPoint3 *)&(s->p)[(*vleft++)*s->pdim]; if (s->pdim < 4) { if (s->pdim < 3) { tv[j].y = 0; } tv[j].z = 0; tv[j].w = 1; } } flags = (i < penultimate) ? 6 : 2; if (hascolor && s->vc) mgpolyline(nleft, tv, nleft, tc, flags); else mgpolyline(nleft, tv, 1, lastcolor, flags); } return s; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/skel/skelload.c0000644000175000017500000001456112310110200015627 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justs Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: Create and load a vert object from a file. * */ #include #include "skelP.h" Skel *SkelFLoad(IOBFILE *file, char *fname) { Skel *s; int dimn = 3, pdim = 4; bool nd = false, vc = false, binary = false; char *token; float *vp; Skline *lp; int i, k; ColorA *cp; static ColorA black = { 0,0,0,1 }; vvec colors; vvec verts; if (file == NULL) return NULL; token = GeomToken(file); if (*token == 'C') { vc = true; token++; } if(*token == '4') { /* Really means "homogeneous coords" */ dimn = 4; token++; } if(*token == 'n') { nd = true; token++; } if (strcmp(token, "SKEL")) return NULL; if(nd) { if(iobfgetni(file, 1, &pdim, 0) <= 0) { OOGLSyntax(file, "Reading nSKEL from \"%s\": Expected dimension", fname); return NULL; } if (pdim < 4) { OOGLSyntax(file, "Reading nSKEL from \"%s\": dimension %d < 4", fname, pdim); return NULL; } ++pdim; } if(iobfnextc(file, 1) == 'B' && iobfexpectstr(file, "BINARY") == 0) { binary = true; if(iobfnextc(file, 1) != '\n') /* Expect \n after BINARY */ return NULL; (void) iobfgetc(file); /* Toss \n */ } s = OOGLNewE(Skel, "SkelFLoad: skel"); GGeomInit(s, SkelMethods(), SKELMAGIC, NULL); s->geomflags = (dimn == 4) ? VERT_4D : 0; if (vc) { s->geomflags |= VERT_C; } s->pdim = pdim; s->p = NULL; s->l = NULL; s->c = NULL; s->vc = NULL; s->vi = NULL; s->nvi = s->nc = 0; if(iobfgetni(file, 1, &s->nvert, binary) <= 0 || iobfgetni(file, 1, &s->nlines, binary) <= 0) { OOGLSyntax(file, "Reading SKEL from \"%s\": expected nvertices, nlines"); goto bogus; } s->p = OOGLNewNE(float, s->nvert * s->pdim, "SKEL vertices"); s->l = OOGLNewNE(Skline, s->nlines, "SKEL lines"); if (vc) { s->vc = OOGLNewNE(ColorA, s->nvert, "SKEL vertex colors"); } VVINIT(colors, ColorA, 10); VVINIT(verts, int, 40); if (pdim == 4) { for (i = 0, vp = s->p; i < s->nvert; i++, vp += 4) { vp[3] = 1.0; /* homogeneous component */ if (iobfgetnf(file, dimn, vp, binary) < dimn) { OOGLSyntax(file, "Reading SKEL from \"%s\": error reading vertex %d of %d", fname, i, s->nvert); goto bogus; } if (vc) { if (iobfgetnf(file, 4, (float *)&s->vc[i], binary) < 4) { OOGLSyntax(file, "Reading SKEL from \"%s\": " "error reading vertex color %d of %d", fname, i, s->nvert); goto bogus; } } } } else { dimn = dimn == 4 ? s->pdim : s->pdim - 1; for (i = 0, vp = s->p; i < s->nvert; i++, vp += s->pdim) { vp[0] = 1.0; /* homogeneous component */ if(iobfgetnf(file, dimn, vp + (pdim == dimn+1), binary) < dimn) { OOGLSyntax(file, "Reading SKEL from \"%s\": error reading vertex %d of %d", fname, i, s->nvert); goto bogus; } if (vc) { if (iobfgetnf(file, 4, (float *)&s->vc[i], binary) < 4) { OOGLSyntax(file, "Reading SKEL from \"%s\": " "error reading vertex color %d of %d", fname, i, s->nvert); goto bogus; } } } } for (i = 0, lp = s->l; i < s->nlines; i++, lp++) { /* Read one polyline */ if(iobfgetni(file, 1, &lp->nv, binary) <= 0 || lp->nv <= 0) { OOGLSyntax(file, "Reading SKEL from \"%s\": " "expected vertex count on polyline %d of %d", fname, i, s->nlines); goto bogus; } /* Add its vertex-indices to our global list */ lp->v0 = k = VVCOUNT(verts); VVCOUNT(verts) += lp->nv; vvneeds(&verts, VVCOUNT(verts)); if(iobfgetni(file, lp->nv, VVEC(verts, int) + k, binary) < lp->nv) { OOGLSyntax(file, "Reading SKEL from \"%s\": expected %d vertex indices on polyline %d of %d", fname, lp->nv, i, s->nlines); goto bogus; } /* Check for color (sigh) by testing for end of line. */ vvneeds(&colors, VVCOUNT(colors)+1); cp = &VVEC(colors, ColorA)[VVCOUNT(colors)]; *cp = black; /* Pick up the color, if any. * In ASCII format, take whatever's left before end-of-line */ if (!binary) { for(k = 0; k < 4 && iobfnextc(file, 1) != '\n'; k++) { if(iobfgetnf(file, 1, ((float *)cp)+k, 0) < 1) { OOGLSyntax(file, "Reading SKEL from \"%s\": polyline %d of %d: expected color component", fname, i, s->nlines); goto bogus; } } } else { int ncol; if (iobfgetni(file, 1, &ncol, 1) <= 0 || iobfgetnf(file, ncol, (float *)cp, 1) < ncol) { OOGLSyntax(file, "Reading binary SKEL from \"%s\": " "polyline %d of %d: expected color component", fname, i, s->nlines); goto bogus; } k = ncol; } lp->c0 = VVCOUNT(colors); if (k > 0) { lp->nc = 1; VVCOUNT(colors)++; s->geomflags |= FACET_C; } else { lp->nc = 0; } } /* Note we don't vvfree() the verts and colors arrays -- * we simply use the pointers to data they've already malloced, if any. */ s->nvi = VVCOUNT(verts); s->vi = VVEC(verts, int); s->nc = VVCOUNT(colors); s->c = VVEC(colors, ColorA); return s; bogus: GeomDelete((Geom *)s); return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/skel/skelpick.c0000644000175000017500000001576112310110200015641 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "skelP.h" #include "pickP.h" static Skel *NSkelPick(Skel *s, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { Point3 plist[2]; int i, j, ok[2]; bool found; unsigned int apflag = 0; HPointN ptN[1]; if (!TN) return NULL; /* we have full-featured ND-points here. */ ptN->flags = 0; ptN->dim = s->pdim; /* Make sure that the edges do not count as visible - otherwise * they could really mess things up */ if (ap != NULL) { apflag = ap->flag; ap->flag &= ~APF_EDGEDRAW; } found = false; for (i = 0; i < s->nlines && !found; i++) { int nv = abs(s->l[i].nv); int *idx = s->vi + s->l[i].v0; ptN->v = s->p + idx[0]*s->pdim; ok[0] = (0 < HPtNNTransPt3(TN, axes, ptN, &plist[0])); if (nv == 1) { if (ok[0] && PickFace(1, &plist[0], p, ap)) { found = true; p->vi = idx[0]; break; } continue; } for (j = 0; j < nv - 1;) { ptN->v = s->p + idx[++j]*s->pdim; ok[1] = (0 < HPtNNTransPt3(TN, axes, ptN, &plist[1])); if ((ok[0]||ok[1]) && PickFace(2, plist, p, ap)) { found = true; p->vi = p->vi ? idx[j] : idx[j-1]; p->ei[0] = idx[j-1]; p->ei[1] = idx[j]; break; } ok[0] = ok[1]; plist[0] = plist[1]; } if (s->l[i].nv < 0) { ptN->v = s->p + idx[0]*s->pdim; ok[1] = (0 < HPtNNTransPt3(TN, axes, ptN, &plist[1])); if ((ok[0]||ok[1]) && PickFace(2, plist, p, ap)) { found = true; p->vi = p->vi ? idx[0] : idx[j]; p->ei[0] = idx[j]; p->ei[1] = idx[0]; break; } } if (found) { break; } } if (ap != NULL) ap->flag = apflag; if (!found) { return NULL; } if (p->found & PW_VERT) { ptN->v = s->p + p->vi*s->pdim; HPtNTransformComponents(TN, ptN, axes, &p->v); } else p->vi = -1; if (p->found & PW_EDGE) { ptN->v = s->p + p->ei[0]*s->pdim; HPtNTransformComponents(TN, ptN, axes, &p->e[0]); ptN->v = s->p + p->ei[1]*s->pdim; HPtNTransformComponents(TN, ptN, axes, &p->e[1]); } else p->ei[0] = p->ei[1] = -1; if (p->found & PW_FACE) { p->fi = i; if (p->f) { OOGLFree(p->f); } p->f = OOGLNewNE(HPoint3, p->fn, "Skel pick"); for (i = 0; i < p->fn; i++) { int vi = s->vi[s->l[p->fi].v0+i]; ptN->v = s->p + vi*s->pdim; HPtNTransformComponents(TN, ptN, axes, &p->f[i]); } } if (TN) { p->TprimN = TmNCopy(TN, p->TprimN); memcpy(p->axes, axes, sizeof(p->axes)); } else TmCopy(T, p->Tprim); return s; } Skel *SkelPick(Skel *s, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { Point3 plist[2]; int i, j, ok[2]; bool found; int v4d; unsigned int apflag = 0; if (s->pdim > 4) { return NSkelPick(s, p, ap, T, TN, axes); } /* Make sure that the edges do not count as visible - otherwise * they could really mess things up */ if (ap != NULL) { apflag = ap->flag; ap->flag &= ~APF_EDGEDRAW; } found = false; v4d = (s->geomflags & VERT_4D) != 0; for (i = 0; i < s->nlines && !found; i++) { int nv = abs(s->l[i].nv); int *idx = &s->vi[s->l[i].v0]; if (TN) { ok[0] = (0 < HPt3NTransPt3(TN, axes, (HPoint3 *)(s->p + idx[0]*s->pdim), v4d, &plist[0])); } else { ok[0] = (0 < HPt3TransPt3(T, (HPoint3 *)(s->p + idx[0]*s->pdim), &plist[0])); } if (nv == 1) { if (ok[0] && PickFace(1, &plist[0], p, ap)) { found = true; p->vi = idx[0]; break; } continue; } for (j = 0; j < nv - 1;) { if (TN) { ok[1] = (0 < HPt3NTransPt3(TN, axes, (HPoint3 *)(s->p + idx[++j]*s->pdim), v4d, &plist[1])); } else { ok[1] = (0 < HPt3TransPt3(T, (HPoint3 *)(s->p + idx[++j]*s->pdim), &plist[1])); } if ((ok[0]||ok[1]) && PickFace(2, plist, p, ap)) { found = true; p->vi = p->vi ? idx[j] : idx[j-1]; p->ei[0] = idx[j-1]; p->ei[1] = idx[j]; break; } ok[0] = ok[1]; plist[0] = plist[1]; } if (s->l[i].nv < 0) { if (TN) ok[1] = (0 < HPt3NTransPt3(TN, axes, (HPoint3 *)(s->p + idx[0]*s->pdim), v4d, &plist[1])); else ok[1] = (0 < HPt3TransPt3(T, (HPoint3 *)(s->p + idx[0]*s->pdim), &plist[1])); if ((ok[0]||ok[1]) && PickFace(2, plist, p, ap)) { found = true; p->vi = p->vi ? idx[0] : idx[j]; p->ei[0] = idx[j]; p->ei[1] = idx[0]; break; } } if (found) { break; } } if (ap != NULL) { ap->flag = apflag; } if (!found) { return NULL; } if (p->found & PW_VERT) { if (TN) { HPt3NTransHPt3(TN, axes, (HPoint3 *)(s->p + p->vi*s->pdim), v4d, &p->v); } else { HPt3Transform(T, (HPoint3 *)(s->p + p->vi*s->pdim), &p->v); } } else { p->vi = -1; } if (p->found & PW_EDGE) { if (TN) { HPt3NTransHPt3(TN, axes, (HPoint3 *)(s->p + p->ei[0]*s->pdim), v4d, &p->e[0]); HPt3NTransHPt3(TN, axes, (HPoint3 *)(s->p + p->ei[1]*s->pdim), v4d, &p->e[1]); } else { HPt3Transform(T, (HPoint3 *)(s->p + p->ei[0]*s->pdim), &p->e[0]); HPt3Transform(T, (HPoint3 *)(s->p + p->ei[1]*s->pdim), &p->e[1]); } } else { p->ei[0] = p->ei[1] = -1; } if (p->found & PW_FACE) { p->fi = i; if (p->f) { OOGLFree(p->f); } p->f = OOGLNewNE(HPoint3, p->fn, "Skel pick"); if (TN) { for (i = 0; i < p->fn; i++) { int vi = s->vi[s->l[p->fi].v0+i]; HPt3NTransHPt3(TN, axes, (HPoint3 *)(s->p + vi*s->pdim), v4d, &p->f[i]); } } else { for (i = 0; i < p->fn; i++) { int vi = s->vi[s->l[p->fi].v0+i]; HPt3Transform(T, (HPoint3 *)(s->p + vi*s->pdim), &p->f[i]); } } } else { p->fi = -1; } if (TN) { p->TprimN = TmNCopy(TN, p->TprimN); memcpy(p->axes, axes, sizeof(p->axes)); } else TmCopy(T, p->Tprim); return s; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/skel/skelsave.c0000644000175000017500000000514012310110200015637 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: Save a skel object to a file. * */ #include "skelP.h" Skel *SkelFSave(Skel *s, FILE *f) { int i, j, d, o; float *p; int *vp; Skline *l; /* This one just saves in ASCII format */ if(s == NULL || f == NULL) return NULL; d = s->geomflags & VERT_4D ? s->pdim : s->pdim-1; o = s->geomflags & VERT_4D ? 0 : 1; if (s->vc) fprintf(f, "C"); if (s->geomflags & VERT_4D) fprintf(f, "4"); fprintf(f, s->pdim==4 ? "SKEL" : "nSKEL %d", s->pdim-1); fprintf(f, "\n%d %d\n\n", s->nvert, s->nlines); if (s->pdim == 4) { for (i = 0, p = s->p; i < s->nvert; i++, p += s->pdim) { fputnf(f, d, p, 0); if (s->vc) { fputc(' ', f); fputnf(f, 4, (float *)&s->vc[i], 0); } fputc('\n', f); } fputc('\n', f); } else { for(i = 0, p = s->p; i < s->nvert; i++, p += s->pdim) { fputnf(f, d, p + o, 0); if (s->vc) { fputc(' ', f); fputnf(f, 4, (float *)&s->vc[i], 0); } fputc('\n', f); } fputc('\n', f); } for(i = 0, l = s->l; i < s->nlines; i++, l++) { fprintf(f, "%d\t", l->nv); for(j = 0, vp = &s->vi[l->v0]; j < l->nv; j++, vp++) fprintf(f, "%d ", *vp); if(l->nc > 0) { fputc('\t', f); fputnf(f, 4, &s->c[l->c0].r, 0); } fputc('\n', f); } return ferror(f) ? NULL : s; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/skel/skeltransform.c0000644000175000017500000000346212310110200016721 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include "skelP.h" Skel *SkelTransform( Skel *s, Transform T, TransformN *TN ) { #if 1 (void)T; (void)TN; #else if (T && T != TM_IDENTITY) { if(s->pdim == 4) { HPt3TransformN(T, (HPoint3 *)s->p, (HPoint3 *)s->p, s->nvert); } else if (s->pdim > 4) { HPointN *tmp = HPtNCreate(s->dim, NULL); float *tmp_data = tmp->v; int i; for (tmp->v = s->p, i = 0; i < s->nvert; i++, tmp->v += s->dim) { HPtNTransform(T, tmp, tmp); } tmp->v = tmp_data; HPtNDelete(tmp); } } else { OOGLError(1, "Can't SkelTransform() %d-D Skel", s->dim); } #endif return s; } geomview-1.9.5/src/lib/gprim/skel/skelsphere.c0000644000175000017500000000310612310110200016167 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "create.h" #include "skelP.h" #include "sphere.h" Geom *SkelBoundSphere(Skel *skel, Transform T, TransformN *TN, int *axes, int space) { Geom *sphere; /* Create a dummy sphere, the center will be corrected later */ sphere = GeomCreate("sphere", CR_SPACE, space, CR_END); SphereEncompassPoints((Sphere *)sphere, skel->p, skel->pdim == 4 && (skel->geomflags & VERT_4D) != 0, skel->pdim, skel->nvert, T, TN, axes); return sphere; } geomview-1.9.5/src/lib/gprim/skel/skel.h0000644000175000017500000000227512310110200014773 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef SKELDEF #define SKELDEF #ifndef NULL #define NULL 0 #endif #include "bbox.h" #define SKELMAGIC GeomMagic ('s', 1) /* For checking whether a vect. */ typedef struct Skel Skel; GeomClass *SkelMethods(); #endif /*SKELDEF*/ geomview-1.9.5/src/lib/gprim/skel/skelP.h0000644000175000017500000000443512310110200015113 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef SKELPDEF #define SKELPDEF #include "geomclass.h" #include "skel.h" typedef struct Skline { int nv; /* Number of vertices for this polyline */ int v0; /* offset into vi[] of all vertices on line */ int nc; /* Number of colors for this polyline */ int c0; /* index into c[] of first color */ } Skline; struct Skel { GEOMFIELDS; int nvert, nlines; float *p; /* Array[nvert][pdim] of point coords */ Skline *l; /* nl[nlines] */ int nvi; /* Total number of vertex indices */ int *vi; /* All vertex index lists */ int nc; /* Total number of colors */ ColorA *c; /* Array of per-polyline colors */ ColorA *vc; /* Array of per-vertex colors */ }; extern Skel *SkelCreate( Skel *, GeomClass *, va_list *a_list); extern void SkelDelete( Skel * ); extern Skel *SkelCopy( Skel * ); extern Skel *SkelPick( Skel *, Pick *, Appearance *, Transform, TransformN *TN, int *axes ); extern Skel *SkelFLoad( IOBFILE *f, char *fname ); extern Skel *SkelFSave( Skel *, FILE * ); extern BBox *SkelBound(Skel *s, Transform T, TransformN *TN); extern Skel *SkelDraw( Skel * ); extern Skel *SkelTransform( Skel *s, Transform T, TransformN *TN ); extern Geom *SkelBoundSphere(Skel *skel, Transform T, TransformN *TN, int *axes, int space); #endif /*SKELPDEF*/ geomview-1.9.5/src/lib/gprim/skel/Headers0000644000175000017500000000001712310110200015152 00000000000000skel.h skelP.h geomview-1.9.5/src/lib/gprim/sphere/0000755000175000017500000000000012310165602014306 500000000000000geomview-1.9.5/src/lib/gprim/sphere/Makefile.in0000644000175000017500000004750512310165554016314 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @BEZIER_SPHERES_FALSE@am__append_1 = spheredice.c spheredraw.c subdir = src/lib/gprim/sphere DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libsphere_la_LIBADD = am__libsphere_la_SOURCES_DIST = sphereclass.c spherecreate.c \ sphereload.c spheremisc.c spheresave.c sphere.h sphereP.h \ spheredice.c spheredraw.c @BEZIER_SPHERES_FALSE@am__objects_1 = spheredice.lo spheredraw.lo am_libsphere_la_OBJECTS = sphereclass.lo spherecreate.lo sphereload.lo \ spheremisc.lo spheresave.lo $(am__objects_1) libsphere_la_OBJECTS = $(am_libsphere_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libsphere_la_SOURCES) DIST_SOURCES = $(am__libsphere_la_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__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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libsphere.la libsphere_la_SOURCES = sphereclass.c spherecreate.c sphereload.c \ spheremisc.c spheresave.c sphere.h sphereP.h $(am__append_1) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/sphere/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/sphere/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libsphere.la: $(libsphere_la_OBJECTS) $(libsphere_la_DEPENDENCIES) $(EXTRA_libsphere_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libsphere_la_OBJECTS) $(libsphere_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sphereclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spherecreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spheredice.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spheredraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sphereload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spheremisc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spheresave.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/sphere/Makefile.am0000644000175000017500000000043012310110200016237 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libsphere.la libsphere_la_SOURCES = \ sphereclass.c spherecreate.c sphereload.c spheremisc.c spheresave.c \ sphere.h sphereP.h if !BEZIER_SPHERES libsphere_la_SOURCES += spheredice.c spheredraw.c endif geomview-1.9.5/src/lib/gprim/sphere/sphereclass.c0000644000175000017500000000420512310110200016667 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Celeste Fowler, Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geom.h" #include "geomclass.h" #include "sphereP.h" static char nameSphere[] = "sphere"; GeomClass *SphereClass = NULL; int SpherePresent = 1; char *SphereName() { return nameSphere; } GeomClass *SphereMethods() { if (SphereClass == NULL) { (void) InstMethods(); SphereClass = GeomSubClassCreate("inst", "sphere"); SphereClass->name = SphereName; SphereClass->methods = (GeomMethodsFunc *)SphereMethods; SphereClass->create = (GeomCreateFunc *)SphereCreate; SphereClass->fsave = (GeomFSaveFunc *)SphereFSave; SphereClass->fload = (GeomFLoadFunc *)SphereFLoad; SphereClass->copy = (GeomCopyFunc *)SphereCopy; #if !BEZIER_SPHERES SphereClass->dice = (GeomDiceFunc *)SphereDice; SphereClass->draw = (GeomDrawFunc *)SphereDraw; SphereClass->bsptree = (GeomBSPTreeFunc *)SphereBSPTree; #endif SphereClass->export = NULL; SphereClass->import = NULL; SphereClass->unexport = NULL; } return SphereClass; } geomview-1.9.5/src/lib/gprim/sphere/spherecreate.c0000644000175000017500000003113312310110200017025 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include "geom.h" #include "geomclass.h" #include "transform.h" #include "hpoint3.h" #include "sphereP.h" #include "tlist.h" DEF_FREELIST(Sphere); void SphereFreeListPrune(void) { FreeListNode *old; size_t size = 0; while (SphereFreeList) { old = SphereFreeList; SphereFreeList = old->next; OOGLFree(old); size += sizeof(Sphere); } OOGLWarn("Freed %ld bytes.\n", size); } #if BEZIER_SPHERES #include "bezier.h" static float ctrlPnts[] = { #if old 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 2, 2, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0, 0, 4, 4 #else 0, 0, 1, 1, 0, 1, 1, 1, 0, 2, 0, 2, 1, 0, 1, 1, 1, 1, 1, 1, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 4, 0, 0, 4, #endif }; #define V4 geomtfm[0] #endif /* To support all texture mappings supported by mktxmesh we have to * compose the sphere of different parts. */ static const int ngeomtfm[] = { 8, 2, 8, 8, 4, 8 }; static const Transform geomtfm[][8] = { { /* SPHERE_TXNONE, octants */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}} }, { /* SPHERE_TXSINUSOIDAL, reflection on (x,y)-plane */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, }, { /* SPHERE_TXCYLINDRIAL, octants */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}} }, { /* SPHERE_TXRECTANGULAR, octants */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}} }, { /* SPHERE_TXSTEREOGRAPHIC, quarters */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, }, { /* SPHERE_TXONESIDE, octants */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}} }, }; /* for the transformation of the texture co-ordinates (if any) */ static const Transform textfm[][8] = { { /* SPHERE_TXNONE, nothing */ {{ 0, }}, }, { /* SPHERE_TXSINUSOIDAL */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 1, 0, 1}}, }, {/* SPHERE_TXCYLINDRIAL */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0.0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {1.0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0.5, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0.5, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0.0, 1, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {1.0, 1, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0.5, 1, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0.5, 1, 0, 1}}, }, { /* SPHERE_TXRECTANGULAR */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {1.0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0.5, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0.5, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0.0, 1, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {1.0, 1, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0.5, 1, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0.5, 1, 0, 1}}, }, { /* SPHERE_TXSTEREOGRAPHIC */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, }, { /* SPHERE_TXONESIDE */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 1, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 1, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {1, 1, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {1, 1, 0, 1}}, } }; /* Cache the tlists, there is no need to copy them over and over again. */ static Geom *geomTlist[COUNT(geomtfm)]; static Geom *texTlist[COUNT(textfm)]; static inline void sphere_make_meshhandle(Sphere *sphere) { char meshhname[sizeof("\aSphere::")+sizeof(void *)*2]; extern HandleOps GeomOps; Handle *handle; sprintf(meshhname, "\aSphere::%lx", (unsigned long)sphere); handle = HandleDoCreate(meshhname, &GeomOps); GeomCCreate((Geom *)sphere, InstMethods(), CR_NOCOPY, CR_GEOMHANDLE, handle, CR_END); } /* Do we need a SphereCopy()? In principle yes. */ Sphere *SphereCopy(Sphere *sphere) { Sphere *nsphere; /* simply create a new one and copy over the three defining fields */ nsphere = (Sphere *)GeomCCreate(NULL, SphereMethods(), CR_SPACE, sphere->space, CR_CENTER, &sphere->center, CR_RADIUS, &sphere->radius, CR_SPHERETX, sphere->geomflags & SPHERE_TXMASK, CR_END); TmCopy(sphere->axis, nsphere->axis); return nsphere; } Sphere *SphereCreate(Geom *exist, GeomClass *classp, va_list *a_list) { Sphere *sphere; int nencompass_points = 0; int attr, copy = 1; unsigned texmeth; Transform *axis = NULL; HPoint3 *encompass_points = NULL; if (exist == NULL) { FREELIST_NEW(Sphere, sphere); GGeomInit(sphere, classp, SPHEREMAGIC, NULL); sphere->freelisthead = &SphereFreeList; TmIdentity(sphere->axis); sphere->NDaxis = NULL; sphere->geomhandle = NULL; sphere->geom = NULL; sphere->tlisthandle = NULL; sphere->tlist = NULL; sphere->txtlisthandle = NULL; sphere->txtlist = NULL; sphere->axishandle = NULL; sphere->NDaxishandle = NULL; sphere->location = L_NONE; sphere->origin = L_NONE; sphere->radius = 1.0; sphere->space = TM_EUCLIDEAN; HPt3From(&(sphere->center), 0.0, 0.0, 0.0, 1.0); sphere->ntheta = sphere->nphi = SPHERE_DEFAULT_MESH_SIZE; } else { sphere = (Sphere *)exist; } texmeth = sphere->geomflags & SPHERE_TXMASK; while ((attr = va_arg (*a_list, int))) switch (attr) { case CR_CENTER: sphere->center = *va_arg(*a_list, HPoint3 *); break; case CR_RADIUS: sphere->radius = va_arg(*a_list, double); break; case CR_SPACE: sphere->space = va_arg(*a_list, int); break; case CR_ENCOMPASS_POINTS: encompass_points = va_arg(*a_list, HPoint3 *); break; case CR_NENCOMPASS_POINTS: nencompass_points = va_arg(*a_list, int); break; case CR_SPHERETX: switch (texmeth = va_arg(*a_list, int)) { case SPHERE_TXNONE: case SPHERE_TXSINUSOIDAL: case SPHERE_TXCYLINDRICAL: case SPHERE_TXRECTANGULAR: case SPHERE_TXSTEREOGRAPHIC: case SPHERE_ONEFACE: break; default: OOGLError(1, "Undefined texture mapping method: %d", texmeth); if (exist == NULL) { GeomDelete ((Geom *)sphere); } return NULL; } break; case CR_AXIS: axis = va_arg(*a_list, Transform *); break; default: if (GeomDecorate(sphere, ©, attr, a_list)) { OOGLError (0, "ListCreate: Undefined attribute: %d", attr); if(exist == NULL) GeomDelete ((Geom *)sphere); return NULL; } break; } HPt3Dehomogenize(&(sphere->center), &(sphere->center)); #if BEZIER_SPHERES if (sphere->geom == NULL) { /* No need to generate those objects anew if we already have a * sphere, they never change. Also, we need to make a copy of the * control-points with malloc(); should probably change the Bezier * object instead. */ float *CPctrlPnts; Geom *quadrant; Geom *unitsphere; /* Bezier does not make a copy of the control points */ CPctrlPnts = OOGLNewNE(float, (2+1)*(2+1)*4, "copy of sphere ctrl points"); memcpy(CPctrlPnts, ctrlPnts, sizeof(ctrlPnts)); quadrant = GeomCCreate(NULL, BezierMethods(), CR_DEGU, 2, CR_DEGV, 2, CR_DIM, 4, CR_POINT, CPctrlPnts, CR_END); /* TList does make a copy of the transformations */ unitsphere = GeomCreate("tlist", CR_NELEM, 8, CR_ELEM, V4, CR_END); GeomCCreate((Geom *)sphere, InstMethods(), CR_GEOM, quadrant, CR_TLIST, unitsphere, CR_END); GeomDelete(quadrant); GeomDelete(unitsphere); } #else if (sphere->geomhandle == NULL) { /* force remeshing on redraw, but not earlier. */ sphere->geomflags |= SPHERE_REMESH; sphere_make_meshhandle(sphere); } if (texmeth != (sphere->geomflags & SPHERE_TXMASK)) { int texidx = SPHERE_TXMETH(texmeth); /* force remeshing on redraw, but not earlier. */ sphere->geomflags |= SPHERE_REMESH; sphere->geomflags &= ~SPHERE_TXMASK; sphere->geomflags |= texmeth; if (texidx > 0 && texTlist[texidx] == NULL) { texTlist[texidx] = GeomCCreate(NULL , TlistMethods(), CR_NELEM, ngeomtfm[texidx], CR_ELEM, textfm[texidx], CR_END); } GeomCCreate((Geom *)sphere, InstMethods(), CR_TLIST, NULL, CR_TXTLIST, texTlist[texidx], CR_END); } if (sphere->tlist == NULL) { int texidx = SPHERE_TXMETH(sphere->geomflags); /* force remeshing on redraw, but not earlier. */ sphere->geomflags |= SPHERE_REMESH; if (geomTlist[texidx] == NULL) { geomTlist[texidx] = GeomCCreate(NULL , TlistMethods(), CR_NELEM, ngeomtfm[texidx], CR_ELEM, geomtfm[texidx], CR_END); } GeomCCreate((Geom *)sphere, InstMethods(), CR_TLIST, geomTlist[texidx], CR_END); } #endif SphereSwitchSpace(sphere, sphere->space); if (nencompass_points && encompass_points != NULL) SphereEncompassHPt3N(sphere, encompass_points, nencompass_points, (axis == NULL) ? TM_IDENTITY : *axis); if (sphere->ap && sphere->ap->mat && (sphere->ap->mat->valid & MTF_ALPHA) && sphere->ap->mat->diffuse.a != 1.0) { sphere->geomflags |= COLOR_ALPHA; } else { sphere->geomflags &= ~COLOR_ALPHA; } return sphere; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/sphere/sphereload.c0000644000175000017500000000562112310110200016504 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "geom.h" #include "geomclass.h" #include "transform.h" #include "sphereP.h" static const char *texmap[] = { "SINUSOIDAL", "CYLINDRICAL", "RECTANGULAR", "STEREOGRAPHIC", "ONEFACE", NULL }; Sphere *SphereFLoad(IOBFILE *file, char *fname) { HPoint3 center; float radius; Geom *sphere; char *token; int space, i, c; unsigned txmapmeth = SPHERE_TXCYLINDRICAL; bool tex = false; if (file == NULL) return NULL; space = TM_EUCLIDEAN; token = GeomToken(file); if (token[0] == 'S' && token[1] == 'T') { tex = true; token += 2; } switch(*token) { case 'E': space = TM_EUCLIDEAN; token++; break; case 'H': space = TM_HYPERBOLIC; token++; break; case 'S': if(token[1] == 'S') { space = TM_SPHERICAL; token++; } break; } if(strcmp(token, "SPHERE") != 0) { return NULL; } GeomAcceptToken(); if (tex) { c = iobfnextc(file, 0); for (i = 0; texmap[i] != NULL; i++) { if (c == (int)texmap[i][0]) { break; } } if (texmap[i] != NULL) { token = GeomToken(file); for (i = 0; texmap[i] != NULL; i++) { if (strcmp(texmap[i], token) == 0) { break; } } if (texmap[i] == NULL) { OOGLSyntax(file, "%s: SPHERE: expected texture mapping method", fname); return NULL; } txmapmeth = GEOMFLAG((i+1) << 1); } } if (iobfgetnf(file, 1, &radius, 0) != 1 || iobfgetnf(file, 3, ¢er.x, 0) != 3) { OOGLSyntax(file, "%s: SPHERE: expected radius, then x y z", fname); return NULL; } center.w = 1.0; sphere = GeomCreate("sphere", CR_RADIUS, (double)radius, CR_CENTER, ¢er, CR_SPACE, space, tex ? CR_SPHERETX : CR_END, txmapmeth, CR_END); return (Sphere *)sphere; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/sphere/spheremisc.c0000644000175000017500000003136612310110200016525 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "geom.h" #include "geomclass.h" #include "transform.h" #include "sphereP.h" #include "hpoint3.h" #ifndef FUDGE #define FUDGE 1e-6 #endif void SphereMinMax(Sphere *sphere, HPoint3 *min, HPoint3 *max) { Geom *bbox; bbox = GeomBound((Geom *)sphere, TM_IDENTITY, NULL); BBoxMinMax((BBox *)bbox, min, max); GeomDelete(bbox); HPt3Dehomogenize(min, min); HPt3Dehomogenize(max, max); } void SphereCenter(Sphere *sphere, HPoint3 *center) { *center = sphere->center; } float SphereRadius(Sphere *sphere) { return sphere->radius; } void SphereSwitchSpace(Sphere *sphere, int space) { Transform T; sphere->space = space; TmScale(sphere->axis, sphere->radius, sphere->radius, sphere->radius); TmSpaceTranslate(T, sphere->center.x, sphere->center.y, sphere->center.z, sphere->space); GeomTransform((Geom*)sphere, T, NULL); } Sphere *SphereUnion3(Sphere *a, Sphere *b, Sphere *dest) { int space; HPoint3 center, diff; float radius = 0.0; if (a == NULL && b == NULL) return NULL; space = (a != NULL) ? a->space : b->space; if (dest == NULL) dest = (Sphere *)GeomCreate("sphere", CR_SPACE, space, CR_END); if (a == NULL || b == NULL) { if (a == NULL) { radius = b->radius; center = b->center; space = b->space; } else if (b == NULL) { radius = a->radius; center = a->center; space = a->space; } GeomSet((Geom*)dest, CR_RADIUS, radius, CR_CENTER, ¢er, CR_SPACE, space, CR_END); } else { if (a->space != b->space) OOGLError(1, "Uniting two spheres existing in different spaces."); space = a->space; if (space != TM_EUCLIDEAN) OOGLError(1, "SphereUnion3 currently only works reliably in\n%s", "Euclidean space."); HPt3Sub(&b->center, &a->center, &diff); Pt3Unit(HPoint3Point3(&diff)); center.x = b->center.x + diff.x*b->radius; center.y = b->center.y + diff.y*b->radius; center.z = b->center.z + diff.z*b->radius; center.w = 1.0; GeomSet((Geom*)dest, CR_RADIUS, a->radius, CR_CENTER, &a->center, CR_END); SphereAddHPt3(dest, ¢er, TM_IDENTITY); } return dest; } void SphereEncompassBoundsN(Sphere *sphere, HPoint3 *points, int dim) { int i, j; float span, maxspan; HPoint3 *d1, *d2, center; d1 = d2 = &points[0]; maxspan = 0.0; for (i = 0; i < 2*dim; i++) for (j = i+1; j < 2*dim; j++) { span = HPt3SpaceDistance(&points[i], &points[j], sphere->space); if (span > maxspan) { maxspan = span; d1 = &points[i]; d2 = &points[j]; } } /* Find the midpoint here - this will not work in non-Euclidean space */ center.x = (d1->x/d1->w + d2->x/d2->w) / 2.0; center.y = (d1->y/d1->w + d2->y/d2->w) / 2.0; center.z = (d1->z/d1->w + d2->z/d2->w) / 2.0; center.w = 1.0; GeomSet((Geom *)sphere, CR_RADIUS, maxspan / 2.0, CR_CENTER, ¢er, CR_END); } void SphereEncompassBounds(Sphere *sphere, HPoint3 *points) { SphereEncompassBoundsN(sphere, points, 3); } int SphereAddHPt3(Sphere *sphere, HPoint3 *point, Transform T) { float radius, old_to_p, old_to_new; HPoint3 center, newpoint; HPt3Transform(T, point, &newpoint); if(newpoint.w != 1) HPt3Dehomogenize(&newpoint, &newpoint); old_to_p = HPt3SpaceDistance(&newpoint, &sphere->center, sphere->space); if (old_to_p > sphere->radius) { radius = (sphere->radius + old_to_p) / 2.0; old_to_new = old_to_p - radius; center.x = sphere->center.x + (newpoint.x - sphere->center.x)*old_to_new / old_to_p; center.y = sphere->center.y + (newpoint.y - sphere->center.y)*old_to_new / old_to_p; center.z = sphere->center.z + (newpoint.z - sphere->center.z)*old_to_new / old_to_p; center.w = 1.0; GeomSet((Geom *)sphere, CR_RADIUS, radius, CR_CENTER, ¢er, CR_END); return 1; } else return 0; } int SphereAddHPt3N(Sphere *sphere, HPoint3 *point, int n, Transform T) { int i, ans = 0; for (i = 0; i < n; i++) ans |= SphereAddHPt3(sphere, &point[i], T); return ans; } void SphereEncompassHPt3N(Sphere *sphere, HPoint3 *point, int n, Transform T) { int i; HPoint3 spanPts[6]; if (!n) return; spanPts[0] = point[0]; HPt3Dehomogenize(&spanPts[0], &spanPts[0]); for (i = 1; i < 6; i++) { spanPts[i] = spanPts[0]; } MaxDimensionalSpanN(spanPts, point+1, n-1); HPt3TransformN(T, spanPts, spanPts, 6); SphereEncompassBounds(sphere, spanPts); SphereAddHPt3N(sphere, point, n, T); } /* 0 has min x, 1 has max x, 2 has min y... */ void MaxDimensionalSpan(HPoint3 *spanPts, HPoint3 *point) { HPoint3 pt; if(point->w != 1 && point->w != 0) { HPt3Dehomogenize(point, &pt); point = &pt; } if (point->x < spanPts[0].x) spanPts[0] = *point; else if (point->x > spanPts[1].x) spanPts[1] = *point; if (point->y < spanPts[2].y) spanPts[2] = *point; else if (point->y > spanPts[3].y) spanPts[3] = *point; if (point->z < spanPts[4].z) spanPts[4] = *point; else if (point->z > spanPts[5].z) spanPts[5] = *point; } void MaxDimensionalSpanN(HPoint3 *spanPts, HPoint3 *points, int n) { int i; for (i = 0; i < n; i++) { MaxDimensionalSpan(spanPts, &points[i]); } } /* Same stuff as above, but for HPointN case */ int SphereAddHPtN(Sphere *sphere, HPointN *point, Transform T, TransformN *TN, int *axes) { float radius, old_to_p, old_to_new; HPoint3 center, newpoint, tmp; if (TN) { HPtNTransformComponents(TN, point, axes, &newpoint); } else { HPtNToHPt3(point, axes, &tmp); HPt3Transform(T, &tmp, &newpoint); } HPt3Dehomogenize(&newpoint, &newpoint); old_to_p = HPt3SpaceDistance(&newpoint, &sphere->center, sphere->space); if (old_to_p > sphere->radius) { radius = (sphere->radius + old_to_p) / 2.0; old_to_new = old_to_p - radius; center.x = sphere->center.x + (newpoint.x - sphere->center.x)*old_to_new / old_to_p; center.y = sphere->center.y + (newpoint.y - sphere->center.y)*old_to_new / old_to_p; center.z = sphere->center.z + (newpoint.z - sphere->center.z)*old_to_new / old_to_p; center.w = 1.0; GeomSet((Geom *)sphere, CR_RADIUS, radius, CR_CENTER, ¢er, CR_END); return 1; } else { return 0; } } int SphereAddHPtNN(Sphere *sphere, HPointN **point, int n, Transform T, TransformN *TN, int *axes) { int i, ans = 0; for (i = 0; i < n; i++) ans |= SphereAddHPtN(sphere, point[i], T, TN, axes); return ans; } void SphereEncompassHPtNN(Sphere *sphere, HPointN **point, int n, Transform T, TransformN *TN, int *axes) { int i, dim = point[0]->dim-1; VARARRAY(spanPts, HPointN *, 2*dim); VARARRAY(spanPts3, HPoint3, 2*dim); if (!n) return; spanPts[0] = HPtNCopy(point[0], NULL); HPtNDehomogenize(spanPts[0], spanPts[0]); for (i = 1; i < 2*dim; i++) { spanPts[i] = HPtNCopy(spanPts[0], NULL); } MaxDimensionalSpanHPtNN(spanPts, point+1, n-1); if (TN) { for (i = 0; i < 2*dim; i++) { HPtNTransformComponents(TN, spanPts[i], axes, &spanPts3[i]); HPtNDelete(spanPts[i]); } } else { HPoint3 tmp; for (i = 0; i < 2*dim; i++) { HPtNToHPt3(spanPts[i], axes, &tmp); HPt3Transform(T, &tmp, &spanPts3[i]); HPtNDelete(spanPts[i]); } } SphereEncompassBoundsN(sphere, spanPts3, dim); SphereAddHPtNN(sphere, point, n, T, TN, axes); } /* 0 has min x, 1 has max x, 2 has min y... */ void MaxDimensionalSpanHPtN(HPointN **spanPts, HPointN *point) { int dim = point->dim, i; HPointN tmp; VARARRAY(tmpdata, HPtNCoord, dim); if (point->v[dim-1] != 1 && point->v[dim-1] != 0) { tmp.dim = dim; tmp.flags = 0; tmp.v = tmpdata; point = HPtNCopy(point, &tmp); HPtNDehomogenize(point, point); } for (i = 0; i < dim-1; i++) { if (point->v[i] < spanPts[2*i]->v[i]) HPtNCopy(point, spanPts[2*i]); else if (point->v[i] > spanPts[2*i+1]->v[i]) HPtNCopy(point, spanPts[2*i+1]); } } void MaxDimensionalSpanHPtNN(HPointN **spanPts, HPointN **points, int n) { int i; for (i = 0; i < n; i++) { MaxDimensionalSpanHPtN(spanPts, points[i]); } } /* Same as above, but for contiguous data, as used in mesh, ndmesh, * npolylist, skel, can be used for VERT_4D case. */ int SphereAddPoint(Sphere *sphere, float *point, int vert_4d, int pdim, Transform T, TransformN *TN, int *axes) { float radius, old_to_p, old_to_new; HPoint3 center, newpoint, tmp3; HPointN tmp; VARARRAY(v, HPtNCoord, 5); tmp.flags = 0; if (pdim == 4) { tmp.v = v; if (vert_4d) { tmp.dim = 5; Pt4ToHPtN((HPoint3 *)point, &tmp); } else { tmp.dim = 4; HPt3ToHPtN((HPoint3 *)point, NULL, &tmp); } } else { tmp.v = point; tmp.dim = pdim; } if (TN) { HPtNTransformComponents(TN, &tmp, axes, &newpoint); } else { HPtNToHPt3(&tmp, axes, &tmp3); HPt3Transform(T, &tmp3, &newpoint); } HPt3Dehomogenize(&newpoint, &newpoint); old_to_p = HPt3SpaceDistance(&newpoint, &sphere->center, sphere->space); if (old_to_p > sphere->radius) { radius = (sphere->radius + old_to_p) / 2.0; old_to_new = old_to_p - radius; center.x = sphere->center.x + (newpoint.x - sphere->center.x)*old_to_new / old_to_p; center.y = sphere->center.y + (newpoint.y - sphere->center.y)*old_to_new / old_to_p; center.z = sphere->center.z + (newpoint.z - sphere->center.z)*old_to_new / old_to_p; center.w = 1.0; GeomSet((Geom *)sphere, CR_RADIUS, radius, CR_CENTER, ¢er, CR_END); return 1; } else { return 0; } } int SphereAddPoints(Sphere *sphere, float *point, int vert_4d, int pdim, int n, Transform T, TransformN *TN, int *axes) { int i, ans = 0; for (i = 0; i < n; i++, point += pdim) { ans |= SphereAddPoint(sphere, point, vert_4d, pdim, T, TN, axes); } return ans; } void SphereEncompassPoints(Sphere *sphere, float *points, int vert_4d, int pdim, int n, Transform T, TransformN *TN, int *axes) { int i, dim; if (!n) { return; } if (pdim != 4) { vert_4d = 0; } dim = vert_4d ? pdim : pdim - 1; { VARARRAY(spanPts, HPointN *, 2*dim); VARARRAY(spanPts3, HPoint3, 2*dim); if (pdim == 4) { if (vert_4d) { spanPts[0] = Pt4ToHPtN((HPoint3 *)points, NULL); } else { spanPts[0] = HPt3ToHPtN((HPoint3 *)points, NULL, NULL); } } else { spanPts[0] = HPtNCreate(pdim, points); } HPtNDehomogenize(spanPts[0], spanPts[0]); for (i = 1; i < 2*dim; i++) { spanPts[i] = HPtNCopy(spanPts[0], NULL); } MaxNDimensionalSpanN(spanPts, points+pdim, vert_4d, pdim, n-1); if (TN) { for (i = 0; i < 2*dim; i++) { HPtNTransformComponents(TN, spanPts[i], axes, &spanPts3[i]); } } else { HPoint3 pt3; for (i = 0; i < 2*dim; i++) { HPtNToHPt3(spanPts[i], axes, &pt3); HPt3Transform(T, &pt3, &spanPts3[i]); } } SphereEncompassBoundsN(sphere, spanPts3, dim); SphereAddPoints(sphere, points, vert_4d, pdim, n, T, TN, axes); for (i = 0; i < 2*dim; i++) { HPtNDelete(spanPts[i]); } } } void MaxNDimensionalSpanN(HPointN **spanPts, float *points, int vert_4d, int pdim, int n) { int i; HPointN tmp; tmp.flags = 0; if (pdim == 4) { HPtNCoord v[5]; tmp.v = v; if (vert_4d) { tmp.dim = 5; for (i = 0; i < n; i++) { Pt4ToHPtN((HPoint3 *)points, &tmp); MaxDimensionalSpanHPtN(spanPts, &tmp); points += 4; } } else { tmp.dim = 4; for (i = 0; i < n; i++) { HPt3ToHPtN((HPoint3 *)points, NULL, &tmp); MaxDimensionalSpanHPtN(spanPts, &tmp); points += 4; } } } else { tmp.v = points; tmp.dim = pdim; for (i = 0; i < n; i++) { MaxDimensionalSpanHPtN(spanPts, &tmp); tmp.v += pdim; } } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/sphere/spheresave.c0000644000175000017500000000347612310110200016531 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include "transform.h" #include "geom.h" #include "geomclass.h" #include "sphereP.h" static const char *texmap[] = { "SINUSOIDAL", "CYLINDRICAL", "RECTANGULAR", "STEREOGRAPHIC", "ONEFACE" }; Sphere *SphereFSave(Sphere *sphere, FILE *f, char *fname) { int texmeth = 0; (void)fname; if (sphere == NULL) { return NULL; } if ((texmeth = SPHERE_TXMETH(sphere->geomflags)) != 0) { fprintf(f, "ST"); } switch(sphere->space) { case TM_HYPERBOLIC: fprintf(f, "%c", 'H'); break; case TM_SPHERICAL: fprintf(f, "%c", 'S'); break; } fprintf(f, "SPHERE"); if (texmeth != 0) { fprintf(f, " %s\n", texmap[texmeth-1]); } else { fprintf(f, "\n"); } fprintf(f, "%g %g %g %g\n", sphere->radius, sphere->center.x, sphere->center.y, sphere->center.z); return (ferror(f) ? NULL : sphere); } geomview-1.9.5/src/lib/gprim/sphere/sphere.h0000644000175000017500000000612512310110200015651 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef SPHERE_H #define SPHERE_H #include "geomclass.h" typedef struct Sphere Sphere; extern GeomClass *SphereClass; void SphereMinMax(Sphere *sphere, HPoint3 *min, HPoint3 *max); void SphereCenter(Sphere *sphere, HPoint3 *center); float SphereRadius(Sphere *sphere); void SphereSwitchSpace(Sphere *sphere, int space); /* Makes sphere encompassing both other spheres - new sphere if dest == NULL, * just puts results in dest otherwise */ Sphere *SphereUnion3(Sphere *a, Sphere *b, Sphere *dest); /* points is actually a (2*dim)-element array containing the points with * the minimum and maximum x, y, and z coordinates. */ void SphereEncompassBoundsN(Sphere *sphere, HPoint3 *points, int dim); void SphereEncompassBounds(Sphere *sphere, HPoint3 *points); /* Returns zero if didn't change sphere, non-zero if did */ int SphereAddHPt3(Sphere *sphere, HPoint3 *point, Transform T); int SphereAddHPt3N(Sphere *sphere, HPoint3 *point, int n, Transform T); int SphereAddHPtN(Sphere *sphere, HPointN *point, Transform T, TransformN *TN, int *axes); int SphereAddHPtNN(Sphere *sphere, HPointN **point, int n, Transform T, TransformN *TN, int *axes); int SphereAddPoint(Sphere *sphere, float *point, int dim, int pdim, Transform T, TransformN *TN, int *axes); int SphereAddPoints(Sphere *sphere, float *point, int dim, int pdim, int n, Transform T, TransformN *TN, int *axes); /* Modifies sphere to surround all points */ void SphereEncompassHPt3N(Sphere *sphere, HPoint3 *point, int n, Transform T); void SphereEncompassHPtNN(Sphere *sphere, HPointN **point, int n, Transform T, TransformN *TN, int *axes); void SphereEncompassPoints(Sphere *sphere, float *points, int dim, int pdim, int n, Transform T, TransformN *TN, int *axes); /* Finds points with the maximum dimensional span - spanPts is an array * of 6 elements (2 points per axis) */ void MaxDimensionalSpan(HPoint3 *spanPts, HPoint3 *point); void MaxDimensionalSpanN(HPoint3 *spanPts, HPoint3 *points, int n); void MaxDimensionalSpanHPtN(HPointN **spanPts, HPointN *pt); void MaxDimensionalSpanHPtNN(HPointN **spanPts, HPointN **points, int n); void MaxNDimensionalSpanN(HPointN **spanPts, float *points, int dim, int pdim, int n); #endif geomview-1.9.5/src/lib/gprim/sphere/sphereP.h0000644000175000017500000000531112310110200015765 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef SPHEREP_H #define SPHEREP_H #include "sphere.h" #include "instP.h" #include "mesh.h" #ifndef BEZIER_SPHERES # define BEZIER_SPHERES 0 /* define to 1 to use bezier splines, to 0 to * use a mesh based on a polar co-ordinate * system. */ #endif #define SPHEREFIELDS \ INSTFIELDS; \ float radius; \ HPoint3 center; \ int space; \ int ntheta; \ int nphi struct Sphere { SPHEREFIELDS; }; #define SPHEREMAGIC GeomMagic('s', 1) #define SPHERE_REMESH GEOMFLAG(0x01) /* need to recompute the mesh */ #define SPHERE_DEFAULT_MESH_SIZE 10 /* otherwise from ap->dice */ /* texture co-ordinates a la Orrery's mkmeshtx*/ enum { SPHERE_TXNONE = GEOMFLAG(0 << 1), /* 0x0 */ SPHERE_TXSINUSOIDAL = GEOMFLAG(1 << 1), /* 0x2 */ SPHERE_TXCYLINDRICAL = GEOMFLAG(2 << 1), /* 0x4 */ SPHERE_TXRECTANGULAR = GEOMFLAG(3 << 1), /* 0x6 */ SPHERE_TXSTEREOGRAPHIC = GEOMFLAG(4 << 1), /* 0x8 */ SPHERE_ONEFACE = GEOMFLAG(5 << 1) /* 0xa */ }; #define SPHERE_TXMASK GEOMFLAG(0xe) #define SPHERE_TXMETH(flags) (((flags) & SPHERE_TXMASK) >> (GEOMFL_SHIFT+1)) extern GeomClass *SphereMethods(); extern Sphere *SphereCreate(Geom *, GeomClass *, va_list *a_list ); extern Sphere *SphereFLoad(IOBFILE *, char *); extern Sphere *SphereSave(Sphere *, char *); extern Sphere *SphereFSave(Sphere *, FILE *, char *); extern Sphere *SphereDice(Sphere *sphere, int nu, int nv); #if !BEZIER_SPHERES extern void SphereReDice(Sphere *sphere); extern Sphere *SphereBSPTree(Sphere *sphere, BSPTree *bsptree, int action); extern Sphere *SphereDraw(Sphere *sphere); #endif extern Sphere *SphereCopy(Sphere *os); /* These are non-mallocing if sphere exists; will create a new sphere and * return it if sphere does not exist */ #endif /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/sphere/spheredice.c0000644000175000017500000001025112310110200016464 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "sphereP.h" Sphere *SphereDice(Sphere *sphere, int nu, int nv) { if (nu < 2) nu = SPHERE_DEFAULT_MESH_SIZE; if (nv < 2) nv = SPHERE_DEFAULT_MESH_SIZE; if (nu != sphere->ntheta || nv != sphere->nphi) { sphere->geomflags |= SPHERE_REMESH; sphere->ntheta = nu; sphere->nphi = nv; } return sphere; } void SphereReDice(Sphere *sphere) { Geom *facet; Point3 *spherepoints; Point3 *spherenormals; TxST *spheretexcoord = NULL; int npts; float theta, phi, thetafrac, phifrac, x, y, z, r; float phiscale, thetascale, thetastart; int i, j, ptno, nphi, ntheta; nphi = sphere->nphi; phiscale = 0.25; ntheta = sphere->ntheta; thetascale = 0.5; thetastart = 0; switch (sphere->geomflags & SPHERE_TXMASK) { case SPHERE_TXSTEREOGRAPHIC: ntheta = 2*sphere->ntheta; thetastart = -0.5; thetascale = 1.0; break; case SPHERE_TXSINUSOIDAL: nphi = 4*sphere->nphi; phiscale = 1.0; break; } npts = nphi * ntheta; spherepoints = OOGLNewNE(Point3, npts, "sphere mesh points"); spherenormals = OOGLNewNE(Point3, npts, "sphere mesh normals"); if ((sphere->geomflags & SPHERE_TXMASK) != SPHERE_TXNONE) { spheretexcoord = OOGLNewNE(TxST, npts, "sphere texture coords"); } /* Generate the part of the sphere in the positive quadrant, after * translating into the center-of-mass co-ordinate system. * * The +z pole is at \theta = +\pi/2. The minimal resolution will * yield an Octahedron. */ for (ptno = j = 0; j < ntheta; j++) { thetafrac = thetascale * (float)j / (float)(ntheta-1); theta = (thetastart + thetafrac) * M_PI; r = cos(theta); z = sin(theta); for (i = 0; i < nphi; i++) { phifrac = phiscale * (float)i / (float)(nphi-1); phi = 2.0 * phifrac * M_PI; spherenormals[ptno].x = x = cos(phi) * r; spherenormals[ptno].y = y = sin(phi) * r; spherenormals[ptno].z = z; Pt3Copy(spherenormals + ptno, spherepoints + ptno); Pt3Mul(sphere->radius, spherepoints + ptno, spherepoints + ptno); switch (sphere->geomflags & SPHERE_TXMASK) { case SPHERE_TXNONE: break; case SPHERE_TXSINUSOIDAL: spheretexcoord[ptno].s = 0.5 + r * (phifrac - 0.5); spheretexcoord[ptno].t = 0.5 + thetafrac; break; case SPHERE_TXCYLINDRICAL: spheretexcoord[ptno].s = phifrac; spheretexcoord[ptno].t = 0.5 + thetafrac; break; case SPHERE_TXRECTANGULAR: spheretexcoord[ptno].s = phifrac; spheretexcoord[ptno].t = 0.5 * (z + 1.0); break; case SPHERE_TXSTEREOGRAPHIC: spheretexcoord[ptno].s = 0.5 + x / (1.0 + (z < -0.9999 ? -0.9999 : z)); spheretexcoord[ptno].t = 0.5 + y / (1.0 + (z < -0.9999 ? -0.9999 : z)); break; case SPHERE_ONEFACE: spheretexcoord[ptno].s = 0.5 * (x + 1.0); spheretexcoord[ptno].t = 0.5 * (z + 1.0); break; } ++ptno; } } facet = GeomCCreate(NULL, MeshMethods(), CR_NOCOPY, CR_NV, ntheta, CR_NU, nphi, CR_POINT, spherepoints, CR_NORMAL, spherenormals, spheretexcoord ? CR_U : CR_END, spheretexcoord, CR_END); if (facet == NULL) { OOGLError(1, "SphereReDice: can't create Mesh"); } sphere->geom = facet; HandleSetObject(sphere->geomhandle, (Ref *)facet); sphere->geomflags &= ~SPHERE_REMESH; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/sphere/spheredraw.c0000644000175000017500000000432412310110200016521 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "mg.h" #include "sphereP.h" #include "bsptreeP.h" static inline bool check_remesh(Sphere *sphere, const Appearance *ap) { if (sphere->geomflags & SPHERE_REMESH) { return true; } if (ap->valid & APF_DICE) { if (sphere->ntheta == ap->dice[0] && sphere->nphi == ap->dice[1]) { return false; } sphere->ntheta = ap->dice[0]; sphere->nphi = ap->dice[1]; sphere->geomflags |= SPHERE_REMESH; return true; } return false; } Sphere * SphereDraw(Sphere *sphere) { /* the mesh is generated lazily on demand, so do it now if necessary */ if (check_remesh(sphere, mggetappearance())) { SphereReDice(sphere); } /* then just call the method from the base-class */ return (Sphere *)sphere->Class->super->draw((Geom *)sphere); } Sphere *SphereBSPTree(Sphere *sphere, BSPTree *bsptree, int action) { /* no need to do stuff if we cannot be translucent */ if (never_translucent((Geom *)sphere)) { return sphere; } /* the mesh is generated lazily on demand, so do it now if necessary */ if (action == BSPTREE_ADDGEOM && (sphere->geomflags & SPHERE_REMESH)) { SphereReDice(sphere); } /* and now call the method from the base class */ return (Sphere *)sphere->Class->super->bsptree((Geom *)sphere, bsptree, action); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/sphere/Headers0000644000175000017500000000002312310110200015477 00000000000000sphere.h sphereP.h geomview-1.9.5/src/lib/gprim/stub/0000755000175000017500000000000012310165602013775 500000000000000geomview-1.9.5/src/lib/gprim/stub/Makefile.in0000644000175000017500000005075512310165554016004 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/stub DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libstub_la_LIBADD = am_libstub_la_OBJECTS = bbox.lo bezier.lo bezierlist.lo comment.lo \ discgrp.lo inst.lo lincoln.lo list.lo mesh.lo ndmesh.lo \ npolylist.lo polylist.lo quad.lo skel.lo sphere.lo stub.lo \ stubdraw.lo tlist.lo vect.lo libstub_la_OBJECTS = $(am_libstub_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libstub_la_SOURCES) DIST_SOURCES = $(libstub_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libstub.la libstub_la_SOURCES = \ bbox.c bezier.c bezierlist.c comment.c discgrp.c inst.c lincoln.c list.c mesh.c ndmesh.c npolylist.c polylist.c quad.c skel.c sphere.c stub.c stubdraw.c tlist.c vect.c \ stub.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/stub/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/stub/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libstub.la: $(libstub_la_OBJECTS) $(libstub_la_DEPENDENCIES) $(EXTRA_libstub_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libstub_la_OBJECTS) $(libstub_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bbox.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezier.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezierlist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/comment.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discgrp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inst.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lincoln.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mesh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmesh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/npolylist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polylist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quad.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stub.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stubdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vect.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/stub/Makefile.am0000644000175000017500000000044612310110200015735 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libstub.la libstub_la_SOURCES = \ bbox.c bezier.c bezierlist.c comment.c discgrp.c inst.c lincoln.c list.c mesh.c ndmesh.c npolylist.c polylist.c quad.c skel.c sphere.c stub.c stubdraw.c tlist.c vect.c \ stub.h geomview-1.9.5/src/lib/gprim/stub/bbox.c0000644000175000017500000000232312310110200014773 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(BBox, "BBox", "bbox") geomview-1.9.5/src/lib/gprim/stub/bezier.c0000644000175000017500000000242112310110200015320 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(Bezier, "Bezier", "bezier") void *BezierReDice() { BezierMethods(); return NULL; } geomview-1.9.5/src/lib/gprim/stub/bezierlist.c0000644000175000017500000000234112310110200016215 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(BezierList, "BezierList", "bezier") geomview-1.9.5/src/lib/gprim/stub/comment.c0000644000175000017500000000236712310110200015513 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Nathaniel Thurston */ #include "stub.h" STUBMETHODS(Comment, "Comment", "comment") geomview-1.9.5/src/lib/gprim/stub/discgrp.c0000644000175000017500000000236112310110200015476 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(DiscGrp, "DiscGrp", "dg") GeomClass *DiscGrpClass; geomview-1.9.5/src/lib/gprim/stub/inst.c0000644000175000017500000000232312310110200015016 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(Inst, "Inst", "inst") geomview-1.9.5/src/lib/gprim/stub/lincoln.c0000644000175000017500000000233412310110200015501 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(Lincoln, "Lincoln", "lincoln") geomview-1.9.5/src/lib/gprim/stub/list.c0000644000175000017500000000232312310110200015014 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(List, "List", "list") geomview-1.9.5/src/lib/gprim/stub/mesh.c0000644000175000017500000000232312310110200014775 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(Mesh, "Mesh", "mesh") geomview-1.9.5/src/lib/gprim/stub/ndmesh.c0000644000175000017500000000233112310110200015316 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(NDMesh, "NDMesh", "ndmesh") geomview-1.9.5/src/lib/gprim/stub/npolylist.c0000644000175000017500000000234212310110200016077 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(NPolyList, "NPolyList", "npolylist") geomview-1.9.5/src/lib/gprim/stub/polylist.c0000644000175000017500000000233712310110200015725 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(PolyList, "PolyList", "polylist") geomview-1.9.5/src/lib/gprim/stub/quad.c0000644000175000017500000000232312310110200014773 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(Quad, "Quad", "quad") geomview-1.9.5/src/lib/gprim/stub/skel.c0000644000175000017500000000232312310110200014777 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(Skel, "Skel", "skel") geomview-1.9.5/src/lib/gprim/stub/sphere.c0000644000175000017500000000307412310110200015333 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" static char prefix[] = "Sphere"; static char lib[] = "sphere"; GeomClass *SphereClass; STUBMETHODS(Sphere, prefix, lib) void SphereEncompassBounds() { StubRoutine(prefix, "EncompassBounds", lib); } void SphereAddHPt3() { StubRoutine(prefix, "AddHPt3", lib); } void MaxDimensionalSpan() { StubRoutine("MaxDimensionalSpan", "", lib); } void SphereUnion3() { StubRoutine(prefix, "Union3", lib); } geomview-1.9.5/src/lib/gprim/stub/stub.c0000644000175000017500000000311112310110200015012 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" static GeomClass *aStubMethods; void StubRoutine(prefix, rest, lib) char *prefix, *rest, *lib; { OOGLError(1, "Trying to use stub %s%s() routine! Relink with lib%s.a", prefix, rest, lib); } GeomClass * StubMethods(prefix, lib) char *prefix, *lib; { StubRoutine(prefix, "Methods", lib); if(aStubMethods == NULL) aStubMethods = GeomClassCreate("stub"); return aStubMethods; } geomview-1.9.5/src/lib/gprim/stub/stubdraw.c0000644000175000017500000000373712310110200015706 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ void CommentDraw() { OOGLWarn("Call to stub CommentDraw"); } void DiscGrpDraw() { OOGLWarn("Call to stub DiscGrpDraw"); } void MeshDraw() { OOGLWarn("Call to stub MeshDraw"); } void NDMeshDraw() { OOGLWarn("Call to stub NDMeshDraw"); } void InstDraw() { OOGLWarn("Call to stub InstDraw"); } void ListDraw() { OOGLWarn("Call to stub ListDraw"); } void QuadDraw() { OOGLWarn("Call to stub QuadDraw"); } void NPolyListDraw() { OOGLWarn("Call to stub NPolyListDraw"); } void PolyListDraw() { OOGLWarn("Call to stub PolyListDraw"); } void BBoxDraw() { OOGLWarn("Call to stub BBoxDraw"); } void BezierDraw() { OOGLWarn("Call to stub BezierDraw"); } void VectDraw() { OOGLWarn("Call to stub VectDraw"); } void TlistDraw() { OOGLWarn("Call to stub TlistDraw"); } void SkelDraw() { OOGLWarn("Call to stub SkelDraw"); } geomview-1.9.5/src/lib/gprim/stub/tlist.c0000644000175000017500000000232612310110200015203 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(Tlist, "Tlist", "tlist") geomview-1.9.5/src/lib/gprim/stub/vect.c0000644000175000017500000000232312310110200015002 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(Vect, "Vect", "vect") geomview-1.9.5/src/lib/gprim/stub/stub.h0000644000175000017500000000376712310110200015040 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef STUBDEFS #define STUBDEFS #include "geomclass.h" extern GeomClass *StubMethods(); void StubRoutine(); /* * This file is #include'd by aspiring per-class stub routines. * Each STUBMETHODS() macro creates a Present tag indicating that the * corresponding library is not loaded, and a Methods() routine * which complains if called. * They're useful as components of a libstub.a library used to link with * applications that only need a few of the OOGL object-types. * Assuming classA, classB, etc. are needed, link as in * -lgeom -lclassA -lclassB ... -lgeom -lstub -lbbox -l3d -lm * * Use of the method-specific stubs (e.g. libstubdraw) is quite different; * see stubdraw.c. */ #if defined(__STDC__) || defined(__ANSI_CPP__) #define STUBMETHODS(prefix, meth, lib) \ int prefix##Present = 0; \ GeomClass *prefix##Methods() { return StubMethods(meth, lib); } #else /*plain C*/ #define STUBMETHODS(prefix, meth, lib) \ int prefix/**/Present = 0; \ GeomClass *prefix/**/Methods() { return StubMethods(meth, lib); } #endif #endif geomview-1.9.5/src/lib/gprim/stub/Headers0000644000175000017500000000000712310110200015170 00000000000000stub.h geomview-1.9.5/src/lib/gprim/tlist/0000755000175000017500000000000012310165603014160 500000000000000geomview-1.9.5/src/lib/gprim/tlist/Makefile.in0000644000175000017500000004634312310165554016164 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/tlist DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libtlist_la_LIBADD = am_libtlist_la_OBJECTS = tlclass.lo tlcreate.lo tlstream.lo \ tltransform.lo libtlist_la_OBJECTS = $(am_libtlist_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libtlist_la_SOURCES) DIST_SOURCES = $(libtlist_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libtlist.la libtlist_la_SOURCES = \ tlclass.c tlcreate.c tlstream.c tltransform.c \ tlist.h tlistP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/tlist/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/tlist/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libtlist.la: $(libtlist_la_OBJECTS) $(libtlist_la_DEPENDENCIES) $(EXTRA_libtlist_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libtlist_la_OBJECTS) $(libtlist_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlstream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tltransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/tlist/Makefile.am0000644000175000017500000000027012310110200016112 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libtlist.la libtlist_la_SOURCES = \ tlclass.c tlcreate.c tlstream.c tltransform.c \ tlist.h tlistP.h geomview-1.9.5/src/lib/gprim/tlist/tlclass.c0000644000175000017500000000402512310110200015671 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "tlistP.h" GeomClass *TlistClass = NULL; int TlistPresent = 1; static char tlistName[] = "tlist"; char * TlistName() { return tlistName; } GeomClass * TlistMethods() { if( !TlistClass ) { TlistClass = GeomClassCreate(tlistName); TlistClass->name = TlistName; TlistClass->methods = (GeomMethodsFunc *)TlistMethods; TlistClass->create = (GeomCreateFunc *)TlistCreate; TlistClass->copy = (GeomCopyFunc *)TlistCopy; TlistClass->Delete = (GeomDeleteFunc *)TlistDelete; TlistClass->transform = (GeomTransformFunc *)TlistTransform; TlistClass->replace = (GeomReplaceFunc *)TlistReplace; TlistClass->position = (GeomPositionFunc *)TlistPosition; TlistClass->get = (GeomGetFunc *)TlistGet; TlistClass->import = (GeomImportFunc *)TlistImport; TlistClass->export = (GeomExportFunc *)TlistExport; } return TlistClass; } geomview-1.9.5/src/lib/gprim/tlist/tlcreate.c0000644000175000017500000001231612310110200016031 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "tlistP.h" /* * Tlist creation, editing and deletion */ DEF_FREELIST(Tlist); void TlistFreeListPrune(void) { FreeListNode *old; Tlist *oldtl; size_t size = 0; while (TlistFreeList) { old = TlistFreeList; TlistFreeList = old->next; oldtl = (Tlist *)old; if (oldtl->elements != NULL && oldtl->nallocated != 0) { OOGLFree(oldtl->elements); } size += sizeof(Transform) * oldtl->nallocated; OOGLFree(old); size += sizeof(Tlist); } OOGLWarn("Freed %ld bytes.\n", size); } void TlistDelete(Tlist *tlist) { if(tlist) { if (tlist->tlist != NULL) GeomDelete(tlist->tlist); if (tlist->tlisthandle != NULL) HandlePDelete(&tlist->tlisthandle); if (tlist->elements != NULL && tlist->freelisthead == NULL) { OOGLFree(tlist->elements); tlist->elements = NULL; tlist->nallocated = 0; } } } Tlist *TlistCopy(Tlist *t) { Tlist *nt; int i; FREELIST_NEW(Tlist, nt); GGeomInit(nt, t->Class, t->magic, NULL); nt->freelisthead = &TlistFreeList; nt->nelements = t->nelements; if (nt->nallocated < nt->nelements) { nt->elements = OOGLRenewNE(Transform, nt->elements, nt->nelements, "Tlist transforms"); nt->nallocated = nt->nelements; } for (i = 0; i < nt->nelements; i++) { TmCopy(t->elements[i], nt->elements[i]); } nt->tlist = GeomCopy(t->tlist); nt->tlisthandle = NULL; return(nt); } Geom * TlistReplace( Tlist *tlist, Geom *geom ) { Geom *old; if(tlist == NULL) return NULL; old = tlist->tlist; tlist->tlist = geom; return old; } int TlistGet( Tlist *tlist, int attr, void *attrp ) { switch(attr) { case CR_GEOM: *(Geom **)attrp = (Geom *)tlist->tlist; break; default: return -1; } return 1; } Tlist * TlistCreate(Tlist *exist, GeomClass *Classp, va_list *a_list) { Tlist *tlist; Geom *g; Handle *h; int copy = true; bool copyel = false; bool doinit = false; int attr; int i; Transform *elements = NULL; if (exist == NULL) { FREELIST_NEW(Tlist, tlist); GGeomInit (tlist, Classp, TLISTMAGIC, NULL); tlist->freelisthead = &TlistFreeList; tlist->tlisthandle = NULL; tlist->tlist = NULL; tlist->nelements = 0; } else { /* XXX Check that exist is a tlist. */ tlist = exist; } while ((attr = va_arg (*a_list, int))) switch(attr) { case CR_GEOM: case CR_TLIST: h = NULL; goto settlist; case CR_HANDLE_GEOM: h = va_arg(*a_list, Handle *); settlist: g = va_arg(*a_list, Geom *); if(copy) { RefIncr((Ref *)g); } if(tlist->tlist) { GeomDelete(tlist->tlist); } tlist->tlist = g; sethandle: if(tlist->tlisthandle) { HandleDelete(tlist->tlisthandle); } if(copy && h) { RefIncr((Ref *)h); } tlist->tlisthandle = h; break; case CR_TLISTHANDLE: h = va_arg(*a_list, Handle *); goto sethandle; case CR_ELEM: elements = va_arg (*a_list, Transform *); copyel = copy; if (!copyel) { OOGLFree(tlist->elements); tlist->elements = NULL; tlist->nallocated = 0; } if (elements == NULL) { doinit = true; } break; case CR_NELEM: tlist->nelements = va_arg (*a_list, int); doinit = true; break; default: if(GeomDecorate(tlist, ©, attr, a_list)) { OOGLError (0, "TlistCreate: undefined option: %d", attr); if (exist == NULL) { GeomDelete ((Geom *) tlist); } return NULL; } } if (elements != NULL && !copyel) { if (tlist->elements) { OOGLFree(tlist->elements); } tlist->elements = elements; tlist->nallocated = tlist->nelements; } else { if (tlist->nallocated < tlist->nelements) { tlist->elements = OOGLRenewNE(Transform, tlist->elements, tlist->nelements, "TlistCreate: matrices"); tlist->nallocated = tlist->nelements; } if (elements == NULL) { if (doinit) { for (i = 0; i < tlist->nelements; i++) { TmIdentity (tlist->elements[i] ); } } } else { memcpy (tlist->elements, elements, tlist->nelements * sizeof (Transform)); } } return tlist; } geomview-1.9.5/src/lib/gprim/tlist/tlstream.c0000644000175000017500000001303212310110200016055 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include "tlistP.h" #include "inst.h" #include "list.h" #include "handleP.h" #include "transobj.h" Geom * TlistImport( Pool *p ) { Geom *subtlist = NULL; Geom *list = NULL; Geom *groupinst = NULL; Geom *geom = NULL; Geom *g = NULL; Transform tfm; Handle *geomhandle = NULL, *tfmhandle = NULL, *subtlisthandle = NULL; char *token; static char errfmt[] = "Reading TLIST from \"%s\": %s"; int i, nel; vvec v; vvec vinst; int brack = 0; int binary = 0; int sawheader = 1; float *tp; float preread = 0; int got_preread = 0; IOBFILE *file; Transform TT[100]; if((file = PoolInputFile(p)) == NULL) return NULL; token = GeomToken(file); if(strcmp(token, "GROUP") == 0 || strcmp(token, "TLIST") == 0) { sawheader = 1; } else { if(*token == '\0') return NULL; if(*token == '-' || isdigit(*token) || *token == '.') preread = strtod(token, &token); if(*token != '\0') return NULL; got_preread = 1; } VVINIT(vinst, Geom *, 7); if (sawheader && (iobfnextc(file, 1) == 'B')) { if(iobfexpectstr(file, "BINARY")) return NULL; if(iobfnextc(file, 1) == '\n') (void) iobfgetc(file); /* * TLIST BINARY ... \n * * */ if(iobfgetni(file, 1, &nel, binary) != 1 || nel < 0 || nel > 9999999) return NULL; VVINIT(v, Transform, 1); vvneeds(&v, nel); if((VVCOUNT(v) = iobfgettransform(file, nel, (float *)VVEC(v,Transform), 1)) < nel) { vvfree(&v); OOGLError(0, "Reading binary TLIST from \"%s\": got only %d of %d transforms expected", PoolName(p), VVCOUNT(v), nel); return NULL; } } else { VVINIT(v, Transform, 100); vvuse(&v, TT, 100); } for(;;) { switch(iobfnextc(file, 0)) { case ':': case '<': case '@': case 'd': tfmobject: if(TransStreamIn(p, &tfmhandle, tfm)) { *VVAPPEND(vinst, Geom *) = GeomCCreate(NULL, InstMethods(), CR_AXIS, tfm, CR_AXISHANDLE, tfmhandle, CR_END); } break; case CBRA: iobfgetc(file); brack++; break; case CKET: if(--brack >= 0) { iobfgetc(file); break; } /* If brackets matched, fall into... */ case EOF: case ';': case ')': goto done; case 't': iobfgetc(file); if(iobfexpectstr(file, /*t*/"ransform") == 0) goto tfmobject; if(iobfexpecttoken(file, /*t*/"list")) goto syntax; if(!GeomStreamIn(p, &subtlisthandle, &subtlist)) { OOGLSyntax(file, errfmt, PoolName(p), "failed reading 'tlist'"); return NULL; } break; case 'u': case 'g': if(iobfexpecttoken(file, "unit") && iobfexpecttoken(file, "geom")) goto syntax; /* * "GROUP" Compatibility mode -- create an Inst comprising our * Tlist and the given object. */ if(!GeomStreamIn(p, &geomhandle, &geom)) OOGLSyntax(file, errfmt, PoolName(p), "failed reading 'geom'"); else groupinst = GeomCCreate(NULL, InstMethods(), CR_HANDLE_GEOM, geomhandle, geom, CR_END); break; default: tp = VVAPPEND(v, float); if(got_preread) { got_preread = 0; *tp++ = preread; if(iobfgetnf(file, 15, tp, 0) == 15) break; } else { if(iobfgettransform(file, 1, tp, 0) > 0) break; } /* Else fall into... */ syntax: if(sawheader) OOGLSyntax(file, errfmt, PoolName(p), "unknown keyword"); vvfree(&v); return NULL; } } done: if(brack > 0) OOGLSyntax(file, errfmt, PoolName(p), "unclosed '{'"); /* } */ if(VVCOUNT(v) > 0) { vvtrim(&v); *VVAPPEND(vinst, Geom *) = GeomCCreate(NULL,TlistMethods(), CR_NOCOPY, CR_NELEM, VVCOUNT(v), CR_ELEM, VVEC(v,float), CR_END); } for(i = 0, list = g = NULL; i < VVCOUNT(vinst); i++) { g = VVEC(vinst, Geom *)[i]; GeomSet(g, CR_HANDLE_GEOM, subtlisthandle, subtlist, CR_END); if(VVCOUNT(vinst) > 1) list = ListAppend(list, g); } if(list) g = list; if(groupinst) { GeomSet(groupinst, CR_TLIST, g, CR_END); g = groupinst; } return g; } int TlistExport( Tlist *tl, Pool *p ) { FILE *outf; if(tl == NULL || tl->elements == NULL || (outf = PoolOutputFile(p)) == NULL) return 0; fprintf(outf, "TLIST\n"); if(fputtransform(outf, tl->nelements, (float *)tl->elements, 0) != tl->nelements) return 0; if(tl->tlist != NULL) { fprintf(outf, " tlist "); GeomStreamOut( p, tl->tlisthandle, tl->tlist ); } return 1; } geomview-1.9.5/src/lib/gprim/tlist/tltransform.c0000644000175000017500000000334212310110200016600 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "tlistP.h" Tlist * TlistPosition(Tlist *tlist, Transform T) { TmIdentity(T); if( tlist ) { GeomIter *it = GeomIterate( (Geom *)tlist, DEEP ); NextTransform( it, T ); DestroyIter( it ); } return tlist; } Tlist * TlistTransform(Tlist *tlist, Transform T, TransformN *TN) { int i; if (!tlist) return NULL; if (TN) { /* We would have to generate an NTlist here ... */ return NULL; } if (T && T != TM_IDENTITY) { for(i = tlist->nelements; --i >= 0; ) TmPreConcat( T, tlist->elements[i] ); } return tlist; } geomview-1.9.5/src/lib/gprim/tlist/tlist.h0000644000175000017500000000326012310110200015370 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef TLISTDEFS #define TLISTDEFS /* * Public definitions for a Tlist */ #include "tlist.h" #include "bboxP.h" #define TLISTMAGIC GeomMagic ('t', 1) typedef struct Tlist Tlist; extern GeomClass *TlistClass; /* Our class pointer */ extern GeomClass *TlistMethods( void ); extern Geom *TlistFLoad( FILE *, char *fname ); extern Tlist *TlistFSave( Tlist *, FILE *, char *fname ); extern Tlist *TlistTransform( Tlist *, Transform, TransformN * ); extern Tlist *TlistPosition( Tlist *, Transform ); extern Geom *TlistReplace( Tlist *tlist, Geom *newtlist ); extern int TlistGet( Tlist *tlist, int attr, void *attrp ); extern Geom *TlistImport( Pool * ); extern int TlistExport( Tlist *, Pool * ); #endif /*TLISTDEFS*/ geomview-1.9.5/src/lib/gprim/tlist/tlistP.h0000644000175000017500000000344412310110200015514 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef TLISTPDEFS #define TLISTPDEFS #include "tlist.h" #include "bboxP.h" #define TLISTMAGIC GeomMagic ('t', 1) /* * A Transformation List is a collection of 4x4 transformation matrices. * May take as argument another Tlist (or List of TList's); * if so, we act as the outer product: all our elements multiplied by * all those in the given tlist. */ struct Tlist { GEOMFIELDS; int nelements; int nallocated; Transform *elements; Geom *tlist; /* More transformations: take product */ Handle *tlisthandle; }; extern char *TlistName( void ); extern Tlist *TlistCreate( Tlist *existing, GeomClass *Class, va_list *args ); extern Tlist *TlistCopy( Tlist *t); extern void TlistDelete( Tlist * ); extern Geom *TlistImport( Pool *p ); extern int TlistExport( Tlist *tl, Pool *p ); #endif /*TLISTPDEFS*/ geomview-1.9.5/src/lib/gprim/tlist/Headers0000644000175000017500000000002112310110200015346 00000000000000tlist.h tlistP.h geomview-1.9.5/src/lib/gprim/vect/0000755000175000017500000000000012310165603013762 500000000000000geomview-1.9.5/src/lib/gprim/vect/Makefile.in0000644000175000017500000004731612310165554015767 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/vect DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libvect_la_LIBADD = am_libvect_la_OBJECTS = vectbound.lo vectclass.lo vectcreate.lo \ vectdraw.lo vectload.lo vectpick.lo vectsave.lo vectsphere.lo \ vecttransform.lo libvect_la_OBJECTS = $(am_libvect_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libvect_la_SOURCES) DIST_SOURCES = $(libvect_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libvect.la libvect_la_SOURCES = \ vectbound.c vectclass.c vectcreate.c vectdraw.c vectload.c vectpick.c vectsave.c vectsphere.c vecttransform.c \ vect.h vectP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/vect/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/vect/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libvect.la: $(libvect_la_OBJECTS) $(libvect_la_DEPENDENCIES) $(EXTRA_libvect_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libvect_la_OBJECTS) $(libvect_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vecttransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/gprim/vect/Makefile.am0000644000175000017500000000036412310110200015720 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libvect.la libvect_la_SOURCES = \ vectbound.c vectclass.c vectcreate.c vectdraw.c vectload.c vectpick.c vectsave.c vectsphere.c vecttransform.c \ vect.h vectP.h geomview-1.9.5/src/lib/gprim/vect/vectbound.c0000644000175000017500000000767312310110200016033 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: Return the bounding box of a collection of vectors. * */ #include "vectP.h" #include "bboxP.h" BBox *VectBound(Vect *v, Transform T, TransformN *TN) { int n; HPoint3 min, max, clean, tmp, *p; n = v->nvert; p = v->p; while(--n >= 0 && !finite(p->x + p->y + p->z + p->w)) p++; if(n <= 0) return NULL; /* No (finite) points! */ min = *p; /* First handle the case without transformations, this means that we return a 3d bbox for 3d vects, and a 4d bboy for 4d vects. */ if ((T == TM_IDENTITY || !T) && !TN) { if (!T && (v->geomflags & VERT_4D)) { max = min; while(--n >= 0) { Pt4MinMax(&min, &max, ++p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_4D, 1, CR_END); } else { HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { Pt3MinMax(&min, &max, ++p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *ptN; HPointN *minN; HPointN *maxN; BBox *result; ptN = HPtNCreate(5, NULL); if (v->geomflags & VERT_4D) { Pt4ToHPtN(&min, ptN); } else { HPt3ToHPtN(&min, NULL, ptN); } minN = HPtNTransform(TN, ptN, NULL); HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); while(--n >= 0) { if (v->geomflags & VERT_4D) { Pt4ToHPtN(++p, ptN); } else { HPt3ToHPtN(++p, NULL, ptN); } HPtNTransform(TN, ptN, ptN); HPtNMinMax(minN, maxN, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(ptN); HPtNDelete(minN); HPtNDelete(maxN); return result; } /* A 3d bbox is requested, with transformations */ if (T) { /* ordinary 3d transform */ if (false && (v->geomflags & VERT_4D)) { /* We operate on the 3x3 x,y,z space */ min.w = 1.0; HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { tmp = *(++p); tmp.w = 1.0; HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } } else { /* ordinary 3d object */ HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { tmp = *(++p); HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/vect/vectclass.c0000644000175000017500000000423312310110200016016 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "vectP.h" static GeomClass *aVectMethods = NULL; int VectPresent = 1; static char vectName[] = "vect"; char * VectName() { return vectName; } GeomClass * VectMethods() { if (!aVectMethods) { aVectMethods = GeomClassCreate(vectName); aVectMethods->name = VectName; aVectMethods->methods = (GeomMethodsFunc *) VectMethods; aVectMethods->create = (GeomCreateFunc *) VectCreate; aVectMethods->fload = (GeomFLoadFunc *) VectFLoad; aVectMethods->fsave = (GeomFSaveFunc *) VectFSave; aVectMethods->bound = (GeomBoundFunc *) VectBound; aVectMethods->boundsphere = (GeomBoundSphereFunc *) VectBoundSphere; aVectMethods->Delete = (GeomDeleteFunc *) VectDelete; aVectMethods->draw = (GeomDrawFunc *) VectDraw; aVectMethods->copy = (GeomCopyFunc *) VectCopy; aVectMethods->pick = (GeomPickFunc *) VectPick; aVectMethods->transform = (GeomTransformFunc *) VectTransform; aVectMethods->transformto = (GeomTransformToFunc *) VectTransformTo; } return aVectMethods; } geomview-1.9.5/src/lib/gprim/vect/vectcreate.c0000644000175000017500000001441512310110200016157 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "vectP.h" /* * Vect object creation, editing, copying, deletion. */ Vect * VectCopy(Vect *ov) { Vect *v; if (ov == NULL) return (NULL); v = OOGLNewE(Vect, "new Vect"); *v = *ov; v->p = OOGLNewNE(HPoint3, ov->nvert, "Vect vertices"); v->c = ov->ncolor ? OOGLNewNE(ColorA, ov->ncolor, "Vect colors") : NULL; v->vnvert = OOGLNewNE(short, ov->nvec, "Vect nverts"); v->vncolor = OOGLNewNE(short, ov->nvec, "Vect nverts"); memcpy(v->p, ov->p, ov->nvert * sizeof(HPoint3)); memcpy(v->c, ov->c, ov->ncolor * sizeof(ColorA)); memcpy(v->vnvert, ov->vnvert, ov->nvec * sizeof(short)); memcpy(v->vncolor, ov->vncolor, ov->nvec * sizeof(short)); return(v); } void VectDelete( Vect *v ) { if (v) { if(v->p != NULL) OOGLFree(v->p); if(v->c != NULL) OOGLFree(v->c); if(v->vnvert != NULL) OOGLFree(v->vnvert); } } Vect * VectCreate ( Vect *exist, GeomClass *classp, va_list *a_list ) { Vect *vect; int attr, copy = 1; int police = 1; /* by default, check the input to see it's good */ short *vectcounts; /* vectcounts[0..nvec-1] */ short *colorcounts; /* colorcounts[0..nvec-1] */ Point3 *v3; HPoint3 *v4; /* vertices[0..nvert-1] */ ColorA *colors; /* colors[0..ncolor-1] */ if (exist == NULL) { vect = OOGLNewE(Vect, "new vect"); GGeomInit (vect, classp, VECTMAGIC, NULL); vect->nvec = 0; vect->nvert = 0; vect->ncolor = 0; vect->p = NULL; vect->c = NULL; vect->vnvert = NULL; vect->vncolor = NULL; } else { /* Should check that exist is a vect */ vect = exist; } while ((attr = va_arg (*a_list, int))) switch (attr) { case CR_POLICE: police = 1; break; case CR_NOPOLICE: police = 0; break; case CR_FLAG: vect->geomflags = va_arg (*a_list, int); break; case CR_NVECT: vect->nvec = va_arg (*a_list, int); break; case CR_NVERT: vect->nvert = va_arg (*a_list, int); break; case CR_NCOLR: vect->ncolor = va_arg (*a_list, int); break; case CR_VECTC: vectcounts = va_arg (*a_list, short *); if(vect->vnvert) OOGLFree(vect->vnvert); if (vectcounts == NULL) { vect->vnvert = NULL; vect->nvert = 0; } else if (copy) { vect->vnvert = OOGLNewNE(short, vect->nvec, "vect vert counts"); memcpy(vect->vnvert, vectcounts, vect->nvec*sizeof(*vect->vnvert)); } else { vect->vnvert = vectcounts; } break; case CR_COLRC: colorcounts = va_arg (*a_list, short *); if(vect->vncolor) OOGLFree(vect->vncolor); if (colorcounts == NULL) { vect->vncolor = NULL; vect->nvert = 0; } else if (copy) { vect->vncolor = OOGLNewNE(short, vect->nvec, "vect vert counts"); memcpy(vect->vncolor, colorcounts, vect->nvec*sizeof(*vect->vncolor)); } else { vect->vncolor = colorcounts; } break; case CR_POINT: v3 = va_arg (*a_list, Point3 *); if(vect->p) OOGLFree(vect->p); if (v3 == NULL) { vect->p = NULL; vect->nvert = 0; } else { vect->p = OOGLNewNE(HPoint3, vect->nvert, "vect points"); Pt3ToHPt3(v3, vect->p, vect->nvert); if(!copy) OOGLFree(v3); } break; case CR_POINT4: v4 = va_arg (*a_list, HPoint3 *); if(vect->p) OOGLFree(vect->p); if (v4 == NULL) { vect->p = NULL; vect->nvert = 0; } else if (copy) { vect->p = OOGLNewNE(HPoint3, vect->nvert, "vect points"); memcpy(vect->p, v4, vect->nvert*sizeof(HPoint3)); } else { vect->p = v4; } break; case CR_COLOR: colors = va_arg (*a_list, ColorA *); if(vect->c) OOGLFree(vect->c); if (colors == NULL) { vect->c = NULL; vect->ncolor = 0; } else if (copy) { vect->c = OOGLNewNE(ColorA, vect->ncolor, "vect colors"); memcpy(vect->c, colors, vect->ncolor*sizeof(ColorA)); } else { vect->c = colors; } break; default: if (GeomDecorate (vect, ©, attr, a_list)) { OOGLError (0, "VectCreate: Undefined option: %d\n", attr); OOGLFree (vect); return NULL; } } if (police) { if(0 > vect->ncolor || 0 > vect->nvec ) OOGLError(0, "VectCreate: ncol=%d nvert=%d; need 0ncolor, vect->nvert); if ( 0 > vect->nvec || vect->nvec > vect->nvert || vect->nvert > 99999999) { OOGLError (0, "VectCreate: nvec=%d, nvert=%d; need 0<=nvec<=nvert<=1e8", vect->nvec, vect->nvert); return(NULL); } if (!VectSane(vect)) { OOGLError (0, "VectCreate: Bogus data supplied"); GeomDelete((Geom *)vect); return NULL; } } /* end police work */ if (exist != NULL) return exist; return vect; } int VectSane(vect) Vect *vect; { int i; int vleft, cleft; short *p, *c; if(!vSane(vect)) return(0); vleft = vect->nvert; cleft = vect->ncolor; for(i = vect->nvec, p = vect->vnvert, c = vect->vncolor; --i >= 0; p++, c++) { if(*p == 0 || (vleft -= vcount(*p)) < 0) return(0); if(*c < 0 || (cleft -= *c) < 0) return(0); } if(vleft || cleft) return(0); return(1); } geomview-1.9.5/src/lib/gprim/vect/vectdraw.c0000644000175000017500000001254212310110200015650 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: * Draw a Vect (collection of vectors). * */ #include "mgP.h" #include "vectP.h" #include "hpointn.h" #include "transformn.h" #include "cmodel.h" #include #ifndef alloca #include #endif static void draw_projected_vect(mgNDctx *NDctx, Vect *v, int flags, int penultimate, int hascolor) { HPointN *h = HPtNCreate(5, NULL); HPoint3 *p, *op, *np, *newp; ColorA *lastcolor = NULL, *c, *newc; int i, nc = 0, colored = 0; mgNDmapfunc mapHPtN = NDctx->mapHPtN; #if !NO_ALLOCA newp = (HPoint3 *)alloca(v->nvert*sizeof(HPoint3)); newc = (ColorA *)alloca(v->nvert*sizeof(ColorA)); #else newp = OOGLNewNE(HPoint3, v->nvert, "projected VECT points"); newc = OOGLNewNE(ColorA, v->nvert, "ND VECT colors"); #endif if (v->geomflags & VERT_4D) { for(i = 0, op = v->p, np = newp; i < v->nvert; i++, op++, np++) { Pt4ToHPtN(op, h); colored = mapHPtN(NDctx, h, np, &newc[i]); } } else { for(i = 0, op = v->p, np = newp; i < v->nvert; i++, op++, np++) { HPt3ToHPtN(op, NULL, h); colored = mapHPtN(NDctx, h, np, &newc[i]); } } if (!hascolor) colored = 0; for(i = 0, p = newp, c = colored ? newc : v->c; i < v->nvec; i++) { int nv; nv = vcount(v->vnvert[i]); if(colored) nc = nv; else if (hascolor) nc = v->vncolor[i]; flags |= vwrapped(v->vnvert[i]); if(nc==0) if(lastcolor) mgpolyline(nv,p,1,lastcolor, flags); else mgpolyline(nv,p,nc,c,flags); else mgpolyline(nv,p,nc, lastcolor=c, flags); p += nv; if (hascolor) c += nc; flags = (i < penultimate) ? 6 : 2; /* 2: not first batch member */ } HPtNDelete(h); #if !!NO_ALLOCA OOGLFree(newp); OOGLFree(newc); #endif } Vect * VectDraw(v) Vect *v; { HPoint3 *p; ColorA *c; ColorA edgecolor; int n, hascolor, nc; int flags, penultimate; ColorA *lastcolor=NULL; const Appearance *ap = &_mgc->astk->ap; mgNDctx *NDctx = NULL; /* Don't draw if vect-drawing is off. */ if (v == NULL || (ap->flag & APF_VECTDRAW) == 0) return NULL; /* draw in conformal model if necessary */ if (_mgc->space & TM_CONFORMAL_BALL) { cmodel_clear(_mgc->space); cm_read_vect(v); cmodel_draw(0); return v; } p = v->p; c = v->c; hascolor = (v->ncolor > 0) && !(ap->mat && (ap->mat->override & MTF_EDGECOLOR)); if (!hascolor && ap->mat) { edgecolor.r = ap->mat->edgecolor.r; edgecolor.g = ap->mat->edgecolor.g; edgecolor.b = ap->mat->edgecolor.b; edgecolor.a = 1; c = &edgecolor; nc = 1; } flags = v->nvec > 1 ? 4 : 0; /* 4: not last mbr of batch of lines */ penultimate = v->nvec - 2; mgctxget(MG_NDCTX, &NDctx); if(NDctx) { draw_projected_vect(NDctx, v, flags, penultimate, hascolor); return v; } if(_mgc->astk->ap.flag & APF_SHADELINES && _mgc->astk->flags & MGASTK_SHADER) { ColorA *cs = (ColorA *)alloca(v->nvert * sizeof(ColorA)); HPoint3 *tp = p; ColorA *tc = c - hascolor; ColorA *tcs = cs; if(!(_mgc->has & HAS_CPOS)) mg_findcam(); for(n = 0; n < v->nvec; n++) { int i, nv = vcount(v->vnvert[n]); nc = hascolor ? v->vncolor[n] : 0; if(nc > 0) tc++; for(i = 0; i < nv; i++, tp++, tcs++) { (*_mgc->astk->shader)(1, tp, &_mgc->camZ, tc, tcs); if(nc > 1) { tc++; nc--; } } } tcs = cs; nc = v->nvert; hascolor = 0; for(n = 0; n < v->nvec; n++) { int nv = vcount(v->vnvert[n]); flags |= vwrapped(v->vnvert[n]); mgpolyline(nv, p, nv, tcs, flags); /* One color per vert */ tcs += nv; p += nv; flags = (n < penultimate) ? 6 : 2; } return v; } for(n = 0; n < v->nvec; n++) { int nv; nv = vcount(v->vnvert[n]); if (hascolor) nc = v->vncolor[n]; flags |= vwrapped(v->vnvert[n]); if(nc == 0) if(lastcolor) mgpolyline(nv, p, 1, lastcolor, flags); else mgpolyline(nv, p, nc, c, flags); else mgpolyline(nv,p,nc,lastcolor=c, flags); p += nv; if (hascolor) c += nc; flags = (n < penultimate) ? 6 : 2; /* 2: not first batch member */ } return v; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/vect/vectload.c0000644000175000017500000001010312310110200015621 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: Create and load a vect object from a file. * */ #include "vectP.h" Vect * VectFLoad(IOBFILE *file, char *fname) { Vect *v; int binary = 0, dimn = 3; char *token; int i; static char badvert[] = "Reading VECT from \"%s\": bad %dth vertex (of %d)"; if (file == NULL) return NULL; token = GeomToken(file); if(*token == '4') { dimn = 4; token++; } if(strcmp(token, "VECT")) return NULL; if(iobfnextc(file, 1) == 'B') { if(iobfexpectstr(file, "BINARY")) return NULL; binary = 1; if(iobfnextc(file, 1) == '\n') (void) iobfgetc(file); /* Toss \n */ } v = OOGLNewE(Vect, "VectFLoad: Vect"); GGeomInit(v, VectMethods(), VECTMAGIC, NULL); v->geomflags = (dimn == 4) ? VERT_4D : 0; v->geomflags = 0; v->vnvert = NULL; v->vncolor = NULL; v->p = NULL; v->c = NULL; if(iobfgetni(file, 1, &v->nvec, binary) <= 0 || iobfgetni(file, 1, &v->nvert, binary) <= 0 || iobfgetni(file, 1, &v->ncolor, binary) <= 0) { OOGLSyntax(file, "Reading VECT from \"%s\": can't read header counts", fname); goto bogus; } if(!vSane(v)) { OOGLSyntax(file, "Reading VECT from \"%s\": inconsistent VECT header counts %d %d %d", fname, v->nvec, v->nvert, v->ncolor); goto bogus; } v->vnvert = OOGLNewNE(short, 2*v->nvec, "VECT nvec counts"); v->p = OOGLNewNE(HPoint3, v->nvert, "VECT vertices"); v->c = OOGLNewNE(ColorA, (v->ncolor>0) ? v->ncolor : 1, "VECT colors"); v->vncolor = v->vnvert + v->nvec; if((i = iobfgetns(file, v->nvec, v->vnvert, binary)) < v->nvec) { OOGLSyntax(file, "Reading VECT from \"%s\": bad vertex count in %d'th polyline (of %d)", fname, i, v->nvec); goto bogus; } if((i = iobfgetns(file, v->nvec, v->vncolor, binary)) < v->nvec) { OOGLSyntax(file, "Reading VECT from \"%s\": bad color count in %d'th polyline (of %d)", fname, i, v->nvec); goto bogus; } /* if the points are 3D points, we have to convert them to the native 4D data structure */ if (dimn == 3) { HPoint3 *p; for(i = v->nvert, p = v->p; --i >= 0; p++) { if (iobfgetnf(file, 3, (float *)p, binary) < 3) { OOGLSyntax(file, badvert, fname, v->nvert - i, v->nvert); goto bogus; } p->w = 1; } } else { i = iobfgetnf(file, 4*v->nvert, (float *)v->p, binary); if(i < 4*v->nvert) { OOGLSyntax(file, badvert, fname, i/4, v->nvert); goto bogus; } } if (v->ncolor > 0 && (i = iobfgetnf(file, 4*v->ncolor, (float *)v->c, binary)) < 4*v->ncolor) { OOGLSyntax(file, "Reading VECT from \"%s\": bad %dth color (of %d)", fname, i/4, v->ncolor); goto bogus; } if(!VectSane(v)) { OOGLError(0, "Reading VECT from \"%s\": VECT polyline/color counts inconsistent with header", fname); goto bogus; } return v; bogus: GeomDelete((Geom *)v); return NULL; } geomview-1.9.5/src/lib/gprim/vect/vectpick.c0000644000175000017500000000720112310110200015635 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include /* for abs() */ #include "vectP.h" #include "pickP.h" #include "appearance.h" Vect *VectPick(Vect *v, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { Point3 plist[2]; int i, j, k, ok[2]; int found, v4d; unsigned int apflag = 0; /* Make sure that the edges do not count as visible - otherwise * they could really mess things up */ if (ap != NULL) { apflag = ap->flag; ap->flag &= ~APF_EDGEDRAW; } found = 0; v4d = (v->geomflags & VERT_4D) != 0; for (i = k = 0; i < v->nvec; i++) { int nv = abs(v->vnvert[i]); if (TN) ok[0] = (0 < HPt3NTransPt3(TN, axes, &v->p[k], v4d, &plist[0])); else ok[0] = (0 < HPt3TransPt3(T, &v->p[k], &plist[0])); if(nv == 1) { if(ok[0] && PickFace(1, &plist[0], p, ap)) { found = 1; p->vi = k; } k++; continue; } for (j = 0; j < nv - 1;) { if (TN) ok[1] = (0 < HPt3NTransPt3(TN, axes, &v->p[k + (++j)], v4d, &plist[1])); else ok[1] = (0 < HPt3TransPt3(T, &v->p[k + (++j)], &plist[1])); if ((ok[0]||ok[1]) && PickFace(2, plist, p, ap)) { found = 1; p->vi = p->vi ? k + j : k + j - 1; p->ei[0] = k + j - 1; p->ei[1] = k + j; } ok[0] = ok[1]; plist[0] = plist[1]; } if (v->vnvert[i] < 0) { if (TN) ok[1] = (0 < HPt3NTransPt3(TN, axes, &v->p[k], v4d, &plist[1])); else ok[1] = (0 < HPt3TransPt3(T, &v->p[k], &plist[1])); if ((ok[0]||ok[1]) && PickFace(2, plist, p, ap)) { found = 1; p->vi = p->vi ? k : k + j; p->ei[0] = k + j; p->ei[1] = k; } } k += nv; } if (ap != NULL) ap->flag = apflag; if (!found) return NULL; if (p->found & PW_VERT) { if (TN) HPt3NTransHPt3(TN, axes, &v->p[p->vi], v4d, &p->v); else HPt3Transform(T, &v->p[p->vi], &p->v); } else p->vi = -1; if (p->found & PW_EDGE) { if (TN) { HPt3NTransHPt3(TN, axes, &v->p[p->ei[0]], v4d, &p->e[0]); HPt3NTransHPt3(TN, axes, &v->p[p->ei[1]], v4d, &p->e[1]); } else { HPt3Transform(T, &v->p[p->ei[0]], &p->e[0]); HPt3Transform(T, &v->p[p->ei[1]], &p->e[1]); } } else p->ei[0] = p->ei[1] = -1; /* It really doesn't make sense to claim that we found a face hit...*/ p->found &= ~PW_FACE; p->fi = -1; if (TN) { p->TprimN = TmNCopy(TN, p->TprimN); memcpy(p->axes, axes, sizeof(p->axes)); } else TmCopy(T, p->Tprim); return v; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/gprim/vect/vectsave.c0000644000175000017500000000423212310110200015646 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: Save a vect object to a file. * */ #include "vectP.h" Vect * VectFSave(v, f) Vect *v; FILE *f; { int i; HPoint3 *p; ColorA *c; /* This one just saves in ASCII format */ if(v == NULL || f == NULL) return NULL; if (v->geomflags & VERT_4D) fprintf(f, "4"); fprintf(f, "VECT\n%d %d %d\n", v->nvec, v->nvert, v->ncolor); for(i = 0; i < v->nvec; i++) fprintf(f, "%d\n", v->vnvert[i]); fputc('\n', f); for(i = 0; i < v->nvec; i++) fprintf(f, "%d\n", v->vncolor[i]); fputc('\n', f); if (v->geomflags & VERT_4D) { for(i = v->nvert, p = v->p; --i >= 0; p++) fprintf(f, "%g %g %g %g\n", p->x, p->y, p->z, p->w); } else { for(i = v->nvert, p = v->p; --i >= 0; p++) fprintf(f, "%g %g %g\n", p->x, p->y, p->z); } fputc('\n', f); for(i = v->ncolor, c = v->c; --i >= 0; c++) fprintf(f, "%.3g %.3g %.3g %.3g\n", c->r, c->g, c->b, c->a); return ferror(f) ? NULL : v; } geomview-1.9.5/src/lib/gprim/vect/vectsphere.c0000644000175000017500000000356012310110200016201 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "create.h" #include "vectP.h" #include "sphere.h" Geom *VectBoundSphere(Vect *vect, Transform T, TransformN *TN, int *axes, int space) { Geom *sphere; if (TN) { /* Create a dummy sphere, the center will be corrected later */ sphere = GeomCreate("sphere", CR_SPACE, space, CR_END); SphereEncompassPoints((Sphere *)sphere, (float *)vect->p, (vect->geomflags & VERT_4D) ? 4 : 3, 4, vect->nvert, T, TN, axes); } else { if(vect->geomflags & VERT_4D) return GeomBoundSphereFromBBox((Geom *)vect, T, TN, axes, space); sphere = GeomCreate("sphere", CR_ENCOMPASS_POINTS, vect->p, CR_NENCOMPASS_POINTS, vect->nvert, CR_AXIS, T ? T : TM_IDENTITY, CR_SPACE, space, CR_END); } return sphere; } geomview-1.9.5/src/lib/gprim/vect/vecttransform.c0000644000175000017500000000267012310110200016727 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include "hpoint3.h" #include "vectP.h" Vect * VectTransform( v, T ) Vect *v; Transform T; { HPt3TransformN(T, v->p, v->p, v->nvert); return(v); } Vect * VectTransformTo( v, T ) Vect *v; Transform T; { return(VectTransform(v, T)); } geomview-1.9.5/src/lib/gprim/vect/vect.h0000644000175000017500000000344112310110200014775 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef VECTDEF #define VECTDEF #ifndef NULL #define NULL 0 #endif #include /* abs() */ #include "bbox.h" #define VECT_MAGIC 0x4ac95203 /* For binary external format */ #define VECTMAGIC GeomMagic ('v', 1) /* For checking whether a vect. */ typedef struct Vect Vect; #define vcount(code) (abs(code)) #define vwrapped(code) ((code) < 0) #define vSane(v) (0 <= (v)->ncolor && (v)->ncolor <= (v)->nvert && \ (v)->nvec <= (v)->nvert && (v)->nvert < 9999999) GeomClass *VectMethods(); char *VectName(); Vect *VectLoad(); Vect *VectFLoad(); Vect *VectSave(); Vect *VectFSave(); BBox *VectBound(); Geom *VectBoundSphere(); Vect *VectDraw(); int VectShare(); int VectPrivate(); void RendLine(); Vect *VectTransform( Vect *, Transform ); Vect *VectTransformTo(Vect *, Transform ); int VectSane(Vect *); #endif /*VECTDEF*/ geomview-1.9.5/src/lib/gprim/vect/vectP.h0000644000175000017500000000642712310110200015124 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef VECTPDEF #define VECTPDEF #include "geomclass.h" #include "vect.h" /* * A Vect is a collection of polylines. * It's represented by: * p, an array of vertices (for all the polylines in sequence), * c, an array of r/g/b/alpha colors (not necessarily one per vertex), * vnvert, an array of sizes (vertex counts) of each polyline, * vncolor, an array of numbers of colors (c[] entry counts) of each polyline, * nvec, giving the number of polylines (entries in vnvert and vncolor), * nvert, giving the total number of vertices (entries in p), * ncolor, the total number of colors (entries in c). * * Here's the association: * Let vN = sum from i = 0 to N-1 of vnvert[i], * and cN = sum from i = 0 to N-1 of vncolor[i], * then polyline N comprises the vnvert[N] vertices * from p[vN] through p[vN + vnvert[N] - 1] * and is drawn using the vncolor[N] different colors * from c[cN] through c[cN + vncolor[N] - 1]. * * This encoding implies colors and vertices may not be reused from line to * line (but the previous color persists for lines with 0 colors, see below). * * Closed polylines: * A polyline is drawn closed (the last element connected to the first) * if its vnvert[N] is negative. It's then considered to have * abs(vnvert[N]) vertices in the p[] array. * * A polyline with 1 vertex is a point. 0 vertices are illegal. * * Coloring: * It's intended that polylines will be specified with either * 0, 1, or abs(vnvert[N]) colors. The effects in each case are: * 0: the polyline is drawn with the same color as the previous polyline. * 1: the polyline is drawn with the specified single color. * abs(vnvert[N]): each vertex is colored with the specified color. * intermediate points on the line are interpolated. */ struct Vect { GEOMFIELDS; int nvec, nvert, ncolor; short *vnvert; /* vnvert[nvec] (# p[]'s per vec) */ short *vncolor; /* vncolor[nvec] (# c[]'s per vec) */ /* NOTE: vnvert and vncolor lie in a *single* malloc'ed area */ /* To free, OOGLFree(vnvert). */ HPoint3 *p; /* p[nvert] */ ColorA *c; /* c[ncolor] */ }; extern Vect *VectCreate( Vect *, GeomClass *, va_list *a_list); extern void VectDelete( Vect * ); extern Vect *VectCopy( Vect * ); extern Vect *VectPick( Vect *, Pick *, Appearance *, Transform, TransformN *, int *axes ); #endif /*VECTPDEF*/ geomview-1.9.5/src/lib/gprim/vect/Headers0000644000175000017500000000001712310110200015155 00000000000000vect.h vectP.h geomview-1.9.5/src/lib/fexpr/0000755000175000017500000000000012310165603013027 500000000000000geomview-1.9.5/src/lib/fexpr/Makefile.in0000644000175000017500000004736012310165553015032 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/fexpr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libfexpr_la_LIBADD = am_libfexpr_la_OBJECTS = binfuncs.lo complex.lo evaluate.lo exprs.lo \ lex.yy.lo monfuncs.lo parse.tab.lo real.lo vars.lo libfexpr_la_OBJECTS = $(am_libfexpr_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libfexpr_la_SOURCES) DIST_SOURCES = $(libfexpr_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers parse.tab.c-saved noinst_LTLIBRARIES = libfexpr.la libfexpr_la_SOURCES = \ binfuncs.c complex.c evaluate.c exprs.c lex.yy.c monfuncs.c parse.tab.c real.c vars.c \ fexpr.h parse.tab.h fexprnew.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/fexpr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/fexpr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libfexpr.la: $(libfexpr_la_OBJECTS) $(libfexpr_la_DEPENDENCIES) $(EXTRA_libfexpr_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libfexpr_la_OBJECTS) $(libfexpr_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binfuncs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evaluate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exprs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lex.yy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/monfuncs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse.tab.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/real.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vars.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am parse.tab.c: parse.tab.c-saved cp $(srcdir)/parse.tab.c-saved parse.tab.c # 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: geomview-1.9.5/src/lib/fexpr/Makefile.am0000644000175000017500000000051412310110177014777 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers parse.tab.c-saved noinst_LTLIBRARIES = libfexpr.la libfexpr_la_SOURCES = \ binfuncs.c complex.c evaluate.c exprs.c lex.yy.c monfuncs.c parse.tab.c real.c vars.c \ fexpr.h parse.tab.h fexprnew.h parse.tab.c: parse.tab.c-saved cp $(srcdir)/parse.tab.c-saved parse.tab.c geomview-1.9.5/src/lib/fexpr/binfuncs.c0000644000175000017500000000237212310110177014722 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "fexpr.h" #include #include #include struct expr_binfunc expr_binfuncs[]= { DEFAULT_EXPR_BINFUNCS, {NULL, NULL, NULL} }; geomview-1.9.5/src/lib/fexpr/complex.c0000644000175000017500000002133412310110200014544 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "fexpr.h" #ifndef M_E #define M_E 2.71828182845904 #endif void fcomplex_re(const fcomplex *s,fcomplex *op) { op->real = s->real; op->imag = 0; } void fcomplex_im(const fcomplex *s,fcomplex *op) { op->real = 0; op->imag = s->imag; } void fcomplex_abs(const fcomplex *s,fcomplex *op) { op->imag = 0; op->real = sqrt(s->real*s->real+s->imag*s->imag); } void fcomplex_log(const fcomplex *s,fcomplex *op) { /* e^(a + bi)= e^a(cos b+i sin b). b is argument of s, e^a is abs of s. */ op->real = log(s->real*s->real+s->imag*s->imag)/2; /* log(sqrt(..)) */ op->imag = atan2(s->imag,s->real); } void fcomplex_log10(const fcomplex *s,fcomplex *op) { /* log10(z) = log(z)/log(10) */ fcomplex_log(s,op); #ifndef M_LN10 #define M_LN10 log(10); #endif op->real /= M_LN10; op->imag /= M_LN10; } void fcomplex_sqrt(const fcomplex *s,fcomplex *op) { fcomplex tmp; tmp.real = 0.5; tmp.imag = 0; fcomplex_pow(s,&tmp,op); } void fcomplex_exp(const fcomplex *s,fcomplex *op) { fcomplex tmp; tmp.real = M_E; tmp.imag = 0; fcomplex_pow(&tmp,s,op); } void fcomplex_cos(const fcomplex *s,fcomplex *op) { /* cos(a+bi) = cos(a)cos(bi) - sin(a)sin(bi) = cos(a)cosh(b) - i sin(a)sinh(b) */ op->real = cos(s->real) * cosh(s->imag); op->imag = - sin(s->real) * sinh(s->imag); } void fcomplex_arccos(const fcomplex *s,fcomplex *op) { /* if w = cos z, z = -i*ln(w+sqrt(w*w-1)) */ fcomplex tmp1,tmp2; /* tmp1 = w*w-1 */ tmp1.real = s->real*s->real-s->imag*s->imag - 1; tmp1.imag = s->real*s->imag; /* tmp2 = sqrt(tmp1); */ fcomplex_sqrt(&tmp1,&tmp2); /* tmp2 += w */ tmp2.real += s->real; tmp2.imag += s->imag; /* tmp1 = ln(tmp2); */ fcomplex_log(&tmp2,&tmp1); /* op = -i*tmp1 */ op->imag = -tmp1.real; op->real = tmp1.imag; } void fcomplex_sin(const fcomplex *s,fcomplex *op) { /* sin(a+bi) = sin(a)cos(bi) + sin(bi)cos(a) = sin(a)cosh(b) + isinh(b)cos(a) */ op->real = sin(s->real)*cosh(s->imag); op->imag = cos(s->real)*sinh(s->imag); } void fcomplex_arcsin(const fcomplex *s,fcomplex *op) { /* if w = sin z, z = -i*ln(i*w+sqrt(i*(w*w-1))) */ fcomplex tmp1, tmp2; /* tmp1 = i*(w*w-1) */ tmp1.real = -s->real*s->imag; tmp1.imag = s->real*s->real-s->imag*s->imag-1; /* tmp2 = sqrt(tmp1); */ fcomplex_sqrt(&tmp1,&tmp2); /* tmp2 += i*w; */ tmp2.real -= s->imag; tmp2.imag += s->real; /* tmp1 = ln(tmp2); */ fcomplex_log(&tmp2,&tmp1); /* op = -i*tmp1 */ op->imag = -tmp1.real; op->real = tmp1.imag; } void fcomplex_tan(const fcomplex *s,fcomplex *op) { /* tan a+bi= Sin[2a]/(Cos[2a]+Cosh[2b]) + i*Sinh[2b]/(Cos[2a]+Cosh[2b]) */ /* or so says mathematica(probably a registered trademark of wolfram) */ op->real = sin(s->real*2)/(cos(s->real*2)+cosh(s->imag*2)); op->imag = sinh(s->imag*2)/(cos(s->real*2)+cosh(s->imag*2)); } void fcomplex_arctan(const fcomplex *s,fcomplex *op) { /* if w = tan z, z = i ln(1-iw)/2 */ fcomplex tmp1, tmp2; /* tmp1 = 1-iw */ tmp1.real = 1+s->imag; tmp1.imag = -s->real; /* tmp2 = ln(tmp1); */ fcomplex_log(&tmp1, &tmp2); /* op = i*tmp2/2 */ op->real = -tmp2.imag/2; op->imag = tmp2.real/2; } void fcomplex_cot(const fcomplex *s,fcomplex *op) { /* cot = 1 / tan */ fcomplex tmp1; /* tmp1 = tan s */ fcomplex_tan(s,&tmp1); /* op = 1/tmp1 */ op->real = tmp1.real/(tmp1.real*tmp1.real+tmp1.imag*tmp1.imag); op->imag = -tmp1.imag/(tmp1.real*tmp1.real+tmp1.imag*tmp1.imag); } void fcomplex_sec(const fcomplex *s,fcomplex *op) { fcomplex tmp1; fcomplex_cos(s,&tmp1); op->real = tmp1.real/(tmp1.real*tmp1.real+tmp1.imag*tmp1.imag); op->imag = -tmp1.imag/(tmp1.real*tmp1.real+tmp1.imag*tmp1.imag); } void fcomplex_csc(const fcomplex *s,fcomplex *op) { fcomplex tmp1; fcomplex_sin(s,&tmp1); op->real = tmp1.real/(tmp1.real*tmp1.real+tmp1.imag*tmp1.imag); op->imag = -tmp1.imag/(tmp1.real*tmp1.real+tmp1.imag*tmp1.imag); } void fcomplex_cosh(const fcomplex *s,fcomplex *op) { /* cosh[a + b i] = cos[b - ai] */ fcomplex tmp1; tmp1.real = s->imag; tmp1.imag = -s->real; fcomplex_cos(&tmp1,op); } void fcomplex_sinh(const fcomplex *s,fcomplex *op) { /* sinh [a + b i] = i * sin[ b - a i] */ fcomplex tmp1,tmp2; tmp1.real = s->imag; tmp1.imag = -s->real; fcomplex_sin(&tmp1, &tmp2); op->real = -tmp2.imag; op->imag = tmp2.real; } void fcomplex_tanh(const fcomplex *s,fcomplex *op) { /* tanh[a+bi] = i*tan[b - a i] */ fcomplex tmp1,tmp2; tmp1.real = s->imag; tmp1.imag = -s->real; fcomplex_tan(&tmp1,&tmp2); op->real = -tmp2.imag; op->imag = tmp2.real; } void fcomplex_arccosh(const fcomplex *s,fcomplex *op) { /* z=cos[iw]=cosh[w] arccosh[z] = w = arccos[z]/i arccosh[z] = arccos[z]/i */ fcomplex tmp1; fcomplex_arccos(s, &tmp1); op->real = tmp1.imag; op->imag = -tmp1.real; } void fcomplex_arcsinh(const fcomplex *s,fcomplex *op) { (void)op; /* zi=sin[iw]=isinh[w] arcsinh[z] = w = arcsin[zi]/i arcsinh[z] = arcsin[zi]/i */ fcomplex tmp1,tmp2; /* tmp1 = i*z */ tmp1.real = -s->imag; tmp1.imag = s->real; fcomplex_arcsin(&tmp1,&tmp2); /* op = tmp2/i */ tmp2.real = tmp1.imag; tmp2.imag = -tmp1.real; } void fcomplex_arctanh(const fcomplex *s,fcomplex *op) { /* works same as arcsinh.. */ fcomplex tmp1,tmp2; (void)op; /* tmp1 = i*z */ tmp1.real = -s->imag; tmp1.imag = s->real; fcomplex_arctan(&tmp1,&tmp2); /* op = tmp2/i */ tmp2.real = tmp1.imag; tmp2.imag = -tmp1.real; } void fcomplex_floor(const fcomplex *s,fcomplex *op) { /* just floor the components, i guess... */ op->real = floor(s->real); op->imag = floor(s->imag); } void fcomplex_round(const fcomplex *s,fcomplex *op) { op->real = rint(s->real); op->imag = rint(s->imag); } void fcomplex_ceiling(const fcomplex *s,fcomplex *op) { op->real = ceil(s->real); op->imag = ceil(s->imag); } void fcomplex_pow(const fcomplex *base, const fcomplex *exponent, fcomplex*op) { double Abs, Arg; double c=exponent->real,d=exponent->imag; Abs = base->imag*base->imag + base->real*base->real; Arg = atan2(base->imag,base->real); if (Abs==0) { /* if we don't do this, then the log(Abs) below returns * NaN, and throws everything off. */ op->real = op->imag = 0; } else { op->real = pow(Abs,c/2.0)*cos(c*Arg + d*log(Abs)/2.0)*exp(-d*Arg); op->imag = pow(Abs,c/2.0)*sin(c*Arg + d*log(Abs)/2.0)*exp(-d*Arg); } } /* cos(a+b) = cos(a)*cos(b) - sin(a)*sin(b) cos(a+bi) = cos(a)*cosh(b) - sin(a)*i*sinh(b) sin(a+b) = cos(a)*sin(b) + cos(b)*sin(a) sin(a+bi) = cos(a)*i*sinh(b) + cosh(b)*sin(a) (a+bi)^(c+di) = (a+bi)^c*(a+bi)^(di) is (from mathematica): Power(Abs,c)* Cos(c*Arg + d*Log(Abs))/ Power(E,d*Arg) + Complex(0,1)*Power(Abs,c)* Sin(c*Arg + d*Log(Abs))/ Power(E,d*Arg) */ void fcomplex_atan2(const fcomplex *y, const fcomplex *x, fcomplex *op) { /* mathematica says: -i log((x+yi)/sqrt(x^2+y^2)), so i'm going to do: i ( log(x^2+y^2)/2 - log(x+y i) ) */ fcomplex tmp1, tmp2, tmp3; /* tmp1 = x^2 + y^2 */ tmp1.real=x->real*x->real-x->imag*x->imag+y->real*y->real-y->imag*y->imag; tmp1.imag=0; /* tmp2 = log(tmp1) */ fcomplex_log(&tmp1,&tmp2); /* tmp1 = x + y i */ tmp1.real = x->real - y->imag; tmp1.imag = x->imag + y->real; /* tmp3 = log(tmp1) */ fcomplex_log(&tmp3,&tmp1); /* op = i (tmp2/2 - tmp3) */ op->real = -tmp2.imag/2 + tmp3.imag; op->imag = tmp2.real/2 - tmp3.real; } /* stubs */ void fcomplex_monstub(const fcomplex *arg, fcomplex *op) { (void)arg; op->real = op->imag = atof("NaN"); } void fcomplex_binstub(const fcomplex *arg1, const fcomplex *arg2, fcomplex *op) { (void)arg1; op->real = op->imag = atof("NaN"); } geomview-1.9.5/src/lib/fexpr/evaluate.c0000644000175000017500000001157012310110177014721 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "fexpr.h" #define PUSH(val) (op=(val),stack[stackpos++]=op) #define POP() (stack[--stackpos]) double expr_evaluate(struct expression *e) { double op, *stack; int stackpos=0; int vectpos; /* where we are in the vector. */ double temp1,temp2; stack = malloc (sizeof (double) *e->nelem); for (vectpos=0; vectposnelem; vectpos++) { struct expr_elem *k; k = &(e->elems[vectpos]); switch(k->op) { case MONOP: switch (k->u.monop.op) { case '-': temp1 = POP(); PUSH(temp1); default: abort(); /* help! help! */ break; }; case BINOP: switch (k->u.binop.op) { case '+': temp1 = POP(); temp2 = POP(); PUSH(temp2+temp1); break; case '-': temp1 = POP(); temp2 = POP(); PUSH(temp1-temp2); break; case '*': temp1 = POP(); temp2 = POP(); PUSH(temp1*temp2); break; case '/': temp1 = POP(); temp2 = POP(); PUSH(temp1/temp2); break; case '^': temp1 = POP(); temp2 = POP(); PUSH(pow(temp1,temp2)); break; default: abort(); /* help! help! */ break; }; break; case MONFUNC: temp1 = POP(); PUSH((*k->u.monfunc.func)(temp1)); break; case BINFUNC: temp1 = POP(); temp2 = POP(); PUSH((*k->u.binfunc.func)(temp1,temp2)); break; case PUSHVAR: PUSH(e->varvals[k->u.pushvar.varnum].real); break; case PUSHNUM: PUSH(k->u.pushnum.number); break; default: break; } } op = POP(); free(stack); return op; } void expr_evaluate_some(struct expression *e, expr_var v, double min, double max, int npoints, double *buffer) { int i; for (i=0; inelem); for (vectpos=0; vectposnelem; vectpos++) { struct expr_elem *k; k = &(e->elems[vectpos]); switch(k->op) { case MONOP: switch (k->u.monop.op) { case '-': POP(reg1); reg1.real *= -1; reg1.imag *= -1; PUSH(reg1); default: abort(); /* help! help! */ break; }; break; case BINOP: switch (k->u.binop.op) { case '+': POP(reg1); POP(reg2); reg1.real += reg2.real; reg1.imag += reg2.imag; PUSH(reg1); break; case '-': POP(reg1); POP(reg2); reg1.real -= reg2.real; reg1.imag -= reg2.imag; PUSH(reg1); break; case '*': POP(reg1); POP(reg2); reg3.real = reg2.real*reg1.real-reg2.imag*reg1.imag; reg3.imag = reg2.imag*reg1.real+reg1.imag*reg2.real; PUSH(reg3); break; case '/': POP(reg1); POP(reg2); reg3.real = (reg1.real*reg2.real-reg1.imag*reg2.imag )/ (reg2.real*reg2.real+reg2.imag*reg2.imag); reg3.imag = (reg1.imag*reg2.real - reg2.imag*reg1.real ) / (reg2.real*reg2.real + reg2.imag*reg2.imag); PUSH(reg3); break; case '^': POP(reg1); POP(reg2); fcomplex_pow(®1, ®2, ®3); PUSH(reg3); default: abort(); /* help! help! */ break; }; break; case MONFUNC: POP(reg1); (*k->u.monfunc.cfunc)(®1,®2); PUSH(reg2); break; case BINFUNC: POP(reg1); POP(reg2); (*k->u.binfunc.cfunc)(®1,®2,®3); PUSH(reg3); break; case PUSHVAR: PUSH(e->varvals[k->u.pushvar.varnum]); break; case PUSHNUM: reg1.real = k->u.pushnum.number; reg1.imag = 0; PUSH(reg1); break; default: break; } } POP(*op); free(stack); } geomview-1.9.5/src/lib/fexpr/exprs.c0000644000175000017500000000322212310110177014247 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "fexpr.h" struct expression *expr_new() { struct expression *op; op = malloc (sizeof (struct expression)); op ->nvars = 0; op->varnames = NULL; op->varvals = NULL; op->nelem = 0; op->elems = NULL; return op; } void expr_free(struct expression *e) { if (!e) return; if (e->varnames) { int i; for (i=0; invars; i++) if (e->varnames[i]) free (e->varnames[i]); free (e->varnames); } if (e->varvals) free (e->varvals); if (e->elems) free (e->elems); free(e); } geomview-1.9.5/src/lib/fexpr/lex.yy.c0000644000175000017500000012262112310110177014343 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #line 2 "lex.fparse_yy.c" /* A lexical scanner generated by flex */ /* Scanner skeleton version: * $Header: /cvsroot/geomview/geomview/src/lib/fexpr/lex.yy.c,v 1.5 2006/07/15 19:05:57 rotdrop Exp $ */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #include /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #ifdef __cplusplus #include #include /* Use prototypes in function declarations. */ #define YY_USE_PROTOS /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ #if __STDC__ #define YY_USE_PROTOS #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef __TURBOC__ #pragma warn -rch #pragma warn -use #include #include #define YY_USE_CONST #define YY_USE_PROTOS #endif #ifdef YY_USE_CONST #define fparse_yyconst const #else #define fparse_yyconst #endif #ifdef YY_USE_PROTOS #define YY_PROTO(proto) proto #else #define YY_PROTO(proto) () #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN fparse_yy_start = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START ((fparse_yy_start - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE fparse_yyrestart( fparse_yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #define YY_BUF_SIZE 16384 typedef struct fparse_yy_buffer_state *YY_BUFFER_STATE; extern int fparse_yyleng; extern FILE *fparse_yyin, *fparse_yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* The funky do-while in the following #define is used to turn the definition * int a single C statement (which needs a semi-colon terminator). This * avoids problems with code like: * * if ( condition_holds ) * fparse_yyless( 5 ); * else * do_something_else(); * * Prior to using the do-while the compiler would get upset at the * "else" because it interpreted the "if" statement as being all * done when it reached the ';' after the fparse_yyless() call. */ /* Return all but the first 'n' matched characters back to the input stream. */ #define fparse_yyless(n) \ do \ { \ /* Undo effects of setting up fparse_yytext. */ \ *fparse_yy_cp = fparse_yy_hold_char; \ fparse_yy_c_buf_p = fparse_yy_cp = fparse_yy_bp + n - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up fparse_yytext again */ \ } \ while ( 0 ) #define unput(c) fparse_yyunput( c, fparse_yytext_ptr ) /* The following is because we cannot portably get our hands on size_t * (without autoconf's help, which isn't available because we want * flex-generated scanners to compile on their own). */ typedef unsigned int fparse_yy_size_t; struct fparse_yy_buffer_state { FILE *fparse_yy_input_file; char *fparse_yy_ch_buf; /* input buffer */ char *fparse_yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ fparse_yy_size_t fparse_yy_buf_size; /* Number of characters read into fparse_yy_ch_buf, not including EOB * characters. */ int fparse_yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int fparse_yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int fparse_yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int fparse_yy_at_bol; /* Whether to try to fill the input buffer when we reach the * end of it. */ int fparse_yy_fill_buffer; int fparse_yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via fparse_yyrestart()), so that the user can continue scanning by * just pointing fparse_yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; static YY_BUFFER_STATE fparse_yy_current_buffer = 0; /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". */ #define YY_CURRENT_BUFFER fparse_yy_current_buffer /* fparse_yy_hold_char holds the character lost when fparse_yytext is formed. */ static char fparse_yy_hold_char; static int fparse_yy_n_chars; /* number of characters read into fparse_yy_ch_buf */ int fparse_yyleng; /* Points to current character in buffer. */ static char *fparse_yy_c_buf_p = (char *) 0; static int fparse_yy_init = 1; /* whether we need to initialize */ static int fparse_yy_start = 0; /* start state number */ /* Flag which is used to allow fparse_yywrap()'s to do buffer switches * instead of setting up a fresh fparse_yyin. A bit of a hack ... */ static int fparse_yy_did_buffer_switch_on_eof; void fparse_yyrestart YY_PROTO(( FILE *input_file )); void fparse_yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); void fparse_yy_load_buffer_state YY_PROTO(( void )); YY_BUFFER_STATE fparse_yy_create_buffer YY_PROTO(( FILE *file, int size )); void fparse_yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); void fparse_yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); void fparse_yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); #define YY_FLUSH_BUFFER fparse_yy_flush_buffer( fparse_yy_current_buffer ) YY_BUFFER_STATE fparse_yy_scan_buffer YY_PROTO(( char *base, fparse_yy_size_t size )); YY_BUFFER_STATE fparse_yy_scan_string YY_PROTO(( fparse_yyconst char *str )); YY_BUFFER_STATE fparse_yy_scan_bytes YY_PROTO(( fparse_yyconst char *bytes, int len )); static void *fparse_yy_flex_alloc YY_PROTO(( fparse_yy_size_t )); static void *fparse_yy_flex_realloc YY_PROTO(( void *, fparse_yy_size_t )); static void fparse_yy_flex_free YY_PROTO(( void * )); #define fparse_yy_new_buffer fparse_yy_create_buffer #define fparse_yy_set_interactive(is_interactive) \ { \ if ( ! fparse_yy_current_buffer ) \ fparse_yy_current_buffer = fparse_yy_create_buffer( fparse_yyin, YY_BUF_SIZE ); \ fparse_yy_current_buffer->fparse_yy_is_interactive = is_interactive; \ } #define fparse_yy_set_bol(at_bol) \ { \ if ( ! fparse_yy_current_buffer ) \ fparse_yy_current_buffer = fparse_yy_create_buffer( fparse_yyin, YY_BUF_SIZE ); \ fparse_yy_current_buffer->fparse_yy_at_bol = at_bol; \ } #define YY_AT_BOL() (fparse_yy_current_buffer->fparse_yy_at_bol) typedef unsigned char YY_CHAR; FILE *fparse_yyin = (FILE *) 0, *fparse_yyout = (FILE *) 0; typedef int fparse_yy_state_type; extern char *fparse_yytext; #define fparse_yytext_ptr fparse_yytext static fparse_yy_state_type fparse_yy_get_previous_state YY_PROTO(( void )); static fparse_yy_state_type fparse_yy_try_NUL_trans YY_PROTO(( fparse_yy_state_type current_state )); static int fparse_yy_get_next_buffer YY_PROTO(( void )); static void fparse_yy_fatal_error YY_PROTO(( fparse_yyconst char msg[] )); /* Done after the current pattern has been matched and before the * corresponding action - sets up fparse_yytext. */ #define YY_DO_BEFORE_ACTION \ fparse_yytext_ptr = fparse_yy_bp; \ fparse_yyleng = (int) (fparse_yy_cp - fparse_yy_bp); \ fparse_yy_hold_char = *fparse_yy_cp; \ *fparse_yy_cp = '\0'; \ fparse_yy_c_buf_p = fparse_yy_cp; #define YY_NUM_RULES 4 #define YY_END_OF_BUFFER 5 static fparse_yyconst short int fparse_yy_accept[19] = { 0, 0, 0, 5, 3, 4, 3, 1, 2, 1, 1, 1, 0, 2, 1, 0, 1, 1, 0 } ; static fparse_yyconst int fparse_yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 4, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1, 7, 1, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static fparse_yyconst int fparse_yy_meta[9] = { 0, 1, 1, 1, 1, 2, 2, 2, 2 } ; static fparse_yyconst short int fparse_yy_base[20] = { 0, 0, 0, 21, 22, 22, 14, 5, 0, 9, 11, 0, 15, 0, 0, 10, 7, 22, 22, 9 } ; static fparse_yyconst short int fparse_yy_def[20] = { 0, 18, 1, 18, 18, 18, 18, 18, 19, 18, 9, 7, 18, 19, 10, 18, 18, 18, 0, 18 } ; static fparse_yyconst short int fparse_yy_nxt[31] = { 0, 4, 5, 4, 6, 7, 8, 4, 8, 10, 11, 13, 17, 12, 9, 16, 14, 12, 15, 9, 16, 18, 3, 18, 18, 18, 18, 18, 18, 18, 18 } ; static fparse_yyconst short int fparse_yy_chk[31] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 19, 16, 7, 9, 15, 10, 9, 12, 6, 12, 3, 18, 18, 18, 18, 18, 18, 18, 18, 18 } ; static fparse_yy_state_type fparse_yy_last_accepting_state; static char *fparse_yy_last_accepting_cpos; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define fparse_yymore() fparse_yymore_used_but_not_detected #define YY_MORE_ADJ 0 char *fparse_yytext; #line 1 "../lexical.l" #define INITIAL 0 #line 2 "../lexical.l" #include #include #include "parse.tab.h" #define fparse_yywrap() 1 static int inputpos=0; static char *bufptr; static int buflen; void expr_lex_reset_input(char *buf) { bufptr = buf; inputpos = 0; buflen = strlen(buf); } #undef YY_INPUT #define YY_INPUT(buf,result,max_size) do_fparse_yy_input((buf),&(result),(max_size)) void do_fparse_yy_input(char *buf, int *result, int max_size) { if (inputpos == buflen) { (*result) = 0; } else { int size = max_size < buflen-inputpos ? max_size : buflen-inputpos; memcpy (buf, bufptr+inputpos, size); (*result) = size; inputpos += size; } } #line 403 "lex.fparse_yy.c" /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int fparse_yywrap YY_PROTO(( void )); #else extern int fparse_yywrap YY_PROTO(( void )); #endif #endif #ifndef YY_NO_UNPUT static void fparse_yyunput YY_PROTO(( int c, char *buf_ptr )); #endif #ifndef fparse_yytext_ptr static void fparse_yy_flex_strncpy YY_PROTO(( char *, fparse_yyconst char *, int )); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int fparse_yyinput YY_PROTO(( void )); #else static int input YY_PROTO(( void )); #endif #endif #if YY_STACK_USED static int fparse_yy_start_stack_ptr = 0; static int fparse_yy_start_stack_depth = 0; static int *fparse_yy_start_stack = 0; #ifndef YY_NO_PUSH_STATE static void fparse_yy_push_state YY_PROTO(( int new_state )); #endif #ifndef YY_NO_POP_STATE static void fparse_yy_pop_state YY_PROTO(( void )); #endif #ifndef YY_NO_TOP_STATE static int fparse_yy_top_state YY_PROTO(( void )); #endif #else #define YY_NO_PUSH_STATE 1 #define YY_NO_POP_STATE 1 #define YY_NO_TOP_STATE 1 #endif #ifdef YY_MALLOC_DECL YY_MALLOC_DECL #else #if __STDC__ #ifndef __cplusplus #include #endif #else /* Just try to get by without declaring the routines. This will fail * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) * or sizeof(void*) != sizeof(int). */ #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO (void) fwrite( fparse_yytext, fparse_yyleng, 1, fparse_yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( fparse_yy_current_buffer->fparse_yy_is_interactive ) \ { \ int c = '*', n; \ for ( n = 0; n < max_size && \ (c = getc( fparse_yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( fparse_yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else if ( ((result = fread( buf, 1, max_size, fparse_yyin )) == 0) \ && ferror( fparse_yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "fparse_yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef fparse_yyterminate #define fparse_yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) fparse_yy_fatal_error( msg ) #endif /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL int fparse_yylex YY_PROTO(( void )) #endif /* Code executed at the beginning of each rule, after fparse_yytext and fparse_yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION YY_DECL { fparse_yy_state_type fparse_yy_current_state; char *fparse_yy_cp, *fparse_yy_bp; int fparse_yy_act; #line 41 "../lexical.l" #line 554 "lex.fparse_yy.c" if ( fparse_yy_init ) { fparse_yy_init = 0; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! fparse_yy_start ) fparse_yy_start = 1; /* first start state */ if ( ! fparse_yyin ) fparse_yyin = stdin; if ( ! fparse_yyout ) fparse_yyout = stdout; if ( ! fparse_yy_current_buffer ) fparse_yy_current_buffer = fparse_yy_create_buffer( fparse_yyin, YY_BUF_SIZE ); fparse_yy_load_buffer_state(); } while ( 1 ) /* loops until end-of-file is reached */ { fparse_yy_cp = fparse_yy_c_buf_p; /* Support of fparse_yytext. */ *fparse_yy_cp = fparse_yy_hold_char; /* fparse_yy_bp points to the position in fparse_yy_ch_buf of the start of * the current run. */ fparse_yy_bp = fparse_yy_cp; fparse_yy_current_state = fparse_yy_start; fparse_yy_match: do { YY_CHAR fparse_yy_c = fparse_yy_ec[YY_SC_TO_UI(*fparse_yy_cp)]; if ( fparse_yy_accept[fparse_yy_current_state] ) { fparse_yy_last_accepting_state = fparse_yy_current_state; fparse_yy_last_accepting_cpos = fparse_yy_cp; } while ( fparse_yy_chk[fparse_yy_base[fparse_yy_current_state] + fparse_yy_c] != fparse_yy_current_state ) { fparse_yy_current_state = (int) fparse_yy_def[fparse_yy_current_state]; if ( fparse_yy_current_state >= 19 ) fparse_yy_c = fparse_yy_meta[(unsigned int) fparse_yy_c]; } fparse_yy_current_state = fparse_yy_nxt[fparse_yy_base[fparse_yy_current_state] + (unsigned int) fparse_yy_c]; ++fparse_yy_cp; } while ( fparse_yy_base[fparse_yy_current_state] != 22 ); fparse_yy_find_action: fparse_yy_act = fparse_yy_accept[fparse_yy_current_state]; if ( fparse_yy_act == 0 ) { /* have to back up */ fparse_yy_cp = fparse_yy_last_accepting_cpos; fparse_yy_current_state = fparse_yy_last_accepting_state; fparse_yy_act = fparse_yy_accept[fparse_yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( fparse_yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *fparse_yy_cp = fparse_yy_hold_char; fparse_yy_cp = fparse_yy_last_accepting_cpos; fparse_yy_current_state = fparse_yy_last_accepting_state; goto fparse_yy_find_action; case 1: YY_RULE_SETUP #line 44 "../lexical.l" { fparse_yylval.number = atof(fparse_yytext); return NUMBER; } YY_BREAK case 2: YY_RULE_SETUP #line 45 "../lexical.l" { fparse_yylval.string = malloc(strlen(fparse_yytext)+1); strcpy (fparse_yylval.string, fparse_yytext); return IDENT; } YY_BREAK case 3: YY_RULE_SETUP #line 46 "../lexical.l" { if (*fparse_yytext != ' ' && *fparse_yytext != '\n' && *fparse_yytext != '\t') return *fparse_yytext; } YY_BREAK case 4: YY_RULE_SETUP #line 47 "../lexical.l" ECHO; YY_BREAK #line 657 "lex.fparse_yy.c" case YY_STATE_EOF(INITIAL): fparse_yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int fparse_yy_amount_of_matched_text = (int) (fparse_yy_cp - fparse_yytext_ptr) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *fparse_yy_cp = fparse_yy_hold_char; if ( fparse_yy_current_buffer->fparse_yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed fparse_yyin at a new source and called * fparse_yylex(). If so, then we have to assure * consistency between fparse_yy_current_buffer and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ fparse_yy_n_chars = fparse_yy_current_buffer->fparse_yy_n_chars; fparse_yy_current_buffer->fparse_yy_input_file = fparse_yyin; fparse_yy_current_buffer->fparse_yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for fparse_yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since fparse_yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( fparse_yy_c_buf_p <= &fparse_yy_current_buffer->fparse_yy_ch_buf[fparse_yy_n_chars] ) { /* This was really a NUL. */ fparse_yy_state_type fparse_yy_next_state; fparse_yy_c_buf_p = fparse_yytext_ptr + fparse_yy_amount_of_matched_text; fparse_yy_current_state = fparse_yy_get_previous_state(); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * fparse_yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ fparse_yy_next_state = fparse_yy_try_NUL_trans( fparse_yy_current_state ); fparse_yy_bp = fparse_yytext_ptr + YY_MORE_ADJ; if ( fparse_yy_next_state ) { /* Consume the NUL. */ fparse_yy_cp = ++fparse_yy_c_buf_p; fparse_yy_current_state = fparse_yy_next_state; goto fparse_yy_match; } else { fparse_yy_cp = fparse_yy_c_buf_p; goto fparse_yy_find_action; } } else switch ( fparse_yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { fparse_yy_did_buffer_switch_on_eof = 0; if ( fparse_yywrap() ) { /* Note: because we've taken care in * fparse_yy_get_next_buffer() to have set up * fparse_yytext, we can now set up * fparse_yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ fparse_yy_c_buf_p = fparse_yytext_ptr + YY_MORE_ADJ; fparse_yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! fparse_yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: fparse_yy_c_buf_p = fparse_yytext_ptr + fparse_yy_amount_of_matched_text; fparse_yy_current_state = fparse_yy_get_previous_state(); fparse_yy_cp = fparse_yy_c_buf_p; fparse_yy_bp = fparse_yytext_ptr + YY_MORE_ADJ; goto fparse_yy_match; case EOB_ACT_LAST_MATCH: fparse_yy_c_buf_p = &fparse_yy_current_buffer->fparse_yy_ch_buf[fparse_yy_n_chars]; fparse_yy_current_state = fparse_yy_get_previous_state(); fparse_yy_cp = fparse_yy_c_buf_p; fparse_yy_bp = fparse_yytext_ptr + YY_MORE_ADJ; goto fparse_yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of fparse_yylex */ /* fparse_yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int fparse_yy_get_next_buffer() { char *dest = fparse_yy_current_buffer->fparse_yy_ch_buf; char *source = fparse_yytext_ptr; int number_to_move, i; int ret_val; if ( fparse_yy_c_buf_p > &fparse_yy_current_buffer->fparse_yy_ch_buf[fparse_yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( fparse_yy_current_buffer->fparse_yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( fparse_yy_c_buf_p - fparse_yytext_ptr - YY_MORE_ADJ == 1 ) { /* We matched a singled characater, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) (fparse_yy_c_buf_p - fparse_yytext_ptr) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( fparse_yy_current_buffer->fparse_yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ fparse_yy_n_chars = 0; else { int num_to_read = fparse_yy_current_buffer->fparse_yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ #ifdef YY_USES_REJECT YY_FATAL_ERROR( "input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); #else /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = fparse_yy_current_buffer; int fparse_yy_c_buf_p_offset = (int) (fparse_yy_c_buf_p - b->fparse_yy_ch_buf); if ( b->fparse_yy_is_our_buffer ) { int new_size = b->fparse_yy_buf_size * 2; if ( new_size <= 0 ) b->fparse_yy_buf_size += b->fparse_yy_buf_size / 8; else b->fparse_yy_buf_size *= 2; b->fparse_yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ fparse_yy_flex_realloc( (void *) b->fparse_yy_ch_buf, b->fparse_yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->fparse_yy_ch_buf = 0; if ( ! b->fparse_yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); fparse_yy_c_buf_p = &b->fparse_yy_ch_buf[fparse_yy_c_buf_p_offset]; num_to_read = fparse_yy_current_buffer->fparse_yy_buf_size - number_to_move - 1; #endif } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&fparse_yy_current_buffer->fparse_yy_ch_buf[number_to_move]), fparse_yy_n_chars, num_to_read ); } if ( fparse_yy_n_chars == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; fparse_yyrestart( fparse_yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; fparse_yy_current_buffer->fparse_yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; fparse_yy_n_chars += number_to_move; fparse_yy_current_buffer->fparse_yy_ch_buf[fparse_yy_n_chars] = YY_END_OF_BUFFER_CHAR; fparse_yy_current_buffer->fparse_yy_ch_buf[fparse_yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; fparse_yytext_ptr = &fparse_yy_current_buffer->fparse_yy_ch_buf[0]; return ret_val; } /* fparse_yy_get_previous_state - get the state just before the EOB char was reached */ static fparse_yy_state_type fparse_yy_get_previous_state() { fparse_yy_state_type fparse_yy_current_state; char *fparse_yy_cp; fparse_yy_current_state = fparse_yy_start; for ( fparse_yy_cp = fparse_yytext_ptr + YY_MORE_ADJ; fparse_yy_cp < fparse_yy_c_buf_p; ++fparse_yy_cp ) { YY_CHAR fparse_yy_c = (*fparse_yy_cp ? fparse_yy_ec[YY_SC_TO_UI(*fparse_yy_cp)] : 1); if ( fparse_yy_accept[fparse_yy_current_state] ) { fparse_yy_last_accepting_state = fparse_yy_current_state; fparse_yy_last_accepting_cpos = fparse_yy_cp; } while ( fparse_yy_chk[fparse_yy_base[fparse_yy_current_state] + fparse_yy_c] != fparse_yy_current_state ) { fparse_yy_current_state = (int) fparse_yy_def[fparse_yy_current_state]; if ( fparse_yy_current_state >= 19 ) fparse_yy_c = fparse_yy_meta[(unsigned int) fparse_yy_c]; } fparse_yy_current_state = fparse_yy_nxt[fparse_yy_base[fparse_yy_current_state] + (unsigned int) fparse_yy_c]; } return fparse_yy_current_state; } /* fparse_yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = fparse_yy_try_NUL_trans( current_state ); */ #ifdef YY_USE_PROTOS static fparse_yy_state_type fparse_yy_try_NUL_trans( fparse_yy_state_type fparse_yy_current_state ) #else static fparse_yy_state_type fparse_yy_try_NUL_trans( fparse_yy_current_state ) fparse_yy_state_type fparse_yy_current_state; #endif { int fparse_yy_is_jam; char *fparse_yy_cp = fparse_yy_c_buf_p; YY_CHAR fparse_yy_c = 1; if ( fparse_yy_accept[fparse_yy_current_state] ) { fparse_yy_last_accepting_state = fparse_yy_current_state; fparse_yy_last_accepting_cpos = fparse_yy_cp; } while ( fparse_yy_chk[fparse_yy_base[fparse_yy_current_state] + fparse_yy_c] != fparse_yy_current_state ) { fparse_yy_current_state = (int) fparse_yy_def[fparse_yy_current_state]; if ( fparse_yy_current_state >= 19 ) fparse_yy_c = fparse_yy_meta[(unsigned int) fparse_yy_c]; } fparse_yy_current_state = fparse_yy_nxt[fparse_yy_base[fparse_yy_current_state] + (unsigned int) fparse_yy_c]; fparse_yy_is_jam = (fparse_yy_current_state == 18); return fparse_yy_is_jam ? 0 : fparse_yy_current_state; } #ifndef YY_NO_UNPUT #ifdef YY_USE_PROTOS static void fparse_yyunput( int c, char *fparse_yy_bp ) #else static void fparse_yyunput( c, fparse_yy_bp ) int c; char *fparse_yy_bp; #endif { char *fparse_yy_cp = fparse_yy_c_buf_p; /* undo effects of setting up fparse_yytext */ *fparse_yy_cp = fparse_yy_hold_char; if ( fparse_yy_cp < fparse_yy_current_buffer->fparse_yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ int number_to_move = fparse_yy_n_chars + 2; char *dest = &fparse_yy_current_buffer->fparse_yy_ch_buf[ fparse_yy_current_buffer->fparse_yy_buf_size + 2]; char *source = &fparse_yy_current_buffer->fparse_yy_ch_buf[number_to_move]; while ( source > fparse_yy_current_buffer->fparse_yy_ch_buf ) *--dest = *--source; fparse_yy_cp += (int) (dest - source); fparse_yy_bp += (int) (dest - source); fparse_yy_n_chars = fparse_yy_current_buffer->fparse_yy_buf_size; if ( fparse_yy_cp < fparse_yy_current_buffer->fparse_yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--fparse_yy_cp = (char) c; fparse_yytext_ptr = fparse_yy_bp; fparse_yy_hold_char = *fparse_yy_cp; fparse_yy_c_buf_p = fparse_yy_cp; } #endif /* ifndef YY_NO_UNPUT */ #ifdef __cplusplus static int fparse_yyinput() #else static int input() #endif { int c; *fparse_yy_c_buf_p = fparse_yy_hold_char; if ( *fparse_yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* fparse_yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( fparse_yy_c_buf_p < &fparse_yy_current_buffer->fparse_yy_ch_buf[fparse_yy_n_chars] ) /* This was really a NUL. */ *fparse_yy_c_buf_p = '\0'; else { /* need more input */ fparse_yytext_ptr = fparse_yy_c_buf_p; ++fparse_yy_c_buf_p; switch ( fparse_yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { if ( fparse_yywrap() ) { fparse_yy_c_buf_p = fparse_yytext_ptr + YY_MORE_ADJ; return EOF; } if ( ! fparse_yy_did_buffer_switch_on_eof ) YY_NEW_FILE; #ifdef __cplusplus return fparse_yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: fparse_yy_c_buf_p = fparse_yytext_ptr + YY_MORE_ADJ; break; case EOB_ACT_LAST_MATCH: #ifdef __cplusplus YY_FATAL_ERROR( "unexpected last match in fparse_yyinput()" ); #else YY_FATAL_ERROR( "unexpected last match in input()" ); #endif } } } c = *(unsigned char *) fparse_yy_c_buf_p; /* cast for 8-bit char's */ *fparse_yy_c_buf_p = '\0'; /* preserve fparse_yytext */ fparse_yy_hold_char = *++fparse_yy_c_buf_p; return c; } #ifdef YY_USE_PROTOS void fparse_yyrestart( FILE *input_file ) #else void fparse_yyrestart( input_file ) FILE *input_file; #endif { if ( ! fparse_yy_current_buffer ) fparse_yy_current_buffer = fparse_yy_create_buffer( fparse_yyin, YY_BUF_SIZE ); fparse_yy_init_buffer( fparse_yy_current_buffer, input_file ); fparse_yy_load_buffer_state(); } #ifdef YY_USE_PROTOS void fparse_yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) #else void fparse_yy_switch_to_buffer( new_buffer ) YY_BUFFER_STATE new_buffer; #endif { if ( fparse_yy_current_buffer == new_buffer ) return; if ( fparse_yy_current_buffer ) { /* Flush out information for old buffer. */ *fparse_yy_c_buf_p = fparse_yy_hold_char; fparse_yy_current_buffer->fparse_yy_buf_pos = fparse_yy_c_buf_p; fparse_yy_current_buffer->fparse_yy_n_chars = fparse_yy_n_chars; } fparse_yy_current_buffer = new_buffer; fparse_yy_load_buffer_state(); /* We don't actually know whether we did this switch during * EOF (fparse_yywrap()) processing, but the only time this flag * is looked at is after fparse_yywrap() is called, so it's safe * to go ahead and always set it. */ fparse_yy_did_buffer_switch_on_eof = 1; } #ifdef YY_USE_PROTOS void fparse_yy_load_buffer_state( void ) #else void fparse_yy_load_buffer_state() #endif { fparse_yy_n_chars = fparse_yy_current_buffer->fparse_yy_n_chars; fparse_yytext_ptr = fparse_yy_c_buf_p = fparse_yy_current_buffer->fparse_yy_buf_pos; fparse_yyin = fparse_yy_current_buffer->fparse_yy_input_file; fparse_yy_hold_char = *fparse_yy_c_buf_p; } #ifdef YY_USE_PROTOS YY_BUFFER_STATE fparse_yy_create_buffer( FILE *file, int size ) #else YY_BUFFER_STATE fparse_yy_create_buffer( file, size ) FILE *file; int size; #endif { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) fparse_yy_flex_alloc( sizeof( struct fparse_yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in fparse_yy_create_buffer()" ); b->fparse_yy_buf_size = size; /* fparse_yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->fparse_yy_ch_buf = (char *) fparse_yy_flex_alloc( b->fparse_yy_buf_size + 2 ); if ( ! b->fparse_yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in fparse_yy_create_buffer()" ); b->fparse_yy_is_our_buffer = 1; fparse_yy_init_buffer( b, file ); return b; } #ifdef YY_USE_PROTOS void fparse_yy_delete_buffer( YY_BUFFER_STATE b ) #else void fparse_yy_delete_buffer( b ) YY_BUFFER_STATE b; #endif { if ( ! b ) return; if ( b == fparse_yy_current_buffer ) fparse_yy_current_buffer = (YY_BUFFER_STATE) 0; if ( b->fparse_yy_is_our_buffer ) fparse_yy_flex_free( (void *) b->fparse_yy_ch_buf ); fparse_yy_flex_free( (void *) b ); } #ifndef YY_ALWAYS_INTERACTIVE #ifndef YY_NEVER_INTERACTIVE extern int isatty YY_PROTO(( int )); #endif #endif #ifdef YY_USE_PROTOS void fparse_yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) #else void fparse_yy_init_buffer( b, file ) YY_BUFFER_STATE b; FILE *file; #endif { fparse_yy_flush_buffer( b ); b->fparse_yy_input_file = file; b->fparse_yy_fill_buffer = 1; #if YY_ALWAYS_INTERACTIVE b->fparse_yy_is_interactive = 1; #else #if YY_NEVER_INTERACTIVE b->fparse_yy_is_interactive = 0; #else b->fparse_yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; #endif #endif } #ifdef YY_USE_PROTOS void fparse_yy_flush_buffer( YY_BUFFER_STATE b ) #else void fparse_yy_flush_buffer( b ) YY_BUFFER_STATE b; #endif { b->fparse_yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->fparse_yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->fparse_yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->fparse_yy_buf_pos = &b->fparse_yy_ch_buf[0]; b->fparse_yy_at_bol = 1; b->fparse_yy_buffer_status = YY_BUFFER_NEW; if ( b == fparse_yy_current_buffer ) fparse_yy_load_buffer_state(); } #ifndef YY_NO_SCAN_BUFFER #ifdef YY_USE_PROTOS YY_BUFFER_STATE fparse_yy_scan_buffer( char *base, fparse_yy_size_t size ) #else YY_BUFFER_STATE fparse_yy_scan_buffer( base, size ) char *base; fparse_yy_size_t size; #endif { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) fparse_yy_flex_alloc( sizeof( struct fparse_yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in fparse_yy_scan_buffer()" ); b->fparse_yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->fparse_yy_buf_pos = b->fparse_yy_ch_buf = base; b->fparse_yy_is_our_buffer = 0; b->fparse_yy_input_file = 0; b->fparse_yy_n_chars = b->fparse_yy_buf_size; b->fparse_yy_is_interactive = 0; b->fparse_yy_at_bol = 1; b->fparse_yy_fill_buffer = 0; b->fparse_yy_buffer_status = YY_BUFFER_NEW; fparse_yy_switch_to_buffer( b ); return b; } #endif #ifndef YY_NO_SCAN_STRING #ifdef YY_USE_PROTOS YY_BUFFER_STATE fparse_yy_scan_string( fparse_yyconst char *str ) #else YY_BUFFER_STATE fparse_yy_scan_string( str ) fparse_yyconst char *str; #endif { int len; for ( len = 0; str[len]; ++len ) ; return fparse_yy_scan_bytes( str, len ); } #endif #ifndef YY_NO_SCAN_BYTES #ifdef YY_USE_PROTOS YY_BUFFER_STATE fparse_yy_scan_bytes( fparse_yyconst char *bytes, int len ) #else YY_BUFFER_STATE fparse_yy_scan_bytes( bytes, len ) fparse_yyconst char *bytes; int len; #endif { YY_BUFFER_STATE b; char *buf; fparse_yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = len + 2; buf = (char *) fparse_yy_flex_alloc( n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in fparse_yy_scan_bytes()" ); for ( i = 0; i < len; ++i ) buf[i] = bytes[i]; buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; b = fparse_yy_scan_buffer( buf, n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in fparse_yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->fparse_yy_is_our_buffer = 1; return b; } #endif #ifndef YY_NO_PUSH_STATE #ifdef YY_USE_PROTOS static void fparse_yy_push_state( int new_state ) #else static void fparse_yy_push_state( new_state ) int new_state; #endif { if ( fparse_yy_start_stack_ptr >= fparse_yy_start_stack_depth ) { fparse_yy_size_t new_size; fparse_yy_start_stack_depth += YY_START_STACK_INCR; new_size = fparse_yy_start_stack_depth * sizeof( int ); if ( ! fparse_yy_start_stack ) fparse_yy_start_stack = (int *) fparse_yy_flex_alloc( new_size ); else fparse_yy_start_stack = (int *) fparse_yy_flex_realloc( (void *) fparse_yy_start_stack, new_size ); if ( ! fparse_yy_start_stack ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } fparse_yy_start_stack[fparse_yy_start_stack_ptr++] = YY_START; BEGIN(new_state); } #endif #ifndef YY_NO_POP_STATE static void fparse_yy_pop_state() { if ( --fparse_yy_start_stack_ptr < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN(fparse_yy_start_stack[fparse_yy_start_stack_ptr]); } #endif #ifndef YY_NO_TOP_STATE static int fparse_yy_top_state() { return fparse_yy_start_stack[fparse_yy_start_stack_ptr - 1]; } #endif #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif #ifdef YY_USE_PROTOS static void fparse_yy_fatal_error( fparse_yyconst char msg[] ) #else static void fparse_yy_fatal_error( msg ) char msg[]; #endif { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine fparse_yyless() so it works in section 3 code. */ #undef fparse_yyless #define fparse_yyless(n) \ do \ { \ /* Undo effects of setting up fparse_yytext. */ \ fparse_yytext[fparse_yyleng] = fparse_yy_hold_char; \ fparse_yy_c_buf_p = fparse_yytext + n - YY_MORE_ADJ; \ fparse_yy_hold_char = *fparse_yy_c_buf_p; \ *fparse_yy_c_buf_p = '\0'; \ fparse_yyleng = n; \ } \ while ( 0 ) /* Internal utility routines. */ #ifndef fparse_yytext_ptr #ifdef YY_USE_PROTOS static void fparse_yy_flex_strncpy( char *s1, fparse_yyconst char *s2, int n ) #else static void fparse_yy_flex_strncpy( s1, s2, n ) char *s1; fparse_yyconst char *s2; int n; #endif { int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_USE_PROTOS static void *fparse_yy_flex_alloc( fparse_yy_size_t size ) #else static void *fparse_yy_flex_alloc( size ) fparse_yy_size_t size; #endif { return (void *) malloc( size ); } #ifdef YY_USE_PROTOS static void *fparse_yy_flex_realloc( void *ptr, fparse_yy_size_t size ) #else static void *fparse_yy_flex_realloc( ptr, size ) void *ptr; fparse_yy_size_t size; #endif { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } #ifdef YY_USE_PROTOS static void fparse_yy_flex_free( void *ptr ) #else static void fparse_yy_flex_free( ptr ) void *ptr; #endif { free( ptr ); } #if YY_MAIN int main() { fparse_yylex(); return 0; } #endif #line 47 "../lexical.l" /* more c stuff */ geomview-1.9.5/src/lib/fexpr/monfuncs.c0000644000175000017500000000237212310110177014743 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "fexpr.h" #include #include #include struct expr_monfunc expr_monfuncs[]= { DEFAULT_EXPR_MONFUNCS, {NULL, NULL, NULL} }; geomview-1.9.5/src/lib/fexpr/parse.tab.c0000644000175000017500000007753412310162216015007 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* A Bison parser, made from ../parse.y with Bison version GNU Bison version 1.24 */ #define YYBISON 1 /* Identify Bison output. */ #define IDENT 258 #define NUMBER 259 #define MINUS 260 #line 1 "../parse.y" #include "fexpr.h" #include #include #include #include extern void fparse_yyerror(char *); extern int fparse_yyparse(); extern int fparse_yyrestart(void *); extern void expr_lex_reset_input(char *buf); extern int fparse_yylex(void); #define YYDEBUG 1 struct expr_tree { struct expr_elem elem; struct expr_tree *sub1; struct expr_tree *sub2; }; struct expr_tree *expr_parsed; struct expression *expr_current; static struct expr_parse_free { void *dat; struct expr_parse_free *next; } *freers = NULL; static void expr_free_dat(void *dat) { struct expr_parse_free *f; f=malloc(sizeof(struct expr_parse_free)); f->next=freers; freers=f; f->dat = dat; } static void expr_free_freers() { struct expr_parse_free *f, *next=NULL; for (f=freers; f; f=next) { next = f->next; free(f->dat); free(f); } freers = NULL; } static void expr_free_freers_no_dat() { struct expr_parse_free *f, *next=NULL; for (f=freers; f; f=next) { next = f->next; free(f); } freers = NULL; } static int count_nodes(struct expr_tree *e) { if (!e) return 0; return count_nodes(e->sub1) + count_nodes(e->sub2) + 1; } static void store_nodes(struct expr_tree *e, int *pos) { if (!e) return; store_nodes(e->sub2, pos); store_nodes(e->sub1, pos); expr_current->elems[*pos] = e->elem; (*pos)++; } static char *error_return; char *expr_parse(struct expression *expr, char *str) { int i; error_return = NULL; expr_current = expr; if (!str || !*str) return "Empty expression"; expr_lex_reset_input(str); i = fparse_yyparse(); /* do all the work. */ fparse_yyrestart(NULL); /* clean up so we can do this again. */ if (i) { expr_free_freers(); return "Parse error"; } if (error_return) { expr_free_freers(); return error_return; } expr_free_freers_no_dat(); /* ok. now we convert the parsed expression to a execution vector. whee. */ expr->nelem = count_nodes(expr_parsed); expr->elems = malloc (expr->nelem * sizeof (struct expr_elem)); /* we let i be a counter variable for where we're writing in * the vectorized expression. */ i = 0; store_nodes(expr_parsed, &i); return NULL; } static struct expr_monfunc lookup_monfunc(char *s) { struct expr_monfunc *i; static struct expr_monfunc fail = { NULL, NULL, NULL }; for (i=expr_monfuncs; i->name; i++) if (!strcmp(i->name,s)) return *i; { static char buf[1024]; sprintf(buf,"Undefined unary function: %s",s); error_return = buf; } return fail; } static struct expr_binfunc lookup_binfunc(char *s) { struct expr_binfunc *i; static struct expr_binfunc fail = { NULL, NULL, NULL }; for (i=expr_binfuncs; i->name; i++) if (!strcmp(i->name,s)) return *i; { static char buf[1024]; sprintf(buf,"Undefined binary function: %s",s); error_return = buf; } return fail; } static struct expr_tree *expr_parse_monop(int opr, struct expr_tree *sub) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = MONOP; op->elem.u.monop.op = opr; op->sub1 = sub; expr_free_dat(op); return op; } static struct expr_tree *expr_parse_binop(int opr, struct expr_tree *sub1, struct expr_tree *sub2) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = BINOP; op->elem.u.binop.op = opr; op->sub1 = sub1; op->sub2 = sub2; expr_free_dat(op); return op; } static struct expr_tree *expr_parse_monfunc(struct expr_monfunc f, struct expr_tree *sub1) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = MONFUNC; op->elem.u.monfunc.func = f.func; op->elem.u.monfunc.cfunc = f.cfunc; op->sub1 = sub1; expr_free_dat(op); return op; } static struct expr_tree *expr_parse_binfunc(struct expr_binfunc f, struct expr_tree *sub1, struct expr_tree *sub2) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = BINFUNC; op->elem.u.binfunc.func = f.func; op->elem.u.binfunc.cfunc = f.cfunc; op->sub1 = sub1; op->sub2 = sub2; expr_free_dat(op); return op; } static struct expr_tree *expr_parse_var(char *s) { struct expr_tree *op; int i=0; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.u.pushvar.varnum = -1; op->elem.op = PUSHVAR; for (i=0; invars; i++) if (!strcmp(expr_current->varnames[i], s)) op->elem.u.pushvar.varnum = i; if (op->elem.u.pushvar.varnum == -1) { static char buf[1024]; sprintf(buf,"Undefined variable: %s", s); error_return = buf; } expr_free_dat(op); return op; } static struct expr_tree *expr_parse_num(double d) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = PUSHNUM; op->elem.u.pushnum.number = d; expr_free_dat(op); return op; } void fparse_yyerror(char *errorstr) { error_return = errorstr; } #line 246 "../parse.y" typedef union { char *string; struct expr_tree *expression; double number; } YYSTYPE; #ifndef YYLTYPE typedef struct fparse_yyltype { int timestamp; int first_line; int first_column; int last_line; int last_column; char *text; } fparse_yyltype; #define YYLTYPE fparse_yyltype #endif #include #ifndef __cplusplus #ifndef __STDC__ #define const #endif #endif #define YYFINAL 25 #define YYFLAG -32768 #define YYNTBASE 13 #define YYTRANSLATE(x) ((unsigned)(x) <= 260 ? fparse_yytranslate[x] : 15) static const char fparse_yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, 9, 5, 12, 6, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 7 }; #if YYDEBUG != 0 static const short fparse_yyprhs[] = { 0, 0, 2, 6, 10, 14, 18, 22, 25, 30, 37, 39 }; static const short fparse_yyrhs[] = { 14, 0, 10, 14, 11, 0, 14, 5, 14, 0, 14, 6, 14, 0, 14, 9, 14, 0, 14, 8, 14, 0, 6, 14, 0, 3, 10, 14, 11, 0, 3, 10, 14, 12, 14, 11, 0, 3, 0, 4, 0 }; #endif #if YYDEBUG != 0 static const short fparse_yyrline[] = { 0, 263, 265, 267, 268, 269, 270, 271, 272, 273, 274, 275 }; static const char * const fparse_yytname[] = { "$","error","$undefined.","IDENT", "NUMBER","'+'","'-'","MINUS","'/'","'*'","'('","')'","','","totexpression","expr", "" }; #endif static const short fparse_yyr1[] = { 0, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14 }; static const short fparse_yyr2[] = { 0, 1, 3, 3, 3, 3, 3, 2, 4, 6, 1, 1 }; static const short fparse_yydefact[] = { 0, 10, 11, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 2, 3, 4, 6, 5, 8, 0, 0, 9, 0, 0, 0 }; static const short fparse_yydefgoto[] = { 23, 5 }; static const short fparse_yypact[] = { 17, -8,-32768, 17, 17, 34, 17, -4, 20, 17, 17, 17, 17, 7,-32768, -4, -4,-32768,-32768,-32768, 17, 27,-32768, 10, 11,-32768 }; static const short fparse_yypgoto[] = {-32768, -3 }; #define YYLAST 43 static const short fparse_yytable[] = { 7, 8, 6, 13, 11, 12, 15, 16, 17, 18, 24, 25, 9, 10, 0, 11, 12, 21, 19, 20, 1, 2, 0, 3, 0, 9, 10, 4, 11, 12, 0, 14, 9, 10, 0, 11, 12, 0, 22, 9, 10, 0, 11, 12 }; static const short fparse_yycheck[] = { 3, 4, 10, 6, 8, 9, 9, 10, 11, 12, 0, 0, 5, 6, -1, 8, 9, 20, 11, 12, 3, 4, -1, 6, -1, 5, 6, 10, 8, 9, -1, 11, 5, 6, -1, 8, 9, -1, 11, 5, 6, -1, 8, 9 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/local/lib/bison.simple" /* Skeleton output parser for bison, Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* As a special exception, when this file is copied by Bison into a Bison output file, you may use that output file without restriction. This special exception was added by the Free Software Foundation in version 1.24 of Bison. */ #ifndef alloca #ifdef __GNUC__ #define alloca __builtin_alloca #else /* not GNU C. */ #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) #include #else /* not sparc */ #if defined (MSDOS) && !defined (__TURBOC__) #include #else /* not MSDOS, or __TURBOC__ */ #if defined(_AIX) #include #pragma alloca #else /* not MSDOS, __TURBOC__, or _AIX */ #ifdef __hpux #ifdef __cplusplus extern "C" { void *alloca (unsigned int); }; #else /* not __cplusplus */ void *alloca (); #endif /* not __cplusplus */ #endif /* __hpux */ #endif /* not _AIX */ #endif /* not MSDOS, or __TURBOC__ */ #endif /* not sparc. */ #endif /* not GNU C. */ #endif /* alloca not defined. */ /* This is the parser code that is written into each bison parser when the %semantic_parser declaration is not specified in the grammar. It was written by Richard Stallman by simplifying the hairy parser used when %semantic_parser is specified. */ /* Note: there must be only one dollar sign in this file. It is replaced by the list of actions, each action as one case of the switch. */ #define fparse_yyerrok (fparse_yyerrstatus = 0) #define fparse_yyclearin (fparse_yychar = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 #define YYACCEPT return(0) #define YYABORT return(1) #define YYERROR goto fparse_yyerrlab1 /* Like YYERROR except do call fparse_yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto fparse_yyerrlab #define YYRECOVERING() (!!fparse_yyerrstatus) #define YYBACKUP(token, value) \ do \ if (fparse_yychar == YYEMPTY && fparse_yylen == 1) \ { fparse_yychar = (token), fparse_yylval = (value); \ fparse_yychar1 = YYTRANSLATE (fparse_yychar); \ YYPOPSTACK; \ goto fparse_yybackup; \ } \ else \ { fparse_yyerror ("syntax error: cannot back up"); YYERROR; } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 #ifndef YYPURE #define YYLEX fparse_yylex() #endif #ifdef YYPURE #ifdef YYLSP_NEEDED #ifdef YYLEX_PARAM #define YYLEX fparse_yylex(&fparse_yylval, &fparse_yylloc, YYLEX_PARAM) #else #define YYLEX fparse_yylex(&fparse_yylval, &fparse_yylloc) #endif #else /* not YYLSP_NEEDED */ #ifdef YYLEX_PARAM #define YYLEX fparse_yylex(&fparse_yylval, YYLEX_PARAM) #else #define YYLEX fparse_yylex(&fparse_yylval) #endif #endif /* not YYLSP_NEEDED */ #endif /* If nonreentrant, generate the variables here */ #ifndef YYPURE int fparse_yychar; /* the lookahead symbol */ YYSTYPE fparse_yylval; /* the semantic value of the */ /* lookahead symbol */ #ifdef YYLSP_NEEDED YYLTYPE fparse_yylloc; /* location data for the lookahead */ /* symbol */ #endif int fparse_yynerrs; /* number of parse errors so far */ #endif /* not YYPURE */ #if YYDEBUG != 0 int fparse_yydebug; /* nonzero means print parse trace */ /* Since this is uninitialized, it does not stop multiple parsers from coexisting. */ #endif /* YYINITDEPTH indicates the initial size of the parser's stacks */ #ifndef YYINITDEPTH #define YYINITDEPTH 200 #endif /* YYMAXDEPTH is the maximum size the stacks can grow to (effective only if the built-in stack extension method is used). */ #if YYMAXDEPTH == 0 #undef YYMAXDEPTH #endif #ifndef YYMAXDEPTH #define YYMAXDEPTH 10000 #endif /* Prevent warning if -Wstrict-prototypes. */ #ifdef __GNUC__ int fparse_yyparse (void); #endif #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ #define __fparse_yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) #else /* not GNU C or C++ */ #ifndef __cplusplus /* This is the most reliable way to avoid incompatibilities in available built-in functions on various systems. */ static void __fparse_yy_memcpy (from, to, count) char *from; char *to; int count; { register char *f = from; register char *t = to; register int i = count; while (i-- > 0) *t++ = *f++; } #else /* __cplusplus */ /* This is the most reliable way to avoid incompatibilities in available built-in functions on various systems. */ static void __fparse_yy_memcpy (char *from, char *to, int count) { register char *f = from; register char *t = to; register int i = count; while (i-- > 0) *t++ = *f++; } #endif #endif #line 192 "/usr/local/lib/bison.simple" /* The user can define YYPARSE_PARAM as the name of an argument to be passed into fparse_yyparse. The argument should have type void *. It should actually point to an object. Grammar actions can access the variable by casting it to the proper pointer type. */ #ifdef YYPARSE_PARAM #define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; #else #define YYPARSE_PARAM #define YYPARSE_PARAM_DECL #endif int fparse_yyparse(YYPARSE_PARAM) YYPARSE_PARAM_DECL { register int fparse_yystate; register int fparse_yyn; register short *fparse_yyssp; register YYSTYPE *fparse_yyvsp; int fparse_yyerrstatus; /* number of tokens to shift before error messages enabled */ int fparse_yychar1 = 0; /* lookahead token as an internal (translated) token number */ short fparse_yyssa[YYINITDEPTH]; /* the state stack */ YYSTYPE fparse_yyvsa[YYINITDEPTH]; /* the semantic value stack */ short *fparse_yyss = fparse_yyssa; /* refer to the stacks thru separate pointers */ YYSTYPE *fparse_yyvs = fparse_yyvsa; /* to allow fparse_yyoverflow to reallocate them elsewhere */ #ifdef YYLSP_NEEDED YYLTYPE fparse_yylsa[YYINITDEPTH]; /* the location stack */ YYLTYPE *fparse_yyls = fparse_yylsa; YYLTYPE *fparse_yylsp; #define YYPOPSTACK (fparse_yyvsp--, fparse_yyssp--, fparse_yylsp--) #else #define YYPOPSTACK (fparse_yyvsp--, fparse_yyssp--) #endif int fparse_yystacksize = YYINITDEPTH; #ifdef YYPURE int fparse_yychar; YYSTYPE fparse_yylval; int fparse_yynerrs; #ifdef YYLSP_NEEDED YYLTYPE fparse_yylloc; #endif #endif YYSTYPE fparse_yyval; /* the variable used to return */ /* semantic values from the action */ /* routines */ int fparse_yylen; #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Starting parse\n"); #endif fparse_yystate = 0; fparse_yyerrstatus = 0; fparse_yynerrs = 0; fparse_yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ fparse_yyssp = fparse_yyss - 1; fparse_yyvsp = fparse_yyvs; #ifdef YYLSP_NEEDED fparse_yylsp = fparse_yyls; #endif /* Push a new state, which is found in fparse_yystate . */ /* In all cases, when you get here, the value and location stacks have just been pushed. so pushing a state here evens the stacks. */ fparse_yynewstate: *++fparse_yyssp = fparse_yystate; if (fparse_yyssp >= fparse_yyss + fparse_yystacksize - 1) { /* Give user a chance to reallocate the stack */ /* Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *fparse_yyvs1 = fparse_yyvs; short *fparse_yyss1 = fparse_yyss; #ifdef YYLSP_NEEDED YYLTYPE *fparse_yyls1 = fparse_yyls; #endif /* Get the current used size of the three stacks, in elements. */ int size = fparse_yyssp - fparse_yyss + 1; #ifdef fparse_yyoverflow /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. */ #ifdef YYLSP_NEEDED /* This used to be a conditional around just the two extra args, but that might be undefined if fparse_yyoverflow is a macro. */ fparse_yyoverflow("parser stack overflow", &fparse_yyss1, size * sizeof (*fparse_yyssp), &fparse_yyvs1, size * sizeof (*fparse_yyvsp), &fparse_yyls1, size * sizeof (*fparse_yylsp), &fparse_yystacksize); #else fparse_yyoverflow("parser stack overflow", &fparse_yyss1, size * sizeof (*fparse_yyssp), &fparse_yyvs1, size * sizeof (*fparse_yyvsp), &fparse_yystacksize); #endif fparse_yyss = fparse_yyss1; fparse_yyvs = fparse_yyvs1; #ifdef YYLSP_NEEDED fparse_yyls = fparse_yyls1; #endif #else /* no fparse_yyoverflow */ /* Extend the stack our own way. */ if (fparse_yystacksize >= YYMAXDEPTH) { fparse_yyerror("parser stack overflow"); return 2; } fparse_yystacksize *= 2; if (fparse_yystacksize > YYMAXDEPTH) fparse_yystacksize = YYMAXDEPTH; fparse_yyss = (short *) alloca (fparse_yystacksize * sizeof (*fparse_yyssp)); __fparse_yy_memcpy ((char *)fparse_yyss1, (char *)fparse_yyss, size * sizeof (*fparse_yyssp)); fparse_yyvs = (YYSTYPE *) alloca (fparse_yystacksize * sizeof (*fparse_yyvsp)); __fparse_yy_memcpy ((char *)fparse_yyvs1, (char *)fparse_yyvs, size * sizeof (*fparse_yyvsp)); #ifdef YYLSP_NEEDED fparse_yyls = (YYLTYPE *) alloca (fparse_yystacksize * sizeof (*fparse_yylsp)); __fparse_yy_memcpy ((char *)fparse_yyls1, (char *)fparse_yyls, size * sizeof (*fparse_yylsp)); #endif #endif /* no fparse_yyoverflow */ fparse_yyssp = fparse_yyss + size - 1; fparse_yyvsp = fparse_yyvs + size - 1; #ifdef YYLSP_NEEDED fparse_yylsp = fparse_yyls + size - 1; #endif #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Stack size increased to %d\n", fparse_yystacksize); #endif if (fparse_yyssp >= fparse_yyss + fparse_yystacksize - 1) YYABORT; } #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Entering state %d\n", fparse_yystate); #endif goto fparse_yybackup; fparse_yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ /* fparse_yyresume: */ /* First try to decide what to do without reference to lookahead token. */ fparse_yyn = fparse_yypact[fparse_yystate]; if (fparse_yyn == YYFLAG) goto fparse_yydefault; /* Not known => get a lookahead token if don't already have one. */ /* fparse_yychar is either YYEMPTY or YYEOF or a valid token in external form. */ if (fparse_yychar == YYEMPTY) { #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Reading a token: "); #endif fparse_yychar = YYLEX; } /* Convert token to internal form (in fparse_yychar1) for indexing tables with */ if (fparse_yychar <= 0) /* This means end of input. */ { fparse_yychar1 = 0; fparse_yychar = YYEOF; /* Don't call YYLEX any more */ #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Now at end of input.\n"); #endif } else { fparse_yychar1 = YYTRANSLATE(fparse_yychar); #if YYDEBUG != 0 if (fparse_yydebug) { fprintf (stderr, "Next token is %d (%s", fparse_yychar, fparse_yytname[fparse_yychar1]); /* Give the individual parser a way to print the precise meaning of a token, for further debugging info. */ #ifdef YYPRINT YYPRINT (stderr, fparse_yychar, fparse_yylval); #endif fprintf (stderr, ")\n"); } #endif } fparse_yyn += fparse_yychar1; if (fparse_yyn < 0 || fparse_yyn > YYLAST || fparse_yycheck[fparse_yyn] != fparse_yychar1) goto fparse_yydefault; fparse_yyn = fparse_yytable[fparse_yyn]; /* fparse_yyn is what to do for this token type in this state. Negative => reduce, -fparse_yyn is rule number. Positive => shift, fparse_yyn is new state. New state is final state => don't bother to shift, just return success. 0, or most negative number => error. */ if (fparse_yyn < 0) { if (fparse_yyn == YYFLAG) goto fparse_yyerrlab; fparse_yyn = -fparse_yyn; goto fparse_yyreduce; } else if (fparse_yyn == 0) goto fparse_yyerrlab; if (fparse_yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Shifting token %d (%s), ", fparse_yychar, fparse_yytname[fparse_yychar1]); #endif /* Discard the token being shifted unless it is eof. */ if (fparse_yychar != YYEOF) fparse_yychar = YYEMPTY; *++fparse_yyvsp = fparse_yylval; #ifdef YYLSP_NEEDED *++fparse_yylsp = fparse_yylloc; #endif /* count tokens shifted since error; after three, turn off error status. */ if (fparse_yyerrstatus) fparse_yyerrstatus--; fparse_yystate = fparse_yyn; goto fparse_yynewstate; /* Do the default action for the current state. */ fparse_yydefault: fparse_yyn = fparse_yydefact[fparse_yystate]; if (fparse_yyn == 0) goto fparse_yyerrlab; /* Do a reduction. fparse_yyn is the number of a rule to reduce with. */ fparse_yyreduce: fparse_yylen = fparse_yyr2[fparse_yyn]; if (fparse_yylen > 0) fparse_yyval = fparse_yyvsp[1-fparse_yylen]; /* implement default value of the action */ #if YYDEBUG != 0 if (fparse_yydebug) { int i; fprintf (stderr, "Reducing via rule %d (line %d), ", fparse_yyn, fparse_yyrline[fparse_yyn]); /* Print the symbols being reduced, and their result. */ for (i = fparse_yyprhs[fparse_yyn]; fparse_yyrhs[i] > 0; i++) fprintf (stderr, "%s ", fparse_yytname[fparse_yyrhs[i]]); fprintf (stderr, " -> %s\n", fparse_yytname[fparse_yyr1[fparse_yyn]]); } #endif switch (fparse_yyn) { case 1: #line 263 "../parse.y" { expr_parsed = fparse_yyvsp[0].expression; ; break;} case 2: #line 266 "../parse.y" { fparse_yyval.expression = fparse_yyvsp[-1].expression; ; break;} case 3: #line 267 "../parse.y" { fparse_yyval.expression = expr_parse_binop('+', fparse_yyvsp[-2].expression, fparse_yyvsp[0].expression); ; break;} case 4: #line 268 "../parse.y" { fparse_yyval.expression = expr_parse_binop('-', fparse_yyvsp[-2].expression, fparse_yyvsp[0].expression); ; break;} case 5: #line 269 "../parse.y" { fparse_yyval.expression = expr_parse_binop('*', fparse_yyvsp[-2].expression, fparse_yyvsp[0].expression); ; break;} case 6: #line 270 "../parse.y" { fparse_yyval.expression = expr_parse_binop('/', fparse_yyvsp[-2].expression, fparse_yyvsp[0].expression); ; break;} case 7: #line 271 "../parse.y" { fparse_yyval.expression = expr_parse_monop('-', fparse_yyvsp[0].expression); ; break;} case 8: #line 272 "../parse.y" { fparse_yyval.expression = expr_parse_monfunc(lookup_monfunc(fparse_yyvsp[-3].string), fparse_yyvsp[-1].expression); ; break;} case 9: #line 273 "../parse.y" { fparse_yyval.expression = expr_parse_binfunc(lookup_binfunc(fparse_yyvsp[-5].string), fparse_yyvsp[-3].expression, fparse_yyvsp[-1].expression); ; break;} case 10: #line 274 "../parse.y" { fparse_yyval.expression = expr_parse_var(fparse_yyvsp[0].string); ; break;} case 11: #line 275 "../parse.y" { fparse_yyval.expression = expr_parse_num(fparse_yyvsp[0].number); ; break;} } /* the action file gets copied in in place of this dollarsign */ #line 487 "/usr/local/lib/bison.simple" fparse_yyvsp -= fparse_yylen; fparse_yyssp -= fparse_yylen; #ifdef YYLSP_NEEDED fparse_yylsp -= fparse_yylen; #endif #if YYDEBUG != 0 if (fparse_yydebug) { short *ssp1 = fparse_yyss - 1; fprintf (stderr, "state stack now"); while (ssp1 != fparse_yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif *++fparse_yyvsp = fparse_yyval; #ifdef YYLSP_NEEDED fparse_yylsp++; if (fparse_yylen == 0) { fparse_yylsp->first_line = fparse_yylloc.first_line; fparse_yylsp->first_column = fparse_yylloc.first_column; fparse_yylsp->last_line = (fparse_yylsp-1)->last_line; fparse_yylsp->last_column = (fparse_yylsp-1)->last_column; fparse_yylsp->text = 0; } else { fparse_yylsp->last_line = (fparse_yylsp+fparse_yylen-1)->last_line; fparse_yylsp->last_column = (fparse_yylsp+fparse_yylen-1)->last_column; } #endif /* Now "shift" the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ fparse_yyn = fparse_yyr1[fparse_yyn]; fparse_yystate = fparse_yypgoto[fparse_yyn - YYNTBASE] + *fparse_yyssp; if (fparse_yystate >= 0 && fparse_yystate <= YYLAST && fparse_yycheck[fparse_yystate] == *fparse_yyssp) fparse_yystate = fparse_yytable[fparse_yystate]; else fparse_yystate = fparse_yydefgoto[fparse_yyn - YYNTBASE]; goto fparse_yynewstate; fparse_yyerrlab: /* here on detecting error */ if (! fparse_yyerrstatus) /* If not already recovering from an error, report this error. */ { ++fparse_yynerrs; #ifdef YYERROR_VERBOSE fparse_yyn = fparse_yypact[fparse_yystate]; if (fparse_yyn > YYFLAG && fparse_yyn < YYLAST) { int size = 0; char *msg; int x, count; count = 0; /* Start X at -fparse_yyn if nec to avoid negative indexes in fparse_yycheck. */ for (x = (fparse_yyn < 0 ? -fparse_yyn : 0); x < (sizeof(fparse_yytname) / sizeof(char *)); x++) if (fparse_yycheck[x + fparse_yyn] == x) size += strlen(fparse_yytname[x]) + 15, count++; msg = (char *) malloc(size + 15); if (msg != 0) { strcpy(msg, "parse error"); if (count < 5) { count = 0; for (x = (fparse_yyn < 0 ? -fparse_yyn : 0); x < (sizeof(fparse_yytname) / sizeof(char *)); x++) if (fparse_yycheck[x + fparse_yyn] == x) { strcat(msg, count == 0 ? ", expecting `" : " or `"); strcat(msg, fparse_yytname[x]); strcat(msg, "'"); count++; } } fparse_yyerror(msg); free(msg); } else fparse_yyerror ("parse error; also virtual memory exceeded"); } else #endif /* YYERROR_VERBOSE */ fparse_yyerror("parse error"); } goto fparse_yyerrlab1; fparse_yyerrlab1: /* here on error raised explicitly by an action */ if (fparse_yyerrstatus == 3) { /* if just tried and failed to reuse lookahead token after an error, discard it. */ /* return failure if at end of input */ if (fparse_yychar == YYEOF) YYABORT; #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Discarding token %d (%s).\n", fparse_yychar, fparse_yytname[fparse_yychar1]); #endif fparse_yychar = YYEMPTY; } /* Else will try to reuse lookahead token after shifting the error token. */ fparse_yyerrstatus = 3; /* Each real token shifted decrements this */ goto fparse_yyerrhandle; fparse_yyerrdefault: /* current state does not do anything special for the error token. */ #if 0 /* This is wrong; only states that explicitly want error tokens should shift them. */ fparse_yyn = fparse_yydefact[fparse_yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ if (fparse_yyn) goto fparse_yydefault; #endif fparse_yyerrpop: /* pop the current state because it cannot handle the error token */ if (fparse_yyssp == fparse_yyss) YYABORT; fparse_yyvsp--; fparse_yystate = *--fparse_yyssp; #ifdef YYLSP_NEEDED fparse_yylsp--; #endif #if YYDEBUG != 0 if (fparse_yydebug) { short *ssp1 = fparse_yyss - 1; fprintf (stderr, "Error: state stack now"); while (ssp1 != fparse_yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif fparse_yyerrhandle: fparse_yyn = fparse_yypact[fparse_yystate]; if (fparse_yyn == YYFLAG) goto fparse_yyerrdefault; fparse_yyn += YYTERROR; if (fparse_yyn < 0 || fparse_yyn > YYLAST || fparse_yycheck[fparse_yyn] != YYTERROR) goto fparse_yyerrdefault; fparse_yyn = fparse_yytable[fparse_yyn]; if (fparse_yyn < 0) { if (fparse_yyn == YYFLAG) goto fparse_yyerrpop; fparse_yyn = -fparse_yyn; goto fparse_yyreduce; } else if (fparse_yyn == 0) goto fparse_yyerrpop; if (fparse_yyn == YYFINAL) YYACCEPT; #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Shifting error token, "); #endif *++fparse_yyvsp = fparse_yylval; #ifdef YYLSP_NEEDED *++fparse_yylsp = fparse_yylloc; #endif fparse_yystate = fparse_yyn; goto fparse_yynewstate; } #line 279 "../parse.y" /* more c */ geomview-1.9.5/src/lib/fexpr/real.c0000644000175000017500000000312412310110177014032 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "fexpr.h" double freal_cot(double a) { return cos(a)/sin(a); } double freal_sec(double a) { return 1/cos(a); } double freal_csc(double a) { return 1/sin(a); } double freal_re(double a) { return a; } double freal_im(double a) { (void)a; return 0; } double freal_monstub(double a) { double b = 0.0; double c = 0.0; (void)a; return b/c; } double freal_binstub(double a1, double a2) { double a = 0.0; double b = 0.0; (void)a1; (void)a2; return a/b; } geomview-1.9.5/src/lib/fexpr/vars.c0000644000175000017500000000434612310110200014054 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "fexpr.h" #include #include expr_var expr_create_variable(struct expression *e, char *name, double val) { int i; if (e->varnames) for (i=0; invars; i++) if (!strcmp(e->varnames[i], name)) { e->varvals[i].real = val; return i; } if (e->nvars) { e->varnames = realloc(e->varnames, (1+e->nvars)*sizeof(char *)); e->varvals = realloc (e->varvals, (1+e->nvars)*sizeof(fcomplex)); } else { e->varnames = malloc ((e->nvars+1)*sizeof(char *)); e->varvals = malloc ((e->nvars+1) * sizeof(fcomplex)); } e->varnames[e->nvars] = malloc(strlen(name)+1); strcpy (e->varnames[e->nvars],name); e->varvals[e->nvars].real = val; e->varvals[e->nvars].imag = 0; return e->nvars++; } void expr_set_variable(struct expression *e, expr_var v, double val) { e->varvals[v].real = val; } double expr_get_variable(struct expression *e, expr_var v) { return e->varvals[v].real; } void expr_set_variable_complex(struct expression *e, expr_var v, fcomplex*val) { e->varvals[v] = *val; } void expr_get_variable_complex(struct expression *e, expr_var v,fcomplex *op) { *op = e->varvals[v]; } geomview-1.9.5/src/lib/fexpr/fexpr.h0000644000175000017500000001434312310110200014230 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* expression, version 1.0 */ typedef int expr_var; typedef struct { double real; double imag; } fcomplex; struct expression { int nvars; char **varnames; fcomplex *varvals; int nelem; /* number of elements in the vector. */ struct expr_elem *elems; }; typedef double (*func_double)(double); typedef double (*func_double_double)(double, double); typedef void (*func_complex)(const fcomplex *source, fcomplex*result); typedef void (*func_complex_complex)(const fcomplex *source1, const fcomplex *source2, fcomplex*result); struct expr_elem { enum expr_op { MONOP, BINOP, MONFUNC, BINFUNC, PUSHVAR, PUSHNUM } op; union { struct { char op; } monop; struct { char op; } binop; struct { func_double func; func_complex cfunc; } monfunc; struct { func_double_double func; func_complex_complex cfunc; } binfunc; struct { int varnum; } pushvar; struct { double number; } pushnum; } u; }; extern struct expression *expr_new(void); extern void expr_free(struct expression *); extern char *expr_parse(struct expression *expr, char *e); extern double expr_evaluate(struct expression *e); extern void expr_evaluate_some(struct expression *e, expr_var v, double min, double max, int npoints, double *buffer); extern void expr_evaluate_complex(struct expression *e, fcomplex *op); extern expr_var expr_create_variable(struct expression *e, char *name, double val); extern void expr_set_variable(struct expression *e, expr_var v, double val); extern void expr_set_variable_complex(struct expression *e, expr_var v, fcomplex *val); extern double expr_get_variable(struct expression *e, expr_var v); extern void expr_get_variable_complex(struct expression *e, expr_var v, fcomplex *op); extern void expr_copy_variables(struct expression *source, struct expression *dest); extern struct expr_monfunc { char *name; func_double func; func_complex cfunc; } expr_monfuncs[]; extern struct expr_binfunc { char *name; func_double_double func; func_complex_complex cfunc; } expr_binfuncs[]; extern void fcomplex_re(const fcomplex *, fcomplex *); extern void fcomplex_im(const fcomplex *, fcomplex *); extern void fcomplex_abs(const fcomplex *, fcomplex *); extern void fcomplex_log(const fcomplex *, fcomplex *); extern void fcomplex_log10(const fcomplex *, fcomplex *); extern void fcomplex_sqrt(const fcomplex *, fcomplex *); extern void fcomplex_cos(const fcomplex *, fcomplex *); extern void fcomplex_arccos(const fcomplex *, fcomplex *); extern void fcomplex_sin(const fcomplex *, fcomplex *); extern void fcomplex_arcsin(const fcomplex *, fcomplex *); extern void fcomplex_tan(const fcomplex *, fcomplex *); extern void fcomplex_arctan(const fcomplex *, fcomplex *); extern void fcomplex_cot(const fcomplex *, fcomplex *); extern void fcomplex_sec(const fcomplex *, fcomplex *); extern void fcomplex_csc(const fcomplex *, fcomplex *); extern void fcomplex_cosh(const fcomplex *, fcomplex *); extern void fcomplex_sinh(const fcomplex *, fcomplex *); extern void fcomplex_tanh(const fcomplex *, fcomplex *); extern void fcomplex_arccosh(const fcomplex *, fcomplex *); extern void fcomplex_arcsinh(const fcomplex *, fcomplex *); extern void fcomplex_arctanh(const fcomplex *, fcomplex *); extern void fcomplex_floor(const fcomplex *, fcomplex *); extern void fcomplex_round(const fcomplex *, fcomplex *); extern void fcomplex_ceiling(const fcomplex *, fcomplex *); extern void fcomplex_exp(const fcomplex *, fcomplex *); extern void fcomplex_pow(const fcomplex *, const fcomplex *, fcomplex *); extern void fcomplex_atan2(const fcomplex *, const fcomplex *, fcomplex *); extern double freal_re(double); extern double freal_im(double); extern double freal_cot(double); extern double freal_sec(double); extern double freal_csc(double); extern void fcomplex_monstub(const fcomplex *,fcomplex *); extern void fcomplex_binstub(const fcomplex *, const fcomplex *, fcomplex *); extern double freal_monstub(double); extern double freal_binstub(double,double); #define DEFAULT_EXPR_MONFUNCS \ {"re", freal_re, fcomplex_re}, \ {"im", freal_im, fcomplex_im}, \ {"abs", fabs, fcomplex_abs}, \ {"log", log, fcomplex_log}, \ {"log10", log10, fcomplex_log10}, \ {"sqrt", sqrt, fcomplex_sqrt}, \ {"cos", cos, fcomplex_cos}, \ {"arccos", acos, fcomplex_arccos}, \ {"sin", sin, fcomplex_sin}, \ {"arcsin", asin, fcomplex_arcsin}, \ {"tan", tan, fcomplex_tan}, \ {"arctan", atan, fcomplex_arctan}, \ {"cot", freal_cot, fcomplex_cot}, \ {"sec", freal_sec, fcomplex_sec}, \ {"csc", freal_csc, fcomplex_csc}, \ {"cosh", cosh, fcomplex_cosh}, \ {"sinh", sinh, fcomplex_sinh}, \ {"tanh", tanh, fcomplex_tanh}, \ {"arccosh", acosh, fcomplex_arccosh}, \ {"arcsinh", asinh, fcomplex_arcsinh}, \ {"arctanh", atanh, fcomplex_arctanh}, \ {"floor", floor, fcomplex_floor}, \ {"round", rint, fcomplex_round}, \ {"ceiling", ceil, fcomplex_ceiling}, \ {"exp", exp, fcomplex_exp} #define DEFAULT_EXPR_BINFUNCS \ {"pow", pow, fcomplex_pow}, \ {"arctan2", atan2, fcomplex_atan2} geomview-1.9.5/src/lib/fexpr/parse.tab.h0000644000175000017500000000207312310110177014775 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ typedef union { char *string; struct expr_tree *expression; double number; } YYSTYPE; #define IDENT 258 #define NUMBER 259 #define MINUS 260 extern YYSTYPE fparse_yylval; geomview-1.9.5/src/lib/fexpr/fexprnew.h0000644000175000017500000001410312310110177014751 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* $Id: fexprnew.h,v 1.2 2000/09/01 22:38:09 mphillips Exp $ */ /* new fast expression library! wheee! */ #ifndef fexpr_h_included #define fexpr_h_included typedef enum { FNONE, FREAL, FCOMPLEX, FDERIV, FRDERIV } ftype; struct fexpression { struct fcode *code; struct ffunctable *funcs; ftype type; }; typedef struct { double real,imag; } fcomplex; struct fcode; /* forward reference */ typedef struct fvalue_struct fvalue; typedef struct { int nderivs; fvalue *values; } fjet; struct fvalue_struct { ftype type; union fval_union { fcomplex complex; double real; fjet deriv; } value; }; typedef struct { struct { double (*real)(int nargs, double *args, void *); void *data; } r; struct { void (*complex)(int nargs, fcomplex *args, fcomplex *op, void *); void *data; } c; struct { void (*deriv)(int nargs, fjet *args, fjet *op, void *data); void *data; } d; } fevalfunc; struct ffuncstruct { char *name; fevalfunc function; int nargs; }; #if 0 struct ffunctableent { char *name; fevalfunc function; int nargs; /* negative if we don't * care. otherwise, the only numbers * of arguments this will take. 0 * means probably is just a constant * variable. */ }; #endif #if 0 struct ffunctiontableent { char *name; ftype type; void *function; int nargs; }; #endif struct fcode { int ninsts; struct finst { enum { FIFUNC, FINUMBER } type; union { struct { int nargs; struct ffuncstruct ent; /* functions are null if they haven't been linked. */ } func; fvalue number; } u; } *insts; }; struct ffunctable { int nents; struct ffuncstruct *ents; struct ffunctable *next; }; #if 0 typedef struct ffunctiontableent ffunctiontable[]; #endif /* functions */ /* operates on a whole bundle -- for simple users */ extern struct fexpression *fnew_expr(ftype); extern char *fexpr_parse(struct fexpression *, char *); extern fvalue *fexpr_getvar(struct fexpression *, char *name); extern void fexpr_evaluate(struct fexpression *, fvalue *op); extern void fexpr_free(struct fexpression *); extern void fexpr_cleanup(void); /* run at end of program */ /* code functions */ extern struct fcode *fnew_code(void); extern char *fcode_parse(struct fcode *, char *); extern int fcode_link(struct fcode *, struct ffunctable *, ftype); extern void fcode_run(struct fcode *, ftype, fvalue *op, ...); extern void fcode_free(struct fcode *); extern void fapplyv(struct ffuncstruct *, ftype, fvalue *op, int nargs, ...); extern void fapply(struct ffuncstruct *, ftype, int nargs, fvalue *args, fvalue *op); /* func functions */ extern struct ffunctable *fnew_func(void); extern struct ffunctable *fnew_func_with_defaults(void); extern fvalue *ffunc_getvar(struct ffunctable *, char *, ftype); extern struct ffuncstruct *ffunc_findfunc(struct ffunctable *, char *, ftype, int); extern void ffunc_free(struct ffunctable *); extern struct ffuncstruct *ffunc_create(struct ffunctable *, char *, fevalfunc, int); extern void ffunc_free_builtins(void); /* value functions */ extern void fvalue_free(fvalue *); extern void fvalue_free_parts(fvalue *); extern void fvalue_from_double(fvalue *,ftype,double); extern int fvalue_iszero(fvalue *); extern int fvalue_isone(fvalue *); #ifdef EOF extern void fvalue_print(FILE *,fvalue *); #endif /* miscelaneous other things */ extern fvalue *fderiv_variable; /* default functions and constants */ extern struct ffunctable *fbuiltins; extern void fbuiltins_build(); /* internal stuff */ extern char *fparse_code_internal(struct fcode *, char *); extern void fparse_set_string(char *); extern int fparse_yyparse(void); extern void fparse_yyerror(char *); extern int fparse_yylex(void); #ifdef MNEM extern void fparse_free_dat_int(int, void *, int); #else extern void fparse_free_dat(void *, int); #endif /* external stuff. user defines this, if e wants to change it. default * is to just print on stderr. */ extern void fexpr_error(char *); #define FBUF_SIZE 1024 #if defined (FCOMPAT) /* compatibility stuff. don't use this, as it might be removed soon. */ struct expression { ftype type; struct fcode *code; struct ffunctable *funcs; }; typedef char *expr_var; /* just the name */ extern struct expression *expr_new(ftype type); extern void expr_free(struct expression *); extern char *expr_parse(struct expression *expr, char *e); extern double expr_evaluate(struct expression *e); extern void expr_evaluate_some(struct expression *e, expr_var v, double min, double max, int npoints, double *buffer); extern void expr_evaluate_complex(struct expression *e, fcomplex *op); extern expr_var expr_create_variable(struct expression *e, char *name, double val); extern void expr_set_variable(struct expression *e, expr_var v, double val); extern void expr_set_variable_complex(struct expression *e, expr_var v, fcomplex *val); extern double expr_get_variable(struct expression *e, expr_var v); extern void expr_get_variable_complex(struct expression *e, expr_var v, fcomplex *op); extern void expr_copy_variables(struct expression *source, struct expression *dest); #endif /* fcompat */ #endif /* fexpr_h_included */ geomview-1.9.5/src/lib/fexpr/Headers0000644000175000017500000000002412310110177014235 00000000000000fexpr.h fexprnew.h geomview-1.9.5/src/lib/fexpr/parse.tab.c-saved0000644000175000017500000007753412310110177016106 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* A Bison parser, made from ../parse.y with Bison version GNU Bison version 1.24 */ #define YYBISON 1 /* Identify Bison output. */ #define IDENT 258 #define NUMBER 259 #define MINUS 260 #line 1 "../parse.y" #include "fexpr.h" #include #include #include #include extern void fparse_yyerror(char *); extern int fparse_yyparse(); extern int fparse_yyrestart(void *); extern void expr_lex_reset_input(char *buf); extern int fparse_yylex(void); #define YYDEBUG 1 struct expr_tree { struct expr_elem elem; struct expr_tree *sub1; struct expr_tree *sub2; }; struct expr_tree *expr_parsed; struct expression *expr_current; static struct expr_parse_free { void *dat; struct expr_parse_free *next; } *freers = NULL; static void expr_free_dat(void *dat) { struct expr_parse_free *f; f=malloc(sizeof(struct expr_parse_free)); f->next=freers; freers=f; f->dat = dat; } static void expr_free_freers() { struct expr_parse_free *f, *next=NULL; for (f=freers; f; f=next) { next = f->next; free(f->dat); free(f); } freers = NULL; } static void expr_free_freers_no_dat() { struct expr_parse_free *f, *next=NULL; for (f=freers; f; f=next) { next = f->next; free(f); } freers = NULL; } static int count_nodes(struct expr_tree *e) { if (!e) return 0; return count_nodes(e->sub1) + count_nodes(e->sub2) + 1; } static void store_nodes(struct expr_tree *e, int *pos) { if (!e) return; store_nodes(e->sub2, pos); store_nodes(e->sub1, pos); expr_current->elems[*pos] = e->elem; (*pos)++; } static char *error_return; char *expr_parse(struct expression *expr, char *str) { int i; error_return = NULL; expr_current = expr; if (!str || !*str) return "Empty expression"; expr_lex_reset_input(str); i = fparse_yyparse(); /* do all the work. */ fparse_yyrestart(NULL); /* clean up so we can do this again. */ if (i) { expr_free_freers(); return "Parse error"; } if (error_return) { expr_free_freers(); return error_return; } expr_free_freers_no_dat(); /* ok. now we convert the parsed expression to a execution vector. whee. */ expr->nelem = count_nodes(expr_parsed); expr->elems = malloc (expr->nelem * sizeof (struct expr_elem)); /* we let i be a counter variable for where we're writing in * the vectorized expression. */ i = 0; store_nodes(expr_parsed, &i); return NULL; } static struct expr_monfunc lookup_monfunc(char *s) { struct expr_monfunc *i; static struct expr_monfunc fail = { NULL, NULL, NULL }; for (i=expr_monfuncs; i->name; i++) if (!strcmp(i->name,s)) return *i; { static char buf[1024]; sprintf(buf,"Undefined unary function: %s",s); error_return = buf; } return fail; } static struct expr_binfunc lookup_binfunc(char *s) { struct expr_binfunc *i; static struct expr_binfunc fail = { NULL, NULL, NULL }; for (i=expr_binfuncs; i->name; i++) if (!strcmp(i->name,s)) return *i; { static char buf[1024]; sprintf(buf,"Undefined binary function: %s",s); error_return = buf; } return fail; } static struct expr_tree *expr_parse_monop(int opr, struct expr_tree *sub) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = MONOP; op->elem.u.monop.op = opr; op->sub1 = sub; expr_free_dat(op); return op; } static struct expr_tree *expr_parse_binop(int opr, struct expr_tree *sub1, struct expr_tree *sub2) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = BINOP; op->elem.u.binop.op = opr; op->sub1 = sub1; op->sub2 = sub2; expr_free_dat(op); return op; } static struct expr_tree *expr_parse_monfunc(struct expr_monfunc f, struct expr_tree *sub1) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = MONFUNC; op->elem.u.monfunc.func = f.func; op->elem.u.monfunc.cfunc = f.cfunc; op->sub1 = sub1; expr_free_dat(op); return op; } static struct expr_tree *expr_parse_binfunc(struct expr_binfunc f, struct expr_tree *sub1, struct expr_tree *sub2) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = BINFUNC; op->elem.u.binfunc.func = f.func; op->elem.u.binfunc.cfunc = f.cfunc; op->sub1 = sub1; op->sub2 = sub2; expr_free_dat(op); return op; } static struct expr_tree *expr_parse_var(char *s) { struct expr_tree *op; int i=0; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.u.pushvar.varnum = -1; op->elem.op = PUSHVAR; for (i=0; invars; i++) if (!strcmp(expr_current->varnames[i], s)) op->elem.u.pushvar.varnum = i; if (op->elem.u.pushvar.varnum == -1) { static char buf[1024]; sprintf(buf,"Undefined variable: %s", s); error_return = buf; } expr_free_dat(op); return op; } static struct expr_tree *expr_parse_num(double d) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = PUSHNUM; op->elem.u.pushnum.number = d; expr_free_dat(op); return op; } void fparse_yyerror(char *errorstr) { error_return = errorstr; } #line 246 "../parse.y" typedef union { char *string; struct expr_tree *expression; double number; } YYSTYPE; #ifndef YYLTYPE typedef struct fparse_yyltype { int timestamp; int first_line; int first_column; int last_line; int last_column; char *text; } fparse_yyltype; #define YYLTYPE fparse_yyltype #endif #include #ifndef __cplusplus #ifndef __STDC__ #define const #endif #endif #define YYFINAL 25 #define YYFLAG -32768 #define YYNTBASE 13 #define YYTRANSLATE(x) ((unsigned)(x) <= 260 ? fparse_yytranslate[x] : 15) static const char fparse_yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, 9, 5, 12, 6, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 7 }; #if YYDEBUG != 0 static const short fparse_yyprhs[] = { 0, 0, 2, 6, 10, 14, 18, 22, 25, 30, 37, 39 }; static const short fparse_yyrhs[] = { 14, 0, 10, 14, 11, 0, 14, 5, 14, 0, 14, 6, 14, 0, 14, 9, 14, 0, 14, 8, 14, 0, 6, 14, 0, 3, 10, 14, 11, 0, 3, 10, 14, 12, 14, 11, 0, 3, 0, 4, 0 }; #endif #if YYDEBUG != 0 static const short fparse_yyrline[] = { 0, 263, 265, 267, 268, 269, 270, 271, 272, 273, 274, 275 }; static const char * const fparse_yytname[] = { "$","error","$undefined.","IDENT", "NUMBER","'+'","'-'","MINUS","'/'","'*'","'('","')'","','","totexpression","expr", "" }; #endif static const short fparse_yyr1[] = { 0, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14 }; static const short fparse_yyr2[] = { 0, 1, 3, 3, 3, 3, 3, 2, 4, 6, 1, 1 }; static const short fparse_yydefact[] = { 0, 10, 11, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 2, 3, 4, 6, 5, 8, 0, 0, 9, 0, 0, 0 }; static const short fparse_yydefgoto[] = { 23, 5 }; static const short fparse_yypact[] = { 17, -8,-32768, 17, 17, 34, 17, -4, 20, 17, 17, 17, 17, 7,-32768, -4, -4,-32768,-32768,-32768, 17, 27,-32768, 10, 11,-32768 }; static const short fparse_yypgoto[] = {-32768, -3 }; #define YYLAST 43 static const short fparse_yytable[] = { 7, 8, 6, 13, 11, 12, 15, 16, 17, 18, 24, 25, 9, 10, 0, 11, 12, 21, 19, 20, 1, 2, 0, 3, 0, 9, 10, 4, 11, 12, 0, 14, 9, 10, 0, 11, 12, 0, 22, 9, 10, 0, 11, 12 }; static const short fparse_yycheck[] = { 3, 4, 10, 6, 8, 9, 9, 10, 11, 12, 0, 0, 5, 6, -1, 8, 9, 20, 11, 12, 3, 4, -1, 6, -1, 5, 6, 10, 8, 9, -1, 11, 5, 6, -1, 8, 9, -1, 11, 5, 6, -1, 8, 9 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/local/lib/bison.simple" /* Skeleton output parser for bison, Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* As a special exception, when this file is copied by Bison into a Bison output file, you may use that output file without restriction. This special exception was added by the Free Software Foundation in version 1.24 of Bison. */ #ifndef alloca #ifdef __GNUC__ #define alloca __builtin_alloca #else /* not GNU C. */ #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) #include #else /* not sparc */ #if defined (MSDOS) && !defined (__TURBOC__) #include #else /* not MSDOS, or __TURBOC__ */ #if defined(_AIX) #include #pragma alloca #else /* not MSDOS, __TURBOC__, or _AIX */ #ifdef __hpux #ifdef __cplusplus extern "C" { void *alloca (unsigned int); }; #else /* not __cplusplus */ void *alloca (); #endif /* not __cplusplus */ #endif /* __hpux */ #endif /* not _AIX */ #endif /* not MSDOS, or __TURBOC__ */ #endif /* not sparc. */ #endif /* not GNU C. */ #endif /* alloca not defined. */ /* This is the parser code that is written into each bison parser when the %semantic_parser declaration is not specified in the grammar. It was written by Richard Stallman by simplifying the hairy parser used when %semantic_parser is specified. */ /* Note: there must be only one dollar sign in this file. It is replaced by the list of actions, each action as one case of the switch. */ #define fparse_yyerrok (fparse_yyerrstatus = 0) #define fparse_yyclearin (fparse_yychar = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 #define YYACCEPT return(0) #define YYABORT return(1) #define YYERROR goto fparse_yyerrlab1 /* Like YYERROR except do call fparse_yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto fparse_yyerrlab #define YYRECOVERING() (!!fparse_yyerrstatus) #define YYBACKUP(token, value) \ do \ if (fparse_yychar == YYEMPTY && fparse_yylen == 1) \ { fparse_yychar = (token), fparse_yylval = (value); \ fparse_yychar1 = YYTRANSLATE (fparse_yychar); \ YYPOPSTACK; \ goto fparse_yybackup; \ } \ else \ { fparse_yyerror ("syntax error: cannot back up"); YYERROR; } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 #ifndef YYPURE #define YYLEX fparse_yylex() #endif #ifdef YYPURE #ifdef YYLSP_NEEDED #ifdef YYLEX_PARAM #define YYLEX fparse_yylex(&fparse_yylval, &fparse_yylloc, YYLEX_PARAM) #else #define YYLEX fparse_yylex(&fparse_yylval, &fparse_yylloc) #endif #else /* not YYLSP_NEEDED */ #ifdef YYLEX_PARAM #define YYLEX fparse_yylex(&fparse_yylval, YYLEX_PARAM) #else #define YYLEX fparse_yylex(&fparse_yylval) #endif #endif /* not YYLSP_NEEDED */ #endif /* If nonreentrant, generate the variables here */ #ifndef YYPURE int fparse_yychar; /* the lookahead symbol */ YYSTYPE fparse_yylval; /* the semantic value of the */ /* lookahead symbol */ #ifdef YYLSP_NEEDED YYLTYPE fparse_yylloc; /* location data for the lookahead */ /* symbol */ #endif int fparse_yynerrs; /* number of parse errors so far */ #endif /* not YYPURE */ #if YYDEBUG != 0 int fparse_yydebug; /* nonzero means print parse trace */ /* Since this is uninitialized, it does not stop multiple parsers from coexisting. */ #endif /* YYINITDEPTH indicates the initial size of the parser's stacks */ #ifndef YYINITDEPTH #define YYINITDEPTH 200 #endif /* YYMAXDEPTH is the maximum size the stacks can grow to (effective only if the built-in stack extension method is used). */ #if YYMAXDEPTH == 0 #undef YYMAXDEPTH #endif #ifndef YYMAXDEPTH #define YYMAXDEPTH 10000 #endif /* Prevent warning if -Wstrict-prototypes. */ #ifdef __GNUC__ int fparse_yyparse (void); #endif #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ #define __fparse_yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) #else /* not GNU C or C++ */ #ifndef __cplusplus /* This is the most reliable way to avoid incompatibilities in available built-in functions on various systems. */ static void __fparse_yy_memcpy (from, to, count) char *from; char *to; int count; { register char *f = from; register char *t = to; register int i = count; while (i-- > 0) *t++ = *f++; } #else /* __cplusplus */ /* This is the most reliable way to avoid incompatibilities in available built-in functions on various systems. */ static void __fparse_yy_memcpy (char *from, char *to, int count) { register char *f = from; register char *t = to; register int i = count; while (i-- > 0) *t++ = *f++; } #endif #endif #line 192 "/usr/local/lib/bison.simple" /* The user can define YYPARSE_PARAM as the name of an argument to be passed into fparse_yyparse. The argument should have type void *. It should actually point to an object. Grammar actions can access the variable by casting it to the proper pointer type. */ #ifdef YYPARSE_PARAM #define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; #else #define YYPARSE_PARAM #define YYPARSE_PARAM_DECL #endif int fparse_yyparse(YYPARSE_PARAM) YYPARSE_PARAM_DECL { register int fparse_yystate; register int fparse_yyn; register short *fparse_yyssp; register YYSTYPE *fparse_yyvsp; int fparse_yyerrstatus; /* number of tokens to shift before error messages enabled */ int fparse_yychar1 = 0; /* lookahead token as an internal (translated) token number */ short fparse_yyssa[YYINITDEPTH]; /* the state stack */ YYSTYPE fparse_yyvsa[YYINITDEPTH]; /* the semantic value stack */ short *fparse_yyss = fparse_yyssa; /* refer to the stacks thru separate pointers */ YYSTYPE *fparse_yyvs = fparse_yyvsa; /* to allow fparse_yyoverflow to reallocate them elsewhere */ #ifdef YYLSP_NEEDED YYLTYPE fparse_yylsa[YYINITDEPTH]; /* the location stack */ YYLTYPE *fparse_yyls = fparse_yylsa; YYLTYPE *fparse_yylsp; #define YYPOPSTACK (fparse_yyvsp--, fparse_yyssp--, fparse_yylsp--) #else #define YYPOPSTACK (fparse_yyvsp--, fparse_yyssp--) #endif int fparse_yystacksize = YYINITDEPTH; #ifdef YYPURE int fparse_yychar; YYSTYPE fparse_yylval; int fparse_yynerrs; #ifdef YYLSP_NEEDED YYLTYPE fparse_yylloc; #endif #endif YYSTYPE fparse_yyval; /* the variable used to return */ /* semantic values from the action */ /* routines */ int fparse_yylen; #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Starting parse\n"); #endif fparse_yystate = 0; fparse_yyerrstatus = 0; fparse_yynerrs = 0; fparse_yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ fparse_yyssp = fparse_yyss - 1; fparse_yyvsp = fparse_yyvs; #ifdef YYLSP_NEEDED fparse_yylsp = fparse_yyls; #endif /* Push a new state, which is found in fparse_yystate . */ /* In all cases, when you get here, the value and location stacks have just been pushed. so pushing a state here evens the stacks. */ fparse_yynewstate: *++fparse_yyssp = fparse_yystate; if (fparse_yyssp >= fparse_yyss + fparse_yystacksize - 1) { /* Give user a chance to reallocate the stack */ /* Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *fparse_yyvs1 = fparse_yyvs; short *fparse_yyss1 = fparse_yyss; #ifdef YYLSP_NEEDED YYLTYPE *fparse_yyls1 = fparse_yyls; #endif /* Get the current used size of the three stacks, in elements. */ int size = fparse_yyssp - fparse_yyss + 1; #ifdef fparse_yyoverflow /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. */ #ifdef YYLSP_NEEDED /* This used to be a conditional around just the two extra args, but that might be undefined if fparse_yyoverflow is a macro. */ fparse_yyoverflow("parser stack overflow", &fparse_yyss1, size * sizeof (*fparse_yyssp), &fparse_yyvs1, size * sizeof (*fparse_yyvsp), &fparse_yyls1, size * sizeof (*fparse_yylsp), &fparse_yystacksize); #else fparse_yyoverflow("parser stack overflow", &fparse_yyss1, size * sizeof (*fparse_yyssp), &fparse_yyvs1, size * sizeof (*fparse_yyvsp), &fparse_yystacksize); #endif fparse_yyss = fparse_yyss1; fparse_yyvs = fparse_yyvs1; #ifdef YYLSP_NEEDED fparse_yyls = fparse_yyls1; #endif #else /* no fparse_yyoverflow */ /* Extend the stack our own way. */ if (fparse_yystacksize >= YYMAXDEPTH) { fparse_yyerror("parser stack overflow"); return 2; } fparse_yystacksize *= 2; if (fparse_yystacksize > YYMAXDEPTH) fparse_yystacksize = YYMAXDEPTH; fparse_yyss = (short *) alloca (fparse_yystacksize * sizeof (*fparse_yyssp)); __fparse_yy_memcpy ((char *)fparse_yyss1, (char *)fparse_yyss, size * sizeof (*fparse_yyssp)); fparse_yyvs = (YYSTYPE *) alloca (fparse_yystacksize * sizeof (*fparse_yyvsp)); __fparse_yy_memcpy ((char *)fparse_yyvs1, (char *)fparse_yyvs, size * sizeof (*fparse_yyvsp)); #ifdef YYLSP_NEEDED fparse_yyls = (YYLTYPE *) alloca (fparse_yystacksize * sizeof (*fparse_yylsp)); __fparse_yy_memcpy ((char *)fparse_yyls1, (char *)fparse_yyls, size * sizeof (*fparse_yylsp)); #endif #endif /* no fparse_yyoverflow */ fparse_yyssp = fparse_yyss + size - 1; fparse_yyvsp = fparse_yyvs + size - 1; #ifdef YYLSP_NEEDED fparse_yylsp = fparse_yyls + size - 1; #endif #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Stack size increased to %d\n", fparse_yystacksize); #endif if (fparse_yyssp >= fparse_yyss + fparse_yystacksize - 1) YYABORT; } #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Entering state %d\n", fparse_yystate); #endif goto fparse_yybackup; fparse_yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ /* fparse_yyresume: */ /* First try to decide what to do without reference to lookahead token. */ fparse_yyn = fparse_yypact[fparse_yystate]; if (fparse_yyn == YYFLAG) goto fparse_yydefault; /* Not known => get a lookahead token if don't already have one. */ /* fparse_yychar is either YYEMPTY or YYEOF or a valid token in external form. */ if (fparse_yychar == YYEMPTY) { #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Reading a token: "); #endif fparse_yychar = YYLEX; } /* Convert token to internal form (in fparse_yychar1) for indexing tables with */ if (fparse_yychar <= 0) /* This means end of input. */ { fparse_yychar1 = 0; fparse_yychar = YYEOF; /* Don't call YYLEX any more */ #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Now at end of input.\n"); #endif } else { fparse_yychar1 = YYTRANSLATE(fparse_yychar); #if YYDEBUG != 0 if (fparse_yydebug) { fprintf (stderr, "Next token is %d (%s", fparse_yychar, fparse_yytname[fparse_yychar1]); /* Give the individual parser a way to print the precise meaning of a token, for further debugging info. */ #ifdef YYPRINT YYPRINT (stderr, fparse_yychar, fparse_yylval); #endif fprintf (stderr, ")\n"); } #endif } fparse_yyn += fparse_yychar1; if (fparse_yyn < 0 || fparse_yyn > YYLAST || fparse_yycheck[fparse_yyn] != fparse_yychar1) goto fparse_yydefault; fparse_yyn = fparse_yytable[fparse_yyn]; /* fparse_yyn is what to do for this token type in this state. Negative => reduce, -fparse_yyn is rule number. Positive => shift, fparse_yyn is new state. New state is final state => don't bother to shift, just return success. 0, or most negative number => error. */ if (fparse_yyn < 0) { if (fparse_yyn == YYFLAG) goto fparse_yyerrlab; fparse_yyn = -fparse_yyn; goto fparse_yyreduce; } else if (fparse_yyn == 0) goto fparse_yyerrlab; if (fparse_yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Shifting token %d (%s), ", fparse_yychar, fparse_yytname[fparse_yychar1]); #endif /* Discard the token being shifted unless it is eof. */ if (fparse_yychar != YYEOF) fparse_yychar = YYEMPTY; *++fparse_yyvsp = fparse_yylval; #ifdef YYLSP_NEEDED *++fparse_yylsp = fparse_yylloc; #endif /* count tokens shifted since error; after three, turn off error status. */ if (fparse_yyerrstatus) fparse_yyerrstatus--; fparse_yystate = fparse_yyn; goto fparse_yynewstate; /* Do the default action for the current state. */ fparse_yydefault: fparse_yyn = fparse_yydefact[fparse_yystate]; if (fparse_yyn == 0) goto fparse_yyerrlab; /* Do a reduction. fparse_yyn is the number of a rule to reduce with. */ fparse_yyreduce: fparse_yylen = fparse_yyr2[fparse_yyn]; if (fparse_yylen > 0) fparse_yyval = fparse_yyvsp[1-fparse_yylen]; /* implement default value of the action */ #if YYDEBUG != 0 if (fparse_yydebug) { int i; fprintf (stderr, "Reducing via rule %d (line %d), ", fparse_yyn, fparse_yyrline[fparse_yyn]); /* Print the symbols being reduced, and their result. */ for (i = fparse_yyprhs[fparse_yyn]; fparse_yyrhs[i] > 0; i++) fprintf (stderr, "%s ", fparse_yytname[fparse_yyrhs[i]]); fprintf (stderr, " -> %s\n", fparse_yytname[fparse_yyr1[fparse_yyn]]); } #endif switch (fparse_yyn) { case 1: #line 263 "../parse.y" { expr_parsed = fparse_yyvsp[0].expression; ; break;} case 2: #line 266 "../parse.y" { fparse_yyval.expression = fparse_yyvsp[-1].expression; ; break;} case 3: #line 267 "../parse.y" { fparse_yyval.expression = expr_parse_binop('+', fparse_yyvsp[-2].expression, fparse_yyvsp[0].expression); ; break;} case 4: #line 268 "../parse.y" { fparse_yyval.expression = expr_parse_binop('-', fparse_yyvsp[-2].expression, fparse_yyvsp[0].expression); ; break;} case 5: #line 269 "../parse.y" { fparse_yyval.expression = expr_parse_binop('*', fparse_yyvsp[-2].expression, fparse_yyvsp[0].expression); ; break;} case 6: #line 270 "../parse.y" { fparse_yyval.expression = expr_parse_binop('/', fparse_yyvsp[-2].expression, fparse_yyvsp[0].expression); ; break;} case 7: #line 271 "../parse.y" { fparse_yyval.expression = expr_parse_monop('-', fparse_yyvsp[0].expression); ; break;} case 8: #line 272 "../parse.y" { fparse_yyval.expression = expr_parse_monfunc(lookup_monfunc(fparse_yyvsp[-3].string), fparse_yyvsp[-1].expression); ; break;} case 9: #line 273 "../parse.y" { fparse_yyval.expression = expr_parse_binfunc(lookup_binfunc(fparse_yyvsp[-5].string), fparse_yyvsp[-3].expression, fparse_yyvsp[-1].expression); ; break;} case 10: #line 274 "../parse.y" { fparse_yyval.expression = expr_parse_var(fparse_yyvsp[0].string); ; break;} case 11: #line 275 "../parse.y" { fparse_yyval.expression = expr_parse_num(fparse_yyvsp[0].number); ; break;} } /* the action file gets copied in in place of this dollarsign */ #line 487 "/usr/local/lib/bison.simple" fparse_yyvsp -= fparse_yylen; fparse_yyssp -= fparse_yylen; #ifdef YYLSP_NEEDED fparse_yylsp -= fparse_yylen; #endif #if YYDEBUG != 0 if (fparse_yydebug) { short *ssp1 = fparse_yyss - 1; fprintf (stderr, "state stack now"); while (ssp1 != fparse_yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif *++fparse_yyvsp = fparse_yyval; #ifdef YYLSP_NEEDED fparse_yylsp++; if (fparse_yylen == 0) { fparse_yylsp->first_line = fparse_yylloc.first_line; fparse_yylsp->first_column = fparse_yylloc.first_column; fparse_yylsp->last_line = (fparse_yylsp-1)->last_line; fparse_yylsp->last_column = (fparse_yylsp-1)->last_column; fparse_yylsp->text = 0; } else { fparse_yylsp->last_line = (fparse_yylsp+fparse_yylen-1)->last_line; fparse_yylsp->last_column = (fparse_yylsp+fparse_yylen-1)->last_column; } #endif /* Now "shift" the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ fparse_yyn = fparse_yyr1[fparse_yyn]; fparse_yystate = fparse_yypgoto[fparse_yyn - YYNTBASE] + *fparse_yyssp; if (fparse_yystate >= 0 && fparse_yystate <= YYLAST && fparse_yycheck[fparse_yystate] == *fparse_yyssp) fparse_yystate = fparse_yytable[fparse_yystate]; else fparse_yystate = fparse_yydefgoto[fparse_yyn - YYNTBASE]; goto fparse_yynewstate; fparse_yyerrlab: /* here on detecting error */ if (! fparse_yyerrstatus) /* If not already recovering from an error, report this error. */ { ++fparse_yynerrs; #ifdef YYERROR_VERBOSE fparse_yyn = fparse_yypact[fparse_yystate]; if (fparse_yyn > YYFLAG && fparse_yyn < YYLAST) { int size = 0; char *msg; int x, count; count = 0; /* Start X at -fparse_yyn if nec to avoid negative indexes in fparse_yycheck. */ for (x = (fparse_yyn < 0 ? -fparse_yyn : 0); x < (sizeof(fparse_yytname) / sizeof(char *)); x++) if (fparse_yycheck[x + fparse_yyn] == x) size += strlen(fparse_yytname[x]) + 15, count++; msg = (char *) malloc(size + 15); if (msg != 0) { strcpy(msg, "parse error"); if (count < 5) { count = 0; for (x = (fparse_yyn < 0 ? -fparse_yyn : 0); x < (sizeof(fparse_yytname) / sizeof(char *)); x++) if (fparse_yycheck[x + fparse_yyn] == x) { strcat(msg, count == 0 ? ", expecting `" : " or `"); strcat(msg, fparse_yytname[x]); strcat(msg, "'"); count++; } } fparse_yyerror(msg); free(msg); } else fparse_yyerror ("parse error; also virtual memory exceeded"); } else #endif /* YYERROR_VERBOSE */ fparse_yyerror("parse error"); } goto fparse_yyerrlab1; fparse_yyerrlab1: /* here on error raised explicitly by an action */ if (fparse_yyerrstatus == 3) { /* if just tried and failed to reuse lookahead token after an error, discard it. */ /* return failure if at end of input */ if (fparse_yychar == YYEOF) YYABORT; #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Discarding token %d (%s).\n", fparse_yychar, fparse_yytname[fparse_yychar1]); #endif fparse_yychar = YYEMPTY; } /* Else will try to reuse lookahead token after shifting the error token. */ fparse_yyerrstatus = 3; /* Each real token shifted decrements this */ goto fparse_yyerrhandle; fparse_yyerrdefault: /* current state does not do anything special for the error token. */ #if 0 /* This is wrong; only states that explicitly want error tokens should shift them. */ fparse_yyn = fparse_yydefact[fparse_yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ if (fparse_yyn) goto fparse_yydefault; #endif fparse_yyerrpop: /* pop the current state because it cannot handle the error token */ if (fparse_yyssp == fparse_yyss) YYABORT; fparse_yyvsp--; fparse_yystate = *--fparse_yyssp; #ifdef YYLSP_NEEDED fparse_yylsp--; #endif #if YYDEBUG != 0 if (fparse_yydebug) { short *ssp1 = fparse_yyss - 1; fprintf (stderr, "Error: state stack now"); while (ssp1 != fparse_yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif fparse_yyerrhandle: fparse_yyn = fparse_yypact[fparse_yystate]; if (fparse_yyn == YYFLAG) goto fparse_yyerrdefault; fparse_yyn += YYTERROR; if (fparse_yyn < 0 || fparse_yyn > YYLAST || fparse_yycheck[fparse_yyn] != YYTERROR) goto fparse_yyerrdefault; fparse_yyn = fparse_yytable[fparse_yyn]; if (fparse_yyn < 0) { if (fparse_yyn == YYFLAG) goto fparse_yyerrpop; fparse_yyn = -fparse_yyn; goto fparse_yyreduce; } else if (fparse_yyn == 0) goto fparse_yyerrpop; if (fparse_yyn == YYFINAL) YYACCEPT; #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Shifting error token, "); #endif *++fparse_yyvsp = fparse_yylval; #ifdef YYLSP_NEEDED *++fparse_yylsp = fparse_yylloc; #endif fparse_yystate = fparse_yyn; goto fparse_yynewstate; } #line 279 "../parse.y" /* more c */ geomview-1.9.5/src/lib/geomutil/0000755000175000017500000000000012310165603013530 500000000000000geomview-1.9.5/src/lib/geomutil/Makefile.in0000644000175000017500000005553312310165553015534 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geomutil DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man3dir = $(mandir)/man3 am__installdirs = "$(DESTDIR)$(man3dir)" NROFF = nroff MANS = $(man_MANS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir 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 DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = bdy crayplutil dim plutil man_MANS = geomutil.3gv EXTRA_DIST = $(man_MANS) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geomutil/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geomutil/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man3: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man3dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.3[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ done; } uninstall-man3: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man3dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.3[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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" cscopelist: cscopelist-recursive 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(MANS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(man3dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-man install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man3 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man3 .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man3 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-man uninstall-man3 # 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: geomview-1.9.5/src/lib/geomutil/Makefile.am0000644000175000017500000000012712310110200015463 00000000000000SUBDIRS = bdy crayplutil dim plutil man_MANS = geomutil.3gv EXTRA_DIST = $(man_MANS) geomview-1.9.5/src/lib/geomutil/geomutil.3gv0000644000175000017500000000177012310110200015702 00000000000000.TH geomutil 3gv "July 10, 1992" "Geometry Center" .SH NAME geomutil -\ various geometry utilities (introduction) .SH DESCRIPTION .PP The geomutil library contains a collection of miscellaneous geometric utility functions: .nf AnyToPL() - convert any geom to a polylist PLCombine() - combine two polylists into one PLConsol() - consolidate vertices in a polylist Bdy() - generate the boundary (edge) of a geom .fi Each function has its own manual page which gives usage details. .PP To link your program with the geomutil library you should specify -lgeomutil followed by the usual list of OOGL libraries, as in .nf cc -L${LIBDIR} prog.c -lgeomutil \\ -lstubdraw -lgeom -lvect -lpolylist -lquad \\ -lmesh -lbezier -linst -ltlist -llist -lstub \\ -lgeom -loogl -lbbox -lshade -lcolor -l3d -lm .fi .SH SEE ALSO .nf anytopl(3), plcombine(3), plconsol(3), bdy(3), anytooff(1), offcombine(1), offconsol(1), bdy(1), geomview(1) .fi .SH AUTHOR .nf Celeste Fowler The Geometry Center .fi geomview-1.9.5/src/lib/geomutil/bdy/0000755000175000017500000000000012310165603014306 500000000000000geomview-1.9.5/src/lib/geomutil/bdy/Makefile.in0000644000175000017500000005371712310165553016314 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geomutil/bdy DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libbdy_la_LIBADD = am_libbdy_la_OBJECTS = bdy.lo libbdy_la_OBJECTS = $(am_libbdy_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libbdy_la_SOURCES) DIST_SOURCES = $(libbdy_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man3dir = $(mandir)/man3 am__installdirs = "$(DESTDIR)$(man3dir)" NROFF = nroff MANS = $(man_MANS) 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) man_MANS = bdy.3gv EXTRA_DIST = Headers $(man_MANS) noinst_LTLIBRARIES = libbdy.la libbdy_la_SOURCES = \ bdy.c \ bdy.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geomutil/bdy/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geomutil/bdy/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libbdy.la: $(libbdy_la_OBJECTS) $(libbdy_la_DEPENDENCIES) $(EXTRA_libbdy_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libbdy_la_OBJECTS) $(libbdy_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bdy.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man3: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man3dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.3[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ done; } uninstall-man3: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man3dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.3[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man3dir)'; $(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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(MANS) installdirs: for dir in "$(DESTDIR)$(man3dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man3 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man3 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man3 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-man \ uninstall-man3 # 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: geomview-1.9.5/src/lib/geomutil/bdy/Makefile.am0000644000175000017500000000024212310110200016237 00000000000000INCLUDES = $(default_includes) man_MANS = bdy.3gv EXTRA_DIST = Headers $(man_MANS) noinst_LTLIBRARIES = libbdy.la libbdy_la_SOURCES = \ bdy.c \ bdy.h geomview-1.9.5/src/lib/geomutil/bdy/bdy.c0000644000175000017500000001076412310110200015137 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * bdy.c * author: Celeste Fowler * date: June 12, 1992 */ #include #include "geom.h" #include "polylistP.h" #include "ooglutil.h" #include "plutil.h" #include "bdy.h" #ifndef min # define min(a, b) ((a < b) ? a : b) #endif #ifndef max # define max(a, b) ((a > b) ? a : b) #endif static char msg[] = "bdy.c"; /* Precision. The global declaration is a hack to get the value out * of Bdy and into EdgeCmp where it is needed (EdgeCmp must be called by * qsort. */ static float precision; int EdgeCmp(HPoint3 **a, HPoint3 **b) { int d; float dist00, dist01, dist11, dist10; while (1) { dist00 = HPt3Distance(a[0], b[0]); dist01 = HPt3Distance(a[0], b[1]); dist11 = HPt3Distance(a[1], b[1]); dist10 = HPt3Distance(a[1], b[0]); if (dist00 > precision && dist01 > precision) break; if (dist11 > precision && dist10 > precision) break; if (dist00 < precision && dist11 > precision) break; if (dist01 < precision && dist10 > precision) break; if (dist11 < precision && dist00 > precision) break; if (dist10 < precision && dist01 > precision) break; return 0; } d = memcmp(a[0], b[0], sizeof(HPoint3)); if(d == 0) d = memcmp(a[1], b[1], sizeof(HPoint3)); return d; } Geom *Bdy(Geom *g, float prec) { int i, j, k; PolyList *p; int n_edges; HPoint3 **edges; Geom *vect; short *vcounts, *ccounts; Point3 *verts; ColorA color; g = (Geom *)AnyToPL(g, TM_IDENTITY); if (g == NULL) return NULL; precision = prec; /* Get a consolidated version of the polylist. */ p = (PolyList *)PLConsol(g, 0.0); GeomDelete(g); /* Count the number of edges in the polygon */ for (i = n_edges = 0; i < p->n_polys; i++) n_edges += p->p[i].n_vertices; /* Put the edges in an array and sort it */ edges = OOGLNewNE(HPoint3 *, 2 * n_edges, msg); for (i = k = 0; i < p->n_polys; i++) { for (j = 0; j < p->p[i].n_vertices; j++) { edges[k * 2] = (HPoint3 *) min(p->p[i].v[j], p->p[i].v[(j + 1) % p->p[i].n_vertices]); edges[k * 2 + 1] = (HPoint3 *) max(p->p[i].v[j], p->p[i].v[(j + 1) % p->p[i].n_vertices]); k++; } if (p->p[i].n_vertices == 2) k--; } n_edges = k; precision = 0.0; qsort(edges, n_edges, 2 * sizeof(HPoint3 *), (int (*)())EdgeCmp); precision = prec; /* Eliminate everything mentioned more than once */ for (i = j = k = 0; i < n_edges; i++) if (EdgeCmp(&edges[i*2], &edges[k*2])) { if (i == k + 1) { edges[j*2] = edges[k*2]; edges[j*2 + 1] = edges[k*2 + 1]; j++; } k = i; } if (i == k + 1) { edges[j*2] = edges[k*2]; edges[j*2 + 1] = edges[k*2 + 1]; j++; } if (!j) { OOGLFree(edges); GeomDelete((Geom *)p); return NULL; } /* Call the vect create routine */ vcounts = OOGLNewNE(short, j, msg); ccounts = OOGLNewNE(short, j, msg); verts = OOGLNewNE(Point3, j*2, msg); for (i = 0; i < j; i++) { vcounts[i] = 2; ccounts[i] = 0; Pt3Copy((const Point3 *)edges[i*2], &verts[i*2]); Pt3Copy((const Point3 *)edges[i*2 + 1], &verts[i*2 + 1]); } ccounts[0] = 1; color.r = 0.0; color.g = 0.0; color.b = 0.0; color.a = 1.0; vect = GeomCreate("vect", CR_NVECT, j, CR_VECTC, vcounts, CR_NVERT, j*2, CR_POINT, verts, CR_NCOLR, 1, CR_COLRC, ccounts, CR_COLOR, &color, CR_END); OOGLFree(ccounts); OOGLFree(vcounts); OOGLFree(edges); GeomDelete((Geom *)p); return vect; } geomview-1.9.5/src/lib/geomutil/bdy/bdy.h0000644000175000017500000000203512310110200015134 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * bdy.h * author: Celeste Fowler * date: June 12, 1992 */ #ifndef BDY_H #define BDY_H Geom *Bdy(Geom *g, float prec); #endif /* BDY_H */ geomview-1.9.5/src/lib/geomutil/bdy/Headers0000644000175000017500000000000612310110200015477 00000000000000bdy.h geomview-1.9.5/src/lib/geomutil/bdy/bdy.3gv0000644000175000017500000000223512310110200015406 00000000000000.TH bdy 3gv "June 15, 1992" "Geometry Center" .SH NAME bdy -\ boundary curve finder .SH SYNOPSIS #include "bdy.h" Geom *Bdy(Geom *, float prec); .SH DESCRIPTION .PP Bdy() is a function which takes a geom as its argument. The geom is then converted to a polylist, which is compressed (See plconsol(3). Bdy() then counts the number of edges in the polylist used once and only once, and returns a vector object containing these edges. The precision, prec, is used to determine the maximum distance between vertices which may be considered identical. If the vertices must have identical coordinates, this value should be set to 0.0. It is generally desirable to set the value somewhat higher to allow for round-off error. .PP The vector object is always black. .SH BUGS The vector object is not a particularly compact representation of itself, since it contains many 2-vertex segments which could be combined into a longer polyline. .SH LINKING Bdy() is part of the geomutil library; see geomutil(3) for information on how to link your program with this library. .SH SEE ALSO bdy(1), geomview(1), anytopl(3), geomutil(3) .SH AUTHOR .nf Celeste Fowler The Geometry Center .fi geomview-1.9.5/src/lib/geomutil/crayplutil/0000755000175000017500000000000012310165603015720 500000000000000geomview-1.9.5/src/lib/geomutil/crayplutil/Makefile.in0000644000175000017500000004763312310165553017726 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geomutil/crayplutil DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libcrayplutil_la_LIBADD = am_libcrayplutil_la_OBJECTS = crayBezier.lo crayInst.lo crayList.lo \ crayMesh.lo crayPolylist.lo crayNPolylist.lo crayQuad.lo \ crayVect.lo craySkel.lo crayola.lo libcrayplutil_la_OBJECTS = $(am_libcrayplutil_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libcrayplutil_la_SOURCES) DIST_SOURCES = $(libcrayplutil_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcrayplutil.la libcrayplutil_la_SOURCES = \ crayBezier.c crayInst.c crayList.c crayMesh.c\ crayPolylist.c crayNPolylist.c crayQuad.c crayVect.c craySkel.c\ crayola.c crayola.h crayolaP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geomutil/crayplutil/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geomutil/crayplutil/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libcrayplutil.la: $(libcrayplutil_la_OBJECTS) $(libcrayplutil_la_DEPENDENCIES) $(EXTRA_libcrayplutil_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libcrayplutil_la_OBJECTS) $(libcrayplutil_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayBezier.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayInst.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayMesh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayNPolylist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayPolylist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayQuad.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/craySkel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayVect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayola.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/geomutil/crayplutil/Makefile.am0000644000175000017500000000041212310110200017650 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcrayplutil.la libcrayplutil_la_SOURCES =\ crayBezier.c crayInst.c crayList.c crayMesh.c\ crayPolylist.c crayNPolylist.c crayQuad.c crayVect.c craySkel.c\ crayola.c crayola.h crayolaP.h geomview-1.9.5/src/lib/geomutil/crayplutil/crayBezier.c0000644000175000017500000001460712310110200020072 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "point3.h" #include "hpoint3.h" #include "geom.h" #include "bezierP.h" #include "crayolaP.h" #ifndef FUDGE #define FUDGE .1 #endif void *cray_bezier_HasVColor(int sel, Geom *geom, va_list *args); void *cray_bezier_UseVColor(int sel, Geom *geom, va_list *args); void *cray_bezier_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_bezier_SetColorAll(int sel, Geom *geom, va_list *args); void *cray_bezier_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_bezier_SetColorAtF(int sel, Geom *geom, va_list *args); void *cray_bezier_GetColorAt(int sel, Geom *geom, va_list *args); #define MAX_METHODS 10 static craySpecFunc methods[] = { {"crayHasColor", cray_bezier_HasVColor}, {"crayHasVColor", cray_bezier_HasVColor}, {"crayCanUseVColor", crayTrue}, {"crayUseVColor", cray_bezier_UseVColor}, {"crayEliminateColor", cray_bezier_EliminateColor}, {"craySetColorAll", cray_bezier_SetColorAll}, {"craySetColorAt", cray_bezier_SetColorAt}, {"craySetColorAtF", cray_bezier_SetColorAtF}, {"crayGetColorAt", cray_bezier_GetColorAt}, {"crayGetColorAtV", cray_bezier_GetColorAt} }; int cray_bezier_init() { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("bezier")); return 0; } void *cray_bezier_HasVColor(int sel, Geom *geom, va_list *args) { Bezier *b = (Bezier *)geom; return (void *)(long)(b->geomflags & BEZ_C); } void *cray_bezier_UseVColor(int sel, Geom *geom, va_list *args) { int i; Bezier *b = (Bezier *)geom; ColorA *def; if (crayHasColor(geom, NULL)) return 0; def = va_arg(*args, ColorA *); for (i = 0; i < 4; i++) b->c[i] = *def; b->geomflags |= BEZ_C; return (void *)geom; } void *cray_bezier_EliminateColor(int sel, Geom *geom, va_list *args) { Bezier *b = (Bezier *)geom; if (!crayHasColor(geom, NULL)) return NULL; b->geomflags ^= BEZ_C; return (void *)geom; } void *cray_bezier_SetColorAll(int sel, Geom *geom, va_list *args) { int i; Bezier *b = (Bezier *)geom; ColorA *color; if (!crayHasColor(geom, NULL)) return NULL; color = va_arg(*args, ColorA *); for (i = 0; i < 4; i++) b->c[i] = *color; return (void *)geom; } #define prtpt3(pt) fprintf(stderr, "%.3f %.3f %.3f\n", \ ((Point3 *)(pt))->x, ((Point3 *)(pt))->y, \ ((Point3 *)(pt))->z) #define prtpt4(pt) fprintf(stderr, "%.3f %.3f %.3f %.3f\n", \ ((HPoint3 *)(pt))->x, ((HPoint3 *)(pt))->y, \ ((HPoint3 *)(pt))->z, ((HPoint3 *)(pt))->w) static int WhichCorner(Bezier *b, int vindex, HPoint3 *pt) { float close, newclose; const Point3 *pt3; HPoint3 *pt4; int index; pt3 = (Point3 *)pt; pt4 = pt; if (b->dimn != 3 && b->dimn != 4) { OOGLError(1, "Bezier patch of unrecognized dimension %d.\n", b->dimn); return -1; } /* Hits on a corner of the mesh are vertex hits. Other hits are face * hits and color the entire thing */ close = FUDGE; index = -1; newclose = b->dimn == 3 ? Pt3Distance(pt3, (const Point3 *)(&b->CtrlPnts[0])) : HPt3Distance(pt4, (HPoint3 *)(&b->CtrlPnts[0])); if (newclose < close) { index = 0; close = newclose; } newclose = b->dimn == 3 ? Pt3Distance(pt3, (Point3 *)(&b->CtrlPnts[b->degree_u * 3])) : HPt3Distance(pt4, (HPoint3 *)(&b->CtrlPnts[b->degree_u * 4])); if (newclose < close) { index = 1; close = newclose; } newclose = b->dimn == 3 ? Pt3Distance(pt3, (const Point3 *)(&b->CtrlPnts[((b->degree_v + 1) * b->degree_u) * 3])) : HPt3Distance(pt4, (HPoint3 *)(&b->CtrlPnts[((b->degree_v + 1) * b->degree_u) * 4])); if (newclose < close) { index = 2; close = newclose; } newclose = b->dimn == 3 ? Pt3Distance(pt3, (const Point3 *)(&b->CtrlPnts[((b->degree_v + 1) * (b->degree_u + 1) - 1) * 3])) : HPt3Distance(pt4, (HPoint3 *)(&b->CtrlPnts[((b->degree_v + 1) * (b->degree_u + 1) - 1) * 4])); if (newclose < close) { index = 3; newclose = close; } return index; } void *cray_bezier_SetColorAt(int sel, Geom *geom, va_list *args) { Bezier *b = (Bezier *)geom; ColorA *color; int vindex, index; HPoint3 *pt; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); (void)va_arg(*args, int); /* findex */ (void)va_arg(*args, int *); /* edge */ (void)va_arg(*args, int *); /* gpath */ pt = va_arg(*args, HPoint3 *); index = WhichCorner(b, vindex, pt); if (index < 0) return (void *)(long)craySetColorAtF(geom, color, 0, NULL); b->c[index] = *color; return (void *)geom; } void *cray_bezier_SetColorAtF(int sel, Geom *geom, va_list *args) { int i; Bezier *b = (Bezier *)geom; ColorA *color; if (!crayHasColor(geom, NULL)) return NULL; color = va_arg(*args, ColorA *); for (i = 0; i < 4; i++) b->c[i] = *color; return (void *)geom; } void *cray_bezier_GetColorAt(int sel, Geom *geom, va_list *args) { Bezier *b = (Bezier *)geom; ColorA *color; int vindex, index; HPoint3 *pt; if (!crayHasColor(geom, NULL)) return NULL; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); (void)va_arg(*args, int); /* findex */ (void)va_arg(*args, int *); /* edge */ (void)va_arg(*args, int *); /* gpath */ pt = va_arg(*args, HPoint3 *); index = WhichCorner(b, vindex, pt); if (index < 0) index = 0; *color = b->c[index]; return (void *)geom; } geomview-1.9.5/src/lib/geomutil/crayplutil/crayInst.c0000644000175000017500000001575012310110200017567 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "instP.h" #include "crayolaP.h" void *cray_inst_HasColor(int sel, Geom *geom, va_list *args); void *cray_inst_HasVColor(int sel, Geom *geom, va_list *args); void *cray_inst_HasFColor(int sel, Geom *geom, va_list *args); void *cray_inst_CanUseVColor(int sel, Geom *geom, va_list *args); void *cray_inst_CanUseFColor(int sel, Geom *geom, va_list *args); void *cray_inst_UseVColor(int sel, Geom *geom, va_list *args); void *cray_inst_UseFColor(int sel, Geom *geom, va_list *args); void *cray_inst_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_inst_SetColorAll(int sel, Geom *geom, va_list *args); void *cray_inst_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_inst_SetColorAtV(int sel, Geom *geom, va_list *args); void *cray_inst_SetColorAtF(int sel, Geom *geom, va_list *args); void *cray_inst_GetColorAt(int sel, Geom *geom, va_list *args); void *cray_inst_GetColorAtV(int sel, Geom *geom, va_list *args); void *cray_inst_GetColorAtF(int sel, Geom *geom, va_list *args); #define MAX_METHODS 14 static craySpecFunc methods[] = { {"crayHasColor", cray_inst_HasColor}, {"crayHasVColor", cray_inst_HasVColor}, {"crayHasFColor", cray_inst_HasFColor}, {"crayCanUseVColor", cray_inst_CanUseVColor}, {"crayCanUseFColor", cray_inst_CanUseFColor}, {"crayUseVColor", cray_inst_UseVColor}, {"crayUseFColor", cray_inst_UseFColor}, {"crayEliminateColor", cray_inst_EliminateColor}, {"craySetColorAll", cray_inst_SetColorAll}, {"craySetColorAt", cray_inst_SetColorAt}, {"craySetColorAtV", cray_inst_SetColorAtV}, {"craySetColorAtF", cray_inst_SetColorAtF}, {"crayGetColorAt", cray_inst_GetColorAt}, {"crayGetColorAtV", cray_inst_GetColorAtV}, {"crayGetColorAtF", cray_inst_GetColorAtF} }; int cray_inst_init() { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("inst")); return 0; } void *cray_inst_HasColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); return (void *)(long)(crayHasColor(((Inst *)geom)->geom, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_HasVColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); return (void *)(long)(crayHasVColor(((Inst *)geom)->geom, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_HasFColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); return (void *)(long)(crayHasFColor(((Inst *)geom)->geom, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_CanUseVColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); return (void *)(long)(crayCanUseVColor(((Inst *)geom)->geom, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_CanUseFColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); return (void *)(long)(crayCanUseFColor(((Inst *)geom)->geom, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_UseVColor(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int *gpath = va_arg(*args, int *); return (void *)(long)(crayUseVColor(((Inst *)geom)->geom, c, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_UseFColor(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int *gpath = va_arg(*args, int *); return (void *)(long)(crayUseFColor(((Inst *)geom)->geom, c, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_EliminateColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); return (void *)(long)(crayEliminateColor(((Inst *)geom)->geom, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_SetColorAll(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int *gpath = va_arg(*args, int *); return (void *)(long)(craySetColorAll(((Inst *)geom)->geom, c, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_SetColorAt(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int vindex = va_arg(*args, int), findex = va_arg(*args, int), *edge = va_arg(*args, int *), *gpath = va_arg(*args, int *); HPoint3 *pt = va_arg(*args, HPoint3 *); return (void *)(long)(craySetColorAt(((Inst *)geom)->geom, c, vindex, findex, edge, gpath == NULL ? NULL : gpath + 1, pt)); } void *cray_inst_SetColorAtV(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int index = va_arg(*args, int), *gpath = va_arg(*args, int *); HPoint3 *pt = va_arg(*args, HPoint3 *); return (void *)(long)(craySetColorAtV(((Inst *)geom)->geom, c, index, gpath == NULL ? NULL : gpath + 1, pt)); } void *cray_inst_SetColorAtF(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int index = va_arg(*args, int), *gpath = va_arg(*args, int *); return (void *)(long)(craySetColorAtF(((Inst *)geom)->geom, c, index, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_GetColorAt(int sel, Geom *geom, va_list *args) { Geom *newgeom = ((Inst *)geom)->geom; ColorA *c = va_arg(*args, ColorA *); int vindex = va_arg(*args, int), findex = va_arg(*args, int), *edge = va_arg(*args, int *), *gpath = va_arg(*args, int *); HPoint3 *pt = va_arg(*args, HPoint3 *); return (void *)(long)(crayGetColorAt(newgeom, c, vindex, findex, edge, gpath == NULL ? NULL : gpath + 1, pt)); } void *cray_inst_GetColorAtV(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int index = va_arg(*args, int), *gpath = va_arg(*args, int *); HPoint3 *pt = va_arg(*args, HPoint3 *); return (void *)(long)(crayGetColorAtV(((Inst *)geom)->geom, c, index, gpath == NULL ? NULL : gpath + 1, pt)); } void *cray_inst_GetColorAtF(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int index = va_arg(*args, int), *gpath = va_arg(*args, int *); return (void *)(long)(crayGetColorAtF(((Inst *)geom)->geom, c, index, gpath == NULL ? NULL : gpath + 1)); } geomview-1.9.5/src/lib/geomutil/crayplutil/crayList.c0000644000175000017500000002111512310110200017555 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "listP.h" #include "crayolaP.h" void *cray_list_HasColor(int sel, Geom *geom, va_list *args); void *cray_list_HasVColor(int sel, Geom *geom, va_list *args); void *cray_list_HasFColor(int sel, Geom *geom, va_list *args); void *cray_list_CanUseVColor(int sel, Geom *geom, va_list *args); void *cray_list_CanUseFColor(int sel, Geom *geom, va_list *args); void *cray_list_UseVColor(int sel, Geom *geom, va_list *args); void *cray_list_UseFColor(int sel, Geom *geom, va_list *args); void *cray_list_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_list_SetColorAll(int sel, Geom *geom, va_list *args); void *cray_list_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_list_SetColorAtV(int sel, Geom *geom, va_list *args); void *cray_list_SetColorAtF(int sel, Geom *geom, va_list *args); void *cray_list_GetColorAt(int sel, Geom *geom, va_list *args); void *cray_list_GetColorAtV(int sel, Geom *geom, va_list *args); void *cray_list_GetColorAtF(int sel, Geom *geom, va_list *args); #define MAX_METHODS 14 static craySpecFunc methods[] = { {"crayHasColor", cray_list_HasColor}, {"crayHasVColor", cray_list_HasVColor}, {"crayHasFColor", cray_list_HasFColor}, {"crayCanUseVColor", cray_list_CanUseVColor}, {"crayCanUseFColor", cray_list_CanUseFColor}, {"crayUseVColor", cray_list_UseVColor}, {"crayUseFColor", cray_list_UseFColor}, {"crayEliminateColor", cray_list_EliminateColor}, {"craySetColorAll", cray_list_SetColorAll}, {"craySetColorAt", cray_list_SetColorAt}, {"craySetColorAtV", cray_list_SetColorAtV}, {"craySetColorAtF", cray_list_SetColorAtF}, {"crayGetColorAt", cray_list_GetColorAt}, {"crayGetColorAtV", cray_list_GetColorAtV}, {"crayGetColorAtF", cray_list_GetColorAtF} }; int cray_list_init() { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("list")); return 0; } static Geom *ListElement(Geom *list, int elem) { int i; List *l = (List *)list; for (i = 0; i < elem && l != NULL; i++) l = l->cdr; if (l == NULL) { OOGLError(1, "Unable to retrieve list element %d\n", elem); return NULL; } return l->car; } /* * Performs the named function (with its arguements included) on each * element of the list found in the variable geom, then returns the * result of all of them |'d together */ #define LIST_EACH(list, func) \ { \ long val; \ for (val = 0; (list = (Geom*)((List *)(list))->cdr);) \ val |= (long)func; \ return (void *)val; \ } void *cray_list_HasColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayHasColor(ListElement(geom, *gpath), gpath + 1)); LIST_EACH(geom, crayHasColor(((List *)geom)->car, NULL)); } void *cray_list_HasVColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayHasVColor(ListElement(geom, *gpath), gpath + 1)); LIST_EACH(geom, crayHasVColor(((List *)geom)->car, NULL)); } void *cray_list_HasFColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayHasFColor(ListElement(geom, *gpath), gpath + 1)); LIST_EACH(geom, crayHasFColor(((List *)geom)->car, NULL)); } void *cray_list_CanUseVColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayCanUseVColor(ListElement(geom, *gpath), gpath + 1)); LIST_EACH(geom, crayCanUseVColor(((List *)geom)->car, NULL)); } void *cray_list_CanUseFColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayCanUseFColor(ListElement(geom, *gpath), gpath + 1)); LIST_EACH(geom, crayCanUseFColor(((List *)geom)->car, NULL)); } void *cray_list_UseVColor(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayUseVColor(ListElement(geom, *gpath), c, gpath + 1)); LIST_EACH(geom, crayUseVColor(((List *)geom)->car, c, NULL)); } void *cray_list_UseFColor(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayUseFColor(ListElement(geom, *gpath), c, gpath + 1)); LIST_EACH(geom, crayUseFColor(((List *)geom)->car, c, NULL)); } void *cray_list_EliminateColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayEliminateColor(ListElement(geom, *gpath), gpath + 1)); LIST_EACH(geom, crayEliminateColor(((List *)geom)->car, NULL)); } void *cray_list_SetColorAll(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)craySetColorAll(ListElement(geom, *gpath), c, gpath + 1); LIST_EACH(geom, craySetColorAll(((List *)geom)->car, c, NULL)); } void *cray_list_SetColorAt(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int vindex = va_arg(*args, int), findex = va_arg(*args, int), *edge = va_arg(*args, int *), *gpath = va_arg(*args, int *); HPoint3 *pt = va_arg(*args, HPoint3 *); if (gpath != NULL) return (void *)(long)(craySetColorAt(ListElement(geom, *gpath), c, vindex, findex, edge, gpath + 1, pt)); LIST_EACH(geom, craySetColorAt(((List *)geom)->car, c, vindex, findex, edge, NULL, pt)); } void *cray_list_SetColorAtV(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int index = va_arg(*args, int), *gpath = va_arg(*args, int *); HPoint3 *pt = va_arg(*args, HPoint3 *); if (gpath != NULL) return (void *)(long)(craySetColorAtV(ListElement(geom, *gpath), c, index, gpath + 1, pt)); LIST_EACH(geom, craySetColorAtV(((List *)geom)->car, c, index, NULL, pt)); } void *cray_list_SetColorAtF(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int index = va_arg(*args, int), *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(craySetColorAtF(ListElement(geom, *gpath), c, index, gpath + 1)); LIST_EACH(geom, craySetColorAtF(((List *)geom)->car, c, index, NULL)); } void *cray_list_GetColorAt(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int vindex = va_arg(*args, int), findex = va_arg(*args, int), *edge = va_arg(*args, int *), *gpath = va_arg(*args, int *); HPoint3 *pt = va_arg(*args, HPoint3 *); if (gpath != NULL) return (void *)(long)(crayGetColorAt(ListElement(geom, *gpath), c, vindex, findex, edge, gpath + 1, pt)); LIST_EACH(geom, crayGetColorAt(((List *)geom)->car, c, vindex, findex, edge, NULL, pt)); } void *cray_list_GetColorAtV(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int index = va_arg(*args, int), *gpath = va_arg(*args, int *); HPoint3 *pt = va_arg(*args, HPoint3 *); if (gpath != NULL) return (void *)(long)(crayGetColorAtV(ListElement(geom, *gpath), c, index, gpath + 1, pt)); LIST_EACH(geom, crayGetColorAtV(((List *)geom)->car, c, index, NULL, pt)); } void *cray_list_GetColorAtF(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int index = va_arg(*args, int), *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayGetColorAtF(ListElement(geom, *gpath), c, index, gpath + 1)); LIST_EACH(geom, crayGetColorAtF(((List *)geom)->car, c, index, NULL)); } geomview-1.9.5/src/lib/geomutil/crayplutil/crayMesh.c0000644000175000017500000001277712310110200017554 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "geom.h" #include "meshP.h" #include "crayolaP.h" static char msg[] = "crayMesh.c"; void *cray_mesh_HasVColor(int sel, Geom *geom, va_list *args); void *cray_mesh_UseVColor(int sel, Geom *geom, va_list *args); void *cray_mesh_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_mesh_SetColorAll(int sel, Geom *geom, va_list *args); void *cray_mesh_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_mesh_SetColorAtF(int sel, Geom *geom, va_list *args); void *cray_mesh_SetColorAtV(int sel, Geom *geom, va_list *args); void *cray_mesh_GetColorAt(int sel, Geom *geom, va_list *args); void *cray_mesh_GetColorAtV(int sel, Geom *geom, va_list *args); #define MAX_METHODS 11 static craySpecFunc methods[] = { {"crayHasColor", cray_mesh_HasVColor}, {"crayHasVColor", cray_mesh_HasVColor}, {"crayCanUseVColor", crayTrue}, {"crayUseVColor", cray_mesh_UseVColor}, {"crayEliminateColor", cray_mesh_EliminateColor}, {"craySetColorAll", cray_mesh_SetColorAll}, {"craySetColorAt", cray_mesh_SetColorAt}, {"craySetColorAtF", cray_mesh_SetColorAtF}, {"craySetColorAtV", cray_mesh_SetColorAtV}, {"crayGetColorAt", cray_mesh_GetColorAt}, {"crayGetColorAtV", cray_mesh_GetColorAtV} }; int cray_mesh_init() { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("mesh")); return 0; } void *cray_mesh_HasVColor(int sel, Geom *geom, va_list *args) { Mesh *m = (Mesh *)geom; return (void *)(long)(m->geomflags & MESH_C); } void *cray_mesh_UseVColor(int sel, Geom *geom, va_list *args) { int i; Mesh *m = (Mesh *)geom; ColorA *def; if (crayHasVColor(geom, NULL)) return 0; def = va_arg(*args, ColorA *); m->c = OOGLNewNE(ColorA, m->nu * m->nv, msg); for (i = 0; i < m->nu * m->nv; i++) { m->c[i].r = def->r; m->c[i].g = def->g; m->c[i].b = def->b; m->c[i].a = def->a; } m->geomflags |= MESH_C; return (void *)geom; } void *cray_mesh_EliminateColor(int sel, Geom *geom, va_list *args) { Mesh *m = (Mesh *)geom; if (!crayHasColor(geom, NULL)) return 0; OOGLFree(m->c); m->c = NULL; m->geomflags ^= MESH_C; return (void *)geom; } void *cray_mesh_SetColorAll(int sel, Geom *geom, va_list *args) { int i; Mesh *m = (Mesh *)geom; ColorA *color; if (!crayHasVColor(geom, NULL)) return NULL; color = va_arg(*args, ColorA *); for (i = 0; i < m->nu * m->nv; i++) m->c[i] = *color; return (void *)geom; } void *cray_mesh_SetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex, *eindex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); eindex = va_arg(*args, int *); if (vindex != -1) return (void *)(long)craySetColorAtV(geom, color, vindex, NULL, NULL); if (eindex[0] != eindex[1]) { craySetColorAtV(geom, color, eindex[0], NULL, NULL); return (void *)(long)craySetColorAtV(geom, color, eindex[1], NULL, NULL); } return (void *)(long)craySetColorAtF(geom, color, findex, NULL); } void *cray_mesh_SetColorAtV(int sel, Geom *geom, va_list *args) { Mesh *m = (Mesh *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) return 0; m->c[index].r = color->r; m->c[index].g = color->g; m->c[index].b = color->b; m->c[index].a = color->a; return (void *)color; } void *cray_mesh_SetColorAtF(int sel, Geom *geom, va_list *args) { Mesh *m = (Mesh *)geom; ColorA *color; int index, u, v; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasColor(geom, NULL) || index == -1) return 0; u = index % m->nu; v = index / m->nu; m->c[MESHINDEX(u, v, m)] = *color; m->c[MESHINDEX(u+1, v, m)] = *color; m->c[MESHINDEX(u+1, v+1, m)] = *color; m->c[MESHINDEX(u, v+1, m)] = *color; return (void *)m; } void *cray_mesh_GetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int i; color = va_arg(*args, ColorA *); i = va_arg(*args, int); return (void *)(long)crayGetColorAtV(geom, color, i, NULL, NULL); } void *cray_mesh_GetColorAtV(int sel, Geom *geom, va_list *args) { ColorA *color; int i; Mesh *m = (Mesh *)geom; if (!crayHasVColor(geom, NULL)) return 0; color = va_arg(*args, ColorA *); i = va_arg(*args, int); color->r = m->c[i].r; color->g = m->c[i].g; color->b = m->c[i].b; color->a = m->c[i].a; return (void *)color; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/geomutil/crayplutil/crayPolylist.c0000644000175000017500000001651512310110200020471 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "geom.h" #include "polylistP.h" #include "crayolaP.h" void *cray_polylist_HasColor(int sel, Geom *geom, va_list *args); void *cray_polylist_HasVColor(int sel, Geom *geom, va_list *args); void *cray_polylist_HasFColor(int sel, Geom *geom, va_list *args); void *cray_polylist_UseVColor(int sel, Geom *geom, va_list *args); void *cray_polylist_UseFColor(int sel, Geom *geom, va_list *args); void *cray_polylist_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_polylist_SetColorAll(int sel, Geom *geom, va_list *args); void *cray_polylist_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_polylist_SetColorAtV(int sel, Geom *geom, va_list *args); void *cray_polylist_SetColorAtF(int sel, Geom *geom, va_list *args); void *cray_polylist_GetColorAt(int sel, Geom *geom, va_list *args); void *cray_polylist_GetColorAtV(int sel, Geom *geom, va_list *args); void *cray_polylist_GetColorAtF(int sel, Geom *geom, va_list *args); #define MAX_METHODS 15 static craySpecFunc methods[] = { {"crayHasColor", cray_polylist_HasColor}, {"crayHasVColor", cray_polylist_HasVColor}, {"crayHasFColor", cray_polylist_HasFColor}, {"crayCanUseVColor", crayTrue}, {"crayCanUseFColor", crayTrue}, {"crayUseVColor", cray_polylist_UseVColor}, {"crayUseFColor", cray_polylist_UseFColor}, {"crayEliminateColor", cray_polylist_EliminateColor}, {"craySetColorAll", cray_polylist_SetColorAll}, {"craySetColorAt", cray_polylist_SetColorAt}, {"craySetColorAtV", cray_polylist_SetColorAtV}, {"craySetColorAtF", cray_polylist_SetColorAtF}, {"crayGetColorAt", cray_polylist_GetColorAt}, {"crayGetColorAtV", cray_polylist_GetColorAtV}, {"crayGetColorAtF", cray_polylist_GetColorAtF} }; int cray_polylist_init() { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("polylist")); return 0; } void *cray_polylist_HasColor(int sel, Geom *geom, va_list *args) { return (void *)(long)(crayHasVColor(geom, NULL) || crayHasFColor(geom, NULL)); } void *cray_polylist_HasVColor(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; return (void *)(long)(p->geomflags & PL_HASVCOL); } void *cray_polylist_HasFColor(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; return (void *)(long)(p->geomflags & PL_HASPCOL); } void *cray_polylist_UseVColor(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; ColorA *def; int i, j; def = va_arg(*args, ColorA *); for (i = 0; i < p->n_verts; i++) p->vl[i].vcol = *def; if (p->geomflags & PL_HASPCOL) { for (i = 0; i < p->n_polys; i++) for (j = 0; j < p->p[i].n_vertices; j++) p->p[i].v[j]->vcol = p->p[i].pcol; p->geomflags ^= PL_HASPCOL; } p->geomflags |= PL_HASVCOL; return (void *)p; } void *cray_polylist_UseFColor(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; ColorA *def; int i; def = va_arg(*args, ColorA *); for (i = 0; i < p->n_polys; i++) p->p[i].pcol = *def; if (p->geomflags & PL_HASVCOL) { for (i = 0; i < p->n_polys; i++) if (p->p[i].n_vertices) p->p[i].pcol = p->p[i].v[0]->vcol; p->geomflags ^= PL_HASVCOL; } p->geomflags |= PL_HASPCOL; return (void *)p; } void *cray_polylist_EliminateColor(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; if (!crayHasColor(geom, NULL)) return 0; p->geomflags &= ~PL_HASVCOL; p->geomflags &= ~PL_HASPCOL; return (void *)p; } void *cray_polylist_SetColorAll(int sel, Geom *geom, va_list *args) { int i; PolyList *p = (PolyList *)geom; ColorA *color = va_arg(*args, ColorA *); if (!crayHasVColor(geom, NULL)) return NULL; for (i = 0; i < p->n_verts; i++) p->vl[i].vcol = *color; for (i = 0; i < p->n_polys; i++) p->p[i].pcol = *color; return geom; } void *cray_polylist_SetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex, *eindex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); eindex = va_arg(*args, int *); if (crayHasVColor(geom, NULL)) { if (vindex != -1) return (void *)(long)craySetColorAtV(geom, color, vindex, NULL, NULL); if (eindex[0] != eindex[1]) { craySetColorAtV(geom, color, eindex[0], NULL, NULL); return (void *)(long)craySetColorAtV(geom, color, eindex[1], NULL, NULL); } } return (void *)(long)craySetColorAtF(geom, color, findex, NULL); } void *cray_polylist_SetColorAtV(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) return (void *)0; p->vl[index].vcol = *color; return (void *)geom; } void *cray_polylist_SetColorAtF(int sel, Geom *geom, va_list *args) { int i; PolyList *p = (PolyList *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (index == -1) return (void *)0; if (crayHasFColor(geom, NULL)) p->p[index].pcol = *color; else if (crayHasVColor(geom, NULL)) for (i = 0; i < p->p[index].n_vertices; i++) p->p[index].v[i]->vcol = *color; return (void *)geom; } void *cray_polylist_GetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); if (crayHasVColor(geom, NULL)) return (void *)(long)crayGetColorAtV(geom, color, vindex, NULL, NULL); if (crayHasFColor(geom, NULL)) return (void *)(long)crayGetColorAtF(geom, color, findex, NULL); return NULL; } void *cray_polylist_GetColorAtV(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) return (void *)0; *color = p->vl[index].vcol; return (void *)geom; } void *cray_polylist_GetColorAtF(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasFColor(geom, NULL) || index == -1) return (void *)0; *color = p->p[index].pcol; return (void *)geom; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/geomutil/crayplutil/crayNPolylist.c0000644000175000017500000001757112310110200020612 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "geom.h" #include "npolylistP.h" #include "crayolaP.h" void *cray_npolylist_HasColor(int sel, Geom *geom, va_list *args); void *cray_npolylist_HasVColor(int sel, Geom *geom, va_list *args); void *cray_npolylist_HasFColor(int sel, Geom *geom, va_list *args); void *cray_npolylist_UseVColor(int sel, Geom *geom, va_list *args); void *cray_npolylist_UseFColor(int sel, Geom *geom, va_list *args); void *cray_npolylist_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_npolylist_SetColorAll(int sel, Geom *geom, va_list *args); void *cray_npolylist_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_npolylist_SetColorAtV(int sel, Geom *geom, va_list *args); void *cray_npolylist_SetColorAtF(int sel, Geom *geom, va_list *args); void *cray_npolylist_GetColorAt(int sel, Geom *geom, va_list *args); void *cray_npolylist_GetColorAtV(int sel, Geom *geom, va_list *args); void *cray_npolylist_GetColorAtF(int sel, Geom *geom, va_list *args); #define MAX_METHODS 15 static craySpecFunc methods[] = { {"crayHasColor", cray_npolylist_HasColor}, {"crayHasVColor", cray_npolylist_HasVColor}, {"crayHasFColor", cray_npolylist_HasFColor}, {"crayCanUseVColor", crayTrue}, {"crayCanUseFColor", crayTrue}, {"crayUseVColor", cray_npolylist_UseVColor}, {"crayUseFColor", cray_npolylist_UseFColor}, {"crayEliminateColor", cray_npolylist_EliminateColor}, {"craySetColorAll", cray_npolylist_SetColorAll}, {"craySetColorAt", cray_npolylist_SetColorAt}, {"craySetColorAtV", cray_npolylist_SetColorAtV}, {"craySetColorAtF", cray_npolylist_SetColorAtF}, {"crayGetColorAt", cray_npolylist_GetColorAt}, {"crayGetColorAtV", cray_npolylist_GetColorAtV}, {"crayGetColorAtF", cray_npolylist_GetColorAtF} }; int cray_npolylist_init(void) { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("npolylist")); return 0; } void *cray_npolylist_HasColor(int sel, Geom *geom, va_list *args) { return (void *)(long)(crayHasVColor(geom, NULL) || crayHasFColor(geom, NULL)); } void *cray_npolylist_HasVColor(int sel, Geom *geom, va_list *args) { NPolyList *p = (NPolyList *)geom; return (void *)(long)(p->geomflags & PL_HASVCOL); } void *cray_npolylist_HasFColor(int sel, Geom *geom, va_list *args) { NPolyList *p = (NPolyList *)geom; return (void *)(long)(p->geomflags & PL_HASPCOL); } void *cray_npolylist_UseVColor(int sel, Geom *geom, va_list *args) { NPolyList *p = (NPolyList *)geom; ColorA *def; int i, j; def = va_arg(*args, ColorA *); if (!p->vcol) { p->vcol = OOGLNewNE(ColorA, p->n_verts, "NPolyList vertex colors"); } for (i = 0; i < p->n_verts; i++) { p->vcol[i] = *def; } if (p->vl) { for (i = 0; i < p->n_verts; i++) { p->vl[i].vcol = *def; } } if (p->geomflags & PL_HASPCOL) { for (i = 0; i < p->n_polys; i++) { for (j = 0; j < p->p[i].n_vertices; j++) { p->p[i].v[j]->vcol = p->p[i].pcol; } } p->geomflags ^= PL_HASPCOL; } p->geomflags |= PL_HASVCOL; return (void *)p; } void *cray_npolylist_UseFColor(int sel, Geom *geom, va_list *args) { NPolyList *p = (NPolyList *)geom; ColorA *def; int i; def = va_arg(*args, ColorA *); for (i = 0; i < p->n_polys; i++) { p->p[i].pcol = *def; } if (p->geomflags & PL_HASVCOL) { for (i = 0; i < p->n_polys; i++) { if (p->p[i].n_vertices) { p->p[i].pcol = p->vcol[p->vi[p->pv[i]]]; } } p->geomflags ^= PL_HASVCOL; } p->geomflags |= PL_HASPCOL; return (void *)p; } void *cray_npolylist_EliminateColor(int sel, Geom *geom, va_list *args) { NPolyList *p = (NPolyList *)geom; if (!crayHasColor(geom, NULL)) { return NULL; } p->geomflags &= ~PL_HASVCOL; p->geomflags &= ~PL_HASPCOL; OOGLFree(p->vcol); p->vcol = NULL; return (void *)p; } void *cray_npolylist_SetColorAll(int sel, Geom *geom, va_list *args) { int i; NPolyList *p = (NPolyList *)geom; ColorA *color = va_arg(*args, ColorA *); if (!crayHasVColor(geom, NULL)) { return NULL; } for (i = 0; i < p->n_verts; i++) { p->vcol[i] = *color; } for (i = 0; i < p->n_polys; i++) { p->p[i].pcol = *color; } return geom; } void *cray_npolylist_SetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex, *eindex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); eindex = va_arg(*args, int *); if (crayHasVColor(geom, NULL)) { if (vindex != -1) return (void *)(long)craySetColorAtV(geom, color, vindex, NULL, NULL); if (eindex[0] != eindex[1]) { craySetColorAtV(geom, color, eindex[0], NULL, NULL); return (void *)(long)craySetColorAtV(geom, color, eindex[1], NULL, NULL); } } return (void *)(long)craySetColorAtF(geom, color, findex, NULL); } void *cray_npolylist_SetColorAtV(int sel, Geom *geom, va_list *args) { NPolyList *p = (NPolyList *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) { return NULL; } p->vcol[index] = p->vl[index].vcol = *color; return (void *)geom; } void *cray_npolylist_SetColorAtF(int sel, Geom *geom, va_list *args) { int i; NPolyList *p = (NPolyList *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (index == -1) { return (void *)NULL; } if (crayHasFColor(geom, NULL)) { p->p[index].pcol = *color; } else if (crayHasVColor(geom, NULL)) { for (i = 0; i < p->p[index].n_vertices; i++) { p->p[index].v[i]->vcol = *color; p->vcol[p->vi[p->pv[i] + i]] = *color; } } return (void *)geom; } void *cray_npolylist_GetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); if (crayHasVColor(geom, NULL)) { return (void *)(long)crayGetColorAtV(geom, color, vindex, NULL, NULL); } if (crayHasFColor(geom, NULL)) { return (void *)(long)crayGetColorAtF(geom, color, findex, NULL); } return NULL; } void *cray_npolylist_GetColorAtV(int sel, Geom *geom, va_list *args) { NPolyList *p = (NPolyList *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) { return NULL; } *color = p->vcol[index]; return (void *)geom; } void *cray_npolylist_GetColorAtF(int sel, Geom *geom, va_list *args) { NPolyList *p = (NPolyList *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasFColor(geom, NULL) || index == -1) { return NULL; } *color = p->p[index].pcol; return (void *)geom; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/geomutil/crayplutil/crayQuad.c0000644000175000017500000001403712310110200017541 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "quadP.h" #include "crayolaP.h" static char msg[] = "crayQuad.c"; void *cray_quad_HasVColor(int sel, Geom *geom, va_list *args); void *cray_quad_UseVColor(int sel, Geom *geom, va_list *args); void *cray_quad_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_quad_SetColorAll(int sel, Geom *geom, va_list *args); void *cray_quad_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_quad_SetColorAtV(int sel, Geom *geom, va_list *args); void *cray_quad_SetColorAtF(int sel, Geom *geom, va_list *args); void *cray_quad_GetColorAt(int sel, Geom *geom, va_list *args); void *cray_quad_GetColorAtV(int sel, Geom *geom, va_list *args); void *cray_quad_GetColorAtF(int sel, Geom *geom, va_list *args); #define MAX_METHODS 12 static craySpecFunc methods[] = { {"crayHasColor", cray_quad_HasVColor}, {"crayHasVColor", cray_quad_HasVColor}, {"crayCanUseVColor", crayTrue}, {"crayUseVColor", cray_quad_UseVColor}, {"crayEliminateColor", cray_quad_EliminateColor}, {"craySetColorAll", cray_quad_SetColorAll}, {"craySetColorAt", cray_quad_SetColorAt}, {"craySetColorAtV", cray_quad_SetColorAtV}, {"craySetColorAtF", cray_quad_SetColorAtF}, {"crayGetColorAt", cray_quad_GetColorAt}, {"crayGetColorAtV", cray_quad_GetColorAtV}, {"crayGetColorAtF", cray_quad_GetColorAtF} }; int cray_quad_init() { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("quad")); return 0; } void *cray_quad_HasVColor(int sel, Geom *geom, va_list *args) { Quad *q = (Quad *)geom; return (void *)(long)(q->geomflags & QUAD_C); } void *cray_quad_UseVColor(int sel, Geom *geom, va_list *args) { Quad *q = (Quad *)geom; ColorA *color; int i; if (crayHasVColor(geom, NULL)) return 0; color = va_arg(*args, ColorA *); q->c = OOGLNewNE(QuadC, q->maxquad, msg); for (i = 0; i < q->maxquad; i++) q->c[i][0] = q->c[i][1] = q->c[i][2] = q->c[i][3] = *color; q->geomflags |= QUAD_C; return (void *)geom; } void *cray_quad_EliminateColor(int sel, Geom *geom, va_list *args) { Quad *q = (Quad *)geom; if (!crayHasVColor(geom, NULL)) return 0; OOGLFree(q->c); q->c = NULL; q->geomflags &= ~QUAD_C; return (void *)geom; } void *cray_quad_SetColorAll(int sel, Geom *geom, va_list *args) { int i; Quad *q = (Quad *)geom; ColorA *color = va_arg(*args, ColorA *); if (!crayHasColor(geom, NULL)) return NULL; for (i = 0; i < q->maxquad; i++) { q->c[i][0] = *color; q->c[i][1] = *color; q->c[i][2] = *color; q->c[i][3] = *color; } return (void *)geom; } void *cray_quad_SetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex, *eindex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); eindex = va_arg(*args, int *); if (vindex != -1) return (void *)(long)craySetColorAtV(geom, color, vindex, NULL, NULL); if (eindex[0] != eindex[1]) { craySetColorAtV(geom, color, eindex[0], NULL, NULL); return (void *)(long)craySetColorAtV(geom, color, eindex[1], NULL, NULL); } return (void *)(long)craySetColorAtF(geom, color, findex, NULL); } void *cray_quad_SetColorAtV(int sel, Geom *geom, va_list *args) { Quad *q = (Quad *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (index == -1 || !crayHasVColor(geom, NULL)) return 0; q->c[0][index] = *color; return (void *)geom; } /* * Note - this is somewhat strangely written. Quad colors may be set * (and gotten) by vertex or by face, although they are always stored * by vertex. */ void *cray_quad_SetColorAtF(int sel, Geom *geom, va_list *args) { Quad *q = (Quad *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (index == -1 || !crayHasVColor(geom, NULL)) return 0; q->c[index][0] = q->c[index][1] = q->c[index][2] = q->c[index][3] = *color; return (void *)geom; } void *cray_quad_GetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); if (!crayHasVColor(geom, NULL)) return 0; if (vindex != -1) return (void *)(long)crayGetColorAtV(geom, color, vindex, NULL, NULL); return (void *)(long)crayGetColorAtF(geom, color, findex, NULL); } void *cray_quad_GetColorAtV(int sel, Geom *geom, va_list *args) { Quad *q = (Quad *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) return 0; *color = q->c[0][index]; return (void *)geom; } void *cray_quad_GetColorAtF(int sel, Geom *geom, va_list *args) { Quad *q = (Quad *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) return 0; *color = q->c[index][0]; return (void *)geom; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/geomutil/crayplutil/crayVect.c0000644000175000017500000001546112310110200017552 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include /* for abs() */ #include "geom.h" #include "vectP.h" #include "crayolaP.h" static char msg[] = "crayVect.c"; void *cray_vect_HasColor(int sel, Geom *geom, va_list *args); void *cray_vect_HasVColor(int sel, Geom *geom, va_list *args); void *cray_vect_HasFColor(int sel, Geom *geom, va_list *args); void *cray_vect_UseVColor(int sel, Geom *geom, va_list *args); void *cray_vect_UseFColor(int sel, Geom *geom, va_list *args); void *cray_vect_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_vect_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_vect_SetColorAtV(int sel, Geom *geom, va_list *args); void *cray_vect_GetColorAt(int sel, Geom *geom, va_list *args); void *cray_vect_GetColorAtV(int sel, Geom *geom, va_list *args); #define MAX_METHODS 12 static craySpecFunc methods[] = { {"crayHasColor", cray_vect_HasColor}, {"crayHasVColor", cray_vect_HasVColor}, {"crayHasFColor", cray_vect_HasFColor}, {"crayCanUseVColor", crayTrue}, {"crayCanUseFColor", crayTrue}, {"crayUseVColor", cray_vect_UseVColor}, {"crayUseFColor", cray_vect_UseFColor}, {"crayEliminateColor", cray_vect_EliminateColor}, {"craySetColorAt", cray_vect_SetColorAt}, {"craySetColorAtV", cray_vect_SetColorAtV}, {"crayGetColorAt", cray_vect_GetColorAt}, {"crayGetColorAtV", cray_vect_GetColorAtV} }; int cray_vect_init() { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("vect")); return 0; } void *cray_vect_HasColor(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; return (void *)(long)(v->ncolor); } void *cray_vect_HasFColor(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; return (void *)(long)((v->ncolor == v->nvec) ? 1 : 0); } void *cray_vect_HasVColor(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; return (void *)(long)((v->ncolor == v->nvert) ? 1 : 0); } void *cray_vect_UseVColor(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; int h, i, j, k; ColorA *color, *def; def = va_arg(*args, ColorA *); /* h = current point * i = current polyline * j = current point in polyline * k = current color index (in cold list of colors) */ color = OOGLNewNE(ColorA, v->nvert, msg); for (h = i = k = 0; i < v->nvec; i++) { if (v->vncolor[i]) def = &v->c[k]; for (j = 0; j < abs(v->vnvert[i]); j++) { color[h++] = *def; if (v->vncolor[i] > 1) def++; } k += v->vncolor[i]; v->vncolor[i] = abs(v->vnvert[i]); } if (v->c != NULL) OOGLFree(v->c); v->c = color; v->ncolor = v->nvert; return (void *)geom; } void *cray_vect_UseFColor(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; int i, k; ColorA *color, *def; def = va_arg(*args, ColorA *); color = OOGLNewNE(ColorA, v->nvec, msg); /* * i = current polyline * j = current vertex of current polyline * k = current color * h = current vertex of vect */ for (i = k = 0; i < v->nvec; i++) { switch(v->vncolor[i]) { case 1: def = &v->c[k++]; case 0: color[i] = *def; break; default: if (v->vncolor[i] != abs(v->vnvert[i])) { OOGLError(1, "Illegal # of colors / # of vertices combination."); return (void *)0; } def = &v->c[k + 1]; color[i] = *def; k += abs(v->vnvert[i]); break; } v->vncolor[i] = 1; } if (v->c != NULL) OOGLFree(v->c); v->c = color; v->ncolor = v->nvec; return (void *)geom; } void *cray_vect_EliminateColor(int sel, Geom *geom, va_list *args) { int i; Vect *v = (Vect *)geom; if (!crayHasColor(geom, NULL)) return 0; if (v->ncolor) OOGLFree(v->c); v->c = NULL; v->ncolor = 0; for (i = 0; i < v->nvec; i++) v->vncolor[i] = 0; return (void *)geom; } void *cray_vect_SetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, *eindex; HPoint3 *pt; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); /*findex = */(void)va_arg(*args, int); eindex = va_arg(*args, int *); pt = va_arg(*args, HPoint3 *); if (vindex != -1) craySetColorAtV(geom, color, vindex, NULL, pt); else { craySetColorAtV(geom, color, eindex[0], NULL, pt); craySetColorAtV(geom, color, eindex[1], NULL, pt); } return (void *)geom; } void *cray_vect_SetColorAtV(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; ColorA *color; int index; int i, j, k; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (index == -1) return NULL; for (i = j = k = 0; i < v->nvec; i++, j+= abs(v->vnvert[i]), k += v->vncolor[i]) if (j + abs(v->vnvert[i]) > index) break; switch(v->vncolor[i]) { case 0: return NULL; case 1: v->c[k] = *color; break; default: v->c[k + (index - j)] = *color; break; } return (void *)geom; } void *cray_vect_GetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, *eindex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); /*findex = */(void)va_arg(*args, int); eindex = va_arg(*args, int *); if (vindex != -1) return (void *)(long)crayGetColorAtV(geom, color, vindex, NULL, NULL); else return (void *)(long)crayGetColorAtV(geom, color, eindex[0], NULL, NULL); } void *cray_vect_GetColorAtV(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; ColorA *color; int index; int i, j, k; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (index == -1 || !v->ncolor) return NULL; for (i = j = k = 0; i < v->nvec; i++, j+= abs(v->vnvert[i]), k += v->vncolor[i]) if (j + abs(v->vnvert[i]) > index) break; switch(v->vncolor[i]) { case 1: k++; case 0: *color = v->c[k]; break; default: *color = v->c[k + (index - j)]; break; } return (void *)geom; } geomview-1.9.5/src/lib/geomutil/crayplutil/craySkel.c0000644000175000017500000002044412310110200017544 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include /* for abs() */ #include "geom.h" #include "skelP.h" #include "crayolaP.h" static char msg[] = "craySkel.c"; void *cray_skel_HasColor(int sel, Geom *geom, va_list *args); void *cray_skel_HasVColor(int sel, Geom *geom, va_list *args); void *cray_skel_HasFColor(int sel, Geom *geom, va_list *args); void *cray_skel_UseVColor(int sel, Geom *geom, va_list *args); void *cray_skel_UseFColor(int sel, Geom *geom, va_list *args); void *cray_skel_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_skel_SetColorAll(int sel, Geom *geom, va_list *args); void *cray_skel_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_skel_SetColorAtV(int sel, Geom *geom, va_list *args); void *cray_skel_SetColorAtF(int sel, Geom *geom, va_list *args); void *cray_skel_GetColorAt(int sel, Geom *geom, va_list *args); void *cray_skel_GetColorAtV(int sel, Geom *geom, va_list *args); void *cray_skel_GetColorAtF(int sel, Geom *geom, va_list *args); #define MAX_METHODS 15 static craySpecFunc methods[] = { {"crayHasColor", cray_skel_HasColor}, {"crayHasVColor", cray_skel_HasVColor}, {"crayHasFColor", cray_skel_HasFColor}, {"crayCanUseVColor", crayTrue}, {"crayCanUseFColor", crayTrue}, {"crayUseVColor", cray_skel_UseVColor}, {"crayUseFColor", cray_skel_UseFColor}, {"crayEliminateColor", cray_skel_EliminateColor}, {"craySetColorAll", cray_skel_SetColorAll}, {"craySetColorAt", cray_skel_SetColorAt}, {"craySetColorAtV", cray_skel_SetColorAtV}, {"craySetColorAtF", cray_skel_SetColorAtF}, {"crayGetColorAt", cray_skel_GetColorAt}, {"crayGetColorAtV", cray_skel_GetColorAtV}, {"crayGetColorAtF", cray_skel_GetColorAtF} }; int cray_skel_init(void) { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("skel")); return 0; } void *cray_skel_HasColor(int sel, Geom *geom, va_list *args) { Skel *s = (Skel *)geom; return (void *)(long)((s->geomflags & GEOM_COLOR) != 0); } void *cray_skel_HasFColor(int sel, Geom *geom, va_list *args) { Skel *s = (Skel *)geom; return (void *)(long)((s->geomflags & FACET_C) != 0); } void *cray_skel_HasVColor(int sel, Geom *geom, va_list *args) { Skel *s = (Skel *)geom; return (void *)(long)((s->geomflags & VERT_C) != 0); } /* Make sure the given SKEL has per-vertex colours, initialize a * default colour. */ void *cray_skel_UseVColor(int sel, Geom *geom, va_list *args) { Skel *s = (Skel *)geom; int i, j, k, ic; ColorA *def; def = va_arg(*args, ColorA *); if (s->vc == NULL) { s->vc = OOGLNewNE(ColorA, s->nvert, msg); } /* install the given default colour */ for (i = 0; i < s->nvert; i++) s->vc[i] = *def; /* if s has per-segment colours, initialize the vertex colours with * them. Of course, this cannot work properly. Should we do some * averaging? */ if (s->geomflags & FACET_C) { for (i = 0; i < s->nlines; i++) { if (s->l[i].nc == 0) { continue; } ic = s->l[i].c0; /* index of first and only colour */ for (j = 0; j < s->l[i].nv; j++) { k = s->vi[s->l[i].v0+j]; /* vertex colour index */ s->vc[k] = s->c[ic]; } } } s->geomflags |= VERT_C; return (void *)geom; } /* Same as above, but make sure the Skel object has facet (== segment) colour */ void *cray_skel_UseFColor(int sel, Geom *geom, va_list *args) { Skel *s = (Skel *)geom; int i; ColorA *color, *def; def = va_arg(*args, ColorA *); color = OOGLNewNE(ColorA, s->nlines, msg); for (i = 0; i < s->nlines; i++) { if (s->l[i].nc == 1) { color[i] = s->c[s->l[i].c0]; } else if (s->geomflags & VERT_C) { /* initialize with first vertex color */ color[i] = s->vc[s->vi[s->l[i].v0]]; } else { /* initialize with default colour */ color[i] = *def; } s->l[i].c0 = i; /* use a linear mapping, no holes anymore */ } if (s->c) { OOGLFree(s->c); } s->c = color; s->geomflags |= FACET_C; return (void *)geom; } void *cray_skel_EliminateColor(int sel, Geom *geom, va_list *args) { int i; Skel *s = (Skel *)geom; if (!crayHasColor(geom, NULL)) return 0; if (s->c) { OOGLFree(s->c); s->c = NULL; } if (s->vc) { OOGLFree(s->vc); s->vc = NULL; } for (i = 0; i < s->nlines; i++) { s->l[i].nc = 0; s->l[i].c0 = -1; } s->geomflags &= ~GEOM_COLOR; return (void *)geom; } void *cray_skel_SetColorAll(int sel, Geom *geom, va_list *args) { int i; Skel *s = (Skel *)geom; ColorA *color = va_arg(*args, ColorA *); if (!crayHasVColor(geom, NULL)) return NULL; if (s->c) { for (i = 0; i < s->nlines; i++) { s->c[s->l[i].c0] = *color; } } if (s->vc) { for (i = 0; i < s->nvert; i++) { s->vc[i] = *color; } } return geom; } void *cray_skel_SetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex, *eindex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); eindex = va_arg(*args, int *); if (crayHasVColor(geom, NULL)) { if (vindex != -1) return (void *)(long)craySetColorAtV(geom, color, vindex, NULL, NULL); if (eindex[0] != eindex[1]) { craySetColorAtV(geom, color, eindex[0], NULL, NULL); return (void *)(long)craySetColorAtV(geom, color, eindex[1], NULL, NULL); } } return (void *)(long)craySetColorAtF(geom, color, findex, NULL); } void *cray_skel_SetColorAtV(int sel, Geom *geom, va_list *args) { Skel *s = (Skel *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) { return NULL; } s->vc[index] = *color; return (void *)geom; } void *cray_skel_SetColorAtF(int sel, Geom *geom, va_list *args) { int i; Skel *s = (Skel *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (index == -1) { return NULL; } if (crayHasFColor(geom, NULL)) { /* The current facet possibly has no color */ if (s->l[index].nc == 0) { s->c = OOGLRenewNE(ColorA, s->c, s->nc+1, msg); s->l[index].c0 = s->nc++; s->l[index].nc = 1; } s->c[s->l[index].c0] = *color; } else if (crayHasVColor(geom, NULL)) { for (i = 0; i < s->l[index].nv; i++) { s->vc[s->vi[s->l[index].v0+i]] = *color; } } return (void *)geom; } void *cray_skel_GetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); if (crayHasVColor(geom, NULL)) { return (void *)(long)crayGetColorAtV(geom, color, vindex, NULL, NULL); } if (crayHasFColor(geom, NULL)) { return (void *)(long)crayGetColorAtF(geom, color, findex, NULL); } return NULL; } void *cray_skel_GetColorAtV(int sel, Geom *geom, va_list *args) { Skel *s = (Skel *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) { return NULL; } *color = s->vc[index]; return (void *)geom; } void *cray_skel_GetColorAtF(int sel, Geom *geom, va_list *args) { Skel *s = (Skel *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasFColor(geom, NULL) || index == -1) { return NULL; } if (s->l[index].nc == 0) { return NULL; } *color = s->c[s->l[index].c0]; return (void *)geom; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/geomutil/crayplutil/crayola.c0000644000175000017500000000775612310110200017434 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "color.h" #include "crayolaP.h" ColorA crayDefColor = {CRAY_DEFR, CRAY_DEFG, CRAY_DEFB, CRAY_DEFA}; static char methods[][CRAYOLA_MAXNAME] = { CRAYOLA_METHNAMES }; int sel[CRAYOLA_MAXMETH]; void crayolaInit(void) { int i; for (i = 0; i < CRAYOLA_MAXMETH; i++) sel[i] = GeomNewMethod(methods[i], crayFalse); cray_bezier_init(); cray_inst_init(); cray_list_init(); cray_mesh_init(); cray_polylist_init(); cray_npolylist_init(); cray_quad_init(); cray_vect_init(); cray_skel_init(); } void crayInitSpec(craySpecFunc *specfunc, int n_func, GeomClass *class) { int i; for (i = 0; i < n_func; i++) GeomSpecifyMethod(GeomMethodSel(specfunc[i].name), class, specfunc[i].func); } int crayHasColor(Geom *geom, int *gpath) { return (int)(long)GeomCall(sel[0], geom, gpath); } int crayHasVColor(Geom *geom, int *gpath) { return (int)(long)GeomCall(sel[1], geom, gpath); } int crayHasFColor(Geom *geom, int *gpath) { return (int)(long)GeomCall(sel[2], geom, gpath); } int crayCanUseVColor(Geom *geom, int *gpath) { return (int)(long)GeomCall(sel[3], geom, gpath); } int crayCanUseFColor(Geom *geom, int *gpath) { return (int)(long)GeomCall(sel[4], geom, gpath); } int crayUseVColor(Geom *geom, ColorA *color, int *gpath) { return (int)(long)GeomCall(sel[5], geom, color, gpath); } int crayUseFColor(Geom *geom, ColorA *color, int *gpath) { return (int)(long)GeomCall(sel[6], geom, color, gpath); } int crayEliminateColor(Geom *geom, int *gpath) { return (int)(long)GeomCall(sel[7], geom, gpath); } int craySetColorAll(Geom *geom, ColorA *color, int *gpath) { return (int)(long)GeomCall(sel[8], geom, color, gpath); } int craySetColorAt(Geom *geom, ColorA *color, int vindex, int findex, int *edge, int *gpath, HPoint3 *pt) { return (int)(long)GeomCall(sel[9], geom, color, vindex, findex, edge, gpath, pt); } int craySetColorAtV(Geom *geom, ColorA *color, int index, int *gpath, HPoint3 *pt) { return (int)(long)GeomCall(sel[10], geom, color, index, gpath, pt); } int craySetColorAtF(Geom *geom, ColorA *color, int index, int *gpath) { return (int)(long)GeomCall(sel[11], geom, color, index, gpath); } int crayGetColorAt(Geom *geom, ColorA *color, int vindex, int findex, int *edge, int *gpath, HPoint3 *pt) { return (int)(long)GeomCall(sel[12], geom, color, vindex, findex, edge, gpath, pt); } int crayGetColorAtV(Geom *geom, ColorA *color, int index, int *gpath, HPoint3 *pt) { return (int)(long)GeomCall(sel[13], geom, color, index, gpath, pt); } int crayGetColorAtF(Geom *geom, ColorA *color, int index, int *gpath) { return (int)(long)GeomCall(sel[14], geom, color, index, gpath); } void *crayTrue(int sel, Geom *geom, va_list *args) { return (void *)1; } void *crayFalse(int sel, Geom *geom, va_list *args) { return (void *)0; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/geomutil/crayplutil/crayola.h0000644000175000017500000000442312310110200017425 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef CRAYOLA_H #define CRAYOLA_H #include "color.h" /* * Default color */ #define CRAY_DEFR 1.0 #define CRAY_DEFG 1.0 #define CRAY_DEFB 1.0 #define CRAY_DEFA 1.00 extern ColorA crayDefColor; /* * Initialize the extended routines */ void crayolaInit(); int crayHasColor(Geom *geom, int *gpath); int crayHasVColor(Geom *geom, int *gpath); int crayHasFColor(Geom *geom, int *gpath); int crayCanUseVColor(Geom *geom, int *gpath); int crayCanUseFColor(Geom *geom, int *gpath); int crayUseVColor(Geom *geom, ColorA *def, int *gpath); int crayUseFColor(Geom *geom, ColorA *def, int *gpath); int crayEliminateColor(Geom *geom, int *gpath); /* * The point itself is last because no one except beziers really cares * about it so we won't force them to read past it in the arguement list. */ int craySetColorAll(Geom *geom, ColorA *color, int *gpath); int craySetColorAt(Geom *geom, ColorA *color, int vindex, int findex, int *edge, int *gpath, HPoint3 *pt); int craySetColorAtV(Geom *geom, ColorA *color, int index, int *gpath, HPoint3 *pt); int craySetColorAtF(Geom *geom, ColorA *color, int index, int *gpath); int crayGetColorAt(Geom *geom, ColorA *color, int vindex, int findex, int *edge, int *gpath, HPoint3 *pt); int crayGetColorAtV(Geom *geom, ColorA *color, int index, int *gpath, HPoint3 *pt); int crayGetColorAtF(Geom *geom, ColorA *color, int index, int *gpath); #endif geomview-1.9.5/src/lib/geomutil/crayplutil/crayolaP.h0000644000175000017500000000360312310110200017544 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef CRAYOLAP_H #define CRAYOLAP_H #include "crayola.h" #define CRAYOLA_MAXNAME 128 /* * WARNING: The order of the names of the routines is hardcoded * into the functions themselves. */ #define CRAYOLA_MAXMETH 15 #define CRAYOLA_METHNAMES "crayHasColor", "crayHasVColor", "crayHasFColor", \ "crayCanUseVColor", "crayCanUseFColor", \ "crayUseVColor", "crayUseFColor", "crayEliminateColor", \ "craySetColorAll", \ "craySetColorAt", "craySetColorAtV", "craySetColorAtF", \ "crayGetColorAt", "crayGetColorAtV", "crayGetColorAtF" typedef struct { char name[CRAYOLA_MAXNAME]; GeomExtFunc *func; } craySpecFunc; void crayInitSpec(craySpecFunc *specfunc, int n_func, GeomClass *class); void *crayTrue(int sel, Geom *geom, va_list *args); void *crayFalse(int sel, Geom *geom, va_list *args); int cray_bezier_init(); int cray_inst_init(); int cray_list_init(); int cray_mesh_init(); int cray_polylist_init(); int cray_npolylist_init(); int cray_quad_init(); int cray_vect_init(); int cray_skel_init(); #endif geomview-1.9.5/src/lib/geomutil/crayplutil/Headers0000644000175000017500000000002512310110200017112 00000000000000crayola.h crayolaP.h geomview-1.9.5/src/lib/geomutil/dim/0000755000175000017500000000000012310165603014301 500000000000000geomview-1.9.5/src/lib/geomutil/dim/Makefile.in0000644000175000017500000004560712310165553016306 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geomutil/dim DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libdim_la_LIBADD = am_libdim_la_OBJECTS = dim.lo libdim_la_OBJECTS = $(am_libdim_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libdim_la_SOURCES) DIST_SOURCES = $(libdim_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libdim.la libdim_la_SOURCES = \ dim.c \ dim.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geomutil/dim/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geomutil/dim/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libdim.la: $(libdim_la_OBJECTS) $(libdim_la_DEPENDENCIES) $(EXTRA_libdim_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libdim_la_OBJECTS) $(libdim_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dim.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/geomutil/dim/Makefile.am0000644000175000017500000000020112310110200016225 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libdim.la libdim_la_SOURCES = \ dim.c \ dim.h geomview-1.9.5/src/lib/geomutil/dim/dim.c0000644000175000017500000000616412310110200015124 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Get the dimension of the space in which a Geom lives */ #include "geomclass.h" #include "skelP.h" #include "ndmeshP.h" #include "polylistP.h" #include "npolylistP.h" #include "bezierP.h" #include "quadP.h" #include "meshP.h" #include "vectP.h" #include "listP.h" #include "discgrpP.h" #include "instP.h" #include "hpoint3.h" #include "point3.h" #include "dim.h" static void *dimdefault(int sel, Geom *g, va_list *args) { return (void *)(long)((g && (g->geomflags & VERT_4D)) ? g->pdim : g->pdim-1); } static void *dimSkel(int sel, Geom *g, va_list *args) { return (void *)(long)(((Skel *)g)->pdim-1); } static void *dimNDMesh(int sel, Geom *g, va_list *args) { return (void *)(long)(((NDMesh *)g)->pdim-1); } static void *dimNPolyList(int sel, Geom *g, va_list *args) { return (void *)(long)(((NPolyList *)g)->pdim-1); } static void *dimQuad(int sel, Geom *g, va_list *args) { return (void *)(long)((g && (g->geomflags & VERT_4D)) ? 4 : 3); } static void *dimMesh(int sel, Geom *g, va_list *args) { return (void *)(long)((g && (g->geomflags & VERT_4D)) ? 4 : 3); } static void *dimList(int sel, Geom *g, va_list *args) { int dim, maxdim = 3; List *l; for(l = (List *)g; l != NULL; l = l->cdr) { dim = GeomDimension(l->car); if(maxdim < dim) maxdim = dim; } return (void *)(long)maxdim; } static void *dimInst(int sel, Geom *g, va_list *args) { return (void *)(long)GeomDimension(((Inst *)g)->geom); } static int DimSel = 0; int GeomDimension(Geom *g) { if(DimSel == 0) { DimSel = GeomNewMethod("dimension", dimdefault); GeomSpecifyMethod(DimSel, SkelMethods(), dimSkel); GeomSpecifyMethod(DimSel, NDMeshMethods(), dimNDMesh); GeomSpecifyMethod(DimSel, NPolyListMethods(), dimNPolyList); GeomSpecifyMethod(DimSel, ListMethods(), dimList); GeomSpecifyMethod(DimSel, InstMethods(), dimInst); GeomSpecifyMethod(DimSel, InstMethods(), dimInst); GeomSpecifyMethod(DimSel, QuadMethods(), dimQuad); GeomSpecifyMethod(DimSel, MeshMethods(), dimMesh); } return (int)(long)GeomCall( DimSel, g ); } geomview-1.9.5/src/lib/geomutil/dim/dim.h0000644000175000017500000000220612310110200015122 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * dim.h */ #ifndef DIM_H #define DIM_H /* * Return the dimension of the space in which this Geom lives. * For objects with components of different dimensions, * returns the highest dimension. */ int GeomDimension(Geom *g); #endif /* DIM_H */ geomview-1.9.5/src/lib/geomutil/dim/Headers0000644000175000017500000000000612310110200015472 00000000000000dim.h geomview-1.9.5/src/lib/geomutil/plutil/0000755000175000017500000000000012310165603015041 500000000000000geomview-1.9.5/src/lib/geomutil/plutil/Makefile.in0000644000175000017500000005436312310165553017045 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geomutil/plutil DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libplutil_la_LIBADD = am_libplutil_la_OBJECTS = anytopl.lo plcombine.lo plconsol.lo libplutil_la_OBJECTS = $(am_libplutil_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libplutil_la_SOURCES) DIST_SOURCES = $(libplutil_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man3dir = $(mandir)/man3 am__installdirs = "$(DESTDIR)$(man3dir)" NROFF = nroff MANS = $(man_MANS) 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) man_MANS = anytopl.3gv plcombine.3gv plconsol.3gv EXTRA_DIST = Headers $(man_MANS) noinst_LTLIBRARIES = libplutil.la libplutil_la_SOURCES = \ anytopl.c plcombine.c plconsol.c \ plutil.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geomutil/plutil/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geomutil/plutil/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libplutil.la: $(libplutil_la_OBJECTS) $(libplutil_la_DEPENDENCIES) $(EXTRA_libplutil_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libplutil_la_OBJECTS) $(libplutil_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anytopl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plcombine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plconsol.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man3: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man3dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.3[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ done; } uninstall-man3: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man3dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.3[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man3dir)'; $(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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(MANS) installdirs: for dir in "$(DESTDIR)$(man3dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man3 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man3 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man3 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-man \ uninstall-man3 # 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: geomview-1.9.5/src/lib/geomutil/plutil/Makefile.am0000644000175000017500000000034512310110200016776 00000000000000INCLUDES = $(default_includes) man_MANS = anytopl.3gv plcombine.3gv plconsol.3gv EXTRA_DIST = Headers $(man_MANS) noinst_LTLIBRARIES = libplutil.la libplutil_la_SOURCES = \ anytopl.c plcombine.c plconsol.c \ plutil.h geomview-1.9.5/src/lib/geomutil/plutil/anytopl.c0000644000175000017500000005053312310110200016600 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * anytopl.c * author: Celeste Fowler * date: June 12, 1992 * Rewritten, Stuart Levy, July, 1996. */ #include #include #include "transformn.h" #include "polylistP.h" #include "npolylistP.h" #include "bezierP.h" #include "quadP.h" #include "meshP.h" #include "ndmeshP.h" #include "vectP.h" #include "listP.h" #include "discgrpP.h" #include "instP.h" #include "skelP.h" #include "hpoint3.h" #include "point3.h" #include "plutil.h" #ifndef alloca #include #endif #define PL_C 0x1 #define PL_N 0x2 #define PL_H 0x4 #define PL_ND 0x8 #define PL_HASPC PL_HASPCOL #define PL_HASVC PL_HASVCOL typedef struct _face { int nv; /* Number of vertices on this face */ int v0; /* Index of first vertex in vtable */ ColorA fcolor; /* Face color if specified */ } Face; typedef struct _vert { HPoint3 p; ColorA c; Point3 n; float *ndp; /* Pointer to raw data for N-D vertex */ int hdim; /* Dimension of this point */ int has; } Vert; struct _PLData { int maxdim; int some, all; /* PL_HASVN, PL_HASVC, PL_HASPN, PL_HASPC */ vvec faces; /* Table {Face} of all faces */ vvec verts; /* Table {Vert} of vertices */ vvec vtable; /* Table of vertex-indices for all faces */ /* Top of stacks of... */ TransformN *Tn; /* N-D to 3-D transform */ Transform T; /* 3-D transform */ Appearance *ap; /* appearance */ }; #define PLnextvert(PL) VVCOUNT((PL)->verts) Geom *PLDataToGeom(PLData *PL, int want, int unwant); static void PLDataDelete(PLData *PL); static PLData *PLDataCreate(); static void initmethods(); static void PLaddface(PLData *PL, int nv, int verts[], ColorA *c); static void PLaddvect(PLData *PL, int nv, int verts[], ColorA *c); static int PLaddverts(PLData *PL, int nv, HPoint3 *v, ColorA *c, Point3 *n); static int PLaddNDverts(PLData *PL, int nv, int hdim, float *v, ColorA *c); static void PLaddseg(PLData *PL, int v0, int v1, ColorA *c); static int toPLsel; static ColorA white = {1,1,1,1}; static ColorA black = {0,0,0,1}; static Point3 noNormal = {0,0,0}; /* * AnyToPL converter. * Converts any geomview object to a polylist and returns a pointer * to the polylist. NB to future developers: * There are a lot of assumptions about the internals ofny * the various data types. If anything changes, things will have to * be adjusted accordingly. */ Geom *AnyToPL(Geom *g, Transform T) { PLData *pd = AnyGeomToPLData(g, T, NULL, NULL, NULL); Geom *ng = PLDataToGeom(pd, 0, PL_ND); PLDataDelete(pd); return ng; } static HPoint3 *hpoints(PLData *PL) { HPointN hp; int i; HPoint3 *pts = OOGLNewNE(HPoint3, VVCOUNT(PL->verts), "PL verts"); HPoint3 *p = pts; Vert *v = VVEC(PL->verts, Vert); static int xyzw[] = {0, 1, 2, -1}; for(i = 0; i < VVCOUNT(PL->verts); i++, p++, v++) { if(v->hdim == 0) { *p = v->p; } else { if(PL->Tn) { hp.dim = v->hdim; hp.v = v->ndp; HPtNTransformComponents(PL->Tn, &hp, xyzw, p); } else { /* Project to 3-space: just take first 3 and final components. */ memcpy(p, v->ndp, 3*sizeof(float)); p->w = v->ndp[v->hdim-1]; } } } return pts; } static float *ndpoints(PLData *PL) { HPointN hp; int i; int hdim = PL->maxdim ? PL->maxdim : 4; float *pts = OOGLNewNE(float, hdim*VVCOUNT(PL->verts), "PL ndverts"); float *p = pts; Vert *v = VVEC(PL->verts, Vert); VARARRAY(comp, int, hdim); for(i = 0; i < hdim-1; i++) { comp[i] = i; } comp[hdim-1] = -1; for(i = 0; i < VVCOUNT(PL->verts); i++, v++, p += hdim) { if(PL->Tn) { if(v->hdim) { hp.dim = v->hdim; hp.v = v->ndp; } else { hp.dim = 4; hp.v = &v->p.x; } HPtNTransformComponents(PL->Tn, &hp, comp, (HPoint3 *)p); } else { if(v->hdim == hdim) { memcpy(p, v->ndp, hdim*sizeof(float)); } else if(v->hdim == 0) { memcpy(p, &v->p, 3*sizeof(float)); memset(p+3, 0, (hdim-4)*sizeof(float)); p[hdim-1] = v->p.w; } else if(v->hdim < hdim) { memcpy(p, v->ndp, (v->hdim-1)*sizeof(float)); memset(p+v->hdim, 0, (hdim - v->hdim - 1)*sizeof(float)); p[hdim-1] = v->ndp[v->hdim-1]; } else { memcpy(p, v->ndp, (hdim-1)*sizeof(float)); p[hdim-1] = v->ndp[v->hdim-1]; } } } return pts; } /* Unpack PLData */ Geom *PLDataToGeom(PLData *PL, int want, int unwant) { HPoint3 *hpts = NULL; float *nhpts = NULL; ColorA *c = NULL, *pc = NULL; Point3 *n = NULL; int *nvert; int i; Face *fp; Vert *vp; Geom *pl, *npl; if(PL == NULL || VVCOUNT(PL->faces) == 0 || VVCOUNT(PL->verts) == 0) return NULL; nvert = (int *)alloca(VVCOUNT(PL->faces) * sizeof(int)); fp = VVEC(PL->faces, Face); for(i = 0; i < VVCOUNT(PL->faces); i++, fp++) nvert[i] = fp->nv; if((PL->some & PL_HASVC) && !(unwant & PL_C)) { c = (ColorA *)alloca(VVCOUNT(PL->verts)*sizeof(ColorA)); for(i = 0, vp = VVEC(PL->verts, Vert); i < VVCOUNT(PL->verts); i++, vp++) c[i] = vp->c; } if((PL->some & PL_HASPC) && !(unwant & PL_C)) { pc = (ColorA *)alloca(VVCOUNT(PL->faces)*sizeof(ColorA)); for(i = 0, fp = VVEC(PL->faces, Face); i < VVCOUNT(PL->faces); i++, fp++) pc[i] = fp->fcolor; } if((PL->some & PL_HASVN) && !(unwant & PL_N)) { n = (Point3 *)alloca(VVCOUNT(PL->verts)*sizeof(Point3)); for(i = 0, vp = VVEC(PL->verts, Vert); i < VVCOUNT(PL->verts); i++, vp++) n[i] = vp->n; } /* Do we need to remap points? */ if(PL->maxdim > 4 && !(unwant & PL_ND)) { nhpts = ndpoints(PL); npl = GeomCCreate(NULL, NPolyListMethods(), CR_DIM, PL->maxdim-1, CR_NPOLY, VVCOUNT(PL->faces), CR_NVERT, nvert, CR_VERT, VVEC(PL->vtable, int), CR_POINT4, nhpts, CR_COLOR, c, CR_POLYCOLOR, pc, CR_END); return npl; } else { hpts = hpoints(PL); pl = GeomCCreate(NULL, PolyListMethods(), CR_NPOLY, VVCOUNT(PL->faces), CR_NVERT, nvert, CR_VERT, VVEC(PL->vtable, int), CR_POINT4, hpts, CR_NORMAL, n, CR_COLOR, c, CR_POLYCOLOR, pc, CR_END); if(want & PL_N) PolyListComputeNormals((PolyList *)pl, PL_HASPN|PL_HASPFL); return pl; } } static PLData * PLDataCreate() { PLData *PL = OOGLNewE(PLData, "PLData"); if(toPLsel == 0) initmethods(); PL->maxdim = 0; PL->some = 0; PL->all = PL_HASVC|PL_HASPC|PL_HASVN; VVINIT(PL->faces, Face, 1000); vvzero(&PL->faces); VVINIT(PL->verts, Vert, 1000); vvzero(&PL->faces); VVINIT(PL->vtable, int, 4000); PL->Tn = NULL; TmIdentity(PL->T); PL->ap = ApCreate(AP_DO, APF_FACEDRAW|APF_VECTDRAW, AP_LINEWIDTH, 1, AP_NORMSCALE, 1.0, AP_SHADING, APF_FLAT, AP_END); return PL; } static void PLDataDelete(PLData *PL) { if(PL) { vvfree(&PL->faces); vvfree(&PL->verts); vvfree(&PL->vtable); if(PL->Tn) TmNDelete(PL->Tn); if(PL->ap) ApDelete(PL->ap); } } static void *beziertoPL(int sel, Bezier *bez, va_list *args) { PLData *PL = va_arg(*args, PLData *); if(PL->ap && (PL->ap->flag & APF_DICE)) BezierDice( bez, PL->ap->dice[0], PL->ap->dice[1] ); if(bez->mesh == NULL || bez->geomflags & BEZ_REMESH) BezierReDice(bez); return GeomCall(sel, (Geom *)bez->mesh, PL); } static void *discgrptoPL(int sel, DiscGrp *dg, va_list *args) { Geom *geom = NULL; PLData *PL = va_arg(*args, PLData *); int i; if(dg->big_list == NULL || dg->big_list->el_list == NULL) return NULL; geom = dg->geom ? dg->geom : dg->ddgeom ? dg->ddgeom : DiscGrpDirDom(dg); for (i=0; ibig_list->num_el; ++i) { AnyGeomToPLData(geom, dg->big_list->el_list[i].tform, NULL, NULL, PL); if(dg->camgeom) AnyGeomToPLData(dg->camgeom, dg->big_list->el_list[i].tform, NULL, NULL, PL); } return PL; } static void *insttoPL(int sel, Inst *inst, va_list *args) { GeomIter *it; Transform T; PLData *PL = va_arg(*args, PLData *); it = GeomIterate((Geom *)inst, DEEP); while(NextTransform(it, T)) { AnyGeomToPLData(inst->geom, T, NULL, NULL, PL); } return PL; } static void *listtoPL(int sel, List *list, va_list *args) { List *l; PLData *PL = va_arg(*args, PLData *); for(l = list; l != NULL; l = l->cdr) { GeomCall(sel, l->car, PL); } return PL; } static void putmesh(PLData *PL, int base, int nu, int nv, int uwrap, int vwrap) { int v0 = 1, prev0v = 0; int u0 = 1, prev0u = 0; int u, v, prevu, prevv; if(vwrap) { v0 = 0, prev0v = nv-1; } if(uwrap) { u0 = 0, prev0u = nu-1; } #define MESHV(u,v) (base + nu*(v) + u) if(PL->ap->flag & (APF_FACEDRAW|APF_NORMALDRAW)) { for(prevv = prev0v, v = v0; v < nv; prevv = v, v++) { for(prevu = prev0u, u = u0; u < nu; prevu = u, u++) { int face[4]; face[0] = MESHV(prevu,prevv); face[1] = MESHV(u,prevv); face[2] = MESHV(u,v); face[3] = MESHV(prevu,v); PLaddface(PL, 4, face, NULL); } } } if(nu == 1 || nv == 1 || (PL->ap->flag & (APF_EDGEDRAW|APF_FACEDRAW|APF_NORMALDRAW)) == APF_EDGEDRAW) { for(v = 0; v < nv; v++) for(prevu = prev0u, u = u0; u < nu; prevu = u, u++) PLaddseg(PL, MESHV(prevu, v), MESHV(u, v), NULL); for(u = 0; u < nu; u++) for(prevv = prev0v, v = v0; v < nv; prevv = v, v++) PLaddseg(PL, MESHV(u, prevv), MESHV(u, v), NULL); } #undef MESHV } static void *meshtoPL(int sel, Mesh *m, va_list *args) { int base; PLData *PL = va_arg(*args, PLData *); base = PLaddverts(PL, m->nu*m->nv, m->p, m->c, m->n); putmesh(PL, base, m->nu, m->nv, m->geomflags & MESH_UWRAP, m->geomflags & MESH_VWRAP); return PL; } static void *ndmeshtoPL(int sel, NDMesh *ndm, va_list *args) { int nu = ndm->mdim[0]; int nv = ndm->meshd > 1 ? ndm->mdim[1] : 1; int u, v, base = -1; PLData *PL = va_arg(*args, PLData *); HPointN **pp = ndm->p; ColorA *c = ndm->c; base = PLnextvert(PL); pp = ndm->p; for(v = 0; v < nv; v++) { for(u = 0; u < nu; u++, pp++) { PLaddNDverts(PL, 1, (*pp)->dim, (*pp)->v, c); if(c) c++; } } putmesh(PL, base, nu, nv, 0, 0); return PL; } static void *npolylisttoPL(int sel, NPolyList *npl, va_list *args) { PLData *PL = va_arg(*args, PLData *); int base; Poly *p; int i, vi; #define VMAX 100 int face[VMAX]; base = PLaddNDverts(PL, npl->n_verts, npl->pdim, npl->v, npl->vcol); vvneeds(&PL->vtable, VVCOUNT(PL->vtable) + npl->nvi); for(i = 0, p = npl->p; i < npl->n_polys; i++, p++) { int *vip = face; if(p->n_vertices > VMAX) vip = OOGLNewNE(int, p->n_vertices, "npolylist face"); for(vi = 0; vi < p->n_vertices; vi++) vip[vi] = base + npl->vi[vi + npl->pv[i]]; PLaddface(PL, p->n_vertices, vip, npl->geomflags & PL_HASPCOL ? &p->pcol : NULL); if(p->n_vertices > VMAX) OOGLFree(vip); } return PL; } static void *polylisttoPL(int sel, PolyList *pl, va_list *args) { PLData *PL = va_arg(*args, PLData *); Poly *p; Vertex *v = pl->vl; int base, i, vi; int face[VMAX]; base = PLnextvert(PL); for(i = 0; i < pl->n_verts; i++, v++) { PLaddverts(PL, 1, &v->pt, pl->geomflags & PL_HASVCOL ? &v->vcol : NULL, pl->geomflags & PL_HASVN ? &v->vn : NULL); } p = pl->p; for(i = 0; i < pl->n_polys; i++, p++) { int *vip = face; if(p->n_vertices > VMAX) vip = OOGLNewNE(int, p->n_vertices, "polylist face"); for(vi = 0; vi < p->n_vertices; vi++) vip[vi] = base + (p->v[vi] - pl->vl); PLaddface(PL, p->n_vertices, vip, pl->geomflags & PL_HASPCOL ? &p->pcol : NULL); if(p->n_vertices > VMAX) OOGLFree(vip); } return PL; } static void *quadtoPL(int sel, Quad *q, va_list *args) { PLData *PL = va_arg(*args, PLData *); int base, v, i; base = PLaddverts(PL, q->maxquad*4, *q->p, *q->c, *q->n); for(i = 0, v = base; i < q->maxquad; i++) { int face[4]; face[0] = v++; face[1] = v++; face[2] = v++; face[3] = v++; PLaddface(PL, 4, face, NULL); } return PL; } static void *skeltoPL(int sel, Skel *s, va_list *args) { PLData *PL = va_arg(*args, PLData *); int base, i; int vert, edge[2]; Skline *l = s->l; if(PL->ap && (PL->ap->flag & APF_VECTDRAW) == 0) return NULL; base = s->pdim == 4 ? PLaddverts(PL, s->nvert, (HPoint3 *)s->p, NULL, NULL) : PLaddNDverts(PL, s->nvert, s->pdim, s->p, NULL); vvneeds(&PL->vtable, VVCOUNT(PL->vtable) + 2*s->nvi); for(i = 0; i < s->nlines; i++, l++) { int v = l->v0; int nv = l->nv; int c = l->c0; int nc = l->nc; if(nv == 1) { vert = s->vi[v] + base; PLaddvect(PL, 1, &vert, nc>0 ? &s->c[c] : NULL); } else { while(--nv > 0) { edge[0] = s->vi[v] + base; edge[1] = s->vi[++v] + base; PLaddvect(PL, 2, edge, nc>0 ? &s->c[c] : NULL); nc--; c++; } } } return PL; } static void *vecttoPL(int sel, Vect *v, va_list *args) { PLData *PL = va_arg(*args, PLData *); int base, i, vno; short *vip, *cip; ColorA *cp, *lastc; if(PL->ap && (PL->ap->flag & APF_VECTDRAW) == 0) return NULL; base = PLaddverts(PL, v->nvert, v->p, NULL, NULL); vvneeds(&PL->vtable, VVCOUNT(PL->vtable) + 2*v->nvert); vno = base; vip = v->vnvert; cip = v->vncolor; cp = v->c; lastc = (v->ncolor>0) ? cp : NULL; for(i = 0, vno = base; i < v->nvec; i++, vip++, cip++) { int nv = *vip; int nc = *cip; if(nv < 0) nv = -nv; if(nv == 1) { PLaddvect(PL, 1, &vno, nc>0 ? cp : lastc); } else { while(--nv > 0) { PLaddseg(PL, vno, vno+1, nc>0 ? cp : lastc); vno++; if(nc > 1) { nc--; cp++; } } if(*vip < 0) PLaddseg(PL, vno, vno + *vip + 1, nc>0 ? cp : lastc); } if(nc > 0) { lastc = cp + nc - 1; cp += nc; } vno++; } return PL; } static int PLaddverts(PLData *PL, int nv, HPoint3 *v, ColorA *c, Point3 *n) { Vert *vp; Material *mat; int i; int base = PLnextvert(PL); int has = 0; ColorA *cdef = &white; if(nv <= 0) return base; /* Apply appearance */ if(PL->ap && (mat = PL->ap->mat) != NULL) { if(mat->override & MTF_DIFFUSE) c = NULL; if(mat->valid & MTF_DIFFUSE) { cdef = &mat->diffuse; has = PL_HASVC; } } if(c) has = PL_HASVC; if(n) has |= PL_HASVN; PL->some |= has; PL->all &= ~has; vvneeds(&PL->verts, VVCOUNT(PL->verts) + nv); vp = &VVEC(PL->verts, Vert)[ VVCOUNT(PL->verts) ]; for(i = 0; i < nv; i++, vp++) { vp->has = has; HPt3Transform(PL->T, v++, &vp->p); vp->c = c ? *c++ : *cdef; vp->n = (n != NULL) ? *n++ : noNormal; vp->hdim = 0; vp->ndp = NULL; } VVCOUNT(PL->verts) += nv; return base; } static int PLaddNDverts(PLData *PL, int nv, int hdim, float *v, ColorA *c) { Vert *vp; Material *mat; int i; int base = PLnextvert(PL); int has = 0; ColorA *cdef = &white; if(nv <= 0) return base; if(PL->maxdim < hdim) PL->maxdim = hdim; /* Apply appearance */ if((mat = PL->ap->mat) != NULL) { if(mat->override & MTF_DIFFUSE) c = NULL; if(mat->valid & MTF_DIFFUSE) { cdef = (ColorA *)&mat->diffuse; has = PL_HASVC; } } if(c) has = PL_HASVC; PL->some |= has; PL->all &= ~has; vvneeds(&PL->verts, VVCOUNT(PL->verts) + nv); vp = &VVEC(PL->verts, Vert)[ VVCOUNT(PL->verts) ]; for(i = 0; i < nv; i++, vp++) { vp->has = has; /* If we could have N-D transforms embedded in an OOGL tree, * this part might change to alloc'ing a new N-D point, applying the * current N-D transform to this point, and storing vp->ndp as pointing * to the new copy. */ vp->hdim = hdim; vp->ndp = v; v += hdim; vp->c = *(c ? c++ : cdef); } VVCOUNT(PL->verts) += nv; return base; } static void PLaddface(PLData *PL, int nv, int verts[], ColorA *c) { Material *mat; Face *fp; int i; if(nv <= 0) return; if(PL->ap->flag & APF_FACEDRAW) { vvneeds(&PL->vtable, VVCOUNT(PL->vtable) + nv); memcpy( &VVEC(PL->vtable, int)[VVCOUNT(PL->vtable)], verts, nv*sizeof(int)); fp = VVAPPEND(PL->faces, Face); fp->v0 = VVCOUNT(PL->vtable); fp->nv = nv; VVCOUNT(PL->vtable) += nv; /* Apply appearance */ if((mat = PL->ap->mat) != NULL) { if(mat->override & MTF_DIFFUSE) c = NULL; if(mat->valid & MTF_DIFFUSE) c = (ColorA *)&mat->diffuse; } if(c) { fp->fcolor = *c; PL->some |= PL_HASPC; } else { fp->fcolor = white; PL->all &= ~PL_HASPC; } } if(PL->ap->flag & APF_EDGEDRAW && nv>1) { PLaddseg(PL, verts[nv-1], verts[0], NULL); for(i = 1; i < nv; i++) PLaddseg(PL, verts[i-1], verts[i], NULL); } #ifdef notyet if(PL->ap->flag & APF_NORMALDRAW) { /* Well, maybe not now. */ } #endif } static void PLaddseg(PLData *PL, int v0, int v1, ColorA *c) { Face *fp = VVAPPEND(PL->faces, Face); Material *mat = PL->ap->mat; if(mat && (mat->valid & MTF_EDGECOLOR)) { if(c == NULL || mat->override & MTF_EDGECOLOR) { fp->fcolor.r = mat->edgecolor.r; fp->fcolor.g = mat->edgecolor.g; fp->fcolor.b = mat->edgecolor.b; fp->fcolor.a = mat->diffuse.a; PL->some |= PL_HASPC; } else if(c) { fp->fcolor = *c; PL->some |= PL_HASPC; } } else if(c) { fp->fcolor = *c; PL->some |= PL_HASPC; } else { PL->all &= ~PL_HASPC; } fp->v0 = VVCOUNT(PL->vtable); fp->nv = 2; *VVAPPEND(PL->vtable, int) = v0; *VVAPPEND(PL->vtable, int) = v1; } static void PLaddvect(PLData *PL, int nv, int verts[], ColorA *c) { Material *mat; ColorA edgec; Face *fp; if(nv <= 0) return; if(!(PL->ap->flag & APF_VECTDRAW)) return; vvneeds(&PL->vtable, VVCOUNT(PL->vtable) + nv); memcpy( &VVEC(PL->vtable, int)[VVCOUNT(PL->vtable)], verts, nv*sizeof(int)); fp = VVAPPEND(PL->faces, Face); fp->v0 = VVCOUNT(PL->vtable); fp->nv = nv; VVCOUNT(PL->vtable) += nv; /* Apply appearance */ if((mat = PL->ap->mat) != NULL) { if(mat->override & MTF_EDGECOLOR) c = NULL; if((mat->valid & MTF_EDGECOLOR) && c == NULL) { edgec.r = mat->edgecolor.r; edgec.g = mat->edgecolor.g; edgec.b = mat->edgecolor.b; edgec.a = mat->diffuse.a; c = &edgec; } } if(c) { fp->fcolor = *c; PL->some |= PL_HASPC; } else { fp->fcolor = black; PL->all &= ~PL_HASPC; } } static void initmethods() { toPLsel = GeomNewMethod( "toPLData", NULL ); GeomSpecifyMethod( toPLsel, BezierMethods(), (GeomExtFunc*)beziertoPL ); GeomSpecifyMethod( toPLsel, DiscGrpMethods(), (GeomExtFunc*)discgrptoPL ); GeomSpecifyMethod( toPLsel, InstMethods(), (GeomExtFunc*)insttoPL ); GeomSpecifyMethod( toPLsel, ListMethods(), (GeomExtFunc*)listtoPL ); GeomSpecifyMethod( toPLsel, MeshMethods(), (GeomExtFunc*)meshtoPL ); GeomSpecifyMethod( toPLsel, NDMeshMethods(), (GeomExtFunc*)ndmeshtoPL ); GeomSpecifyMethod( toPLsel, NPolyListMethods(), (GeomExtFunc*)npolylisttoPL ); GeomSpecifyMethod( toPLsel, PolyListMethods(), (GeomExtFunc*)polylisttoPL ); GeomSpecifyMethod( toPLsel, QuadMethods(), (GeomExtFunc*)quadtoPL ); GeomSpecifyMethod( toPLsel, SkelMethods(), (GeomExtFunc*)skeltoPL ); GeomSpecifyMethod( toPLsel, VectMethods(), (GeomExtFunc*)vecttoPL ); } PLData *AnyGeomToPLData(Geom *g, Transform T, TransformN *Tn, Appearance *pap, PLData *PL) { Transform Told; TransformN *Tnold = NULL; Appearance *apold = NULL; if(g == NULL) return PL; if(PL == NULL) PL = PLDataCreate(); if(pap || g->ap) { apold = PL->ap; if(pap && g->ap) { PL->ap = ApMerge(pap, PL->ap, 0); ApMerge(g->ap, PL->ap, APF_INPLACE); } else { PL->ap = ApMerge(pap ? pap : g->ap, PL->ap, 0); } } if(T) { TmCopy(PL->T, Told); TmConcat(T, Told, PL->T); } if(Tn) { Tnold = PL->Tn; PL->Tn = TmNConcat(Tn, PL->Tn, NULL); } GeomCall(toPLsel, g, PL); if(apold) { ApDelete(PL->ap); PL->ap = apold; } if(T) TmCopy(Told, PL->T); if(Tn) { TmNDelete(PL->Tn); PL->Tn = Tnold; } return PL; } geomview-1.9.5/src/lib/geomutil/plutil/plcombine.c0000644000175000017500000001374712310110200017070 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * plcombine.c * author: Celeste Fowler * date: June 12, 1992 */ #include #include "transformn.h" #include "polylistP.h" #include "hpoint3.h" #include "point3.h" #include "plutil.h" static char msg[] = "plcombine.c"; /* * PolyList combiner. * A minor sideshow. If a and b differ in some fundamental way in terms * of per vertex / per face colors / normals, the colors / normals will * be eliminated in the result. If one polylist is three-d and the other * is four-d, the result will be three-d */ Geom *PLCombine(Geom *a1, Geom *b1) { PolyList *a = (PolyList *)a1, *b = (PolyList *)b1; int i, j, k; HPoint3 *point4; ColorA *color, *polycolor; Point3 *normal; Point3 *polynormal; int *vert, nvertices, *nvert, *polyflags; Geom *new; int flags, fourd = 0; if (a == NULL) return(GeomCopy((Geom *)b)); if (b == NULL) return(GeomCopy((Geom *)a)); if (strcmp(GeomName(a1), "polylist") || strcmp(GeomName(b1), "polylist")) OOGLError(0, "Arguements to PLCombine() not of polylist type."); nvertices = a->n_verts + b->n_verts; /* Copy points, normals, colors. */ point4 = (HPoint3 *)OOG_NewE(nvertices * sizeof(HPoint3), msg); color = (ColorA *)OOG_NewE(nvertices * sizeof(ColorA), msg); normal = (Point3 *)OOG_NewE(nvertices * sizeof(Point3), msg); for (i = 0; i < a->n_verts; i++) { point4[i] = a->vl[i].pt; color[i] = a->vl[i].vcol; normal[i] = a->vl[i].vn; } for (i = 0; i < b->n_verts; i++) { point4[a->n_verts + i] = b->vl[i].pt; color[a->n_verts + i] = b->vl[i].vcol; normal[a->n_verts + i] = b->vl[i].vn; } /* Create polygons */ nvert = (int *)OOG_NewE((a->n_polys + b->n_polys) * sizeof(int), msg); polycolor = (ColorA *)OOG_NewE((a->n_polys + b->n_polys) * sizeof(ColorA), msg); polynormal = (Point3 *)OOG_NewE((a->n_polys + b->n_polys) * sizeof(Point3), msg); polyflags = (int *)OOG_NewE((a->n_polys + b->n_polys) * sizeof(int), msg); for (i = j = 0; i < a->n_polys; i++) j += a->p[i].n_vertices; for (i = 0; i < b->n_polys; i++) j += b->p[i].n_vertices; vert = (int *)OOG_NewE(j * sizeof(int), msg); for (i = k = 0; i < a->n_polys; i++) { nvert[i] = a->p[i].n_vertices; polycolor[i] = a->p[i].pcol; polynormal[i] = a->p[i].pn; polyflags[i] = a->p[i].flags; for (j = 0; j < a->p[i].n_vertices; j++) vert[k++] = a->p[i].v[j] - a->vl; } for (i = 0; i < b->n_polys; i++) { nvert[a->n_polys + i] = b->p[i].n_vertices; polycolor[a->n_polys + i] = b->p[i].pcol; polynormal[a->n_polys + i] = b->p[i].pn; polyflags[a->n_polys + i] = b->p[i].flags; for (j = 0; j < b->p[i].n_vertices; j++) vert[k++] = a->n_verts + b->p[i].v[j] - b->vl; } flags = a->geomflags; fourd = (a->geomflags & VERT_4D) ? 1 : 0; if ((a->geomflags & PL_HASVCOL) && !(b->geomflags & PL_HASVCOL)) { if (b->geomflags & PL_HASPCOL) { for (i = 0; i < a->n_polys; i++) polycolor[i] = a->p[i].v[0]->vcol; flags ^= PL_HASVCOL; flags |= PL_HASPCOL; } else for (i = 0; i < b->n_verts; i++) { color[a->n_verts + i].r = color[a->n_verts + i].g = color[a->n_verts + i].b = 0.15; color[a->n_verts + i].a = 1.0; } } if ((a->geomflags & PL_HASPCOL) && !(b->geomflags & PL_HASPCOL)) { if (b->geomflags & PL_HASVCOL) { for (i = 0; i < b->n_polys; i++) polycolor[a->n_polys + i] = b->p[i].v[0]->vcol; } else for (i = 0; i < b->n_polys; i++) { polycolor[a->n_polys + i].r = polycolor[a->n_polys + i].g = polycolor[a->n_polys + i].b = 0.15; polycolor[a->n_polys + i].a = 1.0; } } if (!(flags & PL_HASVCOL) && !(flags & PL_HASPCOL)) { if (b->geomflags & PL_HASPCOL) { for (i = 0; i < a->n_polys; i++) { polycolor[i].r = polycolor[i].g = polycolor[i].b = 0.15; polycolor[i].a = 1.0; } flags |= PL_HASPCOL; } if (b->geomflags & PL_HASVCOL) { for (i = 0; i < a->n_verts; i++) { color[i].r = color[i].g = color[i].b = 0.15; color[i].a = 1.0; } flags |= PL_HASVCOL; } } if ((a->geomflags & PL_HASVN) && !(b->geomflags & PL_HASVN)) flags ^= PL_HASVN; if ((a->geomflags & PL_HASPN) && !(b->geomflags & PL_HASPN)) flags ^= PL_HASPN; if ((a->geomflags & PL_HASPFL) && !(b->geomflags & PL_HASPFL)) flags ^= PL_HASPFL; if ((a->geomflags & VERT_4D) || (b->geomflags & VERT_4D)) fourd = 1; new = GeomCreate("polylist", CR_NPOLY, a->n_polys + b->n_polys, CR_POINT4, point4, CR_NORMAL, normal, CR_COLOR, color, CR_NVERT, nvert, CR_VERT, vert, CR_POLYNORMAL, polynormal, CR_POLYFLAGS, polyflags, CR_POLYCOLOR, polycolor, CR_FLAG, flags, CR_4D, fourd, CR_END); OOGLFree(point4); OOGLFree(color); OOGLFree(normal); OOGLFree(nvert); OOGLFree(polycolor); OOGLFree(polynormal); OOGLFree(polyflags); OOGLFree(vert); return(new); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/geomutil/plutil/plconsol.c0000644000175000017500000000633112310110200016740 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "geomclass.h" #include "geom.h" #include "polylist.h" #include "polylistP.h" #include "hpoint3.h" #include "plutil.h" static char msg[] = "plconsol.c"; /* This is the precision, declared globally so that it will * be accessible in the compare routine which must be called * from qsort */ static float precision; float Pt4Distance(HPoint3 *a, HPoint3 *b) { float dx, dy, dz, dw; dx = a->x - b->x; dy = a->y - b->y; dz = a->z - b->z; dw = a->w - b->w; return (sqrt(dx*dx + dy*dy + dz*dz + dw*dw)); } /* * Note: This deals only with the location of the points, not with * their colors or normals. */ int VertexCmp(const void *a, const void *b) { if (Pt4Distance(&((Vertex *)a)->pt, &((Vertex *)b)->pt) > precision) { return memcmp(a, b, sizeof(Vertex)); } return 0; } Geom *PLConsol(Geom *g, float prec) { Vertex **table; PolyList *o = (PolyList *)g, *o2; int i, j; if (g == NULL) return NULL; /* Make sure we have the right thing. */ if (strcmp(GeomName(g), "polylist")) { OOGLError(0, "Object not of polylist type."); return NULL; } precision = prec; /* Create a copy of the data structure. */ o2 = (PolyList *)GeomCopy((Geom *)o); /* Sort the new array. */ precision = 0.0; qsort(o2->vl, o2->n_verts, sizeof(Vertex), VertexCmp); precision = prec; /* Consolidate the new array to eliminate identical vertices. */ for (i = j = 0; i < o2->n_verts; i++) if (VertexCmp(&o2->vl[i], &o2->vl[j])) o2->vl[++j] = o2->vl[i]; o2->n_verts = j+1; /* Create a lookup table of the new addresses of the vertices. */ table = (Vertex **)OOG_NewE(o->n_verts * sizeof(Vertex *), msg); for (i = 0; i < o->n_verts; i++) table[i] = bsearch(&(o->vl[i]), o2->vl, o2->n_verts, sizeof(Vertex), VertexCmp); /* Match the polygons in the structure with the new vertices. */ for (i = 0; i < o2->n_polys; i++) for (j = 0; j < o2->p[i].n_vertices; j++) o2->p[i].v[j] = table[o2->p[i].v[j] - o2->vl]; /* Trim off the excess memory */ o2->vl = OOGLRenewNE(Vertex, o2->vl, o2->n_verts, msg); return((Geom *)o2); } geomview-1.9.5/src/lib/geomutil/plutil/plutil.h0000644000175000017500000000277212310110200016432 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * plutil.h * author: Celeste Fowler * date: June 12, 1992 */ #ifndef PLUTIL_H #define PLUTIL_H #include "appearance.h" #include "transformn.h" typedef struct _PLData PLData; Geom *PLCombine(Geom *a1, Geom *b1); Geom *AnyToPL(Geom *old, Transform T); Geom *PLConsol(Geom *g, float prec); PLData *AnyGeomToPLData(Geom *old, Transform T, TransformN *Tn, Appearance *ap, PLData *pd); Geom *PLDataToGeom(PLData *pd, int want, int unwant); #define PL_C 0x1 /* Bits for "want" and "unwant" flags. */ #define PL_N 0x2 #define PL_H 0x4 #define PL_ND 0x8 #endif /* PLUTIL_H */ geomview-1.9.5/src/lib/geomutil/plutil/Headers0000644000175000017500000000001112310110200016226 00000000000000plutil.h geomview-1.9.5/src/lib/geomutil/plutil/anytopl.3gv0000644000175000017500000000370612310110200017055 00000000000000.TH AnyToPL 3gv "June 15, 1992" "Geometry Center" .SH NAME AnyToPL -\ convert an arbitrary geom to a polylist (OFF file format) .SH SYNOPSIS .nf #include "geomutil.h" Geom *AnyToPL(Geom *, Transform); .fi .SH DESCRIPTION .PP AnyToPL() takes any geom as an arguement. It then returns a polylist object which is geometrically identical to the original geom. The transform argument is the transform applied to the entire object; it should generally be set to TM_IDENTITY when AnyToPL() is first called. Geometric objects are handled in the following ways: .PP Polylists: A transformed copy of the original is returned. .PP Bezier: The object is rediced if necessary, then handled as a mesh object. .PP Quad: The object is directly transformed into a new polylist. .PP Mesh: The object is directly transformed into a new polylist, with extra polygons added to do the wrapping if necessary. .PP Vect: The object is converted into a polylist containing a 2-gon for every segment in the original vector object. The colors of the faces are the same as the colors of the original object, but this generally is irrelevant since the faces are not visible. Note that edge visibility must be enabled for an object which has been converted from a vect to a polylist to be visible in geomview. .PP List: AnyToPL() is called recursively and the resultant polylists are combined using PLCombine(3). Inst: AnyToPL() is called recursively with a new transformation matrix. The resultant polylists are combined using PLCombine(3). .PP No effort is made to eliminate identical vertices. However, no extraneous repeated vertexes should be created. The resultant polylist should have the same number of vertexes as the original object. .PP .SH LINKING AnyToPL() is part of the geomutil library; see geomutil(3) for information on how to link your program with this library. .SH SEE ALSO plcombine(3), anytooff(1), geomview(1), geomutil(3) .SH AUTHOR .nf Celeste Fowler The Geometry Center .fi geomview-1.9.5/src/lib/geomutil/plutil/plcombine.3gv0000644000175000017500000000333712310110200017337 00000000000000.TH plcombine 3gv "June 15, 1992" "Geometry Center" .SH NAME PLCombine -\ polylist two polylists (OFF file format) into one .SH SYNOPSIS .nf Geom *PLCombine(Geom *, Geom *); .fi .SH DESCRIPTION .PP PLCombine() combines two polylists into a single polylist and returns the new polylist. If either of the old polylists was NULL, a copy of the other polylist (or NULL if both polylists were NULL) is returned. PLCombine() will generate an error if either of the parameters was not of the polylist type. .PP If the two polylists represent color in an inconsistant way, PLCombine will attempt to preserve the color data. If either polylist has per-polygon colors, the result will have per-polygon colors. If the other object originally had per-vertex colors, the color of the first point of each polygon will be used as the color of the polygon. If the other polylist originally had no colors, the rgba value 0.15, 0.15, 0.15, 1.0 will be used as the color of each of that polyline's polygons. .PP If neither of the polylists had per-polygon colors but one had per-vertex colors, the value 0.15, 0.15, 0.15, 1.0 will be used as the color value for each of the vertices of the colorless polylist. .PP If neither polylist had color data, the result will not have color date. .PP The result of PLCombine() will not include normal data if the two polylists represent normals in an inconsistent way, for example, if one has per-vertex data and one has per-face data or one has per-vertex data and one has no data. .SH LINKING PLCombine() is part of the geomutil library; see geomutil(3) for information on how to link your program with this library. .SH SEE ALSO offcombine(1), geomview(1), geomutil(3) .SH AUTHOR .nf Celeste Fowler The Geometry Center .fi geomview-1.9.5/src/lib/geomutil/plutil/plconsol.3gv0000644000175000017500000000160512310110200017214 00000000000000.TH plconsol 3gv "June 25, 1992" "Geometry Center" .SH NAME PLConsol() -\ polylist consolidator. .SH SYNOPSIS Geom *PLConsol(Geom *g, float prec); .SH DESCRIPTION .PP PLConsol() is a function which takes a geom, which must be a polylist, as its argument and returns a version of the polylist which has no repeated vertices. Two vertices are considered to be identical if they are within prec of one another. The comparison takes into account only the location of the points, not their normals or colors. .PP The vertices of the resultant polyline have been sorted, and so there order bears no resemblance to the order of the point in the original polylist. .SH LINKING PLConsol() is part of the geomutil library; see geomutil(3) for information on how to link your program with this library. .SH SEE ALSO offconsol(1), geomview(1), geomutil(3) .SH AUTHOR .nf Celeste Fowler The Geometry Center .fi geomview-1.9.5/src/lib/pointlist/0000755000175000017500000000000012310165603013730 500000000000000geomview-1.9.5/src/lib/pointlist/Makefile.in0000644000175000017500000004722712310165555015737 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/pointlist DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libpointlist_la_LIBADD = am_libpointlist_la_OBJECTS = pointlist.lo ptlBezier.lo ptlInst.lo \ ptlList.lo ptlMesh.lo ptlPolylist.lo ptlQuad.lo ptlVect.lo libpointlist_la_OBJECTS = $(am_libpointlist_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libpointlist_la_SOURCES) DIST_SOURCES = $(libpointlist_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libpointlist.la libpointlist_la_SOURCES = \ pointlist.c ptlBezier.c ptlInst.c ptlList.c ptlMesh.c ptlPolylist.c ptlQuad.c ptlVect.c \ pointlist.h pointlistP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/pointlist/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/pointlist/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libpointlist.la: $(libpointlist_la_OBJECTS) $(libpointlist_la_DEPENDENCIES) $(EXTRA_libpointlist_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libpointlist_la_OBJECTS) $(libpointlist_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pointlist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlBezier.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlInst.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlMesh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlPolylist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlQuad.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlVect.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/pointlist/Makefile.am0000644000175000017500000000036212310110201015665 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libpointlist.la libpointlist_la_SOURCES = \ pointlist.c ptlBezier.c ptlInst.c ptlList.c ptlMesh.c ptlPolylist.c ptlQuad.c ptlVect.c \ pointlist.h pointlistP.h geomview-1.9.5/src/lib/pointlist/pointlist.c0000644000175000017500000000474512310110201016033 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "pointlistP.h" static char methods[][POINTLIST_MAXNAME] = { POINTLIST_METHNAMES }; void *pointlist_default(int sel, Geom *geom, va_list *args); void pointlist_init() { int i; for (i = 0; i < POINTLIST_MAXMETH; i++) GeomNewMethod(methods[i], pointlist_default); /* This should be the only place where the methods are mentioned by * name. */ ptlBezier_init(); ptlInst_init(); ptlList_init(); ptlMesh_init(); ptlPolylist_init(); ptlQuad_init(); ptlVect_init(); } void pointlist_initspec(SpecFunc *specfunc, int n_func, GeomClass *class) { int i; for (i = 0; i < n_func; i++) GeomSpecifyMethod(GeomMethodSel(specfunc[i].name), class, specfunc[i].func); } void *pointlist_default(int sel, Geom *geom, va_list *args) { return NULL; } HPoint3 *PointList_get(Geom *geom, Transform T, int CoordSystem) { return (HPoint3 *)GeomCall(GeomMethodSel("PointList_get"), geom, T, CoordSystem); } HPoint3 *PointList_fillin(Geom *geom, Transform T, int CoordSystem, HPoint3 *plist) { return (HPoint3 *)GeomCall(GeomMethodSel("PointList_fillin"), geom, T, CoordSystem, plist); } void PointList_set(Geom *geom, int CoordSystem, HPoint3 *plist) { GeomCall(GeomMethodSel("PointList_set"), geom, CoordSystem, plist); } int PointList_length(Geom *geom) { return (int)(long)GeomCall(GeomMethodSel("PointList_length"), geom); } geomview-1.9.5/src/lib/pointlist/ptlBezier.c0000644000175000017500000001103212310110201015731 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "geom.h" #include "bezierP.h" #include "pointlistP.h" void *bezier_PointList_get(int sel, Geom *geom, va_list *args); void *bezier_PointList_fillin(int sel, Geom *geom, va_list *args); void *bezier_PointList_set(int sel, Geom *geom, va_list *args); void *bezier_PointList_length(int sel, Geom *geom, va_list *args); #define MAX_METHODS 4 static SpecFunc methods[] = { {"PointList_get", bezier_PointList_get}, {"PointList_fillin", bezier_PointList_fillin}, {"PointList_set", bezier_PointList_set}, {"PointList_length", bezier_PointList_length} }; static char msg[] = "ptlBezier.c"; void ptlBezier_init() { pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("bezier")); } void *bezier_PointList_get(int sel, Geom *geom, va_list *args) { HPoint3 *pt; TransformPtr t; int n_points; t = va_arg(*args, TransformPtr); n_points = (int)(long)GeomCall(GeomMethodSel("PointList_length"), geom); pt = OOGLNewNE(HPoint3, n_points, msg); return (GeomCall(GeomMethodSel("PointList_fillin"), geom, t, 0, pt)); } void *bezier_PointList_fillin(int sel, Geom *geom, va_list *args) { int i = 0; TransformPtr t; HPoint3 *pt; Bezier *b = (Bezier *)geom; t = va_arg(*args, TransformPtr); (void)va_arg(*args, int); pt = va_arg(*args, HPoint3 *); if (b->CtrlPnts != NULL) { if (b->dimn == 3) { for (i = 0; i < (b->degree_u + 1) * (b->degree_v + 1); i++) HPt3From(&pt[i], b->CtrlPnts[i*3], b->CtrlPnts[i*3 + 1], b->CtrlPnts[i*3 + 2], 1.0); } else { if (b->dimn == 4) { for (i = 0; i < (b->degree_u + 1) * (b->degree_v + 1); i++) HPt3From(&pt[i], b->CtrlPnts[i*4], b->CtrlPnts[i*4 + 1], b->CtrlPnts[i*4 + 2], b->CtrlPnts[i*4 + 3]); } else { OOGLError(1, "Bezier patch of unfamiliar dimensions."); OOGLFree(pt); return NULL; } } } #ifdef DONT_DO_THIS if (b->flag & BEZ_ST) { HPt3From(&pt[i], b->STCords[0], b->STCords[1], b->STCords[2], b->STCords[3]); HPt3From(&pt[i+1], b->STCords[4], b->STCords[5], b->STCords[6], b->STCords[7]); } #endif /*DONT_DO_THIS*/ HPt3TransformN(t, pt, pt, i+1); return pt; } void *bezier_PointList_set(int sel, Geom *geom, va_list *args) { int i; HPoint3 *pt; Bezier *b = (Bezier *)geom; (void)va_arg(*args, int); pt = va_arg(*args, HPoint3 *); i = 0; if (b->CtrlPnts != NULL) { if (b->dimn == 3) { for (i = 0; i < (b->degree_u + 1) * (b->degree_v + 1); i++) { b->CtrlPnts[i*3] = pt[i].x; b->CtrlPnts[i*3 + 1] = pt[i].y; b->CtrlPnts[i*3 + 2] = pt[i].z; } } else { if (b->dimn == 4) { for (i = 0; i < (b->degree_u + 1) * (b->degree_v + 1); i++) { b->CtrlPnts[i*4] = pt[i].x; b->CtrlPnts[i*4 + 1] = pt[i].y; b->CtrlPnts[i*4 + 2] = pt[i].z; b->CtrlPnts[i*4 + 3] = pt[i].w; } } else { OOGLError(1, "Bezier patch of unfamiliar dimension."); return NULL; } } } #ifdef DONT_DO_THIS if (b->flag & BEZ_ST) { b->STCords[0] = pt[i].x; b->STCords[1] = pt[i].y; b->STCords[2] = pt[i].z; b->STCords[3] = pt[i++].w; b->STCords[4] = pt[i].x; b->STCords[5] = pt[i].y; b->STCords[6] = pt[i].z; b->STCords[7] = pt[i].w; } #endif /*DONT_DO_THIS*/ GeomDelete((Geom *)b->mesh); b->mesh = NULL; return geom; } void *bezier_PointList_length(int sel, Geom *geom, va_list *args) { Bezier *b = (Bezier *)geom; return ((void *)(long)((b->degree_u + 1) * (b->degree_v + 1) #ifdef DONT_DO_THIS + (b->flag & BEZ_ST ? 2 : 0) #endif )); } geomview-1.9.5/src/lib/pointlist/ptlInst.c0000644000175000017500000001011312310110201015425 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "geom.h" #include "instP.h" #include "pointlistP.h" void *inst_PointList_get(int sel, Geom *geom, va_list *args); void *inst_PointList_fillin(int sel, Geom *geom, va_list *args); void *inst_PointList_set(int sel, Geom *geom, va_list *args); void *inst_PointList_length(int sel, Geom *geom, va_list *args); #define MAX_METHODS 4 static SpecFunc methods[] = { {"PointList_get", inst_PointList_get}, {"PointList_fillin", inst_PointList_fillin}, {"PointList_set", inst_PointList_set}, {"PointList_length", inst_PointList_length} }; static char msg[] = "ptlInst.c"; void ptlInst_init() { pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("inst")); } void *inst_PointList_get(int sel, Geom *geom, va_list *args) { HPoint3 *plist; int n_points; TransformPtr t; int coordsys; n_points = (int)(long)GeomCall(GeomMethodSel("PointList_length"), geom); plist = OOGLNewNE(HPoint3, n_points, msg); t = va_arg(*args, TransformPtr); coordsys = va_arg(*args, int); return GeomCall(GeomMethodSel("PointList_fillin"), geom, t, coordsys, plist); } void *inst_PointList_fillin(int sel, Geom *geom, va_list *args) { Inst *inst = (Inst *)geom; HPoint3 *plist; int coordsys; GeomIter *it; Transform Tnew; int i, n_points; TransformPtr t; t = va_arg(*args, TransformPtr); coordsys = va_arg(*args, int); plist = va_arg(*args, HPoint3 *); n_points = (int)(long)GeomCall(GeomMethodSel("PointList_length"), inst->geom); it = GeomIterate(geom, DEEP); for (i = 0; NextTransform(it, Tnew); i += n_points) if (coordsys == POINTLIST_SELF) { TmConcat(Tnew, t, Tnew); GeomCall(GeomMethodSel("PointList_fillin"), inst->geom, &Tnew[0][0], coordsys, &plist[i]); } else if (coordsys == POINTLIST_PRIMITIVE) GeomCall(GeomMethodSel("PointList_fillin"), inst->geom, t, coordsys, &plist[i]); else { OOGLError(1, "Unrecognized coordinate system in inst_PointList_fillin"); return NULL; } return plist; } void *inst_PointList_set(int sel, Geom *geom, va_list *args) { Inst *inst = (Inst *)geom; HPoint3 *plist; Transform T, TInv; int coordsys; GeomIter *it; coordsys = va_arg(*args, int); plist = va_arg(*args, HPoint3 *); /* If the point list has more than one copy of the points * of the geom in it, just use the first set */ it = GeomIterate(geom, DEEP); if (NextTransform(it, T) && coordsys == POINTLIST_SELF) { Tm3Invert(T, TInv); HPt3TransformN( TInv, plist, plist, (int)(long)GeomCall(GeomMethodSel("PointList_length"), inst->geom) ); } GeomCall(GeomMethodSel("PointList_set"), inst->geom, coordsys, plist); return NULL; } void *inst_PointList_length(int sel, Geom *geom, va_list *args) { Inst *inst = (Inst *)geom; int i, n_points; Transform T; GeomIter *it; n_points = (int)(long)GeomCall(GeomMethodSel("PointList_length"), inst->geom); it = GeomIterate(geom, DEEP); for (i = 0; NextTransform(it, T); i += n_points); return (void *)(long)i; } geomview-1.9.5/src/lib/pointlist/ptlList.c0000644000175000017500000000645312310110201015437 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "geom.h" #include "listP.h" #include "pointlistP.h" void *list_PointList_get(int sel, Geom *geom, va_list *args); void *list_PointList_fillin(int sel, Geom *geom, va_list *args); void *list_PointList_set(int sel, Geom *geom, va_list *args); void *list_PointList_length(int sel, Geom *geom, va_list *args); #define MAX_METHODS 4 static SpecFunc methods[] = { {"PointList_get", list_PointList_get}, {"PointList_fillin", list_PointList_fillin}, {"PointList_set", list_PointList_set}, {"PointList_length", list_PointList_length} }; static char msg[] = "ptlList.c"; void ptlList_init() { pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("list")); } void *list_PointList_get(int sel, Geom *geom, va_list *args) { HPoint3 *plist; TransformPtr t; plist = OOGLNewNE(HPoint3, (int)(long)GeomCall(GeomMethodSel("PointList_length"), geom), msg); t = va_arg(*args, TransformPtr); return(GeomCall(GeomMethodSel("PointList_fillin"), geom, t, 0, plist)); } void *list_PointList_fillin(int sel, Geom *geom, va_list *args) { TransformPtr t; int n_points1; HPoint3 *plist; List *l = (List *)geom; t = va_arg(*args, TransformPtr); (void)va_arg(*args, int); plist = va_arg(*args, HPoint3 *); n_points1 = (int)(long)GeomCall(GeomMethodSel("PointList_length"), l->car); GeomCall(GeomMethodSel("PointList_fillin"), l->car, t, 0, plist); GeomCall(GeomMethodSel("PointList_fillin"), (Geom *)l->cdr, t, 0, &plist[n_points1]); return plist; } void *list_PointList_set(int sel, Geom *geom, va_list *args) { HPoint3 *pt1; int n_points1, coordsys; List *l = (List *)geom; coordsys = va_arg(*args, int); pt1 = va_arg(*args, HPoint3 *); n_points1 = (int)(long)GeomCall(GeomMethodSel("PointList_length"), l->car); GeomCall(GeomMethodSel("PointList_set"), l->car, coordsys, pt1); GeomCall(GeomMethodSel("PointList_set"), (Geom *)l->cdr, coordsys, &pt1[n_points1]); return geom; } void *list_PointList_length(int sel, Geom *geom, va_list *args) { List *l = (List *)geom; return (void *)(long) ((int)(long)GeomCall(GeomMethodSel("PointList_length"), l->car) + (int)(long)GeomCall(GeomMethodSel("PointList_length"), (Geom *)l->cdr)); } geomview-1.9.5/src/lib/pointlist/ptlMesh.c0000644000175000017500000000560712310110201015420 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "geom.h" #include "meshP.h" #include "pointlistP.h" void *mesh_PointList_get(int sel, Geom *geom, va_list *args); void *mesh_PointList_fillin(int sel, Geom *geom, va_list *args); void *mesh_PointList_set(int sel, Geom *geom, va_list *args); void *mesh_PointList_length(int sel, Geom *geom, va_list *args); #define MAX_METHODS 4 static SpecFunc methods[] = { {"PointList_get", mesh_PointList_get}, {"PointList_fillin", mesh_PointList_fillin}, {"PointList_set", mesh_PointList_set}, {"PointList_length", mesh_PointList_length} }; static char msg[] = "ptlMesh.c"; void ptlMesh_init() { pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("mesh")); } void *mesh_PointList_get(int sel, Geom *geom, va_list *args) { HPoint3 *pt; Mesh *m = (Mesh *)geom; TransformPtr t; pt = OOGLNewNE(HPoint3, m->nu * m->nv, msg); t = va_arg(*args, TransformPtr); return GeomCall(GeomMethodSel("PointList_fillin"), geom, t, 0, pt); } void *mesh_PointList_fillin(int sel, Geom *geom, va_list *args) { HPoint3 *pt; TransformPtr t; Mesh *m = (Mesh *)geom; t = va_arg(*args, TransformPtr); (void)va_arg(*args, int); pt = va_arg(*args, HPoint3 *); memcpy(pt, m->p, m->nu * m->nv * sizeof(HPoint3)); HPt3TransformN(t, pt, pt, m->nu * m->nv); return pt; } void *mesh_PointList_set(int sel, Geom *geom, va_list *args) { Mesh *m = (Mesh *)geom; HPoint3 *plist; /* This will make the mesh no longer a z-mesh (in general, this * is desirable although we may regret it later */ m->geomflags &= ~MESH_Z; (void)va_arg(*args, int); plist = va_arg(*args, HPoint3 *); memcpy(m->p, plist, m->nu * m->nv * sizeof(HPoint3)); return geom; } void *mesh_PointList_length(int sel, Geom *geom, va_list *args) { Mesh *m = (Mesh *)geom; return((void *)(long)(m->nu * m->nv)); } geomview-1.9.5/src/lib/pointlist/ptlPolylist.c0000644000175000017500000000560512310110201016341 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "geom.h" #include "polylistP.h" #include "pointlistP.h" void *polylist_PointList_get(int sel, Geom *geom, va_list *args); void *polylist_PointList_fillin(int sel, Geom *geom, va_list *args); void *polylist_PointList_set(int sel, Geom *geom, va_list *args); void *polylist_PointList_length(int sel, Geom *geom, va_list *args); #define MAX_METHODS 4 static SpecFunc methods[] = { {"PointList_get", polylist_PointList_get}, {"PointList_fillin", polylist_PointList_fillin}, {"PointList_set", polylist_PointList_set}, {"PointList_length", polylist_PointList_length} }; static char msg[] = "ptlPolylist.c"; void ptlPolylist_init() { pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("polylist")); } void *polylist_PointList_get(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; HPoint3 *plist; TransformPtr t; plist = OOGLNewNE(HPoint3, p->n_verts, msg); t = va_arg(*args, TransformPtr); return GeomCall(GeomMethodSel("PointList_fillin"), geom, t, 0, plist); } void *polylist_PointList_fillin(int sel, Geom *geom, va_list *args) { int i; PolyList *p = (PolyList *)geom; TransformPtr t; HPoint3 *plist; t = va_arg(*args, TransformPtr); (void)va_arg(*args, int); plist = va_arg(*args, HPoint3 *); for (i = 0; i < p->n_verts; i++) HPt3Transform(t, &p->vl[i].pt, &plist[i]); return((void *)plist); } void *polylist_PointList_set(int sel, Geom *geom, va_list *args) { int i; PolyList *p = (PolyList *)geom; HPoint3 *plist; (void)va_arg(*args, int); plist = va_arg(*args, HPoint3 *); for (i = 0; i < p->n_verts; i++) HPt3Copy(&plist[i], &p->vl[i].pt); return((void *)p); } void *polylist_PointList_length(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; return((void *)(long)p->n_verts); } geomview-1.9.5/src/lib/pointlist/ptlQuad.c0000644000175000017500000000557112310110201015416 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "geom.h" #include "quadP.h" #include "pointlistP.h" void *quad_PointList_get(int sel, Geom *geom, va_list *args); void *quad_PointList_fillin(int sel, Geom *geom, va_list *args); void *quad_PointList_set(int sel, Geom *geom, va_list *args); void *quad_PointList_length(int sel, Geom *geom, va_list *args); #define MAX_METHODS 4 static SpecFunc methods[] = { {"PointList_get", quad_PointList_get}, {"PointList_fillin", quad_PointList_fillin}, {"PointList_set", quad_PointList_set}, {"PointList_length", quad_PointList_length} }; static char msg[] = "ptlQuad.c"; void ptlQuad_init() { pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("quad")); } void *quad_PointList_get(int sel, Geom *geom, va_list *args) { HPoint3 *plist; Quad *q = (Quad *)geom; TransformPtr t; plist = OOGLNewNE(HPoint3, q->maxquad * 4, msg); t = va_arg(*args, TransformPtr); return GeomCall(GeomMethodSel("PointList_fillin"), geom, t, 0, plist); } void *quad_PointList_fillin(int sel, Geom *geom, va_list *args) { int i; Quad *q = (Quad *)geom; TransformPtr t; HPoint3 *plist; t = va_arg(*args, TransformPtr); (void)va_arg(*args, int); plist = va_arg(*args, HPoint3 *); for (i = 0; i < q->maxquad; i++) memcpy(&plist[i * 4], q->p[i], 4 * sizeof(HPoint3)); HPt3TransformN(t, plist, plist, q->maxquad * 4); return plist; } void *quad_PointList_set(int sel, Geom *geom, va_list *args) { int i; HPoint3 *plist; Quad *q = (Quad *)geom; (void)va_arg(*args, int); plist = va_arg(*args, HPoint3 *); for (i = 0; i < q->maxquad; i++) memcpy(q->p[i], &plist[i * 4], 4 * sizeof(HPoint3)); return((void *)q); } void *quad_PointList_length(int sel, Geom *geom, va_list *args) { Quad *q = (Quad *)geom; return((void *)(long)(q->maxquad * 4)); } geomview-1.9.5/src/lib/pointlist/ptlVect.c0000644000175000017500000000541112310110201015416 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "geom.h" #include "vectP.h" #include "pointlistP.h" void *vect_PointList_get(int sel, Geom *geom, va_list *args); void *vect_PointList_fillin(int sel, Geom *geom, va_list *args); void *vect_PointList_set(int sel, Geom *geom, va_list *args); void *vect_PointList_length(int sel, Geom *geom, va_list *args); #define MAX_METHODS 4 static SpecFunc methods[] = { {"PointList_get", vect_PointList_get}, {"PointList_fillin", vect_PointList_fillin}, {"PointList_set", vect_PointList_set}, {"PointList_length", vect_PointList_length} }; static char msg[] = "ptlVect.c"; void ptlVect_init() { pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("vect")); } void *vect_PointList_get(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; HPoint3 *plist; TransformPtr t; plist = OOGLNewNE(HPoint3, v->nvert, msg); t = va_arg(*args, TransformPtr); return GeomCall(GeomMethodSel("PointList_fillin"), geom, t, 0, plist); } void *vect_PointList_fillin(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; TransformPtr t; HPoint3 *plist; t = va_arg(*args, TransformPtr); (void)va_arg(*args, int); plist = va_arg(*args, HPoint3 *); memcpy(plist, v->p, v->nvert * sizeof(HPoint3)); HPt3TransformN(t, plist, plist, v->nvert); return((void *)plist); } void *vect_PointList_set(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; HPoint3 *plist; (void)va_arg(*args, int); plist = va_arg(*args, HPoint3 *); memcpy(v->p, plist, v->nvert * sizeof(HPoint3)); return((void *)v); } void *vect_PointList_length(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; return((void *)(long)v->nvert); } geomview-1.9.5/src/lib/pointlist/pointlist.h0000644000175000017500000000272512310110201016034 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef POINTLIST_H #define POINTLIST_H /* * Call this to pointlist routines. */ void pointlist_init(); HPoint3 *PointList_get(Geom *geom, Transform T, int CoordSystem); HPoint3 *PointList_fillin(Geom *geom, Transform T, int CoordSystem, HPoint3 *plist); void PointList_set(Geom *geom, int CoordSystem, HPoint3 *plist); int PointList_length(Geom *geom); /* * Flags for describing coordinates. * POINTLIST_SELF This geomview object * POINTLIST_PRIMITIVE Lowest-level OOGL primitive */ #define POINTLIST_SELF 0 #define POINTLIST_PRIMITIVE 1 #endif geomview-1.9.5/src/lib/pointlist/pointlistP.h0000644000175000017500000000271112310110201016147 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef POINTLISTP_H #define POINTLISTP_H #include "pointlist.h" #define POINTLIST_MAXNAME 128 #define POINTLIST_MAXMETH 4 #define POINTLIST_METHNAMES "PointList_get", "PointList_fillin", \ "PointList_set", "PointList_length" typedef struct { char name[POINTLIST_MAXNAME]; GeomExtFunc *func; } SpecFunc; void pointlist_initspec(SpecFunc *specfunc, int n_func, GeomClass *class); void ptlBezier_init(); void ptlInst_init(); void ptlList_init(); void ptlMesh_init(); void ptlPolylist_init(); void ptlQuad_init(); void ptlVect_init(); #endif geomview-1.9.5/src/lib/pointlist/Headers0000644000175000017500000000003112310110201015120 00000000000000pointlist.h pointlistP.h geomview-1.9.5/src/lib/mg/0000755000175000017500000000000012310165603012306 500000000000000geomview-1.9.5/src/lib/mg/Makefile.in0000644000175000017500000004771012310165554014311 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # if X11RENDER # X11RENDER_DIRS = x11 # else # X11RENDER_DIRS = # endif VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @MGOPENGL_TRUE@am__append_1 = opengl @MGX11_TRUE@am__append_2 = x11 subdir = src/lib/mg DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir 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 DIST_SUBDIRS = buf common ps rib opengl x11 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = buf common ps rib $(am__append_1) $(am__append_2) EXTRA_DIST = mg.attr mg.doc mgP.h all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/mg/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/mg/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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" cscopelist: cscopelist-recursive 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am 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 \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/mg/Makefile.am0000644000175000017500000000031312310110201014237 00000000000000# if X11RENDER # X11RENDER_DIRS = x11 # else # X11RENDER_DIRS = # endif SUBDIRS = buf common ps rib EXTRA_DIST = mg.attr mg.doc mgP.h if MGOPENGL SUBDIRS += opengl endif if MGX11 SUBDIRS += x11 endif geomview-1.9.5/src/lib/mg/mg.attr0000644000175000017500000000753312310110201013515 00000000000000 MG context attributes mbp Tue Sep 17 21:39:28 1991 Attribute Set Value Get Value --------- --------- --------- MG_SHOW int visible int *visible ------- ----------- ------------ Set: visible = 1 means the context's window should be made visible if it is not already, and visible = 0 means the window should be made to disappear. When a context is created, the default value for MG_SHOW is 1, which causes the window to appear in the call to mgctxcreate. To prevent this, you must explicity set MG_SHOW to 0, and then use mgctxset to set MG_SHOW to 1 when you want the window to appear. Get: visible = 1 means window is currently visible; 0 means it is currently not visible. MG_APPEAR Appearance *ap Appearance **ap --------- -------------- -------------- Set: app is a pointer to an Appearance structure as returned by ApCreate. app is copied into the current context and becomes the current appearance. This is a deep copy. This is equivalent to mgsetappearance(ap, MG_SET). Get: *ap is set to point to the current appearance. This should NOT be modified in any way! MG_ApSet NA --------- ---------------- -- Set: is a list of AP_ attribute-value pairs, as to ApSet(), terminated by AP_END. These attributes are merged into the current appearance. This is equivalent to ap = ApCreate( ); mgsetappearance(ap, MG_MERGE); ApDelete(ap); Get: Not gettable. MG_WINDOW WnWindow *win WnWindow **win --------- ------------- -------------- Set: win is a pointer to a WnWindow structure as returned by WnCreate(). This window becomes the context's window. Get: *win is set to point to the context's window structure. MG_WinSet NA --------- ---------------- -- Set: is a list of WN_ attribute-value pairs, as to WnSet(), terminated by WN_END. These attributes are applied to the context's window. This is equivalent to calling WnSet(win, ), where win is a pointer to the context's window. Get: Not gettable. MG_CAMERA Camera *cam Camera **cam --------- ----------- ------------ Set: cam is a pointer to Camera structure as returned by CamCreate(). This camera becomes the context's camera. Get: *cam is set to point to the context's camera structure. MG_CamSet NA --------- ---------------- -- Set: is a list of CAM_ attribute-value pairs, as to CamSet(), terminated by CAM_END. These attributes are applied to the context's camera. This is equivalent to calling CamSet(cam, ), where cam is a pointer to the context's camera. Get: Not gettable. MG_PARENT mgcontext *ctx mgcontext **ctx --------- -------------- --------------- Set: ctx is the ctx of the parent window. May be used in some heirarchal window systems. Get: *ctx is set to point to the ctx of the parent window. MG_SETOPTIONS int optionmask int *optionmask ------------- -------------- --------------- Set: optionmask should be a bitwise "or" (|) of any the following: MGO_DOUBLEBUFFER MGO_HIDDEN MGO_BACKFACECULL MGO_INHIBITBACKGROUND MGO_INHIBITCLEAR MGO_INHIBITSWAP The corresponding options are turned on. Get: *optionmask is set to a bitwise "or" (|) of all currently enabled options. MG_UNSETOPTIONS int optionmask int *optionmask --------------- -------------- --------------- Set: exactly analogous to MG_SETOPTIONS, except that the options in optionmask are turned off. Get: (same as with MG_SETOPTIONS) MG_BACKGROUND ColorA *color ColorA *color ------------- ------------- ------------- Set: *color becomes the context's background color. A private internal copy of *color is kept. Get: The context's background color is copied to *color. geomview-1.9.5/src/lib/mg/mg.doc0000644000175000017500000005756412310110201013321 00000000000000$Id: mg.doc,v 1.1.1.1 2000/08/15 16:33:21 mphillips Exp $ MinneGraphics (MG) The Geometry Center July 1991 mbp, slevy, Sun Jul 21 15:16:25 1991 This document defines MG. MG is a graphics library which provides a common interface for doing interactive 3D graphics on a variety of platforms. The main intent is that it will be used with OOGL (Object Oriented Graphics Lanauge), but there is nothing OOGL-specific about MG, and conceivably other applications could use it as well. MG is not meant to be as general or powerful as other 3D graphics lanuages such as GL, XGL, RenderMan, PHIGS, etc. --- rather it is meant to provide access to the most important operations common to all of these languages. MG is deliberately simple. It is *not* an attempt to solve the 3D graphics standardization problem. Until a widely accepted standard does emerge, MG is an attempt to insulate ourselves from the specifics of individual graphics lanuages, allowing us to write programs that will run under a variety of these languages. MG consists of several parts: a common part, and a part for each device (language) on which it it implemented. The library files are constructed so that each device-specific library includes the common part, so the application program only needs to link in the libraries corresponding to the devices it wants to use (there is no separate "common" library). Any application program using MG should include the header file "mg.h". The rest of this file contains a list of the MG procedures with a description of the call syntax and an explanation of what each procedure does. This list is meant to be used both in writing MG application modules and in writing MG device-drivers. Most MG procedures have several versions. The following conventions are used in referring to them. 1. application version name convention: mgproc This is the version of the procedure which application programs call. In most cases the name "mgproc" is actually a #define macro which expands to a function pointer which points to the corresponding device-specific version of proc. Application programs should only call these versions of MG procedures (the one exception is mgdevice_XX, for which there is only a device-specific version). 2. common version name convention: mg_proc This is a version of proc which performs operations, frequently bookkeeping type things, common to all MG devices. The device-specific version of proc may call the common version to accomplish these operations. For the details of what the common mg_proc does, including information on when the device-specific version should call it, see the documentation of the source code for mg_proc in the mg/common directory. The common procedures also serve as the "null device". Before a device has been specified in an MG application program, the application version of proc is a pointer to the common procedure. Running the program in this state draws no graphics but accomplishes all other operations associated with MG. 3. device version name convention: mgxx_proc, where xx = device (GL, XGL, etc). This is the version of proc specific to device xx. It accomplishes the actual graphics operations, and calls the corresponding common routine if/when necessary to perform common operations. To write a new MG device driver you must supply a version of each device procedure for the new device. The call syntax of each of these versions of proc is identical; the prototypes below are given in terms of the application version. APPLICATION COMMON DEVICE VERSION VERSION VERSION ----------------- ------- --------------- General control and informational procedures: mgbegin mg_begin NONE ??? (1) mgend mg_end NONE ??? (1) NONE NONE mgdevice_XX mgsync mg_sync mgxx_sync mgworldbegin mg_worldbegin mgxx_worldbegin mgworldend mg_worldend mgxx_worldend mgfeature mg_feature mgxx_feature Procedures related to creating and modifying the graphics context: mgctxcreate mg_ctxcreate mgxx_ctxcreate mgctxtcopy mg_ctxcopy NONE mgctxdelete mg_ctxdelete mgxx_ctxdelete mgctxselect mg_ctxselect mgxx_ctxselect mgctxset mg_ctxset mgxx_ctxset mgctxget mg_ctxget mgxx_ctxget mgpushappearance mg_pushappearance mgxx_pushappearance mgpopappearance mg_popappearance mgxx_popappearance mgsetappearance mg_setappearance mgxx_setappearance mgsetcamera mg_setcamera mgxx_setcamera mgidentity mg_identity mgxx_identity mgtransform mg_transform mgxx_transform mgpushtransform mg_pushtransform mgxx_pushtransform mgpoptransform mg_poptransform mgxx_poptransform mgsettransform mg_settransform mgxx_settransform mggettransform mg_gettransform mgxx_gettransform mgreshapeviewport mg_reshapeviewport mgxx_reshapeviewport Graphics primitives: mgpolygon mg_polygon mgxx_polygon mgmesh mg_mesh mgxx_mesh mgline mg_line mgxx_line mgpolyline mg_polyline mgxx_polyline mgpolylist mg_polylist mgxx_polylist mgquads mg_quads mgxx_quads mgbezier mg_bezier mgxx_bezier ======================================================================== /*----------------------------------------------------------------------- * Function: mgfeature * Description: tests whether the current device has a particular feature * Args: feature: * Returns: a value that indicates something about the feature; * -1 means the feature is not present. * Author: slevy, mbp * Date: Thu Jul 18 20:29:34 1991 * Notes: At present, only one feature is defined: * Feature Returned Value * MGF_BEZIER 1 if mgbezier() supported, else -1. * * Others are contemplated, for example: * MGF_ZBUFFER Depth of Z buffer * MGF_BITPLANES Number of bitplanes * MGF_DOUBLEBUFFER 1 for yes, -1 for no * etc etc etc */ int mgfeature(int feature) /*----------------------------------------------------------------------- * Function: mgctxcreate * Description: create a graphics context * Args: a1, ...: list of (attribute, value) pairs, terminated by * MG_END * Returns: pointer to the new graphics context * Author: slevy, mbp * Date: Thu Jul 18 20:34:28 1991 * Notes: The created context becomes the current context. The * attributes specified in the list are set as though * they had been passed to mgctxset; see mgctxset * for an explanation of what attributes are allowed. * * Device must be set, via a call to mgdevice_GL, * mgdevice_PS, etc, before creating a new context. Once * created, a context is valid only for the device for which * it was created. * * The value returned is a pointer to an opaque structure; * it should not be modified in any way. The only thing * you can legitimately do with this pointer is pass it * to other MG procedures, such as mgctxselect. * * The MG_SHOW attribute is set to 1 by default, which means * that (for relevant devices) the context's window becomes * visible on the screen when mgctxcreatec is called. * To prevent the window from appearing in the call to * mgctxcreate, set MG_SHOW to 0. Then call mgctxset * to set MG_SHOW to 1 to make the window appear later. * * Note: a1 is simply the first attribute in the list of * (attribute, value) pairs. It is listed as a separate * argument because of the way stdarg works. */ mgcontext *mgctxcreate(a1, ... /*, MG_END */) /*----------------------------------------------------------------------- * Function: mgctxcopy * Description: copy one context to another * Args: *src: the source context * *dst: the destination context * Returns: nothing * Author: mbp * Date: Mon Jul 22 11:01:32 1991 * Notes: Everything associated with the source context * is copied into the destination context, EXCEPT the * device setting. * * This is a shallow copy --- ctx attributes which are * pointers (e.g. the camera and window pointers) are * copied as pointers, so that those attributes in dest * point to the same structures as the corresponding src * attributes. * * There is no device version of mgctxcopy. */ mgctxcopy(mgcontext *src, mgcontext *dst) /*----------------------------------------------------------------------- * Function: mgctxdelete * Description: delete a context * Args: ctx: pointer to the context to delete * Returns: nothing * Author: slevy, mbp * Date: Sun Jul 21 15:33:07 1991 * Notes: ctx should be the pointer returned by mgctxcreate * when the context was created. This procedure frees up * all space associated with ctx. After * mgctxdelete(ctx), ctx will be an invalid pointer. */ void mgctxdelete(mgcontext *ctx) /*----------------------------------------------------------------------- * Function: mgctxset * Description: set some attributes in the current context * Args: a1, ...: list of (attribute, value) pairs, terminated by MG_END * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 15:50:46 1991 * Notes: Attributes are documented in the file mg.attr. * Note: a1 is simply the first attribute in the list * of (attribute, value) pairs. It is listed as a * separate argument because of the way stdarg works. * The list of attributes MUST end with MG_END. */ void mgctxset(a1, ... /*, MG_END */) /*----------------------------------------------------------------------- * Function: mgctxget * Description: get the value of an attribute in the current context * Args: attr: the attribute to get * valueptr: pointer to location to write value to * Returns: number of bytes written to address valueptr; 0 means * invalid attr * Author: slevy, mbp * Date: Fri Jul 19 16:26:32 1991 * Notes: valueptr should be the address of an object of the type * associated with the attribute attr; the object at * that address will be overwritten with the value in * the current context. See mg.attr for a list of * attributes. */ int mgctxget(int attr, void* valueptr) /*----------------------------------------------------------------------- * Function: mgctxselect * Description: Set the current graphics context to ctx * Args: ctx: ptr to the context to make current * Returns: ctx, or NULL if unsuccessful * Author: slevy, mbp * Date: Fri Jul 19 11:48:13 1991 * Notes: Does not copy *ctx --- just sets the internal pointer * _mgc to ctx, and calls any device-specific procedures * neccessary to bring the device into the state * corresponding to context *ctx. * Also changes the current device to be the device * associated with *ctx. */ int mgctxselect(mgcontext *ctx) /*----------------------------------------------------------------------- * Function: mgsync * Description: Insures that all mg graphics operations have been sent to * the device, and instructs the device to process them * Args: (none) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 12:14:09 1991 * Notes: The idea behind mgsync is that it could be used, * for example, to guarantee (in singlebuffer mode) * that everything that has * been drawn so far is actually visible in the window. * It might also be necessary for telling mg and/or the * device to flush any internal buffering of graphics * operations. * * mgsync is called implicitly by mgworldend. */ void mgsync() /*----------------------------------------------------------------------- * Function: mgworldbegin * Description: Prepare to draw in the current context * Args: (none) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 12:49:12 1991 * Notes: mgworldbegin must be called before any mg drawing commands. * It erases the current window to the background color and * clears any internal (to the device) records associated with * drawing. Also interprets the current camera setting; all * graphics operations after mgworldbegin and before the next * mgworldend will be displayed using this camera setting. * * The process of drawing an image on the current window * is bracketed by calls to mgworldbegin and mgworldend: * mgworldbegin(); * draw draw draw; * mgworldend(); <-- image is complete here */ void mgworldbegin() /*----------------------------------------------------------------------- * Function: mgworldend * Description: end the group of graphics operations begun with * mgworldbegin * Args: (none) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 13:01:00 1991 * Notes: Guarantees that all operations done since mgworldbegin * become visible. In doublebuffer mode, this involves * swapping the buffers. Implicitly calls mgsync. * Some devices might buffer graphics operations, and only * interpret them when mgworldend is called. */ void mgworldend() /*----------------------------------------------------------------------- * Function: mgreshapeviewport * Description: adjust internal window & camera * Args: (none) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 13:11:29 1991 * Notes: Intended for use in window systems where the user may * dynamically reshape, resize, or move the window. Causes * the window (MgWindow) size and position, and the camera * aspect ratio associated with the current context to be * updated to reflect the actual shape and size of the window. */ void mgreshapeviewport() /*----------------------------------------------------------------------- * Function: mgidentity * Description: sets the current context's object xform to I * Args: (none) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 13:19:43 1991 */ void mgidentity() /*----------------------------------------------------------------------- * Function: mgtransform * Description: mult (on the left) the current object xform by T * Args: T * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 13:21:40 1991 * Notes: Suppose that before mgtransform is called, the * current transform is A, so that object row vector v * is mapped to v A. Then after mgtransform(T), * v will be mapped to v T A. * * Note that this means that Euclidean translations * appear in the 4th row of the transform matrix * (rather than in the 4th column). * * [This differs from the old mg convention, * so old programs may need to be changed. However * the new convention matches the ASCII format we use * for matrices, and also matches the internal formats * used by SGI, Sun, and QuickRenderman.] */ void mgtransform(const Transform T) /*----------------------------------------------------------------------- * Function: mgpushtransform * Description: Push a copy of the current xform onto the current * context's xform stack * Args: (none) * Returns: the new depth of the stack ??? * Author: slevy, mbp * Date: Fri Jul 19 13:30:24 1991 * Notes: before after * A A <-- top * B A * C B * C * * Stack might have limited depth --- usually depends on the * device. */ int mgpushtransform() /*----------------------------------------------------------------------- * Function: mgpoptransform * Description: Pop the current context's xform stack * Args: (none) * Returns: the new depth of the stack ???? * Author: slevy, mbp * Date: Fri Jul 19 13:39:04 1991 */ int mgpoptransform() /*----------------------------------------------------------------------- * Function: mggettransform * Description: set the current context's current xform * Args: T: the xform * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 13:44:18 1991 */ void mgsettransform(Transform T) /*----------------------------------------------------------------------- * Function: mggettransform * Description: get the current context's current xform * Args: T: the xform * Returns: the depth of the xform stack ???? * Author: slevy, mbp * Date: Fri Jul 19 13:44:18 1991 * Notes: The current xform is the one on the top of the stack. */ int mggettransform(Transform T) /*----------------------------------------------------------------------- * Function: mgpushappearance * Description: Push a copy of the current attr onto the current * context's appearance stack * Args: (none) * Returns: the new depth of the appearance stack ???? * Author: slevy, mbp * Date: Fri Jul 19 13:45:19 1991 * Notes: Like mgpushtransform, but works with the appearance stack * instead. */ int mgpushappearance() /*----------------------------------------------------------------------- * Function: mgpopappearance * Description: Pop the current context's appearance stack * Args: (none) * Returns: the new depth of the stack ???? * Author: slevy, mbp * Date: Fri Jul 19 13:39:04 1991 */ int mgpopappearance() /*----------------------------------------------------------------------- * Function: mgsetappearance * Description: merge or set current Appearance * Args: app: Appearance to merge or copy * mergeflag: copy or merge app into current Appearance? * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 13:55:15 1991 * Notes: If mergeflag==MG_SET, sets the current Appearance to * exactly match *app. If mergelfag==MG_MERGE, sets the current * Appearance to the union of itself with *app. * For fields for which both the current Appearance * and *app have values, *app takes precedence, unless * the override bit is set for that field in the * current Appearance. */ void mgsetappearance(Appearance* app, int mergeflag) /*----------------------------------------------------------------------- * Function: mgsetcamera * Description: set the current camera * Args: cam: * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 14:06:29 1991 * Notes: New camera will not actually be used until next * mgworldbegin. */ int mgsetcamera(Camera* cam) /*----------------------------------------------------------------------- * Function: mgpolygon * Description: draw a polygon * Args: nv: number of vertices * *v: array of nv vertices * nn: number of normals (should be either 0, 1, or nv) * *n: array of nn normals (ignored if nn==0) * nc: number of colors (should be either 0, 1, or nv) * *c: array of nc ColorA's (ignored if nc==0) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 16:41:24 1991 */ void mgpolygon(int nv, Point3 *v, int nn, Point3 *n, int nc,ColorA *c) /*----------------------------------------------------------------------- * Function: mgmesh * Description: draw a mesh * Args: wrap: either MM_NOWRAP for no wrapping * or MM_UWRAP for wrapping in the u direction (cylinder) * or MM_VWRAP for wrapping in the v direction (cylinder) * or MM_UWRAP+MM_VWRAP for wrapping in both dirs (torus) * nu: number of vertices in the u direction * nv: number of vertices in the v direction * p: array of nu*nv vertices in v-major order (u index * increases fastest) * n: array of nu*nv normals (same order as *p), or NULL * c: array of nu*nv ColorA's (same order as *p), or NULL * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 16:44:57 1991 * Notes: if n is NULL, normals are not supplied to the device. * if c is NULL, then the color settings in the current * default Appearance apply. */ void mgmesh(int wrap,int nu,int nv,Point3 *p,Point3 *n,ColorA *c) /*----------------------------------------------------------------------- * Function: mgline * Description: draws a line * Args: *p1: first endpoint of line * *p2: second endpoint of line * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 16:54:50 1991 */ void mgline(Point3 *p1, Point3 *p2) /*----------------------------------------------------------------------- * Function: mgpolyline * Description: draws a polyline * Args: nv: number of vertices * *verts: array of nv vertices * nc: number of colors (should be 0, 1, or nv) * *colors: array of nc colors * flags: bit-encoded: * flags&1 indicates that this polyline is a closed curve; * an extra vector should be drawn connecting the * first and last points. * Other bits are available as hints the mg driver may use * to optimize the work done in drawing: * flags&2 indicates that this is not the first of a * batch of related polylines. It might be sufficient * to initialize the drawing color for only the first * polyline in a batch; also, if the driver handles * displacing lines closer to the eye, then the transform * might be pushed before the first polyline of a batch * and popped after the last one. * flags&4 indicates that this is not the last of a * batch of related polylines. * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 16:56:33 1991 */ void mgpolyline(int nv, Point3 *verts, int nc, ColorA *colors, int flags) /*----------------------------------------------------------------------- * Function: mgpolylist * Description: draws a PolyList * Args: npolys: number of Poly structures (one per polygon) * *polys: array of Poly structures from polylist.h. * flags: indicates which Poly & Vertex fields are valid; * bitwise union of PL_HAS{P,V}{N,COL} from polylist.h. * Returns: nothing * Author: slevy * Date: Mon Aug 19 15:16:44 CDT 1991 */ void mgpolylist(int npolys, Poly *polys, int flags) /*----------------------------------------------------------------------- * Function: mgquads * Description: draws an array of Quads * Args: nquads: number of Poly structures (one per polygon) * *v: array of 4*nquads HPoint3's, the quads' vertices * *n: array of 4*nquads Point3's, their normals - or NULL * *c: array of 4*nquads ColorA's, their colors - or NULL * Returns: nothing * Author: slevy * Date: Mon Jul 17 23:16:20 CDT 1992 * Note: This routine was added to optimize quad drawing. */ void mgquads(int nquads, HPoint3 *v, Point3 *n, ColorA *c) /*----------------------------------------------------------------------- * Function: mgbezier * Description: draws a bezier for those drivers which support it * Args: degree_u: degree in u direction * degree_v: degree in v direction * dimension: dimension * *controlPoints: array of control points * *txmapst: array of 4 (s,t) float pairs for texture map * coordinates for each corner of map * *colors: array of 4 ColorA structs or NULL * Returns: nothing * Author: wisdom (from munzners older code) * Date: Sat Sep 19 16:37:08 CDT 1992 * Notes: Currently, the bezier is drawn blah blah * For those drivers which do not support beziers, the * bezier is diced and drawn as a mesh (common code default). */ void mgbezier(int degree_u, int degree_v, int dimension, float *ControlPoints, float *txmapst, ColorA *colors) /*----------------------------------------------------------------------- * Function: mgbegin * Description: intialize MG * Args: (none) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 18:27:39 1991 * Notes: Must be called exactly once, before any other mg * functions */ mgbegin() /*----------------------------------------------------------------------- * Function: mgdevice_XX * Description: select device xx * Args: (none) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 18:28:52 1991 * Notes: Must be called after mgbegin and before mgcreatecontext. * If the current context is for a device other than xx, * it is de-selected. * See mg.h for list of valid devices allowed for xx. */ mgdevice_XX() /*----------------------------------------------------------------------- * Function: mgend * Description: shut down MG * Args: (none) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 18:31:34 1991 * Notes: Call once after all other mg calls. */ mgend() =========================================================================== (1) should we go ahead and be systematic and have mgxx_begin and mgxx_end and decree that each should call the common routine of the same name? (device begin/end inside common begin/end). Done: renamed mgcopycontext to mgctxcopy mgselectcontext to mgctxselect mgsetAp to mgsetappearance mgsetCam to mgsetcamera added MG_SET and MG_MERGE for merge flag to setappearance. Too much confusion over whether 0 or 1 means set or merge!! geomview-1.9.5/src/lib/mg/mgP.h0000644000175000017500000000161012310110201013100 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ geomview-1.9.5/src/lib/mg/buf/0000755000175000017500000000000012310165603013062 500000000000000geomview-1.9.5/src/lib/mg/buf/Makefile.in0000644000175000017500000004667712310165554015100 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/mg/buf DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) liblibmgbuf_la_LIBADD = am_liblibmgbuf_la_OBJECTS = mgbuf.lo mgbufclip.lo mgbufdraw.lo \ mgbufrender24.lo mgbufrender.lo liblibmgbuf_la_OBJECTS = $(am_liblibmgbuf_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(liblibmgbuf_la_SOURCES) DIST_SOURCES = $(liblibmgbuf_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = liblibmgbuf.la liblibmgbuf_la_SOURCES = \ mgbuf.c mgbufclip.c mgbufdraw.c mgbufrender24.c mgbufrender.c \ mgbuf.h mgbufP.h mgbufrender24.h mgbufrender.h mgbufwindows.h MGRdolines.h MGRline.h MGRpolyscan.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/mg/buf/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/mg/buf/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } liblibmgbuf.la: $(liblibmgbuf_la_OBJECTS) $(liblibmgbuf_la_DEPENDENCIES) $(EXTRA_liblibmgbuf_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(liblibmgbuf_la_OBJECTS) $(liblibmgbuf_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgbuf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgbufclip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgbufdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgbufrender.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgbufrender24.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/mg/buf/Makefile.am0000644000175000017500000000044012310110200015013 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = liblibmgbuf.la liblibmgbuf_la_SOURCES = \ mgbuf.c mgbufclip.c mgbufdraw.c mgbufrender24.c mgbufrender.c \ mgbuf.h mgbufP.h mgbufrender24.h mgbufrender.h mgbufwindows.h MGRdolines.h MGRline.h MGRpolyscan.h geomview-1.9.5/src/lib/mg/buf/mgbuf.c0000644000175000017500000006617212310110200014241 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgbuf.h" #include "mgbufP.h" #include "windowP.h" #include static int weeble = 0; void mgbuf_reshapeviewport(void); void mgbuf_appearance( struct mgastk *ma, int mask ); void mgbuf_setshader(mgshadefunc shader); mgcontext * mgbuf_ctxcreate(int a1, ...); int mgbuf_ctxset( int a1, ... ); int mgbuf_feature( int feature ); void mgbuf_ctxdelete( mgcontext *ctx ); int mgbuf_ctxget( int attr, void* valueptr ); int mgbuf_ctxselect( mgcontext *ctx ); void mgbuf_sync( void ); void mgbuf_worldbegin( void ); void mgbuf_worldend( void ); void mgbuf_identity( void ); void mgbuf_transform( Transform T ); int mgbuf_pushtransform( void ); int mgbuf_poptransform( void ); void mgbuf_gettransform( Transform T ); void mgbuf_settransform( Transform T ); int mgbuf_pushappearance( void ); int mgbuf_popappearance( void ); const Appearance *mgbuf_setappearance(const Appearance* app, int merge ); int mgbuf_setcamera( Camera* cam ); int mgbuf_setwindow( WnWindow *win, int final ); mgbufcontext *mgbuf_newcontext( mgbufcontext *ctx ); static unsigned char *createRGB( void ); /* probably not here */ int mgdevice_BUF(); extern void mgbuf_polygon(); extern void mgbuf_mesh(); extern void mgbuf_line(); extern void mgbuf_polyline(); extern void mgbuf_polylist(); extern void mgbuf_quads(); int _mgbuf_ctxset(int a1, va_list *alist); WnWindow *mgbufwindow(WnWindow *win); struct mgfuncs mgbuffuncs = { MGD_BUF, mgdevice_BUF, mgbuf_feature, (mgcontext *(*)())mgbuf_ctxcreate, mgbuf_ctxdelete, (int (*)())mgbuf_ctxset, mgbuf_ctxget, mgbuf_ctxselect, mgbuf_sync, mgbuf_worldbegin, mgbuf_worldend, mgbuf_reshapeviewport, /* geometry transform */ mgbuf_settransform, mgbuf_gettransform, mgbuf_identity, mgbuf_transform, mgbuf_pushtransform, mgbuf_poptransform, /* texture transform */ mg_settxtransform, mg_gettxtransform, mg_txidentity, mg_txtransform, mg_pushtxtransform, mg_poptxtransform, /* appearance */ mgbuf_pushappearance, mgbuf_popappearance, mgbuf_setappearance, mg_getappearance, /*************/ mgbuf_setcamera, mgbuf_polygon, mgbuf_polylist, mgbuf_mesh, mgbuf_line, mgbuf_polyline, mg_quads, mg_bezier, mg_bsptree, mg_tagappearance, mg_untagappearance, mg_taggedappearance }; static int curwidth=1; void mgbuf_reshapeviewport(void) { CamSet(_mgc->cam, CAM_ASPECT, (double)_mgbufc->xsize/(double)_mgbufc->ysize, CAM_END); } /*----------------------------------------------------------------------- * Function: mgdevice_BUF * Description: select the BUF device as the current MG device * Returns: 1 * Author: daeron * Notes: */ int mgdevice_BUF() { _mgf = mgbuffuncs; if(_mgc != NULL && _mgc->devno != MGD_BUF) _mgc = NULL; return(0); } /*----------------------------------------------------------------------- * Function: mgbuf_newcontext * Description: initialize an mgcontext structure * Args: mgc: ptr to context structure to initialize * Returns: mgc * Notes: Further device-specific initialization is normally required. */ mgbufcontext * mgbuf_newcontext( mgbufcontext *ctx ) { mg_newcontext(&(ctx->mgctx)); ctx->mgctx.devfuncs = &mgbuffuncs; ctx->mgctx.devno = MGD_BUF; ctx->mgctx.astk->ap_seq = 1; ctx->mgctx.astk->mat_seq = 1; ctx->mgctx.astk->light_seq = 1; ctx->mgctx.astk->shader = mg_eucshade; ctx->mgctx.zfnudge = 40.e-6; ctx->buf = NULL; ctx->zbuf = NULL; ctx->xsize = ctx->ysize = 0; ctx->file = NULL; ctx->born = 0; VVINIT(ctx->room, char, 180); ctx->pvertnum = 100; VVINIT(ctx->pverts, CPoint3, ctx->pvertnum); vvneeds(&(ctx->pverts), ctx->pvertnum); return ctx; } /*----------------------------------------------------------------------- * Function: _mgbuf_ctxset * Description: internal ctxset routine * Args: a1: first attribute * *alist: rest of attribute-value list * Returns: -1 on error, 0 on success * Date: Fri Sep 20 11:08:13 1991 * Notes: mgbuf_ctxcreate() and mgbuf_ctxset() call this to actually * parse and interpret the attribute list. */ int _mgbuf_ctxset(int a1, va_list *alist) { int attr; char **ablock = NULL; #define NEXT(type) OOGL_VA_ARG(type, alist, ablock) for (attr = a1; attr != MG_END; attr = NEXT(int)) { switch (attr) { case MG_ABLOCK: ablock = NEXT(char**); break; case MG_ApSet: { Appearance *ap; if (ablock) ap = ApSet(NULL, AP_ABLOCK, ablock); else ap = _ApSet(NULL, va_arg(*alist, int), alist); mgbuf_setappearance(ap, MG_MERGE); ApDelete(ap); } break; case MG_WnSet: if (ablock) WnSet( _mgc->win, WN_ABLOCK, ablock); else _WnSet( _mgc->win, va_arg(*alist, int), alist); mgbuf_setwindow( _mgc->win, 0 ); break; case MG_CamSet: if (ablock) CamSet( _mgc->cam, CAM_ABLOCK, ablock); else _CamSet( _mgc->cam, va_arg(*alist, int), alist); break; case MG_APPEAR: mgsetappearance( NEXT(Appearance *), MG_SET ); break; case MG_WINDOW: if (_mgc->win) WnDelete(_mgc->win); _mgc->win = NEXT(WnWindow *); mgbuf_setwindow( NULL, 0 ); break; case MG_CAMERA: mgbuf_setcamera( NEXT(Camera *) ); break; case MG_SETOPTIONS: _mgc->opts |= NEXT(int); break; case MG_UNSETOPTIONS: _mgc->opts &= ~NEXT(int); break; case MG_SHOW: _mgc->shown = NEXT(int); break; case MG_PARENT: _mgc->parent = NEXT(mgcontext*); break; case MG_BACKGROUND: { ColorA bcolor; bcolor = *NEXT(ColorA*); _mgc->background = bcolor; } break; case MG_SHADER: mgbuf_setshader( NEXT(mgshadefunc) ); break; case MG_SHADERDATA: _mgc->astk->shaderdata = NEXT(void*); break; case MG_SPACE: { int space = NEXT(int); switch (TM_SPACE(space)) { case TM_EUCLIDEAN: case TM_SPHERICAL: _mgc->space = space; break; case TM_HYPERBOLIC: switch (TM_MODEL(space)) { case TM_VIRTUAL: case TM_PROJECTIVE: case TM_CONFORMAL_BALL: _mgc->space = space; break; default: fprintf(stderr, "_mgbuf_ctxset: Illegal space value %1d\n", space); } break; default: fprintf(stderr, "_mgbuf_ctxset: Illegal space value %1d\n", space); } } break; case MG_NDCTX: _mgc->NDctx = NEXT(mgNDctx *); break; case MG_ZNUDGE: _mgc->zfnudge = NEXT(double); break; case MG_BUFFILE: _mgbufc->file = NEXT(FILE *); break; case MG_BUFFILEPATH: if (_mgbufc->file) fclose(_mgbufc->file); strcpy(_mgbufc->filepath, NEXT(char *)); _mgbufc->file = fopen(_mgbufc->filepath, "w"); break; default: OOGLError (0, "_mgbuf_ctxset: undefined option: %d", attr); return -1; } } if (_mgc->shown && !_mgbufc->born) { /* open the window */ mgbufwindow(_mgc->win); /* bring BUF state into accordance with appearance state */ { Appearance *ap = ApCopy( &(_mgc->astk->ap), NULL ); mgbuf_setappearance( ap, MG_SET ); ApDelete(ap); } } #undef NEXT return 0; } /* This needs some checking -- TOR */ int mgbuf_setwindow( WnWindow *win, int final ) { /*WnPosition wp; WnPosition pos, vp;*/ int xsize, ysize; /* int flag, reconstrain; int positioned = 0; int zmin; char *name, *oname;*/ if (win == NULL) return 0; /* WnGet(_mgc->win, WN_CURPOS, &wp); xsize = wp.xmax - wp.xmin + 1; ysize = wp.ymax - wp.ymin + 1; */ WnGet(_mgc->win, WN_XSIZE, &xsize); WnGet(_mgc->win, WN_YSIZE, &ysize); if (final) { /* fprintf(stderr, "BUF: setwindow xsize=%d ysize=%d\n", xsize, ysize); */ if (_mgbufc->buf) free(_mgbufc->buf); _mgbufc->buf = (unsigned char *) malloc(4*xsize*ysize); if (_mgbufc->zbuf) free(_mgbufc->zbuf); _mgbufc->zbuf = (float *) malloc(xsize*ysize*sizeof(float)); } _mgbufc->xsize = xsize; _mgbufc->ysize = ysize; return 1; } /*----------------------------------------------------------------------- * Function: mgbuf_identity * Description: Set the current object xform to the identity * Args: (none) * Returns: nothing * Notes: Sets the xform on the top of the current context's xform * stack to the identity. Also sets the MC_TRANS bit of * the context's "changed" flag and increment's the current xfm * sequence number. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgbuf_identity( void ) { mgbuf_settransform( TM3_IDENTITY ); } /*----------------------------------------------------------------------- * Function: mgbuf_settransform * Description: Set the current object xform * Args: T * Returns: nothing * Notes: Sets the xform on the top of the current context's xform * stack to T. Also sets the MC_TRANS bit of * the context's "changed" flag and increment's the current xfm * sequence number. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgbuf_settransform( Transform T ) { TmCopy(T, _mgc->xstk->T); _mgc->has = _mgc->xstk->hasinv = 0; } /*----------------------------------------------------------------------- * Function: mgbuf_gettransform * Description: Get the current object xform * Args: T * Returns: nothing * Notes: Writes the current object xform, from the top of the * context's xform stack, into T. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgbuf_gettransform( Transform T ) { TmCopy(_mgc->xstk->T, T); } /*----------------------------------------------------------------------- * Function: mgbuf_transform * Description: premultiply the current object xform by a transform * Args: T: the transform to premultiply by * Returns: nothing * Notes: If X is the context's current object xform, replaces X * by T X. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgbuf_transform( Transform T ) { TmConcat(T, _mgc->xstk->T, _mgc->xstk->T); _mgc->has = _mgc->xstk->hasinv = 0; } /*----------------------------------------------------------------------- * Function: mgbuf_pushappearance * Description: push the context's appearance stack * Returns: nothing * Notes: * DEVICE USE: required --- all devices must maintain this stack */ int mgbuf_pushappearance() { mg_pushappearance(); return 0; } /*----------------------------------------------------------------------- * Function: mgbuf_popappearance * Description: pop the context's appearance stack * Returns: nothing * Notes: * DEVICE USE: required --- all deviced must maintain this stack */ int mgbuf_popappearance() { struct mgastk *mastk = _mgc->astk; struct mgastk *mastk_next; if (!(mastk_next = mastk->next)) { OOGLError(0, "mgbuf_popappearance: appearance stack has only 1 entry."); return 0; } mgbuf_appearance(mastk_next, mastk_next->ap.valid); mg_popappearance(); return 0; } /*----------------------------------------------------------------------- * Function: mgbuf_setappearance * Description: Operate on appearance in current context * Args: *ap: the appearance to assign or merge * mergeflag: MG_MERGE or MG_SET * Returns: ptr to current appearance * Notes: Modifies the context's current apperance. Does not * modify *ap. * mergeflag = MG_MERGE: merge *ap into current appearance * mergeflag = MG_SET: set current appearance to *ap * DEVICE USE: required --- when ??? * * Can we modify this to do some of the flag setting * than mgbuf_setappearance currently does??? This * seems common to all devices. */ const Appearance * mgbuf_setappearance(const Appearance *ap, int mergeflag ) { int changed, lng_changed; struct mgastk *mastk = _mgc->astk; Appearance *ma; ma = &(mastk->ap); if(mergeflag == MG_MERGE) { changed = ap->valid &~ (ma->override &~ ap->override); lng_changed = ap->lighting ? ap->lighting->valid &~ (ma->lighting->override &~ ap->lighting->override) : 0; } else { changed = ap->valid; lng_changed = ap->lighting ? ap->lighting->valid : 0; } mg_setappearance( ap, mergeflag ); if ((ap->lighting) && (mastk->next)) { if (mastk->light_seq == mastk->next->light_seq) { mastk->light_seq++; lng_changed |= ma->lighting->valid; /* "All fields changed" */ } } mgbuf_appearance( mastk, changed); return &_mgc->astk->ap; } /*----------------------------------------------------------------------- * Function: mgbuf_setcamera * Description: Set the context's camera * Args: *cam: the camera to use * Returns: nothing * Notes: The context does not maintain an internal copy of the * camera. Only the pointer is stored. * DEVICE USE: required */ int mgbuf_setcamera( Camera *cam ) { if (_mgc->cam) CamDelete(_mgc->cam); _mgc->cam = cam; RefIncr((Ref*) cam); return 0; } /*----------------------------------------------------------------------- * Function: mgbuf_ctxset * Description: set some attributes in the current context * Args: attr, ...: list of attribute-value pairs, terminated * by MG_END * Returns: -1 on error and 0 on success * Notes: DO NOT CALL THIS (yet)! It currently does nothing. * DEVICE USE: forbidden --- devices have their own mgxx_ctxset() * * This needs to be modified to work as the NULL device. * Use by other devices may never be needed. */ int mgbuf_ctxset( int attr, ... /*, MG_END */ ) { va_list alist; int result; va_start( alist, attr ); result = _mgbuf_ctxset(attr, &alist); va_end(alist); return result; } /*----------------------------------------------------------------------- * Function: mgbuf_ctxget * Description: get an attribute from the current context * Args: attr: the attribute to get * value: place to write attr's value * */ int mgbuf_ctxget( int attr, void *value ) { #define VALUE(type) ((type*)value) switch (attr) { case MG_APPEAR: *VALUE(Appearance*) = &(_mgc->astk->ap); break; case MG_CAMERA: *VALUE(Camera*) = _mgc->cam; break; case MG_WINDOW: /* pretty silly concept, IMHO :-) */ *VALUE(WnWindow*) = _mgc->win; break; case MG_PARENT: *VALUE(mgcontext*) = _mgc->parent; break; case MG_SETOPTIONS: case MG_UNSETOPTIONS: *VALUE(int) = _mgc->opts; break; case MG_BACKGROUND: *VALUE(ColorA) = _mgc->background; break; case MG_SHADER: *VALUE(mgshadefunc) = _mgc->astk->shader; break; case MG_SHADERDATA: *VALUE(void *) = _mgc->astk->shaderdata; break; case MG_SPACE: *VALUE(int) = _mgc->space; break; case MG_NDCTX: *VALUE(mgNDctx *) = _mgc->NDctx; break; case MG_ZNUDGE: *VALUE(float) = _mgc->zfnudge; break; case MG_BUFFILE: *VALUE(FILE *) = _mgbufc->file; break; case MG_BUFFILEPATH: *VALUE(char *) = _mgbufc->filepath; break; case MG_BUFMEMORY: *VALUE(unsigned char *) = createRGB(); break; default: OOGLError (0, "mgbuf_ctxget: undefined option: %d\n", attr); return -1; } return 1; #undef VALUE } /*----------------------------------------------------------------------- * Function: mgbuf_feature * Description: determine whether the NULL device has a particular feature * Args: feature: feature to test for * Returns: -1 (means feature is not present) * Notes: BUF device is rather featureless at present, :-) * DEVICE USE: forbidden --- devices have their own mgxx_feature() */ int mgbuf_feature( int feature ) { return -1; } /*----------------------------------------------------------------------- * Function: mgbuf_ctxcreate * Description: create a new MG context for the BUF device * Args: a1, ...: list of attribute-value pairs * Returns: ptr to new context * Author: daeron */ mgcontext * mgbuf_ctxcreate( int a1, ... ) { va_list alist; _mgc = (mgcontext*)mgbuf_newcontext( OOGLNewE(mgbufcontext, "mgbuf_ctxcreate") ); va_start(alist, a1); _mgbuf_ctxset(a1, &alist); va_end(alist); return _mgc; } /*----------------------------------------------------------------------- * Function: mgbuf_ctxdelete * Description: delete an MG context for the BUF device * Args: *ctx: ptr to context to delete * Returns: nothing * Author: daeron */ void mgbuf_ctxdelete( mgcontext *ctx ) { mgbufcontext *_mgx = (mgbufcontext *)ctx; if(ctx->devno != MGD_BUF) { mgcontext *was = _mgc; mgctxselect(ctx); mgctxdelete(ctx); if (was != ctx) mgctxselect(was); } else { free(_mgx->buf); free(_mgx->zbuf); vvfree(&_mgx->pverts); vvfree(&_mgx->room); mg_ctxdelete(ctx); if (ctx == _mgc) _mgc = NULL; } } /*----------------------------------------------------------------------- * Function: mgbuf_ctxselect * Description: select the current context * Args: *ctx: the context to select * Returns: 0 (why ???) * Author: daeron */ int mgbuf_ctxselect( mgcontext *ctx ) { if (ctx == NULL || ctx->devno != MGD_BUF) { return mg_ctxselect(ctx); } /* BUF context */ _mgc = ctx; return(0); } /*----------------------------------------------------------------------- * Function: mgbuf_pushtransform * Description: push the mg context xform stack * Returns: nothing */ int mgbuf_pushtransform( void ) { mg_pushtransform(); return 0; } /*----------------------------------------------------------------------- * Function: mgbuf_poptransform * Description: pop the mg context xform stack * Returns: nothing */ int mgbuf_poptransform( void ) { mg_poptransform(); return 0; } void mgbuf_sync( void ) { } void mgbuf_worldbegin( void ) { int color[4]; color[0] = _mgc->background.r * 255; color[1] = _mgc->background.g * 255; color[2] = _mgc->background.b * 255; mg_worldbegin(); #if 0 && !DO_NOT_HACK_THE_CODE_THIS_WAY { /* This cannot be done here because there are objects which do not * belong to the world coordinate system; this stuff needs to be * done in mgx11windows.c in Xmg_add(). */ Transform S; WnPosition vp; WnGet(_mgc->win, WN_VIEWPORT, &vp); /* Fix up W2S and S2W matrices. Since the BUF coordinate system * has Y increasing downward, flip it here, and translate by * location of lower left corner of viewport. */ TmTranslate(S, (double)vp.xmin, (double)vp.ymax, 0.); S[1][1] = -1; /* Invert sign of Y */ TmConcat(_mgc->W2S, S, _mgc->W2S); TmInvert(_mgc->W2S, _mgc->S2W); } #endif _mgc->has = 0; /* fprintf(stderr, "BUF: mgbuf_worldbegin -- clearing buffers\n"); */ Xmgr_24fullinit(0xFF0000, 0xFF00, 0xFF); Xmgr_24clear(_mgbufc->buf, _mgbufc->zbuf, _mgbufc->xsize, _mgbufc->xsize*4, _mgbufc->ysize, color, 1, 1, 0, 0, 0, 0); _mgbufc->znudgeby = 0.0; } void mgbuf_worldend( void ) { int i, size; FILE *file; int *buf; /* fprintf(stderr, "BUF: mgbuf_worldend\n"); */ if (_mgbufc->file == NULL) return; fprintf(_mgbufc->file, "P6\n%d %d\n255\n", _mgbufc->xsize, _mgbufc->ysize); size = _mgbufc->xsize * _mgbufc->ysize; buf = (int *)_mgbufc->buf; file = _mgbufc->file; for (i=0; i>16, file); fputc((buf[i]&0xFF00)>>8, file); fputc(buf[i]&0xFF, file); } } static unsigned char * createRGB( void ) { int i, size; int *buf; unsigned char *rgb; rgb = (unsigned char *)malloc(3 * _mgbufc->xsize * _mgbufc->ysize); if (rgb == NULL) return NULL; size = _mgbufc->xsize * _mgbufc->ysize; buf = (int *)_mgbufc->buf; for (i=0; i>16; rgb[3*i+1] = (buf[i]&0xFF00)>>8; rgb[3*i+2] = buf[i]&0xFF; } return rgb; } WnWindow * mgbufwindow(WnWindow *win) { _mgbufc->born = 1; mgbuf_setwindow(win, 1); mgbuf_init_zrange(); return(win); } /* funky low level stuff... don't worry... be happy :) */ static void frob(void) {} /* Function: BUFmg_add Description: add a primitive (polygon, vertex, line) Author: Daeron Meyer, Timothy Rowley */ void BUFmg_add(int primtype, int numdata, void *data, void *cdata) { HPoint3 *vt = (HPoint3 *)data; float *col = (float *)cdata; ColorA *colarray = (ColorA *)cdata; CPoint3 *vts; int i; static mgbufprim prim; /* float frazzle; */ static int color[3], ecolor[3]; static int numverts; static int kind; static int ewidth; #if 1 || HACK_THE_CODE_BUT_BETTER_FIX_IT if (!(_mgc->has & HAS_S2O)) { Transform S; WnPosition vp; mg_findS2O(); mg_findO2S(); WnGet(_mgc->win, WN_VIEWPORT, &vp); /* Fix up W2S and S2W matrices. Since the BUF coordinate system * has Y increasing downward, flip it here, and translate by * location of lower left corner of viewport. */ TmTranslate(S, (double)vp.xmin, (double)vp.ymax, 0.); S[1][1] = -1; /* Invert sign of Y */ TmConcat(_mgc->O2S, S, _mgc->O2S); TmInvert(_mgc->O2S, _mgc->S2O); } #endif /* fprintf(stderr, "%p (xstk=%p)\n", _mgc, _mgc->xstk); */ switch (primtype) { case MGX_BGNLINE: case MGX_BGNSLINE: if (primtype == MGX_BGNLINE) kind = PRIM_LINE; else kind = PRIM_SLINE; numverts = 0; ewidth = curwidth; if (!(_mgc->has & HAS_S2O)) { mg_findS2O(); mg_findO2S(); } break; case MGX_BGNPOLY: case MGX_BGNSPOLY: case MGX_BGNEPOLY: case MGX_BGNSEPOLY: if (primtype == MGX_BGNPOLY) kind = PRIM_POLYGON; else if (primtype == MGX_BGNSPOLY) kind = PRIM_SPOLYGON; else if (primtype == MGX_BGNEPOLY) kind = PRIM_EPOLYGON; else kind = PRIM_SEPOLYGON; ewidth = curwidth; numverts = 0; if (!(_mgc->has & HAS_S2O)) { mg_findS2O(); mg_findO2S(); } break; case MGX_VERTEX: for (i=0; ipverts, CPoint3)[numverts]); HPt3Transform(_mgc->O2S, &(vt[i]), (HPoint3 *) vts); vts->drawnext = 1; /* if (vts->w <= 0.0) {vts->x = _mgbufc->xsize - vts->x; vts->y = _mgbufc->ysize - vts->y; vts->z *= -1.0;} */ vts->vcol.r = 0; vts->vcol.g = 0; vts->vcol.b = 0; vts->vcol.a = 1; numverts++; if (numverts > _mgbufc->pvertnum) { _mgbufc->pvertnum *= 2; vvneeds(&(_mgbufc->pverts), _mgbufc->pvertnum); } } break; case MGX_CVERTEX: for (i=0; ipverts, CPoint3)[numverts]); HPt3Transform(_mgc->O2S, &(vt[i]), (HPoint3 *) vts); vts->drawnext = 1; /* if (vts->w <= 0.0) {vts->x = _mgbufc->xsize - vts->x; vts->y = _mgbufc->ysize - vts->y; vts->z *= -1.0;} */ vts->vcol = colarray[i]; numverts++; if (numverts > _mgbufc->pvertnum) { _mgbufc->pvertnum *= 2; vvneeds(&(_mgbufc->pverts), _mgbufc->pvertnum); } } break; case MGX_COLOR: color[0] = (int)(255.0 * col[0]); color[1] = (int)(255.0 * col[1]); color[2] = (int)(255.0 * col[2]); break; case MGX_ECOLOR: ecolor[0] = (int)(255.0 * col[0]); ecolor[1] = (int)(255.0 * col[1]); ecolor[2] = (int)(255.0 * col[2]); break; case MGX_END: prim.mykind = kind; prim.index = 0; prim.numvts = numverts; kind = Xmgr_primclip(&prim); numverts = prim.numvts; { unsigned char *buf = _mgbufc->buf; float *zbuf = _mgbufc->zbuf; int zwidth = _mgbufc->xsize; int w = 4*_mgbufc->xsize; int h = _mgbufc->ysize; vts = &(VVEC(_mgbufc->pverts, CPoint3)[0]); switch (kind) { case PRIM_POLYGON: Xmgr_24Zpoly(buf, zbuf, zwidth, w, h, vts, numverts, color); break; case PRIM_SPOLYGON: if (weeble==2383) frob(); Xmgr_24GZpoly(buf, zbuf, zwidth, w, h, vts, numverts, color); break; case PRIM_EPOLYGON: Xmgr_24Zpoly(buf, zbuf, zwidth, w, h, vts, numverts, color); Xmgr_24Zpolyline(buf, zbuf, zwidth, w, h, vts, numverts, ewidth, ecolor); Xmgr_24Zline(buf, zbuf, zwidth, w, h, &vts[numverts-1], &vts[0], ewidth, ecolor); break; case PRIM_SEPOLYGON: Xmgr_24GZpoly(buf, zbuf, zwidth, w, h, vts, numverts, color); Xmgr_24Zpolyline(buf, zbuf, zwidth, w, h, vts, numverts, ewidth, ecolor); Xmgr_24Zline(buf, zbuf, zwidth, w, h, &vts[numverts-1], &vts[0], ewidth, ecolor); break; case PRIM_SLINE: Xmgr_24GZpolyline(buf, zbuf, zwidth, w, h, vts, numverts, ewidth, ecolor); break; case PRIM_LINE: Xmgr_24Zpolyline(buf, zbuf, zwidth, w, h, vts, numverts, ewidth, ecolor); break; case PRIM_INVIS: break; } } break; default: fprintf(stderr,"unknown type of primitive.\n"); break; } } /* .................................... */ void mgbuf_appearance( struct mgastk *ma, int mask ) { Appearance *ap = &(ma->ap); if (mask & APF_LINEWIDTH) { curwidth = ap->linewidth; _mgc->has &= ~HAS_POINT; } if (mask & APF_SHADING) { if (IS_SHADED(ap->shading) && ma->shader != NULL) { /* Use software shader if one exists and user wants lighting */ ma->flags |= MGASTK_SHADER; } else { /* No software shading, just use raw colors */ ma->flags &= ~MGASTK_SHADER; } } } void mgbuf_setshader(mgshadefunc shader) { struct mgastk *ma = _mgc->astk; unsigned short wasusing = ma->flags & MGASTK_SHADER; ma->shader = shader; if (shader != NULL && IS_SHADED(ma->ap.shading)) { ma->flags |= MGASTK_SHADER; } else { ma->flags &= ~MGASTK_SHADER; } if((ma->flags & MGASTK_SHADER) != wasusing) mgbuf_appearance(_mgc->astk, APF_SHADING); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/mg/buf/mgbufclip.c0000644000175000017500000001536312310110200015105 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgbufP.h" #define WCLIPPLANE 0.001 /* This is as close as we get to the eyeplane */ #define XLEFTCLIP 0.0 #define XRIGHTCLIP 1.0 #define YTOPCLIP 0.0 #define YBOTTOMCLIP 1.0 #define ZNEARCLIP (-1.0) #define ZFARCLIP 1.0 static int xyz[6], clipvertnum = 0; static mgbufprim *prim1, *prim2, *primtemp; static CPoint3 *vts1, *vts2, *vtstemp; /* Function: Xmgr_dividew() Description: Divide out w coordinate (*after* clipping against WCLIPPLANE) Author: Daeron Meyer */ void Xmgr_dividew(void) { CPoint3 *curr; float w; int n; for (n = 0; n < prim1->numvts; n++) { curr = &(vts1[n]); w = curr->w; curr->x /= w; curr->y /= w; curr->z /= w; curr->z += _mgbufc->znudgeby; if (curr->x < XLEFTCLIP) xyz[0]++; if (curr->x >= (float)_mgbufc->xsize - XRIGHTCLIP) xyz[1]++; if (curr->y < YTOPCLIP) xyz[2]++; if (curr->y >= (float)_mgbufc->ysize - YBOTTOMCLIP) xyz[3]++; if (curr->z < ZNEARCLIP) xyz[4]++; if (curr->z >= ZFARCLIP) xyz[5]++; } } /* Function: Xmgr_cliptoplane() Description: Clip polygon against a coordinate axis plane Author: Daeron Meyer */ void Xmgr_cliptoplane(int coord, float plane, float sign) { CPoint3 *prev, *curr, *dest; float i, i1, i2, *c1, *p1, *d1; int n; #ifdef DEBUGCLIP fprintf(stderr, "Clip %d, plane=%f, sign=%f\n", coord, plane, sign); #endif prim2->numvts = 0; prev = &(vts1[prim1->numvts - 1]); i1 = sign * ((float *) prev) [coord] - plane; for (curr=vts1, n=prim1->numvts; n > 0; n--, prev=curr, i1=i2, curr++) { i2 = sign * ((float *) curr) [coord] - plane; if ((i1 <= 0.0) ^ (i2 <= 0.0)) { i = i1/(i1 - i2); dest = &(vts2[prim2->numvts]); dest->x = prev->x + i * (curr->x - prev->x); dest->y = prev->y + i * (curr->y - prev->y); dest->z = prev->z + i * (curr->z - prev->z); dest->w = prev->w + i * (curr->w - prev->w); if ((i1 <= 0.0) || (prev->drawnext == 0)) dest->drawnext = 0; else dest->drawnext = 1; c1 = (float *) &(curr->vcol); p1 = (float *) &(prev->vcol); d1 = (float *) &(dest->vcol); d1[0] = p1[0] + i * (c1[0] - p1[0]); d1[1] = p1[1] + i * (c1[1] - p1[1]); d1[2] = p1[2] + i * (c1[2] - p1[2]); d1[3] = p1[3] + i * (c1[3] - p1[3]); prim2->numvts++; } if (i2 <= 0.0) { vts2[prim2->numvts] = *curr; prim2->numvts++; } } #ifdef DEBUGCLIP for (n = 0; n < prim2->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts2[n].x, vts2[n].y, vts2[n].z, vts2[n].w, vts2[n].drawnext); } #endif } /* Function: Xmgr_primclip() Description: Clip a polygon to fit in the viewing volume Author: Daeron Meyer */ int Xmgr_primclip(mgbufprim *aprim) { static mgbufprim clip; static int mykind, n; static vvec clipverts; static int intersectw; xyz[0]=0; xyz[1]=0; xyz[2]=0; xyz[3]=0; xyz[4]=0; xyz[5]=0; /* give ourselves more space for vertex data if needed */ if ((aprim->numvts * 2) > clipvertnum) { if (!clipvertnum) VVINIT(clipverts, CPoint3, clipvertnum); clipvertnum = aprim->numvts * 2; vvneeds(&clipverts, clipvertnum); } /* We might need more space for the final polygon since clipping can produce a polygon with more vertices than it had to begin with. We'll err on the side of safety: */ if (aprim->numvts > _mgbufc->pvertnum) { _mgbufc->pvertnum *= 2; vvneeds(&(_mgbufc->pverts), _mgbufc->pvertnum); } mykind = aprim->mykind; prim1 = aprim; prim2 = &clip; vts1 = &(VVEC(_mgbufc->pverts, CPoint3)[prim1->index]); vts2 = &(VVEC(clipverts, CPoint3)[0]); if ((mykind==PRIM_LINE) || (mykind==PRIM_SLINE)) vts1[prim1->numvts-1].drawnext = 0; prim2->index = 0; prim2->numvts = prim1->numvts; #define CLIP_POLYS_AND_SWAP(a, b, c) { \ Xmgr_cliptoplane(a, b, c); \ if (prim2->numvts == 0) { aprim->numvts = 0; return PRIM_INVIS; } \ vtstemp = vts2; vts2 = vts1; vts1 = vtstemp; \ primtemp = prim2; prim2 = prim1; prim1 = primtemp; \ } #ifdef DEBUGCLIP fprintf(stderr, "BEGIN-CLIP\n"); fprintf(stderr, "INITIAL POLY:\n"); for (n=0; n < aprim->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts1[n].x, vts1[n].y, vts1[n].z, vts1[n].w, vts1[n].drawnext); } fprintf(stderr,"===========================\n"); #endif intersectw = 0; for (n = 0; (n < aprim->numvts) && !intersectw; n++) { if (vts1[n].w < WCLIPPLANE) intersectw = 1; } if (intersectw) CLIP_POLYS_AND_SWAP(3, -WCLIPPLANE, -1.0); Xmgr_dividew(); n = prim1->numvts; if (!intersectw && (xyz[0]+xyz[1]+xyz[2]+xyz[3]+xyz[4]+xyz[5] == 0)) return mykind; else if (xyz[0] == n || xyz[1] == n || xyz[2] == n || xyz[3] == n || xyz[4] == n || xyz[5] == n) return PRIM_INVIS; if (xyz[0]) CLIP_POLYS_AND_SWAP(0, -XLEFTCLIP, -1.0); if (xyz[1]) CLIP_POLYS_AND_SWAP(0, (float)_mgbufc->xsize-XRIGHTCLIP, 1.0); if (xyz[2]) CLIP_POLYS_AND_SWAP(1, -YTOPCLIP, -1.0); if (xyz[3]) CLIP_POLYS_AND_SWAP(1, (float)_mgbufc->ysize-YBOTTOMCLIP, 1.0); if (xyz[4]) CLIP_POLYS_AND_SWAP(2, -ZNEARCLIP, -1.0); if (xyz[5]) CLIP_POLYS_AND_SWAP(2, ZFARCLIP, 1.0); if (aprim == prim2) /* If the vertex data ended up in the local vertex list, then we need to copy it back to the global vertex list */ { prim2->numvts = prim1->numvts; /* for (n=0; n < aprim->numvts; n++) { vts2[n] = vts1[n]; } */ memcpy(vts2, vts1, sizeof(CPoint3) * prim1->numvts); } #ifdef DEBUGCLIP fprintf(stderr, "FINAL POLY:\n"); for (n=0; n < aprim->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts1[n].x, vts1[n].y, vts1[n].z, vts1[n].w, vts1[n].drawnext); } fprintf(stderr, "END-CLIP\n"); #endif return mykind; } geomview-1.9.5/src/lib/mg/buf/mgbufdraw.c0000644000175000017500000004402512310110200015110 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgbufP.h" #include "polylistP.h" #include "mgbufwindows.h" /* Author: Daeron Meyer */ void mgbuf_polygon( int nv, HPoint3 *v, int nn, Point3 *n, int nc, ColorA *c ); void mgbuf_mesh( int wrap, int nu, int nv, HPoint3 *p, Point3 *n, Point3 *nq, ColorA *c ); void mgbuf_line( HPoint3 *p1, HPoint3 *p2 ); void mgbuf_polyline( int nv, HPoint3 *verts, int nc, ColorA *colors, int wrap ); void mgbuf_polylist( int np, Poly *p, int nv, Vertex *v, int pl_flags ); void mgbuf_drawnormal(HPoint3 *p, Point3 *n); void mgbuf_closer(); void mgbuf_farther(); static ColorA *C2; /*----------------------------------------------------------------------- * Function: mgbuf_polygon * Description: draw a polygon * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgbuf_polygon(int nv, HPoint3 *V, int nn, Point3 *N, int nc, ColorA *C) { int count; HPoint3 *v; Point3 *n; int flag, ninc, smooth; /* fprintf(stderr,"X11: draw a polygon\n"); */ flag = _mgc->astk->ap.flag; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) nc = 0; ninc = (nn > 1); smooth = IS_SMOOTH(_mgc->astk->ap.shading); /* fprintf(stderr,"cinc = %d, nc = %d, nn = %d\n", cinc, nc, nn); */ if (nc == 0) C = (ColorA*)&_mgc->astk->ap.mat->diffuse; if ((flag & APF_FACEDRAW) && (flag & APF_EDGEDRAW)) { /* put polygon in display list */ if (smooth && (nc > 0)) BUFmg_add(MGX_BGNSEPOLY, 0, NULL, NULL); else BUFmg_add(MGX_BGNEPOLY, 0, NULL, NULL); BUFmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); /* edge color */ BUFmg_add(MGX_COLOR, 0, NULL, C); /* face color */ if (smooth) BUFmg_add(MGX_CVERTEX, nv, V, C); else BUFmg_add(MGX_VERTEX, nv, V, NULL); BUFmg_add(MGX_END, 0, NULL, NULL); } else if (flag & APF_FACEDRAW) { /* put polygon in display list */ if (smooth) BUFmg_add(MGX_BGNSPOLY, 0, NULL, NULL); else BUFmg_add(MGX_BGNPOLY, 0, NULL, NULL); BUFmg_add(MGX_COLOR, 0, NULL, C); if (smooth && (nc > 0)) BUFmg_add(MGX_CVERTEX, nv, V, C); else BUFmg_add(MGX_VERTEX, nv, V, NULL); BUFmg_add(MGX_END, 0, NULL, NULL); } else if (flag & APF_EDGEDRAW) { BUFmg_add(MGX_BGNLINE, 0, NULL, NULL); BUFmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); BUFmg_add(MGX_VERTEX, nv, V, NULL); BUFmg_add(MGX_VERTEX, 1, V, NULL); BUFmg_add(MGX_END, 0, NULL, NULL); } if (flag & APF_NORMALDRAW) { mgbuf_closer(); BUFmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->normalcolor); for (n = N, v = V, count = 0; count 1) * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgbuf_fatpoint(HPoint3 *v) { HPoint3 a; HPoint3 *p, *q; float vw; /* fprintf(stderr,"X11: make a fat-point\n"); */ if (!(_mgc->has & HAS_POINT)) mg_makepoint(); /* Compute w component of point after projection to screen */ vw = v->x * _mgc->O2S[0][3] + v->y * _mgc->O2S[1][3] + v->z * _mgc->O2S[2][3] + v->w * _mgc->O2S[3][3]; if (vw <= 0) return; #define PUT(p) \ a.x = v->x + p->x*vw; a.y = v->y + p->y*vw; \ a.z = v->z + p->z*vw; a.w = v->w + p->w*vw; \ BUFmg_add(MGX_VERTEX, 1, &a, NULL); p = VVEC(_mgc->point, HPoint3); q = p + VVCOUNT(_mgc->point); BUFmg_add(MGX_BGNPOLY, 0, NULL, NULL); do { PUT(p); } while (++p < q); BUFmg_add(MGX_END, 0, NULL, NULL); } /*----------------------------------------------------------------------- * Function: mgbuf_polyline * Description: draw a polyline (possibly more than 2 vertices) * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgbuf_polyline( int nv, HPoint3 *v, int nc, ColorA *c, int wrapped ) { int remain; /* fprintf(stderr,"X11: draw a polyline\n"); */ if (!(wrapped & 2)) { if (_mgbufc->znudge) mgbuf_closer(); } if (nv == 1) { if (nc > 0) BUFmg_add(MGX_ECOLOR, 0, NULL, c); if (_mgc->astk->ap.linewidth > 1) { BUFmg_add(MGX_COLOR, 0, NULL, c); mgbuf_fatpoint(v); } else { BUFmg_add(MGX_BGNSLINE, 0, NULL, NULL); BUFmg_add(MGX_CVERTEX, 1, v, c); BUFmg_add(MGX_END, 0, NULL, NULL); } } else if (nv > 0) { BUFmg_add(MGX_BGNSLINE, 0, NULL, NULL); if (wrapped & 1) { if (nc > 0) { BUFmg_add(MGX_ECOLOR, 0, NULL, (c + nc - 1)); BUFmg_add(MGX_CVERTEX, 1, (v + nv - 1), (c + nc - 1)); } else BUFmg_add(MGX_CVERTEX, 1, (v + nv - 1), c); } for (;;) { remain = nv > 254 ? 254 : nv; nv -= remain; do { if (--nc > 0) { BUFmg_add(MGX_ECOLOR, 0, NULL, c); BUFmg_add(MGX_CVERTEX, 1, v++, c++); } else BUFmg_add(MGX_CVERTEX, 1, v++, c); } while (--remain > 0); if (nv == 0) break; if (nc > 0) BUFmg_add(MGX_ECOLOR, 0, NULL, c); BUFmg_add(MGX_CVERTEX, 1, v, c); BUFmg_add(MGX_END, 0, NULL, NULL); BUFmg_add(MGX_BGNSLINE, 0, NULL, NULL); } BUFmg_add(MGX_END, 0, NULL, NULL); } if (!(wrapped & 4) && _mgbufc->znudge) mgbuf_farther(); } /*----------------------------------------------------------------------- * Function: mgbuf_polylist * Description: draws a Polylist: collection of Polys * Author: Daeron Meyer * Notes: see mg.doc */ void mgbuf_polylist( int np, Poly *_p, int nv, Vertex *V, int pl_flags ) { int i, j; Poly *p; Vertex **v, *vp, **vh; struct mgastk *ma = _mgc->astk; int plflags = pl_flags; int flag, shading; int nonsurf = -1; flag = ma->ap.flag; shading = ma->ap.shading; /* fprintf(stderr,"X11: draw a polylist %d\n",np); */ switch(shading) { case APF_FLAT: plflags &= ~PL_HASVN; break; case APF_SMOOTH: plflags &= ~PL_HASPN; break; default: plflags &= ~(PL_HASVN | PL_HASPN); break; } if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) plflags &= ~(PL_HASVCOL | PL_HASPCOL); if (flag & APF_FACEDRAW) { for (p = _p, i = 0; i < np; i++, p++) { v = p->v; if ((j = p->n_vertices) <= 2) nonsurf = i; else { if (flag & APF_EDGEDRAW) { if (shading == APF_FLAT || shading == APF_CONSTANT) { BUFmg_add(MGX_BGNEPOLY, 0, NULL, NULL); } else if (plflags & PL_HASVCOL) BUFmg_add(MGX_BGNSEPOLY, 0, NULL, NULL); else BUFmg_add(MGX_BGNEPOLY, 0, NULL, NULL); BUFmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); } else { if (shading == APF_FLAT || shading == APF_CONSTANT) { BUFmg_add(MGX_BGNPOLY, 0, NULL, NULL); } else if (plflags & PL_HASVCOL) BUFmg_add(MGX_BGNSPOLY, 0, NULL, NULL); else BUFmg_add(MGX_BGNPOLY, 0, NULL, NULL); } if (plflags & PL_HASPCOL) BUFmg_add(MGX_COLOR, 0, NULL, &p->pcol); else if (plflags & PL_HASVCOL) /* if we have per vertex */ BUFmg_add(MGX_COLOR, 0, NULL, &(*v)->vcol); else BUFmg_add(MGX_COLOR, 0, NULL, &(ma->ap.mat->diffuse)); vh = v; do { if (plflags & PL_HASVCOL) BUFmg_add(MGX_CVERTEX, 1, &(*v)->pt, &(*v)->vcol); else BUFmg_add(MGX_CVERTEX, 1, &(*v)->pt, &(*vh)->vcol); v++; } while (--j > 0); BUFmg_add(MGX_END, 0, NULL, NULL); } } } if (flag & (APF_EDGEDRAW | APF_NORMALDRAW) || nonsurf > 0) { if (_mgbufc->znudge) mgbuf_closer(); if (flag & APF_EDGEDRAW && !(flag & APF_FACEDRAW)) { BUFmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); for (p = _p, i = 0; i < np; i++, p++) { BUFmg_add(MGX_BGNLINE, 0, NULL, NULL); for (j = 0, v = p->v; j < p->n_vertices; j++, v++) BUFmg_add(MGX_VERTEX, 1, &(*v)->pt, NULL); BUFmg_add(MGX_VERTEX, 1, &(*(p->v))->pt, NULL); BUFmg_add(MGX_END, 0, NULL, NULL); } } if (flag & APF_NORMALDRAW) { BUFmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->normalcolor); if (pl_flags & PL_HASPN) { for (p = _p, i = 0; i < np; i++, p++) { for (j = 0, v = p->v; j < p->n_vertices; j++, v++) mgbuf_drawnormal(&(*v)->pt, (Point3 *)&p->pn); } } else if (pl_flags & PL_HASVN) { for (vp = V, i = 0; i < nv; i++, vp++) mgbuf_drawnormal(&vp->pt, &vp->vn); } } for (p = _p, i = 0; i <= nonsurf; p++, i++) { v = p->v; switch (j = p->n_vertices) { case 1: BUFmg_add(MGX_BGNLINE, 0, NULL, NULL); if (pl_flags & PL_HASVCOL) BUFmg_add(MGX_ECOLOR, 0, NULL, &(*v)->vcol); BUFmg_add(MGX_VERTEX, 1, &(*v)->pt, NULL); BUFmg_add(MGX_END, 0, NULL, NULL); break; case 2: BUFmg_add(MGX_BGNLINE, 0, NULL, NULL); do { if (pl_flags & PL_HASVCOL) BUFmg_add(MGX_ECOLOR, 0, NULL, &(*v)->vcol); BUFmg_add(MGX_VERTEX, 1, &(*v)->pt, NULL); v++; } while (--j > 0); BUFmg_add(MGX_END, 0, NULL, NULL); break; } } if (_mgbufc->znudge) mgbuf_farther(); } } #define HAS_N 1 #define HAS_C 2 #define HAS_SMOOTH 4 /*----------------------------------------------------------------------- * Function: mgbufpolymeshrow * Description: draw one row of a mesh * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgbufpolymeshrow(int wrap, int has, int off, int count, HPoint3 *P, Point3 *N, ColorA *C, int flag, float *CE, int first) { int k; int edges = flag & APF_EDGEDRAW; int faces = flag & APF_FACEDRAW; if (wrap & MM_UWRAP) { k = count - 1; if (edges && faces) { if (has & HAS_SMOOTH) BUFmg_add(MGX_BGNSEPOLY, 0, NULL, NULL); else BUFmg_add(MGX_BGNEPOLY, 0, NULL, NULL); BUFmg_add(MGX_ECOLOR, 0, NULL, CE); } else if (faces) { if (has & HAS_SMOOTH) BUFmg_add(MGX_BGNSPOLY, 0, NULL, NULL); else BUFmg_add(MGX_BGNPOLY, 0, NULL, NULL); } else { BUFmg_add(MGX_BGNLINE, 0, NULL, NULL); BUFmg_add(MGX_ECOLOR, 0, NULL, CE); } if (C) { BUFmg_add(MGX_COLOR, 0, NULL, C+off+k); C2 = C+off+k; } else BUFmg_add(MGX_COLOR, 0, NULL, C2); if (has & HAS_SMOOTH) { if (C) { BUFmg_add(MGX_CVERTEX, 1, P+off+k, C+off+k); BUFmg_add(MGX_CVERTEX, 1, P+k, C+k); BUFmg_add(MGX_CVERTEX, 1, P, C); BUFmg_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C+off; } else { BUFmg_add(MGX_CVERTEX, 1, P+off+k, C2); BUFmg_add(MGX_CVERTEX, 1, P+k, C2); BUFmg_add(MGX_CVERTEX, 1, P, C2); BUFmg_add(MGX_CVERTEX, 1, P+off, C2); } } else { BUFmg_add(MGX_VERTEX, 1, P+off+k, NULL); BUFmg_add(MGX_VERTEX, 1, P+k, NULL); BUFmg_add(MGX_VERTEX, 1, P, NULL); BUFmg_add(MGX_VERTEX, 1, P+off, NULL); } BUFmg_add(MGX_END, 0, NULL, NULL); } k = count; do { if (edges && faces) { if (has & HAS_SMOOTH) BUFmg_add(MGX_BGNSEPOLY, 0, NULL, NULL); else BUFmg_add(MGX_BGNEPOLY, 0, NULL, NULL); BUFmg_add(MGX_ECOLOR, 0, NULL, CE); } else if (faces) { if (has & HAS_SMOOTH) BUFmg_add(MGX_BGNSPOLY, 0, NULL, NULL); else BUFmg_add(MGX_BGNPOLY, 0, NULL, NULL); } else { BUFmg_add(MGX_BGNLINE, 0, NULL, NULL); BUFmg_add(MGX_ECOLOR, 0, NULL, CE); /* ADDED */ if (first) BUFmg_add(MGX_VERTEX, 1, P+1+off, NULL); /* END */ } if (C) { BUFmg_add(MGX_COLOR, 0, NULL, C+off); C2 = C+off; } if (has & HAS_SMOOTH) { if (C) { BUFmg_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C; } else BUFmg_add(MGX_CVERTEX, 1, P+off, C2); if (C) { BUFmg_add(MGX_CVERTEX, 1, P++, C++); C2 = C; } else BUFmg_add(MGX_CVERTEX, 1, P++, C2); if (C) { BUFmg_add(MGX_CVERTEX, 1, P, C); C2 = C; } else BUFmg_add(MGX_CVERTEX, 1, P, C2); if (C) { BUFmg_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C; } else BUFmg_add(MGX_CVERTEX, 1, P+off, C2); } else { BUFmg_add(MGX_VERTEX, 1, P+off, NULL); if (C) C++; if (N) N++; BUFmg_add(MGX_VERTEX, 1, P++, NULL); BUFmg_add(MGX_VERTEX, 1, P, NULL); BUFmg_add(MGX_VERTEX, 1, P+off, NULL); } BUFmg_add(MGX_END, 0, NULL, NULL); } while (--k > 1); } /*----------------------------------------------------------------------- * Function: mgbufsubmesh * Description: divide up mesh and draw by rows * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgbufsubmesh(int wrap, int nu, int nv, int umin, int umax, int vmin, int vmax, HPoint3 *meshP, Point3 *meshN, ColorA *meshC) { int v; int ucnt; HPoint3 *P; Point3 *N; ColorA *C; int prev; int du; int i; int has; Appearance *ap; if (nu <= 0 || nv <= 0) return; ap = &_mgc->astk->ap; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) meshC = 0; has = 0; if (meshN && !(_mgc->astk->flags & MGASTK_SHADER)) has = HAS_N; if (meshC) has |= HAS_C; if (IS_SMOOTH(ap->shading)) has |= HAS_SMOOTH; if ( ap->flag & (APF_FACEDRAW | APF_EDGEDRAW) ) /* BUG? */ { if (!(has & HAS_C)) BUFmg_add(MGX_COLOR, 0, NULL, &ap->mat->diffuse); C2 = (ColorA *) &ap->mat->diffuse; v = vmax - vmin + 1; du = umin + vmin * nu; if (wrap & MM_VWRAP) { prev = nu * (v - 1); } else { du += nu; prev = -nu; v--; } do { P = meshP + du; N = meshN + du; C = meshC + du; ucnt = umax - umin + 1; mgbufpolymeshrow(wrap, has, prev, ucnt, P, has & HAS_N ? N : NULL, has & HAS_C ? C : NULL, ap->flag, (float *)&ap->mat->edgecolor, (int)(v!=1)); prev = -nu; du += nu; } while (--v > 0); } if (ap->flag & APF_NORMALDRAW && meshN != NULL) { BUFmg_add(MGX_ECOLOR, 0, NULL, &ap->mat->normalcolor); if (_mgbufc->znudge) mgbuf_closer(); for (i = nu*nv, P = meshP, N = meshN; --i >= 0; P++, N++) mgbuf_drawnormal(P, N); if (_mgbufc->znudge) mgbuf_farther(); } } /*----------------------------------------------------------------------- * Function: mgbuf_mesh * Description: draw a mesh * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgbuf_mesh(int wrap, int nu, int nv, HPoint3 *P, Point3 *N, Point3 *NQ, ColorA *C ) { mgbufsubmesh( wrap, nu, nv, 0, nu-1, 0, nv-1, P, N, C); } /*-----------------------------------------------------------------------* * end of mesh drawing functions: * *-----------------------------------------------------------------------*/ /* * Z-shift routines: for moving edges closer than faces, etc. */ void mgbuf_init_zrange() { _mgbufc->znudge = 1; _mgbufc->znudgeby = 0.0; } void mgbuf_closer() { /* _mgbufc->znudgeby = 0.001; */ } void mgbuf_farther() { _mgbufc->znudgeby = 0.0; } void mgbuf_findcam() { } /* There is a basic problem now with 4-d points and 3-d normal vectors. For now, we'll just ignore the 4-th coordinate of the point when computing the tip of the normal vector. This will work OK with all existing models, but for genuine 4-d points it won't work. But, come to think of it, what is the correct interpretation of the normal vector when the points live in 4-d? */ void mgbuf_drawnormal(HPoint3 *p, Point3 *n) { Point3 tp; HPoint3 end; HPt3Coord scale, w, s; /* fprintf(stderr,"X11: draw a normal\n"); */ if (p->w <= 0.0) return; if (p->w != 1) { HPt3ToPt3(p, &tp); p = (HPoint3 *)(void *)&tp; } scale = _mgc->astk->ap.nscale; if (_mgc->astk->ap.flag & APF_EVERT) { HPoint3 *cp = &_mgc->cpos; if (!(_mgc->has & HAS_CPOS)) { mg_findcam(); } if ((w = cp->w) != 1.0 && w != 0.0) { s = (p->x*w-cp->x)*n->x + (p->y*w-cp->y)*n->y + (p->z*w-cp->z)*n->z; } else { s = (p->x-cp->x)*n->x + (p->y-cp->y)*n->y + (p->z-cp->z)*n->z; } if (s > 0) { scale = -scale; } } end.x = p->x + scale*n->x; end.y = p->y + scale*n->y; end.z = p->z + scale*n->z; end.w = 1.0; BUFmg_add(MGX_BGNLINE, 0, NULL, NULL); BUFmg_add(MGX_VERTEX, 1, p, NULL); BUFmg_add(MGX_VERTEX, 1, &end, NULL); BUFmg_add(MGX_END, 0, NULL, NULL); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mg/buf/mgbufrender24.c0000644000175000017500000002042512310110200015576 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Author: Timothy Rowley */ /* {{{ Includes */ #include #include #include #include "mgP.h" #include "mgbufP.h" /* }}} */ static endPoint *mug=NULL; static int mugSize = 0; static int rshift, bshift, gshift; #ifdef __GNUC__ inline #endif static int RGBtoVal(int r, int g, int b) { return ((r << rshift) | (g << gshift) | (b << bshift)); } static int maskShift(int mask) { switch (mask) { case 0xFF000000U: return 24; case 0xFF0000U: return 16; case 0xFF00U: return 8; case 0xFFU: return 0; default: return 32; } } void Xmgr_24fullinit(int rmask, int gmask, int bmask) { rshift = maskShift(rmask); gshift = maskShift(gmask); bshift = maskShift(bmask); } /* {{{ clearing routine */ void Xmgr_24clear(unsigned char *buf, float *zbuf, int zwidth, int width, int height, int *color, int flag, int fullclear, int xmin, int ymin, int xmax, int ymax) { int *ptr = (int *)buf; int i, fill, end, x, length, pos; fill = RGBtoVal(color[0], color[1], color[2]); if (mug==NULL) { mug = (endPoint *)malloc(sizeof(endPoint)*height); mugSize = height; } if (height>mugSize) { mug = (endPoint *)realloc(mug, sizeof(endPoint)*height); mugSize = height; } if (fullclear) { end = (width*height)/4; for (i=0; i>2 #define PTR_TYPE int #define PTR_INIT (int *)(buf+y1*width+4*x1) #define WIDEYDOPIXEL ptr[i*ptrIncr+x] = col; #define WIDEXDOPIXEL ptr[y*ptrIncr+i] = col; #define DOPIXEL *ptr = col; #define VARIABLES int col = RGBtoVal(color[0], color[1], color[2]); #include "MGRline.h" #define WIDENAME wideZline #define NAME Xmgr_24Zline #define PTR_INCR width>>2 #define ZBUFFER #define PTR_TYPE int #define PTR_INIT (int *)(buf+y1*width+4*x1) #define WIDEYDOPIXEL ptr[i*ptrIncr+x] = col; #define WIDEXDOPIXEL ptr[y*ptrIncr+i] = col; #define DOPIXEL *ptr = col; #define VARIABLES int col = RGBtoVal(color[0], color[1], color[2]); #include "MGRline.h" #define WIDENAME wideGline #define NAME Xmgr_24Gline #define PTR_INCR width>>2 #define GOURAUD #define COLOR #define PTR_TYPE int #define PTR_INIT (int *)(buf+y1*width+4*x1) #define WIDEYDOPIXEL ptr[i*ptrIncr+x] = RGBtoVal(r, g, b); #define WIDEXDOPIXEL ptr[y*ptrIncr+i] = RGBtoVal(r, g, b); #define DOPIXEL *ptr = RGBtoVal(r, g, b); #include "MGRline.h" #define WIDENAME wideGZline #define NAME Xmgr_24GZline #define PTR_INCR width>>2 #define ZBUFFER #define GOURAUD #define COLOR #define PTR_TYPE int #define PTR_INIT (int *)(buf+y1*width+4*x1) #define WIDEYDOPIXEL ptr[i*ptrIncr+x] = RGBtoVal(r, g, b); #define WIDEXDOPIXEL ptr[y*ptrIncr+i] = RGBtoVal(r, g, b); #define DOPIXEL *ptr = RGBtoVal(r, g, b); #include "MGRline.h" /* }}} */ /* {{{ polygon scan conversion */ #define INIT (int *)(buf+width*y+x1*4) #define NAME Xmgr_doLines #define PTR_TYPE int #define PTR_INIT INIT #define VARIABLES int col=RGBtoVal(color[0], color[1], color[2]); #define DOPIXEL *ptr = col; #include "MGRdolines.h" #define NAME Xmgr_ZdoLines #define ZBUFFER #define PTR_TYPE int #define PTR_INIT INIT #define VARIABLES int col=RGBtoVal(color[0], color[1], color[2]); #define DOPIXEL *ptr = col; #include "MGRdolines.h" #define NAME Xmgr_GdoLines #define PTR_TYPE int #define PTR_INIT INIT #define DOPIXEL *ptr = RGBtoVal(r,g,b); #define GOURAUD #define COLOR #include "MGRdolines.h" #define NAME Xmgr_GZdoLines #define ZBUFFER #define PTR_TYPE int #define PTR_INIT INIT #define DOPIXEL *ptr = RGBtoVal(r,g,b); #define GOURAUD #define COLOR #include "MGRdolines.h" void Xmgr_24Zpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_Zpolyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_ZdoLines); } void Xmgr_24poly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_polyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_doLines); } void Xmgr_24GZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy) { Xmgr_GZpolyscan(buf, zbuf, zwidth, width, height, p, n, dummy, mug, Xmgr_GZdoLines); } void Xmgr_24Gpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy) { Xmgr_Gpolyscan(buf, zbuf, zwidth, width, height, p, n, dummy, mug, Xmgr_GdoLines); } /* }}} */ /* {{{ multi-line scan conversion */ #ifdef __GNUC__ inline #endif static void setZpixel(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int *color) { if (p->z < zbuf[(int)(p->y)*zwidth+(int)p->x]) ((int *)buf)[(int)(p->y)*(width/4)+(int)p->x] = RGBtoVal(color[0], color[1], color[2]); } #ifdef __GNUC__ inline #endif static void setpixel(unsigned char *buf, int zwidth, int width, int height, CPoint3 *p, int *color) { ((int *)buf)[(int)(p->y)*(width/4)+(int)p->x] = RGBtoVal(color[0], color[1], color[2]); } void Xmgr_24polyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color) { int i; CPoint3 *cp; if (n == 1) { setpixel(buf, zwidth, width, height, p, color); return; } for (i=0, cp=p; idrawnext) Xmgr_24line(buf, zbuf, zwidth, width, height, cp, cp+1, lwidth, color); } void Xmgr_24Zpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color) { int i; CPoint3 *cp; if (n == 1) { setZpixel(buf, zbuf, zwidth, width, height, p, color); return; } for (i=0, cp=p; idrawnext) Xmgr_24Zline(buf, zbuf, zwidth, width, height, cp, cp+1, lwidth, color); } void Xmgr_24Gpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color) { int i; CPoint3 *cp; if (n == 1) { setpixel(buf, zwidth, width, height, p, color); return; } for (i=0, cp=p; idrawnext) Xmgr_gradWrapper(buf, zbuf, zwidth, width, height, cp, cp+1, lwidth, Xmgr_24line, Xmgr_24Gline); } void Xmgr_24GZpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color) { int i; CPoint3 *cp; if (n == 1) { setZpixel(buf, zbuf, zwidth, width, height, p, color); return; } for (i=0, cp=p; idrawnext) Xmgr_gradWrapper(buf, zbuf, zwidth, width, height, cp, cp+1, lwidth, Xmgr_24Zline, Xmgr_24GZline); } /* }}} */ /* Local variables: folded-file: t */ geomview-1.9.5/src/lib/mg/buf/mgbufrender.c0000644000175000017500000000577012310110200015436 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Author: Timothy Rowley */ #include #include "mgP.h" #include "mgbufP.h" void Xmgr_gradWrapper(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p0, CPoint3 *p1, int lwidth, void (*flat)(unsigned char *, float *, int, int, int, CPoint3 *, CPoint3 *, int, int *), void (*smooth)(unsigned char *, float *, int, int, int, CPoint3 *, CPoint3 *, int, int *)) { int color[3]; if ((p0->vcol.r == p1->vcol.r) && (p0->vcol.g == p1->vcol.g) && (p0->vcol.b == p1->vcol.b)) { color[0] = 255*p0->vcol.r; color[1] = 255*p0->vcol.g; color[2] = 255*p0->vcol.b; flat(buf, zbuf, zwidth, width, height, p0, p1, lwidth, color); } else smooth(buf, zbuf, zwidth, width, height, p0, p1, lwidth, color); } void oldXmgr_gradWrapper(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p0, CPoint3 *p1, int lwidth, void (*flat)(unsigned char *, float *, int, int, int, int, int, float, int, int, float, int, int *), void (*smooth)(unsigned char *, float *, int, int, int, CPoint3 *, CPoint3 *, int)) { int color[3]; if ((p0->vcol.r == p1->vcol.r) && (p0->vcol.g == p1->vcol.g) && (p0->vcol.b == p1->vcol.b)) { color[0] = 255*p0->vcol.r; color[1] = 255*p0->vcol.g; color[2] = 255*p0->vcol.b; flat(buf, zbuf, zwidth, width, height, p0->x, p0->y, p0->z, p1->x, p1->y, p1->z, lwidth, color); } else smooth(buf, zbuf, zwidth, width, height, p0, p1, lwidth); } #define NAME Xmgr_polyscan #include "MGRpolyscan.h" #define NAME Xmgr_Zpolyscan #define ZBUFFER #include "MGRpolyscan.h" #define NAME Xmgr_Graypolyscan #define GOURAUD #include "MGRpolyscan.h" #define NAME Xmgr_GrayZpolyscan #define ZBUFFER #define GOURAUD #include "MGRpolyscan.h" #define NAME Xmgr_Gpolyscan #define GOURAUD #define COLOR #include "MGRpolyscan.h" #define NAME Xmgr_GZpolyscan #define GOURAUD #define COLOR #define ZBUFFER #include "MGRpolyscan.h" geomview-1.9.5/src/lib/mg/buf/mgbuf.h0000644000175000017500000000177412310110200014243 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef MGBUF_H #define MGBUF_H #define MG_BUFFILE 101 #define MG_BUFFILEPATH 102 #define MG_BUFMEMORY 103 #endif geomview-1.9.5/src/lib/mg/buf/mgbufP.h0000644000175000017500000000621012310110200014351 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef MGBUFP_H #define MGBUFP_H typedef struct { Pt3Coord x, y, z, w; ColorA vcol; int drawnext; } CPoint3; #include "mgbufrender.h" #include "mgbufrender24.h" /*****************************************************************************/ #define MGX_NULL 0 #define MGX_END 0 #define MGX_BGNLINE 1 #define MGX_BGNPOLY 2 #define MGX_BGNEPOLY 3 #define MGX_BGNSLINE 4 #define MGX_BGNSPOLY 5 #define MGX_BGNSEPOLY 6 #define MGX_VERTEX 7 #define MGX_CVERTEX 8 #define MGX_COLOR 9 #define MGX_ECOLOR 10 #define PRIM_LINE 1 #define PRIM_POLYGON 2 #define PRIM_EPOLYGON 3 #define PRIM_SLINE 4 /* smooth shaded primitives */ #define PRIM_SPOLYGON 5 #define PRIM_SEPOLYGON 6 #define PRIM_INVIS 7 /*****************************************************************************/ typedef struct _mgbufprim { int mykind; /* kind of primitive */ int index; /* index into array of vertices */ int numvts; /* number of vertices */ float depth; /* z value for sorting (at least for now) */ int color[3]; /* rgb color of polygon */ int ecolor[3]; /* edge color of polygon */ int ewidth; /* edge width */ } mgbufprim; /*****************************************************************************/ typedef struct mgbufcontext { struct mgcontext mgctx; /* The mgcontext */ FILE *file; char filepath[280]; unsigned char *buf; float *zbuf; int xsize, ysize; float zrange; int znudge; /* znudge for drawing lines closer */ float znudgeby; /* how much of a nudge ? */ long znear, zfar; /* Current Z-buffer limits */ vvec room; /* Scratch space */ int pvertnum; /* number of vertices */ vvec pverts; /* Primitve vertices */ int sizelock; /* for prohibiting size change from within mg when the cam window is part of a larger hierarchy of windows as with Widgets */ int born; } mgbufcontext; #define MAXZNUDGE 8 /* Max depth of mgbuf_closer()/farther() */ #define _mgbufc ((mgbufcontext*)_mgc) void BUFmg_add(int primtype, int numdata, void *data, void *cdata); void mgbuf_init_zrange(); int Xmgr_primclip(mgbufprim *aprim); #endif geomview-1.9.5/src/lib/mg/buf/mgbufrender24.h0000644000175000017500000000520612310110200015603 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Author: Timothy Rowley */ #ifndef MGBUFRENDER24 #define MGBUFRENDER24 void Xmgr_24fullinit(int rmask, int gmask, int bmask); void Xmgr_24clear(unsigned char *buf, float *zbuf, int zwidth, int width, int height, int *color, int flag, int fullclear, int xmin, int ymin, int xmax, int ymax); void Xmgr_24poly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color); void Xmgr_24polyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_24line(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p1, CPoint3 *p2, int lwidth, int *color); void Xmgr_24Zpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color); void Xmgr_24Zpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_24GZpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_24Gpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_24Zline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p1, CPoint3 *p2, int lwidth, int *color); void Xmgr_24GZline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p1, CPoint3 *p2, int lwidth, int *color); void Xmgr_24GZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy); void Xmgr_24Gpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy); #endif geomview-1.9.5/src/lib/mg/buf/mgbufrender.h0000644000175000017500000000656612310110200015447 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Author: Timothy Rowley */ #ifndef MGBUFRENDER #define MGBUFRENDER typedef struct { int init; int P1x, P1r, P1g, P1b, P2x, P2r, P2g, P2b; double P1z, P2z; } endPoint; #define ABS(a) (((a)<0) ? -(a) : (a)) #define SGN(a) (((a)<0) ? -1 : 1) #ifdef MAX #undef MAX #endif #define MAX(a,b) (((a)<(b)) ? b : a) #ifdef MIN #undef MIN #endif #define MIN(a,b) (((a)<(b)) ? a : b) void Xmgr_gradWrapper(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p0, CPoint3 *p1, int lwidth, void (*flat)(unsigned char *, float *, int, int, int, CPoint3 *, CPoint3 *, int, int *), void (*smooth)(unsigned char *, float *, int, int, int, CPoint3 *, CPoint3 *, int, int *)); void oldXmgr_gradWrapper(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p0, CPoint3 *p1, int lwidth, void (*flat)(unsigned char *, float *, int, int, int, int, int, float, int, int, float, int, int *), void (*smooth)(unsigned char *, float *, int, int, int, CPoint3 *, CPoint3 *, int)); void Xmgr_polyscan(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color, endPoint *mug, void (*scanfunc)(unsigned char *, float *, int, int, int, int, int, int *, endPoint *)); void Xmgr_Zpolyscan(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color, endPoint *mug, void (*scanfunc)(unsigned char *, float *, int, int, int, int, int, int *, endPoint *)); void Xmgr_Graypolyscan(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color, endPoint *mug, void (*scanfunc)(unsigned char *, float *, int, int, int, int, int, int *, endPoint *)); void Xmgr_GrayZpolyscan(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color, endPoint *mug, void (*scanfunc)(unsigned char *, float *, int, int, int, int, int, int *, endPoint *)); void Xmgr_Gpolyscan(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color, endPoint *mug, void (*scanfunc)(unsigned char *, float *, int, int, int, int, int, int *, endPoint *)); void Xmgr_GZpolyscan(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color, endPoint *mug, void (*scanfunc)(unsigned char *, float *, int, int, int, int, int, int *, endPoint *)); #endif geomview-1.9.5/src/lib/mg/buf/mgbufwindows.h0000644000175000017500000000161012310110200015643 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ geomview-1.9.5/src/lib/mg/buf/MGRdolines.h0000644000175000017500000000657412310110200015151 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* needed stuff: NAME: name of function GOURAUD: defined for smooth shade ZBUFFER: defined for z-buffer code COLOR: define for color */ #if defined(ZBUFFER) #define ZCODE(x) x #else #define ZCODE(x) #endif #ifdef GOURAUD #ifdef COLOR #define GCODE(x) #define CCODE(x) x #else #define GCODE(x) x #define CCODE(x) #endif #define CGCODE(x) x #else #define CCODE(x) #define GCODE(x) #define CGCODE(x) #endif static void NAME (unsigned char *buf, float *zbuf, int zwidth, int width, int height, int miny, int maxy, int *color, endPoint *mug) { #ifdef PTR_INIT PTR_TYPE *ptr; /* pixel pointers */ #endif int i, x2; /* dithering junk */ int y, x1; /* current line */ #ifdef ZBUFFER float *zptr; /* zbuff pointers */ double z, z2, zdelta; /* z-buffer stuff */ #endif #if defined(ZBUFFER) || defined(GOURAUD) int dx; #endif #ifdef GOURAUD int sr, er, dr, r; #ifdef COLOR int sg, sb, eg, eb, dg, db, g, b; #endif #endif #ifdef VARIABLES VARIABLES #endif #ifdef INITCODE INITCODE #endif for(y = miny; y <= maxy; y++) { x1 = mug[y].P1x; ZCODE(z = mug[y].P1z;) CGCODE(r = mug[y].P1r;) CCODE(g = mug[y].P1g; b = mug[y].P1b;) x2 = mug[y].P2x; ZCODE(z2 = mug[y].P2z;) CGCODE(dr = mug[y].P2r-r;) CCODE(dg = mug[y].P2g-g; db = mug[y].P2b-b;) #if defined(ZBUFFER) || defined(GOURAUD) dx = x2-x1; #endif ZCODE(zdelta = dx ? (z2-z)/dx : 0;) CGCODE(er = (dr << 1) - dx; sr = SGN(dr); dr = abs(dr)<<1;) CCODE(eg = (dg << 1) - dx; eb = (db << 1) - dx; sg = SGN(dg); dg = abs(dg)<<1; sb = SGN(db); db = abs(db)<<1;) CGCODE(dx <<= 1;) #ifdef YCODE YCODE #endif #ifdef PTR_INIT ptr = PTR_INIT; #endif ZCODE(zptr = zbuf+zwidth*y+x1;) for (i=x1; i<=x2; i++ #ifdef ZBUFFER , z+=zdelta, zptr++ #endif #ifdef PTR_INIT , ptr++ #endif ) { #ifdef ZBUFFER if (z < *zptr) { DOPIXEL *zptr = z; } #else DOPIXEL #endif #ifdef GOURAUD if (dx) { while (er>0) { r += sr; er -= dx; } #ifdef COLOR while (eg>0) { g += sg; eg -= dx; } while (eb>0) { b += sb; eb -= dx; } #endif } #endif CGCODE(er += dr;) CCODE(eg += dg; eb += db;) } } } #undef ZCODE #undef CCODE #undef GCODE #undef CGCODE #undef NAME #undef ZBUFFER #undef GOURAUD #undef COLOR #undef PTR_TYPE #undef PTR_INIT #undef VARIABLES #undef INITCODE #undef YCODE #undef DOPIXEL geomview-1.9.5/src/lib/mg/buf/MGRline.h0000644000175000017500000001537412310110200014441 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if defined(ZBUFFER) #define ZCODE(x) x #else #define ZCODE(x) #endif #ifdef GOURAUD #ifdef COLOR #define GCODE(x) #define CCODE(x) x #else #define GCODE(x) x #define CCODE(x) #endif #define CGCODE(x) x #else #define CCODE(x) #define GCODE(x) #define CGCODE(x) #endif static void WIDENAME (unsigned char *buf, float *zbuf, int zwidth, int width, int height, int x1, int y1, #ifdef ZBUFFER double z1, #endif #ifdef GOURAUD int r1, #ifdef COLOR int g1, int b1, #endif #endif int x2, int y2, #ifdef ZBUFFER double z2, #endif #ifdef GOURAUD int r2, #ifdef COLOR int g2, int b2, #endif #endif int lwidth, int *color) { int d, x, y, ax, ay, sx, dx, dy; int i, end; #ifdef ZBUFFER double delta=0, z; #endif #ifdef GOURAUD double r, rdelta; #ifdef COLOR double g, b, gdelta, bdelta; #endif #endif #if defined(ZBUFFER) || defined(GOURAUD) int total; #endif #ifdef PTR_INIT PTR_TYPE *ptr = (PTR_TYPE *)buf; int ptrIncr = PTR_INCR; #endif #ifdef VARIABLES VARIABLES #endif dx = x2-x1; dy = y2-y1; ax = ABS(dx)<<1; ay = ABS(dy)<<1; sx = SGN(dx); x = x1; y = y1; ZCODE(z = z1;) CGCODE(r = r1;) CCODE(g = g1; b = b1;) #if defined(ZBUFFER) || defined(GOURAUD) total = ABS(dx)+ABS(dy); if(total == 0) total = 1; #endif ZCODE(delta = (z2-z1)/total;) CGCODE(rdelta = (r2-r1)/(double)total;) CCODE(gdelta = (g2-g1)/(double)total; bdelta = (b2-b1)/(double)total;) if (ax>ay) { /* x dominant */ d = ay-(ax>>1); for (;;) { for (i=MAX(0,y-lwidth/2), end=MIN(height,y-lwidth/2+lwidth); i=0) { y++; ZCODE(z += delta;) CGCODE(r += rdelta;) CCODE(g += gdelta; b += bdelta;) d -= ax; } x += sx; ZCODE(z += delta;) CGCODE(r += rdelta;) CCODE(g += gdelta; b += bdelta;) d += ay; } } else { /* y dominant */ d = ax-(ay>>1); for (;;) { for (i=MAX(0,x-lwidth/2), end=MIN(zwidth,x-lwidth/2+lwidth); i=0) { x += sx; ZCODE(z += delta;) CGCODE(r += rdelta;) CCODE(g += gdelta; b += bdelta;) d -= ay; } y++; ZCODE(z += delta;) CGCODE(r += rdelta;) CCODE(g += gdelta; b += bdelta;) d += ax; } } } void NAME (unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p1, CPoint3 *p2, int lwidth, int *color) { int d, x, y, ax, ay, sx, dx, dy; int x1, y1, x2, y2; #ifdef PTR_INIT PTR_TYPE *ptr; int ptrIncr = PTR_INCR; #endif #ifdef ZBUFFER float *zptr; double delta=0, z, z1, z2; #endif #ifdef GOURAUD int r1, r2; double r, rdelta; #ifdef COLOR int g1, g2, b1, b2; double g, b, gdelta, bdelta; #endif #endif #if defined(ZBUFFER) || defined(GOURAUD) int total; #endif #ifdef VARIABLES VARIABLES #endif if (p2->yy) { x1 = p2->x; y1 = p2->y; x2 = p1->x; y2 = p1->y; ZCODE(z1 = p2->z - _mgc->zfnudge; z2 = p1->z - _mgc->zfnudge;) CGCODE(r1 = 255*p2->vcol.r; r2 = 255*p1->vcol.r;) CCODE(g1 = 255*p2->vcol.g; b1 = 255*p2->vcol.b; g2 = 255*p1->vcol.g; b2 = 255*p1->vcol.b;) } else { x1 = p1->x; y1 = p1->y; x2 = p2->x; y2 = p2->y; ZCODE(z1 = p1->z - _mgc->zfnudge; z2 = p2->z - _mgc->zfnudge;) CGCODE(r1 = 255*p1->vcol.r; r2 = 255*p2->vcol.r;) CCODE(g1 = 255*p1->vcol.g; b1 = 255*p1->vcol.b; g2 = 255*p2->vcol.g; b2 = 255*p2->vcol.b;) } if (lwidth > 1) { WIDENAME (buf, zbuf, zwidth, width, height, x1, y1, #ifdef ZBUFFER z1, #endif #ifdef GOURAUD r1, #ifdef COLOR g1, b1, #endif #endif x2, y2, #ifdef ZBUFFER z2, #endif #ifdef GOURAUD r2, #ifdef COLOR g2, b2, #endif #endif lwidth, color); return; } #ifdef PTR_INIT ptr = PTR_INIT; #endif ZCODE(zptr = zbuf+y1*zwidth+x1;) dx = x2-x1; dy = y2-y1; ax = ABS(dx)<<1; ay = ABS(dy)<<1; sx = SGN(dx); x = x1; y = y1; ZCODE(z = z1;) CGCODE(r = r1;) CCODE(g = g1; b = b1;) #if defined(ZBUFFER) || defined(GOURAUD) total = ABS(dx)+ABS(dy); if(total == 0) total = 1; #endif ZCODE(delta = (z2-z1)/total;) CGCODE(rdelta = (r2-r1)/(double)total;) CCODE(gdelta = (g2-g1)/(double)total; bdelta = (b2-b1)/(double)total;) if (ax>ay) { /* x dominant */ d = ay-(ax>>1); for (;;) { #ifdef ZBUFFER if (z<*zptr) { DOPIXEL *zptr = z; } #else DOPIXEL #endif if (x==x2) break; if (d>=0) { y++; ZCODE(z += delta;) CGCODE(r += rdelta;) CCODE(g += gdelta; b += bdelta;) #ifdef PTR_INIT ptr += ptrIncr; #endif ZCODE(zptr += zwidth;) d -= ax; } x += sx; ZCODE(z += delta;) CGCODE(r += rdelta;) CCODE(g += gdelta; b += bdelta;) #ifdef PTR_INIT ptr += sx; #endif ZCODE(zptr += sx;) d += ay; } } else { /* y dominant */ d = ax-(ay>>1); for (;;) { #ifdef ZBUFFER if (z<*zptr) { DOPIXEL ZCODE(*zptr = z;) } #else DOPIXEL #endif if (y==y2) break; if (d>=0) { x += sx; ZCODE(z += delta;) CGCODE(r += rdelta;) CCODE(g += gdelta; b += bdelta;) #ifdef PTR_INIT ptr += sx; #endif ZCODE(zptr += sx;) d -= ay; } y++; ZCODE(z += delta;) CGCODE(r += rdelta;) CCODE(g += gdelta; b += bdelta;) #ifdef PTR_INIT ptr += ptrIncr; #endif ZCODE(zptr += zwidth;) d += ax; } } } #undef ZCODE #undef CCODE #undef GCODE #undef CGCODE #undef WIDENAME #undef NAME #undef ZBUFFER #undef GOURAUD #undef COLOR #undef PTR_TYPE #undef PTR_INIT #undef PTR_INCR #undef VARIABLES #undef DOPIXEL #undef WIDEXDOPIXEL #undef WIDEYDOPIXEL geomview-1.9.5/src/lib/mg/buf/MGRpolyscan.h0000644000175000017500000001137012310110200015332 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* needed stuff: NAME: name of function GOURAUD: defined for smooth shade ZBUFFER: defined for z-buffer code COLOR: define for color */ #define RLUM 0.299 #define GLUM 0.587 #define BLUM 0.144 #if defined(ZBUFFER) #define ZCODE(x) x #else #define ZCODE(x) #endif #ifdef GOURAUD #ifdef COLOR #define GCODE(x) #define CCODE(x) x #else #define GCODE(x) x #define CCODE(x) #endif #define CGCODE(x) x #else #define CCODE(x) #define GCODE(x) #define CGCODE(x) #endif void NAME (unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color, endPoint *mug, void (*scanfunc)(unsigned char *, float *, int, int, int, int, int, int *, endPoint *)) { int x,y,dx,dy,d; /* bresenham engine */ int miny = INT_MAX, maxy = INT_MIN; /* y-bounds */ int i,j,x1,x2,y1,y2; /* indices */ int sf, si, sr, inc, dec; #ifdef ZBUFFER double z, z1, z2, delta; #endif #ifdef GOURAUD double r, dr; int r1, r2; #ifdef COLOR double g, b, dg, db; int g1, g2, b1, b2; #endif #endif for (i=0; i(%3d %3d) (%d,%d,%d)->(%d,%d,%d)\n", i, j, x1, y1, x2, y2, r1, g1, b1, r2, g2, b2);) #endif dx = x2-x1; dy = y2-y1; if (dy == 0) { CGCODE(dr = 0;) CCODE(dg = db = 0;) ZCODE(delta = 0); } else { CGCODE(dr = (r2-r1)/(double)(dy);) CCODE(dg = (g2-g1)/(double)(dy); db = (b2-b1)/(double)(dy);) ZCODE(delta = (z2-z1)/(double)(dy);) } x = x1; y = y1; CGCODE(r = r1+dr;) CCODE(g = g1+dg; b = b1+db;) ZCODE(z = z1+delta;) if (dy) { if (dx >= 0) si = dx/dy; else si = (dx/dy) + (((dx % dy) == 0) ? 0 : -1); } else si = 0; x = x1+si; sf = dx - si*dy; sr = 2*sf-dy; inc = sf; dec = sf-dy; for (y=y1+1; y<=y2; y++) { #if 0 CCODE(fprintf(stderr, "\t%3d %3d (%lf %lf %lf)\n", x, y, r, g, b);) #endif if(mug[y].init) { if (x < mug[y].P1x) { mug[y].P1x = x; ZCODE(mug[y].P1z = z;) CGCODE(mug[y].P1r = r;) CCODE(mug[y].P1g = g; mug[y].P1b = b;) } else if (x > mug[y].P2x) { mug[y].P2x = x; ZCODE(mug[y].P2z = z;) CGCODE(mug[y].P2r = r;) CCODE(mug[y].P2g = g; mug[y].P2b = b;) } } else { mug[y].init = 1; mug[y].P1x = x; mug[y].P2x = x; ZCODE(mug[y].P1z = z; mug[y].P2z = z;) CGCODE(mug[y].P1r = r; mug[y].P2r = r;) CCODE(mug[y].P1g = g; mug[y].P1b = b; mug[y].P2g = g; mug[y].P2b = b;) } ZCODE(z += delta;) CGCODE(r += dr;) CCODE(g += dg; b += db;) if (sr >= 0) { x += si+1; sr += dec; } else { x += si; sr += inc; } } } miny++; for (i=miny; (i<=maxy) && ( mug[i].P2x == mug[i].P1x); i++) miny++; for (i=maxy; (i>=miny) && ( mug[i].P2x == mug[i].P1x); i--) maxy--; for (i=miny; i<=maxy; i++) mug[i].P1x++; scanfunc(buf, zbuf, zwidth, width, height, miny, maxy, color, mug); } /* Now clear out all the definitions */ #undef COLOR #undef ZBUFFER #undef NAME #undef GOURAUD #undef ZCODE #undef CGCODE #undef GCODE #undef CCODE geomview-1.9.5/src/lib/mg/buf/Headers0000644000175000017500000000014312310110200014255 00000000000000MGRdolines.h MGRline.h MGRpolyscan.h mgbuf.h mgbufP.h mgbufrender.h mgbufrender24.h mgbufwindows.h geomview-1.9.5/src/lib/mg/common/0000755000175000017500000000000012310165603013576 500000000000000geomview-1.9.5/src/lib/mg/common/Makefile.in0000644000175000017500000004620612310165554015600 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/mg/common DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libmgcommon_la_LIBADD = am_libmgcommon_la_OBJECTS = mg.lo mgshade.lo mgtexture.lo libmgcommon_la_OBJECTS = $(am_libmgcommon_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libmgcommon_la_SOURCES) DIST_SOURCES = $(libmgcommon_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgcommon.la libmgcommon_la_SOURCES = \ mg.c mgshade.c mgtexture.c \ mg.h mgP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/mg/common/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/mg/common/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libmgcommon.la: $(libmgcommon_la_OBJECTS) $(libmgcommon_la_DEPENDENCIES) $(EXTRA_libmgcommon_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libmgcommon_la_OBJECTS) $(libmgcommon_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgshade.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgtexture.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/mg/common/Makefile.am0000644000175000017500000000024512310110200015532 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgcommon.la libmgcommon_la_SOURCES = \ mg.c mgshade.c mgtexture.c \ mg.h mgP.h geomview-1.9.5/src/lib/mg/common/mg.c0000644000175000017500000010251712310110200014252 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * $Id: mg.c,v 1.20 2010/03/14 11:45:43 rotdrop Exp $ * Machine-independent part of MG library. * Initialization, common code, and some mgcontext maintenance. * * These are the common versions of MG functions (see mg.doc for * details). The header comment for each common function includes an * entry labeled "DEVICE USE" which describes the way in which the * device version of the same function is expected to call the common * version. * * See mg.doc for more information about these functions. */ #include "mgP.h" extern struct mgfuncs mgnullfuncs; /* Forward */ mgcontext *_mgc = NULL; mgcontext *_mgclist = NULL; static struct mgastk *mgafree = NULL; static struct mgastk *mgatfree = NULL; /* tagged free-list */ static struct mgxstk *mgxfree = NULL; static struct mgtxstk *mgtxfree = NULL; #define MGC _mgc /* * mgcurrentcontext() returns a pointer to the currently-selected context, * for use in a later call to mgctxselect(). * Returns NULL if no context is selected. */ mgcontext * mgcurrentcontext(void) { return _mgc; } /*----------------------------------------------------------------------- * Function: mgdevice_NULL * Description: select the NULL device as the current MG device * Returns: 1 * Author: slevy (doc by mbp) * Date: Thu Sep 19 10:36:21 1991 * Notes: */ int mgdevice_NULL(void) { if (MGC != NULL && MGC->devno != MGD_NULL) MGC = NULL; _mgf = mgnullfuncs; return 1; } /*----------------------------------------------------------------------- * Function: mg_newcontext * Description: initialize an mgcontext structure * Args: mgc: ptr to context structure to initialize * Returns: mgc * Author: slevy (doc by mbp) * Date: Wed Sep 18 16:42:52 1991 * DEVICE USE: required --- mgxx_ctxcreate() should call this immediately * after allocating a new mgcontext structure. * Notes: Further device-specific initialization is normally required. */ mgcontext *mg_newcontext(mgcontext *mgc) { memset((char *)mgc, 0, sizeof(*mgc)); RefInit((Ref *)mgc, MGCONTEXTMAGIC); mgc->shown = 1; mgc->win = WnCreate(WN_NAME, "minnegraphics", WN_END); mgc->cam = CamCreate( CAM_END ); mgc->background.r = 0.0; mgc->background.g = 0.0; mgc->background.b = 0.0; mgc->background.a = 1.0; mgc->bgimage = NULL; /* initialize appearance stack */ { struct mgastk *ma; mgc->astk = ma = OOGLNewE(struct mgastk, "mg appearance stack"); memset((char *)ma, 0, sizeof(*ma)); /* Sets next = NULL, *_seq = 0 */ MtDefault(&(ma->mat)); LmDefault(&(ma->lighting)); ApDefault(&(ma->ap)); ma->ap.mat = &(ma->mat); ma->ap.lighting = &(ma->lighting); ma->flags |= MGASTK_ACTIVE; RefInit((Ref *)ma, 'a'); } /* initialize transform stack */ { struct mgxstk *mx; mgc->xstk = mx = OOGLNewE(struct mgxstk, "mg transform stack"); mx->next = NULL; TmIdentity(mx->T); mx->xfm_seq = mx->hasinv = 0; } /* initialize texture transform stack */ { mgc->txstk = OOGLNewE(struct mgtxstk, "mg texture transform stack"); mgc->txstk->next = NULL; TmIdentity(mgc->txstk->T); } mgc->opts = MGO_HIDDEN|MGO_DOUBLEBUFFER; mgc->devno = MGD_NODEV; /* Device-specific init should change this */ TmIdentity(mgc->W2C); TmIdentity(mgc->C2W); TmIdentity(mgc->W2S); TmIdentity(mgc->S2W); TmIdentity(mgc->O2S); TmIdentity(mgc->S2O); mgc->space = TM_EUCLIDEAN; mgc->NDctx = NULL; VVINIT(mgc->point, HPoint3, 7); mgc->winchange = NULL; mgc->winchangeinfo = NULL; mgc->ap_min_tag = mgc->mat_min_tag = mgc->light_min_tag = ~0; mgc->next = _mgclist; _mgclist = mgc; return mgc; } int mg_appearancebits( Appearance *ap, int mergeflag, int *valid, int *flag ) { Appearance *dst; if (!_mgc->astk) { OOGLError(0,"mg_appearanceflags: no global context"); return 0; } dst = &(_mgc->astk->ap); /* Mask of fields to change in dst */ if (ap == NULL) { *valid = dst->valid; *flag = dst->flag; mergeflag = MG_MERGE; } else { *valid = ap->valid; *flag = ap->flag; } if (mergeflag == MG_MERGE) { *valid &= ~dst->override; } return 1; } /*----------------------------------------------------------------------- * Function: mg_pushappearance * Description: push the context's appearance stack * Returns: nothing * Author: slevy (doc by mbp) * Date: Thu Sep 19 10:37:55 1991 * Notes: * DEVICE USE: required --- all devices must maintain this stack */ int mg_pushappearance(void) { struct mgastk *ma; if (mgafree) { ma = mgafree; mgafree = ma->next; } else { ma = OOGLNew(struct mgastk); } *ma = *_mgc->astk; ma->flags &= ~MGASTK_TAGGED; /* active and shader flags are inherited */ RefInit((Ref *)ma, 'a'); ma->next = _mgc->astk; LmCopy(&_mgc->astk->lighting, &ma->lighting); ma->ap.lighting = &(ma->lighting); ma->ap.mat = &(ma->mat); ma->ap.tex = REFGET(Texture, ma->ap.tex); _mgc->astk = ma; return 0; } /* Three support function to support BSP-trees with multiple * appearances: in the worst case every tree-node could have its own * appearance; this cannot be efficiently modelled with the * appearance stack approach. */ /* Make the current appearance persistent. */ const void *mg_tagappearance(void) { struct mgastk *astk = _mgc->astk; astk->flags |= MGASTK_TAGGED; RefIncr((Ref *)astk); /* update excluded sequence region */ if ((unsigned)_mgc->ap_min_tag > (unsigned)astk->ap_seq) { _mgc->ap_min_tag = astk->ap_seq; } if (_mgc->ap_max_tag < astk->ap_seq) { _mgc->ap_max_tag = astk->ap_seq; } if ((unsigned)_mgc->mat_min_tag > (unsigned)astk->mat_seq) { _mgc->mat_min_tag = astk->mat_seq; } if (_mgc->mat_max_tag < astk->mat_seq) { _mgc->mat_max_tag = astk->mat_seq; } if ((unsigned)_mgc->light_min_tag > (unsigned)astk->light_seq) { _mgc->light_min_tag = astk->light_seq; } if (_mgc->light_max_tag < astk->light_seq) { _mgc->light_max_tag = astk->light_seq; } return _mgc->astk; } /* Un-tag the appearance described by "tag" (i.e. undo its * persistency). This function should perform a clean-up, i.e. release * all resources associated with the corresponding appearance. */ void mg_untagappearance(const void *tag) { struct mgastk *astk = (struct mgastk *)tag, *pos; struct mgcontext *ctx = astk->tag_ctx; RefDecr((Ref *)astk); if (RefCount((Ref *)astk) > 1) { return; } if (!(astk->flags & MGASTK_ACTIVE)) { TxDelete(astk->ap.tex); astk->ap.tex = NULL; LmDeleteLights(&astk->lighting); /* Move to free-list if not active */ if (ctx) { if (ctx->ap_tagged == astk) { ctx->ap_tagged = astk->next; if (ctx->ap_tagged == NULL) { ctx->ap_min_tag = ctx->mat_min_tag = ctx->light_min_tag = -1; ctx->ap_max_tag = ctx->mat_max_tag = ctx->light_max_tag = 0; } } else { for (pos = ctx->ap_tagged; pos->next != astk; pos = pos->next); pos->next = astk->next; } } else { if (astk == mgatfree) { mgatfree = astk->next; } else { for (pos = mgatfree; pos->next != astk; pos = pos->next); pos->next = astk->next; } } astk->tag_ctx = NULL; astk->next = mgafree; mgafree = astk; } astk->flags &= ~MGASTK_TAGGED; } /* Insert a persistent apearance into the current appearance model */ void mg_taggedappearance(const void *tag) { struct mgastk *astk = (struct mgastk *)tag; mg_setappearance(&astk->ap, 0); } /*----------------------------------------------------------------------- * Function: mg_popappearance * Description: pop the context's appearance stack * Returns: nothing * Author: slevy (doc by mbp) * Date: Thu Sep 19 10:51:12 1991 * Notes: * DEVICE USE: required --- all devices must maintain this stack */ int mg_popappearance(void) { struct mgastk *mp; struct mgcontext *ctx = _mgc; mp = ctx->astk->next; if (mp == NULL) { return -1; } if (ctx->astk->ap_seq != mp->ap_seq) ctx->changed |= MC_AP; if (ctx->astk->mat_seq != mp->mat_seq) ctx->changed |= MC_MAT; if (ctx->astk->light_seq != mp->light_seq) ctx->changed |= MC_LIGHT; ctx->astk->flags &= ~MGASTK_ACTIVE; if (ctx->astk->flags & MGASTK_TAGGED) { ctx->astk->next = ctx->ap_tagged; ctx->ap_tagged = ctx->astk; ctx->ap_tagged->tag_ctx = ctx; ctx->astk = mp; } else { TxDelete(ctx->astk->ap.tex); ctx->astk->ap.tex = NULL; LmDeleteLights(&ctx->astk->lighting); ctx->astk->next = mgafree; mgafree = ctx->astk; ctx->astk = mp; } return 0; } /* * Transform light(s) to global coordinate system, if they aren't already. * Transforms them in place. */ void mg_globallights( LmLighting *lm, int worldbegin ) { LtLight *lt, **lp; HPoint3 oldpos; int i; for (i = 0, lp = &lm->lights[0]; i < AP_MAXLIGHTS && *lp != NULL; i++, lp++) { lt = *lp; oldpos = lt->globalposition; switch(lt->location) { case LTF_GLOBAL: lt->globalposition = lt->position; break; case LTF_CAMERA: HPt3Transform(_mgc->C2W, <->position, <->globalposition); break; case LTF_LOCAL: HPt3Transform(_mgc->xstk->T, <->position, <->position); lt->globalposition = lt->position; lt->location = LTF_GLOBAL; break; } if (memcmp(&oldpos, <->globalposition, sizeof(HPoint3)) != 0) lt->changed = 1; } } /*----------------------------------------------------------------------- * Function: mg_setappearance * Description: Operate on appearance in current context * Args: *ap: the appearance to assign or merge * mergeflag: MG_MERGE or MG_SET * Returns: ptr to current appearance * Author: slevy (doc by mbp) * Date: Thu Sep 19 10:59:25 1991 * Notes: Modifies the context's current apperance. Does not * modify *ap. * mergeflag = MG_MERGE: merge *ap into current appearance * mergeflag = MG_SET: set current appearance to *ap * DEVICE USE: required --- when ??? * * Can we modify this to do some of the flag setting * than mggl_setappearance currently does??? This * seems common to all devices. */ const Appearance * mg_setappearance(const Appearance *ap, int mergeflag) { struct mgastk *ma = _mgc->astk; if (mergeflag == MG_MERGE) { ApMerge(ap, &ma->ap, 1); /* Merge, in place */ ma->changed |= MC_AP; /* ma->ap = *nap; */ /* <- not necessary, ApMerge(a, b) returns b * unless b would be NULL on entry, which canot be the case here. */ /* Assign mat and light too? */ } else { /* Kludge: map->ap->tex is only a pointer, calling copy would * override its contents (now that TxCopy() has been * implemented). So get rid of ma->ap->tex before calling * ApCopyShared(). This is ok, because we always call REFGET(tex) * before hanging any texture into our appearance stack, so if * ap->tex == ma->ap.tex then the texture won't actually be * deleted. */ TxDelete(ma->ap.tex); ma->ap.tex = NULL; ApCopyShared(ap, &ma->ap); ma->changed |= MC_AP | MC_MAT | MC_LIGHT; } if (ap->lighting) { mg_globallights(&ma->lighting, 0); } if (ap->tex) { ap->tex->flags |= TXF_USED; } return &_mgc->astk->ap; } /*----------------------------------------------------------------------- * Function: mg_getappearance * Description: get the current appearance * Returns: ptr to the current appearance * Author: slevy (doc by mbp) * Date: Thu Sep 19 11:08:06 1991 * DEVICE USE: optional * Notes: The pointer returned points to the context's private copy * of the appearance. Don't modify it! * * Should we allow this? Or should this copy the appearance * to an address passed as an argument ??? */ const Appearance *mg_getappearance(void) { return &_mgc->astk->ap; } /*----------------------------------------------------------------------- * Function: mg_setcamera * Description: Set the context's camera * Args: *cam: the camera to use * Returns: nothing * Author: slevy (doc by mbp) * Date: Thu Sep 19 11:16:46 1991 * Notes: The context does not maintain an internal copy of the * camera. Only the pointer is stored. * DEVICE USE: required */ int mg_setcamera( Camera *cam ) { RefIncr((Ref *)cam); /* Incr count first: allow setting same camera */ CamDelete(_mgc->cam); _mgc->cam = cam; _mgc->changed |= MC_CAM; return 0; } /*----------------------------------------------------------------------- * Function: mg_ctxset * Description: set some attributes in the current context * Args: attr, ...: list of attribute-value pairs, terminated * by MG_END * Returns: -1 on error 0 on success * Author: slevy (doc by mbp) * Date: Thu Sep 19 11:22:28 1991 * Notes: DO NOT CALL THIS (yet)! It currently does nothing. * DEVICE USE: forbidden --- devices have their own mgxx_ctxset() * * This needs to be modified to work as the NULL device. * Use by other devices may never be needed. */ int mg_ctxset( int attr, ... /*, MG_END */ ) { return 0; } /*----------------------------------------------------------------------- * Function: mg_ctxget * Description: get an attribute from the current context * Args: attr: the attribute to get * *valuep: place to write attr's value * Returns: ??? * Author: slevy (doc by mbp) * Date: Thu Sep 19 11:26:49 1991 * Notes: DO NOT CALL THIS (yet)! It currently does nothing. * DEVICE USE: forbidden --- devices have their own mgxx_ctxget() * * This needs to be modified to work as the NULL device. * Use by other devices may never be needed. */ int mg_ctxget( int attr, void *valuep ) { return -1; } /*----------------------------------------------------------------------- * Function: mg_feature * Description: determine whether the NULL device has a particular feature * Args: feature: feature to test for * Returns: -1 (means feature is not present) * Author: slevy (doc by mbp) * Date: Thu Sep 19 11:29:51 1991 * Notes: NULL device is rather featureless at present, :-) * DEVICE USE: forbidden --- devices have their own mgxx_feature() */ int mg_feature( int feature ) { return -1; } /*----------------------------------------------------------------------- * Function: mg_ctxcreate * Description: create a new MG context for the NULL device * Args: a1, ...: list of attribute-value pairs * Returns: ptr to new context * Author: mbp * Date: Thu Sep 19 11:35:42 1991 * Notes: DO NOT CALL THIS --- it currently does nothing * needs to be modified to work with NULL device ??? * DEVICE USE: forbidden --- devices have their own mgxx_ctxcreate(() */ mgcontext * mg_ctxcreate( int a1, ... ) { return NULL; } /*----------------------------------------------------------------------- * Function: mg_ctxdelete * Description: delete an MG context for the NULL device * Args: *ctx: ptr to context to delete * Returns: nothing * Author: mbp * Date: Thu Sep 19 11:38:50 1991 * DEVICE USE: Call this to do common stuff after each device has * cleaned up its own data. */ void mg_ctxdelete( mgcontext *ctx ) { struct mgcontext **mp; struct mgastk *astk, *nextastk; struct mgxstk *xstk, *nextxstk; struct mgtxstk *txstk, *nexttxstk; if (ctx == NULL) return; if (ctx->winchange) { (*ctx->winchange)(ctx, ctx->winchangeinfo, MGW_WINDELETE, ctx->win); } for (mp = &_mgclist; *mp != NULL; mp = &(*mp)->next) { if (*mp == ctx) { *mp = ctx->next; break; } } for (xstk = ctx->xstk; xstk != NULL; xstk = nextxstk) { nextxstk = xstk->next; xstk->next = mgxfree; mgxfree = xstk; } for (txstk = ctx->txstk; txstk != NULL; txstk = nexttxstk) { nexttxstk = txstk->next; txstk->next = mgtxfree; mgtxfree = txstk; } for (astk = ctx->astk; astk != NULL; astk = nextastk) { nextastk = astk->next; if (!(astk->flags & MGASTK_TAGGED)) { if (astk->ap.tex != NULL && (nextastk == NULL || astk->ap.tex != nextastk->ap.tex)) { TxDelete(ctx->astk->ap.tex); ctx->astk->ap.tex = NULL; } LmDeleteLights(&astk->lighting); astk->next = mgafree; mgafree = astk; } else { OOGLWarn("Tagged, but active?"); } } /* Move the tagged appearances to the global tagged free-list; the * ap's are moved to the real free list when they are finally * untagged. */ for (astk = ctx->ap_tagged; astk != NULL; astk = nextastk) { nextastk = astk->next; astk->tag_ctx = NULL; astk->flags &= ~MGASTK_ACTIVE; /* should already have been cleared */ astk->next = mgatfree; mgatfree = astk; } /* make sure textures only needed by this context are purged, * otherwise the mg-backends may fail to reload the texture if a new * camera is opened */ ctx->changed |= MC_USED; mg_textureclock(); WnDelete(ctx->win); CamDelete(ctx->cam); /* Free other data here someday XXX */ if (_mgc == ctx) { _mgc = NULL; } OOGLFree(ctx); } /*----------------------------------------------------------------------- * Function: mg_ctxselect * Description: select the current context * Args: *ctx: the context to select * Returns: 0 (why ???) * Author: slevy (doc by mbp) * Date: Thu Sep 19 11:40:15 1991 * DEVICE USE: required --- mgxx_ctxselect() should call this if * the context to switch to if of a different device. * This procedure then does the switch. */ int mg_ctxselect( mgcontext *ctx ) { if (ctx != NULL && _mgf.mg_devno != ctx->devno) { /* * For another device. * Install that device's function pointers, and * call its selectcontext routine. */ (*ctx->devfuncs->mg_setdevice)(); mgctxselect(ctx); } _mgc = ctx; return 0; } /*----------------------------------------------------------------------- * Function: mg_identity * Description: Set the current object xform to the identity * Args: (none) * Returns: nothing * Author: slevy (doc by mbp) * Date: Wed Sep 18 16:46:06 1991 * Notes: Sets the xform on the top of the current context's xform * stack to the identity. Also sets the MC_TRANS bit of * the context's "changed" flag and increment's the current xfm * sequence number. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mg_identity( void ) { TmIdentity(_mgc->xstk->T); _mgc->changed |= MC_TRANS; _mgc->xstk->xfm_seq++; } /*----------------------------------------------------------------------- * Function: mg_settransform * Description: Set the current object xform * Args: T * Returns: nothing * Author: slevy (doc by mbp) * Date: Wed Sep 18 16:46:06 1991 * Notes: Sets the xform on the top of the current context's xform * stack to T. Also sets the MC_TRANS bit of * the context's "changed" flag and increment's the current xfm * sequence number. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mg_settransform( Transform T ) { TmCopy(T, _mgc->xstk->T); _mgc->changed |= MC_TRANS; _mgc->xstk->xfm_seq++; } /*----------------------------------------------------------------------- * Function: mg_gettransform * Description: Get the current object xform * Args: T * Returns: nothing * Author: slevy (doc by mbp) * Date: Wed Sep 18 16:46:06 1991 * Notes: Writes the current object xform, from the top of the * context's xform stack, into T. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mg_gettransform( Transform T ) { TmCopy(_mgc->xstk->T, T); } /*----------------------------------------------------------------------- * Function: mg_transform * Description: premultiply the current object xform by a transform * Args: T: the transform to premultiply by * Returns: nothing * Author: slevy (doc by mbp) * Date: Wed Sep 18 16:46:06 1991 * Notes: If X is the context's current object xform, replaces X * by T X. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mg_transform( Transform T ) { TmConcat(T, _mgc->xstk->T, _mgc->xstk->T); _mgc->changed |= MC_TRANS; _mgc->xstk->xfm_seq++; _mgc->xstk->hasinv = 0; _mgc->has = 0; } /*----------------------------------------------------------------------- * Function: mg_pushtransform * Description: push the context xform stack * Returns: nothing * Author: mbp * Date: Thu Sep 19 12:23:26 1991 * DEVICE USE: optional --- use if device actually uses our stack */ int mg_pushtransform( void ) { struct mgxstk *xfm; if (mgxfree) xfm = mgxfree, mgxfree = xfm->next; else xfm = OOGLNewE(struct mgxstk, "mgpushtransform"); *xfm = *MGC->xstk; xfm->next = MGC->xstk; MGC->xstk = xfm; return 0; } /*----------------------------------------------------------------------- * Function: mg_poptransform * Description: pop the context xform stack * Returns: nothing * Author: mbp * Date: Thu Sep 19 12:23:51 1991 * DEVICE USE: optional --- use if device actually uses our stack */ int mg_poptransform( void ) { struct mgxstk *xfm = MGC->xstk; if (xfm->next == NULL) return -1; MGC->xstk = xfm->next; xfm->next = mgxfree; mgxfree = xfm; _mgc->has = 0; return 0; } /*----------------------------------------------------------------------- * Function: mg_txidentity * Description: Set the current texture xform to the identity * Args: (none) * Returns: nothing * Author: cH * Date: 2007 * Notes: Sets the xform on the top of the current context's texture * xform stack to the identity. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mg_txidentity(void) { TmIdentity(_mgc->txstk->T); } /*----------------------------------------------------------------------- * Function: mg_settransform * Description: Set the current object xform * Args: T * Returns: nothing * Author: cH * Date: 2007 * Notes: Sets the xform on the top of the current context's texture * xform stack to T. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mg_settxtransform(Transform T) { TmCopy(T, _mgc->txstk->T); } /*----------------------------------------------------------------------- * Function: mg_gettxtransform * Description: Get the current object xform * Args: T * Returns: nothing * Author: cH * Date: 2007 * Notes: Writes the current object xform, from the top of the * context's texture xform stack, into T. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mg_gettxtransform(Transform T) { TmCopy(_mgc->txstk->T, T); } /*----------------------------------------------------------------------- * Function: mg_txtransform * Description: premultiply the current object xform by a transform * Args: T: the transform to premultiply by * Returns: nothing * Author: cH * Date: 2007 * Notes: If X is the context's current object texture xform, replaces X * by (T X). * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mg_txtransform(Transform T) { TmConcat(T, _mgc->txstk->T, _mgc->txstk->T); } /*----------------------------------------------------------------------- * Function: mg_pushtxtransform * Description: push the context texture xform stack * Returns: -1 on error, else 0 (error case does not happen) * Author: cH * Date: 2007 * DEVICE USE: optional --- use if device actually uses our stack */ int mg_pushtxtransform( void ) { struct mgtxstk *xfm; if (mgtxfree) { xfm = mgtxfree; mgtxfree = xfm->next; } else { xfm = OOGLNewE(struct mgtxstk, "mgpushtxtransform"); } *xfm = *MGC->txstk; xfm->next = MGC->txstk; MGC->txstk = xfm; return 0; } /*----------------------------------------------------------------------- * Function: mg_poptxtransform * Description: pop the context xform stack * Returns: -1 on error, else 0 * Author: cH * Date: 2007 * DEVICE USE: optional --- use if device actually uses our stack */ int mg_poptxtransform(void) { struct mgtxstk *xfm = MGC->txstk; if (xfm->next == NULL) { return -1; } MGC->txstk = xfm->next; xfm->next = mgtxfree; mgtxfree = xfm; return 0; } void mg_sync( void ) {} void mg_worldbegin( void ) { Transform S, V; WnPosition vp; _mgc->changed |= MC_USED; CamGet(_mgc->cam, CAM_W2C, _mgc->W2C); CamGet(_mgc->cam, CAM_C2W, _mgc->C2W); CamGet(_mgc->cam, CAM_BGCOLOR, &_mgc->background); CamGet(_mgc->cam, CAM_BGIMAGE, &_mgc->bgimage); CamView(_mgc->cam, V); WnGet(_mgc->win, WN_VIEWPORT, &vp); /* V maps world to [-1..1],[-1..1],[-1..1] */ TmTranslate(S, 1., 1., 0.); TmConcat(V, S, V); /* now maps to [0..2],[0..2],[-1..1] */ TmScale(S, .5*(vp.xmax-vp.xmin+1), .5*(vp.ymax-vp.ymin+1), 1.); /* now maps to [0..xsize],[0..ysize],[-1..1] */ TmConcat(V, S, _mgc->W2S); /* final world-to-screen matrix */ TmInvert(_mgc->W2S, _mgc->S2W); /* and screen-to-world */ TmCopy(_mgc->W2S, _mgc->O2S); TmCopy(_mgc->S2W, _mgc->S2O); TmIdentity(_mgc->xstk->T); _mgc->xstk->hasinv = 0; _mgc->has |= HAS_S2O; mg_globallights(&_mgc->astk->lighting, 1); } void mg_findO2S(void) { TmConcat(_mgc->xstk->T, _mgc->W2S, _mgc->O2S); } void mg_findS2O(void) { if (!(_mgc->has & HAS_S2O)) { if (!_mgc->xstk->hasinv) { TmInvert(_mgc->xstk->T, _mgc->xstk->Tinv); _mgc->xstk->hasinv = 1; } TmConcat(_mgc->S2W, _mgc->xstk->Tinv, _mgc->S2O); TmConcat(_mgc->xstk->T, _mgc->W2S, _mgc->O2S); _mgc->has |= HAS_S2O; } } /* Construct a prototype polygonal outline for creating fat points. * Curiously, we can do this independently of the position of the point, * if we operate in homogeneous space. */ void mg_makepoint(void) { int i, n; float t, r, c, s; HPoint3 *p; static float nsides = 3.0; if (!(_mgc->has & HAS_S2O)) mg_findS2O(); if (_mgc->astk->ap.linewidth <= 3) n = 4; else n = nsides * sqrt((double)_mgc->astk->ap.linewidth); vvneeds(&_mgc->point, n); VVCOUNT(_mgc->point) = n; r = .5 * _mgc->astk->ap.linewidth; for (i = 0, p = VVEC(_mgc->point, HPoint3); i < n; i++, p++) { t = 2*M_PI*i/n; s = r * sin(t); c = r * cos(t); p->x = _mgc->S2O[0][0]*c + _mgc->S2O[1][0]*s; p->y = _mgc->S2O[0][1]*c + _mgc->S2O[1][1]*s; p->z = _mgc->S2O[0][2]*c + _mgc->S2O[1][2]*s; p->w = _mgc->S2O[0][3]*c + _mgc->S2O[1][3]*s; } _mgc->has |= HAS_POINT; } void mg_findcam(void) { HPoint3 camZ; /* * Figure out where the camera is in the current coordinate system */ if (!_mgc->xstk->hasinv) { TmInvert(_mgc->xstk->T, _mgc->xstk->Tinv); _mgc->xstk->hasinv = 1; } /* XXX assumes left multiplication: we take C2W[3] as a point! */ HPt3Transform(_mgc->xstk->Tinv, (HPoint3 *)&_mgc->C2W[3][0], &_mgc->cpos); HPt3Transform(_mgc->xstk->Tinv, (HPoint3 *)&_mgc->C2W[2][0], &camZ); camZ.w = Pt3Length(HPoint3Point3(&camZ)); HPt3ToPt3(&camZ, &_mgc->camZ); _mgc->has |= HAS_CPOS; } void mg_worldend( void ) {} void mg_reshapeviewport( void ) {} void mg_polygon( int nv, HPoint3 *v, int nn, Point3 *n, int nc,ColorA *c ) {} void mg_polylist(int np, struct Poly *p, int nv, struct Vertex *v, int plflags) {} void mg_mesh(int wrap,int nu,int nv, HPoint3 *p, Point3 *n, Point3 *nq, ColorA *c, TxST *st, int mflags) {} void mg_line( HPoint3 *p1, HPoint3 *p2 ) {} void mg_polyline( int nv, HPoint3 *verts, int nc, ColorA *colors, int wrapped ) {} void mg_quads(int nquads, HPoint3 *verts, Point3 *normals, ColorA *colors, int qflags) { int i; HPoint3 *v = verts; Point3 *n = normals; ColorA *c = colors; int dn = normals ? 4 : 0; int dc = colors ? 4 : 0; for (i = 0; i < nquads; i++, v += 4, n += dn, c += dc) mgpolygon(4, v, dn, n, dc, c); } void mg_bezier(int du, int dv, int dimn, float *ctrlpts, TxST *txmapst, ColorA *c) { } void mg_bsptree(struct BSPTree *bsptree) { } #define NULLFUNCS \ { \ MGD_NODEV, \ mgdevice_NULL, /* mg_setdevice */ \ mg_feature, /* mg_feature */ \ (mgcontext *(*)(void))mg_ctxcreate, /* mg_ctxcreate */ \ mg_ctxdelete, /* mg_ctxdelete */ \ (int (*)(void))mg_ctxset, /* mg_ctxset */ \ mg_ctxget, /* mg_ctxget */ \ mg_ctxselect, /* mg_ctxselect */ \ mg_sync, /* mg_sync */ \ mg_worldbegin, /* mg_worldbegin */ \ mg_worldend, /* mg_worldend */ \ mg_reshapeviewport, /* mg_reshapeviewport */ \ /* geometry transform */ \ mg_settransform, /* mg_settransform */ \ mg_gettransform, /* mg_gettransform */ \ mg_identity, /* mg_identity */ \ mg_transform, /* mg_transform */ \ mg_pushtransform, /* mg_pushtransform */ \ mg_poptransform, /* mg_poptransform */ \ /* texture transform */ \ mg_settxtransform, /* mg_settxtransform */ \ mg_gettxtransform, /* mg_gettxtransform */ \ mg_txidentity, /* mg_txidentity */ \ mg_txtransform, /* mg_txtransform */ \ mg_pushtxtransform, /* mg_pushtxtransform */ \ mg_poptxtransform, /* mg_poptxtransform */ \ /* appearences */ \ mg_pushappearance, /* mg_pushappearance */ \ mg_popappearance, /* mg_popappearance */ \ mg_setappearance, /* mg_setappearance */ \ mg_getappearance, /* mg_getappearance */ \ /***************/ \ mg_setcamera, /* mg_setcamera */ \ mg_polygon, /* mg_polygon */ \ mg_polylist, /* mg_polylist */ \ mg_mesh, /* mg_mesh */ \ mg_line, /* mg_line */ \ mg_polyline, /* mg_polyline */ \ mg_quads, /* mg_quads */ \ mg_bezier, /* mg_bezier */ \ mg_bsptree, /* mg_bsptree */ \ mg_tagappearance, /* mg_tagappearance */ \ mg_untagappearance, /* mg_untagappearance */ \ mg_taggedappearance, /* mg_taggedappearance */ \ } struct mgfuncs mgnullfuncs = /* mgfuncs for null (default) output device */ NULLFUNCS; struct mgfuncs _mgf = NULLFUNCS; /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mg/common/mgshade.c0000644000175000017500000001461012310110200015253 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Software shaders. * These operate in the mg environment. */ #include "mgP.h" #define DOT(a,b) ((a).x*(b).x + (a).y*(b).y + (a).z*(b).z) #define CCMUL(A,B,C) ((C).r=(A).r*(B).r, (C).g=(A).g*(B).g, (C).b=(A).b*(B).b) #define CCADD(A,B,C) ((C).r=(A).r+(B).r, (C).g=(A).g+(B).g, (C).b=(A).b+(B).b) #define CSCALE(s, A, B) ( (B).r = (A).r * s, (B).g = (A).g * s, (B).b = (A).b * s, (B).a = (A).b * s) #define CCSADD(A,B,s,C) \ ((C).r += (s)*(A).r*(B).r, \ (C).g += (s)*(A).g*(B).g, \ (C).b += (s)*(A).b*(B).b) /* * Transform a vector covariantly */ static void cotransform(Transform Tinv, Point3 *in, Point3 *out) { out->x = Tinv[0][0]*in->x + Tinv[0][1]*in->y + Tinv[0][2]*in->z; out->y = Tinv[1][0]*in->x + Tinv[1][1]*in->y + Tinv[1][2]*in->z; out->z = Tinv[2][0]*in->x + Tinv[2][1]*in->y + Tinv[2][2]*in->z; } static float euck1 = 1.0; /* inverse power falloff */ static float euck2 = 0.0; /* safety zone around light */ static float fog = 0.0; /* fog control */ #if 0 static float hypk1 = .5; /* controls exponential falloff */ static float hypk2 = .0; /* controls exponential falloff */ static float sphk1 = .5; /* controls exponential falloff */ static float sphk2 = 0.0; /* safety zone around light */ #endif /* * Euclidean shader * * We depend on the following mg features: * _mgc->xstk->hasinv (cleared whenever transform changes) * _mgc->W2C, C2W (initialized from camera at mgworldbegin()) */ int mg_eucshade(int nv, HPoint3 *v, Point3 *n, ColorA *c, ColorA *cs) { struct mgxstk *mx = _mgc->xstk; struct mgastk *ma = _mgc->astk; struct LtLight *l, **lp; int i, lno; HPoint3 V; Point3 N, I; float s; Color Ca, Ci; euck1 = ma->lighting.attenmult; euck2 = ma->lighting.attenmult2; fog = ma->lighting.attenconst > 1 ? ma->lighting.attenconst-1 : 0; #define EYE ((HPoint3 *) (_mgc->C2W[3])) /* Eye (camera) position as an HPoint3 */ if(!mx->hasinv) { TmInvert(mx->T, mx->Tinv); mx->hasinv = 1; } /* "ambient" color */ Ca.r = Ca.g = Ca.b = 0; CCSADD(ma->mat.ambient, ma->lighting.ambient, ma->mat.ka, Ca); for(i = 0; i < nv; i++, v++, n++, c++, cs++) { ColorA *thiscolor = c; float num; /* Transform point by T */ HPt3Transform(mx->T, v, &V); /* V = v in world coords */ HPt3SubPt3(EYE, &V, &I); /* I = EYE - V (point-to-eye vector) */ /* Is this vertex behind our eye? If so, let's not shade it. * Speed up Shape of Space rendering. This code may be questionable: * what if this is a vertex of a smooth-shaded polygon that extends * in front of our eye, too? */ if(DOT(I, *((HPoint3 *)_mgc->C2W[2])) < 0) { /* Dummy -- just Ci = Cs. */ *cs = *c; continue; } Pt3Unit(&I); /* Transform normal by T'^-1 */ cotransform(mx->Tinv, n, &N); /* check if normal has 0 length! */ num = sqrt(DOT(N,N)); if (num == 0.0) num = 1; s = 1/num; if(DOT(N,I) < 0) { s = -s; /* Flip normal to face the viewer */ /* Hack: use otherwise-useless emission color, if defined, * as the back-side material color. */ if(ma->mat.valid & MTF_EMISSION) thiscolor = (ColorA*)(void *)&ma->mat.emission; } N.x *= s; N.y *= s; N.z *= s; /* Ambient term */ Ci = Ca; lp = &ma->lighting.lights[0]; for(lno = 0; lnointensity; if(l->globalposition.w == 0) { L = (Point3 *)(void *)&l->globalposition; ll = DOT(*L,*L); } else { HPt3SubPt3(&l->globalposition, &V, &Lt); L = ≪ ll = DOT(Lt,Lt); /* ll = (ll > euck2) ? ll : euck2; */ if (ll > 0.0) power = pow(ll, -euck1/2.0); else power = 1.0; /* Inverse square falloff */ bright *= power; } ln = DOT(*L,N); if(ln <= 0) /* Ignore lights shining from behind */ continue; if (ll > 0.0) ls = sqrt(ll); else ls = 1.0; if (ls == 0.0) ls = 1.0; s = ma->mat.kd * bright * (ln/ls); /* cosine law: L.N diffuse shading */ CCSADD(l->color, *thiscolor, s, Ci); if(ma->mat.ks > 0) { /* Specular term */ Point3 H; /* H: halfway between L and I */ float num; H.x = L->x/ls + I.x, H.y = L->y/ls + I.y, H.z = L->z/ls + I.z; num = DOT(H,H); if (num <= 0.0) num = 1.0; else num = sqrt(num); s = DOT(H,N) / num; /* cos angle(H,N) */ /* Note we need s>=0 for specular term to make sense. * This should be true since we checked * that both L.N and I.N are positive above. */ /* shininess = specular exponent */ if (s > 0.0) s = ma->mat.ks * bright * pow(s, ma->mat.shininess); else s = ma->mat.ks * bright; CCSADD(l->color, ma->mat.specular, s, Ci); } } /* insert fog code */ if (fog) { float k1, k2; float d = HPt3Distance(&V, EYE); ColorA surfcolor, fogcolor; d = d - euck2; /* fog-free sphere of radius euck2 */ if (d < 0) d = 0; k1 = exp( -fog * d); k2 = 1.0 - k1; CSCALE(k1, Ci, surfcolor); CSCALE(k2, _mgc->background, fogcolor); CCADD(surfcolor, fogcolor, Ci); } if(Ci.r < 0) Ci.r = 0; else if(Ci.r > 1) Ci.r = 1; if(Ci.g < 0) Ci.g = 0; else if(Ci.g > 1) Ci.g = 1; if(Ci.b < 0) Ci.b = 0; else if(Ci.b > 1) Ci.b = 1; *(Color *)cs = Ci; cs->a = c->a; } return 0; } geomview-1.9.5/src/lib/mg/common/mgtexture.c0000644000175000017500000001521312310110200015667 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "mgP.h" #include #include #if HAVE_UNISTD_H # include #endif #if defined(_WIN32) || defined(WIN32) # include # define R_OK 4 /* sigh, no Windows include-file defines R_OK! */ # define iobpclose iobfclose #endif #include #include #include /* * Give mg contexts a chance to purge any textures which aren't in use. * The wise user will call this routine once each redraw cycle; * any texture data which hasn't been used since the last call will be * purged. So, if a texture has been superceded, we'll catch it here. * Several policies are possible; we just implement one. Maybe there could * be a switch. For example, we could: * (a) purge a texture if its data hasn't actually been used in the last * cycle. (Then, if texturing is turned off and then on again, it'll * have to be reloaded each time it's turned on.) * (b) purge a texture if no geom object referring to it has been used * in the last cycle, whether the texture was actually rendered or not. * (This keeps textures loaded, but discards them if they're superceded. * It could screw up if some objects just aren't rendered during some * rendering cycles.) * (c) purge a texture if all references to it (aside from texture caches) * seem to be gone, i.e. by comparing reference counts with the number * of users on the tx->users list. This would preserve textures held * in handles, or by objects which for some reason aren't being rendered. * Stands a large chance of missing things that really deserve * garbage-collection. * We actually implement (b). * * For each texture, we check the "used" bit, indicating that some rendered * geom object has had a reference to that texture since the last call to * mg_textureclock(). We purge textures which haven't thus been "used", * but which have at least one user whose mg context has been rendered to. * */ int mg_textureclock(void) { Texture *tx, *txn; mgcontext *ctx; DblListIterate(&AllLoadedTextures, Texture, loadnode, tx, txn) { if (!(tx->flags & TXF_USED)) { TxUser *tu; int anyused = 0, needed = 0; for (tu = tx->users; tu != NULL; tu = tu->next) { /* We need this if: * this mg context has been used (but didn't use this texture) * ... */ if (tu->ctx != NULL && ((mgcontext *)tu->ctx)->changed & MC_USED) { anyused = 1; } if (tu->needed != NULL && (*tu->needed)(tu)) { needed = 1; } } if ((anyused && !needed) || tx->users == NULL) { TxPurge(tx); } } tx->flags &= ~TXF_USED; } /* Reset all mg contexts' "used" bits for next cycle. */ for (ctx = _mgclist; ctx != NULL; ctx = ctx->next) { ctx->changed &= ~MC_USED; } return 0; } /* * We assume the graphics system allows textures to be shared across * multiple windows of a type. We're closing one of those windows. * If any texture-users claim to be using that window, switch them to * use another of the same type, if possible. Otherwise, just purge them. */ void mg_reassign_shared_textures(mgcontext *ctx, int mgdtype) { mgcontext *another; Texture *tx, *txn; TxUser *tu, **tup; for (another = _mgclist; another != NULL; another = another->next) { if (another != ctx && another->devno == mgdtype) break; } DblListIterate(&AllLoadedTextures, Texture, loadnode, tx, txn) { for (tup = &tx->users, tu=*tup; tu != NULL; tu=*tup) { if (tu->ctx == ctx) { if (another != NULL) { tu->ctx = another; tup = &tu->next; } else { *tup = tu->next; if (tu->purge) { (*tu->purge)(tu); } OOGLFree(tu); } } } if (tx->users == NULL) { TxPurge(tx); } } } /* really == false means to only compare the images and the s/t clamp settings * really == true means to compare all components */ bool mg_same_texture(Texture *tx1, Texture *tx2, bool really) { if (tx1 == tx2) { return true; } if (tx1->image != tx2->image) { return false; } if ((tx1->flags ^ tx2->flags) & (TXF_SCLAMP|TXF_TCLAMP)) { return false; } if (really) { if (tx1->apply != tx2->apply) { return false; } if (tx1->apply == TXF_BLEND && (tx1->background.r != tx2->background.r || tx1->background.g != tx2->background.g || tx1->background.b != tx2->background.b)) { return false; } } return true; } /* Find a texture in the cache which shares the texture image and the * clamping, background and application styles may be different. */ TxUser * mg_find_shared_texture(Texture *wanttx, int type) { Texture *tx; TxUser *tu; DblListIterateNoDelete(&AllLoadedTextures, Texture, loadnode, tx) { if (mg_same_texture(tx, wanttx, false)) { for (tu = tx->users; tu != NULL; tu = tu->next) { if (tu->ctx && ((mgcontext *)tu->ctx)->devno == type) return tu; } } } return NULL; } #ifdef _WIN32 # undef FD_ISSET /* Use fake FD_ISSET from streampool.c for VC++ */ #endif int mg_find_free_shared_texture_id(int type) { Texture *tx; TxUser *tu; fd_set ids; int id, max = 0; FD_ZERO(&ids); DblListIterateNoDelete(&AllLoadedTextures, Texture, loadnode, tx) { for (tu = tx->users; tu != NULL; tu = tu->next) { if (tu->ctx && ((mgcontext *)tu->ctx)->devno == type) { if (((unsigned)tu->id) < FD_SETSIZE) { FD_SET(tu->id, &ids); if (max < tu->id) max = tu->id; } } } } for (id = 1; id < FD_SETSIZE && FD_ISSET(id, &ids) && id <= max; id++) ; if (id >= FD_SETSIZE) { OOGLError(0, "Yikes: all %d texture slots in use?", FD_SETSIZE); id--; } return id; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/mg/common/mg.h0000644000175000017500000003317212310110200014257 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef MINNEGRAPHICSDEFS #define MINNEGRAPHICSDEFS /* * Public interface to mg (minnegraphics) package. */ #include "color.h" #include "point.h" #include "transform.h" #include "window.h" #include "camera.h" #include "appearance.h" #include "bsptree.h" #ifndef POLYLISTPDEFS struct Poly; struct Vertex; #endif #ifndef _GV_BSPTREE_P_H_ struct BSPTree; #endif typedef struct mgcontext mgcontext; /* Opaque typedef */ typedef int (*mgshadefunc)( int npoints, HPoint3 *points, Point3 *normals, ColorA *colors, ColorA *newcolors ); typedef void (*mgwinchfunc)( /*mgcontext *mgc, void *data, int win_why, ...*/ ); typedef struct mgNDctx mgNDctx; typedef int (*mgNDmapfunc)(mgNDctx *NDctx, HPointN *NDpoint, HPoint3 *newpoint, ColorA *newcolor); struct mgNDctx { mgNDmapfunc mapHPtN; void *(*saveCTX)(mgNDctx *NDctx); void (*pushTN)(mgNDctx *NDctx, TransformN *leftTN); void (*pushT)(mgNDctx *NDctx, Transform leftT); void (*restoreCTX)(mgNDctx *NDctx, void *savedCTX); BSPTree *bsptree; }; struct mgfuncs { /* mg member functions; potentially changed per device */ short mg_devno; /* Current device number */ int (*mg_setdevice)(void); int (*mg_feature)(int feature); mgcontext * (*mg_ctxcreate)(/* int a1, ... */); void (*mg_ctxdelete)(mgcontext *ctx); int (*mg_ctxset)(/* a1, ... */); int (*mg_ctxget)(int attr, void* valueptr); int (*mg_ctxselect)(mgcontext *ctx); void (*mg_sync)(void); void (*mg_worldbegin)(void); void (*mg_worldend)(void); void (*mg_reshapeviewport)(void); /* geometry transform support */ void (*mg_settransform)(Transform T); void (*mg_gettransform)(Transform T); void (*mg_identity)(void); void (*mg_transform)(Transform T); int (*mg_pushtransform)(void); int (*mg_poptransform)(void); /* texture transform support */ void (*mg_settxtransform)(Transform T); void (*mg_gettxtransform)(Transform T); void (*mg_txidentity)(void); void (*mg_txtransform)(Transform T); int (*mg_pushtxtransform)(void); int (*mg_poptxtransform)(void); /* appearances */ int (*mg_pushappearance)(void); int (*mg_popappearance)(void); const Appearance *(*mg_setappearance)(const Appearance *app, int merge); const Appearance *(*mg_getappearance)(void); int (*mg_setcamera)(Camera* cam); void (*mg_polygon)(int nv, HPoint3 *v, int nn, Point3 *n, int nc,ColorA *c); void (*mg_polylist)(int np, struct Poly *p, int nv, struct Vertex *v, int plflags); void (*mg_mesh)(int wrap,int nu,int nv,HPoint3 *p, Point3 *n, Point3 *nq, ColorA *c, TxST *ST, int mflags); void (*mg_line)(HPoint3 *p1, HPoint3 *p2); void (*mg_polyline)(int nv, HPoint3 *v, int nc, ColorA *c, int wrapped); void (*mg_quads)(int nquads, HPoint3 *v, Point3 *n, ColorA *c, int qflags); void (*mg_bezier)(int du, int dv, int dimn, float *ctrlpts, TxST *txmapst, ColorA *c); void (*mg_bsptree)(struct BSPTree *bsptree); const void *(*mg_tagappearance)(void); void (*mg_untagappearance)(const void *tag); void (*mg_taggedappearance)(const void *tag); }; extern struct mgfuncs _mgf; /* Common mg attributes -- for mgctxcreate(), mgctxset(), mgctxget() */ #define MG_END 0 #define MG_WINDOW 128 /* WnWindow * */ #define MG_PARENT 129 /* mgcontext *context (of parent window)*/ #define MG_SHOW 130 /* int visible (make window visible) */ #define MG_SETOPTIONS 131 /* int mask (of options to enable) see */ #define MG_UNSETOPTIONS 132 /* int mask (options to disable) mg.h */ #define MG_BACKGROUND 133 /* ColorA * */ #define MG_CAMERA 134 /* Camera * */ #define MG_APPEAR 135 /* Appearance *default_appearance */ #define MG_ApSet 136 /* Appearance create list */ #define MG_WnSet 137 /* Window create list */ #define MG_CamSet 138 /* Camera create list */ #define MG_ZNUDGE 139 /* float; fraction of Z-range by which lines & * edges are nudged nearer than polygons. */ #define MG_NDCTX 140 /* mgNDctx * */ /* Note 140, 141, 142 used to be MG_EUCLIDEAN, MG_HYPERBOLIC, and MG_SPHERICAL, which are now obsolete. These numbers may be reused now. */ #define MG_SHADER 143 /* mgshadefunc *shader_function */ #define MG_SHADERDATA 144 /* void *shaderdata (interpreted by shader) */ #define MG_ABLOCK 145 /* void *ablock */ #define MG_SPACE 146 /* TM_EUCLIDEAN, TM_HYPERBOLIC, or TM_SPHERICAL */ /* More control options: needed initially for X11, but might exist * some day for others. */ #define MG_DITHER 150 /* Dithering control: 1(on)/0(off) */ #define MG_DEPTHSORT 151 /* Depth sorting: one of: */ enum sortmethod {MG_NONE, MG_DEPTH, MG_ZBUFFER}; #define MG_BITDEPTH 152 /* frame buffer depth (1,8,24,...?) */ #define MG_WINCHANGE 153 /* void *winchange(ctx, void *data) * function, called when someone asks this * mg window to change (size, border, etc.) */ #define MG_WINCHANGEDATA 154 /* void *data param for winchange() callback */ /* win_why values for (*winchange) callback */ #define MGW_WINCHANGE 1 /* Window data (pos'n, size, title, ...) change */ #define MGW_WINDELETE 2 /* Window being deleted */ #define MGW_DOUBLEBUF 3 /* Double-buffering state changed; called as */ /* winchange(mgc, info, MGW_DOUBLEBUF, is_double) */ /* Other values, 16 and up, may be per-device */ /* NOTE: the MG_SPACE attribute specifies the space in which the objects being drawn live. It serves the same purpose as the NeXT-specific attribute MG_GEOMTYPE, which should eventually be phased out. mbp Fri Dec 11 14:51:30 1992 */ /* Possible MG Features */ #define MGF_BEZIER 100 /* Driver supports mgbezier */ /* Bitwise ORable options for mg_ctxset MG_[UN]SETOPTIONS */ #define MGO_DOUBLEBUFFER 0x1 /* Default single buffered */ #define MGO_HIDDEN 0x2 /* Default not Z-buffered */ #define MGO_BACKFACECULL 0x4 /* Default back-faces shown */ #define MGO_INHIBITBACKGROUND 0x8 /* Default background drawn */ #define MGO_INHIBITCLEAR 0x10 /* Default clear at worldbegin*/ #define MGO_INHIBITSWAP 0x20 /* Default swapbufs at worldend */ #define MGO_NORED 0x40 /* Inhibit drawing into red */ #define MGO_NOGREEN 0x80 /* ... green ... */ #define MGO_NOBLUE 0x100 /* ... or blue planes */ #define MGO_INHIBITCAM 0x200 /* Don't load matrix in worldbegin() */ /* mgmesh 'style' values */ #define MM_NOWRAP 0 #define MM_UWRAP 1 #define MM_VWRAP 2 /* mergeflag values for mgsetappearance() */ #define MG_SET 0 #define MG_MERGE 1 #define mgctxselect( mgc ) (*_mgf.mg_ctxselect)( mgc ) #define mgctxcreate (*_mgf.mg_ctxcreate) #define mgctxdelete( mgc ) (*_mgf.mg_ctxdelete)( mgc ) #define mgctxset (*_mgf.mg_ctxset) #define mgctxget( attr, valuep ) (*_mgf.mg_ctxget)( attr, valuep ) /* appearnce stack */ #define mgpushappearance() (*_mgf.mg_pushappearance)() #define mgpopappearance() (*_mgf.mg_popappearance)() #define mgsetappearance( ap, merge ) (*_mgf.mg_setappearance)( ap, merge ) #define mggetappearance() (*_mgf.mg_getappearance)() #define mgtagappearance() (*_mgf.mg_tagappearance)() #define mguntagappearance(tag) (*_mgf.mg_untagappearance)(tag) #define mgtaggedappearance(tag) (*_mgf.mg_taggedappearance)(tag) #define mgsetcamera( cam ) (*_mgf.mg_setcamera)( cam ) /* transform stack */ #define mgsettransform( T ) (*_mgf.mg_settransform)( T ) #define mggettransform( T ) (*_mgf.mg_gettransform)( T ) #define mgidentity() (*_mgf.mg_identity)() #define mgtransform( T ) (*_mgf.mg_transform)( T ) #define mgpushtransform() (*_mgf.mg_pushtransform)() #define mgpoptransform() (*_mgf.mg_poptransform)() /* texture transform stack */ #define mgsettxtransform( T ) (*_mgf.mg_settxtransform)( T ) #define mggettxtransform( T ) (*_mgf.mg_gettxtransform)( T ) #define mgtxidentity() (*_mgf.mg_txidentity)() #define mgtxtransform( T ) (*_mgf.mg_txtransform)( T ) #define mgpushtxtransform() (*_mgf.mg_pushtxtransform)() #define mgpoptxtransform() (*_mgf.mg_poptxtransform)() #define mgreshapeviewport() (*_mgf.mg_reshapeviewport)() #define mgworldbegin() (*_mgf.mg_worldbegin)() #define mgsync( ) (*_mgf.mg_sync)() #define mgworldend() (*_mgf.mg_worldend)() #define mgpolygon(nv,v, nn, n, nc, c) \ (*_mgf.mg_polygon)( nv,v, nn,n, nc,c ) #define mgpolylist(np, p, nv, v, flags) \ (*_mgf.mg_polylist)(np, p, nv, v, flags) #define mgmesh(style, nu, nv, v, n, nq, c, mflags) \ (*_mgf.mg_mesh)(style, nu, nv, v, n, nq, c, NULL, mflags) #define mgmeshst(style, nu, nv, v, n, nq, c ,st, mflags) \ (*_mgf.mg_mesh)(style, nu, nv, v, n, nq, c, st, mflags) #define mgline(p1, p2) \ (*_mgf.mg_line)( p1, p2 ) #define mgpolyline(nv, v, nc,c, wrap) \ (*_mgf.mg_polyline)(nv, v, nc, c, wrap ) #define mgquads(nquad, v, n, c, qflags) \ (*_mgf.mg_quads)(nquad, v, n, c, qflags) #define mgbezier(du, dv, dimn, ctrlpts, tx, c ) \ (*_mgf.mg_bezier)(du, dv, dimn, ctrlpts, tx, c) #define mgbsptree(bsptree) \ (*_mgf.mg_bsptree)(bsptree) #define mgfeature( feature ) (*_mgf.mg_feature)( feature ) extern mgcontext *mgcurrentcontext(); /* Get ptr to current context */ extern int mgbegin( void ); /* Init, select default dev */ extern int mgend( void ); /* Shut down */ extern int mgclonefrom( mgcontext *other ); /* Init cur mgctx from other */ /* * Sample software-shading function, usable as MG_SHADER. */ extern int mg_eucshade( int npoints, HPoint3 *points, Point3 *normals, ColorA *colors, ColorA *newcolors ); /* * Polling routine, intended to be called roughly once per * render cycle, which detects and purges textures which don't * seem to be in use. */ extern int mg_textureclock(void); #define CURRENTMGTYPE() (_mgf.mg_devno) /* * Device select routines -- set default for future mgctxcreate()'s */ extern int mgdevice_GL( void ); extern int mgdevice_X11( void ); extern int mgdevice_XGL( void ); extern int mgdevice_RIB( void ); extern int mgdevice_RI( void ); extern int mgdevice_PS( void ); extern int mgdevice_VT100( void ); extern int mgdevice_XT( void ); extern int mgdevice_MAC( void ); extern int mgdevice_TEK( void ); extern int mgdevice_TELETYPE( void ); extern int mgdevice_PUNCHCARD( void ); extern int mgdevice_SIMSTIM( void ); extern int mgdevice_NULL( void ); extern int mgdevice_BUF( void ); extern int mgdevice_OPENGL( void ); extern int mgdevice_PICK( void ); extern int mgdevice_PRIM( void ); extern int mgdevice( int deviceno ); /* Alternative to the above */ #define MGD_NODEV -1 /* error return: can't select that device */ #define MGD_NULL 0 /* no device, just return current one */ #define MGD_GL 1 /* SGI GL */ #define MGD_XGL 2 /* Sun XGL */ #define MGD_X11 3 /* Generic X11 */ #define MGD_RIB 4 /* Renderman RIB*/ #define MGD_PS 5 /* Postscript */ #define MGD_RI 6 /* Quick Renderman */ #define MGD_BUF 7 /* Raster buffer */ #define MGD_OPENGL 8 /* Open GL */ #define MGD_PICK 9 /* software pick */ #define MGD_PRIM 10 /* geometric data */ #endif /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mg/common/mgP.h0000644000175000017500000002035112310110200014372 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _MG_PDEFS_ #define _MG_PDEFS_ /* * Private, but machine-independent, declarations for mg library. */ #include #include "mg.h" #define MGCONTEXTMAGIC OOGLMagic('m', 'c'<<8 | 1) /* struct mgcontext changed bits */ #define MC_WIN 0x01 /* window changed (reshaped, &c) */ #define MC_CAM 0x02 /* Camera changed */ #define MC_AP 0x04 /* Appearance changed */ #define MC_MAT 0x08 /* Material changed */ #define MC_LIGHT 0x10 /* Lighting changed */ #define MC_TRANS 0x20 /* Transformation changed */ #define MC_OPT 0x40 /* Options changed */ #define MC_USED 0x80 /* worldbegin called (used by mg_textureclock) */ /* flags for mgastk->flags */ #define MGASTK_TAGGED 0x01 /* sticky */ #define MGASTK_ACTIVE 0x02 /* in use */ #define MGASTK_SHADER 0x04 /* software shader */ /* * Appearance portion of state. * We have a global stack of these which represent the user-specified values, * with a stack push at every mgpushappearance(). */ struct mgastk { REFERENCEFIELDS; /* use count for sticky elements */ struct mgastk *next; /* stack link */ mgcontext *tag_ctx;/* back-pointer for ap_tagged list */ unsigned short flags; /* sticky flag */ unsigned short changed; short ap_seq, mat_seq, light_seq; Appearance ap; /* Shallow copy of appearance -- don't delete */ Material mat; /* Ditto, Material */ LmLighting lighting;/* Ditto, Lighting */ mgshadefunc shader; /* Software shading function, or NULL if none */ void *shaderdata; /* Data which shader might use */ }; /* * Transform stack, pushed by mgpushtransform(). */ struct mgxstk { struct mgxstk *next; /* stack link */ Transform T; /* Current object->world xform */ short xfm_seq; short hasinv; /* Flag: Tinv is valid */ Transform Tinv; }; /* * Texture transform stack. Needed to paste textured stuff together * with INSTs, but allowing for a texture which covers the entire * object. cH, 2007. */ struct mgtxstk { struct mgtxstk *next; /* stack link */ Transform T; /* No need for an inverse. Sequence count? Probably not. */ }; struct mgcontext { REFERENCEFIELDS; struct mgfuncs *devfuncs; /* Pointers to devices */ short devno; /* Device index -- MGD_GL, MGD_X11, ... */ unsigned short changed; /* flags: Must update device state because...*/ WnWindow *win; /* Window */ Camera *cam; /* Camera */ mgcontext *parent; /* Parent mg window, if any */ mgcontext *next; /* Link in list of all mg contexts */ struct mgxstk *xstk; /* Top of transform stack */ struct mgtxstk *txstk; /* Top of texture transform stack */ struct mgastk *astk; /* Top of appearance stack */ struct mgastk *ap_tagged;/* Tagged (persistent) appearances */ short ap_min_tag, ap_max_tag; /* excluded seq. regions */ short mat_min_tag, mat_max_tag; short light_min_tag, light_max_tag; int shown; /* Is window 'visible'? */ ColorA background; /* Background color */ Image *bgimage; int opts; /* MG_SETOPTIONS flag mask */ Transform W2C; /* World->camera transform */ Transform C2W; /* Camera->world transform */ float zfnudge; /* fraction of Z-range by which lines are * nudged closer than surfaces. */ int space; /* space in which objects being drawn * live; should be TM_EUCLIDEAN, * TM_HYPERBOLIC, or TM_SPHERICAL */ Transform W2S, S2W; /* world-to-screen, screen-to-world xfms */ int has; /* Flag bits, set when cached values valid */ #define HAS_CPOS 0x1 /* Camera position (cpos, camZ) */ #define HAS_S2O 0x2 /* S2O, O2S */ #define HAS_POINT 0x4 /* Outline for generic fat point */ /* Cached values, computed when needed: */ HPoint3 cpos; /* Location of camera in object coordinates */ Point3 camZ; /* Direction of camera +Z vector */ Transform O2S, S2O; /* object-to-screen, screen-to-object xfms */ vvec point; /* outline for fat points */ mgNDctx *NDctx;/* pointer to caller-defined ND closure */ mgwinchfunc winchange; /* Callback function for mg Window etc. changes */ void *winchangeinfo; /* We call (*winchange)(ctx, winchangeinfo, win, changemask) */ }; #define next_ap_seq(ctx, astk) \ ((((astk)->ap_seq + 1) >= (ctx)->ap_min_tag && \ ((astk)->ap_seq + 1) <= (ctx)->ap_max_tag) \ ? (ctx)->ap_max_tag+1 : (astk)->ap_seq + 1) #define next_mat_seq(ctx, astk) \ ((((astk)->mat_seq + 1) >= (ctx)->mat_min_tag && \ ((astk)->mat_seq + 1) <= (ctx)->mat_max_tag) \ ? (ctx)->mat_max_tag+1 : (astk)->mat_seq + 1) #define next_light_seq(ctx, astk) \ ((((astk)->light_seq + 1) >= (ctx)->light_min_tag && \ ((astk)->light_seq + 1) <= (ctx)->light_max_tag) \ ? (ctx)->light_max_tag+1 : (astk)->light_seq + 1) /* * Pointer to the current mg context. */ extern mgcontext *_mgc; /* * List of all extant mg contexts. */ extern mgcontext *_mgclist; /* * Declarations of common mg routines, accessible to other mg packages * (but not intended to be public): */ /* geometry transform */ extern void mg_identity(void); extern void mg_transform(Transform T); extern void mg_settransform(Transform T); extern void mg_gettransform(Transform T); extern int mg_pushtransform(void); extern int mg_poptransform(void); /* texture transform */ extern void mg_txidentity(void); extern void mg_txtransform(Transform T); extern void mg_settxtransform(Transform T); extern void mg_gettxtransform(Transform T); extern int mg_pushtxtransform(void); extern int mg_poptxtransform(void); extern void mg_quads(int nquads, HPoint3 *v, Point3 *n, ColorA *c, int qflags); extern void mg_bezier(int du, int dv, int dimn, float *ctrlpts, TxST *txmapst, ColorA *c); extern void mg_bsptree(struct BSPTree *bsptree); extern void mg_findcam(); extern void mg_findS2O(); extern void mg_findO2S(); extern void mg_makepoint(); extern int mg_pushappearance(void); extern int mg_popappearance(void); extern void mg_reshapeviewport(void); extern const Appearance *mg_getappearance(void); extern const Appearance *mg_setappearance(const Appearance *ap, int mergeflag); extern mgcontext *mg_newcontext(struct mgcontext *); extern int mg_appearancebits( Appearance *ap, int merge, int *valid, int *flag ); extern void mg_ctxdelete( struct mgcontext * ); extern int mg_ctxselect( struct mgcontext * ); extern void mg_findO2S( void ); extern void mg_findS2O( void ); extern void mg_findcam( void ); extern void mg_makepoint( void ); extern void mg_worldbegin( void ); extern int mg_inhaletexture( Texture *tx, int rgba ); extern TxUser *mg_find_shared_texture(Texture *tx, int mgtype); extern bool mg_same_texture(Texture *tx1, Texture *tx2, bool really); extern void mg_reassign_shared_textures(mgcontext *ctx, int mgtype); extern int mg_find_free_shared_texture_id(int mgtype); extern void mg_remove_txuser(TxUser *tu); extern const void *mg_tagappearance(void); extern void mg_untagappearance(const void *tag); extern void mg_taggedappearance(const void *tag); #endif /*_MG_PDEFS_*/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 8 *** * End: *** */ geomview-1.9.5/src/lib/mg/common/Headers0000644000175000017500000000001312310110200014765 00000000000000mg.h mgP.h geomview-1.9.5/src/lib/mg/ps/0000755000175000017500000000000012310165603012730 500000000000000geomview-1.9.5/src/lib/mg/ps/Makefile.in0000644000175000017500000004645512310165554014740 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/mg/ps DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libmgps_la_LIBADD = am_libmgps_la_OBJECTS = mgps.lo mgpsclip.lo mgpsdraw.lo mgpstri.lo \ mgpswindows.lo libmgps_la_OBJECTS = $(am_libmgps_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libmgps_la_SOURCES) DIST_SOURCES = $(libmgps_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgps.la libmgps_la_SOURCES = \ mgps.c mgpsclip.c mgpsdraw.c mgpstri.c mgpswindows.c \ mgps.h mgpsP.h mgpstri.h mgpswindows.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/mg/ps/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/mg/ps/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libmgps.la: $(libmgps_la_OBJECTS) $(libmgps_la_DEPENDENCIES) $(EXTRA_libmgps_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libmgps_la_OBJECTS) $(libmgps_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgps.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgpsclip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgpsdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgpstri.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgpswindows.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/mg/ps/Makefile.am0000644000175000017500000000032312310110201014662 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgps.la libmgps_la_SOURCES = \ mgps.c mgpsclip.c mgpsdraw.c mgpstri.c mgpswindows.c \ mgps.h mgpsP.h mgpstri.h mgpswindows.h geomview-1.9.5/src/lib/mg/ps/mgps.c0000644000175000017500000004574312310110201013757 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgps.h" #include "mgpsP.h" #include "windowP.h" #include "mgpswindows.h" #include void mgps_reshapeviewport(void); void mgps_appearance( struct mgastk *ma, int mask ); void mgps_setshader(mgshadefunc shader); mgcontext * mgps_ctxcreate(int a1, ...); int mgps_ctxset( int a1, ... ); int mgps_feature( int feature ); void mgps_ctxdelete( mgcontext *ctx ); int mgps_ctxget( int attr, void* valueptr ); int mgps_ctxselect( mgcontext *ctx ); void mgps_sync( void ); void mgps_worldbegin( void ); void mgps_worldend( void ); void mgps_identity( void ); void mgps_transform( Transform T ); int mgps_pushtransform( void ); int mgps_poptransform( void ); void mgps_gettransform( Transform T ); void mgps_settransform( Transform T ); int mgps_pushappearance( void ); int mgps_popappearance( void ); const Appearance *mgps_setappearance(const Appearance* app, int merge ); int mgps_setcamera( Camera* cam ); int mgps_setwindow( WnWindow *win, int final ); mgpscontext *mgps_newcontext( mgpscontext *ctx ); /* probably not here */ int mgdevice_PS(); extern void mgps_polygon(); extern void mgps_mesh(); extern void mgps_line(); extern void mgps_polyline(); extern void mgps_polylist(); extern void mgps_quads(); int _mgps_ctxset(int a1, va_list *alist); WnWindow *mgpswindow(WnWindow *win); struct mgfuncs mgpsfuncs = { MGD_PS, mgdevice_PS, mgps_feature, (mgcontext *(*)())mgps_ctxcreate, mgps_ctxdelete, (int (*)())mgps_ctxset, mgps_ctxget, mgps_ctxselect, mgps_sync, mgps_worldbegin, mgps_worldend, mgps_reshapeviewport, /* geometry transform */ mgps_settransform, mgps_gettransform, mgps_identity, mgps_transform, mgps_pushtransform, mgps_poptransform, /* texture geometry transform */ mg_settxtransform, mg_gettxtransform, mg_txidentity, mg_txtransform, mg_pushtxtransform, mg_poptxtransform, /* appearances */ mgps_pushappearance, mgps_popappearance, mgps_setappearance, mg_getappearance, /***************/ mgps_setcamera, mgps_polygon, mgps_polylist, mgps_mesh, mgps_line, mgps_polyline, mg_quads, mg_bezier, mg_bsptree, mg_tagappearance, mg_untagappearance, mg_taggedappearance }; void mgps_reshapeviewport(void) { CamSet(_mgc->cam, CAM_ASPECT, (double)_mgpsc->xsize/(double)_mgpsc->ysize, CAM_END); } /*----------------------------------------------------------------------- * Function: mgdevice_PS * Description: select the PS device as the current MG device * Returns: 1 * Author: daeron * Notes: */ int mgdevice_PS() { _mgf = mgpsfuncs; if(_mgc != NULL && _mgc->devno != MGD_PS) _mgc = NULL; return(0); } /*----------------------------------------------------------------------- * Function: mgps_newcontext * Description: initialize an mgcontext structure * Args: mgc: ptr to context structure to initialize * Returns: mgc * Notes: Further device-specific initialization is normally required. */ mgpscontext * mgps_newcontext( mgpscontext *ctx ) { mg_newcontext(&(ctx->mgctx)); ctx->mgctx.devfuncs = &mgpsfuncs; ctx->mgctx.devno = MGD_PS; ctx->mgctx.astk->ap_seq = 1; ctx->mgctx.astk->mat_seq = 1; ctx->mgctx.astk->light_seq = 1; ctx->mgctx.astk->shader = mg_eucshade; ctx->mgctx.zfnudge = 40.e-6; ctx->xsize = ctx->ysize = 0; ctx->file = NULL; ctx->born = 0; VVINIT(ctx->room, char, 180); return ctx; } /*----------------------------------------------------------------------- * Function: _mgps_ctxset * Description: internal ctxset routine * Args: a1: first attribute * *alist: rest of attribute-value list * Returns: -1 on error, 0 on success * Date: Fri Sep 20 11:08:13 1991 * Notes: mgps_ctxcreate() and mgps_ctxset() call this to actually * parse and interpret the attribute list. */ int _mgps_ctxset(int a1, va_list *alist) { int attr; char **ablock = NULL; #define NEXT(type) OOGL_VA_ARG(type, alist, ablock) for (attr = a1; attr != MG_END; attr = NEXT(int)) { switch (attr) { case MG_ABLOCK: ablock = NEXT(char**); break; case MG_ApSet: { Appearance *ap; if (ablock) ap = ApSet(NULL, AP_ABLOCK, ablock); else ap = _ApSet(NULL, va_arg(*alist, int), alist); mgps_setappearance(ap, MG_MERGE); ApDelete(ap); } break; case MG_WnSet: if (ablock) WnSet( _mgc->win, WN_ABLOCK, ablock); else _WnSet( _mgc->win, va_arg(*alist, int), alist); mgps_setwindow( _mgc->win, 0 ); break; case MG_CamSet: if (ablock) CamSet( _mgc->cam, CAM_ABLOCK, ablock); else _CamSet( _mgc->cam, va_arg(*alist, int), alist); break; case MG_APPEAR: mgsetappearance( NEXT(Appearance *), MG_SET ); break; case MG_WINDOW: if (_mgc->win) WnDelete(_mgc->win); _mgc->win = NEXT(WnWindow *); mgps_setwindow( NULL, 0 ); break; case MG_CAMERA: mgps_setcamera( NEXT(Camera *) ); break; case MG_SETOPTIONS: _mgc->opts |= NEXT(int); break; case MG_UNSETOPTIONS: _mgc->opts &= ~NEXT(int); break; case MG_SHOW: _mgc->shown = NEXT(int); break; case MG_PARENT: _mgc->parent = NEXT(mgcontext*); break; case MG_BACKGROUND: { ColorA bcolor; bcolor = *NEXT(ColorA*); _mgc->background = bcolor; } break; case MG_SHADER: mgps_setshader( NEXT(mgshadefunc) ); break; case MG_SHADERDATA: _mgc->astk->shaderdata = NEXT(void*); break; case MG_SPACE: { int space = NEXT(int); switch (TM_SPACE(space)) { case TM_EUCLIDEAN: case TM_SPHERICAL: _mgc->space = space; break; case TM_HYPERBOLIC: switch (TM_MODEL(space)) { case TM_VIRTUAL: case TM_PROJECTIVE: case TM_CONFORMAL_BALL: _mgc->space = space; break; default: fprintf(stderr, "_mgps_ctxset: Illegal space value %1d\n", space); } break; default: fprintf(stderr, "_mgps_ctxset: Illegal space value %1d\n", space); } } break; case MG_NDCTX: _mgc->NDctx = NEXT(mgNDctx *); break; case MG_ZNUDGE: _mgc->zfnudge = NEXT(double); break; case MG_PSFILE: _mgpsc->file = NEXT(FILE *); break; case MG_PSFILEPATH: if (_mgpsc->file) fclose(_mgpsc->file); strcpy(_mgpsc->filepath, NEXT(char *)); _mgpsc->file = fopen(_mgpsc->filepath, "w"); break; default: OOGLError (0, "_mgps_ctxset: undefined option: %d", attr); return -1; } } if (_mgc->shown && !_mgpsc->born) { /* open the window */ mgpswindow(_mgc->win); /* bring PS state into accordance with appearance state */ { Appearance *ap = ApCopy( &(_mgc->astk->ap), NULL ); mgps_setappearance( ap, MG_SET ); ApDelete(ap); } } #undef NEXT return 0; } /* This needs some checking -- TOR */ int mgps_setwindow( WnWindow *win, int final ) { int xsize, ysize; if (win == NULL) return 0; WnGet(_mgc->win, WN_XSIZE, &xsize); WnGet(_mgc->win, WN_YSIZE, &ysize); _mgpsc->xsize = xsize; _mgpsc->ysize = ysize; return 1; } /*----------------------------------------------------------------------- * Function: mgps_identity * Description: Set the current object xform to the identity * Args: (none) * Returns: nothing * Notes: Sets the xform on the top of the current context's xform * stack to the identity. Also sets the MC_TRANS bit of * the context's "changed" flag and increment's the current xfm * sequence number. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgps_identity( void ) { mgps_settransform( TM3_IDENTITY ); } /*----------------------------------------------------------------------- * Function: mgps_settransform * Description: Set the current object xform * Args: T * Returns: nothing * Notes: Sets the xform on the top of the current context's xform * stack to T. Also sets the MC_TRANS bit of * the context's "changed" flag and increment's the current xfm * sequence number. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgps_settransform( Transform T ) { TmCopy(T, _mgc->xstk->T); _mgc->has = _mgc->xstk->hasinv = 0; } /*----------------------------------------------------------------------- * Function: mgps_gettransform * Description: Get the current object xform * Args: T * Returns: nothing * Notes: Writes the current object xform, from the top of the * context's xform stack, into T. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgps_gettransform( Transform T ) { TmCopy(_mgc->xstk->T, T); } /*----------------------------------------------------------------------- * Function: mgps_transform * Description: premultiply the current object xform by a transform * Args: T: the transform to premultiply by * Returns: nothing * Notes: If X is the context's current object xform, replaces X * by T X. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgps_transform( Transform T ) { TmConcat(T, _mgc->xstk->T, _mgc->xstk->T); _mgc->has = _mgc->xstk->hasinv = 0; } /*----------------------------------------------------------------------- * Function: mgps_pushappearance * Description: push the context's appearance stack * Returns: nothing * Notes: * DEVICE USE: required --- all devices must maintain this stack */ int mgps_pushappearance() { mg_pushappearance(); return 0; } /*----------------------------------------------------------------------- * Function: mgps_popappearance * Description: pop the context's appearance stack * Returns: nothing * Notes: * DEVICE USE: required --- all deviced must maintain this stack */ int mgps_popappearance() { struct mgastk *mastk = _mgc->astk; struct mgastk *mastk_next; if (!(mastk_next = mastk->next)) { OOGLError(0, "mgps_popappearance: appearance stack has only 1 entry."); return 0; } mgps_appearance(mastk_next, mastk_next->ap.valid); mg_popappearance(); return 0; } /*----------------------------------------------------------------------- * Function: mgps_setappearance * Description: Operate on appearance in current context * Args: *ap: the appearance to assign or merge * mergeflag: MG_MERGE or MG_SET * Returns: ptr to current appearance * Notes: Modifies the context's current apperance. Does not * modify *ap. * mergeflag = MG_MERGE: merge *ap into current appearance * mergeflag = MG_SET: set current appearance to *ap * DEVICE USE: required --- when ??? * * Can we modify this to do some of the flag setting * than mgps_setappearance currently does??? This * seems common to all devices. */ const Appearance * mgps_setappearance(const Appearance *ap, int mergeflag ) { int changed, lng_changed; struct mgastk *mastk = _mgc->astk; Appearance *ma; ma = &(mastk->ap); if(mergeflag == MG_MERGE) { changed = ap->valid &~ (ma->override &~ ap->override); lng_changed = ap->lighting ? ap->lighting->valid &~ (ma->lighting->override &~ ap->lighting->override) : 0; } else { changed = ap->valid; lng_changed = ap->lighting ? ap->lighting->valid : 0; } mg_setappearance( ap, mergeflag ); if ((ap->lighting) && (mastk->next)) { if (mastk->light_seq == mastk->next->light_seq) { mastk->light_seq++; lng_changed |= ma->lighting->valid; /* "All fields changed" */ } } mgps_appearance( mastk, changed); return ap; } /*----------------------------------------------------------------------- * Function: mgps_setcamera * Description: Set the context's camera * Args: *cam: the camera to use * Returns: nothing * Notes: The context does not maintain an internal copy of the * camera. Only the pointer is stored. * DEVICE USE: required */ int mgps_setcamera( Camera *cam ) { if (_mgc->cam) CamDelete(_mgc->cam); _mgc->cam = cam; RefIncr((Ref*) cam); return 0; } /*----------------------------------------------------------------------- * Function: mgps_ctxset * Description: set some attributes in the current context * Args: attr, ...: list of attribute-value pairs, terminated * by MG_END * Returns: -1 on error, 0 on success * Notes: DO NOT CALL THIS (yet)! It currently does nothing. * DEVICE USE: forbidden --- devices have their own mgxx_ctxset() * * This needs to be modified to work as the NULL device. * Use by other devices may never be needed. */ int mgps_ctxset( int attr, ... /*, MG_END */ ) { va_list alist; int result; va_start( alist, attr ); result = _mgps_ctxset(attr, &alist); va_end(alist); return result; } /*----------------------------------------------------------------------- * Function: mgps_ctxget * Description: get an attribute from the current context * Args: attr: the attribute to get * value: place to write attr's value * */ int mgps_ctxget( int attr, void *value ) { #define VALUE(type) ((type*)value) switch (attr) { case MG_APPEAR: *VALUE(Appearance*) = &(_mgc->astk->ap); break; case MG_CAMERA: *VALUE(Camera*) = _mgc->cam; break; case MG_WINDOW: /* pretty silly concept, IMHO :-) */ *VALUE(WnWindow*) = _mgc->win; break; case MG_PARENT: *VALUE(mgcontext*) = _mgc->parent; break; case MG_SETOPTIONS: case MG_UNSETOPTIONS: *VALUE(int) = _mgc->opts; break; case MG_BACKGROUND: *VALUE(ColorA) = _mgc->background; break; case MG_SHADER: *VALUE(mgshadefunc) = _mgc->astk->shader; break; case MG_SHADERDATA: *VALUE(void *) = _mgc->astk->shaderdata; break; case MG_SPACE: *VALUE(int) = _mgc->space; break; case MG_NDCTX: *VALUE(mgNDctx *) = _mgc->NDctx; break; case MG_ZNUDGE: *VALUE(float) = _mgc->zfnudge; break; case MG_PSFILE: *VALUE(FILE *) = _mgpsc->file; break; case MG_PSFILEPATH: *VALUE(char *) = _mgpsc->filepath; break; default: OOGLError (0, "mgps_ctxget: undefined option: %d\n", attr); return -1; } return 1; #undef VALUE } /*----------------------------------------------------------------------- * Function: mgps_feature * Description: determine whether the NULL device has a particular feature * Args: feature: feature to test for * Returns: -1 (means feature is not present) * Notes: PS device is rather featureless at present, :-) * DEVICE USE: forbidden --- devices have their own mgxx_feature() */ int mgps_feature( int feature ) { return -1; } /*----------------------------------------------------------------------- * Function: mgps_ctxcreate * Description: create a new MG context for the PS device * Args: a1, ...: list of attribute-value pairs * Returns: ptr to new context * Author: daeron */ mgcontext * mgps_ctxcreate( int a1, ... ) { va_list alist; _mgc = (mgcontext*)mgps_newcontext( OOGLNewE(mgpscontext, "mgps_ctxcreate") ); mgps_initpsdevice(); va_start(alist, a1); if (_mgps_ctxset(a1, &alist) == -1) { mgps_ctxdelete(_mgc); } va_end(alist); return _mgc; } /*----------------------------------------------------------------------- * Function: mgps_ctxdelete * Description: delete an MG context for the PS device * Args: *ctx: ptr to context to delete * Returns: nothing * Author: daeron */ void mgps_ctxdelete( mgcontext *ctx ) { mgpscontext *_mgx = (mgpscontext *)ctx; if(ctx->devno != MGD_PS) { mgcontext *was = _mgc; mgctxselect(ctx); mgctxdelete(ctx); if (was != ctx) mgctxselect(was); } else { vvfree(&_mgx->room); mg_ctxdelete(ctx); if (ctx == _mgc) _mgc = NULL; } } /*----------------------------------------------------------------------- * Function: mgps_ctxselect * Description: select the current context * Args: *ctx: the context to select * Returns: 0 (why ???) * Author: daeron */ int mgps_ctxselect( mgcontext *ctx ) { if (ctx == NULL || ctx->devno != MGD_PS) { return mg_ctxselect(ctx); } /* PS context */ _mgc = ctx; return(0); } /*----------------------------------------------------------------------- * Function: mgps_pushtransform * Description: push the mg context xform stack * Returns: nothing */ int mgps_pushtransform( void ) { mg_pushtransform(); return 0; } /*----------------------------------------------------------------------- * Function: mgps_poptransform * Description: pop the mg context xform stack * Returns: nothing */ int mgps_poptransform( void ) { mg_poptransform(); return 0; } void mgps_sync( void ) { } void mgps_worldbegin( void ) { mg_worldbegin(); mgps_newdisplaylist(); _mgpsc->znudgeby = 0.0; } void mgps_worldend( void ) { if (_mgpsc->file == NULL) return; mgps_sortdisplaylist(); mgps_showdisplaylist(_mgpsc->file); } WnWindow * mgpswindow(WnWindow *win) { _mgpsc->born = 1; mgps_setwindow(win, 1); mgps_init_zrange(); return(win); } void mgps_setshader(mgshadefunc shader) { struct mgastk *ma = _mgc->astk; unsigned short wasusing = ma->flags & MGASTK_SHADER; ma->shader = shader; if (shader != NULL && IS_SHADED(ma->ap.shading)) { ma->flags |= MGASTK_SHADER; } else { ma->flags &= ~MGASTK_SHADER; } if((ma->flags & MGASTK_SHADER) != wasusing) mgps_appearance(_mgc->astk, APF_SHADING); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/mg/ps/mgpsclip.c0000644000175000017500000001545012310110201014617 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgpsP.h" #define WCLIPPLANE 0.001 /* This is as close as we get to the eyeplane */ #define XLEFTCLIP 0.0 #define XRIGHTCLIP 0.0 #define YTOPCLIP 0.0 #define YBOTTOMCLIP 0.0 #define ZNEARCLIP (-1.0) #define ZFARCLIP 1.0 static int xyz[6], clipvertnum = 0; static mgpsprim *prim1, *prim2, *primtemp; static CPoint3 *vts1, *vts2, *vtstemp; /* Function: mgps_dividew() Description: Divide out w coordinate (*after* clipping against WCLIPPLANE) Author: Daeron Meyer */ void mgps_dividew(void) { CPoint3 *curr; float w; int n; for (n = 0; n < prim1->numvts; n++) { curr = &(vts1[n]); w = curr->w; curr->x /= w; curr->y /= w; curr->z /= w; curr->z += _mgpsc->znudgeby; if (curr->x < XLEFTCLIP) xyz[0]++; if (curr->x >= (float)_mgpsc->xsize - XRIGHTCLIP) xyz[1]++; if (curr->y < YTOPCLIP) xyz[2]++; if (curr->y >= (float)_mgpsc->ysize - YBOTTOMCLIP) xyz[3]++; if (curr->z < ZNEARCLIP) xyz[4]++; if (curr->z >= ZFARCLIP) xyz[5]++; } } /* Function: mgps_cliptoplane() Description: Clip polygon against a coordinate axis plane Author: Daeron Meyer */ void mgps_cliptoplane(int coord, float plane, float sign) { CPoint3 *prev, *curr, *dest; float i, i1, i2, *c1, *p1, *d1; int n; #ifdef DEBUGCLIP fprintf(stderr, "Clip %d, plane=%f, sign=%f\n", coord, plane, sign); #endif prim2->numvts = 0; prev = &(vts1[prim1->numvts - 1]); i1 = sign * ((float *) prev) [coord] - plane; for (curr=vts1, n=prim1->numvts; n > 0; n--, prev=curr, i1=i2, curr++) { i2 = sign * ((float *) curr) [coord] - plane; if ((i1 <= 0.0) ^ (i2 <= 0.0)) { i = i1/(i1 - i2); dest = &(vts2[prim2->numvts]); dest->x = prev->x + i * (curr->x - prev->x); dest->y = prev->y + i * (curr->y - prev->y); dest->z = prev->z + i * (curr->z - prev->z); dest->w = prev->w + i * (curr->w - prev->w); if ((i1 <= 0.0) || (prev->drawnext == 0)) dest->drawnext = 0; else dest->drawnext = 1; c1 = (float *) &(curr->vcol); p1 = (float *) &(prev->vcol); d1 = (float *) &(dest->vcol); d1[0] = p1[0] + i * (c1[0] - p1[0]); d1[1] = p1[1] + i * (c1[1] - p1[1]); d1[2] = p1[2] + i * (c1[2] - p1[2]); d1[3] = p1[3] + i * (c1[3] - p1[3]); prim2->numvts++; } if (i2 <= 0.0) { vts2[prim2->numvts] = *curr; prim2->numvts++; } } #ifdef DEBUGCLIP for (n = 0; n < prim2->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts2[n].x, vts2[n].y, vts2[n].z, vts2[n].w, vts2[n].drawnext); } #endif } /* Function: mgps_primclip() Description: Clip a polygon to fit in the viewing volume Author: Daeron Meyer */ int mgps_primclip(mgpsprim *aprim) { static mgpsprim clip; static int mykind, n; static vvec clipverts; static int intersectw; xyz[0]=0; xyz[1]=0; xyz[2]=0; xyz[3]=0; xyz[4]=0; xyz[5]=0; /* give ourselves more space for vertex data if needed */ if ((aprim->numvts * 2) > clipvertnum) { if (!clipvertnum) VVINIT(clipverts, CPoint3, clipvertnum); clipvertnum = aprim->numvts * 2; vvneeds(&clipverts, clipvertnum); } /* We might need more space for the final polygon since clipping can produce a polygon with more vertices than it had to begin with. We'll err on the side of safety: */ if ((_mgpsc->mysort->cvert + aprim->numvts) > _mgpsc->mysort->pvertnum) { _mgpsc->mysort->pvertnum *= 2; vvneeds(&(_mgpsc->mysort->pverts), _mgpsc->mysort->pvertnum); } mykind = aprim->mykind; prim1 = aprim; prim2 = &clip; vts1 = &(VVEC(_mgpsc->mysort->pverts, CPoint3)[prim1->index]); vts2 = &(VVEC(clipverts, CPoint3)[0]); if ((mykind==PRIM_LINE) || (mykind==PRIM_SLINE)) vts1[prim1->numvts-1].drawnext = 0; prim2->index = 0; prim2->numvts = prim1->numvts; #define CLIP_POLYS_AND_SWAP(a, b, c) { \ mgps_cliptoplane(a, b, c); \ if (prim2->numvts == 0) { aprim->numvts = 0; return PRIM_INVIS; } \ vtstemp = vts2; vts2 = vts1; vts1 = vtstemp; \ primtemp = prim2; prim2 = prim1; prim1 = primtemp; \ } #ifdef DEBUGCLIP fprintf(stderr, "BEGIN-CLIP\n"); fprintf(stderr, "INITIAL POLY:\n"); for (n=0; n < aprim->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts1[n].x, vts1[n].y, vts1[n].z, vts1[n].w, vts1[n].drawnext); } fprintf(stderr,"===========================\n"); #endif intersectw = 0; for (n = 0; (n < aprim->numvts) && !intersectw; n++) { if (vts1[n].w < WCLIPPLANE) intersectw = 1; } if (intersectw) CLIP_POLYS_AND_SWAP(3, -WCLIPPLANE, -1.0); mgps_dividew(); n = prim1->numvts; if (!intersectw && (xyz[0]+xyz[1]+xyz[2]+xyz[3]+xyz[4]+xyz[5] == 0)) return mykind; else if (xyz[0] == n || xyz[1] == n || xyz[2] == n || xyz[3] == n || xyz[4] == n || xyz[5] == n) return PRIM_INVIS; if (xyz[0]) CLIP_POLYS_AND_SWAP(0, -XLEFTCLIP, -1.0); if (xyz[1]) CLIP_POLYS_AND_SWAP(0, (float)_mgpsc->xsize-XRIGHTCLIP, 1.0); if (xyz[2]) CLIP_POLYS_AND_SWAP(1, -YTOPCLIP, -1.0); if (xyz[3]) CLIP_POLYS_AND_SWAP(1, (float)_mgpsc->ysize-YBOTTOMCLIP, 1.0); if (xyz[4]) CLIP_POLYS_AND_SWAP(2, -ZNEARCLIP, -1.0); if (xyz[5]) CLIP_POLYS_AND_SWAP(2, ZFARCLIP, 1.0); if (aprim == prim2) /* If the vertex data ended up in the local vertex list, then we need to copy it back to the global vertex list */ { prim2->numvts = prim1->numvts; /* for (n=0; n < aprim->numvts; n++) { vts2[n] = vts1[n]; } */ memcpy(vts2, vts1, sizeof(CPoint3) * prim1->numvts); } #ifdef DEBUGCLIP fprintf(stderr, "FINAL POLY:\n"); for (n=0; n < aprim->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts1[n].x, vts1[n].y, vts1[n].z, vts1[n].w, vts1[n].drawnext); } fprintf(stderr, "END-CLIP\n"); #endif return mykind; } geomview-1.9.5/src/lib/mg/ps/mgpsdraw.c0000644000175000017500000004356112310110201014631 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgpsP.h" #include "polylistP.h" #include "mgpswindows.h" /* Author: Daeron Meyer */ void mgps_polygon( int nv, HPoint3 *v, int nn, Point3 *n, int nc, ColorA *c ); void mgps_mesh(int wrap, int nu, int nv, HPoint3 *p, Point3 *n, Point3 *nq, ColorA *c ); void mgps_line( HPoint3 *p1, HPoint3 *p2 ); void mgps_polyline( int nv, HPoint3 *verts, int nc, ColorA *colors, int wrap ); void mgps_polylist( int np, Poly *p, int nv, Vertex *v, int pl_flags ); void mgps_drawnormal(HPoint3 *p, Point3 *n); void mgps_closer(); void mgps_farther(); static ColorA *C2; /*----------------------------------------------------------------------- * Function: mgps_polygon * Description: draw a polygon * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgps_polygon(int nv, HPoint3 *V, int nn, Point3 *N, int nc, ColorA *C) { int count; HPoint3 *v; Point3 *n; int flag, ninc, smooth; /* fprintf(stderr,"X11: draw a polygon\n"); */ flag = _mgc->astk->ap.flag; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) nc = 0; ninc = (nn > 1); smooth = IS_SMOOTH(_mgc->astk->ap.shading); /* fprintf(stderr,"cinc = %d, nc = %d, nn = %d\n", cinc, nc, nn); */ if (nc == 0) C = (ColorA*)&_mgc->astk->ap.mat->diffuse; if ((flag & APF_FACEDRAW) && (flag & APF_EDGEDRAW)) { /* put polygon in display list */ if (smooth && (nc > 0)) mgps_add(MGX_BGNSEPOLY, 0, NULL, NULL); else mgps_add(MGX_BGNEPOLY, 0, NULL, NULL); mgps_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); /* edge color */ mgps_add(MGX_COLOR, 0, NULL, C); /* face color */ if (smooth) mgps_add(MGX_CVERTEX, nv, V, C); else mgps_add(MGX_VERTEX, nv, V, NULL); mgps_add(MGX_END, 0, NULL, NULL); } else if (flag & APF_FACEDRAW) { /* put polygon in display list */ if (smooth) mgps_add(MGX_BGNSPOLY, 0, NULL, NULL); else mgps_add(MGX_BGNPOLY, 0, NULL, NULL); mgps_add(MGX_COLOR, 0, NULL, C); if (smooth && (nc > 0)) mgps_add(MGX_CVERTEX, nv, V, C); else mgps_add(MGX_VERTEX, nv, V, NULL); mgps_add(MGX_END, 0, NULL, NULL); } else if (flag & APF_EDGEDRAW) { mgps_add(MGX_BGNLINE, 0, NULL, NULL); mgps_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); mgps_add(MGX_VERTEX, nv, V, NULL); mgps_add(MGX_VERTEX, 1, V, NULL); mgps_add(MGX_END, 0, NULL, NULL); } if (flag & APF_NORMALDRAW) { mgps_closer(); mgps_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->normalcolor); for (n = N, v = V, count = 0; count 1) * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgps_fatpoint(HPoint3 *v) { HPoint3 a; HPoint3 *p, *q; float vw; /* fprintf(stderr,"X11: make a fat-point\n"); */ if (!(_mgc->has & HAS_POINT)) mg_makepoint(); /* Compute w component of point after projection to screen */ vw = v->x * _mgc->O2S[0][3] + v->y * _mgc->O2S[1][3] + v->z * _mgc->O2S[2][3] + v->w * _mgc->O2S[3][3]; if (vw <= 0) return; #define PUT(p) \ a.x = v->x + p->x*vw; a.y = v->y + p->y*vw; \ a.z = v->z + p->z*vw; a.w = v->w + p->w*vw; \ mgps_add(MGX_VERTEX, 1, &a, NULL); p = VVEC(_mgc->point, HPoint3); q = p + VVCOUNT(_mgc->point); mgps_add(MGX_BGNPOLY, 0, NULL, NULL); do { PUT(p); } while (++p < q); mgps_add(MGX_END, 0, NULL, NULL); } /*----------------------------------------------------------------------- * Function: mgps_polyline * Description: draw a polyline (possibly more than 2 vertices) * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgps_polyline( int nv, HPoint3 *v, int nc, ColorA *c, int wrapped ) { int remain; /* fprintf(stderr,"X11: draw a polyline\n"); */ if (!(wrapped & 2)) { if (_mgpsc->znudge) mgps_closer(); } if (nv == 1) { if (nc > 0) mgps_add(MGX_ECOLOR, 0, NULL, c); if (_mgc->astk->ap.linewidth > 1) { mgps_add(MGX_COLOR, 0, NULL, c); mgps_fatpoint(v); } else { mgps_add(MGX_BGNSLINE, 0, NULL, NULL); mgps_add(MGX_CVERTEX, 1, v, c); mgps_add(MGX_END, 0, NULL, NULL); } } else if (nv > 0) { mgps_add(MGX_BGNSLINE, 0, NULL, NULL); if (wrapped & 1) { if (nc > 0) { mgps_add(MGX_ECOLOR, 0, NULL, (c + nc - 1)); mgps_add(MGX_CVERTEX, 1, (v + nv - 1), (c + nc - 1)); } else mgps_add(MGX_CVERTEX, 1, (v + nv - 1), c); } for (;;) { remain = nv > 254 ? 254 : nv; nv -= remain; do { if (--nc > 0) { mgps_add(MGX_ECOLOR, 0, NULL, c); mgps_add(MGX_CVERTEX, 1, v++, c++); } else mgps_add(MGX_CVERTEX, 1, v++, c); } while (--remain > 0); if (nv == 0) break; if (nc > 0) mgps_add(MGX_ECOLOR, 0, NULL, c); mgps_add(MGX_CVERTEX, 1, v, c); mgps_add(MGX_END, 0, NULL, NULL); mgps_add(MGX_BGNSLINE, 0, NULL, NULL); } mgps_add(MGX_END, 0, NULL, NULL); } if (!(wrapped & 4) && _mgpsc->znudge) mgps_farther(); } /*----------------------------------------------------------------------- * Function: mgps_polylist * Description: draws a Polylist: collection of Polys * Author: Daeron Meyer * Notes: see mg.doc */ void mgps_polylist( int np, Poly *_p, int nv, Vertex *V, int pl_flags ) { int i, j; Poly *p; Vertex **v, *vp, **vh; struct mgastk *ma = _mgc->astk; int plflags = pl_flags; int flag, shading; int nonsurf = -1; flag = ma->ap.flag; shading = ma->ap.shading; /* fprintf(stderr,"X11: draw a polylist %d\n",np); */ switch(shading) { case APF_FLAT: plflags &= ~PL_HASVN; if (plflags & PL_HASPCOL) { plflags &= ~PL_HASVCOL; } break; case APF_SMOOTH: plflags &= ~PL_HASPN; break; case APF_VCFLAT: plflags &= ~PL_HASVN; break; default: plflags &= ~(PL_HASVN|PL_HASPN); break; } if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) plflags &= ~(PL_HASVCOL | PL_HASPCOL); if (flag & APF_FACEDRAW) { for (p = _p, i = 0; i < np; i++, p++) { v = p->v; if ((j = p->n_vertices) <= 2) nonsurf = i; else { if (flag & APF_EDGEDRAW) { if (shading == APF_FLAT || shading == APF_CONSTANT) { mgps_add(MGX_BGNEPOLY, 0, NULL, NULL); } else if (plflags & PL_HASVCOL) mgps_add(MGX_BGNSEPOLY, 0, NULL, NULL); else mgps_add(MGX_BGNEPOLY, 0, NULL, NULL); mgps_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); } else { if (shading == APF_FLAT || shading == APF_CONSTANT) { mgps_add(MGX_BGNPOLY, 0, NULL, NULL); } else if (plflags & PL_HASVCOL) mgps_add(MGX_BGNSPOLY, 0, NULL, NULL); else mgps_add(MGX_BGNPOLY, 0, NULL, NULL); } if (plflags & PL_HASPCOL) mgps_add(MGX_COLOR, 0, NULL, &p->pcol); else if (plflags & PL_HASVCOL) /* if we have per vertex */ mgps_add(MGX_COLOR, 0, NULL, &(*v)->vcol); else mgps_add(MGX_COLOR, 0, NULL, &(ma->ap.mat->diffuse)); vh = v; do { if (plflags & PL_HASVCOL) mgps_add(MGX_CVERTEX, 1, &(*v)->pt, &(*v)->vcol); else mgps_add(MGX_CVERTEX, 1, &(*v)->pt, &(*vh)->vcol); v++; } while (--j > 0); mgps_add(MGX_END, 0, NULL, NULL); } } } if (flag & (APF_EDGEDRAW | APF_NORMALDRAW) || nonsurf > 0) { if (_mgpsc->znudge) mgps_closer(); if (flag & APF_EDGEDRAW && !(flag & APF_FACEDRAW)) { mgps_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); for (p = _p, i = 0; i < np; i++, p++) { mgps_add(MGX_BGNLINE, 0, NULL, NULL); for (j = 0, v = p->v; j < p->n_vertices; j++, v++) mgps_add(MGX_VERTEX, 1, &(*v)->pt, NULL); mgps_add(MGX_VERTEX, 1, &(*(p->v))->pt, NULL); mgps_add(MGX_END, 0, NULL, NULL); } } if (flag & APF_NORMALDRAW) { mgps_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->normalcolor); if (pl_flags & PL_HASPN) { for (p = _p, i = 0; i < np; i++, p++) { for (j = 0, v = p->v; j < p->n_vertices; j++, v++) mgps_drawnormal(&(*v)->pt, &p->pn); } } else if (pl_flags & PL_HASVN) { for (vp = V, i = 0; i < nv; i++, vp++) mgps_drawnormal(&vp->pt, &vp->vn); } } for (p = _p, i = 0; i <= nonsurf; p++, i++) { v = p->v; switch (j = p->n_vertices) { case 1: mgps_add(MGX_BGNLINE, 0, NULL, NULL); if (pl_flags & PL_HASVCOL) mgps_add(MGX_ECOLOR, 0, NULL, &(*v)->vcol); mgps_add(MGX_VERTEX, 1, &(*v)->pt, NULL); mgps_add(MGX_END, 0, NULL, NULL); break; case 2: mgps_add(MGX_BGNLINE, 0, NULL, NULL); do { if (pl_flags & PL_HASVCOL) mgps_add(MGX_ECOLOR, 0, NULL, &(*v)->vcol); mgps_add(MGX_VERTEX, 1, &(*v)->pt, NULL); v++; } while (--j > 0); mgps_add(MGX_END, 0, NULL, NULL); break; } } if (_mgpsc->znudge) mgps_farther(); } } #define HAS_N 1 #define HAS_C 2 #define HAS_SMOOTH 4 /*----------------------------------------------------------------------- * Function: mgpspolymeshrow * Description: draw one row of a mesh * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgpspolymeshrow(int wrap, int has, int off, int count, HPoint3 *P, Point3 *N, ColorA *C, int flag, float *CE, int first) { int k; int edges = flag & APF_EDGEDRAW; int faces = flag & APF_FACEDRAW; if (wrap & MM_UWRAP) { k = count - 1; if (edges && faces) { if (has & HAS_SMOOTH) mgps_add(MGX_BGNSEPOLY, 0, NULL, NULL); else mgps_add(MGX_BGNEPOLY, 0, NULL, NULL); mgps_add(MGX_ECOLOR, 0, NULL, CE); } else if (faces) { if (has & HAS_SMOOTH) mgps_add(MGX_BGNSPOLY, 0, NULL, NULL); else mgps_add(MGX_BGNPOLY, 0, NULL, NULL); } else { mgps_add(MGX_BGNLINE, 0, NULL, NULL); mgps_add(MGX_ECOLOR, 0, NULL, CE); } if (C) { mgps_add(MGX_COLOR, 0, NULL, C+off+k); C2 = C+off+k; } else mgps_add(MGX_COLOR, 0, NULL, C2); if (has & HAS_SMOOTH) { if (C) { mgps_add(MGX_CVERTEX, 1, P+off+k, C+off+k); mgps_add(MGX_CVERTEX, 1, P+k, C+k); mgps_add(MGX_CVERTEX, 1, P, C); mgps_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C+off; } else { mgps_add(MGX_CVERTEX, 1, P+off+k, C2); mgps_add(MGX_CVERTEX, 1, P+k, C2); mgps_add(MGX_CVERTEX, 1, P, C2); mgps_add(MGX_CVERTEX, 1, P+off, C2); } } else { mgps_add(MGX_VERTEX, 1, P+off+k, NULL); mgps_add(MGX_VERTEX, 1, P+k, NULL); mgps_add(MGX_VERTEX, 1, P, NULL); mgps_add(MGX_VERTEX, 1, P+off, NULL); } mgps_add(MGX_END, 0, NULL, NULL); } k = count; do { if (edges && faces) { if (has & HAS_SMOOTH) mgps_add(MGX_BGNSEPOLY, 0, NULL, NULL); else mgps_add(MGX_BGNEPOLY, 0, NULL, NULL); mgps_add(MGX_ECOLOR, 0, NULL, CE); } else if (faces) { if (has & HAS_SMOOTH) mgps_add(MGX_BGNSPOLY, 0, NULL, NULL); else mgps_add(MGX_BGNPOLY, 0, NULL, NULL); } else { mgps_add(MGX_BGNLINE, 0, NULL, NULL); mgps_add(MGX_ECOLOR, 0, NULL, CE); /* ADDED */ if (first) mgps_add(MGX_VERTEX, 1, P+1+off, NULL); /* END */ } if (C) { mgps_add(MGX_COLOR, 0, NULL, C+off); C2 = C+off; } if (has & HAS_SMOOTH) { if (C) { mgps_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C; } else mgps_add(MGX_CVERTEX, 1, P+off, C2); if (C) { mgps_add(MGX_CVERTEX, 1, P++, C++); C2 = C; } else mgps_add(MGX_CVERTEX, 1, P++, C2); if (C) { mgps_add(MGX_CVERTEX, 1, P, C); C2 = C; } else mgps_add(MGX_CVERTEX, 1, P, C2); if (C) { mgps_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C; } else mgps_add(MGX_CVERTEX, 1, P+off, C2); } else { mgps_add(MGX_VERTEX, 1, P+off, NULL); if (C) C++; if (N) N++; mgps_add(MGX_VERTEX, 1, P++, NULL); mgps_add(MGX_VERTEX, 1, P, NULL); mgps_add(MGX_VERTEX, 1, P+off, NULL); } mgps_add(MGX_END, 0, NULL, NULL); } while (--k > 1); } /*----------------------------------------------------------------------- * Function: mgpssubmesh * Description: divide up mesh and draw by rows * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgpssubmesh(int wrap, int nu, int nv, int umin, int umax, int vmin, int vmax, HPoint3 *meshP, Point3 *meshN, ColorA *meshC) { int v; int ucnt; HPoint3 *P; Point3 *N; ColorA *C; int prev; int du; int i; int has; Appearance *ap; if (nu <= 0 || nv <= 0) return; ap = &_mgc->astk->ap; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) meshC = 0; has = 0; if (meshN && !(_mgc->astk->flags & MGASTK_SHADER)) has = HAS_N; if (meshC) has |= HAS_C; if (IS_SMOOTH(ap->shading)) has |= HAS_SMOOTH; if ( ap->flag & (APF_FACEDRAW | APF_EDGEDRAW) ) /* BUG? */ { if (!(has & HAS_C)) mgps_add(MGX_COLOR, 0, NULL, &ap->mat->diffuse); C2 = (ColorA *) &ap->mat->diffuse; v = vmax - vmin + 1; du = umin + vmin * nu; if (wrap & MM_VWRAP) { prev = nu * (v - 1); } else { du += nu; prev = -nu; v--; } do { P = meshP + du; N = meshN + du; C = meshC + du; ucnt = umax - umin + 1; mgpspolymeshrow(wrap, has, prev, ucnt, P, has & HAS_N ? N : NULL, has & HAS_C ? C : NULL, ap->flag, (float *)&ap->mat->edgecolor, (int)(v!=1)); prev = -nu; du += nu; } while (--v > 0); } if (ap->flag & APF_NORMALDRAW && meshN != NULL) { mgps_add(MGX_ECOLOR, 0, NULL, &ap->mat->normalcolor); if (_mgpsc->znudge) mgps_closer(); for (i = nu*nv, P = meshP, N = meshN; --i >= 0; P++, N++) mgps_drawnormal(P, N); if (_mgpsc->znudge) mgps_farther(); } } /*----------------------------------------------------------------------- * Function: mgps_mesh * Description: draw a mesh * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgps_mesh(int wrap, int nu, int nv, HPoint3 *P, Point3 *N, Point3 *NQ, ColorA *C ) { mgpssubmesh( wrap, nu, nv, 0, nu-1, 0, nv-1, P, N, C); } /*-----------------------------------------------------------------------* * end of mesh drawing functions: * *-----------------------------------------------------------------------*/ /* * Z-shift routines: for moving edges closer than faces, etc. */ void mgps_init_zrange() { _mgpsc->znudge = 1; _mgpsc->znudgeby = 0.0; } void mgps_closer() { /* _mgpsc->znudgeby = 0.001; */ } void mgps_farther() { _mgpsc->znudgeby = 0.0; } void mgps_findcam() { } /* There is a basic problem now with 4-d points and 3-d normal vectors. For now, we'll just ignore the 4-th coordinate of the point when computing the tip of the normal vector. This will work OK with all existing models, but for genuine 4-d points it won't work. But, come to think of it, what is the correct interpretation of the normal vector when the points live in 4-d? */ void mgps_drawnormal(HPoint3 *p, Point3 *n) { Point3 tp; HPoint3 end; Pt3Coord scale, w, s; /* fprintf(stderr,"X11: draw a normal\n"); */ if (p->w <= 0.0) return; if (p->w != 1) { HPt3ToPt3(p, &tp); p = (HPoint3 *)(void *)&tp; } scale = _mgc->astk->ap.nscale; if (_mgc->astk->ap.flag & APF_EVERT) { HPoint3 *cp = &_mgc->cpos; if (!(_mgc->has & HAS_CPOS)) { mg_findcam(); } if ((w = cp->w) != 1.0 && w != 0.0) { s = (p->x*w-cp->x)*n->x + (p->y*w-cp->y)*n->y + (p->z*w-cp->z)*n->z; } else { s = (p->x-cp->x)*n->x + (p->y-cp->y)*n->y + (p->z-cp->z)*n->z; } if (s > 0) { scale = -scale; } } end.x = p->x + scale*n->x; end.y = p->y + scale*n->y; end.z = p->z + scale*n->z; end.w = 1.0; mgps_add(MGX_BGNLINE, 0, NULL, NULL); mgps_add(MGX_VERTEX, 1, p, NULL); mgps_add(MGX_VERTEX, 1, &end, NULL); mgps_add(MGX_END, 0, NULL, NULL); } geomview-1.9.5/src/lib/mg/ps/mgpstri.c0000644000175000017500000002715112310110201014467 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "polylistP.h" #include "hpoint3.h" #include "mg.h" #include "mgP.h" #include "mgps.h" #include "mgpsP.h" #include "mgpstri.h" #define TOL 0.05 #define AREA 25000 #ifndef max # define max(a,b) ((a) > (b) ? (a) : (b)) #endif /*static double areaThreshold;*/ static FILE *psout; static void smoothLine(CPoint3 *p0, CPoint3 *p1); static void smoothTriangle(CPoint3 *p0, CPoint3 *p1, CPoint3 *p2); /*static double triArea(double *p0, double *p1, double *p2);*/ static double cdelta(double *p0, double *p1); static void subdivtri(double *v0, double *v1, double *v2); static void plerp(double *v0, double *v1, double *l); static void outtri(double *v0, double *v1, double *v2); /* PS page initialization stuff follows */ #define PNTS (72.0) #define BORDPAGEMARGIN (0.25) #define BORDPAGEXSIZE ( 8.5-2.0*BORDPAGEMARGIN) #define BORDPAGEYSIZE (11.0-2.0*BORDPAGEMARGIN) #define FULLPAGEMARGIN (0.00) #define FULLPAGEXSIZE ( 8.5-2.0*FULLPAGEMARGIN) #define FULLPAGEYSIZE (11.0-2.0*FULLPAGEMARGIN) static double pagexsize = BORDPAGEXSIZE; static double pageysize = BORDPAGEYSIZE; static double pagemargin = BORDPAGEMARGIN; void MGPS_startPS(FILE *outf, ColorA *col, double aspect, int width, int height) { double imgxinches, imgyinches; double pagexinches, pageyinches, pageaspect; double dx, dy; double xmargin, ymargin; time_t tm; psout = outf; time(&tm); fprintf(psout,"%%!PS-Adobe-2.0 EPSF-1.2\n"); fprintf(psout,"%%%%Title: Geomview Snapshot\n"); fprintf(psout,"%%%%Creator: Geomview\n"); fprintf(psout,"%%%%CreationDate: %s", ctime(&tm)); fprintf(psout,"%%%%For: %s\n", getenv("USER")); /* areaThreshold = (width*height)/(double)AREA;*/ dx = width; dy = height; if (aspect>1.0) { pagexinches = pageysize; pageyinches = pagexsize; } else { pagexinches = pagexsize; pageyinches = pageysize; } pageaspect = pagexinches/pageyinches; if (aspect<=pageaspect) { imgyinches = pageyinches; imgxinches = imgyinches*aspect; xmargin = pagemargin+(pagexinches-imgxinches)/2.0; ymargin = pagemargin; } else { imgxinches = pagexinches; imgyinches = imgxinches/aspect; xmargin = pagemargin; ymargin = pagemargin+(pageyinches-imgyinches)/2.0; } if (aspect>1.0) fprintf(psout,"%%%%BoundingBox: %d %d %d %d\n", (int)(PNTS*ymargin), (int)(PNTS*xmargin), (int)(PNTS*(ymargin+imgyinches)), (int)(PNTS*(xmargin+imgxinches))); else fprintf(psout,"%%%%BoundingBox: %d %d %d %d\n", (int)(PNTS*xmargin), (int)(PNTS*ymargin), (int)(PNTS*(xmargin+imgxinches)), (int)(PNTS*(ymargin+imgyinches))); fprintf(psout,"%%%%EndComments\n"); fprintf(psout,"gsave\n"); fprintf(psout,"1 setlinecap 1 setlinejoin\n"); if (aspect>1.0) { fprintf(psout,"%f %f translate\n",0.0,PNTS*FULLPAGEYSIZE); fprintf(psout,"-90.0 rotate\n"); } fprintf(psout,"%f %f translate\n", PNTS*xmargin, PNTS*ymargin); fprintf(psout,"%f %f scale\n",PNTS*imgxinches/dx,PNTS*imgyinches/dy); /* Now set up commands */ fprintf(psout,"[ %% stack mark\n"); fprintf(psout,"/poly {\n"); fprintf(psout," setrgbcolor newpath moveto\n"); fprintf(psout," counttomark 2 idiv { lineto } repeat closepath fill\n"); fprintf(psout,"} bind def\n"); fprintf(psout,"/epoly {\n"); fprintf(psout," setrgbcolor newpath moveto\n"); fprintf(psout," counttomark 4 sub 2 idiv { lineto } repeat closepath\n"); fprintf(psout,"gsave fill grestore setrgbcolor setlinewidth stroke\n"); fprintf(psout,"} bind def\n"); fprintf(psout,"/lines {\n"); fprintf(psout," setlinewidth setrgbcolor newpath moveto\n"); fprintf(psout," counttomark 2 idiv { lineto } repeat stroke\n"); fprintf(psout,"} bind def\n"); fprintf(psout,"/clines {\n"); fprintf(psout," setlinewidth setrgbcolor newpath moveto\n"); fprintf(psout," counttomark 2 idiv { lineto } repeat closepath stroke\n"); fprintf(psout,"} bind def\n"); fprintf(psout,"/circ {\n"); fprintf(psout," setrgbcolor newpath 0 360 arc fill\n"); fprintf(psout,"} bind def\n"); fprintf(psout,"/tri {\n"); fprintf(psout," setrgbcolor newpath moveto lineto lineto\n"); fprintf(psout," closepath fill\n"); fprintf(psout,"} bind def\n"); fprintf(psout,"/l {\n"); fprintf(psout," setrgbcolor newpath moveto lineto stroke\n"); fprintf(psout,"} bind def\n"); fprintf(psout,"%%\n"); fprintf(psout,"0 0 moveto %d 0 lineto %d %d lineto 0 %d lineto\n", width, width, height, height); fprintf(psout,"%g %g %g setrgbcolor closepath fill\n", col->r, col->g, col->b); } void MGPS_finishPS(void) { fprintf(psout,"pop\ngrestore\nshowpage\n\n"); } void MGPS_polyline(CPoint3 *pts, int num, double width, int *col) { int i; if (num == 1) { fprintf(psout, "%g %g %g %g %g %g circ\n", pts[0].x, pts[0].y, (width + 1.0) / 2.0, col[0]/255.0, col[1]/255.0, col[2]/255.0); return; } for (i=0; ix; x0[1] = p0->y; x0[2] = p0->vcol.r; x0[3] = p0->vcol.g; x0[4] = p0->vcol.b; x1[0] = p1->x; x1[1] = p1->y; x1[2] = p1->vcol.r; x1[3] = p1->vcol.g; x1[4] = p1->vcol.b; delta = cdelta(x0, x1); num = max(1, delta/TOL); for (i=0; ix + (p1->x - p0->x)*i/(double)num, p0->y + (p1->y - p0->y)*i/(double)num, p0->x + (p1->x - p0->x)*(i+1)/(double)num, p0->y + (p1->y - p0->y)*(i+1)/(double)num, p0->vcol.r + (p1->vcol.r - p1->vcol.r)*i/(double)num, p0->vcol.g + (p1->vcol.g - p1->vcol.g)*i/(double)num, p0->vcol.b + (p1->vcol.b - p1->vcol.b)*i/(double)num); } /* * pssubdivtriangle Draw a color shaded triangle by subdividing it in * C code and generating many small triangles. */ static void smoothTriangle(CPoint3 *p0, CPoint3 *p1, CPoint3 *p2) { double x0[5], x1[5], x2[5]; x0[0] = p0->x; x0[1] = p0->y; x0[2] = p0->vcol.r; x0[3] = p0->vcol.g; x0[4] = p0->vcol.b; x1[0] = p1->x; x1[1] = p1->y; x1[2] = p1->vcol.r; x1[3] = p1->vcol.g; x1[4] = p1->vcol.b; x2[0] = p2->x; x2[1] = p2->y; x2[2] = p2->vcol.r; x2[3] = p2->vcol.g; x2[4] = p2->vcol.b; subdivtri(x0,x1,x2); } static double cdelta(double *p0, double *p1) { double dr, dg, db; dr = p0[2] - p1[2]; if(dr<0) dr = -dr; dg = p0[3] - p1[3]; if(dg<0) dg = -dg; db = p0[4] - p1[4]; if(db<0) db = -db; return max(max(dr,dg),db); } #if 0 static double triArea(double *p0, double *p1, double *p2) { double a, b, c, s; a = sqrt((p1[0]-p0[0])*(p1[0]-p0[0]) + (p1[1]-p0[1])*(p1[1]-p0[1]) + (p1[2]-p0[2])*(p1[2]-p0[2])); b = sqrt((p2[0]-p0[0])*(p2[0]-p0[0]) + (p2[1]-p0[1])*(p2[1]-p0[1]) + (p2[2]-p0[2])*(p2[2]-p0[2])); c = sqrt((p1[0]-p2[0])*(p1[0]-p2[0]) + (p1[1]-p2[1])*(p1[1]-p2[1]) + (p1[2]-p2[2])*(p1[2]-p2[2])); s = (a+b+c)/2.0; return sqrt(s*(s-a)*(s-b)*(s-c)); } #endif #define NONE 0x0 #define D0 0x1 #define D1 0x2 #define D2 0x4 static void subdivtri(double *v0, double *v1, double *v2) { double d0, d1, d2; double i0[5]; double i1[5]; double i2[5]; int code; d0 = cdelta(v0,v1); d1 = cdelta(v1,v2); d2 = cdelta(v2,v0); code = NONE; if (d0 > TOL) code |= D0; if (d1 > TOL) code |= D1; if (d2 > TOL) code |= D2; /* if (triArea(v0, v1, v2) < areaThreshold) code = NONE; */ switch(code) { case NONE: outtri(v0,v1,v2); break; case D0: plerp(v0,v1,i0); subdivtri(v0,i0,v2); subdivtri(v2,i0,v1); break; case D1: plerp(v1,v2,i0); subdivtri(v1,i0,v0); subdivtri(v0,i0,v2); break; case D2: plerp(v2,v0,i0); subdivtri(v2,i0,v1); subdivtri(v1,i0,v0); break; case D0|D1: plerp(v0,v1,i0); plerp(v1,v2,i1); subdivtri(v0,i0,v2); subdivtri(v2,i0,i1); subdivtri(v1,i1,i0); break; case D1|D2: plerp(v1,v2,i0); plerp(v2,v0,i1); subdivtri(v1,i0,v0); subdivtri(v0,i0,i1); subdivtri(v2,i1,i0); break; case D2|D0: plerp(v2,v0,i0); plerp(v0,v1,i1); subdivtri(v2,i0,v1); subdivtri(v1,i0,i1); subdivtri(v0,i1,i0); break; case D2|D1|D0: plerp(v0,v1,i0); plerp(v1,v2,i1); plerp(v2,v0,i2); subdivtri(v0,i0,i2); subdivtri(v1,i1,i0); subdivtri(v2,i2,i1); subdivtri(i0,i1,i2); break; } } static void plerp(double *v0, double *v1, double *l) { l[0] = (v0[0]+v1[0])/2.0; l[1] = (v0[1]+v1[1])/2.0; l[2] = (v0[2]+v1[2])/2.0; l[3] = (v0[3]+v1[3])/2.0; l[4] = (v0[4]+v1[4])/2.0; } static void outtri(double *v0, double *v1, double *v2) { double ar, ag, ab; fprintf(psout,"%g %g ",v0[0],v0[1]); fprintf(psout,"%g %g ",v1[0],v1[1]); fprintf(psout,"%g %g ",v2[0],v2[1]); ar = (v0[2]+v1[2]+v2[2])/3.0; ag = (v0[3]+v1[3]+v2[3])/3.0; ab = (v0[4]+v1[4]+v2[4])/3.0; fprintf(psout,"%g %g %g tri\n",ar,ag,ab); } geomview-1.9.5/src/lib/mg/ps/mgpswindows.c0000644000175000017500000002171012310110201015356 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "mg.h" #include "mgP.h" #include "mgps.h" #include "mgpsP.h" #include "mgpstri.h" #include "windowP.h" #include "mgpswindows.h" static mgps_sort *mgpssort = NULL; static double curwidth = 1; /* Function: mgps_initpsdevice Description: allocate space for the display list, initialize mgcontext Author: Daeron Meyer */ int mgps_initpsdevice() { if (!mgpssort) { mgpssort = (mgps_sort *)malloc(sizeof(mgps_sort)); mgpssort->primnum = 1000; VVINIT(mgpssort->primsort, int, mgpssort->primnum); vvneeds(&(mgpssort->primsort), mgpssort->primnum); VVINIT(mgpssort->prims, mgpsprim, mgpssort->primnum); vvneeds(&(mgpssort->prims), mgpssort->primnum); mgpssort->pvertnum = 2024; VVINIT(mgpssort->pverts, CPoint3, mgpssort->pvertnum); vvneeds(&(mgpssort->pverts), mgpssort->pvertnum); } _mgpsc->mysort = mgpssort; return 1; } /* Function: Xmg_newdisplaylist Description: initialize display list Author: Daeron Meyer */ void mgps_newdisplaylist(void) { _mgpsc->mysort->cprim = 0; _mgpsc->mysort->cvert = 0; _mgpsc->mysort->maxverts = 0; _mgpsc->znudgeby = 0.0; } /* Function: mgps_add Description: add a primitive (polygon, vertex, line) to the display list Author: Daeron Meyer */ void mgps_add(int primtype, int numdata, void *data, void *cdata) { HPoint3 *vt = (HPoint3 *)data; ColorA *colarray = (ColorA *)cdata; float *col = (float *)cdata; CPoint3 *vts; int i; static mgpsprim *prim; static ColorA color; static float average_depth; static int numverts; static int ecolor[3]; switch (primtype) { case MGX_BGNLINE: case MGX_BGNSLINE: average_depth = 0.0; prim = &(VVEC(_mgpsc->mysort->prims, mgpsprim)[_mgpsc->mysort->cprim]); if (primtype == MGX_BGNLINE) prim->mykind = PRIM_LINE; else prim->mykind = PRIM_SLINE; prim->index = _mgpsc->mysort->cvert; prim->depth = -100000; /* very far behind the viewer */ numverts = 0; prim->ecolor[0] = ecolor[0]; prim->ecolor[1] = ecolor[1]; prim->ecolor[2] = ecolor[2]; prim->ewidth = curwidth; VVEC(_mgpsc->mysort->primsort, int)[_mgpsc->mysort->cprim] = _mgpsc->mysort->cprim; if (!(_mgc->has & HAS_S2O)) mg_findS2O(); mg_findO2S(); break; case MGX_BGNPOLY: case MGX_BGNSPOLY: case MGX_BGNEPOLY: case MGX_BGNSEPOLY: average_depth = 0.0; prim = &(VVEC(_mgpsc->mysort->prims, mgpsprim) [_mgpsc->mysort->cprim]); switch(primtype) { case MGX_BGNPOLY: prim->mykind = PRIM_POLYGON; break; case MGX_BGNSPOLY: prim->mykind = PRIM_SPOLYGON; break; case MGX_BGNEPOLY: prim->mykind = PRIM_EPOLYGON; break; case MGX_BGNSEPOLY: prim->mykind = PRIM_SEPOLYGON; break; } prim->ewidth = curwidth; prim->index = _mgpsc->mysort->cvert; prim->depth = -100000; /* very far behind the viewer */ numverts = 0; VVEC(_mgpsc->mysort->primsort, int)[_mgpsc->mysort->cprim] = _mgpsc->mysort->cprim; if (!(_mgc->has & HAS_S2O)) mg_findS2O(); mg_findO2S(); break; case MGX_VERTEX: for (i=0; imysort->pverts, CPoint3)[_mgpsc->mysort->cvert]); HPt3Transform(_mgc->O2S, &(vt[i]), (HPoint3 *) vts); vts->drawnext = 1; vts->vcol = color; _mgpsc->mysort->cvert++; numverts++; if (_mgpsc->mysort->cvert > _mgpsc->mysort->pvertnum) { _mgpsc->mysort->pvertnum*=2; vvneeds(&(_mgpsc->mysort->pverts), _mgpsc->mysort->pvertnum); } if (vts->z > prim->depth) prim->depth = vts->z; average_depth += vts->z; } break; case MGX_CVERTEX: for (i=0; imysort->pverts, CPoint3)[_mgpsc->mysort->cvert]); HPt3Transform(_mgc->O2S, &(vt[i]), (HPoint3 *) vts); vts->drawnext = 1; vts->vcol = colarray[i]; _mgpsc->mysort->cvert++; numverts++; if (_mgpsc->mysort->cvert > _mgpsc->mysort->pvertnum) { _mgpsc->mysort->pvertnum*=2; vvneeds(&(_mgpsc->mysort->pverts), _mgpsc->mysort->pvertnum); } if (vts->z > prim->depth) prim->depth = vts->z; average_depth += vts->z; } break; case MGX_COLOR: color = colarray[0]; break; case MGX_ECOLOR: ecolor[0] = (int)(255.0 * col[0]); ecolor[1] = (int)(255.0 * col[1]); ecolor[2] = (int)(255.0 * col[2]); break; case MGX_END: prim->numvts = numverts; if (numverts > _mgpsc->mysort->maxverts) _mgpsc->mysort->maxverts = numverts; average_depth += prim->depth; average_depth /= (float)(numverts+1); prim->depth = average_depth; prim->color[0] = (int)(255.0 * color.r); prim->color[1] = (int)(255.0 * color.g); prim->color[2] = (int)(255.0 * color.b); prim->ecolor[0] = ecolor[0]; prim->ecolor[1] = ecolor[1]; prim->ecolor[2] = ecolor[2]; if ((prim->mykind = mgps_primclip(prim)) == PRIM_INVIS) _mgpsc->mysort->cvert = prim->index; else { _mgpsc->mysort->cvert = prim->index + prim->numvts; _mgpsc->mysort->cprim++; } if (_mgpsc->mysort->cprim > _mgpsc->mysort->primnum) { _mgpsc->mysort->primnum*=2; vvneeds(&(_mgpsc->mysort->prims), _mgpsc->mysort->primnum); vvneeds(&(_mgpsc->mysort->primsort), _mgpsc->mysort->primnum); } break; default: fprintf(stderr,"unknown type of primitive.\n"); break; } } /* Function: mgps_primcomp Description: Depth sort by comparing two primitives in a call from qsort() (painters algorithm, no subdiv of polygons) Author: Daeron Meyer */ int mgps_primcomp(const void *a, const void *b) { mgpsprim *prim = VVEC(_mgpsc->mysort->prims, mgpsprim); if (prim[*(int*)a].depth < prim[*(int*)b].depth) return 1; else return -1; } /* Function: mgps_sortdisplaylist Description: Does depth sorting of primitives. Author: Daeron Meyer */ void mgps_sortdisplaylist(void) { static int *primp; primp = VVEC(_mgpsc->mysort->primsort, int); qsort(primp, _mgpsc->mysort->cprim, sizeof(int), &mgps_primcomp); } /* Function: mgps_showdisplaylist Description: render display list to display Author: Daeron Meyer, Tim Rowley */ void mgps_showdisplaylist(FILE *outf) { CPoint3 *vts; int ref, *primp; mgpsprim *prim, *prim2; static int width; static int height; WnGet(_mgc->win, WN_XSIZE, &width); WnGet(_mgc->win, WN_YSIZE, &height); MGPS_startPS(outf, &(_mgc->background), width/(double)height, width, height); primp = VVEC(_mgpsc->mysort->primsort, int); prim2 = VVEC(_mgpsc->mysort->prims, mgpsprim); vts = VVEC(_mgpsc->mysort->pverts, CPoint3); for (ref = 0; ref < _mgpsc->mysort->cprim; ref++) { prim = &(prim2[primp[ref]]); switch (prim->mykind) { case PRIM_POLYGON: MGPS_poly(vts+prim->index, prim->numvts, prim->color); break; case PRIM_SPOLYGON: MGPS_spoly(vts+prim->index, prim->numvts); break; case PRIM_EPOLYGON: MGPS_epoly(vts+prim->index, prim->numvts, prim->color, prim->ewidth, prim->ecolor); break; case PRIM_SEPOLYGON: MGPS_sepoly(vts+prim->index, prim->numvts, prim->ewidth, prim->ecolor); break; case PRIM_SLINE: MGPS_spolyline(vts+prim->index, prim->numvts, prim->ewidth); break; case PRIM_LINE: MGPS_polyline(vts+prim->index, prim->numvts, prim->ewidth, prim->ecolor); break; case PRIM_INVIS: break; default: break; } } MGPS_finishPS(); } void mgps_appearance( struct mgastk *ma, int mask ) { Appearance *ap = &(ma->ap); if (mask & APF_LINEWIDTH) { curwidth = ap->linewidth-1; _mgc->has &= ~HAS_POINT; } if (mask & APF_SHADING) { if (IS_SHADED(ap->shading) && ma->shader != NULL) { /* Use software shader if one exists and user wants lighting */ ma->flags |= MGASTK_SHADER; } else { /* No software shading, just use raw colors */ ma->flags &= ~MGASTK_SHADER; } } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/mg/ps/mgps.h0000644000175000017500000000173712310110201013757 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef MGPS_H #define MGPS_H #define MG_PSFILE 101 #define MG_PSFILEPATH 102 #endif geomview-1.9.5/src/lib/mg/ps/mgpsP.h0000644000175000017500000000723612310110201014077 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef MGPSP_H #define MGPSP_H typedef struct { Pt3Coord x, y, z, w; ColorA vcol; int drawnext; } CPoint3; /*****************************************************************************/ #define MGX_NULL 0 #define MGX_END 0 #define MGX_BGNLINE 1 #define MGX_BGNPOLY 2 #define MGX_BGNEPOLY 3 #define MGX_BGNSLINE 4 #define MGX_BGNSPOLY 5 #define MGX_BGNSEPOLY 6 #define MGX_VERTEX 7 #define MGX_CVERTEX 8 #define MGX_COLOR 9 #define MGX_ECOLOR 10 #define PRIM_LINE 1 #define PRIM_POLYGON 2 #define PRIM_EPOLYGON 3 #define PRIM_SLINE 4 /* smooth shaded primitives */ #define PRIM_SPOLYGON 5 #define PRIM_SEPOLYGON 6 #define PRIM_INVIS 7 /*****************************************************************************/ typedef struct _mgpsprim { int mykind; /* kind of primitive */ int index; /* index into array of vertices */ int numvts; /* number of vertices */ float depth; /* z value for sorting (at least for now) */ int color[3]; /* rgb color of polygon */ int ecolor[3]; /* edge color of polygon */ int ewidth; /* edge width */ } mgpsprim; /*****************************************************************************/ typedef struct _mgps_sort { vvec primsort; /* pointers to mgx11prim array elements*/ vvec prims; /* array of mgx11prim structures */ int primnum; /* number of primitives */ int cprim; /* current primitive being stored */ vvec pverts; /* array of vertices */ int pvertnum; int cvert; /* current vertex being stored */ int maxverts; /* maximum number of vertices */ } mgps_sort; /*****************************************************************************/ typedef struct mgpscontext { struct mgcontext mgctx; /* The mgcontext */ FILE *file; char filepath[280]; unsigned char *buf; float *zbuf; int xsize, ysize; float zrange; int znudge; /* znudge for drawing lines closer */ float znudgeby; /* how much of a nudge ? */ long znear, zfar; /* Current Z-buffer limits */ vvec room; /* Scratch space */ #if 0 int pvertnum; /* number of vertices */ vvec pverts; /* Primitve vertices */ #endif mgps_sort *mysort; /* sorting structure */ int sizelock; /* for prohibiting size change from within mg when the cam window is part of a larger hierarchy of windows as with Widgets */ int born; } mgpscontext; #define MAXZNUDGE 8 /* Max depth of mgbuf_closer()/farther() */ #define _mgpsc ((mgpscontext*)_mgc) extern void mgps_add(int primtype, int ndata, void *data, void *cdata); extern void mgps_init_zrange(); extern int mgps_primclip(mgpsprim *aprim); #endif geomview-1.9.5/src/lib/mg/ps/mgpstri.h0000644000175000017500000000260412310110201014470 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef PSTRI_H #define PSTRI_H void MGPS_startPS(FILE *outf, ColorA *col, double aspect, int width, int height); void MGPS_finishPS(void); void MGPS_polyline(CPoint3 *pts, int num, double width, int *col); void MGPS_spolyline(CPoint3 *pts, int num, double width); void MGPS_poly(CPoint3 *pts, int num, int *col); void MGPS_epoly(CPoint3 *pts, int num, int *col, double ewidth, int *ecol); void MGPS_spoly(CPoint3 *pts, int num); void MGPS_sepoly(CPoint3 *pts, int num, double ewidth, int *ecol); #endif geomview-1.9.5/src/lib/mg/ps/mgpswindows.h0000644000175000017500000000201512310110201015360 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ int mgps_initpsdevice(void); void mgps_newdisplaylist(void); void mgps_sortdisplaylist(void); void mgps_showdisplaylist(FILE *outf); geomview-1.9.5/src/lib/mg/ps/Headers0000644000175000017500000000004712310110201014127 00000000000000mgps.h mgpsP.h mgpstri.h mgpswindows.h geomview-1.9.5/src/lib/mg/rib/0000755000175000017500000000000012310165603013062 500000000000000geomview-1.9.5/src/lib/mg/rib/Makefile.in0000644000175000017500000004666412310165554015074 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/mg/rib DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libmgrib_la_LIBADD = am_libmgrib_la_OBJECTS = mgrib.lo mgribdraw.lo mgribmesh.lo \ mgribshade.lo mgribtoken.lo mgributil.lo libmgrib_la_OBJECTS = $(am_libmgrib_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libmgrib_la_SOURCES) DIST_SOURCES = $(libmgrib_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgrib.la libmgrib_la_SOURCES = \ mgrib.c mgribdraw.c mgribmesh.c mgribshade.c mgribtoken.c mgributil.c \ mgrib.h mgribP.h mgribshade.h mgribtoken.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/mg/rib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/mg/rib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libmgrib.la: $(libmgrib_la_OBJECTS) $(libmgrib_la_DEPENDENCIES) $(EXTRA_libmgrib_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libmgrib_la_OBJECTS) $(libmgrib_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgrib.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgribdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgribmesh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgribshade.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgribtoken.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgributil.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/mg/rib/Makefile.am0000644000175000017500000000035212310110201015016 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgrib.la libmgrib_la_SOURCES = \ mgrib.c mgribdraw.c mgribmesh.c mgribshade.c mgribtoken.c mgributil.c \ mgrib.h mgribP.h mgribshade.h mgribtoken.h geomview-1.9.5/src/lib/mg/rib/mgrib.c0000644000175000017500000007745712310110201014252 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mg.h" #include "mgP.h" #include "mgribP.h" #include "mgribshade.h" #include "mgribtoken.h" #include "window.h" #include #include #include #include #include #ifdef HAVE_LIBGEN_H # include #endif #include #include #include mgcontext * mgrib_ctxcreate(int a1, ...); int mgrib_ctxset( int a1, ... ); int mgrib_feature( int feature ); void mgrib_ctxdelete( mgcontext *ctx ); int mgrib_ctxget( int attr, void* valueptr ); int mgrib_ctxselect( mgcontext *ctx ); void mgrib_sync( void ); void mgrib_worldbegin( void ); void mgrib_worldend( void ); void mgrib_reshapeviewport( void ); void mgrib_identity( void ); void mgrib_transform( Transform T ); int mgrib_pushtransform( void ); int mgrib_poptransform( void ); void mgrib_settransform( Transform T ); int mgrib_pushappearance( void ); int mgrib_popappearance( void ); const Appearance *mgrib_setappearance(const Appearance* app, int merge); int mgrib_setcamera( Camera* cam ); mgribcontext *mgrib_newcontext( mgribcontext *ctx ); extern void mgrib_polygon(); extern void mgrib_mesh(); extern void mgrib_line(); extern void mgrib_polyline(); extern void mgrib_polylist(); extern void mgrib_bezier(); int _mgrib_ctxset(int a1, va_list *alist); WnWindow *mgribwindow(WnWindow *win); struct mgfuncs mgribfuncs = { MGD_RIB, mgdevice_RIB, mgrib_feature, (mgcontext *(*)())mgrib_ctxcreate, mgrib_ctxdelete, (int (*)())mgrib_ctxset, mgrib_ctxget, mgrib_ctxselect, mgrib_sync, mgrib_worldbegin, mgrib_worldend, mgrib_reshapeviewport, /* geometry transform */ mgrib_settransform, mg_gettransform, /* Generic */ mgrib_identity, mgrib_transform, mgrib_pushtransform, mgrib_poptransform, /* texture transform */ mg_settxtransform, mg_gettxtransform, mg_txidentity, mg_txtransform, mg_pushtxtransform, mg_poptxtransform, /* appearance stack */ mgrib_pushappearance, mgrib_popappearance, mgrib_setappearance, mg_getappearance, /********************/ mgrib_setcamera, mgrib_polygon, mgrib_polylist, mgrib_mesh, mgrib_line, mgrib_polyline, mg_quads, mgrib_bezier, mg_bsptree, mg_tagappearance, mg_untagappearance, mg_taggedappearance }; mgribcontext *_MGRIB_; /* For debugging */ int mgdevice_RIB() { _mgf = mgribfuncs; if (_mgc != NULL && _mgc->devno != MGD_RIB) _mgc = NULL; return(0); } /*----------------------------------------------------------------------- * Function: mgrib_ctxcreate * Date: Thu Jul 18 18:55:18 1991 * Author: mbp * Notes: see mg.doc for rest of spec */ mgcontext * mgrib_ctxcreate(int a1, ...) { va_list alist; time_t timedate = (time_t)time(0); _mgc = (mgcontext*)(_MGRIB_ = mgrib_newcontext( OOGLNewE(mgribcontext, "mgrib_ctxcreate") )); /* Ensure some sensible default Window */ WnSet(_mgc->win, WN_XSIZE, 450, WN_YSIZE, 450, WN_END); /* Default RIB1.0 structure info */ sprintf(_mgribc->ribscene, "Generic RIB file"); sprintf(_mgribc->ribcreator, "mgrib driver"); strcpy(_mgribc->ribfor, getenv("USER")); strcpy(_mgribc->ribdate, ctime(&timedate)); _mgribc->ribdate[24] = '\0'; /* remove the line feed */ _mgribc->world = 0; va_start(alist, a1); if (_mgrib_ctxset(a1, &alist) == -1) { mgrib_ctxdelete(_mgc); } va_end(alist); return _mgc; } /*----------------------------------------------------------------------- * Function: _mgrib_ctxset * Description: internal ctxset routine * Args: a1: first attribute * *alist: rest of attribute-value list * Returns: -1 on error, 0 on success * Author: mbp * Date: Fri Sep 20 11:08:13 1991 * Notes: mgrib_ctxcreate() and mgrib_ctxset() call this to actually * parse and interpret the attribute list. */ int _mgrib_ctxset(int a1, va_list *alist) { int attr; FILE *ribfile = NULL; const char *ribdpy = NULL; struct stat st; char *dot; /* secure copy to fixed-length string */ #undef strNcpy #define strNcpy(dst, src) \ strncpy((dst), (src), sizeof(dst)); (dst)[sizeof(dst)-1] = '\0' for (attr = a1; attr != MG_END; attr = va_arg (*alist, int)) { switch (attr) { case MG_ApSet: { Appearance *ap; ap = _ApSet(NULL, va_arg(*alist, int), alist); mgrib_setappearance(ap, MG_MERGE); ApDelete(ap); break; } case MG_WnSet: _WnSet( _mgc->win, va_arg(*alist, int), alist); break; case MG_CamSet: _CamSet( _mgc->cam, va_arg(*alist, int), alist); break; case MG_APPEAR: mgsetappearance(va_arg(*alist, Appearance *), MG_SET); break; case MG_WINDOW: if (_mgc->win) WnDelete(_mgc->win); _mgc->win = va_arg(*alist, WnWindow*); RefIncr((Ref*) (_mgc->win)); break; case MG_CAMERA: mgrib_setcamera( va_arg(*alist, Camera*) ); break; case MG_SETOPTIONS: _mgc->opts |= va_arg(*alist, int); case MG_UNSETOPTIONS: _mgc->opts &= ~va_arg(*alist, int); break; case MG_SHOW: _mgc->shown = va_arg(*alist, int); break; case MG_PARENT: _mgc->parent = va_arg(*alist, mgcontext*); break; case MG_BACKGROUND: _mgc->background = *va_arg(*alist, ColorA*); break; case MG_ZNUDGE: /* for now, read nothing */ (void)va_arg(*alist, double); break; case MG_SPACE: _mgc->space = va_arg(*alist, int); break; case MG_NDCTX: _mgc->NDctx = va_arg(*alist, mgNDctx *); break; /* kind of RIB-specific */ case MG_RIBFILE: /* if(_mgribc->rib) fclose(_mgribc->rib); */ ribfile = va_arg(*alist, FILE*); break; /* really RIB-specific */ case MG_RIBLINEMODE: _mgribc->line_mode = (enum line_mode)va_arg(*alist, int); break; case MG_RIBFORMAT: switch( va_arg(*alist, int) ) { case MG_RIBASCII: _mgribc->render_device = RMD_ASCII; break; case MG_RIBBINARY: _mgribc->render_device = RMD_BINARY; break; } break; case MG_RIBDISPLAY: _mgribc->display = (enum display)va_arg(*alist, int); break; case MG_RIBDISPLAYNAME: ribdpy = va_arg(*alist, char*); break; case MG_RIBBACKING: _mgribc->backing = (enum backing)va_arg(*alist, int); break; case MG_RIBSHADER: _mgribc->shader = (enum shader)va_arg(*alist, int); break; case MG_RIBSCENE: strNcpy(_mgribc->ribscene, va_arg(*alist, char*)); break; case MG_RIBCREATOR: strNcpy(_mgribc->ribcreator, va_arg(*alist, char*)); break; case MG_RIBFOR: strNcpy(_mgribc->ribfor, va_arg(*alist, char*)); break; case MG_RIBDATE: strNcpy(_mgribc->ribdate, va_arg(*alist, char*)); break; default: OOGLError(0, "_mgrib_ctxset: undefined option: %d\n", attr); return -1; } } if (ribfile != NULL && ribdpy == NULL) { OOGLError(0, "_mgrib_ctxset: must not specify a file without a displayname"); return -1; } if (ribdpy != NULL) { bool rfopened = false; if (ribfile == NULL) { ribfile = fopen(ribdpy, "w+"); rfopened = true; } if (ribfile == NULL) { OOGLError(0, "_mgrib_ctxset: unable to open file for rib display \"%s\"", ribdpy); return -1; } if (fstat(fileno(ribfile), &st) < 0) { OOGLError(0, "_mgrib_ctxset: unable to stat file for rib display \"%s\"", ribdpy); if (rfopened) { fclose(ribfile); } return -1; } /* ok, now insert the stuff into the context */ if (_mgribc->rib && _mgribc->rib_close) { fclose(_mgribc->rib); } _mgribc->rib = ribfile; strNcpy(_mgribc->displayname, ribdpy); } /* Now decide where to put texture data (anything else?) * * If ribfile is a regular file, then we asssume that * dirname(ribdpy) is its path-component; texture data goes there, * under the name basename(ribdpy)-txSEQ.tiff, where "SEQ" is an * ever increasing number (during the life-time of the context). * * If ribfile is not a regular file and dirname(ribdpy) equals ".", * then texture data goes to /tmp or ${TMPDIR}, in order not to * bloat the current directory which piping data around. * * If dirname(ribdpy) != ".", but dirname(ribdpy) does not exist, * then we loose. So what. */ /* Extract the path-component from displayname */ strcpy(_mgribc->displaypath, _mgribc->displayname); strcpy(_mgribc->displaypath, dirname(_mgribc->displaypath)); if (!S_ISREG(st.st_mode) && strcmp(_mgribc->displaypath, ".") == 0) { strNcpy(_mgribc->displaypath, _mgribc->tmppath); } /* If displayname really is a path-name, then include only its * basename component into the rib-output. Otherwise one has to edit * the RIB-file each time one moves it around. */ strcpy(_mgribc->displaybase, _mgribc->displayname); strcpy(_mgribc->displaybase, basename(_mgribc->displaybase)); /* Strip the suffix; the RIB-file will contain displaybase.tiff, * texturenames will be generated as displaybase-SEQ.tiff, where SEQ * is an ever increasing number. */ if ((dot = strrchr(_mgribc->displaybase, '.')) != NULL && (strcmp(dot, ".tiff") == 0 || strcmp(dot, ".rib") == 0)) { *dot = '\0'; } /* Finished. The displayname emitted to the RIB file now will always * be without path-component. */ if (_mgc->shown && !_mgribc->born) { /* open the window */ mgribwindow(_mgc->win); /* rib state is *not* in accordance with appearance state: don't set the appearance until worldbegin time */ } return 0; } /*----------------------------------------------------------------------- * Function: mgrib_ctxget * Description: get a context attribute value * Args: attr: the attribute to get * value: place to write attr's value * Returns: 1 for success; -1 if attr is invalid * Author: mbp * Date: Fri Sep 20 11:50:25 1991 * Notes: */ int mgrib_ctxget(int attr, void* value) { #define VALUE(type) ((type*)value) switch (attr) { /* Attributes common to all MG contexts: */ case MG_APPEAR: *VALUE(Appearance*) = &(_mgc->astk->ap); break; case MG_CAMERA: *VALUE(Camera*) = _mgc->cam; break; case MG_WINDOW: if(_mgribc->born) { /* IT DOESN'T MAKE SENSE TO DO THIS, DOES IT? */ } *VALUE(WnWindow*) = _mgc->win; break; case MG_PARENT: *VALUE(mgcontext*) = _mgc->parent; break; case MG_SETOPTIONS: case MG_UNSETOPTIONS: *VALUE(int) = _mgc->opts; break; case MG_BACKGROUND: *VALUE(ColorA) = _mgc->background; break; case MG_ZNUDGE: /* not implemented now */ *VALUE(int) = 0; case MG_SPACE: *VALUE(int) = _mgc->space; break; case MG_NDCTX: *VALUE(mgNDctx *) = _mgc->NDctx; break; /* Attributes specific to RIB contexts: */ case MG_RIBWINID: *VALUE(int) = _mgribc->win; break; case MG_RIBFILE: *VALUE(FILE*) = _mgribc->rib; break; /* Attributes really specific to RI contexts: */ case MG_RIBLINEMODE: *VALUE(int) = _mgribc->line_mode; break; case MG_RIBFORMAT: switch (_mgribc->render_device) { case RMD_ASCII: *VALUE(int) = MG_RIBASCII; break; case RMD_BINARY: *VALUE(int) = MG_RIBBINARY; break; } break; case MG_RIBDISPLAY: *VALUE(int) = _mgribc->display; break; case MG_RIBDISPLAYNAME: *VALUE(char *) = _mgribc->displayname; break; case MG_RIBBACKING: *VALUE(int) = _mgribc->backing; break; case MG_RIBSHADER: *VALUE(int) = _mgribc->shader; break; case MG_RIBSCENE: *VALUE(char *) = _mgribc->ribscene; break; case MG_RIBCREATOR: *VALUE(char *) = _mgribc->ribcreator; break; case MG_RIBFOR: *VALUE(char *) = _mgribc->ribfor; break; case MG_RIBDATE: *VALUE(char *) = _mgribc->ribdate; break; default: OOGLError (0, "mgrib_ctxget: undefined option: %d\n", attr); return -1; } return 1; #undef VALUE } /*----------------------------------------------------------------------- * Function: mgribwindow * Description: create a RIB window * Args: *win: the WnWindow structure to realize * Returns: win if success, NULL if not * Author: wisdom, gunn * Date: Fri Sep 20 11:56:31 1991 * Notes: makes the RI calls necessary to create a RIB "window" * which is really a virtual window defining Format, Display, * etc. */ WnWindow * mgribwindow(WnWindow *win) { WnPosition wp; int xsize, ysize; char fullscene[280], fullcreator[280], fullfor[280], fulldate[280]; char dpyname[PATH_MAX]; /* RIB 1.0 structure comments */ sprintf(fullscene,"Scene %s",_mgribc->ribscene); sprintf(fullcreator,"Creator %s",_mgribc->ribcreator); sprintf(fullfor,"For %s",_mgribc->ribfor); sprintf(fulldate,"CreationDate %s",_mgribc->ribdate); mrti(mr_header,"RenderMan RIB-Structure 1.0", mr_nl, mr_header, fullscene, mr_nl, mr_header, fullcreator, mr_nl, mr_header, fulldate, mr_nl, mr_header, fullfor, mr_nl, mr_header, "Frames 1", mr_nl, /* always 1 frame*/ mr_NULL); /* options */ if(_mgribc->shader != RM_STDSHADE && _mgribc->shadepath) { mrti(mr_header, "CapabilitiesNeeded ShadingLanguage", mr_nl, mr_embed, "version 3.03", mr_nl, mr_option, mr_string, "searchpath", mr_string, "shader", mr_nl, mr_embed, "[", mr_string, _mgribc->shadepath, mr_embed, "]", mr_nl, mr_nl, mr_NULL); } else { mrti(mr_embed, "version 3.03", mr_nl, mr_nl, mr_NULL); } /* set display characteristics...*/ snprintf(dpyname, PATH_MAX, "%s%s", _mgribc->displaybase, _mgribc->display == MG_RIBTIFF ? ".tiff" : ".rib"); mrti(mr_display, mr_string, dpyname, (_mgribc->display == MG_RIBFRAME) ? mr_framebuffer : mr_file, (_mgribc->backing == MG_RIBDOBG) ? mr_rgb : mr_rgba, mr_NULL); /* window size */ WnGet(_mgc->win, WN_CURPOS, &wp); xsize = wp.xmax - wp.xmin + 1; ysize = wp.ymax - wp.ymin + 1; mrti(mr_format, mr_int, xsize, mr_int, ysize, mr_float, 1., mr_NULL); _mgribc->born = true; return win; } /*----------------------------------------------------------------------- * Function: mgrib_ctxset * Description: set some context attributes * Args: a1, ...: list of attribute-value pairs * Returns: -1 on error, 0 on success * Author: mbp * Date: Fri Sep 20 12:00:18 1991 */ int mgrib_ctxset( int a1, ... ) { va_list alist; int result; va_start( alist, a1 ); result = _mgrib_ctxset(a1, &alist); va_end(alist); return result; } /*----------------------------------------------------------------------- * Function: mgrib_feature * Description: report whether mgrib device has a particular feature * Args: feature: the feature to report on * Returns: an int giving info about feature * Author: wisdom * Date: Tue Aug 3 15:38:05 CDT 1993 * Notes: -1 means the feature is not present. * */ int mgrib_feature( int feature ) { if(feature == MGF_BEZIER) return 1; return(-1); } /*----------------------------------------------------------------------- * Function: mgrib_ctxdelete * Description: delete a GL context * Args: *ctx: context to delete * Returns: nothing * Author: slevy * Date: Tue Nov 12 10:29:04 CST 1991 * Notes: Deleting the current context leaves the current-context * pointer set to NULL. */ void mgrib_ctxdelete( mgcontext *ctx ) { /* if(_mgribc->rib) fclose(_mgribc->rib); */ if(ctx->devno != MGD_RIB) { mgcontext *was = _mgc; mgctxselect(ctx); mgctxdelete(ctx); if(was != ctx) { mgctxselect(was); } } else { if(((mgribcontext *)ctx)->shadepath) { free(((mgribcontext *)ctx)->shadepath); } if (_mgribc->tx) { OOGLFree(_mgribc->tx); } mrti_delete(&_mgribc->worldbuf); mrti_delete(&_mgribc->txbuf); mg_ctxdelete(ctx); if(ctx == _mgc) _mgc = NULL; } } /*----------------------------------------------------------------------- * Function: mgrib_ctxselect * Description: select a RIB context --- make it current * Args: *ctx: the context to become current * Returns: 0 (why ???) * Author: mbp, wisdom * Date: Fri Sep 20 12:04:41 1991 */ int mgrib_ctxselect( mgcontext *ctx ) { if(ctx == NULL || ctx->devno != MGD_RIB) { return mg_ctxselect(ctx); } _mgc = ctx; _MGRIB_ = (mgribcontext *)ctx; return(0); } /*----------------------------------------------------------------------- * Function: mgrib_sync * Description: sync * Returns: nothing * Author: wisdom * Date: Mon Aug 2 18:05:41 CDT 1993 * Notes: sync with PRMAN not necessary */ void mgrib_sync( void ) {} /*----------------------------------------------------------------------- * Function: mgrib_worldbegin * Description: prepare to draw a frame * Returns: nothing * Author: wisdom, slevy, gunn * Date: Sat Mar 7 16:28:35 GMT-0600 1992 */ void mgrib_worldbegin( void ) { static Transform cam2ri = {{1, 0,0,0}, {0,1,0,0}, {0,0,-1,0},{0,0,0,1}}; float halfxfield, halfyfield, aspect, cnear, cfar, fov; char str[256]; HPoint3 look; Point3 lookat; LtLight **lp; int i; /* first, check to see if we need to open the default rib file */ /* IT'S NOW POSSIBLE THAT THIS WON'T GET SENT TO A FILE (streams) */ /* IN WHICH CASE IT WOULD BE WRONG TO OPEN A FILE. MOVE THIS!! */ if(!_mgribc->rib) { if (mgrib_ctxset(MG_RIBDISPLAYNAME, DEFAULT_RIB_FILE, MG_END) == -1) { OOGLError(0, "mgrib_worldbeging(): unable to open default file \"%s\"", DEFAULT_RIB_FILE); } } /* interpret options...(none exist now) */ mg_worldbegin(); mg_findcam(); LM_FOR_ALL_LIGHTS( _mgc->astk->ap.lighting, i,lp ) { (*lp)->changed = 1; /* We'll need to emit all the lights once */ } /* Camera is at (in its own coordinates) (0,0,0). * Looking toward vector (0,0,-1) * nominally looking at a point (0,0,-focallen) */ CamGet(_mgc->cam, CAM_FOCUS, &_mgribc->focallen); look.x = look.y = 0; look.z = -_mgribc->focallen; look.w = 1; /* Transform to world coordinates */ HPt3TransPt3(_mgc->C2W, &look, &lookat); /* Now the camera is at _mgc->cpos (this is a Point3), */ /* looking at lookat (another Point3) */ /* interpret camera ...*/ CamGet( _mgc->cam, CAM_NEAR, &cnear); CamGet( _mgc->cam, CAM_FAR, &cfar); /* make our buffer the current one */ mrti_makecurrent(&_mgribc->worldbuf); mrti(mr_clipping, mr_float, cnear, mr_float, cfar, mr_NULL); CamGet( _mgc->cam, CAM_PERSPECTIVE, &_mgribc->persp); mrti(mr_projection, mr_string, _mgribc->persp ? "perspective" : "orthographic", mr_NULL); CamGet( _mgc->cam, CAM_ASPECT, &aspect ); CamGet( _mgc->cam, CAM_HALFYFIELD, &halfyfield ); halfxfield = halfyfield * aspect; mrti(mr_screenwindow, mr_float, -halfxfield, mr_float, halfxfield, mr_float, -halfyfield, mr_float, halfyfield, mr_NULL); CamGet( _mgc->cam, CAM_FOV, &fov); sprintf(str, "Field of view %.8g", fov); mrti(mr_comment, str, mr_NULL); mrti(mr_framebegin, mr_int, 1, mr_nl, mr_NULL); if (_mgc->cpos.w != 0.0 && _mgc->cpos.w != 1.0) { sprintf(str, "CameraOrientation %.8g %.8g %.8g %.8g %.8g %.8g", _mgc->cpos.x/_mgc->cpos.w, _mgc->cpos.y/_mgc->cpos.w, _mgc->cpos.z/_mgc->cpos.w, lookat.x,lookat.y,lookat.z); } else { sprintf(str, "CameraOrientation %.8g %.8g %.8g %.8g %.8g %.8g", _mgc->cpos.x,_mgc->cpos.y,_mgc->cpos.z, lookat.x,lookat.y,lookat.z); } mrti(mr_header, str, mr_nl, mr_NULL); mrti(mr_identity, mr_NULL); mgrib_printmatrix(cam2ri); mgrib_printmatrix(_mgc->W2C); /* otherwise explicitly specified normals would be inverted */ mrti(mr_reverseorientation, mr_NULL); /* declare "bgcolor" as uniform float, needed by the GVblend filters * (GL_BLEND texturing). * * We also declare At (\alpha_{texture}), which is used to switch * off texture introduced transparency when the appearance has * transparency disabled. */ mrti(mr_declare, mr_string, "bgcolor", mr_string, "uniform color", mr_NULL); mrti(mr_declare, mr_string, "At", mr_string, "uniform float", mr_NULL); /* RiWorldBegin...*/ mrti(mr_nl, mr_nl, mr_worldbegin, mr_NULL); _mgribc->world = 1; /* if the option is selected, add the background */ if(_mgribc->backing == MG_RIBDOBG) { float halfxbg = cfar * halfxfield, halfybg = cfar * halfyfield; float farz = -.99 * cfar; Point3 bg[4]; bg[0].x = -halfxbg; bg[0].y = -halfybg; bg[0].z = farz; bg[1].x = -halfxbg; bg[1].y = halfybg; bg[1].z = farz; bg[2].x = halfxbg; bg[2].y = halfybg; bg[2].z = farz; bg[3].x = halfxbg; bg[3].y = -halfybg; bg[3].z = farz; mrti(mr_comment, "simulate background color via polygon", mr_NULL); mrti(mr_attributebegin, mr_NULL); mgrib_printmatrix(_mgc->C2W); mrti(mr_surface, mr_constant, mr_NULL); mrti(mr_color, mr_parray, 3, &_mgc->background, mr_NULL); mrti(mr_polygon, mr_P, mr_parray, 4*3, bg, mr_NULL); mrti(mr_attributeend, mr_NULL); } /* bring ri state into accordance with appearance state */ { Appearance *ap = ApCopy( &(_mgc->astk->ap), NULL ); mgrib_setappearance( ap, MG_SET ); ApDelete(ap); } /* NOW DONE BY mg_worldbegin() *CamView(_mgc->cam, _mgribc->W2S); *TmTranslate(T, 1.0, 1.0, 0); *TmConcat(_mgribc->W2S,T, _mgribc->W2S); */ /* NOW DONE BY mg_worldbegin() *mgrib_ctxget(MG_WINDOW, &win); *WnGet(_mgc->win, WN_CURPOS, &wp); *xsize = wp.xmax - wp.xmin + 1; *ysize = wp.ymax - wp.ymin + 1; * *TmScale(T, (double)xsize*.5, (double)ysize*.5, 1.0); *TmConcat(_mgribc->W2S,T, _mgribc->W2S); * *TmCopy(_mgribc->W2S, _mgribc->O2S); */ } /*----------------------------------------------------------------------- * Function: mgrib_worldend * Description: finish drawing a frame * Returns: nothing * Author: wisdom * Date: Sat Mar 7 14:47:40 GMT-0600 1992 */ void mgrib_worldend( void ) { _mgribc->world = 0; mrti(mr_worldend, mr_nl, mr_NULL); mrti(mr_frameend, mr_nl, mr_NULL); /* now flush the buffer, if appropriate */ /* mgrib_flushbuffer(); NOW DONE AT HIGHER LEVEL */ } /*----------------------------------------------------------------------- * Function: mgrib_reshapeviewport * Description: adjust to a new window size * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:08:30 1991 * Notes: adjusts both GL's internal viewport setting, as well as * MG context WnWindow's current position and camera's * aspect ratio. */ void mgrib_reshapeviewport( void ) { WnWindow *win; WnPosition wp; int xsize, ysize; mgrib_ctxget(MG_WINDOW, &win); /* Get window; force it to ask * NeXTStep how big the window is */ WnGet(win, WN_CURPOS, &wp); xsize = wp.xmax - wp.xmin + 1; ysize = wp.ymax - wp.ymin + 1; CamSet(_mgc->cam, CAM_ASPECT, (double)xsize/(double)ysize, CAM_END); } /*----------------------------------------------------------------------- * Function: mgrib_identity * Description: set the current object xform to identity * Returns: nothing * Author: * Date: * Notes: * */ void mgrib_identity( void ) { mgrib_settransform( TM_IDENTITY ); } /*----------------------------------------------------------------------- * Function: mgrib_transform * Description: premultiply the object xform by T * Args: T * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:24:57 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * */ void mgrib_transform( Transform T ) { mg_transform(T); mgrib_printmatrix(T); TmConcat(_mgc->xstk->T, _mgc->W2S, _mgc->O2S); } /*----------------------------------------------------------------------- * Function: mgrib_pushtransform * Description: push the object xform stack * Returns: nothing (???) * Author: mbp * Date: Fri Sep 20 12:25:43 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * * This assumes we're already in MVIEWING mode. */ int mgrib_pushtransform( void ) { mg_pushtransform(); mrti(mr_transformbegin, mr_NULL); return 0; } /*----------------------------------------------------------------------- * Function: mgrib_popransform * Description: pop the object xform stack * Returns: nothing (???) * Author: mbp * Date: Fri Sep 20 12:25:43 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * * This assumes we're already in MVIEWING mode. */ int mgrib_poptransform( void ) { mg_poptransform(); mrti(mr_transformend, mr_NULL); TmConcat(_mgc->xstk->T, _mgc->W2S, _mgc->O2S); return 0; } /*----------------------------------------------------------------------- * Function: mgrib_settransform * Description: set the current object xform to T * Args: T * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:29:43 1991 * Notes: */ void mgrib_settransform( Transform T ) { mrti(mr_identity, mr_NULL); mg_settransform( T ); TmConcat(_mgc->xstk->T, _mgc->W2S, _mgc->O2S); if(T != TM_IDENTITY) mgrib_printmatrix(T); } /*----------------------------------------------------------------------- * Function: mgrib_pushappearance * Description: push the MG context appearance stack * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:54:19 1991 */ int mgrib_pushappearance( void ) { mg_pushappearance(); if (_mgribc->world) mrti(mr_comment, "push appearance", mr_attributebegin, mr_NULL); return 0; } /*----------------------------------------------------------------------- * Function: mgrib_popappearance * Description: pop the MG context appearance stack * Returns: nothing * Author: * Date: * Note: Note that we do not have to do anything besides * AttributeEnd, because the RenderMan driver retains * the previous state information. 1/13/92 TMM */ int mgrib_popappearance( void ) { struct mgastk *mastk = _mgc->astk; if (mastk->next == NULL) { OOGLError(0, "mggl_popappearance: appearance stack has only 1 entry.\n"); return 0; } if (_mgribc->world) mrti(mr_comment, "pop appearance", mr_attributeend, mr_NULL); mg_popappearance(); return 0; } /*----------------------------------------------------------------------- * Function: mgrib_setappearance * Author: munzner, mbp, wisdom * Date: Wed Aug 7 01:08:07 1991 * Notes: Tossed mgrib_material, just use mgrib_appearance * since shaders depend on both appearance and material * settings. (4/1/93 TMM) */ const Appearance * mgrib_setappearance(const Appearance* ap, int mergeflag ) { int changed, mat_changed, lng_changed; struct mgastk *mastk = _mgc->astk; Appearance *ma; ma = &(mastk->ap); /* Decide what changes */ if (mergeflag == MG_MERGE) { changed = ap->valid & ~ma->override; mat_changed = ap->mat ? ap->mat->valid & ~ma->mat->override : 0; lng_changed = ap->lighting ? ap->lighting->valid & ~ma->lighting->override : 0; } else { changed = ap->valid; mat_changed = ap->mat ? ap->mat->valid : 0; lng_changed = ap->lighting ? ap->lighting->valid : 0; } mg_setappearance( ap, mergeflag ); /* here is where everything gets set (sort of) */ if(_mgribc->born) { mgrib_appearance( mastk, changed, mat_changed); /* interpret lights ... */ mgrib_lighting(_mgc->astk, lng_changed); } return &_mgc->astk->ap; } /*----------------------------------------------------------------------- * Function: mgrib_setcamera * Description: set the context's camera (pointer) * Args: *cam: the camera to use * Returns: nothing * Author: mbp * Date: Fri Sep 20 13:07:31 1991 * Notes: The context stores a pointer to the camera, not a copy * of it. */ int mgrib_setcamera( Camera* cam ) { if (_mgc->cam) CamDelete(_mgc->cam); _mgc->cam = cam; RefIncr((Ref*) cam); return 0; } /*----------------------------------------------------------------------- * Function: mgrib_newcontext * Description: initialize a new mgricontext structure * Args: *ctx: the struct to initialize * Returns: ctx * Author: mbp * Date: Fri Sep 20 13:11:03 1991 */ mgribcontext * mgrib_newcontext( mgribcontext *ctx ) { static const char stdshaderpaths[] = ".:shaders:/usr/local/prman/prman/lib/shaders:/NextLibrary/Shaders"; char *geomdata = getenv("GEOMDATA"); memset(ctx, 0, sizeof(mgribcontext)); mg_newcontext(&(ctx->mgctx)); ctx->mgctx.devfuncs = &mgribfuncs; ctx->mgctx.devno = MGD_RIB; ctx->mgctx.astk->ap_seq = 1; ctx->mgctx.astk->mat_seq = 1; ctx->mgctx.astk->light_seq = 1; ctx->born = false; ctx->rib = NULL; ctx->rib_close = false; ctx->backing = RB_DOBG; ctx->shader = RM_EXTSHADE; ctx->shadepath = NULL; /* should add context field */ if (geomdata) { char path[512]; sprintf(path, "%s:%s/shaders:&", stdshaderpaths, geomdata); ctx->shadepath = strdup(path); } if ((ctx->tmppath = getenv("TMPDIR")) == NULL) { ctx->tmppath = "/tmp"; } /* initalize the token interface */ mrti_init(&ctx->worldbuf); mrti_init(&ctx->txbuf); mrti_makecurrent(&ctx->worldbuf); ctx->render_device = RMD_ASCII; ctx->line_mode = RM_CYLINDER; return ctx; } /*----------------------------------------------------------------------- * Function: mgrib_findctx * Description: Given a GL window ID, returns the associated mg context. * Returns: mgcontext * for success, NULL if none exists. * Author: slevy * Date: Mon Nov 11 18:33:53 CST 1991 * Notes: This is a public routine. */ mgcontext * mgrib_findctx( long winid ) { struct mgcontext *mgc; for(mgc = _mgclist; mgc != NULL; mgc = mgc->next) { if(mgc->devno == MGD_RIB && ((mgribcontext *)mgc)->win == winid) return mgc; } return NULL; } /*----------------------------------------------------------------------- * Function: mgrib_flushbuffer * Description: flushed tokens from buffer to a file * Returns: nothing * Author: wisdom * Date: Mon Jul 26 12:35:45 CDT 1993 * Notes: This is a public routine, prototyped in mgrib.h */ void mgrib_flushbuffer() { TokenBuffer *wbuf = &_mgribc->worldbuf; size_t size; if(!_mgribc->rib) { if (mgrib_ctxset(MG_RIBDISPLAYNAME, DEFAULT_RIB_FILE, MG_END) == -1) { return; } } if (_mgribc->tx) { TokenBuffer *txbuf = &_mgribc->txbuf; size = (size_t)wbuf->tkb_worldptr - (size_t)wbuf->tkb_buffer; if (size && fwrite(wbuf->tkb_buffer, size, 1, _mgribc->rib) != 1) { OOGLError(1, "Error flushing RIB tokenbuffer (prologue)"); } mrti_makecurrent(txbuf); mrti(mr_nl, mr_nl, mr_NULL); size = (size_t)txbuf->tkb_ptr - (size_t)txbuf->tkb_buffer; if (size && fwrite(txbuf->tkb_buffer, size, 1, _mgribc->rib) != 1) { OOGLError(1, "Error flushing RIB tokenbuffer (textures)"); } size = (size_t)wbuf->tkb_ptr - (size_t)wbuf->tkb_worldptr; if (size && fwrite(wbuf->tkb_worldptr, size, 1, _mgribc->rib) != 1) { OOGLError(1, "Error flushing RIB tokenbuffer (world)"); } mrti_reset(); } else { size = (size_t)wbuf->tkb_ptr - (size_t)wbuf->tkb_buffer; if (size && fwrite(wbuf->tkb_buffer, size, 1, _mgribc->rib) != 1) { OOGLError(1, "Error flushing RIB tokenbuffer"); } } fflush(_mgribc->rib); mrti_makecurrent(wbuf); mrti_reset(); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mg/rib/mgribdraw.c0000644000175000017500000004551212310110201015113 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgribP.h" #include "mgribtoken.h" #include "polylistP.h" #define MAXCLINE 999999 void mgrib_drawPline(HPoint3 *p1, HPoint3 *p2); void mgrib_drawCline(HPoint3 *p1, HPoint3 *p2); void mgrib_polygon( int nv, HPoint3 *v, int nn, Point3 *n, int nc,ColorA *c ); void mgrib_mesh(int wrap,int nu,int nv,HPoint3 *p, Point3 *n, Point3 *nq, ColorA *c ); void mgrib_line( HPoint3 *p1, HPoint3 *p2 ); void mgrib_polyline( int nv, HPoint3 *verts, int nc, ColorA *colors, int wrapped ); void mgrib_polylist( int np, Poly *p, int nv, Vertex *v, int plflags ); void mgrib_drawnormal(HPoint3 *p, Point3 *n); /*----------------------------------------------------------------------- * Function: mgrib_polygon * Description: draw a polygon * Author: wisdom * Date: Thu Aug 26 13:46:25 CDT 1993 * Notes: See mg.doc. * */ void mgrib_polygon(int nv, HPoint3 *V, int nn, Point3 *N, int nc, ColorA *C) { int i; HPoint3 *v; Point3 *n; Color *c; ColorA *c4; HPoint3 hpt; int flag; int shading; int matover; int ninc; flag = _mgc->astk->ap.flag; shading = _mgc->astk->ap.shading; matover = _mgc->astk->mat.override; ninc = (nn > 1); if ((matover & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) nc = 0; mrti(mr_polygon,mr_NULL); /* Points */ if (nv>0 && (flag & APF_FACEDRAW)) { mrti(mr_P,mr_buildarray, nv*3, mr_NULL); for (i = 0; i < nv; i++) { /* we cannot descibe a polygon using Pw, so we normalize */ HPt3Dehomogenize(&V[i], &hpt); mrti(mr_subarray3, &hpt, mr_NULL); } } /* Supply Color (explicit) */ if (nc>0 && (flag & APF_FACEDRAW)) { /* note:color should already be set in case of APF_CONSTANT,no? */ mrti(mr_Cs, mr_buildarray, nv*3, mr_NULL); for (i = 0; i < nv; i++) { if (nc>1) c4 = &C[i]; else c4 = C; mrti(mr_subarray3, (float *)c4, mr_NULL); } } /* Supply Transparency */ if (nc>0 && flag & APF_TRANSP && !(matover & MTF_ALPHA)) { for (i = 0; i < nv; i++) { float opacity[3]; if (nc>1) c4 = &C[i]; else c4 = C; opacity[0]=opacity[1]=opacity[2]=c4->a; mrti(mr_subarray3, opacity, mr_NULL); } } /* Supply Normals */ if (nn>0 && (flag & APF_FACEDRAW) && shading == APF_SMOOTH) { mrti(mr_N, mr_buildarray, nv*3, mr_NULL); for (i = 0; i < nv; i++) { if (nn>1) n = &N[i]; else n = N; mrti(mr_subarray3, n, mr_NULL); } } /* Draw Edges */ if (flag & APF_EDGEDRAW) { c = &_mgc->astk->ap.mat->edgecolor; mrti(mr_attributebegin, mr_surface, mr_constant, mr_color, mr_parray, 3, c, mr_opacity, mr_array, 3, 1., 1., 1., mr_NULL); for (i=0;iline_mode==MG_RIBPOLYGON) mgrib_drawPline(p1,p2); if (_mgribc->line_mode==MG_RIBCYLINDER) mgrib_drawCline(p1,p2); if (_mgribc->line_mode==MG_RIBPRMANLINE) NotImplemented("MG_RIBPRMANLINE"); } void mgrib_drawPline(HPoint3 *p1, HPoint3 *p2) { Transform V; Transform P2S,O2S, O2P, S2O; int xsize, ysize; HPoint3 pnts[4]; Point3 s1, s2; int i; float dx,dy,k, len; /* This code will simulate line drawing in Photorman */ /* create obj->proj transform */ CamView(_mgc->cam, V); /* world->proj */ TmConcat(_mgc->xstk->T, V, O2P); /* obj->proj */ /* create obj->screen transform */ WnGet(_mgc->win, WN_XSIZE, &xsize); WnGet(_mgc->win, WN_YSIZE, &ysize); TmScale(P2S, (float)xsize, (float)ysize, 1.0); TmConcat(O2P, P2S, O2S); /* translate & dehomogenize line endpoints from object to screen */ HPt3TransPt3(O2S, p1, &s1); HPt3TransPt3(O2S, p2, &s2); dy = s2.y - s1.y; dx = s2.x - s1.x; len = hypot(dy,dx); k = _mgc->astk->ap.linewidth / len; pnts[0].x = s1.x -dy * k; pnts[0].y = s1.y +dx * k; pnts[1].x = s1.x +dy * k; pnts[1].y = s1.y -dx * k; pnts[2].x = s2.x +dy * k; pnts[2].y = s2.y -dx * k; pnts[3].x = s2.x -dy * k; pnts[3].y = s2.y +dx * k; pnts[0].z = s1.z; pnts[1].z = s1.z; pnts[2].z = s2.z; pnts[3].z = s2.z; for (i=0; i<4; ++i) pnts[i].w = 1.0; /* now project back... */ /* first, find S2O transform */ TmInvert(O2S, S2O); /* now transform screen coords to object coords */ /* DRAW HERE */ mrti(mr_polygon, mr_P, mr_buildarray, 4*3, mr_NULL); for (i=0;i<4;i++) { HPoint3 pt; HPt3Transform(S2O, &pnts[i], &pt); HPt3Dehomogenize(&pt, &pt); mrti(mr_subarray3, &pt, mr_NULL); } } void mgrib_drawCline(HPoint3 *p1, HPoint3 *p2) { Pt3Coord angle,length; Point3 t,axis; Point3 start, end; HPoint3 Hstart, Hend; static float unitz[3] = {0.0, 0.0, 1.0}; float radius = 0.004; float size; int bounded(Point3 *p); HPt3Dehomogenize(p1, &Hstart); HPt3Dehomogenize(p2, &Hend); start.x = Hstart.x; start.y = Hstart.y; start.z = Hstart.z; end.x = Hend.x; end.y = Hend.y; end.z = Hend.z; if (! Pt3Equal(&start,&end)) { size = radius*_mgc->astk->ap.linewidth; Pt3Sub(&end,&start,&t); length = Pt3Length(&t); Pt3Cross((Point3*)(void *)unitz,&t,&axis); Pt3Unit(&t); angle = Pt3Dot((Point3*)(void *)unitz,&t); angle = acos(angle); mrti(mr_transformbegin, mr_NULL); if (bounded(&start)) mrti(mr_translate, mr_float, start.x, mr_float, start.y, mr_float, start.z, mr_NULL); if ( (t.x == 0.0) && (t.y == 0.0) && (t.z < 0.0)) { /* if along negative z axis cross product is 0 but rotation by 180 degrees is necessary (angle is computed correctly) */ axis.y = 1.0; } if (bounded(&axis)) mrti(mr_rotate, mr_float, DEGREES(angle), mr_float, axis.x, mr_float, axis.y, mr_float, axis.z, mr_NULL); if (length < MAXCLINE) mrti(mr_cylinder, mr_float, size, mr_float, 0., mr_float, length, mr_float, 360., mr_NULL); mrti(mr_transformend, mr_NULL); } } int bounded(p) Point3 *p; { if (! Pt3Equal(p,&Pt3Origin)) { if (p->x < MAXCLINE && p->y < MAXCLINE && p->z < MAXCLINE) return 1; } return 0; } /*----------------------------------------------------------------------- * Function: mgrib_polyline * Description: draws a Polyline * Author: wisdom * Date: Fri Jan 17 14:31:06 CST 1992 * Notes: see mg.doc */ void mgrib_polyline( int nv, HPoint3 *v, int nc, ColorA *c, int wrapped ) { ColorA *color; mrti(mr_attributebegin, mr_surface, mr_constant, mr_NULL); if (nc==0) mrti(mr_color, mr_parray, 3, &_mgc->astk->mat.edgecolor, mr_NULL); if (nc==1) { mrti(mr_color, mr_parray, 3, c, mr_NULL); if (_mgc->astk->ap.flag & APF_TRANSP && !(_mgc->astk->mat.override & MTF_ALPHA)) mrti(mr_opacity, mr_array, 3, c->a, c->a, c->a, mr_NULL); } if (nv == 1) { mgrib_drawpoint(v); } else { if (wrapped & 1) { if (nc > 1) { color = c + nc - 1; mrti(mr_color, mr_parray, 3, color, mr_NULL); } mgrib_drawline(v + nv - 1,v); } while(--nv > 0) { if (nc > 1) { color = c++; mrti(mr_color, mr_parray, 3, color, mr_NULL); } mgrib_drawline(v,(v+1)); v++; } } mrti(mr_attributeend, mr_NULL); } /*----------------------------------------------------------------------- * Function: mgrib_drawpoint * Description: draws a point for rman. * Returns: nothing * Author: wisdom * Date: Fri Mar 13 15:04:01 CST 1992 * Notes: */ void mgrib_drawpoint(HPoint3 *p) { float radius = 0.004; float size = radius*_mgc->astk->ap.linewidth; #if 0 /* Somehow the Points directive doesn't work well, the scaling is * quite strange */ HPoint3 tmp; HPt3Dehomogenize(p, &tmp); size *= 20.0; mrti(mr_points, mr_P, mr_parray, 3, &tmp, mr_width, mr_parray, 1, &size, mr_NULL); #else /* To have a chance to get a visible point we have to rescale the * radius by the distance from the camera. Same holds, in principle, * for lines. */ if (_mgribc->persp && _mgc->space == TM_EUCLIDEAN) { HPoint3 p_cam; float len; HPt3Transform(_mgc->xstk->T, p, &p_cam); HPt3Transform(_mgc->W2C, &p_cam, &p_cam); len = sqrt(HPt3R30Dot(&p_cam, &p_cam)); size *= len / _mgribc->focallen; } mrti(mr_transformbegin, mr_NULL); mrti(mr_translate, mr_float, p->x, mr_float, p->y, mr_float, p->z, mr_NULL); mrti(mr_sphere, mr_float, size, mr_float, size, mr_float, -size, mr_float, 360., mr_NULL); mrti(mr_transformend, mr_NULL); #endif } /*----------------------------------------------------------------------- * Function: mgrib_polylist * Description: draws a Polylist: linked list of Polys * Author: wisdom * Date: Wed Jan 22 16:07:03 CST 1992 * Notes: see mg.doc */ void mgrib_polylist( int np, Poly *P, int nv, Vertex *V, int plflags ) { Appearance *ap; int i,j; Poly *p; Vertex **v, *vp; HPoint3 hpt; int flag,shading,matover; Color *color; ap = &_mgc->astk->ap; flag = ap->flag; shading = ap->shading; matover = _mgc->astk->mat.override; switch(shading) { case APF_FLAT: plflags &= ~PL_HASVN; if (plflags & PL_HASPCOL) { plflags &= ~PL_HASVCOL; } break; case APF_SMOOTH: plflags &= ~PL_HASPN; break; case APF_VCFLAT: plflags &= ~PL_HASVN; break; default: plflags &= ~(PL_HASVN|PL_HASPN); break; } if ((matover & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) { plflags &= ~(PL_HASVCOL | PL_HASPCOL); } if (flag & APF_FACEDRAW) { mrti(mr_attributebegin, mr_NULL); for (p = P, i = 0; i < np; i++, p++) { /* per polygon color */ if (plflags & PL_HASPCOL) { mrti(mr_color, mr_parray, 3, &p->pcol, mr_NULL); /* then per-polygon transparency, if defined */ if (flag & APF_TRANSP && !(matover & MTF_ALPHA)) { mrti(mr_opacity, mr_array, 3, p->pcol.a, p->pcol.a, p->pcol.a, mr_NULL); } } switch (p->n_vertices) { case 1: v = p->v; mrti(mr_attributebegin, mr_NULL); if (plflags & PL_HASVCOL) mrti(mr_color, mr_parray, 3, &(*v)->vcol, mr_NULL); if (plflags & PL_HASST) mrti(mr_st, mr_parray, 2, &(*v)->st, mr_NULL); mrti(mr_surface, mr_constant, mr_opacity, mr_array, 3, 1., 1., 1., mr_NULL); mgrib_drawpoint((HPoint3 *)(*v)); mrti(mr_attributeend, mr_NULL); break; case 2: v = p->v; mrti(mr_attributebegin, mr_NULL); if (plflags & PL_HASVCOL) mrti(mr_color, mr_parray, 3, &(*v)->vcol, mr_NULL); mrti(mr_surface, mr_constant, mr_opacity, mr_array, 3, 1., 1., 1., mr_NULL); mgrib_drawline((HPoint3 *)*v,(HPoint3*)*(v+1)); mrti(mr_attributeend, mr_NULL); break; default: mrti(mr_polygon, mr_NULL); /* do points */ mrti(mr_P, mr_buildarray, p->n_vertices*3, mr_NULL); for (j=0, v=p->v; j < p->n_vertices; j++, v++) { HPt3Dehomogenize(&(*v)->pt, &hpt); mrti(mr_subarray3, &hpt, mr_NULL); } /* colors, if supplied */ if (plflags & PL_HASVCOL) { mrti(mr_Cs, mr_buildarray, p->n_vertices*3, mr_NULL); for (j=0, v=p->v; j < p->n_vertices; j++, v++) { mrti(mr_subarray3, &(*v)->vcol, mr_NULL); } /* then per-vertex transparency, if defined */ if (flag & APF_TRANSP && !(matover & MTF_ALPHA)) { mrti(mr_Os, mr_buildarray, p->n_vertices*3, mr_NULL); for (j=0, v=p->v; j < p->n_vertices; j++, v++) { float opacity[3]; opacity[0]=opacity[1]=opacity[2]=(*v)->vcol.a; mrti(mr_subarray3, opacity, mr_NULL); } } } /* now normals, if supplied */ if (plflags & PL_HASVN) { mrti(mr_N, mr_buildarray, p->n_vertices*3, mr_NULL); for (j=0, v=p->v; j < p->n_vertices; j++, v++) { mrti(mr_subarray3, &((*v)->vn), mr_NULL); } } else if (plflags & PL_HASPN) { mrti(mr_N, mr_buildarray, p->n_vertices*3, mr_NULL); for (j=0, v=p->v; j< p->n_vertices; j++, v++) { mrti(mr_subarray3, &(p->pn), mr_NULL); } } /* Texture support, to some extend. We dump all (different) * texture images to files, enumerated by a sequence * number. Then we insert for each image a line ``MakeTexture "ourfile" "ribtxfile" "periodic" "clamp" "gaussian" 1.0 1.0'' * in front of WorldBegin (unluckily all textures must be * defined before the call to WorldBegin, meaning the * RIB-command). * * We do all the clamping and transformation ourselves. FIXME: * is there as texture transformation in the RenderMan shading * language?? */ if ((ap->flag & (APF_TEXTURE|APF_FACEDRAW)) == (APF_TEXTURE|APF_FACEDRAW) && _mgc->astk->ap.tex != NULL && (plflags & PL_HASST)) { Transform T; Texture *tex = _mgc->astk->ap.tex; TxST stT; TmConcat(tex->tfm, _mgc->txstk->T, T); mrti(mr_st, mr_buildarray, p->n_vertices*2, mr_NULL); for (j = 0, v = p->v; j < p->n_vertices; j++, v++) { TxSTTransform (T, &(*v)->st, &stT); stT.t = 1.0 - stT.t; mrti(mr_subarray2, (float *)&stT, mr_NULL); } } break; } } mrti(mr_attributeend, mr_NULL); } if (flag & APF_EDGEDRAW) { color = &_mgc->astk->ap.mat->edgecolor; mrti(mr_attributebegin, mr_surface, mr_constant, mr_color, mr_parray, 3, color, mr_opacity, mr_array, 3, 1., 1., 1., mr_NULL); for (p = P, i = 0; i < np; i++, p++) { for (j=0, v=p->v; j < (p->n_vertices-1); j++, v++) { mgrib_drawline((HPoint3 *)*v,(HPoint3*)*(v+1)); } mgrib_drawline((HPoint3 *)*v,(HPoint3 *)*(p->v)); } mrti(mr_attributeend,mr_NULL); } if (flag & APF_NORMALDRAW) { /* since mg_drawnormal handles attributes and stacking, we do * nothing here */ if (plflags & PL_HASPN) { for (p = P, i = 0; i < np; i++, p++) { for (j=0, v=p->v; j < p->n_vertices; j++, v++) { mgrib_drawnormal(&(*v)->pt, &p->pn); } } } else if (plflags & PL_HASVN) { for (vp = V, i = 0; i < nv; i++, vp++) { mgrib_drawnormal(&vp->pt, &vp->vn); } } } } /* There is a basic problem now with 4-d points and 3-d normal vectors. For now, we'll just ignore the 4-th coordinate of the point when computing the tip of the normal vector. This will work OK with all existing models, but for genuine 4-d points it won't work. But, come to think of it, what is the correct interpretation of the normal vector when the points live in 4-d? */ void mgrib_drawnormal(HPoint3 *p, Point3 *n) { HPoint3 end, tp; float scale; Color *color; if (p->w <= 0.0) return; scale = p->w * _mgc->astk->ap.nscale; end.x = p->x + scale*n->x; end.y = p->y + scale*n->y; end.z = p->z + scale*n->z; end.w = p->w; color = &_mgc->astk->mat.normalcolor; mrti(mr_attributebegin, mr_surface, mr_constant, mr_color, mr_parray, 3, color, mr_opacity, mr_array, 3, 1., 1., 1., mr_NULL); mgrib_drawline(&tp,&end); mrti(mr_attributeend, mr_NULL); } void mgrib_bezier(int du, int dv, int dimn, float *CtrlPnts, TxST *txmapst, ColorA *c) { int i, ip, nu, nv; static float *uknot=NULL, *vknot=NULL; static size_t ulen=0,vlen=0; size_t nulen=0, nvlen=0; int flag = _mgc->astk->ap.flag; int matover = _mgc->astk->mat.override; du += 1; dv += 1; nu = du; nv = dv; ip = nu * nv * dimn; if (!uknot) { ulen=nu+du; uknot=(float *)malloc(ulen*sizeof(float)); } if (!vknot) { vlen=nv+dv; vknot=(float *)malloc(vlen*sizeof(float)); } nulen=nu+du; nvlen=nv+dv; if (nulen>ulen) uknot=(float *)realloc(uknot,(ulen=nulen)*sizeof(float)); if (nvlen>vlen) vknot=(float *)realloc(vknot,(vlen=nvlen)*sizeof(float)); /* uknot = (float *)malloc((nu+du)*sizeof(float)); */ for (i=0;iastk->flags & MGASTK_SHADER)) ) { mrti(mr_Cs, mr_buildarray, 12, mr_NULL); for (i = 0; i < 4; i++) { mrti(mr_subarray3, (float *)&c[i], mr_NULL); } if (flag & APF_TRANSP && !(matover & MTF_ALPHA)) { float opacity[3]; opacity[0]=opacity[1]=opacity[2]=c[i].a; mrti(mr_Os, mr_buildarray, 12, mr_NULL); for (i = 0; i < 4; i++) { mrti(mr_subarray3, opacity, mr_NULL); } } } if ((_mgc->astk->ap.flag & (APF_TEXTURE|APF_FACEDRAW)) == (APF_TEXTURE|APF_FACEDRAW) && _mgc->astk->ap.tex != NULL && txmapst) { Transform T; Texture *tex = _mgc->astk->ap.tex; TxST stT; int j; TmConcat(tex->tfm, _mgc->txstk->T, T); mrti(mr_nl, mr_st, mr_buildarray, 8, mr_NULL); for (j = 0; j < 4; j++) { TxSTTransform(T, &txmapst[j], &stT); stT.t = 1.0 - stT.t; mrti(mr_subarray2, &stT, mr_NULL); } } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mg/rib/mgribmesh.c0000644000175000017500000001431012310110201015102 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgribP.h" #include "mgribtoken.h" #define HAS_N 0x1 #define HAS_C 0x2 #define HAS_SMOOTH 0x4 #define VI_TUPLET_LIMIT 2 /* for sgi vi formatting (so we can use it!) */ static void mgrib_submesh( int wrap, int nu, int nv, HPoint3 *P, Point3 *N, Point3 *NQ, ColorA *C, TxST *ST, int mflags ); static void mgrib_prmanmesh( int wrap, int nu, int nv, HPoint3 *P ); int mgrib_mesh(int wrap, int nu, int nv, HPoint3 *P, Point3 *N, Point3 *NQ, ColorA *C, TxST *ST, int mflags) { Appearance *ap; Color *c3; Point3 *n; HPoint3 *p; int u; ap = &_mgc->astk->ap; if (ap->flag & APF_FACEDRAW) { mgrib_submesh( wrap, nu, nv, P, N, NQ, C, ST, mflags); } if (ap->flag & APF_EDGEDRAW) { /* must draw edges manually */ c3 = &ap->mat->edgecolor; mrti(mr_attributebegin, mr_color, mr_parray, 3, c3, mr_opacity, mr_array, 3, 1., 1., 1., mr_surface, mr_constant, mr_NULL); mgrib_prmanmesh( wrap, nu, nv, P); mrti(mr_attributeend,mr_NULL); } if ((ap->flag & APF_NORMALDRAW) && N!=NULL) { p = P; n = N; for (u = nu*nv; --u >= 0; ) mgrib_drawnormal(p++, n++); } return 1; } static void mgrib_submesh( int wrap, int nu, int nv, HPoint3 *P, Point3 *N, Point3 *meshNQ, ColorA *C, TxST *ST, int mflags ) { Appearance *ap; char *uwrap,*vwrap; int i; HPoint3 *p; Point3 *n; TxST *st; ColorA *c; int nunv; int viflag = 0; /* used to insert \n into RIB file so lines */ /* won't be too long for 'vi' to work well */ nunv = nu * nv; p = P; n = N; c = C; st = ST; ap = &_mgc->astk->ap; uwrap = (wrap & MM_UWRAP) ? "periodic" : "nonperiodic"; vwrap = (wrap & MM_VWRAP) ? "periodic" : "nonperiodic"; mrti(mr_attributebegin, mr_NULL); /* THIS SHOULD BE AT A HIGHER LEVEL mgrib_print("ShadingInterpolation "); if (ap->shading & APF_SMOOTH) mgrib_print("\"smooth\"\n"); else mgrib_print("\"constant\"\n"); */ mrti(mr_patchmesh, mr_string, "bilinear", mr_int, nu, mr_string, uwrap, mr_int, nv, mr_string, vwrap, mr_P, mr_buildarray, 3*nunv, mr_NULL); for (i=0; i=VI_TUPLET_LIMIT) { viflag=0; /* wrap lines so they won't be too long for vi */ mrti(mr_nl, mr_NULL); } } /* use normals if supplied; flat shading, constant shading and * csmooth shading do not need normals */ if (N != NULL && ap->shading == APF_SMOOTH) { viflag = 0; mrti(mr_N, mr_buildarray, 3*nunv, mr_NULL); for (i=0; i=VI_TUPLET_LIMIT) { viflag = 0; mrti(mr_nl, mr_NULL); } } } /* use colors if supplied and not overridden */ if (C && !((ap->mat->override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER))) { viflag = 0; mrti(mr_Cs, mr_buildarray, 3*nunv, mr_NULL); for (i=0; i=VI_TUPLET_LIMIT) { viflag = 0; mrti(mr_nl, mr_NULL); } } /* transparancy */ if (ap->flag & APF_TRANSP) { c = C; mrti(mr_Os, mr_buildarray, 3*nunv, mr_NULL); for (i=0; i=VI_TUPLET_LIMIT) { viflag = 0; mrti(mr_nl, mr_NULL); } } } } /* Texture support, to some extend. We dump all (different) * texture images to files, enumerated by a sequence number. Then * we insert for each image a line * * ``MakeTexture "ourfile" "ribtxfile" "none" "none" "gaussian" 1.0 1.0'' * * in front of WorldBegin (unluckily all texture must be defined * before the call to WorldBegin, meaning the RIB-command). * * We do all the clamping and transformation ourselves. FIXME: is * there as texture transformation in the RenderMan shading * language?? */ if ((ap->flag & (APF_TEXTURE|APF_FACEDRAW)) == (APF_TEXTURE|APF_FACEDRAW) && _mgc->astk->ap.tex != NULL && ST) { Transform T; Texture *tex = _mgc->astk->ap.tex; TxST stT; TmConcat(tex->tfm, _mgc->txstk->T, T); viflag = 0; mrti(mr_st, mr_buildarray, 2*nunv, mr_NULL); for (i=0; i=VI_TUPLET_LIMIT) { viflag=0; mrti(mr_nl, mr_NULL); } } } mrti(mr_attributeend, mr_NULL); } static void mgrib_prmanmesh( int wrap, int nu, int nv, HPoint3 *P ) { int u, v, prevu, prevv; for (v=0; vap); Material *mat = &astk->mat; mrti(mr_section, "Interpreting Material", mr_NULL); if (mat_mask & MTF_DIFFUSE) mrti(mr_color, mr_parray, 3, &mat->diffuse, mr_NULL); if ((ap_mask & APF_TRANSP || mat_mask & MTF_ALPHA) && ap->valid & APF_TRANSP && ap->flag & APF_TRANSP) { /* presumably, we want this here as well as per vertex opacity * specification * * Actually, if the material alpha override bit is set, we * don't output the per vertex opacity information, which * would take precedence. 4/16/93 TMM */ float alpha = astk->mat.diffuse.a; mrti(mr_opacity, mr_array, 3, alpha, alpha, alpha, mr_NULL); } if ( (ap_mask & (APF_SHADING|APF_TEXTURE)) || (mat_mask & (MTF_SPECULAR|MTF_SHININESS|MTF_Kd|MTF_Ka|MTF_Ks)) || ( (ap->tex != NULL) && (ap->flag & APF_TEXTURE) && (ap->tex != astk->next->ap.tex) ) ) { #if 1 /* cH: I'm not so sure 'bout the following anymore */ /* NOTE: the factor "8.0" is to compensate for some of the * usual rib shaders, i.e. BMRT, aqsis etc.. Don't know * why they started this affair, but without the output * from rendrib or aqsis is just _very_ different from * that what is displayed on the screen -- cH. * */ float roughness = (mat->shininess)? 8.0/mat->shininess : 8.0/1.0; #else float roughness = (mat->shininess)? 1.0/mat->shininess : 1.0/1.0; #endif enum tokentype shader = mr_plastic; if (ap->shading == APF_CONSTANT || ap->shading == APF_CSMOOTH) { if (_mgribc->shader == MG_RIBSTDSHADE) { shader = mr_constant; } else if ((ap->flag & APF_TEXTURE) && ap->tex != NULL) { switch (ap->tex->apply) { case TXF_MODULATE: shader = mr_GVmodulateconstant; break; case TXF_DECAL: shader = mr_GVdecalconstant; break; case TXF_BLEND: shader = mr_GVblendconstant; break; case TXF_REPLACE: shader = mr_GVreplaceconstant; break; } } mrti(mr_shadinginterpolation, mr_string, ap->shading == APF_CONSTANT ? "constant" : "smooth", mr_surface, shader, mr_NULL); } else { /* determine shader */ if (_mgribc->shader == MG_RIBSTDSHADE) { if ((ap->flag & APF_TEXTURE) && ap->tex != NULL) { shader = mr_paintedplastic; } else { shader = mr_plastic; } } else { if (_mgc->space & TM_HYPERBOLIC) { shader = mr_hplastic; } else if ((ap->flag & APF_TEXTURE) && ap->tex != NULL) { switch (ap->tex->apply) { case TXF_MODULATE: shader = mr_GVmodulateplastic; break; case TXF_DECAL: shader = mr_GVdecalplastic; break; case TXF_BLEND: shader = mr_GVblendplastic; break; case TXF_REPLACE: shader = mr_GVreplaceplastic; break; } } else { shader = mr_plastic; } } /* define surface */ if (!IS_SMOOTH(ap->shading)) { mrti(mr_shadinginterpolation, mr_constant, mr_surface, shader, mr_Ka, mr_float, mat->ka, mr_Kd, mr_float, mat->kd, mr_Ks, mr_float, mat->ks, mr_specularcolor, mr_parray, 3, &(mat->specular), mr_roughness, mr_float, roughness, mr_NULL); } else { mrti(mr_shadinginterpolation, mr_string, "smooth", mr_surface, shader, mr_Ka, mr_float, mat->ka, mr_Kd, mr_float, mat->kd, mr_Ks, mr_float, mat->ks, mr_specularcolor, mr_parray, 3, &(mat->specular), mr_roughness, mr_float, roughness, mr_NULL); } } /* define texture if appropriate */ if ((ap->flag & APF_TEXTURE) && ap->tex != NULL && ap->tex->image != NULL) { char txtxname[PATH_MAX]; char tifftxname[PATH_MAX]; char filter[PATH_MAX]; int i; unsigned chmask = 0; if (_mgribc->shader == MG_RIBSTDSHADE) { static bool was_here = false; if (!was_here) { OOGLWarn("textures with apply != modulate will not work " "when using the standard shaders.\n"); was_here = true; } } for (i = 0; i < _mgribc->n_tximg; i++) { if (_mgribc->tx[i]->image == ap->tex->image && (_mgribc->tx[i]->flags & (TXF_SCLAMP|TXF_TCLAMP)) == (ap->tex->flags & (TXF_SCLAMP|TXF_TCLAMP))) { break; } } mgrib_mktexname(txtxname, i, _mgribc->tmppath, "tiff.tx"); if (i == _mgribc->n_tximg) { if (_mgribc->n_tximg % 10 == 0) { _mgribc->tx = OOGLRenewNE(Texture *, _mgribc->tx, _mgribc->n_tximg + 10, "New RIB texture images"); } _mgribc->tx[i] = ap->tex; _mgribc->n_tximg++; /* try to dump the image to disk */ mgrib_mktexname(tifftxname, i, _mgribc->displaypath, "tiff"); #ifdef HAVE_PAMTOTIFF chmask = (1 << ap->tex->image->channels) - 1; sprintf(filter, "pamtotiff -lzw -truecolor > %s 2> /dev/null", tifftxname); #else chmask = ap->tex->image->channels > 2 ? 0x7 : 0x1; sprintf(filter, "pnmtotiff -lzw -truecolor > %s 2> /dev/null", tifftxname); #endif if (!ImgWriteFilter(ap->tex->image, chmask, filter)) { _mgribc->tx[i] = NULL; --_mgribc->n_tximg; } mgrib_mktexname(tifftxname, i, NULL, "tiff"); mrti_makecurrent(&_mgribc->txbuf); mrti(mr_maketexture, mr_string, tifftxname, mr_string, txtxname, mr_string, ap->tex->flags & TXF_SCLAMP ? "clamp" : "periodic", mr_string, ap->tex->flags & TXF_TCLAMP ? "clamp" : "periodic", mr_string, "gaussian", mr_float, 2.0, mr_float, 2.0, mr_NULL); mrti_makecurrent(&_mgribc->worldbuf); } if (i < _mgribc->n_tximg) { mrti(mr_texturename, mr_string, txtxname, mr_NULL); } if (ap->tex->apply == TXF_BLEND) { mrti(mr_string, "bgcolor", mr_parray, 3, &(ap->tex->background), mr_NULL); } if (ap->tex->apply != TXF_DECAL) { mrti(mr_string, "At", mr_float, (ap->flag & APF_TRANSP) ? 1.0 : 0.0, mr_NULL); } } } } void mgrib_lighting(struct mgastk *astk, int mask) { LmLighting *lm = &astk->lighting; if (lm->valid & mask & LMF_AMBIENT) { mrti(mr_section, "Interpreting Lights", mr_NULL); /* output the ambient light */ mrti(mr_comment, "Ambient Light", mr_NULL); mrti(mr_lightsource, mr_ambientlight, mr_int, 0, mr_lightcolor, mr_parray, 3, &(lm->ambient), mr_NULL); } /* We must be in global coordinate space to place lights correctly. */ mrti(mr_transformbegin, mr_identity, mr_NULL); mgrib_lights( lm, astk ); mrti(mr_transformend, mr_NULL); } /* In GL, we want unique light numbers. In RenderMan we want to re-use light numbers, so we always start with light "1". In GL, we define then bind lights. Defining is expensive and we avoid it as much as possible. In RenderMan, it's a one-step process. Also, once a light is defined it cannot be deleted. Thus we might need to explicitly turn off lights if we are replacing more lights with less lights. So we keep track of how many lights we've used so far, and turn off the extras when we need to. 1/13/92 TMM */ void mgrib_lights( LmLighting *lm, struct mgastk *astk ) { int i, lightsused; LtLight *light, **lp; static int prevused = 0; lightsused = 0; LM_FOR_ALL_LIGHTS(lm, i,lp) { light = *lp; ++lightsused; if (light->Private == 0) { /* this is a new light */ light->Private = lightsused; light->changed = 1; } if (light->changed) { if (light->position.w == 0.0) { /* directional light */ /* We used to output the lights as "to" instead of as "from". This is like negating them, which is why we then did explicitly negate them to get the right result! So, leave the lights alone now. Do NOT negate them. It's NOT about handedness of coordinate systems. */ mrti(mr_comment, "Directional Light", mr_lightsource, mr_distantlight, mr_int, light->Private, mr_intensity, mr_float, light->intensity, mr_lightcolor, mr_parray, 3, &(light->color), mr_string, "from", mr_parray, 3, &(light->globalposition), mr_string, "to", mr_array, 3, 0.,0.,0., /* aim at origin */ mr_NULL); } else { /* point light */ mrti(mr_lightsource, mr_string, "pointlight", mr_int, light->Private, mr_intensity, mr_float, light->intensity, mr_lightcolor, mr_parray, 3, &(light->color), mr_string, "from", mr_parray, 3, &(light->globalposition), mr_NULL); } light->changed = 0; } } for (i = lightsused +1; i <= prevused; i++) mrti(mr_illuminate, mr_int, i, mr_int, 0, mr_NULL); if (prevused < lightsused) prevused = lightsused; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/mg/rib/mgribtoken.c0000644000175000017500000004655012310110201015301 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * NOTES: * 1. mrti() assumes unsigned short is 2 bytes, MSB first * this may have to change for other architecture * 2. will it be possible to increase the encoded float array length * by "adding l" to create 256 aggregates of 3 or 4 floats each, as * opposed to 256 straight floats? (see appendix C, pg 163 of the * 'big' renderman manual) * 3. the name mrti should be changed to mgri (it sounds better) */ #include "mgribtoken.h" #include #include "mg.h" #include "mgribP.h" #include "mgrib.h" #ifdef test #include #endif #define BUFFERSIZE 1024*128 /* 128k buffer */ #define TMPSIZE 8192 #define SECTIONWIDTH 70 /* width of a section header */ #define STRINGDEF (char)0315 #define STRINGREF (char)0317 #define LNGSTRINGENCODE (char)0241 /* length follows, is unsigned short */ #define STRINGENCODE (char)0220 #define RIREQDEF (char)0314 #define RIREQREF (char)0246 #define FLOATARRAYDEF (char)0310 #define INTEGER (char)0201 /* unsigned short */ #define FLOAT (char)0244 void binary_token(int a1, va_list *alist); void ascii_token(int a1, va_list *alist); TokenBuffer *_tokenbuffer; #define tokenbuffer _tokenbuffer->tkb_buffer #define ptr _tokenbuffer->tkb_ptr #define limit _tokenbuffer->tkb_limit #define worldptr _tokenbuffer->tkb_worldptr #define TABLEROW(cname, reqn) {cname, sizeof(cname)-1, reqn, 0 } /* following is the table: see mgribtoken.h (struct) for desc of fields */ static struct _table table[] = { TABLEROW("", 0), /* mr_NULL */ /* Ri Requests */ TABLEROW("AttributeBegin", 0), TABLEROW("AttributeEnd", 1), TABLEROW("TransformBegin", 2), TABLEROW("TransformEnd", 3), TABLEROW("Identity", 4), TABLEROW("ConcatTransform", 5), TABLEROW("Surface", 6), TABLEROW("ShadingInterpolation", 7), TABLEROW("Color", 8), TABLEROW("Opacity", 9), TABLEROW("Polygon", 10), TABLEROW("PatchMesh", 11), TABLEROW("Format", 12), TABLEROW("Projection", 13), TABLEROW("Clipping", 14), TABLEROW("WorldBegin", 15), TABLEROW("WorldEnd", 16), TABLEROW("Display", 17), TABLEROW("ScreenWindow", 19), TABLEROW("LightSource", 20), TABLEROW("Sphere", 21), TABLEROW("Translate", 22), TABLEROW("Rotate", 23), TABLEROW("Cylinder", 24), TABLEROW("NuPatch", 25), TABLEROW("ShadingRate", 26), TABLEROW("Option", 27), TABLEROW("Illuminate", 28), TABLEROW("FrameBegin", 29), TABLEROW("FrameEnd", 30), TABLEROW("ReverseOrientation", 31), TABLEROW("Curves", 32), TABLEROW("Points", 33), TABLEROW("MakeTexture", 34), TABLEROW("Declare", 35), /* following are reserved - do not add */ /* or remove fields, just change them! */ TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), /* Strings - we start these out at position 50 */ TABLEROW("P", 0), TABLEROW("N", 1), TABLEROW("Cs", 2), TABLEROW("Pw", 3), TABLEROW("Os", 4), TABLEROW("st", 5), TABLEROW("plastic", 6), TABLEROW("paintedplastic", 7), TABLEROW("hplastic", 8), TABLEROW("eplastic", 9), TABLEROW("heplastic", 10), TABLEROW("constant", 11), TABLEROW("ambientlight", 12), TABLEROW("lightcolor", 13), TABLEROW("distantlight", 14), TABLEROW("intensity", 15), TABLEROW("file", 16), TABLEROW("rgb", 17), TABLEROW("rgba", 18), TABLEROW("Ka", 19), TABLEROW("Kd", 20), TABLEROW("Ks", 21), TABLEROW("specularcolor", 22), TABLEROW("roughness", 23), TABLEROW("fov", 24), TABLEROW("perspective", 25), TABLEROW("to", 26), TABLEROW("framebuffer", 27), TABLEROW("texturename", 28), TABLEROW("width", 29), TABLEROW("constantwidth", 30), /* strings for extended texture aware shaders with support for alpha */ TABLEROW("GVmodulateplastic", 31), TABLEROW("GVmodulateconstant", 32), TABLEROW("GVdecalplastic", 33), TABLEROW("GVdecalconstant", 34), TABLEROW("GVblendplastic", 35), TABLEROW("GVblendconstant", 36), TABLEROW("GVreplaceplastic", 37), TABLEROW("GVreplaceconstant", 38), TABLEROW("periodic", 39), TABLEROW("gaussian", 40) }; void mrti_makecurrent(TokenBuffer *tkbuf) { _tokenbuffer = tkbuf; } void mrti_delete(TokenBuffer *tkbuf) { if (tkbuf->tkb_buffer) { free(tkbuf->tkb_buffer); if (_tokenbuffer == tkbuf) { _tokenbuffer = NULL; } memset(tkbuf, 0, sizeof(tkbuf)); } } /* initialize tokenbuffer */ void mrti_init(TokenBuffer *tkbuf) { tkbuf->tkb_buffer = (char *)malloc(BUFFERSIZE); tkbuf->tkb_limit = (char *)(tkbuf->tkb_buffer + BUFFERSIZE); tkbuf->tkb_worldptr = tkbuf->tkb_ptr = tkbuf->tkb_buffer; tkbuf->tkb_buffer[0] = '\0'; } /* reset the ptr & tokenbuffer */ void mrti_reset(void) { worldptr = ptr = tokenbuffer; tokenbuffer[0] = '\0'; } /* quick copy routine w/ ptr update */ void cat(char *s, char *a) { while((*(s++)=(*(a++)))) ptr++; } /* routine will check buffer for possible overun, will realloc if needed */ /* generally, "worst case" values should be passed to check_buffer */ void check_buffer(int length) { length += 8; if((char *)(ptr+length)>(char *)limit) { /* optinally check for maximum buffer allocation here */ size_t world = worldptr - tokenbuffer; size_t used = ptr - tokenbuffer; size_t avail = limit - tokenbuffer; /* Buffer grows exponentially, by factor of 1.5 each time */ do { avail += avail>>1; } while(used+length >= avail); tokenbuffer = (char *)realloc(tokenbuffer, avail); ptr = tokenbuffer + used; worldptr = tokenbuffer + world; limit = tokenbuffer + avail; } } /* process variable size token list */ void mrti(int a1, ... ) { va_list alist; va_start(alist, a1); switch(_mgribc->render_device) { case RMD_BINARY: binary_token(a1, &alist); break; case RMD_ASCII: ascii_token(a1, &alist); break; } va_end(alist); } /* return 1 when supplied token requires its own (ascii) line, 0 otherwise */ bool line_initializer(int token) { /* THIS IS HACKISH - IT WILL CREATE A LINE FEED BEFORE */ /* IT CREATES THE NEW LINE, WHICH ISN'T ALWAYS GOOD!! */ if(token=mr_P && token<=mr_Os)) return true; else return false; } /* ASCII SUBPROCESSING */ void ascii_token(int token, va_list *alist) { int i; int count, number; static int arraysize; static int expectSubArray=0; static char astring[128]; double nextfloat; /* va_arg converts floats to doubles */ float *floatptr; char *s; int len; do { if(expectSubArray && (token!=mr_subarray3) && (token!=mr_subarray2)) { /* ERROR */ } /* check to see if we need to start a new line */ if(line_initializer(token) && *(ptr-1)!='\n') *(ptr++)='\n'; switch(token) { case mr_section: check_buffer(SECTIONWIDTH); /* should not exceed this */ s = va_arg(*alist, char*); len = strlen(s); if(len+3>SECTIONWIDTH) len = SECTIONWIDTH-3;/* 3 added characters */ *(ptr++)='\n'; cat(ptr,"# "); cat(ptr,s); cat(ptr," "); len = SECTIONWIDTH - 3 - len; while((len--)>0) *(ptr++)='*'; break; case mr_comment: s = va_arg(*alist, char*); len = strlen(s); check_buffer(len+2); cat(ptr,"# "); cat(ptr,s); break; case mr_header: s = va_arg(*alist, char*); len = strlen(s); check_buffer(len+2); cat(ptr,"##"); cat(ptr,s); break; case mr_nl: /* check for space */ check_buffer(2); if(*(ptr-1)==' ') ptr--; *(ptr++)='\n'; break; case mr_array: arraysize = va_arg(*alist, int); check_buffer(arraysize*16+4); /* how else can we do this? */ *(ptr++)='['; for(i=0;i 1 byte into an * arbitrary (unaligned) location. e.g. * *(unsigned short *)ptr = anUnsignedVariable * may be an illegal instruction. Therefore, macros which will copy these * values one byte at a time follow here and are used where needed. These * macros will work only with float sizes of 4 bytes (IEEE) & unsigned short * int sizes of 2 bytes */ /* cH: hey, folks, there are sane machines around, I mean: with the * "correct" LITTLE-ENDIAN byte order ... * * RIB requires BIG-ENDIAN, so handle the case. */ #if WORDS_BIGENDIAN # define COPYUSHORT( value ) \ *ptr++ = ((char *)&value)[0]; \ *ptr++ = ((char *)&value)[1] # define COPYFLOAT( value ) \ *ptr++ = ((char *)&value)[0]; \ *ptr++ = ((char *)&value)[1]; \ *ptr++ = ((char *)&value)[2]; \ *ptr++ = ((char *)&value)[3] #else # define COPYUSHORT( value ) \ *ptr++ = ((char *)&value)[1]; \ *ptr++ = ((char *)&value)[0] # define COPYFLOAT( value ) \ *ptr++ = ((char *)&value)[3]; \ *ptr++ = ((char *)&value)[2]; \ *ptr++ = ((char *)&value)[1]; \ *ptr++ = ((char *)&value)[0] #endif void binary_token(int token, va_list *alist) { int i; static int expectSubArray=0; static int arraysize; float *floatptr; if(expectSubArray && (token!=mr_subarray3) && (token!=mr_subarray2)) { /* ERROR */ } do { /* single '&' on next line changed to && by mbp Wed May 17 22:33:00 2000 */ if((token>=STRINGBASE) && (token /*----------------------------------------------------------------------- * Function: mgrib_printmatrix * Description: prints rib binding for given matrix * Returns: nothing * Author: wisdom * Date: Thu Aug 26 13:39:21 CDT 1993 * Notes: */ void mgrib_printmatrix(Transform T) { mrti(mr_concattransform, mr_parray, 16, T, mr_NULL); } geomview-1.9.5/src/lib/mg/rib/mgrib.h0000644000175000017500000000525412310110201014241 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * MG context attributes specific to Renderman rib driver (mgrib) * */ #ifndef _GV_MGRIB_H_ #define _GV_MGRIB_H_ #define MG_RIBWINID 300 /* token: int */ #define MG_RIBBORN 301 /* token: int (boolean) */ #define MG_RIBFILE 302 /* token: FILE* */ #define MG_RIBLINEMODE 303 /* token: int */ #define MG_RIBPOLYGON 304 /* possible value for MG_RIBLINEMODE */ #define MG_RIBCYLINDER 305 /* possible value for MG_RIBLINEMODE */ #define MG_RIBPRMANLINE 306 /* possible value for MG_RIBLINEMODE */ #define MG_RIBFORMAT 307 /* token: int */ #define MG_RIBASCII 308 /* possible value for MG_RIBFORMAT */ #define MG_RIBBINARY 309 /* possible value for MG_RIBFORMAT */ #define MG_RIBFILEPATH MG_RIBDISPLAYNAME /* obsolete. token: char* */ #define MG_RIBDISPLAY 311 /* token: int */ #define MG_RIBTIFF 312 /* possible value for MG_RIBDISPLAY */ #define MG_RIBFRAME 313 /* possible value for MG_RIBDISPLAY */ #define MG_RIBDISPLAYNAME 314 /* token: char* */ #define MG_RIBBACKING 315 /* token: int */ #define MG_RIBDOBG 316 /* possible value for MG_RIBBACKING */ #define MG_RIBNOBG 317 /* possible value for MG_RIBBACKING */ #define MG_RIBSHADER 318 /* token: int */ #define MG_RIBSTDSHADE 319 /* possible value for MG_RIBSHADER */ #define MG_RIBEXTSHADE 320 /* possible value for MG_RIBSHADER */ #define MG_RIBSCENE 321 /* RIB 1.0: scene name: char* */ #define MG_RIBCREATOR 322 /* RIB 1.0: creator: char* */ #define MG_RIBFOR 323 /* RIB 1.0: user: char* */ #define MG_RIBDATE 324 /* RIB 1.0: date: char* */ /* following are functions wich need to be accessed by main program */ void mgrib_flushbuffer(); /* flushes tokens from buffer to file */ #endif /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mg/rib/mgribP.h0000644000175000017500000001161312310110201014355 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include "mg.h" #include "mgP.h" #include "mgrib.h" #include "mgribtoken.h" #include "transform.h" #include "bezierP.h" #define DEFAULT_RIB_FILE "geom.rib" typedef struct mgribcontext { struct mgcontext mgctx; /* The mgcontext */ bool born; /* Has window been displayed on the screen? */ int win; /* window ID, or 0 */ int world; /* inc/decremented by worldbegin()/end() */ int persp; /* camera projection */ float focallen; /* focallen */ enum { RMD_ASCII, RMD_BINARY } render_device; /* Device Options */ /* Which line drawing technique? * MG_RIBPOLYGON for creating RIB tokens true to OOGL/geomview, but may appear * incorrect when viewed dynamically * MG_RIBCYLINDER for creating RIB tokens which may be dynamically viewed, but * may not be true to OOGL/geomview * MG_RIBPRMANLINE for NeXT Renderer - May Cause Incompatibilities! * Note: Future versions of renderman should support line drawing, NeXT does * now. */ enum line_mode { RM_POLYGON = MG_RIBPOLYGON, RM_CYLINDER = MG_RIBCYLINDER, RM_PRMANLINE = MG_RIBPRMANLINE } line_mode; /* MG_RIBFRAME: render to framebuffer (screen window) * MG_RIBTIFF: render to file */ enum display { RM_FRAME = MG_RIBFRAME, RM_RIBTIFF = MG_RIBTIFF } display; FILE *rib; bool rib_close; /* set to true if we have opened rib ourselves */ char displayname[PATH_MAX]; /* if display == MG_RIFILE, name of the file */ char displaypath[PATH_MAX]; /* dirname(display), if MG_RIFILE */ char displaybase[PATH_MAX]; /* basename(display), if MG_RIFILE */ const char *tmppath; /* MG_RIBDOBG: simulate colored background w/ polygon * MG_RIBNOBG: no background simulation (defualt) */ enum backing { RB_DOBG = MG_RIBDOBG, RB_NOBG = MG_RIBNOBG } backing; /* MG_RIBSTDSHADE: uses standard shader * MG_RIBEXTSHADE: uses extended shaders (eplastic, * heplastic, hplastic) * * + the shaders needed to support Geomview's texture model * (modulate/decal/blend), including alpha channel support. */ enum shader { RM_STDSHADE = MG_RIBSTDSHADE, RM_EXTSHADE = MG_RIBEXTSHADE } shader; char *shadepath; /* path to extended shaders or user shaders */ char ribscene[128]; /* scene name for RIB 1.0 file comments */ char ribcreator[128]; /* creator field for RIB 1.0 file comments */ /* defaults to "mgrib driver" */ char ribfor[128]; /* for(user) field for RIB 1.0 file comments */ /* defaults to user account name */ char ribdate[128]; /* creation date, defualts to today's date */ Texture **tx ; /* array of textures used; texture images are * dumped to disk with * displayname.#seq.tiff. Textures are * considered equal (for this purpose) if they * refer to the same image and have the same * clamping settings (we leave the clamping to * MakeTexture, that is the reason). */ int n_tximg; /* How many of them */ int n_txdumped; /* How many already got their MakeTexture line */ TokenBuffer worldbuf; /* buffer for everything except MakeTexture */ TokenBuffer txbuf; /* buffer for MakeTexture */ } mgribcontext; /* Make some convenient defines */ #define RiDEV _mgribc->render_device #define NotImplemented(name) fprintf(stderr,"%s is not yet implemented.\n",name); #define _mgribc ((mgribcontext*)_mgc) #define RI_INFINITY 1.0e38 void mgrib_printmatrix(Transform T); void mgrib_drawline(HPoint3 *p1, HPoint3 *p2); void mgrib_drawpoint(HPoint3 *p); void mgrib_drawnormal(HPoint3 *p, Point3 *n); static inline void mgrib_mktexname(char *txname, int seq, const char *path, const char *suffix) { if (snprintf(txname, PATH_MAX, "%s%s%s-tx%d.%s", path ? path : "", path ? "/" : "", _mgribc->displaybase, seq, suffix) >= PATH_MAX) { OOGLError(1, "path to texture-file exceedsd maximum length %d", PATH_MAX); } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mg/rib/mgribshade.h0000644000175000017500000000235212310110201015242 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* this could be much larger but that's the way the Iris works now this is from gl/gl.h and is used in mgglshade.c */ #define MAXLIGHTS 8 extern void mgrib_lighting( struct mgastk *, int mask ); extern void mgrib_lights( LmLighting *lm, struct mgastk *astk ); extern void mgrib_appearance( struct mgastk *astk, int ap_mask, int mat_mask); geomview-1.9.5/src/lib/mg/rib/mgribtoken.h0000644000175000017500000001010412310110201015270 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _GV_MGRIBTOKEN_H_ #define _GV_MGRIBTOKEN_H_ /* minnegraphics renderman token interface */ typedef struct tokenbuffer { char *tkb_buffer; /* base of buffer */ char *tkb_worldptr; /* ptr to worldbegin in buffer */ char *tkb_ptr; /* ptr past last data char */ char *tkb_limit; /* ptr past last allocated char */ } TokenBuffer; void mrti_init(TokenBuffer *tkbuf); void mrti_delete(TokenBuffer *tkbuf); void mrti_makecurrent(TokenBuffer *tkbuf); void mrti_reset(void); void mrti( int a1, ... ); #define STRINGBASE 50 /* strings start at 50 */ enum tokentype { mr_NULL=0, /* RI Requests */ mr_attributebegin, mr_attributeend, mr_transformbegin, mr_transformend, mr_identity, mr_concattransform, /* Transform T */ mr_surface, mr_shadinginterpolation, mr_color, /* float *ptr (mr_array w/size=3) */ mr_opacity, /* float alpha (will become an array) */ mr_polygon, /* following arrays must be declared explicitly */ mr_patchmesh, /* Ditto */ mr_format, /* follow with mr_intseq */ mr_projection, mr_clipping, mr_worldbegin, mr_worldend, mr_display, mr_screenwindow, mr_lightsource, mr_sphere, mr_translate, mr_rotate, mr_cylinder, mr_nupatch, mr_shadingrate, mr_option, mr_illuminate, mr_framebegin, mr_frameend, mr_reverseorientation, mr_curves, mr_points, mr_maketexture, mr_declare, /* Strings */ mr_P=STRINGBASE, mr_N, mr_Cs, mr_Pw, mr_Os, mr_st, mr_plastic, mr_paintedplastic, mr_hplastic, mr_eplastic, mr_heplastic, mr_constant, mr_ambientlight, mr_lightcolor, mr_distantlight, mr_intensity, mr_file, mr_rgb, mr_rgba, mr_Ka, mr_Kd, mr_Ks, mr_specularcolor, mr_roughness, mr_fov, mr_perspective, mr_to, mr_framebuffer, mr_texturename, mr_width, mr_constantwidth, mr_GVmodulateplastic, mr_GVmodulateconstant, mr_GVdecalplastic, mr_GVdecalconstant, mr_GVblendplastic, mr_GVblendconstant, mr_GVreplaceplastic, mr_GVreplaceconstant, mr_periodic, mr_gaussian, /* SPECIAL */ mr_array, /* (full array) size, f,f,.. */ mr_buildarray, /* size (subarys follow w/total subsizes==size) */ mr_parray, /* subsize, *float, *float, .. */ mr_subarray3, /* ptr to aggregate of 3 floats (most common) */ mr_subarray2, /* ptr to aggregate of 2 floats (texture) */ mr_section, /* char *string */ mr_comment, /* char *string */ mr_nl, /* new line */ mr_int, mr_intseq, /* int numberOfInts, int, int, .. (NOT AN ARRAY!)*/ mr_float, mr_string, mr_embed, mr_header /* ## 'header' comments for RIB 1.0 structure */ }; struct _table { char *name; /* string representing token, or null */ int len; /* length of string */ unsigned char reqn; /* number used to define request/string to renderer */ bool defined; /* flags weather request/string has been defined */ }; #endif /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/lib/mg/rib/Headers0000644000175000017500000000005312310110201014256 00000000000000mgrib.h mgribP.h mgribshade.h mgribtoken.h geomview-1.9.5/src/lib/mg/opengl/0000755000175000017500000000000012310165603013572 500000000000000geomview-1.9.5/src/lib/mg/opengl/Makefile.in0000644000175000017500000004673412310165554015602 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/mg/opengl DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libmgopengl_la_LIBADD = am_libmgopengl_la_OBJECTS = mgopengl.lo mgopengldraw.lo \ mgopenglmesh.lo mgopenglshade.lo mgopenglstipple.lo libmgopengl_la_OBJECTS = $(am_libmgopengl_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libmgopengl_la_SOURCES) DIST_SOURCES = $(libmgopengl_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) $(OPENGLINCLUDE) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgopengl.la libmgopengl_la_SOURCES = \ mgopengl.c mgopengldraw.c mgopenglmesh.c mgopenglshade.c \ mgopengl.h mgopenglP.h mgopenglshade.h \ mgopenglstipple.c mgopenglstipple.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/mg/opengl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/mg/opengl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libmgopengl.la: $(libmgopengl_la_OBJECTS) $(libmgopengl_la_DEPENDENCIES) $(EXTRA_libmgopengl_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libmgopengl_la_OBJECTS) $(libmgopengl_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgopengl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgopengldraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgopenglmesh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgopenglshade.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgopenglstipple.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/mg/opengl/Makefile.am0000644000175000017500000000043212310110200015524 00000000000000INCLUDES = $(default_includes) $(OPENGLINCLUDE) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgopengl.la libmgopengl_la_SOURCES = \ mgopengl.c mgopengldraw.c mgopenglmesh.c mgopenglshade.c \ mgopengl.h mgopenglP.h mgopenglshade.h \ mgopenglstipple.c mgopenglstipple.h geomview-1.9.5/src/lib/mg/opengl/mgopengl.c0000644000175000017500000012455412310110200015460 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "mgP.h" #include "mgopenglP.h" #include "windowP.h" #include "mgopenglshade.h" #include "mgopenglstipple.h" #ifdef GLUT # include #else #define GL_GLEXT_PROTOTYPES # include # include # include #endif #include #ifdef GLUT # define Window int #endif #include "polylistP.h" mgcontext * mgopengl_ctxcreate(int a1, ...); int mgopengl_ctxset( int a1, ... ); int mgopengl_feature( int feature ); void mgopengl_ctxdelete( mgcontext *ctx ); int mgopengl_ctxget( int attr, void* valueptr ); int mgopengl_ctxselect( mgcontext *ctx ); void mgopengl_sync( void ); void mgopengl_worldbegin( void ); void mgopengl_worldend( void ); void mgopengl_reshapeviewport( void ); void mgopengl_identity( void ); void mgopengl_transform( Transform T ); int mgopengl_pushtransform( void ); int mgopengl_poptransform( void ); void mgopengl_gettransform( Transform T ); void mgopengl_settransform( Transform T ); int mgopengl_pushappearance( void ); int mgopengl_popappearance( void ); const Appearance *mgopengl_setappearance(const Appearance* app, int merge ); int mgopengl_setcamera( Camera* cam ); int mgopengl_setwindow( WnWindow *win, int final ); mgopenglcontext *mgopengl_newcontext( mgopenglcontext *ctx ); void mgopengl_taggedappearance(const void *tag); extern void mgopengl_polygon(); extern void mgopengl_line(); extern void mgopengl_polyline(); extern void mgopengl_polylist(int np, Poly *p, int nv, Vertex *v, int plflags); extern void mgopengl_mesh(int wrap, int nu, int nv, HPoint3 *meshP, Point3 *meshN, Point3 *meshNQ, ColorA *meshC, TxST *meshST, int mflags); extern void mgopengl_quads(int count, HPoint3 *V, Point3 *N, ColorA *C, int qflags); int _mgopengl_ctxset(int a1, va_list *alist); static void mgopengl_choosewin(void), mgopengl_initwin(void); static void mgopengl_setviewport(void); static void mgimgfile2cambgimage(void); #ifndef GLUT static GLXContext mgopengl_sharectx(void); #endif WnWindow *mgopenglwindow(WnWindow *win); struct mgfuncs mgopenglfuncs = { MGD_OPENGL, mgdevice_OPENGL, mgopengl_feature, (mgcontext *(*)())mgopengl_ctxcreate, mgopengl_ctxdelete, (int (*)())mgopengl_ctxset, mgopengl_ctxget, mgopengl_ctxselect, mgopengl_sync, mgopengl_worldbegin, mgopengl_worldend, mgopengl_reshapeviewport, /* geometry transform */ mgopengl_settransform, mgopengl_gettransform, mgopengl_identity, mgopengl_transform, mgopengl_pushtransform, mgopengl_poptransform, /* texture transform */ mg_settxtransform, mg_gettxtransform, mg_txidentity, mg_txtransform, mg_pushtxtransform, mg_poptxtransform, /* appearance stack */ mgopengl_pushappearance, mgopengl_popappearance, mgopengl_setappearance, mg_getappearance, /*******************/ mgopengl_setcamera, mgopengl_polygon, mgopengl_polylist, mgopengl_mesh, mgopengl_line, mgopengl_polyline, mgopengl_quads, mg_bezier, mgopengl_bsptree, mg_tagappearance, mg_untagappearance, mgopengl_taggedappearance }; int mgdevice_OPENGL() { _mgf = mgopenglfuncs; if (_mgc != NULL && _mgc->devno != MGD_OPENGL) _mgc = NULL; return(0); } /*----------------------------------------------------------------------- * Function: mgopengl_ctxcreate * Date: Thu Jul 18 18:55:18 1991 * Author: mbp * Notes: see mg.doc for rest of spec */ mgcontext * mgopengl_ctxcreate(int a1, ...) { va_list alist; _mgc = (mgcontext*)mgopengl_newcontext(OOGLNewE(mgopenglcontext, "mgopengl_ctxcreate")); va_start(alist, a1); if (_mgopengl_ctxset(a1, &alist) == -1) { mgopengl_ctxdelete(_mgc); } va_end(alist); return _mgc; } /*----------------------------------------------------------------------- * Function: _mgopengl_ctxset * Description: internal ctxset routine * Args: a1: first attribute * *alist: rest of attribute-value list * Returns: -1 on error, 0 on success * Author: mbp * Date: Fri Sep 20 11:08:13 1991 * Notes: mgopengl_ctxcreate() and mgopengl_ctxset() call this to actually * parse and interpret the attribute list. */ int _mgopengl_ctxset(int a1, va_list *alist) { int attr; char **ablock = NULL; #define NEXT(type) OOGL_VA_ARG(type,alist,ablock) for (attr = a1; attr != MG_END; attr = NEXT(int)) { switch (attr) { case MG_ABLOCK: ablock = NEXT(char**); break; case MG_ApSet: { Appearance *ap; if (ablock) { ap = ApSet(NULL, AP_ABLOCK, ablock); } else { ap = _ApSet(NULL, va_arg(*alist, int), alist); } mgopengl_setappearance(ap, MG_MERGE); ApDelete(ap); } break; case MG_WnSet: if (ablock) { WnSet( _mgc->win, WN_ABLOCK, ablock); } else { _WnSet( _mgc->win, va_arg(*alist, int), alist); } mgopengl_setwindow( _mgc->win, 0 ); break; case MG_CamSet: if (ablock) { CamSet( _mgc->cam, CAM_ABLOCK, ablock); } else { _CamSet( _mgc->cam, va_arg(*alist, int), alist); break; } break; case MG_APPEAR: mgsetappearance(NEXT(Appearance *), MG_SET); break; case MG_WINDOW: mgopengl_setwindow( NEXT(WnWindow *), 0 ); break; case MG_CAMERA: mgopengl_setcamera( NEXT(Camera*) ); break; case MG_SETOPTIONS: _mgc->opts |= NEXT(int); break; case MG_UNSETOPTIONS: _mgc->opts &= ~NEXT(int); break; case MG_SHOW: _mgc->shown = NEXT(int); break; case MG_PARENT: _mgc->parent = NEXT(mgcontext*); break; case MG_BACKGROUND: { _mgc->background = *NEXT(ColorA*); if (_mgc->cam) { CamSet(_mgc->cam, CAM_BGCOLOR, &_mgc->background, CAM_END); } break; } case MG_SHADER: mgopengl_setshader( NEXT(mgshadefunc) ); break; case MG_SHADERDATA: _mgc->astk->shaderdata = NEXT(void*); break; case MG_SPACE: { int space = NEXT(int); switch (TM_SPACE(space)) { case TM_EUCLIDEAN: case TM_SPHERICAL: _mgc->space = space; break; case TM_HYPERBOLIC: switch (TM_MODEL(space)) { case TM_VIRTUAL: case TM_PROJECTIVE: case TM_CONFORMAL_BALL: _mgc->space = space; break; default: fprintf(stderr, "_mgopengl_ctxset: Illegal space value %1d\n", space); break; } break; default: fprintf(stderr, "_mgopengl_ctxset: Illegal space value %1d\n", space); break; } } break; case MG_NDCTX: _mgc->NDctx = NEXT(mgNDctx *); break; case MG_WINCHANGE: _mgc->winchange = NEXT(mgwinchfunc); break; case MG_WINCHANGEDATA: _mgc->winchangeinfo = NEXT(void *); break; case MG_ZNUDGE: _mgc->zfnudge = NEXT(double); if(_mgopenglc->born) mgopengl_init_zrange(); break; case MG_BITDEPTH: /*ignored*/ NEXT(int); break; case MG_DITHER: _mgopenglc->dither = NEXT(int); break; case MG_DEPTHSORT: /*ignored*/ NEXT(int); break; /* Open GL-specific */ case MG_GLWINID: _mgopenglc->win = NEXT(int); break; #ifndef GLUT case MG_GLXDISPLAY: _mgopenglc->GLXdisplay = NEXT(void *); break; case MG_GLXSINGLECTX: _mgopenglc->cam_ctx[SGL] = NEXT(GLXContext); break; case MG_GLXDOUBLECTX: _mgopenglc->cam_ctx[DBL] = NEXT(GLXContext); break; #endif case MG_GLXSINGLEWIN: _mgopenglc->winids[SGL] = NEXT(int); break; case MG_GLXDOUBLEWIN: _mgopenglc->winids[DBL] = NEXT(int); break; case MG_BGIMAGEFILE: { char *fname = NEXT(char *); if (_mgopenglc->bgimagefile) { free(_mgopenglc->bgimagefile); } _mgopenglc->bgimagefile = fname ? strdup(fname) : NULL; mgimgfile2cambgimage(); break; } default: OOGLError (0, "_mgopengl_ctxset: undefined option: %d", attr); return -1; } } if (_mgc->shown && !_mgopenglc->born) { /* open the window */ mgopenglwindow(_mgc->win); /* bring gl state into accordance with appearance state */ { Appearance *ap = ApCopy( &(_mgc->astk->ap), NULL ); mgopengl_setappearance( ap, MG_SET ); ApDelete(ap); } } #undef NEXT return 0; } /*----------------------------------------------------------------------- * Function: mgopengl_ctxget * Description: get a context attribute value * Args: attr: the attribute to get * value: place to write attr's value * Returns: 1 for success; -1 if attr is invalid * Author: mbp * Date: Fri Sep 20 11:50:25 1991 * Notes: */ int mgopengl_ctxget(int attr, void* value) { #define VALUE(type) ((type*)value) switch (attr) { /* Attributes common to all MG contexts: */ case MG_APPEAR: *VALUE(Appearance*) = &(_mgc->astk->ap); break; case MG_CAMERA: *VALUE(Camera*) = _mgc->cam; break; case MG_WINDOW: /* In GLUT case, we demand that the caller use mgctxset(MG_WINDOW, ...) * whenever our window size changes. Under GLX/X11, we do it ourselves. */ #ifndef GLUT if(_mgopenglc->win > 0) { int x0, y0; WnPosition wp; unsigned int xsize, ysize, border_width, depth; Window dpyroot, toss; XGetGeometry((Display *) (_mgopenglc->GLXdisplay), (Window) _mgopenglc->win, &dpyroot, &x0, &y0, &xsize, &ysize, &border_width, &depth); XTranslateCoordinates((Display *) (_mgopenglc->GLXdisplay), (Window) _mgopenglc->win, dpyroot, 0, ysize-1, &x0, &y0, &toss); y0 = HeightOfScreen( DefaultScreenOfDisplay((Display *) (_mgopenglc->GLXdisplay))) - y0 - 1; wp.xmin = (long)x0; wp.xmax = (long)(x0+xsize-1); wp.ymin = (long)y0; wp.ymax = (long)(y0+ysize-1); WnSet(_mgc->win, WN_CURPOS, &wp, WN_END); } #endif *VALUE(WnWindow*) = _mgc->win; break; case MG_PARENT: *VALUE(mgcontext*) = _mgc->parent; break; case MG_SETOPTIONS: case MG_UNSETOPTIONS: *VALUE(int) = _mgc->opts; break; case MG_BACKGROUND: *VALUE(ColorA) = _mgc->background; break; case MG_SHADER: *VALUE(mgshadefunc) = _mgc->astk->shader; break; case MG_SHADERDATA: *VALUE(void *) = _mgc->astk->shaderdata; break; case MG_SPACE: *VALUE(int) = _mgc->space; break; case MG_NDCTX: *VALUE(mgNDctx *) = _mgc->NDctx; break; case MG_ZNUDGE: *VALUE(float) = _mgc->zfnudge; break; case MG_DEPTHSORT: *VALUE(int) = MG_ZBUFFER; break; case MG_BITDEPTH: *VALUE(int) = 24; break; case MG_DITHER: *VALUE(int) = _mgopenglc->dither; break; case MG_WINCHANGE: *VALUE(mgwinchfunc) = _mgc->winchange; break; case MG_WINCHANGEDATA: *VALUE(void *) = _mgc->winchangeinfo; break; /* Attributes specific to GL contexts: */ case MG_GLWINID: *VALUE(int) = _mgopenglc->win; break; case MG_GLBORN: *VALUE(int) = _mgopenglc->born; break; case MG_GLZMAX: *VALUE(double) = _mgopenglc->zmax; break; case MG_GLXSINGLEWIN: *VALUE(Window) = _mgopenglc->winids[SGL]; break; case MG_GLXDOUBLEWIN: *VALUE(Window) = _mgopenglc->winids[DBL]; break; #ifndef GLUT case MG_GLXSINGLECTX: *VALUE(GLXContext) = _mgopenglc->cam_ctx[SGL]; break; case MG_GLXDOUBLECTX: *VALUE(GLXContext) = _mgopenglc->cam_ctx[DBL]; break; case MG_GLXSHARECTX: { *VALUE(GLXContext) = mgopengl_sharectx(); break; } #endif case MG_BGIMAGEFILE: *VALUE(char *) = _mgopenglc->bgimagefile; break; default: OOGLError (0, "mgopengl_ctxget: undefined option: %d", attr); return -1; } return 1; #undef VALUE } /*----------------------------------------------------------------------- * Function: mgopenglwindow * Description: create a GL window * Args: *win: the WnWindow structure to realize * Returns: win if success, NULL if not * Author: mbp, slevy * Date: Fri Sep 20 11:56:31 1991 * Notes: makes the GL calls necessary to create a GL window * corresponding to *win. This involves the call to * winopen(), as well as various configuration things. */ WnWindow * mgopenglwindow(WnWindow *win) { mgopengl_choosewin(); mgopengl_setwindow(win, 1); mgopengl_initwin(); return win; } #ifndef GLUT static GLXContext mgopengl_sharectx(void) { mgcontext *another; GLXContext shareable = NULL; for(another = _mgclist; another != NULL; another = another->next) { if(another->devno == MGD_OPENGL) { if((shareable = ((mgopenglcontext *)another)->cam_ctx[SGL]) != NULL || (shareable = ((mgopenglcontext *)another)->cam_ctx[DBL]) != NULL) break; } } return shareable; } #endif/*!GLUT*/ /*----------------------------------------------------------------------- * Function: mgopengl_ctxset * Description: set some context attributes * Args: a1, ...: list of attribute-value pairs * Returns: -1 on error, 0 on success * Author: mbp * Date: Fri Sep 20 12:00:18 1991 */ int mgopengl_ctxset( int a1, ... ) { va_list alist; int result; va_start( alist, a1 ); result = _mgopengl_ctxset(a1, &alist); va_end(alist); return result; } /*----------------------------------------------------------------------- * Function: mgopengl_feature * Description: report whether the GL device has a particular feature * Args: feature: the feature to report on * Returns: an int giving info about feature * Author: mbp * Date: Fri Sep 20 12:00:58 1991 * Notes: -1 means the feature is not present. * * NO OPTIONAL FEATURES SUPPORTED YET. ALWAYS RETURNS -1. */ int mgopengl_feature( int feature ) { return(-1); } /*----------------------------------------------------------------------- * Function: mgopengl_ctxdelete * Description: delete a GL context * Args: *ctx: context to delete * Returns: nothing * Author: slevy * Date: Tue Nov 12 10:29:04 CST 1991 * Notes: Deleting the current context leaves the current-context * pointer set to NULL. */ void mgopengl_ctxdelete( mgcontext *ctx ) { if(ctx->devno != MGD_OPENGL) { mgcontext *was = _mgc; mgctxselect(ctx); mgctxdelete(ctx); if(was != ctx) mgctxselect(was); } else { #define mgoglc ((mgopenglcontext *)ctx) #ifdef GLUT if(mgoglc->winids[0] > 0) glutDestroyWindow(mgoglc->winids[0]); if(mgoglc->winids[1] > 0) glutDestroyWindow(mgoglc->winids[1]); #else /*GLX*/ if(mgoglc->born) { int i; for(i = SGL; i <= DBL; i++) { if(mgoglc->cam_ctx[i] && mgoglc->win > 0) glXDestroyContext( (Display *)(mgoglc->GLXdisplay), mgoglc->cam_ctx[i]); } } #endif vvfree(&((mgopenglcontext *)ctx)->room); if (mgoglc->light_lists) free(mgoglc->light_lists); if (mgoglc->texture_lists) free(mgoglc->texture_lists); if (mgoglc->translucent_lists) free(mgoglc->translucent_lists); if (mgoglc->bgimagefile) { free(mgoglc->bgimagefile); } mg_ctxdelete(ctx); if(ctx == _mgc) _mgc = NULL; } } /*----------------------------------------------------------------------- * Function: mgopengl_ctxselect * Description: select an MG context --- make it current * Args: *ctx: the context to become current * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:04:41 1991 */ int mgopengl_ctxselect( mgcontext *ctx ) { if(ctx == NULL || ctx->devno != MGD_OPENGL) { return mg_ctxselect(ctx); } /* Yes, it's an OpenGL context. Do something useful. */ _mgc = ctx; if(_mgopenglc->win) { #ifdef GLUT if(_mgopenglc->win <= 0) mgopengl_choosewin(); if(_mgopenglc->win > 0) glutSetWindow(_mgopenglc->win); #else /* GLX */ if(_mgopenglc->GLXdisplay != NULL) { _mgopenglc->win = _mgopenglc->winids[ _mgc->opts & MGO_DOUBLEBUFFER ? DBL : SGL ]; _mgopenglc->curctx = _mgopenglc->cam_ctx[ _mgc->opts & MGO_DOUBLEBUFFER ? DBL : SGL ]; if(_mgopenglc->win > 0) glXMakeCurrent( (Display *)_mgopenglc->GLXdisplay, (Window) _mgopenglc->win, _mgopenglc->curctx); } #endif /*GLX*/ } return 0; } /*----------------------------------------------------------------------- * Function: mgopengl_sync * Description: flush buffered GL commands * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:06:09 1991 * Notes: Just flushes the GL buffer -- needed for remote displays. */ void mgopengl_sync( void ) { glFlush(); } /*static int glut_initted = 0;*/ static void mgopengl_makewin(int which) { #define dpy (_mgopenglc->GLXdisplay) int xsize, ysize; #ifdef GLUT WnPosition wp; if(!glut_initted) { static int unargc = 1; static char *unargv[] = { "mg_glut", NULL }; glutInit(&unargc, (char **)&unargv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glut_initted = 0; } if(WnGet(_mgc->win, WN_XSIZE, &xsize) <= 0 || WnGet(_mgc->win, WN_YSIZE, &ysize) <= 0) { xsize = ysize = 200; WnSet(_mgc->win, WN_XSIZE, xsize, WN_YSIZE, 200, WN_END); } if(WnGet(_mgc->win, WN_PREFPOS, &wp) > 0) { glutInitWindowPosition(wp.xmin, wp.ymin); } glutInitWindowSize(xsize, ysize); _mgopenglc->winids[which] = glutCreateWindow("GLUT mg"); #else /* GLX */ static int dblBuf[] = { GLX_DOUBLEBUFFER, GLX_RGBA, GLX_DEPTH_SIZE, 23, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_ALPHA_SIZE, 1, None }; XSetWindowAttributes xswa; int scr = XDefaultScreen(dpy); Window root = XRootWindow(dpy, scr); XVisualInfo *vi = glXChooseVisual(dpy, scr, which==SGL ? dblBuf+1 : dblBuf); if(vi == NULL) { OOGLError(1, "Can't find an OpenGL-capable X visual."); exit(1); } _mgopenglc->cam_ctx[which] = glXCreateContext(dpy, vi, mgopengl_sharectx(), GL_TRUE); xswa.colormap = (vi->visual == XDefaultVisual(dpy, scr)) ? XDefaultColormap(dpy, scr) : XCreateColormap(dpy, root, vi->visual, AllocNone); xswa.event_mask = KeyPressMask|ButtonPressMask |ButtonReleaseMask|ButtonMotionMask |EnterWindowMask|StructureNotifyMask|ExposureMask; xswa.border_pixel = xswa.background_pixel = xswa.backing_pixel = xswa.background_pixmap = None; if(WnGet(_mgc->win, WN_XSIZE, &xsize) <= 0 || WnGet(_mgc->win, WN_YSIZE, &ysize) <= 0) { xsize = ysize = 200; WnSet(_mgc->win, WN_XSIZE, xsize, WN_YSIZE, 200, WN_END); } _mgopenglc->winids[which] = XCreateWindow( dpy, root, 0, 0, xsize, ysize, 0/*border*/, vi->depth, InputOutput, vi->visual, CWEventMask|CWColormap|CWBorderPixel |CWBackPixel|CWBackPixmap, &xswa); XMapWindow(dpy, _mgopenglc->winids[which]); #undef dpy #endif /*GLX*/ } static void mgopengl_choosewin(void) { int which = (_mgc->opts & MGO_DOUBLEBUFFER) ? DBL : SGL; /* Are we on our own? If caller didn't initialize our X state, do it now. */ #ifdef GLUT if(_mgopenglc->winids[which] == 0) { mgopengl_makewin(which); if(_mgopenglc->winids[which] == 0) which = 1-which; } if(_mgc->winchange) (*_mgc->winchange)(_mgc, _mgc->winchangeinfo, MGW_DOUBLEBUF, (which == DBL)); _mgopenglc->win = _mgopenglc->winids[which]; glutSetWindow(_mgopenglc->win); #else /* GLX */ if(_mgopenglc->GLXdisplay == NULL && _mgopenglc->winids[which] == 0) { if((_mgopenglc->GLXdisplay = XOpenDisplay(NULL)) == NULL) { OOGLError(1, "Can't open X display"); return; } } /* Did they tell us single/double-buffering is possible? */ /* Switch back to the other buffer if need be */ if(_mgopenglc->cam_ctx[which] == NULL) { if(_mgopenglc->cam_ctx[1-which] == NULL) { mgopengl_makewin(which); } else { which = 1-which; } } if(_mgc->winchange) (*_mgc->winchange)(_mgc, _mgc->winchangeinfo, MGW_DOUBLEBUF, (which == DBL)); _mgopenglc->curctx = _mgopenglc->cam_ctx[which]; _mgopenglc->win = _mgopenglc->winids[which]; if(_mgopenglc->win > 0) { XRaiseWindow( (Display *)_mgopenglc->GLXdisplay, (Window) _mgopenglc->win ); glXMakeCurrent( (Display *)_mgopenglc->GLXdisplay, (Window) _mgopenglc->win, _mgopenglc->curctx); } #endif /* GLX */ if (_mgopenglc->n_light_lists == 0) _mgopenglc->light_lists = mgopengl_realloc_lists(NULL, &_mgopenglc->n_light_lists); if (_mgopenglc->n_texture_lists == 0) _mgopenglc->texture_lists = mgopengl_realloc_lists(NULL, &_mgopenglc->n_texture_lists); if (_mgopenglc->n_translucent_lists == 0) _mgopenglc->translucent_lists = mgopengl_realloc_lists(NULL, &_mgopenglc->n_translucent_lists); } static void mgopengl_setviewport() { WnPosition vp, whole; WnGet(_mgc->win, WN_VIEWPORT, &vp); glViewport(vp.xmin, vp.ymin, vp.xmax-vp.xmin+1, vp.ymax-vp.ymin+1); glScissor(vp.xmin, vp.ymin, vp.xmax-vp.xmin+1, vp.ymax-vp.ymin+1); if(WnGet(_mgc->win, WN_CURPOS, &whole) <= 0 || vp.xmax-vp.xmin < whole.xmax-whole.xmin || vp.ymax-vp.ymin < whole.ymax-whole.ymin) { glEnable(GL_SCISSOR_TEST); } else { glDisable(GL_SCISSOR_TEST); } _mgc->win->changed &= ~WNF_HASVP; } static void mgopengl_initwin() { GLdouble zrange[2]; int i; LtLight **lp; glEnable(GL_DEPTH_TEST); glEnable(GL_NORMALIZE); glMatrixMode(GL_PROJECTION); glLoadMatrixf((GLfloat *)TM_IDENTITY); glMatrixMode(GL_MODELVIEW); _mgopenglc->oldopts = _mgc->opts; _mgopenglc->born = 1; glGetDoublev(GL_DEPTH_RANGE, zrange); _mgopenglc->zmin = zrange[0]; _mgopenglc->zmax = zrange[1]; mgopengl_init_zrange(); glClearDepth(_mgopenglc->zmax); glClearColor(_mgc->background.r, _mgc->background.g, _mgc->background.b, _mgc->background.a); glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT); if((_mgc->opts&MGO_DOUBLEBUFFER) && !(_mgc->opts&MGO_INHIBITSWAP) ) { #ifdef GLUT glutSwapBuffers(); #else if(_mgopenglc->win > 0) glXSwapBuffers((Display *) (_mgopenglc->GLXdisplay), (Window) _mgopenglc->win); #endif } mgopengl_setviewport(); /* Ensure the lighting gets properly entered into this new window -- * mark all lights as having changed. */ LM_FOR_ALL_LIGHTS(&_mgc->astk->lighting, i,lp) { (*lp)->changed = 1; } mgopengl_setappearance(&_mgc->astk->ap, MG_SET); } /*----------------------------------------------------------------------- * Function: mgopengl_worldbegin * Description: prepare to draw a frame * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:06:58 1991 */ void mgopengl_worldbegin( void ) { static bool first_time = true; Transform V; int which = (_mgc->opts & MGO_DOUBLEBUFFER) ? DBL : SGL; if (first_time) { first_time = false; mgopengl_init_polygon_stipple(); } mg_worldbegin(); /* Initialize W2C, C2W, W2S, S2W, etc. */ if( #ifndef GLUT _mgopenglc->curctx != _mgopenglc->cam_ctx[which] || #endif (_mgc->opts ^ _mgopenglc->oldopts) & MGO_DOUBLEBUFFER) { mgopengl_choosewin(); mgopengl_initwin(); _mgopenglc->oldopts = _mgc->opts; } glColorMask(_mgc->opts & MGO_NORED ? GL_FALSE : GL_TRUE, _mgc->opts & MGO_NOGREEN ? GL_FALSE : GL_TRUE, _mgc->opts & MGO_NOBLUE ? GL_FALSE : GL_TRUE, GL_TRUE ); if(_mgc->win->changed & WNF_HASVP) { mgopengl_setviewport(); } /* Erase to background color & initialize z-buffer */ if (_mgc->opts & MGO_INHIBITCLEAR) { glClearDepth(1.); glClear(GL_DEPTH_BUFFER_BIT); } else { Image *bgimg; glClearDepth( _mgopenglc->zmax); glClearColor(_mgc->background.r, _mgc->background.g, _mgc->background.b, _mgc->background.a); glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT); if((bgimg = _mgc->bgimage)) { static GLint formats[] = { 0, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA }; static GLdouble pos[] = {0.0, 0.0, -1.0}; int xsize, ysize, off; /* Could resize the image to fit the window here, * (or force the window to fit the image!) * but let's make that the user's problem. */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); WnGet(_mgc->win, WN_XSIZE, &xsize); WnGet(_mgc->win, WN_YSIZE, &ysize); glOrtho(0, xsize, 0, ysize, -1, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); if(xsize >= bgimg->width) { pos[0] = (xsize - bgimg->width)/2; off = 0; } else { pos[0] = 0; off = (bgimg->width - xsize) / 2; glPixelStorei(GL_UNPACK_ROW_LENGTH, bgimg->width); } if(ysize >= bgimg->height) { pos[1] = (ysize - bgimg->height)/2; } else { pos[1] = 0; off += bgimg->width * ((bgimg->height - ysize) / 2); } glRasterPos3dv(pos); glDepthMask(GL_FALSE); glDisable(GL_DEPTH_TEST); if (bgimg->channels % 1 == 0) { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); } glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glDrawPixels(xsize < bgimg->width ? xsize : bgimg->width, ysize < bgimg->height ? ysize : bgimg->height, formats[bgimg->channels], GL_UNSIGNED_BYTE, bgimg->data + bgimg->channels*off ); if (bgimg->channels % 1 == 0) { glBlendFunc(GL_SRC_ALPHA, GL_ZERO); glDisable(GL_BLEND); } glDepthMask(GL_TRUE); glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); } } glEnable(GL_DEPTH_TEST); glRenderMode(GL_RENDER); if(_mgopenglc->dither) { glEnable(GL_DITHER); } else { glDisable(GL_DITHER); } _mgc->has = 0; /* Interpret the camera: load the proper matrices onto the GL matrix stacks. */ if(!(_mgc->opts & MGO_INHIBITCAM)) { glMatrixMode(GL_PROJECTION); CamViewProjection( _mgc->cam, V ); glLoadMatrixf( (GLfloat *) V); glMatrixMode(GL_MODELVIEW); glLoadMatrixf( (GLfloat *) _mgc->W2C); } /* Bind the lights; do this here so we get lights in world coords. */ /* Only do this if we're supposed to do lighting */ if (IS_SHADED(_mgc->astk->ap.shading)) mgopengl_lights(&_mgc->astk->lighting, _mgc->astk); } /*----------------------------------------------------------------------- * Function: mgopengl_worldend * Description: finish drawing a frame * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:08:02 1991 */ void mgopengl_worldend( void ) { GLuint list; /* Execute and delete any pending translucent display lists. */ for (list = 0; list < _mgopenglc->translucent_seq; list++) { glCallList(_mgopenglc->translucent_lists[list]); } for (list = 0; list < _mgopenglc->translucent_seq; list++) { /* Destroy the contents of the dpy lists for translucent objects. */ glNewList(_mgopenglc->translucent_lists[list], GL_COMPILE); glEndList(); } _mgopenglc->translucent_seq = 0; if((_mgc->opts&MGO_DOUBLEBUFFER) && !(_mgc->opts&MGO_INHIBITSWAP)) { #ifdef GLUT glutSwapBuffers(); #else if(_mgopenglc->win > 0) glXSwapBuffers(_mgopenglc->GLXdisplay, (Window) _mgopenglc->win); #endif } glFlush(); } /*----------------------------------------------------------------------- * Function: mgopengl_reshapeviewport * Description: adjust to a new window size * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:08:30 1991 * Notes: adjusts both GL's internal viewport setting, as well as * MG context WnWindow's current position and camera's * aspect ratio. */ void mgopengl_reshapeviewport( void ) { float pixasp = 1; WnPosition vp; WnGet(_mgc->win, WN_PIXELASPECT, &pixasp); WnGet(_mgc->win, WN_VIEWPORT, &vp); mgopengl_setviewport(); CamSet(_mgc->cam, CAM_ASPECT, pixasp * (double)(vp.xmax-vp.xmin+1) / (double)(vp.ymax-vp.ymin+1), CAM_END); } /*----------------------------------------------------------------------- * Function: mgopengl_identity * Description: set the current object xform to identity * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:23:48 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * * This assumes we're already in GL_MODELVIEW mode. */ void mgopengl_identity( void ) { /* [ obj xform ] = identity corresponds to having current W2C on ModelView stack */ mgopengl_settransform( TM3_IDENTITY ); } /*----------------------------------------------------------------------- * Function: mgopengl_transform * Description: premultiply the object xform by T * Args: T * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:24:57 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * * This assumes we're already in GL_MODELVIEW mode. */ void mgopengl_transform( Transform T ) { glMultMatrixf( (GLfloat *) (T)); TmConcat(T, _mgc->xstk->T, _mgc->xstk->T); _mgc->has = _mgc->xstk->hasinv = 0; } /*----------------------------------------------------------------------- * Function: mgopengl_pushtransform * Description: push the object xform stack * Returns: nothing (???) * Author: mbp * Date: Fri Sep 20 12:25:43 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * * This assumes we're already in GL_MODELVIEW mode. */ int mgopengl_pushtransform( void ) { glPushMatrix(); mg_pushtransform(); return 0; } /*----------------------------------------------------------------------- * Function: mgopengl_popransform * Description: pop the object xform stack * Returns: nothing (???) * Author: mbp * Date: Fri Sep 20 12:25:43 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * * This assumes we're already in GL_MODELVIEW mode. */ int mgopengl_poptransform( void ) { glPopMatrix(); mg_poptransform(); return 0; } /*----------------------------------------------------------------------- * Function: mgopengl_gettransform * Description: get the current object xform * Args: T: place to write the current object xform * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:29:43 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. This means we must multiply on the right by * the current C2W matrix after reading the GL ModelView * matrix. * * This assumes we're already in GL_MODELVIEW mode. */ void mgopengl_gettransform( Transform T ) { TmCopy(_mgc->xstk->T, T); } /*----------------------------------------------------------------------- * Function: mgopengl_settransform * Description: set the current object xform to T * Args: T * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:29:43 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. This means we must first load W2C onto the * modelview stact, then premult by T. * * This assumes we're already in GL_MODELVIEW mode. */ void mgopengl_settransform( Transform T ) { glLoadMatrixf( (GLfloat *) _mgc->W2C); glMultMatrixf( (GLfloat *) T); TmCopy(T, _mgc->xstk->T); _mgc->has = _mgc->xstk->hasinv = 0; } /*----------------------------------------------------------------------- * Function: mgopengl_new_translucent * Description: start a display-list which stores a translucent object, * the dpy-list will be called later after all opaque objects * have been drawn. * Returns: the display list. * Author: cH * Date: Fri Nov 17 2006 */ GLuint mgopengl_new_translucent(Transform T) { if (_mgopenglc->n_translucent_lists <= (int)_mgopenglc->translucent_seq) { _mgopenglc->translucent_lists = mgopengl_realloc_lists(_mgopenglc->translucent_lists, &_mgopenglc->n_translucent_lists); } glNewList(_mgopenglc->translucent_lists[_mgopenglc->translucent_seq], GL_COMPILE /* do not execute now */); /* include the side-effects into the displaylist */ mgopengl_pushtransform(); mgopengl_pushappearance(); /* Load the current transformation matrix into the display list */ mgopengl_settransform(T); /* alpha-blending will be enabled on-demand in mgopengl_bsptree(). */ return _mgopenglc->translucent_lists[_mgopenglc->translucent_seq++]; } /*----------------------------------------------------------------------- * Function: mgopengl_end_translucent * Description: end the definition of a translucent object. * Returns: the display list. * Author: cH * Date: Fri Nov 17 2006 */ void mgopengl_end_translucent(void) { /* include the side-effects into the displaylist */ mgopengl_popappearance(); mgopengl_poptransform(); glEndList(); /* No need to disable alpha-blending because the corresponding * enable-commands are wrapped into a GL_COMPILE display list. */ } /*----------------------------------------------------------------------- * Function: mgopengl_pushappearance * Description: push the MG context appearance stack * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:54:19 1991 */ int mgopengl_pushappearance( void ) { mg_pushappearance(); return 0; } /*----------------------------------------------------------------------- * Function: mgopengl_popappearance * Description: pop the MG context appearance stack * Returns: nothing * Author: mbp, munzner * Date: Fri Sep 20 12:54:19 1991 * Note: We call mgopengl_lighting and mgopengl_material instead of * just doing lmbinds here because those procedures make the * proper existence checks and reset the GL drawing state. */ int mgopengl_popappearance( void ) { struct mgastk *mastk = _mgc->astk; struct mgastk *mastk_next; if (! (mastk_next=mastk->next)) { OOGLError(0, "mgopengl_popappearance: appearance stack has only 1 entry."); return 0; } if ( ( (mastk->light_seq != mastk_next->light_seq) /* lighting changed */ #ifndef TRUE_EMISSION || ((mastk->mat.valid ^ mastk_next->mat.valid) & MTF_EMISSION) /* GL_LIGHT_MODEL_TWO_SIDE changed */ #endif ) && IS_SHADED(mastk->next->ap.shading)) /* lighting on */ mgopengl_lighting(mastk_next, mastk_next->lighting.valid); mgopengl_appearance(mastk_next, mastk_next->ap.valid); mg_popappearance(); if (_mgopenglc->tevbound && _mgopenglc->curtex->tx != mastk_next->ap.tex) { mgopengl_notexture(); /* Unbind our no-longer-needed texture */ } return 1; } /*----------------------------------------------------------------------- * Function: mgopengl_setappearance * Author: munzner, mbp * Date: Wed Aug 7 01:08:07 1991 * Notes: when app=NULL, mergeflag = MG_MERGE is assumed * (regardless of the actual value of mergeflag). * In this case, we make the GL calls to bring * the GL state into agreement with the current * appearance. * * The above isn't true any more; update these comments * soon. -- mbp Mon Sep 23 19:07:39 1991 * * things set here: material, lights, shading, * linewidth, transparency * things not set here: normals (drawing, scaling, * everting), drawing faces vs. edges */ const Appearance * mgopengl_setappearance(const Appearance *ap, int mergeflag ) { int changed, mat_changed, lng_changed; struct mgastk *mastk = _mgc->astk; Appearance *ma; static float nullarray[] = { 0.0 }; ma = &(mastk->ap); /* Decide what changes */ if (mergeflag == MG_MERGE) { changed = ap->valid &~ (ma->override &~ ap->override); mat_changed = ap->mat ? ap->mat->valid &~ (ma->mat->override &~ ap->mat->override) : 0; lng_changed = ap->lighting ? ap->lighting->valid &~ (ma->lighting->override &~ ap->lighting->override) : 0; } else { changed = ap->valid; mat_changed = ap->mat ? ap->mat->valid : 0; lng_changed = ap->lighting ? ap->lighting->valid : 0; } /* * Update current appearance; this needs to be done before making GL * calls because it is conceivable that we might need to make a GL call * corresponding to something in the current appearance for which the * valid bit in *ap isn't set. (???) By updating the current * appearance before making GL calls, our GL calls can always take data * from the current appearance, rather than worrying about whether to * read *ap or the current appearance. */ mg_setappearance( ap, mergeflag ); /* Bring GL device into accord with new appearance */ if (_mgopenglc->born) { /* * No bit in "changed" corresponds to {lighting,mat}. We think of * ap->{lighting,mat} as an extension to *ap which is interpreted to * have all valid bits 0 if the {lighting,ap} pointer is NULL. Note * that this means there is no way for the parent to override the * entire {lighting,mat} structure as a whole. It can, however, set * the individual override bits in the {lighting,mat} structure. */ if ((ap->lighting) && (mastk->next)) { if (mastk->light_seq == mastk->next->light_seq) { mastk->light_seq = next_light_seq(_mgc, mastk); if (_mgopenglc->n_light_lists <= mastk->light_seq) { _mgopenglc->light_lists = mgopengl_realloc_lists(_mgopenglc->light_lists, &_mgopenglc->n_light_lists); } /* * We need a new lighting model. * To ensure we don't have any leftover garbage in GL's copy of this * lighting model, we force GL to reset to defaults, then * reinitialize everything. */ glNewList(_mgopenglc->light_lists[mastk->light_seq], GL_COMPILE); glMaterialf(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, *nullarray); glEndList();; lng_changed |= ma->lighting->valid; /* "All fields changed" */ } } if (ma->shading != APF_CONSTANT && (ap->lighting != NULL #ifndef TRUE_EMISSION /* Hack: must enable GL_LIGHT_MODEL_TWO_SIDE lighting if so */ || (mastk->next && (mastk->mat.valid ^ mastk->next->mat.valid) & MTF_EMISSION) #endif )) { mgopengl_lighting( mastk, lng_changed ); } /* Let mgopengl_material() decide if we need a new material */ if (ap->mat) { mgopengl_material( mastk, mat_changed ); } mgopengl_appearance( mastk, changed ); if (_mgopenglc->tevbound && _mgopenglc->curtex->tx != ap->tex) { mgopengl_notexture(); /* Unbind our no-longer-needed texture */ } } return &_mgc->astk->ap; } void mgopengl_taggedappearance(const void *tag) { struct mgastk *astk = (struct mgastk *)tag; Appearance *ap = &astk->ap; LmLighting *lm = &astk->lighting; mg_setappearance(ap, 0); if (lm->valid) { glCallList(_mgopenglc->light_lists[astk->light_seq]); } glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadMatrixf(&_mgc->W2C[0][0] ); mgopengl_lights(lm, astk); glPopMatrix(); /* Let mgopengl_material() decide if we need a new material */ if (ap->mat) { mgopengl_material(astk, ap->mat->valid); } mgopengl_appearance(astk, ap->valid); if (_mgopenglc->tevbound && _mgopenglc->curtex->tx != ap->tex) { mgopengl_notexture(); /* Unbind our no-longer-needed texture */ } } static void mgimgfile2cambgimage(void) { Image *bgimage; if (_mgc->cam && _mgopenglc->bgimagefile) { bgimage = ImgCreate(IMG_CHANNELS, IMGF_RGBA, IMG_DATA_CHAN_FILE, IMGF_RGB, NULL, _mgopenglc->bgimagefile, IMG_END); if (bgimage) { CamSet(_mgc->cam, CAM_BGIMAGE, bgimage); ImgDelete(bgimage); } } } /*----------------------------------------------------------------------- * Function: mgopengl_setcamera * Description: set the context's camera (pointer) * Args: *cam: the camera to use * Returns: nothing * Author: mbp * Date: Fri Sep 20 13:07:31 1991 * Notes: The context stores a pointer to the camera, not a copy * of it. */ int mgopengl_setcamera(Camera* cam) { if (_mgc->cam != cam) { CamDelete(_mgc->cam); _mgc->cam = REFGET(Camera, cam); if (_mgc->cam) { CamGet(_mgc->cam, CAM_BGCOLOR, &_mgc->background); mgimgfile2cambgimage(); } } return true; } /* * Change current Window structure. * If 'final' and otherwise appropriate, actually open the window. * Apply relevant changes to window, if needed. */ int mgopengl_setwindow( WnWindow *win, int final ) { if(win == NULL) { return 0; } /* We can't do anything on our own. Leave it up to * the (possibly) user-supplied winchange callback. */ if(_mgc->winchange) (*_mgc->winchange)(_mgc, _mgc->winchangeinfo, MGW_WINCHANGE, win); if(win != _mgc->win) { WnDelete(_mgc->win); _mgc->win = REFGET(WnWindow, win); } return 1; } GLuint *mgopengl_realloc_lists(GLuint *lists, int *n_lists) { int i; GLuint new_lists; if ((new_lists = glGenLists(DPYLIST_INCR)) == 0) { OOGLError(0, "mgopengl_realloc_lists: no new lists available."); return NULL; } lists = realloc(lists, (*n_lists + DPYLIST_INCR)*sizeof(GLuint)); for (i = *n_lists; i < *n_lists + DPYLIST_INCR; i++) { lists[i] = new_lists++; } *n_lists = i; return lists; } /*----------------------------------------------------------------------- * Function: mgopengl_newcontext * Description: initialize a new mgopenglcontext structure * Args: *ctx: the struct to initialize * Returns: ctx * Author: mbp * Date: Fri Sep 20 13:11:03 1991 */ mgopenglcontext * mgopengl_newcontext( mgopenglcontext *ctx ) { mg_newcontext(&(ctx->mgctx)); ctx->mgctx.devfuncs = &mgopenglfuncs; ctx->mgctx.devno = MGD_OPENGL; ctx->mgctx.astk->ap_seq = 0; ctx->mgctx.astk->mat_seq = 0; ctx->mgctx.astk->light_seq = 0; ctx->mgctx.zfnudge = 40.e-6; ctx->born = 0; ctx->win = 0; ctx->winids[SGL] = ctx->winids[DBL] = 0; { mgcontext *oldmgc = _mgc; _mgc = (mgcontext *)ctx; D4F_OFF(); N3F_NOEVERT(); _mgc = oldmgc; } ctx->lmcolor = GL_DIFFUSE; ctx->tevbound = 0; ctx->curtex = NULL; VVINIT(ctx->room, char, 180); #ifndef GLUT ctx->GLXdisplay = NULL; ctx->cam_ctx[SGL] = ctx->cam_ctx[DBL] = 0; ctx->curctx = 0; #endif ctx->should_lighting = ctx->is_lighting = 0; ctx->dither = 1; ctx->bgimagefile = NULL; /* reserve a number of display list numbers */ ctx->n_light_lists = 0; ctx->light_lists = NULL; ctx->n_texture_lists = 0; ctx->texture_lists = NULL; ctx->n_translucent_lists = 0; ctx->translucent_lists = NULL; ctx->translucent_seq = 0; return ctx; } /*----------------------------------------------------------------------- * Function: mgopengl_findctx * Description: Given a GL window ID, returns the associated mg context. * Returns: mgcontext * for success, NULL if none exists. * Author: slevy * Date: Mon Nov 11 18:33:53 CST 1991 * Notes: This is a public routine. */ mgcontext * mgopengl_findctx( int winid ) { struct mgcontext *mgc; for(mgc = _mgclist; mgc != NULL; mgc = mgc->next) { if(mgc->devno == MGD_OPENGL && ((mgopenglcontext *)mgc)->win == winid) return mgc; } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mg/opengl/mgopengldraw.c0000644000175000017500000007473512310110201016344 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "mgP.h" #include "mgopenglP.h" #include "polylistP.h" #include "quadP.h" #include "bsptreeP.h" #include "mgopenglstipple.h" #ifdef GLUT # include #else #define GL_GLEXT_PROTOTYPES # include #endif #ifndef alloca #include #endif void mgopengl_polygon( int nv, HPoint3 *v, int nn, Point3 *n, int nc,ColorA *c ); void mgopengl_line( HPoint3 *p1, HPoint3 *p2 ); void mgopengl_polyline( int nv, HPoint3 *verts, int nc, ColorA *colors, int wrap ); void mgopengl_polylist(int np, Poly *p, int nv, Vertex *v, int plflags); void mgopengl_drawnormal(HPoint3 *p, Point3 *n); void mgopengl_closer(); void mgopengl_farther(); #ifndef NO_ZNUDGE # define mgopengl_v4ffunc(v) glVertex4fv(&(v)->x); #else # define mgopengl_v4ffunc(v) mgopengl_v4fcloser(v) #endif /*----------------------------------------------------------------------- * Function: mgopengl_polygon * Description: draw a polygon * Author: mbp, munzner * Date: Mon Jul 29 16:53:56 1991 * Notes: See mg.doc. * * do later: Different shading cases separated into different * loops for speed. */ void mgopengl_polygon(int nv, HPoint3 *V, int nn, Point3 *N, int nc, ColorA *C) { int i; HPoint3 *v; Point3 *n; ColorA *c; int ninc; int flag; flag = _mgc->astk->ap.flag; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) { nc = 0; } ninc = (nn > 1); if (nc == 0) { C = (ColorA*)&_mgc->astk->ap.mat->diffuse; } /* reestablish correct drawing color if necessary */ if (flag & APF_FACEDRAW) { MAY_LIGHT(); glColorMaterial(GL_FRONT_AND_BACK, _mgopenglc->lmcolor); glEnable(GL_COLOR_MATERIAL); glBegin(GL_POLYGON); if (nc <= 1) { D4F(&(_mgc->astk->ap.mat->diffuse)); } for (n = N, c = C, v = V, i = 0; i < nv; ++i, ++v) { if (nc-- > 0) { D4F(c); c++; } if (nn-- > 0) { N3F(n, v); n++; } glVertex4fv((float *)v); } glEnd(); } if ( flag & (APF_EDGEDRAW|APF_NORMALDRAW) ) { if (_mgopenglc->znudge) mgopengl_closer(); glDisable(GL_COLOR_MATERIAL); DONT_LIGHT(); if (flag & APF_EDGEDRAW) { glColor3fv((float *)&_mgc->astk->ap.mat->edgecolor); glBegin(GL_LINE_LOOP); for (v = V, i = 0; iastk->ap.mat->normalcolor); for (n = N, v = V, i = 0; iznudge) mgopengl_farther(); } } void mgopengl_quads(int count, HPoint3 *V, Point3 *N, ColorA *C, int qflags) { int i; HPoint3 *v; Point3 *n; ColorA *c; int flag; bool stippled, colors_masked = false; #define QUAD(stuff) { \ int k = 4; \ do { stuff; } while(--k > 0); \ } if (count <= 0) return; flag = _mgc->astk->ap.flag; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) { C = NULL; } stippled = (flag & APF_TRANSP) != 0 && _mgc->astk->ap.translucency == APF_SCREEN_DOOR; /* reestablish correct drawing color if necessary */ if ((flag & APF_FACEDRAW) && !(qflags & GEOM_ALPHA)) { glColorMaterial(GL_FRONT_AND_BACK, _mgopenglc->lmcolor); glEnable(GL_COLOR_MATERIAL); MAY_LIGHT(); i = count; v = V; c = C; n = N; if (c) { if ((qflags & COLOR_ALPHA) && stippled) { do { if (c->a == 0.0f) { glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); colors_masked = true; } else { if (colors_masked) { glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); colors_masked = false; } if (c->a < 1.0f) { glEnable(GL_POLYGON_STIPPLE); glPolygonStipple(mgopengl_get_polygon_stipple(c->a)); } else { glDisable(GL_POLYGON_STIPPLE); } } glBegin(GL_QUADS); if (n) { QUAD( (D4F(c++), N3F(n++,v), glVertex4fv((float*)v++)) ); } else { /* Colors, no normals */ QUAD( (D4F(c++), glVertex4fv((float*)v++)) ); } glEnd(); } while(--i > 0); } else { glBegin(GL_QUADS); if (n) { do { QUAD( (D4F(c++), N3F(n++,v), glVertex4fv((float*)v++)) ); } while(--i > 0); } else { /* Colors, no normals */ do { QUAD( (D4F(c++), glVertex4fv((float*)v++)) ); } while(--i > 0); } glEnd(); } } else { c = (ColorA*)&_mgc->astk->ap.mat->diffuse; if (stippled) { if (c->a == 0.0f) { glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); colors_masked = true; } else if (c->a < 1.0f) { glEnable(GL_POLYGON_STIPPLE); glPolygonStipple(mgopengl_get_polygon_stipple(c->a)); } } glBegin(GL_QUADS); if (n) { D4F(c); do { QUAD( (N3F(n++, v), glVertex4fv((float*)v++)) ); } while(--i > 0); } else { D4F(c); do { QUAD( (glVertex4fv((float*)v++)) ); } while(--i > 0); } glEnd(); } if (stippled) { glDisable(GL_POLYGON_STIPPLE); if (colors_masked) { glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } } } if ( flag & (APF_EDGEDRAW|APF_NORMALDRAW) ) { if (_mgopenglc->znudge) mgopengl_closer(); glDisable(GL_COLOR_MATERIAL); DONT_LIGHT(); if (flag & APF_EDGEDRAW) { glColor3fv((float *)&_mgc->astk->ap.mat->edgecolor); i = count; v = V; do { int k = 4; glBegin(GL_LINE_LOOP); do { mgopengl_v4ffunc(v++); } while(--k > 0); glEnd(); } while(--i > 0); } if (flag & APF_NORMALDRAW && N) { glColor3fv((float *)&_mgc->astk->ap.mat->normalcolor); i = count*4; v = V; n = N; do { mgopengl_drawnormal(v++, n++); } while(--i > 0); } if (_mgopenglc->znudge) mgopengl_farther(); } } void mgopengl_line( HPoint3 *p1, HPoint3 *p2 ) { DONT_LIGHT(); glBegin(GL_LINE_STRIP); glVertex4fv((float *)p1); glVertex4fv((float *)p2); glEnd(); } void mgopengl_point(HPoint3 *v) { HPoint3 a; HPoint3 *p, *q; float vw; DONT_LIGHT(); if (_mgc->astk->ap.linewidth > 1) { if (!(_mgc->has & HAS_POINT)) mg_makepoint(); /* Compute w component of point after projection to screen */ vw = v->x * _mgc->O2S[0][3] + v->y * _mgc->O2S[1][3] + v->z * _mgc->O2S[2][3] + v->w * _mgc->O2S[3][3]; if (vw <= 0) return; #define PUT(p) \ a.x = v->x + p->x*vw; a.y = v->y + p->y*vw; \ a.z = v->z + p->z*vw; a.w = v->w + p->w*vw; \ glVertex4fv((float *)&a) p = VVEC(_mgc->point, HPoint3); q = p + VVCOUNT(_mgc->point); glBegin(GL_TRIANGLE_STRIP); PUT(p); do { p++; PUT(p); if (p >= q) break; q--; PUT(q); } while(p < q); glEnd(); } else { glBegin(GL_POINTS); glVertex4fv((float *)v); glEnd(); } } void mgopengl_polyline( int nv, HPoint3 *v, int nc, ColorA *c, int wrapped ) { DONT_LIGHT(); /* note we don't reset to current material color because we could be * in the middle of a list of lines and should inherit the color from * the last color call. */ if (!(wrapped & 2)) { /* First member of batch */ if (_mgopenglc->znudge) mgopengl_closer(); if (nc) glDisable(GL_COLOR_MATERIAL); } if (nv == 1) { if (nc > 0) glColor4fv((float *)c); mgopengl_point(v); } else if (nv > 0) { glBegin(GL_LINE_STRIP); if (wrapped & 1) { if (nc > 0) glColor4fv((float *)(c + nc - 1)); mgopengl_v4ffunc(v + nv - 1); } do { if (--nc >= 0) glColor4fv((float *)c++); mgopengl_v4ffunc(v++); } while(--nv > 0); glEnd(); } if (!(wrapped & 4) && _mgopenglc->znudge) mgopengl_farther(); } #if HAVE_LIBGLU /* Slave routine for mgopengl_trickypolygon() below. */ #include /* for allocating extra vertices */ #define obstack_chunk_alloc malloc #define obstack_chunk_free free struct tess_data { unsigned plflags; Point3 *pnormal; struct obstack obst; }; static void tess_vertex_data(Vertex *vp, struct tess_data *data) { if (data->plflags & PL_HASVCOL) D4F(&vp->vcol); if (data->plflags & PL_HASVN) N3F(&vp->vn, &vp->pt); if (data->plflags & PL_HASST) glTexCoord2fv((GLfloat *)&vp->st); glVertex4fv(&vp->pt.x); } static void tess_combine_data(GLdouble coords[3], Vertex *vertex_data[4], GLfloat weight[4], Vertex **dataOut, struct tess_data *data) { Vertex *vertex; int i, n; HPt3Coord w; vertex = obstack_alloc(&data->obst, sizeof(Vertex)); /* Although otherwise documented at least the Mesa version of the * GLU tesselator sometimes does not fill vertex_data with valid * pointers. */ for (n = 3; n >= 0 && vertex_data[n] == NULL; --n); ++n; if (data->plflags & VERT_ST) { /* texture co-ordinates */ for (i = 0; i < n; i++) { vertex->st.s += weight[i] * vertex_data[i]->st.s; vertex->st.t += weight[i] * vertex_data[i]->st.t; } /* same linear combination stuff as in SplitPolyNode()@bsptree.c; * be careful not to dehomogenize, otherwise texturing might come * out wrong. */ for (i = 0, w = 0.0; i < n; i++) { w += weight[i] * vertex_data[i]->pt.w; } } else { w = 1.0; } vertex->pt.x = coords[0] * w; vertex->pt.y = coords[1] * w; vertex->pt.z = coords[2] * w; vertex->pt.w = w; if (data->plflags & VERT_N) { /* The averaged vertex normals do not have an orientation, so try * to orient them w.r.t. the polygon normal before computing the * linear combination. */ memset(&vertex->vn, 0, sizeof(vertex->vn)); for (i = 0; i < n; i++) { Point3 *vn = &vertex_data[i]->vn; if (Pt3Dot(vn, data->pnormal) < 0.0) { Pt3Comb(-weight[i], vn, 1.0, &vertex->vn, &vertex->vn); } else { Pt3Comb(weight[i], vn, 1.0, &vertex->vn, &vertex->vn); } } Pt3Unit(&vertex->vn); } if (data->plflags & VERT_C) { /* colors */ memset(&vertex->vcol, 0, sizeof(vertex->vcol)); for (i = 0; i < n; i++) { vertex->vcol.r += weight[i] * vertex_data[i]->vcol.r; vertex->vcol.g += weight[i] * vertex_data[i]->vcol.g; vertex->vcol.b += weight[i] * vertex_data[i]->vcol.b; vertex->vcol.a += weight[i] * vertex_data[i]->vcol.a; } } *dataOut = vertex; } /* * Called when we're asked to deal with a possibly-concave polygon. * Note we can only be called if APF_CONCAVE mode is set. * * We assume that we are called with an actually concave polygon; this * is indicated by (p->flags & POLY_CONCAVE). */ static void mgopengl_trickypolygon(Poly *p, int plflags) { int i; Vertex *vp; static GLUtesselator *glutess; VARARRAY2(dpts, GLdouble, p->n_vertices, 3); struct tess_data data[1]; if (glutess == NULL) { /* Create GLU-library triangulation handle, just once */ glutess = gluNewTess(); gluTessProperty(glutess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO); #ifdef _WIN32 /* Windows idiocy. We shouldn't need to cast standard funcs! */ gluTessCallback(glutess, GLU_BEGIN, (GLUtessBeginProc)glBegin); gluTessCallback(glutess, GLU_VERTEX_DATA, (GLUtessVertexDataProc)tess_vertex_data); gluTessCallback(glutess, GLU_TESS_COMBINE_DATA, (GLUtessCombineDataProc)tess_combine_data); gluTessCallback(glutess, GLU_END, (GLUtessEndProc)glEnd); #else /* Any reasonable OpenGL implementation */ gluTessCallback(glutess, GLU_BEGIN, (GLvoid (*)())glBegin); gluTessCallback(glutess, GLU_TESS_VERTEX_DATA, (GLvoid (*)())tess_vertex_data); gluTessCallback(glutess, GLU_TESS_COMBINE_DATA, (GLvoid (*)())tess_combine_data); gluTessCallback(glutess, GLU_END, (GLvoid (*)())glEnd); #endif } data->plflags = plflags; data->pnormal = &p->pn; obstack_init(&data->obst); if ((plflags & VERT_N) && !(plflags & PL_HASPN)) { /* compute it now, we need it! */ PolyNormal(p, &p->pn, true /* 4d (?) */, false /* evert */, NULL, NULL); } /* tell GLU what we think is a good approximation for the normal */ gluTessNormal(glutess, p->pn.x, p->pn.y, p->pn.z); gluTessBeginPolygon(glutess, data); gluTessBeginContour(glutess); for (i = 0; i < p->n_vertices; i++) { HPt3Coord w; vp = p->v[i]; w = vp->pt.w ? vp->pt.w : 1e20; if (w == 1.0) { dpts[i][0] = vp->pt.x; dpts[i][1] = vp->pt.y; dpts[i][2] = vp->pt.z; } else { dpts[i][0] = vp->pt.x / w; dpts[i][1] = vp->pt.y / w; dpts[i][2] = vp->pt.z / w; } gluTessVertex(glutess, dpts[i], vp); } gluTessEndContour(glutess); gluTessEndPolygon(glutess); obstack_free(&data->obst, NULL); } #endif /* HAVE_LIBGLU */ /* The work-horse for mgopengl_bsptree(): * * Strategy: first render everything back of the side the camera is * on, then everything coincident with the currentd node's plane, then * then everything in front of the side the camera is on. * * We assume the camera is not coincident with any one of the * BSPTree's planes. * * plfl_and and plfl_or are flags to be added or substracted from the * node's plflags to implement appearance overrides. */ static void mgopengl_bsptree_recursive(BSPTreeNode *tree, HPoint3 *camera, int *plfl_and, int *plfl_or, const void **cur_app) { HPt3Coord scp; int sign; BSPTreeNode *first, *last; PolyListNode *plist; const Appearance *ap; Material *mat; scp = HPt3DotPt3(camera, (Point3 *)(void *)&tree->plane) - tree->plane.w; sign = fpos(scp) - fneg(scp); if (sign >= 0) { first = tree->back; last = tree->front; } else { first = tree->front; last = tree->back; } /* render all polygons back of us */ if (first) { mgopengl_bsptree_recursive(first, camera, plfl_and, plfl_or, cur_app); } for (plist = tree->polylist; plist; plist = plist->next) { Vertex **v; Poly *p = plist->poly; int j = p->n_vertices; int plflags = p->flags; bool apchg = false; if (*plist->tagged_app == NULL) { continue; } if (*cur_app != *plist->tagged_app) { apchg = true; /* set our appearance now */ mgtaggedappearance(*plist->tagged_app); /* record our appearance as the current one */ *cur_app = *plist->tagged_app; ap = mggetappearance(); } else { ap = mggetappearance(); } if (!(ap->flag & APF_FACEDRAW) || !(ap->flag & APF_TRANSP)) { continue; } mat = ap->mat; if (apchg) { /* set new plfl_and/_or values */ *plfl_and = ~0; *plfl_or = 0; #if 0 switch(ap->shading) { case APF_VCFLAT: case APF_FLAT: *plfl_and &= ~PL_HASVN; break; case APF_SMOOTH: *plfl_and &= ~PL_HASPN; break; default: *plfl_and &= ~(PL_HASVN|PL_HASPN); break; } #else switch(ap->shading) { case APF_FLAT: *plfl_and &= ~PL_HASVN; if (plflags & PL_HASPCOL) { *plfl_and &= ~PL_HASVCOL; } break; case APF_SMOOTH: *plfl_and &= ~PL_HASPN; break; case APF_VCFLAT: *plfl_and &= ~PL_HASVN; break; default: *plfl_and &= ~(PL_HASVN|PL_HASPN); break; } #endif if (mat->override & MTF_DIFFUSE) { if (!(_mgc->astk->flags & MGASTK_SHADER)) { /* software shading will not work yet */ *plfl_and &= ~GEOM_COLOR; } } /* Decide whether this polygon possibly has an alpha channel. * Same logic as in GeomHasAlpha(). */ if ((ap->flag & APF_TEXTURE) && ap->tex && ap->tex->apply != TXF_DECAL && ap->tex->image && (ap->tex->image->channels % 2 == 0)) { *plfl_or |= COLOR_ALPHA; } else if ((mat->valid & MTF_ALPHA) && ((mat->override & MTF_ALPHA) || !((plflags & *plfl_and) & (GEOM_COLOR)))) { if (mat->diffuse.a < 1.0) { *plfl_or |= COLOR_ALPHA; } else { *plfl_and &= ~COLOR_ALPHA; } } if (!(ap->flag & APF_TEXTURE) || (ap->tex == NULL)) { *plfl_and &= ~PL_HASST; } glColorMaterial(GL_FRONT_AND_BACK, _mgopenglc->lmcolor); glEnable(GL_COLOR_MATERIAL); MAY_LIGHT(); } plflags &= *plfl_and; plflags |= *plfl_or; /* We may want to do something else here if ever we should start * to use BSP-tress for the buffer etc. render engines. For now we * only render translucent objects here, and leave the rest to the * ordinary drawing engines. */ if (!(plflags & COLOR_ALPHA)) { continue; } #if DEBUG_BSPTREE /* make the sub-division visible */ if (ap->flag & (APF_EDGEDRAW|APF_NORMALDRAW)) { if (_mgopenglc->znudge) mgopengl_closer(); glDisable(GL_COLOR_MATERIAL); DONT_LIGHT(); if (ap->flag & APF_EDGEDRAW) { glColor3fv((float *)&ap->mat->edgecolor); glBegin(GL_LINE_LOOP); for (j=0, v=p->v; j < p->n_vertices; j++, v++) { mgopengl_v4ffunc(&(*v)->pt); } glEnd(); } if (ap->flag & APF_NORMALDRAW) { glColor3fv((float *)&_mgc->astk->ap.mat->normalcolor); if (plflags & PL_HASPN) { for (j=0, v = p->v; j < p->n_vertices; j++, v++) mgopengl_drawnormal(&(*v)->pt, &p->pn); } else if (plflags & PL_HASVN) { for (v = p->v, j = 0; j < p->n_vertices; j++, v++) { mgopengl_drawnormal(&(*v)->pt, &(*v)->vn); } } } if (_mgopenglc->znudge) mgopengl_farther(); apchg = 1; glColorMaterial(GL_FRONT_AND_BACK, _mgopenglc->lmcolor); glEnable(GL_COLOR_MATERIAL); MAY_LIGHT(); } #endif if (apchg) { /* Disable write access to the depth buffer and enable * alpha-blending. The blend function used here will work * without alpha-buffer support, because only the source alpha * value is used. */ glDepthMask(GL_FALSE); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); /* Culling cannot work with transparency, so disable if it is * potentially enabled. */ if (ap->flag & APF_BACKCULL) { glDisable(GL_CULL_FACE); } /* Load textures if ap has changed */ if (plflags & PL_HASST) { mgopengl_needtexture(); } } /* reestablish correct drawing color if necessary*/ if (!(plflags & (PL_HASPCOL|PL_HASVCOL))) { D4F(&(mat->diffuse)); } if (plflags & PL_HASPCOL) { D4F(&p->pcol); } if (plflags & PL_HASPN) { N3F(&p->pn, &(*p->v)->pt); } v = p->v; /* normal algorithm */ glBegin(GL_POLYGON); switch (plflags & (PL_HASVCOL|PL_HASVN|PL_HASST)) { case 0: do { glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; case PL_HASVCOL: do { D4F(&(*v)->vcol); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; case PL_HASVN: do { N3F(&(*v)->vn, &(*v)->pt); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; case PL_HASVCOL|PL_HASVN: do { D4F(&(*v)->vcol); N3F(&(*v)->vn, &(*v)->pt); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; default: do { if (plflags & PL_HASVCOL) D4F(&(*v)->vcol); if (plflags & PL_HASVN) N3F(&(*v)->vn, &(*v)->pt); if (plflags & PL_HASST) glTexCoord2fv((GLfloat *)&(*v)->st); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; } glEnd(); /* GL_POLYGON */ } /* Render everything in front of us */ if (last) { mgopengl_bsptree_recursive(last, camera, plfl_and, plfl_or, cur_app); } } /*----------------------------------------------------------------------- * Function: mgopengl_bsptree * Description: draws a bsptree: binary space partition tree * Author: Claus-Justus Heine * Date: 2006 */ void mgopengl_bsptree(BSPTree *bsptree) { int plfl_and = ~0, plfl_or = 0; const void *ap; if (!bsptree->tree) { /* The tree can be empty, e.g. when no object had a translucent * polygon, or when translucent objects are disabled globally. */ return; } mgopengl_new_translucent(_mgc->xstk->T); /* First determine the position of the camera in the _current_ * coordinate system. We do assume that all tree nodes share the * same coordinate system. * * This means that transparent INSTs with fancy co-ordinate systems * are not handled correctly here; or that the high-level code has * to convert them first. */ if (!(_mgc->has & HAS_CPOS)) { mg_findcam(); } ap = NULL; mgopengl_bsptree_recursive(bsptree->tree, &_mgc->cpos, &plfl_and, &plfl_or, &ap); mgopengl_end_translucent(); } /*----------------------------------------------------------------------- * Function: mgopengl_polylist * Description: draws a Polylist: collection of Polys * Author: munzner * Date: Wed Oct 16 20:21:56 1991 * Notes: see mg.doc */ void mgopengl_polylist(int np, Poly *_p, int nv, Vertex *V, int plflags) { int i,j; Poly *p; Vertex **v, *vp; struct mgastk *ma = _mgc->astk; int flag, shading; bool stippled, colors_masked, change_stipple = false; int nonsurf = -1; float alpha = 1.0f; flag = ma->ap.flag; shading = ma->ap.shading; stippled = (flag & APF_TRANSP) != 0 && ma->ap.translucency == APF_SCREEN_DOOR; switch(shading) { case APF_FLAT: plflags &= ~PL_HASVN; if (plflags & PL_HASPCOL) { plflags &= ~PL_HASVCOL; } break; case APF_SMOOTH: plflags &= ~PL_HASPN; if (plflags & PL_HASVCOL) { plflags &= ~PL_HASPCOL; } break; case APF_VCFLAT: plflags &= ~PL_HASVN; if (plflags & PL_HASVCOL) { plflags &= ~PL_HASPCOL; } break; case APF_CSMOOTH: plflags &= ~(PL_HASVN|PL_HASPN); if (plflags & PL_HASVCOL) { plflags &= ~PL_HASPCOL; } break; case APF_CONSTANT: plflags &= ~(PL_HASVN|PL_HASPN); if (plflags & PL_HASPCOL) { plflags &= ~PL_HASVCOL; } break; default: plflags &= ~(PL_HASVN|PL_HASPN); break; } if ((_mgc->astk->mat.override & MTF_DIFFUSE)) { if (!(_mgc->astk->flags & MGASTK_SHADER)) { plflags &= ~GEOM_COLOR; } } if ((_mgc->astk->mat.override & MTF_ALPHA)) { if (!(_mgc->astk->flags & MGASTK_SHADER)) { plflags &= ~COLOR_ALPHA; } } if ((flag & APF_FACEDRAW) && !(plflags & GEOM_ALPHA)) { glColorMaterial(GL_FRONT_AND_BACK, _mgopenglc->lmcolor); glEnable(GL_COLOR_MATERIAL); MAY_LIGHT(); /* reestablish correct drawing color if necessary*/ if (!(plflags & (PL_HASPCOL | PL_HASVCOL))) { D4F(&(ma->ap.mat->diffuse)); } if (!(plflags & COLOR_ALPHA) && stippled) { alpha = ma->ap.mat->diffuse.a; if (alpha == 0.0f) { glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); colors_masked = true; } else if (alpha < 1.0f) { glEnable(GL_POLYGON_STIPPLE); glPolygonStipple(mgopengl_get_polygon_stipple(alpha)); change_stipple = true; } } if ((_mgc->astk->ap.flag & APF_TEXTURE) && (_mgc->astk->ap.tex != NULL)) { if (plflags & PL_HASST) mgopengl_needtexture(); } else { plflags &= ~PL_HASST; } for (p = _p, i = 0; i < np; i++, p++) { if (plflags & PL_HASPCOL) { D4F(&p->pcol); } if (change_stipple) { glPolygonStipple(mgopengl_get_polygon_stipple(alpha)); } else if ((plflags & COLOR_ALPHA) && stippled && (p->n_vertices >= 3)) { if (plflags & PL_HASPCOL) { if (p->pcol.a == 0.0f) { glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); colors_masked = true; } else { if (colors_masked) { glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); colors_masked = false; } if (p->pcol.a < 1.0f) { glEnable(GL_POLYGON_STIPPLE); glPolygonStipple(mgopengl_get_polygon_stipple(p->pcol.a)); } else { glDisable(GL_POLYGON_STIPPLE); } } } else if (plflags & PL_HASVCOL) { /* Compute an average alpha value */ int n_zero, n_one; for (n_zero = n_one = 0, alpha = 0.0f, j = 0; j < p->n_vertices; j++) { if (p->v[j]->vcol.a == 0.0f) { ++n_zero; } else if (p->v[j]->vcol.a == 1.0f) { ++n_one; } alpha += p->v[j]->vcol.a; } if (n_zero == p->n_vertices) { glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); colors_masked = true; } else { if (colors_masked) { glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); colors_masked = false; } if (n_one < p->n_vertices) { alpha /= (float)p->n_vertices; glEnable(GL_POLYGON_STIPPLE); glPolygonStipple(mgopengl_get_polygon_stipple(alpha)); } else { glDisable(GL_POLYGON_STIPPLE); } } } } if (plflags & PL_HASPN) { N3F(&p->pn, &(*p->v)->pt); } v = p->v; if ((j = p->n_vertices) <= 2) { nonsurf = i; #if HAVE_LIBGLU } else if ((flag & APF_CONCAVE) && ((p->flags & POLY_CONCAVE) || (p->n_vertices > 4))) { mgopengl_trickypolygon(p, plflags); #endif } else { /* normal algorithm */ #if !HAVE_LIBGLU static bool was_here = false; if (!was_here && ((flag & APF_CONCAVE) && ((p->flags & POLY_CONCAVE) || (p->n_vertices > 4)))) { OOGLWarn("The GLU tesselator is not available; " "rendering of concave polygons will be wrong."); was_here = true; } #endif glBegin(GL_POLYGON); switch(plflags & (PL_HASVCOL|PL_HASVN|PL_HASST)) { case 0: do { glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; case PL_HASVCOL: do { D4F(&(*v)->vcol); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; case PL_HASVN: do { N3F(&(*v)->vn, &(*v)->pt); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; case PL_HASVCOL|PL_HASVN: do { D4F(&(*v)->vcol); N3F(&(*v)->vn, &(*v)->pt); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; default: do { if (plflags & PL_HASVCOL) D4F(&(*v)->vcol); if (plflags & PL_HASVN) N3F(&(*v)->vn, &(*v)->pt); if (plflags & PL_HASST) glTexCoord2fv((GLfloat *)&(*v)->st); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; } glEnd(); } } if (stippled) { glDisable(GL_POLYGON_STIPPLE); if (colors_masked) { glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } } } if (flag & (APF_EDGEDRAW|APF_NORMALDRAW) || nonsurf >= 0) { if (_mgopenglc->znudge) mgopengl_closer(); glDisable(GL_COLOR_MATERIAL); DONT_LIGHT(); if (flag & APF_EDGEDRAW) { glColor3fv((float *)&_mgc->astk->ap.mat->edgecolor); for (p = _p, i = 0; i < np; i++, p++) { glBegin(GL_LINE_LOOP); for (j=0, v=p->v; j < p->n_vertices; j++, v++) { mgopengl_v4ffunc(&(*v)->pt); } glEnd(); } } if (flag & APF_NORMALDRAW) { glColor3fv((float *)&_mgc->astk->ap.mat->normalcolor); if (plflags & PL_HASPN) { for (p = _p, i = 0; i < np; i++, p++) { for (j=0, v=p->v; j < p->n_vertices; j++, v++) mgopengl_drawnormal(&(*v)->pt, &p->pn); } } else if (plflags & PL_HASVN) { for (vp = V, i = 0; i < nv; i++, vp++) { mgopengl_drawnormal(&vp->pt, &vp->vn); } } } if (nonsurf >= 0) { /* reestablish correct drawing color if necessary*/ if (!(plflags & (PL_HASPCOL | PL_HASVCOL))) D4F(&(ma->ap.mat->diffuse)); for (p = _p, i = 0; i <= nonsurf; p++, i++) { if (plflags & PL_HASPCOL) D4F(&p->pcol); v = p->v; switch(j = p->n_vertices) { case 1: if (plflags & PL_HASVCOL) glColor4fv((float *)&(*v)->vcol); mgopengl_point(&(*v)->pt); break; case 2: glBegin(GL_LINE_STRIP); do { if (plflags & PL_HASVCOL) glColor4fv((float *)&(*v)->vcol); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); glEnd(); break; } } } if (_mgopenglc->znudge) mgopengl_farther(); } } /* * Z-shift routines: for moving edges closer than faces, etc. */ void mgopengl_init_zrange() { struct mgopenglcontext *gl = _mgopenglc; gl->znudge = (double) _mgc->zfnudge * (gl->zmax - gl->zmin); gl->znear = gl->zmin + fabs(gl->znudge * (double)MAXZNUDGE); gl->zfar = gl->zmax - fabs(gl->znudge * (double)MAXZNUDGE); #ifndef NO_ZNUDGE glDepthRange(gl->znear, gl->zfar); #endif } void mgopengl_closer() { #ifndef NO_ZNUDGE glDepthRange( _mgopenglc->znear -= _mgopenglc->znudge, _mgopenglc->zfar -= _mgopenglc->znudge ); #endif } void mgopengl_farther() { #ifndef NO_ZNUDGE glDepthRange( _mgopenglc->znear += _mgopenglc->znudge, _mgopenglc->zfar += _mgopenglc->znudge ); #endif } /* There is a basic problem now with 4-d points and 3-d normal vectors. For now, we'll just ignore the 4-th coordinate of the point when computing the tip of the normal vector. This will work OK with all existing models, but for genuine 4-d points it won't work. But, come to think of it, what is the correct interpretation of the normal vector when the points live in 4-d? */ void mgopengl_drawnormal(HPoint3 *p, Point3 *n) { Point3 end, tp; HPt3Coord scale, w, s; if (p->w <= 0.0) return; if (p->w != 1) { HPt3ToPt3(p, &tp); p = (HPoint3 *)(void *)&tp; } scale = _mgc->astk->ap.nscale; if (_mgc->astk->ap.flag & APF_EVERT) { HPoint3 *cp = &_mgc->cpos; if (!(_mgc->has & HAS_CPOS)) { mg_findcam(); } if ((w = cp->w) != 1.0 && w != 0.0) { s = (p->x*w-cp->x)*n->x + (p->y*w-cp->y)*n->y + (p->z*w-cp->z)*n->z; } else { s = (p->x-cp->x)*n->x + (p->y-cp->y)*n->y + (p->z-cp->z)*n->z; } if (s > 0) { scale = -scale; } } end.x = p->x + scale*n->x; end.y = p->y + scale*n->y; end.z = p->z + scale*n->z; DONT_LIGHT(); /* cH: This is wrong. The current transformation need not be an * affine motion in which case the direction of the normals will * just come out wrong. I also wonder whether OpenGL's drawing stuff * does the right thing? */ glBegin(GL_LINE_STRIP); glVertex3fv((float *)p); glVertex3fv((float *)&end); glEnd(); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mg/opengl/mgopenglmesh.c0000644000175000017500000003116712310110201016333 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifdef GLUT # include #else #define GL_GLEXT_PROTOTYPES # include #endif #include #include #include #include #undef P /* ^^^ evil kludge XXX to get the P variables here to not get confused * with the P prototype macro. -nils */ #define HAS_N 0x01 #define HAS_NQ 0x02 #define HAS_C 0x04 #define HAS_SMOOTH 0x08 #define HAS_ST 0x10 void mgopenglsubmesh(int wrap, int nu, int nv, int umin, int umax, int vmin, int vmax, HPoint3 *meshP, Point3 *meshN, Point3 *meshNQ, ColorA *meshC, TxST *meshST, int mflags) { int u, v; int ucnt, vcnt; HPoint3 *P; Point3 *N, *NQ; ColorA *C; TxST *ST; int prev; int du; int douwrap; int i; int has; Appearance *ap; bool stippled, colors_masked = false; if (nu <= 0 || nv <= 0) return; ap = &_mgc->astk->ap; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) { meshC = 0; } if ((_mgc->astk->mat.override & MTF_ALPHA)) { if (!(_mgc->astk->flags & MGASTK_SHADER)) { mflags &= ~COLOR_ALPHA; } } has = 0; if (meshN && !(_mgc->astk->flags & MGASTK_SHADER)) { has |= HAS_N; } if (meshNQ && !(_mgc->astk->flags & MGASTK_SHADER)) { has |= HAS_NQ; } if (meshC) { has |= HAS_C; } if (IS_SMOOTH(ap->shading)) { has |= HAS_SMOOTH; } stippled = (ap->flag & APF_TRANSP) != 0 && ap->translucency == APF_SCREEN_DOOR; switch (ap->shading) { case APF_VCFLAT: case APF_FLAT: has &= ~HAS_N; break; case APF_SMOOTH: has &= ~HAS_NQ; break; default: has &= ~(HAS_N|HAS_NQ) /*(has & HAS_NQ) ? ~HAS_N : ~HAS_NQ*/; break; } if ((ap->flag & (APF_TEXTURE|APF_FACEDRAW)) == (APF_TEXTURE|APF_FACEDRAW) && _mgc->astk->ap.tex != NULL) { if (meshST != NULL) has |= HAS_ST; if (has&HAS_ST) { mgopengl_needtexture(); } } if (ap->flag & APF_FACEDRAW && nu > 1 && nv > 1 && !(mflags & GEOM_ALPHA)) { /* We triangulate strips of (v,u) mesh points: * (v,u) (v,u+1) (v,u+2) ... * (v+1,u) (v+1,u+1) (v+1,u+2) ... * using the vertex sequence * (v,u) , (v+1,u), (v,u+1), (v+1,u+1), (v,u+2), ... * This covers the territory from v to v+1; then repeat for other v's. * If we hit the 256-vertex triangle-mesh limit, the strip is spliced * by redrawing the latest (v,u+i),(v+1,u+i) pair of vertices. */ glColorMaterial(GL_FRONT_AND_BACK, _mgopenglc->lmcolor); glEnable(GL_COLOR_MATERIAL); MAY_LIGHT(); if (!(has & HAS_C)) { D4F(&ap->mat->diffuse); } if (stippled) { if (!(mflags & COLOR_ALPHA)) { float alpha = ap->mat->diffuse.a; if (alpha == 0.0f) { glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); colors_masked = true; } else if (alpha < 1.0f) { glEnable(GL_POLYGON_STIPPLE); glPolygonStipple(mgopengl_get_polygon_stipple(alpha)); } } else { static bool was_here = false; if (!was_here) { was_here = true; OOGLWarn("Polygon-stipples with per-vertex colors not yet " "implemented for meshes."); } /* Howto do this? As we may not alter the stipple pattern in * between glBegin() and glEnd() this would be somewhat * involved. We would have to duplicate the code below for the * HAS_C and COLOR_ALPHA case. */ } } v = vmax - vmin + 1; du = umin + vmin * nu; if (wrap & MM_VWRAP) { /* V-wrapping: cur = mesh[vmin,u], prev = mesh[vmax,u] */ prev = nu * (v - 1); } else { /* Not V-wrapping: cur = mesh[vmin+1,u], prev = mesh[vmin,u] */ du += nu; prev = -nu; v--; /* One less V-row, too */ } do { /* Loop over V */ P = meshP + du; N = meshN + du; NQ = meshNQ + du; C = meshC + du; ST = meshST + du; ucnt = umax - umin + 1; glBegin(GL_TRIANGLE_STRIP); douwrap = (wrap & MM_UWRAP); do { /* Loop over U */ u = ucnt; ucnt = 0; switch( has ) { case 0: case HAS_SMOOTH: do { glVertex4fv((float *)(P+prev)); glVertex4fv((float *)P); P++; } while(--u); break; case HAS_C: do { D4F(C+prev); glVertex4fv((float *)(P+prev)); glVertex4fv((float *)P); C++; P++; } while(--u); break; case HAS_C|HAS_SMOOTH: do { D4F(C+prev); glVertex4fv((float *)(P+prev)); D4F(C); glVertex4fv((float *)P); C++; P++; } while(--u); break; case HAS_NQ: do { N3F(NQ+prev,P+prev); glVertex4fv((float *)(P+prev)); glVertex4fv((float *)P); NQ++; P++; } while(--u); break; case HAS_N: do { N3F(N+prev,P); glVertex4fv((float *)(P+prev)); glVertex4fv((float *)P); N++; P++; } while(--u); break; case HAS_NQ|HAS_SMOOTH: do { N3F(NQ+prev,P+prev); glVertex4fv((float *)(P+prev)); glVertex4fv((float *)P); NQ++; P++; } while(--u); break; case HAS_N|HAS_SMOOTH: do { N3F(N+prev,P+prev); glVertex4fv((float *)(P+prev)); N3F(N,P); glVertex4fv((float *)P); N++; P++; } while(--u); break; case HAS_C|HAS_NQ: do { D4F(C+prev); N3F(NQ+prev,P+prev); glVertex4fv((float *)(P+prev)); glVertex4fv((float *)P); C++; NQ++; P++; } while(--u); break; case HAS_C|HAS_N: do { D4F(C+prev); N3F(N+prev,P+prev); glVertex4fv((float *)(P+prev)); glVertex4fv((float *)P); C++; N++; P++; } while(--u); break; case HAS_C|HAS_NQ|HAS_SMOOTH: do { D4F(C+prev); N3F(NQ+prev,P+prev); glVertex4fv((float *)(P+prev)); D4F(C); glVertex4fv((float *)P); C++; NQ++; P++; } while(--u); break; case HAS_C|HAS_N|HAS_SMOOTH: do { D4F(C+prev); N3F(N+prev,P+prev); glVertex4fv((float *)(P+prev)); D4F(C); N3F(N,P); glVertex4fv((float *)P); C++; N++; P++; } while(--u); break; case HAS_ST: do { glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); P++; ST++; } while(--u); break; case HAS_C|HAS_ST: do { D4F(C+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); C++; P++; ST++; } while(--u); break; case HAS_C|HAS_SMOOTH|HAS_ST: do { D4F(C+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); D4F(C); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); C++; P++; ST++; } while(--u); break; case HAS_NQ|HAS_ST: do { N3F(NQ+prev,P+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); NQ++; P++; ST++; } while(--u); break; case HAS_N|HAS_ST: do { N3F(N+prev,P+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); N++; P++; ST++; } while(--u); break; case HAS_NQ|HAS_SMOOTH|HAS_ST: do { N3F(NQ+prev,P+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); NQ++; P++; ST++; } while(--u); break; case HAS_N|HAS_SMOOTH|HAS_ST: do { N3F(N+prev,P+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); N3F(N,P); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); N++; P++; ST++; } while(--u); break; case HAS_C|HAS_NQ|HAS_ST: do { N3F(NQ+prev,P+prev); D4F(C+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); C++; NQ++; P++; ST++; } while(--u); break; case HAS_C|HAS_N|HAS_ST: do { D4F(C+prev); N3F(N+prev,P+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); C++; N++; P++; ST++; } while(--u); break; case HAS_C|HAS_NQ|HAS_SMOOTH|HAS_ST: do { D4F(C+prev); N3F(NQ+prev,P); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); D4F(C); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); C++; NQ++; P++; ST++; } while(--u); break; case HAS_C|HAS_N|HAS_SMOOTH|HAS_ST: do { D4F(C+prev); N3F(N+prev,P+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); D4F(C); N3F(N,P); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); C++; N++; P++; ST++; } while(--u); break; } if (ucnt == 0) { if (douwrap) { douwrap = 0; /* Loop again on first vertex */ ucnt = 1; P = meshP + du; N = meshN + du; NQ = meshNQ + du; C = meshC + du; ST = meshST + du; } } else { glEnd(); /* Hit tmesh limit, splice */ glBegin(GL_TRIANGLE_STRIP); C--; N--; P--; ST--; /* Redraw last vertex */ } } while(ucnt); glEnd(); prev = -nu; du += nu; } while(--v > 0); if (stippled) { glDisable(GL_POLYGON_STIPPLE); if (colors_masked) { glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } } } if (ap->flag & (APF_EDGEDRAW|APF_NORMALDRAW) || (ap->flag & APF_FACEDRAW && (nu == 1 || nv == 1))) { glDisable(GL_COLOR_MATERIAL); mgopengl_notexture(); DONT_LIGHT(); if (_mgopenglc->znudge) mgopengl_closer(); if (ap->flag & APF_EDGEDRAW) { /* Draw edges */ glColor3fv((float *)&ap->mat->edgecolor); du = umin + vmin * nu; ucnt = umax - umin + 1; vcnt = vmax - vmin + 1; v = vcnt; do { if (wrap & MM_UWRAP) glBegin(GL_LINE_LOOP); else glBegin(GL_LINE_STRIP); u = ucnt; P = meshP + du; do { glVertex4fv((float *)P); P++; } while(--u > 0); if (wrap & MM_UWRAP) glEnd(); else glEnd(); du += nu; } while(--v > 0); du = umin + vmin * nu; u = ucnt; do { v = vcnt; if (wrap & MM_VWRAP) glBegin(GL_LINE_LOOP); else glBegin(GL_LINE_STRIP); P = meshP + du; do { glVertex4fv((float *)P); P += nu; } while(--v > 0); if (wrap & MM_VWRAP) glEnd(); else glEnd(); du++; } while(--u > 0); } if (ap->flag & APF_NORMALDRAW) { if (has & HAS_N) { glColor3fv((float *)&ap->mat->normalcolor); for (i = nu*nv, P=meshP, N=meshN; --i >= 0; P++, N++) { mgopengl_drawnormal(P, N); } } else if (has & HAS_NQ) { glColor3fv((float *)&ap->mat->normalcolor); for (i = nu*nv, P=meshP, NQ=meshNQ; --i >= 0; P++, NQ++) { mgopengl_drawnormal(P, NQ); } } } if (_mgopenglc->znudge) mgopengl_farther(); } } void mgopengl_mesh(int wrap, int nu, int nv, HPoint3 *meshP, Point3 *meshN, Point3 *meshNQ, ColorA *meshC, TxST *meshST, int mflags) { mgopenglsubmesh(wrap, nu, nv, 0, nu-1, 0, nv-1, meshP, meshN, meshNQ, meshC, meshST, mflags); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mg/opengl/mgopenglshade.c0000644000175000017500000005677312310110201016475 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "mgP.h" #include "mgopenglP.h" #include "mgopenglshade.h" #ifdef GLUT # include #else #define GL_GLEXT_PROTOTYPES # include #endif #define ID_OFFSET 0 /* materialno, lightmodelno, and lightno between 1 and 65535 are * legal. p 9-9 GL PROG GUIDE (munzner 9/17/91) */ /*static int lightno = 1;*/ static float kd = 1.0; /* Additional data needed if the image dimensions are not a power of 2. */ struct mgopengl_tudata { char *data; int xsize, ysize, channels; int qualflags; /* APF_TX{MIPMAP,MIPINTERP,LINEAR}: if loaded, how? */ }; void mgopengl_appearance(struct mgastk *ma, int mask) { Appearance *ap = &(ma->ap); if (mask & APF_TRANSP) { if (ap->flag & APF_TRANSP) { switch (ap->translucency) { case APF_ALPHA_BLENDING: break; case APF_SCREEN_DOOR: glDepthMask(GL_TRUE); glBlendFunc(GL_ONE, GL_ZERO); glDisable(GL_BLEND); /* Stipple pattern will be set later, based on alpha-value */ break; case APF_NAIVE_BLENDING: /* Do not do this here; alpha-blending will be enabled as needed * in mgopengl_bsptree(). This is for the sake of efficiency: if * a geometry does not have any translucent component it is much * more efficient to use the depth buffer instead of alpha * blending, especially when there is no hardware rendering * support. */ glDepthMask(GL_FALSE); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); break; default: break; /* ??? */ } } else { glDepthMask(GL_TRUE); glBlendFunc(GL_ONE, GL_ZERO); glDisable(GL_BLEND); } } if (mask & APF_LINEWIDTH) { glLineWidth((GLfloat)(ap->linewidth)); _mgc->has &= ~HAS_POINT; } if (mask & APF_BACKCULL) { if(ap->flag & APF_BACKCULL) { glEnable( GL_CULL_FACE ); } else { glDisable( GL_CULL_FACE ); } } if (mask & APF_SHADING) { if(!IS_SHADED(ap->shading) || ma->shader != NULL) { /* switch to constant shading by unbinding the lmodel */ glDisable(GL_LIGHTING); _mgopenglc->should_lighting = _mgopenglc->is_lighting = 0; D4F_OFF(); _mgopenglc->lmcolor = GL_DIFFUSE; glShadeModel(IS_SMOOTH(ap->shading) ? GL_SMOOTH : GL_FLAT ); if (ma->shader != NULL && IS_SHADED(ap->shading)) { ma->flags |= MGASTK_SHADER; } else { ma->flags &= ~MGASTK_SHADER; } } else { /* turn shading on */ glEnable(GL_LIGHTING); _mgopenglc->should_lighting = _mgopenglc->is_lighting = 1; glShadeModel( IS_SMOOTH(ap->shading) ? GL_SMOOTH : GL_FLAT ); if (ap->lighting->valid) glCallList(_mgopenglc->light_lists[ma->light_seq]); mgopengl_material( ma, ma->mat.valid ); D4F_ON(); _mgopenglc->lmcolor = GL_DIFFUSE; ma->flags &= ~MGASTK_SHADER; } } if(mask & APF_EVERT) { /* * Do automatic normal-flipping if requested. */ if(ap->flag & APF_EVERT) { N3F_EVERT(); } else { N3F_NOEVERT(); } } /* * No GL calls are needed for the following attributes because * they are always interpreted at draw-time: * APF_FACEDRAW * APF_EDGEDRAW * APF_NORMSCALE */ } /*----------------------------------------------------------------------- * Function: mgopengl_material * Description: bind a material. define it if it's not yet defined. * Args: *mat: Material to bind. * mask: Bitmask telling which material fields are valid. * Passed into mgopengl_materialdef. * Returns: * Author: munzner * Date: Wed Oct 16 16:06:47 1991 * Notes: We must reset the "current GL color" after binding a * material. * We want color calls to change the *diffuse* color when * we're in shading mode. Thus we call glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);glEnable(GL_COLOR_MATERIAL). * We also must keep track of the diffuse coefficient * for use in mgopengl_d[3,4]f, our wrapper for color calls. * C3f or c4f should never be called directly. * mg draw routines are responsible for establishing the * correct drawing color. */ void mgopengl_material(struct mgastk *astk, int mask) { GLfloat f[4]; Material *mat = &astk->mat; #ifdef TRUE_EMISSION static float lmnull = (float) 0; /* LMNULL */ #endif mask &= mat->valid; if (mask & MTF_Kd) kd = mat->kd; if((mask & (MTF_EMISSION|MTF_DIFFUSE|MTF_AMBIENT|MTF_SPECULAR |MTF_SHININESS|MTF_Kd|MTF_Ka|MTF_Ks|MTF_ALPHA)) == 0) return; /* No GL changes to make. */ if(astk->next && astk->next->mat_seq == astk->mat_seq) { /* * Fresh material needed. Erase any previous GL definition. * We'll need to load all valid fields to initialize it. */ astk->mat_seq = next_mat_seq(_mgc, astk); #ifndef TRUE_EMISSION /* Needs fixing - TOR if(mat->valid & MTF_EMISSION) { glNewList( astk->mat_seq, GL_COMPILE); glMaterialf(GL_BACK, GL_AMBIENT_AND_DIFFUSE, * &lmnull); glEndList(); glCallList(astk->mat_seq); astk->mat_seq++; } */ #endif /*!TRUE_EMISSION*/ mask = mat->valid; } /* Build material definition */ f[3] = 1.0; #ifdef TRUE_EMISSION if( mask & MTF_EMISSION) { f[0] = mat->emission.r; f[1] = mat->emission.g; f[2] = mat->emission.b; glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, f); } #endif if( mask & (MTF_Kd | MTF_DIFFUSE)) { f[0] = mat->kd * mat->diffuse.r; f[1] = mat->kd * mat->diffuse.g; f[2] = mat->kd * mat->diffuse.b; f[3] = mat->diffuse.a; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, f); } f[3] = 1.0; if( mask & (MTF_Ka | MTF_AMBIENT)) { f[0] = mat->ka * mat->ambient.r; f[1] = mat->ka * mat->ambient.g; f[2] = mat->ka * mat->ambient.b; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, f); } if( mask & (MTF_Ks | MTF_SPECULAR | MTF_SHININESS)) { f[0] = mat->ks * mat->specular.r; f[1] = mat->ks * mat->specular.g; f[2] = mat->ks * mat->specular.b; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, f); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, mat->shininess); } #ifndef TRUE_EMISSION /* Hack: use "emission" field as back diffuse color */ if(mask & MTF_EMISSION) { f[0] = mat->kd * mat->emission.r; f[1] = mat->kd * mat->emission.g; f[2] = mat->kd * mat->emission.b; glMaterialfv(GL_BACK, GL_AMBIENT_AND_DIFFUSE, f); } #endif /*!TRUE_EMISSION*/ } void mgopengl_setshader(mgshadefunc shader) { struct mgastk *ma = _mgc->astk; unsigned short wasusing = ma->flags & MGASTK_SHADER; ma->shader = shader; if (shader != NULL && IS_SHADED(ma->ap.shading)) { ma->flags |= MGASTK_SHADER; } else { ma->flags &= ~MGASTK_SHADER; } if((ma->flags & MGASTK_SHADER) != wasusing) mgopengl_appearance(_mgc->astk, APF_SHADING); } void mgopengl_lighting(struct mgastk *astk, int mask) { LmLighting *lm = &astk->lighting; if (lm->valid) { mgopengl_lightmodeldef( astk->light_seq, lm, lm->valid & mask, astk ); glCallList(_mgopenglc->light_lists[astk->light_seq]); } glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadMatrixf( &_mgc->W2C[0][0] ); mgopengl_lights( lm, astk ); glPopMatrix(); } void mgopengl_lights( LmLighting *lm, struct mgastk *astk ) { int i, lightsused; LtLight *light, **lp; int baselight = -1; GLint maxlights; glGetIntegerv(GL_MAX_LIGHTS, &maxlights); /* unbind all currently bound OpenGL lights */ for (i=0; i < maxlights; i++) glDisable(GL_LIGHT0+i); lightsused = 0; LM_FOR_ALL_LIGHTS(lm, i,lp) { light = *lp; if (light->Private == 0) { /* this is a new light */ if(baselight < 0) { struct mgastk *a; /* Count appearance stack depth */ for(a = astk, baselight = 1; a != NULL; a = a->next) baselight += maxlights; } light->Private = lightsused + baselight; light->changed = 1; /* set changed, to force lmdef below */ } if (light->changed) { mgopengl_lightdef(GL_LIGHT0+lightsused, light, lm, lm->valid); light->changed = 0; } else { /* Even unchanged lights might have moved, if the * camera has moved since we last installed them. */ glLightfv( GL_LIGHT0 + lightsused, GL_POSITION, (float *)&light->globalposition ); } glEnable( GL_LIGHT0+lightsused); ++lightsused; } } int mgopengl_lightdef( int lightno, LtLight *light, LmLighting *lgt, int mask) { GLfloat f[4]; f[3] = 1.0; glLightfv(lightno, GL_AMBIENT, (float *)&light->ambient); f[0] = light->intensity * light->color.r; f[1] = light->intensity * light->color.g; f[2] = light->intensity * light->color.b; glLightfv(lightno, GL_DIFFUSE, f); glLightfv(lightno, GL_POSITION, (float *)&light->globalposition); if( mask & (LMF_ATTENC | LMF_ATTENM)) { glLightf(lightno, GL_CONSTANT_ATTENUATION, lgt->attenconst); glLightf(lightno, GL_LINEAR_ATTENUATION, lgt->attenmult); } return lightno; } int mgopengl_lightmodeldef(int lightmodel, LmLighting *lgt, int mask, struct mgastk *astk) { GLfloat f[4]; glNewList(_mgopenglc->light_lists[lightmodel], GL_COMPILE); f[3] = 1.0; if( mask & LMF_AMBIENT) { f[0] = lgt->ambient.r; f[1] = lgt->ambient.g; f[2] = lgt->ambient.b; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, f); } if( mask & LMF_LOCALVIEWER) { glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); } #ifndef TRUE_EMISSION /* This causes trouble if the vertex order makes GL consider * our polygon to be backfacing -- then GL_LIGHT_MODEL_TWO_SIDE causes it * to be mis-shaded from both sides.. */ if((astk->mat.valid & MTF_EMISSION) ) { glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); } #endif glEndList(); return lightmodel; } #if defined(sgi) || defined(GL_EXT_texture_object) /* Might our -lGL know about EXT_texture_object? */ /* Since the SGI compiler/linkers seem to know about #pragma weak, but * others might not, compile in EXT_texture_object support if: * - we're on an SGI; even if compiled under Irix 5 (no EXT_texture_object), * we might be run under a later version that does support it, and * the "#pragma weak" lets us test at run time whether the library * supports it; * - or, if we're on a system that claims to support it at compile time, * we'll just hope that that system also supports it at run time. */ # pragma weak glBindTextureEXT # pragma weak glDeleteTexturesEXT # ifndef GL_EXT_texture_object /* If doesn't know about glBindTextureEXT etc., declare here. */ extern void glBindTextureEXT (GLenum target, GLuint texture); extern void glDeleteTexturesEXT (GLsizei n, GLuint *textures); # endif /* If the library knows about it, does the X display also support the * texture extension? */ static int has_texture_object(void) { static int has = -1; if(has < 0) has = (&glBindTextureEXT != NULL && &glDeleteTexturesEXT != NULL && NULL != strstr((char *)glGetString(GL_EXTENSIONS), "EXT_texture_object")); return has; } #else /* Stub for non-existent glBindTextureEXT() etc. functions. */ static int has_texture_object(void) { return 0; } static void glBindTextureEXT(GLenum target, GLuint id) { } static void glDeleteTexturesEXT(GLsizei n, GLuint *textures) { } #endif static void tex_predef(GLuint id) { if(has_texture_object()) { glBindTextureEXT(GL_TEXTURE_2D, id); } else { if ((GLuint)_mgopenglc->n_texture_lists <= id) { _mgopenglc->texture_lists = mgopengl_realloc_lists(_mgopenglc->texture_lists, &_mgopenglc->n_texture_lists); } glNewList(_mgopenglc->texture_lists[id], GL_COMPILE_AND_EXECUTE); } } static void tex_postdef(void) { if(has_texture_object()) { /* Nothing -- leave things as they are */ } else { glEndList(); } } static void tex_bind(GLuint id) { if(has_texture_object()) { glBindTextureEXT(GL_TEXTURE_2D, id); } else { glCallList(_mgopenglc->texture_lists[id]); } } static void tex_delete(GLuint id) { if(has_texture_object()) { glDeleteTexturesEXT(1, &id); } else { glDeleteLists(_mgopenglc->texture_lists[id], 1); } } /* Is this texture loaded adequately for the given texture-quality setting? */ static bool tex_adequate(int apflags, TxUser *tu) { struct mgopengl_tudata *tudata = tu->data; return (apflags & (APF_TXMIPMAP|APF_TXMIPINTERP|APF_TXLINEAR)) == tudata->qualflags; } /* * Function: mgopengl_notexture * Description: Disable texture mapping */ void mgopengl_notexture() { glDisable(GL_TEXTURE_2D); _mgopenglc->tevbound = 0; glAlphaFunc(GL_ALWAYS, 0); glDisable(GL_ALPHA_TEST); } /* * Function: mgopengl_txpurge * Description: Forget everything Open GL ever knew about this texture. * Author: slevy * Date: Thu May 30 12:03:26 CDT 1996 * Notes: The mg/common/mgtexture.c code decides when the time is ripe. * We assume that textures (well, display-lists) are shared * across all OpenGL windows, and take care to purge references * to the no-longer-loaded texture in all mgopengl context. */ void mgopengl_txpurge(TxUser *tu) { mgcontext *ctx, *oldctx = _mgc; struct mgopengl_tudata *tudata; for(ctx = _mgclist; ctx != NULL; ctx = ctx->next) { if(ctx->devno == MGD_OPENGL) { #define mgoglc ((mgopenglcontext *)ctx) if(mgoglc->curtex == tu) { if(mgoglc->tevbound) { /* Probably won't happen */ mgctxselect(ctx); mgopengl_notexture(); } mgoglc->curtex = NULL; } #if 0 if(mgoglc->bgimage == tu) { mgoglc->bgimage = NULL; } #endif #undef mgoglc } } if(tu->id > 0) { tex_delete(tu->id + ID_OFFSET); } if ((tudata = tu->data)) { if (tudata->data != tu->tx->image->data) { OOGLFree(tudata->data); } OOGLFree(tudata); tu->data = NULL; } /* Could also purge the current 2D texture, but maybe it's not worth it. */ if (_mgc != oldctx) { mgctxselect(oldctx); } } /*----------------------------------------------------------------------- * Function: mgopengl_needtexture * Description: Ask for a texture -- we need the texture currently in astk->ap.t ex * Author: slevy * Date: Mon Jan 29 21:16:13 CST 1996 * Notes: We only do this when a gprim asks for it, not as soon as * we start the appearance in which the texture is installed, * for efficiency's sake. Textures are bulky and rendering with * them can be slow. Thus relevant gprim's test: * if(_mgc->astk->flag&APF_TEXTURE && * _mgc->astk->ap.tex != NULL && * _mgglc->tevbound == 0) * mgopengl_needtexture(); */ void mgopengl_needtexture(void) { Texture *wanttx = _mgc->astk->ap.tex; int apflag = _mgc->astk->ap.flag; TxUser *tu; struct mgopengl_tudata *tudata; Image *image; int id, mustload = 0; static GLint formats[] = { 0, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA }; static GLfloat minfilts[] = { GL_NEAREST, GL_LINEAR, GL_NEAREST, GL_LINEAR, GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR }; if(wanttx == NULL || wanttx->image == NULL) { #if 1 mgopengl_notexture(); #else /* Remove any texture */ glDisable(GL_TEXTURE_2D); _mgopenglc->tevbound = 0; #endif /* Let's leave the texture bound, in case we need it again soon. */ return; } image = wanttx->image; if ((tu = _mgopenglc->curtex) && mg_same_texture(tu->tx, wanttx, true) && tex_adequate(apflag, tu)) { if (_mgopenglc->tevbound != tu->id) { /* We just need to bind the texture environment */ _mgopenglc->tevbound = tu->id; tex_bind(tu->id + ID_OFFSET); if (image->channels % 2 == 0) { glAlphaFunc(GL_NOTEQUAL, 0); glEnable(GL_ALPHA_TEST); } } /* Load the texture tfm, even if stuff is otherwise identical. */ glMatrixMode(GL_TEXTURE); glLoadMatrixf((GLfloat *)_mgc->txstk->T); glMultMatrixf((GLfloat *)wanttx->tfm); glMatrixMode(GL_MODELVIEW); glEnable(GL_TEXTURE_2D); return; } /* Is our texture in the cache? */ tu = mg_find_shared_texture(wanttx, MGD_OPENGL); if (tu == NULL || !tex_adequate(apflag, tu)) { /* Find a free texture id. */ id = mg_find_free_shared_texture_id(MGD_OPENGL); tu = TxAddUser(wanttx, id, NULL, mgopengl_txpurge); tu->ctx = _mgc; tudata = OOGLNewE(struct mgopengl_tudata, "OpengGL TxUser Data"); tudata->data = image->data; tudata->xsize = image->width; tudata->ysize = image->height; tudata->channels = image->channels; tu->data = tudata; mustload = 1; } else { tudata = tu->data; if (!mg_same_texture(tu->tx, wanttx, true)) { /* force the texture parameters to be reprogrammed */ _mgopenglc->tevbound = 0; } } /* Configure texturing as described in wanttx, except for the data. */ if (_mgopenglc->tevbound != tu->id || mustload) { switch (wanttx->apply) { case TXF_BLEND: glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); break; case TXF_DECAL: glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); break; case TXF_REPLACE: glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); break; default: glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); break; } glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, (GLfloat *)&wanttx->background); _mgopenglc->tevbound = tu->id; if (image->channels == 2 || image->channels == 4) { glAlphaFunc(GL_NOTEQUAL, 0); glEnable(GL_ALPHA_TEST); } glMatrixMode(GL_TEXTURE); glLoadMatrixf( (GLfloat *) wanttx->tfm); glMatrixMode(GL_MODELVIEW); } if (mustload) { /* Stuff texture data into GL */ GLint format = formats[image->channels]; tex_predef(tu->id + ID_OFFSET); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (wanttx->flags & TXF_SCLAMP) ? GL_CLAMP : GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (wanttx->flags & TXF_TCLAMP) ? GL_CLAMP : GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minfilts[((apflag & APF_TXMIPMAP) ? 4 : 0) | ((apflag & APF_TXMIPINTERP) ? 2 : 0) | ((apflag & APF_TXLINEAR) ? 1 : 0)]); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (apflag & APF_TXLINEAR) ? GL_LINEAR : GL_NEAREST); if(apflag & APF_TXMIPMAP) { gluBuild2DMipmaps(GL_TEXTURE_2D, tudata->channels, tudata->xsize, tudata->ysize, format, GL_UNSIGNED_BYTE, tudata->data); } else { if (tudata->data == image->data && ((image->width & (image->width - 1)) != 0 || (image->height & (image->height - 1)) != 0)) { GLint newx = 4, newy = 4; /* Approximate round-to-nearest */ while (newx*3 < tudata->xsize*2) newx *= 2; while (newy*3 < tudata->ysize*2) newy *= 2; tudata->data = (char *)malloc(newx * newy * tudata->channels); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); gluScaleImage(format, tudata->xsize, tudata->ysize, GL_UNSIGNED_BYTE, image->data, newx, newy, GL_UNSIGNED_BYTE, tudata->data); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); /* default */ tudata->xsize = newx; tudata->ysize = newy; } glTexImage2D(GL_TEXTURE_2D, 0, tudata->channels, tudata->xsize, tudata->ysize, 0, format, GL_UNSIGNED_BYTE, tudata->data); } tex_postdef(); /* Remember the conditions under which we loaded this texture. */ tudata->qualflags = apflag & (APF_TXMIPMAP|APF_TXMIPINTERP|APF_TXLINEAR); _mgopenglc->curtex = tu; } if (_mgopenglc->curtex != tu) { /* Now bind the texture and select display mode. */ tex_bind(tu->id + ID_OFFSET); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minfilts[((apflag & APF_TXMIPMAP) ? 4 : 0) | ((apflag & APF_TXMIPINTERP) ? 2 : 0) | ((apflag & APF_TXLINEAR) ? 1 : 0)]); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (apflag & APF_TXLINEAR) ? GL_LINEAR : GL_NEAREST); _mgopenglc->curtex = tu; } glEnable(GL_TEXTURE_2D); } /*----------------------------------------------------------------------- * Function: mgopengl_d4f * Description: wrapper for c4f * Args: c: * Returns: * Author: munzner * Date: Wed Sep 18 21:48:08 1991 * Notes: We must multiply by kd (diffuse coefficient of the material) * since we called glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);glEnable(GL_COLOR_MATERIAL) earlier in mgopengl_material * so we're overwriting the diffuse material with every * c4f call. */ #if 0 void mgopengl_d4f(float c[4]) { float d[4]; d[0] = c[0] * kd; d[1] = c[1] * kd; d[2] = c[2] * kd; d[3] = c[3]; /* Let appearance alpha override object's alpha */ if (_mgc->astk->mat.valid & MTF_ALPHA && _mgc->astk->mat.override & MTF_ALPHA) d[3] = _mgc->astk->mat.diffuse.a; glColor4fv(d); } #else /* cH: even for constant shading we want to have the possibility that * the material alpha overrides the alpha value of the color. Also, * the decision about that can be done in mgopengl_appearance(). We * just define 4 functions: shaded w/o alpha override and constant * w/o alpha override. */ /* shaded, but without alpha override */ void mgopengl_d4f_shaded(float c[4]) { float d[4]; d[0] = c[0] * kd; d[1] = c[1] * kd; d[2] = c[2] * kd; d[3] = c[3]; glColor4fv(d); } /* shaded, with alpha override */ void mgopengl_d4f_shaded_alpha(float c[4]) { float d[4]; d[0] = c[0] * kd; d[1] = c[1] * kd; d[2] = c[2] * kd; d[3] = _mgc->astk->mat.diffuse.a; glColor4fv(d); } /* constant, without alpha override: this is just glColor4fv */ /* constant, with alpha override */ void mgopengl_d4f_constant_alpha(float c[4]) { float orig_a = c[3]; c[3] = _mgc->astk->mat.diffuse.a; /* what if c is not writable? */ glColor4fv(c); c[3] = orig_a; } #endif void mgopengl_n3fevert(Point3 *n, HPoint3 *p) { Point3 tn, diff; HPoint3 *cp; if (!(_mgc->has & HAS_CPOS)) { mg_findcam(); } cp = &_mgc->cpos; /* we must not assume that p is normalized here. Why should this be * the case? cp is a Point3, but p is a fully qualified HPoint3 * here. */ HPt3SubPt3(p, cp, &diff); if ((cp->w != 0 ? cp->w : 1.0) * Pt3Dot(&diff, n) > 0) { tn.x = -n->x; tn.y = -n->y; tn.z = -n->z; glNormal3fv((float *)&tn); } else { glNormal3fv((float *)n); } } void mgopengl_v4fcloser(HPoint3 *p) { HPoint3 tp; HPoint3 *cp = &_mgc->cpos; HPt3Coord wn = _mgc->zfnudge * p->w; if(!(_mgc->has & HAS_CPOS)) { mg_findcam(); } if (cp->w != 0.0) { wn /= cp->w; } tp.x = p->x + wn * cp->x; tp.y = p->y + wn * cp->y; tp.z = p->z + wn * cp->z; tp.w = p->w + wn; glVertex4fv((float *)&tp); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mg/opengl/mgopengl.h0000644000175000017500000000342012310110201015452 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * MG context attributes specific to GL * * MG_GLBORN may only be gotten. Not set. */ #define MG_GLWINID 101 /* window id (returned by winopen) */ #define MG_GLBORN 102 /* born flag (has window been created)? */ #define MG_GLZMAX 103 /* max z-buffer value */ #define MG_GLXDISPLAY 104 /* X11 Display * (for mixed model) */ #define MG_GLXSINGLEWIN 105 /* X Window id of single-buffered window */ #define MG_GLXDOUBLEWIN 106 /* X Window id of double-buffered window */ #define MG_GLXSINGLECTX 107 /* X11 context for single-buffered window */ #define MG_GLXDOUBLECTX 108 /* X11 context for double-buffered window */ #define MG_GLXSHARECTX 109 /* 'Get' another GLXcontext (or None) for sharing */ #define MG_BGIMAGEFILE 110 /* Name of file containing background image */ extern mgcontext *mgopengl_findctx(int glwinid); geomview-1.9.5/src/lib/mg/opengl/mgopenglP.h0000644000175000017500000001420512310110201015575 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "mgopengl.h" #ifdef GLUT # include #else # define GL_GLEXT_PROTOTYPES # include # include # include #endif #include "bsptree.h" enum { SGL=0, DBL=1 }; typedef struct mgopenglcontext { struct mgcontext mgctx; /* The mgcontext */ int born; /* Has window been displayed on the screen? */ int win; /* GL window ID, or 0 */ double zmin, zmax; /* max z-buffer value */ ColorA Cd; /* Cached diffuse color = mat->diffuse * Kd */ int lmcolor; /* lmcolor: GL_DIFFUSE or XXX lmc_COLOR */ double znudge; /* _mgc.zfnudge in integer Z-buffer units */ double znear, zfar; /* Current Z-buffer glDepthRange(, $2) limits */ int oldopts; /* For knowing when we need to reconfigure */ vvec room; /* Scratch space */ #ifdef _WIN32 short used4f; /* Windows VC++ doesn't like us to use the */ short useevn3f; /* above function pointers. Use flags instead.*/ # define D4F_ON() _mgopenglc->used4f = 1 # define D4F_OFF() _mgopenglc->used4f = 0 # define D4F(c) { if(_mgopenglc->used4f) mgopengl_d4f(c); \ else glColor4fv(c); \ } # define N3F_NOEVERT() _mgopenglc->useevn3f = 0 # define N3F_EVERT() _mgopenglc->useevn3f = 1 # define N3F(n,p) { if(_mgopenglc->useevn3f) mgopengl_n3fevert(n,p); \ else glNormal3fv(n); \ } #else /* use function pointers if the compiler permits */ void (*d4f)(); /* For shaded colors: apply mat.kd or no? */ void (*n3f)(); /* Evert normals to face viewer? */ # define D4F_ON() \ if (_mgc->astk->mat.valid & MTF_ALPHA && \ _mgc->astk->mat.override & MTF_ALPHA) { \ _mgopenglc->d4f = mgopengl_d4f_shaded_alpha; \ } else { \ _mgopenglc->d4f = mgopengl_d4f_shaded; \ } # define D4F_OFF() \ if (_mgc->astk->mat.valid & MTF_ALPHA && \ _mgc->astk->mat.override & MTF_ALPHA) { \ _mgopenglc->d4f = mgopengl_d4f_constant_alpha; \ } else { \ _mgopenglc->d4f = glColor4fv; \ } # define D4F(c) (*_mgopenglc->d4f)(c) # define N3F_EVERT() _mgopenglc->n3f = mgopengl_n3fevert # define N3F_NOEVERT() _mgopenglc->n3f = glNormal3fv # define N3F(n,p) (*_mgopenglc->n3f)(n,p) #endif #ifndef GLUT void *GLXdisplay; /* X11 Display pointer; if non-NULL, mixed model */ GLXContext cam_ctx[2]; /* single[0] and double-buf[1] OGL contexts */ GLXContext curctx; /* Current OpenGL context */ #endif int winids[2]; /* single[0] and double-buffered[1] X win ids */ int should_lighting, is_lighting; /* Lighting flags so we can turn off lighting for points&lines */ int tevbound; /* Texturing currently enabled? */ TxUser *curtex; /* Currently-bound texture (NULL if none) */ int dither; /* Dither enabled? */ char *bgimagefile; /* compatibility: bgimage file name */ GLuint *light_lists; int n_light_lists; GLuint *texture_lists; int n_texture_lists; GLuint *translucent_lists; int n_translucent_lists; GLuint translucent_seq; } mgopenglcontext; #define DPYLIST_INCR 10 #define MAXZNUDGE 8 /* Max possible depth of mgopengl_closer()/farther() calls */ /* We save the current W2C/C2W xforms on each call to mgopengl_worldbegin() * because the ModelView matrix stack actually stores both our object * xform and the view matrix: * * ModelView = [ obj xform ] * [ W2C ] * * Since we use the GL ModelView stack to keep track of our object xform, * instead of using the actual stack in the mgcontext struct, having * ModelView = W2C corresponds to [ obj xform ] = identity. We save W2C * and C2W on each mgopengl_worldbegin() because _mgc->cam might change * during the course of the frame, but isn't supposed to be reinterpreted * until the next mgopengl_worldbegin(). */ #define _mgopenglc ((mgopenglcontext*)_mgc) #if 0 extern void mgopengl_d4f( float c[4] ); #else extern void mgopengl_d4f_shaded(float c[4]); extern void mgopengl_d4f_shaded_alpha(float c[4]); extern void mgopengl_d4f_constant_alpha(float c[4]); #endif extern void mgopengl_n3fevert( Point3 *n, HPoint3 *p ); extern void mgopengl_notexture(void); extern void mgopengl_needtexture(void); extern void mgopengl_closer(void); extern void mgopengl_farther(void); extern void mgopengl_setshader(mgshadefunc shader); extern void mgopengl_drawnormal(HPoint3 *p, Point3 *n); extern void mgopengl_init_zrange(); extern void mgopengl_v4fcloser(HPoint3 *); extern void mgopengl_txpurge(TxUser *); extern void mgopengl_lights(LmLighting *lm, struct mgastk *astk); extern void mgopengl_appearance( struct mgastk *ma, int mask ); extern GLuint *mgopengl_realloc_lists(GLuint *lists, int *n_lists); extern GLuint mgopengl_new_translucent(Transform T); extern void mgopengl_end_translucent(void); extern void mgopengl_bsptree(BSPTree *bsptree); #ifdef _WIN32 extern void mgopengl_c4f(float *); extern void mgopengl_n3f(float *); #else #define mgopengl_c4f glColor4fv #define mgopengl_n3f glNormal3fv #endif #define MAY_LIGHT() { \ if(_mgopenglc->should_lighting && !_mgopenglc->is_lighting) { \ glEnable(GL_LIGHTING); \ _mgopenglc->is_lighting = 1; \ } } #define DONT_LIGHT() { \ if(_mgopenglc->is_lighting) { \ glDisable(GL_LIGHTING); \ _mgopenglc->is_lighting = 0; \ } \ } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mg/opengl/mgopenglshade.h0000644000175000017500000000265312310110201016466 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ extern void mgopengl_material(struct mgastk *, int mask ); extern void mgopengl_lighting( struct mgastk *, int mask ); extern void mgopengl_lights( LmLighting *, struct mgastk * ); extern int mgopengl_materialdef( int matno, Material *mat, int mask ); extern int mgopengl_lightdef( int lightno, LtLight *light, LmLighting *lgt, int mask); extern int mgopengl_lightmodeldef(int lightmodel, LmLighting *lgt, int mask, struct mgastk *); extern void mgopengl_d4f( float *c ); geomview-1.9.5/src/lib/mg/opengl/mgopenglstipple.c0000644000175000017500000000405512310110201017053 00000000000000/* Copyright (C) 2008 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #include "mgopenglstipple.h" #include #include #include #define NUM_OPACITY_STEPS 32 #define NUM_OPACITY_VARIANTS 128 static GLubyte stippleMasks[NUM_OPACITY_VARIANTS][NUM_OPACITY_STEPS+1][128]; static unsigned char stippleMaskRotation[NUM_OPACITY_STEPS+1]; const GLubyte *mgopengl_get_polygon_stipple(float alpha) { int index; int variant; index = (int)(alpha*(float)NUM_OPACITY_STEPS+0.5); variant = stippleMaskRotation[index] = (stippleMaskRotation[index] + 1) % NUM_OPACITY_VARIANTS; return stippleMasks[variant][index]; } void mgopengl_init_polygon_stipple(void) { int pat, pix, variant; float alpha; for (variant = 0; variant < NUM_OPACITY_VARIANTS; variant++) { memset(stippleMasks[variant][0], 0, 128); memset(stippleMasks[variant][NUM_OPACITY_STEPS], ~0, 128); for (pat = 1; pat < NUM_OPACITY_STEPS; pat++) { memset(stippleMasks[pat], 0, 128); alpha = 1.0 / (float)NUM_OPACITY_STEPS * (float)pat; srand(pat*variant); for (pix = 0; pix < 32*32; pix++) { float prob; int byte = pix / 8; int bit = pix % 8; prob = (float)rand() / (float)RAND_MAX; if (prob >= (1.0 - alpha)) { stippleMasks[variant][pat][byte] |= 1 << bit; } } } } } geomview-1.9.5/src/lib/mg/opengl/mgopenglstipple.h0000644000175000017500000000204012310110201017050 00000000000000/* Copyright (C) 2008 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _MGOPENGLSTIPPLE_H_ #define _MGOPENGLSTIPPLE_H_ #include extern const GLubyte *mgopengl_get_polygon_stipple(float alpha); extern void mgopengl_init_polygon_stipple(void); #endif /* _MGOPENGLSTIPPLE_H_ */ geomview-1.9.5/src/lib/mg/opengl/Headers0000644000175000017500000000004712310110200014770 00000000000000mgopengl.h mgopenglP.h mgopenglshade.h geomview-1.9.5/src/lib/mg/x11/0000755000175000017500000000000012310165603012717 500000000000000geomview-1.9.5/src/lib/mg/x11/Makefile.in0000644000175000017500000004775012310165555014727 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/mg/x11 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libmgx11_la_LIBADD = am_libmgx11_la_OBJECTS = mgx11.lo mgx11clip.lo mgx11dither.lo \ mgx11draw.lo mgx11render1.lo mgx11render16.lo mgx11render8.lo \ mgx11shade.lo mgx11visual.lo mgx11windows.lo libmgx11_la_OBJECTS = $(am_libmgx11_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libmgx11_la_SOURCES) DIST_SOURCES = $(libmgx11_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) $(X_CFLAGS) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgx11.la libmgx11_la_SOURCES = \ mgx11.c \ mgx11clip.c \ mgx11dither.c \ mgx11draw.c \ mgx11render1.c \ mgx11render16.c \ mgx11render8.c \ mgx11shade.c \ mgx11visual.c \ mgx11windows.c \ mgx11.h \ mgx11P.h \ mgx11render1.h \ mgx11render16.h \ mgx11render8.h \ mgx11shade.h \ mgx11windows.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/mg/x11/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/mg/x11/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libmgx11.la: $(libmgx11_la_OBJECTS) $(libmgx11_la_DEPENDENCIES) $(EXTRA_libmgx11_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libmgx11_la_OBJECTS) $(libmgx11_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11clip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11dither.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11draw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11render1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11render16.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11render8.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11shade.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11visual.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11windows.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/mg/x11/Makefile.am0000644000175000017500000000064212310110201014655 00000000000000INCLUDES = $(default_includes) $(X_CFLAGS) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgx11.la libmgx11_la_SOURCES = \ mgx11.c \ mgx11clip.c \ mgx11dither.c \ mgx11draw.c \ mgx11render1.c \ mgx11render16.c \ mgx11render8.c \ mgx11shade.c \ mgx11visual.c \ mgx11windows.c \ mgx11.h \ mgx11P.h \ mgx11render1.h \ mgx11render16.h \ mgx11render8.h \ mgx11shade.h \ mgx11windows.h geomview-1.9.5/src/lib/mg/x11/mgx11.c0000644000175000017500000006042312310110201013725 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgx11P.h" #include "windowP.h" #include "mgx11shade.h" #include "mgx11windows.h" #include mgcontext * mgx11_ctxcreate(int a1, ...); int mgx11_ctxset( int a1, ... ); int mgx11_feature( int feature ); void mgx11_ctxdelete( mgcontext *ctx ); int mgx11_ctxget( int attr, void* valueptr ); int mgx11_ctxselect( mgcontext *ctx ); void mgx11_sync( void ); void mgx11_worldbegin( void ); void mgx11_worldend( void ); void mgx11_reshapeviewport( void ); void mgx11_identity( void ); void mgx11_transform( Transform T ); int mgx11_pushtransform( void ); int mgx11_poptransform( void ); void mgx11_gettransform( Transform T ); void mgx11_settransform( Transform T ); int mgx11_pushappearance( void ); int mgx11_popappearance( void ); const Appearance *mgx11_setappearance(const Appearance* app, int merge ); int mgx11_setcamera( Camera* cam ); int mgx11_setwindow( WnWindow *win, int final ); mgx11context *mgx11_newcontext( mgx11context *ctx ); extern void mgx11_polygon(); extern void mgx11_mesh(); extern void mgx11_line(); extern void mgx11_polyline(); extern void mgx11_polylist(); extern void mgx11_quads(); extern void mgx11_setshader(mgshadefunc shader); extern void mgx11_appearance( struct mgastk *ma, int mask ); extern void mgx11_init_zrange(); int _mgx11_ctxset(int a1, va_list *alist); WnWindow *mgx11window(WnWindow *win); struct mgfuncs mgx11funcs = { MGD_X11, mgdevice_X11, mgx11_feature, (mgcontext *(*)())mgx11_ctxcreate, mgx11_ctxdelete, (int (*)())mgx11_ctxset, mgx11_ctxget, mgx11_ctxselect, mgx11_sync, mgx11_worldbegin, mgx11_worldend, mgx11_reshapeviewport, /* geometry transform */ mgx11_settransform, mgx11_gettransform, mgx11_identity, mgx11_transform, mgx11_pushtransform, mgx11_poptransform, /* texture transform */ mg_settxtransform, mg_gettxtransform, mg_txidentity, mg_txtransform, mg_pushtxtransform, mg_poptxtransform, /* appearance stack */ mgx11_pushappearance, mgx11_popappearance, mgx11_setappearance, mg_getappearance, /********************/ mgx11_setcamera, mgx11_polygon, mgx11_polylist, mgx11_mesh, mgx11_line, mgx11_polyline, mg_quads, mg_bezier, mg_bsptree, mg_tagappearance, mg_untagappearance, mg_taggedappearance }; /*----------------------------------------------------------------------- * Function: mgdevice_X11 * Description: select the X11 device as the current MG device * Returns: 1 * Author: daeron * Notes: */ int mgdevice_X11() { _mgf = mgx11funcs; if(_mgc != NULL && _mgc->devno != MGD_X11) _mgc = NULL; return(0); } /*----------------------------------------------------------------------- * Function: mgx11_newcontext * Description: initialize an mgcontext structure * Args: mgc: ptr to context structure to initialize * Returns: mgc * Notes: Further device-specific initialization is normally required. */ mgx11context * mgx11_newcontext( mgx11context *ctx ) { mg_newcontext(&(ctx->mgctx)); ctx->mgctx.devfuncs = &mgx11funcs; ctx->mgctx.devno = MGD_X11; ctx->mgctx.astk->ap_seq = 1; ctx->mgctx.astk->mat_seq = 1; ctx->mgctx.astk->light_seq = 1; ctx->mgctx.astk->shader = mg_eucshade; ctx->mgctx.zfnudge = 40.e-6; ctx->win = 0; ctx->pix = 0; ctx->cmapset = 0; ctx->sizelock = 0; ctx->deleted = NULL; ctx->visible = 0; VVINIT(ctx->room, char, 180); return ctx; } /*----------------------------------------------------------------------- * Function: _mgx11_ctxset * Description: internal ctxset routine * Args: a1: first attribute * *alist: rest of attribute-value list * Returns: -1 on error, 0 on success * Date: Fri Sep 20 11:08:13 1991 * Notes: mgx11_ctxcreate() and mgx11_ctxset() call this to actually * parse and interpret the attribute list. */ int _mgx11_ctxset(int a1, va_list *alist) { int attr; char **ablock = NULL; #define NEXT(type) OOGL_VA_ARG(type, alist, ablock) for (attr = a1; attr != MG_END; attr = NEXT(int)) { switch (attr) { case MG_ABLOCK: ablock = NEXT(char**); break; case MG_ApSet: { Appearance *ap; if (ablock) ap = ApSet(NULL, AP_ABLOCK, ablock); else ap = _ApSet(NULL, va_arg(*alist, int), alist); mgx11_setappearance(ap, MG_MERGE); ApDelete(ap); } break; case MG_WnSet: if (ablock) WnSet( _mgc->win, WN_ABLOCK, ablock); else _WnSet( _mgc->win, va_arg(*alist, int), alist); mgx11_setwindow( _mgc->win, 0 ); break; case MG_CamSet: if (ablock) CamSet( _mgc->cam, CAM_ABLOCK, ablock); else _CamSet( _mgc->cam, va_arg(*alist, int), alist); break; case MG_APPEAR: mgsetappearance( NEXT(Appearance *), MG_SET ); break; case MG_WINDOW: mgx11_setwindow( NEXT(WnWindow *), 0 ); break; case MG_CAMERA: mgx11_setcamera( NEXT(Camera *) ); break; case MG_SETOPTIONS: _mgc->opts |= NEXT(int); break; case MG_UNSETOPTIONS: _mgc->opts &= ~NEXT(int); break; case MG_SHOW: _mgc->shown = NEXT(int); break; case MG_PARENT: _mgc->parent = NEXT(mgcontext*); break; case MG_BACKGROUND: { ColorA bcolor; bcolor = *NEXT(ColorA*); if ((bcolor.r != _mgc->background.r) || (bcolor.g != _mgc->background.g) || (bcolor.b != _mgc->background.b)) _mgx11c->exposed = 1; _mgc->background = bcolor; } break; case MG_SHADER: mgx11_setshader( NEXT(mgshadefunc) ); break; case MG_SHADERDATA: _mgc->astk->shaderdata = NEXT(void*); break; case MG_WINCHANGE: _mgc->winchange = NEXT(mgwinchfunc); break; case MG_WINCHANGEDATA: _mgc->winchangeinfo = NEXT(void *); break; case MG_SPACE: { int space = NEXT(int); switch (TM_SPACE(space)) { case TM_EUCLIDEAN: case TM_SPHERICAL: _mgc->space = space; break; case TM_HYPERBOLIC: switch (TM_MODEL(space)) { case TM_VIRTUAL: case TM_PROJECTIVE: case TM_CONFORMAL_BALL: _mgc->space = space; break; default: fprintf(stderr, "_mgx11_ctxset: Illegal space value %1d\n", space); } break; default: fprintf(stderr, "_mgx11_ctxset: Illegal space value %1d\n", space); } } break; case MG_NDCTX: _mgc->NDctx = NEXT(mgNDctx *); break; case MG_ZNUDGE: _mgc->zfnudge = NEXT(double); break; case MG_DEPTHSORT: _mgx11c->sortmethod = (enum sortmethod)NEXT(int); break; case MG_DITHER: _mgx11c->dither = NEXT(int); break; case MG_BITDEPTH: _mgx11c->bitdepth = NEXT(int); Xmg_setx11display(_mgx11c->mgx11display); /* fprintf(stderr," Got bit depth %d\n", _mgx11c->bitdepth); */ break; case MG_X11PIXID: _mgx11c->win = 1; _mgx11c->pix = 1; Xmg_setwin(NEXT(Window)); _mgc->shown = 1; break; case MG_X11WINID: _mgx11c->win = 1; Xmg_setwin(NEXT(Window)); _mgc->shown = 1; break; case MG_X11PARENT: Xmg_setparent(NEXT(Window)); break; case MG_X11DISPLAY: _mgx11c->mgx11display = NEXT(Display *); Xmg_initx11device(); break; case MG_X11SIZELOCK: _mgx11c->sizelock = NEXT(int); break; case MG_X11VISUAL: _mgx11c->visual = NEXT(Visual *); break; case MG_X11EXPOSE: _mgx11c->exposed = 1; break; case MG_X11COLORMAP: _mgx11c->cmap = NEXT(Colormap); _mgx11c->cmapset = 1; break; default: OOGLError (0, "_mgx11_ctxset: undefined option: %d", attr); return -1; } } if (_mgc->shown && !_mgx11c->visible) { /* open the window */ mgx11window(_mgc->win); /* bring X11 state into accordance with appearance state */ { Appearance *ap = ApCopy( &(_mgc->astk->ap), NULL ); mgx11_setappearance( ap, MG_SET ); ApDelete(ap); } } #undef NEXT return 0; } int mgx11_setwindow( WnWindow *win, int final ) { #ifdef UNNEEDED WnPosition pos, vp; int xsize, ysize, flag, reconstrain; int positioned = 0; int zmin; char *name, *oname; #endif if (win == NULL) return 0; if(_mgc->winchange) (*_mgc->winchange)(_mgc, _mgc->winchangeinfo, MGW_WINCHANGE, win); #ifdef UNNEEDED reconstrain = 0; if (WnGet(win, WN_PREFPOS, (void*)&pos) == 1 && (win->changed & WNF_HASPREF)) { if (_mgx11c->visible) Xmg_poswin(pos.xmin, pos.xmax, pos.ymin, pos.ymax); else { Xmg_prefposwin(pos.xmin, pos.xmax, pos.ymin, pos.ymax); reconstrain = positioned = 1; } win->changed &= ~(WNF_HASPREF | WNF_HASSIZE); } else if ((WnGet(win, WN_XSIZE, (void*)&xsize) == 1 && (WnGet(win, WN_YSIZE, (void*)&ysize) == 1 && (win->changed & WNF_HASSIZE))) && !(_mgx11c->sizelock) && _mgx11c->visible) { Xmg_sizewin(xsize, ysize); reconstrain = 1; win->changed &= ~WNF_HASSIZE; } if (reconstrain && _mgx11c->visible) { WnGet(win, WN_NOBORDER, &flag); /* if (flag) noborder(); what to replace these with for X? winconstraints();*/ reconstrain = 0; } if (_mgc->shown) { WnGet(win, WN_NAME, &name); if (_mgx11c->visible) { if(name && (win->changed & WNF_HASNAME)) { Xmg_titlewin(name); win->changed &= ~WNF_HASNAME; } if (WnGet(win, WN_VIEWPORT, &vp) > 0 && win->changed & WNF_HASVP) { /* some sort of viewport(vp.xmin, vp.xmax, vp.ymin, vp.ymax) function */ win->changed &=~WNF_HASVP; } } else if (final) { _mgx11c->win = Xmg_openwin(name); mgx11_sync(); if (_mgx11c->win == 0) { OOGLError(0,"mgx11window: unable to open window"); return 0; } if (positioned) Xmg_poswin(pos.xmin, pos.xmax, pos.ymin, pos.ymax); _mgx11c->visible = 1; reconstrain = 0; } } if ((reconstrain && _mgx11c->visible) || (win->changed & (WNF_NOBORDER | WNF_ENLARGE | WNF_SHRINK))) { WnGet(win, WN_SHRINK, &flag); if (flag) Xmg_minsize((long)40, (long)30); reconstrain = 1; } if (reconstrain && _mgx11c->visible) { Xmg_winconstrain(); win->changed &= ~(WNF_NOBORDER | WNF_ENLARGE | WNF_SHRINK); } #endif /*UNNEEDED*/ if (win != _mgc->win) { RefIncr((Ref *)win); WnDelete(_mgc->win); _mgc->win = win; } return 1; } /*----------------------------------------------------------------------- * Function: mgx11_identity * Description: Set the current object xform to the identity * Args: (none) * Returns: nothing * Notes: Sets the xform on the top of the current context's xform * stack to the identity. Also sets the MC_TRANS bit of * the context's "changed" flag and increment's the current xfm * sequence number. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgx11_identity( void ) { mgx11_settransform( TM3_IDENTITY ); } /*----------------------------------------------------------------------- * Function: mgx11_settransform * Description: Set the current object xform * Args: T * Returns: nothing * Notes: Sets the xform on the top of the current context's xform * stack to T. Also sets the MC_TRANS bit of * the context's "changed" flag and increment's the current xfm * sequence number. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgx11_settransform( Transform T ) { TmCopy(T, _mgc->xstk->T); _mgc->has = _mgc->xstk->hasinv = 0; } /*----------------------------------------------------------------------- * Function: mgx11_gettransform * Description: Get the current object xform * Args: T * Returns: nothing * Notes: Writes the current object xform, from the top of the * context's xform stack, into T. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgx11_gettransform( Transform T ) { TmCopy(_mgc->xstk->T, T); } /*----------------------------------------------------------------------- * Function: mgx11_transform * Description: premultiply the current object xform by a transform * Args: T: the transform to premultiply by * Returns: nothing * Notes: If X is the context's current object xform, replaces X * by T X. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgx11_transform( Transform T ) { TmConcat(T, _mgc->xstk->T, _mgc->xstk->T); _mgc->has = _mgc->xstk->hasinv = 0; } /*----------------------------------------------------------------------- * Function: mgx11_pushappearance * Description: push the context's appearance stack * Returns: nothing * Notes: * DEVICE USE: required --- all devices must maintain this stack */ int mgx11_pushappearance() { mg_pushappearance(); return 0; } /*----------------------------------------------------------------------- * Function: mgx11_popappearance * Description: pop the context's appearance stack * Returns: nothing * Notes: * DEVICE USE: required --- all deviced must maintain this stack */ int mgx11_popappearance() { struct mgastk *mastk = _mgc->astk; struct mgastk *mastk_next; if (!(mastk_next = mastk->next)) { OOGLError(0, "mgx11_popappearance: appearance stack has only 1 entry."); return 1; } mgx11_appearance(mastk_next, mastk_next->ap.valid); mg_popappearance(); return 0; } /*----------------------------------------------------------------------- * Function: mgx11_setappearance * Description: Operate on appearance in current context * Args: *ap: the appearance to assign or merge * mergeflag: MG_MERGE or MG_SET * Returns: ptr to current appearance * Notes: Modifies the context's current apperance. Does not * modify *ap. * mergeflag = MG_MERGE: merge *ap into current appearance * mergeflag = MG_SET: set current appearance to *ap * DEVICE USE: required --- when ??? * * Can we modify this to do some of the flag setting * than mgx11_setappearance currently does??? This * seems common to all devices. */ const Appearance * mgx11_setappearance(const Appearance *ap, int mergeflag ) { int changed, lng_changed; struct mgastk *mastk = _mgc->astk; Appearance *ma; ma = &(mastk->ap); if(mergeflag == MG_MERGE) { changed = ap->valid &~ (ma->override &~ ap->override); lng_changed = ap->lighting ? ap->lighting->valid &~ (ma->lighting->override &~ ap->lighting->override) : 0; } else { changed = ap->valid; lng_changed = ap->lighting ? ap->lighting->valid : 0; } mg_setappearance( ap, mergeflag ); if (_mgx11c->visible) { if ((ap->lighting) && (mastk->next)) { if (mastk->light_seq == mastk->next->light_seq) { mastk->light_seq++; lng_changed |= ma->lighting->valid; /* "All fields changed" */ } } } mgx11_appearance( mastk, changed); return &_mgc->astk->ap; } /*----------------------------------------------------------------------- * Function: mgx11_setcamera * Description: Set the context's camera * Args: *cam: the camera to use * Returns: nothing * Notes: The context does not maintain an internal copy of the * camera. Only the pointer is stored. * DEVICE USE: required */ int mgx11_setcamera( Camera *cam ) { if (_mgc->cam) CamDelete(_mgc->cam); _mgc->cam = cam; RefIncr((Ref*) cam); return 0; } /*----------------------------------------------------------------------- * Function: mgx11_ctxset * Description: set some attributes in the current context * Args: attr, ...: list of attribute-value pairs, terminated * by MG_END * Returns: -1 on error, 0 on success * Notes: DO NOT CALL THIS (yet)! It currently does nothing. * DEVICE USE: forbidden --- devices have their own mgxx_ctxset() * * This needs to be modified to work as the NULL device. * Use by other devices may never be needed. */ int mgx11_ctxset( int attr, ... /*, MG_END */ ) { va_list alist; int result; va_start( alist, attr ); result = _mgx11_ctxset(attr, &alist); va_end(alist); return result; } /*----------------------------------------------------------------------- * Function: mgx11_ctxget * Description: get an attribute from the current context * Args: attr: the attribute to get * value: place to write attr's value * */ int mgx11_ctxget( int attr, void *value ) { #define VALUE(type) ((type*)value) switch (attr) { case MG_APPEAR: *VALUE(Appearance*) = &(_mgc->astk->ap); break; case MG_CAMERA: *VALUE(Camera*) = _mgc->cam; break; case MG_WINDOW: if (_mgx11c->visible) { int x0, y0, xsize, ysize; WnPosition wp; Xmg_getwinsize(&xsize, &ysize, &x0, &y0); wp.xmin = (long)x0; wp.xmax = (long)x0+(long)xsize-1; wp.ymin = (long)y0; wp.ymax = (long)y0+(long)ysize-1; WnSet(_mgc->win, WN_CURPOS, &wp, WN_END); } *VALUE(WnWindow*) = _mgc->win; break; case MG_PARENT: *VALUE(mgcontext*) = _mgc->parent; break; case MG_SETOPTIONS: case MG_UNSETOPTIONS: *VALUE(int) = _mgc->opts; break; case MG_BACKGROUND: *VALUE(ColorA) = _mgc->background; break; case MG_SHADER: *VALUE(mgshadefunc) = _mgc->astk->shader; break; case MG_SHADERDATA: *VALUE(void *) = _mgc->astk->shaderdata; break; case MG_WINCHANGE: *VALUE(mgwinchfunc) = _mgc->winchange; break; case MG_WINCHANGEDATA: *VALUE(void *) = _mgc->winchangeinfo; break; case MG_SPACE: *VALUE(int) = _mgc->space; break; case MG_NDCTX: *VALUE(mgNDctx *) = _mgc->NDctx; break; case MG_X11WINID: *VALUE(int) = _mgx11c->win; break; case MG_X11VISIBLE: *VALUE(int) = _mgx11c->visible; break; case MG_ZNUDGE: *VALUE(float) = _mgc->zfnudge; break; case MG_DEPTHSORT: *VALUE(int) = _mgx11c->sortmethod; break; case MG_DITHER: *VALUE(int) = _mgx11c->dither; break; case MG_BITDEPTH: *VALUE(int) = _mgx11c->bitdepth; break; case MG_X11VISUAL: *VALUE(Visual *) = _mgx11c->visual; break; default: OOGLError (0, "mgx11_ctxget: undefined option: %d\n", attr); return -1; } return 1; #undef VALUE } /*----------------------------------------------------------------------- * Function: mgx11_feature * Description: determine whether the NULL device has a particular feature * Args: feature: feature to test for * Returns: -1 (means feature is not present) * Notes: X11 device is rather featureless at present, :-) * DEVICE USE: forbidden --- devices have their own mgxx_feature() */ int mgx11_feature( int feature ) { if(feature == MG_X11VISUAL) return 1; return -1; } /*----------------------------------------------------------------------- * Function: mgx11_ctxcreate * Description: create a new MG context for the X11 device * Args: a1, ...: list of attribute-value pairs * Returns: ptr to new context * Author: daeron */ mgcontext * mgx11_ctxcreate( int a1, ... ) { va_list alist; _mgc = (mgcontext*)mgx11_newcontext( OOGLNewE(mgx11context, "mgx11_ctxcreate") ); if (!Xmg_initx11device()) OOGLError(0,"mgdevice_X11: unable to open X-display"); va_start(alist, a1); if (_mgx11_ctxset(a1, &alist) == -1) { mgx11_ctxdelete(_mgc); } va_end(alist); return _mgc; } /*----------------------------------------------------------------------- * Function: mgx11_ctxdelete * Description: delete an MG context for the X11 device * Args: *ctx: ptr to context to delete * Returns: nothing * Author: daeron */ void mgx11_ctxdelete( mgcontext *ctx ) { mgx11context *_mgx = (mgx11context *)ctx; if(ctx->devno != MGD_X11) { mgcontext *was = _mgc; mgctxselect(ctx); free(_mgx->myxwin); mgctxdelete(ctx); if (was != ctx) mgctxselect(was); } else { if (((mgx11context *)ctx)->visible) Xmg_closewin(_mgx->myxwin); free(_mgx->myxwin); mg_ctxdelete(ctx); if (ctx == _mgc) _mgc = NULL; } } /*----------------------------------------------------------------------- * Function: mgx11_ctxselect * Description: select the current context * Args: *ctx: the context to select * Returns: 0 (why ???) * Author: daeron */ int mgx11_ctxselect( mgcontext *ctx ) { if (ctx == NULL || ctx->devno != MGD_X11) { return mg_ctxselect(ctx); } /* X11 context */ _mgc = ctx; return(0); } /*----------------------------------------------------------------------- * Function: mgx11_pushtransform * Description: push the mg context xform stack * Returns: nothing */ int mgx11_pushtransform( void ) { mg_pushtransform(); return 0; } /*----------------------------------------------------------------------- * Function: mgx11_poptransform * Description: pop the mg context xform stack * Returns: nothing */ int mgx11_poptransform( void ) { mg_poptransform(); return 0; } void mgx11_sync( void ) { Xmg_flush(); } void mgx11_worldbegin( void ) { mg_worldbegin(); #if 0 && !DO_NOT_HACK_THE_CODE_THIS_WAY { /* This cannot be done here because there are objects which do not * belong to the world coordinate system; this stuff needs to be * done in mgx11windows.c in Xmg_add(). */ Transform S; WnPosition vp; WnGet(_mgc->win, WN_VIEWPORT, &vp); /* Fix up W2S and S2W matrices. Since the X11 coordinate system * has Y increasing downward, flip it here, and translate by * location of lower left corner of viewport. */ TmTranslate(S, (double)vp.xmin, (double)vp.ymax, 0.); S[1][1] = -1; /* Invert sign of Y */ TmConcat(_mgc->W2S, S, _mgc->W2S); TmInvert(_mgc->W2S, _mgc->S2W); } #endif _mgc->has = 0; Xmg_newdisplaylist(); } void mgx11_worldend( void ) { Xmg_sortdisplaylist(); Xmg_showdisplaylist(); } void mgx11_reshapeviewport( void ) { int w, h, x0, y0; float pixasp = 1.0; WnPosition vp; WnGet(_mgc->win, WN_PIXELASPECT, &pixasp); if (WnGet(_mgc->win, WN_VIEWPORT, &vp) <= 0) { WnPosition wp; Xmg_getwinsize(&w, &h, &x0, &y0); wp.xmin = (long)x0; wp.xmax = (long)x0+(long)w-1; wp.ymin = (long)y0; wp.ymax = (long)y0+(long)h-1; WnSet(_mgc->win, WN_CURPOS, &wp, WN_END); } else { w = vp.xmax - vp.xmin + 1; h = vp.ymax - vp.ymin + 1; } CamSet(_mgc->cam, CAM_ASPECT, pixasp * (double)w/(double)h, CAM_END); } WnWindow * mgx11window(WnWindow *win) { mgx11_setwindow(win, 1); mgx11_init_zrange(); return(win); } /*----------------------------------------------------------------------- * Function: mgx11_findctx * Description: Given an X11 window ID, returns the associated mg context. * Returns: mgcontext * for success, NULL if none exists. * Author: daeron * Notes: This is a public routine. */ mgcontext * mgx11_findctx( Window winid ) { struct mgcontext *mgc; for(mgc = _mgclist; mgc != NULL; mgc = mgc->next) { if(mgc->devno == MGD_X11 && ((mgx11context *)mgc)->myxwin->window == winid) return mgc; } return NULL; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mg/x11/mgx11clip.c0000644000175000017500000001631012310110201014571 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgx11P.h" #define WCLIPPLANE 0.001 /* This is as close as we get to the eyeplane */ #define XLEFTCLIP 0.0 #define XRIGHTCLIP 1.0 #define YTOPCLIP 0.0 #define YBOTTOMCLIP 1.0 #define ZNEARCLIP (-1.0) #define ZFARCLIP 1.0 static int xyz[6], clipvertnum = 0; static mgx11prim *prim1, *prim2, *primtemp; static CPoint3 *vts1, *vts2, *vtstemp; /* Function: Xmg_dividew() Description: Divide out w coordinate (*after* clipping against WCLIPPLANE) Author: Daeron Meyer */ int Xmg_dividew(void) { CPoint3 *curr; float w; int n; for (n = 0; n < prim1->numvts; n++) { curr = &(vts1[n]); w = curr->w; curr->x /= w; curr->y /= w; curr->z /= w; curr->z += _mgx11c->znudgeby; if (curr->x < XLEFTCLIP) xyz[0]++; if (curr->x >= (float)_mgx11c->myxwin->zwidth - XRIGHTCLIP) xyz[1]++; if (curr->y < YTOPCLIP) xyz[2]++; if (curr->y >= (float)_mgx11c->myxwin->height - YBOTTOMCLIP) xyz[3]++; if (curr->z < ZNEARCLIP) xyz[4]++; if (curr->z >= ZFARCLIP) xyz[5]++; /* create a "dirty" rectangle */ if (!_mgx11c->exposed) { if (curr->x < _mgx11c->xmin) _mgx11c->xmin = curr->x; if (curr->y < _mgx11c->ymin) _mgx11c->ymin = curr->y; if (curr->x > _mgx11c->xmax) _mgx11c->xmax = curr->x; if (curr->y > _mgx11c->ymax) _mgx11c->ymax = curr->y; } } return 0; } /* Function: Xmg_cliptoplane() Description: Clip polygon against a coordinate axis plane Author: Daeron Meyer */ int Xmg_cliptoplane(int coord, float plane, float sign) { CPoint3 *prev, *curr, *dest; float i, i1, i2, *c1, *p1, *d1; int n; #ifdef DEBUGCLIP fprintf(stderr, "Clip %d, plane=%f, sign=%f\n", coord, plane, sign); #endif prim2->numvts = 0; prev = &(vts1[prim1->numvts - 1]); i1 = sign * ((float *) prev) [coord] - plane; for (curr=vts1, n=prim1->numvts; n > 0; n--, prev=curr, i1=i2, curr++) { i2 = sign * ((float *) curr) [coord] - plane; if ((i1 <= 0.0) ^ (i2 <= 0.0)) { i = i1/(i1 - i2); dest = &(vts2[prim2->numvts]); dest->x = prev->x + i * (curr->x - prev->x); dest->y = prev->y + i * (curr->y - prev->y); dest->z = prev->z + i * (curr->z - prev->z); dest->w = prev->w + i * (curr->w - prev->w); if ((i1 <= 0.0) || (prev->drawnext == 0)) dest->drawnext = 0; else dest->drawnext = 1; c1 = (float *) &(curr->vcol); p1 = (float *) &(prev->vcol); d1 = (float *) &(dest->vcol); d1[0] = p1[0] + i * (c1[0] - p1[0]); d1[1] = p1[1] + i * (c1[1] - p1[1]); d1[2] = p1[2] + i * (c1[2] - p1[2]); d1[3] = p1[3] + i * (c1[3] - p1[3]); prim2->numvts++; } if (i2 <= 0.0) { vts2[prim2->numvts] = *curr; prim2->numvts++; } } #ifdef DEBUGCLIP for (n = 0; n < prim2->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts2[n].x, vts2[n].y, vts2[n].z, vts2[n].w, vts2[n].drawnext); } #endif return 0; } /* Function: Xmg_primclip() Description: Clip a polygon to fit in the viewing volume Author: Daeron Meyer */ int Xmg_primclip(mgx11prim *aprim) { static mgx11prim clip; static int mykind, n; static vvec clipverts; static int intersectw; xyz[0]=0; xyz[1]=0; xyz[2]=0; xyz[3]=0; xyz[4]=0; xyz[5]=0; /* give ourselves more space for vertex data if needed */ if ((aprim->numvts * 2) > clipvertnum) { if (!clipvertnum) VVINIT(clipverts, CPoint3, clipvertnum); clipvertnum = aprim->numvts * 2; vvneeds(&clipverts, clipvertnum); } /* We might need more space for the final polygon since clipping can produce a polygon with more vertices than it had to begin with. We'll err on the side of safety: */ if ((_mgx11c->mysort->cvert + aprim->numvts) > _mgx11c->mysort->pvertnum) { _mgx11c->mysort->pvertnum *= 2; vvneeds(&(_mgx11c->mysort->pverts), _mgx11c->mysort->pvertnum); } mykind = aprim->mykind; prim1 = aprim; prim2 = &clip; vts1 = &(VVEC(_mgx11c->mysort->pverts, CPoint3)[prim1->index]); vts2 = &(VVEC(clipverts, CPoint3)[0]); if ((mykind==PRIM_LINE) || (mykind==PRIM_SLINE)) vts1[prim1->numvts-1].drawnext = 0; prim2->index = 0; prim2->numvts = prim1->numvts; #define CLIP_POLYS_AND_SWAP(a, b, c) { \ Xmg_cliptoplane(a, b, c); \ if (prim2->numvts == 0) { aprim->numvts = 0; return PRIM_INVIS; } \ vtstemp = vts2; vts2 = vts1; vts1 = vtstemp; \ primtemp = prim2; prim2 = prim1; prim1 = primtemp; \ } #ifdef DEBUGCLIP fprintf(stderr, "BEGIN-CLIP\n"); fprintf(stderr, "INITIAL POLY:\n"); for (n=0; n < aprim->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts1[n].x, vts1[n].y, vts1[n].z, vts1[n].w, vts1[n].drawnext); } fprintf(stderr,"===========================\n"); #endif intersectw = 0; for (n = 0; (n < aprim->numvts) && !intersectw; n++) { if (vts1[n].w < WCLIPPLANE) intersectw = 1; } if (intersectw) CLIP_POLYS_AND_SWAP(3, -WCLIPPLANE, -1.0); Xmg_dividew(); n = prim1->numvts; if (!intersectw && (xyz[0]+xyz[1]+xyz[2]+xyz[3]+xyz[4]+xyz[5] == 0)) return mykind; else if (xyz[0] == n || xyz[1] == n || xyz[2] == n || xyz[3] == n || xyz[4] == n || xyz[5] == n) return PRIM_INVIS; if (xyz[0]) CLIP_POLYS_AND_SWAP(0, -XLEFTCLIP, -1.0); if (xyz[1]) CLIP_POLYS_AND_SWAP(0, (float)_mgx11c->myxwin->zwidth-XRIGHTCLIP, 1.0); if (xyz[2]) CLIP_POLYS_AND_SWAP(1, -YTOPCLIP, -1.0); if (xyz[3]) CLIP_POLYS_AND_SWAP(1, (float)_mgx11c->myxwin->height-YBOTTOMCLIP, 1.0); if (xyz[4]) CLIP_POLYS_AND_SWAP(2, -ZNEARCLIP, -1.0); if (xyz[5]) CLIP_POLYS_AND_SWAP(2, ZFARCLIP, 1.0); if (aprim == prim2) /* If the vertex data ended up in the local vertex list, then we need to copy it back to the global vertex list */ { prim2->numvts = prim1->numvts; /* for (n=0; n < aprim->numvts; n++) { vts2[n] = vts1[n]; } */ bcopy(vts1, vts2, sizeof(CPoint3) * prim1->numvts); } #ifdef DEBUGCLIP fprintf(stderr, "FINAL POLY:\n"); for (n=0; n < aprim->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts1[n].x, vts1[n].y, vts1[n].z, vts1[n].w, vts1[n].drawnext); } fprintf(stderr, "END-CLIP\n"); #endif return mykind; } geomview-1.9.5/src/lib/mg/x11/mgx11dither.c0000644000175000017500000002002212310110201015114 00000000000000/* * This software is copyrighted as noted below. It may be freely copied, * modified, and redistributed, provided that the copyright notice is * preserved on all copies. * * There is no warranty or other guarantee of fitness for this software, * it is provided solely "as is". Bug reports or fixes may be sent * to the author, who may or may not act on them as he desires. * * You may not include this software in a program or other software product * without supplying the source, or without informing the end-user that the * source is available for no extra charge. * * If you modify this software, you should include a notice giving the * name of the person performing the modification, the date of modification, * and the reason for such modification. * * Modified at BRL 16-May-88 by Mike Muuss to avoid Alliant STDC desire * to have all "void" functions so declared. */ /* * dither.c - Functions for RGB color dithering. * * Author: Spencer W. Thomas * Computer Science Dept. * University of Utah * Date: Mon Feb 2 1987 * Copyright (c) 1987, University of Utah */ #if HAVE_CONFIG_H # include "config.h" #endif #include #ifdef USE_PROTOTYPES void make_square( double ); #else void make_square(); #endif extern unsigned long mgx11colors[216]; int mgx11divN[256]; int mgx11modN[256]; int mgx11magic[16][16]; static int magic4x4[4][4] = { { 0, 14, 3, 13 }, { 11, 5, 8, 6 }, { 12, 2, 15, 1 }, { 7, 9, 4, 10 } }; /* basic dithering macro */ #define DMAP(v,x,y) (mgx11modN[v]>mgx11magic[x][y] ? mgx11divN[v] + 1 : mgx11divN[v]) /***************************************************************** * TAG( dithermap ) * * Create a color dithering map with a specified number of intensity levels. * Inputs: * levels: Intensity levels per primary. * gamma: Display gamma value. * Outputs: * rgbmap: Generated color map. * mgx11divN: "div" function for dithering. * mgx11modN: "mod" function for dithering. * Assumptions: * rgbmap will hold levels^3 entries. * Algorithm: * Compute gamma compensation map. * N = 255.0 / (levels - 1) is number of pixel values per level. * Compute rgbmap with red ramping fastest, green slower, and blue * slowest (treat it as if it were rgbmap[levels][levels][levels][3]). * Call make_square to get mgx11divN, mgx11modN, and magic * * Note: * Call dithergb( x, y, r, g, b, levels, mgx11divN, mgx11modN, magic ) to get index * into rgbmap for a given color/location pair, or use * row = y % 16; col = x % 16; * DMAP(v,col,row) =def (mgx11divN[v] + (mgx11modN[v]>mgx11magic[col][row] ? 1 : 0)) * DMAP(r,col,row) + DMAP(g,col,row)*levels + DMAP(b,col,row)*levels^2 * if you don't want function call overhead. */ void dithermap(int levels, double gamma, int rgbmap[][3]) { double N; int i; int levelsq, levelsc; int gammamap[256]; for ( i = 0; i < 256; i++ ) gammamap[i] = (int)(0.5 + 255 * pow( i / 255.0, 1.0/gamma )); levelsq = levels*levels; /* squared */ levelsc = levels*levelsq; /* and cubed */ N = 255.0 / (levels - 1); /* Get size of each step */ /* * Set up the color map entries. */ for(i = 0; i < levelsc; i++) { rgbmap[i][0] = gammamap[(int)(0.5 + (i%levels) * N)]; rgbmap[i][1] = gammamap[(int)(0.5 + ((i/levels)%levels) * N)]; rgbmap[i][2] = gammamap[(int)(0.5 + ((i/levelsq)%levels) * N)]; } make_square( N ); } /***************************************************************** * TAG( bwdithermap ) * * Create a color dithering map with a specified number of intensity levels. * Inputs: * levels: Intensity levels. * gamma: Display gamma value. * Outputs: * bwmap: Generated black & white map. * mgx11divN: "div" function for dithering. * mgx11modN: "mod" function for dithering. * Assumptions: * bwmap will hold levels entries. * Algorithm: * Compute gamma compensation map. * N = 255.0 / (levels - 1) is number of pixel values per level. * Compute bwmap for levels entries. * Call make_square to get mgx11divN, mgx11modN, and magic. * Note: * Call ditherbw( x, y, val, mgx11divN, mgx11modN, magic ) to get index into * bwmap for a given color/location pair, or use * row = y % 16; col = x % 16; * mgx11divN[val] + (mgx11modN[val]>mgx11magic[col][row] ? 1 : 0) * if you don't want function call overhead. * On a 1-bit display, use * mgx11divN[val] > mgx11magic[col][row] ? 1 : 0 */ void bwdithermap(int levels, double gamma, int bwmap[]) { double N; int i; int gammamap[256]; for ( i = 0; i < 256; i++ ) gammamap[i] = (int)(0.5 + 255 * pow( i / 255.0, 1.0/gamma )); N = 255.0 / (levels - 1); /* Get size of each step */ /* * Set up the color map entries. */ for(i = 0; i < levels; i++) bwmap[i] = gammamap[(int)(0.5 + i * N)]; make_square( N ); } /***************************************************************** * TAG( make_square ) * * Build the magic square for a given number of levels. * Inputs: * N: Pixel values per level (255.0 / levels). * Outputs: * mgx11divN: Integer value of pixval / N * mgx11modN: Integer remainder between pixval and mgx11divN[pixval]*N * magic: Magic square for dithering to N sublevels. * Assumptions: * * Algorithm: * mgx11divN[pixval] = (int)(pixval / N) maps pixval to its appropriate level. * mgx11modN[pixval] = pixval - (int)(N * mgx11divN[pixval]) maps pixval to * its sublevel, and is used in the dithering computation. * The magic square is computed as the (modified) outer product of * a 4x4 magic square with itself. * mgx11magic[4*k + i][4*l + j] = (magic4x4[i][j] + magic4x4[k][l]/16.0) * multiplied by an appropriate factor to get the correct dithering * range. */ void make_square(double N) { int i, j, k, l; double magicfact; for ( i = 0; i < 256; i++ ) { mgx11divN[i] = (int)(i / N); mgx11modN[i] = i - (int)(N * mgx11divN[i]); } mgx11modN[255] = 0; /* always */ /* * Expand 4x4 dither pattern to 16x16. 4x4 leaves obvious patterning, * and doesn't give us full intensity range (only 17 sublevels). * * magicfact is (N - 1)/16 so that we get numbers in the matrix from 0 to * N - 1: mod N gives numbers in 0 to N - 1, don't ever want all * pixels incremented to the next level (this is reserved for the * pixel value with mod N == 0 at the next level). */ magicfact = (N - 1) / 16.; for ( i = 0; i < 4; i++ ) for ( j = 0; j < 4; j++ ) for ( k = 0; k < 4; k++ ) for ( l = 0; l < 4; l++ ) mgx11magic[4*k+i][4*l+j] = (int)(0.5 + magic4x4[i][j] * magicfact + (magic4x4[k][l] / 16.) * magicfact); } /***************************************************************** * TAG( dithergb ) * * Return dithered RGB value. * Inputs: * x: X location on screen of this pixel. * y: Y location on screen of this pixel. * r, g, b: Color at this pixel (0 - 255 range). * levels: Number of levels in this map. * mgx11divN, mgx11modN: From dithermap. * magic: Magic square from dithermap. * Outputs: * Returns color map index for dithered pixelv value. * Assumptions: * mgx11divN, mgx11modN, magic were set up properly. * Algorithm: * see "Note:" in dithermap comment. */ unsigned long dithergb( int x, int y, int *rgb, int levels) { int col = x % 16, row = y % 16; return mgx11colors[DMAP(rgb[0], col, row) + DMAP(rgb[1], col, row) * levels + DMAP(rgb[2], col, row) * levels*levels]; } /***************************************************************** * TAG( ditherbw ) * * Return dithered black & white value. * Inputs: * x: X location on screen of this pixel. * y: Y location on screen of this pixel. * val: Intensity at this pixel (0 - 255 range). * mgx11divN, mgx11modN: From dithermap. * magic: Magic square from dithermap. * Outputs: * Returns color map index for dithered pixel value. * Assumptions: * mgx11divN, mgx11modN, magic were set up properly. * Algorithm: * see "Note:" in bwdithermap comment. */ int ditherbw( int x, int y, int val) { int col = x % 16, row = y % 16; return DMAP(val, col, row); } geomview-1.9.5/src/lib/mg/x11/mgx11draw.c0000644000175000017500000004355612310110201014613 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgx11P.h" #include "polylistP.h" #include "mgx11windows.h" /* Author: Daeron Meyer */ void mgx11_polygon( int nv, HPoint3 *v, int nn, Point3 *n, int nc, ColorA *c ); void mgx11_mesh(int wrap, int nu, int nv, HPoint3 *p, Point3 *n, Point3 *nq, ColorA *c ); void mgx11_line( HPoint3 *p1, HPoint3 *p2 ); void mgx11_polyline( int nv, HPoint3 *verts, int nc, ColorA *colors, int wrap ); void mgx11_polylist( int np, Poly *p, int nv, Vertex *v, int pl_flags ); void mgx11_drawnormal(HPoint3 *p, Point3 *n); void mgx11_closer(); void mgx11_farther(); static ColorA *C2; /*----------------------------------------------------------------------- * Function: mgx11_polygon * Description: draw a polygon * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgx11_polygon(int nv, HPoint3 *V, int nn, Point3 *N, int nc, ColorA *C) { int count; HPoint3 *v; Point3 *n; int flag, ninc, smooth; /* fprintf(stderr,"X11: draw a polygon\n"); */ flag = _mgc->astk->ap.flag; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) nc = 0; ninc = (nn > 1); smooth = IS_SMOOTH(_mgc->astk->ap.shading); /* fprintf(stderr,"cinc = %d, nc = %d, nn = %d\n", cinc, nc, nn); */ if (nc == 0) C = (ColorA*)&_mgc->astk->ap.mat->diffuse; if ((flag & APF_FACEDRAW) && (flag & APF_EDGEDRAW)) { /* put polygon in display list */ if (smooth && (nc > 0)) Xmg_add(MGX_BGNSEPOLY, 0, NULL, NULL); else Xmg_add(MGX_BGNEPOLY, 0, NULL, NULL); Xmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); /* edge color */ Xmg_add(MGX_COLOR, 0, NULL, C); /* face color */ if (smooth) Xmg_add(MGX_CVERTEX, nv, V, C); else Xmg_add(MGX_VERTEX, nv, V, NULL); Xmg_add(MGX_END, 0, NULL, NULL); } else if (flag & APF_FACEDRAW) { /* put polygon in display list */ if (smooth) Xmg_add(MGX_BGNSPOLY, 0, NULL, NULL); else Xmg_add(MGX_BGNPOLY, 0, NULL, NULL); Xmg_add(MGX_COLOR, 0, NULL, C); if (smooth && (nc > 0)) Xmg_add(MGX_CVERTEX, nv, V, C); else Xmg_add(MGX_VERTEX, nv, V, NULL); Xmg_add(MGX_END, 0, NULL, NULL); } else if (flag & APF_EDGEDRAW) { Xmg_add(MGX_BGNLINE, 0, NULL, NULL); Xmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); Xmg_add(MGX_VERTEX, nv, V, NULL); Xmg_add(MGX_VERTEX, 1, V, NULL); Xmg_add(MGX_END, 0, NULL, NULL); } if (flag & APF_NORMALDRAW) { mgx11_closer(); Xmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->normalcolor); for (n = N, v = V, count = 0; count 1) * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgx11_fatpoint(HPoint3 *v) { HPoint3 a; HPoint3 *p, *q; float vw; /* fprintf(stderr,"X11: make a fat-point\n"); */ if (!(_mgc->has & HAS_POINT)) mg_makepoint(); /* Compute w component of point after projection to screen */ vw = v->x * _mgc->O2S[0][3] + v->y * _mgc->O2S[1][3] + v->z * _mgc->O2S[2][3] + v->w * _mgc->O2S[3][3]; if (vw <= 0) return; #define PUT(p) \ a.x = v->x + p->x*vw; a.y = v->y + p->y*vw; \ a.z = v->z + p->z*vw; a.w = v->w + p->w*vw; \ Xmg_add(MGX_VERTEX, 1, &a, NULL); p = VVEC(_mgc->point, HPoint3); q = p + VVCOUNT(_mgc->point); Xmg_add(MGX_BGNPOLY, 0, NULL, NULL); do { PUT(p); } while (++p < q); Xmg_add(MGX_END, 0, NULL, NULL); } /*----------------------------------------------------------------------- * Function: mgx11_polyline * Description: draw a polyline (possibly more than 2 vertices) * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgx11_polyline( int nv, HPoint3 *v, int nc, ColorA *c, int wrapped ) { int remain; /* fprintf(stderr,"X11: draw a polyline\n"); */ if (!(wrapped & 2)) { if (_mgx11c->znudge) mgx11_closer(); } if (nv == 1) { if (nc > 0) Xmg_add(MGX_ECOLOR, 0, NULL, c); if (_mgc->astk->ap.linewidth > 1) { Xmg_add(MGX_COLOR, 0, NULL, c); mgx11_fatpoint(v); } else { Xmg_add(MGX_BGNSLINE, 0, NULL, NULL); Xmg_add(MGX_CVERTEX, 1, v, c); Xmg_add(MGX_END, 0, NULL, NULL); } } else if (nv > 0) { Xmg_add(MGX_BGNSLINE, 0, NULL, NULL); if (wrapped & 1) { if (nc > 0) { Xmg_add(MGX_ECOLOR, 0, NULL, (c + nc - 1)); Xmg_add(MGX_CVERTEX, 1, (v + nv - 1), (c + nc - 1)); } else Xmg_add(MGX_CVERTEX, 1, (v + nv - 1), c); } for (;;) { remain = nv > 254 ? 254 : nv; nv -= remain; do { if (--nc > 0) { Xmg_add(MGX_ECOLOR, 0, NULL, c); Xmg_add(MGX_CVERTEX, 1, v++, c++); } else Xmg_add(MGX_CVERTEX, 1, v++, c); } while (--remain > 0); if (nv == 0) break; if (nc > 0) Xmg_add(MGX_ECOLOR, 0, NULL, c); Xmg_add(MGX_CVERTEX, 1, v, c); Xmg_add(MGX_END, 0, NULL, NULL); Xmg_add(MGX_BGNSLINE, 0, NULL, NULL); } Xmg_add(MGX_END, 0, NULL, NULL); } if (!(wrapped & 4) && _mgx11c->znudge) mgx11_farther(); } /*----------------------------------------------------------------------- * Function: mgx11_polylist * Description: draws a Polylist: collection of Polys * Author: Daeron Meyer * Notes: see mg.doc */ void mgx11_polylist( int np, Poly *_p, int nv, Vertex *V, int pl_flags ) { int i, j; Poly *p; Vertex **v, *vp, **vh; struct mgastk *ma = _mgc->astk; int plflags = pl_flags; int flag, shading; int nonsurf = -1; flag = ma->ap.flag; shading = ma->ap.shading; /* fprintf(stderr,"X11: draw a polylist %d\n",np); */ switch(shading) { case APF_FLAT: plflags &= ~PL_HASVN; if (plflags & PL_HASPCOL) { plflags &= ~PL_HASVCOL; } break; case APF_SMOOTH: plflags &= ~PL_HASPN; break; case APF_VCFLAT: plflags &= ~PL_HASVN; break; default: plflags &= ~(PL_HASVN|PL_HASPN); break; } if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) plflags &= ~(PL_HASVCOL | PL_HASPCOL); if (flag & APF_FACEDRAW) { for (p = _p, i = 0; i < np; i++, p++) { v = p->v; if ((j = p->n_vertices) <= 2) nonsurf = i; else { if (flag & APF_EDGEDRAW) { if (shading == APF_FLAT || shading == APF_CONSTANT) { Xmg_add(MGX_BGNEPOLY, 0, NULL, NULL); } else if (plflags & PL_HASVCOL) { Xmg_add(MGX_BGNSEPOLY, 0, NULL, NULL); } else { Xmg_add(MGX_BGNEPOLY, 0, NULL, NULL); } Xmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); } else { if (shading == APF_FLAT || shading == APF_CONSTANT) { Xmg_add(MGX_BGNPOLY, 0, NULL, NULL); } else if (plflags & PL_HASVCOL) { Xmg_add(MGX_BGNSPOLY, 0, NULL, NULL); } else { Xmg_add(MGX_BGNPOLY, 0, NULL, NULL); } } if (plflags & PL_HASPCOL) Xmg_add(MGX_COLOR, 0, NULL, &p->pcol); else if (plflags & PL_HASVCOL) /* if we have per vertex */ Xmg_add(MGX_COLOR, 0, NULL, &(*v)->vcol); else Xmg_add(MGX_COLOR, 0, NULL, &(ma->ap.mat->diffuse)); vh = v; do { if (plflags & PL_HASVCOL) { Xmg_add(MGX_CVERTEX, 1, &(*v)->pt, &(*v)->vcol); } else { Xmg_add(MGX_CVERTEX, 1, &(*v)->pt, &(*vh)->vcol); } v++; } while (--j > 0); Xmg_add(MGX_END, 0, NULL, NULL); } } } if (flag & (APF_EDGEDRAW | APF_NORMALDRAW) || nonsurf > 0) { if (_mgx11c->znudge) mgx11_closer(); if (flag & APF_EDGEDRAW && !(flag & APF_FACEDRAW)) { Xmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); for (p = _p, i = 0; i < np; i++, p++) { Xmg_add(MGX_BGNLINE, 0, NULL, NULL); for (j = 0, v = p->v; j < p->n_vertices; j++, v++) Xmg_add(MGX_VERTEX, 1, &(*v)->pt, NULL); Xmg_add(MGX_VERTEX, 1, &(*(p->v))->pt, NULL); Xmg_add(MGX_END, 0, NULL, NULL); } } if (flag & APF_NORMALDRAW) { Xmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->normalcolor); if (pl_flags & PL_HASPN) { for (p = _p, i = 0; i < np; i++, p++) { for (j = 0, v = p->v; j < p->n_vertices; j++, v++) mgx11_drawnormal(&(*v)->pt, &p->pn); } } else if (pl_flags & PL_HASVN) { for (vp = V, i = 0; i < nv; i++, vp++) mgx11_drawnormal(&vp->pt, &vp->vn); } } for (p = _p, i = 0; i <= nonsurf; p++, i++) { v = p->v; switch (j = p->n_vertices) { case 1: Xmg_add(MGX_BGNLINE, 0, NULL, NULL); if (pl_flags & PL_HASVCOL) Xmg_add(MGX_ECOLOR, 0, NULL, &(*v)->vcol); Xmg_add(MGX_VERTEX, 1, &(*v)->pt, NULL); Xmg_add(MGX_END, 0, NULL, NULL); break; case 2: Xmg_add(MGX_BGNLINE, 0, NULL, NULL); do { if (pl_flags & PL_HASVCOL) Xmg_add(MGX_ECOLOR, 0, NULL, &(*v)->vcol); Xmg_add(MGX_VERTEX, 1, &(*v)->pt, NULL); v++; } while (--j > 0); Xmg_add(MGX_END, 0, NULL, NULL); break; } } if (_mgx11c->znudge) mgx11_farther(); } } #define HAS_N 1 #define HAS_C 2 #define HAS_SMOOTH 4 /*----------------------------------------------------------------------- * Function: mgx11polymeshrow * Description: draw one row of a mesh * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgx11polymeshrow(int wrap, int has, int off, int count, HPoint3 *P, Point3 *N, ColorA *C, int flag, float *CE, int first) { int k; int edges = flag & APF_EDGEDRAW; int faces = flag & APF_FACEDRAW; if (wrap & MM_UWRAP) { k = count - 1; if (edges && faces) { if (has & HAS_SMOOTH) Xmg_add(MGX_BGNSEPOLY, 0, NULL, NULL); else Xmg_add(MGX_BGNEPOLY, 0, NULL, NULL); Xmg_add(MGX_ECOLOR, 0, NULL, CE); } else if (faces) { if (has & HAS_SMOOTH) Xmg_add(MGX_BGNSPOLY, 0, NULL, NULL); else Xmg_add(MGX_BGNPOLY, 0, NULL, NULL); } else { Xmg_add(MGX_BGNLINE, 0, NULL, NULL); Xmg_add(MGX_ECOLOR, 0, NULL, CE); } if (C) { Xmg_add(MGX_COLOR, 0, NULL, C+off+k); C2 = C+off+k; } else Xmg_add(MGX_COLOR, 0, NULL, C2); if (has & HAS_SMOOTH) { if (C) { Xmg_add(MGX_CVERTEX, 1, P+off+k, C+off+k); Xmg_add(MGX_CVERTEX, 1, P+k, C+k); Xmg_add(MGX_CVERTEX, 1, P, C); Xmg_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C+off; } else { Xmg_add(MGX_CVERTEX, 1, P+off+k, C2); Xmg_add(MGX_CVERTEX, 1, P+k, C2); Xmg_add(MGX_CVERTEX, 1, P, C2); Xmg_add(MGX_CVERTEX, 1, P+off, C2); } } else { Xmg_add(MGX_VERTEX, 1, P+off+k, NULL); Xmg_add(MGX_VERTEX, 1, P+k, NULL); Xmg_add(MGX_VERTEX, 1, P, NULL); Xmg_add(MGX_VERTEX, 1, P+off, NULL); } Xmg_add(MGX_END, 0, NULL, NULL); } k = count; do { if (edges && faces) { if (has & HAS_SMOOTH) Xmg_add(MGX_BGNSEPOLY, 0, NULL, NULL); else Xmg_add(MGX_BGNEPOLY, 0, NULL, NULL); Xmg_add(MGX_ECOLOR, 0, NULL, CE); } else if (faces) { if (has & HAS_SMOOTH) Xmg_add(MGX_BGNSPOLY, 0, NULL, NULL); else Xmg_add(MGX_BGNPOLY, 0, NULL, NULL); } else { Xmg_add(MGX_BGNLINE, 0, NULL, NULL); Xmg_add(MGX_ECOLOR, 0, NULL, CE); /* ADDED */ if (first) Xmg_add(MGX_VERTEX, 1, P+1+off, NULL); /* END */ } if (C) { Xmg_add(MGX_COLOR, 0, NULL, C+off); C2 = C+off; } if (has & HAS_SMOOTH) { if (C) { Xmg_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C; } else Xmg_add(MGX_CVERTEX, 1, P+off, C2); if (C) { Xmg_add(MGX_CVERTEX, 1, P++, C++); C2 = C; } else Xmg_add(MGX_CVERTEX, 1, P++, C2); if (C) { Xmg_add(MGX_CVERTEX, 1, P, C); C2 = C; } else Xmg_add(MGX_CVERTEX, 1, P, C2); if (C) { Xmg_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C; } else Xmg_add(MGX_CVERTEX, 1, P+off, C2); } else { Xmg_add(MGX_VERTEX, 1, P+off, NULL); if (C) C++; if (N) N++; Xmg_add(MGX_VERTEX, 1, P++, NULL); Xmg_add(MGX_VERTEX, 1, P, NULL); Xmg_add(MGX_VERTEX, 1, P+off, NULL); } Xmg_add(MGX_END, 0, NULL, NULL); } while (--k > 1); } /*----------------------------------------------------------------------- * Function: mgx11submesh * Description: divide up mesh and draw by rows * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgx11submesh(int wrap, int nu, int nv, int umin, int umax, int vmin, int vmax, HPoint3 *meshP, Point3 *meshN, ColorA *meshC) { int v; int ucnt; HPoint3 *P; Point3 *N; ColorA *C; int prev; int du; int i; int has; Appearance *ap; if (nu <= 0 || nv <= 0) return; ap = &_mgc->astk->ap; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) meshC = 0; has = 0; if (meshN && !(_mgc->astk->flags & MGASTK_SHADER)) has = HAS_N; if (meshC) has |= HAS_C; if (IS_SMOOTH(ap->shading)) has |= HAS_SMOOTH; if ( ap->flag & (APF_FACEDRAW | APF_EDGEDRAW) ) /* BUG? */ { if (!(has & HAS_C)) Xmg_add(MGX_COLOR, 0, NULL, &ap->mat->diffuse); C2 = (ColorA *) &ap->mat->diffuse; v = vmax - vmin + 1; du = umin + vmin * nu; if (wrap & MM_VWRAP) { prev = nu * (v - 1); } else { du += nu; prev = -nu; v--; } do { P = meshP + du; N = meshN + du; C = meshC + du; ucnt = umax - umin + 1; mgx11polymeshrow(wrap, has, prev, ucnt, P, has & HAS_N ? N : NULL, has & HAS_C ? C : NULL, ap->flag, (float *)&ap->mat->edgecolor, (int)(v!=1)); prev = -nu; du += nu; } while (--v > 0); } if (ap->flag & APF_NORMALDRAW && meshN != NULL) { Xmg_add(MGX_ECOLOR, 0, NULL, &ap->mat->normalcolor); if (_mgx11c->znudge) mgx11_closer(); for (i = nu*nv, P = meshP, N = meshN; --i >= 0; P++, N++) mgx11_drawnormal(P, N); if (_mgx11c->znudge) mgx11_farther(); } } /*----------------------------------------------------------------------- * Function: mgx11_mesh * Description: draw a mesh * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgx11_mesh(int wrap, int nu, int nv, HPoint3 *P, Point3 *N, Point3 *NQ, ColorA *C ) { mgx11submesh( wrap, nu, nv, 0, nu-1, 0, nv-1, P, N, C); } /*-----------------------------------------------------------------------* * end of mesh drawing functions: * *-----------------------------------------------------------------------*/ /* * Z-shift routines: for moving edges closer than faces, etc. */ void mgx11_init_zrange() { _mgx11c->znudge = 1; _mgx11c->znudgeby = 0.0; } void mgx11_closer() { /* _mgx11c->znudgeby = 0.001; */ } void mgx11_farther() { _mgx11c->znudgeby = 0.0; } void mgx11_findcam() { } /* There is a basic problem now with 4-d points and 3-d normal vectors. For now, we'll just ignore the 4-th coordinate of the point when computing the tip of the normal vector. This will work OK with all existing models, but for genuine 4-d points it won't work. But, come to think of it, what is the correct interpretation of the normal vector when the points live in 4-d? */ void mgx11_drawnormal(HPoint3 *p, Point3 *n) { Point3 tp; HPoint3 end; HPt3Coord scale, w, s; /* fprintf(stderr,"X11: draw a normal\n"); */ if (p->w <= 0.0) { return; } if (p->w != 1) { HPt3ToPt3(p, &tp); p = (HPoint3 *)(void *)&tp; } scale = _mgc->astk->ap.nscale; if (_mgc->astk->ap.flag & APF_EVERT) { HPoint3 *cp = &_mgc->cpos; if (!(_mgc->has & HAS_CPOS)) { mg_findcam(); } if ((w = cp->w) != 1.0 && w != 0.0) { s = (p->x*w-cp->x)*n->x + (p->y*w-cp->y)*n->y + (p->z*w-cp->z)*n->z; } else { s = (p->x-cp->x)*n->x + (p->y-cp->y)*n->y + (p->z-cp->z)*n->z; } if (s > 0) { scale = -scale; } } end.x = p->x + scale*n->x; end.y = p->y + scale*n->y; end.z = p->z + scale*n->z; end.w = 1.0; Xmg_add(MGX_BGNLINE, 0, NULL, NULL); Xmg_add(MGX_VERTEX, 1, p, NULL); Xmg_add(MGX_VERTEX, 1, &end, NULL); Xmg_add(MGX_END, 0, NULL, NULL); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mg/x11/mgx11render1.c0000644000175000017500000003010212310110201015175 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Author: Timothy Rowley */ /* {{{ Includes */ #include #include "mgP.h" #include "mgx11P.h" /* }}} */ /* {{{ dither and masking tables */ static unsigned char dither[65][8] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00}, {0x80, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00}, {0x88, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00}, {0x88, 0x00, 0x20, 0x00, 0x88, 0x00, 0x00, 0x00}, {0x88, 0x00, 0x20, 0x00, 0x88, 0x00, 0x02, 0x00}, {0x88, 0x00, 0x20, 0x00, 0x88, 0x00, 0x22, 0x00}, {0x88, 0x00, 0x22, 0x00, 0x88, 0x00, 0x22, 0x00}, {0x88, 0x00, 0xA2, 0x00, 0x88, 0x00, 0x22, 0x00}, {0x88, 0x00, 0xA2, 0x00, 0x88, 0x00, 0x2A, 0x00}, {0x88, 0x00, 0xA2, 0x00, 0x88, 0x00, 0xAA, 0x00}, {0x88, 0x00, 0xAA, 0x00, 0x88, 0x00, 0xAA, 0x00}, {0xA8, 0x00, 0xAA, 0x00, 0x88, 0x00, 0xAA, 0x00}, {0xA8, 0x00, 0xAA, 0x00, 0x8A, 0x00, 0xAA, 0x00}, {0xA8, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00}, {0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00}, {0xAA, 0x40, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00}, {0xAA, 0x40, 0xAA, 0x00, 0xAA, 0x04, 0xAA, 0x00}, {0xAA, 0x40, 0xAA, 0x00, 0xAA, 0x44, 0xAA, 0x00}, {0xAA, 0x44, 0xAA, 0x00, 0xAA, 0x44, 0xAA, 0x00}, {0xAA, 0x44, 0xAA, 0x10, 0xAA, 0x44, 0xAA, 0x00}, {0xAA, 0x44, 0xAA, 0x10, 0xAA, 0x44, 0xAA, 0x01}, {0xAA, 0x44, 0xAA, 0x10, 0xAA, 0x44, 0xAA, 0x11}, {0xAA, 0x44, 0xAA, 0x11, 0xAA, 0x44, 0xAA, 0x11}, {0xAA, 0x44, 0xAA, 0x51, 0xAA, 0x44, 0xAA, 0x11}, {0xAA, 0x44, 0xAA, 0x51, 0xAA, 0x44, 0xAA, 0x15}, {0xAA, 0x44, 0xAA, 0x51, 0xAA, 0x44, 0xAA, 0x55}, {0xAA, 0x44, 0xAA, 0x55, 0xAA, 0x44, 0xAA, 0x55}, {0xAA, 0x54, 0xAA, 0x55, 0xAA, 0x44, 0xAA, 0x55}, {0xAA, 0x54, 0xAA, 0x55, 0xAA, 0x45, 0xAA, 0x55}, {0xAA, 0x54, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55}, {0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55}, {0xAA, 0xD5, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55}, {0xAA, 0xD5, 0xAA, 0x55, 0xAA, 0x5D, 0xAA, 0x55}, {0xAA, 0xD5, 0xAA, 0x55, 0xAA, 0xDD, 0xAA, 0x55}, {0xAA, 0xDD, 0xAA, 0x55, 0xAA, 0xDD, 0xAA, 0x55}, {0xAA, 0xDD, 0xAA, 0x75, 0xAA, 0xDD, 0xAA, 0x55}, {0xAA, 0xDD, 0xAA, 0x75, 0xAA, 0xDD, 0xAA, 0x57}, {0xAA, 0xDD, 0xAA, 0x75, 0xAA, 0xDD, 0xAA, 0x77}, {0xAA, 0xDD, 0xAA, 0x77, 0xAA, 0xDD, 0xAA, 0x77}, {0xAA, 0xDD, 0xAA, 0xF7, 0xAA, 0xDD, 0xAA, 0x77}, {0xAA, 0xDD, 0xAA, 0xF7, 0xAA, 0xDD, 0xAA, 0x7F}, {0xAA, 0xDD, 0xAA, 0xF7, 0xAA, 0xDD, 0xAA, 0xFF}, {0xAA, 0xDD, 0xAA, 0xFF, 0xAA, 0xDD, 0xAA, 0xFF}, {0xAA, 0xFD, 0xAA, 0xFF, 0xAA, 0xDD, 0xAA, 0xFF}, {0xAA, 0xFD, 0xAA, 0xFF, 0xAA, 0xDF, 0xAA, 0xFF}, {0xAA, 0xFD, 0xAA, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF}, {0xAA, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF}, {0xEA, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF}, {0xEA, 0xFF, 0xAA, 0xFF, 0xAE, 0xFF, 0xAA, 0xFF}, {0xEA, 0xFF, 0xAA, 0xFF, 0xEE, 0xFF, 0xAA, 0xFF}, {0xEE, 0xFF, 0xAA, 0xFF, 0xEE, 0xFF, 0xAA, 0xFF}, {0xEE, 0xFF, 0xBA, 0xFF, 0xEE, 0xFF, 0xAA, 0xFF}, {0xEE, 0xFF, 0xBA, 0xFF, 0xEE, 0xFF, 0xAB, 0xFF}, {0xEE, 0xFF, 0xBA, 0xFF, 0xEE, 0xFF, 0xBB, 0xFF}, {0xEE, 0xFF, 0xBB, 0xFF, 0xEE, 0xFF, 0xBB, 0xFF}, {0xEE, 0xFF, 0xFB, 0xFF, 0xEE, 0xFF, 0xBB, 0xFF}, {0xEE, 0xFF, 0xFB, 0xFF, 0xEE, 0xFF, 0xBF, 0xFF}, {0xEE, 0xFF, 0xFB, 0xFF, 0xEE, 0xFF, 0xFF, 0xFF}, {0xEE, 0xFF, 0xFF, 0xFF, 0xEE, 0xFF, 0xFF, 0xFF}, {0xFE, 0xFF, 0xFF, 0xFF, 0xEE, 0xFF, 0xFF, 0xFF}, {0xFE, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF}, {0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, }; static unsigned char bits[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; #if 0 static unsigned char startBits[8] = { 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01}; static unsigned char endBits[8] = { 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF}; #endif /* }}} */ static endPoint *mug=NULL; static int mugSize = 0; static int flipped = 0; static int RGB2gray(int *color) { int n; n = (64.0*(color[0]*0.299 + color[1]*0.587 + color[2]*0.114))/255.0; if (n>64) return 64; else return n; } #if 0 static int RGB2gray2(float r, float g, float b) { int n; n = 64.0*(r*0.299 + g*0.587 + b*0.114); if (n>64) return 64; else return n; } #endif static inline void setZpixel(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int *color) { int x, y; x = p->x; y = p->y; if (p->z < zbuf[y*zwidth+x]) buf[y*width+(x>>3)] = (buf[y*width+(x>>3)] & ~bits[x&0x07]) | (bits[x&0x07] & dither[RGB2gray(color)][y&0x07]); } #ifdef __GNUC__ inline #endif static void setpixel(unsigned char *buf, int zwidth, int width, int height, CPoint3 *p, int *color) { int x, y; x = p->x; y = p->y; buf[y*width+(x>>3)] = (buf[y*width+(x>>3)] & ~bits[x&0x07]) | (bits[x&0x07] & dither[RGB2gray(color)][y&0x07]); } #ifdef __GNUC__ inline #endif static void setPixel(unsigned char *buf, int zwidth, int width, int height, int x, int y, int color) { buf[y*width+(x>>3)] = (buf[y*width+(x>>3)] & ~bits[x&0x07]) | (bits[x&0x07] & dither[color][y&0x07]); } void Xmgr_1init(int blackPixel) { int col, i; if (blackPixel && (!flipped)) { for (col=0; col<65; col++) for (i=0; i<8; i++) dither[col][i] = ~dither[col][i]; flipped = 1; } } void Xmgr_1clear(unsigned char *buf, float *zbuf, int zwidth, int width, int height, int *color, int flag, int fullclear, int xmin, int ymin, int xmax, int ymax) { int i, length, pos, x; int col = RGB2gray(color); if (mug==NULL) { mug = (endPoint *)malloc(sizeof(endPoint)*height); mugSize = height; } if (height>mugSize) { mug = (endPoint *)realloc(mug, sizeof(endPoint)*height); mugSize = height; } if (fullclear) { for (i=0; i> 3; length = (MIN(zwidth-1,xmax)-xmin+8) >> 3; ymin = MAX(ymin,0); ymax = MIN(height-1,ymax); for (i=ymin; i<=ymax; i++) memset(buf+i*width+xmin, dither[col][i&0x07], length); length = MIN(zwidth-1,xmax)-xmin+1; if (flag) for (i=ymin; i<=ymax; i++) { pos = i*zwidth+xmin; for (x=0; x>3] = (ptr[i>>3] & ~bits[i&0x07]) | (bits[i&0x07] & pattern); #define VARIABLES unsigned char *dith = dither[RGB2gray(color)]; \ unsigned char pattern; \ unsigned char *ptr; #include "MGRdolines.h" #define NAME Xmgr_DZdoLines #define ZBUFFER #define YCODE pattern = dith[y&0x07]; ptr=buf+y*width; #define DOPIXEL \ ptr[i>>3] = (ptr[i>>3] & ~bits[i&0x07]) | (bits[i&0x07] & pattern); #define VARIABLES unsigned char *dith = dither[RGB2gray(color)]; \ unsigned char pattern; \ unsigned char *ptr; #include "MGRdolines.h" #define NAME Xmgr_DGdoLines #define GOURAUD #define DOPIXEL setPixel(buf, zwidth, width, height, i, y, r); #include "MGRdolines.h" #define NAME Xmgr_DGZdoLines #define ZBUFFER #define GOURAUD #define DOPIXEL setPixel(buf, zwidth, width, height, i, y, r); #include "MGRdolines.h" void Xmgr_1Dpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_polyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_DdoLines); } void Xmgr_1DZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_Zpolyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_DZdoLines); } void Xmgr_1DGpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_Graypolyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_DGdoLines); } void Xmgr_1DGZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_GrayZpolyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_DGZdoLines); } /* }}} */ /* {{{ multi-line scan conversion */ void Xmgr_1Dpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color) { int i; if (n == 1) { setpixel(buf, zwidth, width, height, p, color); return; } for (i=0; i #include #include #include #include "mgP.h" #include "mgbufP.h" /* }}} */ static endPoint *mug=NULL; static int mugSize = 0; static int rdiv, gdiv, bdiv, rshift, gshift, bshift; #ifdef __GNUC__ inline #endif static int RGBtoVal(int r, int g, int b) { return (((r>>rdiv) << rshift) | ((g>>gdiv) << gshift) | ((b>>bdiv) << bshift)); } static void decompose(int mask, int *div, int *shift) { int i; for (i=0; ((mask>>1)<<1) == mask; i++, mask >>= 1) ; *shift = i; for (i=1; mask>>1; i++, mask >>= 1) ; *div = 8-i; } void Xmgr_16fullinit(int rmask, int gmask, int bmask) { decompose(rmask, &rdiv, &rshift); decompose(gmask, &gdiv, &gshift); decompose(bmask, &bdiv, &bshift); } /* #ifdef __GNUC__ inline #endif static short RGBtoVal(int r, int g, int b) { return ((r>>3)<<11) | ((g>>2)<<5) | (b>>3); } void Xmgr_16fullinit(int rmask, int gmask, int bmask) { redmask = rmask; greenmask = gmask; bluemask = bmask; } */ /* {{{ clearing routine */ void Xmgr_16clear(unsigned char *buf, float *zbuf, int zwidth, int width, int height, int *color, int flag, int fullclear, int xmin, int ymin, int xmax, int ymax) { short *ptr = (short *)buf; int i, end, x, length, pos; short fill; fill = RGBtoVal(color[0], color[1], color[2]); if (mug==NULL) { mug = (endPoint *)malloc(sizeof(endPoint)*height); mugSize = height; } if (height>mugSize) { mug = (endPoint *)realloc(mug, sizeof(endPoint)*height); mugSize = height; } if (fullclear) { end = (width*height)/2; for (i=0; i>1 #define PTR_TYPE short #define PTR_INIT (short *)(buf+y1*width+2*x1) #define WIDEYDOPIXEL ptr[i*ptrIncr+x] = col; #define WIDEXDOPIXEL ptr[y*ptrIncr+i] = col; #define DOPIXEL *ptr = col; #define VARIABLES short col = RGBtoVal(color[0], color[1], color[2]); #include "MGRline.h" #define WIDENAME wideZline #define NAME Xmgr_16Zline #define ZBUFFER #define PTR_INCR width>>1 #define PTR_TYPE short #define PTR_INIT (short *)(buf+y1*width+2*x1) #define WIDEYDOPIXEL ptr[i*ptrIncr+x] = col; #define WIDEXDOPIXEL ptr[y*ptrIncr+i] = col; #define DOPIXEL *ptr = col; #define VARIABLES short col = RGBtoVal(color[0], color[1], color[2]); #include "MGRline.h" #define WIDENAME wideGline #define NAME Xmgr_16Gline #define GOURAUD #define COLOR #define PTR_INCR width>>1 #define PTR_TYPE short #define PTR_INIT (short *)(buf+y1*width+2*x1) #define WIDEYDOPIXEL ptr[i*ptrIncr+x] = RGBtoVal(r,g,b); #define WIDEXDOPIXEL ptr[y*ptrIncr+i] = RGBtoVal(r,g,b); #define DOPIXEL *ptr = RGBtoVal(r,g,b); #include "MGRline.h" #define WIDENAME wideGZline #define NAME Xmgr_16GZline #define ZBUFFER #define GOURAUD #define COLOR #define PTR_INCR width>>1 #define PTR_TYPE short #define PTR_INIT (short *)(buf+y1*width+2*x1) #define WIDEYDOPIXEL ptr[i*ptrIncr+x] = RGBtoVal(r,g,b); #define WIDEXDOPIXEL ptr[y*ptrIncr+i] = RGBtoVal(r,g,b); #define DOPIXEL *ptr = RGBtoVal(r,g,b); #include "MGRline.h" /* }}} */ /* {{{ polygon scan conversion */ #define NAME Xmgr_doLines #define PTR_TYPE short #define PTR_INIT (short *)(buf+width*y+x1*2) #define VARIABLES short col=RGBtoVal(color[0], color[1], color[2]); #define DOPIXEL *ptr = col; #include "MGRdolines.h" #define NAME Xmgr_ZdoLines #define ZBUFFER #define PTR_TYPE short #define PTR_INIT (short *)(buf+width*y+x1*2) #define VARIABLES short col=RGBtoVal(color[0], color[1], color[2]); #define DOPIXEL *ptr = col; #include "MGRdolines.h" #define NAME Xmgr_GdoLines #define GOURAUD #define COLOR #define PTR_TYPE short #define PTR_INIT (short *)(buf+width*y+x1*2) #define DOPIXEL *ptr = RGBtoVal(r,g,b); #include "MGRdolines.h" #define NAME Xmgr_GZdoLines #define ZBUFFER #define GOURAUD #define COLOR #define PTR_TYPE short #define PTR_INIT (short *)(buf+width*y+x1*2) #define DOPIXEL *ptr = RGBtoVal(r,g,b); #include "MGRdolines.h" void Xmgr_16Zpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_Zpolyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_ZdoLines); } void Xmgr_16poly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_polyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_doLines); } void Xmgr_16GZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy) { Xmgr_GZpolyscan(buf, zbuf, zwidth, width, height, p, n, dummy, mug, Xmgr_GZdoLines); } void Xmgr_16Gpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy) { Xmgr_Gpolyscan(buf, zbuf, zwidth, width, height, p, n, dummy, mug, Xmgr_GdoLines); } /* }}} */ /* {{{ multi-line scan conversion */ #ifdef __GNUC__ inline #endif static void setZpixel(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int *color) { if (p->z < zbuf[(int)(p->y)*zwidth+(int)p->x]) ((short *)buf)[(int)(p->y)*(width/2)+(int)p->x] = RGBtoVal(color[0], color[1], color[2]); } #ifdef __GNUC__ inline #endif static void setpixel(unsigned char *buf, int zwidth, int width, int height, CPoint3 *p, int *color) { ((short *)buf)[(int)(p->y)*(width/2)+(int)p->x] = RGBtoVal(color[0], color[1], color[2]); } void Xmgr_16polyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color) { int i; if (n == 1) { setpixel(buf, zwidth, width, height, p, color); return; } for (i=0; i #include #include "mgP.h" #include "mgx11P.h" /* }}} */ /* {{{ externs for dithering and dithering code */ extern int colorlevels; extern int mgx11divN[256]; extern int mgx11modN[256]; extern int mgx11magic[16][16]; extern unsigned long mgx11colors[216]; extern int mgx11multab[256]; #define DMAP(v,x,y) (mgx11modN[v]>mgx11magic[x][y] ? mgx11divN[v] + 1 : mgx11divN[v]) #ifdef __GNUC__ inline #endif static unsigned long ditherRGB(int x, int y, int *color) { int xdith, ydith; xdith = x % 16; ydith = y % 16; return mgx11colors[DMAP(color[0], xdith, ydith) + mgx11multab[DMAP(color[1], xdith, ydith) + mgx11multab[DMAP(color[2], xdith, ydith)]]]; } #ifdef __GNUC__ inline #endif static unsigned long ditherRGBvals(int x, int y, int r, int g, int b) { int xdith, ydith; xdith = x % 16; ydith = y % 16; return mgx11colors[DMAP(r, xdith, ydith) + mgx11multab[DMAP(g, xdith, ydith) + mgx11multab[DMAP(b, xdith, ydith)]]]; } /* }}} */ static endPoint *mug=NULL; static int mugSize = 0; void Xmgr_8clear(unsigned char *buf, float *zbuf, int zwidth, int width, int height, int *color, int flag, int fullclear, int xmin, int ymin, int xmax, int ymax) { int i, length, x, col = ditherRGB(0, 0, color); unsigned char *ptr; int pos; if (mug==NULL) { mug = (endPoint *)malloc(sizeof(endPoint)*height); mugSize = height; } if (height>mugSize) { mug = (endPoint *)realloc(mug, sizeof(endPoint)*height); mugSize = height; } if (fullclear) { memset(buf, col, width*height); if (flag) { x = zwidth*height; for (i=0; ixdith)?rdiv1:rdiv) + \ mgx11multab[((gmod>xdith)?gdiv1:gdiv) + \ mgx11multab[(bmod>xdith)?bdiv1:bdiv]]]; #include "MGRdolines.h" #define NAME Xmgr_ZdoLines #define ZBUFFER #define PTR_TYPE unsigned char #define PTR_INIT buf+width*y+x1 #define VARIABLES unsigned char col=ditherRGB(0,0,color); #define DOPIXEL *ptr = col; #include "MGRdolines.h" #define NAME Xmgr_DZdoLines #define ZBUFFER #define PTR_TYPE unsigned char #define PTR_INIT buf+width*y+x1 #define VARIABLES int rmod, gmod, bmod, rdiv, gdiv, bdiv, \ rdiv1, gdiv1, bdiv1, xdith, *magic; #define INITCODE \ rmod = mgx11modN[color[0]]; rdiv = mgx11divN[color[0]]; rdiv1 = rdiv+1; \ gmod = mgx11modN[color[1]]; gdiv = mgx11divN[color[1]]; gdiv1 = gdiv+1; \ bmod = mgx11modN[color[2]]; bdiv = mgx11divN[color[2]]; bdiv1 = bdiv+1; #define YCODE magic = mgx11magic[y & 0x0F]; #define DOPIXEL xdith = magic[i & 0x0F]; \ *ptr = mgx11colors[((rmod>xdith)?rdiv1:rdiv) + \ mgx11multab[((gmod>xdith)?gdiv1:gdiv) + \ mgx11multab[(bmod>xdith)?bdiv1:bdiv]]]; #include "MGRdolines.h" #define NAME Xmgr_DGdoLines #define GOURAUD #define COLOR #define PTR_TYPE unsigned char #define PTR_INIT buf+width*y+x1 #define VARIABLES int *magic, xdith; #define YCODE magic = mgx11magic[y & 0x0F]; #define DOPIXEL xdith = magic[i & 0x0F]; \ *ptr = mgx11colors[ \ ((mgx11modN[r]>xdith)?(mgx11divN[r]+1):mgx11divN[r]) + \ mgx11multab[((mgx11modN[g]>xdith)?(mgx11divN[g]+1):mgx11divN[g])+ \ mgx11multab[(mgx11modN[b]>xdith)?(mgx11divN[b]+1):mgx11divN[b]]]]; #include "MGRdolines.h" #define NAME Xmgr_DGZdoLines #define ZBUFFER #define GOURAUD #define COLOR #define PTR_TYPE unsigned char #define PTR_INIT buf+width*y+x1 #define VARIABLES int *magic, xdith; #define YCODE magic = mgx11magic[y & 0x0F]; #define DOPIXEL xdith = magic[i & 0x0F]; \ *ptr = mgx11colors[ \ ((mgx11modN[r]>xdith)?(mgx11divN[r]+1):mgx11divN[r]) + \ mgx11multab[((mgx11modN[g]>xdith)?(mgx11divN[g]+1):mgx11divN[g])+ \ mgx11multab[(mgx11modN[b]>xdith)?(mgx11divN[b]+1):mgx11divN[b]]]]; #include "MGRdolines.h" void Xmgr_8DZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_Zpolyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_DZdoLines); } void Xmgr_8Zpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_Zpolyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_ZdoLines); } void Xmgr_8Dpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_polyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_DdoLines); } void Xmgr_8poly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_polyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_doLines); } void Xmgr_8DGZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy) { Xmgr_GZpolyscan(buf, zbuf, zwidth, width, height, p, n, dummy, mug, Xmgr_DGZdoLines); } void Xmgr_8DGpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy) { Xmgr_Gpolyscan(buf, zbuf, zwidth, width, height, p, n, dummy, mug, Xmgr_DGdoLines); } /* }}} */ /* {{{ Multiple line scan-conversion functions */ #ifdef __GNUC__ inline #endif static void setZpixel(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int *color) { if (p->z < zbuf[(int)(p->y)*zwidth+(int)p->x]) buf[(int)(p->y)*width+(int)p->x] = ditherRGB(0, 0, color); } #ifdef __GNUC__ inline #endif static void setpixel(unsigned char *buf, int zwidth, int width, int height, CPoint3 *p, int *color) { buf[(int)(p->y)*width+(int)p->x] = ditherRGB(0, 0, color); } void Xmgr_8polyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color) { int i; if (n == 1) { setpixel(buf, zwidth, width, height, p, color); return; } for (i=0; iap); if (mask & APF_LINEWIDTH) { mgx11_linewidth(ap->linewidth); _mgc->has &= ~HAS_POINT; } if (mask & APF_SHADING) { /* if (ap->shading == APF_SMOOTH) ap->shading = APF_FLAT; bye bye to kludge in non-gouraud shading mgx11 */ if (ma->shader != NULL && IS_SHADED(ap->shading)) { /* Use software shader if one exists and user wants lighting */ ma->flags |= MGASTK_SHADER; } else { /* No software shading, just use raw colors */ ma->flags &= ~MGASTK_SHADER; } } } void mgx11_setshader(mgshadefunc shader) { struct mgastk *ma = _mgc->astk; unsigned short int wasusing = ma->flags & MGASTK_SHADER; ma->shader = shader; if (shader != NULL && IS_SHADED(ma->ap.shading)) { ma->flags |= MGASTK_SHADER; } else { ma->flags &= ~MGASTK_SHADER; } if((ma->flags & MGASTK_SHADER) != wasusing) mgx11_appearance(_mgc->astk, APF_SHADING); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mg/x11/mgx11visual.c0000644000175000017500000000772612310110201015160 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgx11P.h" int mgx11_getvisual( Display *dpy, Visual **mgvis, Colormap *mgcol, int *mgdepth) { static XVisualInfo vTemplate; static XVisualInfo *visualList; unsigned int nplanes = 0; unsigned long planemasks[1]; unsigned long testcols[30]; int mgpriv = 0; int visualsMatched; vTemplate.screen = DefaultScreen(dpy); vTemplate.class = TrueColor; *mgdepth = vTemplate.depth = 24; visualList = XGetVisualInfo(dpy, VisualScreenMask | VisualClassMask | VisualDepthMask, &vTemplate, &visualsMatched); if (visualsMatched == 0) { *mgdepth = vTemplate.depth = 16; visualList = XGetVisualInfo(dpy, VisualScreenMask | VisualClassMask | VisualDepthMask, &vTemplate, &visualsMatched); } if (visualsMatched == 0) { vTemplate.depth = 15; /* But leave mgdepth == 16 (2-byte data) */ visualList = XGetVisualInfo(dpy, VisualScreenMask | VisualClassMask | VisualDepthMask, &vTemplate, &visualsMatched); } if (visualsMatched == 0) { vTemplate.depth = 12; /* Ditto, leave mgdepth == 16 for 2-byte data */ visualList = XGetVisualInfo(dpy, VisualScreenMask | VisualClassMask | VisualDepthMask, &vTemplate, &visualsMatched); } if (visualsMatched == 0) { vTemplate.class = PseudoColor; *mgdepth = vTemplate.depth = 8; visualList = XGetVisualInfo(dpy, VisualScreenMask | VisualClassMask | VisualDepthMask, &vTemplate, &visualsMatched); } if (visualsMatched == 0) { *mgdepth = vTemplate.depth = 1; visualList = XGetVisualInfo(dpy, VisualScreenMask | VisualDepthMask, &vTemplate, &visualsMatched); } if (visualsMatched == 0) return MG_X11VISFAIL; /* Didn't find a useful visual! */ *mgvis = visualList[0].visual; if (*mgdepth == 8) { if (!XAllocColorCells(dpy, DefaultColormapOfScreen(DefaultScreenOfDisplay(dpy)), False, planemasks, nplanes, testcols, (unsigned int)30)) /* there aren't enough colors so use private colormap instead */ mgpriv = 1; else { /* there *are* enough colors in shared colormap */ mgpriv = 0; XFreeColors(dpy, DefaultColormapOfScreen(DefaultScreenOfDisplay(dpy)), testcols, 30, nplanes); } } if (*mgdepth == 16 || *mgdepth == 24) { *mgcol = XCreateColormap(dpy, RootWindow(dpy, DefaultScreen(dpy)), *mgvis, AllocNone); } else if (*mgdepth == 1) *mgcol = DefaultColormapOfScreen(DefaultScreenOfDisplay(dpy)); else if (*mgdepth == 8) { if (!mgpriv) *mgcol = DefaultColormapOfScreen(DefaultScreenOfDisplay(dpy)); else *mgcol = XCreateColormap(dpy, RootWindow(dpy, DefaultScreen(dpy)), *mgvis, AllocNone); } if (mgpriv) return MG_X11VISPRIVATE; else return MG_X11VISSUCCEED; } /*****************************************************************************/ geomview-1.9.5/src/lib/mg/x11/mgx11windows.c0000644000175000017500000007746012310110201015351 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "mgP.h" #include "mgx11P.h" #include "windowP.h" #include "mgx11windows.h" #if HAVE_CONFIG_H # include "config.h" #endif /*#ifdef AIX*/ /*#include "/usr/lpp/X11/Xamples/extensions/lib/XShm.c"*/ /*#endif*/ #define THEIGHT 200 #define TWIDTH 200 #define MAX(a,b) (((a)<(b)) ? b : a) #define MIN(a,b) (((a)<(b)) ? a : b) static mgx11_sort *mgx11sort = NULL; /* global sorting structure */ static Display *mgx11display = NULL; /* global X display pointer */ /* Z-buffer */ static float *mgx11zbuffer = NULL; static int mgx11zsize = 0; /* Dithering stuff ... fun fun fun :-) */ int colorlevels = 5; /* try 125 levels for starters */ /* But can use up to 216 if envariable * GEOMVIEW_COLORLEVELS is 6. */ unsigned long mgx11colors[217]; static XColor mgx11colorcells[217]; static Colormap cmap; int mgx11multab[256]; /* premultiplied table for speed */ /*static ColorA black = {0.0, 0.0, 0.0, 0.0 };*/ static int curwidth = 1; static int shm_message_shown = 0; extern void dithermap(int, double, int [][3]); extern unsigned long dithergb(int, int, int *, int); extern int Xmg_primclip(mgx11prim *aprim); static int globalXError; /* X Error stuff */ /* Function: myXErrorHandler Description: handle error if shared memory is unavailable Author: Tim Rowley */ int myXErrorHandler(Display *d, XErrorEvent *e) { globalXError = 1; return 1; } /* Function: Xmg_setx11display Description: digest info about this display, allocate space for colors Author: Daeron Meyer */ void Xmg_setx11display(Display *dpy) { int rgbmap[216][3], i, cube, colfail = 1; unsigned int nplanes = 0; unsigned long planemasks[1]; char *colorenv; _mgx11c->mgx11display = dpy; if (mgx11display == dpy) return; mgx11display = dpy; if (_mgx11c->bitdepth == 1) /* We are on a black and white screen! */ return; if ((_mgx11c->bitdepth == 24) || (_mgx11c->bitdepth == 16)) /* We are on a TrueColor screen! */ { colorlevels = 0; return; } if((colorenv = getenv("GEOMVIEW_COLORLEVELS")) != NULL) { colorlevels = atoi(colorenv); if(colorlevels > 6) colorlevels = 6; if(colorlevels < 1) colorlevels = 1; } if (_mgx11c->pix) { if (_mgx11c->cmapset) cmap = _mgx11c->cmap; else cmap = XCreateColormap(mgx11display, DefaultRootWindow(mgx11display), DefaultVisual(mgx11display, DefaultScreen(mgx11display)), AllocNone); } else { if (!_mgx11c->cmapset) cmap = DefaultColormapOfScreen(DefaultScreenOfDisplay(mgx11display)); else cmap = _mgx11c->cmap; } while (colfail && colorlevels > 1) { if (XAllocColorCells(dpy, cmap, False, planemasks, nplanes, mgx11colors, (unsigned int)(colorlevels*colorlevels*colorlevels+1))) colfail = 0; else colorlevels--; } if (colfail) { fprintf(stderr, "MG: Couldn't allocate enough colors. Sorry!"); exit(0); } cube = colorlevels * colorlevels * colorlevels; for (i = 0; i <= cube; i++) mgx11colorcells[i].pixel = mgx11colors[i]; dithermap(colorlevels, (double)1.0, rgbmap); for (i = 0; i < cube; i++) { mgx11colorcells[i].red = (unsigned short)(rgbmap[i][0] * 256); mgx11colorcells[i].green = (unsigned short)(rgbmap[i][1] * 256); mgx11colorcells[i].blue = (unsigned short)(rgbmap[i][2] * 256); mgx11colorcells[i].flags = DoRed | DoGreen | DoBlue; } XStoreColors(dpy, cmap, mgx11colorcells, cube + 1); for (i=0; i<256; i++) mgx11multab[i] = colorlevels*i; } /* Function: Xmg_initx11device Description: allocate space for the display list, initialize mgcontext Author: Daeron Meyer */ int Xmg_initx11device() { if (!mgx11sort) { mgx11sort = (mgx11_sort *)malloc(sizeof(mgx11_sort)); mgx11sort->primnum = 1000; VVINIT(mgx11sort->primsort, int, mgx11sort->primnum); vvneeds(&(mgx11sort->primsort), mgx11sort->primnum); VVINIT(mgx11sort->prims, mgx11prim, mgx11sort->primnum); vvneeds(&(mgx11sort->prims), mgx11sort->primnum); mgx11sort->pvertnum = 2024; VVINIT(mgx11sort->pverts, CPoint3, mgx11sort->pvertnum); vvneeds(&(mgx11sort->pverts), mgx11sort->pvertnum); } _mgx11c->mysort = mgx11sort; _mgx11c->myxwin = NULL; _mgx11c->bitdepth = 0; _mgx11c->visual = NULL; _mgx11c->noclear = 0; return 1; } /* Function: Xmg_openwin Description: open a window if we haven't been given one to draw into Author: Daeron Meyer */ int Xmg_openwin(char *id) { mgx11win *current; Display *dpy = 0; unsigned int border_width = 0; int bitmap_pad = 0; XErrorHandler handler; if (!mgx11display) dpy = XOpenDisplay(NULL); /* If we are missing any of these values then allocate them all again. */ /* This protects us from a user who only partially specifies his/her desired X visual/colormap setup to us. */ if (!_mgx11c->visual || !_mgx11c->bitdepth || !_mgx11c->cmapset) { int result = mgx11_getvisual(dpy, &(_mgx11c->visual), &(_mgx11c->cmap), &(_mgx11c->bitdepth)); if (result == MG_X11VISFAIL) { fprintf(stderr, "MG: Couldn't find a 1, 8, 16 or 24 bit visual. Sorry!\n"); exit(0); } _mgx11c->cmapset = 1; /* We should have a colormap now */ if (!mgx11display) Xmg_setx11display(dpy); } if (_mgx11c->myxwin == NULL) _mgx11c->myxwin = (mgx11win *)malloc(sizeof(mgx11win)); current = _mgx11c->myxwin; current->xswa.colormap = _mgx11c->cmap; current->xswa.background_pixel = None; current->xswa.background_pixmap = None; current->xswa.backing_planes = 0; current->xswa.backing_pixel = None; current->window = XCreateWindow(mgx11display, XRootWindow(mgx11display, XDefaultScreen(mgx11display)), 0, 0, TWIDTH, THEIGHT, border_width, _mgx11c->bitdepth, InputOutput, _mgx11c->visual, CWColormap|CWBorderPixel|CWBackPixel|CWBackPixmap, ¤t->xswa); XStoreName(_mgx11c->mgx11display, current->window, id); current->gc = XCreateGC(_mgx11c->mgx11display, current->window, 0, NULL); /* bg_color = BlackPixel(_mgx11c->mgx11display, DefaultScreen(_mgx11c->mgx11display)); XSetBackground(_mgx11c->mgx11display, current->gc, bg_color); */ XMapWindow(_mgx11c->mgx11display, current->window); XClearWindow(_mgx11c->mgx11display, current->window); current->image = NULL; _mgx11c->shm = 0; #ifndef NO_SHM if (XShmQueryExtension(_mgx11c->mgx11display) == True) { current->image = XShmCreateImage(_mgx11c->mgx11display, _mgx11c->visual, _mgx11c->bitdepth, ZPixmap, NULL, &(current->shminf), TWIDTH, THEIGHT); } if (current->image != NULL) { _mgx11c->shm = 1; current->shminf.shmid = shmget(IPC_PRIVATE, current->image->bytes_per_line * current->image->height, IPC_CREAT|0777); current->buf = shmat(current->shminf.shmid, NULL, 0); current->shminf.shmaddr = current->image->data = (char *)current->buf; current->shminf.readOnly = True; globalXError = 0; handler = XSetErrorHandler(myXErrorHandler); XShmAttach(_mgx11c->mgx11display, &(current->shminf)); XSync(_mgx11c->mgx11display, False); XSetErrorHandler(handler); shmctl(current->shminf.shmid, IPC_RMID, 0); if (globalXError == 1) { _mgx11c->shm = 0; shmdt(current->shminf.shmaddr); } } #endif /*has SHM*/ if (_mgx11c->shm == 0) { if (!shm_message_shown) { fprintf(stderr, "Shared memory unavailable, using fallback display method.\n"); shm_message_shown = 1; } switch (_mgx11c->bitdepth) { case 1: case 8: bitmap_pad = 8; break; case 16: bitmap_pad = 16; break; case 24: bitmap_pad = 32; break; default: fprintf(stderr, "Unknown bit depth %d\n", _mgx11c->bitdepth); } current->image = XCreateImage(_mgx11c->mgx11display, _mgx11c->visual, _mgx11c->bitdepth, ZPixmap, 0, NULL, TWIDTH, THEIGHT, bitmap_pad, 0); current->buf = (unsigned char *)malloc(current->image->bytes_per_line * current->image->height); current->image->data = (char *) current->buf; } current->width = current->image->bytes_per_line; current->height = current->image->height; current->zwidth = TWIDTH; if (current->width*current->height > mgx11zsize) { mgx11zsize = current->width*current->height; if (!mgx11zbuffer) mgx11zbuffer = (float *) malloc(sizeof(float)*mgx11zsize); else mgx11zbuffer = (float *) realloc((void *)mgx11zbuffer, sizeof(float)*mgx11zsize); } _mgx11c->sortmethod = MG_ZBUFFER; _mgx11c->dither = 1; _mgx11c->myxwin = current; return 1; } /* Function: Xmg_setparent Description: set parent window for current context Author: Daeron Meyer */ void Xmg_setparent(Window win) { _mgx11c->myxwin->parent = win; } /* Function: Xmg_setwin Description: set window for current context and get colormap if its a pix Author: Daeron Meyer */ void Xmg_setwin(Window win) { mgx11win *current; int toss; int bg_color = BlackPixel(_mgx11c->mgx11display, DefaultScreen(_mgx11c->mgx11display)); if (_mgx11c->myxwin == NULL) _mgx11c->myxwin = (mgx11win *)malloc(sizeof(mgx11win)); _mgx11c->visible = 1; _mgx11c->myxwin->window = win; current = _mgx11c->myxwin; /* if (!_mgx11c->pix) { current->xswa.colormap = DefaultColormap(_mgx11c->mgx11display, DefaultScreen(_mgx11c->mgx11display)); current->xswa.backing_store = Always; current->xswa.bit_gravity = CenterGravity; XChangeWindowAttributes(_mgx11c->mgx11display, current->window, CWBitGravity, &(*current).xswa); } */ current->gc = XCreateGC(_mgx11c->mgx11display, win, 0, NULL); current->image = NULL; Xmg_getwinsize(&toss, &toss, &toss, &toss); XSetForeground(_mgx11c->mgx11display, current->gc, WhitePixel(_mgx11c->mgx11display, DefaultScreen(_mgx11c->mgx11display))); XSetBackground(_mgx11c->mgx11display, current->gc, bg_color); if (!_mgx11c->pix) XClearWindow(_mgx11c->mgx11display, current->window); _mgx11c->sortmethod = MG_ZBUFFER; _mgx11c->dither = 1; _mgx11c->noclear = 0; } /* Function: Xmg_poswin Description: currently nonfunctional... will eventually call callback Author: Daeron Meyer */ void Xmg_poswin(int x1, int y1, int x2, int y2) { } /* Function: Xmg_prefposwin Description: currently nonfunctional... will eventually call callback Author: Daeron Meyer */ void Xmg_prefposwin(int x1, int y1, int x2, int y2) { } /* Function: Xmg_prefposwin Description: resize window if its size isn't locked Author: Daeron Meyer */ void Xmg_sizewin(int x, int y) { if (_mgx11c->sizelock) return; if (!_mgx11c->pix) XResizeWindow(_mgx11c->mgx11display, _mgx11c->myxwin->window, (unsigned int) x, (unsigned int) y); } /* Function: Xmg_minsize Description: nonfunctional Author: Daeron Meyer */ void Xmg_minsize(int x, int y) { } /* ditto */ void Xmg_winconstrain() { } /* ditto */ void Xmg_titlewin(char *name) { } /* Function: Xmg_closewin Description: close window and free shared memory Author: Daeron Meyer, Tim Rowley */ void Xmg_closewin(mgx11win *this) { Display *dpy = _mgx11c->mgx11display; #ifndef NO_SHM if (_mgx11c->shm) { XShmDetach(dpy, &(this->shminf)); shmdt(this->shminf.shmaddr); } #endif /*has SHM*/ XDestroyImage(this->image); } /* Function: Xmg_flush Description: flush connection to X Author: Daeron Meyer */ void Xmg_flush() { XFlush(_mgx11c->mgx11display); } /* Function: Xmg_newdisplaylist Description: initialize display list Author: Daeron Meyer */ void Xmg_newdisplaylist() { _mgx11c->mysort->cprim = 0; _mgx11c->mysort->cvert = 0; _mgx11c->mysort->maxverts = 0; _mgx11c->znudgeby = 0.0; _mgx11c->oxmin = _mgx11c->xmin; _mgx11c->oymin = _mgx11c->ymin; _mgx11c->oxmax = _mgx11c->xmax; _mgx11c->oymax = _mgx11c->ymax; _mgx11c->xmin = _mgx11c->ymin = INT_MAX; _mgx11c->xmax = _mgx11c->ymax = INT_MIN; } /* Function: Xmg_add Description: add a primitive (polygon, vertex, line) to the display list Author: Daeron Meyer */ void Xmg_add(int primtype, int numdata, void *data, void *cdata) { HPoint3 *vt = (HPoint3 *)data; ColorA *colarray = (ColorA *)cdata; float *col = (float *)cdata; CPoint3 *vts; int i; static mgx11prim *prim; static ColorA color; static float average_depth; static int numverts, ecolor[3]; static int maxlinewidth = 0; #if 1 || HACK_THE_CODE_BUT_BETTER_FIX_IT if (!(_mgc->has & HAS_S2O)) { Transform S; WnPosition vp; mg_findS2O(); mg_findO2S(); WnGet(_mgc->win, WN_VIEWPORT, &vp); /* Fix up O2S and S2O matrices. Since the X11 * coordinate system has Y increasing downward, flip it * here, and translate by location of lower left corner * of viewport. */ TmTranslate(S, (double)vp.xmin, (double)vp.ymax, 0.); S[1][1] = -1; /* Invert sign of Y */ TmConcat(_mgc->O2S, S, _mgc->O2S); TmInvert(_mgc->O2S, _mgc->S2O); } #endif switch (primtype) { case MGX_BGNLINE: case MGX_BGNSLINE: average_depth = 0.0; prim = &(VVEC(_mgx11c->mysort->prims, mgx11prim)[_mgx11c->mysort->cprim]); if (primtype == MGX_BGNLINE) prim->mykind = PRIM_LINE; else prim->mykind = PRIM_SLINE; prim->index = _mgx11c->mysort->cvert; prim->depth = -100000; /* very far behind the viewer */ numverts = 0; prim->ecolor[0] = ecolor[0]; prim->ecolor[1] = ecolor[1]; prim->ecolor[2] = ecolor[2]; prim->ewidth = curwidth; if (curwidth > maxlinewidth) maxlinewidth = curwidth; VVEC(_mgx11c->mysort->primsort, int)[_mgx11c->mysort->cprim] = _mgx11c->mysort->cprim; if (!(_mgc->has & HAS_S2O)) { mg_findS2O(); mg_findO2S(); } break; case MGX_BGNEPOLY: case MGX_BGNSEPOLY: if (curwidth > maxlinewidth) maxlinewidth = curwidth; case MGX_BGNPOLY: case MGX_BGNSPOLY: average_depth = 0.0; prim = &(VVEC(_mgx11c->mysort->prims, mgx11prim) [_mgx11c->mysort->cprim]); switch(primtype) { case MGX_BGNPOLY: prim->mykind = PRIM_POLYGON; break; case MGX_BGNSPOLY: prim->mykind = PRIM_SPOLYGON; break; case MGX_BGNEPOLY: prim->mykind = PRIM_EPOLYGON; break; case MGX_BGNSEPOLY: prim->mykind = PRIM_SEPOLYGON; break; } prim->ewidth = curwidth; prim->index = _mgx11c->mysort->cvert; prim->depth = -100000; /* very far behind the viewer */ numverts = 0; VVEC(_mgx11c->mysort->primsort, int)[_mgx11c->mysort->cprim] = _mgx11c->mysort->cprim; if (!(_mgc->has & HAS_S2O)) { mg_findS2O(); mg_findO2S(); } break; case MGX_VERTEX: for (i=0; imysort->pverts, CPoint3)[_mgx11c->mysort->cvert]); HPt3Transform(_mgc->O2S, &(vt[i]), (HPoint3 *) vts); vts->drawnext = 1; vts->vcol = color; _mgx11c->mysort->cvert++; numverts++; if (_mgx11c->mysort->cvert > _mgx11c->mysort->pvertnum) { _mgx11c->mysort->pvertnum*=2; vvneeds(&(_mgx11c->mysort->pverts), _mgx11c->mysort->pvertnum); } if (vts->z > prim->depth) { prim->depth = vts->z; } average_depth += vts->z; } break; case MGX_CVERTEX: for (i=0; imysort->pverts, CPoint3)[_mgx11c->mysort->cvert]); HPt3Transform(_mgc->O2S, &(vt[i]), (HPoint3 *) vts); vts->drawnext = 1; vts->vcol = colarray[i]; _mgx11c->mysort->cvert++; numverts++; if (_mgx11c->mysort->cvert > _mgx11c->mysort->pvertnum) { _mgx11c->mysort->pvertnum*=2; vvneeds(&(_mgx11c->mysort->pverts), _mgx11c->mysort->pvertnum); } if (vts->z > prim->depth) { prim->depth = vts->z; } average_depth += vts->z; } break; case MGX_COLOR: color = colarray[0]; break; case MGX_ECOLOR: ecolor[0] = (int)(255.0 * col[0]); ecolor[1] = (int)(255.0 * col[1]); ecolor[2] = (int)(255.0 * col[2]); break; case MGX_END: prim->numvts = numverts; if (numverts > _mgx11c->mysort->maxverts) _mgx11c->mysort->maxverts = numverts; average_depth += prim->depth; average_depth /= (float)(numverts+1); prim->depth = average_depth; prim->color[0] = (int)(255.0 * color.r); prim->color[1] = (int)(255.0 * color.g); prim->color[2] = (int)(255.0 * color.b); prim->ecolor[0] = ecolor[0]; prim->ecolor[1] = ecolor[1]; prim->ecolor[2] = ecolor[2]; if ((prim->mykind = Xmg_primclip(prim)) == PRIM_INVIS) _mgx11c->mysort->cvert = prim->index; else { _mgx11c->mysort->cvert = prim->index + prim->numvts; _mgx11c->mysort->cprim++; } if (_mgx11c->mysort->cprim > _mgx11c->mysort->primnum) { _mgx11c->mysort->primnum*=2; vvneeds(&(_mgx11c->mysort->prims), _mgx11c->mysort->primnum); vvneeds(&(_mgx11c->mysort->primsort), _mgx11c->mysort->primnum); } _mgx11c->xmax += maxlinewidth; _mgx11c->xmin -= maxlinewidth; _mgx11c->ymax += maxlinewidth; _mgx11c->ymin -= maxlinewidth; maxlinewidth = 0; break; default: fprintf(stderr,"unknown type of primitive.\n"); break; } } /* Function: Xmg_primcomp Description: Depth sort by comparing two primitives in a call from qsort() (painters algorithm, no subdiv of polygons) Author: Daeron Meyer */ int Xmg_primcomp(const void *a, const void *b) { mgx11prim *prim = VVEC(_mgx11c->mysort->prims, mgx11prim); if (prim[*(int*)a].depth < prim[*(int*)b].depth) return 1; else return -1; } /* Function: Xmg_sortdisplaylist Description: Does depth sorting of primitives. Author: Daeron Meyer */ void Xmg_sortdisplaylist() { static int *primp; if (_mgx11c->sortmethod == MG_DEPTH) { primp = VVEC(_mgx11c->mysort->primsort, int); qsort(primp, _mgx11c->mysort->cprim, sizeof(int), &Xmg_primcomp); } } static unsigned int byterev(unsigned int v) { return (v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24); } /* Function: Xmg_showdisplaylist Description: render display list to display Author: Daeron Meyer, Tim Rowley */ void Xmg_showdisplaylist() { CPoint3 *vts; int ref, *primp; mgx11prim *prim, *prim2; Display *dpy = _mgx11c->mgx11display; Drawable win = _mgx11c->myxwin->window; unsigned char *buf = _mgx11c->myxwin->buf; float *zbuf = mgx11zbuffer; int w = _mgx11c->myxwin->width; int h = _mgx11c->myxwin->height; int zwidth = _mgx11c->myxwin->zwidth; GC gc = _mgx11c->myxwin->gc; static int width; static int height; void (*poly)(unsigned char *, float *, int, int, int, CPoint3 *, int, int *); void (*line)(unsigned char *, float *, int, int, int, CPoint3 *, CPoint3 *, int, int *); void (*polyline)(unsigned char *, float *, int, int, int, CPoint3 *, int, int, int *); void (*spolyline)(unsigned char *, float *, int, int, int, CPoint3 *, int, int, int *); void (*spoly)(unsigned char *, float *, int, int, int, CPoint3 *, int, int *); void (*clear)(unsigned char *, float *, int, int, int, int *, int, int, int, int, int, int); int color[3]; int xmin, ymin, xmax, ymax; int wantedzsize; int rmask = _mgx11c->visual->red_mask; int gmask = _mgx11c->visual->green_mask; int bmask = _mgx11c->visual->blue_mask; static int lsb = 1; /* Compare our native byte order to that of the server. * Must we byte-swap images? */ if((*(char *)&lsb != 0) != (XImageByteOrder(_mgx11c->mgx11display) == LSBFirst)) { rmask = byterev(rmask); gmask = byterev(gmask); bmask = byterev(bmask); } /* Choose functions */ if (_mgx11c->bitdepth == 8) { clear = Xmgr_8clear; if (_mgx11c->sortmethod == MG_ZBUFFER) { if (_mgx11c->dither) { poly = Xmgr_8DZpoly; line = Xmgr_8DZline; polyline = Xmgr_8DZpolyline; spolyline = Xmgr_8DGZpolyline; spoly = Xmgr_8DGZpoly; } else { poly = Xmgr_8Zpoly; line = Xmgr_8Zline; spolyline = polyline = Xmgr_8Zpolyline; spoly = Xmgr_8Zpoly; } } else { if (_mgx11c->dither) { poly = Xmgr_8Dpoly; line = Xmgr_8Dline; polyline = Xmgr_8Dpolyline; spolyline = Xmgr_8DGpolyline; spoly = Xmgr_8DGpoly; } else { poly = Xmgr_8poly; line = Xmgr_8line; spolyline = polyline = Xmgr_8polyline; spoly = Xmgr_8poly; } } } else if (_mgx11c->bitdepth == 24) { Xmgr_24fullinit(rmask, gmask, bmask); clear = Xmgr_24clear; if (_mgx11c->sortmethod == MG_ZBUFFER) { poly = Xmgr_24Zpoly; line = Xmgr_24Zline; polyline = Xmgr_24Zpolyline; spolyline = Xmgr_24GZpolyline; spoly = Xmgr_24GZpoly; } else { poly = Xmgr_24poly; line = Xmgr_24line; polyline = Xmgr_24polyline; spolyline = Xmgr_24Gpolyline; spoly = Xmgr_24Gpoly; } } else if (_mgx11c->bitdepth == 16) { Xmgr_16fullinit(rmask, gmask, bmask); clear = Xmgr_16clear; if (_mgx11c->sortmethod == MG_ZBUFFER) { poly = Xmgr_16Zpoly; line = Xmgr_16Zline; polyline = Xmgr_16Zpolyline; spolyline = Xmgr_16GZpolyline; spoly = Xmgr_16GZpoly; } else { poly = Xmgr_16poly; line = Xmgr_16line; polyline = Xmgr_16polyline; spolyline = Xmgr_16Gpolyline; spoly = Xmgr_16Gpoly; } } else if (_mgx11c->bitdepth == 1) { Xmgr_1init(BlackPixel(dpy, DefaultScreen(dpy))); clear = Xmgr_1clear; if (_mgx11c->sortmethod == MG_ZBUFFER) { poly = Xmgr_1DZpoly; line = Xmgr_1DZline; polyline = Xmgr_1DZpolyline; spolyline = Xmgr_1DGZpolyline; spoly = Xmgr_1DGZpoly; } else { poly = Xmgr_1Dpoly; line = Xmgr_1Dline; polyline = Xmgr_1Dpolyline; spolyline = Xmgr_1DGpolyline; spoly = Xmgr_1DGpoly; } } else { fprintf(stderr, "X11(Function Select): Unsupported bit depth %d\n", _mgx11c->bitdepth); return; } if (_mgx11c->sortmethod == MG_ZBUFFER) { wantedzsize = zwidth*h; if (wantedzsize > mgx11zsize) { if (!mgx11zbuffer) zbuf = mgx11zbuffer = (float *)malloc(sizeof(float)*wantedzsize); else zbuf = mgx11zbuffer = (float *)realloc((void *)mgx11zbuffer, sizeof(float)*wantedzsize); mgx11zsize = wantedzsize; } } WnGet(_mgc->win, WN_XSIZE, &width); WnGet(_mgc->win, WN_YSIZE, &height); /* Get dirty rectangle */ if (_mgx11c->xmin < _mgx11c->oxmin) xmin = MIN(width-1,MAX(_mgx11c->xmin,0)); else xmin = MIN(width-1,MAX(_mgx11c->oxmin,0)); if (_mgx11c->ymin < _mgx11c->oymin) ymin = MIN(height-1,MAX(_mgx11c->ymin,0)); else ymin = MIN(height-1,MAX(_mgx11c->oymin,0)); if (_mgx11c->xmax > _mgx11c->oxmax) xmax = MAX(0,MIN(_mgx11c->xmax,width-1)); else xmax = MAX(0,MIN(_mgx11c->oxmax,width-1)); if (_mgx11c->ymax > _mgx11c->oymax) ymax = MAX(0,MIN(_mgx11c->ymax,height-1)); else ymax = MAX(0,MIN(_mgx11c->oymax,height-1)); if (_mgx11c->exposed) { _mgx11c->xmin = _mgx11c->ymin = xmin = ymin = 0; _mgx11c->xmax = xmax = width-1; _mgx11c->ymax = ymax = height-1; _mgx11c->exposed = 0; } if ((_mgc->opts & MGO_INHIBITSWAP) || _mgx11c->noclear) { _mgx11c->xmin = _mgx11c->ymin = xmin = ymin = 0; _mgx11c->xmax = xmax = width-1; _mgx11c->ymax = ymax = height-1; } if (xmin > xmax || ymin > ymax) { /* nothing to be done, just bail out */ return; } color[0] = _mgc->background.r*255.0; color[1] = _mgc->background.g*255.0; color[2] = _mgc->background.b*255.0; if (!_mgx11c->noclear) clear(buf, zbuf, zwidth, w, h, color, (_mgx11c->sortmethod==MG_ZBUFFER), 0, xmin, ymin, xmax, ymax); else _mgx11c->noclear = 0; primp = VVEC(_mgx11c->mysort->primsort, int); prim2 = VVEC(_mgx11c->mysort->prims, mgx11prim); vts = VVEC(_mgx11c->mysort->pverts, CPoint3); for (ref = 0; ref < _mgx11c->mysort->cprim; ref++) { prim = &(prim2[primp[ref]]); switch (prim->mykind) { case PRIM_POLYGON: poly(buf, zbuf, zwidth, w, h, vts+prim->index, prim->numvts, prim->color); break; case PRIM_SPOLYGON: spoly(buf, zbuf, zwidth, w, h, vts+prim->index, prim->numvts, prim->color); break; case PRIM_EPOLYGON: poly(buf, zbuf, zwidth, w, h, vts+prim->index, prim->numvts, prim->color); polyline(buf, zbuf, zwidth, w, h, vts+prim->index, prim->numvts, prim->ewidth, prim->ecolor); if (vts[prim->index+prim->numvts-1].drawnext) line(buf, zbuf, zwidth, w, h, &vts[prim->index+prim->numvts-1], &vts[prim->index], prim->ewidth, prim->ecolor); break; case PRIM_SEPOLYGON: spoly(buf, zbuf, zwidth, w, h, vts+prim->index, prim->numvts, prim->color); polyline(buf, zbuf, zwidth, w, h, vts+prim->index, prim->numvts, prim->ewidth, prim->ecolor); if (vts[prim->index+prim->numvts-1].drawnext) line(buf, zbuf, zwidth, w, h, &vts[prim->index+prim->numvts-1], &vts[prim->index], prim->ewidth, prim->ecolor); break; case PRIM_SLINE: spolyline(buf, zbuf, zwidth, w, h, vts+prim->index, prim->numvts, prim->ewidth, prim->ecolor); break; case PRIM_LINE: polyline(buf, zbuf, zwidth, w, h, vts+prim->index, prim->numvts, prim->ewidth, prim->ecolor); break; case PRIM_INVIS: break; default: break; } } if (!(_mgc->opts & MGO_INHIBITSWAP)) { if (_mgx11c->shm) { XShmPutImage(dpy, win, gc, _mgx11c->myxwin->image, xmin, ymin, xmin, ymin, xmax-xmin+1, ymax-ymin+1, False); } else { XPutImage(dpy, win, gc, _mgx11c->myxwin->image, xmin, ymin, xmin, ymin, xmax-xmin+1, ymax-ymin+1); } } else { _mgx11c->noclear = 1; } Xmg_flush(); } /* Function: Xmg_getwinsize Description: get the new size of the window and reorganize shared memory Author: Daeron Meyer, Tim Rowley */ void Xmg_getwinsize(int *xsize, int *ysize, int *xorig, int *yorig) { Display *dpy = _mgx11c->mgx11display; Window dpyroot; Window Toss; Drawable win; unsigned int width, height, border_width, depth; int xpos, ypos, xold, yold; int bytes_per_line = 0; mgx11win *current=_mgx11c->myxwin; XErrorHandler handler; int bitmap_pad = 0; if(current == NULL) return; win = current->window; /* fprintf(stderr,"X11: Get Window Size\n"); */ if (_mgx11c->visible) { XGetGeometry(dpy, win, &dpyroot, &xpos, &ypos, &width, &height, &border_width, &depth); *xsize = width; *ysize = height; if (_mgx11c->pix) { *xorig = 0; *yorig = 0; } else if (XTranslateCoordinates(dpy, win, dpyroot, 0, height-1, &xpos, &ypos, &Toss)) { *xorig=xpos; *yorig=HeightOfScreen(DefaultScreenOfDisplay(dpy)) - ypos; } else { *xorig = 0; *yorig = 0; } } else { *xsize = 0; *ysize = 0; } WnGet(_mgc->win, WN_XSIZE, &xold); WnGet(_mgc->win, WN_YSIZE, &yold); if (_mgx11c->bitdepth == 0) return; if ((xold != (int)width) || (yold != (int)height) || (_mgx11c->myxwin->image == NULL)) { if (_mgx11c->myxwin->image != NULL) { #ifndef NO_SHM if (_mgx11c->shm) { XShmDetach(dpy, &(_mgx11c->myxwin->shminf)); shmdt(_mgx11c->myxwin->shminf.shmaddr); } #endif /*has SHM*/ XDestroyImage(_mgx11c->myxwin->image); } current->image = NULL; _mgx11c->shm = 0; #ifndef NO_SHM if (XShmQueryExtension(_mgx11c->mgx11display) == True) { current->image = XShmCreateImage(_mgx11c->mgx11display, _mgx11c->visual, _mgx11c->bitdepth, ZPixmap, NULL, &(current->shminf), width, height); bytes_per_line = current->image->bytes_per_line; } if (current->image != NULL) { _mgx11c->shm = 1; /* fprintf(stderr, "X11: shm creating image with depth = %d visual = %p bit_pre_pixel=%d\n", _mgx11c->bitdepth, _mgx11c->visual, current->image->bits_per_pixel); */ current->shminf.shmid = shmget(IPC_PRIVATE, bytes_per_line * height, IPC_CREAT|0777); current->buf = shmat(current->shminf.shmid, NULL, 0); current->shminf.shmaddr = current->image->data = (char *) current->buf; current->shminf.readOnly = True; globalXError = 0; handler = XSetErrorHandler(myXErrorHandler); XShmAttach(_mgx11c->mgx11display, &(current->shminf)); XSync(_mgx11c->mgx11display, False); XSetErrorHandler(handler); shmctl(current->shminf.shmid, IPC_RMID, 0); if (globalXError == 1) { _mgx11c->shm = 0; shmdt(current->shminf.shmaddr); } } #endif /*has SHM*/ if (_mgx11c->shm == 0) { if (!shm_message_shown) { fprintf(stderr, "Shared memory unavailable, using fallback display method.\n"); shm_message_shown = 1; } switch (_mgx11c->bitdepth) { case 1: case 8: bitmap_pad = 8; break; case 16: bitmap_pad = 16; break; case 24: bitmap_pad = 32; break; default: fprintf(stderr, "Unknown bit depth %d\n", _mgx11c->bitdepth); } current->image = XCreateImage(_mgx11c->mgx11display, _mgx11c->visual, _mgx11c->bitdepth, ZPixmap, 0, NULL, width, height, bitmap_pad, 0); if((bytes_per_line = current->image->bytes_per_line) == 0) { int bpp = _mgx11c->bitdepth == 24 ? 32 : _mgx11c->bitdepth; bytes_per_line = ((bpp * width + 31) >> 5) << 2; } current->buf = (unsigned char *) malloc(bytes_per_line * height); current->image->data = (char *)current->buf; } current->width = bytes_per_line; current->height = height; _mgx11c->myxwin->zwidth = width; _mgx11c->exposed = 1; } } /* Function: mgx11_nearestRGB Description: dither RGB pixel at x,y to color index from our colormap Author: Daeron Meyer */ unsigned long mgx11_nearestRGB(int x, int y, int *rgb) { if (!colorlevels) /* handle TrueColor case */ return (unsigned long)0; return dithergb(x, y, rgb, colorlevels); } /* Function: mgx11_RGB Description: get index of color nearest to RGB value, in colormap Author: Daeron Meyer */ unsigned long mgx11_RGB(int r, int g, int b) { int col[3]; if (!colorlevels) /* handle TrueColor case */ return (unsigned long)0; col[0] = r; col[1] = g; col[2] = b; return dithergb(0, 0, col, colorlevels); } /* Function: mgx11_setRGB Description: use reserved colorcell for smooth dynamic color changing. For instance, this function is relied on by the Color Panel in Geomview. Author: Daeron Meyer */ unsigned long mgx11_setRGB(int r, int g, int b) { int cell = colorlevels * colorlevels * colorlevels; if (!colorlevels) /* handle TrueColor case */ return (unsigned long)0; mgx11colorcells[cell].red = (unsigned short)(r * 256); mgx11colorcells[cell].green = (unsigned short)(g * 256); mgx11colorcells[cell].blue = (unsigned short)(b * 256); mgx11colorcells[cell].flags = DoRed | DoGreen | DoBlue; XStoreColor(mgx11display, cmap, &(mgx11colorcells[cell])); return mgx11colors[cell]; } /* Function: mgx11_linewidth Description: set current linewidth Author: Daeron Meyer */ void mgx11_linewidth(short width) { curwidth = (int) width; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mg/x11/mgx11.h0000644000175000017500000000366612310110201013740 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #include #define MG_X11WINID 101 /* for passing an X window id */ #define MG_X11PARENT 102 /* for passing an X parent window id */ #define MG_X11DISPLAY 103 /* for passing an X display id */ #define MG_X11VISIBLE 104 /* window visible */ #define MG_X11SIZELOCK 105 /* for locking size of window */ #define MG_X11DELETE 106 /* callback for window deletion */ #define MG_X11PIXID 107 /* for passing an X pixmap id */ #define MG_X11VISUAL 108 /* for visual */ #define MG_X11EXPOSE 109 /* expose event */ #define MG_X11COLORMAP 110 /* for passing colormap */ extern mgcontext *mgx11_findctx( Window ); extern unsigned long mgx11_RGB(int, int, int); extern unsigned long mgx11_setRGB(int, int, int); extern int mgx11_getvisual( Display *, Visual **, Colormap *, int * ); /* return values from mgx11_getvisual: */ #define MG_X11VISFAIL 0 /* Failed to find a reasonable visual */ #define MG_X11VISSUCCEED 1 /* Succeeded in finding a reasonable visual */ #define MG_X11VISPRIVATE 2 /* Succeeded + Visual needs a priv colormap */ geomview-1.9.5/src/lib/mg/x11/mgx11P.h0000644000175000017500000001203012310110201014041 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #include #include #ifndef NO_SHM #include #include #include #endif /*!NO_SHM*/ #include "mgx11.h" typedef struct { Pt3Coord x, y, z, w; /* Point coordinates */ ColorA vcol; /* Color of vertex */ int drawnext; /* draw the next line segment? */ } CPoint3; #include "mgbufrender.h" #include "mgx11render1.h" #include "mgx11render8.h" #include "mgx11render16.h" #include "mgbufrender24.h" typedef struct _mgx11win { int mgwinid;/* mg window id */ Window window; /* real X window structure */ Window parent; /* parent X windows */ XImage *image; /* image for double buffering */ unsigned char *buf; /* convience ptr */ int width, height; /* actual size of shm seg */ int zwidth; GC gc; /* real X graphics context */ XSizeHints xsh; /* X size hints */ XWindowAttributes xwa; /* X window attributes */ XSetWindowAttributes xswa; XEvent event; /* X event structure for window */ struct _mgx11win *next; /* next in list */ #ifndef NO_SHM XShmSegmentInfo shminf; /* book-keeping for shm */ #endif } mgx11win; /* Display List Structure */ /*****************************************************************************/ typedef struct _mgx11prim { int mykind; /* kind of primitive */ int index; /* index into array of vertices */ int numvts; /* number of vertices */ float depth; /* z value for sorting (at least for now) */ int color[3]; /* rgb color of polygon */ int ecolor[3]; /* edge color of polygon */ int ewidth; /* edge width */ } mgx11prim; typedef struct _mgx11_sort { vvec primsort; /* pointers to mgx11prim array elements*/ vvec prims; /* array of mgx11prim structures */ int primnum; /* number of primitives */ int cprim; /* current primitive being stored */ vvec pverts; /* array of vertices */ int pvertnum; int cvert; /* current vertex being stored */ int maxverts; /* maximum number of vertices */ } mgx11_sort; #define MGX_NULL 0 #define MGX_END 0 #define MGX_BGNLINE 1 #define MGX_BGNPOLY 2 #define MGX_BGNEPOLY 3 #define MGX_BGNSLINE 4 #define MGX_BGNSPOLY 5 #define MGX_BGNSEPOLY 6 #define MGX_VERTEX 7 #define MGX_CVERTEX 8 #define MGX_COLOR 9 #define MGX_ECOLOR 10 #define PRIM_LINE 1 #define PRIM_POLYGON 2 #define PRIM_EPOLYGON 3 #define PRIM_SLINE 4 /* smooth shaded primitives */ #define PRIM_SPOLYGON 5 #define PRIM_SEPOLYGON 6 #define PRIM_INVIS 7 /* End of Display List Structure */ /*****************************************************************************/ typedef struct mgx11context { struct mgcontext mgctx; /* The mgcontext */ int visible; /* has window been displayed on screen yet? */ int win; /* 1 if window is created */ int pix; /* 1 is window is a pixmap */ int znudge; /* znudge for drawing lines closer */ float znudgeby; /* how much of a nudge ? */ long znear, zfar; /* Current Z-buffer limits */ enum sortmethod sortmethod; /* MG_NONE, MG_DEPTH, MG_ZBUFFER */ int dither; /* Should we dither? */ int bitdepth; /* what bit depth ... 24, 8, or 1? */ Visual *visual; /* visual for window */ int shm; /* Do we use shared memory? */ int xmin, xmax, ymin, ymax; int oxmin, oxmax, oymin, oymax; int exposed; int noclear; vvec room; /* Scratch space */ Display *mgx11display; /* pointer to X-display */ Colormap cmap; /* Our colormap */ int cmapset; /* is colormap set or not? */ mgx11win *myxwin; /* pointer to mgx11window structure */ mgx11_sort *mysort; /* sorting structure */ int sizelock; /* for prohibiting size change from within mg when the cam window is part of a larger hierarchy of windows as with Widgets */ void (*deleted)(Window); /* callback for when I'm deleted */ /* pass back parent window */ } mgx11context; #define MAXZNUDGE 8 /* Max depth of mgx11_closer()/farther() */ #define _mgx11c ((mgx11context*)_mgc) geomview-1.9.5/src/lib/mg/x11/mgx11render1.h0000644000175000017500000000500312310110201015204 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Author: Timothy Rowley */ #ifndef MGX11RENDER1 #define MGX11RENDER1 void Xmgr_1init(int blackPixel); void Xmgr_1clear(unsigned char *buf, float *zbuf, int zwidth, int width, int height, int *color, int flag, int fullclear, int xmin, int ymin, int xmax, int ymax ); void Xmgr_1Dpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color); void Xmgr_1Dpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_1Dline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p0, CPoint3 *p1, int lwidth, int *color); void Xmgr_1DZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color); void Xmgr_1DZpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_1DGpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_1DGZpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_1DZline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p0, CPoint3 *p1, int lwidth, int *color); void Xmgr_1DGZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy); void Xmgr_1DGpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy); #endif geomview-1.9.5/src/lib/mg/x11/mgx11render16.h0000644000175000017500000000474412310110201015305 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Author: Timothy Rowley */ #ifndef MGBUFRENDER16 #define MGBUFRENDER16 void Xmgr_16fullinit(int rmask, int gmask, int bmask); void Xmgr_16clear(unsigned char *buf, float *zbuf, int zwidth, int width, int height, int *color, int flag, int fullclear, int xmin, int ymin, int xmax, int ymax); void Xmgr_16poly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color); void Xmgr_16polyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_16line(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p0, CPoint3 *p1, int lwidth, int *color); void Xmgr_16Zpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color); void Xmgr_16Zpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_16GZpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_16Gpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_16Zline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p0, CPoint3 *p1, int lwidth, int *color); void Xmgr_16GZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy); void Xmgr_16Gpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy); #endif geomview-1.9.5/src/lib/mg/x11/mgx11render8.h0000644000175000017500000000630512310110201015221 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Author: Timothy Rowley */ #ifndef MGX11RENDER8 #define MGX11RENDER8 void Xmgr_8clear(unsigned char *buf, float *zbuf, int zwidth, int width, int height, int *color, int flag, int fullclear, int xmin, int ymin, int xmax, int ymax); void Xmgr_8poly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color); void Xmgr_8polyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_8line(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p0, CPoint3 *p1, int lwidth, int *color); void Xmgr_8Zpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color); void Xmgr_8Zpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_8Zline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p0, CPoint3 *p1, int lwidth, int *color); void Xmgr_8Dpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color); void Xmgr_8Dpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_8Dline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p0, CPoint3 *p1, int lwidth, int *color); void Xmgr_8DZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color); void Xmgr_8DZpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_8DGpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_8DGZpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_8DZline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p0, CPoint3 *p1, int lwidth, int *color); void Xmgr_8DGZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy); void Xmgr_8DGpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy); #endif geomview-1.9.5/src/lib/mg/x11/mgx11shade.h0000644000175000017500000000200312310110201014725 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* There's no need to declare anything here. */ geomview-1.9.5/src/lib/mg/x11/mgx11windows.h0000644000175000017500000000316612310110201015346 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ extern void Xmg_setx11display(Display *dpy); extern int Xmg_initx11device( void ); extern void Xmg_initzrange( void ); extern int Xmg_openwin( char * ); extern void Xmg_setwin( Window ); extern void Xmg_setparent( Window ); extern void Xmg_poswin(int, int, int, int); extern void Xmg_prefposwin(int, int, int, int); extern void Xmg_sizewin(int, int); extern void Xmg_minsize(int, int); extern void Xmg_winconstrain(); extern void Xmg_titlewin(char *); extern void Xmg_closewin( mgx11win * ); extern void Xmg_flush( void ); extern void Xmg_newdisplaylist( void ); extern void Xmg_sortdisplaylist( void ); extern void Xmg_add(int, int, void *, void *); extern void Xmg_showdisplaylist( void ); extern void Xmg_getwinsize( int *, int *, int *, int * ); geomview-1.9.5/src/lib/mg/x11/Headers0000644000175000017500000000013312310110201014112 00000000000000mgx11.h mgx11P.h mgx11render1.h mgx11render16.h mgx11render8.h mgx11shade.h mgx11windows.h geomview-1.9.5/src/lib/mib/0000755000175000017500000000000012310165603012452 500000000000000geomview-1.9.5/src/lib/mib/Makefile.in0000644000175000017500000005017212310165555014452 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/mib DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libmib_a_AR = $(AR) $(ARFLAGS) libmib_a_LIBADD = am_libmib_a_OBJECTS = mibButton.$(OBJEXT) mibDrawArea.$(OBJEXT) \ mibFrame.$(OBJEXT) mibLabel.$(OBJEXT) mibList.$(OBJEXT) \ mibload.$(OBJEXT) mibMenu.$(OBJEXT) mibRadioBox.$(OBJEXT) \ mibScale.$(OBJEXT) mibScrollBar.$(OBJEXT) mibTextBig.$(OBJEXT) \ mibTextBox.$(OBJEXT) mibToggle.$(OBJEXT) libmib_a_OBJECTS = $(am_libmib_a_OBJECTS) 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) 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 = LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libmib_a_SOURCES) DIST_SOURCES = $(libmib_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) $(MOTIFINCLUDE) $(X_CFLAGS) EXTRA_DIST = Headers noinst_LIBRARIES = libmib.a libmib_a_SOURCES = \ mibButton.c mibDrawArea.c mibFrame.c mibLabel.c mibList.c mibload.c mibMenu.c mibRadioBox.c mibScale.c mibScrollBar.c mibTextBig.c mibTextBox.c mibToggle.c \ mibload.h mibwidgets.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/mib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/mib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libmib.a: $(libmib_a_OBJECTS) $(libmib_a_DEPENDENCIES) $(EXTRA_libmib_a_DEPENDENCIES) $(AM_V_at)-rm -f libmib.a $(AM_V_AR)$(libmib_a_AR) libmib.a $(libmib_a_OBJECTS) $(libmib_a_LIBADD) $(AM_V_at)$(RANLIB) libmib.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibButton.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibDrawArea.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibFrame.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibLabel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibList.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibRadioBox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibScale.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibScrollBar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibTextBig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibTextBox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibToggle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibload.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/mib/Makefile.am0000644000175000017500000000050012310110201014401 00000000000000INCLUDES = $(default_includes) $(MOTIFINCLUDE) $(X_CFLAGS) EXTRA_DIST = Headers noinst_LIBRARIES = libmib.a libmib_a_SOURCES = \ mibButton.c mibDrawArea.c mibFrame.c mibLabel.c mibList.c mibload.c mibMenu.c mibRadioBox.c mibScale.c mibScrollBar.c mibTextBig.c mibTextBox.c mibToggle.c \ mibload.h mibwidgets.h geomview-1.9.5/src/lib/mib/mibButton.c0000644000175000017500000001127412310110201014466 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; /* Code for Button */ /*****************************************************************************/ mib_Widget *mib_create_Button(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_Button *myres; /* unsigned char *label_text; */ XmString label_text; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_Button *)malloc(sizeof(mib_Button)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(7); sprintf(temp->mib_class,"Button"); temp->mib_class_num = MIB_BUTTON; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; if (mib_fill == WDEFAULT) { myres->label = (char *)malloc(strlen(label)+1); strcpy(myres->label,label); } /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { label_text = XmStringCreateLtoR(label, XmSTRING_DEFAULT_CHARSET); XtSetArg (args[n], XmNlabelString, label_text); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNhighlightThickness, 0); n++; temp->me = XtCreateManagedWidget(name, xmPushButtonWidgetClass, temp->parent->me, args, n); if (mib_fill == WDEFAULT) { XmStringFree(label_text); } if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_Button(mib_Widget *this) { mib_Button *temp = (mib_Button *)this->myres; free(temp->label); free(temp); } void mib_save_Button(mib_Widget *this, FILE *fout) { mib_Button *temp = (mib_Button *)this->myres; fprintf(fout,"label: \\\"%s\\\"\\n\\\n", temp->label); } void mib_code_gen_Button(mib_Widget *this, FILE *fout) { } int mib_load_Button(mib_Widget *this, mib_Buffer *fin) { mib_Button *myres; /* unsigned char *label_text; */ XmString label_text; char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; Arg args[20]; int n, got_line, vallen; myres = (mib_Button *)this->myres; got_line = mib_read_line(fin, res, val); if (!got_line) return 0; if (!strcmp(res,"label")) { vallen = strlen(val); if (vallen < 2) return 0; val[vallen-1] = '\0'; myres->label = (char *)malloc(vallen-1); sprintf(myres->label,"%s",&(val[1])); label_text = XmStringCreateLtoR(myres->label, XmSTRING_DEFAULT_CHARSET); n = 0; XtSetArg (args[n], XmNlabelString, label_text); n++; XtSetValues(this->me, args, n); XmStringFree(label_text); } else return 0; got_line = mib_read_line(fin, res, val); if (!got_line) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.5/src/lib/mib/mibDrawArea.c0000644000175000017500000000714312310110201014701 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; /* Code for DrawingArea */ /*****************************************************************************/ mib_Widget *mib_create_DrawingArea(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_DrawingArea *myres; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_DrawingArea *)malloc(sizeof(mib_DrawingArea)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(12); sprintf(temp->mib_class,"DrawingArea"); temp->mib_class_num = MIB_DRAWINGAREA; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; myres->nothing = 0; /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNbackground, WhitePixel(dpy, DefaultScreen(dpy))); n++; XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNhighlightThickness, 0); n++; temp->me = XtCreateManagedWidget(name, xmDrawingAreaWidgetClass, temp->parent->me, args, n); if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_DrawingArea(mib_Widget *this) { mib_DrawingArea *temp = (mib_DrawingArea *)this->myres; free(temp); } void mib_save_DrawingArea(mib_Widget *this, FILE *fout) { } int mib_load_DrawingArea(mib_Widget *this, mib_Buffer *fin) { char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.5/src/lib/mib/mibFrame.c0000644000175000017500000001142612310110201014244 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; /* Code for Frames */ /*****************************************************************************/ mib_Widget *mib_create_Frame(mib_Widget *parent, char *name, char *frame_type, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_Frame *myres; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_Frame *)malloc(sizeof(mib_Frame)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(6); sprintf(temp->mib_class,"Frame"); temp->mib_class_num = MIB_FRAME; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; myres->shadowtype = 0; /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; if (mib_fill == WDEFAULT) { if (!strcmp("InFrame",frame_type)) { XtSetArg (args[n], XmNshadowType, XmSHADOW_IN); n++; } else if (!strcmp("OutFrame",frame_type)) { XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++; myres->shadowtype = 1; } else if (!strcmp("EtchedInFrame",frame_type)) { XtSetArg (args[n], XmNshadowType, XmSHADOW_ETCHED_IN); n++; myres->shadowtype = 2; } else if (!strcmp("EtchedOutFrame",frame_type)) { XtSetArg (args[n], XmNshadowType, XmSHADOW_ETCHED_OUT); n++; myres->shadowtype = 3; } } temp->me = XtCreateManagedWidget(name, xmFrameWidgetClass, temp->parent->me, args, n); if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_Frame(mib_Widget *this) { mib_Frame *temp = (mib_Frame *)this->myres; free(temp); } void mib_save_Frame(mib_Widget *this, FILE *fout) { mib_Frame *temp = (mib_Frame *)this->myres; fprintf(fout,"shadowtype: %d\\n\\\n", temp->shadowtype); } int mib_load_Frame(mib_Widget *this, mib_Buffer *fin) { mib_Frame *myres; char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; Arg args[5]; int n; myres = (mib_Frame *)this->myres; if (!mib_read_line(fin, res, val)) return 0; if (!strcmp(res,"shadowtype")) { sscanf(val,"%d",&(myres->shadowtype)); n = 0; switch (myres->shadowtype) { case 0: XtSetArg (args[n], XmNshadowType, XmSHADOW_IN); n++; break; case 1: XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++; break; case 2: XtSetArg (args[n], XmNshadowType, XmSHADOW_ETCHED_IN); n++; break; case 3: XtSetArg (args[n], XmNshadowType, XmSHADOW_ETCHED_OUT); n++; break; default: break; } XtSetValues(this->me, args, n); } else return 0; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.5/src/lib/mib/mibLabel.c0000644000175000017500000001116212310110201014226 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; /* Code for Label */ /*****************************************************************************/ mib_Widget *mib_create_Label(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_Label *myres; /* unsigned char *label_text; */ XmString label_text; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_Label *)malloc(sizeof(mib_Label)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(6); sprintf(temp->mib_class,"Label"); temp->mib_class_num = MIB_LABEL; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; if (mib_fill == WDEFAULT) { myres->label = (char *)malloc(strlen(label)+1); strcpy(myres->label,label); } /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { label_text = XmStringCreateLtoR(label, XmSTRING_DEFAULT_CHARSET); XtSetArg (args[n], XmNlabelString, label_text); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNhighlightThickness, 0); n++; temp->me = XtCreateManagedWidget(name, xmLabelWidgetClass, temp->parent->me, args, n); if (mib_fill == WDEFAULT) XmStringFree(label_text); if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_Label(mib_Widget *this) { mib_Label *temp = (mib_Label *)this->myres; free(temp->label); free(temp); } void mib_save_Label(mib_Widget *this, FILE *fout) { mib_Label *temp = (mib_Label *)this->myres; fprintf(fout,"label: \\\"%s\\\"\\n\\\n", temp->label); } int mib_load_Label(mib_Widget *this, mib_Buffer *fin) { mib_Label *myres; /*unsigned char *label_text;*/ XmString label_text; char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; Arg args[5]; int n, vallen; myres = (mib_Label *)this->myres; while (mib_read_line(fin, res, val)) { if (!strcmp(res,"label")) { vallen = strlen(val); if (vallen < 2) return 0; val[vallen-1] = '\0'; myres->label = (char *)malloc(vallen-1); sprintf(myres->label,"%s",&(val[1])); label_text = XmStringCreateLtoR(myres->label, XmSTRING_DEFAULT_CHARSET); n = 0; XtSetArg (args[n], XmNlabelString, label_text); n++; XtSetValues(this->me, args, n); XmStringFree(label_text); } else if (!strcmp(res, "alignment")) { int align = atoi(val); XtVaSetValues(this->me, XmNalignment, align, NULL); } else if (!strcmp(res, "EndWidget")) { return 1; } else { return 0; } } return 0; } geomview-1.9.5/src/lib/mib/mibList.c0000644000175000017500000001113212310110201014117 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; static Widget real_list; /* Code for Lists */ /*****************************************************************************/ mib_Widget *mib_create_List(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_List *myres; Widget wtemp; /*unsigned char *label_text;*/ XmString label_text; char ttext[30]; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_List *)malloc(sizeof(mib_List)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(5); sprintf(temp->mib_class,"List"); temp->mib_class_num = MIB_LIST; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy); n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNshadowType, XmSHADOW_ETCHED_IN); n++; temp->me = XtCreateManagedWidget(name, xmFrameWidgetClass, temp->parent->me, args, n); n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNhighlightThickness, 0); n++; XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNorientation, XmVERTICAL); n++; if (mib_fill == WEMPTY) { XtSetArg (args[n], XmNlistSizePolicy, XmRESIZE_IF_POSSIBLE); n++; } wtemp = XmCreateScrolledList(temp->me, name, args, n); myres->real_list = wtemp; real_list = wtemp; XtManageChild(wtemp); if (mib_fill != WEMPTY) real_list = NULL; if (mib_fill == WEDIT || mib_fill == WDEFAULT) { label_text = XmStringCreateLtoR("Simple", XmSTRING_DEFAULT_CHARSET); XmListAddItem(wtemp, label_text, 0); XmStringFree(label_text); label_text = XmStringCreateLtoR("List", XmSTRING_DEFAULT_CHARSET); XmListAddItem(wtemp, label_text, 0); XmStringFree(label_text); for (n=0;n<200;n++) { sprintf(ttext,"Item %d ",n); label_text = XmStringCreateLtoR(ttext, XmSTRING_DEFAULT_CHARSET); XmListAddItem(wtemp, label_text, 0); XmStringFree(label_text); } mib_apply_eventhandlers(temp->me, temp); mib_apply_eventhandlers(wtemp, temp); } return temp; } void mib_delete_List(mib_Widget *this) { mib_List *temp = (mib_List *)this->myres; free(temp); } void mib_save_List(mib_Widget *this, FILE *fout) { } int mib_load_List(mib_Widget *this, mib_Buffer *fin) { char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; if (real_list) this->me = real_list; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.5/src/lib/mib/mibload.c0000644000175000017500000005257612310110201014144 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" mib_Widget *mib_root_Widget; Display *dpy; GC mib_gc; static struct _mib_event_handle_funcs { void (*mib_pick_mib_Widget)(/* Widget, XtPointer, XButtonPressedEvent *, Boolean * */); void (*mib_move_mib_Widget)(/* Widget, XtPointer, XPointerMovedEvent *, Boolean * */); void (*mib_unpick_mib_Widget)(/* Widget, XtPointer, XButtonReleasedEvent *, Boolean * */); } mib_events; mib_widget_funcs mwfuncs[] = { { NULL, NULL, NULL, NULL, NULL }, { "TextBox", mib_create_TextBox, mib_delete_TextBox, mib_save_TextBox, mib_load_TextBox}, { "Button", mib_create_Button, mib_delete_Button, mib_save_Button, mib_load_Button}, { "Toggle", mib_create_Toggle, mib_delete_Toggle, mib_save_Toggle, mib_load_Toggle}, { "RadioBox", mib_create_RadioBox, mib_delete_RadioBox, mib_save_RadioBox, mib_load_RadioBox}, { "DrawingArea", mib_create_DrawingArea, mib_delete_DrawingArea, mib_save_DrawingArea, mib_load_DrawingArea}, { "Label", mib_create_Label, mib_delete_Label, mib_save_Label, mib_load_Label}, { "Frame", mib_create_Frame, mib_delete_Frame, mib_save_Frame, mib_load_Frame}, { "ScrollBar", mib_create_ScrollBar, mib_delete_ScrollBar, mib_save_ScrollBar, mib_load_ScrollBar}, { "TextBig", mib_create_TextBig, mib_delete_TextBig, mib_save_TextBig, mib_load_TextBig}, { "List", mib_create_List, mib_delete_List, mib_save_List, mib_load_List}, { "Scale", mib_create_Scale, mib_delete_Scale, mib_save_Scale, mib_load_Scale}, { "Menu", mib_create_Menu, mib_delete_Menu, mib_save_Menu, mib_load_Menu}, { NULL, NULL, NULL, NULL, NULL }, }; /*****************************************************************************/ void mib_add_mib_Widget(mib_Widget *this, mib_Widget *parent) { mib_Widget *tmp; if (parent->child == NULL) { parent->child = this; this->prev = parent; this->parent = parent; this->sibling = NULL; this->child = NULL; } else { tmp = parent->child; while (tmp->sibling != NULL) tmp = tmp->sibling; tmp->sibling = this; this->prev = tmp; this->parent = parent; this->sibling = NULL; this->child = NULL; } } /*****************************************************************************/ void mib_add_backward(mib_Widget *this, mib_Widget *parent) { mib_Widget *tmp; if (parent->child == NULL) { parent->child = this; this->prev = parent; this->parent = parent; this->sibling = NULL; this->child = NULL; } else { tmp = parent->child; parent->child = this; this->prev = parent; this->parent = parent; this->sibling = tmp; this->child = NULL; tmp->prev = this; } } /*****************************************************************************/ void mib_remove_mib_Widget(mib_Widget *this) { XtVaSetValues(mib_root_Widget->me, XmNresizePolicy, XmRESIZE_NONE, NULL); XtDestroyWidget(this->me); while (this->child != NULL) mib_remove_mib_Widget(this->child); if (this->parent == this) { mib_clear_myres(this); return; } if (this->prev == this->parent) { this->parent->child = this->sibling; if (this->sibling != NULL) this->sibling->prev = this->parent; } else { this->prev->sibling = this->sibling; if (this->sibling != NULL) this->sibling->prev = this->prev; } mib_clear_myres(this); } /*****************************************************************************/ void mib_clear_myres(mib_Widget *this) { free(this->mib_class); free(this->name); if ((this->mib_class_num < 1) || (this->mib_class_num > MI_NUMCLASSES)) return; mwfuncs[this->mib_class_num].mib_delete(this); free(this); } /*****************************************************************************/ mib_Widget *mib_new_mib_Widget() { mib_Widget *this; this = (mib_Widget *)malloc(sizeof(mib_Widget)); this->me = NULL; this->mib_class_num = MIB_NULL; this->mib_selected = 0; this->mib_resizing = 0; this->myres = NULL; this->parent = NULL; this->sibling = NULL; this->prev = NULL; this->child = NULL; this->width = 0; this->height = 0; this->topAttachment = 0; this->bottomAttachment = 0; this->leftAttachment = 0; this->rightAttachment = 0; this->topOffset = 0; this->bottomOffset = 0; this->leftOffset = 0; this->rightOffset = 0; return this; } /*****************************************************************************/ mib_Widget *mib_find_name(mib_Widget *temp, char *name) { mib_Widget *child = temp->child; mib_Widget *ret = NULL; if (!strcmp(temp->name, name)) return temp; if (child != NULL) if ((ret = mib_find_name(child, name))) return ret; child = temp->sibling; if (child != NULL) if ((ret = mib_find_name(child, name))) return ret; return NULL; } /*****************************************************************************/ Widget BuildMenu(Widget parent, int menu_type, char *menu_title, char menu_mnemonic, MenuItem *items) { Widget menu, cascade = NULL, widget; int i; XmString str; if (menu_type == XmMENU_PULLDOWN || menu_type == XmMENU_OPTION) menu = XmCreatePulldownMenu(parent, "_pulldown", NULL, 0); else if (menu_type == XmMENU_POPUP) menu = XmCreatePopupMenu(parent, "_popup", NULL, 0); else { XtWarning("Invalid menu type passed to BuildMenu()"); return NULL; } /* Pulldown menus require a cascade button to be made */ if (menu_type == XmMENU_PULLDOWN) { int i; char bname[24]; XtVaGetValues(parent, XmNnumChildren, &i, NULL); sprintf(bname, "button_%d", i); str = XmStringCreateSimple(menu_title); cascade = XtVaCreateManagedWidget(bname, xmCascadeButtonGadgetClass, parent, XmNsubMenuId, menu, XmNlabelString, str, XmNmnemonic, (XID)menu_mnemonic, NULL); XmStringFree(str); } else if (menu_type == XmMENU_OPTION) { /* Option menus are a special case, but not hard to handle */ Arg args[2]; str = XmStringCreateSimple(menu_title); XtSetArg(args[0], XmNsubMenuId, menu); XtSetArg(args[1], XmNlabelString, str); /* This really isn't a cascade, but this is the widget handle * we're going to return at the end of the function. */ cascade = XmCreateOptionMenu(parent, menu_title, args, 2); XmStringFree(str); } /* Now add the menu items */ for (i = 0; items[i].label != NULL; i++) { /* If subitems exist, create the pull-right menu by calling this * function recursively. Since the function returns a cascade * button, the widget returned is used.. */ if (items[i].subitems) if (menu_type == XmMENU_OPTION) { widget = XtVaCreateManagedWidget(items[i].label, *items[i].class, menu, NULL); items[i].subitems = (struct _menu_item *) widget; /* daeron mod (tm) :-) ... we now use this to pass back each widget we create to the mibMenu functions so that it can be stored as part of the mibMenu structure */ /* XtWarning("You can't have submenus from option menu items."); continue;*/ } else widget = BuildMenu(menu, XmMENU_PULLDOWN, items[i].label, items[i].mnemonic, items[i].subitems); else { widget = XtVaCreateManagedWidget(items[i].label, *items[i].class, menu, NULL); /* ditto here from above ... - Daeron mod (tm) */ items[i].subitems = (struct _menu_item *) widget; } /* Whether the item is a real item or a cascade button with a * menu, it can still have a mnemonic. */ if (items[i].mnemonic) XtVaSetValues(widget, XmNmnemonic, (XID)items[i].mnemonic, NULL); /* any item can have an accelerator, except cascade menus. But, * we don't worry about that; we know better in our declarations. */ if (items[i].accelerator) { str = XmStringCreateSimple(items[i].accel_text); XtVaSetValues(widget, XmNaccelerator, items[i].accelerator, XmNacceleratorText, str, NULL); XmStringFree(str); } if (items[i].callback) XtAddCallback(widget, (items[i].class == &xmToggleButtonWidgetClass || items[i].class == &xmToggleButtonGadgetClass)? XmNvalueChangedCallback : /* ToggleButton class */ XmNactivateCallback, /* PushButton class */ items[i].callback, items[i].callback_data); } /* for popup menus, just return the menu; pulldown menus, return * the cascade button; option menus, return the thing returned * from XmCreateOptionMenu(). This isn't a menu, or a cascade button! */ return menu_type == XmMENU_POPUP? menu : cascade; } /*****************************************************************************/ mib_Widget *mib_load_interface(Widget parent, char *from, int file_type) { mib_Buffer thisfile; mib_Widget *this; FILE *infile; char *instring; char ch; thisfile.buf_type = file_type; dpy = XtDisplay(parent); if ((file_type == MI_FROMFILE) || (file_type == MI_EDITFROMFILE)) { if (!(infile = fopen(from,"r"))) return NULL; ch = '\0'; while ((ch != '\n')&&(!feof(infile))) /* throw away first line */ ch = (char)fgetc(infile); thisfile.buffer = (void *)infile; thisfile.point = 0; if (!mib_load_Root(parent, &this, &thisfile)) { /* delete this */ return NULL; } else { fclose(infile); return this; } } else if ((file_type == MI_FROMSTRING) || (file_type == MI_EDITFROMSTRING)) { instring = from; if (instring == NULL) return NULL; thisfile.buffer = (void *)instring; thisfile.buflen = strlen(instring); thisfile.point = 0; if (!mib_load_Root(parent, &this, &thisfile)) { /* delete this */ return NULL; } else return this; } else return NULL; } /*****************************************************************************/ int mib_load_mib_class(mib_Widget **this, mib_Widget *parent, char *name, char *iname, mib_Buffer *fin ) { int namelen, editstate, count; if ((fin->buf_type == MI_EDITFROMFILE) || (fin->buf_type == MI_EDITFROMSTRING)) editstate = WEDIT; else editstate = WEMPTY; namelen = strlen(name); if (namelen < 2) return 0; name[namelen-1] = '\0'; name[0] = ' '; count = 1; while (mwfuncs[count].name) { if (!strcmp(&(name[1]), mwfuncs[count].name)) { *this = mwfuncs[count].mib_create(parent, iname, NULL, 0, 0, 0, 0, editstate); return 1; } count++; } (*this)->parent = (*this); return 1; } /*****************************************************************************/ mib_Widget *mib_load_public(mib_Widget *root, mib_Widget *this, mib_Buffer *fin) { int got_line, done; char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; char valcp[MI_MAXSTRLEN]; Arg args[20]; int mynum, n; got_line = 1; done = 0; /* this loop reads basic info about Widget */ while (got_line && (!done)) { got_line = mib_read_line(fin, res, val); if (!strcmp(res,"Ref")) sscanf(val, "%d", &mynum); else if (!strcmp(res,"Widget")) { strcpy(valcp,val); done = 1; } } done = 0; while (got_line && (!done)) { got_line = mib_read_line(fin, res, val); if (!strcmp(res, "Children")) n = 0; else if (!strcmp(res, "Parent")) /* don't support complete widget tree yet */ n = 0; else if (!strcmp(res,"Public-")) n = 0; else if (!strcmp(res,"Name")) { val[strlen(val)-1] = '\0'; mib_load_mib_class(&this, root, valcp, &(val[1]), fin); this->name = (char *)malloc(strlen(val)); sprintf(this->name,"%s",&(val[1])); this->mib_mynum = mynum; done = 1; } else return 0; } if (!got_line) return NULL; done = 0; /* second loop reads public info */ while (got_line && (!done)) { got_line = mib_read_line(fin, res, val); if (!strcmp(res,"Xmwidth")) sscanf(val,"%d",&(this->width)); else if (!strcmp(res,"Xmheight")) sscanf(val,"%d",&(this->height)); else if (!strcmp(res,"XmtopAttachment")) sscanf(val,"%d",&(this->topAttachment)); else if (!strcmp(res,"XmbottomAttachment")) sscanf(val,"%d",&(this->bottomAttachment)); else if (!strcmp(res,"XmleftAttachment")) sscanf(val,"%d",&(this->leftAttachment)); else if (!strcmp(res,"XmrightAttachment")) sscanf(val,"%d",&(this->rightAttachment)); else if (!strcmp(res,"XmtopOffset")) sscanf(val,"%d",&(this->topOffset)); else if (!strcmp(res,"XmbottomOffset")) sscanf(val,"%d",&(this->bottomOffset)); else if (!strcmp(res,"XmleftOffset")) sscanf(val,"%d",&(this->leftOffset)); else if (!strcmp(res,"XmrightOffset")) sscanf(val,"%d",&(this->rightOffset)); else if (!strcmp(res,"Private-")) done = 1; } n = 0; if ((fin->buf_type == MI_EDITFROMFILE) || (fin->buf_type == MI_EDITFROMSTRING)) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, this->leftOffset); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, this->topOffset); n++; if (this == root) { XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNrightOffset, this->rightOffset); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNbottomOffset, this->bottomOffset); n++; } } else { if (this->leftAttachment) { XtSetArg (args[n], XmNleftAttachment, this->leftAttachment); n++; if(this->leftAttachment == XmATTACH_FORM) XtSetArg (args[n], XmNleftOffset, this->leftOffset); else XtSetArg (args[n], XmNleftPosition, this->leftOffset*100/root->width); n++; } if (this->topAttachment) { XtSetArg (args[n], XmNtopAttachment, this->topAttachment); n++; if(this->topAttachment == XmATTACH_FORM) XtSetArg (args[n], XmNtopOffset, this->topOffset); else XtSetArg (args[n], XmNtopPosition, this->topOffset*100/root->height); n++; } if (this->bottomAttachment) { XtSetArg (args[n], XmNbottomAttachment, this->bottomAttachment); n++; if(this->bottomAttachment == XmATTACH_FORM) XtSetArg (args[n], XmNbottomOffset, this->bottomOffset); else XtSetArg (args[n], XmNbottomPosition, 100-this->bottomOffset*100/root->height); n++; } if (this->rightAttachment) { XtSetArg (args[n], XmNrightAttachment, this->rightAttachment); n++; if(this->rightAttachment == XmATTACH_FORM) XtSetArg (args[n], XmNrightOffset, this->rightOffset); else XtSetArg (args[n], XmNrightPosition, 100-this->rightOffset*100/root->width); n++; } } /* Do not set the width or height, if zero. The core widget will compute appropriately. */ if ( this->width ) { XtSetArg (args[n], XmNwidth, this->width); n++; } if ( this->height ) { XtSetArg (args[n], XmNheight, this->height); n++; } XtSetValues(this->me, args, n); return this; } /*****************************************************************************/ int mib_load_private(mib_Widget *this, mib_Buffer *fin) { if (this->mib_class_num == MIB_NULL) return 1; if ((this->mib_class_num < 1) || (this->mib_class_num > MI_NUMCLASSES)) return 0; mwfuncs[this->mib_class_num].mib_load(this, fin); return 1; } /*****************************************************************************/ int mib_load_Root(Widget parent, mib_Widget **this, mib_Buffer *fin) { char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; int num_widgets, count; Arg args[20]; XGCValues gcvals; XtGCMask val_mask; mib_Widget *temp = NULL; int rubberPositioning = False; mib_read_line(fin, res, val); if (!strcmp(res,"TotalWidgets")) sscanf(val, "%d", &num_widgets); else return 0; (*this) = mib_new_mib_Widget(); (*this)->mib_class = (char*)malloc(9); sprintf((*this)->mib_class,"RootForm"); XtVaGetValues(parent, XmNrubberPositioning, &rubberPositioning, NULL); (*this)->me = XmCreateForm(parent, "MainForm", args, 0); if (!mib_load_public((*this), (*this), fin)) return 0; /* we don't expect any private resources for the root widget */ mib_read_line(fin, res, val); if (strcmp(res,"EndWidget.")) return 0; XtManageChild((*this)->me); XtVaSetValues((*this)->me, XmNresizePolicy, XmRESIZE_NONE, XmNrubberPositioning, rubberPositioning, XmNresizable, rubberPositioning, NULL); count = num_widgets - 1; while (count > 0) { if (!(temp = mib_load_public((*this), temp, fin))) { /* delete temp */ return 0; } if (!mib_load_private(temp,fin)) { /* delete temp */ return 0; } count--; } mib_reset_size((*this)); XtVaSetValues((*this)->me, XmNresizePolicy, XmRESIZE_ANY, NULL); val_mask = (long)0; mib_gc = XtGetGC((*this)->me, val_mask, &gcvals); return 1; } /*****************************************************************************/ int mib_read_line(mib_Buffer *bufin, char *res, char *val) { FILE *fin; char *strin; char ch; int count, mark; char inbuf[MI_MAXSTRLEN]; if ((bufin->buf_type == MI_FROMFILE) || (bufin->buf_type == MI_EDITFROMFILE)) { fin = (FILE *)bufin->buffer; ch = '\0'; count = 0; mark = 0; while ((ch != '\n')&&(!feof(fin))&&(count 0) { if (inbuf[count-1] == 'n') inbuf[count-1] = '\0'; } else return 0; } else if ((bufin->buf_type == MI_FROMSTRING) || (bufin->buf_type == MI_EDITFROMSTRING)) { strin = (char *)bufin->buffer; count = bufin->point; mark = 0; if (count >= bufin->buflen) return 0; while ((strin[count] != '\n') && (count < bufin->buflen)) { if ((mark == 0) && (strin[count] == ':')) mark = count; count++; } strin[count] = '\0'; if (count >= bufin->buflen) return 0; sprintf(inbuf,"%s",&(strin[bufin->point])); strin[count] = '\n'; if (mark != 0) mark -= bufin->point; bufin->point = count+1; } else return 0; if (mark == 0) { sprintf(res,"%s",inbuf); #if 0 sprintf(val,"\0"); /* ???? */ #else val[0] = '\0'; val[1] = '\0'; #endif } else { inbuf[mark] = '\0'; sprintf(res,"%s",inbuf); inbuf[mark] = ' '; if (strlen(inbuf)-mark > 1) sprintf(val,"%s",&(inbuf[mark+2])); else #if 0 sprintf(val,"\0"); #else { val[0] = '\0'; val[1] = '\0'; } #endif } return 1; } /*****************************************************************************/ void mib_reset_size(mib_Widget *temp) { Arg args[5]; int n; mib_Widget *child = temp->child; if (temp->mib_class_num != MIB_NULL) { n = 0; /* Do not set the width or height, if zero. The core widget will compute appropriately. */ if (temp->width) { XtSetArg (args[n], XmNwidth, temp->width); n++; } if (temp->height) { XtSetArg (args[n], XmNheight, temp->height); n++; } XtSetValues(temp->me, args, n); } if (child != NULL) mib_reset_size(child); child = temp->sibling; if (child != NULL) mib_reset_size(child); } /*****************************************************************************/ void mib_set_eventhandlers(void (*a)(), void (*b)(), void (*c)()) { mib_events.mib_pick_mib_Widget = (void (*)())a; mib_events.mib_move_mib_Widget = (void (*)())b; mib_events.mib_unpick_mib_Widget = (void (*)())c; } /*****************************************************************************/ void mib_apply_eventhandlers(Widget this, mib_Widget *actual) { XtAddEventHandler(this, ButtonPressMask, FALSE, mib_events.mib_pick_mib_Widget, (XtPointer)actual); XtAddEventHandler(this, Button3MotionMask, FALSE, mib_events.mib_move_mib_Widget, (XtPointer)actual); XtAddEventHandler(this, ButtonReleaseMask, FALSE, mib_events.mib_unpick_mib_Widget, (XtPointer)actual); } /*****************************************************************************/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/mib/mibMenu.c0000644000175000017500000001664712310110201014130 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; static int delhandler; /* delay adding event handler until menu is actually created */ /* Code for Menu */ /*****************************************************************************/ mib_Widget *mib_create_Menu(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_Menu *myres; Widget wtemp; char label_temp[50]; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_Menu *)malloc(sizeof(mib_Menu)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(8); sprintf(temp->mib_class,"Menu"); temp->mib_class_num = MIB_MENU; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 0; /* initialize private resources */ temp->myres = (void *)myres; myres->numitems = 0; /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; temp->me = XtCreateManagedWidget(name, xmRowColumnWidgetClass, temp->parent->me, args, n); n = 0; delhandler = 1; if (mib_fill == WDEFAULT) { delhandler = 0; myres->numitems = 3; myres->my_menu = (MenuItem *)malloc(sizeof(MenuItem) * (myres->numitems+1)); myres->items = (Widget *)malloc(sizeof(Widget) * myres->numitems); sprintf(label_temp, "Item 1"); myres->my_menu[0].label = (char *)malloc(strlen(label_temp)+1); strcpy(myres->my_menu[0].label,label_temp); myres->my_menu[0].class = &xmPushButtonGadgetClass; myres->my_menu[0].mnemonic = '1'; myres->my_menu[0].accelerator = NULL; myres->my_menu[0].accel_text = NULL; myres->my_menu[0].accel_text = NULL; myres->my_menu[0].callback = NULL; myres->my_menu[0].callback_data = NULL; myres->my_menu[0].subitems = (struct _menu_item *)1; sprintf(label_temp, "Item 2"); myres->my_menu[1].label = (char *)malloc(strlen(label_temp)+1); strcpy(myres->my_menu[1].label,label_temp); myres->my_menu[1].class = &xmPushButtonGadgetClass; myres->my_menu[1].mnemonic = '2'; myres->my_menu[1].accelerator = NULL; myres->my_menu[1].accel_text = NULL; myres->my_menu[1].accel_text = NULL; myres->my_menu[1].callback = NULL; myres->my_menu[1].callback_data = NULL; myres->my_menu[1].subitems = (struct _menu_item *)1; sprintf(label_temp, "Item 3"); myres->my_menu[2].label = (char *)malloc(strlen(label_temp)+1); strcpy(myres->my_menu[2].label,label_temp); myres->my_menu[2].class = &xmPushButtonGadgetClass; myres->my_menu[2].mnemonic = '2'; myres->my_menu[2].accelerator = NULL; myres->my_menu[2].accel_text = NULL; myres->my_menu[2].accel_text = NULL; myres->my_menu[2].callback = NULL; myres->my_menu[2].callback_data = NULL; myres->my_menu[2].subitems = (struct _menu_item *)1; myres->my_menu[3].label = NULL; wtemp = BuildMenu(temp->me, XmMENU_OPTION, "", 'M', myres->my_menu); XtManageChild(wtemp); } if (mib_fill == WEDIT || mib_fill == WDEFAULT) { /* default menu */ if (!delhandler) { mib_apply_eventhandlers(wtemp, temp); mib_apply_eventhandlers(temp->me, temp); } } if (mib_fill == WEMPTY) delhandler = 0; return temp; } void mib_delete_Menu(mib_Widget *this) { mib_Menu *temp = (mib_Menu *)this->myres; free(temp); } void mib_save_Menu(mib_Widget *this, FILE *fout) { mib_Menu *temp = (mib_Menu *)this->myres; int count; fprintf(fout, "numitems: %d\\n\\\n", temp->numitems); for (count=0; count < temp->numitems; count++) { fprintf(fout, "item: \\\"%s\\\"\\n\\\n", temp->my_menu[count].label); } } int mib_load_Menu(mib_Widget *this, mib_Buffer *fin) { char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; int count, vallen; Widget wtemp; mib_Menu *myres = (mib_Menu *)this->myres; if (!mib_read_line(fin, res, val)) return 0; if (!strcmp(res, "numitems")) { myres->numitems = 0; sscanf(val, "%d", &(myres->numitems)); if (!(myres->numitems)) return 0; myres->my_menu = (MenuItem *)malloc(sizeof(MenuItem) * (myres->numitems+1)); myres->items = (Widget *)malloc(sizeof(Widget) * myres->numitems); for (count = 0; count < myres->numitems; count++) { if (!mib_read_line(fin, res, val)) return 0; vallen = strlen(val); if (vallen < 2) return 0; val[vallen-1] = '\0'; myres->my_menu[count].label = (char *)malloc(vallen-1); sprintf(myres->my_menu[count].label, "%s", &(val[1])); myres->my_menu[count].class = &xmPushButtonGadgetClass; myres->my_menu[count].mnemonic = '\0'; myres->my_menu[count].accelerator = NULL; myres->my_menu[count].accel_text = NULL; myres->my_menu[count].accel_text = NULL; myres->my_menu[count].callback = NULL; myres->my_menu[count].callback_data = NULL; myres->my_menu[count].subitems = (struct _menu_item *)1; } myres->my_menu[myres->numitems].label = NULL; wtemp = BuildMenu(this->me, XmMENU_OPTION, "", '\0', myres->my_menu); XtManageChild(wtemp); if (delhandler) { mib_apply_eventhandlers(wtemp, this); mib_apply_eventhandlers(this->me, this); } else this->me = wtemp; for (count = 0; count < myres->numitems; count++) { /* this hack extracts the widget for each item in the menu for possible use by the programmer */ myres->items[count] = (Widget)(myres->my_menu[count].subitems); } } else return 0; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.5/src/lib/mib/mibRadioBox.c0000644000175000017500000001310312310110201014713 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; /* Code for RadioBox */ /*****************************************************************************/ mib_Widget *mib_create_RadioBox(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_RadioBox *myres; Widget wtemp; char label_temp[50]; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_RadioBox *)malloc(sizeof(mib_RadioBox)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(9); sprintf(temp->mib_class,"RadioBox"); temp->mib_class_num = MIB_RADIOBOX; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 0; /* initialize private resources */ temp->myres = (void *)myres; myres->numlabel = 0; if (mib_fill == WDEFAULT) { myres->numlabel = 2; myres->labels = (char **)malloc(10); myres->buttons = (Widget *)malloc(sizeof(Widget) * myres->numlabel); sprintf(label_temp, "Radio 1"); myres->labels[0] = (char *)malloc(strlen(label_temp)+1); strcpy(myres->labels[0],label_temp); sprintf(label_temp, "Radio 2"); myres->labels[1] = (char *)malloc(strlen(label_temp)+1); strcpy(myres->labels[1],label_temp); } /* create Xt widget */ n = 0; XtSetArg (args[n], XmNrubberPositioning, False); n++; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNhighlightThickness, 0); n++; temp->me = XmCreateRadioBox(temp->parent->me, "Radio", args, n); wtemp = temp->me; if (mib_fill == WDEFAULT) { n = 0; XtSetArg (args[n], XmNhighlightThickness, 0); n++; XtCreateManagedWidget("Radio 1", xmToggleButtonGadgetClass, wtemp, args, n); n = 0; XtSetArg (args[n], XmNhighlightThickness, 0); n++; XtCreateManagedWidget("Radio 2", xmToggleButtonGadgetClass, wtemp, args, n); } XtManageChild(wtemp); if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_RadioBox(mib_Widget *this) { mib_RadioBox *temp = (mib_RadioBox *)this->myres; int count; for (count=0; count < temp->numlabel; count++) free(temp->labels[count]); free(temp); } void mib_save_RadioBox(mib_Widget *this, FILE *fout) { mib_RadioBox *temp = (mib_RadioBox *)this->myres; int count; fprintf(fout,"numlabel: %d\\n\\\n", temp->numlabel); for (count=0; count < temp->numlabel; count++) { fprintf(fout,"label: \\\"%s\\\"\\n\\\n", temp->labels[count]); } } int mib_load_RadioBox(mib_Widget *this, mib_Buffer *fin) { char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; int count, vallen, n; Arg args[5]; mib_RadioBox *myres; myres = (mib_RadioBox *)this->myres; if (!mib_read_line(fin, res, val)) return 0; if (!strcmp(res,"numlabel")) { myres->numlabel = 0; sscanf(val,"%d",&(myres->numlabel)); if (!(myres->numlabel)) return 0; myres->labels = (char **)malloc((myres->numlabel+1)*4); myres->buttons = (Widget *)malloc(sizeof(Widget)*(myres->numlabel)); for (count=0; count < myres->numlabel; count++) { if (!mib_read_line(fin, res, val)) return 0; vallen = strlen(val); if (vallen < 2) return 0; val[vallen-1] = '\0'; myres->labels[count] = (char *)malloc(vallen-1); sprintf(myres->labels[count],"%s",&(val[1])); n = 0; XtSetArg (args[n], XmNhighlightThickness, 0); n++; myres->buttons[count] = XtCreateManagedWidget(myres->labels[count], xmToggleButtonGadgetClass, this->me, args, n); } } else return 0; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.5/src/lib/mib/mibScale.c0000644000175000017500000001311112310110201014232 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; #ifdef notdef static int scaleflag; #endif /* Code for Scale */ /*****************************************************************************/ mib_Widget *mib_create_Scale(mib_Widget *parent, char *name, char *orient, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_Scale *myres; Arg args[20]; int n; #ifdef notdef scaleflag = 0; #endif /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_Scale *)malloc(sizeof(mib_Scale)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(10); sprintf(temp->mib_class,"Scale"); temp->mib_class_num = MIB_SCALE; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; myres->orientation = 0; /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNhighlightThickness, 0); n++; if (mib_fill == WDEFAULT) { if (!strcmp("VertScale",orient)) { XtSetArg (args[n], XmNorientation, XmVERTICAL); n++; XtSetArg (args[n], XmNprocessingDirection, XmMAX_ON_TOP); n++; } else if (!strcmp("HorzScale",orient)) { XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++; XtSetArg (args[n], XmNprocessingDirection, XmMAX_ON_RIGHT); n++; myres->orientation = 1; } } if (mib_fill == WEDIT || mib_fill == WDEFAULT) { XtSetArg (args[n], XmNshowArrows, False); n++; XtSetArg (args[n], XmNsliderSize, 30); n++; } if (mib_fill == WEDIT || mib_fill == WDEFAULT) temp->me = XtCreateManagedWidget(name, xmScrollBarWidgetClass, temp->parent->me, args, n); else temp->me = XtCreateManagedWidget(name, xmScaleWidgetClass, temp->parent->me, args, n); #ifdef notdef if (mib_fill == WEMPTY) scaleflag = 1; #endif if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_Scale(mib_Widget *this) { mib_Scale *temp = (mib_Scale *)this->myres; free(temp); } void mib_save_Scale(mib_Widget *this, FILE *fout) { mib_Scale *temp = (mib_Scale *)this->myres; fprintf(fout,"orientation: %d\\n\\\n", temp->orientation); } int mib_load_Scale(mib_Widget *this, mib_Buffer *fin) { mib_Scale *myres; char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; Arg args[5]; int n; myres = (mib_Scale *)this->myres; if (!mib_read_line(fin, res, val)) return 0; if (!strcmp(res,"orientation")) { sscanf(val,"%d",&(myres->orientation)); #ifdef notdef /* What's this doing here? Setting XmNscaleWidth/XmNscaleHeight * seems to break lesstif's sizing of the widget. -slevy 97.07.31 */ n = 0; if (scaleflag) { if (!myres->orientation) { XtSetArg (args[n], XmNscaleWidth, this->width); n++; } else { XtSetArg (args[n], XmNscaleWidth, this->height); n++; } XtSetValues(this->me, args, n); } #endif /* end what's this */ n = 0; switch (myres->orientation) { case 0: XtSetArg (args[n], XmNorientation, XmVERTICAL); n++; XtSetArg (args[n], XmNprocessingDirection, XmMAX_ON_TOP); n++; break; case 1: XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++; XtSetArg (args[n], XmNprocessingDirection, XmMAX_ON_RIGHT); n++; break; default: break; } XtSetValues(this->me, args, n); } else return 0; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.5/src/lib/mib/mibScrollBar.c0000644000175000017500000001065212310110201015075 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; /* Code for ScrollBars */ /*****************************************************************************/ mib_Widget *mib_create_ScrollBar(mib_Widget *parent, char *name, char *orient, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_ScrollBar *myres; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_ScrollBar *)malloc(sizeof(mib_ScrollBar)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(10); sprintf(temp->mib_class,"ScrollBar"); temp->mib_class_num = MIB_SCROLLBAR; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; myres->orientation = 0; /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; if ((mib_fill == WDEFAULT)) { if (!strcmp("VertScrollBar",orient)) { XtSetArg (args[n], XmNorientation, XmVERTICAL); n++; } else { if (!strcmp("HorzScrollBar",orient)) { XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++; myres->orientation = 1; } } } temp->me = XtCreateManagedWidget(name, xmScrollBarWidgetClass, temp->parent->me, args, n); if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_ScrollBar(mib_Widget *this) { mib_ScrollBar *temp = (mib_ScrollBar *)this->myres; free(temp); } void mib_save_ScrollBar(mib_Widget *this, FILE *fout) { mib_ScrollBar *temp = (mib_ScrollBar *)this->myres; fprintf(fout,"orientation: %d\\n\\\n", temp->orientation); } int mib_load_ScrollBar(mib_Widget *this, mib_Buffer *fin) { mib_ScrollBar *myres; char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; Arg args[5]; int n; myres = (mib_ScrollBar *)this->myres; if (!mib_read_line(fin, res, val)) return 0; if (!strcmp(res,"orientation")) { sscanf(val,"%d",&(myres->orientation)); n = 0; switch (myres->orientation) { case 0: XtSetArg (args[n], XmNorientation, XmVERTICAL); n++; break; case 1: XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++; break; default: break; } XtSetValues(this->me, args, n); } else return 0; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.5/src/lib/mib/mibTextBig.c0000644000175000017500000001017412310110201014557 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; static Widget real_text; /* Code of TextBig */ /*****************************************************************************/ mib_Widget *mib_create_TextBig(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_TextBig *myres; Widget wtemp; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_TextBig *)malloc(sizeof(mib_TextBig)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(8); sprintf(temp->mib_class,"TextBig"); temp->mib_class_num = MIB_TEXTBIG; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; myres->nothing = 0; /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNshadowType, XmSHADOW_ETCHED_IN); n++; temp->me = XtCreateManagedWidget(name, xmFrameWidgetClass, temp->parent->me, args, n); n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; XtSetArg (args[n], XmNrows, 200); n++; XtSetArg (args[n], XmNcolumns, 200); n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++; XtSetArg (args[n], XmNhighlightThickness, 0); n++; wtemp = XmCreateScrolledText(temp->me, name, args, n); real_text = wtemp; XtManageChild(wtemp); if (mib_fill != WEMPTY) real_text = NULL; if (mib_fill == WEDIT || mib_fill == WDEFAULT) { XmTextSetString(wtemp,"Big Text Field\nwith Scrollbars\n\n\n\n\n\n\n "); mib_apply_eventhandlers(wtemp, temp); mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_TextBig(mib_Widget *this) { mib_TextBig *temp = (mib_TextBig *)this->myres; free(temp); } void mib_save_TextBig(mib_Widget *this, FILE *fout) { } int mib_load_TextBig(mib_Widget *this, mib_Buffer *fin) { char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; if (real_text) this->me = real_text; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.5/src/lib/mib/mibTextBox.c0000644000175000017500000000742312310110201014611 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; /* Code for TextBox */ /*****************************************************************************/ mib_Widget *mib_create_TextBox(mib_Widget *parent, char *name, char *contents, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_TextBox *myres; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_TextBox *)malloc(sizeof(mib_TextBox)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(8); sprintf(temp->mib_class,"TextBox"); temp->mib_class_num = MIB_TEXTBOX; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; myres->init_contents = NULL; if (mib_fill == WDEFAULT) { if (contents != NULL) { myres->init_contents = (char *)malloc(strlen(contents)+1); strcpy(myres->init_contents, contents); } } /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNhighlightThickness, 0); n++; temp->me = XtCreateManagedWidget(name, xmTextFieldWidgetClass, temp->parent->me, args, n); if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); XmTextFieldSetString(temp->me, "Text Field"); } return temp; } void mib_delete_TextBox(mib_Widget *this) { mib_TextBox *temp = (mib_TextBox *)this->myres; if (temp->init_contents != NULL) free(temp->init_contents); } void mib_save_TextBox(mib_Widget *this, FILE *fout) { } int mib_load_TextBox(mib_Widget *this, mib_Buffer *fin) { char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; if (!mib_read_line(fin, res, val)) return 0; if (!strcmp(res,"EndWidget.")) return 0; return 1; } geomview-1.9.5/src/lib/mib/mibToggle.c0000644000175000017500000001325412310110201014434 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; /* Code for Toggle */ /*****************************************************************************/ mib_Widget *mib_create_Toggle(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_Toggle *myres; /*unsigned char *label_text;*/ XmString label_text = NULL; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_Toggle *)malloc(sizeof(mib_Toggle)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(7); sprintf(temp->mib_class,"Toggle"); temp->mib_class_num = MIB_TOGGLE; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 0; /* initialize private resources */ temp->myres = (void *)myres; myres->isize = 0; if (mib_fill == WDEFAULT) { myres->label = (char *)malloc(strlen(label)+1); strcpy(myres->label,label); } /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { label_text = XmStringCreateLtoR(label, XmSTRING_DEFAULT_CHARSET); XtSetArg (args[n], XmNlabelString, label_text); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; /* XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++;*/ } /* Do not set the width or height, if zero. The core widget will compute appropriately. */ if ( width ) { XtSetArg (args[n], XmNwidth, width); n++; } if ( height ) { XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNspacing, 4); n++; XtSetArg (args[n], XmNhighlightThickness, 0); n++; XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNindicatorType, XmN_OF_MANY); temp->me = XtCreateManagedWidget(name, xmToggleButtonWidgetClass, temp->parent->me, args, n); if (mib_fill == WDEFAULT) { XmStringFree(label_text); } if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_Toggle(mib_Widget *this) { mib_Toggle *temp = (mib_Toggle *)this->myres; free(temp->label); free(temp); } void mib_save_Toggle(mib_Widget *this, FILE *fout) { mib_Toggle *temp = (mib_Toggle *)this->myres; fprintf(fout,"label: \\\"%s\\\"\\n\\\n", temp->label); fprintf(fout,"indicatorSize: %d\\n\\\n", temp->isize); } int mib_load_Toggle(mib_Widget *this, mib_Buffer *fin) { mib_Toggle *myres; /*unsigned char *label_text;*/ XmString label_text; char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; Arg args[20]; int n, got_line, vallen; myres = (mib_Toggle *)this->myres; got_line = mib_read_line(fin, res, val); if (!got_line) return 0; if (!strcmp(res,"label")) { vallen = strlen(val); if (vallen < 2) return 0; val[vallen-1] = '\0'; myres->label = (char *)malloc(vallen-1); sprintf(myres->label,"%s",&(val[1])); label_text = XmStringCreateLtoR(myres->label, XmSTRING_DEFAULT_CHARSET); n = 0; XtSetArg (args[n], XmNlabelString, label_text); n++; /* Do not set the width or height, if zero. The core widget will compute appropriately. */ if ( this->width ) { XtSetArg (args[n], XmNwidth, this->width); n++; } if ( this->height ) { XtSetArg (args[n], XmNheight, this->height); n++; } XtSetValues(this->me, args, n); XmStringFree(label_text); } else return 0; got_line = mib_read_line(fin, res, val); if (!got_line) return 0; if (!strcmp(res, "indicatorSize")) { sscanf(val, "%d", &(myres->isize)); if (myres->isize) XtVaSetValues(this->me, XmNindicatorSize, (Dimension)myres->isize, XmNmarginBottom, 0, XmNmarginTop, 0, XmNmarginLeft, 0, XmNmarginRight, 0, XmNspacing, 0, NULL); got_line = mib_read_line(fin, res, val); if (!got_line) return 0; } if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.5/src/lib/mib/mibload.h0000644000175000017500000001250612310110201014136 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Structure of mib_Widget */ /*****************************************************************************/ typedef struct _mib_Widget { char *mib_class; /* name of mib class (Button, TextBox, etc..)*/ int mib_class_num; /* class number for ez reference :) */ int mib_mynum; /* numbering for storage format */ Widget me; /* Xt widget */ int mib_selected; /* is selected */ int mib_resizing; /* is resizing 1, or being moved 0 */ int mib_resizetype;/* 1 = upper left, 2 = upper, 3 = ... */ int mib_allowresize; /* can this widget be resized ? */ int clkx, clky; /* where user clicked */ void *myres; /* my resources (different for each widget) */ char *name; /* reference name of this widget */ int width, height; /* width and height */ int topAttachment, bottomAttachment, leftAttachment, rightAttachment; /* attachments 1=attached 0=not-attached */ int topOffset, bottomOffset, leftOffset, rightOffset; /* offsets if attached */ struct _mib_Widget *parent; /* pointer to parent */ struct _mib_Widget *sibling; /* remaining linked list of sibling widgets */ struct _mib_Widget *prev; /* previous sibling or parent */ struct _mib_Widget *child; /* linked list of children widgets */ } mib_Widget; /* mib_Buffer structure */ /*****************************************************************************/ typedef struct _mib_Buffer { void *buffer; /* pointer to either a file or a char string */ int buf_type; /* type of buffer (defined above) */ int point; /* pointer for string */ int buflen; /* length of string buffer */ } mib_Buffer; /* mib_Widget functions */ /*****************************************************************************/ void mib_add_mib_Widget(mib_Widget *, mib_Widget *); void mib_add_backward_Widget(mib_Widget *, mib_Widget *); void mib_remove_mib_Widget(mib_Widget *); void mib_clear_myres(mib_Widget *); mib_Widget *mib_new_mib_Widget(); mib_Widget *mib_find_name(mib_Widget *, char *); mib_Widget *mib_load_interface(Widget, char *, int); int mib_count_all(mib_Widget *, int); int mib_load_Root(Widget, mib_Widget **, mib_Buffer *); mib_Widget *mib_load_public(mib_Widget *, mib_Widget *, mib_Buffer *); int mib_load_mib_class(mib_Widget **, mib_Widget *, char *, char *, mib_Buffer *); int mib_load_private(mib_Widget *, mib_Buffer *); void mib_reset_size(mib_Widget *); int mib_read_line(mib_Buffer *, char *, char *); void mib_set_eventhandlers(void (*a)(), void (*b)(), void (*c)()); void mib_apply_eventhandlers(Widget, mib_Widget *); void mib_add_backward(mib_Widget *this, mib_Widget *parent); /* supporting functions and structures */ /*****************************************************************************/ typedef struct _menu_item { char *label; WidgetClass *class; char mnemonic; char *accelerator; char *accel_text; void (*callback)(); XtPointer callback_data; struct _menu_item *subitems; } MenuItem; Widget BuildMenu(Widget, int, char *, char, MenuItem *); /* mib class numbers */ #define MIB_NULL 0 #define MIB_TEXTBOX 1 #define MIB_BUTTON 2 #define MIB_TOGGLE 3 #define MIB_RADIOBOX 4 #define MIB_DRAWINGAREA 5 #define MIB_LABEL 6 #define MIB_FRAME 7 #define MIB_SCROLLBAR 8 #define MIB_TEXTBIG 9 #define MIB_LIST 10 #define MIB_SCALE 11 #define MIB_MENU 12 /* number of classes */ #define MI_NUMCLASSES 12 /* for specifying creation of a widget with default private values, no values at all (empty), or no values and editable */ #define WDEFAULT 1 #define WEMPTY 2 #define WEDIT 3 /* for specifing whether we are loading an interface from a file or from a string and whether it is editable :) */ #define MI_FROMFILE 1 #define MI_EDITFROMFILE 2 #define MI_FROMSTRING 3 #define MI_EDITFROMSTRING 4 #define MI_MAXSTRLEN 200 /* maximum string length */ geomview-1.9.5/src/lib/mib/mibwidgets.h0000644000175000017500000001704312310110201014666 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Structure of mib_TextBox */ /*****************************************************************************/ typedef struct _mib_TextBox { char *init_contents; /* initial text contents */ } mib_TextBox; /* mib_TextBox functions */ /*****************************************************************************/ mib_Widget *mib_create_TextBox(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_TextBox(mib_Widget *); void mib_save_TextBox(mib_Widget *, FILE *); int mib_load_TextBox(mib_Widget *, mib_Buffer *); /* Structure of mib_Button */ /*****************************************************************************/ typedef struct _mib_Button { char *label; /* label on button */ } mib_Button; /* mib_Button functions */ /*****************************************************************************/ mib_Widget *mib_create_Button(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_Button(mib_Widget *); void mib_save_Button(mib_Widget *, FILE *); int mib_load_Button(mib_Widget *, mib_Buffer *); /* Structure of mib_Toggle */ /*****************************************************************************/ typedef struct _mib_Toggle { char *label; /* label on toggle */ int isize; } mib_Toggle; /* mib_Toggle functions */ /*****************************************************************************/ mib_Widget *mib_create_Toggle(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_Toggle(mib_Widget *); void mib_save_Toggle(mib_Widget *, FILE *); int mib_load_Toggle(mib_Widget *, mib_Buffer *); /* Structure of mib_RadioBox */ /*****************************************************************************/ typedef struct _mib_RadioBox { char **labels; /* array of labels */ int numlabel; /* number of labels */ Widget *buttons; /* pointers to each button */ } mib_RadioBox; /* mib_RadioBox functions */ /*****************************************************************************/ mib_Widget *mib_create_RadioBox(mib_Widget *, char *, char*, int, int, int, int, int); void mib_delete_RadioBox(mib_Widget *); void mib_save_RadioBox(mib_Widget *, FILE *); int mib_load_RadioBox(mib_Widget *, mib_Buffer *); /* Structure of mib_DrawingArea */ /*****************************************************************************/ typedef struct _mib_DrawingArea { int nothing; /* couldn't think of anything yet */ } mib_DrawingArea; /* mib_DrawingArea functions */ /*****************************************************************************/ mib_Widget *mib_create_DrawingArea(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_DrawingArea(mib_Widget *); void mib_save_DrawingArea(mib_Widget *, FILE *); int mib_load_DrawingArea(mib_Widget *, mib_Buffer *); /* Structure of mib_Label */ /*****************************************************************************/ typedef struct _mib_Label { char *label; /* text in label */ } mib_Label; /* mib_Label functions */ /*****************************************************************************/ mib_Widget *mib_create_Label(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_Label(mib_Widget *); void mib_save_Label(mib_Widget *, FILE *); int mib_load_Label(mib_Widget *, mib_Buffer *); /* Structure of mib_Frame */ /*****************************************************************************/ typedef struct _mib_Frame { int shadowtype; /* 0 = in, 1 = out, 2 = etched_in, 3 = etched_out */ } mib_Frame; /* mib_Frame functions */ /*****************************************************************************/ mib_Widget *mib_create_Frame(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_Frame(mib_Widget *); void mib_save_Frame(mib_Widget *, FILE *); int mib_load_Frame(mib_Widget *, mib_Buffer *); /* Structure of mib_ScrollBar */ /*****************************************************************************/ typedef struct _mib_ScrollBar { int orientation; } mib_ScrollBar; /* mib_ScrollBar functions */ /*****************************************************************************/ mib_Widget *mib_create_ScrollBar(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_ScrollBar(mib_Widget *); void mib_save_ScrollBar(mib_Widget *, FILE *); int mib_load_ScrollBar(mib_Widget *, mib_Buffer *); /* Structure of mib_TextBig */ /*****************************************************************************/ typedef struct _mib_TextBig { int nothing; /* couldn't think of anything yet */ } mib_TextBig; /* mib_TextBig functions */ /*****************************************************************************/ mib_Widget *mib_create_TextBig(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_TextBig(mib_Widget *); void mib_save_TextBig(mib_Widget *, FILE *); int mib_load_TextBig(mib_Widget *, mib_Buffer *); /* Structure of mib_List */ /*****************************************************************************/ typedef struct _mib_List { Widget real_list; } mib_List; /* mib_List functions */ /*****************************************************************************/ mib_Widget *mib_create_List(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_List(mib_Widget *); void mib_save_List(mib_Widget *, FILE *); int mib_load_List(mib_Widget *, mib_Buffer *); /* Structure of mib_Scale */ /*****************************************************************************/ typedef struct _mib_Scale { int orientation; } mib_Scale; /* mib_Scale functions */ /*****************************************************************************/ mib_Widget *mib_create_Scale(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_Scale(mib_Widget *); void mib_save_Scale(mib_Widget *, FILE *); int mib_load_Scale(mib_Widget *, mib_Buffer *); /* Structure of mib_Menu */ /*****************************************************************************/ typedef struct _mib_Menu { int numitems; /* number of items in menu*/ MenuItem *my_menu; /* array of menu items */ Widget *items; /* pointers to each item */ } mib_Menu; /* mib_Menu functions */ /*****************************************************************************/ mib_Widget *mib_create_Menu(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_Menu(mib_Widget *); void mib_save_Menu(mib_Widget *, FILE *); int mib_load_Menu(mib_Widget *, mib_Buffer *); /*****************************************************************************/ typedef struct _mib_widget_funcs { char *name; mib_Widget *(*mib_create)(); void (*mib_delete)(); void (*mib_save)(); int (*mib_load)(); } mib_widget_funcs; geomview-1.9.5/src/lib/mib/Headers0000644000175000017500000000002712310110201013647 00000000000000mibload.h mibwidgets.h geomview-1.9.5/src/lib/forms/0000755000175000017500000000000012310165603013031 500000000000000geomview-1.9.5/src/lib/forms/Makefile.in0000644000175000017500000003305312310165553015026 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/forms DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers xforms-compat.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/forms/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/forms/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/forms/Makefile.am0000644000175000017500000000010412310110200014757 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers xforms-compat.h geomview-1.9.5/src/lib/forms/Headers0000644000175000017500000000002012310110200014216 00000000000000xforms-compat.h geomview-1.9.5/src/lib/forms/xforms-compat.h0000644000175000017500000000464412310110200015710 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Include this file after forms.h, but before Forms-designer-generated code. */ #if defined(FL_INCLUDE_VERSION) || defined(FL_FORMS_H) #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef XFORMS # define XFORMS 1 #endif #define foreground() /* nothing */ #define winset(w) fl_winset(w) #define winpop() (fl_winget() && XRaiseWindow(fl_display, fl_winget())) #define minsize(x, y) fl_winminsize(fl_winget(), x, y) #define maxsize(x, y) fl_winmaxsize(fl_winget(), x, y) #if FL_INCLUDE_VERSION <= 75 /* Old XForms */ #define FL_INITIALIZE(name) { \ static int argc = 1; \ static char *argv[] = {name, 0}; \ fl_initialize(argv[0],argv[0], NULL, 0, &argc, argv); \ } #define DrawButton DrawBtn /* Avoid name conflict with XForms typedef! */ #define FLXWRAPPER(xfunc, formsfunc) \ FL_OBJECT *xfunc(int kind, float x, float y, float w, float h, char *name) { \ return formsfunc(kind, x, y, w, h, name); \ } #else /* Modern XForms */ #define FL_INITIALIZE(name) { \ static int argc = 1; \ static char *argv[] = {name, 0}; \ fl_initialize(&argc, argv, argv[0], 0, 0); \ } extern inline void flx_end_form() { FL_OBJECT *obj = NULL; if(fl_current_form) obj = fl_current_form->first; for( ; obj; obj = obj->next) { obj->y = fl_current_form->h - obj->y - obj->h; if(obj->col1 == 47) obj->col1 = FL_COL1; if(obj->col2 == 47) obj->col2 = FL_COL1; } fl_end_form(); } #define fl_end_form() flx_end_form() #endif #else /* Non-XForms */ #define FL_INITIALIZE(name) /* nothing */ #endif geomview-1.9.5/src/lib/aclib/0000755000175000017500000000000012310165603012755 500000000000000geomview-1.9.5/src/lib/aclib/Makefile.in0000644000175000017500000004364612310165553014763 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/aclib DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs popen.c lstat.c fmemopen.c \ putenv.c strtod.c strncasecmp.c strcasecmp.c strdup.c memcmp.c \ obstack.h obstack.c acosh.c stat.c alloca.c \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libacgeomview_la_DEPENDENCIES = @LTLIBOBJS@ @ALLOCA@ am_libacgeomview_la_OBJECTS = libacgeomview_la_OBJECTS = $(am_libacgeomview_la_OBJECTS) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libacgeomview_la_SOURCES) DIST_SOURCES = $(libacgeomview_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = Headers noinst_LTLIBRARIES = libacgeomview.la libacgeomview_la_SOURCES = libacgeomview_la_LIBADD = @LTLIBOBJS@ @ALLOCA@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/aclib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/aclib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libacgeomview.la: $(libacgeomview_la_OBJECTS) $(libacgeomview_la_DEPENDENCIES) $(EXTRA_libacgeomview_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libacgeomview_la_OBJECTS) $(libacgeomview_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/acosh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/alloca.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/fmemopen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lstat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memcmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/obstack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/popen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/putenv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/stat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strcasecmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strdup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strncasecmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strtod.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf $(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf $(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags-am distclean \ distclean-compile distclean-generic distclean-libtool distdir \ dvi dvi-am html html-am info info-am install install-am \ install-data install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/lib/aclib/Makefile.am0000644000175000017500000000020612310110177014723 00000000000000EXTRA_DIST = Headers noinst_LTLIBRARIES = libacgeomview.la libacgeomview_la_SOURCES = libacgeomview_la_LIBADD = @LTLIBOBJS@ @ALLOCA@ geomview-1.9.5/src/lib/aclib/popen.c0000644000175000017500000000234412310110177014161 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include FILE *popen(char *name, char *mode) { fprintf(stderr, "Call to stub popen(%s, %s)!\n", name, mode); return NULL; } geomview-1.9.5/src/lib/aclib/lstat.c0000644000175000017500000000376412310110177014176 00000000000000/* Copyright (C) 2006 Claus-Justus Heine. * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #undef lstat #if HAVE_SYS_TYPES_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_LIMITS_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_ERRNO_H # include #endif #if !HAVE_DECL_ERRNO extern int errno; #endif #ifndef PATH_MAX # define PATH_MAX 1024 #endif #ifndef ENOENT # define ENOENT 255 #endif #ifndef ENAMETOOLONG # define ENAMETOOLONG 255 #endif #ifndef ENOSYS # define ENOSYS 255 #endif int gv_lstat(const char *path, struct stat *buf) { #if !LSTAT_FOLLOWS_SLASHED_SYMLINK size_t pathlen; char mypath[PATH_MAX+1]; #endif #if HAVE_LSTAT_EMPTY_STRING_BUG if (path == NULL || *path == '\0') { errno = ENOENT; return -1; } #endif #if !LSTAT_FOLLOWS_SLASHED_SYMLINK pathlen = strlen(path); if (pathlen > 0 && path[pathlen-1] == '/') { if (pathlen == PATH_MAX) { errno = ENAMETOOLONG; return -1; } memcpy(mypath, path, pathlen); path = mypath; mypath[pathlen++] = '.'; mypath[pathlen++] = '\0'; } #endif #if HAVE_LSTAT return lstat(path, buf); #else errno = ENOSYS; return -1; #endif } geomview-1.9.5/src/lib/aclib/fmemopen.c0000644000175000017500000000326712310110177014653 00000000000000/* * Copyright (C) 2006 Claus-Justus Heine This program is free software; you can redistribute 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; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * Clean stdio replacement for fmemopen, using a temporary file. No * more fiddling with stdio internals. Gnah. */ /* As a special exception the author of this files permits the * distribution of this software with Geomview. As long as this file * is distributed with Geomview, the conditions of the GNU Lesser * Public Licence apply. See the file "COPYING" in the top-level * directory. */ #include /* Come on, folks, let's just do it the CleanWay (tm): open a * temporary file, write the string to that file, rewind the file, * unlink the file (then fclose() will remove it). Grin. A * brain-damaged system might fail to actually delete that file, but * we do not care. */ FILE *fmemopen (void *buf, size_t size, const char *mode) { FILE *tmp = tmpfile(); if (*mode != 'r') { return NULL; } if (fwrite(buf, size, 1, tmp) != 1) { fclose(tmp); return NULL; } if (fseek(tmp, 0L, SEEK_SET) != 0) { fclose(tmp); return NULL; } return tmp; } geomview-1.9.5/src/lib/aclib/putenv.c0000644000175000017500000000766212310110177014371 00000000000000/* * The following copyright notice applies to everything in this * file from here on down. */ /* * Copyright (c) 1987 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the University of California, Berkeley. The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)getenv.c 5.5 (Berkeley) 6/27/88"; #endif /* LIBC_SCCS and not lint */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include /* * _findenv -- * Returns pointer to value associated with name, if any, else NULL. * Sets offset to be the offset of the name/value combination in the * environmental array, for use by setenv(3)/putenv(3) and unsetenv(3). * Explicitly removes '=' in argument name. */ static char *_findenv(char *name, int *offset) { extern char **environ; int len; char **P, *C; for (C = name, len = 0; *C && *C != '='; ++C, ++len); for (P = environ; *P; ++P) if (!strncmp(*P, name, len)) if (*(C = *P + len) == '=') { *offset = P - environ; return(++C); } return(NULL); } #if defined(LIBC_SCCS) && !defined(lint) /* static char sccsid[] = "@(#)setenv.c 5.2 (Berkeley) 6/27/88"; */ #endif /* LIBC_SCCS and not lint */ #include /* Note: we do not use OOGLNew() & friends because libc would neither do so. */ static inline void *xmalloc(size_t size) { void *ptr; if ((ptr = malloc(size)) == NULL) { fprintf(stderr, "malloc(%d) failed in putenv().\n", size); exit(EXIT_FAILURE); } return ptr; } static inline void *xrealloc(void *oldptr, size_t newsize) { void *ptr; if ((ptr = realloc(oldptr, newsize)) == NULL) { fprintf(stderr, "realloc(%p, %d) failed in putenv().\n", oldptr, newsize); exit(EXIT_FAILURE); } return ptr; } /* * putenv -- * Put a string of the form "name=value" into the environment. * [Adapted from BSD routine setenv(name, value, rewrite).] */ putenv(char *name) { extern char **environ; static int alloced; /* if allocated space before */ char *value; char *C; int l_value, offset; value = strchr(name, '='); value = value ? value+1 : name; l_value = strlen(value); if ((C = _findenv(name, &offset))) { /* find if already exists */ if (strlen(C) >= l_value) { /* old larger; copy over */ while (*C++ = *value++); return(0); } } else { /* create new slot */ int cnt; char **P; for (P = environ, cnt = 0; *P; ++P, ++cnt); if (alloced) { /* just increase size */ environ = (char **)realloc((char *)environ, (u_int)(sizeof(char *) * (cnt + 2))); if (!environ) return(-1); } else { /* get new space */ alloced = 1; /* copy old entries into it */ P = (char **)xmalloc((u_int)(sizeof(char *) * (cnt + 2))); if (!P) return(-1); memcpy(P, environ, cnt * sizeof(char *)); environ = P; } environ[cnt + 1] = NULL; offset = cnt; } for (C = name; *C && *C != '='; ++C); /* no `=' in name */ if (!(environ[offset] = /* name + `=' + value */ xmalloc((u_int)((int)(C - name) + l_value + 2)))) return(-1); for (C = environ[offset]; (*C = *name++) && *C != '='; ++C); for (*C++ = '='; *C++ = *value++;); return(0); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/aclib/strtod.c0000644000175000017500000000001512310110177014350 00000000000000#error FIXME geomview-1.9.5/src/lib/aclib/strncasecmp.c0000644000175000017500000000256312310110177015365 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif int strncasecmp(char *a, char *b, int n) { int ca, cb; while(--n >= 0 && (ca = *a) && (cb = *b)) { if(ca != cb) { if(ca >= 'A' && ca <= 'Z') ca += 'a' - 'A'; if(cb >= 'A' && cb <= 'Z') cb += 'a' - 'A'; if(ca != cb) return ca - cb; } a++, b++; } return 0; } geomview-1.9.5/src/lib/aclib/strcasecmp.c0000644000175000017500000000253712310110177015210 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif int strcasecmp(char *a, char *b) { int ca, cb; while((ca = *a) && (cb = *b)) { if(ca != cb) { if(ca >= 'A' && ca <= 'Z') ca += 'a' - 'A'; if(cb >= 'A' && cb <= 'Z') cb += 'a' - 'A'; if(ca != cb) return ca - cb; } a++, b++; } return 0; } geomview-1.9.5/src/lib/aclib/strdup.c0000644000175000017500000000336012310110177014360 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include /* Note: we do not use OOGLNew() & friends because libc would neither do so. */ static inline void *xmalloc(size_t size) { void *ptr; if ((ptr = malloc(size)) == NULL) { fprintf(stderr, "malloc(%d) failed in strdup().\n", size); exit(EXIT_FAILURE); } return ptr; } #undef strdup char *strdup(const char *str ) { char *s; int len; if(str == NULL) return NULL; len = strlen(str); s = xmalloc(len+1); memcpy(s, str, len+1); return s; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/lib/aclib/memcmp.c0000644000175000017500000000001512310110177014307 00000000000000#error FIXME geomview-1.9.5/src/lib/aclib/obstack.h0000644000175000017500000004632012310110177014475 00000000000000/* obstack.h - object stack macros Copyright (C) 1988-1994,1996-1999,2003,2004,2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Summary: All the apparent functions defined here are macros. The idea is that you would use these pre-tested macros to solve a very specific set of problems, and they would run fast. Caution: no side-effects in arguments please!! They may be evaluated MANY times!! These macros operate a stack of objects. Each object starts life small, and may grow to maturity. (Consider building a word syllable by syllable.) An object can move while it is growing. Once it has been "finished" it never changes address again. So the "top of the stack" is typically an immature growing object, while the rest of the stack is of mature, fixed size and fixed address objects. These routines grab large chunks of memory, using a function you supply, called `obstack_chunk_alloc'. On occasion, they free chunks, by calling `obstack_chunk_free'. You must define them and declare them before using any obstack macros. Each independent stack is represented by a `struct obstack'. Each of the obstack macros expects a pointer to such a structure as the first argument. One motivation for this package is the problem of growing char strings in symbol tables. Unless you are "fascist pig with a read-only mind" --Gosper's immortal quote from HAKMEM item 154, out of context--you would not like to put any arbitrary upper limit on the length of your symbols. In practice this often means you will build many short symbols and a few long symbols. At the time you are reading a symbol you don't know how long it is. One traditional method is to read a symbol into a buffer, realloc()ating the buffer every time you try to read a symbol that is longer than the buffer. This is beaut, but you still will want to copy the symbol from the buffer to a more permanent symbol-table entry say about half the time. With obstacks, you can work differently. Use one obstack for all symbol names. As you read a symbol, grow the name in the obstack gradually. When the name is complete, finalize it. Then, if the symbol exists already, free the newly read name. The way we do this is to take a large chunk, allocating memory from low addresses. When you want to build a symbol in the chunk you just add chars above the current "high water mark" in the chunk. When you have finished adding chars, because you got to the end of the symbol, you know how long the chars are, and you can create a new object. Mostly the chars will not burst over the highest address of the chunk, because you would typically expect a chunk to be (say) 100 times as long as an average object. In case that isn't clear, when we have enough chars to make up the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed) so we just point to it where it lies. No moving of chars is needed and this is the second win: potentially long strings need never be explicitly shuffled. Once an object is formed, it does not change its address during its lifetime. When the chars burst over a chunk boundary, we allocate a larger chunk, and then copy the partly formed object from the end of the old chunk to the beginning of the new larger chunk. We then carry on accreting characters to the end of the object as we normally would. A special macro is provided to add a single char at a time to a growing object. This allows the use of register variables, which break the ordinary 'growth' macro. Summary: We allocate large chunks. We carve out one object at a time from the current chunk. Once carved, an object never moves. We are free to append data of any size to the currently growing object. Exactly one object is growing in an obstack at any one time. You can run one obstack per control block. You may have as many control blocks as you dare. Because of the way we do it, you can `unwind' an obstack back to a previous state. (You may remove objects much as you would with a stack.) */ /* Don't do the contents of this file more than once. */ #ifndef _OBSTACK_H #define _OBSTACK_H 1 #ifdef __cplusplus extern "C" { #endif /* We need the type of a pointer subtraction. If __PTRDIFF_TYPE__ is defined, as with GNU C, use that; that way we don't pollute the namespace with 's symbols. Otherwise, include and use ptrdiff_t. */ #ifdef __PTRDIFF_TYPE__ # define PTR_INT_TYPE __PTRDIFF_TYPE__ #else # include # define PTR_INT_TYPE ptrdiff_t #endif /* If B is the base of an object addressed by P, return the result of aligning P to the next multiple of A + 1. B and P must be of type char *. A + 1 must be a power of 2. */ #define __BPTR_ALIGN(B, P, A) ((B) + (((P) - (B) + (A)) & ~(A))) /* Similiar to _BPTR_ALIGN (B, P, A), except optimize the common case where pointers can be converted to integers, aligned as integers, and converted back again. If PTR_INT_TYPE is narrower than a pointer (e.g., the AS/400), play it safe and compute the alignment relative to B. Otherwise, use the faster strategy of computing the alignment relative to 0. */ #define __PTR_ALIGN(B, P, A) \ __BPTR_ALIGN (sizeof (PTR_INT_TYPE) < sizeof (void *) ? (B) : (char *) 0, \ P, A) #include struct _obstack_chunk /* Lives at front of each chunk. */ { char *limit; /* 1 past end of this chunk */ struct _obstack_chunk *prev; /* address of prior chunk or NULL */ char contents[4]; /* objects begin here */ }; struct obstack /* control current object in current chunk */ { long chunk_size; /* preferred size to allocate chunks in */ struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */ char *object_base; /* address of object we are building */ char *next_free; /* where to add next char to current object */ char *chunk_limit; /* address of char after current chunk */ union { PTR_INT_TYPE tempint; void *tempptr; } temp; /* Temporary for some macros. */ int alignment_mask; /* Mask of alignment for each object. */ /* These prototypes vary based on `use_extra_arg', and we use casts to the prototypeless function type in all assignments, but having prototypes here quiets -Wstrict-prototypes. */ struct _obstack_chunk *(*chunkfun) (void *, long); void (*freefun) (void *, struct _obstack_chunk *); void *extra_arg; /* first arg for chunk alloc/dealloc funcs */ unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */ unsigned maybe_empty_object:1;/* There is a possibility that the current chunk contains a zero-length object. This prevents freeing the chunk if we allocate a bigger chunk to replace it. */ unsigned alloc_failed:1; /* No longer used, as we now call the failed handler on error, but retained for binary compatibility. */ }; /* Declare the external functions we use; they are in obstack.c. */ extern void _obstack_newchunk (struct obstack *, int); extern int _obstack_begin (struct obstack *, int, int, void *(*) (long), void (*) (void *)); extern int _obstack_begin_1 (struct obstack *, int, int, void *(*) (void *, long), void (*) (void *, void *), void *); extern int _obstack_memory_used (struct obstack *); void obstack_free (struct obstack *obstack, void *block); /* Error handler called when `obstack_chunk_alloc' failed to allocate more memory. This can be set to a user defined function which should either abort gracefully or use longjump - but shouldn't return. The default action is to print a message and abort. */ extern void (*obstack_alloc_failed_handler) (void); /* Exit value used when `print_and_abort' is used. */ extern int obstack_exit_failure; /* Pointer to beginning of object being allocated or to be allocated next. Note that this might not be the final address of the object because a new chunk might be needed to hold the final size. */ #define obstack_base(h) ((void *) (h)->object_base) /* Size for allocating ordinary chunks. */ #define obstack_chunk_size(h) ((h)->chunk_size) /* Pointer to next byte not yet allocated in current chunk. */ #define obstack_next_free(h) ((h)->next_free) /* Mask specifying low bits that should be clear in address of an object. */ #define obstack_alignment_mask(h) ((h)->alignment_mask) /* To prevent prototype warnings provide complete argument list. */ #define obstack_init(h) \ _obstack_begin ((h), 0, 0, \ (void *(*) (long)) obstack_chunk_alloc, \ (void (*) (void *)) obstack_chunk_free) #define obstack_begin(h, size) \ _obstack_begin ((h), (size), 0, \ (void *(*) (long)) obstack_chunk_alloc, \ (void (*) (void *)) obstack_chunk_free) #define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \ _obstack_begin ((h), (size), (alignment), \ (void *(*) (long)) (chunkfun), \ (void (*) (void *)) (freefun)) #define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \ _obstack_begin_1 ((h), (size), (alignment), \ (void *(*) (void *, long)) (chunkfun), \ (void (*) (void *, void *)) (freefun), (arg)) #define obstack_chunkfun(h, newchunkfun) \ ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun)) #define obstack_freefun(h, newfreefun) \ ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun)) #define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = (achar)) #define obstack_blank_fast(h,n) ((h)->next_free += (n)) #define obstack_memory_used(h) _obstack_memory_used (h) #if defined __GNUC__ && defined __STDC__ && __STDC__ /* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and does not implement __extension__. But that compiler doesn't define __GNUC_MINOR__. */ # if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__) # define __extension__ # endif /* For GNU C, if not -traditional, we can define these macros to compute all args only once without using a global variable. Also, we can avoid using the `temp' slot, to make faster code. */ # define obstack_object_size(OBSTACK) \ __extension__ \ ({ struct obstack const *__o = (OBSTACK); \ (unsigned) (__o->next_free - __o->object_base); }) # define obstack_room(OBSTACK) \ __extension__ \ ({ struct obstack const *__o = (OBSTACK); \ (unsigned) (__o->chunk_limit - __o->next_free); }) # define obstack_make_room(OBSTACK,length) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ int __len = (length); \ if (__o->chunk_limit - __o->next_free < __len) \ _obstack_newchunk (__o, __len); \ (void) 0; }) # define obstack_empty_p(OBSTACK) \ __extension__ \ ({ struct obstack const *__o = (OBSTACK); \ (__o->chunk->prev == 0 \ && __o->next_free == __PTR_ALIGN ((char *) __o->chunk, \ __o->chunk->contents, \ __o->alignment_mask)); }) # define obstack_grow(OBSTACK,where,length) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ int __len = (length); \ if (__o->next_free + __len > __o->chunk_limit) \ _obstack_newchunk (__o, __len); \ memcpy (__o->next_free, where, __len); \ __o->next_free += __len; \ (void) 0; }) # define obstack_grow0(OBSTACK,where,length) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ int __len = (length); \ if (__o->next_free + __len + 1 > __o->chunk_limit) \ _obstack_newchunk (__o, __len + 1); \ memcpy (__o->next_free, where, __len); \ __o->next_free += __len; \ *(__o->next_free)++ = 0; \ (void) 0; }) # define obstack_1grow(OBSTACK,datum) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ if (__o->next_free + 1 > __o->chunk_limit) \ _obstack_newchunk (__o, 1); \ obstack_1grow_fast (__o, datum); \ (void) 0; }) /* These assume that the obstack alignment is good enough for pointers or ints, and that the data added so far to the current object shares that much alignment. */ # define obstack_ptr_grow(OBSTACK,datum) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ if (__o->next_free + sizeof (void *) > __o->chunk_limit) \ _obstack_newchunk (__o, sizeof (void *)); \ obstack_ptr_grow_fast (__o, datum); }) \ # define obstack_int_grow(OBSTACK,datum) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ if (__o->next_free + sizeof (int) > __o->chunk_limit) \ _obstack_newchunk (__o, sizeof (int)); \ obstack_int_grow_fast (__o, datum); }) # define obstack_ptr_grow_fast(OBSTACK,aptr) \ __extension__ \ ({ struct obstack *__o1 = (OBSTACK); \ *(const void **) __o1->next_free = (aptr); \ __o1->next_free += sizeof (const void *); \ (void) 0; }) # define obstack_int_grow_fast(OBSTACK,aint) \ __extension__ \ ({ struct obstack *__o1 = (OBSTACK); \ *(int *) __o1->next_free = (aint); \ __o1->next_free += sizeof (int); \ (void) 0; }) # define obstack_blank(OBSTACK,length) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ int __len = (length); \ if (__o->chunk_limit - __o->next_free < __len) \ _obstack_newchunk (__o, __len); \ obstack_blank_fast (__o, __len); \ (void) 0; }) # define obstack_alloc(OBSTACK,length) \ __extension__ \ ({ struct obstack *__h = (OBSTACK); \ obstack_blank (__h, (length)); \ obstack_finish (__h); }) # define obstack_copy(OBSTACK,where,length) \ __extension__ \ ({ struct obstack *__h = (OBSTACK); \ obstack_grow (__h, (where), (length)); \ obstack_finish (__h); }) # define obstack_copy0(OBSTACK,where,length) \ __extension__ \ ({ struct obstack *__h = (OBSTACK); \ obstack_grow0 (__h, (where), (length)); \ obstack_finish (__h); }) /* The local variable is named __o1 to avoid a name conflict when obstack_blank is called. */ # define obstack_finish(OBSTACK) \ __extension__ \ ({ struct obstack *__o1 = (OBSTACK); \ void *__value = (void *) __o1->object_base; \ if (__o1->next_free == __value) \ __o1->maybe_empty_object = 1; \ __o1->next_free \ = __PTR_ALIGN (__o1->object_base, __o1->next_free, \ __o1->alignment_mask); \ if (__o1->next_free - (char *)__o1->chunk \ > __o1->chunk_limit - (char *)__o1->chunk) \ __o1->next_free = __o1->chunk_limit; \ __o1->object_base = __o1->next_free; \ __value; }) # define obstack_free(OBSTACK, OBJ) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ void *__obj = (OBJ); \ if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit) \ __o->next_free = __o->object_base = (char *)__obj; \ else (obstack_free) (__o, __obj); }) #else /* not __GNUC__ or not __STDC__ */ # define obstack_object_size(h) \ (unsigned) ((h)->next_free - (h)->object_base) # define obstack_room(h) \ (unsigned) ((h)->chunk_limit - (h)->next_free) # define obstack_empty_p(h) \ ((h)->chunk->prev == 0 \ && (h)->next_free == __PTR_ALIGN ((char *) (h)->chunk, \ (h)->chunk->contents, \ (h)->alignment_mask)) /* Note that the call to _obstack_newchunk is enclosed in (..., 0) so that we can avoid having void expressions in the arms of the conditional expression. Casting the third operand to void was tried before, but some compilers won't accept it. */ # define obstack_make_room(h,length) \ ( (h)->temp.tempint = (length), \ (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0)) # define obstack_grow(h,where,length) \ ( (h)->temp.tempint = (length), \ (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0), \ memcpy ((h)->next_free, where, (h)->temp.tempint), \ (h)->next_free += (h)->temp.tempint) # define obstack_grow0(h,where,length) \ ( (h)->temp.tempint = (length), \ (((h)->next_free + (h)->temp.tempint + 1 > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), (h)->temp.tempint + 1), 0) : 0), \ memcpy ((h)->next_free, where, (h)->temp.tempint), \ (h)->next_free += (h)->temp.tempint, \ *((h)->next_free)++ = 0) # define obstack_1grow(h,datum) \ ( (((h)->next_free + 1 > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), 1), 0) : 0), \ obstack_1grow_fast (h, datum)) # define obstack_ptr_grow(h,datum) \ ( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \ obstack_ptr_grow_fast (h, datum)) # define obstack_int_grow(h,datum) \ ( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \ obstack_int_grow_fast (h, datum)) # define obstack_ptr_grow_fast(h,aptr) \ (((const void **) ((h)->next_free += sizeof (void *)))[-1] = (aptr)) # define obstack_int_grow_fast(h,aint) \ (((int *) ((h)->next_free += sizeof (int)))[-1] = (aint)) # define obstack_blank(h,length) \ ( (h)->temp.tempint = (length), \ (((h)->chunk_limit - (h)->next_free < (h)->temp.tempint) \ ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0), \ obstack_blank_fast (h, (h)->temp.tempint)) # define obstack_alloc(h,length) \ (obstack_blank ((h), (length)), obstack_finish ((h))) # define obstack_copy(h,where,length) \ (obstack_grow ((h), (where), (length)), obstack_finish ((h))) # define obstack_copy0(h,where,length) \ (obstack_grow0 ((h), (where), (length)), obstack_finish ((h))) # define obstack_finish(h) \ ( ((h)->next_free == (h)->object_base \ ? (((h)->maybe_empty_object = 1), 0) \ : 0), \ (h)->temp.tempptr = (h)->object_base, \ (h)->next_free \ = __PTR_ALIGN ((h)->object_base, (h)->next_free, \ (h)->alignment_mask), \ (((h)->next_free - (char *) (h)->chunk \ > (h)->chunk_limit - (char *) (h)->chunk) \ ? ((h)->next_free = (h)->chunk_limit) : 0), \ (h)->object_base = (h)->next_free, \ (h)->temp.tempptr) # define obstack_free(h,obj) \ ( (h)->temp.tempint = (char *) (obj) - (char *) (h)->chunk, \ ((((h)->temp.tempint > 0 \ && (h)->temp.tempint < (h)->chunk_limit - (char *) (h)->chunk)) \ ? (int) ((h)->next_free = (h)->object_base \ = (h)->temp.tempint + (char *) (h)->chunk) \ : (((obstack_free) ((h), (h)->temp.tempint + (char *) (h)->chunk), 0), 0))) #endif /* not __GNUC__ or not __STDC__ */ #ifdef __cplusplus } /* C++ */ #endif #endif /* obstack.h */ geomview-1.9.5/src/lib/aclib/obstack.c0000644000175000017500000003456212310110177014475 00000000000000/* obstack.c - subroutines used implicitly by object stack macros Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #ifdef _LIBC # include # include #else # include "obstack.h" #endif /* NOTE BEFORE MODIFYING THIS FILE: This version number must be incremented whenever callers compiled using an old obstack.h can no longer properly call the functions in this obstack.c. */ #define OBSTACK_INTERFACE_VERSION 1 /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself, and the installed library supports the same library interface we do. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #include /* Random thing to get __GNU_LIBRARY__. */ #if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 # include # if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION # define ELIDE_CODE # endif #endif #include #ifndef ELIDE_CODE # if HAVE_INTTYPES_H # include # endif # if HAVE_STDINT_H || defined _LIBC # include # endif /* Determine default alignment. */ union fooround { uintmax_t i; long double d; void *p; }; struct fooalign { char c; union fooround u; }; /* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT. But in fact it might be less smart and round addresses to as much as DEFAULT_ROUNDING. So we prepare for it to do that. */ enum { DEFAULT_ALIGNMENT = offsetof (struct fooalign, u), DEFAULT_ROUNDING = sizeof (union fooround) }; /* When we copy a long block of data, this is the unit to do it with. On some machines, copying successive ints does not work; in such a case, redefine COPYING_UNIT to `long' (if that works) or `char' as a last resort. */ # ifndef COPYING_UNIT # define COPYING_UNIT int # endif /* The functions allocating more room by calling `obstack_chunk_alloc' jump to the handler pointed to by `obstack_alloc_failed_handler'. This can be set to a user defined function which should either abort gracefully or use longjump - but shouldn't return. This variable by default points to the internal function `print_and_abort'. */ static void print_and_abort (void); void (*obstack_alloc_failed_handler) (void) = print_and_abort; /* Exit value used when `print_and_abort' is used. */ # include #if OUTSIDE_GEOMVIEW # ifdef _LIBC int obstack_exit_failure = EXIT_FAILURE; # else # include "exitfail.h" # define obstack_exit_failure exit_failure # endif #else int obstack_exit_failure = 1; #endif # ifdef _LIBC # if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) /* A looong time ago (before 1994, anyway; we're not sure) this global variable was used by non-GNU-C macros to avoid multiple evaluation. The GNU C library still exports it because somebody might use it. */ struct obstack *_obstack_compat; compat_symbol (libc, _obstack_compat, _obstack, GLIBC_2_0); # endif # endif /* Define a macro that either calls functions with the traditional malloc/free calling interface, or calls functions with the mmalloc/mfree interface (that adds an extra first argument), based on the state of use_extra_arg. For free, do not use ?:, since some compilers, like the MIPS compilers, do not allow (expr) ? void : void. */ # define CALL_CHUNKFUN(h, size) \ (((h) -> use_extra_arg) \ ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size))) # define CALL_FREEFUN(h, old_chunk) \ do { \ if ((h) -> use_extra_arg) \ (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ else \ (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \ } while (0) /* Initialize an obstack H for use. Specify chunk size SIZE (0 means default). Objects start on multiples of ALIGNMENT (0 means use default). CHUNKFUN is the function to use to allocate chunks, and FREEFUN the function to free them. Return nonzero if successful, calls obstack_alloc_failed_handler if allocation fails. */ int _obstack_begin (struct obstack *h, int size, int alignment, void *(*chunkfun) (long), void (*freefun) (void *)) { register struct _obstack_chunk *chunk; /* points to new chunk */ if (alignment == 0) alignment = DEFAULT_ALIGNMENT; if (size == 0) /* Default size is what GNU malloc can fit in a 4096-byte block. */ { /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc. Use the values for range checking, because if range checking is off, the extra bytes won't be missed terribly, but if range checking is on and we used a larger request, a whole extra 4096 bytes would be allocated. These number are irrelevant to the new GNU malloc. I suspect it is less sensitive to the size of the request. */ int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)) + 4 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)); size = 4096 - extra; } h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun; h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; h->chunk_size = size; h->alignment_mask = alignment - 1; h->use_extra_arg = 0; chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); if (!chunk) (*obstack_alloc_failed_handler) (); h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents, alignment - 1); h->chunk_limit = chunk->limit = (char *) chunk + h->chunk_size; chunk->prev = 0; /* The initial chunk now contains no empty object. */ h->maybe_empty_object = 0; h->alloc_failed = 0; return 1; } int _obstack_begin_1 (struct obstack *h, int size, int alignment, void *(*chunkfun) (void *, long), void (*freefun) (void *, void *), void *arg) { register struct _obstack_chunk *chunk; /* points to new chunk */ if (alignment == 0) alignment = DEFAULT_ALIGNMENT; if (size == 0) /* Default size is what GNU malloc can fit in a 4096-byte block. */ { /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc. Use the values for range checking, because if range checking is off, the extra bytes won't be missed terribly, but if range checking is on and we used a larger request, a whole extra 4096 bytes would be allocated. These number are irrelevant to the new GNU malloc. I suspect it is less sensitive to the size of the request. */ int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)) + 4 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)); size = 4096 - extra; } h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun; h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; h->chunk_size = size; h->alignment_mask = alignment - 1; h->extra_arg = arg; h->use_extra_arg = 1; chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); if (!chunk) (*obstack_alloc_failed_handler) (); h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents, alignment - 1); h->chunk_limit = chunk->limit = (char *) chunk + h->chunk_size; chunk->prev = 0; /* The initial chunk now contains no empty object. */ h->maybe_empty_object = 0; h->alloc_failed = 0; return 1; } /* Allocate a new current chunk for the obstack *H on the assumption that LENGTH bytes need to be added to the current object, or a new object of length LENGTH allocated. Copies any partial object from the end of the old chunk to the beginning of the new one. */ void _obstack_newchunk (struct obstack *h, int length) { register struct _obstack_chunk *old_chunk = h->chunk; register struct _obstack_chunk *new_chunk; register long new_size; register long obj_size = h->next_free - h->object_base; register long i; long already; char *object_base; /* Compute size for new chunk. */ new_size = (obj_size + length) + (obj_size >> 3) + h->alignment_mask + 100; if (new_size < h->chunk_size) new_size = h->chunk_size; /* Allocate and initialize the new chunk. */ new_chunk = CALL_CHUNKFUN (h, new_size); if (!new_chunk) (*obstack_alloc_failed_handler) (); h->chunk = new_chunk; new_chunk->prev = old_chunk; new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size; /* Compute an aligned object_base in the new chunk */ object_base = __PTR_ALIGN ((char *) new_chunk, new_chunk->contents, h->alignment_mask); /* Move the existing object to the new chunk. Word at a time is fast and is safe if the object is sufficiently aligned. */ if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT) { for (i = obj_size / sizeof (COPYING_UNIT) - 1; i >= 0; i--) ((COPYING_UNIT *)object_base)[i] = ((COPYING_UNIT *)h->object_base)[i]; /* We used to copy the odd few remaining bytes as one extra COPYING_UNIT, but that can cross a page boundary on a machine which does not do strict alignment for COPYING_UNITS. */ already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT); } else already = 0; /* Copy remaining bytes one by one. */ for (i = already; i < obj_size; i++) object_base[i] = h->object_base[i]; /* If the object just copied was the only data in OLD_CHUNK, free that chunk and remove it from the chain. But not if that chunk might contain an empty object. */ if (! h->maybe_empty_object && (h->object_base == __PTR_ALIGN ((char *) old_chunk, old_chunk->contents, h->alignment_mask))) { new_chunk->prev = old_chunk->prev; CALL_FREEFUN (h, old_chunk); } h->object_base = object_base; h->next_free = h->object_base + obj_size; /* The new chunk certainly contains no empty object yet. */ h->maybe_empty_object = 0; } # ifdef _LIBC libc_hidden_def (_obstack_newchunk) # endif /* Return nonzero if object OBJ has been allocated from obstack H. This is here for debugging. If you use it in a program, you are probably losing. */ /* Suppress -Wmissing-prototypes warning. We don't want to declare this in obstack.h because it is just for debugging. */ int _obstack_allocated_p (struct obstack *h, void *obj); int _obstack_allocated_p (struct obstack *h, void *obj) { register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ register struct _obstack_chunk *plp; /* point to previous chunk if any */ lp = (h)->chunk; /* We use >= rather than > since the object cannot be exactly at the beginning of the chunk but might be an empty object exactly at the end of an adjacent chunk. */ while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj)) { plp = lp->prev; lp = plp; } return lp != 0; } /* Free objects in obstack H, including OBJ and everything allocate more recently than OBJ. If OBJ is zero, free everything in H. */ # undef obstack_free void obstack_free (struct obstack *h, void *obj) { register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ register struct _obstack_chunk *plp; /* point to previous chunk if any */ lp = h->chunk; /* We use >= because there cannot be an object at the beginning of a chunk. But there can be an empty object at that address at the end of another chunk. */ while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj)) { plp = lp->prev; CALL_FREEFUN (h, lp); lp = plp; /* If we switch chunks, we can't tell whether the new current chunk contains an empty object, so assume that it may. */ h->maybe_empty_object = 1; } if (lp) { h->object_base = h->next_free = (char *) (obj); h->chunk_limit = lp->limit; h->chunk = lp; } else if (obj != 0) /* obj is not in any of the chunks! */ abort (); } # ifdef _LIBC /* Older versions of libc used a function _obstack_free intended to be called by non-GCC compilers. */ strong_alias (obstack_free, _obstack_free) # endif int _obstack_memory_used (struct obstack *h) { register struct _obstack_chunk* lp; register int nbytes = 0; for (lp = h->chunk; lp != 0; lp = lp->prev) { nbytes += lp->limit - (char *) lp; } return nbytes; } #if OUTSIDE_GEOMVIEW /* Define the error handler. */ # ifdef _LIBC # include # else # include "gettext.h" # endif # ifndef _ # define _(msgid) gettext (msgid) # endif #else # ifndef _ # define _(msgid) msgid # endif #endif # ifdef _LIBC # include # endif # ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) # define __attribute__(Spec) /* empty */ # endif # endif static void __attribute__ ((noreturn)) print_and_abort (void) { /* Don't change any of these strings. Yes, it would be possible to add the newline to the string and use fputs or so. But this must not happen because the "memory exhausted" message appears in other places like this and the translation should be reused instead of creating a very similar string which requires a separate translation. */ # ifdef _LIBC (void) __fxprintf (NULL, "%s\n", _("memory exhausted")); # else fprintf (stderr, "%s\n", _("memory exhausted")); # endif exit (obstack_exit_failure); } #endif /* !ELIDE_CODE */ geomview-1.9.5/src/lib/aclib/acosh.c0000644000175000017500000000262612310110177014140 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include /* HP-UX native cc does have finite() and acosh() in its library, * but gcc (at least our 2.5.8) doesn't find it there. */ double acosh(double c) { /* cosh(x) = (e^x + e^-x)/2 * u = e^x * u^2 - 2c u + 1 = 0 * u = c +/- sqrt(c^2 - 1) */ return log(c + sqrt(c*c - 1)); } geomview-1.9.5/src/lib/aclib/stat.c0000644000175000017500000000307612310110177014016 00000000000000/* Copyright (C) 2006 Claus-Justus Heine. * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #undef stat #undef fstat #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_ERRNO_H # include #endif #if !HAVE_DECL_ERRNO extern int errno; #endif #ifndef ENOENT # define ENOENT 255 #endif #ifndef ENOSYS # define ENOSYS 255 #endif int gv_stat(const char *path, struct stat *buf) { #if HAVE_LSTAT_EMPTY_STRING_BUG if (path == NULL || *path == '\0') { errno = ENOENT; return -1; } #endif #if HAVE_STAT return stat(path, buf); #else errno = ENOSYS; return -1; #endif } int gv_fstat(int fd, struct stat *buf) { #if HAVE_FSTAT return fstat(fd, buf); #else errno = ENOSYS; return -1; #endif } geomview-1.9.5/src/lib/aclib/alloca.c0000644000175000017500000003332012310110177014271 00000000000000/* alloca.c -- allocate automatically reclaimed memory (Mostly) portable public-domain implementation -- D A Gwyn This implementation of the PWB library alloca function, which is used to allocate space off the run-time stack so that it is automatically reclaimed upon procedure exit, was inspired by discussions with J. Q. Johnson of Cornell. J.Otto Tennant contributed the Cray support. There are some preprocessor constants that can be defined when compiling for your specific system, for improved efficiency; however, the defaults should be okay. The general concept of this implementation is to keep track of all alloca-allocated blocks, and reclaim any that are found to be deeper in the stack than the current invocation. This heuristic does not reclaim storage as soon as it becomes invalid, but it will do so eventually. As a special case, alloca(0) reclaims storage without allocating any. It is a good idea to use alloca(0) in your main control loop, etc. to force garbage collection. */ /* @deftypefn Replacement void* alloca (size_t @var{size}) This function allocates memory which will be automatically reclaimed after the procedure exits. The @libib{} implementation does not free the memory immediately but will do so eventually during subsequent calls to this function. Memory is allocated using @code{xmalloc} under normal circumstances. The header file @file{alloca-conf.h} can be used in conjunction with the GNU Autoconf test @code{AC_FUNC_ALLOCA} to test for and properly make available this function. The @code{AC_FUNC_ALLOCA} test requires that client code use a block of preprocessor code to be safe (see the Autoconf manual for more); this header incorporates that logic and more, including the possibility of a GCC built-in function. @end deftypefn */ #ifdef HAVE_CONFIG_H #include #endif #include #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_STDLIB_H #include #endif /* These variables are used by the ASTRDUP implementation that relies on C_alloca. */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ const char *libiberty_optr; char *libiberty_nptr; unsigned long libiberty_len; #ifdef __cplusplus } #endif /* __cplusplus */ /* If your stack is a linked list of frames, you have to provide an "address metric" ADDRESS_FUNCTION macro. */ #if defined (CRAY) && defined (CRAY_STACKSEG_END) static long i00afunc (); #define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) #else #define ADDRESS_FUNCTION(arg) &(arg) #endif #ifndef NULL #define NULL 0 #endif /* Define STACK_DIRECTION if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #ifndef STACK_DIRECTION #define STACK_DIRECTION 0 /* Direction unknown. */ #endif #if STACK_DIRECTION != 0 #define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ #else /* STACK_DIRECTION == 0; need run-time code. */ static int stack_dir; /* 1 or -1 once known. */ #define STACK_DIR stack_dir static void find_stack_direction (void) { static char *addr = NULL; /* Address of first `dummy', once known. */ auto char dummy; /* To get stack address. */ if (addr == NULL) { /* Initial entry. */ addr = ADDRESS_FUNCTION (dummy); find_stack_direction (); /* Recurse once. */ } else { /* Second entry. */ if (ADDRESS_FUNCTION (dummy) > addr) stack_dir = 1; /* Stack grew upward. */ else stack_dir = -1; /* Stack grew downward. */ } } #endif /* STACK_DIRECTION == 0 */ /* An "alloca header" is used to: (a) chain together all alloca'ed blocks; (b) keep track of stack depth. It is very important that sizeof(header) agree with malloc alignment chunk size. The following default should work okay. */ #ifndef ALIGN_SIZE #define ALIGN_SIZE sizeof(double) #endif typedef union hdr { char align[ALIGN_SIZE]; /* To force sizeof(header). */ struct { union hdr *next; /* For chaining headers. */ char *deep; /* For stack depth measure. */ } h; } header; static header *last_alloca_header = NULL; /* -> last alloca header. */ /* Return a pointer to at least SIZE bytes of storage, which will be automatically reclaimed upon exit from the procedure that called alloca. Originally, this space was supposed to be taken from the current stack frame of the caller, but that method cannot be made to work for some implementations of C, for example under Gould's UTX/32. */ /* @undocumented C_alloca */ PTR C_alloca (size_t size) { auto char probe; /* Probes stack depth: */ char *depth = ADDRESS_FUNCTION (probe); #if STACK_DIRECTION == 0 if (STACK_DIR == 0) /* Unknown growth direction. */ find_stack_direction (); #endif /* Reclaim garbage, defined as all alloca'd storage that was allocated from deeper in the stack than currently. */ { header *hp; /* Traverses linked list. */ for (hp = last_alloca_header; hp != NULL;) if ((STACK_DIR > 0 && hp->h.deep > depth) || (STACK_DIR < 0 && hp->h.deep < depth)) { header *np = hp->h.next; free ((PTR) hp); /* Collect garbage. */ hp = np; /* -> next header. */ } else break; /* Rest are not deeper. */ last_alloca_header = hp; /* -> last valid storage. */ } if (size == 0) return NULL; /* No allocation required. */ /* Allocate combined header + user data storage. */ { void *new_storage = XNEWVEC (char, sizeof (header) + size); /* Address of header. */ if (new_storage == 0) abort(); ((header *) new_storage)->h.next = last_alloca_header; ((header *) new_storage)->h.deep = depth; last_alloca_header = (header *) new_storage; /* User storage begins just after header. */ return (PTR) ((char *) new_storage + sizeof (header)); } } #if defined (CRAY) && defined (CRAY_STACKSEG_END) #ifdef DEBUG_I00AFUNC #include #endif #ifndef CRAY_STACK #define CRAY_STACK #ifndef CRAY2 /* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ struct stack_control_header { long shgrow:32; /* Number of times stack has grown. */ long shaseg:32; /* Size of increments to stack. */ long shhwm:32; /* High water mark of stack. */ long shsize:32; /* Current size of stack (all segments). */ }; /* The stack segment linkage control information occurs at the high-address end of a stack segment. (The stack grows from low addresses to high addresses.) The initial part of the stack segment linkage control information is 0200 (octal) words. This provides for storage for the routine which overflows the stack. */ struct stack_segment_linkage { long ss[0200]; /* 0200 overflow words. */ long sssize:32; /* Number of words in this segment. */ long ssbase:32; /* Offset to stack base. */ long:32; long sspseg:32; /* Offset to linkage control of previous segment of stack. */ long:32; long sstcpt:32; /* Pointer to task common address block. */ long sscsnm; /* Private control structure number for microtasking. */ long ssusr1; /* Reserved for user. */ long ssusr2; /* Reserved for user. */ long sstpid; /* Process ID for pid based multi-tasking. */ long ssgvup; /* Pointer to multitasking thread giveup. */ long sscray[7]; /* Reserved for Cray Research. */ long ssa0; long ssa1; long ssa2; long ssa3; long ssa4; long ssa5; long ssa6; long ssa7; long sss0; long sss1; long sss2; long sss3; long sss4; long sss5; long sss6; long sss7; }; #else /* CRAY2 */ /* The following structure defines the vector of words returned by the STKSTAT library routine. */ struct stk_stat { long now; /* Current total stack size. */ long maxc; /* Amount of contiguous space which would be required to satisfy the maximum stack demand to date. */ long high_water; /* Stack high-water mark. */ long overflows; /* Number of stack overflow ($STKOFEN) calls. */ long hits; /* Number of internal buffer hits. */ long extends; /* Number of block extensions. */ long stko_mallocs; /* Block allocations by $STKOFEN. */ long underflows; /* Number of stack underflow calls ($STKRETN). */ long stko_free; /* Number of deallocations by $STKRETN. */ long stkm_free; /* Number of deallocations by $STKMRET. */ long segments; /* Current number of stack segments. */ long maxs; /* Maximum number of stack segments so far. */ long pad_size; /* Stack pad size. */ long current_address; /* Current stack segment address. */ long current_size; /* Current stack segment size. This number is actually corrupted by STKSTAT to include the fifteen word trailer area. */ long initial_address; /* Address of initial segment. */ long initial_size; /* Size of initial segment. */ }; /* The following structure describes the data structure which trails any stack segment. I think that the description in 'asdef' is out of date. I only describe the parts that I am sure about. */ struct stk_trailer { long this_address; /* Address of this block. */ long this_size; /* Size of this block (does not include this trailer). */ long unknown2; long unknown3; long link; /* Address of trailer block of previous segment. */ long unknown5; long unknown6; long unknown7; long unknown8; long unknown9; long unknown10; long unknown11; long unknown12; long unknown13; long unknown14; }; #endif /* CRAY2 */ #endif /* not CRAY_STACK */ #ifdef CRAY2 /* Determine a "stack measure" for an arbitrary ADDRESS. I doubt that "lint" will like this much. */ static long i00afunc (long *address) { struct stk_stat status; struct stk_trailer *trailer; long *block, size; long result = 0; /* We want to iterate through all of the segments. The first step is to get the stack status structure. We could do this more quickly and more directly, perhaps, by referencing the $LM00 common block, but I know that this works. */ STKSTAT (&status); /* Set up the iteration. */ trailer = (struct stk_trailer *) (status.current_address + status.current_size - 15); /* There must be at least one stack segment. Therefore it is a fatal error if "trailer" is null. */ if (trailer == 0) abort (); /* Discard segments that do not contain our argument address. */ while (trailer != 0) { block = (long *) trailer->this_address; size = trailer->this_size; if (block == 0 || size == 0) abort (); trailer = (struct stk_trailer *) trailer->link; if ((block <= address) && (address < (block + size))) break; } /* Set the result to the offset in this segment and add the sizes of all predecessor segments. */ result = address - block; if (trailer == 0) { return result; } do { if (trailer->this_size <= 0) abort (); result += trailer->this_size; trailer = (struct stk_trailer *) trailer->link; } while (trailer != 0); /* We are done. Note that if you present a bogus address (one not in any segment), you will get a different number back, formed from subtracting the address of the first block. This is probably not what you want. */ return (result); } #else /* not CRAY2 */ /* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. Determine the number of the cell within the stack, given the address of the cell. The purpose of this routine is to linearize, in some sense, stack addresses for alloca. */ static long i00afunc (long address) { long stkl = 0; long size, pseg, this_segment, stack; long result = 0; struct stack_segment_linkage *ssptr; /* Register B67 contains the address of the end of the current stack segment. If you (as a subprogram) store your registers on the stack and find that you are past the contents of B67, you have overflowed the segment. B67 also points to the stack segment linkage control area, which is what we are really interested in. */ stkl = CRAY_STACKSEG_END (); ssptr = (struct stack_segment_linkage *) stkl; /* If one subtracts 'size' from the end of the segment, one has the address of the first word of the segment. If this is not the first segment, 'pseg' will be nonzero. */ pseg = ssptr->sspseg; size = ssptr->sssize; this_segment = stkl - size; /* It is possible that calling this routine itself caused a stack overflow. Discard stack segments which do not contain the target address. */ while (!(this_segment <= address && address <= stkl)) { #ifdef DEBUG_I00AFUNC fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); #endif if (pseg == 0) break; stkl = stkl - pseg; ssptr = (struct stack_segment_linkage *) stkl; size = ssptr->sssize; pseg = ssptr->sspseg; this_segment = stkl - size; } result = address - this_segment; /* If you subtract pseg from the current end of the stack, you get the address of the previous stack segment's end. This seems a little convoluted to me, but I'll bet you save a cycle somewhere. */ while (pseg != 0) { #ifdef DEBUG_I00AFUNC fprintf (stderr, "%011o %011o\n", pseg, size); #endif stkl = stkl - pseg; ssptr = (struct stack_segment_linkage *) stkl; size = ssptr->sssize; pseg = ssptr->sspseg; result += size; } return (result); } #endif /* not CRAY2 */ #endif /* CRAY */ geomview-1.9.5/src/lib/aclib/Headers0000644000175000017500000000001212310110177014160 00000000000000obstack.h geomview-1.9.5/src/bin/0000755000175000017500000000000012310165604011706 500000000000000geomview-1.9.5/src/bin/Makefile.in0000644000175000017500000004742212310165551013705 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir 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 DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = geomview togeomview geomutil animate clipboard gvclock nose all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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" cscopelist: cscopelist-recursive 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am 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 \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/bin/Makefile.am0000644000175000017500000000010612310110177013652 00000000000000SUBDIRS = geomview togeomview geomutil animate clipboard gvclock nose geomview-1.9.5/src/bin/ChangeLog0000644000175000017500000001171612310110177013401 000000000000002006-08-01 Steve M. Robbins * geomutil/plutil/offconsol.1: Fix manpage section. 2006-07-31 Steve M. Robbins * stereo/stereo.c: Make usage of "/usr/gfx/setmon" conditional on that binary existing; it is an irix-specific program. * flythrough/main.c: * hinge/hui.c: Rename getline() to gv_getline() to avoid clash with standard C library function. * example/oogl.c: Remove unused method getline(). 2002-10-26 Steve M. Robbins * animate/glob.c: Add !defined(__CYGWIN__) to condition. * bin/geomutil/math2oogl/math2oogl.c: * bin/geomview/common/comm.c: * bin/geomview/common/lang.c: * bin/geomview/x11/gvcamui.c: * bin/geomview/x11/gvevent.c: * bin/geomview/x11/gvmain.c: * bin/geomview/x11/gvui.c: * bin/stereo/stereo.c: * bin/togeomview/togeomview.c: * lib/oogl/util/glob.c: Include rather than to get SIG_DFL defines. 2002-04-13 Steve M. Robbins * geomutil/math2oogl/math2oogl.c: Add __unix__ to list of CPP symbols used to detect unix systems. 2001-06-04 Mark Phillips * geomutil/oogl2vrml/oogl2vrml.c: fixed segmentation fault bug 2001-02-28 Steve M. Robbins * geomutil/math2oogl/Makefile.am (EXTRA_DIST): * geomutil/oogl2rib/Makefile.am (EXTRA_DIST): * geomutil/oogl2vrml/Makefile.am (EXTRA_DIST): * geomutil/plutil/Makefile.am (EXTRA_DIST): * geomutil/vrml2oogl/Makefile.am (EXTRA_DIST): Distribute man_MANS. * geomutil/vrml2oogl/vrml2oogl.1: New. * geomutil/vrml2oogl/Makefile.am (man_MANS): Install vrml2oogl.1. * geomutil/oogl2vrml/oogl2vrml.1: New. * geomutil/oogl2vrml/Makefile.am (man_MANS): Install oogl2vrml.1. * geomutil/oogl2rib/oogl2rib.1: New. * geomutil/oogl2rib/Makefile.am (man_MANS): Install oogl2rib.1. * geomutil/math2oogl/math2oogl.1: New. * geomutil/math2oogl/Makefile.am (man_MANS): Install math2oogl.1. * geomutil/plutil/bez2mesh.1: New. * geomutil/plutil/Makefile.am (man_MANS): Install bez2mesh.1. 2001-02-22 Steve M. Robbins * togeomview/togeomview.c: Include config.h. 2001-02-21 Steve M. Robbins * geomview/common/comm.c (emodule_run): * togeomview/togeomview.c (start_gv): * geomutil/math2oogl/math2oogl.c (start_gv): Use SETPGRP_VOID. 2000-11-23 Steve Robbins * geomview/x11/Makefile.am: install "gvx" in moduledir, not bindir. 2000-11-17 Mark Phillips * added 'togeomview' utility program to distribution (in src/bin/togeomview) 2000-11-15 Mark Phillips * src/bin/geomview/x11: removed clang.h from CVS since it's a derived file (clang.c, also derived, apparently wasn't in CVS). Also, btw, clang.[ch] are now built in src/bin/geomview not src/bin/geomview/x11 (see comments from stever below). * Makefile.am: split SUBDIRS into DIST_SUBDIRS and $(src_bin_module_subdirs), which is now set by the top-level configure script. 2000-11-05 Steve Robbins * geomutil/bdy/Makefile.am (drawbdy): Put $(moduledir) on PATH, not $(exec_prefix)/bin. (CLEANFILES): Clean up the generated script. * geomview/x11/Makefile.am: * geomview/common/Makefile.am: Removed the complicated cross-directory dependency rules. Build "clang.c" and "clang.h" in the geomview directory before building either subdirectory. Make "x11/buildinfo.c" depend on $(gvx_OBJECTS), rather than "_always", to prevent recompilation during "make install". Removed "clang.h" from gvx_SOURCES, since it is no longer built in the "x11" subdirectory. * geomutil/ucd/Makefile.am (man_MANS): * geomutil/plutil/Makefile.am (man_MANS): * geomutil/clip/Makefile.am (man_MANS): * geomutil/bdy/Makefile.am (man_MANS): * geomview/Makefile.am (man_MANS): Install manpages. * maniview/Makefile.am (datagroupsdir): Default the value from $geomdatadir. 2000-11-04 Steve Robbins * transformer/Makefile.am: * tackdown/Makefile.am: * sweep/Makefile.am: * stereo/Makefile.am: * maniview/Makefile.am: * hinge/Makefile.am: * graffiti/Makefile.am: * ginsu/Makefile.am: * geomutil/bdy/Makefile.am: * flythrough/Makefile.am: * example/Makefile.am: * cplxview/Makefile.am: * animate/Makefile.am: Install modules into moduledir. Treat .geomview-* files as data, not scripts. 2000-10-29 Steve Robbins * geomutil/bdy/Makefile.am (drawbdy): * geomutil/vrml2oogl/Makefile.am (INCLUDES): * geomview/x11/Makefile.am (clang): Use $srcdir when referring to directories in source hierarchy. * geomview/common/Makefile.am (INCLUDES): Add both ../x11 (for generated `clang.c' file), and $srcdir/../x11 (for `clang.h' file) to include path. * geomutil/bdy/Makefile.am (install-geomview-dotfile): * animate/Makefile.am (install-geomview-dotfile): Refer to script `mkmodulesdir' using $top_srcdir. geomview-1.9.5/src/bin/geomview/0000755000175000017500000000000012310165603013527 500000000000000geomview-1.9.5/src/bin/geomview/Makefile.in0000644000175000017500000005613512310165552015531 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/geomview DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir 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 DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . common x11 man_MANS = geomview.1gv EXTRA_DIST = clang.c clang.h $(man_MANS) DISTCLEANFILES = clang.c clang.h all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomview/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomview/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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" cscopelist: cscopelist-recursive 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(MANS) all-local installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-man install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ check check-am clean clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-man uninstall-man1 all-local: clang clang.c clang.h clang: $(top_srcdir)/src/lib/oogl/lisp/lisp2c -cprefix "gv_" -o clang $(srcdir)/common/*.c $(srcdir)/x11/*.c # 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: geomview-1.9.5/src/bin/geomview/Makefile.am0000644000175000017500000000041512310110177015477 00000000000000SUBDIRS = . common x11 man_MANS = geomview.1gv EXTRA_DIST = clang.c clang.h $(man_MANS) all-local: clang clang.c clang.h clang: $(top_srcdir)/src/lib/oogl/lisp/lisp2c -cprefix "gv_" -o clang $(srcdir)/common/*.c $(srcdir)/x11/*.c DISTCLEANFILES = clang.c clang.h geomview-1.9.5/src/bin/geomview/clang.c0000644000175000017500000010423212310162251014675 00000000000000void gv_setenv(char * a1, char * a2) { LObject *val = LEvalFunc("setenv", LSTRING, a1, LSTRING, a2, LEND); LFree(val); } void gv_input_translator(char * a1, char * a2) { LObject *val = LEvalFunc("input-translator", LSTRING, a1, LSTRING, a2, LEND); LFree(val); } void gv_emodule_run(char * a1) { LObject *val = LEvalFunc("emodule-run", LSTRINGS, a1, LEND); LFree(val); } void gv_emodule_isrunning(char * a1) { LObject *val = LEvalFunc("emodule-isrunning", LSTRING, a1, LEND); LFree(val); } void gv_command(char * a1, char * a2) { LObject *val = LEvalFunc("command", LSTRING, a1, LSTRING, a2, LEND); LFree(val); } void gv_sleep_for(float a1) { LObject *val = LEvalFunc("sleep-for", LFLOAT, a1, LEND); LFree(val); } float gv_sleep_until(float a1) { LObject *val = LEvalFunc("sleep-until", LFLOAT, a1, LEND); float retval; LFROMOBJ(LFLOAT)(val, &retval); LFree(val); return retval; } void gv_set_clock(float a1) { LObject *val = LEvalFunc("set-clock", LFLOAT, a1, LEND); LFree(val); } void gv_clock() { LObject *val = LEvalFunc("clock", LEND); LFree(val); } void gv_echo(LList * a1) { LObject *val = LEvalFunc("echo", LREST, a1, LEND); LFree(val); } void gv_emodule_transmit(char * a1, LList * a2) { LObject *val = LEvalFunc("emodule-transmit", LSTRING, a1, LREST, a2, LEND); LFree(val); } int gv_load(char * a1, char * a2) { LObject *val = LEvalFunc("load", LSTRING, a1, LSTRING, a2, LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } void gv_hdelete(char * a1, char * a2) { LObject *val = LEvalFunc("hdelete", LSTRING, a1, LSTRING, a2, LEND); LFree(val); } void gv_name_object(int a1, char * a2) { LObject *val = LEvalFunc("name-object", LID, a1, LSTRING, a2, LEND); LFree(val); } void gv_update_draw(int a1, float a2) { LObject *val = LEvalFunc("update-draw", LID, a1, LFLOAT, a2, LEND); LFree(val); } void gv_draw(int a1) { LObject *val = LEvalFunc("draw", LID, a1, LEND); LFree(val); } void gv_update(float a1) { LObject *val = LEvalFunc("update", LFLOAT, a1, LEND); LFree(val); } void gv_redraw(int a1) { LObject *val = LEvalFunc("redraw", LID, a1, LEND); LFree(val); } void gv_freeze(int a1, int a2) { LObject *val = LEvalFunc("freeze", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_xform_set(int a1, TransformStruct * a2) { LObject *val = LEvalFunc("xform-set", LID, a1, LTRANSFORM, a2, LEND); LFree(val); } void gv_xform(int a1, TransformStruct * a2) { LObject *val = LEvalFunc("xform", LID, a1, LTRANSFORM, a2, LEND); LFree(val); } void gv_xform_incr(int a1, TransformStruct * a2) { LObject *val = LEvalFunc("xform-incr", LID, a1, LTRANSFORM, a2, LEND); LFree(val); } int gv_new_camera(char * a1, CameraStruct * a2) { LObject *val = LEvalFunc("new-camera", LSTRING, a1, LCAMERA, a2, LEND); int retval; LFROMOBJ(LID)(val, &retval); LFree(val); return retval; } int gv_camera(char * a1, CameraStruct * a2) { LObject *val = LEvalFunc("camera", LSTRING, a1, LCAMERA, a2, LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } void gv_camera_reset(int a1) { LObject *val = LEvalFunc("camera-reset", LID, a1, LEND); LFree(val); } int gv_new_alien(char * a1, GeomStruct * a2) { LObject *val = LEvalFunc("new-alien", LSTRING, a1, LGEOM, a2, LEND); int retval; LFROMOBJ(LID)(val, &retval); LFree(val); return retval; } int gv_new_geometry(char * a1, GeomStruct * a2) { LObject *val = LEvalFunc("new-geometry", LSTRING, a1, LGEOM, a2, LEND); int retval; LFROMOBJ(LID)(val, &retval); LFree(val); return retval; } void gv_geometry(char * a1, GeomStruct * a2) { LObject *val = LEvalFunc("geometry", LSTRING, a1, LGEOM, a2, LEND); LFree(val); } void gv_replace_geometry(char * a1, int *a2, int a2n, GeomStruct * a3) { LObject *val = LEvalFunc("replace-geometry", LSTRING, a1, LARRAY, LINT, a2, a2n, LGEOM, a3, LEND); LFree(val); } void gv_copy(int a1, char * a2) { LObject *val = LEvalFunc("copy", LID, a1, LSTRING, a2, LEND); LFree(val); } void gv_delete(int a1) { LObject *val = LEvalFunc("delete", LID, a1, LEND); LFree(val); } void gv_scene(int a1, GeomStruct * a2) { LObject *val = LEvalFunc("scene", LID, a1, LGEOM, a2, LEND); LFree(val); } void gv_winenter(int a1) { LObject *val = LEvalFunc("winenter", LID, a1, LEND); LFree(val); } void gv_merge_ap(int a1, ApStruct * a2) { LObject *val = LEvalFunc("merge-ap", LID, a1, LAP, a2, LEND); LFree(val); } void gv_dice(int a1, int a2) { LObject *val = LEvalFunc("dice", LID, a1, LINT, a2, LEND); LFree(val); } void gv_bbox_draw(int a1, int a2) { LObject *val = LEvalFunc("bbox-draw", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_camera_draw(int a1, int a2) { LObject *val = LEvalFunc("camera-draw", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_evert(int a1, int a2) { LObject *val = LEvalFunc("evert", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_soft_shader(int a1, int a2) { LObject *val = LEvalFunc("soft-shader", LID, a1, LKEYWORD, a2, LEND); LFree(val); } LList * gv_stereowin(int a1, int a2, int a3) { LObject *val = LEvalFunc("stereowin", LID, a1, LKEYWORD, a2, LINT, a3, LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } void gv_space(int a1) { LObject *val = LEvalFunc("space", LKEYWORD, a1, LEND); LFree(val); } void gv_hmodel(int a1, int a2) { LObject *val = LEvalFunc("hmodel", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_inhibit_warning(char * a1) { LObject *val = LEvalFunc("inhibit-warning", LSTRING, a1, LEND); LFree(val); } void gv_hsphere_draw(int a1, int a2) { LObject *val = LEvalFunc("hsphere-draw", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_pickable(int a1, int a2) { LObject *val = LEvalFunc("pickable", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_normalization(int a1, int a2) { LObject *val = LEvalFunc("normalization", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_lines_closer(int a1, float a2) { LObject *val = LEvalFunc("lines-closer", LID, a1, LFLOAT, a2, LEND); LFree(val); } void gv_backcolor(int a1, float a2, float a3, float a4) { LObject *val = LEvalFunc("backcolor", LID, a1, LFLOAT, a2, LFLOAT, a3, LFLOAT, a4, LEND); LFree(val); } void gv_bbox_color(int a1, float a2, float a3, float a4) { LObject *val = LEvalFunc("bbox-color", LID, a1, LFLOAT, a2, LFLOAT, a3, LFLOAT, a4, LEND); LFree(val); } void gv_window(int a1, WindowStruct * a2) { LObject *val = LEvalFunc("window", LID, a1, LWINDOW, a2, LEND); LFree(val); } void gv_merge_baseap(ApStruct * a1) { LObject *val = LEvalFunc("merge-baseap", LAP, a1, LEND); LFree(val); } void gv_exit() { LObject *val = LEvalFunc("exit", LEND); LFree(val); } void gv_set_motionscale(float a1) { LObject *val = LEvalFunc("set-motionscale", LFLOAT, a1, LEND); LFree(val); } void gv_set_conformal_refine(float a1, int a2, int a3) { LObject *val = LEvalFunc("set-conformal-refine", LFLOAT, a1, LINT, a2, LKEYWORD, a3, LEND); LFree(val); } void gv_write_comments(char * a1, int a2, int *a3, int a3n) { LObject *val = LEvalFunc("write-comments", LSTRING, a1, LID, a2, LARRAY, LINT, a3, a3n, LEND); LFree(val); } void gv_event_mode(char * a1) { LObject *val = LEvalFunc("event-mode", LSTRING, a1, LEND); LFree(val); } void gv_pick_invisible(int a1) { LObject *val = LEvalFunc("pick-invisible", LKEYWORD, a1, LEND); LFree(val); } void gv_rawevent(int a1, int a2, int a3, int a4, long a5) { LObject *val = LEvalFunc("rawevent", LINT, a1, LINT, a2, LINT, a3, LINT, a4, LLONG, a5, LEND); LFree(val); } int gv_rawpick(int a1, int a2, int a3) { LObject *val = LEvalFunc("rawpick", LID, a1, LINT, a2, LINT, a3, LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } void gv_pick(int a1, int a2, float *a3, int a3n, float *a4, int a4n, float *a5, int a5n, float *a6, int a6n, int *a7, int a7n, int a8, int *a9, int a9n, int a10) { LObject *val = LEvalFunc("pick", LID, a1, LID, a2, LVARARRAY, LFLOAT, a3, a3n, LVARARRAY, LFLOAT, a4, a4n, LVARARRAY, LFLOAT, a5, a5n, LVARARRAY, LFLOAT, a6, a6n, LVARARRAY, LINT, a7, a7n, LINT, a8, LARRAY, LINT, a9, a9n, LINT, a10, LEND); LFree(val); } void gv_event_keys(int a1) { LObject *val = LEvalFunc("event-keys", LKEYWORD, a1, LEND); LFree(val); } void gv_event_pick(int a1) { LObject *val = LEvalFunc("event-pick", LKEYWORD, a1, LEND); LFree(val); } void gv_dither(int a1, int a2) { LObject *val = LEvalFunc("dither", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_ui_html_browser(char * a1) { LObject *val = LEvalFunc("ui-html-browser", LSTRING, a1, LEND); LFree(val); } void gv_ui_pdf_viewer(char * a1) { LObject *val = LEvalFunc("ui-pdf-viewer", LSTRING, a1, LEND); LFree(val); } void gv_shell(char * a1) { LObject *val = LEvalFunc("shell", LSTRINGS, a1, LEND); LFree(val); } void gv_write_sexpr(char * a1, LObject * a2) { LObject *val = LEvalFunc("write-sexpr", LSTRING, a1, LLOBJECT, a2, LEND); LFree(val); } void gv_write_handle(char * a1, char * a2, char * a3) { LObject *val = LEvalFunc("write-handle", LSTRING, a1, LSTRING, a2, LSTRING, a3, LEND); LFree(val); } void gv_dump_handles() { LObject *val = LEvalFunc("dump-handles", LEND); LFree(val); } void gv_dump_pools() { LObject *val = LEvalFunc("dump-pools", LEND); LFree(val); } char * gv_geomview_version() { LObject *val = LEvalFunc("geomview-version", LEND); char * retval; LFROMOBJ(LSTRING)(val, &retval); LFree(val); return retval; } void gv_rib_display(int a1, char * a2) { LObject *val = LEvalFunc("rib-display", LKEYWORD, a1, LSTRING, a2, LEND); LFree(val); } void gv_rib_snapshot(int a1, char * a2) { LObject *val = LEvalFunc("rib-snapshot", LID, a1, LSTRING, a2, LEND); LFree(val); } LList * gv_ND_axes(char * a1, char * a2, int a3, int a4, int a5, int a6) { LObject *val = LEvalFunc("ND-axes", LSTRING, a1, LSTRING, a2, LINT, a3, LINT, a4, LINT, a5, LINT, a6, LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } LList * gv_dimension(int a1) { LObject *val = LEvalFunc("dimension", LINT, a1, LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } TmNStruct * gv_ND_xform(int a1, TmNStruct * a2) { LObject *val = LEvalFunc("ND-xform", LID, a1, LTRANSFORMN, a2, LEND); TmNStruct * retval; LFROMOBJ(LTRANSFORMN)(val, &retval); LFree(val); return retval; } TmNStruct * gv_ND_xform_set(int a1, TmNStruct * a2) { LObject *val = LEvalFunc("ND-xform-set", LID, a1, LTRANSFORMN, a2, LEND); TmNStruct * retval; LFROMOBJ(LTRANSFORMN)(val, &retval); LFree(val); return retval; } TmNStruct * gv_ND_xform_get(int a1, int a2) { LObject *val = LEvalFunc("ND-xform-get", LID, a1, LID, a2, LEND); TmNStruct * retval; LFROMOBJ(LTRANSFORMN)(val, &retval); LFree(val); return retval; } LList * gv_ND_color(int a1, LList * a2) { LObject *val = LEvalFunc("ND-color", LID, a1, LLIST, a2, LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } void gv_zoom(int a1, float a2) { LObject *val = LEvalFunc("zoom", LID, a1, LFLOAT, a2, LEND); LFree(val); } void gv_ezoom(int a1, float a2) { LObject *val = LEvalFunc("ezoom", LID, a1, LFLOAT, a2, LEND); LFree(val); } void gv_scale(int a1, float a2, float a3, float a4) { LObject *val = LEvalFunc("scale", LID, a1, LFLOAT, a2, LFLOAT, a3, LFLOAT, a4, LEND); LFree(val); } void gv_escale(int a1, float a2) { LObject *val = LEvalFunc("escale", LID, a1, LFLOAT, a2, LEND); LFree(val); } char * gv_real_id(char * a1) { LObject *val = LEvalFunc("real-id", LSTRING, a1, LEND); char * retval; LFROMOBJ(LSTRING)(val, &retval); LFree(val); return retval; } void gv_transform(int a1, int a2, int a3, int a4, float a5, float a6, float a7, float a8, int a9) { LObject *val = LEvalFunc("transform", LID, a1, LID, a2, LID, a3, LKEYWORD, a4, LFLOAT, a5, LFLOAT, a6, LFLOAT, a7, LFLOAT, a8, LKEYWORD, a9, LEND); LFree(val); } void gv_transform_incr(int a1, int a2, int a3, int a4, float a5, float a6, float a7, float a8, int a9) { LObject *val = LEvalFunc("transform-incr", LID, a1, LID, a2, LID, a3, LKEYWORD, a4, LFLOAT, a5, LFLOAT, a6, LFLOAT, a7, LFLOAT, a8, LKEYWORD, a9, LEND); LFree(val); } void gv_transform_set(int a1, int a2, int a3, int a4, float a5, float a6, float a7) { LObject *val = LEvalFunc("transform-set", LID, a1, LID, a2, LID, a3, LKEYWORD, a4, LFLOAT, a5, LFLOAT, a6, LFLOAT, a7, LEND); LFree(val); } void gv_position(int a1, int a2) { LObject *val = LEvalFunc("position", LID, a1, LID, a2, LEND); LFree(val); } void gv_position_at(int a1, int a2, char * a3) { LObject *val = LEvalFunc("position-at", LID, a1, LID, a2, LSTRING, a3, LEND); LFree(val); } void gv_position_toward(int a1, int a2, char * a3) { LObject *val = LEvalFunc("position-toward", LID, a1, LID, a2, LSTRING, a3, LEND); LFree(val); } void gv_new_center(int a1) { LObject *val = LEvalFunc("new-center", LID, a1, LEND); LFree(val); } void gv_new_reset() { LObject *val = LEvalFunc("new-reset", LEND); LFree(val); } LList * gv_look_encompass_size(float a1, float a2, float a3, float a4) { LObject *val = LEvalFunc("look-encompass-size", LFLOAT, a1, LFLOAT, a2, LFLOAT, a3, LFLOAT, a4, LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } void gv_look_encompass(int a1, int a2) { LObject *val = LEvalFunc("look-encompass", LID, a1, LID, a2, LEND); LFree(val); } void gv_look_toward(int a1, int a2, char * a3) { LObject *val = LEvalFunc("look-toward", LID, a1, LID, a2, LSTRING, a3, LEND); LFree(val); } void gv_look(int a1, int a2) { LObject *val = LEvalFunc("look", LID, a1, LID, a2, LEND); LFree(val); } void gv_look_recenter(int a1, int a2) { LObject *val = LEvalFunc("look-recenter", LID, a1, LID, a2, LEND); LFree(val); } void gv_emodule_clear() { LObject *val = LEvalFunc("emodule-clear", LEND); LFree(val); } void gv_cursor_still(int a1) { LObject *val = LEvalFunc("cursor-still", LINT, a1, LEND); LFree(val); } void gv_cursor_twitch(int a1) { LObject *val = LEvalFunc("cursor-twitch", LINT, a1, LEND); LFree(val); } void gv_ap_override(int a1) { LObject *val = LEvalFunc("ap-override", LKEYWORD, a1, LEND); LFree(val); } void gv_set_load_path(LList * a1) { LObject *val = LEvalFunc("set-load-path", LLIST, a1, LEND); LFree(val); } LList * gv_load_path(LList * a1) { LObject *val = LEvalFunc("load-path", LLIST, a1, LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } void gv_set_emodule_path(LList * a1) { LObject *val = LEvalFunc("set-emodule-path", LLIST, a1, LEND); LFree(val); } LList * gv_rehash_emodule_path() { LObject *val = LEvalFunc("rehash-emodule-path", LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } LList * gv_emodule_path() { LObject *val = LEvalFunc("emodule-path", LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } char * gv_emodule_defined(char * a1) { LObject *val = LEvalFunc("emodule-defined", LSTRING, a1, LEND); char * retval; LFROMOBJ(LSTRING)(val, &retval); LFree(val); return retval; } LList * gv_all(char * a1, char * a2) { LObject *val = LEvalFunc("all", LSTRING, a1, LSTRING, a2, LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } void gv_camera_prop(GeomStruct * a1, int a2) { LObject *val = LEvalFunc("camera-prop", LGEOM, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_write(char * a1, char * a2, LObject * a3, int a4) { LObject *val = LEvalFunc("write", LSTRING, a1, LSTRING, a2, LLOBJECT, a3, LID, a4, LEND); LFree(val); } int gv_snapshot(int a1, char * a2, char * a3, int a4, int a5) { LObject *val = LEvalFunc("snapshot", LID, a1, LSTRING, a2, LSTRING, a3, LINT, a4, LINT, a5, LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } char * gv_bgimagefile(int a1, char * a2) { LObject *val = LEvalFunc("background-image", LID, a1, LSTRING, a2, LEND); char * retval; LFROMOBJ(LSTRING)(val, &retval); LFree(val); return retval; } void gv_processevents() { LObject *val = LEvalFunc("process-events", LEND); LFree(val); } void gv_ui_motion(int a1, int a2) { LObject *val = LEvalFunc("ui-motion", LKEYWORD, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_ui_cam_focus(int a1) { LObject *val = LEvalFunc("ui-cam-focus", LKEYWORD, a1, LEND); LFree(val); } void gv_ui_target(int a1, int a2) { LObject *val = LEvalFunc("ui-target", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_ui_center(int a1) { LObject *val = LEvalFunc("ui-center", LID, a1, LEND); LFree(val); } void gv_ui_center_origin(int a1) { LObject *val = LEvalFunc("ui-center-origin", LKEYWORD, a1, LEND); LFree(val); } void gv_ui_panel(char * a1, int a2, WindowStruct * a3) { LObject *val = LEvalFunc("ui-panel", LSTRING, a1, LKEYWORD, a2, LWINDOW, a3, LEND); LFree(val); } void gv_ui_freeze(int a1) { LObject *val = LEvalFunc("ui-freeze", LKEYWORD, a1, LEND); LFree(val); } void gv_ui_emodule_define(char * a1, char * a2) { LObject *val = LEvalFunc("emodule-define", LSTRING, a1, LSTRING, a2, LEND); LFree(val); } void gv_emodule_sort() { LObject *val = LEvalFunc("emodule-sort", LEND); LFree(val); } void gv_ui_emodule_start(char * a1) { LObject *val = LEvalFunc("emodule-start", LSTRING, a1, LEND); LFree(val); } extern LObject *Lsetenv(Lake *, LList *); extern LObject *Linput_translator(Lake *, LList *); extern LObject *Lemodule_run(Lake *, LList *); extern LObject *Lemodule_isrunning(Lake *, LList *); extern LObject *Lcommand(Lake *, LList *); extern LObject *Lsleep_for(Lake *, LList *); extern LObject *Lsleep_until(Lake *, LList *); extern LObject *Lset_clock(Lake *, LList *); extern LObject *Lclock(Lake *, LList *); extern LObject *Lecho(Lake *, LList *); extern LObject *Lemodule_transmit(Lake *, LList *); extern LObject *Lload(Lake *, LList *); extern LObject *Lhdelete(Lake *, LList *); extern LObject *Lname_object(Lake *, LList *); extern LObject *Lupdate_draw(Lake *, LList *); extern LObject *Ldraw(Lake *, LList *); extern LObject *Lupdate(Lake *, LList *); extern LObject *Lredraw(Lake *, LList *); extern LObject *Lfreeze(Lake *, LList *); extern LObject *Lxform_set(Lake *, LList *); extern LObject *Lxform(Lake *, LList *); extern LObject *Lxform_incr(Lake *, LList *); extern LObject *Lnew_camera(Lake *, LList *); extern LObject *Lcamera(Lake *, LList *); extern LObject *Lcamera_reset(Lake *, LList *); extern LObject *Lnew_alien(Lake *, LList *); extern LObject *Lnew_geometry(Lake *, LList *); extern LObject *Lgeometry(Lake *, LList *); extern LObject *Lreplace_geometry(Lake *, LList *); extern LObject *Lcopy(Lake *, LList *); extern LObject *Ldelete(Lake *, LList *); extern LObject *Lscene(Lake *, LList *); extern LObject *Lwinenter(Lake *, LList *); extern LObject *Lmerge_ap(Lake *, LList *); extern LObject *Ldice(Lake *, LList *); extern LObject *Lbbox_draw(Lake *, LList *); extern LObject *Lcamera_draw(Lake *, LList *); extern LObject *Levert(Lake *, LList *); extern LObject *Lsoft_shader(Lake *, LList *); extern LObject *Lstereowin(Lake *, LList *); extern LObject *Lspace(Lake *, LList *); extern LObject *Lhmodel(Lake *, LList *); extern LObject *Linhibit_warning(Lake *, LList *); extern LObject *Lhsphere_draw(Lake *, LList *); extern LObject *Lpickable(Lake *, LList *); extern LObject *Lnormalization(Lake *, LList *); extern LObject *Llines_closer(Lake *, LList *); extern LObject *Lbackcolor(Lake *, LList *); extern LObject *Lbbox_color(Lake *, LList *); extern LObject *Lwindow(Lake *, LList *); extern LObject *Lmerge_baseap(Lake *, LList *); extern LObject *Lexit(Lake *, LList *); extern LObject *Lset_motionscale(Lake *, LList *); extern LObject *Lset_conformal_refine(Lake *, LList *); extern LObject *Lwrite_comments(Lake *, LList *); extern LObject *Levent_mode(Lake *, LList *); extern LObject *Lpick_invisible(Lake *, LList *); extern LObject *Lrawevent(Lake *, LList *); extern LObject *Lrawpick(Lake *, LList *); extern LObject *Lpick(Lake *, LList *); extern LObject *Levent_keys(Lake *, LList *); extern LObject *Levent_pick(Lake *, LList *); extern LObject *Ldither(Lake *, LList *); extern LObject *Lui_html_browser(Lake *, LList *); extern LObject *Lui_pdf_viewer(Lake *, LList *); extern LObject *Lshell(Lake *, LList *); extern LObject *Lwrite_sexpr(Lake *, LList *); extern LObject *Lwrite_handle(Lake *, LList *); extern LObject *Ldump_handles(Lake *, LList *); extern LObject *Ldump_pools(Lake *, LList *); extern LObject *Lgeomview_version(Lake *, LList *); extern LObject *Lrib_display(Lake *, LList *); extern LObject *Lrib_snapshot(Lake *, LList *); extern LObject *LND_axes(Lake *, LList *); extern LObject *Ldimension(Lake *, LList *); extern LObject *LND_xform(Lake *, LList *); extern LObject *LND_xform_set(Lake *, LList *); extern LObject *LND_xform_get(Lake *, LList *); extern LObject *LND_color(Lake *, LList *); extern LObject *Lzoom(Lake *, LList *); extern LObject *Lezoom(Lake *, LList *); extern LObject *Lscale(Lake *, LList *); extern LObject *Lescale(Lake *, LList *); extern LObject *Lreal_id(Lake *, LList *); extern LObject *Ltransform(Lake *, LList *); extern LObject *Ltransform_incr(Lake *, LList *); extern LObject *Ltransform_set(Lake *, LList *); extern LObject *Lposition(Lake *, LList *); extern LObject *Lposition_at(Lake *, LList *); extern LObject *Lposition_toward(Lake *, LList *); extern LObject *Lnew_center(Lake *, LList *); extern LObject *Lnew_reset(Lake *, LList *); extern LObject *Llook_encompass_size(Lake *, LList *); extern LObject *Llook_encompass(Lake *, LList *); extern LObject *Llook_toward(Lake *, LList *); extern LObject *Llook(Lake *, LList *); extern LObject *Llook_recenter(Lake *, LList *); extern LObject *Lemodule_clear(Lake *, LList *); extern LObject *Lcursor_still(Lake *, LList *); extern LObject *Lcursor_twitch(Lake *, LList *); extern LObject *Lap_override(Lake *, LList *); extern LObject *Lset_load_path(Lake *, LList *); extern LObject *Lload_path(Lake *, LList *); extern LObject *Lset_emodule_path(Lake *, LList *); extern LObject *Lrehash_emodule_path(Lake *, LList *); extern LObject *Lemodule_path(Lake *, LList *); extern LObject *Lemodule_defined(Lake *, LList *); extern LObject *Lall(Lake *, LList *); extern LObject *Lcamera_prop(Lake *, LList *); extern LObject *Lwrite(Lake *, LList *); extern LObject *Lsnapshot(Lake *, LList *); extern LObject *Lbgimagefile(Lake *, LList *); extern LObject *Lprocessevents(Lake *, LList *); extern LObject *Lui_motion(Lake *, LList *); extern LObject *Lui_cam_focus(Lake *, LList *); extern LObject *Lui_target(Lake *, LList *); extern LObject *Lui_center(Lake *, LList *); extern LObject *Lui_center_origin(Lake *, LList *); extern LObject *Lui_panel(Lake *, LList *); extern LObject *Lui_freeze(Lake *, LList *); extern LObject *Lui_emodule_define(Lake *, LList *); extern LObject *Lemodule_sort(Lake *, LList *); extern LObject *Lui_emodule_start(Lake *, LList *); extern char Hsetenv[]; extern char Hinput_translator[]; extern char Hemodule_run[]; extern char Hemodule_isrunning[]; extern char Hcommand[]; extern char Hsleep_for[]; extern char Hsleep_until[]; extern char Hset_clock[]; extern char Hclock[]; extern char Hecho[]; extern char Hemodule_transmit[]; extern char Hload[]; extern char Hhdelete[]; extern char Hname_object[]; extern char Hupdate_draw[]; extern char Hdraw[]; extern char Hupdate[]; extern char Hredraw[]; extern char Hfreeze[]; extern char Hxform_set[]; extern char Hxform[]; extern char Hxform_incr[]; extern char Hnew_camera[]; extern char Hcamera[]; extern char Hcamera_reset[]; extern char Hnew_alien[]; extern char Hnew_geometry[]; extern char Hgeometry[]; extern char Hreplace_geometry[]; extern char Hcopy[]; extern char Hdelete[]; extern char Hscene[]; extern char Hwinenter[]; extern char Hmerge_ap[]; extern char Hdice[]; extern char Hbbox_draw[]; extern char Hcamera_draw[]; extern char Hevert[]; extern char Hsoft_shader[]; extern char Hstereowin[]; extern char Hspace[]; extern char Hhmodel[]; extern char Hinhibit_warning[]; extern char Hhsphere_draw[]; extern char Hpickable[]; extern char Hnormalization[]; extern char Hlines_closer[]; extern char Hbackcolor[]; extern char Hbbox_color[]; extern char Hwindow[]; extern char Hmerge_baseap[]; extern char Hexit[]; extern char Hset_motionscale[]; extern char Hset_conformal_refine[]; extern char Hwrite_comments[]; extern char Hevent_mode[]; extern char Hpick_invisible[]; extern char Hrawevent[]; extern char Hrawpick[]; extern char Hpick[]; extern char Hevent_keys[]; extern char Hevent_pick[]; extern char Hdither[]; extern char Hui_html_browser[]; extern char Hui_pdf_viewer[]; extern char Hshell[]; extern char Hwrite_sexpr[]; extern char Hwrite_handle[]; extern char Hdump_handles[]; extern char Hdump_pools[]; extern char Hgeomview_version[]; extern char Hrib_display[]; extern char Hrib_snapshot[]; extern char HND_axes[]; extern char Hdimension[]; extern char HND_xform[]; extern char HND_xform_set[]; extern char HND_xform_get[]; extern char HND_color[]; extern char Hzoom[]; extern char Hezoom[]; extern char Hscale[]; extern char Hescale[]; extern char Hreal_id[]; extern char Htransform[]; extern char Htransform_incr[]; extern char Htransform_set[]; extern char Hposition[]; extern char Hposition_at[]; extern char Hposition_toward[]; extern char Hnew_center[]; extern char Hnew_reset[]; extern char Hlook_encompass_size[]; extern char Hlook_encompass[]; extern char Hlook_toward[]; extern char Hlook[]; extern char Hlook_recenter[]; extern char Hemodule_clear[]; extern char Hcursor_still[]; extern char Hcursor_twitch[]; extern char Hap_override[]; extern char Hset_load_path[]; extern char Hload_path[]; extern char Hset_emodule_path[]; extern char Hrehash_emodule_path[]; extern char Hemodule_path[]; extern char Hemodule_defined[]; extern char Hall[]; extern char Hcamera_prop[]; extern char Hwrite[]; extern char Hsnapshot[]; extern char Hbgimagefile[]; extern char Hprocessevents[]; extern char Hui_motion[]; extern char Hui_cam_focus[]; extern char Hui_target[]; extern char Hui_center[]; extern char Hui_center_origin[]; extern char Hui_panel[]; extern char Hui_freeze[]; extern char Hui_emodule_define[]; extern char Hemodule_sort[]; extern char Hui_emodule_start[]; void clang_init() { LDefun("setenv", Lsetenv, Hsetenv); LDefun("input-translator", Linput_translator, Hinput_translator); LDefun("emodule-run", Lemodule_run, Hemodule_run); LDefun("emodule-isrunning", Lemodule_isrunning, Hemodule_isrunning); LDefun("command", Lcommand, Hcommand); LDefun("sleep-for", Lsleep_for, Hsleep_for); LDefun("sleep-until", Lsleep_until, Hsleep_until); LDefun("set-clock", Lset_clock, Hset_clock); LDefun("clock", Lclock, Hclock); LDefun("echo", Lecho, Hecho); LDefun("emodule-transmit", Lemodule_transmit, Hemodule_transmit); LDefun("load", Lload, Hload); LDefun("hdelete", Lhdelete, Hhdelete); LDefun("name-object", Lname_object, Hname_object); LDefun("update-draw", Lupdate_draw, Hupdate_draw); LDefun("draw", Ldraw, Hdraw); LDefun("update", Lupdate, Hupdate); LDefun("redraw", Lredraw, Hredraw); LDefun("freeze", Lfreeze, Hfreeze); LDefun("xform-set", Lxform_set, Hxform_set); LDefun("xform", Lxform, Hxform); LDefun("xform-incr", Lxform_incr, Hxform_incr); LDefun("new-camera", Lnew_camera, Hnew_camera); LDefun("camera", Lcamera, Hcamera); LDefun("camera-reset", Lcamera_reset, Hcamera_reset); LDefun("new-alien", Lnew_alien, Hnew_alien); LDefun("new-geometry", Lnew_geometry, Hnew_geometry); LDefun("geometry", Lgeometry, Hgeometry); LDefun("replace-geometry", Lreplace_geometry, Hreplace_geometry); LDefun("copy", Lcopy, Hcopy); LDefun("delete", Ldelete, Hdelete); LDefun("scene", Lscene, Hscene); LDefun("winenter", Lwinenter, Hwinenter); LDefun("merge-ap", Lmerge_ap, Hmerge_ap); LDefun("dice", Ldice, Hdice); LDefun("bbox-draw", Lbbox_draw, Hbbox_draw); LDefun("camera-draw", Lcamera_draw, Hcamera_draw); LDefun("evert", Levert, Hevert); LDefun("soft-shader", Lsoft_shader, Hsoft_shader); LDefun("stereowin", Lstereowin, Hstereowin); LDefun("space", Lspace, Hspace); LDefun("hmodel", Lhmodel, Hhmodel); LDefun("inhibit-warning", Linhibit_warning, Hinhibit_warning); LDefun("hsphere-draw", Lhsphere_draw, Hhsphere_draw); LDefun("pickable", Lpickable, Hpickable); LDefun("normalization", Lnormalization, Hnormalization); LDefun("lines-closer", Llines_closer, Hlines_closer); LDefun("backcolor", Lbackcolor, Hbackcolor); LDefun("bbox-color", Lbbox_color, Hbbox_color); LDefun("window", Lwindow, Hwindow); LDefun("merge-baseap", Lmerge_baseap, Hmerge_baseap); LDefun("exit", Lexit, Hexit); LDefun("set-motionscale", Lset_motionscale, Hset_motionscale); LDefun("set-conformal-refine", Lset_conformal_refine, Hset_conformal_refine); LDefun("write-comments", Lwrite_comments, Hwrite_comments); LDefun("event-mode", Levent_mode, Hevent_mode); LDefun("pick-invisible", Lpick_invisible, Hpick_invisible); LDefun("rawevent", Lrawevent, Hrawevent); LDefun("rawpick", Lrawpick, Hrawpick); LDefun("pick", Lpick, Hpick); LDefun("event-keys", Levent_keys, Hevent_keys); LDefun("event-pick", Levent_pick, Hevent_pick); LDefun("dither", Ldither, Hdither); LDefun("ui-html-browser", Lui_html_browser, Hui_html_browser); LDefun("ui-pdf-viewer", Lui_pdf_viewer, Hui_pdf_viewer); LDefun("shell", Lshell, Hshell); LDefun("write-sexpr", Lwrite_sexpr, Hwrite_sexpr); LDefun("write-handle", Lwrite_handle, Hwrite_handle); LDefun("dump-handles", Ldump_handles, Hdump_handles); LDefun("dump-pools", Ldump_pools, Hdump_pools); LDefun("geomview-version", Lgeomview_version, Hgeomview_version); LDefun("rib-display", Lrib_display, Hrib_display); LDefun("rib-snapshot", Lrib_snapshot, Hrib_snapshot); LDefun("ND-axes", LND_axes, HND_axes); LDefun("dimension", Ldimension, Hdimension); LDefun("ND-xform", LND_xform, HND_xform); LDefun("ND-xform-set", LND_xform_set, HND_xform_set); LDefun("ND-xform-get", LND_xform_get, HND_xform_get); LDefun("ND-color", LND_color, HND_color); LDefun("zoom", Lzoom, Hzoom); LDefun("ezoom", Lezoom, Hezoom); LDefun("scale", Lscale, Hscale); LDefun("escale", Lescale, Hescale); LDefun("real-id", Lreal_id, Hreal_id); LDefun("transform", Ltransform, Htransform); LDefun("transform-incr", Ltransform_incr, Htransform_incr); LDefun("transform-set", Ltransform_set, Htransform_set); LDefun("position", Lposition, Hposition); LDefun("position-at", Lposition_at, Hposition_at); LDefun("position-toward", Lposition_toward, Hposition_toward); LDefun("new-center", Lnew_center, Hnew_center); LDefun("new-reset", Lnew_reset, Hnew_reset); LDefun("look-encompass-size", Llook_encompass_size, Hlook_encompass_size); LDefun("look-encompass", Llook_encompass, Hlook_encompass); LDefun("look-toward", Llook_toward, Hlook_toward); LDefun("look", Llook, Hlook); LDefun("look-recenter", Llook_recenter, Hlook_recenter); LDefun("emodule-clear", Lemodule_clear, Hemodule_clear); LDefun("cursor-still", Lcursor_still, Hcursor_still); LDefun("cursor-twitch", Lcursor_twitch, Hcursor_twitch); LDefun("ap-override", Lap_override, Hap_override); LDefun("set-load-path", Lset_load_path, Hset_load_path); LDefun("load-path", Lload_path, Hload_path); LDefun("set-emodule-path", Lset_emodule_path, Hset_emodule_path); LDefun("rehash-emodule-path", Lrehash_emodule_path, Hrehash_emodule_path); LDefun("emodule-path", Lemodule_path, Hemodule_path); LDefun("emodule-defined", Lemodule_defined, Hemodule_defined); LDefun("all", Lall, Hall); LDefun("camera-prop", Lcamera_prop, Hcamera_prop); LDefun("write", Lwrite, Hwrite); LDefun("snapshot", Lsnapshot, Hsnapshot); LDefun("background-image", Lbgimagefile, Hbgimagefile); LDefun("process-events", Lprocessevents, Hprocessevents); LDefun("ui-motion", Lui_motion, Hui_motion); LDefun("ui-cam-focus", Lui_cam_focus, Hui_cam_focus); LDefun("ui-target", Lui_target, Hui_target); LDefun("ui-center", Lui_center, Hui_center); LDefun("ui-center-origin", Lui_center_origin, Hui_center_origin); LDefun("ui-panel", Lui_panel, Hui_panel); LDefun("ui-freeze", Lui_freeze, Hui_freeze); LDefun("emodule-define", Lui_emodule_define, Hui_emodule_define); LDefun("emodule-sort", Lemodule_sort, Hemodule_sort); LDefun("emodule-start", Lui_emodule_start, Hui_emodule_start); } geomview-1.9.5/src/bin/geomview/clang.h0000644000175000017500000001161212310162251014701 00000000000000void gv_setenv(char * a1, char * a2); void gv_input_translator(char * a1, char * a2); void gv_emodule_run(char * a1); void gv_emodule_isrunning(char * a1); void gv_command(char * a1, char * a2); void gv_sleep_for(float a1); float gv_sleep_until(float a1); void gv_set_clock(float a1); void gv_clock(); void gv_echo(LList * a1); void gv_emodule_transmit(char * a1, LList * a2); int gv_load(char * a1, char * a2); void gv_hdelete(char * a1, char * a2); void gv_name_object(int a1, char * a2); void gv_update_draw(int a1, float a2); void gv_draw(int a1); void gv_update(float a1); void gv_redraw(int a1); void gv_freeze(int a1, int a2); void gv_xform_set(int a1, TransformStruct * a2); void gv_xform(int a1, TransformStruct * a2); void gv_xform_incr(int a1, TransformStruct * a2); int gv_new_camera(char * a1, CameraStruct * a2); int gv_camera(char * a1, CameraStruct * a2); void gv_camera_reset(int a1); int gv_new_alien(char * a1, GeomStruct * a2); int gv_new_geometry(char * a1, GeomStruct * a2); void gv_geometry(char * a1, GeomStruct * a2); void gv_replace_geometry(char * a1, int *a2, int a2n, GeomStruct * a3); void gv_copy(int a1, char * a2); void gv_delete(int a1); void gv_scene(int a1, GeomStruct * a2); void gv_winenter(int a1); void gv_merge_ap(int a1, ApStruct * a2); void gv_dice(int a1, int a2); void gv_bbox_draw(int a1, int a2); void gv_camera_draw(int a1, int a2); void gv_evert(int a1, int a2); void gv_soft_shader(int a1, int a2); LList * gv_stereowin(int a1, int a2, int a3); void gv_space(int a1); void gv_hmodel(int a1, int a2); void gv_inhibit_warning(char * a1); void gv_hsphere_draw(int a1, int a2); void gv_pickable(int a1, int a2); void gv_normalization(int a1, int a2); void gv_lines_closer(int a1, float a2); void gv_backcolor(int a1, float a2, float a3, float a4); void gv_bbox_color(int a1, float a2, float a3, float a4); void gv_window(int a1, WindowStruct * a2); void gv_merge_baseap(ApStruct * a1); void gv_exit(); void gv_set_motionscale(float a1); void gv_set_conformal_refine(float a1, int a2, int a3); void gv_write_comments(char * a1, int a2, int *a3, int a3n); void gv_event_mode(char * a1); void gv_pick_invisible(int a1); void gv_rawevent(int a1, int a2, int a3, int a4, long a5); int gv_rawpick(int a1, int a2, int a3); void gv_pick(int a1, int a2, float *a3, int a3n, float *a4, int a4n, float *a5, int a5n, float *a6, int a6n, int *a7, int a7n, int a8, int *a9, int a9n, int a10); void gv_event_keys(int a1); void gv_event_pick(int a1); void gv_dither(int a1, int a2); void gv_ui_html_browser(char * a1); void gv_ui_pdf_viewer(char * a1); void gv_shell(char * a1); void gv_write_sexpr(char * a1, LObject * a2); void gv_write_handle(char * a1, char * a2, char * a3); void gv_dump_handles(); void gv_dump_pools(); char * gv_geomview_version(); void gv_rib_display(int a1, char * a2); void gv_rib_snapshot(int a1, char * a2); LList * gv_ND_axes(char * a1, char * a2, int a3, int a4, int a5, int a6); LList * gv_dimension(int a1); TmNStruct * gv_ND_xform(int a1, TmNStruct * a2); TmNStruct * gv_ND_xform_set(int a1, TmNStruct * a2); TmNStruct * gv_ND_xform_get(int a1, int a2); LList * gv_ND_color(int a1, LList * a2); void gv_zoom(int a1, float a2); void gv_ezoom(int a1, float a2); void gv_scale(int a1, float a2, float a3, float a4); void gv_escale(int a1, float a2); char * gv_real_id(char * a1); void gv_transform(int a1, int a2, int a3, int a4, float a5, float a6, float a7, float a8, int a9); void gv_transform_incr(int a1, int a2, int a3, int a4, float a5, float a6, float a7, float a8, int a9); void gv_transform_set(int a1, int a2, int a3, int a4, float a5, float a6, float a7); void gv_position(int a1, int a2); void gv_position_at(int a1, int a2, char * a3); void gv_position_toward(int a1, int a2, char * a3); void gv_new_center(int a1); void gv_new_reset(); LList * gv_look_encompass_size(float a1, float a2, float a3, float a4); void gv_look_encompass(int a1, int a2); void gv_look_toward(int a1, int a2, char * a3); void gv_look(int a1, int a2); void gv_look_recenter(int a1, int a2); void gv_emodule_clear(); void gv_cursor_still(int a1); void gv_cursor_twitch(int a1); void gv_ap_override(int a1); void gv_set_load_path(LList * a1); LList * gv_load_path(LList * a1); void gv_set_emodule_path(LList * a1); LList * gv_rehash_emodule_path(); LList * gv_emodule_path(); char * gv_emodule_defined(char * a1); LList * gv_all(char * a1, char * a2); void gv_camera_prop(GeomStruct * a1, int a2); void gv_write(char * a1, char * a2, LObject * a3, int a4); int gv_snapshot(int a1, char * a2, char * a3, int a4, int a5); char * gv_bgimagefile(int a1, char * a2); void gv_processevents(); void gv_ui_motion(int a1, int a2); void gv_ui_cam_focus(int a1); void gv_ui_target(int a1, int a2); void gv_ui_center(int a1); void gv_ui_center_origin(int a1); void gv_ui_panel(char * a1, int a2, WindowStruct * a3); void gv_ui_freeze(int a1); void gv_ui_emodule_define(char * a1, char * a2); void gv_emodule_sort(); void gv_ui_emodule_start(char * a1); geomview-1.9.5/src/bin/geomview/geomview.1gv0000644000175000017500000003235512310110177015714 00000000000000.TH Geomview 1gv "December 10, 1996" "Geometry Center" .SH NAME Geomview \- interactive geometry viewer .SH SYNOPSIS .na .nh .in +5 .ti -5 geomview [\-b\ \fIr\ g\ b\fP] [\-c\ \fIcommandfile\fP] [\-wins\ \fI#windows\fP] [\-noinit] [\-nopanels] [\-noopengl] [\-wpos\ \fIxmin\ ymin\ xsize\ ysize\fP] [\-wpos\ \fIxsize,ysize\fP[@\fIxmin,ymin\fP]] [\-e\ \fIexternal-module-name\fP] [\-M[cg][sp]\ \fIpipename\fP] [\-start\ \fIexternal-module-name\fP\ [\fIarg\fP ...] --] [\-run\ \fIexternal-module-path\fP\ [\fIarg\fP\ ...]\ \-\-] [\fIfile\fP ...] .br .in -5 .hy .ad .SH DESCRIPTION Geomview is an interactive geometry viewer written at the Geometry Center. It displays the objects in the files given on the command line and allows the user to view and manipulate them interactively. The present version (1.7) of geomview runs on Silicon Graphics Irises, and X Window System workstations. We are very interested in hearing about any problems you may have using it; see below for information on how to contact us. In addition to providing interactive control over a world of objects via the mouse and keyboard, geomview has an interpreted language of commands for controlling almost every aspect of its display. It can execute files containing statements in this language, and it can communicate with other programs using the language. See geomview(5), e.g. the file man/cat5/geomview.5 in the geomview distribution, for more details of the language. .SH TUTORIAL This manual page serves only as a (very) terse reference manual for geomview. For a gentler introduction to the program and the format of the data files it can read, see "overview" and "oogltour" in the "doc" directory of the geomview distribution, or better, see the full manual: "geomview.tex" or "geomview.ps", also in the "doc" directory. The source distribution also includes a tutorial for how to write external modules in the "src/bin/example" directory. .SH OPTIONS .TP -b Set the window background color to the given r g b values. .TP -c Interpret the commands in commandfile, which may be ``\-'' for standard input. The command language is described in geomview(5). Commands may be supplied literally, as in ``-c "(ui-panel main off)"''; since they include parentheses, they must be quoted. .TP -wins Causes geomview to initially display #windows camera windows. .TP -wpos Specifies the initial location and size of the first camera window. With ``-'', you are prompted for window placement. .TP -M \fIobjname\fP Display (possibly dynamically changing) geometry (or commands) sent via ``\fBtogeomview \-g\fP \fIobjname\fP [\fIgeomview-shell-command\fP]'' or ``\fBgeomstuff\fP\ \fIobjname\fP \fIfile\fP ...''. The data appears as a geomview object named \fIobjname\fP. Actually listens to the named pipe ``/tmp/geomview/\fIobjname\fP''; you can achieve the same effect with the shell commands: .br mkdir\ /tmp/geomview;\ mknod\ /tmp/geomview/\fIobjname\fP\ p .br (assuming the directory and named pipe don't already exist), then executing the geomview command: .br (geometry\ \fIobjname\fP\ \ <\ /tmp/geomview/\fIobjname\fP) .br .TP -M[cg][ps[un|in|in6]] \fIPIPENAME|TCPPORT\fP The \fB\-M\fP option accepts modifiers: a '\fBg\fP' suffix expects geometry data (the default), while a '\fBc\fP' suffix expects GCL commands. A '\fBp\fP' implies the connection should use a named pipe (the default on everything except on the NeXT), while '\fBs\fP' implies using a UNIX-domain socket (the default on the NeXT). Since version 1.9 of Geomview internet domain sockets are also supported; use '\fBsin\fP' to make Geomview listen on the IPv4 port given by \fBTCPPORT\fP, or use '\fBsin6\fP' to make Geomview listen on an IPv6 port (also as specified by \fBTCPPORT\fP). '\fBsun\fP' is a synonym for '\fBs\fP', i.e. use the Unix domain socket with the name \fBPIPENAME\fP. If \fBPIPENAME\fP starts with a slash ('/'), then it is assumed to be an absolute pathname, otherwise the named pipe or socket is created below \fB${TMPDIR}/geomview/\fP. So \fB\-Mcs fred\fP selects reading commands from the UNIX-domain socket named \fB/tmp/geomview/fred\fP, \fB\-Mcsin 40000\fP selects reading commands from the IPv4 port '40000'. .TP -noopengl Disable the use of OpenGL for (possibly) hardware accelerated rendering, even if the Geomview binary has support for OpenGL compiled in. This also disables the support for transparency and and textures .TP -nopanels Start up displaying no panels, only graphics windows. Panels may be invoked later as usual with the "Px" keyboard shortcuts or "(ui-panel ...)" command. .TP -noinit Read no initialization files. By default, geomview reads the system-wide ".geomview" file, followed by those in $HOME/.geomview and ./.geomview. .TP -e \fImodulename\fP Start an external module; \fImodulename\fP is the name associated with the module, appearing in the main panel's Applications browser, as defined by the emodule-define command (see geomview(5) for details). .TP -start \fImodulename\fP \fIarguments\fP ... -- Like -e but allows you to pass arguments to the external module. "--" signals the end of the argument list; the "--" may be omitted if it would be the last argument on the geomview command line. .TP -run \fIshell-command arguments\fP ... Like -start but takes the pathname of executable of the external module instead of the module's name. .SH GEOMETRY FILE FORMATS The format of the files read by geomview is described in oogl(5); type "man 5 oogl", or see the file man/cat5/oogl.5 in the geomview distribution, for details. Note to users of MinneView (the precursor to geomview): geomview can read MinneView files, but MinneView cannot read all geomview files. .SH STARTUP FILES Immediately upon starting up geomview reads and executes the commands in the system-wide .geomview file in the "data" subdirectory of the geomview directory. Then, if there is a file named .geomview in the current directory, it executes the commands in that file. If no .geomview file exists in the current directory, geomview looks for one in the user's home directory, and executes it if found. The startup file of an individual user overrides the systemwide defaults, since later commands take precedence over earlier ones. .SH EXTERNAL MODULES Geomview has the ability to interact via its command language with other programs, called "external modules". Many such modules have been written and appear in the "Application" browser in the main geomview panel. To invoke a module you click the mouse on the module's entry in this browser. This starts the module and adds an additional entry to the browser, beginning with a number in square brackets as in ``[1] Crayola'', which represents the running instance of that module. You can terminate the module by clicking on the numbered entry. Modules are documented separately from geomview. See the manual page for each module for details. .SH INSTALLING AN EXTERNAL MODULE Geomview looks for external modules in a special directory for modules. In the geomview distribution tree this is the "bin/$MACHTYPE" subdirectory. A module consists of two files: the executable program, and a "module init file", which is a whose name is ".geomview-" followed by the module name. The module init file tells geomview how to run that program. Be sure to always keep these two files together; geomview needs both of them in order to run the module. To install a new module, simply put the module's executable file and its init file in your geomview's module directory. The next time you run geomview, it will know about that module. Geomview can actually looks for modules in a list of directories; by default only the "bin/$MACHTYPE" directory is on this list. See the set-emodule-path command in geomview(5) for details. There is a tutorial for how to write external modules in the "src/bin/example" directory. .SH EXTERNAL MODULE INIT FILES An external module init file is the file that tells geomview how to run that module. Its name must be ".geomview-" followed by the name of the module, e.g. ".geomview-foo". It should contain geomview commands; typically it will contain a single emodule-define command which enters the module into geomview's application browser: .nf (emodule-define "Foo" "foo") .fi The first string is the name that appears in the browser. The second string is the command to invoke the module. It may contain arguments; in fact it can be an arbitrary shell command. .SH "KEYBOARD SHORTCUTS" Many geomview operations are available from the keyboard. Hitting the "?" button on the main panel, or typing "?" with the cursor in any window, causes geomview to print a message on standard output listing all the keyboard shortcuts. .nf Keyboard commands apply while cursor is in any graphics window and most control panels. Most commands allow one of the following selection prefixes (if none is provided the command applies to the current object): g world geom g# #'th geom g* All geoms c current camera c# #'th camera c* All cameras Many allow a numeric prefix: if none they toggle or reset current value. Appearance: Draw: Shading: Other: af Faces 0as Constant av eVert normals: always face viewer ae Edges 1as Flat #aw Line Width (pixels) an Normals 2as Smooth #ac edges Closer than faces(try 5-100) ab Bounding Boxes 3as Smooth, non-lighted al Shade lines aV Vectors aT allow transparency at Texture-mapping Color: aC allow concave polygons Cf Ce Cn Cb CB face/edge/normal/bbox/backgnd Motions: Viewing: r rotate [ Leftmouse=X-Y plane, 0vp Orthographic view t translate Middle=Z axis, 1vp Perspective view z zoom FOV Shift=slow motion, vd Draw other views' cameras f fly in r/t modes. ] #vv field of View o orbit [Left=steer, Middle=speed ] #vn near clip distance s scale #vf far clip distance w/W recenter/all v+ add new camera h/H halt/halt all vx cursor on/off @ select center of motion (e.g. g3@) vb backfacing poly cull on/off #vl focal length L Look At object v~ Software shading on/off show Panel: Pm Pa Pl Po main/appearance/lighting/obscure Pt Pc PC Pf tools/cameras/Commands/file-browser Ps P- saving/read commands from tty Lights: ls le Show lights / Edit Lights Metric: me mh ms Euclidean Hyperbolic Spherical Model: mv mp mc Virtual Projective Conformal Other: N normalization < Pf load geom/command file 0N none > Ps save something to file ui motion has inertia 1N each TV NTSC mode toggle uc constrained (X/Y) motion 2N all uo motion in Own coord system Rightmouse-doubleclick pick as current target object Shift-Rightmouse pick interest (center) point Renderman: RR send RIB output to NNN.rib (default fileprefix == "geom") RC Emulate lines using cylinders (default) RP Emulate lines using polygons Ra choose ASCII RIB format (default) Rb choose BINARY RIB format Rt choose Display token to specify .tiff file (default) Rf choose Display token to specify framebuffer Rs Simulate background color with Polygon (default) Rx No background simulation - fully transparent (alpha) background .fi .SH "NOTES" The "geomview" command is actually a shell script that sets various environment variables which tell geomview about your local setup, and then invokes the geomview executable program "gvx" (or "gvx.OGL"). Do not run "gvx" by itself; always invoke geomview with the "geomview" shell script. .SH "SEE ALSO" oogl(5) \- OOGL geometric file formats and conventions .br geomview(5) \- geomview command language reference .SH "FILES" .in +5 .ti -5 data/.geomview \- default initialization file in geomview command language .in -5 .br .geomview or $HOME/.geomview \- second initialization file .br data/geom \- sample data files .SH ENVIRONMENT The ``geomview'' shell script sets these internally by default; if you set them before invoking geomview, the values you set will be used instead of the built-in defaults. .in +5 .ti -5 GEOMVIEW_GVX \- geomview executable .br .ti -5 GEOMVIEW_DATA_DIR \- default directory for data files .br .ti -5 GEOMVIEW_LOAD_PATH \- colon-separated search path for data files .br .ti -5 GEOMVIEW_EMODULE_DIR \- default directory for external emodules .br .ti -5 GEOMVIEW_EMODULE_PATH \- colon-separated search path for external modules .br .ti -5 GEOMVIEW_SYSTEM_INITFILE \- system-wide GCL initialization script .br .ti -5 GEOMDATA \- top directory of the default data tree, used by some modules .br .ti -5 GEOMVIEW_DOC_DIR \- path to the user manual .br .ti -5 WEBBROWSER \- executable for viewing the HTML version of the manual when invoking the `Manual (HTML)' menu item .br .ti -5 PDFVIEWER \- executable for viewing the PDF version of the manual when invoking the `Manual (PDF)' menu item .br .in -5 .SH AUTHORS .nf Stuart Levy Tamara Munzner Mark Phillips Celeste Fowler Nathaniel Thurston Daniel Krech Scott Wisdom Daeron Meyer Timothy Rowley The National Science and Technology Research Center for Computation and Visualization of Geometric Structures (The Geometry Center) University of Minnesota www.geomview.org .fi .SH BUGS Sometimes core dumps on bad input files. Zoom and scale have no inertia. Virtual spherical mode doesn't work on VGXes. geomview-1.9.5/src/bin/geomview/common/0000755000175000017500000000000012310165603015017 500000000000000geomview-1.9.5/src/bin/geomview/common/Makefile.in0000644000175000017500000005121612310165552017014 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/geomview/common DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libgvcommon_a_AR = $(AR) $(ARFLAGS) libgvcommon_a_LIBADD = am_libgvcommon_a_OBJECTS = comm.$(OBJEXT) drawer.$(OBJEXT) \ event.$(OBJEXT) help.$(OBJEXT) lang.$(OBJEXT) lights.$(OBJEXT) \ lispext.$(OBJEXT) main.$(OBJEXT) motion.$(OBJEXT) \ mouse.$(OBJEXT) ndshade.$(OBJEXT) rman.$(OBJEXT) \ shaders.$(OBJEXT) space.$(OBJEXT) transform.$(OBJEXT) \ ui.$(OBJEXT) worldio.$(OBJEXT) libgvcommon_a_OBJECTS = $(am_libgvcommon_a_OBJECTS) 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) 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 = LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgvcommon_a_SOURCES) DIST_SOURCES = $(libgvcommon_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) -I.. EXTRA_DIST = Headers noinst_LIBRARIES = libgvcommon.a libgvcommon_a_SOURCES = \ comm.c comm.h common.h drawer.c drawer.h event.c event.h help.c lang.c lang.h\ lights.c lights.h lispext.c lispext.h main.c main.h motion.c motion.h mouse.c\ mouse.h ndshade.c pickfunc.h rman.c rman.h shaders.c space.c space.h\ transform.c transform.h ui.c ui.h version.h worldio.c worldio.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomview/common/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomview/common/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libgvcommon.a: $(libgvcommon_a_OBJECTS) $(libgvcommon_a_DEPENDENCIES) $(EXTRA_libgvcommon_a_DEPENDENCIES) $(AM_V_at)-rm -f libgvcommon.a $(AM_V_AR)$(libgvcommon_a_AR) libgvcommon.a $(libgvcommon_a_OBJECTS) $(libgvcommon_a_LIBADD) $(AM_V_at)$(RANLIB) libgvcommon.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/comm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drawer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/event.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/help.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lang.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lights.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lispext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/motion.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mouse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndshade.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rman.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shaders.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/space.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transform.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/worldio.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am ../clang.c ../clang.h: cd .. && $(MAKE) $(AM_MAKEFLAGS) clang # 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: geomview-1.9.5/src/bin/geomview/common/Makefile.am0000644000175000017500000000073612310110177016775 00000000000000INCLUDES = $(default_includes) -I.. EXTRA_DIST = Headers noinst_LIBRARIES = libgvcommon.a libgvcommon_a_SOURCES =\ comm.c comm.h common.h drawer.c drawer.h event.c event.h help.c lang.c lang.h\ lights.c lights.h lispext.c lispext.h main.c main.h motion.c motion.h mouse.c\ mouse.h ndshade.c pickfunc.h rman.c rman.h shaders.c space.c space.h\ transform.c transform.h ui.c ui.h version.h worldio.c worldio.h ../clang.c ../clang.h: cd .. && $(MAKE) $(AM_MAKEFLAGS) clang geomview-1.9.5/src/bin/geomview/common/comm.c0000644000175000017500000013215312310110177016037 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #ifdef NeXT #include #else /* any other reasonable UNIX */ #include #endif #include #include #include #include #include #include #include #include #include #include #include "ooglutil.h" #include "drawer.h" #include "ui.h" #include "handle.h" #include "handleP.h" #include "streampool.h" #include "main.h" #include "event.h" #include "comm.h" #include "lang.h" #include "lisp.h" #include "transobj.h" #include "ntransobj.h" extern HandleOps CamOps, GeomOps, TransOps, NTransOps, CommandOps, WindowOps; extern HandleOps ImageOps, AppearanceOps; int gv_debug = 0; static int commandimport(Pool *, Handle **, Ref **); static int commandclose(Pool *); static int emodule_commandclose(Pool *); static int listenimport(Pool *, Handle **, Ref **); static void useconnection( char *name, HandleOps *ops, Handle *h, Ref *obj, int unique ); static void MyPoolDelete(Pool *p); HandleOps CommandOps = { "command_language", commandimport, NULL, NULL, NULL, commandclose }; static HandleOps emoduleCommandOps = { "command_language", commandimport, NULL, NULL, NULL, emodule_commandclose, }; #if HAVE_UNIX_SOCKETS static HandleOps listenOps = { /* "Ops" structure for listening sockets */ "socket_listener", listenimport, /* "read" routine really spawns a new connection's * data socket */ NULL, NULL, NULL, NULL }; #endif static int ign_read(int fd, void *buffer, size_t size) { int result; result = read(fd, buffer, size); return result; } static int commandimport(Pool *p, Handle **unused, Ref **unused_too ) { char *w, *raww; int c; int ok = 0; IOBFILE *inf; Lake *lake; if ((inf = PoolInputFile(p)) == NULL) goto done; if ((c = async_iobfnextc(inf,0)) == NODATA) return 1; /* pretend we got something. */ if ((lake=(Lake*)PoolClientData(p)) == NULL) { lake = LakeDefine(p->inf, p->outf, p); PoolSetClientData(p, (void*)lake); } else if (lake->streamin != inf) { lake->streamin = inf; lake->streamout = PoolOutputFile(p); } switch(c) { case '<': iobfgetc(inf); w = iobfdelimtok("()", inf, 0); if (w == NULL) goto done; if (strcmp(w, "-") && (w = findfile(PoolName(p), raww = w)) == NULL) { OOGLSyntax(inf, "Reading commands from \"%s\": can't find command file %s", PoolName(p), raww); goto done; } p = PoolStreamOpen(w, NULL, 0, &CommandOps); if (iobfile(PoolInputFile(p)) == stdin && !PoolOutputFile(p)) p = PoolStreamOpen(PoolName(p), stdout, 1, &CommandOps); if (p != NULL && inf != NULL) ok = comm_object(w, &CommandOps, NULL, NULL, COMM_LATER); break; case '(': { LObject *val; val = LEvalSexpr(lake); ok = (val != Lnil) ? 1 : -1; LFree(val); } break; default: { LFree( LEvalSexpr(lake) ); } } done: return ok; } /* * What is this file? Returns * -1 : nonexistent * 0 : is a plain file * 1 : is something else, probably a named pipe or tty */ static int ispipe(char *fname) { struct stat st; if (stat(fname, &st) < 0) return -1; return (st.st_mode & S_IFMT) != S_IFREG; } int comm_object(char *str, HandleOps *ops, Handle **hp, Ref **rp, int now) { int c, ok = 0; Pool *p; if (str == NULL) return 0; if (strcmp(str, "-") == 0 || access(str, 0) == 0) { Handle *h = HandleReferringTo('<', str, ops, hp); /* * If we haven't read something from this file yet, * forget it. */ if (h) { if (HandleObject(h)) { ok = 1; if (rp) { HandleUpdRef(&h, NULL, rp); } } else if (((p = PoolByName(HandleName(h), ops))) == NULL || (p->flags & PF_ANY) || (!p->seekable && !now)) { /* When reading plain files, always demand an object. When * reading others (pipe, tty), demand one if 'now' set. Use * PF_ANY flag as an alternate hint of reading an object, * since reading commands leaves no object attached to h. */ ok = 1; } else { /* Failed */ HandleDelete(h); if (hp) { *hp = NULL; } } } /* If not ok, close the file. * If 'now' and not some sort of pipe, also close the file. */ if ((p = PoolByName(str, ops)) != NULL && (!ok || (now && p->seekable))) { if (now && ok) { /* Read as much as possible if we need it right now. */ while(PoolInputFile(p) != NULL && (c = async_iobfnextc(PoolInputFile(p), 0)) != NODATA && c != EOF && (*ops->strmin)(p, hp, rp)) ; } PoolClose(p); MyPoolDelete(p); } else if (iobfile(PoolInputFile(p)) == stdin && PoolOutputFile(p) == NULL) { p = PoolStreamOpen(PoolName(p), stdout, 1, ops); } return ok; } else if (strpbrk(str, "({ \t\n")) { static Pool *pcache; /* Cache a pool for handling strings */ static bool inuse = false; /* Use cached pool unless already in use */ IOBFILE *inf = iobfileopen(fmemopen(str, strlen(str), "rb")); /* Caching implies this first pool has a long lifetime; * suitable for expressing (interest (...)) */ if (!inuse) { if ((p = pcache) == NULL) { p = pcache = PoolStreamTemp(str, inf, stdout, 2, ops); } else { p->inf = inf; /* hack */ p->outf = stdout; /* hack */ } inuse = true; } else { p = PoolStreamTemp(str, inf, stdout, 2, ops); } if (p == NULL) { return 0; /* Failed */ } while(iobfnextc(inf, 0) != EOF) { ok = (*ops->strmin)(p, hp, rp); } PoolClose(p); if (p == pcache) { inuse = false; } else { MyPoolDelete(p); /* Delete temp pool unless it's our cached one */ } } else { /* Print the "No such file..." error left by access() */ fprintf(stderr, "%s: %s\n", str, sperror()); } return ok; } /* * Arrange that later attempts to read the same file will actually re-read it. * * cH: above comment is crap: at least since v1.6 a PoolClose() would * result in actually closing the file, so a new PoolStreamOpen() * would position right at the start of the data. We just delete the * pool. */ static int commandclose(Pool *p) { PoolClose(p); MyPoolDelete(p); return 0; } LDEFINE(setenv, LVOID, "(setenv name string)\n" "Sets the environment variable ``name'' to the value ``string''; the " "name is visible to geomview (as in pathnames containing $name) " "and to processes it creates, e.g. external modules.") { char *name, *string = NULL; char buf[10240]; LDECLARE(("setenv", LBEGIN, LSTRING, &name, LSTRING, &string, LEND)); sprintf(buf, "%s=%s", name, string); envexpand(buf+strlen(name)+1); putenv(strdup(buf)); return Lt; } LDEFINE(input_translator, LVOID, "(input-translator \"#prefix_string\" \"Bourne-shell-command\")\n" "Defines an external translation program for special input types. " "When asked to read a file which begins with the specified string, " "Geomview invokes that program with standard input coming from the " "given file. The program is expected to emit OOGL geometric data to " "its standard output. In this implementation, only prefixes beginning " "with # are recognized.") { char *prefix, *cmd; LDECLARE(("input-translator", LBEGIN, LSTRING, &prefix, LSTRING, &cmd, LEND)); GeomAddTranslator(prefix, cmd); return Lt; } /************************************************************************/ /* * Signal handling routines. * Any code here must be careful not to do anything unsafe at signal time, * e.g. calls to stdio routines or malloc. These routines just examine and * change fields in existing data structures. */ /* * Handle death of a child process -- possibly an emodule. * If it is, mark it dead. */ static void comm_sigchld(int sig) { #if HAVE_WAITPID int status; int pid = waitpid(-1, &status, WNOHANG); #elif HAVE_WAIT3 union wait status; int pid = wait3(&status, WNOHANG|WUNTRACED, NULL); #else # error FIXME #endif if (WIFEXITED(status) || WIFSIGNALED(status)) { emodule *em = VVEC(uistate.emod, emodule); int i; for(i = 0; i < VVCOUNT(uistate.emod); i++, em++) { if (em->pid == pid) { em->pid = -pid; uistate.emod_check = 1; } } } signal(SIGCHLD, comm_sigchld); } /* * SIGTTIN indicates we're reading from stdin, but we've been placed in the * background. Suspend reading from stdin for two seconds. */ static void comm_sigttin(int sig) { Pool *p = PoolByName("-", NULL); if (p != NULL) PoolSleepFor(p, 2.); signal(SIGTTIN, comm_sigttin); #ifdef SA_RESTART /* Do we have sigaction()? If so, be sure * SIGTTIN won't restart the read it interrupts! */ { struct sigaction sa; if (sigaction(SIGTTIN, NULL, &sa) >= 0) { sa.sa_flags &= ~SA_RESTART; sigaction(SIGTTIN, &sa, NULL); } } #endif } static const char *signal_name(int sig) { static char buffer[256]; switch(sig) { case SIGSEGV: return "Segmentation violation"; case SIGBUS: return "Bus error"; case SIGILL: return "Illegal instruction"; default: snprintf(buffer, sizeof(buffer), "Signal number %d\n", sig); return buffer; } } static void fatalsig(int sig) { char die = 'y'; fprintf(stderr, "Geomview(%d): internal error: \"%s\"; " "dump core now (y/n) [n] ? ", getpid(), signal_name(sig)); fflush(stderr); ign_read(2, &die, 1); fprintf(stderr, "got answer %c\n", (int)die % 0xff); fflush(stderr); if (die != 'y' && die != 'Y') gv_exit(); /* else return, and hope the OS gives us a core dump. */ signal(sig, SIG_DFL); } typedef void (*mysigfunc_t)(); static void catchsig(int sig, mysigfunc_t func) { mysigfunc_t oldfunc = (mysigfunc_t)signal(sig, func); if (oldfunc == (mysigfunc_t)SIG_IGN) signal(sig, oldfunc); } void comm_init() { signal(SIGCHLD, comm_sigchld); signal(SIGTTIN, comm_sigttin); signal(SIGPIPE, SIG_IGN); /* Write on broken pipe -> I/O error */ if (!gv_debug) { catchsig(SIGINT, (mysigfunc_t)gv_exit); catchsig(SIGSEGV, (mysigfunc_t)fatalsig); catchsig(SIGBUS, (mysigfunc_t)fatalsig); catchsig(SIGILL, (mysigfunc_t)fatalsig); } catchsig(SIGHUP, (mysigfunc_t)gv_exit); catchsig(SIGTERM, (mysigfunc_t)gv_exit); lang_init(); } int comm_route( char *str ) { comm_object( str, &CommandOps, NULL, NULL, COMM_LATER ); return 0; } static int emodule_commandclose(Pool *p) { int i; emodule *em; for(i = 0, em = VVEC(uistate.emod, emodule); i < VVCOUNT(uistate.emod); i++, em++) { if (em->link == p && em->pid <= 0) { emodule_reap(em); return 1; } } return 0; } void emodule_reap(emodule *em) { Lake *lake; Pool *p = em->link; if (p != NULL) { em->link = NULL; if ((lake=(Lake*)PoolClientData(p)) != NULL) { RemoveLakeInterests(lake); } PoolClose(p); MyPoolDelete(p); } ui_emodule_uninstall(em - VVEC(uistate.emod, emodule)); return; } int emodule_kill(emodule *em) { kill(-em->pid, SIGHUP); /* Kill child's process group in case it has one */ /* Kill child process itself. comm_sigchld() ought to be invoked if it dies, * but put this check here, just in case, since we're having trouble on the * SGI. */ if (kill(em->pid, SIGHUP) < 0 && errno == ESRCH) { em->pid = -abs(em->pid); uistate.emod_check = 1; } return 1; } LDEFINE(emodule_run, LVOID, "(emodule-run SHELL-COMMAND ARGS...)\n\ Runs the given SHELL-COMMAND (a string containing a UNIX shell\n\ command) as an external module. The module's standard output\n\ is taken as geomview commands; responses (written to filename\n\ \"-\") are sent to the module's standard input. The shell\n\ command is interpreted by /bin/sh, so e.g. I/O redirection may\n\ be used; a program which prompts the user for input from the\n\ terminal could be run with:\n\ (emodule-run yourprogram <&2)\n\ If not already set, the environment variable $MACHTYPE is set\n\ to the name of the machine type. Input and output\n\ connections to geomview are dropped when the shell command\n\ terminates. Clicking on a running program's module-browser entry\n\ sends the signal SIGHUP to the program. For this to work, programs\n\ should avoid running in the background; those using FORMS or GL\n\ should call foreground() before the first FORMS or winopen() call.\n\ See also emodule-define, emodule-start.") { char *cmd; emodule em; LDECLARE(("emodule-run", LBEGIN, LSTRINGS, &cmd, LEND)); em.text = em.name = cmd; em.data = NULL; em.dir = NULL; emodule_run(&em); return Lt; } /* Does str appear to contain template? * Check if str is either equal to the template, or contains template as a * prefix followed by a blank. */ static int matches(char *template, int len, char *str) { if (str == NULL) return 0; return (strncasecmp(template, str, len) == 0 && (str[len] == '\0' || isspace(str[len]))); } /* This routine searches through the running emodules and returns the index * of the first on matching modname. Case sensitive. modname is * looked for first in the names as they appear in the browser * (minus the number in []'s) then as they appear in the command used to * run the module, minus the arguments. Returns -1 if the module is not * found. * -cf */ int emodule_running_index(char *modname) { char *name; emodule *em; int i, len; if (modname == NULL) return -1; len = strlen(modname); for (i = 0, em = VVEC(uistate.emod, emodule); i < VVCOUNT(uistate.emod); i++, em++) if (em->pid > 0) { name = strchr(em->name, ']'); if (name == NULL) name = em->name; else name++; if (matches(modname, len, name) || matches(modname, len, em->name) || matches(modname, len, em->text)) return i; } return -1; } LDEFINE(emodule_isrunning, LVOID, "(emodule-isrunning NAME)\n\ Returns Lt if the emodule NAME is running, or Lnil\n\ if it is not running. NAME is searched for in the\n\ names as they appear in the browser and in the shell commands\n\ used to execute the external modules (not including arguments).") { char *modname; LDECLARE(("emodule-isrunning", LBEGIN, LSTRING, &modname, LEND)); if (emodule_running_index(modname) != -1) return Lt; else return Lnil; } /* * NeXT applications need to know the absolute paths of their executables. * If we got an emodule definition from a ``.geomview-X'' file in directory Y, * and the definition begins with the name of a file living in Y, * then prepend the directory name to the shell command. * The strcspn() is an attempt to grab the first word of a shell command. */ static char * truepath(char *program, char *dir) { static char *buf = NULL; int len; char path[10240]; len = strcspn(program, "()<> \t;"); if (len == 0) return program; sprintf(path, "%s/%.*s", dir, len, program); envexpand(path); if (access(path, X_OK) == 0) { if (buf) free(buf); strcat(path, program + len); program = buf = strdup(path); } return program; } emodule * emodule_run(emodule *em) { struct pipe { int r, w; } pfrom, pto; emodule *newem; int i, pid; char *program; int otherpgrp = 1; char seqname[128]; program = em->text; if (program[0] == '!') { program++; otherpgrp = 0; } /* create the communication pipes */ pfrom.r = pfrom.w = -1; if (pipe((int *)&pfrom) < 0 || pipe((int *)&pto) < 0) { OOGLError(1, "Can't create pipe to external module: %s", sperror()); if (pfrom.r >= 0) { close(pfrom.r); close(pfrom.w); } return NULL; } signal(SIGCHLD, SIG_DFL); /* invoke external module */ switch(pid = fork()) { case -1: OOGLError(1, "Can't fork external module: %s", sperror()); return NULL; case 0: { char envbuf[10240]; if (otherpgrp) { #if SETPGRP_VOID setpgrp(); #else setpgrp(0,getpid()); #endif } if (em->dir) { program = truepath(program, em->dir); sprintf(envbuf, "PATH=%s:%s", em->dir, getenv("PATH")); envexpand(envbuf); } else { /* Append known module directories to the subprocess' PATH. * This lets us emodule-run an existing module program with * special arguments, without having to specify its full path. */ char *p = envbuf; sprintf(envbuf, "PATH=%s", getenv("PATH")); for(i = 0; i < emodule_path_count; i++) { p += strlen(p); *p++ = ':'; strcpy(p, VVEC(vv_emodule_path, char *)[i]); } } putenv(envbuf); close(pfrom.r); close(pto.w); dup2(pto.r, STDIN_FILENO); close(pto.r); dup2(pfrom.w, STDOUT_FILENO); close(pfrom.w); signal(SIGPIPE, SIG_DFL); signal(SIGCHLD, SIG_DFL); execl("/bin/sh", "sh", "-c", program, NULL); fprintf(stderr, "Can't exec external module: "); perror(em->text); exit(1); } default: /* parent */ break; } close(pto.r); close(pfrom.w); for(i=1; ; i++) { sprintf(seqname, "[%d]%.100s", i, em->name); if (ui_emodule_index(seqname,NULL) < 0) break; } /* * Register new module in the UI's table. * Setting its callback to emodule_kill() means that clicking on that * browser entry will kill the module. * We insert it before the entry that created it, if any; * otherwise at the beginning of the table. */ i = em - VVEC(uistate.emod, emodule); if (i < 0 || i > VVCOUNT(uistate.emod)) i = 0; newem = ui_emodule_install(i, seqname, emodule_kill); newem->link = PoolStreamOpen( seqname, fdopen(pfrom.r, "rb"), 0, &emoduleCommandOps ); if (newem->link) { /* Attach output stream, too. */ PoolStreamOpen(seqname, fdopen(pto.w, "w"), 1, &emoduleCommandOps); /* Kludge. We want to ensure that EOF indications are "hard", i.e. * that we cease reading and drop the emodule as soon as we see EOF. * Unfortunately I can't find any way in the refcomm library * to distinguish nameless pipes (-> hard eof) from named ones * (where eof may be a temporary condition). So the library * guesses they're soft. We need to tell it otherwise. -slevy 921005 */ newem->link->softEOF = 0; } newem->pid = pid; signal(SIGCHLD, comm_sigchld); return newem; } LDEFINE(command, LVOID, "(command INFILE [OUTFILE])\n\ Read commands from INFILE; send corresponding responses\n\ (e.g. anything written to filename \"-\") to OUTFILE, stdout\n\ by default.") { char *file, *ofile = NULL; LDECLARE(("command", LBEGIN, LSTRING, &file, LOPTIONAL, LSTRING, &ofile, LEND)); if (PoolStreamOpen(file, NULL, 0, &CommandOps) == NULL) { OOGLError(0,"command: cannot open input %s: %s\n", file, sperror()); return Lnil; } if (ofile) { FILE *outf = (strcmp(ofile, "-")) ? fopen(ofile, "w") : stdout; if (outf == NULL) { OOGLError(0,"command: cannot open output %s: %s\n", ofile, sperror()); return Lnil; } else PoolStreamOpen(file, outf, 1, &CommandOps); } return Lt; } LDEFINE(sleep_for, LVOID, "(sleep-for TIME)\n\ Suspend reading commands from this stream for TIME seconds.\n\ Commands already read will still be executed; ``sleep-for'' inside\n\ ``progn'' won't delay execution of the rest of the progn's contents.") { Lake *sweenie; float time; LDECLARE(("sleep-for", LBEGIN, LLAKE, &sweenie, LFLOAT, &time, LEND)); PoolSleepFor(POOL(sweenie), time); return Lt; } LDEFINE(sleep_until, LFLOAT, "(sleep-until TIME)\n\ Suspend reading commands from this stream until TIME (in seconds).\n\ Commands already read will still be executed; ``sleep-until'' inside\n\ ``progn'' won't delay execution of the rest of the progn's contents.\n\ Time is measured according to this stream's clock, as set by\n\ ``set-clock''; if never set, the first sleep-until sets it to 0\n\ (so initially (sleep-until TIME) is the same as (sleep-for TIME)).\n\ Returns the number of seconds until TIME.") { Lake *bass; float time; LDECLARE(("sleep-until", LBEGIN, LLAKE, &bass, LFLOAT, &time, LEND)); PoolSleepUntil(POOL(bass), time); time -= PoolTimeAt(POOL(bass), NULL); /* NULL => now. */ return LNew(LFLOAT, &time); } LDEFINE(set_clock, LVOID, "(set-clock TIME)\n\ Adjusts the clock for this command stream to read TIME (in seconds)\n\ as of the moment the command is received. See also sleep-until, clock.") { Lake *bass; float time; LDECLARE(("set-clock", LBEGIN, LLAKE, &bass, LFLOAT, &time, LEND)); PoolSetTime(POOL(bass), NULL, time); return Lt; } LDEFINE(clock, LVOID, "(clock)\n" "Returns the current time, in seconds, as shown by this stream's " "clock. See also set-clock and sleep-until.") { Lake *rainy; float time; LDECLARE(("clock", LBEGIN, LLAKE, &rainy, LEND)); time = PoolTimeAt(POOL(rainy), NULL); return LNew(LFLOAT, &time); } /* This used to be the guts of echo - it's now in a seperate procedure * for use by emodule-transmit. * -cf */ void echo_to_fp(LList *arglist, FILE *fp) { LObject *arg, *val; if (arglist == NULL) { fputs("\n", fp); } else { for(;;) { arg = arglist->car; /* Note that -- for compatibility -- we distinguish the case of * a function which evaluates to a string and a literal * string. A literal string is written without quotes, a * function evaluating to a string results in printing a quoted * string. An example is (echo (read-id focus)) which used to * result in printing the id of the active camera as quoted * string. */ if (arg->type == LSTRING) { /* omit the quotes */ fputs(LSTRINGVAL(arg), fp); } else { val = LEval(arg); LWrite(fp, val); LFree(val); } if ((arglist = arglist->cdr) == NULL) { break; } fputs(" ", fp); } } fflush(fp); } LDEFINE(echo, LVOID, "(echo ...)\n" "Write the given data to the special file \"-\". Strings are written " "literally; lisp expressions are evaluated and their values written. " "If received from an external program, \"echo\" sends to the " "program's input. Otherwise writes to geomview's own standard output " "(typically the terminal).") { Lake *powderhorn; LList *arglist = NULL; FILE *fp; LDECLARE(("echo", LBEGIN, LLAKE, &powderhorn, LHOLD, LREST, &arglist, LEND)); if ((fp = PoolOutputFile(POOL(powderhorn))) == NULL) { fp = stdout; } echo_to_fp(arglist, fp); return Lt; } LDEFINE(emodule_transmit, LVOID, "(emodule-transmit NAME LIST)\n\ Places LIST into external module NAME's standard input. NAME is\n\ searched for in the names of the modules as they appear in the\n\ External Modules browser and then in the shell commands used to\n\ execute the external modules. Does nothing if modname is not\n\ running.") { char *modname; emodule *em; LList *message = NULL; int i; LDECLARE(("emodule-transmit", LBEGIN, LSTRING, &modname, LHOLD, LREST, &message, LEND)); i = emodule_running_index(modname); if (i == -1) { return Lnil; } em = VVINDEX(uistate.emod, emodule, i); if (em->link && em->link->outf) { echo_to_fp(message, em->link->outf); return Lt; } return Lnil; } LDEFINE(read, LVOID, "(read {geometry|camera|image|appearance|transform|ntransform|command} " "{GEOMETRY or CAMERA or ...})\n" "Read and interpret the text in ... as containing the " "given type of data. Useful for defining objects using OOGL " "reference syntax, e.g. " "\n\n\n\n" "(geometry thing { INST transform : T geom : fred })\n\n" "(read geometry { define fred QUAD 1 0 0 0 1 0 0 0 1 1 0 0 })\n\n" "(read transform { define T streamin, "\"read\" in \"%s\": keyword " "{command|geometry|camera|window|transform|" "ntransform|image|appearance} expected, " "got \"%s\"", LakeName(lake), opsname); goto fail; } /* parse 2nd arg, using ops determined by 1st arg. Note: we don't actually store the 1st arg because this function's work is all done during parsing. */ if (!LakeMore(lake) || (*ops->strmin)(POOL(lake), NULL, NULL) == 0) { OOGLSyntax(lake->streamin, "\"read %s\" in \"%s\": error reading %s's", opsname, PoolName(POOL(lake)), opsname); goto fail; } } /* if lake == NULL then we're evaluating, but this function does no evaluation work; it's all in the parsing */ LFree(kw); return Lt; fail: LFree(kw); return Lnil; } void gv_merge(HandleOps *ops, int camid, Ref *object) { CameraStruct cs; /* Might be either camera or window, really */ cs.h = NULL; #if 0 cs.cam = REFGET(Camera, object); /* Since (merge ...) will delete it */ #endif LFree(LEvalFunc("merge", LSTRING, ops == &CamOps ? "camera" : "window", LID, camid, ops == &CamOps ? LCAMERA : LWINDOW, &cs, LEND) ); } LDEFINE(merge, LVOID, "(merge {window|camera} CAM-ID { WINDOW or CAMERA ... } )\n" "Modify the given window or camera, changing just those properties " "specified in the last argument. E.g.\n\n" " (merge camera \"Camera\" { far 20 })\n\n" "sets Camera's far clipping plane to 20 while leaving " "other attributes untouched.") /* Since we don't use LDECLARE we must remember to LDefun() this function manually in lang_init() in file lang.c. */ { char *opsname = NULL; HandleOps *ops; int id; LObject *kw = NULL, *idarg = NULL, *item = NULL; if (LPARSEMODE) { /* parse first arg [ops]: */ if (!LakeMore(lake) || (kw = LSexpr(lake)) == Lnil || !LSTRINGFROMOBJ(kw, &opsname) || ((ops = str2ops(opsname)) != &CamOps && ops != &WindowOps)) { OOGLSyntax(lake->streamin, "\"merge\" in \"%s\": expected \"camera\" or \"window\", " "got \"%s\"", LakeName(lake), opsname); goto parsefail; } /* parse 2nd arg; it's a string (id) */ if (!LakeMore(lake) || (idarg = LEvalSexpr(lake)) == Lnil) { OOGLSyntax(lake->streamin,"\"merge\" in \"%s\": expected CAM-ID", LakeName(lake)); goto parsefail; } item = LPARSE(((ops == &CamOps) ? LCAMERA : LWINDOW))(lake); if (item == Lnil) { OOGLSyntax(lake->streamin, "\"merge\" in \"%s\": error reading %s", LakeName(lake), LSTRINGVAL(kw)); goto parsefail; } LListAppend(args, kw); LListAppend(args, idarg); LListAppend(args, item); return Lt; } else { LParseArgs("merge", LBEGIN, LREST, &args, LEND); } kw = LListEntry(args, 1); idarg = LListEntry(args, 2); item = LListEntry(args, 3); if (!LSTRINGFROMOBJ(kw, &opsname) || ((ops = str2ops(opsname)) != &CamOps && ops != &WindowOps)) { OOGLError(0, "\"merge\": expected \"camera\" or \"window\", got %s", LSummarize(idarg)); return Lnil; } if (!LFROMOBJ(LID)(idarg, &id) || !ISCAM(id)) { OOGLError(0, "\"merge\": expected CAM-ID in arg position 2, got %s", LSummarize(idarg)); return Lnil; } if (ops == &CamOps) { CameraStruct *cs; if (!LFROMOBJ(LCAMERA)(item, &cs)) { OOGLError(0,"\"merge\": expected camera in arg position 3"); return Lnil; } drawer_merge_camera(id, cs->cam); /* CamDelete(cs->cam); */ } else { WindowStruct *ws; if (!LFROMOBJ(LWINDOW)(item, &ws)) { OOGLError(0,"\"merge\": expected window in arg position 3"); return Lnil; } drawer_merge_window(id, ws->wn); /* WnDelete(ws->wn); */ } return Lt; parsefail: LFree(kw); LFree(idarg); LFree(item); return Lnil; } static void MyPoolDelete(Pool *p) { Lake *lake = (Lake*)PoolClientData(p); if (lake) { RemoveLakeInterests(lake); LakeFree(lake); } PoolDelete(p); } HandleOps * str2ops(char *str) { if (str == NULL) return NULL; else if (!strncmp(str, "cam", 3)) return &CamOps; else if (!strncmp(str, "geom", 4)) return &GeomOps; else if (!strncmp(str, "comm", 4)) return &CommandOps; else if (!strncmp(str, "trans", 5)) return &TransOps; else if (!strncmp(str, "ntrans", 6)) return &NTransOps; else if (!strncmp(str, "win", 3)) return &WindowOps; else if (!strncmp(str, "image", sizeof("image")-1)) return &ImageOps; else if (!strncmp(str, "appearance", sizeof("appearance")-1)) return &AppearanceOps; else return NULL; } LType * ops2ltype(HandleOps *ops) { if (ops == &CamOps) return LCAMERA; else if (ops == &GeomOps) return LGEOM; else if (ops == &WindowOps) return LWINDOW; else if (ops == &TransOps) return LTRANSFORM; else if (ops == &NTransOps) return LTRANSFORMN; else if (ops == &CommandOps) return LLOBJECT; else if (ops == &ImageOps) return LIMAGE; else if (ops == &AppearanceOps) return LAP; else return NULL; } /************************************************************************/ LDEFINE(load, LINT, "(load filename [command|geometry|camera])\n\ Loads the given file into geomview. The optional second argument\n\ specifies the type of data it contains, which may be \"command\"\n\ (geomview commands), \"geometry\" (OOGL geometric data), or\n\ \"camera\" (OOGL camera definition). If omitted, attempts to guess\n\ about the file's contents.\n\ Loading geometric data creates a new visible object; loading a camera\n\ opens a new window; loading a command file executes those commands.\n") { char *file, *opsname = NULL; HandleOps *ops = &CommandOps; int guess = 1; LDECLARE(("load", LBEGIN, LSTRING, &file, LOPTIONAL, LSTRING, &opsname, LEND)); if (opsname != NULL) { guess = 0; ops = str2ops(opsname); if (ops != &CommandOps && ops != &GeomOps && ops != &CamOps) { OOGLError(0, "load: expected \"command\" or \"geometry\" or \"camera\", got \"%s\"", opsname); return Lnil; } } loadfile(file, ops, guess); return Lt; } void loadfile(char *name, HandleOps *defops, int guess) { Handle *h = NULL; Ref *obj = NULL; HandleOps *ops = NULL; char *pathname; int freename = 0; if (strcmp(name, "-") == 0) { guess = 0; } else if ((pathname=findfile(NULL, name))) { name = strdup(pathname); freename = 1; } else if (strchr(name, ' ') == NULL && strchr(name, '(') == NULL && strchr(name, '<') == NULL) { OOGLError(0, "Can't find file %s", name); return; } if (ispipe(name)) { guess = 0; } if (!guess) { if (comm_object(name, defops, &h, &obj, COMM_LATER)) { ops = defops; } else { OOGLError(0, "Can't load %s's from %s", defops->prefix, name); return; } } else if (comm_object(name, &GeomOps, &h, &obj, COMM_LATER)) { ops = &GeomOps; } else if (comm_object(name, &CamOps, &h, &obj, COMM_LATER)) { ops = &CamOps; } else if (!(comm_object(name, &CommandOps, &h, NULL, COMM_LATER))) { OOGLError(0,"Can't load %s",name); return; } useconnection( name, ops, h, obj, 1 ); if (freename) { free(name); } return; } LDEFINE(hdelete, LVOID, "(hdelete [geometry|camera|window|image|appearance|transform|ntransform] name)\n" "Deletes the given handle. Note that the handle will not actually be " "deleted in case there are still other objects referring to the " "handle, but once those objects are gone, the handle will also " "automatically go away. The object the handle refers to (if any) " "will only be deleted if there are no other references to that object." "\n\n\n\n" "If the optional first argument is omitted, then the first handle " "matching \"name\" will be deleted, regardless of the type of the " "object it is attached to. It is not an error to call this function " "with a non-existent handle, but it is an error to call this funcion " "with the name of a non-global handle, i.e. one that was not " "created by (hdefine ...) or (read ... { define ...}).") { Handle *h = NULL; HandleOps *ops = NULL; char *hname = NULL, *opsname = NULL, *horo; LDECLARE(("hdelete", LBEGIN, LSTRING, &horo, LOPTIONAL, LSTRING, &hname, LEND)); if (hname == NULL) { hname = horo; } else { opsname = horo; } if (opsname && ((ops = str2ops(opsname)) == NULL || ops2ltype(ops) == NULL)) { OOGLError(0, "\"hdelete\": " "expected \"camera\" or \"window\" or \"geometry\" or " "\"transform\" or \"ntransform\" or " "\"image\" or \"appearance\", got \"%s\"", opsname); return Lnil; } if ((h = HandleByName(hname, ops)) != NULL) { REFPUT(h); /* undo HandleByName() REFGET */ if (!h->permanent) { OOGLError(0, "\"hdelete\": " "attempt to delete the non-global handle \"%s[%s]\"", opsname ? opsname : "", hname); return Lnil; } h->permanent = false; HandleDelete(h); } return Lt; } LDEFINE(hdefine, LVOID, "(hdefine " "{geometry|camera|window|image|appearance|transform|ntransform} " "name value)\n" "Sets the value of a handle of a given type. " "(hdefine ) is generally equivalent to " "(read { define }) " "except that the assignment is done when hdefine is executed, " "(possibly not at all if inside a conditional statement), " "while the ``read ... define'' performs assignment as soon as the " "text is read.") { Handle *h = NULL; HandleOps *ops = NULL; LType *ltype; char *hname; char *opsname = NULL; Ref *obj; LObject *kw = NULL, *name = NULL, *item = NULL; union { GeomStruct gs; CameraStruct cs; TransformStruct ts; TmNStruct tns; WindowStruct ws; ApStruct as; ImgStruct img; LObject lobj; } *s; if (LPARSEMODE) { /* parse first arg [ops]: */ if (! LakeMore(lake) || (kw = LSexpr(lake)) == Lnil || !LSTRINGFROMOBJ(kw, &opsname) || (ops = str2ops(opsname)) == NULL || (ltype = ops2ltype(ops)) == NULL) { OOGLSyntax(lake->streamin, "\"hdefine\" in \"%s\": " "expected \"camera\" or \"window\" or \"geometry\" or " "\"transform\" or \"ntransform\" or " "\"image\" or \"appearance\", got \"%s\"", LakeName(lake), opsname); goto parsefail; } /* parse 2nd arg; it's a string (id) */ if (!LakeMore(lake) || (name = LEvalSexpr(lake)) == Lnil) { OOGLSyntax(lake->streamin, "\"hdefine %s\" in \"%s\": expected handle name", LakeName(lake), opsname); goto parsefail; } item = LPARSE(ltype)(lake); if (item == Lnil) { OOGLSyntax(lake->streamin, "\"hdefine\" in \"%s\": error reading %s", LakeName(lake), LSTRINGVAL(kw)); goto parsefail; } LListAppend(args, kw); LListAppend(args, name); LListAppend(args, item); return Lt; } LParseArgs("hdefine", LBEGIN, LREST, &args, LEND); kw = LListEntry(args, 1); name = LListEntry(args, 2); item = LListEntry(args, 3); if (!LSTRINGFROMOBJ(kw, &opsname) || (ops = str2ops(opsname)) == NULL || (ltype = ops2ltype(ops)) == NULL) { OOGLError(0, "\"hdefine\": expected data type, got %s", LSummarize(kw)); return Lnil; } if (!LSTRINGFROMOBJ(name, &hname)) { OOGLError(0, "\"hdefine\": expected handle name, got %s", LSummarize(name)); return Lnil; } if (!LFROMOBJ(ltype)(item, &s)) { OOGLError(0, "\"hdefine\": Can't extract %s from %s", ltype->name, LSummarize(item)); return Lnil; } h = HandleCreateGlobal(hname, ops); REFPUT(h); if (ops == &CommandOps) { obj = NULL; /* (Ref *)LispCreate( s->lobj ) */ } else if (ops == &TransOps) { obj = (Ref *)TransCreate(s->ts.tm); } else { obj = (Ref *)s->gs.geom; /* All other types resemble geoms */ } HandleSetObject(h, obj); if (ops == &TransOps) { REFPUT(obj); /* otherwise obj will never be deleted */ } return Lt; parsefail: LFree(kw); LFree(name); LFree(item); return Lnil; } /*****************************************************************************/ #if HAVE_UNIX_SOCKETS || HAVE_INET_SOCKETS || HAVE_INET6_SOCKETS #if HAVE_SYS_SOCKET_H # include #endif #if HAVE_NETINET_IN_H # include #endif #if !HAVE_DECL_ACCEPT int accept(int sockfd, struct sockaddr *addr, ACCEPT_ARG3_TYPE *addrlen); #endif #if HAVE_UNIX_SOCKETS /* * makeunixsocket(name) makes a UNIX-domain listening socket and returns its fd. */ static int makeunixsocket(char *name) { struct sockaddr_un un; int s; unlink(name); strcpy(un.sun_path, name); un.sun_family = AF_UNIX; if ((s = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) { OOGLError(0, "geomview: can't make UNIX domain socket: %s", sperror()); return -1; } if (bind(s, (struct sockaddr *)&un, sizeof(un)) < 0 || listen(s, 4) < 0) { OOGLError(0, "geomview: can't listen on socket %s: %s",name,sperror()); return -1; } return s; } #endif /* HAVE_UNIX_SOCKKETS */ #if HAVE_INET_SOCKETS /* * makeinetsocket(name) makes a IPv4 listening socket and returns its fd. */ static int makeinetsocket(int port) { struct sockaddr_in in; int s; if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) { OOGLError(0, "geomview: can't make IPv4 socket: %s", sperror()); return -1; } in.sin_family = AF_INET; in.sin_port = htons(port); in.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(s, (struct sockaddr *)&in, sizeof(in)) < 0 || listen(s, 4) < 0) { OOGLError(0, "geomview: can't listen on IPv4 port %d: %s", port, sperror()); return -1; } return s; } #endif /* HAVE_INET_SOCKETS */ #if HAVE_INET6_SOCKETS /* * makeinet6socket(name) makes a IPv6 listening socket and returns its fd. */ static int makeinet6socket(int port) { struct sockaddr_in6 in; struct in6_addr addr = IN6ADDR_ANY_INIT; int s; if ((s = socket(PF_INET6, SOCK_STREAM, 0)) < 0) { OOGLError(0, "geomview: can't make IPv6 socket: %s", sperror()); return -1; } in.sin6_family = AF_INET6; in.sin6_port = htons(port); in.sin6_addr = addr; if (bind(s, (struct sockaddr *)&in, sizeof(in)) < 0 || listen(s, 4) < 0) { OOGLError(0, "geomview: can't listen on IPv6 port %d: %s", port, sperror()); return -1; } return s; } #endif /* HAVE_INET6_SOCKETS */ /* * This pretends to be a stream-import routine, but it really handles * new connections on UNIX-domain sockets! */ int listenimport(Pool *listenp, Handle **hp, Ref **rp) { struct sockaddr_un un; ACCEPT_ARG3_TYPE len = sizeof(un); char conname[10240]; int i, ds; HandleOps *ops = (HandleOps *)PoolClientData(listenp); if ((ds = accept( iobfileno(listenp->inf), (struct sockaddr *)&un, &len) ) < 0) { OOGLError(0, "geomview: couldn't accept connection on %s: %s", listenp->poolname, sperror()); return 0; } for(i=1; ; i++) { /* Construct unique connection name */ sprintf(conname, "[%d]%.500s", i, listenp->poolname); if (PoolByName(conname, ops) == NULL) break; } PoolStreamOpen(conname, fdopen(ds, "rb"), 0, ops); /* * Reply on the same pipe's return stream. * Don't do this yet; only user so far is "togeomview", * which isn't prepared to receive data back from us. * PoolStreamOpen(conname, fdopen(ds, "w"), 1, (HandleOps*)PoolClientData(listenp)); */ PoolStreamOpen(conname, fdopen(ds, "w"), 1, ops); useconnection( listenp->poolname, ops, HandleCreate(conname, ops), NULL, 0 ); return 1; } #endif /* * usepipe(dir, suffix, type) * where the characters in "type" specify: * kind of connection (named-pipe 'p' or socket 's') and * type of data expected (command 'c' or geometry 'g'). * * For sockets 's' may be followed by eigher "un" (Unix domain * socket), "in" (IPv4 socket) or "in6" (IPv6 socket). For IP sockets * "suffix" actually specifies the port-number to use. pipedir is * ignored in that case. */ void usepipe(char *pipedir, char *suffix, char *pipetype) { HandleOps *ops = &GeomOps; int s; char *tail; char pipename[PATH_MAX]; char pdir[PATH_MAX]; enum { nopipe = -1, namedpipe = 1, unixsocket = 2, inetsocket = 3, inet6socket = 4 } usepipe = nopipe; int port = -1; while (*pipetype) switch(*pipetype++) { case 's': usepipe = unixsocket; /* Check for sin:PORT and sin6:PORT sockets, allow sun socket type */ if (strncmp(pipetype, "un", 2) == 0) { pipetype += 2; } else if (strncmp(pipetype, "in6", 3) == 0) { usepipe = inet6socket; pipetype += 3; } else if (strncmp(pipetype, "in", 2) == 0) { usepipe = inetsocket; pipetype += 2; } break; case 'p': usepipe = namedpipe; break; case 'c': ops = &CommandOps; break; case 'g': ops = &GeomOps; break; default: OOGLError(0, "Unknown character '%c' in pipe type string: " "expected s, p, c, g", pipetype[-1]); } if (usepipe == nopipe) { #ifdef NeXT usepipe = unixsocket; #else usepipe = namedpipe; #endif } if (usepipe == unixsocket || usepipe == namedpipe) { if (suffix[0] == '/') { strcpy(pdir, suffix); tail = strrchr(pdir, '/'); *tail = '\0'; pipedir = pdir; suffix = tail + 1; } sprintf(pipename, "%s/%s", pipedir, suffix); mkdir(pipedir, 0777); chmod(pipedir, 0777); } else { port = atoi(suffix); } switch (usepipe) { case namedpipe: { /* Establish System-V style named pipe. * Expect data on it of type 'ops'. * If there's a non-pipe with that name, trash it. */ struct stat st; if (stat(pipename, &st) == 0 && (st.st_mode & S_IFMT) != S_IFIFO) unlink(pipename); if (access(pipename, 0) < 0) { if (mknod(pipename, S_IFIFO, 0) < 0) OOGLError(1, "Can't make pipe: %s: %s", suffix, sperror()); chmod(pipename, 0666); } loadfile(pipename, ops, 0); break; } #if HAVE_UNIX_SOCKETS case unixsocket: /* Establish UNIX-domain listener socket. * When we get connections to it, expect data of type 'ops'. */ s = makeunixsocket(pipename); if (s >= 0) { Pool *p = PoolStreamOpen(pipename, fdopen(s, "rb"), 0, &listenOps); if (p) PoolSetClientData(p, ops); p->flags |= PF_NOPREFETCH; } break; #endif #if HAVE_INET_SOCKETS case inetsocket: /* Establish UNIX-domain listener socket. * When we get connections to it, expect data of type 'ops'. */ s = makeinetsocket(port); if (s >= 0) { Pool *p = PoolStreamOpen(pipename, fdopen(s, "rb"), 0, &listenOps); if (p) PoolSetClientData(p, ops); p->flags |= PF_NOPREFETCH; } break; #endif #if HAVE_INET6_SOCKETS case inet6socket: /* Establish UNIX-domain listener socket. * When we get connections to it, expect data of type 'ops'. */ s = makeinet6socket(port); if (s >= 0) { Pool *p = PoolStreamOpen(pipename, fdopen(s, "rb"), 0, &listenOps); if (p) PoolSetClientData(p, ops); p->flags |= PF_NOPREFETCH; } break; #endif default: break; } } /* * Assume we have a connection open named "name", expecting data of * type "ops". Wire it to an appropriate geomview object, if any. * (Data received on that connection will set the value of that object.) * Since (new_)geometry and (new_)camera take ownership of the object, * increasing its reference count, we decr the ref count after handing it over. */ static void useconnection(char *name, HandleOps *ops, Handle *h, Ref *obj, int unique) { char *tail; tail = strrchr(name, '/'); if (tail) tail++; else tail = name; if (ops == &GeomOps) { GeomStruct gs; if(h && !h->permanent) { #if 0 /* same logic as in geomparse() */ HandleDelete(h); h = NULL; #endif } gs.h = h; gs.geom = (Geom *)obj; if (unique) gv_new_geometry( tail, &gs ); else gv_geometry( tail, &gs ); GeomDelete((Geom *)obj); /* Maintain ref count */ HandleDelete(h); /* Maintain ref count */ } else if (ops == &CamOps) { CameraStruct cs; if(h && !h->permanent) { #if 0 /* same logic as in geomparse() */ HandleDelete(h); h = NULL; #endif } cs.h = h; cs.cam = (Camera *)obj; if (unique) gv_new_camera( tail, &cs ); else gv_camera( tail, &cs ); CamDelete((Camera *)obj); /* Maintain ref count */ HandleDelete(h); /* Maintain ref count */ } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/comm.h0000644000175000017500000000477112310110177016050 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef COMM_H #define COMM_H /* * comm_object() interprets a string to yield an object. * If the string is exactly the name of a file, open & read the file, * otherwise interpret it as something in that object's syntax. * The 'now' flag determines whether the file must be read immediately. * COMM_NOW returns failure (0) if an object can't immediately be * read from the file. It reads at most one object from the file, * then closes it. If trying to guess the type of a file, * you MUST use COMM_NOW. * COMM_LATER reads an object if it can, but returns failure only * if a file can't be opened. However, it leaves the file open and * listening for further data. If opening something other than a plain * file e.g. a named pipe, you MUST use COMM_LATER. */ #define COMM_NOW 1 #define COMM_LATER 0 extern HandleOps CommandOps, TransOps, NTransOps, GeomOps, CamOps, WindowOps; extern void comm_init(); extern int comm_object(char *str, HandleOps *, Handle **hp, Ref **rp, int now); extern int comm_read(char *kind, Pool *p); extern int comm_route(char *str); /* interpret str as command */ extern void gv_merge(HandleOps *ops, int id, Ref *window_or_camera); /* Maps string 'commands/geometry/transform/camera' * into a HandleOps pointer, or NULL. * Allows abbreviations. */ extern HandleOps *str2ops(char *name); extern void loadfile(char *filename, HandleOps *defaultops, int guess); extern emodule *emodule_run(emodule *em); extern int emodule_kill(emodule *em); extern void emodule_reap(emodule *em); extern int gv_debug; #endif /* ! COMM_H */ geomview-1.9.5/src/bin/geomview/common/common.h0000644000175000017500000000256512310110177016404 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef COMMON_H #define COMMON_H #include "mg.h" #include "geom.h" #include "pick.h" #include "lispext.h" #include "clang.h" typedef int (*PFI)(); typedef void (*PFV)(); typedef struct Event { int dev; int val; int x,y; unsigned long int t; Pick *p; } Event; #if D1_DEBUG void print_event(char *s, Event *e); #define PRINT_EVENT(args) print_event args #else #define PRINT_EVENT(args) #endif #endif /* ! COMMON_H */ geomview-1.9.5/src/bin/geomview/common/drawer.c0000644000175000017500000027423712310110177016402 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #include "mg.h" #include "fsa.h" #include "drawer.h" #include "event.h" #include "ui.h" #include "comm.h" #include "transform.h" #include "transformn.h" #include "lang.h" #include "ooglutil.h" #include "geom.h" #include "camera.h" #include "space.h" #include "list.h" /* for ListRemove(), ListAppend() */ #include "comment.h" #include "transobj.h" #include "ntransobj.h" #include "lang.h" #include "lispext.h" #include "lights.h" #include "cmodel.h" #include "mouse.h" #include #include #include #include /* Use sys/file.h since unistd.h doesn't exist on the NeXT, and hopefully sys/file.h is sufficient on both NeXT and IRIS [ needed for use of access() ]. */ /*#include */ #include static Fsa name_fsa = NULL; DrawerState drawerstate; static int drawer_dgeom(int id, GeomStruct *gs); static int spaceval(char *s, int val); static HModelValue hmodelval(char *s, int val); static int normalval(char *s, int val); extern Appearance *GeomAppearance( Geom * ); extern mgshadefunc softshader(int id); TransformStruct ts_identity; #define DGEOM_MAX 16 #define DVIEW_MAX 8 int dgeom_max = DGEOM_MAX; int dview_max = DVIEW_MAX; DGeom **dgeom = NULL; DView **dview = NULL; static int nwins = 1; static Appearance *base_defaultap = NULL; static Appearance *worldap = NULL; extern Color initial_defaultbackcolor; static GeomStruct nullgs = {NULL, NULL}; /* Substitute for optional arg */ extern HandleOps GeomOps, WindowOps; #define DGobj(obj) ((DGeom *)obj) #define DVobj(obj) ((DView *)obj) #define name_object(obj, ni, name) _name_object((DObject*)(obj),ni,name) static char * _name_object(DObject *obj, int ni, char *name); static void track_changes(); static void winmoved(int camid); static bool nonidentity(Transform T); static DGeom * new_dgeom(char *from, enum citizenship citizenship); static DView * new_dview(); static void updateit(float dt); static void draw_view(DView *dv); static void really_draw_view(DView *dv); static void reconfigure_view(DView *dv); static char * new_object_name(int type); static void object_changed(Handle **hp, DObject *obj, void *seqno); static int object_register(Handle **hp, Ref *ignored, DObject *obj); static void update_dgeom(DGeom *); static void update_view(DView *); static void normalize(DGeom *dg, int normalization); static char * unique_name(char *name, int id); static void delete_geometry(DGeom *dg); static void delete_camera(DView *dv); static void dview_set_hmodel_camspace(DView *dv, int space); #ifdef MANIFOLD static int verbose_manifold = 0; static int trivial_visibility = 0; #endif /* * Pure inquiry functions -- these do not change any state. */ int drawer_geom_count(void) { int i, n; DGeom *dg; n = 1; LOOPSOMEGEOMS(i,dg,ORDINARY) ++n; return n; } int drawer_cam_count(void) { int i, n; DView *dv; n = 0; LOOPVIEWS(i,dv) ++n; return n; } int drawer_idbyctx( mgcontext *ctx ) { int i; DView *dv; LOOPVIEWS(i,dv) { if(dv->mgctx == ctx) return CAMID(i); } return NOID; } DObject * drawer_get_object( int id ) { recheck: if(ISGEOM(id)) { switch(id) { case ALLGEOMS: id = WORLDGEOM; goto recheck; case TARGETID: id = uistate.targetid; goto recheck; case SELF: case TARGETGEOMID: id = GEOMID(uistate.targetgeom); goto recheck; case CENTERID: id = uistate.centerid; goto recheck; default: if(INDEXOF(id) < 0 || INDEXOF(id) >= dgeom_max) return NULL; return (DObject *)dgeom[INDEXOF(id)]; } } else if(ISCAM(id)) { switch(id) { case DEFAULTCAMID: return (DObject *)&drawerstate.defview; case FOCUSID: case ALLCAMS: id = CAMID(uistate.mousefocus); goto recheck; case TARGETCAMID: id = CAMID(uistate.targetcam); goto recheck; default: if(INDEXOF(id) < 0 || INDEXOF(id) >= dview_max) return NULL; return (DObject *)dview[INDEXOF(id)]; } } return NULL; } int drawer_idmatch(int id1, int id2) { switch (id1) { case ALLGEOMS: switch (id2) { case ALLGEOMS: return 1; case ALLCAMS: return 0; case FOCUSID: return 0; case TARGETGEOMID: return 1; case TARGETCAMID: return 0; case TARGETID: return ISGEOM(uistate.targetid); case CENTERID: return ISGEOM(uistate.centerid); case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return ISGEOM(id2) && drawer_get_object(id2); } break; case ALLCAMS: switch (id2) { case ALLGEOMS: return 0; case ALLCAMS: return 1; case FOCUSID: return 1; case TARGETGEOMID: return 0; case TARGETCAMID: return 1; case TARGETID: return ISCAM(uistate.targetid); case CENTERID: return ISCAM(uistate.targetid); case NOID: return 0; case DEFAULTCAMID: return 1; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return ISCAM(id2) && drawer_get_object(id2); } break; case FOCUSID: switch (id2) { case ALLGEOMS: return 0; case ALLCAMS: return 1; case FOCUSID: return 1; case TARGETGEOMID: return 0; case TARGETCAMID: return uistate.mousefocus==CAMID(uistate.targetcam); case TARGETID: return uistate.mousefocus==uistate.targetid; case CENTERID: return uistate.mousefocus==uistate.centerid; case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return uistate.mousefocus==id2; } break; case TARGETGEOMID: switch (id2) { case ALLGEOMS: return 1; case ALLCAMS: return 0; case FOCUSID: return 0; case TARGETGEOMID: return 1; case TARGETCAMID: return 0; case TARGETID: return ISGEOM(uistate.targetid); case CENTERID: return uistate.centerid==uistate.targetid; case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return GEOMID(uistate.targetgeom)==id2; } break; case TARGETCAMID: switch (id2) { case ALLGEOMS: return 0; case ALLCAMS: return 1; case FOCUSID: return uistate.mousefocus==uistate.targetid; case TARGETGEOMID: return 0; case TARGETCAMID: return 1; case TARGETID: return ISCAM(uistate.targetid); case CENTERID: return ISCAM(uistate.centerid); case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return CAMID(uistate.targetcam)==id2; } break; case TARGETID: switch (id2) { case ALLGEOMS: return ISGEOM(uistate.targetid); case ALLCAMS: return ISCAM(uistate.targetid); case FOCUSID: return ISCAM(uistate.targetid); case TARGETGEOMID: return ISGEOM(uistate.targetid); case TARGETCAMID: return ISCAM(uistate.targetid); case TARGETID: return 1; case CENTERID: return uistate.targetid==uistate.centerid; case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return uistate.targetid==id2; } break; case CENTERID: switch (id2) { case ALLGEOMS: return ISGEOM(uistate.centerid); case ALLCAMS: return ISCAM(uistate.centerid); case FOCUSID: return uistate.centerid==uistate.mousefocus; case TARGETGEOMID: return uistate.centerid==GEOMID(uistate.targetgeom); case TARGETCAMID: return uistate.centerid==CAMID(uistate.targetcam); case TARGETID: return uistate.centerid==uistate.targetid; case CENTERID: return 1; case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return uistate.centerid==id2; } break; case NOID: switch (id2) { case ALLGEOMS: return 0; case ALLCAMS: return 0; case FOCUSID: return 0; case TARGETGEOMID: return 0; case TARGETCAMID: return 0; case TARGETID: return 0; case CENTERID: return 0; case NOID: return 1; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return 0; } break; case DEFAULTCAMID: switch (id2) { case ALLGEOMS: return 0; case ALLCAMS: return 1; case FOCUSID: return 0; case TARGETGEOMID: return 0; case TARGETCAMID: return 0; case TARGETID: return 0; case CENTERID: return 0; case NOID: return 0; case DEFAULTCAMID: return 1; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return 0; } break; case SELF: switch (id2) { case ALLGEOMS: return 0; case ALLCAMS: return 0; case FOCUSID: return 0; case TARGETGEOMID: return 0; case TARGETCAMID: return 0; case TARGETID: return 0; case CENTERID: return 0; case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 1; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return 0; } break; case UNIVERSE: switch (id2) { case ALLGEOMS: return 0; case ALLCAMS: return 0; case FOCUSID: return 0; case TARGETGEOMID: return 0; case TARGETCAMID: return 0; case TARGETID: return 0; case CENTERID: return 0; case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 1; case PRIMITIVE: return 0; default: return 0; } break; case PRIMITIVE: switch (id2) { case ALLGEOMS: return 0; case ALLCAMS: return 0; case FOCUSID: return 0; case TARGETGEOMID: return 0; case TARGETCAMID: return 0; case TARGETID: return 0; case CENTERID: return 0; case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 1; default: return 0; } break; default: switch (id2) { case ALLGEOMS: return ISGEOM(id1) && drawer_get_object(id1); case ALLCAMS: return ISCAM(id1) && drawer_get_object(id1); case FOCUSID: return id1==uistate.mousefocus; case TARGETGEOMID: return id1==GEOMID(uistate.targetgeom); case TARGETCAMID: return id1==CAMID(uistate.targetcam); case TARGETID: return id1==uistate.targetid; case CENTERID: return id1==uistate.centerid; case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return id1==id2; } break; } } /* * Map an id to a short name */ char * drawer_id2name( int id ) { switch(id) { case ALLGEOMS: return "g*"; case ALLCAMS: return "c*"; case FOCUSID: return "focus"; case TARGETGEOMID:return "g."; case TARGETCAMID: return "c."; case SELF: return "self"; case UNIVERSE: return "universe"; case DEFAULTCAMID:return "defaultcam"; case TARGETID: return "target"; case CENTERID: return "center"; case BBOXCENTERID: return "bbox-center"; case PRIMITIVE: return "primitive"; case NOID: return "none"; default: if(id > 0) { DObject *obj = drawer_get_object(id); if(obj) return obj->name[1]; } } OOGLError(1, "drawer_id2name unknown id %d", id); return "?"; } /* * Utility routine for MAYBE_LOOP_ALL macro. * Finds object(s) of the given type (any type if T_NONE), * and returns a DObject * each time called. * Returns NULL after all appropriate objects have been returned. * Assumes that the iterator variable *indexp is incr'd by one between calls. * *indexp does double duty: for id's which refer to a single object, it's * used as a flag so that the object is returned exactly once (*indexp==0). * For broadcast id's (ALLGEOMS, ALLCAMS), *indexp is the current table index. * Note that MAYBE_LOOP_ALL does *not* treat WORLDGEOM specially. */ DObject * drawer_next_object( int id, int *indexp, int type ) { int index = *indexp; int limit; DObject **objs; if(id == DEFAULTCAMID && type != T_GEOM) return index > 0 ? NULL : (DObject *)&drawerstate.defview; /* Calling real_id() twice handles TARGETCAMID which might * yield FOCUSID */ if(INDEXOF(id) < 0 && INDEXOF(id) != ALLINDEX) id = real_id(real_id(id)); if(type != T_NONE && type != TYPEOF(id)) return NULL; switch(TYPEOF(id)) { case T_CAM: limit = dview_max; objs = (DObject **)dview; break; case T_GEOM: limit = dgeom_max; objs = (DObject **)dgeom; break; default: return NULL; } if(INDEXOF(id) == ALLINDEX) { while(index < limit && objs[index] == NULL) index++; *indexp = index; } else if(index == 0) index = INDEXOF(id); else return NULL; return (index < 0 || index >= limit) ? NULL : objs[index]; } /* * Utility routine for MAYBE_LOOP macro. * Like drawer_next_object() above, but arranges that id==WORLDGEOM * is mapped to a broadcast to all ordinary (non-World, non-alien) DGeom's. */ DObject * drawer_next_bcast( int id, int *indexp, int type ) { DObject *obj; if(INDEXOF(id) < 0 && INDEXOF(id) != ALLINDEX) id = real_id(real_id(id)); if(id == WORLDGEOM) while((obj = drawer_next_object(ALLGEOMS, indexp, type)) != NULL && DGobj(obj)->citizenship == ALIEN) (*indexp)++; else obj = drawer_next_object(id, indexp, type); return obj; } /* * Get the indicated object's net Appearance, merging everything from the * backstop appearance down. * For use by the UI, to tell what current settings are. */ Appearance * drawer_get_ap( int id ) { DGeom *dg; Appearance *ap, *nap; ap = drawerstate.ap; nap = worldap; if(nap) ap = ApMerge(nap, ap, 0); dg = (!ISGEOM(id) || id == GEOMID(ALLINDEX)) ? NULL : (DGeom *)drawer_get_object(id); if(dg && dg != dgeom[0] && (nap = GeomAppearance(dg->Item)) != NULL) { nap = ApMerge(nap, ap, 0); if(ap != drawerstate.ap) ApDelete(ap); ap = nap; } if(ap == drawerstate.ap) RefIncr((Ref *)ap); return ap; } /* * Checks whether any object is moving (so that the main loop shouldn't block). * Returns 1 if so, 0 otherwise. */ bool drawer_moving(void) { int i; DObject *o; if (motions_exist()) return true; for(i = 0; i < dgeom_max; i++) if((o = (DObject *)dgeom[i]) != NULL && (o->moving || o->changed)) return true; for(i = 0; i < dview_max; i++) if((o = (DObject *)dview[i]) != NULL && (o->moving || o->changed)) return true; return false; } /* * Public functions */ /*----------------------------------------------------------------------- * Function: drawer_idbyname * Description: parse a name and return the corresponding id * Args: *name: name to parse * Returns: id of corresponding dgeom or view * Author: mbp * Date: Fri Nov 29 13:42:43 1991 * Notes: returns NOID if there is no object with the given name */ int drawer_idbyname(char *name) { int id; switch (id=(int)(long)fsa_parse(name_fsa, name)) { case TARGETID: id = uistate.targetid; break; case TARGETGEOMID: id = GEOMID(uistate.targetgeom); break; case TARGETCAMID: id = CAMID(uistate.targetcam); break; default: /* including FOCUSID -- keep literal */ break; } return id; } int drawer_name2metaid(char *name) { return (int)(long)fsa_parse(name_fsa, name); } LDEFINE(name_object, LVOID, "(name-object ID NAME)\n" "Assign a new NAME (a string) to ID. A number is appended if " "that name is in use (for example, \"foo\" -> \"foo<2>\"). The new " "name, possibly with number appended, may be used as object's " "id thereafter.") { int id; char *name; LDECLARE(("name-object", LBEGIN, LID, &id, LSTRING, &name, LEND)); drawer_name_object( id, 1, name ); return Lt; } void drawer_name_object(int id, int ni, char *name) { DObject *obj = drawer_get_object(id); if (obj) name_object( obj, ni, name ); ui_objectchange(); } LDEFINE(update_draw, LVOID, "(update-draw CAM-ID [timestep_in_seconds])\n" "Apply each incremental motion once and then draw CAM-ID. " "Applies \"timestep\" seconds' worth of motion, or uses elapsed real " "time if \"timestep\" is absent or zero.") { int id; float dt = 0; LDECLARE(("update-draw", LBEGIN, LID, &id, LOPTIONAL, LFLOAT, &dt, LEND)); gv_update(dt); gv_draw(id); return Lt; } LDEFINE(draw, LVOID, "(draw CAM-ID)\n" "Draw the view in CAM-ID, if it needs redrawing. See also \"redraw\".") { DView *dv; int index; int id; LDECLARE(("draw", LBEGIN, LID, &id, LEND)); MAYBE_LOOP_ALL(id, index, T_CAM, DView, dv) { draw_view(dv); } return Lt; } LDEFINE(update, LVOID, "(update [timestep_in_seconds])\n" "Apply each incremental motion once. Uses timestep if it's present and " "nonzero; otherwise motions are proportional to elapsed real time.") { float realdt, dt = 0; LDECLARE(("update", LBEGIN, LOPTIONAL, LFLOAT, &dt, LEND)); realdt = elapsed(&drawerstate.lastupdate, &drawerstate.lastupdate); if(realdt > uistate.longwhile) realdt = uistate.longwhile; if(dt != 0 || realdt != 0) updateit(dt == 0 ? realdt : dt); track_changes(); return Lt; } void drawer_updateproc(int id, PFI func) { DObject *obj; int index; MAYBE_LOOP_ALL(id, index, T_NONE, DObject, obj) { obj->updateproc = func; obj->moving = ((obj->updateproc!=NULL) || nonidentity(obj->Incr)); } } LDEFINE(redraw, LVOID, "(redraw CAM-ID)\n" "States that the view in CAM-ID should be redrawn on the " "next pass through the main loop or the next invocation of \"draw\".") { DView *dv; int index; int id; LDECLARE(("redraw", LBEGIN, LID, &id, LEND)); MAYBE_LOOP_ALL(id, index, T_CAM, DView, dv) { dv->newcam = true; dv->frozen &= ~SOFT_FROZEN; } track_changes(); return Lt; } LDEFINE(freeze, LVOID, "(freeze CAM-ID [hard-freeze])\n" "Freeze CAM-ID; drawing in this camera's window is turned off " "until it is explicitly redrawn with \"(redraw CAM-ID)\", after " "which time drawing resumes as normal. hard-freeze (default false) " "is intended to be \"true\" only when windows are iconified, " "making them immune even to \"redraw\" until another " "\"(freeze CAM-ID false)\".") { DView *dv; int index; int id; Keyword hard = NO_KEYWORD; int freeze; LDECLARE(("freeze", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &hard, LEND)); freeze = boolval("freeze", hard) ? HARD_FROZEN : SOFT_FROZEN; MAYBE_LOOP_ALL(id, index, T_CAM, DView, dv) { dv->frozen = freeze; } return Lt; } void drawer_pause(int pause) { drawerstate.pause = pause; ui_action(ACTION_PAUSE); } void drawer_stop(int id) { if (id == NOID) { gv_xform_incr(ALLCAMS, &ts_identity); gv_xform_incr(ALLGEOMS, &ts_identity); gv_xform_incr(WORLDGEOM,&ts_identity); } else { gv_xform_incr(id, &ts_identity); } } static void center_geom(int id, int center) { int index; DGeom *dg; MAYBE_LOOP_ALL(id, index, T_GEOM, DGeom, dg) { gv_transform_set(dg->id, center, center, TRANSLATE_KEYWORD, 0, 0, 0); drawer_stop(dg->id); } } void drawer_center(int id) { if (TYPEOF(id) == T_NONE) { drawer_stop(NOID); center_geom(ALLGEOMS, WORLDGEOM); center_geom(WORLDGEOM, UNIVERSE); gv_camera_reset(ALLCAMS); gv_ui_center_origin(ORIGIN_KEYWORD); } else if (TYPEOF(id) == T_CAM) { gv_camera_reset(id); } else if (TYPEOF(id) == T_GEOM) { center_geom(id, id==WORLDGEOM ? UNIVERSE : WORLDGEOM); } } LDEFINE(xform_set, LVOID, "(xform-set ID TRANSFORM)\n" "Overwrite the current object transform with TRANSFORM (set " "object ID's transform to TRANSFORM).") { DObject *obj; int index; TransformStruct *ts; int id; LDECLARE(("xform-set", LBEGIN, LID, &id, LTRANSFORM, &ts, LEND)); MAYBE_LOOP_ALL(id, index, T_NONE, DObject, obj) { if (id == ALLGEOMS && DGobj(obj)->citizenship == ALIEN) continue; if (ts->tm == NULL) { /* * Special case for switching externally-controlled motion on & off */ if(ISGEOM(id)) GeomSet(obj->Item, CR_AXISHANDLE, ts->h, CR_END); else CamSet(DVobj(obj)->cam, CAM_C2WHANDLE, ts->h, CAM_END); } else { if (ISGEOM(id)) GeomSet(DGobj(obj)->Item, CR_AXIS, ts->tm, CR_AXISHANDLE, ts->h, CR_END); else CamSet(DVobj(obj)->cam, CAM_C2W, ts->tm, CAM_C2WHANDLE, ts->h, CAM_END); } TmIdentity(obj->Incr); obj->redraw = true; if (ts->h) { obj->changed |= CH_TRANSFORM; } obj->moving = (obj->updateproc != NULL); } return Lt; } LDEFINE(xform, LVOID, "(xform ID TRANSFORM)\n" "Apply TRANSFORM to object ID, as opposed to simply setting its " "transform, so the effective position " "of the object will be the concatenation of TRANSFORM with the " "current object transform.") { int id; TransformStruct *ts; DObject *obj; int index; LDECLARE(("xform", LBEGIN, LID, &id, LTRANSFORM, &ts, LEND)); MAYBE_LOOP_ALL(id, index, T_NONE, DObject, obj) { if (id == ALLGEOMS && DGobj(obj)->citizenship==ALIEN) { continue; } if (TYPEOF(id) == T_GEOM) { GeomTransform(DGobj(obj)->Item, ts->tm, NULL); } else { CamTransform(DVobj(obj)->cam, ts->tm); } TmIdentity(obj->Incr); obj->redraw = true; obj->moving = (obj->updateproc!=NULL); } return Lt; } LDEFINE(xform_incr, LVOID, "(xform-incr ID TRANSFORM)\n" "Apply continual motion: concatenate TRANSFORM with the current " "transform of the object every refresh (set object ID's " "incremental transform to TRANSFORM).") { DObject *obj; int index; TransformStruct *ts; int id; LDECLARE(("xform-incr", LBEGIN, LID, &id, LTRANSFORM, &ts, LEND)); MAYBE_LOOP_ALL(id, index, T_NONE, DObject, obj) { stop_motions(obj->id); if (id == ALLGEOMS && DGobj(obj)->citizenship == ALIEN) { continue; } if(obj->incrhandle != NULL) { HandlePDelete(&obj->incrhandle); } if((obj->incrhandle = ts->h) != NULL) { HandleRegister(&obj->incrhandle, NULL, obj->Incr, TransUpdate); object_register(&obj->incrhandle, NULL, obj); } else { TmCopy(ts->tm, obj->Incr); } obj->moving = ( nonidentity(obj->Incr) || (obj->updateproc!=NULL) ); } return Lt; } LDEFINE(new_camera, LID, "(new-camera name [CAMERA])\n" "Create a new camera with the given name (a string). If a " "camera with that name already exists, the new object is given " "a unique name. If CAMERA is omitted a default camera is used.") { DView *dv; int id; CameraStruct *cs=NULL; char *name; LDECLARE(("new-camera", LBEGIN, LSTRING, &name, LOPTIONAL, LCAMERA, &cs, LEND)); dv = new_dview(); if (!name) name = "Camera"; name_object(dv, 1, name ); mgctxset(MG_WnSet, WN_NAME, dv->name[1], WN_END, MG_END); ui_windowWillOpen(dv); mgctxset(MG_SHOW, 1, MG_END); ui_windowDidOpen(dv); ui_objectchange(); id=gv_camera(dv->name[0], cs); camera_space_relabel(id); return LNew( LID, &id ); } LDEFINE(camera, LINT, "(camera CAM-ID [CAMERA])\n" "Specify data for CAM-ID; CAMERA is a string giving an OOGL " "camera specification. If no camera CAM-ID exists, " "it is created; in this case, the second argument is optional, " "and if omitted, a default camera is used. See also: new-camera.") { DView *dv; int index; CameraStruct *cs=NULL; char *name; int id; LDECLARE(("camera", LBEGIN, LSTRING, &name, LOPTIONAL, LCAMERA, &cs, LEND)); if((id = drawer_idbyname(name)) == NOID) { id=gv_new_camera( name, cs ); } else { MAYBE_LOOP(id, index, T_CAM, DView, dv) { /* if cam is NULL stick with whatever camera id already has */ if (cs->cam) { RefIncr((Ref*)cs->cam); RefIncr((Ref*)cs->h); CamDelete(dv->cam); HandlePDelete(&dv->camhandle); dv->cam = cs->cam; dv->camhandle = cs->h; if(dv->camhandle) { HandleRegister(&dv->camhandle, (Ref *)dv, &dv->cam, HandleUpdRef); object_register(&dv->camhandle, NULL, (DObject *)dv); } } if(dv->cam == NULL) { dv->cam = CamCopy(drawerstate.defview.cam, NULL); } TmIdentity(dv->Incr); dv->moving = (dv->updateproc!=NULL); dv->newcam = true; } /* gv_camera_reset(id); */ } return LNew( LINT, &id ); } LDEFINE(camera_reset, LVOID, "(camera-reset CAM-ID)\n" "Reset CAM-ID to its default value.") { DView *dv; int index; int id; LDECLARE(("camera-reset", LBEGIN, LID, &id, LEND)); MAYBE_LOOP(id, index, T_CAM, DView, dv) { CamReset(dv->cam); drawer_stop(dv->id); if ((spaceof(WORLDGEOM) == TM_SPHERICAL) && (dv->hmodel == CONFORMALBALL)) { CamTranslate( dv->cam, 0.0, 0.0, 10.0 ); } if (drawerstate.NDim > 0) { /* Note: the following resets the *entire* N-D xform to the * identity, not just that in the subspace we're looking * through. Might want to have finer control. XXX - 7/28/93, * slevy & holt */ drawer_set_ND_xform(dv->id, NULL); } TmIdentity(dv->Incr); dv->moving = (dv->updateproc!=NULL); dv->redraw = true; } ui_maybe_refresh(id); return Lt; } static int drawer_new_dgeom(char *name, GeomStruct *gs, enum citizenship citizenship) { int id; DGeom *dg; dg = new_dgeom( NULL, citizenship ); if (name) name_object(dg, 1, name); ui_objectchange(); id = drawer_dgeom(dg->id, gs); if (citizenship==ALIEN) { drawer_int( id, DRAWER_NORMALIZATION, NONE ); drawer_int( id, DRAWER_BBOXDRAW, 0 ); } GeomDice(dg->Item, dg->bezdice, dg->bezdice); return id; } LDEFINE(new_alien, LID, "(new-alien name [GEOMETRY])\n" "Create a new alien (geom not in the world) with the given name " "(a string). GEOMETRY is a string giving an OOGL geometry " "specification. If GEOMETRY is omitted, the new alien " "is given an empty geometry. If an object with that name " "already exists, the new alien is given a unique name. The " "light beams that are used to move around the lights are an " "example of aliens. They're drawn but are not controllable the " "way ordinary objects are: they don't appear in the object " "browser and the user can't move them with the normal motion " "modes.") { GeomStruct *gs = &nullgs; char *name; int id; LDECLARE(("new-alien", LBEGIN, LSTRING, &name, LOPTIONAL, LGEOM, &gs, LEND)); if (gs->geom) RefIncr((Ref*)(gs->geom)); if (gs->h) RefIncr((Ref*)(gs->h)); id=drawer_new_dgeom(name, gs, ALIEN); return LNew( LID, &id ); } LDEFINE(new_geometry, LID, "(new-geometry name [GEOMETRY])\n\ Create a new geom with the given name (a string). GEOMETRY is\n\ a string giving an OOGL geometry specification. If\n\ GEOMETRY is omitted, the new object is given an empty geometry.\n\ If an object with that name already exists, the new object is\n\ given a unique name.") { int id; GeomStruct *gs = &nullgs; char *name; LDECLARE(("new-geometry", LBEGIN, LSTRING, &name, LOPTIONAL, LGEOM, &gs, LEND)); if (gs->geom) RefIncr((Ref*)(gs->geom)); if (gs->h) RefIncr((Ref*)(gs->h)); id = drawer_new_dgeom(name, gs, ORDINARY); return LNew( LID, &id ); } static int drawer_dgeom(int id, GeomStruct *gs) { DGeom *dg; int index; if (id == WORLDGEOM) { OOGLError(1,"drawer_dgeom: Mere mortals cannot change the World Geom!"); } else { MAYBE_LOOP(id, index, T_GEOM, DGeom, dg) { GeomSet(dg->Lgeom, CR_HANDLE_GEOM, gs->h, gs->geom, CR_END); dg->changed = CH_GEOMETRY; /* (re-)generate the BSP-tree for this object * * We could also hang the BSP-tree to dg->Item, but that would * require special handling of BSP-trees in InstTransform[To](). */ GeomBSPTree(dg->Lgeom, NULL, BSPTREE_CREATE); } } /* Caller expects us to consume the objects */ GeomDelete(gs->geom); HandleDelete(gs->h); return id; } LDEFINE(geometry, LVOID, "(geometry GEOM-ID [GEOMETRY])\n\ Specify the geometry for GEOM-ID. GEOMETRY is a string\n\ giving an OOGL geometry specification. If no object\n\ called GEOM-ID exists, it is created; in this case the\n\ GEOMETRY argument is optional, and if omitted, the new\n\ object GEOM-ID is given an empty geometry.") { char *name; GeomStruct *gs = &nullgs; int id; LDECLARE(("geometry", LBEGIN, LSTRING, &name, LOPTIONAL, LGEOM, &gs, LEND)); /* we RefIncr() because gv_geometry() (& gv_new_geometry()) expect to own the geom and handle passed in, but the lisp interpreter actually owns these cH: this is wrong, only drawer[_new]_dgeom() expects to own the object. As gv_new_geometry() increases the ref-count itself we must not do it here. */ if((id = drawer_idbyname(name)) == NOID) { gv_new_geometry( name, gs ); } else { if (gs->geom) RefIncr((Ref*)(gs->geom)); if (gs->h) RefIncr((Ref*)(gs->h)); drawer_dgeom(id, gs); } return Lt; } static int drawer_replace_geometry(int id, int *p, int pn, GeomStruct *gs) { DObject *obj; int count; int ind; Geom *where; MAYBE_LOOP(id, ind, T_GEOM, DObject, obj) { for (GeomGet(DGobj(obj)->Lgeom, CR_GEOM, &where); where && pn>0; pn--, p++) { for (count = 0; count < *p; count++) { GeomGet(where, CR_CDR, &where); } if (pn > 1) { GeomGet(where, CR_GEOM, &where); } } if (where) { GeomCCreate(where, ListMethods(), CR_HANDLE_GEOM, gs->h, gs->geom, CR_END); obj->changed = CH_GEOMETRY; } } return id; } LDEFINE(replace_geometry, LVOID, "(replace-geometry GEOM-ID PART-SPECIFICATION GEOMETRY)\n\ Replace a part of the geometry for GEOM-ID.") { char *name; int p[40]; int pn = 40; GeomStruct *gs=NULL; int id; LDECLARE(("replace-geometry", LBEGIN, LSTRING, &name, LHOLD, LARRAY, LINT, p, &pn, LGEOM, &gs, LEND)); if ((id = drawer_idbyname(name)) != NOID) drawer_replace_geometry(id, p, pn, gs); return Lt; } LDEFINE(copy, LVOID, "(copy [ID] [name])\n\ Copies an object or camera. If ID is not specified, it \n\ is assumed to be targetgeom. If name is not specified, it \n\ is assumed to be the same as the name of ID.") { DObject *obj; int id = TARGETGEOMID, newid=0; int i; char *name = NULL; GeomStruct geomstruct; CameraStruct camstruct; TransformStruct transformstruct; ApStruct apstruct; /* If the user copies the world, this will crash unless we remember not * to copy things that are copies of something else. That is what this * array is for. */ VARARRAY(iscopy, char, 2*dgeom_max); LDECLARE(("copy", LBEGIN, LOPTIONAL, LID, &id, LSTRING, &name, LEND)); id = real_id(id); geomstruct.h = camstruct.h = transformstruct.h = apstruct.h = NULL; memset(iscopy, 0, 2*dgeom_max * sizeof(char)); MAYBE_LOOP(id, i, T_NONE, DObject, obj) { switch(TYPEOF(obj->id)) { case T_GEOM: /* Copying the world = copying each thing in the world */ if (((DGeom *)obj)->citizenship == THEWORLD || iscopy[i]) break; GeomGet(((DGeom *)obj)->Lgeom, CR_GEOM, &geomstruct.geom); if (((DGeom *)obj)->citizenship == ALIEN) newid = gv_new_alien(name == NULL ? obj->name[1] : name, &geomstruct); else newid = gv_new_geometry(name == NULL ? obj->name[1] : name, &geomstruct); apstruct.ap = GeomAppearance(obj->Item); gv_merge_ap(newid, &apstruct); GeomGet(((DGeom *)obj)->Item, CR_AXIS, transformstruct.tm); iscopy[INDEXOF(newid)] = 1; break; case T_CAM: camstruct.cam = ((DView *)obj)->cam; newid = gv_new_camera(name == NULL ? obj->name[1] : name, &camstruct); drawer_get_transform(obj->id, transformstruct.tm, WORLDGEOM); break; } gv_xform_set(newid, &transformstruct); } return Lt; } LDEFINE(delete, LVOID, "(delete ID)\n\ Delete object or camera ID.") { DObject *obj; int index; int id; unsigned int wasfrozen = UNFROZEN; LDECLARE(("delete", LBEGIN, LID, &id, LEND)); /* Real-ize the given id. In case id == TARGETGEOMID, remember we * may change the target geom during deletion. Don't let this change * what's being deleted! */ id = real_id(id); wasfrozen = uistate.freeze; gv_ui_freeze(1); MAYBE_LOOP(id, index, T_NONE, DObject, obj) { int obj_id = obj->id; /* remember, must not access obj->id after * obj has gone. */ if(obj_id == WORLDGEOM || obj_id == DEFAULTCAMID) continue; if (obj->name[0]) fsa_install( name_fsa, obj->name[0], NOID ); if (obj->name[1]) fsa_install( name_fsa, obj->name[1], NOID ); HandleUnregisterAll((Ref *)obj, (void *)(long)(int)obj->seqno, object_changed); stop_motions(obj_id); switch(TYPEOF(obj_id)) { case T_GEOM: delete_geometry((DGeom *)obj); break; case T_CAM: delete_camera((DView *)obj); break; } if (uistate.centerid==obj_id) gv_ui_center(TARGETID); } gv_ui_freeze(wasfrozen); return Lt; } LDEFINE(scene, LVOID, "(scene CAM-ID [GEOMETRY])\n\ Make CAM-ID look at GEOMETRY instead of at the universe.") { DView *dv; NDcam *cluster; int index; GeomStruct *gs = &nullgs; int id; LDECLARE(("scene", LBEGIN, LID, &id, LOPTIONAL, LGEOM, &gs, LEND)); if (drawerstate.NDim > 0 && ISCAM(id) && id != ALLCAMS && (cluster = ((DView *)drawer_get_object(id))->cluster)) { MAYBE_LOOP(ALLCAMS, index, T_CAM, DView, dv) { if (dv->cluster == cluster) { RefIncr((Ref *)gs->geom); GeomDelete(dv->Item); dv->Item = gs->geom; dv->changed = CH_GEOMETRY; } } return Lt; } MAYBE_LOOP(id, index, T_CAM, DView, dv) { RefIncr((Ref *)gs->geom); GeomDelete(dv->Item); dv->Item = gs->geom; dv->changed = CH_GEOMETRY; } return Lt; } LDEFINE(winenter, LVOID, "(winenter CAM-ID)\n\ Tell geomview that the mouse cursor is in the window\n\ of CAM-ID. This function is for development purposes\n\ and is not intended for general use.") { int id; LDECLARE(("winenter", LBEGIN, LID, &id, LEND)); winmoved(id); ui_mousefocus(INDEXOF(id)); return Lt; } LDEFINE(merge_ap, LVOID, "(merge-ap GEOM-ID APPEARANCE)\n\ Merge in some appearance characteristics to GEOM-ID.\n\ Appearance parameters include surface and line color, shading\n\ style, line width, and lighting.") { DObject *obj; int index; ApStruct *as; int id; LDECLARE(("merge-ap", LBEGIN, LID, &id, LAP, &as, LEND)); if (id == WORLDGEOM) worldap = ApMerge(as->ap, worldap, APF_INPLACE|APF_OVEROVERRIDE); MAYBE_LOOP(id, index, T_NONE, DObject, obj) { Appearance *thisap = GeomAppearance(obj->Item); GeomSet(obj->Item, CR_NOCOPY, CR_APPEAR, ApMerge(as->ap, thisap, APF_INPLACE|APF_OVEROVERRIDE), CR_END); obj->redraw = true; } ui_maybe_refresh(id); return Lt; } void drawer_set_ap(int id, Handle *h, Appearance *ap) { DObject *obj; int index; if(id == WORLDGEOM || id == ALLGEOMS) { ApDelete(worldap); worldap = ap; } MAYBE_LOOP(id, index, T_NONE, DObject, obj) { GeomSet(obj->Item, CR_NOCOPY, /* CR_APHANDLE, h */ CR_APPEAR, ap ? ApCopy(ap,NULL) : NULL, CR_END ); obj->redraw = true; } ui_maybe_refresh(id); } LDEFINE(dice, LVOID, "(dice GEOM-ID N)\n\ Dice any Bezier patches within GEOM-ID into NxN meshes; default 10.") { int id, dice; LDECLARE(("dice", LBEGIN, LID, &id, LINT, &dice, LEND)); drawer_int( id, DRAWER_BEZDICE, dice ); return Lt; } LDEFINE(bbox_draw, LVOID, "(bbox-draw GEOM-ID [yes|no])\n\ Say whether GEOM-ID's bounding-box should be drawn; \"yes\" if omitted.") { int id; Keyword yes = YES_KEYWORD; LDECLARE(("bbox-draw", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &yes, LEND)); drawer_int( id, DRAWER_BBOXDRAW, boolval("bbox-draw", yes) ); return Lt; } LDEFINE(camera_draw, LVOID, "(camera-draw CAM-ID [yes|no])\n\ Say whether or not cameras should be drawn in CAM-ID; \"yes\" if omitted.") { int id; Keyword yes = YES_KEYWORD; LDECLARE(("camera-draw", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &yes, LEND)); drawer_int( id, DRAWER_CAMERADRAW, boolval("camera-draw", yes) ); return Lt; } LDEFINE(evert, LVOID, "(evert GEOM-ID [yes|no])\n\ Set the normal eversion state of GEOM-ID. If the second argument\n\ is omitted, toggle the eversion state.") { int id, val = -1; LDECLARE(("evert", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &val, LEND)); drawer_int( id, DRAWER_EVERT, val ); return Lt; } LDEFINE(soft_shader, LVOID, "(soft-shader CAM-ID {on|off|toggle})\n\ Select whether to use software or hardware shading in that camera.") { DView *dv; int id, i, on = -1; LDECLARE(("soft-shader", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &on, LEND)); MAYBE_LOOP(id, i, T_CAM, DView, dv) { if(on == TOGGLE_KEYWORD) on = dv->shader ? OFF_KEYWORD : ON_KEYWORD; dv->shader = (on == ON_KEYWORD) ? softshader(dv->id) : NULL; if(dv->mgctx) { mgctxselect(dv->mgctx); mgctxset(MG_SHADER, dv->shader, MG_END); gv_redraw(dv->id); } ui_maybe_refresh(dv->id); } return Lt; } LDEFINE(stereowin, LLIST, "(stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize])\n\ Configure CAM-ID as a stereo window.\n\ no: entire window is a single pane, stereo disabled\n\ horizontal: split left/right: left is stereo eye#0, right is #1.\n\ vertical: split top/bottom: bottom is eye#0, top is #1.\n\ colored: panes overlap, red is stereo eye#0, cyan is #1.\n\ A gap of \"gapsize\" pixels is left between subwindows;\n\ if omitted, subwindows are adjacent.\n\ If both layout and gapsize are omitted, e.g. (stereowin CAM-ID),\n\ returns current settings as a ``(stereowin ...)'' command list.\n\ This command doesn't set stereo projection; use ``merge camera'' or\n\ ``camera'' to set the stereyes transforms, and ``merge window'' or\n\ ``window'' to set the pixel aspect ratio & window position if needed.") { int id; Keyword kw = NOT_A_KEYWORD; DView *dv; int gapsize = 0; LDECLARE(("stereowin", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &kw, LINT, &gapsize, LEND)); if(!ISCAM(id) || (dv = (DView *)drawer_get_object(id)) == NULL) { OOGLError(0, "stereowin: expected camera, got %s", drawer_id2name(id)); return Lnil; } if(kw == NOT_A_KEYWORD) { return LLISTTOOBJ ( LListAppend ( LListAppend ( LListAppend ( LListAppend(NULL, LSYMBOLTOOBJ("stereowin")), LTOOBJ(LID)(&id)), LTOOBJ(LKEYWORD)(&dv->stereo)), LTOOBJ(LINT)(&dv->stereogap))); } if(kw != NO_KEYWORD && kw != HORIZONTAL_KEYWORD && kw != VERTICAL_KEYWORD && kw != COLORED_KEYWORD) { OOGLError(0, "stereowin: expected " "\"no\" or " "\"horizontal\" or " "\"vertical\" or " "\"colored\", not \"%s\"", keywordname(kw)); return Lnil; } dv->stereo = kw; dv->stereogap = gapsize; gv_redraw(id); /* Schedule redraw/window reconfiguration */ return Lt; } LDEFINE(space, LVOID, "(space {euclidean|hyperbolic|spherical})\n\ Set the space associated with the world.") { int space_keyword, space, id, index; DView *dv; LDECLARE(("space", LBEGIN, LKEYWORD, &space_keyword, LEND)); space = spaceval("space", space_keyword); drawerstate.space = space; switch (space) { default: case TM_EUCLIDEAN: break; case TM_HYPERBOLIC: case TM_SPHERICAL: drawer_int( ALLGEOMS, DRAWER_BBOXDRAW, 0 ); drawer_int( ALLGEOMS, DRAWER_NORMALIZATION, NONE ); break; } id = ALLCAMS; MAYBE_LOOP(id, index, T_CAM, DView, dv) { int mgspace = space; #if 0 if (space == TM_HYPERBOLIC || space == TM_SPHERICAL) { switch (dv->hmodel) { default: case VIRTUAL: mgspace |= TM_VIRTUAL; break; case PROJECTIVE: mgspace |= TM_PROJECTIVE; break; case CONFORMALBALL: mgspace |= TM_CONFORMAL_BALL; break; } } #endif mgspace |= TM_VIRTUAL; mgctxselect(dv->mgctx); mgctxset(MG_SPACE, mgspace, MG_END); gv_hmodel(dv->id, VIRTUAL_KEYWORD); if(dv->shader) mgctxset(MG_SHADER, dv->shader = softshader(dv->id), MG_END); } gv_xform_set(ALLGEOMS, &ts_identity); gv_xform_set(WORLDGEOM, &ts_identity); drawer_stop(NOID); #if 0 /* why are these here ???? mbp Wed Jun 9 14:21:34 1993 */ filepanel = ui_name2panel("Files"); if(ui_panelshown(filepanel)) ui_showpanel(filepanel, 1); /* Reselect */ #endif return Lt; } LDEFINE(hmodel, LVOID, "(hmodel CAMID {virtual|projective|conformal})\n\ Set the model used to display geometry in\n\ this camera; see also \"space\".") { int id, index, model_keyword; DView *dv; LDECLARE(("hmodel", LBEGIN, LID, &id, LKEYWORD, &model_keyword, LEND)); MAYBE_LOOP(id, index, T_CAM, DView, dv) { int mgspace; mgctxselect(dv->mgctx); mgctxget(MG_SPACE, &mgspace); mgspace = TM_SPACE(mgspace); dv->hmodel = hmodelval("hmodel", model_keyword); dview_set_hmodel_camspace(dv,mgspace); /* if (mgspace == TM_HYPERBOLIC) */ switch (dv->hmodel) { default: case VIRTUAL: gv_hsphere_draw(id, 0); break; case PROJECTIVE: case CONFORMALBALL: gv_hsphere_draw(id, 1); break; } switch (dv->hmodel) { default: case VIRTUAL: mgspace |= TM_VIRTUAL; break; case PROJECTIVE: mgspace |= TM_PROJECTIVE; break; case CONFORMALBALL: mgspace |= TM_CONFORMAL_BALL; break; break; } mgctxset(MG_SPACE, mgspace, MG_END); gv_camera_reset(id); camera_space_relabel(id); } return Lt; } LDEFINE(inhibit_warning, LVOID, "(inhibit-warning STRING)\n\ Inhibit warning inhbits geomview from displaying a\n\ particular warning message determined by STRING.\n\ At present there are no warning messages that this\n\ applies to, so this command is rather useless.") { char *s=NULL; LDECLARE(("inhibit-warning", LBEGIN, LSTRING, &s, LEND)); return Lt; } static void dview_set_hmodel_camspace(DView *dv, int space) { int camspace; switch (dv->hmodel) { default: case VIRTUAL: camspace = space; break; case PROJECTIVE: case CONFORMALBALL: camspace = TM_EUCLIDEAN; break; } CamSet(dv->cam, CAM_SPACE, camspace, CAM_END); } LDEFINE(hsphere_draw, LVOID, "(hsphere-draw CAMID [yes|no])\n\ Say whether to draw a unit sphere: the sphere at infinity in\n\ hyperbolic space, and a reference sphere in Euclidean and spherical\n\ spaces. If the second argument is omitted, \"yes\" is assumed.") { int id; Keyword yes = YES_KEYWORD; LDECLARE(("hsphere-draw", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &yes, LEND)); drawer_int( id, DRAWER_HSPHERE, boolval("hsphere-draw", yes) ); return Lt; } LDEFINE(pickable, LVOID, "(pickable GEOM-ID {yes|no})\n\ Say whether or not GEOM-ID is included in the pool of objects\n\ that could be returned from the pick command.") { int id; Keyword yes = YES_KEYWORD; LDECLARE(("pickable", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &yes, LEND)); drawer_int( id, DRAWER_PICKABLE, boolval("pickable", yes) ); return Lt; } LDEFINE(normalization, LVOID, "(normalization GEOM-ID {each|none|all|keep})\n\ Set the normalization status of GEOM-ID.\n\ \"none\" suppresses all normalization.\n\ \"each\" normalizes the object's bounding box to fit into the unit\n\ sphere, with the center of its bounding box translated\n\ to the origin. The box is scaled such that its long diagonal,\n\ sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), is 2.\n\ \"all\" resembles \"each\", except when an object is changing\n\ (e.g. when its geometry is being changed by an external program).\n\ \n\ Then, \"each\" tightly fits the bounding box around the\n\ object whenever it changes and normalizes accordingly,\n\ while \"all\" normalizes the union of all variants of the object\n\ and normalizes accordingly.\n\ \n\ \"keep\" leaves the current normalization transform unchanged\n\ when the object changes. It may be useful to apply \"each\" or\n\ \"all\" normalization apply to the first version of a changing\n\ object to bring it in view, then switch to \"keep\"") { int id, val; LDECLARE(("normalization", LBEGIN, LID, &id, LKEYWORD, &val, LEND)); val = normalval("normalization", val); drawer_int( id, DRAWER_NORMALIZATION, val ); return Lt; } void drawer_int(int id, DrawerKeyword key, int ival) { DObject *obj; int index; int flag, override; ApStruct as; as.h = NULL; switch (key) { case DRAWER_FACEDRAW: flag = override = APF_FACEDRAW; goto setflag; case DRAWER_EDGEDRAW: flag = override = APF_EDGEDRAW; goto setflag; case DRAWER_VECTDRAW: flag = override = APF_VECTDRAW; goto setflag; case DRAWER_NORMALDRAW: flag = override = APF_NORMALDRAW; goto setflag; case DRAWER_TEXTUREDRAW: flag = override = APF_TEXTURE; goto setflag; case DRAWER_TEXTUREQUAL: flag = override = APF_TXMIPMAP|APF_TXMIPINTERP|APF_TXLINEAR; goto setflag; case DRAWER_BACKCULL: flag = override = APF_BACKCULL; goto setflag; case DRAWER_EVERT: flag = override = APF_EVERT; goto setflag; case DRAWER_SHADELINES: flag = override = APF_SHADELINES; goto setflag; case DRAWER_CONCAVE: flag = override = APF_CONCAVE; goto setflag; setflag: as.ap = ApCreate(ival ? AP_DO : AP_DONT, flag, AP_OVERRIDE, override & uistate.apoverride, AP_END); goto mergeap; case DRAWER_TRANSLUCENCY: flag = override = APF_TRANSP; as.ap = ApCreate(ival < 0 ? AP_DONT : AP_DO, flag, AP_TRANSLUCENCY, abs(ival) - 1, AP_OVERRIDE, APF_TRANSP & uistate.apoverride, AP_END); goto mergeap; case DRAWER_SHADING: as.ap = ApCreate(AP_SHADING, ival, AP_OVERRIDE, APF_SHADING & uistate.apoverride, AP_END); goto mergeap; case DRAWER_LINEWIDTH: as.ap = ApCreate(AP_LINEWIDTH, ival, AP_OVERRIDE, APF_LINEWIDTH & uistate.apoverride, AP_END); goto mergeap; case DRAWER_BEZDICE: as.ap = ApCreate(AP_DICE, ival, ival, AP_OVERRIDE, APF_DICE & uistate.apoverride, AP_END); gv_merge_ap(id, &as); ApDelete(as.ap); #if 0 MAYBE_LOOP(id, index, T_NONE, DObject, obj) { DGobj(obj)->bezdice = ival; GeomDice(DGobj(obj)->Item, ival, ival); obj->changed = CH_GEOMETRY; } #endif break; mergeap: gv_merge_ap(id, &as); ApDelete(as.ap); return; /* No need to ui_maybe_refresh(), merge_ap does it. */ case DRAWER_PROJECTION: MAYBE_LOOP(id, index, T_CAM, DObject, obj) { CamSet(DVobj(obj)->cam, CAM_PERSPECTIVE, ival, CAM_END); obj->changed = CH_GEOMETRY; } break; case DRAWER_BBOXDRAW: MAYBE_LOOP(id, index, T_GEOM, DObject, obj) { DGobj(obj)->bboxdraw = ival; obj->redraw = true; } break; case DRAWER_NORMALIZATION: MAYBE_LOOP(id, index, T_GEOM, DObject, obj) { normalize(DGobj(obj), ival); } break; case DRAWER_PICKABLE: MAYBE_LOOP(id, index, T_GEOM, DObject, obj) { DGobj(obj)->pickable = ival != 0; } break; case DRAWER_HSPHERE: MAYBE_LOOP(id, index, T_CAM, DObject, obj) { set_hsphere_draw( id, ival ); obj->redraw = true; } break; case DRAWER_CAMERADRAW: MAYBE_LOOP(id, index, T_CAM, DObject, obj) { DVobj(obj)->cameradraw = ival != 0; obj->redraw = true; } break; case DRAWER_DOUBLEBUFFER: MAYBE_LOOP(id, index, T_CAM, DObject, obj) { int opts; if(DVobj(obj)->mgctx == NULL) continue; mgctxselect(DVobj(obj)->mgctx); mgctxget(MG_SETOPTIONS, &opts); mgctxset(ival==0 || (ival<0 && opts&MGO_DOUBLEBUFFER) ? MG_UNSETOPTIONS : MG_SETOPTIONS, MGO_DOUBLEBUFFER, MG_END); obj->redraw = true; } break; case DRAWER_APOVERRIDE: /* Select whether appearance controls use the 'override' feature * to supplant user settings. Might be nice if this were settable * per feature rather than across the board. */ uistate.apoverride = ival ? ~0 : 0; MAYBE_LOOP(id, index, T_GEOM, DObject, obj) { ApUseOverrides( GeomAppearance(obj->Item), uistate.apoverride ); if(obj->id == WORLDGEOM) { ApUseOverrides( worldap, uistate.apoverride ); } if(obj->id != WORLDGEOM && !uistate.apoverride) { /* Allow pre-existing World settings to win over those in children */ ApLetPropagate( worldap, GeomAppearance(obj->Item) ); } obj->redraw = true; } break; case DRAWER_INERTIA: uistate.inertia = ival<0 ? !uistate.inertia : ival; break; case DRAWER_CONSTRAIN: uistate.constrained = ival<0 ? !uistate.constrained : ival; break; case DRAWER_OWNMOTION: uistate.ownmotion = ival<0 ? !uistate.ownmotion : ival; break; default: ; /* This should never happen */ } ui_maybe_refresh(id); } LDEFINE(lines_closer, LVOID, "(lines-closer CAM-ID DIST)\n\ Draw lines (including edges) closer to the camera than polygons\n\ by DIST / 10^5 of the Z-buffer range. DIST = 3.0 by default.\n\ If DIST is too small, a line lying on a surface may be\n\ dotted or invisible, depending on the viewpoint.\n\ If DIST is too large, lines may appear in front of surfaces\n\ that they actually lie behind. Good values for DIST vary with\n\ the scene, viewpoint, and distance between near and far clipping\n\ planes. This feature is a kludge, but can be helpful.") { float dist; int id; LDECLARE(("lines-closer", LBEGIN, LID, &id, LFLOAT, &dist, LEND)); drawer_float(id, DRAWER_LINE_ZNUDGE, dist); return Lt; } void drawer_float(int id, DrawerKeyword key, float fval) { DObject *obj; ApStruct as; int index; int attr, over; LInterest *interested; as.h = NULL; switch (key) { case DRAWER_NEAR: attr = CAM_NEAR; goto setcam; case DRAWER_FAR: attr = CAM_FAR; goto setcam; case DRAWER_FOV: attr = CAM_FOV; goto setcam; case DRAWER_FOCALLENGTH: attr = CAM_FOCUS; goto setcam; setcam: interested = LInterestList("merge"); MAYBE_LOOP(id, index, T_CAM, DObject, obj) { DVobj(obj)->cam = CamSet(DVobj(obj)->cam, attr, fval, CAM_END); DVobj(obj)->redraw = true; if(interested) gv_merge(&CamOps, DVobj(obj)->id, (Ref *)DVobj(obj)->cam); } break; case DRAWER_KA: attr = MT_Ka; over = MTF_Ka; goto domt; case DRAWER_KD: attr = MT_Kd; over = MTF_Kd; goto domt; case DRAWER_KS: attr = MT_Ks; over = MTF_Ks; goto domt; case DRAWER_SHININESS: attr = MT_SHININESS; over = MTF_SHININESS; goto domt; case DRAWER_ALPHA: attr = MT_ALPHA; over = MTF_ALPHA; goto domt; domt: as.ap = ApCreate(AP_MtSet, attr, fval, MT_OVERRIDE, over & uistate.apoverride, MT_END, AP_END); goto mergeap; case DRAWER_NORMSCALE: as.ap = ApCreate(AP_NORMSCALE, fval, AP_OVERRIDE, APF_NORMSCALE & uistate.apoverride, AP_END); goto mergeap; mergeap: gv_merge_ap(id, &as); ApDelete(as.ap); return; case DRAWER_LIGHT_INTENSITY: set_light_intensity( fval ); drawerstate.changed = true; break; case DRAWER_LINE_ZNUDGE: MAYBE_LOOP(id, index, T_CAM, DObject, obj) { DVobj(obj)->lineznudge = fval; DVobj(obj)->redraw = true; } drawerstate.defview.lineznudge = fval; break; default: { /* report some kind of error? */ } } ui_maybe_refresh(id); } LDEFINE(backcolor, LVOID, "(backcolor CAM-ID R G B)\n\ Set the background color of CAM-ID; R G B are numbers\n\ between 0 and 1.") { int id; Color color; LDECLARE(("backcolor", LBEGIN, LID, &id, LFLOAT, &(color.r), LFLOAT, &(color.g), LFLOAT, &(color.b), LEND)); drawer_color( id, DRAWER_BACKCOLOR, &color ); return Lt; } LDEFINE(bbox_color, LVOID, "(bbox-color GEOM-ID R G B)\n\ Set the bounding-box color of GEOM-ID; R G B are numbers\n\ between 0 and 1.") { int id; Color color; LDECLARE(("bbox-color", LBEGIN, LID, &id, LFLOAT, &(color.r), LFLOAT, &(color.g), LFLOAT, &(color.b), LEND)); drawer_color( id, DRAWER_BBOXCOLOR, &color ); return Lt; } void drawer_color(int id, DrawerKeyword key, Color *col) { int index; ApStruct as; DObject *obj; as.h = NULL; switch (key) { case DRAWER_DIFFUSE: as.ap = ApCreate(AP_MtSet, MT_DIFFUSE, col, MT_AMBIENT, col, MT_OVERRIDE, MTF_DIFFUSE & uistate.apoverride, MT_END, AP_END); goto doap; case DRAWER_EDGECOLOR: as.ap = ApCreate(AP_MtSet, MT_EDGECOLOR, col, MT_OVERRIDE, MTF_EDGECOLOR & uistate.apoverride, MT_END, AP_END); goto doap; case DRAWER_NORMALCOLOR: as.ap = ApCreate(AP_MtSet, MT_NORMALCOLOR, col, MT_OVERRIDE, MTF_NORMALCOLOR & uistate.apoverride, MT_END, AP_END); goto doap; doap: gv_merge_ap(id, &as); ApDelete(as.ap); break; case DRAWER_BBOXCOLOR: MAYBE_LOOP(id, index, T_GEOM, DObject, obj) { if (DGobj(obj)->bboxap && DGobj(obj)->bboxap->mat) { MtSet(DGobj(obj)->bboxap->mat, MT_EDGECOLOR, col, MT_OVERRIDE, MTF_EDGECOLOR & uistate.apoverride, MT_END); obj->redraw = true; } else { OOGLError(0,"object with %1d has no bboxap!"); } } uistate.pickedbboxcolor = *col; break; case DRAWER_BACKCOLOR: drawerstate.defview.backcolor = *col; MAYBE_LOOP(id, index, T_CAM, DObject, obj) { DVobj(obj)->backcolor = *col; DVobj(obj)->redraw = true; } break; case DRAWER_LIGHTCOLOR: set_light_color(col); break; default: { /* report some kind of error? */ } } ui_maybe_refresh(id); } LDEFINE(window, LVOID, "(window CAM-ID WINDOW)\n\ Specify attributes for the window of CAM-ID, e.g. its size\n\ or initial position, in the OOGL Window syntax.\n\ The special CAM-ID \"default\" specifies\n\ properties of future windows (created by \"camera\" or\n\ \"new-camera\").") { int index; DView *dv; int id; WindowStruct *ws; LDECLARE(("window", LBEGIN, LID, &id, LWINDOW, &ws, LEND)); MAYBE_LOOP(id, index, T_CAM, DView, dv) { WnDelete(dv->win); dv->win = WnCopy(ws->wn); if(dv->mgctx) { mgctxselect(dv->mgctx); mgctxset(MG_WINDOW, dv->win, MG_END); } } return Lt; } /* * Everything below here is internal to the drawer module (and should * be declared static to enforce this). */ /* * Track all changes made to dgeoms and views, by checking their * "changed", "moving" and "redraw" flags. * Effect: * For each changed ordinary DGeom, calls update_dgeom() * to possibly recompute the bounding box and/or renormalize. * Set the "redraw" flags on all DViews which: * are marked as "changed" or "moving", or * Also set "redraw" on all DViews which view the world, * if any DGeoms are "changed" or "moving". * * Environment: * "changed" flags are set by gv_geometry(), etc. * and by callback routines from external changes. * They're cleared by this routine. * "redraw" flags are cleared by draw_view(). * "moving" is set by drawer_xform_incr() and drawer_updateproc(). */ static void track_changes() { bool worldchange = drawerstate.changed; bool viewchange = 0; int i; DObject *o; for(i = 0; i < dgeom_max; i++) { if((o = (DObject *)dgeom[i]) != NULL) { if(o->moving) worldchange = true; if(o->changed || o->redraw) { worldchange = true; update_dgeom((DGeom*)o); o->changed = CH_NOTHING; o->redraw = false; } } } for(i = 0; i < dview_max; i++) { if((o = (DObject *)dview[i]) != NULL) { if(o->moving || ((DView *)o)->newcam || (worldchange && o->Item == drawerstate.universe)) o->changed = true; if(o->changed) { update_view((DView *)o); viewchange = true; } if(!((DView*)o)->frozen) { viewchange = viewchange || o->redraw; } } } if(viewchange) { for(i = 0; i < dview_max; i++) if((o = (DObject *)dview[i]) != NULL) if(((DView *)o)->cameradraw) o->redraw = true; } drawerstate.changed = false; } LDEFINE(merge_baseap, LVOID, "(merge-baseap APPEARANCE)\n\ Merge in some appearance characteristics to the base default\n\ appearance (applied to every geom before its own apperance).\n\ Lighting is typically included in the base appearance.") { ApStruct *as; LDECLARE(("merge-baseap", LBEGIN, LAP, &as, LEND)); drawerstate.ap = ApMerge(as->ap, drawerstate.ap ? drawerstate.ap : base_defaultap, APF_OVEROVERRIDE); drawerstate.apseq++; lights_changed_check(); return Lt; } void drawer_merge_camera( int id, Camera *cam ) { DView *dv; int index; MAYBE_LOOP(id, index, T_CAM, DView, dv) { CamMerge(cam, dv->cam); dv->newcam = true; } } void drawer_merge_window( int id, WnWindow *win ) { DView *dv; int index; MAYBE_LOOP(id, index, T_CAM, DView, dv) { WnMerge(win, dv->win); if(dv->mgctx) { mgctxselect(dv->mgctx); mgctxset(MG_WINDOW, dv->win, MG_END); dv->newcam = true; } } } static void delete_geometry(DGeom *dg) { int i, index = INDEXOF(dg->id); if(dgeom[index] == NULL) /* Already (being) deleted -- forget it */ return; if (dg->bbox_center != NOID) { /* Delete the bbox-center object */ gv_delete(dg->bbox_center); dg->bbox_center = NOID; } dgeom[index] = NULL; switch (dg->citizenship) { case ORDINARY: dgeom[0]->Lgeom = ListRemove( dgeom[0]->Lgeom, dg->Item ); GeomReplace( dgeom[0]->Inorm, dgeom[0]->Lgeom ); ui_objectchange(); if (uistate.targetgeom==index) { /* We deleted the target -- find next lowest one */ for (i=index; --i>=0 && dgeom[i]==NULL; ); gv_ui_target( GEOMID(i), TYPEOF(uistate.targetid) == T_GEOM ? IMMEDIATE : NOIMMEDIATE ); } break; case ALIEN: if (ListRemove(drawerstate.universe, dg->Item) != drawerstate.universe) { OOGLError(0, "\ head of the universe changed --- this shouldn't happen; please report this bug!"); } break; default: ; /* This should never happen */ } HandlePDelete(&dg->incrhandle); OOGLFree(dg); drawerstate.changed = true; } static void delete_camera(DView *dv) { int index = INDEXOF(dv->id); int i; if(dview[index] == NULL) /* Already (being) deleted -- forget it */ return; dview[index] = NULL; mgctxdelete(dv->mgctx); CamDelete(dv->cam); HandlePDelete(&dv->camhandle); GeomDelete(dv->Item); OOGLFree(dv); ui_objectchange(); if (index == uistate.mousefocus) { for(i = dview_max; --i > 0 && (dview[i] == NULL || dview[i]->frozen != UNFROZEN); ) ; ui_mousefocus(i); } if (drawer_get_object(TARGETCAMID) == NULL) { if (drawer_get_object(FOCUSID) == NULL) { gv_ui_target( WORLDGEOM, IMMEDIATE); } else { gv_ui_target( FOCUSID, TYPEOF(uistate.targetid) == T_CAM ? IMMEDIATE : NOIMMEDIATE); } } } void drawer_init(char *apdefault, char *defaultcam, char *windefault) { int i; DGeom *dg; IOBFILE *f; ts_identity.h = NULL; TmIdentity(ts_identity.tm); f = iobfileopen(fmemopen(apdefault, strlen(apdefault), "rb")); if(f) drawerstate.ap = base_defaultap = ApFLoad(f, "built-in appearance"); iobfclose(f); RefIncr((Ref *)drawerstate.ap); drawerstate.apseq++; /* Install default window position if not already set */ if(drawerstate.defview.win == NULL) comm_object(windefault, &WindowOps, NULL, (Ref **)(void *)&drawerstate.defview.win, COMM_NOW); drawerstate.defview.backcolor = initial_defaultbackcolor; if(drawerstate.defview.cam == NULL) drawerstate.defview.cam = CamCreate(CAM_FOV, 40.0, CAM_NEAR, 0.1, CAM_FAR, 100.0, CAM_END); /* Create a not-quite-instantiated window */ drawerstate.defview.mgctx = mgctxcreate(MG_CAMERA, drawerstate.defview.cam, MG_BACKGROUND, &drawerstate.defview.backcolor, MG_APPEAR, drawerstate.ap, MG_WINDOW, drawerstate.defview.win, MG_SHOW, 0, MG_END ); drawerstate.defview.id = DEFAULTCAMID; drawerstate.defview.lineznudge = 3.; drawerstate.space = TM_EUCLIDEAN; drawerstate.pause = 0; /* drawerstate.motionscale controls the minimum rate of scaled translations; it should be small, for accurate mouse tracking, but not quite zero, lest scaled motions do nothing when a moving object coincides with the center of motion. (At present, the only scaled translation is Z-motion in [o]rbit mode.) slevy 93.10.15. */ drawerstate.motionscale = 0.03; name_fsa = fsa_initialize(name_fsa, NOID); fsa_install(name_fsa, "focus", (void *)FOCUSID); fsa_install(name_fsa, "default", (void *)DEFAULTCAMID); fsa_install(name_fsa, "defaultcam", (void *)DEFAULTCAMID); fsa_install(name_fsa, "target", (void *)TARGETID); fsa_install(name_fsa, "targetgeom", (void *)TARGETGEOMID); fsa_install(name_fsa, "g.", (void *)TARGETGEOMID); fsa_install(name_fsa, "targetcam", (void *)TARGETCAMID); fsa_install(name_fsa, "targetcamera", (void *)TARGETCAMID); fsa_install(name_fsa, "c.", (void *)TARGETCAMID); fsa_install(name_fsa, "center", (void *)CENTERID); fsa_install(name_fsa, "bbox-center", (void *)BBOXCENTERID); fsa_install(name_fsa, "allgeoms", (void *)ALLGEOMS); fsa_install(name_fsa, "g*", (void *)ALLGEOMS); fsa_install(name_fsa, "allcams", (void *)ALLCAMS); fsa_install(name_fsa, "c*", (void *)ALLCAMS); fsa_install(name_fsa, "worldgeom", (void *)WORLDGEOM); fsa_install(name_fsa, "world", (void *)WORLDGEOM); fsa_install(name_fsa, "self", (void *)SELF); fsa_install(name_fsa, ".", (void *)SELF); fsa_install(name_fsa, "universe", (void *)UNIVERSE); fsa_install(name_fsa, "Universe", (void *)UNIVERSE); fsa_install(name_fsa, "primitive", (void *)PRIMITIVE); /* The following four names are here for backward compatibility * of the 'write' command with the midsummer '92 version. */ fsa_install(name_fsa, "bare", (void *)SELF); fsa_install(name_fsa, "wrap", (void *)WORLDGEOM); fsa_install(name_fsa, "cumulative", (void *)UNIVERSE); fsa_install(name_fsa, "cum", (void *)UNIVERSE); dgeom = OOGLNewNE(DGeom *, dgeom_max, "dgeom array"); dview = OOGLNewNE(DView *, dview_max, "view array"); for (i=0; i INST [world modelling & appearance] * == dgeom[0]->Item | * | * dgeom[0]->Inorm INST [world normalizing] * | * dgeom[0]->Lgeom --> LIST -- LIST -- LIST ... [all objects] */ dgeom[0] = dg = OOGLNewE(DGeom, "world DGeom"); dg->normalization = EACH; dg->bboxdraw = 1; dg->bezdice = 10; drawer_init_dgeom(dg, GEOMID(0), THEWORLD); dg->Inorm = GeomCreate("inst", CR_END); dg->bboxap = ApCreate(AP_DONT, APF_FACEDRAW, AP_DO, APF_EDGEDRAW, AP_OVERRIDE, APF_EDGEDRAW, AP_MtSet, MT_EDGECOLOR,&uistate.pickedbboxcolor, MT_OVERRIDE, MTF_EDGECOLOR, MT_END, AP_END); drawerstate.world = GeomCreate("inst", CR_GEOM, dg->Inorm, CR_END); dg->Item = drawerstate.world; dg->Lgeom = NULL; TmIdentity(dg->Incr); name_object(dg, 1, "World"); dg->bboxvalid = false; drawerstate.universe = GeomCreate("list", CR_GEOM, drawerstate.world, CR_END); drawerstate.defview.Item = drawerstate.universe; GeomDice(dg->Item, dg->bezdice, dg->bezdice); f = iobfileopen(fmemopen(defaultcam, strlen(defaultcam), "rb")); drawerstate.camgeom = GeomFLoad(f, "built-in camera geometry"); iobfclose(f); drawerstate.camproj = 0; #ifdef MANIFOLD drawerstate.nDV = 0; drawerstate.nMT = 0; drawerstate.d1 = 1.0; drawerstate.i1 = 0.5; verbose_manifold = ( getenv("VERBOSE_MANIFOLD") != NULL ); trivial_visibility = ( getenv("TRIVIAL_VISIBILITY") != NULL ); #endif /* MANIFOLD */ } static void winmoved(int camid) { WnWindow *wn; DView *dv = (DView *)drawer_get_object(camid); if(dv != NULL && dv->mgctx != NULL) { mgctxselect(dv->mgctx); mgctxget(MG_WINDOW, &wn); WnGet(wn, WN_CURPOS, &drawerstate.winpos); } } static bool nonidentity(Transform T) { return memcmp(T, TM_IDENTITY, sizeof(Transform)) != 0; } static DGeom * new_dgeom(char *from, enum citizenship citizenship) { DGeom *dg; Geom *g = NULL; Handle *h = NULL; int i; if(from != NULL) (void) comm_object(from, &GeomOps, &h, (Ref **)(void *)&g, COMM_LATER); for (i=0; ibboxdraw = dgeom[0]->bboxdraw; dg->Lgeom = GeomCreate("list", CR_HANDLE_GEOM, h, g, CR_END); dg->Lbbox = GeomCreate("list", CR_NOCOPY, CR_APPEAR, dg->bboxap=ApCopy(dgeom[0]->bboxap, NULL), CR_END); ListAppend(dg->Lgeom, dg->Lbbox); dg->Inorm = GeomCreate("inst", CR_NOCOPY, CR_GEOM, dg->Lgeom, CR_END); dg->Item = GeomCreate("inst", CR_NOCOPY, CR_GEOM, dg->Inorm, CR_END); dg->changed = CH_GEOMETRY; dg->pickable = true; switch (citizenship) { case ORDINARY: if(dgeom[0]->Lgeom == NULL) dgeom[0]->Lgeom = GeomCreate("list", CR_NOCOPY, CR_GEOM, dg->Item, CR_END); else ListAppend( dgeom[0]->Lgeom, dg->Item ); GeomReplace( dgeom[0]->Inorm, dgeom[0]->Lgeom ); break; case ALIEN: ListAppend(drawerstate.universe, dg->Item); break; default: break; /* cannot happen, shut-off a compiler warning */ } return dg; } void drawer_init_dgeom(DGeom *dg, int id, enum citizenship citizenship) { dg->id = id; dg->citizenship = citizenship; TmIdentity(dg->Incr); dg->incrhandle = NULL; dg->updateproc = NULL; dg->moving = 0; dg->bezdice = dgeom[0]->bezdice; dg->name[0] = NULL; dg->name[1] = NULL; name_object(dg, 0, new_object_name(T_GEOM)); dg->bboxdraw = dgeom[0]->bboxdraw; dg->normalization = dgeom[0]->normalization; dg->bboxvalid = false; dg->changed = CH_NOTHING; dg->redraw = false; dg->seqno = 0; dg->NDT = NULL; dg->NDTinv = NULL; dg->bbox_center = NOID; #if 0 GeomSet(dg->Item, CR_NDAXIS, dg->NDT, CR_END); #endif } /*----------------------------------------------------------------------- * Function: drawer_make_bbox * Description: Make a new bounding box. * Args: *dg: parent DGeom * combine: flag; if non-zero, takes union of old & new bboxes; * if zero, fits bbox tightly about object. * Returns: * Author: munzner * Date: Tue Dec 10 20:42:20 1991 * Notes: Geom must be non-NULL. * If old bbox exists is deleted, since new one always created. * Default appearance: draw black edges, no faces. * Assumes (if 'combine') that Lbbox list includes Lgeom list. */ void drawer_make_bbox(DGeom *dg, bool combine) { Geom *bbox; /* Don't create bbox for world dgeom */ if (dg->id == WORLDGEOM) { return; } if (!dg->bboxvalid) { if(!combine) { GeomReplace(dg->Lbbox, NULL); } bbox = GeomBound(dg->Lgeom, drawerstate.NDim > 0 ? NULL : TM_IDENTITY, NULL); if (bbox) { GeomReplace(dg->Lbbox, bbox); GeomDelete(bbox); /* Only Lbbox needs it now */ dg->bboxvalid = true; if (dg->bbox_center != NOID) { /* Delete the old center object */ gv_delete(dg->bbox_center); dg->bbox_center = NOID; } } } } /*----------------------------------------------------------------------- * Function: _name_object * Description: name an object * Args: *obj: the object to be named * ni: name index --- 0 or 1 * *name: object's name name * Returns: nothing * Author: mbp * Date: Thu Dec 5 18:12:22 1991 * Notes: Don't call this procedure directly. Use the * 'name_object' * macro defined above; it casts * its first argument (a DGeom* or a DView*) to Object*. */ static char * _name_object(DObject *obj, int ni, char *name) { char *tail; /* uninstall the old name, if any */ if (obj->name[ni] != NULL) { fsa_install( name_fsa, obj->name[ni], NOID ); OOGLFree(obj->name[ni]); obj->name[ni] = NULL; } /* get tail if full pathname */ tail = strrchr(name, '/'); if (tail) tail++; else tail = name; /* install the new name */ obj->name[ni] = unique_name(tail, obj->id); if ( ni==0 && strcmp(obj->name[ni], tail)!=0 ) { OOGLError(0,"warning: attempt to use existing first name: \"%s\"\n\ using \"%s\" instead", tail, obj->name[ni]); } fsa_install( name_fsa, obj->name[ni], (void *)(long)obj->id ); return obj->name[ni]; } static DView * new_dview() { DView *dv; char window_name[64], *view_name; int i; WnPosition wp; for (i=0; iid = CAMID(i); view_name = new_object_name(T_CAM); dv->cam = CamCopy(drawerstate.defview.cam, NULL); CamSet(dv->cam, CAM_SPACE, drawerstate.space, CAM_END); dv->win = WnCopy(drawerstate.defview.win); dv->backcolor = drawerstate.defview.backcolor; dv->camhandle = NULL; RefIncr((Ref*)(drawerstate.universe)); dv->Item = drawerstate.universe; dv->extradraw = NULL; dv->apseq = drawerstate.apseq; TmIdentity(dv->Incr); dv->incrhandle = NULL; dv->updateproc = NULL; dv->moving = false; dv->changed = CH_NOTHING; dv->frozen = UNFROZEN; dv->seqno = 0; dv->lineznudge = drawerstate.defview.lineznudge; dv->newcam = true; dv->name[0] = NULL; dv->name[1] = NULL; name_object(dv, 0, view_name); sprintf(window_name, "geomview %s", view_name); dv->cameradraw = false; dv->hsphere = NULL; dv->hmodel = VIRTUAL; dv->stereo = NO_KEYWORD; dv->stereogap = 0; dv->shader = NULL; dv->mgctx = mgctxcreate(MG_CAMERA, dv->cam, MG_BACKGROUND, &dv->backcolor, MG_APPEAR, drawerstate.ap, MG_WINDOW, dv->win, MG_SHOW, 0, /* Don't show window until we set its name */ MG_END ); if(WnGet(dv->win, WN_PREFPOS, &wp) > 0) { wp.xmin += 40; wp.ymin -= 40; wp.xmax += 40; wp.ymax -= 40; WnSet(drawerstate.defview.win, WN_PREFPOS, &wp, WN_END); } if(i >= nwins) nwins = i+1; for(i = 0; i < 3; i++) dv->NDPerm[i] = i+1; dv->NDPerm[3] = 0; dv->nNDcmap = 0; dv->cluster = NULL; for(i = 0; i < MAXCMAP; i++) { dv->NDcmap[i].axis = NULL; VVINIT(dv->NDcmap[i].cents, cent, 5); } return dv; } static void updateit(float dt) { int i; DView *dv; DGeom *dg; Geom *g; do_motion(dt); for(i = 0; i < dgeom_max; i++) { if((dg = dgeom[i]) == NULL) continue; if (dg->updateproc) { GeomGet(dg->Lgeom, CR_GEOM, &g); (*(dg->updateproc))(g); } else { GeomTransform(dg->Item, dg->Incr, NULL); } } LOOPVIEWS(i,dv) { if (dv->updateproc) (*(dv->updateproc))(dv->cam); else CamTransform(dv->cam, dv->Incr); } } static void draw_view(DView *dv) { /* Colors for red/cyan stereo */ static int lefteyemask = MGO_NOGREEN|MGO_NOBLUE; /* Red */ static int righteyemask = MGO_NORED; /* Green+Blue */ Appearance *ap; if((dv->frozen == UNFROZEN) && (dv->redraw || (dv->changed != CH_NOTHING) || dv->newcam)) { mgctxselect(dv->mgctx); mgctxset(MG_CAMERA, dv->cam, MG_BACKGROUND, &dv->backcolor, MG_ZNUDGE, dv->lineznudge * 1.0e-5, MG_UNSETOPTIONS, MGO_NORED|MGO_NOGREEN|MGO_NOBLUE|MGO_INHIBITCLEAR, MG_END); if(drawerstate.apseq > dv->apseq) { mgsetappearance(drawerstate.ap, MG_SET); dv->apseq = drawerstate.apseq; } ap = GeomAppearance(dv->Item); if(ap) mgsetappearance(ap, MG_MERGE); if(dv->newcam) reconfigure_view(dv); if(dv->stereo != NO_KEYWORD) { mgctxset(MG_WnSet, WN_VIEWPORT, &dv->vp[1], WN_END, MG_CamSet, CAM_STEREOEYE, 1, CAM_END, MG_SETOPTIONS, MGO_INHIBITSWAP, MG_END); if(dv->stereo == COLORED_KEYWORD) mgctxset(MG_SETOPTIONS, lefteyemask, MG_END); really_draw_view(dv); mgctxset(MG_WnSet, WN_VIEWPORT, &dv->vp[0], WN_END, MG_CamSet, CAM_STEREOEYE, 0, CAM_END, MG_UNSETOPTIONS, MGO_INHIBITSWAP|lefteyemask, MG_END); if(dv->stereo == COLORED_KEYWORD) { /* In Iris GL, clearing clears everything, including the * left-eye image we just drew. In OpenGL, it doesn't. * So *only* if we're doing GL drawing, select MGO_INHIBITCLEAR * along with the right-eye image planes. */ mgctxset(MG_SETOPTIONS, _mgf.mg_devno == MGD_GL ? righteyemask|MGO_INHIBITCLEAR : righteyemask, MG_END); } } really_draw_view(dv); dv->changed = CH_NOTHING; dv->redraw = false; } } /* * Reconfigure view. Assumes the proper window is already selected. */ static void reconfigure_view(DView *dv) { WnWindow *win = NULL; WnPosition wp, gap; int xsize, ysize; int isstereo = 1; mgctxget(MG_WINDOW, &win); WnGet(win, WN_CURPOS, &wp); xsize = wp.xmax - wp.xmin + 1; ysize = wp.ymax - wp.ymin + 1; dv->vp[0].xmin = dv->vp[0].ymin = 0; dv->vp[0].xmax = xsize-1; dv->vp[0].ymax = ysize-1; dv->vp[1] = dv->vp[0]; gap = dv->vp[0]; switch(dv->stereo) { case NO_KEYWORD: isstereo = 0; break; case HORIZONTAL_KEYWORD: dv->vp[0].xmax = (xsize - dv->stereogap) / 2; dv->vp[1].xmin = dv->vp[0].xmax + dv->stereogap; gap.xmin = dv->vp[0].xmax + 1; gap.xmax = dv->vp[1].xmin - 1; break; case VERTICAL_KEYWORD: dv->vp[0].ymax = (ysize - dv->stereogap) / 2; dv->vp[1].ymin = dv->vp[0].ymax + dv->stereogap; gap.ymin = dv->vp[0].ymax + 1; gap.ymax = dv->vp[1].ymin - 1; break; case COLORED_KEYWORD: /* Viewports identical, stereo enabled. */ break; default: break; } if(dv->stereogap > 0) { mgctxset(MG_WnSet, WN_VIEWPORT, &gap, WN_END, MG_END); mgworldbegin(); mgworldend(); /* Force clear */ mgworldbegin(); mgworldend(); /* ... of both buffers */ } mgctxset(MG_WnSet, WN_VIEWPORT, &dv->vp[0], WN_END, MG_CamSet, CAM_STEREO, isstereo, CAM_END, MG_END); mgreshapeviewport(); dv->newcam = false; if(dv->id == CAMID(uistate.mousefocus)) winmoved(dv->id); } static void really_draw_view(DView *dv) { #if 0 #include static int cnt; static struct timeval tv_old[1]; if (cnt % 100 == 0) { struct timeval tv_new[1]; double elapsed; gettimeofday(tv_new, NULL); if (cnt > 0) { elapsed = (double)(tv_new->tv_sec - tv_old->tv_sec); elapsed += (double)(tv_new->tv_usec - tv_old->tv_usec) / 1e6; fprintf(stderr, "%d frames in %e seconds, fps = %e\n", cnt, elapsed, (double)cnt/elapsed); cnt = 0; } *tv_old = *tv_new; } cnt++; #endif mgpushappearance(); mgworldbegin(); if(dv->cluster == NULL && drawerstate.NDim > 0) { /* If we're in N-D mode but this camera isn't equipped, * give it a default N-D => 3-D projection now. */ gv_ND_axes(dv->name[0], drawerstate.NDcams ? drawerstate.NDcams->name : "default", 1, 2, 3, 0); } if(dv->cluster != NULL) { /* ND-drawing, works also with scenes; the (scene ...) command * takes care of attaching all cameras of a cluster to the same * scene. */ NDcam *cluster = dv->cluster; int dim = TmNGetSize(cluster->C2W, NULL,NULL); NDstuff *nds; TransformN *W2C = NULL, *W2U = NULL; cluster->W2C = TmNInvert(cluster->C2W, cluster->W2C); W2C = TmNCopy(cluster->W2C, NULL); W2U = TmNIdentity(TmNCreate(dim, dim, NULL)); nds = drawer_init_ndstuff(dv, W2C, W2U); drawer_transform_ndstuff(nds, NULL); mgctxset(MG_NDCTX, nds, MG_END); GeomDraw(dv->Item); /* draw other camera's if requested; take their respective * ND-transform into account. */ if (drawerstate.camgeom != NULL && dv->cameradraw) { DView *otherv; int otheri; Transform T3; TransformN *ovC2W = NULL; LOOPVIEWS(otheri, otherv) { if (otherv != dv && otherv->Item == dv->Item) { if(drawerstate.camproj) { /* Mmmh. ND?? */ Transform Tt; CamView(otherv->cam, Tt); TmInvert(Tt, T3); } else { CamGet(otherv->cam, CAM_C2W, T3); } if (otherv->cluster && otherv->cluster->C2W) { ovC2W = TmNCopy(otherv->cluster->C2W, ovC2W); } else { ovC2W = ovC2W ? TmNIdentity(ovC2W) : TmNIdentity(TmNCreate(drawerstate.NDim, drawerstate.NDim, NULL)); } TmNApplyT3TN(T3, otherv->NDPerm, ovC2W); TmNMap(ovC2W, otherv->NDPerm, ovC2W); drawer_transform_ndstuff(nds, ovC2W); GeomDraw(drawerstate.camgeom); /* we assume that cameras have no translucent component */ } } TmNDelete(ovC2W); } TmNDelete(W2U); TmNDelete(W2C); drawer_destroy_ndstuff(nds); mgctxset(MG_NDCTX, NULL, MG_END); } else { /* Normal case. Just draw whatever's attached to this camera */ GeomDraw(dv->Item); /* new */ if (dv->hsphere != NULL) { /* if we're in conformal ball model, switch to projective model for drawing the sphere at infinity, then switch back */ int mgspace; mgctxget(MG_SPACE, &mgspace); if (dv->hmodel == CONFORMALBALL) { mgctxset(MG_SPACE, TM_SPACE(mgspace) | TM_PROJECTIVE, MG_END); GeomDraw(dv->hsphere); mgctxset(MG_SPACE, mgspace, MG_END); } else { GeomDraw(dv->hsphere); } } /* drawing of other cameras in ND has been handled above */ if (drawerstate.camgeom && dv->cameradraw && dv->Item == drawerstate.universe) { DView *otherv; int otheri; Transform T, Tt; LOOPVIEWS(otheri,otherv) { if (otherv != dv && otherv->Item == drawerstate.universe) { mgpushtransform(); if(drawerstate.camproj) { CamView(otherv->cam, Tt); TmInvert(Tt, T); } else CamGet(otherv->cam, CAM_C2W, T); mgtransform(T); GeomDraw(drawerstate.camgeom); mgpoptransform(); } } } } if (dv->extradraw) (dv->extradraw)(dv); mgworldend(); mgpopappearance(); } static char * new_object_name(int type) { static char name[16]; int i; for(i = 0; ; i++) { sprintf(name, "%c%d", type == T_GEOM ? 'g' : 'c', i); if(drawer_idbyname(name) == NOID) return name; } } /*----------------------------------------------------------------------- * Function: ordinal * Description: extract the ordinal number of a DView or DGeom from its name * Args: *name: DView or DGeom's name --- assumed to be of the form * "x", where x is any char * Returns: * Author: mbp * Date: Sat Nov 30 22:42:54 1991 */ /* static int ordinal(char *name) { return( atoi( &name[1] ) ); } */ static void object_changed(Handle **hp, DObject *obj, void *seqno) { if(obj->seqno != (long)seqno) { /* Obsolete reference -- remove this Handle callback */ HandleUnregisterJust(hp, (Ref*)obj, seqno, object_changed); } else { obj->changed = CH_GEOMETRY; } } static int object_register(Handle **hp, Ref *thing, DObject *o) { HandleRegister(hp, (Ref *)o, (void *)(long)(int)o->seqno, object_changed); return 0; } /* * Something has changed in this dgeom's geometry. * Discard and (if necessary) recompute bounding box. * In any case, scan for Handles. */ static void update_dgeom(DGeom *dg) { if(dg->id == WORLDGEOM) { return; } if(dg->changed/* & CH_GEOMETRY*/) { dg->bboxvalid = false; HandleUnregisterAll((Ref *)dg, (void *)(long)(int)dg->seqno, object_changed); dg->seqno++; /* * Find all Handles in this DGeom, and a callback for each. */ GeomHandleScan(dg->Item, object_register, dg); } if(dg->bboxdraw || dg->normalization != NONE) { drawer_make_bbox(dg, dg->normalization == ALL); } ApSet(dg->bboxap, dg->bboxdraw ? AP_DO : AP_DONT, APF_EDGEDRAW, AP_OVERRIDE, APF_EDGEDRAW & uistate.apoverride, AP_END); GeomDice(dg->Item, dg->bezdice, dg->bezdice); normalize(dg, dg->normalization); } static void update_view(DView *v) { v->seqno++; if(v->Item != drawerstate.universe) GeomHandleScan(v->Item, object_register, v); CamHandleScan(v->cam, object_register, v); } static void normalize(DGeom *dg, int normalization) { float cx,cy,cz,cs,r,dx,dy,dz; HPoint3 min,max; Geom *bbox = NULL; Transform tmp; dg->normalization = normalization; if(dg->id == WORLDGEOM) return; switch(normalization) { case NONE: GeomTransformTo(dg->Inorm, NULL, NULL); break; case EACH: case ALL: if (!dg->bboxvalid) { drawer_make_bbox(dg, normalization == ALL); } GeomGet(dg->Lbbox, CR_GEOM, &bbox); if (bbox != NULL) { BBoxMinMax((BBox*)bbox, &min, &max); cx = (max.x + min.x) * .5; cy = (max.y + min.y) * .5; cz = (max.z + min.z) * .5; dx = max.x - min.x; dy = max.y - min.y; dz = max.z - min.z; r = sqrt(dx*dx + dy*dy + dz*dz); cs = (r == 0) ? 1 : 2.0/r; TmScale(tmp,cs,cs,cs); CtmTranslate(tmp,-cx,-cy,-cz); GeomTransformTo(dg->Inorm, tmp, NULL); } break; /* case KEEP: Leave normalization transform alone */ } dg->redraw = true; } void drawer_nuke_world() { gv_delete( ALLGEOMS ); } void drawer_nuke_cameras(int keepzero) { int i,i0; i0 = keepzero ? 1 : 0; for (i=i0; i", name, i++); } while(fsa_parse(name_fsa, newname) != NOID); return strdup(newname); } #ifdef MANIFOLD int drawer_read_manifold(char *file) { FILE *fp = fopen(file, "rb"); int i,n; setlinebuf(stderr); if (fp == NULL) return 0; n = fgetni(fp, 1, &(drawerstate.nMT), 0); if (n != 1) { OOGLError(0,"%1d", n); return 0; } if (verbose_manifold) fprintf(stderr, "mfd: nMT = %1d\n", drawerstate.nMT); n = fgettransform(fp, drawerstate.nMT, (float*)(drawerstate.MT), 0); if (n != drawerstate.nMT) { OOGLError(0,"%1d", n); return 0; } if (verbose_manifold) { fprintf(stderr, "mfd: MT[] = "); fputtransform(stderr, drawerstate.nMT, (float*)(drawerstate.MT), 0); } n = fgetni(fp, 1, &(drawerstate.nDV), 0); if (n != 1) { OOGLError(0,"%1d", n); return 0; } if (verbose_manifold) { fprintf(stderr, "mfd: nDV = %1d\n", drawerstate.nDV); } n = fgetnf(fp, drawerstate.nDV*4, (float*)(drawerstate.DV), 0); if (n != drawerstate.nDV*4) { OOGLError(0,"%1d", n); return 0; } if (verbose_manifold) { fprintf(stderr, "mfd: DV[] = "); for (i=0; iNDC transform * v: list of vertices of polyhedron * n: number of vertices in list v * Returns: 0 or 1 * Author: mbp * Date: Thu Aug 6 13:43:02 1992 * Notes: Uses an axial bounding box test: is any part of the * the axial bounding box of the projections of the * vertices v visible? This is guaranteed to accept all * visible polyhedra, and may accept some invisible ones * too. */ int visible(Transform T, HPoint3 *v, int n) { #define MIN -2 #define MAX 2 float x,y,z; float xmin = MAX, xmax = MIN, ymin = MAX, ymax = MIN, zmin = MAX, zmax = MIN; int i; Point3 pv; if (trivial_visibility) return 1; for (i=0; i xmax) xmax = pv.x; if (pv.y < ymin) ymin = pv.y; else if (pv.y > ymax) ymax = pv.y; if (pv.z < zmin) zmin = pv.z; else if (pv.z > zmax) zmax = pv.z; } #if 0 printf("x: [%f\t, %f]\n", xmin, xmax); printf("y: [%f\t, %f]\n", ymin, ymax); printf("z: [%f\t, %f]\n", zmin, zmax); #endif /* if entire polyhedron is outside clipping region, reject */ if (zmax <= -1 || zmin >= 1) return 0; if (xmax <= -1 || xmin >= 1) return 0; if (ymax <= -1 || ymin >= 1) return 0; /* otherwise accept */ return 1; #undef MAX #undef MIN } float intensity(float d, float d1, float i1) { float val, d12; d12 = d1*d1; val = i1 * d12 / ( (1 - i1)*d*d + i1*d12 ); return val; } #endif /* MANIFOLD */ static HModelValue hmodelval(char *s, int val) { switch (val) { case VIRTUAL_KEYWORD: return VIRTUAL; case PROJECTIVE_KEYWORD: return PROJECTIVE; case CONFORMALBALL_KEYWORD: return CONFORMALBALL; default: fprintf(stderr, "%s: invalid model keyword (assuming \"virtual\")\n",s); return VIRTUAL; } } Keyword hmodelkeyword(char *s, HModelValue val) { switch (val) { case VIRTUAL: return VIRTUAL_KEYWORD; case PROJECTIVE: return PROJECTIVE_KEYWORD; case CONFORMALBALL: return CONFORMALBALL_KEYWORD; default: fprintf(stderr, "%s: invalid model (assuming \"virtual\")\n",s); return VIRTUAL_KEYWORD; } } static int normalval(char *s, int val) { switch (val) { case NONE_KEYWORD: return NONE; case EACH_KEYWORD: return EACH; case KEEP_KEYWORD: return KEEP; case ALL_KEYWORD: return ALL; default: fprintf(stderr, "%s: invalid normalization type (assuming \"none\")\n",s); return NONE; } } /*----------------------------------------------------------------------- * Function: spaceof * Description: return the space of an object * Args: id: the object * Returns: TM_EUCLIDEAN, TM_HYPERBOLIC, or TM_SPHERICAL * Author: mbp * Date: Sun Dec 13 22:28:58 1992 * Notes: We need to be able to tell what space an object is in, * in order to know what kinds of transformations to * apply to it (any maybe for other reasons, e.g. * shading). OOGL cameras know about what space they're * in. OOGL geoms do not (at this time, anyway). The * main rationale for this is that the concept of "space" * applies to a whole tree of geoms; every geom in the * tree is in the same space. The way geomview currently * deals with this is to use "drawerstate.space" to hold * the space designation for the world. All * space-sensitive procedures should check the space of * an id by calling spaceof(), however, rather than * referencing drawerstate.space directly. This is * because at some point we may generalize to having more * than one world or some other mechanism for keeping * track of what space things are in. */ int spaceof(int id) { DView *dv; int space; if (ISCAM(id)) { dv = (DView*)drawer_get_object(id); if (dv == NULL) { OOGLError(0,"spaceof: unknown camera id %1d (assuming TM_EUCLIDEAN)\n", id); return TM_EUCLIDEAN; } CamGet(dv->cam, CAM_SPACE, &space); return space; } return drawerstate.space; } static int spaceval(char *s, int val) { switch (val) { case EUCLIDEAN_KEYWORD: return TM_EUCLIDEAN; case HYPERBOLIC_KEYWORD: return TM_HYPERBOLIC; case SPHERICAL_KEYWORD: return TM_SPHERICAL; default: fprintf(stderr, "%s: invalid space keyword (assuming \"euclidean\")\n",s); return EUCLIDEAN; } } /*----------------------------------------------------------------------- * Function: scaleof * Description: return a number indicating the scale of an object * Args: id: the object * Returns: the scale number * Author: mbp * Date: Thu Feb 11 11:10:19 1993 */ float scaleof(int id) { float scale = 1.0; if (ISCAM(id)) { DView *dv; dv = (DView*)drawer_get_object(id); if (dv == NULL) { OOGLError(0,"scaleof: unknown camera id %1d (returning scale = 1)\n", id); } else { /* for cameras return the focal length */ CamGet(dv->cam, CAM_FOCUS, &scale); } } else { DGeom *dg; HPoint3 min, max; BBox *bbox; dg = (DGeom*)drawer_get_object(id); if (dg == NULL) { OOGLError(0,"scaleof: unknown geom id %1d (returning scale = 1)\n", id); } else { /* for geoms return (geometric mean of 1 + bbox side lengths) - 1*/ GeomGet(dg->Lbbox, CR_GEOM, &bbox); if (bbox != NULL) { BBoxMinMax((BBox*)bbox, &min, &max); scale = pow( fabs((double)((max.x-min.x+1) *(max.y-min.y+1) *(max.z-min.z+1))), .333 ) - 1; } } } return scale; } LDEFINE(set_motionscale, LVOID, "(set-motionscale X)\n\ Set the motion scale factor to X (default value 0.5). These\n\ commands scale their motion by an amount which depends on the\n\ distance from the frame to the center and on the size of the\n\ frame. Specifically, they scale by\n\ dist + scaleof(frame) * motionscale\n\ where dist is the distance from the center to the frame and\n\ motionscale is the motion scale factor set by this function.\n\ Scaleof(frame) measures the size of the frame object.") { float scale; LDECLARE(("set-motionscale", LBEGIN, LFLOAT, &scale, LEND)); drawerstate.motionscale = scale; return Lt; } LDEFINE(set_conformal_refine, LVOID, "(set-conformal-refine CMX [N [SHOWEDGES]])\n\ Sets the parameters for the refinement algorithm used in drawing\n\ in the conformal model. CMX is the cosine of the maximum angle\n\ an edge can bend before it is refined. Its value should be between\n\ -1 and 1; the default is 0.95; decreasing its value will cause less\n\ refinement. N is the maximum number of iterations of refining;\n\ the default is 6. SHOWEDGES, which should be \"no\" or \"yes\",\n\ determines whether interior edges in the refinement are drawn.") { float cmb; int maxsteps = -1; int showedges = -1; extern void set_cm_refine(double cm_cmb, int cm_mr, int cm_ss); LDECLARE(("set-conformal-refine", LBEGIN, LFLOAT, &cmb, LOPTIONAL, LINT, &maxsteps, LKEYWORD, &showedges, LEND)); set_cm_refine((double)cmb,maxsteps,showedges); return Lt; } static void traverse(Pool *p, Geom *where, int *pickpath, int *curpath, int *curbase, int pn) { Geom *new; char *name; int depth; if (!where) return; name = GeomName(where); if (!strcmp(name, "comment")) { /* check if our current path matches the pickpath decrement the depth since we don't match the last level */ depth = curpath - curbase -1; while (depth >= 0){ if (curbase[depth] != pickpath[depth]) break; if (depth == 0) { /* we're set */ fprintf(PoolOutputFile(p), "{"); CommentExport((Comment*)where, p); fprintf(PoolOutputFile(p), "}"); } depth--; } } else if (!strcmp(name, "list")) { /* push down a level */ curpath++; while (where) { /* traverse the list. the cdr of a list is a list, but don't descend another level */ GeomGet(where, CR_CAR, &new); if (new) { (*curpath)++; traverse(p, new, pickpath, curpath, curbase, pn); } GeomGet(where, CR_CDR, &where); } /* pop up a level */ *curpath = -1; curpath--; } else if (!strcmp(name, "inst")) { GeomGet(where, CR_GEOM, &new); if (new) { /* push down a level */ curpath++; (*curpath)++; traverse(p, new, pickpath, curpath, curbase, pn); /* pop up a level */ *curpath = -1; curpath--; } } } #if 0 static void drawer_write_comments(char *fname, int id, int *pickpath, int pn) { } #endif LDEFINE(write_comments, LVOID, "(write-comments FILENAME GEOMID PICKPATH)\n\ write OOGL COMMENT objects in the GEOMID hierarchy at the\n\ level of the pick path to FILENAME. Specifically, COMMENTS\n\ at level (a b c ... f g) will match pick paths of the form\n\ (a b c ... f *) where * includes any value of g, and also\n\ any values of possible further indices h,i,j, etc. The pick\n\ path (returned in the \"pick\" command) is a list of\n\ integer counters specifying a subpart of a hierarchical\n\ OOGL object. Descent into a complex object (LIST or INST)\n\ adds a new integer to the path. Traversal of simple objects\n\ increments the counter at the current level.\n\ Individual COMMENTS are enclosed by curly braces, and the\n\ entire string of zero, one, or more COMMENTS (written in\n\ the order in which they are encountered during hierarchy\n\ traversal) is enclosed by parentheses.\n\ \n\ Note that arbitrary data can only be passed through the OOGL\n\ libraries as full-fledged OOGL COMMENT objects, which can be\n\ attached to other OOGL objects via the LIST type as described\n\ above. Ordinary comments in OOGL files (i.e. everything after\n\ '#' on a line) are ignored at when the file is loaded and\n\ cannot be returned.") { int id; int pickpath[40]; int pn = 40; char *fname; Pool *p, *op; Geom *where; int count; bool temppool = false; int curpath[40]; Lake *brownie; LDECLARE(("write-comments", LBEGIN, LLAKE, &brownie, LSTRING, &fname, LID, &id, LHOLD, LARRAY, LINT, pickpath, &pn, LEND)); /* The Lake is a dummy argument that gives us access to the right output file pointer */ p = POOL(brownie); if (fname[0] == '-') { if (PoolOutputFile(p)) { op = p; } else { op = PoolStreamTemp(fname, NULL, stdout, 1, &GeomOps); temppool = true; } } else { op = PoolStreamTemp(fname, NULL, NULL, 1, &GeomOps); temppool = true; } if(op == NULL || PoolOutputFile(op) == NULL) { fprintf(stderr, "write: cannot open \"%s\": %s\n", fname, sperror()); return Lnil; } for (count=0; count < 40; count++) { curpath[count] = -1; } /* get to the right starting place */ GeomGet(((DGeom *)drawer_get_object(id))->Lgeom, CR_GEOM, &where); fprintf(PoolOutputFile(op), "( "); traverse(op, where, pickpath, curpath-1, curpath, pn); fprintf(PoolOutputFile(op), ")\n"); fflush(PoolOutputFile(op)); if (temppool) { PoolClose(op); PoolDelete(op); } return Lt; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/drawer.h0000644000175000017500000003743612310110177016405 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _DRAWER_H_ #define _DRAWER_H_ #include "common.h" #include "transformn.h" #include "pick.h" #include "mg.h" /* N-D color maps */ typedef struct cent { /* Colormap entry */ float v; /* projection value */ ColorA c; /* color */ int interp; /* interpolate values between cmap points */ } cent; typedef struct cmap { /* Colormap table */ HPointN *axis; /* projection axis */ vvec cents; /* colormap; entries are 'cent's */ int coords; /* ID of axis' coordinate system; default UNIVERSE */ } cmap; #define MAXCMAP 4 typedef struct NDstuff { mgNDctx mgNDctx; TransformN *W2C; /* World-to-Camera transform */ TransformN *T; /* object-to-ND-camera transform, including * the projection to the lower-dimensional * sub-space. */ #if 0 Transform MGFactor; /* 4x4 transform handed over to the mg layer */ TransformN *rest; /* remaining (Nd-4) lines, contained in the * rows (4..Nd) */ int *perm; /* permuation on the rows of T */ #endif TransformN *W2c; /* Universe-to-Color transform */ TransformN *Tc; /* object-to-coloring-space-transform */ int ncm; /* number of colormaps */ cmap *cm; /* colormap array */ HPointN *hc; /* work area for color projections */ } NDstuff; #define OBJECTFIELDS \ char *name[2]; /* array of names */ \ Geom *Item; /* For Geoms, the Inst holding the \ * modelling transform; for DViews, \ * an Inst pointing to the scene. \ * In all cases this Inst holds any \ * relevant Appearance. \ */ \ PFI updateproc; /* motion update procedure */ \ Handle *incrhandle; /* Handle to above */ \ Transform Incr; /* xform per frame update, if no updateproc */ \ int id; /* my id */ \ int seqno; /* sequence no for keeping track of changes */ \ bool redraw; /* object needs redrawing */ \ bool moving; /* moving -> Incr != identity || updateproc != NULL */ \ unsigned changed /* Something about this obj changed; redraw */ /* flags for the "changed" field */ #define CH_NOTHING 0 #define CH_GEOMETRY 1 #define CH_TRANSFORM 2 typedef struct DObject { OBJECTFIELDS; } DObject; typedef struct DGeom { OBJECTFIELDS; Geom *Inorm; /* Inst holding normalization transform */ Geom *Lgeom; /* List node holding pointer to user's Geom */ Geom *Lbbox; /* List node holding the pointer to our Bbox */ int bbox_center; /* bbox center as alien object */ bool bboxdraw; /* boolean */ char normalization; /* Normalization: NONE, EACH, or ALL */ bool bboxvalid; /* bbox is valid */ bool pickable; /* Is this Dgeom pickable ? */ int bezdice; /* Meshsize for diced up bezier patch */ Appearance *bboxap; enum citizenship {ORDINARY, THEWORLD, ALIEN} citizenship; TransformN *NDT, *NDTinv; /* N-D transform and its inverse; NULL for 3-D objects */ /* Ordinary DGeoms are subgeoms of Theworld DGeom. * Theworld is the single DGeom containing the world transforms * and all ordinary DGeoms. * Alien DGeoms are in the Universe list but are not part of Theworld. */ } DGeom; /* models of hyperbolic space; these must start with 0 and be consecutive because they are used as indices in the browser */ typedef enum { VIRTUAL=0, PROJECTIVE, CONFORMALBALL } HModelValue; typedef struct DView { OBJECTFIELDS; Camera *cam; /* The camera itself */ Handle *camhandle; /* Handle to above */ WnWindow *win; /* The (abstract) window */ unsigned frozen; /* flag: frozen: Don't attempt to redraw this view */ bool newcam; /* flag: need to mgreshapeviewport() */ mgcontext *mgctx; /* Window's mg context pointer */ int apseq; /* seq no: has global default changed? */ float lineznudge; /* millionths of Z-range by which lines lie closer * than surfaces */ Color backcolor; /* Window background color */ bool cameradraw; /* Do we draw cameras in this view? */ Geom *hsphere; /* hsphere at infy for use in hyp mode; when NULL don't draw it, otherwise draw it */ HModelValue hmodel; /* model of hyperbollic space for this camera; value is one of VIRTUAL, PROJECTIVE, CONFORMAL, and is meaningful only when viewing hyperbolic geometry */ PFV extradraw; /* function to draw any extra stuff in this window */ Keyword stereo; /* {NO,HORIZONTAL,VERTICAL}_KEYWORD: stereo style */ int stereogap; /* gap between subwindows in stereo mode */ WnPosition vp[2]; /* Subwindow viewports, if stereo != MONO */ mgshadefunc shader; /* Software shader function (NULL -> hardware) */ int NDPerm[4]; /* N-D -> 3-D axis permutation */ int nNDcmap; cmap NDcmap[MAXCMAP]; /* N-D color map */ struct NDcam *cluster;/* to which cluster do we belong? NULL if not N-D */ } DView; /* flags for "frozen" */ #define UNFROZEN 0 #define SOFT_FROZEN 1 #define HARD_FROZEN 2 typedef struct NDcam { char *name; /* camera-cluster name */ TransformN *C2W, *W2C; /* N-D camera-to-universe transform */ struct NDcam *next; /* next N-D camera */ } NDcam; /* * The array of DGeoms is a flat structure with pointers into the * following OOGL hierarchy: * * * drawerstate.universe --> LIST -------- LIST --- LIST... [rest of Aliens] * | | | * | INST INST * | [Alien] [Alien] * | * drawerstate.world == dgeom[0]: * | * dgeom[0]->Item --> INST [world modelling xform] * [Theworld] * | * dgeom[0]->Inorm --> INST [world normalizing xform] * | * dgeom[0]->Lgeom --> LIST ----- LIST --- ... [all ordinary DGeoms] * [Ordinary] [Ordinary] * | * DGeom[x]: * | * INST (= Item) [modelling xform, appearance] * | * | * INST (= Inorm) [normalization xform] * | * | * LIST (= Lgeom) -------- LIST (= Lbbox) * | | * [user's Geom] [BBox of user's Geom, or NULL] * * Note that the world appearance is *not* dgeom[0]->Item->ap, which * is always NULL. * Changes to the world appearance are broadcast to all individual dgeoms. * worldap is kept around in drawer.c to let the ui know how to * set control panels when the world is the target. */ typedef struct DrawerState { int pause; /* hiatus on emodule input? */ float lastupdate; /* Time (seconds since program began) of last xfm update */ DView defview; /* default DView */ WnPosition winpos; /* screen position of current mg context's window */ int normalization; /* NONE, EACH, KEEP, or ALL (default EACH) */ int space; /* TM_EUCLIDEAN, TM_HYPERBOLIC, TM_SPHERICAL (default EUC) */ int changed; /* Flag: geom or camera or something changed, * must redraw. */ Appearance * ap; /* Default appearance: backstop + .v.ap */ int apseq; /* Sequence number of default appearance; * each drawer mg context should reexamine ap * if drawerstate.apseq != view->apseq */ Geom * world; /* Everything in the world, including * global modelling xform & appearance. */ Geom * universe; /* List of everything in the universe: * world and aliens. */ int NDim; /* Dimension of all ND items */ NDcam *NDcams; /* List of all ND camera clusters, or NULL */ #ifdef MANIFOLD #define MTMAX 500 #define DVMAX 50 Transform MT[MTMAX];/* manifold transforms */ int nMT; /* number of transforms actually in MT */ HPoint3 DV[DVMAX];/* vertices of manifold Dirichlet domain */ int nDV; /* number of vertices actually in DV */ float d1, i1; #endif float motionscale; /* set by user; used in scaling some (not all) motions */ Geom *camgeom; /* Object used when drawing cameras */ int camproj; /* Apply camera's projection to it? */ /* drawerstate.world is the first node in drawerstate.universe * dgeom[0]->Item == drawerstate.world * dgeom[0]->Inorm is the child of the above * dgeom[0]->Lgeom is the child of dgeom[0]->Inorm */ } DrawerState; /* * LOOPGEOMS(i,dg) loops over all defined geoms; for each defined * geom, int i is the index in the dgeoms array, and DGeom *dg * points to the geom. Usage: * LOOPGEOMS(i,dg) { * < body of loop --- use i and dg as needed > * } * Note we skip dgeom[0], since it's by definition the entire world. */ #define LOOPGEOMS(i,dg) \ for (i=1; icitizenship==cit) ) /* * LOOPVIEWS(i,dv) is like LOOPGEOMS but for views. */ #define LOOPVIEWS(i,dv) \ for (i=0; i * is set correctly on any given pass through the loop > * } */ #define MAYBE_LOOP(id, i, type, objtype, obj) \ for(i = 0; (obj = (objtype *)drawer_next_bcast(id, &i, type)); i++) #define MAYBE_LOOP_ALL(id, i, type, objtype, obj) \ for(i = 0; (obj = (objtype *)drawer_next_object(id, &i, type)); i++) /* * An ID encodes an index (int) and a type (cam or geom). */ #define T_NONE 0 #define T_GEOM 1 #define T_CAM 2 #define T_MAX 3 /* Max T_* value plus one */ #define GEOMID(i) ((i)<<2 | T_GEOM) /* Geometric object #i */ #define CAMID(i) ((i)<<2 | T_CAM) /* Camera #i */ #define NOID ((0)<<2 | T_NONE) #define ID(type,i) ((i)<<2 | type) #define ISGEOM(id) (((id) & 3) == T_GEOM) #define ISCAM(id) (((id) & 3) == T_CAM) #define ISTYPE(type,id) (((id) & 3) == type) #define TYPEOF(id) ((id) & 3) #define INDEXOF(id) ((id) >> 2) #define ALLINDEX -1 #define WORLDGEOM GEOMID(0) #define FOCUSID CAMID(-4) /* these are not necessarily geoms! */ #define TARGETID GEOMID(-5) /* "current target" */ #define CENTERID GEOMID(-8) /* "current center" */ #define TARGETGEOMID GEOMID(-6) /* "current target geom" */ #define TARGETCAMID CAMID(-7) /* "current target cam" */ #define DEFAULTCAMID CAMID(-5) #define SELF GEOMID(-9) /* "this geomview object" */ #define UNIVERSE GEOMID(-10) /* the universe (as coordinate system) */ #define PRIMITIVE GEOMID(-11) /* this picked OOGL primitive (coord system) */ #define BBOXCENTERID GEOMID(-12) /* center of bbox object */ #define ALLCAMS CAMID(ALLINDEX) #define ALLGEOMS GEOMID(ALLINDEX) typedef enum { DRAWER_NOKEYWORD = 1, DRAWER_NEAR, DRAWER_FAR, DRAWER_FOV, DRAWER_FOCALLENGTH, DRAWER_KA, DRAWER_KS, DRAWER_KD, DRAWER_SHININESS, DRAWER_NORMSCALE, DRAWER_LIGHT_INTENSITY, DRAWER_LINE_ZNUDGE, DRAWER_FACEDRAW, DRAWER_EDGEDRAW, DRAWER_VECTDRAW, DRAWER_NORMALDRAW, DRAWER_TEXTUREDRAW, DRAWER_TEXTUREQUAL, DRAWER_SHADELINES, DRAWER_CONCAVE, DRAWER_BACKCULL, DRAWER_SHADING, DRAWER_LINEWIDTH, DRAWER_PERSPECTIVE, DRAWER_EVERT, DRAWER_BBOXDRAW, DRAWER_NORMALIZATION, DRAWER_SAVE, DRAWER_PROJECTION, DRAWER_BEZDICE, DRAWER_CAMERADRAW, DRAWER_PICKABLE, DRAWER_HSPHERE, DRAWER_DOUBLEBUFFER, DRAWER_APOVERRIDE, DRAWER_DIFFUSE, DRAWER_EDGECOLOR, DRAWER_NORMALCOLOR, DRAWER_BBOXCOLOR, DRAWER_BACKCOLOR, DRAWER_LIGHTCOLOR, DRAWER_TRANSLUCENCY, DRAWER_ALPHA, DRAWER_INERTIA, DRAWER_CONSTRAIN, DRAWER_OWNMOTION } DrawerKeyword; extern DView ** dview; extern DGeom ** dgeom; extern DrawerState drawerstate; extern int dgeom_max; extern int dview_max; extern TransformStruct ts_identity; DObject * drawer_get_object( int id );/* Get DObject * for object 'id' */ DObject * drawer_next_object( int id, int *indexp, int type ); DObject *drawer_next_bcast( int id, int *indexp, int type ); Appearance * drawer_get_ap( int id ); /* Get net appearance for DGeom 'id' */ void drawer_make_bbox(DGeom *dg, bool combine); int drawer_geom_count(); int drawer_cam_count(); int drawer_idbyctx( mgcontext *ctx ); bool drawer_moving(); /* is anything (DGeom, DView) moving? */ int drawer_idbyname(char *name); char *drawer_id2name(int id); int drawer_name2metaid(char *name); int drawer_objok(int id, int type); int drawer_pick( int id, int x, int y, Pick *pick); void drawer_init(char *apdefault, char *camgeometry, char *windefault); void drawer_merge_baseap( ApStruct *as ); void drawer_merge_camera( int id, Camera *cam ); void drawer_merge_window( int id, WnWindow *win ); void drawer_name_object(int id, int ni, char *name); void drawer_updateproc(int id, PFI func); void drawer_center(int id); void drawer_stop(int id); void drawer_pause(int pause); void drawer_set_window(int id, WnWindow *win); void drawer_snap_window(int id, char *fname); void drawer_init_dgeom(DGeom *dg, int id, enum citizenship citizenship); void drawer_nuke_world(); void drawer_nuke_cameras(int keepzero); void drawer_get_transform(int id, Transform T, int cumulative); TransformN *drawer_get_ND_transform(int from_id, int to_id); TransformN *drawer_ND_CamView(DView *dv, TransformN *TN); int drawer_idmatch(int id1, int id2); mgshadefunc softshader(int camid); NDstuff *drawer_init_ndstuff(DView *dv, TransformN *W2C, TransformN *W2U); void drawer_destroy_ndstuff(NDstuff *nds); void drawer_transform_ndstuff(NDstuff *nds, TransformN *T); void drawer_float(int id, DrawerKeyword key, float fval); /* key = DRAWER_NEAR, DRAWER_FAR, DRAWER_KA, DRAWER_KS, DRAWER_KD, DRAWER_SHININESS, DRAWER_NORMSCALE, DRAWER_LIGHT_INTENSITY */ void drawer_int(int id, DrawerKeyword key, int ival); /* key = DRAWER_FACEDRAW, DRAWER_EDGEDRAW, DRAWER_NORMALDRAW, DRAWER_SHADING, DRAWER_LINEWIDTH, DRAWER_PERSPECTIVE, DRAWER_EVERT, DRAWER_BEZDICE, DRAWER_NORMALIZATION, DRAWER_CAMERADRAW */ void drawer_color(int id, DrawerKeyword key, Color *col); /* key = DRAWER_DIFFUSE, DRAWER_EDGECOLOR, DRAWER_NORMALCOLOR, DRAWER_BBOXCOLOR, DRAWER_BACKCOLOR */ float scaleof(int id); int spaceof(int id); extern Keyword hmodelkeyword(char *s, HModelValue val); void drawer_set_ap(int id, Handle *h, Appearance *ap); #ifdef MANIFOLD int drawer_read_manifold(char *file); #endif /* MANIFOLD */ #endif /* ! _DRAWER_H_ */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/event.c0000644000175000017500000011654512310110177016234 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include #include #include #include "mg.h" #include "drawer.h" #include "event.h" #include "lang.h" #include "ui.h" #include "comm.h" #include "pickP.h" #include "transform.h" #include "streampool.h" #include "lights.h" #include "mouse.h" #include "rman.h" #define DOUBLECLICKTIME 333 /* millisecs between double clicks */ EventState estate; /* External motion state */ struct button button; /* Shift, etc. button state */ void emit_pick(int pickedid, Pick *pick); static int view_pick( DView *dv, int x, int y, Pick *pick ); #define ESC '\033' struct num { int has; /* 0 if no number, or -1 (negative) or +1 (positive) */ int val; int expon; } number, onum; static int keyshorts = 1; static int pickon = 1; static int prefixid = NOID; static float getreal(float defaultvalue); static int getint(int defaultvalue); /*static int toggle(int val);*/ static void tog_ap_flag(int id, int flagbit); static int retarget(int defaultid); #define SEQ(prefix, ch) ((prefix)<<8 | (ch)) static enum { KEYGEOM=0, KEYCAM=1, KEYNONE=2 } keymode = KEYNONE; static int prefix = 0; static char Help[] = "\ Keyboard commands apply while cursor is in any graphics window and most \n\ control panels. Most commands allow one of the following selection prefixes \n\ (if none is provided the command applies to the current object): \n\ g world geom g# #'th geom g* All geoms\n\ c current camera c# #'th camera c* All cameras\n\ Many allow a numeric prefix: if none they toggle or reset current value.\n\ Appearance:\n\ Draw: Shading: Other:\n\ af Faces 0as Constant av eVert normals: always face viewer\n\ ae Edges 1as Flat #aw Line Width (pixels)\n\ an Normals 2as Smooth #ac edges Closer than faces(try 5-100)\n\ ab Bounding Boxes 3as Smooth, non-lighted al Shade lines\n\ aV Vectors aT allow transparency at Texture-mapping\n\ Color: aC allow concave polygons aq Texture quality\n\ Cf Ce Cn Cb CB face/edge/normal/bbox/backgnd\n\ Motions: Viewing:\n\ r rotate [ Leftmouse=X-Y plane, 0vp Orthographic view\n" #ifdef NeXT " t translate Alt-Left=Z axis, 1vp Perspective view\n" #else " t translate Middle=Z axis, 1vp Perspective view\n" #endif " z zoom FOV Shift=slow motion, vd Draw other views' cameras\n\ f fly in r/t modes. ] #vv field of View\n\ o orbit [Left=steer, Middle=speed ] #vn near clip distance\n\ s scale #vf far clip distance\n\ w/W recenter/all v+ add new camera\n\ h/H halt/halt all vx cursor on/off\n\ @ select center of motion (e.g. g3@) vb backfacing poly cull on/off\n\ #vl focal length\n\ L Look At object v~ Software shading on/off\n\ show Panel: Pm Pa Pl Po main/appearance/lighting/obscure\n\ Pt Pc PC Pf tools/cameras/Commands/file-browser\n\ Ps P- saving/read commands from tty\n\ Lights: ls le Show lights / Edit Lights\n\ Metric: me mh ms Euclidean Hyperbolic Spherical\n\ Model: mv mp mc Virtual Projective Conformal\n\ Other:\n\ N normalization < Pf load geom/command file\n\ 0N none > Ps save something to file ui motion has inertia\n\ 1N each TV NTSC mode toggle uc constrained (X/Y) motion\n\ 2N all uo motion in Own coord system\n\ Rightmouse-doubleclick pick as current target object\n\ Shift-Rightmouse pick interest (center) point\n" #ifdef NeXT " Alt-Leftmouse is synonym for Rightmouse.\n" #endif ; void print_help() { printf("\n%s", Help); rman_do('?', 0,0); fflush(stdout); } void event_init() { estate.motionproc = NULL; } LDEFINE(event_mode, LVOID, "(event-mode MODESTRING)\n\ Set the mouse event (motion) mode; MODESTRING should be one of\n\ the strings that appears in the motion mode browser (including\n\ the keyboard shortcut, e.g. \"[r] Rotate\").") { static Event ev_enter = { EMODEENTER, 0, 0, 0, 0 }; static Event ev_exit = { EMODEEXIT, 0, 0, 0, 0 }; char *modename; LDECLARE(("event-mode", LBEGIN, LSTRING, &modename, LEND)); if ( estate.motionproc != NULL ) { estate.motionproc(&ev_exit); } estate.motionproc = uistate.modes[uistate.mode_current = ui_mode_index(modename) ]; D1PRINT(("gv_event_mode: estate.motionproc <- %1x\n", estate.motionproc)); ui_event_mode( modename ); if ( estate.motionproc != NULL ) { estate.motionproc(&ev_enter); } return Lt; } /* * Report time elapsed since the epoch (or since the program began if * since == NULL). Possibly remember the current time in "nextepoch". * Time is measured in floating-point seconds. */ float elapsed(float *since, float *nextepoch) { static struct timeval t0 = { 0, 0 }; struct timeval tnow; float now = 0; float sincetime = 0; gettimeofday(&tnow, NULL); if(t0.tv_sec == 0) { t0 = tnow; tnow.tv_usec++; } now = tnow.tv_sec - t0.tv_sec + 1e-6*(tnow.tv_usec - t0.tv_usec); if(since) { if((sincetime = *since) == 0) sincetime = *since = now; } if(nextepoch) *nextepoch = now; return now - sincetime; } LDEFINE(pick_invisible, LVOID, "(pick-invisible [yes|no])\n\ Selects whether picks should be sensitive to objects whose appearance\n\ makes them invisible; default yes.\n\ With no arguments, returns current status.") { Keyword kw = NOT_A_KEYWORD; LDECLARE(("pick-invisible", LBEGIN, LOPTIONAL, LKEYWORD, &kw, LEND)); if(kw == NOT_A_KEYWORD) { return uistate.pick_invisible ? Lt : Lnil; } uistate.pick_invisible = boolval("pick_invisible", kw); return Lt; } LDEFINE(rawevent, LVOID, "(rawevent dev val x y t)\n\ Enter the specified raw event into the event queue. The\n\ arguments directly specify the members of the event structure\n\ used internally by geomview. This is the lowest level event\n\ handler and is not intended for general use.") /* This used to be dispatch_event(). */ { int id; int apfl; DrawerKeyword k; int err = 0; float v; Appearance *ap; DView *dv; DGeom *dg; char *s; Event event; LDECLARE(("rawevent", LBEGIN, LINT, &event.dev, LINT, &event.val, LINT, &event.x, LINT, &event.y, LLONG, &event.t, LEND)); PRINT_EVENT(("in gv_rawevent", &event)); /* * Call the current motion proc, if any. This proc returns 1 if it * used the event, in which case we don't do any further processing. */ D1PRINT(("gv_rawevent: estate.motionproc = %x\n", estate.motionproc)); if ( estate.motionproc != NULL ) { D1PRINT(("gv_rawevent: calling estate.motionproc\n")); if ( estate.motionproc(&event) ) { D1PRINT(("gv_rawevent: returning Lt\n")); return Lt; } D1PRINT(("gv_rawevent: falling through\n")); } /* The rightmouse and doubleclick is now hardcoded but should be bindable through lang later, through a control mechanism similar to current motionproc stuff */ if (event.dev == ERIGHTMOUSE) { if ((event.val > 0) && pickon) { static unsigned long int lastt = 0; Pick *pick = PickSet(NULL, PA_WANT, uistate.pick_invisible ? PW_EDGE|PW_VERT|PW_FACE : PW_VISIBLE|PW_EDGE|PW_VERT|PW_FACE, PA_END); int pickedid = view_pick( (DView *)drawer_get_object(FOCUSID), event.x, event.y, pick ); if(button.shift) { /* Could change FOCUSID here to ALLCAMS, * to force setting everyone's focal length to * their distance from the pick. */ if(pickedid != NOID) make_center_from_pick("CENTER", pick, FOCUSID); else gv_ui_center(TARGETID); } else { if(pickedid != NOID) emit_pick(pickedid, pick); if (event.t - lastt < DOUBLECLICKTIME) { lastt = 0; gv_ui_target( pickedid!=NOID ? pickedid : WORLDGEOM, IMMEDIATE ); } } PickDelete(pick); lastt = event.t; } } if(!isascii(event.dev)) return Lt; if (!keyshorts) /* are keyboard shortcuts on? :-) */ return Lt; /* no? then we don't want to process them... */ /* Only keyboard events from here on down */ ui_keyboard(event.dev); if(event.dev >= '0' && event.dev <= '9') { if(!number.has) { number.val = 0; number.has = 1; } number.val = 10*number.val + (event.dev - '0'); if(number.expon) number.expon++; prefix = 0; } else { id = GEOMID(uistate.targetgeom); rescan: switch(SEQ(prefix, event.dev)) { case '-': case '*': number.has = -1; number.expon = 0; number.val = 0; prefix = 0; goto keepmode; case '.': number.expon = 1; prefix = 0; goto keepmode; case 'g': keymode = KEYGEOM; goto gotmode; /* Select geom: 'g' prefix */ case 'c': keymode = KEYCAM; goto gotmode; /* Select camera: 'c' prefix */ gotmode: onum = number; number.has = 0; prefix = 0; goto keepmode; case 'p': { int id; if (pickon) { if (keymode == KEYNONE) { id = gv_rawpick(FOCUSID, event.x, event.y); if (id == NOID) id = WORLDGEOM; } else { id = retarget(NOID); } gv_ui_target(id, IMMEDIATE); } } case '@': gv_ui_center(retarget(uistate.centerid)); break; case 'N': id = retarget(GEOMID(uistate.targetgeom)); if(!number.has) { dg = (DGeom *)drawer_get_object(id); if(dg) number.val = dg->normalization == NONE ? EACH : NONE; } drawer_int(id, DRAWER_NORMALIZATION, number.val); break; case '<': s = "Load"; number.val = 1; goto pickpanel; /* Load file */ case '>': s = "Save"; number.val = 1; goto pickpanel; /* Save State */ /* use bounding box center as CENTER position */ case 'B': gv_ui_center_origin(uistate.bbox_center ? ORIGIN_KEYWORD : BBOX_CENTER_KEYWORD); break; /* Halt current object */ case 'h': drawer_stop(retarget(uistate.targetid)); break; case 'H': /* Halt Everything */ drawer_stop(NOID); break; case 'w': /* Recenter current thing */ drawer_center(retarget(uistate.targetid)); break; case 'W': /* Recenter (and halt) Everything */ drawer_center(NOID); break; case 'L': gv_look(retarget(uistate.targetid),FOCUSID); break; /* * r/t/z/f/o apply to the currently selected object unless target specified. */ case 'f': s = OBJFLY; goto mote; case 'o': s = OBJORBIT; goto mote; case 'r': s = OBJROTATE; goto mote; case 't': s = OBJTRANSLATE; goto mote; case 'z': s = OBJZOOM; goto mote; case 's': s = OBJSCALE; goto mote; mote: id = retarget(NOID); if (id) gv_ui_target( id, IMMEDIATE); gv_event_mode( s ); break; case '?': print_help(); break; #ifdef sgi case 'T': /* NTSC */ #endif case 'v': /* view-related prefix */ case 'a': /* appearance-related prefix */ case 'm': /* metric (euclidean/hyperbolic/spherical) */ case 'l': /* light-related prefix */ case 'd': /* delete */ case 'R': /* renderman */ case 'C': /* color-pick */ case 'P': /* panel show */ case 'u': /* motion style */ case ESC: /* quit prefix */ if(keymode != KEYNONE) { prefixid = retarget(NOID); if(ISGEOM(prefixid)) gv_ui_target( prefixid, IMMEDIATE); } prefix = event.dev; goto keepnumber; case SEQ('P','m'): case SEQ('P','g'): s = "main"; goto pickpanel; case SEQ('P','a'): s = "Appearance"; goto pickpanel; case SEQ('P','o'): s = "Obscure"; goto pickpanel; case SEQ('P','l'): s = "Lighting"; goto pickpanel; case SEQ('P','C'): s = "Command"; goto pickpanel; case SEQ('P','c'): s = "Camera"; goto pickpanel; case SEQ('P','t'): s = "Tools"; goto pickpanel; case SEQ('P','f'): s = "Files"; goto pickpanel; case SEQ('P','s'): s = "Save"; goto pickpanel; case SEQ('P','M'): s = "Materials"; goto pickpanel; case SEQ('P','A'): s = "Credits"; goto pickpanel; pickpanel: ui_showpanel(ui_name2panel(s), getint(-1)); break; case SEQ('P','P'): ui_manual_browser("pdf"); break; case SEQ('P','H'): ui_manual_browser("html"); break; case SEQ('P','-'): comm_object("(read command < -)", &CommandOps, NULL, NULL, COMM_LATER); break; case SEQ(ESC,ESC): gv_exit(); /*NOTREACHED*/ case SEQ('C','f'): k = DRAWER_DIFFUSE; goto pickcolor; case SEQ('C','e'): k = DRAWER_EDGECOLOR; goto pickcolor; case SEQ('C','n'): k = DRAWER_NORMALCOLOR; goto pickcolor; case SEQ('C','b'): k = DRAWER_BBOXCOLOR; goto pickcolor; case SEQ('C','v'): case SEQ('C','B'): k = DRAWER_BACKCOLOR; goto pickcolor; pickcolor: ui_pickcolor( k ); break; case SEQ('u','i'): k = DRAWER_INERTIA; goto motstyle; case SEQ('u','c'): k = DRAWER_CONSTRAIN; goto motstyle; case SEQ('u','o'): k = DRAWER_OWNMOTION; motstyle: drawer_int( WORLDGEOM, k, getint(-1) ); break; case SEQ('v','+'): /* Add camera */ { CameraStruct cs; id = retarget(FOCUSID); dv = ISCAM(id) ? (DView *)drawer_get_object(id) : NULL; cs.h = NULL; cs.cam = dv && dv->cam ? CamCopy(dv->cam, NULL) : NULL; gv_new_camera(NULL, &cs); } break; case SEQ('v','p'): /* Projection: orthographic or perspective */ id = retarget(FOCUSID); if(!number.has) { dv = (DView *)drawer_get_object(id); if(dv) CamGet(dv->cam, CAM_PERSPECTIVE, &number.val); number.val = !number.val; } drawer_int( id, DRAWER_PROJECTION, number.val ); break; case SEQ('v','d'): /* toggle "Draw other cameras" */ id = retarget(FOCUSID); if(!number.has) { dv = (DView *)drawer_get_object(id); number.val = dv ? !dv->cameradraw : true; } drawer_int( id, DRAWER_CAMERADRAW, number.val ); break; case SEQ('v','D'): /* Toggle dithering */ id = retarget(FOCUSID); gv_dither(id, TOGGLE_KEYWORD); break; /* stuff for X11 version */ case SEQ('v','h'): /* pick hidden surface removal method: */ id = retarget(FOCUSID); dv = (DView *)drawer_get_object(id); if(dv == NULL || dv->mgctx == NULL) break; if (!number.has) { mgctxselect(dv->mgctx); mgctxget(MG_DEPTHSORT, &number.val); number.val = (number.val+1) % 3; } mgctxset(MG_DEPTHSORT, number.val>=0&&number.val<=2 ? number.val : 2, MG_END); gv_redraw(dv->id); ui_maybe_refresh(dv->id); break; /* end of stuff for X11 version */ case SEQ('v','x'): /* Toggle/enable/disable cursor */ ui_curson( number.has ? number.val : -1 ); break; case SEQ('v','b'): tog_ap_flag( id, APF_BACKCULL ); break; case SEQ('v','s'): id = retarget(FOCUSID); number.val = !number.val; /* "1vs" => single-buffered */ drawer_int( id, DRAWER_DOUBLEBUFFER, getint(-1) ); break; /* For testing software shading */ case SEQ('v','~'): id = retarget(FOCUSID); gv_soft_shader(id, number.has ? (number.val?ON_KEYWORD:OFF_KEYWORD) : TOGGLE_KEYWORD); break; /* Viewing options */ case SEQ('a','c'): case SEQ('v','c'): k = DRAWER_LINE_ZNUDGE; v = 10.; goto setcam; case SEQ('v','v'): k = DRAWER_FOV; v = 45.; goto setcam; case SEQ('v','n'): k = DRAWER_NEAR; v = .1; goto setcam; case SEQ('v','f'): k = DRAWER_FAR; v = 100.; goto setcam; case SEQ('v','l'): k = DRAWER_FOCALLENGTH; v = 3.; goto setcam; setcam: drawer_float( retarget(FOCUSID), k, getreal(v) ); break; /* Might add others here, e.g. a viewfinder mode. */ /* Metrics / Models */ case SEQ('m','e'): gv_space(EUCLIDEAN_KEYWORD); break; case SEQ('m','h'): gv_space(HYPERBOLIC_KEYWORD); break; case SEQ('m','s'): gv_space(SPHERICAL_KEYWORD); break; case SEQ('m','v'): gv_hmodel(retarget(FOCUSID), VIRTUAL_KEYWORD); break; case SEQ('m','p'): gv_hmodel(retarget(FOCUSID), PROJECTIVE_KEYWORD); break; case SEQ('m','c'): gv_hmodel(retarget(FOCUSID), CONFORMALBALL_KEYWORD); break; /* Appearance settings */ case SEQ('a','f'): apfl = APF_FACEDRAW; goto togapflag; case SEQ('a','e'): apfl = APF_EDGEDRAW; goto togapflag; case SEQ('a','l'): apfl = APF_SHADELINES; goto togapflag; case SEQ('a','n'): apfl = APF_NORMALDRAW; goto togapflag; case SEQ('a','v'): apfl = APF_EVERT; goto togapflag; case SEQ('a','t'): apfl = APF_TEXTURE; goto togapflag; case SEQ('a','T'): apfl = APF_TRANSP; goto togapflag; case SEQ('a','V'): apfl = APF_VECTDRAW; goto togapflag; case SEQ('a','C'): apfl = APF_CONCAVE; goto togapflag; case SEQ('a','q'): apfl = APF_TXMIPMAP|APF_TXMIPINTERP|APF_TXLINEAR; goto togapflag; togapflag: tog_ap_flag( id, apfl ); break; case SEQ('a','x'): drawer_set_ap( id, NULL, NULL ); break; case SEQ('a','o'): gv_ap_override( getint( !uistate.apoverride ) ); break; case SEQ('a','b'): /* Bounding box drawing */ if(!number.has) { DGeom *dg = (DGeom *)drawer_get_object( id ); if(dg) number.val = !dg->bboxdraw; } drawer_int(id, DRAWER_BBOXDRAW, number.val); break; case SEQ('a','s'): /* Shading */ if(!number.has) { ap = drawer_get_ap(id); ApGet(ap, AP_SHADING, &number.val); ApDelete(ap); number.val++; } drawer_int(id, DRAWER_SHADING, number.val % 5); break; case SEQ('a','w'): /* line width */ if(!number.has) { ap = drawer_get_ap(id); ApGet(ap, AP_LINEWIDTH, &number.val); ApDelete(ap); number.val = (number.val > 1) ? 1 : 2; } drawer_int(id, DRAWER_LINEWIDTH, number.val); break; /* Scale normals */ case SEQ('a','h'): drawer_float(id, DRAWER_NORMSCALE, getreal(1.0)); break; /* Patch dicing */ case SEQ('a','d'): drawer_int( id, DRAWER_BEZDICE, number.val ); break; /* hyperbolic sphere at infinity */ case SEQ('a', 'i'): drawer_int( retarget(FOCUSID), DRAWER_HSPHERE, getint(-1) ); break; /* Delete */ case SEQ('d','d'): gv_delete(uistate.targetid); break; /* NTSC */ #ifdef sgi case SEQ('T','V'): ntsc(getint(-1)); break; #endif /* Timing -- ctrl-T * ^T : print accumulated timing status now * ^T : print timing status now and every main-loop cycles * -^T : quit timing */ case 'T'&0x1f: timing( number.has<0 ? 0 : number.has ? number.val : 9999999 ); break; /* Edit Lights */ case SEQ('l','e'): if (!(uistate.lights_shown)) light_edit_mode(1); else gv_event_mode( LIGHTEDIT ); break; /* Toggle Show Lights */ case SEQ('l','s'): light_edit_mode(2); break; /* * All R* commands moved to rman.c - slevy. */ default: err = EOF; if(prefix == 'R') { rman_do(event.dev,number.has,number.val); break; } else if(prefix != 0) { /* No such command? */ prefix = 0; goto rescan; /* Try same char without prefix */ } keymode = KEYNONE; } number.has = number.expon = onum.has = onum.expon = 0; prefix = 0; prefixid = NOID; ui_keyboard(err); /* 0 = OK, EOF = -1 = error */ keepnumber: keymode = KEYNONE; keepmode: ; } return Lt; } /* * Interpret a g[N] or c[N] prefix; return the id. */ static int retarget(int defindex) { int t; static int allid[2] = { ALLGEOMS, ALLCAMS }; static char ch[2] = { 'g', 'c' }; char code[12]; if(keymode == KEYNONE) { if(number.expon && !number.has) { /* a "." prefix, sans number */ number.expon = 0; return TARGETID; } return prefixid != NOID ? prefixid : defindex; /* No prefix, or just numeric */ } sprintf(code, "%c%d", ch[keymode], number.val); if(number.has > 0) t = drawer_idbyname(code); else if(number.has < 0) t = allid[keymode]; else t = (keymode == KEYGEOM) ? WORLDGEOM : FOCUSID; number = onum; onum.has = onum.expon = 0; keymode = KEYNONE; return t; } /* Return current number if any; otherwise return given default value. */ static float getreal(float defval) { float v = number.has * number.val; if(!number.has) return defval; while(--number.expon > 0) v *= 0.1; return v; } static int getint(int defaultvalue) { return number.has ? number.val*number.has : defaultvalue; } #if 0 static int toggle(int val) { return number.has ? (number.has = number.expon = 0, number.val) : !val; } #endif static void tog_ap_flag( int id, int flagbit ) { ApStruct as; int val; memset(&as, 0, sizeof(as)); if(number.has) { val = number.val; } else { as.ap = drawer_get_ap(id); val = as.ap ? !(as.ap->flag & flagbit) : 1; } as.ap = ApCreate(val ? AP_DO : AP_DONT, flagbit, AP_OVERRIDE, uistate.apoverride & flagbit, AP_END); gv_merge_ap(id, &as); ApDelete(as.ap); } /* NB - I've put in a total hack to avoid calling gvpick more than * once - I think it's pretty stable (so when it stays in for years * and years it might(?) keep working!) -cf 10/29/92 */ static int view_pick( DView *dv, int x, int y, Pick *pick ) { Transform V, T, Tnet, Tt, Tmodel, Tnorm, oldTw, Tworld; int i; int chosen = NOID; float xpick, ypick; DGeom *dg; Appearance *ap; WnPosition wp; if(dv == NULL) return NOID; if(dv->stereo == NO_KEYWORD) { wp = drawerstate.winpos; mousemap(x, y, &xpick, &ypick, &wp); } else { /* Map screen -> view position in a stereo window. */ for(i = 0; i < 2; i++) { wp.xmin = drawerstate.winpos.xmin + dv->vp[i].xmin; wp.xmax = wp.xmin + dv->vp[i].xmax - dv->vp[i].xmin; wp.ymin = drawerstate.winpos.ymin + dv->vp[i].ymin; wp.ymax = wp.ymin + dv->vp[i].ymax - dv->vp[i].ymin; mousemap(x, y, &xpick, &ypick, &wp); if(fabs(xpick) <= 1 && fabs(ypick) <= 1) break; } } { /* Hacks for setting up transforms so INST ... location / origin works. * This'll be unnecessary if we switch over to using an mg "pick" device. * slevy 96.10.26. */ Transform Tc2n, Tw2n, Ts2n; CamViewProjection( dv->cam, Tc2n ); CamView( dv->cam, Tw2n ); TmTranslate(Ts2n, -1.0, -1.0, 0.0); CtmScale(Ts2n, 2.0/(wp.xmax-wp.xmin+1), 2.0/(wp.ymax-wp.ymin+1), 1.0); PickSet( pick, PA_TC2N, Tc2n, PA_TW2N, Tw2n, PA_TS2N, Ts2n, PA_END ); } if (drawerstate.NDim > 0) { TransformN *V, *W, *Tnet, *Tmodel, *Tworld; V = drawer_ND_CamView(dv, NULL); if (dv->Item != drawerstate.universe) { /* Picking in a window with a dedicated Scene */ /* We yield results in the Scene's coordinate system */ if (GeomMousePick(dv->Item, pick, (Appearance *)NULL, NULL, V, dv->NDPerm, xpick, ypick)) { chosen = dv->id; } return chosen; } /* Picking in the real world */ Tworld = drawer_get_ND_transform(WORLDGEOM, UNIVERSE); TmNConcat(Tworld, V, V); /* world -> screen */ TmNDelete(Tworld); /* Now V contains the world -> screen projection */ LOOPSOMEGEOMS(i,dg,ORDINARY) { if (dg->pickable) { Geom *g = NULL; int id = GEOMID(i); if (dg->Lgeom) { Tmodel = drawer_get_ND_transform(id, WORLDGEOM); Tnet = TmNConcat(Tmodel, V, NULL); /* Now Tnet geom -> screen */ GeomGet(dg->Lgeom, CR_GEOM, &g); ap = drawer_get_ap(dg->id); if (GeomMousePick(g, pick, ap, NULL, Tnet, dv->NDPerm, xpick, ypick)) { chosen = id; /* Arrange for things to be in world coords not Dgeom coords. */ pick->TwN = TmNConcat(pick->TwN, Tmodel, pick->TwN); W = drawer_get_ND_transform(WORLDGEOM, id); pick->TselfN = TmNConcat(pick->TwN, W, pick->TselfN); TmNDelete(W); } TmNDelete(Tmodel); TmNDelete(Tnet); ApDelete(ap); } } } TmNDelete(V); return chosen; } CamView( dv->cam, V ); /* V = camera-to-screen matrix * cH: wrong. V = universe-to-screen matrix */ if(dv->Item != drawerstate.universe) { /* Picking in a window with a dedicated Scene */ /* We yield results in the Scene's coordinate system */ /* Is this really correct? Why should we call GeomPosition() here? * dv->Item is just a normal geometry, only by chance a * single-element INST. */ #if 0 GeomPosition( dv->Item, T ); TmConcat(T,V, T); /* T = Scene to screen projection */ if(GeomMousePick( dv->Item, pick, (Appearance *)NULL, T, xpick, ypick )) { chosen = dv->id; } #else if (GeomMousePick( dv->Item, pick, (Appearance *)NULL, V, NULL, NULL, xpick, ypick )) { chosen = dv->id; } #endif return chosen; } /* Picking in the real world */ GeomPosition(drawerstate.world, Tworld); /* world -> universe */ TmConcat(Tworld, V, T); /* world -> screen */ /* * We now assume the complete screen -> DGeom transform is in T. * This is true only if we have just a single level of DGeom's in the world. * * cH: this is wrong, T is the World -> screen projection, not the * other way round. (Transforms operate from the right!). */ LOOPSOMEGEOMS(i,dg,ORDINARY) { if (dg->pickable) { Geom *g = NULL; int id = GEOMID(i); if (dg->Lgeom) { GeomPosition( dg->Item, Tmodel ); GeomPosition( dg->Inorm, Tnorm ); TmConcat( Tnorm, Tmodel, Tt ); TmConcat( Tt, T, Tnet ); /* Now Tnet = complete geom-to-screen proj'n */ GeomGet( dg->Lgeom, CR_GEOM, &g ); ap = drawer_get_ap(dg->id); if (GeomMousePick( g, pick, ap, Tnet, NULL, NULL, xpick, ypick )) { chosen = id; /* We remember oldTw to print out info below for debugging only */ TmCopy(pick->Tw, oldTw); /* This is necessary! Arranges for things to be in world * coords not Dgeom coords. Tt is the dgeom-to-world * transform, Tw is (more or less) screen -> dgeom */ TmConcat(pick->Tw, Tt, pick->Tw); drawer_get_transform(WORLDGEOM, pick->Tself, id); TmConcat(pick->Tw, pick->Tself, pick->Tself); } ApDelete(ap); } } } /* Ok, everything below is just debugging stuff */ if (chosen == NOID) { /* printf("Picked nothing.\n"); */ } else { /* printf("Picked dgeom #%d\n", INDEXOF(chosen)); */ /* pick->got is in mouse coords. wgot is world coords. old world is really dgeom coords. (maybe...) got is raw object coords. (the kind of numbers in geom data file!) */ if (pick && getenv("VERBOSE_PICK")) { Point3 got, v, e[2], wgot, wv, we[2], owgot, owv, owe[2]; Pt3Transform(pick->Tmirp, &(pick->got), &got); Pt3Transform(pick->Tw, &(pick->got), &wgot); Pt3Transform(oldTw, &(pick->got), &owgot); printf("pick->\n"); printf(" got = (%f %f %f)\n", pick->got.x, pick->got.y, pick->got.z); if (pick->found&PW_VERT) printf(" v = (%f %f %f)\n", pick->v.x, pick->v.y, pick->v.z); if (pick->found&PW_EDGE) { printf(" e[0] = (%f %f %f)\n", pick->e[0].x, pick->e[0].y, pick->e[0].z); printf(" e[1] = (%f %f %f)\n", pick->e[1].x, pick->e[1].y, pick->e[1].z); } printf("Transformed pick [raw]->\n"); printf(" got = (%f %f %f)\n", got.x, got.y, got.z); if (pick->found&PW_VERT) { HPt3TransPt3(pick->Tmirp, &(pick->v), &v); printf(" v = (%f %f %f)\n", v.x, v.y, v.z); } if (pick->found&PW_EDGE) { HPt3TransPt3(pick->Tmirp, &(pick->e[0]), &(e[0])); HPt3TransPt3(pick->Tmirp, &(pick->e[1]), &(e[1])); printf(" e[0] = (%f %f %f)\n", e[0].x, e[0].y, e[0].z); printf(" e[1] = (%f %f %f)\n", e[1].x, e[1].y, e[1].z); } printf("Transformed pick [old world]->\n"); printf(" got = (%f %f %f)\n", owgot.x, owgot.y, owgot.z); if (pick->found&PW_VERT) { HPt3TransPt3(oldTw, &(pick->v), &owv); printf(" v = (%f %f %f)\n", owv.x, owv.y, owv.z); } if (pick->found&PW_EDGE) { HPt3TransPt3(oldTw, &(pick->e[0]), &(owe[0])); HPt3TransPt3(oldTw, &(pick->e[1]), &(owe[1])); printf(" e[0] = (%f %f %f)\n", owe[0].x, owe[0].y, owe[0].z); printf(" e[1] = (%f %f %f)\n", owe[1].x, owe[1].y, owe[1].z); printf("Transformed pick [world]->\n"); printf(" got = (%f %f %f)\n", wgot.x, wgot.y, wgot.z); if (pick->found&PW_VERT) { HPt3TransPt3(pick->Tw, &(pick->v), &wv); printf(" v = (%f %f %f)\n", wv.x, wv.y, wv.z); } if (pick->found&PW_EDGE) { HPt3TransPt3(pick->Tw, &(pick->e[0]), &(we[0])); HPt3TransPt3(pick->Tw, &(pick->e[1]), &(we[1])); printf(" e[0] = (%f %f %f)\n", we[0].x, we[0].y, we[0].z); printf(" e[1] = (%f %f %f)\n", we[1].x, we[1].y, we[1].z); } } } } return chosen; } LDEFINE(rawpick, LINT, "(rawpick CAMID X Y)\n\ Process a pick event in camera CAMID at location (X,Y) given in\n\ integer pixel coordinates. This is a low-level procedure not\n\ intended for external use.") { int pickedid, id, x, y; Pick *pick; LDECLARE(("rawpick", LBEGIN, LID, &id, LINT, &x, LINT, &y, LEND)); if (TYPEOF(id) != T_CAM) { fprintf(stderr, "rawpick: first arg must be a camera id\n"); return Lnil; } pick = PickSet(NULL, PA_WANT, PW_EDGE|PW_VERT|PW_FACE, PA_END); pickedid= view_pick( (DView *)drawer_get_object(id), x, y, pick ); if (pickedid != NOID) { emit_pick(pickedid, pick); } PickDelete(pick); return LNew(LINT, &pickedid); } void emit_pick(int pickedid, Pick *pick) { /* Variables for total hack */ vvec done; char donebits[512]; LInterest *interest = LInterestList("pick"); VVINIT(done, char, 128); if(interest) { vvuse(&done, donebits, COUNT(donebits)); vvzero(&done); } #define DONEID(id) *VVINDEX(done, char, id-CAMID(-20)) for ( ; interest != NULL; interest = interest->next) { int coordsysid; /* extract the coord system to use from the interest filter; if none given, use world */ if (interest->filter && interest->filter->car && (LFILTERVAL(interest->filter->car)->flag == VAL)) { if (!LFROMOBJ(LID)(LFILTERVAL(interest->filter->car)->value, &coordsysid)) { OOGLError(0,"emit_pick: bad coord sys filter type"); continue; } } else { coordsysid = WORLDGEOM; } if (drawerstate.NDim > 0) { /* In an ND-context, we report the 3d-quantities picked in the * 3d sub-space of the camera where the pick occurred. The * interested parties still have access to the ND-co-ordinates * by means of the vertex/edge/face indices. * * We use TmNMap() to map the 3d vertices to the full Nd-space. */ int dim = drawerstate.NDim; TransformN *T, *tmp; HPointN *got = NULL; HPointN *v = NULL; VARARRAY(e, HPtNCoord, 2*dim); VARARRAY(f, HPtNCoord, pick->found & PW_FACE ? pick->fn * dim : 0); int gn, vn, vi, en, ei[2], ein, fn, fi; /* T = transform converting to the coord system of coordsysid */ /* This section does the setup for the total hack */ /* Total hack gigantic if statement */ if (!DONEID(coordsysid)) { DONEID(coordsysid) = 1; switch(coordsysid) { case WORLDGEOM: T = TmNMap(pick->TwN, pick->axes, NULL); break; case PRIMITIVE: T = TmNMap(pick->TmirpN, pick->axes, NULL); break; case SELF: T = TmNMap(pick->TselfN, pick->axes, NULL); break; default: tmp = drawer_get_ND_transform(WORLDGEOM, coordsysid); T = TmNConcat(pick->TwN, tmp, NULL); TmNDelete(tmp); TmNMap(T, pick->axes, T); break; } if (pickedid != NOID) { HPoint3 gothpt4; Pt3ToHPt3(&pick->got, &gothpt4, 1); got = HPt3NTransform(T, &gothpt4, NULL); gn = got->dim; #if 1 { HPointN *gotn; gotn = HPt3ToHPtN(&gothpt4, pick->axes, NULL); HPtNTransform(pick->TwN, gotn, gotn); HPtNDelete(gotn); } #endif } else { got = NULL; gn = 0; } if (pick->found & PW_VERT) { v = HPt3NTransform(T, &pick->v, NULL); vn = v->dim; vi = pick->vi; } else { v = NULL; vn = 0; vi = -1; } if (pick->found & PW_EDGE) { HPointN tmp; tmp.dim = T->odim; tmp.flags = 0; tmp.v = e+0; HPt3NTransform(T, &pick->e[0], &tmp); tmp.v = e+dim; HPt3NTransform(T, &pick->e[1], &tmp); en = 2*dim; ei[0] = pick->ei[0]; ei[1] = pick->ei[1]; ein = 2; } else { en = 0; ein = 0; } if (pick->found & PW_FACE) { HPointN tmp; int i; tmp.dim = T->odim; tmp.flags = 0; for (i = 0; i < pick->fn; i++) { tmp.v = &f[i*dim]; HPt3NTransform(T, pick->f+i, &tmp); } fi = pick->fi; fn = pick->fn * dim; } else { fn = 0; fi = -1; } /* Cause of total hack. * This CANNOT be called once for every interested party - otherwise * every interested party will hear about it numerous times. */ gv_pick(coordsysid, pickedid, got ? got->v : NULL, gn, v ? v->v : NULL, vn, e, en, f, fn, VVEC(pick->gpath, int), VVCOUNT(pick->gpath), vi, ei, ein, fi); HPtNDelete(got); HPtNDelete(v); TmNDelete(T); } /* End of total hack if statement */ } else { /* T = transform converting to the coord system of coordsysid */ /* This section does the setup for the total hack */ Transform T; HPoint3 got; HPoint3 v, e[2]; HPoint3 *f; int gn, vn, vi, en, ei[2], ein, fn, fi; /* Total hack gigantic if statement */ if (!DONEID(coordsysid)) { DONEID(coordsysid) = 1; switch(coordsysid) { case WORLDGEOM: TmCopy(pick->Tw, T); break; case PRIMITIVE: TmCopy(pick->Tmirp, T); break; case SELF: TmCopy(pick->Tself, T); break; default: drawer_get_transform(WORLDGEOM, T, coordsysid); TmConcat(pick->Tw, T, T); break; } if (pickedid != NOID) { Pt3Transform(T, &pick->got, HPoint3Point3(&got)); got.w = 1; gn = 4; } else { gn = 0; } if (pick->found & PW_VERT) { HPt3Transform(T, &(pick->v), &v); vn = 4; vi = pick->vi; } else { vn = 0; vi = -1; } if (pick->found & PW_EDGE) { HPt3TransformN(T, pick->e, &e[0], 2); en = 8; ei[0] = pick->ei[0]; ei[1] = pick->ei[1]; ein = 2; } else { en = 0; ein = 0; } if (pick->found & PW_FACE) { f = OOGLNewNE(HPoint3, pick->fn, "rawpick"); HPt3TransformN(T, pick->f, f, pick->fn); fi = pick->fi; fn = pick->fn * 4; } else { f = NULL; fn = 0; fi = -1; } /* Cause of total hack. * This CANNOT be called once for every interested party - otherwise * every interested party will hear about it numerous times. */ gv_pick(coordsysid, pickedid, HPoint3Data(&got), gn, &v.x, vn, &e[0].x, en, (float *)f, fn, /* f, fn, */ VVEC(pick->gpath, int), VVCOUNT(pick->gpath), vi, ei, ein, fi); if (f != NULL) OOGLFree(f); } /* End of total hack if statement */ } /* End of 3d case */ } vvfree(&done); } LDEFINE(pick, LVOID, "(pick COORDSYS GEOMID G V E F P VI EI FI)\n" "The pick command is executed internally in response to pick\n" "events (right mouse double click).\n" "\n\n" "COORDSYS = coordinate system in which coordinates of the following\n" "arguments are specified. This can be:" "\n\n\tworld: world coord sys" "\n\n\tself: coord sys of the picked geom (GEOMID)" "\n\n\tprimitive: coord sys of the actual primitive within" "\n\n\t\tthe picked geom where the pick occurred." "\n\n\n\n" "GEOMID = id of picked geom" "\n\n\n\n" "G = picked point (actual intersection of pick ray with object)" "\n\n\n\n" "V = picked vertex, if any" "\n\n\n\n" "E = picked edge, if any" "\n\n\n\n" "F = picked face" "\n\n\n\n" "P = path to picked primitive [0 or more]" "\n\n\n\n" "VI = index of picked vertex in primitive" "\n\n\n\n" "EI = list of indices of endpoints of picked edge, if any" "\n\n\n\n" "FI = index of picked face" "\n\n\n\n" "External modules can find out about pick events by registering\n" "interest in calls to \"pick\" via the \"interest\" command." "\n\n\n\n" "In the ND-viewing context the co-ordinates are actually ND-points.\n" "They correspond to the 3D points of the pick relative to the\n" "sub-space defined by the viewport of the camera where the pick\n" "occurred. The co-ordinates are then padded with zeroes and\n" "transformed back to the co-ordinate system defined by\n" "\"COORDSYS\".") { float *got = NULL, *v = NULL, *e = NULL, *f = NULL; int vi, ei[2], fi, *p = NULL; int gn, vn, en, fn, pn; int ein = 2; int id, coordsys; /* NOTE: If you change the lisp syntax of this function (which you shouldn't do), you must also update the DEFPICKFUNC macro in the file "pickfunc.h", which external modules use. */ LDECLARE(("pick", LBEGIN, LID, &coordsys, LID, &id, LHOLD, LVARARRAY, LFLOAT, &got, &gn, LHOLD, LVARARRAY, LFLOAT, &v, &vn, LHOLD, LVARARRAY, LFLOAT, &e, &en, LHOLD, LVARARRAY, LFLOAT, &f, &fn, LHOLD, LVARARRAY, LINT, &p, &pn, LINT, &vi, LHOLD, LARRAY, LINT, ei, &ein, LINT, &fi, LEND)); if (got) OOGLFree(got); if (v) OOGLFree(v); if (e) OOGLFree(e); if (f) OOGLFree(f); if (p) OOGLFree(p); return Lt; } /*****************************************************************************/ LDEFINE(event_keys, LVOID, "(event-keys {on|off})\n\ Turn keyboard events on or off to enable/disable keyboard shortcuts.") { int on; LDECLARE(("event-keys", LBEGIN, LKEYWORD, &on, LEND)); if (on == ON_KEYWORD) keyshorts = 1; else if (on == OFF_KEYWORD) keyshorts = 0; else { OOGLError(0, "event-keys: expected \"on\" or \"off\" keyword"); return Lnil; } return Lt; } /*****************************************************************************/ LDEFINE(event_pick, LVOID, "(event-pick {on|off})\n\ Turn picking on or off.") { int on; LDECLARE(("event-pick", LBEGIN, LKEYWORD, &on, LEND)); if (on == ON_KEYWORD) pickon = 1; else if (on == OFF_KEYWORD) pickon = 0; else { OOGLError(0, "event-pick: expected \"on\" or \"off\" keyword"); return Lnil; } return Lt; } /*****************************************************************************/ LDEFINE(dither, LVOID, "(dither CAM-ID {on|off|toggle})\n\ Turn dithering on or off in that camera.") { DView *dv; int id, dither, i, on = -1; LDECLARE(("dither", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &on, LEND)); MAYBE_LOOP(id, i, T_CAM, DView, dv) { if (dv->mgctx) { mgctxselect(dv->mgctx); mgctxget(MG_DITHER, &dither); } if (on == TOGGLE_KEYWORD) dither = !dither; else if (on == ON_KEYWORD) dither = 1; else if (on == OFF_KEYWORD) dither = 0; else { OOGLError(0, "dither: expected \"on\", \"off\" or \"toggle\" keyword"); return Lnil; } if (dv->mgctx) { mgctxset(MG_DITHER, dither, MG_END); gv_redraw(dv->id); } ui_maybe_refresh(dv->id); } return Lt; } /*****************************************************************************/ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/event.h0000644000175000017500000000407512310110177016233 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _EVENT_H #define _EVENT_H #include #include "common.h" typedef struct { PFI motionproc; /* current motion proc */ char *epath; /* pathname of external motion program*/ FILE *efp; Pool *epool; /* stream for communication to extern motion program */ int epid; /* pid of external motion pgm, or 0 if none */ } EventState; extern EventState estate; /* * For keyboard keys, dev number = ascii value * * Other dev number: */ #define ELEFTMOUSE 500 #define EMIDDLEMOUSE 501 #define ERIGHTMOUSE 502 /* * values for mouse events: * 1: button went down * -1: button dragged while down * 0: button went up */ #define EDRAW 503 #define EMODEENTER 504 #define EMODEEXIT 505 #define EPICK 506 #define EUISELECT 507 #define PICKWORLD 0 #define PICKOBJECT 1 /* State of buttons, maintained in event.c and potentially usable by * motion or other modules. */ extern struct button { char shift; char ctrl; char left, middle, right; } button; extern void event_init(); extern void MainLoop(); extern void print_help(); extern float elapsed(float *since, float *nextsince); #endif /* ! _EVENT_H */ geomview-1.9.5/src/bin/geomview/common/help.c0000644000175000017500000000721012310110177016027 00000000000000/* Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* simplistic help-system spawner (i.e. view the manual via external * browsers) */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include "lisp.h" static char htmlbrowser[PATH_MAX] = { '\0', }, pdfviewer[PATH_MAX] = { '\0', }; void ui_manual_browser(const char *type) { char helper[PATH_MAX]; char *docdir; char *browser; char *lang; const char *file = NULL, *dfltfile, *langfile; if ((docdir = getenv("GEOMVIEW_DOC_DIR")) == NULL) { docdir = DOCDIR; /* compile-time default */ } if (strncasecmp(type, "html", strlen("html")) == 0) { if (*htmlbrowser == '\0') { if ((browser = getenv("WEBBROWSER")) == NULL) { browser = DFLTHTMLBROWSER; } } else { browser = htmlbrowser; } dfltfile = "%s/html/index.html"; langfile = "%s/html/%s/index.html"; } else { /* if (strncasecmp(type, "pdf", strlen("pdf")) == 0) { */ if (*pdfviewer == '\0') { if ((browser = getenv("PDFVIEWER")) == NULL) { browser = DFLTPDFVIEWER; } } else { browser = pdfviewer; } dfltfile = "%s/geomview.pdf"; langfile = "%s/geomview-%s.pdf"; } if ((lang = getenv("LANG")) != NULL) { snprintf(helper, PATH_MAX, langfile, docdir, lang); file = findfile(NULL, helper); } if (file == NULL) { snprintf(helper, PATH_MAX, dfltfile, docdir); file = findfile(NULL, helper); } if (file == NULL) { OOGLError(0, "Unable to locate the Geomview manual (\"%s\").", helper); } else { int dummy; snprintf(helper, PATH_MAX, "%s %s &", browser, file); dummy = system(helper); (void)dummy; } } LDEFINE(ui_html_browser, LVOID, "(ui-html-browser HTMLBROWSER)\n" "Use HTMLBROWSER when the `Manual (HTML)' menu item is selected " "in the help menu. If the `(ui-html-browser...)' command was never " "executed, then the default is to use the browser stored in the " "`WEBBROWSER' environment variable. If the environment variable is " "unset then `"DFLTHTMLBROWSER"' is used.") { char *browser = NULL; LDECLARE(("ui-html-browser", LBEGIN, LSTRING, &browser, LEND)); if (browser != NULL) { strncpy(htmlbrowser, browser, PATH_MAX); } return Lt; } LDEFINE(ui_pdf_viewer, LVOID, "(ui-pdf-browser PDFVIEWER\n" "Use PDFVIEWER when the `Manual (PDF)' menu item is selected " "in the help menu. If the `(ui-pdf-viewer...)' command was never " "executed, then the default is to use the viewer stored in the " "`PDFVIEWER' environment variable. If the environment variable is " "unset then `"DFLTPDFVIEWER"' is used.") { char *browser = NULL; LDECLARE(("ui-pdf-viewer", LBEGIN, LSTRING, &browser, LEND)); if (browser != NULL) { strncpy(pdfviewer, browser, PATH_MAX); } return Lt; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/lang.c0000644000175000017500000002701012310110177016020 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include #ifndef NeXT #include #endif /*#include */ #include #include #include #include #include #include "ooglutil.h" #include "drawer.h" #include "lisp.h" #include "lispext.h" #include "lang.h" #include "event.h" #include "ui.h" #include "comm.h" #include "streampool.h" #include "handleP.h" #include "transform.h" #include "mgrib.h" #include "version.h" #include "clang.c" /* do-lang, do-lang, do-lang... */ char geomview_version[] = GEOMVIEW_VERSION; extern char *buildinfographics; /* Possibly initialized elsewhere */ void lang_init() { LInit(); lispext_init(); clang_init(); /* * Functions that don't use LDECLARE need to be LDefun'ed * here because they are not part of the "clang" interface. */ { extern LObject *Lread(Lake *, LList *); extern char Hread[]; extern LObject *Lmerge(Lake *, LList *); extern char Hmerge[]; extern LObject *Lhdefine(Lake *, LList *); extern char Hhdefine[]; extern LObject *LND_xform(Lake *, LList *); extern char HND_xform[]; LDefun("read", Lread, Hread); LDefun("merge", Lmerge, Hmerge); LDefun("hdefine", Lhdefine, Hhdefine); } /* * Define the language keywords */ define_keyword("yes", YES_KEYWORD); define_keyword("no", NO_KEYWORD); define_keyword("on", ON_KEYWORD); define_keyword("off", OFF_KEYWORD); define_keyword("0", ZERO_KEYWORD); define_keyword("1", ONE_KEYWORD); define_keyword("none", NONE_KEYWORD); define_keyword("each", EACH_KEYWORD); define_keyword("keep", KEEP_KEYWORD); define_keyword("all", ALL_KEYWORD); define_keyword("euclidean", EUCLIDEAN_KEYWORD); define_keyword("hyperbolic", HYPERBOLIC_KEYWORD); define_keyword("spherical", SPHERICAL_KEYWORD); define_keyword("virtual", VIRTUAL_KEYWORD); define_keyword("projective", PROJECTIVE_KEYWORD); define_keyword("conformal-ball", CONFORMALBALL_KEYWORD); define_keyword("conformal", CONFORMALBALL_KEYWORD); define_keyword("tiff", TIFF_KEYWORD); define_keyword("frame", FRAME_KEYWORD); define_keyword("camera", CAMERA_KEYWORD); define_keyword("geometry", GEOM_KEYWORD); define_keyword("transform", TRANSFORM_KEYWORD); define_keyword("ntransform", NTRANSFORM_KEYWORD); define_keyword("command", COMMAND_KEYWORD); define_keyword("window", WINDOW_KEYWORD); define_keyword("image", IMAGE_KEYWORD); define_keyword("appearance", APPEARANCE_KEYWORD); define_keyword("translate", TRANSLATE_KEYWORD); define_keyword("e-translate", E_TRANSLATE_KEYWORD); define_keyword("h-translate", H_TRANSLATE_KEYWORD); define_keyword("s-translate", S_TRANSLATE_KEYWORD); define_keyword("translate-scaled", TRANSLATE_SCALED_KEYWORD); define_keyword("e-translate-scaled", E_TRANSLATE_SCALED_KEYWORD); define_keyword("h-translate-scaled", H_TRANSLATE_SCALED_KEYWORD); define_keyword("s-translate-scaled", S_TRANSLATE_SCALED_KEYWORD); define_keyword("rotate", ROTATE_KEYWORD); define_keyword("scale", SCALE_KEYWORD); define_keyword("zoom", ZOOM_KEYWORD); define_keyword("horizontal", HORIZONTAL_KEYWORD); define_keyword("vertical", VERTICAL_KEYWORD); define_keyword("colored", COLORED_KEYWORD); define_keyword("toggle", TOGGLE_KEYWORD); define_keyword("smooth", SMOOTH_KEYWORD); define_keyword("bbox-center", BBOX_CENTER_KEYWORD); define_keyword("origin", ORIGIN_KEYWORD); define_keyword("focus-change", FOCUS_CHANGE_KEYWORD); define_keyword("mouse-cross", MOUSE_CROSS_KEYWORD); define_keyword("inertia", MOTION_INERTIA_KEYWORD); define_keyword("constrain", MOTION_CONSTRAIN_KEYWORD); define_keyword("own-coordinates", MOTION_OWN_COORDS_KEYWORD); /* * Define various synonyms */ LDefun("!", Lshell, "(! COMMAND)\n`!' is a synonym for \"shell\""); LDefun("|", Lemodule_run, "(| EMODULE)\n`|' is a synonym for \"emodule-run\""); LDefun("ui-emotion-program", Lui_emodule_define, "(ui-emotion-program ...)\n" "ui-emotion-program is an obsolete command." "Use its new eqivalent \"emodule-define\" instead."); LDefun("ui-emotion-run", Lui_emodule_start, "(ui-emotion-run ...)\n" "ui-emotion-run is an obsolete command." "Use its new eqivalent \"emodule_start\" instead."); LDefun("quit", Lexit, "(quit)\n`quit' is a synonym for \"exit\""); LDefun("merge-base-ap", Lmerge_baseap, "(merge-base-ap)\n`merge-base-ap' is a synonym for merge-baseap."); /* * And some extra help entries. */ LHelpDef("ID", "\nID is a string which names a geometry or camera. Besides\n\ those you create, valid ones are:\n\ \n\ World, world,\n\ worldgeom, g0: the collection of all geom's\n\ target: selected target object (cam or geom)\n\ center: selected center-of-motion object\n\ targetcam: last selected target camera\n\ targetgeom: last selected target geom\n\ focus: camera where cursor is (or most\n\ recently was)\n\ allgeoms: all geom objects\n\ allcams: all cameras\n\ default, defaultcam: prototype; future cameras inherit\n\ default's settings\n\ \n\ The following IDs are used to name coordinate systems,\n\ e.g. in \"pick\" and \"write\" commands:\n\ \n\ world, World, etc.: the world, within which all other\n\ geoms live.\n\ universe, Universe: the universe, in which the World, lights\n\ and cameras live. Cameras' world2cam\n\ transforms might better be called\n\ universe2cam, etc.\n\ self: \"this geomview object\". Transform from\n\ an object to \"self\" is the identity;\n\ writing its geometry gives the object\n\ itself with no enclosing transform;\n\ picked points appear in the object's\n\ coordinates.\n\ primitive: (for \"pick\" only) Picked points appear in\n\ the coordinate system of the\n\ lowest-level OOGL primitive.\n\ \n\ A name is also an acceptable id. Given names are made unique\n\ by appending numbers if necessary (i.e. \"foo<2>\"). Every geom\n\ is also named g[n] and every camera is also named c[n] (\"g0\"\n\ is always the worldgeom): this name is used as a prefix to\n\ keyboard commands and can also be used as a command language\n\ id. Numbers are reused after an object is deleted. Both names\n\ are shown in the Object browser."); LHelpDef("CAM-ID", "\nCAM-ID is an ID that refers to a camera."); LHelpDef("GEOM-ID", "\nGEOM-ID is an ID that refers to a geometry."); LHelpDef("GEOMETRY", "\nGEOMETRY is an OOGL geometry specification."); LHelpDef("CAMERA", "\nCAMERA is an OOGL camera specification."); LHelpDef("APPEARANCE", "\nAPPEARANCE is an OOGL appearance specification."); LHelpDef("IMAGE", "\nIMAGE is an OOGL image specification."); LHelpDef("TRANSFORM", "\nTRANSFORM is an OOGL 4x4 transformation matrix."); LHelpDef("NTRANSFORM", "\nNTRANSFORM is an OOGL NxM transformation matrix."); } HandleOps *keyword2ops(Keyword keyword) { switch (keyword) { case CAMERA_KEYWORD: return &CamOps; case GEOM_KEYWORD: return &GeomOps; case TRANSFORM_KEYWORD: return &TransOps; case NTRANSFORM_KEYWORD: return &NTransOps; case COMMAND_KEYWORD: return &CommandOps; case WINDOW_KEYWORD: return &WindowOps; case APPEARANCE_KEYWORD: return &AppearanceOps; case IMAGE_KEYWORD: return &ImageOps; default: return NULL; } } /**********************************************************************/ LDEFINE(shell, LVOID, "(shell SHELL-COMMAND)\n" "Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview" "waits for it to complete and will be unresponsive until it does.") { char *cmd; int status; void (*oldsigchld)(); LDECLARE(("shell", LBEGIN, LSTRINGS, &cmd, LEND)); oldsigchld = signal(SIGCHLD, SIG_DFL); status = system(cmd); signal(SIGCHLD, oldsigchld); return LNew(LINT, &status); } LDEFINE(write_sexpr, LVOID, "(write-sexpr FILENAME LISPOBJECT)\n\ Writes the given LISPOBJECT to FILENAME. This function is intended\n\ for internal debugging use only.") { LObject *obj; char *filename; LDECLARE(("write-sexpr", LBEGIN, LSTRING, &filename, LHOLD, LLOBJECT, &obj, LEND)); LWriteFile(filename, obj); return Lt; } LDEFINE(write_handle, LVOID, "(write-handle HANDLEOPS FILENAME HANDLE)\n" "Writes the object underlying the given handle to FILENAME." "This function is intended for internal debugging use only.") { char *prefix, *filename, *handle; Handle *h; HandleOps *ops; Pool *p; LDECLARE(("write-handle", LBEGIN, LSTRING, &prefix, LSTRING, &filename, LSTRING, &handle, LEND)); if ((ops = HandleOpsByName(prefix)) != NULL && (h = HandleByName(handle, ops)) != NULL) { REFPUT(h); if (h->ops->strmout) { bool old_objsaved = h->obj_saved; FILE *outf = NULL; if (strcmp(filename, "-") == 0) { outf = stdout; } p = PoolStreamTemp(filename, NULL, outf, 1, &CommandOps); h->obj_saved = false; h->ops->strmout(p, h, HandleObject(h)); h->obj_saved = old_objsaved; PoolClose(p); PoolDelete(p); } } else { OOGLWarn("Cannot find handle \"%s@%s\"", handle, prefix); } return Lt; } LDEFINE(dump_handles, LVOID, "(dump-handles)\n" "Dump the list of currently active handles to stdout." "This function is intended for internal debugging use only.") { extern void handle_dump(void); LDECLARE(("dump-handles", LBEGIN, LEND)); handle_dump(); return Lt; } LDEFINE(dump_pools, LVOID, "(dump-pools)\n" "Dump the list of currently active input-\"pools\" to stdout." "This function is intended for internal debugging use only.") { extern void pool_dump(void); LDECLARE(("dump-pools", LBEGIN, LEND)); pool_dump(); return Lt; } LDEFINE(geomview_version, LSTRING, "(geomview-version)\n\ Returns a string representing the version of geomview that is\n\ running.") { char buf[128]; char *s; LDECLARE(("geomview-version", LBEGIN, LEND)); sprintf(buf, buildinfographics ? "%s-%s" : "%s", geomview_version, buildinfographics); s = strdup(buf); return LNew( LSTRING, &s ); } bool boolval(char *s, Keyword keyword) { switch (keyword) { case YES_KEYWORD: case ON_KEYWORD: case ONE_KEYWORD: return true; case NO_KEYWORD: case OFF_KEYWORD: case ZERO_KEYWORD: return false; default: fprintf(stderr, "%s: %s is not a boolean keyword; assuming \"no\"\n", s, keywordname(keyword)); return false; } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/lang.h0000644000175000017500000000420512310110177016026 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef LANG_H #define LANG_H extern char geomview_version[]; typedef enum { NOT_A_KEYWORD = -1, NO_KEYWORD=0, YES_KEYWORD, ON_KEYWORD, OFF_KEYWORD, ZERO_KEYWORD, ONE_KEYWORD, NONE_KEYWORD, EACH_KEYWORD, KEEP_KEYWORD, ALL_KEYWORD, EUCLIDEAN_KEYWORD, HYPERBOLIC_KEYWORD, SPHERICAL_KEYWORD, VIRTUAL_KEYWORD, PROJECTIVE_KEYWORD, CONFORMALBALL_KEYWORD, TIFF_KEYWORD, FRAME_KEYWORD, CAMERA_KEYWORD, GEOM_KEYWORD, TRANSFORM_KEYWORD, NTRANSFORM_KEYWORD, COMMAND_KEYWORD, WINDOW_KEYWORD, IMAGE_KEYWORD, APPEARANCE_KEYWORD, TRANSLATE_KEYWORD, E_TRANSLATE_KEYWORD, H_TRANSLATE_KEYWORD, S_TRANSLATE_KEYWORD, TRANSLATE_SCALED_KEYWORD, E_TRANSLATE_SCALED_KEYWORD, H_TRANSLATE_SCALED_KEYWORD, S_TRANSLATE_SCALED_KEYWORD, ROTATE_KEYWORD, SCALE_KEYWORD, ZOOM_KEYWORD, HORIZONTAL_KEYWORD, VERTICAL_KEYWORD, COLORED_KEYWORD, TOGGLE_KEYWORD, SMOOTH_KEYWORD, BBOX_CENTER_KEYWORD, ORIGIN_KEYWORD, FOCUS_CHANGE_KEYWORD, MOUSE_CROSS_KEYWORD, MOTION_INERTIA_KEYWORD, MOTION_CONSTRAIN_KEYWORD, MOTION_OWN_COORDS_KEYWORD } Keyword; void lang_init(); bool boolval(char *s, Keyword keyword); HandleOps *keyword2ops(Keyword keyword); #endif geomview-1.9.5/src/bin/geomview/common/lights.c0000644000175000017500000003220312310110177016371 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #include "lights.h" #include #include #include #include #include "geom.h" #include "list.h" #include "geomclass.h" #include "3d.h" #include "pick.h" #include "common.h" #include "drawer.h" #include "event.h" #include "ui.h" #include "motion.h" #include "mouse.h" #include "inst.h" static Transform Tincr; static int updateproc(Geom *g); static int lightedit(Event *event); static void normalize_color( Color *color, float *coeff ); static void set_ambient(Color *color, float intensity); static void build_light_rack(LmLighting *lgt); static void pick_light(Event *ev); static void mouse2world(Point *axis, int objid); void Rotation(double dx, double dy, Transform rot, int *target); static void lxform(Transform t, Point3 axis); typedef struct LightRack { Geom *list; Geom **lightgeoms; LtLight **lights; int lightcount; LmLighting *lgt; } LightRack; Geom *make_light(Point3 axis, Color *color); static int countlights(LmLighting *lm); static Geom *ray = NULL; /*static int inited = 0; currently unused */ static LightRack lr; static int lr_id = NOID; static int apseq = -1; static char raytxt[] = "VECT \ 10 20 0 \ 2 2 2 2 2 2 2 2 2 2 \ 0 0 0 0 0 0 0 0 0 0 \ .050 .000 0 .160 .000 10 \ .040 .029 0 .129 .094 10 \ .015 .047 0 .049 .152 10 \ -.015 .047 0 -.049 .152 10 \ -.040 .029 0 -.129 .094 10 \ -.050 .000 0 -.160 .000 10 \ -.040 -.029 0 -.129 -.094 10 \ -.015 -.047 0 -.049 -.152 10 \ .015 -.047 0 .049 -.152 10 \ .040 -.029 0 .129 -.094 10"; void clight_init() { Appearance *ap = drawerstate.ap; LmLighting *lgt; IOBFILE *f; f = iobfileopen(fmemopen(raytxt, strlen(raytxt), "rb")); if (f) { ray = GeomFLoad(f, "built-in light ray"); if (! ray) printf("can't construct built-in light ray\n"); } else printf("can't fstropen\n"); iobfclose(f); lr.lights = NULL; lr.lightgeoms = NULL; lr.lightcount = 0; lr.list = NULL; ApGet(ap, AP_LGT, &lgt); if (lgt == NULL) { printf("current appearance has no lighting !!!\n"); } apseq = drawerstate.apseq; build_light_rack(lgt); } void colmult( c, scalar) Color *c; float scalar; { c->r = c->r * scalar; c->g = c->g * scalar; c->b = c->b * scalar; } Color * light_color() { return &( lr.lights[uistate.current_light]->color ); } float light_intensity() { return lr.lights[uistate.current_light]->intensity; } void set_light_intensity(float intens) { lr.lights[uistate.current_light]->intensity = intens; if (uistate.current_light == 0) set_ambient( &(lr.lights[0]->color), lr.lights[0]->intensity ); else { set_beam_color(); } apseq = ++drawerstate.apseq; drawerstate.changed = true; } void set_beam_color() { Color scaledcol; CoCopy( &lr.lights[uistate.current_light]->color, &scaledcol); colmult( &scaledcol, light_intensity()); ApSet(lr.lightgeoms[uistate.current_light]->ap, AP_MtSet, MT_EDGECOLOR, &scaledcol, MT_END, AP_END); } void set_light_color(Color *color) { lr.lights[uistate.current_light]->color = *color; if (uistate.current_light == 0) /* ambient */ set_ambient( &(lr.lights[0]->color), lr.lights[0]->intensity ); else { /* not ambient --- also set color of light beam */ set_beam_color(); } apseq = ++drawerstate.apseq; drawerstate.changed = true; } void set_light(int lightno) { uistate.current_light = lightno; set_light_display(lightno); } int light_count() { return lr.lightcount; } static void set_ambient(Color *color, float intensity) { Color scaledcolor; CoCopy(color, &scaledcolor); colmult(&scaledcolor, intensity); ApSet(drawerstate.ap, AP_LmSet, LM_AMBIENT, &scaledcolor, LM_END, AP_END); } /*----------------------------------------------------------------------- * Function: light_edit_mode * Description: enter/exit light editing mode * Args: edit: 1 means enter, 0 means exit, 2 means toggle * Returns: * Author: mbp * Date: Thu Dec 26 21:12:52 1991 * Notes: */ void light_edit_mode(int edit) { if (edit == 2) edit = uistate.lights_shown ? 0 : 1; if (edit) { show_lights(); } else { unshow_lights(); } ui_light_button(); } void unshow_lights() { /* int i; currently unused */ if (lr_id != NOID) { gv_delete( lr_id ); lr_id = NOID; } ui_remove_mode(LIGHTEDIT); uistate.lights_shown = 0; } void show_lights() { static char *name = "light rack"; GeomStruct gs; lights_changed_check(); /* rebuild lightrack if lights changed */ RefIncr((Ref *)lr.list); gs.geom = lr.list; gs.h = NULL; lr_id = gv_new_alien( name, &gs ); ui_add_mode(LIGHTEDIT, lightedit, T_NONE); uistate.lights_shown = 1; gv_event_mode( LIGHTEDIT ); } static void build_light_rack(LmLighting *lgt) { Point3 axis; int lightno; int i; LtLight *light, **lp; static LtLight ambient; if (lr.lightgeoms) OOGLFree(lr.lightgeoms); if (lr.lights) OOGLFree(lr.lights); if (lr.list) GeomDelete(lr.list); lr.list = GeomCreate("list", CR_END); lr.lightcount = countlights(lgt)+1; lr.lightgeoms = OOGLNewNE(Geom *, lr.lightcount, "lightgeoms array"); lr.lights = OOGLNewNE(LtLight *, lr.lightcount, "lights array"); lr.lightgeoms[0] = NULL; lr.lights[0] = &ambient; LmGet(lgt, LM_AMBIENT, &(ambient.color)); normalize_color( &(ambient.color), &(ambient.intensity) ); lightno = 1; LM_FOR_ALL_LIGHTS(lgt, i,lp) { light = *lp; axis.x = light->position.x; axis.y = light->position.y; axis.z = light->position.z; lr.lights[lightno] = light; lr.lightgeoms[lightno] = make_light(axis, &(light->color)); lr.list = ListAppend(lr.list, lr.lightgeoms[lightno]); ++lightno; } if(lr_id != NOID) { RefIncr((Ref *)lr.list); { GeomStruct gs; gs.geom = lr.list; gs.h = NULL; gv_geometry( drawer_id2name(lr_id), &gs ); } } ui_lights_changed(); } #define max(a,b) (a)>(b)?(a):(b) static void normalize_color( color, coeff ) Color *color; float *coeff; { *coeff = max(color->r, color->g); *coeff = max(color->b, *coeff); if( *coeff != 0.0 ) { color->r /= *coeff; color->g /= *coeff; color->b /= *coeff; } } static int countlights(LmLighting *lm) { int n = 0, i; LtLight **lp; LM_FOR_ALL_LIGHTS(lm, i,lp) { n++; } return n; } Geom* make_light(Point3 axis, Color *color) { Geom *g; Transform t; Appearance *ap; ap = ApCreate(AP_MtSet, MT_EDGECOLOR, color, MT_END, AP_END); lxform(t, axis); g = GeomCreate("inst", CR_GEOM, ray, CR_NOCOPY, CR_APPEAR, ap, CR_END); if (g == NULL) { fprintf(stderr, "Couldn't create inst\n"); return NULL; } InstTransformTo((Inst *)g, t, NULL); return g; } static void lxform(Transform t, Point3 axis) { Point3 x, y; static Point3 other1 = {0,0,1}; static Point3 other2 = {0,1,0}; Point3 *other; Pt3Unit(&axis); other = (Pt3Dot(&axis, &other1) < .5) ? &other1 : &other2; Pt3Cross(other, &axis, &x); Pt3Unit(&x); Pt3Cross(&axis, &x, &y); t[0][0] = x.x; t[0][1] = x.y; t[0][2] = x.z; t[0][3] = 0; t[1][0] = y.x; t[1][1] = y.y; t[1][2] = y.z; t[1][3] = 0; t[2][0] = axis.x; t[2][1] = axis.y; t[2][2] = axis.z; t[2][3] = 0; t[3][0] = 0; t[3][1] = 0; t[3][2] = 0; t[3][3] = 1; } #if LIGHTDEBUG static char * Point3String(Point3 *p) { static char buf[80]; sprintf(buf,"%f %f %f", p->x, p->y, p->z); return buf; } #endif static int lightedit(Event *event) { float dx,dy; unsigned long int dt; Transform T; int target=WORLDGEOM; lights_changed_check(); /* rebuild lightrack if lights have changed */ if (!uistate.lights_shown) show_lights(); /* don't do anything with ambient light */ if (uistate.current_light == 0) return 0; /* should this return 0 or 1 ? */ switch (event->dev) { case ELEFTMOUSE: if (event->val > 0) { /* button went down */ mousezero(event,NULL); TmIdentity(Tincr); drawer_updateproc( lr_id, NULL ); } else if (event->val) { /* dragging while button down */ mousedisp(event, &dx, &dy, &dt, &drawerstate.winpos); Rotation(dx, dy, T, &target); InstTransform((Inst *)lr.lightgeoms[uistate.current_light], T, NULL); PtTransform(T, &(lr.lights[uistate.current_light]->position), &(lr.lights[uistate.current_light]->position)); #if LIGHTDEBUG printf("light moved to %s\n", Point3String(&(lr.lights[uistate.current_light]->position))); #endif apseq = ++drawerstate.apseq; drawerstate.changed = true; } else { /* button went up */ mousedisp(event, &dx, &dy, &dt, &drawerstate.winpos); if ( (dx != 0) || (dy != 0) ) { Rotation(dx, dy, Tincr, &target); drawer_updateproc( lr_id, updateproc ); } else drawer_updateproc( lr_id, NULL ); } break; case EMIDDLEMOUSE: case ERIGHTMOUSE: pick_light(event); break; default: return 0; break; } return 1; } static int updateproc(Geom *g) { /* don't do anything with ambient light */ if (uistate.current_light == 0) return 42; InstTransform((Inst *)lr.lightgeoms[uistate.current_light], Tincr, NULL); PtTransform(Tincr, &(lr.lights[uistate.current_light]->position), &(lr.lights[uistate.current_light]->position)); apseq = ++drawerstate.apseq; drawerstate.changed = true; return 42; } static void pick_light(Event *ev) { int i; DView *dv = dview[uistate.mousefocus]; DGeom *dg = dgeom[INDEXOF(lr_id)]; Transform V, T, Tnorm, Tmodel, Tnet, Tt; float xpick, ypick; Pick *pick = NULL; CamView(dv->cam, V); /* Top-level modelling transform */ GeomPosition( dv->Item, T ); TmConcat( T,V, T ); pick = PickSet(NULL, PA_THRESH, .02, PA_END); for (i=1; iItem, Tmodel ); GeomPosition( dg->Inorm, Tnorm ); TmConcat( Tnorm,Tmodel, Tt ); TmConcat( Tt,T, Tnet ); /* Now Tnet = complete geom-to-screen proj'n */ mousemap(ev->x, ev->y, &xpick, &ypick, &drawerstate.winpos); if(GeomMousePick( lr.lightgeoms[i], pick, (Appearance *)NULL, Tnet, NULL, NULL, xpick, ypick )) { uistate.current_light = i; set_light(i); } } } void add_light() { LmLighting *lgt; ApGet(drawerstate.ap, AP_LGT, &lgt); LmAddLight( lgt, LtCreate(LT_END) ); ++drawerstate.apseq; uistate.current_light = lr.lightcount; lights_changed_check(); } void delete_light() { LmLighting *lgt; ApGet(drawerstate.ap, AP_LGT, &lgt); LmRemoveLight( lgt, lr.lights[uistate.current_light] ); ++drawerstate.apseq; if ( uistate.current_light > (lr.lightcount - 2) ) { uistate.current_light--; } lights_changed_check(); } void lights_changed_check() { LmLighting *lgt; /* Appearance *ap; currently unused */ if (drawerstate.apseq != apseq) { ApGet( drawerstate.ap, AP_LGT, &lgt ); build_light_rack( lgt ); apseq = drawerstate.apseq; drawerstate.changed = true; /* if (uistate.lights_shown) { GeomStruct gs; gs.geom = lr.list; gs.h = NULL; gv_geometry( lr_id, &gs ); } Not just unnecessary (happens in build_light_rack) but wrong: this is a hidden GeomDelete! */ } } /* This is a complete hack. This module should use the drawer_transform stuff, * but I'm too lazy to fix it now --njt */ static void mouse2world(Point *axis, int objid) { Transform C2W, T, Tinv; DObject *dobj; if((dobj = drawer_get_object(objid)) == NULL) return; CamGet( dview[uistate.mousefocus]->cam, CAM_C2W, C2W ); PtTransform( C2W, axis, axis ); if(ISCAM(objid)) { CamGet( ((DView *)dobj)->cam, CAM_W2C, Tinv ); PtTransform( Tinv, axis, axis ); } else if(((DGeom *)dobj)->citizenship == ORDINARY) { GeomGet(dgeom[0]->Item, CR_AXIS, T); /* Assert: dgeom[0]->Inorm uses the identity matrix */ TmInvert(T, Tinv); PtTransform( Tinv, axis, axis ); } } void Rotation(double dx, double dy, Transform rot, int *target) { double ang; Point axis; if (dx == 0 && dy == 0) { TmIdentity(rot); return; } axis.x = -dy; axis.y = dx; axis.z = 0; axis.w = 0; ang = atan( sqrt( dx*dx + dy*dy ) ); mouse2world(&axis, *target); TmRotate( rot, ang, (Point3 *)(void *)&axis ); } geomview-1.9.5/src/bin/geomview/common/lights.h0000644000175000017500000000242512310110177016401 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _LIGHTS_H_ #define _LIGHTS_H_ #include "common.h" extern int light_count(); extern void set_light(int lightno); extern void set_light_color(Color *color); extern void clight_init(); extern void delete_light(); extern void add_light(); extern void light_edit_mode(int edit); extern void set_beam_color(); extern void unshow_lights(); extern void show_lights(); #endif /* ! _LIGHTS_H_ */ geomview-1.9.5/src/bin/geomview/common/lispext.c0000644000175000017500000004714312310110177016600 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * geomview custom lisp object types */ #include #include #include #include #include "ooglutil.h" #include "drawer.h" #include "lisp.h" #include "lispext.h" #include "streampool.h" #include "handleP.h" #include "camera.h" #include "geom.h" #include "appearance.h" #include "window.h" #include "transform.h" #include "fsa.h" #include "lang.h" #include "freelist.h" extern HandleOps GeomOps, CamOps, WindowOps; extern HandleOps TransOps, NTransOps, ImageOps, AppearanceOps; LObject *L0, *L1; static Fsa lang_fsa = NULL; #define REJECT -1 static char **keyword_names; static int n_keywords; static DEF_FREELIST(HandleRefStruct); static DEF_FREELIST(TransformStruct); #ifdef NEW # undef NEW #endif #define NEW(type, name) \ { \ HandleRefStruct *hrname; \ FREELIST_NEW(HandleRefStruct, hrname); \ name = (type##Struct *)hrname; \ } #ifdef DELETE # undef DELETE #endif #define DELETE(name) FREELIST_FREE(HandleRefStruct, name) /************************************************************************ CAMERA LISP OBJECT ************************************************************************/ static CameraStruct *camcopy(CameraStruct *old) { CameraStruct *newc; NEW(Camera, newc); if(old) *newc = *old; else newc->cam = NULL, newc->h = NULL; if (newc->cam) RefIncr((Ref*)(newc->cam)); if (newc->h) RefIncr((Ref*)newc->h); return newc; } static bool camfromobj(LObject *obj, CameraStruct **x) { if (obj->type != LCAMERA) return 0; *x = LCAMERAVAL(obj); return 1; } static LObject *cam2obj(CameraStruct **x) { CameraStruct *copy = camcopy(*x); return LNew( LCAMERA, © ); } static void camfree(CameraStruct **x) { if (*x) { if ((*x)->cam) CamDelete( (*x)->cam ); if ((*x)->h) HandleDelete( (*x)->h ); DELETE(*x); } } static bool cammatch(CameraStruct **a, CameraStruct **b) { if ((*a)->h && ((*a)->h == (*b)->h)) return 1; if ((*a)->cam && ((*a)->cam == (*b)->cam)) return 1; return 0; } static void camwrite(FILE *fp, CameraStruct **x) { CamFSave( (*x)->cam, fp, "lisp output stream" ); } static void campull(va_list *a_list, CameraStruct **x) { *x = va_arg(*a_list, CameraStruct*); } static LObject *camparse(Lake *lake) { CameraStruct *newc; NEW(Camera, newc); newc->h = NULL; newc->cam = NULL; if (CamOps.strmin(POOL(lake), (Handle **)&newc->h, (Ref **)(void *)&(newc->cam)) == 0) { return Lnil; } else if(newc->h && !newc->h->permanent) { HandleDelete(newc->h); newc->h = NULL; } return LNew( LCAMERA, &newc ); } LType LCamerap = { "camera", sizeof(CameraStruct*), camfromobj, cam2obj, camfree, camwrite, cammatch, campull, camparse, LTypeMagic }; /************************************************************************ * WINDOW LISP OBJECT * ************************************************************************/ static WindowStruct *wncopy(WindowStruct *old) { WindowStruct *neww; NEW(Window, neww); if(old) *neww = *old; else neww->wn = NULL, neww->h = NULL; if (neww->wn) RefIncr((Ref*)(neww->wn)); if (neww->h) RefIncr((Ref*)neww->h); return neww; } static bool wnfromobj(LObject *obj, WindowStruct **x) { if (obj->type != LWINDOW) return 0; *x = LWINDOWVAL(obj); return 1; } static LObject *wn2obj(WindowStruct **x) { WindowStruct *copy = wncopy(*x); return LNew( LWINDOW, © ); } static void wnfree(WindowStruct **x) { if (*x) { if ((*x)->wn) WnDelete( (*x)->wn ); if ((*x)->h) HandleDelete( (*x)->h ); DELETE(*x); } } static bool wnmatch(WindowStruct **a, WindowStruct **b) { if ((*a)->h && ((*a)->h == (*b)->h)) return 1; if ((*a)->wn && ((*a)->wn == (*b)->wn)) return 1; return 0; } static void wnwrite(FILE *fp, WindowStruct * *x) { Pool *p = PoolStreamTemp("", NULL, fp, 1, &WindowOps); if(p == NULL) return; (void) WnStreamOut(p, (*x)->h, (*x)->wn); PoolDelete(p); } static void wnpull(va_list *a_list, WindowStruct **x) { *x = va_arg(*a_list, WindowStruct*); } static LObject *wnparse(Lake *lake) { WindowStruct *neww; NEW(Window, neww); neww->h = NULL; neww->wn = NULL; if (WindowOps.strmin(POOL(lake),(Handle **)&neww->h, (Ref **)(void *)&(neww->wn)) == 0) { return Lnil; } else if(neww->h && !neww->h->permanent) { HandleDelete(neww->h); neww->h = NULL; } return LNew( LWINDOW, &neww ); } LType LWindowp = { "window", sizeof(WindowStruct*), wnfromobj, wn2obj, wnfree, wnwrite, wnmatch, wnpull, wnparse, LTypeMagic }; /************************************************************************ * GEOM LISP OBJECT * ************************************************************************/ static GeomStruct *geomcopy(GeomStruct *old) { GeomStruct *newg; NEW(Geom, newg); if(old) *newg = *old; else newg->geom = NULL, newg->h = NULL; if (newg->geom) RefIncr((Ref*)(newg->geom)); if (newg->h) RefIncr((Ref*)newg->h); return newg; } static bool geomfromobj(LObject *obj, GeomStruct **x) { if (obj->type != LGEOM) return 0; *x = LGEOMVAL(obj); return 1; } static LObject *geom2obj(GeomStruct **x) { GeomStruct *copy = geomcopy(*x); return LNew( LGEOM, © ); } static void geomfree(GeomStruct **x) { if (*x) { if ((*x)->geom) GeomDelete( (*x)->geom ); if ((*x)->h) HandleDelete( (*x)->h ); DELETE(*x); } } static bool geommatch(GeomStruct **a, GeomStruct **b) { if ((*a)->h && ((*a)->h == (*b)->h)) return 1; if ((*a)->geom && ((*a)->geom == (*b)->geom)) return 1; return 0; } static void geomwrite(FILE *fp, GeomStruct **x) { GeomFSave( (*x)->geom, fp, "lisp output stream" ); } static void geompull(va_list *a_list, GeomStruct **x) { *x = va_arg(*a_list, GeomStruct*); } static LObject *geomparse(Lake *lake) { GeomStruct *newg; NEW(Geom, newg); newg->h = NULL; newg->geom = NULL; if (GeomOps.strmin(POOL(lake), (Handle **)&newg->h, (Ref **)(void *)&(newg->geom)) == 0) { return Lnil; } else { if(newg->h && !newg->h->permanent) { HandleDelete(newg->h); newg->h = NULL; } return LNew( LGEOM, &newg ); } } LType LGeomp = { "geometry", sizeof(GeomStruct*), geomfromobj, geom2obj, geomfree, geomwrite, geommatch, geompull, geomparse, LTypeMagic }; /************************************************************************ * AP LISP OBJECT * ************************************************************************/ static ApStruct *apcopy(ApStruct *old) { ApStruct *newap; NEW(Ap, newap); if(old) *newap = *old; else newap->ap = NULL, newap->h = NULL; if (newap->ap) RefIncr((Ref*)(newap->ap)); if (newap->h) RefIncr((Ref*)newap->h); return newap; } static bool apfromobj(LObject *obj, ApStruct **x) { if (obj->type != LAP) return 0; *x = LAPVAL(obj); return 1; } static LObject *ap2obj(ApStruct **x) { ApStruct *copy = apcopy(*x); return LNew( LAP, © ); } static void apfree(ApStruct **x) { if (*x) { if ((*x)->ap) ApDelete( (*x)->ap ); if ((*x)->h) HandleDelete( (*x)->h ); DELETE(*x); } } static bool apmatch(ApStruct **a, ApStruct **b) { if ((*a)->h && ((*a)->h == (*b)->h)) return 1; if ((*a)->ap && ((*a)->ap == (*b)->ap)) return 1; return 0; } static void apwrite(FILE *fp, ApStruct * *x) { ApFSave((*x)->ap, fp, "lisp output stream"); } static void appull(va_list *a_list, ApStruct **x) { *x = va_arg(*a_list, ApStruct*); } static LObject *apparse(Lake *lake) { ApStruct *newap; NEW(Ap, newap); newap->h = NULL; newap->ap = NULL; if (ApStreamIn(POOL(lake), &newap->h, &(newap->ap)) == 0) { return Lnil; } else if(newap->h && !newap->h->permanent) { HandleDelete(newap->h); newap->h = NULL; } return LNew( LAP, &newap ); } LType LApp = { "ap", sizeof(ApStruct *), apfromobj, ap2obj, apfree, apwrite, apmatch, appull, apparse, LTypeMagic }; /************************************************************************ * TRANSFORM LISP OBJECT * ************************************************************************/ static TransformStruct *tmcopy(TransformStruct *old) { TransformStruct *newt; FREELIST_NEW(TransformStruct, newt); if (old) *newt = *old; else newt->h = NULL; if (newt->h) RefIncr((Ref*)newt->h); return newt; } static bool tmfromobj(LObject *obj, TransformStruct **x) { if (obj->type != LTRANSFORM) return 0; *x = LTRANSFORMVAL(obj); return 1; } static LObject *tm2obj(TransformStruct **x) { TransformStruct *copy = tmcopy(*x); return LNew(LTRANSFORM, ©); } static void tmfree(TransformStruct **x) { if (*x) { if ((*x)->h) HandleDelete((*x)->h); FREELIST_FREE(TransformStruct, *x); } } static bool tmmatch(TransformStruct **a, TransformStruct **b) { if ((*a)->h && ((*a)->h == (*b)->h)) return 1; if ((*a)->tm && ((*a)->tm == (*b)->tm)) return 1; return TmCompare((*a)->tm, (*b)->tm, (float)0.0); } static void tmwrite(FILE *fp, TransformStruct **x) { TransFSave((*x)->tm, fp, "lisp output stream"); } static void tmpull(va_list *a_list, TransformStruct **x) { *x = va_arg(*a_list, TransformStruct*); } static LObject *tmparse(Lake *lake) { TransformStruct *newt; FREELIST_NEW(TransformStruct, newt); newt->h = NULL; if (TransStreamIn(POOL(lake), (Handle **)&newt->h, newt->tm) == false) { return Lnil; } else if(newt->h && !newt->h->permanent) { HandleDelete(newt->h); newt->h = NULL; } return LNew( LTRANSFORM, &newt ); } LType LTransformp = { "transform", sizeof(TransformStruct *), tmfromobj, tm2obj, tmfree, tmwrite, tmmatch, tmpull, tmparse, LTypeMagic }; /************************************************************************ * N-D TRANSFORM LISP OBJECT * ************************************************************************/ static TmNStruct *tmncopy(TmNStruct *old) { TmNStruct *newt; NEW(TmN, newt); if(old) *newt = *old; else newt->tm = NULL, newt->h = NULL; if (newt->tm) RefIncr((Ref*)(newt->tm)); if (newt->h) RefIncr((Ref*)newt->h); return newt; } static bool tmnfromobj(LObject *obj, TmNStruct **x) { if (obj->type != LTRANSFORMN) return 0; *x = LTRANSFORMNVAL(obj); return 1; } static LObject *tmn2obj( TmNStruct **x ) { TmNStruct *copy = tmncopy(*x); return LNew( LTRANSFORMN, © ); } static void tmnfree(TmNStruct **x) { if (*x) { if ((*x)->tm) TmNDelete( (*x)->tm ); if ((*x)->h) HandleDelete( (*x)->h ); DELETE(*x); } } static bool tmnmatch(TmNStruct **a, TmNStruct **b) { if ((*a)->h && ((*a)->h == (*b)->h)) return 1; if ((*a)->tm && ((*a)->tm == (*b)->tm)) return 1; return 0; } static void tmnwrite(FILE *fp, TmNStruct **x) { TmNPrint( fp, (*x)->tm ); } static void tmnpull(va_list *a_list, TmNStruct **x) { *x = va_arg(*a_list, TmNStruct*); } static LObject *tmnparse(Lake *lake) { TmNStruct *newt; NEW(TmN, newt); newt->h = NULL; newt->tm = NULL; if (NTransOps.strmin(POOL(lake), (Handle **)&newt->h, (Ref **)(void *)(&newt->tm)) == 0) { return Lnil; } else { if(newt->h && !newt->h->permanent) { HandleDelete(newt->h); newt->h = NULL; } return LNew( LTRANSFORMN, &newt ); } } LType LTransformNp = { "ntransform", sizeof(TmNStruct*), tmnfromobj, tmn2obj, tmnfree, tmnwrite, tmnmatch, tmnpull, tmnparse, LTypeMagic }; /************************************************************************ * IMAGE LISP OBJECT * ************************************************************************/ static ImgStruct *imgcopy(ImgStruct *old) { ImgStruct *newi; NEW(Img, newi); if(old) *newi = *old; else newi->img = NULL, newi->h = NULL; if (newi->img) RefIncr((Ref*)(newi->img)); if (newi->h) RefIncr((Ref*)newi->h); return newi; } static bool imgfromobj(LObject *obj, ImgStruct **x) { if (obj->type != LIMAGE) return 0; *x = LIMAGEVAL(obj); return 1; } static LObject *img2obj( ImgStruct **x ) { ImgStruct *copy = imgcopy(*x); return LNew( LIMAGE, © ); } static void imgfree(ImgStruct **x) { if (*x) { if ((*x)->img) ImgDelete( (*x)->img ); if ((*x)->h) HandleDelete( (*x)->h ); DELETE(*x); } } static bool imgmatch(ImgStruct **a, ImgStruct **b) { if ((*a)->h && ((*a)->h == (*b)->h)) return true; if ((*a)->img && ((*a)->img == (*b)->img)) return true; return false; } static void imgwrite(FILE *fp, ImgStruct **x) { ImgFSave((*x)->img, fp, "lisp output stream"); } static void imgpull(va_list *a_list, ImgStruct **x) { *x = va_arg(*a_list, ImgStruct*); } static LObject *imgparse(Lake *lake) { ImgStruct *newi; NEW(Img, newi); newi->h = NULL; newi->img = NULL; if (ImageOps.strmin(POOL(lake), (Handle **)&newi->h, (Ref **)(void *)(&newi->img)) == 0) { return Lnil; } else { if(newi->h && !newi->h->permanent) { HandleDelete(newi->h); newi->h = NULL; } return LNew( LIMAGE, &newi ); } } LType LImagep = { "image", sizeof(ImgStruct*), imgfromobj, img2obj, imgfree, imgwrite, imgmatch, imgpull, imgparse, LTypeMagic }; /************************************************************************ * ID LISP OBJECT * ************************************************************************/ static bool idfromobj(LObject *obj, int *x) { char *tmp; if (LSTRINGFROMOBJ(obj, &tmp)) { *x = drawer_idbyname(tmp); if (*x == NOID) return 0; } else if (obj->type == LID) { *x = LIDVAL(obj); } else return 0; return 1; } static LObject *id2obj(int *x) { return LNew( LID, x ); } static void idfree(int *x) {} static bool idmatch(int *a, int *b) { return drawer_idmatch(*a,*b); } static void idwrite(FILE *fp, int *x) { fprintf(fp, "\"%s\"", drawer_id2name(*x)); } #if 0 static LObject *idparse(Lake *lake) { LObject *obj = LSexpr(lake); int id; if (obj->type == LSTRING) { id = drawer_idbyname(LSTRINGVAL(obj)); if (id == NOID) return Lnil; OOGLFree(LSTRINGVAL(obj)); obj->type = LID; obj->cell.i = id; return obj; } else { LFree(obj); return Lnil; } } #endif static void idpull(a_list, x) va_list *a_list; int *x; { *x = va_arg(*a_list, int); } LType LIdp = { "id", sizeof(int), idfromobj, id2obj, idfree, idwrite, idmatch, idpull, LSexpr, LTypeMagic }; /************************************************************************ * KEYWORD LISP OBJECT * ************************************************************************/ static bool keywordfromobj(LObject *obj, int *x) { char *tmp; if (LSTRINGFROMOBJ(obj, &tmp)) { *x = (int)(long)fsa_parse(lang_fsa, tmp); if (*x == REJECT) { return false; } } else if (obj->type == LKEYWORD) { *x = LKEYWORDVAL(obj); } else { return false; } return true; } static LObject *keyword2obj(int *x) { return LNew( LKEYWORD, x ); } static bool keywordmatch(int *a, int *b) { return *a == *b; } static void keywordwrite(FILE *fp, Keyword *x) { fprintf(fp, "%s", keywordname(*x)); } static void keywordfree(void *value) {} static void keywordpull(a_list, x) va_list *a_list; int *x; { *x = va_arg(*a_list, int); } #if 0 static LObject *keywordparse(Lake *lake) { LObject *obj = LSexpr(lake); int key; if (obj->type == LSTRING) { key = (int)(long)fsa_parse(lang_fsa, LSTRINGVAL(obj)); if (key == REJECT) return Lnil; OOGLFree(LSTRINGVAL(obj)); obj->type = LKEYWORD; obj->cell.i = key; return obj; } else { LFree(obj); return Lnil; } } #endif LType LKeywordp = { "keyword", sizeof(int), keywordfromobj, keyword2obj, keywordfree, keywordwrite, keywordmatch, keywordpull, LSexpr, LTypeMagic }; /************************************************************************ * STRINGS LISP OBJECT * * (a "strings" object is a string with possibly embedded spaces) * * * * cH: actually, this function just sucks everything in until a closing * * paren is found. We now also take care of quoting and embedded parens * ************************************************************************/ static bool stringsfromobj(LObject *obj, char * *x) { if (LSTRINGFROMOBJ(obj, x)) { return true; } else if (obj->type == LSTRINGS) { *x = LSTRINGVAL(obj); return true; } return false; } static LObject *stringsparse(Lake *lake) { const char *tok; int toklen, quote, paren = 0; bool first = true; vvec svv; VVINIT(svv, char, 80); while (paren > 0 || LakeMore(lake)) { paren -= !LakeMore(lake); paren += LakeNewSexpr(lake); tok = LakeNextToken(lake, "e); toklen = strlen(tok); if (first) { first = false; quote = '\0'; /* we do not quote the first token */ } else { *VVAPPEND(svv, char) = ' '; } if (quote != '\0') { *VVAPPEND(svv, char) = (char)quote; } vvneeds(&svv, VVCOUNT(svv)+toklen); memcpy(VVEC(svv, char)+VVCOUNT(svv), tok, toklen); VVCOUNT(svv) += toklen; if (quote != '\0') { *VVAPPEND(svv, char) = (char)quote; } } *VVAPPEND(svv, char) = '\0'; vvtrim(&svv); tok = VVEC(svv, char); return LNew(LSTRINGS, &tok); } LType LStringsp; /* initialized in lispext_init() */ /**********************************************************************/ /**********************************************************************/ void lispext_init() { LStringsp = *(LSTRING); LStringsp.name = "strings"; LStringsp.fromobj = stringsfromobj; LStringsp.parse = stringsparse; { int zero=0, one=1; L0 = LNew( LINT, &zero ); L1 = LNew( LINT, &one ); } lang_fsa = fsa_initialize(NULL, (void*)REJECT); return; } void define_keyword(char *word, Keyword value) { if (value+1 > n_keywords) { char **newwords = OOGLNewNE(char *, value+1, "New keyword list"); memset(newwords, 0, sizeof(char *)*(value+1)); memcpy(newwords, keyword_names, n_keywords*sizeof(char *)); OOGLFree(keyword_names); keyword_names = newwords; keyword_names[value] = word; n_keywords = value+1; } else if (keyword_names[value] == NULL) { /* We allow aliases, but the name-list just picks up the first * name. */ keyword_names[value] = word; } fsa_install(lang_fsa, word, (void*)(long)value); } /* returns < 0 if asked to parse something that isn't a keyword. */ Keyword parse_keyword(char *word) { return (Keyword)(long)fsa_parse(lang_fsa, word); } char *keywordname(Keyword keyword) { if (keyword < n_keywords && keyword_names[keyword] != NULL) { return keyword_names[keyword]; } else { return "???"; } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/lispext.h0000644000175000017500000000602612310110177016600 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef LISPEXT_H #define LISPEXT_H #include "lisp.h" #include "streampool.h" #include "3d.h" #include "camera.h" #include "geom.h" #include "appearance.h" #include "window.h" #include "transformn.h" #include "lang.h" /* All extension objects except the transform objects have the * following structure. */ typedef struct HandleRefStruct { Handle *h; Ref *ref; } HandleRefStruct; typedef struct { Handle *h; Camera *cam; } CameraStruct; typedef struct { Handle *h; Geom *geom; } GeomStruct; typedef struct { Handle *h; Transform tm; } TransformStruct; typedef struct { Handle *h; WnWindow *wn; } WindowStruct; typedef struct { Handle *h; Appearance *ap; } ApStruct; typedef struct { Handle *h; TransformN *tm; } TmNStruct; typedef struct { Handle *h; Image *img; } ImgStruct; #define LAPVAL(obj) ((ApStruct*) (obj->cell.p)) #define LCAMERAVAL(obj) ((CameraStruct*) (obj->cell.p)) #define LGEOMVAL(obj) ((GeomStruct*) (obj->cell.p)) #define LWINDOWVAL(obj) ((WindowStruct*) (obj->cell.p)) #define LTRANSFORMVAL(obj) ((TransformStruct*)(obj->cell.p)) #define LTRANSFORMNVAL(obj) ((TmNStruct*) (obj->cell.p)) #define LIMAGEVAL(obj) ((ImgStruct*) (obj->cell.p)) #define LSTRINGSVAL(obj) LSTRINGVAL(obj) #define LIDVAL(obj) (obj->cell.i) #define LKEYWORDVAL(obj) (obj->cell.i) extern LType LApp; extern LType LCamerap; extern LType LGeomp; extern LType LIdp; extern LType LKeywordp; extern LType LStringsp; extern LType LTransformp; extern LType LTransformNp; extern LType LWindowp; extern LType LImagep; extern LType LApp; #define LAP (&LApp) #define LCAMERA (&LCamerap) #define LGEOM (&LGeomp) #define LID (&LIdp) #define LKEYWORD (&LKeywordp) #define LSTRINGS (&LStringsp) #define LTRANSFORM (<ransformp) #define LTRANSFORMN (<ransformNp) #define LWINDOW (&LWindowp) #define LIMAGE (&LImagep) extern LObject *L0, *L1; extern Keyword parse_keyword(char *word); extern void lispext_init(); extern void define_keyword(char *word, Keyword value); char *keywordname(Keyword keyword); #endif /* ! LISPEXT_H */ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/main.c0000644000175000017500000002372012310110177016027 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* static char *copyright = "Copyright (C) 1992 The Geometry Center"; currently unused*/ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #include "drawer.h" #include "event.h" #include "main.h" #include "ui.h" #include "comm.h" #include "geom.h" #include "camera.h" #include "pick.h" #include #include #include #include #include #include #ifdef NeXT #include #else #include #endif #if HAVE_LOCALE_H # include #endif #define STREQ(s1,s2) (strcmp(s1,s2)==0) static char *initfilename = ".geomview"; char *geomview_system_initfile = NULL; int do_init = 1; Color initial_defaultbackcolor = {1.0/3.0, 1.0/3.0, 1.0/3.0 }; static char *pipesubdir = "geomview"; int gv_nwins = 1; int gv_no_opengl = 0; vvec vv_load_path; vvec vv_emodule_path; /* Default backstop appearance */ static char apdefault[] = "\ appearance { \ +face \ -edge \ +vect \ normscale 1.0 \ linewidth 1 \ patchdice 10 10 \ -normal \ +evert \ shading flat \ -transparent \ material { \ kd 1.0 diffuse 1 1 1 \ ka 0.3 ambient 1 1 1 \ ks 0.3 specular 1 1 1 \ shininess 15 \ edgecolor 0 0 0 \ normalcolor 1 1 1 \ alpha 1 \ } \ lighting { \ ambient .2 .2 .2 \ replacelights \ light { color .75 .75 .75 position 0 0 10 0 } \ light { color .6 .6 .6 position 0 1 -1 0 } \ light { color .4 .4 .4 position 1 -2 -1 0 } \ } \ }"; /* * Default geometry to use when drawing cameras. */ static char defaultcam[] = "\ appearance {linewidth 4}\n\ VECT\n\ 7 17 4\n\ 2 2 2 2 2 2 5\n\ 1 1 1 0 0 0 1\n\ -.5 -.5 -.5 0 -.5 -.5\n\ -.5 -.5 -.5 -.5 0 -.5\n\ 0 0 0 .5 .5 -.5\n\ 0 0 0 -.5 -.5 -.5\n\ 0 0 0 -.5 .5 -.5\n\ 0 0 0 .5 -.5 -.5\n\ -.5 0 -.5 -.5 .5 -.5 .5 .5 -.5 .5 -.5 -.5 0 -.5 -.5\n\ 1 0 0 1\n\ 0 1 0 1\n\ 0 0 1 1\n\ 0 0 0 1"; static char windefault[] = "{ size 450 450 resize }"; void usage(char *me, char *morestuff) { fprintf(stderr, "\ Usage: %s [-b r g b] [-c commandfile] [-wins #windows]\n\ [-nopanels] [-noinit] [-noopengl]\n\ [-wpos width,height[@xmin,ymin]] [-wpos -] [-M[gc][sp] pipename]\n\ [-start external-module-string args ... --]\n\ [-run external-module-pathname args ... --]\n\ %s [ file ... ]\n", me, morestuff); exit(1); } static void parse_emodule(int room, int *acp, char ***avp, char *first, char *firstname, char *indir) { int i; char *cmd; char *next; emodule new; int baselen; for (i = 1; i <= *acp && !STREQ((next = (*avp)[i]), "--"); i++) room += strlen(next)+1+1; if (room) { cmd = OOGLNewNE(char, room, "emod cmd"); if (first) { strcpy(cmd, first); strcat(cmd, " "); } else cmd[0] = '\0'; baselen = strlen(cmd); while (*acp > 0 && !STREQ((next = *++(*avp)), "--")) { strcat(cmd, next); strcat(cmd, " "); (*acp)--; } new.text = strdup(cmd); if(firstname) { new.name = OOGLNewNE(char, room + strlen(firstname) + 1, "emod name"); sprintf(new.name, "%s %s", firstname, cmd+baselen); } else { new.name = strdup(cmd); } new.data = NULL; new.dir = indir; emodule_run(&new); } } int parse_common_arg(int *acp, char ***avp) { int ac = *acp; char **av = *avp; char *arg = *av; int ok = 1; int i; if (STREQ(arg,"-b") && (ac-=3) > 0) { initial_defaultbackcolor.r = atof(*++av); initial_defaultbackcolor.g = atof(*++av); initial_defaultbackcolor.b = atof(*++av); drawer_color(DEFAULTCAMID, DRAWER_BACKCOLOR, &initial_defaultbackcolor); } else if(STREQ(arg, "-wins") && --ac > 0) { gv_nwins = atoi(*++av); } else if((STREQ(arg, "-wpos") || STREQ(arg, "-w")) && --ac > 0) { WindowStruct ws; WnPosition wp; int a1,a2,a3,a4; char ch; static char rats[] = "geomview: -wpos: expected width,height[@xmin,ymin]"; ws.wn = WnCreate(WN_ENLARGE, 1, WN_SHRINK, 1, WN_END); ws.h = NULL; switch(sscanf(*++av, "%d%*c%d%c%d%*c%d", &a1,&a2,&ch,&a3,&a4)) { case 2: WnSet(ws.wn, WN_XSIZE, a1, WN_YSIZE, a2, WN_END); break; case 1: wp.xmin = a1; if((ac -= 3) < 0) { OOGLError(0, rats); exit(1); } wp.ymin = atoi(*++av); wp.xmax = wp.xmin + atoi(*++av)-1; wp.ymax = wp.ymin + atoi(*++av)-1; break; case 5: if(ch == '@') { /* xsize,ysize@xmin,ymin */ wp.xmin = a3; wp.xmax = a3 + a1-1; wp.ymin = a4; wp.ymax = a4 + a2-1; } else { /* xmin,ymin,xsize,ysize */ wp.xmin = a1; wp.ymin = a2; wp.xmax = a1+a3-1; wp.ymax = a2+a4-1; } WnSet(ws.wn, WN_PREFPOS, &wp, WN_END); break; default: if(!STREQ(arg, "-")) { OOGLError(0, rats); exit(1); } /* "-" => interactive positioning -- fall through */ } gv_window(DEFAULTCAMID, &ws); } else if(STREQ(arg, "-debug")) { /* -debug -- don't catch SIGINT, SIGSEGV, etc. signals */ /* -debug and -noopengl are handled in init_geomview() gv_debug = 1; */ } else if (STREQ(arg, "-noopengl")) { /* -debug and -noopengl are handled in init_geomview() gv_no_opengl = 1; */ } else if(STREQ(arg, "-c") && --ac > 0) { /* -c -- Process command file (or string) */ gv_load(*++av, "command"); } else if(!strncmp(arg, "-M", 2) && --ac > 0) { /* -M[cg][ps[un|in|in6]] pipename|port -- external connection */ char pipedir[PATH_MAX]; char *tmpdir = getenv("TMPDIR"); if (tmpdir == NULL) { tmpdir = "/tmp"; } snprintf(pipedir, PATH_MAX, "%s/%s", tmpdir, pipesubdir); usepipe(pipedir, *++av, &arg[2]); } else if(strncmp(arg, "-nop", 4) == 0) { /* "-nopanels" */ /* -nopanels -- Suppress all possible panels */ for(i=0; i<30; i++) ui_showpanel(i, 0); } else if(STREQ(arg, "-e") && --ac > 0) { /* -e -- start an e-module with no arguments */ gv_ui_emodule_start(*++av); } else if(STREQ(arg, "-start") && --ac > 0) { /* -start emodule-name args ... */ emodule *old; int room; char *name; ui_emodule_index((name = *++av), &old); if (old) { room = strlen(old->text) +1 +1; ac--; parse_emodule(room, &ac, &av, old->text, old->name, old->dir); } else { OOGLError(0, "No external module named %s.", name); } } else if(STREQ(arg, "-run") && --ac > 0) { /* -run program-name args ... -- run program as e-module */ parse_emodule(0, &ac, &av, NULL, NULL, NULL); } else if(STREQ(arg, "-time")) { /* Enable timing as with ctrl-T */ timing(999999); } else if(STREQ(arg, "-noinit")) { /* Don't read any initialization files */ do_init = 0; } else if(arg[0] == '-' && arg[1] != '\0') { ok = 0; /* Unrecognized */ } else { gv_load(arg, NULL); } *acp = ac; *avp = av; return ok; } void init_geomview(int argc, char **argv) { char *userhome, homefile[512], dotfile[512]; struct stat homebuf, dotbuf; int i, homestat, dotstat; #if HAVE_SETLOCALE && HAVE_DECL_LC_ALL setlocale(LC_ALL, "POSIX"); #endif if (getenv("GEOMVIEW_DEBUG")) gv_debug = 1; if (getenv("GEOMVIEW_NO_OPENGL")) gv_no_opengl = 1; for(i = 1; i < argc; i++) if(STREQ(argv[i], "-noinit")) do_init = 0; else if(STREQ(argv[i], "-debug")) gv_debug = 1; else if(STREQ(argv[i], "-noopengl")) gv_no_opengl = 1; drawer_init(apdefault, defaultcam, windefault); comm_init(); event_init(); ui_init(); VVINIT(vv_load_path, char *, 3); VVINIT(vv_emodule_path, char *, 3); /* env_init() should arrange for vv_load_path, vv_emodule_path, and geomview_system_initfile to be set to whatever default values are appropriate for the environment. On the IRIS this is done through environment variables set in a driving shell script (the IRIS version of env_init() is in gl/glmain.c). The NeXT uses a CONFIG.gv script in the Geomview.app wrapper. */ env_init(); if(do_init) { /* load system init file, if present */ if (geomview_system_initfile) { if (access(geomview_system_initfile, R_OK) == 0) { gv_load(geomview_system_initfile, "command"); } } /* now load ~/.geomview and ./.geomview, in that order, if present, unless they are the same, in which case just load once */ userhome = getenv("HOME"); sprintf(homefile,"%s/%s", userhome, initfilename); sprintf(dotfile,"./%s", initfilename); homestat = stat(homefile, &homebuf); dotstat = stat(dotfile, &dotbuf); if (homestat == 0) { if (access(homefile, R_OK) == 0) gv_load(homefile, "command"); else OOGLError(0, "Warning: file %s present but unreadable; ignoring it.", homefile); } if ( (dotstat == 0) && ( (dotbuf.st_dev != homebuf.st_dev) || (dotbuf.st_ino != homebuf.st_ino))) { if (access(dotfile, R_OK) == 0) gv_load(dotfile, "command"); else OOGLError(0, "Warning: file %s present but unreadable; ignoring it.", dotfile); } } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/main.h0000644000175000017500000000270512310110177016034 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #include "handle.h" extern void usepipe(char *pipedir, char *pipename, char *pipetype); extern void init_geomview(int argc, char **argv); extern void usage(char *me, char *morestuff); extern int parse_common_arg(int *acp, char ***avp); extern char *geomview_system_initfile; extern vvec vv_load_path; extern vvec vv_emodule_path; #define load_path VVEC(vv_load_path, char *) #define load_path_count VVCOUNT(vv_load_path) #define emodule_path VVEC(vv_emodule_path, char *) #define emodule_path_count VVCOUNT(vv_emodule_path) extern int gv_nwins; extern int gv_no_opengl; geomview-1.9.5/src/bin/geomview/common/motion.c0000644000175000017500000003321212310110177016405 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include #include "mg.h" #include "mouse.h" #include "drawer.h" #include "event.h" #include "ui.h" #include "motion.h" #include "transform.h" #include "space.h" #include "comm.h" #include "lang.h" typedef int (*ControlFunc)(int action, float x,float y,float t, float dx,float dy,float dt); typedef struct boundctl { char *buttons; ControlFunc function; float rate; } boundctl; /* These macros are passed to DTC and DSC as "functions". As a special case you can pass expressions like ".5 * X" which works because it expands properly. Be careful! */ #undef X #undef Y #undef Z #define ANGULAR 0 #define LINEAR 1 #define X mot.x #define Y mot.y #define Z mot.z #define ZERO 0 #define FAST 1.0 #define SLOW 0.1 static int minterp_switch(Event *event, boundctl *ctls); /* Define Transform Control */ #define DTC(name, interp, type, moving, center, frame, fx, fy, fz) \ int name(int action, float x, float y, float t, float dx, float dy, float dt) \ { \ Point3 mot; \ int useframe = interp(action, center, frame, dx, dy, &mot); \ \ D1PRINT(("%s: action=%3d x=%8f y=%8f t=%8f dx=%8f dy=%8f dt=%8f\n", \ #name, action, x, y, t, dx, dy, dt)); \ \ (uistate.inertia ? gv_transform_incr : gv_transform) \ ( moving, center, useframe, type, fx, fy, fz, dt, NO_KEYWORD ); \ return 1; \ } /* Define Scale Control */ #define DSC(name, func, id, f) \ int name(int action, float x, float y, float t, float dx, float dy, float dt) \ { \ if (action > 0) /* button went down */ \ dx = dy = 0; \ func( id, f(dx,dy) ); \ return 1; \ } static void maybe_scale(int id, float s) { /* If ND-viewing is active, then a scaling motion is very confusing because it only applies to one 3d sub-space. Instead, I change the behaviour of the "scale" button to directly change the ND-transform of "id". FIXME. We should handle this case as motion, but that would require quite some hacks. cH. */ if (drawerstate.NDim > 0) { gv_scale(id, s, s, s); } else { /* only allow mouse scaling in Euclidean space */ if (spaceof(id) == TM_EUCLIDEAN) { gv_transform(id, CENTERID, FOCUSID, SCALE_KEYWORD, s, s, s, 0, NO_KEYWORD); } return; } } static float scaleexp(float dx, float dy) { return exp((dx+dy)/2); } /* * Construct "mot" motion-scaling vector: * mot->z scales motions into the screen: is the frame camera's focal length. * mot->x and mot->y scale motions in the screen plane: * if 'linear', they're spatial distances (for translations); * otherwise, they're tangents of half-angles (for rotations). */ static float getcaminfo(int frame, int linear, Point3 *mot) { float aspect = 1; float focallen = 3; int perspective = 1; float halfyfield = .5; DView *dv = (DView *)drawer_get_object(frame); if(dv != NULL && ISCAM(dv->id)) { CamGet(dv->cam, CAM_ASPECT, &aspect); CamGet(dv->cam, CAM_FOCUS, &focallen); CamGet(dv->cam, CAM_PERSPECTIVE, &perspective); CamGet(dv->cam, CAM_HALFYFIELD, &halfyfield); } if(perspective && linear) halfyfield *= focallen; else if(!perspective && !linear) halfyfield /= focallen; mot->z = focallen; mot->y = halfyfield; mot->x = halfyfield * aspect; return aspect; } /* * Apply constraints to motion. * Change sign if we're moving in the object's own system. * Return the appropriate frame of motion (the camera or SELF). */ static int constrain(Point3 *mot, int framecamera) { if(uistate.constrained) { if(fabs(mot->x) < fabs(mot->y)) mot->x = 0; else mot->y = 0; } if(uistate.ownmotion) return SELF; return framecamera; } static int ROTATION(int action, int center, int frame, float dx, float dy, Point3 *mot) { if (action > 0) /* button went down */ mot->x = mot->y = mot->z = 0; else { float aspect = getcaminfo(frame, ANGULAR, mot); if(drawer_idmatch(center, frame)) { /* If we're rotating about the camera itself (e.g. in fly mode), try to * track the mouse: scale rotation according to angular field of view. */ mot->x *= -dy / aspect; mot->y *= dx * aspect; } else { /* Otherwise, just adjust for non-square windows & hope for the best. */ mot->x = -dy; mot->y = dx * aspect; } mot->z = .5*M_PI*(dx+dy); /* Scale Z-axis motion according to mouse x+y */ /* One full window width = half rotation */ } return constrain(mot, frame); } static int TRANSLATION(int action, int center, int frame, float dx, float dy, Point3 *mot) { if(action > 0) /* button went down */ mot->x = mot->y = mot->z = 0; else { getcaminfo(frame, LINEAR, mot); mot->x *= dx; mot->y *= dy; if(spaceof(frame) != TM_EUCLIDEAN) mot->z = 1; /* This is arbitrary; avoid moving too fast. */ mot->z *= .125 * (dx + dy); } return constrain(mot, frame); } static int STRANSLATION(int action, int center, int frame, float dx, float dy, Point3 *mot) { if(action > 0) /* button went down */ mot->x = mot->y = mot->z = 0; else { getcaminfo(frame, LINEAR, mot); mot->x *= dx; mot->y *= dy; mot->z = .125 * sinh(dx + dy); } return constrain(mot, frame); } #if 0 static int SCALING(int action, int center, int frame, float dx, float dy, Point3 *mot) { float scale; if(action > 0) /* button went down */ mot->x = mot->y = mot->z = 1; else { scale = .5*(dx + dy); mot->x = mot->y = mot->z = 1+scale; } return uistate.ownmotion ? SELF : frame; } #endif /* Kludge to make mouse-driven hyperbolic translations work correctly. If the selected center is literally "target", then translations are done with respect to the universe origin, rather than the object's origin. This is harmless in euclidean mode and important in hyperbolic mode so that wild spinning behavior does not occur. This change was originally in 1.70.1.1, and got lost in the shuffle. (Stuart and Tamara 5/14/93) Thus, Use TCENTERID as center for all translations. */ #define TCENTERID (uistate.centerid == TARGETID && \ drawerstate.space == TM_HYPERBOLIC ? UNIVERSE : CENTERID) /* * CONTROLS: * A control is a function which interprets a single mouse button-combination * action. Controls don't know which button was pressed. * Eventually, picking should be a control. */ /* * PLEASE, DO NOT CHANGE the controls without reading these naming conventions. * * TEST any changes made in hyperbolic and spherical space before installation * * the naming convention for controls: * controls start with 'ctl_' * next comes a letter describing the kind of motion, * e.g. 'r' for rotation or 't' for translation * next comes letters describing which axes are involved. * next comes three letters describing which objects are involved. * 'f' stands for FOCUSID, 'c' stands for CENTERID, 't' stands for TARGETID, * 'g' stands for GEOMID(uistate.targetgeom), and * 'C' stands for CAMID(uistate.targetcam). (there are none of these now) * finally come letters describing how the input is transformed into the * movement: * 'l' stands for linear */ DTC(ctl_rxy_tcf_l, ROTATION, ROTATE_KEYWORD, TARGETID, CENTERID, FOCUSID, X, Y, ZERO) DTC(ctl_rz_tcf_l, ROTATION, ROTATE_KEYWORD, TARGETID, CENTERID, FOCUSID, ZERO, ZERO, Z) DTC(ctl_txy_tcf_l, TRANSLATION, TRANSLATE_KEYWORD, TARGETID, TCENTERID, FOCUSID, X, Y, ZERO) DTC(ctl_tz_tcf_l, TRANSLATION, TRANSLATE_KEYWORD, TARGETID, TCENTERID, FOCUSID, ZERO, ZERO, Z) DTC(ctl_tsxy_tcf_l, STRANSLATION, TRANSLATE_SCALED_KEYWORD, TARGETID, TCENTERID, FOCUSID, X, Y, ZERO) DTC(ctl_tsz_tcf_l, STRANSLATION, TRANSLATE_SCALED_KEYWORD, TARGETID, TCENTERID, FOCUSID, ZERO, ZERO, Z) DTC(ctl_rxy_fff_l, ROTATION, ROTATE_KEYWORD, FOCUSID, FOCUSID, FOCUSID, X, Y, ZERO) DTC(ctl_tz_fff_l, TRANSLATION, TRANSLATE_KEYWORD, FOCUSID, FOCUSID, FOCUSID, ZERO, ZERO, -Z) DTC(ctl_tsz_fcf_l, STRANSLATION, TRANSLATE_SCALED_KEYWORD, FOCUSID, TCENTERID, FOCUSID, ZERO, ZERO, -Z) DTC(ctl_tswz_fff_l, TRANSLATION, TRANSLATE_KEYWORD,FOCUSID,FOCUSID,FOCUSID, ZERO, ZERO, -Z) DTC(ctl_rxy_fcf_l, ROTATION, ROTATE_KEYWORD, FOCUSID, CENTERID, FOCUSID, -X, -Y, ZERO) DSC(ctl_z_l, gv_zoom, FOCUSID, scaleexp) /* maybe_scale(), defined above, prevents scaling in non-Euclidean spaces */ DSC(ctl_s_l, maybe_scale, TARGETGEOMID, scaleexp) /* * Bindings: * Controls are bound together in useful functional groups (motion modes). * This binding is really a part of the user interface. */ boundctl bound_rotations[] = { {"leftmouse", ctl_rxy_tcf_l, FAST}, {"middlemouse", ctl_rz_tcf_l, FAST}, {"shift leftmouse", ctl_rxy_tcf_l, SLOW}, {"shift middlemouse", ctl_rz_tcf_l, SLOW}, {NULL, NULL} }; boundctl bound_translations[] = { {"leftmouse", ctl_txy_tcf_l, FAST}, {"middlemouse", ctl_tz_tcf_l, FAST}, {"shift leftmouse", ctl_txy_tcf_l, SLOW}, {"shift middlemouse", ctl_tz_tcf_l, SLOW}, {NULL, NULL} }; boundctl bound_stranslations[] = { /* Not used now - slevy 10/93 */ {"leftmouse", ctl_tsxy_tcf_l, FAST}, {"middlemouse", ctl_tsz_tcf_l, FAST}, {"shift leftmouse", ctl_tsxy_tcf_l, SLOW}, {"shift middlemouse", ctl_tsz_tcf_l, SLOW}, {NULL, NULL} }; boundctl bound_fly[] = { {"leftmouse", ctl_rxy_fff_l, FAST}, {"middlemouse", ctl_tswz_fff_l, FAST}, {"shift leftmouse", ctl_rxy_fff_l, SLOW}, {"shift middlemouse", ctl_tswz_fff_l, SLOW}, {NULL, NULL} }; boundctl bound_orbit[] = { {"leftmouse", ctl_rxy_fcf_l, FAST}, {"middlemouse", ctl_tsz_fcf_l, FAST}, {"shift leftmouse", ctl_rxy_fcf_l, SLOW}, {"shift middlemouse", ctl_tsz_fcf_l, SLOW}, {NULL, NULL} }; boundctl bound_zoom[] = { {"leftmouse", ctl_z_l, FAST}, {NULL, NULL} }; boundctl bound_scale[] = { {"leftmouse", ctl_s_l, FAST}, {NULL, NULL} }; int minterp_rotate(Event *event) { return minterp_switch(event, bound_rotations);} int minterp_translate(Event *event) /* not currently used */ {return minterp_switch(event, bound_translations);} int minterp_stranslate(Event *event) {return minterp_switch(event, bound_stranslations);} int minterp_fly(Event *event) {return minterp_switch(event, bound_fly);} int minterp_orbit(Event *event) {return minterp_switch(event, bound_orbit);} int minterp_zoom(Event *event) {return minterp_switch(event, bound_zoom);} int minterp_scale(Event *event) {return minterp_switch(event, bound_scale);} #if EXPERIMENTAL_MOTION_AVERAGING /* Ring buffer for motion averaging. * For estimating speed for inertial motion when we release the mouse. * Just extrapolating the last mouse delta may fail if we're redrawing * very quickly. So we keep more samples, and extrapolate motion over the * last redraw cycle or last human-reasonable time (.1 second), * whichever is longer. */ #define NMOTE 8 /* Must be a power of two */ #define MODMOTE(x) ((x) & (NMOTE-1)) static struct mote { float dx, dy; long dt; } mote[NMOTE]; static int mo; #endif static int minterp_switch(Event *event, boundctl *ctls) { int i; float x, y, dx, dy; long dt; char buttonsdown[100]; PRINT_EVENT(("minterp_switch", event)); D1PRINT(("interp_switch: ctls->buttons = %s\n", ctls->buttons)); strcpy(buttonsdown, ""); mousedisp(event, &dx, &dy, (unsigned long *)&dt, &drawerstate.winpos); D1PRINT(("minterp_switch: mousedisp returned : dx = %10f, dy = %10f, dt = %ld\n", dx, dy, dt)); if(dt <= 0 && !(dt == 0 && dx == 0 && dy == 0)) { /* Discredit it if -- * time is flowing backwards, or * we're being asked for finite motion in zero time. */ return 0; } #if EXPERIMENTAL_MOTION_AVERAGING mo = MODMOTE(mo+1); mote[mo].dx = dx; mote[mo].dy = dy; mote[mo].dt = dt; if(event->val == 0) { /* Mouse release: use recently-averaged dt to extrapolate * continuing motion. */ for(i = 1; i < NMOTE; i++) { struct mote *m = &mote[MODMOTE(mo-i)]; if(dt + m->dt > uistate.cursor_still) break; dx += m->dx; dy += m->dy; dt += m->dt; } i; /* For debugging */ } #endif mousemap(event->x, event->y, &x, &y, &drawerstate.winpos); if (button.shift) strcat(buttonsdown, "shift "); if (button.ctrl) strcat(buttonsdown, "ctrl "); if (button.left) strcat(buttonsdown, "leftmouse "); if (button.middle) strcat(buttonsdown, "middlemouse "); if(buttonsdown[0] != '\0') buttonsdown[strlen(buttonsdown)-1] = '\0'; for (i = 0; ctls[i].buttons != NULL; i++) { if (!strcmp(ctls[i].buttons, buttonsdown)) { return (ctls[i].function)(event->val, x,y,event->t, dx,dy, dt*.001/ctls[i].rate); } } return 0; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/motion.h0000644000175000017500000000235712310110177016420 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef MOTION_H #define MOTION_H int minterp_rotate(Event *event); int minterp_translate(Event *event); int minterp_stranslate(Event *event); int minterp_fly(Event *event); int minterp_orbit(Event *event); int minterp_zoom(Event *event); int minterp_scale(Event *event); #endif /* ! MOTION_H */ geomview-1.9.5/src/bin/geomview/common/mouse.c0000644000175000017500000000472712310110177016241 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ /* * mouse.c: mouse computations */ #include "window.h" #include "common.h" #include "mouse.h" Event oldmouse; static float olddist = 0; void mousezero(Event *event, WnPosition *wp) { oldmouse = *event; } void mousedisp(Event *event, float *dx, float *dy, unsigned long int *dt, WnPosition *wp) { *dx = 2. * (event->x - oldmouse.x) / (wp->xmax - wp->xmin + 1); *dy = 2. * (event->y - oldmouse.y) / (wp->ymax - wp->ymin + 1); *dt = event->t - oldmouse.t; D1PRINT(("mousedisp: dx <- %10f, dy <- %10f, dt <- %ld\n", *dx, *dy, *dt)); mousezero(event, wp); } void radialmousezero(Event *event, WnPosition *wp) { float x,y; float xw = wp->xmax - wp->xmin + 1; float yw = wp->ymax - wp->ymin + 1; x = (event->x - wp->xmin) / xw - 0.5; y = (event->y - wp->ymin) / yw - 0.5; olddist = sqrt( x*x + y*y ); } float radialmousedisp(Event *event, WnPosition *wp) { float x, y, dist, val; float xw = wp->xmax - wp->xmin + 1; float yw = wp->ymax - wp->ymin + 1; x = (event->x - wp->xmin) / xw - 0.5; y = (event->y - wp->ymin) / yw - 0.5; dist = sqrt( x*x + y*y ); val = dist - olddist; olddist = dist; return 2 * val; } void mousemap(int x, int y, float *rx, float *ry, WnPosition *wp) { *rx = 2. * (x - wp->xmin) / (wp->xmax - wp->xmin + 1) - 1; *ry = 2. * (y - wp->ymin) / (wp->ymax - wp->ymin + 1) - 1; } geomview-1.9.5/src/bin/geomview/common/mouse.h0000644000175000017500000000252012310110177016233 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef MOUSE_H #define MOUSE_H #include "common.h" void mousezero(Event *event, WnPosition *wp); void mousedisp(Event *event, float *dx, float *dy, unsigned long int *dt, WnPosition *wp); float radialmousedisp(Event *event, WnPosition *wp); void radialmousezero(Event *event, WnPosition *wp); void mousemap(int x, int y, float *dx, float *dy, WnPosition *wp); #endif /* ! MOUSE_H */ geomview-1.9.5/src/bin/geomview/common/ndshade.c0000644000175000017500000003731612310110177016517 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-20007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "hpointn.h" #include "../common/drawer.h" #include #ifndef alloca #include #endif #if 0 static void compute_mg_factor(NDstuff *nds); static inline void fast_map_ND_point(NDstuff *nds, HPointN *from, HPoint3 *to); #endif /* * Arguments: * mginfo - pointer to an "ndstuff" structure (from drawer.h), containing: * T - transformation from object to N-D camera space * axes - array of 4 axis indices, giving the subspace seen by this view * Tc - (dimension) x (n-color-axes) transform from object space to * color axis space. Use NULL if not projecting colors. * Given vectors in camera space, could get Tc with: * Tc = TmNConcat(T, {matrix of projection vectors}, NULL) * ncm - number of colormaps * cm - colormap array * p - the N-D HPointN to be transformed, in object space * np - resulting 3-D HPoint3 point, in camera space * c - resulting color; only changed if ncm > 0 * * Results: returns 1 if color was set, else 0. */ static int map_ND_point(mgNDctx *mgNDctx, HPointN *p, HPoint3 *np, ColorA *c) { NDstuff *nds = (NDstuff *)mgNDctx; #define iT nds->T #define iTc nds->Tc #define incm nds->ncm #define icm nds->cm #define ihc nds->hc ColorA ci; float t; int i; #if 0 /* cH: here is still room for optimization: provided that iT has * maximal rank (i.e. rank 4) it would be possible to factor out an * ordinary Transform and handle that one over to the MG layer. The * remaining N-Transform would act as identity on a 4x4 sub-space * which would reduce the number of floating point operations to * perform the projection. The MG layer uses an object-camera * transform anyway, so this would speed up things. * * Well. The code at the end of this files hacks this, but: the * resulting 4x4 factor is -- of course -- not orthogonal. Therefore * I stopped working at this optimization. The code for the * factorization is at the end of this file. cH. * */ fast_map_ND_point(nds, p, np); #else HPtNTransProj(iT, p, np); HPt3Dehomogenize(np, np); #endif if(incm > 0 && !(_mgc->astk->ap.flag & APF_KEEPCOLOR) && c != NULL) { ci.r = ci.g = ci.b = ci.a = 0; HPtNTransform(iTc, p, ihc); for(i = 0; i < incm; i++) { cent *ce = VVEC(icm[i].cents, cent); float v = ihc->v[i]; if(!(v > ce->v)) { ci.r += ce->c.r; ci.g += ce->c.g; ci.b += ce->c.b; ci.a += ce->c.a; } else { do ce++; while(v > ce->v); if((ce-1)->interp) { t = (v - (ce-1)->v) / (ce->v - (ce-1)->v); } else { t = 1; } ci.r += t*ce->c.r + (1-t)*(ce-1)->c.r; ci.g += t*ce->c.g + (1-t)*(ce-1)->c.g; ci.b += t*ce->c.b + (1-t)*(ce-1)->c.b; ci.a += t*ce->c.a + (1-t)*(ce-1)->c.a; } } /* XXX Clamp colors to range 0..1 here?? */ if(ci.r < 0) ci.r = 0; else if(ci.r > 1) ci.r = 1; if(ci.g < 0) ci.g = 0; else if(ci.g > 1) ci.g = 1; if(ci.b < 0) ci.b = 0; else if(ci.b > 1) ci.b = 1; if(ci.a < 0) ci.a = 0; else if(ci.a > 1) ci.a = 1; *c = ci; return 1; } return 0; #undef iT #undef iTc #undef iaxes #undef icm #undef incm #undef ihc } /* push/pop could be done much more efficiently, but ND is inefficient * anyway, so what. */ typedef struct savedCTX { TransformN *T; TransformN *Tc; TransformN *rest; Transform MGFactor; int perm[1]; } SavedCTX; static void *saveCTX(mgNDctx *NDctx) { NDstuff *nds = (NDstuff *)NDctx; SavedCTX *savedCTX = (SavedCTX *)OOGLNewNE(char, sizeof(SavedCTX)+(nds->T->idim-1)*sizeof(int), "SavedCTX"); savedCTX->T = nds->T; nds->T = TmNCopy(nds->T, NULL); if (nds->Tc) { savedCTX->Tc = nds->Tc; nds->Tc = TmNCopy(nds->Tc, NULL); } else { savedCTX->Tc = NULL; } #if 0 savedCTX->rest = nds->rest; nds->rest = TmNCopy(nds->rest, NULL); TmCopy(nds->MGFactor, savedCTX->MGFactor); memcpy(savedCTX->perm, nds->perm, nds->T->idim * sizeof(int)); mgpushtransform(); #endif return savedCTX; } static void pushTN(mgNDctx *NDctx, TransformN *TN) { NDstuff *nds = (NDstuff *)NDctx; TmNConcat(TN, nds->T, nds->T); if (nds->Tc) { TmNConcat(TN, nds->Tc, nds->Tc); } #if 0 compute_mg_factor(nds); mgtransform(nds->MGFactor); #endif } static void pushT(mgNDctx *NDctx, Transform T) { NDstuff *nds = (NDstuff *)NDctx; TmNApplyT3TN(T, NULL, nds->T); if (nds->Tc) { TmNApplyT3TN(T, NULL, nds->Tc); } #if 0 compute_mg_factor(nds); mgtransform(nds->MGFactor); #endif } static void restoreCTX(mgNDctx *NDctx, void *vsavedCTX) { NDstuff *nds = (NDstuff *)NDctx; SavedCTX *savedCTX = (SavedCTX *)vsavedCTX; #if 0 mgpoptransform(); #endif TmNDelete(nds->T); nds->T = savedCTX->T; if (nds->Tc) { TmNDelete(nds->Tc); } nds->Tc = savedCTX->Tc; #if 0 TmNDelete(nds->rest); nds->rest = savedCTX->rest; TmCopy(savedCTX->MGFactor, nds->MGFactor); memcpy(nds->perm, savedCTX->perm, nds->T->idim * sizeof(int)); #endif OOGLFree(savedCTX); } static mgNDctx NDctx_proto = { map_ND_point, saveCTX, pushTN, pushT, restoreCTX, NULL, }; NDstuff *drawer_init_ndstuff(DView *dv, TransformN *W2C, TransformN *W2U) { NDstuff *nds = OOGLNewE(NDstuff, "new NDstuff"); int dim = W2C->idim; #if 0 mgpushtransform(); #endif nds->mgNDctx = NDctx_proto; /* Initialize the color transform */ nds->ncm = dv->nNDcmap; nds->cm = dv->NDcmap; nds->W2c = NULL; nds->Tc = NULL; nds->hc = NULL; if(dv->nNDcmap > 0) { HPointN *caxis = NULL; int i, j; /* Build array of N-D-to-color projection vectors: it becomes a * matrix, multiplied by N-D row vector on the left, yielding an * array of dv->nNDcmap projections used for coloring. So it has * (dimension) rows, (dv->nNDcmap) columns. */ nds->W2c = TmNCreate(dim, dv->nNDcmap, NULL); nds->hc = HPtNCreate(dim, NULL); for(i = 0; i < dv->nNDcmap; i++) { cmap *cm = &dv->NDcmap[i]; int cdim = cm->axis->dim; int mindim = (dim < cdim) ? dim : cdim; HPointN *our_caxis = cm->axis; TransformN *TxC; if(cm->coords != UNIVERSE) { TxC = drawer_get_ND_transform(cm->coords, UNIVERSE); if(TxC) { our_caxis = caxis = HPtNTransform(TxC, cm->axis, caxis); TmNDelete(TxC); } } for(j = 0; j < mindim; j++) nds->W2c->a[j*dv->nNDcmap + i] = our_caxis->v[j]; } TmNConcat(W2U, nds->W2c, nds->W2c); HPtNDelete(caxis); } /* initialize the W2C geometry transform. Note that nds->W2C is a * projection matrix, i.e. it includes the mapping defined in * dv->NDperm. This spares a lot of unnecessary floating point * operations. */ nds->T = NULL; #if 0 nds->rest = NULL; nds->perm = OOGLNewNE(int, dim, "permutation for fast ND mapping"); #endif nds->W2C = TmNProject(W2C, dv->NDPerm, NULL); return nds; } void drawer_destroy_ndstuff(NDstuff *nds) { TmNDelete(nds->Tc); TmNDelete(nds->W2c); TmNDelete(nds->T); TmNDelete(nds->W2C); #if 0 TmNDelete(nds->rest); OOGLFree(nds->perm); #endif HPtNDelete(nds->hc); /* ... and finally do not forget to destroy nds. Gnah. */ OOGLFree(nds); #if 0 mgpoptransform(); #endif } /* install a new object transformation, this is simply a matter of * matrix multiplication; the resulting O2C transfrom will contain the * proper sub-space projection. */ void drawer_transform_ndstuff(NDstuff *nds, TransformN *T) { nds->T = TmNConcat(T, nds->W2C, nds->T); if (nds->W2c) { nds->Tc = TmNConcat(T, nds->W2c, nds->Tc); } #if 0 compute_mg_factor(nds); mgtransform(nds->MGFactor); #endif } #if 0 /* The stuff below is incomplete and does not work in its current * shape. See the comment at the start of map_ND_point(). */ /* Factor out a 4x4 matrix such that * * / I \ * (nds->T) = P | --- | A * \ B / * * with a permutation matrix P, an (Nd x 4) matrix B and a 4x4 matrix * A. The goal is to hand over A to the MG-layer (and thus possibly to * the hardware). This should speed up the projection process * considerably, because we need 16 FLOPS (matrix multiplication) less * than before. A is added to the object->screen transform which is * applied anyway. */ static inline void swap_rows(int r1, int r2, int n, HPtNCoord *Ta, int *perm) { int swapi, col; HPtNCoord swapf; if (r1 == r2) { return; } /* record permutation */ swapi = perm[r1]; perm[r1] = perm[r2]; perm[r2] = swapi; for (col = 0; col < 4; col++) { swapf = Ta[r1*4 + col]; Ta[r1*4 + col] = Ta[r2*4 + col]; Ta[r2*4 + col] = swapf; } } static inline void swap_cols(int rc1, int rc2, int n, HPtNCoord *Ta, Transform A) { HPtNCoord swapf; int row, col; if (rc1 == rc2) { return; } /* swap columns in T */ for (row = 0; row < n; row++) { swapf = Ta[row*4 + rc1]; Ta[row*4 + rc1] = Ta[row*4 + rc2]; Ta[row*4 + rc2] = swapf; } /* swap rows in A */ for (col = 0; col < 4; col++) { swapf = A[rc1][col]; A[rc1][col] = A[rc2][col]; A[rc2][col] = swapf; } } #define DEBUG_MG_FACTOR 1 static void compute_mg_factor(NDstuff *nds) { int idim = nds->T->idim; int i, row, col; TransformN *T; TransformPtr A = nds->MGFactor; int perm[idim]; HPtNCoord max, pivot; int maxrow, maxcol; T = nds->rest = TmNCopy(nds->T, nds->rest); for (i = 0; i < idim; i++) { perm[i] = i; } TmCopy(TM_IDENTITY, A); for (i = 0; i < 4; i++) { /* find pivot element */ max = 0.0; maxrow = maxcol = i; for (row = i; row < idim; row++) { for (col = i; col < 4; col++) { if (fabs(T->a[row*4+col]) > max) { max = fabs(T->a[row*4+col]); maxrow = row; maxcol = col; } } } /* exchange row i and maxrow */ swap_rows(i, maxrow, idim, T->a, perm); /* exchange column i and maxcol in T and row i and maxcol in A */ swap_cols(i, maxcol, idim, T->a, A); /* now perform the Gauss' elimination process; note that we have * to perform the operation on the columns of T as T operates from * the right. * * We perform the inverse operation on the rows of A. */ pivot = T->a[i*4+i]; /* Clear i-th row of T, record inverse operation in A */ for (col = i+1; col < 4; col++) { HPtNCoord factor; factor = T->a[i*4+col] / pivot; #if DEBUG_MG_FACTOR /* debugging: also perform the operation on the upper part of T */ for (row = 0; row < i+1; row++) { T->a[row*4+col] -= T->a[row*4+i] * factor; } #endif for (row = i+1; row < idim; row++) { T->a[row*4+col] -= T->a[row*4+i] * factor; } for (row = 0; row < 4; row++) { A[i][row] += A[col][row] * factor; } } } /* At this point T has the form * * / L \ * (nds->T) = P^{-1} | --- | A' * \ B' / * * with a lower triangular matrix L, proceed now by converting L * to the 4x4 unity matrix. * * We need to apply the operations only on B' and A' */ for (col = 4; --col >= 0;) { HPtNCoord factor; int col2; for (col2 = 0; col2 < col; col2++) { /* clear the col-th row */ factor = T->a[col*4+col2] / T->a[col*4+col]; #if DEBUG_MG_FACTOR /* debugging: also perform the operation on the upper part of T */ for (row = 0; row < 4; row++) { T->a[row*4+col2] -= T->a[row*4+col] * factor; } #endif for (row = 4; row < idim; row++) { T->a[row*4+col2] -= T->a[row*4+col] * factor; } for (row = 0; row < 4; row++) { A[col][row] += A[col2][row] * factor; } } /* finally scale the diagonal such that we really have an * identity matrix */ factor = T->a[col*4+col]; for (row = 0; row < 4; row++) { A[col][row] *= factor; } factor = 1.0 / T->a[col*4+col]; #if DEBUG_MG_FACTOR /* debugging: also perform the operation on the upper part of T */ for (row = 0; row < 4; row++) { T->a[row*4+col] *= factor; } #endif for (row = 4; row < idim; row++) { T->a[row*4+col] *= factor; } } for (row = 0; row < idim; row++) { nds->perm[row] = perm[row]; } for (col = 0; col < 4; col++) { HPt3Coord swap; swap = A[0][col]; A[0][col] = A[1][col]; A[1][col] = A[2][col]; A[2][col] = A[3][col]; A[3][col] = swap; } for (row = 4; row < idim; row++) { HPt3Coord swap; swap = T->a[row*4+0]; T->a[row*4+0] = T->a[row*4+1]; T->a[row*4+1] = T->a[row*4+2]; T->a[row*4+2] = T->a[row*4+3]; T->a[row*4+3] = swap; } #if DEBUG_MG_FACTOR for (row = 0; row < 4; row++) { HPt3Coord swap; swap = T->a[row*4+0]; T->a[row*4+0] = T->a[row*4+1]; T->a[row*4+1] = T->a[row*4+2]; T->a[row*4+2] = T->a[row*4+3]; T->a[row*4+3] = swap; } fprintf(stderr, "Permuation: "); for (row = 0; row < idim; row++) { fprintf(stderr, "%d ", perm[row]); } fprintf(stderr, "\nRest:\n"); TmNPrint(stderr, T); fprintf(stderr, "MG Factor:\n"); TmPrint(stderr, A); fprintf(stderr, "Origimal matrix:\n"); TmNPrint(stderr, nds->T); fprintf(stderr, "Product of factors:\n"); { TransformN *prod, *prod2; int i; prod = TmNCreate(idim, 4, NULL); for (row = 0; row < idim; row++) { for (col = 0; col < 4; col++) { for (i = 0; i < 4; i++) { prod->a[row*4+col] += T->a[row*4+i]*A[i][col]; } } } prod2 = TmNCreate(idim, 4, NULL); for (row = 0; row < idim; row++) { for (col = 0; col < 4; col++) { prod2->a[perm[row]*4+col] = prod->a[row*4+col]; } } /*TmNPrint(stderr, prod);*/ TmNPrint(stderr, prod2); TmNDelete(prod); TmNDelete(prod2); } #endif } /* Use the factorization computed above to map "from" to "to" * efficiently */ static inline void fast_map_ND_point(NDstuff *nds, HPointN *from, HPoint3 *to) { HPtNCoord *v = from->v; int idim; const int odim = 4; int *perm = nds->perm; int i; idim = nds->T->idim > from->dim ? from->dim : nds->T->idim; /* The following 4 lines used to consume 16 multiplications */ to->x = v[perm[1]]; to->y = v[perm[2]]; to->z = v[perm[3]]; to->w = v[perm[0]]; for (i = 4; i < idim; i++) { to->x += v[perm[i]] * nds->rest->a[i*odim+0]; to->y += v[perm[i]] * nds->rest->a[i*odim+1]; to->z += v[perm[i]] * nds->rest->a[i*odim+2]; to->w += v[perm[i]] * nds->rest->a[i*odim+3]; } /*HPt3Transform(nds->MGFactor, to, to);*/ #if 1 { HPoint3 tp[2]; static HPt3Coord max; HPtNTransProj(nds->T, from, tp); HPt3Transform(nds->MGFactor, to, tp+1); /**(tp+1) = *to;*/ if (HPt3Distance(tp, tp+1) > max) { max = HPt3Distance(tp, tp+1); fprintf(stderr, "max dist: %e\n", max); } } #endif } #endif /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/pickfunc.h0000644000175000017500000001612012310110177016706 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #define PICKFUNC(name, body, NDbody) \ static inline LObject *pickbody(char *coordsys, char *id, \ HPoint3 point, int pn, \ HPoint3 vertex, int vn, \ HPoint3 edge[2], int en, \ HPoint3 face[], int fn, \ int ppath[], int ppn, \ int vi, int ei[2], int ein, int fi) \ { \ do { \ body; \ } while (false); \ return Lt; \ } \ static inline LObject *pickNDbody(char *coordsys, char *id, \ float *point, int pn, \ float *vertex, int vn, \ float *edge, int en, \ float *face, int fn, \ int ppath[], int ppn, \ int vi, int ei[2], int ein, int fi) \ { \ do { \ NDbody; \ } while (false); \ return Lt; \ } \ LObject *name(Lake *lake, LList *args) \ { \ char *coordsys = NULL, *id = NULL; \ float *varpoint = NULL; int pn; \ float *varvertex = NULL; int vn; \ float *varedge = NULL; int en; \ float *varface = NULL; int fn; \ int *varppath = NULL; int ppn; \ int vi; \ int ei[2]; int ein = 2; \ int fi; \ LObject *res; \ \ LDECLARE(("pick", LBEGIN, \ LSTRING, &coordsys, \ LSTRING, &id, \ LHOLD, LVARARRAY, LFLOAT, &varpoint, &pn, \ LHOLD, LVARARRAY, LFLOAT, &varvertex, &vn, \ LHOLD, LVARARRAY, LFLOAT, &varedge, &en, \ LHOLD, LVARARRAY, LFLOAT, &varface, &fn, \ LHOLD, LVARARRAY, LINT, &varppath, &ppn, \ LINT, &vi, \ LHOLD, LARRAY, LINT, ei, &ein, \ LINT, &fi, \ LEND)); \ \ if (varpoint == NULL) { \ return Lnil; \ } \ \ if (pn <= 4) { \ HPoint3 point; \ HPoint3 vertex; \ \ if (varpoint) { \ point = *(HPoint3 *)varpoint; \ } \ if (varvertex) { \ vertex = *(HPoint3 *)varvertex; \ } \ res = pickbody(coordsys, id, \ point, pn, \ vertex, vn, \ (HPoint3 *)varedge, en, \ (HPoint3 *)varface, fn, \ varppath, ppn, vi, ei, ein, fi); \ } else { \ res = pickNDbody(coordsys, id, \ varpoint, pn, \ varvertex, vn, varedge, en, varface, fn, \ varppath, ppn, vi, ei, ein, fi); \ } \ \ if (varpoint) OOGLFree(varpoint); \ if (varvertex) OOGLFree(varvertex); \ if (varedge) OOGLFree(varedge); \ if (varface) OOGLFree(varface); \ if (varppath) OOGLFree(varppath); \ \ return res; \ } /* Note: the "if (1)" business above is to prevent a warning about the following statement ("return Lt") not being reached if the body itself returns. */ /* Note: Don't use DEFPICKFUNC any more. Use the newer PICKFUNC * instead. DEFPICKFUNC is provided for backward compatibility. * * cH: the above comment seemingly is ignored by everybody ... */ #define DEFPICKFUNC(helpstr, \ coordsys, \ id, \ point, pn, \ vertex, vn, \ edge, en, \ face, fn, \ ppath, ppn, \ vi, \ ei, ein, \ fi, \ body, \ NDbody) \ static inline LObject *pickbody(char *coordsys, char *id, \ HPoint3 point, int pn, \ HPoint3 vertex, int vn, \ HPoint3 edge[2], int en, \ HPoint3 face[], int fn, \ int ppath[], int ppn, \ int vi, int ei[2], int ein, int fi) \ { \ do { \ body; \ } while (false); \ return Lt; \ } \ static inline LObject *pickNDbody(char *coordsys, char *id, \ float *point, int pn, \ float *vertex, int vn, \ float *edge, int en, \ float *face, int fn, \ int ppath[], int ppn, \ int vi, int ei[2], int ein, int fi) \ { \ do { \ NDbody; \ } while (false); \ return Lt; \ } \ LDEFINE(pick, LVOID, helpstr) \ { \ char *coordsys = NULL, *id = NULL; \ float *var##point = NULL; int pn; \ float *var##vertex = NULL; int vn; \ float *var##edge = NULL; int en; \ float *var##face = NULL; int fn; \ int *var##ppath = NULL; int ppn; \ int vi; \ int ei[2]; int ein = 2; \ int fi; \ LObject *res; \ \ LDECLARE(("pick", LBEGIN, \ LSTRING, &coordsys, \ LSTRING, &id, \ LHOLD, LVARARRAY, LFLOAT, &var##point, &pn, \ LHOLD, LVARARRAY, LFLOAT, &var##vertex, &vn, \ LHOLD, LVARARRAY, LFLOAT, &var##edge, &en, \ LHOLD, LVARARRAY, LFLOAT, &var##face, &fn, \ LHOLD, LVARARRAY, LINT, &var##ppath, &ppn, \ LINT, &vi, \ LHOLD, LARRAY, LINT, ei, &ein, \ LINT, &fi, \ LEND)); \ \ if (var##point == NULL) { \ return Lnil; \ } \ \ if (pn <= 4) { \ HPoint3 point; \ HPoint3 vertex = { 0.0, 0.0, 0.0 }; \ \ if (var##point) { \ point = *(HPoint3 *)var##point; \ } \ if (var##vertex) { \ vertex = *(HPoint3 *)var##vertex; \ } \ res = pickbody(coordsys, id, \ point, pn, \ vertex, vn, \ (HPoint3 *)var##edge, en, \ (HPoint3 *)var##face, fn, \ var##ppath, ppn, vi, ei, ein, fi); \ } else { \ res = pickNDbody(coordsys, id, \ var##point, pn, \ var##vertex, vn, var##edge, en, var##face, fn, \ var##ppath, ppn, vi, ei, ein, fi); \ } \ \ if (var##point) OOGLFree(var##point); \ if (var##vertex) OOGLFree(var##vertex); \ if (var##edge) OOGLFree(var##edge); \ if (var##face) OOGLFree(var##face); \ if (var##ppath) OOGLFree(var##ppath); \ \ return res; \ } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/rman.c0000644000175000017500000001760712310110177016047 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Scott Wisdom, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "common.h" #include "drawer.h" #include "lang.h" #include "ui.h" #include "mg.h" #include "rman.h" #include "mgrib.h" #include /* for mgrib */ static char defname[] = "geom"; struct _rman rman = {MG_RIBCYLINDER, MG_RIBASCII, 0, MG_RIBTIFF, MG_RIBDOBG, defname}; static int ribtype(char *s, int type); static char RHelp[] = "\ Renderman:\n\ RR send RIB output to NNN.rib (default fileprefix == \"geom\")\n\ RC Emulate lines using cylinders (default)\n\ RP Emulate lines using polygons\n\ Ra choose ASCII RIB format (default)\n\ Rb choose BINARY RIB format\n\ Rt choose Display token to specify .tiff file (default)\n\ Rf choose Display token to specify framebuffer\n\ Rs Simulate background color with Polygon (default)\n\ Rx No background simulation - fully transparent (alpha) background\n\ "; /* * Interpret R keyboard commands. */ void rman_do(int suffix, int hasnumber, int number) { switch(suffix) { case '?': /* help message */ printf("%s", RHelp); break; case 'R': /* Write RenderMan snapshot */ if(hasnumber) rman.seqno = number; gv_rib_snapshot(FOCUSID, NULL); break; case 'C': /* (for photorman) chooses cylinder line emulation */ rman.line = MG_RIBCYLINDER; break; case 'P': /* (for photorman) chooses polygon line emulation */ rman.line = MG_RIBPOLYGON; break; case 'a': /* chooses ASCII format for RIB output */ rman.format = MG_RIBASCII; break; case 'b': /* chooses BINARY format for RIB output */ rman.format = MG_RIBBINARY; break; case 't': /* toggles Display to be tiff file or framebuffer */ rman.display = MG_RIBTIFF; break; case 'f': /* choose Display token to specify framebuffer */ rman.display = MG_RIBFRAME; break; case 's': /* simulate background color with polygon */ rman.background = MG_RIBDOBG; break; case 'x': /* no background color simulation - transparent background */ rman.background = MG_RIBNOBG; break; } } LDEFINE(rib_display, LVOID, "(rib-display [frame|tiff] FILEPREFIX)\n\ Set Renderman display to framebuffer (popup screen window) or a\n\ TIFF format disk file. FILEPREFIX is used to construct\n\ names of the form \"prefixNNNN.suffix\". (i.e. foo0000.rib)\n\ The number is incremented on every call to \"rib-snapshot\" and\n\ reset to 0000 when \"rib-display\" is called. TIFF files are given\n\ the same prefix and number as the RIB file (i.e. foo0004.rib\n\ generates foo0004.tiff). The default FILEPREFIX is \"geom\" and\n\ the default format is TIFF. (Note that geomview just generates a\n\ RIB file, which must then be rendered.)") { char *fileprefix; int type; LDECLARE(("rib-display", LBEGIN, LKEYWORD, &type, LSTRING, &fileprefix, LEND)); type = ribtype("rib-display", type); if (rman.fileprefix && rman.fileprefix != defname) OOGLFree(rman.fileprefix); rman.fileprefix = strdup(fileprefix); rman.display = type; rman.seqno = 0; return Lt; } LDEFINE(rib_snapshot, LVOID, "(rib-snapshot CAM-ID [filename])\n\ Write Renderman snapshot (in RIB format) of CAM-ID to .\n\ If no filename specified, see \"rib-display\" for explanation of\n\ the filename used.") { DView *view; Camera *cam = NULL; WnWindow *win; const Appearance *ap; mgcontext *ctx; char fname[1024]; char displayname[1024]; char *fileprefix = rman.fileprefix ? rman.fileprefix : defname; char *strend = NULL; FILE *f = NULL; int id, mgspace; char *filename = NULL; LDECLARE(("rib-snapshot", LBEGIN, LID, &id, LOPTIONAL, LSTRING, &filename, LEND)); if (filename) { /* explicit filename, don't use incremented fileprefix */ if (filename[0] == '-') { /* treat '-' as stdout */ sprintf(fname, "stdout"); sprintf(displayname, "geom.tiff"); f = stdout; } else { sprintf(fname, "%s", filename); if ((strend = strstr(filename, ".rib"))) { /* toss ".rib" */ strncpy(displayname, filename, strend-filename); displayname[strend-filename] = '\0'; } else { strcpy(displayname, filename); } strcat(displayname, ".tiff"); f = fopen(fname, "w"); } } else { /* autoincrement */ sprintf(fname, "%s%04d.rib", fileprefix, rman.seqno); sprintf(displayname, "%s%04d.tiff", fileprefix, rman.seqno); f = fopen(fname, "w"); rman.seqno++; } if(f == NULL) { OOGLError(1, "Can't create %s: %s", fname, sperror()); return Lnil; } if (rman.display == MG_RIBFRAME) { strcpy(displayname, fname); } fprintf(stderr, "Writing %s ...", fname); if(!ISCAM(id) || (view = (DView *)drawer_get_object(id)) == NULL) { OOGLError(1, "rib-snapshot: bad view!"); return Lnil; } mgctxselect(view->mgctx); mgctxget(MG_CAMERA, &cam); mgctxget(MG_SPACE, &mgspace); #if 0 /* Copy so that changed flags are set <- cH: what does that mean ???? */ ap = ApCopy(mggetappearance(NULL), NULL); #else ap = mggetappearance(); #endif mgctxget(MG_WINDOW, &win); if(cam == NULL || ap == NULL || win == NULL) { OOGLError(1, "rib-snapshot: trouble, %x %x %x", cam,ap,win); return Lnil; } mgdevice_RIB(); ctx = mgctxcreate(MG_CAMERA, cam, MG_APPEAR, ap, MG_WINDOW, win, MG_BACKGROUND, &view->backcolor, MG_SPACE, spaceof(WORLDGEOM), MG_RIBFORMAT, rman.format, MG_RIBLINEMODE, rman.line, MG_RIBFILE, f, MG_RIBDISPLAY, rman.display, MG_RIBDISPLAYNAME, displayname, MG_RIBBACKING, rman.background, MG_RIBSCENE, "geomview RIB snapshot", MG_RIBCREATOR, "mgrib driver - geomview", MG_SPACE, mgspace, MG_END); { /* Try to be as realistic as possible when dumping a RenderMan snapshot. * Create a RenderMan drawing context, install (hopefully) all the * attributes that draw_view() doesn't reset on its own, * plug the RenderMan ctx into the camera, and force a redraw. * Then undo the subterfuge. */ bool oldredraw = view->redraw; bool oldchanged = view->changed; mgcontext *oldctx = view->mgctx; view->mgctx = ctx; view->redraw = true; gv_draw(view->id); view->redraw = oldredraw, view->changed = oldchanged; view->mgctx = oldctx; } mgrib_flushbuffer(); /* now necessary to flush buffer to file */ mgctxdelete(ctx); #if 0 ApDelete(ap); #endif mgctxselect(view->mgctx); /* Revert to previous device */ if (f != stdout) fclose(f); fprintf(stderr, " done.\n"); return Lt; } static int ribtype(char *s, int type) { switch (type) { case TIFF_KEYWORD: return MG_RIBTIFF; case FRAME_KEYWORD: return MG_RIBFRAME; default: fprintf(stderr, "%s: invalid rib type (assuming \"tiff\")\n",s); return MG_RIBTIFF; } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/rman.h0000644000175000017500000000230512310110177016041 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Scott Wisdom, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef RMAN_H #define RMAN_H struct _rman { int line; int format; int seqno; int display; int background; char *fileprefix; }; extern struct _rman rman; extern void rman_do(int suffix, int hasnumber, int number); #endif /* RMAN_H */ geomview-1.9.5/src/bin/geomview/common/shaders.c0000644000175000017500000002742212310110177016537 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Software shaders. * These operate in the mg environment. */ #include "drawer.h" #include "mgP.h" #include "3d.h" #define DOT(a,b) ((a).x*(b).x + (a).y*(b).y + (a).z*(b).z) #define CCMUL(A,B,C) ((C).r=(A).r*(B).r, (C).g=(A).g*(B).g, (C).b=(A).b*(B).b) #define CCADD(A,B,C) ((C).r=(A).r+(B).r, (C).g=(A).g+(B).g, (C).b=(A).b+(B).b) #define CSCALE(s, A, B) ( (B).r = (A).r * s, (B).g = (A).g * s, (B).b = (A).b * s, (B).a = (A).b * s) #define CCSADD(A,B,s,C) \ ((C).r += (s)*(A).r*(B).r, \ (C).g += (s)*(A).g*(B).g, \ (C).b += (s)*(A).b*(B).b) /* Eye position as an HPoint3 */ #define EYE ((HPoint3 *) (_mgc->C2W[3])) /* Shading parameters, left here for easy dbx viewing. */ static float fog = 0.0; /* fog control */ static float hypk1 = .5; /* controls exponential falloff */ static float hypk2 = .0; /* controls exponential falloff */ static float sphk1 = .5; /* controls exponential falloff */ static float sphk2 = 0.0; /* safety zone around light */ /* * Note: code for the Euclidean shader now lives in src/lib/mg/common/mgshade.c. * This file contains only the non-Euclidean ones. */ #define HPt3R31GramSchmidt HPt3HypGramSchmidt #define HPt3R31Distance HPt3HypDistance #define HPt3R40GramSchmidt HPt3SphGramSchmidt #define HPt3R40Distance HPt3SphDistance /* * A routine to determine the bisector of two tangent vectors */ void HPt3R31Bisector(HPoint3 *Lt, HPoint3 *I, HPoint3 *H) { HPoint3 tmp1, tmp2; float a,b; HPt3Sub(I, Lt, &tmp1); a = HPt3R31Dot(I, &tmp1); b = HPt3R31Dot(Lt, &tmp1); if ( b == 0) b = 1; HPt3Scale(-(a/b), Lt, &tmp2); HPt3Add(I, &tmp2, H); if (H->w < 0) HPt3Scale(-1, H, H); return; } void HPt3R40Bisector(HPoint3 *Lt, HPoint3 *I, HPoint3 *H) { HPoint3 tmp1, tmp2; float a,b; HPt3Sub(I, Lt, &tmp1); a = HPt3R40Dot(I, &tmp1); b = HPt3R40Dot(Lt, &tmp1); if ( b == 0) b = 1; HPt3Scale(-(a/b), Lt, &tmp2); HPt3Add(I, &tmp2, H); return; } /* * Hyperbolic shader */ int hypshade(int nv, HPoint3 *v, Point3 *n, ColorA *c, ColorA *cs) { struct mgxstk *mx = _mgc->xstk; struct mgastk *ma = _mgc->astk; struct LtLight *l; int i, lno; HPoint3 V, n4, N, I; float s, ni; Color Ci; static LtLight *cachedlights[AP_MAXLIGHTS]; static int ncached = 0; static short cached_light_seq = -1; hypk1 = ma->lighting.attenmult; hypk2 = ma->lighting.attenmult2; fog = ma->lighting.attenconst>1 ? ma->lighting.attenconst-1 : 0; Ci.r = Ci.g = Ci.b = 0; CCSADD(ma->mat.ambient, ma->lighting.ambient, ma->mat.ka, Ci); /* for now, move lights to be inside hyperbolic space */ if(ma->light_seq != cached_light_seq) { LtLight **lp; float d; HPoint3 *L; for(i = 0; i < ncached; i++) LtDelete(cachedlights[i]); ncached = 0; LM_FOR_ALL_LIGHTS(&ma->lighting, i,lp) { if(ncached >= AP_MAXLIGHTS) break; cachedlights[ncached++] = l = LtCopy(*lp, NULL); /* use euclidean distance */ L = &l->globalposition; d = HPt3R30Dot(L, L); if (d >= 1) { /* move light to sphere of radius .8 */ d = .8/sqrt(d); L->x *= d; L->y *= d; L->z *= d; L->w = 1.0; } } cached_light_seq = ma->light_seq; } for(i = 0; i < nv; i++, v++, n++, c++, cs++) { /* Transform point by T */ HPt3Transform(mx->T, v, &V); /* V = v in world coords */ if (HPt3R31Dot(&V, &V) >= 0) /* point at infinity, or beyond */ continue; /* outside hyperbolic space */ HPt3R31Normalize(&V); /* lie on surface < , > = -1 */ HPt3Sub( (HPoint3 *) EYE, &V, &I ); /* I = EYE - V (point-to-eye vector) */ HPt3R31GramSchmidt(&V, &I); HPt3R31Normalize(&I); n4.x = n->x; n4.y = n->y; n4.z = n->z; n4.w = 1.0; HPt3R31GramSchmidt( v, &n4); HPt3R31Normalize(&n4); HPt3Transform(mx->T, &n4, &N);/* transform by inverse adjoint */ /* tangent space at V has a Euclidean (positive definite) structure */ ni = HPt3R31Dot(&N,&I); if (ni < 0) { float s = -1.0; HPt3Scale(s, &N, &N); } for(lno = ncached; --lno >= 0; ) { HPoint3 *L; HPoint3 Lt; float bright, ll, ln, light_intensity, d; l = cachedlights[lno]; L = &l->globalposition; /* Diffuse term */ /* first compute the color of arriving light */ bright = l->intensity; ll = HPt3R31Dot(L,L); if (ll >= 0) /* ignore lights outside of hspace */ continue; ln = HPt3R31Dot(L,&N); if(ln <= 0) /* Ignore lights shining from behind */ continue; /* compute the distance for computation of falloff of light */ d = HPt3R31Distance(L, &V); /* the following models the exponential falloff of intensity */ light_intensity = exp(-hypk1*d); /* now compute the cosine for diffuse shading */ Lt = l->globalposition; /* we'll change the values here */ HPt3Sub(&Lt, &V, &Lt); /* make it a difference vector */ HPt3R31GramSchmidt(&V, &Lt); HPt3R31Normalize(&Lt); d = HPt3R31Dot(&Lt, &N); /* cos of angle between L and N */ s = ma->mat.kd * bright * d * light_intensity; CCSADD(l->color, *c, s, Ci); if(ma->mat.ks > 0) { /* Specular term */ HPoint3 H; /* H: halfway between L and I */ HPt3R31Bisector(&Lt, &I, &H); HPt3R31Normalize(&H); s = HPt3R31Dot(&H, &N); /* cos of angle between H and N */ if (s < 0) continue; s = ma->mat.ks * bright * pow(s, ma->mat.shininess); CCSADD(l->color, ma->mat.specular, s, Ci); } } /* insert fog code */ if (fog) { float k1, k2; float d = HPt3HypDistance(&V, EYE); ColorA surfcolor, fogcolor; d = d - hypk2; /* fog-free sphere of radius euck2 */ if (d < 0) d = 0; k1 = exp( -fog * d); k2 = 1.0 - k1; CSCALE(k1, Ci, surfcolor); CSCALE(k2, _mgc->background, fogcolor); CCADD(surfcolor, fogcolor, Ci); } if(Ci.r < 0) Ci.r = 0; else if(Ci.r > 1) Ci.r = 1; if(Ci.g < 0) Ci.g = 0; else if(Ci.g > 1) Ci.g = 1; if(Ci.b < 0) Ci.b = 0; else if(Ci.b > 1) Ci.b = 1; *(Color *)cs = Ci; cs->a = c->a; } return 0; } int sphshade(int nv, HPoint3 *v, Point3 *n, ColorA *c, ColorA *cs) { struct mgxstk *mx = _mgc->xstk; struct mgastk *ma = _mgc->astk; struct LtLight *l; int i, lno; HPoint3 V, n4, N, I; float s, ni; Color Ci; static LtLight *cachedlights[AP_MAXLIGHTS]; static int ncached = 0; static short cached_light_seq = -1; sphk1 = ma->lighting.attenmult; sphk2 = ma->lighting.attenmult2; fog = ma->lighting.attenconst>1 ? ma->lighting.attenconst-1 : 0; /* "ambient" color */ Ci.r = Ci.g = Ci.b = 0; CCSADD(ma->mat.ambient, ma->lighting.ambient, ma->mat.ka, Ci); /* for now, move lights to be inside spherical space */ if(ma->light_seq != cached_light_seq) { float d; HPoint3 *L; LtLight **lp; for(i = 0; i < ncached; i++) LtDelete(cachedlights[i]); ncached = 0; LM_FOR_ALL_LIGHTS(&ma->lighting, i,lp) { if(ncached >= AP_MAXLIGHTS) break; cachedlights[ncached++] = l = LtCopy(*lp, NULL); /* use euclidean distance */ L = &l->globalposition; /* use euclidean distance */ d = HPt3R40Dot(L, L); if (d >= 1.0) { /* move light to be in S3 */ d = 1.0/sqrt(d); L->x *= d; L->y *= d; L->z *= d; L->w *= d; } } cached_light_seq = ma->light_seq; } for(i = 0; i < nv; i++, v++, n++, c++, cs++) { /* Transform point by T */ HPt3Transform(mx->T, v, &V); /* V = v in world coords */ HPt3R40Normalize(&V); /* lie on surface < , > = -1 */ /* I = EYE - V (point-to-eye vector) */ HPt3Sub( (HPoint3 *) EYE, &V, &I ); HPt3R40GramSchmidt(&V, &I); HPt3R40Normalize(&I); n4.x = n->x; n4.y = n->y; n4.z = n->z; n4.w = 1.0; HPt3R40GramSchmidt( v, &n4); HPt3R40Normalize(&n4); HPt3Transform(mx->T, &n4, &N);/* transform by inverse adjoint */ /* tangent space at V has a Euclidean (positive definite) structure */ ni = HPt3R40Dot(&N,&I); if (ni < 0) { float s = -1.0; HPt3Scale(s, &N, &N); } for(lno = ncached; --lno >= 0; ) { HPoint3 *L; HPoint3 Lt; float bright, ln, d, radius, light_intensity; l = cachedlights[lno]; L = &l->globalposition; /* Diffuse term */ /* first compute the color of arriving light */ bright = l->intensity; /*ll = HPt3R40Dot(L,L);*/ /* this should be 1.0 by above */ ln = HPt3R40Dot(L,&N); if(ln <= 0) /* Ignore lights shining from behind */ continue; /* compute the distance for computation of falloff of light */ d = HPt3R40Distance(L, &V); /* the amount of light from the source which arrives at the surface is inversely proportional to the area of the sphere centered at the light which contains the surface point. The radius of this sphere is the sin of the distance between L and V */ radius = sin((double) d); if (radius > sphk2) { float kk = (sphk2/radius); /* 0 <= sphk2 <= 1.0 */ light_intensity = pow(kk, -sphk1); } else light_intensity = 1.0; /* we model the atmosphere as a murky fluid that has exponential dissipation; sphk1 controls exponential drop off; value of 0 avoids any drop off */ d = HPt3R40Distance((HPoint3 *) EYE, &V); light_intensity *= exp(-sphk1 * d); /* now compute the cosine for diffuse shading */ Lt = l->globalposition; /* we'll change the values here */ HPt3Sub(&Lt, &V, &Lt); /* make it a difference vector */ HPt3R40GramSchmidt(&V, &Lt); HPt3R40Normalize(&Lt); d = HPt3R40Dot(&Lt, &N); /* cos of angle between L and N */ s = ma->mat.kd * bright * d * light_intensity; CCSADD(l->color, *c, s, Ci); if(ma->mat.ks > 0) { /* Specular term */ HPoint3 H; /* H: halfway between L and I */ HPt3R40Bisector(&Lt, &I, &H); HPt3R40Normalize(&H); s = HPt3R40Dot(&H, &N); /* cos of angle between H and N */ if (s < 0) continue; s = ma->mat.ks * bright * pow(s, ma->mat.shininess); CCSADD(l->color, ma->mat.specular, s, Ci); } } /* insert fog code */ if (fog) { float k1, k2; float d = HPt3SphDistance(&V, EYE); ColorA surfcolor, fogcolor; d = d - sphk2; /* fog-free sphere of radius euck2 */ if (d < 0) d = 0; k1 = exp( -fog * d); k2 = 1.0 - k1; CSCALE(k1, Ci, surfcolor); CSCALE(k2, _mgc->background, fogcolor); CCADD(surfcolor, fogcolor, Ci); } if(Ci.r < 0) Ci.r = 0; else if(Ci.r > 1) Ci.r = 1; if(Ci.g < 0) Ci.g = 0; else if(Ci.g > 1) Ci.g = 1; if(Ci.b < 0) Ci.b = 0; else if(Ci.b > 1) Ci.b = 1; *(Color *)cs = Ci; cs->a = c->a; } return 0; } mgshadefunc softshader(int camid) { switch(spaceof(camid)) { case TM_HYPERBOLIC: return hypshade; case TM_EUCLIDEAN: return mg_eucshade; case TM_SPHERICAL: return sphshade; default: return mg_eucshade; } } geomview-1.9.5/src/bin/geomview/common/space.c0000644000175000017500000004357212310110177016205 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include #include "drawer.h" #include "ui.h" #include "lang.h" #include "lisp.h" #include "mg.h" #include "geom.h" #include "vect.h" #include "color.h" #include "camera.h" #include "space.h" #define DGobj(obj) ((DGeom *)obj) #define DVobj(obj) ((DView *)obj) char * spacename(int space) { switch(space) { case TM_SPHERICAL: return "spherical"; case TM_EUCLIDEAN: return "euclidean"; case TM_HYPERBOLIC: return "hyperbolic"; default: return NULL; } } void camera_space_relabel(int id) { DView *dv = (DView *)drawer_get_object(id); char *extra=NULL; char *fmt; char label[256]; if(!ISCAM(id) || dv == NULL || dv->mgctx == NULL) return; mgctxselect(dv->mgctx); extra = keywordname(hmodelkeyword("", dv->hmodel)); switch(spaceof(WORLDGEOM)) { case TM_SPHERICAL: fmt = "%s (spherical %s view)"; break; case TM_HYPERBOLIC: fmt = "%s (hyperbolic %s view)"; break; case TM_EUCLIDEAN: fmt = "%s (Euclidean%s view)"; switch (dv->hmodel) { case VIRTUAL: case PROJECTIVE: extra = ""; break; case CONFORMALBALL: extra = " inverted"; break; } break; default: return; } sprintf(label, fmt, dv->name[1], extra); mgctxset(MG_WnSet, WN_NAME, label, WN_END, MG_END); } /* * Is this a good directory to select in the file browser by default? * Say it is if it contains the 3-char prefix of our space name. */ int our_space_dir(char *dirname) { char *sname, sub[4]; if((sname = spacename(spaceof(WORLDGEOM))) == NULL) return 0; sprintf(sub, "%.3s", sname); return (int)(long)strstr(dirname, sub); } Geom *unitsphere(int n, ColorA *color); #define N 50 Geom * unitsphere(int n, ColorA *color) { int i, j; float si[N+1], ci[N+1], sj[N+1], cj[N+1]; Point3 verts[(N-2 + N)*N]; short vcounts[N-2 + N/2]; short ccounts[N-2 + N/2]; Point3 *p; short *vc; Geom *g; float excess = 1. / cos(M_PI / n); for(i = 0; i <= n; i++) { float t = i * 2*M_PI / n; sj[i] = sin(t) * excess; cj[i] = cos(t) * excess; t = i * M_PI / n; si[i] = sin(t); ci[i] = cos(t); } memset(ccounts, 0, sizeof(ccounts)); ccounts[0] = color ? 1 : 0; /* Construct n-2 parallels */ p = verts; vc = vcounts; for(i = 1; i < n-1; i++) { float y = ci[i]; float r = si[i]; *vc++ = -n; /* Closed line with n vertices */ for(j = 0; j < n; j++) { p->x = r*cj[j]; p->y = y; p->z = r*sj[j]; p++; } } /* Construct n/2 meridians, each a full circle */ for(j = 0; j < n/2; j++) { float s = sj[j]; float c = cj[j]; *vc++ = -2*n; for(i = 0; i < n; i++) { p->x = c*si[i]; p->y = ci[i]; p->z = s*si[i]; p++; } for(i = n; i > 0; i--) { p->x = -c*si[i]; p->y = ci[i]; p->z = -s*si[i]; p++; } } g = GeomCreate("vect", CR_NVECT, n-2 + n/2, CR_VECTC, vcounts, CR_COLRC, ccounts, CR_NVERT, (n-2 + n) * n, CR_POINT, verts, CR_NCOLR, color ? 1 : 0, CR_COLOR, color, CR_END); return g; } void set_hsphere_draw(int id, int draw) { static ColorA color = { .3, .2, .15, .7 }; static Geom *hsphere = NULL; DView *dv; if (!ISCAM(id)) return; dv = (DView*)drawer_get_object(id); if (draw < 0) { /* toggle */ draw = (dv->hsphere == NULL); } if (draw) { if (!hsphere) { hsphere = unitsphere(16, &color); } dv->hsphere = hsphere; } else { dv->hsphere = NULL; } ui_maybe_refresh(id); } NDcam * NDcluster(char *name) { NDcam *c; for(c = drawerstate.NDcams; c != NULL; c = c->next) if(strcmp(c->name, name) == 0) return c; return NULL; } NDcam * NDnewcluster(char *name) { NDcam *c; c = NDcluster(name); if(c == NULL) { c = OOGLNewE(NDcam, "NDcam cluster"); c->name = strdup(name); c->C2W = TmNIdentity(TmNCreate(drawerstate.NDim,drawerstate.NDim,NULL)); c->W2C = NULL; c->next = drawerstate.NDcams; drawerstate.NDcams = c; } return c; } void NDdeletecluster(NDcam *c) { /* Add this someday. Note that there may be other references to this cluster. XXX */ } LDEFINE(ND_axes, LLIST, "(ND-axes CAMID [CLUSTERNAME [Xindex Yindex Zindex [Windex]]])\n\ In our model for N-D viewing (enabled by (dimension)), objects in\n\ N-space are viewed by N-dimensional \"camera clusters\".\n\ Each real camera window belongs to some cluster, and shows &\n\ manipulates a 3-D axis-aligned projected subspace of the N-space seen\n\ by its cluster. Moving one camera in a cluster affects its siblings.\n\ \n The ND-axes command configures all this. It specifies a camera's\n\ cluster membership, and the set of N-space axes which become the\n\ 3-D camera's X, Y, and Z axes. Axes are specified by their indices,\n\ from 1 to N for an N-dimensional space. Cluster CLUSTERNAME is\n\ implicitly created if not previously known.\n\ In principle it is possible to map the homogeneous component\n\ of a conformal 4 point to some other index; this would be done\n\ by specifying 0 for one of Xindex, Yindex or Zindex and giving\n\ Windex some positive value. This is probably not useful because\n\ Geomview does not support non-Euclidean geometries for in higher\n\ dimensions.\n\ \n\ To read a camera's configuration, use \"(echo (ND-axes CAMID))\".\n\ The return value is an array of 4 integers, the last one should\n\ be 0.") { int axes[4]; char *camname, *clustername = NULL; int i, cam; DView *dv; axes[0] = axes[1] = axes[2] = -1; axes[3] = 0; LDECLARE(("ND-axes", LBEGIN, LSTRING, &camname, LOPTIONAL, LSTRING, &clustername, LINT, &axes[0], LINT, &axes[1], LINT, &axes[2], LINT, &axes[3], LEND)); if((cam = drawer_idbyname(camname)) == NOID || (dv = (DView *)drawer_get_object(cam)) == NULL || !ISCAM(dv->id)) { OOGLError(0, "ND-axes: unknown camera %s", camname); return Lnil; } else if(axes[0] < 0) { /* return the current ND configuratino of cam */ LList *l = NULL; if(dv->cluster) { l = LListAppend(NULL, LTOOBJ(LSTRING)(&dv->cluster->name)); for(i = 0; i < 4; i++) l = LListAppend(l, LNew( LINT, &dv->NDPerm[i] )); } return LNew( LLIST, &l ); } else { /* possibly generate a new cluster, or add to an existing * cluster. NOTE: we first reset the camera to its default state. */ NDcam *c = NDnewcluster(clustername); for(i = 0; i < 4; i++) { if (axes[i] < 0) { const char names[4] = { 'X', 'Y', 'Z', 'W' }; OOGLError(1, "ERROR: bogus ND-axes specification (%d %d %d %d), %c-entry " "must not be negative.\n", axes[0], axes[1], axes[2], axes[3], names[i]); return Lnil; } } NDdeletecluster(dv->cluster); /* a no-op yet */ dv->cluster = c; for(i = 0; i < 4; i++) { dv->NDPerm[i] = axes[i]; } CamReset(dv->cam); dv->changed |= CH_GEOMETRY; return Lt; } } static void set_dimension(int d, TransformN **Tp, TransformN **Tinvp) { if(Tinvp) { TmNDelete(*Tinvp); *Tinvp = NULL; } if(Tp == NULL) { return; } if(d == 0) { TmNDelete(*Tp); *Tp = NULL; } else { if(TmNGetSize(*Tp, NULL,NULL) > d) { TmNDelete(*Tp); *Tp = NULL; } *Tp = TmNPad(*Tp, d, d, *Tp); } } LDEFINE(dimension, LLIST, "(dimension [N])\n\ Sets or reads the space dimension for N-dimensional viewing.\n\ (Since calculations are done using homogeneous coordinates,\n\ this means matrices are (N+1)x(N+1).)\n\ With no arguments, returns the current dimension, or 0 if\n\ N-dimensional viewing has not been enabled. Note that N has to be" "at least 4 to enable ND-viewing, otherwise ND-viewing will be" "disabled.") { int i, d = -1; LDECLARE(("dimension", LBEGIN, LOPTIONAL, LINT, &d, LEND)); if (d < 0) { d = drawerstate.NDim-1; if(d < 0) { d = 0; } return LNew(LINT, &d); } else { NDcam *c; if (d < 4) { /* we do not allow low-dimension ND-view */ d = 0; for(i = 0; i < dview_max; i++) { if(dview[i] && dview[i]->cluster) { NDdeletecluster(dview[i]->cluster); dview[i]->cluster = NULL; } } } else { d++; /* Include homogeneous coordinate drawerstate.NDim */ } if(drawerstate.NDim != d) { for(c = drawerstate.NDcams; c != NULL; c = c->next) { set_dimension(d, &c->C2W, &c->W2C); } for(i = 0; i < dview_max; i++) { if(dview[i]) { dview[i]->changed = CH_GEOMETRY; } } for(i = 0; i < dgeom_max; i++) { if(dgeom[i]) { set_dimension(d, &dgeom[i]->NDT, &dgeom[i]->NDTinv); dgeom[i]->bboxvalid = false; dgeom[i]->changed = CH_GEOMETRY; } } drawerstate.changed = true; drawerstate.NDim = d; } } return Lt; } LDEFINE(ND_xform, LTRANSFORMN, "(ND-xform OBJID [ntransform { idim odim ... }]\n" "Concatenate the given ND-transform with the current " "ND-transform of the object (apply the ND-transform to " "object ID, as opposed to simply setting its ND-transform)." "Note that ND-transforms have their homogeneous coordinate at " "index 0, while 3D transform have it at index 3.") { int id; TransformN *T = NULL; TmNStruct *ts = NULL; DObject *obj; NDcam *cl = NULL; LDECLARE(("ND-xform", LBEGIN, LID, &id, LTRANSFORMN, &ts, LEND)); if((obj = drawer_get_object(id)) == NULL || drawerstate.NDim == 0) return Lnil; if(ISGEOM(obj->id)) { T = ((DGeom *)obj)->NDT; } else if(ISCAM(obj->id) && (cl = ((DView *)obj)->cluster)) { T = cl->C2W; } if (!T) { T = REFGET(TransformN, ts->tm); } else { TmNConcat(ts->tm, T, T); } if(ISGEOM(obj->id)) { DGobj(obj)->NDT = T; GeomSet(DGobj(obj)->Item, CR_NDAXIS, DGobj(obj)->NDT, CR_END); obj->changed |= CH_GEOMETRY; } else if(cl != NULL) { cl->C2W = T; drawerstate.changed = true; } TmIdentity(obj->Incr); obj->redraw = true; obj->moving = (obj->updateproc != NULL); return Lt; } LDEFINE(ND_xform_set, LTRANSFORMN, "(ND-xform-set OBJID [ntransform { idim odim ... }])\n\ Sets the N-D transform of the given object.\n\ In dimension N, this is an (N+1)x(N+1) matrix, so in that case\n\ idim and odim are expected to be both equal to (N+1). Note that\n\ all cameras in a camera-cluster have the same N-D transform.\n" "Note that ND-transforms have their homogeneous coordinate at " "index 0, while 3D transform have it at index 3.") { int id; DObject *obj; TmNStruct *ts = NULL; TransformN *T = NULL; NDcam *cl = NULL; LDECLARE(("ND-xform-set", LBEGIN, LID, &id, LOPTIONAL, LTRANSFORMN, &ts, LEND)); if((obj = drawer_get_object(id)) == NULL || drawerstate.NDim == 0) return Lnil; if(ISGEOM(obj->id)) { T = ((DGeom *)obj)->NDT; } else if(ISCAM(obj->id) && (cl = ((DView *)obj)->cluster)) { T = cl->C2W; } /* (ND-xform-set id transformn { ... }) -> set transform */ TmNDelete(T); if(ISGEOM(obj->id)) { ((DGeom *)obj)->NDT = REFGET(TransformN, ts->tm); GeomSet(DGobj(obj)->Item, CR_NDAXIS, DGobj(obj)->NDT, CR_END); obj->changed |= CH_GEOMETRY; } else if(cl != NULL) { cl->C2W = REFGET(TransformN, ts->tm); drawerstate.changed = true; } return Lt; } LDEFINE(ND_xform_get, LTRANSFORMN, "(ND-xform-get ID [from-ID])\n\ Returns the N-D transform of the given object in the coordinate\n\ system of from-ID (default \"universe\"), in the sense\n\ * Transform = " "Note that ND-transforms have their homogeneous coordinate at " "index 0, while 3D transform have it at index 3.") { int from_id; int to_id = UNIVERSE; TmNStruct *ts; TransformN *tm; extern TransformN *drawer_get_ND_transform(int from_id, int to_id); LDECLARE(("ND-xform-get", LBEGIN, LID, &from_id, LOPTIONAL, LID, &to_id, LEND)); if((tm = drawer_get_ND_transform(from_id, to_id)) == NULL) return Lnil; ts = OOGLNewE(TmNStruct, "TmN"); ts->h = NULL; ts->tm = tm; return LNew(LTRANSFORMN, &ts); } LDEFINE(ND_color, LLIST, "(ND-color CAMID [ (( [ID] (x1 x2 x3 ... xN) v r g b a v r g b a ... )\n\ ((x1 ... xN) v r g b a v r g b a ...) ...)] )\n\ Specifies a function, applied to each N-D vertex, which determines the\n\ colors of N-dimensional objects as shown in camera CAMID.\n\ Each coloring function is defined by a vector (in ID's coordinate system)\n\ [x1 x1 ... xN] and by a sequence of value (v)/color(r g b a) tuples,\n\ ordered by increasing v. The inner product v = P.[x] is linearly\n\ interpolated in this table to give a color.\n\ If ID is omitted, the (xi) vector is assumed in universe coordinates.\n\ The ND-color command specifies a list of such functions; each vertex\n\ is colored by their sum (so e.g. green intensity could indicate\n\ projection along one axis while red indicated another.\n\ An empty list, as in (ND-color CAMID ()), suppresses coloring.\n\ With no second argument, (ND-color CAMID) returns that camera's\n\ color-function list.\n\ Even when coloring is enabled, objects tagged with the \"keepcolor\"\n\ appearance attribute are shown in their natural colors.\n") { int i, j, k, id; DView *dv; LList noarg; LList *l = &noarg, *ents; cmap *cm; cent *ce; char *err; int nents, nfields, ncolors; LDECLARE(("ND-color", LBEGIN, LID, &id, LOPTIONAL, LLITERAL, LLIST, &l, LEND)); if((dv = (DView *)drawer_get_object(id)) == NULL || !ISCAM(dv->id)) { OOGLError(0, "ND-color: expected camera name"); return Lnil; } if(l == &noarg) { ents = NULL; cm = dv->NDcmap; for(i = 0; i < dv->nNDcmap; i++, cm++) { DObject *dobj = drawer_get_object(cm->coords); char *dname = (dobj && dobj->name[1]) ? dobj->name[1] : "universe"; dname = strdup(dname); l = LListAppend(NULL, LNew(LSTRING, (char *)&dname)); l = LListAppend(l, LMakeArray(LFLOAT, (char *)(cm->axis->v+1), cm->axis->dim-1)); for(k = VVCOUNT(cm->cents), ce = VVEC(cm->cents, cent); --k > 0; ce++) { l = LListAppend(l, LNew(LFLOAT, (char *)&ce->v)); l = LListAppend(l, LNew(LFLOAT, (char *)&ce->c.r)); l = LListAppend(l, LNew(LFLOAT, (char *)&ce->c.g)); l = LListAppend(l, LNew(LFLOAT, (char *)&ce->c.b)); l = LListAppend(l, LNew(LFLOAT, (char *)&ce->c.a)); } ents = LListAppend(ents, LNew(LLIST, &l)); } return LNew(LLIST, &ents); } ents = l; nents = LListLength(ents); if(nents > MAXCMAP) { OOGLError(0, "Only %d colormaps allowed per camera; using first %d of %d", MAXCMAP, MAXCMAP, nents); nents = MAXCMAP; } cm = dv->NDcmap; for(i = 1; i <= nents; i++, cm++) { LObject *ent = LListEntry(ents, i); LList *entlist, *axis; int dim; /* * Each component of the 'ents' list looks like: * LLIST --- v0,r0,g0,b0,a0, v1,r1,g1,b1,a1, ... * x1,x2,x3,... */ if(! LFROMOBJ(LLIST)(ent, &entlist)) { err = "ND-color: expected list of lists"; goto no; } cm->coords = UNIVERSE; if( entlist->car->type == LSTRING ) { cm->coords = drawer_idbyname(LSTRINGVAL(entlist->car)); if(cm->coords == NOID) { OOGLError(0, "ND-color: unknown coordinate system %s, using 'universe'", LSTRINGVAL(entlist->car)); cm->coords = UNIVERSE; } entlist = entlist->cdr; } if(! LFROMOBJ(LLIST)(entlist->car, &axis)) { err = "ND-color: expected N-D projection axis"; goto no; } dim = LListLength(axis); cm->axis = cm->axis ? HPtNPad(cm->axis, dim + 1, cm->axis) : HPtNCreate(dim+1, NULL); /* The projection axis is a vector, so its homogeneous component is zero */ cm->axis->v[0] = 0; /* Extract the real components */ for(j = 1; j < dim+1; j++) { if(!LFROMOBJ(LFLOAT)(LListEntry(axis, j), &cm->axis->v[j])) { err = "Non-numeric entry in projection axis?"; goto no; } } entlist = entlist->cdr; /* Look at the remainder of the list */ nfields = LListLength(entlist); ncolors = nfields / 5; if(nfields % 5 != 0 || nfields == 0) { err = "Each colormap should contain a multiple of 5 numbers: v0 r0 g0 b0 a0 v1 r1 g1 b1 a1 ..."; goto no; } vvneeds(&cm->cents, ncolors+1); ce = VVEC(cm->cents, cent); for(j = 1; j <= nfields; j += 5, ce++) { ce->interp = 1; if(!LFROMOBJ(LFLOAT)(LListEntry(entlist, j), &ce->v) || !LFROMOBJ(LFLOAT)(LListEntry(entlist, j+1), &ce->c.r) || !LFROMOBJ(LFLOAT)(LListEntry(entlist, j+2), &ce->c.g) || !LFROMOBJ(LFLOAT)(LListEntry(entlist, j+3), &ce->c.b) || !LFROMOBJ(LFLOAT)(LListEntry(entlist, j+4), &ce->c.a) ) { err = "Non-numeric entry in colormap?"; goto no; } } VVCOUNT(cm->cents) = ncolors+1; ce = &VVEC(cm->cents, cent)[ncolors]; *ce = ce[-1]; ce->v = 1e20; /* Huge value terminates list */ } dv->nNDcmap = nents; dv->changed |= CH_GEOMETRY; return Lt; no: OOGLError(0, err); return Lnil; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/space.h0000644000175000017500000000231412310110177016177 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ extern char *spacename(int tm_spacecode); extern int our_space_dir(char *dirname); extern void camera_space_relabel(int camid); extern void set_hsphere_draw(int id, int draw); extern void space_set(int id, int new); extern Geom *unitsphere(int n, ColorA *color); geomview-1.9.5/src/bin/geomview/common/transform.c0000644000175000017500000017660512310110177017131 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "geomclass.h" #include "sphere.h" #include "mg.h" #include "drawer.h" #include "ui.h" #include "transform.h" #include "transformn.h" #include "pickP.h" #include "lang.h" #include "bbox.h" /* NOTE: This file consists of things which Nathaniel Thurston added during his re-doing of the motion stuff in summer 1992. This stuff should eventually be moved into other files --- some as part of geomview, others as part of the transform library. mbp Wed Aug 19 00:44:02 1992 */ #define ERROR(fmt, arg) OOGLError(1, fmt, arg) #define DGobj(obj) ((DGeom *)obj) #define DVobj(obj) ((DView *)obj) Motion *allMotions = NULL; int is_descendant(int id, int ancestor_id); int id_exists(int id); int get_parent(int id); void set_space(int new); void apply_ND_transform(Transform deltaT, int moving, int center, int frame); /* don't the next two belong to drawer.c? */ void drawer_set_ND_xform(int id, TransformN *T); TransformN *drawer_get_ND_transform(int from_id, int to_id); static void _translate(float amount[3], Point *pt, Transform T, int space, int frame); static void _translate_scaled(float amount[3], Point *pt, Transform T, int space, int frame); static void euclidean_translate(float amount[3], Point *pt, Transform T, int space, int frame); static void euclidean_translate_scaled(float amount[3], Point *pt, Transform T, int space, int frame); static void hyperbolic_translate(float amount[3], Point *pt, Transform T, int space, int frame); static void hyperbolic_translate_scaled(float amount[3], Point *pt, Transform T, int space, int frame); static void spherical_translate(float amount[3], Point *pt, Transform T, int space, int frame); static void spherical_translate_scaled(float amount[3], Point *pt, Transform T, int space, int frame); static void _rotate(float amount[3], Point *pt, Transform T, int space, int frame); static void _scale(float amount[3], Point *pt, Transform T, int space, int frame); static int make_bbox_center(int obj_id); /* Should go to drawer.c ... */ /* * This should DEFINITELY go somewhere else, but I'm not sure where * Geom *id_bbox(int objID, int coordsysID) * objID = id of the object to make the bounding box for * coordsysID = coordinate system in which to create the bounding box * -Celeste */ Geom *id_bbox(int geomID, int coordsysID) { int i; DGeom *geomObj; Geom *bbox = NULL, *other_bbox; Transform geom2coordsys; TransformN *geom2coordsysN; if (!ISGEOM(geomID)) { OOGLError(1, "Cannot create the bounding box of something which is\n" "not a geom."); return NULL; } if (drawerstate.NDim > 0) { MAYBE_LOOP(geomID, i, T_GEOM, DGeom, geomObj) { geom2coordsysN = drawer_get_ND_transform(geomObj->id, coordsysID); other_bbox = GeomBound(geomObj->Lgeom, NULL, geom2coordsysN); TmNDelete(geom2coordsysN); if (bbox == NULL) bbox = other_bbox; else { BBoxUnion3((BBox *)bbox, (BBox *)other_bbox, (BBox *)bbox); GeomDelete(other_bbox); } } } else { MAYBE_LOOP(geomID, i, T_GEOM, DGeom, geomObj) { drawer_get_transform(geomObj->id, geom2coordsys, coordsysID); other_bbox = GeomBound(geomObj->Lgeom, geom2coordsys, NULL); if (bbox == NULL) bbox = other_bbox; else { BBoxUnion3((BBox *)bbox, (BBox *)other_bbox, (BBox *)bbox); GeomDelete(other_bbox); } } } return bbox; } Geom *id_bsphere(int geomID, int coordsysID) { int i; DGeom *geomObj; Geom *sphere = NULL, *other_sphere, *obj; if (!ISGEOM(geomID)) { OOGLError(0, "id_bsphere: %s\n%s", "Cannot create the bounding sphere of something which is", "not a geom."); return NULL; } if (drawerstate.NDim > 0) { TransformN *geom2coordsys; DObject *camObj; int *NDPerm; static const int NDPermDflt[] = { 1, 2, 3, 0 }; if (ISCAM(coordsysID) && (camObj = drawer_get_object(coordsysID)) != NULL) { NDPerm = DVobj(camObj)->NDPerm; } else { NDPerm = (int *)NDPermDflt; } MAYBE_LOOP(geomID, i, T_GEOM, DGeom, geomObj) { if (geomObj->Lgeom == NULL) { continue; } geom2coordsys = drawer_get_ND_transform(geomObj->id, coordsysID); GeomGet(geomObj->Lgeom, CR_GEOM, &obj); other_sphere = GeomBoundSphere(obj, NULL, geom2coordsys, NDPerm, drawerstate.space); if (sphere == NULL) { sphere = other_sphere; } else { SphereUnion3((Sphere *)sphere, (Sphere *)other_sphere, (Sphere *)sphere); GeomDelete(other_sphere); } TmNDelete(geom2coordsys); } } else { Transform geom2coordsys; MAYBE_LOOP(geomID, i, T_GEOM, DGeom, geomObj) { drawer_get_transform(geomObj->id, geom2coordsys, coordsysID); if (geomObj->Lgeom == NULL) continue; GeomGet(geomObj->Lgeom, CR_GEOM, &obj); other_sphere = GeomBoundSphere(obj, geom2coordsys, NULL, NULL, drawerstate.space); if (sphere == NULL) sphere = other_sphere; else { SphereUnion3((Sphere *)sphere, (Sphere *)other_sphere, (Sphere *)sphere); GeomDelete(other_sphere); } } } return sphere; } int drawer_transform(int moving_id, int center_id, int frame_id, Keyword transform_type, float fx, float fy, float fz, float timeunit, char *repeat_type, Keyword smoothanim) { Motion motion; int i; float augment; if (smoothanim != NO_KEYWORD && smoothanim != SMOOTH_KEYWORD) { OOGLError(1, "Expected \"%s\" keyword or nothing, but got \"%s\".\n", keywordname(SMOOTH_KEYWORD), keywordname(smoothanim)); return 0; } motion.moving_id = real_id(moving_id); motion.center_id = real_id(center_id); if (motion.center_id == SELF) { motion.center_id = motion.moving_id; } else if (motion.center_id == BBOXCENTERID) { motion.center_id = make_bbox_center(motion.moving_id); } motion.frame_id = real_id(frame_id); if (motion.frame_id == SELF) { motion.frame_id = motion.moving_id; } else if (motion.frame_id == BBOXCENTERID) { motion.frame_id = make_bbox_center(motion.moving_id); } motion.amount[0] = fx; motion.amount[1] = fy; motion.amount[2] = fz; motion.timeunit = timeunit; motion.timeleft = 0; motion.smooth = 0; switch (transform_type) { case ROTATE_KEYWORD: motion.transform = _rotate; break; case TRANSLATE_KEYWORD: motion.transform = _translate; break; case E_TRANSLATE_KEYWORD: motion.transform = euclidean_translate; break; case H_TRANSLATE_KEYWORD: motion.transform = hyperbolic_translate; break; case S_TRANSLATE_KEYWORD: motion.transform = spherical_translate; break; case TRANSLATE_SCALED_KEYWORD: motion.transform = _translate_scaled; break; case E_TRANSLATE_SCALED_KEYWORD: motion.transform = euclidean_translate_scaled; break; case H_TRANSLATE_SCALED_KEYWORD: motion.transform = hyperbolic_translate_scaled; break; case S_TRANSLATE_SCALED_KEYWORD: motion.transform = spherical_translate_scaled; break; case SCALE_KEYWORD: /* Take logarithms so we can scale incrementally. * Refuse to scale down to zero, or to change sign. */ for(i = 0; i < 3; i++) motion.amount[i] = motion.amount[i] > 0 ? log(motion.amount[i]) : 0; motion.transform = _scale; break; default: ERROR("Undefined transform type %d", transform_type); return 0; } augment = 0; if(!strcmp(repeat_type, "transform-incr") && uistate.inertia > 1) { augment = 1 - 1./uistate.inertia; } delete_like_motions(&motion, augment); if (!strcmp(repeat_type, "transform-set")) set_motion(&motion); else { /* Avoid applying ineffective motions */ if(motion.amount[0]==0 && motion.amount[1]==0 && motion.amount[2]==0) return 1; if (!strcmp(repeat_type, "transform")) { if(motion.timeunit > 0) { motion.timeleft = motion.timeunit; motion.smooth = smoothanim == SMOOTH_KEYWORD; insert_motion(&motion); } else { apply_motion(&motion, motion.timeunit); } } else if (!strcmp(repeat_type, "transform-incr")) { insert_motion(&motion); } else { ERROR("unknown transform applier %s", repeat_type); return 0; } } return 1; } static void drawer_ND_position(int moving_id, int ref_id, char *position_type, int use_origin) { int i; DObject *moveObj; TransformN *ref2w, *w2moving, *T, *objT; HPointN *ptWorld, *ptMoving; Geom *bbox = NULL; int pdim = drawerstate.NDim; if (use_origin) { ref2w = drawer_get_ND_transform(ref_id, WORLDGEOM); ptWorld = HPtNCreate(pdim, NULL); HPtNTransform(ref2w, ptWorld, ptWorld); TmNDelete(ref2w); } else { if (spaceof(ref_id) != TM_EUCLIDEAN) OOGLError(1, "Computing bounding box while in non-Euclidean space"); bbox = id_bbox(ref_id, WORLDGEOM); if (!bbox) return; GeomGet(bbox, CR_NCENTER, &ptWorld); GeomDelete(bbox); } MAYBE_LOOP(moving_id, i, T_NONE, DObject, moveObj) { if (!strcmp(position_type, "position-at")) { /* NOTE: even if movingId is a camera we omit the focal length * here. */ w2moving = drawer_get_ND_transform(WORLDGEOM, moveObj->id); ptMoving = HPtNTransform(w2moving, ptWorld, NULL); T = TmNSpaceTranslateOrigin(NULL, ptMoving); HPtNDelete(ptMoving); TmNDelete(w2moving); } else if (!strcmp(position_type, "position-toward")) { /* This actually does not make too much sense if movObj is not a * camera; if it is a camera, then we "careful rotate" within its * sub-space. Otherwise we fake the standard { 0, 1, 2, -1 } * projection. * * If moving_id is indeed a camera, then we must not forget to * transform ptMoving3 by the private 3d transformation attached * to this camera. */ static const int NDPermDflt[] = { 1, 2, 3, 0 }; int *NDPerm = NULL; DObject *obj = NULL; Point ptMoving3; Transform T3; w2moving = drawer_get_ND_transform(WORLDGEOM, moveObj->id); ptMoving = HPtNTransform(w2moving, ptWorld, NULL); HPtNDehomogenize(ptMoving, ptMoving); if (ISCAM(moveObj->id) && (obj = drawer_get_object(moveObj->id)) != NULL) { NDPerm = DVobj(obj)->NDPerm; } else { NDPerm = (int *)NDPermDflt; } HPtNToHPt3(ptMoving, NDPerm, &ptMoving3); HPtNDelete(ptMoving); TmNDelete(w2moving); /* If this is a camera then we have an additional 3d transformations * which is appended to the cameras 3d W2C transform. */ if (ISCAM(moveObj->id)) { Transform camW2C; CamGet(DVobj(obj)->cam, CAM_W2C, &camW2C); HPt3Transform(camW2C, &ptMoving3, &ptMoving3); HPt3Dehomogenize(&ptMoving3, &ptMoving3); } /* construct the rotation */ TmCarefulRotateTowardZ(T3, &ptMoving3); if (ISCAM(moveObj->id)) { /* We have to conjugate T3 with this camera's private 3d * transform before we can apply it to the cluster's ND * transform. */ Transform camW2C; Transform camC2W; CamGet(DVobj(obj)->cam, CAM_C2W, &camC2W); CamGet(DVobj(obj)->cam, CAM_W2C, &camW2C); TmConcat(camW2C, T3, T3); TmConcat(T3, camC2W, T3); } T = TmNApplyDN(TmNIdentity(TmNCreate(pdim, pdim, NULL)), NDPerm, T3); } else if (!strcmp(position_type, "position")) { T = drawer_get_ND_transform(ref_id, moveObj->id); drawer_set_ND_xform(moveObj->id, T); TmNDelete(T); T = NULL; } else { break; } /* Now that we have computed an incremental transform for moveObj * apply it to its ND-transform. */ if (T) { if (ISGEOM(moveObj->id)) { objT = drawer_get_ND_transform(moveObj->id, WORLDGEOM); } else if (ISCAM(moveObj->id)) { objT = drawer_get_ND_transform(moveObj->id, UNIVERSE); } else { objT = NULL; } if (objT) { TmNConcat(T, objT, T); drawer_set_ND_xform(moveObj->id, T); TmNDelete(objT); } TmNDelete(T); /* FIXME: for consistency we maybe should also apply the proper sub-transform to the 3d transforms of all other cameras in the cluster (if we have a cluster) */ } } HPtNDelete(ptWorld); } /* * center = NULL or center = "center" ---> position-[at | toward] the * center of the bounding box of ref_id * center = "origin" ---> position-[at | toward] the origin of * ref_id's coordinate system */ void drawer_position(int moving_id, int ref_id, char *position_type, char *center) { int i; DObject *moveObj; Transform ref2w, w2moving, T; int use_origin; /* ptWorld = reference point in World coordinates, * ptMoving = reference point in coordinate system of moving object */ Point ptWorld, ptMoving; Geom *bbox = NULL; if (ref_id == SELF) ref_id = moving_id; if (center == NULL || !strcmp(center, "center")) use_origin = 0; else if (!strcmp(center, "origin")) use_origin = 1; else { OOGLError(1, "undefined center %s", center); return; } if (!ISGEOM(ref_id)) use_origin = 1; if (drawerstate.NDim > 0) { /* The ND-stuff needs special care. */ drawer_ND_position(moving_id, ref_id, position_type, use_origin); return; } /* First, get the point to which we are relatively positioning in * world coordinates (using world coordinates is somewhat arbitrary - * there just needs to be an intermediate coordinate system). */ if (use_origin) { drawer_get_transform(ref_id, ref2w, WORLDGEOM); ptWorld.x = ptWorld.y = ptWorld.z = 0; ptWorld.w = 1; HPt3Transform(ref2w, &ptWorld, &ptWorld); } else { if (spaceof(ref_id) != TM_EUCLIDEAN) OOGLError(1, "Computing bounding box while in non-Euclidean space"); bbox = id_bbox(ref_id, WORLDGEOM); if (!bbox) return; GeomGet(bbox, CR_CENTER, &ptWorld); GeomDelete(bbox); } MAYBE_LOOP(moving_id, i, T_NONE, DObject, moveObj) { drawer_get_transform(WORLDGEOM, w2moving, moveObj->id); HPt3Transform(w2moving, &ptWorld, &ptMoving); if (!strcmp(position_type, "position-at")) { TmSpaceTranslateOrigin(T, &ptMoving, spaceof(moving_id)); } else if (!strcmp(position_type, "position-toward")) TmCarefulRotateTowardZ(T, &ptMoving); else if (!strcmp(position_type, "position")) drawer_get_transform(ref_id, T, moveObj->id); else { ERROR("undefined position type %s", position_type); return; } drawer_post_xform(moveObj->id, T); } } void set_motion(Motion *motion) { TransformStruct ts; ts.h = NULL; TmIdentity(ts.tm); gv_xform_set(motion->moving_id, &ts); if (drawerstate.NDim > 0) { /* Note: the following resets the *entire* N-D xform to the * identity, not just that in the subspace we're looking through. * Might want to have finer control. XXX - 7/28/93, slevy & holt */ drawer_set_ND_xform(motion->moving_id, NULL); } apply_motion(motion, motion->timeunit); } void apply_motion(Motion *motion, float dt) { Transform T_m, T_c, T_f, T_l; Transform T_R, T_Rinv, T; Point pt; float amount[3]; float tscale; if (motion->moving_id == UNIVERSE || !id_exists(motion->moving_id) || !id_exists(motion->center_id) || !id_exists(motion->frame_id)) { motion->timeleft = 0; /* Prevent recursion */ delete_like_motions(motion, 0.); return; } drawer_get_transform(motion->moving_id, T_m, UNIVERSE); drawer_get_transform(motion->center_id, T_c, UNIVERSE); drawer_get_transform(motion->frame_id, T_f, UNIVERSE); /* If the frame is in a different space than the center, then translate the frame to the center of the universe. This is really a hack meant to deal with Euclidean cameras looking at models of hyperbolic space; it arranges for the frame to appear at the center of the universe in case it lies outside the model. */ if (spaceof(motion->frame_id) != spaceof(motion->center_id)) { pt.x = pt.y = pt.z = 0; pt.w = 1; TmInvert(T_f, T); PtTransform(T, &pt, &pt); TmSpaceTranslateOrigin(T, &pt, spaceof(motion->frame_id)); TmConcat(T, T_f, T_f); } if (motion->frame_id != motion->center_id) { /* Find the location of the origin of T_c in T_f */ /* location = origin . T_c . Inverse[T_f] */ pt.x = pt.y = pt.z = 0; pt.w = 1; TmInvert(T_f, T); TmConcat(T_c, T, T); PtTransform(T, &pt, &pt); /* Move T_f so that its origin coincides with that of T_c */ TmSpaceTranslateOrigin(T, &pt, spaceof(motion->moving_id)); TmConcat(T, T_f, T_f); } /* Find the transformation from T_f to T_m */ TmInvert(T_f, T_R); TmConcat(T_m, T_R, T_R); /* Compute the local transformation. pt may be used for scaling */ /* If a time unit was specified along with the motion, * scale the motion according to elapsed "real" time. * If no time unit provided, apply exactly the given motion. */ if (motion->timeunit < .00001) { if (motion->timeunit) fprintf(stderr, "motion->timeunit = %x\n", (unsigned)motion->timeunit); motion->timeunit = 0.0; } tscale = (motion->timeunit != 0.) ? dt / motion->timeunit : 1.0; if(motion->timeleft != 0) { /* Animating? */ float t0 = motion->timeleft / motion->timeunit; float t1 = t0 - tscale; if(t1 < 0) t1 = 0; tscale = motion->smooth ? t0*t0*(3 - 2*t0) - t1*t1*(3 - 2*t1) : t0 - t1; } amount[0] = motion->amount[0] * tscale; amount[1] = motion->amount[1] * tscale; amount[2] = motion->amount[2] * tscale; pt.x = pt.y = pt.z = 0; pt.w = 1; HPt3Transform(T_R, &pt, &pt); (motion->transform)(amount, &pt, T_l, spaceof(motion->moving_id), motion->frame_id); #ifdef notdef /* No, this is wrong! -slevy */ /* * We want to consider the object hierararchy as being rooted at * frame_id. The practical effect of this consideration is that * transformations act backwards when the moving id is an ancestor * of the frame id. */ if (is_descendant(motion->frame_id, motion->moving_id)) { TmInvert(T_l, T); TmCopy(T, T_l); } #endif if(drawerstate.NDim == 0) { /* Conjugate the local transform to put it into the coordinate * system of T_m */ TmInvert(T_R, T_Rinv); TmConcat(T_R, T_l, T); TmConcat(T, T_Rinv, T); if (!finite(T[0][0])) { fprintf(stderr, "Matrix is not finite!\n"); } else { /* Apply the matrix to the moving object */ drawer_post_xform(motion->moving_id, T); } } else { /* Apply subspace transform to the N-dimensional matrices. */ apply_ND_transform(T_l, motion->moving_id, motion->center_id, motion->frame_id); } if(motion->timeleft) { motion->timeleft -= dt; if(motion->timeleft <= 0) { motion->timeleft = 0; /* Prevent recursion */ delete_motion(motion); } } } static void _translate(float amount[3], Point *pt, Transform T, int space, int frame) { TmSpaceTranslate(T, amount[0], amount[1], amount[2], space); } static void euclidean_translate(float amount[3], Point *pt, Transform T, int space, int frame) { TmTranslate(T, amount[0], amount[1], amount[2]); } static void hyperbolic_translate(float amount[3], Point *pt, Transform T, int space, int frame) { TmHypTranslate(T, amount[0], amount[1], amount[2]); } static void spherical_translate(float amount[3], Point *pt, Transform T, int space, int frame) { TmSphTranslate(T, amount[0], amount[1], amount[2]); } static void _translate_scaled(float amount[3], Point *pt, Transform T, int space, int frame) { double dist = 1; float scaled_amount[3]; switch (space) { default: case TM_EUCLIDEAN: dist = sqrt(pt->x * pt->x + pt->y * pt->y + pt->z * pt->z) + scaleof(frame) * drawerstate.motionscale; break; case TM_HYPERBOLIC: /* NYI */ break; case TM_SPHERICAL: /* NYI */ break; } scaled_amount[0] = amount[0] * dist; scaled_amount[1] = amount[1] * dist; scaled_amount[2] = amount[2] * dist; _translate(scaled_amount, pt, T, space, frame); } static void euclidean_translate_scaled(float amount[3], Point *pt, Transform T, int space, int frame) { _translate_scaled(amount, pt, T, TM_EUCLIDEAN, frame); } static void hyperbolic_translate_scaled(float amount[3], Point *pt, Transform T, int space, int frame) { hyperbolic_translate(amount, pt, T, space, frame); /* scaling is NYI */ } static void spherical_translate_scaled(float amount[3], Point *pt, Transform T, int space, int frame) { spherical_translate(amount, pt, T, space, frame); /* scaling is NYI */ } static void _rotate(float amount[3], Point *pt, Transform T, int space, int frame) { float dist = sqrt(amount[0]*amount[0] + amount[1]*amount[1] + amount[2]*amount[2]); TmRotate(T, dist, (Point3 *)amount); } static void _scale(float amount[3], Point *pt, Transform T, int space, int frame) { TmScale(T, exp(amount[0]),exp(amount[1]),exp(amount[2])); } void insert_motion(Motion *motion) { Motion *copy = OOGLNew(Motion); *copy = *motion; copy->next = allMotions; allMotions = copy; } void apply_all_motions(float dt) { Motion *m, *next; for (m = allMotions; m; m = next) { next = m->next; apply_motion(m, dt); } } void delete_motion(Motion *m) { Motion **s; for(s = &allMotions; *s != m && *s != NULL; s = &(*s)->next) ; if(*s == m) { *s = m->next; if(m->timeleft) /* If we're in mid-animation, ... */ apply_motion(m, 1e10); /* finish anim step before cancelling. */ /* It will free itself. */ else OOGLFree(m); } } static int is_translation(Motion *m) { return m->transform != _rotate && m->transform != _scale; } void delete_like_motions(Motion *m, float augment) { Motion **s = &allMotions; Motion *n; int was_translation = is_translation(m); while (*s) { if ((*s)->moving_id == m->moving_id /* && (*s)->center_id == m->center_id --- this makes motion more intuitive && (*s)->frame_id == m->frame_id --- njt*/ && ((*s)->transform == m->transform || /* Consider scaled and non-scaled translations equivalent */ (was_translation && is_translation(*s))) ) { if(augment != 0) { /* Incorporate some fraction of the existing motion into the * motion that is replacing it. */ float scl = augment * ((*s)->timeunit!=0 && m->timeunit!=0 ? m->timeunit / (*s)->timeunit : 1); m->amount[0] = (1-augment)*m->amount[0] + scl*(*s)->amount[0]; m->amount[1] = (1-augment)*m->amount[1] + scl*(*s)->amount[1]; m->amount[2] = (1-augment)*m->amount[2] + scl*(*s)->amount[2]; } n = (*s)->next; if((*s)->timeleft) /* If we're in mid-animation, */ apply_motion(*s, 1e10); /* finish anim step before cancelling */ else OOGLFree(*s); *s = n; } else { s = &(*s)->next; } } } void stop_motions(int id) { Motion **s = &allMotions; Motion *n; while (*s) { if ((*s)->moving_id == id) { /* Should we finish partially-complete animations? */ n = (*s)->next; OOGLFree(*s); *s = n; } else { s = &(*s)->next; } } } void do_motion(float dt) { Motion *s,*next; for (s = allMotions; s; s = next) { next = s->next; apply_motion(s, dt); } } LDEFINE(zoom, LVOID, "(zoom CAM-ID FACTOR)\n\ Zoom CAM-ID, multiplying its field of view by FACTOR.\n\ FACTOR should be a positive number.") { float width; DView *dv; int id; float amount; LDECLARE(("zoom", LBEGIN, LID, &id, LFLOAT, &amount, LEND)); id = real_id(id); if (!ISCAM(id) || !(dv = (DView *)drawer_get_object(id))) { OOGLError(0, "zoom: Can only zoom a camera"); return Lnil; } CamGet(dv->cam, CAM_HALFYFIELD, &width); CamSet(dv->cam, CAM_HALFYFIELD, width / amount, CAM_END); CamGet(dv->cam, CAM_FOV, &width); drawer_float(id, DRAWER_FOV, width); return Lt; } LDEFINE(ezoom, LVOID, "(ezoom GEOM-ID FACTOR)\n\ Same as zoom but multiplies by exp(zoom). Obsolete.") { int id; float f; LDECLARE(("ezoom", LBEGIN, LID, &id, LFLOAT, &f, LEND)); gv_zoom( id, (float)exp((float)f) ); return Lt; } LDEFINE(scale, LVOID, "(scale GEOM-ID FACTOR [FACTORY FACTORZ])\n\ Scale GEOM-ID, multiplying its size by FACTOR. The factors \n\ should be positive numbers. If FACTORY and FACTORZ are \n\ present and non-zero, the object is scaled by FACTOR in x, by \n\ FACTORY in y, and by FACTORZ in z. If only FACTOR is present, \n\ the object is scaled by FACTOR in x, y, and z. Scaling only \n\ really makes sense in Euclidean space. Mouse-driven scaling in \n\ other spaces is not allowed; the scale command may be issued \n\ in other spaces but should be used with caution because it may \n\ cause the data to extend beyond the limits of the space.\n\ \n\ For the ND case only (scale GEOM-ID FACTOR) is supported, i.e.\n\ the optional FACTORY and FACTORZ arguments are ignored. You can,\n\ of course, scale GEOM-ID by different factors in different directions\n\ by calling (ND-xform GEOM-ID TRANSFORMN) where TRANSFORMN is a\n\ diagonal ND transform.") { int id; float x, y = 0.0, z = 0.0; LDECLARE(("scale", LBEGIN, LID, &id, LFLOAT, &x, LOPTIONAL, LFLOAT, &y, LFLOAT, &z, LEND)); if (!ISGEOM(id = real_id(id))) { OOGLError(0, "scale: Can only scale geometry."); return Lnil; } if(drawerstate.NDim > 0) { /* We have to scale the ND-xform of id _ONLY_, otherwise we will * get funny results :) */ TmNStruct tsN; HPointN *scale = HPtNCreate(drawerstate.NDim, NULL); int i; tsN.h = NULL; for (i = 1; i < drawerstate.NDim; i++) { scale->v[i] = x; } tsN.tm = TmNScale(NULL, scale); HPtNDelete(scale); gv_ND_xform(id, &tsN); TmNDelete(tsN.tm); } else { TransformStruct ts; ts.h = NULL; if (y != 0.0 && z != 0.0) { TmScale(ts.tm, x, y, z); } else { TmScale(ts.tm, x, x, x); } gv_xform(id, &ts); } return Lt; } LDEFINE(escale, LVOID, "(escale GEOM-ID FACTOR)\n\ Same as scale but multiplies by exp(scale). Obsolete.") { int id; float f; LDECLARE(("escale", LBEGIN, LID, &id, LFLOAT, &f, LEND)); f = exp(f); gv_scale( id, f, f, f ); return Lt; } /* Concat T with the current object's world transform, keeping the * normalization (obsolete) into account. So "T" is an incremental * transform. */ void drawer_post_xform(int id, Transform T) { TransformStruct ts; Transform N, NInv; DObject *dobj; if((dobj = drawer_get_object(id)) == NULL) { return; } ts.h = NULL; if (ISGEOM(id)) { GeomGet(((DGeom *)dobj)->Item, CR_AXIS, ts.tm); if (((DGeom *)dobj)->citizenship == ORDINARY) { GeomGet(((DGeom *)dobj)->Inorm, CR_AXIS, N); TmInvert(N, NInv); TmConcat(NInv, T, T); TmConcat(T, N, T); } } else { CamGet(((DView *)dobj)->cam, CAM_C2W, ts.tm); } TmConcat(T, ts.tm, ts.tm); gv_xform_set(id, &ts); } int motions_exist() { return allMotions != NULL; } /* The following functions really don't belong here. Please move them. */ int is_descendant(int id, int ancestor_id) { DGeom *dg; if (id == ancestor_id) return 1; else if (ancestor_id == WORLDGEOM && (dg = (DGeom *)drawer_get_object(id)) != NULL && ISGEOM(dg->id) && dg->citizenship == ORDINARY) return 1; else return 0; } LDEFINE(real_id, LSTRING, "(real-id ID)\n\ Returns a string canonically identifying the given ID,\n\ or \"nil\" if the object does not exist. Examples:\n\ (if (real-id fred) (delete fred))\n\ deletes \"fred\" if it exists but reports no error if it doesn't, and\n\ (if (= (real-id targetgeom) (real-id World)) () (delete targetgeom))\n\ deletes \"targetgeom\" if it is different from the World.\n") { int id; char *str; DObject *obj; LDECLARE(("real-id", LBEGIN, LSTRING, &str, LEND)); id = drawer_idbyname(str); obj = drawer_get_object(id); if(obj == NULL) return Lnil; str = obj->name[1] ? obj->name[1] : obj->name[0]; return (LTOOBJ(LSTRING))(&str); } int real_id(int id) { if (id > 0) return id; switch(id) { case UNIVERSE: return UNIVERSE; break; case SELF: return SELF; break; case BBOXCENTERID: return BBOXCENTERID; break; case FOCUSID: return CAMID(uistate.mousefocus); break; case TARGETID: return real_id(uistate.targetid); break; case CENTERID: return real_id(uistate.centerid); break; case TARGETGEOMID: return GEOMID(uistate.targetgeom); break; case TARGETCAMID: return CAMID(uistate.targetcam); break; case ALLGEOMS: return WORLDGEOM; break; case ALLCAMS: return ALLCAMS; break; case DEFAULTCAMID: return DEFAULTCAMID; break; default: ERROR("bizarre id %d", id); return WORLDGEOM; break; } } int id_exists(int id) { return id == UNIVERSE || drawer_get_object(id) != NULL; } LDEFINE(transform, LVOID, "(transform objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [dt [\"smooth\"]])\n" "Apply a motion (rotation, translation, scaling) to object " "\"objectID\"; that is, construct and concatenate a transformation " "matrix with objectID's transform. The 3 IDs involved are the object " "that moves, the center of motion, and the frame of reference " "in which to apply the motion. The center is easiest understood " "for rotations: if centerID is the same as objectID then it will " "spin around its own axes; otherwise the moving object will orbit " "the center object. Normally frameID, in whose coordinate system " "the (mouse) motions are interpreted, is \"focus\", the current " "camera. " "\n\n\n\n" "Translations can be scaled proportional to the " "distance between the target and the center. Support for " "spherical and hyperbolic as well as Euclidean space is " "built-in: use the \"space\" command to change spaces. With type " "\"rotate\" x, y, and z are floats specifying angles in RADIANS. " "For types \"translate\" and \"translate-scaled\" x, y, and z are " "floats specifying distances in the coordinate system of the " "center object. " "\n\n\n\n" "The optional \"dt\" field allows a simple form of animation; if " "present, the object moves by just that amount during approximately " "\"dt\" seconds, then stops. If present and followed by the " "\"smooth\" keyword, the motion is animated with a 3t^2-2t^3 " "function, so as to start and stop smoothly. " "If absent, the motion is applied immediately.") { int moving_id, center_id, frame_id; Keyword smooth = NO_KEYWORD, transform_type = NO_KEYWORD; float fx, fy, fz, during = 0; LDECLARE(("transform", LBEGIN, LID, &moving_id, LID, ¢er_id, LID, &frame_id, LKEYWORD, &transform_type, LFLOAT, &fx, LFLOAT, &fy, LFLOAT, &fz, LOPTIONAL, LFLOAT, &during, LKEYWORD, &smooth, LEND)); if (drawer_transform(moving_id, center_id, frame_id, transform_type, fx, fy, fz, during, "transform", smooth)) { return Lt; } else { return Lnil; } } LDEFINE(transform_incr, LVOID, "(transform-incr objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [dt [smooth]])\n\ Apply continuing motion: construct a transformation matrix and\n\ concatenate it with the current transform of objectID every\n\ refresh (sets objectID's incremental transform). Same syntax\n\ as transform. " "\n\n\n\n" "If the optional \"dt\" argument is present,\n\ the object is moved at each time step such that its average motion\n\ equals one instance of the motion per \"dt\" seconds. E.g.\n\ (transform-incr World World World rotate 6.28318 0 0 10.0)\n\ rotates the World about its X axis at 1 turn (2pi radians) per 10\n\ seconds.\n") { int moving_id, center_id, frame_id; Keyword smooth = NO_KEYWORD, transform_type = NO_KEYWORD; float fx, fy, fz; float timeunit = 0; LDECLARE(("transform-incr", LBEGIN, LID, &moving_id, LID, ¢er_id, LID, &frame_id, LKEYWORD, &transform_type, LFLOAT, &fx, LFLOAT, &fy, LFLOAT, &fz, LOPTIONAL, LFLOAT, &timeunit, LKEYWORD, &smooth, LEND)); if (drawer_transform(moving_id, center_id, frame_id, transform_type, fx, fy, fz, timeunit, "transform-incr", smooth)) { return Lt; } else { return Lnil; } } LDEFINE(transform_set, LVOID, "(transform-set objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z)\n\ Set objectID's transform to the constructed transform.\n\ Same syntax as transform.") { int moving_id, center_id, frame_id; Keyword transform_type = NO_KEYWORD; float fx, fy, fz; LDECLARE(("transform-set", LBEGIN, LID, &moving_id, LID, ¢er_id, LID, &frame_id, LKEYWORD, &transform_type, LFLOAT, &fx, LFLOAT, &fy, LFLOAT, &fz, LEND)); if (drawer_transform(moving_id, center_id, frame_id, transform_type, fx, fy, fz, 0., "transform-set", NO_KEYWORD)) { return Lt; } else { return Lnil; } } LDEFINE(position, LVOID, "(position objectID otherID)\n\ Set the transform of objectID to that of otherID.") { int moving_id, ref_id; LDECLARE(("position", LBEGIN, LID, &moving_id, LID, &ref_id, LEND)); drawer_position(moving_id, ref_id, "position", NULL); return Lt; } LDEFINE(position_at, LVOID, "(position-at objectID otherID [center | origin])\n\ Translate objectID to the center of the bounding box or the \n\ origin of the coordinate system of otherID (parallel translation).\n\ Default is center.") { int moving_id, ref_id; char *center = NULL; LDECLARE(("position-at", LBEGIN, LID, &moving_id, LID, &ref_id, LOPTIONAL, LSTRING, ¢er, LEND)); drawer_position(moving_id, ref_id, "position-at", center); return Lt; } LDEFINE(position_toward, LVOID, "(position-toward objectID otherID [center | origin])\n\ Rotate objectID so that the center of the bounding box\n\ or the origin of the coordinate system of the otherID\n\ lies on the positive z-axis of the first object. Default is\n\ the center of the bounding box.") { int moving_id, ref_id; char *center = NULL; LDECLARE(("position-toward", LBEGIN, LID, &moving_id, LID, &ref_id, LOPTIONAL, LSTRING, ¢er, LEND)); drawer_position(moving_id, ref_id, "position-toward", center); return Lt; } /* * These are the functions which are being added to do away with the * default normalization. They will eventually not be prefixed by * new */ /* cH: What kind of brain-damaged idiot did code the following line???? */ /* #define TmNDelete(x) */ LDEFINE(new_center, LVOID, "(new-center [id])\n\ Stop id, then set id's transform to the identity. Default id \n\ is target. Also, if the id is a camera, calls \n\ (look-recenter World id). The main function of the call to \n\ (look-recenter) is to place the camera so that it is pointing \n\ parallel to the z axis toward the center of the world.") { int i; DObject *obj; int id = uistate.targetid; LDECLARE(("new-center", LBEGIN, LOPTIONAL, LID, &id, LEND)); MAYBE_LOOP(id, i, T_NONE, DObject, obj) { drawer_stop(obj->id); gv_xform_set(obj->id, &ts_identity); if(ISGEOM(obj->id) && ((DGeom *)obj)->NDT != NULL) { TmNDelete(DGobj(obj)->NDT); DGobj(obj)->NDT = NULL; TmNDelete(DGobj(obj)->NDTinv ); DGobj(obj)->NDTinv = NULL; GeomSet(DGobj(obj)->Item, CR_NDAXIS, DGobj(obj)->NDT, CR_END); } } /* This must be separate since the center of the world might change */ MAYBE_LOOP(id, i, T_NONE, DObject, obj) { if (ISCAM(obj->id)) gv_look_recenter(WORLDGEOM, obj->id); } return Lt; } LDEFINE(new_reset, LVOID, "(new-reset)\n\ Equivalent to (progn (new-center ALLGEOMS)(new-center ALLCAMS))") { LDECLARE(("new-reset", LBEGIN, LEND)); gv_new_center(ALLGEOMS); gv_new_center(ALLCAMS); return Lt; } /* * The following macros are used by look-encompass */ #ifndef MAX #define MAX(a,b) ((a) > (b) ? (a) : (b)) #endif #ifndef MIN #define MIN(a, b) ((a) < (b) ? (a) : (b)) #endif #ifndef FUDGE #define FUDGE 1.e-6 #endif /* * emcompass_size is the fraction of the total window size that * will be filled by the object */ #define ENCOMPASS_DEFAULTS 1.0, 1000., 0.1, 3.0 struct encompass { float view_frac; float clip_ratio; float near_margin; float far_margin; }; static struct encompass enc = { ENCOMPASS_DEFAULTS }; static struct encompass edflt = { ENCOMPASS_DEFAULTS }; LDEFINE(look_encompass_size, LLIST, "(look-encompass-size [view-fraction clip-ratio near-margin far-margin])\n\ Sets/returns parameters used by (look-encompass).\n\ view-fraction is the portion of the camera window filled by the object,\n\ clip-ratio is the max allowed ratio of near-to-far clipping planes.\n\ The near clipping plane is 1/near-margin times closer than the near\n\ edge of the object, and the far clipping plane is far-margin times\n\ further away. Returns the list of current values.\n\ Defaults: .75 100 0.1 4.0\n") { LDECLARE(("look-encompass-size", LBEGIN, LOPTIONAL, LFLOAT, &enc.view_frac, LFLOAT, &enc.clip_ratio, LFLOAT, &enc.near_margin, LFLOAT, &enc.far_margin, LEND)); if(enc.view_frac <= 0) enc.view_frac = edflt.view_frac; if(enc.clip_ratio <= 0) enc.clip_ratio = edflt.clip_ratio; if(enc.near_margin <= 0) enc.near_margin = edflt.near_margin; if(enc.far_margin <= 0) enc.far_margin = edflt.far_margin; return LMakeArray(LFLOAT, (char *)&enc, 4); } static void ND_look_encompass(int objID, int camID) { int i; Sphere *sphere; DView *dv; float aspect, near, far, focallen, yfield, minfield, newyfield; int perspective; HPoint3 fromcam, center; float radius, effradius, zrange, newzrange, newfar, newnear; Transform Tfocus; MAYBE_LOOP(camID, i, T_CAM, DView, dv) { Transform camC2W, camW2C; /* Figure out the bounding sphere of the object, in contrast to * the 3d case we compute the bounding sphere relative to the * camera (we need the projection to the camera's 3d sub-space) */ sphere = (Sphere *)id_bsphere(objID, dv->id); if (sphere == NULL) { return; } SphereCenter(sphere, ¢er); radius = SphereRadius(sphere); GeomDelete((Geom *)sphere); /* fromcam now contains the coordinates of the center of the * bounding sphere in the coordinate frame defined by the cluster, * projected to our 3d sub-space. We need to append this camera's * private 3d transform to get the final position w.r.t. this * camera. */ CamGet(dv->cam, CAM_C2W, &camC2W); CamGet(dv->cam, CAM_W2C, &camW2C); HPt3Transform(camW2C, ¢er, &fromcam); HPt3Dehomogenize(&fromcam, &fromcam); if(fromcam.x < 0) fromcam.x = -fromcam.x; if(fromcam.y < 0) fromcam.y = -fromcam.y; zrange = -fromcam.z; CamGet(dv->cam, CAM_HALFYFIELD, &yfield); CamGet(dv->cam, CAM_ASPECT, &aspect); CamGet(dv->cam, CAM_NEAR, &near); CamGet(dv->cam, CAM_FAR, &far); CamGet(dv->cam, CAM_FOCUS, &focallen); CamGet(dv->cam, CAM_PERSPECTIVE, &perspective); /* Camera's field in its minimum direction. */ minfield = aspect<1 ? yfield*aspect : yfield; if (minfield <= 0.0) { OOGLError(0, "look-encompass: Erroneous field of view / aspect ratio combination."); minfield = aspect = yfield = 1.0; } /* Handle the case of look-encompass applied to a point. * Then, pretend the sphere's radius matches the camera's current * field of view in its focal plane. */ effradius = radius; if(effradius <= 0) effradius = (perspective ? minfield * zrange : minfield) * enc.view_frac; if (perspective) { /* Perspective case * Move the camera backward or forward until the sphere is tangent * to the frustrum. * minfield is tan(1/2 * field-of-view-in-shorter-direction). * First newzrange term is the Z-distance we'd need to enclose the * sphere if it lay on the camera's Z axis. * Rest is the extra we need to account for its displacement from Z */ newzrange = effradius/enc.view_frac * sqrt(1 + 1/(minfield*minfield)) + MAX(fromcam.y / yfield, fromcam.x / (yfield*aspect)); } else { /* Orthogonal case * Change the field of view of the camera so that the frustrum is * tangent to the sphere */ newyfield = MAX( effradius+fromcam.y, (effradius+fromcam.x) / aspect ) / enc.view_frac; CamSet(dv->cam, CAM_HALFYFIELD, newyfield, CAM_END); newzrange = zrange; } newnear = enc.near_margin*(newzrange - effradius); newfar = enc.far_margin * (newzrange + effradius); if(newnear < near || newfar > far || near*enc.clip_ratio < far) { float newnewz = effradius * (enc.clip_ratio * enc.near_margin - enc.far_margin) / (enc.clip_ratio * enc.near_margin + enc.far_margin); if(newzrange < newnewz) newzrange = newnewz; newnear = enc.near_margin * (newzrange - effradius); newfar = enc.far_margin * (newzrange + effradius); } drawer_float(dv->id, DRAWER_FAR, newfar); drawer_float(dv->id, DRAWER_NEAR, newnear); drawer_float(dv->id, DRAWER_FOCALLENGTH, newzrange); /* In contrast to the 3d case we MUST NOT call apply_motion() * (through gv_transform()). Instead, we apply the transformation * to the camera's normal C2W transform and thus install a * translation in z-direction which is private to this camera. */ TmTranslate(Tfocus, 0.0, 0.0, newzrange - zrange); drawer_post_xform(dv->id, Tfocus); TmConcat(Tfocus, camC2W, camC2W); CamSet(dv->cam, CAM_C2W, &camC2W, CAM_END); TmTranslate(Tfocus, 0.0, 0.0, -newzrange + zrange); TmConcat(camW2C, Tfocus, camW2C); CamSet(dv->cam, CAM_W2C, &camW2C, CAM_END); } } /* * look_encompass * Moves the camera back far enough to see all of an object * ?space == I'm not sure if this will work in non-Euclidean space * author: fowler * date: 12/92 */ LDEFINE(look_encompass, LVOID, "(look-encompass [objectID] [cameraID])\n\ Moves cameraID backwards or forwards until its field of view\n\ surrounds objectID. This routine works only in Euclidean space. \n\ If objectID is not specified, it is assumed to be the world. \n\ If cameraID is not specified, it is assumed to be the targetcam. \n\ See also (look-encompass-size).") { int i; Sphere *sphere; int objID = WORLDGEOM, camID = CAMID(uistate.targetcam); DView *dv; Transform w2c; float aspect, near, far, focallen, yfield, minfield, newyfield; int perspective; HPoint3 center, fromcam; float radius, effradius, zrange, newzrange, newfar, newnear; LDECLARE(("look-encompass", LBEGIN, LOPTIONAL, LID, &objID, LID, &camID, LEND)); objID = real_id(objID); if (!ISGEOM(objID)) { OOGLError(0, "look-encompass: first argument must be a geom"); return Lnil; } if (!ISCAM(camID)) { OOGLError(0, "look-encompass: second argument must be a camera"); return Lnil; } if (spaceof(objID) != TM_EUCLIDEAN) { OOGLError(0, "look-encompass does not work in non-euclidean spaces."); return Lnil; } /* the ND-case needs special care. */ if (drawerstate.NDim > 0) { /* The ND-stuff needs special care. */ ND_look_encompass(objID, camID); return Lnil; } /* Figure out the bounding sphere of the object in world coordinates */ sphere = (Sphere *)id_bsphere(objID, UNIVERSE); if (sphere == NULL) return Lnil; SphereCenter(sphere, ¢er); radius = SphereRadius(sphere); GeomDelete((Geom *)sphere); MAYBE_LOOP(camID, i, T_CAM, DView, dv) { drawer_get_transform(UNIVERSE, w2c, dv->id); CamGet(dv->cam, CAM_HALFYFIELD, &yfield); CamGet(dv->cam, CAM_ASPECT, &aspect); CamGet(dv->cam, CAM_NEAR, &near); CamGet(dv->cam, CAM_FAR, &far); CamGet(dv->cam, CAM_FOCUS, &focallen); CamGet(dv->cam, CAM_PERSPECTIVE, &perspective); HPt3Transform(w2c, ¢er, &fromcam); if(fromcam.x < 0) fromcam.x = -fromcam.x; if(fromcam.y < 0) fromcam.y = -fromcam.y; zrange = -fromcam.z; /* Camera's field in its minimum direction. */ minfield = aspect<1 ? yfield*aspect : yfield; if (minfield <= 0.0) { OOGLError(0, "look-encompass: Erroneous field of view / aspect ratio combination."); minfield = aspect = yfield = 1.0; } /* Handle the case of look-encompass applied to a point. * Then, pretend the sphere's radius matches the camera's current * field of view in its focal plane. */ effradius = radius; if(effradius <= 0) effradius = (perspective ? minfield * zrange : minfield) * enc.view_frac; if (perspective) { /* Perspective case * Move the camera backward or forward until the sphere is tangent * to the frustrum. * minfield is tan(1/2 * field-of-view-in-shorter-direction). * First newzrange term is the Z-distance we'd need to enclose the * sphere if it lay on the camera's Z axis. * Rest is the extra we need to account for its displacement from Z */ newzrange = effradius/enc.view_frac * sqrt(1 + 1/(minfield*minfield)) + MAX(fromcam.y / yfield, fromcam.x / (yfield*aspect)); } else { /* Orthogonal case * Change the field of view of the camera so that the frustrum is * tangent to the sphere */ newyfield = MAX( effradius+fromcam.y, (effradius+fromcam.x) / aspect ) / enc.view_frac; CamSet(dv->cam, CAM_HALFYFIELD, newyfield, CAM_END); newzrange = zrange; } newnear = enc.near_margin*(newzrange - effradius); newfar = enc.far_margin * (newzrange + effradius); if(newnear < near || newfar > far || near*enc.clip_ratio < far) { float newnewz = effradius * (enc.clip_ratio * enc.near_margin - enc.far_margin) / (enc.clip_ratio * enc.near_margin + enc.far_margin); if(newzrange < newnewz) newzrange = newnewz; newnear = enc.near_margin * (newzrange - effradius); newfar = enc.far_margin * (newzrange + effradius); } drawer_float(dv->id, DRAWER_FAR, newfar); drawer_float(dv->id, DRAWER_NEAR, newnear); drawer_float(dv->id, DRAWER_FOCALLENGTH, newzrange); drawer_transform(dv->id, dv->id, dv->id, TRANSLATE_KEYWORD, 0.0, 0.0, newzrange - zrange, 0, "transform", NO_KEYWORD); } return Lnil; } /* * look-toward * Point camera(s) toward object(s) * author: fowler * date: 12/92 */ LDEFINE(look_toward, LVOID, "(look-toward [objectID] [cameraID] [origin | center])\n\ Rotates the named camera to point toward the origin of the\n\ object's coordinate system, or the center of the object's\n\ bounding box (in non-Euclidean space, the origin will be used \n\ automatically). Default objectID is the world, default camera\n\ is targetcam, default location to point towards is the center\n\ of the bounding box.") { int objID = WORLDGEOM, camID = CAMID(uistate.targetcam); char *center = NULL; LDECLARE(("look-toward", LBEGIN, LOPTIONAL, LID, &objID, LID, &camID, LSTRING, ¢er, LEND)); objID = real_id(objID); if (!ISCAM(camID)) { OOGLError(1, "Second argument must be a camera"); return Lnil; } gv_position_toward(camID, objID, spaceof(objID) == TM_EUCLIDEAN ? center : "origin"); return Lt; } /* * look * Point camera(s) toward object(s), then move camera(s) back far enough * that the entire object(s) is visible * Also, set the camera's focal length to indicate that this is the * object of interest. * author: fowler * date: 12/92 */ LDEFINE(look, LVOID, "(look [objectID] [cameraID])\n\ Rotates the named camera to point toward the center of the \n\ bounding box of the named object (or the origin in hyperbolic or \n\ spherical space). In Euclidean space, moves the camera \n\ forward or backward until the object appears as large \n\ as possible while still being entirely visible. Equivalent to \n\ progn ( \n\ (look-toward [objectID] [cameraID] {center | origin})\n\ [(look-encompass [objectID] [cameraID])] \n\ ) \n\ If objectID is not specified, it is assumed to be World. If \n\ cameraID is not specified, it is assumed to be targetcam.") { int objID = WORLDGEOM, camID = CAMID(uistate.targetcam); LDECLARE(("look", LBEGIN, LOPTIONAL, LID, &objID, LID, &camID, LEND)); objID = real_id(objID); if (!ISCAM(camID)) { OOGLError(0, "look: Second argument must be a camera"); return Lnil; } gv_look_toward(objID, camID, "center"); if ((spaceof(objID) == TM_EUCLIDEAN) && (ISGEOM(objID))) gv_look_encompass(objID, camID); return Lt; } /* * look-recenter * (See LDEFINE statement for explanation) * author: fowler * date: 12/92 */ LDEFINE(look_recenter, LVOID, "(look-recenter [objectID] [cameraID])\n\ Translates and rotates the camera so that it is looking in the \n\ -z direction (in objectID's coordinate system) at the center of \n\ objectID's bounding box (or the origin of the coordinate system \n\ in non-Eudlidean space). In Euclidean space, the camera is also \n\ moved as close as possible to the object while allowing the \n\ entire object to be visible. Also makes sure that the y-axes of \n\ objectID and cameraID are parallel.") { int i; DView *camObj; TransformStruct obj2univ; Transform obj2univtm; TmNStruct obj2univN; TransformN *obj2univtmN; int objID = WORLDGEOM, camID = CAMID(uistate.targetcam); LDECLARE(("look-recenter", LBEGIN, LOPTIONAL, LID, &objID, LID, &camID, LEND)); objID = real_id(objID); if (!ISGEOM(objID)) { OOGLError(0, "look-recenter: First argument must be a geom"); return Lnil; } if (!ISCAM(camID)) { OOGLError(0, "look-recenter: Second argument must be a camera"); return Lnil; } /* It is probably not a good idea to deform the camera geometry (in * general the spectator remains undeformed or would suffer serious * injuries ...). So we keep only the orthogonal part and throw away * the deformations. */ obj2univ.h = NULL; drawer_get_transform(objID, obj2univtm, UNIVERSE); TmPolarDecomp(obj2univtm, obj2univ.tm); obj2univN.h = NULL; if ((obj2univtmN = drawer_get_ND_transform(objID, UNIVERSE)) != NULL) { obj2univN.tm = TmNPolarDecomp(obj2univtmN, NULL); TmNDelete(obj2univtmN); /* decrease the ref-count */ } else { obj2univN.tm = NULL; } MAYBE_LOOP(camID, i, T_CAM, DView, camObj) { if (drawerstate.NDim == 0) { gv_xform_set(camObj->id, &obj2univ); } else { if (obj2univN.tm) { gv_ND_xform_set(camObj->id, &obj2univN); } } gv_position_at(camObj->id, objID, spaceof(objID) == TM_EUCLIDEAN ? "center" : "origin"); } TmNDelete(obj2univN.tm); if (spaceof(objID) == TM_EUCLIDEAN) gv_look_encompass(objID, camID); return Lt; } static void get_geom_transform(DGeom *dg, Transform T_to_parent) { Transform Tm, Tn; if(GeomGet(dg->Item, CR_AXIS, Tm) > 0 && GeomGet(dg->Inorm, CR_AXIS, Tn) > 0) TmConcat(Tn, Tm, T_to_parent); else TmIdentity(T_to_parent); } /* * Compute transformation FROM id's coordinates TO a given coord system. * to_id may be any real id, or SELF (always yields identity transform), * or UNIVERSE (yields transform to universal coordinate system). */ void drawer_get_transform(int from_id, Transform T, int to_id) { DObject *obj; Transform Tfrom, Tto, Ttoinv; if(from_id == to_id || to_id == SELF) { TmIdentity(T); return; } if((obj = drawer_get_object(from_id)) == NULL) { if(to_id == UNIVERSE) { OOGLError(1, "drawer_get_transform: can't handle from_id %d", from_id); TmIdentity(T); return; } } else { if(from_id < 0) from_id = obj->id; if (ISGEOM(from_id)) { switch(to_id) { case UNIVERSE: get_geom_transform(DGobj(obj), T); if(DGobj(obj)->citizenship == ORDINARY) { get_geom_transform(dgeom[0], Tfrom); TmConcat(T, Tfrom, T); } return; case WORLDGEOM: if(DGobj(obj)->citizenship == ORDINARY) { get_geom_transform(DGobj(obj), T); return; } } } else if (ISCAM(from_id)) { if(to_id == UNIVERSE) { CamGet(DVobj(obj)->cam, CAM_C2W, T); return; } } else if (ISCAM(to_id)) { if(from_id == UNIVERSE) { CamGet(DVobj(obj)->cam, CAM_W2C, T); return; } } } /* If the above easy cases couldn't hack it, do it the hard way: * Handle A -> B as (A -> UNIVERSE) * (B -> UNIVERSE)^-1 */ drawer_get_transform(to_id, Tto, UNIVERSE); TmInvert(Tto, Ttoinv); drawer_get_transform(from_id, Tfrom, UNIVERSE); TmConcat(Tfrom, Ttoinv, T); } TransformN * drawer_get_ND_transform(int from_id, int to_id) { DObject *obj; TransformN *Tfrom, *Tto, *T; if(from_id == to_id || to_id == SELF) { return NULL; } if((obj = drawer_get_object(from_id)) == NULL) { if(to_id == UNIVERSE) { OOGLError(1, "drawer_get_ND_transform: can't handle from_id %d", from_id); return NULL; } } else { if(from_id < 0) from_id = obj->id; if (ISGEOM(from_id)) { switch(to_id) { case UNIVERSE: Tfrom = get_geom_ND_transform(DGobj(obj)); if(DGobj(obj)->citizenship == ORDINARY) { Tto = get_geom_ND_transform(dgeom[0]); if(Tfrom == NULL) return Tto; else if(dgeom[0]->NDT == NULL) return Tfrom; else { T = TmNConcat(Tfrom, Tto, NULL); TmNDelete(Tfrom); TmNDelete(Tto); return T; } } return Tfrom; case WORLDGEOM: if(DGobj(obj)->citizenship == ORDINARY) { return get_geom_ND_transform(DGobj(obj)); } } } else if (ISCAM(from_id)) { if(to_id == UNIVERSE) { T = (obj && ((DView *)obj)->cluster) ? REFGET(TransformN, ((DView *)obj)->cluster->C2W) : NULL; return T ? T : TmNIdentity(TmNCreate(drawerstate.NDim, drawerstate.NDim, NULL)); } } } /* If the above easy cases couldn't hack it, do it the hard way: * Handle A -> B as (A -> UNIVERSE) * (B -> UNIVERSE)^-1 */ Tto = drawer_get_ND_transform(to_id, UNIVERSE); Tfrom = drawer_get_ND_transform(from_id, UNIVERSE); if(Tto) { TransformN *Tot = TmNInvert(Tto, NULL); TmNDelete(Tto); if(Tfrom) { T = TmNConcat(Tfrom, Tot, NULL); TmNDelete(Tfrom); TmNDelete(Tot); } else { T = Tot; } return T; } else { return Tfrom; } } /* Note: this function always makes a copy of T, otherwise stuff like * * drawer_get_ND_xform(other_id, WORLD); * drawer_set_ND_xform(this-id, WORLD); * * would not work correctly. */ void drawer_set_ND_xform(int id, TransformN *T) { DObject *obj; if((obj = drawer_get_object(id)) != NULL) { if (!T) { T = TmNIdentity(TmNCreate(drawerstate.NDim, drawerstate.NDim, NULL)); } else { T = REFGET(TransformN, T); } if(ISCAM(obj->id)) { if(DVobj(obj)->cluster == NULL) { /* N-D camera? */ return; } DVobj(obj)->cluster->C2W = TmNCopy(T, DVobj(obj)->cluster->C2W); drawerstate.changed = true; } else { DGobj(obj)->NDT = TmNCopy(T, DGobj(obj)->NDT); GeomSet(DGobj(obj)->Item, CR_NDAXIS, DGobj(obj)->NDT, CR_END); obj->changed |= CH_GEOMETRY; } TmNDelete(T); } } /* For ND-picking. * * The return value is the cluster's W2C transform with this camera's * 3d CamView() transform applied to the appropriate sub-space. */ TransformN *drawer_ND_CamView(DView *dv, TransformN *T) { Transform CV3D; if(dv->cluster == NULL && drawerstate.NDim > 0) { /* If we're in N-D mode but this camera isn't equipped, * give it a default N-D => 3-D projection now. */ gv_ND_axes(dv->name[0], drawerstate.NDcams ? drawerstate.NDcams->name : "default", 1, 2, 3, 0); } CamView(dv->cam, CV3D); dv->cluster->W2C = TmNInvert(dv->cluster->C2W, dv->cluster->W2C); T = TmNCopy(dv->cluster->W2C, T); TmNApplyDN(T, dv->NDPerm, CV3D); return T; } int get_parent(int id) { DGeom *dg; if(ISGEOM(id) && (dg = (DGeom *)drawer_get_object(id)) != NULL) { if(dg->citizenship == ORDINARY) return WORLDGEOM; } /* Cameras, etc. are all referred to UNIVERSE */ return UNIVERSE; } void apply_ND_transform(Transform delta, int moving, int center, int frame) { HPointN *originpt = NULL; TransformN *Tgf = NULL, *Tfg = NULL, *Tcf = NULL; TransformN *Tmf = NULL, *Tmg = NULL, *Tfp = NULL, *Tmp = NULL; DView *dv; int *perm; int cam; /* Construct new coord system 'g' with the orientation of 'frame' but * with its origin at 'center'. * It's in this system that 'delta' is defined. * Tgf is the transform from this system to 'frame'. * * cH: we allow a "private" 3d transform for each camera of a * cluster; this has to be taken into account here. */ cam = frame; if(!ISCAM(cam)) cam = center; if(!ISCAM(cam)) cam = moving; if(ISCAM(cam) && (dv = (DView *)drawer_get_object(cam)) != NULL) { perm = dv->NDPerm; } else { static const int dflt_perm[] = { 1, 2, 3, 0 }; perm = (int *)dflt_perm; } originpt = HPtNCreate(drawerstate.NDim, NULL); Tcf = drawer_get_ND_transform(center, frame); if (ISCAM(center) && (dv = (DView *)drawer_get_object(center)) != NULL) { Transform camC2W; CamGet(dv->cam, CAM_C2W, &camC2W); HPtNTransform3(camC2W, dv->NDPerm, originpt, originpt); } if (Tcf) { HPtNTransform( Tcf, originpt, originpt ); } if (ISCAM(frame) && (dv = (DView *)drawer_get_object(frame)) != NULL) { Transform camW2C; CamGet(dv->cam, CAM_W2C, &camW2C); HPtNTransform3(camW2C, dv->NDPerm, originpt, originpt); } Tgf = TmNSpaceTranslateOrigin(NULL, originpt); /* TranslateOrigin() will call Dehomogenize anyway, so negation of * origin is really easy, just negate the homogeneous component. */ originpt->v[0] = -originpt->v[0]; Tfg = TmNSpaceTranslateOrigin(NULL, originpt); HPtNDelete(originpt); Tmf = drawer_get_ND_transform(moving, frame); /* We must not modify Tmf, it could be only a reference, so build up * the chain in reverse order, starting with Tfg */ if (ISCAM(frame) && (dv = (DView *)drawer_get_object(frame)) != NULL) { Transform camW2C; CamGet(dv->cam, CAM_W2C, &camW2C); Tfg = TmNApplyT3TN(camW2C, dv->NDPerm, Tfg); } Tmg = Tmf ? TmNConcat( Tmf, Tfg, NULL ) : REFGET(TransformN, Tfg); /* ... and here it comes ... */ TmNApplyDN(Tmg, perm, delta); TmNDelete(Tmf); /* Do not modify, generate a new one */ Tmf = TmNConcat(Tmg, Tgf, NULL); if (ISCAM(frame) && (dv = (DView *)drawer_get_object(frame)) != NULL) { Transform camC2W; CamGet(dv->cam, CAM_C2W, &camC2W); Tmf = TmNApplyDN(Tmf, dv->NDPerm, camC2W); } Tfp = drawer_get_ND_transform(frame, get_parent(moving)); Tmp = Tfp ? TmNConcat(Tmf, Tfp, NULL) : REFGET(TransformN, Tmf); drawer_set_ND_xform(moving, Tmp); TmNDelete(Tmp); TmNDelete(Tgf); TmNDelete(Tfg); TmNDelete(Tcf); TmNDelete(Tmf); TmNDelete(Tmg); TmNDelete(Tfp); } int make_center_object(char *objname, Point3 *pt) { TransformStruct ts; int cid; if((cid = drawer_idbyname(objname)) == NOID) { GeomStruct gs; gs.h = NULL; gs.geom = NULL; cid = gv_new_alien(objname, &gs); } ts.h = NULL; TmTranslate(ts.tm, pt->x, pt->y, pt->z); gv_xform_set( cid, &ts ); return cid; } void make_center(char *objname, Point3 *pt) { gv_ui_center(make_center_object(objname, pt)); } int make_ND_center_object(char *objname, HPointN *pt) { TmNStruct ts; int cid; if((cid = drawer_idbyname(objname)) == NOID) { GeomStruct gs; gs.h = NULL; gs.geom = NULL; cid = gv_new_alien(objname, &gs); } ts.h = NULL; ts.tm = TmNTranslateOrigin(NULL, pt); gv_ND_xform_set( cid, &ts ); TmNDelete(ts.tm); return cid; } void make_ND_center(char *objname, HPointN *pt) { gv_ui_center(make_ND_center_object(objname, pt)); } int make_center_object_from_bbox(char *objname, int obj_id) { int cid = NOID; if (spaceof(obj_id) == TM_EUCLIDEAN && ISGEOM(obj_id) && obj_id != WORLDGEOM) { DGeom *dg = (DGeom*)drawer_get_object(obj_id); if (dg) { Geom *bbox; if (!dg->bboxvalid) { drawer_make_bbox(dg, dg->normalization == ALL); } GeomGet(dg->Lbbox, CR_GEOM, &bbox); if (bbox) { if (drawerstate.NDim == 0) { Transform Tuni; HPoint3 pt; GeomGet(bbox, CR_CENTER, &pt); /* tansform to universe co-ordinates */ drawer_get_transform(obj_id, Tuni, UNIVERSE); HPt3Transform(Tuni, &pt, &pt); HPt3Dehomogenize(&pt, &pt); cid = make_center_object(objname, (Point3 *)(void *)&pt); } else { TransformN *Tuni; HPointN *pt; GeomGet(bbox, CR_NCENTER, &pt); /* tansform to universe co-ordinates */ Tuni = drawer_get_ND_transform(obj_id, UNIVERSE); HPtNTransform(Tuni, pt, pt); HPtNDehomogenize(pt, pt); cid = make_ND_center_object(objname, pt); HPtNDelete(pt); TmNDelete(Tuni); } } } } return cid; } void make_center_from_bbox(char *objname, int obj_id) { gv_ui_center(make_center_object_from_bbox(objname, obj_id)); } /* Should go to drawer.c ... */ static int make_bbox_center(int obj_id) { if (spaceof(obj_id) == TM_EUCLIDEAN && ISGEOM(obj_id) && obj_id != WORLDGEOM) { DGeom *dg = (DGeom*)drawer_get_object(obj_id); if (dg->bbox_center == NOID) { dg->bbox_center = make_center_object_from_bbox(NULL, obj_id); } return dg->bbox_center; } else { return NOID; } } void make_center_from_pick(char *objname, Pick *pick, int camid) { int index; DView *dv; /* Apply primitive -> World transform. * XXX if we ever implement object hierarchy, a Center like this * should be referred to the object we picked, not the Universe. */ if (drawerstate.NDim > 0) { TransformN *Tuni, *Tcam; Transform Tcam3d; HPointN *center = NULL; HPoint3 got4, center3d; Point3 fromcam; if (pick->TwN == NULL || pick->axes == NULL) { OOGLError(1, "3d pick for ND-viewing?"); return; } Pt3ToHPt3(&pick->got, &got4, 1); /* not a loop for cameras ... */ MAYBE_LOOP(camid, index, T_CAM, DView, dv) { center = HPt3ToHPtN(&got4, dv->NDPerm, NULL); } HPtNTransform(pick->TwN, center, center); Tuni = drawer_get_ND_transform(WORLDGEOM, UNIVERSE); HPtNTransform(Tuni, center, center); TmNDelete(Tuni); make_ND_center(objname, center); MAYBE_LOOP(camid, index, T_CAM, DView, dv) { Tcam = drawer_get_ND_transform(UNIVERSE, dv->id); HPtNTransform(Tcam, center, center); TmNDelete(Tcam); drawer_get_transform(UNIVERSE, Tcam3d, dv->id); HPtNToHPt3(center, dv->NDPerm, ¢er3d); HPt3TransPt3(Tcam3d, ¢er3d, &fromcam); drawer_float(dv->id, DRAWER_FOCALLENGTH, Pt3Length(&fromcam)); } HPtNDelete(center); } else { Point3 center, fromcam; Transform Tuni, Tcam; drawer_get_transform(WORLDGEOM, Tuni, UNIVERSE); Pt3Transform(pick->Tw, &pick->got, ¢er); Pt3Transform(Tuni, ¢er, ¢er); /* Convert to universe coords */ make_center(objname, ¢er); MAYBE_LOOP(camid, index, T_CAM, DView, dv) { drawer_get_transform(UNIVERSE, Tcam, dv->id); Pt3Transform(Tcam, ¢er, &fromcam); drawer_float(dv->id, DRAWER_FOCALLENGTH, Pt3Length(&fromcam)); } } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/transform.h0000644000175000017500000000542612310110177017126 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _GV_COMMON_TRANSFORM_H_ #define _GV_COMMON_TRANSFORM_H_ #include "lang.h" #include "drawer.h" typedef struct Motion { int moving_id; int center_id; int frame_id; void (*transform)(); float amount[3]; float timeunit; float timeleft; /* Nonzero if bounded animation */ int smooth; /* Smooth animation, else linear */ struct Motion *next; } Motion; int drawer_transform(int moving_id, int center_id, int frame_id, Keyword transform_type, float fx, float fy, float fz, float timeunit, char *repeat_type, Keyword smoothanim); void drawer_position(int moving_id, int ref_id, char *position_type, char *center); void drawer_zoom(int id, float amount); void drawer_scale(int id, float amount); void set_motion(Motion *motion); void apply_motion(Motion *motion, float dt); void insert_motion(Motion *motion); void apply_all_motions(float dt); void do_motion(float dt); void delete_motion(Motion *m); void delete_like_motions(Motion *m, float augmentby); void drawer_post_xform(int id, Transform T); int e3space(void *data); int h3space(void *data); void stop_motions(int id); int motions_exist(); int real_id(int id); void make_center(char *objname, Point3 *pt); void make_center_from_bbox(char *objname, int obj_id); void make_center_from_pick(char *objname, Pick *pick, int focalcam); void drawer_set_ND_xform(int id, TransformN *T); int real_id(int id); /* Get a geom's transform to its parent */ static inline TransformN * get_geom_ND_transform(DGeom *dg) { if (dg->NDT == NULL && drawerstate.NDim > 0) { dg->NDT = TmNIdentity(TmNCreate(drawerstate.NDim, drawerstate.NDim, NULL)); GeomSet(dg->Item, CR_NDAXIS, dg->NDT, CR_END); dg->bboxvalid = false; /* invalidate bounding box */ } else if (drawerstate.NDim == 0) { TmNDelete(dg->NDT); dg->NDT = NULL; } return REFGET(TransformN, dg->NDT); } #endif /* _GV_COMMON_TRANSFORM_H_ */ geomview-1.9.5/src/bin/geomview/common/ui.c0000644000175000017500000002400512310110177015515 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include #include #include #include #include #include #include "lisp.h" #include "lang.h" #include "drawer.h" #include "transform.h" #include "ui.h" #include "motion.h" #include "event.h" #include "comm.h" char *shades[5] = { "[0as] Constant", /* APF_CONSTANT */ "[1as] Flat", /* APF_FLAT */ "[2as] Smooth", /* APF_SMOOTH */ "[3as] CSmooth", /* APF_CSMOOTH */ "[4as] VCflat", /* APF_VCFLAT */ }; char *translucencies[3] = { "[0mt] BSP-Tree Alpha Blending", "[1mt] Screen Door", "[2mt] Simple Alpha Blending" }; char *norm[4] = { "[0N] None", /* NONE */ "[1N] Individual", /* EACH */ "[2N] Sequence", /* ALL */ "[3N] Keep", /* KEEP */ }; char *proj[2] = { "[0vp] Orthographic", /* ORTHOGRAPHIC */ "[1vp] Perspective", /* PERSPECTIVE */ }; char *spc[3] = { "[me] Euclidean", /* EUCLIDEAN */ "[mh] Hyperbolic", /* HYPERBOLIC */ "[ms] Spherical", /* SPHERICAL */ }; char *mdl[3] = { "[mv] Virtual", /* VIRTUAL */ "[mp] Projective", /* PROJECTIVE */ "[mc] Conformal", /* CONFORMALBALL */ }; char OBJROTATE[] = "[r] Rotate"; char OBJTRANSLATE[] = "[t] Translate"; char OBJZOOM[] = "[z] Cam Zoom"; char OBJSCALE[] = "[s] Geom Scale"; char OBJFLY[] = "[f] Cam Fly"; char OBJORBIT[] = "[o] Cam Orbit"; char LIGHTEDIT[] = "[le] Edit Lights"; /* in ui.c */ void cui_init() { uistate.targetid = WORLDGEOM; uistate.centerid = TARGETID; uistate.bbox_center = 0; uistate.targetgeom = 0; /* World geom is index 0 */ uistate.targetcam = INDEXOF(FOCUSID); uistate.cam_wm_focus = 0; /* bad idea */ uistate.mode_count = 0; uistate.emod_dir = NULL; uistate.apoverride = ~0; /* Enable override by default */ uistate.inertia = 1; /* Enable inertia by default */ uistate.pick_invisible = 1; /* Pick invisible as well as visible objects? */ /* * The order of these calls must be the same as the declared integers * in ui.h!! */ ui_install_mode(OBJROTATE, minterp_rotate, T_NONE); ui_install_mode(OBJZOOM, minterp_zoom, T_CAM); ui_install_mode(OBJTRANSLATE, minterp_translate, T_NONE); ui_install_mode(OBJFLY, minterp_fly, T_CAM); ui_install_mode(OBJORBIT, minterp_orbit, T_CAM); ui_install_mode(OBJSCALE, minterp_scale, T_GEOM); VVINIT(uistate.emod, emodule, 10); vvzero(&uistate.emod); uistate.savewhat = NOID; uistate.cursor_still = UI_CURSOR_STILL; uistate.cursor_twitch = UI_CURSOR_TWITCH; uistate.longwhile = 2.5; /* Max credible inter-redraw interval */ uistate.backface = 0; return; } void ui_reinstall_mode(char *name, PFI proc, int type, int index) { uistate.modenames[index] = name; uistate.modes[index] = proc; uistate.modetype[index] = type; } void ui_install_mode(char *name, PFI proc, int type) { if(uistate.mode_count >= MAXMODES) { OOGLError(1, "Motion-mode table full (max %d entries)", MAXMODES); uistate.mode_count = MAXMODES-1; } uistate.modenames[uistate.mode_count] = name; uistate.modes[uistate.mode_count] = proc; uistate.modetype[uistate.mode_count] = type; ++uistate.mode_count; D1PRINT(("ui_install_mode: name=%s, proc=%x\n", name, proc)); } void ui_uninstall_mode(char *name) { int i = ui_mode_index(name); if (i<0) return; --uistate.mode_count; while (i= VVCOUNT(uistate.emod)) return; em = &VVEC(uistate.emod, emodule)[k]; for(i = k+1; i < VVCOUNT(uistate.emod); i++, em++) *em = *(em+1); VVCOUNT(uistate.emod)--; uistate.emod_changed = k+1; } emodule * ui_emodule_install(int before, char *ename, PFI func) { int i,k; emodule *em, *emp; if((k = ui_emodule_index(ename,NULL)) >= 0) ui_emodule_uninstall(k); k = VVCOUNT(uistate.emod)++; vvneeds(&uistate.emod, VVCOUNT(uistate.emod)); if(before > k) before = k; else if(before < 0) before = 0; /* Shift the part of emodule table below the insertion point down one unit. Don't use bcopy() for this because it does not correctly handle overlapping src and dst. mbp Wed Sep 9 19:07:39 1992 */ em = VVEC(uistate.emod, emodule); for (i=VVCOUNT(uistate.emod)-1, emp = &em[i]; i>before; i--, emp--) *emp = *(emp-1); em = &VVEC(uistate.emod, emodule)[before]; em->name = strdup(ename); em->func = (PFV)func; em->dir = uistate.emod_dir; /* Other emodule fields zeroed */ uistate.emod_changed = before+1; return em; } LDEFINE(emodule_clear, LVOID, "(emodule-clear)\n\ Clears the geomview application (external module) browser.") { LDECLARE(("emodule-clear", LBEGIN, LEND)); while (VVCOUNT(uistate.emod)) ui_emodule_uninstall(0); return Lt; } int ui_emodule_index(char *ename, emodule **emp) { int i; emodule *em; if(!emp) emp = &em; for (i=0, em=VVEC(uistate.emod, emodule); iname, ename)==0) { *emp = em; return i; } *emp = NULL; return -1; } /*----------------------------------------------------------------------- * Function: set_ui_target * Description: set the target of user actions * Args: type: T_GEOM or T_CAM * index: index of current geom or current cam * Returns: * Author: mbp * Date: Thu Nov 21 14:04:28 1991 * Notes: equivalent to set_ui_target_id( ID(type, index) ) */ void set_ui_target(int type, int index) { uistate.targetid = ID(type, index); switch (uistate.targettype = type) { case T_GEOM: uistate.targetgeom = index; if (uistate.bbox_center && uistate.targetid != WORLDGEOM) { make_center_from_bbox("CENTER", uistate.targetid); } break; case T_CAM: uistate.targetcam = index; break; } } void set_ui_center(int id) { uistate.centerid = id; } void set_ui_center_origin(int use_bbox_center) { uistate.bbox_center = use_bbox_center != 0; /* boolean value */ if (uistate.bbox_center && uistate.targetid != WORLDGEOM) { make_center_from_bbox("CENTER", uistate.targetid); } else { gv_ui_center(TARGETID); } } void set_ui_wm_focus(int cam_wm_focus) { uistate.cam_wm_focus = cam_wm_focus != 0; } /*----------------------------------------------------------------------- * Function: set_ui_target_id * Description: set the target id of user actions * Args: id: id to target * Returns: * Author: mbp * Date: Thu Nov 21 14:05:33 1991 * Notes: equivalent to set_ui_target( TYPEOF(id), INDEXOF(id) ) */ void set_ui_target_id(int id) { set_ui_target( TYPEOF(id), INDEXOF(id) ); } void ui_cleanup() { int i; for(i = VVCOUNT(uistate.emod); --i >= 0; ) { if(VVEC(uistate.emod, emodule)[i].pid > 0) { emodule_kill(&VVEC(uistate.emod, emodule)[i]); } } gv_delete(ALLCAMS); } /* maybe replace this later with something more useful: */ void ui_targeting() {} /**********************************************************************/ /* for debugging */ void print_emodtable() { emodule *em; int i; for(i=0, em=VVEC(uistate.emod,emodule); iname); } return; } LDEFINE(cursor_still, LVOID, "(cursor-still [INT])\n\ Sets the number of microseconds for which the cursor must not\n\ move to as holding still. If INT is not specified,\n\ the value will be reset to the default.") { uistate.cursor_still = UI_CURSOR_STILL; LDECLARE(("cursor-still", LBEGIN, LOPTIONAL, LINT, &uistate.cursor_still, LEND)); return Lt; } LDEFINE(cursor_twitch, LVOID, "(cursor-twitch [INT])\n\ Sets the distance which the cursor must not move (in x or\n\ y) to as holding still. If INT is not specified,\n\ the value will be reset to the default.") { uistate.cursor_twitch = UI_CURSOR_TWITCH; LDECLARE(("cursor-twitch", LBEGIN, LOPTIONAL, LINT, &uistate.cursor_twitch, LEND)); return Lt; } LDEFINE(ap_override, LVOID, "(ap-override [on|off])\n\ Selects whether appearance controls should override objects' own\n\ settings. On by default. With no arguments, returns current setting.") { Keyword kw = NOT_A_KEYWORD; LDECLARE(("ap-override", LBEGIN, LOPTIONAL, LKEYWORD, &kw, LEND)); if (kw == NOT_A_KEYWORD) { Keyword on = uistate.apoverride ? ON_KEYWORD : OFF_KEYWORD; return LNew(LKEYWORD, &on); } drawer_int(WORLDGEOM, DRAWER_APOVERRIDE, boolval("ap-override", kw)); return Lt; } int uispace(int space) { switch (space) { case TM_EUCLIDEAN: return EUCLIDEAN; case TM_HYPERBOLIC: return HYPERBOLIC; case TM_SPHERICAL: return SPHERICAL; } return -1; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/ui.h0000644000175000017500000002072012310110177015522 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #ifndef UI_H #define UI_H #include "common.h" #define MAXMODES 16 /* Max built-in motion modes */ #define MAXMORE 10 #define MAXTOOLS 10 /* Max built-in tools */ #define MAXACTIONS 10 /* Max built-in actions */ typedef struct _emodule { char *name; void (*func)(); char *text; int pid; Pool *link; void *data; char *dir; } emodule; typedef struct { int targetgeom; /* index of target Geom for user actions */ int targetcam; /* index of target Camera for user actions */ int targettype; /* T_GEOM, T_CAM, or T_NONE */ int targetid; /* id of target (geom or cam) (moving obj) */ int centerid; /* id of center of motion) */ int bbox_center; /* use center of bbox of centerid as origin */ int mousefocus; /* index of camera (window) where mouse is */ int cam_wm_focus; /* true: activate cam-win on * FocusChange events, false: activate * cam-win on mouse-cross events. */ int savewhat; /* What in the world did we want to save? (NOID = all) */ /* * Motion modes are no longer separated into two arrays of geoms and cams. * Everything is in one array. */ PFI modes[MAXMODES]; /* motion procs */ char *modenames[MAXMODES]; /* motion names */ int modetype[MAXMODES]; /* type of motion: T_NONE if could be either, T_CAM or T_GEOM if specific*/ int mode_count; /* number of entries in above arrays */ int mode_current; /* current mode */ vvec emod; /* External module table */ int emod_changed; /* Set if browser changed since drawn */ int emod_check; /* Set if some emodule died */ char *emod_dir; /* if non-NULL, pathname of emodule's dir */ int lights_shown; /* are lights drawn? */ int current_light; /* currently selected light for editing */ int cursor_on; /* cursor visible? */ int clamp_cursor; /* cursor clamped to center of window */ int cursor_still; /* microseconds in which cursor must not move to as holding still */ int cursor_twitch; /* distance cursor must not move (in either x or y) to register as holding still. */ float longwhile; /* Max credible real time (in seconds) * between redraws. If dt > longwhile, * clamp it to longwhile to avoid huge * jumps in motion. */ Color pickedbboxcolor; /* Color of picked objects' bboxes */ int backface; /* Cull back-facing polygons */ int apoverride; /* -1 if appearance controls should * override, else 0 */ int ownmotion; /* Interactive motions with respect to * object's own coordinates, not camera. */ int constrained; /* Constrain interactive motions to * just one (X/Y) axis, whichever is * greater. */ int inertia; /* Motions have inertia */ int freeze; /* Whether to freeze UI panels */ int pick_invisible; /* Should picks be sensitive to invisible objects? */ } UIState; extern UIState uistate; /* shading */ #define CONSTANTSHADE APF_CONSTANT #define FLATSHADE APF_FLAT #define SMOOTHSHADE APF_SMOOTH extern char *shades[5]; /* translucency */ #define BSPTREE_BLENDING APF_ALPHA_BLENDING #define SCREEN_DOOR APF_SCREEN_DOOR #define SIMPLE_BLENDING APF_NAIVE_BLENDING extern char *translucencies[3]; /* normalization --- these must be consective beginning with 0 --- they are used as indices into the "norm" array !!! */ typedef enum { NONE = 0, EACH, ALL, KEEP } Normalization; extern char *norm[4]; /* projection */ typedef enum { ORTHOGRAPHIC = 0, PERSPECTIVE } Projection; extern char *proj[2]; /* UI space */ /* NOTE: These are now strictly UI values. Internally space is recorded using TM_EUCLIDEAN, etc from transform3.h. */ #define EUCLIDEAN 0 #define HYPERBOLIC 1 #define SPHERICAL 2 extern char *spc[3]; extern char *mdl[3]; /* motion mode names */ extern char OBJROTATE[]; /* Rotate */ extern char OBJTRANSLATE[]; /* Translate */ extern char OBJSCALE[]; /* Scale */ extern char OBJZOOM[]; /* Zoom -- FOV! */ extern char OBJFLY[]; /* Cam Fly */ extern char OBJORBIT[]; /* Cam Orbit */ extern char LIGHTEDIT[]; /* Edit Lights */ #define IMMEDIATE 1 #define NOIMMEDIATE 0 /* Tools */ /* These MUST match the order declared in cui_init!! */ #define TOOL_ROT 0 #define TOOL_ZOOM 1 #define TOOL_TRANS 2 #define TOOL_FLY 3 #define TOOL_ORBIT 4 #define TOOL_SCALE 5 /* Actions */ #define ACTION_STOP 0 #define ACTION_PAUSE 1 #define ACTION_CENTER 2 #define ACTION_RESET 3 #define ACTION_LOOK 4 #define UI_ADD 0 #define UI_REPLACE 1 #define UI_ADDCAMERA 2 #define UI_TARGET 0 #define UI_CENTER 1 /* Cursor */ #define UI_CURSOR_STILL 100 #define UI_CURSOR_TWITCH 5 /* in ui.c */ extern void ui_install_mode(char *name, PFI proc, int type); extern void ui_reinstall_mode(char *name, PFI proc, int type, int index); extern void ui_uninstall_mode(char *name); extern int ui_mode_index(char *name); extern emodule *ui_emodule_install(int after, char *external, PFI func); extern int ui_emodule_index(char *external, emodule **emp); extern void ui_emodule_uninstall(int index); extern void set_ui_target(int type, int index); extern void set_ui_center(int id); extern void set_ui_target_id(int id); extern void set_ui_center_origin(int use_bbox_center); extern void set_ui_wm_focus(int cam_wm_focus); extern void ui_cleanup(); /* in glui.c */ extern int ui_panelshown(int index); extern void ui_showpanel( int index, int show ); extern void ui_init(); extern void env_init(); extern void ui_lights_changed(); extern void set_light_display(int lightno); extern void ui_keyboard(int ch); extern void timing(int interval); extern void ui_add_mode(char *name, PFI proc, int type); extern void ui_remove_mode(char *name); extern void ui_replace_mode(char *name, PFI proc, int type, int index); extern void ui_event_mode(char *mode); extern void ui_action(int val); extern void ui_popup_message(char *s); extern void ui_mousefocus(int index); extern void ui_objectchange(); extern void ui_maybe_refresh(int id); extern void set_light_intensity(float intens); extern void lights_changed_check(); extern void ui_light_button(); extern void ui_changed_lights(); /* ui_fileio() pops up a file browser/input panel. * It loads the resulting file if dosave==0, * saves state into it otherwise. */ extern void ui_fileio( int dosave ); /* ui_pickcolor() pops up a color picker, * sets the color associated with the given code, * e.g. DRAWER_EDGECOLOR or DRAWER_BACKCOLOR. */ extern void ui_pickcolor( int drawer_code ); /* ui_curson() toggles cursor visibility. * 1 : enable, 0 : disable, -1 : toggle. */ extern void ui_curson( int toggle ); /* ui_name2panel() looks up the name of a UI panel * and returns a UI-specific index if found, * otherwise zero. */ extern int ui_name2panel( char *name ); /* ui_showpanel() makes the given UI panel visible * or invisible, according to 'show' */ extern void ui_showpanel( int index, int show ); /* ui_manual_browser() tries to spawn an external * html or pdf browser to give access to the manual. * "type" may be either "html" or "pdf", other values * are silently ignored. */ extern void ui_manual_browser(const char *type); /* ui_panelwindow() specifies positioning for the * given UI panel from the given WnWindow. */ extern void ui_panelwindow( int index, WindowStruct *ws ); extern void cui_init(); extern int uispace(int space); extern void ui_windowWillOpen(DView *dv); extern void ui_windowDidOpen(DView *dv); #endif /* ! UI_H */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/version.h0000644000175000017500000000302112310110177016565 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * GEOMVIEW_VERSION is a string describing the current version of * geomview. As new versions are created this string should be * modified in a lexicographically increasing manner. This is the * string that appears in various panels and is what the * (geomview-version) lisp command returns. * * NOTE: As of verison 1.7.5 the GEOMVIEW_VERSION string now comes from * the VERSION macro defined in the configure-generated header file * config.h. This number is specified in "configure.in" in the top-level * directory. */ #if HAVE_CONFIG_H # include "config.h" #endif #ifndef GEOMVIEW_VERSION #define GEOMVIEW_VERSION VERSION #endif geomview-1.9.5/src/bin/geomview/common/worldio.c0000644000175000017500000006476212310110177016575 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include "mg.h" #include "mgbuf.h" #include "drawer.h" #include "ui.h" #include "geom.h" #include "geomclass.h" #include "instP.h" #include "listP.h" #include "streampool.h" #include "comm.h" #include "lang.h" #include "main.h" #include "transobj.h" #include "ntransobj.h" #include "worldio.h" #include #include #ifdef NeXT #include #else /* any other reasonable UNIX */ #include #endif void set_emodule_path(char **dirs); void set_load_path(char **dirs); static void save_dgeom(Pool *p, DGeom *dg, int doaliens); static void save_dgeom_geom(Pool *p, DGeom *dg, bool world, bool wrap, int cum); static void save_dview(Pool *p, DView *dv); static int nonidentity(Transform T); static void maybe_save_xform(Pool *p, char *cmd, char *name, Handle *, Transform T); static char * normalization_string(int n); static char * onoff_string(int n); int save_world(Pool *p, int id, bool comm, int wrap, int to_coords) { Appearance *ap; int i, closeme = 0; FILE *fp; Transform T; DGeom *dg = NULL; Handle *h = NULL; if ((fp = PoolOutputFile(p)) == NULL) { return 0; } #if 0 /* Hack -- don't let StreamOut routines write Handle names. */ /* "Temporary" workaround for library reading bug. -slevy */ PoolSetOType(p, PO_DATA); #endif if (id == NOID) { /* cH: hack, but otherwise we cannot save the universe, no aliens. */ id = UNIVERSE; } if (!comm) { /* Write geometry */ if (wrap) { if (id == UNIVERSE || ISCAM(id)) { PoolFPrint(p, fp, "{ # Base appearance\n"); PoolIncLevel(p, 1); ApStreamOut(p, NULL, drawerstate.ap); PoolFPrint(p, fp, "# end base appearance\n"); if (ISCAM(id)) { PoolIncLevel(p, -1); PoolFPrint(p, fp, "}\n"); return !ferror(fp); } else closeme = 1; } } if (id == UNIVERSE) { id = WORLDGEOM; } if (ISGEOM(id)) dg = (DGeom *)drawer_get_object(id); if (id == WORLDGEOM) { if (wrap) { save_dgeom_geom(p, dg, true, wrap, to_coords); } PoolFPrint(p, fp, "{ LIST # World list \n"); PoolIncLevel(p, 1); for(i = 1; i < dgeom_max; i++) { dg = (DGeom *)drawer_get_object(GEOMID(i)); if (dg != NULL && dg->citizenship != ALIEN) save_dgeom_geom(p, dg, false, true, WORLDGEOM); } PoolIncLevel(p, -1); PoolFPrint(p, fp, "} #end of World List\n"); if (wrap) { PoolIncLevel(p, -1); PoolFPrint(p, fp, "} # end of World and INST\n"); if (closeme) { PoolIncLevel(p, -1); PoolFPrint(p, fp, "}\n"); } } } else { save_dgeom_geom(p, dg, false, wrap, to_coords); } return !ferror(fp); } /* Write command language */ PoolFPrint(p, fp, "(progn\n"); PoolIncLevel(p, 1); /* Ensure embedded objects have { braces } */ if (id == UNIVERSE || id == WORLDGEOM) { PoolFPrint(p, fp, "(merge-baseap "); ApStreamOut(p, NULL, drawerstate.ap); PoolFPrint(p, fp, ") # end base appearance\n"); if (drawerstate.NDim > 0) PoolFPrint(p, fp, "(dimension %d)\n", drawerstate.NDim-1); } if (id != UNIVERSE && id != WORLDGEOM) { DObject *dobj = drawer_get_object(id); if (dobj) { if (ISGEOM(dobj->id)) save_dgeom(p, (DGeom *)dobj, 1); else save_dview(p, (DView *)dobj); } } else { /* save data associated with the World dgeom */ GeomGet( dgeom[0]->Item, CR_AXIS, T ); GeomGet( dgeom[0]->Item, CR_AXISHANDLE, &h ); maybe_save_xform(p, "xform-set", "worldgeom", h, T); maybe_save_xform(p, "xform-incr", "worldgeom", dgeom[0]->incrhandle, dgeom[0]->Incr); GeomGet( dgeom[0]->Item, CR_APPEAR, &ap ); if (ap != NULL) { PoolFPrint(p, fp, "(merge-ap \"worldgeom\" "); ApStreamOut( p, NULL, ap ); PoolFPrint(p, fp, ") # end appearance \"worldgeom\"\n"); } /* save the dgeoms. Include aliens if id == UNIVERSE. */ for (i=1; iname[1]); } } PoolIncLevel(p, -1); PoolFPrint(p, fp, ")\n"); /* terminates the (progn... */ return !ferror(fp); } /* * Save a DGeom as geometry. Emit appearance and transform if wrap. * if not 'world', also add geometry and close the braces. */ static void save_dgeom_geom(Pool *p, DGeom *dg, bool world, bool wrap, int to_coords) { FILE *fp = PoolOutputFile(p); Transform T; Handle *h = NULL; Geom *g = NULL; Appearance *ap = NULL; if (dg == NULL || dg->Item == NULL) return; if (wrap) { PoolFPrint(p, fp, "{ # %s\n", dg->name[1]); PoolIncLevel(p, 1); PoolFPrint(p, fp, "INST\n"); drawer_get_transform(dg->id, T, to_coords); if (nonidentity(T) || h) { /* Could say "transform" here */ PoolFPrint(p, fp, ""); TransStreamOut(p, h, T); /* but TransStreamOut does that */ } PoolFPrint(p, fp, "geom "); GeomGet(dg->Item, CR_APPEAR, &ap); if (ap) { ap = ApCopy(ap, NULL); ap->override = 0; if (ap->mat) ap->mat->override = 0; if (ap->lighting) ap->lighting->override = 0; PoolFPrint(p, fp, ""); ApStreamOut(p, NULL, ap); ApDelete(ap); } } if (!world) { h = NULL; GeomGet(dg->Lgeom, CR_GEOM, &g); GeomGet(dg->Lgeom, CR_GEOMHANDLE, &h); GeomStreamOut(p, h, g); if (wrap) { PoolIncLevel(p, -1); PoolFPrint(p, fp, "} # end (geom and INST) %s\n", dg->name[1]); } } } static void maybe_save_xform(Pool *p, char *cmd, char *name, Handle *h, Transform T) { if (h || nonidentity(T)) { fprintf(PoolOutputFile(p), "(%s \"%s\" ", cmd, name); TransStreamOut(p, h, T); fprintf(PoolOutputFile(p), ")\n"); } } static void save_dgeom(Pool *p, DGeom *dg, int doaliens) { Geom *g=NULL; Appearance *ap=NULL; FILE *fp = PoolOutputFile(p); Handle *h = NULL; Transform T; char name[32]; char *truename = dg->name[1]; sprintf(name, "[%s]", dg->name[0]); /* Temporary name -- unlikely to conflict */ if (dg->citizenship == ALIEN) { if (!doaliens) return; PoolFPrint(p, fp, "(new-alien"); } else { PoolFPrint(p, fp, "(new-geometry"); } fprintf(fp, " \"%s\" # %s\n", name, truename); PoolIncLevel(p, 1); PoolFPrint(p, fp, ""); GeomGet( dg->Lgeom, CR_GEOM, &g ); GeomGet( dg->Lgeom, CR_GEOMHANDLE, &h ); GeomStreamOut( p, h, g ); PoolIncLevel(p, -1); PoolFPrint(p, fp, ") # end geometry \"%s\" %s\n", name, truename); GeomGet( dg->Item, CR_APPEAR, &ap ); if (ap != NULL) { PoolFPrint(p, fp, "(merge-ap \"%s\" ", name); ApStreamOut( p, NULL, ap ); PoolFPrint(p, fp, ") # end appearance \"%s\" %s\n", name, truename); } TmIdentity(T); GeomGet( dg->Item, CR_AXIS, T ); GeomGet( dg->Item, CR_AXISHANDLE, &h ); maybe_save_xform(p, "xform-set", name, h, T); if (dg->NDT) { PoolFPrint(p, fp, "(ND-xform-set \"%s\" ", name); NTransStreamOut(p, NULL, dg->NDT); PoolFPrint(p, fp, ")\n"); } PoolFPrint(p, fp, "(bbox-draw \"%s\" %s)\n", name, onoff_string(dg->bboxdraw)); if (dg->bboxap && dg->bboxap->mat) { Color *c = &(dg->bboxap->mat->edgecolor); PoolFPrint(p, fp, "(bbox-color \"%s\" %f %f %f)\n", name, c->r, c->g, c->b); } PoolFPrint(p, fp, "(normalization \"%s\" %s)\n", name, normalization_string(dg->normalization)); PoolFPrint(p, fp, "(name-object \"%s\" \"%s\")\n\n", name, truename); } static void save_dview(Pool *p, DView *dv) { char *name = dv->name[1]; FILE *fp = PoolOutputFile(p); WnPosition wp; if (WnGet(dv->win, WN_CURPOS, &wp) > 0) { WnSet(dv->win, WN_PREFPOS, &wp, WN_END); PoolFPrint(p, fp, "(window default { position %d %d %d %d })\n", wp.xmin,wp.xmax,wp.ymin,wp.ymax); } PoolFPrint(p, fp, "(camera \"%s\" ", name); CamStreamOut(p, dv->camhandle, dv->cam); PoolFPrint(p, fp, ") # camera \"%s\" ...\n", name); PoolFPrint(p, fp, "(backcolor \"%s\" %f %f %f)\n", name, dv->backcolor.r,dv->backcolor.g,dv->backcolor.b); if (dv->cameradraw) { PoolFPrint(p, fp, "(camera-draw \"%s\" yes)\n", name); } if (dv->cluster != NULL) { cmap *cm; cent *ce; int i, j; PoolFPrint(p, fp, "(dimension %d)\n", drawerstate.NDim-1); PoolFPrint(p, fp, "(ND-axes \"%s\" \"%s\" %d %d %d %d)\n", name, dv->cluster->name, dv->NDPerm[0], dv->NDPerm[1], dv->NDPerm[2], dv->NDPerm[3]); if (dv->cluster->C2W != NULL) { PoolFPrint(p, fp, "(ND-xform-set \"%s\" ", name); TmNPrint(fp, dv->cluster->C2W); PoolFPrint(p, fp, ")\n"); } PoolFPrint(p, fp, "(ND-color \"%s\" (\n", name); for(i = 0, cm = dv->NDcmap; i < dv->nNDcmap; i++, cm++) { PoolFPrint(p, fp, "\t( ("); fputnf(fp, cm->axis->dim, cm->axis->v, 0); PoolFPrint(p, fp, ")\n"); for(j = VVCOUNT(cm->cents), ce = VVEC(cm->cents,cent); --j >= 0; ce++) { PoolFPrint(p, fp, "\t\t%g\t", ce->v); fputnf(fp, 4, (float *)&ce->c, 0); fputc('\n', fp); } PoolFPrint(p, fp, "\t)\n"); } PoolFPrint(p, fp, " ) ) # end ND-color \"%s\"\n", name); } PoolFPrint(p, fp, "(window \"%s\" ", name); WnStreamOut(p, NULL, dv->win); PoolFPrint(p, fp, ")\n"); PoolFPrint(p, fp, "# end camera %s\n\n", name); } static int nonidentity(Transform T) { return memcmp(T, TM_IDENTITY, sizeof(TM_IDENTITY)); } static char * normalization_string(int n) { switch (n) { case NONE: return "none"; case ALL: return "all"; case EACH: return "each"; default: return "???"; } } static char * onoff_string(int n) { if (n) return "on"; else return "off"; } int worldio(HandleOps *ops, Pool *p, int to_coords, int id) { int ok = -1; Transform T; TransformN *TN; bool wrap = true; /* no data attached to a handle has been saved yet */ HandlesSetObjSaved(false); if (to_coords == SELF) { wrap = false; } if (ops == &CommandOps) { ok = save_world(p, id, true, wrap, to_coords); } else if (ops == &GeomOps) { if (ISTYPE(T_NONE, id)) { /* bounding-box requested */ DGeom *dg; id = GEOMID(INDEXOF(id)); if ((dg = (DGeom *)drawer_get_object(id)) != NULL && dg->bboxvalid) { Geom *bbox; GeomGet(dg->Lbbox, CR_GEOM, &bbox); if (bbox != NULL) { ok = GeomStreamOut(p, NULL, bbox); } } } else { ok = save_world(p, id, false, wrap, to_coords); } } else if (ops == &CamOps && ISCAM(id)) { DView *dv = (DView *)drawer_get_object(id); if (dv) ok = CamStreamOut(p, dv->camhandle, dv->cam); } else if (ops == &WindowOps) { DView *dv = (DView *)drawer_get_object(ISCAM(id) ? id : FOCUSID); WnWindow *win; if (dv && dv->mgctx) { mgctxselect(dv->mgctx); if ((ok = mgctxget(MG_WINDOW, &win)) > 0) ok = WnStreamOut(p, NULL, win); } } else if (ops == &TransOps) { drawer_get_transform(id, T, to_coords); ok = TransStreamOut(p, NULL, T); } else if (ops == &NTransOps) { TN = drawer_get_ND_transform(id, to_coords); ok = NTransStreamOut(p, NULL, TN); TmNDelete(TN); } fflush(PoolOutputFile(p)); return ok; } static int unique(char *new, char **already, int nalready) { int i; if (new == NULL) return 0; for(i = 0; i < nalready; i++) if (strcmp(new, already[i]) == 0) return 0; return 1; } static void setapath(LList *list, vvec *vvpath, void (*setfunc)(char **)) { #define MAXDIRS 100 int i, k; char *td, *dirs[MAXDIRS+1]; for(i = 0; i < MAXDIRS && list; list = list->cdr) { if (list->car == NULL) continue; td = LSTRINGVAL(list->car); if (strcmp(td, "+") == 0) { for(k = 0; k < VVCOUNT(*vvpath) && i < MAXDIRS; k++) { td = VVEC(*vvpath, char *)[k]; if (unique(td, dirs, i)) dirs[i++] = strdup(td); } } else { if (unique(td, dirs, i)) dirs[i++] = td; } } dirs[i] = NULL; (*setfunc)(dirs); #undef MAXDIRS } static void set_vvpath(vvec *vv, char **ents) { int i; for(i = VVCOUNT(*vv); --i >= 0; ) free(VVEC(*vv, char *)[i]); VVCOUNT(*vv) = 0; while(ents && *ents) *VVAPPEND(*vv, char *) = strdup(*ents++); vvtrim(vv); } LDEFINE(set_load_path, LVOID, "(set-load-path (PATH1 ... PATHN))\n\ Sets search path for command, geometry, etc. files. The PATHi\n\ are strings giving the pathnames of directories to be searched.\n\ The special directory name \"+\" is replaced by the existing path,\n\ so e.g. (set-load-path (mydir +)) prepends mydir to the path.") { LList *list; LDECLARE(("set-load-path", LBEGIN, LLITERAL, LLIST, &list, LEND)); setapath(list, &vv_load_path, set_load_path); return Lt; } void set_load_path(char **dirs) { int filepanel; set_vvpath(&vv_load_path, dirs); filedirs(dirs); /* Inform OOGL/refcomm library */ filepanel = ui_name2panel("Files"); /* Inform UI */ if (ui_panelshown(filepanel)) ui_showpanel(filepanel, 1); } LDEFINE(load_path, LLIST, "(load-path)\n\ Returns the current search path for command, geometry, etc. files.\n\ Note: to actually see the value returned by this function\n\ you should wrap it in a call to echo: (echo (load-path)).\n\ See also set-load-path.") { /* For backward compatibility this command takes an optional argument which specifies a new load-path. This will disappear in a future version. */ LList *list = NULL; int i; LDECLARE(("load-path", LBEGIN, LOPTIONAL, LLITERAL, LLIST, &list, LEND)); if (list != NULL) { gv_set_load_path(list); return Lt; } for (i=0; i file\n\ which contains an (emodule-define ...) command for that\n\ module. This command implicitly calls (rehash-emodule-path)\n\ to rebuild the application brower from the new path setting.\n\ The special directory name \"+\" is replaced by the existing path,\n\ so e.g. (set-emodule-path (mydir +)) prepends mydir to the path.") { #define MAXDIRS 100 LList *list; LDECLARE(("set-emodule-path", LBEGIN, LLITERAL, LLIST, &list, LEND)); setapath(list, &vv_emodule_path, set_emodule_path); return Lt; } void set_emodule_path(char **dirs) { set_vvpath(&vv_emodule_path, dirs); gv_rehash_emodule_path(); } LDEFINE(rehash_emodule_path, LLIST, "(rehash-emodule-path)\n\ Rebuilds the application (external module) browser by reading\n\ all .geomview-* files in all directories on the emodule-path.\n\ Primarily intended for internal use; any applications defined\n\ by (emodule-define ...) commands outside of the .geomview-*\n\ files on the emodule-path will be lost. Does not sort the\n\ entries in the brower; see (emodule-sort) for that.") { int i; char pat[512], **files, **fp; LDECLARE(("rehash-emodule-path", LBEGIN, LEND)); gv_emodule_clear(); for (i=0; itext); } LDEFINE(all, LLIST, "(all geometry) returns a list of names of all geometry objects.\n\ (all camera) returns a list of names of all cameras.\n\ (all emodule defined) returns a list of all defined external modules.\n\ (all emodule running) returns a list of all running external modules.\n\ Use e.g. ``(echo (all geometry))'' to print such a list.") { char *type, *subtype = ""; int i, wantrunning; DGeom *dg; DView *dv; emodule *em; LList *l = NULL; LDECLARE(("all", LBEGIN, LSTRING, &type, LOPTIONAL, LSTRING, &subtype, LEND)); if (strncmp(type, "geom", 4) == 0) { LOOPGEOMS(i, dg) l = LListAppend(l, LTOOBJ(LSTRING)(&dg->name[1])); } else if (strncmp(type, "cam", 3) == 0) { LOOPVIEWS(i, dv) l = LListAppend(l, LTOOBJ(LSTRING)(&dv->name[1])); } else if (strncmp(type, "emodule", 7) == 0) { wantrunning = (strncmp(subtype, "run", 3) == 0); em = VVEC(uistate.emod, emodule); for(i = VVCOUNT(uistate.emod); --i >= 0; em++) if ((em->pid != 0) == wantrunning) l = LListAppend(l, LTOOBJ(LSTRING)(&em->name)); } else { OOGLError(0, "all: expected \"geometry\" or \"camera\" or \"emodule defined\" or \"emodule running\", got: %s %s\n", type, subtype); return Lnil; } return LNew(LLIST, &l); } LDEFINE(camera_prop, LVOID, "(camera-prop { geometry object } [projective])\n\ Specify the object to be shown when drawing other cameras.\n\ By default, this object is drawn with its origin at the camera,\n\ and with the camera looking toward the object's -Z axis.\n\ With the \"projective\" keyword, the camera's viewing projection is\n\ also applied to the object; this places the object's Z=-1 and Z=+1 at\n\ near and far clipping planes, with the viewing area -1<={X,Y}<=+1.\n\ Example: (camera-prop { < cube } projective)") { Keyword proj = NO_KEYWORD; GeomStruct *gs = NULL; LDECLARE(("camera-prop", LBEGIN, LGEOM, &gs, LOPTIONAL, LKEYWORD, &proj, LEND)); if (proj != NO_KEYWORD && proj != PROJECTIVE_KEYWORD) { OOGLError(1, "Expected either \"%s\" or nothing, but got \"%s\".\n", keywordname(PROJECTIVE_KEYWORD), keywordname(proj)); return Lnil; } if (gs && gs->geom) { REFINCR(gs->geom); REFINCR(gs->h); GeomDelete(drawerstate.camgeom); drawerstate.camgeom = gs->geom; drawerstate.camproj = (proj == PROJECTIVE_KEYWORD); drawerstate.changed = true; return Lt; } return Lnil; } LDEFINE(write, LVOID, "(write {command|geometry|camera|transform|ntransform|window|bbox} FILENAME [ID|(ID ...)] [self|world|universe|otherID])\n\ write description of ID in given format to FILENAME. Last\n\ parameter chooses coordinate system for geometry & transform:\n\ self: just the object, no transformation or appearance (geometry only)\n\ world: the object as positioned within the World.\n\ universe: object's position in universal coordinates;\n\ includes Worldtransform\n\ other ID: the object transformed to otherID's coordinate system.\n\ \n\ A filename of \"-\" is a special case: data are written to the\n\ stream from which the 'write' command was read. For external\n\ modules, the data are sent to the module's standard input.\n\ For commands not read from an external program, \"-\" means\n\ geomview's standard output. (See also the \"command\"\n\ command.)\n\ \n\ The ID can either be a single id or a parenthesized list of\n\ ids, like \"g0\" or \"(g2 g1 dodec.off)\".") { Pool *op, *p; HandleOps *ops; char *opsname; LObject *idobj; char *fname; Lake *hiawatha; int coords = UNIVERSE, val = 1, id; bool temppool = false; bool do_bbox = false; LDECLARE(("write", LBEGIN, LLAKE, &hiawatha, LSTRING, &opsname, LSTRING, &fname, LHOLD, LLOBJECT, &idobj, LOPTIONAL, LID, &coords, LEND)); p = POOL(hiawatha); if (strcmp(opsname, "bbox") == 0) { do_bbox = true; ops = &GeomOps; } if (!do_bbox && (ops = str2ops(opsname)) == NULL) { OOGLError(0, "write: expected one of command|geometry|camera|transform|ntransform|window, got \"%s\"", opsname); return Lnil; } if (fname[0] == '-') { if (PoolOutputFile(p)) { op = p; } else { op = PoolStreamTemp(fname, NULL, stdout, 1, &CommandOps); temppool = true; } } else { op = PoolStreamTemp(fname, NULL, NULL, 1, &CommandOps); temppool = true; } if (op == NULL || PoolOutputFile(op) == NULL) { fprintf(stderr, "write: cannot open \"%s\": %s\n", fname, sperror()); return Lnil; } if (idobj->type == LSTRING || idobj->type == LSYMBOL) { if (!LFROMOBJ(LID)(idobj, &id)) { fprintf(stderr, "write: expects ID or list of IDs in arg position 4\n"); return Lnil; } if (do_bbox) { id = ID(T_NONE, INDEXOF(id)); } val = (worldio(ops, op, coords, id) == 1); } else if (idobj->type == LLIST) { LList *list; for( list = LLISTVAL(idobj); list && list->car; list = list->cdr ) { if (!LFROMOBJ(LID)(list->car, &id)) { fprintf(stderr, "write: expects ID or list of IDs in arg position 2\n"); return Lnil; } if (do_bbox) { id = ID(T_NONE, INDEXOF(id)); } val &= (worldio(ops, op, coords, id) == 1); } } if (temppool) { PoolClose(op); PoolDelete(op); } if (!val) { fprintf(stderr, "write failed\n"); return Lnil; } else return Lt; } /***************************************************/ /* Snapshot code ***********************************/ /***************************************************/ extern snap_entry snapshot_table[]; int general_snapshot(char *fname, int id, DView *view, WnWindow *win, WnPosition *wp, int (*function)(void)) { Camera *cam = NULL; const Appearance *ap; mgcontext *ctx; FILE *f = NULL; WnPosition vp; int mgspace; int failed; f = (fname[0] == '|') ? popen(fname+1, "wb") : fopen(fname, "wb"); if (f == NULL) return -1; mgctxget(MG_CAMERA, &cam); mgctxget(MG_SPACE, &mgspace); #if 0 /* Copy so that changed flags are set */ ap = ApCopy(mggetappearance(NULL), NULL); #else ap = mggetappearance(); #endif mgctxget(MG_WINDOW, &win); win = WnCopy(win); vp.xmin = vp.ymin = 0; vp.xmax = wp->xmax - wp->xmin + 1; vp.ymax = wp->ymax - wp->ymin + 1; WnSet(win, WN_CURPOS, wp, WN_VIEWPORT, &vp, WN_END); function(); ctx = mgctxcreate(MG_CAMERA, cam, MG_APPEAR, ap, MG_WINDOW, win, MG_BACKGROUND, &view->backcolor, MG_BUFFILE, f, MG_SPACE, mgspace, MG_END); mgreshapeviewport(); /* Make camera aspect match window */ { /* Try to be as realistic as possible when dumping a snapshot. * Create a drawing context, install (hopefully) all the * attributes that draw_view() doesn't reset on its own, * plug the ctx into the camera, and force a redraw. * Then undo the subterfuge. */ bool oldredraw = view->redraw; bool oldchanged = view->changed; mgcontext *oldctx = view->mgctx; view->mgctx = ctx; view->redraw = true; gv_draw(view->id); view->redraw = oldredraw, view->changed = oldchanged; view->mgctx = oldctx; } fflush(f); mgctxdelete(ctx); #if 0 ApDelete(ap); #endif mgctxselect(view->mgctx); /* Revert to previous device */ failed = (fname[0] != '|') ? fclose(f) : pclose(f); return failed; } LDEFINE(snapshot, LINT, "(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])\n" "Save a snapshot of CAM-ID in the FILENAME (a string).") { DView *dv; WnWindow *wn = NULL; WnPosition wp; int id, xsize = 0, ysize = 0; char *fname, *format; int i, failed = -1; if (snapshot_table[0].name) format = snapshot_table[0].name; else format = "ppm"; LDECLARE(("snapshot", LBEGIN, LID, &id, LSTRING, &fname, LOPTIONAL, LSTRING, &format, LINT, &xsize, LINT, &ysize, LEND)); if (!ISCAM(id) || (dv = (DView *)drawer_get_object(id)) == NULL || dv->mgctx == NULL) { OOGLError(0, "snapshot: id %d: no such camera", id); return LCopy(L1); } mgctxselect(dv->mgctx); mgctxget(MG_WINDOW, &wn); wp.xmin = wp.ymin = 0; wp.xmax = wp.ymax = 399; /* Avoid catastrophe */ WnGet(wn, WN_CURPOS, &wp); if (xsize > 0 || ysize > 0) { int dx = wp.xmax - wp.xmin + 1; int dy = wp.ymax - wp.ymin + 1; if (xsize <= 0) xsize = (dx * ysize + dy/2) / dy; else if (ysize <= 0) ysize = (dy * xsize + dx/2) / dx; wp.xmax = wp.xmin + xsize - 1; wp.ymax = wp.ymin + ysize - 1; } for (i=0; snapshot_table[i].function!=NULL; i++) if (!strcmp(format, snapshot_table[i].name)) { failed = snapshot_table[i].function(fname, id, dv, wn, &wp); break; } if (!strcmp(format, "ppm")) { failed = general_snapshot(fname, id, dv, wn, &wp, mgdevice_BUF); } else if (!strcmp(format, "ps")) { failed = general_snapshot(fname, id, dv, wn, &wp, mgdevice_PS); } if (failed == -1) OOGLError(0, "snapshot: unknown file format %s", format); return failed ? Lnil : Lt; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/common/worldio.h0000644000175000017500000000247512310110177016573 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ int worldio(HandleOps *ops, Pool *p, int wrap, int id); /* Used to declare table of snapshot functions/names "snapshot_table" */ #ifndef SNAP_ENTRY #define SNAP_ENTRY /* snapshot functions return 0 on success, nonzero on failure. */ typedef struct _snap_entry { int (*function)(char *, int, DView *, WnWindow *, WnPosition *); char *name; } snap_entry; #endif geomview-1.9.5/src/bin/geomview/common/Headers0000644000175000017500000000001312310110177016223 00000000000000pickfunc.h geomview-1.9.5/src/bin/geomview/x11/0000755000175000017500000000000012310165604014141 500000000000000geomview-1.9.5/src/bin/geomview/x11/Makefile.in0000644000175000017500000006610012310165552016133 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ module_PROGRAMS = gvx$(EXEEXT) subdir = src/bin/geomview/x11 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(moduledir)" PROGRAMS = $(module_PROGRAMS) am_gvx_OBJECTS = gvappear.$(OBJEXT) gvcameras.$(OBJEXT) \ gvcamui.$(OBJEXT) gvcolor.$(OBJEXT) gvcommands.$(OBJEXT) \ gvcredits.$(OBJEXT) gvevent.$(OBJEXT) gvfiles.$(OBJEXT) \ gvlights.$(OBJEXT) gvload.$(OBJEXT) gvmain.$(OBJEXT) \ gvmaterial.$(OBJEXT) gvmnpanel.$(OBJEXT) gvsave.$(OBJEXT) \ gvtoolui.$(OBJEXT) gvui.$(OBJEXT) gvx_OBJECTS = $(am_gvx_OBJECTS) am__DEPENDENCIES_1 = 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(gvx_SOURCES) DIST_SOURCES = $(gvx_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir 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 DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) $(MOTIFINCLUDE) $(OPENGLINCLUDE) $(X_CFLAGS) -I.. SUBDIRS = bitmaps interface gvx_LDADD = ../common/libgvcommon.a buildinfo.o \ $(MOTIFUILIB) $(MOTIFLIBS) $(XMULIBS) $(OOGLLIB) $(XLIBS) gvx_DEPENDENCIES = ../common/libgvcommon.a buildinfo.o $(OOGLLIB) gvx_SOURCES = \ gvappear.c gvcameras.c gvcamui.c gvcolor.c gvcommands.c gvcredits.c\ gvevent.c gvfiles.c gvlights.c gvload.c gvmain.c gvmaterial.c gvmnpanel.c\ gvsave.c gvtoolui.c gvui.c gvui.h DISTCLEANFILES = buildinfo.c clang.c clang.h all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomview/x11/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomview/x11/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-modulePROGRAMS: $(module_PROGRAMS) @$(NORMAL_INSTALL) @list='$(module_PROGRAMS)'; test -n "$(moduledir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(moduledir)'"; \ $(MKDIR_P) "$(DESTDIR)$(moduledir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-modulePROGRAMS: @$(NORMAL_UNINSTALL) @list='$(module_PROGRAMS)'; test -n "$(moduledir)" || 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)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files clean-modulePROGRAMS: @list='$(module_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list gvx$(EXEEXT): $(gvx_OBJECTS) $(gvx_DEPENDENCIES) $(EXTRA_gvx_DEPENDENCIES) @rm -f gvx$(EXEEXT) $(AM_V_CCLD)$(LINK) $(gvx_OBJECTS) $(gvx_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvappear.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvcameras.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvcamui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvcolor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvcommands.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvcredits.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvevent.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvfiles.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvlights.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvload.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvmain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvmaterial.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvmnpanel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvsave.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvtoolui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvui.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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" cscopelist: cscopelist-recursive 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-modulePROGRAMS \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-modulePROGRAMS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-modulePROGRAMS .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool \ clean-modulePROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-modulePROGRAMS install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-modulePROGRAMS buildinfo.c: $(gvx_OBJECTS) ../common/libgvcommon.a (echo 'char builddate[] = "'"`date +%Y%m%d%H%M`"'";'; \ echo 'char buildinfo1[] = "'" By `whoami`@`hostname`[`uname -s`-`uname -r`]"'";'; \ echo 'char buildinfo2[] = "'" On `date`"'";'; \ ) > buildinfo.c ../clang.c ../clang.h: cd .. && $(MAKE) $(AM_MAKEFLAGS) clang # 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: geomview-1.9.5/src/bin/geomview/x11/Makefile.am0000644000175000017500000000162012310110177016107 00000000000000INCLUDES = $(default_includes) $(MOTIFINCLUDE) $(OPENGLINCLUDE) $(X_CFLAGS) -I.. SUBDIRS = bitmaps interface gvx_LDADD = ../common/libgvcommon.a buildinfo.o \ $(MOTIFUILIB) $(MOTIFLIBS) $(XMULIBS) $(OOGLLIB) $(XLIBS) gvx_DEPENDENCIES = ../common/libgvcommon.a buildinfo.o $(OOGLLIB) #gvx_LDFLAGS = -rpath $(libdir) module_PROGRAMS = gvx gvx_SOURCES =\ gvappear.c gvcameras.c gvcamui.c gvcolor.c gvcommands.c gvcredits.c\ gvevent.c gvfiles.c gvlights.c gvload.c gvmain.c gvmaterial.c gvmnpanel.c\ gvsave.c gvtoolui.c gvui.c gvui.h buildinfo.c: $(gvx_OBJECTS) ../common/libgvcommon.a (echo 'char builddate[] = "'"`date +%Y%m%d%H%M`"'";'; \ echo 'char buildinfo1[] = "'" By `whoami`@`hostname`[`uname -s`-`uname -r`]"'";'; \ echo 'char buildinfo2[] = "'" On `date`"'";'; \ ) > buildinfo.c ../clang.c ../clang.h: cd .. && $(MAKE) $(AM_MAKEFLAGS) clang DISTCLEANFILES = buildinfo.c clang.c clang.hgeomview-1.9.5/src/bin/geomview/x11/gvappear.c0000644000175000017500000002506012310110177016030 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "../common/drawer.h" #include "../common/ui.h" #include "gvui.h" #include static /* prefix to ``char Root[]...'' */ #include "interface/Appearance.mib" extern Display *dpy; extern Pixmap geomicon; /* private methods and variables */ /*****************************************************************************/ static void revert_appearance(Widget, XtPointer, XmAnyCallbackStruct *); void ap_toggle(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void ap_color(Widget, XtPointer, XmAnyCallbackStruct *); static void list_callbacks(Widget, XtPointer, XmListCallbackStruct *); static void text_callbacks(Widget, XtPointer, XmAnyCallbackStruct *); static Widget NormalList, ShadeList, OverrideToggle, FaceToggle, FaceColor, EdgeToggle, EdgeColor, NormalToggle, NormalColor, BBoxToggle, BBoxColor, VectToggle, TexToggle, TexQToggle, ShadeLineToggle, ConcaveToggle, FacingNormalsToggle, BezDiceInput, NormalScaleInput, LineWidthInput; static int NormalListSet = -1, ShadeListSet = -1; static int FaceSet = 0, EdgeSet = 0, NormalSet = 0, BBoxSet = 0, VectSet = 0, TexSet = 0, TexQSet = 0, ConcaveSet = 0, FacingNormalsSet = 0, OverrideSet = 0; static int app_loaded = 0; static char AppearancE[] = "Appearance"; /*****************************************************************************/ static struct awid { enum what { TOG, BTN, TXT, LST } type; char *name; Widget *widp; void (*callback)(); XtPointer cbdata; } awidgets[] = { {BTN, "HideButton", NULL, ui_hide, AppearancE }, {BTN, "RevButton", NULL, revert_appearance, NULL }, {TOG, "OverrideToggle",&OverrideToggle,ap_toggle,(XtPointer)DRAWER_APOVERRIDE }, {TOG, "TexToggle", &TexToggle, ap_toggle, (XtPointer)DRAWER_TEXTUREDRAW }, {TOG, "TexQToggle", &TexQToggle, ap_toggle, (XtPointer)DRAWER_TEXTUREQUAL }, {TOG, "ShadeLineToggle",&ShadeLineToggle,ap_toggle,(XtPointer)DRAWER_SHADELINES }, {TOG, "ConcaveToggle",&ConcaveToggle,ap_toggle,(XtPointer)DRAWER_CONCAVE }, {TOG, "FacingNormalsToggle",&FacingNormalsToggle,ap_toggle, (XtPointer)DRAWER_EVERT }, {TOG, "VectToggle",&VectToggle, ap_toggle, (XtPointer)DRAWER_VECTDRAW }, {TOG, "BBoxToggle",&BBoxToggle, ap_toggle, (XtPointer)DRAWER_BBOXDRAW }, {TOG, "NormalToggle",&NormalToggle,ap_toggle,(XtPointer)DRAWER_NORMALDRAW }, {TOG, "FaceToggle",&FaceToggle, ap_toggle, (XtPointer)DRAWER_FACEDRAW }, {TOG, "EdgeToggle",&EdgeToggle, ap_toggle, (XtPointer)DRAWER_EDGEDRAW }, {BTN, "BBoxColor",&BBoxColor, ap_color, (XtPointer)DRAWER_BBOXCOLOR }, {BTN, "NormalColor",&NormalColor,ap_color,(XtPointer)DRAWER_NORMALCOLOR }, {BTN, "FaceColor",&FaceColor, ap_color, (XtPointer)DRAWER_DIFFUSE }, {BTN, "EdgeColor",&EdgeColor, ap_color, (XtPointer)DRAWER_EDGECOLOR }, {TXT, "DiceInput",&BezDiceInput, text_callbacks, (XtPointer)DRAWER_BEZDICE }, {TXT, "NormInput",&NormalScaleInput, text_callbacks, (XtPointer)DRAWER_NORMSCALE }, {TXT, "LineInput",&LineWidthInput, text_callbacks, (XtPointer)DRAWER_LINEWIDTH }, {LST, "NormList",&NormalList,list_callbacks, (XtPointer)DRAWER_NORMALIZATION }, {LST, "ShadeList",&ShadeList,list_callbacks, (XtPointer)DRAWER_SHADING }, }; void ui_load_appearancepanel() { int i; Widget appform; struct awid *a; mib_Widget *appload; /*****************************************************************************/ ui_make_panel_and_form(AppearancE, Root, False, True, &appform); /*appload = mib_load_interface(appform, "interface/Appearance.mib", MI_FROMFILE);*/ appload = mib_load_interface(appform, Root, MI_FROMSTRING); XtManageChild(appform); /*****************************************************************************/ NormalList = mib_find_name(appload, "NormList")->me; ShadeList = mib_find_name(appload, "ShadeList")->me; for(i = 0, a = awidgets; i < COUNT(awidgets); i++, a++) { Widget w = mib_find_name(appload, a->name)->me; if (a->widp) *a->widp = w; switch(a->type) { case BTN: XtAddCallback(w, XmNactivateCallback, (XtCallbackProc) a->callback, a->cbdata); break; case TOG: XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc) a->callback, a->cbdata); break; case TXT: XtAddCallback(w, XmNactivateCallback, (XtCallbackProc)a->callback, a->cbdata); XtAddCallback(w, XmNlosingFocusCallback, (XtCallbackProc)a->callback, a->cbdata); break; case LST: XtAddCallback(w, XmNbrowseSelectionCallback, (XtCallbackProc) a->callback, a->cbdata); } } ui_build_browser(NormalList, COUNT(norm), norm); ui_build_browser(ShadeList, COUNT(shades), shades); app_loaded = 1; } /*****************************************************************************/ static void revert_appearance(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { drawer_set_ap( GEOMID(uistate.targetgeom), NULL, NULL ); } /*****************************************************************************/ static void ap_color(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { ui_pickcolor((int)(long)data); } /*****************************************************************************/ void ap_toggle(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { drawer_int(GEOMID(uistate.targetgeom), (DrawerKeyword)(long)data, cbs->set); } /*****************************************************************************/ static void set_toggle(Widget w, int *current, int val) { if (*current != (val != 0)) { *current = (val != 0); XmToggleButtonSetState(w, *current, False); } } void set_ap_toggle(Widget w, int *current, Appearance *ap, int flagbit) { set_toggle(w, current, (ap->flag & flagbit)); } /*****************************************************************************/ void ui_target_appearancepanel(int id) { if (!app_loaded) return; if (ISGEOM(id)) { DGeom *dg; Appearance *ap; int val; if ((dg = (DGeom *)drawer_get_object(id))) { ap = drawer_get_ap(id); set_ap_toggle(FaceToggle, &FaceSet, ap, APF_FACEDRAW); set_ap_toggle(EdgeToggle, &EdgeSet, ap, APF_EDGEDRAW); set_ap_toggle(NormalToggle, &NormalSet, ap, APF_NORMALDRAW); set_ap_toggle(VectToggle, &VectSet, ap, APF_VECTDRAW); set_ap_toggle(TexToggle, &TexSet, ap, APF_TEXTURE); set_ap_toggle(TexQToggle, &TexQSet, ap, APF_TXMIPMAP|APF_TXMIPINTERP|APF_TXLINEAR); set_ap_toggle(ConcaveToggle, &ConcaveSet, ap, APF_CONCAVE); set_ap_toggle(FacingNormalsToggle, &FacingNormalsSet, ap, APF_EVERT); set_toggle(OverrideToggle, &OverrideSet, uistate.apoverride); set_toggle(BBoxToggle, &BBoxSet, dg->bboxdraw); if ((val = (dg->normalization + 1)) != NormalListSet) { NormalListSet = val; XmListSelectPos(NormalList, val, False); } if ((val = (ap->shading - CONSTANTSHADE + 1)) != ShadeListSet) { ShadeListSet = val; XmListSelectPos(ShadeList, val, False); } ui_set_itext(BezDiceInput, ap->dice[0]); ui_set_ftext(NormalScaleInput, ap->nscale); ui_set_itext(LineWidthInput, ap->linewidth); } } } /*****************************************************************************/ static void list_callbacks(Widget w, XtPointer data, XmListCallbackStruct *cbs) { DrawerKeyword val = (DrawerKeyword)(long)data; int offset = 0; switch (val) { case DRAWER_NORMALIZATION: NormalListSet = offset = cbs->item_position - 1; break; case DRAWER_SHADING: ShadeListSet = offset = cbs->item_position - 1 + CONSTANTSHADE; break; default: OOGLError(1, "Bogus browser callback.\n"); return; } drawer_int(GEOMID(uistate.targetgeom), val, offset); } /*****************************************************************************/ static int getfloat(char *str, float *fp) { if (sscanf(str, "%f", fp)) return 1; else return 0; } /*****************************************************************************/ static void ui_float(char *str, DrawerKeyword key, int id, float min, float max) { float f; if (getfloat(str, &f)) { if (f < min) f = min; else if (f > max) f = max; drawer_float(id, key, f); } else { ui_select(id); } } /*****************************************************************************/ static int getint(char *str, int *ip) { char *after; *ip = strtol(str, &after, 0); return str != after; } /*****************************************************************************/ static void ui_int(char *str, DrawerKeyword key, int id, int min, int max) { int i; if (getint(str, &i)) { if (i < min) i = min; else if (i > max) i = max; drawer_int(id, key, i); } else { ui_select(id); } } /*****************************************************************************/ static void text_callbacks(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { DrawerKeyword val = (DrawerKeyword)(long)data; char *str; str = XmTextFieldGetString(w); XmTextFieldSetInsertionPosition(w, (XmTextPosition) 0); switch(val) { case DRAWER_BEZDICE: ui_int(str, val, GEOMID(uistate.targetgeom), 0, 999); break; case DRAWER_NORMSCALE: ui_float(str, val, GEOMID(uistate.targetgeom), 0.0, 999.0); break; case DRAWER_LINEWIDTH: ui_int(str, val, GEOMID(uistate.targetgeom), 1, 256); break; default: break; } XtFree(str); } /*****************************************************************************/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/x11/gvcameras.c0000644000175000017500000003513212310110177016174 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "mibload.h" #include "mibwidgets.h" #include "../common/drawer.h" #include "../common/ui.h" #include "../common/lang.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Cameras.mib" extern Display *dpy; extern Pixmap geomicon; /* public methods */ /*****************************************************************************/ void ui_target_cameraspanel(int); /* private methods and variables */ /*****************************************************************************/ static void background_color(Widget, XtPointer, XmAnyCallbackStruct *); static void soft_shading(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void draw_cams(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void draw_sphere(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void toggle_dither(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void toggle_singlebuffer(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs); static void list_callbacks(Widget, XtPointer, XmListCallbackStruct *); static void text_callbacks(Widget, XtPointer, XmAnyCallbackStruct *); static void depth_callbacks(Widget, XtPointer, XmAnyCallbackStruct *); static void ui_float(char *, DrawerKeyword, int, float, float); static Widget ProjectList, CurrentCam, ModelList, SphereToggle, DitherToggle, SingleBuffer, SoftShade, DrawCams, NearClipText, FarClipText, FOVText, FocalText, LinesText; mib_Widget *DepthMenu; static int currentcam_id, modelpos, projpos; static int dither_state = 0; static int depth_state = 0; static float keepfov; static char lastcamname[255]; static char store[255]; /*static char geometry[40];*/ /*static int pos_later = 0, posx = 0, posy = 0;*/ /*****************************************************************************/ void ui_load_cameraspanel() { int i; Widget camerasform, HideButton, TempWidget; mib_Widget *camerasload; static char Cameras[] = "Cameras"; /*****************************************************************************/ ui_make_panel_and_form(Cameras, Root, False, True, &camerasform); /*camerasload = mib_load_interface(camerasform, "interface/Cameras.mib", MI_FROMFILE);*/ camerasload = mib_load_interface(camerasform, Root, MI_FROMSTRING); XtManageChild(camerasform); /*****************************************************************************/ HideButton = mib_find_name(camerasload, "HideButton")->me; ProjectList = mib_find_name(camerasload, "ProjectList")->me; ModelList = mib_find_name(camerasload, "SpaceModelList")->me; CurrentCam = mib_find_name(camerasload, "CurrentLabel")->me; DrawCams = mib_find_name(camerasload, "DrawCamsButton")->me; SphereToggle = mib_find_name(camerasload, "DrawSphereToggle")->me; DitherToggle = mib_find_name(camerasload, "DitherToggle")->me; SingleBuffer = mib_find_name(camerasload, "Singlebuffer")->me; SoftShade = mib_find_name(camerasload, "SoftShadeButton")->me; NearClipText = mib_find_name(camerasload, "NCText")->me; FarClipText = mib_find_name(camerasload, "FCText")->me; FOVText = mib_find_name(camerasload, "FOVText")->me; FocalText = mib_find_name(camerasload, "FLText")->me; LinesText = mib_find_name(camerasload, "LCText")->me; DepthMenu = mib_find_name(camerasload, "DepthMenu"); XtAddCallback(HideButton, XmNactivateCallback, (XtCallbackProc) ui_hide, (XtPointer)Cameras); XtAddCallback(ProjectList, XmNbrowseSelectionCallback, (XtCallbackProc) list_callbacks, (XtPointer) DRAWER_PROJECTION); XtAddCallback(ModelList, XmNbrowseSelectionCallback, (XtCallbackProc) list_callbacks, (XtPointer) NULL); XtAddCallback(DrawCams, XmNvalueChangedCallback, (XtCallbackProc) draw_cams, (XtPointer) NULL); XtAddCallback(SphereToggle, XmNvalueChangedCallback, (XtCallbackProc) draw_sphere, (XtPointer) NULL); XtAddCallback(DitherToggle, XmNvalueChangedCallback, (XtCallbackProc) toggle_dither, (XtPointer) NULL); XtAddCallback(SingleBuffer, XmNvalueChangedCallback, (XtCallbackProc) toggle_singlebuffer, (XtPointer) NULL); XtAddCallback(NearClipText, XmNactivateCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_NEAR); XtAddCallback(NearClipText, XmNlosingFocusCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_NEAR); XtAddCallback(FarClipText, XmNactivateCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_FAR); XtAddCallback(FarClipText, XmNlosingFocusCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_FAR); XtAddCallback(FOVText, XmNactivateCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_FOV); XtAddCallback(FOVText, XmNlosingFocusCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_FOV); XtAddCallback(FocalText, XmNactivateCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_FOCALLENGTH); XtAddCallback(FocalText, XmNlosingFocusCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_FOCALLENGTH); XtAddCallback(LinesText, XmNactivateCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_LINE_ZNUDGE); XtAddCallback(LinesText, XmNlosingFocusCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_LINE_ZNUDGE); for (i=0; i<3; i++) XtAddCallback(((mib_Menu *)DepthMenu->myres)->items[i], XmNactivateCallback, (XtCallbackProc) depth_callbacks, (XtPointer)(long) i); /*****************************************************************************/ TempWidget = mib_find_name(camerasload, "BackColorButton")->me; XtAddCallback(TempWidget, XmNactivateCallback, (XtCallbackProc) background_color, (XtPointer) NULL); /* Determine MG type at run time... */ if(_mgf.mg_devno == MGD_X11) { /* if we're using X11 driver */ XtUnmanageChild(SingleBuffer); } else { XtUnmanageChild(DepthMenu->me); XtAddCallback(SoftShade, XmNvalueChangedCallback, (XtCallbackProc) soft_shading, (XtPointer) NULL); } ui_build_browser(ProjectList, COUNT(proj), proj); ui_build_browser(ModelList, COUNT(mdl), mdl); /*****************************************************************************/ lastcamname[0] = '\0'; modelpos = -1; projpos = -1; keepfov = 0.0; } /*****************************************************************************/ static void background_color(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { ui_pickcolor(DRAWER_BACKCOLOR); } /*****************************************************************************/ static void soft_shading(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { gv_soft_shader(currentcam_id, cbs->set ? ON_KEYWORD : OFF_KEYWORD); } /*****************************************************************************/ static void draw_cams(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { int number; DView *dv; dv = (DView *)drawer_get_object(currentcam_id); number = dv ? !dv->cameradraw : 1; drawer_int(currentcam_id, DRAWER_CAMERADRAW, number); } /*****************************************************************************/ static void draw_sphere(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { drawer_int(currentcam_id, DRAWER_HSPHERE, cbs->set); } /*****************************************************************************/ static void toggle_singlebuffer(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { DView *dv; if((dv = (DView *)drawer_get_object(currentcam_id)) == NULL) return; mgctxselect(dv->mgctx); mgctxset(cbs->set ? MG_UNSETOPTIONS : MG_SETOPTIONS, MGO_DOUBLEBUFFER, MG_END); gv_redraw(dv->id); } /*****************************************************************************/ static void toggle_dither(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { DView *dv; dither_state = cbs->set; if((dv = (DView *)drawer_get_object(currentcam_id)) == NULL) return; mgctxselect(dv->mgctx); mgctxset(MG_DITHER, cbs->set, MG_END); gv_redraw(dv->id); } /*****************************************************************************/ static int getfloat(char *str, float *fp) { if (sscanf(str, "%f", fp)) return 1; else return 0; } /*****************************************************************************/ static void ui_float(char *str, DrawerKeyword key, int id, float min, float max) { float f; if(getfloat(str, &f) && strcmp(str,store)) { if(f < min) f = min; else if(f > max) f = max; drawer_float(id, key, f); } else { ui_select(id); } } /*****************************************************************************/ static void text_callbacks( Widget w, XtPointer data, XmAnyCallbackStruct *cbs ) { DrawerKeyword val = (DrawerKeyword)(long)data; char *str; DView *dv; int persp = 0; str = XmTextFieldGetString(w); /* XmTextFieldSetInsertionPosition(w, (XmTextPosition) 0); */ switch(val) { case DRAWER_NEAR: case DRAWER_FAR: ui_float(str, val, currentcam_id, -1e20, 1e20); break; case DRAWER_FOV: dv = (DView *)drawer_get_object(currentcam_id); if(dv) CamGet(dv->cam, CAM_PERSPECTIVE, &persp); ui_float(str, val, currentcam_id, 1e-7, persp ? 179.999 : 1e20); break; case DRAWER_FOCALLENGTH: ui_float(str, val, currentcam_id, 1e-20, 1e20); break; case DRAWER_LINE_ZNUDGE: ui_float(str, val, currentcam_id, -10000., 10000.); break; default: break; } XtFree(str); } /*****************************************************************************/ static void list_callbacks( Widget w, XtPointer data, XmListCallbackStruct *cbs ) { int id; DrawerKeyword val = (DrawerKeyword)(long)data; if (!val) { modelpos = cbs->item_position; gv_hmodel(currentcam_id, hmodelkeyword("ModelBrowserProc", (HModelValue)(cbs->item_position - 1))); return; } else if (val == DRAWER_PROJECTION) { projpos = cbs->item_position; id = currentcam_id; drawer_int( id, val, cbs->item_position - 1); return; } else OOGLError(1,"invalid val (%d) in ObscureBrowserProc", val); return; } /*****************************************************************************/ static void depth_callbacks( Widget w, XtPointer data, XmAnyCallbackStruct *cbs ) { DView *dv; int type = (int)(long)data; depth_state = type; dv = (DView *)drawer_get_object(currentcam_id); mgctxselect(dv->mgctx); mgctxset(MG_DEPTHSORT, type, MG_END); gv_redraw(dv->id); return; } /*****************************************************************************/ void ui_target_cameraspanel(int id) { char *name; XmString xname; DView *dv; float f; int persp, opts, exists = 0; extern int id_exists(int); extern int real_id(int); if ((exists = id_exists(real_id(id)))) name = drawer_id2name(real_id(id)); else name = "No Camera"; currentcam_id = id; if (strcmp(name, lastcamname)) { sprintf(lastcamname, "%s", name); xname = XmStringCreateSimple(name); XtVaSetValues(CurrentCam, XmNlabelString, xname, NULL); XmStringFree(xname); } if (exists) { dv = (DView *) drawer_get_object(currentcam_id); if ((dv->hsphere != NULL) != XmToggleButtonGetState(SphereToggle)) XmToggleButtonSetState(SphereToggle, dv->hsphere != NULL, False); if (dv->cameradraw != XmToggleButtonGetState(DrawCams)) XmToggleButtonSetState(DrawCams, dv->cameradraw, False); mgctxselect(dv->mgctx); mgctxget(MG_SETOPTIONS, &opts); if(((opts & MGO_DOUBLEBUFFER) == 0) != XmToggleButtonGetState(SingleBuffer)) XmToggleButtonSetState(SingleBuffer, (opts & MGO_DOUBLEBUFFER) == 0, False); if ((dv->shader != NULL) != XmToggleButtonGetState(SoftShade)) XmToggleButtonSetState(SoftShade, dv->shader != NULL, False); update_x11_depth(dv, DepthMenu, DitherToggle, &depth_state, &dither_state); if (modelpos != (int)(dv->hmodel + 1)) { XmListSelectPos(ModelList, dv->hmodel + 1, False); modelpos = dv->hmodel + 1; } CamGet(dv->cam, CAM_PERSPECTIVE, &persp); if (projpos != (persp + 1)) { XmListSelectPos(ProjectList, persp + 1, False); projpos = persp + 1; } CamGet(dv->cam, CAM_NEAR, &f); ui_set_ftext(NearClipText, f); CamGet(dv->cam, CAM_FAR, &f); ui_set_ftext(FarClipText, f); CamGet(dv->cam, CAM_FOV, &f); if (f != keepfov) { keepfov = f; ui_set_ftext(FOVText, f); } CamGet(dv->cam, CAM_FOCUS, &f); ui_set_ftext(FocalText, f); ui_set_itext(LinesText, (int)dv->lineznudge); } } /*****************************************************************************/ void update_x11_depth(DView *dv, mib_Widget *DepthMenu, Widget DitherToggle, int *depth_state, int *dither_state) { int depth, bitdepth, dither; if(XtIsManaged(DepthMenu->me)) { mgctxselect(dv->mgctx); mgctxget(MG_DEPTHSORT, &depth); if ((depth >= 0) && (depth < 3)) { if (*depth_state != depth) { XtVaSetValues(DepthMenu->me, XmNmenuHistory, ((mib_Menu *)DepthMenu->myres)->items[depth], NULL); *depth_state = depth; } } } mgctxget(MG_BITDEPTH, &bitdepth); if (bitdepth == 1) XtUnmanageChild(DitherToggle); else { mgctxget(MG_DITHER, &dither); if (*dither_state != dither) { XmToggleButtonSetState(DitherToggle, dither, False); *dither_state = dither; } } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/x11/gvcamui.c0000644000175000017500000011244512310110177015662 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_ # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "../common/drawer.h" #include "../common/ui.h" #include "../common/worldio.h" #include "../common/transform.h" #include "../common/main.h" #include "mibwidgets.h" #include "gvui.h" #include "windowP.h" #include #include #include #include #include #include #include /* for XtConfigureWidget() */ #if HAVE_XMU # include /* XmuLookupStandardColormap */ #endif /* * All compile-time dependencies on graphics type (X11/GL/OPENGL) * reside in this file. */ /* Don't worry about that #error stuff, configure makes sure that at * least MGX11 is defined (look in config.h) */ #if !MGGL && !MGX11 && !MGOPENGL # error Need at least one graphics type (X11/OpenGL/GL) to render with! #endif /* Define the global option variabl `gv_no_opengl' to be always * logical true if we have no OpenGL available. This simplifies some * if-cases in this file which otherwise would have to be wrapped into * some more preprocessor `#if'-constructs. */ #if !MGGL && !MGOPENGL # define gv_no_opengl 1 #endif #include "mg.h" #if MGX11 # include "mgx11.h" #endif #if MGGL # include "mggl.h" # include # include #endif #if MGOPENGL # include "mgopengl.h" # define GL_GLEXT_PROTOTYPES # include # include # include # ifdef MESA # define OPENGL_BUILDINFOGRAPHICS "OpenGL(MESA)" # else # define OPENGL_BUILDINFOGRAPHICS "OpenGL" # endif /*!MESA*/ #endif #ifdef OPENGL_BUILDINFOGRAPHICS # if MGX11 char *buildinfographics = OPENGL_BUILDINFOGRAPHICS"/X11"; # else char *buildinfographics = OPENGL_BUILDINFOGRAPHICS; # endif #else char *buildinfographics = "X11"; #endif /* Hack. We need to associate some other windows with a DrawingArea widget. * In X11R6, there's a nice public XtRegisterDrawable() function. * In X11R5 and X11R4, there's an unpublished _XtRegisterWindow() instead. * So if we're not at least R6, use the latter. */ #if (XtSpecificationRelease < 6) || defined(AVOID_X11R6) # define XtRegister_window(dpy, win, wid) _XtRegisterWindow(win, wid) # define XtUnregister_window(dpy, win, wid) _XtUnregisterWindow(win, wid) #else # define XtRegister_window(dpy, win, wid) XtRegisterDrawable(dpy, win, wid) # define XtUnregister_window(dpy, win, wid) XtUnregisterDrawable(dpy, win) #endif extern Display *dpy; extern UIState uistate; extern Pixmap geomicon; /* private methods and variables */ /*****************************************************************************/ static void ui_delete_camera(Widget, XtPointer, XmAnyCallbackStruct *); #if MGOPENGL static Colormap getcmapfor(XVisualInfo *vi); #endif /*****************************************************************************/ enum buffering { SGL=0, DBL=1, BUFTYPES }; static vvec camshells; struct cursor { int id; Cursor c; } cursors[2]; struct camwins { Window shellwin; Window wins[BUFTYPES]; #if MGOPENGL XVisualInfo *vi[BUFTYPES]; #endif int curs; }; #if MGOPENGL static Colormap oglcmap[2]; #endif /*****************************************************************************/ void cam_mgdevice() { if (gv_no_opengl) { #if MGX11 mgdevice_X11(); #endif } else { #if MGGL mgdevice_GL(); #endif #if MGOPENGL mgdevice_OPENGL(); #endif } } /*****************************************************************************/ static Widget camshellof(int id, struct camwins **cwp) { struct camwins *cw; Widget w; if (id < 0 || INDEXOF(id) >= VVCOUNT(camshells)) { return NULL; } cw = VVINDEX(camshells, struct camwins, INDEXOF(id)); if ((w = XtWindowToWidget(dpy, cw->shellwin)) == NULL) { return NULL; } if (cwp) { *cwp = cw; } return w; } static void fitwins(Widget w, struct camwins *cw) { /* If we have private windows, may need to resize them. */ Dimension height = 100, width = 100; int n; XtVaGetValues(w, XmNwidth, &width, XmNheight, &height, NULL); for(n = SGL; n <= DBL; n++) { if (cw->wins[n] != 0) /* (0 if unset from vvzero(&camwins)) */ XResizeWindow(dpy, cw->wins[n], width, height); } } static int setwinargs(ArgList args, int n, WnWindow *win, int changed, int *sizep, char **titlep, Widget w) { WnPosition prefpos; int enlarge = 1, shrink = 1; int sx = 350, sy = 350, noborder = 0, haspref, hassize; static char geometry[30]; WnGet(win, WN_ENLARGE, &enlarge); WnGet(win, WN_SHRINK, &shrink); hassize = WnGet(win, WN_XSIZE, &sx); hassize &= WnGet(win, WN_YSIZE, &sy); WnGet(win, WN_NAME, titlep); WnGet(win, WN_NOBORDER, &noborder); haspref = WnGet(win, WN_PREFPOS, &prefpos); if (changed & WNF_HASNAME) { XtSetArg(args[n], XmNtitle, *titlep); n++; } if ((changed & WNF_HASPREF) && haspref > 0) { sx = prefpos.xmax - prefpos.xmin + 1; sy = prefpos.ymax - prefpos.ymin + 1; sprintf(geometry, "=%dx%d+%d-%d", sx, sy, prefpos.xmin, prefpos.ymin); XtSetArg(args[n], XmNgeometry, geometry); n++; if (w != NULL) XtConfigureWidget(w, prefpos.xmin, HeightOfScreen(XtScreen(w))-prefpos.ymax-1, sx, sy, 0); } if ((changed & WNF_HASSIZE) && hassize == 1) { XtSetArg(args[n], XmNwidth, sx); n++; XtSetArg(args[n], XmNheight, sy); n++; } if (changed & WNF_NOBORDER) { XtSetArg(args[n], XmNmwmDecorations, noborder ? 0 : MWM_DECOR_ALL); n++; } if (changed & (WNF_ENLARGE|WNF_SHRINK)) { XtSetArg(args[n], XmNmwmFunctions, enlarge||shrink ? MWM_FUNC_ALL : (MWM_FUNC_ALL|MWM_FUNC_RESIZE)); n++; } if (sizep) { sizep[0] = sx; sizep[1] = sy; } return n; } void cam_winchange(mgcontext *mgc, void *data, int why, ...) { va_list args; WnWindow *win; int n, changed; int id = (int)(long) data; struct camwins *cw; Widget w; char *title = "gvwin"; if ((w = camshellof(id, &cw)) == NULL) return; va_start(args, why); switch(why) { case MGW_WINDELETE: ui_delete_camera(w, data, NULL); break; case MGW_WINCHANGE: win = va_arg(args, WnWindow *); changed = win->changed; if (changed & (WNF_ENLARGE|WNF_SHRINK|WNF_NOBORDER |WNF_HASPREF|WNF_HASSIZE|WNF_HASNAME)) { Arg args[20]; n = setwinargs(args, 0, win, win->changed, NULL, &title, w); XtSetValues(w, args, n); win->changed &= ~(WNF_ENLARGE|WNF_SHRINK|WNF_NOBORDER |WNF_HASPREF|WNF_HASSIZE|WNF_HASNAME); } if (changed & (WNF_HASCUR|WNF_HASSIZE|WNF_HASPREF)) fitwins(w, cw); break; } va_end(args); } Widget ui_create_camera(Widget parent, DView *dv) { int id = dv->id; Arg args[20]; int n, size[2]; char *title; struct camwins *cw; Atom AProtocol; Widget shell, camform, camdraw[2] = { NULL, NULL }; int i; #if MGOPENGL XSetWindowAttributes xswa; Window cmw[32]; int cmwneeded; #endif #if MGOPENGL struct oglstuff { int setGLXwin, setGLXctx; int *attribs; GLXContext cx; Colormap cm; }; static int dblBuf[] = { GLX_DOUBLEBUFFER, GLX_RGBA, GLX_DEPTH_SIZE, 16, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, None }; static struct oglstuff ogl[2] = { { MG_GLXSINGLEWIN, MG_GLXSINGLECTX, dblBuf+1 }, { MG_GLXDOUBLEWIN, MG_GLXDOUBLECTX, dblBuf }, }; struct oglstuff *oglp; GLXContext sharectx = None; #endif #if MGGL static GLXconfig db_rgb_desc[] = { { GLX_NORMAL, GLX_VISUAL, GLX_NONE }, { GLX_NORMAL, GLX_COLORMAP, GLX_NONE }, { GLX_NORMAL, GLX_WINDOW, GLX_NONE }, { GLX_NORMAL, GLX_VISUAL, GLX_NONE }, { GLX_NORMAL, GLX_DOUBLE, TRUE}, { GLX_NORMAL, GLX_RGB, TRUE}, { GLX_NORMAL, GLX_ZSIZE, GLX_NOCONFIG }, { 0,0,0 } }; static GLXconfig sg_rgb_desc[] = { { GLX_NORMAL, GLX_VISUAL, GLX_NONE }, { GLX_NORMAL, GLX_COLORMAP, GLX_NONE }, { GLX_NORMAL, GLX_WINDOW, GLX_NONE }, { GLX_NORMAL, GLX_DOUBLE, FALSE}, { GLX_NORMAL, GLX_RGB, TRUE}, { GLX_NORMAL, GLX_ZSIZE, GLX_NOCONFIG }, { 0,0,0 } }; #endif /*****************************************************************************/ /*****************************************************************************/ n = 0; XtSetArg(args[n], XmNdeleteResponse, XmDO_NOTHING);n++; n = setwinargs(args, n, dv->win, ~0, size, &title, NULL); #if MGGL || MGX11 if (MGGL || gv_no_opengl) { /* ... but not for MGOPENGL */ XtSetArg(args[n], XmNvisual, gvvisual); n++; XtSetArg(args[n], XmNdepth, gvbitdepth); n++; XtSetArg(args[n], XmNcolormap, gvcolormap); n++; } #endif /*****************************************************************************/ shell = XtAppCreateShell(title, "gv", topLevelShellWidgetClass, dpy, args, n); XtVaSetValues(shell, XmNiconPixmap, geomicon, NULL); XtRealizeWidget(shell); camform = shell; /* Record the X window id of the top-level shell of each camera * in an array indexed by geomview camera number, * so cam_winchange() above can map cam id's into widgets. * We store X window numbers and use XtWindowToWidget() rather than * storing widget pointers to avoid possibly dereferencing junk. */ if (VVCOUNT(camshells) == 0) { VVINIT(camshells, struct camwins, 4); vvzero(&camshells); } cw = VVINDEX(camshells, struct camwins, INDEXOF(id)); cw->shellwin = XtWindow(shell); /****************************************************************************/ n = 0; #if MGX11 || MGOPENGL if (MGOPENGL || gv_no_opengl) { /* ... but not for MGGL */ XtSetArg(args[n], XmNtitle, title); n++; XtSetArg(args[n], XmNrubberPositioning, False); n++; } #endif /****************************************************************************/ XtSetArg(args[n], XmNwidth, size[0]); n++; XtSetArg(args[n], XmNheight, size[1]); n++; if (gv_no_opengl) { #if MGX11 camdraw[SGL] = NULL; camdraw[DBL] = XtCreateManagedWidget("camdraw", xmDrawingAreaWidgetClass, camform, args, n); XtManageChild(camdraw[DBL]); mgctxset(MG_X11DISPLAY, dpy, MG_X11COLORMAP, gvcolormap, MG_BITDEPTH, gvbitdepth, MG_X11VISUAL, gvvisual, MG_X11WINID, XtWindow(camdraw[DBL]), MG_X11PARENT, XtWindow(shell), MG_X11SIZELOCK, 1, MG_END); #endif } else { /* gv_no_opengl */ #if MGOPENGL /* In case we're not the first GLX context in town, find another * so we can share our display lists promiscuously. */ mgctxset(MG_GLXDISPLAY, dpy, MG_END); mgctxget(MG_GLXSHARECTX, &sharectx); camdraw[SGL] = NULL; camdraw[DBL] = XtCreateManagedWidget("ogldraw", xmDrawingAreaWidgetClass, camform, args, 0); n = 0; cmwneeded = 0; for(i = SGL; i <= DBL; i++) { oglp = &ogl[i]; oglp->cx = NULL; oglp->cm = None; cw->vi[i] = glXChooseVisual(dpy, XScreenNumberOfScreen(XtScreen(camform)), oglp->attribs); if (cw->vi[i] == NULL) { continue; } if (oglcmap[i] == 0) { oglcmap[i] = getcmapfor(cw->vi[i]); } oglp->cx = glXCreateContext(dpy, cw->vi[i], sharectx, GL_TRUE); if (oglp->cx) { sharectx = oglp->cx; } xswa.colormap = oglcmap[i]; xswa.event_mask = KeyPressMask|ButtonPressMask| ButtonReleaseMask|ButtonMotionMask| EnterWindowMask|StructureNotifyMask|ExposureMask; xswa.border_pixel = xswa.background_pixel = xswa.backing_pixel = xswa.background_pixmap = None; cw->wins[i] = XCreateWindow(dpy, XtWindow(camdraw[DBL]), 0, 0, size[0], size[1], 0/*border*/, cw->vi[i]->depth, InputOutput, cw->vi[i]->visual, CWEventMask|CWColormap|CWBorderPixel |CWBackPixel|CWBackPixmap, &xswa); XMapWindow(dpy, cw->wins[i]); XtRegister_window(dpy, cw->wins[i], camdraw[DBL]); if (oglcmap[i] != DefaultColormapOfScreen(XtScreen(camform))) { cmw[cmwneeded++] = cw->wins[i]; } mgctxset(oglp->setGLXwin, cw->wins[i], oglp->setGLXctx, oglp->cx, MG_END ); n++; } if (n == 0) { OOGLError(0, "No OpenGL RGB visual available."); exit(1); } if (cmwneeded > 0) { Window *wp; int nw; if (XGetWMColormapWindows(dpy, XtWindow(shell), &wp, &nw)) { if (nw > COUNT(cmw) - 2) nw = COUNT(cmw) - 2; memcpy(&cmw[cmwneeded], wp, nw * sizeof(Window)); XFree(wp); cmwneeded += nw; } XSetWMColormapWindows(dpy, XtWindow(shell), cmw, cmwneeded); } #endif /* MGOPENGL */ #if MGGL XtSetArg (args[n], GlxNglxConfig, db_rgb_desc); n++; camdraw[DBL] = XtCreateManagedWidget("camdrawdbl", glxMDrawWidgetClass, shell, args, n); XtSetArg(args[n-1], GlxNglxConfig, sg_rgb_desc); camdraw[SGL] = XtCreateManagedWidget("camdrawsgl", glxMDrawWidgetClass, shell, args, n); mgctxset(MG_GLXDISPLAY, dpy, MG_GLXSINGLEWIN, XtWindow(camdraw[SGL]), MG_GLXDOUBLEWIN, XtWindow(camdraw[DBL]), MG_END); #endif /* MGGL */ } /* !gv_no_opengl */ /*****************************************************************************/ AProtocol = XmInternAtom(dpy, "WM_DELETE_WINDOW", False); XmAddWMProtocolCallback(shell, AProtocol, (XtCallbackProc) ui_delete_camera, (XtPointer)(long)id); /* Even if this event handler isn't called for normal button- and keypress- * events, the "StructureNotifyMask" below means we hear about unmapping * events in case a window is iconified or etc. */ D1PRINT(("XtAddEventHandler(... panel_input [0] ...)\n")); XtAddEventHandler(shell, KeyPressMask|ButtonPressMask|ButtonReleaseMask|ButtonMotionMask |StructureNotifyMask|ExposureMask, False, (XtEventHandler) panel_input, (XtPointer)(long) id); for(i = SGL; i <= DBL; i++) { if (camdraw[i]) { XtAddCallback(camdraw[i], XmNexposeCallback, (XtCallbackProc) cam_expose, (XtPointer)(long) id); XtAddCallback(camdraw[i], XmNresizeCallback, (XtCallbackProc) cam_resize, (XtPointer)(long) id); D1PRINT(("XtAddEventHandler(... cam_expose ...)\n")); XtAddEventHandler(camdraw[i], ExposureMask|StructureNotifyMask, False, (XtEventHandler) cam_expose, (XtPointer)(long) id); D1PRINT(("XtAddEventHandler(... panel_input [1] ...)\n")); XtAddEventHandler(camdraw[i], KeyPressMask|ButtonPressMask|ButtonReleaseMask, False, (XtEventHandler) panel_input, (XtPointer)(long) id); D1PRINT(("XtAddEventHandler(... cam_mouse ...)\n")); XtAddEventHandler(camdraw[i], ButtonMotionMask, False, (XtEventHandler) cam_mouse, (XtPointer)(long) id); D1PRINT(("XtAddEventHandler(... cam_mousecross ...)\n")); XtAddEventHandler(camdraw[i], EnterWindowMask, False, (XtEventHandler) cam_mousecross, (XtPointer)(long) id); D1PRINT(("XtAddEventHandler(... cam_mousecross ...)\n")); XtAddEventHandler(camdraw[i], FocusChangeMask, False, (XtEventHandler) cam_focus, (XtPointer)(long) id); } } mgctxset(MG_WINCHANGE, cam_winchange, MG_WINCHANGEDATA, (void *)(long)id, MG_END); return shell; } /*****************************************************************************/ #if MGOPENGL static Colormap getcmapfor(XVisualInfo *vi) { int i, nCmaps; XStandardColormap *standardCmaps; Colormap cm; Atom Ahpmap = XmInternAtom(dpy, "_HP_RGB_SMOOTH_TRUE_MAP", False); Window root = RootWindow(dpy, vi->screen); #if HAVE_XMU XmuLookupStandardColormap(dpy, vi->screen, vi->visualid, vi->depth, XA_RGB_DEFAULT_MAP, /* replace */ False, /* retain */ True); #endif /* Whether we called XmuLookupStandardColormap or not, and whether it succeeded * or not, let's see whether a suitable cmap is installed on the X server. */ if ((Ahpmap != None && XGetRGBColormaps(dpy, root, &standardCmaps, &nCmaps, Ahpmap)) || XGetRGBColormaps(dpy, root, &standardCmaps, &nCmaps, XA_RGB_DEFAULT_MAP) ) { for(i = 0; i < nCmaps; i++) if (standardCmaps[i].visualid == vi->visualid) { cm = standardCmaps[i].colormap; XFree(standardCmaps); return cm; } } if (vi->visual == DefaultVisual(dpy, vi->screen)) return DefaultColormap(dpy, vi->screen); /* Oh well. Let's just create an uninitialized colormap and hope * for the best. This might be adequate if we've got a TrueColor or * other static visual. */ return XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone); } #endif /*MGOPENGL*/ /*****************************************************************************/ void ui_raise_window( int camid ) { struct camwins *cw; Widget w = camshellof( camid, &cw ); if (w != NULL && XtWindow(w) != None) { XRaiseWindow( dpy, XtWindow( w ) ); } } /*****************************************************************************/ static void ui_delete_camera(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { extern int real_id(int); gv_delete((int)(long)data); uistate.targetcam = INDEXOF(FOCUSID); ui_target_cameraspanel(real_id(FOCUSID)); if (w) { struct camwins *cw = NULL; if (camshellof((int)(long)data, &cw) != NULL && cw!=NULL) { #if MGOPENGL if (!gv_no_opengl) { if (cw->wins[SGL]) XtUnregister_window(dpy, cw->wins[SGL], w); if (cw->wins[DBL]) XtUnregister_window(dpy, cw->wins[DBL], w); } #endif cw->wins[SGL] = cw->wins[DBL] = 0; } XtDestroyWidget(w); } } /*****************************************************************************/ #if MGGL || MGOPENGL static int snapsetup(DView *dv) { int opts; int unset = 0; struct camwins *cw; struct timeval tdelay; #if MGOPENGL GLint bitsdeep; #endif if (camshellof(dv->id, &cw) == NULL) { OOGLError(1, "snapshot: no window for camera %s?", dv->name[1]); return -1; } mgctxselect(dv->mgctx); mgctxget(MG_SETOPTIONS, &opts); #if MGOPENGL glGetIntegerv(GL_RED_BITS, &bitsdeep); if ((opts & MGO_DOUBLEBUFFER) && bitsdeep < 8) { mgctxset(MG_UNSETOPTIONS, MGO_DOUBLEBUFFER, MG_END); unset = MGO_DOUBLEBUFFER; } #endif #if MGGL if ((opts & MGO_DOUBLEBUFFER) && (getgdesc(GD_BITS_NORM_DBL_RED) < 8)) { mgctxset(MG_UNSETOPTIONS, MGO_DOUBLEBUFFER, MG_END); unset = MGO_DOUBLEBUFFER; } #endif/*MGGL*/ XRaiseWindow(dpy, cw->shellwin); /* Ensure window fully visible */ XSync(dpy, False); /* Raise it right now */ gv_redraw(dv->id); /* schedule redraw */ /* Short pause while window manager raises window. * Unfortunately I know of no way to tell when this happens; * we might not even get an Expose event if we're already * unobscured. Sigh. -slevy */ /* Note: we can't call 'select' below with '&delay' as the last arg, because * the final arg has to be a pointer to a struct timeval, and on 64-bit systems * a struct timeval isn't the same as an array of 2 ints. Changed to use &tdelay * by mbp on Tue Oct 3 10:19:56 2006. */ #define DELAY_US 200000 /* 0.2 second */ tdelay.tv_sec = 0; tdelay.tv_usec = DELAY_US; select(0,NULL,NULL,NULL,&tdelay); gv_draw(dv->id); /* draw window now */ #if MGGL finish(); #endif #if MGOPENGL glFinish(); #endif return unset; } int ui_ppmscreensnapshot(char *fname, int id, DView *dv, WnWindow *wn, WnPosition *wp) { FILE *f; char *data; int unset, xsize, ysize, row, i; int failed = 1; if (gv_no_opengl) { OOGLError(0, "OpenGL disabled via command-line switch. " "Screen snapshots are only implemented for OpenGL.\n"); return failed; } unset = snapsetup(dv); if (unset < 0) return -1; if (fname[0] == '|') f = popen(fname+1, "w"); else f = fopen(fname, "w"); if (f == NULL) { OOGLError(0, "snapshot ... ppmscreen: can't create %s: %s", fname, sperror()); goto done; } xsize = wp->xmax - wp->xmin + 1; ysize = wp->ymax - wp->ymin + 1; fprintf(f, "P6\n# Geomview Snapshot of %s\n%d %d\n255\n", dv->name[1], xsize, ysize); #if MGOPENGL row = xsize*3; data = OOGLNewNE(char, row*ysize, "snapshot data"); glPixelStorei(GL_PACK_ALIGNMENT, 1); glReadPixels(0, 0, xsize, ysize, GL_RGB, GL_UNSIGNED_BYTE, data); for(i = ysize; --i >= 0; ) { if (fwrite(data+i*row, row, 1, f) <= 0) break; } #endif /*MGOPENGL*/ #if MGGL row = xsize*4; data = OOGLNewNE(char, row*ysize, "snapshot data"); readdisplay(wp->xmin, wp->ymin, wp->xmax, wp->ymax, (unsigned long *)data, 0); for(i = ysize; --i >= 0; ) { char *p = data + i*row; j = xsize; do { putc(p[3], f); putc(p[2], f); putc(p[1], f); p += 4; } while(--j > 0); } #endif /*MGGL*/ OOGLFree(data); failed = (fname[0] == '|') ? pclose(f) : fclose(f); if (failed) { OOGLError(0, "snapshot: Error writing to %s: %s", fname, sperror()); } done: if (unset) mgctxset(MG_SETOPTIONS, unset, MG_END); return failed; } #if MGOPENGL && MESAGL && HAVE_LIBOSMESA #include int ui_ppmmesasnapshot(char *fname, int id, DView *dv, WnWindow *wn, WnPosition *wp) { static OSMesaContext osmctx, sharectx; static mgcontext *osmmgctx; FILE *f; int opts; char *data; int xsize, ysize, row, i, j; mgcontext *oldmgctx = dv->mgctx; Camera *cam = NULL; Appearance *ap; WnWindow *win; WnPosition vp; int mgspace; float pixaspect, frameaspect; mgshadefunc shader = NULL; int failed = 1; if (gv_no_opengl) { OOGLError(0, "OpenGL disabled via command-line switch. " "Screen snapshots are only implemented for OpenGL.\n"); return failed; } mgctxget(MG_GLXSHARECTX, &sharectx); xsize = wp->xmax - wp->xmin + 1; ysize = wp->ymax - wp->ymin + 1; mgctxget(MG_CAMERA, &cam); mgctxget(MG_SPACE, &mgspace); mgctxget(MG_SHADER, &shader); /* Copy so that changed flags are set */ ap = ApCopy(mggetappearance(), NULL); mgctxget(MG_WINDOW, &win); win = WnCopy(win); vp.xmin = vp.ymin = 0; vp.xmax = xsize; vp.ymax = ysize; WnSet(win, WN_CURPOS, wp, WN_VIEWPORT, &vp, WN_END); if (osmctx == 0) osmctx = OSMesaCreateContext(OSMESA_RGBA, sharectx); row = xsize * 4; data = OOGLNewNE(char, row*ysize, "snapshot data"); if (!OSMesaMakeCurrent( osmctx, data, GL_UNSIGNED_BYTE, xsize, ysize )) { OOGLError(0, "snapshot ... ppmmesa: can't create off-screen Mesa context"); OOGLFree(data); return failed; } if (fname[0] == '|') f = popen(fname+1, "w"); else f = fopen(fname, "w"); if (f == NULL) { OOGLError(0, "snapshot ... ppmmesa: can't create %s: %s", fname, sperror()); return failed; } mgdevice_OPENGL(); if (osmmgctx == NULL) { osmmgctx = mgctxcreate( MG_GLXDOUBLECTX, osmctx, MG_GLXDOUBLEWIN, -1, MG_GLXSINGLECTX, osmctx, MG_GLXSINGLEWIN, -1, MG_END); } else { mgctxselect(osmmgctx); } dv->mgctx = osmmgctx; mgctxset( MG_CAMERA, cam, MG_APPEAR, ap, MG_WINDOW, win, MG_BACKGROUND, &dv->backcolor, MG_SPACE, mgspace, MG_SHADER, shader, MG_END); mgreshapeviewport(); /* Make camera aspect match window */ { /* Try to be as realistic as possible when dumping a snapshot. * Create a drawing context, install (hopefully) all the * attributes that draw_view() doesn't reset on its own, * plug the ctx into the camera, and force a redraw. * Then undo the subterfuge. */ int oldredraw = dv->redraw; int oldchanged = dv->changed; gv_redraw(dv->id); gv_draw(dv->id); dv->redraw = oldredraw, dv->changed = oldchanged; } fprintf(f, "P6\n# Geomview Snapshot of %s\n%d %d\n255\n", dv->name[1], xsize, ysize); for(i = ysize; --i >= 0; ) { char *rgba = data + i*row; for(j = 0; j < xsize; j++, rgba += 4) { putc(rgba[0], f); putc(rgba[1], f); putc(rgba[2], f); } } OOGLFree(data); ApDelete(ap); dv->mgctx = oldmgctx; failed = (fname[0] == '|') ? pclose(f) : fclose(f); if (failed) { OOGLError(0, "snapshot: Error writing to %s: %s", fname, sperror()); } return failed; } #endif /*MESA -- ppmmesasnapshot*/ #if MGOPENGL && HAVE_GLXCREATEGLXPIXMAP int ui_ppmglxsnapshot(char *fname, int id, DView *dv, WnWindow *wn, WnPosition *wp) { static mgcontext *osglxmgctx; struct camwins *cw; GLXContext osglxctx; Pixmap pixmap; GLXPixmap glxpixmap; FILE *f; char *data; int xsize, ysize, row, i; mgcontext *oldmgctx = dv->mgctx; Camera *cam = NULL; Appearance *ap; WnWindow *win; WnPosition vp; int mgspace; mgshadefunc shader = NULL; int failed = 1; double osfactor = 1.0; char *osscale; if (gv_no_opengl) { OOGLError(0, "OpenGL disabled via command-line switch. " "Screen snapshots are only implemented for OpenGL.\n"); return failed; } if (camshellof(dv->id, &cw) == NULL) { OOGLError(1, "snapshot: no window for camera %s?", dv->name[1]); return -1; } if ((osscale = getenv("GEOMVIEW_OFFSCREEN_FACTOR")) != NULL) { osfactor = strtod(osscale, NULL); if (osfactor == 0.0) { osfactor = 1.0; } } xsize = wp->xmax - wp->xmin + 1; ysize = wp->ymax - wp->ymin + 1; xsize = (int)(osfactor * (double)xsize); ysize = (int)(osfactor * (double)ysize); mgctxget(MG_CAMERA, &cam); mgctxget(MG_SPACE, &mgspace); mgctxget(MG_SHADER, &shader); mgctxget(MG_GLXSINGLECTX, &osglxctx); mgctxget(MG_WINDOW, &win); ap = ApCopy(mggetappearance(), NULL); win = WnCopy(win); vp.xmin = vp.ymin = 0; vp.xmax = xsize - 1; vp.ymax = ysize - 1; WnSet(win, WN_CURPOS, osfactor != 1.0 ? &vp : wp, WN_VIEWPORT, &vp, WN_END); /* Create an X11 pixmap and a GLX pixmap to render to */ pixmap = XCreatePixmap(dpy, cw->shellwin, xsize, ysize, cw->vi[SGL]->depth); if (pixmap == 0) { return failed; } glxpixmap = glXCreateGLXPixmap(dpy, cw->vi[SGL], pixmap); if (glxpixmap == 0) { XFreePixmap(dpy, pixmap); return failed; } if (!glXMakeCurrent(dpy, glxpixmap, osglxctx)) { XFreePixmap(dpy, pixmap); glXDestroyGLXPixmap(dpy, glxpixmap); return failed; } if (fname[0] == '|') { f = popen(fname+1, "w"); } else { f = fopen(fname, "w"); } if (f == NULL) { OOGLError(0, "snapshot ... ppmmesa: can't create %s: %s", fname, sperror()); XFreePixmap(dpy, pixmap); glXDestroyGLXPixmap(dpy, glxpixmap); return failed; } mgdevice_OPENGL(); if (osglxmgctx == NULL) { osglxmgctx = mgctxcreate(MG_GLXDOUBLEWIN, -1, MG_GLXSINGLEWIN, -1, MG_GLXSINGLECTX, osglxctx, MG_UNSETOPTIONS, MGO_DOUBLEBUFFER, MG_END); } else { mgctxselect(osglxmgctx); } dv->mgctx = osglxmgctx; mgctxset(MG_GLXSINGLECTX, osglxctx, MG_CAMERA, cam, MG_APPEAR, ap, MG_WINDOW, win, MG_BACKGROUND, &dv->backcolor, MG_SPACE, mgspace, MG_SHADER, shader, MG_END); mgreshapeviewport(); /* Make camera aspect match window */ { /* Try to be as realistic as possible when dumping a snapshot. * Create a drawing context, install (hopefully) all the * attributes that draw_view() doesn't reset on its own, * plug the ctx into the camera, and force a redraw. * Then undo the subterfuge. */ int oldredraw = dv->redraw; int oldchanged = dv->changed; gv_redraw(dv->id); gv_draw(dv->id); dv->redraw = oldredraw, dv->changed = oldchanged; } fprintf(f, "P6\n# Geomview Snapshot of %s\n%d %d\n255\n", dv->name[1], xsize, ysize); row = xsize*3; data = OOGLNewNE(char, row*ysize, "snapshot data"); glPixelStorei(GL_PACK_ALIGNMENT, 1); glReadPixels(0, 0, xsize, ysize, GL_RGB, GL_UNSIGNED_BYTE, data); for(i = ysize; --i >= 0; ) { if (fwrite(data+i*row, row, 1, f) <= 0) { break; } } OOGLFree(data); XFreePixmap(dpy, pixmap); glXDestroyGLXPixmap(dpy, glxpixmap); ApDelete(ap); dv->mgctx = oldmgctx; failed = (fname[0] == '|') ? pclose(f) : fclose(f); if (failed) { OOGLError(0, "snapshot: Error writing to %s: %s", fname, sperror()); } return failed; } #endif /* GLX offscreen snapshot */ #include int ui_sgisnapshot(char *fname, int id, DView *dv, WnWindow *wn, WnPosition *wp) { int pid, wpid, unset; char x0[12], x1[12], y0[12], y1[12]; void (*oldchld)(); int failed = 1; int status; unset = snapsetup(dv); if (unset < 0) return -1; sprintf(x0, "%d", wp->xmin); sprintf(x1, "%d", wp->xmax); sprintf(y0, "%d", wp->ymin); sprintf(y1, "%d", wp->ymax); oldchld = signal(SIGCHLD, SIG_DFL); switch(pid = fork()) { case -1: OOGLError(0, "snapshot: can't fork to create \"scrsave\" subprocess: %s", sperror()); break; case 0: execlp("scrsave", "scrsave", fname, x0, x1, y0, y1, NULL); OOGLError(0, "snapshot: can't exec 'scrsave': %s", sperror()); exit(1); default: while((wpid = wait(&status)) != pid && wpid != -1) ; failed = status; } signal(SIGCHLD, oldchld); if (unset) mgctxset(MG_SETOPTIONS, unset, MG_END); return failed; } snap_entry snapshot_table[] = { { ui_ppmscreensnapshot, "ppmscreen" }, { ui_sgisnapshot, "sgiscreen" }, #if MGOPENGL && MESAGL && HAVE_LIBOSMESA { ui_ppmmesasnapshot, "ppmosmesa" }, #endif #if MGOPENGL && HAVE_GLXCREATEGLXPIXMAP { ui_ppmglxsnapshot, "ppmosglx" }, #endif { NULL, NULL } }; void ui_init_snaphelp() { LHelpDef("snapshot", "(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])\n" "Save a snapshot of CAM-ID in the FILENAME (a string). The FORMAT \ argument is optional; it may be \"ppmscreen\" (the default), \"ps\", \ \"ppm\", \"sgi\" (on SGI machines), \"ppmosmesa\" (if built with \ libOSMesa) or \"ppmosglx\". A \"ppmscreen\" snapshot is created by \ reading the image directly from the given window; the window is popped \ above other windows and redrawn first, then its contents are written \ as a PPM format image. A \"ppmosmesa\" snapshot is drawn by Mesa's \ software renderer into a memory buffer in RAM. A \"ppmosglx\" snapshot \ is rendered into a GLX Pixmap buffer, which is also off-screen but \ may or may not reside in video RAM. Rendering may or may not be \ accelerated. The problem with on-screen snapshots is that the window \ must be mapped and not obscured by other windows. So on-screen \ snapshots will not work in the background, or when a screen safer is \ active. With \"ps\", dumps a Postscript picture representing the view \ from that window; hidden-surface removal might be incorrect. With \ \"ppm\", dumps a PPM-format image produced by geomview's internal \ software renderer; this may be of arbitrary size. If the FILENAME \ argument begins with \"|\", it's interpreted as a /bin/sh command to \ which the PPM or PS data should be piped. Optional XSIZE and YSIZE \ values are relevant only for \"ppm\" formats, and render to a window \ of that size (or scaled to that size, with aspect fixed, if only XSIZE \ is given)"); } #else /* only MGX11 */ snap_entry snapshot_table[] = { {NULL, NULL} }; void ui_init_snaphelp() { LHelpDef("snapshot", "(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])\n" "Save a snapshot of CAM-ID in the FILENAME (a string). The\n" "FORMAT argument is optional; it may be \"ppm\" (the default) or \"ps\".\n" "With \"ps\", dumps a Postscript picture representing the view from\n" "that window; hidden-surface removal might be incorrect.\n" "With \"ppm\", dumps a PPM-format image produced by geomview's internal\n" "software renderer; this may be of arbitrary size.\n" "If the FILENAME argument begins with \"|\", it's interpreted as a /bin/sh\n" "command to which the PPM or PS data should be piped.\n" "Optional XSIZE and YSIZE values are relevant only for \"ppm\" format,\n" "and render to a window of that size (or scaled to that size,\n" "with aspect fixed, if only XSIZE is given)." ); } #endif /* MGX11 */ /*****************************************************************************/ /*****************************************************************************/ /* These routines live here just to keep all MG-type dependencies in one file. */ Pixel ui_RGB(Colormap cm, int permanent, float r, float g, float b) { static XColor tcol; static int wasalloced = 0; XColor pcol; XColor *col = permanent ? &pcol : &tcol; Visual *vis = ((cm == gvcolormap) ? /* Guess which visual it's on! */ gvvisual : DefaultVisual(dpy, DefaultScreen(dpy))); if (!permanent) { if (wasalloced) { XFreeColors(dpy, cm, &tcol.pixel, 1, 0); wasalloced = 0; } #if MGX11 if (vis->class == PseudoColor) return mgx11_setRGB((int)(255.0 * r), (int)(255.0 * g), (int)(255.0 * b)); #endif } col->red = (unsigned short)(r*65535.0); col->green = (unsigned short)(g*65535.0); col->blue = (unsigned short)(b*65535.0); if (XAllocColor(dpy, cm, col)) { if (!permanent && (vis->class & 1) != 0) wasalloced = 1; /* XAllocColor only really allocates in dynamic visuals */ return col->pixel; } /* give up. */ return r+g+b>.5 ? WhitePixel(dpy, DefaultScreen(dpy)) : BlackPixel(dpy, DefaultScreen(dpy)); } /*****************************************************************************/ /* This one gets called both as an event handler and as a plain callback; * don't rely on the ev or cont fields. */ void cam_expose(Widget w, XtPointer data, XEvent *ev, Boolean *cont) { int id = (int)(long) data; DView *dv = (DView *)drawer_get_object(id); if (!ISCAM(id) || dv == NULL || dv->mgctx == NULL) return; if (gv_no_opengl) { #if MGX11 mgctxselect(dv->mgctx); mgctxset(MG_X11EXPOSE, MG_END); #endif } gv_redraw(id); } void cam_resize(Widget w, XtPointer id, XmDrawingAreaCallbackStruct *cbs) { #if MGOPENGL /* Do the work the GLwDrawA widget would have done: resize our subwindows */ struct camwins *cw; if (!gv_no_opengl) { if (camshellof((int)(long)id, &cw) != NULL) fitwins(w, cw); } #endif } /*****************************************************************************/ void ui_find_visual() { int result; if (!gv_no_opengl) { #if MGGL || MGOPENGL gvvisual = DefaultVisual(dpy, DefaultScreen(dpy)); gvcolormap = DefaultColormap(dpy, DefaultScreen(dpy)); gvbitdepth = DefaultDepth(dpy, DefaultScreen(dpy)); #endif } else { #if MGX11 result = mgx11_getvisual(dpy, &gvvisual, &gvcolormap, &gvbitdepth); if (result == MG_X11VISFAIL) { OOGLError(0, "X-Geomview currently supports only 24, 16, 8, and 1 bit\n" "\tdeep displays. No supported display depth was found."); exit(1); } else { if (result == MG_X11VISPRIVATE) { gvpriv = 1; OOGLError(0, "Not enough colors available. Using private colormap."); } else { return; } } #endif } } /*****************************************************************************/ LDEFINE(bgimagefile, LSTRING, "(background-image CAMID [filename])\n\ Paint that image on the background of that camera window.\n\ Currently works only with GL and OpenGL graphics.\n\ Use \"\" for filename to remove background. With no arguments,\n\ returns name of that window's current background image, or \"\".") { char *fname = NULL; int camid; #if MGOPENGL || MGGL DView *dv; #endif LDECLARE(("background-image", LBEGIN, LID, &camid, LOPTIONAL, LSTRING, &fname, LEND)); #if MGOPENGL || MGGL dv = (DView *)drawer_get_object(camid); if (dv == NULL || !ISCAM(dv->id) || dv->mgctx == NULL) return Lnil; mgctxselect(dv->mgctx); if (fname != NULL) { char *tfname = (fname && fname[0] != '\0') ? fname : NULL; if (tfname) { tfname = findfile(NULL, tfname); if (tfname == NULL) { OOGLError(0, "background-image: Can't use image file %s: %s", fname, sperror()); } } mgctxset(MG_BGIMAGEFILE, tfname, MG_END); gv_redraw(camid); return fname ? Lt : Lnil; } else { mgctxget(MG_BGIMAGEFILE, &fname); return LNew(LSTRING, &fname); } #else OOGLError(0, "Sorry, background-image only supported with GL and OpenGL graphics"); return Lnil; #endif } /*****************************************************************************/ void ui_curson(int on) { Widget w; struct camwins *cw; Cursor c; if ((w = camshellof(real_id(FOCUSID), &cw)) == NULL || XtWindow(w) == None) return; if (on < 0) on = !cw->curs; if (on > 1) { if (cursors[1].c) XFreeCursor(dpy, cursors[1].c); cursors[1].id = on; cursors[1].c = XCreateFontCursor(dpy, cursors[1].id); on = 1; } if (on == 0 && cursors[0].c == 0) { /* Need to create blank cursor */ Pixmap pix = XCreatePixmap(dpy, XtWindow(w), 1, 1, 1); XColor col; col.pixel = WhitePixelOfScreen(XtScreen(w)); cursors[0].c = XCreatePixmapCursor(dpy, pix, pix, &col, &col, 0, 0); } cw->curs = on; c = cursors[on].c; XDefineCursor(dpy, XtWindow(w), c); if (cw->wins[SGL]) XDefineCursor(dpy, cw->wins[SGL], c); if (cw->wins[DBL]) XDefineCursor(dpy, cw->wins[DBL], c); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/x11/gvcolor.c0000644000175000017500000002061112310110177015673 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" #include "mg.h" #include "../common/drawer.h" #include "../common/lights.h" #include "../common/ui.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Color.mib" extern Display *dpy; extern GC mib_gc; extern Pixmap geomicon; /* public methods */ /*****************************************************************************/ void ui_config_colorpanel(char *, Color *, int, int, int); /* private methods and variables */ /*****************************************************************************/ extern Pixel ui_RGB(Colormap cmap, int permanent, float r, float g, float b); static void reset_color(Widget, XtPointer, XmAnyCallbackStruct *); static void rgb_sliders(Widget, XtPointer, XmScaleCallbackStruct *); static void set_rgb_sliders(Widget, XtPointer, XmAnyCallbackStruct *); static void tog_cmodel(Widget, XtPointer, XmAnyCallbackStruct *); static void show_settings(int changed); static void set_rgbtest(); static Widget shell, /*temp,*/ RGBText, HSVText, CModelButton, RGBTest; static struct cslider { char *slidername; char *labelname; Widget slider; Widget label; } sliders[] = { { "RScale", "RLabel" }, { "GScale", "GLabel" }, { "BScale", "BLabel" } }; static Window testwin; static Color oldc; static Color rgb, hsv; static enum Colormodel { CM_RGB, CM_HSV } colormodel = CM_RGB; static int myval, colortarget; /*****************************************************************************/ void ui_load_colorpanel() { int n; Widget colorform, DoneButton, CancelButton; mib_Widget *colorload; static char Colors[] = "Color"; /*****************************************************************************/ shell = ui_make_panel_and_form(Colors, Root, False, True, &colorform); /*colorload = mib_load_interface(colorform, "interface/Color.mib", MI_FROMFILE);*/ colorload = mib_load_interface(colorform, Root, MI_FROMSTRING); XtManageChild(colorform); /*****************************************************************************/ DoneButton = mib_find_name(colorload, "DoneButton")->me; CancelButton = mib_find_name(colorload, "CancelButton")->me; XtAddCallback(DoneButton, XmNactivateCallback, (XtCallbackProc) ui_hide, Colors); XtAddCallback(CancelButton, XmNactivateCallback, (XtCallbackProc) reset_color, NULL); for(n = 0; n < COUNT(sliders); n++) { struct cslider *cs = &sliders[n]; cs->slider = mib_find_name(colorload, cs->slidername)->me; cs->label = mib_find_name(colorload, cs->labelname)->me; XtAddCallback(cs->slider, XmNdragCallback, (XtCallbackProc) rgb_sliders, (XtPointer)(long)n); XtVaSetValues(cs->slider, XmNmaximum, 255, NULL); } RGBText = mib_find_name(colorload, "RGBText")->me; XtAddCallback(RGBText, XmNactivateCallback, (XtCallbackProc) set_rgb_sliders, (XtPointer) CM_RGB); HSVText = mib_find_name(colorload, "HSVText")->me; XtAddCallback(HSVText, XmNactivateCallback, (XtCallbackProc) set_rgb_sliders, (XtPointer) CM_HSV); CModelButton = mib_find_name(colorload, "ColorModel")->me; XtAddCallback(CModelButton, XmNactivateCallback, (XtCallbackProc)tog_cmodel, (XtPointer)NULL); /*****************************************************************************/ RGBTest = mib_find_name(colorload, "ColorTest")->me; tog_cmodel(NULL, NULL, NULL); /* Toggle cmodel button for consistent layout */ rgb.r = 0.0; rgb.g = 0.0; rgb.b = 0.0; oldc.r = 0.0; oldc.g = 0.0; oldc.b = 0.0; show_settings(0); } /*****************************************************************************/ void ui_show_colorpanel() { if(!XtIsRealized(shell)) { XSetWindowAttributes swa; XtRealizeWidget(shell); swa.colormap = gvcolormap; swa.backing_store = NotUseful; swa.background_pixel = swa.border_pixel = ui_RGB(gvcolormap, 0, 1., 1., 1.); testwin = XCreateWindow(dpy, XtWindow(RGBTest), 1, 1, 63-2, 95-2, 0, gvbitdepth, InputOutput, gvvisual, CWColormap|CWBackPixel|CWBorderPixel|CWBackingStore, &swa); XMapRaised(dpy, testwin); } XRaiseWindow(dpy, XtWindow(shell)); set_rgbtest(); /* Raise color test rectangle and set its color */ } /*****************************************************************************/ static void reset_color(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { int changed = memcmp(&rgb, &oldc, sizeof(Color)); rgb = oldc; rgb2hsv(&rgb, &hsv); if(changed) show_settings(1); ui_hide(w, "Color", NULL); } /*****************************************************************************/ static void tog_cmodel(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { static char *labels[] = { "RGB", "HSV" }; /* Indexed by CM_ colormodel */ char *abc = NULL, label[2]; XmString lbl; int i; colormodel = (colormodel == CM_RGB) ? CM_HSV : CM_RGB; abc = labels[colormodel]; lbl = XmStringCreateSimple(abc); XtVaSetValues(CModelButton, XmNlabelString, lbl, NULL); XmStringFree(lbl); for(i = 0; i < 3; i++) { label[0] = abc[i]; label[1] = '\0'; lbl = XmStringCreateSimple(label); XtVaSetValues(sliders[i].label, XmNlabelString, lbl, NULL); XmStringFree(lbl); } show_settings(0); } static void set_rgbtest() { if (XtIsRealized(shell)) { XSetWindowBackground(dpy, testwin, ui_RGB(gvcolormap, 0, rgb.r, rgb.g, rgb.b)); XMapRaised(dpy, testwin); XClearWindow(dpy, testwin); } } /*****************************************************************************/ static void show_settings(int changed) { char str[100]; float *cmc = (colormodel == CM_RGB) ? &rgb.r : &hsv.r; int i; sprintf(str, "%.3f %.3f %.3f", rgb.r, rgb.g, rgb.b); XmTextFieldSetString(RGBText, str); sprintf(str, "%.3f %.3f %.3f", hsv.r, hsv.g, hsv.b); XmTextFieldSetString(HSVText, str); set_rgbtest(); for(i = 0; i < 3; i++) { int v = 255 * cmc[i]; XmScaleSetValue(sliders[i].slider, v<0 ? 0 : v>255 ? 255 : v); } if(changed) drawer_color(colortarget, (DrawerKeyword)myval, &rgb); } /*****************************************************************************/ static void set_rgb_sliders(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { char *str; Color c; int ok = 0; str = XmTextFieldGetString(w); if (3 == sscanf(str,"%f %f %f", &c.r, &c.g, &c.b)) { ok = 1; switch((int)(long)data) { case CM_RGB: rgb = c; rgb2hsv(&rgb, &hsv); break; case CM_HSV: hsv = c; hsv2rgb(&hsv, &rgb); break; } } show_settings(ok); XtFree(str); } /*****************************************************************************/ static void rgb_sliders(Widget w, XtPointer data, XmScaleCallbackStruct *cbs) { float *cmc = (colormodel == CM_RGB) ? &rgb.r : &hsv.r; /* Set {rgb,hsv}.{r,g,b} according to current color model and callback-data */ cmc[(int)(long)data] = ((float)cbs->value)/255.0; if(colormodel == CM_RGB) rgb2hsv(&rgb, &hsv); else hsv2rgb(&hsv, &rgb); show_settings(1); } /*****************************************************************************/ void ui_config_colorpanel(char *name, Color *old, int index, int val, int id) { rgb = *old; oldc = *old; rgb2hsv(&rgb, &hsv); myval = val; colortarget = id; XtVaSetValues(shell, XmNtitle, name, NULL); show_settings(0); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/x11/gvcommands.c0000644000175000017500000001411212310110177016355 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "../common/drawer.h" #include "../common/ui.h" #include "../common/comm.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Commands.mib" #include "bitmaps/up_arrow" #include "bitmaps/down_arrow" extern HandleOps CommandOps; extern Display *dpy; extern Pixmap geomicon; /* private methods and variables */ /*****************************************************************************/ static void command_input(Widget, XtPointer, XmAnyCallbackStruct *); static void command_scroll(Widget, XtPointer, XmListCallbackStruct *); static void command_up(Widget, XtPointer, XmAnyCallbackStruct *); static void command_down(Widget, XtPointer, XmAnyCallbackStruct *); static int num_items; /*static int pos_later = 0, posx = 0, posy = 0; static char geometry[40];*/ /*****************************************************************************/ void ui_load_commandspanel() { int depth; Widget commandsform, commscroll, commtext, HideButton, temp; Pixel fg, bg; Pixmap button_pix; mib_Widget *commandsload; static char Commands[] = "Commands"; /*****************************************************************************/ ui_make_panel_and_form(Commands, Root, False, True, &commandsform); /*commandsload = mib_load_interface(commandsform, "interface/Commands.mib", MI_FROMFILE);*/ commandsload = mib_load_interface(commandsform, Root, MI_FROMSTRING); XtManageChild(commandsform); /*****************************************************************************/ HideButton = mib_find_name(commandsload, "HideButton")->me; XtAddCallback(HideButton, XmNactivateCallback, (XtCallbackProc) ui_hide, (XtPointer)Commands); commtext = mib_find_name(commandsload, "CommandText")->me; commscroll = mib_find_name(commandsload, "CommandScroll")->me; XtAddCallback(commtext, XmNactivateCallback, (XtCallbackProc) command_input, (XtPointer) commscroll); XtAddCallback(commscroll, XmNbrowseSelectionCallback, (XtCallbackProc) command_scroll, (XtPointer) commtext); temp = mib_find_name(commandsload, "UpButton")->me; XtVaGetValues(temp, XmNforeground, &fg, XmNbackground, &bg, XmNdepth, &depth, NULL); button_pix = XCreatePixmapFromBitmapData(dpy, DefaultRootWindow(dpy), (char *)up_arrow_bits, up_arrow_width, up_arrow_height, fg, bg, depth); XtVaSetValues(temp, XmNlabelType, XmPIXMAP, XmNlabelPixmap, button_pix, NULL); XtAddCallback(temp, XmNactivateCallback, (XtCallbackProc) command_up, (XtPointer) commscroll); temp = mib_find_name(commandsload, "DownButton")->me; XtVaGetValues(temp, XmNforeground, &fg, XmNbackground, &bg, XmNdepth, &depth, NULL); button_pix = XCreatePixmapFromBitmapData(dpy, DefaultRootWindow(dpy), (char *)down_arrow_bits, down_arrow_width, down_arrow_height, fg, bg, depth); XtVaSetValues(temp, XmNlabelType, XmPIXMAP, XmNlabelPixmap, button_pix, NULL); XtAddCallback(temp, XmNactivateCallback, (XtCallbackProc) command_down, (XtPointer) commscroll); num_items = 0; } /*****************************************************************************/ static void command_input(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { Widget commscroll = (Widget)data; XmString addlist; char *str; str = XmTextFieldGetString(w); if (!strlen(str)) { XtFree(str); return; } comm_object(str, &CommandOps, NULL, NULL, COMM_NOW); addlist = XmStringCreate(str, XmSTRING_DEFAULT_CHARSET); XtFree(str); XmListAddItemUnselected(commscroll, addlist, 0); num_items++; } /*****************************************************************************/ static void command_scroll(Widget w, XtPointer data, XmListCallbackStruct *cbs) { Widget commtext = (Widget)data; char *temp; if (!XmStringGetLtoR(cbs->item, XmSTRING_DEFAULT_CHARSET, &temp)) return; if (!*temp) return; XmTextFieldSetString(commtext, temp); XtFree(temp); } /*****************************************************************************/ static void command_up(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { Widget commscroll = (Widget)data; int *poslist, poscount, pos; if (!XmListGetSelectedPos(commscroll, &poslist, &poscount)) { if (!num_items) return; XmListSelectPos(commscroll, 0, True); } if (!poscount) return; pos = poslist[0]-1; if (pos<0) pos = num_items-1; if (pos<0) pos = 0; XmListSelectPos(commscroll, pos, True); } /*****************************************************************************/ static void command_down(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { Widget commscroll = (Widget)data; int *poslist, poscount, pos; if (!XmListGetSelectedPos(commscroll, &poslist, &poscount)) { if (!num_items) return; XmListSelectPos(commscroll, 0, True); } if (!poscount) return; pos = poslist[0]+1; if (pos>num_items) pos = 1; XmListSelectPos(commscroll, pos, True); } /*****************************************************************************/ geomview-1.9.5/src/bin/geomview/x11/gvcredits.c0000644000175000017500000001132712310110177016216 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "../common/drawer.h" #include "../common/lang.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Credits.mib" extern Display *dpy; extern char builddate[], buildinfo1[], buildinfo2[]; extern char *buildinfographics; extern Pixmap geomicon; /* private methods and variables */ /*****************************************************************************/ static void add_text(Widget, char *[]); /*static char geometry[40];*/ static char *credits[] = { NULL, " ", "Geomview is an interactive program for viewing and manipulating", "geometric objects, originally written by staff members of the Geometry", "Center at the University of Minnesota, starting in 1991. It can be", "used as a standalone viewer for static objects or as a display engine", "for other programs which produce dynamically changing geometry.", " ", "Many people have contributed to Geomview, among them are:", " ", "Original Geomview Kernel + GL version:", "Stuart Levy, Tamara Munzner, Mark Phillips", " ", "X Window System Version:", "Daeron Meyer, Timothy Rowley", " ", "NeXTSTEP Version:", "Daniel Krech, Scott Wisdom", " ", "Important Modifications:", "Celeste Fowler, Charlie Gunn, Nathaniel Thurston", " ", "Bug-fixes, maintenance:", "Claus-Justus Heine", " ", "Further:", "Steve Anderson, Rex Dieter, Todd Kaplan, Mario Lopez,", "Mark Meuer, Steve Robbins, Lloyd Wood and others.", " ", "Copyright 1992-1998 The Geometry Center", "Copyright 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips", "Copyright 2005-2007 Claus-Justus Heine", "http://www.geomview.org/", " ", "Geomview is free software; you can redistribute it and/or modify it", "under the terms of the GNU Lesser General Public License as published", "by the Free Software Foundation; either version 2, or (at your option)", "You should have received a copy of the GNU Lesser General Public", "License along with Geomview; see the file COPYING. If not, write to", "the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA,", "or visit http://www.gnu.org.", " ", "Compiled:", buildinfo1, buildinfo2, NULL }; /*****************************************************************************/ void ui_load_creditspanel() { Widget creditsform, creditslist, HideButton; mib_Widget *creditsload; static char Credits[] = "Credits"; /*****************************************************************************/ ui_make_panel_and_form(Credits, Root, True, True, &creditsform); /*creditsload = mib_load_interface(creditsform, "interface/Credits.mib", MI_FROMFILE);*/ creditsload = mib_load_interface(creditsform, Root, MI_FROMSTRING); XtManageChild(creditsform); /*****************************************************************************/ HideButton = mib_find_name(creditsload, "HideButton")->me; XtAddCallback(HideButton, XmNactivateCallback, (XtCallbackProc) ui_hide, (XtPointer) Credits); creditslist = mib_find_name(creditsload, "CreditsList")->me; add_text(creditslist, credits); } /*****************************************************************************/ static void add_text(Widget clist, char *text[]) { int line = 0; XmString str; char first[128]; sprintf(first, "Geomview %.80s %.20s", geomview_version, buildinfographics); text[0] = first; while (text[line]) { str = XmStringCreateSimple(text[line]); XmListAddItemUnselected(clist, str, 0); XmStringFree(str); line++; } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/x11/gvevent.c0000644000175000017500000002504412310110177015703 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "../common/drawer.h" #include "../common/ui.h" #include "../common/comm.h" #include "../common/space.h" #include "../common/event.h" #include "../common/motion.h" #include "../common/worldio.h" #include "../common/lang.h" #include "clang.h" #include #include #include #include #include #include #include #include #include "mibload.h" #include "gvui.h" #if D1_DEBUG #define GV_RAWEVENT(dev, val, x, y, t) \ printf("calling gv_rawevent(dev=%3d, val=%3d, x=%4d, y=%4d, t=%1ld)\n", dev, val, x, y, t); \ gv_rawevent( dev, val, x, y, t) #else #define GV_RAWEVENT(dev, val, x, y, t) \ gv_rawevent( dev, val, x, y, t) #endif /* gvevent.c global vars */ /*****************************************************************************/ #define ESC '\033' extern Display *dpy; static void perftick(); static struct perf { /* Performance metering */ int interval; /* Interval between auto-reports */ int mindt, maxdt, meandt; /* Integer milliseconds */ int cycles; /* # cycles where we actually did something */ struct timeval then; } perf; static int lastx; static int lasty; static int dragx; static int dragy; static int nseen; static int dragstop, dragging, deldrag, numdrags; int justdragged; static Time lastt; Time last_event_time; static Event gev; /* geomview event structure */ /*****************************************************************************/ #if D1_DEBUG void print_event(char *s, Event *e) { printf("%s: event(dev=%3d, val=%3d, x=%4d, y=%4d, t=%1ld)\n", s, e->dev, e->val, e->x, e->y, e->t); } #endif static void process_events(int queuefd) { struct timeval await; #define BRIEF 0.1 static struct timeval brief = { 0, 100000 }; float timelimit; fd_set thesefds; XtInputMask xim; if (queuefd < 0) { queuefd = ConnectionNumber(dpy); } if(drawerstate.pause) { if(!dragging && !drawer_moving()) select(0, NULL, NULL, NULL, &brief); nseen = 0; } else { int nwatch = 0; timelimit = PoolInputFDs( &thesefds, &nwatch ); if(timelimit > 0 && drawer_moving()) timelimit = 0; /* "Is anything moving?" */ if (queuefd >= 0 ) FD_SET(queuefd, &thesefds); if(queuefd >= nwatch) nwatch = queuefd+1; if(timelimit > BRIEF) timelimit = BRIEF; await.tv_sec = floor(timelimit); await.tv_usec = 1000000*(timelimit - await.tv_sec); nseen = select(nwatch, &thesefds, NULL, NULL, &await); } gettimeofday(&perf.then, NULL); if(!drawerstate.pause) PoolInAll( &thesefds, &nseen ); ui_update(); justdragged = 0; deldrag = gev.t; while ((xim = XtAppPending(App)) != 0) { XtAppProcessEvent(App, xim); } if (dragging && !justdragged && !dragstop) { D1PRINT(("gvevent at 1\n")); GV_RAWEVENT( gev.dev, -1, gev.x, gev.y, gev.t); dragstop = 1; } if (dragging) { deldrag = gev.t - deldrag; } else { deldrag = 0; } XSync(dpy, False); gv_update_draw( ALLCAMS, 0.001 * (float)deldrag ); mg_textureclock(); if(perf.interval > 0) perftick(); numdrags = 0; } void main_loop() { int queuefd; queuefd = ConnectionNumber(dpy); dragging = 0; dragstop = 1; justdragged = 0; deldrag = 0; numdrags = 0; while (1) { process_events(queuefd); } } LDEFINE(processevents, LVOID, "(process-events)\n" "Pass control back to the event loop of Geomview, then continue " "evaluating the current command-script.") { Lake *caller; LDECLARE(("process-events", LBEGIN, LLAKE, &caller, LEND)); PoolDetach(POOL(caller)); do { process_events(-1); } while (PoolASleep(POOL(caller))); PoolReattach(POOL(caller)); return Lt; } /*****************************************************************************/ static void perftick() { int dt; struct timeval now; gettimeofday(&now, NULL); dt = (now.tv_sec - perf.then.tv_sec)*1000 + (now.tv_usec - perf.then.tv_usec)/1000; if(dt > 0) { if(dt < perf.mindt) perf.mindt = dt; if(dt > perf.maxdt) perf.maxdt = dt; perf.meandt += dt; if(++perf.cycles == perf.interval) timing(perf.interval); } } /*****************************************************************************/ void timing(int interval) { if(perf.cycles > 0) { printf("%d..%d ms/cycle, mean %d ms over %d cycles\n", perf.mindt, perf.maxdt, perf.cycles ? perf.meandt/perf.cycles : 0, perf.cycles); fflush(stdout); } perf.mindt = 9999999, perf.maxdt = -1, perf.meandt = perf.cycles = 0; perf.interval = interval; } /*****************************************************************************/ void cam_input(Widget w, XtPointer data, XmDrawingAreaCallbackStruct *cbs) { Boolean junk; D1PRINT(("cam_input\n")); panel_input(w, data, cbs->event, &junk); } void key_action(Widget w, XEvent *event, String *argv, Cardinal *argcp) { Boolean junk; D1PRINT(("key_action\n")); panel_input(w, NULL, event, &junk); } void panel_input(Widget w, XtPointer data, XEvent *event, Boolean *cont) { char str[1]; KeySym keysym; int newstate, nc; switch (event->type) { case UnmapNotify: /* Window iconified or otherwise temporarily gone */ D1PRINT(("panel_input: case UnmapNotify\n")); gv_freeze( (int)(long)data, 1 ); /* Hard-frozen; prevent gv_redraw from working until we say so */ break; case MapNotify: D1PRINT(("panel_input: case MapNotify\n")); gv_freeze( (int)(long)data, 0 ); /* Permit thawing. */ gv_redraw( (int)(long)data ); /* Thaw it now, in case Expose arrived before MapNotify */ break; case MotionNotify: D1PRINT(("panel_input: case MotionNotify\n")); last_event_time = event->xmotion.time; cam_mouse(w, data, &event->xmotion, cont); return; case ButtonPress: case ButtonRelease: D1PRINT(("panel_input: case ButtonPress/Release\n")); newstate = (event->type == ButtonPress); button.left = ((event->xbutton.state & Button1Mask) ? 1 : 0); button.middle = ((event->xbutton.state & Button2Mask) ? 1 : 0); button.right = ((event->xbutton.state & Button3Mask) ? 1 : 0); button.shift = ((event->xbutton.state & ShiftMask) ? 1 : 0); button.ctrl = ((event->xbutton.state & ControlMask) ? 1 : 0); dragging = newstate; lastt = last_event_time = event->xbutton.time; D1PRINT(("gvevent: at 1.5, event->xbutton.time = %1ld\n", event->xbutton.time)); dragx = event->xbutton.x_root; dragy = YScrnSize - event->xbutton.y_root; if (dragstop && !newstate) { D1PRINT(("gvevent at 2\n")); GV_RAWEVENT( gev.dev, -1, dragx, dragy, lastt); } switch (event->xbutton.button) { case 1: gev.dev = ELEFTMOUSE; button.left = newstate; break; case 2: gev.dev = EMIDDLEMOUSE; button.middle = newstate; break; case 3: gev.dev = ERIGHTMOUSE; button.right = newstate; break; } if(gev.dev == ELEFTMOUSE && (event->xbutton.state & Mod1Mask)) { gev.dev = EMIDDLEMOUSE; button.middle = button.left; button.left = 0; } gev.x = dragx; gev.y = dragy; gev.t = lastt; deldrag = gev.t; D1PRINT(("gvevent at 3\n")); GV_RAWEVENT( gev.dev, newstate, gev.x, gev.y, gev.t); dragstop = 1; break; case KeyPress: D1PRINT(("panel_input: case KeyPress\n")); nc = XLookupString((XKeyEvent *) event, str, 1, &keysym, NULL); last_event_time = event->xkey.time; if ((int)keysym == (int)'Q') str[0] = ESC; if (keysym == XK_Escape) str[0] = ESC; if (nc > 0) { gev.dev = str[0]; gev.x = event->xkey.x_root; gev.y = YScrnSize - event->xkey.y_root; gev.t = event->xkey.time; D1PRINT(("gvevent at 4\n")); GV_RAWEVENT(str[0], 1, gev.x, gev.y, gev.t); } break; default: break; } } /*****************************************************************************/ void cam_mouse(Widget w, XtPointer data, XPointerMovedEvent *event, Boolean *cont) { static int lasthere = 0; dragging = 1; dragstop = 0; justdragged = 1; numdrags++; if (numdrags > 2) return; gev.x = event->x_root; gev.y = YScrnSize - event->y_root; gev.t = event->time; PRINT_EVENT(("cam_mouse", &gev)); if ((int)(gev.t - lastt) > uistate.cursor_still) { if (abs(gev.x - lastx) < uistate.cursor_twitch && abs(gev.y - lasty) < uistate.cursor_twitch) { gev.x = dragx; gev.y = dragy; } lastx = gev.x; lasty = gev.y; lastt = gev.t; } dragx = gev.x; dragy = gev.y; if (lasthere != (int)gev.t) { D1PRINT(("cam_mouse: at 1\n")); GV_RAWEVENT( gev.dev, -1, gev.x, gev.y, gev.t); } else { D1PRINT(("cam_mouse: at 2\n")); GV_RAWEVENT( gev.dev, -1, gev.x, gev.y, gev.t+1); dragstop = 1; } lasthere = gev.t; } /*****************************************************************************/ void cam_mousecross(Widget w, XtPointer data, XEnterWindowEvent *event, Boolean *cont) { if (!uistate.cam_wm_focus) { int id = (int)(long)data; gv_winenter(id); } } /*****************************************************************************/ void cam_focus(Widget w, XtPointer data, XFocusChangeEvent *event, Boolean *cont) { if (uistate.cam_wm_focus && event->type == FocusIn) { int id = (int)(long)data; gv_winenter(id); } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/x11/gvfiles.c0000644000175000017500000001062212310110177015660 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include #include "../common/drawer.h" #include "gvui.h" #include "interface/LoadPaths.mib" extern Display *dpy; extern Widget TopLevel; /* private methods and variables */ /*****************************************************************************/ static void load_selection(Widget, XtPointer, XmFileSelectionBoxCallbackStruct *); static void select_path(Widget, XtPointer, XmListCallbackStruct *); /*static void ui_update_filespanel();*/ static Widget shell, pathlist, filesform; static char **dirp; /*****************************************************************************/ void ui_load_filespanel() { Widget pathform, temp; mib_Widget *pathload; XmString xname; static char Files[] = "Files"; /*****************************************************************************/ shell = ui_make_panel_and_form(Files, Root, True, False, NULL); filesform = XmCreateFileSelectionBox(shell, Files, NULL, 0); XtManageChild(filesform); XtSetMappedWhenManaged(filesform, True); /*****************************************************************************/ temp = XmFileSelectionBoxGetChild(filesform, XmDIALOG_HELP_BUTTON); XtUnmanageChild(temp); XtAddCallback(filesform, XmNokCallback, (XtCallbackProc) load_selection, (XtPointer) NULL); temp = XmFileSelectionBoxGetChild(filesform, XmDIALOG_CANCEL_BUTTON); xname = XmStringCreateSimple("Hide"); XtVaSetValues(temp, XmNlabelString, xname, NULL); XmStringFree(xname); XtAddCallback(temp, XmNactivateCallback, (XtCallbackProc) ui_hide, (XtPointer) Files); /*****************************************************************************/ /*pathload = mib_load_interface(filesform, "interface/LoadPaths.mib", MI_FROMFILE);*/ pathload = mib_load_interface(filesform, Root, MI_FROMSTRING); pathform = pathload->me; pathlist = mib_find_name(pathload, "PathList")->me; XtAddCallback(pathlist, XmNbrowseSelectionCallback, (XtCallbackProc) select_path, (XtPointer) NULL); XtManageChild(pathform); XtManageChild(pathlist); } /*****************************************************************************/ void ui_show_filespanel() { int i; XmString str; XmListDeleteAllItems(pathlist); dirp = getfiledirs(); for (i=0; dirp[i] != NULL; i++) { str = XmStringCreateSimple(dirp[i]); XmListAddItemUnselected(pathlist, str, 0); XmStringFree(str); } } /*****************************************************************************/ static void select_path(Widget w, XtPointer data, XmListCallbackStruct *cbs) { char *temp, dirmask[200]; XmString dmask; if (!XmStringGetLtoR(cbs->item, XmSTRING_DEFAULT_CHARSET, &temp)) return; if (!*temp) return; sprintf(dirmask,"%s/*", temp); XtFree(temp); dmask = XmStringCreate(dirmask, XmSTRING_DEFAULT_CHARSET); XmFileSelectionDoSearch(filesform, dmask); XmStringFree(dmask); } /*****************************************************************************/ static void load_selection(Widget w, XtPointer data, XmFileSelectionBoxCallbackStruct *cbs) { char *object; if (!XmStringGetLtoR(cbs->value, XmSTRING_DEFAULT_CHARSET, &object)) return; if (!*object) return; gv_load(object, NULL); XtFree(object); } /*****************************************************************************/ geomview-1.9.5/src/bin/geomview/x11/gvlights.c0000644000175000017500000001577112310110177016062 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "../common/drawer.h" #include "../common/ui.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Lights.mib" #define MAXLIGHTS 8 #define LIGHTINDEX 255 extern Display *dpy; extern UIState uistate; extern int light_count(); extern void set_light(int); extern Pixmap geomicon; /* private methods and variables */ /*****************************************************************************/ static void select_light(Widget, XtPointer, XmListCallbackStruct *); static void intensity_light(Widget, XtPointer, XmScaleCallbackStruct *); static void toggle_lights(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void color_light(Widget, XtPointer, XmAnyCallbackStruct *); static void light_add(Widget, XtPointer, XmAnyCallbackStruct *); static void light_del(Widget, XtPointer, XmAnyCallbackStruct *); static Widget ltoggle, lintensity, lightslist; static char *lights[MAXLIGHTS+1]; /*static int pos_later = 0, posx = 0, posy = 0; static char geometry[40];*/ /*****************************************************************************/ void ui_load_lightspanel() { int n; Widget lightsform, lightsadd, lightsdel, ColButton, HideButton; char buf[100]; mib_Widget *lightsload; static char Lights[] = "Lights"; /*****************************************************************************/ ui_make_panel_and_form(Lights, Root, True, True, &lightsform); /*lightsload = mib_load_interface(lightsform, "interface/Lights.mib", MI_FROMFILE);*/ lightsload = mib_load_interface(lightsform, Root, MI_FROMSTRING); XtManageChild(lightsform); /*****************************************************************************/ ColButton = mib_find_name(lightsload, "ColorButton")->me; HideButton = mib_find_name(lightsload, "HideButton")->me; lightslist = mib_find_name(lightsload, "LightsList")->me; lintensity = mib_find_name(lightsload, "IntensityScale")->me; ltoggle = mib_find_name(lightsload, "LightsToggle")->me; lightsadd = mib_find_name(lightsload, "AddButton")->me; lightsdel = mib_find_name(lightsload, "DeleteButton")->me; XtAddCallback(ColButton, XmNactivateCallback, (XtCallbackProc) color_light, (XtPointer) NULL); XtAddCallback(HideButton, XmNactivateCallback, (XtCallbackProc) ui_hide, (XtPointer) Lights); XtAddCallback(lightslist, XmNbrowseSelectionCallback, (XtCallbackProc) select_light, (XtPointer) &lintensity); XtAddCallback(lintensity, XmNdragCallback, (XtCallbackProc) intensity_light, (XtPointer) NULL); XtAddCallback(lintensity, XmNvalueChangedCallback, (XtCallbackProc) intensity_light, (XtPointer) NULL); XtAddCallback(ltoggle, XmNvalueChangedCallback, (XtCallbackProc) toggle_lights, (XtPointer) NULL); XtAddCallback(lightsadd, XmNactivateCallback, (XtCallbackProc) light_add, (XtPointer) NULL); XtAddCallback(lightsdel, XmNactivateCallback, (XtCallbackProc) light_del, (XtPointer) NULL); /*****************************************************************************/ /* Initialize Panel Variables */ lights[0] = "ambient"; for (n = 1; n <= MAXLIGHTS; ++n) { sprintf(buf, "light %1d", n); lights[n] = strdup(buf); } ui_build_browser(lightslist, light_count(), lights); } /*****************************************************************************/ void ui_show_lightspanel() { set_light(light_count() > 0 ? 1 : 0); XmListSelectPos(lightslist, uistate.current_light + 1, False); } /*****************************************************************************/ void set_light_display(int lightno) { extern float light_intensity(); XmScaleSetValue(lintensity, (int) (light_intensity()*100.0)); } /*****************************************************************************/ void ui_light_button() { int state = (uistate.lights_shown != 0); XmToggleButtonSetState(ltoggle, state, False); } /*****************************************************************************/ void ui_lights_changed() { ui_build_browser(lightslist, light_count(), lights); set_light(uistate.current_light); } /*****************************************************************************/ static void select_light(Widget w, XtPointer data, XmListCallbackStruct *cbs) { extern float light_intensity(); Widget intensity = (Widget)*((Widget *)data); set_light(cbs->item_position-1); XmScaleSetValue(intensity, (int) (light_intensity()*100.0)); } /*****************************************************************************/ static void color_light(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { extern Color *light_color(); /* in clights.c */ ui_config_colorpanel("Light Color", light_color(), LIGHTINDEX, DRAWER_LIGHTCOLOR, 0); ui_showpanel(P_COLOR, 1); } /*****************************************************************************/ static void light_add(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { extern void add_light(); if (light_count() > 8) { OOGLError(0, "Can't have more than 8 lights\n"); return; } add_light(); } /*****************************************************************************/ static void light_del(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { extern void delete_light(); if (uistate.current_light == 0) return; delete_light(); } /*****************************************************************************/ static void toggle_lights(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { extern void light_edit_mode(int); light_edit_mode(cbs->set); } /*****************************************************************************/ static void intensity_light(Widget w, XtPointer data, XmScaleCallbackStruct *cbs) { float f = (float)cbs->value/100.0; drawer_float(GEOMID(uistate.targetgeom), DRAWER_LIGHT_INTENSITY, f); } /*****************************************************************************/ geomview-1.9.5/src/bin/geomview/x11/gvload.c0000644000175000017500000001021112310110177015467 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "../common/drawer.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Input.mib" #include "X11/IntrinsicP.h" /* for XtMoveWidget */ extern Display *dpy; extern Widget TopLevel; /* private methods and variables */ /*****************************************************************************/ static Widget shell, loadform; static Widget FileBrowserButton, HideButton, OKButton, TextField; /*static int pos_later = 0, posx = 0, posy = 0; static char geometry[40];*/ static void do_load(Widget w, XtPointer data, XmAnyCallbackStruct *cbs); static void action_load(Widget, XEvent *, String *, Cardinal *); static XtActionsRec actions[1] = { { "GVLoad", action_load } }; static String loadtransl = "Return: GVLoad()"; /*****************************************************************************/ void ui_load_loadpanel() { mib_Widget *loadload; XtTranslations LoadTransl; static char Load[] = "Load"; /*****************************************************************************/ XtAppAddActions(App, actions, 1); shell = ui_make_panel_and_form(Load, Root, False, True, &loadform); /*loadload = mib_load_interface(loadform, "interface/MiniLoad.mib", MI_FROMFILE);*/ loadload = mib_load_interface(loadform, Root, MI_FROMSTRING); XtManageChild(loadform); FileBrowserButton = mib_find_name(loadload, "FileBrowser")->me; HideButton = mib_find_name(loadload, "Cancel")->me; OKButton = mib_find_name(loadload, "OK")->me; TextField = mib_find_name(loadload, "FileName")->me; XtAddCallback(HideButton, XmNactivateCallback, (XtCallbackProc)ui_hide, (XtPointer) Load); XtAddCallback(OKButton, XmNactivateCallback, (XtCallbackProc)do_load, (XtPointer) NULL); XtAddCallback(FileBrowserButton, XmNactivateCallback, (XtCallbackProc)ui_show, (XtPointer)"Files"); XtVaSetValues(TextField, XmNblinkRate, 0, NULL); LoadTransl = XtParseTranslationTable(loadtransl); XtOverrideTranslations(TextField, LoadTransl); } /*****************************************************************************/ void ui_show_loadpanel() { Window root, child; int x, y, wx, wy, posx = 0, posy = 0; unsigned int mask; XtManageChild(loadform); if(XQueryPointer(dpy, DefaultRootWindow(dpy), &root, &child, &x, &y, &wx, &wy, &mask)) { posx = (x -= 20) < 0 ? 0 : x; posy = (y -= 20) < 0 ? 0 : y; } XtMoveWidget(shell, posx, posy); XtSetMappedWhenManaged(loadform, True); XtRealizeWidget(shell); XRaiseWindow(dpy, XtWindow(shell)); XtSetKeyboardFocus(loadform, TextField); XmTextFieldSetSelection(TextField, 0, 9999, last_event_time); } /*****************************************************************************/ static void do_load(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { char *str = XmTextGetString(TextField); if(str != NULL && str[0] != '\0') gv_load( str, NULL ); ui_hide(w, "Load", NULL); } static void action_load(Widget w, XEvent *event, String *argv, Cardinal *argc) { do_load(w, NULL, NULL); } geomview-1.9.5/src/bin/geomview/x11/gvmain.c0000644000175000017500000001345312310110177015507 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "../common/main.h" #include "../common/drawer.h" #include "../common/ui.h" #include "../common/comm.h" #include "../common/lang.h" #include "../common/worldio.h" #include "mibload.h" #include "gvui.h" #include "string.h" /* Floating-point handling strategy lifted from GSL - the GNU * Scientific Library. */ #if HAVE_FPU_CONTROL_H # include /* Apparently _FPU_SETCW was not available in libc5, but __setfpucw() was */ # if !defined(_FPU_SETCW) && HAVE___SETFPUCW # if HAVE_i386_FPU_CONTROL_H # include # endif # define _FPU_SETCW(cw) __setfpucw(cw) # endif #endif #include /* xgv main - global variables */ /*****************************************************************************/ /* set initial camera background color */ extern HandleOps CommandOps, GeomOps; extern void ui_windowWillOpen(DView *dv); /* private methods */ /*****************************************************************************/ static void parse_args(int argc, char *argv[]); static void env_usage(); /*****************************************************************************/ int main(int argc, char **argv) { int i; CameraStruct cs; unsetenv("LD_PRELOAD"); #if defined(_FPU_SETCW) fpu_control_t hctrlword = _FPU_IEEE; _FPU_SETCW(hctrlword); #endif signal(SIGFPE, SIG_IGN); /* Ignore e.g. divide-by-zero traps */ /* (Need this at least for Alpha/OSF & FreeBSD) */ load_interface(argc,argv); init_geomview(argc, argv); cam_mgdevice(); /* in gvcamui.c */ parse_args(argc, argv); /* load command & data file(s) */ cs.h = NULL; cs.cam = NULL; for (i=0; i < gv_nwins; i++) if (!dview[i]) {/* ui_windowWillOpen((DView *)NULL); */ gv_new_camera(NULL, &cs); } ui_final_init(); main_loop(); return 0; } /*****************************************************************************/ void env_init() { extern char *getenv(); extern void set_load_path(char **); extern void set_emodule_path(char **); #define MAXDIRS 100 char *dirs[MAXDIRS]; char *geomview_load_path = getenv("GEOMVIEW_LOAD_PATH"); char *p, *geomview_emodule_path = getenv("GEOMVIEW_EMODULE_PATH"); int i; if (geomview_load_path == NULL) { env_usage(); exit(1); } geomview_system_initfile = getenv("GEOMVIEW_SYSTEM_INITFILE"); if (geomview_load_path) { char *path = strdup(geomview_load_path); for(i=0, p = strtok(path, ":"); p; p = strtok(NULL, ":"), i++) dirs[i] = p; dirs[i] = NULL; set_load_path(dirs); free(path); } if (geomview_emodule_path) { char *path = strdup(geomview_emodule_path); for(i=0, p = strtok(path, ":"); p; p = strtok(NULL, ":"), i++) dirs[i] = p; dirs[i] = NULL; set_emodule_path(dirs); gv_emodule_sort(); free(path); } #undef MAXDIRS } /*****************************************************************************/ static void env_usage() { fprintf(stderr, "The shell environment variable GEOMVIEW_LOAD_PATH is not set;\n\ are you trying to run the geomview executable, gvx, directly?\n\ If so, try running the main geomview shell script, called\n\ \"geomview\" instead. It takes care of setting this and other\n\ relevant environment variables for you.\n\ \n\ If for some reason you do not have the \"geomview\" shell\n\ script you should obtain a copy of geomview from www.geomview.org.\n\ \n\ Geomview expects the following environment variables to be\n\ set\n\ \n\ GEOMVIEW_LOAD_PATH\n\ colon-separated list of directories that geomview should\n\ look in for files you load\n\ \n\ GEOMVIEW_EMODULE_PATH\n\ colon-separated list of directories that geomview should\n\ look in for external modules (these appear in the\n\ \"Applications\" browser on the main panel).\n\ \n\ GEOMVIEW_SYSTEM_INITFILE\n\ pathname of a system-wide initialization file (.geomview)\n\ to read upon startup\n"); } /*****************************************************************************/ #define STREQ(s1,s2) (strcmp(s1,s2)==0) /*****************************************************************************/ static void parse_args(int argc, char *argv[]) { char **av; int ac; for (ac = argc, av = argv+1; --ac > 0; av++) { if(!parse_common_arg(&ac, &av)) { usage(argv[0], ""); } } } /*****************************************************************************/ /* there should be some way to avoid putting this here, but the call to ntsc is in the COMMON code.... (why?) :P */ int isntsc() { return 0; } int ntsc(int on) { return 0; } /*****************************************************************************/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/x11/gvmaterial.c0000644000175000017500000001701212310110177016354 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "../common/drawer.h" #include "../common/ui.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Material.mib" /* private methods and variables */ /*****************************************************************************/ static void matt_sliders(Widget, XtPointer, XmScaleCallbackStruct *); static void matt_entries(Widget w, XtPointer data, XmAnyCallbackStruct *cbs); extern void ap_toggle(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs); extern void set_ap_toggle(Widget w, int *current, Appearance *ap, int flagbit); static Widget TranslucentToggle, TranslucencyList; static int TranslucencyListSet = -1; static int TranslucentToggleSet = -1; static struct _slider { float min, max; DrawerKeyword val; int mtcode; char *slidername, *textname; Widget sliderw, textw; float lastval; } sliders[] = { { 1.0, 128.0, DRAWER_SHININESS, MT_SHININESS, "ShininessScale", "ShininessText" }, { 0.0, 1.0, DRAWER_KS, MT_Ks, "SpecularScale", "SpecularText" }, { 0.0, 1.0, DRAWER_KD, MT_Kd, "DiffuseScale", "DiffuseText" }, { 0.0, 1.0, DRAWER_KA, MT_Ka, "AmbientScale", "AmbientText" }, { 0.0, 1.0, DRAWER_ALPHA, MT_ALPHA, "AlphaScale", "AlphaText" }, }; #define S_SHINY 0 #define S_SPECULAR 1 #define S_DIFFUSE 2 #define S_AMBIENT 3 #define S_ALPHA 4 /*****************************************************************************/ static void translucency_callback(Widget w, XtPointer data, XmListCallbackStruct *cbs) { int offset = 0; if ((DrawerKeyword)(long)data != DRAWER_TRANSLUCENCY) { OOGLError(1, "Bogus browser callback.\n"); return; } TranslucencyListSet = offset = cbs->item_position + BSPTREE_BLENDING; if (TranslucentToggleSet == 0) { offset = -offset; } drawer_int(GEOMID(uistate.targetgeom), DRAWER_TRANSLUCENCY, offset); } /*****************************************************************************/ static void translucent_callback(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { int offset; if ((DrawerKeyword)(long)data != DRAWER_TRANSLUCENCY) { OOGLError(1, "Bogus browser callback.\n"); return; } TranslucentToggleSet = cbs->set; offset = TranslucentToggleSet ? TranslucencyListSet : -TranslucencyListSet; drawer_int(GEOMID(uistate.targetgeom), DRAWER_TRANSLUCENCY, offset); } /*****************************************************************************/ void ui_load_materialpanel() { int i; struct _slider *s; Widget mattform, HideButton; mib_Widget *mattload; static char Material[] = "Material"; /*****************************************************************************/ ui_make_panel_and_form(Material, Root, False, True, &mattform); /*mattload = mib_load_interface(mattform, "interface/Material.mib", MI_FROMFILE);*/ mattload = mib_load_interface(mattform, Root, MI_FROMSTRING); XtManageChild(mattform); /*****************************************************************************/ HideButton = mib_find_name(mattload, "HideButton")->me; TranslucentToggle = mib_find_name(mattload, "TranslucentToggle")->me; TranslucencyList = mib_find_name(mattload, "TranslucencyList")->me; XtAddCallback(HideButton, XmNactivateCallback, (XtCallbackProc) ui_hide, (XtPointer) Material); for (i = 0, s = sliders; i < COUNT(sliders); i++, s++) { s->sliderw = mib_find_name(mattload, s->slidername)->me; s->textw = mib_find_name(mattload, s->textname)->me; XtAddCallback(s->sliderw, XmNdragCallback, (XtCallbackProc) matt_sliders, (XtPointer)(long) i); XtAddCallback(s->sliderw, XmNvalueChangedCallback, (XtCallbackProc) matt_sliders, (XtPointer)(long) i); XtAddCallback(s->textw, XmNactivateCallback, (XtCallbackProc) matt_entries, (XtPointer)(long) i); XtAddCallback(s->textw, XmNlosingFocusCallback, (XtCallbackProc) matt_entries, (XtPointer)(long) i); } XtAddCallback(TranslucentToggle, XmNvalueChangedCallback, (XtCallbackProc)translucent_callback, (XtPointer)DRAWER_TRANSLUCENCY); ui_build_browser(TranslucencyList, COUNT(translucencies), translucencies); XtAddCallback(TranslucencyList, XmNbrowseSelectionCallback, (XtCallbackProc)translucency_callback, (XtPointer)DRAWER_TRANSLUCENCY); } /*****************************************************************************/ static void matt_sliders(Widget w, XtPointer data, XmScaleCallbackStruct *cbs) { struct _slider *s = &(sliders[(int)(long)data]); float val = (float)cbs->value; float conv = ((s->max - s->min)/100.0)*val + s->min; drawer_float(GEOMID(uistate.targetgeom), s->val, conv); s->lastval = conv; ui_set_ftext(s->textw, conv); } static void matt_entries(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { struct _slider *s = &sliders[(int)(long)data]; char *str = XmTextFieldGetString(s->textw); char *estr; float val = strtod(str, &estr); if (*str != '\0' && *estr == '\0') { if (fabs(s->lastval - val) > .001) { XmScaleSetValue(s->sliderw, (int)(100.0*(val - s->min)/(s->max - s->min))); s->lastval = val; } } else { ui_set_ftext(s->textw, s->lastval); } } /*****************************************************************************/ void ui_target_materialpanel(int id) { int i, ival; double val; int conv; Appearance *ap; Material *mt = NULL; struct _slider *s; if (drawer_get_object(id) != NULL) { ap = drawer_get_ap(id); ApGet(ap, AP_MAT, &mt); set_ap_toggle(TranslucentToggle, &TranslucentToggleSet, ap, APF_TRANSP); if ((ival = (ap->translucency - BSPTREE_BLENDING + 1)) != TranslucencyListSet) { TranslucencyListSet = ival; XmListSelectPos(TranslucencyList, ival, False); } if (mt == NULL) { return; } for (i = 0; i < COUNT(sliders); i++) { s = &sliders[i]; if (MtGet(mt, s->mtcode, &val) > 0) { conv = (int)(100.0*(val - s->min)/(s->max - s->min)); XmScaleSetValue(s->sliderw, conv); ui_set_ftext(s->textw, val); s->lastval = val; } } } } /*****************************************************************************/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/x11/gvmnpanel.c0000644000175000017500000005503312310110177016215 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "../common/drawer.h" #include "../common/ui.h" #include "../common/lang.h" #include #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/MainPanel.mib" extern Display *dpy; extern UIState uistate; /* private methods and variables */ /*****************************************************************************/ static void select_object(Widget, XtPointer, XmListCallbackStruct *); static void select_module(Widget, XtPointer, XmListCallbackStruct *); static void file_menu_callbacks(Widget, char *); static void edit_menu_callbacks(Widget, char *); static void inspect_menu_callbacks(Widget, XtPointer); static void motion_menu_callbacks(Widget, char *); static void help_menu_callbacks(Widget, XtPointer); static void choose_space(Widget, int); static void BuildBrowserMenu(); static int id2menuindex(int); static int *menuindex = NULL; static int menucount = 0; static int currentspace = 0, loaded = 0; static Widget shell, ObjectList, EmodList, MotionToggle[3], SpaceRadio[3], KeyText; static MenuItem file_menu[] = { { "New Camera", &xmPushButtonGadgetClass, 'N', "CtrlN","[v+]", file_menu_callbacks, "N", (MenuItem *)NULL}, { "Open ", &xmPushButtonGadgetClass, 'O', "CtrlO","[ < ]", file_menu_callbacks, "O", (MenuItem *)NULL}, { "Save ", &xmPushButtonGadgetClass, 'S', "CtrlS","[ > ]", file_menu_callbacks, "S", (MenuItem *)NULL}, { "_sepr", &xmSeparatorGadgetClass, (char)0, (char*)NULL, (char*)NULL, (void (*)())NULL, (XtPointer)NULL, (MenuItem *)NULL }, { "Exit ", &xmPushButtonGadgetClass, 'E', "CtrlX","[ Q ]", file_menu_callbacks, "X", (MenuItem *)NULL}, { NULL, NULL } }; static MenuItem edit_menu[] = { { "Copy", &xmPushButtonGadgetClass, 'C', NULL, NULL, edit_menu_callbacks, "C", (MenuItem *)NULL}, { "Delete", &xmPushButtonGadgetClass, 'D', "CtrlD", "[dd]", edit_menu_callbacks, "D", (MenuItem *)NULL}, { NULL, NULL } }; static MenuItem inspect_menu[] = { { "Tools", &xmPushButtonGadgetClass, 'T', "CtrlT", "[Pt]", inspect_menu_callbacks, (XtPointer)P_TOOL, (MenuItem *)NULL}, { "Appearance", &xmPushButtonGadgetClass, 'A', "CtrlA", "[Pa]", inspect_menu_callbacks, (XtPointer)P_APPEARANCE, (MenuItem *)NULL}, { "Material ", &xmPushButtonGadgetClass, 'M', "CtrlM", "[PM]", inspect_menu_callbacks, (XtPointer)P_MATERIAL, (MenuItem *)NULL}, { "Lights ", &xmPushButtonGadgetClass, 'L', "CtrlL", "[Pl]", inspect_menu_callbacks, (XtPointer)P_LIGHTS, (MenuItem *)NULL}, { "Cameras ", &xmPushButtonGadgetClass, 'C', "CtrlC", "[Pc]", inspect_menu_callbacks, (XtPointer)P_CAMERA, (MenuItem *)NULL}, { "Commands ", &xmPushButtonGadgetClass, 'O', "CtrlP", "[PC]", inspect_menu_callbacks, (XtPointer)P_COMMANDS, (MenuItem *)NULL}, { NULL, NULL } }; #if 0 static MenuItem space_menu[] = { { "Euclidean", &xmPushButtonGadgetClass, 'E', NULL, "[me]", choose_space, (XtPointer)EUCLIDEAN, (MenuItem *)NULL}, { "Hyperbolic", &xmPushButtonGadgetClass, 'H', NULL, "[mh]", choose_space, (XtPointer)HYPERBOLIC, (MenuItem *)NULL}, { "Spherical", &xmPushButtonGadgetClass, 'S', NULL, "[ms]", choose_space, (XtPointer)SPHERICAL, (MenuItem *)NULL}, { NULL, NULL } }; #endif static MenuItem motion_menu[] = { { "Tools", &xmPushButtonGadgetClass, 'T', "CtrlT", "[Pt]", motion_menu_callbacks, "T", (MenuItem *)NULL}, { "_sepr", &xmSeparatorGadgetClass, (char)0, (char*)NULL, (char*)NULL, (void (*)())NULL, (XtPointer)NULL, (MenuItem *)NULL }, { "Inertia", &xmToggleButtonGadgetClass, 'I', "AltI", "[ui]", motion_menu_callbacks, "1", (MenuItem *)NULL}, { "Constrain motion", &xmToggleButtonGadgetClass, 'C', "AltM", "[uc]", motion_menu_callbacks, "2", (MenuItem *)NULL}, { "Own coordinates", &xmToggleButtonGadgetClass, 'O', "AltO", "[uo]", motion_menu_callbacks, "3", (MenuItem *)NULL}, { NULL, NULL } }; static MenuItem help_menu[] = { { "About", &xmPushButtonGadgetClass, 'a', "AltA", "[PA]", help_menu_callbacks, (XtPointer)P_CREDITS, (MenuItem *)NULL }, { "Manual (PDF)", &xmPushButtonGadgetClass, 'h', "AltP", "[PP]", help_menu_callbacks, "p", (MenuItem *)NULL }, { "Manual (HTML)", &xmPushButtonGadgetClass, 'h', "AltH", "[PH]", help_menu_callbacks, "h", (MenuItem *)NULL }, { "Credits", &xmPushButtonGadgetClass, 'A', "AltA", "[PA]", help_menu_callbacks, (XtPointer)P_CREDITS, (MenuItem *)NULL }, { NULL, NULL } }; void ui_refresh_mainpanel(int id) { int newspace, i; if (!loaded) return; newspace = uispace(spaceof(WORLDGEOM)); if (currentspace != newspace) { currentspace = newspace; for (i = 0; i < 3; i++) { if (i != currentspace) XtVaSetValues(SpaceRadio[i], XmNset, False, NULL); } XtVaSetValues(SpaceRadio[currentspace], XmNset, True, NULL); } XtVaSetValues(MotionToggle[0], XmNset, uistate.inertia ? True : False, NULL); XtVaSetValues(MotionToggle[1], XmNset, uistate.constrained ? True : False, NULL); XtVaSetValues(MotionToggle[2], XmNset, uistate.ownmotion ? True : False, NULL); } static void motion_menu_callbacks(Widget widget, char *text) { DrawerKeyword val = DRAWER_NOKEYWORD; switch (text[0]) { case 'T': ui_showpanel(P_TOOL, 1); break; case '1': val = DRAWER_INERTIA; break; case '2': val = DRAWER_CONSTRAIN; break; case '3': default: val = DRAWER_OWNMOTION; break; } drawer_int(GEOMID(uistate.targetgeom), val, XmToggleButtonGadgetGetState(widget)); } /* make the motion menu state accessible through GCL commands */ LDEFINE(ui_motion, LVOID, "(ui-motion {inertia|constrain|own-coordinates} {on|off|yes|no})\n" "Enable or disable certain properties of mouse-controlled motion. " "The purpose of this command is to give access to the toggles of the " "`motion'-menu of the main panels through GCL commands. " "\n\n" "`inertia': " "Normally, moving objects have inertia: if the mouse is still moving " "when the button is released, the selected object continues to move. " "When `inertia' is off, objects cease to move as soon as you release " "the mouse." "\n\n" "`constrain': " "It's sometimes handy to move an object in a direction aligned with a " "coordinate axis: exactly horizontally or vertically. Calling " "`(ui-motion constrain on)' changes the interpretation of mouse " "motions to allow this; approximately-horizontal or " "approximately-vertical mouse dragging becomes exactly horizontal " "or vertical motion. Note that the motion is still along the " "X or Y axes of the camera in which you move the mouse, not " "necessarily the object's own coordinate system." "\n\n" "`own-coordinates': " "It's sometimes handy to move objects with respect to the coordinate " "system where they were defined, rather than with respect to some " "camera's view. When `(ui-motion own-coordinates on) has been called, " "all motions are interpreted that way: dragging the mouse rightward " "in translate mode moves the object in its own +X direction, and so " "on. May be especially useful in conjunction with the " "(ui-motion constrain on) command.") { Keyword enabled = NO_KEYWORD, flagkw = NO_KEYWORD; DrawerKeyword motionflag = DRAWER_NOKEYWORD; bool onoff; int btnidx = -1; LDECLARE(("ui-motion", LBEGIN, LKEYWORD, &flagkw, LKEYWORD, &enabled, LEND)); switch (flagkw) { case MOTION_INERTIA_KEYWORD: motionflag = DRAWER_INERTIA; btnidx = 0; break; case MOTION_CONSTRAIN_KEYWORD: motionflag = DRAWER_CONSTRAIN; btnidx = 1; break; case MOTION_OWN_COORDS_KEYWORD: motionflag = DRAWER_OWNMOTION; btnidx = 2; break; default: OOGLError(1, "Wrong keyword, expected one out of " "{\"%s\", \"%s\", \"%s\"}\n", keywordname(MOTION_INERTIA_KEYWORD), keywordname(MOTION_CONSTRAIN_KEYWORD), keywordname(MOTION_OWN_COORDS_KEYWORD)); break; return Lnil; } switch (enabled) { case YES_KEYWORD: case ON_KEYWORD: onoff = true; break; case NO_KEYWORD: case OFF_KEYWORD: onoff = false; break; default: OOGLError(1, "Wrong keyword, expected one out of " "{\"%s\", \"%s\", \"%s\", \"%s\"}\n", keywordname(YES_KEYWORD), keywordname(ON_KEYWORD), keywordname(NO_KEYWORD), keywordname(OFF_KEYWORD)); return Lnil; } drawer_int(GEOMID(uistate.targetgeom), motionflag, onoff); XtVaSetValues(MotionToggle[btnidx], XmNset, onoff ? True : False, NULL); return Lt; } char htmlbrowser[PATH_MAX] = { '\0', }, pdfviewer[PATH_MAX] = { '\0', }; static void help_menu_callbacks(Widget widget, XtPointer ptr) { if ((int)(long)ptr == P_CREDITS) { ui_showpanel(P_CREDITS, 1); } else if (*(char *)ptr == 'h') { ui_manual_browser("html"); } else { /* if (*(char *)ptr == 'p') { */ ui_manual_browser("pdf"); } } static void choose_space(Widget w, int item) { int space; if (item == currentspace) return; currentspace = item; switch (currentspace) { default: case EUCLIDEAN: space = EUCLIDEAN_KEYWORD; break; case HYPERBOLIC: space = HYPERBOLIC_KEYWORD; break; case SPHERICAL: space = SPHERICAL_KEYWORD; break; } gv_space(space); } /*****************************************************************************/ void ui_load_mainpanel() { Arg args[20]; int n; Widget mainwindow, mainmenu, mainform, cascade, space, /*inspect,*/ help, title, HideButton; char buf[40]; static char gvtitle[100]; XmString GVtitle; mib_Widget *mainload; XmString str[3]; XFontStruct *font; XmFontList fontlist; static char Geomview[] = "Geomview"; /*****************************************************************************/ shell = ui_make_panel_and_form(Geomview, Root, True, True, NULL); XtVaSetValues(shell, XmNtitle, "Geomview - The Geometry Center", NULL); /*****************************************************************************/ mainwindow = XtCreateManagedWidget("Geomview", xmMainWindowWidgetClass, shell, args, 0); /*****************************************************************************/ n = 0; XtSetArg (args[n], XmNrubberPositioning, True); n++; mainmenu = XmCreateSimpleMenuBar(mainwindow, "MainMenu", args, n); BuildMenu(mainmenu, XmMENU_PULLDOWN, "File", 'F', file_menu); BuildMenu(mainmenu, XmMENU_PULLDOWN, "Edit", 'E', edit_menu); BuildMenu(mainmenu, XmMENU_PULLDOWN, "Inspect", 'I', inspect_menu); /*****************************************************************************/ str[0] = XmStringCreateSimple("Space"); cascade = XtVaCreateManagedWidget("button_3", /* lesstif demands "button_" */ xmCascadeButtonGadgetClass, mainmenu, XmNlabelString, str[0], XmNmnemonic, (XID)'S', NULL); XmStringFree(str[0]); str[0] = XmStringCreateSimple("Euclidean [me]"); str[1] = XmStringCreateSimple("Hyperbolic [mh]"); str[2] = XmStringCreateSimple("Spherical [ms]"); space = XmVaCreateSimplePulldownMenu(mainmenu, "_pulldown", 3, (XtCallbackProc) choose_space, XmVaRADIOBUTTON, str[0], '\0', NULL, NULL, XmVaRADIOBUTTON, str[1], '\0', NULL, NULL, XmVaRADIOBUTTON, str[2], '\0', NULL, NULL, XmNradioBehavior, True, XmNradioAlwaysOne, True, (XtCallbackProc) NULL); XmStringFree(str[0]); XmStringFree(str[1]); XmStringFree(str[2]); XtVaSetValues(cascade, XmNsubMenuId, space, NULL); for (n = 0; n < 3; n++) { sprintf(buf, "button_%d", n); SpaceRadio[n] = XtNameToWidget(space, buf); } #if 0 for (n = 0; n < 3; n++) { SpaceRadio[n] = XtNameToWidget(space, space_menu[n].label); } #endif XtVaSetValues(SpaceRadio[0], XmNset, True, NULL); currentspace = 0; /*****************************************************************************/ BuildMenu(mainmenu, XmMENU_PULLDOWN, "Motion", 'M', motion_menu); for (n = 0; n < 3; n++) { sprintf(buf, "button_%d", n); MotionToggle[n] = (Widget) motion_menu[n+2].subitems; } help = BuildMenu(mainmenu, XmMENU_PULLDOWN, "Help", 'H', help_menu); XtVaSetValues(mainmenu, XmNmenuHelpWidget, help, NULL); XtManageChild(mainmenu); /*****************************************************************************/ n = 0; XtSetArg (args[n], XmNrubberPositioning, True); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; XtSetArg(args[n], XmNresizable, False); n++; XtSetArg(args[n], XmNaccelerators, KeyAccels); n++; mainform = XmCreateForm(mainwindow, "Geomview", args, n); /*mainload = mib_load_interface(mainform, "interface/MainPanel.mib", MI_FROMFILE);*/ mainload = mib_load_interface(mainform, Root, MI_FROMSTRING); /* Prevent automatic resizing; otherwise the main widget changes everytime we start or stop a new module. */ XtVaSetValues(mainload->me, XmNresizePolicy, XmRESIZE_NONE, NULL); XtManageChild(mainform); XtInstallAccelerators(mainmenu, mainform); /*****************************************************************************/ HideButton = mib_find_name(mainload, "HideButton")->me; ObjectList = mib_find_name(mainload, "ObjectList")->me; EmodList = mib_find_name(mainload, "EmoduleList")->me; KeyText = mib_find_name(mainload, "KeyText")->me; XtVaSetValues(EmodList, XmNselectionPolicy, XmSINGLE_SELECT, NULL); XtVaSetValues(ObjectList, XmNselectionPolicy, XmSINGLE_SELECT, NULL); XtAddCallback(HideButton, XmNactivateCallback, (XtCallbackProc)ui_hide, (XtPointer)Geomview); XtAddCallback(ObjectList, XmNsingleSelectionCallback, (XtCallbackProc)select_object, (XtPointer)NULL); XtAddCallback(EmodList, XmNsingleSelectionCallback, (XtCallbackProc)select_module, (XtPointer)NULL); XtVaSetValues(KeyText, XmNeditable, False, XmNcursorPositionVisible, False, NULL); /*****************************************************************************/ /* set geomview title font */ title = mib_find_name(mainload, "GVTitle")->me; font = XLoadQueryFont(dpy, "-adobe-helvetica-bold-r-normal--24-240-75-75-p-138-iso8859-1"); fontlist = XmFontListCreate(font, "bigger"); sprintf(gvtitle, "Geomview %s", geomview_version); GVtitle = XmStringCreateSimple(gvtitle); XtVaSetValues(title, XmNfontList, fontlist, XmNlabelString, GVtitle, NULL); /*****************************************************************************/ loaded = 1; } /*****************************************************************************/ static void file_menu_callbacks(Widget widget, char *text) { CameraStruct cs; DView *dv; switch (text[0]) { case 'N': dv = (DView *)drawer_get_object(FOCUSID); cs.h = NULL; cs.cam = dv && dv->cam ? CamCopy(dv->cam, NULL) : NULL; gv_new_camera(NULL, &cs); break; case 'X': gv_exit(); break; case 'O': ui_showpanel(P_FILEBROWSER, 1); break; case 'S': ui_showpanel(P_SAVE, 1); default: break; } } /*****************************************************************************/ static void edit_menu_callbacks(Widget widget, char *text) { switch (text[0]) { case 'U': break; case 'C': gv_copy(uistate.targetid, (char *)NULL); break; case 'P': break; case 'D': gv_delete(uistate.targetid); break; default: break; } } /*****************************************************************************/ static void inspect_menu_callbacks(Widget widget, XtPointer code) { ui_showpanel((int)(long)code, 1); } /*****************************************************************************/ #if XmVersion == 1001 /* Motif 1.1 lacks XmListPosToBounds(); fake it. */ #define cent __cent /* evade typedef name conflict with oogl routines */ #define XtMoveWidget __XtMoveWidget #include #undef cent #undef __XtMoveWidget static int xmListVisible(Widget w, int position) { XmListWidget lw = (XmListWidget) w; if (position == 0) position = lw->list.itemCount; if ((position >= lw->list.itemCount) || (position < lw->list.top_position) || (position >= (lw->list.top_position + lw->list.visibleItemCount))) return (False); return True; } #define XmListPosToBounds(w, pos, junk1, junk2, junk3, junk4) xmListVisible(w, pos) #endif /* Motif 1.1 */ static void showselected(int slot) { static int oldslot = -1; if(!XmListPosToBounds(ObjectList, slot, NULL, NULL, NULL, NULL)) { /* It's not already visible; try to scroll as little as possible to * make it so. If prev selection was above this one, place it * near the bottom of the visible area, otherwise near the top. */ if(oldslot > 0 && oldslot < slot && slot > 4) XmListSetBottomPos(ObjectList, slot < menucount ? slot-1 : slot); else XmListSetPos(ObjectList, slot > 4 ? slot-1 : 1); } } void ui_adjustpicklist(int id) { if (id == -1) { BuildBrowserMenu(); showselected( id2menuindex(uistate.targetid) + 1 ); } else { int mind = id2menuindex(id)+1; XmListSelectPos(ObjectList, mind, False); showselected(mind); } } /*****************************************************************************/ /* * Show what's happening on the keyboard. * Commands are enclosed in [brackets]. In case of error, a '?' appears * following the close-bracket. */ void ui_keyboard(int ch) { static char kybd[12]; static int nextc = 0; if(ch <= 0) { ui_keyboard(']'); if(ch < 0) ui_keyboard('?'); nextc = 0; } else if(ch < ' ') { if(ch == '\033') { ui_keyboard('E'); ui_keyboard('S'); ui_keyboard('C'); } else { ui_keyboard('^'); ui_keyboard(ch + 'A' - 1); } } else if(ch == 0177) { ui_keyboard('^'); ui_keyboard('?'); } else { if(nextc >= (int)sizeof(kybd)-1) { memcpy(kybd, kybd+1, sizeof(kybd)-2); nextc = sizeof(kybd)-2; } else if(nextc == 0) { kybd[nextc++] = '['; } kybd[nextc++] = ch; kybd[nextc] = '\0'; XmTextFieldSetString(KeyText, kybd); } } /*****************************************************************************/ static void select_object(Widget w, XtPointer data, XmListCallbackStruct *cbs) { gv_ui_target(menuindex[cbs->item_position - 1], IMMEDIATE); } /*****************************************************************************/ static int id2menuindex(int id) { extern int real_id(int); int i; if (drawer_cam_count() == 1 && (id == TARGETCAMID || id == ALLCAMS || id == FOCUSID)) id = real_id(id); for (i=0; i 1 ? 1 : 0); menulist = OOGLNewNE(XmString, *count, "menulist array"); *menuindex = OOGLNewNE(int, *count, "no space for menuindex array"); n = 0; objs = (DObject**)dgeom; for (i=0; icitizenship != ALIEN) { if (obj->name[1] != NULL) sprintf(buf, "[%.64s] %.64s", obj->name[0], obj->name[1]); else strcpy(buf, obj->name[0]); (*menuindex)[n] = obj->id; menulist[n] = XmStringCreateSimple(buf); ++n; } } if (camcount > 1) { (*menuindex)[n] = FOCUSID; menulist[n] = XmStringCreateSimple("[c] Current Camera"); ++n; } objs = (DObject **)dview; for (i=0; iname[1] == NULL) obj->name[1] = "Default Camera"; sprintf(buf, "[%.64s] %.64s", obj->name[0], obj->name[1]); (*menuindex)[n] = obj->id; menulist[n] = XmStringCreateSimple(buf); ++n; } } /* Report how many we really found -- there may have been gaps */ *count = n; return menulist; } static void DestroyStringList( XmString *list, int count ) { while ( --count >= 0 ) XmStringFree(list[count]); OOGLFree(list); } static void BuildBrowserMenu() { XmString *menulist; XmListDeleteAllItems(ObjectList); if (menuindex) OOGLFree(menuindex); menulist = BuildObjectMenuList(&menuindex, &menucount); XmListAddItems(ObjectList, menulist, menucount, 0); DestroyStringList(menulist, menucount); } /*****************************************************************************/ void ui_adjustemodulelist(int interest) { XmString *items; int i; emodule *em; XmListDeleteAllItems(EmodList); if(VVCOUNT(uistate.emod) > 0) { items = OOGLNewNE(XmString, VVCOUNT(uistate.emod), "emodules"); for(i=0, em=VVEC(uistate.emod,emodule); iname); XmListAddItems(EmodList, items, VVCOUNT(uistate.emod), 0); DestroyStringList(items, VVCOUNT(uistate.emod)); if (interest > 1) XmListSetBottomPos(EmodList, interest + 2); } } /*****************************************************************************/ static void select_module(Widget w, XtPointer data, XmListCallbackStruct *cbs) { int i = cbs->item_position - 1; gv_ui_emodule_start(VVINDEX(uistate.emod, emodule, i)->name); } /*****************************************************************************/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/geomview/x11/gvsave.c0000644000175000017500000002242712310110177015522 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" #include "../common/drawer.h" #include "../common/ui.h" #include "../common/comm.h" #include "../common/worldio.h" #include "../common/lang.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Save.mib" extern Display *dpy; extern Widget TopLevel; /* private methods and variables */ /*****************************************************************************/ static void select_type(Widget, XtPointer, XmAnyCallbackStruct *); static void save_selection(Widget, XtPointer, XmFileSelectionBoxCallbackStruct *); static int suitable_id(int, char **); static Widget shell, saveobj, geomobj, saveform, savewrapper, filetext; static int savechoice = 0; static int blinkrate; #define SAVE_WIO 0 #define SAVE_RMan 1 #define SAVE_SNAP 2 #define SAVE_PS 3 #define SAVE_PANELS 4 static struct saveops { int special; HandleOps *ops; int flag; char *name; } save[] = { /* Note: * This table *must* match the list of items given in the * interface/Save.mib file for the ObjectMenu widget! */ { SAVE_WIO, &CommandOps, 0, "Commands" }, { SAVE_WIO, &GeomOps, SELF, "Geometry alone" }, { SAVE_WIO, &GeomOps, WORLDGEOM, "Geometry [in world]" }, { SAVE_WIO, &GeomOps, UNIVERSE, "Geometry [in universe]"}, { SAVE_RMan, NULL, TIFF_KEYWORD, "RMan [->tiff]" }, { SAVE_RMan, NULL, FRAME_KEYWORD, "RMan [->frame]" }, { SAVE_SNAP, NULL, 4, "PPM GLX off-screen snapshot"}, { SAVE_SNAP, NULL, 3, "PPM Mesa off-screen snapshot"}, { SAVE_SNAP, NULL, 2, "SGI screen snapshot" }, { SAVE_SNAP, NULL, 1, "PPM screen snapshot" }, { SAVE_SNAP, NULL, 0, "PPM software snapshot" }, { SAVE_PS, NULL, 0, "PostScript snapshot" }, { SAVE_WIO, &CamOps, UNIVERSE, "Camera" }, { SAVE_WIO, &TransOps, WORLDGEOM, "Transform [to world]" }, { SAVE_WIO, &TransOps, UNIVERSE, "Transform [to universe]"}, { SAVE_WIO, &WindowOps, UNIVERSE, "Window" }, }; /* Indexed by save[].flag value. "ppm" must come first (hard-coded below) */ static char *snaptypenames[] = { "ppm", "ppmscreen", "sgi", "ppmosmesa", "ppmosglx" }; extern snap_entry snapshot_table[]; /*****************************************************************************/ void ui_load_savepanel() { int n; Widget savetypeform, temp; mib_Widget *savetypeload, *m_saveobj; mib_Menu *objectmenu; XmString label_text; XmString xname; static char Save[] = "Save"; /*****************************************************************************/ shell = ui_make_panel_and_form(Save, Root, False, True, &savewrapper); /*****************************************************************************/ saveform = XmCreateFileSelectionBox(savewrapper, "Save", NULL, 0); XtManageChild(saveform); temp = XmFileSelectionBoxGetChild(saveform, XmDIALOG_HELP_BUTTON); XtUnmanageChild(temp); XtAddCallback(saveform, XmNokCallback, (XtCallbackProc) save_selection, (XtPointer) NULL); temp = XmFileSelectionBoxGetChild(saveform, XmDIALOG_CANCEL_BUTTON); xname = XmStringCreateSimple("Hide"); XtVaSetValues(temp, XmNlabelString, xname, NULL); XmStringFree(xname); XtAddCallback(temp, XmNactivateCallback, (XtCallbackProc) ui_hide, (XtPointer) Save); /*****************************************************************************/ /*savetypeload = mib_load_interface(saveform, "interface/Save.mib", MI_FROMFILE);*/ savetypeload = mib_load_interface(saveform, Root, MI_FROMSTRING); savetypeform = savetypeload->me; m_saveobj = mib_find_name(savetypeload, "ObjectMenu"); saveobj = m_saveobj->me; objectmenu = (mib_Menu *)m_saveobj->myres; filetext = XmFileSelectionBoxGetChild(saveform, XmDIALOG_TEXT); XtVaGetValues(filetext, XmNblinkRate, &blinkrate, NULL); label_text = XmStringCreateLtoR("", XmSTRING_DEFAULT_CHARSET); XtVaSetValues(saveobj, XmNlabelString, label_text, NULL); XmStringFree(label_text); for (n = 0; n < objectmenu->numitems; n++) { XtAddCallback(objectmenu->items[n], XmNactivateCallback, (XtCallbackProc) select_type, (XtPointer)(long) n); /* If this is a possibly-absent snapshot item, check whether it's * really supported. */ if(save[n].special == SAVE_SNAP && save[n].flag != 0) { int ok = 0; snap_entry *s; for(s = snapshot_table; s->name != NULL; s++) { if(strcmp(s->name, snaptypenames[save[n].flag]) == 0) { ok = 1; break; } } if(!ok) XtUnmanageChild(objectmenu->items[n]); } } geomobj = mib_find_name(savetypeload, "Object")->me; XmTextFieldSetString(geomobj, "World"); XtManageChild(savetypeform); } void ui_show_savepanel() { XtVaSetValues(filetext, XmNblinkRate, blinkrate, NULL); XtManageChild(saveform); } /*****************************************************************************/ static int suitable_id(int savetype, char **namep) { struct saveops *sp = &save[savetype]; int id = drawer_idbyname(*namep); if(savetype >= 0 && savetype < COUNT(save)) { if(sp->ops == &CamOps || sp->ops == &WindowOps || sp->special == SAVE_RMan || sp->special == SAVE_SNAP || sp->special == SAVE_PS) { if(!ISCAM(id)) id = FOCUSID; } else if(sp->ops == &GeomOps && !ISGEOM(id)) id = GEOMID(uistate.targetgeom); } *namep = drawer_id2name(id); return (id != UNIVERSE && drawer_get_object(id) == NULL) ? NOID : id; } /*****************************************************************************/ static void select_type(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { savechoice = (int)(long)data; } /*****************************************************************************/ static void save_selection(Widget w, XtPointer data, XmFileSelectionBoxCallbackStruct *cbs) { char *fname, *object, *wobject; int id; Pool *p; struct saveops *sp; Dimension width, height; if (!XmStringGetLtoR(cbs->value, XmSTRING_DEFAULT_CHARSET, &fname)) return; if (!fname || *fname == '\0') { return; } wobject = object = XmTextFieldGetString(geomobj); if(fname == NULL || object == NULL || *fname == '\0' || *object == '\0' || savechoice < 0) { goto out; } if((id = suitable_id(savechoice, &object)) == NOID) { XmTextFieldSetString(geomobj, "?"); goto out; } sp = &save[savechoice]; switch(sp->special) { case SAVE_WIO: p = PoolStreamTemp(fname, NULL, (!strcmp(fname,"-"))?stdout:NULL, 1, sp->ops); if(p == NULL) { OOGLError(1, "Can't open output: %s: %s", fname, sperror()); return; } worldio(sp->ops, p, sp->flag, id); PoolClose(p); PoolDelete(p); break; case SAVE_RMan: gv_rib_display(sp->flag, fname); gv_rib_snapshot(id, fname); break; case SAVE_SNAP: gv_snapshot(id, fname, snaptypenames[sp->flag], 0, 0); break; case SAVE_PS: gv_snapshot(id, fname, "ps", 0, 0); break; case SAVE_PANELS: /* Do nothing ... yet :-) */ break; } /* Ugh. Older Motif versions (?) don't remember to cancel their * blink timers if we simply unrealize the shell widget from inside this * callback routine. Even stuffing the XtUnrealizeWidget() in a workproc * doesn't fix it. So remove its contents before unmapping it. * But, then we need to save and restore its size, too, lest it be * zero size when it reappears. Something's broken here, but I can't * guess what. */ XtSetKeyboardFocus(shell, None); XtVaSetValues(filetext, XmNblinkRate, 0, NULL); XtVaGetValues(shell, XmNwidth, &width, XmNheight, &height, NULL); XtUnmanageChild(saveform); ui_showpanel(P_SAVE, 0); XtVaSetValues(shell, XmNwidth, width, XmNheight, height, NULL); uistate.savewhat = NOID; out: if (fname) { XtFree(fname); } if (wobject) { XtFree(wobject); } } /*****************************************************************************/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.5/src/bin/geomview/x11/gvtoolui.c0000644000175000017500000002227712310110177016102 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mg.h" #include "../common/drawer.h" #include "../common/ui.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Tool.mib" #include "X11/StringDefs.h" #include "bitmaps/rotate" #include "bitmaps/translate" #include "bitmaps/scale" #include "bitmaps/fly" #include "bitmaps/zoom" #include "bitmaps/orbit" #include "bitmaps/stop" #include "bitmaps/lookat" #include "bitmaps/center" #include "bitmaps/reset" extern Display *dpy; extern UIState uistate; extern Pixmap geomicon; /* public methods */ /*****************************************************************************/ void ui_load_toolpanel(void); void ui_tool_targetset(char *); void ui_tool_centerset(char *); void ui_tool_center_origin_set(int use_bbox); /* private methods and variables */ /*****************************************************************************/ static void load_tool_bitmaps(mib_Widget *); static void target_set(Widget, XtPointer, XmAnyCallbackStruct *); static void center_set(Widget, XtPointer, XmAnyCallbackStruct *); static void center_origin_set(Widget, XtPointer, XmAnyCallbackStruct *); #if defined(__STDC__) || defined(__ANSI_CPP__) #define BWH(name) (char *)name##_bits, name##_width, name##_height #else #define BWH(name) (char *)name/**/_bits, name/**/_width, name/**/_height #endif static struct toolbutton { char *name; char *bits; int width, height; int istool; XtPointer data; Widget button; Pixmap norm_pix, rev_pix; } toolbuttons[] = { { "RotateButton", BWH(rotate), True, OBJROTATE }, { "TranslateButton", BWH(translate), True, OBJTRANSLATE }, { "ScaleButton", BWH(scale), True, OBJSCALE }, { "ZoomButton", BWH(zoom), True, OBJZOOM }, { "OrbitButton", BWH(orbit), True, OBJORBIT }, { "FlyButton", BWH(fly), True, OBJFLY }, { "StopButton", BWH(stop), False, (XtPointer)ACTION_STOP }, { "LookAtButton", BWH(lookat), False, (XtPointer)ACTION_LOOK }, { "CenterButton", BWH(center), False, (XtPointer)ACTION_CENTER }, { "ResetButton", BWH(reset), False, (XtPointer)ACTION_RESET }, }; static struct toolbutton *last; static Widget TargetText, CenterText, BBoxCenter; /*****************************************************************************/ void ui_load_toolpanel() { Widget toolform, HideButton, MainButton; mib_Widget *toolload; static char Tools[] = "Tools"; /*****************************************************************************/ ui_make_panel_and_form(Tools, Root, False, False, &toolform); /*toolload = mib_load_interface(toolform, "interface/Tool.mib", MI_FROMFILE);*/ toolload = mib_load_interface(toolform, Root, MI_FROMSTRING); XtVaSetValues(toolload->me, XmNresizePolicy, XmRESIZE_NONE, NULL); XtManageChild(toolform); /*****************************************************************************/ HideButton = mib_find_name(toolload, "HideButton")->me; MainButton = mib_find_name(toolload, "MainButton")->me; TargetText = mib_find_name(toolload, "TargetText")->me; CenterText = mib_find_name(toolload, "CenterText")->me; BBoxCenter = mib_find_name(toolload, "BBoxCenterToggle")->me; load_tool_bitmaps(toolload); XtAddCallback(HideButton, XmNactivateCallback, (XtCallbackProc) ui_hide, Tools); XtAddCallback(MainButton, XmNactivateCallback, (XtCallbackProc) ui_show, "Geomview"); XtAddCallback(TargetText, XmNactivateCallback, (XtCallbackProc) target_set, NULL); XtAddCallback(CenterText, XmNactivateCallback, (XtCallbackProc) center_set, NULL); XtAddCallback(BBoxCenter, XmNvalueChangedCallback, (XtCallbackProc) center_origin_set, NULL); } /*****************************************************************************/ void ui_event_mode(char *mode) { struct toolbutton *tb; int i; for(i = 0, tb = toolbuttons; i < COUNT(toolbuttons); i++, tb++) { if(tb->istool && tb->button!=NULL && !strcmp(mode, tb->data)) { XtVaSetValues(last->button, XmNlabelPixmap, last->norm_pix, NULL); XtVaSetValues(tb->button, XmNlabelPixmap, tb->norm_pix, NULL); XtVaSetValues(tb->button, XmNlabelPixmap, tb->rev_pix, NULL); last = tb; } } } /*****************************************************************************/ static void modetool_callback(Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { gv_event_mode( (char *)data ); } /*****************************************************************************/ static void action_callback(Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { int val = (int)(long) data; int id = uistate.targetid; switch (val) { case ACTION_STOP: drawer_stop(NOID); break; case ACTION_LOOK: gv_look(GEOMID(uistate.targetgeom), CAMID(uistate.targetcam)); break; case ACTION_CENTER: drawer_center(id); break; case ACTION_RESET: drawer_center(NOID); break; } ui_action(val); } /*****************************************************************************/ static void load_tool_bitmaps(mib_Widget *toolload) { int depth; Pixel blue, red, white; struct toolbutton *tb; int i; Colormap cm; Screen *s = DefaultScreenOfDisplay(dpy); XtVaGetValues(toolload->me, XtNcolormap, &cm, NULL); blue = ui_RGB(cm, 1, 0.0, 0.0, 1.0); red = ui_RGB(cm, 1, 1.0, 0.0, 0.0); white = ui_RGB(cm, 1, 1.0, 1.0, 1.0); if((red == white || blue == white) && cm == DefaultColormapOfScreen(s)) { white = WhitePixelOfScreen(s); if(red == white) red = BlackPixelOfScreen(s); if(blue == white) blue = BlackPixelOfScreen(s); } /*****************************************************************************/ last = &toolbuttons[0]; for(i = 0, tb = toolbuttons; i < COUNT(toolbuttons); i++, tb++) { Pixel colored = tb->istool ? blue : red; tb->button = mib_find_name(toolload, tb->name)->me; XtVaGetValues(tb->button, XmNdepth, &depth, NULL); tb->norm_pix = XCreatePixmapFromBitmapData(dpy, DefaultRootWindow(dpy), tb->bits, tb->width, tb->height, colored, white, depth); tb->rev_pix = XCreatePixmapFromBitmapData(dpy, DefaultRootWindow(dpy), tb->bits, tb->width, tb->height, white, colored, depth); XtVaSetValues(tb->button, XmNlabelType, XmPIXMAP, XmNlabelPixmap, tb==last ? tb->rev_pix : tb->norm_pix, XmNarmPixmap, tb->rev_pix, NULL); XtAddCallback(tb->button, XmNarmCallback, (XtCallbackProc)(tb->istool ? modetool_callback : action_callback), tb->data); } } /*****************************************************************************/ static void target_set(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { char *str; int id; str = XmTextFieldGetString(w); if ((id = drawer_idbyname(str))) set_ui_target_id(id); ui_select(uistate.targetid); XtFree(str); } /*****************************************************************************/ void ui_tool_targetset(char *target) { char *str; if (TargetText == NULL) return; str = XmTextFieldGetString(TargetText); if (strcmp(target, str)) XmTextFieldSetString(TargetText, target); XtFree(str); } /*****************************************************************************/ static void center_set(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { char *str; int id; str = XmTextFieldGetString(w); if ((id = drawer_idbyname(str))) set_ui_center(id); ui_select(uistate.centerid); XtFree(str); } /*****************************************************************************/ void ui_tool_centerset(char *center) { char *str; if (CenterText == NULL) return; str = XmTextFieldGetString(CenterText); if (strcmp(center,str)) XmTextFieldSetString(CenterText, center); XtFree(str); } /*****************************************************************************/ static void center_origin_set(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { set_ui_center_origin(XmToggleButtonGetState(w)); } /*****************************************************************************/ void ui_tool_center_origin_set(int use_bbox_center) { if (BBoxCenter == NULL) return; XmToggleButtonSetState(BBoxCenter, use_bbox_center != 0, False); } /*****************************************************************************/ geomview-1.9.5/src/bin/geomview/x11/gvui.c0000644000175000017500000007246512310110177015210 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mg.h" #include "../common/drawer.h" #include "../common/ui.h" #include "../common/comm.h" #include "../common/space.h" #include "../common/lights.h" #include "../common/event.h" #include "../common/motion.h" #include "../common/worldio.h" #include "../common/lang.h" /* Geomview Icon */ #include "bitmaps/icon" #include #include #include #include #include "X11/IntrinsicP.h" /* for XtMoveWidget */ #include "mibload.h" #include "gvui.h" static char *x_application_name = "geomview"; /* used to be "gv" */ /******************************* Index defines *******************************/ #define BLACKINDEX 0 #define WHITEINDEX 7 #define FACEINDEX 250 #define EDGEINDEX 251 #define NORMALINDEX 252 #define BBOXINDEX 253 #define BACKINDEX 254 #define LIGHTINDEX 255 /****************************** Table of Panels ******************************/ static struct panel { char *name; char key[2]; int shown; /* Currently shown? Initial value is default. */ void (*show)(); void (*load)(); int position; int x, y; Widget shell; Widget formwantskeys; } panels[] = { { "\0", "", False, NULL, NULL, 0, 0, 0, NULL }, { "geomview", "Pm", True, NULL, ui_load_mainpanel, 0, 0, 0, NULL }, { "Tools", "Pt", True, NULL, ui_load_toolpanel, 0, 0, 0, NULL }, { "Appearance", "Pa", False, NULL, ui_load_appearancepanel, 0, 0, 0, NULL }, { "Cameras", "Pc", False, NULL, ui_load_cameraspanel, 0, 0, 0, NULL }, { "Lighting", "Pl", False, ui_show_lightspanel, ui_load_lightspanel, 0, 0, 0, NULL }, { "Commands", "PC", False, NULL, ui_load_commandspanel, 0, 0, 0, NULL }, { "Materials", "PM", False, NULL, ui_load_materialpanel, 0, 0, 0, NULL }, { "Credits", "PA", False, NULL, ui_load_creditspanel, 0, 0, 0, NULL }, { "Save", ">", False, ui_show_savepanel, ui_load_savepanel, 0, 0, 0, NULL }, { "Files", "Pf", False, ui_show_filespanel, ui_load_filespanel, 0, 0, 0, NULL }, { "Load", "<", False, ui_show_loadpanel, ui_load_loadpanel, 0, 0, 0, NULL }, { "Color", "", False, ui_show_colorpanel, ui_load_colorpanel, 0, 0, 0, NULL }, }; /************************** Global Widget Variables **************************/ Widget TopLevel, MainWindow, MainMenu, MainForm; XtAccelerators KeyAccels; Atom AProtocol; Arg args[20]; int n; XtAppContext App; extern Display *dpy; extern GC mib_gc; extern int real_id(int); Pixmap geomicon; /******************************* Global Variables ****************************/ int YScrnSize, XScrnSize; UIState uistate; int gvbitdepth; Visual *gvvisual; Colormap gvcolormap; int gvpriv=0; /*****************************************************************************/ void ui_select(int id); void ui_find_visual(); /*****************************************************************************/ static void set_x_application_name() { char *name = getenv("GEOMVIEW_X_NAME"); if ((name != NULL) && (strlen(name)>0)) { x_application_name = name; } /* else use default x_application_name set above */ } /*****************************************************************************/ static int panelsready = 0; void load_interface(argc, argv) unsigned int argc; char **argv; { String fallbacks[] = { "gv*fontList: -adobe-helvetica-medium-r-normal--14-*-*-*-p-*-iso8859-1", "*BorderWidth: 0", #ifdef dark_ui "*Foreground: gray20", "*Background: gray70", /* see if we can set shadow colors "*TopShadowColor: #fbfbfbfbfbfb", "*BottomShadowColor: #6b6b6b6b6b6b", */ /* "*Foreground: #000000", "*Background: #848484", */ #endif #ifdef light_ui "*Foreground: #000000000000", "*Background: #afafafafafaf", #endif "*XmToggleButton.selectColor: yellow", "*XmToggleButton.indicatorSize: 16", "*XmToggleButtonGadget.selectColor: yellow", "*XmToggleButtonGadget.indicatorSize: 16", "*fontList: -adobe-helvetica-medium-r-normal--14-*-*-*-p-*-iso8859-1", "gv*Load*fontList: -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1", "gv*Save*fontList: -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1", "Commands*fontList: -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1", "Tools*fontList: -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1", "*XmText*blinkRate: 0", /* Encourage old (???) versions of Motif to interpret our keyboard * shortcuts. It works in some situations, depending on just what * the cursor overlies. */ "*XmForm*accelerators: : GVKey()", "*XmFrame*translations: #override : GVKey()", "Geomview*KeyText*translations: #override : GVKey()", "Geomview*XmList*translations: #override : GVKey()", "Appearance*XmList*translations: #override : GVKey()", "Cameras*XmList*translations: #override : GVKey()", "Lights*XmList*translations: #override : GVKey()", "Credits*XmList*translations: #override : GVKey()", NULL }; static XtActionsRec actions[1] = { { "GVKey", key_action } }; static String keyaccels = { ": GVKey()" }; #if 0 static char *argvblah[] = { "Geomview", /* We turn off blinking text cursors for two reasons: * - Motif grabs the main loop if the cursor sits in a text box * for more than one blink cycle, and our graphics can't move. * - Much worse, SGI Motif under Irix 4 (at least) seems to fail to * remove its blink timer when we XtUnrealizeWidget the panel * containing it. So, moments later, we die of an X error * because of a reference to a bad window. * Disabling blink prevents all this. */ "-xrm", "*XmText*blinkRate: 0", /* Encourage old versions of Motif to interpret our keyboard shortcuts. * It works in some situations, depending on just what the cursor * overlies. */ "-xrm", "*XmForm*accelerators: : GVKey()", "-xrm", "*XmFrame*translations: #override\\n: GVKey()", "-xrm", "Geomview*KeyText*translations: : GVKey()", "-xrm", "Geomview*XmList*translations: ~s ~c ~m ~a :ListBeginSelect()\\n~s ~c ~m ~a :ListEndSelect()\\n: GVKey()", "-xrm", "Appearance*XmList*translations: ~s ~c ~m ~a :ListBeginSelect()\\n~s ~c ~m ~a :ListEndSelect()\\n: GVKey()", "-xrm", "Cameras*XmList*translations: ~s ~c ~m ~a :ListBeginSelect()\\n~s ~c ~m ~a :ListEndSelect()\\n: GVKey()", "-xrm", "Lights*XmList*translations: ~s ~c ~m ~a :ListBeginSelect()\\n~s ~c ~m ~a :ListEndSelect()\\n: GVKey()", "-xrm", "Credits*XmList*translations: ~s ~c ~m ~a :ListBeginSelect()\\n~s ~c ~m ~a :ListEndSelect()\\n: GVKey()", "-xrm", "", }; int argcblah = COUNT(argvblah); #endif /* Code for TopLevel */ /*****************************************************************************/ n = 0; set_x_application_name(); #if 1 TopLevel = XtAppInitialize(&App, x_application_name, NULL, 0, (int *)&argc, argv, fallbacks, args, n); #else if(getenv("GV_NO_X_MAGIC")) { TopLevel = XtAppInitialize(&App, x_application_name, NULL, 0, (int *)&argc, argv, fallbacks, args, n); } else { if(getenv("GVXRM")) argvblah[COUNT(argvblah)-1] = getenv("GVXRM"); TopLevel = XtAppInitialize(&App, x_application_name, NULL, 0, &argcblah /*&argc*/, argvblah /*argv*/, fallbacks, args, n); } #endif #if 0 if(getenv("GVXRM")) argvblah[COUNT(argvblah)-1] = getenv("GVXRM"); TopLevel = XtAppInitialize(&App, "gv", NULL, 0, &argcblah /*&argc*/, argvblah /*argv*/, fallbacks, args, n); #endif XtAppAddActions(App, actions, 1); KeyAccels = XtParseAcceleratorTable(keyaccels); dpy = XtDisplay(TopLevel); YScrnSize = XtScreen(TopLevel)->height; XScrnSize = XtScreen(TopLevel)->width; ui_find_visual(); geomicon = XCreatePixmapFromBitmapData(dpy, DefaultRootWindow(dpy), (char *)oogl_bits, oogl_width, oogl_height, WhitePixel(dpy, DefaultScreen(dpy)), BlackPixel(dpy, DefaultScreen(dpy)), DefaultDepth(dpy, DefaultScreen(dpy))); } /*****************************************************************************/ void ui_highlight(int newid) { int newtype = TYPEOF(newid); DGeom *dg; DView *v; static Color black = {0.0, 0.0, 0.0}; Color c; extern int mg_ctxselect(mgcontext *); if ( newtype == T_GEOM && (dg = (DGeom *) drawer_get_object(newid)) && dg->bboxap ) { c = uistate.pickedbboxcolor; gv_bbox_color( GEOMID(uistate.targetgeom), black.r, black.g, black.b ); gv_bbox_color( newid, c.r, c.g, c.b ); } else if (newtype == T_CAM) { /* pop cam window in case it's obscured */ v = (DView *) drawer_get_object(newid); if (v) { mg_ctxselect(v->mgctx); /* winset happens in here */ /* winpop */ } } } /*****************************************************************************/ void ui_action(int val) { } /*****************************************************************************/ void ui_mousefocus(int index) { uistate.mousefocus = index; if (uistate.targetcam == INDEXOF(FOCUSID)) { ui_select(CAMID(uistate.mousefocus)); } } LDEFINE(ui_cam_focus, LVOID, "(ui-cam-focus [focus-change|mouse-cross])\n" "Set the focus policy for the camera windows. The default is " "\"mouse-cross\": a camera is made the active camera (for interactive " "mouse events) when the mouse cursor crosses the window. Because " "this means it can become " "complicated to activate a specific camera (in the context of multiple " "camera windows) there is also the option to only change the camera " "focus when the window-manager decides to give it the focus for input " "events. So, after specifying \"focus-change\" it depends on the " "focus-change configuration of your window-manager when a camera " "becomes the active camera for mouse-interaction.") { Keyword policy = NO_KEYWORD; LDECLARE(("ui-cam-focus", LBEGIN, LKEYWORD, &policy, LEND)); if (policy != FOCUS_CHANGE_KEYWORD && policy != MOUSE_CROSS_KEYWORD) { OOGLError(1, "Wrong keyword, expected either \"%s\" or \"%s\"\n", keywordname(FOCUS_CHANGE_KEYWORD), keywordname(MOUSE_CROSS_KEYWORD)); return Lnil; } set_ui_wm_focus(policy == FOCUS_CHANGE_KEYWORD); return Lt; } /*****************************************************************************/ void ui_objectchange() { ui_adjustpicklist(-1); ui_adjustpicklist(uistate.targetid); } /*****************************************************************************/ void ui_maybe_refresh(int id) { if ( id==WORLDGEOM || id==GEOMID(uistate.targetgeom) || id==ALLGEOMS || id==TARGETGEOMID) { ui_select(GEOMID(uistate.targetgeom)); } else if( id==ALLCAMS || id==FOCUSID || id==TARGETCAMID || id==CAMID(uistate.targetcam) || id==CAMID(uistate.mousefocus) ) { ui_select(CAMID(uistate.targetcam)); } else { ui_select(NOID); } } /*****************************************************************************/ void ui_select(int id) { DObject *obj; if ((obj = drawer_get_object(uistate.targetid))) { ui_tool_targetset(drawer_id2name(obj->id)); ui_tool_centerset(drawer_id2name(uistate.centerid)); if (ISCAM(id)) ui_target_cameraspanel(id); if (ISGEOM(id)) { ui_target_appearancepanel(id); ui_target_materialpanel(id); } ui_refresh_mainpanel(id); } } /*****************************************************************************/ void ui_windowWillOpen(DView *dv) { ui_create_camera(MainWindow, dv); } /*****************************************************************************/ void ui_windowDidOpen(DView *dv) { } /*****************************************************************************/ void ui_showpanel(int index, int show) { struct panel *pan; if(index >= COUNT(panels) || index < 0) /* protect us from showing */ return; /* non-existent panels */ pan = &panels[index]; if(show < 0) show = !pan->shown; pan->shown = show; if(!panelsready) return; if (pan->shell == NULL) { /* or panels which have not */ if(pan->load == NULL || !show) /* yet been loaded */ return; silence_errors(); (*pan->load)(); resume_errors(); } if(show) { if(pan->position) { XtMoveWidget(pan->shell, pan->x, pan->y); pan->position = 0; } if(pan->show != NULL) /* Call any panel-specific pre-show func */ (*pan->show)(); XtRealizeWidget(pan->shell); XRaiseWindow(dpy, XtWindow(pan->shell)); } else { XtUnrealizeWidget(pan->shell); } } /*****************************************************************************/ LDEFINE(ui_target, LVOID, "(ui-target ID [yes|no])\n\ Set the target of user actions (the selected line of the\n\ target object browser) to ID. The second argument specifies\n\ whether to make ID the current object regardless of its type.\n\ If \"no\", then ID becomes the current object of its type\n\ (geom or camera). The default is \"yes\". This command may\n\ result in a change of motion modes based on target choice.") { int id, newtype; Keyword immediate_kw = YES_KEYWORD; bool immediate; LDECLARE(("ui-target", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &immediate_kw, LEND)); immediate = boolval("ui-target", immediate_kw); newtype = TYPEOF(id); if (id == uistate.targetid ) return Lt; if (drawer_get_object(id) == NULL || (id == TARGETID) || (id == CENTERID) || (id == SELF) || (id == UNIVERSE) || (id == PRIMITIVE)) { return Lt; } if (immediate) { /* ui_highlight must be called before set_ui_target_id */ /* freeze the browser so old target name doesn't flash during highlight. */ ui_highlight(id); set_ui_target_id( id ); ui_adjustpicklist(id); if (ISGEOM(id)) { uistate.targetcam = INDEXOF(FOCUSID); ui_select(real_id(FOCUSID)); } else if(ISCAM(id)) { ui_raise_window( real_id(id) ); } ui_select( id ); } else { /* immediate == NOIMMEDIATE: for cases like deleting geometry * with the command language when current target is a camera. * update targettype but don't change browser. */ switch (newtype) { case T_GEOM: uistate.targetgeom = INDEXOF(id); break; case T_CAM: uistate.targetcam = INDEXOF(id); break; } } return Lt; } LDEFINE(ui_center, LVOID, "(ui-center ID)\n\ Set the center for user interface (i.e. mouse) controlled\n\ motions to object ID.") { int id; LDECLARE(("ui-center", LBEGIN, LID, &id, LEND)); if ( (id == NOID) || (id == CENTERID) ) { id = uistate.centerid; } else { set_ui_center(id); } ui_tool_centerset(drawer_id2name(id)); return Lt; } LDEFINE(ui_center_origin, LVOID, "(ui-center-origin {origin|bbox-center})\n" "Set the origin of the coordinate system of the \"CENTER\" object" "for user interface (i.e. mouse) controlled motions." "The keyword \"origin\" means to use the origin of the coordinate" "system of the currently selected object, while \"bbox-center\" " "means to use the center of the bouding box of the current object. " "The keyword \"bbox-center\" makes no sense if the geometry is " "non-Euclidean. Using either \"bbox-center\" or \"origin\" does " "not make a difference if the center object is not a \"geometry\", " "e.g. if it is a camera. Same holds if the World is the currently " "selected object.") { Keyword origin = NO_KEYWORD; LDECLARE(("ui-center-origin", LBEGIN, LKEYWORD, &origin, LEND)); if (origin != BBOX_CENTER_KEYWORD && origin != ORIGIN_KEYWORD) { OOGLError(1, "Wrong keyword, expected either \"%s\" or \"%s\"\n", keywordname(BBOX_CENTER_KEYWORD), keywordname(ORIGIN_KEYWORD)); return Lnil; } set_ui_center_origin(origin == BBOX_CENTER_KEYWORD); ui_tool_center_origin_set(origin == BBOX_CENTER_KEYWORD); return Lt; } /*****************************************************************************/ void ui_pickcolor(int val) { DView *dv; Color *old = NULL; char *name = NULL; Appearance *ap; DGeom *dg; int index = 0; ap = drawer_get_ap(GEOMID(uistate.targetgeom)); switch (val) { case DRAWER_BACKCOLOR: if ((dv = (DView *)drawer_get_object(real_id(CAMID(uistate.targetcam))))) { ui_config_colorpanel("Background", &(dv->backcolor), BACKINDEX, val, real_id(CAMID(uistate.targetcam))); ui_showpanel(P_COLOR, 1); } return; case DRAWER_DIFFUSE: name = "Faces"; index = FACEINDEX; old = (Color *)(void *)&ap->mat->diffuse; break; case DRAWER_EDGECOLOR: name = "Edges"; index = EDGEINDEX; old = &ap->mat->edgecolor; break; case DRAWER_NORMALCOLOR: name = "Normals"; index = NORMALINDEX; old = &ap->mat->normalcolor; break; case DRAWER_BBOXCOLOR: name = "BBoxes"; index = BBOXINDEX; dg = (DGeom*)drawer_get_object(GEOMID(uistate.targetgeom)); old = &dg->bboxap->mat->edgecolor; break; default: break; } ui_config_colorpanel(name, old, index, val, GEOMID(uistate.targetgeom)); ui_showpanel(P_COLOR, 1); } /*****************************************************************************/ int ui_name2panel(char *name) { extern int strcasecmp(const char *, const char *); extern int strncasecmp(const char *, const char *, size_t); int i; if (strcasecmp(name, "main") == 0) return P_MAIN; for (i=P_MAX; --i > 0 && strcasecmp(name, panels[i].name) != 0;); if (i == 0) for(i=P_MAX; --i > 0 && strncasecmp(name, panels[i].name, 4) != 0; ) ; return i; } /*****************************************************************************/ void ui_add_mode(char *name, PFI proc, int type) { ui_install_mode(name, proc, type); } /*****************************************************************************/ void ui_remove_mode(char *name) { int current; current = ui_mode_index(name); ui_uninstall_mode(name); if (uistate.mode_current == current) gv_event_mode(uistate.modenames[0]); } /*****************************************************************************/ extern int gv_debug; static int oldstderr = -1; void silence_errors() { if(!gv_debug) { FILE *dummy; if(oldstderr < 0) oldstderr = dup(fileno(stderr)); dummy = freopen("/dev/null", "w", stderr); (void)dummy; } } void resume_errors() { if(oldstderr >= 0) { FILE *dummy; dummy = freopen("/dev/null", "w", stderr); (void)dummy; dup2(oldstderr, fileno(stderr)); close(oldstderr); oldstderr = -1; } } /*****************************************************************************/ void ui_init() { silence_errors(); ui_load_mainpanel(); ui_load_appearancepanel(); ui_load_cameraspanel(); ui_load_lightspanel(); ui_load_materialpanel(); ui_load_loadpanel(); resume_errors(); ui_init_snaphelp(); cui_init(); clight_init(); gv_event_mode(OBJROTATE); uistate.cursor_on = 1; } /*****************************************************************************/ Widget ui_make_panel_and_form(char *title, char *rootstr, Boolean wantkeys, Boolean resizable, Widget *formp) { Arg args[20]; int n; Widget shell; int panel = ui_name2panel(title); n = 0; XtSetArg(args[n], XmNtitle, title); n++; XtSetArg(args[n], XmNdeleteResponse, XmDO_NOTHING);n++; XtSetArg(args[n], XmNkeyboardFocusPolicy, XmPOINTER); n++; XtSetArg(args[n], XmNallowShellResize, resizable); n++; if(gvvisual->class & 1) { /* If PseudoColor or other dynamic visual */ XtSetArg(args[n], XmNvisual, gvvisual); n++; XtSetArg(args[n], XmNdepth, gvbitdepth); n++; XtSetArg(args[n], XmNcolormap, gvcolormap); n++; } if (panels[panel].position) { XtSetArg(args[n], XmNx, panels[panel].x); n++; XtSetArg(args[n], XmNy, panels[panel].y); n++; } XtSetArg(args[n], XmNiconPixmap, geomicon); n++; XtSetArg(args[n], XmNmwmDecorations, MWM_DECOR_ALL); n++; XtSetArg(args[n], XmNmwmFunctions, MWM_FUNC_ALL); n++; set_x_application_name(); shell = XtAppCreateShell(title, x_application_name, topLevelShellWidgetClass, dpy, args, n); /* Close when requested by WM */ AProtocol = XmInternAtom(dpy, "WM_DELETE_WINDOW", False); XmAddWMProtocolCallback(shell, AProtocol, (XtCallbackProc) ui_hide, title); if(formp != NULL) { n = 0; XtSetArg(args[n], XmNrubberPositioning, True); n++; XtSetArg(args[n], XmNresizable, resizable); n++; if(wantkeys) { XtSetArg(args[n], XmNaccelerators, KeyAccels); n++; } *formp = XmCreateForm(shell, title, args, n); if(wantkeys) panels[panel].formwantskeys = *formp; XtManageChild(*formp); } panels[panel].shell = shell; return shell; } /*****************************************************************************/ void ui_hide(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { int panel = ui_name2panel((char *)data); ui_showpanel(panel, 0); } void ui_show(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { int panel = ui_name2panel((char *)data); ui_showpanel(panel, 1); } /*****************************************************************************/ LDEFINE(ui_panel, LVOID, "(ui-panel PANELNAME {on|off} [ WINDOW ] )\n\ Do or don't display the given user-interface panel.\n\ Case is ignored in panel names. Current PANELNAMEs are:\n\ geomview main panel\n\ tools motion controls\n\ appearance appearance controls\n\ cameras camera controls\n\ lighting lighting controls\n\ obscure obscure controls\n\ materials material properties controls\n\ command command entry box\n\ credits geomview credits\n\ By default, the \"geomview\" and \"tools\" panels appear when\n\ geomview starts. If the optional Window is supplied, a\n\ \"position\" clause (e.g. (ui-panel obscure on { position xmin\n\ xmax ymin ymax }) sets the panel's default position. (Only\n\ xmin and ymin values are actually used.) A present but empty\n\ Window, e.g. \"(ui-panel obscure on {})\" causes interactive\n\ positioning.") { char *panelname; int index; Keyword on = NO_KEYWORD; struct panel *p; WindowStruct *ws=NULL; WnPosition wp; LDECLARE(("ui-panel", LBEGIN, LSTRING, &panelname, LKEYWORD, &on, LOPTIONAL, LWINDOW, &ws, LEND)); if((index = ui_name2panel(panelname)) == 0) { if (!strcmp(panelname, "Obscure")) return Lnil; fprintf(stderr, "ui-panel: expected name of a panel, got \"%s\"\n", panelname); return Lnil; } if (ws) { p = &(panels[index]); if (WnGet(ws->wn, WN_PREFPOS, &wp) > 0) { p->x = wp.xmin; p->y = wp.ymin; } if (p->shown && p->shell != NULL) { XtMoveWidget(p->shell, p->x, p->y); p->position = 0; } else { p->position = 1; /* position window when it shows up later */ } } ui_showpanel( index, boolval("ui-panel", on)); return Lt; } /*****************************************************************************/ /* Dummy -- we don't bother to freeze the UI. How do we do that in Motif? */ LDEFINE(ui_freeze, LVOID, "(ui-freeze [on|off])\n\ Toggle updating user interface panels. Off by default." ) { Keyword kw = NOT_A_KEYWORD; LDECLARE(("ui-freeze", LBEGIN, LOPTIONAL, LKEYWORD, &kw, LEND)); return Lnil; } /*****************************************************************************/ int ui_panelshown(int index) { return panels[index].shown; } /*****************************************************************************/ void ui_final_init() { int i; /* It's only safe to load tool & color panels now, * since they rely on mgx11 for colors, which is ready only * after ui_init(). */ silence_errors(); ui_load_colorpanel(); ui_load_toolpanel(); resume_errors(); panelsready = 1; ui_select(CAMID(uistate.targetcam)); ui_select(GEOMID(uistate.targetgeom)); lights_changed_check(); for(i = 1; i < P_MAX; i++) if (panels[i].shown) ui_showpanel(i, 1); ui_objectchange(); } /*****************************************************************************/ void ui_update() { int i; emodule *em; if(uistate.emod_check) { for(i=0, em=VVEC(uistate.emod,emodule); ilink == NULL || PoolInputFile(em->link) == NULL)) { emodule_reap(em); } else { i++, em++; } } uistate.emod_check = 0; } if(uistate.emod_changed) { ui_adjustemodulelist(uistate.emod_changed); uistate.emod_changed = 0; } } /*****************************************************************************/ LDEFINE(ui_emodule_define, LVOID, "(emodule-define NAME SHELL-COMMAND ...)\n\ Define an external module called NAME, which then appears in the\n\ external-module browser. The SHELL-COMMAND string\n\ is a UNIX shell command which invokes the module.\n\ See emodule-run for discussion of external modules.") { emodule *em; char *title, *cmd; LDECLARE(("emodule-define", LBEGIN, LSTRING, &title, LSTRING, &cmd, LEND)); em = ui_emodule_install(0, strdup(title), (PFI)emodule_run); em->text = strdup(cmd); ui_adjustemodulelist(1); return Lt; } /*****************************************************************************/ static void ename_fix(char *c, const char *e, int n) { char num[80]; int ni=0, ei=0; if (e[0] != '[') goto copy; ei = 1; num[0] = '\0'; while (einame,80); ename_fix(c2,((emodule *)e2)->name,80); return strcmp(c1,c2); } LDEFINE(emodule_sort, LVOID, "(emodule-sort)\n\ Sorts the modules in the application browser alphabetically.") { emodule *em; size_t nel, size; LDECLARE(("emodule-sort", LBEGIN, LEND)); em = VVEC(uistate.emod, emodule); nel = VVCOUNT(uistate.emod); size = sizeof(emodule); qsort(em, nel, size, emod_compare); ui_adjustemodulelist(1); return Lt; } /*****************************************************************************/ LDEFINE(ui_emodule_start, LVOID, "(emodule-start NAME)\n\ Starts the external module NAME, defined by emodule-define.\n\ Equivalent to clicking on the corresponding module-browser entry.") { emodule *em; int i; char *name; LDECLARE(("emodule-start", LBEGIN, LSTRING, &name, LEND)); i = ui_emodule_index(name, &em); if(i < 0) return Lnil; (*em->func)(em); return Lt; } /*****************************************************************************/ void ui_build_browser(Widget a_list, int count, char *names[]) { XmString str; int i; XmListDeleteAllItems(a_list); for (i = 0; i < count; i++) { str = XmStringCreateSimple(names[i]); XmListAddItemUnselected(a_list, str, 0); XmStringFree(str); } } /*****************************************************************************/ void ui_set_ftext(Widget w, float val) { char buf[80], *str; sprintf(buf,"%g",val); str = XmTextFieldGetString(w); if (strcmp(str, buf)) XmTextFieldSetString(w, buf); XtFree(str); } /*****************************************************************************/ void ui_set_itext(Widget w, int val) { char buf[80], *str; sprintf(buf,"%d",val); str = XmTextFieldGetString(w); if (strcmp(str, buf)) XmTextFieldSetString(w, buf); XtFree(str); } /*****************************************************************************/ /* * Local Variables: *** * c-basic-offset: 2 *** * End: */ geomview-1.9.5/src/bin/geomview/x11/gvui.h0000644000175000017500000001265312310110177015206 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ extern XtAppContext App; extern int YScrnSize; extern int gvbitdepth; extern Visual *gvvisual; extern Colormap gvcolormap; extern int gvpriv; extern XtAccelerators KeyAccels; extern Time last_event_time; void load_interface(unsigned int, char **); void main_loop(); void panel_input(Widget, XtPointer, XEvent *, Boolean *); void key_action(Widget, XEvent *, String *, Cardinal *); void cam_input(Widget, XtPointer, XmDrawingAreaCallbackStruct *); void cam_resize(Widget, XtPointer, XmDrawingAreaCallbackStruct *); void cam_mouse(Widget, XtPointer , XPointerMovedEvent *, Boolean *); void cam_mousecross(Widget, XtPointer , XEnterWindowEvent *, Boolean *); void cam_focus(Widget w, XtPointer data, XFocusChangeEvent *event, Boolean *cont); void cam_expose(Widget w, XtPointer id, XEvent *ev, Boolean *junk); void ui_build_browser(Widget, int, char *[]); void ui_set_ftext(Widget, float); void ui_set_itext(Widget, int); void ui_showpanel(int, int); void ui_final_init(); void ui_select(int); void ui_update(); void silence_errors(); void resume_errors(); void ui_init_snaphelp(); void ui_hide(Widget, XtPointer panelname, XmAnyCallbackStruct *cbs); void ui_show(Widget, XtPointer panelname, XmAnyCallbackStruct *cbs); Widget ui_make_panel_and_form(char *title, char *rootstr, Boolean catchkeys, Boolean resizable, Widget *form); /* Panel Defines */ /*****************************************************************************/ #define P_NULL 0 #define P_MAIN 1 #define P_TOOL 2 #define P_APPEARANCE 3 #define P_CAMERA 4 #define P_LIGHTS 5 #define P_COMMANDS 6 #define P_MATERIAL 7 #define P_CREDITS 8 #define P_SAVE 9 #define P_FILEBROWSER 10 #define P_INPUT 11 #define P_COLOR 12 #define P_MAX 13 /* Camera Methods */ /*****************************************************************************/ Widget ui_create_camera(Widget, DView *); void cam_mgdevice(); Pixel ui_RGB(Colormap cmap, int permanent, float r, float g, float b); void update_x11_depth(DView *dv, mib_Widget *DepthMenu, Widget DitherToggle, int *depth_state, int *dither_state); void ui_raise_window( int camid ); /* Main Panel Methods */ /*****************************************************************************/ void ui_load_mainpanel(); void ui_refresh_mainpanel(); void ui_adjustpicklist(int); void ui_adjustemodulelist(int); /* Tool Panel Methods */ /*****************************************************************************/ void ui_load_toolpanel(); void ui_select_tool(int); void ui_tool_targetset(char *); void ui_tool_centerset(char *); void ui_tool_center_origin_set(int use_bbox_center); /* Appearance Panel Methods */ /*****************************************************************************/ void ui_load_appearancepanel(); void ui_show_appearancepanel(); void ui_target_appearancepanel(int); /* Material Panel Methods */ /*****************************************************************************/ void ui_load_materialpanel(); void ui_show_materialpanel(); void ui_target_materialpanel(int); /* Credits Panel Methods */ /*****************************************************************************/ void ui_load_creditspanel(); void ui_show_creditspanel(); /* Save Panel Methods */ /*****************************************************************************/ void ui_load_savepanel(); void ui_show_savepanel(); /* Files Panel Methods */ /*****************************************************************************/ void ui_load_filespanel(); void ui_show_filespanel(); /* Load Panel Methods */ /*****************************************************************************/ void ui_load_loadpanel(); void ui_show_loadpanel(); /* Command Panel Methods */ /*****************************************************************************/ void ui_load_commandspanel(); /* Lights Panel Methods */ /*****************************************************************************/ void ui_load_lightspanel(); void ui_show_lightspanel(); /* Cameras Panel Methods */ /*****************************************************************************/ void ui_load_cameraspanel(); void ui_target_cameraspanel(int); /* Color Panel Methods */ /*****************************************************************************/ void ui_load_colorpanel(); void ui_show_colorpanel(); void ui_config_colorpanel(char *, Color *, int, int, int); /*****************************************************************************/ geomview-1.9.5/src/bin/geomview/x11/bitmaps/0000755000175000017500000000000012310165604015600 500000000000000geomview-1.9.5/src/bin/geomview/x11/bitmaps/Makefile.in0000644000175000017500000003321112310165552017567 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/geomview/x11/bitmaps DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = center down_arrow fly icon lookat orbit reset \ rotate scale stop translate up_arrow zoom all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomview/x11/bitmaps/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomview/x11/bitmaps/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/bin/geomview/x11/bitmaps/Makefile.am0000644000175000017500000000016412310110177017550 00000000000000EXTRA_DIST = center down_arrow fly icon lookat orbit reset \ rotate scale stop translate up_arrow zoom geomview-1.9.5/src/bin/geomview/x11/bitmaps/center0000644000175000017500000000157212310110177016723 00000000000000#define center_width 32 #define center_height 32 static unsigned char center_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.5/src/bin/geomview/x11/bitmaps/down_arrow0000644000175000017500000000045612310110177017624 00000000000000#define down_arrow_width 16 #define down_arrow_height 16 static unsigned char down_arrow_bits[] = { 0xa0, 0x0a, 0x40, 0x0d, 0xa0, 0x0a, 0x40, 0x0d, 0xa0, 0x0a, 0x40, 0x0d, 0xa0, 0x0a, 0x40, 0x0d, 0xa0, 0x0a, 0x54, 0x55, 0xa8, 0x6a, 0x50, 0x35, 0xa0, 0x1a, 0x40, 0x0d, 0x80, 0x06, 0x00, 0x03}; geomview-1.9.5/src/bin/geomview/x11/bitmaps/fly0000644000175000017500000000156112310110177016233 00000000000000#define fly_width 32 #define fly_height 32 static unsigned char fly_bits[] = { 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x7f, 0x02, 0x00, 0x00, 0x40, 0x02, 0x80, 0x00, 0x40, 0x02, 0xc0, 0x01, 0x40, 0x02, 0xe0, 0x03, 0x40, 0x02, 0xf0, 0x07, 0x40, 0x02, 0xf8, 0x0f, 0x40, 0x02, 0xc0, 0x01, 0x40, 0x02, 0xc0, 0x01, 0x40, 0x02, 0xc0, 0x01, 0x40, 0x02, 0xc0, 0x01, 0x40, 0x02, 0xc0, 0x01, 0x40, 0x02, 0xc0, 0x01, 0x40, 0x02, 0xe0, 0x03, 0x40, 0x02, 0xe0, 0x03, 0x40, 0x02, 0xe0, 0x03, 0x40, 0x02, 0xe0, 0x03, 0x40, 0x02, 0xf0, 0x07, 0x40, 0x02, 0xf0, 0x07, 0x40, 0x02, 0xf0, 0x07, 0x40, 0x02, 0xf8, 0x0f, 0x40, 0x02, 0xfc, 0x1f, 0x40, 0x02, 0xfe, 0x3f, 0x40, 0x02, 0xff, 0x7f, 0x40, 0x82, 0xff, 0xff, 0x40, 0xc2, 0xff, 0xff, 0x41, 0xe2, 0xff, 0xff, 0x47, 0xfa, 0xff, 0xff, 0x5f, 0x02, 0x00, 0x00, 0x40, 0xfe, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.5/src/bin/geomview/x11/bitmaps/icon0000644000175000017500000000346712310110177016400 00000000000000#define oogl_width 48 #define oogl_height 47 static unsigned char oogl_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xeb, 0xfe, 0x00, 0x00, 0x00, 0xc0, 0xbd, 0xff, 0x01, 0x00, 0x00, 0xa0, 0xef, 0xae, 0x03, 0x00, 0x00, 0x78, 0xbd, 0xf7, 0x07, 0x00, 0x00, 0xee, 0xeb, 0xbf, 0x1e, 0x00, 0x80, 0x5b, 0xff, 0xed, 0x3b, 0x00, 0xc0, 0xfe, 0xed, 0xbb, 0x6f, 0x00, 0xc0, 0x6b, 0x77, 0xef, 0xfa, 0x00, 0x60, 0xbf, 0xff, 0xfd, 0xdf, 0x03, 0xe0, 0xfa, 0xbf, 0x57, 0x75, 0x03, 0xa0, 0xff, 0xff, 0xfe, 0xdf, 0x03, 0xf0, 0xff, 0x7f, 0xdb, 0xf6, 0x06, 0xf0, 0xff, 0xff, 0xef, 0xbf, 0x03, 0xf0, 0xff, 0xff, 0xba, 0xea, 0x06, 0xf0, 0xff, 0xff, 0xff, 0xbf, 0x07, 0xf0, 0xff, 0xff, 0xad, 0xed, 0x05, 0xf0, 0xff, 0xff, 0xf7, 0x77, 0x07, 0xf0, 0xff, 0xff, 0xbf, 0xfe, 0x07, 0xf0, 0xff, 0xff, 0xeb, 0xab, 0x06, 0xf0, 0xff, 0xff, 0x7f, 0xff, 0x07, 0xf0, 0xff, 0xff, 0xef, 0x6d, 0x05, 0xf0, 0xff, 0xff, 0xbf, 0xfb, 0x07, 0xf0, 0xff, 0xff, 0x7f, 0xaf, 0x05, 0xf0, 0xff, 0xff, 0xdf, 0xfd, 0x06, 0xf0, 0xff, 0xff, 0x7f, 0xb7, 0x07, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x02, 0xf0, 0xff, 0xff, 0xff, 0x0a, 0x02, 0xf0, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x5f, 0x00, 0x01, 0xf0, 0xff, 0xff, 0x0f, 0x92, 0x00, 0xe0, 0xff, 0xff, 0x07, 0x80, 0x00, 0x80, 0xff, 0xff, 0x43, 0x44, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x51, 0x00, 0x00, 0xf8, 0xff, 0x20, 0x08, 0x00, 0x00, 0xf8, 0x7f, 0x08, 0x04, 0x00, 0x00, 0xc0, 0x3f, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x1f, 0x42, 0x00, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.5/src/bin/geomview/x11/bitmaps/lookat0000644000175000017500000000157212310110177016734 00000000000000#define lookat_width 32 #define lookat_height 32 static unsigned char lookat_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x8c, 0x18, 0x00, 0x00, 0x82, 0x20, 0x00, 0x00, 0xe2, 0x23, 0x00, 0x06, 0x81, 0x40, 0x30, 0x26, 0x89, 0x48, 0x32, 0x26, 0x89, 0x48, 0x32, 0xfe, 0xff, 0xff, 0x3f, 0x26, 0x89, 0x48, 0x32, 0x26, 0x89, 0x48, 0x32, 0x06, 0x81, 0x40, 0x30, 0x00, 0xe2, 0x23, 0x00, 0x00, 0x82, 0x20, 0x00, 0x00, 0x8c, 0x18, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.5/src/bin/geomview/x11/bitmaps/orbit0000644000175000017500000000156712310110177016566 00000000000000#define orbit_width 32 #define orbit_height 32 static unsigned char orbit_bits[] = { 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x7f, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x1e, 0x00, 0x40, 0x02, 0x3f, 0x00, 0x40, 0x02, 0x3f, 0x00, 0x40, 0x02, 0x3f, 0x00, 0x40, 0x02, 0x3f, 0x00, 0x40, 0x02, 0x1e, 0x00, 0x40, 0x02, 0x00, 0x00, 0x58, 0x02, 0x20, 0x00, 0x5e, 0x02, 0x62, 0x80, 0x5f, 0x02, 0xe3, 0xc0, 0x5f, 0x82, 0xe3, 0x01, 0x5f, 0xc2, 0xe3, 0x83, 0x5f, 0xe2, 0xa3, 0xc1, 0x53, 0xc2, 0x82, 0xe3, 0x41, 0xe2, 0x00, 0xf7, 0x40, 0x72, 0x00, 0x7f, 0x40, 0x7a, 0x00, 0x3e, 0x40, 0x3a, 0x80, 0x1f, 0x40, 0xfa, 0xff, 0x0f, 0x40, 0xfa, 0xff, 0x07, 0x40, 0xfa, 0xff, 0x01, 0x40, 0xc2, 0x7f, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0xfe, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.5/src/bin/geomview/x11/bitmaps/reset0000644000175000017500000000156712310110177016571 00000000000000#define reset_width 32 #define reset_height 32 static unsigned char reset_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x01, 0x60, 0x0c, 0x80, 0x01, 0x30, 0x18, 0x80, 0x01, 0x18, 0x30, 0x91, 0x89, 0x0c, 0xe0, 0xb1, 0x8d, 0x07, 0xc0, 0xe1, 0x87, 0x03, 0xe0, 0xc1, 0x83, 0x07, 0xf0, 0x81, 0x81, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xf0, 0x0f, 0x0c, 0x60, 0xf0, 0x0f, 0x06, 0xc0, 0x30, 0x0c, 0x03, 0xfe, 0x31, 0x8c, 0x7f, 0xfe, 0x31, 0x8c, 0x7f, 0xc0, 0x30, 0x0c, 0x03, 0x60, 0xf0, 0x0f, 0x06, 0x30, 0xf0, 0x0f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x81, 0x81, 0x0f, 0xe0, 0xc1, 0x83, 0x07, 0xc0, 0xe1, 0x87, 0x03, 0xe0, 0xb1, 0x8d, 0x07, 0x30, 0x91, 0x89, 0x0c, 0x18, 0x80, 0x01, 0x18, 0x0c, 0x80, 0x01, 0x30, 0x06, 0x80, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.5/src/bin/geomview/x11/bitmaps/rotate0000644000175000017500000000157212310110177016741 00000000000000#define rotate_width 32 #define rotate_height 32 static unsigned char rotate_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x80, 0x07, 0x02, 0x00, 0xc0, 0x03, 0x06, 0x00, 0xe0, 0x01, 0x1e, 0x00, 0xf8, 0x00, 0xfe, 0x00, 0x7e, 0x00, 0xfe, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0x1f, 0x00, 0xe0, 0xff, 0x07, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.5/src/bin/geomview/x11/bitmaps/scale0000644000175000017500000000156712310110177016536 00000000000000#define scale_width 32 #define scale_height 32 static unsigned char scale_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x80, 0xff, 0x7f, 0x00, 0xa0, 0x01, 0x70, 0x00, 0x90, 0x01, 0x68, 0x00, 0x80, 0x01, 0x60, 0x00, 0x88, 0x01, 0x62, 0x00, 0x84, 0x01, 0x61, 0x00, 0x80, 0x01, 0x60, 0x00, 0x82, 0x41, 0x60, 0x00, 0x81, 0x21, 0x60, 0x00, 0x80, 0x01, 0x60, 0x80, 0x80, 0x09, 0x60, 0x40, 0x80, 0x05, 0x60, 0x00, 0x80, 0x01, 0x60, 0x20, 0x80, 0xff, 0x7f, 0x10, 0x80, 0xff, 0x7f, 0x00, 0x40, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0xfc, 0x1f, 0x00, 0x08, 0xfc, 0x1f, 0x00, 0x02, 0x0c, 0x18, 0x00, 0x01, 0x0c, 0x18, 0x40, 0x00, 0x0c, 0x18, 0x20, 0x00, 0x0c, 0x18, 0x08, 0x00, 0x0c, 0x18, 0x04, 0x00, 0x0c, 0x18, 0x01, 0x00, 0x0c, 0x98, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.5/src/bin/geomview/x11/bitmaps/stop0000644000175000017500000000156412310110177016431 00000000000000#define stop_width 32 #define stop_height 32 static unsigned char stop_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x01, 0xc0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0x0f, 0xf8, 0xff, 0xff, 0x1f, 0xfc, 0xff, 0xff, 0x3f, 0xfe, 0xff, 0xff, 0x7f, 0x06, 0x03, 0xc3, 0x60, 0x72, 0xce, 0x99, 0x4c, 0x72, 0xce, 0x99, 0x4c, 0xe6, 0xcf, 0x99, 0x4c, 0x8e, 0xcf, 0x99, 0x4c, 0x3e, 0xcf, 0x99, 0x60, 0x7e, 0xce, 0x99, 0x7c, 0x72, 0xce, 0x99, 0x7c, 0x72, 0xce, 0x99, 0x7c, 0x06, 0xcf, 0xc3, 0x7c, 0xfe, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0x1f, 0xf0, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0xff, 0x07, 0xc0, 0xff, 0xff, 0x03, 0x80, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.5/src/bin/geomview/x11/bitmaps/translate0000644000175000017500000000160312310110177017433 00000000000000#define translate_width 32 #define translate_height 32 static unsigned char translate_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0xe8, 0x02, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x06, 0xe0, 0x00, 0x00, 0x1c, 0xe0, 0xff, 0xff, 0x3f, 0xe0, 0xff, 0xff, 0x7f, 0xe0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.5/src/bin/geomview/x11/bitmaps/up_arrow0000644000175000017500000000045012310110177017273 00000000000000#define up_arrow_width 16 #define up_arrow_height 16 static unsigned char up_arrow_bits[] = { 0x00, 0x01, 0x80, 0x02, 0x40, 0x05, 0xa0, 0x0a, 0x50, 0x15, 0xa8, 0x2a, 0x5c, 0x7d, 0xa0, 0x0a, 0x40, 0x0d, 0xa0, 0x0a, 0x40, 0x0d, 0xa0, 0x0a, 0x40, 0x0d, 0xa0, 0x0a, 0x40, 0x0d, 0xe0, 0x0f}; geomview-1.9.5/src/bin/geomview/x11/bitmaps/zoom0000644000175000017500000000156412310110177016430 00000000000000#define zoom_width 32 #define zoom_height 32 static unsigned char zoom_bits[] = { 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x7f, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0xc0, 0x41, 0x02, 0x00, 0xf0, 0x41, 0x02, 0x00, 0x7c, 0x40, 0x02, 0x00, 0x1f, 0x40, 0x02, 0xc0, 0x07, 0x40, 0x02, 0xf0, 0x01, 0x40, 0x02, 0xfc, 0x00, 0x40, 0x02, 0x9f, 0x01, 0x40, 0xc2, 0x07, 0x03, 0x40, 0xe2, 0x01, 0x03, 0x40, 0xe2, 0x00, 0x03, 0x40, 0xe2, 0x00, 0x03, 0x40, 0xe2, 0x01, 0x03, 0x40, 0xc2, 0x07, 0x03, 0x40, 0x02, 0x9f, 0x01, 0x40, 0x02, 0xfc, 0x00, 0x40, 0x02, 0xf0, 0x01, 0x40, 0x02, 0xc0, 0x07, 0x40, 0x02, 0x00, 0x1f, 0x40, 0x02, 0x00, 0x7c, 0x40, 0x02, 0x00, 0xf0, 0x41, 0x02, 0x00, 0xc0, 0x41, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0xfe, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.5/src/bin/geomview/x11/interface/0000755000175000017500000000000012310165604016101 500000000000000geomview-1.9.5/src/bin/geomview/x11/interface/Makefile.in0000644000175000017500000003337112310165552020077 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/geomview/x11/interface DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = Appearance.mib Commands.mib Lights.mib Material.mib \ Cameras.mib Credits.mib LoadPaths.mib Save.mib \ Color.mib Input.mib MainPanel.mib Tool.mib all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomview/x11/interface/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomview/x11/interface/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/bin/geomview/x11/interface/Makefile.am0000644000175000017500000000033612310110177020052 00000000000000EXTRA_DIST = Appearance.mib Commands.mib Lights.mib Material.mib \ Cameras.mib Credits.mib LoadPaths.mib Save.mib \ Color.mib Input.mib MainPanel.mib Tool.mib geomview-1.9.5/src/bin/geomview/x11/interface/Appearance.mib0000644000175000017500000002563112310110177020553 00000000000000char Root[] = "\ TotalWidgets: 31\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 307\n\ Xmheight: 367\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"TexQToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 188\n\ XmbottomOffset: 179\n\ XmleftOffset: 181\n\ XmrightOffset: 126\n\ Private-\n\ label: \"[aq] Tx Quality\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"VectToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 180\n\ XmbottomOffset: 188\n\ XmleftOffset: 55\n\ XmrightOffset: 252\n\ Private-\n\ label: \"[aV] Vects\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OverrideToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 8\n\ XmbottomOffset: 359\n\ XmleftOffset: 108\n\ XmrightOffset: 199\n\ Private-\n\ label: \"[ao] Override\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FacingNormalsToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 178\n\ XmbottomOffset: 189\n\ XmleftOffset: 9\n\ XmrightOffset: 298\n\ Private-\n\ label: \"[av] Facing Normals\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ConcaveToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 201\n\ XmbottomOffset: 166\n\ XmleftOffset: 9\n\ XmrightOffset: 298\n\ Private-\n\ label: \"[aC] Concave\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ShadeLineToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 222\n\ XmbottomOffset: 145\n\ XmleftOffset: 9\n\ XmrightOffset: 298\n\ Private-\n\ label: \"[al] Shade Lines\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"TexToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 164\n\ XmbottomOffset: 203\n\ XmleftOffset: 180\n\ XmrightOffset: 127\n\ Private-\n\ label: \"[at] Texture\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 23\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 40\n\ XmbottomOffset: 306\n\ XmleftOffset: 11\n\ XmrightOffset: 256\n\ Private-\n\ label: \"Color:\"\n\ EndWidget.\n\ Ref: 10\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 47\n\ Xmheight: 22\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 37\n\ XmbottomOffset: 308\n\ XmleftOffset: 70\n\ XmrightOffset: 190\n\ Private-\n\ label: \"Show:\"\n\ EndWidget.\n\ Ref: 11\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HideButton\"\n\ Xmwidth: 43\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 4\n\ XmbottomOffset: 333\n\ XmleftOffset: 260\n\ XmrightOffset: 4\n\ Private-\n\ label: \"Hide\"\n\ EndWidget.\n\ Ref: 12\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DiceInput\"\n\ Xmwidth: 52\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 326\n\ XmbottomOffset: 11\n\ XmleftOffset: 7\n\ XmrightOffset: 248\n\ Private-\n\ EndWidget.\n\ Ref: 13\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"NormInput\"\n\ Xmwidth: 52\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 289\n\ XmbottomOffset: 48\n\ XmleftOffset: 8\n\ XmrightOffset: 247\n\ Private-\n\ EndWidget.\n\ Ref: 14\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"LineInput\"\n\ Xmwidth: 52\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 253\n\ XmbottomOffset: 84\n\ XmleftOffset: 8\n\ XmrightOffset: 247\n\ Private-\n\ EndWidget.\n\ Ref: 15\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 125\n\ Xmheight: 30\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 325\n\ XmbottomOffset: 12\n\ XmleftOffset: 55\n\ XmrightOffset: 127\n\ Private-\n\ label: \"[ad] Patch Dicing\"\n\ EndWidget.\n\ Ref: 16\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 125\n\ Xmheight: 30\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 288\n\ XmbottomOffset: 49\n\ XmleftOffset: 61\n\ XmrightOffset: 121\n\ Private-\n\ label: \"[ah] Normal Length\"\n\ EndWidget.\n\ Ref: 17\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 125\n\ Xmheight: 32\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 250\n\ XmbottomOffset: 85\n\ XmleftOffset: 50\n\ XmrightOffset: 132\n\ Private-\n\ label: \"[aw] Line Width\"\n\ EndWidget.\n\ Ref: 18\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"RevButton\"\n\ Xmwidth: 78\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 6\n\ XmbottomOffset: 331\n\ XmleftOffset: 6\n\ XmrightOffset: 223\n\ Private-\n\ label: \"[ax] Revert\"\n\ EndWidget.\n\ Ref: 19\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"BBoxColor\"\n\ Xmwidth: 43\n\ Xmheight: 22\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 135\n\ XmbottomOffset: 210\n\ XmleftOffset: 7\n\ XmrightOffset: 257\n\ Private-\n\ label: \"[Cb]\"\n\ EndWidget.\n\ Ref: 20\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"NormalColor\"\n\ Xmwidth: 43\n\ Xmheight: 22\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 112\n\ XmbottomOffset: 233\n\ XmleftOffset: 7\n\ XmrightOffset: 257\n\ Private-\n\ label: \"[Cn]\"\n\ EndWidget.\n\ Ref: 21\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"EdgeColor\"\n\ Xmwidth: 43\n\ Xmheight: 22\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 88\n\ XmbottomOffset: 257\n\ XmleftOffset: 7\n\ XmrightOffset: 257\n\ Private-\n\ label: \"[Ce]\"\n\ EndWidget.\n\ Ref: 22\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FaceColor\"\n\ Xmwidth: 43\n\ Xmheight: 22\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 63\n\ XmbottomOffset: 282\n\ XmleftOffset: 7\n\ XmrightOffset: 257\n\ Private-\n\ label: \"[Cf]\"\n\ EndWidget.\n\ Ref: 23\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"BBoxToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 157\n\ XmbottomOffset: 210\n\ XmleftOffset: 55\n\ XmrightOffset: 252\n\ Private-\n\ label: \"[ab] BBoxes\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 24\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"NormalToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 132\n\ XmbottomOffset: 236\n\ XmleftOffset: 55\n\ XmrightOffset: 252\n\ Private-\n\ label: \"[an] Normals\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 25\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"EdgeToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 88\n\ XmbottomOffset: 257\n\ XmleftOffset: 55\n\ XmrightOffset: 252\n\ Private-\n\ label: \"[ae] Edges\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 26\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FaceToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 63\n\ XmbottomOffset: 282\n\ XmleftOffset: 55\n\ XmrightOffset: 252\n\ Private-\n\ label: \"[af] Faces\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 27\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"NormList\"\n\ Xmwidth: 116\n\ Xmheight: 79\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 275\n\ XmbottomOffset: 13\n\ XmleftOffset: 188\n\ XmrightOffset: 3\n\ Private-\n\ EndWidget.\n\ Ref: 28\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 18\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 0\n\ XmrightAttachment: 5\n\ XmtopOffset: 249\n\ XmbottomOffset: 100\n\ XmleftOffset: 198\n\ XmrightOffset: 19\n\ Private-\n\ label: \"Normalize\"\n\ EndWidget.\n\ Ref: 29\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ShadeList\"\n\ Xmwidth: 113\n\ Xmheight: 89\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 68\n\ XmbottomOffset: 210\n\ XmleftOffset: 191\n\ XmrightOffset: 3\n\ Private-\n\ EndWidget.\n\ Ref: 30\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 92\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 5\n\ XmtopOffset: 41\n\ XmbottomOffset: 296\n\ XmleftOffset: 201\n\ XmrightOffset: 14\n\ Private-\n\ label: \"Shading\"\n\ EndWidget.\n\ Ref: 31\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 310\n\ Xmheight: 367\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: -3\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.5/src/bin/geomview/x11/interface/Commands.mib0000644000175000017500000000455312310110177020255 00000000000000char Root[] = "\ TotalWidgets: 7\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 434\n\ Xmheight: 182\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HideButton\"\n\ Xmwidth: 49\n\ Xmheight: 24\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 120\n\ XmbottomOffset: 38\n\ XmleftOffset: 380\n\ XmrightOffset: 5\n\ Private-\n\ label: \"Done\"\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DownButton\"\n\ Xmwidth: 25\n\ Xmheight: 24\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 120\n\ XmbottomOffset: 38\n\ XmleftOffset: 34\n\ XmrightOffset: 375\n\ Private-\n\ label: \"\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"UpButton\"\n\ Xmwidth: 25\n\ Xmheight: 24\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 120\n\ XmbottomOffset: 38\n\ XmleftOffset: 6\n\ XmrightOffset: 403\n\ Private-\n\ label: \"\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CommandScroll\"\n\ Xmwidth: 423\n\ Xmheight: 112\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 6\n\ XmbottomOffset: 64\n\ XmleftOffset: 6\n\ XmrightOffset: 5\n\ Private-\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CommandText\"\n\ Xmwidth: 422\n\ Xmheight: 30\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 147\n\ XmbottomOffset: 5\n\ XmleftOffset: 6\n\ XmrightOffset: 6\n\ Private-\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 434\n\ Xmheight: 182\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.5/src/bin/geomview/x11/interface/Lights.mib0000644000175000017500000000744112310110177017745 00000000000000char Root[] = "\ TotalWidgets: 11\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9 10 11\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 285\n\ Xmheight: 132\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DeleteButton\"\n\ Xmwidth: 49\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 93\n\ XmbottomOffset: 9\n\ XmleftOffset: 227\n\ XmrightOffset: 9\n\ Private-\n\ label: \"Delete\"\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"AddButton\"\n\ Xmwidth: 49\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 93\n\ XmbottomOffset: 9\n\ XmleftOffset: 175\n\ XmrightOffset: 61\n\ Private-\n\ label: \"Add\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ColorButton\"\n\ Xmwidth: 61\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 93\n\ XmbottomOffset: 9\n\ XmleftOffset: 111\n\ XmrightOffset: 114\n\ Private-\n\ label: \"Color\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"IntensityScale\"\n\ Xmwidth: 166\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 59\n\ XmbottomOffset: 53\n\ XmleftOffset: 111\n\ XmrightOffset: 8\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 55\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 34\n\ XmbottomOffset: 68\n\ XmleftOffset: 110\n\ XmrightOffset: 120\n\ Private-\n\ label: \"Intensity\"\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HideButton\"\n\ Xmwidth: 44\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 5\n\ XmbottomOffset: 97\n\ XmleftOffset: 236\n\ XmrightOffset: 5\n\ Private-\n\ label: \"Done\"\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"LightsToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 7\n\ XmbottomOffset: 125\n\ XmleftOffset: 109\n\ XmrightOffset: 176\n\ Private-\n\ label: \"Show Lights [ls]\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 71\n\ Xmheight: 18\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 10\n\ XmbottomOffset: 104\n\ XmleftOffset: 11\n\ XmrightOffset: 203\n\ Private-\n\ label: \"Lights\"\n\ EndWidget.\n\ Ref: 10\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"LightsList\"\n\ Xmwidth: 76\n\ Xmheight: 92\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 30\n\ XmbottomOffset: 10\n\ XmleftOffset: 8\n\ XmrightOffset: 201\n\ Private-\n\ EndWidget.\n\ Ref: 11\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 284\n\ Xmheight: 132\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.5/src/bin/geomview/x11/interface/Material.mib0000644000175000017500000001626612310110177020256 00000000000000char Root[] = "\ TotalWidgets: 21\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 259\n\ Xmheight: 319\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 21\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"TranslucencyList\"\n\ Xmwidth: 200\n\ Xmheight: 53\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 258\n\ XmbottomOffset: 6\n\ XmleftOffset: 8\n\ XmrightOffset: 40\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"TranslucentToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 238\n\ XmbottomOffset: 66\n\ XmleftOffset: 8\n\ XmrightOffset: 241\n\ Private-\n\ label: \"[aT] Translucent\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"SpecularText\"\n\ Xmwidth: 70\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 170\n\ XmbottomOffset: 129\n\ XmleftOffset: 172\n\ XmrightOffset: 7\n\ Private-\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ShininessText\"\n\ Xmwidth: 70\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 132\n\ XmbottomOffset: 167\n\ XmleftOffset: 172\n\ XmrightOffset: 7\n\ Private-\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"AmbientText\"\n\ Xmwidth: 70\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 95\n\ XmbottomOffset: 204\n\ XmleftOffset: 172\n\ XmrightOffset: 7\n\ Private-\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DiffuseText\"\n\ Xmwidth: 70\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 56\n\ XmbottomOffset: 243\n\ XmleftOffset: 172\n\ XmrightOffset: 7\n\ Private-\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"SpecularScale\"\n\ Xmwidth: 162\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 175\n\ XmbottomOffset: 134\n\ XmleftOffset: 6\n\ XmrightOffset: 81\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ShininessScale\"\n\ Xmwidth: 162\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 137\n\ XmbottomOffset: 172\n\ XmleftOffset: 6\n\ XmrightOffset: 81\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"AmbientScale\"\n\ Xmwidth: 162\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 99\n\ XmbottomOffset: 210\n\ XmleftOffset: 6\n\ XmrightOffset: 81\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 10\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DiffuseScale\"\n\ Xmwidth: 162\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 60\n\ XmbottomOffset: 249\n\ XmleftOffset: 6\n\ XmrightOffset: 81\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 11\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 139\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 151\n\ XmbottomOffset: 148\n\ XmleftOffset: 4\n\ XmrightOffset: 106\n\ Private-\n\ label: \"Specular Reflectance\"\n\ EndWidget.\n\ Ref: 12\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 67\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 114\n\ XmbottomOffset: 185\n\ XmleftOffset: 4\n\ XmrightOffset: 178\n\ Private-\n\ label: \"Shininess\"\n\ EndWidget.\n\ Ref: 13\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 136\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 75\n\ XmbottomOffset: 224\n\ XmleftOffset: 4\n\ XmrightOffset: 109\n\ Private-\n\ label: \"Ambient Reflectance\"\n\ EndWidget.\n\ Ref: 14\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 129\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 37\n\ XmbottomOffset: 262\n\ XmleftOffset: 4\n\ XmrightOffset: 116\n\ Private-\n\ label: \"Diffuse Reflectance\"\n\ EndWidget.\n\ Ref: 15\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HideButton\"\n\ Xmwidth: 43\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 6\n\ XmbottomOffset: 294\n\ XmleftOffset: 201\n\ XmrightOffset: 6\n\ Private-\n\ label: \"Done\"\n\ EndWidget.\n\ Ref: 16\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 22\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 9\n\ XmbottomOffset: 298\n\ XmleftOffset: 78\n\ XmrightOffset: 81\n\ Private-\n\ label: \"Material\"\n\ EndWidget.\n\ Ref: 17\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"AlphaText\"\n\ Xmwidth: 70\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 208\n\ XmbottomOffset: 91\n\ XmleftOffset: 172\n\ XmrightOffset: 7\n\ Private-\n\ EndWidget.\n\ Ref: 18\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"AlphaScale\"\n\ Xmwidth: 162\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 213\n\ XmbottomOffset: 96\n\ XmleftOffset: 6\n\ XmrightOffset: 81\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 19\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 67\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 189\n\ XmbottomOffset: 110\n\ XmleftOffset: 3\n\ XmrightOffset: 179\n\ Private-\n\ label: \"Alpha\"\n\ EndWidget.\n\ Ref: 20\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 249\n\ Xmheight: 269\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.5/src/bin/geomview/x11/interface/Cameras.mib0000644000175000017500000002155312310110177020066 00000000000000char Root[] = "\ TotalWidgets: 25\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 194\n\ Xmheight: 559\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Singlebuffer\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 107\n\ XmbottomOffset: 452\n\ XmleftOffset: 5\n\ XmrightOffset: 189\n\ Private-\n\ label: \"[vs] Single-Buffering\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DitherToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 151\n\ XmbottomOffset: 412\n\ XmleftOffset: 5\n\ XmrightOffset: 189\n\ Private-\n\ label: \"[vD] Turn On Dithering\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Menu\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DepthMenu\"\n\ Xmwidth: 90\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 69\n\ XmbottomOffset: 463\n\ XmleftOffset: 7\n\ XmrightOffset: 20\n\ Private-\n\ numitems: 3\n\ item: \"[0vh] None\"\n\ item: \"[1vh] Depth Sort\"\n\ item: \"[2vh] Z-Buffer\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HideButton\"\n\ Xmwidth: 38\n\ Xmheight: 28\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 7\n\ XmbottomOffset: 527\n\ XmleftOffset: 143\n\ XmrightOffset: 6\n\ Private-\n\ label: \"Done\"\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DrawSphereToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 196\n\ XmbottomOffset: 367\n\ XmleftOffset: 5\n\ XmrightOffset: 189\n\ Private-\n\ label: \"[ai] Draw Unit Sphere\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 18\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 469\n\ XmbottomOffset: 75\n\ XmleftOffset: 51\n\ XmrightOffset: 53\n\ Private-\n\ label: \"Space Model\"\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"SpaceModelList\"\n\ Xmwidth: 154\n\ Xmheight: 58\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 489\n\ XmbottomOffset: 12\n\ XmleftOffset: 20\n\ XmrightOffset: 20\n\ Private-\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"LCText\"\n\ Xmwidth: 60\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 431\n\ XmbottomOffset: 98\n\ XmleftOffset: 120\n\ XmrightOffset: 14\n\ Private-\n\ EndWidget.\n\ Ref: 10\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FLText\"\n\ Xmwidth: 60\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 399\n\ XmbottomOffset: 130\n\ XmleftOffset: 120\n\ XmrightOffset: 14\n\ Private-\n\ EndWidget.\n\ Ref: 11\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FOVText\"\n\ Xmwidth: 60\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 366\n\ XmbottomOffset: 163\n\ XmleftOffset: 120\n\ XmrightOffset: 14\n\ Private-\n\ EndWidget.\n\ Ref: 12\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FCText\"\n\ Xmwidth: 60\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 332\n\ XmbottomOffset: 197\n\ XmleftOffset: 120\n\ XmrightOffset: 14\n\ Private-\n\ EndWidget.\n\ Ref: 13\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"NCText\"\n\ Xmwidth: 60\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 299\n\ XmbottomOffset: 230\n\ XmleftOffset: 120\n\ XmrightOffset: 14\n\ Private-\n\ EndWidget.\n\ Ref: 14\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"LCLabel\"\n\ Xmwidth: 118\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 5\n\ XmtopOffset: 432\n\ XmbottomOffset: 101\n\ XmleftOffset: 3\n\ XmrightOffset: 77\n\ Private-\n\ label: \"Lines Closer [vc]\"\n\ alignment: 2\n\ EndWidget.\n\ Ref: 15\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 108\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 5\n\ XmtopOffset: 397\n\ XmbottomOffset: 132\n\ XmleftOffset: 9\n\ XmrightOffset: 77\n\ Private-\n\ label: \"Focal Length [vl]\"\n\ alignment: 2\n\ EndWidget.\n\ Ref: 16\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 5\n\ XmtopOffset: 364\n\ XmbottomOffset: 165\n\ XmleftOffset: 43\n\ XmrightOffset: 77\n\ Private-\n\ label: \"FOV [vv]\"\n\ alignment: 2\n\ EndWidget.\n\ Ref: 17\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 5\n\ XmtopOffset: 333\n\ XmbottomOffset: 200\n\ XmleftOffset: 35\n\ XmrightOffset: 77\n\ Private-\n\ label: \"Far clip [vf]\"\n\ alignment: 2\n\ EndWidget.\n\ Ref: 18\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 87\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 5\n\ XmtopOffset: 297\n\ XmbottomOffset: 232\n\ XmleftOffset: 30\n\ XmrightOffset: 77\n\ Private-\n\ label: \"Near clip [vn]\"\n\ alignment: 2\n\ EndWidget.\n\ Ref: 19\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ProjectList\"\n\ Xmwidth: 156\n\ Xmheight: 42\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 245\n\ XmbottomOffset: 272\n\ XmleftOffset: 21\n\ XmrightOffset: 17\n\ Private-\n\ EndWidget.\n\ Ref: 20\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 18\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 221\n\ XmbottomOffset: 320\n\ XmleftOffset: 51\n\ XmrightOffset: 53\n\ Private-\n\ label: \"Projection\"\n\ EndWidget.\n\ Ref: 21\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"BackColorButton\"\n\ Xmwidth: 180\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 40\n\ XmbottomOffset: 492\n\ XmleftOffset: 5\n\ XmrightOffset: 9\n\ Private-\n\ label: \"Background Color [CB]\"\n\ EndWidget.\n\ Ref: 22\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"SoftShadeButton\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 129\n\ XmbottomOffset: 430\n\ XmleftOffset: 5\n\ XmrightOffset: 189\n\ Private-\n\ label: \"[v~] Software Shading\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 23\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DrawCamsButton\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 174\n\ XmbottomOffset: 387\n\ XmleftOffset: 5\n\ XmrightOffset: 189\n\ Private-\n\ label: \"[vd] Draw Other Cameras\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 24\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CurrentLabel\"\n\ Xmwidth: 139\n\ Xmheight: 25\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 8\n\ XmbottomOffset: 524\n\ XmleftOffset: 23\n\ XmrightOffset: 32\n\ Private-\n\ label: \"Current\"\n\ EndWidget.\n\ Ref: 25\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 194\n\ Xmheight: 559\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.5/src/bin/geomview/x11/interface/Credits.mib0000644000175000017500000000330412310110177020102 00000000000000char Root[] = "\ TotalWidgets: 5\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 532\n\ Xmheight: 640\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CreditsList\"\n\ Xmwidth: 480\n\ Xmheight: 480\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 40\n\ XmbottomOffset: 5\n\ XmleftOffset: 6\n\ XmrightOffset: 6\n\ Private-\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HideButton\"\n\ Xmwidth: 43\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 5\n\ XmbottomOffset: 196\n\ XmleftOffset: 201\n\ XmrightOffset: 5\n\ Private-\n\ label: \"Done\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 22\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 9\n\ XmbottomOffset: 200\n\ XmleftOffset: 78\n\ XmrightOffset: 81\n\ Private-\n\ label: \"Credits\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 360\n\ Xmheight: 260\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.5/src/bin/geomview/x11/interface/LoadPaths.mib0000644000175000017500000000254312310110177020370 00000000000000char Root[] = "\ TotalWidgets: 4\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 248\n\ Xmheight: 94\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 107\n\ Xmheight: 15\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 6\n\ XmbottomOffset: 75\n\ XmleftOffset: 7\n\ XmrightOffset: 134\n\ Private-\n\ label: \"Path List\"\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"PathList\"\n\ Xmwidth: 237\n\ Xmheight: 65\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 23\n\ XmbottomOffset: 8\n\ XmleftOffset: 6\n\ XmrightOffset: 5\n\ Private-\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 248\n\ Xmheight: 94\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.5/src/bin/geomview/x11/interface/Save.mib0000644000175000017500000000426012310110177017405 00000000000000char Root[] = "\ TotalWidgets: 5\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 249\n\ Xmheight: 85\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Object\"\n\ Xmwidth: 140\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 44\n\ XmbottomOffset: 11\n\ XmleftOffset: 69\n\ XmrightOffset: 40\n\ Private-\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 41\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 43\n\ XmbottomOffset: 12\n\ XmleftOffset: 26\n\ XmrightOffset: 182\n\ Private-\n\ label: \"For:\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Menu\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ObjectMenu\"\n\ Xmwidth: 90\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 4\n\ XmbottomOffset: 37\n\ XmleftOffset: 20\n\ XmrightOffset: 20\n\ Private-\n\ numitems: 14\n\ item: \"Commands\"\n\ item: \"Geometry Alone\"\n\ item: \"Geometry [in world]\"\n\ item: \"Geometry [in universe]\"\n\ item: \"RMan [->tiff]\"\n\ item: \"RMan [->frame]\"\n\ item: \"PPM GLX off-screen snapshot\"\n\ item: \"PPM Mesa off-screen snapshot\"\n\ item: \"SGI Screen snapshot\"\n\ item: \"PPM Screen snapshot\"\n\ item: \"PPM software snapshot\"\n\ item: \"PostScript snapshot\"\n\ item: \"Camera\"\n\ item: \"Transform [to world]\"\n\ item: \"Transform [to universe]\"\n\ item: \"Window\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 249\n\ Xmheight: 85\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.5/src/bin/geomview/x11/interface/Color.mib0000644000175000017500000001260412310110177017566 00000000000000char Root[] = "\ TotalWidgets: 16\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 204\n\ Xmheight: 175\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ColorModel\"\n\ Xmwidth: 40\n\ Xmheight: 29\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 6\n\ XmbottomOffset: 140\n\ XmleftOffset: 86\n\ XmrightOffset: 78\n\ Private-\n\ label: \"RGB\"\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 45\n\ Xmheight: 24\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 141\n\ XmbottomOffset: 10\n\ XmleftOffset: 6\n\ XmrightOffset: 153\n\ Private-\n\ label: \"HSV\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 43\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 108\n\ XmbottomOffset: 37\n\ XmleftOffset: 5\n\ XmrightOffset: 156\n\ Private-\n\ label: \"RGB\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HSVText\"\n\ Xmwidth: 150\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 140\n\ XmbottomOffset: 6\n\ XmleftOffset: 52\n\ XmrightOffset: 6\n\ Private-\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"BLabel\"\n\ Xmwidth: 19\n\ Xmheight: 23\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 82\n\ XmbottomOffset: 70\n\ XmleftOffset: 4\n\ XmrightOffset: 181\n\ Private-\n\ label: \"B\"\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"GLabel\"\n\ Xmwidth: 19\n\ Xmheight: 23\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 60\n\ XmbottomOffset: 92\n\ XmleftOffset: 4\n\ XmrightOffset: 181\n\ Private-\n\ label: \"G\"\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"RLabel\"\n\ Xmwidth: 19\n\ Xmheight: 23\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 38\n\ XmbottomOffset: 114\n\ XmleftOffset: 4\n\ XmrightOffset: 181\n\ Private-\n\ label: \"R\"\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"RGBText\"\n\ Xmwidth: 151\n\ Xmheight: 31\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 106\n\ XmbottomOffset: 38\n\ XmleftOffset: 51\n\ XmrightOffset: 6\n\ Private-\n\ EndWidget.\n\ Ref: 10\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CancelButton\"\n\ Xmwidth: 56\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 5\n\ XmbottomOffset: 140\n\ XmleftOffset: 5\n\ XmrightOffset: 143\n\ Private-\n\ label: \"Cancel\"\n\ EndWidget.\n\ Ref: 11\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DoneButton\"\n\ Xmwidth: 52\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 6\n\ XmbottomOffset: 140\n\ XmleftOffset: 151\n\ XmrightOffset: 6\n\ Private-\n\ label: \"Done\"\n\ EndWidget.\n\ Ref: 12\n\ Widget: \"DrawingArea\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ColorTest\"\n\ Xmwidth: 62\n\ Xmheight: 64\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 38\n\ XmbottomOffset: 73\n\ XmleftOffset: 139\n\ XmrightOffset: 6\n\ Private-\n\ EndWidget.\n\ Ref: 13\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"BScale\"\n\ Xmwidth: 110\n\ Xmheight: 19\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 82\n\ XmbottomOffset: 74\n\ XmleftOffset: 25\n\ XmrightOffset: 69\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 14\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"GScale\"\n\ Xmwidth: 110\n\ Xmheight: 19\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 60\n\ XmbottomOffset: 96\n\ XmleftOffset: 25\n\ XmrightOffset: 69\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 15\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"RScale\"\n\ Xmwidth: 110\n\ Xmheight: 19\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 38\n\ XmbottomOffset: 118\n\ XmleftOffset: 25\n\ XmrightOffset: 69\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 16\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 209\n\ Xmheight: 174\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 1\n\ XmbottomOffset: 1\n\ XmleftOffset: 1\n\ XmrightOffset: 1\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.5/src/bin/geomview/x11/interface/Input.mib0000644000175000017500000000331212310110177017603 00000000000000char Root[] = "\ TotalWidgets: 5\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 535\n\ Xmheight: 85\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OK\"\n\ Xmwidth: 44\n\ Xmheight: 27\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 5\n\ XmbottomOffset: 53\n\ XmleftOffset: 115\n\ XmrightOffset: 376\n\ Private-\n\ label: \"OK\"\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Cancel\"\n\ Xmwidth: 47\n\ Xmheight: 27\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 5\n\ XmbottomOffset: 52\n\ XmleftOffset: 166\n\ XmrightOffset: 322\n\ Private-\n\ label: \"Done\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FileBrowser\"\n\ Xmwidth: 100\n\ Xmheight: 27\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 5\n\ XmbottomOffset: 53\n\ XmleftOffset: 5\n\ XmrightOffset: 430\n\ Private-\n\ label: \"File Browser\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FileName\"\n\ Xmwidth: 520\n\ Xmheight: 27\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 38\n\ XmbottomOffset: 15\n\ XmleftOffset: 6\n\ XmrightOffset: 9\n\ Private-\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.5/src/bin/geomview/x11/interface/MainPanel.mib0000644000175000017500000000734312310110177020360 00000000000000char Root[] = "\ TotalWidgets: 11\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9 10 11\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 381\n\ Xmheight: 234\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"KeyText\"\n\ Xmwidth: 76\n\ Xmheight: 36\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 11\n\ XmbottomOffset: 187\n\ XmleftOffset: 9\n\ XmrightOffset: 296\n\ Private-\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 16\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 57\n\ XmbottomOffset: 161\n\ XmleftOffset: 45\n\ XmrightOffset: 246\n\ Private-\n\ label: \"Targets\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"EtchedInFrame\"\n\ Xmwidth: 170\n\ Xmheight: 24\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 5\n\ XmtopOffset: 53\n\ XmbottomOffset: 157\n\ XmleftOffset: 9\n\ XmrightOffset: 188\n\ Private-\n\ shadowtype: 2\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HideButton\"\n\ Xmwidth: 43\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 5\n\ XmbottomOffset: 199\n\ XmleftOffset: 333\n\ XmrightOffset: 5\n\ Private-\n\ label: \"Hide\"\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 114\n\ Xmheight: 16\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 57\n\ XmbottomOffset: 161\n\ XmleftOffset: 211\n\ XmrightOffset: 8\n\ Private-\n\ label: \"External Modules\"\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"EtchedInFrame\"\n\ Xmwidth: 176\n\ Xmheight: 24\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 1\n\ XmtopOffset: 53\n\ XmbottomOffset: 157\n\ XmleftOffset: 196\n\ XmrightOffset: 9\n\ Private-\n\ shadowtype: 2\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"EmoduleList\"\n\ Xmwidth: 176\n\ Xmheight: 143\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 5\n\ XmrightAttachment: 1\n\ XmtopOffset: 83\n\ XmbottomOffset: 8\n\ XmleftOffset: 191\n\ XmrightOffset: 9\n\ Private-\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ObjectList\"\n\ Xmwidth: 171\n\ Xmheight: 143\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 5\n\ XmtopOffset: 83\n\ XmbottomOffset: 8\n\ XmleftOffset: 8\n\ XmrightOffset: 189\n\ Private-\n\ EndWidget.\n\ Ref: 10\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"GVTitle\"\n\ Xmwidth: 88\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 9\n\ XmbottomOffset: 195\n\ XmleftOffset: 117\n\ XmrightOffset: 176\n\ Private-\n\ label: \"Geomview X\"\n\ EndWidget.\n\ Ref: 11\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 381\n\ Xmheight: 234\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.5/src/bin/geomview/x11/interface/Tool.mib0000644000175000017500000002400312310110177017421 00000000000000char Root[] = "\ TotalWidgets: 29\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 105\n\ Xmheight: 500\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 0\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ \n\ Ref: 2\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ResetButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 430\n\ XmbottomOffset: 30\n\ XmleftOffset: 55\n\ XmrightOffset: 10\n\ Private-\n\ label: \"Reset\"\n\ EndWidget.\n\ \n\ Ref: 3\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CenterButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 430\n\ XmbottomOffset: 30\n\ XmleftOffset: 10\n\ XmrightOffset: 55\n\ Private-\n\ label: \"Center\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"LookAtButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 370\n\ XmbottomOffset: 90\n\ XmleftOffset: 55\n\ XmrightOffset: 10\n\ Private-\n\ label: \"LookAt\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"StopButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 370\n\ XmbottomOffset: 90\n\ XmleftOffset: 10\n\ XmrightOffset: 55\n\ Private-\n\ label: \"Stop\"\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OrbitButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 310\n\ XmbottomOffset: 150\n\ XmleftOffset: 55\n\ XmrightOffset: 10\n\ Private-\n\ label: \"Orbit\"\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ZoomButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 310\n\ XmbottomOffset: 150\n\ XmleftOffset: 10\n\ XmrightOffset: 55\n\ Private-\n\ label: \"Zoom\"\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FlyButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 250\n\ XmbottomOffset: 210\n\ XmleftOffset: 55\n\ XmrightOffset: 10\n\ Private-\n\ label: \"Fly\"\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ScaleButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 250\n\ XmbottomOffset: 210\n\ XmleftOffset: 10\n\ XmrightOffset: 55\n\ Private-\n\ label: \"Scale\"\n\ EndWidget.\n\ Ref: 10\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"TranslateButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 190\n\ XmbottomOffset: 270\n\ XmleftOffset: 55\n\ XmrightOffset: 10\n\ Private-\n\ label: \"Translate\"\n\ EndWidget.\n\ \n\ Ref: 11\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"RotateButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 190\n\ XmbottomOffset: 270\n\ XmleftOffset: 10\n\ XmrightOffset: 55\n\ Private-\n\ label: \"Rotate\"\n\ EndWidget.\n\ \n\ Ref: 12\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 45\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 470\n\ XmbottomOffset: 10\n\ XmleftOffset: 55\n\ XmrightOffset: 5\n\ Private-\n\ label: \"[W]reset\"\n\ EndWidget.\n\ \n\ Ref: 13\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 51\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 470\n\ XmbottomOffset: 10\n\ XmleftOffset: 3\n\ XmrightOffset: 51\n\ Private-\n\ label: \"[w]center\"\n\ EndWidget.\n\ \n\ Ref: 14\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 410\n\ XmbottomOffset: 70\n\ XmleftOffset: 55\n\ XmrightOffset: 10\n\ Private-\n\ label: \"[L]ook\"\n\ EndWidget.\n\ Ref: 15\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 410\n\ XmbottomOffset: 70\n\ XmleftOffset: 10\n\ XmrightOffset: 55\n\ Private-\n\ label: \"[H]alt\"\n\ EndWidget.\n\ Ref: 16\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 350\n\ XmbottomOffset: 130\n\ XmleftOffset: 55\n\ XmrightOffset: 10\n\ Private-\n\ label: \"[o]rbit\"\n\ EndWidget.\n\ Ref: 17\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 350\n\ XmbottomOffset: 130\n\ XmleftOffset: 10\n\ XmrightOffset: 55\n\ Private-\n\ label: \"[z]oom\"\n\ EndWidget.\n\ Ref: 18\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 290\n\ XmbottomOffset: 190\n\ XmleftOffset: 55\n\ XmrightOffset: 10\n\ Private-\n\ label: \"[f]ly\"\n\ EndWidget.\n\ Ref: 19\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 290\n\ XmbottomOffset: 190\n\ XmleftOffset: 10\n\ XmrightOffset: 55\n\ Private-\n\ label: \"[s]cale\"\n\ EndWidget.\n\ Ref: 20\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 230\n\ XmbottomOffset: 250\n\ XmleftOffset: 55\n\ XmrightOffset: 5\n\ Private-\n\ label: \"[t]rans\"\n\ EndWidget.\n\ \n\ Ref: 21\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 230\n\ XmbottomOffset: 250\n\ XmleftOffset: 5\n\ XmrightOffset: 55\n\ Private-\n\ label: \"[r]otate\"\n\ EndWidget.\n\ \n\ Ref: 29\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"BBoxCenterToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 150\n\ XmbottomOffset: 330\n\ XmleftOffset: 3\n\ XmrightOffset: 102\n\ Private-\n\ label: \"[B]Box Center\"\n\ indicatorSize: 0\n\ EndWidget.\n\ \n\ Ref: 22\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 85\n\ Xmheight: 15\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 100\n\ XmbottomOffset: 385\n\ XmleftOffset: 10\n\ XmrightOffset: 10\n\ Private-\n\ label: \"Center\"\n\ EndWidget.\n\ \n\ Ref: 23\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CenterText\"\n\ Xmwidth: 95\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 120\n\ XmbottomOffset: 350\n\ XmleftOffset: 5\n\ XmrightOffset: 5\n\ Private-\n\ EndWidget.\n\ \n\ Ref: 24\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 85\n\ Xmheight: 15\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 45\n\ XmbottomOffset: 440\n\ XmleftOffset: 10\n\ XmrightOffset: 10\n\ Private-\n\ label: \"Target\"\n\ EndWidget.\n\ \n\ Ref: 25\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"TargetText\"\n\ Xmwidth: 95\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 65\n\ XmbottomOffset: 405\n\ XmleftOffset: 5\n\ XmrightOffset: 5\n\ Private-\n\ EndWidget.\n\ \n\ Ref: 26\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"MainButton\"\n\ Xmwidth: 40\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 5\n\ XmbottomOffset: 465\n\ XmleftOffset: 5\n\ XmrightOffset: 60\n\ Private-\n\ label: \"Main\"\n\ EndWidget.\n\ \n\ Ref: 27\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HideButton\"\n\ Xmwidth: 40\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 5\n\ XmbottomOffset: 465\n\ XmleftOffset: 60\n\ XmrightOffset: 5\n\ Private-\n\ label: \"Done\"\n\ EndWidget.\n\ Ref: 28\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 105\n\ Xmheight: 500\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.5/src/bin/togeomview/0000755000175000017500000000000012310165604014073 500000000000000geomview-1.9.5/src/bin/togeomview/Makefile.in0000644000175000017500000005744112310165552016075 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = togeomview$(EXEEXT) subdir = src/bin/togeomview DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am_togeomview_OBJECTS = togeomview.$(OBJEXT) togeomview_OBJECTS = $(am_togeomview_OBJECTS) togeomview_LDADD = $(LDADD) am__DEPENDENCIES_1 = togeomview_DEPENDENCIES = $(am__DEPENDENCIES_1) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(togeomview_SOURCES) DIST_SOURCES = $(togeomview_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) LDADD = ${SOCKETLIBS} man_MANS = togeomview.1gv togeomview_SOURCES = togeomview.c EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/togeomview/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/togeomview/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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 \ || test -f $$p1 \ ; 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(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: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list togeomview$(EXEEXT): $(togeomview_OBJECTS) $(togeomview_DEPENDENCIES) $(EXTRA_togeomview_DEPENDENCIES) @rm -f togeomview$(EXEEXT) $(AM_V_CCLD)$(LINK) $(togeomview_OBJECTS) $(togeomview_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/togeomview.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-man 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-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ 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 mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 # 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: geomview-1.9.5/src/bin/togeomview/Makefile.am0000644000175000017500000000025112310110177016040 00000000000000INCLUDES = $(default_includes) LDADD = ${SOCKETLIBS} man_MANS = togeomview.1gv bin_PROGRAMS = togeomview togeomview_SOURCES = togeomview.c EXTRA_DIST = $(man_MANS) geomview-1.9.5/src/bin/togeomview/togeomview.c0000644000175000017500000002731012310110177016342 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include #ifdef AIX # define _BSD 1 /* Get FNDELAY from fcntl.h */ #endif #include #include #include #if HAVE_ERRNO_H # include #elif HAVE_SYS_ERRNO_H # include #else extern int errno; #endif #if HAVE_INET_SOCKETS || HAVE_INET6_SOCKETS #include #include #include #endif #ifndef NeXT #include #endif #ifndef O_NONBLOCK # define O_NONBLOCK O_NDELAY #endif #ifndef FNDELAY # define FNDELAY O_NDELAY #endif #ifndef FNONBLK # define FNONBLK FNDELAY #endif enum streamtype { nopipe = -1, namedpipe = 0, unixsocket, inetsocket, inet6socket }; static void usage(const char *prog); #define DFLT_PORT 29*31*37 /* 33263, so what */ #define DFLT_PORT_STR "33263" #if HAVE_INET_SOCKETS static void init_inetaddr(struct sockaddr_in *name, const char *hostname, int port); #endif #if HAVE_INET6_SOCKETS static void init_inet6addr(struct sockaddr_in6 *name, const char *hostname, int port); #endif static void interrupt(int sig) { fprintf(stderr, "Couldn't start geomview\n"); exit(1); } /* * We've determined that no copy of geomview is running, so start one. */ static void start_gv(char **progtorun, char *toname, bool asgeom, enum streamtype pipetype) { char *args[1024]; int i; static const char Mprefix[] = "/tmp/geomview/"; char Mhow[] = "-Mcsin6"; signal(SIGALRM, interrupt); for (i=0; progtorun[i] != NULL; i++) args[i] = progtorun[i]; Mhow[2] = asgeom ? 'g' : 'c'; switch (pipetype) { case namedpipe: Mhow[3] = 'p'; Mhow[4] = '\0'; break; case unixsocket: Mhow[3] = 's'; Mhow[4] = '\0'; break; case inetsocket: strcpy(Mhow+3, "sin"); break; case inet6socket: strcpy(Mhow+3, "sin6"); break; default: break; } args[i++] = Mhow; #if HAVE_INET_SOCKETS || HAVE_INET6_SOCKETS if (pipetype == inetsocket || pipetype == inet6socket) { if ((toname = strrchr(toname, ':')) == NULL) { toname = DFLT_PORT_STR; } else { ++toname; } args[i++] = toname; } else #endif args[i++] = strncmp(toname, Mprefix, sizeof(Mprefix)-1) != 0 ? toname : toname + sizeof(Mprefix)-1; args[i] = NULL; if (fork() == 0) { close(0); #if SETPGRP_VOID setpgrp(); #else setpgrp(0,getpid()); #endif execvp(progtorun[0], &args[0]); execvp("gv", &args[0]); perror("Couldn't exec geomview nor gv"); kill(getppid(), SIGALRM); _exit(1); } } /* * Pipe fitting for linking Mathematica to geomview. * Starts geomview if not already running. */ int main(int argc, char *argv[]) { int n, fd = -1; int asgeom = 0; char pipename[PATH_MAX]; char buffer[BUFSIZ]; static char *geomview[] = { "geomview", NULL }; char **progtorun = geomview; char *tail; struct stat st; char *prog; #ifdef NeXT enum streamtype pipetype = unixsocket; #else enum streamtype pipetype = namedpipe; #endif const char *todir = "/tmp/geomview"; const char *toname = "OOGL"; const char *hostname = "localhost"; char *portstr = DFLT_PORT_STR; int port = DFLT_PORT; prog = argv[0]; tail = strrchr(prog, '/'); if (tail) tail++; else tail = argv[0]; if (tail[0] == 'g') { asgeom = 1; } while (argc > 1 && argv[1][0] == '-') { for (tail = argv[1]; *++tail; ) { switch(*tail) { case 'M': asgeom = 1; break; case 'g': asgeom = 1; break; case 'c': asgeom = 0; break; case 'p': pipetype = namedpipe; break; case 's': pipetype = unixsocket; if (strncmp(tail, "sun", 3) == 0) { tail += 2; } else if (strncmp(tail, "sin6", 4) == 0) { pipetype = inet6socket; tail += 3; } else if (strncmp(tail, "sin", 3) == 0) { pipetype = inetsocket; tail += 2; } break; default: usage(prog); break; } } argc--, argv++; } #ifndef S_IFIFO if (pipetype == namedpipe) { fprintf(stderr, "Named pipes not supported.\n"); exit(EXIT_FAILURE); } #endif #if !HAVE_UNIX_SOCKETS if (pipetype == unixsocket) { fprintf(stderr, "Unix domain sockets not supported.\n"); exit(EXIT_FAILURE); } #endif #if !HAVE_INET_SOCKETS if (pipetype == inetsocket) { fprintf(stderr, "IPv4 sockets not supported.\n"); exit(EXIT_FAILURE); } #endif #if !HAVE_INET6_SOCKETS if (pipetype == inetsocket) { fprintf(stderr, "IPv6 sockets not supported.\n"); exit(EXIT_FAILURE); } #endif if (argc > 1) { toname = argv[1]; if (pipetype == inetsocket || pipetype == inet6socket) { portstr = strrchr(toname, ':'); if (portstr == NULL) { portstr = DFLT_PORT_STR; } else { *portstr++ = '\0'; } hostname = toname; port = atoi(portstr); toname = portstr; } } else if (pipetype == inetsocket || pipetype == inet6socket) { toname = portstr = DFLT_PORT_STR; } if (argc > 2) { progtorun = &argv[2]; } if (pipetype == namedpipe || pipetype == unixsocket) { if (toname[0] == '/') { tail = strrchr(toname, '/'); *tail = '\0'; todir = toname; toname = tail + 1; } if (access(todir, W_OK) < 0) { mkdir(todir, 0777); chmod(todir, 0777); } sprintf(pipename, "%s/%s", todir, toname); if (stat(pipename, &st) >= 0) { #if HAVE_UNIX_SOCKETS if (pipetype == unixsocket && (st.st_mode & S_IFMT) != S_IFSOCK) { unlink(pipename); } #endif #ifdef S_IFIFO if (pipetype == namedpipe && (st.st_mode & S_IFMT) != S_IFIFO) { unlink(pipename); } #endif } } else { sprintf(pipename, "%s:%s", hostname, portstr); } if (pipetype != namedpipe) { #if HAVE_UNIX_SOCKETS struct sockaddr_un un; #endif #if HAVE_INET_SOCKETS struct sockaddr_in in; #endif #if HAVE_INET6_SOCKETS struct sockaddr_in6 in6; #endif struct sockaddr *s = NULL; int slen = 0; bool do_startgv = false; switch (pipetype) { #if HAVE_UNIX_SOCKETS case unixsocket: strncpy(un.sun_path, pipename, sizeof(un.sun_path)-1); un.sun_family = AF_UNIX; fd = socket(PF_UNIX, SOCK_STREAM, 0); s = (struct sockaddr *)&un; slen = sizeof(un); do_startgv = true; break; #endif #if HAVE_INET_SOCKETS case inetsocket: init_inetaddr(&in, hostname, port); fd = socket(PF_INET, SOCK_STREAM, 0); s = (struct sockaddr *)∈ slen = sizeof(in); /* only try to start gv if going through loop-back device */ do_startgv = in.sin_addr.s_addr == htonl(INADDR_LOOPBACK); break; #endif #if HAVE_INET6_SOCKETS case inet6socket: init_inet6addr(&in6, hostname, port); fd = socket(PF_INET6, SOCK_STREAM, 0); s = (struct sockaddr *)&in6; slen = sizeof(in6); do_startgv = memcmp(&in6.sin6_addr, &in6addr_loopback, sizeof(struct in6_addr)) == 0; break; #endif default: break; } if (connect(fd, s, slen) < 0) { if (errno != ECONNREFUSED && errno != ENOENT) { fprintf(stderr, "togeomview: Can't connect to "); perror(pipename); exit(EXIT_FAILURE); } if (do_startgv) { start_gv(progtorun, pipename, asgeom, pipetype); for (n = 0; connect(fd, s, slen) < 0; n++) { if (n == 15) { interrupt(0); } sleep(1); } } else { fprintf(stderr, "togeomview: unable to connect to \"%s\"; and " "starting Geomview on remote-hosts is not implemented yet.\n", pipename); exit(EXIT_FAILURE); } } #ifdef S_IFIFO } else { /* Use named pipe */ if (access(pipename, 0) < 0) { mknod(pipename, S_IFIFO, 0); chmod(pipename, 0666); } fd = open(pipename, O_WRONLY|O_NONBLOCK); if (fd >= 0) { fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~(FNDELAY|FNONBLK|O_NONBLOCK)); } else if (errno == ENXIO) { start_gv(progtorun, pipename, asgeom, pipetype); alarm(60); fd = open(pipename, O_WRONLY); alarm(0); } #endif } if (fd < 0) { fprintf(stderr, "Can't open pipe to geomview: "); perror(pipename); exit(1); } while ((n = read(0, buffer, sizeof(buffer))) > 0) { if (write(fd, buffer, n) < n) { perror("Error writing to geomview"); exit(1); } } if (!asgeom) { /* try to consume answers and echo them on STDOUT. * * The policy is somewhat questionable; the code below means that * each command piped to geomview via togeomview will at least * take 1/10 seconds, regardless whether there really comes an * answer or not. */ fd_set sset; struct timeval tenth = { 0, 100000 }; FD_ZERO(&sset); FD_SET(fd, &sset); for (;;) { if (select(fd+1, &sset, NULL, NULL, &tenth) == 1) { if ((n = read(fd, buffer, sizeof(buffer))) > 0) { int dummy; dummy = write(1, buffer, n); (void)dummy; } } else { break; } } } exit(EXIT_SUCCESS); } static void usage(const char *prog) { char buf[BUFSIZ]; setbuf(stderr, buf); fprintf(stderr, "Usage: %s [-c] [-g] [-ps[un|in[6]]] [PIPENAME|HOST:PORT [GVPROG ARGS...]]\n" "Sends lisp-style commands or (with \"-g\") OOGL geometry data to Geomview\n" "(or the program specified by \"GVPROG\"). The transport channel is a\n" "named pipe (\"-p\" switch, default, except on the NeXT), a Unix domain\n" "(\"-s[un]\" switch, default on the NeXT), or a TCP socket, either with the\n" "IPv4 or IPv6 protocol (\"in[6]\" switch). For \"-p\" and \"-s\" a socket\n" "or FIFO special file as given by \"PIPENAME\" is created in\n" "\"/tmp/geomview/\". The default pipename is \"OOGL\". A copy of Geomview\n" "or \"GVPROG\" is started if none listening on the chosen transport medium\n" "is yet running. For TCP sockets this is done only when \"HOST\" refers to\n" "the loopback device.\n" "Examples:\n" " echo '(geometry fred < dodec.off)' | togeomview sam\n" " togeomview -g sin_family = AF_INET; name->sin_port = htons(port); hostinfo = gethostbyname(hostname); if (hostinfo == NULL) { fprintf (stderr, "Unknown host %s.\n", hostname); exit(EXIT_FAILURE); } name->sin_addr = *(struct in_addr *) hostinfo->h_addr; } #endif #if HAVE_INET6_SOCKETS void init_inet6addr(struct sockaddr_in6 *name, const char *hostname, int port) { struct hostent *hostinfo; name->sin6_family = AF_INET6; name->sin6_port = htons(port); hostinfo = gethostbyname(hostname); if (hostinfo == NULL) { fprintf (stderr, "Unknown host %s.\n", hostname); exit(EXIT_FAILURE); } name->sin6_addr = *(struct in6_addr *)hostinfo->h_addr; } #endif /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/togeomview/togeomview.1gv0000644000175000017500000000546412310110177016623 00000000000000.TH TOGEOMVIEW 1gv "21 May 1993" "Geometry Center" .SH NAME togeomview \- send commands or OOGL objects to geomview .SH SYNOPSIS \fBtogeomview\fP [\fB\-c\fP] [\fB\-g\fP] [\fIpipename\fP [\fIprogram args ...\fP]] .SH DESCRIPTION \fBtogeomview\fP sends a stream of geomview commands, or OOGL-format geometric data, to a cooperating copy of geomview. If geomview is not running, it is automatically started. ('geomview' must be on the $PATH of the user running 'togeomview' in order for this to work.) Typical usage is: .in +5 .nf \fIsomeprogram\fP | \fBtogeomview\fP (to send commands) or \fIsomeprogram-generating-OOGL-data\fP | \fBtogeomview -g\fP (to send geometry) .fi .in -5 i.e. a program pipes geometric data into ``\fBtogeomview\fP''; the data is displayed by a copy of geomview run with the \fB\-M\fP option and a name matching the one given to \fBtogeomview\fP. .sp \fBTogeomview\fP uses a named pipe in the directory \fB/tmp/geomview\fP to communicate with geomview. If unspecified, the pipe's default name is "OOGL". When sending geometry (\fB\-g\fP), a geomview object with the same name as the pipe appears in geomview's object browser. .sp By default, when no suitable copy of geomview is running, \fBtogeomview\fP invokes "geomview" with arguments specifying the appropriate named pipe. A different command may be specified as in: .sp .ti +5 togeomview OOGL gv -wpos 300x300 -c \fImy_startup_script\fP .sp which communicates through a pipe named OOGL, and (if necessary) invokes the given gv command. The pipe name is \fIrequired\fP if a command is specified. After togeomview has created it, the named pipe may be written as an ordinary file. For example, one could use .sp .ti +5 \fBtogeomview\fP \fIpipename\fP < /dev/null .sp to invoke a listening copy of geomview, and then run a program which simply wrote to /tmp/geomview/\fIpipename\fP. .SH FILES /tmp/geomview .SH BUGS The pipe-based communications scheme imposes several restrictions. If no copy of \fBgeomview\fP is reading from the pipe, or if geomview gets far enough behind, a program writing data to ``\fBtogeomview\fP'' will be forced to block after sending a few kilobytes. Because of the buffering in the pipe, the sender may be substantially ahead of the geomview display. If geomview exits, the sending program receives a write-on-broken-pipe (\fBSIGPIPE\fP) signal, which will kill it unless measures are taken to catch or ignore that signal. Only one copy of geomview can read from a given pipe at a time. If a second copy attempts to read from it, both will probably fail. It's fine to have multiple copies of geomview reading from different pipes. Note that \fBtogeomview\fP will invoke geomview if no extant copy is listening to the relevant pipe; it can't connect to an existing copy of geomview started by other means. .SH "SEE ALSO" geomview(1), oogl(5) geomview-1.9.5/src/bin/geomutil/0000755000175000017500000000000012310165604013533 500000000000000geomview-1.9.5/src/bin/geomutil/Makefile.in0000644000175000017500000004771012310165552015533 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/geomutil DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir 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 DIST_SUBDIRS = bdy maple2oogl oogl2rib plutil vrml2oogl clip math2oogl \ oogl2vrml ucd hvectext DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ @HAVE_CXX_FALSE@VRML2OOGL = @HAVE_CXX_TRUE@VRML2OOGL = vrml2oogl SUBDIRS = bdy maple2oogl oogl2rib plutil $(VRML2OOGL) \ clip math2oogl oogl2vrml ucd hvectext all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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" cscopelist: cscopelist-recursive 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am 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 \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/bin/geomutil/Makefile.am0000644000175000017500000000023312310110177015500 00000000000000if HAVE_CXX VRML2OOGL = vrml2oogl else VRML2OOGL = endif SUBDIRS = bdy maple2oogl oogl2rib plutil $(VRML2OOGL) \ clip math2oogl oogl2vrml ucd hvectext geomview-1.9.5/src/bin/geomutil/bdy/0000755000175000017500000000000012310165604014311 500000000000000geomview-1.9.5/src/bin/geomutil/bdy/Makefile.in0000644000175000017500000006561512310165552016315 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = bdy$(EXEEXT) subdir = src/bin/geomutil/bdy DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(moduledir)" \ "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(moduledir)" PROGRAMS = $(bin_PROGRAMS) am_bdy_OBJECTS = bdy.$(OBJEXT) bdy_OBJECTS = $(am_bdy_OBJECTS) bdy_LDADD = $(LDADD) am__DEPENDENCIES_1 = 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 = 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; }; \ } SCRIPTS = $(module_SCRIPTS) 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(bdy_SOURCES) DIST_SOURCES = $(bdy_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) DATA = $(module_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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) LDADD = $(OOGLLIB) man_MANS = bdy.1gv EXTRA_DIST = drawbdy.sh $(man_MANS) bdy_SOURCES = bdy.c bdy_DEPENDENCIES = $(OOGLLIB) module_SCRIPTS = drawbdy module_DATA = .geomview-drawbdy CLEANFILES = drawbdy DISTCLEANFILES = .geomview-drawbdy all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/bdy/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/bdy/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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 \ || test -f $$p1 \ ; 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(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: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list bdy$(EXEEXT): $(bdy_OBJECTS) $(bdy_DEPENDENCIES) $(EXTRA_bdy_DEPENDENCIES) @rm -f bdy$(EXEEXT) $(AM_V_CCLD)$(LINK) $(bdy_OBJECTS) $(bdy_LDADD) $(LIBS) install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(moduledir)'"; \ $(MKDIR_P) "$(DESTDIR)$(moduledir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | 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; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$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_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(moduledir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bdy.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-moduleDATA: $(module_DATA) @$(NORMAL_INSTALL) @list='$(module_DATA)'; test -n "$(moduledir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(moduledir)'"; \ $(MKDIR_P) "$(DESTDIR)$(moduledir)" || 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)$(moduledir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(moduledir)" || exit $$?; \ done uninstall-moduleDATA: @$(NORMAL_UNINSTALL) @list='$(module_DATA)'; test -n "$(moduledir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(moduledir)'; $(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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(MANS) $(DATA) all-local installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-man install-moduleDATA install-moduleSCRIPTS 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-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-moduleDATA \ uninstall-moduleSCRIPTS uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-moduleDATA install-moduleSCRIPTS 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-man uninstall-man1 uninstall-moduleDATA \ uninstall-moduleSCRIPTS drawbdy: drawbdy.sh Makefile sed \ -e "s|%SHELL%|`eval eval eval echo @SHELL@`|g" \ -e "s|%bindir%|`eval eval eval echo $(bindir)`|g" \ -e "s|%builddir%|$(abs_builddir)|g" \ < $(srcdir)/drawbdy.sh > drawbdy chmod +x drawbdy .geomview-drawbdy: echo '(emodule-define "Draw Boundary" "drawbdy")' > .geomview-drawbdy all-local: $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Draw Boundary" "$(subdir)/drawbdy")' > $(top_builddir)/modules/.geomview-drawbdy # 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: geomview-1.9.5/src/bin/geomutil/bdy/Makefile.am0000644000175000017500000000141112310110176016254 00000000000000INCLUDES = $(default_includes) LDADD = $(OOGLLIB) man_MANS = bdy.1gv EXTRA_DIST = drawbdy.sh $(man_MANS) bin_PROGRAMS = bdy bdy_SOURCES = bdy.c bdy_DEPENDENCIES = $(OOGLLIB) module_SCRIPTS = drawbdy module_DATA = .geomview-drawbdy CLEANFILES = drawbdy drawbdy: drawbdy.sh Makefile sed \ -e "s|%SHELL%|`eval eval eval echo @SHELL@`|g" \ -e "s|%bindir%|`eval eval eval echo $(bindir)`|g" \ -e "s|%builddir%|$(abs_builddir)|g" \ < $(srcdir)/drawbdy.sh > drawbdy chmod +x drawbdy .geomview-drawbdy: echo '(emodule-define "Draw Boundary" "drawbdy")' > .geomview-drawbdy all-local: $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Draw Boundary" "$(subdir)/drawbdy")' > $(top_builddir)/modules/.geomview-drawbdy DISTCLEANFILES = .geomview-drawbdy geomview-1.9.5/src/bin/geomutil/bdy/bdy.c0000644000175000017500000000300112310110176015137 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * bdy.c * author: Celeste Fowler, Mark Phillips * date: June 12, 1992 */ #include #include #include "geom.h" #include "bdy.h" int main(int argc, char *argv[]) { Geom *o, *v; float p; if (argc > 1) sscanf(argv[1], "%f", &p); else p = 0.0; o = GeomFLoad(iobfileopen(stdin), NULL); v = Bdy(o, p); GeomFSave(v, stdout, NULL); fflush(stdout); GeomDelete(v); GeomDelete(o); fclose(stdin); fclose(stdout); exit(0); } geomview-1.9.5/src/bin/geomutil/bdy/drawbdy.sh0000755000175000017500000000020412310110176016212 00000000000000#! %SHELL% echo "(write geometry - targetgeom world)" echo "(new-geometry Boundary " PATH=%builddir%:%bindir%:$PATH bdy echo ")" geomview-1.9.5/src/bin/geomutil/bdy/bdy.1gv0000644000175000017500000000222512310110176015421 00000000000000.TH bdy 1gv "June 12 1992" "Geometry Center" .SH NAME bdy -\ boundary curve finder .SH SYNOPSIS bdy [precision] .SH DESCRIPTION .PP Bdy is a filter used to find boundary curves in Geomview objects. The program reads a geomview object from standard input and prints the resultant vector object to standard output. Bdy finds the segments of the vector by first converting the given object into a polylist (See anytooff(1)). Then, it finds all edges used once and only once in the polylist and combines these edges into a vector object. The optional precision arguement specifies the maximum distance between vertices that are to be considered identical. By default, it is set to 0.0, indicating that the vertices must be numerically identical. It may sometimes be necessary to set it to a higher value to compensate for floating-point error. .PP The vector object is always black. .SH BUGS The vector object is not a particularly compact representation of itself, since it contains many 2-vertex segments which could be combined. .SH SEE ALSO geomview(1), anytooff(1), anytopl(3), bdy(3), offconsol(1), plconsol(3) .SH AUTHOR .nf Celeste Fowler The Geometry Center .fi geomview-1.9.5/src/bin/geomutil/maple2oogl/0000755000175000017500000000000012310165604015574 500000000000000geomview-1.9.5/src/bin/geomutil/maple2oogl/Makefile.in0000644000175000017500000004460312310165552017572 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/geomutil/maple2oogl DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(docdir)" \ "$(DESTDIR)$(mapledir)" SCRIPTS = $(bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(doc_DATA) $(maple_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = gvplot.mapleV3 remotegv README.gvplot gvplot.mapleV4\ gvplot.txt gvplot.mapleV8 gvplot.mws savegvplot.mws mapledir = $(pkgdatadir)/Maple maple_DATA = gvplot.mapleV3 gvplot.mapleV4 gvplot.mapleV8\ gvplot.txt gvplot.mws savegvplot.mws README.gvplot doc_DATA = README.gvplot bin_SCRIPTS = remotegv all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/maple2oogl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/maple2oogl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; 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 \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | 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; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$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_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-docDATA: $(doc_DATA) @$(NORMAL_INSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || 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)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-docDATA: @$(NORMAL_UNINSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) install-mapleDATA: $(maple_DATA) @$(NORMAL_INSTALL) @list='$(maple_DATA)'; test -n "$(mapledir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(mapledir)'"; \ $(MKDIR_P) "$(DESTDIR)$(mapledir)" || 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)$(mapledir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(mapledir)" || exit $$?; \ done uninstall-mapleDATA: @$(NORMAL_UNINSTALL) @list='$(maple_DATA)'; test -n "$(mapledir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(mapledir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(mapledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-docDATA install-mapleDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS uninstall-docDATA \ uninstall-mapleDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-binSCRIPTS install-data \ install-data-am install-docDATA install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-mapleDATA \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am uninstall-binSCRIPTS \ uninstall-docDATA uninstall-mapleDATA # 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: geomview-1.9.5/src/bin/geomutil/maple2oogl/Makefile.am0000644000175000017500000000046712310110176017551 00000000000000EXTRA_DIST = gvplot.mapleV3 remotegv README.gvplot gvplot.mapleV4\ gvplot.txt gvplot.mapleV8 gvplot.mws savegvplot.mws mapledir = $(pkgdatadir)/Maple maple_DATA = gvplot.mapleV3 gvplot.mapleV4 gvplot.mapleV8\ gvplot.txt gvplot.mws savegvplot.mws README.gvplot doc_DATA = README.gvplot bin_SCRIPTS = remotegv geomview-1.9.5/src/bin/geomutil/maple2oogl/gvplot.mapleV30000644000175000017500000006442712310110176020267 00000000000000########################## ## ## Title : writeoogl, a package for converting maple PLOT3D ## objects to Geomview data objects. ## gvplot, interactive pipe to Geomview from Maple ## ## Created : Dec 5 1993 ## ## Authors : Frederick Wicklin and ## Stuart Levy ## The Geometry Center ## ## Documentation : currently ?gvplot or ?writeoogl or ?geomview ## ## History ## fjw 9/21/93 initial maple->geomview for Maple VR2 ## slevy 11/27/93 interactive geomview pipe; ## backwards compatable to Maple V ## fjw 11/29/93 debugging; added color options ## ## ## Usage: readlib(gvplot); ## (optional) gvcommand := `geomview initial-options ...`; ## (optional) gvdirectories := `/some/dir/ectory:/other/dir...`; ## 3dplot_struct := plot3d( ... ): ## writeoogl(`filename`, 3dplot_struct); ## gvplot(3dplot_struct); # To search for "geomview" and "togeomview" in directories which might not # be on the default UNIX search path, list those director(ies) here, as in # default_gvdirectories := `/u/geom/bin:/usr/local/bin:` # or, set the "gvdirectories" variable before invoking gvplot(). default_gvdirectories := ``: # To start geomview with non-default options, or to start another program # via gvplot, put its name and initial arguments here in place of `geomview`, # or set the variable "gvcommand" before invoking gvplot(). # Changing default_gvcommand, then resaving gvplot.m, alters the default for # all users; setting the gvcommand variable changes it for just your session. default_gvcommand := `geomview`: ### Upon invoking the geomview package, maple creates a global ### variable UsEr_ID__ which is assigned a "random" number. ### This variable is used to create user-specific files in /tmp. ################################################################## # There doesn't seem to be any explicit test for Maple V1 vs. V2, # but all V1 plot objects seem to begin with FUNCTION, so use that fact # to detect that we must be careful not to print invalid float constants. ################################################################## `oogl/lprn` := `oogl/lprnV2`: writeoogl := proc() global `oogl/lprn`; local header, item, ps, zlist, plist, llist, ppoint, pcolor, appear, i, j, totl, xrange, yrange, nx, ny, oldgc, coloron,colorlist,ccnt, totalverts; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; if nargs > 2 or nargs = 0 then ERROR(`Usage:writeoogl(``filename``,3dplot_struct); OR writeoogl(3dplot_struct);`) fi; ps := args[nargs]; if not type(ps, PLOT3D) then ERROR(`Invalid plot structure`,ps, `; must be of type PLOT3D, as from plot3d(), tubeplot(), spacecurve(), etc.`) fi; if nargs = 2 and not type(args[1], string) then ERROR(`Invalid file name (not string)`, args[1]) fi; if nops(ps) < 1 then ERROR(`Empty 3D plot structure!`) fi; ################################################################## # When run in command-line mode, Garbage Collection (GC) # # messages printed to terminal can interfere with the data flow. # # Therefore suppress GC during writing of GeomView data # ################################################################## if nargs = 2 then oldgc := status[5]; # words increment for automatic garbage collection gc(0); # suppress garbage collection print(`Saving Maple 3D structs to Geomview file`, args[1]); writeto(args[1]); fi; xrange := 'xrange'; # nullify this local variable appear := find_appearance(1, ps); lprint( appear, `{LIST` ); ################################################################## ### BEGIN main loop over all 3D plots (may be a list of plots) ### ################################################################## for item in ps do coloron := FALSE; # default is no color info header := op(0,item); if header = FUNCTION then # Maple V1 only: FUNCTION( f(x,y), xrange, yrange ) # or FUNCTION( x(u,v), y(u,v), z(u,v), u = u0..u1, v = v0..v1 ) xrange := op(nops(item)-1, item); if type(xrange, `=`) then xrange := op(2, xrange) fi; yrange := op(nops(item), item); if type(yrange, `=`) then yrange := op(2, yrange) fi; # Maple V1 -- don't trust lprint() `oogl/lprn` := `oogl/lprnV1`; ########################### GRID ############################ # EX: plot3d( f(x,y), x=xmin..xmax, y=ymin..ymax] # Saving Maple GRID struct to geomview ZMESH struct # Maple V1: FUNCTION( f(x,y), xrange,yrange ) followed by GRID( zlist ) # In Maple V1, we might see either ZMESH-style data (only Z per vertex) # or a full 3-D mesh (x,y,z per vertex). Just check the first # vertex to see. # Maple V2: GRID( xrange, yrange, zlist ) # Maple V2 uses GRID only for ZMESH-style data, # and uses a MESH header for meshes with general 3-D verts. ############################################################### elif header = GRID then if type(xrange, `..`) then zlist := item else # this is typical VR2 route xrange := op(1, item); yrange := op(2, item); zlist := op(3, item); ####################################################### # if color, then there are 4 possibilities: # colorlist = COLOR(HUE, h[1],...,h[nops[colorlist]) # colorlist = COLOR(HUE, h) # colorlist = COLOR(RGB, r[1],g[1],b[1],...) # colorlist = COLOR(RGB, r,g,b) # Convert HUES to an RGB value using HSV2RGB and # (assume that Maple uses s=v=1). Add a 1 at the end of # the list for geomview's "alpha": 0<=>transparent, 1<=>opaque ####################################################### if( nops(item)>3 ) then colorlist := find_colorlist(4, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; fi; nx := nops(zlist); ny := nops(op(1,zlist)); if type(op(1, op(1,zlist)), list) then lprint(`{ { MESH`, ny, nx) else # scale this data by wrapping it in transformation matrix lprint(`{ INST transform { `); `oogl/lprn`( [0, (op(2,yrange)-op(1,yrange)) / (ny-1), 0, 0] ); `oogl/lprn`( [(op(2,xrange)-op(1,xrange)) / (nx-1), 0, 0, 0] ); lprint(0, 0, 1, 0); `oogl/lprn`( [op(1,xrange), op(1,yrange), 0, 1] ); if(coloron = FALSE) then lprint(` } geom { ZMESH`, ny, nx); # gv type else lprint(` } geom { CZMESH`, ny, nx); # color gv type fi; fi; ccnt := 2; # set color counter to 2 for plist in zlist do for ppoint in plist do `oogl/lprn`(ppoint); if (coloron = HUE) and nops(colorlist)>2 then lprint(HSV2RGB(op(ccnt,colorlist), 1,1), 1); ccnt := ccnt + 1; elif (coloron = HUE) and nops(colorlist)=2 then lprint(HSV2RGB(op(2,colorlist), 1,1), 1); elif (coloron = RGB) and nops(colorlist)>4 then lprint(op(ccnt,colorlist),op(ccnt+1,colorlist),op(ccnt+2,colorlist),1); ccnt := ccnt + 3; elif (coloron = RGB) and nops(colorlist)=4 then lprint(op(2,colorlist),op(3,colorlist),op(4,colorlist), 1); fi; od; od; lprint( `} }`); ########################### MESH ########################### # EX: plot3d( [x(s,t), y(s,t), z(s,t)], s=smin..smax, t=tmin..tmax] # Saving Maple MESH struct to geomview MESH struct ############################################################### elif header = MESH then llist := op(1, item): if( nops(item)>1 ) then colorlist := find_colorlist(2, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; if(coloron=FALSE) then lprint(`{ MESH ` ); # gv type else lprint(`{ CMESH ` ); # color gv type fi; lprint( nops(llist)); # num x elements lprint( nops(op(1,llist)) ); # num y elements # Maple store points in row-dominant manner # But geomview want column-dominant, so need to # print out the transpose of the matrix in the plot3d struct nx := nops(llist); # maple rows ny := nops(op(1,llist)); # maple cols for j from 1 to ny do for i from 1 to nx do ppoint := op(j, op(i,llist)); `oogl/lprn`(ppoint); if (coloron = HUE) and nops(colorlist)>2 then lprint(HSV2RGB(op((i-1)*ny+j +1,colorlist), 1,1), 1); elif (coloron = HUE) and nops(colorlist)=2 then lprint(HSV2RGB(op(2,colorlist), 1,1), 1); elif (coloron = RGB) and nops(colorlist)>4 then lprint(op(3*((i-1)*ny+j-1)+2,colorlist),op(3*((i-1)*ny+j-1)+3,colorlist),op(3*((i-1)*ny+j-1)+4,colorlist),1); elif (coloron = RGB) and nops(colorlist)=4 then lprint(op(2,colorlist),op(3,colorlist),op(4,colorlist), 1); fi; od; od; lprint( `}`); ########################### CURVES ########################## # EX: spacecurve( [x(t), y(t), z(t)], t=tmin..tmax] # Saving Maple CURVES struct to geomview VECT struct ############################################################### elif header = CURVES then llist := select(type, item, list); if( nops(item)>1 ) then colorlist := find_colorlist(2, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; lprint(`{ VECT `); # gv type # Number of polylines, total vertices. totalverts := sum('nops(op(i,llist))', 'i'=1..nops(llist)); lprint(nops(llist), totalverts); if coloron=FALSE then lprint(1); # One color in all lprint(seq(nops(op(i,llist)), i=1..nops(llist))); # Vertex counts lprint(1, 0 $ 'i'=2..nops(llist)); # Color counts. else lprint(totalverts); # Total number of colors, 1 per vert lprint(seq(nops(op(i,llist)), i=1..nops(llist))); # Vertex counts lprint(seq(nops(op(i,llist)), i=1..nops(llist))); # color per vert fi; for plist in llist do for ppoint in plist do # print all vertices `oogl/lprn`(ppoint); od od; if coloron=FALSE then lprint(1,1,1,1); # color RGBA = white and opaque elif (coloron = HUE) and nops(colorlist)>2 then for ccnt from 2 to nops(colorlist) do lprint(HSV2RGB(op(ccnt,colorlist), 1,1), 1); od; elif (coloron = HUE) and nops(colorlist)=2 then for ccnt from 1 to nops(llist) do lprint(HSV2RGB(op(2,colorlist), 1,1), 1); od; elif (coloron = RGB) and nops(colorlist)>4 then for ccnt from 2 by 3 to nops(colorlist) do lprint(op(ccnt,colorlist),op(ccnt+1,colorlist),op(ccnt+2,color\list),1); od; elif (coloron = RGB) and nops(colorlist)=4 then for ccnt from 1 to nops(llist) do lprint(op(2,colorlist),op(3,colorlist),op(4,colorlist),1); od; fi; lprint( `}`); ######################### POLYGONS ########################## #EX:polygonplot3d([seq([seq([x(s,t),y(s,t),z(s,t)],s=smin..smax],tmin..tmax])): # Polygons are handled differently than the other objects w/r/t # color. Leave color alone and let user change color using geomview. ############################################################### elif header = POLYGONS then pcolor := i $ i=1..0; # Empty sequence totl := 0: nx := 0: # use nx to count number of polygons for llist in item do # sequence of lists POLY(),COLOR(), if type(llist,list) then nx := nx + 1; # number of polygons totl := totl + nops(llist); # compute total number of vertices fi od; lprint(find_appearance(1, item)); # if coloron=FALSE then lprint(`{ OFF `); # gv type # else # lprint(`{ COFF `); # color # fi; lprint(totl, nx, 0); # total verts,polygons,"edges"(not used!) for llist in item do if type(llist,list) then for ppoint in llist do `oogl/lprn`(ppoint); # List of vertices od; fi; od; lprint(``); totl := 0; for llist in item do if type(llist,function) and (op(0,llist)=COLOR or op(0,llist)=COLOUR) then colorlist := llist; if op(1,llist)=HUE and nops(colorlist)=2 then pcolor := HSV2RGB(op(2,colorlist),1,1); # use ppoint for RGB elif op(1,llist)=RGB and nops(colorlist)=4 then pcolor := op(2..4,colorlist); fi; elif type(llist,list) then ## There are only two possibilities for POLYGONS ## ## In both cases, it means entire polygon is same color ## lprint( nops(llist), i $ i=totl..totl+nops(llist)-1, ` `, pcolor); totl := totl + nops(llist); fi; od; lprint( `}`); ######################### POINTS ########################## #EX:PLOT3D(POINTS([0,0,1],[1,0,0],[0,1,0])); ############################################################### elif header = POINTS then lprint(`{ VECT`, nops(item), nops(item), 0); for plist in item do lprint(`1`) od; lprint(``); for plist in item do lprint(`0`) od; lprint(``); for ppoint in item do `oogl/lprn`(ppoint) od; lprint(`}`); ########################### TEXT ############################ # 3D plots using the "plots" package may include TEXT # This is not supported ############################################################### elif header = TEXT then print(` `); fi; od; # END main for loop lprint( `}`); if nargs = 2 then writeto(terminal); gc(oldgc); fi; end: gvplot := proc() global UsEr_ID__, gvcommand, default_gvcommand, gvdirectories, default_gvdirectories; local gvname, gvcmd, gvdirs, ps, oldgc, tmp_fname; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; ### Set up filename to use as temporary site for data. ### ### Take file in /tmp and postfix number which is (hopefully) ### ### independent of users. Eg, if user1 and user2 are both ### ### using writeoogl, then they will be writing to different ### ### files. This is UNIX specific (but so is Geomview). ### if UsEr_ID__ = 'UsEr_ID__' then UsEr_ID__ := (round( rand() * (time()+1) ) mod 9999) + 1; fi; tmp_fname := `Maple`.(UsEr_ID__); ### Let user specify, via "gvcommand" and "gvdirectories" global vars, ### which program/args to run when invoking geomview, ### and how to set the search path to find it and togeomview. if gvcommand <> 'gvcommand' then gvcmd := gvcommand else gvcmd := default_gvcommand fi; if gvdirectories <> 'gvdirectories' then gvdirs := gvdirectories else gvdirs := default_gvdirectories fi; ps := args[nargs]; gvname := `Maple`; if nargs < 1 or nargs > 2 then ERROR(`Usage: gvplot(3dplot_structure) -or- gvplot(``name``, 3dplot_structure)`); fi; if nargs > 1 then gvname := args[1] fi; if not type( ps, PLOT3D) then ERROR(`Invalid plot structure`,ps, `; must be of type PLOT3D, as from plot3d(), tubeplot(), spacecurve(), etc.`) fi; # start geomview reading from stdin if system( `PATH=` . gvdirs . `:$PATH togeomview -Mcp `.tmp_fname.` `.gvcmd.` 0 then ERROR(`gvplot: togeomview: Can't start a copy of geomview. `. `If "togeomview" or "geomview" were not found `. `try setting the variable "gvdirectories" to the name of the directory where `. `they're installed (or to a colon-separated list of directories).`); fi; oldgc := status[5]; # words increment for automatic garbage collection gc(0); # suppress garbage collection messages writeto(`/tmp/geomview/`.tmp_fname); lprint(`(geometry`, gvname); writeoogl( ps ); lprint(`)`); writeto(terminal); gc(oldgc); # return to previous garbage collection state end: gvcommand := proc() global UsEr_ID__, gvcommand, default_gvcommand, gvdirectories, default_gvdirectories; local gvname, gvcmd, gvdirs, ps, oldgc, tmp_fname; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; ### Set up filename to use as temporary site for data. ### ### Take file in /tmp and postfix number which is (hopefully) ### ### independent of users. Eg, if user1 and user2 are both ### ### using writeoogl, then they will be writing to different ### ### files. This is UNIX specific (but so is Geomview). ### if UsEr_ID__ = 'UsEr_ID__' then UsEr_ID__ := (round( rand() * (time()+1) ) mod 9999) + 1; fi; tmp_fname := `Maple`.(UsEr_ID__); ### Let user specify, via "gvcommand" and "gvdirectories" global vars, ### which program/args to run when invoking geomview, ### and how to set the search path to find it and togeomview. if gvcommand <> 'gvcommand' then gvcmd := gvcommand else gvcmd := default_gvcommand fi; if gvdirectories <> 'gvdirectories' then gvdirs := gvdirectories else gvdirs := default_gvdirectories fi; # start geomview reading from stdin if system( `PATH=` . gvdirs . `:$PATH togeomview -Mcp `.tmp_fname.` `.gvcmd.` 0 then ERROR(`gvplot: togeomview: Can't start a copy of geomview. `. `If "togeomview" or "geomview" were not found `. `try setting the variable "gvdirectories" to the name of the directory where `. `they're installed (or to a colon-separated list of directories).`); fi; oldgc := status[5]; # words increment for automatic garbage collection gc(0); # suppress garbage collection messages writeto(`/tmp/geomview/`.tmp_fname); lprint(args); writeto(terminal); gc(oldgc); # return to previous garbage collection state end: # possible gvplot enhancements: # allow remote display? # Maybe use a two-step Rube Goldberg hookup with an external converter # that directly reads lprint() format. Likely to be faster for large objects. # Then gvplot would read # gvplot := proc() # ... # if system(`togeomview -Mcp Maple.raw maple2oogl -togeomview -Mcp Maple`)<>0 # then ERROR(...) fi; # writeto(`/tmp/geomview/Maple.raw`); # lprint(`(geometry`, gvname, `<<`); # lprint(3dplot_struct); # lprint(`>>)`); # writeto(terminal); # end: # and writeoogl would read # writeoogl := proc() # ... # if system(cat(`togeomview -Mcp Maple.rawdata maple2oogl -o `, fname)) <> 0 # then ERROR(...) fi; # writeto(`/tmp/geomview/Maple.rawdata`); # lprint(`<<', 3dplot_string, `>>'); # writeto(terminal); # end: # # Here 'togeomview' is actually being used to start 'maple2oogl' rather # than geomview itself. In the first case, maple2oogl -togeomview would # invoke code to start a copy of geomview. # Help information for writeoogl `help/text/writeoogl` := TEXT( ` `, `HELP FOR: writeoogl, gvplot `, ` `, `CALLING SEQUENCE: `, ` readlib(gvplot): `, ` writeoogl( ``filename``, 3dplot_struct ); `, ` writeoogl( 3dplot_struct ); `, ` gvplot( 3dplot_struct ); `, ` gvplot( ``geomview_name``, 3dplot_struct ) `, ` `, `PARAMETERS: `, ` filename the file which will contain the Geomview data `, ` 3dplot_struct a Maple PLOT3D data structure `, ` geomview_name name of the object in the Geomview browser `, ` `, `SYNOPSIS: `, ` writeoogl() accepts Maple PLOT3D structures and writes files `, ` readable by Geomview. gvplot() converts Maple PLOT3D structures`, ` and displays them immediately using Geomview, starting a copy of`, ` Geomview if necessary.`, ``, ` Supported data types include the Maple structures MESH, GRID, `, ` CURVES, POINTS, and POLYGONS. `, ` See ?plot3d[structure] for more information on Maple PLOT3D types.`, ` `, ` The Maple MESH and GRID structures are translated into Geomview's`, ` MESH and ZMESH objects, respectively, Maple CURVES and POINTS`, ` become VECT objects, and Maple POLYGONS becomes an OFF object.`, ` `, ` The Maple TEXT structure is not supported. Color information is`, ` supported for all objects.`, ``, ` The form writeoogl(filename, plot_struct) writes data in OOGL`, ` (Geomview) form to the given file; writeoogl(plot) writes to the`, ` current output stream as selected by writeto().`, ``, ` gvplot() normally starts the program "geomview", with no options;`, ` to specify something else, set the variable "gvcommand", as in:`, ` gvcommand := ``/usr/local/bin/gv -wpos 200x200 -c startup.gv``;`, ` before invoking gvplot(). Also, if the programs "geomview" or`, ` "togeomview" are not on your UNIX search path, set the variable`, ` gvdirectories := ``/some/dir/ectory:/some/other/directory``;`, ` to the appropriate directory (or directories separated by colons).`, ` `, `EXAMPLES: `, ` readlib(gvplot): `, ` my_plot := plot3d(sin(x+y), x=-Pi..Pi, y=-Pi..Pi): `, ` writeoogl( ``sinxy.mesh``, my_plot ); `, ` Saving Maple 3D structs to Geomview file, sinxy.mesh `, ` steiner := plot3d([ sin(2*x)*(cos(y))^2, sin(x)*sin(2*y), `, ` cos(x)*sin(2*y)], x=-Pi..Pi, y=-Pi..Pi): `, ` writeoogl( ``steiner.mesh``, steiner); `, ` Saving Maple 3D structs to Geomview file, steiner.mesh`, ` # Display it in geomview directly `, ` gvplot( steiner ); `, ` # load in the plots package `, ` with(plots): `, ` trefoil := spacecurve([ -2*cos(t)- 1/2*cos(5*t)+ 3*sin(2*t), `, ` -3*cos(2*t)+ 2*sin(t)- 1/2*sin(5*t), 2*cos(3*t), t=0..2*Pi]):`, ` writeoogl( ``trefoil.vect``, trefoil); `, ` Saving Maple 3D structs to Geomview file, trefoil.vect`, ` tetrahedra := [[1,0,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,0,1],[0,1,0]], `, ` [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,1,0],[-1,0,0]]:`, ` Tplot :=polygonplot3d([tetrahedra]): `, ` writeoogl( ``tetrahedra.off``, Tplot); `, ` Saving Maple 3D structs to Geomview file, tetrahedra.off`, ` # you can even create a single file with multiple objects `, ` all_objs := display3d( {my_plot, steiner, trefoil, Tplot} ): `, ` writeoogl( ``all.list``, all_objs ); `, ` Saving Maple 3D structs to Geomview file, all.list `, ` `, `SEE ALSO: plot3d[structure] ` ): `help/text/gvplot` := `help/text/writeoogl`: `help/text/geomview` := `help/text/writeoogl`: # Convert number to string, avoiding excess digits and avoiding Maple V1's # propensity to emit Float(mantissa,exponent) rather than ordinary exponential # notation! `oogl/cvs` := proc(v) local sign, absmant; options `Copyright 1993 by Stuart Levy, Geometry Center`; if type(v, float) then absmant := cat(abs(op(1,v))); sign := substring(`-`, 1..1-signum(v)); if abs(v) >= 1 then if(op(2,v) >= 0) then cat(op(1,v), '0' $ op(2,v)) else cat( sign, substring(absmant, 1..length(absmant)+op(2,v)), `.`, substring(absmant, length(absmant)+op(2,v)+1..8) ) fi elif abs(v) > .000001 then cat( sign, substring( `.0000000`, 1 .. 1-length(absmant)-op(2,v) ), substring(absmant, 1..7) ) else cat( sign, `.`, substring( absmant, 1..7), `e`, op(2,v) + length(absmant) ) fi elif type(v, realcons) then cat(v) fi; end: # # lprint a number, or a list of numbers. # `oogl/lprnV1` := proc (v) local i; options `Copyright 1993 by Stuart Levy, Geometry Center`; if type(v, list) then lprint( ' `oogl/cvs`(v[i]) ' $ i=1..nops(v) ); elif type(v,float) and abs(v) <= .1 then lprint(`oogl/cvs`(v)); elif type(v, realcons) then lprint(v); else lprint(`0 #`); fi; end: # Ditto, but assume we're Maple V2, which prints floating constants # in acceptable form. Don't bother to reformat them. `oogl/lprnV2` := proc(v) local i; options `Copyright 1993 by Stuart Levy, Geometry Center`; if type(v, list) then lprint( 'v[i]' $ i = 1..nops(v) ); # Print on one line elif type(v, realcons) then lprint(v); else lprint(`0 #`); fi end: ############################################################### ## HSV2RGB converts Maple Hues to RGB colors. ## The HUEs used are in [0,1] so assume that S=V=1 (this is close) ## The following algorithm is from Computer Graphics ## By Foley, vanDam, Feiner, Hughes, 2nd Ed. Addison-Wesley ## p 593 ## ## Adapted by fjw 11/29/93 ## Input: (h,s,v) in [0,1]^3 ## Output: sequence r,b,g each in [0,1] ############################################################### HSV2RGB := proc( h,s,v ) local hh,ip,fp,p,q,t; options `Copyright 1990 by Foley, vanDam, Feiner, Hughes`; if (s = 0) then # color on B/W center line if (h<0) then # There is no hue,ie, hue undefined RETURN( v,v,v ); else ERROR(`Undefined color`); fi; else if (h>1) then hh:=1 fi; hh := 6*h; # hh now in [0,6] ip := floor(hh); # ip is integer part of h fp := hh - ip; # fp is fractional part of h p := v*(1-s); q := v*(1-(s*fp)); t := v*(1-(s*(1-fp))); if (ip=0) then RETURN( v,t,p ); elif (ip=1) then RETURN( q,v,p ); elif (ip=2) then RETURN( p,v,t ); elif (ip=3) then RETURN( p,q,v ); elif (ip=4) then RETURN( t,p,v ); else RETURN( v,p,q ); fi; fi; end: ######################################################## # find_colorlist # input: n where to start looking for color data # item what list to search # output: list of color information or NULL list ######################################################## find_colorlist := proc(n,item) local i; options `Copyright 1993 by Frederick Wicklin, Geometry Center`; for i from n to nops(item) do if type(op(i,item),function) and (op(0,op(i,item))=COLOR or op(0,op(i,item))=COLOUR) then RETURN(op(i,item)) fi; od; RETURN([FALSE]); # no color info found end: ######################################################## # find_appearance # input: n index to start seeking color data # list list to search # output: argument of STYLE option (e.g. `PATCH`) or [] list. ######################################################## find_appearance := proc(n, list) local i, part, ap, color, colortype; ap := ``; color := ``; for i from n to nops(list) do part := op(i,list); if type(part,function) and (op(0,part)=COLOR or op(0,part)=COLOUR) then colortype := op(1,part); if colortype = HUE and nops(part) = 2 then color := [HSV2RGB(op(2,part), 1, 1)] elif colortype = RGB and nops(part) = 4 then color := [op(2..4,part)] fi # Otherwise, this "color" tag isn't for us elif type(part,function) and op(0,part) = STYLE then if op(1,part) = PATCH then ap := cat(ap, ` +face -edge`) elif op(1,part) = LINE or op(1,part) = WIREFRAME then ap := cat(ap, ` -face +edge`) fi elif type(part,function) and op(0,part) = THICKNESS and type(op(1,part),integer) then ap := cat(ap, ` linewidth `, op(1,part)); fi od; if color <> `` then color := cat( op(1..3, map(v -> cat(convert(v,string),` `), color) ) ); ap := cat(ap, `\n material { edgecolor `, color, `\n diffuse `, color, `}\n`); fi; if ap <> `` then ap := cat(` appearance { `, ap, `}`) fi; RETURN(ap); end: [`writeoogl`, `gvplot`]; geomview-1.9.5/src/bin/geomutil/maple2oogl/remotegv0000755000175000017500000001100612310110176017262 00000000000000#! /bin/sh # Invoke geomview possibly remotely. # For use within Maple, install this remotegv script somewhere in users' # search paths (e.g. in /usr/local/bin). # This script attempts to guess which machine to invoke geomview on by # examining the DISPLAY environment variable. If DISPLAY isn't set or # if geomview should run on a different machine, use the -h host option. # # The script also assumes that geomview should display on the machine where # it is invoked, so for that copy of geomview, it sets DISPLAY to ":0". # If the display should appear elsewhere (on an X terminal, say), # use the -display option. # # We use "rsh" (remote shell) to pass data to the other computer, so # the remote computer must allow this -- either with an entry in # /etc/hosts.equiv, or in a .rhosts file in the user's home directory # on the machine where geomview will run. The account name on the other # machine is assumed to be the same as on this machine; if different, # use the -l username or -h username@othermachine options. # # In case permissions are not set up correctly, the symptom # is liable to be a "Permission denied." message followed by the # immediate termination of the Maple process -- so if you're using it for # the first time, check it out before doing much else in your Maple session! # Sorry, but MapleV3 is just not very good at connecting to other programs. # # Note that togeomview and geomview MUST BE IN THE USER'S DEFAULT SEARCH PATH # on the remote machine. # # To use this script within Maple, you'd say: # readlib(gvplot); # then # gvcommand := `remotegv`; # or e.g. # gvcommand := `remotegv -h othermachine -display myxterm:0`; # or, if the account on the other machine is different from yours, # gvcommand := `remotegv -l otheraccount`; # or # gvcommand := `remotegv -h otheraccount@othermachine`; # Following any remotegv options, you can add the command to be invoked as # geomview, possibly including options, as in: # gvcommand := `remotegv -l person /u/person/bin/gv -wpos 300x200`; # # Then use gvplot() as usual. # # Normally, error messages reporting problems on the other machine (for # example, being unable to run geomview) are suppressed; this is unfortunately # necessary, or you'd never get another Maple prompt until quitting from # geomview. There's a test mode to aid in tracing problems; use it as in # gvcommand := `remotegv -test -h othermachine`; # i.e. add "-test" to whatever other options you'd give to remotegv. # # Option summary: # -l user or -l user@host # -h host or -h user@host # -display host:number (set display on remote end) # -test # also accepts togeomview's options (-g, -M[c][g][p][s]). # Invokes rsh to specified machine, invokes togeomview there by default. # # By default, we assume DISPLAY points to the machine where we'd like to be; # -h {host-portion-of-DISPLAY} -display :0 # Incorporates settings from "$RGVOPTS" environment variable. set -- $RGVOPTS "$@" set -x RGVSH=${RGVSH:-rsh} while case "$1" in -l) case "$2" in *@*) user="`expr match "$2" '\([^@]*\)'`" host="`expr match "$2" '.*@\(.*\)'`" ;; *) user="$2" ;; esac shift 2 ;; -h) case "$2" in *@*) user="`expr match "$2" '\([^@]*\)'`" host="`expr match "$2" '.*@\(.*\)'`" ;; *) host="$2" ;; esac shift 2 ;; -test) testopt=-test; shift ;; -display) rdisplay="$2"; shift 2 ;; -M*) togvopts="$togvopts $1"; inpipe="$2" shift 2 ;; -g) gopt=-g; shift ;; "") test ;; *) togvargs="$togvargs $1"; shift ;; esac do : done # Apply defaults if [ -z "$host" ]; then host="`expr match "$DISPLAY" '\([^:]*\)'`" fi if [ -z "$rdisplay" ]; then rdisplay=":0.0" fi case "$inpipe" in /*) ;; ?*) inpipe=/tmp/geomview/$inpipe ;; esac user=${user+"-l $user"} cmd="${host+$RGVSH $host $user}" if [ -n "$host" ]; then redirect=">/dev/null 2>&1" if [ -n "$testopt" ]; then echo "Testing setup to $host. If geomview or togeomview can't be started there, you should see messages explaining why. Unfortunately this command may not finish on its own -- you may need to interrupt (perhaps with control-C) after seeing the results, before you get another Maple prompt." >&2 redirect="" fi if [ -n "$inpipe" ]; then $RGVSH $host $user sh -c "\"DISPLAY=$rdisplay togeomview $gopt ${togvopts} $inpipe $togvargs $redirect\"" <$inpipe else $RGVSH $host $user sh -c "\"DISPLAY=$rdisplay togeomview $gopt ${togvopts} $togvargs $redirect\"" fi else case "$1" in ""|-*) DISPLAY=$rdisplay geomview ${togvopts} $togvargs ;; *) DISPLAY=$rdisplay ${togvopts} $togvargs;; esac fi geomview-1.9.5/src/bin/geomutil/maple2oogl/README.gvplot0000644000175000017500000002112512310110176017701 00000000000000 gvplot, writeoogl -- Maple 3-D graphics in Geomview Contents: Installation Outline (out of date) Maple's Library Directory Configurable Settings in gvplot Remote Display ******************************************************************************* NOTE: the installation instructions are out of date. Please have a look at `savegvplot.mws'; load that file with xmaple and try to guess what to do from the contents of that file. Nevertheless it may be helpful to read through _this_ file; it contains more information than just installation instructions. ******************************************************************************* This Maple package supports displaying Maple 3-D graphic objects (produced for example by Maple's plot3d function) in Geomview, and saving Maple graphics objects as Geomview-readable OOGL files. Maple 2-D graphics aren't supported. This distribution (in src/bin/geomutil/maple2oogl in the Geomview source distribution) includes Maple source files. You'll want to run Maple to produce library (.m) files from the source files, and possibly to install them in the Maple library directory to be accessible via readlib(gvplot). This process is handled by the "make install" command described here. Documentation for the package itself is available within Maple after installation; for example, type readlib(gvplot); ?gvplot To install this package: * Edit gvplot.mapleV3 or gvplot.mapleV4 (according to your version of Maple), possibly changing the settings of default_gvcommand and default_gvdirectories; see "Configurable Settings" and "Remote Display", below. * Determine the directory into which new Maple library (.m) files should be placed; see "Maple's Library Directory". This will be the setting of MAPLE_LIB. A typical value might be /usr/local/maple/lib. * If geomview, togeomview, and remotegv aren't already on the search path of everyone who'll want to use the program, determine which directory they are (or will be) placed in, e.g. /usr/local/bin. This will be the setting of BINDIR. * If you have the source distribution, edit makefiles/mk.site.default (relative to the top of the geomview distribution) and set MAPLE_LIB and BINDIR to the appropriate values. * Make sure "maple" is on your search path. * Run make install or, if you didn't set MAPLE_LIB and BINDIR in mk.site.default, give those values explicitly on the "make" command line: make install MAPLE_LIB=maple_library_directory BINDIR=binary_directory Maple V4 users: since the Geometry Center doesn't have Maple V4, we haven't been able to test that "make install" correctly determines the version of Maple if you have release 4. If you have trouble, try invoking the MapleV4 installation directly with make install_v4 MAPLE_LIB=maple_lib_dir BINDIR=binary_dir MAPLE'S LIBRARY DIRECTORY For convenient invocation, it's best to put the compiled Maple code for this package -- the file gvplot.m -- in some directory known to Maple. Users can then invoke it by typing readlib(gvplot); Since Maple V.2, Maple keeps a list of library directory names in the global variable "libname". Its default value is typically the single directory `/usr/local/maple/lib`; you can check its actual value by running Maple and typing libname; You can configure Maple to add other directories (e.g. for locally- installed rather than Maple-supplied packages) to the libname list for all users. Briefly, you create a "src" subdirectory of the default library directory (e.g. /usr/local/maple/lib/src) and create a file there named "init" containing something like libname := libname, `/usr/local/maple/otherstuff`: You could then place library files in /usr/local/maple/otherstuff, and/or set MAPLE_LIB = /usr/local/maple/otherstuff in makefiles/mk.site.default. Configurable Settings in gvplot Two values in the "gvplot" script are configurable: default_gvcommand, the UNIX command used to invoke geomview. It's normally "geomview", but might specify some geomview options, or might be "remotegv" if you'll want to run maple on one system and display via geomview on another. default_gvdirectories, the directory(ies) (in addition to those in the normal UNIX search path) to find the programs "togeomview" and "geomview". There's no default; this is correct if these programs are installed on everyone's search path, e.g. in /usr/local/bin. This value is automatically configured as part of the "make install" process and probably won't need to be messed with. It can be set to a colon-separated list of directories. It can be useful to invoke something other than simply "geomview" to display Maple graphics; for example, one might start geomview with options to position its window, or with a special startup script. To adjust this, change the setting of "gvcommand" near line 45, as in default_gvcommand := `geomview -nopanels -wpos 640x480@0,0`; To regenerate the library (.m) file after such changes, start a fresh Maple session, read the source file, and save the library file: read(`gvplot`); save(`/usr/local/maple/lib/gvplot.m`); REMOTE DISPLAY It's possible to run Maple on one system and display Geomview graphics on another. This can sometimes be done by using the X "DISPLAY" environment variable, so that Maple and Geomview run on one machine but Geomview's windows appear elsewhere. But for fastest graphics, it's better if you can run Geomview on the computer where the display is. To have the gvplot package invoke Geomview on another machine, make it invoke "remotegv" rather than "geomview". You can make "remotegv" the default for all gvplot users by editing the gvplot source and changing the setting of "default_gvcommand" near line 45. Or, a user can adjust the setting of "gvcommand" within each session, saying e.g. readlib(gvplot); gvcommand := `remotegv -h slevy@gauss`; remotegv attempts to guess which machine to invoke geomview on by examining the DISPLAY environment variable. If DISPLAY isn't set or if geomview should run on a different machine, use the -h host option. The script also assumes that geomview should display on the machine where it is invoked, so for that copy of geomview, it sets DISPLAY to ":0". If the display should appear elsewhere (on an X terminal, say), use the -display option. Remotegv uses "rsh" (remote shell) to pass data to the other computer, so the remote computer must allow this -- either with an entry in /etc/hosts.equiv, or in a .rhosts file in the user's home directory on the machine where geomview will run. The account name on the other machine is assumed to be the same as on this machine; if different, use the -l username or -h username@othermachine options. In case permissions are not set up correctly, the symptom is liable to be a "Permission denied." message followed by the immediate termination of the Maple process -- so if you're using it for the first time, check it out before doing much else in your Maple session! Sorry, but MapleV3 is just not very good at connecting to other programs. Note that togeomview and geomview MUST BE IN THE USER'S DEFAULT SEARCH PATH on the remote machine. To use this script within Maple, you'd say: readlib(gvplot); then gvcommand := `remotegv`; or e.g. gvcommand := `remotegv -h othermachine -display myxterm:0`; or, if the account on the other machine is different from yours, gvcommand := `remotegv -l otheraccount`; or gvcommand := `remotegv -h otheraccount@othermachine`; Following any remotegv options, you can add the command to be invoked as geomview, possibly including options, as in: gvcommand := `remotegv -l person /u/person/bin/geomview -wpos 300x200`; Once gvcommand is properly set, you can use gvplot() as usual. Normally, error messages reporting problems on the other machine (for example, being unable to run geomview) are suppressed; this is unfortunately necessary, or you'd never get another Maple prompt until quitting from geomview. There's a test mode to aid in tracing problems; use it as in gvcommand := `remotegv -test -h othermachine`; i.e. add "-test" to whatever other options you'd give to remotegv. Summary of remotegv options: -l user or -l user@host -h host or -h user@host -display host:number (set display on remote end) -test also accepts togeomview's options (-g, -M[c][g][p][s]). Invokes rsh to specified machine, invokes togeomview there by default. By default, we assume DISPLAY points to the machine where we'd like to be; -h {host-portion-of-DISPLAY} -display :0 Incorporates settings from "$RGVOPTS" environment variable. geomview-1.9.5/src/bin/geomutil/maple2oogl/gvplot.mapleV40000644000175000017500000006444412310110176020267 00000000000000########################## ## ## Title : writeoogl, a package for converting maple PLOT3D ## objects to Geomview data objects. ## gvplot, interactive pipe to Geomview from Maple ## ## Created : Dec 5 1993 ## ## Authors : Frederick Wicklin and ## Stuart Levy ## The Geometry Center ## ## Documentation : currently ?gvplot or ?writeoogl or ?geomview ## ## History ## fjw 9/21/93 initial maple->geomview for Maple VR2 ## slevy 11/27/93 interactive geomview pipe; ## backwards compatable to Maple V ## fjw 11/29/93 debugging; added color options ## ## lr (renggli@math.fsu.edu) 03/28/97 ## modifications for Maple VR4 (replaced gc() calls) ## ## ## Usage: readlib(gvplot); ## (optional) gvcommand := `geomview initial-options ...`; ## (optional) gvdirectories := `/some/dir/ectory:/other/dir...`; ## 3dplot_struct := plot3d( ... ): ## writeoogl(`filename`, 3dplot_struct); ## gvplot(3dplot_struct); # To search for "geomview" and "togeomview" in directories which might not # be on the default UNIX search path, list those director(ies) here, as in # default_gvdirectories := `/u/geom/bin:/usr/local/bin:` # or, set the "gvdirectories" variable before invoking gvplot(). default_gvdirectories := ``: # To start geomview with non-default options, or to start another program # via gvplot, put its name and initial arguments here in place of `geomview`, # or set the variable "gvcommand" before invoking gvplot(). # Changing default_gvcommand, then resaving gvplot.m, alters the default for # all users; setting the gvcommand variable changes it for just your session. default_gvcommand := `geomview`: ### Upon invoking the geomview package, maple creates a global ### variable UsEr_ID__ which is assigned a "random" number. ### This variable is used to create user-specific files in /tmp. ################################################################## # There doesn't seem to be any explicit test for Maple V1 vs. V2, # but all V1 plot objects seem to begin with FUNCTION, so use that fact # to detect that we must be careful not to print invalid float constants. ################################################################## `oogl/lprn` := `oogl/lprnV2`: writeoogl := proc() global `oogl/lprn`; local header, item, ps, zlist, plist, llist, ppoint, pcolor, appear, i, j, totl, xrange, yrange, nx, ny, savedprintbytes, coloron,colorlist,ccnt, totalverts; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; if nargs > 2 or nargs = 0 then ERROR(`Usage:writeoogl(``filename``,3dplot_struct); OR writeoogl(3dplot_struct);`) fi; ps := args[nargs]; if not type(ps, PLOT3D) then ERROR(`Invalid plot structure`,ps, `; must be of type PLOT3D, as from plot3d(), tubeplot(), spacecurve(), etc.`) fi; if nargs = 2 and not type(args[1], string) then ERROR(`Invalid file name (not string)`, args[1]) fi; if nops(ps) < 1 then ERROR(`Empty 3D plot structure!`) fi; ################################################################## # When run in command-line mode, Garbage Collection (GC) # # messages printed to terminal can interfere with the data flow. # # Therefore suppress GC during writing of GeomView data # ################################################################## if nargs = 2 then savedprintbytes:=kernelopts( printbytes): kernelopts( printbytes=false): print(`Saving Maple 3D structs to Geomview file`, args[1]); writeto(args[1]); fi; xrange := 'xrange'; # nullify this local variable appear := find_appearance(1, ps); lprint( appear, `{LIST` ); ################################################################## ### BEGIN main loop over all 3D plots (may be a list of plots) ### ################################################################## for item in ps do coloron := FALSE; # default is no color info header := op(0,item); if header = FUNCTION then # Maple V1 only: FUNCTION( f(x,y), xrange, yrange ) # or FUNCTION( x(u,v), y(u,v), z(u,v), u = u0..u1, v = v0..v1 ) xrange := op(nops(item)-1, item); if type(xrange, `=`) then xrange := op(2, xrange) fi; yrange := op(nops(item), item); if type(yrange, `=`) then yrange := op(2, yrange) fi; # Maple V1 -- don't trust lprint() `oogl/lprn` := `oogl/lprnV1`; ########################### GRID ############################ # EX: plot3d( f(x,y), x=xmin..xmax, y=ymin..ymax] # Saving Maple GRID struct to geomview ZMESH struct # Maple V1: FUNCTION( f(x,y), xrange,yrange ) followed by GRID( zlist ) # In Maple V1, we might see either ZMESH-style data (only Z per vertex) # or a full 3-D mesh (x,y,z per vertex). Just check the first # vertex to see. # Maple V2: GRID( xrange, yrange, zlist ) # Maple V2 uses GRID only for ZMESH-style data, # and uses a MESH header for meshes with general 3-D verts. ############################################################### elif header = GRID then if type(xrange, `..`) then zlist := item else # this is typical VR2 route xrange := op(1, item); yrange := op(2, item); zlist := op(3, item); ####################################################### # if color, then there are 4 possibilities: # colorlist = COLOR(HUE, h[1],...,h[nops[colorlist]) # colorlist = COLOR(HUE, h) # colorlist = COLOR(RGB, r[1],g[1],b[1],...) # colorlist = COLOR(RGB, r,g,b) # Convert HUES to an RGB value using HSV2RGB and # (assume that Maple uses s=v=1). Add a 1 at the end of # the list for geomview's "alpha": 0<=>transparent, 1<=>opaque ####################################################### if( nops(item)>3 ) then colorlist := find_colorlist(4, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; fi; nx := nops(zlist); ny := nops(op(1,zlist)); if type(op(1, op(1,zlist)), list) then lprint(`{ { MESH`, ny, nx) else # scale this data by wrapping it in transformation matrix lprint(`{ INST transform { `); `oogl/lprn`( [0, (op(2,yrange)-op(1,yrange)) / (ny-1), 0, 0] ); `oogl/lprn`( [(op(2,xrange)-op(1,xrange)) / (nx-1), 0, 0, 0] ); lprint(0, 0, 1, 0); `oogl/lprn`( [op(1,xrange), op(1,yrange), 0, 1] ); if(coloron = FALSE) then lprint(` } geom { ZMESH`, ny, nx); # gv type else lprint(` } geom { CZMESH`, ny, nx); # color gv type fi; fi; ccnt := 2; # set color counter to 2 for plist in zlist do for ppoint in plist do `oogl/lprn`(ppoint); if (coloron = HUE) and nops(colorlist)>2 then lprint(HSV2RGB(op(ccnt,colorlist), 1,1), 1); ccnt := ccnt + 1; elif (coloron = HUE) and nops(colorlist)=2 then lprint(HSV2RGB(op(2,colorlist), 1,1), 1); elif (coloron = RGB) and nops(colorlist)>4 then lprint(op(ccnt,colorlist),op(ccnt+1,colorlist),op(ccnt+2,colorlist),1); ccnt := ccnt + 3; elif (coloron = RGB) and nops(colorlist)=4 then lprint(op(2,colorlist),op(3,colorlist),op(4,colorlist), 1); fi; od; od; lprint( `} }`); ########################### MESH ########################### # EX: plot3d( [x(s,t), y(s,t), z(s,t)], s=smin..smax, t=tmin..tmax] # Saving Maple MESH struct to geomview MESH struct ############################################################### elif header = MESH then llist := op(1, item): if( nops(item)>1 ) then colorlist := find_colorlist(2, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; if(coloron=FALSE) then lprint(`{ MESH ` ); # gv type else lprint(`{ CMESH ` ); # color gv type fi; lprint( nops(llist)); # num x elements lprint( nops(op(1,llist)) ); # num y elements # Maple store points in row-dominant manner # But geomview want column-dominant, so need to # print out the transpose of the matrix in the plot3d struct nx := nops(llist); # maple rows ny := nops(op(1,llist)); # maple cols for j from 1 to ny do for i from 1 to nx do ppoint := op(j, op(i,llist)); `oogl/lprn`(ppoint); if (coloron = HUE) and nops(colorlist)>2 then lprint(HSV2RGB(op((i-1)*ny+j +1,colorlist), 1,1), 1); elif (coloron = HUE) and nops(colorlist)=2 then lprint(HSV2RGB(op(2,colorlist), 1,1), 1); elif (coloron = RGB) and nops(colorlist)>4 then lprint(op(3*((i-1)*ny+j-1)+2,colorlist),op(3*((i-1)*ny+j-1)+3,colorlist),op(3*((i-1)*ny+j-1)+4,colorlist),1); elif (coloron = RGB) and nops(colorlist)=4 then lprint(op(2,colorlist),op(3,colorlist),op(4,colorlist), 1); fi; od; od; lprint( `}`); ########################### CURVES ########################## # EX: spacecurve( [x(t), y(t), z(t)], t=tmin..tmax] # Saving Maple CURVES struct to geomview VECT struct ############################################################### elif header = CURVES then llist := select(type, item, list); if( nops(item)>1 ) then colorlist := find_colorlist(2, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; lprint(`{ VECT `); # gv type # Number of polylines, total vertices. totalverts := sum('nops(op(i,llist))', 'i'=1..nops(llist)); lprint(nops(llist), totalverts); if coloron=FALSE then lprint(1); # One color in all lprint(seq(nops(op(i,llist)), i=1..nops(llist))); # Vertex counts lprint(1, 0 $ 'i'=2..nops(llist)); # Color counts. else lprint(totalverts); # Total number of colors, 1 per vert lprint(seq(nops(op(i,llist)), i=1..nops(llist))); # Vertex counts lprint(seq(nops(op(i,llist)), i=1..nops(llist))); # color per vert fi; for plist in llist do for ppoint in plist do # print all vertices `oogl/lprn`(ppoint); od od; if coloron=FALSE then lprint(1,1,1,1); # color RGBA = white and opaque elif (coloron = HUE) and nops(colorlist)>2 then for ccnt from 2 to nops(colorlist) do lprint(HSV2RGB(op(ccnt,colorlist), 1,1), 1); od; elif (coloron = HUE) and nops(colorlist)=2 then for ccnt from 1 to nops(llist) do lprint(HSV2RGB(op(2,colorlist), 1,1), 1); od; elif (coloron = RGB) and nops(colorlist)>4 then for ccnt from 2 by 3 to nops(colorlist) do lprint(op(ccnt,colorlist),op(ccnt+1,colorlist),op(ccnt+2,color\list),1); od; elif (coloron = RGB) and nops(colorlist)=4 then for ccnt from 1 to nops(llist) do lprint(op(2,colorlist),op(3,colorlist),op(4,colorlist),1); od; fi; lprint( `}`); ######################### POLYGONS ########################## #EX:polygonplot3d([seq([seq([x(s,t),y(s,t),z(s,t)],s=smin..smax],tmin..tmax])): # Polygons are handled differently than the other objects w/r/t # color. Leave color alone and let user change color using geomview. ############################################################### elif header = POLYGONS then pcolor := i $ i=1..0; # Empty sequence totl := 0: nx := 0: # use nx to count number of polygons for llist in item do # sequence of lists POLY(),COLOR(), if type(llist,list) then nx := nx + 1; # number of polygons totl := totl + nops(llist); # compute total number of vertices fi od; lprint(find_appearance(1, item)); # if coloron=FALSE then lprint(`{ OFF `); # gv type # else # lprint(`{ COFF `); # color # fi; lprint(totl, nx, 0); # total verts,polygons,"edges"(not used!) for llist in item do if type(llist,list) then for ppoint in llist do `oogl/lprn`(ppoint); # List of vertices od; fi; od; lprint(``); totl := 0; for llist in item do if type(llist,function) and (op(0,llist)=COLOR or op(0,llist)=COLOUR) then colorlist := llist; if op(1,llist)=HUE and nops(colorlist)=2 then pcolor := HSV2RGB(op(2,colorlist),1,1); # use ppoint for RGB elif op(1,llist)=RGB and nops(colorlist)=4 then pcolor := op(2..4,colorlist); fi; elif type(llist,list) then ## There are only two possibilities for POLYGONS ## ## In both cases, it means entire polygon is same color ## lprint( nops(llist), i $ i=totl..totl+nops(llist)-1, ` `, pcolor); totl := totl + nops(llist); fi; od; lprint( `}`); ######################### POINTS ########################## #EX:PLOT3D(POINTS([0,0,1],[1,0,0],[0,1,0])); ############################################################### elif header = POINTS then lprint(`{ VECT`, nops(item), nops(item), 0); for plist in item do lprint(`1`) od; lprint(``); for plist in item do lprint(`0`) od; lprint(``); for ppoint in item do `oogl/lprn`(ppoint) od; lprint(`}`); ########################### TEXT ############################ # 3D plots using the "plots" package may include TEXT # This is not supported ############################################################### elif header = TEXT then print(` `); fi; od; # END main for loop lprint( `}`); if nargs = 2 then writeto(terminal); kernelopts( printbytes=savedprintbytes): fi; NULL; end: gvplot := proc() global UsEr_ID__, gvcommand, default_gvcommand, gvdirectories, default_gvdirectories; local gvname, gvcmd, gvdirs, ps, savedprintbytes, tmp_fname; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; ### Set up filename to use as temporary site for data. ### ### Take file in /tmp and postfix number which is (hopefully) ### ### independent of users. Eg, if user1 and user2 are both ### ### using writeoogl, then they will be writing to different ### ### files. This is UNIX specific (but so is Geomview). ### if UsEr_ID__ = 'UsEr_ID__' then UsEr_ID__ := (round( rand() * (time()+1) ) mod 9999) + 1; fi; tmp_fname := `Maple`.(UsEr_ID__); ### Let user specify, via "gvcommand" and "gvdirectories" global vars, ### which program/args to run when invoking geomview, ### and how to set the search path to find it and togeomview. if gvcommand <> 'gvcommand' then gvcmd := gvcommand else gvcmd := default_gvcommand fi; if gvdirectories <> 'gvdirectories' then gvdirs := gvdirectories else gvdirs := default_gvdirectories fi; ps := args[nargs]; gvname := `Maple`; if nargs < 1 or nargs > 2 then ERROR(`Usage: gvplot(3dplot_structure) -or- gvplot(``name``, 3dplot_structure)`); fi; if nargs > 1 then gvname := args[1] fi; if not type( ps, PLOT3D) then ERROR(`Invalid plot structure`,ps, `; must be of type PLOT3D, as from plot3d(), tubeplot(), spacecurve(), etc.`) fi; # start geomview reading from stdin if system( `PATH=` . gvdirs . `:$PATH togeomview -Mcp `.tmp_fname.` `.gvcmd.` 0 then ERROR(`gvplot: togeomview: Can't start a copy of geomview. `. `If "togeomview" or "geomview" were not found `. `try setting the variable "gvdirectories" to the name of the directory where `. `they're installed (or to a colon-separated list of directories).`); fi; savedprintbytes:=kernelopts( printbytes): kernelopts( printbytes=false): writeto(`/tmp/geomview/`.tmp_fname); lprint(`(geometry`, gvname); writeoogl( ps ); lprint(`)`); writeto(terminal); kernelopts( printbytes=savedprintbytes): NULL; end: gvcommand := proc() global UsEr_ID__, gvcommand, default_gvcommand, gvdirectories, default_gvdirectories; local gvname, gvcmd, gvdirs, ps, savedprintbytes, tmp_fname; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; ### Set up filename to use as temporary site for data. ### ### Take file in /tmp and postfix number which is (hopefully) ### ### independent of users. Eg, if user1 and user2 are both ### ### using writeoogl, then they will be writing to different ### ### files. This is UNIX specific (but so is Geomview). ### if UsEr_ID__ = 'UsEr_ID__' then UsEr_ID__ := (round( rand() * (time()+1) ) mod 9999) + 1; fi; tmp_fname := `Maple`.(UsEr_ID__); ### Let user specify, via "gvcommand" and "gvdirectories" global vars, ### which program/args to run when invoking geomview, ### and how to set the search path to find it and togeomview. if gvcommand <> 'gvcommand' then gvcmd := gvcommand else gvcmd := default_gvcommand fi; if gvdirectories <> 'gvdirectories' then gvdirs := gvdirectories else gvdirs := default_gvdirectories fi; # start geomview reading from stdin if system( `PATH=` . gvdirs . `:$PATH togeomview -Mcp `.tmp_fname.` `.gvcmd.` 0 then ERROR(`gvplot: togeomview: Can't start a copy of geomview. `. `If "togeomview" or "geomview" were not found `. `try setting the variable "gvdirectories" to the name of the directory where `. `they're installed (or to a colon-separated list of directories).`); fi; savedprintbytes:=kernelopts( printbytes): kernelopts( printbytes=false): writeto(`/tmp/geomview/`.tmp_fname); lprint(args); writeto(terminal); kernelopts( printbytes=savedprintbytes): NULL; end: # possible gvplot enhancements: # allow remote display? # Maybe use a two-step Rube Goldberg hookup with an external converter # that directly reads lprint() format. Likely to be faster for large objects. # Then gvplot would read # gvplot := proc() # ... # if system(`togeomview -Mcp Maple.raw maple2oogl -togeomview -Mcp Maple`)<>0 # then ERROR(...) fi; # writeto(`/tmp/geomview/Maple.raw`); # lprint(`(geometry`, gvname, `<<`); # lprint(3dplot_struct); # lprint(`>>)`); # writeto(terminal); # end: # and writeoogl would read # writeoogl := proc() # ... # if system(cat(`togeomview -Mcp Maple.rawdata maple2oogl -o `, fname)) <> 0 # then ERROR(...) fi; # writeto(`/tmp/geomview/Maple.rawdata`); # lprint(`<<', 3dplot_string, `>>'); # writeto(terminal); # end: # # Here 'togeomview' is actually being used to start 'maple2oogl' rather # than geomview itself. In the first case, maple2oogl -togeomview would # invoke code to start a copy of geomview. # Help information for writeoogl `help/text/writeoogl` := TEXT( ` `, `HELP FOR: writeoogl, gvplot `, ` `, `CALLING SEQUENCE: `, ` readlib(gvplot): `, ` writeoogl( ``filename``, 3dplot_struct ); `, ` writeoogl( 3dplot_struct ); `, ` gvplot( 3dplot_struct ); `, ` gvplot( ``geomview_name``, 3dplot_struct ) `, ` `, `PARAMETERS: `, ` filename the file which will contain the Geomview data `, ` 3dplot_struct a Maple PLOT3D data structure `, ` geomview_name name of the object in the Geomview browser `, ` `, `SYNOPSIS: `, ` writeoogl() accepts Maple PLOT3D structures and writes files `, ` readable by Geomview. gvplot() converts Maple PLOT3D structures`, ` and displays them immediately using Geomview, starting a copy of`, ` Geomview if necessary.`, ``, ` Supported data types include the Maple structures MESH, GRID, `, ` CURVES, POINTS, and POLYGONS. `, ` See ?plot3d[structure] for more information on Maple PLOT3D types.`, ` `, ` The Maple MESH and GRID structures are translated into Geomview's`, ` MESH and ZMESH objects, respectively, Maple CURVES and POINTS`, ` become VECT objects, and Maple POLYGONS becomes an OFF object.`, ` `, ` The Maple TEXT structure is not supported. Color information is`, ` supported for all objects.`, ``, ` The form writeoogl(filename, plot_struct) writes data in OOGL`, ` (Geomview) form to the given file; writeoogl(plot) writes to the`, ` current output stream as selected by writeto().`, ``, ` gvplot() normally starts the program "geomview", with no options;`, ` to specify something else, set the variable "gvcommand", as in:`, ` gvcommand := ``/usr/local/bin/gv -wpos 200x200 -c startup.gv``;`, ` before invoking gvplot(). Also, if the programs "geomview" or`, ` "togeomview" are not on your UNIX search path, set the variable`, ` gvdirectories := ``/some/dir/ectory:/some/other/directory``;`, ` to the appropriate directory (or directories separated by colons).`, ` `, `EXAMPLES: `, ` readlib(gvplot): `, ` my_plot := plot3d(sin(x+y), x=-Pi..Pi, y=-Pi..Pi): `, ` writeoogl( ``sinxy.mesh``, my_plot ); `, ` Saving Maple 3D structs to Geomview file, sinxy.mesh `, ` steiner := plot3d([ sin(2*x)*(cos(y))^2, sin(x)*sin(2*y), `, ` cos(x)*sin(2*y)], x=-Pi..Pi, y=-Pi..Pi): `, ` writeoogl( ``steiner.mesh``, steiner); `, ` Saving Maple 3D structs to Geomview file, steiner.mesh`, ` # Display it in geomview directly `, ` gvplot( steiner ); `, ` # load in the plots package `, ` with(plots): `, ` trefoil := spacecurve([ -2*cos(t)- 1/2*cos(5*t)+ 3*sin(2*t), `, ` -3*cos(2*t)+ 2*sin(t)- 1/2*sin(5*t), 2*cos(3*t), t=0..2*Pi]):`, ` writeoogl( ``trefoil.vect``, trefoil); `, ` Saving Maple 3D structs to Geomview file, trefoil.vect`, ` tetrahedra := [[1,0,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,0,1],[0,1,0]], `, ` [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,1,0],[-1,0,0]]:`, ` Tplot :=polygonplot3d([tetrahedra]): `, ` writeoogl( ``tetrahedra.off``, Tplot); `, ` Saving Maple 3D structs to Geomview file, tetrahedra.off`, ` # you can even create a single file with multiple objects `, ` all_objs := display3d( {my_plot, steiner, trefoil, Tplot} ): `, ` writeoogl( ``all.list``, all_objs ); `, ` Saving Maple 3D structs to Geomview file, all.list `, ` `, `SEE ALSO: plot3d[structure] ` ): `help/text/gvplot` := `help/text/writeoogl`: `help/text/geomview` := `help/text/writeoogl`: # Convert number to string, avoiding excess digits and avoiding Maple V1's # propensity to emit Float(mantissa,exponent) rather than ordinary exponential # notation! `oogl/cvs` := proc(v) local sign, absmant; options `Copyright 1993 by Stuart Levy, Geometry Center`; if type(v, float) then absmant := cat(abs(op(1,v))); sign := substring(`-`, 1..1-signum(v)); if abs(v) >= 1 then if(op(2,v) >= 0) then cat(op(1,v), '0' $ op(2,v)) else cat( sign, substring(absmant, 1..length(absmant)+op(2,v)), `.`, substring(absmant, length(absmant)+op(2,v)+1..8) ) fi elif abs(v) > .000001 then cat( sign, substring( `.0000000`, 1 .. 1-length(absmant)-op(2,v) ), substring(absmant, 1..7) ) else cat( sign, `.`, substring( absmant, 1..7), `e`, op(2,v) + length(absmant) ) fi elif type(v, realcons) then cat(v) fi; end: # # lprint a number, or a list of numbers. # `oogl/lprnV1` := proc (v) local i; options `Copyright 1993 by Stuart Levy, Geometry Center`; if type(v, list) then lprint( ' `oogl/cvs`(v[i]) ' $ i=1..nops(v) ); elif type(v,float) and abs(v) <= .1 then lprint(`oogl/cvs`(v)); elif type(v, realcons) then lprint(v); else lprint(`0 #`); fi; end: # Ditto, but assume we're Maple V2, which prints floating constants # in acceptable form. Don't bother to reformat them. `oogl/lprnV2` := proc(v) local i; options `Copyright 1993 by Stuart Levy, Geometry Center`; if type(v, list) then lprint( 'v[i]' $ i = 1..nops(v) ); # Print on one line elif type(v, realcons) then lprint(v); else lprint(`0 #`); fi end: ############################################################### ## HSV2RGB converts Maple Hues to RGB colors. ## The HUEs used are in [0,1] so assume that S=V=1 (this is close) ## The following algorithm is from Computer Graphics ## By Foley, vanDam, Feiner, Hughes, 2nd Ed. Addison-Wesley ## p 593 ## ## Adapted by fjw 11/29/93 ## Input: (h,s,v) in [0,1]^3 ## Output: sequence r,b,g each in [0,1] ############################################################### HSV2RGB := proc( h,s,v ) local hh,ip,fp,p,q,t; options `Copyright 1990 by Foley, vanDam, Feiner, Hughes`; if (s = 0) then # color on B/W center line if (h<0) then # There is no hue,ie, hue undefined RETURN( v,v,v ); else ERROR(`Undefined color`); fi; else if (h>1) then hh:=1 fi; hh := 6*h; # hh now in [0,6] ip := floor(hh); # ip is integer part of h fp := hh - ip; # fp is fractional part of h p := v*(1-s); q := v*(1-(s*fp)); t := v*(1-(s*(1-fp))); if (ip=0) then RETURN( v,t,p ); elif (ip=1) then RETURN( q,v,p ); elif (ip=2) then RETURN( p,v,t ); elif (ip=3) then RETURN( p,q,v ); elif (ip=4) then RETURN( t,p,v ); else RETURN( v,p,q ); fi; fi; end: ######################################################## # find_colorlist # input: n where to start looking for color data # item what list to search # output: list of color information or NULL list ######################################################## find_colorlist := proc(n,item) local i; options `Copyright 1993 by Frederick Wicklin, Geometry Center`; for i from n to nops(item) do if type(op(i,item),function) and (op(0,op(i,item))=COLOR or op(0,op(i,item))=COLOUR) then RETURN(op(i,item)) fi; od; RETURN([FALSE]); # no color info found end: ######################################################## # find_appearance # input: n index to start seeking color data # list list to search # output: argument of STYLE option (e.g. `PATCH`) or [] list. ######################################################## find_appearance := proc(n, list) local i, part, ap, color, colortype; ap := ``; color := ``; for i from n to nops(list) do part := op(i,list); if type(part,function) and (op(0,part)=COLOR or op(0,part)=COLOUR) then colortype := op(1,part); if colortype = HUE and nops(part) = 2 then color := [HSV2RGB(op(2,part), 1, 1)] elif colortype = RGB and nops(part) = 4 then color := [op(2..4,part)] fi # Otherwise, this "color" tag isn't for us elif type(part,function) and op(0,part) = STYLE then if op(1,part) = PATCH then ap := cat(ap, ` +face -edge`) elif op(1,part) = LINE or op(1,part) = WIREFRAME then ap := cat(ap, ` -face +edge`) fi elif type(part,function) and op(0,part) = THICKNESS and type(op(1,part),integer) then ap := cat(ap, ` linewidth `, op(1,part)); fi od; if color <> `` then color := cat( op(1..3, map(v -> cat(convert(v,string),` `), color) ) ); ap := cat(ap, `\n material { edgecolor `, color, `\n diffuse `, color, `}\n`); fi; if ap <> `` then ap := cat(` appearance { `, ap, `}`) fi; RETURN(ap); end: [`writeoogl`, `gvplot`]; geomview-1.9.5/src/bin/geomutil/maple2oogl/gvplot.txt0000644000175000017500000000601612310110176017565 00000000000000HELP FOR: writeoogl, gvplot CALLING SEQUENCE: readlib(gvplot): writeoogl( "filename", 3dplot_struct ); writeoogl( 3dplot_struct ); gvplot( 3dplot_struct ); gvplot( "geomview_name", 3dplot_struct ) PARAMETERS: filename the file which will contain the Geomview data 3dplot_struct a Maple PLOT3D data structure geomview_name name of the object in the Geomview browser SYNOPSIS: writeoogl() accepts Maple PLOT3D structures and writes files readable by Geomview. gvplot() converts Maple PLOT3D structures and displays them immediately using Geomview, starting a copy of Geomview if necessary. Supported data types include the Maple structures MESH, GRID, CURVES, POINTS, and POLYGONS. See ?plot3d[structure] for more information on Maple PLOT3D types. The Maple MESH and GRID structures are translated into Geomview's MESH and ZMESH objects, respectively, Maple CURVES and POINTS become VECT objects, and Maple POLYGONS becomes an OFF object. The Maple TEXT structure is not supported. Color information is supported for all objects. The form writeoogl(filename, plot_struct) writes data in OOGL (Geomview) form to the given file; writeoogl(plot) writes to the current output stream as selected by writeto(). gvplot() normally starts the program "geomview", with no options; to specify something else, set the variable "gvcommand", as in: gvcommand := "/usr/local/bin/gv -wpos 200x200 -c startup.gv"; before invoking gvplot(). Also, if the programs "geomview" or "togeomview" are not on your UNIX search path, set the variable gvdirectories := "/some/dir/ectory:/some/other/directory"; to the appropriate directory (or directories separated by colons). EXAMPLES: readlib(gvplot): my_plot := plot3d(sin(x+y), x=-Pi..Pi, y=-Pi..Pi): writeoogl( "sinxy.mesh", my_plot ); Saving Maple 3D structs to Geomview file, sinxy.mesh steiner := plot3d([ sin(2*x)*(cos(y))^2, sin(x)*sin(2*y), cos(x)*sin(2*y)], x=-Pi..Pi, y=-Pi..Pi): writeoogl( "steiner.mesh", steiner); Saving Maple 3D structs to Geomview file, steiner.mesh # Display it in geomview directly gvplot( steiner ); # load in the plots package with(plots): trefoil := spacecurve([ -2*cos(t)- 1/2*cos(5*t)+ 3*sin(2*t), -3*cos(2*t)+ 2*sin(t)- 1/2*sin(5*t), 2*cos(3*t), t=0..2*Pi]): writeoogl( "trefoil.vect", trefoil); Saving Maple 3D structs to Geomview file, trefoil.vect tetrahedra := [[1,0,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,0,1],[0,1,0]], [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,1,0],[-1,0,0]]: Tplot :=polygonplot3d([tetrahedra]): writeoogl( "tetrahedra.off", Tplot); Saving Maple 3D structs to Geomview file, tetrahedra.off # you can even create a single file with multiple objects all_objs := display3d( {my_plot, steiner, trefoil, Tplot} ): writeoogl( "all.list", all_objs ); Saving Maple 3D structs to Geomview file, all.list SEE ALSO: plot3d[structure] geomview-1.9.5/src/bin/geomutil/maple2oogl/gvplot.mapleV80000644000175000017500000007227012310110176020267 00000000000000########################### Hey, Emacs, we're -*-maplev-*- mode! ## ## Title : writeoogl, a package for converting maple PLOT3D ## objects to Geomview data objects. ## gvplot, interactive pipe to Geomview from Maple ## ## Created : Dec 5 1993 ## ## Authors : Frederick Wicklin and ## Stuart Levy ## The Geometry Center ## ## Revised : 2003 ## Claus-Justus Heine, Abteilung fuer Angewandte Mathematik, ## Universitaet Freiburg. ## ## ## Documentation : currently ?gvplot or ?writeoogl or ?geomview ## ## History ## fjw 9/21/93 initial maple->geomview for Maple VR2 ## slevy 11/27/93 interactive geomview pipe; ## backwards compatable to Maple V ## fjw 11/29/93 debugging; added color options ## ## lr (renggli@math.fsu.edu) 03/28/97 ## modifications for Maple VR4 (replaced gc() calls) ## ## ## Usage: readlib(gvplot); ## (optional) gvcommand := `geomview initial-options ...`; ## (optional) gvdirectories := `/some/dir/ectory:/other/dir...`; ## 3dplot_struct := plot3d( ... ): ## writeoogl(`filename`, 3dplot_struct); ## gvplot(3dplot_struct); geomview := module() option `Copyright (C) 2003 by Claus-Justus Heine, Department for Applied Mathematics, Freiburg University. Heavily based on gvplot, Copyright (C) 1993 by Frederick Wicklin and Stuart Levy, Geometry Center.`; description `Geomview interface for MapleV8`; export gvdirectories, gvcommand, fwriteoogl, writeoogl, gvplot, gvsendcmd; local default_gvdirectories, default_gvcommand, `oogl/lprn`, HSV2RGB, find_colorlist, find_appearance, make_tmpname, print_colorlist, find_view, make_localtmpname; global `gvplot/User_ID`; # To search for "geomview" and "togeomview" in directories which might not # be on the default UNIX search path, list those director(ies) here, as in # default_gvdirectories := `/u/geom/bin:/usr/local/bin:` # or, set the "gvdirectories" variable before invoking gvplot(). default_gvdirectories := ``: # To start geomview with non-default options, or to start another program # via gvplot, put its name and initial arguments here in place of `geomview`, # or set the variable "gvcommand" before invoking gvplot(). # Changing default_gvcommand, then resaving gvplot.m, alters the default for # all users; setting the gvcommand variable changes it for just your session. default_gvcommand := `geomview`: ### Set up filename to use as temporary site for data. ### ### Take file in /tmp and postfix number which is (hopefully) ### ### independent of users. Eg, if user1 and user2 are both ### ### using writeoogl, then they will be writing to different ### ### files. This is UNIX specific (but so is Geomview). ### make_tmpname := proc() local tmp_fname; if `gvplot/User_ID` = '`gvplot/User_ID`' then `gvplot/User_ID` := (round( rand() * (time()+1) ) mod 9999) + 1; fi; tmp_fname := `Maple`||(`gvplot/User_ID`); return(tmp_fname); end; make_localtmpname := proc() local tmp_fname, id; id := (round( rand() * (time()+1) ) mod 9999) + 1; tmp_fname := `/tmp/`||`Maple`||`id`; return(tmp_fname); end; ### Upon invoking the geomview package, maple creates a global ### variable `gvplot/User_ID` which is assigned a "random" number. ### This variable is used to create user-specific files in /tmp. ################################################################## # There doesn't seem to be any explicit test for Maple V1 vs. V2, # but all V1 plot objects seem to begin with FUNCTION, so use that fact # to detect that we must be careful not to print invalid float constants. ################################################################## writeoogl := proc() option `Copyright (C) 2003 by Claus-Justus Heine, Department for Applied Mathematics, Freiburg University. All rights reserved.`; description `convert a MapleV8 PLOT3d() structure to OOGL`; local outfd, ps; if nargs > 2 or nargs = 0 then ERROR(`Usage:writeoogl(``filename``,3dplot_struct); OR writeoogl(3dplot_struct);`) fi; if nargs = 2 and not type(args[1], string) then ERROR(`Invalid file name (not string)`, args[1]) fi; if nargs = 2 then print(`Saving Maple 3D structs to Geomview file`, args[1]); outfd:=fopen(args[1],`WRITE`,`BINARY`); else outfd:=`default`; fi; ps := args[nargs]; try fwriteoogl(outfd, ps); finally if outfd <> `default` then fclose(outfd); fi; end try; end; # writeoogl fwriteoogl := proc() local header, item, zlist, plist, llist, ppoint, pcolor, appear, i, j, totl, xrange, yrange, nx, ny, savedprintbytes, coloron, colorlist, totalverts, tlist, npoints, view, haveview, clipcmd, clipfd, clipfname, ccnt, outfd, ps; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; if nargs <> 2 then ERROR(`Usage:fwriteoogl(file_descriptor,3dplot_struct);`) fi; outfd := args[1]; ps := args[2]; if not op(0, ps) = PLOT3D then ERROR(`Invalid plot structure`,ps, `; must be of type PLOT3D, as from plot3d(), tubeplot(), spacecurve(), etc.`) fi; if nops(ps) < 1 then ERROR(`Empty 3D plot structure!`) fi; xrange := 'xrange'; # nullify this local variable # # Some things we need to know beforehand. # appear := find_appearance(1, ps); colorlist := find_colorlist(1, ps); coloron := op(1,colorlist); view := find_view(1, ps); haveview := op(1,view); # # possibly pipe the stuff to clip(1) # if haveview <> FALSE then clipfname:=make_localtmpname(); clipfd :=outfd; outfd :=fopen(clipfname,WRITE,BINARY); fi; fprintf(outfd, "{ %s", appear); fprintf(outfd, "LIST"); ################################################################## ### BEGIN main loop over all 3D plots (may be a list of plots) ### ################################################################## for item in ps do header := op(0,item); if header = GRID then if type(xrange, `..`) then zlist := item else # this is typical VR2 route xrange := op(1, item); yrange := op(2, item); zlist := op(3, item); ####################################################### if( nops(item)>3 ) then colorlist := find_colorlist(4, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; fi; nx := op(2,[ArrayDims(zlist)][1]); # num x elements ny := op(2,[ArrayDims(zlist)][1]);# num y elements fprintf(outfd, "{ INST transform { \n"); `oogl/lprn`(outfd, [0, (op(2,yrange)-op(1,yrange)) / (ny-1), 0, 0], "\n" ); `oogl/lprn`(outfd, [(op(2,xrange)-op(1,xrange)) / (nx-1), 0, 0, 0], "\n" ); fprintf(outfd, "0 0 1 0\n"); `oogl/lprn`(outfd, [op(1,xrange), op(1,yrange), 0, 1],"\n" ); if(coloron = FALSE) then fprintf(outfd, " } geom { ZMESH %d %d\n", ny, nx); # gv type else fprintf(outfd, " } geom { CZMESH %d %d\n", ny, nx); # color gv type fi; for j from 1 to ny do for i from 1 to nx do ppoint := zlist[j][i]; `oogl/lprn`(outfd, ppoint,"\n"); print_colorlist(outfd, coloron, colorlist); od; od; fprintf(outfd, "} }\n"); ########################### MESH ########################### # EX: plot3d( [x(s,t), y(s,t), z(s,t)], s=smin..smax, t=tmin..tmax] # Saving Maple MESH struct to geomview MESH struct ############################################################### elif header = MESH then llist := op(1, item): if( nops(item)>1 ) then colorlist := find_colorlist(2, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; if(coloron=FALSE) then fprintf(outfd, "{ MESH \n" ); # gv type else fprintf(outfd, "{ CMESH \n" ); # color gv type fi; if op(0,llist) = Array then nx := op(2,[ArrayDims(llist)][1]); # num x elements ny := op(2,[ArrayDims(llist)][1]);# num y elements else nx := nops(llist); # maple rows ny := nops(op(1,llist)); # maple cols fi; fprintf(outfd, "%d\n", nx ); # num x elements fprintf(outfd, "%d\n", ny ); # num y elements # Maple store points in row-dominant manner # But geomview want column-dominant, so need to # print out the transpose of the matrix in the plot3d struct for j from 1 to ny do for i from 1 to nx do ppoint := llist[j][i]; `oogl/lprn`(outfd,ppoint,"\n"); print_colorlist(outfd, coloron, colorlist); od; od; fprintf(outfd, " }\n"); ########################### CURVES ########################## # EX: spacecurve( [x(t), y(t), z(t)], t=tmin..tmax] # Saving Maple CURVES struct to geomview VECT struct ############################################################### elif header = CURVES then llist := select(type, item, list); if( nops(item)>1 ) then colorlist := find_colorlist(2, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; fprintf(outfd, "{ VECT \n"); # gv type # Number of polylines, total vertices. totalverts := sum('nops(op(i,llist))', 'i'=1..nops(llist)); fprintf(outfd, "%d %d ", nops(llist), totalverts); if coloron=FALSE then fprintf(outfd, "1\n"); # One color in all `oogl/lprn`(outfd,[seq(nops(op(i,llist)), i=1..nops(llist))],"\n"); # Vertex counts `oogl/lprn`(outfd,[1, seq(0, i=2..nops(llist))],"\n"); # Color counts. else fprintf(outfd, "%d\n", nops(llist));# Total number of colors, 1 per polyline `oogl/lprn`(outfd,[seq(nops(op(i,llist)), i=1..nops(llist))],"\n"); # Vertex counts `oogl/lprn`(outfd,[seq(1, i=1..nops(llist))],"\n"); # Color counts. fi; for plist in llist do for ppoint in plist do # print all vertices `oogl/lprn`(outfd,ppoint,"\n"); od od; if coloron=FALSE then fprintf(outfd, "1 1 1 1\n"); # color RGBA = white and opaque else for ccnt from 1 to nops(llist) do print_colorlist(outfd, coloron, colorlist); od; fi; fprintf(outfd, " }\n"); ######################### POLYGONS ########################## #EX:polygonplot3d([seq([seq([x(s,t),y(s,t),z(s,t)],s=smin..smax],tmin..tmax])): # Polygons are handled differently than the other objects w/r/t # color. Leave color alone and let user change color using geomview. ############################################################### elif header = POLYGONS then # coloron:=FALSE; pcolor := i $ i=1..0; # Empty sequence totl := 0: nx := 0: # use nx to count number of polygons if( nops(item)>1 ) then colorlist := find_colorlist(2, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; for llist in item do # sequence of lists POLY(),COLOR(), if type(llist,list) then nx := nx + 1; # number of polygons totl := totl + nops(llist); # compute total number of vertices fi od; fprintf(outfd, "%s\n", find_appearance(1, item)); fprintf(outfd, "{ OFF \n"); # gv type fprintf(outfd, "%d %d %d\n", totl, nx, 0); # total verts,polygons,"edges"(not used!) for llist in item do if type(llist,list) then for ppoint in llist do `oogl/lprn`(outfd,ppoint,"\n"); # List of vertices od; fi; od; fprintf(outfd, "\n"); totl := 0; for llist in item do if type(llist,list) then ## There are only two possibilities for POLYGONS ## ## In both cases, it means entire polygon is same color ## tlist:=[nops(llist), i $ i=totl..totl+nops(llist)-1]; `oogl/lprn`(outfd,tlist,""); print_colorlist(outfd, coloron, colorlist); if coloron=FALSE then fprintf(outfd, "\n"); fi; totl := totl + nops(llist); fi; od; fprintf(outfd, "}\n"); ######################### POINTS ########################## #EX:PLOT3D(POINTS([0,0,1],[1,0,0],[0,1,0])); ############################################################### elif header = POINTS then colorlist := find_colorlist(2, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fprintf(outfd, "%s\n", find_appearance(2,item)); if coloron=FALSE then npoints := nops(item); fprintf(outfd, "{ VECT %d %d %d\n", npoints, npoints, 0); else npoints := nops(item) - 1; fprintf(outfd, "{ VECT %d %d %d\n", npoints, npoints, npoints); fi; fprintf(outfd, cat(seq("1\n", i=1..npoints))); fprintf(outfd, "\n"); if coloron=FALSE then fprintf(outfd, cat(seq("0\n", i=1..npoints))); else fprintf(outfd, cat(seq("1\n", i=1..npoints))); fi; fprintf(outfd, "\n"); for i from 1 to npoints do ppoint := op(i, item); `oogl/lprn`(outfd,ppoint,"\n"); od; if coloron<>FALSE then for i from 1 to npoints do print_colorlist(outfd, coloon, colorlist); od; fi; fprintf(outfd, "}\n"); ########################### TEXT ############################ # 3D plots using the "plots" package may include TEXT # This is not supported ############################################################### elif header = TEXT then fprintf(outfd, " "); fi; od; # END main for loop fprintf(outfd, "}\n"); if haveview <> FALSE then if nops(view) = 1 then clipcmd:=sprintf("clip -v 0,0,1 -g %e -l %e %s", view[1][1], view[1][2], clipfname); else clipcmd:=sprintf(cat("clip -v 1,0,0 -g %e -l %e %s |", "clip -v 0,1,0 -g %e -l %e |", "clip -v 0,0,1 -g %e -l %e"), view[1][1], view[1][2], clipfname, view[2][1], view[2][2], view[3][1], view[3][2]); fi; fclose(outfd); outfd:=clipfd; fprintf(outfd, op(2,ssystem(clipcmd))); fremove(clipfname); fi; NULL; end; gvplot := proc() local gvname, gvcmd, gvdirs, ps, tmp_fname, outfd; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; tmp_fname := make_tmpname(); ### Let user specify, via "gvcommand" and "gvdirectories" global vars, ### which program/args to run when invoking geomview, ### and how to set the search path to find it and togeomview. if gvcommand <> 'gvcommand' then gvcmd := gvcommand else gvcmd := default_gvcommand fi; if gvdirectories <> 'gvdirectories' then gvdirs := gvdirectories else gvdirs := default_gvdirectories fi; ps := args[nargs]; gvname := `Maple`; if nargs < 1 or nargs > 2 then ERROR(`Usage: gvplot(3dplot_structure) -or- gvplot(``name``, 3dplot_structure)`); fi; if nargs > 1 then gvname := args[1] fi; if not op(0, ps) = PLOT3D then ERROR(`Invalid plot structure`,ps, `; must be of type PLOT3D, as from plot3d(), tubeplot(), spacecurve(), etc.`) fi; # start geomview reading from stdin if system( `PATH=` || gvdirs || `:$PATH togeomview -cp `||tmp_fname||` `||gvcmd||` 0 then ERROR(`gvplot: togeomview: Can't start a copy of geomview. `|| `If "togeomview" or "geomview" were not found `|| `try setting the variable "gvdirectories" to the name of the directory where `|| `they're installed (or to a colon-separated list of directories).`); fi; outfd:=fopen(`/tmp/geomview/`||tmp_fname,WRITE,BINARY); try fprintf(outfd, "(geometry %s\n", gvname); fwriteoogl( outfd, ps ); fprintf(outfd, ")\n"); finally fclose(outfd); end try; NULL; end; gvsendcmd := proc() local gvname, gvcmd, gvdirs, ps, savedprintbytes, tmp_fname; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; tmp_fname := make_tmpname(); ### Let user specify, via "gvcommand" and "gvdirectories" global vars, ### which program/args to run when invoking geomview, ### and how to set the search path to find it and togeomview. if gvcommand <> 'gvcommand' then gvcmd := gvcommand else gvcmd := default_gvcommand fi; if gvdirectories <> 'gvdirectories' then gvdirs := gvdirectories else gvdirs := default_gvdirectories fi; # start geomview reading from stdin if system( `PATH=` || gvdirs || `:$PATH togeomview -Mcp `||tmp_fname||` `||gvcmd||` 0 then ERROR(`gvplot: togeomview: Can't start a copy of geomview. `|| `If "togeomview" or "geomview" were not found `|| `try setting the variable "gvdirectories" to the name of the directory where `|| `they're installed (or to a colon-separated list of directories).`); fi; savedprintbytes:=kernelopts( printbytes): kernelopts( printbytes=false): writeto(`/tmp/geomview/`||tmp_fname); lprint(args); writeto(terminal); kernelopts( printbytes=savedprintbytes): NULL; end; # possible gvplot enhancements: # allow remote display? # Maybe use a two-step Rube Goldberg hookup with an external converter # that directly reads lprint() format. Likely to be faster for large objects. # Then gvplot would read # gvplot := proc() # ... # if system(`togeomview -Mcp Maple.raw maple2oogl -togeomview -Mcp Maple`)<>0 # then ERROR(...) fi; # writeto(`/tmp/geomview/Maple.raw`); # lprint(`(geometry`, gvname, `<<`); # lprint(3dplot_struct); # lprint(`>>)`); # writeto(terminal); # end; # and writeoogl would read # writeoogl := proc() # ... # if system(cat(`togeomview -Mcp Maple.rawdata maple2oogl -o `, fname)) <> 0 # then ERROR(...) fi; # writeto(`/tmp/geomview/Maple.rawdata`); # lprint(`<<', 3dplot_string, `>>'); # writeto(terminal); # end; # # Here 'togeomview' is actually being used to start 'maple2oogl' rather # than geomview itself. In the first case, maple2oogl -togeomview would # invoke code to start a copy of geomview. `oogl/lprn` := proc(outfd, v, terminator) local i, fmt, n; options `Copyright 2003 by Claus-Justus Heine`; if type(v, list) then fmt:=""; for i from 1 to nops(v) do if type(v[i],integer) then fmt:=cat(fmt, "%d "); elif type(v[i],realcons) then fmt:=cat(fmt, "%e "); fi; od; fprintf(outfd, cat(fmt, terminator), seq(v[i], i = 1..nops(v)) ); elif type(v, hfarray) then n := op(2, ArrayDims(v)); fmt:=cat(seq("%e ", i = 1 .. n)); fprintf(outfd, cat(fmt, terminator), seq(v[i], i = 1..n) ); elif type(v, realcons) then fprintf(outfd, cat("%e", terminator), v); else fprintf(outfd, "0 #\n"); fi end; ############################################################### ## HSV2RGB converts Maple Hues to RGB colors. ## The HUEs used are in [0,1] so assume that S=V=1 (this is close) ## The following algorithm is from Computer Graphics ## By Foley, vanDam, Feiner, Hughes, 2nd Ed. Addison-Wesley ## p 593 ## ## Adapted by fjw 11/29/93 ## Input: (h,s,v) in [0,1]^3 ## Output: sequence r,b,g each in [0,1] ############################################################### HSV2RGB := proc( h,s,v ) local hh,ip,fp,p,q,t; options `Copyright 1990 by Foley, vanDam, Feiner, Hughes`; if (s = 0) then # color on B/W center line if (h<0) then # There is no hue,ie, hue undefined return( v,v,v ); else ERROR(`Undefined color`); fi; else if (h>1) then hh:=1 fi; hh := 6*h; # hh now in [0,6] ip := floor(hh); # ip is integer part of h fp := hh - ip; # fp is fractional part of h p := v*(1-s); q := v*(1-(s*fp)); t := v*(1-(s*(1-fp))); if (ip=0) then return( v,t,p ); elif (ip=1) then return( q,v,p ); elif (ip=2) then return( p,v,t ); elif (ip=3) then return( p,q,v ); elif (ip=4) then return( t,p,v ); else return( v,p,q ); fi; fi; end; ######################################################## # find_colorlist # input: n where to start looking for color data # item what list to search # output: list of color information or NULL list ######################################################## find_colorlist := proc(n,item) local i; options `Copyright 1993 by Frederick Wicklin, Geometry Center`; for i from n to nops(item) do if type(op(i,item),function) and (op(0,op(i,item))=COLOR or op(0,op(i,item))=COLOUR) then return(op(i,item)) fi; od; return([FALSE]); # no color info found end; ######################################################## # find_view # input: n where to start looking for clipping data # item what list to search # output: clipping information in the form [[xmin,xmax],[...]] ######################################################## find_view := proc(n, item) option `Copyright (C) 2003 by Claus-Justus Heine, Department for Applied Mathematics, Freiburg University. All rights reserved.`; description `Find the viewport definition`; local i, j, clipping, view; for i from n to nops(item) do if type(op(i,item),function) and (op(0,op(i,item))=VIEW) then view:=op(i,item); clipping:=[seq([op(1,op(j,view)),op(2,op(j,view))],j = 1..nops(view))]; return clipping; fi; od; return([FALSE]); # no view info found end; # find_view find_view := proc(n,item) ######################################################## # find_appearance # input: n index to start seeking color data # list list to search # output: argument of STYLE option (e.g. `PATCH`) or [] list. ######################################################## find_appearance := proc(n, list) local i, part, ap, color, colortype; ap := ``; color := ``; for i from n to nops(list) do part := op(i,list); if type(part,function) and (op(0,part)=COLOR or op(0,part)=COLOUR) then colortype := op(1,part); if colortype = HUE then color := [HSV2RGB(op(2,part), 0.9, 1)] elif colortype = RGB then color := [op(2..4,part)] elif colortype = HSV then color := [HSV2RGB(op(2,colorlist), op(3,colorlist), op(4,colorlist))]; fi # Otherwise, this "color" tag isn't for us elif type(part,function) and op(0,part) = STYLE then if op(1,part) = PATCH then ap := cat(ap, ` +face -edge`) elif op(1,part) = LINE or op(1,part) = WIREFRAME then ap := cat(ap, ` -face +edge`) fi elif type(part,function) and op(0,part) = THICKNESS and type(op(1,part),integer) then ap := cat(ap, ` linewidth `, op(1,part)); elif type(part,function) and op(0,part) = SYMBOL then ap := cat(ap, ` linewidth `, op(2,part)); fi od; if color <> `` then color := cat( op(1..3, map(v -> cat(convert(v,string),` `), color) ) ); # ap := cat(ap, `\n material { edgecolor `, color, `\n diffuse `, color, `}\n`); # leave everything except the edge color to the handlers # for the specific plot-types. Otherwise there are # problems with Geomview and transparency # ap := cat(ap, `\n material { edgecolor `, color, `}\n`); fi; if ap <> `` then # # "transparent" is here because it cannot be changed # inside Geomview otherwise # ap := cat(` appearance { `, ap, `}`) fi; return(ap); end; ######################################################## # # COLOR # Color may be specified in three different ways. RGB color # specification requires three floating-point values for each # color. The three values must each be between 0 and 1 and specify the # amount of red, green, and blue light in the final color. For # example, COLOR(RGB, 1.0, 0.0, 0.0) is red while COLOR(RGB, 1.0, 1.0, # 0.0) is yellow. The HSV color specification also requires three # numbers for each color. The fractional portion of the first value # indicates the color and the remaining two values give the purity # (saturation) and the brightness of the color. The latter two values # must be between zero and one. The HUE color specification only # requires a single floating-point value and cycles through the colors # of the spectrum based on the fractional part of the value. For # example COLOR(HUE, 0.9) is violet while COLOR(HUE, 0.1) is # red. COLOR(HUE, x) is equivalent to COLOR(HSV, x, 0.9, 1.0). # # Color can take several extra keyword options for 3-D # plotting. XYZSHADING, XYSHADING and ZSHADING specify that an objects # color is to be based on its coordinates. ZHUE and ZGREYSCALE are # modified forms of ZSHADING. # ######################################################## print_colorlist := proc(outfd, coloron, colorlist) option `Copyright (C) 2003 by Claus-Justus Heine, Department for Applied Mathematics, Freiburg University. All rights reserved.`; description `Print colorlist in OOGL RGB format.`; if coloron = RGB then fprintf(outfd, "%e %e %e %e\n", op(2,colorlist),op(3,colorlist),op(4,colorlist), 1); elif coloron = HUE then fprintf(outfd, "%s %d\n", HSV2RGB(op(2,colorlist), 0.9, 1.0), 1); elif coloron = HSV then fprintf(outfd, "%s %d\n", HSV2RGB(op(2,colorlist), op(3,colorlist), op(4,colorlist)), 1); elif coloron != FALSE then fprintf(outfd, "0.666 0.666 0.666 1\n"); fi; end; # print_colorlist print_colorlist := proc(outfd, coloron, colorlist) end module: # geomviewgeomview:=module() geomview-1.9.5/src/bin/geomutil/maple2oogl/gvplot.mws0000644000175000017500000002551612310110176017562 00000000000000{VERSION 5 0 "IBM INTEL LINUX" "5.0" } {USTYLETAB {CSTYLE "Maple Input" -1 0 "Courier" 0 1 255 0 0 1 0 1 0 0 1 0 0 0 0 1 }{CSTYLE "2D Math" -1 2 "Times" 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 1 }{CSTYLE "Hyperlink" -1 17 "" 0 1 0 128 128 1 2 0 1 0 0 0 0 0 0 1 }{CSTYLE "2D Output" 2 20 "" 0 1 0 0 255 1 0 0 0 0 0 0 0 0 0 1 } {CSTYLE "Help Heading" -1 26 "" 1 14 0 0 0 0 0 1 0 0 0 0 0 0 0 1 } {CSTYLE "Help Bold" -1 39 "Times" 1 12 0 0 0 0 0 1 0 0 0 0 0 0 0 1 } {CSTYLE "" -1 256 "" 1 12 0 0 0 0 0 2 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 257 "times" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 258 "courie r" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 259 "times" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 260 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 261 "times" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 262 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 } {CSTYLE "" -1 263 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 264 "times" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 265 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 266 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 267 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 } {CSTYLE "" -1 268 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE " " -1 269 "courier" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 270 "courier" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 271 "courier " 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 272 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 273 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 274 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 275 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 276 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 } {CSTYLE "" -1 277 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE " " -1 279 "courier" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 280 "courier" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 281 "courier " 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 282 "courier" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 283 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 284 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 285 "times" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 } {CSTYLE "" -1 286 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE " " -1 287 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 288 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 289 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 290 "courier" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 291 "courier" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 } {PSTYLE "Normal" -1 0 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Text Output" -1 2 1 {CSTYLE "" -1 -1 "Courier" 1 10 0 0 255 1 0 0 0 0 0 1 3 0 3 0 }1 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Heading 1" 0 3 1 {CSTYLE "" -1 -1 "" 1 18 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }1 0 0 0 8 4 0 0 0 0 0 0 -1 0 } {PSTYLE "Heading 2" 3 4 1 {CSTYLE "" -1 -1 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 8 2 0 0 0 0 0 0 -1 0 }{PSTYLE "Warning" 2 7 1 {CSTYLE "" -1 -1 "" 0 1 0 0 255 1 0 0 0 0 0 0 1 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Maple Output" 0 11 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }3 3 0 -1 -1 -1 0 0 0 0 0 0 -1 0 } {PSTYLE "" 11 12 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }1 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Bullet Item" 0 15 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 3 3 0 0 0 0 0 0 15 2 }{PSTYLE "" 0 256 1 {CSTYLE "" -1 -1 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "" 0 257 1 {CSTYLE "" -1 -1 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "" 0 258 1 {CSTYLE "" -1 -1 "cour ier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }} {SECT 0 {PARA 3 "" 0 "" {TEXT -1 18 "writeoogl, gvplot " }{TEXT 256 29 "- Maple interface to Geomview" }}{PARA 256 "" 0 "" {TEXT -1 0 "" } }{PARA 4 "" 0 "" {TEXT 26 16 "Calling Sequence" }}{PARA 257 "" 0 "" {TEXT -1 6 " " }{TEXT 268 8 " \011with(" }{TEXT 291 8 "geomview " }{TEXT 272 23 "):\n fwriteoogl(" }{TEXT 290 0 "" }{TEXT 282 17 "fd, 3dplot_struct" }{TEXT 283 2 ");" }}{PARA 258 "" 0 "" {TEXT 281 19 " \011writeoogl(" }{TEXT 279 25 "\"filename\", 3dplot_st ruct" }{TEXT 273 23 ");\011\n \011writeoogl(" }{TEXT 280 13 "3d plot_struct" }{TEXT 274 24 ");\011\011\011\011\011\n \011gvplot (" }{TEXT 271 13 "3dplot_struct" }{TEXT 275 24 ");\011\011\011\011\011 \n \011gvplot(" }{TEXT 270 23 "\"geomview_name\", 3dplot" } {TEXT 276 1 "_" }{TEXT 269 6 "struct" }{TEXT 277 2 ");" }}{PARA 4 "" 0 "" {TEXT -1 3 "\011\011\n" }{TEXT 26 10 "Parameters" }{TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT 284 22 " \011fd " }{TEXT 285 58 "- the file-descriptor which will contain the Geomview data" } {TEXT 286 24 "\011\n \011filename " }{TEXT 257 47 "- the fi le which will contain the Geomview data" }{TEXT 258 24 "\011\n \+ \0113dplot_struct\011" }{TEXT 259 31 "- a Maple PLOT3D data structure " }{TEXT 260 26 "\011\011\011\n \011geomview_name\011" }{TEXT 261 48 "- name of the new object in the Geomview browser" }{TEXT 262 2 "\011\n" }{MPLTEXT 1 0 0 "" }}{SECT 1 {PARA 4 "" 0 "" {TEXT 39 11 "D escription" }}{PARA 15 "" 0 "" {TEXT -1 1 " " }{TEXT 39 11 "writeoogl( )" }{TEXT -1 73 " accepts Maple PLOT3D structures and writes files rea dable by Geomview. " }{TEXT 26 8 "gvplot()" }{TEXT -1 121 " converts \+ Maple PLOT3D structures and displays them immediately using Geomview, \+ starting a copy of Geomview if necessary." }}{PARA 15 "" 0 "" {TEXT -1 96 "Supported data types include the Maple structures MESH, GRID, C URVES, POINTS, and POLYGONS. See " }{HYPERLNK 17 "plot3d[structure]" 2 "plot3d[structure]" "" }{TEXT -1 44 " for more information on Maple \+ PLOT3D types." }}{PARA 15 "" 0 "" {TEXT -1 0 "" }{TEXT 287 13 "fwriteo ogl() " }{TEXT -1 11 "works like " }{TEXT 288 11 "writeoogl()" }{TEXT -1 75 ", except that it does expect a file-descriptor instead of a fil e-name. See " }{HYPERLNK 17 "fopen" 2 "fopen" "" }{TEXT -1 43 " for mo re information about files in Maple." }}{PARA 15 "" 0 "" {TEXT -1 190 "The Maple MESH and GRID structures are translated into Geomview's MES H and ZMESH objects, respectively, Maple CURVES and POINTS become VECT objects, and Maple POLYGONS becomes an OFF object." }}{PARA 15 "" 0 " " {TEXT -1 90 "The Maple TEXT structure is not supported. Color inform ation is supported for all objects." }}{PARA 15 "" 0 "" {TEXT -1 9 "Th e form " }{TEXT 266 32 "writeoogl(filename, plot_struct)" }{TEXT -1 56 " writes data in OOGL (Geomview) form to the given file; " }{TEXT 265 15 "writeoogl(plot)" }{TEXT -1 52 " writes to the current output s tream as selected by " }{TEXT 267 9 "writeto()" }{TEXT -1 1 "." }} {PARA 15 "" 0 "" {TEXT 263 8 "gvplot()" }{TEXT -1 103 " normally start s the program \"geomview\", with no options; to specify something else , set the variable \"" }{TEXT 264 9 "gvcommand" }{TEXT -1 10 "\", as i n: " }{MPLTEXT 1 0 60 "gvcommand := /usr/local/bin/gv -wpos 200x200 -c startup.gv\";" }{TEXT -1 128 " before invoking gvplot(). Also, if th e programs \"geomview\" or \"togeomview\" are not on your UNIX search \+ path, set the variable " }{MPLTEXT 1 0 59 "gvdirectories := \"/some/di r/ectory:/some/other/directory\"; " }{TEXT -1 66 "to the appropriate d irectory (or directories separated by colons)." }}}{SECT 1 {PARA 4 "" 0 "" {TEXT 26 8 "Examples" }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 27 "with(plots):with(geomview);" }}{PARA 7 "" 1 "" {TEXT -1 50 "Warning, \+ the name changecoords has been redefined\n" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7(%+fwriteooglG%*gvcommandG%.gvdirectoriesG%'gvplotG%*g vsendcmdG%*writeooglG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 50 "my _plot := plot3d(sin(x+y), x=-Pi..Pi, y=-Pi..Pi):" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 35 "writeoogl( \"sinxy.mesh\", my_plot );" }} {PARA 11 "" 1 "" {XPPMATH 20 "6$%ISaving~Maple~3D~structs~to~Geomview~ fileGQ+sinxy.mesh6\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 98 "ste iner := plot3d([ sin(2*x)*(cos(y))^2, sin(x)*sin(2*y),\011cos(x)*sin(2 *y)], x=-Pi..Pi, y=-Pi..Pi):" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 36 "writeoogl( \"steiner.mesh\", steiner);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6$%ISaving~Maple~3D~structs~to~Geomview~fileGQ-steiner.me sh6\"" }}}{PARA 0 "" 0 "" {TEXT -1 28 "Write using file-descriptors" } }{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 33 "fd:=fopen(\"steiner.mesh\", WRITE);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%#fdG\"\"!" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 26 "fwriteoogl( fd, steiner );" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 11 "fclose(fd);" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 31 "Display it in geomview directly" } {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "gvplot( steiner );" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 122 "trefoil := \+ spacecurve([ -2*cos(t)- 1/2*cos(5*t)+ 3*sin(2*t),\011-3*cos(2*t)+ 2*si n(t)- 1/2*sin(5*t), 2*cos(3*t), t=0..2*Pi]):" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 36 "writeoogl( \"trefoil.vect\", trefoil);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6$%ISaving~Maple~3D~structs~to~Geomview~fileGQ -trefoil.vect6\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 138 "tetrah edra := [[1,0,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,0,1],[0,1,0]], \+ [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,1,0],[-1,0,0]]:" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 37 "Tplot := polygonplot3d([tetr ahedra]):" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 36 "writeoogl( \"t etrahedra.off\", Tplot);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6$%ISaving~M aple~3D~structs~to~Geomview~fileGQ/tetrahedra.off6\"" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 77 "Even clipping can be done (internally achieved \+ by using the external program " }{TEXT 289 7 "clip(1)" }{TEXT -1 1 ") " }{MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 66 "Tplo t :=polygonplot3d([tetrahedra],view=[-1..0.3,-0.3..1,0..0.8]);" }} {PARA 12 "" 1 "" {XPPMATH 20 "6#>%&TplotG-%1INTERFACE_PLOT3DG6$-%)POLY GONSG6&7%7%$\"\"\"\"\"!$F/F/F07%$!\"\"F/F0F07%F0F0F-7%F,F47%F0F-F07%F6 F1F47%F,F6F1-%%VIEWG6%;F2$\"\"$F3;$!\"$F3F-;F0$\"\")F3" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 25 "gvplot( \"Tplot\", Tplot );" }}} {EXCHG {PARA 0 "" 0 "" {TEXT -1 55 "you can even create a single file \+ with multiple objects" }{MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 60 "all_objs := display3d( \{my_plot, steiner, trefoil, T plot\} ):" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 34 "writeoogl( \"a ll.list\", all_objs );" }}{PARA 11 "" 1 "" {XPPMATH 20 "6$%ISaving~Map le~3D~structs~to~Geomview~fileGQ)all.list6\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" } }}}{SECT 1 {PARA 4 "" 0 "" {TEXT 26 8 "See Also" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }{HYPERLNK 17 "plot3d[structure]" 2 "plot3d[structure]" "" }{TEXT -1 2 ", " }{HYPERLNK 17 "fopen" 2 "fopen" "" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}}}{MARK "6 7" 18 }{VIEWOPTS 1 1 0 1 1 1803 1 1 1 1 }{PAGENUMBERS 0 1 2 33 1 1 } geomview-1.9.5/src/bin/geomutil/maple2oogl/savegvplot.mws0000644000175000017500000001062512310110176020434 00000000000000{VERSION 5 0 "IBM INTEL LINUX" "5.0" } {USTYLETAB {CSTYLE "Maple Input" -1 0 "Courier" 0 1 255 0 0 1 0 1 0 0 1 0 0 0 0 1 }{CSTYLE "2D Math" -1 2 "Times" 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 1 }{CSTYLE "2D Output" 2 20 "" 0 1 0 0 255 1 0 0 0 0 0 0 0 0 0 1 } {PSTYLE "Normal" -1 0 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Maple Output" 0 11 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }3 3 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }} {SECT 0 {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "restart;" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "libname;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#Q6/usr/local/maple8/lib6\"" }}}{EXCHG {PARA 0 "> " 0 " " {MPLTEXT 1 0 41 "libname:=\"/home/claus/maple/lib\",libname;" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#>%(libnameG6$Q6/home/claus/maple/lib6 \"Q6/usr/local/maple8/libF'" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 94 "currentdir(\"/home/claus/projects/geomview/sourceforge/geomview/sr c/bin/geomutil/maple2oogl/\");" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 23 "read(\"gvplot.mapleV8\");" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 29 "cat(libname[1],\"/local.lib\");" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#Q@/home/claus/maple/lib/local.lib6\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 50 "march(`create`,cat(libname[1],\"/local.li b\"),1000);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 24 "savelibname: =libname[1];" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%,savelibnameGQ6/home /claus/maple/lib6\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "save lib(geomview);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "restart;" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "libname;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#Q6/usr/local/maple8/lib6\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 41 "libname:=\"/home/claus/maple/lib\",libname;" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#>%(libnameG6$Q6/home/claus/maple/lib6 \"Q6/usr/local/maple8/libF'" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 15 "with(geomview);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7(%+fwriteooglG %*gvcommandG%.gvdirectoriesG%'gvplotG%*gvsendcmdG%*writeooglG" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 302 "readTEXT := proc( filename: :string )\n local text, line, nlines;\n\n nlines := 0;\n text := table();\n\n while line <> 0 do\n line := readline( file name );\n nlines := 1 + nlines;\n text[ nlines ] := line \n end do;\n 'TEXT'( seq( text[ i ], i = 1 .. nlines - 1 ) )\nen d proc:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 83 "#makehelp(`Graph ics/3-D/geomview/writeoogl`,`gvplot.mws`,`/home/claus/maple/lib/`);" } }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 100 "INTERFACE_HELP(`insert`,t opic=`geomview[writeoogl]`,text=readTEXT(\"gvplot.mws\"),library=libna me[1]);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 97 "INTERFACE_HELP(` insert`,topic=`geomview[gvplot]`,text=readTEXT(\"gvplot.mws\"),library =libname[1]);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 100 "INTERFACE _HELP(`insert`,topic=`geomview[gvcommand]`,text=readTEXT(\"gvplot.mws \"),library=libname[1]);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 104 "INTERFACE_HELP(`insert`,topic=`geomview[gvdirectories]`,text=read TEXT(\"gvplot.mws\"),library=libname[1]);" }}}{EXCHG {PARA 0 "> " 0 " " {MPLTEXT 1 0 114 "INTERFACE_HELP(`insert`,topic=`geomview[writeoogl] `,browser=`Graphics/3-D/geomview/writeoogl`,library=libname[1]);" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 108 "INTERFACE_HELP(`insert`,top ic=`geomview[gvplot]`,browser=`Graphics/3-D/geomview/gvplot`,library=l ibname[1]);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 114 "INTERFACE_H ELP(`insert`,topic=`geomview[writeoogl]`,browser=`Graphics/3-D/geomvie w/gvcommand`,library=libname[1]);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 116 "INTERFACE_HELP(`insert`,topic=`geomview[writeoogl]`, browser=`Graphics/3-D/geomview/directories`,library=libname[1]);" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "restart;" }}}{EXCHG {PARA 0 " > " 0 "" {MPLTEXT 1 0 8 "libname;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#Q 6/usr/local/maple8/lib6\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 41 "libname:=\"/home/claus/maple/lib\",libname;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%(libnameG6$Q6/home/claus/maple/lib6\"Q6/usr/local/map le8/libF'" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 17 "?geomview[gvpl ot]" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 10 "?writeoogl" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}}{MARK "2 0 0" 41 }{VIEWOPTS 1 1 0 1 1 1803 1 1 1 1 } {PAGENUMBERS 0 1 2 33 1 1 } geomview-1.9.5/src/bin/geomutil/oogl2rib/0000755000175000017500000000000012310165604015252 500000000000000geomview-1.9.5/src/bin/geomutil/oogl2rib/Makefile.in0000644000175000017500000005744412310165552017257 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = oogl2rib$(EXEEXT) subdir = src/bin/geomutil/oogl2rib DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am_oogl2rib_OBJECTS = oogl2rib.$(OBJEXT) oogl2rib_OBJECTS = $(am_oogl2rib_OBJECTS) oogl2rib_LDADD = $(LDADD) am__DEPENDENCIES_1 = 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(oogl2rib_SOURCES) DIST_SOURCES = $(oogl2rib_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = @default_includes@ man_MANS = oogl2rib.1gv oogl2rib_SOURCES = oogl2rib.c oogl2rib_DEPENDENCIES = $(OOGLLIB) #oogl2rib_LDFLAGS = -rpath $(libdir) LDADD = $(OOGLLIB) EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/oogl2rib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/oogl2rib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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 \ || test -f $$p1 \ ; 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(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: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list oogl2rib$(EXEEXT): $(oogl2rib_OBJECTS) $(oogl2rib_DEPENDENCIES) $(EXTRA_oogl2rib_DEPENDENCIES) @rm -f oogl2rib$(EXEEXT) $(AM_V_CCLD)$(LINK) $(oogl2rib_OBJECTS) $(oogl2rib_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oogl2rib.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-man 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-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ 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 mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 # 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: geomview-1.9.5/src/bin/geomutil/oogl2rib/Makefile.am0000644000175000017500000000034412310110176017221 00000000000000INCLUDES = @default_includes@ bin_PROGRAMS = oogl2rib man_MANS = oogl2rib.1gv oogl2rib_SOURCES = oogl2rib.c oogl2rib_DEPENDENCIES = $(OOGLLIB) #oogl2rib_LDFLAGS = -rpath $(libdir) LDADD = $(OOGLLIB) EXTRA_DIST = $(man_MANS) geomview-1.9.5/src/bin/geomutil/oogl2rib/oogl2rib.c0000644000175000017500000001745512310110176017063 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Scott Wisdom, Tamara Munzner */ #include "ooglutil.h" #include "mg.h" #include "mgrib.h" #include "mgribP.h" #include "mgribtoken.h" #include "camera.h" #include "window.h" #include "appearance.h" #include "quad.h" #include "geom.h" #include "bbox.h" #include "color.h" #include ColorA white = {1, 1, 1, 1}; ColorA black = {0, 0, 0, 1}; Point lightposition = {0, 0, 1}; ColorA ambient = {.2, .2, .2, 1.}; ColorA background = {0, 0, 0, 1}; /* black */ #define xPosition 0 #define yPosition 0 #define windowWidth 300 #define windowHeight 300 /* Switch Descriptions default: create a 'world' around the geometry. This will include all tokens necessary to position camera, scale and position geometry, a provide a singal light illuminating the front of the geometry. -g geometry: geometry only, no world, no world block. -b block: encapsulate geometry-only into a world block. This is the configuration to define a RIB file 'clip object' via the Quick RenderMan specification. -w define image width; -h define image height; -B background color. Default no background. -t tiff file name. Default "geom.tiff". If "framebuffer", draw to framebuffer, not as tiff file. */ int main(int argc, char **argv) { float cx,cy,cz,cs,dx,dy,dz; HPoint3 min,max; Geom *bbox = NULL; Transform ObjectTransform; LmLighting *lighting; LtLight *li[4]; Camera *cam = NULL; WnWindow *win; WnPosition position; Appearance *ap; Geom *ageom; float aspect; int wwidth; int wheight; enum _flag { geometry, minimal, world, block } flag; int errflag=0; int c, display; char *name = "geom.tiff"; int doback = 0; char *infile = "-"; char *outfile = "-"; FILE *outfileFD = stdout; FILE *infileFD = stdin; int framebuffer = 0; /* defaults */ flag = world; wwidth = windowWidth; wheight = windowHeight; /* process switches */ while ((c = getopt(argc, argv, "n:w:h:B:gbf")) != EOF) switch(c) { case 'w': wwidth = atoi(optarg); break; case 'h': wheight = atoi(optarg); break; case 'b': flag = block; break; case 'g': flag = geometry; break; case 'B': sscanf(optarg, "%f%*c%f%*c%f", &(background.r), &(background.g), &(background.b)); doback = 1; break; case 'n': name = optarg; break; case 'f': framebuffer = 1; /* don't change the name if they've set it: check if it's the default */ if (!strcmp(name, "geom.tiff")) name = "geom.rib"; break; default: errflag = 1; break; } if(optind => name for rendered TIFF file (default \"geom.tiff\")\n\ or framebuffer window (default \"geom.rib\").\n\ -B r,g,b => background color, each component ranges from 0 to 1. Default none.\n\ -w -h => width/height of rendered frame, in pixels.\n\ -f => .rib file renders to on-screen framebuffer instead of TIFF file.\n\ Default: create complete rib file containing default camera, lights, etc.\n\ -g => only geometry, -b => only Quick Renderman clip object. Ignores -nBwhf.\n"); exit(1); } TmIdentity(ObjectTransform); mgdevice_RIB(); li[0] = LtCreate(LT_COLOR, &white, LT_POSITION, &lightposition, LT_INTENSITY, 1.0, LT_END); lighting = LmCreate(LM_AMBIENT, &ambient, LM_REPLACELIGHTS, 1, LM_END); LmAddLight(lighting, li[0]); if(flag==world) { cam = CamCreate( CAM_FOV, 60.0, CAM_END ); ap = ApCreate(AP_DO, APF_FACEDRAW, AP_DO, APF_VECTDRAW, AP_LINEWIDTH, 1, AP_MtSet, MT_Kd, 1.0, MT_DIFFUSE, &white, MT_END, AP_LGT, lighting, AP_SHADING, APF_SMOOTH, AP_END); /* create the virtual window with an arbitrary size */ position.xmin = 0; position.xmax = wwidth-1; position.ymin = 0; position.ymax = wheight-1; win = WnCreate(WN_NAME, "noname", WN_CURPOS, &position, WN_END); /* update the camera postion and set the proper aspect ratio */ CamReset(cam); WnGet(win, WN_ASPECT, &aspect); CamSet(cam, CAM_ASPECT, aspect, CAM_FOV, 60.0, CAM_END); /* At the moment, mgctxset does not actually change MG_RIBDISPLAY and MG_RIBDISPLAYNAME, so do this during mgctxcreate - TMM */ if(framebuffer) display = MG_RIBFRAME; else display = MG_RIBTIFF; mgctxcreate(MG_RIBFILE, outfileFD, MG_RIBFORMAT, MG_RIBASCII, MG_RIBBACKING, MG_RIBNOBG, MG_WINDOW, win, MG_CAMERA, cam, MG_APPEAR, ap, MG_RIBDISPLAY, display, MG_RIBDISPLAYNAME, name, MG_END ); if(doback) { mgctxset( MG_RIBBACKING, MG_RIBDOBG, MG_BACKGROUND, &background, MG_END ); } } else { ap = ApCreate(AP_DO, APF_FACEDRAW, AP_DO, APF_VECTDRAW, AP_LINEWIDTH,1, AP_SHADING, APF_SMOOTH, /* Emit normals - slevy */ AP_MtSet, MT_Kd, 1.0, MT_Ks, 0.3, MT_Ka, 0.1, MT_DIFFUSE, &white, MT_EDGECOLOR, &black, MT_ALPHA, 1.0, MT_END, AP_LGT, lighting, AP_END); mgctxcreate(MG_RIBFILE, outfileFD, MG_SHOW, 0, /* overides Format & Display */ MG_RIBFORMAT, MG_RIBASCII, MG_APPEAR, ap, MG_END); } ageom = GeomFLoad(iobfileopen(infileFD), infile); if(flag==world) { mgworldbegin(); /* we use the bbox to determain how to place the geometry */ bbox = GeomBound(ageom, NULL, NULL); if (bbox != NULL) { BBoxMinMax((BBox*)bbox, &min, &max); cx = (max.x + min.x) * .5; cy = (max.y + min.y) * .5; cz = (max.z + min.z) * .5; dx = max.x - min.x; dy = max.y - min.y; dz = max.z - min.z; cs = 2.0 / sqrt(dx*dx + dy*dy + dz*dz); TmScale(ObjectTransform,cs,cs,cs); CtmTranslate(ObjectTransform,-cx,-cy,-cz); mgtransform(ObjectTransform); } } if(flag==block) { mrti(mr_worldbegin, mr_NULL); } GeomDraw(ageom); if(flag==world) { mgworldend(); mgrib_flushbuffer(); } else { if(flag==block) mrti(mr_worldend, mr_NULL); mgrib_flushbuffer(); } /* end up with a newline so that rib file can easily be appended to */ fprintf(outfileFD, "\n"); fflush(outfileFD); return 0; } geomview-1.9.5/src/bin/geomutil/oogl2rib/oogl2rib.1gv0000644000175000017500000000267212310110176017331 00000000000000.\" Hey, EMACS: -*- nroff -*- .TH OOGL2RIB 1gv "February 23, 2001" .SH NAME oogl2rib \- convert OOGL file to RenderMan rib format .SH SYNOPSIS .B oogl2rib .BI [-n " name" ] .BI [-B " r,g,b" ] .BI [-w " width" ] .BI [-h " height" ] .BI [-fgb] .BI [ infile ] .BI [ outfile ] .SH DESCRIPTION This manual page documents briefly the .B oogl2rib command. .PP .B oogl2rib Convert OOGL file to RenderMan rib format. Default: read from stdin, write to stdout. Accepts "-" as infile/outfile. .SH OPTIONS The default action is to create a complete rib file containing default camera, lights, etc. .TP .BI \-n " name" Set name for rendered TIFF file (default "geom.tiff") or framebuffer window (default "geom.rib"). .TP .BI \-B " r,g,b" Set background color, each component ranges from 0 to 1. Default is no background. .TP .BI \-w " width" Set width of rendered frame, in pixels. .TP .BI \-h " height" Set height of rendered frame, in pixels. .TP .B \-f The .rib file renders to on-screen framebuffer instead of TIFF file. .TP .B \-g Output geometry only, no world, no world block. .TP .B \-b Encapsulate geometry-only into a world block. This is the configuration to define a RIB file 'clip object' via the Quick RenderMan specification. Ignores -nBwhf. .SH SEE ALSO .BR geomview (1). .SH AUTHOR This manual page was written by Steve Robbins , for the Debian GNU/Linux system (but may be used by others). geomview-1.9.5/src/bin/geomutil/plutil/0000755000175000017500000000000012310165604015044 500000000000000geomview-1.9.5/src/bin/geomutil/plutil/Makefile.in0000644000175000017500000006257712310165552017054 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = anytooff$(EXEEXT) bez2mesh$(EXEEXT) offconsol$(EXEEXT) \ polymerge$(EXEEXT) subdir = src/bin/geomutil/plutil DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am_anytooff_OBJECTS = anytooff.main.$(OBJEXT) anytooff_OBJECTS = $(am_anytooff_OBJECTS) anytooff_LDADD = $(LDADD) am__DEPENDENCIES_1 = anytooff_DEPENDENCIES = $(am__DEPENDENCIES_1) 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 = am_bez2mesh_OBJECTS = bez2mesh.$(OBJEXT) bez2mesh_OBJECTS = $(am_bez2mesh_OBJECTS) bez2mesh_LDADD = $(LDADD) bez2mesh_DEPENDENCIES = $(am__DEPENDENCIES_1) am_offconsol_OBJECTS = offconsol.main.$(OBJEXT) offconsol_OBJECTS = $(am_offconsol_OBJECTS) offconsol_LDADD = $(LDADD) offconsol_DEPENDENCIES = $(am__DEPENDENCIES_1) am_polymerge_OBJECTS = polymerge.$(OBJEXT) polymerge_OBJECTS = $(am_polymerge_OBJECTS) polymerge_LDADD = $(LDADD) polymerge_DEPENDENCIES = $(am__DEPENDENCIES_1) 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(anytooff_SOURCES) $(bez2mesh_SOURCES) $(offconsol_SOURCES) \ $(polymerge_SOURCES) DIST_SOURCES = $(anytooff_SOURCES) $(bez2mesh_SOURCES) \ $(offconsol_SOURCES) $(polymerge_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = @default_includes@ LDADD = ${OOGLLIB} DEPENDENCIES = $(OOGLLIB) man_MANS = anytooff.1gv bez2mesh.1gv offconsol.1gv polymerge.1gv anytooff_SOURCES = anytooff.main.c bez2mesh_SOURCES = bez2mesh.c offconsol_SOURCES = offconsol.main.c polymerge_SOURCES = polymerge.c EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/plutil/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/plutil/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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 \ || test -f $$p1 \ ; 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(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: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list anytooff$(EXEEXT): $(anytooff_OBJECTS) $(anytooff_DEPENDENCIES) $(EXTRA_anytooff_DEPENDENCIES) @rm -f anytooff$(EXEEXT) $(AM_V_CCLD)$(LINK) $(anytooff_OBJECTS) $(anytooff_LDADD) $(LIBS) bez2mesh$(EXEEXT): $(bez2mesh_OBJECTS) $(bez2mesh_DEPENDENCIES) $(EXTRA_bez2mesh_DEPENDENCIES) @rm -f bez2mesh$(EXEEXT) $(AM_V_CCLD)$(LINK) $(bez2mesh_OBJECTS) $(bez2mesh_LDADD) $(LIBS) offconsol$(EXEEXT): $(offconsol_OBJECTS) $(offconsol_DEPENDENCIES) $(EXTRA_offconsol_DEPENDENCIES) @rm -f offconsol$(EXEEXT) $(AM_V_CCLD)$(LINK) $(offconsol_OBJECTS) $(offconsol_LDADD) $(LIBS) polymerge$(EXEEXT): $(polymerge_OBJECTS) $(polymerge_DEPENDENCIES) $(EXTRA_polymerge_DEPENDENCIES) @rm -f polymerge$(EXEEXT) $(AM_V_CCLD)$(LINK) $(polymerge_OBJECTS) $(polymerge_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anytooff.main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bez2mesh.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/offconsol.main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polymerge.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-man 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-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ 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 mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 # 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: geomview-1.9.5/src/bin/geomutil/plutil/Makefile.am0000644000175000017500000000060312310110176017011 00000000000000INCLUDES = @default_includes@ LDADD= ${OOGLLIB} DEPENDENCIES = $(OOGLLIB) #AM_LDFLAGS = -rpath $(libdir) bin_PROGRAMS = anytooff bez2mesh offconsol polymerge man_MANS = anytooff.1gv bez2mesh.1gv offconsol.1gv polymerge.1gv anytooff_SOURCES = anytooff.main.c bez2mesh_SOURCES = bez2mesh.c offconsol_SOURCES = offconsol.main.c polymerge_SOURCES = polymerge.c EXTRA_DIST = $(man_MANS) geomview-1.9.5/src/bin/geomutil/plutil/anytooff.main.c0000644000175000017500000000634312310110176017700 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * anytooff.main.c * author: Celeste Fowler * date: June 12, 1992 */ #include #include #include "geom.h" #include "appearance.h" #include "transform.h" #include "transformn.h" #include "plutil.h" static char Usage[] = "\ Usage: %s [-n] [-nd] [-3d] [-non] [-noc] [filename ...]\n\ Converts OOGL file(s) to OFF (or nOFF) format. Writes to standard output.\n\ Reads from stdin if no file(s) specified.\n\ Produces the union of all file(s) if several are specified. Options:\n\ -n Compute normals.\n\ -nd allow emitting N-dimensional nOFF object if input is N-D.\n\ -3d only emit OFF objects; project down to 3-space\n\ -non No normals. Omit them even if input objects had them.\n\ -noc No colors. Omit them even if input objects had them.\n"; int main(int argc, char *argv[]) { Geom *g; PLData *pd; int i; int want = 0, unwant = 0; char *prog = argv[0]; while(argc > 1 && (argv[1][0] == '-') && argv[1][1] != '\0') { char *arg = &argv[1][1]; int len = strlen(arg); int bit = 0; int wanted = 1; if((strncmp(arg, "no", 2) == 0 && arg[2] != 'r')) { arg += 2; len -= 2; wanted = 0; } if(!strncmp(arg, "normals", len)) { bit = PL_N; } else if(!strcasecmp(arg, "nd")) { bit = PL_ND; } else if(!strcasecmp(arg, "3d")) { bit = PL_ND, wanted = !wanted; } else if(!strncasecmp(arg, "colors", len)) { bit = PL_C; } else { fprintf(stderr, "%s: unknown option %s\n", prog, argv[1]); fprintf(stderr, Usage, prog); exit(1); } if(wanted) { want |= bit; unwant &= ~bit; } else { want &= ~bit; unwant |= bit; } argc--, argv++; } if(argc <= 1) { argc = 2; argv[1] = "-"; } pd = NULL; for(i = 1; i < argc; i++) { if (strcmp(argv[i], "-") == 0) { g = GeomFLoad(iobfileopen(stdin), "standard input"); } else { g = GeomLoad(argv[i]); } pd = AnyGeomToPLData(g, TM_IDENTITY, NULL, NULL, pd); } /* Get the data. * If they explicitly asked for normals, force them to be recomputed * by including PL_N in both "unwant" and "want". */ g = PLDataToGeom(pd, want, unwant | (want & PL_N) ); GeomFSave(g, stdout, NULL); return g != NULL && !ferror(stdout) ? 0 : 1; } geomview-1.9.5/src/bin/geomutil/plutil/bez2mesh.c0000644000175000017500000000536512310110176016652 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include #include #include static void transpose(void *src, void *dst, int nu, int nv, int elsize) { char *tmp = (src == dst) ? malloc(nu*nv*elsize) : dst; char *p = src; int i,j; for(j = 0; j < nv; j++) { for(i = 0; i < nu; i++) { memcpy(tmp + (i*nu + j) * elsize, p, elsize); p += elsize; } } if(src == dst) { memcpy(dst, tmp, nu*nv*elsize); free(tmp); } } int main(int argc, char *argv[]) { Geom *g; List *l; Bezier *b; char *fname; int t; int n = 5; int evert = 0; if(argc <= 1) { fprintf(stderr, "Usage: %s [[-]N] [file.bez]\n\ Dices a BEZ file to a list of MESHes, each diced NxN.\n\ If N negative, everts each patch.\n", argv[0]); exit(1); } if(argc > 1) n = atoi(argv[1]); if(n < 0) evert = 1; g = (argc > 2 && strcmp(argv[2],"-")) ? GeomLoad(fname = argv[2]) : GeomFLoad(iobfileopen(stdin), fname = "stdin"); if(g == NULL) { fprintf(stderr, "%s: Couldn't read geometry from %s\n", argv[0], fname); exit(1); } if(strcmp(GeomName(g), "list") && strcmp(GeomName(g), "bezierlist")) { fprintf(stderr, "%s: input must be a bezierlist, not a %s\n", argv[0], GeomName(g)); exit(1); } GeomDice(g, abs(n), abs(n)); printf("{ LIST\n"); for(l = (List *)g; l; l = l->cdr) { if(strcmp(GeomName(l->car), "bezier")) continue; b = (Bezier *)l->car; if(evert) { transpose(b->CtrlPnts, b->CtrlPnts, b->degree_u+1, b->degree_v+1, b->dimn*sizeof(float)); t = b->degree_u; b->degree_u = b->degree_v; b->degree_v = t; } MeshFSave( BezierReDice(b), stdout ); } printf("}\n"); exit(0); } geomview-1.9.5/src/bin/geomutil/plutil/offconsol.main.c0000644000175000017500000000246612310110176020045 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "geom.h" #include "plutil.h" int main(int argc, char *argv[]) { float prec = 0.0; if (argc > 1) sscanf(argv[1], "%f", &prec); GeomFSave(PLConsol(GeomFLoad(iobfileopen(stdin), NULL), prec), stdout, NULL); exit(0); } geomview-1.9.5/src/bin/geomutil/plutil/polymerge.c0000644000175000017500000007160112310110176017132 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Squeeze OFF files. * Merges collinear edges and coplanar faces. */ #include #include #include #include /* for qsort(), malloc(), atof() */ #include /* variable-length arrays, getopt() and stuff */ #ifdef NeXT extern char *strdup(const char *); #endif #define VSUB(a, b, dst) (dst)->x = (a)->x - (b)->x, \ (dst)->y = (a)->y - (b)->y, \ (dst)->z = (a)->z - (b)->z #define VDOT(a, b) (a)->x*(b)->x + (a)->y*(b)->y + (a)->z*(b)->z #define VLENGTH(a) sqrt(VDOT(a, a)) #define VCROSS(a, b, dst) (dst)->x = (a)->y * (b)->z - (a)->z * (b)->y, \ (dst)->y = (a)->z * (b)->x - (a)->x * (b)->z, \ (dst)->z = (a)->x * (b)->y - (a)->y * (b)->x #define VSADD(a, s, b, dst) (dst)->x = (a)->x + (s)*(b)->x, \ (dst)->y = (a)->y + (s)*(b)->y, \ (dst)->z = (a)->z + (s)*(b)->z #define VSCALE(a, s) (a)->x *= (s), (a)->y *= (s), (a)->z *= (s) float EPS_LINEAR= 0.0001; /* Max unit-vector cross product for collinearity */ float EPS_NORMAL= 0.0009; /* Max sin^2 theta between normals for coplanarity */ float EPS_POINT= 0.00001;/* Max distance between coincident vertices */ #define F_VERT 0x1 #define F_EDGE 0x2 #define F_FACE 0x4 #define F_EVOLVER 0x8 typedef struct vertex V; typedef struct face F; typedef struct faceedge Fe; typedef struct edge E; typedef struct geodesic Geod; typedef struct point { float x, y, z, w; } P; struct vertex { P p; int ref; int index; float *more; }; struct faceedge { F *face; Fe *prev, *next; /* double links in face-edges of this face */ E *edge; int sign; /* direction w.r.t. edge */ P n; /* adopted surface normal at this edge */ Fe *elink; }; struct face { Fe *fedges; char *affix; }; struct edge { V *v[2]; /* vertex pointers */ E *link; /* hash table link */ P to; /* normalized edge direction vector */ Fe *feds; /* faceedge's on this edge */ int index; /* for numbering edges for .fe format */ }; struct geodesic { int faceno, vertno; /* Seed data. Starting face, or failing that, starting vertex */ F *face; /* Current-face pointer */ P base; /* Geodesic base point */ P dir; /* Geodesic current direction vector */ float length; /* Total length of geodesic */ float maxlength; /* Maximum length of geodesic */ vvec pts; /* list of points (P) traced on geodesic */ }; static int nv, nf, tossedf; static V *Vs; /* All vertices */ static F *Fs; /* All faces */ static E **ehash; /* Array of hash-table head pointers */ static int nhash; static int flags = F_VERT|F_EDGE|F_FACE; static int debug = 0; static int vdim = 3; vvec geods; /* List of geodesics to be traced */ static Fe *fedge( F *f, V *v0, V *v1 ); static void vmerge(void); static void trace_geodesic(Geod *g); static E *advance_geodesic(Geod *g, E *avoid); static void add_geodesic(Geod *g, char *str); static void reflectline(P *axis, P *vector, P *result); static void rotation(P *va, P *vb, float T[3][3]); static int vcmp(V **p, V **q); static void deface(F *f); static void normal_ize(F *f); /*static E *echeck(int v0, int v1);*/ /*static void fecheck(Fe *fe);*/ static void femerge(Fe *fe1, Fe *fe2); static void unfedge(Fe *fe); static Fe *fedge(F *f, V *v0, V *v1); #define New(t) (t *) malloc(sizeof(t)) #define NewN(t, N) (t *) malloc((N)*sizeof(t)) int main(int argc, char *argv[]) { int i; int tnv, tne, any; int binary = 0, vertsize = 0; char *C = "", *N = "", *four = ""; extern int optind; extern char *optarg; IOBFILE *iobf; VVINIT(geods, Geod, 5); vvzero(&geods); while((i = getopt(argc, argv, "bdv:e:f:VEFg:")) != EOF) { switch(i) { case 'b': flags |= F_EVOLVER; break; case 'd': debug = 1; break; case 'v': EPS_POINT = atof(optarg); break; case 'e': EPS_LINEAR = atof(optarg); EPS_LINEAR *= EPS_LINEAR; break; case 'f': EPS_NORMAL = atof(optarg); EPS_NORMAL *= EPS_NORMAL; break; case 'V': flags &= ~F_VERT; break; case 'E': flags &= ~F_EDGE; break; case 'F': flags &= ~F_FACE; break; case 'g': add_geodesic(VVAPPEND(geods, Geod), optarg); break; default: fprintf(stderr, "\ Usage: polymerge [-v vertex_thresh] [-e edge_thresh] [-f face_thresh]\n\ [-V][-E][-F][-d][-b] [infile.off]\n\ Merges coincident vertices, collinear edges, coplanar faces of an OFF object.\n\ -v vertex_thresh: max separation for \"coincident\" vertices (default %g)\n\ -e edge_thresh : max sin(theta) for \"collinear\" edges (default %g)\n\ -f face_thresh : max sin(theta) for \"coplanar\" facet normals (default %.4g)\n\ -V -E -F : don't try to merge vertices/edges/faces\n\ -b : create output in evolver .fe format\n\ -d : debug\n", EPS_POINT, sqrt(EPS_LINEAR), sqrt(EPS_NORMAL)); exit(1); } } if(optind < argc) { if(freopen(argv[argc-1], "rb", stdin) == NULL) { fprintf(stderr, "polymerge: can't open input: "); perror(argv[argc-1]); exit(1); } } /* If we're tracing geodesics, we must have collinear edges merged * and facet-normals computed. */ if(VVCOUNT(geods) > 0) flags |= F_EDGE; iobf = iobfileopen(stdin); vdim = 3; for(;;) { switch( iobfnextc(iobf, 0) ) { case 'N': N = "N"; vertsize += 3; goto swallow; case 'C': C = "C"; vertsize += 4; goto swallow; case '4': four = "4"; vdim = 4; flags &= ~(F_EDGE|F_FACE); goto swallow; swallow: case '{': case '=': iobfgetc(iobf); break; case 'a': /* Appearance? Silently swallow keyword */ iobfexpectstr(iobf, "appearance"); if(iobfnextc(iobf, 0) == '{') { int c, brack = 0; do { if((c = iobfgetc(iobf)) == '{') brack++; else if(c == '}') brack--; } while(brack > 0 && c != EOF); } break; default: goto done; } } done: iobfexpecttoken(iobf, "OFF"); /* swallow optional OFF prefix */ if(iobfexpecttoken(iobf, "BINARY") == 0) { binary = 1; iobfnextc(iobf, 1); iobfgetc(iobf); } if(iobfgetni(iobf, 1, &nv, 0) <= 0 || iobfgetni(iobf, 1, &nf, 0) <= 0 || iobfgetni(iobf, 1, &nhash, 0) <= 0 || nv <= 0 || nf <= 0) { fprintf(stderr, "polymerge: Input not an OFF file.\n"); exit(1); } nhash = (nf + nv + 4) / 2; if(nhash < 16) nhash = 17; if(!(nhash & 1)) nhash++; ehash = NewN(E *, nhash); memset((char *)ehash, 0, nhash*sizeof(E *)); Vs = NewN(V, nv); Fs = NewN(F, nf); for(i = 0; i < nv; i++) { V *vp = &Vs[i]; vp->p.w = 1; if(iobfgetnf(iobf, vdim, (float *)&vp->p, binary) < vdim) { badvert: fprintf(stderr, "polymerge: error reading vertex %d/%d\n", i,nv); exit(1); } if(vertsize) { Vs[i].more = NewN(float, vertsize); if(iobfgetnf(iobf, vertsize, Vs[i].more, binary) < vertsize) goto badvert; } Vs[i].ref = 0; Vs[i].index = i; } /* * Combine vertices */ if(flags & F_VERT) vmerge(); /* * Load faces * The fedge() calls here assume we've already merged all appropriate * vertices. */ tossedf = 0; for(i = 0; i < nf; i++) { F *fp = &Fs[i]; Fe *fe; int nfv, k, c; int v, ov, v0; Fe head; char *cp; char aff[512]; if(iobfgetni(iobf, 1, &nfv, binary) <= 0 || nfv <= 0) { fprintf(stderr, "polymerge: error reading face %d/%d\n", i, nf); exit(1); } head.prev = head.next = &head; fp->fedges = &head; iobfgetni(iobf, 1, &v, binary); if(v < 0 || v >= nv) { fprintf(stderr, "polymerge: bad vertex %d on face %d\n", v, i); exit(1); } v0 = ov = Vs[v].index; /* Use common vertex if merged */ for(k = 1; k < nfv; k++, ov = v) { iobfgetni(iobf, 1, &v, binary); if(v < 0 || v >= nv) { fprintf(stderr, "polymerge: bad vertex %d on face %d\n", v, i); exit(1); } v = Vs[v].index; /* Use common vertex if merged */ if(ov == v) continue; head.prev->next = fe = fedge(fp, &Vs[ov], &Vs[v]); fe->prev = head.prev; fe->next = &head; head.prev = fe; } if(v != v0) { fe = fedge(fp, &Vs[v], &Vs[v0]); head.prev->next = fe; fe->prev = head.prev; fe->next = &head; head.prev = fe; } head.next->prev = head.prev; if(head.next == &head) { /* * Degenerate face here */ fp->fedges = NULL; tossedf++; if (debug) printf("# Face %d degenerate already\n", i); } else { head.prev->next = fp->fedges = head.next; } if(binary) { int nfc; float c; iobfgetni(iobf, 1, &nfc, binary); if(nfc > 4) { fprintf(stderr, "Bad face color count 0x%x", nfc); exit(1); } for(cp = aff; --nfc >= 0; cp += strlen(cp)) { iobfgetnf(iobf, 1, &c, binary); sprintf(cp, " %g", c); } } else { (void) iobfnextc(iobf, 1); for(cp = aff; (c = iobfgetc(iobf)) != EOF && c != '\n' && cp < &aff[511]; ) *cp++ = c; } *cp = '\0'; fp->affix = (cp > aff) ? strdup(aff) : ""; } /* * Compute face normals -- actually corner normals, since we avoid * assuming faces are planar. As a side effect, we detect & join * collinear edges. */ if(flags & F_EDGE) { for(i = 0; i < nf; i++) { normal_ize(&Fs[i]); } } /* Trace geodesic(s) if we're given any. */ for(i = 0; i < VVCOUNT(geods); i++) { trace_geodesic(&VVEC(geods, Geod)[i]); } /* * Locate edges bounding faces with the same normal direction. */ if(flags & F_FACE) { do { any = 0; for(i = 0; i < nhash; i++) { E *e; for(e = ehash[i]; e != NULL; e = e->link) { Fe *fe, *fee; for(fe = e->feds; fe != NULL; fe = fe->elink) { for(fee = fe->elink; fee != NULL; fee = fee->elink) { float dn; dn = VDOT(&fe->n, &fee->n); if(fabs(1 - dn*dn) < EPS_NORMAL) { /* * OK, merge fee into fe */ femerge(fe, fee); any++; goto another; } } } another: ; } } if (debug) printf("# %d faces merged this pass.\n", any); } while(any); } /* * Scan for unused edges. */ for(i = 0; i < nv; i++) Vs[i].ref = 0; tne = 0; for(i = 0; i < nhash; i++) { E *e; for(e = ehash[i]; e != NULL; e = e->link) { if(e->feds != NULL) { e->v[0]->ref++; e->v[1]->ref++; e->index = ++tne; } } } /* * Renumber used vertices. */ if(flags & 1) { tnv = 0; for(i = 0; i < nv; i++) Vs[i].index = Vs[i].ref ? tnv++ : -i-1; } else { tnv = nv; } if(VVCOUNT(geods) > 0) { /* Emit all geodesics as a VECT object. */ /* Don't emit anything else. */ int i, j, totv = 0, totpl = 0; Geod *g; for(i = 0; i < VVCOUNT(geods); i++) { g = &VVEC(geods, Geod)[i]; if(VVCOUNT(g->pts) > 1) { totv += VVCOUNT(g->pts); totpl++; } } printf("VECT\n"); printf("%d %d %d\n", totpl, totv, 0); for(i = 0; i < VVCOUNT(geods); i++) { g = &VVEC(geods, Geod)[i]; if(VVCOUNT(g->pts) > 1) { printf("%d ", VVCOUNT(g->pts)); } } printf("\n"); for(i = 0; i < totpl; i++) printf("0 "); printf("\n\n"); for(i = 0; i < VVCOUNT(geods); i++) { P *pt; g = &VVEC(geods, Geod)[i]; if(VVCOUNT(g->pts) > 1) { pt = VVEC(g->pts, P); for(j = VVCOUNT(g->pts); --j >= 0; pt++) printf("%g %g %g\n", pt->x, pt->y, pt->z); } } exit(0); } if (flags & F_EVOLVER) /* Produce Brakke's evolver .fe format */ { int j=0; if (vdim == 4) printf("space_dimension 4\n"); printf("vertices\n"); for(i = 0; i < nv; i++) { V *v = &Vs[i]; if(v->ref || !(flags & 1)) { v->index = ++j; printf("%d\t%#g %#g %#g", v->index, v->p.x, v->p.y, v->p.z); if(vdim == 4) printf(" %g", v->p.w); printf("\n"); } } printf("\nedges\n"); for(i = 0; i < nhash; i++) { E *e; for(e = ehash[i]; e != NULL; e = e->link) if(e->feds != NULL) printf("%d\t%d %d\n", e->index,e->v[0]->index,e->v[1]->index); } printf("\nfaces\n"); j=0; for(i=0; inext) != fe; k++) ; if ((nfv = k)<3) continue; /* don't print faces of less than 3 sides */ printf("%d", ++j); for(fee = fe, k = nfv; --k >= 0; fee = fee->next) printf(" %d", (1-2*fee->sign)*fee->edge->index); printf("\n"); } } else /* Produce OFF format */ { printf("%s%s%sOFF\n%d %d %d\n", C, N, four, tnv, nf - tossedf, tne); for(i = 0; i < nv; i++) { V *v = &Vs[i]; int k; if(v->ref || !(flags & F_VERT)) { printf("%#g %#g %#g", v->p.x, v->p.y, v->p.z); if(vdim == 4) printf(" %#g", v->p.w); if(vertsize) { printf(" "); for(k = 0; k < vertsize; k++) printf(" %#g", v->more[k]); } if(debug) printf("\t# %d [%d] #%d", v->index, v->ref, i); printf("\n"); } } printf("\n"); /* ho hum */ for(i=0; inext) != fe; k++) ; nfv = k; printf("%d", nfv); for(fee = fe, k = nfv; --k >= 0; fee = fee->next) printf(" %d", fee->edge->v[fee->sign]->index); printf("\t%s", Fs[i].affix); if(debug) { printf(" #"); for(fee = fe, k = nfv; --k >= 0; fee = fee->next) printf(" %d", (int)(fee->edge->v[fee->sign] - Vs)); } printf("\n"); } } exit(1); } /* * Add a new faceedge */ static Fe *fedge(F *f, V *v0, V *v1) { Fe *fe; E *e; int t; int i0, i1; float r; fe = New(Fe); fe->face = f; fe->sign = 0; i0 = v0->index; i1 = v1->index; if(i0 > i1) { V *tv = v0; v0 = v1; v1 = tv; i0 = v0->index; i1 = v1->index; fe->sign = 1; } t = (unsigned long)(v0->index + v1->index + v0->index*v1->index) % nhash; /* Symmetric hash function */ for(e = ehash[t]; e != NULL; e = e->link) if(e->v[0]->index == i0 && e->v[1]->index == i1) goto gotit; e = New(E); e->v[0] = v0; e->v[1] = v1; e->feds = NULL; VSUB(&v0->p, &v1->p, &e->to); r = VDOT(&e->to, &e->to); if(r != 0) { r = 1/sqrt(r); e->to.x *= r; e->to.y *= r; e->to.z *= r; } else if (debug) printf("# Coincident: %d == %d [%g %g %g]\n", v0->index, v1->index, v0->p.x,v0->p.y,v0->p.z); e->link = ehash[t]; ehash[t] = e; gotit: fe->edge = e; fe->elink = e->feds; e->feds = fe; return fe; } /* * Remove a faceedge from its edge list */ static void unfedge(Fe *fe) { Fe **fepp; for(fepp = &fe->edge->feds; *fepp != NULL; fepp = &(*fepp)->elink) { if(*fepp == fe) { *fepp = fe->elink; break; } } free(fe); } /* * Merge two faces * We delete these face-edges from both faces */ static void femerge(Fe *fe1, Fe *fe2) { F *f1, *f2; Fe *tfe; if(fe1->face == fe2->face) { if (debug) printf("# Merging two edges of face %d -- tossing it.\n", (int)(fe1->face - Fs)); deface(fe1->face); return; } if(fe1->sign == fe2->sign) { /* * Messy. To merge these, we need to reverse all the links * in one of the two faces. */ Fe *xfe; tfe = fe2; do { tfe->sign ^= 1; xfe = tfe->next; tfe->next = tfe->prev; tfe->prev = xfe; tfe = xfe; } while(tfe != fe2); } fe1->prev->next = fe2->next; fe2->next->prev = fe1->prev; fe1->next->prev = fe2->prev; fe2->prev->next = fe1->next; f1 = fe1->face; f2 = fe2->face; if(f1->fedges == fe1) f1->fedges = fe2->next; if(debug) printf("# Merged face %d into %d (vertices %d %d) n1.n2 %g\n", (int)(f2-Fs), (int)(f1-Fs), fe1->edge->v[fe1->sign]->index, fe1->edge->v[1 - fe1->sign]->index, VDOT(&fe1->n, &fe2->n)); tfe = fe2->next; if(tfe == NULL) { fprintf(stderr, "polymerge: face f2 already deleted?\n"); } else { do { tfe->face = f1; } while((tfe = tfe->next) != fe1->next); } f2->fedges = NULL; tossedf++; unfedge(fe1); unfedge(fe2); /* * Join collinear edges, recompute normals (might have changed a bit). */ normal_ize(f1); } #define PRETTY(x) ((int)(x) - 0x10000000) #if 0 static void fecheck(Fe *fe) { Fe *fee; F *f; E *e; if(fe == NULL) return; f = fe->face; fprintf(stderr,"0x%p: on face %d (%p); ", (void *)fe, f - Fs, (void *)f); fee = fe; do { fprintf(stderr," %s%x[%d%s%d] ", (f->fedges == fee) ? "*" : "", PRETTY(fee), fee->edge->v[0]->index, fee->sign ? "<-" : "->", fee->edge->v[1]->index); if(fee->face != f) fprintf(stderr," Fe %p: face %d (%p) != %p\n", (void *)PRETTY(fee), fee->face - Fs, (void *)fee->face, (void *)f); if(fee->next->prev != fee) fprintf(stderr," Fe %x: next %x next->prev %x\n", PRETTY(fee), PRETTY(fee->next), PRETTY(fee->next->prev)); e = fee->edge; fee = fee->next; } while(fee != fe); fprintf(stderr, "\n"); } #endif #if 0 static E *echeck(int v0, int v1) { E *e; int t = (v0 + v1 + v0*v1) % nhash; /* Symmetric hash function */ if(v0 > v1) v0 ^= v1, v1 ^= v0, v0 ^= v1; for(e = ehash[t]; e != NULL; e = e->link) { if(e->v[0] == &Vs[v0] && e->v[1] == &Vs[v1]) { Fe *fe; fprintf(stderr, "E 0x%p %d-%d (%d-%d) %p...\n", (void *)e, v0,v1, e->v[0]->index, e->v[1]->index, (void *)PRETTY(e->feds)); for(fe = e->feds; fe != NULL; fe = fe->elink) { fecheck(fe); } } } return e; } #endif static void normal_ize(F *f) { Fe *fe; fe = f->fedges; if(fe == NULL) return; if(fe->prev == fe->next) { if (debug) printf("# Face %d already degenerate -- tossing it.\n", (int)(f - Fs)); deface(f); return; } do { /* loop over edges on this face */ P n; float r; for(;;) { Fe *fn, *fee; P *pp, *qp; pp = &fe->edge->to; fee = fe->next; qp = &fee->edge->to; VCROSS(pp, qp, &n); r = VDOT(&n, &n); if(r > EPS_LINEAR) break; /* * Join collinear edges; produce a new edge */ fn = fedge(f, fe->edge->v[fe->sign], fee->edge->v[1-fee->sign]); fee->next->prev = fe->prev->next = fn; fn->next = fee->next; fn->prev = fe->prev; if(fe == f->fedges || fee == f->fedges) f->fedges = fn; /* preserve headiness */ unfedge(fee); if(fee != fe) unfedge(fe); if(fn->prev == fn->next) { /* * This face became degenerate -- toss it. */ if (debug) printf("# degenerate face %d\n", (int)(f - Fs)); deface(f); return; } fe = fn; } r = 1/sqrt(r); if(n.x < 0 || (n.x == 0 && n.y < 0) || (n.y == 0 && n.z < 0)) r = -r; /* Canonicalize */ fe->n.x = n.x*r; fe->n.y = n.y*r; fe->n.z = n.z*r; } while((fe = fe->next) != f->fedges); } /* * Delete a face, erasing all edges. */ static void deface(F *f) { Fe *fe, *fee; fe = f->fedges; if(fe == NULL) return; do { fee = fe->next; unfedge(fe); fe = fee; } while(fe != f->fedges); f->fedges = NULL; tossedf++; } static int vcmp(V **p, V **q) { V *vp, *vq; float d; vp = *p; vq = *q; d = vp->p.x - vq->p.x; if(d < 0) return -1; if(d > 0) return 1; d = vp->p.y - vq->p.y; if(d < 0) return -1; if(d > 0) return 1; d = vp->p.z - vq->p.z; if(d < 0) return -1; if(d > 0) return 1; if(vp->p.w == vq->p.w) return 0; return(vp->p.w < vq->p.w ? -1 : 1); } static void vmerge(void) { V **vp; int i, j; V *a, *b; int nexti; vp = NewN(V *, nv); for(i = 0, a = Vs; i < nv; i++) { a->ref = 0; vp[i] = a++; } qsort(vp, nv, sizeof(V *), (int (*)())vcmp); /* * Now all matches will occur within X-runs */ for(i = 0; i < nv; i = nexti ? nexti : i+1) { nexti = 0; a = vp[i]; if(a->ref) continue; for(j = i; ++j < nv; ) { b = vp[j]; if(b->ref) continue; if(b->p.x - a->p.x > EPS_POINT) break; if(fabs(a->p.y - b->p.y) < EPS_POINT && fabs(a->p.z - b->p.z) < EPS_POINT && (vdim == 3 || fabs(a->p.w - b->p.w) < EPS_POINT)) { if (debug) printf("# Vtx %d->%d\n", b->index, a->index); b->index = a->index; b->ref++; } else if(!nexti) nexti = j; } } free(vp); } /* * Add a geodesic, described by a string. */ static void add_geodesic(Geod *g, char *str) { int ok; float r; VVINIT(g->pts, P, 20); ok = sscanf(str, "%d,%f,%f,%f,%f,%f,%f,%f", &g->faceno, &g->base.x, &g->base.y, &g->base.z, &g->dir.x, &g->dir.y, &g->dir.z, &g->maxlength); if(ok < 7) { fprintf(stderr, "Geodesic must have form: faceno,X0,Y0,Z0,X1,Y1,Z1\n\ where X0,Y0,Z0 define the base point, X1,Y1,Z1 the direction,\n\ and faceno is the integer index of the face on which the base-point lies.\n"); exit(1); } /* Convert X1,Y1,Z1 into direction vector. */ VSUB(&g->dir, &g->base, &g->dir); r = VLENGTH(&g->dir); if(r) VSCALE(&g->dir, 1/r); } /* Generate 3x3 rotation matrix which takes va -> vb * Assumes va and vb both unit vectors. */ static void rotation(P *va, P *vb, float T[3][3]) { float adotb = VDOT(va, vb); float ab_1 = adotb - 1; float apb, apb2; int i, j; P aperpb; VSADD(vb, -adotb, va, &aperpb); apb2 = VDOT(&aperpb, &aperpb); if(apb2 == 0) { float dot; if(adotb >= 0) { /* Either some vector is zero, or they're identical. No rot'n. */ memset(T, 0, 9*sizeof(float)); T[0][0] = T[1][1] = T[2][2] = 1; return; } /* Oppositely directed vectors. Pick an arbitrary plane and * rotate 180 degrees in it. */ if(fabs(va->x) < .7) aperpb.x = 1; else aperpb.y = 1; dot = VDOT(&aperpb, va); VSADD(&aperpb, dot, va, &aperpb); apb2 = VDOT(&aperpb, &aperpb); } apb = VDOT(&aperpb, vb) / apb2; for(i = 0; i < 3; i++) { float ai = (&va->x)[i]; float api = (&aperpb.x)[i]; for(j = 0; j < 3; j++) { T[i][j] = (&va->x)[j] * (ai*ab_1 - api*apb) + (&aperpb.x)[j] * (api*ab_1/apb2 + ai*apb); } T[i][i] += 1; } } /* * result = vector reflected in axis */ static void reflectline(P *axis, P *vector, P *result) { float mag = VDOT(axis, axis); float along = VDOT(axis, vector); *result = *vector; VSCALE(result, -1); VSADD(result, 2*along/mag, axis, result); } /* * Carry this geodesic forward across one facet. * Update g->face to the new face, if any, or NULL if we encountered a boundary. * Update g->base and g->dir to be a point and direction on the new face. * Return pointer to the edge with which we found an intersection * (with g->base presumably being some point on that edge). * Avoid considering an intersection with the edge that led us here, if any. * * Return a pointer to the edge we found the intersection with, NULL if none. */ static E * advance_geodesic(Geod *g, E *avoid) { Fe *fed, *bestfed = NULL; E *edge; P n; P lb, bestbase = { 0, }, bestdir = { 0, }; float r, u, t, bestt; int i; struct point2 { float u, v; } lbase, ldir; if(g->face == NULL) return NULL; /* Test for intersections with all the edges on this face. */ bestt = 1e20; fed = g->face->fedges; do { edge = fed->edge; if(edge != avoid) { /* We have at hand: * edge->v[1], the base point of the edge; let's call it * the origin of our local coordinate system * edge->to, "e", a unit vector pointing along the edge * fed->n, "N", the face surface normal as a unit vector * Let's call local coordinates on this face "u" and "v", * with "u" positive along the edge and "v" perp. to it. */ /* Construct the other basis vector, "n" = N cross e */ VCROSS(&fed->n, &edge->to, &n); /* Transform base point g->base to local coords */ VSUB(&g->base, &edge->v[1]->p, &lb); /* Subtract local origin */ lbase.u = VDOT(&edge->to, &lb); lbase.v = VDOT(&n, &lb); /* Transform direction g->dir to local coords too. * Since we want to squash everything down onto the face, * let's just ignore the components in the direction of N. */ ldir.u = VDOT(&edge->to, &g->dir); ldir.v = VDOT(&n, &g->dir); /* * Where does lbase + t*ldir cross the v=0 axis? * If this t comes closer than any other so far, take it. */ if(ldir.v != 0) { t = -lbase.v/ldir.v; u = lbase.u + t * ldir.u; if(t > 0 && t < bestt && u >= 0) { /* Final check: does our new point actually * lie within the length of the edge? */ P edgevec; VSUB(&edge->v[1]->p, &edge->v[0]->p, &edgevec); if(VDOT(&edgevec,&edgevec) >= u*u) { bestt = t; bestfed = fed; /* Compute new base point */ VSADD(&edge->v[1]->p, u, &edge->to, &bestbase); /* Transform direction back into 3-space. * It'll be almost the same, but possibly not quite, in * case it didn't lie quite in the plane of the face. */ bestdir.x = edge->to.x * ldir.u + n.x * ldir.v; bestdir.y = edge->to.y * ldir.u + n.y * ldir.v; bestdir.z = edge->to.z * ldir.u + n.z * ldir.v; } } } } fed = fed->next; } while(fed != g->face->fedges); if(bestfed) { /* We did find some edge intersection. */ /* Update base point and direction, and increment length. */ P piece; VSUB(&bestbase, &g->base, &piece); g->length += VLENGTH(&piece); g->base = bestbase; g->dir = bestdir; /* Add base point to list of vertices on the geodesic. */ *VVAPPEND(g->pts, P) = g->base; /* Whither next? Look for a different face on the same edge. * The face-edges which share an edge are linked together via * their "elink" fields, and edge->feds points to the first one. */ edge = bestfed->edge; fed = edge->feds; while(fed == bestfed) fed = fed->elink; if(fed != NULL) { /* We have a neighboring face on this edge. */ float T[3][3]; float dir[3]; /* Remember which face. */ g->face = fed->face; /* Construct a rotation * from plane of old face (bestfed->n) * into plane of new face (fed->n). */ rotation(&bestfed->n, &fed->n, T); /* dir = bestdir * T */ for(i = 0; i < 3; i++) { dir[i] = bestdir.x*T[0][i] + bestdir.y*T[1][i] + bestdir.z*T[2][i]; } g->dir.x = dir[0]; g->dir.y = dir[1]; g->dir.z = dir[2]; } else { /* There's no neighboring face. Must have reached a boundary. */ g->face = NULL; } /* Re-normalize direction in case it wasn't quite a unit vector. */ r = VLENGTH(&g->dir); if(r != 0 && r != 1) VSCALE(&g->dir, 1/r); return bestfed->edge; } else { /* Somehow, we didn't find an intersection with any of the edges * of this face. Maybe we were pointing in the wrong direction * (away from the face rather than into it)? */ return NULL; } } static void trace_geodesic(Geod *g) { E *edge, *nextedge; int maxsteps = 1000000; float maxlength = 1e10; /* Bootstrap. * Take our facet-number, and initialize * g->face from it. */ if(g->faceno < 0 || g->faceno >= nf) { fprintf(stderr, "Can't believe geodesic starting from face #%d, ignoring it.\n", g->faceno); return; /* Forget it. */ } /* Stuff the initial point into the geodesic path. */ *VVAPPEND(g->pts, P) = g->base; g->face = &Fs[g->faceno]; /* Interpret length limit. How far shall we trace this geodesic? * Negative -> facet count, positive -> Euclidean length, zero -> default. */ if(g->maxlength < 0) { maxsteps = -g->maxlength; } else if(g->maxlength > 0) { maxlength = g->maxlength; } else { maxsteps = 100; } edge = NULL; /* Initially, no reason to avoid any edge. */ do { nextedge = advance_geodesic(g, edge); if(nextedge == NULL && g->face != NULL) { /* Maybe we ran into a facet with flipped orientation, * and turned away from the facet rather than toward it. * Try again, flipping the direction about the last edge we found. */ reflectline(&edge->to, &g->dir, &g->dir); nextedge = advance_geodesic(g, edge); } /* Remember which edge we struck, so as to avoid considering * an intersection with it on the next face. */ edge = nextedge; /* Could be smarter. What if we've encountered a boundary, * so advance_geodesic() left g->face equal to NULL? * We could search the surface for another polygon which just * doesn't happen to meet this one edge-to-edge -- as when two * pieces of surface are irregularly butted up against each other -- * and use that to find a new face to walk over. * But, not right now. */ } while(edge != NULL && --maxsteps > 0 && g->length < maxlength); } geomview-1.9.5/src/bin/geomutil/plutil/anytooff.1gv0000644000175000017500000000177412310110176017233 00000000000000.TH anytooff 1gv "November 2 1993" "Geometry Center" .SH NAME anytooff \- filter to convert a (set of) geomview data file(s) containing any geomview primitives into a single polylist. .SH SYNOPSIS anytooff [filename ...] .SH DESCRIPTION .PP Anytooff reads OOGL geometry data (from the given files, if any, otherwise from standard input) and outputs the new polylist (in OFF format) to standard output. Offcombine is a synonym for anytooff. .SH BUGS In converting a list object, anytooff uses PLCombine(3) to merge the members of the list. PLCombine(3) has certain limitations with regard to the way in handles color and normal data; see its manual page for details. .PP When vector objects are switched into polylists, they are transformed into polygons with two vertices. The faces of the polygons are the same color as the given vectors, but the edges of the polygons, which are their only visible aspect, have no color. .SH SEE ALSO anytopl(3), geomview(1) .SH AUTHOR .nf Celeste Fowler The Geometry Center .fi geomview-1.9.5/src/bin/geomutil/plutil/bez2mesh.1gv0000644000175000017500000000110112310110176017105 00000000000000.\" Hey, EMACS: -*- nroff -*- .TH BEZ2MESH 1gv "February 23, 2001" .SH NAME bez2mesh \- dices a BEZ file to a list of MESHes .SH SYNOPSIS .B bez2mesh .BI [[-] N ] .BI [ file.bez ] .SH DESCRIPTION This manual page documents briefly the .B bez2mesh command. .PP .B bez2mesh Dices a BEZ file to a list of MESHes, each diced NxN. If N negative, everts each patch. .SH SEE ALSO .BR geomview (1). .SH AUTHOR This manual page was written by Steve Robbins , for the Debian GNU/Linux system (but may be used by others). geomview-1.9.5/src/bin/geomutil/plutil/offconsol.1gv0000644000175000017500000000121112310110176017360 00000000000000.TH offconsol 1gv "June 25, 1992" "Geometry Center" .SH NAME offconsol -\ polylist consolidator. .SH SYNOPSIS offconsol [precision] .SH DESCRIPTION .PP offconsol reads an OFF file from standard input and writes an OFF file in which vertices closer than a given precision have been combined. The default precision is zero. Color and normal information are not taken into account when comparing vertices. .PP The vertices of the resultant polyline have been sorted, and so there order bears no resemblance to the order of the point in the original polylist. .SH SEE ALSO plconsol(3), geomview(1) .SH AUTHOR .nf Celeste Fowler The Geometry Center .fi geomview-1.9.5/src/bin/geomutil/plutil/polymerge.1gv0000644000175000017500000000610312310110176017400 00000000000000.TH POLYMERGE 1gv "25 July 1993" "Geometry Center" .SH NAME polymerge \- merge coincident vertices, collinear edges, coplanar faces in an OOGL OFF object .SH SYNOPSIS \fBpolymerge\fP [\fB\-v\fP \fIvertex_thresh\fP] [\fB\-e\fP \fIedge_thresh\fP] [\fB\-f\fP \fIface_thresh\fP] [\fB\-V\fP] [\fB\-E\fP] [\fB\-F\fP] [\fB\-d\fP] [\fB\-b\fP] [\fIinputfile.off\fP] .SH DESCRIPTION \fIPolymerge\fP eliminates redundancies from polyhedral objects in OOGL's OFF format, and writes another OFF object to its standard output. (Optionally it can produce instead an input file for Brakke's Evolver.) Specifically, it combines nearly-coincident vertices, nearly-collinear edges, and nearly-coplanar faces. Vertices which aren't used on any face are deleted, as are faces with less than three vertices. Thresholds for approximate equality are adjustable from the command line. Options are: .IP "\fB\-v\fP \fIvertex_thresh\fP" Merge vertices when they're closer than \fIvertex_thresh\fP apart; the default is .00001. .IP "\fB\-V\fP" Don't attempt to merge vertices. .IP "\fB\-e\fP \fIedge_thresh\fP" Merge edges where |sin(vertex_angle)| < \fIedge_thresh\fP; the default is .01, merging edges with angles within about .5 degree of 0 or 180 degrees. When edges are merged, the corresponding vertex is removed. .IP "\fB\-E\fP" Don't attempt to merge edges. (4OFF edges are never merged.) .IP "\fB\-f\fP \fIface_thresh\fP" Merge faces sharing an edge where the faces are nearly coplanar: when |sin(angle_between_face_normal_vectors)| < \fIface_thresh\fP. The default is .03, or about two degrees. Note that merging can create faces which are concave polygons. .IP "\fB\-F\fP" Don't attempt to merge faces. (4OFF faces are never merged.) .IP "\fB\-b\fP" Produce an output file in .fe format for Brakke's Surface Evolver, instead of a new OFF file. .IP "\fB\-d\fP" Include debugging information as comments in the new OFF object. The comments indicate which vertices and faces in the original object correspond to which in the new one. Messages include: .IP "# Vtx \fInnn\fP->\fImmm\fP" Merged vertices \fInnn\fP and \fImmm\fP (both indices in the original object). .IP "# Merged face \fInnn\fP into \fImmm\fP (vertices \fIvvv\fP \fIwww\fP) n1.n2 \fIs\fP" Faces \fInnn\fP and \fImmm\fP in the original object were merged; their common edge joined original vertices \fIvvv\fP and \fIwww\fP. The cosine of the angle between the face normals was \fIs\fP. .IP "\fIvertex coordinates\fP # \fInewvertno\fP [\fIorder\fP] # \fIoldvertno\fP" Each vertex written appears with its new index, its order (number of edges touching that vertex), and its old index (index of a corresponding vertex in the original object). .IP "\fIface description\fP # \fIoldvertno ...\fP" For each new face, with \fIN\fP vertices after reduction, the comment indicates \fIN\fP corresponding vertices in the original object. .SH AUTHOR Stuart Levy, Geometry Center, University of Minnesota .SH "SEE ALSO" anytooff(1), offconsol(1) .SH BUGS Coplanar faces are merged even if they were assigned different colors. Should be able to handle binary OFF objects, but this hasn't been tested. geomview-1.9.5/src/bin/geomutil/vrml2oogl/0000755000175000017500000000000012310165604015456 500000000000000geomview-1.9.5/src/bin/geomutil/vrml2oogl/Makefile.in0000644000175000017500000007015112310165552017451 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = vrml2oogl$(EXEEXT) subdir = src/bin/geomutil/vrml2oogl DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am_vrml2oogl_OBJECTS = vrml2oogl.$(OBJEXT) vrml2oogl_OBJECTS = $(am_vrml2oogl_OBJECTS) vrml2oogl_LDADD = $(LDADD) vrml2oogl_DEPENDENCIES = ./lib/libQv.a 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(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 = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(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 = $(vrml2oogl_SOURCES) DIST_SOURCES = $(vrml2oogl_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir 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 DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = @default_includes@ -I$(srcdir)/lib SUBDIRS = lib man_MANS = vrml2oogl.1gv EXTRA_DIST = $(man_MANS) vrml2oogl_SOURCES = vrml2oogl.C LDADD = ./lib/libQv.a all: all-recursive .SUFFIXES: .SUFFIXES: .C .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/vrml2oogl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/vrml2oogl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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 \ || test -f $$p1 \ ; 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(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: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list vrml2oogl$(EXEEXT): $(vrml2oogl_OBJECTS) $(vrml2oogl_DEPENDENCIES) $(EXTRA_vrml2oogl_DEPENDENCIES) @rm -f vrml2oogl$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(vrml2oogl_OBJECTS) $(vrml2oogl_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vrml2oogl.Po@am__quote@ .C.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.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 $@ $< .C.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.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) '$<'` .C.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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" cscopelist: cscopelist-recursive 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) $(MANS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-man install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-binPROGRAMS clean-generic clean-libtool \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-man uninstall-man1 # 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: geomview-1.9.5/src/bin/geomutil/vrml2oogl/Makefile.am0000644000175000017500000000030112310110177017417 00000000000000INCLUDES = @default_includes@ -I$(srcdir)/lib SUBDIRS = lib bin_PROGRAMS = vrml2oogl man_MANS = vrml2oogl.1gv EXTRA_DIST = $(man_MANS) vrml2oogl_SOURCES = vrml2oogl.C LDADD = ./lib/libQv.a geomview-1.9.5/src/bin/geomutil/vrml2oogl/vrml2oogl.C0000644000175000017500000000236212310110177017423 00000000000000#include #include #include #include #include #include int main(int argc, char **argv) { QvDB::init(); QvInput in; QvGroup root; char *handle = NULL; if (argc == 2) { handle = argv[1]; } else if (argc > 2) { fprintf(stderr, "Usage: vrml2oogl [handle] < vrmlfile > ooglfile\n\ Convert VRML file (possibly compressed/gzipped) into an OOGL file.\n\ handle: Return GCL not OOGL, where the OOGL geometry is defined as the handle.\n\ The handle generally corresponds to a URL.\n"); return(1); } if(! root.readChildren(&in)) { fprintf(stderr, "vrml2oogl: Couldn't parse VRML.\n"); } if (handle) { fprintf(stdout, "(progn (read geometry {define \"%s\" {\n", handle); } else { fprintf(stdout, "{\n"); } QvState state; OOGLhandle(handle); OOGLfile(stdout); root.ToWebOOGL(&state); if (handle) { int i; fprintf(stdout, "}})\n"); for (i = 0; i < OOGLnumuniq(); i++) { fprintf(stdout, " (emodule-transmit \"weboogl.perl\" \"(NeedURL %s)\n\")\n", OOGLgeturls(i)); } fprintf(stdout, " )\n "); } else { fprintf(stdout, "}\n"); } return 0; } geomview-1.9.5/src/bin/geomutil/vrml2oogl/vrml2oogl.1gv0000644000175000017500000000125212310110177017733 00000000000000.\" Hey, EMACS: -*- nroff -*- .TH VRML2OOGL 1gv "February 23, 2001" .SH NAME vrml2oogl \- convert VRML to OOGL .SH SYNOPSIS .B vrml2oogl .I [handle] .SH DESCRIPTION This manual page documents briefly the .B vrml2oogl command. .PP .B vrml2oogl Convert VRML file (possibly compressed/gzipped) into an OOGL file. If a handle is given, return GCL not OOGL, where the OOGL geometry is defined as the handle. The handle generally corresponds to a URL. .SH SEE ALSO .BR geomview (1). .BR oogl2vrml (1). .SH AUTHOR This manual page was written by Steve Robbins , for the Debian GNU/Linux system (but may be used by others). geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/0000755000175000017500000000000012310165604016224 500000000000000geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/Makefile.in0000644000175000017500000007301312310165552020217 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/geomutil/vrml2oogl/lib DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libQv_a_AR = $(AR) $(ARFLAGS) libQv_a_LIBADD = am_libQv_a_OBJECTS = QvAsciiText.$(OBJEXT) QvChildList.$(OBJEXT) \ QvCone.$(OBJEXT) QvCoordinate3.$(OBJEXT) QvCube.$(OBJEXT) \ QvCylinder.$(OBJEXT) QvDB.$(OBJEXT) QvDebugError.$(OBJEXT) \ QvDict.$(OBJEXT) QvDirectionalLight.$(OBJEXT) \ QvElement.$(OBJEXT) QvField.$(OBJEXT) QvFieldData.$(OBJEXT) \ QvFontStyle.$(OBJEXT) QvGroup.$(OBJEXT) \ QvIndexedFaceSet.$(OBJEXT) QvIndexedLineSet.$(OBJEXT) \ QvInfo.$(OBJEXT) QvInput.$(OBJEXT) QvLists.$(OBJEXT) \ QvLOD.$(OBJEXT) QvMFColor.$(OBJEXT) QvMFFloat.$(OBJEXT) \ QvMFLong.$(OBJEXT) QvMFString.$(OBJEXT) QvMFVec2f.$(OBJEXT) \ QvMFVec3f.$(OBJEXT) QvMaterial.$(OBJEXT) \ QvMaterialBinding.$(OBJEXT) QvMatrixTransform.$(OBJEXT) \ QvName.$(OBJEXT) QvNode.$(OBJEXT) QvNormal.$(OBJEXT) \ QvNormalBinding.$(OBJEXT) QvOrthographicCamera.$(OBJEXT) \ QvPList.$(OBJEXT) QvPerspectiveCamera.$(OBJEXT) \ QvPointLight.$(OBJEXT) QvPointSet.$(OBJEXT) \ QvReadError.$(OBJEXT) QvRotation.$(OBJEXT) \ QvSFBitMask.$(OBJEXT) QvSFBool.$(OBJEXT) QvSFColor.$(OBJEXT) \ QvSFEnum.$(OBJEXT) QvSFFloat.$(OBJEXT) QvSFImage.$(OBJEXT) \ QvSFLong.$(OBJEXT) QvSFMatrix.$(OBJEXT) QvSFRotation.$(OBJEXT) \ QvSFString.$(OBJEXT) QvSFVec2f.$(OBJEXT) QvSFVec3f.$(OBJEXT) \ QvScale.$(OBJEXT) QvSeparator.$(OBJEXT) QvShapeHints.$(OBJEXT) \ QvSphere.$(OBJEXT) QvSpotLight.$(OBJEXT) QvState.$(OBJEXT) \ QvString.$(OBJEXT) QvSwitch.$(OBJEXT) QvTexture2.$(OBJEXT) \ QvTexture2Transform.$(OBJEXT) QvTextureCoordinate2.$(OBJEXT) \ QvTransform.$(OBJEXT) QvTransformSeparator.$(OBJEXT) \ QvTranslation.$(OBJEXT) QvTraverse.$(OBJEXT) \ QvToWebOOGL.$(OBJEXT) QvUnknownNode.$(OBJEXT) \ QvWWWAnchor.$(OBJEXT) QvWWWInline.$(OBJEXT) libQv_a_OBJECTS = $(am_libQv_a_OBJECTS) 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) 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 = LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(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 = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(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 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libQv_a_SOURCES) DIST_SOURCES = $(libQv_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = @default_includes@ noinst_LIBRARIES = libQv.a libQv_a_SOURCES = \ QvAsciiText.c++ \ QvChildList.c++ \ QvCone.c++ \ QvCoordinate3.c++ \ QvCube.c++ \ QvCylinder.c++ \ QvDB.c++ \ QvDebugError.c++ \ QvDict.c++ \ QvDirectionalLight.c++ \ QvElement.c++ \ QvField.c++ \ QvFieldData.c++ \ QvFontStyle.c++ \ QvGroup.c++ \ QvIndexedFaceSet.c++ \ QvIndexedLineSet.c++ \ QvInfo.c++ \ QvInput.c++ \ QvLists.c++ \ QvLOD.c++ \ QvMFColor.c++ \ QvMFFloat.c++ \ QvMFLong.c++ \ QvMFString.c++ \ QvMFVec2f.c++ \ QvMFVec3f.c++ \ QvMaterial.c++ \ QvMaterialBinding.c++ \ QvMatrixTransform.c++ \ QvName.c++ \ QvNode.c++ \ QvNormal.c++ \ QvNormalBinding.c++ \ QvOrthographicCamera.c++ \ QvPList.c++ \ QvPerspectiveCamera.c++ \ QvPointLight.c++ \ QvPointSet.c++ \ QvReadError.c++ \ QvRotation.c++ \ QvSFBitMask.c++ \ QvSFBool.c++ \ QvSFColor.c++ \ QvSFEnum.c++ \ QvSFFloat.c++ \ QvSFImage.c++ \ QvSFLong.c++ \ QvSFMatrix.c++ \ QvSFRotation.c++ \ QvSFString.c++ \ QvSFVec2f.c++ \ QvSFVec3f.c++ \ QvScale.c++ \ QvSeparator.c++ \ QvShapeHints.c++ \ QvSphere.c++ \ QvSpotLight.c++ \ QvState.c++ \ QvString.c++ \ QvSwitch.c++ \ QvTexture2.c++ \ QvTexture2Transform.c++ \ QvTextureCoordinate2.c++ \ QvTransform.c++ \ QvTransformSeparator.c++ \ QvTranslation.c++ \ QvTraverse.c++ \ QvToWebOOGL.c++ \ QvUnknownNode.c++ \ QvWWWAnchor.c++ \ QvWWWInline.c++ \ \ QvAsciiText.h \ QvBasic.h \ QvChildList.h \ QvCone.h \ QvCoordinate3.h \ QvCube.h \ QvCylinder.h \ QvDB.h \ QvDebugError.h \ QvDict.h \ QvDirectionalLight.h \ QvElement.h \ QvField.h \ QvFieldData.h \ QvFields.h \ QvFontStyle.h \ QvGroup.h \ QvIndexedFaceSet.h \ QvIndexedLineSet.h \ QvInfo.h \ QvInput.h \ QvLOD.h \ QvLists.h \ QvMFColor.h \ QvMFFloat.h \ QvMFLong.h \ QvMFString.h \ QvMFVec2f.h \ QvMFVec3f.h \ QvMaterial.h \ QvMaterialBinding.h \ QvMatrixTransform.h \ QvNode.h \ QvNodes.h \ QvNormal.h \ QvNormalBinding.h \ QvOrthographicCamera.h \ QvPList.h \ QvPerspectiveCamera.h \ QvPointLight.h \ QvPointSet.h \ QvReadError.h \ QvRotation.h \ QvSFBitMask.h \ QvSFBool.h \ QvSFColor.h \ QvSFEnum.h \ QvSFFloat.h \ QvSFImage.h \ QvSFLong.h \ QvSFMatrix.h \ QvSFRotation.h \ QvSFString.h \ QvSFVec2f.h \ QvSFVec3f.h \ QvScale.h \ QvSeparator.h \ QvShapeHints.h \ QvSphere.h \ QvSpotLight.h \ QvState.h \ QvString.h \ QvSubField.h \ QvSubNode.h \ QvSwitch.h \ QvTexture2.h \ QvTexture2Transform.h \ QvTextureCoordinate2.h \ QvToWebOOGL.h \ QvTransform.h \ QvTransformSeparator.h \ QvTranslation.h \ QvUnknownNode.h \ QvWWWAnchor.h \ QvWWWInline.h EXTRA_DIST = Qv.c++ QvErrors.c++ QvFields.c++ QvNodes.c++ all: all-am .SUFFIXES: .SUFFIXES: .c++ .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/vrml2oogl/lib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/vrml2oogl/lib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libQv.a: $(libQv_a_OBJECTS) $(libQv_a_DEPENDENCIES) $(EXTRA_libQv_a_DEPENDENCIES) $(AM_V_at)-rm -f libQv.a $(AM_V_AR)$(libQv_a_AR) libQv.a $(libQv_a_OBJECTS) $(libQv_a_LIBADD) $(AM_V_at)$(RANLIB) libQv.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvAsciiText.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvChildList.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvCone.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvCoordinate3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvCube.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvCylinder.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvDB.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvDebugError.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvDict.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvDirectionalLight.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvElement.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvField.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvFieldData.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvFontStyle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvGroup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvIndexedFaceSet.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvIndexedLineSet.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvInfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvInput.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvLOD.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvLists.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMFColor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMFFloat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMFLong.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMFString.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMFVec2f.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMFVec3f.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMaterial.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMaterialBinding.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMatrixTransform.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvName.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvNode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvNormal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvNormalBinding.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvOrthographicCamera.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvPList.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvPerspectiveCamera.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvPointLight.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvPointSet.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvReadError.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvRotation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFBitMask.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFBool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFColor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFEnum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFFloat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFImage.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFLong.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFMatrix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFRotation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFString.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFVec2f.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFVec3f.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvScale.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSeparator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvShapeHints.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSphere.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSpotLight.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvState.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvString.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSwitch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvTexture2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvTexture2Transform.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvTextureCoordinate2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvToWebOOGL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvTransform.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvTransformSeparator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvTranslation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvTraverse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvUnknownNode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvWWWAnchor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvWWWInline.Po@am__quote@ .c++.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.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 $@ $< .c++.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.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) '$<'` .c++.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/Makefile.am0000644000175000017500000000637212310110177020203 00000000000000INCLUDES = @default_includes@ noinst_LIBRARIES = libQv.a libQv_a_SOURCES = \ QvAsciiText.c++ \ QvChildList.c++ \ QvCone.c++ \ QvCoordinate3.c++ \ QvCube.c++ \ QvCylinder.c++ \ QvDB.c++ \ QvDebugError.c++ \ QvDict.c++ \ QvDirectionalLight.c++ \ QvElement.c++ \ QvField.c++ \ QvFieldData.c++ \ QvFontStyle.c++ \ QvGroup.c++ \ QvIndexedFaceSet.c++ \ QvIndexedLineSet.c++ \ QvInfo.c++ \ QvInput.c++ \ QvLists.c++ \ QvLOD.c++ \ QvMFColor.c++ \ QvMFFloat.c++ \ QvMFLong.c++ \ QvMFString.c++ \ QvMFVec2f.c++ \ QvMFVec3f.c++ \ QvMaterial.c++ \ QvMaterialBinding.c++ \ QvMatrixTransform.c++ \ QvName.c++ \ QvNode.c++ \ QvNormal.c++ \ QvNormalBinding.c++ \ QvOrthographicCamera.c++ \ QvPList.c++ \ QvPerspectiveCamera.c++ \ QvPointLight.c++ \ QvPointSet.c++ \ QvReadError.c++ \ QvRotation.c++ \ QvSFBitMask.c++ \ QvSFBool.c++ \ QvSFColor.c++ \ QvSFEnum.c++ \ QvSFFloat.c++ \ QvSFImage.c++ \ QvSFLong.c++ \ QvSFMatrix.c++ \ QvSFRotation.c++ \ QvSFString.c++ \ QvSFVec2f.c++ \ QvSFVec3f.c++ \ QvScale.c++ \ QvSeparator.c++ \ QvShapeHints.c++ \ QvSphere.c++ \ QvSpotLight.c++ \ QvState.c++ \ QvString.c++ \ QvSwitch.c++ \ QvTexture2.c++ \ QvTexture2Transform.c++ \ QvTextureCoordinate2.c++ \ QvTransform.c++ \ QvTransformSeparator.c++ \ QvTranslation.c++ \ QvTraverse.c++ \ QvToWebOOGL.c++ \ QvUnknownNode.c++ \ QvWWWAnchor.c++ \ QvWWWInline.c++ \ \ QvAsciiText.h \ QvBasic.h \ QvChildList.h \ QvCone.h \ QvCoordinate3.h \ QvCube.h \ QvCylinder.h \ QvDB.h \ QvDebugError.h \ QvDict.h \ QvDirectionalLight.h \ QvElement.h \ QvField.h \ QvFieldData.h \ QvFields.h \ QvFontStyle.h \ QvGroup.h \ QvIndexedFaceSet.h \ QvIndexedLineSet.h \ QvInfo.h \ QvInput.h \ QvLOD.h \ QvLists.h \ QvMFColor.h \ QvMFFloat.h \ QvMFLong.h \ QvMFString.h \ QvMFVec2f.h \ QvMFVec3f.h \ QvMaterial.h \ QvMaterialBinding.h \ QvMatrixTransform.h \ QvNode.h \ QvNodes.h \ QvNormal.h \ QvNormalBinding.h \ QvOrthographicCamera.h \ QvPList.h \ QvPerspectiveCamera.h \ QvPointLight.h \ QvPointSet.h \ QvReadError.h \ QvRotation.h \ QvSFBitMask.h \ QvSFBool.h \ QvSFColor.h \ QvSFEnum.h \ QvSFFloat.h \ QvSFImage.h \ QvSFLong.h \ QvSFMatrix.h \ QvSFRotation.h \ QvSFString.h \ QvSFVec2f.h \ QvSFVec3f.h \ QvScale.h \ QvSeparator.h \ QvShapeHints.h \ QvSphere.h \ QvSpotLight.h \ QvState.h \ QvString.h \ QvSubField.h \ QvSubNode.h \ QvSwitch.h \ QvTexture2.h \ QvTexture2Transform.h \ QvTextureCoordinate2.h \ QvToWebOOGL.h \ QvTransform.h \ QvTransformSeparator.h \ QvTranslation.h \ QvUnknownNode.h \ QvWWWAnchor.h \ QvWWWInline.h EXTRA_DIST = Qv.c++ QvErrors.c++ QvFields.c++ QvNodes.c++ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvAsciiText.c++0000644000175000017500000000120312310110177020631 00000000000000#include QV_NODE_SOURCE(QvAsciiText); QvAsciiText::QvAsciiText() { QV_NODE_CONSTRUCTOR(QvAsciiText); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(string); QV_NODE_ADD_FIELD(spacing); QV_NODE_ADD_FIELD(justification); QV_NODE_ADD_FIELD(width); string.values[0] = ""; spacing.value = 1.0; justification.value = LEFT; width.values[0] = 0; QV_NODE_DEFINE_ENUM_VALUE(Justification, LEFT); QV_NODE_DEFINE_ENUM_VALUE(Justification, CENTER); QV_NODE_DEFINE_ENUM_VALUE(Justification, RIGHT); QV_NODE_SET_SF_ENUM_TYPE(justification, Justification); } QvAsciiText::~QvAsciiText() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvChildList.c++0000644000175000017500000000017212310110177020617 00000000000000#include QvChildList::QvChildList() : QvNodeList() { } QvChildList::~QvChildList() { truncate(0); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvCone.c++0000644000175000017500000000076212310110177017631 00000000000000#include QV_NODE_SOURCE(QvCone); QvCone::QvCone() { QV_NODE_CONSTRUCTOR(QvCone); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(parts); QV_NODE_ADD_FIELD(bottomRadius); QV_NODE_ADD_FIELD(height); parts.value = ALL; bottomRadius.value = 1.0; height.value = 2.0; QV_NODE_DEFINE_ENUM_VALUE(Part, SIDES); QV_NODE_DEFINE_ENUM_VALUE(Part, BOTTOM); QV_NODE_DEFINE_ENUM_VALUE(Part, ALL); QV_NODE_SET_SF_ENUM_TYPE(parts, Part); } QvCone::~QvCone() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvCoordinate3.c++0000644000175000017500000000044112310110177021111 00000000000000#include QV_NODE_SOURCE(QvCoordinate3); QvCoordinate3::QvCoordinate3() { QV_NODE_CONSTRUCTOR(QvCoordinate3); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(point); point.values[0] = point.values[1] = point.values[2] = 0.0; } QvCoordinate3::~QvCoordinate3() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvCube.c++0000644000175000017500000000046412310110177017622 00000000000000#include QV_NODE_SOURCE(QvCube); QvCube::QvCube() { QV_NODE_CONSTRUCTOR(QvCube); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(width); QV_NODE_ADD_FIELD(height); QV_NODE_ADD_FIELD(depth); width.value = 2.0; height.value = 2.0; depth.value = 2.0; } QvCube::~QvCube() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvCylinder.c++0000644000175000017500000000105412310110177020511 00000000000000#include QV_NODE_SOURCE(QvCylinder); QvCylinder::QvCylinder() { QV_NODE_CONSTRUCTOR(QvCylinder); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(parts); QV_NODE_ADD_FIELD(radius); QV_NODE_ADD_FIELD(height); parts.value = ALL; radius.value = 1.0; height.value = 2.0; QV_NODE_DEFINE_ENUM_VALUE(Part, SIDES); QV_NODE_DEFINE_ENUM_VALUE(Part, TOP); QV_NODE_DEFINE_ENUM_VALUE(Part, BOTTOM); QV_NODE_DEFINE_ENUM_VALUE(Part, ALL); QV_NODE_SET_SF_ENUM_TYPE(parts, Part); } QvCylinder::~QvCylinder() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvDB.c++0000644000175000017500000000072412310110177017230 00000000000000#include #include #include #include const char *QvDB::versionString = "Reference VRML Parser 1.0"; void QvDB::init() { QvNode::init(); } QvBool QvDB::read(QvInput *in, QvNode *&node) { QvBool ret; ret = QvNode::read(in, node); if (ret && node == NULL && ! in->eof()) { char c; in->get(c); QvReadError::post(in, "Extra characters ('%c') found in input", c); ret = FALSE; } return ret; } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvDebugError.c++0000644000175000017500000000052512310110177021002 00000000000000#include #include #include void QvDebugError::post(const char *methodName, const char *formatString ...) { char buf[10000]; va_list ap; va_start(ap, formatString); vsprintf(buf, formatString, ap); va_end(ap); fprintf(stderr, "VRML error in %s(): %s\n", methodName, buf); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvDict.c++0000644000175000017500000000274012310110177017626 00000000000000#include struct QvDictListThing { QvPList *keyList; QvPList *valueList; }; QvDict::QvDict( int entries ) { tableSize=entries; buckets=new QvDictEntry *[tableSize]; for (int i = 0; i < tableSize; i++) buckets[i] = NULL; } QvDict::~QvDict() { clear(); delete [] buckets; } void QvDict::clear() { int i; QvDictEntry *entry, *nextEntry; for (i = 0; i < tableSize; i++) { for (entry = buckets[i]; entry != NULL; entry = nextEntry) { nextEntry = entry->next; delete entry; } buckets[i] = NULL; } } QvBool QvDict::enter(u_long key, void *value) { QvDictEntry *&entry = findEntry(key); if (entry == NULL) { entry = new QvDictEntry(key, value); entry->next = NULL; return TRUE; } else { entry->value = value; return FALSE; } } QvBool QvDict::find(u_long key, void *&value) const { QvDictEntry *&entry = findEntry(key); if (entry == NULL) { value = NULL; return FALSE; } else { value = entry->value; return TRUE; } } QvDictEntry *& QvDict::findEntry(u_long key) const { QvDictEntry **entry; entry = &buckets[key % tableSize]; while (*entry != NULL) { if ((*entry)->key == key) break; entry = &(*entry)->next; } return *entry; } QvBool QvDict::remove(u_long key) { QvDictEntry *&entry = findEntry(key); QvDictEntry *tmp; if (entry == NULL) return FALSE; else { tmp = entry; entry = entry->next; delete tmp; return TRUE; } } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvDirectionalLight.c++0000644000175000017500000000105312310110177022164 00000000000000#include QV_NODE_SOURCE(QvDirectionalLight); QvDirectionalLight::QvDirectionalLight() { QV_NODE_CONSTRUCTOR(QvDirectionalLight); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(on); QV_NODE_ADD_FIELD(intensity); QV_NODE_ADD_FIELD(color); QV_NODE_ADD_FIELD(direction); on.value = TRUE; intensity.value = 1.0; color.value[0] = color.value[1] = color.value[2] = 1.0; direction.value[0] = 0.0; direction.value[1] = 0.0; direction.value[2] = -1.0; } QvDirectionalLight::~QvDirectionalLight() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvElement.c++0000644000175000017500000000123412310110177020331 00000000000000#include const char *QvElement::nodeTypeNames[NumNodeTypes] = { "Unknown", "OrthographicCamera", "PerspectiveCamera", "DirectionalLight", "PointLight", "SpotLight", "NoOpTransform", "MatrixTransform", "Rotation", "Scale", "Transform", "Translation", }; QvElement::QvElement() { // These will be set to something real when the element is // added to the state depth = -1; next = NULL; // Presumably, the caller will set these data = NULL; type = Unknown; } QvElement::~QvElement() { } void QvElement::print() { printf("\t\tElement of type %s\n", nodeTypeNames[type]); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvField.c++0000644000175000017500000000534312310110177017770 00000000000000#include #include #include // Special characters in files #define OPEN_BRACE_CHAR '[' #define CLOSE_BRACE_CHAR ']' #define VALUE_SEPARATOR_CHAR ',' QvField::~QvField() { } void QvField::setContainer(QvNode *cont) { container = cont; setDefault(TRUE); } QvBool QvField::read(QvInput *in, const QvName &name) { setDefault(FALSE); if (! readValue(in)) { QvReadError::post(in, "Couldn't read value for field \"%s\"", name.getString()); return FALSE; } return TRUE; } QvField * QvField::createInstanceFromName(const QvName &className) { #define TRY_CLASS(name, class) \ else if (className == name) \ inst = new class QvField *inst = NULL; if (0) ; // So "else" works in first TRY_CLASS TRY_CLASS("MFColor", QvMFColor); TRY_CLASS("MFFloat", QvMFFloat); TRY_CLASS("MFLong", QvMFLong); TRY_CLASS("MFString", QvMFString); TRY_CLASS("MFVec2f", QvMFVec2f); TRY_CLASS("MFVec3f", QvMFVec3f); TRY_CLASS("SFBitMask", QvSFBitMask); TRY_CLASS("SFBool", QvSFBool); TRY_CLASS("SFColor", QvSFColor); TRY_CLASS("SFEnum", QvSFEnum); TRY_CLASS("SFFloat", QvSFFloat); TRY_CLASS("SFImage", QvSFImage); TRY_CLASS("SFLong", QvSFLong); TRY_CLASS("SFMatrix", QvSFMatrix); TRY_CLASS("SFRotation", QvSFRotation); TRY_CLASS("SFString", QvSFString); TRY_CLASS("SFVec2f", QvSFVec2f); TRY_CLASS("SFVec3f", QvSFVec3f); return inst; #undef TRY_CLASS } QvSField::QvSField() { } QvSField::~QvSField() { } QvMField::QvMField() { maxNum = num = 0; } QvMField::~QvMField() { } void QvMField::makeRoom(int newNum) { if (newNum != num) allocValues(newNum); } QvBool QvMField::readValue(QvInput *in) { char c; int curIndex = 0; if (in->read(c) && c == OPEN_BRACE_CHAR) { if (in->read(c) && c == CLOSE_BRACE_CHAR) ; else { in->putBack(c); while (TRUE) { if (curIndex >= num) makeRoom(curIndex + 1); if (! read1Value(in, curIndex++) || ! in->read(c)) { QvReadError::post(in, "Couldn't read value %d of field", curIndex); return FALSE; } if (c == VALUE_SEPARATOR_CHAR) { if (in->read(c)) { if (c == CLOSE_BRACE_CHAR) break; else in->putBack(c); } } else if (c == CLOSE_BRACE_CHAR) break; else { QvReadError::post(in, "Expected '%c' or '%c' but got " "'%c' while reading value %d", VALUE_SEPARATOR_CHAR, CLOSE_BRACE_CHAR, c, curIndex); return FALSE; } } } if (curIndex < num) makeRoom(curIndex); } else { in->putBack(c); makeRoom(1); if (! read1Value(in, 0)) return FALSE; } return TRUE; } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvFieldData.c++0000644000175000017500000001244612310110177020564 00000000000000#include #include #include #include #include #define OPEN_BRACE_CHAR '[' #define CLOSE_BRACE_CHAR ']' #define VALUE_SEPARATOR_CHAR ',' struct QvFieldEntry { QvName name; long offset; }; struct QvEnumEntry { QvName typeName; int num; int arraySize; int *vals; QvName *names; QvEnumEntry(const QvName &name); ~QvEnumEntry(); static int growSize; }; int QvEnumEntry::growSize = 6; QvEnumEntry::QvEnumEntry(const QvName &name) { typeName = name; num = 0; arraySize = growSize; vals = new int[arraySize]; names = new QvName[arraySize]; } QvEnumEntry::~QvEnumEntry() { delete [] vals; delete [] names; } QvFieldData::~QvFieldData() { struct QvFieldEntry *tmpField; struct QvEnumEntry *tmpEnum; for (int i=0; iname = fieldName; newField->offset = (const char *) field - (const char *) defobj; fields.append((void *) newField); } const QvName & QvFieldData::getFieldName(int index) const { return ((QvFieldEntry *) fields[index])->name; } QvField * QvFieldData::getField(const QvNode *object, int index) const { return (QvField *) ((char *) object + ((QvFieldEntry *) fields[index])->offset); } #include static QvName stripWhite(const char *name) { int firstchar = -1; int lastchar = -1; int lastwhite = -1; int i; for (i=0; name[i]; i++) { if (isspace(name[i])) lastwhite = i; else { if (firstchar == -1) firstchar = i; lastchar = i; } } if (lastchar > lastwhite) return QvName(&name[firstchar]); char buf[500]; int b; for (b=0, i=firstchar; i<=lastchar; i++, b++) buf[b] = name[i]; buf[b] = 0; return QvName(buf); } void QvFieldData::addEnumValue(const char *typeNameArg, const char *valNameArg, int val) { struct QvEnumEntry *e = NULL; QvName typeName = stripWhite(typeNameArg); QvName valName = stripWhite(valNameArg); for (int i=0; itypeName == typeName) break; else e = NULL; } if (e == NULL) { e = new QvEnumEntry(typeName); enums.append((void*) e); } if (e->num == e->arraySize) { e->arraySize += QvEnumEntry::growSize; int *ovals = e->vals; QvName *onames = e->names; e->vals = new int[e->arraySize]; e->names = new QvName[e->arraySize]; for (int i=0; inum; i++) { e->vals[i] = ovals[i]; e->names[i] = onames[i]; } delete [] ovals; delete [] onames; } e->vals[e->num] = val; e->names[e->num] = valName; e->num++; } void QvFieldData::getEnumData(const char *typeNameArg, int &num, const int *&vals, const QvName *&names) { QvName typeName = stripWhite(typeNameArg); for (int i=0; itypeName == typeName) { num = e->num; vals = e->vals; names = e->names; return; } } num = 0; vals = NULL; names = NULL; } QvBool QvFieldData::readFieldTypes(QvInput *in, QvNode *object) { QvName fieldType, fieldName; char c; if (! (in->read(c) || c != OPEN_BRACE_CHAR)) return FALSE; if (in->read(c) && c == CLOSE_BRACE_CHAR) return TRUE; in->putBack(c); QvBool alreadyHasFields = (object->isBuiltIn || getNumFields() != 0); while (TRUE) { if (! in->read(fieldType, TRUE) || ! in->read(fieldName, TRUE)) return FALSE; if (! alreadyHasFields) { QvField *fld = QvField::createInstanceFromName(fieldType); fld->setContainer(object); addField(object, fieldName.getString(), fld); } if (! in->read(c)) return FALSE; if (c == VALUE_SEPARATOR_CHAR) { if (in->read(c)) { if (c == CLOSE_BRACE_CHAR) return TRUE; else in->putBack(c); } } else if (c == CLOSE_BRACE_CHAR) return TRUE; else return FALSE; } } QvBool QvFieldData::read(QvInput *in, QvNode *object, QvBool errorOnUnknownField) const { QvName fieldName; if (fields.getLength() == 0) return TRUE; while (TRUE) { if (! in->read(fieldName, TRUE) || ! fieldName) return TRUE; QvBool foundName; if (! read(in, object, fieldName, foundName)) return FALSE; if (!foundName) { if (errorOnUnknownField) { QvReadError::post(in, "Unknown field \"%s\"", fieldName.getString()); return FALSE; } else { in->putBack(fieldName.getString()); return TRUE; } } } } QvBool QvFieldData::read(QvInput *in, QvNode *object, const QvName &fieldName, QvBool &foundName) const { int i; for (i = 0; i < fields.getLength(); i++) { if (fieldName == getFieldName(i)) { if (! getField(object, i)->read(in, fieldName)) return FALSE; break; } } if (i == fields.getLength()) foundName = FALSE; else foundName = TRUE; return TRUE; } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvFontStyle.c++0000644000175000017500000000131312310110177020665 00000000000000#include QV_NODE_SOURCE(QvFontStyle); QvFontStyle::QvFontStyle() { QV_NODE_CONSTRUCTOR(QvFontStyle); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(size); QV_NODE_ADD_FIELD(family); QV_NODE_ADD_FIELD(style); size.value = 10.0; family.value = SERIF; style.value = NONE; QV_NODE_DEFINE_ENUM_VALUE(Family, SERIF); QV_NODE_DEFINE_ENUM_VALUE(Family, SANS); QV_NODE_DEFINE_ENUM_VALUE(Family, TYPEWRITER); QV_NODE_DEFINE_ENUM_VALUE(Style, NONE); QV_NODE_DEFINE_ENUM_VALUE(Style, BOLD); QV_NODE_DEFINE_ENUM_VALUE(Style, ITALIC); QV_NODE_SET_SF_ENUM_TYPE(family, Family); QV_NODE_SET_SF_ENUM_TYPE(style, Style); } QvFontStyle::~QvFontStyle() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvGroup.c++0000644000175000017500000000240212310110177020032 00000000000000#include #include #include #include #include QV_NODE_SOURCE(QvGroup); QvGroup::QvGroup() { children = new QvChildList(); QV_NODE_CONSTRUCTOR(QvGroup); isBuiltIn = TRUE; } QvGroup::~QvGroup() { delete children; } QvNode * QvGroup::getChild(int index) const { return(*children)[index]; } int QvGroup::getNumChildren() const { return children->getLength(); } QvChildList * QvGroup::getChildren() const { return children; } QvBool QvGroup::readInstance(QvInput *in) { QvName typeString; QvFieldData *fieldData = getFieldData(); if (! isBuiltIn) { if (in->read(typeString, TRUE)) { if (typeString == "fields") { if (! fieldData->readFieldTypes(in, this)) { QvReadError::post(in, "Bad field specifications for node"); return FALSE; } } else in->putBack(typeString.getString()); } } return (fieldData->read(in, this, FALSE) && readChildren(in)); } QvBool QvGroup::readChildren(QvInput *in) { QvNode *child; QvBool ret = TRUE; while (TRUE) { if (read(in, child)) { if (child != NULL) children->append(child); else break; } else { ret = FALSE; break; } } return ret; } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvIndexedFaceSet.c++0000644000175000017500000000104312310110177021551 00000000000000#include QV_NODE_SOURCE(QvIndexedFaceSet); QvIndexedFaceSet::QvIndexedFaceSet() { QV_NODE_CONSTRUCTOR(QvIndexedFaceSet); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(coordIndex); QV_NODE_ADD_FIELD(materialIndex); QV_NODE_ADD_FIELD(normalIndex); QV_NODE_ADD_FIELD(textureCoordIndex); coordIndex.values[0] = 0; materialIndex.values[0] = QV_END_FACE_INDEX; normalIndex.values[0] = QV_END_FACE_INDEX; textureCoordIndex.values[0] = QV_END_FACE_INDEX; } QvIndexedFaceSet::~QvIndexedFaceSet() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvIndexedLineSet.c++0000644000175000017500000000104312310110177021602 00000000000000#include QV_NODE_SOURCE(QvIndexedLineSet); QvIndexedLineSet::QvIndexedLineSet() { QV_NODE_CONSTRUCTOR(QvIndexedLineSet); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(coordIndex); QV_NODE_ADD_FIELD(materialIndex); QV_NODE_ADD_FIELD(normalIndex); QV_NODE_ADD_FIELD(textureCoordIndex); coordIndex.values[0] = 0; materialIndex.values[0] = QV_END_LINE_INDEX; normalIndex.values[0] = QV_END_LINE_INDEX; textureCoordIndex.values[0] = QV_END_LINE_INDEX; } QvIndexedLineSet::~QvIndexedLineSet() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvInfo.c++0000644000175000017500000000033112310110177017630 00000000000000#include QV_NODE_SOURCE(QvInfo); QvInfo::QvInfo() { QV_NODE_CONSTRUCTOR(QvInfo); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(string); string.value = ""; } QvInfo::~QvInfo() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvInput.c++0000644000175000017500000002333312310110177020043 00000000000000#include #include #include #include #include #include #include #define CURVERSION 1.0 // Current version of file format #define COMMENT_CHAR '#' #define COMPRESS_CHAR 0x1F /* First byte of compressed or gzipped file */ static const int numValidASCIIHeaders = 1; struct headerStorage { const char *string; float version; }; static const headerStorage ASCIIHeader[1] = { { "#VRML V1.0 ascii", /* 20 chars */ 1.0 }, }; float QvInput::isASCIIHeader(const char *string) { for (int i = 0; i < numValidASCIIHeaders; i++) { if (strcmp(ASCIIHeader[i].string, string) == 0) return ASCIIHeader[i].version; } return FALSE; } QvInput::QvInput() { setFilePointer(stdin); } QvInput::~QvInput() { } void QvInput::setFilePointer(FILE *newFP) { fp = newFP; lineNum = 1; version = CURVERSION; readHeader = FALSE; headerOk = TRUE; backBufIndex = -1; } float QvInput::getVersion() { if (! readHeader) (void) checkHeader(); return version; } QvBool QvInput::get(char &c) { QvBool ret; if (backBufIndex >= 0) { c = backBuf.getString()[backBufIndex++]; if (c != '\0') return TRUE; backBuf.makeEmpty(); backBufIndex = -1; } if (! readHeader && ! checkHeader()) return FALSE; if (eof()) { c = (char)EOF; ret = FALSE; } else { int i = getc(fp); if (i == EOF) { c = (char)EOF; ret = FALSE; } else { c = (char) i; ret = TRUE; } } return ret; } QvBool QvInput::read(char &c) { return (skipWhiteSpace() && get(c)); } QvBool QvInput::read(QvString &s) { if (! skipWhiteSpace()) return FALSE; QvBool quoted; char c; char bufStore[256]; char *buf; int bytesLeft; s.makeEmpty(); if (! get(c)) return FALSE; quoted = (c == '\"'); if (! quoted) putBack(c); do { buf = bufStore; bytesLeft = sizeof(bufStore) - 1; while (bytesLeft > 0) { if (! get(*buf)) break; if (quoted) { if (*buf == '\"') break; if (*buf == '\\') { if ((get(c)) && c == '\"') *buf = '\"'; else putBack(c); } if (*buf == '\n') lineNum++; } else if (isspace(*buf)) { putBack(*buf); break; } buf++; bytesLeft--; } *buf = '\0'; s += bufStore; } while (bytesLeft == 0); return TRUE; } QvBool QvInput::read(QvName &n, QvBool validIdent) { QvBool gotChar; if (! skipWhiteSpace()) return FALSE; if (! validIdent) { QvString s; if (! read(s)) return FALSE; n = s; } else { char buf[256]; char *b = buf; char c; if ((gotChar = get(c)) && QvName::isIdentStartChar(c)) { *b++ = c; while ((gotChar = get(c)) && QvName::isIdentChar(c)) { if (b - buf < 255) *b++ = c; } } *b = '\0'; if (gotChar) putBack(c); n = buf; } return TRUE; } #define READ_NUM(reader, readType, num, type) \ QvBool ok; \ if (! skipWhiteSpace()) \ ok = FALSE; \ else { \ readType _tmp; \ ok = reader(_tmp); \ if (ok) \ num = (type) _tmp; \ } \ return ok #define READ_INTEGER(num, type) \ READ_NUM(readInteger, long, num, type) #define READ_UNSIGNED_INTEGER(num, type) \ READ_NUM(readUnsignedInteger, unsigned long, num, type) #define READ_REAL(num, type) \ READ_NUM(readReal, double, num, type) QvBool QvInput::read(int &i) { READ_INTEGER(i, int); } QvBool QvInput::read(unsigned int &i) { READ_UNSIGNED_INTEGER(i, unsigned int); } QvBool QvInput::read(short &s) { READ_INTEGER(s, short); } QvBool QvInput::read(unsigned short &s) { READ_UNSIGNED_INTEGER(s, unsigned short); } QvBool QvInput::read(long &l) { READ_INTEGER(l, long); } QvBool QvInput::read(unsigned long &l) { READ_UNSIGNED_INTEGER(l, unsigned long); } QvBool QvInput::read(float &f) { READ_REAL(f, float); } QvBool QvInput::read(double &d) { READ_REAL(d, double); } QvBool QvInput::eof() const { return feof(fp); } void QvInput::getLocationString(QvString &string) const { char buf[128]; sprintf(buf, "\tOccurred at line %3d", lineNum); string = buf; } void QvInput::putBack(char c) { if (c == (char) EOF) return; if (backBufIndex >= 0) --backBufIndex; else ungetc(c, fp); } void QvInput::putBack(const char *string) { backBuf = string; backBufIndex = 0; } #if defined(unix) || defined(__unix) # include static FILE * spliceDecompress(QvInput *in, FILE *fp, char c) { int pfd[2], zpfd[2]; int k = 0; FILE *togz = (FILE *)NULL; /* Build a pipeline: * 0x1F+"in"data->zpfd[1] => zpfd[0]->gzip->pfd[1] => pfd[0]->parser */ if(pipe(pfd) < 0 || pipe(zpfd) < 0) { QvReadError::post(in, "Can't make pipe to read compressed VRML"); return NULL; } switch(fork()) { case -1: QvReadError::post(in, "Can't fork subprocess to decompress VRML"); return NULL; case 0: close(pfd[0]); switch(fork()) { case -1: QvReadError::post(in, "Can't fork subprocess to decompress VRML"); _exit(1); case 0: int ch; togz = fdopen(zpfd[1], "w"); close(pfd[1]); close(zpfd[0]); putc(c, togz); while((ch = getc(fp)) != EOF) { putc(ch, togz); k++; } fflush(togz); _exit(0); default: close(zpfd[1]); if(zpfd[0] != 0) { dup2(zpfd[0], 0); close(zpfd[0]); } if(pfd[1] != 1) { dup2(pfd[1], 1); close(pfd[1]); } execlp("gzip", "gzip", "-d", NULL); execlp("compress", "compress", "-d", NULL); QvReadError::post(in, "Can't exec gzip nor compress to read compressed VRML"); _exit(1); } default: close(pfd[1]); close(zpfd[0]); close(zpfd[1]); return fdopen(pfd[0], "r"); } } #endif /* unix */ QvBool QvInput::checkHeader() { char c; readHeader = TRUE; /* Read first character cautiously, in case we need to reroute input. * Ugh. Is there no clean way to do this? */ int got; #if defined(unix) || defined(__unix) got = ::read(fileno(fp), &c, 1) > 0; if(got && c == COMPRESS_CHAR) { if((fp = spliceDecompress(this, fp, c)) == NULL) { headerOk = FALSE; return FALSE; } got = get(c); } #else got = get(c); #endif if(got) { if (c == COMMENT_CHAR) { char buf[256]; int i = 0; buf[i++] = c; while (get(c) && c != '\n') buf[i++] = c; if(i>0 && buf[i-1] == '\r') i--; buf[i] = '\0'; if (c == '\n') lineNum++; if ((version = isASCIIHeader(buf))) return TRUE; } else putBack(c); } QvReadError::post(this, "File does not have a valid header string"); headerOk = FALSE; return FALSE; } QvBool QvInput::skipWhiteSpace() { char c; QvBool gotChar; if (! readHeader && ! checkHeader()) return FALSE; while (TRUE) { while ((gotChar = get(c)) && isspace(c)) if (c == '\n') lineNum++; if (! gotChar) break; if (c == COMMENT_CHAR) { while (get(c) && c != '\n') ; if (eof()) QvReadError::post(this, "EOF reached before end of comment"); else lineNum++; } else { putBack(c); break; } } return TRUE; } QvBool QvInput::readInteger(long &l) { char str[32]; char *s = str; if (readChar(s, '-') || readChar(s, '+')) s++; if (! readUnsignedIntegerString(s)) return FALSE; l = strtol(str, NULL, 0); return TRUE; } QvBool QvInput::readUnsignedInteger(unsigned long &l) { char str[32]; if (! readUnsignedIntegerString(str)) return FALSE; #ifdef sun l = atol(str); #else l = strtoul(str, NULL, 0); #endif return TRUE; } QvBool QvInput::readUnsignedIntegerString(char *str) { int minSize = 1; char *s = str; if (readChar(s, '0')) { if (readChar(s + 1, 'x')) { s += 2 + readHexDigits(s + 2); minSize = 3; } else s += 1 + readDigits(s + 1); } else s += readDigits(s); if (s - str < minSize) return FALSE; *s = '\0'; return TRUE; } QvBool QvInput::readReal(double &d) { char str[32]; int n; char *s = str; QvBool gotNum = FALSE; n = readChar(s, '-'); if (n == 0) n = readChar(s, '+'); s += n; if ((n = readDigits(s)) > 0) { gotNum = TRUE; s += n; } if (readChar(s, '.') > 0) { s++; if ((n = readDigits(s)) > 0) { gotNum = TRUE; s += n; } } if (! gotNum) return FALSE; n = readChar(s, 'e'); if (n == 0) n = readChar(s, 'E'); if (n > 0) { s += n; n = readChar(s, '-'); if (n == 0) n = readChar(s, '+'); s += n; if ((n = readDigits(s)) > 0) s += n; else return FALSE; } *s = '\0'; d = atof(str); return TRUE; } int QvInput::readDigits(char *string) { char c, *s = string; while (get(c)) { if (isdigit(c)) *s++ = c; else { putBack(c); break; } } return s - string; } int QvInput::readHexDigits(char *string) { char c, *s = string; while (get(c)) { if (isxdigit(c)) *s++ = c; else { putBack(c); break; } } return s - string; } int QvInput::readChar(char *string, char charToRead) { char c; int ret; if (! get(c)) ret = 0; else if (c == charToRead) { *string = c; ret = 1; } else { putBack(c); ret = 0; } return ret; } void QvInput::addReference(const QvName &name, QvNode *node) { refDict.enter((u_long) name.getString(), (void *) node); node->setName(name); } QvNode * QvInput::findReference(const QvName &name) const { void *node; if (refDict.find((u_long) name.getString(), node)) return (QvNode *) node; return NULL; } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvLists.c++0000644000175000017500000000072412310110177020041 00000000000000#include #include QvNodeList::QvNodeList() : QvPList() { } void QvNodeList::append(QvNode *node) { QvPList::append(node); node->ref(); } void QvNodeList::remove(int which) { if ((*this)[which] != NULL) (*this)[which]->unref(); QvPList::remove(which); } void QvNodeList::truncate(int start) { for (int i = start; i < getLength(); i++) if ((*this)[i] != NULL) (*this)[i]->unref(); QvPList::truncate(start); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvLOD.c++0000644000175000017500000000045012310110177017355 00000000000000#include QV_NODE_SOURCE(QvLOD); QvLOD::QvLOD() { QV_NODE_CONSTRUCTOR(QvLOD); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(range); QV_NODE_ADD_FIELD(center); // No range values to start center.value[0] = center.value[1] = center.value[2] = 0.0; } QvLOD::~QvLOD() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMFColor.c++0000644000175000017500000000041312310110177020237 00000000000000#include QV_MFIELD_SOURCE(QvMFColor, float, 3, FALSE); QvBool QvMFColor::read1Value(QvInput *in, int index) { float *valuePtr = values + index * 3; return (in->read(valuePtr[0]) && in->read(valuePtr[1]) && in->read(valuePtr[2])); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMFFloat.c++0000644000175000017500000000024412310110177020230 00000000000000#include QV_MFIELD_SOURCE(QvMFFloat, float, 1, FALSE); QvBool QvMFFloat::read1Value(QvInput *in, int index) { return in->read(values[index]); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMFLong.c++0000644000175000017500000000024012310110177020056 00000000000000#include QV_MFIELD_SOURCE(QvMFLong, long, 1, FALSE); QvBool QvMFLong::read1Value(QvInput *in, int index) { return in->read(values[index]); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMFString.c++0000644000175000017500000000025112310110177020427 00000000000000#include QV_MFIELD_SOURCE(QvMFString, QvString, 1, TRUE); QvBool QvMFString::read1Value(QvInput *in, int index) { return in->read(values[index]); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMFVec2f.c++0000644000175000017500000000035512310110177020133 00000000000000#include QV_MFIELD_SOURCE(QvMFVec2f, float, 2, FALSE); QvBool QvMFVec2f::read1Value(QvInput *in, int index) { float *valuePtr = values + index * 2; return (in->read(valuePtr[0]) && in->read(valuePtr[1])); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMFVec3f.c++0000644000175000017500000000041312310110177020127 00000000000000#include QV_MFIELD_SOURCE(QvMFVec3f, float, 3, FALSE); QvBool QvMFVec3f::read1Value(QvInput *in, int index) { float *valuePtr = values + index * 3; return (in->read(valuePtr[0]) && in->read(valuePtr[1]) && in->read(valuePtr[2])); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMaterial.c++0000644000175000017500000000141512310110177020477 00000000000000#include QV_NODE_SOURCE(QvMaterial); QvMaterial::QvMaterial() { QV_NODE_CONSTRUCTOR(QvMaterial); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(ambientColor); QV_NODE_ADD_FIELD(diffuseColor); QV_NODE_ADD_FIELD(specularColor); QV_NODE_ADD_FIELD(emissiveColor); QV_NODE_ADD_FIELD(shininess); QV_NODE_ADD_FIELD(transparency); ambientColor.values[0]=ambientColor.values[1]=ambientColor.values[2] = 0.2; diffuseColor.values[0]=diffuseColor.values[1]=diffuseColor.values[2] = 0.2; specularColor.values[0]=specularColor.values[1]=specularColor.values[2]=0.; emissiveColor.values[0]=emissiveColor.values[1]=emissiveColor.values[2]=0.; shininess.values[0] = 0.2; transparency.values[0] = 0.0; } QvMaterial::~QvMaterial() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMaterialBinding.c++0000644000175000017500000000136512310110177021776 00000000000000#include QV_NODE_SOURCE(QvMaterialBinding); QvMaterialBinding::QvMaterialBinding() { QV_NODE_CONSTRUCTOR(QvMaterialBinding); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(value); value.value = DEFAULT; QV_NODE_DEFINE_ENUM_VALUE(Binding, DEFAULT); QV_NODE_DEFINE_ENUM_VALUE(Binding, OVERALL); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_PART); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_PART_INDEXED); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_FACE); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_FACE_INDEXED); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_VERTEX); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_VERTEX_INDEXED); QV_NODE_SET_SF_ENUM_TYPE(value, Binding); } QvMaterialBinding::~QvMaterialBinding() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMatrixTransform.c++0000644000175000017500000000055512310110177022105 00000000000000#include QV_NODE_SOURCE(QvMatrixTransform); QvMatrixTransform::QvMatrixTransform() { QV_NODE_CONSTRUCTOR(QvMatrixTransform); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(matrix); for (int i = 0; i < 4; i++) for (int j = 0; j < 4; j++) matrix.value[i][j] = (i == j ? 1.0 : 0.0); } QvMatrixTransform::~QvMatrixTransform() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvName.c++0000644000175000017500000000402312310110177017617 00000000000000#include #include #define CHUNK_SIZE 4000 struct QvNameChunk { char mem[CHUNK_SIZE]; char *curByte; int bytesLeft; struct QvNameChunk *next; }; int QvNameEntry::nameTableSize; QvNameEntry ** QvNameEntry::nameTable; struct QvNameChunk *QvNameEntry::chunk; void QvNameEntry::initClass() { int i; nameTableSize = 1999; nameTable = new QvNameEntry *[nameTableSize]; for (i = 0; i < nameTableSize; i++) nameTable[i] = NULL; chunk = NULL; } const QvNameEntry * QvNameEntry::insert(const char *s) { u_long h = QvString::hash(s); u_long i; QvNameEntry *entry; QvNameEntry *head; if (nameTableSize == 0) initClass(); i = h % nameTableSize; entry = head = nameTable[i]; while (entry != NULL) { if (entry->hashValue == h && entry->isEqual(s)) break; entry = entry->next; } if (entry == NULL) { int len = strlen(s) + 1; if (len >= CHUNK_SIZE) s = strdup(s); else { if (chunk == NULL || chunk->bytesLeft < len) { struct QvNameChunk *newChunk = new QvNameChunk; newChunk->curByte = newChunk->mem; newChunk->bytesLeft = CHUNK_SIZE; newChunk->next = chunk; chunk = newChunk; } strcpy(chunk->curByte, s); s = chunk->curByte; chunk->curByte += len; chunk->bytesLeft -= len; } entry = new QvNameEntry(s, h, head); nameTable[i] = entry; } return entry; } QvName::QvName() { entry = QvNameEntry::insert(""); } QvBool QvName::isIdentStartChar(char c) { if (isdigit(c)) return FALSE; return isIdentChar(c); } QvBool QvName::isIdentChar(char c) { if (isalnum(c) || c == '_') return TRUE; return FALSE; } QvBool QvName::isNodeNameStartChar(char c) { if (isdigit(c)) return FALSE; return isIdentChar(c); } static const char badCharacters[] = "+\'\"\\{}"; QvBool QvName::isNodeNameChar(char c) { if (isalnum(c)) return TRUE; if ((strchr(badCharacters, c) != NULL) || isspace(c) || iscntrl(c)) return FALSE; return TRUE; } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvNode.c++0000644000175000017500000002041112310110177017623 00000000000000#include #include #include #include #include #include #include #include #include // The global name dictionary QvDict *QvNode::nameDict = NULL; // Syntax for writing instances to files #define OPEN_BRACE '{' #define CLOSE_BRACE '}' #define DEFINITION_KEYWORD "DEF" #define REFERENCE_KEYWORD "USE" #define NULL_KEYWORD "NULL" void QvNode::init() { if (nameDict == NULL) nameDict = new QvDict; } QvNode::QvNode() { refCount = 0; objName = new QvName(""); } QvNode::~QvNode() { if (! !(*objName)) removeName(this, objName->getString()); delete objName; } void QvNode::ref() const { ((QvNode *) this)->refCount++; } void QvNode::unref() const { if (--((QvNode *) this)->refCount == 0) delete (QvNode *) this; } void QvNode::unrefNoDelete() const { ((QvNode *) this)->refCount--; } const QvName & QvNode::getName() const { return *objName; } void QvNode::setName(const QvName &newName) { if (! !(*objName)) { removeName(this, objName->getString()); } delete objName; const char *str = newName.getString(); QvBool isBad = 0; if (newName.getLength() > 0 && !QvName::isNodeNameStartChar(str[0])) isBad = TRUE; int i; for (i = 1; i < newName.getLength() && !isBad; i++) { isBad = !QvName::isNodeNameChar(str[i]); } if (isBad) { QvString goodString; if (!QvName::isNodeNameStartChar(str[0])) { goodString += "_"; } for (i = 0; i < newName.getLength(); i++) { char temp[2]; temp[0] = str[i]; temp[1] = '\0'; if (!QvName::isNodeNameChar(str[i])) goodString += "_"; else goodString += temp; } #ifdef DEBUG QvDebugError::post("QvNode::setName", "Bad characters in" " name '%s'. Replacing with name '%s'", str, goodString.getString()); #endif objName = new QvName(goodString); } else { objName = new QvName(newName); } if (! !(*objName)) { addName(this, objName->getString()); } } void QvNode::addName(QvNode *b, const char *name) { QvPList *list; void *t; if (!nameDict->find((u_long)name, t)) { list = new QvPList; nameDict->enter((u_long)name, list); } else { list = (QvPList *)t; } list->append(b); } void QvNode::removeName(QvNode *b, const char *name) { QvPList *list; QvBool found; void *t; int i; found = nameDict->find((u_long) name, t); if (found) { list = (QvPList *) t; i = list->find(b); if (i < 0) found = FALSE; else list->remove(i); } if (! found) QvDebugError::post("QvNode::removeName", "Name \"%s\" (node %x) is not in dictionary", name, b); } QvBool QvNode::read(QvInput *in, QvNode *&node) { QvBool ret; QvName name; if (! in->read(name, TRUE)) { node = NULL; ret = in->headerOk; } else if (! name || name == NULL_KEYWORD) { node = NULL; ret = TRUE; } else if (name == REFERENCE_KEYWORD) { node = readReference(in); ret = (node != NULL); } else ret = readNode(in, name, node); return ret; } QvBool QvNode::readInstance(QvInput *in) { QvName typeString; QvFieldData *fieldData = getFieldData(); if (in->read(typeString, TRUE)) { if (typeString == "fields") { if (! fieldData->readFieldTypes(in, this)) { QvReadError::post(in, "Bad field specifications for node"); return FALSE; } } else in->putBack(typeString.getString()); } if (! fieldData->read(in, this)) return FALSE; return TRUE; } QvNode * QvNode::readReference(QvInput *in) { QvName refName; QvNode *node; if (! in->read(refName, FALSE)) { QvReadError::post(in, "Premature end of file after " REFERENCE_KEYWORD); node = NULL; } else if ((node = in->findReference(refName)) == NULL) QvReadError::post(in, "Unknown reference \"%s\"", refName.getString()); return node; } QvBool QvNode::readNode(QvInput *in, QvName &className, QvNode *&node) { QvBool gotChar; QvName refName; char c; QvBool ret = TRUE, flush = FALSE; node = NULL; if (className == DEFINITION_KEYWORD) { if (! in->read(refName, FALSE) || ! in->read(className, TRUE)) { QvReadError::post(in, "Premature end of file after " DEFINITION_KEYWORD); ret = FALSE; } if (! refName) { QvReadError::post(in, "No name given after ", DEFINITION_KEYWORD); ret = FALSE; } if (! className) { QvReadError::post(in, "Invalid definition of %s", refName.getString()); ret = FALSE; } } if (ret) { if (! (gotChar = in->read(c)) || c != OPEN_BRACE) { if (gotChar) QvReadError::post(in, "Expected '%c'; got '%c'", OPEN_BRACE, c); else QvReadError::post(in, "Expected '%c'; got EOF", OPEN_BRACE); ret = FALSE; } else { ret = readNodeInstance(in, className, refName, node); if (! ret) flush = TRUE; else if (! (gotChar = in->read(c)) || c != CLOSE_BRACE) { if (gotChar) QvReadError::post(in, "Expected '%c'; got '%c'", CLOSE_BRACE, c); else QvReadError::post(in, "Expected '%c'; got EOF", CLOSE_BRACE); ret = FALSE; } } } if (! ret && flush) flushInput(in); return ret; } QvBool QvNode::readNodeInstance(QvInput *in, const QvName &className, const QvName &refName, QvNode *&node) { node = createInstance(in, className); if (node == NULL) return FALSE; if (! (! refName)) in->addReference(refName, node); return node->readInstance(in); } QvNode * QvNode::createInstance(QvInput *in, const QvName &className) { QvNode *instance; QvString unknownString; instance = createInstanceFromName(className); if (instance == NULL) { if (! in->read(unknownString) || unknownString != "fields") { QvReadError::post(in, "Unknown class \"%s\"", className.getString()); return NULL; } else if (unknownString == "fields") { QvUnknownNode *tmpNode = new QvUnknownNode; tmpNode->setClassName(className.getString()); instance = tmpNode; in->putBack(unknownString.getString()); } } return instance; } QvNode * QvNode::createInstanceFromName(const QvName &className) { #define TRY_CLASS(name, class) \ else if (className == name) \ inst = new class QvNode *inst = NULL; if (0) ; // So "else" works in first TRY_CLASS TRY_CLASS("AsciiText", QvAsciiText); TRY_CLASS("Cone", QvCone); TRY_CLASS("Coordinate3", QvCoordinate3); TRY_CLASS("Cube", QvCube); TRY_CLASS("Cylinder", QvCylinder); TRY_CLASS("DirectionalLight", QvDirectionalLight); TRY_CLASS("FontStyle", QvFontStyle); TRY_CLASS("Group", QvGroup); TRY_CLASS("IndexedFaceSet", QvIndexedFaceSet); TRY_CLASS("IndexedLineSet", QvIndexedLineSet); TRY_CLASS("Info", QvInfo); TRY_CLASS("LOD", QvLOD); TRY_CLASS("Material", QvMaterial); TRY_CLASS("MaterialBinding", QvMaterialBinding); TRY_CLASS("MatrixTransform", QvMatrixTransform); TRY_CLASS("Normal", QvNormal); TRY_CLASS("NormalBinding", QvNormalBinding); TRY_CLASS("OrthographicCamera", QvOrthographicCamera); TRY_CLASS("PerspectiveCamera", QvPerspectiveCamera); TRY_CLASS("PointLight", QvPointLight); TRY_CLASS("PointSet", QvPointSet); TRY_CLASS("Rotation", QvRotation); TRY_CLASS("Scale", QvScale); TRY_CLASS("Separator", QvSeparator); TRY_CLASS("ShapeHints", QvShapeHints); TRY_CLASS("Sphere", QvSphere); TRY_CLASS("SpotLight", QvSpotLight); TRY_CLASS("Switch", QvSwitch); TRY_CLASS("Texture2", QvTexture2); TRY_CLASS("Texture2Transform", QvTexture2Transform); TRY_CLASS("TextureCoordinate2", QvTextureCoordinate2); TRY_CLASS("Transform", QvTransform); TRY_CLASS("TransformSeparator", QvTransformSeparator); TRY_CLASS("Translation", QvTranslation); TRY_CLASS("WWWAnchor", QvWWWAnchor); TRY_CLASS("WWWInline", QvWWWInline); return inst; #undef TRY_CLASS } void QvNode::flushInput(QvInput *in) { int nestLevel = 1; char c; while (nestLevel > 0 && in->get(c)) { if (c == CLOSE_BRACE) nestLevel--; else if (c == OPEN_BRACE) nestLevel++; } } #undef OPEN_BRACE #undef CLOSE_BRACE #undef DEFINITION_KEYWORD #undef REFERENCE_KEYWORD #undef NULL_KEYWORD geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvNormal.c++0000644000175000017500000000042412310110177020170 00000000000000#include QV_NODE_SOURCE(QvNormal); QvNormal::QvNormal() { QV_NODE_CONSTRUCTOR(QvNormal); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(vector); vector.values[0] = 0.0; vector.values[1] = 0.0; vector.values[2] = 1.0; } QvNormal::~QvNormal() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvNormalBinding.c++0000644000175000017500000000134512310110177021466 00000000000000#include QV_NODE_SOURCE(QvNormalBinding); QvNormalBinding::QvNormalBinding() { QV_NODE_CONSTRUCTOR(QvNormalBinding); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(value); value.value = DEFAULT; QV_NODE_DEFINE_ENUM_VALUE(Binding, DEFAULT); QV_NODE_DEFINE_ENUM_VALUE(Binding, OVERALL); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_PART); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_PART_INDEXED); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_FACE); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_FACE_INDEXED); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_VERTEX); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_VERTEX_INDEXED); QV_NODE_SET_SF_ENUM_TYPE(value, Binding); } QvNormalBinding::~QvNormalBinding() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvOrthographicCamera.c++0000644000175000017500000000120712310110177022502 00000000000000#include QV_NODE_SOURCE(QvOrthographicCamera); QvOrthographicCamera::QvOrthographicCamera() { QV_NODE_CONSTRUCTOR(QvOrthographicCamera); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(position); QV_NODE_ADD_FIELD(orientation); QV_NODE_ADD_FIELD(focalDistance); QV_NODE_ADD_FIELD(height); position.value[0] = 0.0; position.value[1] = 0.0; position.value[2] = 1.0; orientation.axis[0] = 0.0; orientation.axis[1] = 0.0; orientation.axis[2] = 1.0; orientation.angle = 0.0; focalDistance.value = 5.0; height.value = 2.0; } QvOrthographicCamera::~QvOrthographicCamera() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvPList.c++0000644000175000017500000000146712310110177020003 00000000000000#include #define DEFAULT_INITIAL_SIZE 4 QvPList::QvPList() { ptrs = NULL; nPtrs = ptrsSize = 0; setSize(0); } QvPList::~QvPList() { if (ptrs != NULL) delete [] ptrs; } int QvPList::find(const void *ptr) const { int i; for (i = 0; i < nPtrs; i++) if (ptrs[i] == ptr) return(i); return -1; } void QvPList::remove(int which) { int i; for (i = which; i < nPtrs - 1; i++) ptrs[i] = ptrs[i + 1]; setSize(nPtrs - 1); } void QvPList::expand(int size) { void **newPtrs; int i; if (ptrsSize == 0) ptrsSize = DEFAULT_INITIAL_SIZE; while (size > ptrsSize) { ptrsSize *= 2; } newPtrs = new void *[ptrsSize]; if (ptrs != NULL) { for (i = 0; i < nPtrs; i++) newPtrs[i] = ptrs[i]; delete [] ptrs; } ptrs = newPtrs; } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvPerspectiveCamera.c++0000644000175000017500000000123312310110177022341 00000000000000#include QV_NODE_SOURCE(QvPerspectiveCamera); QvPerspectiveCamera::QvPerspectiveCamera() { QV_NODE_CONSTRUCTOR(QvPerspectiveCamera); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(position); QV_NODE_ADD_FIELD(orientation); QV_NODE_ADD_FIELD(focalDistance); QV_NODE_ADD_FIELD(heightAngle); position.value[0] = 0.0; position.value[1] = 0.0; position.value[2] = 1.0; orientation.axis[0] = 0.0; orientation.axis[1] = 0.0; orientation.axis[2] = 1.0; orientation.angle = 0.0; focalDistance.value = 5.0; heightAngle.value = M_PI_4; // 45 degrees } QvPerspectiveCamera::~QvPerspectiveCamera() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvPointLight.c++0000644000175000017500000000077412310110177021031 00000000000000#include QV_NODE_SOURCE(QvPointLight); QvPointLight::QvPointLight() { QV_NODE_CONSTRUCTOR(QvPointLight); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(on); QV_NODE_ADD_FIELD(intensity); QV_NODE_ADD_FIELD(color); QV_NODE_ADD_FIELD(location); on.value = TRUE; intensity.value = 1.0; color.value[0] = color.value[1] = color.value[2] = 1.0; location.value[0] = 0.0; location.value[1] = 0.0; location.value[2] = 1.0; } QvPointLight::~QvPointLight() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvPointSet.c++0000644000175000017500000000050512310110177020505 00000000000000#include QV_NODE_SOURCE(QvPointSet); QvPointSet::QvPointSet() { QV_NODE_CONSTRUCTOR(QvPointSet); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(startIndex); QV_NODE_ADD_FIELD(numPoints); startIndex.value = 0; numPoints.value = QV_POINT_SET_USE_REST_OF_POINTS; } QvPointSet::~QvPointSet() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvReadError.c++0000644000175000017500000000064412310110177020631 00000000000000#include #include #include #include void QvReadError::post(const QvInput *in, const char *formatString ...) { char buf[10000]; va_list ap; va_start(ap, formatString); vsprintf(buf, formatString, ap); va_end(ap); QvString locstr; in->getLocationString(locstr); fprintf(stderr, "VRML read error: %s\n%s\n", buf, locstr.getString()); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvRotation.c++0000644000175000017500000000047612310110177020546 00000000000000#include QV_NODE_SOURCE(QvRotation); QvRotation::QvRotation() { QV_NODE_CONSTRUCTOR(QvRotation); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(rotation); rotation.axis[0] = 0.0; rotation.axis[1] = 0.0; rotation.axis[2] = 1.0; rotation.angle = 0.0; } QvRotation::~QvRotation() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFBitMask.c++0000644000175000017500000000325012310110177020523 00000000000000#include #include #include // Special characters when reading or writing value in ASCII #define OPEN_PAREN '(' #define CLOSE_PAREN ')' #define BITWISE_OR '|' QV_SFIELD_SOURCE(QvSFBitMask); QvBool QvSFBitMask::readValue(QvInput *in) { char c; QvName n; int v; #ifdef DEBUG if (enumValues == NULL) { QvDebugError::post("QvSFBitMask::readValue", "Enum values were never initialized"); QvReadError::post(in, "Couldn't read QvSFBitMask values"); return FALSE; } #endif /* DEBUG */ value = 0; // Read first character if (! in->read(c)) return FALSE; // Check for parenthesized list of bitwise-or'ed flags if (c == OPEN_PAREN) { // Read names separated by BITWISE_OR while (TRUE) { if (in->read(n, TRUE) && ! (! n) ) { if (findEnumValue(n, v)) value |= v; else { QvReadError::post(in, "Unknown QvSFBitMask bit " "mask value \"%s\"", n.getString()); return FALSE; } } if (! in->read(c)) { QvReadError::post(in, "EOF reached before '%c' " "in QvSFBitMask value", CLOSE_PAREN); return FALSE; } if (c == CLOSE_PAREN) break; else if (c != BITWISE_OR) { QvReadError::post(in, "Expected '%c' or '%c', got '%c' ", "in QvSFBitMask value", BITWISE_OR, CLOSE_PAREN, c); return FALSE; } } } else { in->putBack(c); // Read mnemonic value as a character string identifier if (! in->read(n, TRUE)) return FALSE; if (! findEnumValue(n, value)) { QvReadError::post(in, "Unknown QvSFBitMask bit " "mask value \"%s\"", n.getString()); return FALSE; } } return TRUE; } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFBool.c++0000644000175000017500000000126412310110177020067 00000000000000#include #include QV_SFIELD_SOURCE(QvSFBool); QvBool QvSFBool::readValue(QvInput *in) { // accept 0 or 1 if (in->read(value)) { if (value != 0 && value != 1) { QvReadError::post(in, "Illegal value for QvSFBool: %d " "(must be 0 or 1)", value); return FALSE; } return TRUE; } // read TRUE/FALSE keyword QvName n; if (! in->read(n, TRUE)) return FALSE; if (n == "TRUE") { value = TRUE; return TRUE; } if (n == "FALSE") { value = FALSE; return TRUE; } QvReadError::post(in, "Unknown value (\"%s\") for QvSFBool ", "(must be TRUE or FALSE)", n.getString()); return FALSE; } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFColor.c++0000644000175000017500000000027212310110177020250 00000000000000#include QV_SFIELD_SOURCE(QvSFColor); QvBool QvSFColor::readValue(QvInput *in) { return (in->read(value[0]) && in->read(value[1]) && in->read(value[2])); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFEnum.c++0000644000175000017500000000206712310110177020102 00000000000000#include #include #include // Can't use macro, since we define a constructor. QvSFEnum::QvSFEnum() { enumValues = NULL; enumNames = NULL; } QvSFEnum::~QvSFEnum() { } QvBool QvSFEnum::findEnumValue(const QvName &name, int &val) const { int i; // Look through names table for one that matches for (i = 0; i < numEnums; i++) { if (name == enumNames[i]) { val = enumValues[i]; return TRUE; } } return FALSE; } QvBool QvSFEnum::readValue(QvInput *in) { QvName n; #ifdef DEBUG if (enumValues == NULL) { QvDebugError::post("QvSFEnum::readValue", "Enum values were never initialized"); QvReadError::post(in, "Couldn't read QvSFEnum value"); return FALSE; } #endif /* DEBUG */ // Read mnemonic value as a character string identifier if (! in->read(n, TRUE)) return FALSE; if (findEnumValue(n, value)) return TRUE; // Not found? Too bad QvReadError::post(in, "Unknown QvSFEnum enumeration value \"%s\"", n.getString()); return FALSE; } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFFloat.c++0000644000175000017500000000017712310110177020243 00000000000000#include QV_SFIELD_SOURCE(QvSFFloat); QvBool QvSFFloat::readValue(QvInput *in) { return in->read(value); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFImage.c++0000644000175000017500000000137612310110177020222 00000000000000#include // Can't use macro, since we define a constructor. QvSFImage::QvSFImage() { size[0] = size[1] = 0; numComponents = 0; bytes = NULL; } QvSFImage::~QvSFImage() { if (bytes != NULL) delete [] bytes; } QvBool QvSFImage::readValue(QvInput *in) { if (! in->read(size[0]) || ! in->read(size[1]) || ! in->read(numComponents)) return FALSE; if (bytes != NULL) delete [] bytes; bytes = new unsigned char[size[0] * size[1] * numComponents]; int byte = 0; for (int i = 0; i < size[0] * size[1]; i++) { unsigned long l; if (! in->read(l)) return FALSE; for (int j = 0; j < numComponents; j++) bytes[byte++] = (unsigned char) ((l >> (8*(numComponents-j-1))) & 0xFF); } return TRUE; } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFLong.c++0000644000175000017500000000017412310110177020072 00000000000000#include QV_SFIELD_SOURCE(QvSFLong); QvBool QvSFLong::readValue(QvInput *in) { return in->read(value); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFMatrix.c++0000644000175000017500000000105412310110177020435 00000000000000#include QV_SFIELD_SOURCE(QvSFMatrix); QvBool QvSFMatrix::readValue(QvInput *in) { return (in->read(value[0][0]) && in->read(value[0][1]) && in->read(value[0][2]) && in->read(value[0][3]) && in->read(value[1][0]) && in->read(value[1][1]) && in->read(value[1][2]) && in->read(value[1][3]) && in->read(value[2][0]) && in->read(value[2][1]) && in->read(value[2][2]) && in->read(value[2][3]) && in->read(value[3][0]) && in->read(value[3][1]) && in->read(value[3][2]) && in->read(value[3][3])); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFRotation.c++0000644000175000017500000000033012310110177020764 00000000000000#include QV_SFIELD_SOURCE(QvSFRotation); QvBool QvSFRotation::readValue(QvInput *in) { return (in->read(axis[0]) && in->read(axis[1]) && in->read(axis[2]) && in->read(angle)); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFString.c++0000644000175000017500000000020212310110177020431 00000000000000#include QV_SFIELD_SOURCE(QvSFString); QvBool QvSFString::readValue(QvInput *in) { return in->read(value); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFVec2f.c++0000644000175000017500000000023712310110177020140 00000000000000#include QV_SFIELD_SOURCE(QvSFVec2f); QvBool QvSFVec2f::readValue(QvInput *in) { return (in->read(value[0]) && in->read(value[1])); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFVec3f.c++0000644000175000017500000000027212310110177020140 00000000000000#include QV_SFIELD_SOURCE(QvSFVec3f); QvBool QvSFVec3f::readValue(QvInput *in) { return (in->read(value[0]) && in->read(value[1]) && in->read(value[2])); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvScale.c++0000644000175000017500000000041312310110177017765 00000000000000#include QV_NODE_SOURCE(QvScale); QvScale::QvScale() { QV_NODE_CONSTRUCTOR(QvScale); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(scaleFactor); scaleFactor.value[0] = scaleFactor.value[1] = scaleFactor.value[2] =1.0; } QvScale::~QvScale() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSeparator.c++0000644000175000017500000000071312310110177020701 00000000000000#include QV_NODE_SOURCE(QvSeparator); QvSeparator::QvSeparator() { QV_NODE_CONSTRUCTOR(QvSeparator); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(renderCulling); renderCulling.value = AUTO; QV_NODE_DEFINE_ENUM_VALUE(CullEnabled, ON); QV_NODE_DEFINE_ENUM_VALUE(CullEnabled, OFF); QV_NODE_DEFINE_ENUM_VALUE(CullEnabled, AUTO); QV_NODE_SET_SF_ENUM_TYPE(renderCulling, CullEnabled); } QvSeparator::~QvSeparator() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvShapeHints.c++0000644000175000017500000000205012310110177021003 00000000000000#include QV_NODE_SOURCE(QvShapeHints); QvShapeHints::QvShapeHints() { QV_NODE_CONSTRUCTOR(QvShapeHints); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(vertexOrdering); QV_NODE_ADD_FIELD(shapeType); QV_NODE_ADD_FIELD(faceType); QV_NODE_ADD_FIELD(creaseAngle); vertexOrdering.value = UNKNOWN_ORDERING; shapeType.value = UNKNOWN_SHAPE_TYPE; faceType.value = CONVEX; creaseAngle.value = 0.5; QV_NODE_DEFINE_ENUM_VALUE(VertexOrdering, UNKNOWN_ORDERING); QV_NODE_DEFINE_ENUM_VALUE(VertexOrdering, CLOCKWISE); QV_NODE_DEFINE_ENUM_VALUE(VertexOrdering, COUNTERCLOCKWISE); QV_NODE_DEFINE_ENUM_VALUE(ShapeType, UNKNOWN_SHAPE_TYPE); QV_NODE_DEFINE_ENUM_VALUE(ShapeType, SOLID); QV_NODE_DEFINE_ENUM_VALUE(FaceType, UNKNOWN_FACE_TYPE); QV_NODE_DEFINE_ENUM_VALUE(FaceType, CONVEX); QV_NODE_SET_SF_ENUM_TYPE(vertexOrdering, VertexOrdering); QV_NODE_SET_SF_ENUM_TYPE(shapeType, ShapeType); QV_NODE_SET_SF_ENUM_TYPE(faceType, FaceType); } QvShapeHints::~QvShapeHints() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSphere.c++0000644000175000017500000000033012310110177020162 00000000000000#include QV_NODE_SOURCE(QvSphere); QvSphere::QvSphere() { QV_NODE_CONSTRUCTOR(QvSphere); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(radius); radius.value = 1.0; } QvSphere::~QvSphere() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSpotLight.c++0000644000175000017500000000137312310110177020661 00000000000000#include QV_NODE_SOURCE(QvSpotLight); QvSpotLight::QvSpotLight() { QV_NODE_CONSTRUCTOR(QvSpotLight); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(on); QV_NODE_ADD_FIELD(intensity); QV_NODE_ADD_FIELD(color); QV_NODE_ADD_FIELD(location); QV_NODE_ADD_FIELD(direction); QV_NODE_ADD_FIELD(dropOffRate); QV_NODE_ADD_FIELD(cutOffAngle); on.value = TRUE; intensity.value = 1.0; color.value[0] = color.value[1] = color.value[2] = 1.0; location.value[0] = 0.0; location.value[1] = 0.0; location.value[2] = 1.0; direction.value[0] = 0.0; direction.value[1] = 0.0; direction.value[2] = -1.0; dropOffRate.value = 0.0; cutOffAngle.value = M_PI / 4.0; } QvSpotLight::~QvSpotLight() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvState.c++0000644000175000017500000000251612310110177020024 00000000000000#include const char *QvState::stackNames[NumStacks] = { "Camera", "Coordinate3", "FontStyle", "Light", "MaterialBinding", "Material", "NormalBinding", "Normal", "ShapeHints", "Texture2", "Texture2Transformation", "TextureCoordinate2", "Transformation", }; QvState::QvState() { stacks = new QvElement * [NumStacks]; for (int i = 0; i < NumStacks; i++) stacks[i] = NULL; depth = 0; } QvState::~QvState() { while (depth > 0) pop(); delete [] stacks; } void QvState::addElement(StackIndex stackIndex, QvElement *elt) { elt->depth = depth; elt->next = stacks[stackIndex]; stacks[stackIndex] = elt; } void QvState::push() { depth++; } void QvState::pop() { depth--; for (int i = 0; i < NumStacks; i++) while (stacks[i] != NULL && stacks[i]->depth > depth) popElement((StackIndex) i); } void QvState::popElement(StackIndex stackIndex) { QvElement *elt = stacks[stackIndex]; stacks[stackIndex] = elt->next; delete elt; } void QvState::print() { printf("Traversal state:\n"); for (int i = 0; i < NumStacks; i++) { printf("\tStack [%2d] (%s):\n", i, stackNames[i]); if (stacks[i] == NULL) printf("\t\tNULL\n"); else for (QvElement *elt = stacks[i]; elt != NULL; elt = elt->next) elt->print(); } } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvString.c++0000644000175000017500000000341712310110177020213 00000000000000#include QvString::~QvString() { if (string != staticStorage) delete [] string; } void QvString::expand(int bySize) { int newSize = strlen(string) + bySize + 1; if (newSize >= QV_STRING_STATIC_STORAGE_SIZE && (string == staticStorage || newSize > storageSize)) { char *newString = new char[newSize]; strcpy(newString, string); if (string != staticStorage) delete [] string; string = newString; storageSize = newSize; } } u_long QvString::hash(const char *s) { u_long total, shift; total = shift = 0; while (*s) { total = total ^ ((*s) << shift); shift+=5; if (shift>24) shift -= 24; s++; } return( total ); } void QvString::makeEmpty(QvBool freeOld) { if (string != staticStorage) { if (freeOld) delete [] string; string = staticStorage; } string[0] = '\0'; } QvString & QvString::operator =(const char *str) { int size = strlen(str) + 1; if (str >= string && str < string + (string != staticStorage ? storageSize : QV_STRING_STATIC_STORAGE_SIZE)) { QvString tmp = str; *this = tmp; return *this; } if (size < QV_STRING_STATIC_STORAGE_SIZE) { if (string != staticStorage) makeEmpty(); } else if (string == staticStorage) string = new char[size]; else if (size > storageSize) { delete [] string; string = new char[size]; } strcpy(string, str); storageSize = size; return *this; } QvString & QvString::operator +=(const char *str) { expand(strlen(str)); strcat(string, str); return *this; } int operator ==(const QvString &str, const char *s) { return (str.string[0] == s[0] && ! strcmp(str.string, s)); } int operator !=(const QvString &str, const char *s) { return (str.string[0] != s[0] || strcmp(str.string, s)); } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSwitch.c++0000644000175000017500000000035312310110177020202 00000000000000#include QV_NODE_SOURCE(QvSwitch); QvSwitch::QvSwitch() { QV_NODE_CONSTRUCTOR(QvSwitch); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(whichChild); whichChild.value = QV_SWITCH_NONE; } QvSwitch::~QvSwitch() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvTexture2.c++0000644000175000017500000000201212310110177020455 00000000000000#include QV_NODE_SOURCE(QvTexture2); QvTexture2::QvTexture2() { QV_NODE_CONSTRUCTOR(QvTexture2); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(filename); QV_NODE_ADD_FIELD(image); QV_NODE_ADD_FIELD(wrapS); QV_NODE_ADD_FIELD(wrapT); filename.value = ""; image.size[0] = image.size[1] = (int)0.0; image.numComponents = 0; image.bytes = NULL; wrapS.value = REPEAT; wrapT.value = REPEAT; QV_NODE_DEFINE_ENUM_VALUE(Wrap, REPEAT); QV_NODE_DEFINE_ENUM_VALUE(Wrap, CLAMP); QV_NODE_SET_SF_ENUM_TYPE(wrapS, Wrap); QV_NODE_SET_SF_ENUM_TYPE(wrapT, Wrap); } QvTexture2::~QvTexture2() { } QvBool QvTexture2::readInstance(QvInput *in) { QvBool readOK = QvNode::readInstance(in); if (readOK && ! filename.isDefault()) { if (! readImage()) readOK = FALSE; image.setDefault(TRUE); } return readOK; } QvBool QvTexture2::readImage() { // ??? // ??? Read image from filename and store results in image field. // ??? return TRUE; } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvTexture2Transform.c++0000644000175000017500000000105312310110177022355 00000000000000#include QV_NODE_SOURCE(QvTexture2Transform); QvTexture2Transform::QvTexture2Transform() { QV_NODE_CONSTRUCTOR(QvTexture2Transform); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(translation); QV_NODE_ADD_FIELD(rotation); QV_NODE_ADD_FIELD(scaleFactor); QV_NODE_ADD_FIELD(center); translation.value[0] = translation.value[1] = 0.0; rotation.value = 0.0; scaleFactor.value[0] = scaleFactor.value[1] = 1.0; center.value[0] = center.value[1] = 0.0; } QvTexture2Transform::~QvTexture2Transform() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvTextureCoordinate2.c++0000644000175000017500000000050012310110177022465 00000000000000#include QV_NODE_SOURCE(QvTextureCoordinate2); QvTextureCoordinate2::QvTextureCoordinate2() { QV_NODE_CONSTRUCTOR(QvTextureCoordinate2); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(point); point.values[0] = point.values[1] = 0.0; } QvTextureCoordinate2::~QvTextureCoordinate2() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvTransform.c++0000644000175000017500000000147612310110177020723 00000000000000#include QV_NODE_SOURCE(QvTransform); QvTransform::QvTransform() { QV_NODE_CONSTRUCTOR(QvTransform); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(translation); QV_NODE_ADD_FIELD(rotation); QV_NODE_ADD_FIELD(scaleFactor); QV_NODE_ADD_FIELD(scaleOrientation); QV_NODE_ADD_FIELD(center); translation.value[0] = translation.value[1] = translation.value[2] = 0.0; rotation.axis[0] = 0.0; rotation.axis[1] = 0.0; rotation.axis[2] = 1.0; rotation.angle = 0.0; scaleFactor.value[0] = scaleFactor.value[1] = scaleFactor.value[2] = 1.0; scaleOrientation.axis[0] = 0.0; scaleOrientation.axis[1] = 0.0; scaleOrientation.axis[2] = 1.0; scaleOrientation.angle = 0.0; center.value[0] = center.value[1] = center.value[2] = 0.0; } QvTransform::~QvTransform() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvTransformSeparator.c++0000644000175000017500000000036312310110177022576 00000000000000#include QV_NODE_SOURCE(QvTransformSeparator); QvTransformSeparator::QvTransformSeparator() { QV_NODE_CONSTRUCTOR(QvTransformSeparator); isBuiltIn = TRUE; } QvTransformSeparator::~QvTransformSeparator() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvTranslation.c++0000644000175000017500000000046612310110177021244 00000000000000#include QV_NODE_SOURCE(QvTranslation); QvTranslation::QvTranslation() { QV_NODE_CONSTRUCTOR(QvTranslation); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(translation); translation.value[0] = translation.value[1] = translation.value[2] = 0.0; } QvTranslation::~QvTranslation() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvTraverse.c++0000644000175000017500000001437112310110177020541 00000000000000#include #include #include #include #include ////////////////////////////////////////////////////////////////////////////// // // Traversal code for all nodes. The default method (in QvNode) does // nothing. Because traverse() is defined in the header for ALL node // classes, each one has an implementation here. // ////////////////////////////////////////////////////////////////////////////// // For debugging static int indent = 0; static void announce(const char *className) { for (int i = 0; i < indent; i++) printf("\t"); printf("Traversing a %s\n", className); } #define ANNOUNCE(className) announce(QV__QUOTE(className)) #define DEFAULT_TRAVERSE(className) \ void \ className::traverse(QvState *) \ { \ ANNOUNCE(className); \ } ////////////////////////////////////////////////////////////////////////////// // // Groups. // ////////////////////////////////////////////////////////////////////////////// void QvGroup::traverse(QvState *state) { ANNOUNCE(QvGroup); indent++; for (int i = 0; i < getNumChildren(); i++) getChild(i)->traverse(state); indent--; } void QvLOD::traverse(QvState *state) { ANNOUNCE(QvLOD); indent++; // ??? In a real implementation, this would choose a child based // ??? on the distance to the eye point. if (getNumChildren() > 0) getChild(0)->traverse(state); indent--; } void QvSeparator::traverse(QvState *state) { ANNOUNCE(QvSeparator); state->push(); indent++; for (int i = 0; i < getNumChildren(); i++) getChild(i)->traverse(state); indent--; state->pop(); } void QvSwitch::traverse(QvState *state) { ANNOUNCE(QvSwitch); indent++; int which = whichChild.value; if (which == QV_SWITCH_NONE) ; else if (which == QV_SWITCH_ALL) for (int i = 0; i < getNumChildren(); i++) getChild(i)->traverse(state); else if (which < getNumChildren()) getChild(which)->traverse(state); indent--; } void QvTransformSeparator::traverse(QvState *state) { ANNOUNCE(QvTransformSeparator); // We need to "push" just the transformation stack. We'll // accomplish this by just pushing a no-op transformation onto // that stack. When we "pop", we'll restore that stack to its // previous state. QvElement *markerElt = new QvElement; markerElt->data = this; markerElt->type = QvElement::NoOpTransform; state->addElement(QvState::TransformationIndex, markerElt); indent++; for (int i = 0; i < getNumChildren(); i++) getChild(i)->traverse(state); indent--; // Now do the "pop" while (state->getTopElement(QvState::TransformationIndex) != markerElt) state->popElement(QvState::TransformationIndex); } ////////////////////////////////////////////////////////////////////////////// // // Properties. // ////////////////////////////////////////////////////////////////////////////// #define DO_PROPERTY(className, stackIndex) \ void \ className::traverse(QvState *state) \ { \ ANNOUNCE(className); \ QvElement *elt = new QvElement; \ elt->data = this; \ state->addElement(QvState::stackIndex, elt); \ } #define DO_TYPED_PROPERTY(className, stackIndex, eltType) \ void \ className::traverse(QvState *state) \ { \ ANNOUNCE(className); \ QvElement *elt = new QvElement; \ elt->data = this; \ elt->type = QvElement::eltType; \ state->addElement(QvState::stackIndex, elt); \ } DO_PROPERTY(QvCoordinate3, Coordinate3Index) DO_PROPERTY(QvFontStyle, FontStyleIndex) DO_PROPERTY(QvMaterial, MaterialIndex) DO_PROPERTY(QvMaterialBinding, MaterialBindingIndex) DO_PROPERTY(QvNormal, NormalIndex) DO_PROPERTY(QvNormalBinding, NormalBindingIndex) DO_PROPERTY(QvShapeHints, ShapeHintsIndex) DO_PROPERTY(QvTextureCoordinate2, TextureCoordinate2Index) DO_PROPERTY(QvTexture2, Texture2Index) DO_PROPERTY(QvTexture2Transform, Texture2TransformationIndex) DO_TYPED_PROPERTY(QvDirectionalLight, LightIndex, DirectionalLight) DO_TYPED_PROPERTY(QvPointLight, LightIndex, PointLight) DO_TYPED_PROPERTY(QvSpotLight, LightIndex, SpotLight) DO_TYPED_PROPERTY(QvOrthographicCamera, CameraIndex, OrthographicCamera) DO_TYPED_PROPERTY(QvPerspectiveCamera, CameraIndex, PerspectiveCamera) DO_TYPED_PROPERTY(QvTransform, TransformationIndex, Transform) DO_TYPED_PROPERTY(QvRotation, TransformationIndex, Rotation) DO_TYPED_PROPERTY(QvMatrixTransform, TransformationIndex, MatrixTransform) DO_TYPED_PROPERTY(QvTranslation, TransformationIndex, Translation) DO_TYPED_PROPERTY(QvScale, TransformationIndex, Scale) ////////////////////////////////////////////////////////////////////////////// // // Shapes. // ////////////////////////////////////////////////////////////////////////////// static void printProperties(QvState *state) { printf("--------------------------------------------------------------\n"); state->print(); printf("--------------------------------------------------------------\n"); } #define DO_SHAPE(className) \ void \ className::traverse(QvState *state) \ { \ ANNOUNCE(className); \ printProperties(state); \ } DO_SHAPE(QvAsciiText) DO_SHAPE(QvCone) DO_SHAPE(QvCube) DO_SHAPE(QvCylinder) DO_SHAPE(QvIndexedFaceSet) DO_SHAPE(QvIndexedLineSet) DO_SHAPE(QvPointSet) DO_SHAPE(QvSphere) ////////////////////////////////////////////////////////////////////////////// // // WWW-specific nodes. // ////////////////////////////////////////////////////////////////////////////// // ??? DEFAULT_TRAVERSE(QvWWWAnchor) DEFAULT_TRAVERSE(QvWWWInline) ////////////////////////////////////////////////////////////////////////////// // // Default traversal methods. These nodes have no effects during traversal. // ////////////////////////////////////////////////////////////////////////////// DEFAULT_TRAVERSE(QvInfo) DEFAULT_TRAVERSE(QvUnknownNode) ////////////////////////////////////////////////////////////////////////////// #undef ANNOUNCE #undef DEFAULT_TRAVERSE #undef DO_PROPERTY #undef DO_SHAPE #undef DO_TYPED_PROPERTY geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvToWebOOGL.c++0000644000175000017500000011611612310110177020447 00000000000000#include #include #include #include #include #include #include #include extern "C" { #include } ////////////////////////////////////////////////////////////////////////////// // // ToWebOOGL will traverse and convert any vrml object to WebOOGL! // Because ToWebOOGL() is defined in the header for ALL node // classes, each one has an implementation here. // ////////////////////////////////////////////////////////////////////////////// // For debugging static int indent = 0; static int oogldepth = 0, unique = 0, mypid = 0; static char out[5000]; static char colstr[100]; enum Binding { DEFAULT, OVERALL, PER_PART, PER_PART_INDEXED, PER_FACE, PER_FACE_INDEXED, PER_VERTEX, PER_VERTEX_INDEXED, }; static void OOGLannounce(const char *className) { /* for (int i = 0; i < indent; i++) fprintf(stderr,"\t"); fprintf(stderr,"Converting a %s to WebOOGL - depth: %d\n", className, oogldepth); */ } #define ANNOUNCE(className) OOGLannounce(QV__QUOTE(className)) static FILE *OOGLfout = (FILE *)NULL; static char *OOGLhand = NULL; static char *urls[100]; int OOGLnumuniq() { return unique; } char * OOGLgeturls(int i) { return urls[i]; } int OOGLhandle(char *handle) { OOGLhand = handle; return 1; } int OOGLfile(FILE *fout) { OOGLfout = fout; mypid = (int) getpid(); return 1; } static void OOGLout(const char *text) { if (OOGLfout == NULL) return; for (int i = 1; i < indent; i++) fprintf(OOGLfout, " "); fprintf(OOGLfout, "%s\n", text); } static void OOGLflush() { if(OOGLfout != NULL) fflush(OOGLfout); } static void OOGLoutindent() { if (OOGLfout == NULL) return; for (int i = 1; i < indent; i++) fprintf(OOGLfout, " "); } static void OOGLoutraw(const char *text) { if (OOGLfout == NULL) return; fprintf(OOGLfout, "%s", text); } static void OOGLgetcolor(QvMaterial *mt, QvMaterialBinding *mtb, int mtnum) { // float *amb; float *em, *dif; float a; if (mt == NULL || mtnum < 0) { sprintf(colstr, "1 1 1 1"); return; } a = 1 - (mt->transparency).values[mtnum % (mt->transparency).num]; em = &mt->emissiveColor.values[3 * (mtnum % mt->emissiveColor.num)]; dif = &mt->diffuseColor.values[3 * (mtnum % mt->diffuseColor.num)]; if (em[0] != 0.0 || em[1] != 0.0 || em[2] != 0.0) { // Funky calculations to simulate emissive color float r, g, b, ln; r = em[0]; g = em[1]; b = em[2]; ln = (3.0 - sqrt(r*r + g*g + b*b)) / 6.0; r += (1.0 - r)*ln; g += (1.0 - g)*ln; b += (1.0 - b)*ln; sprintf(colstr, "%.3f %.3f %.3f %.3f", r, g, b, a); } else sprintf(colstr, "%.3f %.3f %.3f %.3f", dif[0], dif[1], dif[2], a); } static void OOGLappearance(QvMaterial *mt) { if (mt == NULL) return; OOGLout("appearance { material {"); sprintf(out, "ambient %f %f %f", (mt->ambientColor).values[0], (mt->ambientColor).values[1], (mt->ambientColor).values[2]); OOGLout(out); float r, g, b, ln; if (!((mt->emissiveColor).values[0]==0.0 && (mt->emissiveColor).values[1]==0.0 && (mt->emissiveColor).values[2]==0.0)) { // Funky calculations to simulate emissive color r = (mt->emissiveColor).values[0]; g = (mt->emissiveColor).values[1]; b = (mt->emissiveColor).values[2]; ln = (3.0 - sqrt(r*r + g*g + b*b)) / 6.0; r += (1.0 - r)*ln; g += (1.0 - g)*ln; b += (1.0 - b)*ln; } else { r = mt->diffuseColor.values[0]; g = mt->diffuseColor.values[1]; b = mt->diffuseColor.values[2]; } sprintf(out, "diffuse %.3f %.3f %.3f edgecolor %.3f %.3f %.3f", r, g, b, r, g, b); OOGLout(out); sprintf(out, "specular %.3f %.3f %.3f", (mt->specularColor).values[0], (mt->specularColor).values[1], (mt->specularColor).values[2]); OOGLout(out); sprintf(out, "shininess %.3f", (mt->shininess).values[0]); OOGLout(out); sprintf(out, "alpha %.3f", 1.0 - (mt->transparency).values[0]); OOGLout(out); // Doesn't work with Geomview right now // sprintf(out, "emission %f %f %f", (mt->emissiveColor).values[0], // (mt->emissiveColor).values[1], (mt->emissiveColor).values[2]); OOGLout(out); OOGLout("}}"); } #define DEFAULT_TRAVERSE(className) \ void \ className::ToWebOOGL(QvState *) \ { \ ANNOUNCE(className); \ } ////////////////////////////////////////////////////////////////////////////// // // Groups. // ////////////////////////////////////////////////////////////////////////////// void QvGroup::ToWebOOGL(QvState *state) { int savedepth, i; ANNOUNCE(QvGroup); OOGLout("{ = LIST"); OOGLout("# Group"); savedepth = oogldepth; indent++; for (i = 0; i < getNumChildren(); i++) getChild(i)->ToWebOOGL(state); indent--; savedepth = oogldepth - savedepth; /* How deep did we get ? :-)*/ for (i = 0; i < savedepth; i++) { /* Do the equivalent OOGL pop */ out[i*2] = '}'; /* pop the LIST */ out[i*2+1] = '}'; /* pop the INST */ } out[savedepth*2] = '\0'; OOGLout(out); OOGLout("} # End Group"); oogldepth = oogldepth - savedepth; } void QvLOD::ToWebOOGL(QvState *state) { int savedepth, i; ANNOUNCE(QvLOD); savedepth = oogldepth; indent++; // ??? In a real implementation, this would choose a child based // ??? on the projected screen areas. // WebOOGL punts on this one if (getNumChildren() > 0) getChild(0)->ToWebOOGL(state); indent--; savedepth = oogldepth - savedepth; /* How deep did we get ? :-) */ for (i = 0; i < savedepth; i++) { /* Do the equivalent OOGL pop */ out[i*2] = '}'; /* pop the LIST */ out[i*2+1] = '}'; /* pop the INST */ } out[savedepth*2] = '\0'; OOGLout(out); oogldepth = oogldepth - savedepth; } void QvSeparator::ToWebOOGL(QvState *state) { int savedepth, i; ANNOUNCE(QvSeparator); OOGLout("{ = LIST # Separator"); savedepth = oogldepth; state->push(); indent++; for (i = 0; i < getNumChildren(); i++) getChild(i)->ToWebOOGL(state); indent--; state->pop(); savedepth = oogldepth - savedepth; /* How deep did we get ? :-)*/ for (i = 0; i < savedepth; i++) { /* Do the equivalent OOGL pop */ out[i*2] = '}'; /* pop the LIST */ out[i*2+1] = '}'; /* pop the INST */ } out[savedepth*2] = '\0'; OOGLout(out); OOGLout("} # End Separator"); oogldepth = oogldepth - savedepth; } void QvSwitch::ToWebOOGL(QvState *state) { int savedepth, i; ANNOUNCE(QvSwitch); indent++; int which = (int) whichChild.value; savedepth = oogldepth; if (which == QV_SWITCH_NONE) ; else if (which == QV_SWITCH_ALL) for (i = 0; i < getNumChildren(); i++) getChild(i)->ToWebOOGL(state); else if (which < getNumChildren()) getChild(which)->ToWebOOGL(state); indent--; savedepth = oogldepth - savedepth; /* How deep did we get ? :-)*/ for (i = 0; i < savedepth; i++) { /* Do the equivalent OOGL pop */ out[i*2] = '}'; /* pop the LIST */ out[i*2+1] = '}'; /* pop the INST */ } out[savedepth*2] = '\0'; OOGLout(out); oogldepth = oogldepth - savedepth; } void QvTransformSeparator::ToWebOOGL(QvState *state) { int savedepth, i; ANNOUNCE(QvTransformSeparator); // We need to "push" just the transformation stack. We'll // accomplish this by just pushing a no-op transformation onto // that stack. When we "pop", we'll restore that stack to its // previous state. QvElement *markerElt = new QvElement; markerElt->data = this; markerElt->type = QvElement::NoOpTransform; state->addElement(QvState::TransformationIndex, markerElt); savedepth = oogldepth; indent++; for (i = 0; i < getNumChildren(); i++) getChild(i)->ToWebOOGL(state); indent--; // Now do the "pop" while (state->getTopElement(QvState::TransformationIndex) != markerElt) state->popElement(QvState::TransformationIndex); savedepth = oogldepth - savedepth; /* How deep did we get ? :-)*/ for (i = 0; i < savedepth; i++) { /* Do the equivalent OOGL pop */ out[i*2] = '}'; /* pop the LIST */ out[i*2+1] = '}'; /* pop the INST */ } out[savedepth*2] = '\0'; OOGLout(out); oogldepth = oogldepth - savedepth; } ////////////////////////////////////////////////////////////////////////////// // // Properties. // ////////////////////////////////////////////////////////////////////////////// void QvMaterial::ToWebOOGL(QvState *state) { oogldepth++; ANNOUNCE(QvMaterial); QvElement *elt = new QvElement; elt->data = this; state->addElement(QvState::MaterialIndex, elt); OOGLout("{ = INST"); OOGLout("geom {"); OOGLappearance(this); OOGLout("= LIST"); } #define DO_PROPERTY(className, stackIndex) \ void \ className::ToWebOOGL(QvState *state) \ { \ ANNOUNCE(className); \ QvElement *elt = new QvElement; \ elt->data = this; \ state->addElement(QvState::stackIndex, elt); \ } DO_PROPERTY(QvCoordinate3, Coordinate3Index) DO_PROPERTY(QvMaterialBinding, MaterialBindingIndex) DO_PROPERTY(QvNormal, NormalIndex) DO_PROPERTY(QvNormalBinding, NormalBindingIndex) DO_PROPERTY(QvShapeHints, ShapeHintsIndex) DO_PROPERTY(QvFontStyle, FontStyleIndex) // WebOOGL punts on these ... (no support for texture mapping) DO_PROPERTY(QvTextureCoordinate2, TextureCoordinate2Index) DO_PROPERTY(QvTexture2, Texture2Index) DO_PROPERTY(QvTexture2Transform, Texture2TransformationIndex) #define DO_TYPED_PROPERTY(className, stackIndex, eltType) \ void \ className::ToWebOOGL(QvState *state) \ { \ ANNOUNCE(className); \ QvElement *elt = new QvElement; \ elt->data = this; \ elt->type = QvElement::eltType; \ state->addElement(QvState::stackIndex, elt); \ } void QvMatrixTransform::ToWebOOGL(QvState *state) { oogldepth++; ANNOUNCE(QvMatrixTransform); QvElement *elt = new QvElement; elt->data = this; elt->type = QvElement::MatrixTransform; state->addElement(QvState::TransformationIndex, elt); OOGLout("{ = INST"); OOGLout("transform {"); sprintf(out, "%f %f %f %f", matrix.value[0][0], matrix.value[0][1], matrix.value[0][2], matrix.value[0][3]); OOGLout(out); sprintf(out, "%f %f %f %f", matrix.value[1][0], matrix.value[1][1], matrix.value[1][2], matrix.value[1][3]); OOGLout(out); sprintf(out, "%f %f %f %f", matrix.value[2][0], matrix.value[2][1], matrix.value[2][2], matrix.value[2][3]); OOGLout(out); sprintf(out, "%f %f %f %f", matrix.value[3][0], matrix.value[3][1], matrix.value[3][2], matrix.value[3][3]); OOGLout(out); OOGLout("} geom"); OOGLout("{ = LIST"); } static void OOGLoutmat(QvSFMatrix *mat1) { int y; for (y = 0; y < 4; y++) { sprintf(out, "%f %f %f %f", mat1->value[0][y], mat1->value[1][y], mat1->value[2][y], mat1->value[3][y]); OOGLout(out); } } static void OOGLmat_init(QvSFMatrix *mat1) { int x, y; for (x = 0; x < 4; x++) for (y = 0; y < 4; y++) { if (x == y) mat1->value[x][y] = 1.0; else mat1->value[x][y] = 0.0; } } static void OOGLmat_mult(QvSFMatrix *mat1, QvSFMatrix *mat2, QvSFMatrix *result) { int x,y; for (y = 0; y < 4; y++) { for (x = 0; x < 4; x++) { result->value[x][y] = mat1->value[0][y] * mat2->value[x][0] + mat1->value[1][y] * mat2->value[x][1] + mat1->value[2][y] * mat2->value[x][2] + mat1->value[3][y] * mat2->value[x][3]; } } } static void OOGLmat_scale(QvSFMatrix *mat1, float xt, float yt, float zt) { int x, y; for (x = 0; x < 4; x++) for (y = 0; y < 4; y++) { if (x == y) mat1->value[x][y] = 1.0; else mat1->value[x][y] = 0.0; } mat1->value[0][0] = xt; mat1->value[1][1] = yt; mat1->value[2][2] = zt; } static void OOGLmat_trans(QvSFMatrix *mat1, float xt, float yt, float zt) { int x, y; for (x = 0; x < 4; x++) for (y = 0; y < 4; y++) { if (x == y) mat1->value[x][y] = 1.0; else mat1->value[x][y] = 0.0; } mat1->value[0][3] = xt; mat1->value[1][3] = yt; mat1->value[2][3] = zt; } static void OOGLmat_rot(QvSFMatrix *mat1, float angle, float *rotaxis) { float csA, snA, vsA, s; float axis[3]; OOGLmat_init(mat1); s = rotaxis[0]*rotaxis[0] + rotaxis[1]*rotaxis[1] + rotaxis[2]*rotaxis[2]; if(s == 0. || angle == 0.) return; s = 1/sqrt(s); axis[0] = rotaxis[0]*s; axis[1] = rotaxis[1]*s; axis[2] = rotaxis[2]*s; csA = cos(angle); snA = -sin(angle); vsA = 1 - csA; mat1->value[0][0] = axis[0]*axis[0]*vsA + csA; mat1->value[1][0] = axis[0]*axis[1]*vsA - axis[2]*snA; mat1->value[2][0] = axis[0]*axis[2]*vsA + axis[1]*snA; mat1->value[0][1] = axis[1]*axis[0]*vsA + axis[2]*snA; mat1->value[1][1] = axis[1]*axis[1]*vsA + csA; mat1->value[2][1] = axis[1]*axis[2]*vsA - axis[0]*snA; mat1->value[0][2] = axis[2]*axis[0]*vsA - axis[1]*snA; mat1->value[1][2] = axis[2]*axis[1]*vsA + axis[0]*snA; mat1->value[2][2] = axis[2]*axis[2]*vsA + csA; } void QvTransform::ToWebOOGL(QvState *state) // NOT RIGHT YET { QvSFMatrix mat1, mat2, mat3; OOGLmat_init(&mat1); OOGLmat_init(&mat2); OOGLmat_init(&mat3); OOGLmat_trans(&mat2, -center.value[0], -center.value[1], -center.value[2]); OOGLmat_mult(&mat1, &mat2, &mat3); OOGLmat_rot(&mat2, scaleOrientation.angle, scaleOrientation.axis); OOGLmat_mult(&mat3, &mat2, &mat1); OOGLmat_scale(&mat2, scaleFactor.value[0], scaleFactor.value[1], scaleFactor.value[2]); OOGLmat_mult(&mat1, &mat2, &mat3); OOGLmat_rot(&mat2, -scaleOrientation.angle, scaleOrientation.axis); OOGLmat_mult(&mat3, &mat2, &mat1); OOGLmat_rot(&mat2, rotation.angle, rotation.axis); OOGLmat_mult(&mat1, &mat2, &mat3); OOGLmat_trans(&mat2, center.value[0], center.value[1], center.value[2]); OOGLmat_mult(&mat3, &mat2, &mat1); OOGLmat_trans(&mat2, translation.value[0], translation.value[1], translation.value[2]); OOGLmat_mult(&mat1, &mat2, &mat3); oogldepth++; ANNOUNCE(QvTransform); QvElement *elt = new QvElement; elt->data = this; elt->type = QvElement::Transform; state->addElement(QvState::TransformationIndex, elt); OOGLout("{ = INST"); OOGLout("transform {\t# VRML Transform"); OOGLoutmat(&mat3); OOGLout("} geom"); OOGLout("{ = LIST"); } void QvRotation::ToWebOOGL(QvState *state) { QvElement *elt = new QvElement; QvSFMatrix mat1; oogldepth++; ANNOUNCE(QvRotation); OOGLmat_init(&mat1); OOGLmat_rot(&mat1, rotation.angle, rotation.axis); elt->data = this; elt->type = QvElement::Rotation; state->addElement(QvState::TransformationIndex, elt); OOGLout("{ = INST"); OOGLout("transform {"); OOGLoutmat(&mat1); OOGLout("} geom"); OOGLout("{ = LIST"); } void QvTranslation::ToWebOOGL(QvState *state) { QvSFMatrix mat1; oogldepth++; ANNOUNCE(QvTranslation); QvElement *elt = new QvElement; elt->data = this; elt->type = QvElement::Translation; state->addElement(QvState::TransformationIndex, elt); OOGLmat_trans(&mat1, translation.value[0], translation.value[1], translation.value[2]); OOGLout("{ = INST"); OOGLout("transform {"); OOGLoutmat(&mat1); OOGLout("} geom"); OOGLout("{ = LIST"); } void QvScale::ToWebOOGL(QvState *state) { oogldepth++; ANNOUNCE(QvScale); QvElement *elt = new QvElement; elt->data = this; elt->type = QvElement::Scale; state->addElement(QvState::TransformationIndex, elt); OOGLout("{ = INST"); OOGLout("transform {"); sprintf(out, "%f 0 0 0", scaleFactor.value[0]); OOGLout(out); sprintf(out, "0 %f 0 0", scaleFactor.value[1]); OOGLout(out); sprintf(out, "0 0 %f 0", scaleFactor.value[2]); OOGLout(out); OOGLout("0 0 0 1"); OOGLout("} geom"); OOGLout("{ = LIST"); } DO_TYPED_PROPERTY(QvDirectionalLight, LightIndex, DirectionalLight) DO_TYPED_PROPERTY(QvPointLight, LightIndex, PointLight) DO_TYPED_PROPERTY(QvSpotLight, LightIndex, SpotLight) DO_TYPED_PROPERTY(QvOrthographicCamera, CameraIndex, OrthographicCamera) DO_TYPED_PROPERTY(QvPerspectiveCamera, CameraIndex, PerspectiveCamera) ////////////////////////////////////////////////////////////////////////////// // // Shapes. // ////////////////////////////////////////////////////////////////////////////// static void OOGLprintProperties(QvState *state) { // printf("--------------------------------------------------------------\n"); // state->print(); // printf("--------------------------------------------------------------\n"); } void QvCone::ToWebOOGL(QvState *state) { ANNOUNCE(QvCone); OOGLout("# VRML Cone"); OOGLout("{ = BEZ224"); if (parts.value == ALL || parts.value == SIDES) { sprintf(out, "0 %f 0 1\t0 0 0 0\t0 %f 0 1", height.value/2.0, height.value/2.0); OOGLout(out); sprintf(out, "%f 0 0 1\t0 0 %f 0\t%f 0 0 1", -bottomRadius.value/2.0, bottomRadius.value/2.0, bottomRadius.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1\n", -bottomRadius.value, -height.value/2.0, bottomRadius.value, bottomRadius.value, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -bottomRadius.value, -height.value/2.0, -bottomRadius.value, bottomRadius.value, -height.value/2.0); OOGLout(out); sprintf(out, "%f 0 0 1\t0 0 %f 0\t%f 0 0 1", -bottomRadius.value/2.0, -bottomRadius.value/2.0, bottomRadius.value/2.0); OOGLout(out); sprintf(out, "0 %f 0 1\t0 0 0 0\t0 %f 0 1\n", height.value/2.0, height.value/2.0); OOGLout(out); } if (parts.value == ALL || parts.value == BOTTOM) { sprintf(out, "0 %f 0 1\t0 0 0 0\t0 %f 0 1", -height.value/2.0, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -bottomRadius.value/2.0, -height.value/2.0, bottomRadius.value/2.0, bottomRadius.value/2.0, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1\n", -bottomRadius.value, -height.value/2.0, bottomRadius.value, bottomRadius.value, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -bottomRadius.value, -height.value/2.0, -bottomRadius.value, bottomRadius.value, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -bottomRadius.value/2.0, -height.value/2.0, -bottomRadius.value/2.0, bottomRadius.value/2.0, -height.value/2.0); OOGLout(out); sprintf(out, "0 %f 0 1\t0 0 0 0\t0 %f 0 1\n", -height.value/2.0, -height.value/2.0); OOGLout(out); } OOGLout("}"); } void QvCube::ToWebOOGL(QvState *state) { float x = width.value / 2.0, y = height.value / 2.0, z = depth.value / 2.0; int i; ANNOUNCE(QvCube); OOGLout("# VRML Cube"); OOGLout("{ = OFF"); OOGLout("8 6 12"); for(i = 0; i < 8; i++) { sprintf(out, "%g %g %g", i&1 ? -x : x, i&2 ? -y : y, i&4 ? -z : z); OOGLout(out); } OOGLout("4 3 2 1 0"); OOGLout("4 4 5 6 7"); OOGLout("4 2 3 7 6"); OOGLout("4 0 1 5 4"); OOGLout("4 0 4 7 3"); OOGLout("4 1 2 6 5"); OOGLout("}"); } void QvCylinder::ToWebOOGL(QvState *state) { QvElement *elt = NULL; QvMaterial *qv_material = NULL; QvMaterialBinding *qv_materialb = NULL; Binding mb_val; elt = state->getTopElement(QvState::MaterialIndex); if (elt) { qv_material = (QvMaterial *)elt->data;} elt = state->getTopElement(QvState::MaterialBindingIndex); if (elt) { qv_materialb = (QvMaterialBinding *)elt->data; } if (qv_materialb) { mb_val = (Binding) qv_materialb->value.value; } else { mb_val = DEFAULT; } ANNOUNCE(QvCylinder); OOGLout("# VRML Cylinder"); OOGLout("{"); if (mb_val != PER_PART && mb_val != PER_PART_INDEXED) { OOGLappearance(qv_material); OOGLout("= BEZ224"); } else { OOGLout("= CBEZ224"); } colstr[0] = '\0'; if (parts.value == ALL || parts.value == SIDES) { sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value, height.value/2.0, radius.value, radius.value, height.value/2.0); OOGLout(out); sprintf(out, "%f 0 0 1\t0 0 %f 0\t%f 0 0 1", -radius.value, radius.value, radius.value); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1\n", -radius.value, -height.value/2.0, radius.value, radius.value, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value, -height.value/2.0, -radius.value, radius.value, -height.value/2.0); OOGLout(out); sprintf(out, "%f 0 0 1\t0 0 %f 0\t%f 0 0 1", -radius.value, -radius.value, radius.value); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value, height.value/2.0, -radius.value, radius.value, height.value/2.0); OOGLout(out); if (mb_val == PER_PART || mb_val == PER_PART_INDEXED) { OOGLgetcolor(qv_material, qv_materialb, 0); sprintf(out, "%s %s %s %s\n", colstr, colstr, colstr, colstr); OOGLout(out); } } if (parts.value == TOP || parts.value == ALL) { sprintf(out, "0 %f 0 1\t0 0 0 0\t0 %f 0 1", height.value/2.0, height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value/2.0, height.value/2.0, radius.value/2.0, radius.value/2.0, height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1\n", -radius.value, height.value/2.0, radius.value, radius.value, height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value, height.value/2.0, -radius.value, radius.value, height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value/2.0, height.value/2.0, -radius.value/2.0, radius.value/2.0, height.value/2.0); OOGLout(out); sprintf(out, "0 %f 0 1\t0 0 0 0\t0 %f 0 1", height.value/2.0, height.value/2.0); OOGLout(out); if (mb_val == PER_PART || mb_val == PER_PART_INDEXED) { OOGLgetcolor(qv_material, qv_materialb, 1); sprintf(out, "%s %s %s %s\n", colstr, colstr, colstr, colstr); OOGLout(out); } } if (parts.value == BOTTOM || parts.value == ALL) { sprintf(out, "0 %f 0 1\t0 0 0 0\t0 %f 0 1", -height.value/2.0, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value/2.0, -height.value/2.0, radius.value/2.0, radius.value/2.0, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1\n", -radius.value, -height.value/2.0, radius.value, radius.value, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value, -height.value/2.0, -radius.value, radius.value, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value/2.0, -height.value/2.0, -radius.value/2.0, radius.value/2.0, -height.value/2.0); OOGLout(out); sprintf(out, "0 %f 0 1\t0 0 0 0\t0 %f 0 1\n", -height.value/2.0, -height.value/2.0); OOGLout(out); if (mb_val == PER_PART || mb_val == PER_PART_INDEXED) { OOGLgetcolor(qv_material, qv_materialb, 2); sprintf(out, "%s %s %s %s\n", colstr, colstr, colstr, colstr); OOGLout(out); } } OOGLout("}"); } void QvSphere::ToWebOOGL(QvState *state) { QvElement *elt = NULL; QvMaterial *qv_material = NULL; // QvMaterialBinding *qv_materialb = NULL; elt = state->getTopElement(QvState::MaterialIndex); if (elt) { qv_material = (QvMaterial *)elt->data;} elt = state->getTopElement(QvState::MaterialBindingIndex); // if (elt) { qv_materialb = (QvMaterialBinding *)elt->data; } ANNOUNCE(QvSphere); OOGLout("# VRML Sphere"); OOGLout("{"); OOGLappearance(qv_material); OOGLout("= SPHERE"); sprintf(out, " %f", radius.value); OOGLout(out); OOGLout(" 0 0 0"); OOGLout("}"); } void QvIndexedFaceSet::ToWebOOGL(QvState *state) { QvElement *elt = NULL; QvCoordinate3 *qv_coord = NULL; QvMaterial *qv_material = NULL; // QvMaterialBinding *qv_materialb = NULL; QvNormal *qv_normal = NULL; QvNormalBinding *qv_normalb = NULL; float *coords; // float *vects; long *firstindex; // Binding mb_val; Binding nb_val; int count, numfaces, bad, numverts, numcoords, numnormals; elt = state->getTopElement(QvState::Coordinate3Index); if (elt) { qv_coord = (QvCoordinate3 *)elt->data;} elt = state->getTopElement(QvState::MaterialIndex); if (elt) { qv_material = (QvMaterial *)elt->data;} elt = state->getTopElement(QvState::MaterialBindingIndex); // if (elt) { qv_materialb = (QvMaterialBinding *)elt->data; } elt = state->getTopElement(QvState::NormalIndex); if (elt) { qv_normal = (QvNormal *)elt->data; } elt = state->getTopElement(QvState::NormalBindingIndex); if (elt) { qv_normalb = (QvNormalBinding *)elt->data; } // if (qv_materialb) { mb_val = (Binding) qv_materialb->value.value; } // else { mb_val = DEFAULT; } if (qv_normalb) { nb_val = (Binding) qv_normalb->value.value; } else { nb_val = DEFAULT; } if (qv_coord) { numcoords = qv_coord->point.num; coords = qv_coord->point.values; } else { numcoords = 0; coords = NULL; } if (qv_normal) { numnormals = qv_normal->vector.num; // vects = qv_normal->vector.values; } else { numnormals = 0; // vects = NULL; } if (qv_material) { } firstindex = coordIndex.values; numverts = coordIndex.num, ANNOUNCE(QvIndexedFaceSet); numfaces = 0; bad = 0; for (count = 0; count < numverts; count++) { if (firstindex[count] < 0 && !bad) { numfaces++; bad = 1; } else bad = 0; /* bad handles case of two consecutive delimeters */ if (firstindex[count] > (numcoords - 1)) return; } for (count = 0; count < numnormals; count++) { } OOGLout("# IndexedFaceSet"); if (coords == NULL) { OOGLout("# Bad Values"); return; } if (nb_val) { } OOGLout("{ = OFF"); sprintf(out, "%d %d 0\n", numcoords, numfaces); OOGLout(out); for (count = 0; count < numcoords; count++) { float x = coords[count*3], y = coords[count*3+1], z = coords[count*3+2]; sprintf(out, "%f %f %f", x, y, z); OOGLout(out); } OOGLout(""); count = 0; while (count < numverts) { int numvts, start; numvts = 0; start = count; while (firstindex[count] > -1 && count < numverts) { count++; numvts++; } if (count > start) { OOGLoutindent(); sprintf(out, "%d", numvts); OOGLoutraw(out); for(int i=start;igetTopElement(QvState::Coordinate3Index); if (elt) { qv_coord = (QvCoordinate3 *)elt->data;} elt = state->getTopElement(QvState::MaterialIndex); if (elt) { qv_material = (QvMaterial *)elt->data;} elt = state->getTopElement(QvState::MaterialBindingIndex); if (elt) { qv_materialb = (QvMaterialBinding *)elt->data; } if (qv_materialb) { mb_val = (Binding) qv_materialb->value.value; } else { mb_val = DEFAULT; } if (qv_coord) { numcoords = qv_coord->point.num; coords = qv_coord->point.values; } else { numcoords = 0; coords = NULL; } nummats = materialIndex.num; matindex = materialIndex.values; firstindex = coordIndex.values; numverts = coordIndex.num, ANNOUNCE(QvIndexedLineSet); count = 0; numlines = 0; numvts = 0; points = 0; numsegs = 0; while (count < numverts) { int x; x = 0; while (firstindex[count] < 0 && count < numverts) count++; while (firstindex[count] > -1 && count < numverts) { count++; x++; } if (x == 1) { numvts++; numlines++; points++; } else if (x > 1) { numvts += x; numlines++; numsegs += x - 1; } } OOGLout("# IndexedLineSet"); if (coords == NULL || numvts < 1 || numlines < 1) { OOGLout("# Bad Values"); return; } OOGLout("{ = VECT"); if (mb_val == DEFAULT || mb_val == OVERALL) { sprintf(out, "%d %d 1\n", numlines, numvts); } else if (mb_val == PER_FACE || mb_val == PER_FACE_INDEXED) { sprintf(out, "%d %d %d\n", numlines, numvts, numlines); } else if (mb_val == PER_PART || mb_val == PER_PART_INDEXED) { sprintf(out, "%d %d %d\n", numsegs + points, numvts, numsegs + points); } else if (mb_val == PER_VERTEX || mb_val == PER_VERTEX_INDEXED) { sprintf(out, "%d %d %d\n", numlines, numvts, numvts); } OOGLout(out); /* number of vertices in each poly line */ OOGLoutindent(); count = 0; while (count < numverts) { int x; x = 0; while (firstindex[count] < 0 && count < numverts) count++; while (firstindex[count] > -1 && count < numverts) { count++; x++; } if (mb_val == PER_PART || mb_val == PER_PART_INDEXED) { /* Here, we divide our poly lines into segments... */ if (x == 1) { sprintf(out,"1 "); OOGLoutraw(out); } else if (x > 1) { while (x > 1) { sprintf(out,"2 "); OOGLoutraw(out); x--; } sprintf(out,"%d ", x - 1); OOGLoutraw(out); } } else if (x > 0) { sprintf(out,"%d ", x); OOGLoutraw(out); } } OOGLoutraw("\n"); /* number of colors in each poly line */ OOGLoutindent(); if (mb_val == DEFAULT || mb_val == OVERALL) { count = 1; OOGLoutraw("1 "); while (count < numlines) { sprintf(out,"0 "); OOGLoutraw(out); count++; } OOGLoutraw("\n"); } else if (mb_val == PER_FACE || mb_val == PER_FACE_INDEXED) { count = 0; while (count < numlines) { OOGLoutraw("1 "); count++; } } else if (mb_val == PER_PART || mb_val == PER_PART_INDEXED) { count = 0; while (count < (numsegs + points)) { OOGLoutraw("1 "); count++; } } else if (mb_val == PER_VERTEX || mb_val == PER_VERTEX_INDEXED) { count = 0; while (count < numverts) { int x; x = 0; while (firstindex[count] < 0 && count < numverts) count++; while (firstindex[count] > -1 && count < numverts) { count++; x++; } if (x > 0) { sprintf(out,"%d ", x); OOGLoutraw(out); } } } OOGLout(""); count = 0; while (count < numverts) { long num; while (firstindex[count] < 0 && count < numverts) count++; while (firstindex[count] > -1 && count < numverts) { float x, y, z; num = firstindex[count]; count++; if (num > -1 && num < numcoords) { x = coords[num * 3]; y = coords[num * 3 + 1]; z = coords[num * 3 + 2]; sprintf(out,"%f %f %f", x, y, z); OOGLout(out); } else sprintf(out,"%f %f %f", x, y, z); } } OOGLout(""); OOGLoutindent(); if (mb_val == DEFAULT || mb_val == OVERALL) { OOGLgetcolor(qv_material, qv_materialb, 0); OOGLout(colstr); } else if (mb_val == PER_FACE || mb_val == PER_PART || mb_val == PER_VERTEX) { int numpieces; if (mb_val == PER_FACE) numpieces = numlines; else if (mb_val == PER_PART) numpieces = numsegs + points; else if (mb_val == PER_VERTEX) numpieces = numvts; count = 0; while (count < numpieces) { OOGLgetcolor(qv_material, qv_materialb, count); OOGLout(colstr); count++; } } else if (mb_val == PER_FACE_INDEXED || mb_val == PER_PART_INDEXED || mb_val == PER_VERTEX_INDEXED) { int numpieces, x; if (mb_val == PER_FACE_INDEXED) numpieces = numlines; else if (mb_val == PER_PART_INDEXED) numpieces = numsegs + points; else if (mb_val == PER_VERTEX_INDEXED) numpieces = numvts; count = 0; x = 0; while (count < numpieces) { int num; if (nummats > 0) { num = (int) matindex[x % nummats]; if (num >= 0) { OOGLgetcolor(qv_material, qv_materialb, num); OOGLout(colstr); count++; x++; } else x++; } else { OOGLgetcolor(qv_material, qv_materialb, 0); OOGLout(colstr); count++; } } } OOGLout("}"); } void QvPointSet::ToWebOOGL(QvState *state) { QvElement *elt = NULL; QvCoordinate3 *qv_coord = NULL; QvMaterial *qv_material = NULL; QvMaterialBinding *qv_materialb = NULL; float *coords; // Binding mb_val; int count, numcoords; long numverts; elt = state->getTopElement(QvState::Coordinate3Index); if (elt) { qv_coord = (QvCoordinate3 *)elt->data;} elt = state->getTopElement(QvState::MaterialIndex); if (elt) { qv_material = (QvMaterial *)elt->data;} elt = state->getTopElement(QvState::MaterialBindingIndex); if (elt) { qv_materialb = (QvMaterialBinding *)elt->data; } // if (qv_materialb) { mb_val = (Binding) qv_materialb->value.value; } // else { mb_val = DEFAULT; } if (qv_coord) { numcoords = qv_coord->point.num; coords = qv_coord->point.values; } else { numcoords = 0; coords = NULL; } if (qv_material) { } if (startIndex.value > numcoords) { OOGLout("# Bad Values"); return; } if (numPoints.value == (-1)) { numverts = numcoords - startIndex.value; } else if ((numPoints.value - startIndex.value) > numcoords) { OOGLout("# Bad Values"); return; } else { numverts = numPoints.value - startIndex.value; } ANNOUNCE(QvPointSet); OOGLout("# PointSet"); if (coords == NULL) { OOGLout("# Bad Values"); return; } OOGLout("{ = VECT"); sprintf(out, "%ld %ld %ld\n", numverts, numverts, numverts); OOGLout(out); /* number of vertices in each poly line */ OOGLoutindent(); for (count = 0; count < numverts; count++) { OOGLoutraw("1 "); } OOGLoutraw("\n"); /* number of colors in each poly line */ OOGLoutindent(); for (count = 0; count < numverts; count++) { OOGLoutraw("1 "); } OOGLoutraw("\n"); for (count = 0; count < numverts; count++) { float x = coords[(count+startIndex.value)*3], y = coords[(count+startIndex.value)*3+1], z = coords[(count+startIndex.value)*3+2]; sprintf(out, "%f %f %f", x, y, z); OOGLout(out); } OOGLout(""); for (count = 0; count < numverts; count++) { OOGLgetcolor(qv_material, qv_materialb, count); OOGLout(colstr); } OOGLout("}"); } static int knowngsfont(char *str) { if(str == NULL) return 0; if(access(str, 0) >= 0) return 1; char buf[2048]; const char *p, *tail; const char *gsfontpath = getenv("GS_FONTPATH"); if(gsfontpath == NULL) gsfontpath = "/usr/local/lib/ghostscript/fonts"; for(p = tail = gsfontpath; tail && *p != '\0'; p = tail+1) { tail = strchr(p, ':'); int len = tail ? tail - p : strlen(p); if(len > 1024) len = 1024; memcpy(buf, p, len); buf[len] = '/'; strncpy(buf+len+1, str, 2046-len); if(access(buf, 0) >= 0) return 1; } return 0; } void QvAsciiText::ToWebOOGL(QvState *state) { float fontsize = 1.0; // float linespace = 1.0; char *font = NULL; // int bold = 0, italic = 0; QvElement *elt = state->getTopElement(QvState::FontStyleIndex); if(elt && elt->data) { QvFontStyle *fs = (QvFontStyle *)elt->data; fontsize = fs->size.value; // if(fs->style.value & (1<family.value) { case QvFontStyle::SERIF: font = "hrpl_t.gsf"; break; case QvFontStyle::TYPEWRITER: /* sorry, can't do that now */ break; } } int i, c; float y = 0; char buf[2048], *q; const char *p; char *just = "sw"; FILE *f; switch(justification.value) { case QvAsciiText::LEFT: just = "sw"; break; case QvAsciiText::RIGHT: just = "se"; break; case QvAsciiText::CENTER: just = "s"; break; } OOGLout(string.num > 1 ? "{ = LIST # VRML AsciiText" : "# VRML AsciiText"); for(i = 0; i < string.num; i++) { float wid = width.values[ (i 0) sprintf(buf + strlen(buf), "-w %g ", wid); if(font && knowngsfont(font)) sprintf(buf + strlen(buf), "-hershey %s ", font); q = buf + strlen(buf); *q++ = '\''; for(p = string.values[i].getString(); p && *p != '\0' && q < &buf[2048-3]; ) { if(*p == '\'' || *p == '\\') *q++ = '\\'; *q++ = *p++; } *q++ = '\''; *q = '\0'; f = popen(buf, "r"); for(q = buf; (c = getc(f)) != EOF; ) { if(c == '\n') { *q = '\0'; OOGLout(buf); q = buf; } else { *q++ = c; } } pclose(f); y -= spacing.value * fontsize; } if(string.num > 1) OOGLout("} # End AsciiText"); } ////////////////////////////////////////////////////////////////////////////// // // WWW-specific nodes. // ////////////////////////////////////////////////////////////////////////////// void QvWWWInline::ToWebOOGL(QvState *) { int notuniq = 0; int i; ANNOUNCE(QvWWWInline); if (OOGLhand) { sprintf(out, "{ : %s }", name.value.getString()); for (i = 0; i < unique && !notuniq; i++) { if (!strcmp(urls[i], name.value.getString())) notuniq = 1; } if (!notuniq) { urls[unique++] = (char *)name.value.getString(); } } else { sprintf(out, "{ COMMENT url.%d WWWInline { \"%s\" }}", unique++, name.value.getString()); } OOGLout(out); } void QvWWWAnchor::ToWebOOGL(QvState *state) { int savedepth, i; ANNOUNCE(QvWWWAnchor); OOGLout("{ = LIST # Anchor"); OOGLoutindent(); OOGLoutraw("{ COMMENT "); sprintf(out, "wwwanchor.%d HREF { \"%s\" } }\n", mypid, name.value.getString()); OOGLoutraw(out); savedepth = oogldepth; indent++; for (i = 0; i < getNumChildren(); i++) getChild(i)->ToWebOOGL(state); indent--; savedepth = oogldepth - savedepth; /* How deep did we get ? :-)*/ for (i = 0; i < savedepth; i++) { /* Do the equivalent OOGL pop */ out[i*2] = '}'; /* pop the LIST */ out[i*2+1] = '}'; /* pop the INST */ } out[savedepth*2] = '\0'; OOGLout(out); OOGLout("} # End Anchor"); oogldepth = oogldepth - savedepth; } ////////////////////////////////////////////////////////////////////////////// // // Default traversal methods. These nodes have no effects during traversal. // ////////////////////////////////////////////////////////////////////////////// DEFAULT_TRAVERSE(QvInfo) DEFAULT_TRAVERSE(QvUnknownNode) ////////////////////////////////////////////////////////////////////////////// #undef ANNOUNCE #undef DEFAULT_TRAVERSE #undef DO_PROPERTY #undef DO_SHAPE #undef DO_TYPED_PROPERTY geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvUnknownNode.c++0000644000175000017500000000140312310110177021203 00000000000000#include #include QV_NODE_SOURCE(QvUnknownNode); QvUnknownNode::QvUnknownNode() { QV_NODE_CONSTRUCTOR(QvUnknownNode); className = NULL; // Set global field data to this instance's if (QV_NODE_IS_FIRST_INSTANCE()) delete fieldData; instanceFieldData = new QvFieldData; fieldData = instanceFieldData; } void QvUnknownNode::setClassName(const char *name) { className = strdup(name); } QvUnknownNode::~QvUnknownNode() { for (int i = 0; i < instanceFieldData->getNumFields(); i++) delete instanceFieldData->getField(this, i); delete instanceFieldData; #ifdef sun if (className != NULL) free((char *) className); #else if (className != NULL) free((void *) className); #endif } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvWWWAnchor.c++0000644000175000017500000000073112310110177020560 00000000000000#include QV_NODE_SOURCE(QvWWWAnchor); QvWWWAnchor::QvWWWAnchor() { QV_NODE_CONSTRUCTOR(QvWWWAnchor); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(name); QV_NODE_ADD_FIELD(description); QV_NODE_ADD_FIELD(map); name.value = ""; description.value = ""; map.value = NONE; QV_NODE_DEFINE_ENUM_VALUE(Map, NONE); QV_NODE_DEFINE_ENUM_VALUE(Map, POINT); QV_NODE_SET_SF_ENUM_TYPE(map, Map); } QvWWWAnchor::~QvWWWAnchor() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvWWWInline.c++0000644000175000017500000000067412310110177020572 00000000000000#include QV_NODE_SOURCE(QvWWWInline); QvWWWInline::QvWWWInline() { QV_NODE_CONSTRUCTOR(QvWWWInline); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(name); QV_NODE_ADD_FIELD(bboxSize); QV_NODE_ADD_FIELD(bboxCenter); name.value = ""; bboxSize.value[0] = bboxSize.value[0] = bboxSize.value[0] = 0.0; bboxCenter.value[0] = bboxCenter.value[0] = bboxCenter.value[0] = 0.0; } QvWWWInline::~QvWWWInline() { } geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvAsciiText.h0000644000175000017500000000306612310110177020521 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_ASCII_TEXT_ #define _QV_ASCII_TEXT_ #include #include #include #include #include class QvAsciiText : public QvNode { QV_NODE_HEADER(QvAsciiText); public: enum Justification { // Text justification: LEFT, // Align left edge of text to origin CENTER, // Align center of text to origin RIGHT, // Align right edge of text to origin }; // Fields QvMFString string; // Text string QvSFFloat spacing; // Inter-string spacing QvSFEnum justification; // Text justification QvMFFloat width; // Suggested width constraint }; #endif /* _QV_ASCII_TEXT_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvBasic.h0000644000175000017500000000310412310110177017636 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_BASIC_ #define _QV_BASIC_ #include #ifdef NeXT #include #endif #include #include #ifndef FALSE # define FALSE 0 # define TRUE 1 #endif typedef int QvBool; // This uses the preprocessor to quote a string #if defined(__STDC__) || defined(__ANSI_CPP__) /* ANSI C */ # define QV__QUOTE(str) #str #else /* Non-ANSI C */ # define QV__QUOTE(str) "str" #endif // This uses the preprocessor to concatenate two strings #if defined(__STDC__) || defined(__ANSI_CPP__) /* ANSI C */ # define QV__CONCAT(str1, str2) str1##str2 #else /* Non-ANSI C */ # define QV__CONCAT(str1, str2) str1/**/str2 #endif #endif /* _QV_BASIC_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvChildList.h0000644000175000017500000000211212310110177020472 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_CHILD_LIST_ #define _QV_CHILD_LIST_ #include class QvChildList : public QvNodeList { public: QvChildList(); ~QvChildList(); }; #endif /* _QV_CHILD_LIST_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvCone.h0000644000175000017500000000264012310110177017505 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_CONE_ #define _QV_CONE_ #include #include #include class QvCone : public QvNode { QV_NODE_HEADER(QvCone); public: enum Part { // Cone parts: SIDES = 0x01, // The conical part BOTTOM = 0x02, // The bottom circular face ALL = 0x03 // All parts }; // Fields QvSFBitMask parts; // Visible parts of cone QvSFFloat bottomRadius; // Radius of bottom circular face QvSFFloat height; // Size in y dimension }; #endif /* _QV_CONE_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvCoordinate3.h0000644000175000017500000000223712310110177020775 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_COORDINATE3_ #define _QV_COORDINATE3_ #include #include class QvCoordinate3 : public QvNode { QV_NODE_HEADER(QvCoordinate3); public: // Fields QvMFVec3f point; // Coordinate point(s) }; #endif /* _QV_COORDINATE3_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvCube.h0000644000175000017500000000233112310110177017474 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_CUBE_ #define _QV_CUBE_ #include #include class QvCube : public QvNode { QV_NODE_HEADER(QvCube); public: // Fields QvSFFloat width; // Size in x dimension QvSFFloat height; // Size in y dimension QvSFFloat depth; // Size in z dimension }; #endif /* _QV_CUBE_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvCylinder.h0000644000175000017500000000273312310110177020375 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_CYLINDER_ #define _QV_CYLINDER_ #include #include #include class QvCylinder : public QvNode { QV_NODE_HEADER(QvCylinder); public: enum Part { // Cylinder parts SIDES = 0x01, // The tubular part TOP = 0x02, // The top circular face BOTTOM = 0x04, // The bottom circular face ALL = 0x07 // All parts }; // Fields QvSFBitMask parts; // Visible parts of cylinder QvSFFloat radius; // Radius in x and z dimensions QvSFFloat height; // Size in y dimension }; #endif /* _QV_CYLINDER_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvDB.h0000644000175000017500000000222612310110177017106 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_DB_ #define _QV_DB_ #include class QvInput; class QvNode; class QvField; class QvDB { public: static const char *versionString; static void init(); static QvBool read(QvInput *in, QvNode *&rootNode); }; #endif /* _QV_DB_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvDebugError.h0000644000175000017500000000210712310110177020657 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_DEBUG_ERROR #define _QV_DEBUG_ERROR class QvDebugError { public: static void post(const char *methodName, const char *formatString ...); }; #endif /* _QV_DEBUG_ERROR */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvDict.h0000644000175000017500000000277512310110177017515 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_DICT_ #define _QV_DICT_ #include #include #include class QvDictEntry { private: u_long key; void * value; QvDictEntry * next; QvDictEntry(u_long k, void *v) { key = k; value = v; }; friend class QvDict; }; class QvDict { public: QvDict( int entries = 251 ); ~QvDict(); void clear(); QvBool enter(u_long key, void *value); QvBool find(u_long key, void *&value) const; QvBool remove(u_long key); private: int tableSize; QvDictEntry * *buckets; QvDictEntry *& findEntry(u_long key) const; }; #endif /* _QV_DICT_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvDirectionalLight.h0000644000175000017500000000263012310110177022045 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_DIRECTIONAL_LIGHT_ #define _QV_DIRECTIONAL_LIGHT_ #include #include #include #include #include class QvDirectionalLight : public QvNode { QV_NODE_HEADER(QvDirectionalLight); public: // Fields QvSFBool on; // Whether light is on QvSFFloat intensity; // Source intensity (0 to 1) QvSFColor color; // RGB source color QvSFVec3f direction; // Illumination direction vector }; #endif /* _QV_DIRECTIONAL_LIGHT_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvElement.h0000644000175000017500000000440512310110177020213 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_ELEMENT_ #define _QV_ELEMENT_ #include class QvNode; ////////////////////////////////////////////////////////////////////////////// // // The base class element; the data is a pointer to some QvNode. The // type of the node can be inferred from the use of the element // instance in a particular stack in the state. In some cases, the // "type" field is used to distinguish among various possible node // types within a single stack. // ////////////////////////////////////////////////////////////////////////////// class QvElement { public: enum NodeType { // Fallback case Unknown, // Types of cameras in camera stack OrthographicCamera, PerspectiveCamera, // Types of lights in light stack DirectionalLight, PointLight, SpotLight, // Types of transformations in transformation stack NoOpTransform, // For QvTransformSeparator MatrixTransform, Rotation, Scale, Transform, Translation, // This has to be last!!! NumNodeTypes }; static const char *nodeTypeNames[NumNodeTypes]; // Names of node types int depth; // Depth of element in state QvElement *next; // Next element in stack QvNode *data; // Pointer to node containing data NodeType type; // Type of data node QvElement(); virtual ~QvElement(); // Prints contents for debugging, mostly virtual void print(); }; #endif /* _QV_ELEMENT_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvField.h0000644000175000017500000000432512310110177017646 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_FIELD_ #define _QV_FIELD_ #include #include class QvInput; class QvNode; class QvField { public: virtual ~QvField(); QvBool isDefault() const { return flags.hasDefault; } QvNode * getContainer() const { return container; } void setDefault(QvBool def) { flags.hasDefault = def; } void setContainer(QvNode *cont); QvBool read(QvInput *in, const QvName &name); QvField() { flags.hasDefault = TRUE; } public: private: struct { unsigned int hasDefault : 1; // Field is set to default value } flags; QvNode *container; static QvField * createInstanceFromName(const QvName &className); virtual QvBool readValue(QvInput *in) = 0; friend class QvFieldData; }; class QvSField : public QvField { public: virtual ~QvSField(); protected: QvSField(); private: virtual QvBool readValue(QvInput *in) = 0; }; class QvMField : public QvField { public: int num; // Number of values int maxNum; // Number of values allocated // Destructor virtual ~QvMField(); protected: QvMField(); virtual void makeRoom(int newNum); private: virtual void allocValues(int num) = 0; virtual QvBool readValue(QvInput *in); virtual QvBool read1Value(QvInput *in, int index) = 0; }; #endif /* _QV_FIELD_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvFieldData.h0000644000175000017500000000364612310110177020445 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_FIELD_DATA_ #define _QV_FIELD_DATA_ #include #include #include class QvField; class QvInput; class QvNode; class QvFieldData { public: QvFieldData() {} ~QvFieldData(); void addField(QvNode *defObject, const char *fieldName, const QvField *field); int getNumFields() const { return fields.getLength(); } const QvName & getFieldName(int index) const; QvField * getField(const QvNode *object, int index) const; void addEnumValue(const char *typeName, const char *valName, int val); void getEnumData(const char *typeName, int &num, const int *&vals, const QvName *&names); QvBool read(QvInput *in, QvNode *object, QvBool errorOnUnknownField = TRUE) const; QvBool read(QvInput *in, QvNode *object, const QvName &fieldName, QvBool &foundName) const; QvBool readFieldTypes(QvInput *in, QvNode *object); private: QvPList fields; QvPList enums; }; #endif /* _QV_FIELD_DATA_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvFields.h0000644000175000017500000000256012310110177020030 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_FIELDS_ #define _QV_FIELDS_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /* _QV_FIELDS_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvFontStyle.h0000644000175000017500000000323312310110177020547 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_FONT_STYLE_ #define _QV_FONT_STYLE_ #include #include #include #include class QvFontStyle : public QvNode { QV_NODE_HEADER(QvFontStyle); public: enum Family { // Font family: SERIF, // Serif style (such as TimesRoman) SANS, // Sans-serif style (such as Helvetica) TYPEWRITER // Fixed pitch style (such as Courier) }; enum Style { // Font style modifications: NONE = 0x00, // No modifications to family BOLD = 0x01, // Embolden family ITALIC = 0x02 // Italicize or slant family }; // Fields QvSFFloat size; // Font size QvSFEnum family; // Font family QvSFBitMask style; // Font style modifications to family }; #endif /* _QV_FONT_STYLE_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvGroup.h0000644000175000017500000000242612310110177017717 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_GROUP_ #define _QV_GROUP_ class QvChildList; #include class QvGroup : public QvNode { QV_NODE_HEADER(QvGroup); public: QvNode * getChild(int index) const; int getNumChildren() const; virtual QvChildList *getChildren() const; virtual QvBool readInstance(QvInput *in); virtual QvBool readChildren(QvInput *in); }; #endif /* _QV_GROUP_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvIndexedFaceSet.h0000644000175000017500000000257612310110177021444 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_INDEXED_FACE_SET_ #define _QV_INDEXED_FACE_SET_ #include #include #define QV_END_FACE_INDEX (-1) class QvIndexedFaceSet : public QvNode { QV_NODE_HEADER(QvIndexedFaceSet); public: // Fields: QvMFLong coordIndex; // Coordinate indices QvMFLong materialIndex; // Material indices QvMFLong normalIndex; // Surface normal indices QvMFLong textureCoordIndex; // Texture Coordinate indices }; #endif /* _QV_INDEXED_FACE_SET_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvIndexedLineSet.h0000644000175000017500000000257612310110177021475 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_INDEXED_LINE_SET_ #define _QV_INDEXED_LINE_SET_ #include #include #define QV_END_LINE_INDEX (-1) class QvIndexedLineSet : public QvNode { QV_NODE_HEADER(QvIndexedLineSet); public: // Fields: QvMFLong coordIndex; // Coordinate indices QvMFLong materialIndex; // Material indices QvMFLong normalIndex; // Surline normal indices QvMFLong textureCoordIndex; // Texture Coordinate indices }; #endif /* _QV_INDEXED_LINE_SET_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvInfo.h0000644000175000017500000000216712310110177017520 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_INFO_ #define _QV_INFO_ #include #include class QvInfo : public QvNode { QV_NODE_HEADER(QvInfo); public: // Fields QvSFString string; // Info string }; #endif /* _QV_INFO_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvInput.h0000644000175000017500000000521012310110177017714 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_INPUT_ #define _QV_INPUT_ #include #include class QvNode; class QvDB; class QvInput { public: QvInput(); ~QvInput(); static float isASCIIHeader(const char *string); void setFilePointer(FILE *newFP); FILE * getCurFile() const { return fp; } float getVersion(); QvBool get(char &c); QvBool read(char &c); QvBool read(QvString &s); QvBool read(QvName &n, QvBool validIdent = FALSE); QvBool read(int &i); QvBool read(unsigned int &i); QvBool read(short &s); QvBool read(unsigned short &s); QvBool read(long &l); QvBool read(unsigned long &l); QvBool read(float &f); QvBool read(double &d); QvBool eof() const; void getLocationString(QvString &string) const; void putBack(char c); void putBack(const char *string); void addReference(const QvName &name, QvNode *node); QvNode * findReference(const QvName &name) const; private: FILE *fp; // File pointer int lineNum; // Number of line currently reading float version; // Version number of file QvBool readHeader; // TRUE if header was checked for A/B QvBool headerOk; // TRUE if header was read ok QvDict refDict; // Node reference dictionary QvString backBuf; int backBufIndex; QvBool checkHeader(); QvBool skipWhiteSpace(); QvBool readInteger(long &l); QvBool readUnsignedInteger(unsigned long &l); QvBool readReal(double &d); QvBool readUnsignedIntegerString(char *str); int readDigits(char *string); int readHexDigits(char *string); int readChar(char *string, char charToRead); friend class QvNode; friend class QvDB; }; #endif /* _QV_INPUT_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvLOD.h0000644000175000017500000000237212310110177017241 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_LEVEL_OF_DETAIL_ #define _QV_LEVEL_OF_DETAIL_ #include #include #include class QvLOD : public QvGroup { QV_NODE_HEADER(QvLOD); public: // Fields QvMFFloat range; // Distance ranges for LOD switching QvSFVec3f center; // Center for distance computation }; #endif /* _QV_LEVEL_OF_DETAIL_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvLists.h0000644000175000017500000000244512310110177017722 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_LISTS_ #define _QV_LISTS_ #include class QvField; class QvNode; class QvNodeList : public QvPList { public: QvNodeList(); ~QvNodeList() { truncate(0); } void append(QvNode *node); void remove(int which); void truncate(int start); QvNode * operator [](int i) const { return ( (QvNode *) ( (* (const QvPList *) this) [i]) ); } }; #endif /* _QV_LISTS_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMFColor.h0000644000175000017500000000214212310110177020117 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MF_COLOR_ #define _QV_MF_COLOR_ #include class QvMFColor : public QvMField { public: float *values; // 3 per color QV_MFIELD_HEADER(QvMFColor); }; #endif /* _QV_MF_COLOR_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMFFloat.h0000644000175000017500000000212112310110177020103 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MF_FLOAT_ #define _QV_MF_FLOAT_ #include class QvMFFloat : public QvMField { public: float *values; QV_MFIELD_HEADER(QvMFFloat); }; #endif /* _QV_MF_FLOAT_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMFLong.h0000644000175000017500000000211312310110177017736 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MF_LONG_ #define _QV_MF_LONG_ #include class QvMFLong : public QvMField { public: long *values; QV_MFIELD_HEADER(QvMFLong); }; #endif /* _QV_MF_LONG_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMFString.h0000644000175000017500000000213112310110177020305 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MF_STRING_ #define _QV_MF_STRING_ #include class QvMFString : public QvMField { public: QvString *values; QV_MFIELD_HEADER(QvMFString); }; #endif /* _QV_MF_STRING_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMFVec2f.h0000644000175000017500000000212112310110177020003 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MF_VEC2F_ #define _QV_MF_VEC2F_ #include class QvMFVec2f : public QvMField { public: float *values; QV_MFIELD_HEADER(QvMFVec2f); }; #endif /* _QV_MF_VEC2F_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMFVec3f.h0000644000175000017500000000212112310110177020004 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MF_VEC3F_ #define _QV_MF_VEC3F_ #include class QvMFVec3f : public QvMField { public: float *values; QV_MFIELD_HEADER(QvMFVec3f); }; #endif /* _QV_MF_VEC3F_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMaterial.h0000644000175000017500000000261112310110177020355 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MATERIAL_ #define _QV_MATERIAL_ #include #include #include class QvMaterial : public QvNode { QV_NODE_HEADER(QvMaterial); public: // Fields QvMFColor ambientColor; // Ambient color QvMFColor diffuseColor; // Diffuse color QvMFColor specularColor; // Specular color QvMFColor emissiveColor; // Emissive color QvMFFloat shininess; // Shininess QvMFFloat transparency; // Transparency }; #endif /* _QV_MATERIAL_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMaterialBinding.h0000644000175000017500000000245412310110177021655 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MATERIAL_BINDING_ #define _QV_MATERIAL_BINDING_ #include #include class QvMaterialBinding : public QvNode { QV_NODE_HEADER(QvMaterialBinding); public: enum Binding { DEFAULT, OVERALL, PER_PART, PER_PART_INDEXED, PER_FACE, PER_FACE_INDEXED, PER_VERTEX, PER_VERTEX_INDEXED }; // Fields: QvSFEnum value; }; #endif /* _QV_MATERIAL_BINDING_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvMatrixTransform.h0000644000175000017500000000227312310110177021763 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MATRIX_TRANSFORM_ #define _QV_MATRIX_TRANSFORM_ #include #include class QvMatrixTransform : public QvNode { QV_NODE_HEADER(QvMatrixTransform); public: // Fields QvSFMatrix matrix; // Transformation matrix }; #endif /* _QV_MATRIX_TRANSFORM_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvNode.h0000644000175000017500000000506212310110177017507 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_NODE_ #define _QV_NODE_ #include class QvChildList; class QvDict; class QvFieldData; class QvInput; class QvNodeList; class QvState; class QvNode { public: enum Stage { FIRST_INSTANCE, // First real instance being constructed PROTO_INSTANCE, // Prototype instance being constructed OTHER_INSTANCE // Subsequent instance being constructed }; QvFieldData *fieldData; QvChildList *children; QvBool isBuiltIn; QvName *objName; QvNode(); virtual ~QvNode(); // Reference counting: long refCount; void ref() const; // Adds reference void unref() const; // Removes reference, deletes if now 0 void unrefNoDelete() const; // Removes reference, never deletes const QvName & getName() const; void setName(const QvName &name); static void init(); static QvBool read(QvInput *in, QvNode *&node); virtual QvFieldData *getFieldData() = 0; virtual void traverse(QvState *state) = 0; virtual void ToWebOOGL(QvState *state) = 0; protected: virtual QvBool readInstance(QvInput *in); private: static QvDict *nameDict; static void addName(QvNode *, const char *); static void removeName(QvNode *, const char *); static QvNode * readReference(QvInput *in); static QvBool readNode(QvInput *in, QvName &className,QvNode *&node); static QvBool readNodeInstance(QvInput *in, const QvName &className, const QvName &refName, QvNode *&node); static QvNode * createInstance(QvInput *in, const QvName &className); static QvNode * createInstanceFromName(const QvName &className); static void flushInput(QvInput *in); }; #endif /* _QV_NODE_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvNodes.h0000644000175000017500000000356512310110177017700 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_NODES_ #define _QV_NODES_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /* _QV_NODES_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvNormal.h0000644000175000017500000000220412310110177020045 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_NORMAL_ #define _QV_NORMAL_ #include #include class QvNormal : public QvNode { QV_NODE_HEADER(QvNormal); public: // Fields QvMFVec3f vector; // Normal vector(s) }; #endif /* _QV_NORMAL_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvNormalBinding.h0000644000175000017500000000246712310110177021353 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_NORMAL_BINDING_ #define _QV_NORMAL_BINDING_ #include #include class QvNormalBinding : public QvNode { QV_NODE_HEADER(QvNormalBinding); public: enum Binding { DEFAULT, OVERALL, PER_PART, PER_PART_INDEXED, PER_FACE, PER_FACE_INDEXED, PER_VERTEX, PER_VERTEX_INDEXED }; // Fields QvSFEnum value; // Normal binding value }; #endif /* _QV_NORMAL_BINDING_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvOrthographicCamera.h0000644000175000017500000000272512310110177022367 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_ORTHOGRAPHIC_CAMERA_ #define _QV_ORTHOGRAPHIC_CAMERA_ #include #include #include #include class QvOrthographicCamera : public QvNode { QV_NODE_HEADER(QvOrthographicCamera); public: QvSFVec3f position; // Location of viewpoint QvSFRotation orientation; // Orientation (rotation with // respect to (0,0,-1) vector) QvSFFloat focalDistance; // Distance from viewpoint to // point of focus. QvSFFloat height; // Height of view volume }; #endif /* _QV_ORTHOGRAPHIC_CAMERA_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvPList.h0000644000175000017500000000301712310110177017653 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_PLIST_ #define _QV_PLIST_ #include class QvPList { public: QvPList(); ~QvPList(); void append(void * ptr) { if (nPtrs + 1 > ptrsSize) expand(nPtrs + 1); ptrs[nPtrs++] = ptr; } int find(const void *ptr) const; void remove(int which); int getLength() const { return (int) nPtrs; } void truncate(int start) { nPtrs = start; } void *& operator [](int i) const { return ptrs[i]; } private: void ** ptrs; int nPtrs; int ptrsSize; void setSize(int size) { if (size > ptrsSize) expand(size); nPtrs = size; } void expand(int size); }; #endif /* _QV_PLIST_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvPerspectiveCamera.h0000644000175000017500000000277712310110177022236 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_PERSPECTIVE_CAMERA_ #define _QV_PERSPECTIVE_CAMERA_ #include #include #include #include class QvPerspectiveCamera : public QvNode { QV_NODE_HEADER(QvPerspectiveCamera); public: QvSFVec3f position; // Location of viewpoint QvSFRotation orientation; // Orientation (rotation with // respect to (0,0,-1) vector) QvSFFloat focalDistance; // Distance from viewpoint to // point of focus. QvSFFloat heightAngle; // Angle (in radians) of field // of view, in height direction }; #endif /* _QV_PERSPECTIVE_CAMERA_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvPointLight.h0000644000175000017500000000255312310110177020705 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_POINT_LIGHT_ #define _QV_POINT_LIGHT_ #include #include #include #include #include class QvPointLight : public QvNode { QV_NODE_HEADER(QvPointLight); public: // Fields QvSFBool on; // Whether light is on QvSFFloat intensity; // Source intensity (0 to 1) QvSFColor color; // RGB source color QvSFVec3f location; // Source location }; #endif /* _QV_POINT_LIGHT_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvPointSet.h0000644000175000017500000000240512310110177020365 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_POINT_SET_ #define _QV_POINT_SET_ #include #include #define QV_POINT_SET_USE_REST_OF_POINTS (-1) class QvPointSet : public QvNode { QV_NODE_HEADER(QvPointSet); public: // Fields QvSFLong startIndex; // Index of 1st coordinate of shape QvSFLong numPoints; // Number of points to draw }; #endif /* _QV_POINT_SET_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvReadError.h0000644000175000017500000000211712310110177020505 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_READ_ERROR #define _QV_READ_ERROR class QvInput; class QvReadError { public: static void post(const QvInput *in, const char *formatString ...); }; #endif /* _QV_READ_ERROR */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvRotation.h0000644000175000017500000000221412310110177020415 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_ROTATION_ #define _QV_ROTATION_ #include #include class QvRotation : public QvNode { QV_NODE_HEADER(QvRotation); public: // Fields QvSFRotation rotation; // Rotation }; #endif /* _QV_ROTATION_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFBitMask.h0000644000175000017500000000213712310110177020405 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_BIT_MASK_ #define _QV_SF_BIT_MASK_ #include class QvSFBitMask : public QvSFEnum { public: // Inherits value QV_SFIELD_HEADER(QvSFBitMask); }; #endif /* _QV_SF_BIT_MASK_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFBool.h0000644000175000017500000000211312310110177017740 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_BOOL_ #define _QV_SF_BOOL_ #include class QvSFBool : public QvSField { public: QvBool value; QV_SFIELD_HEADER(QvSFBool); }; #endif /* _QV_SF_BOOL_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFColor.h0000644000175000017500000000212212310110177020123 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_COLOR_ #define _QV_SF_COLOR_ #include class QvSFColor : public QvSField { public: float value[3]; QV_SFIELD_HEADER(QvSFColor); }; #endif /* _QV_SF_COLOR_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFEnum.h0000644000175000017500000000406312310110177017757 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_ENUM_ #define _QV_SF_ENUM_ #include #include class QvSFEnum : public QvSField { public: int value; QV_SFIELD_HEADER(QvSFEnum); // Sets up value/name correspondances void setEnums(int num, const int vals[], const QvName names[]) { numEnums = num; enumValues = vals; enumNames = names; } int numEnums; // Number of enumeration values const int *enumValues; // Enumeration values const QvName *enumNames; // Mnemonic names of values // Looks up enum name, returns value. Returns FALSE if not found. QvBool findEnumValue(const QvName &name, int &val) const; }; #define QV_NODE_SET_SF_ENUM_TYPE(fieldName, enumType) \ do { \ int _so_sf_enum_num; \ const int *_so_sf_enum_vals; \ const QvName *_so_sf_enum_names; \ fieldData->getEnumData(QV__QUOTE(enumType), \ _so_sf_enum_num, \ _so_sf_enum_vals, \ _so_sf_enum_names); \ fieldName.setEnums(_so_sf_enum_num, \ _so_sf_enum_vals, \ _so_sf_enum_names); \ } while (0) #endif /* _QV_SF_ENUM_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFFloat.h0000644000175000017500000000211712310110177020116 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_FLOAT_ #define _QV_SF_FLOAT_ #include class QvSFFloat : public QvSField { public: float value; QV_SFIELD_HEADER(QvSFFloat); }; #endif /* _QV_SF_FLOAT_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFImage.h0000644000175000017500000000233112310110177020071 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_IMAGE_ #define _QV_SF_IMAGE_ #include class QvSFImage : public QvSField { public: short size[2]; // Width and height of image int numComponents; // Number of components per pixel unsigned char * bytes; // Array of pixels QV_SFIELD_HEADER(QvSFImage); }; #endif /* _QV_SF_IMAGE_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFLong.h0000644000175000017500000000211112310110177017742 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_LONG_ #define _QV_SF_LONG_ #include class QvSFLong : public QvSField { public: long value; QV_SFIELD_HEADER(QvSFLong); }; #endif /* _QV_SF_LONG_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFMatrix.h0000644000175000017500000000213212310110177020312 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_MATRIX_ #define _QV_SF_MATRIX_ #include class QvSFMatrix : public QvSField { public: float value[4][4]; QV_SFIELD_HEADER(QvSFMatrix); }; #endif /* _QV_SF_MATRIX_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFRotation.h0000644000175000017500000000216112310110177020647 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_ROTATION_ #define _QV_SF_ROTATION_ #include class QvSFRotation : public QvSField { public: float axis[3]; float angle; QV_SFIELD_HEADER(QvSFRotation); }; #endif /* _QV_SF_ROTATION_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFString.h0000644000175000017500000000212712310110177020320 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_STRING_ #define _QV_SF_STRING_ #include class QvSFString : public QvSField { public: QvString value; QV_SFIELD_HEADER(QvSFString); }; #endif /* _QV_SF_STRING_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFVec2f.h0000644000175000017500000000212212310110177020012 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_VEC2F_ #define _QV_SF_VEC2F_ #include class QvSFVec2f : public QvSField { public: float value[2]; QV_SFIELD_HEADER(QvSFVec2f); }; #endif /* _QV_SF_VEC2F_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSFVec3f.h0000644000175000017500000000212212310110177020013 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_VEC3F_ #define _QV_SF_VEC3F_ #include class QvSFVec3f : public QvSField { public: float value[3]; QV_SFIELD_HEADER(QvSFVec3f); }; #endif /* _QV_SF_VEC3F_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvScale.h0000644000175000017500000000221712310110177017650 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SCALE_ #define _QV_SCALE_ #include #include class QvScale : public QvNode { QV_NODE_HEADER(QvScale); public: // Fields QvSFVec3f scaleFactor; // Scale factors in x, y, and z }; #endif /* _QV_SCALE_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSeparator.h0000644000175000017500000000246012310110177020561 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SEPARATOR_ #define _QV_SEPARATOR_ #include #include #include class QvSeparator : public QvGroup { QV_NODE_HEADER(QvSeparator); public: enum CullEnabled { // Possible values for culling OFF, // Never cull ON, // Always cull AUTO // Decide based on some heuristic }; // Fields QvSFEnum renderCulling; }; #endif /* _QV_SEPARATOR_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvShapeHints.h0000644000175000017500000000305312310110177020666 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SHAPE_HINTS_ #define _QV_SHAPE_HINTS_ #include #include #include class QvShapeHints : public QvNode { QV_NODE_HEADER(QvShapeHints); public: enum VertexOrdering { UNKNOWN_ORDERING, CLOCKWISE, COUNTERCLOCKWISE }; enum ShapeType { UNKNOWN_SHAPE_TYPE, SOLID }; enum FaceType { UNKNOWN_FACE_TYPE, CONVEX }; // Fields QvSFEnum vertexOrdering; // Ordering of face vertices QvSFEnum shapeType; // Info about shape geometry QvSFEnum faceType; // Info about face geometry QvSFFloat creaseAngle; // Smallest angle for sharp edge }; #endif /* _QV_SHAPE_HINTS_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSphere.h0000644000175000017500000000220512310110177020044 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SPHERE_ #define _QV_SPHERE_ #include #include class QvSphere : public QvNode { QV_NODE_HEADER(QvSphere); public: // Fields QvSFFloat radius; // Radius of sphere }; #endif /* _QV_SPHERE_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSpotLight.h0000644000175000017500000000326712310110177020544 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SPOT_LIGHT_ #define _QV_SPOT_LIGHT_ #include #include #include #include #include class QvSpotLight : public QvNode { QV_NODE_HEADER(QvSpotLight); public: // Fields: QvSFBool on; // Whether light is on QvSFFloat intensity; // Source intensity (0 to 1) QvSFColor color; // RGB source color QvSFVec3f location; // Source location QvSFVec3f direction; // Primary direction of illumination QvSFFloat dropOffRate; // Rate of intensity drop-off from primary // direction: 0 = constant intensity, // 1 = sharp drop-off QvSFFloat cutOffAngle; // Angle (in radians) outside of which // intensity is zero, measured from // edge of cone to other edge }; #endif /* _QV_SPOT_LIGHT_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvState.h0000644000175000017500000000376112310110177017706 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_STATE_ #define _QV_STATE_ #include class QvState { public: // Stack indices, based on type of elements in them: enum StackIndex { CameraIndex, Coordinate3Index, FontStyleIndex, LightIndex, MaterialBindingIndex, MaterialIndex, NormalBindingIndex, NormalIndex, ShapeHintsIndex, Texture2Index, Texture2TransformationIndex, TextureCoordinate2Index, TransformationIndex, // This has to be last!!! NumStacks }; static const char *stackNames[NumStacks]; // Names of stacks int depth; // Current state depth QvElement **stacks; // Stacks of elements QvState(); ~QvState(); // Adds an element instance to the indexed stack void addElement(StackIndex stackIndex, QvElement *elt); // Returns top element on a stack QvElement * getTopElement(StackIndex stackIndex) { return stacks[stackIndex]; } // Pushes/pops the stacks void push(); void pop(); // Pops top element off one stack void popElement(StackIndex stackIndex); // Prints contents for debugging, mostly void print(); }; #endif /* _QV_STATE_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvString.h0000644000175000017500000001045512310110177020072 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_STRING_ #define _QV_STRING_ #include #include class QvString { public: QvString() { string = staticStorage; string[0] = '\0'; } QvString(const char *str) { string = staticStorage; *this = str; } QvString(const QvString &str) { string = staticStorage; *this = str.string; } ~QvString(); u_long hash() { return QvString::hash(string); } int getLength() const { return strlen(string); } void makeEmpty(QvBool freeOld = TRUE); const char * getString() const { return string; } QvString & operator =(const char *str); QvString & operator =(const QvString &str) { return (*this = str.string); } QvString & operator +=(const char *str); int operator !() const { return (string[0] == '\0'); } friend int operator ==(const QvString &str, const char *s); friend inline int operator ==(const char *s, const QvString &str) { return (str == s); } friend inline int operator ==(const QvString &str1, const QvString &str2) { return (str1 == str2.string); } friend int operator !=(const QvString &str, const char *s); friend inline int operator !=(const char *s, const QvString &str) { return (str != s); } friend inline int operator !=(const QvString &str1, const QvString &str2) { return (str1 != str2.string); } static u_long hash(const char *s); private: char *string; int storageSize; #define QV_STRING_STATIC_STORAGE_SIZE 32 char staticStorage[QV_STRING_STATIC_STORAGE_SIZE]; void expand(int bySize); }; class QvNameEntry { public: QvBool isEmpty() const { return (string[0] == '\0'); } QvBool isEqual(const char *s) const { return (string[0] == s[0] && ! strcmp(string, s)); } private: static int nameTableSize; static QvNameEntry **nameTable; static struct QvNameChunk *chunk; const char *string; u_long hashValue; QvNameEntry *next; static void initClass(); QvNameEntry(const char *s, u_long h, QvNameEntry *n) { string = s; hashValue = h; next = n; } static const QvNameEntry * insert(const char *s); friend class QvName; }; class QvName { public: QvName(); QvName(const char *s) { entry = QvNameEntry::insert(s); } QvName(const QvString &s) { entry = QvNameEntry::insert(s.getString()); } QvName(const QvName &n) { entry = n.entry; } ~QvName() {} const char *getString() const { return entry->string; } int getLength() const { return strlen(entry->string); } static QvBool isIdentStartChar(char c); static QvBool isIdentChar(char c); static QvBool isNodeNameStartChar(char c); static QvBool isNodeNameChar(char c); int operator !() const { return entry->isEmpty(); } friend inline int operator ==(const QvName &n, const char *s) { return n.entry->isEqual(s); } friend inline int operator ==(const char *s, const QvName &n) { return n.entry->isEqual(s); } friend inline int operator ==(const QvName &n1, const QvName &n2) { return n1.entry == n2.entry; } friend inline int operator !=(const QvName &n, const char *s) { return ! n.entry->isEqual(s); } friend inline int operator !=(const char *s, const QvName &n) { return ! n.entry->isEqual(s); } friend inline int operator !=(const QvName &n1, const QvName &n2) { return n1.entry != n2.entry; } private: const QvNameEntry *entry; }; #endif /* _QV_STRING_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSubField.h0000644000175000017500000001354312310110177020322 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SUB_FIELD_ #define _QV_SUB_FIELD_ #include #include #include ///////////////////////////////////////////////////////////////////////////// #define QV_SFIELD_HEADER(className) \ public: \ className(); \ virtual ~className(); \ virtual QvBool readValue(QvInput *in) ///////////////////////////////////////////////////////////////////////////// #define QV_MFIELD_HEADER(className) \ public: \ className(); \ virtual ~className(); \ virtual QvBool read1Value(QvInput *in, int index); \ void allocValues(int newNum); \ protected: \ static QvBool canUseMalloc ///////////////////////////////////////////////////////////////////////////// #define QV_SFIELD_SOURCE(className) \ \ className::className() \ { \ } \ className::~className() \ { \ } ///////////////////////////////////////////////////////////////////////////// // Note: field types whose values require constructors to be called // should pass TRUE for valueHasConstructor. Otherwise, pass FALSE. #ifdef __SUNPRO_CC #define QV_MFIELD_SOURCE(className, valueType, numValues, valueHasConstructor)\ \ QvBool className::canUseMalloc; \ \ className::className() \ { \ canUseMalloc = ! valueHasConstructor; \ values = NULL; \ /* Make room for 1 value to start */ \ allocValues(1); \ } \ \ className::~className() \ { \ if (values != NULL) { \ if (canUseMalloc) \ free((char *) values); \ else \ delete [] values; \ } \ } \ \ void \ className::allocValues(int newNum) \ { \ if (values == NULL) { \ if (newNum > 0) { \ if (canUseMalloc) \ values = (valueType *) \ malloc(numValues * sizeof(valueType) * newNum); \ else \ values = new valueType[numValues * newNum]; \ } \ } \ else { \ if (newNum > 0) { \ if (canUseMalloc) \ values = (valueType *) \ realloc((malloc_t)values, numValues * sizeof(valueType) * newNum); \ else { \ valueType *oldValues = values; \ values = new valueType[numValues * newNum]; \ for (int i = 0; i < num && i < newNum; i++) \ values[i] = oldValues[i]; \ delete [] oldValues; \ } \ } \ else { \ if (canUseMalloc) \ free((char *) values); \ else \ delete [] values; \ values = NULL; \ } \ } \ num = maxNum = newNum; \ } #else #define QV_MFIELD_SOURCE(className, valueType, numValues, valueHasConstructor)\ \ QvBool className::canUseMalloc; \ \ className::className() \ { \ canUseMalloc = ! valueHasConstructor; \ values = NULL; \ /* Make room for 1 value to start */ \ allocValues(1); \ } \ \ className::~className() \ { \ if (values != NULL) { \ if (canUseMalloc) \ free((char *) values); \ else \ delete [] values; \ } \ } \ \ void \ className::allocValues(int newNum) \ { \ if (values == NULL) { \ if (newNum > 0) { \ if (canUseMalloc) \ values = (valueType *) \ malloc(numValues * sizeof(valueType) * newNum); \ else \ values = new valueType[numValues * newNum]; \ } \ } \ else { \ if (newNum > 0) { \ if (canUseMalloc) \ values = (valueType *) \ realloc(values, numValues * sizeof(valueType) * newNum); \ else { \ valueType *oldValues = values; \ values = new valueType[numValues * newNum]; \ for (int i = 0; i < num && i < newNum; i++) \ values[i] = oldValues[i]; \ delete [] oldValues; \ } \ } \ else { \ if (canUseMalloc) \ free((char *) values); \ else \ delete [] values; \ values = NULL; \ } \ } \ num = maxNum = newNum; \ } #endif #endif /* _QV_SUB_FIELD_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSubNode.h0000644000175000017500000000437212310110177020164 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SUB_NODE_ #define _QV_SUB_NODE_ #include #include #define QV_NODE_HEADER(className) \ public: \ className(); \ virtual ~className(); \ virtual void traverse(QvState *state); \ virtual void ToWebOOGL(QvState *state); \ private: \ static QvBool firstInstance; \ static QvFieldData *fieldData; \ virtual QvFieldData *getFieldData() { return fieldData; } #define QV_NODE_SOURCE(className) \ QvFieldData *className::fieldData; \ QvBool className::firstInstance = TRUE; #define QV_NODE_CONSTRUCTOR(className) \ if (fieldData == NULL) \ fieldData = new QvFieldData; \ else \ firstInstance = FALSE; \ isBuiltIn = FALSE; \ #define QV_NODE_IS_FIRST_INSTANCE() (firstInstance == TRUE) #define QV_NODE_ADD_FIELD(fieldName) \ if (firstInstance) \ fieldData->addField(this, QV__QUOTE(fieldName), &this->fieldName); \ this->fieldName.setContainer(this); #define QV_NODE_DEFINE_ENUM_VALUE(enumType,enumValue) \ if (firstInstance) \ fieldData->addEnumValue(QV__QUOTE(enumType), \ QV__QUOTE(enumValue), enumValue) #endif /* _QV_SUB_NODE_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvSwitch.h0000644000175000017500000000237512310110177020067 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SWITCH_ #define _QV_SWITCH_ #include #include #define QV_SWITCH_NONE (-1) /* Don't traverse any children */ #define QV_SWITCH_ALL (-3) /* Traverse all children */ class QvSwitch : public QvGroup { QV_NODE_HEADER(QvSwitch); public: // Fields QvSFLong whichChild; // Child to traverse }; #endif /* _QV_SWITCH_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvTexture2.h0000644000175000017500000000305012310110177020337 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_TEXTURE_2_ #define _QV_TEXTURE_2_ #include #include #include #include class QvTexture2 : public QvNode { QV_NODE_HEADER(QvTexture2); public: enum Wrap { // Texture wrap type REPEAT, // Repeats texture outside 0-1 // texture coordinate range CLAMP // Clamps texture coordinates // to lie within 0-1 range }; // Fields. QvSFString filename; // file to read texture from QvSFImage image; // The texture QvSFEnum wrapS; QvSFEnum wrapT; virtual QvBool readInstance(QvInput *in); QvBool readImage(); }; #endif /* _QV_TEXTURE_2_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvTexture2Transform.h0000644000175000017500000000256412310110177022244 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_TEXTURE_2_TRANSFORM_ #define _QV_TEXTURE_2_TRANSFORM_ #include #include #include class QvTexture2Transform : public QvNode { QV_NODE_HEADER(QvTexture2Transform); public: // Fields QvSFVec2f translation; // Translation vector QvSFFloat rotation; // Rotation QvSFVec2f scaleFactor; // Scale factors QvSFVec2f center; // Center point for scale and rotate }; #endif /* _QV_TEXTURE_2_TRANSFORM_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvTextureCoordinate2.h0000644000175000017500000000231712310110177022354 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_TEXTURE_COORDINATE_2_ #define _QV_TEXTURE_COORDINATE_2_ #include #include class QvTextureCoordinate2 : public QvNode { QV_NODE_HEADER(QvTextureCoordinate2); public: // Fields QvMFVec2f point; // TextureCoordinate point(s) }; #endif /* _QV_TEXTURE_COORDINATE_2_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvToWebOOGL.h0000644000175000017500000000200612310110177020316 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ extern "C" { #include } int OOGLfile(FILE *); int OOGLhandle(char *); char *OOGLgeturls(int ); int OOGLnumuniq(); geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvTransform.h0000644000175000017500000000262712310110177020601 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_TRANSFORM_ #define _QV_TRANSFORM_ #include #include #include class QvTransform : public QvNode { QV_NODE_HEADER(QvTransform); public: // Fields QvSFVec3f translation; // Translation vector QvSFRotation rotation; // Rotation QvSFVec3f scaleFactor; // Scale factors QvSFRotation scaleOrientation;// Defines rotational space for scale QvSFVec3f center; // Center point for scale and rotate }; #endif /* _QV_TRANSFORM_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvTransformSeparator.h0000644000175000017500000000217012310110177022453 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_TRANSFORM_SEPARATOR_ #define _QV_TRANSFORM_SEPARATOR_ #include class QvTransformSeparator : public QvGroup { QV_NODE_HEADER(QvTransformSeparator); // No fields }; #endif /* _QV_TRANSFORM_SEPARATOR_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvTranslation.h0000644000175000017500000000224312310110177021116 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_TRANSLATION_ #define _QV_TRANSLATION_ #include #include class QvTranslation : public QvNode { QV_NODE_HEADER(QvTranslation); public: // Fields QvSFVec3f translation; // Translation vector }; #endif /* _QV_TRANSLATION_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvUnknownNode.h0000644000175000017500000000227212310110177021067 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_UNKNOWN_NODE_ #define _QV_UNKNOWN_NODE_ #include class QvUnknownNode : public QvGroup { QV_NODE_HEADER(QvUnknownNode); public: const char *className; QvFieldData *instanceFieldData; void setClassName(const char *name); }; #endif /* _QV_UNKNOWN_NODE_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvWWWAnchor.h0000644000175000017500000000260712310110177020443 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_WWW_ANCHOR_ #define _QV_WWW_ANCHOR_ #include #include #include class QvWWWAnchor : public QvGroup { QV_NODE_HEADER(QvWWWAnchor); public: enum Map { // Map types: NONE, // Leave URL name alone POINT // Add object coords to URL name }; // Fields QvSFString name; // URL name QvSFString description; // Useful description of scene QvSFEnum map; // How to map pick to URL name }; #endif /* _QV_WWW_ANCHOR_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvWWWInline.h0000644000175000017500000000244612310110177020450 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_WWW_INLINE_ #define _QV_WWW_INLINE_ #include #include #include #include class QvWWWInline : public QvGroup { QV_NODE_HEADER(QvWWWInline); public: // Fields QvSFString name; // URL name QvSFVec3f bboxSize; // Size of 3D bounding box QvSFVec3f bboxCenter; // Center of 3D bounding box }; #endif /* _QV_WWW_INLINE_ */ geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/Qv.c++0000644000175000017500000000013512310110177017016 00000000000000#include "QvChildList.c++" #include "QvDB.c++" #include "QvInput.c++" #include "QvLists.c++" geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvErrors.c++0000644000175000017500000000006712310110177020217 00000000000000#include "QvDebugError.c++" #include "QvReadError.c++" geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvFields.c++0000644000175000017500000000065512310110177020154 00000000000000#include "QvMFColor.c++" #include "QvMFFloat.c++" #include "QvMFLong.c++" #include "QvMFVec2f.c++" #include "QvMFVec3f.c++" #include "QvSFBitMask.c++" #include "QvSFBool.c++" #include "QvSFColor.c++" #include "QvSFEnum.c++" #include "QvSFFloat.c++" #include "QvSFImage.c++" #include "QvSFLong.c++" #include "QvSFMatrix.c++" #include "QvSFRotation.c++" #include "QvSFString.c++" #include "QvSFVec2f.c++" #include "QvSFVec3f.c++" geomview-1.9.5/src/bin/geomutil/vrml2oogl/lib/QvNodes.c++0000644000175000017500000000202012310110177020002 00000000000000#include "QvAsciiText.c++" #include "QvCone.c++" #include "QvCoordinate3.c++" #include "QvCube.c++" #include "QvCylinder.c++" #include "QvDirectionalLight.c++" #include "QvFontStyle.c++" #include "QvGroup.c++" #include "QvIndexedFaceSet.c++" #include "QvIndexedLineSet.c++" #include "QvInfo.c++" #include "QvLOD.c++" #include "QvMaterial.c++" #include "QvMaterialBinding.c++" #include "QvMatrixTransform.c++" #include "QvNormal.c++" #include "QvNormalBinding.c++" #include "QvOrthographicCamera.c++" #include "QvPerspectiveCamera.c++" #include "QvPointLight.c++" #include "QvPointSet.c++" #include "QvRotation.c++" #include "QvScale.c++" #include "QvSeparator.c++" #include "QvShapeHints.c++" #include "QvSphere.c++" #include "QvSpotLight.c++" #include "QvSwitch.c++" #include "QvTexture2.c++" #include "QvTexture2Transform.c++" #include "QvTextureCoordinate2.c++" #include "QvTransform.c++" #include "QvTransformSeparator.c++" #include "QvTranslation.c++" #include "QvUnknownNode.c++" #include "QvWWWAnchor.c++" #include "QvWWWInline.c++" geomview-1.9.5/src/bin/geomutil/clip/0000755000175000017500000000000012310165604014462 500000000000000geomview-1.9.5/src/bin/geomutil/clip/Makefile.in0000644000175000017500000005763012310165552016464 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = clip$(EXEEXT) subdir = src/bin/geomutil/clip DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am_clip_OBJECTS = clip.$(OBJEXT) clipoogl.$(OBJEXT) clipmain.$(OBJEXT) clip_OBJECTS = $(am_clip_OBJECTS) clip_LDADD = $(LDADD) am__DEPENDENCIES_1 = 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(clip_SOURCES) DIST_SOURCES = $(clip_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) man_MANS = clip.1gv EXTRA_DIST = $(man_MANS) clip_SOURCES = clip.c clipoogl.c clipmain.c Clip.h clip_DEPENDENCIES = $(OOGLLIB) #clip_LDFLAGS = -rpath $(libdir) LDADD = $(OOGLLIB) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/clip/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/clip/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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 \ || test -f $$p1 \ ; 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(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: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clip$(EXEEXT): $(clip_OBJECTS) $(clip_DEPENDENCIES) $(EXTRA_clip_DEPENDENCIES) @rm -f clip$(EXEEXT) $(AM_V_CCLD)$(LINK) $(clip_OBJECTS) $(clip_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clip.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clipmain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clipoogl.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-man 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-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ 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 mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 # 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: geomview-1.9.5/src/bin/geomutil/clip/Makefile.am0000644000175000017500000000035412310110176016432 00000000000000INCLUDES = $(default_includes) man_MANS = clip.1gv EXTRA_DIST = $(man_MANS) bin_PROGRAMS = clip clip_SOURCES = clip.c clipoogl.c clipmain.c Clip.h clip_DEPENDENCIES = $(OOGLLIB) #clip_LDFLAGS = -rpath $(libdir) LDADD = $(OOGLLIB) geomview-1.9.5/src/bin/geomutil/clip/clip.c0000644000175000017500000002424112310110176015472 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Clipping routine. * Adapted from Daeron Meyer's Ginsu. * by Dan Krech and Stuart Levy, Geometry Center, 1994. */ #include "Clip.h" #define EPS 0.00001 vertex *add_vertex(Clip *clip, vertex_list *vtxl, float *aCoord, Color *c) { vertex *head = vtxl->head; vertex *temp = head; head = (vertex *)malloc(sizeof(vertex)); head->coord = (float *)malloc((clip->dim+1)*sizeof(float)); head->next = temp; memcpy(head->coord, aCoord, clip->dim*sizeof(float)); head->c = *c; head->clip = 0; vtxl->head = head; return (head); } int find_unclipped_vertex(polyvtx_list *me,vertex **vertex_set) { pvtx *temp = me->head; pvtx *point; int brk=0; point = me->head; do { brk = vertex_set[point->num]->clip; /* Check polygon vertex list to see */ if (brk) /* if any still remain */ point = point->next; } while (brk && (point != temp)); if ((point == temp) && brk) /* if we found a vertex, return 1 */ return 1; me->head = point; return 0; /* otherwise return 0 */ } float dot(Clip *clip, float *point) { int i; int dim = clip->dim; float sum = clip->surf[dim]; for(i=0;isurf[i]; } return sum; } void pcinterp(Clip *clip, float *result, float *p1, float *p2, Color *cresult, Color *c1, Color *c2, float val1, float val2) { int i; int dim = clip->dim; float t = val1 / (val1 - val2); float unt; float val; /* Don't go too crazy in case of numerical error. */ if(t < 0) t = 0; else if(t > 1) t = 1; unt = 1 - t; for(i=dim; --i >= 0; ) result[i] = p1[i]*unt + p2[i]*t; if(clip->nonlinear) { float eps = EPS * fabs(val1 - val2); int limit = 7; float t1 = 0, t2 = 1, a; for(;;) { val = (*clip->clipfunc)(clip, result) - clip->level; if(fabs(val) < eps || --limit <= 0) break; if(val * val1 < 0) { t2 = t; val2 = val; } else { t1 = t; val1 = val; } a = val1 / (val1 - val2); /*Subdivide interval */ t = (1-a)*t1 + a*t2; /*Transform back to original interval*/ unt = 1-t; for(i=dim; --i >= 0; ) result[i] = p1[i]*unt + p2[i]*t; /* Interpolate point */ } } cresult->r = c1->r*unt + c2->r*t; cresult->g = c1->g*unt + c2->g*t; cresult->b = c1->b*unt + c2->b*t; } int clip_each_vertex(Clip *clip, polyvtx_list *me, vertex_list *vtxl, vertex **vertex_set) { pvtx *temp, *next, *last; float intersect[MAXDIM]; Color c, *c1, *c2; float *p1 = NULL; float *p2 = NULL; vertex *v1, *v2; last = me->head; me->point = me->head; me->point->me = vertex_set[me->point->num]; do { next = me->point->next; next->me = vertex_set[next->num]; v1 = vertex_set[me->point->num]; v2 = vertex_set[next->num]; c1 = &v1->c; /* Color of current vertex */ c2 = &v2->c; /* Color of next vertex */ p1 = v1->coord; p2 = v2->coord; /* Coordinates of next vtx */ /* * Handle first case: * * * o--------o <---- next vertex * / / * / / side to clip * ------------------------------- <------- clipping plane * / / * / / * o-----------o <--- current vertex */ if (!v1->clip && v2->clip) { /* Calculate where line between the two points cuts clipping surface */ pcinterp(clip, intersect, p1, p2, &c,c1,c2, v1->val, v2->val); temp = (pvtx *)malloc(sizeof(pvtx)); /* Add vertex at intersection */ temp->me = add_vertex(clip, vtxl, intersect, &c); me->numvtx++; /* point to the polygon's */ temp->next = next; /* vertex list. */ me->point->next = temp; last = temp; me->point = next; next = me->point->next; } else /* * Handle second case: * * * next vertex -> o--------o <---- current vertex * / / * / / side to clip * / / * -------------------o----------------- <------- clipping plane * / / * / / * o------------o */ if (v1->clip && v2->clip) { last->next = next; /* simply delete the current */ free(me->point); me->point = NULL; me->numvtx--; me->point = next; next = me->point->next; } else /* * Handle third case: * * * o--------o <- current vertex * / / * / / side to clip * / / * ------------------------------------- <------- clipping plane * / / * / / * o------------o <- next vertex */ if (v1->clip && !v2->clip) { pcinterp(clip, intersect, p1, p2, &c, c1, c2, v1->val, v2->val); temp = (pvtx *)malloc(sizeof(pvtx)); /* Add vertex at the */ temp->me = add_vertex(clip, vtxl, intersect, &c); temp->next = next; /* intersection point to the */ last->next = temp; /* polygon's vertex list */ free(me->point); me->point = NULL; last = temp; /* from the list. */ me->point = next; next = me->point->next; } /* fourth case: */ else /* Both vertices unclipped. */ { /* Therefore, do nothing. */ last = me->point; me->point = next; next = me->point->next; } } while (me->point != me->head); /* Do this 'til we have */ /* checked all vertices in */ /* the circular linked list. */ return me->numvtx; } void clip_init(Clip *clip) { clip->polyhedron.numpoly = 0; clip->polyhedron.head = NULL; clip->polyhedron.has = 0; clip->polyvertex.numvtx = 0; clip->polyvertex.head = NULL; clip->side = CLIP_LE; clip->level = 0.0; clip->clipfunc = dot; } void clip_destroy(Clip *clip) { #ifdef notyet poly *po, *nextpo; vertex *v, *nextv; for(po = clip->polyhedron.head; po != NULL; po = nextpo) { nextpo = po->next; free(po); } for(v = clip->polyvertex.head; v != NULL; v = nextv) { nextv = v->next; free(v); } #endif clip->polyhedron.numpoly = 0; clip->polyhedron.head = NULL; clip->polyhedron.has = 0; clip->polyvertex.numvtx = 0; clip->polyvertex.head = NULL; } void setClipPlane(Clip *clip, float *coeff, float level) { memcpy(clip->surf, coeff, MAXDIM * sizeof(float)); clip->level = level; } void setSide(Clip *clip, int side) { clip->side = side; } void clip_vertices(Clip *clip) { vertex *point; for(point = clip->polyvertex.head; point != NULL; point = point->next) { point->val = (*clip->clipfunc)(clip, point->coord) - clip->level; point->clip = (clip->side == CLIP_LE) ? (point->val > -EPS) : (point->val < EPS); } } /* Find the range of function values over all vertices */ int span_vertices(Clip *clip, float *minp, float *maxp) { vertex *point; float min, max, val; *minp = *maxp = 0; point = clip->polyvertex.head; if(point == NULL) return 0; min = max = (*clip->clipfunc)(clip, point->coord); for(point = clip->polyvertex.head; point != NULL; point = point->next) { val = (*clip->clipfunc)(clip, point->coord); if(clip->side != CLIP_LE) val = -val; if(min > val) min = val; else if(max < val) max = val; } *minp = min; *maxp = max; return 1; } void clip_polygons(Clip *clip, vertex_list *vtxl) { poly *point; vertex **vertex_set; vertex_set = (vertex **)malloc(vtxl->numvtx * sizeof(vertex)); { int count = 0; vertex *vert; vert = vtxl->head; while(vert!=NULL) { vertex_set[count] = vert; vert = vert->next; count++; } } point = clip->polyhedron.head; clip->polyhedron.point = point; while (point!=NULL) { point->clipped = find_unclipped_vertex(point->me, vertex_set); if(!point->clipped) { point->numvtx = clip_each_vertex(clip, point->me, vtxl, vertex_set); } point = point->next; /* the list. */ } clip->polyhedron.point = point; } void refresh_vertex_list(Clip *clip, vertex_list *vtxl) { int count = 0; vtxl->point = vtxl->head; while (vtxl->point != NULL) { if (!vtxl->point->clip) { vtxl->point->num = count; /* Count number of vertices remaining */ count++; /* after clip and give each vertex a */ } /* new reference number. */ vtxl->point = vtxl->point->next; } vtxl->numvtx = count; } void refresh_poly_list(Clip *clip, poly_list *pl) { int count = 0; poly *point; point = pl->head; while (point != NULL) { if (!point->clipped) /* Count number of polygons remaining */ count++; /* after clip. */ point=point->next; } pl->numpoly = count; } void do_clip(Clip *clip) { if(clip->polyvertex.numvtx!=0) { clip_vertices(clip); /* mark appropriate vertices as clipped */ clip_polygons(clip, &clip->polyvertex); /* modify or remove clipped polygons */ refresh_vertex_list(clip, &clip->polyvertex); /* rearrange pointers into vertex list */ refresh_poly_list(clip, &clip->polyhedron); /* rearrange points into polygon list */ } } geomview-1.9.5/src/bin/geomutil/clip/clipoogl.c0000644000175000017500000001676712310110176016371 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * OOGL PolyList and NPolyList wrappers for clipping routine. * Adapted from Daeron Meyer's Ginsu * by Dan Krech and Stuart Levy, Geometry Center, 1994. */ #include "polylistP.h" #include "npolylistP.h" #include "Clip.h" void readVerts(Clip *clip, vertex_list *pv, Geom *g, int isnd) { int i; vertex *point = (vertex *)malloc(pv->numvtx * sizeof(vertex)); ColorA *colors; int colored = clip->polyhedron.has & HAS_VC; memset(point, 0, pv->numvtx * sizeof(vertex)); pv->head = point; #define pl ((PolyList *)g) #define npl ((NPolyList *)g) for(i = 0; i < pv->numvtx; i++, point++) { point->next = point+1; if (isnd) { point->coord = &npl->v[i*(clip->dim+1)]; colors = &npl->vcol[i]; } else { point->coord = &pl->vl[i].pt.x; colors = &pl->vl[i].vcol; } if (colored) { point->c = *(Color *)colors; } } point--; point->next = NULL; pv->point = point; #undef pl #undef npl } void readNDPoly(poly *p, NPolyList *pl, int polyNum) { int i; pvtx *corner = NULL; polyvtx_list *pv = (polyvtx_list *)malloc(sizeof(polyvtx_list)); pvtx **prevp = &pv->head; Poly *np = &pl->p[polyNum]; p->me = pv; pv->numvtx = np->n_vertices; for(i = 0; i < np->n_vertices; i++) { corner = (pvtx *)malloc(sizeof(pvtx)); corner->num = pl->vi[i + pl->pv[i]]; *prevp = corner; prevp = &corner->next; } *prevp = pv->head; pv->point = corner; p->c.r = np->pcol.r; p->c.g = np->pcol.g; p->c.b = np->pcol.b; } void readPolyvtx(polyvtx_list *pv, int numvx, PolyList *pl, int polyNum) { int i; pvtx **prevp = &pv->head; pvtx *point = NULL; Poly *p = &pl->p[polyNum]; pv->numvtx = numvx; for (i = 0; i < pv->numvtx; i++) { point = (pvtx *)malloc(sizeof(pvtx)); point->num = (p->v[i] - pl->vl); *prevp = point; prevp = &point->next; } *prevp = pv->head; pv->point = point; return; } void readPoly(poly *p, PolyList *pl, int polyNum) { p->numvtx = pl->p[polyNum].n_vertices; p->me = (polyvtx_list *)malloc(sizeof(polyvtx_list)); readPolyvtx(p->me, p->numvtx, pl, polyNum); /* read each vertex ref number. */ p->c.r = pl->p[polyNum].pcol.r; p->c.g = pl->p[polyNum].pcol.g; p->c.b = pl->p[polyNum].pcol.b; } void readPolys(Clip *clip, poly_list *ph, Geom *g, int isnd) { int i; poly *point; #define pl ((PolyList *)g) #define npl ((NPolyList *)g) ph->numpoly = isnd ? npl->n_polys : pl->n_polys; point = (poly *)malloc(ph->numpoly * sizeof(poly)); ph->head = point; for(i = 0; i < ph->numpoly; i++, point++) { point->next = point+1; if (isnd) readNDPoly(point, npl, i); else readPoly(point, pl, i); } point--; point->next = NULL; ph->point = point; #undef pl #undef npl return; } void setGeom(struct clip *clip, void *aGeom) { char *classname; int isnd; clip_destroy(clip); if (aGeom==NULL) { return; /* clip_destroy() already created null object */ } classname = GeomName(aGeom); clip->polyhedron.has = 0; if (strcmp(classname, "polylist") == 0) { PolyList *pl = (PolyList *)aGeom; if (pl->geomflags & PL_HASVCOL) clip->polyhedron.has = HAS_VC; if (pl->geomflags & PL_HASPCOL) clip->polyhedron.has |= HAS_PC; isnd = 0; clip->dim = pl->geomflags & VERT_4D ? 4 : 3; clip->polyvertex.numvtx = pl->n_verts; isnd = 0; } else if (strcmp(classname, "npolylist") == 0) { NPolyList *npl = (NPolyList *)aGeom; clip->dim = npl->pdim-1; if (clip->dim >= MAXDIM-1) { fprintf(stderr, "clip: can't handle objects of dimension %d\n\ (change MAXDIM, now %d, and recompile)\n", clip->dim, MAXDIM); exit(1); } if (npl->geomflags & PL_HASVCOL) clip->polyhedron.has = HAS_VC; if (npl->geomflags & PL_HASPCOL) clip->polyhedron.has |= HAS_PC; isnd = 1; clip->polyvertex.numvtx = npl->n_verts; isnd = 1; } else { fprintf(stderr, "clip: can't handle object of type '%s'\n", classname); exit(1); } readVerts(clip, &clip->polyvertex, aGeom, isnd); readPolys(clip, &clip->polyhedron, aGeom, isnd); } void *getGeom(Clip *clip) { int i = 0, j = 0; float *points, *ptp; ColorA *colors = NULL, *ctp; ColorA *poly_color = NULL; int *vertex_counts; int *vertex_indices; vertex *vert; poly *point; int total = 0; Geom *aGeom=NULL; int dim = clip->dim; int hdim = (dim == 3 || dim == 4) ? 4 : dim+1; int has = clip->polyhedron.has; if (clip->polyvertex.numvtx==0) { return NULL; } point = clip->polyhedron.head; while (point != NULL) { /* For each polygon: */ if (!point->clipped) { /* if it still exists */ total += point->me->numvtx; } point = point->next; } points = (float *)malloc(hdim*clip->polyvertex.numvtx*sizeof(*points)); vertex_counts = (int *)malloc(clip->polyhedron.numpoly*sizeof(int)); if (has & HAS_PC) poly_color = (ColorA *)malloc(clip->polyhedron.numpoly*sizeof(ColorA)); vertex_indices = (int *)malloc(total*sizeof(int)); if (has & HAS_VC) colors = (ColorA *)malloc(clip->polyvertex.numvtx*sizeof(ColorA)); ptp = points; ctp = colors; for(vert=clip->polyvertex.head; vert != NULL; vert = vert->next) { if (!vert->clip) { memcpy(ptp, vert->coord, dim*sizeof(float)); ptp += dim; if (hdim > dim) *ptp++ = 1.; if (has & HAS_VC) { *(Color *)ctp = vert->c; ctp->a = 1; ctp++; } } } point = clip->polyhedron.head; i = 0; j = 0; ctp = poly_color; while (point != NULL) /* For each polygon: */ { if (!point->clipped) /* if it still exists */ { pvtx *temp; pvtx *pnt; temp = point->me->head; pnt = point->me->head; vertex_counts[i] = point->me->numvtx; if (has & HAS_PC) { *(Color *)ctp = point->c; ctp->a = 1; ctp++; } i++; do { vertex_indices[j] = pnt->me->num; j++; /* Write out each vertex reference number. */ pnt = pnt->next; } while (pnt != temp); } point = point->next; } if (dim == 3 || dim == 4) { aGeom = GeomCreate("polylist", CR_NPOLY, clip->polyhedron.numpoly, CR_POINT4, points, CR_NVERT, vertex_counts, CR_VERT, vertex_indices, CR_END); } else { aGeom = GeomCreate("npolylist", CR_DIM, dim, CR_NPOLY, clip->polyhedron.numpoly, CR_POINT4, points, CR_NVERT, vertex_counts, CR_VERT, vertex_indices, CR_END); } if (has & HAS_PC) GeomSet(aGeom, CR_POLYCOLOR, poly_color, CR_END); if (has & HAS_VC) GeomSet(aGeom, CR_COLOR, colors, CR_END); free(points); free(vertex_counts); free(vertex_indices); if (colors) free(colors); if (poly_color) free(poly_color); return aGeom; } geomview-1.9.5/src/bin/geomutil/clip/clipmain.c0000644000175000017500000002502712310110176016342 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "list.h" #include "plutil.h" #include "Clip.h" /* Note: must include this *after* oogl includes */ Clip clip; extern int span_vertices(Clip *clip, float *minp, float *maxp); static char Usage[] = "\ Usage: clip [-v axisx,y,z,...] [-g value] [-l value] [-s nslices[,fraction]]\n\ [-sph centerx,y,z,...] [-cyl centerx,y,z,...] [-e] [file.oogl]\n\ Reads an OOGL object from file.oogl (or stdin if omitted).\n\ Slices it against a (series of) planes whose normal vectors are given\n\ by the -v argument (default 1,0,0,0,...).\n\ Given -g, selects portions where dot > .\n\ Given -l, selects portions where dot < .\n\ Given both, takes the portion lying between those two values.\n\ With -s, emits a series of slices spaced units apart.\n\ With -e, emits just two numbers instead of geometry: range of function-values\n\ which the object spans.\n\ -sph : Slice against a sphere, not a plane. -g/-l gives radius.\n\ -cyl x,y,z... : Slice against a cylinder whose axis passes through x,y,z...\n\ -v gives axis direction, -g/-l radius.\n"; static int parsevector(char *str, float data[], int maxdata) { int i; char *p, *op; memset(data, 0, maxdata*sizeof(float)); if(str == NULL) return -1; for(i = 0, p = str; i < maxdata && *p; i++) { op = p; data[i] = strtod(p, &p); if(p == op) break; while(*p == ',' || *p == ' ') p++; } return i; } void setclipat(Clip *clip, char *pstr, int dim, float *surf, void (*prepfunc)()) { float point[MAXDIM]; float level; int n; n = parsevector(pstr, point, dim); if(n > 1) { /* Given several numbers, consider them * to be a point; choose a level-set * going through that point. */ setClipPlane(clip, surf, 0); level = (*clip->clipfunc)(clip, point); } else { level = point[0]; /* If just one number, use exactly it */ } setClipPlane(clip, surf, level); if(prepfunc) (*prepfunc)(clip); } /* * Clipping functions. * The default function, to clip against a plane, is in clip.c. */ static float origin[MAXDIM]; /* * Clip against a sphere. * Uses static variable "origin". */ static float sphere(Clip *clip, float *point) { /* clip->surf[0..dim-1] are the coordinates of the center of the sphere. */ int i; float r2 = 0, *s, *p; for(i = clip->dim, p = point, s = origin; --i >= 0; p++, s++) r2 += (*p - *s) * (*p - *s); return r2; } /* * Clip against a cylinder. * Uses both clip->surf, the cylinder's axis vector, * and static variable "origin", a point on the cylinder. */ static float cylinder(Clip *clip, float *point) { /* clip->surf[0..dim-1] are the direction vector of the cylinder's axis; * clip->surf[dim..2*dim-1] are coordinates of a point on the axis. */ int dim = clip->dim; int i; float r2 = 0, dot = 0, dx, *s, *p, *c; for(i=dim, p=point, c=origin, s=clip->surf; --i >= 0; p++, s++, c++) dot += (*p - *c) * *s; for(i=dim, p=point, c=origin, s=clip->surf; --i >= 0; p++, s++, c++) { dx = (*p - *c) - dot * *s; r2 += dx * dx; } return r2; } /* Special case for Mark Levi */ float leviarctan(Clip *clip, float *point) { /* On input, point[0] .. point[2] are x,y,z coordinates of the point to test. * Assigning w <- point[1] and T <- point[2] * we compute x(w,T) on the surface * x = constant - 2T +/- arctan(w) * and return the difference between x(w,t) and our point's x. * * The sign of arctan is taken from clip->surf[0]; this is * the number given to the "-v" command-line argument. So, using * "-a -v 1,21.99" means x(w,T) = 7pi - 2T - arctan(w), and * "-a -v -1,21.99" means x(w,T) = 7pi - 2T + arctan(w). */ return clip->surf[1] - 2*point[2] - clip->surf[0] * atan(point[1]) - point[0]; } /* * For some level-set functions we'd rather precompute the square of the * given value. They set prepfunc = squared. */ static void squared(Clip *clip) { clip->level *= clip->level; } /* For the cylinder, we want to make the axis be a unit vector, * so we can easily project it out. Want to square the level value, too. */ static void squared_normalized(Clip *clip) { int dim = clip->dim; int i; float len = 0, *p; for(i = dim, p = clip->surf; --i >= 0; p++) len += *p * *p; len = sqrt(len); if(len > 0) { for(i = dim, p = clip->surf; --i >= 0; p++) *p /= len; } /* And square the radius */ clip->level *= clip->level; } int main(int argc, char *argv[]) { Geom *g, *clipped; float surf[MAXDIM]; float (*func)() = NULL; void (*prepfunc)() = NULL; char *lestr = NULL, *gestr = NULL; char *type; int slices = 0; int nonlinear = 0; int extent = 0; float slicev[2]; IOBFILE *inf = iobfileopen(stdin); if(argc <= 1) { fputs(Usage, stderr); exit(1); } clip_init(&clip); memset(surf, 0, sizeof(surf)); surf[0] = 1; while(argc > 1) { if(strncmp(argv[1], "-g", 2) == 0 && argc>2) { if(gestr != NULL) { fprintf(stderr, "clip: can only specify one -g option.\n"); exit(1); } gestr = argv[2]; argc -= 2, argv += 2; } else if(strncmp(argv[1], "-l", 2) == 0 && argc>2) { if(lestr != NULL) { fprintf(stderr, "clip: can only specify one -l option.\n"); exit(1); } lestr = argv[2]; argc -= 2, argv += 2; } else if(strcmp(argv[1], "-v") == 0 && argc > 2) { if(parsevector(argv[2], surf, MAXDIM) <= 0) { fprintf(stderr, "-v: expected x,y,z,... surface parameters\n\ (plane normal or cylinder axis)\n"); exit(1); } argc -= 2, argv += 2; } else if(strcmp(argv[1], "-e") == 0) { extent = 1; argc--, argv++; } else if(strcmp(argv[1], "-a") == 0) { func = leviarctan; nonlinear = 1; argc--, argv++; } else if(strncmp(argv[1], "-sph", 4) == 0) { func = sphere; prepfunc = squared; nonlinear = 1; if(parsevector(argv[2], origin, COUNT(origin)) <= 0) { fprintf(stderr, "clip -sph: expected x,y,z,... of sphere's center.\n"); exit(1); } argc -= 2, argv += 2; } else if(strncmp(argv[1], "-cyl", 4) == 0) { func = cylinder; prepfunc = squared_normalized; nonlinear = 1; if(parsevector(argv[2], origin, COUNT(origin)) <= 0) { fprintf(stderr, "clip -cyl: expected x,y,z,... of a point on the cylinder's axis\n"); exit(1); } argc -= 2, argv += 2; } else if(strcmp(argv[1], "-s") == 0) { slices = parsevector(argv[2], slicev, 2); if(slices <= 0 || slicev[0] <= 1) { fprintf(stderr, "clip -s: expected -s nribbons or nribbons,gap-fraction; must have >= 2 ribbons\n"); exit(1); } else if(slices == 1) slicev[1] = .5; argc -= 2, argv += 2; } else if(argv[1][0] == '-') { fprintf(stderr, "Unknown option '%s'. Run 'clip' with no arguments for help.\n", argv[1]); exit(1); } else { break; } } if(lestr == NULL && gestr == NULL && slices == 0 && extent == 0) { fprintf(stderr, "clip: must specify at least one of -l or -g or -s or -e options.\n"); exit(2); } if(argc > 2) { fprintf(stderr, "clip: can only handle one object\n"); exit(2); } if(argc > 1 && strcmp(argv[1], "-") != 0) { g = GeomLoad(argv[1]); } else { argv[1] = "standard input"; g = GeomFLoad(inf, "stdin"); } type = GeomName(g); if(type!=NULL && strcmp(type, "polylist") && strcmp(type, "npolylist")) { Geom *newg = AnyToPL(g, TM3_IDENTITY); GeomDelete(g); g = newg; } if(g == NULL) { fprintf(stderr, "clip: Error loading OOGL object from %s\n", argv[1]); exit(1); } if(func != NULL) clip.clipfunc = func; clip.nonlinear = nonlinear; if(lestr != NULL) { setGeom(&clip, g); setclipat(&clip, lestr, clip.dim, surf, prepfunc); setSide(&clip, CLIP_LE); do_clip(&clip); clipped = getGeom(&clip); GeomDelete(g); g = clipped; } if(gestr != NULL) { setGeom(&clip, g); setclipat(&clip, gestr, clip.dim, surf, prepfunc); setSide(&clip, CLIP_GE); do_clip(&clip); clipped = getGeom(&clip); GeomDelete(g); g = clipped; } if(slices > 0) { float min, max, v, step; int i; Geom *piece, *whole = NULL; char lim[64]; setGeom(&clip, g); setclipat(&clip, "0", clip.dim, surf, prepfunc); if(span_vertices(&clip, &min, &max) != 0) { /* Nonempty */ /* Interpolate linearly in real space -- invert prepfunc */ if(prepfunc == squared || prepfunc == squared_normalized) { min = sqrt(min); max = sqrt(max); } step = (max - min) / (slicev[0] + slicev[1] - 1); sprintf(lim, "%g", min + slicev[1]*step); setclipat(&clip, lim, clip.dim, surf, prepfunc); setSide(&clip, CLIP_LE); do_clip(&clip); whole = GeomCreate("list", CR_GEOM, getGeom(&clip), CR_END); for(i = 1, v = min + step; i < slicev[0]; i++, v += step) { setGeom(&clip, g); sprintf(lim, "%g", v + slicev[1]*step); setclipat(&clip, lim, clip.dim, surf, prepfunc); setSide(&clip, CLIP_LE); do_clip(&clip); piece = getGeom(&clip); setGeom(&clip, piece); sprintf(lim, "%g", v); setclipat(&clip, lim, clip.dim, surf, prepfunc); setSide(&clip, CLIP_GE); do_clip(&clip); piece = getGeom(&clip); if(piece) whole = ListAppend(whole, piece); } } g = whole; } if(extent != 0) { float min, max; setGeom(&clip, g); setclipat(&clip, "0", clip.dim, surf, prepfunc); if(span_vertices(&clip, &min, &max) != 0) { if(prepfunc == squared || prepfunc == squared_normalized) { min = sqrt(min); max = sqrt(max); } } printf("%g %g\n", min, max); } else { GeomFSave(g, stdout, "stdout"); } exit(0); } geomview-1.9.5/src/bin/geomutil/clip/Clip.h0000644000175000017500000001065112310110176015437 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #include #include #include #include #include #define MAXDIM 20 /* Max allowed dimension */ #ifndef COLORDEFS typedef struct Color { float r,g,b; } Color; #endif typedef struct _vertex /* A single vertex */ { struct _vertex *next; /* Pointer to next vertex */ float *coord; /* My coordinates for ND case. */ Color c; /* Vertex color if any */ int clip; /* Have I been clipped or not? */ float val; /* Function value at this vertex */ int num; /* Reference number of vertex in array */ } vertex; typedef struct _vertex_list /* Global list of shared vertices */ { int numvtx; /* Number of vertices */ /* private */ vertex *head; /* pointer to head of list */ vertex *point; /* pointer used while traversing list */ } vertex_list; typedef struct _pvtx /* vertex holder for vertex list */ /* of each polygon */ { int num; /* reference number of vertex in array */ struct _vertex *me; /* Pointer to actual (shared) vertex. */ struct _pvtx *next; /* Pointer to next pvtx in polyvtx_list */ } pvtx; typedef struct _polyvtx_list /* vertex list for each polygon */ { int numvtx; /* number of vertices in polygon */ pvtx *head; /* head of polygon vertex list */ pvtx *point; /* pointer used while traversing list */ } polyvtx_list; typedef struct _poly /* A polygon */ { int numvtx; /* Number of vertices */ int clipped; /* has the whole polygon been cut away? */ /* 1 if it has been cut away, 0 if some */ /* or all of the polygon remains */ polyvtx_list *me; /* Vertex list of polygon */ Color c; /* Color of this polygon if doing per */ /* face coloring. */ struct _poly *next; /* Next polygon in list of polys. */ } poly; typedef struct _poly_list /* List of polygons */ { int numpoly; /* number of polygons */ #define HAS_VN 0x1 #define HAS_VC 0x4 #define HAS_PC 0x8 int has; /* bit mask of associated data */ poly *head; /* head of list of polys */ poly *point; /* pointer for traversing list */ } poly_list; #define NEWLINE '\n' #define SPACE ' ' typedef struct clip { poly_list polyhedron; vertex_list polyvertex; int side; /* side to cut... 0 -- less than 1 -- greater than */ int dim; /* Are we working in N Dimensions. */ float surf[MAXDIM]; /* Surface parameters. */ /* For a plane, the plane normal vector */ /* (or, other parameters for non-planar clip) */ float (*clipfunc)(); /* Clipping function, whose value is zero * along the surface where we should clip. */ int nonlinear; /* Is clipfunc an affine function of position?*/ float level; /* Value of clipfunc at clipping surface */ } Clip; /* * Typical usage: * Have a "Clip" variable; * clip_init(&clip); * setGeom(&clip, oogl-geometry-object); * setSide(&clip, CLIP_xx); * // Possibly change clip.clipfunc; clip_init sets planar clipping. * setClipPlane(&clip, coeffs[], threshold); * do_clip(&clip); * g = getGeom(&clip); * // Must call setGeom() before another do_clip; the internal data * // structures can't handle successive clips against the same object. * // Could simply setGeom(&clip, g) if that's intended. * clip_destroy(&clip); */ void setClipPlane(Clip *, float coeffs[], float level); enum clip_side { CLIP_LE, CLIP_GE }; void setSide(Clip *, int side); /* 0->negative, 1->positive side */ void setGeom(Clip *, void *g); void *getGeom(Clip *); void clip_init(Clip *); void clip_destroy(Clip *); void do_clip(Clip *); geomview-1.9.5/src/bin/geomutil/clip/clip.1gv0000644000175000017500000001113112310110176015737 00000000000000.TH CLIP 1gv "23 November 1994" "Geometry Center" .SH NAME clip \- Clip an OOGL object against planes or other surfaces .SH SYNOPSIS \fBclip\fP [\fB\-v\fP \fIaxisx,y,z,...\fP] .br [\fB\-g\fP \fIvalue-or-point\fP] [\fB\-l\fP \fIvalue-or-point\fP] .br [\fB\-s\fP \fInstrips\fP[,\fIfraction\fP]] [\fB\-e\fP] .br [\fB-sph\fP \fIcenterx,y,z,...\fP] [\fB\-cyl\fP \fIcenterx,y,z,...\fP] .br [\fIooglfile\fP] .SH DESCRIPTION \fBClip\fP, adapted from Daeron Meyer's \fBginsu\fP module, allows clipping an OOGL object against planes, spheres, or cylinders from the UNIX command line. Its input can come from a file or standard input; output is written to standard output. .LP Options specify a function of space position; the output is the portion of the object where the function is greater or less than some given value, or the portion lying between two values. Alternatively, an object can be sliced into equally-spaced strips. Objects may be of any dimension (but see the BUGS section). .LP Options are: .IP "\fB\-g\fP \fIvalue-or-point\fP" .IP "\fB\-l\fP \fIvalue-or-point\fP" Select the portion of the object where the function is greater than (\fB\-g\fP) or less than (\fB\-l\fP) the given value. If both are specified, the result is the portion of the object satisfying both conditions. If, rather than a single number, the argument to \fB\-l\fP or \fB\-g\fP is a point (a series of x,y,z,... values separated by commas, with no embedded blanks), then the clipping surface is one chosen to pass through that point. .IP "\fB\-v\fP \fIaxisx,y,z,...\fP" Specifies a direction in space. For planar clipping (the default), it's the plane normal direction; the clipping function is the inner product between the direction vector and the point on the object. For cylindrical clipping, \fB\-v\fP specifies the direction of the cylinder's axis; the clipping function is the distance from the axis. .IP "\fB\-sph\fP \fIcenterx,y,z,...\fP" Clip against spheres centered on \fIx,y,z,...\fP. The clipping function is the distance from the given center. Coordinates must be separated by commas without intervening spaces. .IP "\fB\-cyl\fP \fIcenterx,y,z,...\fP" Clip against cylinders with an axis passing through \fIcenterx,y,z,...\fP, with axis direction given by the \fB\-v\fP option. The clipping function is the distance from the axis. .IP "\fB\-s\fP \fInslices\fP[,\fIfraction\fP]" Clip an object into a series of \fInslices\fP ribbons spanning its entire extent -- the range of function-values over the object. Part of each ribbon is omitted; the \fIfraction\fP, default .5, sets the width of the visible part of a ribbon compared to the ribbon period. There are a total of (\fInslices\fP+\fIfraction\fP-1) ribbon periods across the object, so e.g. \fB\-s\ 2,.5\fP slices the object into equal thirds, omitting the middle third. The output OOGL object is a LIST of OFFs, one per ribbon. .IP "\fB\-e\fP" Don't emit a clipped OOGL object, just print two numbers, listing the minimum and maximum function values for the object. If \fB\-g\fP or \fB\-l\fP clipping options are specified, the object is clipped before determining the function range. If none of the object remains, \fBclip\fP prints "0 0". .SH "EXAMPLES" To extract the portion of an object lying below the x+y+z=1 plane: clip -l 1 -v 1,1,1 file.oogl > portion.oogl To extract the portion of an object lying in the positive octant and below the x+y+z=1 plane, we can pipe multiple instances of \fBclip\fP together to find the intersection of several half-spaces: clip -g 0 -v 1,0,0 file.oogl | \\ clip -g 0 -v 0,1,0 | \\ clip -g 0 -v 0,0,1 | \\ clip -l 1 -v 1,1,1 > portion.oogl To find the region lying between two surfaces (either above one and below the other, or below the first and above the second), say the planes 2x + y -.5z = 1 and y + 2z = 0: echo "{ LIST" clip -v 2,1,-.5 -g 1 file.oogl | clip -v 0,1,2 -l 0 clip -v 2,1,-.5 -l 1 file.oogl | clip -v 0,1,2 -g 0 echo "}" We use pipelines to compute intersections, and a LIST to form their union. .SH "SEE ALSO" ginsu(1) .SH BUGS Uses anytooff(1) to convert input data to OFF format internally; this can lose information. The only arbitrary-dimensional form accepted at present is nOFF, not nSKEL or nMESH. However the four-dimensional 4OFF, 4QUAD, 4MESH, 4VECT, etc. formats should work. .LP \fBClip\fP really only clips edges. If a curved clipping surface cuts an edge twice, or removes only an interior portion of some polygon, \fBclip\fP misses it entirely. Clipping against a curved surface yields a straight edge (a chord of the ideal curved edge segment). This latter failing might be fixed someday. geomview-1.9.5/src/bin/geomutil/math2oogl/0000755000175000017500000000000012310165604015427 500000000000000geomview-1.9.5/src/bin/geomutil/math2oogl/Makefile.in0000644000175000017500000006350212310165552017424 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = math2oogl$(EXEEXT) subdir = src/bin/geomutil/math2oogl DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(docdir)" "$(DESTDIR)$(mathematicadir)" PROGRAMS = $(bin_PROGRAMS) am_math2oogl_OBJECTS = math2oogl.$(OBJEXT) math2oogl_OBJECTS = $(am_math2oogl_OBJECTS) math2oogl_LDADD = $(LDADD) am__DEPENDENCIES_1 = math2oogl_DEPENDENCIES = $(am__DEPENDENCIES_1) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(math2oogl_SOURCES) DIST_SOURCES = $(math2oogl_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) DATA = $(doc_DATA) $(mathematica_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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = @default_includes@ man_MANS = math2oogl.1gv math2oogl_SOURCES = math2oogl.c LDADD = $(SOCKETLIBS) EXTRA_DIST = BezierPlot.m OOGL.m Geomview.m OOGL.m.txt $(man_MANS) mathematicadir = $(pkgdatadir)/Mathematica mathematica_DATA = BezierPlot.m OOGL.m Geomview.m OOGL.m.txt doc_DATA = OOGL.m.txt all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/math2oogl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/math2oogl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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 \ || test -f $$p1 \ ; 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(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: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list math2oogl$(EXEEXT): $(math2oogl_OBJECTS) $(math2oogl_DEPENDENCIES) $(EXTRA_math2oogl_DEPENDENCIES) @rm -f math2oogl$(EXEEXT) $(AM_V_CCLD)$(LINK) $(math2oogl_OBJECTS) $(math2oogl_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/math2oogl.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-docDATA: $(doc_DATA) @$(NORMAL_INSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || 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)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-docDATA: @$(NORMAL_UNINSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) install-mathematicaDATA: $(mathematica_DATA) @$(NORMAL_INSTALL) @list='$(mathematica_DATA)'; test -n "$(mathematicadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(mathematicadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(mathematicadir)" || 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)$(mathematicadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(mathematicadir)" || exit $$?; \ done uninstall-mathematicaDATA: @$(NORMAL_UNINSTALL) @list='$(mathematica_DATA)'; test -n "$(mathematicadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(mathematicadir)'; $(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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(mathematicadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-docDATA install-man install-mathematicaDATA 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-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-docDATA uninstall-man \ uninstall-mathematicaDATA uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-docDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-mathematicaDATA 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-docDATA uninstall-man uninstall-man1 \ uninstall-mathematicaDATA # 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: geomview-1.9.5/src/bin/geomutil/math2oogl/Makefile.am0000644000175000017500000000051512310110176017376 00000000000000INCLUDES = @default_includes@ bin_PROGRAMS = math2oogl man_MANS = math2oogl.1gv math2oogl_SOURCES = math2oogl.c LDADD = $(SOCKETLIBS) EXTRA_DIST = BezierPlot.m OOGL.m Geomview.m OOGL.m.txt $(man_MANS) mathematicadir = $(pkgdatadir)/Mathematica mathematica_DATA = BezierPlot.m OOGL.m Geomview.m OOGL.m.txt doc_DATA = OOGL.m.txt geomview-1.9.5/src/bin/geomutil/math2oogl/math2oogl.c0000644000175000017500000005423012310110176017405 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif # include "config.h" /* math2oogl: convert Mathematica graphics object to OOGL format. SurfaceGraphics and MeshGraphics => MESH, Graphics3D => OFF, BezierPatch => BEZuvn. Note that we expect the graphics objects to have been processed as in OOGL.m, i.e. provide dimension and meshrange information and print out the colors before the points for SurfaceGraphics objects, and convert the characters "(){}, " to a newline. Original converter by Nils McCarthy, Geomview pipefitting by Stuart Levy SurfaceGraphics converter additions by Tamara Munzner. MeshGraphics and BezierPatch converter additions by Silvio Levy */ /* * Pipe fitting for linking Mathematica to geomview. * Starts geomview if not already running. */ #include #include #include #if defined(unix) || defined(__unix) || defined(__unix__) #include #include #include #include #endif #include #include #include #include #ifdef AIX #define _BSD 1 /* Get FNDELAY from */ #endif #include #ifdef NeXT #include #else /* any other reasonable unix */ #include #endif #ifdef SVR4 /* What should this be called? */ #include #endif #ifndef FNDELAY # define FNDELAY O_NDELAY #endif #ifndef FNONBLK /* Next 3.0 lacks these in */ # define FNONBLK FNDELAY #endif #ifndef O_NONBLOCK # define O_NONBLOCK FNONBLK #endif #ifndef FD_CLOEXEC #define FD_CLOEXEC 1 #endif extern int errno; char *todir = "/tmp/geomview"; char *toname = "Mathematica"; char giveup[] = "Geomview graphics: math2oogl: Couldn't start geomview on "; /* Fool some Linux distros which are too eager to improve the quality * of source code and turn on FORTIFY_SOURCE by default for the * C-compiler gcc. */ static int ign_write(int fd, void *buffer, size_t size) { return write(fd, buffer, size); } static int ign_dup(int fd) { return dup(fd); } static void interrupt(int sig) { char myname[1024]; ign_write(2, giveup, sizeof(giveup)); #ifdef SVR4 /* jkirk@keck.tamu.edu reports no gethostname() in Solaris (SVR4). * Use sysinfo() instead. */ sysinfo(SI_HOSTNAME, myname, sizeof(myname)); #else gethostname(myname, sizeof(myname)); #endif ign_write(2, myname, strlen(myname)); ign_write(2, "\n", 1); exit(1); } void start_gv(char **gvpath, char *pipename, char *toname) { char *args[1024]; int i = 0; char **gvp; signal(SIGALRM, interrupt); args[i++] = gvpath[0]; #ifdef NeXT args[i++] = "-Mc"; args[i++] = toname; #else /* sgi */ args[i++] = "-c"; args[i++] = pipename; #endif /* Copy remaining args through trailing NULL */ for(gvp = gvpath; (args[i++] = *++gvp); ) ; if(fork() == 0) { int savederr = dup(2); static char whynot[] = "Geomview graphics: math2oogl: Couldn't find "; fcntl(savederr, F_SETFD, FD_CLOEXEC); /* close this on exec */ close(0); close(1); close(2); open("/dev/null", O_RDWR); /* Open /dev/null as file descriptors */ ign_dup(0); ign_dup(0); /* 0(stdin), 1(stdout) and 2(stderr) */ /* (Could just close them, but that seems to poison geomview * if it tries to report an error.) */ #if SETPGRP_VOID setpgrp(); #else setpgrp(0,getpid()); #endif execvp(gvpath[0], &args[0]); ign_write(savederr, whynot, sizeof(whynot)); ign_write(savederr, gvpath[0], strlen(gvpath[0])); ign_write(savederr, "\n", 1); execvp("geomview", &args[0]); execvp("gv", &args[0]); dup2(savederr, 2); kill(getppid(), SIGALRM); interrupt(0); _exit(1); } } void startgv(char **gvpath) { int usesock; int n, fd = -1; char pipename[BUFSIZ]; struct sockaddr_un un; if(access(todir, W_OK) < 0) { mkdir(todir, 0777); chmod(todir, 0777); } sprintf(pipename, "%s/%s", todir, toname); #ifdef NeXT usesock = 1; #else usesock = 0; #endif if(usesock) { strncpy(un.sun_path, pipename, sizeof(un.sun_path)-1); un.sun_family = AF_UNIX; fd = socket(PF_UNIX, SOCK_STREAM, 0); if(connect(fd, (struct sockaddr *)(&un), sizeof(un)) < 0) { if(errno != ECONNREFUSED && errno != ENOENT) { fprintf(stderr, "togeomview: Can't connect to "); perror(pipename); exit(1); } start_gv(gvpath, pipename, toname); for(n = 0; connect(fd, (struct sockaddr *)(&un), sizeof(un)) < 0; n++) { if(n == 60) interrupt(0); sleep(1); } } } else { /* Use named pipe */ if(access(pipename, 0) < 0) { mknod(pipename, S_IFIFO, 0); chmod(pipename, 0666); } fd = open(pipename, O_WRONLY|O_NONBLOCK); if(fd >= 0) { fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~(FNDELAY|FNONBLK|O_NONBLOCK)); } else if(errno == ENXIO) { start_gv(gvpath, pipename, toname); alarm(60); fd = open(pipename, O_WRONLY); alarm(0); } } if(fd < 0) { fprintf(stderr, "Can't open pipe to geomview: "); perror(pipename); exit(1); } /* Now stdout writes to pipe. */ dup2(fd, 1); } /* * Mathematica->OOGL conversion */ typedef float Color[3]; #define ismajor isupper /* * The following table should always obey the convention that "major" * tokens (corresponding to the cases in the big switch below) * are represented by capitals */ enum st { IGNORE='i', POLYGON='p', LINE='l', COLOR='c', NUMBER='n', MESH='m', MESHRANGE='k', DIMENSIONS='d', SG='S', MG='M', G3='G', BG='B' }; struct line { char *data; enum st token; struct line *next; }; struct line *lines=NULL; int size[2]; float range[4]; void usage() { fprintf(stderr,"Usage: math2oogl [-togeomview ]"); exit(1); } int main(int ac,char **av) { int togv = 0; struct line *lastline=NULL; struct line *prev=NULL; char buf[1024]; int npolypoints=0, npolys=0, npolycolors=0; int nvectpoints=0, nvects=0, nvectcolors=0; struct line *curline, *globline; int numnums=0; int numcols=0; enum st state=IGNORE; Color **colors = NULL; int i,j,q,ok; float xincr, yincr; int complex = 0, toss = 0; if (ac >= 4 && (!strcmp(av[1],"-togeomview"))) { startgv(&av[3]); printf("(geometry %s\n", av[2]); togv=1; } else if (ac > 1) usage(); for(;;) { int c; char *k; /* Swallow all delimiters, " (){},\n\r". * It's not strictly correct to ignore {} nesting, but... */ for(k = buf; (c = getchar()) > ' ' && c != ',' && c != '(' && c != ')' && c != '{' && c != '}' && k < buf+sizeof(buf)-1; k++) { /* Handle escaped newlines, which Mathematica inserts just rarely * enough to be hard to notice! */ if(c == '\\') { if((c = getchar()) == '\n') { while((c = getchar()) == ' ' || c == '\t') ; } } *k = c; } if(c == EOF) break; *k = '\0'; if (k == buf || !strcmp(buf,"List")) continue; if (!lastline) lastline = lines = malloc(sizeof(struct line)); else { if (toss) lastline = prev; toss = 0; prev = lastline; lastline = lastline->next = malloc (sizeof(struct line)); } lastline->next = NULL; lastline->data = malloc(strlen(buf)+1); strcpy (lastline->data, buf); if (isalpha(*lastline->data)) { if (!strcmp(lastline->data, "Graphics3D")) lastline->token = G3; else if (!strcmp(lastline->data, "SurfaceGraphics")) lastline->token = SG; else if (!strcmp(lastline->data, "MeshGraphics")) lastline->token = MG; else if (!strcmp(lastline->data, "BezierPatch")|| !strcmp(lastline->data, "BezierGraphics`BezierPatch")) lastline->token = BG; else if (!strcmp(lastline->data, "Polygon")) lastline->token = POLYGON; else if (!strcmp(lastline->data, "Point")) lastline->token = LINE; /* degenerate vector */ else if (!strcmp(lastline->data, "Line")) lastline->token = LINE; else if (!strcmp(lastline->data, "RGBColor")) lastline->token = COLOR; else if (!strcmp(lastline->data, "MeshRange")) lastline->token = MESHRANGE; else if (!strcmp(lastline->data, "Dimensions")) lastline->token = DIMENSIONS; else if (!strcmp(lastline->data, "Complex")) { lastline->token = IGNORE; complex = 1; toss = 1; } else { lastline->token = IGNORE; } } else if (isdigit(*lastline->data) || '-'==*lastline->data) { lastline->token = NUMBER; /* grab real part, toss imaginary part */ if (complex) { if (complex == 1) { complex++; } else if (complex == 2) { lastline->token = IGNORE; complex = 0; toss = 1; } } } } /* we might have multiple graphics objects */ printf ("{ LIST\n\n"); ok = 1; globline = lines; for (globline = lines;globline;) { switch (globline->token) { case SG: /* SurfaceGraphics */ globline=globline->next; if (globline->token == DIMENSIONS) { globline=globline->next; for (i = 0; i < 2 && ok; i++, globline = globline->next) if (globline->token == NUMBER) size[i] = atoi(globline->data); else ok = 0; } else ok = 0; if (!ok) { fprintf(stderr, "can't read mesh dimensions!\n"); return 1; } if (globline->token == MESHRANGE) { globline=globline->next; for (i = 0; i < 4 && ok; i++, globline = globline->next) { if (globline->token == NUMBER) range[i] = atof(globline->data); else ok = 0; } } else ok = 0; if (!ok) { fprintf(stderr, "can't read mesh range!\n"); return 1; } /* in SurfaceGraphics object, first we get all the colors, then all the points: they're not interleaved as in the Graphics3D object. so we need to store them. points array is size[0] x size[1], color array is size[0]-1 x size[1]-1 (per face not per vertex) so repeat the face color for the extra vertices. */ /* if there are colors, store them off */ if (globline->token == COLOR) { numcols = (size[0]-1) * (size[1]-1); colors = malloc((size[0]-1)*sizeof(Color*)); for (i = 0; i < size[0]-1;i++) colors[i] = malloc((size[1]-1)*sizeof(Color)); ok = 1; for (i = 0; i < size[0]-1; i++) { for (j=0; j < size[1]-1; j++) { while (globline->token == COLOR && ok) for (q=0; q < 3 && ok; q++) { globline = globline->next; if (globline->token != NUMBER) { ok = 0; break; } else { colors[i][j][q]=atof(globline->data); } } globline=globline->next; } } if (!ok) { fprintf(stderr, "can't read mesh color array!\n"); return 1; } } /* Each number we get is just the z coordinate. Figure out x and y values based on meshrange and size. We don't use a ZMESH because the grid isn't necessarily an array starting at 0,0: it depends on meshrange */ xincr = (range[1] - range[0]) / (size[0]-1); yincr = (range[3] - range[2]) / (size[1]-1); if (numcols) printf("\n\n{ CMESH \n"); else printf("\n\n{ MESH \n"); printf("\n%d %d\n",size[0], size[1]); ok = 1; for (i = 0; i < size[0]; i++){ for (j = 0; j < size[1]; j++) { if (globline->token!=NUMBER) { ok = 0; break; } printf(" %f ", range[0] + xincr*j); /* x */ printf(" %f ", range[2] + yincr*i); /* y */ printf(" %s ", globline->data); /* z */ /* MESH vertices need RGBA colors since OOGL MESHes have per-vertex colors, repeat some. repeat last i index, first j index. */ if (numcols) { printf(" %f %f %f 1\n", colors[inext; } } if (!ok) { fprintf(stderr, "can't read mesh points array!\n"); return 1; } else printf("} #end of MESH\n"); break; case MG: /* MeshGraphics */ globline=globline->next; if (globline->token == DIMENSIONS) { globline=globline->next; for (i = 0; i < 2 && ok; i++, globline = globline->next) if (globline->token == NUMBER) size[i] = atoi(globline->data); else ok = 0; } else ok = 0; if (!ok) { fprintf(stderr, "can't read mesh dimensions!\n"); return 1; } /* in MeshGraphics object, first we get all the colors, then all the points: they're not interleaved as in the Graphics3D object. so we need to store them. points array is size[0] x size[1], color array is size[0]-1 x size[1]-1 (per face not per vertex) so repeat the face color for the extra vertices. */ /* if there are colors, store them off */ if (globline->token == COLOR) { numcols = (size[0]-1) * (size[1]-1); colors = malloc((size[0]-1)*sizeof(Color*)); for (i = 0; i < size[0]-1;i++) colors[i] = malloc((size[1]-1)*sizeof(Color)); ok = 1; for (i = 0; i < size[0]-1; i++) { for (j=0; j < size[1]-1; j++) { while (globline->token == COLOR && ok) for (q=0; q < 3 && ok; q++) { globline = globline->next; if (globline->token != NUMBER) { ok = 0; break; } else { colors[i][j][q]=atof(globline->data); } } globline=globline->next; } } if (!ok) { fprintf(stderr, "can't read mesh color array!\n"); return 1; } } /* Each number we get is just the x,y or z coordinate. We don't use a ZMESH because the grid isn't necessarily an array starting at 0,0: it depends on meshrange */ if (numcols) printf("\n\n{ CMESH \n"); else printf("\n\n{ MESH \n"); printf("\n%d %d\n",size[0], size[1]); ok = 1; for (i = 0; i < size[0]; i++){ for (j = 0; j < size[1]; j++) { if (globline->token!=NUMBER) { ok = 0; break; } printf(" %s ", globline->data); /* x */ globline=globline->next; if (globline->token!=NUMBER) { ok = 0; break; } printf(" %s ", globline->data); /* y */ globline=globline->next; if (globline->token!=NUMBER) { ok = 0; break; } printf(" %s ", globline->data); /* z */ /* MESH vertices need RGBA colors since OOGL MESHes have per-vertex colors, repeat some. repeat last i index, first j index. */ if (numcols) { printf(" %f %f %f 1\n", colors[inext; } } if (!ok) { fprintf(stderr, "can't read mesh points array!\n"); return 1; } else printf("} #end of MESH\n"); break; case BG: /* BezierGraphics */ globline=globline->next; if (globline->token == DIMENSIONS) { globline=globline->next; for (i = 0; i < 2 && ok; i++, globline = globline->next) if (globline->token == NUMBER) size[i] = atoi(globline->data); else ok = 0; } else ok = 0; if (!ok) { fprintf(stderr, "can't read Bezier patch dimensions!\n"); return 1; } /* in BezierGraphics object, first we get all the colors, then all the points. points array is size[0] x size[1], color array is 2x2. */ /* if there are colors, store them off */ if (globline->token == COLOR) { numcols = 2*2; colors = malloc(2*sizeof(Color*)); for (i = 0; i < 2;i++) colors[i] = malloc(2*sizeof(Color)); ok = 1; for (i = 0; i < 2; i++) { for (j=0; j < 2; j++) { while (globline->token == COLOR && ok) for (q=0; q < 3 && ok; q++) { globline = globline->next; if (globline->token != NUMBER) { ok = 0; break; } else { colors[i][j][q]=atof(globline->data); } } globline=globline->next; } } if (!ok) { fprintf(stderr, "can't read mesh color array!\n"); return 1; } } /* Each number we get is just the x,y or z coordinate. */ if (numcols) printf("\n\n{ CBEZ"); else printf("\n\n{ BEZ"); printf("%d%d3\n",size[1]-1, size[0]-1); /* reverse order */ ok = 1; for (i = 0; i < size[0]; i++){ for (j = 0; j < size[1]; j++) { if (globline->token!=NUMBER) { ok = 0; break; } printf(" %s ", globline->data); /* x */ globline=globline->next; if (globline->token!=NUMBER) { ok = 0; break; } printf(" %s ", globline->data); /* y */ globline=globline->next; if (globline->token!=NUMBER) { ok = 0; break; } printf(" %s ", globline->data); /* z */ /* print colors */ if (numcols) { printf(" %f %f %f 1\n", colors[i][j][0], colors[i][j][1], colors[i][j][2]); } else printf("\n"); globline=globline->next; } } if (!ok) { fprintf(stderr, "can't read control points array!\n"); return 1; } else printf("} #end of BEZ\n"); break; case G3: /* Graphics3D */ globline=globline->next; npolypoints=npolys=npolycolors=0; nvectpoints=nvects=nvectcolors=0; numnums=numcols=0; state = IGNORE; for (curline=globline;;curline=curline->next) { if (!curline || (curline->token != NUMBER)) { if (state == LINE) { nvects++; nvectpoints += numnums/3; if (numcols) nvectcolors++; numcols = 0; } else if (state == POLYGON) { npolys++; npolypoints += numnums/3; if (numcols) npolycolors++; } if (!curline || ismajor(curline->token)) break; /* go back to main loop */ if (curline->token == COLOR) numcols++; state=curline->token; numnums=0; } else /* it's a number */ numnums++; } if (npolys) { printf ("\n{ = OFF\n"); printf ("%d %d %d\n",npolypoints, npolys, 0); { /* vertex list */ struct line *curline; enum st state=IGNORE; char coordnum=0; for (curline=globline; curline && !ismajor(curline->token); curline=curline->next) { if (curline->token != NUMBER) { state = curline->token; coordnum=0; printf("\n"); } else if (state == POLYGON) { printf("%s",curline->data); if(coordnum++%3 == 2) printf("\n"); else printf(" "); } } } { /* face list (maybe includes color) */ Color c; char hascolor = 0; /* so far. */ char thiscolor=1; /* if this polygon has had its color * tacked on. */ char cnum=3; /* 3 == not doing color now. */ struct line *curline; enum st state=IGNORE; int pointnum=0; c[0] = c[1] = c[2] = 0; for (curline=globline;;curline=curline->next) { if (!thiscolor && hascolor && (!curline || curline->token != NUMBER)) { /* OFF faces need just RGB colors, no alpha! */ printf(" %f %f %f",c[0],c[1],c[2]); thiscolor = 1; } if (!curline || ismajor(curline->token)) break; /* back to main loop */ switch (curline->token) { case COLOR: cnum = 0; state = COLOR; hascolor = 1; break; case POLYGON: { struct line *countline; int numvert=0; thiscolor = !hascolor; cnum = 3; state = POLYGON; for (countline = curline->next; countline; countline=countline->next) { if (countline->token != NUMBER) break; numvert++; } printf("\n%d",numvert/3); } break; case NUMBER: if (state == POLYGON) { if (pointnum++%3 == 2) printf(" %d",pointnum/3-1); } else if (state==COLOR) { if (cnum<3) c[(int)cnum++] = atof(curline->data); } break; default: state = curline->token; break; } } } printf("\n\n} #end of OFF\n"); } if (nvects) { printf("\n{ = VECT\n"); printf("%d %d %d\n",nvects, nvectpoints, nvectcolors); { struct line *curline; enum st state=IGNORE; int numvert=0, numcol=0; for (curline=globline;;curline=curline->next) { if (numvert && (!curline || curline->token != NUMBER)) { printf("%d ",numvert/3); numvert = 0; } if (!curline || ismajor(curline->token)) break; /* back to main loop */ if(curline->token == NUMBER && state==LINE) numvert++; else state=curline->token; } printf("\n\n"); for (curline=globline; curline && !ismajor(curline->token); curline=curline->next) { if (curline->token == LINE) { printf("%d ",numcol?1:0); numcol = 0; } if(curline->token == COLOR) numcol++; } printf("\n\n"); } { struct line *curline; enum st state=IGNORE; int coordno=0; for (curline=globline; curline && !ismajor(curline->token); curline=curline->next) { if (curline->token != NUMBER) state = curline->token; else if (state == LINE) { printf("%s%c",curline->data,((++coordno)%3)?' ':'\n'); } } } { struct line *curline; Color c; char hascolor=0; char cnum=3; c[0] = c[1] = c[2] = 0; for (curline=globline; curline && !ismajor(curline->token); curline=curline->next) { if (curline->token == NUMBER) { if (cnum<3) { c[(int)cnum++]=atof(curline->data); hascolor = 1; } } else if (curline->token == LINE) { /* note VECTs need RGBA colors */ if(hascolor) printf("%f %f %f 1\n",c[0],c[1],c[2]); hascolor = 0; } else if (curline->token == COLOR) cnum = 0; } } printf("\n} #end of VECT\n"); } globline = curline; break; default: fprintf(stderr, "math2oogl: unexpected data: %s\n", globline->data); return 1; } /* end switch (globline->token) */ } printf ("\n} #end of LIST\n"); if (togv) { /* end our (geometry */ printf("\n)\n"); } return 0; } geomview-1.9.5/src/bin/geomutil/math2oogl/BezierPlot.m0000644000175000017500000000517212310110176017603 00000000000000(* Author: Silvio Levy *) BeginPackage["BezierPlot`"] BezierPatch::usage = "\n BezierPatch[ 4 by 4 array ] describes a bicubic Bezier patch\n to be plotted using OOGL.m, for example. The elements of the\n array are usually 3D vectors, but the function doesn't care." BezierPlot::usage = "\n BezierPlot[f,{t,tmin,tmax},{u,umin,umax}] \"plots\" the function f\n of two variables t and u, using Bezier patches. (Usually f returns\n a 3D vector.) BezierPlot returns an array of BezierPatch'es.\n Options:\n Epsilon is the increment used to compute derivatives (default: 10^-4)\n PlotPoints is a number or pair of numbers indicating the fineness\n of the subdivision (default: 5)"; BezierPlot::baditer = "bad iterator"; BezierPlot::badpp = "requested number of plot points is < 1"; Options[BezierPlot] = {Epsilon -> .0001, PlotPoints->5} Begin["`private`"] BezierPlot[f_,{t_,tmin_,tmax_},{u_,umin_,umax_},options___]:= Block[{it,iu,nt,nu,dt,du,loc,dfdt,dfdt0,dfdu,dfdu0,dboth,all, plotPoints=PlotPoints/.{options}/.Options[BezierPlot], eps=Epsilon/.{options}/.Options[BezierPlot]}, If[Length[plotPoints]==2,{nt,nu}=plotPoints,nt=plotPoints;nu=plotPoints]; If[nx<1 || ny<1,Message[BezierPlot::badpp];Return[{}]]; dt=N[(tmax-tmin)/nt]; du=N[(umax-umin)/nu]; If[!(NumberQ[dt]&&dt>0&&NumberQ[du]&&du>0), Message[BezierPlot::baditer];Return[{}]]; loc=Table[f/.{t->tmin+dt it,u->umin+du iu},{iu,0,nu},{it,0,nt}]; dfdt0=-loc+Table[f/.{t->tmin+dt(it+If[itumin+du iu}, {iu,0,nu},{it,0,nt}]; dfdt=MapAt[-1#&,#,-1]& /@ dfdt0/(3 eps); dfdu0=-loc+Table[f/.{t->tmin+dt it,u->umin+du(iu+If[iutmin+dt(it+If[itumin+du(iu+If[iu \"user@host\" ];"; GeomviewCommand::usage = "Option to Geomview[] specifying the command used to start geomview if\n it is not already running. May include geomview command-line options."; MachType::usage= "Option to Geomview[] specifying machine type of DisplayHost. Should be either \"sgi\" or \"next\". The default value is set by Mathematica to be the same as the type of machine on which Mathematica is running."; (*Geomview /: Options[Geomview] := { DisplayHost -> "" };*) MeshGraphics::usage = "\n Head for mesh graphics object." Options[Geomview] ^= {DisplayHost->"", MachType->If [$System == "NeXT", "next", If [$System == "SPARC", "sun4", "sgi"] ], XDisplay -> ":0", GeomviewCommand -> $GeomviewPath}; Begin["`Private`"] (* Use StringJoin not <> for backward compatibility *) WriteChunk[filename_String, gobj_List] := ( Map[ WriteChunk[filename,#] &, gobj]; ); WriteChunk[filename_String, gobj_Graphics3D] := ( Write[filename, CForm[gobj[[0]]]]; Write[filename, CForm[N[gobj[[1]]]]]; ); GoodHeadQ[gobj_] := (SameQ[gobj[[0]],SurfaceGraphics] || SameQ[gobj[[0]],MeshGraphics] || SameQ[gobj[[0]],BezierPlot`BezierPatch] || SameQ[gobj[[0]],BezierPatch]) WriteChunk[filename_String, gobj_?GoodHeadQ] := ( Write[filename, CForm[gobj[[0]]]]; WriteString[filename, "Dimensions\n"]; Write[filename, Take[Dimensions[gobj[[1]]],2]]; If[SameQ[gobj[[0]],SurfaceGraphics], WriteString[filename, "MeshRange\n"]; Write[filename, MeshRange /. gobj[[-1]]]] ; (* write out the colors before the points, if they exist *) (* Backwards compatibility with v1.2: Dimensions[gobj] returns empty list *) If [$VersionNumber >= 2.0, If [Dimensions[gobj][[1]] > 2, Write[filename, CForm[gobj[[2]]]]], If [Dimensions[Dimensions[gobj[[2]]]][[1]] > 1, Write[filename, CForm[gobj[[2]]]]]]; Write[filename, CForm[N[gobj[[1]]]]]; ); If[$VersionNumber < 2.0, ( StringTake[str_, take_] := Apply[StringJoin, Take[Characters[str], take]]; StringPosition[str_, ch_] := Block[{chars = Characters[str]}, Select[ Table[{i,i}, {i,1,StringLength[str]}], (chars[[ #[[1]] ]] == ch)&] ]; $Failed = Fail; )]; BinPrefix[mach_] := StringJoin[ $GeomRoot, "/bin/", mach ]; BinShPrefix[mach_] := StringJoin[ "PATH=$PATH:", BinPrefix[mach], " " ]; WriteOut[filename_String, gobj_, postpend_String:"", prepend_String:"", options___] :=( (* math2oogl expects '{}(), ' to be translated into newlines *) tr = "tr -s '{}(), ' '\\12\\12\\12\\12\\12\\12' | "; (* Do the right thing if we've got a command instead of a file name. *) tmpfilename = If[StringMatchQ[filename, "!*"], StringJoin[" | ",StringDrop[filename,1]], If[filename != "", StringJoin[" > ", filename], filename]]; newfilename = StringJoin["!",tr,prepend," ", BinShPrefix[ MachType /. {options} /. Options[Geomview]], "math2oogl ",postpend, tmpfilename]; (* We might prepend 'rsh hostname' to the command, which must then be * quoted so that what comes after the pipes gets interpreted on * the remote not the local machine. The open quote is already in the * middle of the prepended string. * If we did prepend 'rsh hostname', also add a command to be executed in * case the rsh failed, to avoid e.g. mysterious "permission denied" errors. * StringMatchQ[prepend,"rsh*"] fails mysteriously in Math 1.2. *) If[StringLength[prepend]>3 && StringTake[prepend,3] == "rsh", newfilename = StringJoin[newfilename, "'\\' || (echo Geomview graphics: Cannot rsh to machine ", rshhost, " as ", If[rshuser != "", StringJoin["user ", rshuser], "yourself"], ".; echo Check DisplayHost option, or your .rhosts file on ", rshhost, ".)"]]; OpenWrite[newfilename]; WriteChunk[newfilename, gobj]; Close[newfilename]; ); WriteOOGL[filename_String,gobj_] :=( WriteOut[filename, gobj]; gobj ); WriteRIB[filename_String,gobj_, riboptions_String:"", options___] :=( WriteOut[filename,gobj, StringJoin[" | oogl2rib -n mma.tiff ",riboptions]]; gobj ); (* * If the given filename is on the $PATH, returns the directory it's in, * else returns Null. Used for load-time warning messages. *) OnPathQ[filename_] := Block[{pdir, i, posen, path = StringJoin[":",Environment["PATH"],":"] }, ( posen = StringPosition[path, ":"]; Do[ (pdir = StringTake[path, {posen[[i]][[2]]+1, posen[[i+1]][[1]]-1}]; If[FileType[StringJoin[pdir,"/",filename]] === File, Return[pdir]]), {i, 1, Length[posen]-1} ] )]; xhost[display_] := StringTake[display, StringPosition[StringJoin[display,":"], ":"] [[1]] [[1]]-1]; remotehost[host_String] := ( newhost=""; If[host != "", newhost = If[host == "local", "", host], ( If[(rshhost = Environment["REMOTEHOST"]) =!= $Failed || (rshhost = Environment["DISPLAY"]) =!= $Failed, newhost = xhost[rshhost]; ] )]; If[newhost == $MachineName, newhost = ""]; If[newhost != "" && Length[StringPosition[newhost, "@"]] == 0 && ((ruser = Environment["REMOTEUSER"]) =!= $Failed || (ruser = Environment["USER"]) =!= $Failed || (ruser = Environment["LOGNAME"]) =!= $Failed), newhost = StringJoin[ruser, "@", newhost]]; newhost ); toGV[host_, xdisplay_] :=( newhost = remotehost[host]; {rshuser, rshhost} = If[Length[atposn = StringPosition[newhost, "@"]] > 0, {StringTake[newhost, {1,atposn[[1]][[1]]-1}], StringTake[newhost, {atposn[[1]][[2]]+1,StringLength[newhost]}]}, {"", newhost}]; (* Return our rsh command if any, else the empty string. *) If[newhost != "", StringJoin["rsh ", rshhost, If[StringLength[rshuser] > 0, " -l ", ""], rshuser, " /bin/sh -c \\''DISPLAY=", xdisplay, "; export DISPLAY; "], "" ] ); Geomview[ name_String, gobj_, options___] := ( WriteOut["", gobj, StringJoin[" -togeomview ",name," ", GeomviewCommand /. {options} /. Options[Geomview]], toGV[DisplayHost /. {options} /. Options[Geomview], XDisplay /. {options} /. Options[Geomview]], options]; gobj ); Geomview[ gobj_, options___] := ( Geomview[ "Mathematica", gobj, options ]; gobj ); bpref = BinPrefix[MachType /. Options[Geomview]]; If[Not[StringQ[OnPathQ["math2oogl"]]], (Print["Warning: the program 'math2oogl' is not on your search path,\n", Environment["PATH"], "\n"]; If[ FileType[StringJoin[bpref, "/math2oogl"]]===File, Print["using default path (in OOGL.m) of ", bpref, " instead."], Print[ "the Mathematica->geomview graphics package won't be able to work;\n change the value of $Geomroot in OOGL.m, or ensure that the math2oogl programs\n are installed somewhere on your search path."] ]) ]; End[] EndPackage[] SetOptions[Geomview, DisplayHost -> OOGL`Private`remotehost[""] ]; geomview-1.9.5/src/bin/geomutil/math2oogl/Geomview.m0000644000175000017500000000130212310110176017275 00000000000000(* * Geomview.m selects Geomview graphics as the default for Show * of 3D graphics objects. Others still use the default system. * To restore normality, load <"riemann"] This displays the graphics `%3' on the remote host named `riemann'. `Geomview' recognizes the string `"local"' as a value for `$DisplayHost'; it forces the graphics to be displayed on the local machine. In addition to knowing the name of the machine you want to run Geomview on, the `Geomview' needs to know the type of that machine (SGI or NeXT). By default, `Geomview' assumes that it is the same kind of computer as the one you are running Mathematica on. The `MachType' option lets you explicitly specify the type of the `DisplayHost' computer; it should be one of the strings `"sgi"' or `"next"'. You can use `SetOptions' to change the default `DisplayHost' and `MachType'. For example, In[4] := SetOptions[Geomview, DisplayHost->"riemann", MachType->"sgi"] arranges for `Geomview' to run Geomview on an SGI workstation named `riemann'. Transporting Mathematica Files to Geomview by Hand -------------------------------------------------- The auxilliary function `WriteChunk' is for those who can only use Mathematica on a non-Unix machine (Mac, PC) or a Unix machine that is not on a network with an SGI or NeXT. `WriteChunk[FILE, GRAPHICS]' generates a file named FILE which contains the graphics object GRAPHICS in the format accepted by `math2oogl'. You can transfer that file to a computer that has Geomview installed on it and then use the programs `math2oogl', `oogl2rib', and `geomview' directly from the shell. These programs are distributed in the `bin/sgi' (on SGIs) or `bin/next' (on NeXTs) subdirectory of the Geomview directory, and may have been installed so that they are on your `path'. In[1]:= < mma.oogl to convert it to the OOGL file `mma.oogl' which you can then view using Geomview. This is the equivalent of the `WriteOOGL' command. For a result equivalent to the `Geomview' or `Show' commands, type math2oogl -togeomview Mathematica geomview < mychunk The `WriteRIB' command can be emulated from the shell as math2oogl < mychunk | oogl2rib -n mma.tiff Details of the Mathematica->Geomview Package ============================================ The `OOGL.m' package uses the external program `math2oogl' to convert `Graphics3D' objects to OOGL format, because a compiled external program is able to do this conversion many times faster than Mathematica. The converter will sometimes handle colored SurfaceGraphics objects correctly that Mathematica does not handle correctly, which means that Geomview[object] sometimes works where Show[object] will give errors. The converter supports the `Polygon', `Line', and `Point' graphics primitives, `RGBColor Graphics3D' directives, and `SurfaceGraphics' objects with or without `RGBColor' directives, and lists of any combination of these. It silently ignores all other directives. The Mathematica to RenderMan conversion is actually a two-step process: Mathematica->OOGL (math2oogl), and OOGL->RenderMan (oogl2rib). The math2oogl program has only been tested on SGIs and NeXTs, but could theoretically compile on any machine. The oogl2rib program depends on the OOGL (Object Oriented Graphics Language) libraries, which now only exist on SGI and NeXT machines. In the `WriteOOGL' and `WriteRIB' commands, filename can either be a string containing a filename, an `OutputStream' object, or a string starting with a `!' to send the output to a command. Object can be a `Graphics3D' object, a `SurfaceGraphics' object, or a list of these. The packages work best with Mathematica 2.0 or better. With version 1.2, the Geomview display is always on the local host. Installing the Mathematica Packages =================================== If Geomview is properly installed on your system according to the instructions in *Note Installation::, then the Mathematica-to-Geomview packages should work as described here; there should be no need for additional installation procedures. In practice, however, it is sometimes necessary to taylor the installation of the Mathematica packages and/or of Geomview itself to suit the needs of a particular system. This section contains details about how the installation works; if the Mathematica-to-Geomview connection does not seem to work for you after following the Geomview installation procedure, consult this section to see what might need to be fixed. In this section, the phrase *Geomview installation* refers any of the procedures in *Note Installation::. The way the Mathematica packages work and are installed is the same regardless of whether you have one of the binary distributions or the source distribution. 1. The relevant mathematica files are `OOGL.m', `Geomview.m', and `BezierPlot.m'; Mathematica must be able to find these files. They are distributed in the `$GEOMROOT/mathematica' subdirectory of the binary distributions, and in the `$GEOMROOT/src/bin/geomutil/math2oogl' subdirectory of the source distribution. These files need to be in a directory that is on Mathematica's search path. You can look at the value of the `$Path' variable in a Mathematica session on your system to see a list of the directories on Mathematica's search path. The Geomview installation procedure puts copies of the Mathematica packages into a directory that you specify (`MMAPACKAGEDIR'). This should ensure that Mathematica can find them. Alternately, you could arrange to append the pathname of the Mathmematica package subdirectory of the Geomview distribution to the `$Path' variable each time you run Mathematica. 2. The package `OOGL.m' needs to be able to invoke the programs `geomview', `math2oogl', and `oogl2rib'. The Geomview installation procedure installs these programs into a directory that you specify for executables (`BINDIR'). Ideally, this directory should be on your shell's `$path'. More specifically, it should be on the `$path' of the shell in which Mathematica runs; the directory `/usr/local/bin' is usually a good choice. You can see the list of directories on this path by giving the command `!echo $path' in Mathematica. If for some reason you can't arrange for `geomview', `math2oogl', and `oogl2rib' to be in a directory on the shell's `$path', you can modify `OOGL.m' to cause it to look for them using absolute pathnames. To do this, change the definitions of the variables `$GeomviewPath' and `$GeomRoot', which are defined near the top of the file. Change `$GeomviewPath' to the absolute pathname of the `geomview' shell script on your system. Change `$GeomRoot' to the absolute pathname of the `$GEOMROOT' directory on your system. If you do this, you should also make sure there are copies of `geomview', `math2oogl', and `oogl2rib' in the `$GEOMROOT/bin/sgi' (on an SGI) or `$GEOMROOT/bin/next' (on a NeXT) directory. 3. The `geomview' shell script, which `OOGL.m' uses to invoke Geomview, needs to be able to find the geomview executable file (which is called `gvx' on the SGI and `Geomview.app/Geomview' on the NeXT). The Geomview installation procedure should have been taken care of this, but if your Mathematica session doesn't seem to be able to invoke Geomview, it's worth double-checking that the settings in the `geomview' script are correct. geomview-1.9.5/src/bin/geomutil/math2oogl/math2oogl.1gv0000644000175000017500000000223112310110176017652 00000000000000.\" Hey, EMACS: -*- nroff -*- .TH MATH2OOGL 1gv "February 23, 2001" .\" Please adjust this date whenever revising the manpage. .SH NAME math2oogl \- convert Mathematica grphics object to OOGL format .SH SYNOPSIS .B math2oogl .br .B math2oogl .BI -togeomview " objectname" " " geomview-path .SH DESCRIPTION This manual page documents briefly the .B math2oogl command. .PP \fBmath2oogl\fP converts Mathematica graphics objects, read from standard input, to OOGL format, written to standard output. SurfaceGraphics and MeshGraphics objects are converted to an OOGL MESH; a Graphics3D object is converted to OFF; and a BezierPatch is converted to a BEZuvn. .PP Note that we expect the graphics objects to have been processed as in OOGL.m, i.e. provide dimension and meshrange information and print out the colors before the points for SurfaceGraphics objects, and convert the characters "(){}, " to a newline. .SH FILES .I /usr/share/geomview/mathematica/OOGL.m .SH SEE ALSO .BR geomview (1). .SH AUTHOR This manual page was written by Steve Robbins , for the Debian GNU/Linux system (but may be used by others). geomview-1.9.5/src/bin/geomutil/oogl2vrml/0000755000175000017500000000000012310165604015456 500000000000000geomview-1.9.5/src/bin/geomutil/oogl2vrml/Makefile.in0000644000175000017500000006053412310165552017455 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = oogl2vrml$(EXEEXT) oogl2vrml2$(EXEEXT) subdir = src/bin/geomutil/oogl2vrml DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am_oogl2vrml_OBJECTS = oogl2vrml.$(OBJEXT) oogl2vrml_OBJECTS = $(am_oogl2vrml_OBJECTS) oogl2vrml_LDADD = $(LDADD) am__DEPENDENCIES_1 = oogl2vrml_DEPENDENCIES = $(am__DEPENDENCIES_1) 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 = am_oogl2vrml2_OBJECTS = oogl2vrml2.$(OBJEXT) oogl2vrml2_OBJECTS = $(am_oogl2vrml2_OBJECTS) oogl2vrml2_LDADD = $(LDADD) 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(oogl2vrml_SOURCES) $(oogl2vrml2_SOURCES) DIST_SOURCES = $(oogl2vrml_SOURCES) $(oogl2vrml2_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = @default_includes@ man_MANS = oogl2vrml.1gv oogl2vrml_SOURCES = oogl2vrml.c oogl2vrml2_SOURCES = oogl2vrml2.c oogl2vrml2_DEPENDENCIES = $(OOGLLIB) #oogl2vrml2_LDFLAGS = -rpath $(libdir) LDADD = $(OOGLLIB) EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/oogl2vrml/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/oogl2vrml/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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 \ || test -f $$p1 \ ; 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(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: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list oogl2vrml$(EXEEXT): $(oogl2vrml_OBJECTS) $(oogl2vrml_DEPENDENCIES) $(EXTRA_oogl2vrml_DEPENDENCIES) @rm -f oogl2vrml$(EXEEXT) $(AM_V_CCLD)$(LINK) $(oogl2vrml_OBJECTS) $(oogl2vrml_LDADD) $(LIBS) oogl2vrml2$(EXEEXT): $(oogl2vrml2_OBJECTS) $(oogl2vrml2_DEPENDENCIES) $(EXTRA_oogl2vrml2_DEPENDENCIES) @rm -f oogl2vrml2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(oogl2vrml2_OBJECTS) $(oogl2vrml2_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oogl2vrml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oogl2vrml2.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-man 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-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ 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 mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 # 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: geomview-1.9.5/src/bin/geomutil/oogl2vrml/Makefile.am0000644000175000017500000000043112310110176017422 00000000000000INCLUDES = @default_includes@ bin_PROGRAMS = oogl2vrml oogl2vrml2 man_MANS = oogl2vrml.1gv oogl2vrml_SOURCES = oogl2vrml.c oogl2vrml2_SOURCES = oogl2vrml2.c oogl2vrml2_DEPENDENCIES = $(OOGLLIB) #oogl2vrml2_LDFLAGS = -rpath $(libdir) LDADD = $(OOGLLIB) EXTRA_DIST = $(man_MANS) geomview-1.9.5/src/bin/geomutil/oogl2vrml/oogl2vrml.c0000644000175000017500000003353712310110176017472 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* OOGL to VRML converter * by Tamara Munzner */ #include #include #include "geom.h" #include "transform.h" #include "polylistP.h" #include "vectP.h" #include "sphere.h" #include "commentP.h" #include "plutil.h" #ifdef DEBUG # undef DEBUG # define DEBUG(expr) (expr) #else # define DEBUG(expr) /*nothing*/ #endif FILE *f = NULL; Appearance *ap = NULL; int bezdice = 0; struct linkap { Appearance *ap; struct linkap *prev; }; struct linkap *toplap; void faceindex(PolyList *plist) { int i,j; Poly *pl = NULL; Vertex *base = plist->vl; for (i = 0, pl = plist->p; i < plist->n_polys; i++, pl++) { for (j = 0; j < pl->n_vertices; j++) { fprintf(f, " %d, ", (int) (pl->v[j]-base) ); } fprintf(f, " -1,\n "); } } void plisttoindface(Geom *pgeom) { PolyList *plist = (PolyList *)pgeom; Poly *pl = NULL; Vertex *v = NULL; int i; int shading = toplap->ap->shading; /* Vertices */ fprintf(f, " Coordinate3 { point [\n"); for (i = 0, v = plist->vl; i < plist->n_verts; i++, v++) { fprintf(f, " %g %g %g, ", v->pt.x, v->pt.y, v->pt.z); } fprintf(f, "] } \n"); /* Normals */ if (shading == APF_FLAT) { PolyListComputeNormals(plist, PL_HASPN); fprintf(f, "NormalBinding { value PER_FACE }\n"); DEBUG(fprintf(stderr, " per face normals! \n")); fprintf(f, " Normal { vector [ "); for (i = 0, pl= plist->p; i < plist->n_polys; i++, pl++) { fprintf(f, " %g %g %g, ", pl->pn.x, pl->pn.y, pl->pn.z); } fprintf(f, "] }\n"); } else if (shading == APF_SMOOTH) { PolyListComputeNormals(plist, PL_HASVN); fprintf(f, "NormalBinding { value PER_VERTEX_INDEXED }\n"); DEBUG(fprintf(stderr, " per vertex normals! \n")); fprintf(f, " Normal { vector [ "); for (i = 0, v = plist->vl; i < plist->n_verts; i++, v++) { fprintf(f, " %g %g %g, ", v->vn.x, v->vn.y, v->vn.z); } fprintf(f, "] }\n"); } /* Colors */ if (plist->geomflags & PL_HASVCOL && plist->geomflags & PL_HASPCOL) { if (shading == APF_FLAT) { plist->geomflags &= ~PL_HASVCOL; } else { plist->geomflags &= ~PL_HASPCOL; } } /* Appearance diffuse color overrides object colors */ /* We don't rely on the override bit, since Geomview never sets it when saving files. */ if (toplap->ap->mat && toplap->ap->mat->valid & MTF_DIFFUSE) { plist->geomflags &= ~(PL_HASPCOL|PL_HASVCOL); } if (plist->geomflags & PL_HASPCOL) { fprintf(f, "MaterialBinding { value PER_FACE }\n"); fprintf(f, " Material { diffuseColor [ "); for (i = 0, pl= plist->p; i < plist->n_polys; i++, pl++) { fprintf(f, " %g %g %g, ", pl->pcol.r, pl->pcol.g, pl->pcol.b); } fprintf(f, "] }\n"); } else if (plist->geomflags & PL_HASVCOL) { fprintf(f, "MaterialBinding { value PER_VERTEX_INDEXED }\n"); fprintf(f, " Material { diffuseColor [ "); for (i = 0, v = plist->vl; i < plist->n_verts; i++, v++) { fprintf(f, " %g %g %g, ", v->vcol.r, v->vcol.g, v->vcol.b); } fprintf(f, "] }\n"); } else if (toplap->ap->mat && toplap->ap->mat->valid & MTF_DIFFUSE) { /* reset color to backstop */ fprintf(f, "Material { diffuseColor [ %g %g %g ] } ", toplap->ap->mat->diffuse.r, toplap->ap->mat->diffuse.g, toplap->ap->mat->diffuse.b); } /* Connectivity */ /* wish we could DEF fields not just nodes, then wouldn't waste bandwidth with 3 chunks of identical numbers */ fprintf(f," IndexedFaceSet {\n "); fprintf(f, " coordIndex [ \n"); faceindex(plist); fprintf(f, " ] # end coordIndex \n "); if (shading != APF_FLAT) { fprintf(f, " normalIndex [ \n"); faceindex(plist); fprintf(f, " ] # end normalIndex \n "); if (plist->geomflags & PL_HASVCOL) { fprintf(f, " materialIndex [ \n"); faceindex(plist); fprintf(f, " ] # end materialIndex \n "); } } fprintf(f, " } # end IndexedFaceSet \n "); } void lineindex(Vect *pline) { int i,j; int n = 0; for (i = 0; i < pline->nvec; i++) { for (j = 0; j < pline->vnvert[i]; j++) { fprintf(f, " %d, ", n++); } fprintf(f, " -1,\n "); } } void plinetoindline(Geom *pgeom) { Vect *pline = (Vect *)pgeom; HPoint3 *v = NULL; int i, j, n; /* Vertices */ fprintf(f, " Coordinate3 { point [\n"); for (i = 0, v = pline->p; i < pline->nvert; i++, v++) { fprintf(f, " %g %g %g, ", v->x, v->y, v->z); } fprintf(f, "] } \n"); /* Colors */ if (toplap->ap->mat && toplap->ap->mat->valid & MTF_EDGECOLOR) pline->ncolor = 0; if (pline->ncolor >= 1) { if (pline->ncolor > 1) fprintf(f, " MaterialBinding { value PER_VERTEX_INDEXED } "); fprintf(f, " Material { diffuseColor [ "); for (i = 0; i < pline->ncolor; i++) { fprintf(f, " %g %g %g, ", pline->c[i].r, pline->c[i].g, pline->c[i].b); } fprintf(f, "] }\n"); } else if (toplap->ap && toplap->ap->mat && toplap->ap->mat->valid & MTF_EDGECOLOR) { fprintf(f, " Material { diffuseColor [ %g %g %g ] }\n", toplap->ap->mat->edgecolor.r, toplap->ap->mat->edgecolor.g, toplap->ap->mat->edgecolor.b); } /* Connectivity */ fprintf(f," IndexedLineSet {\n "); fprintf(f, " coordIndex [ \n"); lineindex(pline); fprintf(f, " ] # end coordIndex \n "); /* appearance edgecolor overrides per-vertex colors */ if (pline->ncolor > 1) { fprintf(f, " materialIndex [\n"); n = -1; for (i = 0; i < pline->nvec; i++) { if (pline->vncolor[i] == 1) n++; for (j = 0; j < pline->vnvert[i]; j++) { fprintf(f, " %d, ", n); if (pline->vncolor[i] > 1) n++; } fprintf(f, " -1,\n "); } fprintf(f, " ] # end materialIndex \n "); } fprintf(f, " } # end IndexedLineSet \n "); } void printxform(Transform T) { if (T && memcmp(T, TM_IDENTITY, sizeof(Transform)) != 0) { fprintf(f, " MatrixTransform { matrix \n"); fputtransform(f, 1, &T[0][0], 0); fprintf(f, " } \n"); } } void doap(Appearance *a) { if (a->mat && a->mat->valid) { Material *m = a->mat; float ka, kd, ks; ka = (m->valid & MTF_Ka) ? m->ka : 1.0; kd = (m->valid & MTF_Kd) ? m->kd : 1.0; ks = (m->valid & MTF_Ks) ? m->ks : 1.0; fprintf(f, "Material { "); if (m->valid & MTF_EMISSION) fprintf(f, "emissiveColor %g %g %g \n", m->emission.r, m->emission.g, m->emission.b); if (m->valid & MTF_AMBIENT) fprintf(f, "ambientColor %g %g %g \n", ka*m->ambient.r, ka*m->ambient.g, ka*m->ambient.b); if (m->valid & MTF_DIFFUSE) fprintf(f, "diffuseColor %g %g %g \n", kd*m->diffuse.r, kd*m->diffuse.g, kd*m->diffuse.b); if (m->valid & MTF_SPECULAR) fprintf(f, "specularColor %g %g %g \n", ks*m->specular.r, ks*m->specular.g, ks*m->specular.b); if (m->valid & MTF_SHININESS) fprintf(f, "shininess %g ", m->shininess); if (m->valid & MTF_ALPHA) fprintf(f, "transparency %g ", 1.0 - m->diffuse.a); fprintf(f, "} #end Material \n"); } if (a->lighting) { LtLight **lp, *l; int i; LM_FOR_ALL_LIGHTS(a->lighting, i,lp) { l = *lp; fprintf(f, "PointLight { on TRUE "); fprintf(f, "color %g %g %g ", l->color.r * l->intensity, l->color.g * l->intensity, l->color.b * l->intensity); fprintf(f, "location %g %g %g }\n", l->position.x,l->position.y,l->position.z); } } } void pushap(Appearance *nap) { struct linkap *newlap = (struct linkap *) malloc(1 * sizeof(struct linkap)); newlap->ap = NULL; newlap->ap = ApCopy(nap, newlap->ap); newlap->prev = toplap; toplap = newlap; } void popap() { struct linkap *oldlap = toplap; toplap = oldlap->prev; ApDelete(oldlap->ap); free(oldlap); } static void traverse(Geom *where) { Geom *new = NULL; Geom *tlist = NULL; Appearance *a, *nap = NULL; Transform T; char usename[16]; char *name = NULL; static int unique = -1; if (!where) return; /* Appearances: We need certain values for our own internal use (shading, diffuse material) so we have to keep a stack of appearances around. But we refrain from printing out the entire contents of the appearance on top of the stack at every level to save both cycles and bandwidth. So we just print out new appearances in doap, secure that Separator nodes will isolate their effects. */ GeomGet(where, CR_APPEAR, &a); if (a) { fprintf(f, "Separator {\n"); doap(a); nap = ApMerge(a, toplap->ap, 0); pushap(nap); } name = GeomName(where); if (!strcmp(name, "polylist")) { /* Might have internal Materials, isolate with Separator */ fprintf(f, "Separator {\n"); plisttoindface(where); fprintf(f, " } # end Separator \n"); } else if (!strcmp(name, "vect")) { /* Might have internal Materials, isolate with Separator */ fprintf(f, "Separator {\n"); plinetoindline(where); fprintf(f, " } # end Separator \n"); } else if (!strcmp(name, "sphere")) { fprintf(f, " Sphere { radius %g }\n", SphereRadius( (Sphere *)where)); } else if (!strcmp(name, "comment")) { if (!strcmp(((Comment *)where)->type, "WWWInline")) { fprintf(f, "WWWInline { name \"%s\" bboxSize 0 0 0 bboxCenter 0 0 0 }\n", ((Comment *)where)->data); } else if (!strcmp(((Comment *)where)->type, "HREF")) { /* no-op. we've already dealt with it at level of its list or inst parent. */ } } else if (!strcmp(name, "list")) { /* must lookahead due to fundamental structural difference between weboogl and vrml: in weboogl, anchors affect siblings and parent. in vrml, anchors affect children. immediate child might be HREF comment, in which case we need to write out a WWWAnchor node up here not down inside of list when we would normally come across it. */ Geom *child = NULL; char *newname; int anchor = 0; new = where; while(new) { GeomGet(new, CR_CAR, &child); newname = GeomName(child); if (newname && !strcmp(newname, "comment") && !strcmp( ((Comment *)child)->type, "HREF")) { fprintf(f, "WWWAnchor { name \"%s\"\n", ((Comment *)child)->data); anchor = 1; } GeomGet(new, CR_CDR, &child); new = child; } /* done with lookahead, now really go through the list */ new = where; while(new) { GeomGet(new, CR_CAR, &child); traverse(child); GeomGet(new, CR_CDR, &child); new = child; } if (anchor) fprintf(f, " } # end WWWAnchor \n"); } else if (!strcmp(name, "inst")) { GeomGet(where, CR_GEOM, &new); if (!new) return; GeomGet(where, CR_TLIST, &tlist); if (!tlist) { /* a single xform */ fprintf(f, "Separator { \n"); GeomGet(where, CR_AXIS, &T); printxform(T); traverse(new); fprintf(f, "} #end Separator\n"); } else { /* multiple xforms We'll DEF the geometry for multiple USEs, but we must output the first xform before DEFing the geometry. NextTransform loops through the list of xforms, after the cryptic but crucial set-up call to GeomIterate. */ GeomIter *it = GeomIterate( (Geom *)tlist, DEEP ); NextTransform( it, T ); fprintf(f, "Separator { \n"); printxform(T); sprintf(usename, "instgeom%d", ++unique); fprintf(f, " DEF %s Separator { ", usename); traverse(new); fprintf(f, " } #end DEF \n } #end Separator \n"); while(NextTransform( it, T )) { fprintf(f, "Separator { \n"); printxform(T); fprintf(f, " USE %s\n } #end Separator \n", usename); } } } else { if ((!strcmp(name, "bezier") || !strcmp(name, "bezierlist")) && bezdice) GeomDice(where, bezdice, bezdice); /* Convert to all other geometric primitives to OFF. */ new = AnyToPL(where, TM_IDENTITY); /* Might have internal Materials, isolate with Separator */ fprintf(f, "Separator { \n"); plisttoindface(new); fprintf(f, " } # end Separator \n"); } if (a) { fprintf(f, " } # end Separator \n"); popap(); } } int main(int argc, char *argv[]) { Geom *g; int flat = 1; f = stdout; while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') { if (argv[1][1] == 'b') { bezdice = atoi(argv[2]); argc--; argv++; } else if (argv[1][1] == 's') { flat = 0; } argc--; argv++; } if(argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') { fprintf(stderr, "\ Usage: %s [filename] -- convert OOGL file to VRML format\n\ Writes to standard output. Reads from stdin if no file specified.\n", argv[0]); exit(1); } pushap(ApCreate(AP_SHADING, flat ? APF_FLAT : APF_SMOOTH, AP_END)); if(argc <= 1) { argv[1] = "-"; } g = strcmp(argv[1], "-") ? GeomLoad(argv[1]) : GeomFLoad(iobfileopen(stdin), "standard input"); fprintf(f, "#VRML V1.0 ascii\n"); fprintf(f, "Separator {\n"); fprintf(f, " ShapeHints {vertexOrdering COUNTERCLOCKWISE faceType CONVEX}\n"); traverse(g); fprintf(f, "} # end final Separator\n"); return 0; } geomview-1.9.5/src/bin/geomutil/oogl2vrml/oogl2vrml2.c0000644000175000017500000004421312310110176017545 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* OOGL to VRML converter * by Tamara Munzner */ #include #include #include "geom.h" #include "transform.h" #include "polylistP.h" #include "vectP.h" #include "sphere.h" #include "commentP.h" #include "plutil.h" #ifdef DEBUG # undef DEBUG # define DEBUG(expr) (expr) #else # define DEBUG(expr) /*nothing*/ #endif FILE *f = NULL; Appearance *ap = NULL; int bezdice = 0; struct linkap { Appearance *ap; struct linkap *prev; }; struct linkap *toplap; static void doap(Appearance *a); static int indent = 0; void fprintfindent(FILE *f, char *fmt, ...) { va_list ap; fprintf(f, "%*s", indent, ""); va_start(ap, fmt); vfprintf(f, fmt, ap); va_end(ap); } void fprintfindentinc(FILE *f, char *fmt, ...) { va_list ap; fprintf(f, "%*s", indent, ""); va_start(ap, fmt); vfprintf(f, fmt, ap); va_end(ap); indent += 2; } void fprintfdecindent(FILE *f, char *fmt, ...) { va_list ap; indent -= 2; fprintf(f, "%*s", indent, ""); va_start(ap, fmt); vfprintf(f, fmt, ap); va_end(ap); indent += 2; } #define PRINT_PADDING(f, padding) \ fprintf((f), "%*s", (int)(indent + (padding)), "") void faceindex(PolyList *plist) { int i,j; Poly *pl = NULL; Vertex *base = plist->vl; for (i = 0, pl = plist->p; i < plist->n_polys; i++, pl++) { for (j = 0; j < pl->n_vertices; j++) { fprintf(f, " %d", (int) (pl->v[j]-base) ); } fprintf(f, " -1"); if (i != plist->n_polys-1) { fprintf(f, ","); if (i & 1) { fprintf(f, "\n"); PRINT_PADDING(f, strlen("coordIndex [")); } } } } void plisttoindface(Geom *pgeom) { PolyList *plist = (PolyList *)pgeom; Poly *pl = NULL; Vertex *v = NULL; int i; int shading = toplap->ap->shading; /* Appearance */ doap(toplap->ap); /* Geometry */ fprintfindentinc(f, "geometry IndexedFaceSet {\n"); fprintfindent(f, "solid FALSE\n"); /* 'cause we don't know */ fprintfindent(f, "ccw TRUE\n"); fprintfindent(f, "convex TRUE\n"); /* is this true? */ fprintfindent(f, "normalPerVertex %s\n", shading == APF_FLAT ? "FALSE" : "TRUE"); fprintfindent(f, "colorPerVertex %s\n", plist->geomflags & PL_HASVCOL ? "TRUE" : "FALSE"); /* Vertices */ fprintfindentinc(f, "coord Coordinate {\n"); fprintfindent(f, "point ["); for (i = 0, v = plist->vl; i < plist->n_verts; i++, v++) { fprintf(f, " %g %g %g", v->pt.x, v->pt.y, v->pt.z); if (i != plist->n_verts-1) { fprintf(f, ","); if (i & 1) { fprintf(f, "\n"); PRINT_PADDING(f, strlen("point [")); } } } fprintfindent(f, "]\n"); fprintfdecindent(f, "}\n"); /* Normals */ fprintfindentinc(f, "normal Normal {\n"); fprintfindent(f, "vector ["); if (shading == APF_FLAT) { PolyListComputeNormals(plist, PL_HASPN); for (i = 0, pl= plist->p; i < plist->n_polys; i++, pl++) { fprintf(f, " %g %g %g", pl->pn.x, pl->pn.y, pl->pn.z); if (i != plist->n_polys-1) { fprintf(f, ","); if (i & 1) { fprintf(f, "\n"); PRINT_PADDING(f, strlen("vector [")); } } } } else if (shading == APF_SMOOTH) { PolyListComputeNormals(plist, PL_HASVN); for (i = 0, v = plist->vl; i < plist->n_verts; i++, v++) { fprintf(f, " %g %g %g", v->vn.x, v->vn.y, v->vn.z); if (i != plist->n_verts-1) { fprintf(f, ","); if (i & 1) { fprintf(f, "\n"); PRINT_PADDING(f, strlen("vector [")); } } } } fprintf(f, " ]"); fprintfdecindent(f, "}\n"); /* Colors */ if (plist->geomflags & PL_HASVCOL && plist->geomflags & PL_HASPCOL) { if (shading == APF_FLAT) { plist->geomflags &= ~PL_HASVCOL; } else { plist->geomflags &= ~PL_HASPCOL; } } /* Appearance diffuse color overrides object colors */ /* We don't rely on the override bit, since Geomview never sets it when saving files. */ if (toplap->ap->mat && toplap->ap->mat->valid & MTF_DIFFUSE) { plist->geomflags &= ~(PL_HASPCOL|PL_HASVCOL); } if (plist->geomflags & PL_HASPCOL) { fprintfindentinc(f, "color Color {\n"); fprintfindent(f, "RGB ["); for (i = 0, pl= plist->p; i < plist->n_polys; i++, pl++) { fprintf(f, " %g %g %g", pl->pcol.r, pl->pcol.g, pl->pcol.b); if (i != plist->n_polys-1) { fprintf(f, ","); if (i & 1) { printf("\n"); PRINT_PADDING(f, strlen("RGB [")); } } } fprintf(f, " ]\n"); fprintfdecindent(f, "}\n"); } else if (plist->geomflags & PL_HASVCOL) { fprintfindentinc(f, "color Color {\n"); fprintfindent(f, "RGB ["); for (i = 0, v = plist->vl; i < plist->n_verts; i++, v++) { fprintf(f, " %g %g %g", v->vcol.r, v->vcol.g, v->vcol.b); if (i != plist->n_verts-1) { fprintf(f, ","); if (i & 1) { printf("\n"); PRINT_PADDING(f, strlen("RGB [")); } } } fprintfindent(f, "]\n"); fprintfdecindent(f, "}\n"); } /* Connectivity, VRML 2 does not need extra-indices for colors and normals, it is able to use the vertex indices. */ fprintfindent(f, "coordIndex ["); faceindex(plist); fprintfindent(f, " ] # end coordIndex\n"); fprintfdecindent(f, "} # end IndexedFaceSet\n"); } void lineindex(Vect *pline) { int i,j; int n = 0; for (i = 0; i < pline->nvec; i++) { for (j = 0; j < pline->vnvert[i]; j++) { fprintf(f, " %d, ", n++); } fprintf(f, " -1,\n "); } } void plinetoindline(Geom *pgeom) { Vect *pline = (Vect *)pgeom; HPoint3 *v = NULL; int i, j, n; /* Appearance */ doap(toplap->ap); /* Vertices */ fprintfindentinc(f, "geometry IndexedLineSet {\n"); fprintfindentinc(f, "coord Coordinate {\n"); fprintfindent(f, "point [\n"); for (i = 0, v = pline->p; i < pline->nvert; i++, v++) { fprintf(f, " %g %g %g", v->x, v->y, v->z); if (i != pline->nvert-1) { fprintf(f, ","); if (i & 1) { fprintf(f,"\n"); PRINT_PADDING(f, strlen("point [")); } } } fprintfindent(f, "\n"); fprintfdecindent(f, "}\n"); /* Colors */ if (toplap->ap->mat && toplap->ap->mat->valid & MTF_EDGECOLOR) pline->ncolor = 0; if (pline->ncolor >= 1) { if (pline->ncolor > 1) fprintfindent(f, "colorPerVertex TRUE\n"); else fprintfindent(f, "colorPerVertex FALSE\n"); fprintfindentinc(f, "color Color {\n"); fprintfindent(f, "RGB ["); for (i = 0; i < pline->ncolor; i++) { fprintf(f, " %g %g %g", pline->c[i].r, pline->c[i].g, pline->c[i].b); if (i != pline->ncolor-1) { fprintf(f, ","); if (i & 1) { printf("\n"); PRINT_PADDING(f, strlen("RGB [")); } } } fprintf(f, " ]\n"); fprintfdecindent(f, "}\n"); } /* Connectivity */ fprintfindent(f, "coordIndex [ \n"); lineindex(pline); fprintfindent(f, " ] # end coordIndex \n "); /* appearance edgecolor overrides per-vertex colors */ if (pline->ncolor > 1) { fprintfindent(f, "colorIndex [\n"); n = -1; for (i = 0; i < pline->nvec; i++) { if (pline->vncolor[i] == 1) n++; for (j = 0; j < pline->vnvert[i]; j++) { fprintf(f, " %d, ", n); if (pline->vncolor[i] > 1) n++; } fprintf(f, " -1,\n "); } fprintfindent(f, "] # end materialIndex \n "); } fprintfdecindent(f, "} # end IndexedLineSet \n "); } static double det(double (*T)[3]) { return (T[0][0]*T[1][1]*T[2][2] + T[1][0]*T[2][1]*T[0][2] + T[2][0]*T[0][1]*T[1][2] - T[2][0]*T[1][1]*T[0][2] - T[1][0]*T[0][1]*T[2][2] - T[0][0]*T[2][1]*T[1][2]); } static double getaxis(double (*mat)[3], double *axis) { double tmp[3][3], ortho[3], tortho[3], det, max = 0.0; int i, j, maxi = 0, maxj = 0; int i0, i1, i2, j0, j1; for (i = 0; i < 3; i++) { tmp[i][i] = mat[i][i] - 1.0; for (j = 0; j < 3; j++) { if (i != j) { tmp[i][j] = mat[i][j]; } i0 = (i+1) % 3; i1 = (i+2) % 3; j0 = (j+1) % 3; j1 = (j+2) % 3; det = tmp[i0][j0]*tmp[i1][j1] - tmp[i1][j0]*tmp[i0][j1]; if (fabs(det) > fabs(max)) { max = det; maxi = i; maxj = j; } } } i0 = (maxi+1) % 3; i1 = (maxi+2) % 3; j0 = (maxj+1) % 3; j1 = (maxj+2) % 3; axis[maxj] = 1.0; det = max; if (fabs(det) < 1e-12) { axis[j0] = axis[j1] = 0.0; return 0.0; } axis[j0] = (+ tmp[i1][j1]*tmp[i0][maxj] - tmp[i0][j1]*tmp[i1][maxj]) / det; axis[j1] = (- tmp[i1][j0]*tmp[i0][maxj] + tmp[i0][j0]*tmp[i1][maxj]) / det; i0 = 0; i1 = 1; i2 = 2; if (fabs(axis[i0]) < fabs(axis[i1])) { i = i0; i0 = i1; i1 = i; } if (fabs(axis[i0]) < fabs(axis[i2])) { i = i0; i0 = i2; i2 = i; } if (fabs(axis[i1]) < fabs(axis[i2])) { i = i1; i1 = i2; i2 = i; } axis[0] /= axis[i0]; axis[1] /= axis[i0]; axis[2] /= axis[i0]; ortho[i0] = 0.0; ortho[i2] = 1.0; if (fabs(axis[i1]) > 1e-12) { ortho[i1] = -axis[i2]/axis[i1]; } else { ortho[i1] = 1.0; } #define SCP(v, w) (v[0]*w[0]+v[1]*w[1]+v[2]*w[2]) #define NRM2(v) SCP(v,v) tortho[0] = SCP(mat[0], ortho); tortho[1] = SCP(mat[1], ortho); tortho[2] = SCP(mat[2], ortho); return acos(SCP(ortho,tortho)/NRM2(ortho)); } void printxform(Transform T) { int i, j; double scale; double mat[3][3]; double axis[3], angle; if (T && memcmp(T, TM_IDENTITY, sizeof(Transform)) != 0) { /* * Brain-Dead (tm) VRML 2.0 doesn't know about MatrixTransform. * That's very sad. * * We only support uniform scalings, rotations and translations * Anything fancy created by the transformer yields undefined * results. */ for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) mat[i][j] = T[i][j]; scale = pow(det(mat), 1.0/3.0); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { mat[i][j] /= scale; } } angle = getaxis(mat, axis); fprintfindent(f, "scale %g %g %g\n", scale, scale, scale); fprintfindent(f, "rotation %g %g %g %g\n", axis[0], axis[1], axis[2], angle); fprintfindent(f, "translation %g %g %g\n", T[3][0], T[3][1], T[3][2]); } } static void doap(Appearance *a) { if (a->mat && a->mat->valid) { Material *m = a->mat; float ka, kd, ks; ka = (m->valid & MTF_Ka) ? m->ka : 1.0; kd = (m->valid & MTF_Kd) ? m->kd : 1.0; ks = (m->valid & MTF_Ks) ? m->ks : 1.0; fprintfindentinc(f, "appearance Appearance {\n"); fprintfindentinc(f, "material Material {\n"); if (m->valid & MTF_AMBIENT) fprintfindent(f, "ambientIntensity %g\n", ka); if (m->valid & MTF_DIFFUSE) fprintfindent(f, "diffuseColor %g %g %g\n", kd*m->diffuse.r, kd*m->diffuse.g, kd*m->diffuse.b); if (m->valid & MTF_EMISSION) fprintfindent(f, "emissiveColor %g %g %g\n", m->emission.r, m->emission.g, m->emission.b); if (m->valid & MTF_SPECULAR) fprintfindent(f, "specularColor %g %g %g\n", ks*m->specular.r, ks*m->specular.g, ks*m->specular.b); if (m->valid & MTF_SHININESS) fprintfindent(f, "shininess %g\n", m->shininess/128.0); if (m->valid & MTF_ALPHA) fprintfindent(f, "transparency %g\n", 1.0 - m->diffuse.a); fprintfdecindent(f, "} #end Material \n"); fprintfdecindent(f, "} # end Appearance\n"); } } #if 0 static void dolight(Appearance *a) { if (a->lighting) { LtLight **lp, *l; int i; LM_FOR_ALL_LIGHTS(a->lighting, i,lp) { l = *lp; fprintfindentinc(f, "PointLight {\n"); fprintfindent(f, "on TRUE\n"); fprintfindent(f, "color %g %g %g\n", l->color.r, l->color.g, l->color.b); fprintfindent(f, "intensity %g\n", l->intensity); fprintfindent(f, "location %g %g %g\n", l->position.x,l->position.y,l->position.z); fprintfdecindent(f, "}\n"); } } } #endif void pushap(Appearance *nap) { struct linkap *newlap = (struct linkap *) malloc(1 * sizeof(struct linkap)); newlap->ap = NULL; newlap->ap = ApCopy(nap, newlap->ap); newlap->prev = toplap; toplap = newlap; } void popap() { struct linkap *oldlap = toplap; toplap = oldlap->prev; ApDelete(oldlap->ap); free(oldlap); } static void traverse(Geom *where) { Geom *new = NULL; Geom *tlist = NULL; Appearance *a, *nap = NULL; Transform T; char usename[16]; char *name = NULL; static int unique = -1; if (!where) return; /* Appearances: We need certain values for our own internal use (shading, diffuse material) so we have to keep a stack of appearances around. But we refrain from printing out the entire contents of the appearance on top of the stack at every level to save both cycles and bandwidth. So we just print out new appearances in doap, secure that Separator nodes will isolate their effects. */ GeomGet(where, CR_APPEAR, &a); if (a) { nap = ApMerge(a, toplap->ap, 0); pushap(nap); } name = GeomName(where); if (!strcmp(name, "polylist")) { /* Might have internal Materials, isolate with Separator */ fprintfindentinc(f, "Shape {\n"); plisttoindface(where); fprintfdecindent(f, "} # end Shape\n"); } else if (!strcmp(name, "vect")) { /* Might have internal Materials, isolate with Separator */ fprintfindentinc(f, "Shape {\n"); plinetoindline(where); fprintfdecindent(f, " } # end Shape \n"); } else if (!strcmp(name, "sphere")) { fprintfindent(f, " Sphere { radius %g }\n", SphereRadius( (Sphere *)where)); } else if (!strcmp(name, "comment")) { if (!strcmp(((Comment *)where)->type, "WWWInline")) { fprintfindent(f, "Inline { url \"%s\" bboxSize 0 0 0 bboxCenter 0 0 0 }\n", ((Comment *)where)->data); } else if (!strcmp(((Comment *)where)->type, "HREF")) { /* no-op. we've already dealt with it at level of its list or inst parent. */ } } else if (!strcmp(name, "list")) { /* must lookahead due to fundamental structural difference between weboogl and vrml: in weboogl, anchors affect siblings and parent. in vrml, anchors affect children. immediate child might be HREF comment, in which case we need to write out a WWWAnchor node up here not down inside of list when we would normally come across it. */ Geom *child = NULL; char *newname; int anchor = 0; new = where; while(new) { GeomGet(new, CR_CAR, &child); newname = GeomName(child); if (newname && !strcmp(newname, "comment") && !strcmp( ((Comment *)child)->type, "HREF")) { fprintfindentinc(f, "Anchor { url \"%s\"\n", ((Comment *)child)->data); anchor = 1; } GeomGet(new, CR_CDR, &child); new = child; } /* done with lookahead, now really go through the list */ new = where; while(new) { GeomGet(new, CR_CAR, &child); traverse(child); GeomGet(new, CR_CDR, &child); new = child; } if (anchor) fprintfdecindent(f, " } # end Anchor \n"); } else if (!strcmp(name, "inst")) { GeomGet(where, CR_GEOM, &new); if (!new) return; GeomGet(where, CR_TLIST, &tlist); if (!tlist) { /* a single xform */ fprintfindentinc(f, "Transform {\n"); GeomGet(where, CR_AXIS, &T); printxform(T); fprintfindentinc(f, "children [\n"); traverse(new); fprintfdecindent(f, "] # children\n"); fprintfdecindent(f, "} # Transform\n"); } else { /* multiple xforms We'll DEF the geometry for multiple USEs, but we must output the first xform before DEFing the geometry. NextTransform loops through the list of xforms, after the cryptic but crucial set-up call to GeomIterate. */ GeomIter *it = GeomIterate( (Geom *)tlist, DEEP ); NextTransform( it, T ); fprintfindentinc(f, "Transform {\n"); printxform(T); sprintf(usename, "instgeom%d", ++unique); fprintfindent(f, "children DEF %s Group { ", usename); traverse(new); fprintfdecindent(f, "} #end Group DEF\n"); fprintfdecindent(f, "} #end Transform \n"); while(NextTransform( it, T )) { fprintfindentinc(f, "Transform {\n"); printxform(T); fprintfindent(f, "children USE %s\n", usename); fprintfdecindent(f, "} # Transform\n"); } } } else { if ((!strcmp(name, "bezier") || !strcmp(name, "bezierlist")) && bezdice) GeomDice(where, bezdice, bezdice); /* Convert to all other geometric primitives to OFF. */ new = AnyToPL(where, TM_IDENTITY); /* Might have internal Materials, isolate with Separator */ fprintfindentinc(f, "Shape {\n"); plisttoindface(new); fprintfdecindent(f, "} # end Shape\n"); } if (a) { popap(); } } int main(int argc, char *argv[]) { Geom *g; int flat = 1; f = stdout; while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') { if (argv[1][1] == 'b') { bezdice = atoi(argv[2]); argc--; argv++; } else if (argv[1][1] == 's') { flat = 0; } argc--; argv++; } if(argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') { fprintf(stderr, "\ Usage: %s [filename] -- convert OOGL file to VRML format\n\ Writes to standard output. Reads from stdin if no file specified.\n", argv[0]); exit(1); } pushap(ApCreate(AP_SHADING, flat ? APF_FLAT : APF_SMOOTH, AP_END)); if(argc <= 1) { argv[1] = "-"; } g = strcmp(argv[1], "-") ? GeomLoad(argv[1]) : GeomFLoad(iobfileopen(stdin), "standard input"); fprintfindent(f, "#VRML V2.0 utf8\n\n"); fprintfindentinc(f, "Group {\n"); fprintfindentinc(f, "children [\n"); traverse(g); fprintfdecindent(f, "] # children\n"); fprintfdecindent(f, "} # Group\n"); return 0; } geomview-1.9.5/src/bin/geomutil/oogl2vrml/oogl2vrml.1gv0000644000175000017500000000113512310110176017732 00000000000000.\" Hey, EMACS: -*- nroff -*- .TH OOGL2VRML 1gv "February 23, 2001" .SH NAME oogl2vrml \- convert OOGL to VRML .SH SYNOPSIS .B oogl2vrml .BI [-b " N" ] .BI [-s] .BI [ file ] .SH DESCRIPTION This manual page documents briefly the .B oogl2vrml command. .PP .B oogl2vrml Convert OOGL file to VRML format. Writes to standard output. Reads from stdin if no file specified. .SH SEE ALSO .BR geomview (1). .BR vrml2oogl (1). .SH AUTHOR This manual page was written by Steve Robbins , for the Debian GNU/Linux system (but may be used by others). geomview-1.9.5/src/bin/geomutil/ucd/0000755000175000017500000000000012310165604014306 500000000000000geomview-1.9.5/src/bin/geomutil/ucd/Makefile.in0000644000175000017500000006103712310165552016304 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = anytoucd$(EXEEXT) ucdtooff$(EXEEXT) subdir = src/bin/geomutil/ucd DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am_anytoucd_OBJECTS = anytoucd.$(OBJEXT) make_frame.$(OBJEXT) \ stack.$(OBJEXT) anytoucd_OBJECTS = $(am_anytoucd_OBJECTS) anytoucd_LDADD = $(LDADD) am__DEPENDENCIES_1 = anytoucd_DEPENDENCIES = $(am__DEPENDENCIES_1) 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 = am_ucdtooff_OBJECTS = ucdtooff.$(OBJEXT) ucdtooff_OBJECTS = $(am_ucdtooff_OBJECTS) ucdtooff_LDADD = $(LDADD) ucdtooff_DEPENDENCIES = $(am__DEPENDENCIES_1) 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(anytoucd_SOURCES) $(ucdtooff_SOURCES) DIST_SOURCES = $(anytoucd_SOURCES) $(ucdtooff_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = @default_includes@ LDADD = ${OOGLLIB} DEPENDENCIES = ${OOGLLIB} #AM_LDFLAGS = -rpath $(libdir) man_MANS = anytoucd.1gv ucdtooff.1gv anytoucd_SOURCES = anytoucd.c make_frame.c stack.c vec4.h ucdtooff_SOURCES = ucdtooff.c vec4.h EXTRA_DIST = ucd_defs.h $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/ucd/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/ucd/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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 \ || test -f $$p1 \ ; 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(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: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list anytoucd$(EXEEXT): $(anytoucd_OBJECTS) $(anytoucd_DEPENDENCIES) $(EXTRA_anytoucd_DEPENDENCIES) @rm -f anytoucd$(EXEEXT) $(AM_V_CCLD)$(LINK) $(anytoucd_OBJECTS) $(anytoucd_LDADD) $(LIBS) ucdtooff$(EXEEXT): $(ucdtooff_OBJECTS) $(ucdtooff_DEPENDENCIES) $(EXTRA_ucdtooff_DEPENDENCIES) @rm -f ucdtooff$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ucdtooff_OBJECTS) $(ucdtooff_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anytoucd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make_frame.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ucdtooff.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-man 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-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ 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 mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 # 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: geomview-1.9.5/src/bin/geomutil/ucd/Makefile.am0000644000175000017500000000047112310110176016256 00000000000000INCLUDES = @default_includes@ LDADD = ${OOGLLIB} DEPENDENCIES = ${OOGLLIB} #AM_LDFLAGS = -rpath $(libdir) man_MANS = anytoucd.1gv ucdtooff.1gv bin_PROGRAMS = anytoucd ucdtooff anytoucd_SOURCES = anytoucd.c make_frame.c stack.c vec4.h ucdtooff_SOURCES = ucdtooff.c vec4.h EXTRA_DIST = ucd_defs.h $(man_MANS) geomview-1.9.5/src/bin/geomutil/ucd/anytoucd.c0000644000175000017500000002732712310110176016225 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* File: anytoucd.c: Author: Charlie Gunn originally read a OOGL object on stdin, and write ucd format on stdout. */ #include "vec4.h" #include "geom.h" #include "3d.h" #include "polylistP.h" #include "plutil.h" #include #include "time.h" #define MAXV 64 /* #define DEBUG */ extern int push(Poly *PP); /* From stack.c */ extern Poly *getstack(); extern int make_tform(HPoint3 *p1, HPoint3 *p2, HPoint3 *p3, Transform m); extern int initstack(void); extern int getsize(void); #define CAVE 1 #define VEX 0 static int debug = 0; #define INSIDE(line, point) \ ((line.a*(point)->x + line.b*(point)->y + line.c) <= 0) #define INSIDE2(line, point) \ (line.a*(point)->x + line.b*(point)->y + line.c) struct polygon { int nv; unsigned int new:1; Vertex *vlist[MAXV]; HPoint3 vlistxy[MAXV]; short inout[MAXV]; Transform to_xy; } currpoly; struct line { float a,b,c,angle; }; typedef struct polygon polygon; typedef struct line line; void myconvert(CP, cp) Poly *CP; polygon *cp; { int i; cp->nv = CP->n_vertices; for (i=0; inv; ++i) cp->vlist[i] = CP->v[i]; cp->new = 1; } polygon * chopup (pp, PP) polygon *pp; Poly *PP; { int n, i ; int convex, orient; line edges[MAXV]; double dangle, sum; polygon *newpoly; if (debug){ fprintf(stderr,"Entering chopup with %d vertices \n",pp->nv); for (i=0; inv; ++i) fprintf(stderr,"%f %f %f \n",pp->vlist[i]->pt.x, pp->vlist[i]->pt.y, pp->vlist[i]->pt.z); } if (pp->nv <= 4 && pp->nv > 1) { PP->n_vertices = pp->nv; for (i=0; inv; ++i) PP->v[i] = pp->vlist[i]; if (push(PP) == 0) OOGLError(1,"anytoucd: unable to push polygon\n"); return(NULL); } else if (pp->nv == 1) { return(NULL); } else { /* something to chop */ newpoly = OOGLNew(polygon); n = pp->nv; if (pp->new) { /* need to work in the x,y plane, so compute approp. tforms */ for (i=0; ivlist[i]->pt, &pp->vlist[(i+1)%n]->pt, &pp->vlist[(i+2)%n]->pt, pp->to_xy) >= 0) break;; TmInvert(pp->to_xy, pp->to_xy); for (i=0; inv; ++i) HPt3Transform(pp->to_xy, &pp->vlist[i]->pt, &pp->vlistxy[i]); pp->new = 0; } { double dx, dy; for (i=0; inv; ++i) { dx = pp->vlistxy[(i+1)%n].x - pp->vlistxy[i].x; dy = pp->vlistxy[(i+1)%n].y - pp->vlistxy[i].y; edges[i].a = dy; edges[i].b = -dx; edges[i].c = -(edges[i].a*pp->vlistxy[i].x+edges[i].b*pp->vlistxy[i].y); edges[i].angle = atan2(dy,dx); if (debug) fprintf(stderr,"edge %d: angle %f\n",i,edges[i].angle); } } /* armed with this info, identify concave and convex bndy pts*/ for (sum = 0.0, i=0; inv; ++i) { dangle = edges[i].angle - edges[(i-1+n)%n].angle ; /* clip to (-PI, +PI) */ while (dangle < -PI) dangle += 2*PI; while (dangle > PI) dangle -= 2*PI; sum += dangle; if (dangle > 0) pp->inout[i] = VEX; else pp->inout[i] = CAVE; } if (debug) fprintf(stderr,"Total angle change is %f\n",sum); if (sum > 0 ) orient = 1; else orient = -1; for (convex = 1, i=0; inv; ++i) { if (orient == -1) { pp->inout[i] = 1 - pp->inout[i]; edges[i].a *= -1; edges[i].b *= -1; edges[i].c *= -1; } if (pp->inout[i] == CAVE) convex = 0; } if (debug) if (convex) fprintf(stderr,"Polygon is convex\n"); /* next look for triangles to chop off */ { line cutcorner; double dx, dy; int cutoff, j, jj, oc, nc; for (nc = 0, oc=0; ocnv-1; ++oc, ++nc) { /* copy out current vertex */ newpoly->vlist[nc] = pp->vlist[oc]; HPt3Copy(&pp->vlistxy[oc], &newpoly->vlistxy[nc]); if (pp->inout[(oc+1)%n] == VEX) { cutoff = 1; /* default is to cut if off */ if (!convex) { dx = pp->vlistxy[(oc+2)%n].x - pp->vlistxy[oc].x; dy = pp->vlistxy[(oc+2)%n].y - pp->vlistxy[oc].y; /* orient this line to run from v2 to v0, to agree with edges */ cutcorner.a = -dy*orient; cutcorner.b = dx*orient; cutcorner.c = -(cutcorner.a*pp->vlistxy[(oc+2)%n].x+cutcorner.b*pp->vlistxy[(oc+2)%n].y); cutcorner.angle = -atan2(dy,dx); /* check for concave pts inside this triangle */ /* don't check the vertices of this triangle */ for ( j=0, jj=oc+3; jnv-3 && cutoff; ++j,++jj) { if (jj == pp->nv) jj = 0; if ( pp->inout[jj] == CAVE ) { if (INSIDE(cutcorner,&pp->vlistxy[jj]) && INSIDE(edges[oc], &pp->vlistxy[jj]) && INSIDE(edges[(oc+1)%n], &pp->vlistxy[jj])) { if (debug) fprintf(stderr,"vertex %d is inside cutoff corner %d %d %d\n",jj, oc, oc+1, oc+2); cutoff = 0; } } } } if (cutoff) /* can cut this corner off */ { int iv0, iv1, iv2, iv3; if (convex & (oc < pp->nv-2 ) ) /* can cut off 4 vertices */ { iv0 = oc; iv1 = (oc+1)%n; iv2 = (oc+2)%n; iv3 = (oc+3)%n; PP->n_vertices = 4; PP->v[0] = pp->vlist[iv0]; PP->v[1] = pp->vlist[iv1]; PP->v[2] = pp->vlist[iv2]; PP->v[3] = pp->vlist[iv3]; if (push(PP) == 0) OOGLError(1,"anytoucd: unable to push polygon\n"); oc++; oc++; } else { iv0 = oc; iv1 = (oc+1)%n; iv2 = (oc+2)%n; PP->n_vertices = 3; PP->v[0] = pp->vlist[iv0]; PP->v[1] = pp->vlist[iv1]; PP->v[2] = pp->vlist[iv2]; if (push(PP) == 0) OOGLError(1,"anytoucd: unable to push polygon\n"); oc++; } } } } while (oc < pp->nv) { newpoly->vlist[nc] = pp->vlist[oc]; HPt3Copy(&pp->vlistxy[oc], &newpoly->vlistxy[nc]); oc++; nc++; } newpoly->new = 0; newpoly->nv = nc; /* if nothing got chopped, or if what's left * has only 1 or 2 vertices */ if (newpoly->nv == pp->nv || newpoly->nv <= 2) { /* fprintf(stderr,"chopup:Unable to cut a corner\n"); */ OOGLFree(newpoly); return(NULL); } else return(newpoly); } } } Poly *CP, thisPoly; int main(int argc, char **argv) { polygon *ncp, *cp; int pcountold; Geom *thisgeom; PolyList *thispl; Vertex *vlist[4]; Transform id; TmIdentity(id); thisgeom = GeomFLoad(iobfileopen(stdin), NULL); thispl = (PolyList *)AnyToPL(thisgeom, id); if (initstack() == 0) OOGLError(1,"anytoucd: unable to init stack\n"); cp = OOGLNew(polygon); CP = &thisPoly; /* at most 4 vertices in each face */ for (pcountold = 0; pcountold < thispl->n_polys; ++pcountold) { myconvert(&thispl->p[pcountold], cp); *CP = thispl->p[pcountold]; CP->v = vlist; (void)OOGLNew(polygon); while ( (ncp = chopup(cp, CP)) != NULL ) { if (debug) fprintf(stderr,"Chop up: calling again\n"); OOGLFree(cp); cp = ncp; } } /* now get the list of polygons from the stack */ thispl->n_polys = getsize(); thispl->p = getstack(); /* now print out the stuff in ucd format */ /* GeomFSave(thispl, stdout, NULL); */ { FILE *fp = stdout; int num_nodes, num_node_data_comp = 0, node_data_comp[2], num_cells, num_cell_data_comp = 0, total_node_comp = 0, total_cell_comp = 0, cell_data_comp[2], i,n; Poly *p; Vertex *v, **vp; num_nodes = thispl->n_verts; num_cells = thispl->n_polys; if (thispl->geomflags & PL_HASVCOL) { node_data_comp[0] = 4; /* ColorA's : 4 component */ num_node_data_comp += 1; total_node_comp += 4; } if (thispl->geomflags & PL_HASVN) { node_data_comp[num_node_data_comp] = 3; num_node_data_comp += 1; total_node_comp += 3; } #ifdef FOURD if (thispl->geomflags & VERT_4D) { node_data_comp[num_node_data_comp] = 1; /* ColorA's : 4 component */ num_node_data_comp += 1; total_node_comp += 1; } #endif if (thispl->geomflags & PL_HASPCOL) { cell_data_comp[0] = 4; /* ColorA's : 4 component */ num_cell_data_comp += 1; total_cell_comp += 4; } if (thispl->geomflags & PL_HASPN) { cell_data_comp[num_cell_data_comp] = 3; num_cell_data_comp += 1; total_cell_comp += 3; } { char *timestring; long mytime; time_t myt; myt = time(&mytime); timestring = ctime(&myt); fprintf(fp,"# Created by anytoucd on %s \n",timestring); } fprintf(fp,"%d %d %d %d 0\n",num_nodes, num_cells, total_node_comp, total_cell_comp); /* write out vertices */ /* what to do about 4D vertices? */ for (v = thispl->vl, i=0; in_verts; ++i, ++v) #ifdef FOURD fprintf(fp,"%d %g %g %g\n",i+1,v->pt.x, v->pt.y, v->pt.z); #else { float w = v->pt.w; if (w) w = 1.0/w; fprintf(fp,"%d %g %g %g\n",i+1,w*v->pt.x, w*v->pt.y, w*v->pt.z); } #endif /* write out faces */ for (i=0, p = thispl->p; in_polys; ++i, ++p) { fprintf(fp,"%d 1 ",i+1); n = p->n_vertices; if (n==2) fprintf(fp,"line "); /* is this right? */ else if (n==3) fprintf(fp,"tri "); else if (n==4) fprintf(fp, "quad "); /* else signal error */ else return 1; for(vp = p->v; --n >= 0; vp++) fprintf(fp, "%d ", (int)((*vp) - thispl->vl + 1)); fprintf(fp,"\n"); } if (num_node_data_comp) { fprintf(fp,"%d ", num_node_data_comp); for (i=0; igeomflags & PL_HASVCOL) fprintf(fp,"rgba, NULL\n"); if (thispl->geomflags & PL_HASVN) fprintf(fp,"normal, NULL\n"); if (thispl->geomflags & VERT_4D) fprintf(fp,"w, NULL\n"); for (v = thispl->vl, i=0; in_verts; ++i, ++v) { /* print vertex colors */ fprintf(fp,"%d ", i+1); if (thispl->geomflags & PL_HASVCOL) { fprintf(fp,"%g %g %g %g", v->vcol.r, v->vcol.g, v->vcol.b, v->vcol.a); } /* print vertex normals */ if (thispl->geomflags & PL_HASVN) { fprintf(fp," %g %g %g", v->vn.x, v->vn.y, v->vn.z); } #ifdef FOURD /* print fourth coordinate if present */ if (thispl->geomflags & VERT_4D) { fprintf(fp," %g", v->pt.w); } #endif fprintf(fp,"\n"); } } /* now process cell data */ if (num_cell_data_comp) { fprintf(fp,"%d ", num_cell_data_comp); for (i=0; igeomflags & PL_HASPCOL) fprintf(fp,"rgba, NULL\n"); if (thispl->geomflags & PL_HASPN) fprintf(fp,"normal, NULL\n"); for (p = thispl->p, i=0; in_polys; ++i, ++p) { fprintf(fp,"%d ",i+1); /* print face colors */ if (thispl->geomflags & PL_HASPCOL) { fprintf(fp," %g %g %g %g", p->pcol.r, p->pcol.g, p->pcol.b, p->pcol.a); } /* print face normals */ if (thispl->geomflags & PL_HASPN) { fprintf(fp," %g %g %g", p->pn.x, p->pn.y, p->pn.z); } fprintf(fp,"\n"); } } } return 0; } geomview-1.9.5/src/bin/geomutil/ucd/make_frame.c0000644000175000017500000000601512310110176016455 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "transform.h" #include "hpoint3.h" #include "vec4.h" int make_rotation(HPoint3 *v1, HPoint3 *v2, Transform m); int make_tform(HPoint3 *p1, HPoint3 *p2, HPoint3 *p3, Transform m) /* Generate a Euclidean isometry which moves (0,0,0) -> p1. Furthermore, the vector (1,0,0) will go a vector tx based at p1 and ending at p2. the vector (0,1,0) will go a vector ty based at p1, perpendicular to tx, and lying in the plane of p1-p2-p3, in the "direction" of p3. the vector (0,0,1) will go a vector tz based at p1, perpendicular to tx and ty. The rotational part is computed by make_rotation. See comments there */ { HPoint3 nv1, nv2; Transform trans; VSUB3(p2, p1, &nv1); VSUB3(p3, p2, &nv2); nv1.w = 1.0; nv2.w = 1.0; NORMALIZE3(&nv1); NORMALIZE3(&nv2); if ( !make_rotation(&nv1, &nv2, m)) /* if collinear, use most recent rotation */ { #ifdef DEBUG fprintf(stderr,"Non-independent vectors: make_rotation\n"); #endif return(-1); } /* compute translation to take p1->(0,0,0) */ TmTranslate(trans, p1->x, p1->y, p1->z); /* first do the rotation, then the translation */ TmConcat(m, trans, m); return(0); } /* make rotation that takes (1,0,0) to v1; and (0,1,0) to the orthog. proj of v2 onto the perpendicular subspace of v1. Return (0) if v1 and v2 are collinear. */ int make_rotation(v1, v2, m) HPoint3 *v1, *v2; Transform m; { double a; HPoint3 t1, t2; a = VDOT3(v1, v2); if (a > .9999 || a < -.9999) return(0); t1.x = v1->x * a; t1.y = v1->y * a; t1.z = v1->z * a; VSUB3(v2, &t1, &t2) /* now t2 is orthogonal to v1 */ NORMALIZE3(&t2); TmIdentity(m); m[0][0] = v1->x; m[0][1] = v1->y; m[0][2] = v1->z; m[1][0] = t2.x; m[1][1] = t2.y; m[1][2] = t2.z; /* last row is cross product of the first two rows */ m[2][0] = v1->y*t2.z - v1->z*t2.y; m[2][1] = v1->z*t2.x - v1->x*t2.z; m[2][2] = v1->x*t2.y - v1->y*t2.x; return(1); } geomview-1.9.5/src/bin/geomutil/ucd/stack.c0000644000175000017500000000377412310110176015504 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "polylistP.h" static int BlockSize, array_size; static Poly *mystack, *stackptr; static int count = 0, debug = 0; int initstack(void) { array_size = 1; BlockSize = 1024; count = 0; if ((mystack = OOGLNewN (Poly, BlockSize )) == (Poly *) NULL) return(0); stackptr = mystack; return(1); } int push(pp) Poly *pp; { int i; if (stackptr >= &mystack[BlockSize*array_size]) { if (debug) fprintf(stderr,"allocating again: size is now %d\n",array_size*BlockSize); array_size = array_size*2; if ((mystack = OOGLRenewN(Poly,mystack, array_size*BlockSize)) == (Poly *) NULL) return (0); stackptr = &mystack[count]; } *stackptr = *pp; if ((stackptr->v = OOGLNewN(Vertex *, pp->n_vertices)) == (Vertex **) NULL) return(0); for (i=0; in_vertices; ++i) stackptr->v[i] = pp->v[i]; stackptr++; count++; return(1); } int getsize(void) { return(count); } Poly * getstack() { return(mystack); } geomview-1.9.5/src/bin/geomutil/ucd/vec4.h0000644000175000017500000000244412310110176015236 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #define VSUB3(p0, p1, p2) \ { (p2)->x = (p1)->x - (p0)->x; \ (p2)->y = (p1)->y - (p0)->y; \ (p2)->z = (p1)->z - (p0)->z; } #define VDOT3(p0, p1) \ ((p0)->x*(p1)->x + (p0)->y*(p1)->y + (p0)->z*(p1)->z) #define NORMALIZE3(xx) \ {float x = sqrt((xx)->x*(xx)->x + (xx)->y*(xx)->y +(xx)->z*(xx)->z); \ if (x == 0) x = 1.0; \ x = 1.0/x; \ (xx)->x *= x; (xx)->y *= x; (xx)->z *= x;} geomview-1.9.5/src/bin/geomutil/ucd/ucdtooff.c0000644000175000017500000002615212310110176016203 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #ifdef HAVE_CONFIG_H # include "config.h" #endif /* File: anytoucd.c: Author: Charlie Gunn originally read a OOGL object on stdin, and write ucd format on stdout. */ #include "vec4.h" #include "geom.h" #include "ooglutil.h" #include "3d.h" #include "polylistP.h" #include "plutil.h" #include #include #include "time.h" /* #define DEBUG */ typedef struct { int id; HPoint3 v; } ucdvert; typedef struct { int id; int m; int n; int faces; int vlist[8]; } ucdpoly; #define UCD_NORMAL 1 #define UCD_RGBA 2 #define UCD_RGB 3 #define UCD_Z 4 #define UCD_NUMDATAFIELDS 8 /* Fool some Linux distros which are too eager to improve the quality * of source code and turn on FORTIFY_SOURCE by default for the * C-compiler gcc. */ #if HAVE_VFSCANF # if defined(__GNUC__) && __GNUC__ >= 3 static int ign_fscanf(FILE *file, const char *format, ...) __attribute__((format(scanf, 2, 3))); # endif static int ign_fscanf(FILE *file, const char *format, ...) { int result; va_list ap; va_start(ap, format); result = vfscanf(file, format, ap); va_end(ap); return result; } #else # define ign_fscanf fscanf #endif int gettype(str) char *str; { if (strcmp(str, "normal") == 0) return UCD_NORMAL; else if (strcmp(str, "rgba") == 0) return UCD_RGBA; else if (strcmp(str, "rgb") == 0) return UCD_RGB; else return(0); } int nodeidtoindex(id, v, num_nodes) int id; ucdvert *v; int num_nodes; { int i; for (i=0; i= 0) printf("%d ", vertlist[j++]); if(plflags & PL_HASPCOL) printf("\t%.3g %.3g %.3g %.3g\n", color[i].r,color[i].g,color[i].b,color[i].a); else printf("\n"); } exit(0); } geomview-1.9.5/src/bin/geomutil/ucd/ucd_defs.h0000644000175000017500000013457612310110176016165 00000000000000/* @(#)ucd_defs.h 7.7 Stardent 92/03/20 */ /* Copyright (c) 1989 by Stardent Computer Inc. All Rights Reserved This software comprises unpublished confidential information of Stardent Computer Inc. and may not be used, copied or made available to anyone, except in accordance with the license under which it is furnished. This file is under sccs control at AVS in: @europa/sccs1.p/avs/include/s.ucd_defs.h */ /*#ifdef SX*/ /* I don't like to see port-specific differences like this. */ /* KCI thought it was necessary for SX-3. */ /* See if it causes trouble on others. */ # include /*#endif SX*/ /*--------------------------- Cell Type Definitions ---------------------------*/ #define UCD_NTYPES 8 #define UCD_NUM_CELL_TYPES 8 #define UCD_POINT 0 #define UCD_LINE 1 #define UCD_TRIANGLE 2 #define UCD_QUADRILATERAL 3 #define UCD_TETRAHEDRON 4 #define UCD_PYRAMID 5 #define UCD_PRISM 6 #define UCD_HEXAHEDRON 7 #define UCD_MAX_NODE_PER_CELL 20 /*--------------------------- Miscellaneous Defines ---------------------------*/ #define UCD_MATERIAL_IDS 0x1 #define UCD_NODE_NAMES 0x2 #define UCD_CELL_NAMES 0x4 #define UCD_CELL_TYPES 0x8 #define UCD_MID_EDGES 0x10 #define UCD_CHAR 0x20 #define UCD_INT 0x40 #define UCD_LABEL_LEN 1024 #define UCD_MAX_COMPONENTS 50 #define UCD_MAX_VECLEN 9 /*--------------------------- Cell Type Variables ---------------------------*/ extern int UCD_num_nodes[]; /* number of nodes in a cell */ extern int UCD_num_mid_nodes[]; /* number of nodes in a cell */ /* with mid-edge nodes */ extern int UCD_num_faces[]; /* number of faces in a cell */ /*----------------------------------------- Unstructured Cell Data Type Definitions -----------------------------------------*/ typedef union { /* name union */ char *c; /* character string for label names */ int i; /* integer for numerical names */ } UCD_name; /*--------------------------------------- NOTE: in the util_flag field, the two rightmost bits are reserved for internal usage. -----------------------------------------*/ typedef struct UCD_structure_ { /*--------- Structure Header Information ---------*/ char *name; /* structure name */ int name_flag; /* are node/cell names chars or ints */ int ncells; /* number of cells */ int nnodes; /* number of nodes */ float min_extent[3]; /* structure extent */ float max_extent[3]; /* structure extent */ int data_veclen; /* length of data vector for struct */ float *data; /* data for the structure */ char *data_labels; /* labels for data components */ char *data_units; /* labels for data units */ int util_flag; /* utility flag (see above for any */ /* restrictions) */ /*--------- Cell Information ---------*/ UCD_name *cell_name; /* cell names */ char **element_type; /* cell element types */ int *material_type; /* user defined material types */ int *cell_type; /* cell types (see above defines) */ int cell_veclen; /* length of data vector */ float *cell_data; /* data for cell-based datasets */ float *min_cell_data; /* min val for cell data components */ float *max_cell_data; /* max val for cell data components */ char *cell_labels; /* labels for cell data components */ char *cell_units; /* labels for cell data units */ int *cell_components;/* array of cell component mix */ int *cell_active; /* array of active cell components */ int *mid_edge_flags; /* cell edges with mid edge nodes */ int node_conn_size; /* size of the node connectivity list*/ int *node_list; /* node list of connectivity */ int *node_list_ptr; /* location of a cell's node list */ int ucd_last_cell; /*--------- Node Information ---------*/ UCD_name *node_name; /* node names */ float *x, *y, *z; /* position of the nodes */ int node_veclen; /* length of data vector */ float *node_data; /* data vector for the nodes */ float *min_node_data; /* min val for node data components */ float *max_node_data; /* max val for node data components */ char *node_labels; /* labels for node data components */ char *node_units; /* labels for node data units */ int *node_components;/* array of node component mix */ int *node_active; /* array of active node components */ int cell_conn_size; /* size of the cell connectivity list*/ int *cell_list; /* cell list of connectivity */ int *cell_list_ptr; /* location of a node's cell list */ int ucd_last_node; /*--------- Allocation Information ----------*/ enum { UCD_ONE_BLOCK, UCD_RW_SHM, UCD_RO_SHM } alloc_case; /* storage allocation strategy */ int shm_key; /* shared memory key */ int shm_id; /* shared memory id */ char *shm_base; /* shared memory base */ int mesh_id; /* unique id of the mesh instance */ } UCD_structure; /*---------------------------------------------------------------------------- ---------------------------------------------------------------------------- Function Headers for the routines handling Unstructured Cell Data (UCD) ---------------------------------------------------------------------------- ---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- char *UCDstructure_alloc (name, data_veclen, name_flag, ncells, cell_count, cell_veclen, nnodes, node_count, node_veclen, util_flag) char *name; int data_veclen; int name_flag; int ncells; int cell_count; int cell_veclen; int nnodes; int node_count; int node_veclen; int util_flag; This function creates a new top level structure and returns a pointer to that structure. Inputs: name - structure name data_veclen - length of structure data vector name_flag - are node/cell names chars or ints char = UCD_CHAR, int = UCD_INT ncells - number of cells in the structure cell_count - expected number of nodes per cell cell_veclen - length of cell data vector nnodes - number of nodes in the structure node_count - expected number of cells per node node_veclen - length of node data vector util_flag - utility flag for general usage Outputs: - none Returns: - pointer to the new structure pointer = NULL if error Description: The UCD_structure contains pointers to several blocks of memory. They are arranged in two groups as shown below: +-----------------------+ \ | | \ | UCD_structure | | | | | | | | | name, data, | | |====| data_labels, | | |====| element_type, | | || | etc., etc., etc. | | || | | | |=======| cell_data, | | |=======| x, y, z, | } msize || || | connectivity lists | | || || | node_data | | || || | | | || || +-----------------------+ | || |==>>| | | || || | | | || || | | | || |==>>| | | || | (Some of these are | | || | arrays of pointers | | || | to additional pieces | | || | of malloc'ed memory.) | | || | | / || +-----------------------+ / || || +-----------------------+ \ |=====>>| | \ || | | | || | (All of these | } ssize |=====>>| are floats or ints.) | | | | | | | / +-----------------------+ / compute_sizes calculates the required memory block sizes msize and ssize. The two blocks shown above can either be allocated in one big chunk or be in separate regions of memory. The UCDstructure and most of the arrays it points to are allocated in one big block of msize bytes. This is allocated by malloc. carve_up_the_memory fills in all the pointers to appropriate positions in this block of memory. The cell_data, x, y, z, connectivity lists and node_data arrays tend to require very large amounts of memory so it is beneficial to put them in shared memory when possible. When not appropriate, both blocks shown above can be obtained with a single malloc. The various cases are encoded in fields of UCDstructure: case 1 - Everything in one big malloc'ed block. This was the original implementation. Will still be used on sytems without shared memory or if the shared memory allocation fails for any reason. alloc_case = UCD_ONE_BLOCK shm_key not used shm_id not used shm_base not used case 2 - Second block is in Read/Write shared memory. This is the normal case for the producer of UCD. alloc_case = UCD_RW_SHM shm_key = shared memory key shm_id = shared memory identifier shm_base = base address of the shared memory case 3 - Second block is in Read-Only shared memory. This is the normal case for the consumer of UCD. The same UCD could be attached to more than one input port so we don't want a consumer making any changes to it. Therefore, the shared memory is made read-only. alloc_case = UCD_RO_SHM shm_key = shared memory key (this is passed thru the socket) shm_id = shared memory identifier (each process must obtain this from shmget because each process might have a different id for the same shared memory segment) shm_base = base address of the shared memory (each process must obtain this from shmat because each process might have the shared memory segment at a different address) case 4 - Second block is in own malloc'ed block. Sometimes the consumer of a UCD will want to modify it in place - to normalize it or something. The module writer can prevent any of the UCD from being in Read-Only storage by specifying the MODIFY_IN option in AVScreate_input_port. I'm sure not what to do about this yet. If it is not convenient to do something earlier, anything in read-only shared memory will get copied into a malloc'ed block and all the pointers will be fixed up. TO BE CONTINUED ..... -----------------------------------------------------------------------------*/ extern char *UCDstructure_alloc (); /*---------------------------------------------------------------------------- int UCDstructure_free (structure) UCD_structure *structure; This function frees the storage used by structure. Inputs: structure - structure to free Outputs: - none Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_free (); /*---------------------------------------------------------------------------- int UCDstructure_get_header (structure, name, data_veclen, name_flag, ncells, cell_veclen, nnodes, node_veclen, util_flag) UCD_structure *structure; char *name; int *data_veclen; int *name_flag; int *ncells; int *cell_veclen; int *nnodes; int *node_veclen; int *util_flag; This function finds out all the header information about a UCD_structure and returns those values. Inputs: structure - structure to find information Outputs: name - structure name data_veclen - length of structure data vector name_flag - are node/cell names chars or ints char = UCD_CHAR, int = UCD_INT ncells - number of cells in the structure cell_veclen - length of cell data vector nnodes - number of nodes in the structure node_veclen - length of node data vector util_flag - utility flag Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_header (); /*---------------------------------------------------------------------------- int UCDstructure_set_header_flag (structure, util_flag) UCD_structure *structure; int util_flag; This function sets the header flag bits. Inputs: structure - structure to find information util_flag - utility flag Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_header_flag (); /*---------------------------------------------------------------------------- int UCDstructure_get_data (structure, data) UCD_structure *structure; float **data; This function returns a pointer to the array containing the data vector for the structure. Inputs: structure - structure to find information Outputs: data - pointer to the structure data vector Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_data (); /*---------------------------------------------------------------------------- int UCDstructure_set_data (structure, data) UCD_structure *structure; float *data; This function copies the data from the array pointed to by "data" into the structure's data array. There should be data_veclen data elements in this array. Inputs: structure - structure to find information data - pointer to the data vector Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_data (); /*---------------------------------------------------------------------------- int UCDstructure_get_extent (structure, min_extent, max_extent) UCD_structure *structure; float *min_extent; float *max_extent; This routine allows the module writer to obtain the extent of the structure. Inputs: structure - structure to find information Outputs: min_extent - coordinate extent of structure max_extent - coordinate extent of structure Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_extent (); /*---------------------------------------------------------------------------- int UCDstructure_set_extent (structure, min_extent, max_extent) UCD_structure *structure; float *min_extent; float *max_extent; This routine allows the module writer to set the extent of the structure. Inputs: structure - structure to find information min_extent - coordinate extent of structure max_extent - coordinate extent of structure Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_extent (); /*---------------------------------------------------------------------------- int UCDstructure_get_data_labels (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to get the labels for each component in the structure. These labels are for cases when there is structure based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as temperature, density, mach number, etc. In turn, these labels would appear on the dials so that the user would have a better understanding of which component each dial is attached to. Example: labels = "temp;density;mach number" delimiter = ";" Inputs: structure - structure to find information Outputs: labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_data_labels (); /*-------------------------------------------------------------------- int UCDstructure_get_data_label (structure, number, label) UCD_structure *structure; int number; char *label; This routine allows the module writer to query the label for an individual component in the structure. Input: structure -- structure to get labels in number -- individual component number Outputs: labels -- string with labels included Returns: -- 1 if success; 0 if failure ----------------------------------------------------------------------*/ extern int UCDstructure_get_data_label (); /*---------------------------------------------------------------------------- int UCDstructure_set_data_labels (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to set the labels for each component in the structure. These labels are for cases when there is structure based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as temperature, density, mach number, etc. In turn, these labels would appear on the dials so that the user would have a better understanding of which component each dial is attached to. Example: labels = "temp;density;mach number" delimiter = ";" Inputs: structure - structure to find information labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_data_labels (); /*---------------------------------------------------------------------------- int UCDstructure_get_cell_labels (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to get the labels for each component in the structure. These labels are for cases when there is cell based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as temperature, density, mach number, etc. In turn, these labels would appear on the dials so that the user would have a better understanding of which component each dial is attached to. Example: labels = "temp;density;mach number" delimiter = ";" Inputs: structure - structure to find information Outputs: labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_cell_labels (); /*-------------------------------------------------------------------- int UCDstructure_get_cell_label (structure, number, label) UCD_structure *structure; int number; char *label; This routine allows the module writer to query the label for an individual component in the structure. Input: structure -- structure to get labels in number -- individual component number Outputs: labels -- string with labels included Returns: -- 1 if success; 0 if failure ----------------------------------------------------------------------*/ extern int UCDstructure_get_cell_label (); /*---------------------------------------------------------------------------- int UCDstructure_set_cell_labels (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to set the labels for each component in the structure. These labels are for cases when there is cell based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as temperature, density, mach number, etc. In turn, these labels would appear on the dials so that the user would have a better understanding of which component each dial is attached to. Example: labels = "temp;density;mach number" delimiter = ";" Inputs: structure - structure to find information labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_cell_labels (); /*---------------------------------------------------------------------------- int UCDstructure_get_node_labels (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to get the labels for each component in the structure. These labels are for cases when there is node based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as temperature, density, mach number, etc. In turn, these labels would appear on the dials so that the user would have a better understanding of which component each dial is attached to. Example: labels = "temp;density;mach number" delimiter = ";" Inputs: structure - structure to find information Outputs: labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_node_labels (); /*-------------------------------------------------------------------- int UCDstructure_get_node_label (structure, number, label) UCD_structure *structure; int number; char *label; This routine allows the module writer to query the label for an individual component in the structure. Input: structure -- structure to get labels in number -- individual component number Outputs: labels -- string with labels included Returns: -- 1 if success; 0 if failure ----------------------------------------------------------------------*/ extern int UCDstructure_get_node_label (); /*---------------------------------------------------------------------------- int UCDstructure_set_node_labels (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to set the labels for each component in the structure. These labels are for cases when there is node based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as temperature, density, mach number, etc. In turn, these labels would appear on the dials so that the user would have a better understanding of which component each dial is attached to. Example: labels = "temp;density;mach number" delimiter = ";" Inputs: structure - structure to find information labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_node_labels (); /*---------------------------------------------------------------------------- int UCDstructure_get_data_units (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to get the unit labels for each component in the structure. These labels are for cases when there is structure based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as degrees, meters, etc. Example: labels = "degrees;meters" delimiter = ";" Inputs: structure - structure to find information Outputs: labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_data_units (); /*-------------------------------------------------------------------- int UCDstructure_get_data_unit (structure, number, label) UCD_structure *structure; int number; char *label; This routine allows the module writer to query the label for an individual unit in the structure. Input: structure -- structure to get labels in number -- individual component number Outputs: labels -- string with labels included Returns: -- 1 if success; 0 if failure ----------------------------------------------------------------------*/ extern int UCDstructure_get_data_unit (); /*---------------------------------------------------------------------------- int UCDstructure_set_data_units (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to set the unit labels for each component in the structure. These labels are for cases when there is structure based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as degrees, meters, etc. Example: labels = "degrees;meters" delimiter = ";" Inputs: structure - structure to find information labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_data_units (); /*---------------------------------------------------------------------------- int UCDstructure_get_cell_units (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to get the unit labels for each component in the structure. These labels are for cases when there is cell based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as degrees, meters, etc. Example: labels = "degrees;meters" delimiter = ";" Inputs: structure - structure to find information Outputs: labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_cell_units (); /*-------------------------------------------------------------------- int UCDstructure_get_cell_unit (structure, number, label) UCD_structure *structure; int number; char *label; This routine allows the module writer to query the label for an individual unit in the structure. Input: structure -- structure to get labels in number -- individual component number Outputs: labels -- string with labels included Returns: -- 1 if success; 0 if failure ----------------------------------------------------------------------*/ extern int UCDstructure_get_cell_unit (); /*---------------------------------------------------------------------------- int UCDstructure_set_cell_units (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to set the unit labels for each component in the structure. These labels are for cases when there is cell based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as degrees, meters, etc. Example: labels = "degrees;meters" delimiter = ";" Inputs: structure - structure to find information labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_cell_units (); /*---------------------------------------------------------------------------- int UCDstructure_get_node_units (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to get the unit labels for each component in the structure. These labels are for cases when there is node based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as degrees, meters, etc. Example: labels = "degrees;meters" delimiter = ";" Inputs: structure - structure to find information Outputs: labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_node_units (); /*-------------------------------------------------------------------- int UCDstructure_get_node_unit (structure, number, label) UCD_structure *structure; int number; char *label; This routine allows the module writer to query the label for an individual unit in the structure. Input: structure -- structure to get labels in number -- individual component number Outputs: labels -- string with labels included Returns: -- 1 if success; 0 if failure ----------------------------------------------------------------------*/ extern int UCDstructure_get_node_unit (); /*---------------------------------------------------------------------------- int UCDstructure_set_node_units (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to set the unit labels for each component in the structure. These labels are for cases when there is node based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as degrees, meters, etc. Example: labels = "degrees;meters" delimiter = ";" Inputs: structure - structure to find information labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_node_units (); /*--------------------------------------------------------------------------- int UCDstructure_invalid_cell_minmax (structure) UCD_structure *structure; This routine allows the module writer to set the min/max range of the structure cell data to be invalid. This function should be used after the structure data has been changed by the module and the module does not want to spend the time recomputing the cell minmax. Input: structure -- structure to set cell min/max invalid Outputs: -- none Returns: -- 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_invalid_cell_minmax (); /*--------------------------------------------------------------------------- int UCDstructure_get_cell_minmax (structure, min, max) UCD_structure *structure; float *min; float *max; This routine allows the module writer to obtain the range of the structure cell data. It should be noted that min and max are arrays of dimension structure->cell_veclen. Input: structure -- structure to get min/max in Outputs: min -- value of minimum data point max -- value of maximum data point Returns: -- 1 = valid data; 0 = invalid data -----------------------------------------------------------------------------*/ extern int UCDstructure_get_cell_minmax (); /*--------------------------------------------------------------------------- int UCDstructure_set_cell_minmax (structure, min, max) UCD_structure *structure; float *min; float *max; This routine allows the module writer to set the range of the structure cell data. It should be noted that min and max are arrays of dimension structure->cell_veclen. Input: structure -- structure to set min/max in Outputs: min -- value of minimum data point max -- value of maximum data point Returns: -- 1 if successful; 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_cell_minmax (); /*--------------------------------------------------------------------------- int UCDstructure_invalid_node_minmax (structure) UCD_structure *structure; This routine allows the module writer to set the min/max range of the structure node data to be invalid. This function should be used after the structure data has been changed by the module and the module does not want to spend the time recomputing the node minmax. Input: structure -- structure to set node min/max invalid Outputs: -- none Returns: -- 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_invalid_node_minmax (); /*--------------------------------------------------------------------------- int UCDstructure_get_node_minmax (structure, min, max) UCD_structure *structure; float *min; float *max; This routine allows the module writer to obtain the range of the structure node data. It should be noted that min and max are arrays of dimension structure->node_veclen. Input: structure -- structure to get min/max in Outputs: min -- value of minimum data point max -- value of maximum data point Returns: -- 1 = valid data; 0 = invalid data -----------------------------------------------------------------------------*/ extern int UCDstructure_get_node_minmax (); /*--------------------------------------------------------------------------- int UCDstructure_set_node_minmax (structure, min, max) UCD_structure *structure; float *min; float *max; This routine allows the module writer to set the range of the structure node data. It should be noted that min and max are arrays of dimension structure->node_veclen. Input: structure -- structure to set min/max in Outputs: min -- value of minimum data point max -- value of maximum data point Returns: -- 1 if successful; 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_node_minmax (); /*---------------------------------------------------------------------------- int UCDstructure_get_cell_data (structure, data) UCD_structure *structure; float **data; This function returns a pointer to the array containing the data vectors for all of the cells in the structure. Inputs: structure - structure to find information Outputs: data - pointer to the cell data vectors Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_cell_data (); /*---------------------------------------------------------------------------- int UCDstructure_set_cell_data (structure, data) UCD_structure *structure; float *data; This function copies the cell data from the array pointed to by "data" into the structure's cell data array. There should be cell_veclen*ncells data elements in this array. Inputs: structure - structure to find information data - pointer to the cell data vectors Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_cell_data (); /*---------------------------------------------------------------------------- int UCDstructure_get_node_data (structure, data) UCD_structure *structure; float **data; This function returns pointers to the array containing the data vectors for the nodes. Inputs: structure - structure to find information Outputs: data - pointer to the node data vectors Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_node_data (); /*---------------------------------------------------------------------------- int UCDstructure_set_node_data (structure, data) UCD_structure *structure; float *data; This function copies the node data from the array pointed to by "data" into the structure's node data array. There should be node_veclen*nnodes data elements in this array. Inputs: structure - structure to find information data - pointer to the node data vectors Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_node_data (); /*---------------------------------------------------------------------------- int UCDstructure_get_cell_components (structure, components) UCD_structure *structure; int **components; This function returns pointers to the array containing the cell component list. For instance, if there are four different components in the cell data vector (e.g. scalar, 3-vector, 2-vector, scalar), the component list would be: (1 3 2 1) Inputs: structure - structure to find information Outputs: components - pointer to the cell component list Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_cell_components (); /*---------------------------------------------------------------------------- int UCDstructure_set_cell_components (structure, components, number) UCD_structure *structure; int *components; int number; This function copies the array containing the cell component list. For instance, if there are four different components in the cell data vector (e.g. scalar, 3-vector, 2-vector, scalar), the component list would be: (1 3 2 1) Inputs: structure - structure to find information components - pointer to the cell component list number - number of components in the list Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_cell_components (); /*---------------------------------------------------------------------------- int UCDstructure_get_node_components (structure, components) UCD_structure *structure; int **components; This function returns pointers to the array containing the node component list. For instance, if there are four different components in the node data vector (e.g. scalar, 3-vector, 2-vector, scalar), the component list would be: (1 3 2 1) Inputs: structure - structure to find information Outputs: components - pointer to the node component list Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_node_components (); /*---------------------------------------------------------------------------- int UCDstructure_set_node_components (structure, components, number) UCD_structure *structure; int *components; int number; This function copies the array containing the node component list. For instance, if there are four different components in the node data vector (e.g. scalar, 3-vector, 2-vector, scalar), the component list would be: (1 3 2 1) Inputs: structure - structure to find information components - pointer to the node component list number - number of components in the list Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_node_components (); /*---------------------------------------------------------------------------- int UCDstructure_get_cell_active (structure, active) UCD_structure *structure; int **active; This function returns a pointer to the array containing the cell active component list. For instance, if there are four different components in the cell data vector and the module is using the second component, the list would be: (0 1 0 0) Inputs: structure - structure to find information Outputs: active - pointer to the cell active component list Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_cell_active (); /*---------------------------------------------------------------------------- int UCDstructure_set_cell_active (structure, active) UCD_structure *structure; int *active; This function sets the array containing the cell active component list. For instance, if there are four different components in the cell data vector and the module is using the second component, the list would be: (0 1 0 0) Inputs: structure - structure to find information active - pointer to the cell active component list Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_cell_active (); /*---------------------------------------------------------------------------- int UCDstructure_get_node_active (structure, active) UCD_structure *structure; int **active; This function returns a pointer to the array containing the node active component list. For instance, if there are four different components in the node data vector and the module is using the second component, the list would be: (0 1 0 0) Inputs: structure - structure to find information Outputs: active - pointer to the node active component list Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_node_active (); /*---------------------------------------------------------------------------- int UCDstructure_set_node_active (structure, active) UCD_structure *structure; int *active; This function sets the array containing the node active component list. For instance, if there are four different components in the node data vector and the module is using the second component, the list would be: (0 1 0 0) Inputs: structure - structure to find information active - pointer to the node active component list Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_node_active (); /*---------------------------------------------------------------------------- int UCDstructure_get_node_positions (structure, x, y, z) UCD_structure *structure; float **x, **y, **z; This function returns pointers to the arrays containing the x, y and z coordinates of node positions. Inputs: structure - structure to find information Outputs: x, y, z - pointer to the x,y,z arrays Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_node_positions (); /*---------------------------------------------------------------------------- int UCDstructure_set_node_positions (structure, x, y, z) UCD_structure *structure; float *x, *y, *z; This function copies the x, y and z coordinate arrays from the arrays pointed to by "x", "y" and "z" into the structure's node position arrays. There should be nnodes coordinates in each array. Inputs: structure - structure to find information x, y, z - pointer to the x,y,z arrays Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_node_positions (); /*---------------------------------------------------------------------------- int UCDcell_get_information (structure, cell, name, element_type, material_type, cell_type, mid_edge_flags, node_list) UCD_structure *structure; int cell; int *name; char *element_type; int *material_type; int *cell_type; int *mid_edge_flags; int **node_list; This function finds out all the information about a particular cell and returns those values. Inputs: structure - structure to find information cell - cell to find information Outputs: name - cell name element_type - name of element type material_type - user defined material type cell_type - cell type (e.g. UCD_TRIANGLE) data - data for cell-based datasets mid_edge_flags - does the cell have mid edge nodes node_list - array of node numbers Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDcell_get_information (); /*---------------------------------------------------------------------------- int UCDcell_set_information (structure, cell, name, element_type, material_type, cell_type, mid_edge_flags, node_list) UCD_structure *structure; int cell; int name; char *element_type; int material_type; int cell_type; int mid_edge_flags; int *node_list; This function sets all the information about a particular cell. Inputs: structure - structure to find information cell - cell to find information name - cell name element_type - name of element type material_type - user defined material type cell_type - cell type (e.g. UCD_TRIANGLE) mid_edge_flags - does the cell have mid edge nodes node_list - array of node numbers Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDcell_set_information (); /*---------------------------------------------------------------------------- int UCDnode_get_information (structure, node, name, ncells, cell_list) UCD_structure *structure; int node; int *name; int *ncells; int **cell_list; This function finds out all the information about a particular node and returns those values. Inputs: structure - structure to find information node - node to find information Outputs: name - node name ncells - number of cells in cell_list cell_list - array of cell numbers Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDnode_get_information (); /*---------------------------------------------------------------------------- int UCDnode_set_information (structure, node, name, ncells, cell_list) UCD_structure *structure; int node; int name; int ncells; int *cell_list; This function sets all the information about a particular node. Inputs: structure - structure to find information node - node to find information name - node name ncells - number of cells in cell_list cell_list - array of cell numbers Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDnode_set_information (); /* end ucd_defs.h */ geomview-1.9.5/src/bin/geomutil/ucd/anytoucd.1gv0000644000175000017500000000125312310110176016466 00000000000000.TH anytoucd 1gv "June 12 1992" "Geometry Center" .SH NAME anytoucd \- filter to convert a geomview data file into a data file in the so-called 'ucd' (Unstructured Cell Data) format. .SH SYNOPSIS anytoucd .SH DESCRIPTION .PP Anytoucd reads a geom from standard in and outputs the equivalent ucd stream to standard out. Anytoucd calls anytopl(1) before converting to ucd. Full documentation for ucd format is available from AVS documentation in an appendix in the Developer's Guide. .SH BUGS .PP Currently no support for vectors. .PP 4D OOGL objects are not treated correctly currently. .SH SEE ALSO anytopl(3), ucdtooff(1) .SH AUTHOR .nf Charlie Gunn The Geometry Center .fi geomview-1.9.5/src/bin/geomutil/ucd/ucdtooff.1gv0000644000175000017500000000056012310110176016451 00000000000000.TH ucdtooff 1gv "June 12 1992" "Geometry Center" .SH NAME ucdtooff \- filter to convert an AVS 'ucd' (Unstructured Cell Data) format file into an OFF file. .SH SYNOPSIS ucdtooff .SH DESCRIPTION .PP Ucdtooff reads from standard input and outputs the equivalent OFF stream to standard out. .SH SEE ALSO anytoucd(1) .SH AUTHOR .nf Charlie Gunn The Geometry Center .fi geomview-1.9.5/src/bin/geomutil/hvectext/0000755000175000017500000000000012310165604015365 500000000000000geomview-1.9.5/src/bin/geomutil/hvectext/Makefile.in0000644000175000017500000004472612310165552017371 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/geomutil/hvectext DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(srcdir)/hvectext.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = hvectext CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" SCRIPTS = $(bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ man_MANS = hvectext.1gv EXTRA_DIST = $(man_MANS) bin_SCRIPTS = hvectext CLEANFILES = $(bin_SCRIPTS) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/hvectext/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/hvectext/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): hvectext: $(top_builddir)/config.status $(srcdir)/hvectext.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; 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 \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | 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; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$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_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) $(MANS) all-local installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool cscopelist-am ctags-am distclean \ distclean-generic distclean-libtool distdir dvi dvi-am html \ html-am info info-am install install-am install-binSCRIPTS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am uninstall-binSCRIPTS \ uninstall-man uninstall-man1 all-local: hvectext chmod +x hvectext # 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: geomview-1.9.5/src/bin/geomutil/hvectext/Makefile.am0000644000175000017500000000021612310110176017332 00000000000000man_MANS = hvectext.1gv EXTRA_DIST = $(man_MANS) bin_SCRIPTS = hvectext CLEANFILES = $(bin_SCRIPTS) all-local: hvectext chmod +x hvectext geomview-1.9.5/src/bin/geomutil/hvectext/hvectext.in0000754000175000017500000003053012310110176017464 00000000000000: eval 'exec perl -S $0 ${1+"$@"}' if $running_under_some_shell; # Copyright (c) 1995, Geometry Center, University of Minnesota # Script by Stuart Levy, Geometry Center. # Uses Hershey fonts as encoded for Ghostscript. # This program may be freely used and redistributed so long as # this notice remains. # Configurable value: if you have Ghostscript Hershey fonts installed on your # system, you might want to set $gsfontdir to the directory where they live. # "-hershey" will seek files there if not found relative to ".". # This could be a colon-separated list of directories. $gsfontpath = $ENV{"GS_FONTPATH"} || "/usr/local/lib/ghostscript/fonts"; if (@ARGV == 0) { print STDERR "Usage: $0 [-w totallength] [-s textheight] [-plane xy|xz|yz] [-at X Y Z] [-hershey fontfile.gsf] [-align n|s|e|w|ne|nw|se|sw|c] [--] text string Generate geomview/OOGL vector-text object, of given height or total length (default -s .25), aligning the given corner of the text (default -align c (centered)) at given point (default -at 0 0 0). Accepts Ghostscript Hershey fonts; built-in default is Hershey-Plain-Simplex. "; exit(1); } @at = (0,0,0); $ujust = -.5, $vjust = -.5; $uaxis = 0, $vaxis = 1; %ax = ('x',0, 'y',1, 'z',2, 0,'x', 1,'y', 2,'z'); ($cmdline = join(" ", $0, @ARGV)) =~ s/[\000-\031\177-\377]/sprintf("\\%03o",unpack("C",$1))/eg; while(@ARGV) { if($ARGV[0] =~ /^-w/) { shift, $totallen = shift; } elsif($ARGV[0] =~ /^-s/) { shift, $height = shift; } elsif($ARGV[0] =~ /^-pl?a?n?e?/) { shift, $plane = shift; $plane =~ tr/XYZ/xyz/; $uaxis = $ax{substr($plane,0,1)}; $vaxis = $ax{substr($plane,1,1)}; unless ($uaxis != $vaxis && defined($uaxis) && defined($vaxis)) { print STDERR "$0: -plane: Expected \"xy\" or \"yz\" or \"xz\", not $plane.\n"; exit(0); } } elsif($ARGV[0] =~ /^-ali?g?n?/) { shift, $align = shift; $ujust = $vjust = -.5; $ujust = -1 if $align =~ /e/i; $ujust = 0 if $align =~ /w/i; $vjust = -1 if $align =~ /n/i; $vjust = 0 if $align =~ /s/i; unless($align =~ /^[nsewc]+$/i) { print STDERR "$0: -align: Expected some combination of letters n s e w c\n"; exit(1); } } elsif($ARGV[0] =~ /^-at/) { shift, @at = (shift,shift,shift); } elsif($ARGV[0] =~ /^-her?s?h?e?y?/) { shift, $gsfont = shift; unless (-f $gsfont) { foreach $_ (split(":", $gsfontpath)) { ($gsfont = $_), last if -f ($_ .= "/" . $gsfont); } } } elsif($ARGV[0] =~ /^--/) { shift, last; } else { last; } } $chars{"space"} = " "; while() { if(/CHARS/ .. /ENDCHARS/) { ($name, $char) = split; $chars{$name} = $char if length($char) == 1; } last if /^%END/; } if($gsfont) { local($_, $any); $any = open(INF, $gsfont); while() { last if /%END/; } if(/%END/) { $INF = 'INF'; } else { print STDERR $any ? "$gsfont isn't a Ghostscript Hershey font -- no %END tag found.\n" : "Can't open Ghostscript Hershey font file $gsfont, using default.\n"; $INF = 'DATA'; } } else { $INF = 'DATA'; } $aspect = .67; # Width/height of typical character $fontscale = 1/33.; # Hershey magic scale factor while(<$INF>) { ($char, $xmin, $width, $codes) = (m'^/(\S+)\s*\[(\S+) (\S+) \(([^)]*)'); $char = $chars{$char} if length($char) > 1; next unless defined($char); $code{$char} = "$xmin,$width,$codes"; } $string = join(" ", @ARGV); (print STDERR "$0: No string given?\n"), exit(1) unless $string ne ""; %escapes = ("n", "\n", "b", "\b", "r", "\r", "e", "\e"); $string =~ s/\\([^0-7])/defined($escapes{$1}) ? $escapes{$1} : $1/eg; $string =~ s/\\([0-7][0-7]?[0-7]?)/pack("C",oct($1))/eg; $stringwidth = 0; foreach $char (split("", $string)) { ($xmin,$xmax) = ($code{$char} =~ /([^,]+),([^,]+)/); $stringwidth += $xmax - $xmin; } $stringwidth = 1 unless $stringwidth; if($totallen) { $strscale = $totallen / $stringwidth; $height = $strscale * $aspect / $fontscale; } else { $height = 0.25 unless($height>0); $strscale = $fontscale * $height / $aspect; $totallen = $strscale * $stringwidth; } @path = (); @counts = (); # Interpret chars in string. # Apply justification offset $at[$uaxis] += $ujust * $totallen; $at[$vaxis] += $vjust * $height; foreach $ch (split("", $string)) { ($xmin, $xmax, $paths) = split(",", $code{$ch}); $paths =~ s/\\([()\\])/$1/g; foreach $arc (split(' ', $paths)) { $u0 = -82-$xmin; $v0 = -91; @sites = unpack("C*",$arc); printf STDERR "$0: internal error: tossing odd stroke for %s: '%s'\n", $ch, pop(@sites) if(@sites & 1); push(@counts, ($#sites+1)/2); while($u = shift(@sites)) { $v = shift(@sites); @here = @at; $here[$uaxis] += $strscale*($u+$u0); $here[$vaxis] -= $strscale*($v+$v0); push(@path, sprintf("%.7g %.7g %.7g", @here)); } } $at[$uaxis] += $strscale*($xmax-$xmin); } ($safestring = $string) =~ s/[\000-\031\177-\377]/sprintf("\\%03o",unpack("C",$1))/eg; printf "# Continue with: -align sw -plane %s%s -s %.6g -at %.6g %.6g %.6g\n", $ax{$uaxis}, $ax{$vaxis}, $height, @at; if(@counts > 0) { print "VECT # $safestring\n"; printf "%d %d 0 # %s\n", $#counts+1, ($#path+1), $cmdline; print join(" ",@counts),"\n"; print "0 " x ($#counts+1), "\n\n"; while(@path) { print shift(@path), "\n"; } } else { print "{ # $safestring\n"; print "} # $cmdline\n"; } __END__ CHARS exclam ! quotedbl " numbersign # dollar $ percent % ampersand & quotesingle ' parenleft ( parenright ) asterisk * plus + comma , hyphen - period . slash / zero 0 one 1 two 2 three 3 four 4 five 5 six 6 seven 7 eight 8 nine 9 colon : semicolon ; less < equal = greater > question ? bracketleft [ backslash \ bracketright ] asciicircum ^ underscore _ quoteleft ` braceleft { bar | braceright } asciitilde ~ tilde ~ universal " existential $ suchthat ' asteriskmath * congruent @ Alpha A Beta B Chi C Delta D Epsilon E Phi F Gamma G Eta H Iota I theta1 J Kappa K Lambda L Mu M Nu N Omicron O Pi P Theta Q Rho R Sigma S Tau T Upsilon U sigma1 V Omega W Xi X Psi Y Zeta Z therefore \ perpendicular ^ radicalex ` alpha a beta b chi c delta d epsilon e phi f gamma g eta h iota i phi1 j kappa k lambda l mu m nu n omicron o pi p theta q rho r sigma s tau t upsilon u omega1 v omega w xi x psi y zeta z similar ~ Upsilon1 ¡ minute ¢ lessequal £ fraction ¤ infinity ¥ florin ¦ club § diamond ¨ heart © spade ª arrowboth « arrowleft ¬ arrowup ­ arrowright ® arrowdown ¯ degree ° plusminus ± second ² greaterequal ³ multiply ´ proportional µ partialdiff ¶ bullet · divide ¸ notequal ¹ equivalence º approxequal » ellipsis ¼ arrowvertex ½ arrowhorizex ¾ carriagereturn ¿ aleph À Ifraktur Á Rfraktur  weierstrass à circlemultiply Ä circleplus Å emptyset Æ intersection Ç union È propersuperset É reflexsuperset Ê notsubset Ë propersubset Ì reflexsubset Í element Î notelement Ï angle Ð gradient Ñ registerserif Ò copyrightserif Ó trademarkserif Ô product Õ radical Ö dotmath × logicalnot Ø logicaland Ù logicalor Ú arrowdblboth Û arrowdblleft Ü arrowdblup Ý arrowdblright Þ arrowdbldown ß lozenge à angleleft á registersans â copyrightsans ã trademarksans ä summation å parenlefttp æ parenleftex ç parenleftbt è bracketlefttp é bracketleftex ê bracketleftbt ë bracelefttp ì braceleftmid í braceleftbt î braceex ï angleright ñ integral ò integraltp ó integralex ô integralbt õ parenrighttp ö parenrightex ÷ parenrightbt ø bracketrighttp ù bracketrightex ú bracketrightbt û bracerighttp ü bracerightmid ý bracerightbt þ ENDCHARS # Now for our default font. # Boilerplate header from Ghostscript font hrpl_s.gsf omitted. %END 150 dict dup begin /A [-8 9 (RFJ[ RFZ[ MTWT)] def /B [-10 10 (KFK[ KFTFWGXHYJYLXNWOTP KPTPWQXRYTYWXYWZT[K[)] def /C [-9 11 (ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZV)] def /D [-10 10 (KFK[ KFRFUGWIXKYNYSXVWXUZR[K[)] def /E [-9 9 (LFL[ LFYF LPTP L[Y[)] def /F [-9 8 (LFL[ LFYF LPTP)] def /G [-9 11 (ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZVZS USZS)] def /H [-10 11 (KFK[ YFY[ KPYP)] def /I [-3 4 (RFR[)] def /J [-7 8 (VFVVUYTZR[P[NZMYLVLT)] def /K [-10 10 (KFK[ YFKT POY[)] def /L [-9 7 (LFL[ L[X[)] def /M [-11 12 (JFJ[ JFR[ ZFR[ ZFZ[)] def /N [-10 11 (KFK[ KFY[ YFY[)] def /O [-10 11 (PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF)] def /P [-10 10 (KFK[ KFTFWGXHYJYMXOWPTQKQ)] def /Q [-10 11 (PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF SWY])] def /R [-10 10 (KFK[ KFTFWGXHYJYLXNWOTPKP RPY[)] def /S [-9 10 (YIWGTFPFMGKIKKLMMNOOUQWRXSYUYXWZT[P[MZKX)] def /T [-8 8 (RFR[ KFYF)] def /U [-11 11 (KFKULXNZQ[S[VZXXYUYF)] def /V [-9 10 (JFR[ ZFR[)] def /W [-13 12 (HFM[ RFM[ RFW[ \\FW[)] def /X [-10 10 (KFY[ YFK[)] def /Y [-9 9 (JFRPR[ ZFRP)] def /Z [-10 10 (YFK[ KFYF K[Y[)] def /a [-8 10 (XMX[ XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def /b [-9 9 (LFL[ LPNNPMSMUNWPXSXUWXUZS[P[NZLX)] def /c [-8 9 (XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def /d [-8 10 (XFX[ XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def /e [-8 9 (LSXSXQWOVNTMQMONMPLSLUMXOZQ[T[VZXX)] def /f [-4 7 (WFUFSGRJR[ OMVM)] def /g [-8 10 (XMX]W`VaTbQbOa XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def /h [-8 10 (MFM[ MQPNRMUMWNXQX[)] def /i [-3 4 (QFRGSFREQF RMR[)] def /j [-4 5 (RFSGTFSERF SMS^RaPbNb)] def /k [-8 8 (MFM[ WMMW QSX[)] def /l [-3 4 (RFR[)] def /m [-14 15 (GMG[ GQJNLMOMQNRQR[ RQUNWMZM\\N]Q][)] def /n [-8 10 (MMM[ MQPNRMUMWNXQX[)] def /o [-8 10 (QMONMPLSLUMXOZQ[T[VZXXYUYSXPVNTMQM)] def /p [-9 9 (LMLb LPNNPMSMUNWPXSXUWXUZS[P[NZLX)] def /q [-8 10 (XMXb XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def /r [-6 7 (OMO[ OSPPRNTMWM)] def /s [-7 9 (XPWNTMQMNNMPNRPSUTWUXWXXWZT[Q[NZMX)] def /t [-5 7 (RFRWSZU[W[ OMVM)] def /u [-8 10 (MMMWNZP[S[UZXW XMX[)] def /v [-7 8 (LMR[ XMR[)] def /w [-11 11 (JMN[ RMN[ RMV[ ZMV[)] def /x [-7 9 (MMX[ XMM[)] def /y [-7 8 (LMR[ XMR[P_NaLbKb)] def /z [-7 9 (XMM[ MMXM M[X[)] def /zero [-10 10 (QFNGLJKOKRLWNZQ[S[VZXWYRYOXJVGSFQF)] def /one [-10 10 (NJPISFS[)] def /two [-10 10 (LKLJMHNGPFTFVGWHXJXLWNUQK[Y[)] def /three [-10 10 (MFXFRNUNWOXPYSYUXXVZS[P[MZLYKW)] def /four [-10 10 (UFKTZT UFU[)] def /five [-10 10 (WFMFLOMNPMSMVNXPYSYUXXVZS[P[MZLYKW)] def /six [-10 10 (XIWGTFRFOGMJLOLTMXOZR[S[VZXXYUYTXQVOSNRNOOMQLT)] def /seven [-10 10 (YFO[ KFYF)] def /eight [-10 10 (PFMGLILKMMONSOVPXRYTYWXYWZT[P[MZLYKWKTLRNPQOUNWMXKXIWGTFPF)] def /nine [-10 10 (XMWPURRSQSNRLPKMKLLINGQFRFUGWIXMXRWWUZR[P[MZLX)] def /period [-5 5 (RYQZR[SZRY)] def /comma [-5 5 (SZR[QZRYSZS\\R^Q_)] def /colon [-5 5 (RMQNROSNRM RYQZR[SZRY)] def /semicolon [-5 5 (RMQNROSNRM SZR[QZRYSZS\\R^Q_)] def /exclam [-7 7 (RFRT RYQZR[SZRY)] def /question [-9 9 (LKLJMHNGPFTFVGWHXJXLWNVORQRT RYQZR[SZRY)] def /quotedbl [-8 8 (NFNM VFVM)] def /ring [-7 7 (QFOGNINKOMQNSNUMVKVIUGSFQF)] def /dollar [-10 10 (PBP_ TBT_ YIWGTFPFMGKIKKLMMNOOUQWRXSYUYXWZT[P[MZKX)] def /fraction [-11 11 ([BIb)] def /parenleft [-7 5 (VBTDRGPKOPOTPYR]T`Vb)] def /parenright [-5 7 (NBPDRGTKUPUTTYR]P`Nb)] def /bar [-4 4 (RBRb)] def /hyphen [-13 13 (IR[R)] def /plus [-13 13 (RIR[ IR[R)] def /equal [-13 13 (IO[O IU[U)] def /periodcentered [-5 5 (RQQRRSSRRQ)] def /quoteleft [-5 5 (SFRGQIQKRLSKRJ)] def /quoteright [-5 5 (RHQGRFSGSIRKQL)] def /numbersign [-10 11 (SBLb YBRb LOZO KUYU)] def /ampersand [-13 13 (\\O\\N[MZMYNXPVUTXRZP[L[JZIYHWHUISJRQNRMSKSIRGPFNGMIMKNNPQUXWZY[[[\\Z\\Y)] def /bullet [-2 2 (QPPQPSQTSTTSTQSPQP RQQRRSSRRQ)] def /slash [-7 7 (K^YF)] def /backslash [-7 7 (KFY^)] def /underscore [-8 8 (J]Z])] def /tilde [-8 8 (LTLRMPOPUSWSXR LRMQOQUTWTXRXP)] def /bracketleft [-7 7 (OBOb PBPb OBVB ObVb)] def /bracketright [-7 7 (TBTb UBUb NBUB NbUb)] def /braceleft [-7 7 (TBRCQDPFPHQJRKSMSOQQ RCQEQGRISJTLTNSPORSTTVTXSZR[Q]Q_Ra QSSUSWRYQZP\\P^Q`RaTb)] def /braceright [-7 7 (PBRCSDTFTHSJRKQMQOSQ RCSESGRIQJPLPNQPURQTPVPXQZR[S]S_Ra SSQUQWRYSZT\\T^S`RaPb)] def /asterisk [-8 8 (RFRR MIWO WIMO)] def /less [-12 12 (ZIJRZ[)] def /greater [-12 12 (JIZRJ[)] def /asciitilde [-12 12 (IUISJPLONOPPTSVTXTZS[Q ISJQLPNPPQTTVUXUZT[Q[O)] def /asciicircum [-11 11 (JTROZT JTRPZT)] def /breve [-10 10 (KFLHNJQKSKVJXHYF KFLINKQLSLVKXIYF)] def /percent [-12 12 ([FI[ NFPHPJOLMMKMIKIIJGLFNFPGSHVHYG[F WTUUTWTYV[X[ZZ[X[VYTWT)] def /at [-13 14 (WNVLTKQKOLNMMPMSNUPVSVUUVS QKOMNPNSOUPV WKVSVUXVZV\\T]Q]O\\L[JYHWGTFQFNGLHJJILHOHRIUJWLYNZQ[T[WZYYZX XKWSWUXV)] def /section [-8 8 (UITJUKVJVIUGSFQFOGNINKOMQOVR OMTPVRWTWVVXTZ PNNPMRMTNVPXU[ NVSYU[V]V_UaSbQbOaN_N^O]P^O_)] def /dagger [-8 8 (RFQHRJSHRF RFRb RQQTRbSTRQ LMNNPMNLLM LMXM TMVNXMVLTM)] def /daggerdbl [-8 8 (RFQHRJSHRF RFRT RPQRSVRXQVSRRP RTRb R^Q`RbS`R^ LMNNPMNLLM LMXM TMVNXMVLTM L[N\\P[NZL[ L[X[ T[V\\X[VZT[)] def /space [-4 4 ()] def /quotesingle [-4 5 (SFRGRM SGRM SFTGRM)] def /.notdef [ 0 0 () ] def % not defined end /Hershey-Plain-Simplex 4294100 0.8 0 MakeHersheyFont geomview-1.9.5/src/bin/geomutil/hvectext/hvectext.1gv0000644000175000017500000000367512310110176017563 00000000000000.TH HVECTEXT 1gv "1 Nov 1996" "Geometry Center" .SH NAME hvectext \- construct Geomview VECT text object from Hershey fonts .SH SYNOPSIS .na .in +5 .ti -5 \fBhvectext\fP [\fB\-w\fP\ \fItotallength\fP] [\fB\-s\fP\ \fItextheight\fP] [\fB\-plane\ xy|xz|yz\fP] [\fB\-at\fP\ \fIX Y Z\fP] [\fB\-align\ n|s|e|w|ne|nw|se|sw|c\fP] [\fB\-hershey\fP\ \fIfontfile.gsf\fP] [\fB\-\-\fP] \fItext string ...\fP .in -5 .ad .SH DESCRIPTION \fBHvectext\fP generates a Geomview/OOGL vector-text object, of given height or total length (default \fB\-s\ .25\fP). It aligns the given 3-D point (default \fB\-at\ 0\ 0\ 0\fP) with the given corner of the text (default \fB\-align\ c\fP). Alignment specs are like geographic directions; \fB\-align\ sw\fP puts the ``at'' point at the ``southwest'' corner of the text, so that its lower left corner is at that coordinate. The corresponding VECT object is written to standard output. If no non-blank text characters are given, \fBhvectext\fP produces a null geom object ("{ }") as output. The special option \fB\-\-\fP marks the end of options; it's useful in case the text itself begins with a hyphen. \fBHvectext\fP accepts Ghostscript Hershey fonts; the built-in default is Hershey-Plain-Simplex a.k.a. hrpl_s.gsf. Others of interest: hrsy_r.gsf (Symbol), hrpl_t.gsf (Triplex). For a complete list, see all the Ghostscript font files of nontrivial size whose names begin with "hr". Although there's no way to switch fonts within the string, the first line of output from hvectext is an OOGL comment resembling: .nf # Continue with: -align sw -plane xy -s 0.25 -at 1.24378 0 0 .fi giving options for hvectext to continue the string where it left off. .SH ENVIRONMENT GS_FONTPATH, if present, is a colon-separated list of directories in which Hershey font files are sought. .SH FILES \fBperl\fP (either version 4 or 5) must be installed. \fB/usr/local/lib/ghostscript/fonts\fP is searched if \fB\-hershey\fP is given and \fBGS_FONTPATH\fP isn't set. geomview-1.9.5/src/bin/animate/0000755000175000017500000000000012310165604013324 500000000000000geomview-1.9.5/src/bin/animate/interface/0000755000175000017500000000000012310165604015264 500000000000000geomview-1.9.5/src/bin/animate/interface/animate.mib0000644000175000017500000001556412310110176017320 00000000000000static char AnimRoot[] = "\ TotalWidgets: 20\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 272\n\ Xmheight: 319\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Once\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 259\n\ XmbottomOffset: 38\n\ XmleftOffset: 95\n\ XmrightOffset: 177\n\ Private-\n\ label: \"Once\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Bounce\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 259\n\ XmbottomOffset: 38\n\ XmleftOffset: 179\n\ XmrightOffset: 20\n\ Private-\n\ label: \"Bounce\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Range\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 259\n\ XmbottomOffset: 38\n\ XmleftOffset: 8\n\ XmrightOffset: 264\n\ Private-\n\ label: \"Range\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"AnimateTitle\"\n\ Xmwidth: 125\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 5\n\ XmbottomOffset: 284\n\ XmleftOffset: 73\n\ XmrightOffset: 74\n\ Private-\n\ label: \"Animator\"\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Script\"\n\ Xmwidth: 44\n\ Xmheight: 30\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 221\n\ XmbottomOffset: 68\n\ XmleftOffset: 219\n\ XmrightOffset: 9\n\ Private-\n\ label: \"Script\"\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CommandButton\"\n\ Xmwidth: 164\n\ Xmheight: 23\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 233\n\ XmbottomOffset: 63\n\ XmleftOffset: 4\n\ XmrightOffset: 104\n\ Private-\n\ label: \"Command\"\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Load\"\n\ Xmwidth: 41\n\ Xmheight: 30\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 221\n\ XmbottomOffset: 68\n\ XmleftOffset: 176\n\ XmrightOffset: 55\n\ Private-\n\ label: \"Load\"\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"EtchedInFrame\"\n\ Xmwidth: 96\n\ Xmheight: 40\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 216\n\ XmbottomOffset: 63\n\ XmleftOffset: 172\n\ XmrightOffset: 4\n\ Private-\n\ shadowtype: 2\n\ EndWidget.\n\ Ref: 10\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Stop\"\n\ Xmwidth: 81\n\ Xmheight: 27\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 204\n\ XmbottomOffset: 88\n\ XmleftOffset: 87\n\ XmrightOffset: 104\n\ Private-\n\ label: \"Stop\"\n\ EndWidget.\n\ Ref: 11\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Play\"\n\ Xmwidth: 81\n\ Xmheight: 27\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 204\n\ XmbottomOffset: 88\n\ XmleftOffset: 4\n\ XmrightOffset: 187\n\ Private-\n\ label: \"Play\"\n\ EndWidget.\n\ Ref: 12\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"BStep\"\n\ Xmwidth: 81\n\ Xmheight: 27\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 175\n\ XmbottomOffset: 117\n\ XmleftOffset: 4\n\ XmrightOffset: 187\n\ Private-\n\ label: \"< Step\"\n\ EndWidget.\n\ Ref: 13\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FStep\"\n\ Xmwidth: 81\n\ Xmheight: 27\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 175\n\ XmbottomOffset: 117\n\ XmleftOffset: 87\n\ XmrightOffset: 104\n\ Private-\n\ label: \"Step >\"\n\ EndWidget.\n\ Ref: 14\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"SpeedScale\"\n\ Xmwidth: 96\n\ Xmheight: 19\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 194\n\ XmbottomOffset: 106\n\ XmleftOffset: 172\n\ XmrightOffset: 4\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 15\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 53\n\ Xmheight: 18\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 175\n\ XmbottomOffset: 126\n\ XmleftOffset: 192\n\ XmrightOffset: 27\n\ Private-\n\ label: \"Speed\"\n\ EndWidget.\n\ Ref: 16\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FileText\"\n\ Xmwidth: 264\n\ Xmheight: 30\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 283\n\ XmbottomOffset: 6\n\ XmleftOffset: 4\n\ XmrightOffset: 4\n\ Private-\n\ EndWidget.\n\ Ref: 17\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"AnimList\"\n\ Xmwidth: 264\n\ Xmheight: 137\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 36\n\ XmbottomOffset: 146\n\ XmleftOffset: 4\n\ XmrightOffset: 4\n\ Private-\n\ EndWidget.\n\ Ref: 18\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CloseButton\"\n\ Xmwidth: 59\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 4\n\ XmbottomOffset: 285\n\ XmleftOffset: 209\n\ XmrightOffset: 4\n\ Private-\n\ label: \"Exit\"\n\ EndWidget.\n\ Ref: 19\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"InfoButton\"\n\ Xmwidth: 59\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 4\n\ XmbottomOffset: 285\n\ XmleftOffset: 4\n\ XmrightOffset: 209\n\ Private-\n\ label: \"Info\"\n\ EndWidget.\n\ Ref: 20\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 272\n\ Xmheight: 318\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 1\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.5/src/bin/animate/interface/command.mib0000644000175000017500000000255712310110176017316 00000000000000static char CommRoot[] = "\ TotalWidgets: 4\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 365\n\ Xmheight: 64\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"TextBox\"\n\ Xmwidth: 354\n\ Xmheight: 30\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 28\n\ XmbottomOffset: 6\n\ XmleftOffset: 5\n\ XmrightOffset: 6\n\ Private-\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 23\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 5\n\ XmbottomOffset: 36\n\ XmleftOffset: 142\n\ XmrightOffset: 133\n\ Private-\n\ label: \"Command\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 364\n\ Xmheight: 64\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.5/src/bin/animate/interface/info.mib0000644000175000017500000000332212310110176016622 00000000000000static char InfoRoot[] = "\ TotalWidgets: 5\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 359\n\ Xmheight: 197\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"TextBig\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"TextBig\"\n\ Xmwidth: 351\n\ Xmheight: 157\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 36\n\ XmbottomOffset: 4\n\ XmleftOffset: 4\n\ XmrightOffset: 4\n\ Private-\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Close\"\n\ Xmwidth: 54\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 4\n\ XmbottomOffset: 163\n\ XmleftOffset: 301\n\ XmrightOffset: 4\n\ Private-\n\ label: \"Hide\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Title\"\n\ Xmwidth: 254\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 5\n\ XmbottomOffset: 162\n\ XmleftOffset: 40\n\ XmrightOffset: 65\n\ Private-\n\ label: \"Animation Info\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 359\n\ Xmheight: 197\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: -1\n\ XmrightOffset: 1\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.5/src/bin/animate/interface/Makefile.in0000644000175000017500000003307112310165551017256 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/animate/interface DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = animate.mib command.mib info.mib all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/animate/interface/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/animate/interface/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am # 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: geomview-1.9.5/src/bin/animate/interface/Makefile.am0000644000175000017500000000005612310110176017233 00000000000000EXTRA_DIST = animate.mib command.mib info.mib geomview-1.9.5/src/bin/animate/Makefile.in0000644000175000017500000007365712310165551015334 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ module_PROGRAMS = animate$(EXEEXT) subdir = src/bin/animate DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(moduledir)" PROGRAMS = $(module_PROGRAMS) am_animate_OBJECTS = animate.$(OBJEXT) xanimate.$(OBJEXT) \ glob.$(OBJEXT) animate_OBJECTS = $(am_animate_OBJECTS) am__DEPENDENCIES_1 = animate_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(animate_SOURCES) DIST_SOURCES = $(animate_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) DATA = $(module_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir 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 DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) $(MOTIFINCLUDE) SUBDIRS = interface EXTRA_DIST = animate.1gv man_MANS = animate.1gv animate_SOURCES = \ animate.c xanimate.c glob.c animate.h glob.h xanimate.h \ interface/animate.mib interface/command.mib interface/info.mib animate_LDADD = $(MOTIFUILIB) $(MOTIFLIBS) $(XMULIBS) $(XLIBS) #animate_LDFLAGS = -rpath $(libdir) module_DATA = .geomview-animate CLEANFILES = $(top_builddir)/modules/.geomview-animate $(module_DATA) all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/animate/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/animate/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-modulePROGRAMS: $(module_PROGRAMS) @$(NORMAL_INSTALL) @list='$(module_PROGRAMS)'; test -n "$(moduledir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(moduledir)'"; \ $(MKDIR_P) "$(DESTDIR)$(moduledir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-modulePROGRAMS: @$(NORMAL_UNINSTALL) @list='$(module_PROGRAMS)'; test -n "$(moduledir)" || 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)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files clean-modulePROGRAMS: @list='$(module_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list animate$(EXEEXT): $(animate_OBJECTS) $(animate_DEPENDENCIES) $(EXTRA_animate_DEPENDENCIES) @rm -f animate$(EXEEXT) $(AM_V_CCLD)$(LINK) $(animate_OBJECTS) $(animate_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/animate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glob.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xanimate.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-moduleDATA: $(module_DATA) @$(NORMAL_INSTALL) @list='$(module_DATA)'; test -n "$(moduledir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(moduledir)'"; \ $(MKDIR_P) "$(DESTDIR)$(moduledir)" || 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)$(moduledir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(moduledir)" || exit $$?; \ done uninstall-moduleDATA: @$(NORMAL_UNINSTALL) @list='$(module_DATA)'; test -n "$(moduledir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(moduledir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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" cscopelist: cscopelist-recursive 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) all-local installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-modulePROGRAMS \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-man install-moduleDATA install-modulePROGRAMS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-man uninstall-moduleDATA \ uninstall-modulePROGRAMS uninstall-man: uninstall-man1 .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ check check-am clean clean-generic clean-libtool \ clean-modulePROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-moduleDATA install-modulePROGRAMS \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-man uninstall-man1 uninstall-moduleDATA \ uninstall-modulePROGRAMS .geomview-animate: echo '(emodule-define "Animator" "animate")' > .geomview-animate # Populate local "modules" directory, allowing animate to run in the build dir. all-local: $(top_builddir)/modules/.geomview-animate $(top_builddir)/modules/.geomview-animate: Makefile $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Animator" "$(subdir)/animate")' > $@ # 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: geomview-1.9.5/src/bin/animate/Makefile.am0000644000175000017500000000154612310110176015300 00000000000000INCLUDES = $(default_includes) $(MOTIFINCLUDE) SUBDIRS = interface EXTRA_DIST = animate.1gv man_MANS = animate.1gv module_PROGRAMS = animate animate_SOURCES = \ animate.c xanimate.c glob.c animate.h glob.h xanimate.h \ interface/animate.mib interface/command.mib interface/info.mib animate_LDADD = $(MOTIFUILIB) $(MOTIFLIBS) $(XMULIBS) $(XLIBS) #animate_LDFLAGS = -rpath $(libdir) module_DATA = .geomview-animate .geomview-animate: echo '(emodule-define "Animator" "animate")' > .geomview-animate # Populate local "modules" directory, allowing animate to run in the build dir. all-local: $(top_builddir)/modules/.geomview-animate $(top_builddir)/modules/.geomview-animate: Makefile $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Animator" "$(subdir)/animate")' > $@ CLEANFILES = $(top_builddir)/modules/.geomview-animate $(module_DATA) geomview-1.9.5/src/bin/animate/animate.c0000644000175000017500000003562512310110176015033 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include "glob.h" #include "animate.h" #include "xanimate.h" /*****************************************************************************/ /* static global vars: */ static char **frames = NULL; static int numframes = 0; static int curframe = 0; static int range = 0; static int bounce = 0; static int once = 0; static int direction = 1; static int hidden = 0; static int willplay = 0; static int mypid; static char *command = NULL; /*****************************************************************************/ /* static functions: */ static void clear_frames(); static void anim_parse_args(int, char **); /*****************************************************************************/ void anim_close() { clear_frames(); exit(0); } /*****************************************************************************/ static void showusage() { fprintf(stderr,"Incorrect command line arguments.\n"); fprintf(stderr,"Usage: animate [-w posx posy] [-p] [-b] [-s speed] [-o] [-S script] [-hide]\n\t\t[-f file1 file2 ...]\n"); anim_close(); } /*****************************************************************************/ static char *concat_strings(char **str, int numstr) { int length = 0, n, pos, ch; char *scrbuf; for (n = 0; n < numstr; n++) length += (strlen(str[n]) + 1); length += 10; /* for good measure :-) */ scrbuf = (char *) malloc(sizeof(char) * length); pos = 0; scrbuf[pos] = '{'; pos++; for (n = 0; n < numstr; n++) { for (ch = 0; ch < (int)strlen(str[n]); ch++) { scrbuf[pos] = (str[n])[ch]; pos++; } scrbuf[pos] = ','; pos++; } scrbuf[pos] = '}'; scrbuf[pos + 1] = '\0'; return scrbuf; } /*****************************************************************************/ static void anim_parse_args(int argc, char *argv[]) { int argnum = 1, dlen = 0, tmp = 0, scriptin = 0; char *darg = NULL, *str; if (argc == 1) return; while (argnum < argc) { if ((*argv[argnum] == '-') && ((dlen = strlen(argv[argnum])) >= 2)) { darg = argv[argnum]; darg++; if (dlen == 2) { if (*darg == 'p') { willplay = 1; argnum++; } else if (*darg == 'b') { UIsetBounce(1); anim_bounce(1); argnum++; } else if (*darg == 's') { if ((argc-argnum) < 2) showusage(); if (!sscanf(argv[argnum+1], "%d", &tmp)) showusage(); UIsetSpeed(tmp); argnum += 2; } else if (*darg == 'o') { UIsetOnce(1); anim_once(1); argnum++; } else if (*darg == 'f') { if ((argc-argnum) < 2) showusage(); if (scriptin) { fprintf(stderr, "Can\'t use -S and -f simultaneously.\n"); fprintf(stderr, "Defaulted to -S.\n"); } else { str = concat_strings( &(argv[argnum + 1]), argc - argnum - 1); anim_load(str); free(str); } argnum = argc; } else if (*darg == 'S') { if ((argc-argnum) < 2) showusage(); anim_loadscript( argv[argnum + 1]); scriptin = 1; argnum += 2; } else if (*darg == 'w') { fprintf(stderr,"Window positioning not currently available.\n"); argnum += 3; } } else if ((dlen == 5) && (!strcmp(darg, "hide"))) { hidden = 1; argnum++; } else showusage(); } } } /*****************************************************************************/ int main(int argc, char *argv[]) { mypid = (int) getpid(); UIloadinterface(); anim_parse_args(argc, argv); if (!hidden) UIshowinterface(); if (willplay) anim_play(); UImainloop(); return 0; } /*****************************************************************************/ char *get_info() { static char info[] = "By Daeron Meyer\n\ Version 1.0X\n\ Copyright (c) 1994\n\ The Geometry Center\n\ www.geomview.org\n\ \n\ Geom-Animator is free software and is designed\n\ to be used as an animation tool for Geomview.\n\ It provides several simple animation controls such\n\ as playing, stopping, bouncing, single frame\n\ stepping, as well as going through frames once,\n\ then stopping. It also has the capability to\n\ confine frame playing to a subset of the total\n\ frames with the Range toggle. A brief description\n\ of functionality is included but for a more\n\ complete tutorial, please read the man pages.\n\ \n\ To read in a list of frames, enter their names\n\ in the input box at the bottom of the main panel\n\ and press click on Load. The input box should\n\ also accept any regular expressions. To read\n\ in a script containing a list of frames type\n\ the name of the script in the input box and click\n\ on the Script button.\n\ \n\ Once the frames have been read in (the animate\n\ object will appear in the geomview object\n\ browser) one can scroll through the frames by\n\ clicking on play or clicking on the forward or\n\ backward step buttons. To go directly to a frame,\n\ double click on the list entry for that frame.\n\ Clicking on stop will cause Animator to stop\n\ playing frames. The speed at which frames are\n\ playing can be adjusted using the speed slider.\n\ \n\ Clicking on the once button will set up Animator\n\ to go through a sequence of frames only once\n\ when you click on Play, then cause it to stop on\n\ the last or first frame (depending on the direction\n\ you are playing in).\n\ \n\ Toggling the Bounce button on will put Animator\n\ in bounce mode. This means that once the last\n\ or first frame is reached (while playing frames)\n\ the direction of play will automatically be\n\ reversed.\n\ \n\ Toggling the Range button on will put Animator\n\ in range mode. In this mode, Animator confines\n\ itself to looping through only the frames that\n\ have been outlined in the frame list."; return info; } /*****************************************************************************/ static void clear_frames() { int n; if (numframes == 0) return; fprintf(stdout,"(progn\n"); for (n = 0; n < numframes; n++) { fprintf(stdout, "(read geometry { define a%d-%d { LIST } } )\n", n, mypid); free(frames[n]); } fprintf(stdout,")\n"); fflush(stdout); free(frames); frames = NULL; numframes = 0; } /*****************************************************************************/ static void load_frames(char **new_frames) { char ret = '\0'; frames = new_frames; numframes = 0; UIclearlist(); while ((frames[numframes] != NULL) && (*frames[numframes] != '\0')) { fprintf( stdout, "(read geometry { define a%d-%d < \"%s\" } )\n", numframes, mypid, frames[numframes]); fprintf( stdout, "(read geometry { define anim%d { LIST : a%d-%d } } )\n", mypid, numframes, mypid); fprintf( stdout, "(echo q)\n"); fflush(stdout); ret = (char) fgetc(stdin); if (ret != 'q') anim_close(); /* something must be terribly wrong */ UIaddlist(frames[numframes]); numframes++; } curframe = 0; anim_goframe(curframe); } /*****************************************************************************/ void anim_goframe(int num) { char ret = '\0'; if (num >= numframes) return; curframe = num; /* in case UI is calling this */ fprintf( stdout, "(read geometry { define anim%d { LIST : a%d-%d } } )\n", mypid, num, mypid); if (command) fprintf( stdout, command, num); fprintf( stdout, "\n(echo q)\n"); fflush(stdout); ret = (char) fgetc(stdin); if (ret != 'q') anim_close(); /* something must be terribly wrong */ UIsetframe(frames[num]); } /*****************************************************************************/ void anim_sigframes(int cur, int *prev, int *next, int *first, int *last) { int *pos_list; int pos_count; int will_free = 0; int n = 0, hit = 0; if (numframes == 0) { anim_close(); /* something must be terribly wrong */ } if (!range) { *prev = cur - 1; if (*prev < 0) *prev = numframes - 1; *next = cur + 1; if (*next >= numframes) *next = 0; *first = 0; *last = numframes - 1; return; } will_free = UIgetselected(&pos_list, &pos_count); if (pos_count == 0) { *prev = cur; *next = cur; *first = 0; *last = numframes - 1; } else if (pos_count == 1) { if (!pos_list) *prev = cur; else *prev = pos_list[0] - 1; if ((*prev < 0) || (*prev >= numframes)) *prev = 0; *next = *prev; *first = *prev; *last = *prev; } else { *first = pos_list[0] - 1; *last = pos_list[pos_count - 1] - 1; *prev = -1; *next = *first; for (n = 0; ((n < pos_count) && !hit) ; n++) { if (((pos_list[n] - 1) == cur) || ((pos_list[n] - 1) > cur)) { hit = 1; if (n == (pos_count - 1)) *next = pos_list[0] - 1; else *next = pos_list[n+1] - 1; } else *prev = pos_list[n] - 1; } if (*prev == -1) *prev = pos_list[pos_count - 1] - 1; } if (will_free) free(pos_list); } /*****************************************************************************/ void anim_stop() { UIstopplay(); } /*****************************************************************************/ void anim_play() { if (numframes) UIstartplay(); } /*****************************************************************************/ void anim_playing() { if (direction) anim_stepf(); else anim_stepb(); } /*****************************************************************************/ void anim_stepf() { int next, prev, first, last; if (!numframes) return; anim_sigframes(curframe, &prev, &next, &first, &last); curframe = next; direction = 1; if ((curframe == (numframes - 1)) || (range && (curframe == last))) { if (once) anim_stop(); if (bounce) direction = 0; } anim_goframe(curframe); } /*****************************************************************************/ void anim_stepb() { int next, prev, first, last; if (!numframes) return; anim_sigframes(curframe, &prev, &next, &first, &last); curframe = prev; direction = 0; if ((curframe == 0) || (range && (curframe == first))) { if (once) anim_stop(); if (bounce) direction = 1; } anim_goframe(curframe); } /*****************************************************************************/ void anim_range(int num) { range = num; } /*****************************************************************************/ void anim_bounce(int num) { bounce = num; } /*****************************************************************************/ void anim_once(int num) { once = num; } /*****************************************************************************/ void anim_setcommand(char *str) { if (!strlen(str)) { if (command == NULL) return; free(command); command = NULL; } if (command != NULL) free(command); command = (char *) malloc( sizeof(char) * (strlen(str) + 1) ); sprintf(command,"%s",str); } /*****************************************************************************/ void anim_load(char *in_glob) { char **new_frames = NULL; if (in_glob == NULL) return; if (in_glob[0] == '\0') return; new_frames = glob(in_glob); if (new_frames == NULL) return; if (new_frames[0] != NULL) { fprintf(stdout,"(read geometry { define anim%d { LIST } } )\n", mypid); fprintf(stdout,"(geometry animate%d : anim%d)\n", mypid, mypid); fflush(stdout); clear_frames(); load_frames(new_frames); } return; } /*****************************************************************************/ static char **get_script(char *in_scr) { FILE *scriptfile; char *scrbuf, **result, ch = '\0'; int bufsize = 1000; int position = 0, wait = 0, inword = 0; scrbuf = (char *) malloc(sizeof(char) * (bufsize + 1)); if (!(scriptfile = fopen(in_scr, "r"))) { fprintf(stderr, "Unable to open script file.\n"); return NULL; } #define IS_NEWLINE '\n' #define IS_COMMENT '#' #define IS_SPACE ' ' #define IS_TAB '\t' #define IS_LB '{' #define IS_COMMA ',' #define IS_RB '}' scrbuf[position] = IS_LB; position++; while ( !feof(scriptfile) ) { ch = (char) fgetc(scriptfile); if (ch == IS_COMMENT) wait = 1; if (wait) { if (ch == IS_NEWLINE) wait = 0; } if (!wait) { if ((ch != IS_TAB ) && (ch != IS_NEWLINE) && (ch != IS_SPACE) && !feof(scriptfile)) { scrbuf[position] = ch; position++; if (position == (bufsize - 2)) { bufsize *= 2; scrbuf = (char *)realloc(scrbuf, sizeof(char) * (bufsize + 1)); } inword = 1; } else if (inword) { inword = 0; scrbuf[position] = IS_COMMA; position++; if (position == (bufsize - 2)) { bufsize *= 2; scrbuf = (char *)realloc(scrbuf, sizeof(char) * (bufsize + 1)); } } } } scrbuf[position-1] = IS_RB; fclose(scriptfile); scrbuf[position] = '\0'; /* terminate buffer */ result = glob(scrbuf); /* glob it */ free(scrbuf); /* remove the buffer */ return result; /* return globbed list of files */ } /*****************************************************************************/ void anim_loadscript(char *in_scr) { char **new_frames = NULL; if (in_scr == NULL) return; if (in_scr[0] == '\0') return; new_frames = get_script(in_scr); if (new_frames == NULL) return; if (new_frames[0] != NULL) { fprintf(stdout,"(read geometry { define anim%d { LIST } } )\n", mypid); fprintf(stdout,"(geometry animate%d : anim%d)\n", mypid, mypid); fflush(stdout); clear_frames(); load_frames(new_frames); } return; } /*****************************************************************************/ void anim_speed(int percent) { /* for now we let the user interface handle the the speed of update */ } /*****************************************************************************/ geomview-1.9.5/src/bin/animate/xanimate.c0000644000175000017500000003615712310110176015224 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #if HAVE_CONFIG_H # include "config.h" #endif #include #include "mibload.h" #include "animate.h" #include "xanimate.h" #include "interface/animate.mib" #include "interface/info.mib" #include "interface/command.mib" /*****************************************************************************/ /* static global vars */ static XtAppContext App; static Widget TopLevel, AnimList, FileText, CommandText, RangeToggle, OnceToggle, BounceToggle, SpeedScale; static int playing = 0; static long speed = 0L; #define NULL_XtIntervalId ((XtIntervalId)NULL) static XtIntervalId lasttime = NULL_XtIntervalId; /*****************************************************************************/ static void close_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); static void info_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); static void bstep_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); static void fstep_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); static void play_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); static void stop_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); static void load_callback(Widget , XtPointer, XmAnyCallbackStruct *); static void script_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); static void command_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); static void typecommand_cback(Widget , XtPointer, XmAnyCallbackStruct *); static void frameselect_callback(Widget, XtPointer, XmListCallbackStruct *); static void range_callback(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void once_callback(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void bounce_callback(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void speed_callback(Widget, XtPointer, XmScaleCallbackStruct *); /*****************************************************************************/ void keep_playing(XtPointer); /*****************************************************************************/ static void cinfo_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); void UIloadinterface() { Display *dpy; Widget MainWindow, InfoWindow, CommandWindow, InfoButton, CommandButton, PlayButton, StopButton, BStepButton, FStepButton, LoadButton, ScriptButton, CloseButton, AnimateTitle, InfoTitle, InfoText, InfoClose; XFontStruct *font; XmFontList fontlist; Arg args[10]; int n, oldstderr; int argcblah = 1; char *argvblah[1] = { "Animate" }; FILE *dummy; mib_Widget *MainForm, *InfoForm, *CommandForm; String fallbacks[] = { #ifdef dark_ui "*Foreground: gray20", "*Background: gray70", #endif #ifdef light_ui "*Foreground: #000000000000", "*Background: #afafafafafaf", #endif "*BorderWidth: 0", "*XmToggleButton.selectColor: yellow", "*XmToggleButton.indicatorSize: 16", "*XmToggleButtonGadget.selectColor: yellow", "*XmToggleButtonGadget.indicatorSize: 16", "*XmTextField.background: #cc7777", "*fontList:\ -adobe-helvetica-medium-r-normal--14-100-100-100-p-76-iso8859-1", NULL}; /* initialize application top level widget */ TopLevel = XtVaAppInitialize(&App, "animate", NULL, 0, &argcblah, argvblah, fallbacks, NULL); dpy = XtDisplay(TopLevel); oldstderr = dup(fileno(stderr)); dummy = freopen("/dev/null", "w", stderr); (void)dummy; /* configure resize policy of window */ XtVaSetValues(TopLevel, XmNminWidth, 272, XmNminHeight, 319, XmNkeyboardFocusPolicy, XmPOINTER, NULL); /* create the application windows */ MainWindow = XtCreateManagedWidget("MainWindow", xmMainWindowWidgetClass, TopLevel, NULL, 0); /*****************************************************************************/ n = 0; XtSetArg(args[n], XmNminWidth, 359); n++; XtSetArg(args[n], XmNminHeight, 197); n++; XtSetArg(args[n], XmNtitle, "Info"); n++; InfoWindow = XmCreateFormDialog(MainWindow, "Info", args, n); /*****************************************************************************/ n = 0; XtSetArg(args[n], XmNminWidth, 365); n++; XtSetArg(args[n], XmNminHeight, 64); n++; XtSetArg(args[n], XmNmaxHeight, 64); n++; XtSetArg(args[n], XmNtitle, "Command"); n++; XtSetArg(args[n], XmNkeyboardFocusPolicy, XmPOINTER); n++; CommandWindow = XmCreateFormDialog(MainWindow, "Command", args, n); /*****************************************************************************/ /* load the interface via the mib library */ /* MainForm = mib_load_interface(MainWindow, "interface/animate.mib", MI_FROMFILE); InfoForm = mib_load_interface(InfoWindow, "interface/info.mib", MI_FROMFILE); CommandForm = mib_load_interface(CommandWindow, "interface/command.mib", MI_FROMFILE); */ MainForm = mib_load_interface(MainWindow, AnimRoot, MI_FROMSTRING); InfoForm = mib_load_interface(InfoWindow, InfoRoot, MI_FROMSTRING); CommandForm = mib_load_interface(CommandWindow, CommRoot, MI_FROMSTRING); /* Get widget pointers from interface */ AnimateTitle = mib_find_name(MainForm, "AnimateTitle")->me; CloseButton = mib_find_name(MainForm, "CloseButton")->me; InfoButton = mib_find_name(MainForm, "InfoButton")->me; CommandButton = mib_find_name(MainForm, "CommandButton")->me; ScriptButton = mib_find_name(MainForm, "Script")->me; LoadButton = mib_find_name(MainForm, "Load")->me; PlayButton = mib_find_name(MainForm, "Play")->me; StopButton = mib_find_name(MainForm, "Stop")->me; BStepButton = mib_find_name(MainForm, "BStep")->me; FStepButton = mib_find_name(MainForm, "FStep")->me; SpeedScale = mib_find_name(MainForm, "SpeedScale")->me; FileText = mib_find_name(MainForm, "FileText")->me; AnimList = mib_find_name(MainForm, "AnimList")->me; RangeToggle = mib_find_name(MainForm, "Range")->me; OnceToggle = mib_find_name(MainForm, "Once")->me; BounceToggle = mib_find_name(MainForm, "Bounce")->me; InfoTitle = mib_find_name(InfoForm, "Title")->me; InfoText = mib_find_name(InfoForm, "TextBig")->me; InfoClose = mib_find_name(InfoForm, "Close")->me; CommandText = mib_find_name(CommandForm, "TextBox")->me; /* Set large font for titles */ font = XLoadQueryFont(dpy, "-adobe-helvetica-bold-r-normal--24-240-75-75-p-138-iso8859-1"); fontlist = XmFontListCreate(font, "bigger"); XtVaSetValues(AnimateTitle, XmNfontList, fontlist, NULL); XtVaSetValues(InfoTitle, XmNfontList, fontlist, NULL); /* Set various resources and values */ XtVaSetValues(InfoText, XmNcursorPositionVisible, False, XmNeditable, False, NULL); XmTextSetString(InfoText, get_info()); XtVaSetValues(AnimList, XmNselectionPolicy, XmEXTENDED_SELECT, NULL); XmScaleSetValue(SpeedScale, 100); /* Set callbacks - stupid @#$@&%!@# boiler plate code */ XtAddCallback(CloseButton, XmNactivateCallback, (XtCallbackProc)close_callback, (XtPointer)NULL ); XtAddCallback(InfoButton, XmNactivateCallback, (XtCallbackProc)info_callback, (XtPointer)InfoWindow ); XtAddCallback(InfoClose, XmNactivateCallback, (XtCallbackProc)cinfo_callback, (XtPointer)InfoWindow ); XtAddCallback(BStepButton, XmNactivateCallback, (XtCallbackProc)bstep_callback, (XtPointer)NULL ); XtAddCallback(FStepButton, XmNactivateCallback, (XtCallbackProc)fstep_callback, (XtPointer)NULL ); XtAddCallback(PlayButton, XmNactivateCallback, (XtCallbackProc)play_callback, (XtPointer)NULL ); XtAddCallback(StopButton, XmNactivateCallback, (XtCallbackProc)stop_callback, (XtPointer)NULL ); XtAddCallback(LoadButton, XmNactivateCallback, (XtCallbackProc)load_callback, (XtPointer)FileText ); XtAddCallback(FileText, XmNactivateCallback, (XtCallbackProc)load_callback, (XtPointer)FileText ); XtAddCallback(ScriptButton, XmNactivateCallback, (XtCallbackProc)script_callback, (XtPointer)FileText ); XtAddCallback(CommandButton, XmNactivateCallback, (XtCallbackProc)command_callback, (XtPointer)CommandWindow ); XtAddCallback(AnimList, XmNdefaultActionCallback, (XtCallbackProc)frameselect_callback, (XtPointer)NULL ); XtAddCallback(RangeToggle, XmNvalueChangedCallback, (XtCallbackProc)range_callback, (XtPointer)NULL ); XtAddCallback(OnceToggle, XmNvalueChangedCallback, (XtCallbackProc)once_callback, (XtPointer)NULL ); XtAddCallback(BounceToggle, XmNvalueChangedCallback, (XtCallbackProc)bounce_callback, (XtPointer)NULL ); XtAddCallback(CommandText, XmNactivateCallback, (XtCallbackProc)typecommand_cback, (XtPointer)CommandWindow ); XtAddCallback(SpeedScale, XmNdragCallback, (XtCallbackProc)speed_callback, (XtPointer)NULL ); dummy = freopen("/dev/null", "w", stderr); dup2(oldstderr, fileno(stderr)); close(oldstderr); /* Bring the application window up on the screen. */ } void UIshowinterface() { XtRealizeWidget(TopLevel); } void UImainloop() { /* Begin main Intrinsics event loop */ XtAppMainLoop (App); } /*****************************************************************************/ void UIclearlist() { XmListDeleteAllItems(AnimList); } /*****************************************************************************/ void UIaddlist(char *line) { XmString item = XmStringCreateSimple(line); XmListAddItem(AnimList, item, 0); /* add item to the end of the list */ XmStringFree(item); } /*****************************************************************************/ void UIsetframe(char *line) { XmTextFieldSetString(FileText, line); } /*****************************************************************************/ int UIgetselected(int **pos_list, int *pos_count) { return (int)XmListGetSelectedPos(AnimList, pos_list, pos_count); } /*****************************************************************************/ void UIstartplay() { if (playing) return; lasttime = XtAppAddTimeOut(App, speed, (XtTimerCallbackProc)keep_playing, (XtPointer) NULL); playing = 1; } void UIstopplay() { playing = 0; if (lasttime != NULL_XtIntervalId) { XtRemoveTimeOut(lasttime); lasttime = NULL_XtIntervalId; } } /*****************************************************************************/ void keep_playing(XtPointer data) { XEvent xev; lasttime = NULL_XtIntervalId; if (playing) { while (XtAppPending(App)) /* clear out event queue */ { /* before adding another timeout. */ XtAppNextEvent(App, &xev); XtDispatchEvent(&xev); } if (lasttime == NULL_XtIntervalId) lasttime = XtAppAddTimeOut(App, speed, (XtTimerCallbackProc)keep_playing, (XtPointer) NULL); anim_playing(); } } /*****************************************************************************/ void UIsetRange(int val) { XmToggleButtonSetState(RangeToggle, val, False); } /*****************************************************************************/ void UIsetOnce(int val) { XmToggleButtonSetState(OnceToggle, val, False); } /*****************************************************************************/ void UIsetBounce(int val) { XmToggleButtonSetState(BounceToggle, val, False); } /*****************************************************************************/ void UIsetSpeed(int val) { XmScaleSetValue(SpeedScale, val); if (val == 0) speed = 60000L; else if (val > 0) speed = (long) ((100.0 - (float)val) * (100.0 - (float)val) * (100.0 - (float)val) / 100.0) + 30L; } /*****************************************************************************/ static void close_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { anim_close(); } static void info_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { XtManageChild((Widget)data); } static void cinfo_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { XtUnmanageChild((Widget)data); } static void command_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { XtManageChild((Widget)data); } static void bstep_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { anim_stop(); anim_stepb(); } static void fstep_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { anim_stop(); anim_stepf(); } static void play_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { anim_play(); } static void stop_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { anim_stop(); } static void load_callback( Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { char *str; str = XmTextFieldGetString((Widget)data); anim_load(str); XtFree(str); } static void script_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { char *str; str = XmTextFieldGetString((Widget)data); anim_loadscript(str); XtFree(str); } static void frameselect_callback( Widget w, XtPointer data, XmListCallbackStruct *cbs) { anim_stop(); anim_goframe(cbs->item_position - 1); } static void range_callback( Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { anim_range(cbs->set); } static void once_callback( Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { anim_once(cbs->set); } static void bounce_callback( Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { anim_bounce(cbs->set); } static void typecommand_cback( Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { char *str; str = XmTextFieldGetString(CommandText); anim_setcommand(str); XtFree(str); XtUnmanageChild((Widget)data); } static void speed_callback( Widget w, XtPointer data, XmScaleCallbackStruct *cbs) { int rmv = 0; if (lasttime != NULL_XtIntervalId) /* get rid of old timeout */ { XtRemoveTimeOut(lasttime); lasttime = NULL_XtIntervalId; rmv = 1; /* removed timeout */ } if (cbs->value == 0) speed = 60000L; else if (cbs->value > 0) speed = (long) ((100.0 - (float)cbs->value) * (100.0 - (float)cbs->value) * (100.0 - (float)cbs->value) / 100.0) + 30L; if (rmv) lasttime = XtAppAddTimeOut(App, speed, (XtTimerCallbackProc)keep_playing, (XtPointer) NULL); } geomview-1.9.5/src/bin/animate/glob.c0000644000175000017500000002644012310110176014333 00000000000000/* * Copyright (c) 1980 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the University of California, Berkeley. The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if 0 #ifndef lint static char sccsid[] = "@(#)glob.c 5.7 (Berkeley) 12/14/88"; #endif /* not lint */ #endif #if HAVE_CONFIG_H # include "config.h" #endif /* * C-shell glob for random programs. */ #include #include #include #include #include #include #include #include #include #include #if !defined(dirfd) && !defined(__GLIBC__) && !defined(__linux__) && !defined(__FreeBSD__) && !defined(__CYGWIN__) && !defined(__APPLE__) #define dirfd(dirp) ((dirp)->dd_fd) #endif #ifndef NCARGS #define NCARGS 10240 #endif #define QUOTE 0200 #define TRIM 0177 #define eq(a,b) (strcmp(a, b)==0) #define GAVSIZ (NCARGS/6) #define isdir(d) ((d.st_mode & S_IFMT) == S_IFDIR) static char **gargv; /* Pointer to the (stack) arglist */ static int gargc; /* Number args in gargv */ static int gnleft; static short gflag; static int tglob(); char **glob(); static void rscan(char **, int ()); static void ginit(char **); static void collect(char *); static void acollect(char *); static void sort(); static void expand(char *); static void matchdir(char *); static int execbrc(char *, char *); static int match(char *, char *); static int amatch(char *, char *); #if 0 static int Gmatch(char *, char *); #endif static void Gcat(char *, char *); static void addpath(char); static void fatal(char *); /*static void scan(char **, int ());*/ char *globerr; char *home; struct passwd *getpwnam(); extern int errno; static char *strspl(), *strend(); /*char *malloc(), *strcpy(), *strcat(); */ char **copyblk(); static int globcnt; char *globchars = "`{[*?"; static char *gpath, *gpathp, *lastgpathp; static int globbed; static char *entp; static char **sortbas; void blkfree(); int letter(); int digit(); int gethdir(); int any(); char ** glob(v) char *v; { char agpath[BUFSIZ]; char *agargv[GAVSIZ]; char *vv[2]; vv[0] = v; vv[1] = 0; gflag = 0; rscan(vv, tglob); if (gflag == 0) return (copyblk(vv)); globerr = 0; gpath = agpath; gpathp = gpath; *gpathp = 0; lastgpathp = &gpath[sizeof agpath - 2]; ginit(agargv); globcnt = 0; collect(v); if (globcnt == 0 && (gflag&1)) { blkfree(gargv), gargv = 0; return (0); } else return (gargv = copyblk(gargv)); } static void ginit(agargv) char **agargv; { agargv[0] = 0; gargv = agargv; sortbas = agargv; gargc = 0; gnleft = NCARGS - 4; } static void collect(as) char *as; { if (eq(as, "{") || eq(as, "{}")) { Gcat(as, ""); sort(); } else acollect(as); } static void acollect(as) char *as; { int ogargc = gargc; gpathp = gpath; *gpathp = 0; globbed = 0; expand(as); if (gargc != ogargc) sort(); } static void sort() { char **p1, **p2, *c; char **Gvp = &gargv[gargc]; p1 = sortbas; while (p1 < Gvp-1) { p2 = p1; while (++p2 < Gvp) if (strcmp(*p1, *p2) > 0) c = *p1, *p1 = *p2, *p2 = c; p1++; } sortbas = Gvp; } static void expand(as) char *as; { char *cs; char *sgpathp, *oldcs; struct stat stb; sgpathp = gpathp; cs = as; if (*cs == '~' && gpathp == gpath) { addpath('~'); for (cs++; letter(*cs) || digit(*cs) || *cs == '-';) addpath(*cs++); if (!*cs || *cs == '/') { if (gpathp != gpath + 1) { *gpathp = 0; if (gethdir(gpath + 1)) globerr = "Unknown user name after ~"; (void) strcpy(gpath, gpath + 1); } else { if(home == NULL) { struct passwd *pp; extern char *getenv(); home = getenv("HOME"); if(home == NULL) { pp = getpwuid(getuid()); if(pp != NULL) home = pp->pw_dir; } } if(home == NULL) { home = ""; globerr = "Can't determine own home directory"; } else { (void) strcpy(gpath, home); } } gpathp = strend(gpath); } } while (!any(*cs, globchars)) { if (*cs == 0) { if (!globbed) Gcat(gpath, ""); else if (stat(gpath, &stb) >= 0) { Gcat(gpath, ""); globcnt++; } goto endit; } addpath(*cs++); } oldcs = cs; while (cs > as && *cs != '/') cs--, gpathp--; if (*cs == '/') cs++, gpathp++; *gpathp = 0; if (*oldcs == '{') { (void) execbrc(cs, ((char *)0)); return; } matchdir(cs); endit: gpathp = sgpathp; *gpathp = 0; } static void matchdir(pattern) char *pattern; { struct stat stb; struct dirent *dp; DIR *dirp; dirp = opendir(gpath[0] == '\0' ? "." : gpath); if (dirp == NULL) { if (globbed) return; goto patherr2; } if (fstat(dirfd(dirp), &stb) < 0) goto patherr1; if (!isdir(stb)) { errno = ENOTDIR; goto patherr1; } while ((dp = readdir(dirp)) != NULL) { if (dp->d_ino == 0) continue; if (match(dp->d_name, pattern)) { Gcat(gpath, dp->d_name); globcnt++; } } closedir(dirp); return; patherr1: closedir(dirp); patherr2: globerr = "Bad directory components"; } static int execbrc(p, s) char *p, *s; { char restbuf[BUFSIZ + 2]; char *pe, *pm, *pl; int brclev = 0; char *lm, savec, *sgpathp; for (lm = restbuf; *p != '{'; *lm++ = *p++) continue; for (pe = ++p; *pe; pe++) switch (*pe) { case '{': brclev++; continue; case '}': if (brclev == 0) goto pend; brclev--; continue; case '[': for (pe++; *pe && *pe != ']'; pe++) continue; continue; } pend: brclev = 0; for (pl = pm = p; pm <= pe; pm++) switch (*pm & (QUOTE|TRIM)) { case '{': brclev++; continue; case '}': if (brclev) { brclev--; continue; } goto doit; case ','|QUOTE: case ',': if (brclev) continue; doit: savec = *pm; *pm = 0; (void) strcpy(lm, pl); (void) strcat(restbuf, pe + 1); *pm = savec; if (s == 0) { sgpathp = gpathp; expand(restbuf); gpathp = sgpathp; *gpathp = 0; } else if (amatch(s, restbuf)) return (1); sort(); pl = pm + 1; if (brclev) return (0); continue; case '[': for (pm++; *pm && *pm != ']'; pm++) continue; if (!*pm) pm--; continue; } if (brclev) goto doit; return (0); } static int match(s, p) char *s, *p; { int c; char *sentp; char sglobbed = globbed; if (*s == '.' && *p != '.') return (0); sentp = entp; entp = s; c = amatch(s, p); entp = sentp; globbed = sglobbed; return (c); } static int amatch(s, p) char *s, *p; { int scc; int ok, lc; char *sgpathp; struct stat stb; int c, cc; globbed = 1; for (;;) { scc = *s++ & TRIM; switch (c = *p++) { case '{': return (execbrc(p - 1, s - 1)); case '[': ok = 0; lc = 077777; while ((cc = *p++)) { if (cc == ']') { if (ok) break; return (0); } if (cc == '-') { if (lc <= scc && scc <= *p++) ok++; } else if (scc == (lc = cc)) ok++; } if ((cc == 0)) { if (ok) { p--; } else { return 0; } } continue; case '*': if (!*p) return (1); if (*p == '/') { p++; goto slash; } s--; do { if (amatch(s, p)) return (1); } while (*s++); return (0); case 0: return (scc == 0); default: if (c != scc) return (0); continue; case '?': if (scc == 0) return (0); continue; case '/': if (scc) return (0); slash: s = entp; sgpathp = gpathp; while (*s) addpath(*s++); addpath('/'); if (stat(gpath, &stb) == 0 && isdir(stb)) { if (*p == 0) { Gcat(gpath, ""); globcnt++; } else { expand(p); } } gpathp = sgpathp; *gpathp = 0; return (0); } } } #if 0 static int Gmatch(s, p) char *s, *p; { int scc; int ok, lc; int c, cc; for (;;) { scc = *s++ & TRIM; switch (c = *p++) { case '[': ok = 0; lc = 077777; while ((cc = *p++)) { if (cc == ']') { if (ok) break; return (0); } if (cc == '-') { if (lc <= scc && scc <= *p++) ok++; } else if (scc == (lc = cc)) ok++; } if ((cc == 0)) { if (ok) { p--; } else { return 0; } } continue; case '*': if (!*p) return (1); for (s--; *s; s++) if (Gmatch(s, p)) return (1); return (0); case 0: return (scc == 0); default: if ((c & TRIM) != scc) return (0); continue; case '?': if (scc == 0) return (0); continue; } } } #endif static void Gcat(s1, s2) char *s1, *s2; { int len = strlen(s1) + strlen(s2) + 1; if (len >= gnleft || gargc >= GAVSIZ - 1) globerr = "Arguments too long"; else { gargc++; gnleft -= len; gargv[gargc] = 0; gargv[gargc - 1] = strspl(s1, s2); } } static void addpath(char c) { if (gpathp >= lastgpathp) globerr = "Pathname too long"; else { *gpathp++ = c; *gpathp = 0; } } static void rscan(t, f) char **t; int (*f)(); { char *p, c; while ((p = *t++)) { if (f == tglob) { if (*p == '~') { gflag |= 2; } else if (eq(p, "{") || eq(p, "{}")) { continue; } } while ((c = *p++)) (*f)(c); } } /* static void scan(t, f) char **t; int (*f)(); { char *p, c; while (p = *t++) while (c = *p) *p++ = (*f)(c); } */ static int tglob(c) char c; { if (any(c, globchars)) gflag |= c == '{' ? 2 : 1; return (c); } /* static void trim(c) char c; { return (c & TRIM); } */ int letter(c) char c; { return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'); } int digit(c) char c; { return (c >= '0' && c <= '9'); } int any(c, s) int c; char *s; { while (*s) if (*s++ == c) return(1); return(0); } int blklen(av) char **av; { int i = 0; while (*av++) i++; return (i); } char ** blkcpy(oav, bv) char **oav; char **bv; { char **av = oav; while ((*av++ = *bv++)) continue; return (oav); } void blkfree(av0) char **av0; { char **av = av0; while (*av) free(*av++); } static char * strspl(cp, dp) char *cp, *dp; { char *ep = malloc((unsigned)(strlen(cp) + strlen(dp) + 1)); if (ep == (char *)0) fatal("Out of memory"); (void) strcpy(ep, cp); (void) strcat(ep, dp); return (ep); } char ** copyblk(v) char **v; { char **nv = (char **)malloc((unsigned)((blklen(v) + 1) * sizeof(char **))); if (nv == (char **)0) fatal("Out of memory"); return (blkcpy(nv, v)); } static char * strend(cp) char *cp; { while (*cp) cp++; return (cp); } /* * Extract a home directory from the password file * The argument points to a buffer where the name of the * user whose home directory is sought is currently. * We write the home directory of the user back there. */ int gethdir(home) char *home; { struct passwd *pp = getpwnam(home); if (!pp || home + strlen(pp->pw_dir) >= lastgpathp) return (1); (void) strcpy(home, pp->pw_dir); return (0); } static void fatal(s) char *s; { fprintf( stderr, "glob: %s\n", s ); exit(1); } geomview-1.9.5/src/bin/animate/animate.h0000644000175000017500000000232012310110176015022 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ void anim_close(); char *get_info(); void anim_goframe(int); void anim_stop(); void anim_play(); void anim_playing(); void anim_stepf(); void anim_stepb(); void anim_range(int); void anim_bounce(int); void anim_once(int); void anim_setcommand(char *); void anim_load(char *); void anim_loadscript(char *); void anim_speed(int); geomview-1.9.5/src/bin/animate/glob.h0000644000175000017500000000163512310110176014337 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ char **glob(char *); geomview-1.9.5/src/bin/animate/xanimate.h0000644000175000017500000000226112310110176015216 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ void UIloadinterface(); void UIshowinterface(); void UImainloop(); void UIclearlist(); void UIaddlist(char *); void UIsetframe(char *); void UIstartplay(); void UIstopplay(); int UIgetselected(int **, int *); void UIsetRange(int); void UIsetOnce(int); void UIsetBounce(int); void UIsetSpeed(int); geomview-1.9.5/src/bin/animate/animate.1gv0000644000175000017500000001056312310110176015300 00000000000000.TH animate 1gv "December 12, 1994" " " "Geomview Module" .SH NAME animate \- animate a sequence of geomview files .SH SYNOPSIS .nf animate [-p] [-b] [-s speed] [-o] [-S script] [-hide] [-f file1 file2 ...] .fi .SH DESCRIPTION .PP Animate is an interactive animation tool specifically designed to be used with Geomview. It provides several simple animation controls such as looping, bouncing, and single frame stepping, as well as adjustable speed playing. The program works by telling geomview to read in a sequence of geomview files and then telling geomview to display each frame of the sequence in order. .PP There are two methods that Animate provides for specifying which frames one wants to have in the sequence being viewed. The first method is to enter the name of every frame into the text input box and press return or click on load. The name of each frame must correspond with the name of a geomview file existing in the file system. .nf EXAMPLES pict1 pict2 pict3 pict4 pict* pic?? .fi .PP The second method of loading frames is to first create an animation script file outside of animate and then load the script in by typing its name in the input box and clicking on the script button. The advantage of this method is that you can more easily specify the exact order in which you want the frames to be shown. The format of the script file is a list of frame names each followed by a newline. Comments prepended by a # sign are allowed. .nf EXAMPLE SCRIPT FILE # list of frames for # my rotating cube movie cube.02 cube.04 cube.03 # get rid of this frame later cube.01 . . . cube.90 .fi .PP Loading frames into memory may take a little time, especially if each frame is a particularly large file. Be sure the machine you're using has sufficient memory to load all the frames you desire. Once all frames have been loaded, an 'animate' object will appear in the geomview object browser. It is now possible to begin animating. .PP Scrolling through frames can be accomplished in several different ways. The first, and most obvious way is by 'playing' the frames. Clicking on the \fBPlay\fP button causes animate to begin playing through the frames in order, starting with the first frame or whichever frame has been selected. The corresponding name of each frame being shown is shown in the pink text-entry box. Click on \fBStop\fP to cease playing. .PP Animation speed depends on the size and complexity of the object in each frame. Thus different sequences can have considerably different top playing speeds. Use the \fBSpeed\fP slider to set an upper limit to the animation rate. You can also play slowly through the frames can also by clicking repeatedly on either step button. .PP Press the \fBBounce\fP button to enter bounce mode. While in bounce mode, direction of play reverses whenever the first or last frame is reached. Clicking on either \fBStep\fP button determines the playing direction. .PP Clicking on \fBOnce\fP puts animate in 'once' mode. While in this mode, upon reaching the first or last frame (depending on which direction you are going) of a specified sequence, animate will stop playing. Normal playing can be resumed by clicking on \fBOnce\fP again to exit this mode. .PP The \fBInfo\fP button will bring up a short menu containing helpful hints for program usage. Clicking on the exit button will cause the program to exit. .SH OPTIONS .TP -p Start playing through the frames right away upon startup. .TP -b Go into bounce mode upon startup. .TP -s speed Set the speed of play upon startup. The value of speed may be an integer between 0 and 100 which roughly signifies the percentage of top playing speed. .TP -o Set animation to play through only once upon startup. .TP -S script Specify name of script containing filenames for objects to be read in upon startup. Takes precedence over -f option if present. .TP -hide Makes animate invisible upon startup. *Warning* all animate commands must be specified on the command line when this option is used since there is no way to access the main window. .TP -f file1 file2 ... Specify names of files containing objects to be read in upon startup. .SH BUGS .PP When loading sequences one after another, geomview will often not load a sequence on the first try. This can often be remedied by telling animate to load the sequence yet again. .PP .SH SEE ALSO geomview(1) oogl(5) .SH AUTHOR .nf Daeron Meyer The Geometry Center .fi geomview-1.9.5/src/bin/clipboard/0000755000175000017500000000000012310165604013645 500000000000000geomview-1.9.5/src/bin/clipboard/Makefile.in0000644000175000017500000005716112310165552015646 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ module_PROGRAMS = clipboard$(EXEEXT) subdir = src/bin/clipboard DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(moduledir)" PROGRAMS = $(module_PROGRAMS) am_clipboard_OBJECTS = clipboard.$(OBJEXT) clipx.$(OBJEXT) clipboard_OBJECTS = $(am_clipboard_OBJECTS) clipboard_LDADD = $(LDADD) am__DEPENDENCIES_1 = 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(clipboard_SOURCES) DIST_SOURCES = $(clipboard_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(module_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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) $(MOTIFINCLUDE) LDADD = $(OOGLLIB) $(MOTIFUILIB) $(MOTIFLIBS) $(XMULIBS) $(XLIBS) man_MANS = clipboard_SOURCES = clipboard.c clipboard.mib clipx.c clip.h clipboard_DEPENDENCIES = $(OOGLLIB) #clipboard_LDFLAGS = -rpath $(libdir) module_DATA = .geomview-clipboard CLEANFILES = $(top_builddir)/modules/.geomview-clipboard $(module_DATA) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/clipboard/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/clipboard/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-modulePROGRAMS: $(module_PROGRAMS) @$(NORMAL_INSTALL) @list='$(module_PROGRAMS)'; test -n "$(moduledir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(moduledir)'"; \ $(MKDIR_P) "$(DESTDIR)$(moduledir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-modulePROGRAMS: @$(NORMAL_UNINSTALL) @list='$(module_PROGRAMS)'; test -n "$(moduledir)" || 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)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files clean-modulePROGRAMS: @list='$(module_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clipboard$(EXEEXT): $(clipboard_OBJECTS) $(clipboard_DEPENDENCIES) $(EXTRA_clipboard_DEPENDENCIES) @rm -f clipboard$(EXEEXT) $(AM_V_CCLD)$(LINK) $(clipboard_OBJECTS) $(clipboard_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clipboard.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clipx.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-moduleDATA: $(module_DATA) @$(NORMAL_INSTALL) @list='$(module_DATA)'; test -n "$(moduledir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(moduledir)'"; \ $(MKDIR_P) "$(DESTDIR)$(moduledir)" || 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)$(moduledir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(moduledir)" || exit $$?; \ done uninstall-moduleDATA: @$(NORMAL_UNINSTALL) @list='$(module_DATA)'; test -n "$(moduledir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(moduledir)'; $(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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(DATA) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-modulePROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-moduleDATA install-modulePROGRAMS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-moduleDATA uninstall-modulePROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \ clean-generic clean-libtool clean-modulePROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-moduleDATA \ install-modulePROGRAMS 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 \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-moduleDATA uninstall-modulePROGRAMS .geomview-clipboard: Makefile echo '(emodule-define "Clipboard" "clipboard")' > .geomview-clipboard all-local: $(top_builddir)/modules/.geomview-clipboard $(top_builddir)/modules/.geomview-clipboard: Makefile $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Clipboard" "$(subdir)/clipboard")' > $@ # 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: geomview-1.9.5/src/bin/clipboard/Makefile.am0000644000175000017500000000132112310110176015610 00000000000000INCLUDES = $(default_includes) $(MOTIFINCLUDE) LDADD = $(OOGLLIB) $(MOTIFUILIB) $(MOTIFLIBS) $(XMULIBS) $(XLIBS) man_MANS = module_PROGRAMS = clipboard clipboard_SOURCES = clipboard.c clipboard.mib clipx.c clip.h clipboard_DEPENDENCIES = $(OOGLLIB) #clipboard_LDFLAGS = -rpath $(libdir) module_DATA = .geomview-clipboard .geomview-clipboard: Makefile echo '(emodule-define "Clipboard" "clipboard")' > .geomview-clipboard all-local: $(top_builddir)/modules/.geomview-clipboard $(top_builddir)/modules/.geomview-clipboard: Makefile $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Clipboard" "$(subdir)/clipboard")' > $@ CLEANFILES = $(top_builddir)/modules/.geomview-clipboard $(module_DATA) geomview-1.9.5/src/bin/clipboard/clipboard.c0000644000175000017500000001567712310110176015702 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Geometry Technologies, Inc. * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Geometry Technologies, Inc."; #endif #include #include #include "geom.h" #include "mibload.h" #include "clipboard.mib" #include "clip.h" #include "mg.h" #include "mgx11.h" void cut_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); void copy_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); void paste_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); void delete_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); char obj_name[1000]; Geom *theObject; int clipfull; /* The selected visual */ Visual *visual; Colormap colormap; int bitdepth; void find_visual(Display *dpy) { int result; #if !MGX11 visual = DefaultVisual(dpy, DefaultScreen(dpy)); colormap = DefaultColormap(dpy, DefaultScreen(dpy)); bitdepth = DefaultDepth(dpy, DefaultScreen(dpy)); #else result = mgx11_getvisual(dpy, &visual, &colormap, &bitdepth); if (result == MG_X11VISFAIL) { fprintf(stderr, "X11 MG driver currently supports only 24, 16, 8, and 1 bit\n" "\tdeep displays. No supported display depth was found.\n" "\tPlease mail the output of \"xdpyinfo\" to\n" "\tsoftware@geomview.org\n"); exit(1); } else if (result == MG_X11VISPRIVATE) { fprintf(stderr, "Not enough colors available. Using private colormap.\n"); } else return; #endif } int main(int argc, char **argv) { XtAppContext App; Widget TopLevel, MainWindow, CutButton, CopyButton, PasteButton, DeleteButton; int no_mi; Arg args[20]; int n = 0; mib_Widget *MainForm; static String fallbacks[] = { "myprog*Foreground: gray20", /*15*/ "myprog*Background: gray70", /*80*/ "myprog*XmTextField.background: DeepSkyBlue", "myprog*fontList:\ -adobe-helvetica-medium-r-normal--14-100-100-100-p-76-iso8859-1", NULL}; no_mi = 0; /* no motif interface if no_mi = 1 */ clipfull = 0; obj_name[0] = '\0'; /* initialize application top level widget */ TopLevel = XtVaAppInitialize(&App, "myprog", NULL, 0, &argc, argv, fallbacks, NULL); find_visual(XtDisplay(TopLevel)); /* configure resize policy of window */ XtVaSetValues(TopLevel, XmNminWidth, 272, XmNminHeight, 172, NULL); if (bitdepth != 24) { XtSetArg(args[n], XmNvisual, visual); n++; XtSetArg(args[n], XmNdepth, bitdepth); n++; XtSetArg(args[n], XmNcolormap, colormap); n++; } /* create the application main window widget */ MainWindow = XtCreateManagedWidget("MainWindow", xmMainWindowWidgetClass, TopLevel, args, n); /* load the interface via the mib library */ MainForm = mib_load_interface(MainWindow, Root, MI_FROMSTRING); /* MainForm = mib_load_interface(MainWindow, "mib/clipboard.mib", MI_FROMFILE); */ if (MainForm == NULL) exit(0); /* Set widget pointers to null before trying to find their instances */ CutButton = NULL; CopyButton = NULL; PasteButton = NULL; DeleteButton = NULL; /* Do similarly when trying to find a widget named "CutButton" */ if (!(CutButton = XtNameToWidget(MainForm->me, "CutButton"))) no_mi = 1; if (!(CopyButton = XtNameToWidget(MainForm->me, "CopyButton"))) no_mi = 1; if (!(PasteButton = XtNameToWidget(MainForm->me, "PasteButton"))) no_mi = 1; if (!(DeleteButton = XtNameToWidget(MainForm->me, "DeleteButton"))) no_mi = 1; if (!XtNameToWidget(MainForm->me, "DrawingArea")) no_mi = 1; /* if we found both widgets then add a callback to the button. This is called whenever the user clicks the button. If there was no button and/or no text box then we avoid adding the callback. */ if (!no_mi) { XtAddCallback(CutButton, XmNactivateCallback, (XtCallbackProc)cut_callback, NULL); XtAddCallback(CopyButton, XmNactivateCallback, (XtCallbackProc)copy_callback, NULL); XtAddCallback(PasteButton, XmNactivateCallback, (XtCallbackProc)paste_callback, NULL); XtAddCallback(DeleteButton, XmNactivateCallback, (XtCallbackProc)delete_callback, NULL); } /* Bring the application window up on the screen. */ XtRealizeWidget(TopLevel); /* initialize visual clipboard - mg library stuff (gl or vanilla-x)*/ clipboard_init(MainForm->me); /* Begin main Intrinsics event loop */ XtAppMainLoop (App); return 0; } void cut_callback(Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { char tmp; int count; IOBFILE *infile; fprintf(stdout,"(echo (real-id target))\n"); fflush(stdout); tmp = '\0'; while (tmp != '\"') tmp = (char)fgetc(stdin); tmp = '\0'; count = 0; while (tmp != '\"') { tmp = (char)fgetc(stdin); obj_name[count] = tmp; count++; } obj_name[count-1] = '\0'; fprintf(stdout,"(write geometry - target)\n"); fflush(stdout); infile = iobfileopen(stdin); theObject = GeomFLoad(infile, obj_name); iobfileclose(infile); fprintf(stdout,"(delete target)\n"); fflush(stdout); clipfull = 1; redraw(w); } void copy_callback(Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { char tmp; int count; IOBFILE *infile; fprintf(stdout,"(echo (real-id target))\n"); fflush(stdout); tmp = '\0'; while (tmp != '\"') tmp = (char)fgetc(stdin); tmp = '\0'; count = 0; while (tmp != '\"') { tmp = (char)fgetc(stdin); obj_name[count] = tmp; count++; } obj_name[count-1] = '\0'; fprintf(stdout,"(write geometry - target)"); fflush(stdout); infile = iobfileopen(stdin); theObject = GeomFLoad(infile, obj_name); iobfileclose(infile); clipfull = 1; redraw(w); } void paste_callback(Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { if (clipfull == 0) return; fprintf(stdout,"(new-geometry %s {",obj_name); GeomFSave(theObject, stdout, obj_name); fprintf(stdout,"})"); fflush(stdout); } void delete_callback(Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { fprintf(stdout,"(delete target)\n"); fflush(stdout); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/clipboard/clipboard.mib0000644000175000017500000000611512310110176016212 00000000000000char Root[] = "\ TotalWidgets: 9\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 272\n\ Xmheight: 172\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"DrawingArea\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DrawingArea\"\n\ Xmwidth: 155\n\ Xmheight: 158\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 6\n\ XmbottomOffset: 8\n\ XmleftOffset: 110\n\ XmrightOffset: 7\n\ Private-\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DeleteButton\"\n\ Xmwidth: 90\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 130\n\ XmbottomOffset: 12\n\ XmleftOffset: 11\n\ XmrightOffset: 171\n\ Private-\n\ label: \"Delete\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"PasteButton\"\n\ Xmwidth: 90\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 99\n\ XmbottomOffset: 43\n\ XmleftOffset: 11\n\ XmrightOffset: 171\n\ Private-\n\ label: \"Paste\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CopyButton\"\n\ Xmwidth: 90\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 68\n\ XmbottomOffset: 74\n\ XmleftOffset: 11\n\ XmrightOffset: 171\n\ Private-\n\ label: \"Copy\"\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CutButton\"\n\ Xmwidth: 90\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 37\n\ XmbottomOffset: 105\n\ XmleftOffset: 11\n\ XmrightOffset: 171\n\ Private-\n\ label: \"Cut\"\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"EtchedInFrame\"\n\ Xmwidth: 99\n\ Xmheight: 131\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 33\n\ XmbottomOffset: 8\n\ XmleftOffset: 7\n\ XmrightOffset: 166\n\ Private-\n\ shadowtype: 2\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Title\"\n\ Xmwidth: 60\n\ Xmheight: 24\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 5\n\ XmbottomOffset: 143\n\ XmleftOffset: 26\n\ XmrightOffset: 186\n\ Private-\n\ label: \"Clipboard\"\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 271\n\ Xmheight: 171\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 1\n\ XmleftOffset: 0\n\ XmrightOffset: 1\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.5/src/bin/clipboard/clipx.c0000644000175000017500000000702112310110176015042 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Geometry Technologies, Inc. * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Geometry Technologies, Inc."; #endif #include #include #include "mg.h" #include "geom.h" #include "mibload.h" #include "mgx11.h" #include "clip.h" void winexpose(Widget, XtPointer, XmDrawingAreaCallbackStruct *); extern Geom *theObject; extern Visual *visual; extern Colormap colormap; extern int bitdepth; ColorA white = {1.0, 1.0, 1.0, 1.0}; ColorA red = {1.0, 0, 0, 1.0}; ColorA cameragray = {1.0/3.0, 1.0/3.0, 1.0/3.0, 1.0}; ColorA darkgray = {0.2, 0.2, 0.2, 1.0}; ColorA darkblue = {0, 0, .2, 1.0}; Point lightpos1 = {1, .3, .7, 0.0}; Point lightpos2 = {-0.5, 1.0, 0.5, 0.0}; ColorA lightcol2 = {0.6, 0.6, 0.6, 1.0}; Point lightpos3 = {0.0, -2.0, 1.0, 0.0}; ColorA lightcol3 = {0.4, 0.4, 0.4, 1.0}; Camera *theCamera; Appearance *theAppearance; LmLighting *lightingModel; LtLight *theLight; mgcontext *mgctx; void clipboard_init(Widget parent) { Widget MG_DrawArea; MG_DrawArea = XtNameToWidget(parent, "DrawingArea"); mgdevice_X11(); theObject = NULL; theCamera = CamCreate( CAM_FOV, 40.0, CAM_END ); lightingModel = LmCreate( LM_AMBIENT, &darkgray, LM_REPLACELIGHTS, 1, LM_END); theLight = LtCreate( LT_COLOR, &white, LT_POSITION, &lightpos1, LT_INTENSITY, 1.0, LT_END); LmAddLight(lightingModel, theLight); theLight = LtCreate( LT_COLOR, &lightcol2, LT_POSITION, &lightpos2, LT_INTENSITY, 1.0, LT_END); LmAddLight(lightingModel, theLight); theLight = LtCreate( LT_COLOR, &lightcol3, LT_INTENSITY, 1.0, LT_END); LmAddLight(lightingModel, theLight); theAppearance = ApCreate( AP_DO, APF_FACEDRAW | APF_SHADING | APF_EDGEDRAW | APF_VECTDRAW, AP_MtSet, MT_Kd, 1.0, MT_DIFFUSE, &white, MT_END, AP_LGT, lightingModel, AP_SHADING, APF_FLAT, AP_END); mgctx = mgctxcreate(MG_X11DISPLAY, XtDisplay(MG_DrawArea), MG_X11COLORMAP, colormap, MG_BITDEPTH, bitdepth, MG_X11VISUAL, visual, MG_X11WINID, XtWindow(MG_DrawArea), MG_CAMERA, theCamera, MG_BACKGROUND, &cameragray /*&darkblue */, MG_APPEAR, theAppearance, MG_END); XtAddCallback(MG_DrawArea, XmNexposeCallback, (XtCallbackProc)winexpose, 0); XtVaSetValues(MG_DrawArea, XmNbackground, BlackPixel(XtDisplay(MG_DrawArea), DefaultScreen(XtDisplay(MG_DrawArea))), NULL); } void redraw(Widget w) { mgreshapeviewport(); mgworldbegin(); GeomDraw(theObject); mgworldend(); } void winexpose(Widget w, XtPointer stuff, XmDrawingAreaCallbackStruct *data) { mgreshapeviewport(); mgworldbegin(); GeomDraw(theObject); mgworldend(); } geomview-1.9.5/src/bin/clipboard/clip.h0000644000175000017500000000165312310110176014664 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Geometry Technologies, Inc. * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ void clipboard_init(Widget); void redraw(Widget); geomview-1.9.5/src/bin/gvclock/0000755000175000017500000000000012310165604013336 500000000000000geomview-1.9.5/src/bin/gvclock/Makefile.in0000644000175000017500000004404412310165552015333 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/gvclock DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(srcdir)/gvclock.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = gvclock CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(moduledir)" SCRIPTS = $(module_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(module_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ module_SCRIPTS = gvclock module_DATA = .geomview-gvclock CLEANFILES = \ $(top_builddir)/modules/.geomview-gvclock \ $(module_DATA) \ $(module_SCRIPTS) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/gvclock/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/gvclock/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): gvclock: $(top_builddir)/config.status $(srcdir)/gvclock.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(moduledir)'"; \ $(MKDIR_P) "$(DESTDIR)$(moduledir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | 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; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$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_SCRIPT) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; test -n "$(moduledir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(moduledir)'; $(am__uninstall_files_from_dir) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-moduleDATA: $(module_DATA) @$(NORMAL_INSTALL) @list='$(module_DATA)'; test -n "$(moduledir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(moduledir)'"; \ $(MKDIR_P) "$(DESTDIR)$(moduledir)" || 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)$(moduledir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(moduledir)" || exit $$?; \ done uninstall-moduleDATA: @$(NORMAL_UNINSTALL) @list='$(module_DATA)'; test -n "$(moduledir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(moduledir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) $(DATA) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-moduleDATA install-moduleSCRIPTS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-moduleDATA uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool cscopelist-am ctags-am distclean \ distclean-generic distclean-libtool distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-moduleDATA \ install-moduleSCRIPTS install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am uninstall-moduleDATA \ uninstall-moduleSCRIPTS .geomview-gvclock: echo '(emodule-define "Clock" "gvclock")' > $@ # handled by configure #gvclock: gvclock.in Makefile # sed -e 's,[@]AWK[@],$(AWK),g' < $< > $@ # chmod +x gvclock all-local: $(top_builddir)/modules/.geomview-gvclock $(top_builddir)/modules/.geomview-gvclock: Makefile gvclock $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Clock" "$(subdir)/gvclock")' > $@ chmod +x gvclock # 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: geomview-1.9.5/src/bin/gvclock/Makefile.am0000644000175000017500000000107612310110177015311 00000000000000module_SCRIPTS = gvclock module_DATA = .geomview-gvclock .geomview-gvclock: echo '(emodule-define "Clock" "gvclock")' > $@ # handled by configure #gvclock: gvclock.in Makefile # sed -e 's,[@]AWK[@],$(AWK),g' < $< > $@ # chmod +x gvclock all-local: $(top_builddir)/modules/.geomview-gvclock $(top_builddir)/modules/.geomview-gvclock: Makefile gvclock $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Clock" "$(subdir)/gvclock")' > $@ chmod +x gvclock CLEANFILES = \ $(top_builddir)/modules/.geomview-gvclock \ $(module_DATA) \ $(module_SCRIPTS) geomview-1.9.5/src/bin/gvclock/gvclock.in0000755000175000017500000001121712310110177015236 00000000000000#! /bin/sh export LC_ALL="C" exec date | \ @AWK@ ' { unitcube = \ "OFF\n" \ "8 6 0\n" \ "-1 -1 -1\n" \ "1 -1 -1\n" \ "1 1 -1\n" \ "-1 1 -1\n" \ "-1 -1 1\n" \ "1 -1 1\n" \ "1 1 1\n" \ "-1 1 1\n" \ "4 0 1 2 3\n" \ "4 4 5 6 7\n" \ "4 0 4 7 3\n" \ "4 0 1 5 4\n" \ "4 1 5 6 2\n" \ "4 2 6 7 3\n"; printf("(progn ") # Print out the clock face printf("(geometry face { LIST "); printf("{ INST unit { OFF 8 6 0 \n") printf("-.05 .9 -.3\n") printf(".05 .9 -.3\n") printf(".05 1.1 -.3\n") printf("-.05 1.1 -.3\n") printf("-.05 .9 -.1\n") printf(".05 .9 -.1\n") printf(".05 1.1 -.1\n") printf("-.05 1.1 -.1\n") printf("4 0 1 2 3\n") printf("4 4 5 6 7\n") printf("4 0 4 7 3\n") printf("4 0 1 5 4\n") printf("4 1 5 6 2\n") printf("4 2 6 7 3\n") printf("}\ntlist\n") # Not all versions of awk have sin/cos functions, so... split("0 .5 .866 1 .866 .5", table); for(i = 0; i < 6; i++) { sn[i] = table[i+1]; sn[i+6] = -sn[i]; } for(i = 0; i < 12; i++) cs[i] = sn[(i+3) % 12]; for (i = 1; i < 12; ++i) { # ang = i * 3.14159 / 6.0; printf("%g %g 0 0\n", cs[i], -sn[i]); printf("%g %g 0 0\n", sn[i], cs[i]); printf("0 0 1 0\n"); printf("0 0 0 1\n\n"); } printf("}\n"); printf("{appearance {material {diffuse 0 .75 .75}}"); printf("INST\n"); printf("unit OFF\n"); printf("20 12 30\n"); printf(" 1.214124 0.000000 1.589309\n"); printf(" 0.375185 1.154701 1.589309\n"); printf(" -0.982247 0.713644 1.589309\n"); printf(" -0.982247 -0.713644 1.589309\n"); printf(" 0.375185 -1.154701 1.589309\n"); printf(" 1.964494 0.000000 0.375185\n"); printf(" 0.607062 1.868345 0.375185\n"); printf(" -1.589309 1.154701 0.375185\n"); printf(" -1.589309 -1.154701 0.375185\n"); printf(" 0.607062 -1.868345 0.375185\n"); printf(" 1.589309 1.154701 -0.375185\n"); printf(" -0.607062 1.868345 -0.375185\n"); printf(" -1.964494 0.000000 -0.375185\n"); printf(" -0.607062 -1.868345 -0.375185\n"); printf(" 1.589309 -1.154701 -0.375185\n"); printf(" 0.982247 0.713644 -1.589309\n"); printf(" -0.375185 1.154701 -1.589309\n"); printf(" -1.214124 0.000000 -1.589309\n"); printf(" -0.375185 -1.154701 -1.589309\n"); printf(" 0.982247 -0.713644 -1.589309\n"); printf(" 5 0 1 2 3 4\n"); printf(" 5 0 5 10 6 1\n"); printf(" 5 1 6 11 7 2\n"); printf(" 5 2 7 12 8 3\n"); printf(" 5 3 8 13 9 4\n"); printf(" 5 4 9 14 5 0\n"); printf(" 5 15 10 5 14 19\n"); printf(" 5 16 11 6 10 15\n"); printf(" 5 17 12 7 11 16\n"); printf(" 5 18 13 8 12 17\n"); printf(" 5 19 14 9 13 18\n"); printf(" 5 19 18 17 16 15\n"); printf("transform\n"); printf("0.07 0 0 0\n"); printf("0 0.07 0 0\n"); printf("0 0 0.07 0\n"); printf("0 1 -.2 1\n"); printf("}\n"); printf(" })\n"); # Hour hand printf("(geometry hour { INST unit {") print unitcube; printf("}\n") printf("tlist\n") printf(".12 0 0 0\n") printf("0 .28 0 0\n") printf("0 0 .05 0\n") printf("0 .22 0 1\n"); printf("})") # Minute hand printf("(geometry minute { INST unit {") print unitcube; printf("}\n") printf("tlist\n") printf(".07 0 0 0\n") printf("0 .55 0 0\n") printf("0 0 .05 0\n") printf("0 .45 .1 1\n") printf("})\n"); # Second hand printf("(geometry second { INST unit {") print unitcube; printf("}\n") printf("tlist\n") printf(".02 0 0 0\n") printf("0 .6 0 0\n") printf("0 0 .05 0\n") printf("0 .45 .2 1\n") printf("})\n"); printf("(normalization face none)") printf("(normalization hour none)") printf("(normalization minute none)") printf("(normalization second none)") printf("(bbox-draw face no)") printf("(bbox-draw hour no)") printf("(bbox-draw minute no)") printf("(bbox-draw second no)") printf("(merge-ap face {appearance +edge material { diffuse 0 0 .7}})") printf("(merge-ap hour {appearance +edge material { diffuse .54 .15 1}})") printf("(merge-ap minute {appearance +edge material { diffuse .13 .82 .51}})") printf("(merge-ap second {appearance +edge material { diffuse .82 0 0 }})") time = substr($4, 7, 2) + 0.0; printf("(transform-set second world world rotate 0 0 %g)", \ -(time / 60.0) * 3.14159 * 2.0); time = time + (substr($4, 4, 2) + 0.0)*60.0; printf("(transform-set minute world world rotate 0 0 %g)", \ -(time / 3600.0) * 3.14159 * 2.0); time += (substr($4, 1, 2)%12) * 3600.0; printf("(transform-set hour world world rotate 0 0 %g)", \ -(time / 43200.0) * 3.14159 * 2.0); printf("(transform-incr hour world world rotate 0 0 -3.14159 21600)") printf("(transform-incr minute world world rotate 0 0 -3.14159 1800)") printf("(transform-incr second world world rotate 0 0 -3.14159 30)") printf(")") } ' geomview-1.9.5/src/bin/nose/0000755000175000017500000000000012310165604012652 500000000000000geomview-1.9.5/src/bin/nose/Makefile.in0000644000175000017500000006211012310165552014641 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ module_PROGRAMS = nose$(EXEEXT) subdir = src/bin/nose DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(moduledir)" PROGRAMS = $(module_PROGRAMS) am_nose_OBJECTS = nose.$(OBJEXT) nose_OBJECTS = $(am_nose_OBJECTS) nose_LDADD = $(LDADD) am__DEPENDENCIES_1 = 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 = 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@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(nose_SOURCES) DIST_SOURCES = $(nose_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) DATA = $(module_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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) LDADD = $(OOGLLIB) man_MANS = nose.1gv EXTRA_DIST = $(man_MANS) nose_SOURCES = nose.c nose_DEPENDENCIES = $(OOGLLIB) module_DATA = .geomview-nose CLEANFILES = $(top_builddir)/modules/.geomview-nose $(module_DATA) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/nose/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/nose/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-modulePROGRAMS: $(module_PROGRAMS) @$(NORMAL_INSTALL) @list='$(module_PROGRAMS)'; test -n "$(moduledir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(moduledir)'"; \ $(MKDIR_P) "$(DESTDIR)$(moduledir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(moduledir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(moduledir)$$dir" || exit $$?; \ } \ ; done uninstall-modulePROGRAMS: @$(NORMAL_UNINSTALL) @list='$(module_PROGRAMS)'; test -n "$(moduledir)" || 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)$(moduledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(moduledir)" && rm -f $$files clean-modulePROGRAMS: @list='$(module_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list nose$(EXEEXT): $(nose_OBJECTS) $(nose_DEPENDENCIES) $(EXTRA_nose_DEPENDENCIES) @rm -f nose$(EXEEXT) $(AM_V_CCLD)$(LINK) $(nose_OBJECTS) $(nose_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nose.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-moduleDATA: $(module_DATA) @$(NORMAL_INSTALL) @list='$(module_DATA)'; test -n "$(moduledir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(moduledir)'"; \ $(MKDIR_P) "$(DESTDIR)$(moduledir)" || 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)$(moduledir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(moduledir)" || exit $$?; \ done uninstall-moduleDATA: @$(NORMAL_UNINSTALL) @list='$(module_DATA)'; test -n "$(moduledir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(moduledir)'; $(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" 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-modulePROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -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-man install-moduleDATA install-modulePROGRAMS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-moduleDATA \ uninstall-modulePROGRAMS uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \ clean-generic clean-libtool clean-modulePROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man1 install-moduleDATA \ install-modulePROGRAMS 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 \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-man uninstall-man1 uninstall-moduleDATA \ uninstall-modulePROGRAMS .geomview-nose: Makefile echo '(emodule-define "Nose" "nose")' > .geomview-nose all-local: $(top_builddir)/modules/.geomview-nose $(top_builddir)/modules/.geomview-nose: Makefile $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Nose" "$(subdir)/nose")' > $@ # 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: geomview-1.9.5/src/bin/nose/Makefile.am0000644000175000017500000000105412310110177014621 00000000000000INCLUDES = $(default_includes) LDADD = $(OOGLLIB) man_MANS = nose.1gv EXTRA_DIST = $(man_MANS) module_PROGRAMS = nose nose_SOURCES = nose.c nose_DEPENDENCIES = $(OOGLLIB) module_DATA = .geomview-nose .geomview-nose: Makefile echo '(emodule-define "Nose" "nose")' > .geomview-nose all-local: $(top_builddir)/modules/.geomview-nose $(top_builddir)/modules/.geomview-nose: Makefile $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Nose" "$(subdir)/nose")' > $@ CLEANFILES = $(top_builddir)/modules/.geomview-nose $(module_DATA) geomview-1.9.5/src/bin/nose/nose.c0000644000175000017500000001525112310110177013701 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Geometry Technologies, Inc. * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute 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. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Geomview; see the file COPYING. If not, write to the * Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA, * or visit http://www.gnu.org. */ /* (picked "name" (gx gy gz) (vx vy vz) (x1 y1 z1 x2 y2 z2)) */ #include #include #include "lisp.h" #include "pickfunc.h" #include "3d.h" #include "handleP.h" #include "ooglutil.h" void deflittlebox(FILE *fp, float size); void norm(FILE *fp); int verbose = 0; void handle_pick(FILE *fp, int picked, HPoint3 *gotten, bool vert, HPoint3 *v, bool edge, HPoint3 e[]) { static bool first = true; HPoint3 got; HPt3Dehomogenize(gotten, &got); fprintf(fp, "(progn\n"); if (!picked) { fprintf(fp,"(geometry \"pick\" { LIST } )\n"); } else { fprintf(fp,"(xform-set pick { 1 0 0 0 0 1 0 0 0 0 1 0 %g %g %g 1 })\n", got.x, got.y, got.z); fprintf(fp,"(geometry \"pick\"\n"); if (vert) fprintf(fp, "{ appearance { material { diffuse 1 0 1 } }\n"); else fprintf(fp, "{ appearance { material { diffuse 1 1 0 } }\n"); fprintf(fp, " { LIST { :littlebox }\n"); if (edge && !vert) { HPoint3 e0, e1; HPt3Dehomogenize(&e[0], &e0); HPt3Dehomogenize(&e[1], &e1); e0.x -= got.x; e0.y -= got.y; e0.z -= got.z; e1.x -= got.x; e1.y -= got.y; e1.z -= got.z; fprintf(fp,"{ appearance { material { diffuse 0 1 1 } }\n\ LIST\n\ { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\ { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\ { VECT\n\ 1 2 1\n\ 2\n\ 1\n\ %f %f %f\n\ %f %f %f\n\ 1 1 0 1\n\ }\n\ }\n", e0.x, e0.y, e0.z, e1.x, e1.y, e1.z, e0.x, e0.y, e0.z, e1.x, e1.y, e1.z); } fprintf(fp," }\n }\n)\n"); } if (first) { fprintf(fp, "(pickable \"pick\" no)\n"); first = false; } fprintf(fp, ")\n"); fflush(fp); } void handle_ND_pick(FILE *fp, int picked, HPtNCoord *gotten, int dim, bool vert, HPtNCoord *v, bool edge, HPtNCoord *e) { static bool first = true; HPointN got, e0, e1; TransformN *trans; int i; got.flags = e0.flags = e1.flags = 0; got.dim = e0.dim = e1.dim = dim; got.v = gotten; e0.v = e; e1.v = e+dim; HPtNDehomogenize(&got, &got); fprintf(fp, "(progn\n"); if (!picked) { fprintf(fp,"(geometry \"pick\" { LIST } )\n"); } else { trans = TmNTranslateOrigin(NULL, &got); fprintf(fp,"(ND-xform-set pick "); TmNPrint(fp, trans); fprintf(fp, ")\n"); fprintf(fp,"(geometry \"pick\"\n"); if (vert) fprintf(fp, "{ appearance { material { diffuse 1 0 1 } }\n"); else fprintf(fp, "{ appearance { material { diffuse 1 1 0 } }\n"); fprintf(fp, " { LIST { :littlebox }\n"); if (edge && !vert) { HPtNDehomogenize(&e0, &e0); HPtNDehomogenize(&e1, &e1); HPtNComb(-1.0, &got, 1.0, &e0, &e0); HPtNComb(-1.0, &got, 1.0, &e1, &e1); fprintf(fp, "{\n" " appearance { material { diffuse 0 1 1 } }\n" " LIST {\n" " { INST\n"); trans = TmNTranslateOrigin(NULL, &e0); TmNPrint(fp, trans); fprintf(fp, " geom :littlebox\n" " }\n" " { INST\n"); trans = TmNTranslateOrigin(NULL, &e1); TmNPrint(fp, trans); fprintf(fp, " geom :littlebox\n" " }\n" " { nSKEL %d\n" " 2 1\n", dim-1); fprintf(fp, " "); for (i = 1; i < dim; i++) { fprintf(fp, " %10.7f", e0.v[i]); } fprintf(fp, "\n "); for (i = 1; i < dim; i++) { fprintf(fp, " %10.7f", e1.v[i]); } fprintf(fp, "\n 2 0 1 1 1 0 1\n" " }\n" " }\n" "}\n"); } fprintf(fp, "}})\n"); } if (first) { fprintf(fp, "(pickable \"pick\" no)\n"); first = 0; } fprintf(fp, ")\n"); fflush(fp); } DEFPICKFUNC("(pick COORDSYS GEOMID G V E F P VI EI FI)", coordsys, id, point, pn, vertex, vn, edge, en, face, fn, ppath, ppn, vi, ei, ein, fi, { int picked = pn > 0; handle_pick(stdout, picked, &point, vn>0, &vertex, en>0, edge); if (verbose) handle_pick(stderr, picked, &point, vn>0, &vertex, en>0, edge); return Lt; }, { int picked = pn > 0; handle_ND_pick(stdout, picked, point, pn, vn>0, vertex, en>0, edge); if (verbose) handle_ND_pick(stderr, picked, point, pn, vn>0, vertex, en>0, edge); return Lt; }) void init(void) { LInit(); LDefun("pick", Lpick, Hpick); } void pickability(FILE *fp) { fprintf(fp, "(interest (pick world * * * * nil nil nil nil nil))\n"); fflush(fp); } int main(int argc, char *argv[]) { Lake *lake; LObject *lit, *val; IOBFILE *fromgv; verbose = (getenv("VERBOSE_NOSE") != NULL); fprintf(stdout, "(progn\n"); init(); deflittlebox(stdout, 0.04); if (verbose) deflittlebox(stderr, 0.04); pickability(stdout); if (verbose) pickability(stderr); norm(stdout); if (verbose) norm(stderr); fprintf(stdout, ")\n"); fflush(stdout); lake = LakeDefine(fromgv = iobfileopen(stdin), stdout, NULL); while (!iobfeof(fromgv)) { lit = LSexpr(lake); val = LEval(lit); LFree(lit); LFree(val); } return 0; } void norm(FILE *fp) { fprintf(fp, "(geometry \"pick\" { LIST } )\n"); fprintf(fp, "(normalization \"pick\" none)\n"); fprintf(fp, "(bbox-draw \"pick\" off)\n"); fflush(fp); } void deflittlebox(FILE *fp, float size) { fprintf(fp,"\ (read geometry { define littlebox {\n\ INST\n\ transform %f 0 0 0\n\ 0 %f 0 0\n\ 0 0 %f 0\n\ 0 0 0 1\n\ geom\n\ OFF\n\ 8 6 12\n\ \n\ -.5 -.5 -.5 # 0 \n\ .5 -.5 -.5 # 1 \n\ .5 .5 -.5 # 2 \n\ -.5 .5 -.5 # 3 \n\ -.5 -.5 .5 # 4 \n\ .5 -.5 .5 # 5 \n\ .5 .5 .5 # 6 \n\ -.5 .5 .5 # 7 \n\ \n\ 4 0 1 2 3\n\ 4 4 5 6 7\n\ 4 2 3 7 6\n\ 4 0 1 5 4\n\ 4 0 4 7 3\n\ 4 1 2 6 5\n\ }})\n", size, size, size); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/src/bin/nose/nose.1gv0000644000175000017500000000163112310110177014151 00000000000000.TH nose 1gv "September 1 1992" "Geometry Center" .SH NAME nose - test geomview's picking facility .SH DESCRIPTION Nose is a geomview module which tests the geomview picking facility. Nose has no panel of its own. You invoke it by selecting the "Nose" line in the APPLICATIONS browser. Once invoked, nose waits for you to click the right mouse button with the cursor over some object in a geomview camera window. It then draws a little box on the spot where you clicked. If the picked spot is along an edge, it also draws a pair of boxes at the endpoints of the edge, and a line segment along the edge. If the picked spot is on a vertex, the box is a different color. Nose is not necessarily intended to be a useful program. It is just a simple example of how an external program can find out about and make use of geomview pick events. .SH SEE ALSO geomview(1) .SH AUTHOR .nf Mark Phillips Geometry Center .fi geomview-1.9.5/data/0000755000175000017500000000000012310165605011261 500000000000000geomview-1.9.5/data/gcl/0000755000175000017500000000000012310165605012026 500000000000000geomview-1.9.5/data/gcl/arithmetic.gcl0000644000175000017500000000453012310110172014555 00000000000000# This file demonstrates how to implement multi-argument +, -, *, /, # >, <, =, <=, >= in GCL (Geomview Command Language). This example # implementation uses recursive defuns. OF COURSE, it is also possible # (and slightly more efficient) to use non-recursive constructs, # utilizing the (while TEST BODY) construct. # # + and * # (defun + (&rest args) "Adds all arguments and returns the result." (if (car args) (-builtin-+- (car args) (eval (cons + (cdr args)))) 0)) (defun * (&rest args) "Multiplies all arguments and returns the result." (if (car args) (-builtin-*- (car args) (eval (cons * (cdr args)))) 1)) # # '-' and '/' # (defun - (arg &rest args) "Substracts from the first argument all following ones, with only one argument return its negative." (if args (-builtin--- arg (eval (cons + args))) (-builtin--- 0 arg))) (defun / (arg &rest args) "Divides the first argument by all following ones, with only one argument return its inverse." (if args (-builtin-/- arg (eval (cons * args))) (-builtin-/- 1 arg))) # # >, <, =, >=, <=, for monotone sequences # (defun > (&rest args) "Returns t if ARGS is a strictly decreasing sequence, otherwise nil." (let ((tmp (cdr args))) (if tmp (and (-builtin->- (car args) (car tmp)) (eval (cons > tmp))) t))) (defun < (&rest args) "Returns t if ARGS is a strictly increasing sequence, otherwise nil." (let ((tmp (cdr args))) (if tmp (and (-builtin-<- (car args) (car tmp)) (eval (cons < tmp))) t))) (defun = (&rest args) "Returns t if ARGS is a sequence of equal elements, otherwise nil." (let ((tmp (cdr args))) (if tmp (and (-builtin-=- (car args) (car tmp)) (eval (cons = tmp))) t))) (defun geq (arg1 arg2) "return t if ARG1 >= ARG2, otherwise nil" (or (-builtin->- arg1 arg2) (-builtin-=- arg1 arg2))) (defun >= (&rest args) "Returns t if ARGS is a non-increasing sequence" (let ((tmp (cdr args))) (if tmp (and (geq (car args) (car tmp)) (eval (cons >= tmp))) t))) (defun leq (arg1 arg2) "return t if ARG1 <= ARG2, otherwise nil" (or (-builtin-<- arg1 arg2) (-builtin-=- arg1 arg2))) (defun <= (&rest args) "Returns t if ARGS is a non-increasing sequence" (let ((tmp (cdr args))) (if tmp (and (geq (car args) (car tmp)) (eval (cons <= tmp))) t))) geomview-1.9.5/data/gcl/events.gcl0000644000175000017500000000177612310110172013741 00000000000000# # This file demonstrates how to create a simple geometric object -- a # sphere -- manipulate its position, draw it and then temporarily give # the control back to the main event loop, allowing for user # interaction etc. # # NOTES: # # (sleep-for 1e-1), followed by (process-events) will post-pone the # execution of this loop for at least a tenth of a second, possibly # more. (sleep-for ...) without (process-events) will NOT pass the # control back to the main event-loop. # # (echo .) is just for animation, it prints a "." to the console on # every iteration of the loop. # # (transform ...) just changes the position of the sphere a little # bit. # # (redraw focus) forces a redraw when (process-events) is entered, # otherwise the change in the position of the sphere would not be # reflected immediately on the screen. # (geometry sphere { SPHERE 1 0 0 0 }) (while t (progn (sleep-for 1e-1) (echo .) (transform sphere sphere focus rotate 0 1e-3 0) (redraw focus) (process-events))) (quit) geomview-1.9.5/data/geom/0000755000175000017500000000000012310165605012210 500000000000000geomview-1.9.5/data/geom/pieces/0000755000175000017500000000000012310165604013457 500000000000000geomview-1.9.5/data/geom/pieces/cube1.off0000644000175000017500000000052412310110172015061 00000000000000# off file with one integer of color info (used as lookup in cmap) 8 6 12 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 -1.0 -1.0 -1.0 1.0 1.0 -1.0 1.0 -1.0 -1.0 -1.0 1.0 -1.0 -1.0 -1.0 4 0 2 3 1 6 4 4 5 7 6 7 4 0 4 6 2 8 4 1 3 7 5 9 4 0 1 5 4 11 4 2 6 7 3 10 geomview-1.9.5/data/geom/pieces/linkA.bez0000644000175000017500000000051512310110172015126 00000000000000BBP # Half torus with R=2, r=1 0.00 1.00 0.00 0.00 1.00 1.32 0.00 3.00 1.32 0.00 3.00 0.00 1.32 1.00 0.00 1.32 1.00 1.32 3.95 3.00 1.32 3.95 3.00 0.00 1.32 -1.00 0.00 1.32 -1.00 1.32 3.95 -3.00 1.32 3.95 -3.00 0.00 0.00 -1.00 0.00 0.00 -1.00 1.32 0.00 -3.00 1.32 0.00 -3.00 0.00 geomview-1.9.5/data/geom/pieces/linkB.bez0000644000175000017500000000120512310110172015124 00000000000000BBP # Building block for N-hole torus lying in XY plane # Major radius 2, minor radius 1 0.00 1.00 0.00 0.00 1.00 1.33 0.00 3.00 1.42 0.00 3.00 0.00 0.56 1.00 0.00 0.56 1.00 1.32 0.50 3.00 1.32 0.50 3.00 0.00 1.00 0.56 0.00 0.60 0.70 1.32 0.80 2.75 1.32 0.80 2.75 0.00 1.00 0.00 0.00 1.00 0.00 1.32 1.00 2.60 1.32 1.00 2.60 0.00 1.00 0.00 0.00 1.00 0.00 1.32 1.00 2.60 1.32 1.00 2.60 0.00 1.00 0.00 1.00 1.10 0.30 1.32 1.40 2.30 1.00 1.40 2.30 0.00 1.00 0.00 1.00 1.44 1.00 1.00 1.44 2.00 0.66 1.44 2.00 0.00 2.00 0.00 1.00 2.00 0.56 1.00 2.00 2.00 0.66 2.00 2.00 0.00 geomview-1.9.5/data/geom/polyhedra/0000755000175000017500000000000012310165604014176 500000000000000geomview-1.9.5/data/geom/polyhedra/cube0000644000175000017500000000047212310110172014750 00000000000000OFF 8 6 12 1.632993 0.000000 1.154701 0.000000 1.632993 1.154701 -1.632993 0.000000 1.154701 -0.000000 -1.632993 1.154701 1.632993 -0.000000 -1.154701 0.000000 1.632993 -1.154701 -1.632993 0.000000 -1.154701 -0.000000 -1.632993 -1.154701 4 0 1 2 3 4 7 4 0 3 4 4 5 1 0 4 5 6 2 1 4 3 2 6 7 4 6 5 4 7 geomview-1.9.5/data/geom/polyhedra/cuboctahedron0000644000175000017500000000105312310110172016646 00000000000000OFF 13 14 26 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 0.000000 -1.000000 1.000000 1.000000 1.000000 0.000000 -1.000000 1.000000 0.000000 0.000000 -1.000000 -1.000000 -1.000000 -0.500000 -0.500000 -1.000000 0.000000 -1.000000 -1.000000 -1.000000 0.000000 1.000000 0.000000 -1.000000 -1.000000 0.000000 1.000000 1.000000 -1.000000 0.000000 0.000000 1.000000 -1.000000 3 1 3 0 4 0 10 2 1 3 10 0 4 5 4 7 6 8 10 3 4 12 7 4 3 12 4 0 3 10 8 2 3 7 5 8 4 9 3 1 11 3 9 12 3 3 11 1 2 4 5 11 2 8 4 12 9 5 7 3 9 11 5 geomview-1.9.5/data/geom/polyhedra/dodecahedron0000644000175000017500000000142312310110172016446 00000000000000OFF 20 12 30 1.214124 0.000000 1.589309 0.375185 1.154701 1.589309 -0.982247 0.713644 1.589309 -0.982247 -0.713644 1.589309 0.375185 -1.154701 1.589309 1.964494 0.000000 0.375185 0.607062 1.868345 0.375185 -1.589309 1.154701 0.375185 -1.589309 -1.154701 0.375185 0.607062 -1.868345 0.375185 1.589309 1.154701 -0.375185 -0.607062 1.868345 -0.375185 -1.964494 0.000000 -0.375185 -0.607062 -1.868345 -0.375185 1.589309 -1.154701 -0.375185 0.982247 0.713644 -1.589309 -0.375185 1.154701 -1.589309 -1.214124 0.000000 -1.589309 -0.375185 -1.154701 -1.589309 0.982247 -0.713644 -1.589309 5 0 1 2 3 4 5 0 5 10 6 1 5 1 6 11 7 2 5 2 7 12 8 3 5 3 8 13 9 4 5 4 9 14 5 0 5 15 10 5 14 19 5 16 11 6 10 15 5 17 12 7 11 16 5 18 13 8 12 17 5 19 14 9 13 18 5 19 18 17 16 15 geomview-1.9.5/data/geom/polyhedra/icosahedron0000644000175000017500000000102112310110172016317 00000000000000OFF 12 20 30 0.0 0.0 2.0 1.788854 0.000000 0.894427 0.552786 1.701302 0.894427 -1.447214 1.051462 0.894427 -1.447214 -1.051462 0.894427 0.552786 -1.701302 0.894427 1.447214 1.051462 -0.894427 -0.552786 1.701302 -0.894427 -1.788854 0.000000 -0.894427 -0.552786 -1.701302 -0.894427 1.447214 -1.051462 -0.894427 0.0 0.0 -2.0 3 2 0 1 3 3 0 2 3 4 0 3 3 5 0 4 3 1 0 5 3 2 1 6 3 7 2 6 3 3 2 7 3 8 3 7 3 4 3 8 3 9 4 8 3 5 4 9 3 10 5 9 3 6 1 10 3 1 5 10 3 6 11 7 3 7 11 8 3 8 11 9 3 9 11 10 3 10 11 6 geomview-1.9.5/data/geom/polyhedra/icosidodecahedron0000644000175000017500000000252512310110172017501 00000000000000OFF 31 32 62 -0.309017 -0.425325 0.850651 0.000000 0.525731 0.850651 0.500000 0.688191 0.525731 -0.500000 0.162460 0.850651 -0.500000 0.688191 0.525731 -1.000000 0.000000 0.000000 -0.809017 -0.262866 0.525731 0.309017 -0.425325 0.850651 0.559017 -0.344095 0.688191 0.000000 -0.850651 0.525731 0.809017 -0.262866 0.525731 0.500000 0.162460 0.850651 -0.500000 -0.162460 -0.850651 0.000000 -0.525731 -0.850651 -0.309017 -0.951057 0.000000 0.309017 -0.951057 0.000000 0.500000 -0.688191 -0.525731 0.500000 -0.162460 -0.850651 0.809017 -0.587785 0.000000 1.000000 0.000000 0.000000 0.809017 0.262866 -0.525731 0.809017 0.587785 0.000000 0.309017 0.951057 0.000000 0.000000 0.850651 -0.525731 0.309017 0.425325 -0.850651 -0.309017 0.425325 -0.850651 -0.309017 0.951057 0.000000 -0.809017 0.587785 0.000000 -0.809017 0.262866 -0.525731 -0.809017 -0.587785 0.000000 -0.500000 -0.688191 -0.525731 5 3 0 7 11 1 3 4 3 1 5 1 2 22 26 4 3 26 27 4 5 3 4 27 5 6 3 6 0 3 5 29 14 9 0 6 6 7 9 15 18 10 8 3 7 0 9 3 9 14 15 3 15 16 18 3 11 2 1 3 11 7 10 3 10 18 19 5 21 2 11 10 19 5 13 12 25 24 17 5 14 30 13 16 15 3 13 17 16 5 17 20 19 18 16 3 17 24 20 3 21 19 20 3 21 22 2 5 23 22 21 20 24 3 23 24 25 3 26 22 23 5 27 26 23 25 28 3 28 25 12 3 5 27 28 5 29 5 28 12 30 3 6 5 29 3 14 29 30 3 12 13 30 geomview-1.9.5/data/geom/polyhedra/octahedron0000644000175000017500000000034212310110172016154 00000000000000OFF 6 8 12 0.0 0.0 2.0 2.000000 0.000000 0.000000 0.000000 2.000000 0.000000 -2.000000 0.000000 0.000000 0.000000 -2.000000 0.000000 0.0 0.0 -2.0 3 1 0 4 3 4 0 3 3 3 0 2 3 2 0 1 3 1 5 2 3 2 5 3 3 3 5 4 3 4 5 1 geomview-1.9.5/data/geom/polyhedra/rhombicosidodecahedron0000644000175000017500000000532012310110172020525 00000000000000OFF 67 62 134 0.223919 0.308198 0.924594 -0.223919 0.308198 0.924594 -0.223919 0.689152 0.689152 0 -0.380954 0.924594 0.293114 0.0952384 0.924594 0.362309 -0.117721 0.924594 -0.362309 -0.117721 0.924594 0.223919 0.689152 0.689152 0.362309 0.879629 0.308198 0 0.99735 0.0727557 -0.362309 0.879629 0.308198 -0.724617 0 0.689152 -0.586228 0.425919 0.689152 -0.724617 0.616396 0.308198 -0.948536 0.308198 0.0727557 -0.948536 -0.0727557 0.308198 -0.111959 -0.535053 0.806873 -0.223919 -0.689152 0.689152 -0.586228 -0.425919 0.689152 -0.810147 -0.498675 0.308198 -0.586228 -0.806873 0.0727557 -0.223919 -0.924594 0.308198 -0.111959 -0.960972 0.117721 0.586228 -0.425919 0.689152 0.223919 -0.689152 0.689152 0.223919 -0.924594 0.308198 0.586228 -0.806873 0.0727557 0.810147 -0.498675 0.308198 0.586228 0.425919 0.689152 0.724617 0 0.689152 0.948536 -0.0727557 0.308198 0.948536 0.308198 0.0727557 0.724617 0.616396 0.308198 0 -0.308198 -0.924594 0.223919 -0.308198 -0.924594 0.362309 0.117721 -0.924594 0 0.380954 -0.924594 -0.362309 0.117721 -0.924594 -0.223919 -0.308198 -0.924594 -0.223919 -0.689152 -0.689152 -0.293114 -0.78439 -0.498675 -0.405073 -0.557535 -0.689152 -0.362309 -0.879629 -0.308198 0 -0.99735 -0.0727557 0.362309 -0.879629 -0.308198 0.223919 -0.689152 -0.689152 0.223919 -0.498675 -0.806873 0.586228 -0.425919 -0.689152 0.724617 -0.616396 -0.308198 0.948536 -0.308198 -0.0727557 0.948536 0.0727557 -0.308198 0.724617 0 -0.689152 0.586228 0.425919 -0.689152 0.810147 0.498675 -0.308198 0.586228 0.806873 -0.0727557 0.223919 0.924594 -0.308198 0.223919 0.689152 -0.689152 -0.223919 0.689152 -0.689152 -0.223919 0.924594 -0.308198 -0.586228 0.806873 -0.0727557 -0.810147 0.498675 -0.308198 -0.586228 0.425919 -0.689152 -0.724617 0 -0.689152 -0.948536 0.0727557 -0.308198 -0.948536 -0.308198 -0.0727557 -0.724617 -0.616396 -0.308198 -0.586228 -0.425919 -0.689152 6 1 6 3 5 4 0 4 29 28 0 5 4 3 24 23 5 4 1 12 11 6 4 2 1 0 7 5 9 10 2 7 8 3 18 6 11 5 13 14 15 11 12 3 1 2 12 4 12 2 10 13 3 60 63 14 4 19 18 11 15 4 17 3 6 18 4 19 64 65 20 5 17 18 19 20 21 4 22 43 25 21 4 20 42 43 21 4 3 16 17 24 5 26 27 23 24 25 4 24 17 21 25 4 25 43 44 26 3 7 0 28 3 5 23 29 3 27 49 30 4 29 23 27 30 5 32 28 29 30 31 4 8 7 28 32 3 54 8 32 4 51 47 34 35 4 56 52 35 36 4 61 57 36 37 6 37 36 35 34 33 38 4 34 45 39 38 4 41 66 38 39 3 20 65 42 6 44 43 42 40 39 45 4 45 46 34 47 4 44 45 47 48 3 26 44 48 4 49 27 26 48 5 48 47 51 50 49 4 31 30 49 50 4 52 53 50 51 3 51 35 52 3 31 50 53 4 54 32 31 53 5 53 52 56 55 54 4 9 8 54 55 3 56 36 57 4 55 56 57 58 3 9 55 58 4 59 10 9 58 3 13 10 59 4 60 14 13 59 4 62 63 60 61 5 60 59 58 57 61 4 37 38 66 62 3 61 37 62 4 64 15 14 63 3 19 15 64 4 39 42 65 66 5 65 64 63 62 66 geomview-1.9.5/data/geom/polyhedra/rhombicuboctahedron0000644000175000017500000000202712310110172020051 00000000000000OFF 25 26 50 0.357407 0.357407 0.862856 -0.357407 0.357407 0.862856 -0.357407 0.862856 0.357407 0.357407 -0.357407 0.862856 0.862856 0.357407 0.357407 0.357407 0.862856 0.357407 -0.357407 0.357407 -0.862856 -0.862856 0.357407 0.357407 -0.357407 0.862856 -0.357407 -0.357407 -0.357407 -0.862856 -0.862856 0.357407 -0.357407 0.357407 0.862856 -0.357407 -0.357407 -0.357407 0.862856 -0.862856 -0.357407 -0.357407 -0.357407 -0.862856 0.357407 0.862856 0.357407 -0.357407 0.862856 0 -0.357407 -0.862856 -0.357407 0.357407 0.357407 -0.862856 0.357407 0.357407 -0.357407 -0.862856 0.862856 -0.357407 0.357407 0.357407 -0.862856 -0.357407 0.357407 0.357407 -0.862856 0.862856 -0.357407 -0.357407 -0.357407 -0.862856 -0.357407 4 0 1 12 3 4 4 15 11 5 3 0 4 5 4 11 8 2 5 4 2 1 0 5 4 2 8 10 7 3 1 2 7 3 6 10 8 4 6 9 13 10 4 22 6 8 11 4 14 18 3 12 4 1 7 17 12 3 12 17 14 5 4 20 23 16 15 4 7 10 13 17 3 3 18 20 4 4 0 3 20 4 18 14 24 21 4 19 9 6 22 3 11 15 22 4 19 22 15 23 3 21 19 23 4 20 18 21 23 4 9 19 21 24 3 13 9 24 4 14 17 13 24 geomview-1.9.5/data/geom/polyhedra/rhombitruncated_cubeoctahedron0000644000175000017500000000372512310110172022275 00000000000000OFF 52 26 80 0.215739 0.520841 0.825943 0.215739 0.673392 0.673392 0.36829 0.36829 0.825943 0.520841 0.215739 0.825943 -0.520841 0.215739 0.825943 -0.215739 0.520841 0.825943 -0.36829 0.825943 0.36829 -0.215739 0.825943 0.520841 -0.520841 0.825943 0.215739 0.520841 -0.215739 0.825943 0.215739 -0.520841 0.825943 0.825943 0.215739 0.520841 0.825943 0.520841 0.215739 0.520841 0.825943 0.215739 0.215739 0.825943 0.520841 -0.215739 0.520841 -0.825943 -0.520841 0.215739 -0.825943 -0.825943 0.520841 0.215739 -0.825943 0.215739 0.520841 -0.520841 0.825943 -0.215739 -0.215739 0.825943 -0.520841 -0.520841 -0.215739 -0.825943 -0.215739 -0.520841 -0.825943 -0.825943 0.215739 -0.520841 -0.825943 0.520841 -0.215739 0.215739 0.825943 -0.520841 0.520841 0.825943 -0.215739 -0.215739 -0.520841 0.825943 -0.520841 -0.215739 0.825943 -0.825943 -0.520841 -0.215739 -0.825943 -0.215739 -0.520841 -0.520841 -0.825943 0.215739 -0.215739 -0.825943 0.520841 0.825943 0.520841 -0.215739 0.825943 0.215739 -0.520841 -0.825943 -0.215739 0.520841 -0.825943 -0.520841 0.215739 0.215739 -0.825943 0.520841 0.520841 -0.825943 0.215739 0.215739 -0.520841 -0.825943 0.520841 -0.215739 -0.825943 0.825943 -0.520841 0.215739 0.825943 -0.215739 0.520841 0.520841 -0.825943 -0.215739 0.215739 -0.825943 -0.520841 0.520841 0.215739 -0.825943 0.520841 0 -0.825943 0.215739 0.520841 -0.825943 0.825943 -0.215739 -0.520841 0.825943 -0.520841 -0.215739 -0.215739 -0.825943 -0.520841 -0.520841 -0.825943 -0.215739 4 0 14 7 5 4 3 9 42 11 9 13 26 25 20 19 8 6 7 14 7 1 0 3 11 12 13 14 4 8 19 24 17 6 4 5 7 8 17 18 6 15 16 23 24 19 20 6 33 34 45 47 25 26 9 27 10 9 3 2 0 5 4 28 6 21 22 50 51 29 30 4 23 16 21 30 6 27 28 35 36 31 32 4 26 13 12 33 8 33 12 11 42 41 49 48 34 4 28 4 18 35 8 35 18 17 24 23 30 29 36 4 29 51 31 36 4 10 27 32 37 6 42 9 10 37 38 41 6 39 40 48 49 43 44 9 45 46 40 39 22 21 16 15 47 4 15 20 25 47 4 40 45 34 48 4 41 38 43 49 8 44 43 38 37 32 31 51 50 4 22 39 44 50 geomview-1.9.5/data/geom/polyhedra/rhombitruncated_icosidodecahedron0000644000175000017500000001147012310110172022752 00000000000000OFF 124 62 188 0.131496 0.404703 0.904944 0.344261 0.25012 0.904944 -0.344261 0.25012 0.904944 -0.131496 0.404703 0.904944 -0.131496 0.628418 0.766681 -0.344261 0.697549 0.628418 0.131496 -0.404703 0.904944 -0.131496 -0.404703 0.904944 0.42553 0 0.904944 0.344261 -0.25012 0.904944 -0.344261 -0.25012 0.904944 -0.42553 0 0.904944 0.344261 0.697549 0.628418 0.131496 0.628418 0.766681 0.344261 0.921264 0.180989 0.42553 0.809407 0.404703 -0.131496 0.990396 0.0427257 0.131496 0.990396 0.0427257 -0.42553 0.809407 0.404703 -0.344261 0.921264 0.180989 -0.638295 0.0691316 0.766681 -0.769791 -0.111857 0.628418 -0.557026 0.542967 0.628418 -0.557026 0.319252 0.766681 -0.769791 0.612098 0.180989 -0.638295 0.654824 0.404703 -0.982557 0.180989 0.0427257 -0.901288 0.431109 0.0427257 -0.901288 -0.154583 0.404703 -0.982557 -0.0427257 0.180989 -0.262992 -0.585692 0.766681 -0.131496 -0.766681 0.628418 -0.688522 -0.361978 0.628418 -0.475757 -0.431109 0.766681 -0.820019 -0.542967 0.180989 -0.820019 -0.404703 0.404703 -0.475757 -0.878538 0.0427257 -0.688522 -0.723955 0.0427257 -0.131496 -0.904944 0.404703 -0.262992 -0.94767 0.180989 0.475757 -0.431109 0.766681 0.688522 -0.361978 0.628418 0.131496 -0.766681 0.628418 0.262992 -0.585692 0.766681 0.262992 -0.94767 0.180989 0.131496 -0.904944 0.404703 0.688522 -0.723955 0.0427257 0.475757 -0.878538 0.0427257 0.820019 -0.404703 0.404703 0.820019 -0.542967 0.180989 0.557026 0.319252 0.766681 0.557026 0.542967 0.628418 0.769791 -0.111857 0.628418 0.638295 0.0691316 0.766681 0.982557 -0.0427257 0.180989 0.901288 -0.154583 0.404703 0.860653 0.487038 -0.0691316 0.901288 0.431109 0.0427257 0.982557 0.180989 0.0427257 0.638295 0.654824 0.404703 0.769791 0.612098 0.180989 0.131496 -0.404703 -0.904944 0.344261 -0.25012 -0.904944 0.42553 0 -0.904944 0.344261 0.25012 -0.904944 0.131496 0.404703 -0.904944 -0.131496 0.404703 -0.904944 -0.344261 0.25012 -0.904944 -0.410009 0.340615 -0.835813 -0.42553 0 -0.904944 -0.344261 -0.25012 -0.904944 -0.131496 -0.404703 -0.904944 -0.131496 -0.628418 -0.766681 -0.344261 -0.697549 -0.628418 -0.42553 -0.809407 -0.404703 -0.344261 -0.921264 -0.180989 -0.131496 -0.990396 -0.0427257 0.131496 -0.990396 -0.0427257 0.344261 -0.921264 -0.180989 0.42553 -0.809407 -0.404703 0.344261 -0.697549 -0.628418 0.131496 -0.628418 -0.766681 0.557026 -0.319252 -0.766681 0.557026 -0.542967 -0.628418 0.638295 -0.654824 -0.404703 0.769791 -0.612098 -0.180989 0.901288 -0.431109 -0.0427257 0.982557 -0.180989 -0.0427257 0.982557 0.0427257 -0.180989 0.901288 0.154583 -0.404703 0.769791 0.111857 -0.628418 0.638295 -0.0691316 -0.766681 0.369375 0.508401 -0.766681 0.475757 0.431109 -0.766681 0.688522 0.361978 -0.628418 0.820019 0.404703 -0.404703 0.820019 0.542967 -0.180989 0.688522 0.723955 -0.0427257 0.475757 0.878538 -0.0427257 0.262992 0.94767 -0.180989 0.131496 0.904944 -0.404703 0.131496 0.766681 -0.628418 0.262992 0.585692 -0.766681 -0.262992 0.585692 -0.766681 -0.131496 0.766681 -0.628418 -0.131496 0.904944 -0.404703 -0.262992 0.94767 -0.180989 -0.475757 0.878538 -0.0427257 -0.688522 0.723955 -0.0427257 -0.820019 0.542967 -0.180989 -0.75427 0.633461 -0.111857 -0.820019 0.404703 -0.404703 -0.688522 0.361978 -0.628418 -0.475757 0.431109 -0.766681 -0.638295 -0.0691316 -0.766681 -0.769791 0.111857 -0.628418 -0.901288 0.154583 -0.404703 -0.982557 0.0427257 -0.180989 -0.982557 -0.180989 -0.0427257 -0.901288 -0.431109 -0.0427257 -0.769791 -0.612098 -0.180989 -0.638295 -0.654824 -0.404703 -0.557026 -0.542967 -0.628418 -0.557026 -0.319252 -0.766681 6 50 51 12 13 0 1 6 22 23 2 3 4 5 4 6 43 40 9 10 10 7 6 9 8 1 0 3 2 11 4 2 23 20 11 4 4 3 0 13 6 59 60 97 98 14 15 4 14 98 99 17 10 18 5 4 13 12 15 14 17 16 19 6 32 33 10 11 20 21 4 5 18 25 22 10 24 27 26 29 28 21 20 23 22 25 4 7 10 33 30 4 21 28 35 32 6 28 29 118 119 34 35 4 34 119 120 37 4 45 42 31 38 10 38 31 30 33 32 35 34 37 36 39 10 40 43 42 45 44 47 46 49 48 41 6 6 7 30 31 42 43 6 38 39 76 77 44 45 4 55 52 41 48 6 8 9 40 41 52 53 4 50 1 8 53 4 15 12 51 59 10 59 51 50 53 52 55 54 58 57 60 6 103 104 101 102 65 66 10 67 66 65 64 63 62 61 71 70 69 6 122 123 70 71 72 73 10 75 74 73 72 81 80 79 78 77 76 4 39 36 75 76 4 78 47 44 77 4 83 84 79 80 6 61 62 82 83 80 81 4 72 71 61 81 6 85 46 47 78 79 84 4 49 46 85 86 6 87 54 55 48 49 86 4 88 58 54 87 10 90 89 88 87 86 85 84 83 82 91 4 82 62 63 91 4 64 65 102 93 6 90 91 63 64 93 94 4 89 90 94 95 7 56 57 58 88 89 95 96 4 97 60 57 96 6 100 105 106 16 17 99 4 104 105 100 101 11 101 100 99 98 97 96 95 94 93 92 102 4 66 67 113 103 4 19 16 106 107 11 107 106 105 104 103 113 112 111 109 110 108 6 24 25 18 19 107 108 4 27 24 108 109 4 115 116 111 112 7 112 113 68 67 69 114 115 6 26 27 109 111 116 117 4 118 29 26 117 6 74 75 36 37 120 121 4 122 73 74 121 10 122 121 120 119 118 117 116 115 114 123 4 114 69 70 123 geomview-1.9.5/data/geom/polyhedra/snub_cube0000644000175000017500000000162412310110172015777 00000000000000OFF 24 38 60 0.295598 -1 -0.543689 1 -0.295598 0.543689 1 -0.543689 -0.295598 0.295598 -0.543689 1 0.543689 0.295598 1 0.543689 -1 0.295598 0.295598 1 0.543689 -0.295598 1 -0.543689 -1 0.543689 -0.295598 -1 -0.295598 -0.543689 -0.543689 0.295598 -1 -0.543689 -1 -0.295598 -0.295598 -0.543689 -1 0.543689 -0.295598 -1 -0.295598 -1 0.543689 1 0.543689 0.295598 -0.543689 -0.295598 1 -1 -0.543689 0.295598 -1 0.295598 0.543689 -0.543689 1 0.295598 -0.295598 0.543689 1 0.295598 0.543689 -1 0.543689 1 -0.295598 1 0.295598 -0.543689 4 4 20 16 3 4 5 14 11 0 4 15 1 2 23 3 14 3 16 3 14 5 3 3 3 5 1 3 3 1 4 3 4 1 15 3 5 2 1 3 5 0 2 4 10 21 13 12 4 19 6 22 7 4 17 18 8 9 3 7 22 21 3 7 21 10 3 8 7 10 3 8 10 9 3 9 10 12 3 13 0 12 3 12 0 11 3 23 2 13 3 21 23 13 3 13 2 0 3 11 14 17 3 20 6 19 3 6 20 4 3 22 15 23 3 6 15 22 3 6 4 15 3 14 16 17 3 18 17 16 3 18 16 20 3 12 11 9 3 8 19 7 3 18 19 8 3 20 19 18 3 11 17 9 3 21 22 23 geomview-1.9.5/data/geom/polyhedra/snub_dodecahedron0000644000175000017500000000514112310110172017476 00000000000000OFF 60 92 150 0.544149 -0.494938 0.795558 -0.194436 -0.976275 0.427849 -0.302562 -0.670461 0.795558 0.839268 -0.068253 0.681868 -0.868409 -0.600296 0.243894 -0.108126 -1.07458 -0.086901 -0.416538 -0.90411 -0.427849 0.868409 0.486606 -0.427849 0.302562 1.01141 -0.243894 0.32426 -0.7771 -0.681868 -0.32426 0.262351 1 0.638865 0.364572 0.795558 -0.7191 -0.438092 0.681868 0.416538 -0.021651 1 0.194436 -0.819283 0.681868 0.108126 -0.402842 1 -0.349712 -0.227319 1 0.349712 -0.996087 -0.243894 -0.544148 -0.932911 0.086901 -0.868409 0.600296 -0.243894 0.149309 -0.38946 -1 0.638865 -0.364572 -0.795558 0.544149 0.494938 -0.795558 -0.302562 0.670461 -0.795558 0.839268 0.068253 -0.681868 0.194436 0.819283 -0.681868 0.108126 0.402842 -1 -0.7191 0.438092 -0.681868 -0.149309 -0.7191 -0.795558 0.416538 0.021651 -1 -0.839268 -0.638865 -0.243894 -0.988577 0.116766 -0.427849 -1.0554 0.22923 0.086901 -0.544148 0.932911 -0.086901 -0.839268 0.638865 0.243894 -0.149309 0.720255 0.795558 0.149309 0.38946 1 -0.638865 0.548527 0.681868 -0.731143 0.080569 0.795558 0.731142 0.675536 0.427849 -0.108126 1.07458 0.086901 0.720255 0.805802 -0.086901 0.988577 -0.434898 -0.086901 -0.988577 -0.116766 0.427849 -1.0554 -0.227319 -0.086901 0.988577 0.434898 0.086901 1.0554 -0.024789 0.243894 0.720255 -0.805802 0.086901 0.32426 0.7771 0.681868 0.868409 -0.486606 0.427849 0.302562 -1.01141 0.243894 -0.416538 0.90411 0.427849 -0.349712 0.22923 -1 -0.32426 -0.262351 -1 -0.731143 -0.080569 -0.795558 -0.638865 -0.548527 -0.681868 -0.194436 0.976275 -0.427849 0.731142 -0.675536 -0.427849 0.349712 0.996087 0.243894 1.0554 0.024789 -0.243894 5 16 15 13 36 10 5 18 1 2 12 4 5 51 35 48 58 40 5 39 11 3 46 45 5 47 49 0 14 50 5 43 38 37 34 32 5 26 29 20 53 52 5 33 56 23 27 19 5 9 17 5 6 28 5 59 42 57 21 24 5 22 25 8 41 7 5 31 54 55 30 44 3 10 35 37 3 36 11 48 3 13 0 3 3 15 2 14 3 16 38 12 3 51 33 34 3 39 41 58 3 49 42 46 3 1 5 50 3 43 44 4 3 40 8 56 3 45 59 7 3 47 17 57 3 18 30 6 3 32 19 31 3 53 28 55 3 20 21 9 3 29 22 24 3 26 23 25 3 52 54 27 3 10 36 35 3 36 13 11 3 13 15 0 3 15 16 2 3 16 10 38 3 48 35 36 3 3 11 13 3 14 0 15 3 12 2 16 3 37 38 10 3 35 51 37 3 11 39 48 3 0 49 3 3 2 1 14 3 38 43 12 3 51 40 33 3 39 45 41 3 49 47 42 3 1 18 5 3 43 32 44 3 40 58 8 3 45 46 59 3 47 50 17 3 18 4 30 3 32 34 19 3 58 48 39 3 46 3 49 3 50 14 1 3 4 12 43 3 34 37 51 3 53 20 28 3 20 29 21 3 29 26 22 3 26 52 23 3 52 53 54 3 9 28 20 3 24 21 29 3 25 22 26 3 27 23 52 3 55 54 53 3 28 6 55 3 21 57 9 3 22 7 24 3 23 56 25 3 54 31 27 3 6 5 18 3 57 42 47 3 7 41 45 3 56 33 40 3 31 44 32 3 5 17 50 3 42 59 46 3 41 8 58 3 33 19 34 3 44 30 4 3 17 9 57 3 59 24 7 3 8 25 56 3 19 27 31 3 30 55 6 geomview-1.9.5/data/geom/polyhedra/tetrahedron0000644000175000017500000000022512310110172016345 00000000000000OFF 4 4 6 0.0 0.0 2.0 1.632993 -0.942809 -0.666667 0.000000 1.885618 -0.666667 -1.632993 -0.942809 -0.666667 3 1 0 3 3 2 0 1 3 3 0 2 3 3 2 1 geomview-1.9.5/data/geom/polyhedra/truncated_cube0000644000175000017500000000177312310110172017026 00000000000000OFF 27 14 42 0.678598 0.281085 0.678598 -0.281085 0.678598 0.678598 -0.678598 0.678598 0.281085 0.678598 -0.281085 0.678598 0.281085 -0.678598 0.678598 0.678598 0.678598 0.281085 0.281085 0.678598 0.678598 -0.281085 0.678598 -0.678598 -0.678598 0.281085 -0.678598 -0.678598 0.281085 0.678598 -0.678598 -0.281085 -0.678598 -0.281085 -0.678598 -0.678598 -0.678598 0.678598 -0.281085 0.678598 0.678598 -0.281085 -0.281085 -0.678598 0.678598 -0.678598 -0.281085 0.678598 -0.678598 -0.678598 -0.281085 -0.678598 -0.678598 0.281085 0.678598 -0.678598 0.281085 0.678598 -0.678598 0 0.281085 -0.678598 -0.678598 0.678598 0.281085 -0.678598 0.281085 0.678598 -0.678598 0 0.678598 -0.678598 0.678598 -0.479842 -0.479842 0.678598 -0.281085 -0.678598 0.678598 -0.678598 -0.281085 8 9 15 14 4 3 0 6 1 3 2 9 1 3 6 0 5 8 2 12 8 10 16 17 15 9 9 12 2 1 6 5 13 22 23 7 8 10 8 7 22 21 25 20 11 3 12 7 8 3 11 16 10 3 15 17 14 8 5 0 3 18 26 25 21 13 9 4 14 17 16 11 20 26 19 18 3 3 4 18 3 13 21 22 4 24 26 20 25 geomview-1.9.5/data/geom/polyhedra/truncated_dodecahedron0000644000175000017500000000472012310110172020522 00000000000000OFF 66 32 102 0.168381 0.518225 0.838505 -0.440828 0.32028 0.838505 -0.168381 0.518225 0.838505 -0.440828 0.606748 0.661458 0.168381 -0.518225 0.838505 0.492861 0.16014 0.838505 0.544894 0 0.838505 -0.440828 -0.32028 0.838505 0.440828 0.606748 0.661458 0.544894 0.749982 0.374991 -0.168381 0.981739 -0.0885233 0.168381 0.981739 -0.0885233 -0.544894 0 0.838505 -0.713275 0.695271 0.0885233 -0.544894 0.749982 0.374991 -0.881657 -0.286468 0.374991 -0.168381 -0.518225 0.838505 -0.713275 -0.231757 0.661458 -0.881657 -0.463514 0.0885233 -0.713275 -0.695271 -0.0885233 0 -0.927028 0.374991 -0.168381 -0.981739 0.0885233 0.440828 -0.32028 0.838505 0.0841907 -0.634103 0.749982 0 -0.749982 0.661458 0.713275 -0.695271 -0.0885233 0.440828 -0.893216 -0.0885233 0.881657 -0.286468 0.374991 0.881657 -0.463514 0.0885233 0.440828 0.32028 0.838505 0.713275 -0.231757 0.661458 0.985722 0.143234 -0.0885233 0.713275 0.695271 0.0885233 0.168381 -0.518225 -0.838505 0.440828 -0.32028 -0.838505 -0.304605 0.419253 -0.838505 -0.544894 0 -0.838505 -0.304605 -0.419253 -0.838505 -0.168381 -0.518225 -0.838505 -0.544894 -0.749982 -0.374991 -0.440828 -0.893216 -0.0885233 0.168381 -0.981739 0.0885233 0.304605 -0.937477 0 0.544894 -0.749982 -0.374991 0.440828 -0.606748 -0.661458 0.985722 -0.143234 0.0885233 0.713275 0.231757 -0.661458 0.544894 0 -0.838505 0.440828 0.32028 -0.838505 0.881657 0.286468 -0.374991 0.881657 0.374991 -0.231757 0.881657 0.463514 -0.0885233 0.440828 0.893216 0.0885233 0 0.749982 -0.661458 0.168381 0.518225 -0.838505 -0.168381 0.518225 -0.838505 0 0.927028 -0.374991 -0.440828 0.893216 0.0885233 -0.881657 0.463514 -0.0885233 -0.881657 0.286468 -0.374991 -0.713275 0.231757 -0.661458 -0.440828 0.32028 -0.838505 -0.985722 0.143234 -0.0885233 -0.985722 -0.143234 0.0885233 -0.440828 -0.606748 -0.661458 -0.440828 -0.32028 -0.838505 3 3 1 2 11 6 5 29 0 2 1 12 7 16 4 22 10 52 11 10 57 14 3 2 0 8 9 3 57 13 14 10 62 63 15 17 12 1 3 14 13 58 3 4 16 24 10 17 15 18 19 40 21 20 24 16 7 3 12 17 7 3 39 40 19 11 41 26 25 28 27 30 22 4 23 24 20 3 21 41 20 3 0 29 8 3 6 22 30 3 32 52 9 10 9 8 29 6 30 27 45 31 51 32 10 65 36 61 55 54 48 47 34 33 38 11 21 40 39 64 38 33 44 43 26 42 41 3 43 25 26 3 34 44 33 3 27 28 45 10 46 49 31 45 28 25 43 44 34 47 3 48 46 47 4 50 51 31 49 10 52 32 51 49 46 48 54 53 56 11 3 56 10 11 3 54 55 53 3 59 62 58 11 60 59 58 13 57 10 56 53 55 35 61 3 36 60 61 3 15 63 18 10 18 63 62 59 60 36 65 64 39 19 4 37 38 64 65 geomview-1.9.5/data/geom/polyhedra/truncated_icosahedron0000644000175000017500000000466612310110172020412 00000000000000OFF 65 32 99 0.326477 0.106079 0.939234 -0.326477 0.106079 0.939234 0 0.343279 0.939234 0.201774 -0.277718 0.939234 -0.201774 -0.277718 0.939234 0.326477 0.792636 0.514918 0 0.686557 0.727076 0 0.964275 0.171639 0.201774 0.964275 0.171639 -0.326477 0.792636 0.514918 -0.201774 0.964275 0.171639 -0.854729 -0.0655604 0.514918 -0.652955 0.555436 0.514918 -0.652955 0.212158 0.727076 -0.854729 0.489876 0.171639 -0.979432 0.106079 0.171639 -0.201774 -0.833155 0.514918 -0.403548 -0.555436 0.727076 -0.730026 -0.449358 0.514918 -0.730026 -0.661515 0.171639 -0.403548 -0.898715 0.171639 0.792377 -0.257459 0.514918 0.201774 -0.833155 0.514918 0.403548 -0.555436 0.727076 0.403548 -0.898715 0.171639 0.730026 -0.661515 0.171639 0.730026 -0.449358 0.514918 0.652955 0.555436 0.514918 0.652955 0.212158 0.727076 0.979432 0.106079 0.171639 0.854729 -0.0655604 0.514918 0.854729 0.489876 0.171639 0 -0.343279 -0.939234 0.326477 -0.106079 -0.939234 0.201774 0.277718 -0.939234 -0.201774 0.277718 -0.939234 -0.326477 -0.106079 -0.939234 0 -0.686557 -0.727076 0 -0.514918 -0.833155 -0.326477 -0.792636 -0.514918 -0.201774 -0.964275 -0.171639 0.201774 -0.964275 -0.171639 0.326477 -0.792636 -0.514918 0.652955 -0.212158 -0.727076 0.652955 -0.555436 -0.514918 0.854729 -0.489876 -0.171639 0.91708 -0.297978 -0.171639 0.979432 -0.106079 -0.171639 0.854729 0.0655604 -0.514918 0.730026 0.449358 -0.514918 0.730026 0.661515 -0.171639 0.403548 0.898715 -0.171639 0.201774 0.833155 -0.514918 0.403548 0.555436 -0.727076 -0.403548 0.555436 -0.727076 -0.201774 0.833155 -0.514918 -0.403548 0.898715 -0.171639 -0.730026 0.661515 -0.171639 -0.730026 0.449358 -0.514918 -0.652955 -0.212158 -0.727076 -0.753842 -0.0732987 -0.620997 -0.854729 0.0655604 -0.514918 -0.979432 -0.106079 -0.171639 -0.854729 -0.489876 -0.171639 -0.652955 -0.555436 -0.514918 5 4 3 0 2 1 6 7 10 9 6 5 8 6 11 18 17 4 1 13 6 1 2 6 9 12 13 5 14 15 11 13 12 5 19 20 16 17 18 6 40 41 24 22 16 20 7 21 30 28 0 3 23 26 6 3 4 17 16 22 23 5 25 26 23 22 24 6 5 6 2 0 28 27 5 27 28 30 29 31 5 33 32 36 35 34 6 53 49 48 43 33 34 5 42 41 40 39 37 7 42 37 38 32 33 43 44 6 25 24 41 42 44 45 5 44 43 48 47 45 7 46 47 29 30 26 25 45 5 53 52 51 50 49 6 31 29 47 48 49 50 6 51 8 5 27 31 50 6 52 55 56 10 8 51 6 34 35 54 55 52 53 5 54 58 57 56 55 6 14 12 9 10 56 57 6 35 36 59 61 58 54 6 15 14 57 58 61 62 6 19 18 11 15 62 63 6 64 39 40 20 19 63 6 64 63 62 61 60 59 7 36 32 38 37 39 64 59 geomview-1.9.5/data/geom/polyhedra/truncated_octahedron0000644000175000017500000000157312310110172020234 00000000000000OFF 28 14 44 0 0.447214 0.894427 0.447214 0 0.894427 0 -0.447214 0.894427 0.447214 0.894427 0 0 0.894427 0.447214 -0.223607 0.223607 -0.894427 -0.447214 0.894427 0 0 0.894427 -0.447214 -0.447214 0 -0.894427 0 -0.447214 -0.894427 -0.894427 0.447214 0 -0.447214 0 0.894427 -0.223607 -0.223607 0.894427 -0.894427 -0.447214 0 -0.894427 -0.223607 -0.223607 -0.894427 0 -0.447214 -0.447214 -0.894427 0 0.894427 0.447214 0 -0.894427 0 0.447214 0 -0.894427 0.447214 0.447214 0 -0.894427 0.894427 0 0.447214 0.447214 -0.894427 0 0 0.447214 -0.894427 0.894427 0 -0.447214 0.894427 -0.447214 0 0.894427 -0.223607 -0.223607 0 -0.894427 -0.447214 6 6 10 18 11 0 4 4 4 3 7 6 6 4 0 1 21 17 3 7 23 5 8 15 10 6 7 4 15 13 18 10 4 2 1 0 11 7 16 19 2 12 11 18 13 6 1 2 19 22 25 21 4 22 19 16 27 6 23 7 3 17 24 20 4 20 9 8 23 4 17 21 25 24 7 26 25 22 27 9 20 24 7 13 14 15 8 9 27 16 geomview-1.9.5/data/geom/polyhedra/truncated_tetrahedron0000644000175000017500000000046112310110172020420 00000000000000OFF 12 8 18 0.25 -0.75 0.25 -0.75 0.25 0.25 -0.25 -0.75 -0.25 -0.75 -0.25 -0.25 0.25 0.75 -0.25 0.25 0.25 -0.75 -0.25 -0.25 -0.75 -0.25 0.25 0.75 0.25 -0.25 0.75 -0.25 0.75 0.25 0.75 -0.25 0.25 0.75 0.25 -0.25 3 10 8 0 3 7 9 1 3 3 6 2 3 4 11 5 6 11 10 0 2 6 5 6 8 7 1 3 2 0 6 9 4 5 6 3 1 6 7 8 10 11 4 9 geomview-1.9.5/data/geom/spherical/0000755000175000017500000000000012310165604014161 500000000000000geomview-1.9.5/data/geom/spherical/dodecaplex.off0000644000175000017500000010320612310110172016675 000000000000004OFF 600 720 1200 -1. -1. -1. -4.23607 -1. -1. -1. 4.23607 -1. -1. 1. -4.23607 -1. -1. 1. 4.23607 -1. -1. -4.23607 -1. -1. -1. -4.23607 1. -1. -1. 4.23607 -1. -1. -1. 4.23607 1. -1. 0 -3.61803 -2.61803 -1. 0 -3.61803 2.61803 -1. 0 3.61803 -2.61803 -1. 0 3.61803 2.61803 -1. 1. -1. -4.23607 -1. 1. -1. 4.23607 -1. 1. 1. -4.23607 -1. 1. 1. 4.23607 -1. 1. -4.23607 -1. -1. 1. -4.23607 1. -1. 1. 4.23607 -1. -1. 1. 4.23607 1. -1. -4.23607 -1. -1. -1. -4.23607 -1. 1. -1. -4.23607 1. -1. -1. -4.23607 1. 1. -1. -3.61803 -2.61803 0 -1. -3.61803 2.61803 0 -1. -2.61803 0 -3.61803 -1. -2.61803 0 3.61803 -1. -2.61803 -3.23607 -1.61803 -1. -2.61803 -3.23607 1.61803 -1. -2.61803 3.23607 -1.61803 -1. -2.61803 3.23607 1.61803 -1. -3.23607 -1.61803 -2.61803 -1. -3.23607 -1.61803 2.61803 -1. -3.23607 1.61803 -2.61803 -1. -3.23607 1.61803 2.61803 -1. -1.61803 -2.61803 -3.23607 -1. -1.61803 -2.61803 3.23607 -1. -1.61803 2.61803 -3.23607 -1. -1.61803 2.61803 3.23607 -1. 1.61803 -2.61803 -3.23607 -1. 1.61803 -2.61803 3.23607 -1. 1.61803 2.61803 -3.23607 -1. 1.61803 2.61803 3.23607 -1. 3.23607 -1.61803 -2.61803 -1. 3.23607 -1.61803 2.61803 -1. 3.23607 1.61803 -2.61803 -1. 3.23607 1.61803 2.61803 -1. 2.61803 0 -3.61803 -1. 2.61803 0 3.61803 -1. 2.61803 -3.23607 -1.61803 -1. 2.61803 -3.23607 1.61803 -1. 2.61803 3.23607 -1.61803 -1. 2.61803 3.23607 1.61803 -1. 3.61803 -2.61803 0 -1. 3.61803 2.61803 0 -1. 4.23607 -1. -1. -1. 4.23607 -1. 1. -1. 4.23607 1. -1. -1. 4.23607 1. 1. 0 -1. -2.61803 -3.61803 0 -1. -2.61803 3.61803 0 -1. 2.61803 -3.61803 0 -1. 2.61803 3.61803 0 0 -3.23607 -3.23607 0 0 -3.23607 3.23607 0 0 3.23607 -3.23607 0 0 3.23607 3.23607 0 1. -2.61803 -3.61803 0 1. -2.61803 3.61803 0 1. 2.61803 -3.61803 0 1. 2.61803 3.61803 0 -4.23607 -0.618034 -1.61803 0 -4.23607 -0.618034 1.61803 0 -4.23607 0.618034 -1.61803 0 -4.23607 0.618034 1.61803 0 -3.61803 -1. -2.61803 0 -3.61803 -1. 2.61803 0 -3.61803 1. -2.61803 0 -3.61803 1. 2.61803 0 -2.61803 -3.61803 -1. 0 -2.61803 -3.61803 1. 0 -2.61803 3.61803 -1. 0 -2.61803 3.61803 1. 0 -0.618034 -1.61803 -4.23607 0 -0.618034 -1.61803 4.23607 0 -0.618034 1.61803 -4.23607 0 -0.618034 1.61803 4.23607 0 0.618034 -1.61803 -4.23607 0 0.618034 -1.61803 4.23607 0 0.618034 1.61803 -4.23607 0 0.618034 1.61803 4.23607 0 -3.23607 0 -3.23607 0 -3.23607 0 3.23607 0 -3.23607 -3.23607 0 0 -3.23607 3.23607 0 0 -1.61803 -4.23607 -0.618034 0 -1.61803 -4.23607 0.618034 0 -1.61803 4.23607 -0.618034 0 -1.61803 4.23607 0.618034 0 1.61803 -4.23607 -0.618034 0 1.61803 -4.23607 0.618034 0 1.61803 4.23607 -0.618034 0 1.61803 4.23607 0.618034 0 3.23607 0 -3.23607 0 3.23607 0 3.23607 0 3.23607 -3.23607 0 0 3.23607 3.23607 0 0 2.61803 -3.61803 -1. 0 2.61803 -3.61803 1. 0 2.61803 3.61803 -1. 0 2.61803 3.61803 1. 0 3.61803 -1. -2.61803 0 3.61803 -1. 2.61803 0 3.61803 1. -2.61803 0 3.61803 1. 2.61803 0 4.23607 -0.618034 -1.61803 0 4.23607 -0.618034 1.61803 0 4.23607 0.618034 -1.61803 0 4.23607 0.618034 1.61803 1. -1. -1. -4.23607 1. -1. -1. 4.23607 1. -1. 1. -4.23607 1. -1. 1. 4.23607 1. -1. -4.23607 -1. 1. -1. -4.23607 1. 1. -1. 4.23607 -1. 1. -1. 4.23607 1. 1. 0 -3.61803 -2.61803 1. 0 -3.61803 2.61803 1. 0 3.61803 -2.61803 1. 0 3.61803 2.61803 1. 1. -1. -4.23607 1. 1. -1. 4.23607 1. 1. 1. -4.23607 1. 1. 1. 4.23607 1. 1. -4.23607 -1. 1. 1. -4.23607 1. 1. 1. 4.23607 -1. 1. 1. 4.23607 1. 1. -4.23607 -1. -1. 1. -4.23607 -1. 1. 1. -4.23607 1. -1. 1. -4.23607 1. 1. 1. -3.61803 -2.61803 0 1. -3.61803 2.61803 0 1. -2.61803 0 -3.61803 1. -2.61803 0 3.61803 1. -2.61803 -3.23607 -1.61803 1. -2.61803 -3.23607 1.61803 1. -2.61803 3.23607 -1.61803 1. -2.61803 3.23607 1.61803 1. -3.23607 -1.61803 -2.61803 1. -3.23607 -1.61803 2.61803 1. -3.23607 1.61803 -2.61803 1. -3.23607 1.61803 2.61803 1. -1.61803 -2.61803 -3.23607 1. -1.61803 -2.61803 3.23607 1. -1.61803 2.61803 -3.23607 1. -1.61803 2.61803 3.23607 1. 1.61803 -2.61803 -3.23607 1. 1.61803 -2.61803 3.23607 1. 1.61803 2.61803 -3.23607 1. 1.61803 2.61803 3.23607 1. 3.23607 -1.61803 -2.61803 1. 3.23607 -1.61803 2.61803 1. 3.23607 1.61803 -2.61803 1. 3.23607 1.61803 2.61803 1. 2.61803 0 -3.61803 1. 2.61803 0 3.61803 1. 2.61803 -3.23607 -1.61803 1. 2.61803 -3.23607 1.61803 1. 2.61803 3.23607 -1.61803 1. 2.61803 3.23607 1.61803 1. 3.61803 -2.61803 0 1. 3.61803 2.61803 0 1. 4.23607 -1. -1. 1. 4.23607 -1. 1. 1. 4.23607 1. -1. 1. 4.23607 1. 1. -4.23607 -1. -1. -1. -4.23607 -1. -1. 1. -4.23607 -1. 1. -1. -4.23607 -1. 1. 1. -4.23607 0 -1.61803 -0.618034 -4.23607 0 -1.61803 0.618034 -4.23607 0 1.61803 -0.618034 -4.23607 0 1.61803 0.618034 -4.23607 1. -1. -1. -4.23607 1. -1. 1. -4.23607 1. 1. -1. -4.23607 1. 1. 1. -4.23607 -0.618034 0 -1.61803 -4.23607 -0.618034 0 1.61803 -4.23607 0.618034 0 -1.61803 -4.23607 0.618034 0 1.61803 -4.23607 -1.61803 -0.618034 0 -4.23607 -1.61803 0.618034 0 -4.23607 1.61803 -0.618034 0 -4.23607 1.61803 0.618034 0 -3.61803 -1. 0 -2.61803 -3.61803 -1. 0 2.61803 -3.61803 0 -2.61803 -1. -3.61803 0 -2.61803 1. -3.61803 0 2.61803 -1. -3.61803 0 2.61803 1. -3.61803 1. 0 -2.61803 -3.61803 1. 0 2.61803 -3.61803 -2.61803 -1. 0 -3.61803 -2.61803 1. 0 -3.61803 -1.61803 -1.61803 -1.61803 -3.61803 -1.61803 -1.61803 1.61803 -3.61803 -1.61803 1.61803 -1.61803 -3.61803 -1.61803 1.61803 1.61803 -3.61803 1.61803 -1.61803 -1.61803 -3.61803 1.61803 -1.61803 1.61803 -3.61803 1.61803 1.61803 -1.61803 -3.61803 1.61803 1.61803 1.61803 -3.61803 2.61803 -1. 0 -3.61803 2.61803 1. 0 -2.61803 -1. -3.61803 0 -2.61803 -1. -1.61803 -3.23607 -2.61803 -1. -1.61803 3.23607 -2.61803 -1. 1.61803 -3.23607 -2.61803 -1. 1.61803 3.23607 -2.61803 -1. 3.61803 0 -2.61803 0 -1. -3.61803 -2.61803 0 -1. 3.61803 -2.61803 0 1. -3.61803 -2.61803 0 1. 3.61803 -2.61803 1. -3.61803 0 -2.61803 1. -1.61803 -3.23607 -2.61803 1. -1.61803 3.23607 -2.61803 1. 1.61803 -3.23607 -2.61803 1. 1.61803 3.23607 -2.61803 1. 3.61803 0 -2.61803 -3.61803 0 -1. -2.61803 -3.61803 0 1. -2.61803 -2.61803 -2.61803 -0.618034 -2.61803 -2.61803 -2.61803 0.618034 -2.61803 -2.61803 -0.618034 -2.61803 -2.61803 -2.61803 -0.618034 2.61803 -2.61803 -2.61803 0.618034 -2.61803 -2.61803 -2.61803 0.618034 2.61803 -2.61803 -2.61803 2.61803 -0.618034 -2.61803 -2.61803 2.61803 0.618034 -2.61803 -0.618034 -2.61803 -2.61803 -2.61803 -0.618034 -2.61803 2.61803 -2.61803 -0.618034 2.61803 -2.61803 -2.61803 -0.618034 2.61803 2.61803 -2.61803 0.618034 -2.61803 -2.61803 -2.61803 0.618034 -2.61803 2.61803 -2.61803 0.618034 2.61803 -2.61803 -2.61803 0.618034 2.61803 2.61803 -2.61803 -3.23607 -1. -1.61803 -2.61803 -3.23607 -1. 1.61803 -2.61803 -3.23607 1. -1.61803 -2.61803 -3.23607 1. 1.61803 -2.61803 -1.61803 -3.23607 -1. -2.61803 -1.61803 -3.23607 1. -2.61803 -1.61803 3.23607 -1. -2.61803 -1.61803 3.23607 1. -2.61803 1.61803 -3.23607 -1. -2.61803 1.61803 -3.23607 1. -2.61803 1.61803 3.23607 -1. -2.61803 1.61803 3.23607 1. -2.61803 3.23607 -1. -1.61803 -2.61803 3.23607 -1. 1.61803 -2.61803 3.23607 1. -1.61803 -2.61803 3.23607 1. 1.61803 -2.61803 2.61803 -2.61803 -0.618034 -2.61803 2.61803 -2.61803 0.618034 -2.61803 2.61803 -0.618034 -2.61803 -2.61803 2.61803 -0.618034 2.61803 -2.61803 2.61803 0.618034 -2.61803 -2.61803 2.61803 0.618034 2.61803 -2.61803 2.61803 2.61803 -0.618034 -2.61803 2.61803 2.61803 0.618034 -2.61803 3.61803 0 -1. -2.61803 3.61803 0 1. -0.618034 0 -4.23607 -1.61803 -0.618034 0 -4.23607 1.61803 -0.618034 0 4.23607 -1.61803 -0.618034 0 4.23607 1.61803 -0.618034 -4.23607 -1.61803 0 -0.618034 -4.23607 1.61803 0 -0.618034 -2.61803 -2.61803 -2.61803 -0.618034 -2.61803 -2.61803 2.61803 -0.618034 -2.61803 2.61803 -2.61803 -0.618034 -2.61803 2.61803 2.61803 -0.618034 -1.61803 0 -4.23607 -0.618034 -1.61803 0 4.23607 -0.618034 1.61803 0 -4.23607 -0.618034 1.61803 0 4.23607 -0.618034 2.61803 -2.61803 -2.61803 -0.618034 2.61803 -2.61803 2.61803 -0.618034 2.61803 2.61803 -2.61803 -0.618034 2.61803 2.61803 2.61803 -0.618034 4.23607 -1.61803 0 -0.618034 4.23607 1.61803 0 0.618034 0 -4.23607 -1.61803 0.618034 0 -4.23607 1.61803 0.618034 0 4.23607 -1.61803 0.618034 0 4.23607 1.61803 0.618034 -4.23607 -1.61803 0 0.618034 -4.23607 1.61803 0 0.618034 -2.61803 -2.61803 -2.61803 0.618034 -2.61803 -2.61803 2.61803 0.618034 -2.61803 2.61803 -2.61803 0.618034 -2.61803 2.61803 2.61803 0.618034 -1.61803 0 -4.23607 0.618034 -1.61803 0 4.23607 0.618034 1.61803 0 -4.23607 0.618034 1.61803 0 4.23607 0.618034 2.61803 -2.61803 -2.61803 0.618034 2.61803 -2.61803 2.61803 0.618034 2.61803 2.61803 -2.61803 0.618034 2.61803 2.61803 2.61803 0.618034 4.23607 -1.61803 0 0.618034 4.23607 1.61803 0 -3.23607 -1. -2.61803 -1.61803 -3.23607 -1. -2.61803 1.61803 -3.23607 -1. 2.61803 -1.61803 -3.23607 -1. 2.61803 1.61803 -3.23607 0 0 -3.23607 -3.23607 0 0 3.23607 -3.23607 0 -3.23607 0 -3.23607 0 3.23607 0 -3.23607 1. -2.61803 -1.61803 -3.23607 1. -2.61803 1.61803 -3.23607 1. 2.61803 -1.61803 -3.23607 1. 2.61803 1.61803 -3.23607 -2.61803 -1.61803 -1. -3.23607 -2.61803 -1.61803 1. -3.23607 -2.61803 1.61803 -1. -3.23607 -2.61803 1.61803 1. -3.23607 -3.23607 0 0 -3.23607 -1.61803 -1. -2.61803 -3.23607 -1.61803 -1. 2.61803 -3.23607 -1.61803 1. -2.61803 -3.23607 -1.61803 1. 2.61803 -3.23607 1.61803 -1. -2.61803 -3.23607 1.61803 -1. 2.61803 -3.23607 1.61803 1. -2.61803 -3.23607 1.61803 1. 2.61803 -3.23607 3.23607 0 0 -3.23607 2.61803 -1.61803 -1. -3.23607 2.61803 -1.61803 1. -3.23607 2.61803 1.61803 -1. -3.23607 2.61803 1.61803 1. -1.61803 -1. -3.23607 -2.61803 -1.61803 -1. -3.23607 2.61803 -1.61803 -1. 3.23607 -2.61803 -1.61803 -1. 3.23607 2.61803 -1.61803 0 -0.618034 -4.23607 -1.61803 0 -0.618034 4.23607 -1.61803 0 0.618034 -4.23607 -1.61803 0 0.618034 4.23607 -1.61803 1. -3.23607 -2.61803 -1.61803 1. -3.23607 2.61803 -1.61803 1. 3.23607 -2.61803 -1.61803 1. 3.23607 2.61803 -1.61803 -4.23607 0 -0.618034 -1.61803 -4.23607 0 0.618034 -1.61803 -3.61803 -1.61803 -1.61803 -1.61803 -3.61803 -1.61803 1.61803 -1.61803 -3.61803 1.61803 -1.61803 -1.61803 -3.61803 1.61803 1.61803 -1.61803 -2.61803 -1. -3.23607 -1.61803 -2.61803 -1. 3.23607 -1.61803 -2.61803 1. -3.23607 -1.61803 -2.61803 1. 3.23607 -1.61803 -0.618034 -4.23607 0 -1.61803 -0.618034 4.23607 0 -1.61803 0.618034 -4.23607 0 -1.61803 0.618034 4.23607 0 -1.61803 -3.23607 -2.61803 -1. -1.61803 -3.23607 -2.61803 1. -1.61803 -3.23607 2.61803 -1. -1.61803 -3.23607 2.61803 1. -1.61803 -1.61803 -3.61803 -1.61803 -1.61803 -1.61803 -3.61803 1.61803 -1.61803 -1.61803 -1.61803 -3.61803 -1.61803 -1.61803 -1.61803 3.61803 -1.61803 -1.61803 1.61803 -3.61803 -1.61803 -1.61803 1.61803 3.61803 -1.61803 -1.61803 3.61803 -1.61803 -1.61803 -1.61803 3.61803 1.61803 -1.61803 1.61803 -3.61803 -1.61803 -1.61803 1.61803 -3.61803 1.61803 -1.61803 1.61803 -1.61803 -3.61803 -1.61803 1.61803 -1.61803 3.61803 -1.61803 1.61803 1.61803 -3.61803 -1.61803 1.61803 1.61803 3.61803 -1.61803 1.61803 3.61803 -1.61803 -1.61803 1.61803 3.61803 1.61803 -1.61803 3.23607 -2.61803 -1. -1.61803 3.23607 -2.61803 1. -1.61803 3.23607 2.61803 -1. -1.61803 3.23607 2.61803 1. -1.61803 2.61803 -1. -3.23607 -1.61803 2.61803 -1. 3.23607 -1.61803 2.61803 1. -3.23607 -1.61803 2.61803 1. 3.23607 -1.61803 3.61803 -1.61803 -1.61803 -1.61803 3.61803 -1.61803 1.61803 -1.61803 3.61803 1.61803 -1.61803 -1.61803 3.61803 1.61803 1.61803 -1.61803 4.23607 0 -0.618034 -1.61803 4.23607 0 0.618034 1.61803 -1. -3.23607 -2.61803 1.61803 -1. -3.23607 2.61803 1.61803 -1. 3.23607 -2.61803 1.61803 -1. 3.23607 2.61803 1.61803 0 -0.618034 -4.23607 1.61803 0 -0.618034 4.23607 1.61803 0 0.618034 -4.23607 1.61803 0 0.618034 4.23607 1.61803 1. -3.23607 -2.61803 1.61803 1. -3.23607 2.61803 1.61803 1. 3.23607 -2.61803 1.61803 1. 3.23607 2.61803 1.61803 -4.23607 0 -0.618034 1.61803 -4.23607 0 0.618034 1.61803 -3.61803 -1.61803 -1.61803 1.61803 -3.61803 -1.61803 1.61803 1.61803 -3.61803 1.61803 -1.61803 1.61803 -3.61803 1.61803 1.61803 1.61803 -2.61803 -1. -3.23607 1.61803 -2.61803 -1. 3.23607 1.61803 -2.61803 1. -3.23607 1.61803 -2.61803 1. 3.23607 1.61803 -0.618034 -4.23607 0 1.61803 -0.618034 4.23607 0 1.61803 0.618034 -4.23607 0 1.61803 0.618034 4.23607 0 1.61803 -3.23607 -2.61803 -1. 1.61803 -3.23607 -2.61803 1. 1.61803 -3.23607 2.61803 -1. 1.61803 -3.23607 2.61803 1. 1.61803 -1.61803 -3.61803 -1.61803 1.61803 -1.61803 -3.61803 1.61803 1.61803 -1.61803 -1.61803 -3.61803 1.61803 -1.61803 -1.61803 3.61803 1.61803 -1.61803 1.61803 -3.61803 1.61803 -1.61803 1.61803 3.61803 1.61803 -1.61803 3.61803 -1.61803 1.61803 -1.61803 3.61803 1.61803 1.61803 1.61803 -3.61803 -1.61803 1.61803 1.61803 -3.61803 1.61803 1.61803 1.61803 -1.61803 -3.61803 1.61803 1.61803 -1.61803 3.61803 1.61803 1.61803 1.61803 -3.61803 1.61803 1.61803 1.61803 3.61803 1.61803 1.61803 3.61803 -1.61803 1.61803 1.61803 3.61803 1.61803 1.61803 3.23607 -2.61803 -1. 1.61803 3.23607 -2.61803 1. 1.61803 3.23607 2.61803 -1. 1.61803 3.23607 2.61803 1. 1.61803 2.61803 -1. -3.23607 1.61803 2.61803 -1. 3.23607 1.61803 2.61803 1. -3.23607 1.61803 2.61803 1. 3.23607 1.61803 3.61803 -1.61803 -1.61803 1.61803 3.61803 -1.61803 1.61803 1.61803 3.61803 1.61803 -1.61803 1.61803 3.61803 1.61803 1.61803 1.61803 4.23607 0 -0.618034 1.61803 4.23607 0 0.618034 3.23607 -1. -2.61803 -1.61803 3.23607 -1. -2.61803 1.61803 3.23607 -1. 2.61803 -1.61803 3.23607 -1. 2.61803 1.61803 3.23607 0 0 -3.23607 3.23607 0 0 3.23607 3.23607 0 -3.23607 0 3.23607 0 3.23607 0 3.23607 1. -2.61803 -1.61803 3.23607 1. -2.61803 1.61803 3.23607 1. 2.61803 -1.61803 3.23607 1. 2.61803 1.61803 3.23607 -2.61803 -1.61803 -1. 3.23607 -2.61803 -1.61803 1. 3.23607 -2.61803 1.61803 -1. 3.23607 -2.61803 1.61803 1. 3.23607 -3.23607 0 0 3.23607 -1.61803 -1. -2.61803 3.23607 -1.61803 -1. 2.61803 3.23607 -1.61803 1. -2.61803 3.23607 -1.61803 1. 2.61803 3.23607 1.61803 -1. -2.61803 3.23607 1.61803 -1. 2.61803 3.23607 1.61803 1. -2.61803 3.23607 1.61803 1. 2.61803 3.23607 3.23607 0 0 3.23607 2.61803 -1.61803 -1. 3.23607 2.61803 -1.61803 1. 3.23607 2.61803 1.61803 -1. 3.23607 2.61803 1.61803 1. 2.61803 -1. -3.61803 0 2.61803 -1. -1.61803 -3.23607 2.61803 -1. -1.61803 3.23607 2.61803 -1. 1.61803 -3.23607 2.61803 -1. 1.61803 3.23607 2.61803 -1. 3.61803 0 2.61803 0 -1. -3.61803 2.61803 0 -1. 3.61803 2.61803 0 1. -3.61803 2.61803 0 1. 3.61803 2.61803 1. -3.61803 0 2.61803 1. -1.61803 -3.23607 2.61803 1. -1.61803 3.23607 2.61803 1. 1.61803 -3.23607 2.61803 1. 1.61803 3.23607 2.61803 1. 3.61803 0 2.61803 -3.61803 0 -1. 2.61803 -3.61803 0 1. 2.61803 -2.61803 -2.61803 -0.618034 2.61803 -2.61803 -2.61803 0.618034 2.61803 -2.61803 -0.618034 -2.61803 2.61803 -2.61803 -0.618034 2.61803 2.61803 -2.61803 0.618034 -2.61803 2.61803 -2.61803 0.618034 2.61803 2.61803 -2.61803 2.61803 -0.618034 2.61803 -2.61803 2.61803 0.618034 2.61803 -0.618034 -2.61803 -2.61803 2.61803 -0.618034 -2.61803 2.61803 2.61803 -0.618034 2.61803 -2.61803 2.61803 -0.618034 2.61803 2.61803 2.61803 0.618034 -2.61803 -2.61803 2.61803 0.618034 -2.61803 2.61803 2.61803 0.618034 2.61803 -2.61803 2.61803 0.618034 2.61803 2.61803 2.61803 -3.23607 -1. -1.61803 2.61803 -3.23607 -1. 1.61803 2.61803 -3.23607 1. -1.61803 2.61803 -3.23607 1. 1.61803 2.61803 -1.61803 -3.23607 -1. 2.61803 -1.61803 -3.23607 1. 2.61803 -1.61803 3.23607 -1. 2.61803 -1.61803 3.23607 1. 2.61803 1.61803 -3.23607 -1. 2.61803 1.61803 -3.23607 1. 2.61803 1.61803 3.23607 -1. 2.61803 1.61803 3.23607 1. 2.61803 3.23607 -1. -1.61803 2.61803 3.23607 -1. 1.61803 2.61803 3.23607 1. -1.61803 2.61803 3.23607 1. 1.61803 2.61803 2.61803 -2.61803 -0.618034 2.61803 2.61803 -2.61803 0.618034 2.61803 2.61803 -0.618034 -2.61803 2.61803 2.61803 -0.618034 2.61803 2.61803 2.61803 0.618034 -2.61803 2.61803 2.61803 0.618034 2.61803 2.61803 2.61803 2.61803 -0.618034 2.61803 2.61803 2.61803 0.618034 2.61803 3.61803 0 -1. 2.61803 3.61803 0 1. 3.61803 -1. 0 -2.61803 3.61803 -1. 0 2.61803 3.61803 0 -2.61803 -1. 3.61803 0 -2.61803 1. 3.61803 0 2.61803 -1. 3.61803 0 2.61803 1. 3.61803 1. 0 -2.61803 3.61803 1. 0 2.61803 3.61803 -2.61803 -1. 0 3.61803 -2.61803 1. 0 3.61803 -1.61803 -1.61803 -1.61803 3.61803 -1.61803 -1.61803 1.61803 3.61803 -1.61803 1.61803 -1.61803 3.61803 -1.61803 1.61803 1.61803 3.61803 1.61803 -1.61803 -1.61803 3.61803 1.61803 -1.61803 1.61803 3.61803 1.61803 1.61803 -1.61803 3.61803 1.61803 1.61803 1.61803 3.61803 2.61803 -1. 0 3.61803 2.61803 1. 0 4.23607 -1. -1. -1. 4.23607 -1. -1. 1. 4.23607 -1. 1. -1. 4.23607 -1. 1. 1. 4.23607 0 -1.61803 -0.618034 4.23607 0 -1.61803 0.618034 4.23607 0 1.61803 -0.618034 4.23607 0 1.61803 0.618034 4.23607 1. -1. -1. 4.23607 1. -1. 1. 4.23607 1. 1. -1. 4.23607 1. 1. 1. 4.23607 -0.618034 0 -1.61803 4.23607 -0.618034 0 1.61803 4.23607 0.618034 0 -1.61803 4.23607 0.618034 0 1.61803 4.23607 -1.61803 -0.618034 0 4.23607 -1.61803 0.618034 0 4.23607 1.61803 -0.618034 0 4.23607 1.61803 0.618034 0 5 0 84 60 36 382 5 0 290 26 368 382 5 0 354 226 221 382 5 1 85 61 37 383 5 1 291 27 369 383 5 1 355 227 222 383 5 2 86 62 38 384 5 2 290 26 370 384 5 2 356 228 223 384 5 2 356 354 0 290 5 3 87 63 39 385 5 3 291 27 371 385 5 3 357 229 224 385 5 3 357 355 1 291 5 4 96 80 28 380 5 4 280 8 350 380 5 4 372 220 258 380 5 5 97 81 29 381 5 5 97 96 4 372 5 5 281 9 351 381 5 5 372 220 259 381 5 6 98 82 30 386 5 6 282 10 352 386 5 6 373 225 260 386 5 7 99 83 31 387 5 7 99 98 6 373 5 7 283 11 353 387 5 7 373 225 261 387 5 12 88 68 40 390 5 12 88 84 0 354 5 12 292 48 400 390 5 12 354 226 231 390 5 13 89 69 41 391 5 13 89 85 1 355 5 13 293 49 401 391 5 13 355 227 232 391 5 14 90 70 42 392 5 14 90 86 2 356 5 14 292 48 402 392 5 14 356 228 233 392 5 14 356 354 12 292 5 15 91 71 43 393 5 15 91 87 3 357 5 15 293 49 403 393 5 15 357 229 234 393 5 15 357 355 13 293 5 16 100 108 50 388 5 16 280 8 358 388 5 16 374 230 262 388 5 16 374 372 4 280 5 17 101 100 16 374 5 17 101 109 51 389 5 17 281 9 359 389 5 17 374 230 263 389 5 17 374 372 5 281 5 18 102 110 52 394 5 18 282 10 360 394 5 18 375 235 264 394 5 18 375 373 6 282 5 19 103 102 18 375 5 19 103 111 53 395 5 19 283 11 361 395 5 19 375 235 265 395 5 19 375 373 7 283 5 20 72 76 32 364 5 20 284 24 376 364 5 20 362 236 254 364 5 21 73 77 33 365 5 21 284 24 377 365 5 21 363 237 255 365 5 21 363 362 20 284 5 22 74 72 20 362 5 22 74 78 34 366 5 22 285 25 378 366 5 22 362 236 256 366 5 23 75 73 21 363 5 23 75 79 35 367 5 23 285 25 379 367 5 23 363 237 257 367 5 23 363 362 22 285 5 26 92 76 32 368 5 26 92 78 34 370 5 27 93 77 33 369 5 27 93 79 35 371 5 28 380 350 36 286 5 29 381 351 37 287 5 30 386 352 38 288 5 31 387 353 39 289 5 32 364 376 28 286 5 33 365 377 29 287 5 34 366 378 30 288 5 35 367 379 31 289 5 36 382 368 32 286 5 37 383 369 33 287 5 38 384 370 34 288 5 39 385 371 35 289 5 40 390 400 44 294 5 41 391 401 45 295 5 42 392 402 46 296 5 43 393 403 47 297 5 44 404 396 50 294 5 45 405 397 51 295 5 46 406 398 52 296 5 47 407 399 53 297 5 48 104 112 44 400 5 48 104 114 46 402 5 49 105 113 45 401 5 49 105 115 47 403 5 50 388 358 40 294 5 51 389 359 41 295 5 52 394 360 42 296 5 53 395 361 43 297 5 56 116 112 44 404 5 56 298 54 396 404 5 56 408 278 266 404 5 57 117 113 45 405 5 57 298 54 397 405 5 57 409 279 267 405 5 57 409 408 56 298 5 58 118 114 46 406 5 58 118 116 56 408 5 58 299 55 398 406 5 58 408 278 268 406 5 59 119 115 47 407 5 59 119 117 57 409 5 59 299 55 399 407 5 59 409 279 269 407 5 59 409 408 58 299 5 60 64 8 350 36 5 60 64 128 410 156 5 61 65 9 351 37 5 61 65 129 411 157 5 62 66 10 352 38 5 62 66 130 412 158 5 63 67 11 353 39 5 63 67 131 413 159 5 68 64 8 358 40 5 68 64 128 418 160 5 68 88 84 60 64 5 69 65 9 359 41 5 69 65 129 419 161 5 69 89 85 61 65 5 70 66 10 360 42 5 70 66 130 420 162 5 70 90 86 62 66 5 71 67 11 361 43 5 71 67 131 421 163 5 71 91 87 63 67 5 78 74 72 76 92 5 79 75 73 77 93 5 80 94 24 376 28 5 80 94 144 436 148 5 81 94 24 377 29 5 81 94 144 437 149 5 81 97 96 80 94 5 82 95 25 378 30 5 82 95 145 438 150 5 83 95 25 379 31 5 83 95 145 439 151 5 83 99 98 82 95 5 108 106 54 396 50 5 108 106 174 456 170 5 109 101 100 108 106 5 109 106 54 397 51 5 109 106 174 457 171 5 110 107 55 398 52 5 110 107 175 458 172 5 111 103 102 110 107 5 111 107 55 399 53 5 111 107 175 459 173 5 114 118 116 112 104 5 115 119 117 113 105 5 120 84 60 156 442 5 120 310 146 428 442 5 120 310 290 0 84 5 120 414 506 501 442 5 121 85 61 157 443 5 121 311 147 429 443 5 121 311 291 1 85 5 121 415 507 502 443 5 122 86 62 158 444 5 122 310 146 430 444 5 122 310 290 2 86 5 122 416 414 120 310 5 122 416 508 503 444 5 123 87 63 159 445 5 123 311 147 431 445 5 123 311 291 3 87 5 123 417 415 121 311 5 123 417 509 504 445 5 124 96 80 148 440 5 124 300 128 410 440 5 124 300 280 4 96 5 124 432 500 538 440 5 125 97 81 149 441 5 125 97 96 124 432 5 125 301 129 411 441 5 125 301 281 5 97 5 125 432 500 539 441 5 126 98 82 150 446 5 126 302 130 412 446 5 126 302 282 6 98 5 126 433 505 540 446 5 127 99 83 151 447 5 127 99 98 126 433 5 127 303 131 413 447 5 127 303 283 7 99 5 127 433 505 541 447 5 128 300 280 8 64 5 129 301 281 9 65 5 130 302 282 10 66 5 131 303 283 11 67 5 132 88 68 160 450 5 132 88 84 120 414 5 132 312 168 460 450 5 132 312 292 12 88 5 132 414 506 511 450 5 133 89 69 161 451 5 133 89 85 121 415 5 133 313 169 461 451 5 133 313 293 13 89 5 133 415 507 512 451 5 134 90 70 162 452 5 134 90 86 122 416 5 134 312 168 462 452 5 134 312 292 14 90 5 134 416 414 132 312 5 134 416 508 513 452 5 135 91 71 163 453 5 135 91 87 123 417 5 135 313 169 463 453 5 135 313 293 15 91 5 135 417 415 133 313 5 135 417 509 514 453 5 136 100 108 170 448 5 136 300 128 418 448 5 136 300 280 16 100 5 136 434 432 124 300 5 136 434 510 542 448 5 137 101 100 136 434 5 137 101 109 171 449 5 137 301 129 419 449 5 137 301 281 17 101 5 137 434 432 125 301 5 137 434 510 543 449 5 138 102 110 172 454 5 138 302 130 420 454 5 138 302 282 18 102 5 138 435 433 126 302 5 138 435 515 544 454 5 139 103 102 138 435 5 139 103 111 173 455 5 139 303 131 421 455 5 139 303 283 19 103 5 139 435 433 127 303 5 139 435 515 545 455 5 140 72 76 152 424 5 140 304 144 436 424 5 140 304 284 20 72 5 140 422 516 534 424 5 141 73 77 153 425 5 141 304 144 437 425 5 141 304 284 21 73 5 141 423 422 140 304 5 141 423 517 535 425 5 142 74 72 140 422 5 142 74 78 154 426 5 142 305 145 438 426 5 142 305 285 22 74 5 142 422 516 536 426 5 143 75 73 141 423 5 143 75 79 155 427 5 143 305 145 439 427 5 143 305 285 23 75 5 143 423 422 142 305 5 143 423 517 537 427 5 144 304 284 24 94 5 145 305 285 25 95 5 146 92 76 152 428 5 146 92 78 154 430 5 146 310 290 26 92 5 147 93 77 153 429 5 147 93 79 155 431 5 147 311 291 27 93 5 148 306 286 28 80 5 148 440 410 156 306 5 149 307 287 29 81 5 149 441 411 157 307 5 150 308 288 30 82 5 150 446 412 158 308 5 151 309 289 31 83 5 151 447 413 159 309 5 152 306 286 32 76 5 152 424 436 148 306 5 153 307 287 33 77 5 153 425 437 149 307 5 154 308 288 34 78 5 154 426 438 150 308 5 155 309 289 35 79 5 155 427 439 151 309 5 156 306 286 36 60 5 156 442 428 152 306 5 157 307 287 37 61 5 157 443 429 153 307 5 158 308 288 38 62 5 158 444 430 154 308 5 159 309 289 39 63 5 159 445 431 155 309 5 160 314 294 40 68 5 160 450 460 164 314 5 161 315 295 41 69 5 161 451 461 165 315 5 162 316 296 42 70 5 162 452 462 166 316 5 163 317 297 43 71 5 163 453 463 167 317 5 164 314 294 44 112 5 164 464 456 170 314 5 165 315 295 45 113 5 165 465 457 171 315 5 166 316 296 46 114 5 166 466 458 172 316 5 167 317 297 47 115 5 167 467 459 173 317 5 168 104 112 164 460 5 168 104 114 166 462 5 168 312 292 48 104 5 169 105 113 165 461 5 169 105 115 167 463 5 169 313 293 49 105 5 170 314 294 50 108 5 170 448 418 160 314 5 171 315 295 51 109 5 171 449 419 161 315 5 172 316 296 52 110 5 172 454 420 162 316 5 173 317 297 53 111 5 173 455 421 163 317 5 174 318 298 54 106 5 175 319 299 55 107 5 176 116 112 164 464 5 176 318 174 456 464 5 176 318 298 56 116 5 176 468 558 546 464 5 177 117 113 165 465 5 177 318 174 457 465 5 177 318 298 57 117 5 177 469 468 176 318 5 177 469 559 547 465 5 178 118 114 166 466 5 178 118 116 176 468 5 178 319 175 458 466 5 178 319 299 58 118 5 178 468 558 548 466 5 179 119 115 167 467 5 179 119 117 177 469 5 179 319 175 459 467 5 179 319 299 59 119 5 179 469 468 178 319 5 179 469 559 549 467 5 180 184 202 320 210 5 180 192 200 337 210 5 180 196 208 332 210 5 181 185 184 180 196 5 181 185 203 321 211 5 181 193 201 338 211 5 181 196 208 333 211 5 182 186 204 322 212 5 182 192 200 339 212 5 182 197 196 180 192 5 182 197 209 334 212 5 183 187 186 182 197 5 183 187 205 323 213 5 183 193 201 340 213 5 183 197 196 181 193 5 183 197 209 335 213 5 188 184 202 328 214 5 188 194 192 180 184 5 188 194 206 341 214 5 188 198 218 346 214 5 189 185 184 188 198 5 189 185 203 329 215 5 189 195 193 181 185 5 189 195 207 342 215 5 189 198 218 347 215 5 190 186 204 330 216 5 190 194 192 182 186 5 190 194 206 343 216 5 190 199 198 188 194 5 190 199 219 348 216 5 191 187 186 190 199 5 191 187 205 331 217 5 191 195 193 183 187 5 191 195 207 344 217 5 191 199 198 189 195 5 191 199 219 349 217 5 202 326 220 258 320 5 202 326 230 262 328 5 203 185 184 202 326 5 203 326 220 259 321 5 203 326 230 263 329 5 204 327 225 260 322 5 204 327 235 264 330 5 205 187 186 204 327 5 205 327 225 261 323 5 205 327 235 265 331 5 206 194 192 200 324 5 207 195 193 201 325 5 209 197 196 208 336 5 219 199 198 218 345 5 221 382 36 350 246 5 222 383 37 351 247 5 223 384 38 352 248 5 224 385 39 353 249 5 226 324 200 337 221 5 226 324 206 341 231 5 227 325 201 338 222 5 227 325 207 342 232 5 228 324 200 339 223 5 228 324 206 343 233 5 228 356 354 226 324 5 229 325 201 340 224 5 229 325 207 344 234 5 229 357 355 227 325 5 230 374 372 220 326 5 231 250 246 221 226 5 231 390 40 358 250 5 232 251 247 222 227 5 232 391 41 359 251 5 233 252 248 223 228 5 233 392 42 360 252 5 234 253 249 224 229 5 234 393 43 361 253 5 235 375 373 225 327 5 236 336 208 332 254 5 236 336 209 334 256 5 237 336 208 333 255 5 237 336 209 335 257 5 237 363 362 236 336 5 254 364 32 368 240 5 255 365 33 369 241 5 256 242 240 254 236 5 256 366 34 370 242 5 257 243 241 255 237 5 257 367 35 371 243 5 258 380 28 376 238 5 259 239 238 258 220 5 259 381 29 377 239 5 260 386 30 378 244 5 261 245 244 260 225 5 261 387 31 379 245 5 262 388 50 396 270 5 263 271 270 262 230 5 263 389 51 397 271 5 264 394 52 398 276 5 265 277 276 264 235 5 265 395 53 399 277 5 266 404 44 400 272 5 267 405 45 401 273 5 268 274 272 266 278 5 268 406 46 402 274 5 269 275 273 267 279 5 269 407 47 403 275 5 278 345 218 346 266 5 278 345 219 348 268 5 279 345 218 347 267 5 279 345 219 349 269 5 279 409 408 278 345 5 320 210 337 221 246 5 321 211 338 222 247 5 322 212 339 223 248 5 323 213 340 224 249 5 328 214 341 231 250 5 328 250 246 320 202 5 329 215 342 232 251 5 329 251 247 321 203 5 330 216 343 233 252 5 330 252 248 322 204 5 331 217 344 234 253 5 331 253 249 323 205 5 332 210 320 258 238 5 333 211 321 259 239 5 333 239 238 332 208 5 334 212 322 260 244 5 335 213 323 261 245 5 335 245 244 334 209 5 337 210 332 254 240 5 338 211 333 255 241 5 339 212 334 256 242 5 339 242 240 337 200 5 340 213 335 257 243 5 340 243 241 338 201 5 341 214 346 266 272 5 342 215 347 267 273 5 343 216 348 268 274 5 343 274 272 341 206 5 344 217 349 269 275 5 344 275 273 342 207 5 346 214 328 262 270 5 347 215 329 263 271 5 347 271 270 346 218 5 348 216 330 264 276 5 349 217 331 265 277 5 349 277 276 348 219 5 350 380 258 320 246 5 351 381 259 321 247 5 352 386 260 322 248 5 353 387 261 323 249 5 358 250 246 350 8 5 358 388 262 328 250 5 359 251 247 351 9 5 359 389 263 329 251 5 360 252 248 352 10 5 360 394 264 330 252 5 361 253 249 353 11 5 361 395 265 331 253 5 368 382 221 337 240 5 369 383 222 338 241 5 370 242 240 368 26 5 370 384 223 339 242 5 371 243 241 369 27 5 371 385 224 340 243 5 376 364 254 332 238 5 377 239 238 376 24 5 377 365 255 333 239 5 378 366 256 334 244 5 379 245 244 378 25 5 379 367 257 335 245 5 396 404 266 346 270 5 397 271 270 396 54 5 397 405 267 347 271 5 398 406 268 348 276 5 399 277 276 398 55 5 399 407 269 349 277 5 400 390 231 341 272 5 401 391 232 342 273 5 402 274 272 400 48 5 402 392 233 343 274 5 403 275 273 401 49 5 403 393 234 344 275 5 410 440 538 470 526 5 411 441 539 471 527 5 412 446 540 472 528 5 413 447 541 473 529 5 418 448 542 478 530 5 418 530 526 410 128 5 419 449 543 479 531 5 419 531 527 411 129 5 420 454 544 480 532 5 420 532 528 412 130 5 421 455 545 481 533 5 421 533 529 413 131 5 428 442 501 487 520 5 429 443 502 488 521 5 430 444 503 489 522 5 430 522 520 428 146 5 431 445 504 490 523 5 431 523 521 429 147 5 436 424 534 482 518 5 437 425 535 483 519 5 437 519 518 436 144 5 438 426 536 484 524 5 439 427 537 485 525 5 439 525 524 438 145 5 456 464 546 496 550 5 457 465 547 497 551 5 457 551 550 456 174 5 458 466 548 498 556 5 459 467 549 499 557 5 459 557 556 458 175 5 460 450 511 491 552 5 461 451 512 492 553 5 462 452 513 493 554 5 462 554 552 460 168 5 463 453 514 494 555 5 463 555 553 461 169 5 470 570 487 501 526 5 471 571 488 502 527 5 472 572 489 503 528 5 473 573 490 504 529 5 478 530 526 470 562 5 478 574 491 511 530 5 479 531 527 471 563 5 479 575 492 512 531 5 480 532 528 472 564 5 480 576 493 513 532 5 481 533 529 473 565 5 481 577 494 514 533 5 482 570 470 538 518 5 483 519 518 482 568 5 483 571 471 539 519 5 484 572 472 540 524 5 485 525 524 484 569 5 485 573 473 541 525 5 487 570 482 534 520 5 488 571 483 535 521 5 489 522 520 487 560 5 489 572 484 536 522 5 490 523 521 488 561 5 490 573 485 537 523 5 491 574 496 546 552 5 492 575 497 547 553 5 493 554 552 491 566 5 493 576 498 548 554 5 494 555 553 492 567 5 494 577 499 549 555 5 496 574 478 542 550 5 497 551 550 496 578 5 497 575 479 543 551 5 498 576 480 544 556 5 499 557 556 498 579 5 499 577 481 545 557 5 501 442 156 410 526 5 502 443 157 411 527 5 503 444 158 412 528 5 504 445 159 413 529 5 506 474 560 487 501 5 506 474 566 491 511 5 507 475 561 488 502 5 507 475 567 492 512 5 508 416 414 506 474 5 508 474 560 489 503 5 508 474 566 493 513 5 509 417 415 507 475 5 509 475 561 490 504 5 509 475 567 494 514 5 510 434 432 500 476 5 511 450 160 418 530 5 511 530 526 501 506 5 512 451 161 419 531 5 512 531 527 502 507 5 513 452 162 420 532 5 513 532 528 503 508 5 514 453 163 421 533 5 514 533 529 504 509 5 515 435 433 505 477 5 516 486 568 482 534 5 516 486 569 484 536 5 517 423 422 516 486 5 517 486 568 483 535 5 517 486 569 485 537 5 534 424 152 428 520 5 535 425 153 429 521 5 536 426 154 430 522 5 536 522 520 534 516 5 537 427 155 431 523 5 537 523 521 535 517 5 538 440 148 436 518 5 539 441 149 437 519 5 539 519 518 538 500 5 540 446 150 438 524 5 541 447 151 439 525 5 541 525 524 540 505 5 542 448 170 456 550 5 543 449 171 457 551 5 543 551 550 542 510 5 544 454 172 458 556 5 545 455 173 459 557 5 545 557 556 544 515 5 546 464 164 460 552 5 547 465 165 461 553 5 548 466 166 462 554 5 548 554 552 546 558 5 549 467 167 463 555 5 549 555 553 547 559 5 558 495 578 496 546 5 558 495 579 498 548 5 559 469 468 558 495 5 559 495 578 497 547 5 559 495 579 499 549 5 562 476 500 538 470 5 562 476 510 542 478 5 563 476 500 539 471 5 563 476 510 543 479 5 563 585 584 562 476 5 564 477 505 540 472 5 564 477 515 544 480 5 565 477 505 541 473 5 565 477 515 545 481 5 565 587 586 564 477 5 566 594 592 560 474 5 567 595 593 561 475 5 569 597 596 568 486 5 579 599 598 578 495 5 580 584 562 470 570 5 580 592 560 487 570 5 580 596 568 482 570 5 581 585 563 471 571 5 581 585 584 580 596 5 581 593 561 488 571 5 581 596 568 483 571 5 582 586 564 472 572 5 582 592 560 489 572 5 582 597 569 484 572 5 582 597 596 580 592 5 583 587 565 473 573 5 583 587 586 582 597 5 583 593 561 490 573 5 583 597 569 485 573 5 583 597 596 581 593 5 588 584 562 478 574 5 588 594 566 491 574 5 588 594 592 580 584 5 588 598 578 496 574 5 589 585 563 479 575 5 589 585 584 588 598 5 589 595 567 492 575 5 589 595 593 581 585 5 589 598 578 497 575 5 590 586 564 480 576 5 590 594 566 493 576 5 590 594 592 582 586 5 590 599 579 498 576 5 590 599 598 588 594 5 591 587 565 481 577 5 591 587 586 590 599 5 591 595 567 494 577 5 591 595 593 583 587 5 591 599 579 499 577 5 591 599 598 589 595 geomview-1.9.5/data/geom/spherical/flattorus.mesh0000644000175000017500000003301612310110172016773 000000000000004uvMESH 16 16 0 0.7071067811865475 0 0.7071067811865475 0 0.7071067811865475 0.2705980500730984 0.6532814824381882 0 0.7071067811865475 0.5 0.5 0 0.7071067811865475 0.6532814824381882 0.2705980500730984 0 0.7071067811865475 0.7071067811865475 0 0 0.7071067811865475 0.6532814824381882 -0.2705980500730984 0 0.7071067811865475 0.5 -0.5 0 0.7071067811865475 0.2705980500730985 -0.6532814824381882 0 0.7071067811865475 0 -0.7071067811865475 0 0.7071067811865475 -0.2705980500730984 -0.6532814824381882 0 0.7071067811865475 -0.5 -0.5 0 0.7071067811865475 -0.653281482438188 -0.2705980500730989 0 0.7071067811865475 -0.7071067811865475 0 0 0.7071067811865475 -0.6532814824381882 0.2705980500730986 0 0.7071067811865475 -0.5 0.5 0 0.7071067811865475 -0.2705980500730989 0.653281482438188 0.2705980500730984 0.6532814824381882 0 0.7071067811865475 0.2705980500730984 0.6532814824381882 0.2705980500730984 0.6532814824381882 0.2705980500730984 0.6532814824381882 0.5 0.5 0.2705980500730984 0.6532814824381882 0.6532814824381882 0.2705980500730984 0.2705980500730984 0.6532814824381882 0.7071067811865475 0 0.2705980500730984 0.6532814824381882 0.6532814824381882 -0.2705980500730984 0.2705980500730984 0.6532814824381882 0.5 -0.5 0.2705980500730984 0.6532814824381882 0.2705980500730985 -0.6532814824381882 0.2705980500730984 0.6532814824381882 0 -0.7071067811865475 0.2705980500730984 0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.2705980500730984 0.6532814824381882 -0.5 -0.5 0.2705980500730984 0.6532814824381882 -0.653281482438188 -0.2705980500730989 0.2705980500730984 0.6532814824381882 -0.7071067811865475 0 0.2705980500730984 0.6532814824381882 -0.6532814824381882 0.2705980500730986 0.2705980500730984 0.6532814824381882 -0.5 0.5 0.2705980500730984 0.6532814824381882 -0.2705980500730989 0.653281482438188 0.5 0.5 0 0.7071067811865475 0.5 0.5 0.2705980500730984 0.6532814824381882 0.5 0.5 0.5 0.5 0.5 0.5 0.6532814824381882 0.2705980500730984 0.5 0.5 0.7071067811865475 0 0.5 0.5 0.6532814824381882 -0.2705980500730984 0.5 0.5 0.5 -0.5 0.5 0.5 0.2705980500730985 -0.6532814824381882 0.5 0.5 0 -0.7071067811865475 0.5 0.5 -0.2705980500730984 -0.6532814824381882 0.5 0.5 -0.5 -0.5 0.5 0.5 -0.653281482438188 -0.2705980500730989 0.5 0.5 -0.7071067811865475 0 0.5 0.5 -0.6532814824381882 0.2705980500730986 0.5 0.5 -0.5 0.5 0.5 0.5 -0.2705980500730989 0.653281482438188 0.6532814824381882 0.2705980500730984 0 0.7071067811865475 0.6532814824381882 0.2705980500730984 0.2705980500730984 0.6532814824381882 0.6532814824381882 0.2705980500730984 0.5 0.5 0.6532814824381882 0.2705980500730984 0.6532814824381882 0.2705980500730984 0.6532814824381882 0.2705980500730984 0.7071067811865475 0 0.6532814824381882 0.2705980500730984 0.6532814824381882 -0.2705980500730984 0.6532814824381882 0.2705980500730984 0.5 -0.5 0.6532814824381882 0.2705980500730984 0.2705980500730985 -0.6532814824381882 0.6532814824381882 0.2705980500730984 0 -0.7071067811865475 0.6532814824381882 0.2705980500730984 -0.2705980500730984 -0.6532814824381882 0.6532814824381882 0.2705980500730984 -0.5 -0.5 0.6532814824381882 0.2705980500730984 -0.653281482438188 -0.2705980500730989 0.6532814824381882 0.2705980500730984 -0.7071067811865475 0 0.6532814824381882 0.2705980500730984 -0.6532814824381882 0.2705980500730986 0.6532814824381882 0.2705980500730984 -0.5 0.5 0.6532814824381882 0.2705980500730984 -0.2705980500730989 0.653281482438188 0.7071067811865475 0 0 0.7071067811865475 0.7071067811865475 0 0.2705980500730984 0.6532814824381882 0.7071067811865475 0 0.5 0.5 0.7071067811865475 0 0.6532814824381882 0.2705980500730984 0.7071067811865475 0 0.7071067811865475 0 0.7071067811865475 0 0.6532814824381882 -0.2705980500730984 0.7071067811865475 0 0.5 -0.5 0.7071067811865475 0 0.2705980500730985 -0.6532814824381882 0.7071067811865475 0 0 -0.7071067811865475 0.7071067811865475 0 -0.2705980500730984 -0.6532814824381882 0.7071067811865475 0 -0.5 -0.5 0.7071067811865475 0 -0.653281482438188 -0.2705980500730989 0.7071067811865475 0 -0.7071067811865475 0 0.7071067811865475 0 -0.6532814824381882 0.2705980500730986 0.7071067811865475 0 -0.5 0.5 0.7071067811865475 0 -0.2705980500730989 0.653281482438188 0.6532814824381882 -0.2705980500730984 0 0.7071067811865475 0.6532814824381882 -0.2705980500730984 0.2705980500730984 0.6532814824381882 0.6532814824381882 -0.2705980500730984 0.5 0.5 0.6532814824381882 -0.2705980500730984 0.6532814824381882 0.2705980500730984 0.6532814824381882 -0.2705980500730984 0.7071067811865475 0 0.6532814824381882 -0.2705980500730984 0.6532814824381882 -0.2705980500730984 0.6532814824381882 -0.2705980500730984 0.5 -0.5 0.6532814824381882 -0.2705980500730984 0.2705980500730985 -0.6532814824381882 0.6532814824381882 -0.2705980500730984 0 -0.7071067811865475 0.6532814824381882 -0.2705980500730984 -0.2705980500730984 -0.6532814824381882 0.6532814824381882 -0.2705980500730984 -0.5 -0.5 0.6532814824381882 -0.2705980500730984 -0.653281482438188 -0.2705980500730989 0.6532814824381882 -0.2705980500730984 -0.7071067811865475 0 0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.2705980500730986 0.6532814824381882 -0.2705980500730984 -0.5 0.5 0.6532814824381882 -0.2705980500730984 -0.2705980500730989 0.653281482438188 0.5 -0.5 0 0.7071067811865475 0.5 -0.5 0.2705980500730984 0.6532814824381882 0.5 -0.5 0.5 0.5 0.5 -0.5 0.6532814824381882 0.2705980500730984 0.5 -0.5 0.7071067811865475 0 0.5 -0.5 0.6532814824381882 -0.2705980500730984 0.5 -0.5 0.5 -0.5 0.5 -0.5 0.2705980500730985 -0.6532814824381882 0.5 -0.5 0 -0.7071067811865475 0.5 -0.5 -0.2705980500730984 -0.6532814824381882 0.5 -0.5 -0.5 -0.5 0.5 -0.5 -0.653281482438188 -0.2705980500730989 0.5 -0.5 -0.7071067811865475 0 0.5 -0.5 -0.6532814824381882 0.2705980500730986 0.5 -0.5 -0.5 0.5 0.5 -0.5 -0.2705980500730989 0.653281482438188 0.2705980500730985 -0.6532814824381882 0 0.7071067811865475 0.2705980500730985 -0.6532814824381882 0.2705980500730984 0.6532814824381882 0.2705980500730985 -0.6532814824381882 0.5 0.5 0.2705980500730985 -0.6532814824381882 0.6532814824381882 0.2705980500730984 0.2705980500730985 -0.6532814824381882 0.7071067811865475 0 0.2705980500730985 -0.6532814824381882 0.6532814824381882 -0.2705980500730984 0.2705980500730985 -0.6532814824381882 0.5 -0.5 0.2705980500730985 -0.6532814824381882 0.2705980500730985 -0.6532814824381882 0.2705980500730985 -0.6532814824381882 0 -0.7071067811865475 0.2705980500730985 -0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.2705980500730985 -0.6532814824381882 -0.5 -0.5 0.2705980500730985 -0.6532814824381882 -0.653281482438188 -0.2705980500730989 0.2705980500730985 -0.6532814824381882 -0.7071067811865475 0 0.2705980500730985 -0.6532814824381882 -0.6532814824381882 0.2705980500730986 0.2705980500730985 -0.6532814824381882 -0.5 0.5 0.2705980500730985 -0.6532814824381882 -0.2705980500730989 0.653281482438188 0 -0.7071067811865475 0 0.7071067811865475 0 -0.7071067811865475 0.2705980500730984 0.6532814824381882 0 -0.7071067811865475 0.5 0.5 0 -0.7071067811865475 0.6532814824381882 0.2705980500730984 0 -0.7071067811865475 0.7071067811865475 0 0 -0.7071067811865475 0.6532814824381882 -0.2705980500730984 0 -0.7071067811865475 0.5 -0.5 0 -0.7071067811865475 0.2705980500730985 -0.6532814824381882 0 -0.7071067811865475 0 -0.7071067811865475 0 -0.7071067811865475 -0.2705980500730984 -0.6532814824381882 0 -0.7071067811865475 -0.5 -0.5 0 -0.7071067811865475 -0.653281482438188 -0.2705980500730989 0 -0.7071067811865475 -0.7071067811865475 0 0 -0.7071067811865475 -0.6532814824381882 0.2705980500730986 0 -0.7071067811865475 -0.5 0.5 0 -0.7071067811865475 -0.2705980500730989 0.653281482438188 -0.2705980500730984 -0.6532814824381882 0 0.7071067811865475 -0.2705980500730984 -0.6532814824381882 0.2705980500730984 0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.5 0.5 -0.2705980500730984 -0.6532814824381882 0.6532814824381882 0.2705980500730984 -0.2705980500730984 -0.6532814824381882 0.7071067811865475 0 -0.2705980500730984 -0.6532814824381882 0.6532814824381882 -0.2705980500730984 -0.2705980500730984 -0.6532814824381882 0.5 -0.5 -0.2705980500730984 -0.6532814824381882 0.2705980500730985 -0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0 -0.7071067811865475 -0.2705980500730984 -0.6532814824381882 -0.2705980500730984 -0.6532814824381882 -0.2705980500730984 -0.6532814824381882 -0.5 -0.5 -0.2705980500730984 -0.6532814824381882 -0.653281482438188 -0.2705980500730989 -0.2705980500730984 -0.6532814824381882 -0.7071067811865475 0 -0.2705980500730984 -0.6532814824381882 -0.6532814824381882 0.2705980500730986 -0.2705980500730984 -0.6532814824381882 -0.5 0.5 -0.2705980500730984 -0.6532814824381882 -0.2705980500730989 0.653281482438188 -0.5 -0.5 0 0.7071067811865475 -0.5 -0.5 0.2705980500730984 0.6532814824381882 -0.5 -0.5 0.5 0.5 -0.5 -0.5 0.6532814824381882 0.2705980500730984 -0.5 -0.5 0.7071067811865475 0 -0.5 -0.5 0.6532814824381882 -0.2705980500730984 -0.5 -0.5 0.5 -0.5 -0.5 -0.5 0.2705980500730985 -0.6532814824381882 -0.5 -0.5 0 -0.7071067811865475 -0.5 -0.5 -0.2705980500730984 -0.6532814824381882 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.653281482438188 -0.2705980500730989 -0.5 -0.5 -0.7071067811865475 0 -0.5 -0.5 -0.6532814824381882 0.2705980500730986 -0.5 -0.5 -0.5 0.5 -0.5 -0.5 -0.2705980500730989 0.653281482438188 -0.653281482438188 -0.2705980500730989 0 0.7071067811865475 -0.653281482438188 -0.2705980500730989 0.2705980500730984 0.6532814824381882 -0.653281482438188 -0.2705980500730989 0.5 0.5 -0.653281482438188 -0.2705980500730989 0.6532814824381882 0.2705980500730984 -0.653281482438188 -0.2705980500730989 0.7071067811865475 0 -0.653281482438188 -0.2705980500730989 0.6532814824381882 -0.2705980500730984 -0.653281482438188 -0.2705980500730989 0.5 -0.5 -0.653281482438188 -0.2705980500730989 0.2705980500730985 -0.6532814824381882 -0.653281482438188 -0.2705980500730989 0 -0.7071067811865475 -0.653281482438188 -0.2705980500730989 -0.2705980500730984 -0.6532814824381882 -0.653281482438188 -0.2705980500730989 -0.5 -0.5 -0.653281482438188 -0.2705980500730989 -0.653281482438188 -0.2705980500730989 -0.653281482438188 -0.2705980500730989 -0.7071067811865475 0 -0.653281482438188 -0.2705980500730989 -0.6532814824381882 0.2705980500730986 -0.653281482438188 -0.2705980500730989 -0.5 0.5 -0.653281482438188 -0.2705980500730989 -0.2705980500730989 0.653281482438188 -0.7071067811865475 0 0 0.7071067811865475 -0.7071067811865475 0 0.2705980500730984 0.6532814824381882 -0.7071067811865475 0 0.5 0.5 -0.7071067811865475 0 0.6532814824381882 0.2705980500730984 -0.7071067811865475 0 0.7071067811865475 0 -0.7071067811865475 0 0.6532814824381882 -0.2705980500730984 -0.7071067811865475 0 0.5 -0.5 -0.7071067811865475 0 0.2705980500730985 -0.6532814824381882 -0.7071067811865475 0 0 -0.7071067811865475 -0.7071067811865475 0 -0.2705980500730984 -0.6532814824381882 -0.7071067811865475 0 -0.5 -0.5 -0.7071067811865475 0 -0.653281482438188 -0.2705980500730989 -0.7071067811865475 0 -0.7071067811865475 0 -0.7071067811865475 0 -0.6532814824381882 0.2705980500730986 -0.7071067811865475 0 -0.5 0.5 -0.7071067811865475 0 -0.2705980500730989 0.653281482438188 -0.6532814824381882 0.2705980500730986 0 0.7071067811865475 -0.6532814824381882 0.2705980500730986 0.2705980500730984 0.6532814824381882 -0.6532814824381882 0.2705980500730986 0.5 0.5 -0.6532814824381882 0.2705980500730986 0.6532814824381882 0.2705980500730984 -0.6532814824381882 0.2705980500730986 0.7071067811865475 0 -0.6532814824381882 0.2705980500730986 0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.2705980500730986 0.5 -0.5 -0.6532814824381882 0.2705980500730986 0.2705980500730985 -0.6532814824381882 -0.6532814824381882 0.2705980500730986 0 -0.7071067811865475 -0.6532814824381882 0.2705980500730986 -0.2705980500730984 -0.6532814824381882 -0.6532814824381882 0.2705980500730986 -0.5 -0.5 -0.6532814824381882 0.2705980500730986 -0.653281482438188 -0.2705980500730989 -0.6532814824381882 0.2705980500730986 -0.7071067811865475 0 -0.6532814824381882 0.2705980500730986 -0.6532814824381882 0.2705980500730986 -0.6532814824381882 0.2705980500730986 -0.5 0.5 -0.6532814824381882 0.2705980500730986 -0.2705980500730989 0.653281482438188 -0.5 0.5 0 0.7071067811865475 -0.5 0.5 0.2705980500730984 0.6532814824381882 -0.5 0.5 0.5 0.5 -0.5 0.5 0.6532814824381882 0.2705980500730984 -0.5 0.5 0.7071067811865475 0 -0.5 0.5 0.6532814824381882 -0.2705980500730984 -0.5 0.5 0.5 -0.5 -0.5 0.5 0.2705980500730985 -0.6532814824381882 -0.5 0.5 0 -0.7071067811865475 -0.5 0.5 -0.2705980500730984 -0.6532814824381882 -0.5 0.5 -0.5 -0.5 -0.5 0.5 -0.653281482438188 -0.2705980500730989 -0.5 0.5 -0.7071067811865475 0 -0.5 0.5 -0.6532814824381882 0.2705980500730986 -0.5 0.5 -0.5 0.5 -0.5 0.5 -0.2705980500730989 0.653281482438188 -0.2705980500730989 0.653281482438188 0 0.7071067811865475 -0.2705980500730989 0.653281482438188 0.2705980500730984 0.6532814824381882 -0.2705980500730989 0.653281482438188 0.5 0.5 -0.2705980500730989 0.653281482438188 0.6532814824381882 0.2705980500730984 -0.2705980500730989 0.653281482438188 0.7071067811865475 0 -0.2705980500730989 0.653281482438188 0.6532814824381882 -0.2705980500730984 -0.2705980500730989 0.653281482438188 0.5 -0.5 -0.2705980500730989 0.653281482438188 0.2705980500730985 -0.6532814824381882 -0.2705980500730989 0.653281482438188 0 -0.7071067811865475 -0.2705980500730989 0.653281482438188 -0.2705980500730984 -0.6532814824381882 -0.2705980500730989 0.653281482438188 -0.5 -0.5 -0.2705980500730989 0.653281482438188 -0.653281482438188 -0.2705980500730989 -0.2705980500730989 0.653281482438188 -0.7071067811865475 0 -0.2705980500730989 0.653281482438188 -0.6532814824381882 0.2705980500730986 -0.2705980500730989 0.653281482438188 -0.5 0.5 -0.2705980500730989 0.653281482438188 -0.2705980500730989 0.653281482438188 geomview-1.9.5/data/geom/spherical/hypercube.off0000644000175000017500000000153212310110172016552 000000000000004OFF 16 24 32 -1. -1. -1. -1. -1. -1. -1. 1. -1. -1. 1. -1. -1. -1. 1. 1. -1. 1. -1. -1. -1. 1. -1. 1. -1. 1. 1. -1. -1. 1. 1. 1. 1. -1. -1. -1. 1. -1. -1. 1. 1. -1. 1. -1. 1. -1. 1. 1. 1. 1. -1. -1. 1. 1. -1. 1. 1. 1. 1. -1. 1. 1. 1. 1. 4 0 1 3 2 200 100 200 4 0 1 5 4 100 200 200 4 0 1 9 8 200 000 200 4 0 2 6 4 200 100 200 4 0 2 10 8 000 000 000 4 0 4 12 8 100 000 000 4 1 3 7 5 200 000 000 4 1 3 11 9 000 100 000 4 1 5 13 9 100 100 000 4 2 3 7 6 200 100 000 4 2 3 11 10 000 200 000 4 2 6 14 10 100 200 000 4 3 7 15 11 200 200 000 4 4 5 7 6 000 000 100 4 4 5 13 12 100 000 100 4 4 6 14 12 200 000 100 4 5 7 15 13 000 100 100 4 6 7 15 14 100 100 100 4 8 9 11 10 200 100 100 4 8 9 13 12 000 200 100 4 8 10 14 12 100 200 100 4 9 11 15 13 200 200 100 4 10 11 15 14 000 000 200 4 12 13 15 14 100 000 200 geomview-1.9.5/data/geom/spherical/octaplex.off0000644000175000017500000000265612310110172016413 000000000000004OFF 24 96 96 -1. -1. 0 0 -1. 0 -1. 0 -1. 0 0 -1. -1. 0 0 1. -1. 0 1. 0 -1. 1. 0 0 0 -1. -1. 0 0 -1. 0 -1. 0 -1. 0 1. 0 -1. 1. 0 0 0 -1. -1. 0 0 -1. 1. 0 0 1. -1. 0 0 1. 1. 0 1. -1. 0 0 1. 0 -1. 0 1. 0 1. 0 1. 1. 0 1. -1. 0 0 1. 0 -1. 0 1. 0 0 -1. 1. 0 0 1. 1. 0 1. 0 1. 1. 0 0 3 0 1 2 3 0 1 3 3 0 2 4 3 0 3 4 3 0 6 7 3 0 6 8 3 0 7 9 3 0 8 9 3 1 2 5 3 1 3 5 3 1 6 10 3 1 6 11 3 1 10 14 3 1 11 14 3 2 4 5 3 2 7 10 3 2 7 12 3 2 10 15 3 2 12 15 3 3 4 5 3 3 8 11 3 3 8 13 3 3 11 16 3 3 13 16 3 4 9 12 3 4 9 13 3 4 12 17 3 4 13 17 3 5 14 15 3 5 14 16 3 5 15 17 3 5 16 17 3 6 7 18 3 6 8 18 3 6 10 19 3 6 11 19 3 7 9 18 3 7 10 20 3 7 12 20 3 8 9 18 3 8 11 21 3 8 13 21 3 9 12 22 3 9 13 22 3 10 14 19 3 10 15 20 3 11 14 19 3 11 16 21 3 12 15 20 3 12 17 22 3 13 16 21 3 13 17 22 3 14 15 23 3 14 16 23 3 15 17 23 3 16 17 23 3 18 19 20 3 18 19 21 3 18 20 22 3 18 21 22 3 19 20 23 3 19 21 23 3 20 22 23 3 21 22 23 3 0 1 6 3 0 2 7 3 0 3 8 3 0 4 9 3 1 2 10 3 1 3 11 3 1 5 14 3 2 4 12 3 2 5 15 3 3 4 13 3 3 5 16 3 4 5 17 3 6 7 10 3 6 8 11 3 6 18 19 3 7 9 12 3 7 18 20 3 8 9 13 3 8 18 21 3 9 18 22 3 10 14 15 3 10 19 20 3 11 14 16 3 11 19 21 3 12 15 17 3 12 20 22 3 13 16 17 3 13 21 22 3 14 19 23 3 15 20 23 3 16 21 23 3 17 22 23 geomview-1.9.5/data/geom/spherical/orthoplex.off0000644000175000017500000000052112310110172016605 000000000000004OFF 8 32 24 1 0 0 0 -1 0 0 0 0 1 0 0 0 -1 0 0 0 0 1 0 0 0 -1 0 0 0 0 1 0 0 0 -1 3 0 2 4 3 1 2 4 3 0 3 4 3 1 3 4 3 0 2 5 3 1 2 5 3 0 3 5 3 1 3 5 3 2 4 6 3 3 4 6 3 2 5 6 3 3 5 6 3 2 4 7 3 3 4 7 3 2 5 7 3 3 5 7 3 0 4 6 3 1 4 6 3 0 5 6 3 1 5 6 3 0 4 7 3 1 4 7 3 0 5 7 3 1 5 7 3 0 2 6 3 1 2 6 3 0 3 6 3 1 3 6 3 0 2 7 3 1 2 7 3 0 3 7 3 1 3 7 geomview-1.9.5/data/geom/spherical/ruledtorus.mesh0000644000175000017500000006551712310110172017173 000000000000004uvMESH 20 20 0.5877852522924732 0.809016994374947 0. 1. 0.809016994374947 0.5877852522924732 -0.3090169943749474 0.951056516295153 0.951056516295153 0.3090169943749474 -0.5877852522924732 0.809016994374947 1. 0. -0.809016994374947 0.5877852522924732 0.951056516295154 -0.3090169943749474 -0.951056516295153 0.3090169943749474 0.809016994374947 -0.587785252292473 -1. 0. 0.5877852522924733 -0.809016994374947 -0.951056516295154 -0.3090169943749474 0.3090169943749475 -0.951056516295153 -0.809016994374947 -0.587785252292473 0. -1. -0.5877852522924733 -0.809016994374947 -0.3090169943749477 -0.951056516295153 -0.3090169943749475 -0.951056516295153 -0.587785252292473 -0.809016994374947 0. -1. -0.809016994374947 -0.5877852522924733 0.3090169943749477 -0.951056516295153 -0.951056516295153 -0.3090169943749475 0.587785252292473 -0.809016994374947 -1. 0. 0.809016994374947 -0.5877852522924733 -0.951056516295154 0.3090169943749472 0.951056516295153 -0.3090169943749475 -0.809016994374948 0.587785252292473 1. 0. -0.5877852522924734 0.809016994374947 0.951056516295154 0.3090169943749472 -0.3090169943749476 0.951056516295153 0.809016994374948 0.587785252292473 0. 1. 0.5877852522924734 0.809016994374947 0.3090169943749472 0.951056516295154 0.3090169943749476 0.951056516295153 0.809016994374947 0.5877852522924732 0.3090169943749474 0.951056516295153 0.951056516295153 0.3090169943749474 0. 1. 1. 0. -0.3090169943749474 0.951056516295153 0.951056516295154 -0.3090169943749474 -0.5877852522924732 0.809016994374947 0.809016994374947 -0.587785252292473 -0.809016994374947 0.5877852522924732 0.5877852522924733 -0.809016994374947 -0.951056516295153 0.3090169943749474 0.3090169943749475 -0.951056516295153 -1. 0. 0. -1. -0.951056516295154 -0.3090169943749474 -0.3090169943749477 -0.951056516295153 -0.809016994374947 -0.587785252292473 -0.587785252292473 -0.809016994374947 -0.5877852522924733 -0.809016994374947 -0.809016994374947 -0.5877852522924733 -0.3090169943749475 -0.951056516295153 -0.951056516295153 -0.3090169943749475 0. -1. -1. 0. 0.3090169943749477 -0.951056516295153 -0.951056516295154 0.3090169943749472 0.587785252292473 -0.809016994374947 -0.809016994374948 0.587785252292473 0.809016994374947 -0.5877852522924733 -0.5877852522924734 0.809016994374947 0.951056516295153 -0.3090169943749475 -0.3090169943749476 0.951056516295153 1. 0. 0. 1. 0.951056516295154 0.3090169943749472 0.3090169943749472 0.951056516295154 0.809016994374948 0.587785252292473 0.5877852522924736 0.809016994374947 0.5877852522924734 0.809016994374947 0.951056516295153 0.3090169943749474 0.5877852522924732 0.809016994374947 1. 0. 0.3090169943749474 0.951056516295153 0.951056516295154 -0.3090169943749474 0. 1. 0.809016994374947 -0.587785252292473 -0.3090169943749474 0.951056516295153 0.5877852522924733 -0.809016994374947 -0.5877852522924732 0.809016994374947 0.3090169943749475 -0.951056516295153 -0.809016994374947 0.5877852522924732 0. -1. -0.951056516295153 0.3090169943749474 -0.3090169943749477 -0.951056516295153 -1. 0. -0.587785252292473 -0.809016994374947 -0.951056516295154 -0.3090169943749474 -0.809016994374947 -0.5877852522924733 -0.809016994374947 -0.587785252292473 -0.951056516295153 -0.3090169943749475 -0.5877852522924733 -0.809016994374947 -1. 0. -0.3090169943749475 -0.951056516295153 -0.951056516295154 0.3090169943749472 0. -1. -0.809016994374948 0.587785252292473 0.3090169943749477 -0.951056516295153 -0.5877852522924734 0.809016994374947 0.587785252292473 -0.809016994374947 -0.3090169943749476 0.951056516295153 0.809016994374947 -0.5877852522924733 0. 1. 0.951056516295153 -0.3090169943749475 0.3090169943749472 0.951056516295154 1. 0. 0.5877852522924736 0.809016994374947 0.951056516295154 0.3090169943749472 0.809016994374947 0.5877852522924741 0.809016994374948 0.587785252292473 1. 0. 0.809016994374947 0.5877852522924732 0.951056516295154 -0.3090169943749474 0.5877852522924732 0.809016994374947 0.809016994374947 -0.587785252292473 0.3090169943749474 0.951056516295153 0.5877852522924733 -0.809016994374947 0. 1. 0.3090169943749475 -0.951056516295153 -0.3090169943749474 0.951056516295153 0. -1. -0.5877852522924732 0.809016994374947 -0.3090169943749477 -0.951056516295153 -0.809016994374947 0.5877852522924732 -0.587785252292473 -0.809016994374947 -0.951056516295153 0.3090169943749474 -0.809016994374947 -0.5877852522924733 -1. 0. -0.951056516295153 -0.3090169943749475 -0.951056516295154 -0.3090169943749474 -1. 0. -0.809016994374947 -0.587785252292473 -0.951056516295154 0.3090169943749472 -0.5877852522924733 -0.809016994374947 -0.809016994374948 0.587785252292473 -0.3090169943749475 -0.951056516295153 -0.5877852522924734 0.809016994374947 0. -1. -0.3090169943749476 0.951056516295153 0.3090169943749477 -0.951056516295153 0. 1. 0.587785252292473 -0.809016994374947 0.3090169943749472 0.951056516295154 0.809016994374947 -0.5877852522924733 0.5877852522924736 0.809016994374947 0.951056516295153 -0.3090169943749475 0.809016994374947 0.5877852522924741 1. 0. 0.951056516295153 0.3090169943749477 0.951056516295154 0.3090169943749472 0.951056516295154 -0.3090169943749474 0.951056516295153 0.3090169943749474 0.809016994374947 -0.587785252292473 0.809016994374947 0.5877852522924732 0.5877852522924733 -0.809016994374947 0.5877852522924732 0.809016994374947 0.3090169943749475 -0.951056516295153 0.3090169943749474 0.951056516295153 0. -1. 0. 1. -0.3090169943749477 -0.951056516295153 -0.3090169943749474 0.951056516295153 -0.587785252292473 -0.809016994374947 -0.5877852522924732 0.809016994374947 -0.809016994374947 -0.5877852522924733 -0.809016994374947 0.5877852522924732 -0.951056516295153 -0.3090169943749475 -0.951056516295153 0.3090169943749474 -1. 0. -1. 0. -0.951056516295154 0.3090169943749472 -0.951056516295154 -0.3090169943749474 -0.809016994374948 0.587785252292473 -0.809016994374947 -0.587785252292473 -0.5877852522924734 0.809016994374947 -0.5877852522924733 -0.809016994374947 -0.3090169943749476 0.951056516295153 -0.3090169943749475 -0.951056516295153 0. 1. 0. -1. 0.3090169943749472 0.951056516295154 0.3090169943749477 -0.951056516295153 0.5877852522924736 0.809016994374947 0.587785252292473 -0.809016994374947 0.809016994374947 0.5877852522924741 0.809016994374947 -0.5877852522924733 0.951056516295153 0.3090169943749477 0.951056516295153 -0.3090169943749475 1. 0. 1. 0. 0.809016994374947 -0.587785252292473 1. 0. 0.5877852522924733 -0.809016994374947 0.951056516295153 0.3090169943749474 0.3090169943749475 -0.951056516295153 0.809016994374947 0.5877852522924732 0. -1. 0.5877852522924732 0.809016994374947 -0.3090169943749477 -0.951056516295153 0.3090169943749474 0.951056516295153 -0.587785252292473 -0.809016994374947 0. 1. -0.809016994374947 -0.5877852522924733 -0.3090169943749474 0.951056516295153 -0.951056516295153 -0.3090169943749475 -0.5877852522924732 0.809016994374947 -1. 0. -0.809016994374947 0.5877852522924732 -0.951056516295154 0.3090169943749472 -0.951056516295153 0.3090169943749474 -0.809016994374948 0.587785252292473 -1. 0. -0.5877852522924734 0.809016994374947 -0.951056516295154 -0.3090169943749474 -0.3090169943749476 0.951056516295153 -0.809016994374947 -0.587785252292473 0. 1. -0.5877852522924733 -0.809016994374947 0.3090169943749472 0.951056516295154 -0.3090169943749475 -0.951056516295153 0.5877852522924736 0.809016994374947 0. -1. 0.809016994374947 0.5877852522924741 0.3090169943749477 -0.951056516295153 0.951056516295153 0.3090169943749477 0.587785252292473 -0.809016994374947 1. 0. 0.809016994374947 -0.5877852522924733 0.951056516295154 -0.3090169943749471 0.951056516295153 -0.3090169943749475 0.5877852522924733 -0.809016994374947 0.951056516295154 -0.3090169943749474 0.3090169943749475 -0.951056516295153 1. 0. 0. -1. 0.951056516295153 0.3090169943749474 -0.3090169943749477 -0.951056516295153 0.809016994374947 0.5877852522924732 -0.587785252292473 -0.809016994374947 0.5877852522924732 0.809016994374947 -0.809016994374947 -0.5877852522924733 0.3090169943749474 0.951056516295153 -0.951056516295153 -0.3090169943749475 0. 1. -1. 0. -0.3090169943749474 0.951056516295153 -0.951056516295154 0.3090169943749472 -0.5877852522924732 0.809016994374947 -0.809016994374948 0.587785252292473 -0.809016994374947 0.5877852522924732 -0.5877852522924734 0.809016994374947 -0.951056516295153 0.3090169943749474 -0.3090169943749476 0.951056516295153 -1. 0. 0. 1. -0.951056516295154 -0.3090169943749474 0.3090169943749472 0.951056516295154 -0.809016994374947 -0.587785252292473 0.5877852522924736 0.809016994374947 -0.5877852522924733 -0.809016994374947 0.809016994374947 0.5877852522924741 -0.3090169943749475 -0.951056516295153 0.951056516295153 0.3090169943749477 0. -1. 1. 0. 0.3090169943749477 -0.951056516295153 0.951056516295154 -0.3090169943749471 0.587785252292473 -0.809016994374947 0.809016994374948 -0.5877852522924729 0.809016994374947 -0.5877852522924733 0.3090169943749475 -0.951056516295153 0.809016994374947 -0.587785252292473 0. -1. 0.951056516295154 -0.3090169943749474 -0.3090169943749477 -0.951056516295153 1. 0. -0.587785252292473 -0.809016994374947 0.951056516295153 0.3090169943749474 -0.809016994374947 -0.5877852522924733 0.809016994374947 0.5877852522924732 -0.951056516295153 -0.3090169943749475 0.5877852522924732 0.809016994374947 -1. 0. 0.3090169943749474 0.951056516295153 -0.951056516295154 0.3090169943749472 0. 1. -0.809016994374948 0.587785252292473 -0.3090169943749474 0.951056516295153 -0.5877852522924734 0.809016994374947 -0.5877852522924732 0.809016994374947 -0.3090169943749476 0.951056516295153 -0.809016994374947 0.5877852522924732 0. 1. -0.951056516295153 0.3090169943749474 0.3090169943749472 0.951056516295154 -1. 0. 0.5877852522924736 0.809016994374947 -0.951056516295154 -0.3090169943749474 0.809016994374947 0.5877852522924741 -0.809016994374947 -0.587785252292473 0.951056516295153 0.3090169943749477 -0.5877852522924733 -0.809016994374947 1. 0. -0.3090169943749475 -0.951056516295153 0.951056516295154 -0.3090169943749471 0. -1. 0.809016994374948 -0.5877852522924729 0.3090169943749477 -0.951056516295153 0.5877852522924734 -0.809016994374947 0.587785252292473 -0.809016994374947 0. -1. 0.5877852522924733 -0.809016994374947 -0.3090169943749477 -0.951056516295153 0.809016994374947 -0.587785252292473 -0.587785252292473 -0.809016994374947 0.951056516295154 -0.3090169943749474 -0.809016994374947 -0.5877852522924733 1. 0. -0.951056516295153 -0.3090169943749475 0.951056516295153 0.3090169943749474 -1. 0. 0.809016994374947 0.5877852522924732 -0.951056516295154 0.3090169943749472 0.5877852522924732 0.809016994374947 -0.809016994374948 0.587785252292473 0.3090169943749474 0.951056516295153 -0.5877852522924734 0.809016994374947 0. 1. -0.3090169943749476 0.951056516295153 -0.3090169943749474 0.951056516295153 0. 1. -0.5877852522924732 0.809016994374947 0.3090169943749472 0.951056516295154 -0.809016994374947 0.5877852522924732 0.5877852522924736 0.809016994374947 -0.951056516295153 0.3090169943749474 0.809016994374947 0.5877852522924741 -1. 0. 0.951056516295153 0.3090169943749477 -0.951056516295154 -0.3090169943749474 1. 0. -0.809016994374947 -0.587785252292473 0.951056516295154 -0.3090169943749471 -0.5877852522924733 -0.809016994374947 0.809016994374948 -0.5877852522924729 -0.3090169943749475 -0.951056516295153 0.5877852522924734 -0.809016994374947 0. -1. 0.3090169943749478 -0.951056516295153 0.3090169943749477 -0.951056516295153 -0.3090169943749477 -0.951056516295153 0.3090169943749475 -0.951056516295153 -0.587785252292473 -0.809016994374947 0.5877852522924733 -0.809016994374947 -0.809016994374947 -0.5877852522924733 0.809016994374947 -0.587785252292473 -0.951056516295153 -0.3090169943749475 0.951056516295154 -0.3090169943749474 -1. 0. 1. 0. -0.951056516295154 0.3090169943749472 0.951056516295153 0.3090169943749474 -0.809016994374948 0.587785252292473 0.809016994374947 0.5877852522924732 -0.5877852522924734 0.809016994374947 0.5877852522924732 0.809016994374947 -0.3090169943749476 0.951056516295153 0.3090169943749474 0.951056516295153 0. 1. 0. 1. 0.3090169943749472 0.951056516295154 -0.3090169943749474 0.951056516295153 0.5877852522924736 0.809016994374947 -0.5877852522924732 0.809016994374947 0.809016994374947 0.5877852522924741 -0.809016994374947 0.5877852522924732 0.951056516295153 0.3090169943749477 -0.951056516295153 0.3090169943749474 1. 0. -1. 0. 0.951056516295154 -0.3090169943749471 -0.951056516295154 -0.3090169943749474 0.809016994374948 -0.5877852522924729 -0.809016994374947 -0.587785252292473 0.5877852522924734 -0.809016994374947 -0.5877852522924733 -0.809016994374947 0.3090169943749478 -0.951056516295153 -0.3090169943749475 -0.951056516295153 0. -1. 0. -1. -0.587785252292473 -0.809016994374947 0. -1. -0.809016994374947 -0.5877852522924733 0.3090169943749475 -0.951056516295153 -0.951056516295153 -0.3090169943749475 0.5877852522924733 -0.809016994374947 -1. 0. 0.809016994374947 -0.587785252292473 -0.951056516295154 0.3090169943749472 0.951056516295154 -0.3090169943749474 -0.809016994374948 0.587785252292473 1. 0. -0.5877852522924734 0.809016994374947 0.951056516295153 0.3090169943749474 -0.3090169943749476 0.951056516295153 0.809016994374947 0.5877852522924732 0. 1. 0.5877852522924732 0.809016994374947 0.3090169943749472 0.951056516295154 0.3090169943749474 0.951056516295153 0.5877852522924736 0.809016994374947 0. 1. 0.809016994374947 0.5877852522924741 -0.3090169943749474 0.951056516295153 0.951056516295153 0.3090169943749477 -0.5877852522924732 0.809016994374947 1. 0. -0.809016994374947 0.5877852522924732 0.951056516295154 -0.3090169943749471 -0.951056516295153 0.3090169943749474 0.809016994374948 -0.5877852522924729 -1. 0. 0.5877852522924734 -0.809016994374947 -0.951056516295154 -0.3090169943749474 0.3090169943749478 -0.951056516295153 -0.809016994374947 -0.587785252292473 0. -1. -0.5877852522924733 -0.809016994374947 -0.309016994374947 -0.951056516295154 -0.3090169943749475 -0.951056516295153 -0.809016994374947 -0.5877852522924733 -0.3090169943749477 -0.951056516295153 -0.951056516295153 -0.3090169943749475 0. -1. -1. 0. 0.3090169943749475 -0.951056516295153 -0.951056516295154 0.3090169943749472 0.5877852522924733 -0.809016994374947 -0.809016994374948 0.587785252292473 0.809016994374947 -0.587785252292473 -0.5877852522924734 0.809016994374947 0.951056516295154 -0.3090169943749474 -0.3090169943749476 0.951056516295153 1. 0. 0. 1. 0.951056516295153 0.3090169943749474 0.3090169943749472 0.951056516295154 0.809016994374947 0.5877852522924732 0.5877852522924736 0.809016994374947 0.5877852522924732 0.809016994374947 0.809016994374947 0.5877852522924741 0.3090169943749474 0.951056516295153 0.951056516295153 0.3090169943749477 0. 1. 1. 0. -0.3090169943749474 0.951056516295153 0.951056516295154 -0.3090169943749471 -0.5877852522924732 0.809016994374947 0.809016994374948 -0.5877852522924729 -0.809016994374947 0.5877852522924732 0.5877852522924734 -0.809016994374947 -0.951056516295153 0.3090169943749474 0.3090169943749478 -0.951056516295153 -1. 0. 0. -1. -0.951056516295154 -0.3090169943749474 -0.309016994374947 -0.951056516295154 -0.809016994374947 -0.587785252292473 -0.5877852522924729 -0.809016994374948 -0.5877852522924733 -0.809016994374947 -0.951056516295153 -0.3090169943749475 -0.587785252292473 -0.809016994374947 -1. 0. -0.3090169943749477 -0.951056516295153 -0.951056516295154 0.3090169943749472 0. -1. -0.809016994374948 0.587785252292473 0.3090169943749475 -0.951056516295153 -0.5877852522924734 0.809016994374947 0.5877852522924733 -0.809016994374947 -0.3090169943749476 0.951056516295153 0.809016994374947 -0.587785252292473 0. 1. 0.951056516295154 -0.3090169943749474 0.3090169943749472 0.951056516295154 1. 0. 0.5877852522924736 0.809016994374947 0.951056516295153 0.3090169943749474 0.809016994374947 0.5877852522924741 0.809016994374947 0.5877852522924732 0.951056516295153 0.3090169943749477 0.5877852522924732 0.809016994374947 1. 0. 0.3090169943749474 0.951056516295153 0.951056516295154 -0.3090169943749471 0. 1. 0.809016994374948 -0.5877852522924729 -0.3090169943749474 0.951056516295153 0.5877852522924734 -0.809016994374947 -0.5877852522924732 0.809016994374947 0.3090169943749478 -0.951056516295153 -0.809016994374947 0.5877852522924732 0. -1. -0.951056516295153 0.3090169943749474 -0.309016994374947 -0.951056516295154 -1. 0. -0.5877852522924729 -0.809016994374948 -0.951056516295154 -0.3090169943749474 -0.809016994374947 -0.5877852522924735 -0.809016994374947 -0.587785252292473 -1. 0. -0.809016994374947 -0.5877852522924733 -0.951056516295154 0.3090169943749472 -0.587785252292473 -0.809016994374947 -0.809016994374948 0.587785252292473 -0.3090169943749477 -0.951056516295153 -0.5877852522924734 0.809016994374947 0. -1. -0.3090169943749476 0.951056516295153 0.3090169943749475 -0.951056516295153 0. 1. 0.5877852522924733 -0.809016994374947 0.3090169943749472 0.951056516295154 0.809016994374947 -0.587785252292473 0.5877852522924736 0.809016994374947 0.951056516295154 -0.3090169943749474 0.809016994374947 0.5877852522924741 1. 0. 0.951056516295153 0.3090169943749477 0.951056516295153 0.3090169943749474 1. 0. 0.809016994374947 0.5877852522924732 0.951056516295154 -0.3090169943749471 0.5877852522924732 0.809016994374947 0.809016994374948 -0.5877852522924729 0.3090169943749474 0.951056516295153 0.5877852522924734 -0.809016994374947 0. 1. 0.3090169943749478 -0.951056516295153 -0.3090169943749474 0.951056516295153 0. -1. -0.5877852522924732 0.809016994374947 -0.309016994374947 -0.951056516295154 -0.809016994374947 0.5877852522924732 -0.5877852522924729 -0.809016994374948 -0.951056516295153 0.3090169943749474 -0.809016994374947 -0.5877852522924735 -1. 0. -0.951056516295153 -0.3090169943749478 -0.951056516295154 -0.3090169943749474 -0.951056516295154 0.3090169943749472 -0.951056516295153 -0.3090169943749475 -0.809016994374948 0.587785252292473 -0.809016994374947 -0.5877852522924733 -0.5877852522924734 0.809016994374947 -0.587785252292473 -0.809016994374947 -0.3090169943749476 0.951056516295153 -0.3090169943749477 -0.951056516295153 0. 1. 0. -1. 0.3090169943749472 0.951056516295154 0.3090169943749475 -0.951056516295153 0.5877852522924736 0.809016994374947 0.5877852522924733 -0.809016994374947 0.809016994374947 0.5877852522924741 0.809016994374947 -0.587785252292473 0.951056516295153 0.3090169943749477 0.951056516295154 -0.3090169943749474 1. 0. 1. 0. 0.951056516295154 -0.3090169943749471 0.951056516295153 0.3090169943749474 0.809016994374948 -0.5877852522924729 0.809016994374947 0.5877852522924732 0.5877852522924734 -0.809016994374947 0.5877852522924732 0.809016994374947 0.3090169943749478 -0.951056516295153 0.3090169943749474 0.951056516295153 0. -1. 0. 1. -0.309016994374947 -0.951056516295154 -0.3090169943749474 0.951056516295153 -0.5877852522924729 -0.809016994374948 -0.5877852522924732 0.809016994374947 -0.809016994374947 -0.5877852522924735 -0.809016994374947 0.5877852522924732 -0.951056516295153 -0.3090169943749478 -0.951056516295153 0.3090169943749474 -1. 0. -1. 0. -0.809016994374948 0.587785252292473 -1. 0. -0.5877852522924734 0.809016994374947 -0.951056516295153 -0.3090169943749475 -0.3090169943749476 0.951056516295153 -0.809016994374947 -0.5877852522924733 0. 1. -0.587785252292473 -0.809016994374947 0.3090169943749472 0.951056516295154 -0.3090169943749477 -0.951056516295153 0.5877852522924736 0.809016994374947 0. -1. 0.809016994374947 0.5877852522924741 0.3090169943749475 -0.951056516295153 0.951056516295153 0.3090169943749477 0.5877852522924733 -0.809016994374947 1. 0. 0.809016994374947 -0.587785252292473 0.951056516295154 -0.3090169943749471 0.951056516295154 -0.3090169943749474 0.809016994374948 -0.5877852522924729 1. 0. 0.5877852522924734 -0.809016994374947 0.951056516295153 0.3090169943749474 0.3090169943749478 -0.951056516295153 0.809016994374947 0.5877852522924732 0. -1. 0.5877852522924732 0.809016994374947 -0.309016994374947 -0.951056516295154 0.3090169943749474 0.951056516295153 -0.5877852522924729 -0.809016994374948 0. 1. -0.809016994374947 -0.5877852522924735 -0.3090169943749474 0.951056516295153 -0.951056516295153 -0.3090169943749478 -0.5877852522924732 0.809016994374947 -1. 0. -0.809016994374947 0.5877852522924732 -0.951056516295154 0.309016994374947 -0.951056516295153 0.3090169943749474 -0.5877852522924734 0.809016994374947 -0.951056516295154 0.3090169943749472 -0.3090169943749476 0.951056516295153 -1. 0. 0. 1. -0.951056516295153 -0.3090169943749475 0.3090169943749472 0.951056516295154 -0.809016994374947 -0.5877852522924733 0.5877852522924736 0.809016994374947 -0.587785252292473 -0.809016994374947 0.809016994374947 0.5877852522924741 -0.3090169943749477 -0.951056516295153 0.951056516295153 0.3090169943749477 0. -1. 1. 0. 0.3090169943749475 -0.951056516295153 0.951056516295154 -0.3090169943749471 0.5877852522924733 -0.809016994374947 0.809016994374948 -0.5877852522924729 0.809016994374947 -0.587785252292473 0.5877852522924734 -0.809016994374947 0.951056516295154 -0.3090169943749474 0.3090169943749478 -0.951056516295153 1. 0. 0. -1. 0.951056516295153 0.3090169943749474 -0.309016994374947 -0.951056516295154 0.809016994374947 0.5877852522924732 -0.5877852522924729 -0.809016994374948 0.5877852522924732 0.809016994374947 -0.809016994374947 -0.5877852522924735 0.3090169943749474 0.951056516295153 -0.951056516295153 -0.3090169943749478 0. 1. -1. 0. -0.3090169943749474 0.951056516295153 -0.951056516295154 0.309016994374947 -0.5877852522924732 0.809016994374947 -0.809016994374948 0.5877852522924729 -0.809016994374947 0.5877852522924732 -0.3090169943749476 0.951056516295153 -0.809016994374948 0.587785252292473 0. 1. -0.951056516295154 0.3090169943749472 0.3090169943749472 0.951056516295154 -1. 0. 0.5877852522924736 0.809016994374947 -0.951056516295153 -0.3090169943749475 0.809016994374947 0.5877852522924741 -0.809016994374947 -0.5877852522924733 0.951056516295153 0.3090169943749477 -0.587785252292473 -0.809016994374947 1. 0. -0.3090169943749477 -0.951056516295153 0.951056516295154 -0.3090169943749471 0. -1. 0.809016994374948 -0.5877852522924729 0.3090169943749475 -0.951056516295153 0.5877852522924734 -0.809016994374947 0.5877852522924733 -0.809016994374947 0.3090169943749478 -0.951056516295153 0.809016994374947 -0.587785252292473 0. -1. 0.951056516295154 -0.3090169943749474 -0.309016994374947 -0.951056516295154 1. 0. -0.5877852522924729 -0.809016994374948 0.951056516295153 0.3090169943749474 -0.809016994374947 -0.5877852522924735 0.809016994374947 0.5877852522924732 -0.951056516295153 -0.3090169943749478 0.5877852522924732 0.809016994374947 -1. 0. 0.3090169943749474 0.951056516295153 -0.951056516295154 0.309016994374947 0. 1. -0.809016994374948 0.5877852522924729 -0.3090169943749474 0.951056516295153 -0.5877852522924735 0.809016994374947 -0.5877852522924732 0.809016994374947 0. 1. -0.5877852522924734 0.809016994374947 0.3090169943749472 0.951056516295154 -0.809016994374948 0.587785252292473 0.5877852522924736 0.809016994374947 -0.951056516295154 0.3090169943749472 0.809016994374947 0.5877852522924741 -1. 0. 0.951056516295153 0.3090169943749477 -0.951056516295153 -0.3090169943749475 1. 0. -0.809016994374947 -0.5877852522924733 0.951056516295154 -0.3090169943749471 -0.587785252292473 -0.809016994374947 0.809016994374948 -0.5877852522924729 -0.3090169943749477 -0.951056516295153 0.5877852522924734 -0.809016994374947 0. -1. 0.3090169943749478 -0.951056516295153 0.3090169943749475 -0.951056516295153 0. -1. 0.5877852522924733 -0.809016994374947 -0.309016994374947 -0.951056516295154 0.809016994374947 -0.587785252292473 -0.5877852522924729 -0.809016994374948 0.951056516295154 -0.3090169943749474 -0.809016994374947 -0.5877852522924735 1. 0. -0.951056516295153 -0.3090169943749478 0.951056516295153 0.3090169943749474 -1. 0. 0.809016994374947 0.5877852522924732 -0.951056516295154 0.309016994374947 0.5877852522924732 0.809016994374947 -0.809016994374948 0.5877852522924729 0.3090169943749474 0.951056516295153 -0.5877852522924735 0.809016994374947 0. 1. -0.3090169943749479 0.951056516295153 -0.3090169943749474 0.951056516295153 0.3090169943749472 0.951056516295154 -0.3090169943749476 0.951056516295153 0.5877852522924736 0.809016994374947 -0.5877852522924734 0.809016994374947 0.809016994374947 0.5877852522924741 -0.809016994374948 0.587785252292473 0.951056516295153 0.3090169943749477 -0.951056516295154 0.3090169943749472 1. 0. -1. 0. 0.951056516295154 -0.3090169943749471 -0.951056516295153 -0.3090169943749475 0.809016994374948 -0.5877852522924729 -0.809016994374947 -0.5877852522924733 0.5877852522924734 -0.809016994374947 -0.587785252292473 -0.809016994374947 0.3090169943749478 -0.951056516295153 -0.3090169943749477 -0.951056516295153 0. -1. 0. -1. -0.309016994374947 -0.951056516295154 0.3090169943749475 -0.951056516295153 -0.5877852522924729 -0.809016994374948 0.5877852522924733 -0.809016994374947 -0.809016994374947 -0.5877852522924735 0.809016994374947 -0.587785252292473 -0.951056516295153 -0.3090169943749478 0.951056516295154 -0.3090169943749474 -1. 0. 1. 0. -0.951056516295154 0.309016994374947 0.951056516295153 0.3090169943749474 -0.809016994374948 0.5877852522924729 0.809016994374947 0.5877852522924732 -0.5877852522924735 0.809016994374947 0.5877852522924732 0.809016994374947 -0.3090169943749479 0.951056516295153 0.3090169943749474 0.951056516295153 0. 1. 0. 1. geomview-1.9.5/data/geom/spherical/simplex.off0000644000175000017500000000047112310110172016246 000000000000004OFF 5 10 10 3.8541 -.618 -.618 -.618 -.618 3.8541 -.618 -.618 -.618 -.618 3.8541 -.618 -.618 -.618 -.618 3.8541 -2 -2 -2 -2 3 0 1 2 .7 .35 0 3 0 1 3 0 .7 .35 3 0 1 4 .35 0 .7 3 0 2 3 .35 .7 0 3 0 2 4 .7 0 .35 3 0 3 4 0 .35 .7 3 1 2 3 .35 .35 .35 3 1 2 4 .7 0 0 3 1 3 4 0 .7 0 3 2 3 4 0 0 .7 geomview-1.9.5/data/geom/spherical/tetraplex.off0000644000175000017500000004443212310110172016602 000000000000004OFF 120 1200 720 -2. 0 0 0 -1. -1. -1. -1. -1. -1. -1. 1. -1. -1. 1. -1. -1. -1. 1. 1. -1. 0 -0.618034 -1.61803 -1. 0 -0.618034 1.61803 -1. 0 0.618034 -1.61803 -1. 0 0.618034 1.61803 -1. 1. -1. -1. -1. 1. -1. 1. -1. 1. 1. -1. -1. 1. 1. 1. -1. -0.618034 -1.61803 0 -1. -0.618034 1.61803 0 -1. 0.618034 -1.61803 0 -1. 0.618034 1.61803 0 -1. -1.61803 0 -0.618034 -1. -1.61803 0 0.618034 -1. 1.61803 0 -0.618034 -1. 1.61803 0 0.618034 0 -2. 0 0 0 -1. -1.61803 -0.618034 0 -1. -1.61803 0.618034 0 -1. 1.61803 -0.618034 0 -1. 1.61803 0.618034 0 0 -2. 0 0 0 0 -2. 0 0 0 2. 0 0 2. 0 0 1. -1.61803 -0.618034 0 1. -1.61803 0.618034 0 1. 1.61803 -0.618034 0 1. 1.61803 0.618034 0 2. 0 0 0 -0.618034 -1. -1.61803 0 -0.618034 -1. 1.61803 0 -0.618034 1. -1.61803 0 -0.618034 1. 1.61803 0 0.618034 -1. -1.61803 0 0.618034 -1. 1.61803 0 0.618034 1. -1.61803 0 0.618034 1. 1.61803 0 -1.61803 -0.618034 -1. 0 -1.61803 -0.618034 1. 0 -1.61803 0.618034 -1. 0 -1.61803 0.618034 1. 0 1.61803 -0.618034 -1. 0 1.61803 -0.618034 1. 0 1.61803 0.618034 -1. 0 1.61803 0.618034 1. 1. -1. -1. -1. 1. -1. -1. 1. 1. -1. 1. -1. 1. -1. 1. 1. 1. 0 -0.618034 -1.61803 1. 0 -0.618034 1.61803 1. 0 0.618034 -1.61803 1. 0 0.618034 1.61803 1. 1. -1. -1. 1. 1. -1. 1. 1. 1. 1. -1. 1. 1. 1. 1. 1. -0.618034 -1.61803 0 1. -0.618034 1.61803 0 1. 0.618034 -1.61803 0 1. 0.618034 1.61803 0 1. -1.61803 0 -0.618034 1. -1.61803 0 0.618034 1. 1.61803 0 -0.618034 1. 1.61803 0 0.618034 2. 0 0 0 -0.618034 -1. 0 -1.61803 -0.618034 -1. 0 1.61803 -0.618034 0 -1.61803 -1. -0.618034 0 -1.61803 1. -0.618034 0 1.61803 -1. -0.618034 0 1.61803 1. -0.618034 1. 0 -1.61803 -0.618034 1. 0 1.61803 -0.618034 -1.61803 -1. 0 -0.618034 -1.61803 1. 0 -0.618034 1.61803 -1. 0 -0.618034 1.61803 1. 0 0.618034 -1. 0 -1.61803 0.618034 -1. 0 1.61803 0.618034 0 -1.61803 -1. 0.618034 0 -1.61803 1. 0.618034 0 1.61803 -1. 0.618034 0 1.61803 1. 0.618034 1. 0 -1.61803 0.618034 1. 0 1.61803 0.618034 -1.61803 -1. 0 0.618034 -1.61803 1. 0 0.618034 1.61803 -1. 0 0.618034 1.61803 1. 0 -1.61803 -1. -0.618034 0 -1.61803 -1. 0.618034 0 -1.61803 0 -1. -0.618034 -1.61803 0 -1. 0.618034 -1.61803 0 1. -0.618034 -1.61803 0 1. 0.618034 -1.61803 1. -0.618034 0 -1.61803 1. 0.618034 0 -1.61803 -0.618034 0 -1. -1.61803 -0.618034 0 1. -1.61803 0.618034 0 -1. -1.61803 0.618034 0 1. 1.61803 -1. -0.618034 0 1.61803 -1. 0.618034 0 1.61803 0 -1. -0.618034 1.61803 0 -1. 0.618034 1.61803 0 1. -0.618034 1.61803 0 1. 0.618034 1.61803 1. -0.618034 0 1.61803 1. 0.618034 0 1.61803 -0.618034 0 -1. 1.61803 -0.618034 0 1. 1.61803 0.618034 0 -1. 1.61803 0.618034 0 1. 3 0 96 97 3 0 98 99 3 0 100 101 3 0 102 103 3 0 104 106 3 0 105 107 3 5 7 27 3 6 8 28 3 13 15 26 3 14 16 29 3 17 18 21 3 19 20 34 3 21 43 45 3 21 44 46 3 21 67 68 3 21 80 92 3 21 81 93 3 22 23 26 3 24 25 29 3 26 30 31 3 26 63 65 3 26 74 86 3 26 75 87 3 27 35 39 3 27 37 41 3 27 55 57 3 27 72 84 3 27 78 90 3 28 36 40 3 28 38 42 3 28 56 58 3 28 73 85 3 28 79 91 3 29 32 33 3 29 64 66 3 29 76 88 3 29 77 89 3 34 47 49 3 34 48 50 3 34 69 70 3 34 82 94 3 34 83 95 3 71 108 109 3 71 110 111 3 71 112 113 3 71 114 115 3 71 116 118 3 71 117 119 3 0 96 98 3 0 96 99 3 0 96 104 3 0 96 105 3 0 97 100 3 0 97 101 3 0 97 104 3 0 97 105 3 0 98 102 3 0 98 104 3 0 98 106 3 0 99 102 3 0 99 105 3 0 99 107 3 0 100 103 3 0 100 104 3 0 100 106 3 0 101 103 3 0 101 105 3 0 101 107 3 0 102 106 3 0 102 107 3 0 103 106 3 0 103 107 3 5 27 35 3 5 27 39 3 5 27 72 3 5 27 78 3 6 28 36 3 6 28 40 3 6 28 73 3 6 28 79 3 7 27 37 3 7 27 41 3 7 27 72 3 7 27 78 3 8 28 38 3 8 28 42 3 8 28 73 3 8 28 79 3 13 22 26 3 13 23 26 3 13 26 74 3 13 26 75 3 14 24 29 3 14 25 29 3 14 29 76 3 14 29 77 3 15 26 30 3 15 26 31 3 15 26 74 3 15 26 75 3 16 29 32 3 16 29 33 3 16 29 76 3 16 29 77 3 17 21 43 3 17 21 45 3 17 21 80 3 17 21 81 3 18 21 44 3 18 21 46 3 18 21 80 3 18 21 81 3 19 34 47 3 19 34 49 3 19 34 82 3 19 34 83 3 20 34 48 3 20 34 50 3 20 34 82 3 20 34 83 3 21 43 67 3 21 43 80 3 21 43 92 3 21 44 68 3 21 44 80 3 21 44 92 3 21 45 67 3 21 45 81 3 21 45 93 3 21 46 68 3 21 46 81 3 21 46 93 3 21 67 92 3 21 67 93 3 21 68 92 3 21 68 93 3 22 26 63 3 22 26 74 3 22 26 86 3 23 26 63 3 23 26 75 3 23 26 87 3 24 29 64 3 24 29 76 3 24 29 88 3 25 29 64 3 25 29 77 3 25 29 89 3 26 30 65 3 26 30 74 3 26 30 86 3 26 31 65 3 26 31 75 3 26 31 87 3 26 63 86 3 26 63 87 3 26 65 86 3 26 65 87 3 27 35 55 3 27 35 72 3 27 35 84 3 27 37 57 3 27 37 72 3 27 37 84 3 27 39 55 3 27 39 78 3 27 39 90 3 27 41 57 3 27 41 78 3 27 41 90 3 27 55 84 3 27 55 90 3 27 57 84 3 27 57 90 3 28 36 56 3 28 36 73 3 28 36 85 3 28 38 58 3 28 38 73 3 28 38 85 3 28 40 56 3 28 40 79 3 28 40 91 3 28 42 58 3 28 42 79 3 28 42 91 3 28 56 85 3 28 56 91 3 28 58 85 3 28 58 91 3 29 32 66 3 29 32 76 3 29 32 88 3 29 33 66 3 29 33 77 3 29 33 89 3 29 64 88 3 29 64 89 3 29 66 88 3 29 66 89 3 34 47 69 3 34 47 82 3 34 47 94 3 34 48 70 3 34 48 82 3 34 48 94 3 34 49 69 3 34 49 83 3 34 49 95 3 34 50 70 3 34 50 83 3 34 50 95 3 34 69 94 3 34 69 95 3 34 70 94 3 34 70 95 3 71 108 110 3 71 108 111 3 71 108 116 3 71 108 117 3 71 109 112 3 71 109 113 3 71 109 116 3 71 109 117 3 71 110 114 3 71 110 116 3 71 110 118 3 71 111 114 3 71 111 117 3 71 111 119 3 71 112 115 3 71 112 116 3 71 112 118 3 71 113 115 3 71 113 117 3 71 113 119 3 71 114 118 3 71 114 119 3 71 115 118 3 71 115 119 3 1 5 35 3 1 5 72 3 1 13 22 3 1 13 74 3 1 17 43 3 1 17 80 3 1 22 74 3 1 35 72 3 1 43 80 3 1 96 98 3 1 96 104 3 1 98 104 3 2 6 36 3 2 6 73 3 2 13 23 3 2 13 75 3 2 18 44 3 2 18 80 3 2 23 75 3 2 36 73 3 2 44 80 3 2 96 99 3 2 96 105 3 2 99 105 3 3 7 37 3 3 7 72 3 3 14 24 3 3 14 76 3 3 17 45 3 3 17 81 3 3 24 76 3 3 37 72 3 3 45 81 3 3 97 100 3 3 97 104 3 3 100 104 3 4 8 38 3 4 8 73 3 4 14 25 3 4 14 77 3 4 18 46 3 4 18 81 3 4 25 77 3 4 38 73 3 4 46 81 3 4 97 101 3 4 97 105 3 4 101 105 3 5 9 39 3 5 9 78 3 6 10 40 3 6 10 79 3 7 11 41 3 7 11 78 3 8 12 42 3 8 12 79 3 9 15 30 3 9 15 74 3 9 19 47 3 9 19 82 3 9 30 74 3 9 39 78 3 9 47 82 3 9 98 102 3 9 98 106 3 9 102 106 3 10 15 31 3 10 15 75 3 10 20 48 3 10 20 82 3 10 31 75 3 10 40 79 3 10 48 82 3 10 99 102 3 10 99 107 3 10 102 107 3 11 16 32 3 11 16 76 3 11 19 49 3 11 19 83 3 11 32 76 3 11 41 78 3 11 49 83 3 11 100 103 3 11 100 106 3 11 103 106 3 12 16 33 3 12 16 77 3 12 20 50 3 12 20 83 3 12 33 77 3 12 42 79 3 12 50 83 3 12 101 103 3 12 101 107 3 12 103 107 3 22 51 63 3 22 51 86 3 23 52 63 3 23 52 87 3 24 53 64 3 24 53 88 3 25 54 64 3 25 54 89 3 30 59 65 3 30 59 86 3 31 60 65 3 31 60 87 3 32 61 66 3 32 61 88 3 33 62 66 3 33 62 89 3 35 51 55 3 35 51 84 3 36 52 56 3 36 52 85 3 37 53 57 3 37 53 84 3 38 54 58 3 38 54 85 3 39 55 59 3 39 59 90 3 40 56 60 3 40 60 91 3 41 57 61 3 41 61 90 3 42 58 62 3 42 62 91 3 43 51 67 3 43 51 92 3 44 52 68 3 44 52 92 3 45 53 67 3 45 53 93 3 46 54 68 3 46 54 93 3 47 59 69 3 47 59 94 3 48 60 70 3 48 60 94 3 49 61 69 3 49 61 95 3 50 62 70 3 50 62 95 3 51 55 84 3 51 63 86 3 51 67 92 3 51 108 110 3 51 108 116 3 51 110 116 3 52 56 85 3 52 63 87 3 52 68 92 3 52 108 111 3 52 108 117 3 52 111 117 3 53 57 84 3 53 64 88 3 53 67 93 3 53 109 112 3 53 109 116 3 53 112 116 3 54 58 85 3 54 64 89 3 54 68 93 3 54 109 113 3 54 109 117 3 54 113 117 3 55 59 90 3 56 60 91 3 57 61 90 3 58 62 91 3 59 65 86 3 59 69 94 3 59 110 114 3 59 110 118 3 59 114 118 3 60 65 87 3 60 70 94 3 60 111 114 3 60 111 119 3 60 114 119 3 61 66 88 3 61 69 95 3 61 112 115 3 61 112 118 3 61 115 118 3 62 66 89 3 62 70 95 3 62 113 115 3 62 113 119 3 62 115 119 3 1 5 104 3 1 13 98 3 1 17 96 3 1 22 80 3 1 35 74 3 1 43 72 3 2 6 105 3 2 13 99 3 2 18 96 3 2 23 80 3 2 36 75 3 2 44 73 3 3 7 104 3 3 14 100 3 3 17 97 3 3 24 81 3 3 37 76 3 3 45 72 3 4 8 105 3 4 14 101 3 4 18 97 3 4 25 81 3 4 38 77 3 4 46 73 3 5 9 106 3 6 10 107 3 7 11 106 3 8 12 107 3 9 15 98 3 9 19 102 3 9 30 82 3 9 39 74 3 9 47 78 3 10 15 99 3 10 20 102 3 10 31 82 3 10 40 75 3 10 48 79 3 11 16 100 3 11 19 103 3 11 32 83 3 11 41 76 3 11 49 78 3 12 16 101 3 12 20 103 3 12 33 83 3 12 42 77 3 12 50 79 3 22 51 92 3 23 52 92 3 24 53 93 3 25 54 93 3 30 59 94 3 31 60 94 3 32 61 95 3 33 62 95 3 35 51 86 3 36 52 87 3 37 53 88 3 38 54 89 3 39 59 86 3 40 60 87 3 41 61 88 3 42 62 89 3 43 51 84 3 44 52 85 3 45 53 84 3 46 54 85 3 47 59 90 3 48 60 91 3 49 61 90 3 50 62 91 3 51 55 116 3 51 63 110 3 51 67 108 3 52 56 117 3 52 63 111 3 52 68 108 3 53 57 116 3 53 64 112 3 53 67 109 3 54 58 117 3 54 64 113 3 54 68 109 3 55 59 118 3 56 60 119 3 57 61 118 3 58 62 119 3 59 65 110 3 59 69 114 3 60 65 111 3 60 70 114 3 61 66 112 3 61 69 115 3 62 66 113 3 62 70 115 3 1 5 74 3 1 5 98 3 1 13 80 3 1 13 96 3 1 17 72 3 1 17 104 3 1 22 35 3 1 22 43 3 1 35 43 3 1 72 104 3 1 74 98 3 1 80 96 3 2 6 75 3 2 6 99 3 2 13 80 3 2 13 96 3 2 18 73 3 2 18 105 3 2 23 36 3 2 23 44 3 2 36 44 3 2 73 105 3 2 75 99 3 2 80 96 3 3 7 76 3 3 7 100 3 3 14 81 3 3 14 97 3 3 17 72 3 3 17 104 3 3 24 37 3 3 24 45 3 3 37 45 3 3 72 104 3 3 76 100 3 3 81 97 3 4 8 77 3 4 8 101 3 4 14 81 3 4 14 97 3 4 18 73 3 4 18 105 3 4 25 38 3 4 25 46 3 4 38 46 3 4 73 105 3 4 77 101 3 4 81 97 3 5 9 74 3 5 9 98 3 6 10 75 3 6 10 99 3 7 11 76 3 7 11 100 3 8 12 77 3 8 12 101 3 9 15 82 3 9 15 102 3 9 19 78 3 9 19 106 3 9 30 39 3 9 30 47 3 9 39 47 3 9 74 98 3 9 78 106 3 9 82 102 3 10 15 82 3 10 15 102 3 10 20 79 3 10 20 107 3 10 31 40 3 10 31 48 3 10 40 48 3 10 75 99 3 10 79 107 3 10 82 102 3 11 16 83 3 11 16 103 3 11 19 78 3 11 19 106 3 11 32 41 3 11 32 49 3 11 41 49 3 11 76 100 3 11 78 106 3 11 83 103 3 12 16 83 3 12 16 103 3 12 20 79 3 12 20 107 3 12 33 42 3 12 33 50 3 12 42 50 3 12 77 101 3 12 79 107 3 12 83 103 3 22 35 51 3 22 43 51 3 23 36 52 3 23 44 52 3 24 37 53 3 24 45 53 3 25 38 54 3 25 46 54 3 30 39 59 3 30 47 59 3 31 40 60 3 31 48 60 3 32 41 61 3 32 49 61 3 33 42 62 3 33 50 62 3 35 43 51 3 36 44 52 3 37 45 53 3 38 46 54 3 39 47 59 3 40 48 60 3 41 49 61 3 42 50 62 3 51 55 86 3 51 55 110 3 51 63 92 3 51 63 108 3 51 67 84 3 51 67 116 3 51 84 116 3 51 86 110 3 51 92 108 3 52 56 87 3 52 56 111 3 52 63 92 3 52 63 108 3 52 68 85 3 52 68 117 3 52 85 117 3 52 87 111 3 52 92 108 3 53 57 88 3 53 57 112 3 53 64 93 3 53 64 109 3 53 67 84 3 53 67 116 3 53 84 116 3 53 88 112 3 53 93 109 3 54 58 89 3 54 58 113 3 54 64 93 3 54 64 109 3 54 68 85 3 54 68 117 3 54 85 117 3 54 89 113 3 54 93 109 3 55 59 86 3 55 59 110 3 56 60 87 3 56 60 111 3 57 61 88 3 57 61 112 3 58 62 89 3 58 62 113 3 59 65 94 3 59 65 114 3 59 69 90 3 59 69 118 3 59 86 110 3 59 90 118 3 59 94 114 3 60 65 94 3 60 65 114 3 60 70 91 3 60 70 119 3 60 87 111 3 60 91 119 3 60 94 114 3 61 66 95 3 61 66 115 3 61 69 90 3 61 69 118 3 61 88 112 3 61 90 118 3 61 95 115 3 62 66 95 3 62 66 115 3 62 70 91 3 62 70 119 3 62 89 113 3 62 91 119 3 62 95 115 3 5 74 98 3 6 75 99 3 7 76 100 3 8 77 101 3 13 80 96 3 14 81 97 3 15 82 102 3 16 83 103 3 17 72 104 3 18 73 105 3 19 78 106 3 20 79 107 3 22 35 43 3 23 36 44 3 24 37 45 3 25 38 46 3 30 39 47 3 31 40 48 3 32 41 49 3 33 42 50 3 55 86 110 3 56 87 111 3 57 88 112 3 58 89 113 3 63 92 108 3 64 93 109 3 65 94 114 3 66 95 115 3 67 84 116 3 68 85 117 3 69 90 118 3 70 91 119 3 5 35 72 3 5 39 78 3 6 36 73 3 6 40 79 3 7 37 72 3 7 41 78 3 8 38 73 3 8 42 79 3 13 22 74 3 13 23 75 3 14 24 76 3 14 25 77 3 15 30 74 3 15 31 75 3 16 32 76 3 16 33 77 3 17 43 80 3 17 45 81 3 18 44 80 3 18 46 81 3 19 47 82 3 19 49 83 3 20 48 82 3 20 50 83 3 22 63 86 3 23 63 87 3 24 64 88 3 25 64 89 3 30 65 86 3 31 65 87 3 32 66 88 3 33 66 89 3 35 55 84 3 36 56 85 3 37 57 84 3 38 58 85 3 39 55 90 3 40 56 91 3 41 57 90 3 42 58 91 3 43 67 92 3 44 68 92 3 45 67 93 3 46 68 93 3 47 69 94 3 48 70 94 3 49 69 95 3 50 70 95 3 96 98 104 3 96 99 105 3 97 100 104 3 97 101 105 3 98 102 106 3 99 102 107 3 100 103 106 3 101 103 107 3 108 110 116 3 108 111 117 3 109 112 116 3 109 113 117 3 110 114 118 3 111 114 119 3 112 115 118 3 113 115 119 3 5 7 72 3 5 7 78 3 5 35 39 3 6 8 73 3 6 8 79 3 6 36 40 3 7 37 41 3 8 38 42 3 13 15 74 3 13 15 75 3 13 22 23 3 14 16 76 3 14 16 77 3 14 24 25 3 15 30 31 3 16 32 33 3 17 18 80 3 17 18 81 3 17 43 45 3 18 44 46 3 19 20 82 3 19 20 83 3 19 47 49 3 20 48 50 3 22 23 63 3 22 74 86 3 23 75 87 3 24 25 64 3 24 76 88 3 25 77 89 3 30 31 65 3 30 74 86 3 31 75 87 3 32 33 66 3 32 76 88 3 33 77 89 3 35 39 55 3 35 72 84 3 36 40 56 3 36 73 85 3 37 41 57 3 37 72 84 3 38 42 58 3 38 73 85 3 39 78 90 3 40 79 91 3 41 78 90 3 42 79 91 3 43 45 67 3 43 80 92 3 44 46 68 3 44 80 92 3 45 81 93 3 46 81 93 3 47 49 69 3 47 82 94 3 48 50 70 3 48 82 94 3 49 83 95 3 50 83 95 3 55 57 84 3 55 57 90 3 56 58 85 3 56 58 91 3 63 65 86 3 63 65 87 3 64 66 88 3 64 66 89 3 67 68 92 3 67 68 93 3 69 70 94 3 69 70 95 3 96 97 104 3 96 97 105 3 96 98 99 3 97 100 101 3 98 99 102 3 98 104 106 3 99 105 107 3 100 101 103 3 100 104 106 3 101 105 107 3 102 103 106 3 102 103 107 3 108 109 116 3 108 109 117 3 108 110 111 3 109 112 113 3 110 111 114 3 110 116 118 3 111 117 119 3 112 113 115 3 112 116 118 3 113 117 119 3 114 115 118 3 114 115 119 3 5 35 74 3 5 39 74 3 5 72 104 3 5 78 106 3 5 98 104 3 5 98 106 3 6 36 75 3 6 40 75 3 6 73 105 3 6 79 107 3 6 99 105 3 6 99 107 3 7 37 76 3 7 41 76 3 7 72 104 3 7 78 106 3 7 100 104 3 7 100 106 3 8 38 77 3 8 42 77 3 8 73 105 3 8 79 107 3 8 101 105 3 8 101 107 3 13 22 80 3 13 23 80 3 13 74 98 3 13 75 99 3 13 96 98 3 13 96 99 3 14 24 81 3 14 25 81 3 14 76 100 3 14 77 101 3 14 97 100 3 14 97 101 3 15 30 82 3 15 31 82 3 15 74 98 3 15 75 99 3 15 98 102 3 15 99 102 3 16 32 83 3 16 33 83 3 16 76 100 3 16 77 101 3 16 100 103 3 16 101 103 3 17 43 72 3 17 45 72 3 17 80 96 3 17 81 97 3 17 96 104 3 17 97 104 3 18 44 73 3 18 46 73 3 18 80 96 3 18 81 97 3 18 96 105 3 18 97 105 3 19 47 78 3 19 49 78 3 19 82 102 3 19 83 103 3 19 102 106 3 19 103 106 3 20 48 79 3 20 50 79 3 20 82 102 3 20 83 103 3 20 102 107 3 20 103 107 3 22 35 74 3 22 35 86 3 22 43 80 3 22 43 92 3 22 63 92 3 23 36 75 3 23 36 87 3 23 44 80 3 23 44 92 3 23 63 92 3 24 37 76 3 24 37 88 3 24 45 81 3 24 45 93 3 24 64 93 3 25 38 77 3 25 38 89 3 25 46 81 3 25 46 93 3 25 64 93 3 30 39 74 3 30 39 86 3 30 47 82 3 30 47 94 3 30 65 94 3 31 40 75 3 31 40 87 3 31 48 82 3 31 48 94 3 31 65 94 3 32 41 76 3 32 41 88 3 32 49 83 3 32 49 95 3 32 66 95 3 33 42 77 3 33 42 89 3 33 50 83 3 33 50 95 3 33 66 95 3 35 43 72 3 35 43 84 3 35 55 86 3 36 44 73 3 36 44 85 3 36 56 87 3 37 45 72 3 37 45 84 3 37 57 88 3 38 46 73 3 38 46 85 3 38 58 89 3 39 47 78 3 39 47 90 3 39 55 86 3 40 48 79 3 40 48 91 3 40 56 87 3 41 49 78 3 41 49 90 3 41 57 88 3 42 50 79 3 42 50 91 3 42 58 89 3 43 67 84 3 44 68 85 3 45 67 84 3 46 68 85 3 47 69 90 3 48 70 91 3 49 69 90 3 50 70 91 3 55 84 116 3 55 90 118 3 55 110 116 3 55 110 118 3 56 85 117 3 56 91 119 3 56 111 117 3 56 111 119 3 57 84 116 3 57 90 118 3 57 112 116 3 57 112 118 3 58 85 117 3 58 91 119 3 58 113 117 3 58 113 119 3 63 86 110 3 63 87 111 3 63 108 110 3 63 108 111 3 64 88 112 3 64 89 113 3 64 109 112 3 64 109 113 3 65 86 110 3 65 87 111 3 65 110 114 3 65 111 114 3 66 88 112 3 66 89 113 3 66 112 115 3 66 113 115 3 67 92 108 3 67 93 109 3 67 108 116 3 67 109 116 3 68 92 108 3 68 93 109 3 68 108 117 3 68 109 117 3 69 94 114 3 69 95 115 3 69 114 118 3 69 115 118 3 70 94 114 3 70 95 115 3 70 114 119 3 70 115 119 3 5 7 104 3 5 7 106 3 5 104 106 3 6 8 105 3 6 8 107 3 6 105 107 3 7 104 106 3 8 105 107 3 13 15 98 3 13 15 99 3 13 98 99 3 14 16 100 3 14 16 101 3 14 100 101 3 15 98 99 3 16 100 101 3 17 18 96 3 17 18 97 3 17 96 97 3 18 96 97 3 19 20 102 3 19 20 103 3 19 102 103 3 20 102 103 3 22 23 80 3 22 23 92 3 22 80 92 3 23 80 92 3 24 25 81 3 24 25 93 3 24 81 93 3 25 81 93 3 30 31 82 3 30 31 94 3 30 82 94 3 31 82 94 3 32 33 83 3 32 33 95 3 32 83 95 3 33 83 95 3 35 39 74 3 35 39 86 3 35 74 86 3 36 40 75 3 36 40 87 3 36 75 87 3 37 41 76 3 37 41 88 3 37 76 88 3 38 42 77 3 38 42 89 3 38 77 89 3 39 74 86 3 40 75 87 3 41 76 88 3 42 77 89 3 43 45 72 3 43 45 84 3 43 72 84 3 44 46 73 3 44 46 85 3 44 73 85 3 45 72 84 3 46 73 85 3 47 49 78 3 47 49 90 3 47 78 90 3 48 50 79 3 48 50 91 3 48 79 91 3 49 78 90 3 50 79 91 3 55 57 116 3 55 57 118 3 55 116 118 3 56 58 117 3 56 58 119 3 56 117 119 3 57 116 118 3 58 117 119 3 63 65 110 3 63 65 111 3 63 110 111 3 64 66 112 3 64 66 113 3 64 112 113 3 65 110 111 3 66 112 113 3 67 68 108 3 67 68 109 3 67 108 109 3 68 108 109 3 69 70 114 3 69 70 115 3 69 114 115 3 70 114 115 geomview-1.9.5/data/geom/spherical/twosided.flattorus0000644000175000017500000006733412310110172017673 00000000000000{ LIST {appearance {material {diffuse 0 0 1}} 4uvMESH 16 16 0 0.7071067811865475 0 0.7071067811865475 0 0.7071067811865475 0.2705980500730984 0.6532814824381882 0 0.7071067811865475 0.5 0.5 0 0.7071067811865475 0.6532814824381882 0.2705980500730984 0 0.7071067811865475 0.7071067811865475 0 0 0.7071067811865475 0.6532814824381882 -0.2705980500730984 0 0.7071067811865475 0.5 -0.5 0 0.7071067811865475 0.2705980500730985 -0.6532814824381882 0 0.7071067811865475 0 -0.7071067811865475 0 0.7071067811865475 -0.2705980500730984 -0.6532814824381882 0 0.7071067811865475 -0.5 -0.5 0 0.7071067811865475 -0.653281482438188 -0.2705980500730989 0 0.7071067811865475 -0.7071067811865475 0 0 0.7071067811865475 -0.6532814824381882 0.2705980500730986 0 0.7071067811865475 -0.5 0.5 0 0.7071067811865475 -0.2705980500730989 0.653281482438188 0.2705980500730984 0.6532814824381882 0 0.7071067811865475 0.2705980500730984 0.6532814824381882 0.2705980500730984 0.6532814824381882 0.2705980500730984 0.6532814824381882 0.5 0.5 0.2705980500730984 0.6532814824381882 0.6532814824381882 0.2705980500730984 0.2705980500730984 0.6532814824381882 0.7071067811865475 0 0.2705980500730984 0.6532814824381882 0.6532814824381882 -0.2705980500730984 0.2705980500730984 0.6532814824381882 0.5 -0.5 0.2705980500730984 0.6532814824381882 0.2705980500730985 -0.6532814824381882 0.2705980500730984 0.6532814824381882 0 -0.7071067811865475 0.2705980500730984 0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.2705980500730984 0.6532814824381882 -0.5 -0.5 0.2705980500730984 0.6532814824381882 -0.653281482438188 -0.2705980500730989 0.2705980500730984 0.6532814824381882 -0.7071067811865475 0 0.2705980500730984 0.6532814824381882 -0.6532814824381882 0.2705980500730986 0.2705980500730984 0.6532814824381882 -0.5 0.5 0.2705980500730984 0.6532814824381882 -0.2705980500730989 0.653281482438188 0.5 0.5 0 0.7071067811865475 0.5 0.5 0.2705980500730984 0.6532814824381882 0.5 0.5 0.5 0.5 0.5 0.5 0.6532814824381882 0.2705980500730984 0.5 0.5 0.7071067811865475 0 0.5 0.5 0.6532814824381882 -0.2705980500730984 0.5 0.5 0.5 -0.5 0.5 0.5 0.2705980500730985 -0.6532814824381882 0.5 0.5 0 -0.7071067811865475 0.5 0.5 -0.2705980500730984 -0.6532814824381882 0.5 0.5 -0.5 -0.5 0.5 0.5 -0.653281482438188 -0.2705980500730989 0.5 0.5 -0.7071067811865475 0 0.5 0.5 -0.6532814824381882 0.2705980500730986 0.5 0.5 -0.5 0.5 0.5 0.5 -0.2705980500730989 0.653281482438188 0.6532814824381882 0.2705980500730984 0 0.7071067811865475 0.6532814824381882 0.2705980500730984 0.2705980500730984 0.6532814824381882 0.6532814824381882 0.2705980500730984 0.5 0.5 0.6532814824381882 0.2705980500730984 0.6532814824381882 0.2705980500730984 0.6532814824381882 0.2705980500730984 0.7071067811865475 0 0.6532814824381882 0.2705980500730984 0.6532814824381882 -0.2705980500730984 0.6532814824381882 0.2705980500730984 0.5 -0.5 0.6532814824381882 0.2705980500730984 0.2705980500730985 -0.6532814824381882 0.6532814824381882 0.2705980500730984 0 -0.7071067811865475 0.6532814824381882 0.2705980500730984 -0.2705980500730984 -0.6532814824381882 0.6532814824381882 0.2705980500730984 -0.5 -0.5 0.6532814824381882 0.2705980500730984 -0.653281482438188 -0.2705980500730989 0.6532814824381882 0.2705980500730984 -0.7071067811865475 0 0.6532814824381882 0.2705980500730984 -0.6532814824381882 0.2705980500730986 0.6532814824381882 0.2705980500730984 -0.5 0.5 0.6532814824381882 0.2705980500730984 -0.2705980500730989 0.653281482438188 0.7071067811865475 0 0 0.7071067811865475 0.7071067811865475 0 0.2705980500730984 0.6532814824381882 0.7071067811865475 0 0.5 0.5 0.7071067811865475 0 0.6532814824381882 0.2705980500730984 0.7071067811865475 0 0.7071067811865475 0 0.7071067811865475 0 0.6532814824381882 -0.2705980500730984 0.7071067811865475 0 0.5 -0.5 0.7071067811865475 0 0.2705980500730985 -0.6532814824381882 0.7071067811865475 0 0 -0.7071067811865475 0.7071067811865475 0 -0.2705980500730984 -0.6532814824381882 0.7071067811865475 0 -0.5 -0.5 0.7071067811865475 0 -0.653281482438188 -0.2705980500730989 0.7071067811865475 0 -0.7071067811865475 0 0.7071067811865475 0 -0.6532814824381882 0.2705980500730986 0.7071067811865475 0 -0.5 0.5 0.7071067811865475 0 -0.2705980500730989 0.653281482438188 0.6532814824381882 -0.2705980500730984 0 0.7071067811865475 0.6532814824381882 -0.2705980500730984 0.2705980500730984 0.6532814824381882 0.6532814824381882 -0.2705980500730984 0.5 0.5 0.6532814824381882 -0.2705980500730984 0.6532814824381882 0.2705980500730984 0.6532814824381882 -0.2705980500730984 0.7071067811865475 0 0.6532814824381882 -0.2705980500730984 0.6532814824381882 -0.2705980500730984 0.6532814824381882 -0.2705980500730984 0.5 -0.5 0.6532814824381882 -0.2705980500730984 0.2705980500730985 -0.6532814824381882 0.6532814824381882 -0.2705980500730984 0 -0.7071067811865475 0.6532814824381882 -0.2705980500730984 -0.2705980500730984 -0.6532814824381882 0.6532814824381882 -0.2705980500730984 -0.5 -0.5 0.6532814824381882 -0.2705980500730984 -0.653281482438188 -0.2705980500730989 0.6532814824381882 -0.2705980500730984 -0.7071067811865475 0 0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.2705980500730986 0.6532814824381882 -0.2705980500730984 -0.5 0.5 0.6532814824381882 -0.2705980500730984 -0.2705980500730989 0.653281482438188 0.5 -0.5 0 0.7071067811865475 0.5 -0.5 0.2705980500730984 0.6532814824381882 0.5 -0.5 0.5 0.5 0.5 -0.5 0.6532814824381882 0.2705980500730984 0.5 -0.5 0.7071067811865475 0 0.5 -0.5 0.6532814824381882 -0.2705980500730984 0.5 -0.5 0.5 -0.5 0.5 -0.5 0.2705980500730985 -0.6532814824381882 0.5 -0.5 0 -0.7071067811865475 0.5 -0.5 -0.2705980500730984 -0.6532814824381882 0.5 -0.5 -0.5 -0.5 0.5 -0.5 -0.653281482438188 -0.2705980500730989 0.5 -0.5 -0.7071067811865475 0 0.5 -0.5 -0.6532814824381882 0.2705980500730986 0.5 -0.5 -0.5 0.5 0.5 -0.5 -0.2705980500730989 0.653281482438188 0.2705980500730985 -0.6532814824381882 0 0.7071067811865475 0.2705980500730985 -0.6532814824381882 0.2705980500730984 0.6532814824381882 0.2705980500730985 -0.6532814824381882 0.5 0.5 0.2705980500730985 -0.6532814824381882 0.6532814824381882 0.2705980500730984 0.2705980500730985 -0.6532814824381882 0.7071067811865475 0 0.2705980500730985 -0.6532814824381882 0.6532814824381882 -0.2705980500730984 0.2705980500730985 -0.6532814824381882 0.5 -0.5 0.2705980500730985 -0.6532814824381882 0.2705980500730985 -0.6532814824381882 0.2705980500730985 -0.6532814824381882 0 -0.7071067811865475 0.2705980500730985 -0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.2705980500730985 -0.6532814824381882 -0.5 -0.5 0.2705980500730985 -0.6532814824381882 -0.653281482438188 -0.2705980500730989 0.2705980500730985 -0.6532814824381882 -0.7071067811865475 0 0.2705980500730985 -0.6532814824381882 -0.6532814824381882 0.2705980500730986 0.2705980500730985 -0.6532814824381882 -0.5 0.5 0.2705980500730985 -0.6532814824381882 -0.2705980500730989 0.653281482438188 0 -0.7071067811865475 0 0.7071067811865475 0 -0.7071067811865475 0.2705980500730984 0.6532814824381882 0 -0.7071067811865475 0.5 0.5 0 -0.7071067811865475 0.6532814824381882 0.2705980500730984 0 -0.7071067811865475 0.7071067811865475 0 0 -0.7071067811865475 0.6532814824381882 -0.2705980500730984 0 -0.7071067811865475 0.5 -0.5 0 -0.7071067811865475 0.2705980500730985 -0.6532814824381882 0 -0.7071067811865475 0 -0.7071067811865475 0 -0.7071067811865475 -0.2705980500730984 -0.6532814824381882 0 -0.7071067811865475 -0.5 -0.5 0 -0.7071067811865475 -0.653281482438188 -0.2705980500730989 0 -0.7071067811865475 -0.7071067811865475 0 0 -0.7071067811865475 -0.6532814824381882 0.2705980500730986 0 -0.7071067811865475 -0.5 0.5 0 -0.7071067811865475 -0.2705980500730989 0.653281482438188 -0.2705980500730984 -0.6532814824381882 0 0.7071067811865475 -0.2705980500730984 -0.6532814824381882 0.2705980500730984 0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.5 0.5 -0.2705980500730984 -0.6532814824381882 0.6532814824381882 0.2705980500730984 -0.2705980500730984 -0.6532814824381882 0.7071067811865475 0 -0.2705980500730984 -0.6532814824381882 0.6532814824381882 -0.2705980500730984 -0.2705980500730984 -0.6532814824381882 0.5 -0.5 -0.2705980500730984 -0.6532814824381882 0.2705980500730985 -0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0 -0.7071067811865475 -0.2705980500730984 -0.6532814824381882 -0.2705980500730984 -0.6532814824381882 -0.2705980500730984 -0.6532814824381882 -0.5 -0.5 -0.2705980500730984 -0.6532814824381882 -0.653281482438188 -0.2705980500730989 -0.2705980500730984 -0.6532814824381882 -0.7071067811865475 0 -0.2705980500730984 -0.6532814824381882 -0.6532814824381882 0.2705980500730986 -0.2705980500730984 -0.6532814824381882 -0.5 0.5 -0.2705980500730984 -0.6532814824381882 -0.2705980500730989 0.653281482438188 -0.5 -0.5 0 0.7071067811865475 -0.5 -0.5 0.2705980500730984 0.6532814824381882 -0.5 -0.5 0.5 0.5 -0.5 -0.5 0.6532814824381882 0.2705980500730984 -0.5 -0.5 0.7071067811865475 0 -0.5 -0.5 0.6532814824381882 -0.2705980500730984 -0.5 -0.5 0.5 -0.5 -0.5 -0.5 0.2705980500730985 -0.6532814824381882 -0.5 -0.5 0 -0.7071067811865475 -0.5 -0.5 -0.2705980500730984 -0.6532814824381882 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.653281482438188 -0.2705980500730989 -0.5 -0.5 -0.7071067811865475 0 -0.5 -0.5 -0.6532814824381882 0.2705980500730986 -0.5 -0.5 -0.5 0.5 -0.5 -0.5 -0.2705980500730989 0.653281482438188 -0.653281482438188 -0.2705980500730989 0 0.7071067811865475 -0.653281482438188 -0.2705980500730989 0.2705980500730984 0.6532814824381882 -0.653281482438188 -0.2705980500730989 0.5 0.5 -0.653281482438188 -0.2705980500730989 0.6532814824381882 0.2705980500730984 -0.653281482438188 -0.2705980500730989 0.7071067811865475 0 -0.653281482438188 -0.2705980500730989 0.6532814824381882 -0.2705980500730984 -0.653281482438188 -0.2705980500730989 0.5 -0.5 -0.653281482438188 -0.2705980500730989 0.2705980500730985 -0.6532814824381882 -0.653281482438188 -0.2705980500730989 0 -0.7071067811865475 -0.653281482438188 -0.2705980500730989 -0.2705980500730984 -0.6532814824381882 -0.653281482438188 -0.2705980500730989 -0.5 -0.5 -0.653281482438188 -0.2705980500730989 -0.653281482438188 -0.2705980500730989 -0.653281482438188 -0.2705980500730989 -0.7071067811865475 0 -0.653281482438188 -0.2705980500730989 -0.6532814824381882 0.2705980500730986 -0.653281482438188 -0.2705980500730989 -0.5 0.5 -0.653281482438188 -0.2705980500730989 -0.2705980500730989 0.653281482438188 -0.7071067811865475 0 0 0.7071067811865475 -0.7071067811865475 0 0.2705980500730984 0.6532814824381882 -0.7071067811865475 0 0.5 0.5 -0.7071067811865475 0 0.6532814824381882 0.2705980500730984 -0.7071067811865475 0 0.7071067811865475 0 -0.7071067811865475 0 0.6532814824381882 -0.2705980500730984 -0.7071067811865475 0 0.5 -0.5 -0.7071067811865475 0 0.2705980500730985 -0.6532814824381882 -0.7071067811865475 0 0 -0.7071067811865475 -0.7071067811865475 0 -0.2705980500730984 -0.6532814824381882 -0.7071067811865475 0 -0.5 -0.5 -0.7071067811865475 0 -0.653281482438188 -0.2705980500730989 -0.7071067811865475 0 -0.7071067811865475 0 -0.7071067811865475 0 -0.6532814824381882 0.2705980500730986 -0.7071067811865475 0 -0.5 0.5 -0.7071067811865475 0 -0.2705980500730989 0.653281482438188 -0.6532814824381882 0.2705980500730986 0 0.7071067811865475 -0.6532814824381882 0.2705980500730986 0.2705980500730984 0.6532814824381882 -0.6532814824381882 0.2705980500730986 0.5 0.5 -0.6532814824381882 0.2705980500730986 0.6532814824381882 0.2705980500730984 -0.6532814824381882 0.2705980500730986 0.7071067811865475 0 -0.6532814824381882 0.2705980500730986 0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.2705980500730986 0.5 -0.5 -0.6532814824381882 0.2705980500730986 0.2705980500730985 -0.6532814824381882 -0.6532814824381882 0.2705980500730986 0 -0.7071067811865475 -0.6532814824381882 0.2705980500730986 -0.2705980500730984 -0.6532814824381882 -0.6532814824381882 0.2705980500730986 -0.5 -0.5 -0.6532814824381882 0.2705980500730986 -0.653281482438188 -0.2705980500730989 -0.6532814824381882 0.2705980500730986 -0.7071067811865475 0 -0.6532814824381882 0.2705980500730986 -0.6532814824381882 0.2705980500730986 -0.6532814824381882 0.2705980500730986 -0.5 0.5 -0.6532814824381882 0.2705980500730986 -0.2705980500730989 0.653281482438188 -0.5 0.5 0 0.7071067811865475 -0.5 0.5 0.2705980500730984 0.6532814824381882 -0.5 0.5 0.5 0.5 -0.5 0.5 0.6532814824381882 0.2705980500730984 -0.5 0.5 0.7071067811865475 0 -0.5 0.5 0.6532814824381882 -0.2705980500730984 -0.5 0.5 0.5 -0.5 -0.5 0.5 0.2705980500730985 -0.6532814824381882 -0.5 0.5 0 -0.7071067811865475 -0.5 0.5 -0.2705980500730984 -0.6532814824381882 -0.5 0.5 -0.5 -0.5 -0.5 0.5 -0.653281482438188 -0.2705980500730989 -0.5 0.5 -0.7071067811865475 0 -0.5 0.5 -0.6532814824381882 0.2705980500730986 -0.5 0.5 -0.5 0.5 -0.5 0.5 -0.2705980500730989 0.653281482438188 -0.2705980500730989 0.653281482438188 0 0.7071067811865475 -0.2705980500730989 0.653281482438188 0.2705980500730984 0.6532814824381882 -0.2705980500730989 0.653281482438188 0.5 0.5 -0.2705980500730989 0.653281482438188 0.6532814824381882 0.2705980500730984 -0.2705980500730989 0.653281482438188 0.7071067811865475 0 -0.2705980500730989 0.653281482438188 0.6532814824381882 -0.2705980500730984 -0.2705980500730989 0.653281482438188 0.5 -0.5 -0.2705980500730989 0.653281482438188 0.2705980500730985 -0.6532814824381882 -0.2705980500730989 0.653281482438188 0 -0.7071067811865475 -0.2705980500730989 0.653281482438188 -0.2705980500730984 -0.6532814824381882 -0.2705980500730989 0.653281482438188 -0.5 -0.5 -0.2705980500730989 0.653281482438188 -0.653281482438188 -0.2705980500730989 -0.2705980500730989 0.653281482438188 -0.7071067811865475 0 -0.2705980500730989 0.653281482438188 -0.6532814824381882 0.2705980500730986 -0.2705980500730989 0.653281482438188 -0.5 0.5 -0.2705980500730989 0.653281482438188 -0.2705980500730989 0.653281482438188 } {appearance {material {diffuse 0 1 0}} N4uvMESH 16 16 0 0.707107 0 0.707107 0 -1 0 0 0.707107 0.270598 0.653281 0 -0.92388 0.382683 0 0.707107 0.5 0.5 0 -0.794104 0.607781 0 0.707107 0.653281 0.270598 0 0.382683 -0.92388 0 0.707107 0.707107 0 0 0.678598 -0.73451 0 0.707107 0.653281 -0.270598 0 -0.626943 0.779065 0 0.707107 0.5 -0.5 0 0.794104 -0.607781 0 0.707107 0.270598 -0.653281 0 0.92388 -0.382683 0 0.707107 0 -0.707107 0 1 0 0 0.707107 -0.270598 -0.653281 0 0.92388 0.382683 0 0.707107 -0.5 -0.5 0 0.794104 0.607781 0 0.707107 -0.653281 -0.270598 0 -0.626943 -0.779065 0 0.707107 -0.707107 0 0 0.678598 0.73451 0 0.707107 -0.653281 0.270598 0 0.382683 0.92388 0 0.707107 -0.5 0.5 0 -0.794104 -0.607781 0 0.707107 -0.270598 0.653281 0 -0.92388 -0.382683 0.270598 0.653281 0 0.707107 -0.382683 -0.92388 0 0.270598 0.653281 0.270598 0.653281 -0.353553 -0.853553 0.382683 0.270598 0.653281 0.5 0.5 -0.303891 -0.733657 0.607781 0.270598 0.653281 0.653281 0.270598 0.146447 0.353553 -0.92388 0.270598 0.653281 0.707107 0 0.259688 0.626943 -0.73451 0.270598 0.653281 0.653281 -0.270598 -0.239921 -0.57922 0.779065 0.270598 0.653281 0.5 -0.5 0.303891 0.733657 -0.607781 0.270598 0.653281 0.270598 -0.653281 0.353553 0.853553 -0.382683 0.270598 0.653281 0 -0.707107 0.382683 0.92388 0 0.270598 0.653281 -0.270598 -0.653281 0.353553 0.853553 0.382683 0.270598 0.653281 -0.5 -0.5 0.303891 0.733657 0.607781 0.270598 0.653281 -0.653281 -0.270598 -0.239921 -0.57922 -0.779065 0.270598 0.653281 -0.707107 0 0.259688 0.626943 0.73451 0.270598 0.653281 -0.653281 0.270598 0.146447 0.353553 0.92388 0.270598 0.653281 -0.5 0.5 -0.303891 -0.733657 -0.607781 0.270598 0.653281 -0.270598 0.653281 -0.353553 -0.853553 -0.382683 0.5 0.5 0 0.707107 -0.707107 -0.707107 0 0.5 0.5 0.270598 0.653281 -0.653281 -0.653281 0.382683 0.5 0.5 0.5 0.5 -0.561517 -0.561517 0.607781 0.5 0.5 0.653281 0.270598 0.270598 0.270598 -0.92388 0.5 0.5 0.707107 0 0.479841 0.479841 -0.73451 0.5 0.5 0.653281 -0.270598 -0.443316 -0.443316 0.779065 0.5 0.5 0.5 -0.5 0.561517 0.561517 -0.607781 0.5 0.5 0.270598 -0.653281 0.653281 0.653281 -0.382683 0.5 0.5 0 -0.707107 0.707107 0.707107 0 0.5 0.5 -0.270598 -0.653281 0.653281 0.653281 0.382683 0.5 0.5 -0.5 -0.5 0.561517 0.561517 0.607781 0.5 0.5 -0.653281 -0.270598 -0.443316 -0.443316 -0.779065 0.5 0.5 -0.707107 0 0.479841 0.479841 0.73451 0.5 0.5 -0.653281 0.270598 0.270598 0.270598 0.92388 0.5 0.5 -0.5 0.5 -0.561517 -0.561517 -0.607781 0.5 0.5 -0.270598 0.653281 -0.653281 -0.653281 -0.382683 0.653281 0.270598 0 0.707107 -0.92388 -0.382683 0 0.653281 0.270598 0.270598 0.653281 -0.853553 -0.353553 0.382683 0.653281 0.270598 0.5 0.5 -0.733657 -0.303891 0.607781 0.653281 0.270598 0.653281 0.270598 0.353553 0.146447 -0.92388 0.653281 0.270598 0.707107 0 0.626943 0.259688 -0.73451 0.653281 0.270598 0.653281 -0.270598 -0.57922 -0.239921 0.779065 0.653281 0.270598 0.5 -0.5 0.733657 0.303891 -0.607781 0.653281 0.270598 0.270598 -0.653281 0.853553 0.353553 -0.382683 0.653281 0.270598 0 -0.707107 0.92388 0.382683 0 0.653281 0.270598 -0.270598 -0.653281 0.853553 0.353553 0.382683 0.653281 0.270598 -0.5 -0.5 0.733657 0.303891 0.607781 0.653281 0.270598 -0.653281 -0.270598 -0.57922 -0.239921 -0.779065 0.653281 0.270598 -0.707107 0 0.626943 0.259688 0.73451 0.653281 0.270598 -0.653281 0.270598 0.353553 0.146447 0.92388 0.653281 0.270598 -0.5 0.5 -0.733657 -0.303891 -0.607781 0.653281 0.270598 -0.270598 0.653281 -0.853553 -0.353553 -0.382683 0.707107 0 0 0.707107 -1 0 0 0.707107 0 0.270598 0.653281 -0.92388 0 0.382683 0.707107 0 0.5 0.5 -0.794104 0 0.607781 0.707107 0 0.653281 0.270598 0.382683 0 -0.92388 0.707107 0 0.707107 0 0.678598 0 -0.73451 0.707107 0 0.653281 -0.270598 -0.626943 0 0.779065 0.707107 0 0.5 -0.5 0.794104 0 -0.607781 0.707107 0 0.270598 -0.653281 0.92388 0 -0.382683 0.707107 0 0 -0.707107 1 0 0 0.707107 0 -0.270598 -0.653281 0.92388 0 0.382683 0.707107 0 -0.5 -0.5 0.794104 0 0.607781 0.707107 0 -0.653281 -0.270598 -0.626943 0 -0.779065 0.707107 0 -0.707107 0 0.678598 0 0.73451 0.707107 0 -0.653281 0.270598 0.382683 0 0.92388 0.707107 0 -0.5 0.5 -0.794104 0 -0.607781 0.707107 0 -0.270598 0.653281 -0.92388 0 -0.382683 0.653281 -0.270598 0 0.707107 -0.92388 0.382683 0 0.653281 -0.270598 0.270598 0.653281 -0.853553 0.353553 0.382683 0.653281 -0.270598 0.5 0.5 -0.733657 0.303891 0.607781 0.653281 -0.270598 0.653281 0.270598 0.353553 -0.146447 -0.92388 0.653281 -0.270598 0.707107 0 0.626943 -0.259688 -0.73451 0.653281 -0.270598 0.653281 -0.270598 -0.57922 0.239921 0.779065 0.653281 -0.270598 0.5 -0.5 0.733657 -0.303891 -0.607781 0.653281 -0.270598 0.270598 -0.653281 0.853553 -0.353553 -0.382683 0.653281 -0.270598 0 -0.707107 0.92388 -0.382683 0 0.653281 -0.270598 -0.270598 -0.653281 0.853553 -0.353553 0.382683 0.653281 -0.270598 -0.5 -0.5 0.733657 -0.303891 0.607781 0.653281 -0.270598 -0.653281 -0.270598 -0.57922 0.239921 -0.779065 0.653281 -0.270598 -0.707107 0 0.626943 -0.259688 0.73451 0.653281 -0.270598 -0.653281 0.270598 0.353553 -0.146447 0.92388 0.653281 -0.270598 -0.5 0.5 -0.733657 0.303891 -0.607781 0.653281 -0.270598 -0.270598 0.653281 -0.853553 0.353553 -0.382683 0.5 -0.5 0 0.707107 -0.707107 0.707107 0 0.5 -0.5 0.270598 0.653281 -0.653281 0.653281 0.382683 0.5 -0.5 0.5 0.5 -0.561517 0.561517 0.607781 0.5 -0.5 0.653281 0.270598 0.270598 -0.270598 -0.92388 0.5 -0.5 0.707107 0 0.479841 -0.479841 -0.73451 0.5 -0.5 0.653281 -0.270598 -0.443316 0.443316 0.779065 0.5 -0.5 0.5 -0.5 0.561517 -0.561517 -0.607781 0.5 -0.5 0.270598 -0.653281 0.653281 -0.653281 -0.382683 0.5 -0.5 0 -0.707107 0.707107 -0.707107 0 0.5 -0.5 -0.270598 -0.653281 0.653281 -0.653281 0.382683 0.5 -0.5 -0.5 -0.5 0.561517 -0.561517 0.607781 0.5 -0.5 -0.653281 -0.270598 -0.443316 0.443316 -0.779065 0.5 -0.5 -0.707107 0 0.479841 -0.479841 0.73451 0.5 -0.5 -0.653281 0.270598 0.270598 -0.270598 0.92388 0.5 -0.5 -0.5 0.5 -0.561517 0.561517 -0.607781 0.5 -0.5 -0.270598 0.653281 -0.653281 0.653281 -0.382683 0.270598 -0.653281 0 0.707107 -0.382683 0.92388 0 0.270598 -0.653281 0.270598 0.653281 -0.353553 0.853553 0.382683 0.270598 -0.653281 0.5 0.5 -0.303891 0.733657 0.607781 0.270598 -0.653281 0.653281 0.270598 0.146447 -0.353553 -0.92388 0.270598 -0.653281 0.707107 0 0.259688 -0.626943 -0.73451 0.270598 -0.653281 0.653281 -0.270598 -0.239921 0.57922 0.779065 0.270598 -0.653281 0.5 -0.5 0.303891 -0.733657 -0.607781 0.270598 -0.653281 0.270598 -0.653281 0.353553 -0.853553 -0.382683 0.270598 -0.653281 0 -0.707107 0.382683 -0.92388 0 0.270598 -0.653281 -0.270598 -0.653281 0.353553 -0.853553 0.382683 0.270598 -0.653281 -0.5 -0.5 0.303891 -0.733657 0.607781 0.270598 -0.653281 -0.653281 -0.270598 -0.239921 0.57922 -0.779065 0.270598 -0.653281 -0.707107 0 0.259688 -0.626943 0.73451 0.270598 -0.653281 -0.653281 0.270598 0.146447 -0.353553 0.92388 0.270598 -0.653281 -0.5 0.5 -0.303891 0.733657 -0.607781 0.270598 -0.653281 -0.270598 0.653281 -0.353553 0.853553 -0.382683 0 -0.707107 0 0.707107 0 1 0 0 -0.707107 0.270598 0.653281 0 0.92388 0.382683 0 -0.707107 0.5 0.5 0 0.794104 0.607781 0 -0.707107 0.653281 0.270598 0 -0.382683 -0.92388 0 -0.707107 0.707107 0 0 -0.678598 -0.73451 0 -0.707107 0.653281 -0.270598 0 0.626943 0.779065 0 -0.707107 0.5 -0.5 0 -0.794104 -0.607781 0 -0.707107 0.270598 -0.653281 0 -0.92388 -0.382683 0 -0.707107 0 -0.707107 0 -1 0 0 -0.707107 -0.270598 -0.653281 0 -0.92388 0.382683 0 -0.707107 -0.5 -0.5 0 -0.794104 0.607781 0 -0.707107 -0.653281 -0.270598 0 0.626943 -0.779065 0 -0.707107 -0.707107 0 0 -0.678598 0.73451 0 -0.707107 -0.653281 0.270598 0 -0.382683 0.92388 0 -0.707107 -0.5 0.5 0 0.794104 -0.607781 0 -0.707107 -0.270598 0.653281 0 0.92388 -0.382683 -0.270598 -0.653281 0 0.707107 0.382683 0.92388 0 -0.270598 -0.653281 0.270598 0.653281 0.353553 0.853553 0.382683 -0.270598 -0.653281 0.5 0.5 0.303891 0.733657 0.607781 -0.270598 -0.653281 0.653281 0.270598 -0.146447 -0.353553 -0.92388 -0.270598 -0.653281 0.707107 0 -0.259688 -0.626943 -0.73451 -0.270598 -0.653281 0.653281 -0.270598 0.239921 0.57922 0.779065 -0.270598 -0.653281 0.5 -0.5 -0.303891 -0.733657 -0.607781 -0.270598 -0.653281 0.270598 -0.653281 -0.353553 -0.853553 -0.382683 -0.270598 -0.653281 0 -0.707107 -0.382683 -0.92388 0 -0.270598 -0.653281 -0.270598 -0.653281 -0.353553 -0.853553 0.382683 -0.270598 -0.653281 -0.5 -0.5 -0.303891 -0.733657 0.607781 -0.270598 -0.653281 -0.653281 -0.270598 0.239921 0.57922 -0.779065 -0.270598 -0.653281 -0.707107 0 -0.259688 -0.626943 0.73451 -0.270598 -0.653281 -0.653281 0.270598 -0.146447 -0.353553 0.92388 -0.270598 -0.653281 -0.5 0.5 0.303891 0.733657 -0.607781 -0.270598 -0.653281 -0.270598 0.653281 0.353553 0.853553 -0.382683 -0.5 -0.5 0 0.707107 0.707107 0.707107 0 -0.5 -0.5 0.270598 0.653281 0.653281 0.653281 0.382683 -0.5 -0.5 0.5 0.5 0.561517 0.561517 0.607781 -0.5 -0.5 0.653281 0.270598 -0.270598 -0.270598 -0.92388 -0.5 -0.5 0.707107 0 -0.479841 -0.479841 -0.73451 -0.5 -0.5 0.653281 -0.270598 0.443316 0.443316 0.779065 -0.5 -0.5 0.5 -0.5 -0.561517 -0.561517 -0.607781 -0.5 -0.5 0.270598 -0.653281 -0.653281 -0.653281 -0.382683 -0.5 -0.5 0 -0.707107 -0.707107 -0.707107 0 -0.5 -0.5 -0.270598 -0.653281 -0.653281 -0.653281 0.382683 -0.5 -0.5 -0.5 -0.5 -0.561517 -0.561517 0.607781 -0.5 -0.5 -0.653281 -0.270598 0.443316 0.443316 -0.779065 -0.5 -0.5 -0.707107 0 -0.479841 -0.479841 0.73451 -0.5 -0.5 -0.653281 0.270598 -0.270598 -0.270598 0.92388 -0.5 -0.5 -0.5 0.5 0.561517 0.561517 -0.607781 -0.5 -0.5 -0.270598 0.653281 0.653281 0.653281 -0.382683 -0.653281 -0.270598 0 0.707107 0.92388 0.382683 0 -0.653281 -0.270598 0.270598 0.653281 0.853553 0.353553 0.382683 -0.653281 -0.270598 0.5 0.5 0.733657 0.303891 0.607781 -0.653281 -0.270598 0.653281 0.270598 -0.353553 -0.146447 -0.92388 -0.653281 -0.270598 0.707107 0 -0.626943 -0.259688 -0.73451 -0.653281 -0.270598 0.653281 -0.270598 0.57922 0.239921 0.779065 -0.653281 -0.270598 0.5 -0.5 -0.733657 -0.303891 -0.607781 -0.653281 -0.270598 0.270598 -0.653281 -0.853553 -0.353553 -0.382683 -0.653281 -0.270598 0 -0.707107 -0.92388 -0.382683 0 -0.653281 -0.270598 -0.270598 -0.653281 -0.853553 -0.353553 0.382683 -0.653281 -0.270598 -0.5 -0.5 -0.733657 -0.303891 0.607781 -0.653281 -0.270598 -0.653281 -0.270598 0.57922 0.239921 -0.779065 -0.653281 -0.270598 -0.707107 0 -0.626943 -0.259688 0.73451 -0.653281 -0.270598 -0.653281 0.270598 -0.353553 -0.146447 0.92388 -0.653281 -0.270598 -0.5 0.5 0.733657 0.303891 -0.607781 -0.653281 -0.270598 -0.270598 0.653281 0.853553 0.353553 -0.382683 -0.707107 0 0 0.707107 1 0 0 -0.707107 0 0.270598 0.653281 0.92388 0 0.382683 -0.707107 0 0.5 0.5 0.794104 0 0.607781 -0.707107 0 0.653281 0.270598 -0.382683 0 -0.92388 -0.707107 0 0.707107 0 -0.678598 0 -0.73451 -0.707107 0 0.653281 -0.270598 0.626943 0 0.779065 -0.707107 0 0.5 -0.5 -0.794104 0 -0.607781 -0.707107 0 0.270598 -0.653281 -0.92388 0 -0.382683 -0.707107 0 0 -0.707107 -1 0 0 -0.707107 0 -0.270598 -0.653281 -0.92388 0 0.382683 -0.707107 0 -0.5 -0.5 -0.794104 0 0.607781 -0.707107 0 -0.653281 -0.270598 0.626943 0 -0.779065 -0.707107 0 -0.707107 0 -0.678598 0 0.73451 -0.707107 0 -0.653281 0.270598 -0.382683 0 0.92388 -0.707107 0 -0.5 0.5 0.794104 0 -0.607781 -0.707107 0 -0.270598 0.653281 0.92388 0 -0.382683 -0.653281 0.270598 0 0.707107 0.92388 -0.382683 0 -0.653281 0.270598 0.270598 0.653281 0.853553 -0.353553 0.382683 -0.653281 0.270598 0.5 0.5 0.733657 -0.303891 0.607781 -0.653281 0.270598 0.653281 0.270598 -0.353553 0.146447 -0.92388 -0.653281 0.270598 0.707107 0 -0.626943 0.259688 -0.73451 -0.653281 0.270598 0.653281 -0.270598 0.57922 -0.239921 0.779065 -0.653281 0.270598 0.5 -0.5 -0.733657 0.303891 -0.607781 -0.653281 0.270598 0.270598 -0.653281 -0.853553 0.353553 -0.382683 -0.653281 0.270598 0 -0.707107 -0.92388 0.382683 0 -0.653281 0.270598 -0.270598 -0.653281 -0.853553 0.353553 0.382683 -0.653281 0.270598 -0.5 -0.5 -0.733657 0.303891 0.607781 -0.653281 0.270598 -0.653281 -0.270598 0.57922 -0.239921 -0.779065 -0.653281 0.270598 -0.707107 0 -0.626943 0.259688 0.73451 -0.653281 0.270598 -0.653281 0.270598 -0.353553 0.146447 0.92388 -0.653281 0.270598 -0.5 0.5 0.733657 -0.303891 -0.607781 -0.653281 0.270598 -0.270598 0.653281 0.853553 -0.353553 -0.382683 -0.5 0.5 0 0.707107 0.707107 -0.707107 0 -0.5 0.5 0.270598 0.653281 0.653281 -0.653281 0.382683 -0.5 0.5 0.5 0.5 0.561517 -0.561517 0.607781 -0.5 0.5 0.653281 0.270598 -0.270598 0.270598 -0.92388 -0.5 0.5 0.707107 0 -0.479841 0.479841 -0.73451 -0.5 0.5 0.653281 -0.270598 0.443316 -0.443316 0.779065 -0.5 0.5 0.5 -0.5 -0.561517 0.561517 -0.607781 -0.5 0.5 0.270598 -0.653281 -0.653281 0.653281 -0.382683 -0.5 0.5 0 -0.707107 -0.707107 0.707107 0 -0.5 0.5 -0.270598 -0.653281 -0.653281 0.653281 0.382683 -0.5 0.5 -0.5 -0.5 -0.561517 0.561517 0.607781 -0.5 0.5 -0.653281 -0.270598 0.443316 -0.443316 -0.779065 -0.5 0.5 -0.707107 0 -0.479841 0.479841 0.73451 -0.5 0.5 -0.653281 0.270598 -0.270598 0.270598 0.92388 -0.5 0.5 -0.5 0.5 0.561517 -0.561517 -0.607781 -0.5 0.5 -0.270598 0.653281 0.653281 -0.653281 -0.382683 -0.270598 0.653281 0 0.707107 0.382683 -0.92388 0 -0.270598 0.653281 0.270598 0.653281 0.353553 -0.853553 0.382683 -0.270598 0.653281 0.5 0.5 0.303891 -0.733657 0.607781 -0.270598 0.653281 0.653281 0.270598 -0.146447 0.353553 -0.92388 -0.270598 0.653281 0.707107 0 -0.259688 0.626943 -0.73451 -0.270598 0.653281 0.653281 -0.270598 0.239921 -0.57922 0.779065 -0.270598 0.653281 0.5 -0.5 -0.303891 0.733657 -0.607781 -0.270598 0.653281 0.270598 -0.653281 -0.353553 0.853553 -0.382683 -0.270598 0.653281 0 -0.707107 -0.382683 0.92388 0 -0.270598 0.653281 -0.270598 -0.653281 -0.353553 0.853553 0.382683 -0.270598 0.653281 -0.5 -0.5 -0.303891 0.733657 0.607781 -0.270598 0.653281 -0.653281 -0.270598 0.239921 -0.57922 -0.779065 -0.270598 0.653281 -0.707107 0 -0.259688 0.626943 0.73451 -0.270598 0.653281 -0.653281 0.270598 -0.146447 0.353553 0.92388 -0.270598 0.653281 -0.5 0.5 0.303891 -0.733657 -0.607781 -0.270598 0.653281 -0.270598 0.653281 0.353553 -0.853553 -0.382683 } } geomview-1.9.5/data/geom/textured/0000755000175000017500000000000012310165604014053 500000000000000geomview-1.9.5/data/geom/textured/Antenna.geom0000644000175000017500000002022012310110172016212 00000000000000appearance { shading smooth +texturing texture { file white.pgm.gz alphafile grid.pgm.gz apply modulate transform 2 0 0 0 0 2 0 0 0 0 1 0 0 0 0 1 } } # ../orbit/mkparaboloid .5 1 -t NUMESH 20 7 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0.16667 0 0.013889 -0.1644 0 0.9864 0.5833 0.5 0 0.15764 0.054117 0.013889 -0.1555 -0.05338 0.9864 0.5788 0.5271 0 0.13152 0.10237 0.013889 -0.1297 -0.101 0.9864 0.5658 0.5512 0 0.091158 0.13953 0.013889 -0.08992 -0.1376 0.9864 0.5456 0.5698 0 0.040914 0.16157 0.013889 -0.04036 -0.1594 0.9864 0.5205 0.5808 0 -0.013763 0.1661 0.013889 0.01358 -0.1638 0.9864 0.4931 0.583 0 -0.066949 0.15263 0.013889 0.06604 -0.1506 0.9864 0.4665 0.5763 0 -0.11288 0.12262 0.013889 0.1113 -0.121 0.9864 0.4436 0.5613 0 -0.14658 0.079325 0.013889 0.1446 -0.07825 0.9864 0.4267 0.5397 0 -0.16439 0.027433 0.013889 0.1622 -0.02706 0.9864 0.4178 0.5137 0 -0.16439 -0.027432 0.013889 0.1622 0.02706 0.9864 0.4178 0.4863 0 -0.14658 -0.079324 0.013889 0.1446 0.07824 0.9864 0.4267 0.4603 0 -0.11288 -0.12262 0.013889 0.1113 0.121 0.9864 0.4436 0.4387 0 -0.06695 -0.15263 0.013889 0.06604 0.1506 0.9864 0.4665 0.4237 0 -0.013764 -0.1661 0.013889 0.01358 0.1638 0.9864 0.4931 0.417 0 0.040914 -0.16157 0.013889 -0.04036 0.1594 0.9864 0.5205 0.4192 0 0.091157 -0.13953 0.013889 -0.08992 0.1376 0.9864 0.5456 0.4302 0 0.13152 -0.10237 0.013889 -0.1297 0.101 0.9864 0.5658 0.4488 0 0.15764 -0.054117 0.013889 -0.1555 0.05338 0.9864 0.5788 0.4729 0 0.16667 -8.8453e-07 0.013889 -0.1644 8.725e-07 0.9864 0.5833 0.5 0 0.33333 0 0.055556 -0.3162 0 0.9487 0.6667 0.5 0 0.31527 0.10823 0.055556 -0.2991 -0.1027 0.9487 0.6576 0.5541 0 0.26305 0.20474 0.055556 -0.2495 -0.1942 0.9487 0.6315 0.6024 0 0.18232 0.27906 0.055556 -0.173 -0.2647 0.9487 0.5912 0.6395 0 0.081829 0.32313 0.055556 -0.07763 -0.3066 0.9487 0.5409 0.6616 0 -0.027526 0.33219 0.055556 0.02611 -0.3151 0.9487 0.4862 0.6661 0 -0.1339 0.30526 0.055556 0.127 -0.2896 0.9487 0.4331 0.6526 0 -0.22576 0.24524 0.055556 0.2142 -0.2327 0.9487 0.3871 0.6226 0 -0.29316 0.15865 0.055556 0.2781 -0.1505 0.9487 0.3534 0.5793 0 -0.32879 0.054866 0.055556 0.3119 -0.05205 0.9487 0.3356 0.5274 0 -0.32879 -0.054864 0.055556 0.3119 0.05205 0.9487 0.3356 0.4726 0 -0.29316 -0.15865 0.055556 0.2781 0.1505 0.9487 0.3534 0.4207 0 -0.22576 -0.24524 0.055556 0.2142 0.2327 0.9487 0.3871 0.3774 0 -0.1339 -0.30526 0.055556 0.127 0.2896 0.9487 0.4331 0.3474 0 -0.027528 -0.33219 0.055556 0.02612 0.3151 0.9487 0.4862 0.3339 0 0.081827 -0.32313 0.055556 -0.07763 0.3066 0.9487 0.5409 0.3384 0 0.18231 -0.27906 0.055556 -0.173 0.2647 0.9487 0.5912 0.3605 0 0.26305 -0.20474 0.055556 -0.2495 0.1942 0.9487 0.6315 0.3976 0 0.31527 -0.10823 0.055556 -0.2991 0.1027 0.9487 0.6576 0.4459 0 0.33333 -1.7691e-06 0.055556 -0.3162 1.678e-06 0.9487 0.6667 0.5 0 0.5 0 0.125 -0.4472 0 0.8944 0.75 0.5 0 0.47291 0.16235 0.125 -0.423 -0.1452 0.8944 0.7365 0.5812 0 0.39457 0.30711 0.125 -0.3529 -0.2747 0.8944 0.6973 0.6536 0 0.27347 0.41858 0.125 -0.2446 -0.3744 0.8944 0.6367 0.7093 0 0.12274 0.4847 0.125 -0.1098 -0.4335 0.8944 0.5614 0.7423 0 -0.041289 0.49829 0.125 0.03693 -0.4457 0.8944 0.4794 0.7491 0 -0.20085 0.45789 0.125 0.1796 -0.4095 0.8944 0.3996 0.7289 0 -0.33864 0.36786 0.125 0.3029 -0.329 0.8944 0.3307 0.6839 0 -0.43974 0.23797 0.125 0.3933 -0.2129 0.8944 0.2801 0.619 0 -0.49318 0.082299 0.125 0.4411 -0.07361 0.8944 0.2534 0.5411 0 -0.49318 -0.082296 0.125 0.4411 0.07361 0.8944 0.2534 0.4589 0 -0.43974 -0.23797 0.125 0.3933 0.2128 0.8944 0.2801 0.381 0 -0.33864 -0.36786 0.125 0.3029 0.329 0.8944 0.3307 0.3161 0 -0.20085 -0.45789 0.125 0.1796 0.4095 0.8944 0.3996 0.2711 0 -0.041292 -0.49829 0.125 0.03693 0.4457 0.8944 0.4794 0.2509 0 0.12274 -0.4847 0.125 -0.1098 0.4335 0.8944 0.5614 0.2576 0 0.27347 -0.41858 0.125 -0.2446 0.3744 0.8944 0.6367 0.2907 0 0.39457 -0.30711 0.125 -0.3529 0.2747 0.8944 0.6973 0.3464 0 0.47291 -0.16235 0.125 -0.423 0.1452 0.8944 0.7365 0.4188 0 0.5 -2.6536e-06 0.125 -0.4472 2.373e-06 0.8944 0.75 0.5 0 0.66667 0 0.22222 -0.5547 0 0.8321 0.8333 0.5 0 0.63054 0.21647 0.22222 -0.5246 -0.1801 0.8321 0.8153 0.6082 0 0.52609 0.40947 0.22222 -0.4377 -0.3407 0.8321 0.763 0.7047 0 0.36463 0.55811 0.22222 -0.3034 -0.4644 0.8321 0.6823 0.7791 0 0.16366 0.64627 0.22222 -0.1362 -0.5377 0.8321 0.5818 0.8231 0 -0.055052 0.66439 0.22222 0.04581 -0.5528 0.8321 0.4725 0.8322 0 -0.2678 0.61052 0.22222 0.2228 -0.508 0.8321 0.3661 0.8053 0 -0.45152 0.49048 0.22222 0.3757 -0.4081 0.8321 0.2742 0.7452 0 -0.58632 0.3173 0.22222 0.4878 -0.264 0.8321 0.2068 0.6586 0 -0.65757 0.10973 0.22222 0.5471 -0.0913 0.8321 0.1712 0.5549 0 -0.65757 -0.10973 0.22222 0.5471 0.0913 0.8321 0.1712 0.4451 0 -0.58632 -0.3173 0.22222 0.4878 0.264 0.8321 0.2068 0.3414 0 -0.45152 -0.49048 0.22222 0.3757 0.4081 0.8321 0.2742 0.2548 0 -0.2678 -0.61051 0.22222 0.2228 0.508 0.8321 0.3661 0.1947 0 -0.055055 -0.66439 0.22222 0.04581 0.5528 0.8321 0.4725 0.1678 0 0.16365 -0.64627 0.22222 -0.1362 0.5377 0.8321 0.5818 0.1769 0 0.36463 -0.55811 0.22222 -0.3034 0.4644 0.8321 0.6823 0.2209 0 0.52609 -0.40948 0.22222 -0.4377 0.3407 0.8321 0.763 0.2953 0 0.63054 -0.21647 0.22222 -0.5246 0.1801 0.8321 0.8153 0.3918 0 0.66667 -3.5381e-06 0.22222 -0.5547 2.944e-06 0.8321 0.8333 0.5 0 0.83333 0 0.34722 -0.6402 0 0.7682 0.9167 0.5 0 0.78818 0.27058 0.34722 -0.6055 -0.2079 0.7682 0.8941 0.6353 0 0.65762 0.51184 0.34722 -0.5052 -0.3932 0.7682 0.8288 0.7559 0 0.45579 0.69764 0.34722 -0.3501 -0.5359 0.7682 0.7279 0.8488 0 0.20457 0.80783 0.34722 -0.1572 -0.6206 0.7682 0.6023 0.9039 0 -0.068815 0.83049 0.34722 0.05287 -0.638 0.7682 0.4656 0.9152 0 -0.33474 0.76314 0.34722 0.2572 -0.5863 0.7682 0.3326 0.8816 0 -0.5644 0.6131 0.34722 0.4336 -0.471 0.7682 0.2178 0.8066 0 -0.73289 0.39662 0.34722 0.563 -0.3047 0.7682 0.1336 0.6983 0 -0.82197 0.13716 0.34722 0.6315 -0.1054 0.7682 0.08902 0.5686 0 -0.82197 -0.13716 0.34722 0.6315 0.1054 0.7682 0.08902 0.4314 0 -0.7329 -0.39662 0.34722 0.563 0.3047 0.7682 0.1336 0.3017 0 -0.5644 -0.6131 0.34722 0.4336 0.471 0.7682 0.2178 0.1934 0 -0.33475 -0.76314 0.34722 0.2572 0.5863 0.7682 0.3326 0.1184 0 -0.068819 -0.83049 0.34722 0.05287 0.638 0.7682 0.4656 0.08476 0 0.20457 -0.80783 0.34722 -0.1572 0.6206 0.7682 0.6023 0.09608 0 0.45579 -0.69764 0.34722 -0.3501 0.5359 0.7682 0.7279 0.1512 0 0.65761 -0.51185 0.34722 -0.5052 0.3932 0.7682 0.8288 0.2441 0 0.78818 -0.27059 0.34722 -0.6055 0.2079 0.7682 0.8941 0.3647 0 0.83333 -4.4226e-06 0.34722 -0.6402 3.398e-06 0.7682 0.9167 0.5 0 1 0 0.5 -0.7071 0 0.7071 1 0.5 0 0.94582 0.3247 0.5 -0.6688 -0.2296 0.7071 0.9729 0.6623 0 0.78914 0.61421 0.5 -0.558 -0.4343 0.7071 0.8946 0.8071 0 0.54695 0.83717 0.5 -0.3868 -0.592 0.7071 0.7735 0.9186 0 0.24549 0.9694 0.5 -0.1736 -0.6855 0.7071 0.6227 0.9847 0 -0.082578 0.99658 0.5 0.05839 -0.7047 0.7071 0.4587 0.9983 0 -0.40169 0.91577 0.5 0.284 -0.6476 0.7071 0.2992 0.9579 0 -0.67728 0.73573 0.5 0.4789 -0.5202 0.7071 0.1614 0.8679 0 -0.87947 0.47595 0.5 0.6219 -0.3365 0.7071 0.06026 0.738 0 -0.98636 0.1646 0.5 0.6975 -0.1164 0.7071 0.00682 0.5823 0 -0.98636 -0.16459 0.5 0.6975 0.1164 0.7071 0.006819 0.4177 0 -0.87948 -0.47594 0.5 0.6219 0.3365 0.7071 0.06026 0.262 0 -0.67728 -0.73572 0.5 0.4789 0.5202 0.7071 0.1614 0.1321 0 -0.4017 -0.91577 0.5 0.284 0.6475 0.7071 0.2992 0.04211 0 -0.082583 -0.99658 0.5 0.0584 0.7047 0.7071 0.4587 0.001708 0 0.24548 -0.9694 0.5 -0.1736 0.6855 0.7071 0.6227 0.0153 0 0.54694 -0.83717 0.5 -0.3867 0.592 0.7071 0.7735 0.08142 0 0.78914 -0.61422 0.5 -0.558 0.4343 0.7071 0.8946 0.1929 0 0.94582 -0.3247 0.5 -0.6688 0.2296 0.7071 0.9729 0.3376 0 1 -5.3072e-06 0.5 -0.7071 3.753e-06 0.7071 1 0.5 0 geomview-1.9.5/data/geom/textured/GCGball0000644000175000017500000006017512310110172015150 00000000000000# ../solar/junk/mkearthtx -stereographic 28 14 appearance { *-evert -backcull +texturing shading smooth texture { #clamp st file geologo.pgm.gz transform 1.5 0 0 0 0 1.5 0 0 0 0 1 0 -.25 -.25 0 1 } } # We could also use: # # STSPHERE STEREOGRAPHIC 1 0 0 0 # # Make sure to disable backculling in this case. # NUMESH 29 14 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.2393 0.0000 0.9709 0.239 0.000 0.971 0.6214 0.5000 0 0.2333 0.0533 0.9709 0.233 0.053 0.971 0.6184 0.5270 0 0.2156 0.1038 0.9709 0.216 0.104 0.971 0.6094 0.5527 0 0.1871 0.1492 0.9709 0.187 0.149 0.971 0.5949 0.5757 0 0.1492 0.1871 0.9709 0.149 0.187 0.971 0.5757 0.5949 0 0.1038 0.2156 0.9709 0.104 0.216 0.971 0.5527 0.6094 0 0.0533 0.2333 0.9709 0.053 0.233 0.971 0.5270 0.6184 0 0.0000 0.2393 0.9709 0.000 0.239 0.971 0.5000 0.6214 0 -0.0533 0.2333 0.9709 -0.053 0.233 0.971 0.4730 0.6184 0 -0.1038 0.2156 0.9709 -0.104 0.216 0.971 0.4473 0.6094 0 -0.1492 0.1871 0.9709 -0.149 0.187 0.971 0.4243 0.5949 0 -0.1871 0.1492 0.9709 -0.187 0.149 0.971 0.4051 0.5757 0 -0.2156 0.1038 0.9709 -0.216 0.104 0.971 0.3906 0.5527 0 -0.2333 0.0533 0.9709 -0.233 0.053 0.971 0.3816 0.5270 0 -0.2393 0.0000 0.9709 -0.239 0.000 0.971 0.3786 0.5000 0 -0.2333 -0.0533 0.9709 -0.233 -0.053 0.971 0.3816 0.4730 0 -0.2156 -0.1038 0.9709 -0.216 -0.104 0.971 0.3906 0.4473 0 -0.1871 -0.1492 0.9709 -0.187 -0.149 0.971 0.4051 0.4243 0 -0.1492 -0.1871 0.9709 -0.149 -0.187 0.971 0.4243 0.4051 0 -0.1038 -0.2156 0.9709 -0.104 -0.216 0.971 0.4473 0.3906 0 -0.0533 -0.2333 0.9709 -0.053 -0.233 0.971 0.4730 0.3816 0 0.0000 -0.2393 0.9709 0.000 -0.239 0.971 0.5000 0.3786 0 0.0533 -0.2333 0.9709 0.053 -0.233 0.971 0.5270 0.3816 0 0.1038 -0.2156 0.9709 0.104 -0.216 0.971 0.5527 0.3906 0 0.1492 -0.1871 0.9709 0.149 -0.187 0.971 0.5757 0.4051 0 0.1871 -0.1492 0.9709 0.187 -0.149 0.971 0.5949 0.4243 0 0.2156 -0.1038 0.9709 0.216 -0.104 0.971 0.6094 0.4473 0 0.2333 -0.0533 0.9709 0.233 -0.053 0.971 0.6184 0.4730 0 0.2393 0.0000 0.9709 0.239 0.000 0.971 0.6214 0.5000 0 0.4647 0.0000 0.8855 0.465 0.000 0.885 0.7465 0.5000 0 0.4531 0.1034 0.8855 0.453 0.103 0.885 0.7403 0.5548 0 0.4187 0.2016 0.8855 0.419 0.202 0.885 0.7221 0.6069 0 0.3633 0.2898 0.8855 0.363 0.290 0.885 0.6927 0.6537 0 0.2898 0.3633 0.8855 0.290 0.363 0.885 0.6537 0.6927 0 0.2016 0.4187 0.8855 0.202 0.419 0.885 0.6069 0.7221 0 0.1034 0.4531 0.8855 0.103 0.453 0.885 0.5548 0.7403 0 0.0000 0.4647 0.8855 0.000 0.465 0.885 0.5000 0.7465 0 -0.1034 0.4531 0.8855 -0.103 0.453 0.885 0.4452 0.7403 0 -0.2016 0.4187 0.8855 -0.202 0.419 0.885 0.3931 0.7221 0 -0.2898 0.3633 0.8855 -0.290 0.363 0.885 0.3463 0.6927 0 -0.3633 0.2898 0.8855 -0.363 0.290 0.885 0.3073 0.6537 0 -0.4187 0.2016 0.8855 -0.419 0.202 0.885 0.2779 0.6069 0 -0.4531 0.1034 0.8855 -0.453 0.103 0.885 0.2597 0.5548 0 -0.4647 0.0000 0.8855 -0.465 0.000 0.885 0.2535 0.5000 0 -0.4531 -0.1034 0.8855 -0.453 -0.103 0.885 0.2597 0.4452 0 -0.4187 -0.2016 0.8855 -0.419 -0.202 0.885 0.2779 0.3931 0 -0.3633 -0.2898 0.8855 -0.363 -0.290 0.885 0.3073 0.3463 0 -0.2898 -0.3633 0.8855 -0.290 -0.363 0.885 0.3463 0.3073 0 -0.2016 -0.4187 0.8855 -0.202 -0.419 0.885 0.3931 0.2779 0 -0.1034 -0.4531 0.8855 -0.103 -0.453 0.885 0.4452 0.2597 0 0.0000 -0.4647 0.8855 0.000 -0.465 0.885 0.5000 0.2535 0 0.1034 -0.4531 0.8855 0.103 -0.453 0.885 0.5548 0.2597 0 0.2016 -0.4187 0.8855 0.202 -0.419 0.885 0.6069 0.2779 0 0.2898 -0.3633 0.8855 0.290 -0.363 0.885 0.6537 0.3073 0 0.3633 -0.2898 0.8855 0.363 -0.290 0.885 0.6927 0.3463 0 0.4187 -0.2016 0.8855 0.419 -0.202 0.885 0.7221 0.3931 0 0.4531 -0.1034 0.8855 0.453 -0.103 0.885 0.7403 0.4452 0 0.4647 0.0000 0.8855 0.465 0.000 0.885 0.7465 0.5000 0 0.6631 0.0000 0.7485 0.663 0.000 0.749 0.8792 0.5000 0 0.6465 0.1476 0.7485 0.646 0.148 0.749 0.8697 0.5844 0 0.5975 0.2877 0.7485 0.597 0.288 0.749 0.8417 0.6646 0 0.5185 0.4135 0.7485 0.518 0.413 0.749 0.7965 0.7365 0 0.4135 0.5185 0.7485 0.413 0.518 0.749 0.7365 0.7965 0 0.2877 0.5975 0.7485 0.288 0.597 0.749 0.6646 0.8417 0 0.1476 0.6465 0.7485 0.148 0.646 0.749 0.5844 0.8697 0 0.0000 0.6631 0.7485 0.000 0.663 0.749 0.5000 0.8792 0 -0.1476 0.6465 0.7485 -0.148 0.646 0.749 0.4156 0.8697 0 -0.2877 0.5975 0.7485 -0.288 0.597 0.749 0.3354 0.8417 0 -0.4135 0.5185 0.7485 -0.413 0.518 0.749 0.2635 0.7965 0 -0.5185 0.4135 0.7485 -0.518 0.413 0.749 0.2035 0.7365 0 -0.5975 0.2877 0.7485 -0.597 0.288 0.749 0.1583 0.6646 0 -0.6465 0.1476 0.7485 -0.646 0.148 0.749 0.1303 0.5844 0 -0.6631 0.0000 0.7485 -0.663 0.000 0.749 0.1208 0.5000 0 -0.6465 -0.1476 0.7485 -0.646 -0.148 0.749 0.1303 0.4156 0 -0.5975 -0.2877 0.7485 -0.597 -0.288 0.749 0.1583 0.3354 0 -0.5185 -0.4135 0.7485 -0.518 -0.413 0.749 0.2035 0.2635 0 -0.4135 -0.5185 0.7485 -0.413 -0.518 0.749 0.2635 0.2035 0 -0.2877 -0.5975 0.7485 -0.288 -0.597 0.749 0.3354 0.1583 0 -0.1476 -0.6465 0.7485 -0.148 -0.646 0.749 0.4156 0.1303 0 0.0000 -0.6631 0.7485 0.000 -0.663 0.749 0.5000 0.1208 0 0.1476 -0.6465 0.7485 0.148 -0.646 0.749 0.5844 0.1303 0 0.2877 -0.5975 0.7485 0.288 -0.597 0.749 0.6646 0.1583 0 0.4135 -0.5185 0.7485 0.413 -0.518 0.749 0.7365 0.2035 0 0.5185 -0.4135 0.7485 0.518 -0.413 0.749 0.7965 0.2635 0 0.5975 -0.2877 0.7485 0.597 -0.288 0.749 0.8417 0.3354 0 0.6465 -0.1476 0.7485 0.646 -0.148 0.749 0.8697 0.4156 0 0.6631 0.0000 0.7485 0.663 0.000 0.749 0.8792 0.5000 0 0.8230 0.0000 0.5681 0.823 0.000 0.568 1.0248 0.5000 0 0.8023 0.1831 0.5681 0.802 0.183 0.568 1.0117 0.6168 0 0.7415 0.3571 0.5681 0.741 0.357 0.568 0.9729 0.7277 0 0.6434 0.5131 0.5681 0.643 0.513 0.568 0.9103 0.8272 0 0.5131 0.6434 0.5681 0.513 0.643 0.568 0.8272 0.9103 0 0.3571 0.7415 0.5681 0.357 0.741 0.568 0.7277 0.9729 0 0.1831 0.8023 0.5681 0.183 0.802 0.568 0.6168 1.0117 0 0.0000 0.8230 0.5681 0.000 0.823 0.568 0.5000 1.0248 0 -0.1831 0.8023 0.5681 -0.183 0.802 0.568 0.3832 1.0117 0 -0.3571 0.7415 0.5681 -0.357 0.741 0.568 0.2723 0.9729 0 -0.5131 0.6434 0.5681 -0.513 0.643 0.568 0.1728 0.9103 0 -0.6434 0.5131 0.5681 -0.643 0.513 0.568 0.0897 0.8272 0 -0.7415 0.3571 0.5681 -0.741 0.357 0.568 0.0271 0.7277 0 -0.8023 0.1831 0.5681 -0.802 0.183 0.568 -0.0117 0.6168 0 -0.8230 0.0000 0.5681 -0.823 0.000 0.568 -0.0248 0.5000 0 -0.8023 -0.1831 0.5681 -0.802 -0.183 0.568 -0.0117 0.3832 0 -0.7415 -0.3571 0.5681 -0.741 -0.357 0.568 0.0271 0.2723 0 -0.6434 -0.5131 0.5681 -0.643 -0.513 0.568 0.0897 0.1728 0 -0.5131 -0.6434 0.5681 -0.513 -0.643 0.568 0.1728 0.0897 0 -0.3571 -0.7415 0.5681 -0.357 -0.741 0.568 0.2723 0.0271 0 -0.1831 -0.8023 0.5681 -0.183 -0.802 0.568 0.3832 -0.0117 0 0.0000 -0.8230 0.5681 0.000 -0.823 0.568 0.5000 -0.0248 0 0.1831 -0.8023 0.5681 0.183 -0.802 0.568 0.6168 -0.0117 0 0.3571 -0.7415 0.5681 0.357 -0.741 0.568 0.7277 0.0271 0 0.5131 -0.6434 0.5681 0.513 -0.643 0.568 0.8272 0.0897 0 0.6434 -0.5131 0.5681 0.643 -0.513 0.568 0.9103 0.1728 0 0.7415 -0.3571 0.5681 0.741 -0.357 0.568 0.9729 0.2723 0 0.8023 -0.1831 0.5681 0.802 -0.183 0.568 1.0117 0.3832 0 0.8230 0.0000 0.5681 0.823 0.000 0.568 1.0248 0.5000 0 0.9350 0.0000 0.3546 0.935 0.000 0.355 1.1903 0.5000 0 0.9116 0.2081 0.3546 0.912 0.208 0.355 1.1729 0.6536 0 0.8424 0.4057 0.3546 0.842 0.406 0.355 1.1219 0.7995 0 0.7310 0.5830 0.3546 0.731 0.583 0.355 1.0397 0.9304 0 0.5830 0.7310 0.3546 0.583 0.731 0.355 0.9304 1.0397 0 0.4057 0.8424 0.3546 0.406 0.842 0.355 0.7995 1.1219 0 0.2081 0.9116 0.3546 0.208 0.912 0.355 0.6536 1.1729 0 0.0000 0.9350 0.3546 0.000 0.935 0.355 0.5000 1.1903 0 -0.2081 0.9116 0.3546 -0.208 0.912 0.355 0.3464 1.1729 0 -0.4057 0.8424 0.3546 -0.406 0.842 0.355 0.2005 1.1219 0 -0.5830 0.7310 0.3546 -0.583 0.731 0.355 0.0696 1.0397 0 -0.7310 0.5830 0.3546 -0.731 0.583 0.355 -0.0397 0.9304 0 -0.8424 0.4057 0.3546 -0.842 0.406 0.355 -0.1219 0.7995 0 -0.9116 0.2081 0.3546 -0.912 0.208 0.355 -0.1729 0.6536 0 -0.9350 0.0000 0.3546 -0.935 0.000 0.355 -0.1903 0.5000 0 -0.9116 -0.2081 0.3546 -0.912 -0.208 0.355 -0.1729 0.3464 0 -0.8424 -0.4057 0.3546 -0.842 -0.406 0.355 -0.1219 0.2005 0 -0.7310 -0.5830 0.3546 -0.731 -0.583 0.355 -0.0397 0.0696 0 -0.5830 -0.7310 0.3546 -0.583 -0.731 0.355 0.0696 -0.0397 0 -0.4057 -0.8424 0.3546 -0.406 -0.842 0.355 0.2005 -0.1219 0 -0.2081 -0.9116 0.3546 -0.208 -0.912 0.355 0.3464 -0.1729 0 0.0000 -0.9350 0.3546 0.000 -0.935 0.355 0.5000 -0.1903 0 0.2081 -0.9116 0.3546 0.208 -0.912 0.355 0.6536 -0.1729 0 0.4057 -0.8424 0.3546 0.406 -0.842 0.355 0.7995 -0.1219 0 0.5830 -0.7310 0.3546 0.583 -0.731 0.355 0.9304 -0.0397 0 0.7310 -0.5830 0.3546 0.731 -0.583 0.355 1.0397 0.0696 0 0.8424 -0.4057 0.3546 0.842 -0.406 0.355 1.1219 0.2005 0 0.9116 -0.2081 0.3546 0.912 -0.208 0.355 1.1729 0.3464 0 0.9350 0.0000 0.3546 0.935 0.000 0.355 1.1903 0.5000 0 0.9927 0.0000 0.1205 0.993 0.000 0.121 1.3859 0.5000 0 0.9678 0.2209 0.1205 0.968 0.221 0.121 1.3637 0.6971 0 0.8944 0.4307 0.1205 0.894 0.431 0.121 1.2982 0.8844 0 0.7761 0.6189 0.1205 0.776 0.619 0.121 1.1926 1.0524 0 0.6189 0.7761 0.1205 0.619 0.776 0.121 1.0524 1.1926 0 0.4307 0.8944 0.1205 0.431 0.894 0.121 0.8844 1.2982 0 0.2209 0.9678 0.1205 0.221 0.968 0.121 0.6971 1.3637 0 0.0000 0.9927 0.1205 0.000 0.993 0.121 0.5000 1.3859 0 -0.2209 0.9678 0.1205 -0.221 0.968 0.121 0.3029 1.3637 0 -0.4307 0.8944 0.1205 -0.431 0.894 0.121 0.1156 1.2982 0 -0.6189 0.7761 0.1205 -0.619 0.776 0.121 -0.0524 1.1926 0 -0.7761 0.6189 0.1205 -0.776 0.619 0.121 -0.1926 1.0524 0 -0.8944 0.4307 0.1205 -0.894 0.431 0.121 -0.2982 0.8844 0 -0.9678 0.2209 0.1205 -0.968 0.221 0.121 -0.3637 0.6971 0 -0.9927 0.0000 0.1205 -0.993 0.000 0.121 -0.3859 0.5000 0 -0.9678 -0.2209 0.1205 -0.968 -0.221 0.121 -0.3637 0.3029 0 -0.8944 -0.4307 0.1205 -0.894 -0.431 0.121 -0.2982 0.1156 0 -0.7761 -0.6189 0.1205 -0.776 -0.619 0.121 -0.1926 -0.0524 0 -0.6189 -0.7761 0.1205 -0.619 -0.776 0.121 -0.0524 -0.1926 0 -0.4307 -0.8944 0.1205 -0.431 -0.894 0.121 0.1156 -0.2982 0 -0.2209 -0.9678 0.1205 -0.221 -0.968 0.121 0.3029 -0.3637 0 0.0000 -0.9927 0.1205 0.000 -0.993 0.121 0.5000 -0.3859 0 0.2209 -0.9678 0.1205 0.221 -0.968 0.121 0.6971 -0.3637 0 0.4307 -0.8944 0.1205 0.431 -0.894 0.121 0.8844 -0.2982 0 0.6189 -0.7761 0.1205 0.619 -0.776 0.121 1.0524 -0.1926 0 0.7761 -0.6189 0.1205 0.776 -0.619 0.121 1.1926 -0.0524 0 0.8944 -0.4307 0.1205 0.894 -0.431 0.121 1.2982 0.1156 0 0.9678 -0.2209 0.1205 0.968 -0.221 0.121 1.3637 0.3029 0 0.9927 0.0000 0.1205 0.993 0.000 0.121 1.3859 0.5000 0 0.9927 0.0000 -0.1205 0.993 0.000 -0.121 1.6288 0.5000 0 0.9678 0.2209 -0.1205 0.968 0.221 -0.121 1.6005 0.7512 0 0.8944 0.4307 -0.1205 0.894 0.431 -0.121 1.5170 0.9898 0 0.7761 0.6189 -0.1205 0.776 0.619 -0.121 1.3825 1.2038 0 0.6189 0.7761 -0.1205 0.619 0.776 -0.121 1.2038 1.3825 0 0.4307 0.8944 -0.1205 0.431 0.894 -0.121 0.9898 1.5170 0 0.2209 0.9678 -0.1205 0.221 0.968 -0.121 0.7512 1.6005 0 0.0000 0.9927 -0.1205 0.000 0.993 -0.121 0.5000 1.6288 0 -0.2209 0.9678 -0.1205 -0.221 0.968 -0.121 0.2488 1.6005 0 -0.4307 0.8944 -0.1205 -0.431 0.894 -0.121 0.0102 1.5170 0 -0.6189 0.7761 -0.1205 -0.619 0.776 -0.121 -0.2038 1.3825 0 -0.7761 0.6189 -0.1205 -0.776 0.619 -0.121 -0.3825 1.2038 0 -0.8944 0.4307 -0.1205 -0.894 0.431 -0.121 -0.5170 0.9898 0 -0.9678 0.2209 -0.1205 -0.968 0.221 -0.121 -0.6005 0.7512 0 -0.9927 0.0000 -0.1205 -0.993 0.000 -0.121 -0.6288 0.5000 0 -0.9678 -0.2209 -0.1205 -0.968 -0.221 -0.121 -0.6005 0.2488 0 -0.8944 -0.4307 -0.1205 -0.894 -0.431 -0.121 -0.5170 0.0102 0 -0.7761 -0.6189 -0.1205 -0.776 -0.619 -0.121 -0.3825 -0.2038 0 -0.6189 -0.7761 -0.1205 -0.619 -0.776 -0.121 -0.2038 -0.3825 0 -0.4307 -0.8944 -0.1205 -0.431 -0.894 -0.121 0.0102 -0.5170 0 -0.2209 -0.9678 -0.1205 -0.221 -0.968 -0.121 0.2488 -0.6005 0 0.0000 -0.9927 -0.1205 0.000 -0.993 -0.121 0.5000 -0.6288 0 0.2209 -0.9678 -0.1205 0.221 -0.968 -0.121 0.7512 -0.6005 0 0.4307 -0.8944 -0.1205 0.431 -0.894 -0.121 0.9898 -0.5170 0 0.6189 -0.7761 -0.1205 0.619 -0.776 -0.121 1.2038 -0.3825 0 0.7761 -0.6189 -0.1205 0.776 -0.619 -0.121 1.3825 -0.2038 0 0.8944 -0.4307 -0.1205 0.894 -0.431 -0.121 1.5170 0.0102 0 0.9678 -0.2209 -0.1205 0.968 -0.221 -0.121 1.6005 0.2488 0 0.9927 0.0000 -0.1205 0.993 0.000 -0.121 1.6288 0.5000 0 0.9350 0.0000 -0.3546 0.935 0.000 -0.355 1.9488 0.5000 0 0.9116 0.2081 -0.3546 0.912 0.208 -0.355 1.9124 0.8224 0 0.8424 0.4057 -0.3546 0.842 0.406 -0.355 1.8053 1.1286 0 0.7310 0.5830 -0.3546 0.731 0.583 -0.355 1.6327 1.4033 0 0.5830 0.7310 -0.3546 0.583 0.731 -0.355 1.4033 1.6327 0 0.4057 0.8424 -0.3546 0.406 0.842 -0.355 1.1286 1.8053 0 0.2081 0.9116 -0.3546 0.208 0.912 -0.355 0.8224 1.9124 0 0.0000 0.9350 -0.3546 0.000 0.935 -0.355 0.5000 1.9488 0 -0.2081 0.9116 -0.3546 -0.208 0.912 -0.355 0.1776 1.9124 0 -0.4057 0.8424 -0.3546 -0.406 0.842 -0.355 -0.1286 1.8053 0 -0.5830 0.7310 -0.3546 -0.583 0.731 -0.355 -0.4033 1.6327 0 -0.7310 0.5830 -0.3546 -0.731 0.583 -0.355 -0.6327 1.4033 0 -0.8424 0.4057 -0.3546 -0.842 0.406 -0.355 -0.8053 1.1286 0 -0.9116 0.2081 -0.3546 -0.912 0.208 -0.355 -0.9124 0.8224 0 -0.9350 0.0000 -0.3546 -0.935 0.000 -0.355 -0.9488 0.5000 0 -0.9116 -0.2081 -0.3546 -0.912 -0.208 -0.355 -0.9124 0.1776 0 -0.8424 -0.4057 -0.3546 -0.842 -0.406 -0.355 -0.8053 -0.1286 0 -0.7310 -0.5830 -0.3546 -0.731 -0.583 -0.355 -0.6327 -0.4033 0 -0.5830 -0.7310 -0.3546 -0.583 -0.731 -0.355 -0.4033 -0.6327 0 -0.4057 -0.8424 -0.3546 -0.406 -0.842 -0.355 -0.1286 -0.8053 0 -0.2081 -0.9116 -0.3546 -0.208 -0.912 -0.355 0.1776 -0.9124 0 0.0000 -0.9350 -0.3546 0.000 -0.935 -0.355 0.5000 -0.9488 0 0.2081 -0.9116 -0.3546 0.208 -0.912 -0.355 0.8224 -0.9124 0 0.4057 -0.8424 -0.3546 0.406 -0.842 -0.355 1.1286 -0.8053 0 0.5830 -0.7310 -0.3546 0.583 -0.731 -0.355 1.4033 -0.6327 0 0.7310 -0.5830 -0.3546 0.731 -0.583 -0.355 1.6327 -0.4033 0 0.8424 -0.4057 -0.3546 0.842 -0.406 -0.355 1.8053 -0.1286 0 0.9116 -0.2081 -0.3546 0.912 -0.208 -0.355 1.9124 0.1776 0 0.9350 0.0000 -0.3546 0.935 0.000 -0.355 1.9488 0.5000 0 0.8230 0.0000 -0.5681 0.823 0.000 -0.568 2.4053 0.5000 0 0.8023 0.1831 -0.5681 0.802 0.183 -0.568 2.3576 0.9240 0 0.7415 0.3571 -0.5681 0.741 0.357 -0.568 2.2167 1.3267 0 0.6434 0.5131 -0.5681 0.643 0.513 -0.568 1.9897 1.6880 0 0.5131 0.6434 -0.5681 0.513 0.643 -0.568 1.6880 1.9897 0 0.3571 0.7415 -0.5681 0.357 0.741 -0.568 1.3267 2.2167 0 0.1831 0.8023 -0.5681 0.183 0.802 -0.568 0.9240 2.3576 0 0.0000 0.8230 -0.5681 0.000 0.823 -0.568 0.5000 2.4053 0 -0.1831 0.8023 -0.5681 -0.183 0.802 -0.568 0.0760 2.3576 0 -0.3571 0.7415 -0.5681 -0.357 0.741 -0.568 -0.3267 2.2167 0 -0.5131 0.6434 -0.5681 -0.513 0.643 -0.568 -0.6880 1.9897 0 -0.6434 0.5131 -0.5681 -0.643 0.513 -0.568 -0.9897 1.6880 0 -0.7415 0.3571 -0.5681 -0.741 0.357 -0.568 -1.2167 1.3267 0 -0.8023 0.1831 -0.5681 -0.802 0.183 -0.568 -1.3576 0.9240 0 -0.8230 0.0000 -0.5681 -0.823 0.000 -0.568 -1.4053 0.5000 0 -0.8023 -0.1831 -0.5681 -0.802 -0.183 -0.568 -1.3576 0.0760 0 -0.7415 -0.3571 -0.5681 -0.741 -0.357 -0.568 -1.2167 -0.3267 0 -0.6434 -0.5131 -0.5681 -0.643 -0.513 -0.568 -0.9897 -0.6880 0 -0.5131 -0.6434 -0.5681 -0.513 -0.643 -0.568 -0.6880 -0.9897 0 -0.3571 -0.7415 -0.5681 -0.357 -0.741 -0.568 -0.3267 -1.2167 0 -0.1831 -0.8023 -0.5681 -0.183 -0.802 -0.568 0.0760 -1.3576 0 0.0000 -0.8230 -0.5681 0.000 -0.823 -0.568 0.5000 -1.4053 0 0.1831 -0.8023 -0.5681 0.183 -0.802 -0.568 0.9240 -1.3576 0 0.3571 -0.7415 -0.5681 0.357 -0.741 -0.568 1.3267 -1.2167 0 0.5131 -0.6434 -0.5681 0.513 -0.643 -0.568 1.6880 -0.9897 0 0.6434 -0.5131 -0.5681 0.643 -0.513 -0.568 1.9897 -0.6880 0 0.7415 -0.3571 -0.5681 0.741 -0.357 -0.568 2.2167 -0.3267 0 0.8023 -0.1831 -0.5681 0.802 -0.183 -0.568 2.3576 0.0760 0 0.8230 0.0000 -0.5681 0.823 0.000 -0.568 2.4053 0.5000 0 0.6631 0.0000 -0.7485 0.663 0.000 -0.749 3.1368 0.5000 0 0.6465 0.1476 -0.7485 0.646 0.148 -0.749 3.0707 1.0867 0 0.5975 0.2877 -0.7485 0.597 0.288 -0.749 2.8757 1.6441 0 0.5185 0.4135 -0.7485 0.518 0.413 -0.749 2.5615 2.1440 0 0.4135 0.5185 -0.7485 0.413 0.518 -0.749 2.1440 2.5615 0 0.2877 0.5975 -0.7485 0.288 0.597 -0.749 1.6441 2.8757 0 0.1476 0.6465 -0.7485 0.148 0.646 -0.749 1.0867 3.0707 0 0.0000 0.6631 -0.7485 0.000 0.663 -0.749 0.5000 3.1368 0 -0.1476 0.6465 -0.7485 -0.148 0.646 -0.749 -0.0867 3.0707 0 -0.2877 0.5975 -0.7485 -0.288 0.597 -0.749 -0.6441 2.8757 0 -0.4135 0.5185 -0.7485 -0.413 0.518 -0.749 -1.1440 2.5615 0 -0.5185 0.4135 -0.7485 -0.518 0.413 -0.749 -1.5615 2.1440 0 -0.5975 0.2877 -0.7485 -0.597 0.288 -0.749 -1.8757 1.6441 0 -0.6465 0.1476 -0.7485 -0.646 0.148 -0.749 -2.0707 1.0867 0 -0.6631 0.0000 -0.7485 -0.663 0.000 -0.749 -2.1368 0.5000 0 -0.6465 -0.1476 -0.7485 -0.646 -0.148 -0.749 -2.0707 -0.0867 0 -0.5975 -0.2877 -0.7485 -0.597 -0.288 -0.749 -1.8757 -0.6441 0 -0.5185 -0.4135 -0.7485 -0.518 -0.413 -0.749 -1.5615 -1.1440 0 -0.4135 -0.5185 -0.7485 -0.413 -0.518 -0.749 -1.1440 -1.5615 0 -0.2877 -0.5975 -0.7485 -0.288 -0.597 -0.749 -0.6441 -1.8757 0 -0.1476 -0.6465 -0.7485 -0.148 -0.646 -0.749 -0.0867 -2.0707 0 0.0000 -0.6631 -0.7485 0.000 -0.663 -0.749 0.5000 -2.1368 0 0.1476 -0.6465 -0.7485 0.148 -0.646 -0.749 1.0867 -2.0707 0 0.2877 -0.5975 -0.7485 0.288 -0.597 -0.749 1.6441 -1.8757 0 0.4135 -0.5185 -0.7485 0.413 -0.518 -0.749 2.1440 -1.5615 0 0.5185 -0.4135 -0.7485 0.518 -0.413 -0.749 2.5615 -1.1440 0 0.5975 -0.2877 -0.7485 0.597 -0.288 -0.749 2.8757 -0.6441 0 0.6465 -0.1476 -0.7485 0.646 -0.148 -0.749 3.0707 -0.0867 0 0.6631 0.0000 -0.7485 0.663 0.000 -0.749 3.1368 0.5000 0 0.4647 0.0000 -0.8855 0.465 0.000 -0.885 4.5572 0.5000 0 0.4531 0.1034 -0.8855 0.453 0.103 -0.885 4.4554 1.4028 0 0.4187 0.2016 -0.8855 0.419 0.202 -0.885 4.1554 2.2603 0 0.3633 0.2898 -0.8855 0.363 0.290 -0.885 3.6720 3.0296 0 0.2898 0.3633 -0.8855 0.290 0.363 -0.885 3.0296 3.6720 0 0.2016 0.4187 -0.8855 0.202 0.419 -0.885 2.2603 4.1554 0 0.1034 0.4531 -0.8855 0.103 0.453 -0.885 1.4028 4.4554 0 0.0000 0.4647 -0.8855 0.000 0.465 -0.885 0.5000 4.5572 0 -0.1034 0.4531 -0.8855 -0.103 0.453 -0.885 -0.4028 4.4554 0 -0.2016 0.4187 -0.8855 -0.202 0.419 -0.885 -1.2603 4.1554 0 -0.2898 0.3633 -0.8855 -0.290 0.363 -0.885 -2.0296 3.6720 0 -0.3633 0.2898 -0.8855 -0.363 0.290 -0.885 -2.6720 3.0296 0 -0.4187 0.2016 -0.8855 -0.419 0.202 -0.885 -3.1554 2.2603 0 -0.4531 0.1034 -0.8855 -0.453 0.103 -0.885 -3.4554 1.4028 0 -0.4647 0.0000 -0.8855 -0.465 0.000 -0.885 -3.5572 0.5000 0 -0.4531 -0.1034 -0.8855 -0.453 -0.103 -0.885 -3.4554 -0.4028 0 -0.4187 -0.2016 -0.8855 -0.419 -0.202 -0.885 -3.1554 -1.2603 0 -0.3633 -0.2898 -0.8855 -0.363 -0.290 -0.885 -2.6720 -2.0296 0 -0.2898 -0.3633 -0.8855 -0.290 -0.363 -0.885 -2.0296 -2.6720 0 -0.2016 -0.4187 -0.8855 -0.202 -0.419 -0.885 -1.2603 -3.1554 0 -0.1034 -0.4531 -0.8855 -0.103 -0.453 -0.885 -0.4028 -3.4554 0 0.0000 -0.4647 -0.8855 0.000 -0.465 -0.885 0.5000 -3.5572 0 0.1034 -0.4531 -0.8855 0.103 -0.453 -0.885 1.4028 -3.4554 0 0.2016 -0.4187 -0.8855 0.202 -0.419 -0.885 2.2603 -3.1554 0 0.2898 -0.3633 -0.8855 0.290 -0.363 -0.885 3.0296 -2.6720 0 0.3633 -0.2898 -0.8855 0.363 -0.290 -0.885 3.6720 -2.0296 0 0.4187 -0.2016 -0.8855 0.419 -0.202 -0.885 4.1554 -1.2603 0 0.4531 -0.1034 -0.8855 0.453 -0.103 -0.885 4.4554 -0.4028 0 0.4647 0.0000 -0.8855 0.465 0.000 -0.885 4.5572 0.5000 0 0.2393 0.0000 -0.9709 0.239 0.000 -0.971 8.7357 0.5000 0 0.2333 0.0533 -0.9709 0.233 0.053 -0.971 8.5293 2.3326 0 0.2156 0.1038 -0.9709 0.216 0.104 -0.971 7.9201 4.0734 0 0.1871 0.1492 -0.9709 0.187 0.149 -0.971 6.9390 5.6349 0 0.1492 0.1871 -0.9709 0.149 0.187 -0.971 5.6349 6.9390 0 0.1038 0.2156 -0.9709 0.104 0.216 -0.971 4.0734 7.9201 0 0.0533 0.2333 -0.9709 0.053 0.233 -0.971 2.3326 8.5293 0 0.0000 0.2393 -0.9709 0.000 0.239 -0.971 0.5000 8.7357 0 -0.0533 0.2333 -0.9709 -0.053 0.233 -0.971 -1.3326 8.5293 0 -0.1038 0.2156 -0.9709 -0.104 0.216 -0.971 -3.0734 7.9201 0 -0.1492 0.1871 -0.9709 -0.149 0.187 -0.971 -4.6349 6.9390 0 -0.1871 0.1492 -0.9709 -0.187 0.149 -0.971 -5.9390 5.6349 0 -0.2156 0.1038 -0.9709 -0.216 0.104 -0.971 -6.9201 4.0734 0 -0.2333 0.0533 -0.9709 -0.233 0.053 -0.971 -7.5293 2.3326 0 -0.2393 0.0000 -0.9709 -0.239 0.000 -0.971 -7.7357 0.5000 0 -0.2333 -0.0533 -0.9709 -0.233 -0.053 -0.971 -7.5293 -1.3326 0 -0.2156 -0.1038 -0.9709 -0.216 -0.104 -0.971 -6.9201 -3.0734 0 -0.1871 -0.1492 -0.9709 -0.187 -0.149 -0.971 -5.9390 -4.6349 0 -0.1492 -0.1871 -0.9709 -0.149 -0.187 -0.971 -4.6349 -5.9390 0 -0.1038 -0.2156 -0.9709 -0.104 -0.216 -0.971 -3.0734 -6.9201 0 -0.0533 -0.2333 -0.9709 -0.053 -0.233 -0.971 -1.3326 -7.5293 0 0.0000 -0.2393 -0.9709 0.000 -0.239 -0.971 0.5000 -7.7357 0 0.0533 -0.2333 -0.9709 0.053 -0.233 -0.971 2.3326 -7.5293 0 0.1038 -0.2156 -0.9709 0.104 -0.216 -0.971 4.0734 -6.9201 0 0.1492 -0.1871 -0.9709 0.149 -0.187 -0.971 5.6349 -5.9390 0 0.1871 -0.1492 -0.9709 0.187 -0.149 -0.971 6.9390 -4.6349 0 0.2156 -0.1038 -0.9709 0.216 -0.104 -0.971 7.9201 -3.0734 0 0.2333 -0.0533 -0.9709 0.233 -0.053 -0.971 8.5293 -1.3326 0 0.2393 0.0000 -0.9709 0.239 0.000 -0.971 8.7357 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 geomview-1.9.5/data/geom/textured/dodec.off0000644000175000017500000000236612310110172015542 00000000000000appearance { +texturing texture { file grid.pgm.gz } } STOFF 20 12 30 3.8857806e-16 0 0.99999963 0.5 1 -0.33333364 0.57735 0.74535523 0.83333318 0.87267785 -0.87267743 0.356822 0.33333299 0.93822533 0.6666666 -0.87267743 -0.356822 0.33333299 0.061774672 0.6666666 -0.33333364 -0.57735 0.74535523 0.16666682 0.87267785 0.66666678 0 0.74535584 0.5 0.87267793 0.1273222 0.934172 0.33333299 0.72844078 0.66666657 -0.74535523 0.57735 -0.33333364 0.89510732 0.33333308 -0.74535523 -0.57735 -0.33333364 0.10489268 0.33333308 0.1273222 -0.934172 0.33333299 0.27155922 0.66666657 0.74535523 0.57735 0.33333364 0.60489231 0.66666692 -0.1273222 0.934172 -0.33333299 0.77155885 0.33333343 -0.66666678 0 -0.74535584 0.99999963 0.12732207 -0.1273222 -0.934172 -0.33333299 0.22844115 0.33333343 0.74535523 -0.57735 0.33333364 0.39510769 0.66666692 0.87267743 0.356822 -0.33333299 0.5617743 0.3333334 0.33333364 0.57735 -0.74535523 0.66666645 0.12732215 -3.8857806e-16 0 -0.99999963 0.99999963 0 0.33333364 -0.57735 -0.74535523 0.33333355 0.12732215 0.87267743 -0.356822 -0.33333299 0.4382257 0.3333334 5 0 1 2 3 4 5 0 5 10 6 1 5 1 6 11 7 2 5 2 7 12 8 3 5 3 8 13 9 4 5 4 9 14 5 0 5 15 10 5 14 19 5 16 11 6 10 15 5 17 12 7 11 16 5 18 13 8 12 17 5 19 14 9 13 18 5 19 18 17 16 15 geomview-1.9.5/data/geom/textured/lunar-t.oogl0000644000175000017500000023136312310110173016236 00000000000000# Hey, Emacs, we're -*-gvcl-*- mode { # World INST geom {appearance { -edge } { LIST # World list { # Model0 INST geom {appearance { -edge } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 0.69999999 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 -0.5 -0.5 -0.5 1 } geom { LIST { } { appearance { material { *diffuse 1.000000 1.000000 1.000000 } } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { NOFF 8 5 11 0 0 0 -0.707107 0 -0.707107 1 0 0 0.707107 0 -0.707107 1 1 0 0.57735 0.57735 -0.57735 0 1 0 -0.57735 0.57735 -0.57735 0 0 1 -0.707107 0 0.707107 1 0 1 0.707107 0 0.707107 1 1 1 0.57735 0.57735 0.57735 0 1 1 -0.57735 0.57735 0.57735 4 3 2 1 0 4 4 5 6 7 4 2 3 7 6 4 0 4 7 3 4 1 2 6 5 } { appearance { +texturing texture { file NASA.pgm.gz clamp st apply blend background 1 0 0 1 transform 2 0 0 0 0 2 0 0 0 0 1 0 -.5 -.5 0 1 } shading smooth } = NUMESH 2 2 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0.34999999 0.34999999 -0.34999999 1 } geom { INST transform { 0.19909699 -0.800915 -0.564722 0 -0.800915 0.19909699 -0.564722 0 0.564722 0.564722 -0.601816 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.15000001 0 0 0 0 0.15000001 0 0 0 0 0.15000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { SPHERE 1 0 0 0} } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { -0.86602598 0.49999899 0 0 -0.49999899 -0.86602598 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.039999999 0 0 0 0 0.039999999 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { OFF 80 40 118 1 0 0 1 0 1 0.987688 0.156434 0 0.987688 0.156434 1 0.951057 0.309017 0 0.951057 0.309017 1 0.891007 0.45399 0 0.891007 0.45399 1 0.809017 0.587785 0 0.809017 0.587785 1 0.707107 0.707107 0 0.707107 0.707107 1 0.587785 0.809017 0 0.587785 0.809017 1 0.45399 0.891007 0 0.45399 0.891007 1 0.309017 0.951057 0 0.309017 0.951057 1 0.156434 0.987688 0 0.156434 0.987688 1 0 1 0 0 1 1 -0.156434 0.987688 0 -0.156434 0.987688 1 -0.309017 0.951057 0 -0.309017 0.951057 1 -0.45399 0.891007 0 -0.45399 0.891007 1 -0.587785 0.809017 0 -0.587785 0.809017 1 -0.707107 0.707107 0 -0.707107 0.707107 1 -0.809017 0.587785 0 -0.809017 0.587785 1 -0.891007 0.45399 0 -0.891007 0.45399 1 -0.951057 0.309017 0 -0.951057 0.309017 1 -0.987688 0.156434 0 -0.987688 0.156434 1 -1 0 0 -1 0 1 -0.987688 -0.156434 0 -0.987688 -0.156434 1 -0.951057 -0.309017 0 -0.951057 -0.309017 1 -0.891007 -0.45399 0 -0.891007 -0.45399 1 -0.809017 -0.587785 0 -0.809017 -0.587785 1 -0.707107 -0.707107 0 -0.707107 -0.707107 1 -0.587785 -0.809017 0 -0.587785 -0.809017 1 -0.45399 -0.891007 0 -0.45399 -0.891007 1 -0.309017 -0.951057 0 -0.309017 -0.951057 1 -0.156434 -0.987688 0 -0.156434 -0.987688 1 0 -1 0 0 -1 1 0.156434 -0.987688 0 0.156434 -0.987688 1 0.309017 -0.951057 0 0.309017 -0.951057 1 0.45399 -0.891007 0 0.45399 -0.891007 1 0.587785 -0.809017 0 0.587785 -0.809017 1 0.707107 -0.707107 0 0.707107 -0.707107 1 0.809017 -0.587785 0 0.809017 -0.587785 1 0.891007 -0.45399 0 0.891007 -0.45399 1 0.951057 -0.309017 0 0.951057 -0.309017 1 0.987688 -0.156434 0 0.987688 -0.156434 1 4 0 1 3 2 4 2 3 5 4 4 4 5 7 6 4 6 7 9 8 4 8 9 11 10 4 10 11 13 12 4 12 13 15 14 4 14 15 17 16 4 16 17 19 18 4 18 19 21 20 4 20 21 23 22 4 22 23 25 24 4 24 25 27 26 4 26 27 29 28 4 28 29 31 30 4 30 31 33 32 4 32 33 35 34 4 34 35 37 36 4 36 37 39 38 4 38 39 41 40 4 40 41 43 42 4 42 43 45 44 4 44 45 47 46 4 46 47 49 48 4 48 49 51 50 4 50 51 53 52 4 52 53 55 54 4 54 55 57 56 4 56 57 59 58 4 58 59 61 60 4 60 61 63 62 4 62 63 65 64 4 64 65 67 66 4 66 67 69 68 4 68 69 71 70 4 70 71 73 72 4 72 73 75 74 4 74 75 77 76 4 76 77 79 78 4 78 79 1 0 } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.050000001 0 0 0 0 0.050000001 0 0 0 0 0.050000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { SPHERE 1 0 0 0} } } } } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 } geom { INST transform { 1 0 0 0 0 0.46947101 0.88294798 0 0 -0.88294798 0.46947101 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.039999999 0 0 0 0 0.039999999 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { OFF 80 40 118 1 0 0 1 0 1 0.987688 0.156434 0 0.987688 0.156434 1 0.951057 0.309017 0 0.951057 0.309017 1 0.891007 0.45399 0 0.891007 0.45399 1 0.809017 0.587785 0 0.809017 0.587785 1 0.707107 0.707107 0 0.707107 0.707107 1 0.587785 0.809017 0 0.587785 0.809017 1 0.45399 0.891007 0 0.45399 0.891007 1 0.309017 0.951057 0 0.309017 0.951057 1 0.156434 0.987688 0 0.156434 0.987688 1 0 1 0 0 1 1 -0.156434 0.987688 0 -0.156434 0.987688 1 -0.309017 0.951057 0 -0.309017 0.951057 1 -0.45399 0.891007 0 -0.45399 0.891007 1 -0.587785 0.809017 0 -0.587785 0.809017 1 -0.707107 0.707107 0 -0.707107 0.707107 1 -0.809017 0.587785 0 -0.809017 0.587785 1 -0.891007 0.45399 0 -0.891007 0.45399 1 -0.951057 0.309017 0 -0.951057 0.309017 1 -0.987688 0.156434 0 -0.987688 0.156434 1 -1 0 0 -1 0 1 -0.987688 -0.156434 0 -0.987688 -0.156434 1 -0.951057 -0.309017 0 -0.951057 -0.309017 1 -0.891007 -0.45399 0 -0.891007 -0.45399 1 -0.809017 -0.587785 0 -0.809017 -0.587785 1 -0.707107 -0.707107 0 -0.707107 -0.707107 1 -0.587785 -0.809017 0 -0.587785 -0.809017 1 -0.45399 -0.891007 0 -0.45399 -0.891007 1 -0.309017 -0.951057 0 -0.309017 -0.951057 1 -0.156434 -0.987688 0 -0.156434 -0.987688 1 0 -1 0 0 -1 1 0.156434 -0.987688 0 0.156434 -0.987688 1 0.309017 -0.951057 0 0.309017 -0.951057 1 0.45399 -0.891007 0 0.45399 -0.891007 1 0.587785 -0.809017 0 0.587785 -0.809017 1 0.707107 -0.707107 0 0.707107 -0.707107 1 0.809017 -0.587785 0 0.809017 -0.587785 1 0.891007 -0.45399 0 0.891007 -0.45399 1 0.951057 -0.309017 0 0.951057 -0.309017 1 0.987688 -0.156434 0 0.987688 -0.156434 1 4 0 1 3 2 4 2 3 5 4 4 4 5 7 6 4 6 7 9 8 4 8 9 11 10 4 10 11 13 12 4 12 13 15 14 4 14 15 17 16 4 16 17 19 18 4 18 19 21 20 4 20 21 23 22 4 22 23 25 24 4 24 25 27 26 4 26 27 29 28 4 28 29 31 30 4 30 31 33 32 4 32 33 35 34 4 34 35 37 36 4 36 37 39 38 4 38 39 41 40 4 40 41 43 42 4 42 43 45 44 4 44 45 47 46 4 46 47 49 48 4 48 49 51 50 4 50 51 53 52 4 52 53 55 54 4 54 55 57 56 4 56 57 59 58 4 58 59 61 60 4 60 61 63 62 4 62 63 65 64 4 64 65 67 66 4 66 67 69 68 4 68 69 71 70 4 70 71 73 72 4 72 73 75 74 4 74 75 77 76 4 76 77 79 78 4 78 79 1 0 } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1.2 1 } geom { INST transform { -1 0 -1.34641e-06 0 0 1 0 0 1.34641e-06 0 -1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.2 0 0 0 0 0.2 0 0 0 0 0.2 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { material { *diffuse 1.000000 1.000000 1.000000 } } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { CBEZ224 1 0 0 1 0 0 1 0 -1 0 0 1 0 1 0 0 0 0 0 0 0 -1 0 0 -1 0 0 1 0 0 1 0 1 0 0 1 0.3 1 0.3 1 1 0.3 0.3 1 0.3 0.3 1 1 1 0.3 1 1 } } } } } } } } } } } } } } } } } } } } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0.34999999 -0.34999999 -0.34999999 1 } geom { INST transform { 0.14033499 0.85967499 -0.49119899 0 0.85967499 0.14033499 0.49119899 0 0.49119899 -0.49119899 -0.71934098 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.15000001 0 0 0 0 0.15000001 0 0 0 0 0.15000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { SPHERE 1 0 0 0} } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.78801101 0.61566198 0 0 -0.61566198 0.78801101 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.039999999 0 0 0 0 0.039999999 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { OFF 80 40 118 1 0 0 1 0 1 0.987688 0.156434 0 0.987688 0.156434 1 0.951057 0.309017 0 0.951057 0.309017 1 0.891007 0.45399 0 0.891007 0.45399 1 0.809017 0.587785 0 0.809017 0.587785 1 0.707107 0.707107 0 0.707107 0.707107 1 0.587785 0.809017 0 0.587785 0.809017 1 0.45399 0.891007 0 0.45399 0.891007 1 0.309017 0.951057 0 0.309017 0.951057 1 0.156434 0.987688 0 0.156434 0.987688 1 0 1 0 0 1 1 -0.156434 0.987688 0 -0.156434 0.987688 1 -0.309017 0.951057 0 -0.309017 0.951057 1 -0.45399 0.891007 0 -0.45399 0.891007 1 -0.587785 0.809017 0 -0.587785 0.809017 1 -0.707107 0.707107 0 -0.707107 0.707107 1 -0.809017 0.587785 0 -0.809017 0.587785 1 -0.891007 0.45399 0 -0.891007 0.45399 1 -0.951057 0.309017 0 -0.951057 0.309017 1 -0.987688 0.156434 0 -0.987688 0.156434 1 -1 0 0 -1 0 1 -0.987688 -0.156434 0 -0.987688 -0.156434 1 -0.951057 -0.309017 0 -0.951057 -0.309017 1 -0.891007 -0.45399 0 -0.891007 -0.45399 1 -0.809017 -0.587785 0 -0.809017 -0.587785 1 -0.707107 -0.707107 0 -0.707107 -0.707107 1 -0.587785 -0.809017 0 -0.587785 -0.809017 1 -0.45399 -0.891007 0 -0.45399 -0.891007 1 -0.309017 -0.951057 0 -0.309017 -0.951057 1 -0.156434 -0.987688 0 -0.156434 -0.987688 1 0 -1 0 0 -1 1 0.156434 -0.987688 0 0.156434 -0.987688 1 0.309017 -0.951057 0 0.309017 -0.951057 1 0.45399 -0.891007 0 0.45399 -0.891007 1 0.587785 -0.809017 0 0.587785 -0.809017 1 0.707107 -0.707107 0 0.707107 -0.707107 1 0.809017 -0.587785 0 0.809017 -0.587785 1 0.891007 -0.45399 0 0.891007 -0.45399 1 0.951057 -0.309017 0 0.951057 -0.309017 1 0.987688 -0.156434 0 0.987688 -0.156434 1 4 0 1 3 2 4 2 3 5 4 4 4 5 7 6 4 6 7 9 8 4 8 9 11 10 4 10 11 13 12 4 12 13 15 14 4 14 15 17 16 4 16 17 19 18 4 18 19 21 20 4 20 21 23 22 4 22 23 25 24 4 24 25 27 26 4 26 27 29 28 4 28 29 31 30 4 30 31 33 32 4 32 33 35 34 4 34 35 37 36 4 36 37 39 38 4 38 39 41 40 4 40 41 43 42 4 42 43 45 44 4 44 45 47 46 4 46 47 49 48 4 48 49 51 50 4 50 51 53 52 4 52 53 55 54 4 54 55 57 56 4 56 57 59 58 4 58 59 61 60 4 60 61 63 62 4 62 63 65 64 4 64 65 67 66 4 66 67 69 68 4 68 69 71 70 4 70 71 73 72 4 72 73 75 74 4 74 75 77 76 4 76 77 79 78 4 78 79 1 0 } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.050000001 0 0 0 0 0.050000001 0 0 0 0 0.050000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { SPHERE 1 0 0 0} } } } } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 } geom { INST transform { 1 0 0 0 0 0.86602497 0.5 0 0 -0.5 0.86602497 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.039999999 0 0 0 0 0.039999999 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { OFF 80 40 118 1 0 0 1 0 1 0.987688 0.156434 0 0.987688 0.156434 1 0.951057 0.309017 0 0.951057 0.309017 1 0.891007 0.45399 0 0.891007 0.45399 1 0.809017 0.587785 0 0.809017 0.587785 1 0.707107 0.707107 0 0.707107 0.707107 1 0.587785 0.809017 0 0.587785 0.809017 1 0.45399 0.891007 0 0.45399 0.891007 1 0.309017 0.951057 0 0.309017 0.951057 1 0.156434 0.987688 0 0.156434 0.987688 1 0 1 0 0 1 1 -0.156434 0.987688 0 -0.156434 0.987688 1 -0.309017 0.951057 0 -0.309017 0.951057 1 -0.45399 0.891007 0 -0.45399 0.891007 1 -0.587785 0.809017 0 -0.587785 0.809017 1 -0.707107 0.707107 0 -0.707107 0.707107 1 -0.809017 0.587785 0 -0.809017 0.587785 1 -0.891007 0.45399 0 -0.891007 0.45399 1 -0.951057 0.309017 0 -0.951057 0.309017 1 -0.987688 0.156434 0 -0.987688 0.156434 1 -1 0 0 -1 0 1 -0.987688 -0.156434 0 -0.987688 -0.156434 1 -0.951057 -0.309017 0 -0.951057 -0.309017 1 -0.891007 -0.45399 0 -0.891007 -0.45399 1 -0.809017 -0.587785 0 -0.809017 -0.587785 1 -0.707107 -0.707107 0 -0.707107 -0.707107 1 -0.587785 -0.809017 0 -0.587785 -0.809017 1 -0.45399 -0.891007 0 -0.45399 -0.891007 1 -0.309017 -0.951057 0 -0.309017 -0.951057 1 -0.156434 -0.987688 0 -0.156434 -0.987688 1 0 -1 0 0 -1 1 0.156434 -0.987688 0 0.156434 -0.987688 1 0.309017 -0.951057 0 0.309017 -0.951057 1 0.45399 -0.891007 0 0.45399 -0.891007 1 0.587785 -0.809017 0 0.587785 -0.809017 1 0.707107 -0.707107 0 0.707107 -0.707107 1 0.809017 -0.587785 0 0.809017 -0.587785 1 0.891007 -0.45399 0 0.891007 -0.45399 1 0.951057 -0.309017 0 0.951057 -0.309017 1 0.987688 -0.156434 0 0.987688 -0.156434 1 4 0 1 3 2 4 2 3 5 4 4 4 5 7 6 4 6 7 9 8 4 8 9 11 10 4 10 11 13 12 4 12 13 15 14 4 14 15 17 16 4 16 17 19 18 4 18 19 21 20 4 20 21 23 22 4 22 23 25 24 4 24 25 27 26 4 26 27 29 28 4 28 29 31 30 4 30 31 33 32 4 32 33 35 34 4 34 35 37 36 4 36 37 39 38 4 38 39 41 40 4 40 41 43 42 4 42 43 45 44 4 44 45 47 46 4 46 47 49 48 4 48 49 51 50 4 50 51 53 52 4 52 53 55 54 4 54 55 57 56 4 56 57 59 58 4 58 59 61 60 4 60 61 63 62 4 62 63 65 64 4 64 65 67 66 4 66 67 69 68 4 68 69 71 70 4 70 71 73 72 4 72 73 75 74 4 74 75 77 76 4 76 77 79 78 4 78 79 1 0 } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1.2 1 } geom { INST transform { -1 0 -1.34641e-06 0 0 1 0 0 1.34641e-06 0 -1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.2 0 0 0 0 0.2 0 0 0 0 0.2 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { material { *diffuse 1.000000 1.000000 1.000000 } } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { CBEZ224 1 0 0 1 0 0 1 0 -1 0 0 1 0 1 0 0 0 0 0 0 0 -1 0 0 -1 0 0 1 0 0 1 0 1 0 0 1 0.3 1 0.3 1 1 0.3 0.3 1 0.3 0.3 1 1 1 0.3 1 1 } } } } } } } } } } } } } } } } } } } } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 -0.34999999 -0.34999999 -0.34999999 1 } geom { INST transform { 0.265268 -0.73473901 0.62434 0 -0.73473901 0.265268 0.62434 0 -0.62434 -0.62434 -0.46947199 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.15000001 0 0 0 0 0.15000001 0 0 0 0 0.15000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { SPHERE 1 0 0 0} } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.66913003 -0.74314499 0 0 0.74314499 0.66913003 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.039999999 0 0 0 0 0.039999999 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { OFF 80 40 118 1 0 0 1 0 1 0.987688 0.156434 0 0.987688 0.156434 1 0.951057 0.309017 0 0.951057 0.309017 1 0.891007 0.45399 0 0.891007 0.45399 1 0.809017 0.587785 0 0.809017 0.587785 1 0.707107 0.707107 0 0.707107 0.707107 1 0.587785 0.809017 0 0.587785 0.809017 1 0.45399 0.891007 0 0.45399 0.891007 1 0.309017 0.951057 0 0.309017 0.951057 1 0.156434 0.987688 0 0.156434 0.987688 1 0 1 0 0 1 1 -0.156434 0.987688 0 -0.156434 0.987688 1 -0.309017 0.951057 0 -0.309017 0.951057 1 -0.45399 0.891007 0 -0.45399 0.891007 1 -0.587785 0.809017 0 -0.587785 0.809017 1 -0.707107 0.707107 0 -0.707107 0.707107 1 -0.809017 0.587785 0 -0.809017 0.587785 1 -0.891007 0.45399 0 -0.891007 0.45399 1 -0.951057 0.309017 0 -0.951057 0.309017 1 -0.987688 0.156434 0 -0.987688 0.156434 1 -1 0 0 -1 0 1 -0.987688 -0.156434 0 -0.987688 -0.156434 1 -0.951057 -0.309017 0 -0.951057 -0.309017 1 -0.891007 -0.45399 0 -0.891007 -0.45399 1 -0.809017 -0.587785 0 -0.809017 -0.587785 1 -0.707107 -0.707107 0 -0.707107 -0.707107 1 -0.587785 -0.809017 0 -0.587785 -0.809017 1 -0.45399 -0.891007 0 -0.45399 -0.891007 1 -0.309017 -0.951057 0 -0.309017 -0.951057 1 -0.156434 -0.987688 0 -0.156434 -0.987688 1 0 -1 0 0 -1 1 0.156434 -0.987688 0 0.156434 -0.987688 1 0.309017 -0.951057 0 0.309017 -0.951057 1 0.45399 -0.891007 0 0.45399 -0.891007 1 0.587785 -0.809017 0 0.587785 -0.809017 1 0.707107 -0.707107 0 0.707107 -0.707107 1 0.809017 -0.587785 0 0.809017 -0.587785 1 0.891007 -0.45399 0 0.891007 -0.45399 1 0.951057 -0.309017 0 0.951057 -0.309017 1 0.987688 -0.156434 0 0.987688 -0.156434 1 4 0 1 3 2 4 2 3 5 4 4 4 5 7 6 4 6 7 9 8 4 8 9 11 10 4 10 11 13 12 4 12 13 15 14 4 14 15 17 16 4 16 17 19 18 4 18 19 21 20 4 20 21 23 22 4 22 23 25 24 4 24 25 27 26 4 26 27 29 28 4 28 29 31 30 4 30 31 33 32 4 32 33 35 34 4 34 35 37 36 4 36 37 39 38 4 38 39 41 40 4 40 41 43 42 4 42 43 45 44 4 44 45 47 46 4 46 47 49 48 4 48 49 51 50 4 50 51 53 52 4 52 53 55 54 4 54 55 57 56 4 56 57 59 58 4 58 59 61 60 4 60 61 63 62 4 62 63 65 64 4 64 65 67 66 4 66 67 69 68 4 68 69 71 70 4 70 71 73 72 4 72 73 75 74 4 74 75 77 76 4 76 77 79 78 4 78 79 1 0 } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.050000001 0 0 0 0 0.050000001 0 0 0 0 0.050000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { SPHERE 1 0 0 0} } } } } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 } geom { INST transform { 1 0 0 0 0 0.46947101 0.88294798 0 0 -0.88294798 0.46947101 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.039999999 0 0 0 0 0.039999999 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { OFF 80 40 118 1 0 0 1 0 1 0.987688 0.156434 0 0.987688 0.156434 1 0.951057 0.309017 0 0.951057 0.309017 1 0.891007 0.45399 0 0.891007 0.45399 1 0.809017 0.587785 0 0.809017 0.587785 1 0.707107 0.707107 0 0.707107 0.707107 1 0.587785 0.809017 0 0.587785 0.809017 1 0.45399 0.891007 0 0.45399 0.891007 1 0.309017 0.951057 0 0.309017 0.951057 1 0.156434 0.987688 0 0.156434 0.987688 1 0 1 0 0 1 1 -0.156434 0.987688 0 -0.156434 0.987688 1 -0.309017 0.951057 0 -0.309017 0.951057 1 -0.45399 0.891007 0 -0.45399 0.891007 1 -0.587785 0.809017 0 -0.587785 0.809017 1 -0.707107 0.707107 0 -0.707107 0.707107 1 -0.809017 0.587785 0 -0.809017 0.587785 1 -0.891007 0.45399 0 -0.891007 0.45399 1 -0.951057 0.309017 0 -0.951057 0.309017 1 -0.987688 0.156434 0 -0.987688 0.156434 1 -1 0 0 -1 0 1 -0.987688 -0.156434 0 -0.987688 -0.156434 1 -0.951057 -0.309017 0 -0.951057 -0.309017 1 -0.891007 -0.45399 0 -0.891007 -0.45399 1 -0.809017 -0.587785 0 -0.809017 -0.587785 1 -0.707107 -0.707107 0 -0.707107 -0.707107 1 -0.587785 -0.809017 0 -0.587785 -0.809017 1 -0.45399 -0.891007 0 -0.45399 -0.891007 1 -0.309017 -0.951057 0 -0.309017 -0.951057 1 -0.156434 -0.987688 0 -0.156434 -0.987688 1 0 -1 0 0 -1 1 0.156434 -0.987688 0 0.156434 -0.987688 1 0.309017 -0.951057 0 0.309017 -0.951057 1 0.45399 -0.891007 0 0.45399 -0.891007 1 0.587785 -0.809017 0 0.587785 -0.809017 1 0.707107 -0.707107 0 0.707107 -0.707107 1 0.809017 -0.587785 0 0.809017 -0.587785 1 0.891007 -0.45399 0 0.891007 -0.45399 1 0.951057 -0.309017 0 0.951057 -0.309017 1 0.987688 -0.156434 0 0.987688 -0.156434 1 4 0 1 3 2 4 2 3 5 4 4 4 5 7 6 4 6 7 9 8 4 8 9 11 10 4 10 11 13 12 4 12 13 15 14 4 14 15 17 16 4 16 17 19 18 4 18 19 21 20 4 20 21 23 22 4 22 23 25 24 4 24 25 27 26 4 26 27 29 28 4 28 29 31 30 4 30 31 33 32 4 32 33 35 34 4 34 35 37 36 4 36 37 39 38 4 38 39 41 40 4 40 41 43 42 4 42 43 45 44 4 44 45 47 46 4 46 47 49 48 4 48 49 51 50 4 50 51 53 52 4 52 53 55 54 4 54 55 57 56 4 56 57 59 58 4 58 59 61 60 4 60 61 63 62 4 62 63 65 64 4 64 65 67 66 4 66 67 69 68 4 68 69 71 70 4 70 71 73 72 4 72 73 75 74 4 74 75 77 76 4 76 77 79 78 4 78 79 1 0 } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1.2 1 } geom { INST transform { -1 0 -1.34641e-06 0 0 1 0 0 1.34641e-06 0 -1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.2 0 0 0 0 0.2 0 0 0 0 0.2 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { material { *diffuse 1.000000 1.000000 1.000000 } } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { CBEZ224 1 0 0 1 0 0 1 0 -1 0 0 1 0 1 0 0 0 0 0 0 0 -1 0 0 -1 0 0 1 0 0 1 0 1 0 0 1 0.3 1 0.3 1 1 0.3 0.3 1 0.3 0.3 1 1 1 0.3 1 1 } } } } } } } } } } } } } } } } } } } } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 -0.34999999 0.34999999 -0.34999999 1 } geom { INST transform { 0.13432799 0.86567998 0.48224699 0 0.86567998 0.13432799 -0.48224699 0 -0.48224699 0.48224699 -0.731354 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.15000001 0 0 0 0 0.15000001 0 0 0 0 0.15000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { SPHERE 1 0 0 0} } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { -0.68199903 -0.73135298 0 0 0.73135298 -0.68199903 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.039999999 0 0 0 0 0.039999999 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { OFF 80 40 118 1 0 0 1 0 1 0.987688 0.156434 0 0.987688 0.156434 1 0.951057 0.309017 0 0.951057 0.309017 1 0.891007 0.45399 0 0.891007 0.45399 1 0.809017 0.587785 0 0.809017 0.587785 1 0.707107 0.707107 0 0.707107 0.707107 1 0.587785 0.809017 0 0.587785 0.809017 1 0.45399 0.891007 0 0.45399 0.891007 1 0.309017 0.951057 0 0.309017 0.951057 1 0.156434 0.987688 0 0.156434 0.987688 1 0 1 0 0 1 1 -0.156434 0.987688 0 -0.156434 0.987688 1 -0.309017 0.951057 0 -0.309017 0.951057 1 -0.45399 0.891007 0 -0.45399 0.891007 1 -0.587785 0.809017 0 -0.587785 0.809017 1 -0.707107 0.707107 0 -0.707107 0.707107 1 -0.809017 0.587785 0 -0.809017 0.587785 1 -0.891007 0.45399 0 -0.891007 0.45399 1 -0.951057 0.309017 0 -0.951057 0.309017 1 -0.987688 0.156434 0 -0.987688 0.156434 1 -1 0 0 -1 0 1 -0.987688 -0.156434 0 -0.987688 -0.156434 1 -0.951057 -0.309017 0 -0.951057 -0.309017 1 -0.891007 -0.45399 0 -0.891007 -0.45399 1 -0.809017 -0.587785 0 -0.809017 -0.587785 1 -0.707107 -0.707107 0 -0.707107 -0.707107 1 -0.587785 -0.809017 0 -0.587785 -0.809017 1 -0.45399 -0.891007 0 -0.45399 -0.891007 1 -0.309017 -0.951057 0 -0.309017 -0.951057 1 -0.156434 -0.987688 0 -0.156434 -0.987688 1 0 -1 0 0 -1 1 0.156434 -0.987688 0 0.156434 -0.987688 1 0.309017 -0.951057 0 0.309017 -0.951057 1 0.45399 -0.891007 0 0.45399 -0.891007 1 0.587785 -0.809017 0 0.587785 -0.809017 1 0.707107 -0.707107 0 0.707107 -0.707107 1 0.809017 -0.587785 0 0.809017 -0.587785 1 0.891007 -0.45399 0 0.891007 -0.45399 1 0.951057 -0.309017 0 0.951057 -0.309017 1 0.987688 -0.156434 0 0.987688 -0.156434 1 4 0 1 3 2 4 2 3 5 4 4 4 5 7 6 4 6 7 9 8 4 8 9 11 10 4 10 11 13 12 4 12 13 15 14 4 14 15 17 16 4 16 17 19 18 4 18 19 21 20 4 20 21 23 22 4 22 23 25 24 4 24 25 27 26 4 26 27 29 28 4 28 29 31 30 4 30 31 33 32 4 32 33 35 34 4 34 35 37 36 4 36 37 39 38 4 38 39 41 40 4 40 41 43 42 4 42 43 45 44 4 44 45 47 46 4 46 47 49 48 4 48 49 51 50 4 50 51 53 52 4 52 53 55 54 4 54 55 57 56 4 56 57 59 58 4 58 59 61 60 4 60 61 63 62 4 62 63 65 64 4 64 65 67 66 4 66 67 69 68 4 68 69 71 70 4 70 71 73 72 4 72 73 75 74 4 74 75 77 76 4 76 77 79 78 4 78 79 1 0 } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.050000001 0 0 0 0 0.050000001 0 0 0 0 0.050000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { SPHERE 1 0 0 0} } } } } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 } geom { INST transform { 1 0 0 0 0 0.89100599 0.453991 0 0 -0.453991 0.89100599 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.039999999 0 0 0 0 0.039999999 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { OFF 80 40 118 1 0 0 1 0 1 0.987688 0.156434 0 0.987688 0.156434 1 0.951057 0.309017 0 0.951057 0.309017 1 0.891007 0.45399 0 0.891007 0.45399 1 0.809017 0.587785 0 0.809017 0.587785 1 0.707107 0.707107 0 0.707107 0.707107 1 0.587785 0.809017 0 0.587785 0.809017 1 0.45399 0.891007 0 0.45399 0.891007 1 0.309017 0.951057 0 0.309017 0.951057 1 0.156434 0.987688 0 0.156434 0.987688 1 0 1 0 0 1 1 -0.156434 0.987688 0 -0.156434 0.987688 1 -0.309017 0.951057 0 -0.309017 0.951057 1 -0.45399 0.891007 0 -0.45399 0.891007 1 -0.587785 0.809017 0 -0.587785 0.809017 1 -0.707107 0.707107 0 -0.707107 0.707107 1 -0.809017 0.587785 0 -0.809017 0.587785 1 -0.891007 0.45399 0 -0.891007 0.45399 1 -0.951057 0.309017 0 -0.951057 0.309017 1 -0.987688 0.156434 0 -0.987688 0.156434 1 -1 0 0 -1 0 1 -0.987688 -0.156434 0 -0.987688 -0.156434 1 -0.951057 -0.309017 0 -0.951057 -0.309017 1 -0.891007 -0.45399 0 -0.891007 -0.45399 1 -0.809017 -0.587785 0 -0.809017 -0.587785 1 -0.707107 -0.707107 0 -0.707107 -0.707107 1 -0.587785 -0.809017 0 -0.587785 -0.809017 1 -0.45399 -0.891007 0 -0.45399 -0.891007 1 -0.309017 -0.951057 0 -0.309017 -0.951057 1 -0.156434 -0.987688 0 -0.156434 -0.987688 1 0 -1 0 0 -1 1 0.156434 -0.987688 0 0.156434 -0.987688 1 0.309017 -0.951057 0 0.309017 -0.951057 1 0.45399 -0.891007 0 0.45399 -0.891007 1 0.587785 -0.809017 0 0.587785 -0.809017 1 0.707107 -0.707107 0 0.707107 -0.707107 1 0.809017 -0.587785 0 0.809017 -0.587785 1 0.891007 -0.45399 0 0.891007 -0.45399 1 0.951057 -0.309017 0 0.951057 -0.309017 1 0.987688 -0.156434 0 0.987688 -0.156434 1 4 0 1 3 2 4 2 3 5 4 4 4 5 7 6 4 6 7 9 8 4 8 9 11 10 4 10 11 13 12 4 12 13 15 14 4 14 15 17 16 4 16 17 19 18 4 18 19 21 20 4 20 21 23 22 4 22 23 25 24 4 24 25 27 26 4 26 27 29 28 4 28 29 31 30 4 30 31 33 32 4 32 33 35 34 4 34 35 37 36 4 36 37 39 38 4 38 39 41 40 4 40 41 43 42 4 42 43 45 44 4 44 45 47 46 4 46 47 49 48 4 48 49 51 50 4 50 51 53 52 4 52 53 55 54 4 54 55 57 56 4 56 57 59 58 4 58 59 61 60 4 60 61 63 62 4 62 63 65 64 4 64 65 67 66 4 66 67 69 68 4 68 69 71 70 4 70 71 73 72 4 72 73 75 74 4 74 75 77 76 4 76 77 79 78 4 78 79 1 0 } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1.2 1 } geom { INST transform { -1 0 -1.34641e-06 0 0 1 0 0 1.34641e-06 0 -1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.2 0 0 0 0 0.2 0 0 0 0 0.2 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { material { *diffuse 1.000000 1.000000 1.000000 } } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { CBEZ224 1 0 0 1 0 0 1 0 -1 0 0 1 0 1 0 0 0 0 0 0 0 -1 0 0 -1 0 0 1 0 0 1 0 1 0 0 1 0.3 1 0.3 1 1 0.3 0.3 1 0.3 0.3 1 1 1 0.3 1 1 } } } } } } } } } } } } } } } } } } } } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.69999999 1 } geom { INST transform { 1 0 0 0 0 -6.7320502e-07 1 0 0 -1 -6.7320502e-07 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.40000001 0 0 0 0 0.40000001 0 0 0 0 0.40000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { * -evert +texturing shading smooth texture { clamp st file geologo.pgm.gz transform 1.5 0 0 0 0 1.5 0 0 0 0 1 0 -.25 -.25 0 1 } } = UMESH 29 14 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0.2393 0 0.9709 0.6214 0.5 0 0.2333 0.0533 0.9709 0.6184 0.527 0 0.2156 0.1038 0.9709 0.6094 0.5527 0 0.1871 0.1492 0.9709 0.5949 0.5757 0 0.1492 0.1871 0.9709 0.5757 0.5949 0 0.1038 0.2156 0.9709 0.5527 0.6094 0 0.0533 0.2333 0.9709 0.527 0.6184 0 0 0.2393 0.9709 0.5 0.6214 0 -0.0533 0.2333 0.9709 0.473 0.6184 0 -0.1038 0.2156 0.9709 0.4473 0.6094 0 -0.1492 0.1871 0.9709 0.4243 0.5949 0 -0.1871 0.1492 0.9709 0.4051 0.5757 0 -0.2156 0.1038 0.9709 0.3906 0.5527 0 -0.2333 0.0533 0.9709 0.3816 0.527 0 -0.2393 0 0.9709 0.3786 0.5 0 -0.2333 -0.0533 0.9709 0.3816 0.473 0 -0.2156 -0.1038 0.9709 0.3906 0.4473 0 -0.1871 -0.1492 0.9709 0.4051 0.4243 0 -0.1492 -0.1871 0.9709 0.4243 0.4051 0 -0.1038 -0.2156 0.9709 0.4473 0.3906 0 -0.0533 -0.2333 0.9709 0.473 0.3816 0 0 -0.2393 0.9709 0.5 0.3786 0 0.0533 -0.2333 0.9709 0.527 0.3816 0 0.1038 -0.2156 0.9709 0.5527 0.3906 0 0.1492 -0.1871 0.9709 0.5757 0.4051 0 0.1871 -0.1492 0.9709 0.5949 0.4243 0 0.2156 -0.1038 0.9709 0.6094 0.4473 0 0.2333 -0.0533 0.9709 0.6184 0.473 0 0.2393 0 0.9709 0.6214 0.5 0 0.4647 0 0.8855 0.7465 0.5 0 0.4531 0.1034 0.8855 0.7403 0.5548 0 0.4187 0.2016 0.8855 0.7221 0.6069 0 0.3633 0.2898 0.8855 0.6927 0.6537 0 0.2898 0.3633 0.8855 0.6537 0.6927 0 0.2016 0.4187 0.8855 0.6069 0.7221 0 0.1034 0.4531 0.8855 0.5548 0.7403 0 0 0.4647 0.8855 0.5 0.7465 0 -0.1034 0.4531 0.8855 0.4452 0.7403 0 -0.2016 0.4187 0.8855 0.3931 0.7221 0 -0.2898 0.3633 0.8855 0.3463 0.6927 0 -0.3633 0.2898 0.8855 0.3073 0.6537 0 -0.4187 0.2016 0.8855 0.2779 0.6069 0 -0.4531 0.1034 0.8855 0.2597 0.5548 0 -0.4647 0 0.8855 0.2535 0.5 0 -0.4531 -0.1034 0.8855 0.2597 0.4452 0 -0.4187 -0.2016 0.8855 0.2779 0.3931 0 -0.3633 -0.2898 0.8855 0.3073 0.3463 0 -0.2898 -0.3633 0.8855 0.3463 0.3073 0 -0.2016 -0.4187 0.8855 0.3931 0.2779 0 -0.1034 -0.4531 0.8855 0.4452 0.2597 0 0 -0.4647 0.8855 0.5 0.2535 0 0.1034 -0.4531 0.8855 0.5548 0.2597 0 0.2016 -0.4187 0.8855 0.6069 0.2779 0 0.2898 -0.3633 0.8855 0.6537 0.3073 0 0.3633 -0.2898 0.8855 0.6927 0.3463 0 0.4187 -0.2016 0.8855 0.7221 0.3931 0 0.4531 -0.1034 0.8855 0.7403 0.4452 0 0.4647 0 0.8855 0.7465 0.5 0 0.6631 0 0.7485 0.8792 0.5 0 0.6465 0.1476 0.7485 0.8697 0.5844 0 0.5975 0.2877 0.7485 0.8417 0.6646 0 0.5185 0.4135 0.7485 0.7965 0.7365 0 0.4135 0.5185 0.7485 0.7365 0.7965 0 0.2877 0.5975 0.7485 0.6646 0.8417 0 0.1476 0.6465 0.7485 0.5844 0.8697 0 0 0.6631 0.7485 0.5 0.8792 0 -0.1476 0.6465 0.7485 0.4156 0.8697 0 -0.2877 0.5975 0.7485 0.3354 0.8417 0 -0.4135 0.5185 0.7485 0.2635 0.7965 0 -0.5185 0.4135 0.7485 0.2035 0.7365 0 -0.5975 0.2877 0.7485 0.1583 0.6646 0 -0.6465 0.1476 0.7485 0.1303 0.5844 0 -0.6631 0 0.7485 0.1208 0.5 0 -0.6465 -0.1476 0.7485 0.1303 0.4156 0 -0.5975 -0.2877 0.7485 0.1583 0.3354 0 -0.5185 -0.4135 0.7485 0.2035 0.2635 0 -0.4135 -0.5185 0.7485 0.2635 0.2035 0 -0.2877 -0.5975 0.7485 0.3354 0.1583 0 -0.1476 -0.6465 0.7485 0.4156 0.1303 0 0 -0.6631 0.7485 0.5 0.1208 0 0.1476 -0.6465 0.7485 0.5844 0.1303 0 0.2877 -0.5975 0.7485 0.6646 0.1583 0 0.4135 -0.5185 0.7485 0.7365 0.2035 0 0.5185 -0.4135 0.7485 0.7965 0.2635 0 0.5975 -0.2877 0.7485 0.8417 0.3354 0 0.6465 -0.1476 0.7485 0.8697 0.4156 0 0.6631 0 0.7485 0.8792 0.5 0 0.823 0 0.5681 1.0248 0.5 0 0.8023 0.1831 0.5681 1.0117 0.6168 0 0.7415 0.3571 0.5681 0.9729 0.7277 0 0.6434 0.5131 0.5681 0.9103 0.8272 0 0.5131 0.6434 0.5681 0.8272 0.9103 0 0.3571 0.7415 0.5681 0.7277 0.9729 0 0.1831 0.8023 0.5681 0.6168 1.0117 0 0 0.823 0.5681 0.5 1.0248 0 -0.1831 0.8023 0.5681 0.3832 1.0117 0 -0.3571 0.7415 0.5681 0.2723 0.9729 0 -0.5131 0.6434 0.5681 0.1728 0.9103 0 -0.6434 0.5131 0.5681 0.0897 0.8272 0 -0.7415 0.3571 0.5681 0.0271 0.7277 0 -0.8023 0.1831 0.5681 -0.0117 0.6168 0 -0.823 0 0.5681 -0.0248 0.5 0 -0.8023 -0.1831 0.5681 -0.0117 0.3832 0 -0.7415 -0.3571 0.5681 0.0271 0.2723 0 -0.6434 -0.5131 0.5681 0.0897 0.1728 0 -0.5131 -0.6434 0.5681 0.1728 0.0897 0 -0.3571 -0.7415 0.5681 0.2723 0.0271 0 -0.1831 -0.8023 0.5681 0.3832 -0.0117 0 0 -0.823 0.5681 0.5 -0.0248 0 0.1831 -0.8023 0.5681 0.6168 -0.0117 0 0.3571 -0.7415 0.5681 0.7277 0.0271 0 0.5131 -0.6434 0.5681 0.8272 0.0897 0 0.6434 -0.5131 0.5681 0.9103 0.1728 0 0.7415 -0.3571 0.5681 0.9729 0.2723 0 0.8023 -0.1831 0.5681 1.0117 0.3832 0 0.823 0 0.5681 1.0248 0.5 0 0.935 0 0.3546 1.1903 0.5 0 0.9116 0.2081 0.3546 1.1729 0.6536 0 0.8424 0.4057 0.3546 1.1219 0.7995 0 0.731 0.583 0.3546 1.0397 0.9304 0 0.583 0.731 0.3546 0.9304 1.0397 0 0.4057 0.8424 0.3546 0.7995 1.1219 0 0.2081 0.9116 0.3546 0.6536 1.1729 0 0 0.935 0.3546 0.5 1.1903 0 -0.2081 0.9116 0.3546 0.3464 1.1729 0 -0.4057 0.8424 0.3546 0.2005 1.1219 0 -0.583 0.731 0.3546 0.0696 1.0397 0 -0.731 0.583 0.3546 -0.0397 0.9304 0 -0.8424 0.4057 0.3546 -0.1219 0.7995 0 -0.9116 0.2081 0.3546 -0.1729 0.6536 0 -0.935 0 0.3546 -0.1903 0.5 0 -0.9116 -0.2081 0.3546 -0.1729 0.3464 0 -0.8424 -0.4057 0.3546 -0.1219 0.2005 0 -0.731 -0.583 0.3546 -0.0397 0.0696 0 -0.583 -0.731 0.3546 0.0696 -0.0397 0 -0.4057 -0.8424 0.3546 0.2005 -0.1219 0 -0.2081 -0.9116 0.3546 0.3464 -0.1729 0 0 -0.935 0.3546 0.5 -0.1903 0 0.2081 -0.9116 0.3546 0.6536 -0.1729 0 0.4057 -0.8424 0.3546 0.7995 -0.1219 0 0.583 -0.731 0.3546 0.9304 -0.0397 0 0.731 -0.583 0.3546 1.0397 0.0696 0 0.8424 -0.4057 0.3546 1.1219 0.2005 0 0.9116 -0.2081 0.3546 1.1729 0.3464 0 0.935 0 0.3546 1.1903 0.5 0 0.9927 0 0.1205 1.3859 0.5 0 0.9678 0.2209 0.1205 1.3637 0.6971 0 0.8944 0.4307 0.1205 1.2982 0.8844 0 0.7761 0.6189 0.1205 1.1926 1.0524 0 0.6189 0.7761 0.1205 1.0524 1.1926 0 0.4307 0.8944 0.1205 0.8844 1.2982 0 0.2209 0.9678 0.1205 0.6971 1.3637 0 0 0.9927 0.1205 0.5 1.3859 0 -0.2209 0.9678 0.1205 0.3029 1.3637 0 -0.4307 0.8944 0.1205 0.1156 1.2982 0 -0.6189 0.7761 0.1205 -0.0524 1.1926 0 -0.7761 0.6189 0.1205 -0.1926 1.0524 0 -0.8944 0.4307 0.1205 -0.2982 0.8844 0 -0.9678 0.2209 0.1205 -0.3637 0.6971 0 -0.9927 0 0.1205 -0.3859 0.5 0 -0.9678 -0.2209 0.1205 -0.3637 0.3029 0 -0.8944 -0.4307 0.1205 -0.2982 0.1156 0 -0.7761 -0.6189 0.1205 -0.1926 -0.0524 0 -0.6189 -0.7761 0.1205 -0.0524 -0.1926 0 -0.4307 -0.8944 0.1205 0.1156 -0.2982 0 -0.2209 -0.9678 0.1205 0.3029 -0.3637 0 0 -0.9927 0.1205 0.5 -0.3859 0 0.2209 -0.9678 0.1205 0.6971 -0.3637 0 0.4307 -0.8944 0.1205 0.8844 -0.2982 0 0.6189 -0.7761 0.1205 1.0524 -0.1926 0 0.7761 -0.6189 0.1205 1.1926 -0.0524 0 0.8944 -0.4307 0.1205 1.2982 0.1156 0 0.9678 -0.2209 0.1205 1.3637 0.3029 0 0.9927 0 0.1205 1.3859 0.5 0 0.9927 0 -0.1205 1.6288 0.5 0 0.9678 0.2209 -0.1205 1.6005 0.7512 0 0.8944 0.4307 -0.1205 1.517 0.9898 0 0.7761 0.6189 -0.1205 1.3825 1.2038 0 0.6189 0.7761 -0.1205 1.2038 1.3825 0 0.4307 0.8944 -0.1205 0.9898 1.517 0 0.2209 0.9678 -0.1205 0.7512 1.6005 0 0 0.9927 -0.1205 0.5 1.6288 0 -0.2209 0.9678 -0.1205 0.2488 1.6005 0 -0.4307 0.8944 -0.1205 0.0102 1.517 0 -0.6189 0.7761 -0.1205 -0.2038 1.3825 0 -0.7761 0.6189 -0.1205 -0.3825 1.2038 0 -0.8944 0.4307 -0.1205 -0.517 0.9898 0 -0.9678 0.2209 -0.1205 -0.6005 0.7512 0 -0.9927 0 -0.1205 -0.6288 0.5 0 -0.9678 -0.2209 -0.1205 -0.6005 0.2488 0 -0.8944 -0.4307 -0.1205 -0.517 0.0102 0 -0.7761 -0.6189 -0.1205 -0.3825 -0.2038 0 -0.6189 -0.7761 -0.1205 -0.2038 -0.3825 0 -0.4307 -0.8944 -0.1205 0.0102 -0.517 0 -0.2209 -0.9678 -0.1205 0.2488 -0.6005 0 0 -0.9927 -0.1205 0.5 -0.6288 0 0.2209 -0.9678 -0.1205 0.7512 -0.6005 0 0.4307 -0.8944 -0.1205 0.9898 -0.517 0 0.6189 -0.7761 -0.1205 1.2038 -0.3825 0 0.7761 -0.6189 -0.1205 1.3825 -0.2038 0 0.8944 -0.4307 -0.1205 1.517 0.0102 0 0.9678 -0.2209 -0.1205 1.6005 0.2488 0 0.9927 0 -0.1205 1.6288 0.5 0 0.935 0 -0.3546 1.9488 0.5 0 0.9116 0.2081 -0.3546 1.9124 0.8224 0 0.8424 0.4057 -0.3546 1.8053 1.1286 0 0.731 0.583 -0.3546 1.6327 1.4033 0 0.583 0.731 -0.3546 1.4033 1.6327 0 0.4057 0.8424 -0.3546 1.1286 1.8053 0 0.2081 0.9116 -0.3546 0.8224 1.9124 0 0 0.935 -0.3546 0.5 1.9488 0 -0.2081 0.9116 -0.3546 0.1776 1.9124 0 -0.4057 0.8424 -0.3546 -0.1286 1.8053 0 -0.583 0.731 -0.3546 -0.4033 1.6327 0 -0.731 0.583 -0.3546 -0.6327 1.4033 0 -0.8424 0.4057 -0.3546 -0.8053 1.1286 0 -0.9116 0.2081 -0.3546 -0.9124 0.8224 0 -0.935 0 -0.3546 -0.9488 0.5 0 -0.9116 -0.2081 -0.3546 -0.9124 0.1776 0 -0.8424 -0.4057 -0.3546 -0.8053 -0.1286 0 -0.731 -0.583 -0.3546 -0.6327 -0.4033 0 -0.583 -0.731 -0.3546 -0.4033 -0.6327 0 -0.4057 -0.8424 -0.3546 -0.1286 -0.8053 0 -0.2081 -0.9116 -0.3546 0.1776 -0.9124 0 0 -0.935 -0.3546 0.5 -0.9488 0 0.2081 -0.9116 -0.3546 0.8224 -0.9124 0 0.4057 -0.8424 -0.3546 1.1286 -0.8053 0 0.583 -0.731 -0.3546 1.4033 -0.6327 0 0.731 -0.583 -0.3546 1.6327 -0.4033 0 0.8424 -0.4057 -0.3546 1.8053 -0.1286 0 0.9116 -0.2081 -0.3546 1.9124 0.1776 0 0.935 0 -0.3546 1.9488 0.5 0 0.823 0 -0.5681 2.4053 0.5 0 0.8023 0.1831 -0.5681 2.3576 0.924 0 0.7415 0.3571 -0.5681 2.2167 1.3267 0 0.6434 0.5131 -0.5681 1.9897 1.688 0 0.5131 0.6434 -0.5681 1.688 1.9897 0 0.3571 0.7415 -0.5681 1.3267 2.2167 0 0.1831 0.8023 -0.5681 0.924 2.3576 0 0 0.823 -0.5681 0.5 2.4053 0 -0.1831 0.8023 -0.5681 0.076 2.3576 0 -0.3571 0.7415 -0.5681 -0.3267 2.2167 0 -0.5131 0.6434 -0.5681 -0.688 1.9897 0 -0.6434 0.5131 -0.5681 -0.9897 1.688 0 -0.7415 0.3571 -0.5681 -1.2167 1.3267 0 -0.8023 0.1831 -0.5681 -1.3576 0.924 0 -0.823 0 -0.5681 -1.4053 0.5 0 -0.8023 -0.1831 -0.5681 -1.3576 0.076 0 -0.7415 -0.3571 -0.5681 -1.2167 -0.3267 0 -0.6434 -0.5131 -0.5681 -0.9897 -0.688 0 -0.5131 -0.6434 -0.5681 -0.688 -0.9897 0 -0.3571 -0.7415 -0.5681 -0.3267 -1.2167 0 -0.1831 -0.8023 -0.5681 0.076 -1.3576 0 0 -0.823 -0.5681 0.5 -1.4053 0 0.1831 -0.8023 -0.5681 0.924 -1.3576 0 0.3571 -0.7415 -0.5681 1.3267 -1.2167 0 0.5131 -0.6434 -0.5681 1.688 -0.9897 0 0.6434 -0.5131 -0.5681 1.9897 -0.688 0 0.7415 -0.3571 -0.5681 2.2167 -0.3267 0 0.8023 -0.1831 -0.5681 2.3576 0.076 0 0.823 0 -0.5681 2.4053 0.5 0 0.6631 0 -0.7485 3.1368 0.5 0 0.6465 0.1476 -0.7485 3.0707 1.0867 0 0.5975 0.2877 -0.7485 2.8757 1.6441 0 0.5185 0.4135 -0.7485 2.5615 2.144 0 0.4135 0.5185 -0.7485 2.144 2.5615 0 0.2877 0.5975 -0.7485 1.6441 2.8757 0 0.1476 0.6465 -0.7485 1.0867 3.0707 0 0 0.6631 -0.7485 0.5 3.1368 0 -0.1476 0.6465 -0.7485 -0.0867 3.0707 0 -0.2877 0.5975 -0.7485 -0.6441 2.8757 0 -0.4135 0.5185 -0.7485 -1.144 2.5615 0 -0.5185 0.4135 -0.7485 -1.5615 2.144 0 -0.5975 0.2877 -0.7485 -1.8757 1.6441 0 -0.6465 0.1476 -0.7485 -2.0707 1.0867 0 -0.6631 0 -0.7485 -2.1368 0.5 0 -0.6465 -0.1476 -0.7485 -2.0707 -0.0867 0 -0.5975 -0.2877 -0.7485 -1.8757 -0.6441 0 -0.5185 -0.4135 -0.7485 -1.5615 -1.144 0 -0.4135 -0.5185 -0.7485 -1.144 -1.5615 0 -0.2877 -0.5975 -0.7485 -0.6441 -1.8757 0 -0.1476 -0.6465 -0.7485 -0.0867 -2.0707 0 0 -0.6631 -0.7485 0.5 -2.1368 0 0.1476 -0.6465 -0.7485 1.0867 -2.0707 0 0.2877 -0.5975 -0.7485 1.6441 -1.8757 0 0.4135 -0.5185 -0.7485 2.144 -1.5615 0 0.5185 -0.4135 -0.7485 2.5615 -1.144 0 0.5975 -0.2877 -0.7485 2.8757 -0.6441 0 0.6465 -0.1476 -0.7485 3.0707 -0.0867 0 0.6631 0 -0.7485 3.1368 0.5 0 0.4647 0 -0.8855 4.5572 0.5 0 0.4531 0.1034 -0.8855 4.4554 1.4028 0 0.4187 0.2016 -0.8855 4.1554 2.2603 0 0.3633 0.2898 -0.8855 3.672 3.0296 0 0.2898 0.3633 -0.8855 3.0296 3.672 0 0.2016 0.4187 -0.8855 2.2603 4.1554 0 0.1034 0.4531 -0.8855 1.4028 4.4554 0 0 0.4647 -0.8855 0.5 4.5572 0 -0.1034 0.4531 -0.8855 -0.4028 4.4554 0 -0.2016 0.4187 -0.8855 -1.2603 4.1554 0 -0.2898 0.3633 -0.8855 -2.0296 3.672 0 -0.3633 0.2898 -0.8855 -2.672 3.0296 0 -0.4187 0.2016 -0.8855 -3.1554 2.2603 0 -0.4531 0.1034 -0.8855 -3.4554 1.4028 0 -0.4647 0 -0.8855 -3.5572 0.5 0 -0.4531 -0.1034 -0.8855 -3.4554 -0.4028 0 -0.4187 -0.2016 -0.8855 -3.1554 -1.2603 0 -0.3633 -0.2898 -0.8855 -2.672 -2.0296 0 -0.2898 -0.3633 -0.8855 -2.0296 -2.672 0 -0.2016 -0.4187 -0.8855 -1.2603 -3.1554 0 -0.1034 -0.4531 -0.8855 -0.4028 -3.4554 0 0 -0.4647 -0.8855 0.5 -3.5572 0 0.1034 -0.4531 -0.8855 1.4028 -3.4554 0 0.2016 -0.4187 -0.8855 2.2603 -3.1554 0 0.2898 -0.3633 -0.8855 3.0296 -2.672 0 0.3633 -0.2898 -0.8855 3.672 -2.0296 0 0.4187 -0.2016 -0.8855 4.1554 -1.2603 0 0.4531 -0.1034 -0.8855 4.4554 -0.4028 0 0.4647 0 -0.8855 4.5572 0.5 0 0.2393 0 -0.9709 8.7357 0.5 0 0.2333 0.0533 -0.9709 8.5293 2.3326 0 0.2156 0.1038 -0.9709 7.9201 4.0734 0 0.1871 0.1492 -0.9709 6.939 5.6349 0 0.1492 0.1871 -0.9709 5.6349 6.939 0 0.1038 0.2156 -0.9709 4.0734 7.9201 0 0.0533 0.2333 -0.9709 2.3326 8.5293 0 0 0.2393 -0.9709 0.5 8.7357 0 -0.0533 0.2333 -0.9709 -1.3326 8.5293 0 -0.1038 0.2156 -0.9709 -3.0734 7.9201 0 -0.1492 0.1871 -0.9709 -4.6349 6.939 0 -0.1871 0.1492 -0.9709 -5.939 5.6349 0 -0.2156 0.1038 -0.9709 -6.9201 4.0734 0 -0.2333 0.0533 -0.9709 -7.5293 2.3326 0 -0.2393 0 -0.9709 -7.7357 0.5 0 -0.2333 -0.0533 -0.9709 -7.5293 -1.3326 0 -0.2156 -0.1038 -0.9709 -6.9201 -3.0734 0 -0.1871 -0.1492 -0.9709 -5.939 -4.6349 0 -0.1492 -0.1871 -0.9709 -4.6349 -5.939 0 -0.1038 -0.2156 -0.9709 -3.0734 -6.9201 0 -0.0533 -0.2333 -0.9709 -1.3326 -7.5293 0 0 -0.2393 -0.9709 0.5 -7.7357 0 0.0533 -0.2333 -0.9709 2.3326 -7.5293 0 0.1038 -0.2156 -0.9709 4.0734 -6.9201 0 0.1492 -0.1871 -0.9709 5.6349 -5.939 0 0.1871 -0.1492 -0.9709 6.939 -4.6349 0 0.2156 -0.1038 -0.9709 7.9201 -3.0734 0 0.2333 -0.0533 -0.9709 8.5293 -1.3326 0 0.2393 0 -0.9709 8.7357 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 } } } } } } } } } } } } } } } } } } } } } } } # end (geom and INST) Model0 } #end of World List } } # end of World and INST geomview-1.9.5/data/geom/textured/rabbitball0000644000175000017500000006000312310110173016002 00000000000000# ../solar/junk/mkearthtx -stereographic 28 14 appearance { *-evert backcull +texturing shading smooth texture { file rabbits.ppm.gz transform 1.5 0 0 0 0 1.5 0 0 0 0 1 0 -.25 -.25 0 1 } } NUMESH 29 14 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.2393 0.0000 0.9709 0.239 0.000 0.971 0.6214 0.5000 0 0.2333 0.0533 0.9709 0.233 0.053 0.971 0.6184 0.5270 0 0.2156 0.1038 0.9709 0.216 0.104 0.971 0.6094 0.5527 0 0.1871 0.1492 0.9709 0.187 0.149 0.971 0.5949 0.5757 0 0.1492 0.1871 0.9709 0.149 0.187 0.971 0.5757 0.5949 0 0.1038 0.2156 0.9709 0.104 0.216 0.971 0.5527 0.6094 0 0.0533 0.2333 0.9709 0.053 0.233 0.971 0.5270 0.6184 0 0.0000 0.2393 0.9709 0.000 0.239 0.971 0.5000 0.6214 0 -0.0533 0.2333 0.9709 -0.053 0.233 0.971 0.4730 0.6184 0 -0.1038 0.2156 0.9709 -0.104 0.216 0.971 0.4473 0.6094 0 -0.1492 0.1871 0.9709 -0.149 0.187 0.971 0.4243 0.5949 0 -0.1871 0.1492 0.9709 -0.187 0.149 0.971 0.4051 0.5757 0 -0.2156 0.1038 0.9709 -0.216 0.104 0.971 0.3906 0.5527 0 -0.2333 0.0533 0.9709 -0.233 0.053 0.971 0.3816 0.5270 0 -0.2393 0.0000 0.9709 -0.239 0.000 0.971 0.3786 0.5000 0 -0.2333 -0.0533 0.9709 -0.233 -0.053 0.971 0.3816 0.4730 0 -0.2156 -0.1038 0.9709 -0.216 -0.104 0.971 0.3906 0.4473 0 -0.1871 -0.1492 0.9709 -0.187 -0.149 0.971 0.4051 0.4243 0 -0.1492 -0.1871 0.9709 -0.149 -0.187 0.971 0.4243 0.4051 0 -0.1038 -0.2156 0.9709 -0.104 -0.216 0.971 0.4473 0.3906 0 -0.0533 -0.2333 0.9709 -0.053 -0.233 0.971 0.4730 0.3816 0 0.0000 -0.2393 0.9709 0.000 -0.239 0.971 0.5000 0.3786 0 0.0533 -0.2333 0.9709 0.053 -0.233 0.971 0.5270 0.3816 0 0.1038 -0.2156 0.9709 0.104 -0.216 0.971 0.5527 0.3906 0 0.1492 -0.1871 0.9709 0.149 -0.187 0.971 0.5757 0.4051 0 0.1871 -0.1492 0.9709 0.187 -0.149 0.971 0.5949 0.4243 0 0.2156 -0.1038 0.9709 0.216 -0.104 0.971 0.6094 0.4473 0 0.2333 -0.0533 0.9709 0.233 -0.053 0.971 0.6184 0.4730 0 0.2393 0.0000 0.9709 0.239 0.000 0.971 0.6214 0.5000 0 0.4647 0.0000 0.8855 0.465 0.000 0.885 0.7465 0.5000 0 0.4531 0.1034 0.8855 0.453 0.103 0.885 0.7403 0.5548 0 0.4187 0.2016 0.8855 0.419 0.202 0.885 0.7221 0.6069 0 0.3633 0.2898 0.8855 0.363 0.290 0.885 0.6927 0.6537 0 0.2898 0.3633 0.8855 0.290 0.363 0.885 0.6537 0.6927 0 0.2016 0.4187 0.8855 0.202 0.419 0.885 0.6069 0.7221 0 0.1034 0.4531 0.8855 0.103 0.453 0.885 0.5548 0.7403 0 0.0000 0.4647 0.8855 0.000 0.465 0.885 0.5000 0.7465 0 -0.1034 0.4531 0.8855 -0.103 0.453 0.885 0.4452 0.7403 0 -0.2016 0.4187 0.8855 -0.202 0.419 0.885 0.3931 0.7221 0 -0.2898 0.3633 0.8855 -0.290 0.363 0.885 0.3463 0.6927 0 -0.3633 0.2898 0.8855 -0.363 0.290 0.885 0.3073 0.6537 0 -0.4187 0.2016 0.8855 -0.419 0.202 0.885 0.2779 0.6069 0 -0.4531 0.1034 0.8855 -0.453 0.103 0.885 0.2597 0.5548 0 -0.4647 0.0000 0.8855 -0.465 0.000 0.885 0.2535 0.5000 0 -0.4531 -0.1034 0.8855 -0.453 -0.103 0.885 0.2597 0.4452 0 -0.4187 -0.2016 0.8855 -0.419 -0.202 0.885 0.2779 0.3931 0 -0.3633 -0.2898 0.8855 -0.363 -0.290 0.885 0.3073 0.3463 0 -0.2898 -0.3633 0.8855 -0.290 -0.363 0.885 0.3463 0.3073 0 -0.2016 -0.4187 0.8855 -0.202 -0.419 0.885 0.3931 0.2779 0 -0.1034 -0.4531 0.8855 -0.103 -0.453 0.885 0.4452 0.2597 0 0.0000 -0.4647 0.8855 0.000 -0.465 0.885 0.5000 0.2535 0 0.1034 -0.4531 0.8855 0.103 -0.453 0.885 0.5548 0.2597 0 0.2016 -0.4187 0.8855 0.202 -0.419 0.885 0.6069 0.2779 0 0.2898 -0.3633 0.8855 0.290 -0.363 0.885 0.6537 0.3073 0 0.3633 -0.2898 0.8855 0.363 -0.290 0.885 0.6927 0.3463 0 0.4187 -0.2016 0.8855 0.419 -0.202 0.885 0.7221 0.3931 0 0.4531 -0.1034 0.8855 0.453 -0.103 0.885 0.7403 0.4452 0 0.4647 0.0000 0.8855 0.465 0.000 0.885 0.7465 0.5000 0 0.6631 0.0000 0.7485 0.663 0.000 0.749 0.8792 0.5000 0 0.6465 0.1476 0.7485 0.646 0.148 0.749 0.8697 0.5844 0 0.5975 0.2877 0.7485 0.597 0.288 0.749 0.8417 0.6646 0 0.5185 0.4135 0.7485 0.518 0.413 0.749 0.7965 0.7365 0 0.4135 0.5185 0.7485 0.413 0.518 0.749 0.7365 0.7965 0 0.2877 0.5975 0.7485 0.288 0.597 0.749 0.6646 0.8417 0 0.1476 0.6465 0.7485 0.148 0.646 0.749 0.5844 0.8697 0 0.0000 0.6631 0.7485 0.000 0.663 0.749 0.5000 0.8792 0 -0.1476 0.6465 0.7485 -0.148 0.646 0.749 0.4156 0.8697 0 -0.2877 0.5975 0.7485 -0.288 0.597 0.749 0.3354 0.8417 0 -0.4135 0.5185 0.7485 -0.413 0.518 0.749 0.2635 0.7965 0 -0.5185 0.4135 0.7485 -0.518 0.413 0.749 0.2035 0.7365 0 -0.5975 0.2877 0.7485 -0.597 0.288 0.749 0.1583 0.6646 0 -0.6465 0.1476 0.7485 -0.646 0.148 0.749 0.1303 0.5844 0 -0.6631 0.0000 0.7485 -0.663 0.000 0.749 0.1208 0.5000 0 -0.6465 -0.1476 0.7485 -0.646 -0.148 0.749 0.1303 0.4156 0 -0.5975 -0.2877 0.7485 -0.597 -0.288 0.749 0.1583 0.3354 0 -0.5185 -0.4135 0.7485 -0.518 -0.413 0.749 0.2035 0.2635 0 -0.4135 -0.5185 0.7485 -0.413 -0.518 0.749 0.2635 0.2035 0 -0.2877 -0.5975 0.7485 -0.288 -0.597 0.749 0.3354 0.1583 0 -0.1476 -0.6465 0.7485 -0.148 -0.646 0.749 0.4156 0.1303 0 0.0000 -0.6631 0.7485 0.000 -0.663 0.749 0.5000 0.1208 0 0.1476 -0.6465 0.7485 0.148 -0.646 0.749 0.5844 0.1303 0 0.2877 -0.5975 0.7485 0.288 -0.597 0.749 0.6646 0.1583 0 0.4135 -0.5185 0.7485 0.413 -0.518 0.749 0.7365 0.2035 0 0.5185 -0.4135 0.7485 0.518 -0.413 0.749 0.7965 0.2635 0 0.5975 -0.2877 0.7485 0.597 -0.288 0.749 0.8417 0.3354 0 0.6465 -0.1476 0.7485 0.646 -0.148 0.749 0.8697 0.4156 0 0.6631 0.0000 0.7485 0.663 0.000 0.749 0.8792 0.5000 0 0.8230 0.0000 0.5681 0.823 0.000 0.568 1.0248 0.5000 0 0.8023 0.1831 0.5681 0.802 0.183 0.568 1.0117 0.6168 0 0.7415 0.3571 0.5681 0.741 0.357 0.568 0.9729 0.7277 0 0.6434 0.5131 0.5681 0.643 0.513 0.568 0.9103 0.8272 0 0.5131 0.6434 0.5681 0.513 0.643 0.568 0.8272 0.9103 0 0.3571 0.7415 0.5681 0.357 0.741 0.568 0.7277 0.9729 0 0.1831 0.8023 0.5681 0.183 0.802 0.568 0.6168 1.0117 0 0.0000 0.8230 0.5681 0.000 0.823 0.568 0.5000 1.0248 0 -0.1831 0.8023 0.5681 -0.183 0.802 0.568 0.3832 1.0117 0 -0.3571 0.7415 0.5681 -0.357 0.741 0.568 0.2723 0.9729 0 -0.5131 0.6434 0.5681 -0.513 0.643 0.568 0.1728 0.9103 0 -0.6434 0.5131 0.5681 -0.643 0.513 0.568 0.0897 0.8272 0 -0.7415 0.3571 0.5681 -0.741 0.357 0.568 0.0271 0.7277 0 -0.8023 0.1831 0.5681 -0.802 0.183 0.568 -0.0117 0.6168 0 -0.8230 0.0000 0.5681 -0.823 0.000 0.568 -0.0248 0.5000 0 -0.8023 -0.1831 0.5681 -0.802 -0.183 0.568 -0.0117 0.3832 0 -0.7415 -0.3571 0.5681 -0.741 -0.357 0.568 0.0271 0.2723 0 -0.6434 -0.5131 0.5681 -0.643 -0.513 0.568 0.0897 0.1728 0 -0.5131 -0.6434 0.5681 -0.513 -0.643 0.568 0.1728 0.0897 0 -0.3571 -0.7415 0.5681 -0.357 -0.741 0.568 0.2723 0.0271 0 -0.1831 -0.8023 0.5681 -0.183 -0.802 0.568 0.3832 -0.0117 0 0.0000 -0.8230 0.5681 0.000 -0.823 0.568 0.5000 -0.0248 0 0.1831 -0.8023 0.5681 0.183 -0.802 0.568 0.6168 -0.0117 0 0.3571 -0.7415 0.5681 0.357 -0.741 0.568 0.7277 0.0271 0 0.5131 -0.6434 0.5681 0.513 -0.643 0.568 0.8272 0.0897 0 0.6434 -0.5131 0.5681 0.643 -0.513 0.568 0.9103 0.1728 0 0.7415 -0.3571 0.5681 0.741 -0.357 0.568 0.9729 0.2723 0 0.8023 -0.1831 0.5681 0.802 -0.183 0.568 1.0117 0.3832 0 0.8230 0.0000 0.5681 0.823 0.000 0.568 1.0248 0.5000 0 0.9350 0.0000 0.3546 0.935 0.000 0.355 1.1903 0.5000 0 0.9116 0.2081 0.3546 0.912 0.208 0.355 1.1729 0.6536 0 0.8424 0.4057 0.3546 0.842 0.406 0.355 1.1219 0.7995 0 0.7310 0.5830 0.3546 0.731 0.583 0.355 1.0397 0.9304 0 0.5830 0.7310 0.3546 0.583 0.731 0.355 0.9304 1.0397 0 0.4057 0.8424 0.3546 0.406 0.842 0.355 0.7995 1.1219 0 0.2081 0.9116 0.3546 0.208 0.912 0.355 0.6536 1.1729 0 0.0000 0.9350 0.3546 0.000 0.935 0.355 0.5000 1.1903 0 -0.2081 0.9116 0.3546 -0.208 0.912 0.355 0.3464 1.1729 0 -0.4057 0.8424 0.3546 -0.406 0.842 0.355 0.2005 1.1219 0 -0.5830 0.7310 0.3546 -0.583 0.731 0.355 0.0696 1.0397 0 -0.7310 0.5830 0.3546 -0.731 0.583 0.355 -0.0397 0.9304 0 -0.8424 0.4057 0.3546 -0.842 0.406 0.355 -0.1219 0.7995 0 -0.9116 0.2081 0.3546 -0.912 0.208 0.355 -0.1729 0.6536 0 -0.9350 0.0000 0.3546 -0.935 0.000 0.355 -0.1903 0.5000 0 -0.9116 -0.2081 0.3546 -0.912 -0.208 0.355 -0.1729 0.3464 0 -0.8424 -0.4057 0.3546 -0.842 -0.406 0.355 -0.1219 0.2005 0 -0.7310 -0.5830 0.3546 -0.731 -0.583 0.355 -0.0397 0.0696 0 -0.5830 -0.7310 0.3546 -0.583 -0.731 0.355 0.0696 -0.0397 0 -0.4057 -0.8424 0.3546 -0.406 -0.842 0.355 0.2005 -0.1219 0 -0.2081 -0.9116 0.3546 -0.208 -0.912 0.355 0.3464 -0.1729 0 0.0000 -0.9350 0.3546 0.000 -0.935 0.355 0.5000 -0.1903 0 0.2081 -0.9116 0.3546 0.208 -0.912 0.355 0.6536 -0.1729 0 0.4057 -0.8424 0.3546 0.406 -0.842 0.355 0.7995 -0.1219 0 0.5830 -0.7310 0.3546 0.583 -0.731 0.355 0.9304 -0.0397 0 0.7310 -0.5830 0.3546 0.731 -0.583 0.355 1.0397 0.0696 0 0.8424 -0.4057 0.3546 0.842 -0.406 0.355 1.1219 0.2005 0 0.9116 -0.2081 0.3546 0.912 -0.208 0.355 1.1729 0.3464 0 0.9350 0.0000 0.3546 0.935 0.000 0.355 1.1903 0.5000 0 0.9927 0.0000 0.1205 0.993 0.000 0.121 1.3859 0.5000 0 0.9678 0.2209 0.1205 0.968 0.221 0.121 1.3637 0.6971 0 0.8944 0.4307 0.1205 0.894 0.431 0.121 1.2982 0.8844 0 0.7761 0.6189 0.1205 0.776 0.619 0.121 1.1926 1.0524 0 0.6189 0.7761 0.1205 0.619 0.776 0.121 1.0524 1.1926 0 0.4307 0.8944 0.1205 0.431 0.894 0.121 0.8844 1.2982 0 0.2209 0.9678 0.1205 0.221 0.968 0.121 0.6971 1.3637 0 0.0000 0.9927 0.1205 0.000 0.993 0.121 0.5000 1.3859 0 -0.2209 0.9678 0.1205 -0.221 0.968 0.121 0.3029 1.3637 0 -0.4307 0.8944 0.1205 -0.431 0.894 0.121 0.1156 1.2982 0 -0.6189 0.7761 0.1205 -0.619 0.776 0.121 -0.0524 1.1926 0 -0.7761 0.6189 0.1205 -0.776 0.619 0.121 -0.1926 1.0524 0 -0.8944 0.4307 0.1205 -0.894 0.431 0.121 -0.2982 0.8844 0 -0.9678 0.2209 0.1205 -0.968 0.221 0.121 -0.3637 0.6971 0 -0.9927 0.0000 0.1205 -0.993 0.000 0.121 -0.3859 0.5000 0 -0.9678 -0.2209 0.1205 -0.968 -0.221 0.121 -0.3637 0.3029 0 -0.8944 -0.4307 0.1205 -0.894 -0.431 0.121 -0.2982 0.1156 0 -0.7761 -0.6189 0.1205 -0.776 -0.619 0.121 -0.1926 -0.0524 0 -0.6189 -0.7761 0.1205 -0.619 -0.776 0.121 -0.0524 -0.1926 0 -0.4307 -0.8944 0.1205 -0.431 -0.894 0.121 0.1156 -0.2982 0 -0.2209 -0.9678 0.1205 -0.221 -0.968 0.121 0.3029 -0.3637 0 0.0000 -0.9927 0.1205 0.000 -0.993 0.121 0.5000 -0.3859 0 0.2209 -0.9678 0.1205 0.221 -0.968 0.121 0.6971 -0.3637 0 0.4307 -0.8944 0.1205 0.431 -0.894 0.121 0.8844 -0.2982 0 0.6189 -0.7761 0.1205 0.619 -0.776 0.121 1.0524 -0.1926 0 0.7761 -0.6189 0.1205 0.776 -0.619 0.121 1.1926 -0.0524 0 0.8944 -0.4307 0.1205 0.894 -0.431 0.121 1.2982 0.1156 0 0.9678 -0.2209 0.1205 0.968 -0.221 0.121 1.3637 0.3029 0 0.9927 0.0000 0.1205 0.993 0.000 0.121 1.3859 0.5000 0 0.9927 0.0000 -0.1205 0.993 0.000 -0.121 1.6288 0.5000 0 0.9678 0.2209 -0.1205 0.968 0.221 -0.121 1.6005 0.7512 0 0.8944 0.4307 -0.1205 0.894 0.431 -0.121 1.5170 0.9898 0 0.7761 0.6189 -0.1205 0.776 0.619 -0.121 1.3825 1.2038 0 0.6189 0.7761 -0.1205 0.619 0.776 -0.121 1.2038 1.3825 0 0.4307 0.8944 -0.1205 0.431 0.894 -0.121 0.9898 1.5170 0 0.2209 0.9678 -0.1205 0.221 0.968 -0.121 0.7512 1.6005 0 0.0000 0.9927 -0.1205 0.000 0.993 -0.121 0.5000 1.6288 0 -0.2209 0.9678 -0.1205 -0.221 0.968 -0.121 0.2488 1.6005 0 -0.4307 0.8944 -0.1205 -0.431 0.894 -0.121 0.0102 1.5170 0 -0.6189 0.7761 -0.1205 -0.619 0.776 -0.121 -0.2038 1.3825 0 -0.7761 0.6189 -0.1205 -0.776 0.619 -0.121 -0.3825 1.2038 0 -0.8944 0.4307 -0.1205 -0.894 0.431 -0.121 -0.5170 0.9898 0 -0.9678 0.2209 -0.1205 -0.968 0.221 -0.121 -0.6005 0.7512 0 -0.9927 0.0000 -0.1205 -0.993 0.000 -0.121 -0.6288 0.5000 0 -0.9678 -0.2209 -0.1205 -0.968 -0.221 -0.121 -0.6005 0.2488 0 -0.8944 -0.4307 -0.1205 -0.894 -0.431 -0.121 -0.5170 0.0102 0 -0.7761 -0.6189 -0.1205 -0.776 -0.619 -0.121 -0.3825 -0.2038 0 -0.6189 -0.7761 -0.1205 -0.619 -0.776 -0.121 -0.2038 -0.3825 0 -0.4307 -0.8944 -0.1205 -0.431 -0.894 -0.121 0.0102 -0.5170 0 -0.2209 -0.9678 -0.1205 -0.221 -0.968 -0.121 0.2488 -0.6005 0 0.0000 -0.9927 -0.1205 0.000 -0.993 -0.121 0.5000 -0.6288 0 0.2209 -0.9678 -0.1205 0.221 -0.968 -0.121 0.7512 -0.6005 0 0.4307 -0.8944 -0.1205 0.431 -0.894 -0.121 0.9898 -0.5170 0 0.6189 -0.7761 -0.1205 0.619 -0.776 -0.121 1.2038 -0.3825 0 0.7761 -0.6189 -0.1205 0.776 -0.619 -0.121 1.3825 -0.2038 0 0.8944 -0.4307 -0.1205 0.894 -0.431 -0.121 1.5170 0.0102 0 0.9678 -0.2209 -0.1205 0.968 -0.221 -0.121 1.6005 0.2488 0 0.9927 0.0000 -0.1205 0.993 0.000 -0.121 1.6288 0.5000 0 0.9350 0.0000 -0.3546 0.935 0.000 -0.355 1.9488 0.5000 0 0.9116 0.2081 -0.3546 0.912 0.208 -0.355 1.9124 0.8224 0 0.8424 0.4057 -0.3546 0.842 0.406 -0.355 1.8053 1.1286 0 0.7310 0.5830 -0.3546 0.731 0.583 -0.355 1.6327 1.4033 0 0.5830 0.7310 -0.3546 0.583 0.731 -0.355 1.4033 1.6327 0 0.4057 0.8424 -0.3546 0.406 0.842 -0.355 1.1286 1.8053 0 0.2081 0.9116 -0.3546 0.208 0.912 -0.355 0.8224 1.9124 0 0.0000 0.9350 -0.3546 0.000 0.935 -0.355 0.5000 1.9488 0 -0.2081 0.9116 -0.3546 -0.208 0.912 -0.355 0.1776 1.9124 0 -0.4057 0.8424 -0.3546 -0.406 0.842 -0.355 -0.1286 1.8053 0 -0.5830 0.7310 -0.3546 -0.583 0.731 -0.355 -0.4033 1.6327 0 -0.7310 0.5830 -0.3546 -0.731 0.583 -0.355 -0.6327 1.4033 0 -0.8424 0.4057 -0.3546 -0.842 0.406 -0.355 -0.8053 1.1286 0 -0.9116 0.2081 -0.3546 -0.912 0.208 -0.355 -0.9124 0.8224 0 -0.9350 0.0000 -0.3546 -0.935 0.000 -0.355 -0.9488 0.5000 0 -0.9116 -0.2081 -0.3546 -0.912 -0.208 -0.355 -0.9124 0.1776 0 -0.8424 -0.4057 -0.3546 -0.842 -0.406 -0.355 -0.8053 -0.1286 0 -0.7310 -0.5830 -0.3546 -0.731 -0.583 -0.355 -0.6327 -0.4033 0 -0.5830 -0.7310 -0.3546 -0.583 -0.731 -0.355 -0.4033 -0.6327 0 -0.4057 -0.8424 -0.3546 -0.406 -0.842 -0.355 -0.1286 -0.8053 0 -0.2081 -0.9116 -0.3546 -0.208 -0.912 -0.355 0.1776 -0.9124 0 0.0000 -0.9350 -0.3546 0.000 -0.935 -0.355 0.5000 -0.9488 0 0.2081 -0.9116 -0.3546 0.208 -0.912 -0.355 0.8224 -0.9124 0 0.4057 -0.8424 -0.3546 0.406 -0.842 -0.355 1.1286 -0.8053 0 0.5830 -0.7310 -0.3546 0.583 -0.731 -0.355 1.4033 -0.6327 0 0.7310 -0.5830 -0.3546 0.731 -0.583 -0.355 1.6327 -0.4033 0 0.8424 -0.4057 -0.3546 0.842 -0.406 -0.355 1.8053 -0.1286 0 0.9116 -0.2081 -0.3546 0.912 -0.208 -0.355 1.9124 0.1776 0 0.9350 0.0000 -0.3546 0.935 0.000 -0.355 1.9488 0.5000 0 0.8230 0.0000 -0.5681 0.823 0.000 -0.568 2.4053 0.5000 0 0.8023 0.1831 -0.5681 0.802 0.183 -0.568 2.3576 0.9240 0 0.7415 0.3571 -0.5681 0.741 0.357 -0.568 2.2167 1.3267 0 0.6434 0.5131 -0.5681 0.643 0.513 -0.568 1.9897 1.6880 0 0.5131 0.6434 -0.5681 0.513 0.643 -0.568 1.6880 1.9897 0 0.3571 0.7415 -0.5681 0.357 0.741 -0.568 1.3267 2.2167 0 0.1831 0.8023 -0.5681 0.183 0.802 -0.568 0.9240 2.3576 0 0.0000 0.8230 -0.5681 0.000 0.823 -0.568 0.5000 2.4053 0 -0.1831 0.8023 -0.5681 -0.183 0.802 -0.568 0.0760 2.3576 0 -0.3571 0.7415 -0.5681 -0.357 0.741 -0.568 -0.3267 2.2167 0 -0.5131 0.6434 -0.5681 -0.513 0.643 -0.568 -0.6880 1.9897 0 -0.6434 0.5131 -0.5681 -0.643 0.513 -0.568 -0.9897 1.6880 0 -0.7415 0.3571 -0.5681 -0.741 0.357 -0.568 -1.2167 1.3267 0 -0.8023 0.1831 -0.5681 -0.802 0.183 -0.568 -1.3576 0.9240 0 -0.8230 0.0000 -0.5681 -0.823 0.000 -0.568 -1.4053 0.5000 0 -0.8023 -0.1831 -0.5681 -0.802 -0.183 -0.568 -1.3576 0.0760 0 -0.7415 -0.3571 -0.5681 -0.741 -0.357 -0.568 -1.2167 -0.3267 0 -0.6434 -0.5131 -0.5681 -0.643 -0.513 -0.568 -0.9897 -0.6880 0 -0.5131 -0.6434 -0.5681 -0.513 -0.643 -0.568 -0.6880 -0.9897 0 -0.3571 -0.7415 -0.5681 -0.357 -0.741 -0.568 -0.3267 -1.2167 0 -0.1831 -0.8023 -0.5681 -0.183 -0.802 -0.568 0.0760 -1.3576 0 0.0000 -0.8230 -0.5681 0.000 -0.823 -0.568 0.5000 -1.4053 0 0.1831 -0.8023 -0.5681 0.183 -0.802 -0.568 0.9240 -1.3576 0 0.3571 -0.7415 -0.5681 0.357 -0.741 -0.568 1.3267 -1.2167 0 0.5131 -0.6434 -0.5681 0.513 -0.643 -0.568 1.6880 -0.9897 0 0.6434 -0.5131 -0.5681 0.643 -0.513 -0.568 1.9897 -0.6880 0 0.7415 -0.3571 -0.5681 0.741 -0.357 -0.568 2.2167 -0.3267 0 0.8023 -0.1831 -0.5681 0.802 -0.183 -0.568 2.3576 0.0760 0 0.8230 0.0000 -0.5681 0.823 0.000 -0.568 2.4053 0.5000 0 0.6631 0.0000 -0.7485 0.663 0.000 -0.749 3.1368 0.5000 0 0.6465 0.1476 -0.7485 0.646 0.148 -0.749 3.0707 1.0867 0 0.5975 0.2877 -0.7485 0.597 0.288 -0.749 2.8757 1.6441 0 0.5185 0.4135 -0.7485 0.518 0.413 -0.749 2.5615 2.1440 0 0.4135 0.5185 -0.7485 0.413 0.518 -0.749 2.1440 2.5615 0 0.2877 0.5975 -0.7485 0.288 0.597 -0.749 1.6441 2.8757 0 0.1476 0.6465 -0.7485 0.148 0.646 -0.749 1.0867 3.0707 0 0.0000 0.6631 -0.7485 0.000 0.663 -0.749 0.5000 3.1368 0 -0.1476 0.6465 -0.7485 -0.148 0.646 -0.749 -0.0867 3.0707 0 -0.2877 0.5975 -0.7485 -0.288 0.597 -0.749 -0.6441 2.8757 0 -0.4135 0.5185 -0.7485 -0.413 0.518 -0.749 -1.1440 2.5615 0 -0.5185 0.4135 -0.7485 -0.518 0.413 -0.749 -1.5615 2.1440 0 -0.5975 0.2877 -0.7485 -0.597 0.288 -0.749 -1.8757 1.6441 0 -0.6465 0.1476 -0.7485 -0.646 0.148 -0.749 -2.0707 1.0867 0 -0.6631 0.0000 -0.7485 -0.663 0.000 -0.749 -2.1368 0.5000 0 -0.6465 -0.1476 -0.7485 -0.646 -0.148 -0.749 -2.0707 -0.0867 0 -0.5975 -0.2877 -0.7485 -0.597 -0.288 -0.749 -1.8757 -0.6441 0 -0.5185 -0.4135 -0.7485 -0.518 -0.413 -0.749 -1.5615 -1.1440 0 -0.4135 -0.5185 -0.7485 -0.413 -0.518 -0.749 -1.1440 -1.5615 0 -0.2877 -0.5975 -0.7485 -0.288 -0.597 -0.749 -0.6441 -1.8757 0 -0.1476 -0.6465 -0.7485 -0.148 -0.646 -0.749 -0.0867 -2.0707 0 0.0000 -0.6631 -0.7485 0.000 -0.663 -0.749 0.5000 -2.1368 0 0.1476 -0.6465 -0.7485 0.148 -0.646 -0.749 1.0867 -2.0707 0 0.2877 -0.5975 -0.7485 0.288 -0.597 -0.749 1.6441 -1.8757 0 0.4135 -0.5185 -0.7485 0.413 -0.518 -0.749 2.1440 -1.5615 0 0.5185 -0.4135 -0.7485 0.518 -0.413 -0.749 2.5615 -1.1440 0 0.5975 -0.2877 -0.7485 0.597 -0.288 -0.749 2.8757 -0.6441 0 0.6465 -0.1476 -0.7485 0.646 -0.148 -0.749 3.0707 -0.0867 0 0.6631 0.0000 -0.7485 0.663 0.000 -0.749 3.1368 0.5000 0 0.4647 0.0000 -0.8855 0.465 0.000 -0.885 4.5572 0.5000 0 0.4531 0.1034 -0.8855 0.453 0.103 -0.885 4.4554 1.4028 0 0.4187 0.2016 -0.8855 0.419 0.202 -0.885 4.1554 2.2603 0 0.3633 0.2898 -0.8855 0.363 0.290 -0.885 3.6720 3.0296 0 0.2898 0.3633 -0.8855 0.290 0.363 -0.885 3.0296 3.6720 0 0.2016 0.4187 -0.8855 0.202 0.419 -0.885 2.2603 4.1554 0 0.1034 0.4531 -0.8855 0.103 0.453 -0.885 1.4028 4.4554 0 0.0000 0.4647 -0.8855 0.000 0.465 -0.885 0.5000 4.5572 0 -0.1034 0.4531 -0.8855 -0.103 0.453 -0.885 -0.4028 4.4554 0 -0.2016 0.4187 -0.8855 -0.202 0.419 -0.885 -1.2603 4.1554 0 -0.2898 0.3633 -0.8855 -0.290 0.363 -0.885 -2.0296 3.6720 0 -0.3633 0.2898 -0.8855 -0.363 0.290 -0.885 -2.6720 3.0296 0 -0.4187 0.2016 -0.8855 -0.419 0.202 -0.885 -3.1554 2.2603 0 -0.4531 0.1034 -0.8855 -0.453 0.103 -0.885 -3.4554 1.4028 0 -0.4647 0.0000 -0.8855 -0.465 0.000 -0.885 -3.5572 0.5000 0 -0.4531 -0.1034 -0.8855 -0.453 -0.103 -0.885 -3.4554 -0.4028 0 -0.4187 -0.2016 -0.8855 -0.419 -0.202 -0.885 -3.1554 -1.2603 0 -0.3633 -0.2898 -0.8855 -0.363 -0.290 -0.885 -2.6720 -2.0296 0 -0.2898 -0.3633 -0.8855 -0.290 -0.363 -0.885 -2.0296 -2.6720 0 -0.2016 -0.4187 -0.8855 -0.202 -0.419 -0.885 -1.2603 -3.1554 0 -0.1034 -0.4531 -0.8855 -0.103 -0.453 -0.885 -0.4028 -3.4554 0 0.0000 -0.4647 -0.8855 0.000 -0.465 -0.885 0.5000 -3.5572 0 0.1034 -0.4531 -0.8855 0.103 -0.453 -0.885 1.4028 -3.4554 0 0.2016 -0.4187 -0.8855 0.202 -0.419 -0.885 2.2603 -3.1554 0 0.2898 -0.3633 -0.8855 0.290 -0.363 -0.885 3.0296 -2.6720 0 0.3633 -0.2898 -0.8855 0.363 -0.290 -0.885 3.6720 -2.0296 0 0.4187 -0.2016 -0.8855 0.419 -0.202 -0.885 4.1554 -1.2603 0 0.4531 -0.1034 -0.8855 0.453 -0.103 -0.885 4.4554 -0.4028 0 0.4647 0.0000 -0.8855 0.465 0.000 -0.885 4.5572 0.5000 0 0.2393 0.0000 -0.9709 0.239 0.000 -0.971 8.7357 0.5000 0 0.2333 0.0533 -0.9709 0.233 0.053 -0.971 8.5293 2.3326 0 0.2156 0.1038 -0.9709 0.216 0.104 -0.971 7.9201 4.0734 0 0.1871 0.1492 -0.9709 0.187 0.149 -0.971 6.9390 5.6349 0 0.1492 0.1871 -0.9709 0.149 0.187 -0.971 5.6349 6.9390 0 0.1038 0.2156 -0.9709 0.104 0.216 -0.971 4.0734 7.9201 0 0.0533 0.2333 -0.9709 0.053 0.233 -0.971 2.3326 8.5293 0 0.0000 0.2393 -0.9709 0.000 0.239 -0.971 0.5000 8.7357 0 -0.0533 0.2333 -0.9709 -0.053 0.233 -0.971 -1.3326 8.5293 0 -0.1038 0.2156 -0.9709 -0.104 0.216 -0.971 -3.0734 7.9201 0 -0.1492 0.1871 -0.9709 -0.149 0.187 -0.971 -4.6349 6.9390 0 -0.1871 0.1492 -0.9709 -0.187 0.149 -0.971 -5.9390 5.6349 0 -0.2156 0.1038 -0.9709 -0.216 0.104 -0.971 -6.9201 4.0734 0 -0.2333 0.0533 -0.9709 -0.233 0.053 -0.971 -7.5293 2.3326 0 -0.2393 0.0000 -0.9709 -0.239 0.000 -0.971 -7.7357 0.5000 0 -0.2333 -0.0533 -0.9709 -0.233 -0.053 -0.971 -7.5293 -1.3326 0 -0.2156 -0.1038 -0.9709 -0.216 -0.104 -0.971 -6.9201 -3.0734 0 -0.1871 -0.1492 -0.9709 -0.187 -0.149 -0.971 -5.9390 -4.6349 0 -0.1492 -0.1871 -0.9709 -0.149 -0.187 -0.971 -4.6349 -5.9390 0 -0.1038 -0.2156 -0.9709 -0.104 -0.216 -0.971 -3.0734 -6.9201 0 -0.0533 -0.2333 -0.9709 -0.053 -0.233 -0.971 -1.3326 -7.5293 0 0.0000 -0.2393 -0.9709 0.000 -0.239 -0.971 0.5000 -7.7357 0 0.0533 -0.2333 -0.9709 0.053 -0.233 -0.971 2.3326 -7.5293 0 0.1038 -0.2156 -0.9709 0.104 -0.216 -0.971 4.0734 -6.9201 0 0.1492 -0.1871 -0.9709 0.149 -0.187 -0.971 5.6349 -5.9390 0 0.1871 -0.1492 -0.9709 0.187 -0.149 -0.971 6.9390 -4.6349 0 0.2156 -0.1038 -0.9709 0.216 -0.104 -0.971 7.9201 -3.0734 0 0.2333 -0.0533 -0.9709 0.233 -0.053 -0.971 8.5293 -1.3326 0 0.2393 0.0000 -0.9709 0.239 0.000 -0.971 8.7357 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 geomview-1.9.5/data/geom/textured/square.off0000644000175000017500000000037012310110173015756 00000000000000appearance { +texturing texture { #file ../../modules/orrery/earth.ppm.Z file grid.pgm.gz } } # STOFF # 4 1 4 # # 0 0 0 0 0 # 1 0 0 1 0 # 1 1 0 1 1 # 0 1 0 0 1 # # 4 0 1 2 3 UMESH 2 2 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 1 1 0 1 1 0 geomview-1.9.5/data/geom/textured/themi.bez0000644000175000017500000000055512310110173015577 00000000000000appearance { +texturing texture { file geologo.pgm.gz } } # # homogeneous biquadratic Bezier patch for a hemisphere # CBEZ224_ST 1 0 0 1 0 0 1 0 -1 0 0 1 0 1 0 0 0 0 0 0 0 -1 0 0 -1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 1 1 1 # RGBA colors for each corner of the hemisphere patch .3 1 .3 1 1 .3 .3 1 .3 .3 1 1 1 .3 1 1 geomview-1.9.5/data/geom/textured/sphere.gcl0000644000175000017500000000061512310110173015741 00000000000000(read image { define worldimage data RGBA { < Earth.pam.bz2 } }) (read appearance { define texap -transparent texturing shading flat * mipmap * mipinterp * linear edge material { diffuse 0.839000 1.000000 0.461000 } texture { clamp none apply replace image { : worldimage } } }) (geometry sphere { appearance { : texap } STSPHERE CYLINDRICAL 1 0 0 0 }) geomview-1.9.5/data/geom/textured/Earth.pam.bz20000644000175000017500000013711212310110172016224 00000000000000BZh91AY&SY‚ü¤XhõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÅy{çqZpêÝÎÙ×UßmîížûÏ{Þ[ݵ÷n2N»7jΪª(( R÷o@ñ ¢»jŠAQW½|Å«+*eYŠ¬Í¶Ð¶ZVÖͶZ¦-33cbš’³fË5¦Ö–Fb–£KHÃɶ¶FUSMm)3YªÊ¶ÐÆÆIÕc ÖµimS4¢ÛFlÉQ£(++*µ™1‰Mµ­¶‰‰¤§è@>@€{¹@P)* ­ö³}îú»›6}cÄ•R*…HöeR©*‚Š•IVûêßwkît÷•×­³m»¹ÝÝVÛº7;4í–ØÛ§*:®šhSqw+¹¥­Û¸¨´Z­µF»»vW,ÓÍ´Ù­­–Õ­ÜζÝ] ž²w¦¹ˆ¦–Ò­±Y¤™]²I ;»¦íu]œºÎîv6î³¥Wmm[2;9ÖV&b5l±@¥G.ã>ym¶uÛo}ï{åÞûíÛÛ{u7Ÿw®¾½öê½M“]wm³¯­Ôó½ÚåPÓ :}G$ŸowC­Ûu-kîçzîzÚ ÈH¥HÐhQ¦¶À@ VÛìthi¤„Ð&š4Â421dÐh¢a¡¦@ €ŒCFšh€L™1M£!¨ÔðÑ2™ªy¦ž©šdÉ‘êz¨4Ò"dhž€Àj2M0ƒI2&˜Ñ¥=O§ø&šAá&ѦMTÿS*~jb§â§á2ž*~™&ž ÓTÙO(òj4õPõ Ò žÕˆMdÑ0CI¦F&Ѧ“d Tý=LèL§©²ž‘ê=2§è§Šy )å?Tõ=4žiFÔÓF(zž‰£õF†Ôhd €=@Ó#jM0§¨!R‰ d€&Òž˜C&&šªOF•=Oòj”ý©á*~ÕOô*¤õ–1p£—™ ·Ó³>ç3"l:*°0°«ËÑã]÷G†Äs£ƒs.lð`F¢RN‡•Ì’}ƒÌ´oam{¼}mÃåó< ß«í§ßÂK=‚Ðò椥jös"ÏV$ &$4W]æéÕ»ÚÁaEµáA¸íñJHÇ$É8xEðð½SQÐÚÆ€¤ ž›—ÑŽþS‡:1ÆßàN¶ã`9Häh~§k…2.U`—/}ŒmfÃ,>w‘{v×G»¶|¿©(3uÅ^.oE Äo4‚ÐC@1¯uQÓ¯µ}ç>©ìãdéïò `î­p"X30}W*Œ„Ši-O?oãÛSÝq'‡×ÂÜ´Ö`IG6÷D}í±HRÝJfbäd8Ðd¶åO)Ðea@ïžîjh3e BÐyÖôÑÙéÐ|¬¾/¹Òô³xšš0]Ì|öæG2TénÑ%i4_a®>|oOe‘¼»Thôû(¹·µ¯0Ô½¯zA G p*$ ž¡ð÷¸ß»/s#ÕîÅÚpþž³²Òa(œæbðN99{}MDkùL ¦äË#d ¦qšxÙì¤'"QµHaئ°`„€ßñ '^;¯J'xÊô)W rº9=ܸ¯¡°Ñzýl²§!CÜ@”‹3«îoø<ïgKÞú˜ö¸xàÂu·ûüŸô¤|NÄo¤eD’’MÃ'äa÷²î1_^bñY ¹'lr°#aáƒÀTÎŒ¨D¹¬–K°« ž[­žò‘×m`šÙ¶ª.¦ÀšWŒ™ú\máÑó2«¥ÈÂòžž°©„B‡J‡‡|—+‡ƒ&”ûì¸Ybõœ;EŠRß®ÂÅï]Ä{Eƒ¶BD 9ÐQ¦r*«~ËDb%8´>Âä^mYº"Ì  D !¦35.›Crô ŸoŽg_;›V@ó`VT„'?‰åàíõý/­äñ룣绖I (6Ùgñ©,ÚLɪ1F8Ž Köù¦ ý+"î»k%q8°ñ3„4˜™áÝÒ÷±ÇØï,EÜïOÜÐ ©a `†.…úšÏÓ.ËæÐä5©í}¾×pýåÙÝF-¯˽Øçèùù5ãz1öy˜íe‚vo>–Ï¡Ûh<°.”) €ˆP"e§ð¡É»¸w®÷!y2qìrþ_ø?WÂßíZðÈÚ½¸û7Å|w:X@8¢}Á–e†hKO]â´ˆ6èô €!$$ž£A…˜rdÔ‰yØø­DþJ‡œ ûYÄâºw8QÃ|Eìí¬GC}€é$`mÊAàòõúû®Ïð±žï¯·>îly~&=H;c®«*H€äo ŒyšÖ ǃÂo…es} Ò Ñ)šuÃ(6e1– Ó”ñÙ·`‹æ˜&ƒõnãïô} ÃÉfWÈò¶zêtZ5@…@…ÏFôj'VËe8åvÓÖ I¥¡¤³ÁP¶Wh@æšÛeDiœ ÒM`†ûç´ñ{ç£e;Û½oeÂèYRñ™òýOW½{ŸÜ|š—VÎ[×tð [¦xA¬lÅ]Vùþe~G§£év],|{ƒ2FThI0C¡ò³f{³¡®´eœöC¬îòky å¥Ü^eæÔéȘ.Ÿ3µ”sñXκO5³‹§<8õ„f@AŽ&Pˆ@§±–†ÜѹÃ׿Fâ!_*Z @`“0ò/Ýò_òcÓøñó=¿_o[ÂèÙ;8Ðg³7UÛµü)5¾lyî¶|®Ò½`TÜ!°”Pšªö¸ú·Ð1î)€@ "V¬¡µ[#“غfV¡ÿ3”¸pµLº"@¦ˆÊ)^ü§j£Ì)—"p¿"ˆ@›k¡$¿ƒØúØäì¶™|[´—膊 J2Çx\ Ñ Ú,û[†#W°Ð5”D¿¯wÉÚDÚkûì=õåJÙ±G6áqHðDB''\¢‚ˆQì¡åÍ~\ÆÇXž„?s„ã©xAŒHb„¾¤cèæŒ,ÍáøhöÖõqòþ¡Åø>ž@±ñ8ý ? Ô€èuñkïÙÚwž\ñ?#o"K„ `ž;ünŸc“äzžmà-ø}9¼žÞª{žçOâilV…A,ÈÒCA‰¤~HŠÞ˦€À8÷÷ZØ—X;%ž"䣨—«wÊÞ…(*ÍÑŒ¸G¼bÌ5€hbÒðr>«›±ø¶óºÈê€À4ìö—êÇ]³åIè{ý.uïÆò>6ì¦|ì Þ­c®Õî¾½í¼·Ñ_[¨˜C¥6x-Ýíüç™…DÁ9$&›Z¨Ø€‚š<ɸ¦ã"g_Àb?³®ÄãÍ~¤Èh&“öQ0D]kÙgä*cDQoW¹²Ñ:uKvÁê?׳?¹TÄ¢Ù±n}=Í×z^YÔÁËð1¾¾'1ýþ¶K½ÛÌh/ÝévþN‡àˆýÜ•ÿ«ë÷èÿÑûõ0WÛÛ¸×Î¥_ÿm¦UçÆÞ£öòl·ŸdÞœü_E ëÇ”‚Ês‰òsî?wwäî¾ÿO®ÿH†~[Ïú©‹„ÅÉ׿¼n6®Ê„7ügþ=§*Чçrúƒ=ñ^AUÖ¾{gýþôgn7}Öþ¿ãû /ŸGþN{?¤¤ÖŠÃQeÿ‡ñ³Žåk®ÛÞpUóKŒD«1’i;ÞgïfWøoýgïIï¬ùvÞF~ïb?ðCãnŸ<ˆÌ7ù¨!å EÙÞþŸ®³lÞ‹êçì®ßR:É““–·Öz­̃Ùhºù¢×cŒ×1Dý­ÝK2Õ”µá×òu@çs8øNµî{îpèÛÎ|€}¢‰ ”þà‹>‡òä<¼á:ŽôÝÁv ßaë_ïzi; Œ,ίëÐa;üHºÚ×w}ÿÏZ _}f|5j-ÐÁX¾g߉jãþ78¹Åp®Ó«ÿèöåÝÝ>4S”—4Né}Z}£¦éÁõˆDý™—ÜñþV§¥þå|GÅ4žš”•ïÏÁܳÊÿ3ßy‡{`Áþš…æ˜¥.ïÑü­?û„ò6PÏåkžÿ.LÚýROi³éé«Ï¾bÕ­-á±_'ØÌxÎ ûe²ÂQÖÍfû.ö9Ý=½3ä¿úan#¹û}=ÝV—ï-ﱑðJÁpS©“>B-Ê|óø³/zfϨ¼=ªÿ/ªµŸxåÏë({|¢>Ÿ¯R¾½ƒ‚O FÍì¬û¿fÞ»Á‡ù'Ñd“>eOOÛÛ=Pm_»F%¬ý>½Þö@•ÁÚ2´‰/ÿêªÓâÖc5ˆóâ€N†NŠG5~ï]è-žYµóÚ–í[KÔFè]}œ?iŸÌ¥A¼Ôý˜s—Nî—cUé ºÖKÔÔODÜ_By®ßð]³²lãn?÷?Ñrm‹‹ÿ˜Í[kù|†·~ÚÉUáI5?¼UYhUOæ×›ƒpDIMê4)éÔ^:QÁ"?Ÿ×`tçU.»ÄZ¯•ts[¬¹Ãt_n¿gq¿¤¥‘ñêH˪¤Þðo® ç ¼ƒB£­j÷Ƥl” Aú ZYÎ13?¯€k²p ¿ç‹K€Ú³Š& R–ŠB$ÙÚîDŸ cÒˆ.9}No{+ƒE*õ#ž*8qHG=V£C ³§‰Š²¤ 2¨Œ;ÿUƒ&"›¢Î)Tjd3 èàƒ°góÏ-‰¥#w†²—ïú¶ô*‚Úè`ôsê(ã”I]:}õÝ€w·æù?ØÐï,)O®µR°¤OˆˆNBIOÅZ´§¦FA§ìYt›-òÎ# æžÛÜæ^ë–I¿%F3å|:fVþü ßéÏqFáíÓ@"žF>}ˆ&¸+7+Î`×S‘Ý£dÃ^…Ô¶‚`çÏB§nТ!´=Ö=´úüg(²Î´ñÛ‰Þ]«‘¥5†ƒÿê­¥Sbî¥xe9EfèØ+*¢®š/Uèãm¹P_/Œ±Ïgî/? 8æè¦†ykþ½Fa§ÖK·î®;k«Í(“¸VÐõ–¼Ü‹’ª‹Á¹ÍuQß¾”@G ¢Í{¬NNÇ…¥ìµSê:Ó÷Cü»{Àì<ÚX{ÉPÎÙQ ¢P9Ôü{oË_×wM¯È–¶lbŽO{3Yï säcýвŸºý¢Í¿™¹ýƒÃέ£óæ%Fwë 7L­Õ¶ÄÔ{[+wA"ˇfDoözɾ5Z¤œ½mcB<ìŠQƺ´oŸ‹t¯RºÂþ¢ÚÞKëÅô:øÙr4¢søžé»ý_D/R—2£a¿lj¸Ê*«gãžKËIVñ½ÿGŒ7g¸ÒJ» >a|«¼»IxpÊKµ¶g分ž’Ð4{øôþkÞÕUí&¥ë[Ü x-›–z´p@µÅ)xF¹ÅD,ŧÈÊÜâ:Ùã`0 ?;4HÖ7’dJÝî ø_N”ÙYo$oQ5åƒ?¦ÀˆðÉC:éÃ}Q=†ö±èwüÕHMäcn“)Ι¹€x!VÑàTP'Åš~gŸ¨“Z]³`™“´ßS²£H£ò¼ÆÖ´ç:±/÷NÛèAÚj>[c×3cÑåº&”Š%‰Øq¸zOÜ€.tŠrú7ãÛÏ•|y9îÏêÇbz÷.Cµq3°›<¼Ôq¤òXca¯1öŒáY?‹ÉeOÙ°âµÞÅ’Ž‹÷m+ž§ѾÓqN£bÄL¢þ׿ÑᑨtÈÀ F5ÏêÙ Ž)µ/ Ź å£÷ðv±Ú_>Ì:0>PlnU’Úðrªj²ñbݨٓ˜¶#‚Mâ¢ZøŠ"u[¿‘£Ù„í‘D“h@~rÌìE‰O©XðsrïX.ˆãVþú[Gp‹ãÒ(”×Ê//Ôt "¼œõ’'÷ž“RÜ¢›ò”KÒjZídDç]N„ðN"‘iœ_¦¼\ºMÀ>YzEiòŠêÄ MÑTÂØáEä[:¯Ô ÛvÐ"Ä£J„Pé¨èH Õ"ƒçÌüN(õ^/@€îÙv‡ê6ýD™9[†ò BˆÒ@°¨×nÚÒCëšKZªFn•wexfˆ¤æ£ÑðÆÔ¹äƱq%¸ìKƒöÈŽ;H•¼#œ@!,d^²Ô‰uÎKQ´/ ¨=¬(`ÎÙª8EiKÓ A ú_ïK¼¢"È“~VͽªÃRì9.®\I‹¿‘7b˜2rÜ8ì<Œ·™O×dIÙ¶  ­’„>®K/¸Ê–U2œ8™N‡åŸ8´ÆûÓ˜3AuHOÀaí¨<½WYWtÎi¤jWlQdé6%9= UÔŠŽázDá#õ¼TµqPc—ÅáØ×¨ÍÁI3¢M¾ ‹È¼rZ=ÕAΔ’ê±ýÅhòw´ïÖoõ“œB’«¥ö÷z–¦ +߉\C=e{’J鬢Œðôü–¸„ùñ+75Éd)ÌI˜!¯6åˆ)ˆˆ(Iñ*>¢«è¾îç oÞ„há»#Ë3ÝõÅ–Âßf›so²\HM„µ4LÝXy§wѸ«¹rì µó#Èÿ2aDÓæ„È¢¤´>bø’xúø÷G7 ™­ä_ymÒ(]¹Ž{ ÕÁvžFØŒÜRÇŽ]‹4çVy‡&®ü/œàŽ8dbâ¨é×—§P3xë"gR”Ô éA(H:w²3nÜøZ9©%ˆöopNB‘’»âr™8 û?Ñ¿'kvâTÅe•Ž5¥zÕ9‡Ýøl“Åæw>ã·\•…WŒva©ðG¢%ñªð^Ûò™îˊݹÊ)^cA@è”é™B3oÙ¨6¬Èj¥+5ZÓ»Dy¢sD£‚ÖžîdÖå½(8Mªú-YÄÖìçzókmh|Žº°>+æññõ—3;Px?æ—„T[ªucÁÿƒŽIÅZ³Æªýã€á×+RsV®œ`S¤!8Æø€ƒ‹Ö÷ö Àpßðšî¦x Wß*iŠJœÒ%?OBû”Ñ4 êw”×:Ž€GwòÞ2A#ßß~óiD­;3jB˜>\Ç Ê{r×ã¡PÆ(Æ¢qÅ2¦W˜©˜4ä '-ývĵ^„ehôê¦ÎÎè¶u£ê^O_{U‚ò0ÖG…)ÉNöö–{Ú‡#Ù( N–ñåD÷=¯iCÕ}»æ«±•­Å_×&Ý#Ì+{&ÒðéÊ]ËZÈ>‘Ý:¬®]ëí/ W@bÑsÛGò¥Œ`ÓS´,?]®Ó²ÚKO®p€9vRˆÒ-ÈM¾†êO7™ìé4yyüx”Óé ¿WØŽ7âzÎHSÅ2åìq£Õ0kx²]'­I÷sÐõ ñÈ »ƒ—`%ÀtD_ÃŲ'_®Ø69$> P‘(oÑl Äî{SÎÛˆÍÂßãLÅQI‡lcÁ‡@ݤÛy¦¶–†Ûk°d‰·.ñÖ5Ëô€+Ì"Øó.¸Ëø7û˜ý6·U¬„}Ž6khš Mœj­ˆJ Cž#LPaH?ésí‡í®é€ZI³i6æm×§»9š;kOâÓIÏö.˜äãM]˜Þ©o÷Uz®fòVLŒÆ2iÐ(b\1±¢·wËàÁÅeÏÁÑ`D­;£ïåe0O/ÊI9 oÊxrÖÐøiÇÕW6ßÞÅfÊÊîwEú¢añ+ã½$ëèÜVh;ûH¯\ÜÒìHA@nŸ`°#ñ¤wí”O‘ëúó¬7¹vnrV ÍÄËŒèv64¾¿%‰¬(‚‘GJwH>êô%¨JÂ4 Ï1lŒgdîÙÍnqz8Ý€ØÑÐÝo±y¹ØZ*~×6MÛ\ÃÖ6oŠ;kÌÎLÞ8’¥æz¸ñç{#ðFhS-ÄžFzYO.6ç… Ô»‹…×À=‘‡6i±o Ì'™<¸ä ϽY{(ïàùÒâ\Òô%y8@ÿ6/؃ÔÛã`Â…ÚƒFì_zx±óç³>Üg¼SðI¯ È‘ôg§¯ÃÒs®ÞSåËÇ€=)^îe}Hz1¾6X3d*8'&RûpýÙ Ü›ø{9OèÃÀ“º—W.só°ëHˆ]œ§ö³ô wp^çJ98Øäõºé`^™‡ÊŸ‚yÐtî´nà8°/"èHŽXC.OðõÌ!Ê“ƒ"Rz’ž¤=ˆüïdyð&Ü-x>+L>†Æ8S½‡ÓŸ£><¾„‰þäpïà<™þ7ëc¯t#µ7så•Ûs0x{<<¸n@ÓïñÖŽDèÂóàOÇ ±éÆ%Ѓօ<ØæÀú¿¹„M6¶…I·> {°!ˆíC×üŇ¿v çÎÔ€ô£‹/Ú‡‡ no§–W©)ö|ü ÁŸ~^ï£Ï¹÷NC, ypðaåF¼'Á{’žÖ†õwøá^t#÷0«ëÁæÏ6m÷àéÁÙ÷5àx°y_­€î$yéOR9t¥¬'fCЃ>$±w×&< ¸DýÙ9Pl]˜5¥ßÉ‹•)âm°ªÿ:8Sóyü²Æøîú8°iÞt.l£Ò•< Í•ù'g=üîáÝBp;éêG*÷#'6\±À‡B8sòcrS¹mݸåÛ£Ù‘Ô¸Ù€sKùò¾?›ƒÎ”Ù÷øýxÌ&÷a„<©C“!Ñ„x².ÌŠqá"~|<9$ùw2`™ òú¸Ñ’âPÖƒZq¡x0 ³^^ ¯Ko#Ó§ ëøw{üˆSÊ“fOÕŸÏü<ïüÜ ú29Mäž,ŽòCµ½;ÈÓv¤<é_ S:ó } ÕÕÂ~ür¤:Òd®”Rvaîà](NòÝ@lHmH¼éËïHrã­’3B§›Álj¹ ‡½§r¯+Е?nò éÊrdùÅ'Å“ ðÂýˆáBŸßËò ý˜ûz¸Uö¥÷åÜ…2já ‹}eû1ñÊ8™ÿ‡iúÐ½Ì oå4¤¤›éóeîòg‰)÷`æ@·²/.@ìʽ™3Þ@ç@€Nd+âBý©]ܦî9ÐhË¥ ›èÚ“±qäÝ`—q! ¨ ܆œ ñÀyÒ¿F^þä¾´§µ*kB¤‰§ »•\Jöz˜ûÓö%NŒuàä§¹ â¡rHž¼·#µ/úQЄCØ”ÙàBõ | ‘ nJº‰üì%L’=œŸâÈr>¤ÉœÐÙó$àÂ'|éÉ)É”&'ÅŸ§èBô¥Ð6$xðëÔƒ'»:‘Ó€OCôðVC•!×€ÐÄÄ =©à—Å·%N\‚îãуöû™#ó¤S…ä»i s(kÊö²#Ðã[pó Nœ äJ÷)Ä—Ïv¤CBz÷"|¸ߺ0&¤)øý< KO èÿ24/G¹s¤ÇÊÀ¼yG‡„;p)ûrua:2jK¥<˜Ô“VA?jPÓ¹DâBä8ÙÈ!»“Ñ€C‰Å•^ÆQ6 M©DÞB¦hO•C»"œ‰@Ï*Tð2áÐ=8ü2ö¥¡ ùÐ'DçÀ'Zì CZL’o¡6å]f])БéHœØO:D Ÿ‚Ê€2È'½ /Jì(œˆG£#Ãþl¼•>d¢z0L÷#ôeMX÷ øå{0®¼Ø,:þ¦mweÚP6¤Ë l@­!æÝIýy9°î]œ=D7Pµò'JCð s(‡JEù 2ÂÖ‘è§‘ xrudjCèHt ½¸ûÑÊ¡èȆ̙¯2PâÂöí¡>Y|™2G~^ü(~ü(‡äz89–Y :>¬ gÈ'èÉß@‰èNÚ¡ ¼y\kH ¥ teêHñ Páʧw}/½oa]Wёϕ$«§"Ÿ }’äÀ®hB^¨H\ÒŒ‹d!÷ 2ÀšÐޤ¦îW$«Í±;˜èJ O›ˆDñ!G• f‘ÞHR)Õ·ßHž~|odÏMXGê@&„u$]Ì»p;0>$†!5¥Ó”S$'Ë\"Ø$;É4e_&Gf?ƒ+Õ€@ÔiZG»¤õcÑ‘§Ÿ?F]hE< B‡{¬¢tåGÊ€ŽF@ñ$5$Cƨ ·<ˆN ò`ñäâBe|¹|ÙP;˜ìàÑ5 L²!Ì7’Ü&!   kÈ §€NˆW¡"†¬ÍìŠñ¤ÜAÞ@ŠíƬ ›èu ËļèŠÚH9²†œœˆP6R(äe„Óä çB›iVAØJù’½ ÓM«•(¼ùñeïÈÖ]¼(£Ä“±ä‘]«òB‰Ûž4¨< üò¨‰DûÐ)©ãÁ©"±+Õ€çÀ§fñeS‰éáëBƒº€÷ ²…J‘"2Qòà^D ‰C$FArÂܨ‡g*=Ï€tàýh°#ãÀ¾,¨o S«('N´—k»iÜȧ2 ²ì¥S^xpd‘DåIͤ€}û©('¥#ÚÉÌ“íÈ<8UðäÑ‘ND § çȧà äÀ·(÷rTˆò{l"쨙aNîÄ †Y,ô!Ù_Ì@ô!>¤»RØUôo‚B:9—R_W…± &œ  ©Î•LØPzr›.MìªÁ Œ é~”œiMSÇ€DÏ*!ÎÖÀªŸ¨'·JAN< }¸:0ˆ›8Téʯ2 )½”Å…SZPô!rJ4¢'Ó•ÙLø|xyr± îUuåC§:0LJs‡Á'u9`׀ąÉ"6U8‡­å”M¼ éK¡ž´‚fB‡Ÿ!äNHi‹ ¡Ø”(’~ì*ç€Ù€TøáCè@/ñB†êP6aC×^<§y(:0‚{‘Ÿ?.Ey!áHœÉæÈ§.@FçÈ.Ü(}ûyñ¤yëÆöâH/³"†ÜªzøúІ¥¹€Ë wÐ#º€LZ0»øS«(‡·„SB:röUÉ÷àCbý¨ó¤ó¤WéH=ùSJ6dVZGÒƒVãJy×—*{2oa²©Átàø!6Ÿô²+µ„z2(¼¹G,¨µžTÔƒ›Þá"Ž%u`àJëʉΑsáƒ(yr½IëJ½üŽöCNWBQô.t ßH‡‘)º”ZD>dƒÖ”ÚGy*‰ÝÀ<˜MÌzÐ ö 5àģɅMx= ‰n QðdD ×O*)@uåRDàÊ ÄëÂv‘ðÃöeU|¸Ô„NŒ‹Áöà5e‡ì@/s ¼xóBëJ"TI;i7rð¤TÞ@ƒÝ€W±*œÈÙ‘7’ÌŠøEûò‚/&W} ¾Ô¨'"GVD~Ì»0+š|ˆPôeSÉ„W»‘\ g•^ªzP‚ÙDäA×éB ÌDÓ…—"¼àáâ…DÝH ßHme šp ô!:ò 9aMü"d6P#–C¯hYdC6™"äJ":²H@ãÊ"n¤åH "BAt`Q D7p!çÁ«8PàÀ¡É•C4j¥ õ'¥*? hÂŽ|†ä ¿çŠ;¨¥ lÀbQ:R¢œH‹ »ˆ\¢‡Þ•S‘ìá6á|)QâÀ#´Žîis¥Qñå9ð"=Ô)vÒ‚™Ò8LéT´"þQCNTÙ4 EäBvàG­$ ЫДSÈ”Q¡ ¡æÂÝ‘îaE~ T;ÉP;*iÈ«=yU5äMĪt¥QÓS¼…4çfMYEiÝ@‹¯+À92§a ÅëcFyì"†žL ~Ü.ËΔÌ9Ó¸Tô N´*kÈ›ÈÆ7Ç€ú;éíH&´(›xA7ÐèQZTSV8!Ÿ*b~Œ ä…ãHn@ âH\ŽþT ˆjƒ*œB øM˜Ntˆ$=ŸrìH/"3È”wWRE<ªô£ƒŸ*oä}O^TzÙ…S$ ßB¦¬p¯©9$C½9O"xÒ ”ŠjÂ9`GÛ‘3®Œ(.î@Є3¥PB ‚~”ª}yG©íAÕ¹ryò¼^öC x0¢0"¾®ï /µÚ6ZØ ´œÙ&\¸  ì¨ èÂ+þ4 'ÙKׇo Ê…ZÒ€3¥Nü†]̧Óq()Æ„5áЄNä«ïBØ]¹B•øaéËȇ¯. ä/¿"êfgyü(èùŸ»GbÔ™d:0 saN\m!6RŠtä{C w2¡õmü+©>œ‚õaPâÆ i9ò)úRx=YGV;u8âHœ"¾„ñzø,"ô¥|™DÉ*tñ¯DêJÉ” © ùxNt4ž)—Œ‚ƒøåyð"Pxp©Â„;ØД5¤±*úÞþ>Qu$4´Š¦Ôªâ”>EÔ÷ð†¼ ™`vªž´¢m­¬ >?'ž2Â!º…ÄŠøðs.T zClÀ¡&h9ò¢ý6å3¥;°'™"gÈž¤¢ ÓŸ*( š<)±¸…R…¥E¡Z¦%+bP ämHæ‘ ézô 3™) ,ü®XN–wk" q¤NLªº°îÓP÷à×€Ôg€]YE) I÷`UÕ…DÛJ#úÒ¹`UÙˆS{ƒ–j ܆#N\FI? §óaE7p }X]üŠr¤^¤¢' ?¥(!âÀ¡Ä“Núr‡ëH:pÑ„iEî@(™!@ëÀ®œ ï ö!U<ãÊ#µ©»€ä‘S“.ITDŒ*Á‘Q7r  ø0 ¡¯"ðáT Ä ©*Š ¥fÆ¡*¨ó%DëHˆhׄP2@ |1ô!íÀ(odt C•#û2ˆŠŽY¬—‰åJyÒ;S‹( |üÈPÓ”O¹¯* Ü*~ìª÷dÚ‘CNjEåÀ ë¿jAË}éG“ Ÿ!Åßȉ’AVND®ÒWN}ØSÀ„_Û„÷¡ht¥Í ÷eT ôÞ„6PN¢¢läEzR&Ê@óåC½y'Z@ƒƒŸ )¸…SƀĈ«(m"¯Ã)ïJ@JEsØ‘Cb>䢯»¼ÙD´m¶™2)­*z—#Ñ€»€ÙMI'e.þÐS‘"'‘‡»*ne{É7ˆ›]>¾ACéB£Ô‘¦Ô©*ƒÞ½ICåKè@‰|[Õ‡ ²ø’(f^&Ivá~Ü öP¦ê{A ° ñ¥>W$³ d@îȯ³'‘)êÀ‹·(hSéB¤… ¿bAjsH¡ùò"í@Þ…2Âͬü!ìB!’Ú•}ÈDÄ ·ßÉ„• ¼yC*f“Ê…S«{²óeA8[[lŠ!Ó•@û’›8O±Ô”_N7Ðt"”†Ô¡ß…@Ô•çÂ&X][Þ…÷©SJN”ífÂ.´­ <ˆö¥úr Ó‘4 F‘Z(jAfÜ€bäJÑ”9R¢ï-8C >œ¾ÔèÈ9äSB7p*ü¸7¯FQŒ(žTµ„fQyR'{(/“(tƒ(YSŸ.ÚB• Ì"{’Ô7ðšQÅ’CnDðaCÛž„º!¦ÚqúRË ‡ö¡UЀ‡ÍGŸ¿*u l‡6éÊ´&„€‡i*jÀkÀÇ€q ¿…NŒ!ú²¸„Còç— E9òžì®âD:‡JêJ)ÖÏ"nz2‘"êúxâB†hî¤ðeC­­;ÈOk€SZ«Æ€NÁ”u¥{9?¼‹+À—éÈvvÖ¾0td¿ ô†ê4`×µeïœxq ”»"ICÌ ¹Tñe^ìÊ;ð†ÜèNT éÊ=hC½»ƒ>ÞÂùÒ=HC iJ8úp}éõ¥áJz²>S£+ˆwR®âDú² øò/ƒ|B@Ó”åÜTþlRW4ZãÂx|;‹…þœ'"P8Œ+ñÊ6Ö“×ð%¾…ú0§Ð„Cy ïöøA8m@éOÜþd‘@¯Ý€êÏ6Džµ›Í«&¬|"x°/íÈ8÷».œ£áH§} í`üÉtgÜ„8’/c)F´?:AíB.sdÀ‡ÃbCÄŽ r¶0Ÿf7QÔ4£"ô9X@ßÛP)Õ‘Òû’¦öSíÈ;éÑ„ð`>L§ïüL)ÔÏ—oBSo´._2^t £ñeOü°½ ¬®Ü!î@ì@P‹…ó ð`æ@uäãJsàxrxpê\ |^ÂM^NØ6ò ¯<™ЃÓÙ`S½"{ÖöPð¤Þu°§/:7’xм(¼{2¼òïØ”3@ð'zOŽq(î¤Ø“j_“Ç$¸Aåʹ£NSy>™ìãVÌ„î£Ñ¹›kŸÐñ2 ø·xTùðž”å[­„ÛÈëIHg/aü½÷ uçØDýWÆ”:,´»Ùý©*TЄù`áÈéÈz¿qù˜›Ï€O"ç ú''"+Ú4¡ſ†êAßÏnG4¾´Ø¡>^PóáÞJt#u på{Ú_ŠGFUÛBýøWÆ€7žFs Ä—gŒ rgÒ”zrÈõaOj¹ hNÏ„Γ£âÆä”}]œ)Ù“y#ö9Xv'—½ø@óaÌx0>Ô;hz0._._Ÿµ õ%ãCI¯~]Þ“­|2½¹ñeàêáM™S‰w¤Î•úR>r=ûjý‹îí`ñ-õ"玢\¼~-×®Zê¯ã†e-œàZSŵðè¢4»'_û´ñBX¬œT,e=³„Õ”¢þsõsß“\驃u4 X‘|e¸ìÏË!úçñq²`†1Déz08¿øÛ'l´ç ¿Ì:®r'š ‚ƒÚ šocŦjŒ£U k’üµžóvŸ7?·Ú M4¯øHt.•Íkî\ ÏE@…’˜kq9»ÆÑTjŽQHrÿµËjíÞ8,u¾»¯¼tðé*ï/⛈¥Æg Ékagý»¿½«zŸ6Ùm`9²^®½Í嬣H+ å¸ÖoÒ ½‹Y9Ž´¶í»îªÒ‘4rŒ~$>¯R+õN’B굚gj™‚‘¦½ÚÈiq†iYHÆgV³©ß‰”‹òº0š“aµ0/·e$HâÎÈ2À±½Uóª½}!;ÇW;jxyÝVÞÝÝ×J9ëa ôó’½ø6ó»?ž(Tº t÷Ìë¾Ý¯'ü)ç4Ø×.@ëý?M°'K•æ=ˆ÷fŠÓœiVqŽœ¥Îöp„Ѹ[ª¾‘=¯Äû¹æÇÆîý(Ý4žF“U1°ê0'@‹ž‰¨”Y}4FŠ{ë¼bïü|ŒOƒÜ’ër]Vj\¹µ`uÁ`çžä‘ P‘š%Òì6Ýyÿ^k¬Ô6Õâ&›Ùƨýµ]×VTüŒÍ ă±Ö"Ì Œ!0»ê–æXøÞtÌ7µ¾‹tЏÐfÿ Í‘€«‰ïÌ:žõ4¬J Yv#EôzY–° ÒÙG#Ë×äм nF²7ÿ»MfêJòª4¹yPÓF‡Ë××ì7/ìIåd¡-ÞZì÷wµì@?‚…4¬™Ç2ceÙG#óŽß{Ͻåjûµ6®Â9F¨9JEAÓ3ËM)äÆ^ݵööÙáµ€Ö¾©0ä$ÉAhRÕ§»kÚ’Û²k S±Sš>-¼O›ôëäsUmÑdÑóæ$á)ÈöJ•мÚÇå^Å;Dünzލ›Æá(²¥œ³k¡|Ìú‹ÅÇTAp@÷~œÇå~ ŽûýþçmùñIyFÜÍeÿßË—ªêð'Ûý½{Óx¨‚»3øwxuî â4çWÄ"™¸Øï;Ètî…~¯‘‡ý›1©=Œ¥DLz™¸Ëæ¼s+ê÷˜89K¡>GÒ¹¬yNcZÙoo+pꚺ²ƒ–@æáöH¦ =#þeèÿí¤E0Sÿ ß ê×oòüX-êïEŸùTo3jä„È~Qžý^í–.qP9…J©"}‚"Ž5oOx÷;Lé‰ÞÈ«ìÿçb"`x*ø££wCŒÖhuÚ÷±<[ô5äLï›;Êj‹UŸÑ@>#œ ! Ý Côü:»þ‹säTïzå6”þŒEÓC Uíu›ÿçûüñ˜žMÝ 2<§p ºöŸÙ7ËyæV4a“¾š©9N¿?âtzPzy±ûX¿†3Ë·þñ­~&É®ÙsÑ(Ü­´Pˆ£ü¯ÑÏP_xî´FëßþŽª§2ÙW­Œ2>BK>ì)i^?S/ýÏ8+PmPâ›#2{p=ö ÎîWôÐ…ßQb6^5|¶¿Ä|îcìX.ÂÖÛë-Ö ¢»Þ—fËOòmAgr±Ñ’\–©­»>ŒÝ—b›Vòô¶7»¹ÚpÌΓ”[Ü8ÆžÅÇè7?s=6î/V 'JSüØÿ-–kzG.Þ{™C‰¬çëcžø¾t”.^sM÷FßÇWS¼õ-¢£Óð‘¥!2Ó6ãmî8‚;wWÝ—jýÎ M÷åªå_ŠWбÿÊ€ë¥hUHòƒ¯Ô•ñ¸³ÞFÑà $ÝéS¹ð³I ðQGæüa zãÇ/€w2öÛ: 95ªcs=\¯A­¶À,„Ÿ¡žêqé#31î´/‘=EG®éU ƒx~WJÉéOò¼‡²ê—Y­3yøž ÄÆ~‰þLõ`° ¼ºÓ™23{œÅPŸ.«ßÛxíÕJG2n/ÚÜz“nyoaØ‘Åv ºùºVÓÃÒ¥`{´Zß&R*fµÈÍ&ÓZÓê¿Sª¼sÖ‡¾Øð}¸#À9L‚jNpÐÔ®‹ixÐ’î?w¬¨ü{~î…ÿƒ³Õ< Ôïâ7:¨6䆣üx¶p®&qØ“údÖ·=~Íw—ó¾Äî^`l)ªë?å}9™^ÎrW ª:±ªÂ-Í9MD>õ.‚ºvbºj”½mU4*0ù°*ÎnÍÒ=%åkŽ£0G‘—T¥#ŠKì3û˜ é=ã&>föoÊx×ÌkµÎ‹†bÎaòŸæ°Ðª˜î…sÂÎqµÀ½ |m4˜¨Î¤Wî>Í¿uŽDôH‡"+µ@àás§nßÐï'(àý˜Î±6Mù0 ×Ôšò”gd¦£"ª±Ûh¬àºŸãßÚÀF¨øÊB‘ï}ü¨Þøõâ!¡¤<ŠÛ¹]C“~ÿfwÔ°bVಯäjÿÅš^ÿ ûÁƒÖãØÓq­œPƒá)_+úaÚïšÏ㕃ÎuË3Àïϑϼ'‡æ6騺V¿geüßÍ÷!öît4ñ|ïV™™¨Åš9õ Ž@㉥úyòÀîBY!êç]ï¹ ˆ7Q<.·o;m˜‡»dùÅϾâP93ÞÅÕÁ\v›ÉÊX^jŽÔâ€5y›Ód·çCV²sMÎgP¥·üCÄJ:u•Q¨’¯²çl+þÔ‡Ãï/%ËhS{‹7S™d9áМ²<¿ÃIÖ‘†Ÿôâã»/€±7ÔñîÿKõ¥üsû-º}x;Œ»Æq†7/¿bAƒvP±â”æBºgßÑ`~”PŸƒ;å|ñ³ŽauŸUâ7G`£ã"á°¬i)«W]8ækwBÍgzñƒ“x©íЉږ«zÕ°­x~WX81–:UÀµ{ ªs'>P§Ÿéð3†>}ÓÑ6 LÅê™È’Y-Ñï:,LB–_’5¿ÛÙÄyfl á@i¿’&uLãæy·˜‘#ÔCøO°Rä¦÷v“Vo}+—«u+Mß'_Óf¶-u~ÿ4£%ïYÎåì–ùÛcTEÁÜÖ˜Ž“¼i×Ù{Qù|0N%MÎñ‰ÖÌ(ïƒ'¡ÿªÙÉW›.MËþ­Ó $¶ïvæÐºãq`öžc•f6®–íM¹ûazZùíõK§<ªæ{¥ž¦pLˆ±îDôR¦ñßùžüW|×éLO½?q‹…ïdÃBr2ðãÚvºÝΣ ײ¾x=²ûÒ`¾í( ´"pä~¶n8WŒÜ×ðc~™I›Ý¯:]¯?=ÞD?‰‡ी»gæ¿KÄPO:µ”è{­Kh•-ù½ÆÃ)U[O˜ô¬öÂZ;íK,\;’&Kû¸ÚÖ¤^Äe¸‘»—Uñð,å­®á’.–Ov¡áæâ|6\Ë´§êçþ{½Ì&¹{<ï=¯Ås`´QvMðZubhÎëA½w£äPºOÔ* û¼¯Ö·k4­™Ÿ¢ÎâF8:8«(sÁŸK«\Ôÿ?0÷{Ë]aï*Çé ˜6ò•Ú]ÃBy"4ßÞ»×|~#=‚-  H Z¡Bj:YÝLÖ’‚íÿKõ¨v¯ÛjÒAÝu÷3v˜OÔiû¶]À:Å?¯)`¿Î~=§Úeµ!1qè²tüL´‹¿¨ Ö…1xs=¦g²0ºóÎŽ\c»(,„ƒ;ÍçåkýL!xF‹¬½Ó‹5.Áƒõ½6Ç/1²Šþø©ß«þ×Fö¯Ûï^D&×g]mYÄ¿„B,<Œî²©ôF¥ËXuùe¨y|ôÄ Õuà«7Ö:þë½5r“p79?W4ö“í{ÛŒ›¡@A³ [Ö(ƒá®\Ÿ‡lÄJh¯²vKôKÔð]cÍAy×ÛÖŽµÛì!♓}ìÌ1üÊn”r!í9¥Ñ‚RE­÷÷?Z/ýcÜ ˜ 'sI/ QŠ{Ñü<³UÚ•LRùÎb¢qvÀFÄÓç^ù†¿Ù¢•¬yþ»7ž6m};¥ ˆ^#ý[ÉýŠÃ0ù–ªÆ¦ˆÎœƒ—½T)ær”e/JQ9@6±Oõe¤¬/Õòð©ÀàaL²hKÞý¼iAê[¨={Ò?ck }X]YCäìþ ‰Þ‡ô1‘~‰®¸ÿµ©Öî`]Â/-gwÕîR±“ i‚íqŠ —öÎÅÿf`Çêf´–¶Î§øZxæ¥ñ”Bñ½ª ôîñ6GL¹_ÿÆVQðrš ñ'Hlð &'CoÝ’lNJ¾õšDÒŠýf Õ§žé/eß3£ºæy­[u s b6™•Œ&!¥1R'¿dŠÍÍ=ß)¤$¢9žµœ¦9>‡ÕÉ¿Åpc³±?íAäŽeÁ¤>­Óê_Ï*å™ÐT{?'ž j¿Àí¡l@ûíWjí%\ñ½âpJgU­ä|12 »°oïÙ_;Ê®åMÔöaÉ«•AצŠ`DòJ锑rdal•*È}¤YÂ?Z~·&ÀOdß´“ÝÍ2ÊuÄ á®äôÍAˆÍ@Ñð©«·®Ò¤¢Pe•àA¿3_Òò;snsÈ‚ú/4]¿Îa½#®‘d-Œ+ò?¾/}^â2Šfvk¨ ¯<4Ú fF@bÑ>^-ÏU‰f:¶ìi)*—‰ç+†ZÏÎ{¬n”,'\°…-MñLô:ö»^Ñ“­ü](ymŽ<€,>‹&{ÀYhÊûŽpüI úÉo,µø~Å*OKBÄ„´>ŒÇ”àÑ»³¼jz•B_#óù{G0~%¸ixzïZu± Þé0o2pë±(žL:w½!”¼)gü»#‡U™0Ñ DŽi´ñ½ÞÛ@X‘m b ¢+aq¯kì\ÍÜ5Ä1ÍàžqAýǪyクMÖË`èdš~t4iÔœ`íN»ÍrÔ@Z9š²p0¥ùM—…6:ëé ÃìZ½»9ëªSbPyX¾ÏÍE.ki²¶® 2깋½Q›ÎÜc麃žRè‹Î2ëùøý-÷:í¶¯“ñ™‘c\ïî²r^Õ™úÈÎrÑ6 üo°É-·‹×Á›qXÄ‘@¹ \ñp¶Ó9.zGÕ¨å¼h¯<Ò›êcfø¾!èÓ3 äÉ_î¯þzÝN›À‚A°5UJþu/õ۔߶ý(òS!m¼_¡ý’ô syL™î;šî·B[;"4¦·¦¹º—r›ozÇêv7¹íÓ%ö:Mˆá[yn€ä “®€‰}·™ÇÒ»MG¿ÞDý³3]Ö>(%½d)cPô=óËÄÉi/‰Ã¤^!2»)&€’ÄeAß™â‰Y4µ»Å[|„”ÛÙ¹)[µbl]YD2&Ní/¹ùëž'W=šíé›D÷ÎA BR—å%ˆƒäÌîÚ;À‘Ò€ñdÄ«ïÂûðêCñÉáÚWðàü:?½ #Â:%}/È#›E¤Ü̼síX}qÏhóízŒÛ¬zv´üò¿þVÓ‡jTßÛw±"dŸ†7Àùѹ‰ÍóG~Œîã¥é¶9·J“o'˜¦@ØhÍÒ—¦°€‚R§ü+{—'Ç´dׇö|ß·“̶ïäBmB:²'ÞéÁÆ€MˆMiq r¤yщÞu~^CÝ”ÝÃÚ„v¤×ýŒ!Ýϵ '½×æy×:óÀèp¨T#²“$nM¡â¿)fD‰HR(Œ¹D‡3F3s¹×4ð¤ßêÖˆ‰'R·úŠ0@…>‘—"ü§H¦À©ÑŠœi7ÿÀÀ~.ó Òƒã9}ø}Øè§ƒ§ÆžÅÿ_•F¾?|×-–´rß×÷°.kFN m™Û—v3¯L³ :”ÂP)D?ieÄ#Û5€D»šTë{'ÝyÛž÷òôX‚w² E"P¤·¡£˜é(¢.uÖÔá@Ñ–BkðŠ Þ˜Òœ(e®CTB Ÿ·„¾ƒô™ý>å¢q¨4!­³W«æ*öpv±Bj‘«úÔ›X©jS¶Pn ϹTOµ“Áüšùüéð<œ?¡ŸRG^w+øì²¯…<Ùƒ¾k[‘ý_Ñüº%æ=&‡ÖyáuL Ë€ÆÐÆ%K`Kß´5¤~J¶ /ÏÊsû¿¥`xíûoȤ|sšmHÜõÁë1Ûª…Õæ#ZÄr•-=eãáW0 H=¹|ˆCmƹ= Ü€v½Æ6R†dJSc/ ·À}™>¼éM: Wà‡ç]<¸^ìd=™Ï"q$åa‘ ï ïú8SÓ€ëBšPRûÐFzÝŸ{óux¿KÔí¼Ýè_¥z}†7~”qj'’ñˆ*H°™Â÷ }W‡ë75 JÅÏÚ{jçÝ­Z}o+´ÚVW/@ ¬Ï€Ù .Š Âé bm¸Ô˜?Qíöç°>/N>¾³©‚P`’ˆ§! pÁ#“2¥Ÿˆï )ð•^ú­”1–wÖTv\ª”I†€…×@wÐnt†ï=•Ü;Qᤀ¤h Ч5ôÔe×›¤t~«ñ¯€Äo£eK23QöŒôL9:~m:ÞZhl"T)”í2#·–Ýò´®9¢3ä{`8§rGY¶õÍ "H¸9géU¸¶u6cÄÓìŽÞ(Ì9ËwpPÌÖ$Eçø{(ö’£â?Õ!ÃÞV(5kqÌ[Øè¨¼Q‚fò“ò0ümjgžeFàØëäsŠňÔ6,(û,F0Æ¿ìÝ5FGÛyÈói³Çy¹ qñÌ&O¡©å0ÍÊ„&áV¾&"õÚǽv¿ódë_æAº¥²ƒ=~ß‹ábS™¶×lŸé¨ìÈÅj<½Ö…¤kHè<›^ÒÏ7žÑvô)åÙ@:9à¥v¤Œ£Ò¤¤…h %Nie`cOpÏ4à:;²Éãæ½ÝÇ·bH=\sâP/î¶Åšd MÊŽ ë&ûê:ö˜ZRl‰zx7º|ºçå‹yù˜6t«ºÞs˜þÂåe²™Î£©¾6qˆëmóØ0¢wY΀©0„È)ŽõaËY¬+û6ÿó½qâ„ßå(ãœò0Í«PÄàÚ±ˆÖåÜ0ÌÑ·èÀ-k¯É‘]Cà¼ï<½ê„îä*xÐÚ:¤©ö¬r¡BN5±‹ ·*jÜÊ‘‘ôxï¡Ö”Î9ã8,÷¹ÍÌèâØqÏ!Б÷oJØ¡?w§&‚L¿ÄBè—2Í&‡ø|îh½Çí¡Å¢|þ/+Ö(Í‘ªeIzžV׫Ӥ´¹t–³ª2HÃÍ, לÒ„ÙK5á鬞õgŒ=ý1i"Y?œb r­PÂÿëÐÌÔTÞK±Im!"úF^-ÑVv˜mÊ$ u ¢þ¯°.8nüy‰ü¢ÐМ©é&@‘tùQéHâÿP,¥ø¬4ÛY8ÛePßÎ6V Èo¯Nò>ºz›eïáËèÛ².Dd(x6šNi×|]LGû;™XÎ}«ÕoÌPð€ÈUÙÕÍ1f”zÏþ¹RòüqˆCiTvèMÛN^EðŸJàœª8©|ý/†Ç+‚õß=ëp4°þágJõ‰ˆâçûh(<kýµ UþË7ô¹®IŒÂ]‘Hc”bŠAåÔCH¨›>›Š1Í=><{ HÎå€Z™µK¿­PmÈÔÖ(¤Ž^i–‹Q¬TaИ*ŠoŠ&;‰£cG¥Ö*&ò9ë`^]ó–8MšL±N¹À‘P7D BÏ:KV×@‡á·Qµ)eÙ²˜ÍÖ¸:uJsˆczš¦ƒ]QfÀì‹Õ™’è Mu£TC_/ çG„²M>gÁN¾œeÛÌ EIÜ:¥AJýlÊP Qþ‹ô»«È)À =?{…DÛcšx_4—îjJYE7Eb uúj?6>i¤ˆ"P‡„O!ˆvB›6ŰQId±¦0¥Üº´G£®—wì¥ò#éaÛH_žÁÁ.’¢u6ÿQ>d¶Sbû¬Úu5sÛq 6ø¦ šéË[3NQÁ[µªˆ+ˆ[«³#©¸œãEÇ“rõ£hùm^®,ço R˸¨0u=vÖ¯?1ågWÜê´E ÕKÃTo[Æ«!ÄÑ+ó8tø'R ÷yâN?ZE£34Øy- ÊÅ™†í©Ìàùž#R|©ÆA*Øâ¯ƒLéÔûøyŽì)éJÕݬ‡‹í:AÊ!( Æ•¯ÊÖdN:¤cèW3›@/K,ñå™XczvŒ óýHS}s™êô[Њ£¹2D‹r‰nEѦÚM15|E‰›¿å>Ùȯx¦/ÛQô5s8«³ ¶$œVG§Ÿ_5ÊcŒDq~µÅ,Ên˜ËÂÖ52¬rXñ,¤kò¼c¾c1"ve–‘.–Šu¸¯åáçï¯Ý\v_ ‰™‡È‹#WÖTŠ0 ãÈóû®yØÌX%ÕÃfüБÇ6}’µFNS¤i Oª äK7HÐY5‰–Õï9ö ušÉ¥£¢ldP»¯özÉ[Ç“2ðOØðÜÌg÷›^óþ¤g­Ø,³ž.‡¦÷™ã¼JÃX@›³¦‹íPýÚØ¾]ÕX‹õzP"4¦ ï,¬K¶†¼ Ì5ä8­ œ—_c—‹ƒ¯2õ‰`qýUI*X6V”(ÄoÜì´lê¼EvHå÷¼÷ÌËÀÅÉn%˜®}Û»þ¤[L¨“ Çüí`fèñ5Ú«§û7Š$x‹˜7¦5TCG–«Õ†Ïi|ÉÓ¡$}Ü$öê$®?!€«m6¼%É [CÒ#¼u¤ ¹åD®jÓ”ÆóFÍèxò]ÛœFb²ºMZÍç™»ûS¬’Ør¨ÚýɆ¦ÌghÄüR VLl_vK³­| IžÓeT ÷¶ï>jX®Ô>«zŽ—;uYSp¡8U*ÃY†¨@6GX)åI…ÿ·¹­sBVP¨O¨6´¾×«eÚnoKŸQñ"é6ŽÛŠÄ¬ï•yg®µÏß°î”sLHõ7Ûræÿ¾SoÛü¯E/9ò˜‘®%°&M¾§gAÀ2£ë˜€d›’HGýk Fy“‹¹æßŽ#—yš,©t)"΋%ð<5­ªQ¹5mÇíªÉÜB°'á‚’\µ S¯¼Ë»JN¤dJìaü«ö’&…@î¨ýÞþ—䨬¸v€^’@ ,ŠÂ‚‰ø2¹nÚA\ç%á[8ü9l³wþN‹ÇÒŒ¬_?„ÛWò^÷è`{ÿ¯ƒŸËñY{qyd=Áù#ùîpt÷ÜÆ´Ã¸‰zÐY6΃qŒ]ÿßðRǸ6Ï÷Ì1’Ì›( w/XŸGP }Ò±Ä3¿«vÒp`½¶[û˜LÒ˜‚€PÌ/ŽP ­8%©$F‘>l°µ¬¯’ü‘o>‚ì§>ÝG¯ÐÓ}]“i›Ôøõ6T¯¹«•=ÆámçHÑÁ»é¾ð/[ÓÍSµÁ!,§´-Þ#Àâîºü®«|J æÞw$ô Ì¬¼(5s(–"ׯĮhN5v×ÚçGÃN½UFA×µ\’šF b^x’ŠbSÎ"H òééó­Ln[ö1n¨Ó`\˜]j´)«õ¯5”R¸Q¼ì›×’VL ¼£”;}6÷Ëoã#¾-=KC ˆHŠí=dcƒPj©1«Ú1¹X×®ûº–8ÕÐa¶{Çkûn …Âð‰žOB4´_>L#írdU8€oA(½0NQžD=®·e9?4~m¹~èÑ7ü}J†Ã lõ_–ܦ2¤âÉöÙÉL=G쇛Ì[C>»ƒP7±$¦›|Eï-ÆýEq)ådN(︣î7yS.;w,-ýS*¾žR9 5{ØWA¥Ò.¸ &cõª!a³Lš<ؾSõ—¶òû·Ãâææâ £—OY+“›^ËÛÀsX£O¡>³×ÓzìFg¾il†Ñ¼kÊ—‹ÈדÄêF̆%îËáA÷$Ú·ñãCëBG Ñ“FMüúšSBjÁžPåmã&Ä©9¤ögnô'N=™O̓ìÁïHç^¬íC’\óµ6TÏÜJåþN>¬ s‡æãgÈy²ofXÑG}›‡[êØù°40Ùõ!¯òãlï%ÝÛŽ†2ZòßÈn áÆœ¸›y& 3ãJ4n§÷§?;î?Ôèeî]¸70éo‡s*lAñ_y º:òŸrSSèÏ>M´» µµ!>_bG·”4a ßÛ©ä֣Ğúýˆõ¿kö!ñcbOfÒÏë9 9‡²£g®qÄ ë.¶« Ë©Jˆy@–ÄMyAºÈT¡pdâϱrgàþ&òÿåG§y²~¼'߀5nôzCÏŠ?ŸçBñg…‹Ø“Á½¨æAχ¯¼¸ýý\/²ŒBÂGÜèþ¤®HO­ÑÀó¥Ùž|tåëI§éàЄùP~|÷ Í'›.NêCïOxW¥òì°uatçoõg{áaË!Õ“—.IO}h¡>l»ø;÷ÌŸB>ܼ « À‘>dø5¤ JU"×¼Â&ê^4 Ÿ éÂæƒ±þwÒœÏÍÂ9t½ßåÿÓôScDO±«Ò”Ë&´"Û€|Èw‘ìBWƒÿCAlñ‰kÅGÄ‘MxVÕÝZ7&Ðíp‹§)åKú°?»{Œ#§ õ#Réy8;9%Ø4|Ži´mûØHW24~¬£ÙÏ™; ÄüF%çÕƒùä~Ì©äÎò>¬Œ†Í@?,'è@}}©<}¼£+o0AæÎ,²¦„„5ÔiK+aç>=³âßàHŽk¾¦ês;F µ óàד¯'±ËÀú¸Às` ä ðÀ½ÕΓ,§ÃÀwaóç}&iÍ' 6 ;ÛZy?.3ÂŽçpaÞƒ‰*åŸnêB:d+H†¼#Ǹ?ƒ e³!? +ɱ’ Hzr¾Œ¹ö„¡)ÙGÜKi Ä€=ˆ]Üp >¤§y>~_æc÷ ÆÏ; ²¸ð<ùM죳Èßä,”d!<3à7 çÉÉ”âßÃ(l§/a‡§+ù› |‰€;O Ù]9?†SøíXƒZ>±ˆz:¹09¥6%à^™y?ÿ3ÇΔçÀÖÒL²ŸÞq°žœéÞT¹óÞ÷ø2KòNú6n_}èÁÔº3»>}ãHqä;ýÆÝ“^<Ëà—N4!êÊæ¡ËrlÃþÜ0éÈú¶¼l'Ç jÈ™>÷lFÒsá6²?ÉŽ|:]?‚ÙþÎãÀ¿èOÜÀ=œø^|d#NGìÛ¯? ó¸¿M¸>WóG>¤CÔ‡B4áÄÿuodñc• ~ä]ë‰q ˆû_NßN¤׃Zü½ÞÂÛCæÝ´>¬NЃw.ë­ÜéeDüp;73óð&þMKÃí`Ak­+]ÎAcÀÖN\jÕ÷L£rÑá]~ާ}( ñµÛÊVPùN=Yñï«È»án¶ºùƒ²ƒ•!ÙBóoŠ )vP>e£øq‰9ñºx1't¬Ø2Âr éCôeàõ°&æGù´¥póç±)Î5à Mœ.îPÝ´XÂæYz ÛPp#E‘£Ž,Ùˆë˜{îç¸ÈgÅ/«Ô=.Þ×—j_ô¯»zèÝh,­%x»?•‘t½üc¼ ÙA§>\n`3çÊžtý8ôc{.hô£só°qìï”ÿ:Î5¤çÀtàñoN]x3á ÍË”ùPéIƒNâÁüYZO¡ ¡'Ù—Û—ãµe J—­f„mmãYâ˜T쵤 mV TÀ¾ûÍ(F›M¢¨2ù“ôa=ÙÚ[øxò>•êÀq wИ‡q`ueìÆþËžw+G#܃¡uåÜŸ ¿èìfWJ\ˆÙ„2HVrÍ'jäÙ$äɦó:>Á¥ŠzÙªÌM-ªà4SHJÆ—vÐŒöÜ<C.@;‰1.xЩÚ³n0z2‡B·ÍÆ=K›k¡!óãêHe仨2@ëH¹6º9Ýχ»µ¡9rÿ{ åjaCx<,¸R«Óý¤ò³`xP~ÞÇ3 žÝȇÀþÚ{}ü;˜ yÄ}|9.<¸‘ÓƒŸ!îKçËÝÂïÖùÙ7ö¤*¸€9¼)Ocƒƒ»æã²‡k“™ mš£óÙ[xíC0°Ò}þH/4‘àቄ6­ÍLâG6;òlÖÄ'¿ ’Nü0:RYSnAµÜû¯ˆ@&†9’ëÀû§ûõa9Úx{;HxóödÔèà^ÒCfC•hIÄïÞ<»ËÊïäN4ºPŸkµÐ©3¤ã@™dáOÒ‡Þ—4èC–xñ—s ±uüœÙº“Ò t/^\·Òƒ,yš¸xòøpæËìN´©´Ž”™dçBbåûX~ì!Ÿ­€Í=ëgþ¶^¾=ÙÔ“?~Òìð/¯”';k½ÛnòÌéä;ùH ¬ƒû2!ׇ«dàKćs ïq› e^¬¿.4$ìúxN#ä‰áö0Ç”<MhÐbSž¶<™Ù”–=Ôa™‚]ãIvÞï‘(òy°íÀçÃÀƒ{w¡yq¡G—#«#š|ƒ»9ÅÄ/‘…Îäõµp=ýH4v¿ÝA—ìà5ä;ø{붺ðŸS—„Å)ÂÕÂ)wÖ:ÖHC282Òѳ xu?†Òð¡ ™§)Ã!ӟѵ§¡ŒnO™‡RàÉ÷eîà}ÿìsòn^Lä –O.éG“ t$^Oá`êYÒPýYî$6#,~ìhÎ~—sÛsµtË' 5ãR÷e9Ó©?R¹ôI^¤9Ù°<ù=™9S©yk݉îüì!µiG§q#4Ü<ˆNU© lð0dɀħvo"æ[RêKÊ¿“ ÎÓÁÈ•éÀi|xK}áÂ24·øsê5å±W¼éH;§¦öýì.+\\°û<v {0yìÉüh I9Pœ®Ž,¾¤/-æCšMK³nãFn<ŸÄƒß—SKRÆS4ô`y{°zðc·ÂìJþìíBòä= äfŸ™ÉÀh¤'‰&Ä»‘âÀjùs÷0=½\'BCæÇ6˜8³š_RéÇ‚ÂæW‘‚ƒsKñ±P¬gx΋;MÌîX~¬ú5 ôc«)±X7óåO S£yö|ö-çs‹|H:p&ž†Î…{0k‘zÐü®.ZLÓšv t ö.l9¤íBt,’mF/›‘3AÚ“4 q}ØfÖJ ¹Bþc#V Z Ë绹pÐTÒ Œo·gA£–Å‚¨9gË̃JÒ‘Ä»!Éöòä@ÖÇ—%§i{øì[øüµ±&o#n}i~´ÿâ@|¹ x ÝG£8¼ ‰ Ї©ƒ÷3à7q¤92ò¿.6W*Rî³p‡FWÁž%ù$9rœy@ì®/¥.”.„&â|iL±–]œ¯Öƒm.Ö°ûP†[áÖ†8²=ô´‡q!­¸ÃÜHlCž Ô;É<9}ûu)§|¬šøQÓh-î°JD±;YI§—4F#9‰u¯®}&>dô¡ä@lB~Lº| !«ûí\‰¼„Ø“…gA&§' ðôð†öéÞ´ºRøu Ä.Hs:`…èêÇ®Í6+ØK_Q£aŸËa•‚?"Ï™ äô$úò{w£öauçDõ°'L‘’AóaÁ¬éd1¯ÚâNX7p»¨¡>\8E׃qˆUÝÊÇ7 õ!t›2˹–¼?O:ywéKèÈfµ#ãÝc±[@Ô¼ Ôó¼,‰ÑžžÜ®”ø^íùòþ³ « Ÿc àäÂqd9òŽèÁš_Þ„6äèAâÂo¡Í=I fùfæFåÜ”âIêGåBìA•âHo¤3í‹>l¦KÉw.¼÷exœ^nEçK¯s 7ð™Æ8±· o¡v ÚÒ8MÝáÆt}Û5‘}I4 ,êCö§V mA}¤°ð0iеÓé0G €m5…–°KŠÑsÒæà7¼\0zÒ‡b{žFýYüæä€Í²;[ZO!µ‡6DÔ6ðØŒÎN§ug³Ž¬º3âHX.äšÚØWr8|þnGńԃ>¡=ØÚåÂnsñš¾Ž8—õ×òd:ú¸fLÖÔ>.ãÈfVq 7V”9¤];âõp¡ £òfÀÜÿ™ÁÁ±}Æìå9:CÙƒÞ“±Bö­ÌümÁìÉÕúxçKÛ„ñ.¬­ÿ&¡ô¼¼½ÆweßáZ ÙCùneÕ3¤ÙÈ÷qÅŽ¾\+½ŒÈ?´‘ÍĦ|gA»ƒ:]…Óž,¹#‰Ë€ÛË¡)ÞÏ&vq–{™ù°¹Ó¯.¤¸‡áËïä_§&¼Èø¶¿')¥îãô'^ú‘£èa8‘Ë×ÚZü¸ý¬Ü/ÁXx’†Œ Ї…©ZO½&ÿ_ 8ø|,‹ŸjÈìC͓ⱠN¥Ì…þoÍŽý¨Ö”ü›¸:³©(f˜?4†Ã}„MµóoB|Þÿm‘M^DžŸK ïäËÛlrˆÒŒðu`Û²È:^ÛÁ–SÙ¼).÷©á•êNXwºö³ûL¨9Ò ó%u!16])Ë èHìù!ìÞ´ì} NÄ»7&LèJ^ÝáëA£4lÉîI¥x0•uá§2åJò˜zR¾ÝÙÈä7äéÁgÀjÒ¸Hò;œ¯ ­i4á6âwÒ,ëHþ¤.âw}|+á}Lœ™ÆÕÂe‹Z ì)±(š2&yýéíJ™ ó$Í„4eχ$y‰ 9ð?Å(yPœ taÙÉ¿´ }hg |’fAæÃ½I7P¿j@è›i ÜŽ:870÷òX4.´ëB'•/n?bLøä‡h³p3p:râôá<T!¯l¥Î€ßlq§£ÃÝÕR^«¹‚Z¬ãµ}‚\ é<–±?Q†;{©3jÀ§ssî NN P?nCB6¥Í+·…zc69pQƃRý‰:Z"Æfh¯Äƒ÷ côj„ZK³acÐ`UTmå8Ò†INŒèÎljOo|3âô°;É72&t´¡õoKùœœxlBé|ü?†S7ÊÂÒŸ¯:z8Ä4†—™…7 3 Ù€4³ðøVÌ™æÂgÉ¿€ö¡VOwð`ò$âZ1Î(5;œ´™!M?kmî7²f„>Ip«?f£Æ‘уBF]‹Ké}|ŸŽìË'*~„¦Ã…ÜÇSswiØ“‘'ƒÐËM©!ìYòøpê@x²}h ½­áaÓ³£C'+'êöxO­–SJ^¯~ïÁÜ܉E7°yt¡Ú”ò`ðà^L†Ä®îr7°hJ<ÈO>²fNo¤¡ïCàB ~DgÁ©áC‰ö'ÉŒûZ A³/2éèay°¾œæYòpev¾]­&u– Jslû›jδ)–É ¥ZÒ—$È2Àõ¡Û•tlJz‘ÂÜÁíÇ húuáJSëÀo¯V^¬?£ÊÆœî@ôäÜ«,:6Ô.ê]õáÛ†âÄ9àØ*G£:JÝÂgÊkC‰çÈ“*gJ{ðê|XçKóá4Mç/wp!Ãðçj}9Pî@ò`êA¥;sˆ;0qåwvöýNGo¹˜É ÐâqèN濟27°§J_£òáVlœ),ø5-LaKW•©•@ïä´9 GZGbPÒgO…?:ìÂ÷ã¿!šúqÛÖºväéI΀^NļY +õ ³hÿy…óü.û f@l6øOß®óÀ¼^&Г™&”¾¬&¤!ȸrJŽ ¸‹dÔž ?ë@jÏBâÊnäÍ:0ðÛ¹<„²ÏÁ­'·òú™5$t`V–"C­¸Â´?ŽW‰ éh|(ëÀÁ'N]m¬ pc(hÎúÑý )ìÚ’š0¾t'=8,šœnv)Ár¡E–4¹8_NÙË"~”;9æu`6öòÃ…ö5p©ÕÌ ßN”§— «ý™>Ô¹Òš<›mhÊnä^´èÔI9±£#¡ÓÀZöp¾<hÕ…xŸ/íá?–tá?§«!–ßBœ­©<˜ñ—'u”ÊEÓÉ?^õe.E3e ÔŒaíÏÐü {Ó½‡ôµ0­>uózXü(:2{²>Än%Д÷áÔù°æ$6$â4r5â¶µ}Ä-`~P˜Ø›]´qnºµ[~…±žíµ¬T>‡ ÃÛÇíŸv©.Ãnäõ ò%2ÃE;[}ü‰µ*š± x²Xü3Ý€>b÷mÔš6{Â{2†}í…{ÜœLŽXú Ôo$þdГ4/w{„‚Ò„>>ŽÜÉçΤ¦þôÿWô$|¹ýÈC¸ŸjG¯àîò=YâºrŸ¹*~‡mÓ×€ Ð´d9vÒDtº}œ€?Á—¡ÝàSΟFêB}É«i÷¸ÜF¼ŽÝøç§kÏñ¥} ¨ï1…>ôÝîe†ö9ö¬y6bøå)ùð‡©>µ¡ÙÉMh§Co$63cñØ€~dwWŸkÀv’&”®„{ÐVàK™:±”ú³ ÓŽŒï'$´€72Ÿ¿œ—0h2ÀýXìáN4:{ž&ðÈx‡áú$‡ÔÙÁ½¤;h>Å­ t'6iw&O:7ðšÀøgMy&´¿$®ž\gup†îþÇéî0†HL’!å[éìÁ»¹0ÙBGZÝIñÃ’ч¡/{(çÛyg+ÂöðÖJÝGqjI´ÂjFH¤ æÊ¹!¡ÎÀ=œ¾ÖÀìáÏ#ZÇæc©~üñšNÚŽ}–G/NL©–tóãq!–úO¥PïNml!Ï—Ú¸] |¾ì9Ð?¯"rax0œl˜tá ÊÆ‹<[.Ôꑹ“ÅÒ09¬Ò€ÄÔ óHwð†iÑ÷ O&C»ŒºXGjt rl0åød2AÄíp‰¿½ÙíäÜHç\ï±÷äÚ…ö NêsA·óB#œoì0»ØÑ—ÔŸãƒË³å|^_g‘>Žçw?p`Ýq0ÒÇŸ^Ò€áÜÞn=™ßéáÞÀ“ Ø—ãƒ$‡©ŸW‰{ëBnv1л™Ë#±:²¡¥h[y ¿Ï™sp ñ@èAÇ“…#ãÇã‡2Ûo“{™òK±ñð’¯Rs#6CÏ•zòvÞëÃ΀äAûP¯;¾€5¤x²9n\< ‡jO6Dþî‹;xGJ7ðþŒ<éûpb‡'Þ—:ýÀ„µ™ ÍÞÊ?‚C,hÀø^GƒbêGNþâ `\@èÊóï³mJx×Z_È”ÏæÈ¾t‰ÌÑæä7°8…>‡[› \iÃÎö°iÞ­éÇDýYN„÷ëHqáâÂõ¥×…ãI›<ùÔŽ+éøØ;PìA¼“jy'‡g‹©#»—>=È:œ x¬67þî7°êƒ&Hkõ%É ´x{RŽÓY;çà5¤>Üu$̶òž~~Ëi:ð.ÝÈÐÂzòbC£cC ‚ÍnJw§Ä†…ýéV4 MHÞH˜ÒÀe> zò9dЄyòL˜Dñ¥æÀ©t¥Î„~ ICò­ä‡L×^QÛ—§;É yò¥1)Ã…Þ@ëÁ–hJàÁ¹.‘ ñïpgÈljáEÉNþßHlO‘/¿!½ˆ ,îN…§#ÚœÐï¤~µö ÓšC{³t¥ÜÁóAñÁìïxÙQõ!øeø¡|ݬÊÞÔ&ÑnH©¥Fôã”Ð-§ $:±Il´9üŠdÌíår^…ßî°Žn\jÊÞõ¡ ìødwqHšß—ft­HÁO§bèKéHm¥Ÿ4ØÁIìÈ’2ÆwPű§„„{ ž›/Ô‡J •€ ¨Ù’ƒ­lO.§ÝÀ™eÛ… ޼l•dƒ›.Ü#ïÇC™!çÀ¯é\èxÜ®VæQð¡9²›)Û\çÙ³£/<ø¤.u£&ËEöO3ĉHu@!©m¦ÎÝ ²ØICˆ„yІh˜ÞG½Éáœø §%.´úOQ Ðü8 ZÕåÇ £|û&¤`öÝ”ŠXQŠð`LÆÔ¼{)úQÓÐÞd:’m¥ó!N%–O"åƒ{l$;(ß‘Îü s¤äùZYåA’׽ɊN|®¼‡t%Ñ„àÂR{ÒÊ”ôäL¤ re8ŽöP~)L°”4ëZ2ñ$È|xC: ’ìNçãÑù–XtãB<~ÿ¥¦9SÈÂ>¾L žœø¿&®¦À”Ndd€ô8˜C$!¼ƒÝöðèFœ‡à—“gÔ…P:sšEÚIó5ð‡åƒÅ”V®3á{h}éÕØÕ€5òà:S½€8r´§§š^þGw"½¸WëÊ|1–N!ˆSG6ô Ì€þY7òfPö¤ô¶øNÒ]Õ•:r2^m»hB{q±Q³.Ì?nü«“:ðgëã‘Ú ;»ºQX{˜ÕúøÍmCh`ô Äleüî%_‡‡¥.¤<ØÐ‘¥Ó´àÍw#ã—BjFò`èB?’ùpçN†–Ü@š^¬.ÞrÈ™û¬ kƵЀy’#Ó„þ¶Ts@üÉVJáÝ_—g ˜…ç@ñááδúR=´­_Å€ô££.Ü&¶¯OÆËšW÷ü|;0)Õ”Mü‹’]85á4ì@¾Ôt¥ Èré`qs¡€w²Thɶ„ìdÉ t£;S äÃ΃NPíd׿'w“ïý½Ò—› jBÝ– ü¹äÙ‡¡.y;ráø ]äIÛI·JsO‹~ã)ü¬˜CBLOË9¥6 ·8nÆð8Ø;]î¦AƒF¡+í}ûJÆpiD¥ `rÑÑaJ¢'¡#ûPéÜX¥+’<âPêÊì´áñ 6!!°’„Ä;9¿g„NUÑ„ÝÎú}ÉF]ì)ÜÆ5!{ИΑåHŸ«2¹eÖ„\šçNt€s¥nÎ^ŽU~½©&X;É\>ž2FÔy„©(f…¹8Ì”ìÎhëÂFæB]Ì)ø’/©K­)½ŠPôa9ª~YWu¬ˆæÁº¿~D7pžÎ,-ü­†\‡ ,Ϲë·vy›•n äI—kԇȑóà{²2ù$9R‡gjHê?’w;(CiÙ€ÞÇ{ j6SJG.”Ï€O¶Á‹›°dÉE…>Ä?jãHP«mFÔ‰±*{r'ôÐb7–3ñp ve ’Q:R¦òMä&´ £o­¥_Î=™Nd)ÙB½9Wµòð¢¿n@v$ØâáM+û¸>¿w{–î‡ýT޼®Ü/nçB´§ZçÇf@4¤{rf“Ò~LÒ-ñ'Æ…5dMƵ î§§/½ ¡)îMÜdØÈ§áò7¸Ofõý<†<¹C‘"{‘σøwÍ!­(WbN5ÝJž”y0o¥ù4ä´¡ü¸¿ð¡sä„9p½©µ¾—Òø{Y‡:rSNJráèÉ»‡Ÿ bèGƒ9ä(䞌‡.í ÀÖ‡Û€Mœ¨l${èÜÊsàMXб'P Ü&ÌëʆÔRô¡vð=–†ü¦^ÛÜØ|™…"¸²ÚP¹¥][…3àäU£Ÿ0ï æÎϱ€Tï@>|.Lø£"|‰6$©«ö²&:{ÈiNÔ<ÙGÌ…xu%sä “ŽVUâÈzòäŸÜ€N /fïm{s;UÆÖÈ¡îJ)²…Mä ö°;¸_‚óãÖ\è4aC«*>Œ¼˜.GéÏ{}¨GòÉ´Ü`UåJ }‰9°*S,«’uðœÈG˜“4'NœÕ€ô¤ ¨AáÀ'e(¾„€çÊžl«íHN< ~üo ãÀ'N@6д‹üÐ&öèH`kžþçÈ:€qä{É}˜ÄŽÎÄ)¼ÎÞB|{ð‡SèÈî%\/<‰{û‰"äªe…7°£ˆŠî¤wð#Ñ“w· ÁúâQvÒ‰ò GÙ€;¸ð czÛÌ"íÖÒ:P€PƒÏ„]˜þ,¨ŸtåäÀ©ìÈ ·ä|’'¿ŸN5¤• Ò¥*…ƒ ðdÉÞÂ> z’^v#­!δr`âÀ|°e‘9°»0/wlÉÀ…5"”Ó€ÜÂ'©€ÍiÝO±)–˾ÍÜ2ì"±Ë—-/5‹ÒiKoÙsYší˜dg°Å…ñâ“ 0Û¥)bÁ2{ñækBÓi£{0™åô!ì:ÿÍì¤44„0@‚êÃërµæßóìýk}ë¿v÷/òZÓàiHeb!Z1#ýK¾·±ÿÊ¥Ÿ«_øÍú;¹ý >C$Gº>äï%à„÷J&š“Cí4ƒê!ÿ‚¥¡ùyÖ)D­)÷ ù?>´rRU!’j¦Ÿqþå“jà\Ëf:nõÖ¾?óä?ºÿaç<ñ¤0ŠÀÀ/ÒÜnµ“ü¼?Îú÷Ž¿ëP(ÈÿÓ÷=¿Ãûøç¥¸aäGúRJ²'æPŸÊQRªG¤#Øæµ§ùÙ±¾ïçÀTyþ~çF#¥jÉË!  øæ3YÿµþÞâ? Cæfp÷ýK÷Å¥Z:·›Úf$I‚»´zÞUäx\Èô4¿àI÷?^:_³“õi‰k½fbaÚÕð·\¬¦Kº¿ùŸZ=‰ù?7 üQàz˜7‰ ÂŒ(ùhÆ._>g•¼kðsFþ™«óêÿwü£¯kCkÚ¥…]˜OиzEO¢g ûÝ|õ+mgÖÖÁ 0ÎnÖ.움?£üO¶Dæ¯þ==¾–iÊ“K£âü9òÊ2€J‡û)ânú[ž_/Ýû^ÇgYö/ô™Ækµöq¦ÖPi дx8þ/´§ÁöÙ½õ½«ó›÷‰‚ !Ï›:ô(j‘sffÙk?ª‰xH† t*¢<ÏiÙ»3ðøtoû¡9 À,´ûóñêß“íiÆÝ³©…ÓE:¼l•DÖT\×ÿ^6Os¡ãíhócúWÍ}káÓ‰'d͆³Æ!‚[t³ÉÛeàó}¤ìW ßuÌ•‘¤ÇzÉ‘à:ÀÛZ´ÿý_ÀÕññÕ)ª®uÿý~ƈ¥¹?$;‰Mê’P¬"®~Ž—³°÷³?Á³^èF(ä9Ô~3­ˆÂÁ1!†DHËZ k<^³-GÏÏÿëZÏåbÉÂ0ÈúºVíKlÖéŠ (¤ÁÅ Tà,¤§ÀĘ6GÿhNH£*y¦‡+ÊçlrŸsù°þ×Êï3`C$ x´‹»æ£ÕG—ëüé_w¸ƒ…Û[v¼·ùRwñ [Øìö¯#8 ˜>ηúXÍ+¾P ÇM?þ¯ØßÿC.m”š¤Ñó°š $ JºeûЙå×cW9bù@¯Ë³Sþ;ãèØ# ÎãA'HÏ×È¢ši– š,ÏãþŽãÎËíCïi`8) @¤!Øj*ÿ²â ø;¯_"ÒÕþià"!%?tKÍ49ùÉ– â;Æ`¤7³)·›lmŒ5ÂÔ±9A q9Š"@‹â7‡.oä®éÄ4ðJ*B,¢Àšƒ´ñ£ò·¸ý=?)ú˜åG­]þ6D×JLÀû”iÈô듾ڵ4µœêMôv¸ºðîÿN0€.má ÐV„4sÝ€óíOÀÏhë‘yÌ\Cäi÷ì”ABQ  #·ô~NãðþÓðù›Óã´Ã³>,p ×„…½‘ÐðãéEæêüÈ×-öÓõñŽùþ«-¦ €§þâØÈ‚™ã»þ³&=fðcÚàõ¼\&¿ÖÈ&üeQ…5 GÉÌß—uòó@a#x£leËð  Ä_Ì£»ccRÞgêj­Ï ÁÔͪN7snrvgèíYN¢D¬v(»„¾KŠ=üGOP‹(ÐbÈHó1ÐòXòñ@2È„A3£|ÓÑä4øØWWmÚ~qÊ“˜Ë>Ö¬ƒbÊÒ!…VyŸ°à=í[§ôñn¼ÊÑbꆕš)Ÿ)‡ØÒ:hrA£TRòlhí´J0‹VñzêLÛaÏËÝhdçòþµ“óöûîVTý l:ò¹aQ•ñMtáGVðÿ•¥ÁæðtSß?KôgFS\•‘aƆ B6öµ:v“tb2ËÁT³»è°[Ø[°8N5æÿ‡œp@ÈÅ\h§ñ.1%¾¿éO°Ñyþ;ë|9Üö””pù0.°o4‚€#€Fn³¨ëëö1Z²çiãZyb¼Øµo8S‡«Œö4 ãëžS=lEžÏ:žÕž'g“–ëZƒ]! (àÔõ¹8]:±²±<üh½ôì ´ï¼¶bït+ãJV¸²QFõ]½™½Ëì¤ápž_E\í%¦î¤ÎÒ~¸¶tÓ8:׸GiC eýÜ©o¦»7¶úñ£+‡êñ]ûñ7[)|Ý¥«:¾:íöz³Ÿ?F3ùÆèPãUÚ±jº*«ƒ†?7ñØWÆ>!ûå¹Ì4Ð(I#ô”Î)Êj€I’¢¸¦»pÖmàñÛQc€·Œñ¬;lÎc¬ÌÜ0qÈÎnæú“"bâg¿p Â5øJÒ’MQ` dÇ_݉M™‡pû-ª*sZ)ÞB©ƒeözì6Íz¨Z®:»Xïû ãñp…½Tv@è–ÃÊe-ò'XÀúíG®Y™e£î#žW¤O´¸ÓK&@˜.Š)'Â] n‘`§Ð6ÌšEI-ú ä]â3]ž/‹{D‘ü.›–jN4ÚÓ÷~=T@yM ` & Ú¼ìç¾sçþg&ËüwêO—½£çhNΩ=.Fí¸[ÛIÿ%>uþ|5‹‘"Á^Ï”ßੵx¾œºQ§ˆËüˆÚj¦ øVD² ükçö<®º«*éÈ^rÏdÕŒ Ã1~|ùË%øcFu¼Ž¬äîàÁtñ—'ñ9;ÍJ*Ë Ç»,æ»þÕ­ˆBå$!0æ—h´×-LT®‘”Du£æÂa !±rËuíÎ3@rä;é½RÏPÜíÕ°ŽÈÖLðgXïï¡éº£JD FêÃòåâk^RÒmþ¹QÀL±,XDñ³ʽ®Fð«rt84·‡Æ‰Ü[®rYême¶›óÏÁÁq$ïAZZAžÒ\y±}8 ·zR£úã& 5ÂÙœBôÐF½‘i$ÝZP53•Cé(i€E¤»Ó¨Õ”m T>»eÁÖŽ/*àÌÊô°ÌKn:,P:w±è²U¥/#'Ãp¼ JR€ÈîeLnÙ­K¼h^C?ˆöš/5Ôgžx3Up{§¯÷øÝY¶1_*Ëd¸°;:x3þ¦0N|/ÚƒÁž$¾¬¦K¡+š=v +ê5³¹‹1W(MÇ‹D±?ƒ óôð‚fF¹%.œ8„:öH¬¥Žt~ƒ1G]=ÁÃô ê5ÂDž‹SÀ€ú¬9œbÿwŸŒB"0 ,ØÕŽÎ÷ù•kW¥Žî–neãmg¿ˆIÛùlžGû=7Xã«RÕIÜf4ø[ü Qð'4sn¬;»£|˜s2†Q!F0›6ï%“~Þ” 0õ!êä¹®%<?³fê]mËu'y”øÌöˆÏ¨]}z¦üŽóŽËýÇ"¿q‰ $ÓAØb(dÕ>^5‹t G޼Þ·¯•€¬ @ #Vrïµnx„¯!F©Ùñæy:Ƕ©Ù1áÆ ®*B#(¤H‘ô!MqJ³Ú/ ñr;Îbi .Hð>‰~xä"8wó«*D¾Ñj@šDBˆˆ€‚ŒôªÜÁÛ7â#›í}ï"ÍÍÃç.dýÖÁ“]ofÚB{ó= †EŒvîå^³XXs„E‘´!¨çöÜQFeou¶í‰Âdô ™‡5­ßAûí”ÙqÒƒ¼D@*DB–Q‰›"¯Š¯ ^{ʘœÞk /lÄ–íc0æÕó}\Òò$(nG_ý;ƒ†tëuqÁv6š¨NÅ·šõú‡Ø†ŒîBfá½Åœ,ÔÍ?mj翆7^÷™mòïdö+À€ÀÅ^'£+ÖäÇš ~S[éu)Eô+æMšóQA¿¾ª`Óº÷Ø#NÂR7Šõ°”ͪ ©uÁ:óß Á>D©«¸Q ð¨$³Ú Fá¨à&SF@"~7Ûb'0‹c½>a]Z¡êFßÜ #åB+ !<ž,|qñwŸ'ékÿK'qcžšãj¬&`j¹N3ÐòeêíýLLnt{öÊ3‹uû<>;HÏ‹×dKòÚ~$u¾gÆ×ƒÜ‰e¹NaD$´ò€ðŠÒ6²K½,ñMì”je•Q*"!EÅZÜ‘“©‡©šcDEc®¿kjkjÔ]x™]uïjø#3¼®g]ÓoþÊÊzÞgÏO£Ükr«xº®ÃõO§Y+´޽tSìuíÕÿíûìL´­ƒÉ8K6Cúëàƒô󙯋§-öšAÁ·Šõ¨Úwâyö?ÅŸs„S¨i«ñKBÉ|ºo ¬"'­ü£ã¨"WCíP5ž#¡ ¬yX"º ÃÙ:_ ›o^¸9ìT „c|–0sáÏ@o‹FË÷¼˜&†1÷¦6}K•¦ªhb]1%ÛÃg”j»ŒA¢aéú§Œ}zýƈäeŽ~zÕ†k)QÈÕ,+ÎPKñä»ìx%mn[±¼`Ãæ7’¢Í.€!úí@€)Æ”]_){Å9^zŽÕêþ _)å<ò€÷ï—×ÿ#k+Þ\æF!:«¶ŽAêˆ! 1¾ñ¥¥ZÍÜfµïÖPvj«dþþWR3Ƥûþ,ã<çà×pt´Î|úÓT*#E€åG‡šØ¿QÔqW+õ¾–œ yì3Ôl’t‡¦Bp ‹AM 6=LÇÉ>ÿ$òÊ|ÄÌ¢PViXÌ‘¤ Z—ÄYŸ<÷ŒÝû–§úâÏc¹„Õïat¯âÃû’êÝ~æ8·íCö¡(ÌJ@ódÆ»ˆ·Ð‹¾Ö×ö©œÖÅBs´Ö§CÓŽî2{öçcé‡v´ÝÃ7‘Óл„¨eü}7Ümh5>“·ê̶‰`é{kÜSœ†¸œšèêý£Šêäg_܎髵Ùq|ke"Ë9Œü? !yODŠwÕr§Â•7wtùF9LÉaFFwÒï6ECt|]‚¢AáænT<„A¥ðmn/{hŽQx2 \2iAÅpS°U•4Rl cl°¦aµÎ˜¼5õ·‹ôW(ƒ™£„Ø>´i,-A´(Š oAt’÷ÄE)wT©IGL´ŒÈѧèx®Ža®) “Y³P*rÝbp‘ï¾²É#7Ð[S}„°DD@Ø(h…£ŒgŸ1¿`Ú‡ˆc²têýÆgá”h–¸Ø2p€áäê–F¢™gµMˆØx† ½(Øjy~öBóìZ?¾Ò<Ƭ|Vx *ˆí_%šÝ‰¿•Ébyfü¦…MSR~±®8œ@5§ˆRYDÂ)ÅbŠg±1mœæßa={ˆ6à9Œ9£=Nñ#§q2áõãI™ˆz¦"qNÿ)QݨüAdÊ(%˜!%¼ÅòÙ`ÒYXŽG‘ª‰‰HéûxœPW¬ã€ÐK² %÷›Ãf zýëšöRÄÀÒtäõ^ýƒÅ‚îû¬Ù¶¢ò›J™{e†~`âŒ:Å”Æ6W¬ |þ£§a`À @Cá0h ?ÛT zV òϸý…„C[2©“ÂZŠ86 ü¥A÷HMÅÚ ¤(‚LƒžÖǵ€òýÌ}âE¿—H’ßír·ĦçäÈ% ügKïgš^Êëqé=¡e1Ä‚ŒéDh†T¨Þ,EÅãaþå‰hPJMG2ê…pˆðí"L *qLN&ú )Õku}êõì5ˆn}éÊ8æý~²£â”Z¦ ¦šwßh`™Î·6å †+¿ G˜¬-CMÙnh°lx5 Ãy{½e8Å Åë·«Å϶¬ïˆ@¤ ÏüP$ Ô Aì”ñˆ ´ GlÙ*ï)È¾ÒÆV-½½ÎÈu/bJð­”ýˆwñîNu‹ù/ŽM‡—•‘£~ó¼ÈIw€€´ô¼}Ü™ÿ£ƒ_óèóm.¹úk8ÞúÖ}Ñxs41l׬¿q¾ÙG¦z%xæx„êÅŠˆ) DD°a]HbzC=qåÁg‹¯â×´ Àwøø üDN"¿Í]ÑKÒ‰rúq’°J73ê7Ð@øZØ&~ŠéÚ,Å«æXY¨’Ù*ã)?hϳœ©‚ó)€h£cF+¿;˜¬Zúnk-ˆá@`”J TætÙ{¤£gP }ùŸ„û/‡l¶zD½zå×­ÉB}zÛ¥V±e…N†Õ‚ ¢ j…€\vÊVÂu¿6Úåú~µFÏX´ç÷ÇÆ#tÏ=®ç›æ—=–o¾®û—TmA•ªyP [„’¯Qw“ÃkùlWö üþÈÇü˜må<ĵ‡½xsþY{kš)…ÅYríhÙeê+˜}Ö¥Ô—±¸`Zå_£ÆË£±‡BkÔ·Ê,Èaþä"ÑTA&ecV±ÀÂ1½àÌDÚÔ[HqZ²ùWPb]}ºžÀP;d ÛýÎÆW?­ŒWtøð}~^\ªžX ÉÅýÚáF&~4¹ñî¤G ó(~wÒý:Žƒnÿ%Aⱞ2m!ë&à2Ÿf¼ºˆÜE‘Ñú3½Ù?u\1¾(¦k8Ng? ‚‘Ä)¶_MnçòPºƒØ¾T`¦»`gòªTFA$ùʤ (4¼ m6Á˜ LÕŠ‰)J&WQ*%Vöy‰<ª-NXŠO`=îã‘ûÛ;îIOù·=?ýžãð¿§‘Öþ·t„D†@ˆCòBÿ"ŸÆme IVÅdojpgÌ?&ÊÍþÀ¢†¯ÚJ]F¦+sFÛ» §Uà“Iñ#}Y'´®?~ÃÁª'ë’ˆ×ÓÆx“)U3òÊ^ÅP, ¨×1ù²¦Taé(‘ÆIªþ- l87t^‰ä|g2jÄ:8f#L,³•fÁù¥Ë­‡‡pWFzR ®¢F{Ó;½r×ù˜äb.°×6Hº…Pûzô â* v϶mß­ÄF2ï‚ñ®„ú8½à·°›Ÿë_Á$ ×¶gÃ÷'¼éÛÕÞZ<­)ß4ò@{Qȃ©~üþ4ªœàA“i4m~n†ÞëŸúùû“×áo½[æý•ë†׈\æ¨ðiÌ  Âã±qµ²á¢<ýSGJÊÑ ÐXV`ëæôÙ£—c“§{Ê2 ÆÈ}„+KžÔ‡/Ÿ+ãµ ÖÝ‹ØxšÈ̹ñ­ÝB¼Ð$n@Hx’ÊÒæ5þ™úí@èãB(ñP#5xÏ3Æ$@g‘Çzš9c^ÓtkÞZ, † £²`bªíõ,˜Ðw¬„ØÛiìÆÿK E1Å¿c«ûÔ+h ÄC22¸34eÉŸ¥¸ÛÖ¬ªlΛçfZ×€‘¸ÖôEö°¼Îs¤áeЇ­{{)³¾h ä¼È"$eÎE[O"U=m¹ˆõÒh@K“̯” ˆª.p÷íK¼(hF³„›yZÜ:سSœŒ 7.\ÖˆbjˆÌ8¹Ì©îÃŒx!)£F®(X^6b@¬9mRÝ[(+x1©U4)SB/4—ë0Âê…¸ N…q¼âBZL®”6 ጌ60AdA$6ÚÛâ„o/F–„ŠI,˜1‹U›‚cú1€µã­¹Pع£cGgHóäM‹j8ö÷µ±‘ØÿçC,•NY§…&#jõ¨`‡û0±Þ¦vùƳ¹ªb„ÏTpÃ@…¢ èëm±¤k9½3z!•D1Óü4RÁ,eÛxÄÒ¿‚¢êN°PÄÎAÕu#‹z*xmÜ cZmCËöœ¶ËÓ¸º$ý«¨°4ûG“=(ÑšM8ÑÞ`x I–t¤Ùšn@S‚‚&ɧ²kdDÒÞ&$‰âË­ è +ªÕhWY{mE…¡-&$m1 Í£&û4eyki²Þ»Hsî@` W«CÂÛf”j”´f, Þs©ì¼Í!¶I` ³½vßÏ”¯Ã\lGG‡…ØMEC0ÝU)i]B¾Í»Xn‹™cI^JꢶÆ,ë>Í5*Í~Vµö#Bh<(hllzÚó%ö‰i^f\q¯¶….Œz±nVD¼Va¨öX„-XÐ,Çÿpò©Š yÑOÚkJ 4-m†&`B,(À¹åz1Šª$%—,6¾6B,ØÅ3—4p≤`Ò€Å=ì®b(Ì-_½0$„;A›c$0°-9ûfp! –³.ÚéF7’/ߦ›YÌ1¼˜ ¥S µÉ/îÄk0† ¶Ú‡Æ(ÀÓa-^a,B‡¿Å 6ørÐBz,T³9äÄ€ÁŽc@ÐÞ¶)Ë­šuš£ŒI Ô½I }\›Xµ±¬XÌŠs þ— Å1A¾ÆAj0†6ô5%FX/´fkH13Që:õa°È«÷H€ ’JãXÐccÌÀºôì 4\Ð òI#…“%l¤‚D9ˆ0¦Á ˜‹ ‰ŠJ†662_íÉÜêW;«×HhܸOé˳ö@]…AÕ6¹š9 5°/ô7é®Å(gÛs\#+ ífF\ë²0ã‰yFPï¼°¥–R4¢š\Ô&1ß„}׫¹‡~eëîö}(Ì ÐxÞ›Û°B3ÐÎWí¡p\bŽƒ{‡ÿ5%Õ”2H+¬ˆº_ÿU ïéÚÊ42_Ç*hð5¥{4γF+ª¸€@b¯bE¬ð m6 m0m…¼Ë™s.fâ¸T¢€Z¬ÀêuD……$ ಢŠíPÓ`ÆÚA )ûÑk– Vf®æ*ŒXpT#‰$©&cÉ\%¤24£M’Ð틜±°ŒJ1f{f°19xFCF{ Ì%\BT„*_¸0ÎI¾ÒW^×&ØI®j¦I,aGU$ Q„e·Y&$*™Šô0ФZÆ2¦1d®mŠ%˜«€¾Õ¤À퀗ªÀÐrÆÈˆSIÆ’qK!aŠÕ‹X2B­‰"ðZ%%÷‚tZI+ú1£—R·z3P+.…aÍT£SzF’µÛ9ì–ÅF-ÅèF‘äaŸT`jû˜m²–US!‚®À êkhf²*jëã0âv­yrÙ¡CE + XÞK«YÔ–’J ™ ™PN<©’"¸ `Q1¡¢k€­œÒ1b×s  –`°…rÁl /µa‚¹iŒÂÕn—D1_\„Û[~k›!Ó “1âc:¥–‘[(æ!˜& h²`%46&“3Ød¨‚Ž,™K/RÑkEVW6´Ú Ú„ú2»!$A[…s‚ eÌ12êFˆ\—¡ DF M—R&úns,‚°µF*2§T…¥ÈÐXëjXV5B£ÆÈ`¢:%&Õëb‚#!Sâ¶’6Ø€°@WsKت¹@1¶&Û¶Úé-ÒC…¯²XÆ6‘.¹†0­¥A¹ËbHƒRp@fœBPªèŠ®z­mPÅ"ê)¸pØ¥’Ûlm&Ä…ZÊ™&@ N\I9­bÈc`ÂV& qŒC Œü8'KbqƒjÉ cN¨Bµ$ Ä…Qe’Ûem@R'ngáÁAU4@&p ” ‹D•4Ñe#¨š¦ 1§ƒ ÉÀXRjX£ÒÆ2à1¹ÒâBª!P3 ˜3²˜DŠ1†(ÁƒN1špc b@rŠ™rDAB! [ŒEƒ*Äb11ŒØ“IJF04CÐÐhN ¤¦©)Lª‹Ù„L첡iX“Æ0¶ ÄS‰J(¢$G"‘U2%%§‹*±4°bÆ ÁP%ŒUX%Š’š(¡¦Š& Z H©¢aA2" É %1R”Ä Ð!HD°ŒÕ@2DTCJQT‰KHª¢ PDÌL„ÀPD-LBSDKTÒ@S#PU@SÁIIS4„LAAQU,0SDÌIBQERTÄÓÍ% D“IRAÐUMEÐLDRSRHD”AMAUEM$L3IT‘LÓME$EÄEIT12ÁQ$”A5ÓUTBÓ2PMMS4DÅE$ÌEEU1U1DÔQM‘HDTÄSC-KTT’U$DD‘2E T1A1 4ÍE3DCÅDLÁLPBKAAL‘Q ÑCI0EQQE4Ô¥U4D±T“•RÓRÈÁIAKL•PÅP•HEK0%D¤AT³IÒ„DC$PÕ¥L3UCJÄD” (KJ„DÀD‘LJQ4ƒPÁÑB•ÃHE@IIJTM Q 2P´‘EHÓ$C)QUU ¤ÓTDCMU)4“ L•HÌÉ(T34HÃAP3¤HL,RPÉPÒ±!TÔÔKI@  ¨E @”¨L 4ªEHPP(P ÑLQÄ)E*RA´ˆÕRQ #S ,1!T Ð**ªQ\²((©J¢£ÿùŠ É2šÎY$X·ÿÿïþÿíÿÿîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsøCË[mÎØ5|J Pèpõ&½m*2•C¢&‚"ž§éO&“ÓS)úG©¡ä§äL¦hÓiO”xM&ÔÓÔö‰¦Ldb1ôdÔÚ™ˆÓ)²M3)èÂzeAž‰Ñ6“M4õ ”24ôš3SЀ4@Ð  $Ñ¡©¢mSÔò›Òi6=OIí(Ä4ÐdÑ¡èi= bFC¦jhÐ~© 4¤4Ä52hÄ €  hˆ£COH%4¦iQú“=¤M2~¨ÓO)ú“Àšjz€iê žˆõ4Sš ž£Aê=@ƒ@ Mh=@i h¦€Ä*ª!¦M3Q¡ Ñ“G¤ÄÂi¦A¦Œša4Ñê`ŒƒFŒ#ÓL&šhiˆÀ€0€ 0 ÈѦL!¡¦L4”D!¢hhhLbMMŠze<Œ¯]Ÿn$,Þ@ˆ h›JÜBÁž—ÉÊé‘bÅ}’X5£¸ÆE".ÖòÂÀL$¹¬œÞgçæK,ÓãæÑ–§å ¤Œ ‡ Ò&Iv¶qµNM3.p9iNŒÁ:n?¦â‰’–Œ˜O²¥»K–Íát¹šSc™‚¬Î:ž ¨®idšRI»Ñ¦¼¶Ýã6‰5j ‚Zúüpi}Ùî1)ð &  EpÄ#f€ÓÏ3c‰!!ëK¥Q•! ´Æ“Õ5Þ=Ò\A\Ò¿¬$ aêÊ»Å7£ÁµÁÞê.íïð1a6­ßzlA“"€—ð¼”ÚÛŽ•ðè çYÇè²mi¶Ô͉,&¦"†9(²V/ô{ÏÎMˆK}ZÝiQ®ÿ „ŒfËdȯ ´Ÿ|d(ÕôúyŽ·o­u’e@ø¿5Öôœx*ž%+Ë1ÝŸí¡ª—¦eå×6(\µ—)—\óy-xÉêç,¯)xBá¿ùÁ^ g5»žâ0š€ H£—Ó‹„窢í}+vÎÑÖl€äï–Â*\Áa¶0Ïüüý?Ï!œIg_¸^ý„µu„ÊVSŒ˜÷ýaÚaUè CímiáV=ž•f™‘`Z-ÜL‘ëeͯl–ú¢Ø8IÄ1ª,gG`sÕÀ¿E§šÝ®I ”.^³Ðô[k™jNÛú½…ûµ¨’ýÉ@$°á} Þ6i2Ð(êÜL ¿C«‹ùÜ4ðj¸Y¥©ÔX"Rké(ü7üñ–v'ªÔñšüò!ð’ŽpZ´¬üê™h×d$¤qn/ã†8‚J!Ú 0«Ÿ[‚u¦ze€LZha>. ]Øfõ–ÍZµÎdYįfQã úÖ0íP˜´A?@ú+îžñ<3²“ÁÉÿ`6c)>í¼†~Éö‘Ãsyøú,u¼q*Š µé5ëXµ¶:üÁZÝ; xŠI4ò‘PÙÀéú âC2+®ÜÐÁ‚Y4°Cq x=TUå!‰œ¡ÛBüÏùÊ&Þ s°ÜÎæ lâ†Æï`¾º)Ñ@_ˆóÝDZ¬RDv7Xá ¨Z¢U¢•#ý@¡Š¡Ù@]äN*ÿÑD¿A(øª÷PQó`ƒuˆ'GG΀5HŽ‚•Š˜±TòðE^ 43Eå eÄG©Š P[AC()Ð@U²ÄU[,Z câȨ‚Š1PNz ÝDßAæ"‡iU±AZ\TBÙ9¨"5¸*'-WšŠ è"€2©ØDC& ŠR—" kbªä"‚èàŠº¨"ˆeD/À@Ɉ/Š…DÜÅ^VeE<\ž£ü`ˆî ¨÷øtÞÁÌ€½Þ€n ¿ˆ"âÄ@ήº ± lV(QATNZ -ª*#i€€§'À€ p ¹±uT ¦*"7"‚`@S”€ CMGuÇ‚¨kôÔ98 [MdTëáÜÄ7¸T¤+ $9¸šXsÐK ¸ðÍœ„Pçãňl¦Ö7æLÆÛÐNª(¢9GS‰A î5<”Cy]œQ¾!ÙÎ.  †Šª€£‚.4v‘D9ø¨m¢È‚8Ø£‡ß7uõóú:ž.‡XŽÑÒõθq¸†NÛdá‡bW¯ P?£óû}®Ðj·çÖž-D‘·v2ù6‡Ö‹Ù¿pñùí<üSÂM“2Ð9IdRt+§ßYcÖÈ+Ë‹"³@+Ïy-S©\ÔiÄ!3…ÕöÙâé=VV•m{äkêþÔeQ«Ôæ8Ÿ…ÅB©qwË®¨Ê!¹Bq.c}îú‰:x™×µ o5fXâ¤0¼šÃuLê°û¯“,h Óc%R\$E«À¤ÎïÛ ’[V³(ß [‘i™¨PòªåxᾺL2+ÕÒýr@mf¯Ž€™Ùµ•Z¤b—Ý' …žUð©CÊ‘óí<¬Ê \§ £3£É-Ž)ù‡G[ˆ]¨LwéKSm}»Úf kâCR"ž~DÏZg Sl's9)–IÔÔ7•úÆËY[C6H ›ÛïŸî]auºí©2Zyù@CÒË'‹·îwèP®8n{¥ W ÆÙâ>O5^µM2È›E@;ì*·Q½)7`ÑVù7’œòIXU‰Ñº¼«Ð¥/³SØ8]³&YHÆY¤æzEàÖE™ÃGÚcÐ¥·bí|Wæ7«•GÁ¸8&Ь8m̤6tÂ["ÓšCýsˆ÷\¦—ˆÐ=àV꘯¥»†f?œ˜¢Ói®gšò|çU§ kØ•þ}N‘=EÅ™ñûw&ˆUœI“~fi¹-›–ú,TKåU$ª …î¦hà hÙ|G³b¦Êï:â”äȈJRª|ŒØ°iËš%»<@^;¥á XS¶QçÑ<8ÇŒ‡¦[Õè}7Ew)QùɧÐ88Ë£xxˆ74'XĤ™¨7VH~ÒñíÎ>"¿ôù°°1XÔøÍÍ: Ð > ‹H˜ôSp±¸YZßÀ9TU,„çî–ú†n"¹Ækô¾Ò+ÎDùx¶;Zváh·"†Êp PÈ6ò€ê"î=¬Gó DCÿDx0ZÄ ¬ñ1qbh'KÛÀ?¤Ø.ö [ßÅÓÀî ¾bfø~W}2fÊ‚sQx°Pó‘C­Šx#Gˆ#C9È*öªE:¢†\UDÚ@¿; tA¤T¢€Š-"a X" ÜC= ŠhªQ@WÀ¨´m0EÇÄÖ"äKóbØÒé”T¨l8Âþp/Ý;LƒÐ[½” ¸uªn¯_¦î”mm ÜíjX±)êfÂQÕ5`W…QEDÁ‹Yšë^^j:º7¾„GIëíøøw,Ü2Š•oÁ¨Ô·Ž Õov¸Úë}!. ¢ÂÁõ´½¸…˜¥K¨]Õ5j>m 2†‚a.'HÔ< Ÿs…Š æGy &®ÃÊ¡i`ì}].U-h]ÔÙ\h%Ó±À [3öP {Œò´¡y lJ]—TÖ&!©îÒ$% ªô¦‘Ÿ§›5åFâ\M— ±.ÙwCƒâÜjD¹¡K¯РbÜì¿bZ–¹èT¨Ý3íZ¸—‚¡P´Ä@ªpaa§²«VèÔjvå(6g$J¥L{#V«zÂH@©X„Ã¥D*Dd TB1’0$‘ HH„ˆÈŒˆ‚ ¥PE?ø»’)„†vîEÐgeomview-1.9.5/data/geom/textured/NASA.pgm.gz0000644000175000017500000000717612310110172015642 00000000000000‹–dKFNASA.pgmí ”ŽÕ€×G 3ÔdnWRf2×O™j¸¡´\¡üDä§¹37”Œ)Éÿ ³¬ôGCÕš."”©H‘1‰Aù)Ì0?5 #RC™ü¥xï|óÍÌ÷íýî½Ï9ï7ݵZ}{µ¢sö9û<ï÷¾çgïý¾=Ð:82¢ô·t1zÔØÄ¡ñ cGˆèß½K—ˆa#?6´]D¯Žý:Þš8,!Á­éiܪu›ˆ–­î(ý³u°+  H@€$  H@€üY%¼~·á«÷¦5ª"ÿ@ÍÆ®+_ý‡¡¿{ñ‰£—¬R9±}˜ÿ½]1uþÆ“ s~ʉm×î@ß,Õò‘7úÙ]ƒ,ŸÞRþã¯;|@ø'®wÖ<ÍB²€U} sçå+–—ɪ™!´ÎDØÙû÷‹«ZùŸ•î¿Ö¨^Mküÿ©´UÒÓœ>ø#Ë&K™'÷& 5’R©¶wöê5¢ýj1«òrönZ¹h䬼=9e²'7mGÚè”ÜÜO“Æ—ËS½¹öíÖø›ÛÔ”?Ý"$+ˆÔ}(Í¡®æb{g"xëW¥n±ô„éàÑ3Píô3üu´µ¤ò4 ³„ÐÈ¥:û‚µ^=ßÒ•dÏØ5ÁÆ™‹¥´_*Çì 3èÎVsï.m|«?ÕA4¥yŸ>~½_8s¿6Vòj«¿•ëž—bOêã[ƒˆþz”Ò<ÜÖùÔï•×”ü mõk¹ÎŽPÆZ&Nô°“Vý^?T2XOÅW׿;û‡½³NFø±ŠŒâtu§€w$ƒ©*þS¸:Žïl«½³ýfüwÚ{ø™ÓýZ“ÿ7ÉàÏ*þb\%ôV+?m†o=fͽ¼r/-üº²ÅÛ ùäÎðˆšâ[Ñ&wïF-~Åøœ!ÿx©³·‘òǦü-l»~Aù¢áÆ™”ý þ“¨vÔÙ¨{ƒ)¾Õ&^Ò¾[‡ÿW…É¿Èü' ˪”_3æ·J3%íUømU&Ÿ”ù?€•]åÎb€²1¾U欤}Tƒ¸Êä'2ÿ\XùŠÜÙ»¾ºÓ«€_VRó'¨L—ùçÁʹ³Ý¾º_úÏßAVo]ü– uE_?úè†Xþó¿!«O¯ þÎüm .f|ð•ÕÏ™óŸ[‘¥ØKü¨býXüíçÿ«UúW*ù‡ üî¶Õ.ƒùïmdÉë¨àMfÏ•~%ÿdØÀí©ý»|„üÒô÷¥Ëõ-,Ùáu’9Àÿ e#>ôŸ7ÁQî²íâ(í/– ¶ó½w»nÇ[˜˜œžYMÐ,;ÚA̦좈¸%®7ãÏô‘&ÿ1û P¥¿ MŒuð/±ì®È÷`ÙÃfüë=…³¥±ñüMÐÅ/ ô`&K:FêÉw°NÄ=‘nÆ_~ØyJŸßwþK¤PñJò¯uÂO9®U¹/Dþ<…=¤àEbÆ ÃHå¡C´à׃]l÷”~¯1cøG‘>Á¥ÿ"Ÿšs°Y’§t,M#ù—9àG+èOébˆÇ_‘÷ð•0¸P÷:û{X=Å-é'Ý~äûiBîAbñÃm{hñ·ÃÀ‡ñki Éÿ®þ2TÓÜRƧÕüÏ A¸8òVŒefú °¸ÅŸá÷ôÇ,,ñ'Q0xæ^ç­Xm®(O‚åÉÔ0O›ã‡’ÓŸÍ¡[× ?Ìñ°îõmQÄ-Ü…Œã´ yž¶ˆƒ—‘ åTfÚÞ ?Ýxžÿ{?Þ\Q~=y£"ïß[Æü;™ßh¢í ê€?/çïïóźºÈˆBŠó„²×Êûü6eÐUƒ9ýlÙç?ïáp4{jBnŠæt lR3WÐÕWºj‡Öto•)˜×±ó¬¸äˆ¦ÔüâÛb5ãÿÛí¾ÇFy'•&ÛÜÅë??˜Ÿòùþm…Ó_˜²yÖ S§NO¨Çm+æ±^‘'ü·@¹¤2vM_o‹ö°&—ZùoÆ#ÑôÀÇAÅÞšùÊœ5ÿ°FlþW%ÿíhäÕ½-êÀšo ƒŸy÷7!·¨ÖUìå~Ì 3ØG¼š¿ÅçÅ3ãYÇçsªé½ÜyNø]çÙÕiÍ /ð0õ4¥›x~—bO~X¿Mp‹ð?QYžÍFywÒüëÏû»°Î“ÅkäúÎE©x`õá`ÔTŸÿñÊòÙÄ#ë‘c4‰pÑï±(/›¡ó?t¹ž×ÍÞuÆ„>QƒÒ@‡Û‘×ð„t‹o ¦Ögášž’ñy×N5¨˜Jk`LT&MYŽzoiÎïßÀ³,EÝyv›ÒKÚmS ?ÿ¾ñ)Âsh6ÿãG;Õþu£éXgšöLf]Ø‘½{ïþ]ÙÙÙy³wädçäŒ[Wú_{Vï,ýwöîlµ?è%ÞÜ'@ñGZé3‘_í•Ê@yx¾‰hXÚXU/xsIrH’ZâÃå;–ïðçžÂ_ÆïÀ/ø‘zXÒ³MÞᑨv´ñx ¥É쇪ç¬AÍD ~|ó67Ïf‰ÿ*Çß&™ƒiw™üýpõQÓM–”è7ïƒ:?j¹d¨½Òˆßö½»—LØJÐ]~ó(P ØWFZÂá–ä·}¤r°é¯ê/þé0“Cd :yÀ„¿‘á×É»9ùGvæâè”ÔÒp”(øQ˜RbdþEþÎöK´w?ö£Ó'üifT¼nÙÙ?üyøÍtņå/8á0 ê{µüã¿ÉЇôOµ£\Å/bèÂZè†_øsð™ö²ÂÚuøò9à·@OÅY’ÿ@å”2“ý¶Ägf—{œ~ì¶ó•sh‹á}ç“©~ðw°m žV™ƒi0ŽøcøµÇUº3ù±ö¹l/Í5Q™[Ô79âÇÉdÞ§/7ß«öç8¥?ÙÍÝú È—ôRº4øqä®BFÛ¾61KÍ_ä ÿ·›‰ä¥5ôñÓóoù¹<}jÍ´Wó§9Â?Sžâ¿x¢ñÑèÞ¼Á®3Cé^"ÏØ‡´ÃÆ'h¥trtó7%—/<Vù¦zl8vé\*N㺉ÌÃkÑOÅq·;¾<ý£XëöLSøCýz‘”< kCÕ1ç¢oñH´ð¿(éáû¹¾Ã)ân=)%µ[rÊ”)Ó†‡ë9ôgí+•¯Š¬ü}e’oýZPxö«}…­}……nyIAAYÒÇ7…ûw=?­ s¢?ÒLÇZº“#%Õ».û8sUïþëÖmÞÀŸŽ\õBJ¥vƒž5CʤF‡»‚ê´ªÖ³Npphï¾1QAAQ1}úö ®‹²$ìS!qô¬%g­Í\:vãÚµ™kºº€$  ÈŸWþò{*F€geomview-1.9.5/data/geom/textured/geologo.pgm.gz0000644000175000017500000003001512310110173016540 00000000000000‹–dKFgeologo.pgmì XNYû}Z•¤RÉ–”²‹hÃØRöe˜1-Ö²Ea ƒ²d™ÁX’a²Me' Ù2vc©1 ‘5J”˜ÈRÎι÷[ªû}÷Þ¾[2Ïÿ>|˽çž÷œw_Î7ÀÙÐÎÆÆ¦çÄÉÁ!SlF‡O´ùª§——MÐÄ‘cÛÙŒ ž<&¸åԠѣ œ]lð?ü¿³!ú?ü*òsr_‘·þ¸_]ëc_5Ss÷n]½Bç…ÍYvèxüü¹aóÇvõððlU‚'@ÏqLÌíÏù[Q> •ñ©fß#dEbê‹<×çqw4ð}JdvD‹Ñ‡Š*5ö§ÆY³S5èû\²aÓæ»È¨ÀqnåÕŠ§ÊfÙvžÔÜzn‚ŒŒ&UÎøC†½ýø3åbJÄ{×dõhð?•û8Væ™øÄ¿+·‡<[ß±#õž¬TØosc±½WÎOºàÃRY%Zý.…=óò¸R)°¿é[‘ØÓðÖb|¤™/>9öo1N‹ÃòøÔ«¡Œ'ÝxÛ'Fÿ¸+G“Ÿ^‰Z´WYÇWüZŠ\òŽEŸ|,pˆ{S­è“Jeø ΡþÏ¢DþŽ®õÌ«ãÛj^Uúðeô·ndO\g,¿öFÀ0Ù3«R×*âõ'¾pUm2íIâüÓCrŸÆqÔ†¬¢M³yzyõiRÌó·êóãñgü\Ð^Ü:á“ ŸÜž>Ýã´Èûþ¬ÍZÈäO­V¥"?ÕºÖbÜ¿ÅIoù¬ŽÆôRŸ;~8µDÌ£ÄßyÝ‚NÚ¶:«7æ­úq…ÿ~¥'¶f^ÛŽ?¢^Äç…RU`[ÁØßgHoÔݲÜü[U;ò§îÁ,„F*ðÿ‚·{äo]xBgºÑËBÞV$úg¶;\ÆÛ?ž]2¸šõèCof0ž­‰­,FXÿÓrŸ—çß¡zCBcÚ®³æ©m½ ¹³óŠC?ŒÎ5¬P“12©ØÎÜ3â kÅÞ7K[Ș6Рë@ÿùýذqý©©ê†¢XÍŠ²î÷!³‘Lê¾»{4aMBÒ_÷aئOôì9´c}6|¤¥ˆ¢µñ‡ê!–W©8`h¿w¹»ï¯ÿ9Á£žÖðÕ•$ÃvÕʨiñ@þ,º's+"UõüÒßôf:äïÐU×>¥^‘ÕÆržRª³´´/þZжt¤4Ð[elåGÊß”«KtÒ¶üiŸÓaX„ÐN&ÈÐ9Q-xÝ-¿iÄÒÐnØÇOåo ØO ‡ Ȧ<`WnapjžÆ|Z“:Uà8‹Î;ÊçÉÓhþà§Ž8¼<Ý@?Ûïýzdå²EÓ©¯õwe9íh `8%ë«¢/ubÊ ýNé•"ä†ÞmŲÎh×WI6å²}¿TYàÕ2l6{ãø&½U9,E?äªDЧôÕ_¥¿xØGò è/E• þìŽÅÀÊÒŸ ‘x(ú‹Qåƒ-ØñºTêãBi Ò¢ÅÖø«Êw(úKP%…“XÜ>*ÇøŽ ?UZx9ÀdW)@„ ¶–àV‚¾o¥.»ØÓ:”ÖD Zjì $E\½> J ¦sDFÒ‰!d§¡7˜B"QŽÐgçJzåIÄöÒ(ðœ¸Ôõï|è_€š'Jú4 ¢É £ñƇ?ôÑã&Ǹ¼A Bb›‰ Ý…>xÖvpŬÊý‡$â~¨pD Ú~áU8Ïž=s_°ê)äS$"Ô¹Œañw]4eŸ²ÁPBµÎÉO‡· ºG«A¯Eç*£Ë&,¤l÷ÿªIVÅ㿊I7#Èë0  Þ&‹Ð¿‹û~“)v°d.Sfh¾QÿÄ'`ä'l—ˆéÔóž^ÜX—®ÇÇuøï˜«÷D޶œ¤ÆÊ þ±Òœù_‰|äÞöå“)Ó¹_÷ïv’rºöŠ&Iµ:Ç‹µl"@sæ·Øµ¦(¯i;­hŠÃ¯2O÷/å¯.µhÿd&6ôI¨sª˜aŸ–IhÌü¯'tVó_øáõÛœK/2O†‚‰»À|òá:p+~Õ÷F`Õæ?=8›$«ÅÌä8" $â5dþ3ê1Õ ê¯:¾*¤Ÿ¥• ˜› 4Ê K¾ùà8ºu⨌ƒþÞ4‡”º8R³¿Š+¬D±yäa?–ýôlÊÖ_5Y‰èaZ²ö§{èÆTtƒXÚ¢ïVà=·"ªà;ò.÷K¨.ŠH}€˜¾Ç7ôÑ(fP-* \e![ÒP*äœ|B–îߟÚÕ­­eb¨nÞ2ZCöí¼{.ˆÙžÖ`{SÄt2‰+("g›b`xIüÝÁãÉh\êó¿oÀ2åî4’ÉÔê8ó` 3ŒâØÔoõ•Â[ãŒÇáÏóýÌi­´ÉëfQfý’º^'ø%¾|†èp¢åmö›K¤KŽbñæpâw¢ÍÜ#8jø ~û®›Óé¢ßañÐ`0‡ ò<‹ÑcÏ"N|w+WÄŒºâ1‰±|r5À–µÝÆÄ{þœ¬$’V²è¸©vª>œC‹M›‚Ô¾« ŽAãIÅ`ŸAÈׯ`ÙÿœºÀÍ4åZ‰3˜ƒL–Ê>#Âo»F†ÏMÌÇ §N®Cö:a|¡å—±D¬ý¬J_Þæ˜;ûgSaµÈ?›õO&¨&—•£º×UÑ v•Ð烅M~2¾Ô[3Ão'Ø“ÿæ²µK4-ïý½ Ç/­ óèR÷Æï»¨ Â7xWܱC³oú„¾Ñú=Z®½Tß‹ÍÞÔMp{]õîi†ÿj¨vâÁ²/ˆŒï{àvVê/ð««ý°ùMÙ†\`ã'KÀm¢šsYœêaëC‰‰ãˆq)Ä‹ìNÌÅ)‹4Âÿ^Ìä´²1‚ùà¶&Ú ð½à1Þ+'[_† ùWþö#–ГsP8«¾?£%v—”Þ“ŠÕ™ü&†ïÐR3xD‹ä̶“ÄD~Þòyû‘³:‚U&ý }zÖ¯ÙrúªŸÖ$Îñ^{v™ƒLõ˸ÁÛ—·A=5ÔôÀ”#BW± 5ä‡çâ‰ëÛÞ Ø»6„þäÕEk‹šØ‘ =î€Ö2ÿI¼õâE³u8ΘW½p&ôÐEÝ@—‹e@f’ž!¾‡/ÃUÑ’$×ÛÁÿ4™~(ºFG̪À¯Wð Oã?Ý"O3·¶NŒåÓ¶Dá_fÐ!Ý€[ÕµÀVÁEÙÄ äé{AéÌJ€?6#öÿ£Èˆ·Q#˜Ôˆúê­þ¶)Ñ·üíÙiRh–O£Ø%ËìÏ`_h¿tâ™Â|¥ àT~XÆPÛ*I9ý±õöOácZÛ¾ƒ¦ÙAý¤1f– Ä,à0í—MDàÅÄž… ˜¯t¯²ß{ÏŒò˜í7z( þ÷±Ò¶ÖÝ•öÄÿžÈ²²ú Ò|Åͱ2¶'¹‡¼%cÂKÀÏ&_W×ÊG¿2O –(’÷v-L?ˆœhüa:õù¦¨¿ç@Ø Â&nû±&®:pµÏÛÌEd£ñUìè©[2Æè„á^Õ‚†ëß¡Kõ˜øË³Ø9q¼m«Ž0“Y\$¢À™Øÿ*á¹hSÊ[ýæng©nóDÐc¦=FÏà!<Ç]ØËëXê¯ÃÌ ö\þÒ&ð²4ûqž°ªvƒh±¯34çu•ïôn%4ó‘vï>I– ­ÈÑ7Çl©£Z~™’, ORõå6Ò•6(ìñ<ܳ˜ ð‘ED~»‰ @ ¨« u™vÇí±fF©A"0REžøKRNÁ/&¶´ÑTœP™¨ «ÅMóå½ lSå ŒzË+Í¡Ó3$ÌåþêŸ*Xç’üÉÀ©—ÒÛ(…Ny½hH·:NË÷ª/Œ,´$Q8!Ž¿¿I$‘/`nrävÀIy{C²ØLõJQ3JZ Úv25Ýîo„/ŠTh¯FeÊ®¥+i'îí!N9Õ‹™+ ëÂpvŠUjÇN¨hÀZ ºSHPY·Óâý«†c£É$ñiÓ©É}\׎4Y€`$¬ÇÓ äúâ©–QD0t\= MàÐ×{ :?qæÙ¬aR”L÷›¥XO[€}GShÏ™ò[^ÚO³mØÿÅßàWáEý¡zàiÉð†Ý¦\)/ž®:,kÉ 2èNc¤íj*åõDüºgL‘bƒ±èxöcÍÁµ'Á°¸úúsš-;z'~Åi`/Ùºååa•f¢\Añ‚±×Í,¡9¾DÍAwæ&ÐgÂÈWF(.ÍŠ©Ð¡o p¸·…°FùýfRØà2a,1sÃùgÜEÎ$µ7€[ЖˆzƇ¹¥¥6‹l„F7r%~cÅZí]#€~7±¢·© 8Ú£FC¥wOñ¸MIJ¾7MøäðÍxÀ%éð‡‘ÐOãTŒ%ã£'µÙ6ý‰X„ODIrç ƒòö3ÍÚ¦$kߨFr %^†ž;³“,/å)>YU¬ý &på¥ï4(Å»«ÑöÓéi0g˜9†ÍЇ è ¶hÓ¦ê±ÿ­Â¥7oêâ%”ƒL¹Òo|ï½J…8V†à'!þç€FÒ‹Ãà´h ®¶h´ûá>¬êuÇU•¥EN‚ÞSR[֜ٺtXdûo‰ £Â`4úY ''ªÕi˜a!‰Œª‡`<–ÚRç²8ã«Îr\;Q‚ôi.ŒÄÏpH¥†ÉnÆ5f]æÇ“©`ºøþ›ŠØ vˆbõYuÛž‰"u~iU)þ›?¹øG±ãŠ¥Çžö5ãÖ>n`ÍÖ]ÇÞiÔnCyWD À)€$ «°q…»Äzø…ŽôíÏ }G@¢„ø§a™æZ*VÉÚ¾¥•eÊy˜Ÿ2ÉN)…žÒ›Íj1R­‹‰*xð5CA2ÞØÝV3Û8V†fëÃzž7‡µR2&F“â‡Ö·Ž!m{ñÿ7:ØŽ¹Ì+÷20×ZæüA2§R½}ŽGˆ_Å'·v`™@_A\BKÂ3ážLá‡TY*Á‹å‘=—wJ¯ Am7f¾ C˜6¬:æXz°¯·YQG]¶¼0Æ– W¬JC•uÃX¦Š‡†ºxR¢Aðµ”ø§àGŽ.ÎÑUU “B„Ö9R‹¡‹6‹‰‘Q[0O´>³¡9Æg'½ä"ÀÏêž6ûU§ØÈ²ÇÖ Æ<ºNlŸhYÈ̓gÂ3‹ÙOÃ{¶”JÙŸW]R•߯𠋧¥´˜XkñZ½ÒÒ/\uS€¥Á¤S×¾Ïà cuÁ¤11Ù’—^P_Ò¼…:Ê®ê8&=­h”~ü¿·~úM+džtªz³ôºóˆïôÙ-»9wk¯Ú²åkzåC2Æé9Pb*ß|wC]Iñ_Å ìúÛ©Œá2gsm‘ù£wVlNgÅç[rÚþžÛÎ†Ý NÏ´$ÁÍhyˆu*ÀŸü1ẅR €±J쯧®>ʤH=q¡¯¸‡“(³’÷°¬ßV4þD´R¼áÈ0*à&NŸù„3s|“¸ØäáÎz0KÙå/3Þ u¤mAÃ@÷¦’Aºªk’öaæ×ârRÓʰæð»7éžÖoɼ7D@3IѧQ0yDý}C¬ÑÔ ‰ît-¹ÇÏNxb%rmi³@“óPŠ:•öŸb€ŽÒâG_ÉK-i”„31çJ’ßJ"ŦɢR¯‰m=ÚÛe#Y·¥»¶8 ÖZùÒ.@k%ƒ8,u÷ÓÑLNŸ'aŽð­ê‹&FEÅþY<_HJÈ3Ã5–¿¶‚îŸk4«pY–±Ø”ïíædúÓdo© sAÕŇ˜*ïâ…_ŽÐv¸0»§îY‹©µ]¶¤ø“b ?–¸ë§4Üm ÕW¬•kðöðU Åj””4F`Ö¬TÇHð9k¡õ­´РKÂn:ÊÞ“ÄöíÌ…“×ëèæÐ˜ÒFÒ¼a›&Ð:m¸ Ð3B­âÒFæ¨Ch÷¯€'Î0õä 1ˆƒdüpV X— ¨Fã¯c.¨3ÂgH3€Z5`KÑ®$ýU€t„î—H€ç°gÅk©V}RS>*ѧðòeaa²°‰ý |ãF–™ͶRö†š&t÷&tÖðŸÐ=ÿÍ¿£Fró™À^Ò’4¶¨ñêc±iåy˜šcÀk’‘¹´mȯëÊ›sN/äV “ÄÆæ´¨yؘQÓ÷c˱¡…TB&*’íÛ&eXH˜÷F E¼¡hÉžÛ/E^àøFxÂÐ>›–Pæc$-`¦·|)·…Ÿ”±ªN˜ž‘©§FØÛLòŸ:²_ý0°kàÐßoHŸ6Îm±Øs¿¿ “É€%wѲY(w_¨#écŠÆ¤U_eQHNMèÓʶ'SôŠ™‡úß•´3•Nš<›,ð®ûÆ@*š£*$æ†.ãÖ_̸ÐÙ^·DÝ*! ¿M°]¬ž¾Ô•re‹òT»={Á4Ù·û¹Ô8Â,DN9za§¿JBü#ðD˜³Ü¾Ä›&´ào%ÔÉÁæOXˆ¸ýåŒS1q›¦øŽpëâLÏ¥mr4¡øÉüªSÕ¾sÏò?æ©×õ#¾ÿØ”áÝÄ´°ð1ú–ÉüÑ:B­Koê6φڷ¾®êÊG4y?.ÙEbDM ±á ½FÞ+„¥ñœH3°úÕöÿ³Ë]¦ÏË’y–À[G+‡¦¤¯° Ìx‡gTó¾ {5TõÝúèžp¶?IÒ¶…£`"ÚÚFàd3ª<×Y'%=àtPæEvŸæx÷Ï yš€àÔ²¶›Ñú†ÏY´CuøãƒYñøa[Ô—_ƒ\Ä¿R·ü²~²;w=ÿÃhTC—±ˆÄ]ÖpNšÇÿG:M² Z0·W('N€ŒÔ™õLÈ áÜ#}¹YPÍ“lŸkb˜éRZ_*Íüry¬ß"2{„@p[©ÿHÐæ]ŽÁQ2WÁ_Œ4=Kü÷ #(D­Ïßã)K{ #æÏ*íáÏuÚߺ=˜e_µ†Ï–l†#l&ë7šiÝö 75‘lë`Ã:?YžH`…´W¦£Lu\+äxuÔ)¾‹Át;nØœçc¥‡ÎÙ±cõ†°zd JQ›P’q^†Áõ:£r‹}–¥:ü½t¼345v„–ÂÆiTZö´½×(¾=ȳJ{ÖööMÙKͯ¦,Té±?™¨,“˜j/þESê >.Åá'QÏSÛ[m W(äìBsD9d®©*ê<~¢lÕÄdÜ‚  M²ƒÑ¾ˆ‘ÖT/t2ÚŸ·Õ`u «×·„zË\ ™–³â_ó”Áæ}?˜ p›k/jÂy øÑoaÇ<ûS >ÔÌ´bV8ú‡HËÉ0y‚FÂ¥M^†`zÑÊžlvƒãò¨:ã–ô…ÿjòh{ᮓä÷F@ %ߪ )pOw›4¹*®!À7²óË·´ÖÃÙ¹÷B$6mI]}ˆŒâ÷³jÿ?™óÅ&¢ ¢Î툀[wêçtÊØXLúo9hYÆ‚Áµ0º3K±.†Ó˜ê¼èbÜþòd±°Ñi²eÐì]"*äÐ&G±B­’1½É}FsÏ\ˆ²Ž¨¤b91¾¿šuz%¥’­gGëÐp¦Ç0æ”Ì OO›ì |Œ&+뻵V­Òȸ]Ø^Fª»M|†ÐÄÊû¢Òí…x+Õ}°z×-É÷kìT>ù‡a«FbÊXú|'¡êÑ«&ÏÈ­ŠÆëú¹-JD¢Q´Pï?D¬uEtëT½¹Ïy°Ö!˜Ã [pæøË^õqm¾?Ý ì/[Y4¾‡H}ØW„b©/¾Ôs¹d4j‚yDÈÍiΪÜ÷Pø«ë#»êá8/jÁ÷íµ££fä›õu§nÉå1Aœ.Aq&rMÃ1€/¥ßõÿ}*D Ó¡ÏèÄn—,øyk’X^¤ €S-¼M.ñW-€ƒ6ßßv !'ìñ!YB#¬ŽðÞq«/¼Œw…z Ìð®ѯÃI Á…¯Ðgµ*¤0¾Ý™þ×€F±Vo}z® µR~:‚V´hRL¾E5²)ì'BvÂÏx¨U€.—MZK¾€Ëuò2ý{ \瓳k‡Ö&4C£ÞL•'ÙA#‰µ‡Î4»)Iv  i£ã-ít@Cº|ÿ¾ôm³l¶Ã*ÖÎ Ã(d&š‘mâã .ˆ2®ÔÕ^åžX9:V¨Ógpê|Ô诱C¤À®Küókózl#ûb™”ÕÂ4wÊ, 7t¯·N‡ï¿ÆKòa±ü½ÿÌù€Fm ë‚5øØ/æØô _‡µ®)vªÚjÎnAðœægt7ˆËÒµ¡þcNô£+Ç]O9l5ä•k¿m–jc›µOÈ3/vFÃïrŽîŠ5åi_ÛGRt+ëÉ’¢iåÔDªð¸O·]xf(êÁ"`Ž&À;|\Â6¾ôjëÝñ†v‡âpÙbâR,ÃM¥b¾ÇUÈ&£An~S^;·Q?qsKþ•Ã§ÑØåiÆ*¿»q*JA FÄܤtaˆÖÎv¿:)QIRŒò,¿|æŠìŠ?c“2ë°"ƽ†6f=÷}Þë°sÝ,›³¶Þ7k–n5ÕF0³*ÓXîj]8÷^¬,'Vòn WI´St¦5|eåñOfý~Uz<ÿ¬†}%¼)øíYP3E»>µ"P>þß™ ô¬xCwHbLÑÝÜ—üÙ8?k^;<„¥tÉŸ…êDm­Ú *ñ^äRÆgÕ ¬Aÿóæº¡;Æè§nðó€·4ѳ|o&æBýM>i |«ëoã4S/àa LË~Ë´&ðÒÊÁõ¢«ÌhÂÈð—ŠÑÊ ìÎrº¹yO£ð|!f“TÑ]Åêk$Î%Š8líèüLoð +(`Xsø«mˆxî€YÙš© ”¢«÷øKó}èþ\%ñpÏ=íQެ[ÌNêHìÿ×dœ>\ïúä/…MÑX;%ù¹ŸzF%öë/n­ŽVäÇúÛMÕ¬^‚_ˆ‡3êHè2Í÷—Qhœ7÷#)õó ´åÜë–Â5Óh˜WWpö .0wöý’itø9I{Jȭʈo+EIŒ…è•¿¥»§?à™cµáß«Ž Æo»Ú™;ä®ëZÁ®»Žü69Kâ{ŒV7iø£Ä¿§£¦ÿ†ÔFVÔÙw£ìÀtÖÃ/¢‡BPIýâçÅßH+‡ÐÞ~í#Wl 7…i̾ûÀ±FMÍ­6þZ¦Øqëë;"¢Ž–ß;r7/_&2™.SYãO Æ}CiWevÜrûÛ4¨öÈàòTlÛ5Ïü íZÅðÆMÉÝ0ÔÄáŒ0qÙoDYiü ¨fŠòÍÊBM½Û±ôøZ()hC"«ÄHÑÐdõ§»]j…Ò‰xô“¦j)“ôÀ?Dc¥æñwO,h#¬áþ?Újø‡é<%±d» o,°Õ¨ÁRéÏR›Ý’ËPÕrÊû•è´‘ Åùø³ð£Úük¶kÉòqg¨ärTÖ?¿˜ª¹]`Š}÷>aÃzCjºÉb=û.ä±LM€zs`½Ä&Ÿ,"‡¹x ×Âb ŸâšHdW1h­,FPj$[­†$nSúp…3ÑjØÉó C8:µ—¦x2yÎL‰„7£ÏY}øÙ•e¨|<‰4ª¯o7ÍkÖ-e&a8ðUAÖâ@T¿¤™ô²O;׎¾‰0uxø=|6}wµð™ðàS·÷¦ŸÂ1k¨ ‘7^¤FuÉ‚£i4ò`-nƒ»RçÑ—'³Î³`ÄmWÂt–h-DGµà¤ Ô _ĆŽaìlbËâPx²îðţРnU?HïïJ#âáßå‰2ÿcÀ›Ï²&¬Óy+Öëøp‰*Hv_ a”°<ŠöFOçå¥w½VU¤xÑ\fOóL†­Ù!íØ ®žš¾è}úÕæ²qL¦ï}¯ãr]©ðÐLpîZÇðpóÚ «ÄýÔñ¶Sjh_ @ØCòbÞÈÖ)É3°w YM 'Ê_ZVêì„eïÒ¾;dßä0 â8!9qôüŽˆ9…šñš¹ì»ÁØ[‡ ŽðM C4ª²IL›”Í ŸSVþ¶ïÈTHaªö’êáG¶e߸õú/ç±»1ÜÉÆEX9ñ¸oŽ×UkÁÜQÂߢ.Añ¸«è?Eñ°û¸SÏmmùðsÌ`x_ ”J‹¿(°Îâ„€ƒ¸\¹§:ù×p]6 µJœÓMÕ•½´:ÔH¥Ï!¼D~„ilù"ÐbfêKV è$û´Ôr’º«¡gÓ„L¦¿—Ö‰ÓÙÞæ[îǽœÄ j*ñbŸF~¤œ&uíÉöey¬ ÀçÛ³âƒu™)ìS,~ýì3 ¼"ÿ¼YR—&Üà“U“»NÿŠANžœdRnƒNäll 4ÞÇd#ûé$çè\ó±ÄT¤áù?½¯[ãã7¯{4C’u°08‘Kç^5d.Ì[›ùë³Ñ%q…<û£ÎLzè©©ÙðøSô¹'¸è`ÇÔ΀7÷[åãO4ëÔÜ iKÀIÏDí UTV÷æð†*Ä<Ôq芩›×$EåçÇrD+u{žúÓOã 8ÎÛ<°ý´–ÿ•y¿¸Øê•]Òè¤wê½åp+ž];TeQüŽ6Sž0rÿ·»Q—)Phëø8M€)s \G$¤SoÝ: ßÍüøÕ¹   ÓÇÍ'{Í}<Êw––ÚdŽA‹_vlÑŨ4û¢ý-Ýÿç–èPf‘2ÊCÎ.ÊZc;÷³ “ÝŸYtÏ_Áâ$¾%àGxn°àйv8öÚ _ùä|;«ÁsÌ$)r&wõñ–ióSäÙë_| 9‹àÖ"Ð%ÇôZêÕ´Ÿ6Ó¿¨®%ý¾_N³öðÅ kÌöú˜>ìkMJŒÒ–Xâý÷µþð•`Œ O0ˆ1:œ¨…6hïBU ¹l1|åèýLú4¾‹4¾œaÇrœžZ¢—àföëϪg›áÓÀl´ ˆ…@¨1dëÖQž1ä–È|cn†Ún[ Ÿ:Bܬ!ýŒDºhôÐU:,éaf}c±âwuû.cm. b³ä434+úEú ë«é§ QA}¤w…zÇNA~&/ν¼› Q+ÓÌû›ÇOǵÄf6“ge§Iç ž£1h½sWz§9–&ÄBlš$q¥˜ëúÜêÍ$iƶO°öÒñÚ>œ¿Ðãã\ª‹*ÈŠŒ¢ú²&ÂryNª®|²í@8ïCzšØÔÒ[ó‡ü“ô3þ Ñ`µÙšÙ ¢ë¬ø}Ñ-SÚ•òH¶O4¯gùÅV3ç>g×¾‡ØØžMµ“ù d:§Ú®Rvè±¼€Ÿí…÷ÁDº2”ÄPêbeY0÷ý¾#¥`©¬4ˆ28 7f±î~½¦ì#ù¬^(êmíb¢î ¸°òçfëP s?æ<)ËíÊ¿2Ny¼‘8P¿|Ä8LOwTÊŸdÀܦäñcñæÝÐ|>÷'”žˆï,¾Œ–Õ“÷Øä6ÅtwL8î>šµRŠ¢1â­šhÁ:< ûssnæôÝHJÑRYm Õ—Ë;ëÆê)Í*À]¡Lû;tá8 ðý‡9üû{“\KspsTî‰÷O§s™ŠïôLòÃg„WW\1š<:õRæÏmE)Ï}¥-¨ÀUú>– •eÊ­v<×ê±¥?â·a`_k¶г½Ýðí¤ ,“g˜",×µf=þªü³é ’ŒG³x‘ÜuZ)ûYit´ËŸÂ…'´NåO¾ò•’5áöã›üêq§I™Ù“9|-séoeæ;x~ýŠiw© §ûO߃»$ â–6ÂÔßHÊÔÎtfmo³‹k¸êù®wÑubEIbäO7G *Xc˾sÙ¦Zˆ2“8™Œ|/*ü6g毛$±  -?Ñîy ¬pª›EO€‰ÑAÁ)à7ª^Œ#5 ÕÊÕä5±¬q<»¼¥&«Ü[áF~¨ý‚{äõ±¬±¢Sµ4׌€äÖ-z~üªœJ UŽþµjÙHíÊÜ`áÖ<ã×ÉÜM¬ 9ëe¤dœ»¤­(‡ÖüûòúÙýùâ@À‡{å¹òÙóz4÷m2p‘a'¾p}Oñ×›n$¯©Ý_¡ mÌËo5V,?2*P‰”j³ž¼Îvx”¿êN—Z…â[t2±‘ú©ž'¯»lˆw8Öž’iÑØÿ»,>æ~Uef9ª• °¯÷þóä].-¯©BzÈ^UËÖNM wTݼ¢å¸{.J/êÜÿïÎ…Ã8¨Îwk¶4‡ü¿Yqfr¿5ÄvÕZÆÏÚög¾±LÅ£«S&wkRYã4§#7_'ÿ§öâôо¡(an5cÚŒŸ>íÓù»öîÙýÇí×~ݽgÊÿVS[Ûêd'É¢–Í(kùÿCüº0É[’æÂ%¥½dÈû>žXÒg!ÁÆ@ à’qÈèXñ×ÿá>ÝÞÙ_ì¥/$ˆÃ㢖ճ>þúXƒwoOìÞ»og_Ccs©‡S`]ScCßÎ}{w]úøáÿ~ýúõýíë÷?ôŸsźw:geomview-1.9.5/data/geom/textured/grid.pgm.gz0000644000175000017500000000113612310110173016034 00000000000000‹–dKFgrid.pgmíš¿J#Q…·ÎSìH„€½ØÛ,ú¢½«ûVÆ-7Š–qkeWL·¦0j¥lR¬‚ …J²â’Ù{¦ú}¸…Ý9Ò|îWÌ\î/33Y)•GÇ>¦_i´R)}@–²,»ÙMd¥VBu~" Œ$M 3.TŽd^Ä~ûí·ß~û‹ð/!ÍDAþ$rÎÒuB§ ƒD¬kéMtêB‘ìgNá¹Aéƒ<'òÂÒkBO Z¨AWä{¡n$=ï?ûí·ß~û‹òï"švžAt¶Ý²ôЈæŸv¿´ô!:‡B‘üöôQ|ösM; ·ºþ,éú_ƒèúw"С£»6kFÒöþ³ß~ûí·Xý-D–^AtØ>°ô7¡;-tÁ©Hü´=‹äÒÓOñ©#ºnO W¶XºKèDó×I?µtüiãN$ÇÞöÛo¿ýöåï#ƒ7HdÀRö½‡üi§à, ½HÑØÚaIsë ˆ®äªZzšÐJ$ÛÞöÛo¿ýÃëAôÝNDo²š,éOúˆü+|ÒÒ³èÌME²ìÓß™@¾ë³!½6=b©£g; ºÿÖ"˜ÕÒ_ÐYš‹¤æýo¿ýöÛoQþqdSçˆÎ¿Kz$Б5‚|ØZDçs>’EòÍÓ‡SF64ÿƒhþgéLó?ˆî¿¯LåÃ:ùH6IÕûß~ûí·xýóˆ>Òèè#é6Kzÿq ¢÷Ûä–jèäÓN5’-ŸþÎ?n¡H@geomview-1.9.5/data/geom/textured/rabbits.ppm.gz0000644000175000017500000024000412310110173016545 00000000000000‹X®14ý›ɶ&Œf•XJIIAÉ Æbf&»Ì m¦"3wÛm..CÃî}Ι33ß<÷þÉéù®]­’…±Öz!2båᮤkYÖì½µÕ×®Z×7VïYÇf§¦¬[÷.߸Ögm\þå—[î×ܺ~=Ùìì±ÚmɶÎΤeÙEÇ¡›XyÇñÃÕ,×É{N%çUÝ\!ç”*[kèKÅ*n‡¨¤(®|EÂJÚÀ‘€–9}‚$YA‚¢¦`ãR¨‰ÜîÀÃ=ätpì>7*%$O€DA&̺úV),"™BÁ†Àƒ‡&%.&6’¨Àëb–½ ˆ)$UY•PWånU™¨â¹¼ÞcÐ —NB:æÐmd¦@fÔKÅŠ„û=¼T%g:Ôi-TÀÙ†rµI©“£º|¬†u8ä¹’Ñ/kÓ*#¨¤œŒ]1øvU”+€yx"¯¶¹Ã:0j'¤]Sº)ìÒP‡¡”5hÄÁÓp‡IlÚañ~mãBãÆ|áØœd6?œÓœ1jŽ®iUßîm !–é–Ë~ï8™˜ÖrÝpT¯Í6Êž_ÓŽžlÎ×ýšÑÙîÕÊ%«hE»c±~æd½«^ÀMmRÞNèX)P­æØž©Ú-ù†ïÔ{ã'{úúªÄ7A‡ç7|ŒTËÖº F³h7ê^G^ïëô:‹šå«–¡ê€ Ù`À‚=&éTQSÅe„›wÒÉÆ_F–frdBÇ]YУÁ^Øt˜¨E^e™W2,7 ÜKHQ].šöµ!“%V¡jg%’ʺ@¶²YœÎÒ¸PB¸(#-£€¤$QE5+i:„ªäbXðèPA©è]n 2’Ó&Ëêá^z¼B»‰2X!½ÕSAÍe2@I7$=¶Ú›·û}<âã¾ ë"cyÜî‚Î",ÀF"g‚¢Š*2H6%%Kíp@“")¾(øjÖÅB‡‰F(é$¨MSêæ(ò4˜ÓH]ÃM4m¹ßÕ&jtÐÃÝˆÖ R˜%!ŒUl¸ª %¡HDÖu仨0U *2”¡¡jŽ3Ø6tGÓÓ¤SÕÐU°ÂSdI6mªc”Ž¥‘€‰@$¤Ã265[Ó-D½Ša»†¯›eÇš]PËÏ7\Y%ª…ý<­8jÓ×jñE1¯P#«ú î4Èù~ûÌ`a¦Yê’ŒºmŒ¸ú°Cû5µÇD½ž*ãu|ªÇ¾=]»4P8Ûë›°¯ŽåÎtæÏwŽ4½)ß\èp : ÎщʃÓ‡ŠU 1` `•¨)PÍB9 ¨¤ŽwY]G“B8ËÄÓÙN´Š©¸¥“‰”±•¡Ä/B ¨l̃ñDmH©%"=#˱,Žˆ8&É(%e*fTA€f± Rd"fä8Ȇ3ˆÁDReùà jLD)EHˆb‹˜å²é–4IZR‘ÓB:!“$€­YSuA1dhìhØ¥H –€MqÕ Oks†…›\sL± ÄXp*‘®d€J4ª¬xKšiBÌ AH5ia¸6ÝV¯ZElÓ-– †é™VÝÕʦáZZ±Ï/µçdE²LÒ]¶›yÃ6¨“§–IKEg¾·Þf[–ov´y]Žë *AÈ%¤á¢É)ýĈ5\´†;ÍÉvûÈxýPi¢Ãšîµæ†¹!olÐi+õ¸ê€AËTó,Ú^!S5:]§G:íź7XRë.éi˜£Ãîl¿3ßáNÏ”—gëËU«Ë•óT®j¥Œ †!bƒ–S|šˆQKËïôhÅÇÅâáL,$F¸x+M´òÙLF”d> cáL*Ì i€)ËFTÕ—Á¸ "jDTÓiM‚¸#¢ã‘l4–ˆGb±P2R¤(‚¼(óé4ŸÎ&À‹HY5(@VNK Âˆ H‚­ˆíhWÅ<{ z— ñUê@d 8/ã6ƒô{´ÍÓü<‹„Î0ÒÄT)I#AQ€ˆ£3.–‰b(–ch.‹³Â¢ïXúôlma¢Þ™g±ÀÝž1PÀMöuÚtÔ’ccM=G±&)E¦KM_õMT&°iIÓmàì´9X"Õ¢6ØcÍöäg,¯Ã¤£U­O£DÁMWmwP͆W PUIɤݾєi=ƒ}Iµ4d@¢B] ""H’¦†‡Jv·gw•µnÇmÚF›C§jÎxÞiȰ¤ÈM,·h²l_˜i®åýŒJø”CNf•+‡äD%šÕ±ÚN53­¤¢™h,¥¢\¢…‹¶¶ð±Pœ¤²1‡“IžÏP¨‚•è ïd@…4Nµ.‰c¢,HiQɲÒfÐGäL„Gy>®ðq1šJD^̈BZ’3<”¢D”QZÎ$3é¤ É²fcU…À‚ІP’UlRdLdh}%ËV±¤"§`:iwŸ6Úm5ŠlˆèPÝ®Ö iA € IVÄbFJIٔͲS%+9+«ª¡˜m‘ã-r¢%K|EÇ#CmvÓeé¡ôõî¼Ù—7*ɹ¨ÂÒ&§V-T0PA¥–Œr.¬•T×БåâI.«+RSÁ #g9AŒ§áXœKÉœ,sb6-I22$bBY¥†äŸ¢³¢˜ÊòQ!™åDVNKÔU †¼;T5}ðžU2¤aCG–NMª²<—#N f‚ƒ•~˜!GHŽ· Ñx6ËDbR(¡DÂRœËD‰x<™ŒC>¡fZE)žµ(pTjBj¨ÔóhÙVó:ÑuMgáÓ©«S‡R›Õ~V@’„M("!DÉÈf\(Z€ã¢¡k=es²aOûùtʺZª•Dƒ}Â8‚!€UÌÓÎuÊž­ÕÕ­SÓЊ¶Ñði›KóÍ[,X¨£Jûª´ª,± &ö âBšÇ°«däý¦‰ìÁ˜¡«ó´ƒ! Â+$¤È­Èft‘I&%ÉIB«˜GÀ‘“¤˜"G9 äRŒžÊ+JX‘Bd°Ž¨KÙËÂ.‡ú •³˜©,_‘+*ª;¸nãŠK<ÔE¯ŒØC–¡œF ™ð†Œ˜ 9Ë`12à|›zgD;ÙA{d!PpÀx¨y¬ÖeIyIdeÍDcRŸÁ?ÃXÏÖ)U$ò²$"ƒ¬p\]3)eXÁ8‰VFÊB†ËF[a¬…´„pK$C0Ɖ‘ Ei*®¶„øX$.ÄD!)gâPl/Yžê䨧Â,ˆy‡–\Õg‘Õ˜gÑ,ÛÀDÅ ÓVQc&BÒ1KK¦±èBÉ2‹¾î:ÌžäscõZ7 qG¾ÍöP„uHY12`”©žÓ ã/–Œ®m|·d@É@ViFõ0yµf¨ŒŠÄÉ)el¢ -G5jŒ²jJÝ>r "ÈSäbjÄJ1Œ“s†Þã™UC-QÜeÑ^ôwØ#¥&uêŽÑcêm–Ö]7»fOÑèÆ´›jÞ֮ªŽË@Åí*îa|ä`–NU‚}u¾aïtOÔÜ×飰@’óMx·½0Oý’Œ-Yt±X¦ n€<ómY¬ëxªŽOwãÉ"lS!£•&Lÿû`ÆÃ 1Æ -žÈðEDƒˆd’Q ¨6Ö M+{´ÝU‹q cQŒE‘ýGmB(Á˜²¿š‘³LØR¥µk¶™3‚qbÚ•ê<ƒ„”¤$Ô‰]ptjx¶Ú¬X¾­±×clçRÖmË0)4MX×™“ é°ÚtdËÀf¯ÄteF¸Â,i-µb°Ø  è¢êZAÓ›¦9f;Ó¦3á8¦ÑíêØ)dÔá¢v¨Ó­¹‡ûü‹ÝùCUóP¿}zÀ=ÖãžésOuZ‹mt©CŸmäçþR»{¶Ë»Ö4ŽÕ´Cîánw¤F:<^ÏOWܱ‚>YÌMz椇]ÏûhVƒD8”ÏÀ‚ ªi`'å)*Íj`ºNªãz0ã‚Sy¼láIöXÊ„‘³E7+·°ü'B¡¥5ã2L9³œêoØÇ;ë]À,‹¨ÆØ0X9gI%¦0êŒq‚B$91fØ bQœÃH”‘¬n‘#!¦¥dÕT…ŒhI¤b©L(+FyæòZCéL+åCR2’âcs¯Ñ–ÏñR\@€r )U©,Jét†©Š`1w¯Š,JYý«HÇ€t­@´‘fþT—·Ð᜚ñW•Ö5¯-^?ÕvûxuýBááåæÓ«=.u¬^l»sºëþ…λ—:î­Þ9åßüÅ[»äÝ:“¿²œpyà契gºž^éy|¡ëÉùæ««C// ¼8×ÿüôèÓó#÷—:×½£¹[‹¥Û‡;/Ž·Ÿ_Ì]žóOMU.ê;?^;Ú•;Öë²µÙÇÇ‹‹Þ…9ïÌ ujÂ:6ä-‹“¾1U'C6©ÈJSs5`=›µùŒ+gÚ5¹‡Ê!Ó ¥aªŒYhP#=Y4„³SŽ0ã¡~V \’e'ŽÝ.„³N*ãKòÏ#S%;"+‘¨#fÚâdi& “-<?±’¦Md’ ûÎXáòáʵ37›=S:4(QjØ±Ú O" Ðå)4Sr6£É) òIYaüm@•2¢ñt’•mB†XV,aºì1ˆÉEi zÚ­ùN³Ni" ™ÕöuäQ$ÄlJÒ¥Y‡í…`N¦»¬uõy=ÝÕ|)׃µ*ä u±‚çÚáÙÙÜícÝjµqjÍô£ÝΙÑÊ¥Iÿ€=áXSec±ªn7Tœ)ƒ2>ÕíëÔ–h®—ûÍSý…åžòÉ>÷\›uº¡4ïœ/^™«ž­Ü[®ß:T;>ž?;Y¼¬M4Í6ßê,š½–9’·f:œå1÷ø¸·ØgM¶¹ãmÖd§1Ý¥.uÒ“½ÞÉvãh•ÌúxÊÂC&î1pŸ‡ ‚¸; q¡ÄËF\È‹Ùn@ñ¬‡Žz䨗|pØÇK9ëÐiƒæ€X6³]žÜeâNç‰\WAY–s2è„°Ža;‚mö8  b ÒlŠÕFšOb9É”["GÄÛ>®Üj»Ð›»½Ô>ïW´$ µ$£Y1«S‰>¡ˆ,¦‰%`4ZcÙÓÆQãÖæ"ÙHBNf³Q]Š(ÍÄã‘(Û†ª&$˜;cì.(‰L:&·Æd.™¥¤cŸy¥„"Çj6m$ÅlT sb²UB‰˜'‹}«Ë2-&s5l2iDik}Ô˜ôüÝfìyd$wb&·ÕéM·ùcL&µmF³¤ù6­úfG^smÂ|âܸ6“¿7U<ÛD‡}5<â’Ðáº~¢¬¬ÂÙn×шG0éâYÏñôR0l)c9ÔoêyV+é¨*¦\ YQg1E EMR F[T…a)ÍeØ ‡Ì9G…xZÐP]qküàÕ¹ß.O¬o_»Ü~i¦ÞîzLs‡99’³aÓvÐdFOesHé ªÇKNL)ñâ”™9šK/[ÊQ /˜`HcRG)Tä:ª‚RG¨7¥¸¥›Hã™ôµ1—ŒØ`ÄQú‘2í£A‡)„ÐŒ!"„a“HI0ÛÆR\5X*@BRVeS„š(QQ$Ù¬N”‰.üüfÛ»•ž×7Û»×ÿÛÕÁõ…öc.Ñ0â@ad¨«€X0„%æb •@bBá%cn;˜Ø”Q«$§_+ì# •Ù0ˆ“ PW–t=RôÍ¢c8¶æššgS“+:ôp‚ —ͶfS±„ŠI­­V"kDCfKÒ=–ì% /#5ÒÉ. 6 F›¦w¸t¹f\*™³²ÖA”Á’v¦·xÒwÇ-<Ÿs‡¯¢ê¶D˜Ž¶ Ψ· ¶#2[²ùv¦61nG¸ÎòK”4”îÀ¸SÁ‘ËŠ8V'':ôn_:Z¹;P›wÕÀ1‰Ìf¸\Öóhº`01vcÊe°s$µ­~¡Ç9Ñ¡]¶î[WÌ[ãþA÷Ñ‚¹:Y½2hœªH‹¾6WP—‹úñ†v¼G»Ô«ëÕΗy_=Z4NÔCe|²“.'ºÕM y•I[í(þî´IY¥]&iæhAUM(×-ÐÏÒ ŒG›t¨Aª&-¨Ç Jó²4¥ìòhñí•­ïNv=ºÐöòzÏïOúßÞY24130u ]7 ³ª9&ŠÙÕ¤ÌK3+£•Çf G$ªˆ™˜¥‘1fy˜MÆ8Ïþ- X-)@g¶®ìväíÕê¦ÖÐeæµHG*FÝÐ)@F¥‰ªy¨u¸Kѧ*z¿«Öûä°Ì$¥… êá.p²“\¨ØšÚÅ®>ttª8U׎õ—+¥‰ŠQ¦Šo¢š­w°Bpˆ@#{Lµ¬A²¦d¢"h©¨“n"ç4Õ"(G”1NP8YÈ.×ЈC}Ñ,ÀRÖBLh€œ†ºtu’Ũj©™‡\¸X X(J‡ÚÀñ ½Ü­ßônMÊsÚÊ´v©ÈôpàaÙ˜ûT¬ÚEÉ€…m0ì(C†2¨£n PéÑŸW,!¤u¬T°BâËéª,i˜ÌbbÉ-#I°TÙ¢ @@) ¬øP%K@ð!LVËH6Q®_­þñúÌ_ïOýøýÊΣåµé׆_¨ß›Èå¦ñ µR4›=u‡ÚæOTÍHZ†:‚f2™×IWÎ(äLÏ5]×t\¯¯-בÏåsf>WÍw8Ý­#GÛ}£V4Ëecl<7Ó_ì¬Ðö2.—«®¡:^©«áVmjâDUíõ5†ºyËÒ =ïêNmLJF03ê1Mc~Ô§Ú $ª` –%¢…™¥Vʈ!R^HJkŠ„!Ê3Ì<RˆÕR¼Ä#DäiZ‘Ã)ª0Ì÷(\p‚.ÉG+¹ù¼1]t®æô1MË3;Ÿ…@}—tÔcâéú¥ýÒ@G xÙËʉvtª‰ïµnuÙ7:s³ÄXÄðBM=] c&èÒPgF¯µ)á² ÕrTØÇPËÝèÐA•‚wØA‚Ópe 4-\E¤’¦Fº ÒG%qJºúz"ì   €Ñž´H!Sƺˆì4*© ”Ÿ;Ôùåöä×õ±Ýýû/Ný‹ßœzwvôñ™ê…ÎzS6«¶>:Ü>Þ_h4î†65­šÊÔòmVw·ÙÙŸë±*9Yàš¯ç,»gÊïŸpò%Ãu‰á»í½f£h:Îå4®|^«”ì21ò†î††dV0¶N4æ)eJ‰±±ÆIžA-Sò¬ê&•)Ù‚³i+=*šbrQ T€ºUÓ×Õöº>’3J5£b©6A*ÓæÐ] ÓÌx º¢¨™ŒžQ\¼¨2»Ç0–ÁI…0OždTËhÐ&mšÜÐPM%,oó d¨zØÃÔŨÏ}&^Ê™c®ÚçãBh\g°Ÿ=\A—zÉùuÑQæ,yÉ"C3TÉØPqIm‹¹<*Aì©‘‚u‰ÉH©’…HîU`7€m)±)ÝXhK‚ Du×T©BdLÂÛX¶à(ÀP2Tª4L¥ÍD ‚Ò\(“æÑÑDAí_ºØuðæÈŸ¿ýúp|÷ÞäþÆìîýC?žÎn=Y=Þv­àç‹°³«Ð,ú–ëØ:cJݳT]Ñ-ƒê–j±ÃV!ÄXCšKtÃ&’n#G@¶ƒXZ®aÛŒd ¿˜óý¢U¶ŠN­/_í)Ú.sc,H-éÔÒp"‹T€óù,…JAÏPÌŒÔIDFY¢¦bgÞ—¡¼¨ÇKÝ<‚bTB¢’Ò­‚Eb2£´*°„RR4cB,&&¹DŠùñ(`:!‘À©V9Cbp[J%„xÄâHj­Q˜e”lZÓÌdi!•&)…„!HJšŸA)ÄÚ*hÙ`§i^ÉÍšùñ¼5ëK5÷hž9,÷p{ítS¿Üpg æ Ý†:TÐç½åœ;ÓãÏ—­aOc¢ýH9Ýo.åNL7.Ž—O޶ép&úÌKó¹©ÉÂdÓîðôɼ6]4f}u:o.æÕ†Ž{lÜÔ Ã¨F¾ r±Ñ L!bˆ™¦Æék§+?žýõaù_Ïoݟܾ߿½:øöôàÓåÇ×ûÞ¯t•²ÉBG˜¬÷±oÏöJyÓ3 ßÌ™¦©k¾o³bԱƑö8t¸GëW‹9Xô oû«·Åàq¦aÚž¯5Jºï'hÆžp0-­@˜¬*±"I r ¦“™TJáCb:Æ­\ˆãBQ.nMqœ’Í$Ä„ðÇG¹TˆKq­®%ÂqY.¢dC˜ã’q.ÊsÇ%ZB.–Mr ljq.çÒñ˜jR!!ʼn©Pk”K œk€¸H!‚+!Ä`’‹³Ç ?¥{".µÆ%I-Š‹Ú€GGêÆ`Ã7ÎÏ槺‹Ëýþl§{}&q rz.wb¬xdÀŸì,žËŸÍ çûó#½ZÅ¥5K­åýN×ìÕ3uŠíLªK££E·¯h2|®ÉLpkEÙ:.¸¸êâZç5Í¥þBÕhØjÑÄõªÑkÃÖ u»Z«çM×VÒù´tñdîÛà OO|}6÷õÑôîƒÉïï.}}|zï÷Åï÷gwWÆŽXN£¦kPeH4©RÍÑRÞÉYX¥ ¥„"•²›L+,FФ* Ä2PˆšQ4>Ë2^D̾*iLi1[+g0aDˆ¥ aÙR¨KI‰‹|LŠÄøT*aE“@‘¸o¡‰P8ÌÅÃ-ìH³#ıÆbŸàø–p(Nò)Úš“GEÚk˜0…@ÄA(3ÓE(!ŠÌª‚°’ )0D3J†}4Lè•5ÍÓ¨ *JHHä&êáH’ãR©„ÄGøx88 ˇ^ÂM§ÂÌ‹¦º)dò°¦«‰T±ªe“Š9¹¯îw¤¨‘²ith¨_ƒšV3È&ÐÂÔ6r®a9:kËOÖ kÈñæ»ÍÞ¢ÝÉdn\dB×Q±÷ó°)#S¬*X$È ÃNT–fˆg% \]ͱÇ0ÌJóǪÿ<ûú°ëãrï›ËÅO·š¿ß¨}¼ÕýæJû‡•á¿~›|¼8\ˆc@q&žJðrŒ²’¾v ‚ãÀ˜ìßeæ± ÁÄ5˜Ébè 1 ŒÇDQPbˆ`J±40PF’ÒiQ–¬¤‘"#öME ó©ß '“ÉXJPÂb&–àâ‹oˆ …¸èÏŸ¡ôÿ{ƒgƒK(iNâ’Bš–Ž›yT6©XŒØc굯 6 ,ƒ“»ºëšŸ×¨ަ"]5±a[cv‚}Ë®›f•'þ˜Íñ4â3夕½Q˜aˆ³¤jáÙû&B).&ø–îPæˆeRö^¹jÁ· {Ó7MWËUê“ÃþPÁ,4JLªŽæV=Ïòœ‚ãÖ<ö(ýxwfçÖÔ£Cö‡Õñ÷ο¿Ð{RSÃQ…}¶P\‰¥R<ã¸Â>¿$ªéiȬ„C±4» ZΙs†Û%µ0‚qVBé8MKrHP[¡¯A7%8-¢×":)ÑO‰/Q>e+‘¼]xÕaHf\C@HR„¦ØI‰¥“I ´ a‘Ž'|™*ò™ÈÊŒ&`RI °¿ @c¬àŒ@Æ}Œp¡¦‹\ƒx8˜„±æa’Å ò°¡b=XÇEU‘ã"K¹xráT"Ä—nŒSà 1–X”ã!F R©@Žð©Ÿµ›Ù0àb@SŽŒÅÓ¡4#JH32ZmˆÌ 3#,„Ë>ƈ@PZxv;ÆeC±(c•(ǰ"–âd1še ’eHÅÛ”9¦’ëÇžÉ.“ Žp<ˆK µð ’R8)`XUÃC+b±“P8¥…yµ%f¦T´‹iJcG(F¸ha¹‘¹4Žð8Ì‹\D #fÏͶ㰃T Ú„9,C ‘¬®úUG-ê¶íè†FLæsm¨Áøg[4 ¦20“ƒ050a¬Àð˜iù˜Â $ÙÀZœS¡˜R•I@ª9„ÙÆ÷ì}Øàg$ÄÀ1f“ˆ]4*9— ¨ªšOmIÕÊ‚§AÇz F P ~µáEO¶œq]öb,ÙÊ ²{€–LíP 0ÉŒƒšL%— Z)kÓ#µ£ãærVDZΡ‡×«/owþïíËÿýáòß—¿­MmÞu¹ÿþ/Oo4ÎÚ.l‘£œ,%2Rµr±Ÿ@š 1²àâ .NVÔ×;wVGwî÷ö¿?^Þ°¼½:öùÞìÓQ·úK‚l iÀI"-ÉTP³1… +-1˘-+jÊIfâ°`pâbzBrb "Z\Ñâ ‰0$dC©(ó\¡4ÛbX8FÜi&>"\<ÝÂTiIó-üϹ…S†±pZà•LZ öð‚”…h<Ík‡xÁ$ŽpŠÂ)bHaRJªJTaâ Ê8+Ž E HDÁ:Æa—Y Œ™ÏfìªÈ¬ÆƒÕ#鸒ˆ#9!Q©, †H•U”ebŸ½0Hµ Q˜í‚ð1¦ZVIAŠF8¼br@Kbœ•aVVe# 6EøDÑzd‚y~ÌòL l<›.U\4žS'uyZ“Û-˜ƒÁ¬Ú\›tó—âÿ³w÷Ç“Åý‹»kËŸÖ&¾<~q¢ëñI÷֡Ƙì&R$,{ V[Lݵð- óHB£=ðù³Ñÿ|vÿñ¹½õ…Ý•CŸoÚ»?ùõñÌ¿~;ºûøøæýãŸþÇöÙÿxs¦/š4²Š˜Ž2>•ÂVÓ‘H$Ç,^*¼tšËjDRPj‘p‚8$|3›$¨˜!n,™b,H€t„ËíÄhDni qÁDD<Ô s-,ñX†ÃÉXK¤…cŽ6®"k†^²LÃQD”…™¦$cÊL«†õºj• Çb¤37YÎcßÄ–Y5;ŽY®Um]ÏùN©BÛó´îÓZŽúD%L#™˜93 3e…ÓB°|ON£`=¿©WzÅf’œŒtçNø³]Í6ר眺j&îðp“Y`Œó*ì•2ÝMzdX'}%z² Κ`ƒÃ¨CØÔH'S>Ñô50¬üQ £®’.Oà™Šz±¨ ÖÉé~§Ò’FlCÍô#³Î×£¿¾qð`iïÁÌΓc;ÏN<˜ùëÉÜÖÊðýc…µY¯ QYø¨ ñÆì­ápk:Ó*öu—÷†ÿýèôÎÊÒæõ¶Í;cïN]]üt¯gÿÉù½ùÕñÍ;S»wz?ž©»  2²JÉB,•l ‡‰X\ ÇQ,Ád^"ÎtEDŠ'ÄT0[+$â")³„ia T%Ê’<Ò­É–`1Vª…AG"3!…ƒÜÖÝý n"eõ©Q‰¥ «îp8 ‰͔¡3E–eé¤0›À‹ èÈHÌL»24d¹ a™ˆÃ:ê²p§F»\µ¡«†@*–D`&è€K—JÚ¬­ç¬3LU$â`k‚¤+ªšŽsH®˜—«Þù6ÿPÍZnhËåü„átzxÀ·æóúqŸN:Ú‚e$Zãa=­6àe+–µœ"ⱘBRC¤`€º®TŒL ëwºJ)Tò8Ó´@CcæNe…lBèP„dbÅ…V^lÿbê?ßžü~q÷Îô—Õ±oOÎo><÷ùÙÄ—k£tÞªžòsÔÊ„x„Ã|$”&²0Öã¼Ù`Ø{qÿñìæJcóöЇ­{߯޼]Þ]Ÿg±þrüà÷>êÉÄT9›JÆRq>OÇâr"†Ò1À“ê0Î ¹ElMÈ‚LÉE" ¬9‡ DÒ!‡p È)” V2ò¡p: â£e>OÇCJ¸E µŸæBñ´¼Œ’"FD€&i©@H¿kÍ_éË+èÃŽfjzEE#&8Z¡çJε!÷zwùx»z{”>rŸÚ÷Ǭ«ƒ¹ 5}¶BõkçÚCÚ‹ÓôùiýÁ¼½”·˜²òt x¨Ý¸ÐïÿÒf\ìòO–½¹’viؽ3fß™+­Ÿ©¬.Nôë·gŒóuc¦GŠæÅÁòõ¦~y\»3kwá°®ŒQ¥OK#îç²–‚ÆKj ‚DFkj+)Q̾” ‘õ,‚)‘¡™*ŠH4Ñ™´!ñ¨µ•å:DRJ>:f<¹Ô¶ÿhòë‹£{mm,}º9úâôàÛkÍÕÑýÇ3Nt]êÈYLÀKJ<Ágâ±Ö(¯FÀxC{r·ëËí±Í{;ëã{wV'ö×÷oõîÝí`°¼½1¾wkhw½gó^} c- Ò)æËdÙDB²" B:AÓYɰøfZâIV¶1fÆã8…B“œlq0°$!жò,‚ìˆqL¶´„Ã!þÿ_°ÉpKˆ•mkH@€˜yV1 \ƒ¡$Mr¤‹ž¶®UìyÜ îÐá„f(žöµ¥ª~´ªNXêɉgÈÕ6m9gŽ"£!%]Ì'X剼v(‡<^W0«w)+¥³™¦FT¼…`-±?bZžšÉ¹ÏTG©r¬“^lzí–:쩃6¬S±¬í5¨ÙŠÑmà†TA±´’ÃB€0 ¦í瓈'vÅ‚ƒ˜À$·Ì ‹©÷lZ•¢B„©ë¤SP©LUbkPäe˜ ª†ŒT9> ŸÞ`*héßÏî¬Ïï®Mì=ßy5¾·>µ³:öõÑôÛ‹cçÚÝ#e·–Õ#œoMÔŠøâ¡êË•¡ûó[«óìYLDí=œÚ{гw·º÷xhÿñðÁË‘ïÏOüõjêàé𢉠p¡X:žâã|„1!sOqšŒ Á¶æøbÙÀÄ%”hT ”{”$§I$QJJ+H„„–P„1)c[ƪ\$ÝÒ·rÙp«ޤÂ%JGZ2©´L(4™˜ÍŠ/¦9Q’˜ø„yO•ðÕnóJÙ]òÕ ØÚ„E•å¼6“Óæ ´ßÀƒsÈ’‡Î6¤ËMt®Nú5jµ¬š=ž÷Èñ¢µXõ ÛÁÜÀ÷åŒSeºìisEópMobܤ¤ÓÄÞ)’ãmj‡†{}ú²Öûá^×çµVõ;ëc;GöíÝïÙ[8¸;øÇý©¿^M~}8p¼˜ó ‘DŠed¼5’hÇc©D+LªDÄT‹‹ˆ1–ªÑD‚1i°Ù0ËGp* £ÌìF„Nˆ´¤Â-<Ç%~ž¯I±\K’ ‰­\†ã"QñP4ÌE‘•´ÄÇ mȾ‘–¢†PÙU‡óÚ\^ë5u“ P£²5Å×½êŠÐÕƒŠšF‹”‘)A­Ì†’ ¦Ÿ(…Ì3ëÁPQŒÈrB°u¦©pIÞ=«*bEC!0 ð PÍÕÄ6–È •á,“È˪"‹ ^H¥PgZSÑÀâ(8.ÔÚf!NF•HRŒ…3‘P<NF9!£„¨$DqBÂaÈÒ^ÀÀ¡¤ËÀíôúlÝ[,jÃf8™G«¿ÿõáèÞã™/wú?\ëùýÊà—_ú>Üîÿr¯ëÝݶ7‡?­??Ý}­¿~¥§ðàN}ëÙñ­µ™µé­»ã[÷FwVg?ßÿp»kkc|{ctczïÁÜÞ“…?^þöxæÒˆ—g>›Ë²He#$އZ#-@†=Š˜©x’ã¢YNŒ‡²\,‰$¡$38 F¼„#'¬«T¨‚lSñmÕÀ dÁaŸTmÒ–§5WÏk´ÛGƒ µ³Fëh¦Ì·¦y‚Ó¬))"v#“‘¥h&Ép?çiÑL&„!‘k#œÈ2-IÉ-jº…gŸAH+>ËÅ#ɸgÏ %b‘{L<˜yHÆBJ,â‘LºERZ2R‹kIFBÑTˆ¡ÓÏlL r†¡O4‘İ’ä–Íq‰gÄH0áÐaäÆlG†½~$œe %ZZ¢‘Öl"ØÇœM·FxfÜBlXR™pFf6Á‘ªò-µì«U”  bÁ±ºzlP»ÔIÏušW{ü[ãÞå§ß†6yžšÓvŸŒüuñÓÅÞO÷ú>­÷¿»×óemäÇ‹“ßysyòý­é׿Œ¼8Óþälߋ˽{¦¾=™ØºÞóá—âæÝòöÚÞÝñ¿ß{¸p²jW q ÆÓÃŽŠ mj–,¤*RÉ#mÊ>pvè¤H´²¡Ö]X¤°æ¢î†ÚÈÁZ…Ô|µf‚Δ´é’QÖ5×5Ú›ZG!XNæ %ÀÐX¥`GW]5˜Ýe˜e âä8'·°9ƒâ‹N2É2K&Bé¡À­³#Ñ€.™ˆf™­J2_ÜÒ¡t2 o,Ì寢©8;ZƒÜ E™“…‘8ä0‘`BÌÄ).»¢† ••„Ì“Š©*!¤„T1Š…8ƒdãÁÆ2ɨ‹³ÜÈÆ[¢ñp2Þ‹„Ä©)fét‚I…¤1Í@+•Öø0‘dªSVLT,’Ùn<]FS5{©Ë›,é¥,bÚ@Ëf›5úø~ï_/|¿7ÿåöÐËãë“öƒ+Í­õéÏ–¿<:ÿéÖ¡÷·§?ÜøxwôËÆì&cáû“{/æö[Ú¾5ùë™ÞSõ'§ À÷žÎ}½îû“£?Ïþx>±³Ò}±ÃhS‰¬S…jFV„`Û {7 ˜u‘TÐIÃ&U WK¨lëÇ\Ue~¤¨’<@º 0|3Y¤ °U¥ª?8Õ'i¥€G+˜¢‘ 9S‚%d 9[§h4Oú˜2Ö‚En„*Ê$)cÄ(¢$y(G ‰@–¤´$F%¦9iZqmÅ(*Z*¤'ÉÓ4q%ÆIæîãr2ŽÃ ™¹¶lJq D³8Ì Uy¤D± ¶”J`ŽÈ ¦P: Ù§T°Ó·(„—ŸÁ)$d™= LKñt:ÎGãJ<޲q™D Ë ,*!…ý @¶¢»Î›vS0dƒQ‹tÕ¢¨¢‘1Wë7µ ¤¦JLá,Ûi)‘° ´0@ßßmüñûø—©W†?Þúxsü÷o. ½½Ùûézßç[CÛ÷ÆöÖæÌí>a~gÿîøî­Á­ùÏ÷æß]Ÿ|smìÃæÎ­öÝõ©ƒû“ûëCßý~±ÞÕlF4°°ý)Šœ–Ò1 ÇÒJŒ™^E)ÆÛtPDÐeVNÆF,Ø«ÐíÀ“”U\³aI5tø ;‡Ë|ØßF†J¸b@ËB†Ž4ë,‚ºlØê1£!ŠgÀ6”ö[ÈÛ¸ªã²EØ¿b Ûºèá¬OEÕ–‰aâ8‡™¤ ¦RÓ¥ˆq Þ¬·ŽÁT “â9…é9Äì3R@àä Š„ì RÓ,¬²™˜Q•$ˆÆ‚--E¬Zª*‰$›RÒYIæ$`žNàCYIRDA!r6¡°Æ’å³,ª¢Ü%)=XÔÑ„‹–+ø|{´=ßã©ceÜð1A2–“r:Æ'á$#‚l<"Kiy¨©­ž¬±ðíÞ>¼}çÈ»«Ão.ulÞkì­w|ºÓµ¹>»½1¿û`éàÉÂþÆÀû˕ֶ߮žo?™ýý|ßËcµ×{·6†¿¾:ôýÕ±¯g¿?[8x4õ¯ß§·ïv<7)‘İ&We¤2r&cÙ¢iIDb&_±¡Ø4áBAp £ ¦dÓ3¨Ó&&*ÑÓEEꢔéÏ<l9ëa˜ÃHW$IÅ#1.’ Ų-¡4+·d‹šlɆc).–Â<Ʀ,“¦…UfCÅT-2TJ%[Ù¢þqYd3"Ê9 ÓÌsÄ­­8ž‚ÄfrºÁ%XË ²ga–†¦ÙšaØŽæùšãÐ|…–JFÁ±«õÜäDîê²snÌZhW ¹§†Ü±’1Þ®]™óÖK·‹WûógúÊK½þÙaú˰qiÈ85l.¶»c¾q´Ç?ÒîŽçü™¢7äÁùš¶ÜAOÌånÏV®äÏŽ»¦òwÊ7Ù=î)ýx/èõ¥Þ(Qö½`*‘M…øtËÿel,,g³Š*É3ƒÞó×so—~¬M~øeúõõñ‡×úŸ]ï}s®ëñ¹ú«•‰—wÖæ·Öú?Ýzs­ÿÍ™—{wŸLï<>ùeutç^ó`càÇã©O–þõòè¿^ÿþêЧÕþ{ýÞ‚¦ê5+Ý-Ζ݊¢¦9VÙl&,nÈÊ’Û-`³•L T:¨P)Ûî¢EWTˆ),Ì‚¦Û\\4AÙ‚uƒ/0ØKpBkÐÁ# 0$~ÑVŽ©´ ‰I±[ žgè¶F˜Á4G¬|°Î…E³È2mɪ;ØÓ’‰n‰H ^„HömÐa›uݶ‰¡QÍÒ)ÓÕ5¢6m½®k +6éõÜ~ßô>—4²õã]Î\Ý›­;ÇÚãuk:G™ëémš‡'Šg' '§¼¥«/GÛ=u¢jŒ5VwýE½'OFú¡Z~È6º ú@—=;lN7´îœÚWÒF*´¿` –œ±ª5â‘O4iŸIPæ=µâj0Å=Ãj,8ø“|/†a:NŠ:96D~»3òÏ›‹{–?]úõxïï§>ý2ýèhûË[ý_ŸbÌûãÕÉm,î¬öï¿Yøútzgeôã­ÎOw»vïOí?]úñlö' ߟúþ`îàÑøöÊèë_zoÎÚ—+àz}uľ9nŸ¬ºí$Ð8ñV9œlŒÇPñ14eADÌ\Bf2½* B;EEÔÞ„Š¢ôèhØ¢"nHÒd‡âȨ%çÂÁÊB†á$èx4è`ÅXÒfÄàÄ¢Ì?*&BúÏSä.ŶÊtªÛA=‚@ÆÁ)uc¦˜Ñ1ÒunÄ>ÓæÍ˜ÖHEh£]æò v²ï³&ªÖpI;>džò/ÌÚgF….ãÌŒsoÙÙ˜ô×ç½µ£ÎúÑÜ¥^a ¢‡ëì²i¯£6ˆ^ÐiµHÛ‹FY£%J-…Ú„á*-ZBš‘}D*©RÜiÒfÎn¯ù= »¯FGÚõáª9\Ò»ó¤d*Ef¸R œfê:ã©P&ËKb@¢Ö¬“δå3W/uýøíØŸí=_Þ}}dûÑäö³‰Ï7‡?ž/í­wWûvž-ÿõêì·µ¥/«3[k»«c{«S³_×–ö×çöMðíåô¿^þë·#?ž/|8?úêôèæêìÁjsûN×þ£Ù?ž/î?ß¹?µwwz÷ÞäöÊüæ½éƒÕéÝÙíÇ3Û÷'¶ï ¾»2ðêÆÀÓ_:î®ÞœÌ_óN9fGÐ PYê­‘™¢ÖFHb7 k è@1Ì©P©b%—U¨¬´hˆéEÍ«ÈÊVƒL-5PÃ'í&¯OU=2pÖ2€HPUDª>V\Ì*˜Œæñ\^^®ÚKEkº© åI»ÎĤQ.iõNÛ3©CpÓÑ}M.Úª)±BÌ&³ñD ±UUÕqÑFuhj§Fzh'JÝDÃ/Õ%†<¾1¨ªv2+Ä·9 ˜Š°dE@Fvª‘,"@RJ„‘QÝdb’v´ ` â‚¡öäÌ~W«ab¢fQª%›  ²Ñ$-©Ÿ¤&eÌ˘|TÉg—¡]¶Úª…¦ïtÓ3£mÒµóö§µ‰¯§÷W÷ׯöWÇîÿûõü_O}¼4òùnïü~ê¿^ŸÜ}8±ótj÷ñÌ΃C»ï¿\þöâÄ¿~¿ü×Ó#;Ó»ö6FwׯvÌíß_Ú}0»Ãº1¼ù¤ÿãZ÷ûë~éüíâðã½÷ëÏ®ö\tÊRV@Ùv÷Ú°Ý&M ¨TQAAƒÌ¼˜²ÄÂ盪KˆËV:\è#¡n£ Œ Õ „‚ d1" Av(RiÍ ¨ú9»žÖ¨(™˜€/Qˆ*TG,a€ŒvJz#Ÿs$ÇÒ<ªRcÓ1U\=Y¸C‡ëd¤viGƒŽÖèp·51l. ™#=ZgM+ø¤YRûÛèФ>=æ,Œ•æ*§ÆsǧüÙAoªßëð&GŒ‰~}¶Ïžïuf{½žŠ†eœŒ&¢AÙÁÌ_3… ŠUòWÉRÍf­h»®ž¯~Á´Š*`3̓”8PÆçù»Á´ÃéýŒpç>ÝšütgdóîÐç+ý/.ö¼8Óøt¯sc|{ut{uagcäÛã¹ïOþümò?_Íÿùˆ¥Ä¡?žÿãéÌ×—S{&öŒ~{:óÇ«¥ý‡ ïÎw|¸Ý·ýëáÏ÷gßÜx~©üëµÊÇÃ+ãæ/íŽ+S¹Ef,"1‘H)±,ˆ)RŒQI2 }¡PQ£M' Ÿ)»ým……Ñæ s"ƒt~Ò™ªë3=ölž–˜áÕ•+wÔ%ó%ÒIQ¿ ›"¬è¸bšÚ(’“A3 )Áj&bÌöK*h ³V#“`i“1*Ã}˜ÁÀ̋ګÑ^Jg<£ßÒ;-¥Ç6ú»¦š¶¤©Y¬KXO«LŸ›HµY 2(FÞÐ*”3vlËÔš‰>Ìc»¸bišQÑ•‚ŽòŽšcZ‚½£¡Šj%§Ú ¦ˆRªUËF¹à ¶S±iÎ1™àP)€Œ¯•Ó-Ï „h«fSY)+c™JPñÁ“]ÿþíÄOïl ½»Ö÷ä”ý~½ôùF}çî—ã{FNïlÌ|fBëÁäÿøpæß/O½¿´óxæûó“;—w-l¯,}º3³¹:¹óìÌ——¾ßŸg²êóõ¾÷W:__n¾½>¼snhójÿ—Ûƒ[7‡_^o¼¸Ô>L/KÒ-ŠO¨i¦E’¡,J1^H¤˜ 2Œ€móU<Ì4’ÎFÊ’'¦¼éÁ\wA¯µ§ vçÕ¦«v{°ˆɦZødVv‰ÒP”´¬8¢ârQGVJ"ÎD±ŸÅv0U#‹@Lf`–ÏðL[*"'ª2tXLÓ8ÍK<‹®Œ°‹ªmšÊ¼ð ­æÒ”$aÝ®ÕÜ ÊéÄ ˜häg³9h«ŠN4††x,m_Õ ¢hXT%BSSÉ`I šrП)q(VØÿ‚›=—êÈR‘ξ¹jV¨l€úÙK€P$Éb2$p±US È2ñPZI*Œkt&¿U$©P )‰4 —,lKÒÙùJ°DüáÉ­{]_®wÿ~µëÓÍO7«lÞ¹Õ¿³1vðdiïÑìþÚäöÝêÁÑ?žÎþõs5ã΃Qv#YVËÛ§÷Ögw¯Ô¾=ýûãá?ŸL¼˜ØZ=ôñüà—õá?vŽí=ý¼:º¹qzóîøÞÝ¡ßη½èÏiJ’ 0c )")¢èz–š™Є•3AÛG$f¡@ ¨IbV{‹î\›;RÐ*tnÔî­im>õ|=T‘ƒŒC›Y:c}uÆ5zU™’,ŠÏô«ëSS)5NZ Œ +ÔGaÐùvÆq‚nW*î·qÒ.J|ý\·Ù«h}”¶SmÑÑflíD]*ê{ý_ëqõ¦+A7_Õ×hIf[sßɸ¢ÑŠI\Õ0±YRgo‘M1’XŠÌœ–}§@E¦ÿÊ \1¡åa‰ˆ…Â*ÓqAˆÆÅT’qL<ž‰ðñ׋$YÚǹX‚\:Ÿ‰&“ì-: eÌT³)Àª5KS•ˆr|6ý×Ë‘ÿóúô>s1kGVv¾¿¿´ùKÛ‡õÁ­û³;wfönMí¬î¯Ooo´í= ù½=ÿ}máÍ/m[Ϧö-îÜ[ÚÜèØ}4²ÿjúïß.þýbù?^]ú¾²ðñfÇç_‡Þݾ{¢ôéÖÜÖ¹¡o/ævWú6ïö¼¾5ôùBw)ef²˜H´ÄS‘PLÎ" '2<»Kb¾”ª"‰ˆ0,Š™l‰dx©ÔÔ{ûÌvÔðPÅQ­¼¦Ä†?V&é£cæ³ÙÜ‹cÕÕ^õF£|»¬ßêo•Ñ©šv­Hkòɳñ'RSGšv¬ŽŠÚ¨¹ÇT†sÊBNøêÕIÿZ¿¿ÔCOV舉Ž´ŸêÀ¿tÐÞµ†{¯™ŸÏé}.:ÖÐ.Ô¬ ·ÏÁí;R‡¢ž::”¯÷kVÁ&ÆCŽÖ¡“>S;Þ´Îujcê7•ñœx¢Dµ ƒÖ£!³S5¤¤Ü‰q1!Sâ±t$–âR8&Á”"ñ V­ )E#B¥©O¶Ñ†¦ÔeÒéªK£¹»×ÜG·ýCCÞh§SŠWhH=;[9x¼ôçÙϷ:7ït|¸0ðéÞè¿^Û¼<ðþFÿÞÓ½¿òÇæ‰ÿï΃¯vïþñûâ/ŽîÝú¶Ö»ûËðÇ{ÍÝc[¦öîŸÚý¥móÁèÞ³éo/¦Oî¬4?ß(º;üy­ÿ?>œúçñÒöÚÔνá/wú>]™øxyàF.§Æãñ°Š¥c±”ÃDA3ØÙ¬×a_<ÜvæpíôÑŽ Ó¹™!w|Ð?>“¿¶Ðwz¸9èYC ýÌdþî¢öëÝ‘¿>œü¶Þ³û ÷óÕÁ·FßÞèß½?}°:ùîæÄ§+åíë›÷ç·Öº·Wj{«cûw¦÷6>/~¹3ù_oN|{6·÷haïÑø¿šÿ¶>tðplûÎä×Çç÷ïß[™ÝypþÓµÁÕÜÁý1öÜGìõûöžNþ×ûSont,`%+€à w*¥ZÁ’bJºLHZ ºË^æSJ*¦¤„Öˆè 4£QfóZ¸TiI¾$³Šñ­®j'ËÚé’{±AWÊöqƒññ/Mm­K¸†qw_(i‹îçpN»ÚÔ®7¼N•4­âa 3/y¾Û¾Ùoóè´†ëé4ìnMŸ«Ê‡Ûéñꌃç\s†9PW›r´)O»Ð‰zuìaÜ‹qàN‚»4|®ˆûdÀPf}r¢ ÈÓ9]¾1¨?ž®Î—à‘¦v¢¨]óñÅ.ír{åÅñÆ¢Kd ëÓ‚©‹q©AŠãhLÊòAª‡Rñ, 6c‹ÙZÕn#vYÈX",)°«é- {Ï·¯,µõšäð€sy¡òèØÀÇk}Ÿ¯ö}¼ÓÜZÙ^=ôe}tÿaÿ³3#o®µm?Ÿúëã¡mûëñ‰ƒõK[çF¶VÖ'öž.nÝÞz8±ýpöýÆðŸOÎí­î¿œþëÕâw&®žNüùxôàåé¿_ß¿{hoeêëÉïöïOï¯On®Llß›=x¸øûµ‰‡'‹‚™LÈJA‰H ¡%¦ e ÍÅäDLK )&®R"Љ*HKÿùŒž†$ʈÒÌÀ)Túl/kx¤ _Ä·ûð½í\A¼?­Íçñ°;î0ƒvOY!èc´ìj#êuи+óq¯‰!£;ÐÊž+n\êútÿÖï—ÛßÝnÿr9(±µÆ³eýÕš¿³qt{uúÛãc»kK›û÷Ÿýôt’i­íã;NïÝ©o¯öo­µí?œØ»äàÃüÁÇK_×ÎmÞ­<Ù]Ý»5ðùÎðׇ£=œ?xpjocqÿñáïŒÊ7†Yp¿lLo=ùº:øöz×h:™DœJb.ØxŠ%É€¢§ŽÍŸýR<!í`X#´Ó ý0 (›Ô¢ §‹Å =rpNÇ ã6 Rf˜€8¢“Sr¢R–”RÊf-ae%H{m“QÌîJÑb€°($²Ï\C]é‰Aþçì‡Q#&bQƒ-Þ6Âid%!Xb` R1-gÛ‰ Y$ רeQÍU5“É^[ˆ¨/ˆiE‚,c7N<ÓI0ãq;žh'‚å÷YNŒ…"¡Dœg®g*›gYÈ9õ™ßöŸþûEÇ¿žõïßÚZ›ø× ßÞ]›Ø½]Üݘؽӿ¿¸µ2öåúÔÖ½ñ¿>ÎïÝŠse|kŠ[¢DeEð)èP•’ª8ˆ0ËÆ šA—yÕ8S û{¹Mï°H3˜Á£“• ù¤ÎóͺêJ’áò9ìX³ Â!Vh]­P¬""ÊÀ¡i"ªŒ¿ ƒ!ñ@ DZ óU["ƒD%RXˆSmáÙÏ0sÊ*vØCØ(«ÁD¥›PU!ÑNà¡($•HD`¯d^HÛ¿Éàlå¦8Ò\ —Rbœk ¶’±#Â%ĨM*§$9 îQ¸˜"de™=3¹VEua§åõøx¤â®{SÝÎá†ÓCšjôäû:Ë7Ž——óý¾õêÚÀï7·Wg¾¾:òévÏÖÊüÖúÔöûÓ»#Ÿ.¶m¯.}^ûsó—¿ß\Ý»¿°ýhrw}hçáìþ«“Ÿ®üùöäçÇžœøþhô`­—•ó«+Þ¯¿4÷VzwVêÛ×»·VšÛW½½•±ï/ÏìmŒ³È~}8òýñò_/Oî<™Ú]cï;²µ~tocd÷Fq-ËÒXR‰ËìL)I¤ê ðUjb€c0™ˆ‚5AõŠi%ƒNú)Qh‰ú*Ipœ?xpöðÿ¬Ë}w¦üùVíÇË {÷'vî6vVûOüõøÔîý™½ûãû/Ø o®N~ºÞûöL÷&»ç·™ƒ[‡¬(Oe)Ø0áÏÕ¡0—‚¹)_…2„<–˜k+íÅPDdöˆc¿Fùx*çyK1ÉI\K"—B¡D€c‘t4XW‰pAÓ>œNsé8ýD:X”æcÁ¿FC\6ÄÅÂ\,æá yT(œI„”(G8.™"ÂA¯Ъ” ET*1 UdDPBX¸ÒªìY¨§˜¯—Bð ¾Yä ¦;Q¨äUÍÕ¨é¢ P£X÷ýœîwùf¡ÐñJÝjα£¢åÂIÈ#””$‘aN4Ï ¶aZªS}f3œž¦Õ[Úk ±Uw°æ¶—Ig›V*;–mš)nœk<»4úû•á_O Y›Ûy4óyýøöýÉÏ7Æ7_²ú:ùþÊX°@ñõÌŸo}}vqÿÉL°°üÎÌö½î?=ùoÏþx±üõé¡¿^/ÜßÝèøŸ_NìéúÝ“?ŒÑϧ ;7Gî0ë:ºy{`gctÿÓÆóÛ«‹ûgöû¶:úéf×çÕ‘ÍõùÝ'Ë?~]Ή fɹP¨…‹$"é–Ÿ[ªC\2ÄÊéçž»`§& GB ÇS‘Öd:寂%^Z°É+–J³d³|H¦z<‚Õ쵇ùp84ã’Q®•ã‚7,|‰`{&ûÉÞ/Ä,Á…C?7„ïæ‚M œCMÑ4Y’*&ËØÊ)ªª"æ†t)«P^¥Y\°õÁvo¾âHš¡(DhA 3¹y @’²\*Ú’ÊJØ®Pfèä¨ D‘OÛ”8 E¦êU À1¿ÊXÂ"Á¹'Z7Ô¶lÚÄÁJ³Zµ¬®ÞütÍmº“u¯¿awåÚ ¦…}T .IàÜ>Vz{sâíµþw;?œíûõÞ—õS¬x?žï~¼¤}2ÅlοߞúñìÐîÃɯë#/5_ßmßý2÷×Û_þ~ê¯×'vÖGwn?˜ûö|òǧ…?/Œ|Ô³OÒÊs‚ßYp÷jyÿZçö­ž­[=_®ô}¹Õõn¥÷ÃjÏîêÔ&¯õ=»Ööy½—eÔ×çS.´c.¤†XípI.ÑÚO´$-™D0·=k~îᣱ`5x$œÊ„’±Pk:ІBi.ޤ‰d&ˆŸ$‡bÁ¥R¬*“á`¯®,<`bFIp×eqGƒ+%[X¼˜Ë€¡ŒE‹Ñ(Œ·B¾•)EBØ(ZÍzaf¬Ü“Ë«¥z_i¨žï,—†s•†«ÅÉR¥¯Yï+ôëé̈5]%*Ê•¨i²Â£Ð¤ˆé< ³ˆË&ÔJ””MÍ6©£æ»±ÑF¹`5Jz½‘ˆ2¼Ã@È uòv_Y›u.Œ7Žwçf*æ½CæDEí¨¨ËUs¶ÝÌ[eôw›‡G©¢Sö1ŸBB8Óíÿvcâû‹³Ï//¼»3öyuö˵Ñw§êï77÷}vìàñì·gG¾==üíÙÉ͇ ûÏf¿¾œ?X?±}µþíéÒ÷ǧÿ|uòûÃɃû‡÷×O<ëøóõìÿÙ˜ÿ‚õ×qá¾’y¤Êïý½‡ý»7véß¹Ú¿ûpèŸÇGvV§¶nÏ~þÅۺ߻o`ïÞðÿþýâßæÊÌg ZPT-ñ.Æ¢ zîEBA[¶T+á<2M+rBˆp1b.žVx(„$¾UIqR(“ÄØJÌÀàB3q Atô²­b3—ól£­L …²¬h â8^®Fš2©¤kjŽ=NW(1ŠŽìkÌD¡º­šlüMÕðQ®ny¶ê;v­àU¼|ÑÏwøÕ.×fPé;®Ï`Ð@΄2±d4ÃìÃ…Å—R ))Æ[…d,ƾP(á[eã †RFT²¬ìùøÏÎ'2 fCœÐlkj•|cìò3H€‚èÉØµP·§tèPH ^Ö±]Gm(Á9£øõýúþ³Á¯Óoo\íû|oêÓÊ¡ß/¼\ê~s¦±ûhêÛó™ÿ|»ô_oÎýóøð橎w&·ÖOþxzê?^úÏßÏþóéÜ¿ßû±>ðýåäÁ«‰oÏýõëÒÿóüð–­ÿšÞFÅ_9þ­“ù|§góöèÖjßæíÞ×»>­±÷šú¸Þÿáæàǵé7«_nuïn4¿>;¼µÞ3 ¢ð\”Ï´¦å 6ÓA51¾ §Â1F”@ŠŠ(*Ú¦TÃØ0ˆÏ  2É(Û6]=IÅ6sÝÎüX±P(ižf¸N®aŽLWÆšù¶ß´4Ï :²bªcBö»›·\‡É[æ™{û«˜‡´ET‚È3 c0«˜ËkféÄÐ5Û+Ö‰mª8®iض öQTÃ@†!#-žQ.h# <õ“P"‘€¾¶‡S\Ћc¾¸… ¨ %æRIö½â Á±t‚[81lO‹gR»†'¨|¸,ž´ñœ,Åø\#:i— çòêTÇluÒ&Mæ×$¥ê€¥>úñFßöÕ±Ý3[×F¾\Ú¾3÷;“=¿N¼8º÷`æû‹ãû«‡¶v{4òíáÔ ô‡Cÿ|¹ü_¿]úûÙüŸÏ¦¾¿ÿóùÌß/Žl¯î?Yúñtþdzù?în÷˜¯8ùQkö…ˆ>v·W™ö¾ÛÿéÞØ›óC[+ƒŸ®õ¼»1þúúà§•‰×?ßÝ|<²³1ýû‰ÆŒœ¶3Y1œÂÙ4MC*pZ™¤‡d JSÅTаh¢`1R’ ™‚­ ’J€,N]ƒˆ_ÖFºu›9=©ºŠ‘Š ±4Y3±_¨ÖêʼnñB¡Ý¡9C¶t£¢Úu 3›K4¨kÐR™Z’±\jÉÐP krš©g˜Ù2TæI%h¾™w}×Õ]Ït|TÕ4 ë@E"RVtá––H¢…g$ ZC¤“­i¤‚öš?ܨ4Ìî¼S5íf)?\0G¬|I;=¡Ÿì¢3éÈÓ¦M–Y6È «^^0W—+÷Ot¾þ¥oc¦¸~|¸l¼¸^{·:þÛ•ò¯WòWgJÏ®w¼?Y¼î}µ[ä°·õzàÓúÈ‹ mŸ mߟ9Øþº6öîdÿó[C;çÿã÷ÓÿãÃéþccúÏ•™í[}ï/”6WFÿüíü÷§‡¿>Ÿûñ¬ïÇÓéƒg§¿½XüûéÌ?OGþ|zäï'—ÿ}íð^Õ{Åqobü—ÙÒמ­;mïöoÝ_Þ\Ü\iûr{äÍÅ‘G—:>Üêøp£¸y·‡ æ¿^.|{<}¤F+‚¸ ³<)MLQ!%'ù4s© í0‘%ÊcfŸR’Œg3ñ˜,e2—¨®Óåª*jTVU‰"ÍÔ|‡q‹-‘ .–@IŠL©åzD3¥, ó"P45\(“£å]'"µJZw—Þc«¥¦93æMÕéT—Õ§«^‹Ø AM”|Ø_ÔkºáÊZ#rj àlRho€Jÿ¼>òéÖøæ­ñ½Õ©Ýõ¹í[cŸnõî>šýñ”óÜýºôÏ›3ßží¼šÞ{½È8÷ë‹ñ?^ÏüçËcÿ¼:ÆøwçÅâî£C_îÏo³”xqôÏßoÿxyúÏóÿùîÔ\êý¤’ßâî½ÂÁ½Ý[ÃÛ¿ôn1yüzߨeÇÉ{³íŒg>¦´&“HáYR™Ÿþ¤T`fSñX*œNk:Æ¥CÊDB0-ú:©j¸±nPßÒt(JÆÇÈ ^%"fQPQÃÀ‘°"®LøìO“ÃøŽ¥Gd@wž iª›@BLÑDP&ÄK±J ÚÂ;Áì.DI$¥J°‘L¤˜XBr+YS•ŠXnŠRà»TPV1‹Î2ò†UÛmjsÝÚ|M›­j#¾Vó4‡j?¯¶Àü a/¤¬Ät\ÎlXz›gä5¦€Ë´€GKmZA%AÓšµ<Õõ,Ç£n›žµiªý\îðŸÝjüz£ûÎøöÊÌÎÝ£ï¯ö¾¹Þ÷üjß«µÞÝ—ó?žþãÁòÞ™o¯gÿü°´¹>ó‰I¬•ù½õY¦„ÿy²ü×ýåo–÷ÚYŸÚº7½¹±øýéÑo¦¼ž9x¼ðçËK?î.|öß/ôìÝ_ü~bÿáÄîýÑ{Œ¯çÿ|°øÇ“Ñ?7z?žÍ}¹ÝõåÁÌöÓ…_ÏþñxâàöÀõ¡r» GZ"q.Éì©…-É&˜Æ "ȧ¸D<˜pÀ‘ëÂÑÀ 1å[“).éÐ 6Þ’Q[õh*R‚e›vP܆µ6â” jˆ€d€+ÁºDŠÙ,ÄV †`2è¬liO-r4¯-¹´¯¢LåŽÌV6œ…6o®Y8”£ãq¬ÉŠ;ßSì6µKíª“"j"X–3˜£g»õ ÿÖ@ùîlÿå®z'9ä Ruô:3® 0l¥á¨EM#¥xAá$¥ELr™ËÛ°nÍf¢I)Y Hi Ƴ˜ 9¡¸¢´))Ô@‚ãd•L’—ãB<)#U^^r_î~rbìíÕ…ýÕñ­Û_î1nûðK÷‡KãŸ/·Ö»vúñûñÿµyòŸ'§¶oÌ¿^.¿»Pý´Ñ»÷pbÿñè×Ëÿzuþ{pj`áàÙâþ«3»Ï'¿½Û¹=øõþÔWGþ|½üï'þøtb÷Á(ÓE÷ÙMmÝ™Ü\ŸÞ}ôÛïg÷Žï¯îÞú¸2ùöVÏo:~½ØöõÕÔ×—³o/NWU†],^ÁfufZ[˜Iý¼ û³BLœˆI^ˆñbœ—©L”Á5+ry¹„NµY«#ÞͪºX¢ú%O²áÑŠz®Ë<Ò0|u”ª FŠðD#¸JÃÂ}®ßïØ%Cu5외äÑzNmú¤-ÇjŠØm8cU¿3otT®¦ÑÓÔû‘žüàH~t 2ÚÁ|náü©ö‰‘ÂÌTñÔLéøpîâ”ýË‘êʱó³=ÓƒÕ¡.»¿éõÔK,š–Ì´†"¾¢K¦’BDE¬fcr–ã³i–yòT‘‘Ó<ŒqÌ*(RXb *˜™V™= "(HŽfÅgÄ6B®ÕÞ\Þ~6¾Ëjdudóf÷çÛ]Ÿî¶¸7üá鱃w7þzq럿ߞ۾ÛöåA×ÎË£ßÞÿñêð§þZ=»}mòíÚ·G<[üóñ‰›c¯O6ß\jî<˜Ø¼=¹½~hçÞÜÎ푽û“;¬–ïNî?Ÿýãáo¯Oí¬ßYÛ[™Ú¹<¹õKÇסÝõáÍÛC_n ïÞŸß{4³{êójß³S•qÏá8æîx&œP,EÒWl^rÉR^‘ò¢äk³•Q*9¥j"Š>”µ”¬!ÙWA§ ªVUZSJZ*¶ƒîz˜¹M=#ƒŒ  ?/£€DÇKívW¡Û7 Í\°)‹Ü¨(rÕÇmnÀ¤²u]-bTQpNÖ\ƒTXf–W…*’ózi¬Å1JÁ’£O6sýU£»Mï®çšžŸÓìÁÞâñ¡Fg—r†kÒ¢CúÚp¿U­åK^Ù÷}lQ¨’|Õî,–+9Ã3Km…žöR—£tÃÐM-Oke£ÏR:ñM³Ø°Š9ꨤÛÓN6œë³Å_ïÏì==öåZ×çÛý_˜¹3üéÎøç›ÃïÏ?™êxr¶¾ûzòŸ½‹ÿÞ>ÿ¯çKûw&¶®ílÌmmLo?Ý»¼ûbaw•9 C{fw7Æ·Ö§w6f¿¾\:¸?õåZÏîj÷ÁFç÷çÇþxròàÁáoÏO~{zx÷öøÎ­‘­Û;÷:¿=Yøë·“>ùvpw}j{}b{íøÖZï»õ®í§§ÿxvñÓ™¡I_Æ‚6M‰7¡lª¢M¤Vò8ê8«¦RÁŸÒ<ÉÈ”™w ¢M¥• S¾Yeð³“RpÁ¶Ÿ ¥ó?ñ8) qI¶Š™ŒÈ¥²‘Œ ÈŠtòRÊu8U¡³íÍã®<éµ #ܹ’7äJ†Ñå¨ìþNVξ֛7úsö@ÁtͺcŽ5왊Ñ]5ëÆhÙl÷j5_/ùÅv¿s´ÞÞSovz½½¾ç™H3©CKÓ|-WuòÕ¢åûªa Á™aê8– u«õksíñ‚ÑæªHXð{NwÅÉÑ`{š+!ÏtzÊÕ#ÅSÍ7—‡7oN¼3°½>½}õЯ'_]ØÚùçó¹ÿõuå¿~½ôÏÆ™íó£û+cÿþíÜŸÏOÿùîäî_ýï§þ~|øëúÉ/G?ÝÙy<úu}âÛ½‘•ÑÍõ±ƒ§‡ÿ|yäë“é¯Ïfþx¹ÌS=ŸÙ8»rÿáÌÞ³‘¯Ïºwîv~¼Õ·ÿtñë«ã{«ûëŒy‡¶îÏìÜŸÞ¹;ºµ6¾ýxîóí¹éš—hIX2壥58ËœÆ|Œ¤x]LkÌ·FRÙ8/&5•1„‘D DZƒ áX0aÌY%#A×÷$Ìç$c>h¿þy (ÒI­>[“Q^æ5"–@ÃrŽBbK.® \x6v4ªSlÄѰmB×Um Z–âU°ŸC–˜’q-lZÁe¯-æ_rõL%g¼‹®äº¨èå*9˶5DleEuËè®Ðj•ÖrÐwEËUV˜ºÓK®i¢á:™i3®Ö§¡*F% &(œÁ ¯È¦€|A)ØŸ×Nä×Ou¼c*èÙñíµ©Ï×&>ÞœØüõÔþ‹³3û¦¾ÞŸß}0µûnîÇæÅ?½ðÇ«#=;ô}}aoåÐç'þ|{ôà×C{/—6oM¼=?üyeêë‹Éo/Ƕ×?¯ ~Y›ÜZ›øÂÐõÑØÖ㥽µ#ßV§ö<Ÿÿöìð×;=Ÿ/—Þ_ï}kxs­wÿþàþÚàÞÚÐîÚèöêø—Õá­õÉLJ¶ÍoÝùt¾kÌ'a.¥Š­`#©¢™Ä-&šÁ¥x ò†Vc1”I— ¹KWÊvÛ°×bÏú¿ÀEÆÑÑ–P8hÏÿ–dœKGƒÛ­ñ -g&Þ"Äcb$Á“ÑìžH¢5¸v*¯Ê2‘ƒ«Ôƒ°™kn@2üR"*dxÆåXœ ™Å¢DÓ"i ®¢„4 §ŒÈ²(‰@ŠfN“Heö:rJ–ªdq" BaŠRÓÁZfœ”DðQÈ>RDÒ1H!P¨Ñé<¾@ñ4¥}‚ÒK÷ñb/Âý„tˈ‘…—|öæ•âæ“é½ÕÙ­•ÑíµÑýWó{3¿ª½<⿻ݾõëÄ~:ü?ŸžüziðýÅŽ÷w‡6WÆ¿>›ý[ËÿsÿÒ½¿ôׯ±­+[7F·ïŽn>Ùy4±÷¨go£óó…þ'«o¯æ¾\jÿpypseâÛã鿟L~»=²uª÷óµÞmæ‚-¬Œl]©m߬înô<þöttwc`{¥oûVs÷nãóJχ»½›OÞ­ >™ëêÏÅ´lªŒ¥¦¦4-0VÆ E}ÒSºY(©:Ì\¥ɶQ¾@&ûëªØFƒVœ­?ÏÄý %?›4²£5˜Ç‹mý"J<‚SaÂ@ ãTTf`Ë-ñD6‘U3Š#CGFjqÙÈ ª(¸P&q9 ®Ð¤fD&W@R”Â" 1–E1-f¢¢a‚8‚ÓJpwZJ+—˜tebfãÁe%S)9òñD*,ÍkRÉKñÉT<2m,Ä£b2L?¢¤\£`ƒaIìÅbFòx¹ÁK¬˜¡Ï>˜”ív饾Òúlço熿lÌì=ûº2õñ\óÃjûÞ§S?>\øúdùÓ¥÷¾íœþçÛõ?;ùãáÔßÏÿxvìã­á/kcß~[üñÛÒßï–ÿcûä¿~;|°2¿uo~wcú;ó>+ »w˜;¼ÿîÔŸoŽ~{6qðqæûï‡ ï?ïÝ{1ýùîÔ»Û}Ÿž ~Xï}s®ýÕÑΗ§ï®´oßèݹ;¸»:tðxnïéÂÖúÄ—»í¿Ýxp¤«IƒKCT*k 5­Ç…5äu`“àòßvБW’ÂBCGM¢˜RÆDÀUàÏòLG¸d ki‰þŒ, ZD[¹d„Õ,#\ùLž”(;¨)A(  €”xжZ· ­CÅy—a/`¼–SaŽâІ|"ZTtIpu'Æ4¸€H9HBr,³Äˆ Áb—˜œN$äÖàªáP"Ê~ÍŠi)-Ç„`BT[e)ôg†Ž%.#±Üú`£P$Å13JXP.Ë ‘‘Û‚Ëcbo 6#b>µÅ¬–R'æÛ;>¿œù÷‡“ߟ/í¬ôl­ôín,¾8ûx¡ôø¸÷ýÉüÿçÝÿ|~ö˵‰wçú?\Þ|>¾ólèàþÌŸÏ~ùñôì‡Óûwf7ïN1©sðhìÇ“¥ƒã›K;¿N>ýéÆèã]OO5;Þñë|ÛãSÍ7ú~»V}Ù~¹þábïÛË=ï¯Ü_ôïŸ)¼^{s«ïóƒÞ͇ã×&‚ã+ &÷߸üùÖüÛÓÃýJr))–¥’` E—K½ 0‰U¬`Í›`"¹@qICÊÁEs˜ƒà*KÁ‰×t88b-Ì<^I §NÓ”Mg³-¼ÌÉ¡° Ë(31˜ˆ(^”RFDÂËj" cJΪ @˜¤Œ™zZ¡)¢ fƒÓ˜Y,CŠ˜™‘0Ó8p.#!舢ɦ%ÝÖJe»n›6&RÛ›FÉ2±8j£lw5ݪ«)AïHè2a“£9uÞ”Ž“à¢ií*ì3À«¶ë„D²Í>¶èÞ:Z|{¦ûÝñáÇG»Þ\ïÞ»?¼wdkmhçåØ_¿Ÿþóé±?=üïo¿üýåâ_ÿx·°÷pæãÙÉÏ¿Œ2 ôýåé￞þñbþÇ£Ñ?Ìþñäè÷gG¾>>¼·6²µÂ<ËøçÛ#ï¯ ¼½Öÿy}`÷ÙÜÎÆè—Õž/«£®üv¼¼½1¸ykôå¹6&}?Ý{nðþ‘ÊÚ©òë Õߎç-;¿ž¯|º^ÛZØ{°°óbñÓ½¡ßOÖGlj¤™É€6Â~°Dûx?ÛA÷BÑ€é1ÛŒ­”¥„($’™ˆI¢­-‘(—¶E”Ê–Unp66!]eêÄbŠ:-gRJ&$ö³ULD’Rp /J¢\Tª1ìËP‰m`š$ÌÎP4 ¯´ÃƒÖÅ%÷òtýBwe¡776šï-º Ö\µîÒzÃì(›}í¥þr¥=ov­Þ¢1V0&æá.s¦]i#¾1çƒnpe™›ö–õ¾œÖëéÃ*ÓV¤[à 5¼è¨Ó6\̃æÁ­l•l²‚4S2®tÓ‡Gûöž1¥t8Xþèd0†¦·×^œêxôKuóÑìß¿]ý÷ó Ì„®î?Ú}4þýÅáÿ½sý¿ßßú¾²üþ^ç—Ç=__Müx·ø÷ï—ÿùýüŸÏî1%¶6Ì2©ütîËýÉÍ{cÛ÷&·îlÞéÚºÓ»y§óýÝÞwÛ¶nv>9Õ\¹X|y½óóZ÷Ç«]¯Nµ½½ÓõùÑØïwÆÞ¯~Zغ׶uw䀱ÿ³Á¿ŽO—©­+“ø”a`€ºfÐÜÚ<ÖDÅ’%C”4Q4ðUXÁÐÌJÏè€Ê­é.ÄX5ÍIÁꈖDpÑ´–ÿSÁÜJÖ´‹‚ö6ÉXT¥[2È ²l1³™™ÅÌ2³˜É°÷îî—¾ósçÎÄDLÄü¿YÕçÎÄtT¸;Ô¶lU®|`U®ÌÞ¾žþ®ä¾Ò *ôO# CÅv÷âѹäx<¦ÂôCdÚ£0)‘A ðhd“&@›-¥AtÚXlT!gy4Ëcg–{:3¨™`Z&8Ë-‹a h…|)‡!‡ªAd]Ì0Ž2—xl‡6;@SϱŽ˜Ûƒ ËýÈÀ»2 Œƒ\ã0cs Ù™e®Ïq du„®ÀKù”Õ äH†ìM!ÖAX7H3 3U\Ò:kâq¸;zÿ¬(ÝJ!5Ð6è‘çkK-¾TqHKnqãqçãnó;¾üWýôüŠþ~?j^¯—£–BP[ˆh\Ýí?l·®­5§ºæRÕ½æªM׌~Ýí5oL­äîÇÍn%dy?½\ÎUêfÔð$®¨ÇÌy§&s4›ó.6ÛÕ€µè¢w²à/Û E›éõd"z ˆnË'ÂçL&¸P¼ÑUÖr@ÿq·´\Ø„Ú×÷õÐpýänrgw_ڹƠîìîèÅôö’úÑãÍ0¡X×îÜáO?À@Ìi6CÈ¢Š™Ð<àÄ~¸ƒ c OcÀ,b“¦€K")½dFÛ R¿q¨¤q.4Æ„ÆÈ) R'ŒyM¢N1é x Íð;j^dWäÕL×GÂk³þµI‡w¶RkV÷~¿í|>n·îЖ­Är-¼øu§ú}k.…5ïú»G]D5Õ®M­»½ÏÈòѭϨ©3ÔbëµÐF=¸QX›7t+ÄÚ¯É9i»âñDt»5þæ^ÈDÔ•¤®ÞÌÇ-” Üg„ŒˆÔÕEíÁ`{;z{ÛI=íÔž.Bïßm±Iݸ~ >»ûÚº@JöR»shoax„ŽF‡M" Рaˆõ(½dN'Äl#11D60P€¶¨°`~EÚÙó£—Ð…ý»W$–ÒI¢w“ýTVÂÄÑéè˜rò ѸtÙ{‚nè.Œ#Ú)rd@3ÁØ•3vÆ¢¢CÊ DÄ¢ÍBÐ<žhrmg˜±ÊC„lÒ L6ÐèK@î²)æqŽ•Î²à‘Ý)®g{Ä>;$£ô/Ш‘H„Ñn²„ÌÐQHsH¯‘ÃÒñI†!Òºhͳ\Z|õŠjú*àĈ¥îpXW\i8tÎÉçëùúþëzå_都Ÿþãñ¸q³][-½R>ñ‹{òÜÊ?ŠGÿH£û‡'ÓY¯¼ÐÕmÒZl£~½Q‹›[wÆï”¥š´æšJ@Rõ.æl yŸ©xkø¾Uf‚òàhÄ–Öÿ«`ÿënÿ#¶ÑŒ™~MÑ©ªÜh€*n„ÅïjÚkÍûŒÙ @ëÏvcÒ81F…ú» ”>¨GzÛKÃP` A'¼“ÉhÓBƒë#tÒû‰ýÔ o°Tfàÿ%Ã$Z7éÀ2úˆ, ÜL°Èó|"›DcàÈŒx>PÔ$¨·­—‚Ö±`‰,éïêG2‹žpîCÏnð`Úæ!íÝ:ÐMeñ<ˆLï ;ˆ*•CÆsˆÄ!n¢È8TºÀ¤jx}”v!`ʸå 2ÍdY$ÌC1SÇGtcŒÕiÚÑä •@·ò‘ñ€kmȹ4è=˜»³ÎìRû%ý½úqΦqÄc¾Z>3 Gö†\š‘Zp0:hœdîKxÞ½Ùld¿î_/:e¥ûÃ’}©T}=ZËçú÷ÐDéDq§`?Úå_•ý6þÕ:ýy³Y»¾.d.Ui·±r½úq«ÿ}wñGÌðá[¨ú§k·êŸGQc¬¾56ü›%ÛBúPôp©¨Þ~¿_.¦ÃëÔÄæ°O-pëÁMvòD”Ž+ËïšÆ›å?…“?îW?oµÿ¾ÙüŠ.ÿñ®«Ä-Y¿þåd¢öj­ÅÔ®õ©CÕØ™BÁ‘á^2¡‡Œï©„9…E€Äõ0LmnIm¸ ÛùAÀ©=®‡Œ>ùë'B}T¸OêÅQÿþ)¸— ü#BƒHHð‰>’µªƒwÒ ,úA·cºÛzre€BœC˜LÄ PùT¿Ÿ%±W¦8á@ƒÎ. ¢éd\…ÔCƒˆ£u°ØâZßž£¸»ãÜå9Êæm=hîí³¡ÓIó$kšOéC÷’zÈÝØ~êûºˆÇ=„¾>tö,ßAÄàÆ²º1´nÂH2ÜAœÁM$ƒëoÇ¢O0;ºpXL'Dìēіæ8¨Ëì!Ámôî‡Å2*™: sqQ‰ø<6›É`²éÓ#L¡€9Ìgóy|pb~ˆÉ¤!,êä(‡Á„8“4Ö sŽÏa÷Qúz€ï'´7šOePô㛢‘õqÖæ4óD5q47y¡µK§Üfadgøör ²=–Üž kf’Ûˆj4¶3þ|)½?Þ/=^©Nåñ½ÅØît|o*y0?Þ ïN§sË·‡Ê÷[uÕµ‚>ÇqjÓ~E-niÄŒõ„áÀàÍi5a.Tµ—õ„õ}ìñt¢|#ý.­ý»qüëy·u»äSÍk.…LøR5¢þ¼]þ¾Ýj>®dlúÛ“¹\À\OZ׿zt àsÙ¹Xñˆ‹þ‰rd®ת֭ì_E\)ÓÓ¤‘úÑzo?Ê…5óœÓU¶g‹g_ŠZG<«ÌÐö\hOä?šK\Í¥ãÚØáœÓ*ˆ,¸†Ùë0“I"ƒ(ˆ{IS=ÈxÙL¤*Èt9†m ö¯ãigC×G6’!‡wH¥G  x`ŸLq ’ðmè\°¶î^º…؇íÀbºp ²ÔNž€EH=Ä6Xâð cŽ3"ššFå0x h€Í( ,(x&L¾™B#RÉýmP[êaá6,‹BaS‰Ãl´×S×µ ”À°‘SiC}Ë8k_Âw˜ý«ÓI÷b*(ŽìÎ&Ž&^“Óy¿9R?_ªžÝŠrððöJôt¹OH?‚Ö2H:—6ëT¿jºTb÷§÷´â3äoô­[s!`z÷j?=æ¢_öûd…¤éÅ.”.5UÐOa)øî®®NjÂcp”~BâÐg§Ù²YÄ âÛöćjEÄÜT [=ºáUáÀÂËÀ!ÛXT ™j¥¯qèK,º†ÍÔ1黎–ÁXgÃf6I?Hœƒˆcd¢žŒÁf‰D!–(ê#ʰ¤… ºIÄb3Ù„ Ln'™Ò†Ç£ƒúè=t†ÈšÔÖÆB¬j¾eF04ÄÖ-ðgØh@ :ÂDX á T„‹†"Pp#£,:ÂâÑçÆøæÙ! ’ ²¹Œ9w–w%9bsí+#Ñab[òP¤l†ì±úõBœvmæÝšÊ¥%¨M»´¹ (w%}·Íü²\È\_–œÂBÈRŸ|+ªàW´2¦jêð5°’>šK»Õ)¯¼~ÍnûGÄØíWÂúBØPóh s€ú# )¥¹°²þºóûîèûVñõfúý+ô3¹SO®”ÖRh©56ã ¸k·kßw›@ _ë ¡Ù÷>Sׯ•͸ågÌÔêË^yéDø÷a؃JhÝùG—„ñ…eÛ„€C¢Áx\w{':¯­§¯§“ØÙÇj#’:{Ƚí0La2*K¥ÒÈ×ÏáÁÓC§CèÀÍôSÔTÆ š"1¦ˆ¬)¡’Ǩ4‘:ÝŽ÷Sù]„©ˆ÷ÆtÀ†>dÛ&ÃÒ°d…hÆÁC0qvYd"\áÑ“qx´,ÛسÆuwCÄQð,S58"äðÚ0l»ŸÜG¢R„ÅcÍqâÒ@2’hD:@b…ƒÐÒµv\‰8?[LCŒA½˜¹=ƿЎ†×Fëw¦'ûüýîxl}îæJY´ë_Æ\`¿à_/ÙÍuçÜïçýßw«µÈZ%hú|=-ؤy‡2¹5Ÿó«qåûº!ãVT}ŠŒw¼UW½ËeçüÛÕD%j*øù°¶p¦MùŒµ¸µ6ÿ#“,Hn/&þU¼úù¾QºVdþJl~Å7«qiëéð+b¨Æ×‹ÁÍ‚Ï\Ë!YÞ§JŽ—úÚÝÖçãÚWzå+d¬ nIÎ«ÉØUµ€¸¾Fݸ;¯FVÊ!S5ºU÷XšÁùfDñûVW9œ©Ïœ i *‰@èô1Ûÿ.R´ázz0í½Ä> ¹»§êì‡Ú`:‰À&AttÜ,DÅÀL*Ä„a2 É™Ìóù{Z΢XÌ"D@¤è"4KdZ†V ¤ Á#ývUÁ‚çðÈ0Ž4D&qHDþ02â2Âæ²p Šˆ#cñ¹›±¨ŒHdhl€>ǥϊXÒQæÜ»£¯ üŸÉb0‘AÂFçC3Gè;LMr&˜@%ý€°m±‚‘õ(_7Î<• Î'¹.ËD6¾[ ì¾\inNG3Ù˹*´?ÂQ /VœÞl4ßÎ~Ý\|e¶?Ÿ—ɽڽòWÞY¹\F>v?£ÆÏû•Fh»q·ý}sYr€¤67Ö·ƒ’GˆÞdŸ5í×VîÅÕ¸ªy»Ô «òÅW\UpŠAuÚ¦Î/|&¬ÿx:úçÛñçÍÆçµñwÝ\6Ð’˜´ò!"ˇÕ9‡ê;½þÇãvÓ¶V¸Ô6³²†Måy%8ÕxQþ¼¾ú¾_ú~µÔlËå êïS9kÕˆ±’Ô#ÆÖ©ù¨ù¯êÊN% ¸¾®Ž¾ÞN,:²³—„Á00=0P¹¸‹AxIô 0‘“ÈxûQû!"ŽJ¦Ñ$Ü‘ {€Éäý=ŒfAèÝ À|2LÃÂ4ðVð)µŸDíáá:zpL ÏlëøÀ >‡13It†RËÆàq˜É&SúHt¸ŸÑÝCa²™ ™‹'rúá<Ç¢ŒóØS$Ê>5Șf1æ³| ‡)L:mv6‚£ƒ'"x:I2Îñ¯Ì=_©|–©xp*unŽmÏßœ)RvmæLYò‚®~vHj¯kÇd:0Ú¼Û-{ 9‡(oSÖbËÍØz#`­‡V¿ž7cK%Çô{XôqkG³°hyw؛뀓ʬ¾u½×ЬW@Zíé5^ôŠÓ6mêRXò­ä\ÚŠÛ˜?”¶ ç?ŸN*7ÛŸ«ÿþ8þëåìãM÷ŸârÖ)K‡Œ_‘bÀPðë’›c進õêúݬǗ*þ¹F\Wò©Ênaíd¬3ÿºSüº3×·×–JÔ\ šË.MÚ.-ÛeõäÑ<Û`h©¤Q cHX`X0俇¨‚[ŠïÆáÀí¥ðÐÇgx<„ƒ!d+ƒ‰íº°B¤²9tˆ ]4‹ÉäQÐv›ô.˜N…©TDì#µwÄQ{0˜ö6lG¹§³ãÞÑŽëÅb;ɘt¶ÚÜZœÀåòxíÔ `R Ö}ä^œV(ƶÔS{–IÇ’òrqjqaXc‘¨t‰@??º½4´<ÏߘTp$lŽaš})¬MrVç‡wg†.AùÓùBrO•Ø;–89Ÿ>}¢Ï¦Ì¿3Ge—)s q‡ŸìòŠKVuë!K#"mD ¿Ÿÿx0Öo·›/»_Ù¥ÆÉRí|¡y³Yò›rV#–´Ë˜Š÷î¨u³Òð+šÉ•ªs²ú¶ îy=cù¯wO9qô°¥ö²ÓºÞ*œÍ|6vÝ_”“ß7'_÷g÷G_7û_I}Õ§yŠ+â¼GúçÍq:,«Þÿ|Yª„SŸ”gJÁùZÒT ™Þ/ Í'ë¯ïwtù×Ûæ?ßv±õJ@_±KK~]åz©VWÚjÜðÓ¹ø+¹©¥Â´n\ƒ'añ$ âpX<ŒÅ2ù,2ÆÂ¶Q;{ ÜAÁãÀ¡Bä&cŒ‰Gèä.:™Ç$²éÐuQI¸>2&ã FŒÁ€Àµwöâú¶cÛIxÓcÚq˜NôÜz´‹žôbs¨L ž˜™#Ú¬«Vçé&ëäô}BÄž™ Ë’iþØ]<ÉfO²fxãSì-¹àТ0KgW—yÒ1íì u‘ïÛ<±$ƒ†AÚ‘q*°ÿ‘´Öc‹­Äf=¦ÿ}õûnûóö¤™´V#հ⯠òuk(2$OëÞ©zt½âÔ”¼ÖJ`»ä4Cúx0Õ¸–Ò¬k8”ÏøÚ¶¿î·þxßÿ£n«ß¯6þ~RóGÞü+²üé}õⓎ®õ%¯:糤â–ÏûZb#ߎì“ÆÚõûaýãÖúyoýº]ÿ²9¶Yq«Ë~eÞ-*øÄàëÍåLÁ/MÙÇŠþ¹y*GÀ#z:ýšÔד€Mè€{: v•+ééƒp=h1COwQq$9Œ‡q0z˜¥§«¯ƒ„t@Ĉ‚qmÄ6 ÚS… r¿=A‰Ö¦¢×ÒÞÑßÅÅ`úè‘9ÆF˜Êä’ˆ,Ahl& Cô~Këé ˜lj/­n#ÓÉ0ûï3P <–A$³9¼a‡3÷¿nvë1Íwh©ì©FµµkmÑ>•ñOîäõ€6azpŽÁÖ¸YýO츸aHŸ5׫ž£Ì¹ªÖ"Óõ¨¾™\ÿ~8ú#aý -|\oÔ‚—i»ˆ«¼×„>ÈsiÊEÃ!y^^ì& ÒHDftR)(&“H8´õ ½!÷ñt"K„ú(¦võ`a<ê¡¶azX—ˆã{±ø6®·, øÙ^&JaR«ƒîJ”!Æýb *zÛm˜±‘A°%“Ec"¤>2™Åb pGC#\>ˆ2O8lÖ ‰e‚Í5ŪpxJ0DbÌ Óæ'‡µ(ŒÉ!Ƙ€3'à,Œ0Tóœ]1ÿÀÈlÍ<ûåvÅ»_ú°<þUüYq|¾ì彯´WWíå´Ù+Y–±óûqíÛ³WºRæŽæò~U%dÎÍ•±™\­ß˜ZAkd™‘w‹+WŠÛƒ‘¼s¶z»Ú¸]©íê]Ξ/Åvå¯W¦‚GŸqÍ–Cª’K] JAM hª00/ºVÒÚ@ ußæÆýQ>`¬$7ª¡å÷ÝœWùx8û~2‰ú¦ÀæÍ²0ã˜üL…òޱb\÷ÇïÍÏÛµrX’ñΔ£²œGýr©)Åw`ETÍÇ寇ͯ‡¯Çuø!ãSV£ª¯K%"oÞ[J‡Ò;+›Ñ щL † @9¡ÃÊéL R ýüZMDQ¢Só°X ®¯‡î¥b{‰Ø^ ¾‡ëÁQûhØö¶®® 0Mm=?ºI–HâùËʼnD|BþѼ ­Lê$ŽñHòa†q˜Ç„hl: ˆafðLÁÔdŽ'—Î*å“ ãS³ÓÜɺ\ÍËFç&9só¼Ý íšvP2ÁbiŠÇÄQÃlxž /ÍÜ] ŸìÊ’sî~w6}§h%œ©-ýýÖÀõélꜜKÁ?óëZSwšÒ;sÏl)`D‹íïtÿzâ–L@R½¶üu½W‹/×^[kÕ§­¬—µ9.zÆÊEÑk*&–jwÛ9Ÿ¬Z(D¥¥è* àJLܼ^/™²nC%bþ¥œ<Ï/<_ÎÆVéïÉB@œ /|UpÏTcªrXU *+®‰šº¢y½üù´^­„uˆºŒ³s.åYÈ8§<’AB[ÜM"÷’úÐ23r?ZÒCèiƒúÚ zµ= õ´ñ 1“±ä6,±£·ÓAkGHèÙî¶®ŽÉ‰60’:¸ÛQ!2ŠŽî`r¹Úkœ>Æa/r¹6¤•2ô»–Þ˜ o )K£ÜõÁQÃÈ`\5êQÍlh§”³GÒÙ%Õô40Á‚G‡˜tþÂk–G“Ίh´>¤M0älî²tüT#ó­OÜxæ³WŠ\X˜µ·ƒñ‚ÛXzZnÄNÿ¸µ5€ý×\¯J’ç³é¤ùYÇ×ÓùwâòiUv®ddBê?Ÿë¡õÜ­æÝ)Î;LÏ'ª˜MQˆÌVÐQ솼GQôÌTƒÅ€hæÏ»«Ï—«ŠO•óHŸÏUö…ŒÛvH Àõ$W«qs3¦«%‡!{©¬][³aC%¡®ß(j¯†ªS“S#»ßœ ï Å‹/¤µ”\¨^¯dcÆVjûߟ¾ºs9s¹PMl×"ºêõj#¸ZôLåÚBT$Öç“å§åïÛ¯$PΆtd´ ¡OYŽ.ÔB’×ãa‡”?„¡ÊFÉN ËȇgÄá>’ Ÿ¦dl¹îµa—xtg†/§Ð ?ˆøÔÞ>"õéAVsذ^ÍAûÄrè:á€ØRÑèÔ4{hfdvnf‚ÇE/XÒ©l];ÇÒphƒ4<=ÌRÍ0¤ãŒ…1Æ¡„ï’ ‰x{^|}ÞiQ;wçý‹×Wšõ‰IÑp¼ì‘qöøÌȈ€3=Æ;X¨ørC2À²Nr/µƒ›CÐÕ÷#fn ×k…c#¸iÅÜzóá(w¢Oy%ï1ñËÁxézï;íÊI2—óá}w,ëVÚª^­ÜÏÝŸÏ?ˆ_¶ä)Ëw©óù´}®p²P ]$yÛ›IŒBÚ†Ëð¶:šuÈ‹žÅŒm¶´Vý–—maÚn~½å½Y×\ãúàóÆZ‰Z·h3¯®øÝ/ËŸ,ä.&êS͵TòkJy+¼Q ­T õ;}-²Õºµ~Å7kkÉ)ÏÅ E§(çW5BÊŠ±y³¤T#ËàkIi!¦.Fô?ï6ÇLÕ*ã5î$ÿˆªÊa!(ÌÏß®Lœˆwf™WêA§vôjy8¼2r©x6&NÔÃ6ódp}™Üš>™æË8š¢3ÈýJO'L€fg¸[ªÑ glœ3^ï%kD¤¢G–J©dJ7‘@éåqFè,‰Ê§Ãƒ€aû:޾0ÀZ— Ÿ,K/æ…kSl÷¥8p&?^e'ó÷nmÝ¢™œ iì &wœÅd ²ÇgY3º‚Žl‹9òÁ#íȃGùtd¸¹˜/].¦œ’Zr«~’?ü¥o\›âËòä™ôÏøUŽ™=ŸG% .IÍŸ÷K…SÑíö´cÿv));4¯¬×½Ì¼ éõùgçâçãÎ÷íêÿÈ.ý¯üÖ¿Û¿W¾Ÿ·ªAM-|ÜnÖÚ¯Ôa9²œ ŠaKán³µÇñëyë÷Ç_·§_‰­fb³y»× .žÏFÕÍ;Í^÷¿ž—ª!C!$oÄõ­˜®~­h>-ýºÝþº]j$õàûkQS=jø×U#:@£õØR9¤oÜlU“ªÆµ¶U5âæ_1ógbýëzëûaígÜH¤Õ×Ôõ¤6µ³ø~&¾Þ˜s+x!ëdtc&aYôÌO¸MC‡J®OÎvÎÃ×ûŠÌ‘êzs8²>u$<°ÅÃãÈÅ̰q|\FAÄkŠM›¢ÀÓ|&s€If íhL:ƒA§ré$>ƒL¤ö¢z(&waÓh#l‡E`Âcté lXîÌkæ4Ó<•qN>?-ç¯o ·–§æf8ƒ\L/pHd*p‡,ÆŸyf½Ž]if#û²Ø±ìöbþÑ.ºu•o-§:{(.Ĭ­»ãœC^öªÊ1Õ¯Ôù¯äÒ1SÚ!Ì»TÙ+ùó¡èaw$µ7ó´3ó|!ÏÙToÇ‹9§ñý@žè[@$£˵ÐnÅ¯Ïø5Ÿ®p¥.ÚµO;³ˆþ;’Ñó/•ky‡æí@u{,®øåE—¢qkþ}»ñqmúŒ¬Ö=æ‚×\EÙ˜jnUéJÿëúø+rÓô7~¿¬~§Z±J|÷ëaåûn£ê]ÍúTE¿ééRõt:÷p"hÞ™>béõ¹lp¦XlÄÕèðˆÐx–úƒüÕðbÖ7™ ÉKAeÍ%Ï«1yÞ1ñJ+¡ÝÌÕb>$ùH©?^¬‰Ý’OñëÉ–hîA[{Ñ¡ý…¢æÛӱ냟b<²Î ›GŽ`÷ÎhÌ#>jò²`‰BíÁ°¤>,‰ÜG"wz;H$l¡šDÄàû±=´± O$“¨‘I'`ˆT6$#0Éáqé,&ò&˜#|‰ŒÐXL*Ì€)`©°Xd6­Ÿ5" ïNœ‰ØŸ¸pgªût©3ùÛ¥¼R–¯Ô§¢Q~$wþŠœ6ýæïÄz=d®ºT­ØÁçµáóÞ\¶)ÊqÁ&~;œ;•<ârB^›>GõàþÇÝaóZߊ/Ƕ¾bÆßQy=¬o^/ýН7b毧½fÎë!CóÎü tr|éWîêŸÙ«æír+bŽõçÍÅwb¦”Þùõ°ú_ÍÃÿ.n}^ëK(îw[1óÇÝò? ›ðFÔ^ ¦ÓÝ×Õ×Õ†ÜíïÅÓûh´^±ÐÖÙÛ݆°ÝhƒM\‚âóh4Â`Ñ`:"âa ‘’#,{”70Ç` ó8ÉàŽN syÓÃlûêì“Mßš½Ý_|ØßÍ=œ o²F|£ >£M—¾’•ƒKÕëÝÏ÷ÓïŽÀh~‡ô5Ç|3"©Ú¥Oçòúµñ`´cYîP˜ «÷;ÄÊŸ‰Õ/¸›?_7~¿îý•:úŠ.5£ËŸ±ƒzxµì›+_iÒÇ’JPYië~ËÇõú¯Øæ—w¹áQä\ µðFɵQ½Þÿˆ›«aõ×ÍæWbµu·Ô¼ ºñ+¹ùÖ•CšF`£~®ªÚæÝYÿñ°ò+¹× [ê ”š‹¡‰ÚÓjãe m7~Þ˜ÿx\úLXRvS*¢+†­eŸ.µw«*K5¢©„”%·*ëF.‡L÷r1Äž1k[(ºj^EæRòx,J9Ti·"ã–¤.ç%÷çs"k×¥Üú´M–>“¦²·‹…›ìáJµöx&{<zäô+ kW64Ieôôtõuþèî. $jo? qô‰!—Ãýd:à!,2 ÆPÙ šlÈhº€Áš€YL2Œ <] `ó¹\dbš™`ÎOrXý4"‰>"`ŠfØëÒÛ–ð!¨À…¦ê‰$³9T° €RÍ{–JqíçÛa3l­,u§²n—üYØý}»\>–ãÚêíZÝonÆõÏbêL–ò龞·þ™üŒ×<¦Š×ô=ù3yZ¸R‚ûÜŠ[ëè:s½Ã»Eïv%iþߪ–~5lÿx·}%¶€j7ÿ•9úçÓÖï»­¯ëŸÛh,î _/GNÿzÛøù²_¿;kº¼[¯ß¬<µî×þz?øãù°u¿Ôx4ÿLo}߬UóÏBõb®«Å%õØv3jhÅeÐd=ª-»W%/Œ¯WâØñø³WQðëVÜÒ‚s±äÑ»vÊç 9ÛD> (&EŸµèˆ$ÊíåRøêe]ÒŒMž¾¿Ÿ,¼]̤À+@ð,…© àýa¹ZÉ:UÀ,MH}ŸüÙ)Ž[EWSäÝAÒMÂt žÞþ~\/dh'¡Ï„ÉChíi?"އ ¡™´‘‘†¹,éì°fndœƒN(bÒéL>‘10T:ŸÉ ˜Fƒ™ôùÁ¥w6n“$V'ï·ÏÛsï§¢¼G™¶+^ÜŠBH’:›{qÌ”¢tRF|ùÏÛƒò‰.}2_Hè‹Þ¿¨{7{¡/ºÕaËgè æ4ׂ’ÆãJýé¢Þ©†4ß1k#¾ÒDg}nµb[¡Í ,ÿLÖ¾„ÖëÉøíÖÐë¥$åžÎ{æ2nu>ÞÁ\k¿’ë_0“úŸ7›`-}\€\ÿJšÿ|:©ú­™ E+(i%Õ˜¶’€ï [Z^YÅ?_Žk Ã˹¸tký|Ü­%ÖªAK3¬.å¥ÈR5rR¿ßk¾¯×ïVK}Ù£ÉJŸWçž$·§€a¥ûbÎ+©Ýì6C+å8ëšO»Åi·<ãœO]ÞN…7{¢È!ÐóSMŸrÖ¯MyMi§¸à_]ë mÞ§K»·0ë›Í…Ôúl:åT¿9 ¹äÁ›Íx2ÍR\­¿ ÍÊþ^¾ôñ ¦è$,D'õ1 ˆM£òF¸ tÃÐÈe¬24CŒ1=@SN2ýžk‘m™Ü–ŒŠG8>—Oè¬5‘àÒ8u{%KÙÔ9§)ã0ý suÅKÕþðúPT ªKɵrh·à7±=›-Ä_«_quÑ©Ì^ÊÞ/¤ïnE%ªýŒÑ¥Z|³~³ÙŒ›SÇÂØ27ë™­½ªš7ÖªO˜7çÒßž=¹æÀ§.z Y§âÝ5ûæœÊ8ôeÿn1j,&Œ7¸ÿšFråëfïçÝÞGt½•XªÄ5µëµ¯»Ÿw–?së•®¾îZo‡Ÿ¯'Ÿ·›ß'Üÿq·õÏûßÑåÂõâדùøÜíÅ̹(·ïÇíföÿ¼_ÄÚŠ­5<òšMTò( aÁ ®±jtñ×­&&¼¿¯„Ù­¹ôîXîj¾èç=’¼Cþ~¨º?Ñ^_Jo·®y×Ç‹·§óOvQÊ%}½œ}:šIÙ•Å 1fs-dœ“o®±¬GZöjË^SÖca}uªžìÊ›#ibmΣ>™å8 ŽŒë&’@ w“úûHhã„í%õö‘èý$¤·"ö“q8rO—‘Ï:šåžyæ!Žf‘òèëææ“ä5BdÒ†˜èùcÑ$íÌ2œ<˜­;Õu×JÑ­«:te»¥ä0—. `1—üÊôöâóÎbby,~"¨¾ÿ|ÜΟˆo÷GS—â¬CZp©ŠUÁ®Ê9¥…°¦žØi&ö~kÝ%k&^e\˯—ó5¯6{©}w«jáÍJ`¿àV䮤ésåËžôegá~gúæh:ïS/Õ¯ë“׫ܧƒ‰÷Ó…W—¸”0V¢Àz˜?b+Íèêgbë×[¿kÈJÓoȹåïK-¨ÿ¾ÖüºÞø¾[ÿ|Âx¯à7ÝìL½]¡†ëweÿ.ÿñ´óëvùëmF]OZkIkãz ý ëµÀjþR—:V&wïBŠbXŸŠ"llÞ®~ƒI®ÕºŒü1¼_•qªoö…·Ç‹±­©Àæ@Ê%){5ïç·ˉ¬OXö£ÇÛ —ªü©>ïUe\ /ó‚Š!K¬ùëõJtØŠŒ{þÅ%y·ë“ëóåQ—†kbÃ#X2 ýè¤b1¸‡`ÐÓÍ}Ýd,®JÃÒ&£ðáI:}arÙŒQÀ¿OF9á“ÑÓŒ$,µ¯ŸÂåÑW‡c‡¢{·þÝg@O(ø4¨FõKëIɯÌFÅ¥K펗‚²ÚÝò÷ÛV+²•4,:uôWÛBîÂòt.)Õ°)c7¤œ†¼M\r‰ë1Kë~õçËæ¯×=޼}¾ì’–ܦèúWÄú³|Ķë‰åƵ¢‘Ð7cƇåVj¥vk.‡õ€ïêQÓG|­•8h&@ÕŸQñWDöy·÷\ÿù ù3eýygn& Ÿ7ÆŸæ¿7þx:üÇûå¿SξÛþx9üºßýŒ[?ÂêzXYòŠ3'¢èª x2’O*¾oŸ cëý ~K3djt57ÈD¯…Ú­ê×½¥~¦x9{³Ïg 倮èS¤Ü3ÚnUÝ+{9œŒl³Á’¾ÛŸ{v/>œË}Æ™ÄÆÄëÕìë¥âñíDDrÎ5_ˆ)‹ ]Ñk,ù y,kŸ-;¤e—1g—dìÓYÝåë•æõJúx>Ý™qÇ.ä#ža„AëÀv¶ww£L;;;~ôvá°$*Ž‚ …L"˜t¤Fë¢ÂXˆØ ѰР‚! Q:! ‘2ÄcšF¸6 /v0u³;ønŸ­DŒ_7ÛÜœ}ú×€ê(ë1`ö>"öª{ãuw:¹3úÐWýú—ƒ™»ãéw§ááH“8œ9“dNóçsY÷|>¬¬&L˜¥ìÒÒbH]Œ+!1`Ã逸u½²æ v´Ú­Õ†ªMQ=U4î7ãÊb@÷¯füzÜýçÓQË­.%•4ïœ+ÊpÈÑy—` ”9›8k›O_J#›£ñ-þÓþtbgúÕ¥Ì9U·G7ž©÷ÀâãÕüÃåüûÕüó¥0u.ËîÏÜì '.fò>I`²s1ÐûP0áõTzw&}¾œ¿;œH‰=Fá¹pð\>`eÒq­$'S @üR)4 Nd 2ˆL ŽB±pê? ¨íÝm‡(=îG7– 2GЧ«­›#Ãó•â= Îz Õˆ¾þbjÞ/7£æÏǃÖívÞ¿˜Ë?ï~Þ]Vü›oÇ É£‰W·¸äÔd=†bp«äQWbâï×õzdýíR§ÔÕâÖ&ú¬ÍZ®ìÖœM]ñéêÑåÆÍæwúìWúEÅ»õ§M ?žÿõ|ú™ÜúŠn´"–ÏÊæVDUŽÐa¯Qe=¦kF­µ¨±Ó7ãÛ•Ðz5¾Ñº9øˆí} çw>ÿõrùë}àþ¸>fùLn|ÆÖÊam*¢úxÙûJ–\@?˜òQsxÛàzȳ˜®1Õbò’O’»T¥/d/´{®0T‚K55o×¼»d©«ùëÝÑäÞTrmܽ4Ú›H.Ï\oÌÜŸLßlO·§®Ïfo6Æ\fÆýÉpÉ5[r «nch$¯8ë–Üí/6DÞý™°mò)(zqÊâ'¢G§,ãTeíª§«ÅÄÕôõ…ðùRôæZŒ-ÏÛfÆ–Ùlúp÷èÌ¢s™,Éþ»©‹Ô ÓˆH•Ô!d„3Äd2=0 D¶—63Äu¬Î^_ɳ^uÉ­I]Jß=‹?o–þ¸ÙøN3lA;CF”°´–}… áÍZh½ä3—ì&@…E»¤èg½@.οÛ3'ÒÒá|Ñ&ʹ4¯‡ Ïgs¯ˆ¥×ó…ÄÉÌ‹_^ÈKae=n­DÖ sÉ'ÿŒ«~Æ­6ë‘çƒÚÖ-H½_Ï럷& o>öªÀ„ú俪旖|“Í{ÙŸ¯»^¼Q!‰æ•”^tŸï–ï[å7«ŸQK-ªhÝjš×@˜‰@Þ}Ü™ên}n]öt(øºWÿ;»ý´fN2néÇãá¯ÇÃÏ8ãgRÝŒİšâ¹©`3½êŒWòîW|úªÓ9G­Aúr±æÑ”/%/§“içìëÙøÃádáJü| Œ…÷x¡ Á‹cêÍ>ûä)½Ê«I#ÚµÀ#ZúÝ6r̽ï-øuƒ¡Í¡ûã±§ÓùœC—wS<=à$ÏoÏgoNiŸ |sòh`i’ —‚¡ŽÐ‘¹A®pzpN<8³024ÆG»zÌ LNrG8f1O;ÃÑβf×%Qûp½f(•P”ÜF°’[À?׳†JÈðõløý¼ô;¹[=ZzÝQä\²FTÓLHV‚¦ü‰:çÑ4ÞŒ׺&º^sΡÉ{ µ‡u`?ë¡ÕÇ õƒ ÜÙ»]ù|(½;>ìÎ¥=Ó判àÖ—#@âÕ¢›¥mÑ6y£rÚdp3¨«_-]ó¥²’–ƒâ¢CšsŠ›Ú¿ž>¨e­;k)䇤T×#è4œfÜÚº>¬'Öj1SÙ®+]hK§êw›ü5 |I>Þ÷ÿgÑýÇÃV#n¬8üY«;dUŸú#Ð{¥ŸKùt.ÏÞݘJ¹Ýêµµ6”ݪ‡Satg"±5ßÞ¸gn“Ñ“ÙÈÅ\ør,x6te`_. ÄìbïÒÌñ4ó`žq¬áŽžåá3ùÀ©‚æY¸ñó7’¸¬èQ¥còÚƒ¥´¾Û”÷ `=KåÐFƦ>?_ _â×+ùÛÅüÝÁ”geâ\1±2ÂA Á4sA8(™.Î/gFG‡x„…gÐ!ÆfÀó\XÊDF(0N0ÝÛSåµq»ÑŒ¯·Â› +^ýWÌTOhK1é÷³á¿KÿGÊö gúL,5ƒ€+ µðjáLS8¯y¤5ïBÞ§Ì™×TúVÜR¯d½šgÇâ‹Kž ªË~uέÍGWJSùj¦R6®-å„5’ÿ½!lJ)ߎ…/— 9ÿb.´ðûvã?wçßñ¥FÄPëJžy`xËnCÅkV¨³4âúæƒòóqµ[{wσ‹_IÃçäû^ ˜·î×|Óµ¨¼WV"1ÔµPwË5—ê#ªûõ¸ñóaéûÚüý´ôûéðã|Ru)¦o¥6ÿùvÜòZ^–E63¼¥íÀ¤,OZB÷‡¿“Ë¥K­K6º=Î<‘/…´“Qö‰³6ЬÏÒl*¦aVòó$G1Ê]qŽ9»‹œÿ@È;œgzWG¢G‹É³ù—+õãÅâ“wãü¡úÝ©ÈÅÖŠ‰ÕL@öæ™HùDé &ZλU9¢ÒÄvæ.$c“ŒþN6ÊY YeûzáÖ¼`~pH44,PM ZDç ã±¥ñÉa‘ͧ³ÝÇ’æÓRóÖܸ^ùùzùuoiD„_šÏÄJÕm®y5M¯°æ›«WšIk Hš°´š¬DdÍ;ÓWÒÚ: úëù¢éÛË_©›×à^íe½ÚG»äÕ©È» gò^9ÈèôéBÁgª>,7î‹~CÖ®NËr!UíÑR‹£•Ÿ²äSÔB’ï»?6%”€º_úëv»î”f“Å€¦æ×6ï _wÆ·%}9›‹'—þ¸^­•äkICãv¹q»ôwÏ4m3bÎ]ª³mõÞÚ|^û.œ~<ì—bÖjB”s+²S *Qs,TªVÕãÚÆ‹áWÞòû@Êvóú¸p¤yܬÄÍi·äúBsÏvGºáS)÷B:p"bìÍA[dyˆv ælNqe]H£,²¨ÚÆÒ}e†±ü:*úy¯¨èW—o¶‹î•ü±&u¥z÷Î×"ª¯Øn͵\ó/5“Ku§¨t® T‹¿Ÿ¶KöÕ´ÝPt*ó—òª[QnË=SöË›×æ?·¿bËõä3±ðóq½•Ü™þ™YH›³Oüz;ø|pTbe¯%bï¨^ËyDi‡"åÐ#ú º± 46påªê™*¦ÎÕÄV=¸\r.¡ûÒ Mh€ÀlåZÜ|\ú~\i­©mYÐ4äÜ|pμú%™ÈzI5 ~Û›I(Çl£üý)dy–¾LŸàÀSLê$ ^šáȇÌIˆÏ§óxì±Q‹ÈÄ!ó¢‰Ï· mëc¹¨¢5|DÖ?C«M—¹ZýJl¢®BÚ0Ú.psÕ2k›KyUE¯.ã’æ¼’zHYêÝV ,yþbáåd0},¤_Lµî4@m–¦jð²¶7~Ýž|ÞÛ¾ÐGoKŸ™Ã:ðé~U) ¯ñ6þ ›?Öœ¯……­°î+jhÆôõ$ð¹€µÍõàB- ªx y¿¡þjH›u-fÁZ ªêÑ­R`=w±Pw/ÔÜšBHT¿úJS°Ë>b[­ÄÒwÚôûýðÏìů°´¶¾Gß©à¿_ÃvEÎ?•½0g åÐìP\·Ëå¨1ïÒälª²KS 1©|ˆÊ€ QšAh3tš”7 e²Çh”6e˜LV"ÇVö]H˜9ŸÞ“>; ©Ðbíe©ì3½í+ˆÃÆü™&ïT”“òïÅí΢m^0D¡ÂäŽËòˆLà!dð»ƒcãC£#ÃSCƒ¢©w±q¯rjÇ “þÝù  ?Ÿ%íY¬†µ¨ú÷Ý_w‡-ðb@¡ü¸ûùpþ}»ÛŒ®æÎLY—®è0ì Åd%‡ºÑV#µàJýn½è’\S/È\ÐHéÉ»ÛPŠí~ÆO[¡­Rp-ëCkšÆ²êS½»5•ˆ¡^jÆV¾n,ͨ±ÝhD·*þ•rÐ\‰k¾% ^ÊAi%j¨Å—ZQ+:k;¤«ø¤ù¥5ʼGžuÌåÖFr·umýx]~³Ò-?oV¾êzX¼'ð¡€m+w`«Û×J'ÊWÏtæÚTo×c¦ZXWM¨?7¿â+¹½‘·SAöf©þ|RyXÿšr.eÁo fæé ašA–³¡¥Ahs:˜ m#›Cˆ|q ½Ðþ!txˆ q¡ac˜C× #‹dˆóñDNa„HÑO²ŽdÜB\þïòa=¶Zð3m*°œr©S—ãyÿt#.¢ñÙ>õêŸqoÖgØ |7‚Å#ý$jÂxòÌšžŠ&fgFc,æÐ¦aÀk™4Œ"îáí¹8íÑ£]a÷À_j¸,e oC«•àV¨å YöX•¿’fÜJÊn¬E‡ùÕ®|‹jÓNõÛ%ºã—‹€®Ì¶½–ÖÜú¢ÏP›χ¡ζ‘mtǸŒÛ•Fxµä3Ö£ÚZÌØ¼Vÿ¼µ|Ä,¥£¹ôù$°·uïJÎ7[¾‘•}*€¨Y·,P£ŠBP\÷iKM!°”³O—‚ ¿özoáõRòt9òî•]Úç}AÆ).ÚTE‡±äÿ=3E[ ëks1¼úýzô_w[?vþ¸Ûýõ¸ôù¸ñ+sú3d¼Yz=—d½ÂRTVI˜êÛë°°[ Kñl::[8“dlò7€E¶É_/ÛÝoó‡ga“*eA*"áÑ×EÈÊ"CNƒ$cÉu„Æ`“葌H0‰D‚HbÓa.fÁ… þÁ³aè`‰çÚöŒd½î4 sáår\Déó™4ê¹VÇNTƒ«ct9aÊ$ƒ9Ž óÙD@çÒh8Þ@1wˆ5ÌgSú á(kEʓٗ;óïqs#²ÿ]iäUŽþ‘_ýùvñu,?Z¥Ÿª¯Û_÷çŸÑí§Sí‹KR¼‘ç\†§ÝÙ×ýÉÔ™èýx6e›)ˮմSRŠoÖã@B/ÕAŒâÊÏëï¤ù3¾Z>’£u&·ÖÆÃNëÖÔˆj“âÔçýò;cÝ¡}rks·–¢SQ°Í3/û³ogsïû‹/²g»¸ø—£¡÷+aúr!±9ò~%w }úÔ¥èÉ9›qk#Û“—¤36žvª>KæX™Ú“dÒª@–k‰•b|½]A+ï7J~k5bn>­ÿ™ZýãzåùHs{0 @à;yÖºÞyÝysñÊٵʩ–§B´DÖ®‰\Œ<ŸÛãÈ4£‚qòšb¡½Û9thAËü‡éÐ4hIîÃàq=d<±½­·­«­³€Åú»Ûá<ÒC¤ö0ÚUx…{5îÕ1ÿ¡È·5}iž8×°.waÇÌÍÞÔ‰`À:Ç7ˆZSDg zù4*µG…t,2‹É¢PœA°d†8úÉñðèø{BÀ¶jø)ÿ::Š(jÎïækWš ¼[ÿJ¬ýº?jø—+çêŒk²ÔÔ¦JT[òofݺ÷KYþF•õ*Ó.iÙ£x¿~:.¹aͯۓïävÓkiF4_1k-¹ñy³ùõ¼õççÇOWs,äíÓY×D!¨hÜ®þº±µ|ÚFH^)²Ž©—KIÊ&Ë])›ÉõRÀ˜ ¨SmÖ£/Ú-¿’šÜ¥øýRôr8õx²ˆ.‡¼”å/´/ 9EÆ·X ÎÖãŠçí_ÏÛ‡ÍÖÓÚï—ÝšGYoþu}ùŸ‡½¿nÿãÖÑŠ«¯šjtçþxöñRšnÔý{Ù3`œ™²Ô‹×[­Èfű”ÞQ†–G½+Ó¡A@5ë§ðaª€öwñq&‘Hé ’Úˆ ~€JåÂÔ!2L ±qZ'¹«‡†í¤áÛHø.¨ ²ŽIgÐ)L‰ÆÄãHÄ™9Æžubs’¾#†÷æ6/Í#'’áK9×k^Ÿg+øÌi 2Æ¥‰F:sŒ5 Â'Ò/Œ¨†‡G¸ü1®`˜Ëâ#Ðà }t€A ´.Ú ›I®WÂë9§¡ùdùWÞþïüá?óŽÏÇ«_×Ë_×+­—ãïøZÅ®¬Wò~S.D‘¶˜¨‡¶ K÷ûâwP§ò‚ТòdÎÿ¼ßn ½ñ-÷ÇŸ»ÀV|'6¿­äZëv½–£ŠÆµþ#¾\hïÑÔÆjD½(º$¯çò§ÓÅ‚MWõ«óeÁmMÛ¶’g“¯6 êþÜò§KtSâåj.|<ýâ˜O‡Vs!å›W“šIM#fh„ÍŸ·Žºw)瞬„(kƒµt³ßº[k>,½l5bêk%¨Ï„fËí‡o=ïZüãå¬ì’eB²æíVózëãÖTôËsYíÉô•1¶ž5E»ùé}N}{-l=)Äý4 ⣧ªÈÄ„`ėʧA#ú8‚(' ƒÊƒð¹êÅ‘{¨=0¥@$Sè,ÜO'c©…*@èƒ4úBž§ÁƒdÒæKõÚ˜«jqë×ýò÷óÊŸ‘µ§Ca.¨ÿ?ÊWu—&z2QòÊ+v-Hüj\ |ЛI˜ç†Ðò-Cöbâ PmTVs‹…ôÓyÚ¡HhCKêYà¢G’É4„ÇF”"æÌ8—Ãà2†¹¼ƒÁâƒÛM‚ûÚz†ÇÙ\ϧ©Y£|„ˤÍ ,}tˆ¾0IŸ¤“µƪ?Á€™ˆÖGb0©3ÂäB½d>FØL˜Ï˜f2ЉLÖ0Íã!0 -“…~å"L&•Â'3íWS¹ÄVíæøûñàç½ç#´WñLŸÒJ¬UïÖ+·Gßo¶ÏèQÅiÉ©Þ.Å/îů‡¥bØœ ¨Þk/§’›Í¹»sií]ûµ´šÿ™ò5½[ùà( µ:0ÂQ蘆áÕç=+•Àj9,Èt,ଚ_[ ¬´â¨ Šhó^I`~Lžò© çÀ³hªù•þy[š²“Š— å­}6çU§]óù ´äÜz_¯?¨ÿÊß%и]ûŒ›š‘ÕVx£0•+¼6TB’ºSU J>’KÕ€ªy­ÿ绣\ªÅ5ß¹ó_÷'ˆ¥.xøóz¯37ß´_Ù¥?o?"–ÏgÉ?ï¥>I3d,ºõâûáÃöDÆ>_\·S±½müD%äÍŒ0%c¬Ñi›Íb0i¼ÁáAîä cn˜3;<<+Ð,ò¦Ñ)HˆB00Âá ñAèYc\„‚PT:K"ÀDd˜9'` p˜>•Ë¢Ž°éÃl&‡„£ôR暈N›¤Í±™óÃ\ã Gð`d’ǘá1fyLÉ“Ρ!€p™\ÂíèdHfyÑQÖ¹–uèÊ~MÍ+ÎüyÓ6b'¹²d·w—¢jB[‰/×#¦ŠK“·‰3Àv*Öé,ãQ½‚¯^cΫ,…s°Xˆª¾³û_Áó;ÛxÖÍ«…5¨©™ßúʜՂ'÷{Æœk¹è1¿îò>IíQY[ZÕËÚXÂ>òÇÓaÔÊ|\c׋[¿Ûw{ã­‡¼K;z8›»]›ñŒ=:”͈áå`¦5ÿ™Û+û&ãVÁõ± Rüº?k¼ïÿëÍ[òòWÚrx®YüL­×âê´]VNè*Q •­è³³ÀNÃ7V÷ëëQÍ¿{_ÏæŠ]“Þ™}ÚÖn7 sêT“¶ÞÝ’rH^¸”½ž-<Ï—c’—ÄÜׇNN`Ó°$2¤f1èL6LшPYT‹Æ¡ 2‡9@±ÒØ6ø7H)“ÆfÐùLΓ ¡3E‰l·Ÿ3Íæ0ÔQošÀîì!ûh˜´Ù–p²>½¯åŽÑ˜KúAˆ«_â,M/ rMSÌÕ)–’OÍ11½ŒN LçprcBÂ,uÿ+sUž–#ºgŽÿˆlܯ–ÒÏ-:޶“ßU¿ï+nÏT¯—†|XÐ2‡z™É’KXqŠJ~YùNõx.~?¾ž3~ÕçÓÞó®2mWeHnsÞíÓù«ÅŒM]sh¦¯×%/ž™PVW’·=E1¦ùù°÷r5^ˆ(kÏú²Í?“å}òꓪîßÉ*ÞmÊœm1¡*©ÊöŲMüx6R@k’Í¿Ÿ®>ãÖBÂô×ûꯥæ×UÞôßiןg_ñFÐøÛΟOòjØ ¨üî@äÚø§yQ>| ¢BZS!ãð˜\>‹@—E£±B‰ä°ú0‡F‡™ý=Œ˜>ãñœ91Ã2:HdÑ.V¸›Óƒ‡Û‚ÐÁ¼^5Šh¢ë2Ýâèj|–+FÆXûjÁæø˜ÇçGH4à cáŒÑ)clÚ0á“‘e4ñÇtC|áà ‘HåPCN9¸“¹3ÃÓ¡´’\ûãmãÓwœÚSC5iü_•Óšs7åA‹sþ»}]Ö))Úø^ÄÓ2Ô|ÙoÔ¹ ¹×UŸÍ夸’Ô×té+ñ«GWhê7âϤ²r6Xõ3¦¹Û”E,Üüåt% dØF%ÂýŒJ ^i&¢Oµ!óä­eàùLT½™üÏ›RÐNô·Q!"™@2Ì"ZfY's\vcfÂD*¥­kt˜¹6/\å*FXòa悳¿*’¨9›ŠÙ¹Q†Ì08‹PTëÜc«@7Ê–L²S|dhŠÁ˜„•&|V0B§Ò’YÆúø ÜG0QNŸdÊ™"þß}XˆI@·Žò*¾bxl”1ñN8—ÞNey‡õÅ¡! ¹¶nO–ìûÕßîŸñÝRP‘>Ÿ¹ÛæÄ.‡nœ³þ‘ȹ´¨Ð¹“=—¦œÓÕ[åWb9ã1£Å~‡†Â2íS~Œ-¿¡Ôfíš\È÷ë žÅÔ±¨–”¿ïU\Ê¢KùîÒpÿŠ©#Ö±ëã…g»$u4rJîN§Ÿ/&rgòûÕÑÄþtx‰{{¶òp$³×ýRÚRði³6e)<“w/f/dY·ª•2 Ê'âgÛ»M’ ‰*@!éò‹¯+‹7Ó›%ç3ÜÛù½‰|`©”•\²JÔ„ú÷ÝN#®ª<ŠaiíÆòUð§÷ åÛÑÂÝ–ðýLÒº1½{f/,Ïò`R70„!‘zÉl2I \™£ú6YÁÎîÊ莖+°IúŒŽµ´Â•(Ð ÂeÓ†X3HÝýØ>Kd÷b¤)a¦f”¡äqelÆøÃ<Ï™é¡ð 4L™c1ULÖ$c`fŒ&A84ƃ‡Yð>484H–4H§S ˆW‡õœA ªÐhø°Á@»‰Ê?öZ!}þj.Xù¹ª_îÜ‹ûdæXòìÿ¬äúG]öéÊWºÔ¶ôîTúîUï U¯°à\¨%¶>bË ¿ü}ª”Vkq]%¢nùÌu—¼ukûWü$ëÒ—¼{9ïB#¾WKj _B€ÖMy‡¨^+zR®™ò¦ìT튢ký~m>y4Vðοû%õ‡Ú™úæ\¼êwD[ôkó—¦Ç3 dLu¯&ï< 9»µ”4F”Õ¨ºèRùÍôë~þj¤õ¼Ôºu4£Çµ¤±um©ú—óniÉ­­¸Ñ–‰è$—9©,ºEE÷ôë©<±%|9å½2tŽÏùBñ ЫðÎ-ÎÝ+žÎ•Û“öQ$q>œ¾.¢{mP7™=00Àe“ðDñ(M=ÌáàX<˜ÂFX`-m҆͜„ QQ&])àÏph㜡d~ލS¤D¶4,£Š©ž`‘ –B1¤˜š£OÍÒ‡¸ô~˜Ê€!03 ˜Fê!õôP{zH¤vV?Lû#2!„΀zˆý¸žÕ1¦™?¸ÀæLÓ|ZødñþДñÈËÀ€D-ÍÌÙ÷óú??ÿñ|øÜÕï·íÿ®Ù~?íU|†ìábÒ©*>˜ 1YéX mÝ)µIß.åè9šó¿ËöŸÏâÏ;Ió@˜>yq ó¯KåøIùv¥qgùL+qkÅn(8Õ¿o¶…Ì¥0•æê9·§G›“HžÏ%Yt¯¼â•¥/´wgªÇ]Yìd2pÊKœNßžN?\-d¼²ÛXåÁ\r+ß\sŸïÎ*:{E\¿[®—+^MѦèýx>s±Õº?ª…޳ž…FÈÒŠhËOú&pdŽÙ?ß-e»$휯¿» ‘Ý‚[‘÷ˆªaý×íåWÂðù¤Îèãv½ä5¼;o/x§swG#ÏóéÀܳkÚm|òŽéXx"ŒôÀLˆ üÎ1©ÙŽ¥ÉM9wq%@ØdhdlÀleé„Epé“CÈègd€3=Ãb°¸*• ý ÑÈ@O)Fcq Ë >Bµí>µ‘,‰ÔA"v [ÄøÎ^"îÅP5†qdj ‡Ž>„™XßEÒL ËØÃS¬!Bâã+YÕŸ«%ç^ȤøÒwr¿Ø®„¶Ëž­Šwõݦ/… µ¤ª•´þ;½öyY>7g7å1ËÈ«KRˆIÓÎ…’_ñÇíQÅaÈ]Éž7'¯‡›µã_qOÁµ‘w€TÒ†W„q›¬Ž> 4U–ŠCS)/h{¥0ÿVq.„ …+UÁ9—÷(^O )›$¿Ÿ^Î ïWúûK)º1eW¿È#‡’ü¡ˆ>ƒP5#–ZPžvk3v-ZR3”|šœ[—ó›Ê!3Z‘$}P›Û›Ží|ÄÍ :¢®4gÏgó^õû¹ôåL\ºÔ׫ÿ~^¯ºµ±]γSYŽî6ƒ+ùKÃû†øáL»T>œÎÇ7gŽÆ–áÇÝñ=ŒÅA2:»€Z¢ÐGé›EgSYCQéd{€±HíD šiD" ‡îá ÜCEúˆÝ8L'žˆ%âz{ "ÈG,‹Î§ëèÄöüèëÀvuôâº08BžÒ¨}=Øž¿Ûîá°XÇ‘!á T¬‘(§Ç†Øô~Æ(Œ„ö)—¾ìSU€»÷«Zw‡ÿ³qñ×ëé÷íÁ×ãþ?òÇ?: Ÿ¯“ùk Ú+¥oÞªŠÕÜñìûÉôë±,TÔãòúíÒ2±O÷Aú\”¾’g/$¥€¶ÛéõJóâ4•#ë¿&ï—ÒüátÖ©h%Ö[/·¼`—üŠîíÀ„J öÅ¢S^õèŠ.ýë•úîbñÑ#sÉs^Iů¨DL%¿¾ä’䕇º–ý¼Ö·®W›±¹¢Gž ®~Ýmüëv­\*{u…ÀÂ×ÍÙw|·•Üj%—›ëÏÛ³o@ÐnUÙkÈï‹sà·Õ{ “-™ ²ÖTüº‚ßT ,U"ÆŸ×êfT\ˆÉß¶&ÞÏéžf"Úñ=-÷twHÏæÐz(L"‘ÔM¤¶©ÝÄþ6h< C¡´áimÜ ‘IB¡»´uö’€‘éìÁãâ)]ÄÎÎþLÚ ƒÇà,Ĩ‡ëÆô÷w1ÚÚq]í¸¿ç€£S–ÛÚº1}XÛÓ×ÝÙÕŽv’ï¶á!:È\*¹tA“¾d„'è0D7o þÝÚùno|£î·—}kõÛzl-LºYm%õ7 ËaåÇÃê¿_ßÞ­ÔöðýÑ|Þ!)8%Y—¤W7Ó{ußÖëæ‚eÂ5y™ÿwýèóÖRh+!90³Ù«å×#Q|s yÌ/º ý N]Þ»Z ËŠ>e!(mDжµˆ`lÖ¾™q‹AmѧÎE¤¯ëòÛ­¹´c>oW¦O”ñí…¼S¬w5ªª'v*É¥FØ\uèËWŠÜålÊ­(‡M͸õ÷Íy5°òP”ï—+×Æê½¡ñdk=ìüNn|%Ìõ¨©°|ÝÒWš¬m)<^p óNS#¢(ûäµ€)çžÉÄÀÎ×ÚÔÆdÖ;™È¦yÛòˆgsòR Ɇw†É$‡1€÷!XKcÎÔF84ˆE§±: FVÓI$È-Gaõ!0fr`–†ë¡`::{»1D ŽÍø;[»ÑfzÚùßÓvz;Ú‰í¬Î¸Þ.<CÅ÷ñØvtL^/¦‹À'! *mdt`rš-*f‡F` f(&ŸN—žÎ •ànói¯àZº;Õׂ‡ÑÃ_·»_·[o—µ¨Èæ\ÌÒ|°þ|;n]ïÖ¯­© Íý™0s6üî˜}w‹Êþ“Fdÿûa­|¬YÕ§N@º)²^Å›s¤ü•äébááB’¶««~U „ծ̻¤ÅÈbÙ+¯Ú49›¤mŧ.¸€ŠS½íKòs1nÎ^)ß:žÅ,•¤q£©†ÌåÈF#±QòͽÊûƒ©Øå\éÑÔ 82GÚ7»´Ò6»ŸIKïÎìOçÎQk=¸V¶ËJQÕÏ×Vd)mŸ}»œ üî‘ç"º$ø¤«µÄ6ÐØ¹+qÆ9“·i a XÕ•„´p-~?<›|X׆¥^ÙÝijíL˜‡¨ý$dЦ†,&Ã0a Al¦’0þ{0+Ì Ãp'"Kî'!àU2BÙMÄ\íÄ£WP@0¶‹ÜÓÖ Úцikëmoïý;¸ ĘvlWW_†BøAjoëG_iÃ`: t~+BCM46 ¤shB9%ñnùÿ~®G¶*!KþèÌÚURS M×Ó°®â±¾:æžl“e¯¹æV7\j ¦ù‡óÅ”]hÚiÊÚ¦ñ“™Ö«¶y­«ELÛ•úÍ~ dAÜúï׋†Óøv:]ò«šQyÉ+ÎÛÔ¹3eölªÑ6ž62vt|F1*Ê»‡3>åÝÖtüx4——жK⻣ÉÇÓ±‚S•”×ë!U#¶Ü|^e´©+e%lþ|Z®ÆÕ®_ýˆ|%ÐA¢­ÔÊ×ûÚWþì#ãhÞÕâ«Í8øqð2×ÒtH“>”?oO¼ÙõécíÛÑTÚ#ÌDYŸ¬r­B»úG·š>CáHQ8—”ìâÌÙÜÍùxäœ{©Úç/ó˜Sýd˜øƒ Óø„Þ bŒä3ËèÇ’ðXR–Hê%ºH½´t¶± ²<ŠïøíèêéìÂ`zq==½]?ºÚÐi,]èô¶ÝíÝÝ]$J×A&tvLñáQ¢ô‘á¢l‹ï§ú4˜Í¤„à\ÚnY>Twî<ïëßýÚÏkc-j©&Œ_É­ÏÄf#´ÝL®}=î5‚»hÅéÝÒïÜþ2gu·.ëT>‹îOfžŽ…onÕ›Ó\tiÊiéJ—Ù·¤Ïõ9Ÿ*íÔäC›i‡åÕ!/Ge?oöZ7ÖV`¥t¡)y¥hïÊÄZëñ¨]Ê´9·äÍ©y¸4</Þí _ŽÆžf³þ™J\“ºÜŠÏæ2EáRõz8Ÿ¹š/…åÕçõfÄÜŒY[1KÑk.^ªKÀµ¡‡å92ãŸ.=l–‚›¹+ù˱9z8û0bæbÔT{\®Þ­>Š‚Ë‚Øþx>¤¬Ý«>%Z¸åSÞ¯²n·Æº»sÕ빬v»×ˆY?’ÖJt½0œË÷VYX6´Ë—/e"ŽÄ%# x€M¥‘ 0@æ^2 ×ÕCûAÁx* CëÃñÝ$| ßAèë¥vvôwuötutµ·÷t sëPøB©Ÿ€!aèø^«·Ÿˆ¡ôvb‰ý>úh€20Dš¦Ãºjf`farI”^R÷<¾—N!Æ4.—?ÄãqØc ^,dú}Ÿ‰Ãû˯ÛÍŸ×[ÝïýñxÚJìWƒ+%¯*ïž/ù– çšì‰"w¦ªºtÅ UúTüp1÷p¡y»RלšªÇXr[Ò.S&nü×ëÖG@“ßZ-‡7_l¢—ö °Ûãy݄߯GVKUH¦Ðj3´ÖÐTuŸ"s*¹Ý=ìÍ?Éíºä¹ì€ƒ]Ò¶ä7§²ŒSž©+1ÝçóFɹv¿;QL®´Ï«—’üéB.¨©'ÍßIëÏÈjÞcIŸi_Ï vmÉgÌz%Y÷bêRöz¢Ê\Èàd.åï—êšg9ç4׫U·í«Mûx¥Ê‡LÕäZ-¶]‹í\–Ô‰8ï3—ýÆ’GŸè+1 zÊ!z¾˜|8›:™Øû ,v\SuëÒ§²×ã…¬KV (+AY9$mݘ¾n· 6E=,ùJJ>nw«¡å¢g<ã?ºÔ™€,ï[*Í@EWüú•¦àU<ê´C’v-ÃârXZÀ¾¸˜Í„$Å€¡ê_*ûõi¯.ï2¤mš”Oš»–ƒê”MŸv(óUýÆÐxX­õ¯‡3aígAàÑ |š‰ÝA® ¦t#C¡ö@#䤫’` !“éý0½Â€ L&e˜B£#$– u‹D„H$×OìÆþÝ‚¸ó£ ßÕMoïããú†{H, ŽÔÑEjÇÌõ&)TƒÌ#cÇ`ŒŒL2è\:Jìûñ£d}{gÏNLW'žÑ\ÀxˆÅƒ7wþð¿²û_+M÷fÅ»Üz:ü™:úù¾û[ýˆ›>_6þHÙ›‘í,Z†´PöNg¯„o6ùí™"¶!Ž¯Í½: ¨¢¾ÙiÜ®âºÒÃR1´^ð¯–ÂûY§õþtüþb2í4TcšZrˆíŸ×GõÈI.ºÙ¸ÛýJ4B†b@›¶©Þmâûã¹›#ùÓ™*u!{w.¦<¢|LnÑoÍ8—ÒU)b.„Ì•ÄÒ×µ95qNÿ|^ùïüáçÍ~5´‚[Oœeì[/š÷Sõõ¦äöRY}Ø«E­%×BÞ·øæœJ»§šÑ•šw)ç4å®4w;³7…òµ²ÆœÇPpš SÊiLÙó®¹”]r¨2àuÀ#~sÉ¿žµ-?;”o^ÅÓÉ´oiòP:ªf1ÔQq@SÙT:‹CãqaLfaè(ƒ Óé0‹3éè)¹aæR Jo?è(`|º{~”Lš%ÐFzN/•Þ 3°0»—DÃàÈ=8"†È¢R9¬~˜‚Y§ôb»;º0m?:ÚºÊÂtà8dtV)bqiȆqö×Ý^Öf,G-ÿgÍÿßÏç §¾è0å]Ë¹àæ»×”ñë?ov둽´]>x1j)Ä´Ù€þͦ îŒùŽç_"šRØTv.çl[oûÖ°~>².È4æ½Ky°6šRÐT ˜ªvCÝc*‡,Å ¾Æd¥3ÔƒJ`a^ìÒû YÒ&Î:ã3Öb’ŠGY´o—¦’s¢à—‚²Vtí3yZuî¥O4¹¨Ó–ÏôÙS}9hn$7Êô™:í2¼yÍù¡36|šÇÓ…È– }$-û”U¯5±ú~¥,Ƶµ°¥ì3|Ýš?­U¼êŸ¡å–ߊv‰®W¯÷Š!}ø2¯6ãR¿ªÞÏà}îÎgÓ~q#l|=W c6!+¤çùµ‚óYxc˜¨e!£$„ÒÓÏ ÷²˜“@a’úùlhŒ Sv?…ÖO¤÷RØ=èC;‘B§@|&2ÌFØîíÇ·÷vÕô£ÓÙGnu“Û{q]m]]mÀõõþÍÅ}í½„6ðA=m˜î¶~lG_w;:+­3< ×ÑÇ@t¡R`~ÿÁ¥âÿVöü¾YiÆ–jуJtåëÞü3½úWþð¿~G–[ɵßw;ÍàJνº³6|Ë©ùÃÁüÝØc»\æ$Ïf‹>s5²T¿Agš<ælTW»Y+xÖ³gKy§!çY*W7+7kß7»ŸñÃjt³~»Û¼;)†ŽrNYÅ1]¶I^O„·‡c)»$ïÕ7"[ða1¦)¤OûÂäÞèÃåTίo]/ÿŽo×CY·!ëÔ|Ý®ý¼Þ)95­ëïÔE=aIϼ¹$e÷bÃ+ö õ?^WZqU%¼TìÝKE»¸‘–¢šëC‰ouÚ}8º˜| OUïÔ͵6Ù®¬Göz‰vKÎØ€”’< ïOæîfŸŽ'ž®Do~õãùBhc,¼9á5^Íñ´LFo_± ËÂX0… !l*ÌeÃlbÉÄn2p4Ì¢’؀Ĕ ¤-LPµ¿Ðõ¿ƒÕ†%µaÈm\^¨¥ýцéýû6§¯­ߎǢs*Û~ ãG±mý]íø¾ؾ¶^Úõ‰ÞEC˜äÍõ©ï‡`Û«IpÍðvÉ®*ØôùcõûÕ\:0SK®5žv*ISÖ©+ØuÀÝ7“G­äv ÉSUhWÞ>ŸˆË~qÙ£¨x-•€¥ÐWn–Z‰ÝZà°š<(‡€ÖV}«õàN#¾YlVý›e¿Èã|À”ukSîù”s2”WcëÐzÞ˜¨¬2Z'ÉØ4yŸ¢–T6cšª]³+Ó^MƨSûz®|¹’ÔÃê¯k``õUŸ¥`×”ÜÒæ­-µò«óg³ïǬKY)óžÅ‡‹é´w¾šçÜ‹×ËÓÍð•Qp¡åÛLÂsýÄ™‘{g6ï-ÍpaºŒ_]@•Ûê»s9ëR_þr%{vŠž‚ûã™Ûù͉$¾»è7_©x.ÃÀ†1@"1è¦`6&SÑ}?<¾¯·«£§«­½¯«ׇëìÄvvöc1T,ºµ?êêÂaÚûºAV¢ãr:€«õ°?Úú:Úðh·Û¿ímG['¸º`0]}˜8tFðÿ5X¶½»»¡H§`)„¾~2ÈY˜º·-ùýæúpž”+ͻ寇ݾŸÿ§tøgöüûÆSs/W‚sÕˆ¸ÅjÈZ‰l4‭ˆ²âU¼ˆ|&T"¾zT¥ÐR1²T¾]ª^oTÑiâŸ)ó×ó^)°™q cýyçëõâ3¾] ˜Ë¨¯—^B†Ç+ÙËùbæLS²Û"©†Ð]ýœ×ôn—ÖcæÏøZÑ¥Ì:¤ïUÖ£-´¥;}ón¿n3íÂú˜²¢ÛZô©^âWû|1¬D»kúõ¥°²Y.»×Þ¯Ô)z\ôÉ¡¸¹†öž•ÉÀ2? Äí²ðpqdG1°)clŠé{Ræ©qÀµ=·Í–B²Ÿ!}Éeʺ´i§âÕ®º='÷%·§ÊÛSÙí©øåD\p®Ä®Uvd‡ç[½Ò ާ™KLd‡`zúÛº0K;0íè¾6jG;Üñ·Æ´õý5´êß[èæ!š˜íà›ÑðaÐ òÜÞÖ׎Žó8Œùÿ~îøiïÂtþ@S¸óG_g'ð^B7‰ÜIÅvö“:a|; P_ÿ’q ‘ÝøgÙö}»Òjš!m¸ƒ­Å·KQåNñÇû毇“zh³XȼŠç¾ó\ûÑqh@JÛ¬/ŠÜ¹¡zi©z Ÿ ÓWÜ\¢#¨šÑeà7ëQc-¤ÍÛçKNU+zØ m”Ýš7›ævOuw,~w‹^¯äÏ—âßtýÖð•\G¥¬ÜR ÚÛͦ}¾§y÷h5¼P±K²G’bÔúù¾Wóè¯7&oÎfòyæDóz"-:$›žNÅ·Gœy$å\É8»sL±Ž1÷瘇B¦eŒ>Ë¥ŒÓ¡14‰P'˜1L–zœcÓñÛ#×WÒœ[ÛècQ¼žË“‡‹×ÇÂ'V`‡í²”Sôx9ÿìš}vŒÞ^Œù6&.Uûün'„i#ôv÷œímëÔ lÏÜß{†]=h¼p¸v|g[_Ûß‘úߑڽÐW:;Û;@Ô0=x€ÛmmØÎÿw žÛôw`ð½ý}½Ýݘn<C»Êôý}aHC4*‡ ³‰4üH¬*æ6ÿ»áüóÅÖŠŸW=›9§îéHñnÓTË­Ûe X>â«5¿µDrD÷+iýu»ôûî¸á]É]I_AtN$›3™‹ÅjÈPoÕ£G­èVùT‘:—¼«…sSæD›n1 ÜÇ^Õ¿\pšPÁì´¾^(žÏ¦ž/¦3Mh3¦ìV½²"àkÏÒÓ©øþJ”»6•cÀ‹éj¡•²m9¹P@§9X A]> Ëy•%g7>ŸÈ_O%YÛÂÛ¹(±;î· ø­¼°ehg’=Ï¢ s¡Q>uŠAá1©Ã0u‚Fž¦ƒŠ°(È™e!ã,d˜ƒ Ò ˆJ¦Y4«„{fôoÝz„ù°"u,¿Þ‘\ï NE)›üfO;½ÙŸ [f›“O{Ó “ ´:~{85 kyG!¶÷õµw1½Ô^„ÖCgô’Éäq*u˜M@@&ýÝ~¼­¯§(^4j ±íL;jcöýÀãÑUуiG¯nÀÒ`% ¬ÚׇބîÃv÷Q€BÝD%P Øn,¦OÍ`O3˜:±Ó!™‚ŽÄ•sMÎ¥+Ý-7Nèæê :¦$i@ ¾ßTôêÊncÅg®Ý,ÿÌýU»ú#uZô.çBêÜ™üq_’ñ›+Is%*T˜ëþîB BÏwÄVkÑõRp%Ü-†6Šž…¢ORôëŠ.UñøÖ¹»ó¹»ãô4KUö®5ük9›öÝ)ͺå©sùõ. Íݹ9z0ws1óîB£_p ³~]Þ®MH3Wš<Àösñûéüóùlò`6¸:aW ‹˜–Yºf‚) Ã4 •A‚8d5˜E…hÈŽ–¬ÐY#—ÅaÀLð"f0ûf?DÇÃ0 ¢j縛 C‡*ĵ1üæÒT#ë)·öúl•Ì,Ì¥ ¢™­úÔÙÓé竹‚GRØóò×õ°¨Y—9ã2¥ ogšÿÁgh©´”AJzÐCsõÐR=¼Z÷-•ÎtE‡¼’沬_RõY«NÃóÅäÍÅè»s¡èÔ€·-Z3Ñ~Ôš¬S‘¹’¦mÒjRV·ÎaLƒµ§ªß­•ýÚ¼mxX¿±Ö#êbhµîÒ”½ÂøÒ¸G>x.çìÏqTlú8Ž6ÔE¤R&8èk¡ŸÝO`ˆlˆ:4Ñ‘~¸—LÁC BÐ)œ4&Ò`2à'j?Ž‘9‚É3<ÚŠ˜w¢sí̆/…7G¢»cÕû™*eWÜ_*îÎÄÏç9÷\ñBš9‘¾ÍÞ‹¯f«ãc\¨‹ïîeõ÷Ž@d!ÌXäÀ«È—¾Éf˜8°€™Ìécôw‰½P¶ƒ%÷ ÐJêÆ1!Œë†z;¸”~>ŽÀíÇ ¨$n?GÀA}8‡ôã°8Z/®´ ÓÓÑÑ÷£ߎá¨<2Ì¢Á˜NªRÏÏÄ4 n¾ IËçù+vPõ¯•<æŒCñêPdíÒÊ­îãæ¸ÞüN®~EÖ>ÐRmkÅmÈœ.^oN=.¼])@*zmœˆŽ5|ã˸À<Ö2÷¤ôC)ceй$b¯MK¹ƒ4†a :é‡hxGÄwÉà"àhT:µN‡¨|˜Î&Ãt`R"QX Šx„}¨ž°¯NÝìϼ^-Ôãò¼ ð¸øáBöî¢}ï½Ë»!w%;?ª£V^BBîƒpm“@•±©ÇCÐÖ´?H=åS×ÇéKØÀƒ,l’™EÝ…-<î “-ÀS‡û)*„:M%L ؈2HƒGTÀ#ÓÃd‡Ìîïc $®ŸÚ×MííëiÛK#uP ÖÞ‰kë¾iB†!˜K‚€íµ¬ê©ÝŸ7§yº‘×Ãò¨ h¡†WQqªŸ®F³nsþÊX°éR~y 5ò–ê½ñãÚXŽÒ¥ÉØEïAÞ#}>Pd<ÚVh¥â6WÂëµða5hmÆ–Ý®µ¢kÙsé³c!’üë‡1u!É¢E E—¸ÔAìœÊl0»´îU\¢œG\ui^lbÀ¹ùSSrCq}>—½Y,ä)àqlC9—°Ö¾Úd¾Õပ3‡PI½xDðéKÐæ4]3Š,/òíB•Ù ÃŒÈàP™¤N ®—Hí¡BdˆÓxt&ŸAb0¦Yôù1dbå°&øŒ2‹Ž¨ÇY›sÌc9Ûµ"¸>šÎ;VJž­¬S™ J nYѯ.¹UŸ6ŸâÊü…"w¤4 ñú >LÐ Q—Ð"ZÑ]‹l3‡¤P6`3‡¨á’e¤³ÂX$ÒM¡ý À]8t’¦‡ÔÞEBËfÐǸ]€˜±Ä^Ü,ÑáÚ Oΰ#W ŸM xŠcÅ›KQMè~Ævóní»m1z"yº’o &w?£[øF è×\îRò²¿øv.»9\HnÏ]4#ëùKñÛ)'ënâþlüæxôùB˜uÉë ïœêŒÄKZpH3gó© qÞ­®=n|…7 ¶©B\X½Wƒ—±èÔ¥ìâœKš>SäëïÇ*ÿÒðÖ"KÈ  AÔ2™Q…†uj ¤q.¶&èÎåѳb€:ϧr˜,‘É£Ðp$˜Lâ°GøœÉÖÒ,K=ÏÒÈlå}ŠÃg²FX ÖÈ™`sYb]?HßÕ°o#ŠÏ÷ã_·+@¥—¼ÒjXTõé NËÓ¾4¾6ò¸7û|n¸Ý] Äx:„§òéÐ$Ä…h„"e’Æñ˜Q}„JgR× I´ 2m"‘H|"f¦wS¹$ —@ec , i€Jç’¨\*:Cd‚Š#ôà˜ý¬þ>‹Ãwôö·uô¶µ÷uc©]86‘*„issŠÆbàÈ›Gã?Ÿ×KaUöÆ9Дʯ—óªc:q(~¸Z̺de¯äoG£"¹|e-6Ëhri6…Çó¥àúÓ….±9“uˆê!c)$þÇëæglýΩIû”õ°PäÕâÍ®+ùuï§r¯~Ö¹ýêœ;Zä30D QñèñFÐè"™FljΞ˜¥C´<†„M™fRçÚ3ð$&¸Kd"pYÈ„À26@f0`1†Ð§`dFÈ$@ÍT*‘ ©$ð•LÅ÷S¡^¢€H[Ó÷çî/f3h]½¹])£zæ|Hÿómç×ûÙ«}¢D7¦.$Cf„-¢0¦ ,½ Ë%c‡ §À!aø$ò •Ägâ‡ù´a&Y€ l …M' Ó9L¨¡`Ù0–ã¨X,B!"0™ HC%ôà‰è¾¾§ûG__¨ëŽ^Ü^ ÍÝX&wÁg„†&"‡À5ÓÓ¸¤wî—³æ’<ž4üÚæãáGÒò+h|Ü™¼· ¥=3µ˜®êÕVì㥠±³.••ˆ¢S ?^Š_.Ï‹¯s%²[Zó~uÞ.Ì]Èò‚¢s:ï–½ÛŸ/eOÕ›Cûr)¿¹”ÞÛeO¨+ÎHÿv©Lĸ”¾lJãûóO‡sésqãR‘=†w9ùKåë®äö5¼y§¦ì\+Ûõ÷û3±Í¹„zd¦Ÿ2 ¬Om§B0­¦öºq¸ *<BÆ€§yèñd>ƒ3ÃlâÀ¸…âQ6mŠÌ2i‹$çQGašŒ‰¬Ž°D$:¦Iyô˜]t›ÿKAU%²Ü­7ý–÷SadK˜8¤½’lDs³3Ø´éÆ—†øtBÛAÁai8LÀá»ðlÀ :Ž wb1}d,™€ÁQ°à°$L'¦§ߥü@ÕT{7HÒNb[_{d+PM,×\n7¶‡ëêæGWßðãs,§ÑD0²#ˆ>ÆgG½ÓÿãÝÒŠ*ÉÏøF+¤­¹Ö5äüËÁDÑ·P ZáóŠHb-PPÕÐJ5¦)º¹ÙÓ©äé\ß4&ŽÅÏvÍ£]’ èKw뵘`o6€Ö`Æ|îæhÈyÏòp`süælæöhâîhªàZÌ£=º³Ù³Cÿê–§²”{4ã5½_¨oŽ…×3ñÃñ7Ç|Î)}Þ[x9_È$ÅÑ}…G,`‘°@ä°Ñ1 0 A4\$™?DeÒ OÀáÐBPG„!1á‘i‹M&òªdœfeë†Y[2D-ðiƒ4„‹ú8ÙÃãÀS#´É挀%—0“¬…ú0™¡ÀËD¿m´™³þ~ØkF-µøz Æix?²Ü9µwŽ¥”Mÿ|¸_Dµa „Þ.R/Z¥†í©×ÕÓÌ, Jôñ¹×Ó†#¶uà{°¤öþž¶î~–ÁÀÑúq”^< t2ŽÞ‹§õâa nÇ‘;ðäN°˜û#Ƶ·cÚ:°mmÄ‚Åé"Âó©dL'~ídìÿ|²¹–K6méRVõO5"êjМÛŒ&y³©ò!u)a­ÅŒå€¥²ÔƒË@ÊVýêº[Qu+žŽDOÎżÏ0³“{cO§ oç’ü…4oSeö&ì’»#ÕÍîÈ£m*ëP= oo•áÝÉèÉäÓùP•é3ùëéâËàýJÚðH²ÛòÄ!ú&)—äùDz·5ë3MÜŸ¹¢lÝ®§ŽT.5¼/T޲ð¸n:‡Ådá %R)T¢Â„LDHsi0½ŸÌ€ð³tÊBâ`çé$3)Ð b0©ãDJGý‡HçS©<•SÁÏòˆ8¢ d€JãBÌq.s– V2ô'™dnhm{“ùˆüW`¥âÑf¼Ú´O²)î÷FÞÝ”SšöÊß½›ÏWâu‹ÑF"ü½£ˆC7 ±ÄX2†JíÂã;p¸><:³ƒ#!¨OÆtÑ{Ñô¤÷¡KÀt1X¨³—ÐÖ†ëùAÁPÐ3½x|'×ÙV¹Ývƶa€‚b¶A4*ĦÐG\‘Bì£iågU1ª)ßXŠÎÝÔ…¦ê3ÄåÞh*b‡yäþB”v)‹m+²òZ®ß˜ÿwUCE‡èíbäöhêîd>±Å¿ÛÆ­¢ÐÑÔó•2—ÃëçÊÃîB:(«:U¯'’ȹ4}1ÿâƒOýz¡Nl-:–%©syÑcLÛ…¸. ^´-fc—mIgG»H½9õ/6éóÕì›[’ñmä"ÚÈÚ„œÃÆQ˜:Dv–ßßË Q™DúDg0a6¡‡@Â’ð=D*ˆ,‚«"Pé,:˜šA¦v·Sú±,*!Ra I>Ãf ðÅ2ŒN²8CúÌúŽ;Gç€÷çr•‹Ü¹Ö ‹†'#,>X"¬i"áLË û4ÏqÉãåäÓ¥xów— å“çC+5·$ °ÅiÊž¯{ÔÓÛœ¾Ž>":,­§§cЦÄv<¦·§ç ¶¸,¥ƒÈÄÂØžNJOÔI&a©0¶—†¥’TJžØ£uàhX,Û3@%3ôòð»êewuv÷a ©)à´C¸v°„úéýH?™Dn'¼Ø5o'K‘þ»W cÁ½^òè³6uê\ ð3¹7yw¹ð}£.*ãGÂbDV™ »ºˆmîÙ¡ô/‹bÇÓéËÕä¡üfO±LÄw¢¦G–³-¾„WŸÏ•Áý±ûKÑó™.åÒ§€ˆ å¸üÝ&.Ÿ…wÆo/•™K£ÿHtœ»–ºÔG„¬â\,ùörNãíÚÀ#:îj=oÝìŒíMsz©ml šˆÂæ°YÆÂl:HTb"d¸ G¢ü áûaX*BhŠGxt‚!:ŸÅšd!C@³†™0†IÌA˜Äár©d2 íQ€Gˆ‹ŠA £ Ii<„CïãDÇãIÂqúòè`tyÔ»A´éë (tog‹i‡²–[)?­•}ºæýFrM¾E§öü Q{±@A=X&–̧’˜XéèèïèCpd6†Ä!“d2Û þ/üß^Äsƒ¤i d²ÌÁQ*ƒÃb’ 4.“¹29È£RxT"ƒºp4Ìé€X‚IT*ćÇáÀ;Ãô>*BE× @ObƒS©µ‹Ð¸›ŒkP/O†ßüÒªCŸ¾”Å÷äï;üûmöíÅLÆ­*„t•c9µu%ãàpÓ\ê0‡4Ì ÑÉ“Y#ª!d& Ã$ƒ4N&1‘i˜Am#1qT×ÛÓAéÁQº±D\ ®–Bë&SÛ:¸¶~|'Û?R;-ƒúA÷–À2ÃßUõ0XâÆ2ýÿþeÿ?­t/ Ž…œG¿\}ÜŸ{¹?ŸÏ¼\)ŠmÙ£ÿÿÔô~mkÛþ Á¸J²ÕöÖÞª–änƒ¶± ¦·4H%ôz:©@ ½œrß½ï¾÷+ó›¿u–ÎÌpôI|ˆlKZk}Ë®<]þëñôo‡/»­/ÁíáÓõÊ_GÃÿûõä_;ÃÊŸ'·Ï¶:Ÿ¶J÷†ßß/\n.»ßžµ¿Ým|Ý(þ_³ÕüëIãêo7ßG?­TÎT/¶«ðE›÷«Ý—׫§;îç;#_ާ~ÿ´ùk÷þ—îÃ{ÝùZ‘<ÂBBœìciˆ+BHYžc‰'L vㆮ”“´ãÐ’[feÀp+®YðÖRÃU½œV4oô¾ïB´>YÓ„QsÄjÀ\ÀÛT#Šªiüe#dD9DõÚœâÄùvN/ĕޅW¯¤ÏÞÏüŸÇ¿ï6þ%¨ fe&„8Q (,óaàd?p ‰ûýa– ù}}=},áX¿¯Çïóù}‚/(øü~_È× ùBSÍäæbmg:wcx`µCwrmׄ‹U#Ìû­ÿëhãÇþЗwþ|:~ºÖ¹Üúkoö?æ{0ýsuî×ÃA¥÷ºß&þãëÌG~Û¿úçë› ¡/×þ8j~Ýl|z0üíãèÿýaûÛñ¯ÿ޾[øù¬ûóhòlmèËáÿuxç_Çv?®·O¶ïwZÅ[­Ë±ó­ÎÙnñËVþÃVãreìÅzëËþկϧÿ:Zü¼2|¹W_j)õ´ìjJL D(¯„æØ ntFÌZ¦¦(–@(Ð*!\,9ãõäRêúhf¾=8Jë3©›ÕþÑ‚[u¬”®©Š ‡%™øÿ]óP¹”¡#+š®2ª™R5Ó’Ý+cyiåÓSVÍÔdYÖ9þj3{²Tß™H>¼Vy¸Òz»Û¾8X|wTûÏ÷¬O«D4°®|€“Ũ®¨•¬’UTfȱ>F yšp:bDáü\Ÿ¿/Üúÿúp}õëëóùúÀãÈ~Ù éõ1ŒÏݲ®ö;j¿ i¼<Ú¶&’RŒ~X8ØÈ~<©{kãïÎ|ۘ؟¯~?þëåµÿútó¿ß_ýã`ôçjãçÆ õ·ÝéÏwJ<½úÛƒÆÓ¥ð˜?šŸWjï6«?6«CŸöÛù¼Óx¿×þ¼1ôb¹ó~£ý~søëãÉß§~î}Ø,ÿ<ù¶sï|³óqsîû!œ0tv¿uz½þz5y±ÛþòdòëÁü×õ/;Å_Ïfþëíê?oæâ}1):ñþú“½ýÞ.Λ¿(›ZÚ°$x!Q9(Ь›PLÇ1ky³êš’AS6&Ž:š4K¶YMŠ#¹E=­IÍTG'Ô¤”j ’)a‰æ¸¶Óïèk"D%‘c´, ±«#ÍÈXD·¿€D9òÖln¥Úh‘;y{={¼ÒØ«ª›cF®Pˆ}!¾Oôú@·jfü±>oˆ…¿À…ľ¾€/áý<ù|½=>6èg¡>£P¢¾^e YÌhjYÅé´Ñ5Є©¥AUr+&¸Z¸xJ’ ä’†g‰A¬Öá£ê¿N[ÿ÷«{ÿ8_þy0úë õÇnö?Žç~-µ¿wÿõî꿞Ýh¿ßþóáÈÍÿxpóãfõ·£ÖÏΗ­äåJíÅ­Ú»¡¿N@O|ß›ÿãáõ_ûíﯻ£oV;oŒþ|<õç«…»ÍÛý†¾v¾<0|yoøÝj÷Óîð§­¹Ï^ÃÔøo» ?÷¯þ~´ôesör­ôe·’QA»¢&•…Ú –dMÍ¥ Í2%˜IÃq@1T¦6a(Y[ó6É6±N,›¨Š)A !ŰtU#¡Š¦AŽ Tš ª‰âD£ÅXÀH„¤0UŽóLŸ ð¸"nŠK×[)­Ý¯udZŒ#—C£YñvM™Ð[iåFZº7@Ök‰Ý!mJ'e].ÑXaÝÛ²÷[òÍ­è(M°Ê’$Ï'bXéæ‹Ù\Šn¡x7.˜> ²«_±]KÌ#2¤iõ–$ÜÁXéáãQ&ìm“‡Q‹ ßcHéArŸ¬< TŽ)Žº0–~ºŸû?¯Æþ±;òôjâã~û_/7þ÷ë‰ÿ~wóÏVßo |Þùýxô”ám÷·§Ýÿýöʧµþ³ü»ÚåöÕóõâɽòþmût«ùé`äÛÃÙßöF~lt.wËïw»oׇ^ßÏ}Ü©}Þk¿]ožwo ]lT.׫çk­Wõ³åÊë{™ó­ö—3ÿõìàçÑÌç½Á/Çí­77jŽAdLÍÈ›ð`U \¡Ï؈£’à ˜ ¶¼,rRˆc)‹0ëm|äÙ#‹Ø‡|ÂX3¨ª—ã¤8ëä^ÙÇ€2dFfý<ïq==œ7+–‹Eå€_Ì«ºIÔ‚kÍ[†Â6ãíÅ`„†¬µm&¥ ¥Ù1SžÕb 6ªÆÅN‚Îé‚|g@Ü™0o%´iSœsÍ©„rÃT»)áZÍ|V/ÜIH7ŠÊUK¹šTæ½›"£eu&¥ßËÓ®cŽ»âbš4½¹œò‹a o5ΗÝóõ¡gw›Ï—ª+Uˆø‡Áï“îLœ/žÞ~u£è-µåãjù×SÿõêÚ‡WÞ¯O¼Y©~ô6Gþ¼:{v»ýqkìÛ³?¶F/VgOnWÞ®¾íÕ®7.V¾>šÿ}>üb½þt±{.³Þp+Z¬.ñi*MfÝ+®î q‘D"G œ}‹ P¡ A–â<¼{e^b¹hÔ‹(FâAÔ[NZ f•©¨rˆ÷Öð¦¢>’0& OY‘ˆ ÖÔ¤im­^À7g³×:™™ÉÔÛ»Ù£Aky,y+M®7ìíâM“ÞÄxÖÁWlÒR¸{eº–UªIùþ€¼èJ#˜½ZA{}¹nL[Gœ' åû%ívÓ<¿?pØ6­Ã¹Ìó©Ô^ŘH)[¹6¤lŽûýÎBŽ\qö‡rQÉ“Jº0¨‰RKÈPÁIHJ”Åslœ‹«Õx l_Ê2“ ±Á¾åîöÇ[lh×Ó¯6ÿùbóÃöÔÉFçÓNûÓjûÓúÐÅÖÐÅnçÛÐëð­î—W>l½¾S<Ûè¿Xí|ÙÔ¹|P¿Ø{q·ðjÓ~¿ÓÿûöüÅêè§ÝÙ¯»3ßt?lŽ].7ßmTßmÕÎVûßmU/×½íOƒ¯îVnÏVŠ_Žºÿupç×ÑäoÛߟݼ\k/•µ![Ê¢µÄñlñàzþl­õìjóvɹ^³vºÅÍfvgd ›Ô¯9³y}xÒYš.Lìëµü ¥·Ö|´%¤ ðTY#–ˆ $[J¼ÒËEÁºˆ-ꪉ¼]ײN'«U’zRO P½AQ]!;u{1knϦV‡27;îË{Éã)c÷š~Ü4›ÚTR½;bÞLÙi Oér›.gÕ«y|cPoé“ýê¸K¦r´f¹¹VÒÖJ‰¥ZveÈ]n&ïVÕ;ucζ'e2åÒ™”:S"·*æ­ºž¤2¸<ô÷0fIe¿"‡„¨_ŒôF…C`§‚Œ$!ªãœ©ç-­[Òi-kƒŠŠ‘Kåª,OTÛ×~rã-üsÿÊ·½¹/û³ï·FÞ®×.·ZvjgÛé¯ûÿ8è~Þœ}w¿ôêFáɵÄçïëÓëÕã+É—ÛõïWíŒ_l•?lµ¿oµ>n5¾lØ}¿>úîþèë[…“+ÎÙrùâ^ûlµñ~­þæNåå*œ<òu«ûÛAý÷ÇW>í̞ܳžÝHÎ%¨Ç4F2.¹Ò4êÚtݺÒT¯ÔCÚP&ûé¢VM*#u³™3jDËë¼Y²E“€{‡òj%%ï` JÑ›hcßþâBX’1‹$^ŒÅ8Œä¸Èb†õdi^?ƒäÍOU;ÃÖ‘ÂTÕZ™Nß(³yµ…Ô¼£.—Sò’ùþ4ºÒ!i™+êÊœ«g×o)u×(è’ªòiE1 T4ä”%”SÞråçZÆXÍ)›Sic<§ÍWÕV’‚û.ÙâHZ°h!­ukn·l)!Éïõ†¼®„p€WàüfÓýQ‰á§y ðCQ›:* ¨Ä“J\Ϩ:Uñ ƒ â0r5?~à¾|Týð´ûëùȇÝñKàÄõêÅfûb¹ýêFãäNë"»Óý°5ô~§hüa©þn¥óépúýþàñ=÷l³|¾Z|y3óh1sî i¾Øl¼Û?Û=Û{·6üv¹rr¯øq¿ñswøÍÆàåfíýƒæÏgí_:Ÿ›/WÇ?Ï<™J/äã.'X4ž4pÉ¥­¼±0à44e$›K¥‡SæTÅœ°®4RS¥d'kŽjæxŹ=Ô?™O ›É§ÙD+kF2¬²>–ôÅM(^ÞÛ«( ¶•ĈIQí‡ß´*“šF22IëP\úî}½”l¹ZFFeW,eª¬ß«ésiyè\ÜŸyv»õl©v¶Y?]«½\ªœmTÏW[§K­‹µ“»Ù˵ÆåêÐùrãl­ýã`ø¯“Ùÿyyç¯'cß4vGs7²ºA IÕòh}ÂÜëæ&3æÕ¡ÄZ79Q0†l½Y°Ûà[sÊí²1Y ¥‚ÑL«õ´Ú,ª£}±d-O˜+ ÕE*økIrÕ´›†VÑô!˘M¦:v¶•¢cyzظ۲¯¤ì‘¬µÐÊÜi§®UÝý–LRN©smãîµ:”ž«çêyÜ™0 "ÇbDhLŒûE1$ÈBDŽB4%Ä{ÛyÇC‚f1ë QCl<ÄF‚ `} ‰àpTEUˆK8¤iœÖh%}ŠtAPáÓ¢œÄ㬈„…x8ª˜˜OŒö b@À}¢ù°QF#MM´¯'€¯ÑDV™¯Ú·Òî[í¤ôi;‘WT3N 6ôî°~8‘Ú€çy'ñmüßOf>¬½X®¾ÛýçñÔ÷íñ³µ¡³íoÛßWj—©ª« (í¦Zßï6.·ÆÎï Ýz­Ÿ­.¾];]ï^lvß­ÖßmŒ~ÜófÑþûdø·ÃÖ—ý!oó.8â¡—7òSTHþ‰òŠ €÷(©´æÊÃI¥é(é:jŠ*Y;6.¥µëmkg$u-cvš—Å”l•D­“2;i­•SgsfÙ ‡Ô3V'eµÓjÍÖúj 5“xÀUAzºzÓÖŠquœ5T¨Y¬U,»žrsŽ*ó‚aëIkÔQ+„ÑEÑä‘TxŸ÷Åx6"D_lh4Är¡ˆ·JA_4ècX_Ì×ë„Cˆ©Ÿíó³l0 ñ¡^?FÂL4ÀÄ}W†PxNŽ Abb( 1±€ê"}±ˆ/î ‹a9Ÿ lŒÂL$Ⱥç!d)2œ&ƒ˜ôcÒÒiÃÐj¶šSHN'•‚jSñ^ó’p“†‰ºYŸÏŸ¾h}x6õ×Þõ?vGlÚ¬Þÿõdö_/nxå÷‡ã?÷Æ>o~Ûè|\k€…¹Xïÿ°Zþ¸^ù¶»ðemîåRãÜ[ð¿u¾ÙºÜl}Ûú¸Q¿€3ﵞݪ?_ø´×þýíÝ_On^žý°W{r·ØQl[–‰(PÔŽ’¥rQ'%ËHb’4èh’dž¿ëê)ZµI¹` ·µÛéÕ‘|3i´sæµþÔxÒ©›Öí5#YŠž%ZÐ9Ûj'Í~CÓîu¯ëz%œˆj­:ªchŽšÈZZ5£w2ư•ÈÅ5 ûÅi[.&® hóý´›§eR6e¨/žÄ1#"Fi^Òp<Á¦ªËbñ!–íe¹†ë“Ø ŽÇ²–˜^–…ˆ‡#ñ>NÇÅ0’"s> ‡X7ˆ5B"a)ˆJqq^k%d b˜6`e, %oXµ«‘$¥’£()ž3çâ¢_”Ø8$9–€§²BU*ÆN7{t£ÿÓÛ!oÃÖdz=¹Æöåbîýæô§í‘ߎÆMüz2ýg \»Xk¿3ûìÆÏý{ÞzP[ï7.6ÇN7ê¯×ªoVJ—+íwKCKƒï6—û£?^ÿãpñƒ××_ýºß~z½$²b¡pa6ŒCa)ù$ ¾L"×"Jœ7EÅÒi^ӒІe^—ã†,'lˆˆÄ ²¼ÆJÞ˜P=ò–ÔˆÇq<'´Šæ½)w³ã,Úïëÿuvý_/fþ×Å¿ºÿkwÚ›û¿;úu½þ~%ÿiwäÇníÛ~õëñÄ×½ÉÏ«µOûõóï×®|Ýœþ°Ú>_~¿Þy¿Þx¿ßx·1òöÖðÇí‘{^ÿþ÷Ãë—‡‹/¯V& „‚ ù˜¿û°x•¨Àk’¤‚ÌPxJ”—ä ¤+(­K[i%NŠBÈ–ÊÉÕšs;ïÎ8î­Fr½¾ÝHÝk¤oæÓ“w¦æ®O'w‡ÓSº3¶odîT’W‹öµZj¼šœ®™u[µT’€¨Š¢,òª¦“8ýA™ñƹIL*7¥ª.AAj\BQx쀜à‚áYñÊßëÉÏ~šª5%$*aQòB Dœ{cl±aH“ ‹”m€šDY&ƒ Ìe-¨(>Xo‚m˜€ì¢,$àmFJˆÈÆ(­H†“yΑŠM›€ÔGJú Ñ<³Ž“ª®#•È¢KÀpŠ ÈqA°) ^tJÅ–Ñh?Yu¶®®—JÏÖê§&¾>žý¹Ýý¾;úëøÚÏã›6G.wZ_Ž&>?˜õš¶~<ï3üe«v¾2ðj©ÿÕJíÝÖÐùæðéÆÈénëÝÑÐçÃ.”ê¯ÇÞhÉã+•kU+x&áÂl$Š’Eø·G'#„>À:!&Fx&¡IÅ,ng”–Ég\£’¸Öé¿ÝrÖ§œ»ãÉ;ÎÝŽz¥bÏÕÒW†cƒN h7£ÏTÙ¦9S7AßÎõ±¢6^öS5EóNÆ¢$EÁ_Äi9!È"NæY™ãXYdT$„iq‰øyx憌“;§Î!œ"R‘.êÄÃ*äÁf!ÊáPDf9&*qÆ„°ŒB‚‹+’dbÙÆÄF(o¢tl5µ9M…ŠŠàd&n©|5‰; Òqä155 ¬Äƒ Q6$¢"Â:¢«à, ê×´2Uë6àŒ–BئRŠ  Æ£*½i’Aƒ¤â5c*`Ùà'ëÊîBr}ÒÞ™H>ž-€¦útÜúµßüsèó^ý£×k0õýpþ×£éŸÛ#g÷ªŸ÷Gÿ<ºúqsübäSûÝÎÄÅÚÄ«ÅêÉòã«ùç·Š_öF>¯4Ï׊ß6^N‡¨à–ïcÙ>Žíùû;X¶‡eúÂL¯Ÿë KQF9(œR ˆ€NðúŤ¸Ë㜦uít?k[<_OÈc®6b©­„Ú°ÔASÍêS6-#©®ÐiÓVR[9OfKWçÒ¤÷‹“A4À*LXaD‘‹KaB@¤¸…%CñfŽ[21ŸRøºŽJ&r5\qpÍÅ.œÃ‰zHT#2TJ£¬Š’Òd¬ "@(ò&k&Ë(ƒÂ bª!ëXHé1¨&qJQf>#-pÕ"à«Ëšt5!ÞHÑÙ¹] 7RZ]QKr•nÂn˜VÕ²¦ËîõZ¢íªeÃJ˜£ŽÓM$&gÒMMº6pÏQPAU‰žE:’)’›¨)&¨š¤fŠšýi³S3çêúú„ýðNþ󳑟.þy<÷s¯ó~¿}ñ õew跃ηÍÖ‡µÖÛÛå³»Õw›# œ/ŒþÚ¿úukôíúÀÇýѯG“_ƾvߟ¾¼ÓºU¡YÌHl”õsÞ¬%¿7×›ë帞0 ʰOäƒT±â_°IA'e•\öÔ”–K®5RÓn+I »Y}"MÇSê|9±6`.¦µ…FâVͺÓ4.º»£‰Š±Z2o6´{ƒúµ4…™¢ ›–4êHà.…¬JƓƴ£ Ü2ȈI+:qMR/Ù¬1¥(&¾Å²ikTÐYVc"J8¢8#$@ÖyËôÇ8e”«± ñx–!lG£ ×Ò\v–R;£L$O„q‡ÜJi“UyÁÄBà c™É“+yr«¨-äÈ(¸Š ­ªkY“¶Ó‹C™éœÓJ9£iã~×=º’Þuo»·Ú©Ù·  Ñ †>iéUUO{;‘蚢Š×}¢©š©é¶¤cK(Ôu¥föèfõÕÞè÷W \ý~0ósüÏ#oŸ¬?ŽÇÏÿ|6÷Û“©O›³—ëC¶k—ÛõÓÍÚ›ûõó €â‰O[ƒïVΧŸ^l2(?1Žùû8_˜ós\o8ê C”>Жñx‹†™XŠ*¦È6hRÖ%YÑUÓÑì+§ˆhŨÄXÓ4›zû—•3ZÑÔRÉ%ÈHƒÊϘ£9}$C›i$h >JG¶Š&JÈRÕP*iRf!¯g“ZZÅé„’³hŠRG£K+Q<œGí¤l B’ÊIMÖeA×¼µødVT8‚’B‚ k1‰²‚à÷ƒØÕH  S6$G"*Ï‘°è­y$^âB,c—Ü*# ¬šÕ¤ª©´Óx™‚*—¥hÈC™oR¢«ZR%Sɹ¶íºpÛpÍSýt8C²¦š1ÔvR´´ í5X%¤!¤ÊÄÑ´Œ7¦HO$ú"(hBÄY ãöÃ+ÙgËú?g/·ß÷Zìt/VA^¯ö¿Ý®½;l_l\nÿØî~ž]oØì|ܺÜmþ~4ñïGóO¦*¢¬D8ÛX ÷1Á>“¬·œ]F¢bXÀaoÐïqnL$äíb5ŒExé©?,GxŠK‘¨ãTÀèŒáB}BŒÓEd©±æfpr„‹ÙS18¬8Bí‰i>^g`#çB½Qäí¨ló^ǰ®(@©J_L‰ðyMÉyÑ ‹U¤@HŽKJ4F"QÊ€PQPÂ! ®dЦЦ( 81ñ0+FEP¼RÐP 'ÀS a!Ü¢ÌÀEJIu’rÙTtY´UðÄ’‘! ¶"@h’„&!š¦&#I‘‘7µAQ¼•‰ü¨,¢Ä6ÆÓÅv"QIµ»œ7²µâX“ˆ7´S£ÞP koˆ¶Ló¡~c*•ˆ‘E@â…´Žæ*ÆÞÍôgÓ>¹ñópê× ½¸æ÷ýJã·Ý¡?½±7o×›gƒ¯–kg[‹ýÆ£›ßv¯®¶ßnW¾¿l\HÒ(X¶8•™0b#$߃ƒà¼z•qbdO[FäªÄGÂ1Žå£,Ïq1!&#˜ a’.ÃÑ€€ý¬ÒÃi|ÜÑoÚ ë øeTIвEË.õšv%à: E#HŒS¯çäInÓÔ(8èª O{‹ù¨¦kIª™P †–Ói+£:T‰õ‰ëº8+@ôÌÈ!* \˜— w‘*W¼áLA!ì†" CA¸ F†°R€ÅGœ€XP°'ÖÁŸ"¯¹FˆSN°`Ê’ê™Ñ÷ÙÏ&,ˆ!%ê—¹ Dbày½^fE6¨hco»Ÿ4Q³¦‰¡’ãÅ^GDU :Üc’|ˆòJiº@5O?ÝÇ5pØMáæÍÜ׃Ñß÷î5~mwþØø¹?ñu·óe½ýycòûîâåj÷ÝjõýzýçƒÑÍ~Ù}³Qx·Õ8_é\^o ›:Ž"Áp˜¼A˜ˆ\@ŠøcÁP<F\GBÕB ìõÙ1ñ¿ ,–£X°" A’×Ê* Œ&E…]**O4‚¡$y6 ,õövàUR)28 ®Šò^9“0ܲSV"cm@" ðtï° Ã´RY³VÕ‹iÓÍ9ÝHjņ™ËY†©ºfZ¢¦7P‹¸IŒ1T¢P TÆS1„„˜· ®Ð+ ‰ãˆ© û¸PH?Ûà ŒwD| K)ƒZ˜&ØŠPç’Ø ¤Ì% VvJ©$ØÃDz¢lO„ FØp„ ÇâðE! ¹“0¯Š¢At‡jiaFSFñ¶3!÷ˆˆeTL“'Žà€R¢QÀø'ÅÄëãöÏ“é?»÷ûáÔ_‡ÿ<šþº3ñj{äÓÑÂïV?\=]m¼Ù(î|x8ôõÉ·ƒ[ï·†ßo½+t¿8­°~abáèAq<ê‹E}Bo  s¡0ІÁþ@ˆE0ƒRÉPl¥ÄbðôP Hˆ¨±0퉄CáІBÞàF!$F{ƒlÀã¸OŒ6 Çü‚èóD/$| RÝû½ ÅHÕ¨®xÒ<ˆ!9ˆ‚gª“&ðô#<—BxüTÂIˆ¢¸ŒäˆAÖAŽzÙ’£™(”0ƒbaÂùƒ|<2 H}¾ˆwm¡0܄İ’gB|8ŠQǦiÃt±œ3Pø1a®NYª ^C„©ð„ ×Ò¹°ÄFà‚Ö/†‚r4²Iˆ`1" 0σ±Š‚Ý–!í©—qG1 "¯§^AHFšè‘ÉšÞ–À]rÜ5±ÁS©B¤ÙúÖÖÄ×íÙ[Ý/‡£ßŽºß@ôŒ}ßkÿþ|òËþÌçµéó»õ“;çWZ÷_7¿?è|Ø|®¼¾ß<½ÝØhfæ Z;¥p$¿ÉaÅke¡P„÷õq ॠÆÞ[T6Â|$$Bb¨7Üç‹…{bPY^³* Åca$„qî·G{ãbXƒÞ2,\_\ ÆTN ±0‹Ç#" $DÍßÓ)Æ”„«XŽ¡*÷ûª—¦@ PJ×C…lŠ0VpÒÀTç&+È£K‘ÈŠêÁSTÁ[‡‰y‹ˆ1œ Åü=œÏÇøLÐ_Ɇþ /ìe#= µë‹€#ø¼]c’ +i®©% *Á'Æ0ÆÞ.§`µõ +Jq9•¥ˆ‡ºè‹†|½LoŒí>Éa1†ï‡.†ñ˜_„Z†ÚtÒzeU’QP–x¥¢jƒŽV3@I5¢ä0±DÂsbFc­¾Ýù¾îuâó®Ö/C·Ë_[ÿz=ÿ?ÞÎÿ8ì^ìu~>™ût<ûåxæû^÷㈨úÛåòóÅêáDþåÚðÉ•ÚÝRj¶èÌd¬&¯õ‹Æ•!³kéH}|Ô'q>‘óGãÎ^ñ#KœŸaƒq>ŒP#€S⡈Âòj©}ûãÈ/b•ô[VRQ¦ÁÙ…1@”>Q RHà˜(˜V (;¢q$ªðD”´8ãž;#ÂäCæ#7²ITT°åc ¨Y8Aae‘•y^ˆÉ²¬ª*¨VÇ4]w¬D ©z hËÊ`’±!`i1ã÷{}!Ÿ?ô¦ÄÂ>_·~u("C7d^ã‰Á*ºÄÉ’(±>6$—õ€¤bH$Këç£~$øqÌÃ}’×€Šúý¼—j —û°ê×ü>ž<ˆb ˜ PIhšKÍ H} æ‚KGô|M³KªÖ¯éiS­<šýñaé_'[_ö¦ßïÖ¾ì.|?¼ÿùpærµs¶Ô~¿=ñeoáÃvûd£ñjsèteèõzû|­õy§>èõjçå½î³[å“{Õ³í‘ÇÃÙãnòùÍô³ÉÔF%q¬x8U9º’ºRq®çÒÃIÝ!ŠA0ç‰}ˆñGeø¨U*OÓ‘ ÆÇÁ•ɤ)!8cS Q™§¦jQ̙ʀEu^3¤¤€µ ˜PM5Vd‚²¯Ïçú¹Y Èbo˜¡¾>¯±×ç –õÅŸ¤ú0õñbëë“‚>Ñçó÷øØŸàëB}TOœ d"›v’mŒµÒ£#vÕÀƒ ZJ’!WijÊp‚vS‹ò€6ñ>Â>Ä{A§B&Zµñj¾l'&RæTÑØ¾Q™Ë¤*TïvœÙº=ÚµîN L–í¦î ÷ÆŽB16$1>o[ ˜Ç@¡C…Ul¦ƒ<Å Î ÉMLÓ2)`-«è ô몣šMbT }¢¦ ´±Œ6”ÕJ®¦°ÈN ÇûSÿýlö÷½‰ÓÛíÓõÁóÍÖ)q½ò~gàÛîø÷G ?ާÞ-·ß,·.׆/VÆ¿ ÿñ¤óí`ä'@÷ÉôËåúéÞì—Á7»µ7;Ó{c¹çåZñÑbek´°\o¬Uó7³|Û"uW+(¨@u8ÅÇ…y¿ŠÅ4°„(›Dg®?¯ji… ð)’Ë j¿¢UlÒL›á\YJÉ(+(‰NDìónª$ŠÃÅÞ˜ÕˆcPŒ™Ïé(GÕšiN¹üµq$…ò o0«!a•ÅJ“€zýºÂ'u=í+e:]T§+É›¥ÔuÕ¹2 ì篤ÍÙRz£dí&Ÿ\ÏìͧW†Ü5ë~G›/¨su¹`,ô“kMr¥“ŸNÎv­Ù†±8î®w²Ý‚^íWÇúÍé,/êmªv¼„TDøv LàÒ4Ê'¨lä-¨­DY Ñt‚ûH ðœ‡&ªS)IçÔ¬¦ë„‚TÐø(†g‡KÅ*ãù&]öš/",©Tµó‡³Ný:›z·Öy~«ùr¥üöÁàëáí÷íÚà‡­áÛ‹ÚéFýl³u¹×ºÜ;_í~Úºöa{äbsôõRãñÝÚóûƒ§+Ý7ËÍ—KÏW‹ÏÖOî—_®ÔßΔŸÜJ}\Ïï é7\g} ð°›Ç=:T™ÄBXÕ¡`ÙªŽ•6ToØ­k¸–Q+ë­ŒMHtÄ1¯¥ Wªîµ¼YÓ0àX-¡¬»ö5ÍË 5¨å†ìƆ¦MÁðÍÚ¨j))—bEA dÀÂõ4{Ý•ï¦ÈX’fw#•Ps*6rŠ]OBæ”L”w´FB›oiK-íÖ r4Ÿ9êæîÖÓ;³™å«¹û“¹K_Í¿YkîŽlM”W;…û#…¥\vqÀ\i§×ŠÙµº{¥€“¢5¦'Kú˜³3¢ÒM’ëýÊꈾÙq6ºîÁÜ Ï}FrPF1‘O¦"Ѱ¦ :P¾NtHï „Jƒšö'ÄSQDö‰ ¯ycé{ÀÞúc4¡U1¥ ¢`(à4•Ê~î/å?{;ÎwŸ¯v^­¶^-7N®W.V¦/î½¾W~µ2ðö~õÙþwª¯ÁÒ® ¼Úl}>ûyÐý²ãϧ›ïׇŸ\³ßÞpž={0|ºÝx½V}½Þ|~³úaûêÙrûõJåù½ÊÆXåA×x}ØÝëÚϧ’ë9wÈ4Jš·I\²ÆU*ãŠó³1JX•]B‘Ï›^—4›(¦FtQ³x®š–Z JUK rJ¡¦(; ˜8ZÐQYEÕmpôq³5‹@JÔ1ÂhÔ‘G,ZÑä¬B ¼Ñ[£f@”'¨Ü4å!›ÜLë M}.¥Ïå”›ee³.]ë§W“Z'.Ý,Io+_÷Z?v»_ž _Ì}Ù9[ᄎ]?^(=Yoß­¾ÚéßÏÞi¸OVšGßÀ½ÏV:ÙÕ‰ôãi÷hÎÝq—›ÚZ‹l¢gT°ÙÙH¢jYKçÌbÊñ†—7™zBõz®G7]ÊÅIL„º6PLE²L1õD±$j™ñ;€¿À I2õqWF’G#Ÿ¯^ܯ¿Xl¾ùô`ô|køt§óu«ûÏíwÓ•Ö“…Êû¥“åÖùZãÍjãtÓÐ~·Ñ=[i>¾–yz«p²P±T?½;ün£ùi§q¹“û´=øüNåÍýÒåÚà¹7æ9wT;Ûüëåüa7»:¨ÞGI©‹Å…˜t‰FÃ!Ìó‘;–ªcÖ1ä|Ž:¨Ö%rŽâ¤áÓ3Š–¡)—©Êç-9­¢$E‚ ²E 8(g¢ÆYª×ueÈB%TµÕAWB¨¨£,E 騥SxÑÕQÛBs)2á’¶%ç4’¤mWETDrÆ$3#ôíãÚ÷£+ß^/üx8þõqëóÓÖÅöðû]x•+ãÏn4vFKOVÊ/n”voæ÷k{×*Ï÷G®Þu6gœ½ig4µ×v·Ç]9F#ßà …€¢ëcC³µ²¬€Š5¼’ä½Ú£!ºéõfñP³‚  "Bàããš$)"JŒÆ%/Ô¤Jˆ òº-¬Ý°Ÿ^o=_|÷äÎõñ³Í™·›çëÝ×»çë×›­· ƒ'3ý'÷Š/— §+õç·ªo¶jç[[­³µáÇK×KµW«µW+µ“{·3ßï£ïVºoo÷Ÿ,—ßnæ/×vßmM_nM<­Me^,f¤s { ¯½‘hE‚äâ"g*²7¶ S0º²Š‡ÂØD2ˆæj¦±Æ :ì¶%dË"[25“ C@˜ÕX,!ˆ³Àñ±$BvˆwT^o‚HÅ *—(í—QNF3 êp^4Kê2üÌ£- +BË?Ûø‡~ßí|Ý|µÑxr»ùz3}¾;üj­ûônýÑBáÉÕÚÑBaÿþàÖtfsÞڙʬ•Í»5÷Nƒ¬Ù&œag}ØXn¹}a&ñƒ°fÃà"'` 8F¨ °Ë#o¾!¸W_ˆyS“@Ê%:1mK· k¨–™ªg’^ë±Qt[“š•tA¥€`(‹r¸¬3oö*—‡­—K­K•Óýá³ãñÏÏgþq<ñqsüÓæðÙæØÛµÆé½ú»Õ±·÷ëo×Çß®4O®÷¿Y¯ŸoŒ|Ø{¿:ýrnðŽÚËåÚ³;©³Íó­‹êçÃçûå³õÎÙíú›[Æåúàû½á·‹¯6;—OfNï–÷ÚÉG1ì`oLeD5$è<Ò8ͳ …T v¹fM›´-£ªÁ ¹h!I®‰±) Äfe‡ç3|ÈæE]÷¢†øŒÌfd”@l©L³,Ê lÉüé°¸HÎómL²,ob>Åñ ±3v7‚pUFý Ô/ó¶×eùA·(ª T@¨¡E'löÓÉÕ‹ƒÁG¹/{Ó•êéÒà«ë¥··j/ïžÞtçVæ æÓÛõ•ñÔÖ„º9ä¬w’›CæƒéÔáHr·›Ùr7*hyÐðûœ_æü`ÀC1ÞÎ#>,¨«Q• MÃnZ‚h¦c”M œFJI¹Ó´¦ÒfÙ1&KnÒ®kÍ¥´jƪ™ :ørF7MäcŽ+¹taн?™yq»özèÛRéõ­ÌÃÅÆåƒ+oW›—›Õ³ÍÆé“â»0¼‹ÖïÛõÓÕóÍÂùÆÀ©×G{·ZºXÊ-¾¹×øøèÊ·Í+ïW/W.7žM·_@™ož¯5/Ì}yÐ~»Üyr«þl«ýmcä·ã‰­÷A©fE"úLApe~¦„®W®+ßHÈ‹m}:«ÍWô{:[!Si}nH›÷á’E ǧLoN+„‡å] 75ɲP°™T‰ÜÒQ… †‰Æ©\AZ¡:€EY„ó*NõrÞDlÄW(W"h@Aó.ªO¤_D¸ £"•óÔ·¥7òŸîÔίf>‚ãƒÇµT>»_þò°s¾<ñòNédkøa%ûrÎzâZ¥›mg§ënÖ2»#™ýñü~[Ù5¶Ç3»×R$”|(ØHˆ‹`&.`p52Ò0*˜²œÍ{Ó¼æhŽW¼£‘Õ'ËÖhÑZl™kÝꀭ^ÏkW+›J]%‹Žfôš«{ûZ‹¼c±y‡v3ÂBËY¹j,7÷f3ÛkŧëG·'«¥OGƒ¯Û¯—ë€7Ç.´>lÝø²íMÖƒãt!ûæVí ˆ«ÝÂû­Æ{pL[÷{Ýóµy`á÷›Õ“{¥ã›…Ó᳃î_GÝóåÆë{¹W+ÕóÝÆÇ€ÕõOÅ­Žú‰…$QËY1¾å$Z޲T³æk¦¬MZJ ˜®¤OökM[Ï«$IeEÐ.SCUª¯ƒxFý ¬¨æbäbPBU}¦®f(JiZR@e;:J"v)“K&e Šá($mleþÜš9™Î>¿Szu¿óú^íÕRù|¯õúŠût:q²Òz~%óê*7±Ôµïuœéå²}«¥m϶7çókãt³n.¸x¥¬’’{dÙ/Ë= lùH/&HêC8¦ó>ÈHƒGqŸ¦2@M4–.iÞ W•Á¶èÄUxð‡B\NitH£yPSa(vž(‚%ò<냴¯¸òh–6M/±«)¡îê5G½^4Ǩ±X¡Ëz­i_ÉîLZ›óÉ'›¯ZÏï¥NõËÌýóhò·ãÉ_‡ÿóxñãFût¥yº1{¹ž:Ûi~ܼþv¹vzàÑŒñr1ÿz­vñ¨û¯ý+7’—Ëõ×kíŠXŸELR5x—JÍ?•V†ue2§\©ë­4)²£ÊqY”%Ï‚œãõ !F%"‹—xVÁŠF¼¶Fcóª†-ê icÃÇႱ`MJ@­I‚7 GYPV.á…gE£íϼ»?øö^íl¹þveèboúçÖðË»•ƒ«Ée0Àš¢?¡)W͘‰¬iõJÕA*è\S)‡‘·¨ê“Â}(ì¶b"` {9&À{_O Ü õ„ú¼oeË`$!¶ç”ãZˆ¨!Qôa$ ¡·L¤Æce*ÏL[@ý<Qå´Ìåàba@Ç£”–duZÓ}@3Žö+ _. nݬÝÉ=¾ßx­´w½vx£rÔDûÕØÚpr¥ž¸Õɯ6öÇ“Ç퇓γ™ÜÑ”õôJáñüÀÉBæA3³Õ5.fJÈ ’õ&ÄB"‰(ˆ}¡bÂ(*‚ÄR"rÜç-ËÀöy;3>&и ƒœñLˆ‰„à•À‡âQ(`÷€GCbŸŸT‡E±° qÅ[â…zë§Ø†“À™´OñÖ–‰„‰·±2Å¥€! êí¾‘ÔTpÖiU78…J Ø ƒJL=AEÓ é”4ÖÕ®is)²:Eï¶o—Ÿï~ÙŸ¾Ø™zºZ{šêvúVÉ©H”e8êuQÑdXCŒ¥0±d ºôjÒUŒ¸Â† VÖ'r=LÌ‹,ñsœ ô²±1õõzݜގۢ”I†*5[«%è ¡J)‹Šh€,4ÊD¨(ÃãZI­%nVõ©¬6ך M;rÅŒ7óê\Y»—Wï;‹52å Ï×¾o Ÿ,·ݯ]o]í?ž°§‡Zîöòx\;Xèßš©ßK]w_-§Nó'KÉËÉW;©7Û…—w;Ofs[%sQæQHŒ†”Þ öE™^/j ÜŽ?îí_ì‹GþXˆ„B\Ô/„|Òß[N|¬6Ð'±~DE $Æzˆ&8DC½’Ïç½=â—¼‰H1]Š‹XQ… ‘R©b' +¡ ! +ŠE‰È›ŸŒ½ÖLÇ #€Í³ Ó"$Má%ñ»RjjZšPKÑl+Ì„xŽ/`M—•J":Ú¯^/YÛwi(±Õ)¬–Éݺyc01UTàÉ[’Hƒ˜°d ɢϫÀFZ\€Câ1!Š£Œ?Ê@¾ú™>xÞ® @Ÿ7 NȈú¸TUÃKáWÑH•’š„†T'NÑ›¦$%iÐÖs¦^4©­kEƒ€Õ­Rµ¤ky]µUR¢´(Ó¢Bë 5§“A6$©“RîÖ~Üxz³¾=MVæ ûwòÏ–ò‡÷³[MsÉ2neÌûÝÌòty¾áN7ÌÛ {oÊØ¶·Ê‰å÷nÓytÃ:»Ûx1U¼I#JXPྼ‘2"lïß‹©ö‰ {cLCBHaü±€/ØÛÓ'øAK°Á>‘õ,°ÌD„P‡Ã”c‚RP, @½2‘H„‹0LP ôòÁpœ sl,.zkØ!•áD2–C¢Ì°G“E†3‚·´oDèñ‡‚½ P¶r.!á’6í£’õŒ$ou(Dz¦ÏÓÿ‘° K(† +a‚š„‚‘H0‹CåF4"„š•Ùˆ+á0‚·°!õF"(æÁÉ,Û')¯ï›¥Æ‰zBþH¨W K’ÄZ¦¤ رÇZ¾ ¡>AaD|"8ªÈ^c¾"ùJ04 •Ú”‚A3 (’ZÆ¢Ô“…ØEÄ)–¤˜–V´“UÝÉXjÚ$ŽIÓ–fƒ^XPUD$ŽABJÞEyi%G½¡8¼¸ œ!¦M2¯@–Àg&Ô‰²9UJÌÖÜACMRvh;¡&Hü k´S‰‘µÉ¸V;½å¨MG±qÑ”Á8—(*it0­‚Ço ˜M!eýðnþ×þð›ÅÚöxáöDâp¡x²Zz{à­Qù¨bìÃ¥g÷ÇŸo4×ÝGë…çKÅ»¥ÊOT߬^.·.nåo¤p4åA·÷aÞ‡b>ïCJAƆüªAñH N 3<Ž 8Î(ZØ ÜŒ£X±=Ø lz…P/вÁ@$äíI!²Ñ“T1™ ól8Žpa¨ñˆ†⢚"ÐB„8¶—G |5‡0!PÚŒ¨0²·ä Øa,èšbü-µˆ·†•¦ªÔJZ¹|Ê1@m)I]ÏPÕQˆE)J–­- 8µTÞЕ„Jr*µß 9PkÁƒ2'Þà4…”tïÓ)«iC޾¿ÿoç?vŸÞÚ¿^~´V}±}v«øìNýÉxú ­ïÝHíÝÏm\uo'îÎ¥öúL ¬6ÒK…ÄæhúÅrýËÎÈëù쌆IXFq‰:b"«¹) ^Ò`‘Ê"%,Êá8›ÆH@"ƒ1Øó€×AOCÔâ[Ò4•ªH‘6DÇ}\ìïá”ñ>–óólP†bù|a?ЍÑH0 Š2ì÷¬½›½ðá>,öRV0ø…° ÁêÆ1؇˜¨óHëã\Žƒó•øDUuLÅ„)4«i6A./—E2¢‘’¦å-©¨žÍ銭aàh*z£zŠ:*;¨V4GJúBZS•¬‚@¡å]µÖ¯d²´ÙÔo §›ÙÕYë^×ê Z3ÃÆXA«—2WǪÕdiYK/Yz5«7ûÉ€·ãƒRMjí„1â{¢„$ºD 8GA ¾žÇ¬‚lQ;.‚œ È[ÁÆ©€³-§5€å¤bšòh›œí–ŸÜ)/gïg·æòÇ· OWúŸß®Žå7KâzSÞ½Yyp³³\Y*·&‹šÏæûŸÍ¸g·³ï—Š·úŸ§¶Ëª ؇¿¤p^£"rKAàP%Æ‘@œë(AÖðc"Q¤Ö/ÄYQ%" aÄChýrØÛ«±¯× ÷ÆB!(Û(oÔÃdyÖÑê‹FûB,¨Í¾h0c#B,“#EŠä…¨÷s8ÊZPHœ(Æ$,Kš5ÀWÆqBü”R¹_ïæuÐ$T-Ò²éÍue$µÔÎß­™Ó¶ZUIY!)ª¤tœW)Tb¿­Íåô¦¡d5o*“þ÷ŽK ~¯\Ò¯y“ß“D˨Z%¯·*F3«š´fx{ gÌVÚ(»ZÃ1êI34S¦·yºC°kÈY›¦ÄѼ=×*#Sw4MÓIÑò6bK")KŬ¦dU\HhiNÖ2®êRdÊàJÎâÖ\þŽ8*±M|w<÷_'7þ8œ{y½±;S~0WÚIÞHl—Ÿ,ôwí‡×ìWë•7ÛÇ÷jÏï×Î7KŽ*Ÿ ¼¹ç¾ºéœÜÍœn6O®W4]® ¼JP,RJaBÇE#QR6çB,ŽÉ*øI†SB ò³8Ž•q 9g«ŽF‰D˜¾øß¤F£Þn}`âœ7˜c#Áp‘ ò2ê ¾¨ÜüX¢x0î-žïm ÇD}1o‘sL|"èRÑ#3H Å€o¡ªdš’M…¤ARºZ¥Ê¸†:¦P7â*UTi­)ŠF()¯®màQ š ¬:`ÂÓ–l)fÈUIˆéíåëa¼¦ëZÂPuÍuÍHYox^¿ëÍ髤µ”«Y.± ûÞz›Hâ©ÀiHÔ@$pÈÛŽ ¡F¦N5ÍTbÀb"x%‚ðïÖæ'Ç¢ð'ÄCQ&Â( ‘YIfYÄG¨×$Qã `I“îþùyý÷7«ÇÏÖëÇ÷+ÇwóOo7žÞ¨8ǃöÁäþ}ZÙ½ÅêþÚÃ…'óýgs»SÖƒag·á¶ÇÃÖã™Äÿª>vgeomview-1.9.5/data/geom/textured/white.pgm.gz0000644000175000017500000000017412310110173016230 00000000000000‹–dKFwhite.pgmíÊÁ Â@EÑýTñÁ œ0"éÀ…!-„%„!ì_§ 7çÀ}«7–tŠæVßûñYñ<öãpµN¯¥¶ë¼M9—îҮ霯ÑJ¹”ôþîVm¦,=@geomview-1.9.5/data/geom/abstr.off0000644000175000017500000000267512310110173013737 00000000000000OFF #created by dirichlet domain computation. 36 20 54 -0.586233 0.192482 -0.019732 -0.344233 0.301871 0.358301 0.344233 -0.301871 0.358301 0.179112 -0.514398 -0.290554 0.011612 -0.564879 0.137037 -0.011612 0.564879 0.137037 -0.179112 0.514398 -0.290554 -0.151548 -0.185001 -0.529915 -0.055686 -0.430284 -0.411612 -0.364663 -0.382652 -0.277601 -0.394163 -0.151218 -0.422176 0.055686 0.430284 -0.411612 0.364663 0.382652 -0.277601 0.394163 0.151218 -0.422176 0.151548 0.185001 -0.529915 0.361372 0.268614 0.393607 0.246149 0.511456 0.185169 0.417404 0.426728 -0.011876 0.510787 0.234322 0.148969 -0.361372 -0.268614 0.393608 -0.510787 -0.234322 0.148969 -0.417404 -0.426728 -0.011876 -0.246149 -0.511456 0.185169 0.430396 -0.334808 -0.249032 0.586233 -0.192482 -0.019732 0.587567 -0.188189 -0.021408 0.509201 -0.136702 -0.282307 -0.430396 0.334808 -0.249032 -0.509201 0.136702 -0.282307 -0.587567 0.188189 -0.021408 -0.272269 -0.118712 0.520703 -0.248355 0.095223 0.535651 0.272269 0.118712 0.520703 -0.000222 0.002388 0.617335 0.000222 -0.002388 0.617335 0.248355 -0.095223 0.535651 7 32 15 18 25 24 2 35 9 7 35 2 4 22 19 30 34 6 7 33 31 1 5 16 15 32 7 7 28 10 7 14 11 6 27 7 7 3 23 26 13 14 7 8 6 5 27 6 5 1 0 8 5 2 24 23 3 4 8 7 1 31 30 19 20 29 0 9 6 29 20 21 9 10 28 10 6 13 26 25 18 17 12 11 6 22 4 3 8 9 21 11 6 12 17 16 5 6 11 10 4 8 7 10 9 12 4 12 11 14 13 13 4 15 16 17 18 13 4 20 19 22 21 12 4 23 24 25 26 14 4 28 27 0 29 15 4 34 30 31 33 15 4 33 32 35 34 14 geomview-1.9.5/data/geom/alphabet.vect0000644000175000017500000000757712310110173014601 00000000000000# alphabet.vect # # A list of handles defining the uppercase letters and numerals # of the Roman alphabet in a fixed-size 32-by-64 font # (40-unit spacing is recommended). # # Read it into Geomview like this: # # (read geometry { < alphabet.vect }) # # Then you can write out uppercase strings like this: # # (geometry HI { LIST # { INST geom { : H } transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } } # { INST geom { : I } transform { 1 0 0 0 0 1 0 0 0 0 1 0 40 0 0 1 } } # }) # { LIST { define A { VECT 2 5 0 3 2 0 0 0 0 0 16 64 0 32 0 0 8 32 0 24 32 0 } } { define B { VECT 2 12 0 7 5 0 0 0 0 0 0 64 0 16 64 0 28 56 0 28 44 0 20 36 0 0 36 0 20 36 0 32 24 0 32 8 0 24 0 0 0 0 0 } } { define C { VECT 1 8 0 8 0 32 56 0 24 64 0 8 64 0 0 56 0 0 8 0 8 0 0 24 0 0 32 8 0 } } { define D { VECT 1 7 0 7 0 0 0 0 0 64 0 20 64 0 32 52 0 32 8 0 24 0 0 0 0 0 } } { define E { VECT 2 6 0 4 2 0 0 32 64 0 0 64 0 0 0 0 32 0 0 0 36 0 24 36 0 } } { define F { VECT 2 5 0 3 2 0 0 0 0 0 0 64 0 32 64 0 0 36 0 24 36 0 } } { define G { VECT 1 10 0 10 0 32 56 0 24 64 0 8 64 0 0 56 0 0 8 0 8 0 0 24 0 0 32 8 0 32 36 0 16 36 0 } } { define H { VECT 3 6 0 2 2 2 0 0 0 0 0 0 0 64 0 32 0 0 32 64 0 0 36 0 32 36 0 } } { define I { VECT 3 6 0 2 2 2 0 0 0 4 64 0 28 64 0 16 64 0 16 0 0 4 0 0 28 0 0 } } { define J { VECT 2 8 0 2 6 0 0 12 64 0 36 64 0 28 64 0 28 8 0 20 0 0 8 0 0 0 8 0 0 20 0 } } { define K { VECT 2 5 0 2 3 0 0 0 0 0 0 64 0 24 64 0 0 36 0 32 0 0 } } { define L { VECT 1 3 0 3 0 0 64 0 0 0 0 32 0 0 } } { define M { VECT 1 5 0 5 0 0 0 0 0 64 0 16 36 0 32 64 0 32 0 0 } } { define N { VECT 1 4 0 4 0 0 0 0 0 64 0 32 0 0 32 64 0 } } { define O { VECT 1 9 0 9 0 24 0 0 8 0 0 0 8 0 0 52 0 8 64 0 24 64 0 32 52 0 32 8 0 24 0 0 } } { define P { VECT 1 7 0 7 0 0 0 0 0 64 0 16 64 0 28 56 0 28 44 0 20 36 0 0 36 0 } } { define Q { VECT 2 11 0 9 2 0 0 24 0 0 8 0 0 0 8 0 0 52 0 8 64 0 24 64 0 32 52 0 32 8 0 24 0 0 20 16 0 36 0 0 } } { define R { VECT 2 9 0 7 2 0 0 0 0 0 0 64 0 16 64 0 28 56 0 28 44 0 16 36 0 0 36 0 16 36 0 32 0 0 } } { define S { VECT 1 12 0 12 0 32 56 0 24 64 0 8 64 0 0 56 0 0 44 0 8 36 0 20 36 0 32 24 0 32 8 0 24 0 0 8 0 0 0 8 0 } } { define T { VECT 2 4 0 2 2 0 0 0 64 0 32 64 0 16 0 0 16 64 0 } } { define U { VECT 1 6 0 6 0 0 64 0 0 8 0 8 0 0 24 0 0 32 8 0 32 64 0 } } { define V { VECT 1 3 0 3 0 0 64 0 16 0 0 32 64 0 } } { define W { VECT 1 5 0 5 0 0 64 0 4 0 0 16 28 0 28 0 0 32 64 0 } } { define X { VECT 2 4 0 2 2 0 0 0 64 0 32 0 0 0 0 0 32 64 0 } } { define Y { VECT 2 5 0 2 3 0 0 0 64 0 16 36 0 32 64 0 16 36 0 16 0 0 } } { define Z { VECT 1 4 0 4 0 0 64 0 32 64 0 0 0 0 32 0 0 } } { define 0 { VECT 2 11 0 2 9 0 0 0 20 0 28 56 0 24 0 0 8 0 0 0 8 0 0 48 0 8 64 0 24 64 0 32 52 0 32 12 0 24 0 0 } } { define 1 { VECT 2 5 0 2 3 0 0 4 0 0 28 0 0 4 44 0 16 64 0 16 0 0 } } { define 2 { VECT 1 7 0 7 0 0 56 0 8 64 0 24 64 0 32 56 0 32 40 0 0 0 0 32 0 0 } } { define 3 { VECT 2 13 0 2 11 0 0 8 36 0 24 36 0 0 56 0 8 64 0 24 64 0 32 56 0 32 44 0 24 36 0 32 24 0 32 8 0 24 0 0 8 0 0 0 8 0 } } { define 4 { VECT 2 5 0 2 3 0 0 28 64 0 28 0 0 12 64 0 0 36 0 36 36 0 } } { define 5 { VECT 1 9 0 9 0 28 64 0 4 64 0 0 36 0 24 36 0 32 24 0 32 8 0 24 0 0 8 0 0 0 8 0 } } { define 6 { VECT 1 12 0 12 0 32 56 0 24 64 0 8 64 0 0 56 0 0 8 0 8 0 0 24 0 0 32 8 0 32 28 0 24 36 0 8 36 0 0 28 0 } } { define 7 { VECT 1 4 0 4 0 0 56 0 4 64 0 32 64 0 8 0 0 } } { define 8 { VECT 1 16 0 16 0 20 36 0 28 44 0 28 56 0 20 64 0 12 64 0 4 56 0 4 44 0 12 36 0 20 36 0 32 24 0 32 8 0 24 0 0 8 0 0 0 8 0 0 24 0 12 36 0 } } { define 9 { VECT 1 12 0 12 0 32 44 0 24 36 0 8 36 0 0 44 0 0 56 0 8 64 0 24 64 0 32 56 0 32 8 0 24 0 0 8 0 0 0 8 0 } } } geomview-1.9.5/data/geom/antoine0.oogl0000644000175000017500000000052112310110173014513 00000000000000VECT 1 16 1 -16 1 0 0 1 0.382683 0 0.92388 0.707106 0 0.707107 0.923879 0 0.382684 1 0 1.32679e-06 0.92388 0 -0.382682 0.707108 0 -0.707105 0.382686 0 -0.923879 2.65359e-06 0 -1 -0.382681 0 -0.923881 -0.707104 0 -0.707109 -0.923878 0 -0.382687 -1 0 -3.98038e-06 -0.923881 0 0.382679 -0.70711 0 0.707103 -0.382688 0 0.923878 1 .8 .1 1 geomview-1.9.5/data/geom/antoine1.oogl0000644000175000017500000000454712310110173014530 00000000000000GROUP 1 0 0 0 0 1 0 0 0 0 1 0 0.75 0 0 1. 0.309017 0. 0.951057 0. 0. 1. 0. 0. -0.951057 0. 0.309017 0. 0.231763 0. 0.713292 1. -0.809017 0. 0.587785 0. 0. 1. 0. 0. -0.587785 0. -0.809017 0. -0.606763 0. 0.440839 1. -0.809017 0. -0.587785 0. 0. 1. 0. 0. 0.587785 0. -0.809017 0. -0.606763 0. -0.440839 1. 0.309017 0. -0.951057 0. 0. 1. 0. 0. 0.951057 0. 0.309017 0. 0.231763 0. -0.713292 1. 0. -1. 0. 0. 0.809017 0. 0.587785 0. -0.587785 0. 0.809017 0. 0.566312 0. 0.41145 1. 0. -1. 0. 0. -0.309017 0. 0.951057 0. -0.951057 0. -0.309017 0. -0.216312 0. 0.66574 1. 0. -1. 0. 0. -1. 0. 0. 0. 0. 0. -1. 0. -0.7 0. 0.0 1. 0. -1. 0. 0. -0.309017 0. -0.951057 0. 0.951057 0. -0.309017 0. -0.216312 0. -0.66574 1. 0. -1. 0. 0. 0.809017 0. -0.587785 0. 0.587785 0. 0.809017 0. 0.566312 0. -0.41145 1. unit { = INST transform .35 0 0 0 0 .4 0 0 0 0 .48 0 0 0 0 1 unit < antoine0.oogl } geomview-1.9.5/data/geom/antoine2.oogl0000644000175000017500000000507712310110173014530 00000000000000GROUP 1 0 0 0 0 1 0 0 0 0 1 0 0.75 0 0 1. 0.309017 0. 0.951057 0. 0. 1. 0. 0. -0.951057 0. 0.309017 0. 0.231763 0. 0.713292 1. -0.809017 0. 0.587785 0. 0. 1. 0. 0. -0.587785 0. -0.809017 0. -0.606763 0. 0.440839 1. -0.809017 0. -0.587785 0. 0. 1. 0. 0. 0.587785 0. -0.809017 0. -0.606763 0. -0.440839 1. 0.309017 0. -0.951057 0. 0. 1. 0. 0. 0.951057 0. 0.309017 0. 0.231763 0. -0.713292 1. 0. -1. 0. 0. 0.809017 0. 0.587785 0. -0.587785 0. 0.809017 0. 0.566312 0. 0.41145 1. 0. -1. 0. 0. -0.309017 0. 0.951057 0. -0.951057 0. -0.309017 0. -0.216312 0. 0.66574 1. 0. -1. 0. 0. -1. 0. 0. 0. 0. 0. -1. 0. -0.7 0. 0.0 1. 0. -1. 0. 0. -0.309017 0. -0.951057 0. 0.951057 0. -0.309017 0. -0.216312 0. -0.66574 1. 0. -1. 0. 0. 0.809017 0. -0.587785 0. 0.587785 0. 0.809017 0. 0.566312 0. -0.41145 1. unit { = INST transform .35 0 0 0 0 .4 0 0 0 0 .48 0 0 0 0 1 unit < antoine1.oogl } geomview-1.9.5/data/geom/antoine3.oogl0000644000175000017500000000507712310110173014531 00000000000000GROUP 1 0 0 0 0 1 0 0 0 0 1 0 0.75 0 0 1. 0.309017 0. 0.951057 0. 0. 1. 0. 0. -0.951057 0. 0.309017 0. 0.231763 0. 0.713292 1. -0.809017 0. 0.587785 0. 0. 1. 0. 0. -0.587785 0. -0.809017 0. -0.606763 0. 0.440839 1. -0.809017 0. -0.587785 0. 0. 1. 0. 0. 0.587785 0. -0.809017 0. -0.606763 0. -0.440839 1. 0.309017 0. -0.951057 0. 0. 1. 0. 0. 0.951057 0. 0.309017 0. 0.231763 0. -0.713292 1. 0. -1. 0. 0. 0.809017 0. 0.587785 0. -0.587785 0. 0.809017 0. 0.566312 0. 0.41145 1. 0. -1. 0. 0. -0.309017 0. 0.951057 0. -0.951057 0. -0.309017 0. -0.216312 0. 0.66574 1. 0. -1. 0. 0. -1. 0. 0. 0. 0. 0. -1. 0. -0.7 0. 0.0 1. 0. -1. 0. 0. -0.309017 0. -0.951057 0. 0.951057 0. -0.309017 0. -0.216312 0. -0.66574 1. 0. -1. 0. 0. 0.809017 0. -0.587785 0. 0.587785 0. 0.809017 0. 0.566312 0. -0.41145 1. unit { = INST transform .35 0 0 0 0 .4 0 0 0 0 .48 0 0 0 0 1 unit < antoine2.oogl } geomview-1.9.5/data/geom/axes.list0000644000175000017500000000440212310110173013753 00000000000000{ LIST # first, the x, y, and z labels { VECT 5 13 0 2 2 2 3 4 0 0 0 0 0 # the x: 1 -.05 .05 1 .05 .25 1 .05 .05 1 -.05 .25 # the y: -.05 1 .25 0 1 .15 .05 1 .25 0 1 .15 0 1 .05 # the z: -.05 .25 1 .05 .25 1 -.05 .05 1 .05 .05 1 } # make an object to inst. # now make a list of the 3 instances of oneaxis, one for each axis. { LIST { appearance {material {edgecolor 1 0 0} } INST transform 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 unit { define oneaxis { VECT 37 74 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 -0.9 .05 0 -0.9 -.05 0 -0.9 0 .05 -0.9 0 -.05 -0.8 .05 0 -0.8 -.05 0 -0.8 0 .05 -0.8 0 -.05 -0.7 .05 0 -0.7 -.05 0 -0.7 0 .05 -0.7 0 -.05 -0.6 .05 0 -0.6 -.05 0 -0.6 0 .05 -0.6 0 -.05 -0.5 .05 0 -0.5 -.05 0 -0.5 0 .05 -0.5 0 -.05 -0.4 .05 0 -0.4 -.05 0 -0.4 0 .05 -0.4 0 -.05 -0.3 .05 0 -0.3 -.05 0 -0.3 0 .05 -0.3 0 -.05 -0.2 .05 0 -0.2 -.05 0 -0.2 0 .05 -0.2 0 -.05 -0.1 .05 0 -0.1 -.05 0 -0.1 0 .05 -0.1 0 -.05 0.1 .05 0 0.1 -.05 0 0.1 0 .05 0.1 0 -.05 0.2 .05 0 0.2 -.05 0 0.2 0 .05 0.2 0 -.05 0.3 .05 0 0.3 -.05 0 0.3 0 .05 0.3 0 -.05 0.4 .05 0 0.4 -.05 0 0.4 0 .05 0.4 0 -.05 0.5 .05 0 0.5 -.05 0 0.5 0 .05 0.5 0 -.05 0.6 .05 0 0.6 -.05 0 0.6 0 .05 0.6 0 -.05 0.7 .05 0 0.7 -.05 0 0.7 0 .05 0.7 0 -.05 0.8 .05 0 0.8 -.05 0 0.8 0 .05 0.8 0 -.05 0.9 .05 0 0.9 -.05 0 0.9 0 .05 0.9 0 -.05 } } } { appearance {material {edgecolor 0 1 0} } INST transform 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 unit : oneaxis } { appearance {material {edgecolor 0 0 1} } INST transform 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 unit : oneaxis } } } geomview-1.9.5/data/geom/br2.grp0000644000175000017500000010262712310110173013325 00000000000000GROUP # epsilon # Undefined generator matrix epsilon 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] epsilon # x -1 0 0 0 0 -1 0 0 0 0 1 0 2 0 0 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 2 0 0 1 ] x # x*A 1 0 0 0 0 1 0 0 0 0 1 0 -4 0 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -4 0 0 1 ] x*A # x*A*x -1 0 0 0 0 -1 0 0 0 0 1 0 6 0 0 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 6 0 0 1 ] x*A*x # x*A*x*A 1 0 0 0 0 1 0 0 0 0 1 0 -8 0 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -8 0 0 1 ] x*A*x*A # x*A*x*y -1 0 0 0 0 1 0 0 0 0 -1 0 6 2 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 6 2 0 1 ] x*A*x*y # x*A*x*B -1 0 0 0 0 1 0 0 0 0 -1 0 6 -2 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 6 -2 0 1 ] x*A*x*B # x*A*x*z 1 0 0 0 0 -1 0 0 0 0 -1 0 -6 0 2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -6 0 2 1 ] x*A*x*z # x*A*x*C 1 0 0 0 0 -1 0 0 0 0 -1 0 -6 0 -2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -6 0 -2 1 ] x*A*x*C # x*A*y 1 0 0 0 0 -1 0 0 0 0 -1 0 -4 2 0 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -4 2 0 1 ] x*A*y # x*A*y*B 1 0 0 0 0 1 0 0 0 0 1 0 -4 -4 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -4 -4 0 1 ] x*A*y*B # x*A*y*z -1 0 0 0 0 -1 0 0 0 0 1 0 4 2 2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 4 2 2 1 ] x*A*y*z # x*A*y*C -1 0 0 0 0 -1 0 0 0 0 1 0 4 2 -2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 4 2 -2 1 ] x*A*y*C # x*A*B 1 0 0 0 0 -1 0 0 0 0 -1 0 -4 -2 0 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -4 -2 0 1 ] x*A*B # x*A*B*y 1 0 0 0 0 1 0 0 0 0 1 0 -4 4 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -4 4 0 1 ] x*A*B*y # x*A*B*z -1 0 0 0 0 -1 0 0 0 0 1 0 4 -2 2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 4 -2 2 1 ] x*A*B*z # x*A*B*C -1 0 0 0 0 -1 0 0 0 0 1 0 4 -2 -2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 4 -2 -2 1 ] x*A*B*C # x*A*z -1 0 0 0 0 1 0 0 0 0 -1 0 4 0 2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 4 0 2 1 ] x*A*z # x*A*z*C 1 0 0 0 0 1 0 0 0 0 1 0 -4 0 -4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -4 0 -4 1 ] x*A*z*C # x*A*C -1 0 0 0 0 1 0 0 0 0 -1 0 4 0 -2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 4 0 -2 1 ] x*A*C # x*A*C*z 1 0 0 0 0 1 0 0 0 0 1 0 -4 0 4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -4 0 4 1 ] x*A*C*z # x*y -1 0 0 0 0 1 0 0 0 0 -1 0 2 2 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 2 2 0 1 ] x*y # x*y*B -1 0 0 0 0 -1 0 0 0 0 1 0 2 -4 0 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 2 -4 0 1 ] x*y*B # x*y*B*y -1 0 0 0 0 1 0 0 0 0 -1 0 2 6 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 2 6 0 1 ] x*y*B*y # x*y*B*z 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 -4 2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 -4 2 1 ] x*y*B*z # x*y*B*C 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 -4 -2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 -4 -2 1 ] x*y*B*C # x*y*z 1 0 0 0 0 1 0 0 0 0 1 0 -2 2 2 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -2 2 2 1 ] x*y*z # x*y*z*C -1 0 0 0 0 1 0 0 0 0 -1 0 2 2 -4 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 2 2 -4 1 ] x*y*z*C # x*y*C 1 0 0 0 0 1 0 0 0 0 1 0 -2 2 -2 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -2 2 -2 1 ] x*y*C # x*y*C*z -1 0 0 0 0 1 0 0 0 0 -1 0 2 2 4 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 2 2 4 1 ] x*y*C*z # x*B -1 0 0 0 0 1 0 0 0 0 -1 0 2 -2 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 2 -2 0 1 ] x*B # x*B*y -1 0 0 0 0 -1 0 0 0 0 1 0 2 4 0 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 2 4 0 1 ] x*B*y # x*B*y*B -1 0 0 0 0 1 0 0 0 0 -1 0 2 -6 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 2 -6 0 1 ] x*B*y*B # x*B*y*z 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 4 2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 4 2 1 ] x*B*y*z # x*B*y*C 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 4 -2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 4 -2 1 ] x*B*y*C # x*B*z 1 0 0 0 0 1 0 0 0 0 1 0 -2 -2 2 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -2 -2 2 1 ] x*B*z # x*B*z*C -1 0 0 0 0 1 0 0 0 0 -1 0 2 -2 -4 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 2 -2 -4 1 ] x*B*z*C # x*B*C 1 0 0 0 0 1 0 0 0 0 1 0 -2 -2 -2 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -2 -2 -2 1 ] x*B*C # x*B*C*z -1 0 0 0 0 1 0 0 0 0 -1 0 2 -2 4 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 2 -2 4 1 ] x*B*C*z # x*z 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 0 2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 0 2 1 ] x*z # x*z*C -1 0 0 0 0 -1 0 0 0 0 1 0 2 0 -4 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 2 0 -4 1 ] x*z*C # x*z*C*z 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 0 6 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 0 6 1 ] x*z*C*z # x*C 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 0 -2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 0 -2 1 ] x*C # x*C*z -1 0 0 0 0 -1 0 0 0 0 1 0 2 0 4 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 2 0 4 1 ] x*C*z # x*C*z*C 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 0 -6 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 0 -6 1 ] x*C*z*C # A -1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 0 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 0 1 ] A # A*x 1 0 0 0 0 1 0 0 0 0 1 0 4 0 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 4 0 0 1 ] A*x # A*x*A -1 0 0 0 0 -1 0 0 0 0 1 0 -6 0 0 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -6 0 0 1 ] A*x*A # A*x*A*x 1 0 0 0 0 1 0 0 0 0 1 0 8 0 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 8 0 0 1 ] A*x*A*x # A*x*A*y -1 0 0 0 0 1 0 0 0 0 -1 0 -6 2 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -6 2 0 1 ] A*x*A*y # A*x*A*B -1 0 0 0 0 1 0 0 0 0 -1 0 -6 -2 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -6 -2 0 1 ] A*x*A*B # A*x*A*z 1 0 0 0 0 -1 0 0 0 0 -1 0 6 0 2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 6 0 2 1 ] A*x*A*z # A*x*A*C 1 0 0 0 0 -1 0 0 0 0 -1 0 6 0 -2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 6 0 -2 1 ] A*x*A*C # A*x*y 1 0 0 0 0 -1 0 0 0 0 -1 0 4 2 0 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 4 2 0 1 ] A*x*y # A*x*y*B 1 0 0 0 0 1 0 0 0 0 1 0 4 -4 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 4 -4 0 1 ] A*x*y*B # A*x*y*z -1 0 0 0 0 -1 0 0 0 0 1 0 -4 2 2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -4 2 2 1 ] A*x*y*z # A*x*y*C -1 0 0 0 0 -1 0 0 0 0 1 0 -4 2 -2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -4 2 -2 1 ] A*x*y*C # A*x*B 1 0 0 0 0 -1 0 0 0 0 -1 0 4 -2 0 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 4 -2 0 1 ] A*x*B # A*x*B*y 1 0 0 0 0 1 0 0 0 0 1 0 4 4 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 4 4 0 1 ] A*x*B*y # A*x*B*z -1 0 0 0 0 -1 0 0 0 0 1 0 -4 -2 2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -4 -2 2 1 ] A*x*B*z # A*x*B*C -1 0 0 0 0 -1 0 0 0 0 1 0 -4 -2 -2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -4 -2 -2 1 ] A*x*B*C # A*x*z -1 0 0 0 0 1 0 0 0 0 -1 0 -4 0 2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -4 0 2 1 ] A*x*z # A*x*z*C 1 0 0 0 0 1 0 0 0 0 1 0 4 0 -4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 4 0 -4 1 ] A*x*z*C # A*x*C -1 0 0 0 0 1 0 0 0 0 -1 0 -4 0 -2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -4 0 -2 1 ] A*x*C # A*x*C*z 1 0 0 0 0 1 0 0 0 0 1 0 4 0 4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 4 0 4 1 ] A*x*C*z # A*y -1 0 0 0 0 1 0 0 0 0 -1 0 -2 2 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -2 2 0 1 ] A*y # A*y*B -1 0 0 0 0 -1 0 0 0 0 1 0 -2 -4 0 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -2 -4 0 1 ] A*y*B # A*y*B*y -1 0 0 0 0 1 0 0 0 0 -1 0 -2 6 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -2 6 0 1 ] A*y*B*y # A*y*B*z 1 0 0 0 0 -1 0 0 0 0 -1 0 2 -4 2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 2 -4 2 1 ] A*y*B*z # A*y*B*C 1 0 0 0 0 -1 0 0 0 0 -1 0 2 -4 -2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 2 -4 -2 1 ] A*y*B*C # A*y*z 1 0 0 0 0 1 0 0 0 0 1 0 2 2 2 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 2 2 2 1 ] A*y*z # A*y*z*C -1 0 0 0 0 1 0 0 0 0 -1 0 -2 2 -4 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -2 2 -4 1 ] A*y*z*C # A*y*C 1 0 0 0 0 1 0 0 0 0 1 0 2 2 -2 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 2 2 -2 1 ] A*y*C # A*y*C*z -1 0 0 0 0 1 0 0 0 0 -1 0 -2 2 4 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -2 2 4 1 ] A*y*C*z # A*B -1 0 0 0 0 1 0 0 0 0 -1 0 -2 -2 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -2 -2 0 1 ] A*B # A*B*y -1 0 0 0 0 -1 0 0 0 0 1 0 -2 4 0 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -2 4 0 1 ] A*B*y # A*B*y*B -1 0 0 0 0 1 0 0 0 0 -1 0 -2 -6 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -2 -6 0 1 ] A*B*y*B # A*B*y*z 1 0 0 0 0 -1 0 0 0 0 -1 0 2 4 2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 2 4 2 1 ] A*B*y*z # A*B*y*C 1 0 0 0 0 -1 0 0 0 0 -1 0 2 4 -2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 2 4 -2 1 ] A*B*y*C # A*B*z 1 0 0 0 0 1 0 0 0 0 1 0 2 -2 2 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 2 -2 2 1 ] A*B*z # A*B*z*C -1 0 0 0 0 1 0 0 0 0 -1 0 -2 -2 -4 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -2 -2 -4 1 ] A*B*z*C # A*B*C 1 0 0 0 0 1 0 0 0 0 1 0 2 -2 -2 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 2 -2 -2 1 ] A*B*C # A*B*C*z -1 0 0 0 0 1 0 0 0 0 -1 0 -2 -2 4 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -2 -2 4 1 ] A*B*C*z # A*z 1 0 0 0 0 -1 0 0 0 0 -1 0 2 0 2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 2 0 2 1 ] A*z # A*z*C -1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 -4 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 -4 1 ] A*z*C # A*z*C*z 1 0 0 0 0 -1 0 0 0 0 -1 0 2 0 6 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 2 0 6 1 ] A*z*C*z # A*C 1 0 0 0 0 -1 0 0 0 0 -1 0 2 0 -2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 2 0 -2 1 ] A*C # A*C*z -1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 4 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 4 1 ] A*C*z # A*C*z*C 1 0 0 0 0 -1 0 0 0 0 -1 0 2 0 -6 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 2 0 -6 1 ] A*C*z*C # y 1 0 0 0 0 -1 0 0 0 0 -1 0 0 2 0 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 0 2 0 1 ] y # y*B 1 0 0 0 0 1 0 0 0 0 1 0 0 -4 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 -4 0 1 ] y*B # y*B*y 1 0 0 0 0 -1 0 0 0 0 -1 0 0 6 0 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 0 6 0 1 ] y*B*y # y*B*y*B 1 0 0 0 0 1 0 0 0 0 1 0 0 -8 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 -8 0 1 ] y*B*y*B # y*B*y*z -1 0 0 0 0 -1 0 0 0 0 1 0 0 6 2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 6 2 1 ] y*B*y*z # y*B*y*C -1 0 0 0 0 -1 0 0 0 0 1 0 0 6 -2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 6 -2 1 ] y*B*y*C # y*B*z -1 0 0 0 0 1 0 0 0 0 -1 0 0 -4 2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 0 -4 2 1 ] y*B*z # y*B*z*C 1 0 0 0 0 1 0 0 0 0 1 0 0 -4 -4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 -4 -4 1 ] y*B*z*C # y*B*C -1 0 0 0 0 1 0 0 0 0 -1 0 0 -4 -2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 0 -4 -2 1 ] y*B*C # y*B*C*z 1 0 0 0 0 1 0 0 0 0 1 0 0 -4 4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 -4 4 1 ] y*B*C*z # y*z -1 0 0 0 0 -1 0 0 0 0 1 0 0 2 2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 2 2 1 ] y*z # y*z*C 1 0 0 0 0 -1 0 0 0 0 -1 0 0 2 -4 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 0 2 -4 1 ] y*z*C # y*z*C*z -1 0 0 0 0 -1 0 0 0 0 1 0 0 2 6 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 2 6 1 ] y*z*C*z # y*C -1 0 0 0 0 -1 0 0 0 0 1 0 0 2 -2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 2 -2 1 ] y*C # y*C*z 1 0 0 0 0 -1 0 0 0 0 -1 0 0 2 4 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 0 2 4 1 ] y*C*z # y*C*z*C -1 0 0 0 0 -1 0 0 0 0 1 0 0 2 -6 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 2 -6 1 ] y*C*z*C # B 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -2 0 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -2 0 1 ] B # B*y 1 0 0 0 0 1 0 0 0 0 1 0 0 4 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 4 0 1 ] B*y # B*y*B 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -6 0 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -6 0 1 ] B*y*B # B*y*B*y 1 0 0 0 0 1 0 0 0 0 1 0 0 8 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 8 0 1 ] B*y*B*y # B*y*B*z -1 0 0 0 0 -1 0 0 0 0 1 0 0 -6 2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 -6 2 1 ] B*y*B*z # B*y*B*C -1 0 0 0 0 -1 0 0 0 0 1 0 0 -6 -2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 -6 -2 1 ] B*y*B*C # B*y*z -1 0 0 0 0 1 0 0 0 0 -1 0 0 4 2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 0 4 2 1 ] B*y*z # B*y*z*C 1 0 0 0 0 1 0 0 0 0 1 0 0 4 -4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 4 -4 1 ] B*y*z*C # B*y*C -1 0 0 0 0 1 0 0 0 0 -1 0 0 4 -2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 0 4 -2 1 ] B*y*C # B*y*C*z 1 0 0 0 0 1 0 0 0 0 1 0 0 4 4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 4 4 1 ] B*y*C*z # B*z -1 0 0 0 0 -1 0 0 0 0 1 0 0 -2 2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 -2 2 1 ] B*z # B*z*C 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -2 -4 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -2 -4 1 ] B*z*C # B*z*C*z -1 0 0 0 0 -1 0 0 0 0 1 0 0 -2 6 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 -2 6 1 ] B*z*C*z # B*C -1 0 0 0 0 -1 0 0 0 0 1 0 0 -2 -2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 -2 -2 1 ] B*C # B*C*z 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -2 4 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -2 4 1 ] B*C*z # B*C*z*C -1 0 0 0 0 -1 0 0 0 0 1 0 0 -2 -6 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 -2 -6 1 ] B*C*z*C # z -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 2 1 ] z # z*C 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -4 1 ] z*C # z*C*z -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 6 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 6 1 ] z*C*z # z*C*z*C 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -8 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -8 1 ] z*C*z*C # C -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 -2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 -2 1 ] C # C*z 1 0 0 0 0 1 0 0 0 0 1 0 0 0 4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 4 1 ] C*z # C*z*C -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 -6 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 -6 1 ] C*z*C # C*z*C*z 1 0 0 0 0 1 0 0 0 0 1 0 0 0 8 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 8 1 ] C*z*C*z unit < br2.off geomview-1.9.5/data/geom/br2.off0000644000175000017500000000157012310110173013302 00000000000000# off file with full color info # Dodecahedral skeleton -- with these vertices, every face has 3 collinear ones OFF 20 12 12 -1 1 -1 # 0 0 1 -1 # 1 1 1 -1 # 2 1 0 -1 # 3 1 -1 -1 # 4 0 -1 -1 # 5 -1 -1 -1 # 6 -1 0 -1 # 7 -1 1 0 # 8 1 1 0 # 9 1 -1 0 # 10 -1 -1 0 # 11 -1 -1 1 # 12 0 -1 1 # 13 1 -1 1 # 14 1 0 1 # 15 1 1 1 # 16 0 1 1 # 17 -1 1 1 # 18 -1 0 1 # 19 5 2 9 16 15 3 .7 .0 .0 # Gen a -- red axis, rot XY about x=1 5 15 14 10 4 3 .7 .4 .4 5 7 6 11 12 19 .7 .5 .5 # Gen d -- red axis, rot XY about x=-1 5 19 18 8 0 7 .7 .2 .2 5 1 2 3 4 5 .0 .7 .0 # Gen b -- green axis, rot XZ about z=1 5 0 1 5 6 7 .4 .7 .4 5 13 14 15 16 17 .5 .7 .5 # Gen e -- green axis, rot XZ about z=-1 5 12 13 17 18 19 .2 .7 .2 5 8 9 2 1 0 .0 .0 .7 # Gen c -- blue axis, rot YZ about y=1 5 18 17 16 9 8 .4 .4 .7 5 10 11 6 5 4 .5 .5 .7 # Gen f -- blue axis, rot YZ about y=-1 5 14 13 12 11 10 .2 .2 .7 geomview-1.9.5/data/geom/br4.20000644000175000017500000005025412310110173012676 00000000000000 LIST { = GROUP 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 4.236044 3.236073 4.116320 6.660357 3.235988 4.236019 4.116247 6.660248 4.116301 4.116336 6.236025 8.472079 6.660302 6.660353 8.472052 12.708088 -2.617999 -2.272019 -0.272003 -3.330168 -2.272008 -0.618038 -0.786144 -2.272018 -0.272028 -0.786152 -0.999997 -0.831882 3.330156 2.272020 0.831867 4.236049 2.618007 5.508067 4.388304 7.446465 -2.272011 -3.162078 -4.022202 -5.508070 -0.272013 1.213862 1.544039 1.712165 3.330163 6.388349 6.067897 9.472075 0.000000 -0.999998 -1.272012 -1.272010 5.116331 2.544046 6.912269 8.912268 -1.964029 -1.559860 -1.544020 -2.770302 5.388344 2.984180 7.126113 9.472123 0.000000 -0.999998 -1.272012 -1.272010 -3.116338 -2.544059 -2.795927 -4.795938 4.508048 5.676205 3.544003 8.006355 5.388326 6.220252 4.582050 9.472104 0.000000 -0.999998 -1.272012 -1.272010 -1.000000 -3.572320 -0.867825 -3.676210 -1.272012 -0.867820 -0.663762 -1.345997 1.272012 3.676218 1.346000 4.236064 0.000000 -0.999998 -1.272012 -1.272010 -0.999997 -0.427698 -0.103902 -0.440135 -1.272013 -0.103898 -3.808371 -3.890051 1.272011 0.440132 3.890051 4.236062 2.618016 2.964040 6.388338 7.446500 0.272012 1.925997 2.449896 2.964024 -2.272008 -2.786151 -3.544029 -4.948209 3.330168 4.388352 7.640223 9.472095 -2.618012 0.272012 -2.272033 -3.330192 0.272026 -0.618037 -0.786136 -0.272001 -2.272007 -0.786154 -1.000003 -2.404184 3.330165 0.272025 2.404194 4.236067 -4.236044 -3.236073 -4.116320 -6.660357 3.236055 2.236084 1.572307 4.116349 4.116380 1.572353 3.000040 5.236146 6.660381 4.116380 5.236080 9.472168 -1.000000 -0.000004 -0.000007 -0.000006 0.000004 -0.999992 -2.544026 -2.544023 0.000010 -2.544028 -2.236040 -3.236036 -0.000011 2.544025 3.236036 4.236032 4.236044 3.235988 4.116301 -6.660302 3.236073 4.236019 4.116336 -6.660353 4.116320 4.116247 6.236025 -8.472052 -6.660357 -6.660248 -8.472079 12.708088 2.618031 2.963989 6.388348 -7.446500 0.272032 1.926005 2.449948 -2.964076 -2.272021 -2.786110 -3.544030 4.948198 -3.330190 -4.388296 -7.640247 9.472105 -2.618007 0.272061 -2.271986 3.330141 0.272020 -0.618034 -0.786155 0.272021 -2.272023 -0.786121 -0.999990 2.404168 -3.330172 -0.271973 -2.404150 4.236019 0.000000 -0.999993 -1.272025 1.272019 -1.000012 -3.572304 -0.867851 3.676214 -1.272023 -0.867825 -0.663762 1.346010 -1.272032 -3.676202 -1.346029 4.236074 0.000000 -0.999993 -1.272025 1.272019 -0.999997 -0.427687 -0.103886 0.440116 -1.272015 -0.103871 -3.808358 3.890039 -1.272012 -0.440105 -3.890043 4.236052 0.000000 -0.999993 -1.272025 1.272020 5.116311 2.543937 6.912225 -8.912189 -1.964071 -1.559846 -1.544063 2.770348 -5.388341 -2.984078 -7.126082 9.472063 0.000000 -0.999993 -1.272025 1.272019 -3.116346 -2.543999 -2.795922 4.795907 4.508118 5.676173 3.544054 -8.006397 -5.388390 -6.220198 -4.582090 9.472125 -2.618054 -2.272011 -0.272022 3.330191 -2.272021 -0.618012 -0.786138 2.272001 -0.272015 -0.786138 -1.000003 0.831875 -3.330207 -2.272001 -0.831875 4.236057 2.618018 5.508010 4.388318 -7.446449 -2.272020 -3.162049 -4.022220 5.508078 -0.272028 1.213837 1.544030 -1.712140 -3.330179 -6.388280 -6.067918 9.472061 -1.000000 0.000007 0.000010 -0.000009 0.000013 -0.999974 -2.544025 2.544015 0.000009 -2.544033 -2.236094 3.236081 0.000009 -2.544022 -3.236081 4.236068 -4.236055 -3.235998 -4.116312 6.660321 3.236075 2.236038 1.572294 -4.116322 4.116332 1.572247 2.999970 -5.236019 -6.660372 -4.116253 -5.236030 9.472063 2.618031 0.272032 -2.272021 3.330190 2.963989 1.926005 -2.786110 4.388296 6.388348 2.449948 -3.544030 7.640247 7.446500 2.964076 -4.948198 9.472105 4.236020 4.116331 -3.236044 6.660333 -4.116338 -2.236086 2.544038 -5.236072 3.236065 2.544057 -1.000002 4.116352 6.660347 5.236076 -4.116323 9.472108 -1.618031 -1.272026 0.999996 -2.058171 8.624448 1.618065 -2.890058 9.184317 -0.119716 0.346013 0.999997 -0.366131 8.718570 1.831914 -3.058173 9.472159 -1.618031 -1.272026 0.999996 -2.058171 -1.272026 -0.045745 1.653995 -1.831896 0.999997 1.653996 -2.572300 3.058174 2.058172 1.831897 -3.058173 4.236076 -1.618031 -1.272026 0.999996 -2.058171 -1.271997 -3.190330 0.890057 -3.404172 0.999993 0.890066 0.572303 1.058175 2.058151 3.404185 -1.058171 4.236058 -1.618031 -1.272026 0.999996 -2.058171 2.152287 1.618037 0.346019 2.523908 -8.352424 -2.890084 0.999993 -8.838301 8.718563 3.404215 -1.058162 9.472156 9.472139 4.116378 -3.236056 10.776736 4.116328 3.000010 -1.572291 5.236060 -3.236082 -1.572323 2.236068 -4.116361 10.776725 5.236108 -4.116329 12.708218 -4.236081 -0.000018 0.000014 -4.116356 0.000016 -0.236076 0.971735 0.000012 -0.000013 0.971735 0.236076 -0.000010 4.116356 0.000015 -0.000012 4.236081 -2.618031 -0.272032 2.272021 -3.330190 -0.272006 -0.618028 -0.786166 0.272035 2.272045 -0.786144 -1.000032 2.404221 3.330215 -0.272003 -2.404211 4.236100 2.618011 2.272015 0.272027 3.330170 -5.508077 -3.162086 1.213837 -6.388357 -4.388333 -4.022221 1.544023 -6.067927 7.446496 5.508092 -1.712135 9.472106 2.618007 -2.272011 -0.272013 -3.330163 5.508067 -3.162078 1.213862 -6.388349 4.388304 -4.022202 1.544039 -6.067897 -7.446465 5.508070 -1.712165 9.472075 4.236020 -4.116338 3.236065 -6.660347 4.116331 -2.236086 2.544057 -5.236076 -3.236044 2.544038 -1.000002 4.116323 -6.660333 5.236072 -4.116352 9.472108 -1.618022 1.272020 -1.000004 2.058164 -8.624422 1.618049 -2.890086 9.184299 0.119704 0.346019 0.999993 -0.366122 -8.718543 1.831897 -3.058201 9.472140 -1.618022 1.272020 -1.000004 2.058164 1.272008 -0.045736 1.653994 -1.831883 -0.999972 1.653983 -2.572295 3.058153 -2.058141 1.831881 -3.058170 4.236052 -1.618022 1.272020 -1.000004 2.058165 1.271992 -3.190327 0.890061 -3.404168 -1.000001 0.890070 0.572296 1.058182 -2.058146 3.404181 -1.058178 4.236054 -1.618022 1.272020 -1.000004 2.058164 -2.152294 1.618040 0.346007 2.523915 8.352421 -2.890080 1.000028 -8.838300 -8.718561 3.404211 -1.058200 9.472156 -4.236081 0.000014 -0.000011 4.116355 -0.000010 -0.236064 0.971737 0.000006 0.000008 0.971737 0.236064 -0.000005 -4.116356 0.000012 -0.000010 4.236081 9.472050 -4.116313 3.236070 -10.776637 -4.116356 3.000013 -1.572325 5.236094 3.236039 -1.572294 2.236070 -4.116317 -10.776644 5.236050 -4.116354 12.708133 2.618007 -0.272020 2.272023 -3.330172 -2.964008 1.925992 -2.786153 4.388329 -6.388363 2.449933 -3.544093 7.640285 -7.446501 2.964054 -4.948261 9.472132 -2.618019 2.272017 0.272013 3.330177 2.272031 -0.618043 -0.786143 -2.272031 0.272024 -0.786153 -0.999999 -0.831885 -3.330192 2.272027 0.831870 4.236070 0.000000 5.116331 -1.964029 -5.388344 -0.999998 2.544046 -1.559860 -2.984180 -1.272012 6.912269 -1.544020 -7.126113 1.272010 -8.912268 2.770302 9.472123 -1.618031 8.624448 -0.119716 -8.718570 -1.272026 1.618065 0.346013 -1.831914 0.999996 -2.890058 0.999997 3.058173 2.058171 -9.184317 0.366131 9.472159 -1.618022 -8.624422 0.119704 8.718543 1.272020 1.618049 0.346019 -1.831897 -1.000004 -2.890086 0.999993 3.058201 -2.058164 -9.184299 0.366122 9.472140 1.000000 0.000000 0.000000 0.000000 0.000000 1.000032 1.119731 -1.119759 0.000000 -9.352438 -1.000013 9.352439 0.000000 -9.352442 -1.119742 9.472169 1.000000 0.000000 0.000000 0.000000 0.000000 12.560243 -1.307936 -12.588503 0.000000 -1.308035 1.147992 1.424374 0.000000 -12.588513 1.424284 12.708235 1.000000 0.000000 0.000000 0.000000 0.000000 -3.000013 1.572299 3.236078 0.000000 1.572326 -2.236074 -2.544060 0.000000 -3.236092 2.544042 4.236088 -1.618035 -1.272032 1.000004 2.058181 -1.272018 -3.190345 0.890049 3.404191 1.000003 0.890054 0.572301 -1.058173 -2.058172 -3.404198 1.058171 4.236078 -1.618014 1.271980 -0.999990 -2.058126 1.272025 -3.190328 0.890049 3.404178 -0.999996 0.890034 0.572306 -1.058153 2.058156 -3.404158 1.058160 4.236036 0.000000 1.000012 1.272023 -1.272032 0.999993 -3.572304 -0.867846 3.676207 1.272025 -0.867869 -0.663786 1.346052 1.272019 -3.676232 -1.346034 4.236098 0.000000 -5.116342 1.964034 5.388357 0.999998 2.544048 -1.559860 -2.984182 1.272016 6.912281 -1.544025 -7.126126 -1.272015 -8.912283 2.770309 9.472139 0.000000 -3.116338 4.508048 -5.388326 -0.999998 -2.544059 5.676205 -6.220252 -1.272012 -2.795927 3.544003 -4.582050 1.272010 4.795938 -8.006355 9.472104 1.000000 0.000000 0.000000 0.000000 0.000000 1.000032 -9.352438 9.352442 0.000000 1.119731 -1.000013 1.119742 0.000000 1.119759 -9.352439 9.472169 1.000000 0.000000 0.000000 0.000000 0.000000 -2.999986 1.572267 -3.236038 0.000000 1.572322 -2.236064 2.544047 0.000000 3.236065 -2.544014 4.236050 1.000000 0.000000 0.000000 0.000000 0.000000 2.384071 -3.780106 4.355801 0.000000 -3.780160 11.324184 -11.896502 0.000000 4.355847 -11.896485 12.708255 -1.618035 2.152331 -8.352434 8.718584 -1.272018 1.618044 -2.890051 3.404188 1.000003 0.346006 1.000018 -1.058188 -2.058172 2.523949 -8.838302 9.472168 -1.618014 -2.152306 8.352391 -8.718534 1.272025 1.618046 -2.890083 3.404218 -0.999996 0.346016 1.000004 -1.058171 2.058156 2.523929 -8.838270 9.472130 0.000000 0.999997 1.272015 -1.272012 0.999993 -0.427705 -0.103897 0.440128 1.272025 -0.103904 -3.808382 3.890067 1.272019 -0.440135 -3.890063 4.236076 0.000000 3.116347 -4.508065 5.388346 0.999998 -2.544060 5.676209 -6.220256 1.272016 -2.795937 3.544023 -4.582073 -1.272015 4.795949 -8.006377 9.472129 0.000000 5.116311 -1.964071 5.388341 -0.999993 2.543937 -1.559846 2.984078 -1.272025 6.912225 -1.544063 7.126082 -1.272020 8.912189 -2.770348 9.472063 1.000000 0.000000 0.000000 0.000000 0.000000 12.560243 -1.308035 12.588513 0.000000 -1.307936 1.147992 -1.424284 0.000000 12.588503 -1.424374 12.708235 1.000000 0.000000 0.000000 0.000000 0.000000 1.000018 1.119723 1.119739 0.000000 -9.352461 -0.999961 -9.352457 0.000000 9.352463 1.119688 9.472184 -1.618035 8.624450 -0.119761 8.718573 -1.272018 1.618037 0.346010 1.831884 1.000003 -2.890057 1.000011 -3.058178 -2.058172 9.184314 -0.366179 9.472158 -1.618014 -8.624428 0.119766 -8.718547 1.272025 1.618081 0.346007 1.831926 -0.999996 -2.890050 1.000013 -3.058170 2.058157 9.184298 -0.366183 9.472139 0.000000 -5.116311 1.964071 -5.388341 0.999993 2.544026 -1.559877 2.984170 1.272025 6.912321 -1.544100 7.126182 1.272020 8.912285 -2.770384 9.472163 0.000000 1.000010 1.272015 1.272023 0.999999 -3.572323 -0.867820 -3.676221 1.272016 -0.867837 -0.663765 -1.346013 -1.272015 3.676223 1.346001 4.236078 0.000000 -3.116346 4.508118 5.388390 -0.999993 -2.543999 5.676173 6.220198 -1.272025 -2.795922 3.544054 4.582090 -1.272019 -4.795907 8.006397 9.472125 -1.618031 2.152287 -8.352424 -8.718563 -1.272026 1.618037 -2.890084 -3.404215 0.999996 0.346019 0.999993 1.058162 2.058171 -2.523908 8.838301 9.472156 -1.618022 -2.152294 8.352421 8.718561 1.272020 1.618040 -2.890080 -3.404211 -1.000004 0.346007 1.000028 1.058200 -2.058164 -2.523915 8.838300 9.472156 1.000000 0.000000 0.000000 0.000000 0.000000 2.384071 -3.780160 -4.355847 0.000000 -3.780106 11.324184 11.896485 0.000000 -4.355801 11.896502 12.708255 1.000000 0.000000 0.000000 0.000000 0.000000 1.000018 -9.352461 -9.352463 0.000000 1.119723 -0.999961 -1.119688 0.000000 -1.119739 9.352457 9.472184 -1.618035 -1.272018 1.000003 2.058172 -1.272018 -0.045729 1.653987 1.831882 1.000003 1.653986 -2.572309 -3.058178 -2.058172 -1.831882 3.058178 4.236073 -1.618014 1.272017 -0.999975 -2.058142 1.272025 -0.045737 1.653979 1.831881 -0.999996 1.653987 -2.572299 -3.058167 2.058156 -1.831882 3.058157 4.236051 0.000000 3.116346 -4.508118 -5.388390 0.999993 -2.544048 5.676232 6.220272 1.272025 -2.795980 3.544138 4.582191 1.272019 -4.795965 8.006481 9.472226 0.000000 0.999999 1.272015 1.272014 0.999998 -0.427698 -0.103900 -0.440134 1.272016 -0.103903 -3.808373 -3.890055 -1.272015 0.440136 3.890055 4.236067 2.618016 0.272012 -2.272008 -3.330168 2.964040 1.925997 -2.786151 -4.388352 6.388338 2.449896 -3.544029 -7.640223 -7.446500 -2.964024 4.948209 9.472095 9.472139 4.116328 -3.236082 -10.776725 4.116378 3.000010 -1.572323 -5.236108 -3.236056 -1.572291 2.236068 4.116329 -10.776736 -5.236060 4.116361 12.708218 -1.618035 -1.272018 1.000003 2.058172 2.152331 1.618044 0.346006 -2.523949 -8.352434 -2.890051 1.000018 8.838302 -8.718584 -3.404188 1.058188 9.472168 -1.618035 -1.272018 1.000003 2.058172 8.624450 1.618037 -2.890057 -9.184314 -0.119761 0.346010 1.000011 0.366179 -8.718573 -1.831884 3.058178 9.472158 4.236006 4.116304 -3.236038 -6.660304 -4.116344 -2.236078 2.544051 5.236079 3.236054 2.544031 -0.999997 -4.116326 -6.660337 -5.236038 4.116325 9.472081 2.618054 2.272021 0.272015 -3.330207 -5.508090 -3.162067 1.213847 6.388361 -4.388431 -4.022258 1.544048 6.068028 -7.446584 -5.508107 1.712166 9.472189 -2.618022 -0.272014 2.272014 3.330177 -0.272022 -0.618033 -0.786151 -0.272019 2.272019 -0.786151 -1.000001 -2.404186 -3.330187 0.272020 2.404185 4.236066 2.618018 -2.272020 -0.272028 3.330179 5.508010 -3.162049 1.213837 6.388280 4.388318 -4.022220 1.544030 6.067918 7.446449 -5.508078 1.712140 9.472061 9.472050 -4.116356 3.236039 10.776644 -4.116313 3.000013 -1.572294 -5.236050 3.236070 -1.572325 2.236070 4.116354 10.776637 -5.236094 4.116317 12.708133 -1.618014 1.272025 -0.999996 -2.058156 -2.152306 1.618046 0.346016 -2.523929 8.352391 -2.890083 1.000004 8.838270 8.718534 -3.404218 1.058171 9.472130 -1.618014 1.272025 -0.999996 -2.058157 -8.624428 1.618081 -2.890050 -9.184298 0.119766 0.346007 1.000013 0.366183 8.718547 -1.831926 3.058170 9.472139 4.236006 -4.116344 3.236054 6.660337 4.116304 -2.236078 2.544031 5.236038 -3.236038 2.544051 -0.999997 -4.116325 6.660304 -5.236079 4.116326 9.472081 -2.618018 2.272020 0.272028 -3.330179 2.272034 -0.618051 -0.786148 2.272037 0.272058 -0.786168 -1.000013 0.831927 3.330206 -2.272039 -0.831893 4.236092 2.618018 -0.272028 2.272013 3.330175 -2.964012 1.926009 -2.786142 -4.388333 -6.388313 2.449934 -3.544027 -7.640213 7.446469 -2.964065 4.948206 9.472082 -4.236044 3.236055 4.116380 -6.660381 -3.236073 2.236084 1.572353 -4.116380 -4.116320 1.572307 3.000040 -5.236080 6.660357 -4.116349 -5.236146 9.472168 2.618007 -2.964008 -6.388363 7.446501 -0.272020 1.925992 2.449933 -2.964054 2.272023 -2.786153 -3.544093 4.948261 3.330172 -4.388329 -7.640285 9.472132 0.000000 0.999993 1.272025 -1.272020 -5.116311 2.544026 6.912321 -8.912285 1.964071 -1.559877 -1.544100 2.770384 5.388341 -2.984170 -7.126182 9.472163 0.000000 0.999993 1.272025 -1.272019 3.116346 -2.544048 -2.795980 4.795965 -4.508118 5.676232 3.544138 -8.006481 5.388390 -6.220272 -4.582191 9.472226 2.618054 -5.508090 -4.388431 7.446584 2.272021 -3.162067 -4.022258 5.508107 0.272015 1.213847 1.544048 -1.712166 3.330207 -6.388361 -6.068028 9.472189 4.236055 -3.236066 -4.116391 6.660400 -3.236075 4.236069 4.116400 -6.660418 -4.116332 4.116330 6.236118 -8.472154 6.660372 -6.660371 -8.472223 12.708243 -4.236055 3.236075 4.116332 6.660372 -3.235998 2.236038 1.572247 4.116253 -4.116312 1.572294 2.999970 5.236030 -6.660321 4.116322 5.236019 9.472063 2.618011 -5.508077 -4.388333 -7.446496 2.272015 -3.162086 -4.022221 -5.508092 0.272027 1.213837 1.544023 1.712135 -3.330170 6.388357 6.067927 9.472106 0.000000 0.999998 1.272016 1.272015 -5.116342 2.544048 6.912281 8.912283 1.964034 -1.559860 -1.544025 -2.770309 -5.388357 2.984182 7.126126 9.472139 0.000000 0.999998 1.272016 1.272015 3.116347 -2.544060 -2.795937 -4.795949 -4.508065 5.676209 3.544023 8.006377 -5.388346 6.220256 4.582073 9.472129 2.618018 -2.964012 -6.388313 -7.446469 -0.272028 1.926009 2.449934 2.964065 2.272013 -2.786142 -3.544027 -4.948206 -3.330175 4.388333 7.640213 9.472082 4.236055 -3.236075 -4.116332 -6.660372 -3.236066 4.236069 4.116330 6.660371 -4.116391 4.116400 6.236118 8.472223 -6.660400 6.660418 8.472154 12.708243 unit { = INST transform 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 unit { = OFF 20 12 30 0.485869 0.081684 -0.682249 -0.485869 0.0816845 -0.682249 -0.786152 -0.185585 -0.236068 0.786152 0.185584 0.236068 1.64908e-08 0.249799 0.803619 -0.485867 0.68225 0.0816817 -1.10828e-06 0.721938 0.432444 -0.300283 0.618035 -0.485868 0.300283 0.618035 -0.485867 0.485866 0.68225 0.0816816 0.48587 -0.682248 -0.0816834 0.300283 -0.618035 0.485868 -0.300282 -0.618035 0.485867 1.18342e-06 -0.249798 -0.803619 1.31609e-06 -0.721936 -0.432451 -0.485869 -0.682249 -0.0816828 -0.485868 -0.0816825 0.682249 -0.786152 0.185586 0.236067 0.786152 -0.185584 -0.236069 0.485868 -0.0816818 0.682249 5 3 9 6 4 19 0.800 0.098 0.098 5 13 14 15 2 1 0.098 0.647 0.400 5 3 18 0 8 9 0.098 0.098 0.800 5 2 17 5 7 1 0.898 0.600 0.000 5 11 12 15 14 10 0.000 0.600 0.800 5 7 8 0 13 1 0.498 0.000 0.898 5 5 6 9 8 7 0.498 0.000 0.898 5 11 19 4 16 12 0.000 0.600 0.800 5 17 2 15 12 16 0.898 0.600 0.000 5 18 3 19 11 10 0.098 0.098 0.800 5 14 13 0 18 10 0.098 0.647 0.400 5 17 16 4 6 5 0.800 0.098 0.098 } } } geomview-1.9.5/data/geom/br4fd.grp0000644000175000017500000000640312310110173013634 00000000000000# first group is generated by mirrors in axial planes: an 8-group GROUP 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 # gen a -1.61803 1.61803 0 -2.05817 -1.61803 0 0 -1.27202 0 0 1. 0 2.05817 -1.27202 0 2.61803 # gen d -1.61803 1.61803 0 2.05817 -1.61803 0 0 1.27202 0 0 1. 0 -2.05817 1.27202 0 2.61803 # gen b 1. 0 0 0 0 -1.61803 1.61803 -2.05817 0 -1.61803 0 -1.27202 0 2.05817 -1.27202 2.61803 # gen e 1. 0 0 0 0 -1.61803 1.61803 2.05817 0 -1.61803 0 1.27202 0 -2.05817 1.27202 2.61803 # gen c 0 0 -1.61803 -1.27202 0 1. 0 0 1.61803 0 -1.61803 -2.05817 -1.27202 0 2.05817 2.61803 # gen f 0 0 -1.61803 1.27202 0 1. 0 0 1.61803 0 -1.61803 2.05817 1.27202 0 -2.05817 2.61803 # gen A -1.61803 -1.61803 0 -2.05817 1.61803 0 0 1.27202 0 0 1. 0 2.05817 1.27202 0 2.61803 # gen D -1.61803 -1.61803 0 2.05817 1.61803 0 0 -1.27202 0 0 1. 0 -2.05817 -1.27202 0 2.61803 # gen B 1. 0 0 0 0 -1.61803 -1.61803 -2.05817 0 1.61803 0 1.27202 0 2.05817 1.27202 2.61803 # gen E 1. 0 0 0 0 -1.61803 -1.61803 2.05817 0 1.61803 0 -1.27202 0 -2.05817 -1.27202 2.61803 # gen C 0 0 1.61803 1.27202 0 1. 0 0 -1.61803 0 -1.61803 -2.05817 1.27202 0 2.05817 2.61803 # gen F 0 0 1.61803 -1.27202 0 1. 0 0 -1.61803 0 -1.61803 2.05817 -1.27202 0 -2.05817 2.61803 unit { = GROUP 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 -1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 unit { = GROUP # 3-fold rotation around corner of cube: permute axes 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 unit { = OFF 10 3 0 0.7579059138615393 0 0 0.76651332039993 0.03177568660262966 0 0.761643475234047 0 0.3154303394649576 0.7690740946291093 0.02763226360843495 0.3108379510433509 0.7861517593139627 0 0.2661280023229838 0.7738976242448507 -0.01982764615896841 0.2833485453167403 0.769074105124659 -0.02763227943718742 0.3108379445592113 0.4753137794988412 0.502946214098463 0.4582362038235173 0.4584672578570311 0.4905491851102674 0.478294998570738 0.4582361416623694 0.4753138842983664 0.502946150726337 4 0 1 3 2 4 4 5 8 7 4 5 6 9 8 } } } geomview-1.9.5/data/geom/br4fd.list0000644000175000017500000000450212310110173014015 00000000000000LIST { = MESH 2 8 0.7579059138615393 0 0 0.76651332039993 0.03177568660262966 0 0.7579779866175186 0 0.04538510606666562 0.7665625934501444 0.03169596107004424 0.0446271640792877 0.7581951357729962 0 0.0907318675787886 0.7667110744629495 0.03145571355597267 0.0892281091374536 0.7585602238832991 0 0.1360010995809191 0.7669607985179795 0.03105165122981218 0.1337760186804655 0.7590782673912475 0 0.1811518454941813 0.7673153312677793 0.03047800474002143 0.1782428169567251 0.7597568530207174 0 0.2261402424551481 0.7677800637708247 0.029726051163901 0.2225983631241245 0.7606068345221955 0 0.2709180175572909 0.7683627057880064 0.0287833158364887 0.2668093840957922 0.761643475234047 0 0.3154303394649576 0.7690740946291093 0.02763226360843495 0.3108379510433509 } { = MESH 3 8 0.7861517593139627 0 0.2661280023229838 0.7738976242448507 -0.01982764615896841 0.2833485453167403 0.769074105124659 -0.02763227943718742 0.3108379445592113 0.757071625106808 0.04705262662452854 0.28229323805774 0.7437062724435042 0.02689203114228158 0.3006908158437836 0.739090346704468 0.01795824204595514 0.3293689073588267 0.7243359492180561 0.1000200415588125 0.301004170404473 0.7098646844645808 0.07985308087092879 0.3204961991622625 0.7055942720601457 0.0696952943227478 0.3500705981219554 0.6872663974684004 0.1599998121193638 0.3227738126187827 0.671726893075355 0.1402129538949691 0.3432333014454127 0.6679544370507728 0.1287523144951528 0.3733332702265169 0.6450165049525545 0.2283615467424957 0.3482776400509785 0.6285096554912128 0.2094205706937072 0.3694984323075352 0.625400542586092 0.1966221502331062 0.3996329939579712 0.5965273548742813 0.3068186081068267 0.3784224389061146 0.579275294822943 0.2892927185164642 0.400056266821622 0.5769998417813672 0.2752223122882413 0.4295462376216213 0.5404835339218083 0.397499378804228 0.4144633058434224 0.5229476209569261 0.3820928662699146 0.435894636965632 0.5216579844253421 0.3670388728418455 0.4637493455224979 0.4753137794988412 0.502946214098463 0.4582362038235173 0.4584672578570311 0.4905491851102674 0.478294998570738 0.4582361416623694 0.4753138842983664 0.502946150726337 } geomview-1.9.5/data/geom/cam.off0000644000175000017500000000014712310110173013354 00000000000000OFF 5 2 6 0 0 0 -.1 0 .5 .1 0 .5 0 -.1 .5 0 .1 .5 3 0 1 2 1.000 1.000 0.000 3 0 3 4 0.000 1.000 1.000 geomview-1.9.5/data/geom/camera-frustum0000644000175000017500000000111012310110173014765 00000000000000# # After loading this file, cameras are drawn (when selected with # "Draw other cameras" on the Cameras panel) with their viewing pyramids # shown: small and large white rectangles for the near and far planes, # connected by pale blue lines marking the edges of the viewing pyramid. # (camera-prop { VECT 6 16 3 -4 -4 2 2 2 2 1 1 1 0 0 0 -1 -1 -1.0 1 -1 -1.0 1 1 -1.0 -1 1 -1.0 -1 -1 1.0 1 -1 1.0 1 1 1.0 -1 1 1.0 -1 -1 -1.0 -1 -1 1.0 -1 1 -1.0 -1 1 1.0 1 1 -1.0 1 1 1.0 1 -1 -1.0 1 -1 1.0 .3 .3 .5 1 .1 .1 .8 1 1 1 1 1 } projective) geomview-1.9.5/data/geom/catenoid0000644000175000017500000003634312310110173013640 00000000000000OFF 420 400 820 3.7622 0 -2 3.10747 0 -1.8 2.45131 0.79648 -1.6 2.1509 0 -1.4 2.04563 0.664664 -1.4 1.72204 0.559523 -1.2 1.46756 0.476838 -1 1.54308 0 -1 1.18546 0 -0.6 1.08107 0 -0.4 0.970141 0.315218 0.2 1.02007 0 0.2 1.02816 0.33407 0.4 1.12744 0.366329 0.6 1.18546 0 0.6 1.33744 0 0.8 1.27198 0.41329 0.8 1.46756 0.476838 1 1.54308 0 1 1.72204 0.559523 1.2 2.57746 0 1.6 2.45131 0.79648 1.6 3.10747 0 1.8 3.57806 1.16258 2 3.7622 0 2 3.57806 1.16258 -2 2.514 1.82653 -1.8 2.95538 0.960262 -1.8 1.24838 0.907 -1 1.08201 0.786125 -0.8 1.27198 0.41329 -0.8 1.12744 0.366329 -0.6 1.02816 0.33407 -0.4 0.970141 0.315218 -0.2 0.951057 0.309017 0 0.874606 0.635438 0.4 1.08201 0.786125 0.8 1.24838 0.907 1 1.46485 1.06428 1.2 2.04563 0.664664 1.4 2.95538 0.960262 1.8 3.04368 2.21136 2 3.04368 2.21136 -2 1.82653 2.514 -1.8 2.08521 1.515 -1.6 1.515 2.08521 -1.6 1.74011 1.26427 -1.4 1.06428 1.46485 -1.2 1.46485 1.06428 -1.2 0.907 1.24838 -1 0.696799 0.959062 -0.6 0.959062 0.696799 -0.6 0.874606 0.635438 -0.4 0.635438 0.874606 -0.4 0.825251 0.59958 -0.2 0.59958 0.825251 -0.2 0.587785 0.809017 0 0.809017 0.587785 0 0.59958 0.825251 0.2 0.825251 0.59958 0.2 0.635438 0.874606 0.4 0.959062 0.696799 0.6 0.696799 0.959061 0.6 0.786125 1.08201 0.8 1.74011 1.26427 1.4 1.26427 1.74011 1.4 1.515 2.08521 1.6 2.08521 1.515 1.6 2.514 1.82653 1.8 1.82653 2.514 1.8 2.21136 3.04368 2 2.21136 3.04368 -2 1.16258 3.57806 -2 0.960262 2.95538 -1.8 1.26427 1.74011 -1.4 0.559523 1.72204 -1.2 0.786125 1.08201 -0.8 0.41329 1.27198 -0.8 0.33407 1.02816 -0.4 0.315218 0.970141 -0.2 0.33407 1.02816 0.4 0.41329 1.27198 0.8 0.907 1.24838 1 0.476838 1.46756 1 1.06428 1.46485 1.2 0.79648 2.45131 1.6 0 3.10747 -1.8 0.79648 2.45131 -1.6 0 2.57746 -1.6 0.664664 2.04563 -1.4 0 1.81066 -1.2 0 1.54308 -1 0.476838 1.46756 -1 0 1.33744 -0.8 0.366329 1.12744 -0.6 0 1.18546 -0.6 0.309017 0.951057 0 0.315218 0.970141 0.2 0 1.08107 0.4 0.366329 1.12744 0.6 0 1.18546 0.6 0 1.54308 1 0.559523 1.72204 1.2 0.664664 2.04563 1.4 0 2.57746 1.6 0.960262 2.95538 1.8 1.16258 3.57806 2 0 3.7622 -2 -1.16258 3.57806 -2 -0.960262 2.95538 -1.8 0 2.1509 -1.4 -0.476838 1.46756 -1 0 1.08107 -0.4 0 1.02007 -0.2 -0.309017 0.951057 0 0 1 0 0 1.02007 0.2 -0.315218 0.970141 0.2 -0.41329 1.27198 0.8 0 1.33744 0.8 -0.559523 1.72204 1.2 0 1.81066 1.2 -0.664664 2.04563 1.4 0 2.1509 1.4 -0.79648 2.45131 1.6 0 3.10747 1.8 0 3.7622 2 -2.21136 3.04368 -2 -1.82653 2.514 -1.8 -0.79648 2.45131 -1.6 -0.664664 2.04563 -1.4 -0.559523 1.72204 -1.2 -1.06428 1.46485 -1.2 -0.907 1.24838 -1 -0.786125 1.08201 -0.8 -0.41329 1.27198 -0.8 -0.696799 0.959062 -0.6 -0.366329 1.12744 -0.6 -0.33407 1.02816 -0.4 -0.635438 0.874606 -0.4 -0.315218 0.970141 -0.2 -0.587785 0.809017 0 -0.59958 0.825251 0.2 -0.33407 1.02816 0.4 -0.366329 1.12744 0.6 -0.476838 1.46756 1 -1.06428 1.46485 1.2 -1.26427 1.74011 1.4 -0.960262 2.95538 1.8 -2.21136 3.04368 2 -1.16258 3.57806 2 -3.04368 2.21136 -2 -2.08521 1.515 -1.6 -1.515 2.08521 -1.6 -1.26427 1.74011 -1.4 -1.08201 0.786125 -0.8 -0.874606 0.635438 -0.4 -0.59958 0.825251 -0.2 -0.809017 0.587785 0 -0.825251 0.59958 0.2 -0.635438 0.874606 0.4 -0.696799 0.959062 0.6 -0.786124 1.08201 0.8 -0.907 1.24838 1 -1.74011 1.26427 1.4 -2.08521 1.515 1.6 -1.51499 2.08521 1.6 -1.82653 2.514 1.8 -3.57806 1.16258 -2 -2.514 1.82653 -1.8 -2.95538 0.960262 -1.8 -1.74011 1.26427 -1.4 -1.46485 1.06428 -1.2 -1.24838 0.907 -1 -0.959061 0.696799 -0.6 -1.12744 0.366329 -0.6 -0.825251 0.59958 -0.2 -0.970141 0.315218 -0.2 -0.951057 0.309017 0 -0.874606 0.635438 0.4 -1.12744 0.366329 0.6 -0.959061 0.696799 0.6 -1.08201 0.786125 0.8 -1.24838 0.907 1 -1.46485 1.06428 1.2 -1.72204 0.559523 1.2 -2.514 1.82653 1.8 -3.04368 2.21136 2 -3.7622 0 -2 -2.45131 0.79648 -1.6 -2.1509 0 -1.4 -2.04563 0.664664 -1.4 -1.72204 0.559523 -1.2 -1.46756 0.476838 -1 -1.33744 0 -0.8 -1.27198 0.41329 -0.8 -1.02816 0.33407 -0.4 -1.08107 0 -0.4 -1 0 0 -0.970141 0.315218 0.2 -1.08107 0 0.4 -1.02816 0.33407 0.4 -1.18546 0 0.6 -1.27198 0.41329 0.8 -1.33744 0 0.8 -1.46756 0.476838 1 -1.81066 0 1.2 -2.04563 0.664664 1.4 -2.45131 0.796481 1.6 -2.95538 0.960262 1.8 -3.10747 0 1.8 -3.57806 1.16258 2 -3.10747 0 -1.8 -2.57746 0 -1.6 -2.45131 -0.79648 -1.6 -1.81066 0 -1.2 -1.54308 0 -1 -1.12744 -0.366329 -0.6 -1.18546 0 -0.6 -0.970141 -0.315218 -0.2 -1.02007 0 -0.2 -0.951057 -0.309017 0 -1.02007 0 0.2 -0.970141 -0.315218 0.2 -1.12744 -0.366329 0.6 -1.27198 -0.41329 0.8 -1.54308 0 1 -2.1509 0 1.4 -2.45131 -0.79648 1.6 -2.57746 0 1.6 -2.95538 -0.960262 1.8 -3.7622 0 2 -3.57806 -1.16258 -2 -2.514 -1.82653 -1.8 -2.95538 -0.960262 -1.8 -2.04563 -0.664664 -1.4 -1.72204 -0.559523 -1.2 -1.24838 -0.907 -1 -1.46756 -0.476838 -1 -1.27198 -0.41329 -0.8 -0.959062 -0.696799 -0.6 -1.02816 -0.33407 -0.4 -0.825251 -0.59958 0.2 -1.02816 -0.33407 0.4 -0.874606 -0.635438 0.4 -0.959062 -0.696799 0.6 -1.08201 -0.786124 0.8 -1.24838 -0.907 1 -1.46756 -0.476838 1 -1.72204 -0.559523 1.2 -2.04563 -0.664664 1.4 -3.04368 -2.21136 2 -3.57806 -1.16258 2 -3.04368 -2.21136 -2 -1.82653 -2.514 -1.8 -2.08521 -1.515 -1.6 -1.515 -2.08521 -1.6 -1.74011 -1.26427 -1.4 -1.46485 -1.06428 -1.2 -1.08201 -0.786124 -0.8 -0.786125 -1.08201 -0.8 -0.696799 -0.959061 -0.6 -0.874606 -0.635438 -0.4 -0.635438 -0.874606 -0.4 -0.59958 -0.825251 -0.2 -0.825251 -0.59958 -0.2 -0.809017 -0.587785 0 -0.59958 -0.825251 0.2 -0.635438 -0.874606 0.4 -0.696799 -0.959061 0.6 -0.786125 -1.08201 0.8 -0.907 -1.24838 1 -1.46485 -1.06428 1.2 -1.74011 -1.26427 1.4 -2.08521 -1.51499 1.6 -2.514 -1.82653 1.8 -2.21136 -3.04368 2 -2.21136 -3.04368 -2 -1.16258 -3.57806 -2 -0.664664 -2.04563 -1.4 -1.26427 -1.74011 -1.4 -1.06428 -1.46485 -1.2 -0.559523 -1.72204 -1.2 -0.476838 -1.46756 -1 -0.907 -1.24838 -1 -0.41329 -1.27198 -0.8 -0.315218 -0.970141 -0.2 -0.587785 -0.809017 0 -0.315218 -0.970141 0.2 -0.41329 -1.27198 0.8 -0.476838 -1.46756 1 -1.06428 -1.46485 1.2 -0.664664 -2.04563 1.4 -1.26427 -1.74011 1.4 -0.796481 -2.45131 1.6 -1.515 -2.08521 1.6 -1.82653 -2.514 1.8 -0.960262 -2.95538 -1.8 -0.79648 -2.45131 -1.6 0 -2.1509 -1.4 0 -1.81066 -1.2 0 -1.54308 -1 -0.366329 -1.12744 -0.6 -0.33407 -1.02816 -0.4 0 -1.08107 -0.4 0 -1 0 -0.309017 -0.951056 0 0 -1.02007 0.2 -0.33407 -1.02816 0.4 -0.366329 -1.12744 0.6 0 -1.54308 1 0 -1.81066 1.2 -0.559524 -1.72204 1.2 0 -2.1509 1.4 0 -2.57746 1.6 -0.960262 -2.95538 1.8 0 -3.10747 1.8 0 -3.7622 2 -1.16258 -3.57806 2 0 -3.7622 -2 0 -3.10747 -1.8 0.960262 -2.95538 -1.8 0 -2.57746 -1.6 0 -1.33744 -0.8 0 -1.18546 -0.6 0.33407 -1.02816 -0.4 0 -1.02007 -0.2 0.309017 -0.951057 0 0 -1.08107 0.4 0 -1.18546 0.6 0 -1.33744 0.8 0.41329 -1.27198 0.8 0.476838 -1.46756 1 0.664664 -2.04563 1.4 1.16258 -3.57806 -2 2.21136 -3.04368 -2 1.82653 -2.514 -1.8 0.79648 -2.45131 -1.6 0.664664 -2.04563 -1.4 0.559523 -1.72204 -1.2 1.06428 -1.46485 -1.2 0.476838 -1.46756 -1 0.907 -1.24838 -1 0.41329 -1.27198 -0.8 0.786124 -1.08201 -0.8 0.366329 -1.12744 -0.6 0.315218 -0.970141 -0.2 0.59958 -0.825251 -0.2 0.587785 -0.809017 0 0.315218 -0.970141 0.2 0.59958 -0.825251 0.2 0.33407 -1.02816 0.4 0.366329 -1.12744 0.6 0.786124 -1.08201 0.8 0.559523 -1.72204 1.2 1.06428 -1.46485 1.2 0.79648 -2.45131 1.6 0.960262 -2.95538 1.8 2.21136 -3.04368 2 1.16258 -3.57806 2 3.04368 -2.21136 -2 2.514 -1.82653 -1.8 2.08521 -1.515 -1.6 1.51499 -2.08521 -1.6 1.26427 -1.74011 -1.4 1.08201 -0.786125 -0.8 0.696799 -0.959062 -0.6 0.635438 -0.874606 -0.4 0.874606 -0.635438 -0.4 0.809017 -0.587785 0 0.635438 -0.874606 0.4 0.874606 -0.635438 0.4 0.696799 -0.959062 0.6 0.907 -1.24838 1 1.46485 -1.06428 1.2 1.74011 -1.26427 1.4 1.26427 -1.74011 1.4 1.51499 -2.08521 1.6 1.82653 -2.514 1.8 2.514 -1.82653 1.8 3.57806 -1.16258 -2 2.95538 -0.960262 -1.8 1.74011 -1.26427 -1.4 1.72204 -0.559523 -1.2 1.46485 -1.06428 -1.2 1.24838 -0.907 -1 1.27198 -0.41329 -0.8 1.12744 -0.366329 -0.6 0.959061 -0.696799 -0.6 1.02816 -0.33407 -0.4 0.825251 -0.59958 -0.2 0.951056 -0.309017 0 0.825251 -0.59958 0.2 0.970141 -0.315218 0.2 1.02816 -0.33407 0.4 0.959061 -0.696799 0.6 1.27198 -0.41329 0.8 1.08201 -0.786125 0.8 1.24838 -0.907 1 2.08521 -1.515 1.6 2.95538 -0.960262 1.8 3.04368 -2.21136 2 2.57746 0 -1.6 2.45131 -0.796481 -1.6 2.04563 -0.664664 -1.4 1.81066 0 -1.2 1.46756 -0.476838 -1 1.33744 0 -0.8 1.02007 0 -0.2 0.970141 -0.315218 -0.2 1 0 0 1.08107 0 0.4 1.12744 -0.366329 0.6 1.46756 -0.476838 1 1.72204 -0.559524 1.2 1.81066 0 1.2 2.1509 0 1.4 2.04563 -0.664664 1.4 2.45131 -0.796481 1.6 3.57806 -1.16258 2 4 0 25 27 1 4 1 27 2 402 4 402 2 4 3 4 3 4 5 405 4 405 5 6 7 4 7 6 30 407 4 407 30 31 8 4 8 31 32 9 4 9 32 33 408 4 408 33 34 410 4 410 34 10 11 4 11 10 12 411 4 411 12 13 14 4 14 13 16 15 4 15 16 17 18 4 18 17 19 415 4 415 19 39 416 4 416 39 21 20 4 20 21 40 22 4 22 40 23 24 4 25 42 26 27 4 27 26 44 2 4 2 44 46 4 4 4 46 48 5 4 5 48 28 6 4 6 28 29 30 4 30 29 51 31 4 31 51 52 32 4 32 52 54 33 4 33 54 57 34 4 34 57 59 10 4 10 59 35 12 4 12 35 61 13 4 13 61 36 16 4 16 36 37 17 4 17 37 38 19 4 19 38 64 39 4 39 64 67 21 4 21 67 68 40 4 40 68 41 23 4 42 71 43 26 4 26 43 45 44 4 44 45 74 46 4 46 74 47 48 4 48 47 49 28 4 28 49 76 29 4 29 76 50 51 4 51 50 53 52 4 52 53 55 54 4 54 55 56 57 4 57 56 58 59 4 59 58 60 35 4 35 60 62 61 4 61 62 63 36 4 36 63 82 37 4 37 82 84 38 4 38 84 65 64 4 64 65 66 67 4 67 66 69 68 4 68 69 70 41 4 71 72 73 43 4 43 73 87 45 4 45 87 89 74 4 74 89 75 47 4 47 75 92 49 4 49 92 77 76 4 76 77 94 50 4 50 94 78 53 4 53 78 79 55 4 55 79 96 56 4 56 96 97 58 4 58 97 80 60 4 60 80 99 62 4 62 99 81 63 4 63 81 83 82 4 82 83 102 84 4 84 102 103 65 4 65 103 85 66 4 66 85 105 69 4 69 105 106 70 4 72 107 86 73 4 73 86 88 87 4 87 88 110 89 4 89 110 90 75 4 75 90 91 92 4 92 91 93 77 4 77 93 95 94 4 94 95 112 78 4 78 112 113 79 4 79 113 115 96 4 96 115 116 97 4 97 116 98 80 4 80 98 100 99 4 99 100 119 81 4 81 119 101 83 4 83 101 121 102 4 102 121 123 103 4 103 123 104 85 4 85 104 125 105 4 105 125 126 106 4 107 108 109 86 4 86 109 129 88 4 88 129 130 110 4 110 130 131 90 4 90 131 111 91 4 91 111 135 93 4 93 135 137 95 4 95 137 138 112 4 112 138 140 113 4 113 140 114 115 4 115 114 117 116 4 116 117 143 98 4 98 143 144 100 4 100 144 118 119 4 119 118 145 101 4 101 145 120 121 4 121 120 122 123 4 123 122 124 104 4 104 124 148 125 4 125 148 150 126 4 108 127 128 109 4 109 128 153 129 4 129 153 154 130 4 130 154 132 131 4 131 132 133 111 4 111 133 134 135 4 135 134 136 137 4 137 136 139 138 4 138 139 157 140 4 140 157 141 114 4 114 141 142 117 4 117 142 160 143 4 143 160 161 144 4 144 161 162 118 4 118 162 163 145 4 145 163 146 120 4 120 146 147 122 4 122 147 166 124 4 124 166 167 148 4 148 167 149 150 4 127 151 169 128 4 128 169 152 153 4 153 152 171 154 4 154 171 172 132 4 132 172 173 133 4 133 173 155 134 4 134 155 174 136 4 136 174 156 139 4 139 156 176 157 4 157 176 158 141 4 141 158 159 142 4 142 159 179 160 4 160 179 181 161 4 161 181 182 162 4 162 182 183 163 4 163 183 184 146 4 146 184 164 147 4 147 164 165 166 4 166 165 186 167 4 167 186 187 149 4 151 168 170 169 4 169 170 189 152 4 152 189 191 171 4 171 191 192 172 4 172 192 193 173 4 173 193 195 155 4 155 195 175 174 4 174 175 196 156 4 156 196 177 176 4 176 177 178 158 4 158 178 199 159 4 159 199 201 179 4 179 201 180 181 4 181 180 203 182 4 182 203 205 183 4 183 205 185 184 4 184 185 207 164 4 164 207 208 165 4 165 208 209 186 4 186 209 211 187 4 168 188 212 170 4 170 212 213 189 4 189 213 190 191 4 191 190 215 192 4 192 215 216 193 4 193 216 194 195 4 195 194 218 175 4 175 218 197 196 4 196 197 220 177 4 177 220 198 178 4 178 198 222 199 4 199 222 200 201 4 201 200 202 180 4 180 202 204 203 4 203 204 226 205 4 205 226 206 185 4 185 206 227 207 4 207 227 229 208 4 208 229 210 209 4 209 210 231 211 4 188 232 234 212 4 212 234 214 213 4 213 214 235 190 4 190 235 236 215 4 215 236 238 216 4 216 238 239 194 4 194 239 217 218 4 218 217 241 197 4 197 241 219 220 4 220 219 221 198 4 198 221 223 222 4 222 223 243 200 4 200 243 224 202 4 202 224 225 204 4 204 225 248 226 4 226 248 249 206 4 206 249 250 227 4 227 250 228 229 4 229 228 230 210 4 210 230 252 231 4 232 253 233 234 4 234 233 255 214 4 214 255 257 235 4 235 257 258 236 4 236 258 237 238 4 238 237 259 239 4 239 259 240 217 4 217 240 262 241 4 241 262 265 219 4 219 265 266 221 4 221 266 242 223 4 223 242 244 243 4 243 244 245 224 4 224 245 246 225 4 225 246 247 248 4 248 247 272 249 4 249 272 273 250 4 250 273 274 228 4 228 274 275 230 4 230 275 251 252 4 253 277 254 233 4 233 254 256 255 4 255 256 280 257 4 257 280 281 258 4 258 281 284 237 4 237 284 260 259 4 259 260 261 240 4 240 261 263 262 4 262 263 264 265 4 265 264 287 266 4 266 287 267 242 4 242 267 268 244 4 244 268 269 245 4 245 269 270 246 4 246 270 271 247 4 247 271 291 272 4 272 291 293 273 4 273 293 295 274 4 274 295 296 275 4 275 296 276 251 4 277 278 297 254 4 254 297 298 256 4 256 298 279 280 4 280 279 282 281 4 281 282 283 284 4 284 283 285 260 4 260 285 302 261 4 261 302 303 263 4 263 303 286 264 4 264 286 306 287 4 287 306 288 267 4 267 288 308 268 4 268 308 309 269 4 269 309 289 270 4 270 289 290 271 4 271 290 312 291 4 291 312 292 293 4 293 292 294 295 4 295 294 315 296 4 296 315 318 276 4 278 319 320 297 4 297 320 322 298 4 298 322 299 279 4 279 299 300 282 4 282 300 301 283 4 283 301 323 285 4 285 323 324 302 4 302 324 304 303 4 303 304 326 286 4 286 326 305 306 4 306 305 307 288 4 288 307 328 308 4 308 328 329 309 4 309 329 330 289 4 289 330 310 290 4 290 310 311 312 4 312 311 313 292 4 292 313 314 294 4 294 314 316 315 4 315 316 317 318 4 319 334 321 320 4 320 321 337 322 4 322 337 338 299 4 299 338 339 300 4 300 339 341 301 4 301 341 343 323 4 323 343 345 324 4 324 345 325 304 4 304 325 346 326 4 326 346 327 305 4 305 327 349 307 4 307 349 351 328 4 328 351 352 329 4 329 352 331 330 4 330 331 332 310 4 310 332 354 311 4 311 354 333 313 4 313 333 356 314 4 314 356 357 316 4 316 357 359 317 4 334 335 336 321 4 321 336 363 337 4 337 363 364 338 4 338 364 340 339 4 339 340 342 341 4 341 342 344 343 4 343 344 366 345 4 345 366 367 325 4 325 367 347 346 4 346 347 348 327 4 327 348 350 349 4 349 350 370 351 4 351 370 372 352 4 352 372 353 331 4 331 353 373 332 4 332 373 355 354 4 354 355 376 333 4 333 376 377 356 4 356 377 378 357 4 357 378 358 359 4 335 360 361 336 4 336 361 362 363 4 363 362 382 364 4 364 382 384 340 4 340 384 385 342 4 342 385 365 344 4 344 365 388 366 4 366 388 368 367 4 367 368 390 347 4 347 390 369 348 4 348 369 392 350 4 350 392 371 370 4 370 371 395 372 4 372 395 397 353 4 353 397 398 373 4 373 398 374 355 4 355 374 375 376 4 376 375 399 377 4 377 399 379 378 4 378 379 401 358 4 360 380 381 361 4 361 381 403 362 4 362 403 404 382 4 382 404 383 384 4 384 383 406 385 4 385 406 386 365 4 365 386 387 388 4 388 387 389 368 4 368 389 409 390 4 390 409 391 369 4 369 391 393 392 4 392 393 394 371 4 371 394 412 395 4 395 412 396 397 4 397 396 413 398 4 398 413 414 374 4 374 414 417 375 4 375 417 418 399 4 399 418 400 379 4 379 400 419 401 4 380 0 1 381 4 381 1 402 403 4 403 402 3 404 4 404 3 405 383 4 383 405 7 406 4 406 7 407 386 4 386 407 8 387 4 387 8 9 389 4 389 9 408 409 4 409 408 410 391 4 391 410 11 393 4 393 11 411 394 4 394 411 14 412 4 412 14 15 396 4 396 15 18 413 4 413 18 415 414 4 414 415 416 417 4 417 416 20 418 4 418 20 22 400 4 400 22 24 419 geomview-1.9.5/data/geom/cone.off0000644000175000017500000000207712310110173013544 00000000000000OFF 22 40 120 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.500000 0.000000 0.000000 0.475528 0.000000 0.154508 0.404508 0.000000 0.293893 0.293893 0.000000 0.404508 0.154508 0.000000 0.475528 0.000000 0.000000 0.500000 -0.154508 0.000000 0.475528 -0.293893 0.000000 0.404508 -0.404508 0.000000 0.293893 -0.475528 0.000000 0.154508 -0.500000 0.000000 0.000000 -0.475528 0.000000 -0.154508 -0.404508 0.000000 -0.293893 -0.293893 0.000000 -0.404508 -0.154508 0.000000 -0.475528 -0.000000 0.000000 -0.500000 0.154508 0.000000 -0.475528 0.293893 0.000000 -0.404508 0.404508 0.000000 -0.293893 0.475528 0.000000 -0.154508 3 2 3 0 3 3 2 1 3 3 4 0 3 4 3 1 3 4 5 0 3 5 4 1 3 5 6 0 3 6 5 1 3 6 7 0 3 7 6 1 3 7 8 0 3 8 7 1 3 8 9 0 3 9 8 1 3 9 10 0 3 10 9 1 3 10 11 0 3 11 10 1 3 11 12 0 3 12 11 1 3 12 13 0 3 13 12 1 3 13 14 0 3 14 13 1 3 14 15 0 3 15 14 1 3 15 16 0 3 16 15 1 3 16 17 0 3 17 16 1 3 17 18 0 3 18 17 1 3 18 19 0 3 19 18 1 3 19 20 0 3 20 19 1 3 20 21 0 3 21 20 1 3 21 2 0 3 2 21 1 geomview-1.9.5/data/geom/csquare.quad0000644000175000017500000000010712310110173014433 00000000000000CQUAD -1 -1 0 1 0 0 1 1 -1 0 0 1 0 1 1 1 0 0 1 0 1 -1 1 0 1 0 0 1 geomview-1.9.5/data/geom/cube0000644000175000017500000000062612310110173012763 00000000000000OFF 8 6 12 -0.5 -0.5 -0.5 # 0 0.5 -0.5 -0.5 # 1 0.5 0.5 -0.5 # 2 -0.5 0.5 -0.5 # 3 -0.5 -0.5 0.5 # 4 0.5 -0.5 0.5 # 5 0.5 0.5 0.5 # 6 -0.5 0.5 0.5 # 7 4 3 2 1 0 0.800 0.098 0.098 4 4 5 6 7 0.098 0.647 0.400 4 2 3 7 6 0.098 0.098 0.800 4 0 1 5 4 0.898 0.600 0.000 4 0 4 7 3 0.000 0.600 0.800 4 1 2 6 5 0.498 0.000 0.898 geomview-1.9.5/data/geom/cube.off0000644000175000017500000000063612310110173013535 00000000000000OFF 8 6 12 1.632993 0.000000 1.154701 0.000000 1.632993 1.154701 -1.632993 0.000000 1.154701 -0.000000 -1.632993 1.154701 1.632993 -0.000000 -1.154701 0.000000 1.632993 -1.154701 -1.632993 0.000000 -1.154701 -0.000000 -1.632993 -1.154701 4 0 1 2 3 0.784 0.000 0.000 4 7 4 0 3 0.784 0.000 0.000 4 4 5 1 0 0.784 0.000 0.000 4 5 6 2 1 0.784 0.000 0.000 4 3 2 6 7 0.784 0.000 0.000 4 6 5 4 7 0.784 0.000 0.000 geomview-1.9.5/data/geom/diamond0000644000175000017500000000063512310110173013460 00000000000000{ = OFF 8 6 12 -2.39634e-09 5.55112e-17 -0.00781639 -2.39634e-09 0 0.107816 -0.5 -0.288675 -0.00781641 -0.5 -0.288675 0.107816 0.5 -0.288675 -0.00781641 0.5 -0.288675 0.107816 -5.09434e-09 -0.57735 -0.00781642 -5.09434e-09 -0.57735 0.107816 4 4 5 7 6 0.800 0.098 0.098 4 0 1 5 4 0.098 0.647 0.400 4 2 0 4 6 0.098 0.098 0.800 4 3 7 5 1 0.098 0.098 0.800 4 2 3 1 0 0.098 0.647 0.400 4 7 3 2 6 0.800 0.098 0.098 } geomview-1.9.5/data/geom/dodec0000644000175000017500000000173612310110173013126 00000000000000OFF 20 12 30 0.485869 0.081684 -0.682249 -0.485869 0.0816845 -0.682249 -0.786152 -0.185585 -0.236068 0.786152 0.185584 0.236068 1.64908e-08 0.249799 0.803619 -0.485867 0.68225 0.0816817 -1.10828e-06 0.721938 0.432444 -0.300283 0.618035 -0.485868 0.300283 0.618035 -0.485867 0.485866 0.68225 0.0816816 0.48587 -0.682248 -0.0816834 0.300283 -0.618035 0.485868 -0.300282 -0.618035 0.485867 1.18342e-06 -0.249798 -0.803619 1.31609e-06 -0.721936 -0.432451 -0.485869 -0.682249 -0.0816828 -0.485868 -0.0816825 0.682249 -0.786152 0.185586 0.236067 0.786152 -0.185584 -0.236069 0.485868 -0.0816818 0.682249 5 3 9 6 4 19 0.800 0.098 0.098 5 13 14 15 2 1 0.098 0.647 0.400 5 3 18 0 8 9 0.098 0.098 0.800 5 2 17 5 7 1 0.898 0.600 0.000 5 11 12 15 14 10 0.000 0.600 0.800 5 7 8 0 13 1 0.498 0.000 0.898 5 5 6 9 8 7 0.498 0.000 0.898 5 11 19 4 16 12 0.000 0.600 0.800 5 17 2 15 12 16 0.898 0.600 0.000 5 18 3 19 11 10 0.098 0.098 0.800 5 14 13 0 18 10 0.098 0.647 0.400 5 17 16 4 6 5 0.800 0.098 0.098 geomview-1.9.5/data/geom/dodec.off0000644000175000017500000000142312310110173013670 00000000000000OFF 20 12 30 1.214124 0.000000 1.589309 0.375185 1.154701 1.589309 -0.982247 0.713644 1.589309 -0.982247 -0.713644 1.589309 0.375185 -1.154701 1.589309 1.964494 0.000000 0.375185 0.607062 1.868345 0.375185 -1.589309 1.154701 0.375185 -1.589309 -1.154701 0.375185 0.607062 -1.868345 0.375185 1.589309 1.154701 -0.375185 -0.607062 1.868345 -0.375185 -1.964494 0.000000 -0.375185 -0.607062 -1.868345 -0.375185 1.589309 -1.154701 -0.375185 0.982247 0.713644 -1.589309 -0.375185 1.154701 -1.589309 -1.214124 0.000000 -1.589309 -0.375185 -1.154701 -1.589309 0.982247 -0.713644 -1.589309 5 0 1 2 3 4 5 0 5 10 6 1 5 1 6 11 7 2 5 2 7 12 8 3 5 3 8 13 9 4 5 4 9 14 5 0 5 15 10 5 14 19 5 16 11 6 10 15 5 17 12 7 11 16 5 18 13 8 12 17 5 19 14 9 13 18 5 19 18 17 16 15 geomview-1.9.5/data/geom/dodec.quad0000644000175000017500000001535712310110173014063 00000000000000QUAD 0.467086 0.151765 0.794654 0.356822 0.491123 0.794654 0 0.491123 0.794654 0 0 0.794654 4.89153e-09 0.491123 0.794654 -0.356822 0.491123 0.794654 -0.467086 0.151765 0.794654 0 0 0.794654 -0.467086 0.151766 0.794654 -0.57735 -0.187593 0.794654 -0.288675 -0.397327 0.794654 0 0 0.794654 -0.288675 -0.397327 0.794654 4.36694e-09 -0.607062 0.794654 0.288675 -0.397327 0.794654 0 0 0.794654 0.288675 -0.397327 0.794654 0.57735 -0.187592 0.794654 0.467086 0.151766 0.794654 0 0 0.794654 -0.467086 0.642889 0.491123 -0.356822 0.491123 0.794654 0 0.491123 0.794654 0 0.710761 0.35538 -4.89153e-09 0.491123 0.794654 0.356822 0.491123 0.794654 0.467086 0.642889 0.491123 0 0.710761 0.35538 0.467086 0.642889 0.491123 0.57735 0.794654 0.187592 0.288675 0.888451 -1.14076e-08 0 0.710761 0.35538 0.288675 0.888451 -7.3664e-09 -4.36694e-09 0.982247 -0.187593 -0.288675 0.888451 -1.14076e-08 0 0.710761 0.35538 -0.288675 0.888451 -5.26782e-09 -0.57735 0.794654 0.187592 -0.467086 0.642889 0.491123 0 0.710761 0.35538 -0.755761 -0.245562 0.491123 -0.57735 -0.187593 0.794654 -0.467086 0.151765 0.794654 -0.675974 0.219637 0.35538 -0.467086 0.151765 0.794654 -0.356822 0.491123 0.794654 -0.467086 0.642889 0.491123 -0.675974 0.219637 0.35538 -0.467086 0.642889 0.491123 -0.57735 0.794655 0.187592 -0.755761 0.549093 -1.14076e-08 -0.675974 0.219637 0.35538 -0.755761 0.549093 -7.3664e-09 -0.934172 0.303531 -0.187593 -0.934172 -2.07029e-08 -1.14076e-08 -0.675974 0.219637 0.35538 -0.934172 -1.71496e-08 -5.26782e-09 -0.934172 -0.303531 0.187592 -0.755761 -0.245562 0.491123 -0.675974 0.219637 0.35538 -1.00113e-08 -0.794654 0.491123 4.54901e-08 -0.607062 0.794654 -0.288675 -0.397327 0.794654 -0.417775 -0.575017 0.35538 -0.288675 -0.397327 0.794654 -0.57735 -0.187592 0.794654 -0.755761 -0.245562 0.491123 -0.417775 -0.575017 0.35538 -0.755761 -0.245562 0.491123 -0.934172 -0.303531 0.187592 -0.755761 -0.549093 -1.14076e-08 -0.417775 -0.575017 0.35538 -0.755761 -0.549093 -7.3664e-09 -0.57735 -0.794654 -0.187593 -0.288675 -0.888451 -1.14076e-08 -0.417775 -0.575017 0.35538 -0.288675 -0.888451 -5.26782e-09 1.00383e-07 -0.982247 0.187592 4.30641e-08 -0.794654 0.491123 -0.417775 -0.575017 0.35538 0.755761 -0.245562 0.491123 0.57735 -0.187592 0.794654 0.288675 -0.397327 0.794654 0.417775 -0.575017 0.35538 0.288675 -0.397327 0.794654 -6.64812e-08 -0.607062 0.794654 -1.37909e-08 -0.794654 0.491123 0.417775 -0.575017 0.35538 -2.23522e-08 -0.794654 0.491123 -8.1395e-08 -0.982247 0.187592 0.288675 -0.888451 -1.14076e-08 0.417775 -0.575017 0.35538 0.288675 -0.888451 -7.3664e-09 0.57735 -0.794654 -0.187593 0.755761 -0.549093 -1.14076e-08 0.417775 -0.575017 0.35538 0.755761 -0.549093 -5.26782e-09 0.934172 -0.303531 0.187592 0.755761 -0.245562 0.491123 0.417775 -0.575017 0.35538 0.467086 0.642889 0.491123 0.356822 0.491124 0.794654 0.467086 0.151766 0.794654 0.675974 0.219637 0.35538 0.467086 0.151766 0.794654 0.57735 -0.187593 0.794654 0.755761 -0.245562 0.491123 0.675974 0.219637 0.35538 0.755761 -0.245562 0.491123 0.934172 -0.303531 0.187592 0.934172 -1.1657e-08 -1.14076e-08 0.675974 0.219637 0.35538 0.934172 7.38211e-09 -7.3664e-09 0.934172 0.303531 -0.187593 0.755761 0.549093 -1.14076e-08 0.675974 0.219637 0.35538 0.755761 0.549093 -5.26782e-09 0.57735 0.794655 0.187592 0.467086 0.642889 0.491123 0.675974 0.219637 0.35538 0.467086 -0.151766 -0.794654 0.356822 -0.491124 -0.794654 -1.84541e-09 -0.491123 -0.794655 -1.90518e-08 -1.23409e-08 -0.794655 0.288675 0.397327 -0.794654 0.57735 0.187593 -0.794654 0.467086 -0.151766 -0.794655 5.84952e-09 -2.19329e-08 -0.794655 -0.288675 0.397327 -0.794654 -7.49759e-09 0.607062 -0.794654 0.288675 0.397327 -0.794655 2.2667e-08 -1.2144e-09 -0.794655 -0.467086 -0.151766 -0.794654 -0.57735 0.187593 -0.794654 -0.288675 0.397327 -0.794655 8.15945e-09 2.11823e-08 -0.794655 -1.20299e-08 -0.491124 -0.794654 -0.356822 -0.491124 -0.794654 -0.467086 -0.151766 -0.794655 -1.76242e-08 1.43058e-08 -0.794655 -0.467086 -0.642889 -0.491123 -0.356822 -0.491123 -0.794655 1.84541e-09 -0.491123 -0.794654 1.90518e-08 -0.710761 -0.35538 -0.288675 -0.888451 2.22646e-08 -0.57735 -0.794655 -0.187592 -0.467086 -0.642889 -0.491123 -5.84952e-09 -0.710761 -0.35538 0.288675 -0.888451 6.16147e-08 7.49759e-09 -0.982247 0.187593 -0.288675 -0.888451 2.2589e-08 -2.2667e-08 -0.710761 -0.35538 0.467086 -0.642889 -0.491123 0.57735 -0.794655 -0.187592 0.288675 -0.888451 1.69983e-08 -8.15945e-09 -0.710761 -0.35538 1.20299e-08 -0.491123 -0.794655 0.356822 -0.491123 -0.794655 0.467086 -0.642889 -0.491123 1.76242e-08 -0.710761 -0.35538 0.467086 -0.642889 -0.491123 0.356822 -0.491124 -0.794655 0.467086 -0.151765 -0.794654 0.675974 -0.219637 -0.35538 0.755761 -0.549093 2.22646e-08 0.57735 -0.794655 -0.187592 0.467086 -0.642889 -0.491123 0.675974 -0.219637 -0.35538 0.934173 2.46164e-08 6.16147e-08 0.934173 -0.303531 0.187593 0.755761 -0.549093 2.2589e-08 0.675974 -0.219637 -0.35538 0.755761 0.245562 -0.491123 0.934173 0.303531 -0.187592 0.934172 1.72476e-08 1.69983e-08 0.675974 -0.219637 -0.35538 0.467086 -0.151765 -0.794655 0.57735 0.187593 -0.794655 0.755761 0.245562 -0.491123 0.675974 -0.219637 -0.35538 0.755761 0.245562 -0.491123 0.57735 0.187592 -0.794655 0.288675 0.397327 -0.794654 0.417775 0.575018 -0.35538 0.755761 0.549093 2.22646e-08 0.934173 0.303531 -0.187592 0.755761 0.245562 -0.491123 0.417775 0.575017 -0.35538 0.288675 0.888451 6.16147e-08 0.57735 0.794655 0.187593 0.755761 0.549093 2.2589e-08 0.417775 0.575017 -0.35538 -9.5395e-08 0.794655 -0.491123 -1.48376e-07 0.982247 -0.187592 0.288675 0.888451 1.69983e-08 0.417775 0.575018 -0.35538 0.288675 0.397327 -0.794655 -1.13967e-07 0.607062 -0.794655 -5.42455e-08 0.794655 -0.491123 0.417775 0.575018 -0.35538 6.30315e-08 0.794655 -0.491123 1.12471e-07 0.607062 -0.794655 -0.288675 0.397327 -0.794654 -0.417775 0.575017 -0.35538 -0.288675 0.888451 2.22646e-08 8.93221e-08 0.982247 -0.187592 2.49723e-08 0.794655 -0.491123 -0.417775 0.575017 -0.35538 -0.755761 0.549093 6.16147e-08 -0.57735 0.794655 0.187593 -0.288675 0.888451 2.2589e-08 -0.417775 0.575018 -0.35538 -0.755761 0.245562 -0.491123 -0.934173 0.303531 -0.187592 -0.755761 0.549093 1.69983e-08 -0.417775 0.575018 -0.35538 -0.288675 0.397327 -0.794655 -0.57735 0.187592 -0.794655 -0.755761 0.245562 -0.491123 -0.417775 0.575017 -0.35538 -0.755761 0.245562 -0.491123 -0.57735 0.187593 -0.794655 -0.467086 -0.151766 -0.794654 -0.675974 -0.219637 -0.35538 -0.934173 1.57169e-08 2.22646e-08 -0.934173 0.303531 -0.187592 -0.755761 0.245562 -0.491123 -0.675974 -0.219637 -0.35538 -0.755761 -0.549093 6.16147e-08 -0.934173 -0.303531 0.187593 -0.934173 2.62936e-08 2.2589e-08 -0.675974 -0.219637 -0.35538 -0.467086 -0.642889 -0.491123 -0.57735 -0.794655 -0.187592 -0.755761 -0.549093 1.69983e-08 -0.675974 -0.219637 -0.35538 -0.467086 -0.151766 -0.794655 -0.356822 -0.491124 -0.794655 -0.467086 -0.642889 -0.491123 -0.675974 -0.219637 -0.35538 geomview-1.9.5/data/geom/dodec2.off0000644000175000017500000000161412310110173013754 00000000000000OFF 20 12 30 0. 0. 1. .666667 0. .745356 -.333333 .577350 .745356 -.333333 -.577350 .745356 .722234 .606026 .333333 .163717 .928486 .333333 -.885951 .322460 .333333 -.885951 -.322460 .333333 .163717 -.928486 .333333 .722234 -.606026 .333333 .885951 .322460 -.333333 -.163717 .928486 -.333333 -.722234 .606026 -.333333 -.722234 -.606026 -.333333 -.163717 -.928486 -.333333 .885951 -.322460 -.333333 .333333 .577350 -.745356 -.666667 0. -.745356 .333333 -.577350 -.745356 0. 0. -1. 5 0 1 4 5 2 1.000 1.000 0.000 5 0 2 6 7 3 1.000 1.000 0.000 5 0 3 8 9 1 1.000 1.000 0.000 5 1 9 15 10 4 1.000 1.000 0.000 5 2 5 11 12 6 1.000 1.000 0.000 5 3 7 13 14 8 1.000 1.000 0.000 5 19 16 10 15 18 1.000 1.000 0.000 5 19 18 14 13 17 1.000 1.000 0.000 5 19 17 12 11 16 1.000 1.000 0.000 5 18 15 9 8 14 1.000 1.000 0.000 5 17 13 7 6 12 1.000 1.000 0.000 5 16 11 5 4 10 1.000 1.000 0.000 geomview-1.9.5/data/geom/facecube.off0000644000175000017500000000056612310110173014356 00000000000000# off file with per face color OFF 8 6 12 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 -1.0 -1.0 -1.0 1.0 1.0 -1.0 1.0 -1.0 -1.0 -1.0 1.0 -1.0 -1.0 -1.0 4 0 2 3 1 .05 .8 .1 .75 4 4 5 7 6 .2 .05 .8 .75 4 0 4 6 2 .9 .9 .02 .75 4 1 3 7 5 .0 .7 .4 .75 4 0 1 5 4 .1 .4 .7 .75 4 2 6 7 3 .7 .7 0 .75 geomview-1.9.5/data/geom/hdodec.off0000644000175000017500000000173612310110173014047 00000000000000OFF 20 12 30 0.485869 0.081684 -0.682249 -0.485869 0.0816845 -0.682249 -0.786152 -0.185585 -0.236068 0.786152 0.185584 0.236068 1.64908e-08 0.249799 0.803619 -0.485867 0.68225 0.0816817 -1.10828e-06 0.721938 0.432444 -0.300283 0.618035 -0.485868 0.300283 0.618035 -0.485867 0.485866 0.68225 0.0816816 0.48587 -0.682248 -0.0816834 0.300283 -0.618035 0.485868 -0.300282 -0.618035 0.485867 1.18342e-06 -0.249798 -0.803619 1.31609e-06 -0.721936 -0.432451 -0.485869 -0.682249 -0.0816828 -0.485868 -0.0816825 0.682249 -0.786152 0.185586 0.236067 0.786152 -0.185584 -0.236069 0.485868 -0.0816818 0.682249 5 3 9 6 4 19 0.800 0.098 0.098 5 13 14 15 2 1 0.098 0.647 0.400 5 3 18 0 8 9 0.098 0.098 0.800 5 2 17 5 7 1 0.898 0.600 0.000 5 11 12 15 14 10 0.000 0.600 0.800 5 7 8 0 13 1 0.498 0.000 0.898 5 5 6 9 8 7 0.498 0.000 0.898 5 11 19 4 16 12 0.000 0.600 0.800 5 17 2 15 12 16 0.898 0.600 0.000 5 18 3 19 11 10 0.098 0.098 0.800 5 14 13 0 18 10 0.098 0.647 0.400 5 17 16 4 6 5 0.800 0.098 0.098 geomview-1.9.5/data/geom/helicoid0000644000175000017500000004233212310110173013625 00000000000000OFF 441 400 840 0 3.62686 0 -1.12076 3.44935 0.314159 0 2.94217 0 0 2.37557 0 0 1.9043 0 -0.466449 1.43558 0.314159 0 1.50946 0 -0.363157 1.11768 0.314159 0 1.1752 0 0 0.888106 0 0 0.636654 0 0 0.410752 0 -0.126929 0.390649 0.314159 0 0.201336 0 0 0 0 0 -0.201336 0 0 -0.410752 0 0.126929 -0.390649 0.314159 0 -0.636654 0 0.27444 -0.844639 0.314159 0 -0.888106 0 0 -1.1752 0 0 -1.50946 0 0 -1.9043 0 0 -2.37557 0 0.734091 -2.2593 0.314159 0 -2.94217 0 1.12076 -3.44935 0.314159 0 -3.62686 0 -2.13181 2.93419 0.628319 -0.909182 2.79817 0.314159 -1.72937 2.38027 0.628319 -1.39632 1.92188 0.628319 -0.734091 2.2593 0.314159 -0.588462 1.8111 0.314159 -0.27444 0.844639 0.314159 -0.522016 0.718493 0.628319 -0.196737 0.605494 0.314159 -0.374216 0.515064 0.628319 -0.062216 0.191482 0.314159 0 0 0.314159 0.118342 -0.162884 0.628319 0.062216 -0.191482 0.314159 0.196737 -0.605494 0.314159 0.363157 -1.11768 0.314159 0.466449 -1.43558 0.314159 0.887239 -1.22118 0.628319 0.588462 -1.8111 0.314159 1.11932 -1.54061 0.628319 1.72937 -2.38027 0.628319 0.909182 -2.79817 0.314159 2.13181 -2.93419 0.628319 -1.54061 1.11932 0.942478 -1.11932 1.54061 0.628319 -0.887239 1.22118 0.628319 -0.690766 0.950758 0.628319 -0.241434 0.332306 0.628319 -0.332306 0.241434 0.942478 -0.118342 0.162884 0.628319 -0.162884 0.118342 0.942478 0 0 0.628319 0.162884 -0.118342 0.942478 0.241434 -0.332306 0.628319 0.374216 -0.515064 0.628319 0.522016 -0.718493 0.628319 0.690766 -0.950758 0.628319 1.39632 -1.92188 0.628319 2.93419 -2.13181 0.942478 -2.93419 2.13181 0.942478 -2.79817 0.909182 1.25664 -2.38027 1.72937 0.942478 -1.92188 1.39632 0.942478 -1.8111 0.588462 1.25664 -1.22118 0.887239 0.942478 -0.950758 0.690766 0.942478 -1.11768 0.363157 1.25664 -0.718493 0.522016 0.942478 -0.844639 0.27444 1.25664 -0.515064 0.374216 0.942478 -0.390649 0.126929 1.25664 0 0 0.942478 0.191482 -0.062216 1.25664 0.390649 -0.126929 1.25664 0.332306 -0.241434 0.942478 0.515064 -0.374216 0.942478 0.718493 -0.522016 0.942478 0.844639 -0.27444 1.25664 0.950758 -0.690766 0.942478 1.11768 -0.363157 1.25664 1.43558 -0.466449 1.25664 1.22118 -0.887239 0.942478 1.8111 -0.588462 1.25664 1.54061 -1.11932 0.942478 1.92188 -1.39632 0.942478 2.38027 -1.72937 0.942478 -3.44935 1.12076 1.25664 -2.94217 0 1.5708 -2.2593 0.734091 1.25664 -1.9043 0 1.5708 -1.43558 0.466449 1.25664 -1.1752 0 1.5708 -0.605494 0.196737 1.25664 -0.191482 0.062216 1.25664 0 0 1.5708 0 0 1.25664 0.636654 0 1.5708 0.605494 -0.196737 1.25664 0.888106 0 1.5708 1.1752 0 1.5708 1.50946 0 1.5708 1.9043 0 1.5708 2.2593 -0.734091 1.25664 2.79817 -0.909182 1.25664 2.94217 0 1.5708 3.62686 0 1.5708 3.44935 -1.12076 1.25664 -3.62686 0 1.5708 -2.79817 -0.909182 1.88496 -2.37557 0 1.5708 -1.43558 -0.466449 1.88496 -1.50946 0 1.5708 -0.888106 0 1.5708 -0.636654 0 1.5708 -0.605494 -0.196737 1.88496 -0.410752 0 1.5708 -0.390649 -0.126929 1.88496 -0.201336 0 1.5708 0.201336 0 1.5708 0.410752 0 1.5708 0.605494 0.196737 1.88496 2.37557 0 1.5708 3.44935 1.12076 1.88496 -3.44935 -1.12076 1.88496 -2.38027 -1.72937 2.19912 -2.2593 -0.734091 1.88496 -1.54061 -1.11932 2.19912 -1.8111 -0.588461 1.88496 -1.22118 -0.887239 2.19912 -1.11768 -0.363157 1.88496 -0.950758 -0.690766 2.19912 -0.844639 -0.27444 1.88496 -0.191482 -0.062216 1.88496 0 0 1.88496 0.191482 0.062216 1.88496 0.390649 0.126929 1.88496 0.515064 0.374216 2.19912 0.844639 0.27444 1.88496 0.718493 0.522016 2.19912 1.11768 0.363157 1.88496 1.22118 0.887239 2.19912 1.43558 0.466449 1.88496 1.8111 0.588461 1.88496 1.54061 1.11932 2.19912 2.2593 0.734091 1.88496 2.79817 0.909182 1.88496 2.38027 1.72937 2.19912 2.93419 2.13181 2.19912 -2.93419 -2.13181 2.19912 -1.72937 -2.38027 2.51327 -1.39632 -1.92188 2.51327 -1.92188 -1.39632 2.19912 -0.718493 -0.522016 2.19912 -0.374216 -0.515064 2.51327 -0.515064 -0.374216 2.19912 -0.332306 -0.241434 2.19912 -0.118342 -0.162884 2.51327 -0.162884 -0.118342 2.19912 0 0 2.19912 0.118342 0.162884 2.51327 0.162884 0.118342 2.19912 0.332306 0.241434 2.19912 0.374216 0.515064 2.51327 0.522016 0.718493 2.51327 0.690766 0.950758 2.51327 0.950758 0.690766 2.19912 1.92188 1.39632 2.19912 2.13181 2.93419 2.51327 -2.13181 -2.93419 2.51327 -0.734091 -2.2593 2.82743 -1.11932 -1.54061 2.51327 -0.466449 -1.43558 2.82743 -0.887239 -1.22118 2.51327 -0.690766 -0.950758 2.51327 -0.363157 -1.11768 2.82743 -0.522016 -0.718493 2.51327 -0.196737 -0.605494 2.82743 -0.241434 -0.332306 2.51327 0 0 2.51327 0.062216 0.191482 2.82743 0.126929 0.390649 2.82743 0.241434 0.332306 2.51327 0.27444 0.844639 2.82743 0.363157 1.11768 2.82743 0.466449 1.43558 2.82743 0.887239 1.22118 2.51327 1.11932 1.54061 2.51327 0.588462 1.8111 2.82743 1.39632 1.92188 2.51327 0.909182 2.79817 2.82743 1.72937 2.38027 2.51327 1.12076 3.44935 2.82743 -1.12076 -3.44935 2.82743 0 -2.94217 3.14159 -0.909182 -2.79817 2.82743 0 -2.37557 3.14159 -0.588462 -1.8111 2.82743 0 -1.1752 3.14159 0 -0.888106 3.14159 -0.27444 -0.844639 2.82743 0 -0.410752 3.14159 -0.126929 -0.390649 2.82743 -0.062216 -0.191482 2.82743 0 -0.201336 3.14159 0 0 2.82743 0 0 3.14159 0 0.201336 3.14159 0.196737 0.605494 2.82743 0 1.50946 3.14159 0 1.9043 3.14159 0.734091 2.2593 2.82743 0 2.94217 3.14159 0 -3.62686 3.14159 1.12076 -3.44935 3.45575 0.588461 -1.8111 3.45575 0 -1.9043 3.14159 0 -1.50946 3.14159 0 -0.636654 3.14159 0.126929 -0.390649 3.45575 0.062216 -0.191482 3.45575 0 0 3.45575 -0.062216 0.191482 3.45575 0 0.410752 3.14159 0 0.636654 3.14159 0 0.888106 3.14159 0 1.1752 3.14159 -0.363157 1.11768 3.45575 0 2.37557 3.14159 -0.909182 2.79817 3.45575 0 3.62686 3.14159 2.13181 -2.93419 3.76991 0.909182 -2.79817 3.45575 0.734091 -2.2593 3.45575 1.39632 -1.92188 3.76991 0.466449 -1.43558 3.45575 0.363157 -1.11768 3.45575 0.27444 -0.844639 3.45575 0.374216 -0.515064 3.76991 0.196737 -0.605494 3.45575 0.241434 -0.332306 3.76991 0.118342 -0.162884 3.76991 0 0 3.76991 -0.241434 0.332306 3.76991 -0.126929 0.390649 3.45575 -0.196737 0.605494 3.45575 -0.522016 0.718493 3.76991 -0.27444 0.844639 3.45575 -0.466449 1.43558 3.45575 -0.588461 1.8111 3.45575 -0.734091 2.2593 3.45575 -1.72937 2.38027 3.76991 -1.12076 3.44935 3.45575 1.72937 -2.38027 3.76991 1.11932 -1.54061 3.76991 0.887239 -1.22118 3.76991 1.22118 -0.887239 4.08407 0.950758 -0.690766 4.08407 0.690766 -0.950758 3.76991 0.522016 -0.718493 3.76991 0.162884 -0.118342 4.08407 0 0 4.08407 -0.118342 0.162884 3.76991 -0.162884 0.118342 4.08407 -0.332306 0.241434 4.08407 -0.374216 0.515064 3.76991 -0.718493 0.522016 4.08407 -0.690766 0.950758 3.76991 -0.950758 0.690766 4.08407 -0.887239 1.22118 3.76991 -1.11932 1.54061 3.76991 -1.39632 1.92188 3.76991 -2.93419 2.13181 4.08407 -2.13181 2.93419 3.76991 2.93419 -2.13181 4.08407 2.38027 -1.72937 4.08407 1.92188 -1.39632 4.08407 1.54061 -1.11932 4.08407 0.718493 -0.522016 4.08407 0.844639 -0.27444 4.39823 0.515064 -0.374216 4.08407 0.332306 -0.241434 4.08407 0.191482 -0.062216 4.39823 0 0 4.39823 -0.191482 0.062216 4.39823 -0.390649 0.126929 4.39823 -0.515064 0.374216 4.08407 -0.605494 0.196737 4.39823 -0.844639 0.27444 4.39823 -1.22118 0.887239 4.08407 -1.43558 0.466449 4.39823 -1.54061 1.11932 4.08407 -1.92188 1.39632 4.08407 -2.2593 0.734091 4.39823 -2.38027 1.72937 4.08407 3.44935 -1.12076 4.39823 3.62686 0 4.71239 2.79817 -0.909182 4.39823 2.94217 0 4.71239 2.2593 -0.734091 4.39823 1.8111 -0.588462 4.39823 1.9043 0 4.71239 1.43558 -0.466449 4.39823 1.1752 0 4.71239 1.11768 -0.363157 4.39823 0.605494 -0.196737 4.39823 0.390649 -0.126929 4.39823 0.410752 0 4.71239 0 0 4.71239 -0.201336 0 4.71239 -0.410752 0 4.71239 -1.11768 0.363157 4.39823 -1.9043 0 4.71239 -1.8111 0.588462 4.39823 -2.94217 0 4.71239 -2.79817 0.909182 4.39823 -3.62686 0 4.71239 -3.44935 1.12076 4.39823 2.37557 0 4.71239 1.50946 0 4.71239 0.844639 0.27444 5.02655 0.888106 0 4.71239 0.636654 0 4.71239 0.605494 0.196737 5.02655 0.201336 0 4.71239 0.191482 0.062216 5.02655 -0.390649 -0.126929 5.02655 -0.636654 0 4.71239 -0.888106 0 4.71239 -1.1752 0 4.71239 -1.11768 -0.363157 5.02655 -1.50946 0 4.71239 -2.37557 0 4.71239 -2.2593 -0.734091 5.02655 -3.44935 -1.12076 5.02655 3.44935 1.12076 5.02655 2.79817 0.909182 5.02655 2.2593 0.734091 5.02655 1.8111 0.588461 5.02655 1.43558 0.466449 5.02655 0.950758 0.690766 5.34071 1.11768 0.363157 5.02655 0.515064 0.374216 5.34071 0.390649 0.126929 5.02655 0.162884 0.118342 5.34071 0 0 5.02655 -0.162884 -0.118342 5.34071 -0.191482 -0.062216 5.02655 -0.332306 -0.241434 5.34071 -0.605494 -0.196737 5.02655 -0.718493 -0.522016 5.34071 -0.844639 -0.27444 5.02655 -0.950758 -0.690766 5.34071 -1.43558 -0.466449 5.02655 -1.22118 -0.887239 5.34071 -1.8111 -0.588461 5.02655 -1.54061 -1.11932 5.34071 -2.79817 -0.909182 5.02655 -2.38027 -1.72937 5.34071 2.93419 2.13181 5.34071 2.13181 2.93419 5.65487 2.38027 1.72937 5.34071 1.72937 2.38027 5.65487 1.92188 1.39632 5.34071 1.39632 1.92188 5.65487 1.54061 1.11932 5.34071 1.22118 0.887239 5.34071 0.887239 1.22118 5.65487 0.690766 0.950758 5.65487 0.718493 0.522016 5.34071 0.522016 0.718493 5.65487 0.374216 0.515064 5.65487 0.332306 0.241434 5.34071 0.241434 0.332306 5.65487 0.118342 0.162884 5.65487 0 0 5.34071 -0.118342 -0.162884 5.65487 -0.241434 -0.332306 5.65487 -0.515064 -0.374216 5.34071 -0.522016 -0.718493 5.65487 -1.92188 -1.39632 5.34071 -2.13181 -2.93419 5.65487 -2.93419 -2.13181 5.34071 1.12076 3.44935 5.96903 0.909182 2.79817 5.96903 1.11932 1.54061 5.65487 0.363157 1.11768 5.96903 0.196737 0.605494 5.96903 0.062216 0.191482 5.96903 0 0 5.96903 0 0 5.65487 -0.062216 -0.191482 5.96903 -0.126929 -0.390649 5.96903 -0.374216 -0.515064 5.65487 -0.27444 -0.844639 5.96903 -0.690766 -0.950758 5.65487 -0.466449 -1.43558 5.96903 -0.887239 -1.22118 5.65487 -0.588462 -1.8111 5.96903 -1.11932 -1.54061 5.65487 -1.39632 -1.92188 5.65487 -0.734091 -2.2593 5.96903 -1.72937 -2.38027 5.65487 -0.909182 -2.79817 5.96903 0 3.62686 6.28319 0 2.94217 6.28319 0.734091 2.2593 5.96903 0 2.37557 6.28319 0 1.9043 6.28319 0.588462 1.8111 5.96903 0 1.50946 6.28319 0.466449 1.43558 5.96903 0 1.1752 6.28319 0.27444 0.844639 5.96903 0 0.888106 6.28319 0 0.636654 6.28319 0 0.410752 6.28319 0.126929 0.390649 5.96903 0 0.201336 6.28319 0 0 6.28319 0 -0.201336 6.28319 0 -0.410752 6.28319 -0.196737 -0.605494 5.96903 0 -0.636654 6.28319 0 -0.888106 6.28319 -0.363157 -1.11768 5.96903 0 -1.1752 6.28319 0 -1.50946 6.28319 0 -1.9043 6.28319 0 -2.37557 6.28319 0 -2.94217 6.28319 0 -3.62686 6.28319 -1.12076 -3.44935 5.96903 4 0 1 30 2 4 2 30 33 3 4 3 33 34 4 4 4 34 5 6 4 6 5 7 8 4 8 7 35 9 4 9 35 37 10 4 10 37 12 11 4 11 12 39 13 4 13 39 40 14 4 14 40 42 15 4 15 42 17 16 4 16 17 43 18 4 18 43 19 20 4 20 19 44 21 4 21 44 45 22 4 22 45 47 23 4 23 47 25 24 4 24 25 50 26 4 26 50 27 28 4 1 29 31 30 4 30 31 32 33 4 33 32 53 34 4 34 53 54 5 4 5 54 55 7 4 7 55 36 35 4 35 36 38 37 4 37 38 56 12 4 12 56 58 39 4 39 58 60 40 4 40 60 41 42 4 42 41 62 17 4 17 62 63 43 4 43 63 64 19 4 19 64 65 44 4 44 65 46 45 4 45 46 48 47 4 47 48 66 25 4 25 66 49 50 4 50 49 51 27 4 29 68 70 31 4 31 70 71 32 4 32 71 52 53 4 53 52 73 54 4 54 73 74 55 4 55 74 76 36 4 36 76 78 38 4 38 78 57 56 4 56 57 59 58 4 58 59 80 60 4 60 80 61 41 4 41 61 83 62 4 62 83 84 63 4 63 84 85 64 4 64 85 87 65 4 65 87 90 46 4 46 90 92 48 4 48 92 93 66 4 66 93 94 49 4 49 94 67 51 4 68 95 69 70 4 70 69 97 71 4 71 97 72 52 4 52 72 99 73 4 73 99 75 74 4 74 75 77 76 4 76 77 101 78 4 78 101 79 57 4 57 79 102 59 4 59 102 104 80 4 80 104 81 61 4 61 81 82 83 4 83 82 106 84 4 84 106 86 85 4 85 86 88 87 4 87 88 89 90 4 90 89 91 92 4 92 91 111 93 4 93 111 112 94 4 94 112 115 67 4 95 116 96 69 4 69 96 118 97 4 97 118 98 72 4 72 98 120 99 4 99 120 100 75 4 75 100 121 77 4 77 121 122 101 4 101 122 124 79 4 79 124 126 102 4 102 126 103 104 4 104 103 127 81 4 81 127 128 82 4 82 128 105 106 4 106 105 107 86 4 86 107 108 88 4 88 108 109 89 4 89 109 110 91 4 91 110 130 111 4 111 130 113 112 4 112 113 114 115 4 116 132 117 96 4 96 117 134 118 4 118 134 136 98 4 98 136 119 120 4 120 119 138 100 4 100 138 140 121 4 121 140 123 122 4 122 123 125 124 4 124 125 141 126 4 126 141 142 103 4 103 142 143 127 4 127 143 144 128 4 128 144 129 105 4 105 129 146 107 4 107 146 148 108 4 108 148 150 109 4 109 150 151 110 4 110 151 153 130 4 130 153 154 113 4 113 154 131 114 4 132 157 133 117 4 117 133 160 134 4 134 160 135 136 4 136 135 137 119 4 119 137 139 138 4 138 139 161 140 4 140 161 163 123 4 123 163 164 125 4 125 164 166 141 4 141 166 167 142 4 142 167 169 143 4 143 169 170 144 4 144 170 145 129 4 129 145 147 146 4 146 147 174 148 4 148 174 149 150 4 150 149 152 151 4 151 152 175 153 4 153 175 155 154 4 154 155 156 131 4 157 177 158 133 4 133 158 159 160 4 160 159 179 135 4 135 179 181 137 4 137 181 182 139 4 139 182 184 161 4 161 184 162 163 4 163 162 186 164 4 164 186 165 166 4 166 165 187 167 4 167 187 168 169 4 169 168 190 170 4 170 190 171 145 4 145 171 172 147 4 147 172 173 174 4 174 173 194 149 4 149 194 195 152 4 152 195 197 175 4 175 197 199 155 4 155 199 176 156 4 177 201 203 158 4 158 203 178 159 4 159 178 205 179 4 179 205 180 181 4 181 180 183 182 4 182 183 208 184 4 184 208 185 162 4 162 185 210 186 4 186 210 211 165 4 165 211 213 187 4 187 213 188 168 4 168 188 189 190 4 190 189 216 171 4 171 216 191 172 4 172 191 192 173 4 173 192 193 194 4 194 193 196 195 4 195 196 219 197 4 197 219 198 199 4 199 198 200 176 4 201 221 202 203 4 203 202 204 178 4 178 204 224 205 4 205 224 225 180 4 180 225 206 183 4 183 206 207 208 4 208 207 226 185 4 185 226 209 210 4 210 209 212 211 4 211 212 214 213 4 213 214 215 188 4 188 215 231 189 4 189 231 232 216 4 216 232 233 191 4 191 233 234 192 4 192 234 217 193 4 193 217 218 196 4 196 218 236 219 4 219 236 220 198 4 198 220 238 200 4 221 222 240 202 4 202 240 241 204 4 204 241 223 224 4 224 223 243 225 4 225 243 244 206 4 206 244 245 207 4 207 245 247 226 4 226 247 227 209 4 209 227 228 212 4 212 228 229 214 4 214 229 230 215 4 215 230 252 231 4 231 252 253 232 4 232 253 255 233 4 233 255 235 234 4 234 235 256 217 4 217 256 257 218 4 218 257 258 236 4 236 258 237 220 4 220 237 260 238 4 222 239 261 240 4 240 261 242 241 4 241 242 262 223 4 223 262 263 243 4 243 263 266 244 4 244 266 267 245 4 245 267 246 247 4 247 246 248 227 4 227 248 249 228 4 228 249 250 229 4 229 250 270 230 4 230 270 251 252 4 252 251 273 253 4 253 273 254 255 4 255 254 275 235 4 235 275 277 256 4 256 277 278 257 4 257 278 279 258 4 258 279 259 237 4 237 259 281 260 4 239 282 283 261 4 261 283 284 242 4 242 284 285 262 4 262 285 264 263 4 263 264 265 266 4 266 265 286 267 4 267 286 288 246 4 246 288 289 248 4 248 289 268 249 4 249 268 269 250 4 250 269 271 270 4 270 271 272 251 4 251 272 294 273 4 273 294 274 254 4 254 274 276 275 4 275 276 297 277 4 277 297 299 278 4 278 299 300 279 4 279 300 302 259 4 259 302 280 281 4 282 303 305 283 4 283 305 307 284 4 284 307 308 285 4 285 308 310 264 4 264 310 312 265 4 265 312 287 286 4 286 287 313 288 4 288 313 314 289 4 289 314 290 268 4 268 290 291 269 4 269 291 292 271 4 271 292 293 272 4 272 293 295 294 4 294 295 296 274 4 274 296 319 276 4 276 319 298 297 4 297 298 321 299 4 299 321 301 300 4 300 301 323 302 4 302 323 325 280 4 303 304 306 305 4 305 306 326 307 4 307 326 309 308 4 308 309 327 310 4 310 327 311 312 4 312 311 329 287 4 287 329 330 313 4 313 330 315 314 4 314 315 332 290 4 290 332 316 291 4 291 316 317 292 4 292 317 318 293 4 293 318 335 295 4 295 335 336 296 4 296 336 337 319 4 319 337 339 298 4 298 339 320 321 4 321 320 340 301 4 301 340 322 323 4 323 322 324 325 4 304 343 344 306 4 306 344 345 326 4 326 345 346 309 4 309 346 347 327 4 327 347 349 311 4 311 349 328 329 4 329 328 331 330 4 330 331 351 315 4 315 351 333 332 4 332 333 353 316 4 316 353 355 317 4 317 355 334 318 4 318 334 357 335 4 335 357 359 336 4 336 359 338 337 4 337 338 361 339 4 339 361 363 320 4 320 363 341 340 4 340 341 365 322 4 322 365 342 324 4 343 367 369 344 4 344 369 371 345 4 345 371 373 346 4 346 373 374 347 4 347 374 348 349 4 349 348 377 328 4 328 377 350 331 4 331 350 380 351 4 351 380 352 333 4 333 352 383 353 4 353 383 354 355 4 355 354 356 334 4 334 356 386 357 4 357 386 358 359 4 359 358 360 338 4 338 360 362 361 4 361 362 364 363 4 363 364 388 341 4 341 388 366 365 4 365 366 390 342 4 367 368 370 369 4 369 370 372 371 4 371 372 393 373 4 373 393 375 374 4 374 375 376 348 4 348 376 378 377 4 377 378 379 350 4 350 379 381 380 4 380 381 382 352 4 352 382 398 383 4 383 398 384 354 4 354 384 385 356 4 356 385 401 386 4 386 401 387 358 4 358 387 403 360 4 360 403 405 362 4 362 405 407 364 4 364 407 408 388 4 388 408 410 366 4 366 410 389 390 4 368 391 392 370 4 370 392 414 372 4 372 414 417 393 4 393 417 419 375 4 375 419 394 376 4 376 394 421 378 4 378 421 395 379 4 379 395 425 381 4 381 425 396 382 4 382 396 397 398 4 398 397 399 384 4 384 399 400 385 4 385 400 430 401 4 401 430 402 387 4 387 402 433 403 4 403 433 404 405 4 405 404 406 407 4 407 406 409 408 4 408 409 411 410 4 410 411 440 389 4 391 412 413 392 4 392 413 415 414 4 414 415 416 417 4 417 416 418 419 4 419 418 420 394 4 394 420 422 421 4 421 422 423 395 4 395 423 424 425 4 425 424 426 396 4 396 426 427 397 4 397 427 428 399 4 399 428 429 400 4 400 429 431 430 4 430 431 432 402 4 402 432 434 433 4 433 434 435 404 4 404 435 436 406 4 406 436 437 409 4 409 437 438 411 4 411 438 439 440 geomview-1.9.5/data/geom/hypercube.off0000644000175000017500000000103612310110173014600 000000000000004OFF 16 12 32 -1 -1 -1 -1.0 -1 -1 -1 1.0 -1 -1 1 -1.0 -1 -1 1 1.0 -1 1 -1 -1.0 -1 1 -1 1.0 -1 1 1 -1.0 -1 1 1 1.0 1 -1 -1 -1.0 1 -1 -1 1.0 1 -1 1 -1.0 1 -1 1 1.0 1 1 -1 -1.0 1 1 -1 1.0 1 1 1 -1.0 1 1 1 1.0 4 0 1 3 2 6 4 8 9 11 10 7 4 12 13 15 14 8 4 4 5 7 6 9 4 0 1 5 4 10 4 8 9 13 12 11 4 10 11 15 14 12 4 2 3 7 6 13 4 0 1 9 8 26 4 4 5 13 12 27 4 6 7 15 14 28 4 2 3 11 10 29 geomview-1.9.5/data/geom/ico.grp0000644000175000017500000001353312310110173013407 00000000000000GROUP 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0.309017 0.951057 0 0 -0.951057 0.309017 0 0 0 0 1 0 0 0 0 1 -0.809017 0.587785 0 0 -0.587785 -0.809017 0 0 0 0 1 0 0 0 0 1 -0.809017 -0.587785 0 0 0.587785 -0.809017 0 0 0 0 1 0 0 0 0 1 0.309017 -0.951057 0 0 0.951057 0.309017 0 0 0 0 1 0 0 0 0 1 -1 0 0 0 0 -0.447214 0.894427 0 0 0.894427 0.447214 0 0 0 0 1 -0.309017 -0.425325 0.850651 0 0.951057 -0.138197 0.276393 0 0 0.894427 0.447214 0 0 0 0 1 0.809017 -0.262866 0.525731 0 0.587785 0.361803 -0.723607 0 0 0.894427 0.447214 0 0 0 0 1 0.809017 0.262866 -0.525731 0 -0.587785 0.361803 -0.723607 0 0 0.894427 0.447214 0 0 0 0 1 -0.309017 0.425325 -0.850651 0 -0.951057 -0.138197 0.276393 0 0 0.894427 0.447214 0 0 0 0 1 -0.309017 -0.951057 0 0 0.425325 -0.138197 0.894427 0 -0.850651 0.276393 0.447214 0 0 0 0 1 0.309017 -0.425325 0.850651 0 0.425325 0.861803 0.276393 0 -0.850651 0.276393 0.447214 0 0 0 0 1 0.5 0.688191 0.525731 0 -0.16246 0.67082 -0.723607 0 -0.850651 0.276393 0.447214 0 0 0 0 1 5.08989e-09 0.850651 -0.525731 0 -0.525731 -0.447214 -0.723607 0 -0.850651 0.276393 0.447214 0 0 0 0 1 -0.5 -0.16246 -0.850651 0 -0.16246 -0.947214 0.276393 0 -0.850651 0.276393 0.447214 0 0 0 0 1 0.809017 -0.587785 0 0 0.262866 0.361803 0.894427 0 -0.525731 -0.723607 0.447214 0 0 0 0 1 0.5 0.16246 0.850651 0 -0.688191 0.67082 0.276393 0 -0.525731 -0.723607 0.447214 0 0 0 0 1 -0.5 0.688191 0.525731 0 -0.688191 0.0527864 -0.723607 0 -0.525731 -0.723607 0.447214 0 0 0 0 1 -0.809017 0.262866 -0.525731 0 0.262866 -0.638197 -0.723607 0 -0.525731 -0.723607 0.447214 0 0 0 0 1 1.85405e-08 -0.525731 -0.850651 0 0.850651 -0.447214 0.276393 0 -0.525731 -0.723607 0.447214 0 0 0 0 1 0.809017 0.587785 0 0 -0.262866 0.361803 0.894427 0 0.525731 -0.723607 0.447214 0 0 0 0 1 -5.57011e-09 0.525731 0.850651 0 -0.850651 -0.447214 0.276393 0 0.525731 -0.723607 0.447214 0 0 0 0 1 -0.809017 -0.262866 0.525731 0 -0.262866 -0.638197 -0.723607 0 0.525731 -0.723607 0.447214 0 0 0 0 1 -0.5 -0.688191 -0.525731 0 0.688191 0.0527864 -0.723607 0 0.525731 -0.723607 0.447214 0 0 0 0 1 0.5 -0.16246 -0.850651 0 0.688191 0.670821 0.276393 0 0.525731 -0.723607 0.447214 0 0 0 0 1 -0.309017 0.951057 0 0 -0.425325 -0.138197 0.894427 0 0.850651 0.276393 0.447214 0 0 0 0 1 -0.5 0.16246 0.850651 0 0.16246 -0.947214 0.276393 0 0.850651 0.276393 0.447214 0 0 0 0 1 1.35325e-08 -0.850651 0.525731 0 0.525731 -0.447214 -0.723607 0 0.850651 0.276393 0.447214 0 0 0 0 1 0.5 -0.688191 -0.525731 0 0.16246 0.670821 -0.723607 0 0.850651 0.276393 0.447214 0 0 0 0 1 0.309017 0.425325 -0.850651 0 -0.425325 0.861804 0.276393 0 0.850651 0.276393 0.447214 0 0 0 0 1 1 -3.50347e-08 2.6656e-08 0 3.50347e-08 -1 0 0 -2.39749e-08 -1.55298e-08 -1 0 0 0 0 1 0.309017 0.951057 2.6656e-08 0 0.951057 -0.309017 0 0 7.36109e-09 -2.76005e-08 -1 0 0 0 0 1 -0.809017 0.587785 2.6656e-08 0 0.587785 0.809017 0 0 2.85243e-08 -1.52821e-09 -1 0 0 0 0 1 -0.809017 -0.587785 2.6656e-08 0 -0.587785 0.809017 0 0 1.02679e-08 2.6656e-08 -1 0 0 0 0 1 0.309017 -0.951057 2.6656e-08 0 -0.951057 -0.309017 0 0 -2.21784e-08 1.80025e-08 -1 0 0 0 0 1 -1 3.95099e-08 -1.94151e-08 0 -3.50347e-08 0.447214 -0.894427 0 2.39749e-08 -0.894427 -0.447214 0 0 0 0 1 -0.309017 -0.425325 0.850651 0 -0.951057 0.138197 -0.276393 0 -7.36109e-09 -0.894427 -0.447214 0 0 0 0 1 0.809017 -0.262866 0.525731 0 -0.587785 -0.361803 0.723607 0 -2.85243e-08 -0.894427 -0.447214 0 0 0 0 1 0.809017 0.262866 -0.525731 0 0.587785 -0.361803 0.723607 0 -1.02679e-08 -0.894427 -0.447214 0 0 0 0 1 -0.309017 0.425326 -0.850651 0 0.951057 0.138197 -0.276393 0 2.21784e-08 -0.894427 -0.447214 0 0 0 0 1 -0.309017 -0.951057 -1.94151e-08 0 -0.425325 0.138197 -0.894427 0 0.850651 -0.276393 -0.447214 0 0 0 0 1 0.309017 -0.425326 0.850651 0 -0.425325 -0.861804 -0.276393 0 0.850651 -0.276393 -0.447214 0 0 0 0 1 0.5 0.688191 0.525731 0 0.16246 -0.670821 0.723607 0 0.850651 -0.276393 -0.447214 0 0 0 0 1 8.3379e-10 0.850651 -0.525731 0 0.525731 0.447214 0.723607 0 0.850651 -0.276393 -0.447214 0 0 0 0 1 -0.5 -0.16246 -0.850651 0 0.16246 0.947214 -0.276393 0 0.850651 -0.276393 -0.447214 0 0 0 0 1 0.809017 -0.587785 -1.94151e-08 0 -0.262866 -0.361803 -0.894427 0 0.525731 0.723607 -0.447214 0 0 0 0 1 0.5 0.16246 0.850651 0 0.688191 -0.670821 -0.276393 0 0.525731 0.723607 -0.447214 0 0 0 0 1 -0.5 0.688191 0.525731 0 0.688191 -0.0527864 0.723607 0 0.525731 0.723607 -0.447214 0 0 0 0 1 -0.809017 0.262866 -0.525731 0 -0.262866 0.638197 0.723607 0 0.525731 0.723607 -0.447214 0 0 0 0 1 -2.52757e-08 -0.525731 -0.850651 0 -0.850651 0.447214 -0.276393 0 0.525731 0.723607 -0.447214 0 0 0 0 1 0.809017 0.587785 -1.94151e-08 0 0.262866 -0.361803 -0.894427 0 -0.525731 0.723607 -0.447214 0 0 0 0 1 3.82461e-08 0.525731 0.850651 0 0.850651 0.447214 -0.276393 0 -0.525731 0.723607 -0.447214 0 0 0 0 1 -0.809017 -0.262866 0.525731 0 0.262866 0.638197 0.723607 0 -0.525731 0.723607 -0.447214 0 0 0 0 1 -0.5 -0.688191 -0.525731 0 -0.688191 -0.0527865 0.723607 0 -0.525731 0.723607 -0.447214 0 0 0 0 1 0.5 -0.16246 -0.850651 0 -0.688191 -0.670821 -0.276393 0 -0.525731 0.723607 -0.447214 0 0 0 0 1 -0.309017 0.951057 -1.94151e-08 0 0.425325 0.138197 -0.894427 0 -0.850651 -0.276393 -0.447214 0 0 0 0 1 -0.5 0.16246 0.850651 0 -0.16246 0.947214 -0.276393 0 -0.850651 -0.276393 -0.447214 0 0 0 0 1 1.77886e-08 -0.850651 0.525731 0 -0.525731 0.447214 0.723607 0 -0.850651 -0.276393 -0.447214 0 0 0 0 1 0.5 -0.688191 -0.525731 0 -0.16246 -0.670821 0.723607 0 -0.850651 -0.276393 -0.447214 0 0 0 0 1 0.309017 0.425326 -0.850651 0 0.425326 -0.861804 -0.276393 0 -0.850651 -0.276393 -0.447214 0 0 0 0 1 unit { = CQUAD 0.000000 0.000000 5.137791 .8 .8 .8 .5 0.425325 0.138197 0.723607 .8 .8 .8 .5 0.000000 0.525731 0.850651 .8 .8 .8 .5 0.000000 0.000000 5.137791 .8 .8 .8 .5 0.425325 0.138197 0.723607 .8 .8 .8 .5 0.994885 1.369342 2.215641 .8 .8 .8 .5 0.000000 0.525731 0.850651 .8 .8 .8 .5 0.425325 0.138197 0.723607 .8 .8 .8 .5 } geomview-1.9.5/data/geom/icosa.off0000644000175000017500000000154112310110173013711 00000000000000OFF 12 20 30 0.0 0.0 2.0 1.788854 0.000000 0.894427 0.552786 1.701302 0.894427 -1.447214 1.051462 0.894427 -1.447214 -1.051462 0.894427 0.552786 -1.701302 0.894427 1.447214 1.051462 -0.894427 -0.552786 1.701302 -0.894427 -1.788854 0.000000 -0.894427 -0.552786 -1.701302 -0.894427 1.447214 -1.051462 -0.894427 0.0 0.0 -2.0 3 2 0 1 0.784 0.000 0.000 3 3 0 2 0.784 0.000 0.000 3 4 0 3 0.784 0.000 0.000 3 5 0 4 0.784 0.000 0.000 3 1 0 5 0.784 0.000 0.000 3 2 1 6 0.784 0.000 0.000 3 7 2 6 0.784 0.000 0.000 3 3 2 7 0.784 0.000 0.000 3 8 3 7 0.784 0.000 0.000 3 4 3 8 0.784 0.000 0.000 3 9 4 8 0.784 0.000 0.000 3 5 4 9 0.784 0.000 0.000 3 10 5 9 0.784 0.000 0.000 3 6 1 10 0.784 0.000 0.000 3 1 5 10 0.784 0.000 0.000 3 6 11 7 0.784 0.000 0.000 3 7 11 8 0.784 0.000 0.000 3 8 11 9 0.784 0.000 0.000 3 9 11 10 0.784 0.000 0.000 3 10 11 6 0.784 0.000 0.000 geomview-1.9.5/data/geom/icosa.quad0000644000175000017500000011372612310110173014102 00000000000000QUAD 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0.447214 0.723607 0 0.894427 0.447214 0 0 1 0 0.894427 0.447214 0.28355 0.390273 0.631476 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.28355 0.390273 0.631476 0.425325 0.138197 0.723607 0 0 1 0.425325 0.138197 0.723607 0.425325 0.138197 0.723607 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.425325 0.138197 0.723607 -0.850651 0.276393 0.447214 0 0 1 -0.850651 0.276393 0.447214 -0.28355 0.390273 0.631476 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.28355 0.390273 0.631476 8.32667e-17 0.447214 0.723607 0 0 1 8.32667e-17 0.447214 0.723607 8.32667e-17 0.447214 0.723607 0 0 1 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.447214 0.723607 0 0 1 0 0.894427 0.447214 0 0 1 -0.28355 0.390273 0.631476 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 -0.28355 0.390273 0.631476 -0.425325 0.58541 0.447214 0 0.894427 0.447214 -0.425325 0.58541 0.447214 -0.425325 0.58541 0.447214 0 0.894427 0.447214 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.262866 -0.361803 0.723607 0.525731 -0.723607 0.447214 0 0 1 0.525731 -0.723607 0.447214 2.62845e-13 -0.482405 0.631476 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 2.62845e-13 -0.482405 0.631476 -0.262866 -0.361803 0.723607 0 0 1 -0.262866 -0.361803 0.723607 -0.262866 -0.361803 0.723607 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.425325 0.138197 0.723607 0.850651 0.276393 0.447214 0 0 1 0.850651 0.276393 0.447214 0.458794 -0.149071 0.631476 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.458794 -0.149071 0.631476 0.262866 -0.361803 0.723607 0 0 1 0.262866 -0.361803 0.723607 0.262866 -0.361803 0.723607 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.262866 -0.361803 0.723607 -0.525731 -0.723607 0.447214 0 0 1 -0.525731 -0.723607 0.447214 -0.458794 -0.149071 0.631476 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.458794 -0.149071 0.631476 -0.425325 0.138197 0.723607 0 0 1 -0.425325 0.138197 0.723607 -0.425325 0.138197 0.723607 0 0 1 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0.425325 0.58541 0.447214 0.850651 0.276393 0.447214 0 0.894427 0.447214 0.850651 0.276393 0.447214 0.28355 0.390273 0.631476 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0.28355 0.390273 0.631476 -8.32667e-17 0.447214 0.723607 0 0.894427 0.447214 -8.32667e-17 0.447214 0.723607 -8.32667e-17 0.447214 0.723607 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0.262866 0.809017 6.66134e-16 0.525731 0.723607 -0.447214 0 0.894427 0.447214 0.525731 0.723607 -0.447214 0.458794 0.631476 0.149071 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0.458794 0.631476 0.149071 0.425325 0.58541 0.447214 0 0.894427 0.447214 0.425325 0.58541 0.447214 0.425325 0.58541 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 -0.262866 0.809017 6.10623e-16 -0.525731 0.723607 -0.447214 0 0.894427 0.447214 -0.525731 0.723607 -0.447214 -2.62845e-13 0.780547 -0.149071 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 -2.62845e-13 0.780547 -0.149071 0.262866 0.809017 7.77156e-16 0 0.894427 0.447214 0.262866 0.809017 7.77156e-16 0.262866 0.809017 6.66134e-16 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 -0.425325 0.58541 0.447214 -0.850651 0.276393 0.447214 0 0.894427 0.447214 -0.850651 0.276393 0.447214 -0.458794 0.631476 0.149071 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 -0.458794 0.631476 0.149071 -0.262866 0.809017 6.10623e-16 0 0.894427 0.447214 -0.262866 0.809017 6.10623e-16 -0.262866 0.809017 4.996e-16 0 0.894427 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.425325 0.138197 0.723607 5.55112e-17 0 1 -0.850651 0.276393 0.447214 5.55112e-17 0 1 -0.458794 -0.149071 0.631476 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.458794 -0.149071 0.631476 -0.688191 -0.223607 0.447214 -0.850651 0.276393 0.447214 -0.688191 -0.223607 0.447214 -0.688191 -0.223607 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.425325 0.58541 0.447214 -2.77556e-16 0.894427 0.447214 -0.850651 0.276393 0.447214 -2.77556e-16 0.894427 0.447214 -0.28355 0.390273 0.631476 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.28355 0.390273 0.631476 -0.425325 0.138197 0.723607 -0.850651 0.276393 0.447214 -0.425325 0.138197 0.723607 -0.425325 0.138197 0.723607 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.688191 0.5 6.66134e-16 -0.525731 0.723607 -0.447214 -0.850651 0.276393 0.447214 -0.525731 0.723607 -0.447214 -0.458794 0.631476 0.149071 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.458794 0.631476 0.149071 -0.425325 0.58541 0.447214 -0.850651 0.276393 0.447214 -0.425325 0.58541 0.447214 -0.425325 0.58541 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 1.38778e-16 6.10623e-16 -0.850651 -0.276393 -0.447214 -0.850651 0.276393 0.447214 -0.850651 -0.276393 -0.447214 -0.742344 0.241202 -0.149071 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.742344 0.241202 -0.149071 -0.688191 0.5 7.77156e-16 -0.850651 0.276393 0.447214 -0.688191 0.5 7.77156e-16 -0.688191 0.5 6.66134e-16 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.688191 -0.223607 0.447214 -0.525731 -0.723607 0.447214 -0.850651 0.276393 0.447214 -0.525731 -0.723607 0.447214 -0.742344 -0.241202 0.149071 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.742344 -0.241202 0.149071 -0.850651 3.05311e-16 6.10623e-16 -0.850651 0.276393 0.447214 -0.850651 3.05311e-16 6.10623e-16 -0.850651 2.22045e-16 4.996e-16 -0.850651 0.276393 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.262866 -0.361803 0.723607 -2.77556e-17 0 1 -0.525731 -0.723607 0.447214 -2.77556e-17 0 1 -2.63067e-13 -0.482405 0.631476 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -2.63067e-13 -0.482405 0.631476 -2.22045e-16 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -2.22045e-16 -0.723607 0.447214 -5.55112e-17 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.688191 -0.223607 0.447214 -0.850651 0.276393 0.447214 -0.525731 -0.723607 0.447214 -0.850651 0.276393 0.447214 -0.458794 -0.149071 0.631476 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.458794 -0.149071 0.631476 -0.262866 -0.361803 0.723607 -0.525731 -0.723607 0.447214 -0.262866 -0.361803 0.723607 -0.262866 -0.361803 0.723607 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.688191 -0.5 6.66134e-16 -0.850651 -0.276393 -0.447214 -0.525731 -0.723607 0.447214 -0.850651 -0.276393 -0.447214 -0.742344 -0.241202 0.149071 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.742344 -0.241202 0.149071 -0.688191 -0.223607 0.447214 -0.525731 -0.723607 0.447214 -0.688191 -0.223607 0.447214 -0.688191 -0.223607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.262866 -0.809017 6.10623e-16 -6.10623e-16 -0.894427 -0.447214 -0.525731 -0.723607 0.447214 -6.10623e-16 -0.894427 -0.447214 -0.458794 -0.631476 -0.149071 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.458794 -0.631476 -0.149071 -0.688191 -0.5 7.77156e-16 -0.525731 -0.723607 0.447214 -0.688191 -0.5 7.77156e-16 -0.688191 -0.5 6.66134e-16 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -1.11022e-16 -0.723607 0.447214 0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 -3.88578e-16 -0.780547 0.149071 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -3.88578e-16 -0.780547 0.149071 -0.262866 -0.809017 6.10623e-16 -0.525731 -0.723607 0.447214 -0.262866 -0.809017 6.10623e-16 -0.262866 -0.809017 4.996e-16 -0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.262866 -0.361803 0.723607 2.77556e-17 0 1 0.525731 -0.723607 0.447214 2.77556e-17 0 1 0.458794 -0.149071 0.631476 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.458794 -0.149071 0.631476 0.688191 -0.223607 0.447214 0.525731 -0.723607 0.447214 0.688191 -0.223607 0.447214 0.688191 -0.223607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 -5.55112e-17 -0.723607 0.447214 -0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 5.55112e-17 -0.482405 0.631476 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 5.55112e-17 -0.482405 0.631476 0.262866 -0.361803 0.723607 0.525731 -0.723607 0.447214 0.262866 -0.361803 0.723607 0.262866 -0.361803 0.723607 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.262866 -0.809017 6.66134e-16 3.60822e-16 -0.894427 -0.447214 0.525731 -0.723607 0.447214 3.60822e-16 -0.894427 -0.447214 2.63123e-13 -0.780547 0.149071 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 2.63123e-13 -0.780547 0.149071 1.66533e-16 -0.723607 0.447214 0.525731 -0.723607 0.447214 1.66533e-16 -0.723607 0.447214 5.55112e-17 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.688191 -0.5 6.10623e-16 0.850651 -0.276393 -0.447214 0.525731 -0.723607 0.447214 0.850651 -0.276393 -0.447214 0.458794 -0.631476 -0.149071 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.458794 -0.631476 -0.149071 0.262866 -0.809017 7.77156e-16 0.525731 -0.723607 0.447214 0.262866 -0.809017 7.77156e-16 0.262866 -0.809017 6.66134e-16 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.688191 -0.223607 0.447214 0.850651 0.276393 0.447214 0.525731 -0.723607 0.447214 0.850651 0.276393 0.447214 0.742344 -0.241202 0.149071 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.742344 -0.241202 0.149071 0.688191 -0.5 6.10623e-16 0.525731 -0.723607 0.447214 0.688191 -0.5 6.10623e-16 0.688191 -0.5 4.996e-16 0.525731 -0.723607 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.425325 0.138197 0.723607 0 -1.38778e-17 1 0.850651 0.276393 0.447214 0 -1.38778e-17 1 0.28355 0.390273 0.631476 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.28355 0.390273 0.631476 0.425325 0.58541 0.447214 0.850651 0.276393 0.447214 0.425325 0.58541 0.447214 0.425325 0.58541 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.688191 -0.223607 0.447214 0.525731 -0.723607 0.447214 0.850651 0.276393 0.447214 0.525731 -0.723607 0.447214 0.458794 -0.149071 0.631476 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.458794 -0.149071 0.631476 0.425325 0.138197 0.723607 0.850651 0.276393 0.447214 0.425325 0.138197 0.723607 0.425325 0.138197 0.723607 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0 6.66134e-16 0.850651 -0.276393 -0.447214 0.850651 0.276393 0.447214 0.850651 -0.276393 -0.447214 0.742344 -0.241202 0.149071 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.742344 -0.241202 0.149071 0.688191 -0.223607 0.447214 0.850651 0.276393 0.447214 0.688191 -0.223607 0.447214 0.688191 -0.223607 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.688191 0.5 6.10623e-16 0.525731 0.723607 -0.447214 0.850651 0.276393 0.447214 0.525731 0.723607 -0.447214 0.742344 0.241202 -0.149071 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.742344 0.241202 -0.149071 0.850651 -2.77556e-17 7.77156e-16 0.850651 0.276393 0.447214 0.850651 -2.77556e-17 7.77156e-16 0.850651 -1.11022e-16 6.66134e-16 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.425325 0.58541 0.447214 4.44089e-16 0.894427 0.447214 0.850651 0.276393 0.447214 4.44089e-16 0.894427 0.447214 0.458794 0.631476 0.149071 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.458794 0.631476 0.149071 0.688191 0.5 6.10623e-16 0.850651 0.276393 0.447214 0.688191 0.5 6.10623e-16 0.688191 0.5 4.996e-16 0.850651 0.276393 0.447214 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -6.1749e-16 -0.447214 -0.723607 -6.56092e-16 -0.894427 -0.447214 -5.78888e-16 -1.36342e-15 -1 -6.56092e-16 -0.894427 -0.447214 0.28355 -0.390273 -0.631476 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 0.28355 -0.390273 -0.631476 0.425325 -0.138197 -0.723607 -5.78888e-16 -1.36342e-15 -1 0.425325 -0.138197 -0.723607 0.425325 -0.138197 -0.723607 -5.78888e-16 -1.36342e-15 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 0.425325 -0.138197 -0.723607 0.850651 -0.276393 -0.447214 1.1178e-15 -9.71874e-16 -1 0.850651 -0.276393 -0.447214 0.458794 0.149071 -0.631476 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 0.458794 0.149071 -0.631476 0.262866 0.361803 -0.723607 1.1178e-15 -9.71874e-16 -1 0.262866 0.361803 -0.723607 0.262866 0.361803 -0.723607 1.1178e-15 -9.71874e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 0.262866 0.361803 -0.723607 0.525731 0.723607 -0.447214 1.26973e-15 7.62767e-16 -1 0.525731 0.723607 -0.447214 2.63925e-13 0.482405 -0.631476 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 2.63925e-13 0.482405 -0.631476 -0.262866 0.361803 -0.723607 1.26973e-15 7.62767e-16 -1 -0.262866 0.361803 -0.723607 -0.262866 0.361803 -0.723607 1.26973e-15 7.62767e-16 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -0.262866 0.361803 -0.723607 -0.525731 0.723607 -0.447214 -3.33067e-16 1.44329e-15 -1 -0.525731 0.723607 -0.447214 -0.458794 0.149071 -0.631476 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -0.458794 0.149071 -0.631476 -0.425325 -0.138197 -0.723607 -3.33067e-16 1.44329e-15 -1 -0.425325 -0.138197 -0.723607 -0.425325 -0.138197 -0.723607 -3.33067e-16 1.44329e-15 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -0.425325 -0.138197 -0.723607 -0.850651 -0.276393 -0.447214 -1.47557e-15 1.29236e-16 -1 -0.850651 -0.276393 -0.447214 -0.28355 -0.390273 -0.631476 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -0.28355 -0.390273 -0.631476 -1.20651e-15 -0.447214 -0.723607 -1.47557e-15 1.29236e-16 -1 -1.20651e-15 -0.447214 -0.723607 -1.23427e-15 -0.447214 -0.723607 -1.47557e-15 1.29236e-16 -1 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 6.1749e-16 -0.447214 -0.723607 6.56092e-16 1.33227e-15 -1 5.78888e-16 -0.894427 -0.447214 6.56092e-16 1.33227e-15 -1 -0.28355 -0.390273 -0.631476 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 -0.28355 -0.390273 -0.631476 -0.425325 -0.58541 -0.447214 5.78888e-16 -0.894427 -0.447214 -0.425325 -0.58541 -0.447214 -0.425325 -0.58541 -0.447214 5.78888e-16 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -0.425325 -0.58541 -0.447214 -0.850651 -0.276393 -0.447214 -1.1178e-15 -0.894427 -0.447214 -0.850651 -0.276393 -0.447214 -0.458794 -0.631476 -0.149071 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -0.458794 -0.631476 -0.149071 -0.262866 -0.809017 -1.4988e-15 -1.1178e-15 -0.894427 -0.447214 -0.262866 -0.809017 -1.4988e-15 -0.262866 -0.809017 -1.38778e-15 -1.1178e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -0.262866 -0.809017 5.55112e-17 -0.525731 -0.723607 0.447214 -1.26973e-15 -0.894427 -0.447214 -0.525731 -0.723607 0.447214 -2.63925e-13 -0.780547 0.149071 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -2.63925e-13 -0.780547 0.149071 0.262866 -0.809017 -1.66533e-16 -1.26973e-15 -0.894427 -0.447214 0.262866 -0.809017 -1.66533e-16 0.262866 -0.809017 -1.11022e-16 -1.26973e-15 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 0.262866 -0.809017 7.21645e-16 0.525731 -0.723607 0.447214 3.33067e-16 -0.894427 -0.447214 0.525731 -0.723607 0.447214 0.458794 -0.631476 -0.149071 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 0.458794 -0.631476 -0.149071 0.425325 -0.58541 -0.447214 3.33067e-16 -0.894427 -0.447214 0.425325 -0.58541 -0.447214 0.425325 -0.58541 -0.447214 3.33067e-16 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 0.425325 -0.58541 -0.447214 0.850651 -0.276393 -0.447214 1.47557e-15 -0.894427 -0.447214 0.850651 -0.276393 -0.447214 0.28355 -0.390273 -0.631476 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 0.28355 -0.390273 -0.631476 1.20651e-15 -0.447214 -0.723607 1.47557e-15 -0.894427 -0.447214 1.20651e-15 -0.447214 -0.723607 1.23427e-15 -0.447214 -0.723607 1.47557e-15 -0.894427 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.425325 -0.138197 -0.723607 -1.16573e-15 1.04083e-15 -1 0.850651 -0.276393 -0.447214 -1.16573e-15 1.04083e-15 -1 0.28355 -0.390273 -0.631476 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.28355 -0.390273 -0.631476 0.425325 -0.58541 -0.447214 0.850651 -0.276393 -0.447214 0.425325 -0.58541 -0.447214 0.425325 -0.58541 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.425325 -0.58541 -0.447214 -1.22125e-15 -0.894427 -0.447214 0.850651 -0.276393 -0.447214 -1.22125e-15 -0.894427 -0.447214 0.458794 -0.631476 -0.149071 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.458794 -0.631476 -0.149071 0.688191 -0.5 -1.4988e-15 0.850651 -0.276393 -0.447214 0.688191 -0.5 -1.4988e-15 0.688191 -0.5 -1.38778e-15 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.688191 -0.5 5.55112e-17 0.525731 -0.723607 0.447214 0.850651 -0.276393 -0.447214 0.525731 -0.723607 0.447214 0.742344 -0.241202 0.149071 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.742344 -0.241202 0.149071 0.850651 -1.30451e-15 -1.66533e-16 0.850651 -0.276393 -0.447214 0.850651 -1.30451e-15 -1.66533e-16 0.850651 -1.249e-15 -1.11022e-16 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -2.77556e-17 7.21645e-16 0.850651 0.276393 0.447214 0.850651 -0.276393 -0.447214 0.850651 0.276393 0.447214 0.742344 0.241202 -0.149071 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.742344 0.241202 -0.149071 0.688191 0.223607 -0.447214 0.850651 -0.276393 -0.447214 0.688191 0.223607 -0.447214 0.688191 0.223607 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.688191 0.223607 -0.447214 0.525731 0.723607 -0.447214 0.850651 -0.276393 -0.447214 0.525731 0.723607 -0.447214 0.458794 0.149071 -0.631476 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.458794 0.149071 -0.631476 0.425325 -0.138197 -0.723607 0.850651 -0.276393 -0.447214 0.425325 -0.138197 -0.723607 0.425325 -0.138197 -0.723607 0.850651 -0.276393 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.262866 0.361803 -0.723607 -1.30451e-15 -6.66134e-16 -1 0.525731 0.723607 -0.447214 -1.30451e-15 -6.66134e-16 -1 0.458794 0.149071 -0.631476 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.458794 0.149071 -0.631476 0.688191 0.223607 -0.447214 0.525731 0.723607 -0.447214 0.688191 0.223607 -0.447214 0.688191 0.223607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.688191 0.223607 -0.447214 0.850651 -0.276393 -0.447214 0.525731 0.723607 -0.447214 0.850651 -0.276393 -0.447214 0.742344 0.241202 -0.149071 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.742344 0.241202 -0.149071 0.688191 0.5 -1.4988e-15 0.525731 0.723607 -0.447214 0.688191 0.5 -1.4988e-15 0.688191 0.5 -1.38778e-15 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.688191 0.5 5.55112e-17 0.850651 0.276393 0.447214 0.525731 0.723607 -0.447214 0.850651 0.276393 0.447214 0.458794 0.631476 0.149071 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.458794 0.631476 0.149071 0.262866 0.809017 -1.66533e-16 0.525731 0.723607 -0.447214 0.262866 0.809017 -1.66533e-16 0.262866 0.809017 -1.11022e-16 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.262866 0.809017 7.21645e-16 2.77556e-16 0.894427 0.447214 0.525731 0.723607 -0.447214 2.77556e-16 0.894427 0.447214 2.63234e-13 0.780547 -0.149071 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 2.63234e-13 0.780547 -0.149071 3.88578e-16 0.723607 -0.447214 0.525731 0.723607 -0.447214 3.88578e-16 0.723607 -0.447214 2.77556e-16 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 -1.05471e-15 0.723607 -0.447214 -0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -8.88178e-16 0.482405 -0.631476 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 -8.88178e-16 0.482405 -0.631476 0.262866 0.361803 -0.723607 0.525731 0.723607 -0.447214 0.262866 0.361803 -0.723607 0.262866 0.361803 -0.723607 0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.262866 0.361803 -0.723607 3.33067e-16 -1.55431e-15 -1 -0.525731 0.723607 -0.447214 3.33067e-16 -1.55431e-15 -1 -2.62901e-13 0.482405 -0.631476 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -2.62901e-13 0.482405 -0.631476 -2.22045e-16 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -2.22045e-16 0.723607 -0.447214 -1.66533e-16 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 1.22125e-15 0.723607 -0.447214 0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 8.88178e-16 0.780547 -0.149071 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 8.88178e-16 0.780547 -0.149071 -0.262866 0.809017 -1.4988e-15 -0.525731 0.723607 -0.447214 -0.262866 0.809017 -1.4988e-15 -0.262866 0.809017 -1.38778e-15 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.262866 0.809017 5.55112e-17 9.71445e-16 0.894427 0.447214 -0.525731 0.723607 -0.447214 9.71445e-16 0.894427 0.447214 -0.458794 0.631476 0.149071 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.458794 0.631476 0.149071 -0.688191 0.5 -1.66533e-16 -0.525731 0.723607 -0.447214 -0.688191 0.5 -1.66533e-16 -0.688191 0.5 -1.11022e-16 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.688191 0.5 7.21645e-16 -0.850651 0.276393 0.447214 -0.525731 0.723607 -0.447214 -0.850651 0.276393 0.447214 -0.742344 0.241202 -0.149071 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.742344 0.241202 -0.149071 -0.688191 0.223607 -0.447214 -0.525731 0.723607 -0.447214 -0.688191 0.223607 -0.447214 -0.688191 0.223607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.688191 0.223607 -0.447214 -0.850651 -0.276393 -0.447214 -0.525731 0.723607 -0.447214 -0.850651 -0.276393 -0.447214 -0.458794 0.149071 -0.631476 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.458794 0.149071 -0.631476 -0.262866 0.361803 -0.723607 -0.525731 0.723607 -0.447214 -0.262866 0.361803 -0.723607 -0.262866 0.361803 -0.723607 -0.525731 0.723607 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.425325 -0.138197 -0.723607 1.4988e-15 -1.94289e-16 -1 -0.850651 -0.276393 -0.447214 1.4988e-15 -1.94289e-16 -1 -0.458794 0.149071 -0.631476 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.458794 0.149071 -0.631476 -0.688191 0.223607 -0.447214 -0.850651 -0.276393 -0.447214 -0.688191 0.223607 -0.447214 -0.688191 0.223607 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.688191 0.223607 -0.447214 -0.525731 0.723607 -0.447214 -0.850651 -0.276393 -0.447214 -0.525731 0.723607 -0.447214 -0.742344 0.241202 -0.149071 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.742344 0.241202 -0.149071 -0.850651 8.88178e-16 -1.4988e-15 -0.850651 -0.276393 -0.447214 -0.850651 8.88178e-16 -1.4988e-15 -0.850651 9.71445e-16 -1.38778e-15 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 1.19349e-15 5.55112e-17 -0.850651 0.276393 0.447214 -0.850651 -0.276393 -0.447214 -0.850651 0.276393 0.447214 -0.742344 -0.241202 0.149071 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.742344 -0.241202 0.149071 -0.688191 -0.5 -1.66533e-16 -0.850651 -0.276393 -0.447214 -0.688191 -0.5 -1.66533e-16 -0.688191 -0.5 -1.11022e-16 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.688191 -0.5 7.21645e-16 -0.525731 -0.723607 0.447214 -0.850651 -0.276393 -0.447214 -0.525731 -0.723607 0.447214 -0.458794 -0.631476 -0.149071 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.458794 -0.631476 -0.149071 -0.425325 -0.58541 -0.447214 -0.850651 -0.276393 -0.447214 -0.425325 -0.58541 -0.447214 -0.425325 -0.58541 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.425325 -0.58541 -0.447214 6.66134e-16 -0.894427 -0.447214 -0.850651 -0.276393 -0.447214 6.66134e-16 -0.894427 -0.447214 -0.28355 -0.390273 -0.631476 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.28355 -0.390273 -0.631476 -0.425325 -0.138197 -0.723607 -0.850651 -0.276393 -0.447214 -0.425325 -0.138197 -0.723607 -0.425325 -0.138197 -0.723607 -0.850651 -0.276393 -0.447214 geomview-1.9.5/data/geom/jungle.list0000644000175000017500000000627212310110173014306 00000000000000LIST { appearance {linewidth 3} LIST # first, the x, y, and z labels { VECT 5 13 0 2 2 2 3 4 0 0 0 0 0 # the x: 1 -.05 .05 1 .05 .25 1 .05 .05 1 -.05 .25 # the y: -.05 1 .25 0 1 .15 .05 1 .25 0 1 .15 0 1 .05 # the z: -.05 .25 1 .05 .25 1 -.05 .05 1 .05 .05 1 } # make an object to inst. # now make a list of the 3 instances of oneaxis, one for each axis. { LIST { appearance {material {edgecolor 1 0 0} } INST transform 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 unit { define oneaxis { VECT 37 74 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 -0.9 .05 0 -0.9 -.05 0 -0.9 0 .05 -0.9 0 -.05 -0.8 .05 0 -0.8 -.05 0 -0.8 0 .05 -0.8 0 -.05 -0.7 .05 0 -0.7 -.05 0 -0.7 0 .05 -0.7 0 -.05 -0.6 .05 0 -0.6 -.05 0 -0.6 0 .05 -0.6 0 -.05 -0.5 .05 0 -0.5 -.05 0 -0.5 0 .05 -0.5 0 -.05 -0.4 .05 0 -0.4 -.05 0 -0.4 0 .05 -0.4 0 -.05 -0.3 .05 0 -0.3 -.05 0 -0.3 0 .05 -0.3 0 -.05 -0.2 .05 0 -0.2 -.05 0 -0.2 0 .05 -0.2 0 -.05 -0.1 .05 0 -0.1 -.05 0 -0.1 0 .05 -0.1 0 -.05 0.1 .05 0 0.1 -.05 0 0.1 0 .05 0.1 0 -.05 0.2 .05 0 0.2 -.05 0 0.2 0 .05 0.2 0 -.05 0.3 .05 0 0.3 -.05 0 0.3 0 .05 0.3 0 -.05 0.4 .05 0 0.4 -.05 0 0.4 0 .05 0.4 0 -.05 0.5 .05 0 0.5 -.05 0 0.5 0 .05 0.5 0 -.05 0.6 .05 0 0.6 -.05 0 0.6 0 .05 0.6 0 -.05 0.7 .05 0 0.7 -.05 0 0.7 0 .05 0.7 0 -.05 0.8 .05 0 0.8 -.05 0 0.8 0 .05 0.8 0 -.05 0.9 .05 0 0.9 -.05 0 0.9 0 .05 0.9 0 -.05 } } } { appearance {material {edgecolor 0 1 0} } INST transform 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 unit : oneaxis } { appearance {material {edgecolor 0 0 1} } INST transform 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 unit : oneaxis } } } { INST transforms { TLIST 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 } geom { INST transforms { TLIST 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.2 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.4 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.6 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.8 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -0.2 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -0.4 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -0.6 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -0.8 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -1 1 } geom { VECT 11 22 0 2 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 .2 -1 0 .2 1 0 .4 -1 0 .4 1 0 .6 -1 0 .6 1 0 .8 -1 0 .8 1 0 1 -1 0 1 1 0 -0.2 -1 0 -0.2 1 0 -0.4 -1 0 -0.4 1 0 -0.6 -1 0 -0.6 1 0 -0.8 -1 0 -0.8 1 0 -1 -1 0 -1 1 0 } } } geomview-1.9.5/data/geom/klein80000644000175000017500000032646112310110173013247 00000000000000# From Joe Christy: # <False] # OFF 2256 2304 4560 2.42139 0.318783 0.896873 2.85105 0.375348 0.766017 2.97221 0.391299 0.0654031 2.98053 0.392394 -0.193421 2.94276 0.387421 -0.645168 2.89582 0.381242 -0.80753 2.74729 0.361688 -0.951612 2.53371 0.333569 -0.83147 2.40734 0.316932 -0.680564 2.27137 0.299031 -0.482002 1.69441 0.223074 0.482002 1.55844 0.205173 0.680564 1.31799 0.173517 0.924043 1.21849 0.160417 0.951612 1.06996 0.140862 0.80753 0.994856 0.130975 0.435755 1.01881 0.134129 -0.323108 1.0597 0.139512 -0.562104 1.26064 0.165967 -1.01575 1.34818 0.177491 -1.04411 1.44326 0.190009 -1.00367 1.54438 0.203322 -0.896873 2.09524 0.275844 0.266802 2.11667 0.567161 0.529505 2.02422 0.542388 0.273642 2.20652 0.290494 0.515857 2.31564 0.304859 0.730622 2.52252 0.332096 1.00367 2.6176 0.344614 1.04411 2.70514 0.356138 1.01575 2.48294 0.665302 1.08374 2.78351 0.366456 0.920812 2.72747 0.730822 0.821648 2.79384 0.748608 0.621801 2.90608 0.382593 0.562104 2.94697 0.387975 0.323108 2.91395 0.780791 -0.127195 2.88951 0.774243 0.130526 2.97092 0.391129 -0.435755 2.8704 0.769121 -0.745577 2.83041 0.37263 -0.91197 2.64778 0.348588 -0.924043 2.7351 0.732868 -0.899149 2.24275 0.600944 -0.46194 2.08948 0.559875 -0.239568 2.1288 0.280262 -0.249728 1.77422 0.475401 0.239568 1.83697 0.241842 0.249728 1.62095 0.434333 0.46194 1.47622 0.395552 0.651107 1.43207 0.188536 0.83147 1.13537 0.149475 0.91197 0.993305 0.266155 0.745577 1.02302 0.134684 0.645168 0.957936 0.256678 0.580467 0.943782 0.252886 0.369644 0.985249 0.12971 0.193421 0.993568 0.130806 -0.0654031 0.974189 0.261033 -0.130526 1.01501 0.271972 -0.386014 1.06986 0.286668 -0.621801 1.11473 0.146757 -0.766017 1.18227 0.155649 -0.920812 1.21168 0.324668 -0.971655 1.38076 0.369974 -1.08374 1.65452 0.443328 -0.751008 1.65014 0.217246 -0.730622 1.75926 0.23161 -0.515857 1.87054 0.246261 -0.266802 1.98289 0.261052 -9.65804e-15 1.93185 0.517638 -9.90309e-15 1.91938 0.795034 0.27931 1.99216 0.825181 0.540886 2.20918 0.591949 0.751008 2.3015 0.616684 0.92388 2.14473 0.888376 0.94693 2.06707 0.856208 0.768178 2.39306 0.641218 1.03712 2.22528 0.92174 1.06613 2.39254 0.991022 1.10214 2.56983 0.688585 1.06122 2.4764 1.02576 1.01834 2.65202 0.710608 0.971655 2.63289 1.09058 0.678835 2.84869 0.763304 0.386014 2.75389 1.1407 0.19509 2.69948 1.11816 0.447267 2.91992 0.782391 -0.369644 2.81236 1.16492 -0.51328 2.90577 0.778598 -0.580467 2.8134 0.753848 -0.854109 2.66873 1.10542 -0.842836 2.63662 0.706481 -0.878203 2.51987 0.675197 -0.793353 2.38748 0.639724 -0.651107 2.1724 0.899838 -0.4399 2.01268 0.83368 -0.228382 1.68284 0.697054 0.228382 1.37355 0.568943 0.618862 1.34383 0.360079 0.793353 1.12205 0.464766 0.828602 1.22708 0.328795 0.878203 1.1286 0.302408 0.899149 0.954781 0.395483 0.79259 1.0503 0.281428 0.854109 0.949751 0.254485 0.127195 0.902734 0.373925 0.0604246 1.13624 0.304454 -0.821648 1.21912 0.504977 -1.01834 1.29387 0.346691 -1.06122 1.47065 0.394059 -1.03712 1.56221 0.418592 -0.92388 1.47024 0.608994 -1.06613 1.74703 0.468115 -0.529505 1.83948 0.492888 -0.273642 1.70336 0.705553 -0.540886 1.84776 0.765367 -1.01057e-14 1.83649 1.0603 0.54995 1.78323 1.02955 0.283783 1.89368 1.09332 0.782058 1.95619 1.12941 0.965926 2.30825 0.956108 1.11873 2.02478 1.16901 1.09057 2.55746 1.05934 0.87376 2.3464 1.35469 0.92213 2.42799 1.4018 0.732963 2.79278 1.15681 -0.0604246 2.61942 1.51232 0.00660481 2.56857 1.48296 0.258819 2.81313 1.16524 -0.30195 2.65061 1.53033 -0.612372 2.78858 1.15507 -0.680432 2.74074 1.13525 -0.79259 2.57347 1.06597 -0.828602 2.4578 1.41901 -0.775454 2.45692 1.01769 -0.75184 2.32197 0.961791 -0.618862 2.21067 1.27633 -0.583967 2.06063 1.1897 -0.415976 1.56485 0.903467 0.216217 1.52312 0.630895 0.4399 1.2386 0.513046 0.75184 1.00631 0.580991 0.775454 1.02679 0.42531 0.842836 0.906937 0.375666 0.680432 0.851891 0.49184 0.727678 0.883158 0.365816 0.51328 0.882387 0.365497 0.30195 0.844678 0.487675 -0.00660481 0.941632 0.390037 -0.19509 0.996033 0.41257 -0.447267 1.06263 0.440155 -0.678835 1.1177 0.645307 -0.92213 1.13806 0.471398 -0.87376 1.20172 0.693814 -1.06066 1.2849 0.74184 -1.13835 1.30298 0.539711 -1.10214 1.36469 0.787903 -1.14894 1.38727 0.574626 -1.11873 1.55079 0.642357 -0.94693 1.62845 0.674525 -0.768178 1.62762 0.939705 -0.54995 1.77614 0.735699 -0.27931 1.68088 0.970454 -0.283783 1.61876 1.24212 0.28704 1.65364 1.26888 0.55666 1.74148 1.33629 0.980785 2.09941 1.2121 1.14894 1.93639 1.48584 1.16968 2.1792 1.25816 1.13835 2.01646 1.54728 1.09844 2.26238 1.30619 1.06066 2.10045 1.61173 0.966552 2.5034 1.44534 0.506605 2.33796 1.79398 0.321439 2.65214 1.53121 -0.232963 2.39753 1.83969 0.073606 2.66338 1.53771 -0.443895 2.43987 1.87218 -0.162978 2.45816 1.88621 -0.541691 2.61221 1.50816 -0.727678 2.37294 1.82082 -0.719638 2.5477 1.47092 -0.782913 2.29036 1.75746 -0.718984 2.34442 1.35355 -0.707107 2.05452 1.57649 -0.546571 1.75077 1.34341 -0.203127 1.90865 1.46456 -0.39027 1.89925 1.09653 -0.216217 1.40347 0.810295 0.415976 1.42265 1.09163 0.203127 1.25344 0.723672 0.583967 1.11968 0.646447 0.707107 0.916401 0.529084 0.782913 0.800478 0.614228 0.719638 0.813492 0.46967 0.612372 0.800717 0.462294 0.443895 0.715255 0.548835 0.541691 0.811966 0.468789 0.232963 0.895535 0.517037 -0.258819 0.960704 0.554663 -0.506605 1.03611 0.598198 -0.732963 0.988562 0.758551 -0.783952 1.15695 0.887762 -1.09844 1.23703 0.949203 -1.16968 1.43932 0.830991 -1.09057 1.31051 1.00559 -1.17422 1.43193 1.09876 -0.980785 1.50791 0.87059 -0.965926 1.47954 1.13529 -0.79259 1.57042 0.906684 -0.782058 1.73205 1 -1.02651e-14 1.58671 1.21752 -1.03805e-14 1.42945 1.42945 0.289068 1.69387 1.29976 0.79259 1.448 1.448 0.560986 1.55053 1.55053 1.12536 1.79771 1.37943 1.11034 1.86291 1.42946 1.17422 1.74563 1.74563 1.13152 2.18485 1.6765 0.783952 1.90994 1.90994 0.831584 2.26553 1.7384 0.563773 2.18053 2.18053 -0.092296 2.46109 1.88846 -0.372609 2.42904 1.86387 -0.659649 2.19387 2.19387 -0.588796 2.14675 2.14675 -0.653281 2.18318 1.67521 -0.659346 1.85556 1.85556 -0.506835 1.71859 1.71859 -0.362894 1.26476 0.970485 0.39027 1.11889 0.858557 0.546571 0.972872 0.972872 0.506835 0.990232 0.759832 0.659346 0.853228 0.853228 0.608761 0.883049 0.677587 0.718984 0.681676 0.681676 0.653281 0.755143 0.755143 0.659436 0.634553 0.634553 0.588796 0.744374 0.571178 0.659649 0.61411 0.61411 0.46869 0.619318 0.619318 0.299728 0.712319 0.546582 0.372609 0.733547 0.562871 0.162978 0.775881 0.595354 -0.073606 0.835456 0.641068 -0.321439 0.696485 0.696485 -0.140292 0.907886 0.696646 -0.563773 1.07296 0.823315 -0.966552 1.002 1.002 -1.00683 1.0828 1.0828 -1.13152 1.3757 1.05561 -1.11034 1.22287 1.22287 -1.19448 1.32192 1.32192 -0.991445 1.51978 1.16617 -0.55666 1.35556 1.35556 -0.799728 1.55465 1.19293 -0.28704 1.41421 1.41421 -1.04515e-14 1.22421 1.59542 0.562909 1.47287 1.47287 0.799728 1.23607 1.61088 0.803441 1.50651 1.50651 0.991445 1.33434 1.73895 1.20962 1.60556 1.60556 1.19448 1.67112 1.67112 1.196 1.82643 1.82643 1.00683 1.53156 1.99596 1.04281 1.99187 1.99187 0.618527 1.61028 2.09855 0.875654 2.0675 2.0675 0.382683 2.13194 2.13194 0.140292 2.20911 2.20911 -0.299728 2.21432 2.21432 -0.46869 1.92353 2.5068 -0.393681 1.91075 2.49014 -0.515421 2.07328 2.07328 -0.659436 1.9752 1.9752 -0.608761 1.61685 2.10712 -0.464928 1.49346 1.94631 -0.333964 1.56952 1.56952 -0.189167 1.25891 1.25891 0.189167 1.10983 1.10983 0.362894 1.07657 1.40302 0.174397 0.562207 0.732683 0.584127 0.625076 0.814616 0.597064 0.647893 0.647893 0.092296 0.555521 0.723969 0.0212183 0.522714 0.681215 0.225563 0.760932 0.760932 -0.382683 0.671541 0.87517 -0.442289 0.836557 0.836557 -0.618527 0.918491 0.918491 -0.831584 0.824769 1.07486 -0.875654 0.977865 1.27438 -1.15975 0.903489 1.17745 -1.04281 1.15731 1.15731 -1.196 1.2779 1.2779 -1.12536 1.1007 1.43447 -1.20962 1.19897 1.56253 -0.803441 1.17771 1.53482 -0.997859 1.21084 1.57799 -0.562909 1.38043 1.38043 -0.560986 1.39898 1.39898 -0.289068 1.21594 1.58465 -0.289858 1.2191 1.58876 0.289858 0.991815 1.71787 0.289407 0.98893 1.71288 0.803714 0.987072 1.70966 0.562422 1.25734 1.63859 0.997859 1.28982 1.68093 1.13556 1 1.73205 1 1.10205 1.90881 1.23319 1.39061 1.81227 1.2172 1.45718 1.89904 1.15975 1.15849 2.00657 1.18301 1.29326 2.23999 0.915976 1.22327 2.11877 1.07431 1.68915 2.20134 0.670633 1.3646 2.36356 0.719866 1.7635 2.29824 0.442289 1.82852 2.38297 0.206377 1.87952 2.44944 -0.0212183 1.91233 2.4922 -0.225563 1.87284 2.44073 -0.584127 1.80997 2.3588 -0.597064 1.72369 2.24636 -0.55557 1.34248 2.32525 -0.421031 1.23707 2.14267 -0.303603 1.35847 1.7704 -0.174397 0.762928 1.32143 0.303603 0.941588 1.2271 0.333964 0.818197 1.0663 0.464928 0.711356 0.927057 0.55557 0.657517 1.13885 0.421031 0.443814 0.768708 0.512472 0.524293 0.683272 0.515421 0.511513 0.666617 0.393681 0.408494 0.707532 0.316987 0.456742 0.7911 -0.0499502 0.606526 0.79044 -0.206377 0.745899 0.972074 -0.670633 0.776725 1.34533 -1.07431 0.706742 1.22411 -0.915976 1.04444 1.36114 -1.2172 0.897949 1.55529 -1.23319 1.14522 1.49249 -1.13556 0.97788 1.69374 -1.1409 1.00819 1.74623 -0.289407 1.01293 1.75444 -0.562422 1.21752 1.58671 -1.04777e-14 1.02212 1.77036 1.1409 0.753705 1.81961 1.14135 1.05619 1.82937 1.21958 0.777753 1.87766 1.22432 0.812441 1.96141 1.2439 0.909 2.19452 1.10122 0.966411 2.33312 0.952374 1.02581 2.47652 0.766017 1.43301 2.48205 0.5 1.49401 2.58771 0.271579 1.13586 2.74221 0.335617 1.54326 2.673 0.0499502 1.57683 2.73115 -0.150433 1.59151 2.75657 -0.316987 1.20967 2.92041 -0.0746578 1.58501 2.74532 -0.43984 1.22317 2.95299 -0.362374 1.55619 2.69539 -0.512472 1.50508 2.60688 -0.532136 1.16443 2.81119 -0.464928 1.43301 2.48205 -0.5 1.12122 1.94202 -0.158881 0.878776 1.52208 0.158881 0.57671 1.3923 0.271943 0.566987 0.982051 0.5 0.493265 1.19085 0.37533 0.494917 0.857222 0.532136 0.366302 0.884332 0.464928 0.414986 0.718778 0.43984 0.423172 0.732955 0.150433 0.321062 0.775112 0.0746578 0.305683 0.737984 0.238936 0.351716 0.849116 -0.120905 0.505987 0.876395 -0.271579 0.566987 0.982051 -0.5 0.394872 0.953307 -0.335617 0.635397 1.10054 -0.719866 0.504926 1.219 -0.766017 0.564323 1.3624 -0.952374 0.841506 1.45753 -1.18301 0.621734 1.501 -1.10122 0.943814 1.63473 -1.21958 0.718293 1.73411 -1.2439 0.777028 1.87591 -1.14135 1 1.73205 -1 0.790396 1.90818 -0.997859 1.01107 1.75122 -0.803714 0.789317 1.90558 -0.559527 1 1.73205 -1.0459e-14 0.765367 1.84776 -1.03955e-14 0.751872 1.81518 0.287717 0.50366 1.87969 0.284794 0.741417 1.78994 0.559527 0.736797 1.77878 0.800545 0.740338 1.78733 0.997859 0.483855 1.80577 0.991445 0.856804 2.06851 1.20121 0.528351 1.97183 1.24928 0.680437 2.53943 0.808888 1.08356 2.61594 0.55557 1.17902 2.8464 0.120905 1.22505 2.95753 -0.238936 0.818754 3.05563 0.0014367 1.20297 2.90422 -0.438622 0.832732 3.1078 -0.283358 0.794828 2.96634 -0.39573 0.820391 3.06174 -0.362894 1.10859 2.67636 -0.442289 1.03747 2.50467 -0.37533 0.954024 2.30322 -0.271943 0.585219 2.18407 -0.125876 0.861926 2.08087 -0.142684 0.668808 1.61465 0.142684 0.422149 1.01916 0.442289 0.327649 1.2228 0.328023 0.240448 0.897363 0.39573 0.327765 0.791295 0.438622 0.307567 0.742532 0.362374 0.216522 0.808072 -0.0014367 0.273281 1.0199 -0.398218 0.447177 1.07958 -0.55557 0.398079 1.48565 -0.984695 0.354839 1.32428 -0.808888 0.439344 1.63966 -1.12341 0.67393 1.62701 -1.20121 0.476263 1.77744 -1.21427 0.75298 1.81786 -1.22432 0.544828 2.03333 -1.13691 0.551421 2.05793 -0.991445 0.793937 1.91673 -0.800545 0.550471 2.05439 -0.793948 0.778862 1.88034 -0.287717 0.531616 1.98402 -0.284794 0.492003 1.83618 0.554236 0.484805 1.80932 0.793948 0.235588 1.78947 0.980785 0.490448 1.83038 1.13691 0.237664 1.80523 1.12761 0.244382 1.85627 1.21807 0.505273 1.8857 1.22381 0.559013 2.08627 1.21427 0.595932 2.22405 1.12341 0.637197 2.37805 0.984695 0.290862 2.20932 1.14079 0.336073 2.55273 0.848295 0.722973 2.69817 0.608761 0.380622 2.89111 0.459115 0.359187 2.7283 0.659346 0.761996 2.84381 0.398218 0.794756 2.96607 0.191342 0.398874 3.02975 0.260959 0.412572 3.1338 0.0775251 0.420571 3.19456 -0.0801021 0.831914 3.10474 -0.159861 0.756756 2.82425 -0.382683 0.403922 3.0681 -0.324837 0.707627 2.6409 -0.328023 0.359462 2.73038 -0.27931 0.649562 2.4242 -0.239118 0.296136 2.24938 -0.108529 0.225969 1.7164 0.108529 0.450057 1.67964 0.125876 0.385714 1.4395 0.239118 0.162643 1.2354 0.27931 0.27852 1.03945 0.382683 0.137453 1.04406 0.321439 0.214885 0.801963 0.362894 0.202545 0.755907 0.283358 0.203363 0.75896 0.159861 0.123231 0.936029 -0.260959 0.24052 0.897634 -0.191342 0.312303 1.16553 -0.608761 0.162918 1.23748 -0.659346 0.186032 1.41305 -0.848295 0.506925 1.89187 -1.24928 0.530003 1.978 -1.22381 0.277723 2.10951 -1.21807 0.278684 2.11682 -0.546571 0.284353 2.15987 -0.783952 0.543273 2.02752 -0.554236 0.517638 1.93185 -1.02876e-14 0.270518 2.05479 -0.280652 0.251587 1.91099 0.280652 0.243421 1.84896 0.546571 0.237752 1.80591 0.783952 0.255779 1.94283 1.24932 0.271508 2.06231 1.22212 -3.21625e-16 2 1.22474 -3.46274e-16 2.15328 1.15328 -3.74606e-16 2.32946 1.03657 0.312812 2.37605 1.0128 -4.35336e-16 2.70711 0.707107 -4.04932e-16 2.51804 0.88407 -4.63794e-16 2.88407 0.518045 -5.07086e-16 3.15328 0.153281 -4.88317e-16 3.03657 0.329459 -5.18579e-16 3.22474 0 -5.21675e-16 3.244 -0.122027 0.422037 3.20569 -0.203127 0.416506 3.16368 -0.285612 -5.00685e-16 3.11347 -0.252553 0.384652 2.92172 -0.321439 -4.76957e-16 2.96593 -0.258819 0.329482 2.50267 -0.205269 -3.65898e-16 2.27531 -0.0907167 0.192622 1.46311 0.205269 -1.97703e-16 1.2294 0.229402 -2.35338e-16 1.46343 0.170541 -1.66292e-16 1.03407 0.258819 0.118182 0.897684 0.324837 0.105599 0.802102 0.285612 0.100067 0.760087 0.203127 0.101533 0.771223 0.0801021 -1.36163e-16 0.846719 -0.153281 0.109533 0.831984 -0.0775251 -1.79455e-16 1.11593 -0.518045 0.141483 1.07467 -0.459115 -2.07913e-16 1.29289 -0.707107 0.209292 1.58973 -1.0128 -2.38317e-16 1.48196 -0.88407 0.231243 1.75646 -1.14079 0.250597 1.90347 -1.22212 -3.21625e-16 2 -1.22474 0.266326 2.02295 -1.24932 0.284441 2.16054 -1.12761 -3.62238e-16 2.25255 -1.11347 0.286517 2.17631 -0.980785 -3.58515e-16 2.2294 -0.770598 -3.36213e-16 2.09072 -0.275309 -3.4905e-16 2.17054 -0.536566 0.261052 1.98289 -1.01356e-14 -3.07036e-16 1.90928 0.275309 -2.942e-16 1.82946 0.536566 -0.234259 1.77938 0.524263 -0.246887 1.87529 0.268786 -2.84734e-16 1.7706 0.770598 -0.219096 1.6642 0.94693 -0.224595 1.70597 0.753945 -2.80003e-16 1.74118 0.965926 -2.81011e-16 1.74745 1.11347 -0.218653 1.66083 1.09457 -2.88319e-16 1.79289 1.20711 -3.02001e-16 1.87797 1.244 -0.295114 2.24162 1.05589 -0.347114 2.63659 0.75184 -0.371777 2.82393 0.574756 -0.393249 2.98702 0.396549 -0.420042 3.19054 -0.127715 -5.15742e-16 3.20711 -0.207107 -0.389071 2.95528 -0.19509 -4.45546e-16 2.7706 -0.229402 -4.07911e-16 2.53657 -0.170541 -0.22442 1.70464 0.0725165 -2.77352e-16 1.72469 0.0907167 -0.133034 1.0105 0.19509 -0.158726 1.20564 0.178511 -0.11387 0.864931 0.179188 -1.42565e-16 0.886528 0.252553 -1.27507e-16 0.792893 0.207107 -1.21574e-16 0.756002 0.122027 -1.24671e-16 0.775255 2.44249e-15 -1.54932e-16 0.963434 -0.329459 -0.11215 0.851862 -0.228382 -0.150328 1.14185 -0.574756 -0.17499 1.32918 -0.75184 -2.68643e-16 1.67054 -1.03657 -2.96975e-16 1.84672 -1.15328 -0.287566 2.18428 -1.23335 -3.41248e-16 2.12203 -1.244 -3.5493e-16 2.20711 -1.20711 -0.303452 2.30495 -1.09457 -3.63246e-16 2.25882 -0.965926 -0.303009 2.30158 -0.94693 -0.287845 2.1864 -0.524263 -3.21625e-16 2 -9.94013e-15 -0.261052 1.98289 -9.70214e-15 -0.275218 2.09049 -0.268786 -0.485059 1.81027 0.261112 -0.43274 1.61501 0.734063 -0.418592 1.56221 0.92388 -0.223773 1.69972 1.19098 -0.234539 1.7815 1.23335 -0.250597 1.90347 1.22212 -0.271171 2.05975 1.16084 -0.51801 1.93324 1.16342 -0.476263 1.77744 1.21427 -0.320979 2.43808 0.916059 -0.620705 2.3165 0.944125 -0.675197 2.51987 0.793353 -0.409955 3.11392 0.228382 -0.420571 3.19456 0.0801021 -0.831914 3.10474 0.159861 -0.424121 3.22152 -0.0404045 -0.408234 3.10085 -0.179188 -0.811892 3.03002 -0.105055 -0.363379 2.76013 -0.178511 -0.332394 2.52478 -0.135082 -0.723127 2.69875 -0.126856 -0.297685 2.26114 -0.0725165 -0.591348 2.20694 -0.0540057 -0.189711 1.44099 0.135082 -0.312149 1.16496 0.126856 -0.102063 0.775243 0.127715 -0.200892 0.749739 0.0477759 -0.097984 0.744262 0.0404045 -0.1943 0.725137 -0.0413911 -0.101533 0.771223 -0.0801021 -0.128856 0.978755 -0.396549 -0.201126 1.5277 -0.916059 -0.414572 1.5472 -0.944125 -0.468115 1.74703 -1.0707 -0.22699 1.72416 -1.05589 -0.250933 1.90603 -1.16084 -0.271508 2.06231 -1.22212 -0.517266 1.93046 -1.16342 -0.559013 2.08627 -1.21427 -0.590976 2.20555 -1.21743 -0.298332 2.26606 -1.19098 -0.602537 2.2487 -0.734063 -0.29751 2.25981 -0.753945 -0.579526 2.16282 -0.509716 -0.517638 1.93185 -9.42261e-15 -0.550217 2.05344 -0.261112 -0.45575 1.70088 0.509716 -0.661299 1.59652 0.492985 -0.59611 1.43914 0.896873 -0.415216 1.54961 1.07098 -0.597513 1.44253 1.14351 -0.587447 1.41822 1.04281 -0.423714 1.58132 1.16975 -0.4443 1.65815 1.21743 -0.67393 1.62701 1.20121 -0.567161 2.11667 1.0707 -0.811635 1.95946 1.08092 -0.977974 2.36104 0.83147 -0.893802 2.15783 0.968148 -0.726994 2.71318 0.629007 -1.05851 2.55547 0.680564 -0.772496 2.88299 0.46194 -0.808397 3.01698 0.302504 -1.22505 2.95753 0.238936 -0.840976 3.13857 0.0413911 -0.834384 3.11396 -0.0477759 -1.20214 2.90223 -0.030473 -0.774243 2.88951 -0.130526 -1.07172 2.58737 -0.0746578 -0.661085 2.4672 -0.0990458 -0.875471 2.11357 -0.0352636 -0.443928 1.65676 0.0540057 -0.655262 1.58194 0.0352636 -0.374191 1.3965 0.0990458 -0.261033 0.974189 0.130526 -0.223384 0.83368 0.105055 -0.296841 0.716638 -0.0323676 -0.203363 0.75896 -0.159861 -0.226879 0.846723 -0.302504 -0.343949 0.830367 -0.37533 -0.26278 0.980709 -0.46194 -0.400909 0.96788 -0.525353 -0.308282 1.15053 -0.629007 -0.360079 1.34383 -0.793353 -0.636932 1.53769 -0.968148 -0.793937 1.91673 -1.16103 -0.856804 2.06851 -1.20121 -0.611562 2.28238 -1.16975 -0.620061 2.3141 -1.07098 -0.93322 2.25299 -1.14351 -0.616684 2.3015 -0.92388 -0.934623 2.25638 -0.896873 -0.81997 1.97958 -0.252321 -0.710764 1.71594 0.252321 -0.621734 1.501 0.711037 -0.848198 1.46912 0.474144 -0.789485 1.36743 0.684967 -0.75 1.29904 0.866025 -0.626692 1.51297 1.19629 -0.841506 1.45753 1.18301 -0.736797 1.77878 1.16103 -1.02498 1.77531 1.08652 -1.13579 1.96724 0.988026 -1.35993 2.35547 0.729207 -1.25 2.16506 0.866025 -1.12982 2.72764 0.525353 -1.18678 2.86515 0.37533 -1.24139 2.99697 0.12301 -1.59151 2.75657 0.316987 -1.23389 2.97888 0.0323676 -1.60979 2.78824 0.112372 -1.57045 2.7201 0.0442399 -1.5 2.59808 1.66533e-16 -1.14723 2.76966 -0.0654031 -0.979489 2.36469 -0.0625849 -1.28121 2.21912 -0.0258561 -0.551245 1.33082 0.0625849 -0.459011 1.10815 0.0746578 -0.598143 1.03601 0.0221398 -0.718789 1.24498 0.0258561 -0.383503 0.925858 0.0654031 -0.328592 0.793291 0.030473 -0.5 0.866025 3.33067e-16 -0.289346 0.698544 -0.12301 -0.305683 0.737984 -0.238936 -0.408494 0.707532 -0.316987 -0.472225 1.14005 -0.680564 -0.640067 1.10863 -0.729207 -0.552759 1.33448 -0.83147 -0.864211 1.49686 -0.988026 -0.719099 1.73606 -1.08092 -1.15849 2.00657 -1.18301 -0.904042 2.18255 -1.19629 -0.943287 2.2773 -1.04281 -1.25 2.16506 -0.866025 -1.26607 2.19289 -1.01017 -0.909 2.19452 -0.711037 -0.869435 2.099 -0.492985 -0.765367 1.84776 -9.10272e-15 -1.07944 1.86965 -0.242449 -0.92056 1.59446 0.242449 -1.01422 1.32176 0.453272 -0.934492 1.21785 0.655964 -0.733932 1.27121 1.01017 -0.879313 1.14594 0.83147 -0.854053 1.11302 0.9732 -0.743764 1.28824 1.11237 -0.903754 1.1778 1.13876 -0.78008 1.35114 1.17003 -0.924784 1.60177 1.15366 -1.20461 1.56987 1.08746 -1.08021 1.40776 1.14135 -1.48677 1.9376 0.896873 -1.62578 2.11876 0.774727 -1.45799 2.52531 0.586516 -1.85234 2.41402 0.515857 -1.53716 2.66243 0.44655 -1.6166 2.80003 0.204101 -1.92353 2.5068 0.393681 -1.90881 2.48761 0.118763 -1.82498 2.37836 0.0654031 -1.40186 2.42809 -0.0221398 -1.39398 1.81667 0.00259265 -1.1447 1.98268 -0.0163705 -0.855297 1.48142 0.0163705 -0.728419 0.949294 -0.030473 -0.874846 1.14012 -0.0109834 -0.429551 0.744005 -0.0442399 -0.390211 0.675865 -0.112372 -0.526237 0.685806 -0.118763 -0.383404 0.664074 -0.204101 -0.476536 0.621034 -0.284319 -0.462844 0.801669 -0.44655 -0.582703 0.759393 -0.515857 -0.542012 0.938793 -0.586516 -0.75 1.29904 -0.866025 -0.948275 1.23582 -0.896873 -0.975025 1.68879 -1.08652 -1.09189 1.42298 -1.00367 -1.07522 1.86233 -1.15366 -1.35484 1.76566 -1.14135 -1.21992 2.11296 -1.17003 -1.25624 2.17586 -1.11237 -1.21052 2.09667 -0.684967 -1.55573 2.02747 -0.83147 -1.1518 1.99498 -0.474144 -1.42083 1.85166 -0.453272 -1 1.73205 -8.74386e-15 -1.11136 1.44835 0.231538 -0.983754 0.983754 0.793353 -0.861929 1.12329 1.07647 -0.952274 0.952274 1.03596 -0.947922 0.947922 0.932066 -0.977865 1.27438 1.15975 -1.0828 1.0828 1.13152 -1.20227 1.20227 1.12415 -1.34316 1.75044 1.00367 -1.51341 1.51341 1.01502 -1.75059 2.28141 0.645168 -2.12615 2.12615 0.582955 -2.00223 2.00223 0.701057 -1.95851 2.55238 0.284319 -2.25991 2.25991 0.363319 -1.95389 2.54636 0.191896 -2.25884 2.25884 0.270598 -2.11527 2.11527 0.130526 -2.20996 2.20996 0.192778 -1.70663 2.22412 0.030473 -1.5602 2.03329 0.0109834 -1.04107 1.35675 -0.00259265 -0.610065 0.795052 -0.0654031 -0.481154 0.627052 -0.191896 -0.56959 0.56959 -0.270598 -0.511513 0.666617 -0.393681 -0.684458 0.892003 -0.645168 -0.702274 0.702274 -0.582955 -0.826195 0.826195 -0.701057 -0.809268 1.05466 -0.774727 -1.23044 1.60354 -1.08746 -1.31501 1.31501 -1.01502 -1.62615 1.62615 -1.12415 -1.45718 1.89904 -1.15975 -1.53129 1.99562 -1.13876 -1.87615 1.87615 -1.03596 -1.83056 1.83056 -1.10261 -1.57312 2.05013 -1.07647 -1.88051 1.88051 -0.932066 -1.58099 2.06039 -0.9732 -1.84467 1.84467 -0.793353 -1.50055 1.95556 -0.655964 -1.54798 1.54798 -0.219636 -1.32369 1.72507 -0.231538 -1.21752 1.58671 -8.34756e-15 -1.28045 1.28045 0.219636 -1.27708 0.979941 0.405803 -1.15761 1.15761 0.430459 -1.05583 1.05583 0.624151 -1.0163 0.779833 0.886941 -0.997872 0.997872 1.10261 -1.06337 0.815954 1.06174 -1.15695 0.887762 1.09844 -1.34895 1.34895 1.08374 -1.6451 1.26233 1.02202 -1.45741 1.11831 1.07538 -1.68481 1.68481 0.92388 -1.85158 1.85158 0.81693 -2.20866 1.69476 0.753945 -2.03398 1.56073 0.855634 -2.21432 2.21432 0.46869 -2.51468 1.92958 0.440764 -2.4676 1.89346 0.265968 -1.97971 1.97971 0.0829553 -2.21551 1.70002 0.135082 -1.81089 1.81089 0.0477759 -1.61862 1.61862 0.0215447 -1.81443 1.39226 0.0404045 -2.02833 1.5564 0.0843638 -1.20981 1.20981 -0.0215447 -1.01754 1.01754 -0.0477759 -0.84872 0.84872 -0.0829553 -0.713156 0.713156 -0.130526 -0.957903 0.735024 -0.135082 -0.618462 0.618462 -0.192778 -0.705811 0.541588 -0.265968 -0.568512 0.568512 -0.363319 -0.715255 0.548835 -0.541691 -0.658738 0.505467 -0.440764 -0.61411 0.61411 -0.46869 -0.976849 0.976849 -0.81693 -1.14362 1.14362 -0.92388 -1.13944 0.87432 -0.855634 -1.33169 1.02184 -0.94693 -1.47948 1.47948 -1.08374 -1.88232 1.44435 -1.10214 -1.74563 1.74563 -1.13152 -2.11004 1.61909 -1.06174 -2.15712 1.65521 -0.886941 -1.7726 1.7726 -0.624151 -1.89633 1.4551 -0.405803 -1.67082 1.67082 -0.430459 -1.41421 1.41421 -7.91551e-15 -1.42555 1.09387 0.206794 -1.37181 0.792012 0.37941 -1.5448 0.891891 0.193066 -1.15308 0.884791 0.589666 -1.06361 0.816139 0.75184 -1.06049 0.612273 0.838018 -1.01578 0.779435 0.99102 -1.05403 0.608543 0.941832 -1.10186 0.636161 1.01632 -1.20172 0.693814 1.06066 -1.2911 0.990693 1.10214 -1.34763 0.778052 1.07541 -1.5303 0.883519 1.06242 -1.95619 1.12941 0.965926 -1.73777 1.0033 1.02465 -1.84172 1.4132 0.94693 -2.35352 1.80592 0.647557 -2.45816 1.88621 0.541691 -2.65061 1.53033 0.612372 -2.71789 1.56917 0.51632 -2.51828 1.93234 0.348141 -2.72706 1.57447 0.424194 -2.36482 1.81459 0.19509 -2.67651 1.54529 0.338018 -2.40933 1.39103 0.186631 -2.56857 1.48296 0.258819 -2.20832 1.27498 0.12059 -1.35898 1.04278 -0.0404045 -1.14508 0.87865 -0.0843638 -1.25578 0.725025 -0.12059 -0.808597 0.620459 -0.19509 -0.655134 0.502702 -0.348141 -0.746213 0.430826 -0.51632 -0.737041 0.425531 -0.424194 -0.819889 0.629123 -0.647557 -0.813492 0.46967 -0.612372 -0.964756 0.740283 -0.753945 -1.09729 0.633519 -0.803603 -1.50791 0.87059 -0.965926 -1.29332 0.746698 -0.890675 -1.52831 1.17271 -1.02202 -1.71601 1.31674 -1.07538 -2.11648 1.22195 -1.07541 -2.26238 1.30619 -1.06066 -2.01646 1.54728 -1.09844 -2.36224 1.36384 -1.01632 -2.15763 1.65561 -0.99102 -2.40361 1.38773 -0.838018 -2.41007 1.39146 -0.941832 -2.1098 1.61891 -0.75184 -2.23778 1.29198 -0.552657 -2.02033 1.55025 -0.589666 -1.74786 1.34118 -0.206794 -2.0923 1.20799 -0.37941 -1.58671 1.21752 -7.44956e-15 -1.63676 0.677969 0.178511 -1.22632 0.708017 0.552657 -1.11968 0.646447 0.707107 -1.08223 0.448274 0.785507 -1.06908 0.442828 0.88861 -1.21912 0.504977 1.01834 -1.56879 0.649816 1.04491 -1.79193 0.742243 1.02289 -2.17078 1.2533 0.890675 -2.36682 1.36648 0.803603 -2.26098 0.936529 0.921901 -2.65501 1.09974 0.768178 -2.53064 1.46107 0.709386 -1.97781 1.14189 0.0590913 -2.34747 0.972355 0.156301 -1.48629 0.858109 -0.0590913 -1.05477 0.608971 -0.186631 -0.97291 0.402992 -0.321439 -1.13806 0.471398 -0.237381 -0.895535 0.517037 -0.258819 -0.787588 0.454714 -0.338018 -0.814183 0.337246 -0.49843 -0.933463 0.538935 -0.709386 -1.2206 0.505588 -0.849821 -1.90358 0.78849 -1.02289 -1.72633 0.996698 -1.02465 -1.9338 1.11648 -1.06242 -2.58002 1.06868 -0.966552 -2.34442 1.35355 -0.707107 -2.41951 1.0022 -0.51328 -1.9193 1.10811 -0.193066 -1.73205 1 -6.95172e-15 -2.05876 0.852765 -0.178511 -1.44134 0.597025 0.351391 -1.27601 0.528539 0.51328 -1.15315 0.47765 0.659346 -1.16553 0.312303 0.608761 -1.1155 0.462056 0.966552 -1.37355 0.568943 1.04408 -2.028 0.840025 0.980785 -2.47492 1.02515 0.849821 -2.30471 0.617546 0.94918 -2.78858 1.15507 0.680432 -2.866 1.18714 0.589666 -2.88134 1.19349 0.49843 -2.83273 1.17336 0.408621 -2.72261 1.12774 0.321439 -2.82425 0.756756 0.382683 -2.55746 1.05934 0.237381 -2.44331 0.654684 0.191342 -2.10581 0.872254 0.0775251 -1.66753 0.446814 -0.0956269 -1.58971 0.658479 -0.0775251 -1.42039 0.380592 -0.191342 -1.34805 0.558379 -0.156301 -1.20643 0.323263 -0.287114 -0.862784 0.357377 -0.408621 -0.829513 0.343596 -0.589666 -0.906796 0.242975 -0.660487 -0.906937 0.375666 -0.680432 -1.04051 0.430993 -0.768178 -1.43454 0.594205 -0.921901 -1.66752 0.690709 -0.980785 -2.12672 0.880918 -1.04491 -2.32197 0.961791 -1.04408 -2.4764 1.02576 -1.01834 -2.49254 0.667874 -1.00827 -2.62644 1.08791 -0.88861 -2.80036 0.750355 -0.831584 -2.61329 1.08246 -0.785507 -2.54237 1.05308 -0.659346 -2.69817 0.722973 -0.608761 -2.37805 0.637197 -0.321868 -2.25417 0.933709 -0.351391 -2.16326 0.579643 -0.163192 -1.84776 0.765367 -6.4241e-15 -1.7353 0.228456 0.147174 -1.70045 0.455633 0.163192 -1.48565 0.398079 0.321868 -1.50501 0.198139 0.290966 -1.30293 0.349119 0.471705 -1.15853 0.152524 0.55557 -1.08357 0.290342 0.729632 -1.06334 0.284921 0.831584 -1.10685 0.296578 0.912645 -1.07872 0.142016 0.854829 -1.21168 0.324668 0.971655 -1.18227 0.155649 0.920812 -1.37116 0.367402 1.00827 -1.5748 0.421967 1.02293 -1.34324 0.176841 0.968148 -1.80899 0.484718 1.01675 -2.05793 0.551421 0.991445 -2.04773 0.269589 0.997859 -2.53247 0.678572 0.892399 -2.7255 0.730296 0.82368 -2.74235 0.361038 0.875654 -2.8704 0.769121 0.745577 -2.95691 0.792301 0.660487 -2.89582 0.381242 0.80753 -2.97866 0.798131 0.570531 -3.01806 0.397336 0.64019 -2.93363 0.786065 0.477475 -2.87209 0.378118 0.442289 -2.65727 0.712013 0.287114 -2.49433 0.328385 0.225563 -2.70726 0.356418 0.335617 -2.19617 0.588462 0.0956269 -1.47145 0.19372 -0.225563 -1.03945 0.27852 -0.382683 -0.987804 0.130047 -0.544283 -1.09369 0.143987 -0.442289 -0.930069 0.249211 -0.477475 -0.947716 0.124769 -0.64019 -0.885038 0.237145 -0.570531 -1.06996 0.140862 -0.80753 -0.993305 0.266155 -0.745577 -1.1382 0.30498 -0.82368 -1.33124 0.356704 -0.892399 -1.22343 0.161067 -0.875654 -1.66255 0.218878 -0.972395 -1.42559 0.187683 -0.931156 -1.55899 0.41773 -0.94918 -1.80577 0.483855 -0.991445 -2.05471 0.550559 -1.01675 -2.41492 0.31793 -0.996559 -2.17466 0.286299 -1.00625 -2.2889 0.613309 -1.02293 -2.62254 0.345264 -0.968148 -2.78351 0.366456 -0.920812 -2.65202 0.710608 -0.971655 -2.75686 0.738698 -0.912645 -2.92636 0.385263 -0.770996 -2.78013 0.744934 -0.729632 -2.89903 0.381664 -0.670633 -2.80725 0.369581 -0.55557 -2.56077 0.686157 -0.471705 -2.46077 0.323966 -0.290966 -1.93185 0.517638 -5.86898e-15 -1.30815 0.172221 0.428111 -1.29289 1.30665e-15 0.382683 -1.5 1.51596e-15 0.258819 -1.06675 0.140441 0.670633 -1 1.01064e-15 0.707107 -1.03942 0.136842 0.770996 -1.03407 1.04508e-15 0.793353 -1.55086 0.204175 0.996559 -1.79112 0.235806 1.00625 -1.74118 1.75971e-15 0.991445 -2.25882 2.28286e-15 0.991445 -2.30323 0.303227 0.972395 -2.54018 0.334422 0.931156 -2.98995 0.393634 0.72848 -2.97798 0.392058 0.544283 -2.70711 2.73592e-15 0.382683 -2.5 2.52661e-15 0.258819 -2.24741 0.295877 0.113319 -1.71837 0.226228 -0.113319 -1.25852 0.165687 -0.335617 -1.5 1.51596e-15 -0.258819 -1.13397 1.14604e-15 -0.5 -1.03407 1.04508e-15 -0.793353 -0.975834 0.128471 -0.72848 -1.29289 1.30665e-15 -0.92388 -1.74118 1.75971e-15 -0.991445 -1.91805 0.252516 -0.997859 -2 2.02129e-15 -1 -2.5 2.52661e-15 -0.965926 -2.25882 2.28286e-15 -0.991445 -2.70711 2.73592e-15 -0.92388 -2.88706 0.380088 -0.854829 -2.96593 2.99749e-15 -0.608761 -2.65763 0.349884 -0.428111 -2.25882 2.28286e-15 -0.130526 -2.23048 0.293648 -0.147174 -1.98289 0.261052 -5.28872e-15 -2 2.02129e-15 -4.68582e-15 -1.74118 1.75971e-15 0.130526 -1.47145 -0.19372 0.225563 -1.13397 1.14604e-15 0.5 -1.09369 -0.143987 0.442289 -1.03407 1.04508e-15 0.608761 -0.987804 -0.130047 0.544283 -1.13397 1.14604e-15 0.866025 -1.06996 -0.140862 0.80753 -1.29289 1.30665e-15 0.92388 -1.22343 -0.161067 0.875654 -1.5 1.51596e-15 0.965926 -2 2.02129e-15 1 -1.91805 -0.252516 0.997859 -2.5 2.52661e-15 0.965926 -2.62254 -0.345264 0.968148 -2.41492 -0.31793 0.996559 -2.70711 2.73592e-15 0.92388 -2.86603 2.89653e-15 0.866025 -2.96593 2.99749e-15 0.793353 -2.88706 -0.380088 0.854829 -2.78351 -0.366456 0.920812 -3 3.03193e-15 0.707107 -2.92636 -0.385263 0.770996 -2.96593 2.99749e-15 0.608761 -2.86603 2.89653e-15 0.5 -2.65763 -0.349884 0.428111 -2.46077 -0.323966 0.290966 -2.25882 2.28286e-15 0.130526 -2.23048 -0.293648 0.147174 -1.74118 1.75971e-15 -0.130526 -1.30815 -0.172221 -0.428111 -1.50501 -0.198139 -0.290966 -1.29289 1.30665e-15 -0.382683 -1.15853 -0.152524 -0.55557 -1.03407 1.04508e-15 -0.608761 -1 1.01064e-15 -0.707107 -1.13397 1.14604e-15 -0.866025 -1.55086 -0.204175 -0.996559 -1.5 1.51596e-15 -0.965926 -2.30323 -0.303227 -0.972395 -2.86603 2.89653e-15 -0.866025 -2.89582 -0.381242 -0.80753 -2.96593 2.99749e-15 -0.793353 -3 3.03193e-15 -0.707107 -2.86603 2.89653e-15 -0.5 -2.70711 2.73592e-15 -0.382683 -2.87209 -0.378118 -0.442289 -2.49433 -0.328385 -0.225563 -2.5 2.52661e-15 -0.258819 -1.71837 -0.226228 0.113319 -1.20643 -0.323263 0.287114 -1.42039 -0.380592 0.191342 -1.25852 -0.165687 0.335617 -1.03945 -0.27852 0.382683 -0.885038 -0.237145 0.570531 -0.930069 -0.249211 0.477475 -0.947716 -0.124769 0.64019 -0.975834 -0.128471 0.72848 -0.906796 -0.242975 0.660487 -1.42559 -0.187683 0.931156 -1.66255 -0.218878 0.972395 -1.55899 -0.41773 0.94918 -1.80577 -0.483855 0.991445 -2.17466 -0.286299 1.00625 -2.49254 -0.667874 1.00827 -2.2889 -0.613309 1.02293 -2.65202 -0.710608 0.971655 -2.80036 -0.750355 0.831584 -2.89903 -0.381664 0.670633 -2.80725 -0.369581 0.55557 -2.37805 -0.637197 0.321868 -1.7353 -0.228456 -0.147174 -1.06675 -0.140441 -0.670633 -1.08357 -0.290342 -0.729632 -1.06334 -0.284921 -0.831584 -1.03942 -0.136842 -0.770996 -1.07872 -0.142016 -0.854829 -1.18227 -0.155649 -0.920812 -1.21168 -0.324668 -0.971655 -1.34324 -0.176841 -0.968148 -1.37116 -0.367402 -1.00827 -1.79112 -0.235806 -1.00625 -2.04773 -0.269589 -0.997859 -2.30471 -0.617546 -0.94918 -2.54018 -0.334422 -0.931156 -2.74235 -0.361038 -0.875654 -2.53247 -0.678572 -0.892399 -2.98995 -0.393634 -0.72848 -2.8704 -0.769121 -0.745577 -2.97866 -0.798131 -0.570531 -3.01806 -0.397336 -0.64019 -2.97798 -0.392058 -0.544283 -2.93363 -0.786065 -0.477475 -2.70726 -0.356418 -0.335617 -2.65727 -0.712013 -0.287114 -2.82425 -0.756756 -0.382683 -2.24741 -0.295877 -0.113319 -1.98289 -0.261052 -4.06285e-15 -1.66753 -0.446814 0.0956269 -1.34805 -0.558379 0.156301 -0.97291 -0.402992 0.321439 -0.993305 -0.266155 0.745577 -1.1382 -0.30498 0.82368 -1.33124 -0.356704 0.892399 -2.05471 -0.550559 1.01675 -2.32197 -0.961791 1.04408 -2.75686 -0.738698 0.912645 -2.58002 -1.06868 0.966552 -2.78013 -0.744934 0.729632 -2.61329 -1.08246 0.785507 -2.62644 -1.08791 0.88861 -2.69817 -0.722973 0.608761 -2.56077 -0.686157 0.471705 -2.54237 -1.05308 0.659346 -2.25417 -0.933709 0.351391 -2.41951 -1.0022 0.51328 -2.16326 -0.579643 0.163192 -1.70045 -0.455633 -0.163192 -1.48565 -0.398079 -0.321868 -1.30293 -0.349119 -0.471705 -1.44134 -0.597025 -0.351391 -1.16553 -0.312303 -0.608761 -1.08223 -0.448274 -0.785507 -1.10685 -0.296578 -0.912645 -1.37355 -0.568943 -1.04408 -1.5748 -0.421967 -1.02293 -1.80899 -0.484718 -1.01675 -2.05793 -0.551421 -0.991445 -2.7255 -0.730296 -0.82368 -2.95691 -0.792301 -0.660487 -2.83273 -1.17336 -0.408621 -2.55746 -1.05934 -0.237381 -2.72261 -1.12774 -0.321439 -2.44331 -0.654684 -0.191342 -2.19617 -0.588462 -0.0956269 -1.93185 -0.517638 -3.42249e-15 -1.84776 -0.765367 -2.76747e-15 -2.10581 -0.872254 -0.0775251 -1.58971 -0.658479 0.0775251 -1.13806 -0.471398 0.237381 -0.862784 -0.357377 0.408621 -0.814183 -0.337246 0.49843 -0.737041 -0.425531 0.424194 -0.787588 -0.454714 0.338018 -0.829513 -0.343596 0.589666 -0.906937 -0.375666 0.680432 -1.04051 -0.430993 0.768178 -0.813492 -0.46967 0.612372 -1.2206 -0.505588 0.849821 -1.43454 -0.594205 0.921901 -1.66752 -0.690709 0.980785 -1.72633 -0.996698 1.02465 -1.90358 -0.78849 1.02289 -2.12672 -0.880918 1.04491 -2.11648 -1.22195 1.07541 -2.4764 -1.02576 1.01834 -2.36224 -1.36384 1.01632 -2.41007 -1.39146 0.941832 -2.34442 -1.35355 0.707107 -2.0923 -1.20799 0.37941 -2.23778 -1.29198 0.552657 -2.05876 -0.852765 0.178511 -1.9193 -1.10811 0.193066 -1.63676 -0.677969 -0.178511 -1.27601 -0.528539 -0.51328 -1.15315 -0.47765 -0.659346 -1.11968 -0.646447 -0.707107 -1.06908 -0.442828 -0.88861 -1.05403 -0.608543 -0.941832 -1.06049 -0.612273 -0.838018 -1.1155 -0.462056 -0.966552 -1.10186 -0.636161 -1.01632 -1.21912 -0.504977 -1.01834 -1.20172 -0.693814 -1.06066 -1.56879 -0.649816 -1.04491 -1.79193 -0.742243 -1.02289 -1.95619 -1.12941 -0.965926 -1.73777 -1.0033 -1.02465 -2.028 -0.840025 -0.980785 -2.26098 -0.936529 -0.921901 -2.47492 -1.02515 -0.849821 -2.65501 -1.09974 -0.768178 -2.78858 -1.15507 -0.680432 -2.71789 -1.56917 -0.51632 -2.65061 -1.53033 -0.612372 -2.866 -1.18714 -0.589666 -2.72706 -1.57447 -0.424194 -2.88134 -1.19349 -0.49843 -2.20832 -1.27498 -0.12059 -2.34747 -0.972355 -0.156301 -1.97781 -1.14189 -0.0590913 -1.73205 -1 -2.1006e-15 -1.48629 -0.858109 0.0590913 -1.25578 -0.725025 0.12059 -1.05477 -0.608971 0.186631 -0.895535 -0.517037 0.258819 -0.808597 -0.620459 0.19509 -0.957903 -0.735024 0.135082 -0.705811 -0.541588 0.265968 -0.658738 -0.505467 0.440764 -0.746213 -0.430826 0.51632 -0.933463 -0.538935 0.709386 -0.819889 -0.629123 0.647557 -0.964756 -0.740283 0.753945 -1.09729 -0.633519 0.803603 -1.13944 -0.87432 0.855634 -1.29332 -0.746698 0.890675 -1.50791 -0.87059 0.965926 -1.9338 -1.11648 1.06242 -1.52831 -1.17271 1.02202 -1.88232 -1.44435 1.10214 -2.26238 -1.30619 1.06066 -2.11004 -1.61909 1.06174 -2.15763 -1.65561 0.99102 -2.40361 -1.38773 0.838018 -2.15712 -1.65521 0.886941 -1.5448 -0.891891 -0.193066 -1.37181 -0.792012 -0.37941 -1.27708 -0.979941 -0.405803 -1.42555 -1.09387 -0.206794 -1.22632 -0.708017 -0.552657 -1.15308 -0.884791 -0.589666 -1.01578 -0.779435 -0.99102 -1.15695 -0.887762 -1.09844 -1.06337 -0.815954 -1.06174 -1.34763 -0.778052 -1.07541 -1.2911 -0.990693 -1.10214 -1.5303 -0.883519 -1.06242 -1.6451 -1.26233 -1.02202 -2.17078 -1.2533 -0.890675 -2.36682 -1.36648 -0.803603 -2.20866 -1.69476 -0.753945 -2.03398 -1.56073 -0.855634 -2.35352 -1.80592 -0.647557 -2.53064 -1.46107 -0.709386 -2.51468 -1.92958 -0.440764 -2.45816 -1.88621 -0.541691 -2.51828 -1.93234 -0.348141 -2.67651 -1.54529 -0.338018 -2.4676 -1.89346 -0.265968 -2.56857 -1.48296 -0.258819 -2.36482 -1.81459 -0.19509 -2.40933 -1.39103 -0.186631 -1.35898 -1.04278 0.0404045 -1.14508 -0.87865 0.0843638 -0.84872 -0.84872 0.0829553 -1.01754 -1.01754 0.0477759 -0.618462 -0.618462 0.192778 -0.713156 -0.713156 0.130526 -0.655134 -0.502702 0.348141 -0.568512 -0.568512 0.363319 -0.56959 -0.56959 0.270598 -0.715255 -0.548835 0.541691 -0.702274 -0.702274 0.582955 -0.976849 -0.976849 0.81693 -1.33169 -1.02184 0.94693 -1.71601 -1.31674 1.07538 -1.62615 -1.62615 1.12415 -1.47948 -1.47948 1.08374 -2.01646 -1.54728 1.09844 -1.74563 -1.74563 1.13152 -1.83056 -1.83056 1.10261 -1.87615 -1.87615 1.03596 -1.84467 -1.84467 0.793353 -2.1098 -1.61891 0.75184 -2.02033 -1.55025 0.589666 -1.7726 -1.7726 0.624151 -1.89633 -1.4551 0.405803 -1.54798 -1.54798 0.219636 -1.74786 -1.34118 0.206794 -1.28045 -1.28045 -0.219636 -1.05583 -1.05583 -0.624151 -1.06361 -0.816139 -0.75184 -1.0163 -0.779833 -0.886941 -0.983754 -0.983754 -0.793353 -0.952274 -0.952274 -1.03596 -1.45741 -1.11831 -1.07538 -1.34895 -1.34895 -1.08374 -1.84172 -1.4132 -0.94693 -1.85158 -1.85158 -0.81693 -2.00223 -2.00223 -0.701057 -2.21432 -2.21432 -0.46869 -2.20996 -2.20996 -0.192778 -2.21551 -1.70002 -0.135082 -2.02833 -1.5564 -0.0843638 -1.97971 -1.97971 -0.0829553 -1.81443 -1.39226 -0.0404045 -1.58671 -1.21752 -1.42473e-15 -1.41421 -1.41421 -7.42762e-16 -1.61862 -1.61862 -0.0215447 -1.20981 -1.20981 0.0215447 -1.04107 -1.35675 0.00259265 -0.728419 -0.949294 0.030473 -0.610065 -0.795052 0.0654031 -0.526237 -0.685806 0.118763 -0.476536 -0.621034 0.284319 -0.481154 -0.627052 0.191896 -0.61411 -0.61411 0.46869 -0.826195 -0.826195 0.701057 -0.684458 -0.892003 0.645168 -0.809268 -1.05466 0.774727 -1.14362 -1.14362 0.92388 -1.31501 -1.31501 1.01502 -1.35484 -1.76566 1.14135 -1.53129 -1.99562 1.13876 -1.88051 -1.88051 0.932066 -1.67082 -1.67082 0.430459 -1.32369 -1.72507 0.231538 -1.15761 -1.15761 -0.430459 -1.01422 -1.32176 -0.453272 -0.934492 -1.21785 -0.655964 -0.947922 -0.947922 -0.932066 -0.854053 -1.11302 -0.9732 -0.903754 -1.1778 -1.13876 -0.997872 -0.997872 -1.10261 -1.0828 -1.0828 -1.13152 -1.20227 -1.20227 -1.12415 -1.08021 -1.40776 -1.14135 -1.20461 -1.56987 -1.08746 -1.51341 -1.51341 -1.01502 -1.68481 -1.68481 -0.92388 -1.48677 -1.9376 -0.896873 -2.12615 -2.12615 -0.582955 -1.85234 -2.41402 -0.515857 -2.25991 -2.25991 -0.363319 -1.95851 -2.55238 -0.284319 -2.25884 -2.25884 -0.270598 -1.95389 -2.54636 -0.191896 -1.90881 -2.48761 -0.118763 -2.11527 -2.11527 -0.130526 -1.5602 -2.03329 -0.0109834 -1.70663 -2.22412 -0.030473 -1.81089 -1.81089 -0.0477759 -1.21752 -1.58671 -5.76139e-17 -1 -1.73205 0 -0.874846 -1.14012 0.0109834 -0.511513 -0.666617 0.393681 -0.582703 -0.759393 0.515857 -0.462844 -0.801669 0.44655 -0.948275 -1.23582 0.896873 -1.09189 -1.42298 1.00367 -1.23044 -1.60354 1.08746 -1.07522 -1.86233 1.15366 -1.45718 -1.89904 1.15975 -1.57312 -2.05013 1.07647 -1.21992 -2.11296 1.17003 -1.58099 -2.06039 0.9732 -1.55573 -2.02747 0.83147 -1.25 -2.16506 0.866025 -1.26607 -2.19289 1.01017 -1.50055 -1.95556 0.655964 -1.1518 -1.99498 0.474144 -1.21052 -2.09667 0.684967 -1.42083 -1.85166 0.453272 -1.11136 -1.44835 -0.231538 -0.92056 -1.59446 -0.242449 -0.879313 -1.14594 -0.83147 -0.75 -1.29904 -0.866025 -0.733932 -1.27121 -1.01017 -0.861929 -1.12329 -1.07647 -0.977865 -1.27438 -1.15975 -0.841506 -1.45753 -1.18301 -0.924784 -1.60177 -1.15366 -1.02498 -1.77531 -1.08652 -1.34316 -1.75044 -1.00367 -1.25 -2.16506 -0.866025 -1.62578 -2.11876 -0.774727 -1.75059 -2.28141 -0.645168 -1.45799 -2.52531 -0.586516 -1.92353 -2.5068 -0.393681 -1.53716 -2.66243 -0.44655 -1.82498 -2.37836 -0.0654031 -1.5 -2.59808 -2.22045e-15 -1.39398 -1.81667 -0.00259265 -0.655262 -1.58194 -0.0352636 -0.855297 -1.48142 -0.0163705 -0.718789 -1.24498 -0.0258561 -0.459011 -1.10815 -0.0746578 -0.598143 -1.03601 -0.0221398 -0.5 -0.866025 1.16573e-15 -0.429551 -0.744005 0.0442399 -0.328592 -0.793291 -0.030473 -0.390211 -0.675865 0.112372 -0.383404 -0.664074 0.204101 -0.296841 -0.716638 0.0323676 -0.408494 -0.707532 0.316987 -0.542012 -0.938793 0.586516 -0.640067 -1.10863 0.729207 -0.400909 -0.96788 0.525353 -0.472225 -1.14005 0.680564 -0.75 -1.29904 0.866025 -0.864211 -1.49686 0.988026 -0.975025 -1.68879 1.08652 -0.719099 -1.73606 1.08092 -1.15849 -2.00657 1.18301 -0.904042 -2.18255 1.19629 -0.856804 -2.06851 1.20121 -1.25624 -2.17586 1.11237 -0.93322 -2.25299 1.14351 -0.943287 -2.2773 1.04281 -0.909 -2.19452 0.711037 -0.869435 -2.099 0.492985 -1.07944 -1.86965 0.242449 -0.710764 -1.71594 -0.252321 -0.848198 -1.46912 -0.474144 -0.789485 -1.36743 -0.684967 -0.661299 -1.59652 -0.492985 -0.621734 -1.501 -0.711037 -0.587447 -1.41822 -1.04281 -0.743764 -1.28824 -1.11237 -0.78008 -1.35114 -1.17003 -0.597513 -1.44253 -1.14351 -0.736797 -1.77878 -1.16103 -1.13579 -1.96724 -0.988026 -0.977974 -2.36104 -0.83147 -1.35993 -2.35547 -0.729207 -1.59151 -2.75657 -0.316987 -1.24139 -2.99697 -0.12301 -1.6166 -2.80003 -0.204101 -1.60979 -2.78824 -0.112372 -1.57045 -2.7201 -0.0442399 -1.23389 -2.97888 -0.0323676 -1.14723 -2.76966 0.0654031 -1.20214 -2.90223 0.030473 -1.40186 -2.42809 0.0221398 -1.28121 -2.21912 0.0258561 -1.1447 -1.98268 0.0163705 -0.765367 -1.84776 0 -0.443928 -1.65676 -0.0540057 -0.517638 -1.93185 0 -0.551245 -1.33082 -0.0625849 -0.374191 -1.3965 -0.0990458 -0.383503 -0.925858 -0.0654031 -0.261033 -0.974189 -0.130526 -0.200892 -0.749739 -0.0477759 -0.289346 -0.698544 0.12301 -0.305683 -0.737984 0.238936 -0.1943 -0.725137 0.0413911 -0.226879 -0.846723 0.302504 -0.343949 -0.830367 0.37533 -0.552759 -1.33448 0.83147 -0.636932 -1.53769 0.968148 -0.414572 -1.5472 0.944125 -0.793937 -1.91673 1.16103 -0.559013 -2.08627 1.21427 -0.611562 -2.28238 1.16975 -0.620061 -2.3141 1.07098 -0.934623 -2.25638 0.896873 -0.579526 -2.16282 0.509716 -0.81997 -1.97958 0.252321 -0.485059 -1.81027 -0.261112 -0.59611 -1.43914 -0.896873 -0.423714 -1.58132 -1.16975 -0.415216 -1.54961 -1.07098 -0.626692 -1.51297 -1.19629 -0.4443 -1.65815 -1.21743 -0.67393 -1.62701 -1.20121 -0.476263 -1.77744 -1.21427 -0.567161 -2.11667 -1.0707 -0.811635 -1.95946 -1.08092 -0.893802 -2.15783 -0.968148 -0.620705 -2.3165 -0.944125 -1.05851 -2.55547 -0.680564 -0.772496 -2.88299 -0.46194 -1.12982 -2.72764 -0.525353 -1.18678 -2.86515 -0.37533 -1.22505 -2.95753 -0.238936 -0.831914 -3.10474 -0.159861 -1.07172 -2.58737 0.0746578 -0.979489 -2.36469 0.0625849 -0.723127 -2.69875 0.126856 -0.875471 -2.11357 0.0352636 -0.312149 -1.16496 -0.126856 -0.158726 -1.20564 -0.178511 -0.223384 -0.83368 -0.105055 -0.203363 -0.75896 0.159861 -0.097984 -0.744262 -0.0404045 -0.26278 -0.980709 0.46194 -0.11215 -0.851862 0.228382 -0.308282 -1.15053 0.629007 -0.360079 -1.34383 0.793353 -0.201126 -1.5277 0.916059 -0.17499 -1.32918 0.75184 -0.468115 -1.74703 1.0707 -0.517266 -1.93046 1.16342 -0.271508 -2.06231 1.22212 -0.590976 -2.20555 1.21743 -0.298332 -2.26606 1.19098 -0.616684 -2.3015 0.92388 -0.303452 -2.30495 1.09457 -0.602537 -2.2487 0.734063 -0.287845 -2.1864 0.524263 -0.29751 -2.25981 0.753945 -0.550217 -2.05344 0.261112 -0.275218 -2.09049 0.268786 -0.234259 -1.77938 -0.524263 -0.45575 -1.70088 -0.509716 -0.43274 -1.61501 -0.734063 -0.219096 -1.6642 -0.94693 -0.418592 -1.56221 -0.92388 -0.218653 -1.66083 -1.09457 -0.250597 -1.90347 -1.22212 -0.51801 -1.93324 -1.16342 -0.271171 -2.05975 -1.16084 -0.675197 -2.51987 -0.793353 -0.371777 -2.82393 -0.574756 -0.347114 -2.63659 -0.75184 -0.726994 -2.71318 -0.629007 -0.393249 -2.98702 -0.396549 -0.808397 -3.01698 -0.302504 -0.420571 -3.19456 -0.0801021 -0.840976 -3.13857 -0.0413911 -0.834384 -3.11396 0.0477759 -0.811892 -3.03002 0.105055 -0.420042 -3.19054 0.127715 -0.774243 -2.88951 0.130526 -0.408234 -3.10085 0.179188 -0.363379 -2.76013 0.178511 -0.389071 -2.95528 0.19509 -0.661085 -2.4672 0.0990458 -0.591348 -2.20694 0.0540057 -0.297685 -2.26114 0.0725165 -0.332394 -2.52478 0.135082 -0.261052 -1.98289 0 -0.22442 -1.70464 -0.0725165 -5.69646e-15 -2 0 -4.1682e-15 -1.46343 -0.170541 -0.189711 -1.44099 -0.135082 -0.133034 -1.0105 -0.19509 -0.11387 -0.864931 -0.179188 -0.102063 -0.775243 -0.127715 -2.52504e-15 -0.886528 -0.252553 -0.101533 -0.771223 0.0801021 -2.20811e-15 -0.775255 1.66533e-15 -2.41165e-15 -0.846719 0.153281 -0.128856 -0.978755 0.396549 -3.17843e-15 -1.11593 0.518045 -2.74408e-15 -0.963434 0.329459 -0.150328 -1.14185 0.574756 -3.68246e-15 -1.29289 0.707107 -0.22699 -1.72416 1.05589 -5.25988e-15 -1.84672 1.15328 -0.250933 -1.90603 1.16084 -5.69646e-15 -2 1.22474 -0.287566 -2.18428 1.23335 -6.04403e-15 -2.12203 1.244 -6.28635e-15 -2.20711 1.20711 -6.4158e-15 -2.25255 1.11347 -0.303009 -2.30158 0.94693 -6.1822e-15 -2.17054 0.536566 -5.43808e-15 -1.90928 -0.275309 -0.246887 -1.87529 -0.268786 -5.21073e-15 -1.82946 -0.536566 -0.224595 -1.70597 -0.753945 -4.95929e-15 -1.74118 -0.965926 -5.10658e-15 -1.79289 -1.20711 -4.97713e-15 -1.74745 -1.11347 -0.223773 -1.69972 -1.19098 -0.234539 -1.7815 -1.23335 -5.3489e-15 -1.87797 -1.244 -0.295114 -2.24162 -1.05589 -0.320979 -2.43808 -0.916059 -7.17198e-15 -2.51804 -0.88407 -8.2145e-15 -2.88407 -0.518045 -7.71047e-15 -2.70711 -0.707107 -0.409955 -3.11392 -0.228382 -9.18482e-15 -3.22474 -5.55112e-15 -9.23966e-15 -3.244 0.122027 -0.424121 -3.22152 0.0404045 -9.13458e-15 -3.20711 0.207107 -8.86789e-15 -3.11347 0.252553 -6.48061e-15 -2.27531 0.0907167 -7.22473e-15 -2.53657 0.170541 -4.91232e-15 -1.72469 -0.0907167 0.192622 -1.46311 -0.205269 -3.50162e-15 -1.2294 -0.229402 -2.94528e-15 -1.03407 -0.258819 -2.25834e-15 -0.792893 -0.207107 0.105599 -0.802102 -0.285612 -2.15327e-15 -0.756002 -0.122027 0.109533 -0.831984 0.0775251 -4.22095e-15 -1.48196 0.88407 0.186032 -1.41305 0.848295 -4.75809e-15 -1.67054 1.03657 0.231243 -1.75646 1.14079 -6.43364e-15 -2.25882 0.965926 0.284441 -2.16054 1.12761 -6.34985e-15 -2.2294 0.770598 0.284353 -2.15987 0.783952 0.270518 -2.05479 0.280652 -5.95485e-15 -2.09072 0.275309 0.251587 -1.91099 -0.280652 -5.04307e-15 -1.7706 -0.770598 0.235588 -1.78947 -0.980785 0.237664 -1.80523 -1.12761 0.271508 -2.06231 -1.22212 0.255779 -1.94283 -1.24932 -5.69646e-15 -2 -1.22474 -6.13305e-15 -2.15328 -1.15328 0.312812 -2.37605 -1.0128 0.290862 -2.20932 -1.14079 -6.63484e-15 -2.32946 -1.03657 0.336073 -2.55273 -0.848295 0.359187 -2.7283 -0.659346 0.380622 -2.89111 -0.459115 -8.64885e-15 -3.03657 -0.329459 -8.98128e-15 -3.15328 -0.153281 0.420571 -3.19456 0.0801021 -8.44765e-15 -2.96593 0.258819 -7.89131e-15 -2.7706 0.229402 0.384652 -2.92172 0.321439 0.359462 -2.73038 0.27931 0.296136 -2.24938 0.108529 0.261052 -1.98289 0 0.225969 -1.7164 -0.108529 0.450057 -1.67964 -0.125876 0.162643 -1.2354 -0.27931 0.137453 -1.04406 -0.321439 0.27852 -1.03945 -0.382683 0.118182 -0.897684 -0.324837 0.240448 -0.897363 -0.39573 0.100067 -0.760087 -0.203127 0.214885 -0.801963 -0.362894 0.202545 -0.755907 -0.283358 0.101533 -0.771223 -0.0801021 0.203363 -0.75896 -0.159861 0.123231 -0.936029 0.260959 0.141483 -1.07467 0.459115 0.162918 -1.23748 0.659346 0.273281 -1.0199 0.398218 0.209292 -1.58973 1.0128 0.398079 -1.48565 0.984695 0.250597 -1.90347 1.22212 0.439344 -1.63966 1.12341 0.266326 -2.02295 1.24932 0.277723 -2.10951 1.21807 0.530003 -1.978 1.22381 0.551421 -2.05793 0.991445 0.544828 -2.03333 1.13691 0.286517 -2.17631 0.980785 0.550471 -2.05439 0.793948 0.278684 -2.11682 0.546571 0.543273 -2.02752 0.554236 0.492003 -1.83618 -0.554236 0.243421 -1.84896 -0.546571 0.237752 -1.80591 -0.783952 0.484805 -1.80932 -0.793948 0.490448 -1.83038 -1.13691 0.244382 -1.85627 -1.21807 0.528351 -1.97183 -1.24928 0.722973 -2.69817 -0.608761 0.680437 -2.53943 -0.808888 0.398874 -3.02975 -0.260959 0.761996 -2.84381 -0.398218 0.412572 -3.1338 -0.0775251 0.818754 -3.05563 -0.0014367 0.422037 -3.20569 0.203127 0.416506 -3.16368 0.285612 0.794828 -2.96634 0.39573 0.403922 -3.0681 0.324837 0.329482 -2.50267 0.205269 0.585219 -2.18407 0.125876 0.517638 -1.93185 0 0.668808 -1.61465 -0.142684 0.385714 -1.4395 -0.239118 0.493265 -1.19085 -0.37533 0.57671 -1.3923 -0.271943 0.327649 -1.2228 -0.328023 0.366302 -0.884332 -0.464928 0.307567 -0.742532 -0.362374 0.216522 -0.808072 0.0014367 0.24052 -0.897634 0.191342 0.312303 -1.16553 0.608761 0.447177 -1.07958 0.55557 0.354839 -1.32428 0.808888 0.504926 -1.219 0.766017 0.476263 -1.77744 1.21427 0.506925 -1.89187 1.24928 0.75298 -1.81786 1.22432 0.718293 -1.73411 1.2439 0.790396 -1.90818 0.997859 0.778862 -1.88034 0.287717 0.531616 -1.98402 0.284794 0.50366 -1.87969 -0.284794 0.741417 -1.78994 -0.559527 0.740338 -1.78733 -0.997859 0.736797 -1.77878 -0.800545 0.483855 -1.80577 -0.991445 0.753705 -1.81961 -1.14135 0.505273 -1.8857 -1.22381 0.812441 -1.96141 -1.2439 0.559013 -2.08627 -1.21427 0.595932 -2.22405 -1.12341 0.637197 -2.37805 -0.984695 0.966411 -2.33312 -0.952374 1.13586 -2.74221 -0.335617 0.794756 -2.96607 -0.191342 1.20967 -2.92041 0.0746578 0.831914 -3.10474 0.159861 1.22317 -2.95299 0.362374 0.832732 -3.1078 0.283358 0.820391 -3.06174 0.362894 0.756756 -2.82425 0.382683 0.707627 -2.6409 0.328023 0.649562 -2.4242 0.239118 0.765367 -1.84776 0 0.878776 -1.52208 -0.158881 1 -1.73205 0 0.657517 -1.13885 -0.421031 0.566987 -0.982051 -0.5 0.422149 -1.01916 -0.442289 0.327765 -0.791295 -0.438622 0.305683 -0.737984 -0.238936 0.321062 -0.775112 -0.0746578 0.351716 -0.849116 0.120905 0.423172 -0.732955 -0.150433 0.456742 -0.7911 0.0499502 0.394872 -0.953307 0.335617 0.635397 -1.10054 0.719866 0.564323 -1.3624 0.952374 0.621734 -1.501 1.10122 0.67393 -1.62701 1.20121 0.777028 -1.87591 1.14135 1 -1.73205 1 1.01107 -1.75122 0.803714 0.793937 -1.91673 0.800545 0.789317 -1.90558 0.559527 1.01293 -1.75444 0.562422 1.00819 -1.74623 0.289407 0.751872 -1.81518 -0.287717 0.987072 -1.70966 -0.562422 0.991815 -1.71787 -0.289407 0.98893 -1.71288 -0.803714 0.777753 -1.87766 -1.22432 1.05619 -1.82937 -1.21958 0.856804 -2.06851 -1.20121 0.909 -2.19452 -1.10122 1.02581 -2.47652 -0.766017 1.08356 -2.61594 -0.55557 1.3646 -2.36356 -0.719866 1.49401 -2.58771 -0.271579 1.17902 -2.8464 -0.120905 1.54326 -2.673 -0.0499502 1.22505 -2.95753 0.238936 1.58501 -2.74532 0.43984 1.20297 -2.90422 0.438622 1.16443 -2.81119 0.464928 1.10859 -2.67636 0.442289 1.03747 -2.50467 0.37533 0.954024 -2.30322 0.271943 1.12122 -1.94202 0.158881 0.861926 -2.08087 0.142684 0.941588 -1.2271 -0.333964 1.07657 -1.40302 -0.174397 0.762928 -1.32143 -0.303603 0.818197 -1.0663 -0.464928 0.711356 -0.927057 -0.55557 0.494917 -0.857222 -0.532136 0.443814 -0.768708 -0.512472 0.625076 -0.814616 -0.597064 0.524293 -0.683272 -0.515421 0.562207 -0.732683 -0.584127 0.414986 -0.718778 -0.43984 0.408494 -0.707532 -0.316987 0.522714 -0.681215 -0.225563 0.606526 -0.79044 0.206377 0.505987 -0.876395 0.271579 0.566987 -0.982051 0.5 0.745899 -0.972074 0.670633 0.706742 -1.22411 0.915976 0.824769 -1.07486 0.875654 0.776725 -1.34533 1.07431 0.841506 -1.45753 1.18301 0.897949 -1.55529 1.23319 0.943814 -1.63473 1.21958 1.1007 -1.43447 1.20962 1.14522 -1.49249 1.13556 0.97788 -1.69374 1.1409 1.17771 -1.53482 0.997859 1.21084 -1.57799 0.562909 1.22421 -1.59542 -0.562909 1.2191 -1.58876 -0.289858 1.23607 -1.61088 -0.803441 1 -1.73205 -1 1.25734 -1.63859 -0.997859 1.02212 -1.77036 -1.1409 1.10205 -1.90881 -1.23319 1.15849 -2.00657 -1.18301 1.22327 -2.11877 -1.07431 1.29326 -2.23999 -0.915976 1.43301 -2.48205 -0.5 1.7635 -2.29824 -0.442289 1.82852 -2.38297 -0.206377 1.57683 -2.73115 0.150433 1.87952 -2.44944 0.0212183 1.59151 -2.75657 0.316987 1.92353 -2.5068 0.393681 1.55619 -2.69539 0.512472 1.91075 -2.49014 0.515421 1.50508 -2.60688 0.532136 1.43301 -2.48205 0.5 1.34248 -2.32525 0.421031 1.72369 -2.24636 0.55557 1.23707 -2.14267 0.303603 1.35847 -1.7704 0.174397 1.21752 -1.58671 0 1.41421 -1.41421 0 1.10983 -1.10983 -0.362894 0.755143 -0.755143 -0.659436 0.681676 -0.681676 -0.653281 0.511513 -0.666617 -0.393681 0.61411 -0.61411 -0.46869 0.634553 -0.634553 -0.588796 0.555521 -0.723969 -0.0212183 0.696485 -0.696485 0.140292 0.671541 -0.87517 0.442289 0.903489 -1.17745 1.04281 0.977865 -1.27438 1.15975 1.04444 -1.36114 1.2172 1.2779 -1.2779 1.12536 1.19897 -1.56253 0.803441 1.38043 -1.38043 0.560986 1.21594 -1.58465 0.289858 1.448 -1.448 -0.560986 1.42945 -1.42945 -0.289068 1.47287 -1.47287 -0.799728 1.55053 -1.55053 -1.12536 1.50651 -1.50651 -0.991445 1.28982 -1.68093 -1.13556 1.33434 -1.73895 -1.20962 1.39061 -1.81227 -1.2172 1.60556 -1.60556 -1.19448 1.45718 -1.89904 -1.15975 1.67112 -1.67112 -1.196 1.53156 -1.99596 -1.04281 1.74563 -1.74563 -1.13152 1.90994 -1.90994 -0.831584 1.61028 -2.09855 -0.875654 1.68915 -2.20134 -0.670633 1.99187 -1.99187 -0.618527 2.13194 -2.13194 -0.140292 1.91233 -2.4922 0.225563 2.18053 -2.18053 0.092296 2.21432 -2.21432 0.46869 2.20911 -2.20911 0.299728 2.19387 -2.19387 0.588796 1.87284 -2.44073 0.584127 1.80997 -2.3588 0.597064 1.61685 -2.10712 0.464928 1.49346 -1.94631 0.333964 1.85556 -1.85556 0.506835 1.56952 -1.56952 0.189167 1.25891 -1.25891 -0.189167 1.42265 -1.09163 -0.203127 1.11889 -0.858557 -0.546571 0.972872 -0.972872 -0.506835 0.853228 -0.853228 -0.608761 0.990232 -0.759832 -0.659346 0.744374 -0.571178 -0.659649 0.800478 -0.614228 -0.719638 0.619318 -0.619318 -0.299728 0.733547 -0.562871 -0.162978 0.647893 -0.647893 -0.092296 0.760932 -0.760932 0.382683 0.775881 -0.595354 0.073606 0.836557 -0.836557 0.618527 0.835456 -0.641068 0.321439 0.918491 -0.918491 0.831584 1.002 -1.002 1.00683 0.988562 -0.758551 0.783952 1.0828 -1.0828 1.13152 1.15695 -0.887762 1.09844 1.07296 -0.823315 0.966552 1.15731 -1.15731 1.196 1.22287 -1.22287 1.19448 1.3757 -1.05561 1.11034 1.32192 -1.32192 0.991445 1.47954 -1.13529 0.79259 1.43193 -1.09876 0.980785 1.35556 -1.35556 0.799728 1.51978 -1.16617 0.55666 1.39898 -1.39898 0.289068 1.65364 -1.26888 -0.55666 1.61876 -1.24212 -0.28704 1.79771 -1.37943 -1.11034 1.86291 -1.42946 -1.17422 1.82643 -1.82643 -1.00683 2.0675 -2.0675 -0.382683 2.33796 -1.79398 -0.321439 2.43987 -1.87218 0.162978 2.46109 -1.88846 0.372609 2.14675 -2.14675 0.653281 2.07328 -2.07328 0.659436 2.29036 -1.75746 0.718984 1.9752 -1.9752 0.608761 2.05452 -1.57649 0.546571 1.71859 -1.71859 0.362894 1.58671 -1.21752 0 1.73205 -1 0 1.26476 -0.970485 -0.39027 0.883049 -0.677587 -0.718984 1.00631 -0.580991 -0.775454 1.11968 -0.646447 -0.707107 0.916401 -0.529084 -0.782913 0.715255 -0.548835 -0.541691 0.712319 -0.546582 -0.372609 0.800717 -0.462294 -0.443895 0.907886 -0.696646 0.563773 1.03611 -0.598198 0.732963 1.20172 -0.693814 1.06066 1.1177 -0.645307 0.92213 1.23703 -0.949203 1.16968 1.31051 -1.00559 1.17422 1.43932 -0.830991 1.09057 1.55465 -1.19293 0.28704 1.68088 -0.970454 0.283783 1.69387 -1.29976 -0.79259 1.74148 -1.33629 -0.980785 1.89368 -1.09332 -0.782058 2.02478 -1.16901 -1.09057 2.1792 -1.25816 -1.13835 1.93639 -1.48584 -1.16968 2.01646 -1.54728 -1.09844 2.10045 -1.61173 -0.966552 2.42799 -1.4018 -0.732963 2.3464 -1.35469 -0.92213 2.18485 -1.6765 -0.783952 2.26553 -1.7384 -0.563773 2.5034 -1.44534 -0.506605 2.39753 -1.83969 -0.073606 2.56857 -1.48296 -0.258819 2.65214 -1.53121 0.232963 2.45816 -1.88621 0.541691 2.42904 -1.86387 0.659649 2.37294 -1.82082 0.719638 2.34442 -1.35355 0.707107 2.18318 -1.67521 0.659346 1.90865 -1.46456 0.39027 1.75077 -1.34341 0.203127 1.56485 -0.903467 -0.216217 1.84776 -0.765367 0 1.40347 -0.810295 -0.415976 1.68284 -0.697054 -0.228382 1.25344 -0.723672 -0.583967 1.2386 -0.513046 -0.75184 1.37355 -0.568943 -0.618862 1.02679 -0.42531 -0.842836 0.851891 -0.49184 -0.727678 0.813492 -0.46967 -0.612372 0.883158 -0.365816 -0.51328 0.811966 -0.468789 -0.232963 0.882387 -0.365497 -0.30195 0.844678 -0.487675 0.00660481 0.941632 -0.390037 0.19509 0.895535 -0.517037 0.258819 0.960704 -0.554663 0.506605 1.13806 -0.471398 0.87376 1.21912 -0.504977 1.01834 1.2849 -0.74184 1.13835 1.36469 -0.787903 1.14894 1.30298 -0.539711 1.10214 1.50791 -0.87059 0.965926 1.57042 -0.906684 0.782058 1.62762 -0.939705 0.54995 1.77614 -0.735699 0.27931 1.78323 -1.02955 -0.283783 1.83649 -1.0603 -0.54995 1.99216 -0.825181 -0.540886 2.06707 -0.856208 -0.768178 1.95619 -1.12941 -0.965926 2.14473 -0.888376 -0.94693 2.22528 -0.92174 -1.06613 2.09941 -1.2121 -1.14894 2.39254 -0.991022 -1.10214 2.26238 -1.30619 -1.06066 2.63289 -1.09058 -0.678835 2.61942 -1.51232 -0.00660481 2.79278 -1.15681 0.0604246 2.66338 -1.53771 0.443895 2.81313 -1.16524 0.30195 2.65061 -1.53033 0.612372 2.61221 -1.50816 0.727678 2.74074 -1.13525 0.79259 2.5477 -1.47092 0.782913 2.4578 -1.41901 0.775454 2.57347 -1.06597 0.828602 2.32197 -0.961791 0.618862 2.21067 -1.27633 0.583967 2.06063 -1.1897 0.415976 1.89925 -1.09653 0.216217 2.01268 -0.83368 0.228382 1.93185 -0.517638 0 1.62095 -0.434333 -0.46194 1.52312 -0.630895 -0.4399 1.47622 -0.395552 -0.651107 1.34383 -0.360079 -0.793353 1.12205 -0.464766 -0.828602 1.22708 -0.328795 -0.878203 1.1286 -0.302408 -0.899149 0.954781 -0.395483 -0.79259 0.906937 -0.375666 -0.680432 0.993305 -0.266155 -0.745577 0.902734 -0.373925 -0.0604246 0.949751 -0.254485 -0.127195 0.996033 -0.41257 0.447267 1.06263 -0.440155 0.678835 1.38727 -0.574626 1.11873 1.47024 -0.608994 1.06613 1.55079 -0.642357 0.94693 1.65452 -0.443328 0.751008 1.56221 -0.418592 0.92388 1.62845 -0.674525 0.768178 1.70336 -0.705553 0.540886 1.74703 -0.468115 0.529505 1.91938 -0.795034 -0.27931 2.3015 -0.616684 -0.92388 2.39306 -0.641218 -1.03712 2.30825 -0.956108 -1.11873 2.48294 -0.665302 -1.08374 2.4764 -1.02576 -1.01834 2.72747 -0.730822 -0.821648 2.55746 -1.05934 -0.87376 2.69948 -1.11816 -0.447267 2.84869 -0.763304 -0.386014 2.79384 -0.748608 -0.621801 2.88951 -0.774243 -0.130526 2.75389 -1.1407 -0.19509 2.91992 -0.782391 0.369644 2.81236 -1.16492 0.51328 2.78858 -1.15507 0.680432 2.8704 -0.769121 0.745577 2.7351 -0.732868 0.899149 2.66873 -1.10542 0.842836 2.51987 -0.675197 0.793353 2.45692 -1.01769 0.75184 2.38748 -0.639724 0.651107 2.1724 -0.899838 0.4399 1.77422 -0.475401 -0.239568 1.83697 -0.241842 -0.249728 1.98289 -0.261052 0 1.69441 -0.223074 -0.482002 1.55844 -0.205173 -0.680564 1.31799 -0.173517 -0.924043 1.0503 -0.281428 -0.854109 0.957936 -0.256678 -0.580467 1.02302 -0.134684 -0.645168 0.943782 -0.252886 -0.369644 0.994856 -0.130975 -0.435755 0.974189 -0.261033 0.130526 1.01501 -0.271972 0.386014 0.993568 -0.130806 0.0654031 1.06986 -0.286668 0.621801 1.0597 -0.139512 0.562104 1.13624 -0.304454 0.821648 1.11473 -0.146757 0.766017 1.21168 -0.324668 0.971655 1.18227 -0.155649 0.920812 1.29387 -0.346691 1.06122 1.26064 -0.165967 1.01575 1.38076 -0.369974 1.08374 1.47065 -0.394059 1.03712 1.83948 -0.492888 0.273642 1.75926 -0.23161 0.515857 2.02422 -0.542388 -0.273642 2.09524 -0.275844 -0.266802 2.11667 -0.567161 -0.529505 2.20652 -0.290494 -0.515857 2.20918 -0.591949 -0.751008 2.56983 -0.688585 -1.06122 2.70514 -0.356138 -1.01575 2.6176 -0.344614 -1.04411 2.65202 -0.710608 -0.971655 2.85105 -0.375348 -0.766017 2.90608 -0.382593 -0.562104 2.97221 -0.391299 -0.0654031 2.91395 -0.780791 0.127195 2.97092 -0.391129 0.435755 2.90577 -0.778598 0.580467 2.94276 -0.387421 0.645168 2.8134 -0.753848 0.854109 2.74729 -0.361688 0.951612 2.63662 -0.706481 0.878203 2.27137 -0.299031 0.482002 2.40734 -0.316932 0.680564 2.24275 -0.600944 0.46194 2.08948 -0.559875 0.239568 2.1288 -0.280262 0.249728 1.86947 -8.76002e-15 -0.258819 2 -9.37164e-15 0 1.61732 -7.57846e-15 -0.707107 1.74118 -8.15886e-15 -0.5 1.43207 -0.188536 -0.83147 1.5 -7.02873e-15 -0.866025 1.39124 -6.5191e-15 -0.965926 1.21849 -0.160417 -0.951612 1.29289 -6.05827e-15 -1 1.13537 -0.149475 -0.91197 1.13397 -5.3136e-15 -0.866025 1.20665 -5.65413e-15 -0.965926 1.06996 -0.140862 -0.80753 1.03407 -4.84549e-15 -0.5 1.07612 -5.04251e-15 -0.707107 0.985249 -0.12971 -0.193421 1.00856 -4.72591e-15 -0.258819 1 -4.68582e-15 2.66454e-15 1.00856 -4.72591e-15 0.258819 1.01881 -0.134129 0.323108 1.03407 -4.84549e-15 0.5 1.07612 -5.04251e-15 0.707107 1.13397 -5.3136e-15 0.866025 1.29289 -6.05827e-15 1 1.20665 -5.65413e-15 0.965926 1.34818 -0.177491 1.04411 1.44326 -0.190009 1.00367 1.54438 -0.203322 0.896873 1.5 -7.02873e-15 0.866025 1.39124 -6.5191e-15 0.965926 1.65014 -0.217246 0.730622 1.61732 -7.57846e-15 0.707107 1.87054 -0.246261 0.266802 1.74118 -8.15886e-15 0.5 1.86947 -8.76002e-15 0.258819 2.13053 -9.98327e-15 -0.258819 2.31564 -0.304859 -0.730622 2.25882 -1.05844e-14 -0.5 2.42139 -0.318783 -0.896873 2.5 -1.17146e-14 -0.866025 2.38268 -1.11648e-14 -0.707107 2.52252 -0.332096 -1.00367 2.70711 -1.2685e-14 -1 2.60876 -1.22242e-14 -0.965926 2.79335 -1.30892e-14 -0.965926 2.78351 -0.366456 -0.920812 2.86603 -1.34297e-14 -0.866025 2.96593 -1.38978e-14 -0.5 2.92388 -1.37008e-14 -0.707107 2.94697 -0.387975 -0.323108 3 -1.40575e-14 -8.03938e-15 2.99144 -1.40174e-14 -0.258819 2.98053 -0.392394 0.193421 2.99144 -1.40174e-14 0.258819 2.96593 -1.38978e-14 0.5 2.89582 -0.381242 0.80753 2.86603 -1.34297e-14 0.866025 2.92388 -1.37008e-14 0.707107 2.83041 -0.37263 0.91197 2.79335 -1.30892e-14 0.965926 2.70711 -1.2685e-14 1 2.64778 -0.348588 0.924043 2.53371 -0.333569 0.83147 2.5 -1.17146e-14 0.866025 2.60876 -1.22242e-14 0.965926 2.38268 -1.11648e-14 0.707107 2.13053 -9.98327e-15 0.258819 2.25882 -1.05844e-14 0.5 4 2189 2254 22 69 4 2254 2255 25 22 4 2255 2253 26 25 4 2253 2251 0 26 4 2251 2252 27 0 4 2252 2248 28 27 4 2248 2247 29 28 4 2247 2244 31 29 4 2244 2245 1 31 4 2245 2242 34 1 4 2242 2241 35 34 4 2241 2238 2 35 4 2238 2239 3 2 4 2239 2235 38 3 4 2235 2236 4 38 4 2236 2234 5 4 4 2234 2232 40 5 4 2232 2230 6 40 4 2230 2231 41 6 4 2231 2227 7 41 4 2227 2228 8 7 4 2228 2225 9 8 4 2225 2223 45 9 4 2223 2189 69 45 4 2189 2222 47 69 4 2222 2221 10 47 4 2221 2219 11 10 4 2219 2216 50 11 4 2216 2217 12 50 4 2217 2211 13 12 4 2211 2212 51 13 4 2212 2210 14 51 4 2210 2209 53 14 4 2209 2208 15 53 4 2208 2206 56 15 4 2206 2205 57 56 4 2205 2204 16 57 4 2204 2201 17 16 4 2201 2202 61 17 4 2202 2198 62 61 4 2198 2199 18 62 4 2199 2196 19 18 4 2196 2194 20 19 4 2194 2193 21 20 4 2193 2190 66 21 4 2190 2191 67 66 4 2191 2188 68 67 4 2188 2189 69 68 4 69 22 24 70 4 22 25 23 24 4 25 26 73 23 4 26 0 74 73 4 0 27 77 74 4 27 28 30 77 4 28 29 80 30 4 29 31 82 80 4 31 1 32 82 4 1 34 33 32 4 34 35 84 33 4 35 2 37 84 4 2 3 36 37 4 3 38 87 36 4 38 4 89 87 4 4 5 39 89 4 5 40 90 39 4 40 6 42 90 4 6 41 92 42 4 41 7 93 92 4 7 8 94 93 4 8 9 43 94 4 9 45 44 43 4 45 69 70 44 4 69 47 46 70 4 47 10 48 46 4 10 11 49 48 4 11 50 99 49 4 50 12 101 99 4 12 13 102 101 4 13 51 104 102 4 51 14 52 104 4 14 53 54 52 4 53 15 55 54 4 15 56 105 55 4 56 57 58 105 4 57 16 59 58 4 16 17 60 59 4 17 61 107 60 4 61 62 63 107 4 62 18 109 63 4 18 19 64 109 4 19 20 110 64 4 20 21 111 110 4 21 66 65 111 4 66 67 113 65 4 67 68 114 113 4 68 69 70 114 4 70 24 71 116 4 24 23 72 71 4 23 73 76 72 4 73 74 75 76 4 74 77 78 75 4 77 30 121 78 4 30 80 79 121 4 80 82 81 79 4 82 32 123 81 4 32 33 83 123 4 33 84 86 83 4 84 37 85 86 4 37 36 126 85 4 36 87 129 126 4 87 89 88 129 4 89 39 131 88 4 39 90 132 131 4 90 42 91 132 4 42 92 133 91 4 92 93 135 133 4 93 94 136 135 4 94 43 95 136 4 43 44 96 95 4 44 70 116 96 4 70 46 97 116 4 46 48 140 97 4 48 49 98 140 4 49 99 141 98 4 99 101 100 141 4 101 102 143 100 4 102 104 103 143 4 104 52 144 103 4 52 54 146 144 4 54 55 147 146 4 55 105 106 147 4 105 58 149 106 4 58 59 150 149 4 59 60 151 150 4 60 107 153 151 4 107 63 108 153 4 63 109 156 108 4 109 64 158 156 4 64 110 112 158 4 110 111 159 112 4 111 65 160 159 4 65 113 115 160 4 113 114 162 115 4 114 70 116 162 4 116 71 118 211 4 71 72 117 118 4 72 76 119 117 4 76 75 120 119 4 75 78 122 120 4 78 121 167 122 4 121 79 169 167 4 79 81 171 169 4 81 123 124 171 4 123 83 125 124 4 83 86 173 125 4 86 85 128 173 4 85 126 127 128 4 126 129 175 127 4 129 88 177 175 4 88 131 130 177 4 131 132 180 130 4 132 91 182 180 4 91 133 134 182 4 133 135 184 134 4 135 136 137 184 4 136 95 138 137 4 95 96 188 138 4 96 116 211 188 4 116 97 139 211 4 97 140 189 139 4 140 98 191 189 4 98 141 192 191 4 141 100 142 192 4 100 143 193 142 4 143 103 145 193 4 103 144 195 145 4 144 146 196 195 4 146 147 198 196 4 147 106 148 198 4 106 149 199 148 4 149 150 200 199 4 150 151 201 200 4 151 153 152 201 4 153 108 154 152 4 108 156 155 154 4 156 158 157 155 4 158 112 205 157 4 112 159 208 205 4 159 160 210 208 4 160 115 161 210 4 115 162 163 161 4 162 116 211 163 4 211 118 164 212 4 118 117 165 164 4 117 119 214 165 4 119 120 166 214 4 120 122 217 166 4 122 167 218 217 4 167 169 168 218 4 169 171 170 168 4 171 124 172 170 4 124 125 220 172 4 125 173 222 220 4 173 128 174 222 4 128 127 176 174 4 127 175 178 176 4 175 177 224 178 4 177 130 179 224 4 130 180 225 179 4 180 182 181 225 4 182 134 183 181 4 134 184 228 183 4 184 137 185 228 4 137 138 187 185 4 138 188 186 187 4 188 211 212 186 4 211 139 190 212 4 139 189 231 190 4 189 191 232 231 4 191 192 234 232 4 192 142 236 234 4 142 193 194 236 4 193 145 240 194 4 145 195 197 240 4 195 196 243 197 4 196 198 244 243 4 198 148 245 244 4 148 199 246 245 4 199 200 248 246 4 200 201 202 248 4 201 152 249 202 4 152 154 203 249 4 154 155 204 203 4 155 157 206 204 4 157 205 252 206 4 205 208 207 252 4 208 210 209 207 4 210 161 255 209 4 161 163 257 255 4 163 211 212 257 4 212 164 213 258 4 164 165 215 213 4 165 214 260 215 4 214 166 262 260 4 166 217 216 262 4 217 218 264 216 4 218 168 265 264 4 168 170 219 265 4 170 172 266 219 4 172 220 221 266 4 220 222 268 221 4 222 174 270 268 4 174 176 271 270 4 176 178 223 271 4 178 224 272 223 4 224 179 273 272 4 179 225 226 273 4 225 181 227 226 4 181 183 276 227 4 183 228 277 276 4 228 185 229 277 4 185 187 230 229 4 187 186 280 230 4 186 212 258 280 4 212 190 281 258 4 190 231 282 281 4 231 232 233 282 4 232 234 235 233 4 234 236 238 235 4 236 194 237 238 4 194 240 239 237 4 240 197 241 239 4 197 243 242 241 4 243 244 286 242 4 244 245 247 286 4 245 246 289 247 4 246 248 291 289 4 248 202 292 291 4 202 249 250 292 4 249 203 251 250 4 203 204 296 251 4 204 206 253 296 4 206 252 297 253 4 252 207 254 297 4 207 209 256 254 4 209 255 302 256 4 255 257 303 302 4 257 212 258 303 4 258 213 305 350 4 213 215 259 305 4 215 260 261 259 4 260 262 309 261 4 262 216 310 309 4 216 264 263 310 4 264 265 313 263 4 265 219 314 313 4 219 266 267 314 4 266 221 269 267 4 221 268 318 269 4 268 270 320 318 4 270 271 321 320 4 271 223 322 321 4 223 272 323 322 4 272 273 274 323 4 273 226 275 274 4 226 227 324 275 4 227 276 325 324 4 276 277 326 325 4 277 229 278 326 4 229 230 279 278 4 230 280 329 279 4 280 258 350 329 4 258 281 283 350 4 281 282 331 283 4 282 233 332 331 4 233 235 333 332 4 235 238 285 333 4 238 237 284 285 4 237 239 336 284 4 239 241 337 336 4 241 242 288 337 4 242 286 287 288 4 286 247 340 287 4 247 289 290 340 4 289 291 341 290 4 291 292 293 341 4 292 250 295 293 4 250 251 294 295 4 251 296 344 294 4 296 253 298 344 4 253 297 346 298 4 297 254 300 346 4 254 256 299 300 4 256 302 301 299 4 302 303 304 301 4 303 258 350 304 4 350 305 306 399 4 305 259 308 306 4 259 261 307 308 4 261 309 311 307 4 309 310 351 311 4 310 263 353 351 4 263 313 312 353 4 313 314 315 312 4 314 267 317 315 4 267 269 316 317 4 269 318 319 316 4 318 320 359 319 4 320 321 360 359 4 321 322 362 360 4 322 323 363 362 4 323 274 364 363 4 274 275 366 364 4 275 324 368 366 4 324 325 369 368 4 325 326 371 369 4 326 278 327 371 4 278 279 328 327 4 279 329 372 328 4 329 350 399 372 4 350 283 373 399 4 283 331 330 373 4 331 332 334 330 4 332 333 375 334 4 333 285 377 375 4 285 284 335 377 4 284 336 379 335 4 336 337 338 379 4 337 288 380 338 4 288 287 339 380 4 287 340 384 339 4 340 290 385 384 4 290 341 387 385 4 341 293 343 387 4 293 295 342 343 4 295 294 390 342 4 294 344 345 390 4 344 298 392 345 4 298 346 347 392 4 346 300 395 347 4 300 299 397 395 4 299 301 349 397 4 301 304 348 349 4 304 350 399 348 4 399 306 401 400 4 306 308 403 401 4 308 307 404 403 4 307 311 405 404 4 311 351 352 405 4 351 353 354 352 4 353 312 355 354 4 312 315 407 355 4 315 317 356 407 4 317 316 357 356 4 316 319 358 357 4 319 359 410 358 4 359 360 361 410 4 360 362 411 361 4 362 363 365 411 4 363 364 412 365 4 364 366 367 412 4 366 368 414 367 4 368 369 370 414 4 369 371 418 370 4 371 327 419 418 4 327 328 420 419 4 328 372 422 420 4 372 399 400 422 4 399 373 423 400 4 373 330 374 423 4 330 334 376 374 4 334 375 424 376 4 375 377 378 424 4 377 335 427 378 4 335 379 428 427 4 379 338 382 428 4 338 380 381 382 4 380 339 383 381 4 339 384 386 383 4 384 385 431 386 4 385 387 388 431 4 387 343 389 388 4 343 342 391 389 4 342 390 435 391 4 390 345 393 435 4 345 392 437 393 4 392 347 394 437 4 347 395 396 394 4 395 397 440 396 4 397 349 398 440 4 349 348 442 398 4 348 399 400 442 4 400 401 402 491 4 401 403 444 402 4 403 404 445 444 4 404 405 406 445 4 405 352 447 406 4 352 354 450 447 4 354 355 408 450 4 355 407 451 408 4 407 356 452 451 4 356 357 453 452 4 357 358 409 453 4 358 410 456 409 4 410 361 459 456 4 361 411 460 459 4 411 365 413 460 4 365 412 464 413 4 412 367 415 464 4 367 414 417 415 4 414 370 416 417 4 370 418 465 416 4 418 419 467 465 4 419 420 469 467 4 420 422 421 469 4 422 400 491 421 4 400 423 472 491 4 423 374 473 472 4 374 376 425 473 4 376 424 475 425 4 424 378 426 475 4 378 427 477 426 4 427 428 478 477 4 428 382 479 478 4 382 381 429 479 4 381 383 481 429 4 383 386 430 481 4 386 431 482 430 4 431 388 433 482 4 388 389 432 433 4 389 391 434 432 4 391 435 436 434 4 435 393 485 436 4 393 437 486 485 4 437 394 438 486 4 394 396 439 438 4 396 440 441 439 4 440 398 490 441 4 398 442 443 490 4 442 400 491 443 4 491 402 493 541 4 402 444 494 493 4 444 445 495 494 4 445 406 446 495 4 406 447 448 446 4 447 450 449 448 4 450 408 496 449 4 408 451 497 496 4 451 452 454 497 4 452 453 501 454 4 453 409 455 501 4 409 456 458 455 4 456 459 457 458 4 459 460 461 457 4 460 413 462 461 4 413 464 463 462 4 464 415 509 463 4 415 417 510 509 4 417 416 466 510 4 416 465 512 466 4 465 467 468 512 4 467 469 514 468 4 469 421 470 514 4 421 491 541 470 4 491 472 471 541 4 472 473 516 471 4 473 425 474 516 4 425 475 476 474 4 475 426 520 476 4 426 477 521 520 4 477 478 522 521 4 478 479 523 522 4 479 429 525 523 4 429 481 480 525 4 481 430 527 480 4 430 482 483 527 4 482 433 484 483 4 433 432 529 484 4 432 434 531 529 4 434 436 532 531 4 436 485 534 532 4 485 486 487 534 4 486 438 535 487 4 438 439 537 535 4 439 441 489 537 4 441 490 488 489 4 490 443 492 488 4 443 491 541 492 4 541 493 542 585 4 493 494 543 542 4 494 495 546 543 4 495 446 549 546 4 446 448 550 549 4 448 449 552 550 4 449 496 553 552 4 496 497 498 553 4 497 454 499 498 4 454 501 500 499 4 501 455 503 500 4 455 458 502 503 4 458 457 504 502 4 457 461 506 504 4 461 462 505 506 4 462 463 507 505 4 463 509 508 507 4 509 510 559 508 4 510 466 511 559 4 466 512 513 511 4 512 468 561 513 4 468 514 562 561 4 514 470 515 562 4 470 541 585 515 4 541 471 564 585 4 471 516 518 564 4 516 474 517 518 4 474 476 519 517 4 476 520 568 519 4 520 521 569 568 4 521 522 570 569 4 522 523 571 570 4 523 525 524 571 4 525 480 572 524 4 480 527 526 572 4 527 483 528 526 4 483 484 530 528 4 484 529 576 530 4 529 531 577 576 4 531 532 533 577 4 532 534 579 533 4 534 487 580 579 4 487 535 536 580 4 535 537 582 536 4 537 489 538 582 4 489 488 540 538 4 488 492 539 540 4 492 541 585 539 4 585 542 545 586 4 542 543 544 545 4 543 546 548 544 4 546 549 547 548 4 549 550 551 547 4 550 552 591 551 4 552 553 592 591 4 553 498 593 592 4 498 499 594 593 4 499 500 554 594 4 500 503 597 554 4 503 502 555 597 4 502 504 556 555 4 504 506 557 556 4 506 505 600 557 4 505 507 601 600 4 507 508 603 601 4 508 559 558 603 4 559 511 604 558 4 511 513 560 604 4 513 561 606 560 4 561 562 607 606 4 562 515 609 607 4 515 585 586 609 4 585 564 563 586 4 564 518 611 563 4 518 517 566 611 4 517 519 565 566 4 519 568 567 565 4 568 569 613 567 4 569 570 615 613 4 570 571 617 615 4 571 524 573 617 4 524 572 618 573 4 572 526 574 618 4 526 528 575 574 4 528 530 619 575 4 530 576 622 619 4 576 577 623 622 4 577 533 624 623 4 533 579 578 624 4 579 580 628 578 4 580 536 581 628 4 536 582 583 581 4 582 538 630 583 4 538 540 584 630 4 540 539 587 584 4 539 585 586 587 4 586 545 588 632 4 545 544 634 588 4 544 548 589 634 4 548 547 590 589 4 547 551 637 590 4 551 591 640 637 4 591 592 641 640 4 592 593 596 641 4 593 594 595 596 4 594 554 643 595 4 554 597 598 643 4 597 555 599 598 4 555 556 647 599 4 556 557 649 647 4 557 600 650 649 4 600 601 602 650 4 601 603 652 602 4 603 558 653 652 4 558 604 605 653 4 604 560 655 605 4 560 606 608 655 4 606 607 657 608 4 607 609 610 657 4 609 586 632 610 4 586 563 659 632 4 563 611 661 659 4 611 566 612 661 4 566 565 662 612 4 565 567 663 662 4 567 613 614 663 4 613 615 616 614 4 615 617 665 616 4 617 573 666 665 4 573 618 668 666 4 618 574 670 668 4 574 575 671 670 4 575 619 620 671 4 619 622 621 620 4 622 623 625 621 4 623 624 626 625 4 624 578 627 626 4 578 628 675 627 4 628 581 676 675 4 581 583 678 676 4 583 630 629 678 4 630 584 631 629 4 584 587 633 631 4 587 586 632 633 4 632 588 681 726 4 588 634 635 681 4 634 589 682 635 4 589 590 636 682 4 590 637 639 636 4 637 640 638 639 4 640 641 686 638 4 641 596 642 686 4 596 595 688 642 4 595 643 644 688 4 643 598 646 644 4 598 599 645 646 4 599 647 648 645 4 647 649 693 648 4 649 650 694 693 4 650 602 651 694 4 602 652 695 651 4 652 653 697 695 4 653 605 654 697 4 605 655 701 654 4 655 608 656 701 4 608 657 702 656 4 657 610 658 702 4 610 632 726 658 4 632 659 660 726 4 659 661 704 660 4 661 612 705 704 4 612 662 708 705 4 662 663 709 708 4 663 614 664 709 4 614 616 711 664 4 616 665 712 711 4 665 666 667 712 4 666 668 669 667 4 668 670 714 669 4 670 671 716 714 4 671 620 672 716 4 620 621 718 672 4 621 625 673 718 4 625 626 674 673 4 626 627 720 674 4 627 675 677 720 4 675 676 721 677 4 676 678 679 721 4 678 629 724 679 4 629 631 725 724 4 631 633 680 725 4 633 632 726 680 4 726 681 728 775 4 681 635 683 728 4 635 682 684 683 4 682 636 685 684 4 636 639 731 685 4 639 638 734 731 4 638 686 736 734 4 686 642 687 736 4 642 688 737 687 4 688 644 689 737 4 644 646 690 689 4 646 645 692 690 4 645 648 691 692 4 648 693 742 691 4 693 694 744 742 4 694 651 696 744 4 651 695 745 696 4 695 697 698 745 4 697 654 699 698 4 654 701 700 699 4 701 656 749 700 4 656 702 703 749 4 702 658 751 703 4 658 726 775 751 4 726 660 752 775 4 660 704 707 752 4 704 705 706 707 4 705 708 710 706 4 708 709 755 710 4 709 664 756 755 4 664 711 758 756 4 711 712 713 758 4 712 667 760 713 4 667 669 762 760 4 669 714 715 762 4 714 716 763 715 4 716 672 717 763 4 672 718 765 717 4 718 673 767 765 4 673 674 719 767 4 674 720 769 719 4 720 677 770 769 4 677 721 723 770 4 721 679 722 723 4 679 724 771 722 4 724 725 773 771 4 725 680 727 773 4 680 726 775 727 4 775 728 776 820 4 728 683 729 776 4 683 684 730 729 4 684 685 732 730 4 685 731 733 732 4 731 734 778 733 4 734 736 735 778 4 736 687 781 735 4 687 737 739 781 4 737 689 738 739 4 689 690 784 738 4 690 692 740 784 4 692 691 741 740 4 691 742 786 741 4 742 744 743 786 4 744 696 746 743 4 696 745 789 746 4 745 698 791 789 4 698 699 747 791 4 699 700 748 747 4 700 749 795 748 4 749 703 796 795 4 703 751 750 796 4 751 775 820 750 4 775 752 797 820 4 752 707 754 797 4 707 706 753 754 4 706 710 798 753 4 710 755 757 798 4 755 756 799 757 4 756 758 759 799 4 758 713 801 759 4 713 760 761 801 4 760 762 802 761 4 762 715 805 802 4 715 763 764 805 4 763 717 766 764 4 717 765 806 766 4 765 767 768 806 4 767 719 809 768 4 719 769 810 809 4 769 770 813 810 4 770 723 815 813 4 723 722 772 815 4 722 771 817 772 4 771 773 774 817 4 773 727 819 774 4 727 775 820 819 4 820 776 821 868 4 776 729 823 821 4 729 730 824 823 4 730 732 777 824 4 732 733 780 777 4 733 778 779 780 4 778 735 826 779 4 735 781 782 826 4 781 739 783 782 4 739 738 829 783 4 738 784 785 829 4 784 740 832 785 4 740 741 833 832 4 741 786 788 833 4 786 743 787 788 4 743 746 836 787 4 746 789 790 836 4 789 791 792 790 4 791 747 794 792 4 747 748 793 794 4 748 795 839 793 4 795 796 841 839 4 796 750 842 841 4 750 820 868 842 4 820 797 845 868 4 797 754 846 845 4 754 753 847 846 4 753 798 848 847 4 798 757 850 848 4 757 799 800 850 4 799 759 852 800 4 759 801 855 852 4 801 761 803 855 4 761 802 804 803 4 802 805 856 804 4 805 764 857 856 4 764 766 807 857 4 766 806 860 807 4 806 768 808 860 4 768 809 862 808 4 809 810 812 862 4 810 813 811 812 4 813 815 814 811 4 815 772 816 814 4 772 817 865 816 4 817 774 867 865 4 774 819 818 867 4 819 820 868 818 4 868 821 869 923 4 821 823 822 869 4 823 824 872 822 4 824 777 873 872 4 777 780 825 873 4 780 779 875 825 4 779 826 827 875 4 826 782 828 827 4 782 783 879 828 4 783 829 831 879 4 829 785 830 831 4 785 832 884 830 4 832 833 835 884 4 833 788 834 835 4 788 787 885 834 4 787 836 886 885 4 836 790 837 886 4 790 792 889 837 4 792 794 838 889 4 794 793 891 838 4 793 839 840 891 4 839 841 844 840 4 841 842 843 844 4 842 868 923 843 4 868 845 896 923 4 845 846 897 896 4 846 847 849 897 4 847 848 899 849 4 848 850 851 899 4 850 800 900 851 4 800 852 854 900 4 852 855 853 854 4 855 803 903 853 4 803 804 905 903 4 804 856 858 905 4 856 857 859 858 4 857 807 909 859 4 807 860 910 909 4 860 808 861 910 4 808 862 913 861 4 862 812 863 913 4 812 811 915 863 4 811 814 864 915 4 814 816 918 864 4 816 865 920 918 4 865 867 866 920 4 867 818 921 866 4 818 868 923 921 4 923 869 871 955 4 869 822 870 871 4 822 872 925 870 4 872 873 926 925 4 873 825 874 926 4 825 875 876 874 4 875 827 877 876 4 827 828 878 877 4 828 879 880 878 4 879 831 881 880 4 831 830 883 881 4 830 884 882 883 4 884 835 932 882 4 835 834 933 932 4 834 885 936 933 4 885 886 887 936 4 886 837 888 887 4 837 889 890 888 4 889 838 892 890 4 838 891 894 892 4 891 840 893 894 4 840 844 895 893 4 844 843 937 895 4 843 923 955 937 4 923 896 939 955 4 896 897 898 939 4 897 849 940 898 4 849 899 943 940 4 899 851 944 943 4 851 900 902 944 4 900 854 901 902 4 854 853 904 901 4 853 903 946 904 4 903 905 906 946 4 905 858 908 906 4 858 859 907 908 4 859 909 949 907 4 909 910 950 949 4 910 861 911 950 4 861 913 912 911 4 913 863 914 912 4 863 915 917 914 4 915 864 916 917 4 864 918 952 916 4 918 920 919 952 4 920 866 922 919 4 866 921 954 922 4 921 923 955 954 4 955 871 924 999 4 871 870 957 924 4 870 925 958 957 4 925 926 959 958 4 926 874 927 959 4 874 876 928 927 4 876 877 961 928 4 877 878 929 961 4 878 880 962 929 4 880 881 930 962 4 881 883 931 930 4 883 882 963 931 4 882 932 934 963 4 932 933 964 934 4 933 936 935 964 4 936 887 966 935 4 887 888 967 966 4 888 890 968 967 4 890 892 969 968 4 892 894 970 969 4 894 893 972 970 4 893 895 938 972 4 895 937 974 938 4 937 955 999 974 4 955 939 976 999 4 939 898 978 976 4 898 940 942 978 4 940 943 941 942 4 943 944 980 941 4 944 902 945 980 4 902 901 981 945 4 901 904 983 981 4 904 946 984 983 4 946 906 947 984 4 906 908 985 947 4 908 907 986 985 4 907 949 948 986 4 949 950 987 948 4 950 911 988 987 4 911 912 989 988 4 912 914 951 989 4 914 917 991 951 4 917 916 993 991 4 916 952 994 993 4 952 919 953 994 4 919 922 997 953 4 922 954 956 997 4 954 955 999 956 4 999 924 1001 1062 4 924 957 1002 1001 4 957 958 1004 1002 4 958 959 960 1004 4 959 927 1006 960 4 927 928 1007 1006 4 928 961 1008 1007 4 961 929 1010 1008 4 929 962 1012 1010 4 962 930 1013 1012 4 930 931 1015 1013 4 931 963 1016 1015 4 963 934 965 1016 4 934 964 1018 965 4 964 935 1019 1018 4 935 966 1021 1019 4 966 967 1022 1021 4 967 968 1024 1022 4 968 969 1026 1024 4 969 970 971 1026 4 970 972 1028 971 4 972 938 973 1028 4 938 974 1031 973 4 974 999 1062 1031 4 999 976 975 1062 4 976 978 977 975 4 978 942 979 977 4 942 941 1033 979 4 941 980 1036 1033 4 980 945 1038 1036 4 945 981 982 1038 4 981 983 1040 982 4 983 984 1041 1040 4 984 947 1042 1041 4 947 985 1046 1042 4 985 986 1047 1046 4 986 948 1048 1047 4 948 987 1051 1048 4 987 988 990 1051 4 988 989 1054 990 4 989 951 1055 1054 4 951 991 992 1055 4 991 993 1057 992 4 993 994 995 1057 4 994 953 1060 995 4 953 997 996 1060 4 997 956 998 996 4 956 999 1062 998 4 1062 1001 1000 1099 4 1001 1002 1003 1000 4 1002 1004 1063 1003 4 1004 960 1005 1063 4 960 1006 1066 1005 4 1006 1007 1068 1066 4 1007 1008 1009 1068 4 1008 1010 1011 1009 4 1010 1012 1014 1011 4 1012 1013 1070 1014 4 1013 1015 1071 1070 4 1015 1016 1017 1071 4 1016 965 1074 1017 4 965 1018 1075 1074 4 1018 1019 1020 1075 4 1019 1021 1023 1020 4 1021 1022 1076 1023 4 1022 1024 1025 1076 4 1024 1026 1077 1025 4 1026 971 1027 1077 4 971 1028 1030 1027 4 1028 973 1029 1030 4 973 1031 1080 1029 4 1031 1062 1099 1080 4 1062 975 1081 1099 4 975 977 1032 1081 4 977 979 1082 1032 4 979 1033 1035 1082 4 1033 1036 1034 1035 4 1036 1038 1037 1034 4 1038 982 1086 1037 4 982 1040 1039 1086 4 1040 1041 1043 1039 4 1041 1042 1045 1043 4 1042 1046 1044 1045 4 1046 1047 1089 1044 4 1047 1048 1050 1089 4 1048 1051 1049 1050 4 1051 990 1052 1049 4 990 1054 1053 1052 4 1054 1055 1094 1053 4 1055 992 1056 1094 4 992 1057 1058 1056 4 1057 995 1059 1058 4 995 1060 1096 1059 4 1060 996 1061 1096 4 996 998 1098 1061 4 998 1062 1099 1098 4 1099 1000 1101 1100 4 1000 1003 1065 1101 4 1003 1063 1064 1065 4 1063 1005 1103 1064 4 1005 1066 1105 1103 4 1066 1068 1067 1105 4 1068 1009 1069 1067 4 1009 1011 1107 1069 4 1011 1014 1109 1107 4 1014 1070 1111 1109 4 1070 1071 1072 1111 4 1071 1017 1112 1072 4 1017 1074 1073 1112 4 1074 1075 1114 1073 4 1075 1020 1117 1114 4 1020 1023 1118 1117 4 1023 1076 1119 1118 4 1076 1025 1122 1119 4 1025 1077 1124 1122 4 1077 1027 1125 1124 4 1027 1030 1078 1125 4 1030 1029 1079 1078 4 1029 1080 1128 1079 4 1080 1099 1100 1128 4 1099 1081 1130 1100 4 1081 1032 1083 1130 4 1032 1082 1133 1083 4 1082 1035 1084 1133 4 1035 1034 1135 1084 4 1034 1037 1136 1135 4 1037 1086 1085 1136 4 1086 1039 1137 1085 4 1039 1043 1087 1137 4 1043 1045 1139 1087 4 1045 1044 1088 1139 4 1044 1089 1090 1088 4 1089 1050 1092 1090 4 1050 1049 1091 1092 4 1049 1052 1093 1091 4 1052 1053 1141 1093 4 1053 1094 1143 1141 4 1094 1056 1144 1143 4 1056 1058 1095 1144 4 1058 1059 1145 1095 4 1059 1096 1146 1145 4 1096 1061 1149 1146 4 1061 1098 1097 1149 4 1098 1099 1100 1097 4 1100 1101 1150 1198 4 1101 1065 1102 1150 4 1065 1064 1153 1102 4 1064 1103 1104 1153 4 1103 1105 1106 1104 4 1105 1067 1157 1106 4 1067 1069 1158 1157 4 1069 1107 1108 1158 4 1107 1109 1110 1108 4 1109 1111 1160 1110 4 1111 1072 1161 1160 4 1072 1112 1113 1161 4 1112 1073 1164 1113 4 1073 1114 1116 1164 4 1114 1117 1115 1116 4 1117 1118 1121 1115 4 1118 1119 1120 1121 4 1119 1122 1123 1120 4 1122 1124 1169 1123 4 1124 1125 1170 1169 4 1125 1078 1126 1170 4 1078 1079 1127 1126 4 1079 1128 1129 1127 4 1128 1100 1198 1129 4 1100 1130 1172 1198 4 1130 1083 1132 1172 4 1083 1133 1131 1132 4 1133 1084 1134 1131 4 1084 1135 1173 1134 4 1135 1136 1176 1173 4 1136 1085 1177 1176 4 1085 1137 1178 1177 4 1137 1087 1180 1178 4 1087 1139 1138 1180 4 1139 1088 1182 1138 4 1088 1090 1183 1182 4 1090 1092 1140 1183 4 1092 1091 1185 1140 4 1091 1093 1186 1185 4 1093 1141 1142 1186 4 1141 1143 1188 1142 4 1143 1144 1191 1188 4 1144 1095 1192 1191 4 1095 1145 1147 1192 4 1145 1146 1194 1147 4 1146 1149 1148 1194 4 1149 1097 1197 1148 4 1097 1100 1198 1197 4 1198 1150 1199 1236 4 1150 1102 1152 1199 4 1102 1153 1151 1152 4 1153 1104 1154 1151 4 1104 1106 1156 1154 4 1106 1157 1155 1156 4 1157 1158 1159 1155 4 1158 1108 1202 1159 4 1108 1110 1203 1202 4 1110 1160 1204 1203 4 1160 1161 1162 1204 4 1161 1113 1163 1162 4 1113 1164 1205 1163 4 1164 1116 1166 1205 4 1116 1115 1165 1166 4 1115 1121 1167 1165 4 1121 1120 1207 1167 4 1120 1123 1168 1207 4 1123 1169 1209 1168 4 1169 1170 1212 1209 4 1170 1126 1213 1212 4 1126 1127 1171 1213 4 1127 1129 1217 1171 4 1129 1198 1236 1217 4 1198 1172 1218 1236 4 1172 1132 1219 1218 4 1132 1131 1220 1219 4 1131 1134 1222 1220 4 1134 1173 1174 1222 4 1173 1176 1175 1174 4 1176 1177 1224 1175 4 1177 1178 1179 1224 4 1178 1180 1181 1179 4 1180 1138 1226 1181 4 1138 1182 1227 1226 4 1182 1183 1228 1227 4 1183 1140 1184 1228 4 1140 1185 1187 1184 4 1185 1186 1229 1187 4 1186 1142 1189 1229 4 1142 1188 1230 1189 4 1188 1191 1190 1230 4 1191 1192 1193 1190 4 1192 1147 1196 1193 4 1147 1194 1195 1196 4 1194 1148 1234 1195 4 1148 1197 1235 1234 4 1197 1198 1236 1235 4 1236 1199 1239 1237 4 1199 1152 1200 1239 4 1152 1151 1240 1200 4 1151 1154 1201 1240 4 1154 1156 1241 1201 4 1156 1155 1242 1241 4 1155 1159 1245 1242 4 1159 1202 1246 1245 4 1202 1203 1247 1246 4 1203 1204 1249 1247 4 1204 1162 1250 1249 4 1162 1163 1251 1250 4 1163 1205 1253 1251 4 1205 1166 1254 1253 4 1166 1165 1206 1254 4 1165 1167 1256 1206 4 1167 1207 1208 1256 4 1207 1168 1211 1208 4 1168 1209 1210 1211 4 1209 1212 1214 1210 4 1212 1213 1216 1214 4 1213 1171 1215 1216 4 1171 1217 1262 1215 4 1217 1236 1237 1262 4 1236 1218 1264 1237 4 1218 1219 1221 1264 4 1219 1220 1265 1221 4 1220 1222 1266 1265 4 1222 1174 1223 1266 4 1174 1175 1268 1223 4 1175 1224 1271 1268 4 1224 1179 1273 1271 4 1179 1181 1225 1273 4 1181 1226 1275 1225 4 1226 1227 1276 1275 4 1227 1228 1279 1276 4 1228 1184 1280 1279 4 1184 1187 1281 1280 4 1187 1229 1282 1281 4 1229 1189 1283 1282 4 1189 1230 1286 1283 4 1230 1190 1288 1286 4 1190 1193 1231 1288 4 1193 1196 1233 1231 4 1196 1195 1232 1233 4 1195 1234 1290 1232 4 1234 1235 1238 1290 4 1235 1236 1237 1238 4 1237 1239 1293 1292 4 1239 1200 1294 1293 4 1200 1240 1295 1294 4 1240 1201 1296 1295 4 1201 1241 1244 1296 4 1241 1242 1243 1244 4 1242 1245 1301 1243 4 1245 1246 1248 1301 4 1246 1247 1302 1248 4 1247 1249 1305 1302 4 1249 1250 1307 1305 4 1250 1251 1308 1307 4 1251 1253 1252 1308 4 1253 1254 1309 1252 4 1254 1206 1255 1309 4 1206 1256 1312 1255 4 1256 1208 1257 1312 4 1208 1211 1258 1257 4 1211 1210 1315 1258 4 1210 1214 1259 1315 4 1214 1216 1261 1259 4 1216 1215 1260 1261 4 1215 1262 1263 1260 4 1262 1237 1292 1263 4 1237 1264 1317 1292 4 1264 1221 1318 1317 4 1221 1265 1321 1318 4 1265 1266 1267 1321 4 1266 1223 1270 1267 4 1223 1268 1269 1270 4 1268 1271 1272 1269 4 1271 1273 1274 1272 4 1273 1225 1326 1274 4 1225 1275 1328 1326 4 1275 1276 1278 1328 4 1276 1279 1277 1278 4 1279 1280 1330 1277 4 1280 1281 1331 1330 4 1281 1282 1335 1331 4 1282 1283 1285 1335 4 1283 1286 1284 1285 4 1286 1288 1287 1284 4 1288 1231 1339 1287 4 1231 1233 1341 1339 4 1233 1232 1343 1341 4 1232 1290 1289 1343 4 1290 1238 1291 1289 4 1238 1237 1292 1291 4 1292 1293 1344 1388 4 1293 1294 1345 1344 4 1294 1295 1298 1345 4 1295 1296 1297 1298 4 1296 1244 1299 1297 4 1244 1243 1350 1299 4 1243 1301 1300 1350 4 1301 1248 1353 1300 4 1248 1302 1303 1353 4 1302 1305 1304 1303 4 1305 1307 1306 1304 4 1307 1308 1356 1306 4 1308 1252 1310 1356 4 1252 1309 1357 1310 4 1309 1255 1311 1357 4 1255 1312 1360 1311 4 1312 1257 1313 1360 4 1257 1258 1314 1313 4 1258 1315 1316 1314 4 1315 1259 1365 1316 4 1259 1261 1366 1365 4 1261 1260 1368 1366 4 1260 1263 1370 1368 4 1263 1292 1388 1370 4 1292 1317 1320 1388 4 1317 1318 1319 1320 4 1318 1321 1322 1319 4 1321 1267 1373 1322 4 1267 1270 1374 1373 4 1270 1269 1323 1374 4 1269 1272 1325 1323 4 1272 1274 1324 1325 4 1274 1326 1327 1324 4 1326 1328 1377 1327 4 1328 1278 1329 1377 4 1278 1277 1379 1329 4 1277 1330 1333 1379 4 1330 1331 1332 1333 4 1331 1335 1334 1332 4 1335 1285 1337 1334 4 1285 1284 1336 1337 4 1284 1287 1338 1336 4 1287 1339 1340 1338 4 1339 1341 1342 1340 4 1341 1343 1384 1342 4 1343 1289 1385 1384 4 1289 1291 1387 1385 4 1291 1292 1388 1387 4 1388 1344 1391 1389 4 1344 1345 1347 1391 4 1345 1298 1346 1347 4 1298 1297 1349 1346 4 1297 1299 1348 1349 4 1299 1350 1352 1348 4 1350 1300 1351 1352 4 1300 1353 1398 1351 4 1353 1303 1354 1398 4 1303 1304 1399 1354 4 1304 1306 1355 1399 4 1306 1356 1402 1355 4 1356 1310 1403 1402 4 1310 1357 1359 1403 4 1357 1311 1358 1359 4 1311 1360 1361 1358 4 1360 1313 1362 1361 4 1313 1314 1363 1362 4 1314 1316 1406 1363 4 1316 1365 1364 1406 4 1365 1366 1367 1364 4 1366 1368 1407 1367 4 1368 1370 1369 1407 4 1370 1388 1389 1369 4 1388 1320 1371 1389 4 1320 1319 1409 1371 4 1319 1322 1372 1409 4 1322 1373 1375 1372 4 1373 1374 1412 1375 4 1374 1323 1376 1412 4 1323 1325 1415 1376 4 1325 1324 1416 1415 4 1324 1327 1417 1416 4 1327 1377 1378 1417 4 1377 1329 1420 1378 4 1329 1379 1421 1420 4 1379 1333 1380 1421 4 1333 1332 1381 1380 4 1332 1334 1423 1381 4 1334 1337 1382 1423 4 1337 1336 1425 1382 4 1336 1338 1427 1425 4 1338 1340 1383 1427 4 1340 1342 1430 1383 4 1342 1384 1386 1430 4 1384 1385 1433 1386 4 1385 1387 1390 1433 4 1387 1388 1389 1390 4 1389 1391 1392 1434 4 1391 1347 1436 1392 4 1347 1346 1393 1436 4 1346 1349 1394 1393 4 1349 1348 1395 1394 4 1348 1352 1397 1395 4 1352 1351 1396 1397 4 1351 1398 1437 1396 4 1398 1354 1438 1437 4 1354 1399 1400 1438 4 1399 1355 1401 1400 4 1355 1402 1440 1401 4 1402 1403 1441 1440 4 1403 1359 1442 1441 4 1359 1358 1404 1442 4 1358 1361 1444 1404 4 1361 1362 1405 1444 4 1362 1363 1445 1405 4 1363 1406 1447 1445 4 1406 1364 1448 1447 4 1364 1367 1451 1448 4 1367 1407 1454 1451 4 1407 1369 1408 1454 4 1369 1389 1434 1408 4 1389 1371 1455 1434 4 1371 1409 1410 1455 4 1409 1372 1411 1410 4 1372 1375 1457 1411 4 1375 1412 1413 1457 4 1412 1376 1460 1413 4 1376 1415 1414 1460 4 1415 1416 1461 1414 4 1416 1417 1418 1461 4 1417 1378 1419 1418 4 1378 1420 1465 1419 4 1420 1421 1422 1465 4 1421 1380 1467 1422 4 1380 1381 1468 1467 4 1381 1423 1424 1468 4 1423 1382 1470 1424 4 1382 1425 1426 1470 4 1425 1427 1428 1426 4 1427 1383 1429 1428 4 1383 1430 1472 1429 4 1430 1386 1432 1472 4 1386 1433 1431 1432 4 1433 1390 1474 1431 4 1390 1389 1434 1474 4 1434 1392 1476 1435 4 1392 1436 1477 1476 4 1436 1393 1479 1477 4 1393 1394 1480 1479 4 1394 1395 1481 1480 4 1395 1397 1483 1481 4 1397 1396 1484 1483 4 1396 1437 1486 1484 4 1437 1438 1439 1486 4 1438 1400 1487 1439 4 1400 1401 1488 1487 4 1401 1440 1491 1488 4 1440 1441 1492 1491 4 1441 1442 1493 1492 4 1442 1404 1443 1493 4 1404 1444 1495 1443 4 1444 1405 1446 1495 4 1405 1445 1498 1446 4 1445 1447 1450 1498 4 1447 1448 1449 1450 4 1448 1451 1453 1449 4 1451 1454 1452 1453 4 1454 1408 1503 1452 4 1408 1434 1435 1503 4 1434 1455 1456 1435 4 1455 1410 1505 1456 4 1410 1411 1506 1505 4 1411 1457 1458 1506 4 1457 1413 1459 1458 4 1413 1460 1510 1459 4 1460 1414 1511 1510 4 1414 1461 1462 1511 4 1461 1418 1463 1462 4 1418 1419 1464 1463 4 1419 1465 1514 1464 4 1465 1422 1466 1514 4 1422 1467 1516 1466 4 1467 1468 1469 1516 4 1468 1424 1471 1469 4 1424 1470 1517 1471 4 1470 1426 1519 1517 4 1426 1428 1520 1519 4 1428 1429 1521 1520 4 1429 1472 1473 1521 4 1472 1432 1525 1473 4 1432 1431 1526 1525 4 1431 1474 1527 1526 4 1474 1434 1435 1527 4 1435 1476 1475 1528 4 1476 1477 1531 1475 4 1477 1479 1478 1531 4 1479 1480 1533 1478 4 1480 1481 1482 1533 4 1481 1483 1485 1482 4 1483 1484 1536 1485 4 1484 1486 1537 1536 4 1486 1439 1540 1537 4 1439 1487 1489 1540 4 1487 1488 1490 1489 4 1488 1491 1541 1490 4 1491 1492 1542 1541 4 1492 1493 1494 1542 4 1493 1443 1544 1494 4 1443 1495 1497 1544 4 1495 1446 1496 1497 4 1446 1498 1499 1496 4 1498 1450 1500 1499 4 1450 1449 1548 1500 4 1449 1453 1501 1548 4 1453 1452 1502 1501 4 1452 1503 1550 1502 4 1503 1435 1528 1550 4 1435 1456 1504 1528 4 1456 1505 1507 1504 4 1505 1506 1508 1507 4 1506 1458 1552 1508 4 1458 1459 1509 1552 4 1459 1510 1512 1509 4 1510 1511 1555 1512 4 1511 1462 1557 1555 4 1462 1463 1513 1557 4 1463 1464 1560 1513 4 1464 1514 1561 1560 4 1514 1466 1515 1561 4 1466 1516 1563 1515 4 1516 1469 1565 1563 4 1469 1471 1566 1565 4 1471 1517 1567 1566 4 1517 1519 1518 1567 4 1519 1520 1522 1518 4 1520 1521 1524 1522 4 1521 1473 1523 1524 4 1473 1525 1569 1523 4 1525 1526 1570 1569 4 1526 1527 1572 1570 4 1527 1435 1528 1572 4 1528 1475 1529 1530 4 1475 1531 1532 1529 4 1531 1478 1573 1532 4 1478 1533 1534 1573 4 1533 1482 1575 1534 4 1482 1485 1535 1575 4 1485 1536 1538 1535 4 1536 1537 1576 1538 4 1537 1540 1539 1576 4 1540 1489 1578 1539 4 1489 1490 1580 1578 4 1490 1541 1581 1580 4 1541 1542 1543 1581 4 1542 1494 1584 1543 4 1494 1544 1585 1584 4 1544 1497 1545 1585 4 1497 1496 1587 1545 4 1496 1499 1546 1587 4 1499 1500 1547 1546 4 1500 1548 1589 1547 4 1548 1501 1591 1589 4 1501 1502 1549 1591 4 1502 1550 1594 1549 4 1550 1528 1530 1594 4 1528 1504 1551 1530 4 1504 1507 1597 1551 4 1507 1508 1598 1597 4 1508 1552 1600 1598 4 1552 1509 1554 1600 4 1509 1512 1553 1554 4 1512 1555 1556 1553 4 1555 1557 1558 1556 4 1557 1513 1603 1558 4 1513 1560 1559 1603 4 1560 1561 1562 1559 4 1561 1515 1605 1562 4 1515 1563 1608 1605 4 1563 1565 1564 1608 4 1565 1566 1610 1564 4 1566 1567 1568 1610 4 1567 1518 1612 1568 4 1518 1522 1613 1612 4 1522 1524 1614 1613 4 1524 1523 1616 1614 4 1523 1569 1571 1616 4 1569 1570 1620 1571 4 1570 1572 1621 1620 4 1572 1528 1530 1621 4 1530 1529 1625 1624 4 1529 1532 1628 1625 4 1532 1573 1574 1628 4 1573 1534 1629 1574 4 1534 1575 1630 1629 4 1575 1535 1631 1630 4 1535 1538 1577 1631 4 1538 1576 1633 1577 4 1576 1539 1579 1633 4 1539 1578 1636 1579 4 1578 1580 1639 1636 4 1580 1581 1583 1639 4 1581 1543 1582 1583 4 1543 1584 1641 1582 4 1584 1585 1643 1641 4 1585 1545 1586 1643 4 1545 1587 1645 1586 4 1587 1546 1588 1645 4 1546 1547 1590 1588 4 1547 1589 1649 1590 4 1589 1591 1593 1649 4 1591 1549 1592 1593 4 1549 1594 1595 1592 4 1594 1530 1624 1595 4 1530 1551 1652 1624 4 1551 1597 1596 1652 4 1597 1598 1654 1596 4 1598 1600 1599 1654 4 1600 1554 1601 1599 4 1554 1553 1658 1601 4 1553 1556 1659 1658 4 1556 1558 1602 1659 4 1558 1603 1604 1602 4 1603 1559 1661 1604 4 1559 1562 1662 1661 4 1562 1605 1607 1662 4 1605 1608 1606 1607 4 1608 1564 1609 1606 4 1564 1610 1666 1609 4 1610 1568 1611 1666 4 1568 1612 1669 1611 4 1612 1613 1615 1669 4 1613 1614 1617 1615 4 1614 1616 1619 1617 4 1616 1571 1618 1619 4 1571 1620 1623 1618 4 1620 1621 1622 1623 4 1621 1530 1624 1622 4 1624 1625 1674 1626 4 1625 1628 1627 1674 4 1628 1574 1676 1627 4 1574 1629 1677 1676 4 1629 1630 1632 1677 4 1630 1631 1678 1632 4 1631 1577 1680 1678 4 1577 1633 1634 1680 4 1633 1579 1635 1634 4 1579 1636 1638 1635 4 1636 1639 1637 1638 4 1639 1583 1640 1637 4 1583 1582 1682 1640 4 1582 1641 1684 1682 4 1641 1643 1642 1684 4 1643 1586 1644 1642 4 1586 1645 1646 1644 4 1645 1588 1647 1646 4 1588 1590 1648 1647 4 1590 1649 1686 1648 4 1649 1593 1688 1686 4 1593 1592 1650 1688 4 1592 1595 1691 1650 4 1595 1624 1626 1691 4 1624 1652 1651 1626 4 1652 1596 1653 1651 4 1596 1654 1693 1653 4 1654 1599 1655 1693 4 1599 1601 1657 1655 4 1601 1658 1656 1657 4 1658 1659 1660 1656 4 1659 1602 1698 1660 4 1602 1604 1699 1698 4 1604 1661 1702 1699 4 1661 1662 1663 1702 4 1662 1607 1665 1663 4 1607 1606 1664 1665 4 1606 1609 1706 1664 4 1609 1666 1707 1706 4 1666 1611 1667 1707 4 1611 1669 1668 1667 4 1669 1615 1670 1668 4 1615 1617 1671 1670 4 1617 1619 1709 1671 4 1619 1618 1710 1709 4 1618 1623 1673 1710 4 1623 1622 1672 1673 4 1622 1624 1626 1672 4 1626 1674 1715 1714 4 1674 1627 1675 1715 4 1627 1676 1717 1675 4 1676 1677 1718 1717 4 1677 1632 1720 1718 4 1632 1678 1679 1720 4 1678 1680 1722 1679 4 1680 1634 1725 1722 4 1634 1635 1681 1725 4 1635 1638 1727 1681 4 1638 1637 1728 1727 4 1637 1640 1729 1728 4 1640 1682 1683 1729 4 1682 1684 1731 1683 4 1684 1642 1685 1731 4 1642 1644 1733 1685 4 1644 1646 1735 1733 4 1646 1647 1736 1735 4 1647 1648 1687 1736 4 1648 1686 1740 1687 4 1686 1688 1689 1740 4 1688 1650 1742 1689 4 1650 1691 1690 1742 4 1691 1626 1714 1690 4 1626 1651 1692 1714 4 1651 1653 1745 1692 4 1653 1693 1746 1745 4 1693 1655 1694 1746 4 1655 1657 1695 1694 4 1657 1656 1749 1695 4 1656 1660 1697 1749 4 1660 1698 1696 1697 4 1698 1699 1701 1696 4 1699 1702 1700 1701 4 1702 1663 1703 1700 4 1663 1665 1704 1703 4 1665 1664 1705 1704 4 1664 1706 1753 1705 4 1706 1707 1755 1753 4 1707 1667 1708 1755 4 1667 1668 1757 1708 4 1668 1670 1758 1757 4 1670 1671 1760 1758 4 1671 1709 1711 1760 4 1709 1710 1712 1711 4 1710 1673 1761 1712 4 1673 1672 1713 1761 4 1672 1626 1714 1713 4 1714 1715 1716 1763 4 1715 1675 1765 1716 4 1675 1717 1768 1765 4 1717 1718 1719 1768 4 1718 1720 1721 1719 4 1720 1679 1723 1721 4 1679 1722 1724 1723 4 1722 1725 1726 1724 4 1725 1681 1771 1726 4 1681 1727 1772 1771 4 1727 1728 1730 1772 4 1728 1729 1773 1730 4 1729 1683 1775 1773 4 1683 1731 1732 1775 4 1731 1685 1734 1732 4 1685 1733 1777 1734 4 1733 1735 1778 1777 4 1735 1736 1737 1778 4 1736 1687 1739 1737 4 1687 1740 1738 1739 4 1740 1689 1741 1738 4 1689 1742 1743 1741 4 1742 1690 1783 1743 4 1690 1714 1763 1783 4 1714 1692 1784 1763 4 1692 1745 1744 1784 4 1745 1746 1747 1744 4 1746 1694 1788 1747 4 1694 1695 1748 1788 4 1695 1749 1790 1748 4 1749 1697 1750 1790 4 1697 1696 1792 1750 4 1696 1701 1793 1792 4 1701 1700 1794 1793 4 1700 1703 1752 1794 4 1703 1704 1751 1752 4 1704 1705 1754 1751 4 1705 1753 1797 1754 4 1753 1755 1756 1797 4 1755 1708 1799 1756 4 1708 1757 1801 1799 4 1757 1758 1802 1801 4 1758 1760 1759 1802 4 1760 1711 1803 1759 4 1711 1712 1804 1803 4 1712 1761 1805 1804 4 1761 1713 1762 1805 4 1713 1714 1763 1762 4 1763 1716 1764 1806 4 1716 1765 1767 1764 4 1765 1768 1766 1767 4 1768 1719 1811 1766 4 1719 1721 1769 1811 4 1721 1723 1812 1769 4 1723 1724 1770 1812 4 1724 1726 1813 1770 4 1726 1771 1814 1813 4 1771 1772 1815 1814 4 1772 1730 1818 1815 4 1730 1773 1774 1818 4 1773 1775 1776 1774 4 1775 1732 1820 1776 4 1732 1734 1821 1820 4 1734 1777 1822 1821 4 1777 1778 1780 1822 4 1778 1737 1779 1780 4 1737 1739 1823 1779 4 1739 1738 1781 1823 4 1738 1741 1826 1781 4 1741 1743 1827 1826 4 1743 1783 1782 1827 4 1783 1763 1806 1782 4 1763 1784 1830 1806 4 1784 1744 1785 1830 4 1744 1747 1787 1785 4 1747 1788 1786 1787 4 1788 1748 1789 1786 4 1748 1790 1834 1789 4 1790 1750 1791 1834 4 1750 1792 1836 1791 4 1792 1793 1837 1836 4 1793 1794 1795 1837 4 1794 1752 1838 1795 4 1752 1751 1839 1838 4 1751 1754 1796 1839 4 1754 1797 1842 1796 4 1797 1756 1798 1842 4 1756 1799 1844 1798 4 1799 1801 1800 1844 4 1801 1802 1846 1800 4 1802 1759 1847 1846 4 1759 1803 1848 1847 4 1803 1804 1849 1848 4 1804 1805 1850 1849 4 1805 1762 1852 1850 4 1762 1763 1806 1852 4 1806 1764 1807 1808 4 1764 1767 1855 1807 4 1767 1766 1809 1855 4 1766 1811 1810 1809 4 1811 1769 1858 1810 4 1769 1812 1859 1858 4 1812 1770 1863 1859 4 1770 1813 1864 1863 4 1813 1814 1816 1864 4 1814 1815 1817 1816 4 1815 1818 1867 1817 4 1818 1774 1868 1867 4 1774 1776 1819 1868 4 1776 1820 1870 1819 4 1820 1821 1872 1870 4 1821 1822 1873 1872 4 1822 1780 1874 1873 4 1780 1779 1875 1874 4 1779 1823 1878 1875 4 1823 1781 1824 1878 4 1781 1826 1825 1824 4 1826 1827 1828 1825 4 1827 1782 1829 1828 4 1782 1806 1808 1829 4 1806 1830 1832 1808 4 1830 1785 1831 1832 4 1785 1787 1833 1831 4 1787 1786 1884 1833 4 1786 1789 1886 1884 4 1789 1834 1835 1886 4 1834 1791 1887 1835 4 1791 1836 1888 1887 4 1836 1837 1889 1888 4 1837 1795 1890 1889 4 1795 1838 1840 1890 4 1838 1839 1891 1840 4 1839 1796 1841 1891 4 1796 1842 1843 1841 4 1842 1798 1894 1843 4 1798 1844 1896 1894 4 1844 1800 1845 1896 4 1800 1846 1898 1845 4 1846 1847 1900 1898 4 1847 1848 1901 1900 4 1848 1849 1902 1901 4 1849 1850 1904 1902 4 1850 1852 1851 1904 4 1852 1806 1808 1851 4 1808 1807 1854 1906 4 1807 1855 1853 1854 4 1855 1809 1856 1853 4 1809 1810 1857 1856 4 1810 1858 1860 1857 4 1858 1859 1862 1860 4 1859 1863 1861 1862 4 1863 1864 1911 1861 4 1864 1816 1865 1911 4 1816 1817 1914 1865 4 1817 1867 1866 1914 4 1867 1868 1916 1866 4 1868 1819 1869 1916 4 1819 1870 1871 1869 4 1870 1872 1917 1871 4 1872 1873 1918 1917 4 1873 1874 1919 1918 4 1874 1875 1876 1919 4 1875 1878 1877 1876 4 1878 1824 1879 1877 4 1824 1825 1921 1879 4 1825 1828 1880 1921 4 1828 1829 1923 1880 4 1829 1808 1906 1923 4 1808 1832 1882 1906 4 1832 1831 1881 1882 4 1831 1833 1883 1881 4 1833 1884 1885 1883 4 1884 1886 1929 1885 4 1886 1835 1930 1929 4 1835 1887 1931 1930 4 1887 1888 1933 1931 4 1888 1889 1935 1933 4 1889 1890 1938 1935 4 1890 1840 1939 1938 4 1840 1891 1892 1939 4 1891 1841 1893 1892 4 1841 1843 1895 1893 4 1843 1894 1942 1895 4 1894 1896 1897 1942 4 1896 1845 1899 1897 4 1845 1898 1947 1899 4 1898 1900 1948 1947 4 1900 1901 1903 1948 4 1901 1902 1949 1903 4 1902 1904 1950 1949 4 1904 1851 1905 1950 4 1851 1808 1906 1905 4 1906 1854 1953 1907 4 1854 1853 1908 1953 4 1853 1856 1956 1908 4 1856 1857 1957 1956 4 1857 1860 1909 1957 4 1860 1862 1910 1909 4 1862 1861 1913 1910 4 1861 1911 1912 1913 4 1911 1865 1961 1912 4 1865 1914 1963 1961 4 1914 1866 1915 1963 4 1866 1916 1964 1915 4 1916 1869 1966 1964 4 1869 1871 1968 1966 4 1871 1917 1969 1968 4 1917 1918 1971 1969 4 1918 1919 1974 1971 4 1919 1876 1975 1974 4 1876 1877 1920 1975 4 1877 1879 1977 1920 4 1879 1921 1980 1977 4 1921 1880 1922 1980 4 1880 1923 1982 1922 4 1923 1906 1907 1982 4 1906 1882 1925 1907 4 1882 1881 1924 1925 4 1881 1883 1926 1924 4 1883 1885 1928 1926 4 1885 1929 1927 1928 4 1929 1930 1932 1927 4 1930 1931 1934 1932 4 1931 1933 1936 1934 4 1933 1935 1987 1936 4 1935 1938 1937 1987 4 1938 1939 1940 1937 4 1939 1892 1988 1940 4 1892 1893 1941 1988 4 1893 1895 1943 1941 4 1895 1942 1945 1943 4 1942 1897 1944 1945 4 1897 1899 1946 1944 4 1899 1947 1992 1946 4 1947 1948 1993 1992 4 1948 1903 1995 1993 4 1903 1949 1951 1995 4 1949 1950 1997 1951 4 1950 1905 1952 1997 4 1905 1906 1907 1952 4 1907 1953 1954 1998 4 1953 1908 2000 1954 4 1908 1956 1955 2000 4 1956 1957 1958 1955 4 1957 1909 2001 1958 4 1909 1910 1960 2001 4 1910 1913 1959 1960 4 1913 1912 2005 1959 4 1912 1961 2006 2005 4 1961 1963 1962 2006 4 1963 1915 1965 1962 4 1915 1964 1967 1965 4 1964 1966 2008 1967 4 1966 1968 1970 2008 4 1968 1969 1973 1970 4 1969 1971 1972 1973 4 1971 1974 2012 1972 4 1974 1975 2013 2012 4 1975 1920 1976 2013 4 1920 1977 1979 1976 4 1977 1980 1978 1979 4 1980 1922 1981 1978 4 1922 1982 2015 1981 4 1982 1907 1998 2015 4 1907 1925 1984 1998 4 1925 1924 1983 1984 4 1924 1926 2017 1983 4 1926 1928 2018 2017 4 1928 1927 1985 2018 4 1927 1932 1986 1985 4 1932 1934 2022 1986 4 1934 1936 2023 2022 4 1936 1987 2024 2023 4 1987 1937 2027 2024 4 1937 1940 2028 2027 4 1940 1988 1989 2028 4 1988 1941 2030 1989 4 1941 1943 1990 2030 4 1943 1945 1991 1990 4 1945 1944 2033 1991 4 1944 1946 2034 2033 4 1946 1992 2035 2034 4 1992 1993 1994 2035 4 1993 1995 2037 1994 4 1995 1951 1996 2037 4 1951 1997 2038 1996 4 1997 1952 2039 2038 4 1952 1907 1998 2039 4 1998 1954 2040 1999 4 1954 2000 2042 2040 4 2000 1955 2044 2042 4 1955 1958 2003 2044 4 1958 2001 2002 2003 4 2001 1960 2004 2002 4 1960 1959 2048 2004 4 1959 2005 2049 2048 4 2005 2006 2007 2049 4 2006 1962 2051 2007 4 1962 1965 2053 2051 4 1965 1967 2055 2053 4 1967 2008 2056 2055 4 2008 1970 2009 2056 4 1970 1973 2011 2009 4 1973 1972 2010 2011 4 1972 2012 2059 2010 4 2012 2013 2060 2059 4 2013 1976 2014 2060 4 1976 1979 2062 2014 4 1979 1978 2063 2062 4 1978 1981 2064 2063 4 1981 2015 2016 2064 4 2015 1998 1999 2016 4 1998 1984 2066 1999 4 1984 1983 2067 2066 4 1983 2017 2019 2067 4 2017 2018 2070 2019 4 2018 1985 2020 2070 4 1985 1986 2073 2020 4 1986 2022 2021 2073 4 2022 2023 2075 2021 4 2023 2024 2026 2075 4 2024 2027 2025 2026 4 2027 2028 2029 2025 4 2028 1989 2031 2029 4 1989 2030 2077 2031 4 2030 1990 2032 2077 4 1990 1991 2079 2032 4 1991 2033 2081 2079 4 2033 2034 2082 2081 4 2034 2035 2084 2082 4 2035 1994 2085 2084 4 1994 2037 2036 2085 4 2037 1996 2088 2036 4 1996 2038 2089 2088 4 2038 2039 2090 2089 4 2039 1998 1999 2090 4 1999 2040 2043 2041 4 2040 2042 2094 2043 4 2042 2044 2046 2094 4 2044 2003 2045 2046 4 2003 2002 2097 2045 4 2002 2004 2047 2097 4 2004 2048 2100 2047 4 2048 2049 2101 2100 4 2049 2007 2050 2101 4 2007 2051 2052 2050 4 2051 2053 2103 2052 4 2053 2055 2054 2103 4 2055 2056 2105 2054 4 2056 2009 2106 2105 4 2009 2011 2057 2106 4 2011 2010 2058 2057 4 2010 2059 2061 2058 4 2059 2060 2107 2061 4 2060 2014 2108 2107 4 2014 2062 2109 2108 4 2062 2063 2112 2109 4 2063 2064 2113 2112 4 2064 2016 2065 2113 4 2016 1999 2041 2065 4 1999 2066 2115 2041 4 2066 2067 2068 2115 4 2067 2019 2069 2068 4 2019 2070 2071 2069 4 2070 2020 2072 2071 4 2020 2073 2118 2072 4 2073 2021 2074 2118 4 2021 2075 2120 2074 4 2075 2026 2122 2120 4 2026 2025 2076 2122 4 2025 2029 2123 2076 4 2029 2031 2127 2123 4 2031 2077 2078 2127 4 2077 2032 2080 2078 4 2032 2079 2129 2080 4 2079 2081 2130 2129 4 2081 2082 2083 2130 4 2082 2084 2133 2083 4 2084 2085 2086 2133 4 2085 2036 2135 2086 4 2036 2088 2087 2135 4 2088 2089 2137 2087 4 2089 2090 2091 2137 4 2090 1999 2041 2091 4 2041 2043 2138 2092 4 2043 2094 2093 2138 4 2094 2046 2095 2093 4 2046 2045 2096 2095 4 2045 2097 2098 2096 4 2097 2047 2099 2098 4 2047 2100 2144 2099 4 2100 2101 2102 2144 4 2101 2050 2145 2102 4 2050 2052 2147 2145 4 2052 2103 2104 2147 4 2103 2054 2149 2104 4 2054 2105 2150 2149 4 2105 2106 2152 2150 4 2106 2057 2154 2152 4 2057 2058 2156 2154 4 2058 2061 2158 2156 4 2061 2107 2160 2158 4 2107 2108 2161 2160 4 2108 2109 2111 2161 4 2109 2112 2110 2111 4 2112 2113 2114 2110 4 2113 2065 2162 2114 4 2065 2041 2092 2162 4 2041 2115 2164 2092 4 2115 2068 2166 2164 4 2068 2069 2168 2166 4 2069 2071 2116 2168 4 2071 2072 2117 2116 4 2072 2118 2119 2117 4 2118 2074 2169 2119 4 2074 2120 2172 2169 4 2120 2122 2121 2172 4 2122 2076 2125 2121 4 2076 2123 2124 2125 4 2123 2127 2126 2124 4 2127 2078 2176 2126 4 2078 2080 2128 2176 4 2080 2129 2178 2128 4 2129 2130 2131 2178 4 2130 2083 2180 2131 4 2083 2133 2132 2180 4 2133 2086 2182 2132 4 2086 2135 2134 2182 4 2135 2087 2136 2134 4 2087 2137 2185 2136 4 2137 2091 2186 2185 4 2091 2041 2092 2186 4 2092 2138 2139 2140 4 2138 2093 2141 2139 4 2093 2095 2142 2141 4 2095 2096 2192 2142 4 2096 2098 2143 2192 4 2098 2099 2195 2143 4 2099 2144 2197 2195 4 2144 2102 2200 2197 4 2102 2145 2146 2200 4 2145 2147 2148 2146 4 2147 2104 2203 2148 4 2104 2149 2151 2203 4 2149 2150 2207 2151 4 2150 2152 2153 2207 4 2152 2154 2155 2153 4 2154 2156 2157 2155 4 2156 2158 2159 2157 4 2158 2160 2213 2159 4 2160 2161 2214 2213 4 2161 2111 2215 2214 4 2111 2110 2218 2215 4 2110 2114 2163 2218 4 2114 2162 2220 2163 4 2162 2092 2140 2220 4 2092 2164 2165 2140 4 2164 2166 2167 2165 4 2166 2168 2224 2167 4 2168 2116 2226 2224 4 2116 2117 2229 2226 4 2117 2119 2171 2229 4 2119 2169 2170 2171 4 2169 2172 2233 2170 4 2172 2121 2173 2233 4 2121 2125 2174 2173 4 2125 2124 2237 2174 4 2124 2126 2175 2237 4 2126 2176 2240 2175 4 2176 2128 2177 2240 4 2128 2178 2179 2177 4 2178 2131 2243 2179 4 2131 2180 2246 2243 4 2180 2132 2181 2246 4 2132 2182 2249 2181 4 2182 2134 2250 2249 4 2134 2136 2184 2250 4 2136 2185 2183 2184 4 2185 2186 2187 2183 4 2186 2092 2140 2187 4 2140 2139 2188 2189 4 2139 2141 2191 2188 4 2141 2142 2190 2191 4 2142 2192 2193 2190 4 2192 2143 2194 2193 4 2143 2195 2196 2194 4 2195 2197 2199 2196 4 2197 2200 2198 2199 4 2200 2146 2202 2198 4 2146 2148 2201 2202 4 2148 2203 2204 2201 4 2203 2151 2205 2204 4 2151 2207 2206 2205 4 2207 2153 2208 2206 4 2153 2155 2209 2208 4 2155 2157 2210 2209 4 2157 2159 2212 2210 4 2159 2213 2211 2212 4 2213 2214 2217 2211 4 2214 2215 2216 2217 4 2215 2218 2219 2216 4 2218 2163 2221 2219 4 2163 2220 2222 2221 4 2220 2140 2189 2222 4 2140 2165 2223 2189 4 2165 2167 2225 2223 4 2167 2224 2228 2225 4 2224 2226 2227 2228 4 2226 2229 2231 2227 4 2229 2171 2230 2231 4 2171 2170 2232 2230 4 2170 2233 2234 2232 4 2233 2173 2236 2234 4 2173 2174 2235 2236 4 2174 2237 2239 2235 4 2237 2175 2238 2239 4 2175 2240 2241 2238 4 2240 2177 2242 2241 4 2177 2179 2245 2242 4 2179 2243 2244 2245 4 2243 2246 2247 2244 4 2246 2181 2248 2247 4 2181 2249 2252 2248 4 2249 2250 2251 2252 4 2250 2184 2253 2251 4 2184 2183 2255 2253 4 2183 2187 2254 2255 4 2187 2140 2189 2254 geomview-1.9.5/data/geom/link2.grp0000644000175000017500000000066512310110173013656 00000000000000GROUP # Reflect about X and Z axes 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 unit { = LIST { = INST # Semicircular ends of torus transform 1 0 0 0 0 1 0 0 0 0 1 0 2 0 0 1 unit < pieces/linkA.bez } { = GROUP # Joining pieces 1 0 0 0 0 1 0 0 0 0 1 0 -2 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 0 1 unit < pieces/linkB.bez } } geomview-1.9.5/data/geom/link8.grp0000644000175000017500000000154012310110173013655 00000000000000GROUP # Reflect about X and Z axes 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 unit { = LIST { = INST # Semicircular ends of torus transform 1 0 0 0 0 1 0 0 0 0 1 0 14 0 0 1 unit < pieces/linkA.bez } { = GROUP # Joining pieces 1 0 0 0 0 1 0 0 0 0 1 0 -14 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -14 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 -10 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -10 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 -6 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -6 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 -2 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 2 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 2 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 6 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 6 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 10 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 10 0 0 1 unit < pieces/linkB.bez } } geomview-1.9.5/data/geom/moebius.4d.mesh0000644000175000017500000000676212310110173014760 000000000000004MESH 11 11 0. 0. 0. 3 -0.309017 0. 0. 2.951057 -0.587785 0. 0. 2.809017 -0.809017 0. 0. 2.587785 -0.951057 0. 0. 2.309017 -1. 0. 0. 2 -0.951057 0. 0. 1.690983 -0.809017 0. 0. 1.412215 -0.587785 0. 0. 1.190983 -0.309017 0. 0. 1.048943 0. 0. 0. 1 0. 0. -0.309017 2.951057 -0.25 -0.181636 -0.293893 2.904508 -0.475528 -0.345492 -0.25 2.769421 -0.654508 -0.475528 -0.181636 2.559017 -0.769421 -0.559017 -0.0954915 2.293893 -0.809017 -0.587785 0. 2 -0.769421 -0.559017 0.0954915 1.706107 -0.654508 -0.475528 0.181636 1.440983 -0.475528 -0.345492 0.25 1.230579 -0.25 -0.181636 0.293893 1.095492 0. 0. 0.309017 1.048943 0. 0. -0.587785 2.809017 -0.0954915 -0.293893 -0.559017 2.769421 -0.181636 -0.559017 -0.475528 2.654508 -0.25 -0.769421 -0.345492 2.475528 -0.293893 -0.904508 -0.181636 2.25 -0.309017 -0.951057 0. 2 -0.293893 -0.904508 0.181636 1.75 -0.25 -0.769421 0.345492 1.524472 -0.181636 -0.559017 0.475528 1.345492 -0.0954915 -0.293893 0.559017 1.230579 0. 0. 0.587785 1.190983 0. 0. -0.809017 2.587785 0.0954915 -0.293893 -0.769421 2.559017 0.181636 -0.559017 -0.654508 2.475528 0.25 -0.769421 -0.475528 2.345492 0.293893 -0.904508 -0.25 2.181636 0.309017 -0.951057 0. 2 0.293893 -0.904508 0.25 1.818364 0.25 -0.769421 0.475528 1.654508 0.181636 -0.559017 0.654508 1.524472 0.0954915 -0.293893 0.769421 1.440983 0. 0. 0.809017 1.412215 0. 0. -0.951057 2.309017 0.25 -0.181636 -0.904508 2.293893 0.475528 -0.345492 -0.769421 2.25 0.654508 -0.475528 -0.559017 2.181636 0.769421 -0.559017 -0.293893 2.095492 0.809017 -0.587785 0. 2 0.769421 -0.559017 0.293893 1.904508 0.654508 -0.475528 0.559017 1.818364 0.475528 -0.345492 0.769421 1.75 0.25 -0.181636 0.904508 1.706107 0. 0. 0.951057 1.690983 0. 0. -1. 2 0.309017 0. -0.951057 2 0.587785 0. -0.809017 2 0.809017 0. -0.587785 2 0.951057 0. -0.309017 2 1. 0. 0. 2 0.951057 0. 0.309017 2 0.809017 0. 0.587785 2 0.587785 0. 0.809017 2 0.309017 0. 0.951057 2 0. 0. 1. 2 0. 0. -0.951057 1.690983 0.25 0.181636 -0.904508 1.706107 0.475528 0.345492 -0.769421 1.75 0.654508 0.475528 -0.559017 1.818364 0.769421 0.559017 -0.293893 1.904508 0.809017 0.587785 0. 2 0.769421 0.559017 0.293893 2.095492 0.654508 0.475528 0.559017 2.181636 0.475528 0.345492 0.769421 2.25 0.25 0.181636 0.904508 2.293893 0. 0. 0.951057 2.309017 0. 0. -0.809017 1.412215 0.0954915 0.293893 -0.769421 1.440983 0.181636 0.559017 -0.654508 1.524472 0.25 0.769421 -0.475528 1.654508 0.293893 0.904508 -0.25 1.818364 0.309017 0.951057 0. 2 0.293893 0.904508 0.25 2.181636 0.25 0.769421 0.475528 2.345492 0.181636 0.559017 0.654508 2.475528 0.0954915 0.293893 0.769421 2.559017 0. 0. 0.809017 2.587785 0. 0. -0.587785 1.190983 -0.0954915 0.293893 -0.559017 1.230579 -0.181636 0.559017 -0.475528 1.345492 -0.25 0.769421 -0.345492 1.524472 -0.293893 0.904508 -0.181636 1.75 -0.309017 0.951057 0. 2 -0.293893 0.904508 0.181636 2.25 -0.25 0.769421 0.345492 2.475528 -0.181636 0.559017 0.475528 2.654508 -0.0954915 0.293893 0.559017 2.769421 0. 0. 0.587785 2.809017 0. 0. -0.309017 1.048943 -0.25 0.181636 -0.293893 1.095492 -0.475528 0.345492 -0.25 1.230579 -0.654508 0.475528 -0.181636 1.440983 -0.769421 0.559017 -0.0954915 1.706107 -0.809017 0.587785 0. 2 -0.769421 0.559017 0.0954915 2.293893 -0.654508 0.475528 0.181636 2.559017 -0.475528 0.345492 0.25 2.769421 -0.25 0.181636 0.293893 2.904508 0. 0. 0.309017 2.951057 0. 0. 0. 1 -0.309017 0. 0. 1.048943 -0.587785 0. 0. 1.190983 -0.809017 0. 0. 1.412215 -0.951057 0. 0. 1.690983 -1. 0. 0. 2 -0.951057 0. 0. 2.309017 -0.809017 0. 0. 2.587785 -0.587785 0. 0. 2.809017 -0.309017 0. 0. 2.951057 0. 0. 0. 3 geomview-1.9.5/data/geom/moebius.skel0000644000175000017500000003712512310110173014451 00000000000000SKEL 288 208 1.150411e+00 4.765160e-01 4.877258e-02 1.033748e+00 1.033748e+00 1.913417e-01 8.704272e-01 8.704272e-01 9.567086e-02 9.520873e-01 9.520873e-01 1.435063e-01 1.030386e+00 6.884821e-01 7.257117e-02 1.129845e+00 7.549381e-01 1.088568e-01 7.071068e-01 7.071068e-01 0.000000e+00 7.887670e-01 7.887670e-01 4.783543e-02 9.309280e-01 6.220262e-01 3.628558e-02 1.500000e+00 -3.673940e-16 -6.123234e-17 1.376943e+00 5.703486e-01 9.754516e-02 1.468817e+00 2.921658e-01 4.900857e-02 1.263677e+00 5.234323e-01 7.315887e-02 1.346809e+00 2.678969e-01 3.675643e-02 1.229303e+00 8.213940e-01 1.451423e-01 4.622308e-01 1.115924e+00 1.388926e-01 5.417783e-01 1.307968e+00 2.777851e-01 8.005548e-01 1.198115e+00 2.356984e-01 5.020045e-01 1.211946e+00 2.083388e-01 7.393087e-01 1.106454e+00 1.767738e-01 8.288124e-17 1.353553e+00 3.535534e-01 2.704938e-01 1.359864e+00 3.171966e-01 2.516429e-01 1.265094e+00 2.378975e-01 6.780625e-01 1.014792e+00 1.178492e-01 6.168164e-01 9.231310e-01 5.892459e-02 6.973477e-01 2.888509e-01 -4.877258e-02 1.000000e+00 -2.449294e-16 0.000000e+00 9.238795e-01 3.826834e-01 0.000000e+00 9.807853e-01 1.950903e-01 0.000000e+00 8.106136e-01 3.357671e-01 -2.438629e-02 8.587775e-01 1.708215e-01 -1.225214e-02 8.314696e-01 5.555702e-01 0.000000e+00 7.320113e-01 4.891143e-01 -3.628558e-02 5.000000e-01 -1.224647e-16 6.123234e-17 7.500000e-01 0.000000e+00 0.000000e+00 6.250000e-01 0.000000e+00 0.000000e+00 7.367696e-01 1.465526e-01 -2.450429e-02 6.147618e-01 1.222837e-01 -3.675643e-02 8.750000e-01 0.000000e+00 0.000000e+00 1.250000e+00 0.000000e+00 0.000000e+00 1.125000e+00 0.000000e+00 0.000000e+00 1.224801e+00 2.436280e-01 2.450429e-02 1.102793e+00 2.193592e-01 1.225214e-02 1.375000e+00 0.000000e+00 0.000000e+00 1.037145e+00 4.295997e-01 2.438629e-02 3.031360e-01 7.318351e-01 -1.388926e-01 3.804660e-01 3.804660e-01 -1.913417e-01 5.437864e-01 5.437864e-01 -9.567086e-02 4.621262e-01 4.621262e-01 -1.435063e-01 4.330779e-01 6.481469e-01 -1.178492e-01 3.718318e-01 5.564856e-01 -1.767738e-01 6.254466e-01 6.254466e-01 -4.783543e-02 4.943241e-01 7.398083e-01 -5.892459e-02 3.958344e-17 6.464466e-01 -3.535534e-01 2.235886e-01 5.397907e-01 -2.777851e-01 1.196869e-01 6.017066e-01 -3.171966e-01 2.633623e-01 6.358129e-01 -2.083388e-01 1.385378e-01 6.964763e-01 -2.378975e-01 3.105856e-01 4.648242e-01 -2.356984e-01 4.708158e-01 1.950183e-01 -9.754516e-02 4.336362e-01 2.897465e-01 -1.451423e-01 5.840817e-01 2.419346e-01 -7.315887e-02 5.330946e-01 3.562024e-01 -1.088568e-01 4.927540e-01 9.801487e-02 -4.900857e-02 6.325529e-01 4.226583e-01 -7.257117e-02 6.123234e-17 1.000000e+00 0.000000e+00 3.826834e-01 9.238795e-01 0.000000e+00 1.950903e-01 9.807853e-01 0.000000e+00 4.224571e-01 1.019902e+00 6.944628e-02 2.139412e-01 1.075555e+00 7.929916e-02 5.555702e-01 8.314696e-01 0.000000e+00 7.205679e-17 1.176777e+00 1.767767e-01 7.746902e-17 1.265165e+00 2.651650e-01 2.327920e-01 1.170325e+00 1.585983e-01 6.664457e-17 1.088388e+00 8.838835e-02 5.040789e-17 8.232233e-01 -1.767767e-01 5.582011e-17 9.116117e-01 -8.838835e-02 1.573886e-01 7.912460e-01 -1.585983e-01 1.762395e-01 8.860156e-01 -7.929916e-02 4.499566e-17 7.348350e-01 -2.651650e-01 3.429097e-01 8.278573e-01 -6.944628e-02 -4.358353e-01 1.052200e+00 2.078674e-01 -8.424058e-01 8.424058e-01 4.619398e-01 -7.747563e-01 7.747563e-01 2.309699e-01 -8.085810e-01 8.085810e-01 3.464548e-01 -6.210437e-01 9.294576e-01 2.204803e-01 -6.537805e-01 9.784516e-01 3.307205e-01 -7.071068e-01 7.071068e-01 0.000000e+00 -7.409315e-01 7.409315e-01 1.154849e-01 -5.883070e-01 8.804636e-01 1.102402e-01 -4.889872e-01 1.180520e+00 4.157348e-01 -2.569723e-01 1.291887e+00 3.865052e-01 -4.624113e-01 1.116360e+00 3.118011e-01 -2.415018e-01 1.214112e+00 2.898789e-01 -6.865172e-01 1.027446e+00 4.409606e-01 -9.689395e-01 4.013479e-01 2.451963e-01 -1.014000e+00 4.200123e-01 4.903926e-01 -9.521511e-01 6.362070e-01 4.784702e-01 -9.914695e-01 4.106801e-01 3.677945e-01 -9.219807e-01 6.160478e-01 3.588526e-01 -1.000000e+00 1.224647e-16 5.000000e-01 -1.028852e+00 2.046514e-01 4.975924e-01 -1.016835e+00 2.022611e-01 3.731943e-01 -8.918103e-01 5.958886e-01 2.392351e-01 -8.616400e-01 5.757294e-01 1.196175e-01 -3.295316e-01 7.955595e-01 -2.078674e-01 -3.826834e-01 9.238795e-01 0.000000e+00 -1.950903e-01 9.807853e-01 0.000000e+00 -3.561075e-01 8.597195e-01 -1.039337e-01 -1.796198e-01 9.030098e-01 -9.662631e-02 -5.555702e-01 8.314696e-01 0.000000e+00 -5.228335e-01 7.824756e-01 -1.102402e-01 -1.641493e-01 8.252344e-01 -1.932526e-01 -1.486788e-01 7.474589e-01 -2.898789e-01 -2.260313e-01 1.136336e+00 1.932526e-01 -2.105608e-01 1.058561e+00 9.662631e-02 -4.092594e-01 9.880395e-01 1.039337e-01 -8.788195e-01 3.640190e-01 -2.451963e-01 -5.718078e-01 5.718078e-01 -4.619398e-01 -6.394573e-01 6.394573e-01 -2.309699e-01 -6.056325e-01 6.056325e-01 -3.464548e-01 -7.711289e-01 5.152519e-01 -2.392351e-01 -7.409585e-01 4.950927e-01 -3.588526e-01 -6.732820e-01 6.732820e-01 -1.154849e-01 -8.012993e-01 5.354110e-01 -1.196175e-01 -1.000000e+00 1.224647e-16 -5.000000e-01 -8.337596e-01 3.453545e-01 -4.903926e-01 -9.327184e-01 1.855292e-01 -4.975924e-01 -8.562895e-01 3.546867e-01 -3.677945e-01 -9.447351e-01 1.879195e-01 -3.731943e-01 -7.107882e-01 4.749335e-01 -4.784702e-01 -2.763797e-01 6.672395e-01 -4.157348e-01 -4.246232e-01 6.354936e-01 -4.409606e-01 -3.029556e-01 7.313995e-01 -3.118011e-01 -4.573600e-01 6.844876e-01 -3.307205e-01 -1.332083e-01 6.696835e-01 -3.865052e-01 -4.900967e-01 7.334816e-01 -2.204803e-01 -1.000000e+00 1.224647e-16 0.000000e+00 -9.238795e-01 3.826834e-01 0.000000e+00 -9.807853e-01 1.950903e-01 0.000000e+00 -9.464095e-01 3.920157e-01 1.225982e-01 -9.928020e-01 1.974806e-01 1.243981e-01 -8.314696e-01 5.555702e-01 0.000000e+00 -1.000000e+00 1.224647e-16 2.500000e-01 -1.000000e+00 1.224647e-16 3.750000e-01 -1.004819e+00 1.998709e-01 2.487962e-01 -1.000000e+00 1.224647e-16 1.250000e-01 -1.000000e+00 1.224647e-16 -2.500000e-01 -1.000000e+00 1.224647e-16 -1.250000e-01 -9.567518e-01 1.903098e-01 -2.487962e-01 -9.687686e-01 1.927000e-01 -1.243981e-01 -1.000000e+00 1.224647e-16 -3.750000e-01 -9.013495e-01 3.733512e-01 -1.225982e-01 -8.788195e-01 -3.640190e-01 2.451963e-01 -5.718078e-01 -5.718078e-01 4.619398e-01 -6.394573e-01 -6.394573e-01 2.309699e-01 -6.056325e-01 -6.056325e-01 3.464548e-01 -7.711289e-01 -5.152519e-01 2.392351e-01 -7.409585e-01 -4.950927e-01 3.588526e-01 -7.071068e-01 -7.071068e-01 0.000000e+00 -6.732820e-01 -6.732820e-01 1.154849e-01 -8.012993e-01 -5.354110e-01 1.196175e-01 -8.337596e-01 -3.453545e-01 4.903926e-01 -9.327184e-01 -1.855292e-01 4.975924e-01 -8.562895e-01 -3.546867e-01 3.677945e-01 -9.447351e-01 -1.879195e-01 3.731943e-01 -7.107882e-01 -4.749335e-01 4.784702e-01 -3.295316e-01 -7.955595e-01 2.078674e-01 -2.763797e-01 -6.672395e-01 4.157348e-01 -4.246232e-01 -6.354936e-01 4.409606e-01 -3.029556e-01 -7.313995e-01 3.118011e-01 -4.573600e-01 -6.844876e-01 3.307205e-01 -1.187503e-16 -6.464466e-01 3.535534e-01 -1.332083e-01 -6.696835e-01 3.865052e-01 -1.486788e-01 -7.474589e-01 2.898789e-01 -4.900967e-01 -7.334816e-01 2.204803e-01 -5.228335e-01 -7.824756e-01 1.102402e-01 -9.689395e-01 -4.013479e-01 -2.451963e-01 -9.238795e-01 -3.826834e-01 0.000000e+00 -9.807853e-01 -1.950903e-01 0.000000e+00 -9.464095e-01 -3.920157e-01 -1.225982e-01 -9.928020e-01 -1.974806e-01 -1.243981e-01 -8.314696e-01 -5.555702e-01 0.000000e+00 -8.616400e-01 -5.757294e-01 -1.196175e-01 -1.004819e+00 -1.998709e-01 -2.487962e-01 -1.016835e+00 -2.022611e-01 -3.731943e-01 -9.567518e-01 -1.903098e-01 2.487962e-01 -9.687686e-01 -1.927000e-01 1.243981e-01 -9.013495e-01 -3.733512e-01 1.225982e-01 -4.358353e-01 -1.052200e+00 -2.078674e-01 -8.424058e-01 -8.424058e-01 -4.619398e-01 -7.747563e-01 -7.747563e-01 -2.309699e-01 -8.085810e-01 -8.085810e-01 -3.464548e-01 -6.210437e-01 -9.294576e-01 -2.204803e-01 -6.537805e-01 -9.784516e-01 -3.307205e-01 -7.409315e-01 -7.409315e-01 -1.154849e-01 -5.883070e-01 -8.804636e-01 -1.102402e-01 -2.486437e-16 -1.353553e+00 -3.535534e-01 -4.889872e-01 -1.180520e+00 -4.157348e-01 -2.569723e-01 -1.291887e+00 -3.865052e-01 -4.624113e-01 -1.116360e+00 -3.118011e-01 -2.415018e-01 -1.214112e+00 -2.898789e-01 -6.865172e-01 -1.027446e+00 -4.409606e-01 -1.014000e+00 -4.200123e-01 -4.903926e-01 -9.521511e-01 -6.362070e-01 -4.784702e-01 -9.914695e-01 -4.106801e-01 -3.677945e-01 -9.219807e-01 -6.160478e-01 -3.588526e-01 -1.028852e+00 -2.046514e-01 -4.975924e-01 -8.918103e-01 -5.958886e-01 -2.392351e-01 -1.836970e-16 -1.000000e+00 0.000000e+00 -3.826834e-01 -9.238795e-01 0.000000e+00 -1.950903e-01 -9.807853e-01 0.000000e+00 -3.561075e-01 -8.597195e-01 1.039337e-01 -1.796198e-01 -9.030098e-01 9.662631e-02 -5.555702e-01 -8.314696e-01 0.000000e+00 -1.512237e-16 -8.232233e-01 1.767767e-01 -1.349870e-16 -7.348350e-01 2.651650e-01 -1.641493e-01 -8.252344e-01 1.932526e-01 -1.674603e-16 -9.116117e-01 8.838835e-02 -2.161704e-16 -1.176777e+00 -1.767767e-01 -1.999337e-16 -1.088388e+00 -8.838835e-02 -2.260313e-01 -1.136336e+00 -1.932526e-01 -2.105608e-01 -1.058561e+00 -9.662631e-02 -2.324070e-16 -1.265165e+00 -2.651650e-01 -4.092594e-01 -9.880395e-01 -1.039337e-01 3.031360e-01 -7.318351e-01 1.388926e-01 3.804660e-01 -3.804660e-01 1.913417e-01 5.437864e-01 -5.437864e-01 9.567086e-02 4.621262e-01 -4.621262e-01 1.435063e-01 4.330779e-01 -6.481469e-01 1.178492e-01 3.718318e-01 -5.564856e-01 1.767738e-01 7.071068e-01 -7.071068e-01 0.000000e+00 6.254466e-01 -6.254466e-01 4.783543e-02 4.943241e-01 -7.398083e-01 5.892459e-02 2.235886e-01 -5.397907e-01 2.777851e-01 1.196869e-01 -6.017066e-01 3.171966e-01 2.633623e-01 -6.358129e-01 2.083388e-01 1.385378e-01 -6.964763e-01 2.378975e-01 3.105856e-01 -4.648242e-01 2.356984e-01 6.973477e-01 -2.888509e-01 4.877258e-02 4.708158e-01 -1.950183e-01 9.754516e-02 4.336362e-01 -2.897465e-01 1.451423e-01 5.840817e-01 -2.419346e-01 7.315887e-02 5.330946e-01 -3.562024e-01 1.088568e-01 4.927540e-01 -9.801487e-02 4.900857e-02 6.147618e-01 -1.222837e-01 3.675643e-02 6.325529e-01 -4.226583e-01 7.257117e-02 7.320113e-01 -4.891143e-01 3.628558e-02 4.622308e-01 -1.115924e+00 -1.388926e-01 3.826834e-01 -9.238795e-01 0.000000e+00 1.950903e-01 -9.807853e-01 0.000000e+00 4.224571e-01 -1.019902e+00 -6.944628e-02 2.139412e-01 -1.075555e+00 -7.929916e-02 5.555702e-01 -8.314696e-01 0.000000e+00 6.168164e-01 -9.231310e-01 -5.892459e-02 2.327920e-01 -1.170325e+00 -1.585983e-01 2.516429e-01 -1.265094e+00 -2.378975e-01 1.573886e-01 -7.912460e-01 1.585983e-01 1.762395e-01 -8.860156e-01 7.929916e-02 3.429097e-01 -8.278573e-01 6.944628e-02 1.150411e+00 -4.765160e-01 -4.877258e-02 1.033748e+00 -1.033748e+00 -1.913417e-01 8.704272e-01 -8.704272e-01 -9.567086e-02 9.520873e-01 -9.520873e-01 -1.435063e-01 1.030386e+00 -6.884821e-01 -7.257117e-02 1.129845e+00 -7.549381e-01 -1.088568e-01 7.887670e-01 -7.887670e-01 -4.783543e-02 9.309280e-01 -6.220262e-01 -3.628558e-02 1.376943e+00 -5.703486e-01 -9.754516e-02 1.468817e+00 -2.921658e-01 -4.900857e-02 1.263677e+00 -5.234323e-01 -7.315887e-02 1.346809e+00 -2.678969e-01 -3.675643e-02 1.229303e+00 -8.213940e-01 -1.451423e-01 5.417783e-01 -1.307968e+00 -2.777851e-01 8.005548e-01 -1.198115e+00 -2.356984e-01 5.020045e-01 -1.211946e+00 -2.083388e-01 7.393087e-01 -1.106454e+00 -1.767738e-01 2.704938e-01 -1.359864e+00 -3.171966e-01 6.780625e-01 -1.014792e+00 -1.178492e-01 9.238795e-01 -3.826834e-01 0.000000e+00 9.807853e-01 -1.950903e-01 0.000000e+00 8.106136e-01 -3.357671e-01 2.438629e-02 8.587775e-01 -1.708215e-01 1.225214e-02 8.314696e-01 -5.555702e-01 0.000000e+00 7.367696e-01 -1.465526e-01 2.450429e-02 1.224801e+00 -2.436280e-01 -2.450429e-02 1.102793e+00 -2.193592e-01 -1.225214e-02 1.037145e+00 -4.295997e-01 -2.438629e-02 3 1 3 2 0 0 0 1 3 2 4 0 0 0 0 1 3 0 5 1 0 0 1 1 3 2 7 6 0 0 0 1 3 6 8 0 0 0 1 1 3 9 11 10 0 0 0 1 3 10 12 0 0 0 0 1 3 0 13 9 0 0 1 1 3 10 14 1 0 0 0 1 3 1 17 16 0 0 0 1 3 16 18 15 0 0 0 1 3 15 19 1 0 0 1 1 3 16 21 20 0 0 0 1 3 20 22 15 0 0 1 1 3 2 23 15 0 0 0 1 3 15 24 6 0 0 1 1 3 26 28 27 0 0 0 1 3 27 29 25 0 0 0 1 3 25 30 26 0 0 1 1 3 27 31 6 0 0 0 1 3 6 32 25 0 0 1 1 3 33 35 34 0 0 0 1 3 34 36 25 0 0 0 1 3 25 37 33 0 0 1 1 3 34 38 26 0 0 0 1 3 26 40 39 0 0 0 1 3 39 41 0 0 0 0 1 3 0 42 26 0 0 1 1 3 39 43 9 0 0 0 1 3 27 44 0 0 0 0 1 3 46 48 47 0 0 0 1 3 47 49 45 0 0 0 1 3 45 50 46 0 0 1 1 3 47 51 6 0 0 0 1 3 6 52 45 0 0 1 1 3 53 55 54 0 0 0 1 3 54 56 45 0 0 0 1 3 45 57 53 0 0 1 1 3 54 58 46 0 0 0 1 3 46 60 59 0 0 0 1 3 59 61 25 0 0 0 1 3 25 62 46 0 0 1 1 3 59 63 33 0 0 0 1 3 47 64 25 0 0 0 1 3 65 67 66 0 0 0 1 3 66 68 15 0 0 0 1 3 15 69 65 0 0 1 1 3 66 70 6 0 0 0 1 3 20 72 71 0 0 0 1 3 71 73 15 0 0 0 1 3 71 74 65 0 0 0 1 3 65 76 75 0 0 0 1 3 75 77 45 0 0 0 1 3 45 78 65 0 0 1 1 3 75 79 53 0 0 0 1 3 66 80 45 0 0 0 1 3 82 84 83 0 0 0 1 3 83 85 81 0 0 0 1 3 81 86 82 0 0 1 1 3 83 88 87 0 0 0 1 3 87 89 81 0 0 1 1 3 20 91 90 0 0 0 1 3 90 92 81 0 0 0 1 3 81 93 20 0 0 1 1 3 90 94 82 0 0 0 1 3 82 97 96 0 0 0 1 3 96 98 95 0 0 0 1 3 95 99 82 0 0 1 1 3 96 101 100 0 0 0 1 3 100 102 95 0 0 1 1 3 83 103 95 0 0 0 1 3 95 104 87 0 0 1 1 3 65 107 106 0 0 0 1 3 106 108 105 0 0 0 1 3 105 109 65 0 0 1 1 3 106 110 87 0 0 0 1 3 87 111 105 0 0 1 1 3 75 112 105 0 0 0 1 3 105 113 53 0 0 1 1 3 71 114 81 0 0 0 1 3 81 115 65 0 0 1 1 3 106 116 81 0 0 0 1 3 118 120 119 0 0 0 1 3 119 121 117 0 0 0 1 3 117 122 118 0 0 1 1 3 119 123 87 0 0 0 1 3 87 124 117 0 0 1 1 3 125 127 126 0 0 0 1 3 126 128 117 0 0 0 1 3 117 129 125 0 0 1 1 3 126 130 118 0 0 0 1 3 118 132 131 0 0 0 1 3 131 133 105 0 0 0 1 3 105 134 118 0 0 1 1 3 131 135 53 0 0 0 1 3 119 136 105 0 0 0 1 3 137 139 138 0 0 0 1 3 138 140 95 0 0 0 1 3 95 141 137 0 0 1 1 3 138 142 87 0 0 0 1 3 100 144 143 0 0 0 1 3 143 145 95 0 0 0 1 3 143 146 137 0 0 0 1 3 137 148 147 0 0 0 1 3 147 149 117 0 0 0 1 3 117 150 137 0 0 1 1 3 147 151 125 0 0 0 1 3 138 152 117 0 0 0 1 3 154 156 155 0 0 0 1 3 155 157 153 0 0 0 1 3 153 158 154 0 0 1 1 3 155 160 159 0 0 0 1 3 159 161 153 0 0 1 1 3 100 163 162 0 0 0 1 3 162 164 153 0 0 0 1 3 153 165 100 0 0 1 1 3 162 166 154 0 0 0 1 3 154 169 168 0 0 0 1 3 168 170 167 0 0 0 1 3 167 171 154 0 0 1 1 3 168 173 172 0 0 0 1 3 172 174 167 0 0 1 1 3 155 175 167 0 0 0 1 3 167 176 159 0 0 1 1 3 137 179 178 0 0 0 1 3 178 180 177 0 0 0 1 3 177 181 137 0 0 1 1 3 178 182 159 0 0 0 1 3 159 183 177 0 0 1 1 3 147 184 177 0 0 0 1 3 177 185 125 0 0 1 1 3 143 186 153 0 0 0 1 3 153 187 137 0 0 1 1 3 178 188 153 0 0 0 1 3 190 192 191 0 0 0 1 3 191 193 189 0 0 0 1 3 189 194 190 0 0 1 1 3 191 195 159 0 0 0 1 3 159 196 189 0 0 1 1 3 197 199 198 0 0 0 1 3 198 200 189 0 0 0 1 3 189 201 197 0 0 1 1 3 198 202 190 0 0 0 1 3 190 204 203 0 0 0 1 3 203 205 177 0 0 0 1 3 177 206 190 0 0 1 1 3 203 207 125 0 0 0 1 3 191 208 177 0 0 0 1 3 209 211 210 0 0 0 1 3 210 212 167 0 0 0 1 3 167 213 209 0 0 1 1 3 210 214 159 0 0 0 1 3 172 216 215 0 0 0 1 3 215 217 167 0 0 0 1 3 215 218 209 0 0 0 1 3 209 220 219 0 0 0 1 3 219 221 189 0 0 0 1 3 189 222 209 0 0 1 1 3 219 223 197 0 0 0 1 3 210 224 189 0 0 0 1 3 226 228 227 0 0 0 1 3 227 229 225 0 0 0 1 3 225 230 226 0 0 1 1 3 227 232 231 0 0 0 1 3 231 233 225 0 0 1 1 3 172 235 234 0 0 0 1 3 234 236 225 0 0 0 1 3 225 237 172 0 0 1 1 3 234 238 226 0 0 0 1 3 226 241 240 0 0 0 1 3 240 242 239 0 0 0 1 3 239 243 226 0 0 1 1 3 240 244 33 0 0 0 1 3 33 245 239 0 0 1 1 3 227 246 239 0 0 0 1 3 239 247 231 0 0 1 1 3 209 250 249 0 0 0 1 3 249 251 248 0 0 0 1 3 248 252 209 0 0 1 1 3 249 253 231 0 0 0 1 3 231 254 248 0 0 1 1 3 219 255 248 0 0 0 1 3 248 256 197 0 0 1 1 3 215 257 225 0 0 0 1 3 225 258 209 0 0 1 1 3 249 259 225 0 0 0 1 3 261 263 262 0 0 0 1 3 262 264 260 0 0 0 1 3 260 265 261 0 0 1 1 3 262 266 231 0 0 0 1 3 231 267 260 0 0 1 1 3 9 269 268 0 0 0 1 3 268 270 260 0 0 0 1 3 260 271 9 0 0 1 1 3 268 272 261 0 0 0 1 3 261 274 273 0 0 0 1 3 273 275 248 0 0 0 1 3 248 276 261 0 0 1 1 3 273 277 197 0 0 0 1 3 262 278 248 0 0 0 1 3 26 280 279 0 0 0 1 3 279 281 239 0 0 0 1 3 239 282 26 0 0 1 1 3 279 283 231 0 0 0 1 3 34 284 239 0 0 0 1 3 39 285 260 0 0 0 1 3 260 286 26 0 0 1 1 3 279 287 260 0 0 0 1 geomview-1.9.5/data/geom/mushroom.off0000644000175000017500000004033512310110173014470 00000000000000OFF 226 240 928 0.000000 0.471660 0.000000 0.246229 0.459663 -0.006919 0.451282 0.380737 -0.012681 0.587984 0.289183 -0.016522 0.695863 0.205838 -0.019554 0.686805 0.133226 -0.019299 0.643983 0.082083 -0.018096 0.485869 0.097236 -0.013653 0.226464 0.140172 -0.006364 0.063410 0.107339 -0.001782 0.059293 -0.023362 -0.001666 0.162231 -0.244985 -0.004559 0.216582 -0.399048 -0.006086 0.168819 -0.452717 -0.004744 0.098821 -0.458400 -0.002777 0.000000 -0.455243 0.000000 0.207595 0.459663 0.095878 0.380476 0.380737 0.175722 0.495730 0.289183 0.228952 0.586683 0.205838 0.270959 0.579045 0.133226 0.267431 0.542942 0.082083 0.250757 0.409636 0.097236 0.189190 0.190932 0.140172 0.088182 0.053461 0.107339 0.024691 0.049990 -0.023362 0.023088 0.136777 -0.244985 0.063170 0.182601 -0.399048 0.084334 0.142331 -0.452717 0.065736 0.083316 -0.458400 0.038479 0.142896 0.459663 0.142087 0.261897 0.380737 0.260413 0.341231 0.289183 0.339298 0.403838 0.205838 0.401550 0.398581 0.133226 0.396322 0.373729 0.082083 0.371612 0.281969 0.097236 0.280372 0.131426 0.140172 0.130682 0.036799 0.107339 0.036591 0.034410 -0.023362 0.034215 0.094149 -0.244985 0.093616 0.125691 -0.399048 0.124979 0.097972 -0.452717 0.097417 0.057350 -0.458400 0.057025 0.064001 0.459663 0.223138 0.117299 0.380737 0.408962 0.152831 0.289183 0.532845 0.180872 0.205838 0.630607 0.178517 0.133226 0.622398 0.167387 0.082083 0.583592 0.126289 0.097236 0.440306 0.058864 0.140172 0.205227 0.016482 0.107339 0.057464 0.015412 -0.023362 0.053732 0.042168 -0.244985 0.147017 0.056295 -0.399048 0.196272 0.043880 -0.452717 0.152988 0.025686 -0.458400 0.089554 0.000000 0.459663 0.271818 0.000000 0.380737 0.498182 0.000000 0.289183 0.649091 0.000000 0.205838 0.768182 0.000000 0.133226 0.758182 0.000000 0.082083 0.710909 0.000000 0.097236 0.536364 0.000000 0.140172 0.250000 0.000000 0.107339 0.070000 0.000000 -0.023362 0.065455 0.000000 -0.244985 0.179091 0.000000 -0.399048 0.239091 0.000000 -0.452717 0.186364 0.000000 -0.458400 0.109091 -0.097968 0.459663 0.251127 -0.179554 0.380737 0.460260 -0.233944 0.289183 0.599682 -0.276867 0.205838 0.709707 -0.273263 0.133226 0.700469 -0.256225 0.082083 0.656794 -0.193315 0.097236 0.495535 -0.090105 0.140172 0.230970 -0.025229 0.107339 0.064672 -0.023591 -0.023362 0.060472 -0.064548 -0.244985 0.165458 -0.086173 -0.399048 0.220891 -0.067169 -0.452717 0.172178 -0.039318 -0.458400 0.100787 -0.161049 0.459663 0.180883 -0.295167 0.380737 0.331517 -0.384579 0.289183 0.431940 -0.455139 0.205838 0.511190 -0.449215 0.133226 0.504536 -0.421206 0.082083 0.473078 -0.317790 0.097236 0.356926 -0.148122 0.140172 0.166364 -0.041474 0.107339 0.046582 -0.038781 -0.023362 0.043557 -0.106109 -0.244985 0.119177 -0.141659 -0.399048 0.159104 -0.110418 -0.452717 0.124017 -0.064635 -0.458400 0.072595 -0.201079 0.459663 0.110951 -0.368533 0.380737 0.203349 -0.480169 0.289183 0.264947 -0.568267 0.205838 0.313558 -0.560869 0.133226 0.309476 -0.525899 0.082083 0.290180 -0.396778 0.097236 0.218934 -0.184939 0.140172 0.102045 -0.051783 0.107339 0.028573 -0.048420 -0.023362 0.026717 -0.132483 -0.244985 0.073102 -0.176869 -0.399048 0.097593 -0.137864 -0.452717 0.076070 -0.080701 -0.458400 0.044529 -0.215974 0.459663 0.020757 -0.395831 0.380737 0.038043 -0.515736 0.289183 0.049567 -0.610360 0.205838 0.058661 -0.602415 0.133226 0.057898 -0.564854 0.082083 0.054288 -0.426169 0.097236 0.040959 -0.198638 0.140172 0.019091 -0.055619 0.107339 0.005345 -0.052007 -0.023362 0.004998 -0.142297 -0.244985 0.013676 -0.189970 -0.399048 0.018258 -0.148076 -0.452717 0.014231 -0.086678 -0.458400 0.008331 -0.210854 0.459663 -0.093160 -0.386447 0.380737 -0.170741 -0.503510 0.289183 -0.222461 -0.595891 0.205838 -0.263277 -0.588134 0.133226 -0.259850 -0.551463 0.082083 -0.243648 -0.416066 0.097236 -0.183826 -0.193929 0.140172 -0.085682 -0.054300 0.107339 -0.023991 -0.050774 -0.023362 -0.022433 -0.138924 -0.244985 -0.061379 -0.185467 -0.399048 -0.081943 -0.144565 -0.452717 -0.063872 -0.084624 -0.458400 -0.037388 -0.181022 0.459663 -0.192204 -0.331772 0.380737 -0.352268 -0.432273 0.289183 -0.458976 -0.511583 0.205838 -0.543186 -0.504923 0.133226 -0.536115 -0.473441 0.082083 -0.502688 -0.357200 0.097236 -0.379266 -0.166492 0.140172 -0.176777 -0.046618 0.107339 -0.049497 -0.043591 -0.023362 -0.046283 -0.119268 -0.244985 -0.126636 -0.159226 -0.399048 -0.169063 -0.124112 -0.452717 -0.131779 -0.072651 -0.458400 -0.077139 -0.099841 0.459663 -0.231293 -0.182987 0.380737 -0.423907 -0.238417 0.289183 -0.552317 -0.282160 0.205838 -0.653653 -0.278487 0.133226 -0.645144 -0.261123 0.082083 -0.604919 -0.197011 0.097236 -0.456397 -0.091827 0.140172 -0.212727 -0.025712 0.107339 -0.059564 -0.024042 -0.023362 -0.055696 -0.065782 -0.244985 -0.152390 -0.087820 -0.399048 -0.203445 -0.068453 -0.452717 -0.158579 -0.040070 -0.458400 -0.092826 0.000000 0.459663 -0.236729 0.000000 0.380737 -0.433871 0.000000 0.289183 -0.565299 0.000000 0.205838 -0.669017 0.000000 0.133226 -0.660307 0.000000 0.082083 -0.619137 0.000000 0.097236 -0.467124 0.000000 0.140172 -0.217727 0.000000 0.107339 -0.060964 0.000000 -0.023362 -0.057005 0.000000 -0.244985 -0.155972 0.000000 -0.399048 -0.208226 0.000000 -0.452717 -0.162306 0.000000 -0.458400 -0.095008 0.082387 0.459663 -0.203864 0.150996 0.380737 -0.373636 0.196736 0.289183 -0.486818 0.232831 0.205838 -0.576136 0.229801 0.133226 -0.568636 0.215472 0.082083 -0.533182 0.162569 0.097236 -0.402273 0.075774 0.140172 -0.187500 0.021217 0.107339 -0.052500 0.019839 -0.023362 -0.049091 0.054281 -0.244985 -0.134318 0.072467 -0.399048 -0.179318 0.056486 -0.452717 -0.139773 0.033065 -0.458400 -0.081818 0.171522 0.459663 -0.165809 0.314362 0.380737 -0.303891 0.409588 0.289183 -0.395945 0.484737 0.205838 -0.468591 0.478427 0.133226 -0.462491 0.448597 0.082083 -0.433655 0.338455 0.097236 -0.327182 0.157755 0.140172 -0.152500 0.044171 0.107339 -0.042700 0.041303 -0.023362 -0.039927 0.113010 -0.244985 -0.109245 0.150871 -0.399048 -0.145845 0.117599 -0.452717 -0.113682 0.068838 -0.458400 -0.066545 0.236516 0.459663 -0.104020 0.433481 0.380737 -0.190646 0.564791 0.289183 -0.248396 0.668416 0.205838 -0.293970 0.659714 0.133226 -0.290143 0.618581 0.082083 -0.272053 0.466704 0.097236 -0.205257 0.217532 0.140172 -0.095671 0.060909 0.107339 -0.026788 0.056954 -0.023362 -0.025048 0.155832 -0.244985 -0.068535 0.208039 -0.399048 -0.091496 0.162160 -0.452717 -0.071318 0.094923 -0.458400 -0.041747 3 0 1 16 1.000000 0.000000 1.000000 4 1 2 17 16 1.000000 0.000000 1.000000 4 2 3 18 17 1.000000 0.000000 1.000000 4 3 4 19 18 1.000000 0.000000 1.000000 4 4 5 20 19 1.000000 0.000000 1.000000 4 5 6 21 20 1.000000 0.000000 1.000000 4 6 7 22 21 1.000000 0.000000 1.000000 4 7 8 23 22 1.000000 0.000000 1.000000 4 8 9 24 23 1.000000 0.000000 1.000000 4 9 10 25 24 1.000000 0.000000 1.000000 4 10 11 26 25 1.000000 0.000000 1.000000 4 11 12 27 26 1.000000 0.000000 1.000000 4 12 13 28 27 1.000000 0.000000 1.000000 4 13 14 29 28 1.000000 0.000000 1.000000 3 14 15 29 1.000000 0.000000 1.000000 3 0 16 30 1.000000 0.000000 1.000000 4 16 17 31 30 1.000000 0.000000 1.000000 4 17 18 32 31 1.000000 0.000000 1.000000 4 18 19 33 32 1.000000 0.000000 1.000000 4 19 20 34 33 1.000000 0.000000 1.000000 4 20 21 35 34 1.000000 0.000000 1.000000 4 21 22 36 35 1.000000 0.000000 1.000000 4 22 23 37 36 1.000000 0.000000 1.000000 4 23 24 38 37 1.000000 0.000000 1.000000 4 24 25 39 38 1.000000 0.000000 1.000000 4 25 26 40 39 1.000000 0.000000 1.000000 4 26 27 41 40 1.000000 0.000000 1.000000 4 27 28 42 41 1.000000 0.000000 1.000000 4 28 29 43 42 1.000000 0.000000 1.000000 3 29 15 43 1.000000 0.000000 1.000000 3 0 30 44 1.000000 0.000000 1.000000 4 30 31 45 44 1.000000 0.000000 1.000000 4 31 32 46 45 1.000000 0.000000 1.000000 4 32 33 47 46 1.000000 0.000000 1.000000 4 33 34 48 47 1.000000 0.000000 1.000000 4 34 35 49 48 1.000000 0.000000 1.000000 4 35 36 50 49 1.000000 0.000000 1.000000 4 36 37 51 50 1.000000 0.000000 1.000000 4 37 38 52 51 1.000000 0.000000 1.000000 4 38 39 53 52 1.000000 0.000000 1.000000 4 39 40 54 53 1.000000 0.000000 1.000000 4 40 41 55 54 1.000000 0.000000 1.000000 4 41 42 56 55 1.000000 0.000000 1.000000 4 42 43 57 56 1.000000 0.000000 1.000000 3 43 15 57 1.000000 0.000000 1.000000 3 0 44 58 1.000000 0.000000 1.000000 4 44 45 59 58 1.000000 0.000000 1.000000 4 45 46 60 59 1.000000 0.000000 1.000000 4 46 47 61 60 1.000000 0.000000 1.000000 4 47 48 62 61 1.000000 0.000000 1.000000 4 48 49 63 62 1.000000 0.000000 1.000000 4 49 50 64 63 1.000000 0.000000 1.000000 4 50 51 65 64 1.000000 0.000000 1.000000 4 51 52 66 65 1.000000 0.000000 1.000000 4 52 53 67 66 1.000000 0.000000 1.000000 4 53 54 68 67 1.000000 0.000000 1.000000 4 54 55 69 68 1.000000 0.000000 1.000000 4 55 56 70 69 1.000000 0.000000 1.000000 4 56 57 71 70 1.000000 0.000000 1.000000 3 57 15 71 1.000000 0.000000 1.000000 3 0 58 72 1.000000 0.000000 1.000000 4 58 59 73 72 1.000000 0.000000 1.000000 4 59 60 74 73 1.000000 0.000000 1.000000 4 60 61 75 74 1.000000 0.000000 1.000000 4 61 62 76 75 1.000000 0.000000 1.000000 4 62 63 77 76 1.000000 0.000000 1.000000 4 63 64 78 77 1.000000 0.000000 1.000000 4 64 65 79 78 1.000000 0.000000 1.000000 4 65 66 80 79 1.000000 0.000000 1.000000 4 66 67 81 80 1.000000 0.000000 1.000000 4 67 68 82 81 1.000000 0.000000 1.000000 4 68 69 83 82 1.000000 0.000000 1.000000 4 69 70 84 83 1.000000 0.000000 1.000000 4 70 71 85 84 1.000000 0.000000 1.000000 3 71 15 85 1.000000 0.000000 1.000000 3 0 72 86 1.000000 0.000000 1.000000 4 72 73 87 86 1.000000 0.000000 1.000000 4 73 74 88 87 1.000000 0.000000 1.000000 4 74 75 89 88 1.000000 0.000000 1.000000 4 75 76 90 89 1.000000 0.000000 1.000000 4 76 77 91 90 1.000000 0.000000 1.000000 4 77 78 92 91 1.000000 0.000000 1.000000 4 78 79 93 92 1.000000 0.000000 1.000000 4 79 80 94 93 1.000000 0.000000 1.000000 4 80 81 95 94 1.000000 0.000000 1.000000 4 81 82 96 95 1.000000 0.000000 1.000000 4 82 83 97 96 1.000000 0.000000 1.000000 4 83 84 98 97 1.000000 0.000000 1.000000 4 84 85 99 98 1.000000 0.000000 1.000000 3 85 15 99 1.000000 0.000000 1.000000 3 0 86 100 1.000000 0.000000 1.000000 4 86 87 101 100 1.000000 0.000000 1.000000 4 87 88 102 101 1.000000 0.000000 1.000000 4 88 89 103 102 1.000000 0.000000 1.000000 4 89 90 104 103 1.000000 0.000000 1.000000 4 90 91 105 104 1.000000 0.000000 1.000000 4 91 92 106 105 1.000000 0.000000 1.000000 4 92 93 107 106 1.000000 0.000000 1.000000 4 93 94 108 107 1.000000 0.000000 1.000000 4 94 95 109 108 1.000000 0.000000 1.000000 4 95 96 110 109 1.000000 0.000000 1.000000 4 96 97 111 110 1.000000 0.000000 1.000000 4 97 98 112 111 1.000000 0.000000 1.000000 4 98 99 113 112 1.000000 0.000000 1.000000 3 99 15 113 1.000000 0.000000 1.000000 3 0 100 114 1.000000 0.000000 1.000000 4 100 101 115 114 1.000000 0.000000 1.000000 4 101 102 116 115 1.000000 0.000000 1.000000 4 102 103 117 116 1.000000 0.000000 1.000000 4 103 104 118 117 1.000000 0.000000 1.000000 4 104 105 119 118 1.000000 0.000000 1.000000 4 105 106 120 119 1.000000 0.000000 1.000000 4 106 107 121 120 1.000000 0.000000 1.000000 4 107 108 122 121 1.000000 0.000000 1.000000 4 108 109 123 122 1.000000 0.000000 1.000000 4 109 110 124 123 1.000000 0.000000 1.000000 4 110 111 125 124 1.000000 0.000000 1.000000 4 111 112 126 125 1.000000 0.000000 1.000000 4 112 113 127 126 1.000000 0.000000 1.000000 3 113 15 127 1.000000 0.000000 1.000000 3 0 114 128 1.000000 0.000000 1.000000 4 114 115 129 128 1.000000 0.000000 1.000000 4 115 116 130 129 1.000000 0.000000 1.000000 4 116 117 131 130 1.000000 0.000000 1.000000 4 117 118 132 131 1.000000 0.000000 1.000000 4 118 119 133 132 1.000000 0.000000 1.000000 4 119 120 134 133 1.000000 0.000000 1.000000 4 120 121 135 134 1.000000 0.000000 1.000000 4 121 122 136 135 1.000000 0.000000 1.000000 4 122 123 137 136 1.000000 0.000000 1.000000 4 123 124 138 137 1.000000 0.000000 1.000000 4 124 125 139 138 1.000000 0.000000 1.000000 4 125 126 140 139 1.000000 0.000000 1.000000 4 126 127 141 140 1.000000 0.000000 1.000000 3 127 15 141 1.000000 0.000000 1.000000 3 0 128 142 1.000000 0.000000 1.000000 4 128 129 143 142 1.000000 0.000000 1.000000 4 129 130 144 143 1.000000 0.000000 1.000000 4 130 131 145 144 1.000000 0.000000 1.000000 4 131 132 146 145 1.000000 0.000000 1.000000 4 132 133 147 146 1.000000 0.000000 1.000000 4 133 134 148 147 1.000000 0.000000 1.000000 4 134 135 149 148 1.000000 0.000000 1.000000 4 135 136 150 149 1.000000 0.000000 1.000000 4 136 137 151 150 1.000000 0.000000 1.000000 4 137 138 152 151 1.000000 0.000000 1.000000 4 138 139 153 152 1.000000 0.000000 1.000000 4 139 140 154 153 1.000000 0.000000 1.000000 4 140 141 155 154 1.000000 0.000000 1.000000 3 141 15 155 1.000000 0.000000 1.000000 3 0 142 156 1.000000 0.000000 1.000000 4 142 143 157 156 1.000000 0.000000 1.000000 4 143 144 158 157 1.000000 0.000000 1.000000 4 144 145 159 158 1.000000 0.000000 1.000000 4 145 146 160 159 1.000000 0.000000 1.000000 4 146 147 161 160 1.000000 0.000000 1.000000 4 147 148 162 161 1.000000 0.000000 1.000000 4 148 149 163 162 1.000000 0.000000 1.000000 4 149 150 164 163 1.000000 0.000000 1.000000 4 150 151 165 164 1.000000 0.000000 1.000000 4 151 152 166 165 1.000000 0.000000 1.000000 4 152 153 167 166 1.000000 0.000000 1.000000 4 153 154 168 167 1.000000 0.000000 1.000000 4 154 155 169 168 1.000000 0.000000 1.000000 3 155 15 169 1.000000 0.000000 1.000000 3 0 156 170 1.000000 0.000000 1.000000 4 156 157 171 170 1.000000 0.000000 1.000000 4 157 158 172 171 1.000000 0.000000 1.000000 4 158 159 173 172 1.000000 0.000000 1.000000 4 159 160 174 173 1.000000 0.000000 1.000000 4 160 161 175 174 1.000000 0.000000 1.000000 4 161 162 176 175 1.000000 0.000000 1.000000 4 162 163 177 176 1.000000 0.000000 1.000000 4 163 164 178 177 1.000000 0.000000 1.000000 4 164 165 179 178 1.000000 0.000000 1.000000 4 165 166 180 179 1.000000 0.000000 1.000000 4 166 167 181 180 1.000000 0.000000 1.000000 4 167 168 182 181 1.000000 0.000000 1.000000 4 168 169 183 182 1.000000 0.000000 1.000000 3 169 15 183 1.000000 0.000000 1.000000 3 0 170 184 1.000000 0.000000 1.000000 4 170 171 185 184 1.000000 0.000000 1.000000 4 171 172 186 185 1.000000 0.000000 1.000000 4 172 173 187 186 1.000000 0.000000 1.000000 4 173 174 188 187 1.000000 0.000000 1.000000 4 174 175 189 188 1.000000 0.000000 1.000000 4 175 176 190 189 1.000000 0.000000 1.000000 4 176 177 191 190 1.000000 0.000000 1.000000 4 177 178 192 191 1.000000 0.000000 1.000000 4 178 179 193 192 1.000000 0.000000 1.000000 4 179 180 194 193 1.000000 0.000000 1.000000 4 180 181 195 194 1.000000 0.000000 1.000000 4 181 182 196 195 1.000000 0.000000 1.000000 4 182 183 197 196 1.000000 0.000000 1.000000 3 183 15 197 1.000000 0.000000 1.000000 3 0 184 198 1.000000 0.000000 1.000000 4 184 185 199 198 1.000000 0.000000 1.000000 4 185 186 200 199 1.000000 0.000000 1.000000 4 186 187 201 200 1.000000 0.000000 1.000000 4 187 188 202 201 1.000000 0.000000 1.000000 4 188 189 203 202 1.000000 0.000000 1.000000 4 189 190 204 203 1.000000 0.000000 1.000000 4 190 191 205 204 1.000000 0.000000 1.000000 4 191 192 206 205 1.000000 0.000000 1.000000 4 192 193 207 206 1.000000 0.000000 1.000000 4 193 194 208 207 1.000000 0.000000 1.000000 4 194 195 209 208 1.000000 0.000000 1.000000 4 195 196 210 209 1.000000 0.000000 1.000000 4 196 197 211 210 1.000000 0.000000 1.000000 3 197 15 211 1.000000 0.000000 1.000000 3 0 198 212 1.000000 0.000000 1.000000 4 198 199 213 212 1.000000 0.000000 1.000000 4 199 200 214 213 1.000000 0.000000 1.000000 4 200 201 215 214 1.000000 0.000000 1.000000 4 201 202 216 215 1.000000 0.000000 1.000000 4 202 203 217 216 1.000000 0.000000 1.000000 4 203 204 218 217 1.000000 0.000000 1.000000 4 204 205 219 218 1.000000 0.000000 1.000000 4 205 206 220 219 1.000000 0.000000 1.000000 4 206 207 221 220 1.000000 0.000000 1.000000 4 207 208 222 221 1.000000 0.000000 1.000000 4 208 209 223 222 1.000000 0.000000 1.000000 4 209 210 224 223 1.000000 0.000000 1.000000 4 210 211 225 224 1.000000 0.000000 1.000000 3 211 15 225 1.000000 0.000000 1.000000 3 0 212 1 1.000000 0.000000 1.000000 4 212 213 2 1 1.000000 0.000000 1.000000 4 213 214 3 2 1.000000 0.000000 1.000000 4 214 215 4 3 1.000000 0.000000 1.000000 4 215 216 5 4 1.000000 0.000000 1.000000 4 216 217 6 5 1.000000 0.000000 1.000000 4 217 218 7 6 1.000000 0.000000 1.000000 4 218 219 8 7 1.000000 0.000000 1.000000 4 219 220 9 8 1.000000 0.000000 1.000000 4 220 221 10 9 1.000000 0.000000 1.000000 4 221 222 11 10 1.000000 0.000000 1.000000 4 222 223 12 11 1.000000 0.000000 1.000000 4 223 224 13 12 1.000000 0.000000 1.000000 4 224 225 14 13 1.000000 0.000000 1.000000 3 225 15 14 1.000000 0.000000 1.000000 geomview-1.9.5/data/geom/nsquare.quad0000644000175000017500000000010612310110173014445 00000000000000NQUAD -1 -1 0 0 0 -1 1 -1 0 0 0 -1 1 1 0 0 0 -1 -1 1 0 0 0 -1 geomview-1.9.5/data/geom/octa.off0000644000175000017500000000032212310110173013535 00000000000000OFF 6 8 12 0.0 0.0 1.0 1.0 0.0 0.0 0.0 1.0 0.0 -1.0 0.0 0.0 0.0 -1.0 0.0 0.0 0.0 -1.0 3 1 0 4 .7 0 0 3 4 0 3 .7 0 0 3 3 0 2 .7 0 0 3 2 0 1 .7 0 0 3 1 5 2 .7 0 0 3 2 5 3 .7 0 0 3 3 5 4 .7 0 0 3 4 5 1 .7 0 0 geomview-1.9.5/data/geom/octant.bez0000644000175000017500000000052512310110173014112 00000000000000BEZ224 #1 0 0 1 -1 0 -1 -1 0 0 2 2 #-1 1 0 -1 1 -1 1 1 0 0 -2 -2 #0 -2 0 2 0 2 -2 -2 0 0 4 4 #1 0 0 1 1 0 1 1 0 0 2 2 #1 1 0 1 1 1 1 1 0 0 2 2 #0 2 0 2 0 2 2 2 0 0 4 4 #1 0 0 1 1 1 0 1 0 2 0 2 #1 0 1 1 1 1 1 1 0 2 2 2 #0 0 2 2 0 0 2 2 0 0 4 4 0 0 1 1 0 1 1 1 0 2 0 2 1 0 1 1 1 1 1 1 2 2 0 2 2 0 0 2 2 0 0 2 4 0 0 4 geomview-1.9.5/data/geom/office.oogl0000644000175000017500000112326112310110173014241 00000000000000OFF 6878 3460 0 1543.09 2273.32 1172.05 1542.4 2272.14 1177.69 1543.04 2273.24 1172 1542.36 2272.06 1177.64 1545.87 2270.14 1177.69 1546.55 2271.32 1172.05 1545.82 2270.06 1177.64 1546.5 2271.24 1172 1542.48 2272.13 1177.55 1543.13 2273.26 1172.19 1545.83 2270.2 1177.55 1546.48 2271.33 1172.19 1542.43 2272.05 1177.5 1543.08 2273.18 1172.14 1546.43 2271.24 1172.14 1545.78 2270.12 1177.5 1546.45 2271.28 1172.17 1543.1 2273.22 1172.17 1542.45 2272.09 1177.52 1545.8 2270.16 1177.52 1544.27 2271.37 1176.02 1544.28 2271.46 1175.72 1544.35 2271.42 1175.72 1543.77 2270.51 1172 1543.76 2270.65 1172 1543.9 2270.57 1172 1576.95 2241.16 1164.7 1576.84 2241.64 1165.28 1556.67 2236.87 1165.28 1556.78 2236.39 1164.7 1578.13 2240.86 1165.26 1577.49 2240.82 1164.64 1577.6 2240.36 1164.55 1578.24 2240.4 1165.17 1577.29 2241.68 1165.74 1578.05 2241.22 1165.74 1578.35 2239.95 1173.14 1577.59 2240.41 1173.25 1555.97 2235.13 1165.17 1556.56 2235.39 1164.55 1556.45 2235.84 1164.64 1555.86 2235.59 1165.26 1557.1 2235.06 1164.48 1557.26 2234.35 1164.99 1577.43 2239.12 1164.99 1577.27 2239.83 1164.48 1556.85 2234.17 1165.43 1556.09 2234.63 1165.54 1556.39 2233.37 1172.93 1557.15 2232.9 1172.93 1556.55 2235.43 1173.25 1556.08 2234.68 1173.14 1555.78 2235.95 1165.74 1556.25 2236.71 1165.74 1557.17 2234.75 1174.2 1557 2235.46 1173.69 1577.17 2240.23 1173.69 1577.34 2239.52 1174.2 1556.2 2234.18 1173.5 1556.84 2234.22 1174.12 1556.95 2233.76 1174.04 1556.31 2233.72 1173.42 1578.57 2238.99 1173.42 1577.98 2238.74 1174.04 1577.88 2239.19 1174.12 1578.46 2239.45 1173.5 1578.19 2237.88 1172.93 1578.66 2238.63 1172.93 1578.36 2239.9 1165.54 1577.89 2239.15 1165.43 1577.66 2238.19 1173.97 1577.77 2237.71 1173.39 1557.6 2232.94 1173.39 1557.49 2233.42 1173.97 1577.05 2240.75 1164.45 1556.88 2235.98 1164.45 1556.99 2235.52 1164.37 1577.16 2240.29 1164.37 1555.81 2235.02 1165.61 1555.7 2235.47 1165.7 1556 2234.21 1173.06 1556.11 2233.75 1172.98 1577.45 2239.06 1174.3 1577.56 2238.6 1174.22 1557.39 2233.83 1174.22 1557.28 2234.29 1174.3 1578.44 2240.37 1165.61 1578.73 2239.11 1172.98 1578.63 2239.56 1173.06 1578.33 2240.83 1165.7 1572.82 2258.62 1161.18 1572.97 2258.01 1161.82 1552.79 2253.24 1161.82 1552.65 2253.85 1161.18 1574.01 2258.26 1160.74 1573.25 2258.73 1160.74 1573.25 2258.73 1160.26 1574.01 2258.26 1160.26 1573.5 2257.68 1161.82 1574.12 2257.82 1161.18 1578.6 2238.87 1161.18 1577.99 2238.72 1161.82 1551.75 2252.99 1160.26 1552.22 2253.75 1160.26 1552.22 2253.75 1160.74 1551.75 2252.99 1160.74 1552.65 2253.85 1159.82 1552.79 2253.24 1159.18 1572.97 2258.01 1159.18 1572.82 2258.62 1159.82 1552.46 2252.7 1159.18 1551.85 2252.56 1159.82 1556.34 2233.6 1159.82 1556.95 2233.75 1159.18 1556.95 2233.75 1161.82 1556.34 2233.6 1161.18 1551.85 2252.56 1161.18 1552.46 2252.7 1161.82 1557.63 2232.8 1161.18 1557.49 2233.42 1161.82 1577.66 2238.19 1161.82 1577.8 2237.57 1161.18 1556.44 2233.17 1160.74 1557.2 2232.7 1160.74 1557.2 2232.7 1160.26 1556.44 2233.17 1160.26 1578.7 2238.44 1160.26 1578.24 2237.68 1160.26 1578.24 2237.68 1160.74 1578.7 2238.44 1160.74 1577.99 2238.72 1159.18 1578.6 2238.87 1159.82 1574.12 2257.82 1159.82 1573.5 2257.68 1159.18 1577.8 2237.57 1159.82 1577.66 2238.19 1159.18 1557.49 2233.42 1159.18 1557.63 2232.8 1159.82 1572.78 2258.8 1160.74 1552.61 2254.03 1160.74 1552.61 2254.03 1160.26 1572.78 2258.8 1160.26 1551.67 2252.51 1160.26 1551.67 2252.51 1160.74 1556.16 2233.56 1160.74 1556.16 2233.56 1160.26 1577.84 2237.39 1160.74 1577.84 2237.39 1160.26 1557.67 2232.62 1160.26 1557.67 2232.62 1160.74 1574.3 2257.87 1160.26 1578.78 2238.91 1160.26 1578.78 2238.91 1160.74 1574.3 2257.87 1160.74 1552.26 2253.57 1159.82 1551.93 2253.03 1159.82 1552.36 2253.13 1159.37 1552.26 2253.57 1161.18 1552.36 2253.13 1161.63 1551.93 2253.03 1161.18 1556.62 2233.21 1159.82 1557.15 2232.88 1159.82 1557.05 2233.31 1159.37 1557.15 2232.88 1161.18 1556.62 2233.21 1161.18 1557.05 2233.31 1161.63 1578.09 2238.29 1159.37 1578.19 2237.86 1159.82 1578.52 2238.39 1159.82 1578.52 2238.39 1161.18 1578.19 2237.86 1161.18 1578.09 2238.29 1161.63 1573.4 2258.11 1159.37 1573.83 2258.22 1159.82 1573.3 2258.55 1159.82 1573.3 2258.55 1161.18 1573.83 2258.22 1161.18 1573.4 2258.11 1161.63 1578.16 2239.93 1165.1 1577.71 2239.91 1164.66 1577.83 2239.4 1165.02 1577.85 2241.25 1165.3 1577.32 2241.56 1165.28 1577.39 2241.24 1164.88 1577.65 2240.16 1173.65 1578.18 2239.83 1173.58 1577.77 2239.65 1174.02 1578.08 2238.32 1173.79 1578.49 2238.52 1173.37 1578.16 2237.99 1173.39 1556.61 2235.18 1173.65 1556.73 2234.68 1174.02 1556.28 2234.65 1173.58 1556.59 2233.33 1173.37 1557.04 2233.35 1173.79 1557.12 2233.02 1173.39 1556.28 2236.59 1165.28 1555.94 2236.06 1165.3 1556.35 2236.26 1164.88 1556.67 2234.93 1164.66 1556.25 2234.75 1165.1 1556.79 2234.43 1165.02 1556.94 2235.71 1173.28 1556.94 2235.71 1173.28 1556.64 2236.99 1165.74 1556.64 2236.99 1165.74 1576.81 2241.76 1165.74 1576.81 2241.76 1165.74 1577.11 2240.48 1173.28 1577.11 2240.48 1173.28 1577.55 2238.62 1162 1577.55 2238.62 1162 1557.38 2233.85 1162 1557.38 2233.85 1162 1552.9 2252.8 1162 1552.9 2252.8 1162 1573.07 2257.58 1162 1573.07 2257.58 1162 1573.07 2257.58 1159 1573.07 2257.58 1159 1552.9 2252.8 1159 1552.9 2252.8 1159 1557.38 2233.85 1159 1557.38 2233.85 1159 1577.55 2238.62 1159 1577.55 2238.62 1159 1577.49 2238.87 1165.39 1577.49 2238.87 1165.39 1557.32 2234.1 1165.39 1557.32 2234.1 1165.39 1557.63 2232.82 1172.93 1557.63 2232.82 1172.93 1577.8 2237.59 1172.93 1577.8 2237.59 1172.93 1579.07 2237.69 1141 1578.73 2239.14 1141 1579.46 2239.32 1141 1579.8 2237.86 1141 1579.46 2239.32 1141 1579.46 2239.32 1167 1579.8 2237.86 1167 1579.8 2237.86 1141 1579.8 2237.86 1167 1579.07 2237.69 1167 1579.07 2237.69 1141 1579.8 2237.86 1141 1578.73 2239.14 1141 1579.07 2237.69 1141 1579.07 2237.69 1167 1578.73 2239.14 1167 1579.46 2239.32 1167 1579.46 2239.32 1141 1578.73 2239.14 1141 1578.73 2239.14 1167 1556.1 2233.79 1141 1556.1 2233.79 1167 1556.45 2232.33 1167 1556.45 2232.33 1141 1556.45 2232.33 1167 1555.72 2232.16 1167 1555.72 2232.16 1141 1556.45 2232.33 1141 1555.37 2233.62 1141 1555.72 2232.16 1141 1555.72 2232.16 1167 1555.37 2233.62 1167 1556.1 2233.79 1167 1556.1 2233.79 1141 1555.37 2233.62 1141 1555.37 2233.62 1167 1574.85 2258.78 1141 1574.85 2258.78 1167 1575.2 2257.32 1167 1575.2 2257.32 1141 1575.2 2257.32 1167 1574.47 2257.15 1167 1574.47 2257.15 1141 1575.2 2257.32 1141 1574.12 2258.61 1141 1574.47 2257.15 1141 1574.47 2257.15 1167 1574.12 2258.61 1167 1574.85 2258.78 1167 1574.85 2258.78 1141 1574.12 2258.61 1141 1574.12 2258.61 1167 1551.49 2253.25 1141 1551.49 2253.25 1167 1551.84 2251.79 1167 1551.84 2251.79 1141 1551.84 2251.79 1167 1551.11 2251.62 1167 1551.11 2251.62 1141 1551.84 2251.79 1141 1550.77 2253.08 1141 1551.11 2251.62 1141 1551.11 2251.62 1167 1550.77 2253.08 1167 1551.49 2253.25 1167 1551.49 2253.25 1141 1550.77 2253.08 1141 1550.77 2253.08 1167 1574.29 2257.88 1156.37 1551.67 2252.52 1156.37 1574.35 2257.62 1156.27 1551.73 2252.27 1156.27 1574.38 2257.51 1156 1551.75 2252.16 1156 1574.35 2257.62 1155.73 1551.73 2252.27 1155.73 1574.29 2257.88 1155.62 1551.67 2252.52 1155.62 1574.23 2258.14 1155.73 1551.61 2252.78 1155.73 1574.21 2258.24 1156 1551.58 2252.89 1156 1574.23 2258.14 1156.27 1551.61 2252.78 1156.27 1579.07 2237.69 1167 1574.12 2258.61 1167 1579.28 2237.74 1166.47 1574.33 2258.66 1166.47 1579.8 2237.86 1166.25 1574.85 2258.78 1166.25 1580.32 2237.98 1166.47 1575.37 2258.9 1166.47 1580.53 2238.03 1167 1575.58 2258.95 1167 1580.32 2237.98 1167.53 1575.37 2258.9 1167.53 1579.8 2237.86 1167.75 1574.85 2258.78 1167.75 1579.28 2237.74 1167.53 1574.33 2258.66 1167.53 1579.07 2237.69 1167 1579.28 2237.74 1166.47 1579.8 2237.86 1166.25 1580.32 2237.98 1166.47 1580.53 2238.03 1167 1580.32 2237.98 1167.53 1579.8 2237.86 1167.75 1579.28 2237.74 1167.53 1574.12 2258.61 1167 1574.33 2258.66 1167.53 1574.85 2258.78 1167.75 1575.37 2258.9 1167.53 1575.58 2258.95 1167 1575.37 2258.9 1166.47 1574.85 2258.78 1166.25 1574.33 2258.66 1166.47 1554.99 2231.99 1167 1550.04 2252.91 1167 1555.2 2232.04 1166.47 1550.25 2252.96 1166.47 1555.72 2232.16 1166.25 1550.77 2253.08 1166.25 1556.23 2232.28 1166.47 1551.28 2253.2 1166.47 1556.45 2232.33 1167 1551.49 2253.25 1167 1556.23 2232.28 1167.53 1551.28 2253.2 1167.53 1555.72 2232.16 1167.75 1550.77 2253.08 1167.75 1555.2 2232.04 1167.53 1550.25 2252.96 1167.53 1554.99 2231.99 1167 1555.2 2232.04 1166.47 1555.72 2232.16 1166.25 1556.23 2232.28 1166.47 1556.45 2232.33 1167 1556.23 2232.28 1167.53 1555.72 2232.16 1167.75 1555.2 2232.04 1167.53 1550.04 2252.91 1167 1550.25 2252.96 1167.53 1550.77 2253.08 1167.75 1551.28 2253.2 1167.53 1551.49 2253.25 1167 1551.28 2253.2 1166.47 1550.77 2253.08 1166.25 1550.25 2252.96 1166.47 1559.07 2273.46 1172.11 1559.1 2273.59 1172.14 1558.81 2272.33 1176.97 1558.78 2272.19 1176.94 1558.66 2272.11 1177.68 1558.65 2272.08 1177.67 1558.61 2272.04 1177.92 1558.93 2273.42 1172.09 1558.64 2272.16 1176.92 1558.62 2272.07 1177.67 1558.82 2273.51 1172.11 1558.53 2272.25 1176.94 1558.59 2272.09 1177.67 1558.85 2273.65 1172.14 1558.56 2272.39 1176.97 1558.6 2272.13 1177.68 1558.99 2273.69 1172.16 1558.7 2272.43 1176.99 1558.63 2272.14 1177.69 1558.99 2273.53 1172.12 1558.95 2273.52 1172.11 1558.93 2273.54 1172.12 1558.93 2273.58 1172.13 1558.97 2273.59 1172.13 1558.99 2273.56 1172.13 1559.38 2273.36 1172.11 1559.31 2273.24 1172.14 1559.89 2274.4 1176.97 1559.95 2274.52 1176.94 1559.91 2274.66 1177.68 1559.93 2274.69 1177.67 1559.92 2274.75 1177.92 1559.29 2273.48 1172.09 1559.87 2274.64 1176.92 1559.91 2274.72 1177.67 1559.15 2273.47 1172.11 1559.73 2274.63 1176.94 1559.87 2274.72 1177.67 1559.09 2273.35 1172.14 1559.66 2274.51 1176.97 1559.86 2274.69 1177.68 1559.17 2273.23 1172.16 1559.75 2274.39 1176.99 1559.88 2274.66 1177.69 1559.27 2273.36 1172.12 1559.25 2273.39 1172.11 1559.21 2273.38 1172.12 1559.2 2273.35 1172.13 1559.22 2273.32 1172.13 1559.25 2273.33 1172.13 1559.16 2274.12 1172.09 1559.26 2274.03 1172.12 1558.29 2274.88 1176.95 1558.18 2274.97 1176.92 1558.04 2274.97 1177.67 1558.01 2275 1177.66 1557.96 2275 1177.9 1559.02 2274.07 1172.07 1558.05 2274.92 1176.9 1557.98 2274.98 1177.65 1558.99 2273.93 1172.09 1558.02 2274.78 1176.92 1557.97 2274.95 1177.66 1559.1 2273.84 1172.12 1558.12 2274.69 1176.95 1558 2274.93 1177.67 1559.23 2273.89 1172.14 1558.26 2274.74 1176.97 1558.03 2274.94 1177.67 1559.14 2274.02 1172.1 1559.1 2274.01 1172.1 1559.09 2273.97 1172.1 1559.12 2273.95 1172.11 1559.15 2273.96 1172.11 1559.16 2273.99 1172.11 1558.68 2273.48 1172.11 1558.77 2273.58 1172.14 1557.89 2272.63 1176.97 1557.8 2272.53 1176.94 1557.66 2272.51 1177.68 1557.63 2272.48 1177.67 1557.58 2272.47 1177.92 1558.54 2273.51 1172.09 1557.66 2272.56 1176.92 1557.6 2272.49 1177.67 1558.49 2273.65 1172.11 1557.62 2272.69 1176.94 1557.59 2272.53 1177.67 1558.59 2273.75 1172.14 1557.71 2272.8 1176.97 1557.61 2272.55 1177.68 1558.73 2273.72 1172.16 1557.85 2272.76 1176.99 1557.65 2272.54 1177.69 1558.64 2273.58 1172.12 1558.61 2273.59 1172.11 1558.6 2273.62 1172.12 1558.62 2273.65 1172.13 1558.65 2273.64 1172.13 1558.67 2273.6 1172.13 1559.99 2273.69 1172 1559.97 2273.45 1172 1559.91 2273.21 1172 1559.81 2272.99 1172 1559.66 2272.79 1172 1559.48 2272.63 1172 1559.27 2272.51 1172 1559.03 2272.43 1172 1558.79 2272.39 1172 1558.55 2272.41 1172 1558.31 2272.47 1172 1558.09 2272.57 1172 1557.89 2272.72 1172 1557.73 2272.9 1172 1557.61 2273.11 1172 1557.53 2273.35 1172 1557.49 2273.59 1172 1557.51 2273.83 1172 1557.57 2274.07 1172 1557.67 2274.29 1172 1557.82 2274.49 1172 1558 2274.65 1172 1558.21 2274.77 1172 1558.45 2274.85 1172 1558.69 2274.89 1172 1558.93 2274.87 1172 1559.17 2274.81 1172 1559.39 2274.71 1172 1559.59 2274.56 1172 1559.75 2274.38 1172 1559.87 2274.17 1172 1559.95 2273.93 1172 1560.49 2273.71 1177 1560.47 2273.37 1177 1560.38 2273.04 1177 1560.23 2272.73 1177 1560.03 2272.45 1177 1559.77 2272.23 1177 1559.48 2272.05 1177 1559.15 2271.94 1177 1558.81 2271.89 1177 1558.47 2271.91 1177 1558.14 2272 1177 1557.83 2272.15 1177 1557.55 2272.35 1177 1557.33 2272.61 1177 1557.15 2272.9 1177 1557.04 2273.23 1177 1556.99 2273.57 1177 1557.01 2273.91 1177 1557.1 2274.24 1177 1557.25 2274.55 1177 1557.45 2274.83 1177 1557.71 2275.05 1177 1558 2275.23 1177 1558.33 2275.34 1177 1558.67 2275.39 1177 1559.01 2275.37 1177 1559.34 2275.28 1177 1559.65 2275.13 1177 1559.93 2274.93 1177 1560.15 2274.67 1177 1560.33 2274.38 1177 1560.44 2274.05 1177 1560.36 2273.71 1177 1560.32 2274.02 1177 1560.21 2274.32 1177 1560.05 2274.6 1177 1559.84 2274.84 1177 1559.59 2275.03 1177 1559.3 2275.17 1177 1558.99 2275.25 1177 1558.67 2275.26 1177 1558.36 2275.22 1177 1558.06 2275.11 1177 1557.78 2274.95 1177 1557.54 2274.74 1177 1557.35 2274.49 1177 1557.21 2274.2 1177 1557.13 2273.89 1177 1557.12 2273.57 1177 1557.16 2273.26 1177 1557.27 2272.96 1177 1557.43 2272.68 1177 1557.64 2272.44 1177 1557.89 2272.25 1177 1558.18 2272.11 1177 1558.49 2272.03 1177 1558.81 2272.02 1177 1559.12 2272.06 1177 1559.42 2272.17 1177 1559.7 2272.33 1177 1559.94 2272.54 1177 1560.13 2272.79 1177 1560.27 2273.08 1177 1560.35 2273.39 1177 1559.86 2273.69 1172.12 1559.83 2273.9 1172.12 1559.76 2274.11 1172.12 1559.65 2274.3 1172.12 1559.5 2274.47 1172.12 1559.33 2274.6 1172.12 1559.13 2274.7 1172.12 1558.91 2274.75 1172.12 1558.69 2274.76 1172.12 1558.48 2274.73 1172.12 1558.27 2274.66 1172.12 1558.08 2274.55 1172.12 1557.91 2274.4 1172.12 1557.78 2274.23 1172.12 1557.68 2274.03 1172.12 1557.63 2273.81 1172.12 1557.62 2273.59 1172.12 1557.65 2273.38 1172.12 1557.72 2273.17 1172.12 1557.83 2272.98 1172.12 1557.98 2272.81 1172.12 1558.15 2272.68 1172.12 1558.35 2272.58 1172.12 1558.57 2272.53 1172.12 1558.79 2272.52 1172.12 1559 2272.55 1172.12 1559.21 2272.62 1172.12 1559.4 2272.73 1172.12 1559.57 2272.88 1172.12 1559.7 2273.05 1172.12 1559.8 2273.25 1172.12 1559.85 2273.47 1172.12 1558.74 2273.64 1172.12 1597.13 2289.46 1141 1597.08 2288.73 1141 1596.9 2288.02 1141 1596.58 2287.36 1141 1596.14 2286.77 1141 1595.59 2286.28 1141 1594.96 2285.91 1141 1594.26 2285.67 1141 1593.53 2285.56 1141 1592.8 2285.61 1141 1592.09 2285.79 1141 1591.43 2286.11 1141 1590.84 2286.55 1141 1590.35 2287.1 1141 1589.98 2287.73 1141 1589.74 2288.43 1141 1589.63 2289.16 1141 1589.68 2289.89 1141 1589.86 2290.6 1141 1590.18 2291.26 1141 1590.62 2291.85 1141 1591.17 2292.34 1141 1591.8 2292.71 1141 1592.5 2292.95 1141 1593.23 2293.06 1141 1593.96 2293.01 1141 1594.67 2292.83 1141 1595.33 2292.51 1141 1595.92 2292.07 1141 1596.41 2291.52 1141 1596.78 2290.89 1141 1597.02 2290.19 1141 1598.63 2289.53 1156 1598.57 2288.5 1156 1598.31 2287.5 1156 1597.86 2286.58 1156 1597.24 2285.75 1156 1596.47 2285.07 1156 1595.59 2284.55 1156 1594.62 2284.21 1156 1593.6 2284.06 1156 1592.57 2284.12 1156 1591.57 2284.38 1156 1590.65 2284.83 1156 1589.82 2285.45 1156 1589.14 2286.22 1156 1588.62 2287.1 1156 1588.28 2288.07 1156 1588.13 2289.09 1156 1588.19 2290.12 1156 1588.45 2291.12 1156 1588.9 2292.04 1156 1589.52 2292.87 1156 1590.29 2293.55 1156 1591.17 2294.07 1156 1592.14 2294.41 1156 1593.16 2294.56 1156 1594.19 2294.5 1156 1595.19 2294.24 1156 1596.11 2293.79 1156 1596.94 2293.17 1156 1597.62 2292.4 1156 1598.14 2291.52 1156 1598.48 2290.55 1156 1598.25 2289.51 1156 1598.12 2290.46 1156 1597.8 2291.36 1156 1597.32 2292.18 1156 1596.68 2292.9 1156 1595.92 2293.47 1156 1595.06 2293.89 1156 1594.13 2294.13 1156 1593.18 2294.18 1156 1592.23 2294.05 1156 1591.33 2293.73 1156 1590.51 2293.25 1156 1589.79 2292.61 1156 1589.22 2291.85 1156 1588.8 2290.99 1156 1588.56 2290.06 1156 1588.51 2289.11 1156 1588.64 2288.16 1156 1588.96 2287.26 1156 1589.44 2286.44 1156 1590.08 2285.72 1156 1590.84 2285.15 1156 1591.7 2284.73 1156 1592.63 2284.49 1156 1593.58 2284.44 1156 1594.53 2284.57 1156 1595.43 2284.89 1156 1596.25 2285.37 1156 1596.97 2286.01 1156 1597.54 2286.77 1156 1597.96 2287.63 1156 1598.2 2288.56 1156 1596.75 2289.45 1141.37 1596.66 2290.1 1141.37 1596.44 2290.73 1141.37 1596.11 2291.3 1141.37 1595.67 2291.79 1141.37 1595.14 2292.19 1141.37 1594.54 2292.48 1141.37 1593.9 2292.64 1141.37 1593.24 2292.68 1141.37 1592.59 2292.59 1141.37 1591.96 2292.37 1141.37 1591.39 2292.04 1141.37 1590.9 2291.6 1141.37 1590.5 2291.07 1141.37 1590.21 2290.47 1141.37 1590.05 2289.83 1141.37 1590.01 2289.17 1141.37 1590.1 2288.52 1141.37 1590.32 2287.89 1141.37 1590.65 2287.32 1141.37 1591.09 2286.83 1141.37 1591.62 2286.43 1141.37 1592.22 2286.14 1141.37 1592.86 2285.98 1141.37 1593.52 2285.94 1141.37 1594.17 2286.03 1141.37 1594.8 2286.25 1141.37 1595.37 2286.58 1141.37 1595.86 2287.02 1141.37 1596.26 2287.55 1141.37 1596.55 2288.15 1141.37 1596.71 2288.79 1141.37 1593.38 2289.31 1141.37 1554.53 2295.97 1172.09 1554.53 2295.97 1172.23 1553.6 2291.06 1172.23 1553.6 2291.06 1172.09 1553.37 2290.34 1172.18 1553.37 2290.34 1172.14 1553.29 2290.1 1172.16 1554.41 2296 1172.02 1553.48 2291.09 1172.02 1553.34 2290.35 1172.12 1554.28 2296.02 1172.09 1553.35 2291.11 1172.09 1553.31 2290.35 1172.14 1554.28 2296.02 1172.23 1553.35 2291.11 1172.23 1553.31 2290.35 1172.18 1554.41 2296 1172.3 1553.48 2291.09 1172.3 1553.34 2290.35 1172.2 1554.44 2295.99 1172.14 1554.41 2296 1172.12 1554.37 2296.01 1172.14 1554.37 2296.01 1172.18 1554.41 2296 1172.2 1554.44 2295.99 1172.18 1546.2 2289.69 1174.63 1548.12 2280.39 1174.63 1541.75 2279.08 1174.63 1539.83 2288.38 1174.63 1541.75 2279.08 1174.76 1539.83 2288.38 1174.76 1546.2 2289.69 1174.76 1548.12 2280.39 1174.76 1546.2 2289.69 1175.88 1548.12 2280.39 1175.88 1541.75 2279.08 1175.88 1539.83 2288.38 1175.88 1541.75 2279.08 1176.01 1539.83 2288.38 1176.01 1546.2 2289.69 1176.01 1548.12 2280.39 1176.01 1541.63 2279.05 1174.76 1539.71 2288.36 1174.76 1541.63 2279.05 1175.88 1539.71 2288.36 1175.88 1539.86 2288.26 1175.88 1546.1 2289.55 1175.88 1546.1 2289.55 1174.76 1539.86 2288.26 1174.76 1547.97 2280.49 1175.88 1547.97 2280.49 1174.76 1541.73 2279.2 1175.88 1541.73 2279.2 1174.76 1564.17 2314.13 1156.24 1564.11 2314.37 1156.25 1561.99 2313.58 1156.26 1561.93 2313.82 1156.27 1573.18 2300.76 1142.53 1573.18 2300.76 1141.47 1573.71 2300.01 1142 1574.73 2300.27 1142 1573.29 2301.66 1142 1574.31 2301.92 1142 1574.14 2300.46 1142.85 1573.88 2301.48 1142.85 1574.14 2300.46 1141.15 1573.88 2301.48 1141.15 1574.83 2301.18 1142.53 1574.83 2301.18 1141.47 1569.54 2315.15 1142.53 1569.54 2315.15 1141.47 1570.06 2314.41 1142 1571.08 2314.67 1142 1569.64 2316.06 1142 1570.66 2316.31 1142 1570.49 2314.85 1142.85 1570.23 2315.87 1142.85 1570.49 2314.85 1141.15 1570.23 2315.87 1141.15 1571.19 2315.57 1142.53 1571.19 2315.57 1141.47 1555.14 2311.5 1142.53 1555.14 2311.5 1141.47 1555.67 2310.76 1142 1556.69 2311.02 1142 1555.25 2312.41 1142 1556.27 2312.67 1142 1556.1 2311.2 1142.85 1555.84 2312.22 1142.85 1556.1 2311.2 1141.15 1555.84 2312.22 1141.15 1556.79 2311.92 1142.53 1556.79 2311.92 1141.47 1558.79 2297.11 1142.53 1558.79 2297.11 1141.47 1559.31 2296.36 1142 1560.33 2296.62 1142 1558.9 2298.01 1142 1559.92 2298.27 1142 1559.74 2296.81 1142.85 1559.49 2297.83 1142.85 1559.74 2296.81 1141.15 1559.49 2297.83 1141.15 1560.44 2297.53 1142.53 1560.44 2297.53 1141.47 1568.15 2301.98 1154 1564.28 2301 1154 1561.08 2313.6 1154 1564.96 2314.59 1154 1561.08 2313.6 1156.25 1564.96 2314.59 1156.25 1568.15 2301.98 1156.25 1564.28 2301 1156.25 1561.93 2313.82 1170 1564.11 2314.37 1170 1564.17 2314.13 1170 1561.99 2313.58 1170 1570.47 2312.19 1163.89 1557.38 2308.87 1163.89 1557.02 2310.3 1163.63 1570.11 2313.62 1163.63 1556.95 2310.58 1163.83 1556.95 2310.58 1163.83 1556.59 2312.01 1172.2 1556.59 2312.01 1172.2 1569.67 2315.33 1172.2 1569.67 2315.33 1172.2 1570.03 2313.9 1163.83 1570.03 2313.9 1163.83 1569.98 2315.15 1172.24 1570.34 2313.72 1172.5 1570.7 2312.29 1164.13 1570.34 2313.72 1163.87 1570.09 2313.7 1172.75 1569.72 2315.13 1172.49 1556.64 2311.82 1172.49 1557 2310.39 1172.75 1557.43 2308.67 1164.18 1557.43 2308.67 1164.18 1570.52 2311.99 1164.18 1570.52 2311.99 1164.18 1570.16 2313.42 1172.55 1570.16 2313.42 1172.55 1557.07 2310.1 1172.55 1557.07 2310.1 1172.55 1556.4 2311.71 1172.24 1556.77 2310.28 1163.87 1557.13 2308.85 1164.13 1556.77 2310.28 1172.5 1575.13 2299.88 1156.25 1575.13 2299.88 1156.25 1559.14 2295.83 1156.25 1559.14 2295.83 1156.25 1555.58 2309.89 1156.25 1555.58 2309.89 1156.25 1571.57 2313.94 1156.25 1571.57 2313.94 1156.25 1555.52 2310.13 1156.5 1555.52 2310.13 1159 1571.51 2314.18 1159 1571.51 2314.18 1156.5 1571.81 2314 1159 1575.38 2299.95 1159 1575.38 2299.95 1156.5 1571.81 2314 1156.5 1575.13 2299.88 1159.25 1575.13 2299.88 1159.25 1571.57 2313.94 1159.25 1571.57 2313.94 1159.25 1555.58 2309.89 1159.25 1555.58 2309.89 1159.25 1559.14 2295.83 1159.25 1559.14 2295.83 1159.25 1559.2 2295.59 1156.5 1575.2 2299.64 1156.5 1575.2 2299.64 1159 1559.2 2295.59 1159 1555.34 2309.83 1159 1555.34 2309.83 1156.5 1558.9 2295.77 1156.5 1558.9 2295.77 1159 1566.22 2306.16 1154 1565.73 2305.34 1154 1565.73 2305.34 1143.5 1566.22 2306.16 1143.5 1565.99 2307.09 1154 1565.99 2307.09 1143.5 1575.13 2300.59 1143.5 1574.87 2300.16 1143.5 1565.85 2305.53 1143.5 1566.11 2305.96 1143.5 1566.11 2305.96 1145.5 1575.13 2300.59 1145.5 1565.85 2305.53 1145.5 1574.87 2300.16 1145.5 1565.17 2307.58 1154 1565.17 2307.58 1143.5 1564.24 2307.34 1154 1564.24 2307.34 1143.5 1570.74 2316.48 1143.5 1571.17 2316.22 1143.5 1565.79 2307.2 1143.5 1565.36 2307.46 1143.5 1565.36 2307.46 1145.5 1570.74 2316.48 1145.5 1565.79 2307.2 1145.5 1571.17 2316.22 1145.5 1563.75 2306.52 1154 1563.75 2306.52 1143.5 1563.99 2305.59 1154 1563.99 2305.59 1143.5 1554.85 2312.09 1143.5 1555.1 2312.52 1143.5 1564.12 2307.15 1143.5 1563.87 2306.72 1143.5 1563.87 2306.72 1145.5 1554.85 2312.09 1145.5 1564.12 2307.15 1145.5 1555.1 2312.52 1145.5 1564.81 2305.1 1154 1564.81 2305.1 1143.5 1559.24 2296.2 1143.5 1558.81 2296.45 1143.5 1564.18 2305.48 1143.5 1564.61 2305.22 1143.5 1564.61 2305.22 1145.5 1559.24 2296.2 1145.5 1564.18 2305.48 1145.5 1558.81 2296.45 1145.5 1573.48 2298.13 1172 1573.87 2288.64 1172 1567.38 2288.37 1172.12 1566.99 2297.87 1172.12 1567.38 2288.37 1172.25 1566.99 2297.87 1172.25 1573.48 2298.13 1172.13 1573.87 2288.64 1172.13 1565.86 2297.82 1172.12 1566.25 2288.33 1172.12 1559.76 2288.06 1172 1559.37 2297.55 1172 1559.76 2288.06 1172.13 1559.37 2297.55 1172.13 1565.86 2297.82 1172.25 1566.25 2288.33 1172.25 1566.99 2297.87 1172 1567.38 2288.37 1172 1566.25 2288.33 1172 1565.86 2297.82 1172 1566.43 2297.74 1172.44 1566.47 2297.74 1172.57 1566.53 2297.75 1172.68 1566.61 2297.75 1172.77 1566.71 2297.75 1172.85 1566.83 2297.76 1172.92 1566.97 2297.77 1172.98 1567.13 2297.77 1173.02 1567.3 2297.78 1173.06 1567.49 2297.79 1173.08 1567.69 2297.8 1173.09 1567.91 2297.8 1173.1 1568.14 2297.81 1173.09 1568.37 2297.82 1173.08 1568.62 2297.83 1173.07 1568.88 2297.84 1173.05 1569.14 2297.85 1173.02 1569.41 2297.87 1172.99 1569.69 2297.88 1172.96 1569.97 2297.89 1172.92 1570.25 2297.9 1172.88 1570.54 2297.91 1172.85 1570.83 2297.92 1172.81 1571.11 2297.94 1172.77 1571.4 2297.95 1172.74 1571.68 2297.96 1172.7 1571.97 2297.97 1172.67 1572.24 2297.98 1172.64 1572.51 2297.99 1172.62 1572.78 2298 1172.61 1573.04 2298.02 1172.59 1573.29 2298.03 1172.59 1573.4 2298.03 1172.12 1572.14 2297.98 1172.18 1570.9 2297.93 1172.29 1569.74 2297.88 1172.43 1568.72 2297.84 1172.53 1567.88 2297.8 1172.55 1567.31 2297.78 1172.43 1567.04 2297.77 1172.12 1567.42 2288.48 1172.12 1567.69 2288.49 1172.43 1568.27 2288.51 1172.55 1569.1 2288.55 1172.53 1570.13 2288.59 1172.43 1571.29 2288.64 1172.29 1572.53 2288.69 1172.18 1573.78 2288.74 1172.12 1573.67 2288.73 1172.59 1573.42 2288.72 1172.59 1573.16 2288.71 1172.61 1572.9 2288.7 1172.62 1572.63 2288.69 1172.64 1572.35 2288.68 1172.67 1572.07 2288.67 1172.7 1571.78 2288.66 1172.74 1571.5 2288.64 1172.77 1571.21 2288.63 1172.81 1570.92 2288.62 1172.85 1570.64 2288.61 1172.88 1570.35 2288.6 1172.92 1570.07 2288.59 1172.96 1569.8 2288.57 1172.99 1569.53 2288.56 1173.02 1569.26 2288.55 1173.05 1569.01 2288.54 1173.07 1568.76 2288.53 1173.08 1568.52 2288.52 1173.09 1568.29 2288.51 1173.1 1568.08 2288.5 1173.09 1567.88 2288.49 1173.08 1567.69 2288.49 1173.06 1567.51 2288.48 1173.02 1567.36 2288.47 1172.98 1567.22 2288.47 1172.92 1567.1 2288.46 1172.85 1566.99 2288.46 1172.77 1566.91 2288.45 1172.68 1566.85 2288.45 1172.57 1566.81 2288.45 1172.44 1565.82 2297.72 1172.12 1565.55 2297.71 1172.43 1564.97 2297.68 1172.55 1564.14 2297.65 1172.53 1563.11 2297.61 1172.43 1561.95 2297.56 1172.29 1560.71 2297.51 1172.18 1559.46 2297.46 1172.12 1559.57 2297.46 1172.59 1559.82 2297.47 1172.59 1560.08 2297.48 1172.61 1560.34 2297.49 1172.62 1560.61 2297.5 1172.64 1560.89 2297.51 1172.67 1561.17 2297.53 1172.7 1561.46 2297.54 1172.74 1561.74 2297.55 1172.77 1562.03 2297.56 1172.81 1562.32 2297.57 1172.85 1562.6 2297.59 1172.88 1562.89 2297.6 1172.92 1563.17 2297.61 1172.96 1563.44 2297.62 1172.99 1563.71 2297.63 1173.02 1563.98 2297.64 1173.05 1564.23 2297.65 1173.07 1564.48 2297.66 1173.08 1564.72 2297.67 1173.09 1564.95 2297.68 1173.1 1565.16 2297.69 1173.09 1565.36 2297.7 1173.08 1565.55 2297.71 1173.06 1565.73 2297.71 1173.02 1565.88 2297.72 1172.98 1566.02 2297.73 1172.92 1566.14 2297.73 1172.85 1566.25 2297.74 1172.77 1566.33 2297.74 1172.68 1566.39 2297.74 1172.57 1566.77 2288.45 1172.57 1566.71 2288.45 1172.68 1566.63 2288.44 1172.77 1566.53 2288.44 1172.85 1566.41 2288.43 1172.92 1566.27 2288.43 1172.98 1566.11 2288.42 1173.02 1565.94 2288.41 1173.06 1565.75 2288.41 1173.08 1565.54 2288.4 1173.09 1565.33 2288.39 1173.1 1565.1 2288.38 1173.09 1564.86 2288.37 1173.08 1564.62 2288.36 1173.07 1564.36 2288.35 1173.05 1564.1 2288.34 1173.02 1563.83 2288.33 1172.99 1563.55 2288.32 1172.96 1563.27 2288.3 1172.92 1562.99 2288.29 1172.88 1562.7 2288.28 1172.85 1562.41 2288.27 1172.81 1562.13 2288.26 1172.77 1561.84 2288.25 1172.74 1561.56 2288.23 1172.7 1561.27 2288.22 1172.67 1561 2288.21 1172.64 1560.73 2288.2 1172.62 1560.46 2288.19 1172.61 1560.2 2288.18 1172.59 1559.95 2288.17 1172.59 1559.84 2288.16 1172.12 1561.1 2288.22 1172.18 1562.34 2288.27 1172.29 1563.5 2288.31 1172.43 1564.52 2288.36 1172.53 1565.36 2288.39 1172.55 1565.93 2288.41 1172.43 1566.2 2288.43 1172.12 1578.68 2295 1172.83 1578.71 2294.86 1172.88 1578.65 2294.78 1173 1579.23 2294.99 1173.39 1578.56 2294.81 1173.12 1578.53 2294.95 1173.2 1578.46 2295.07 1173.12 1578.51 2295.15 1173 1579.09 2295.37 1173.39 1578.61 2295.12 1172.88 1579.3 2295.23 1173.25 1579.31 2295.09 1173.29 1579.58 2295.12 1173.79 1579.11 2295.01 1173.48 1579.02 2295.13 1173.52 1579.01 2295.28 1173.48 1579.44 2295.5 1173.79 1579.21 2295.35 1173.29 1579.68 2295.38 1173.71 1579.68 2295.22 1173.73 1579.72 2295.18 1174.16 1579.43 2295.13 1173.84 1579.33 2295.25 1173.86 1579.33 2295.4 1173.84 1579.58 2295.55 1174.16 1579.58 2295.49 1173.73 1579.84 2295.44 1174.18 1579.84 2295.28 1174.17 1579.71 2295.17 1174.5 1579.57 2295.18 1174.16 1579.47 2295.3 1174.15 1579.47 2295.45 1174.16 1579.57 2295.55 1174.5 1579.74 2295.55 1174.17 1579.8 2295.42 1174.6 1579.8 2295.27 1174.57 1579.56 2295.12 1174.77 1579.57 2295.19 1174.43 1579.48 2295.3 1174.4 1579.48 2295.45 1174.43 1579.42 2295.49 1174.77 1579.7 2295.54 1174.57 1579.59 2295.34 1174.93 1579.61 2295.2 1174.88 1579.31 2295.03 1174.93 1579.47 2295.15 1174.65 1579.39 2295.27 1174.6 1579.37 2295.41 1174.65 1579.17 2295.4 1174.93 1579.51 2295.46 1174.88 1579.27 2295.22 1175.13 1579.31 2295.09 1175.07 1579 2294.91 1174.98 1579.28 2295.07 1174.79 1579.22 2295.2 1174.74 1579.18 2295.34 1174.79 1578.86 2295.28 1174.98 1579.21 2295.35 1175.07 1578.98 2295.11 1174.79 1578.64 2294.98 1174.68 1578.92 2295.24 1174.84 1578.57 2295.11 1174.74 1578.51 2295.15 1174.87 1578.85 2295.21 1175.12 1578.5 2295.08 1175.01 1578.88 2295.08 1175.17 1578.53 2294.95 1175.07 1578.94 2294.95 1175.12 1578.6 2294.82 1175.01 1578.65 2294.78 1174.87 1579.02 2294.98 1174.84 1578.67 2294.85 1174.74 1578.58 2294.97 1172 1578.66 2294.68 1172 1578.68 2294.39 1172 1578.64 2294.1 1172 1578.55 2293.82 1172 1578.4 2293.56 1172 1578.2 2293.34 1172 1577.97 2293.16 1172 1577.71 2293.04 1172 1577.42 2292.96 1172 1577.13 2292.94 1172 1576.84 2292.98 1172 1576.56 2293.07 1172 1576.3 2293.22 1172 1576.08 2293.42 1172 1575.9 2293.65 1172 1575.78 2293.91 1172 1575.7 2294.2 1172 1575.68 2294.49 1172 1575.72 2294.78 1172 1575.81 2295.06 1172 1575.96 2295.32 1172 1576.16 2295.54 1172 1576.39 2295.72 1172 1576.65 2295.84 1172 1576.94 2295.92 1172 1577.23 2295.94 1172 1577.52 2295.9 1172 1577.8 2295.81 1172 1578.06 2295.66 1172 1578.28 2295.46 1172 1578.46 2295.23 1172 1578.7 2295.01 1172.12 1578.78 2294.7 1172.12 1578.8 2294.38 1172.12 1578.76 2294.07 1172.12 1578.66 2293.77 1172.12 1578.5 2293.49 1172.12 1578.29 2293.25 1172.12 1578.04 2293.06 1172.12 1577.75 2292.92 1172.12 1577.44 2292.84 1172.12 1577.12 2292.82 1172.12 1576.81 2292.86 1172.12 1576.51 2292.96 1172.12 1576.23 2293.12 1172.12 1575.99 2293.33 1172.12 1575.8 2293.58 1172.12 1575.66 2293.87 1172.12 1575.58 2294.18 1172.12 1575.56 2294.5 1172.12 1575.6 2294.81 1172.12 1575.7 2295.11 1172.12 1575.86 2295.39 1172.12 1576.07 2295.63 1172.12 1576.32 2295.82 1172.12 1576.61 2295.96 1172.12 1576.92 2296.04 1172.12 1577.24 2296.06 1172.12 1577.55 2296.02 1172.12 1577.85 2295.92 1172.12 1578.13 2295.76 1172.12 1578.37 2295.55 1172.12 1578.56 2295.3 1172.12 1578.7 2295.01 1175.62 1578.78 2294.7 1175.62 1578.8 2294.38 1175.62 1578.76 2294.07 1175.62 1578.66 2293.77 1175.62 1578.5 2293.49 1175.62 1578.29 2293.25 1175.62 1578.04 2293.06 1175.62 1577.75 2292.92 1175.62 1577.44 2292.84 1175.62 1577.12 2292.82 1175.62 1576.81 2292.86 1175.62 1576.51 2292.96 1175.62 1576.23 2293.12 1175.62 1575.99 2293.33 1175.62 1575.8 2293.58 1175.62 1575.66 2293.87 1175.62 1575.58 2294.18 1175.62 1575.56 2294.5 1175.62 1575.6 2294.81 1175.62 1575.7 2295.11 1175.62 1575.86 2295.39 1175.62 1576.07 2295.63 1175.62 1576.32 2295.82 1175.62 1576.61 2295.96 1175.62 1576.92 2296.04 1175.62 1577.24 2296.06 1175.62 1577.55 2296.02 1175.62 1577.85 2295.92 1175.62 1578.13 2295.76 1175.62 1578.37 2295.55 1175.62 1578.56 2295.3 1175.62 1578.64 2294.99 1175.69 1578.72 2294.69 1175.69 1578.74 2294.39 1175.69 1578.7 2294.08 1175.69 1578.6 2293.79 1175.69 1578.45 2293.53 1175.69 1578.25 2293.3 1175.69 1578 2293.11 1175.69 1577.73 2292.98 1175.69 1577.43 2292.9 1175.69 1577.13 2292.88 1175.69 1576.82 2292.92 1175.69 1576.53 2293.02 1175.69 1576.27 2293.17 1175.69 1576.04 2293.37 1175.69 1575.85 2293.62 1175.69 1575.72 2293.89 1175.69 1575.64 2294.19 1175.69 1575.62 2294.49 1175.69 1575.66 2294.8 1175.69 1575.76 2295.09 1175.69 1575.91 2295.35 1175.69 1576.11 2295.58 1175.69 1576.36 2295.77 1175.69 1576.63 2295.9 1175.69 1576.93 2295.98 1175.69 1577.23 2296 1175.69 1577.54 2295.96 1175.69 1577.83 2295.86 1175.69 1578.09 2295.71 1175.69 1578.32 2295.51 1175.69 1578.51 2295.26 1175.69 1578.58 2294.97 1175.69 1578.46 2295.23 1175.69 1578.28 2295.46 1175.69 1578.06 2295.66 1175.69 1577.8 2295.81 1175.69 1577.52 2295.9 1175.69 1577.23 2295.94 1175.69 1576.94 2295.92 1175.69 1576.65 2295.84 1175.69 1576.39 2295.72 1175.69 1576.16 2295.54 1175.69 1575.96 2295.32 1175.69 1575.81 2295.06 1175.69 1575.72 2294.78 1175.69 1575.68 2294.49 1175.69 1575.7 2294.2 1175.69 1575.78 2293.91 1175.69 1575.9 2293.65 1175.69 1576.08 2293.42 1175.69 1576.3 2293.22 1175.69 1576.56 2293.07 1175.69 1576.84 2292.98 1175.69 1577.13 2292.94 1175.69 1577.42 2292.96 1175.69 1577.71 2293.04 1175.69 1577.97 2293.16 1175.69 1578.2 2293.34 1175.69 1578.4 2293.56 1175.69 1578.55 2293.82 1175.69 1578.64 2294.1 1175.69 1578.68 2294.39 1175.69 1578.66 2294.68 1175.69 1578.53 2294.94 1175.62 1578.4 2295.2 1175.62 1578.23 2295.42 1175.62 1578.02 2295.61 1175.62 1577.78 2295.75 1175.62 1577.51 2295.84 1175.62 1577.23 2295.88 1175.62 1576.95 2295.86 1175.62 1576.68 2295.79 1175.62 1576.42 2295.66 1175.62 1576.2 2295.49 1175.62 1576.01 2295.28 1175.62 1575.87 2295.04 1175.62 1575.78 2294.77 1175.62 1575.74 2294.49 1175.62 1575.76 2294.21 1175.62 1575.83 2293.94 1175.62 1575.96 2293.68 1175.62 1576.13 2293.46 1175.62 1576.34 2293.27 1175.62 1576.58 2293.13 1175.62 1576.85 2293.04 1175.62 1577.13 2293 1175.62 1577.41 2293.02 1175.62 1577.68 2293.09 1175.62 1577.94 2293.22 1175.62 1578.16 2293.39 1175.62 1578.35 2293.6 1175.62 1578.49 2293.84 1175.62 1578.58 2294.11 1175.62 1578.62 2294.39 1175.62 1578.6 2294.67 1175.62 1578.53 2294.94 1172.19 1578.4 2295.2 1172.19 1578.23 2295.42 1172.19 1578.02 2295.61 1172.19 1577.78 2295.75 1172.19 1577.51 2295.84 1172.19 1577.23 2295.88 1172.19 1576.95 2295.86 1172.19 1576.68 2295.79 1172.19 1576.42 2295.66 1172.19 1576.2 2295.49 1172.19 1576.01 2295.28 1172.19 1575.87 2295.04 1172.19 1575.78 2294.77 1172.19 1575.74 2294.49 1172.19 1575.76 2294.21 1172.19 1575.83 2293.94 1172.19 1575.96 2293.68 1172.19 1576.13 2293.46 1172.19 1576.34 2293.27 1172.19 1576.58 2293.13 1172.19 1576.85 2293.04 1172.19 1577.13 2293 1172.19 1577.41 2293.02 1172.19 1577.68 2293.09 1172.19 1577.94 2293.22 1172.19 1578.16 2293.39 1172.19 1578.35 2293.6 1172.19 1578.49 2293.84 1172.19 1578.58 2294.11 1172.19 1578.62 2294.39 1172.19 1578.6 2294.67 1172.19 1577.18 2294.44 1172.19 1545.49 2290.1 1173.38 1546.9 2280.7 1173.38 1540.47 2279.74 1173.38 1539.06 2289.14 1173.38 1540.47 2279.74 1173.51 1539.06 2289.14 1173.51 1545.49 2290.1 1173.51 1546.9 2280.7 1173.51 1545.49 2290.1 1174.63 1546.9 2280.7 1174.63 1540.47 2279.74 1174.63 1539.06 2289.14 1174.63 1540.47 2279.74 1174.76 1539.06 2289.14 1174.76 1545.49 2290.1 1174.76 1546.9 2280.7 1174.76 1540.35 2279.72 1173.51 1538.94 2289.12 1173.51 1540.35 2279.72 1174.63 1538.94 2289.12 1174.63 1539.08 2289.01 1174.63 1545.39 2289.96 1174.63 1545.39 2289.96 1173.51 1539.08 2289.01 1173.51 1546.76 2280.81 1174.63 1546.76 2280.81 1173.51 1540.45 2279.87 1174.63 1540.45 2279.87 1173.51 1545.39 2289.59 1172 1545.78 2280.09 1172 1539.28 2279.83 1172 1538.89 2289.32 1172 1539.28 2279.83 1172.12 1538.89 2289.32 1172.12 1545.39 2289.59 1172.12 1545.78 2280.09 1172.12 1545.39 2289.59 1173.25 1545.78 2280.09 1173.25 1539.28 2279.83 1173.25 1538.89 2289.32 1173.25 1539.28 2279.83 1173.37 1538.89 2289.32 1173.37 1545.39 2289.59 1173.37 1545.78 2280.09 1173.37 1539.16 2279.82 1172.12 1538.77 2289.31 1172.12 1539.16 2279.82 1173.25 1538.77 2289.31 1173.25 1538.9 2289.19 1173.25 1545.27 2289.46 1173.25 1545.27 2289.46 1172.12 1538.9 2289.19 1172.12 1545.65 2280.21 1173.25 1545.65 2280.21 1172.12 1539.28 2279.95 1173.25 1539.28 2279.95 1172.12 1578.55 2277.01 1173.26 1578.55 2277.01 1172.74 1578.94 2276.78 1173 1579.35 2277.11 1173 1578.41 2277.45 1173 1578.82 2277.77 1173 1579.04 2277.07 1173.43 1578.71 2277.48 1173.43 1579.04 2277.07 1172.57 1579.21 2277.54 1173.26 1579.21 2277.54 1172.74 1581.32 2273.54 1185.48 1581.32 2273.54 1184.95 1581.71 2273.31 1185.22 1582.12 2273.63 1185.22 1581.18 2273.97 1185.22 1581.59 2274.3 1185.22 1581.82 2273.6 1185.64 1581.49 2274.01 1185.64 1581.82 2273.6 1184.79 1581.49 2274.01 1184.79 1581.98 2274.07 1185.48 1581.98 2274.07 1184.95 1575.92 2280.3 1190.48 1575.92 2280.3 1189.95 1576.31 2280.07 1190.22 1576.72 2280.4 1190.22 1576.41 2280.36 1190.64 1576.41 2280.36 1189.79 1576.58 2280.84 1190.48 1576.58 2280.84 1189.95 1574.68 2280.83 1187.02 1574.68 2280.83 1185.71 1575.66 2280.26 1186.36 1576.68 2281.08 1186.36 1574.33 2281.92 1186.36 1575.36 2282.74 1186.36 1575.92 2280.98 1187.43 1575.1 2282.01 1187.43 1575.92 2280.98 1185.3 1575.1 2282.01 1185.3 1576.34 2282.16 1187.02 1576.34 2282.16 1185.71 1579.5 2276.5 1172 1578.46 2275.96 1172 1577.3 2275.86 1172 1576.18 2276.21 1172 1575.29 2276.97 1172 1574.75 2278.01 1172 1574.65 2279.17 1172 1575 2280.29 1172 1575.76 2281.18 1172 1576.8 2281.72 1172 1577.96 2281.82 1172 1579.08 2281.47 1172 1579.97 2280.71 1172 1580.51 2279.67 1172 1580.61 2278.51 1172 1580.26 2277.39 1172 1579.5 2276.5 1172.75 1578.46 2275.96 1172.75 1577.3 2275.86 1172.75 1576.18 2276.21 1172.75 1575.29 2276.97 1172.75 1574.75 2278.01 1172.75 1574.65 2279.17 1172.75 1575 2280.29 1172.75 1575.76 2281.18 1172.75 1576.8 2281.72 1172.75 1577.96 2281.82 1172.75 1579.08 2281.47 1172.75 1579.97 2280.71 1172.75 1580.51 2279.67 1172.75 1580.61 2278.51 1172.75 1580.26 2277.39 1172.75 1579.35 2276.69 1173 1578.39 2276.2 1173 1577.32 2276.11 1173 1576.3 2276.43 1173 1575.48 2277.12 1173 1574.99 2278.08 1173 1574.9 2279.15 1173 1575.22 2280.17 1173 1575.91 2280.99 1173 1576.87 2281.48 1173 1577.94 2281.57 1173 1578.96 2281.25 1173 1579.78 2280.56 1173 1580.27 2279.6 1173 1580.36 2278.53 1173 1580.04 2277.51 1173 1579.02 2277.09 1172.91 1581.8 2273.62 1185.13 1578.94 2277.05 1172.92 1581.71 2273.57 1185.14 1578.84 2277.04 1172.94 1581.62 2273.56 1185.16 1578.75 2277.06 1172.97 1581.53 2273.59 1185.18 1578.68 2277.12 1173 1581.46 2273.65 1185.22 1578.64 2277.2 1173.03 1581.42 2273.73 1185.25 1578.64 2277.3 1173.06 1581.41 2273.82 1185.28 1578.67 2277.39 1173.08 1581.44 2273.91 1185.3 1578.73 2277.46 1173.09 1581.51 2273.99 1185.3 1578.82 2277.51 1173.08 1581.59 2274.03 1185.3 1578.91 2277.52 1173.06 1581.69 2274.04 1185.28 1579 2277.49 1173.03 1581.78 2274.02 1185.25 1579.07 2277.43 1173 1581.85 2273.96 1185.22 1579.11 2277.35 1172.97 1581.89 2273.88 1185.18 1579.12 2277.26 1172.94 1581.89 2273.78 1185.16 1579.09 2277.17 1172.92 1581.86 2273.69 1185.14 1581.73 2273.7 1185.43 1576.33 2280.47 1190.43 1581.65 2273.65 1185.42 1576.25 2280.42 1190.42 1581.57 2273.62 1185.37 1576.17 2280.39 1190.37 1581.5 2273.62 1185.3 1576.1 2280.39 1190.3 1576.05 2280.41 1190.22 1581.44 2273.7 1185.13 1576.04 2280.46 1190.13 1581.46 2273.76 1185.06 1576.06 2280.53 1190.06 1581.51 2273.83 1185.02 1576.1 2280.6 1190.02 1581.57 2273.9 1185 1576.17 2280.67 1190 1581.65 2273.95 1185.02 1576.25 2280.72 1190.02 1581.73 2273.98 1185.06 1576.33 2280.75 1190.06 1581.8 2273.98 1185.13 1576.4 2280.75 1190.13 1576.44 2280.73 1190.22 1581.86 2273.91 1185.3 1576.46 2280.68 1190.3 1581.85 2273.84 1185.37 1576.44 2280.61 1190.37 1581.8 2273.77 1185.42 1576.4 2280.54 1190.42 1576.51 2280.24 1191.16 1576.7 2280.47 1191.17 1576.79 2280.74 1191.2 1576.77 2281.03 1191.24 1576.64 2281.29 1191.29 1576.41 2281.47 1191.34 1576.14 2281.56 1191.38 1575.85 2281.53 1191.41 1575.59 2281.4 1191.42 1575.4 2281.17 1191.41 1575.31 2280.9 1191.38 1575.33 2280.61 1191.34 1575.46 2280.35 1191.29 1575.68 2280.17 1191.24 1575.96 2280.08 1191.2 1576.25 2280.11 1191.17 1576.34 2280.46 1188.16 1576.59 2280.75 1188.17 1576.71 2281.12 1188.21 1576.68 2281.51 1188.27 1576.51 2281.85 1188.33 1576.21 2282.1 1188.4 1575.84 2282.21 1188.46 1575.46 2282.18 1188.49 1575.11 2282 1188.51 1574.86 2281.7 1188.49 1574.74 2281.33 1188.46 1574.77 2280.94 1188.4 1574.94 2280.6 1188.33 1575.24 2280.36 1188.27 1575.61 2280.24 1188.21 1575.99 2280.28 1188.17 1576.5 2280.25 1191.16 1576.28 2280.53 1188.18 1576.69 2280.47 1191.17 1576.5 2280.8 1188.19 1576.78 2280.74 1191.2 1576.61 2281.13 1188.22 1576.76 2281.03 1191.24 1576.59 2281.48 1188.27 1576.63 2281.28 1191.29 1576.43 2281.79 1188.33 1576.41 2281.46 1191.34 1576.16 2282.01 1188.39 1576.14 2281.55 1191.38 1575.83 2282.11 1188.44 1575.85 2281.52 1191.41 1575.48 2282.08 1188.48 1575.59 2281.39 1191.42 1575.17 2281.92 1188.49 1575.41 2281.17 1191.41 1574.94 2281.65 1188.48 1575.32 2280.9 1191.38 1574.84 2281.32 1188.44 1575.34 2280.61 1191.34 1574.86 2280.97 1188.39 1575.47 2280.36 1191.29 1575.02 2280.66 1188.33 1575.69 2280.17 1191.24 1575.29 2280.44 1188.27 1575.96 2280.09 1191.2 1575.62 2280.34 1188.22 1576.25 2280.12 1191.17 1575.97 2280.37 1188.19 1576.85 2279.82 1187 1577.35 2280.42 1187.03 1577.59 2281.16 1187.1 1577.53 2281.93 1187.22 1577.18 2282.61 1187.35 1576.59 2283.1 1187.48 1575.85 2283.33 1187.59 1575.08 2283.26 1187.67 1574.39 2282.9 1187.7 1573.88 2282.31 1187.67 1573.64 2281.57 1187.59 1573.7 2280.8 1187.48 1574.05 2280.11 1187.35 1574.64 2279.62 1187.22 1575.38 2279.39 1187.1 1576.15 2279.46 1187.03 1576.78 2279.9 1187.02 1577.26 2280.46 1187.04 1577.49 2281.17 1187.12 1577.43 2281.9 1187.22 1577.1 2282.55 1187.35 1576.54 2283.02 1187.47 1575.84 2283.23 1187.58 1575.11 2283.17 1187.65 1574.45 2282.82 1187.68 1573.97 2282.26 1187.65 1573.74 2281.56 1187.58 1573.8 2280.83 1187.47 1574.13 2280.18 1187.35 1574.69 2279.71 1187.22 1575.39 2279.49 1187.12 1576.13 2279.56 1187.04 1577.19 2279.39 1184.37 1577.95 2280.28 1184.41 1578.31 2281.39 1184.52 1578.22 2282.55 1184.69 1577.69 2283.57 1184.89 1576.81 2284.31 1185.09 1575.7 2284.66 1185.25 1574.54 2284.55 1185.37 1573.5 2284.01 1185.41 1572.75 2283.12 1185.37 1572.38 2282.01 1185.25 1572.47 2280.86 1185.09 1573 2279.83 1184.89 1573.88 2279.09 1184.69 1574.99 2278.75 1184.52 1576.15 2278.85 1184.41 1577.13 2279.47 1184.38 1577.86 2280.33 1184.42 1578.21 2281.4 1184.53 1578.12 2282.52 1184.69 1577.61 2283.51 1184.89 1576.76 2284.23 1185.08 1575.69 2284.56 1185.24 1574.57 2284.46 1185.35 1573.56 2283.93 1185.39 1572.83 2283.07 1185.35 1572.48 2282 1185.24 1572.57 2280.88 1185.08 1573.08 2279.89 1184.89 1573.93 2279.18 1184.69 1575 2278.84 1184.53 1576.12 2278.95 1184.42 1538.36 2267.67 1171 1537.11 2297.89 1171 1585.57 2299.89 1171 1586.82 2269.67 1171 1585.57 2299.89 1172 1586.82 2269.67 1172 1538.36 2267.67 1172 1537.11 2297.89 1172 1585.57 2269.62 1141 1585.53 2270.61 1141 1586.53 2270.66 1141 1586.57 2269.66 1141 1586.53 2270.66 1171 1586.57 2269.66 1171 1585.57 2269.62 1171 1585.53 2270.61 1171 1538.61 2267.68 1141 1538.57 2268.68 1141 1539.57 2268.72 1141 1539.61 2267.72 1141 1539.57 2268.72 1171 1539.61 2267.72 1171 1538.61 2267.68 1171 1538.57 2268.68 1171 1537.42 2296.66 1141 1537.37 2297.65 1141 1538.37 2297.7 1141 1538.41 2296.7 1141 1538.37 2297.7 1171 1538.41 2296.7 1171 1537.42 2296.66 1171 1537.37 2297.65 1171 1584.38 2298.59 1141 1584.33 2299.59 1141 1585.33 2299.63 1141 1585.37 2298.63 1141 1585.33 2299.63 1171 1585.37 2298.63 1171 1584.38 2298.59 1171 1584.33 2299.59 1171 1539.61 2267.72 1150 1539.57 2268.72 1150 1585.53 2270.61 1150 1585.57 2269.62 1150 1584.38 2298.59 1150 1585.37 2298.63 1150 1586.53 2270.66 1150 1538.57 2268.68 1150 1537.42 2296.66 1150 1538.41 2296.7 1150 1539.57 2268.72 1165 1538.37 2297.7 1165 1552.36 2298.27 1165 1553.56 2269.3 1165 1552.36 2298.27 1171 1553.56 2269.3 1171 1538.37 2297.7 1150 1552.36 2298.27 1150 1553.56 2269.3 1150 1552.36 2298.27 1164.75 1553.56 2269.3 1164.75 1539.57 2268.72 1164.75 1538.37 2297.7 1164.75 1542.83 2298.88 1167.62 1542.81 2299.38 1167.62 1547.8 2299.59 1167.62 1547.82 2299.09 1167.62 1547.8 2299.59 1168.37 1547.82 2299.09 1168.37 1542.83 2298.88 1168.37 1542.81 2299.38 1168.37 1546.87 2298.05 1167.62 1546.83 2299.05 1167.62 1547.32 2299.07 1167.62 1547.37 2298.07 1167.62 1547.32 2299.07 1168.37 1547.37 2298.07 1168.37 1546.87 2298.05 1168.37 1546.83 2299.05 1168.37 1543.37 2297.9 1167.62 1543.33 2298.9 1167.62 1543.83 2298.92 1167.62 1543.87 2297.92 1167.62 1543.83 2298.92 1168.37 1543.87 2297.92 1168.37 1543.37 2297.9 1168.37 1543.33 2298.9 1168.37 1542.83 2298.88 1161.37 1542.81 2299.38 1161.37 1547.8 2299.59 1161.37 1547.82 2299.09 1161.37 1547.8 2299.59 1162.12 1547.82 2299.09 1162.12 1542.83 2298.88 1162.12 1542.81 2299.38 1162.12 1546.87 2298.05 1161.37 1546.83 2299.05 1161.37 1547.32 2299.07 1161.37 1547.37 2298.07 1161.37 1547.32 2299.07 1162.12 1547.37 2298.07 1162.12 1546.87 2298.05 1162.12 1546.83 2299.05 1162.12 1543.37 2297.9 1161.37 1543.33 2298.9 1161.37 1543.83 2298.92 1161.37 1543.87 2297.92 1161.37 1543.83 2298.92 1162.12 1543.87 2297.92 1162.12 1543.37 2297.9 1162.12 1543.33 2298.9 1162.12 1641.66 2333.17 1167 1641.66 2332.57 1167 1620.06 2332.57 1167 1620.06 2333.17 1167 1620.06 2278.57 1167 1619.16 2278.57 1167 1619.16 2332.57 1167 1641.66 2278.57 1167 1641.66 2277.97 1167 1620.06 2277.97 1167 1642.56 2332.57 1167 1642.56 2278.57 1167 1642.56 2278.57 1170 1641.66 2277.97 1170 1620.06 2277.97 1170 1619.16 2278.57 1170 1619.16 2332.57 1170 1620.06 2333.17 1170 1641.66 2333.17 1170 1642.56 2332.57 1170 1641.66 2278.57 1170 1641.66 2332.57 1170 1620.06 2332.57 1170 1620.06 2278.57 1170 1620.06 2283.97 1147 1620.06 2283.97 1148 1620.06 2284.57 1148 1620.06 2284.57 1147 1620.06 2327.77 1141 1620.06 2327.77 1147 1620.96 2327.77 1147 1620.96 2327.77 1141 1620.96 2327.17 1147 1620.96 2327.17 1141 1620.06 2327.17 1147 1620.06 2327.17 1141 1640.76 2327.17 1141 1640.76 2327.17 1147 1640.76 2327.77 1147 1640.76 2327.77 1141 1641.66 2327.77 1147 1641.66 2327.77 1141 1641.66 2327.17 1147 1641.66 2327.17 1141 1640.76 2283.97 1141 1640.76 2283.97 1147 1640.76 2284.57 1147 1640.76 2284.57 1141 1641.66 2284.57 1147 1641.66 2284.57 1141 1641.66 2283.97 1147 1641.66 2283.97 1141 1620.06 2284.57 1141 1620.96 2284.57 1147 1620.96 2284.57 1141 1620.96 2283.97 1147 1620.96 2283.97 1141 1620.06 2283.97 1141 1620.06 2327.77 1148 1641.66 2327.77 1148 1641.66 2327.17 1148 1620.06 2327.17 1148 1641.66 2284.57 1148 1641.66 2283.97 1148 1617.36 2334.37 1171 1617.36 2276.77 1171 1644.36 2276.77 1171 1644.36 2334.37 1171 1624.56 2327.17 1148 1624.56 2327.77 1148 1636.26 2327.17 1148 1636.26 2327.77 1148 1625.46 2327.77 1148 1625.46 2327.17 1148 1637.16 2327.77 1148 1637.16 2327.17 1148 1637.16 2284.57 1148 1637.16 2283.97 1148 1636.26 2283.97 1148 1636.26 2284.57 1148 1625.46 2284.57 1148 1625.46 2283.97 1148 1624.56 2283.97 1148 1624.56 2284.57 1148 1625.46 2327.77 1170 1625.46 2327.17 1170 1624.56 2327.17 1170 1624.56 2327.77 1170 1637.16 2327.77 1170 1637.16 2327.17 1170 1636.26 2327.17 1170 1636.26 2327.77 1170 1636.26 2283.97 1170 1636.26 2284.57 1170 1637.16 2284.57 1170 1637.16 2283.97 1170 1624.56 2283.97 1170 1624.56 2284.57 1170 1625.46 2284.57 1170 1625.46 2283.97 1170 1644.36 2334.37 1170 1617.36 2334.37 1170 1644.36 2276.77 1170 1617.36 2276.77 1170 1477.67 2281.37 1188 1477.67 2329.37 1188 1477.67 2329.37 1228.4 1477.67 2281.37 1228.4 1477.79 2329.37 1188 1477.79 2329.37 1228.4 1477.79 2328.87 1228.4 1477.79 2328.87 1188 1477.27 2328.87 1228.4 1477.27 2328.87 1188 1477.27 2329.37 1188 1477.27 2329.37 1228.4 1477.79 2281.87 1188 1477.79 2281.87 1228.4 1477.79 2281.37 1228.4 1477.79 2281.37 1188 1477.27 2281.37 1228.4 1477.27 2281.37 1188 1477.27 2281.87 1188 1477.27 2281.87 1228.4 1477.79 2329.37 1227.78 1477.79 2281.37 1227.78 1477.27 2281.37 1227.78 1477.27 2329.37 1227.78 1477.79 2329.37 1188.62 1477.79 2281.37 1188.62 1477.27 2281.37 1188.62 1477.27 2329.37 1188.62 1489.42 2189.97 1246 1477.42 2189.97 1246 1489.42 2189.97 1141 1489.42 2188.97 1246 1477.42 2189.97 1141 1477.42 2188.97 1246 1489.42 2188.97 1141 1477.42 2188.97 1141 1489.42 2224.97 1246 1477.42 2224.97 1246 1489.42 2224.97 1141 1489.42 2223.97 1246 1477.42 2224.97 1141 1477.42 2223.97 1246 1489.42 2223.97 1141 1477.42 2223.97 1141 1489.42 2223.97 1142 1477.42 2223.97 1142 1489.42 2223.97 1141 1489.42 2189.97 1142 1477.42 2223.97 1141 1477.42 2189.97 1142 1489.42 2189.97 1141 1477.42 2189.97 1141 1477.13 2189.97 1148.5 1477.13 2189.97 1142 1484.87 2189.97 1142 1484.87 2189.97 1148.5 1484.87 2190.25 1142 1484.87 2190.25 1148.5 1477.13 2190.25 1148.5 1477.13 2190.25 1142 1477.13 2192.79 1148.5 1477.13 2192.79 1142 1484.87 2192.79 1142 1484.87 2192.79 1148.5 1484.87 2193.07 1142 1484.87 2193.07 1148.5 1477.13 2193.07 1148.5 1477.13 2193.07 1142 1485.01 2190.25 1142 1485.01 2190.25 1148.5 1485.01 2192.79 1142 1485.01 2192.79 1148.5 1484.87 2192.79 1148.41 1477.28 2192.79 1148.41 1477.28 2190.25 1148.41 1484.87 2190.25 1148.41 1477.28 2192.79 1142.09 1477.28 2190.25 1142.09 1484.87 2192.79 1142.09 1484.87 2190.25 1142.09 1477.22 2193.32 1148.36 1477.22 2193.32 1142 1482.4 2193.32 1142 1482.4 2193.32 1148.36 1482.4 2193.56 1142 1482.4 2193.56 1148.36 1477.22 2193.56 1148.36 1477.22 2193.56 1142 1477.22 2195.76 1148.36 1477.22 2195.76 1142 1482.4 2195.76 1142 1482.4 2195.76 1148.36 1482.4 2196 1142 1482.4 2196 1148.36 1477.22 2196 1148.36 1477.22 2196 1142 1482.5 2193.56 1142 1482.5 2193.56 1148.36 1482.5 2195.76 1142 1482.5 2195.76 1148.36 1482.4 2195.76 1148.28 1477.32 2195.76 1148.28 1477.32 2193.56 1148.28 1482.4 2193.56 1148.28 1477.32 2195.76 1142.08 1477.32 2193.56 1142.08 1482.4 2195.76 1142.08 1482.4 2193.56 1142.08 1477.22 2196.24 1151.74 1477.22 2196.24 1142 1482.46 2196.24 1142 1482.46 2196.24 1151.74 1482.46 2196.53 1142 1482.46 2196.53 1151.74 1477.22 2196.53 1151.74 1477.22 2196.53 1142 1477.22 2199.11 1151.74 1477.22 2199.11 1142 1482.46 2199.11 1142 1482.46 2199.11 1151.74 1482.46 2199.4 1142 1482.46 2199.4 1151.74 1477.22 2199.4 1151.74 1477.22 2199.4 1142 1482.56 2196.53 1142 1482.56 2196.53 1151.74 1482.56 2199.11 1142 1482.56 2199.11 1151.74 1482.46 2199.11 1151.62 1477.32 2199.11 1151.62 1477.32 2196.53 1151.62 1482.46 2196.53 1151.62 1477.32 2199.11 1142.12 1477.32 2196.53 1142.12 1482.46 2199.11 1142.12 1482.46 2196.53 1142.12 1477.21 2199.65 1152.83 1477.21 2199.65 1142 1482.56 2199.65 1142 1482.56 2199.65 1152.83 1482.56 2199.8 1142 1482.56 2199.8 1152.83 1477.21 2199.8 1152.83 1477.21 2199.8 1142 1477.21 2201.12 1152.83 1477.21 2201.12 1142 1482.56 2201.12 1142 1482.56 2201.12 1152.83 1482.56 2201.27 1142 1482.56 2201.27 1152.83 1477.21 2201.27 1152.83 1477.21 2201.27 1142 1482.66 2199.8 1142 1482.66 2199.8 1152.83 1482.66 2201.12 1142 1482.66 2201.12 1152.83 1482.56 2201.12 1152.68 1477.32 2201.12 1152.68 1477.32 2199.8 1152.68 1482.56 2199.8 1152.68 1477.32 2201.12 1142.14 1477.32 2199.8 1142.14 1482.56 2201.12 1142.14 1482.56 2199.8 1142.14 1477.1 2201.52 1151.98 1477.1 2201.52 1142 1485.4 2201.52 1142 1485.4 2201.52 1151.98 1485.4 2201.59 1142 1485.4 2201.59 1151.98 1477.1 2201.59 1151.98 1477.1 2201.59 1142 1477.1 2202.21 1151.98 1477.1 2202.21 1142 1485.4 2202.21 1142 1485.4 2202.21 1151.98 1485.4 2202.28 1142 1485.4 2202.28 1151.98 1477.1 2202.28 1151.98 1477.1 2202.28 1142 1485.56 2201.59 1142 1485.56 2201.59 1151.98 1485.56 2202.21 1142 1485.56 2202.21 1151.98 1485.4 2202.21 1151.85 1477.25 2202.21 1151.85 1477.25 2201.59 1151.85 1485.4 2201.59 1151.85 1477.25 2202.21 1142.13 1477.25 2201.59 1142.13 1485.4 2202.21 1142.13 1485.4 2201.59 1142.13 1477.11 2202.53 1151.38 1477.11 2202.53 1142 1485.41 2202.53 1142 1485.41 2202.53 1151.38 1485.41 2202.75 1142 1485.41 2202.75 1151.38 1477.11 2202.75 1151.38 1477.11 2202.75 1142 1477.11 2204.73 1151.38 1477.11 2204.73 1142 1485.41 2204.73 1142 1485.41 2204.73 1151.38 1485.41 2204.95 1142 1485.41 2204.95 1151.38 1477.11 2204.95 1151.38 1477.11 2204.95 1142 1485.57 2202.75 1142 1485.57 2202.75 1151.38 1485.57 2204.73 1142 1485.57 2204.73 1151.38 1485.41 2204.73 1151.26 1477.26 2204.73 1151.26 1477.26 2202.75 1151.26 1485.41 2202.75 1151.26 1477.26 2204.73 1142.12 1477.26 2202.75 1142.12 1485.41 2204.73 1142.12 1485.41 2202.75 1142.12 1477.22 2205.18 1148.94 1477.22 2205.18 1142 1482.43 2205.18 1142 1482.43 2205.18 1148.94 1482.43 2205.28 1142 1482.43 2205.28 1148.94 1477.22 2205.28 1148.94 1477.22 2205.28 1142 1477.22 2206.14 1148.94 1477.22 2206.14 1142 1482.43 2206.14 1142 1482.43 2206.14 1148.94 1482.43 2206.24 1142 1482.43 2206.24 1148.94 1477.22 2206.24 1148.94 1477.22 2206.24 1142 1482.53 2205.28 1142 1482.53 2205.28 1148.94 1482.53 2206.14 1142 1482.53 2206.14 1148.94 1482.43 2206.14 1148.85 1477.32 2206.14 1148.85 1477.32 2205.28 1148.85 1482.43 2205.28 1148.85 1477.32 2206.14 1142.09 1477.32 2205.28 1142.09 1482.43 2206.14 1142.09 1482.43 2205.28 1142.09 1477.08 2206.49 1148.74 1477.08 2206.49 1142 1486.01 2206.49 1142 1486.01 2206.49 1148.74 1486.01 2206.59 1142 1486.01 2206.59 1148.74 1477.08 2206.59 1148.74 1477.08 2206.59 1142 1477.08 2207.57 1148.74 1477.08 2207.57 1142 1486.01 2207.57 1142 1486.01 2207.57 1148.74 1486.01 2207.68 1142 1486.01 2207.68 1148.74 1477.08 2207.68 1148.74 1477.08 2207.68 1142 1486.18 2206.59 1142 1486.18 2206.59 1148.74 1486.18 2207.57 1142 1486.18 2207.57 1148.74 1486.01 2207.57 1148.65 1477.25 2207.57 1148.65 1477.25 2206.59 1148.65 1486.01 2206.59 1148.65 1477.25 2207.57 1142.09 1477.25 2206.59 1142.09 1486.01 2207.57 1142.09 1486.01 2206.59 1142.09 1477.21 2207.93 1150.93 1477.21 2207.93 1142.01 1482.73 2207.93 1142.01 1482.73 2207.93 1150.93 1482.73 2208.12 1142.01 1482.73 2208.12 1150.93 1477.21 2208.12 1150.93 1477.21 2208.12 1142.01 1477.21 2209.92 1150.93 1477.21 2209.92 1142.01 1482.73 2209.92 1142.01 1482.73 2209.92 1150.93 1482.73 2210.12 1142.01 1482.73 2210.12 1150.93 1477.21 2210.12 1150.93 1477.21 2210.12 1142.01 1482.84 2208.12 1142.01 1482.84 2208.12 1150.93 1482.84 2209.92 1142.01 1482.84 2209.92 1150.93 1482.73 2209.92 1150.82 1477.31 2209.92 1150.82 1477.31 2208.12 1150.82 1482.73 2208.12 1150.82 1477.31 2209.92 1142.12 1477.31 2208.12 1142.12 1482.73 2209.92 1142.12 1482.73 2208.12 1142.12 1477.22 2210.36 1148.62 1477.22 2210.36 1142 1482.55 2210.36 1142 1482.55 2210.36 1148.62 1482.55 2210.5 1142 1482.55 2210.5 1148.62 1477.22 2210.5 1148.62 1477.22 2210.5 1142 1477.22 2211.78 1148.62 1477.22 2211.78 1142 1482.55 2211.78 1142 1482.55 2211.78 1148.62 1482.55 2211.92 1142 1482.55 2211.92 1148.62 1477.22 2211.92 1148.62 1477.22 2211.92 1142 1482.65 2210.5 1142 1482.65 2210.5 1148.62 1482.65 2211.78 1142 1482.65 2211.78 1148.62 1482.55 2211.78 1148.53 1477.32 2211.78 1148.53 1477.32 2210.5 1148.53 1482.55 2210.5 1148.53 1477.32 2211.78 1142.09 1477.32 2210.5 1142.09 1482.55 2211.78 1142.09 1482.55 2210.5 1142.09 1477.17 2212.16 1148.46 1477.17 2212.16 1142 1483.66 2212.16 1142 1483.66 2212.16 1148.46 1483.66 2212.22 1142 1483.66 2212.22 1148.46 1477.17 2212.22 1148.46 1477.17 2212.22 1142 1477.17 2212.68 1148.46 1477.17 2212.68 1142 1483.66 2212.68 1142 1483.66 2212.68 1148.46 1483.66 2212.74 1142 1483.66 2212.74 1148.46 1477.17 2212.74 1148.46 1477.17 2212.74 1142 1483.78 2212.22 1142 1483.78 2212.22 1148.46 1483.78 2212.68 1142 1483.78 2212.68 1148.46 1483.66 2212.68 1148.38 1477.3 2212.68 1148.38 1477.3 2212.22 1148.38 1483.66 2212.22 1148.38 1477.3 2212.68 1142.08 1477.3 2212.22 1142.08 1483.66 2212.68 1142.08 1483.66 2212.22 1142.08 1477.13 2212.99 1150.01 1477.13 2212.99 1142 1484.62 2212.99 1142 1484.62 2212.99 1150.01 1484.62 2213.2 1142 1484.62 2213.2 1150.01 1477.13 2213.2 1150.01 1477.13 2213.2 1142 1477.13 2215.08 1150.01 1477.13 2215.08 1142 1484.62 2215.08 1142 1484.62 2215.08 1150.01 1484.62 2215.29 1142 1484.62 2215.29 1150.01 1477.13 2215.29 1150.01 1477.13 2215.29 1142 1484.76 2213.2 1142 1484.76 2213.2 1150.01 1484.76 2215.08 1142 1484.76 2215.08 1150.01 1484.62 2215.08 1149.9 1477.27 2215.08 1149.9 1477.27 2213.2 1149.9 1484.62 2213.2 1149.9 1477.27 2215.08 1142.1 1477.27 2213.2 1142.1 1484.62 2215.08 1142.1 1484.62 2213.2 1142.1 1477.11 2215.53 1149.87 1477.11 2215.53 1142.01 1485.07 2215.53 1142.01 1485.07 2215.53 1149.87 1485.07 2215.62 1142.01 1485.07 2215.62 1149.87 1477.11 2215.62 1149.87 1477.11 2215.62 1142.01 1477.11 2216.38 1149.87 1477.11 2216.38 1142.01 1485.07 2216.38 1142.01 1485.07 2216.38 1149.87 1485.07 2216.47 1142.01 1485.07 2216.47 1149.87 1477.11 2216.47 1149.87 1477.11 2216.47 1142.01 1485.22 2215.62 1142.01 1485.22 2215.62 1149.87 1485.22 2216.38 1142.01 1485.22 2216.38 1149.87 1485.07 2216.38 1149.77 1477.27 2216.38 1149.77 1477.27 2215.62 1149.77 1485.07 2215.62 1149.77 1477.27 2216.38 1142.11 1477.27 2215.62 1142.11 1485.07 2216.38 1142.11 1485.07 2215.62 1142.11 1477.18 2216.72 1150.44 1477.18 2216.72 1142 1483.21 2216.72 1142 1483.21 2216.72 1150.44 1483.21 2216.78 1142 1483.21 2216.78 1150.44 1477.18 2216.78 1150.44 1477.18 2216.78 1142 1477.18 2217.28 1150.44 1477.18 2217.28 1142 1483.21 2217.28 1142 1483.21 2217.28 1150.44 1483.21 2217.34 1142 1483.21 2217.34 1150.44 1477.18 2217.34 1150.44 1477.18 2217.34 1142 1483.32 2216.78 1142 1483.32 2216.78 1150.44 1483.32 2217.28 1142 1483.32 2217.28 1150.44 1483.21 2217.28 1150.33 1477.3 2217.28 1150.33 1477.3 2216.78 1150.33 1483.21 2216.78 1150.33 1477.3 2217.28 1142.11 1477.3 2216.78 1142.11 1483.21 2217.28 1142.11 1483.21 2216.78 1142.11 1489.42 2223.97 1155 1477.42 2223.97 1155 1489.42 2223.97 1154 1489.42 2189.97 1155 1477.42 2223.97 1154 1477.42 2189.97 1155 1489.42 2189.97 1154 1477.42 2189.97 1154 1477.1 2189.96 1162.28 1477.1 2189.96 1155 1485.35 2189.96 1155 1485.35 2189.96 1162.28 1485.35 2190.19 1155 1485.35 2190.19 1162.28 1477.1 2190.19 1162.28 1477.1 2190.19 1155 1477.1 2192.25 1162.28 1477.1 2192.25 1155 1485.35 2192.25 1155 1485.35 2192.25 1162.28 1485.35 2192.48 1155 1485.35 2192.48 1162.28 1477.1 2192.48 1162.28 1477.1 2192.48 1155 1485.5 2190.19 1155 1485.5 2190.19 1162.28 1485.5 2192.25 1155 1485.5 2192.25 1162.28 1485.35 2192.25 1162.18 1477.26 2192.25 1162.18 1477.26 2190.19 1162.18 1485.35 2190.19 1162.18 1477.26 2192.25 1155.1 1477.26 2190.19 1155.1 1485.35 2192.25 1155.1 1485.35 2190.19 1155.1 1477.21 2192.73 1164.56 1477.21 2192.73 1155 1482.64 2192.73 1155 1482.64 2192.73 1164.56 1482.64 2192.97 1155 1482.64 2192.97 1164.56 1477.21 2192.97 1164.56 1477.21 2192.97 1155 1477.21 2195.09 1164.56 1477.21 2195.09 1155 1482.64 2195.09 1155 1482.64 2195.09 1164.56 1482.64 2195.33 1155 1482.64 2195.33 1164.56 1477.21 2195.33 1164.56 1477.21 2195.33 1155 1482.74 2192.97 1155 1482.74 2192.97 1164.56 1482.74 2195.09 1155 1482.74 2195.09 1164.56 1482.64 2195.09 1164.43 1477.31 2195.09 1164.43 1477.31 2192.97 1164.43 1482.64 2192.97 1164.43 1477.31 2195.09 1155.13 1477.31 2192.97 1155.13 1482.64 2195.09 1155.13 1482.64 2192.97 1155.13 1477.08 2195.58 1161.93 1477.08 2195.58 1155.01 1486.06 2195.58 1155.01 1486.06 2195.58 1161.93 1486.06 2195.83 1155.01 1486.06 2195.83 1161.93 1477.08 2195.83 1161.93 1477.08 2195.83 1155.01 1477.08 2198.11 1161.93 1477.08 2198.11 1155.01 1486.06 2198.11 1155.01 1486.06 2198.11 1161.93 1486.06 2198.36 1155.01 1486.06 2198.36 1161.93 1477.08 2198.36 1161.93 1477.08 2198.36 1155.01 1486.23 2195.83 1155.01 1486.23 2195.83 1161.93 1486.23 2198.11 1155.01 1486.23 2198.11 1161.93 1486.06 2198.11 1161.84 1477.25 2198.11 1161.84 1477.25 2195.83 1161.84 1486.06 2195.83 1161.84 1477.25 2198.11 1155.1 1477.25 2195.83 1155.1 1486.06 2198.11 1155.1 1486.06 2195.83 1155.1 1477.07 2198.61 1161.06 1477.07 2198.61 1155 1486.15 2198.61 1155 1486.15 2198.61 1161.06 1486.15 2198.97 1155 1486.15 2198.97 1161.06 1477.07 2198.97 1161.06 1477.07 2198.97 1155 1477.07 2202.12 1161.06 1477.07 2202.12 1155 1486.15 2202.12 1155 1486.15 2202.12 1161.06 1486.15 2202.47 1155 1486.15 2202.47 1161.06 1477.07 2202.47 1161.06 1477.07 2202.47 1155 1486.32 2198.97 1155 1486.32 2198.97 1161.06 1486.32 2202.12 1155 1486.32 2202.12 1161.06 1486.15 2202.12 1160.98 1477.24 2202.12 1160.98 1477.24 2198.97 1160.98 1486.15 2198.97 1160.98 1477.24 2202.12 1155.08 1477.24 2198.97 1155.08 1486.15 2202.12 1155.08 1486.15 2198.97 1155.08 1477.11 2202.72 1162.59 1477.11 2202.72 1155 1485.05 2202.72 1155 1485.05 2202.72 1162.59 1485.05 2202.82 1155 1485.05 2202.82 1162.59 1477.11 2202.82 1162.59 1477.11 2202.82 1155 1477.11 2203.76 1162.59 1477.11 2203.76 1155 1485.05 2203.76 1155 1485.05 2203.76 1162.59 1485.05 2203.87 1155 1485.05 2203.87 1162.59 1477.11 2203.87 1162.59 1477.11 2203.87 1155 1485.2 2202.82 1155 1485.2 2202.82 1162.59 1485.2 2203.76 1155 1485.2 2203.76 1162.59 1485.05 2203.76 1162.49 1477.26 2203.76 1162.49 1477.26 2202.82 1162.49 1485.05 2202.82 1162.49 1477.26 2203.76 1155.09 1477.26 2202.82 1155.09 1485.05 2203.76 1155.09 1485.05 2202.82 1155.09 1477.17 2204.11 1162.42 1477.17 2204.11 1155 1483.56 2204.11 1155 1483.56 2204.11 1162.42 1483.56 2204.21 1155 1483.56 2204.21 1162.42 1477.17 2204.21 1162.42 1477.17 2204.21 1155 1477.17 2205.09 1162.42 1477.17 2205.09 1155 1483.56 2205.09 1155 1483.56 2205.09 1162.42 1483.56 2205.19 1155 1483.56 2205.19 1162.42 1477.17 2205.19 1162.42 1477.17 2205.19 1155 1483.68 2204.21 1155 1483.68 2204.21 1162.42 1483.68 2205.09 1155 1483.68 2205.09 1162.42 1483.56 2205.09 1162.32 1477.29 2205.09 1162.32 1477.29 2204.21 1162.32 1483.56 2204.21 1162.32 1477.29 2205.09 1155.1 1477.29 2204.21 1155.1 1483.56 2205.09 1155.1 1483.56 2204.21 1155.1 1477.07 2205.43 1161.09 1477.07 2205.43 1155 1486.2 2205.43 1155 1486.2 2205.43 1161.09 1486.2 2205.77 1155 1486.2 2205.77 1161.09 1477.07 2205.77 1161.09 1477.07 2205.77 1155 1477.07 2208.81 1161.09 1477.07 2208.81 1155 1486.2 2208.81 1155 1486.2 2208.81 1161.09 1486.2 2209.15 1155 1486.2 2209.15 1161.09 1477.07 2209.15 1161.09 1477.07 2209.15 1155 1486.38 2205.77 1155 1486.38 2205.77 1161.09 1486.38 2208.81 1155 1486.38 2208.81 1161.09 1486.2 2208.81 1161 1477.24 2208.81 1161 1477.24 2205.77 1161 1486.2 2205.77 1161 1477.24 2208.81 1155.08 1477.24 2205.77 1155.08 1486.2 2208.81 1155.08 1486.2 2205.77 1155.08 1477.17 2209.39 1162.08 1477.17 2209.39 1155 1483.42 2209.39 1155 1483.42 2209.39 1162.08 1483.42 2209.66 1155 1483.42 2209.66 1162.08 1477.17 2209.66 1162.08 1477.17 2209.66 1155 1477.17 2212.1 1162.08 1477.17 2212.1 1155 1483.42 2212.1 1155 1483.42 2212.1 1162.08 1483.42 2212.37 1155 1483.42 2212.37 1162.08 1477.17 2212.37 1162.08 1477.17 2212.37 1155 1483.54 2209.66 1155 1483.54 2209.66 1162.08 1483.54 2212.1 1155 1483.54 2212.1 1162.08 1483.42 2212.1 1161.99 1477.29 2212.1 1161.99 1477.29 2209.66 1161.99 1483.42 2209.66 1161.99 1477.29 2212.1 1155.09 1477.29 2209.66 1155.09 1483.42 2212.1 1155.09 1483.42 2209.66 1155.09 1477.1 2212.62 1161.27 1477.1 2212.62 1155 1485.39 2212.62 1155 1485.39 2212.62 1161.27 1485.39 2212.72 1155 1485.39 2212.72 1161.27 1477.1 2212.72 1161.27 1477.1 2212.72 1155 1477.1 2213.66 1161.27 1477.1 2213.66 1155 1485.39 2213.66 1155 1485.39 2213.66 1161.27 1485.39 2213.76 1155 1485.39 2213.76 1161.27 1477.1 2213.76 1161.27 1477.1 2213.76 1155 1485.54 2212.72 1155 1485.54 2212.72 1161.27 1485.54 2213.66 1155 1485.54 2213.66 1161.27 1485.39 2213.66 1161.18 1477.26 2213.66 1161.18 1477.26 2212.72 1161.18 1485.39 2212.72 1161.18 1477.26 2213.66 1155.08 1477.26 2212.72 1155.08 1485.39 2213.66 1155.08 1485.39 2212.72 1155.08 1477.15 2214.01 1165.32 1477.15 2214.01 1155 1484.4 2214.01 1155 1484.4 2214.01 1165.32 1484.4 2214.33 1155 1484.4 2214.33 1165.32 1477.15 2214.33 1165.32 1477.15 2214.33 1155 1477.15 2217.25 1165.32 1477.15 2217.25 1155 1484.4 2217.25 1155 1484.4 2217.25 1165.32 1484.4 2217.58 1155 1484.4 2217.58 1165.32 1477.15 2217.58 1165.32 1477.15 2217.58 1155 1484.53 2214.33 1155 1484.53 2214.33 1165.32 1484.53 2217.25 1155 1484.53 2217.25 1165.32 1484.4 2217.25 1165.18 1477.29 2217.25 1165.18 1477.29 2214.33 1165.18 1484.4 2214.33 1165.18 1477.29 2217.25 1155.14 1477.29 2214.33 1155.14 1484.4 2217.25 1155.14 1484.4 2214.33 1155.14 1489.42 2223.97 1168 1477.42 2223.97 1168 1489.42 2223.97 1167 1489.42 2189.97 1168 1477.42 2223.97 1167 1477.42 2189.97 1168 1489.42 2189.97 1167 1477.42 2189.97 1167 1477.22 2189.97 1176.4 1477.22 2189.97 1168 1482.4 2189.97 1168 1482.4 2189.97 1176.4 1482.4 2190.04 1168 1482.4 2190.04 1176.4 1477.22 2190.04 1176.4 1477.22 2190.04 1168 1477.22 2190.62 1176.4 1477.22 2190.62 1168 1482.4 2190.62 1168 1482.4 2190.62 1176.4 1482.4 2190.69 1168 1482.4 2190.69 1176.4 1477.22 2190.69 1176.4 1477.22 2190.69 1168 1482.5 2190.04 1168 1482.5 2190.04 1176.4 1482.5 2190.62 1168 1482.5 2190.62 1176.4 1482.4 2190.62 1176.29 1477.32 2190.62 1176.29 1477.32 2190.04 1176.29 1482.4 2190.04 1176.29 1477.32 2190.62 1168.11 1477.32 2190.04 1168.11 1482.4 2190.62 1168.11 1482.4 2190.04 1168.11 1477.14 2190.94 1178.98 1477.14 2190.94 1168 1484.46 2190.94 1168 1484.46 2190.94 1178.98 1484.46 2191.1 1168 1484.46 2191.1 1178.98 1477.14 2191.1 1178.98 1477.14 2191.1 1168 1477.14 2192.54 1178.98 1477.14 2192.54 1168 1484.46 2192.54 1168 1484.46 2192.54 1178.98 1484.46 2192.7 1168 1484.46 2192.7 1178.98 1477.14 2192.7 1178.98 1477.14 2192.7 1168 1484.6 2191.1 1168 1484.6 2191.1 1178.98 1484.6 2192.54 1168 1484.6 2192.54 1178.98 1484.46 2192.54 1178.84 1477.28 2192.54 1178.84 1477.28 2191.1 1178.84 1484.46 2191.1 1178.84 1477.28 2192.54 1168.14 1477.28 2191.1 1168.14 1484.46 2192.54 1168.14 1484.46 2191.1 1168.14 1477.1 2192.95 1175.22 1477.1 2192.95 1168 1485.3 2192.95 1168 1485.3 2192.95 1175.22 1485.3 2193.19 1168 1485.3 2193.19 1175.22 1477.1 2193.19 1175.22 1477.1 2193.19 1168 1477.1 2195.31 1175.22 1477.1 2195.31 1168 1485.3 2195.31 1168 1485.3 2195.31 1175.22 1485.3 2195.55 1168 1485.3 2195.55 1175.22 1477.1 2195.55 1175.22 1477.1 2195.55 1168 1485.46 2193.19 1168 1485.46 2193.19 1175.22 1485.46 2195.31 1168 1485.46 2195.31 1175.22 1485.3 2195.31 1175.13 1477.26 2195.31 1175.13 1477.26 2193.19 1175.13 1485.3 2193.19 1175.13 1477.26 2195.31 1168.1 1477.26 2193.19 1168.1 1485.3 2195.31 1168.1 1485.3 2193.19 1168.1 1477.07 2195.8 1174.39 1477.07 2195.8 1168.01 1486.05 2195.8 1168.01 1486.05 2195.8 1174.39 1486.05 2195.86 1168.01 1486.05 2195.86 1174.39 1477.07 2195.86 1174.39 1477.07 2195.86 1168.01 1477.07 2196.36 1174.39 1477.07 2196.36 1168.01 1486.05 2196.36 1168.01 1486.05 2196.36 1174.39 1486.05 2196.42 1168.01 1486.05 2196.42 1174.39 1477.07 2196.42 1174.39 1477.07 2196.42 1168.01 1486.22 2195.86 1168.01 1486.22 2195.86 1174.39 1486.22 2196.36 1168.01 1486.22 2196.36 1174.39 1486.05 2196.36 1174.31 1477.24 2196.36 1174.31 1477.24 2195.86 1174.31 1486.05 2195.86 1174.31 1477.24 2196.36 1168.09 1477.24 2195.86 1168.09 1486.05 2196.36 1168.09 1486.05 2195.86 1168.09 1477.09 2196.66 1178.7 1477.09 2196.66 1168 1485.83 2196.66 1168 1485.83 2196.66 1178.7 1485.83 2196.77 1168 1485.83 2196.77 1178.7 1477.09 2196.77 1178.7 1477.09 2196.77 1168 1477.09 2197.71 1178.7 1477.09 2197.71 1168 1485.83 2197.71 1168 1485.83 2197.71 1178.7 1485.83 2197.82 1168 1485.83 2197.82 1178.7 1477.09 2197.82 1178.7 1477.09 2197.82 1168 1485.99 2196.77 1168 1485.99 2196.77 1178.7 1485.99 2197.71 1168 1485.99 2197.71 1178.7 1485.83 2197.71 1178.56 1477.26 2197.71 1178.56 1477.26 2196.77 1178.56 1485.83 2196.77 1178.56 1477.26 2197.71 1168.14 1477.26 2196.77 1168.14 1485.83 2197.71 1168.14 1485.83 2196.77 1168.14 1477.11 2198.07 1174.88 1477.11 2198.07 1168 1485.4 2198.07 1168 1485.4 2198.07 1174.88 1485.4 2198.3 1168 1485.4 2198.3 1174.88 1477.11 2198.3 1174.88 1477.11 2198.3 1168 1477.11 2200.44 1174.88 1477.11 2200.44 1168 1485.4 2200.44 1168 1485.4 2200.44 1174.88 1485.4 2200.68 1168 1485.4 2200.68 1174.88 1477.11 2200.68 1174.88 1477.11 2200.68 1168 1485.55 2198.3 1168 1485.55 2198.3 1174.88 1485.55 2200.44 1168 1485.55 2200.44 1174.88 1485.4 2200.44 1174.79 1477.27 2200.44 1174.79 1477.27 2198.3 1174.79 1485.4 2198.3 1174.79 1477.27 2200.44 1168.09 1477.27 2198.3 1168.09 1485.4 2200.44 1168.09 1485.4 2198.3 1168.09 1477.14 2200.93 1176.83 1477.14 2200.93 1168 1484.3 2200.93 1168 1484.3 2200.93 1176.83 1484.3 2201.18 1168 1484.3 2201.18 1176.83 1477.14 2201.18 1176.83 1477.14 2201.18 1168 1477.14 2203.38 1176.83 1477.14 2203.38 1168 1484.3 2203.38 1168 1484.3 2203.38 1176.83 1484.3 2203.63 1168 1484.3 2203.63 1176.83 1477.14 2203.63 1176.83 1477.14 2203.63 1168 1484.44 2201.18 1168 1484.44 2201.18 1176.83 1484.44 2203.38 1168 1484.44 2203.38 1176.83 1484.3 2203.38 1176.71 1477.28 2203.38 1176.71 1477.28 2201.18 1176.71 1484.3 2201.18 1176.71 1477.28 2203.38 1168.11 1477.28 2201.18 1168.11 1484.3 2203.38 1168.11 1484.3 2201.18 1168.11 1477.21 2203.88 1174.17 1477.21 2203.88 1168.01 1482.54 2203.88 1168.01 1482.54 2203.88 1174.17 1482.54 2204.24 1168.01 1482.54 2204.24 1174.17 1477.21 2204.24 1174.17 1477.21 2204.24 1168.01 1477.21 2207.5 1174.17 1477.21 2207.5 1168.01 1482.54 2207.5 1168.01 1482.54 2207.5 1174.17 1482.54 2207.86 1168.01 1482.54 2207.86 1174.17 1477.21 2207.86 1174.17 1477.21 2207.86 1168.01 1482.64 2204.24 1168.01 1482.64 2204.24 1174.17 1482.64 2207.5 1168.01 1482.64 2207.5 1174.17 1482.54 2207.5 1174.09 1477.31 2207.5 1174.09 1477.31 2204.24 1174.09 1482.54 2204.24 1174.09 1477.31 2207.5 1168.09 1477.31 2204.24 1168.09 1482.54 2207.5 1168.09 1482.54 2204.24 1168.09 1477.09 2208.1 1174.38 1477.09 2208.1 1168 1485.62 2208.1 1168 1485.62 2208.1 1174.38 1485.62 2208.3 1168 1485.62 2208.3 1174.38 1477.09 2208.3 1174.38 1477.09 2208.3 1168 1477.09 2210.08 1174.38 1477.09 2210.08 1168 1485.62 2210.08 1168 1485.62 2210.08 1174.38 1485.62 2210.28 1168 1485.62 2210.28 1174.38 1477.09 2210.28 1174.38 1477.09 2210.28 1168 1485.78 2208.3 1168 1485.78 2208.3 1174.38 1485.78 2210.08 1168 1485.78 2210.08 1174.38 1485.62 2210.08 1174.3 1477.26 2210.08 1174.3 1477.26 2208.3 1174.3 1485.62 2208.3 1174.3 1477.26 2210.08 1168.08 1477.26 2208.3 1168.08 1485.62 2210.08 1168.08 1485.62 2208.3 1168.08 1477.12 2210.53 1175.92 1477.12 2210.53 1168 1484.7 2210.53 1168 1484.7 2210.53 1175.92 1484.7 2210.58 1168 1484.7 2210.58 1175.92 1477.12 2210.58 1175.92 1477.12 2210.58 1168 1477.12 2211.02 1175.92 1477.12 2211.02 1168 1484.7 2211.02 1168 1484.7 2211.02 1175.92 1484.7 2211.07 1168 1484.7 2211.07 1175.92 1477.12 2211.07 1175.92 1477.12 2211.07 1168 1484.84 2210.58 1168 1484.84 2210.58 1175.92 1484.84 2211.02 1168 1484.84 2211.02 1175.92 1484.7 2211.02 1175.82 1477.27 2211.02 1175.82 1477.27 2210.58 1175.82 1484.7 2210.58 1175.82 1477.27 2211.02 1168.1 1477.27 2210.58 1168.1 1484.7 2211.02 1168.1 1484.7 2210.58 1168.1 1477.16 2211.32 1175.84 1477.16 2211.32 1168 1483.99 2211.32 1168 1483.99 2211.32 1175.84 1483.99 2211.49 1168 1483.99 2211.49 1175.84 1477.16 2211.49 1175.84 1477.16 2211.49 1168 1477.16 2213.02 1175.84 1477.16 2213.02 1168 1483.99 2213.02 1168 1483.99 2213.02 1175.84 1483.99 2213.19 1168 1483.99 2213.19 1175.84 1477.16 2213.19 1175.84 1477.16 2213.19 1168 1484.12 2211.49 1168 1484.12 2211.49 1175.84 1484.12 2213.02 1168 1484.12 2213.02 1175.84 1483.99 2213.02 1175.74 1477.29 2213.02 1175.74 1477.29 2211.49 1175.74 1483.99 2211.49 1175.74 1477.29 2213.02 1168.1 1477.29 2211.49 1168.1 1483.99 2213.02 1168.1 1483.99 2211.49 1168.1 1477.17 2213.42 1175.88 1477.17 2213.42 1168 1483.67 2213.42 1168 1483.67 2213.42 1175.88 1483.67 2213.52 1168 1483.67 2213.52 1175.88 1477.17 2213.52 1175.88 1477.17 2213.52 1168 1477.17 2214.38 1175.88 1477.17 2214.38 1168 1483.67 2214.38 1168 1483.67 2214.38 1175.88 1483.67 2214.48 1168 1483.67 2214.48 1175.88 1477.17 2214.48 1175.88 1477.17 2214.48 1168 1483.79 2213.52 1168 1483.79 2213.52 1175.88 1483.79 2214.38 1168 1483.79 2214.38 1175.88 1483.67 2214.38 1175.78 1477.3 2214.38 1175.78 1477.3 2213.52 1175.78 1483.67 2213.52 1175.78 1477.3 2214.38 1168.1 1477.3 2213.52 1168.1 1483.67 2214.38 1168.1 1483.67 2213.52 1168.1 1477.2 2214.73 1175.18 1477.2 2214.73 1168 1482.89 2214.73 1168 1482.89 2214.73 1175.18 1482.89 2214.95 1168 1482.89 2214.95 1175.18 1477.2 2214.95 1175.18 1477.2 2214.95 1168 1477.2 2216.91 1175.18 1477.2 2216.91 1168 1482.89 2216.91 1168 1482.89 2216.91 1175.18 1482.89 2217.13 1168 1482.89 2217.13 1175.18 1477.2 2217.13 1175.18 1477.2 2217.13 1168 1483 2214.95 1168 1483 2214.95 1175.18 1483 2216.91 1168 1483 2216.91 1175.18 1482.89 2216.91 1175.09 1477.31 2216.91 1175.09 1477.31 2214.95 1175.09 1482.89 2214.95 1175.09 1477.31 2216.91 1168.09 1477.31 2214.95 1168.09 1482.89 2216.91 1168.09 1482.89 2214.95 1168.09 1489.42 2223.97 1181 1477.42 2223.97 1181 1489.42 2223.97 1180 1489.42 2189.97 1181 1477.42 2223.97 1180 1477.42 2189.97 1181 1489.42 2189.97 1180 1477.42 2189.97 1180 1477.21 2189.97 1191.64 1477.21 2189.97 1181 1482.73 2189.97 1181 1482.73 2189.97 1191.64 1482.73 2190.17 1181 1482.73 2190.17 1191.64 1477.21 2190.17 1191.64 1477.21 2190.17 1181 1477.21 2191.93 1191.64 1477.21 2191.93 1181 1482.73 2191.93 1181 1482.73 2191.93 1191.64 1482.73 2192.13 1181 1482.73 2192.13 1191.64 1477.21 2192.13 1191.64 1477.21 2192.13 1181 1482.84 2190.17 1181 1482.84 2190.17 1191.64 1482.84 2191.93 1181 1482.84 2191.93 1191.64 1482.73 2191.93 1191.5 1477.31 2191.93 1191.5 1477.31 2190.17 1191.5 1482.73 2190.17 1191.5 1477.31 2191.93 1181.14 1477.31 2190.17 1181.14 1482.73 2191.93 1181.14 1482.73 2190.17 1181.14 1477.12 2192.38 1190.06 1477.12 2192.38 1181.01 1484.81 2192.38 1181.01 1484.81 2192.38 1190.06 1484.81 2192.63 1181.01 1484.81 2192.63 1190.06 1477.12 2192.63 1190.06 1477.12 2192.63 1181.01 1477.12 2194.87 1190.06 1477.12 2194.87 1181.01 1484.81 2194.87 1181.01 1484.81 2194.87 1190.06 1484.81 2195.12 1181.01 1484.81 2195.12 1190.06 1477.12 2195.12 1190.06 1477.12 2195.12 1181.01 1484.96 2192.63 1181.01 1484.96 2192.63 1190.06 1484.96 2194.87 1181.01 1484.96 2194.87 1190.06 1484.81 2194.87 1189.94 1477.27 2194.87 1189.94 1477.27 2192.63 1189.94 1484.81 2192.63 1189.94 1477.27 2194.87 1181.12 1477.27 2192.63 1181.12 1484.81 2194.87 1181.12 1484.81 2192.63 1181.12 1477.16 2195.38 1190.46 1477.16 2195.38 1181 1483.89 2195.38 1181 1483.89 2195.38 1190.46 1483.89 2195.72 1181 1483.89 2195.72 1190.46 1477.16 2195.72 1190.46 1477.16 2195.72 1181 1477.16 2198.76 1190.46 1477.16 2198.76 1181 1483.89 2198.76 1181 1483.89 2198.76 1190.46 1483.89 2199.1 1181 1483.89 2199.1 1190.46 1477.16 2199.1 1190.46 1477.16 2199.1 1181 1484.02 2195.72 1181 1484.02 2195.72 1190.46 1484.02 2198.76 1181 1484.02 2198.76 1190.46 1483.89 2198.76 1190.34 1477.29 2198.76 1190.34 1477.29 2195.72 1190.34 1483.89 2195.72 1190.34 1477.29 2198.76 1181.12 1477.29 2195.72 1181.12 1483.89 2198.76 1181.12 1483.89 2195.72 1181.12 1477.2 2199.35 1188.2 1477.2 2199.35 1181 1482.99 2199.35 1181 1482.99 2199.35 1188.2 1482.99 2199.45 1181 1482.99 2199.45 1188.2 1477.2 2199.45 1188.2 1477.2 2199.45 1181 1477.2 2200.31 1188.2 1477.2 2200.31 1181 1482.99 2200.31 1181 1482.99 2200.31 1188.2 1482.99 2200.41 1181 1482.99 2200.41 1188.2 1477.2 2200.41 1188.2 1477.2 2200.41 1181 1483.1 2199.45 1181 1483.1 2199.45 1188.2 1483.1 2200.31 1181 1483.1 2200.31 1188.2 1482.99 2200.31 1188.11 1477.31 2200.31 1188.11 1477.31 2199.45 1188.11 1482.99 2199.45 1188.11 1477.31 2200.31 1181.09 1477.31 2199.45 1181.09 1482.99 2200.31 1181.09 1482.99 2199.45 1181.09 1477.19 2200.66 1190.88 1477.19 2200.66 1181 1483.24 2200.66 1181 1483.24 2200.66 1190.88 1483.24 2200.98 1181 1483.24 2200.98 1190.88 1477.19 2200.98 1190.88 1477.19 2200.98 1181 1477.19 2203.8 1190.88 1477.19 2203.8 1181 1483.24 2203.8 1181 1483.24 2203.8 1190.88 1483.24 2204.12 1181 1483.24 2204.12 1190.88 1477.19 2204.12 1190.88 1477.19 2204.12 1181 1483.36 2200.98 1181 1483.36 2200.98 1190.88 1483.36 2203.8 1181 1483.36 2203.8 1190.88 1483.24 2203.8 1190.75 1477.3 2203.8 1190.75 1477.3 2200.98 1190.75 1483.24 2200.98 1190.75 1477.3 2203.8 1181.13 1477.3 2200.98 1181.13 1483.24 2203.8 1181.13 1483.24 2200.98 1181.13 1477.16 2204.36 1190.3 1477.16 2204.36 1181.01 1483.93 2204.36 1181.01 1483.93 2204.36 1190.3 1483.93 2204.49 1181.01 1483.93 2204.49 1190.3 1477.16 2204.49 1190.3 1477.16 2204.49 1181.01 1477.16 2205.63 1190.3 1477.16 2205.63 1181.01 1483.93 2205.63 1181.01 1483.93 2205.63 1190.3 1483.93 2205.76 1181.01 1483.93 2205.76 1190.3 1477.16 2205.76 1190.3 1477.16 2205.76 1181.01 1484.06 2204.49 1181.01 1484.06 2204.49 1190.3 1484.06 2205.63 1181.01 1484.06 2205.63 1190.3 1483.93 2205.63 1190.17 1477.29 2205.63 1190.17 1477.29 2204.49 1190.17 1483.93 2204.49 1190.17 1477.29 2205.63 1181.13 1477.29 2204.49 1181.13 1483.93 2205.63 1181.13 1483.93 2204.49 1181.13 1477.2 2206.01 1190.77 1477.2 2206.01 1181 1482.85 2206.01 1181 1482.85 2206.01 1190.77 1482.85 2206.24 1181 1482.85 2206.24 1190.77 1477.2 2206.24 1190.77 1477.2 2206.24 1181 1477.2 2208.34 1190.77 1477.2 2208.34 1181 1482.85 2208.34 1181 1482.85 2208.34 1190.77 1482.85 2208.58 1181 1482.85 2208.58 1190.77 1477.2 2208.58 1190.77 1477.2 2208.58 1181 1482.96 2206.24 1181 1482.96 2206.24 1190.77 1482.96 2208.34 1181 1482.96 2208.34 1190.77 1482.85 2208.34 1190.64 1477.31 2208.34 1190.64 1477.31 2206.24 1190.64 1482.85 2206.24 1190.64 1477.31 2208.34 1181.12 1477.31 2206.24 1181.12 1482.85 2208.34 1181.12 1482.85 2206.24 1181.12 1477.09 2208.82 1188.39 1477.09 2208.82 1181.01 1485.56 2208.82 1181.01 1485.56 2208.82 1188.39 1485.56 2208.98 1181.01 1485.56 2208.98 1188.39 1477.09 2208.98 1188.39 1477.09 2208.98 1181.01 1477.09 2210.4 1188.39 1477.09 2210.4 1181.01 1485.56 2210.4 1181.01 1485.56 2210.4 1188.39 1485.56 2210.56 1181.01 1485.56 2210.56 1188.39 1477.09 2210.56 1188.39 1477.09 2210.56 1181.01 1485.72 2208.98 1181.01 1485.72 2208.98 1188.39 1485.72 2210.4 1181.01 1485.72 2210.4 1188.39 1485.56 2210.4 1188.3 1477.25 2210.4 1188.3 1477.25 2208.98 1188.3 1485.56 2208.98 1188.3 1477.25 2210.4 1181.1 1477.25 2208.98 1181.1 1485.56 2210.4 1181.1 1485.56 2208.98 1181.1 1477.21 2210.8 1191.66 1477.21 2210.8 1181 1482.48 2210.8 1181 1482.48 2210.8 1191.66 1482.48 2210.98 1181 1482.48 2210.98 1191.66 1477.21 2210.98 1191.66 1477.21 2210.98 1181 1477.21 2212.54 1191.66 1477.21 2212.54 1181 1482.48 2212.54 1181 1482.48 2212.54 1191.66 1482.48 2212.72 1181 1482.48 2212.72 1191.66 1477.21 2212.72 1191.66 1477.21 2212.72 1181 1482.58 2210.98 1181 1482.58 2210.98 1191.66 1482.58 2212.54 1181 1482.58 2212.54 1191.66 1482.48 2212.54 1191.52 1477.31 2212.54 1191.52 1477.31 2210.98 1191.52 1482.48 2210.98 1191.52 1477.31 2212.54 1181.14 1477.31 2210.98 1181.14 1482.48 2212.54 1181.14 1482.48 2210.98 1181.14 1477.13 2212.96 1190.38 1477.13 2212.96 1181 1484.75 2212.96 1181 1484.75 2212.96 1190.38 1484.75 2213.23 1181 1484.75 2213.23 1190.38 1477.13 2213.23 1190.38 1477.13 2213.23 1181 1477.13 2215.65 1190.38 1477.13 2215.65 1181 1484.75 2215.65 1181 1484.75 2215.65 1190.38 1484.75 2215.92 1181 1484.75 2215.92 1190.38 1477.13 2215.92 1190.38 1477.13 2215.92 1181 1484.9 2213.23 1181 1484.9 2213.23 1190.38 1484.9 2215.65 1181 1484.9 2215.65 1190.38 1484.75 2215.65 1190.26 1477.27 2215.65 1190.26 1477.27 2213.23 1190.26 1484.75 2213.23 1190.26 1477.27 2215.65 1181.12 1477.27 2213.23 1181.12 1484.75 2215.65 1181.12 1484.75 2213.23 1181.12 1477.17 2216.16 1187.1 1477.17 2216.16 1181 1483.69 2216.16 1181 1483.69 2216.16 1187.1 1483.69 2216.25 1181 1483.69 2216.25 1187.1 1477.17 2216.25 1187.1 1477.17 2216.25 1181 1477.17 2216.99 1187.1 1477.17 2216.99 1181 1483.69 2216.99 1181 1483.69 2216.99 1187.1 1483.69 2217.08 1181 1483.69 2217.08 1187.1 1477.17 2217.08 1187.1 1477.17 2217.08 1181 1483.82 2216.25 1181 1483.82 2216.25 1187.1 1483.82 2216.99 1181 1483.82 2216.99 1187.1 1483.69 2216.99 1187.02 1477.29 2216.99 1187.02 1477.29 2216.25 1187.02 1483.69 2216.25 1187.02 1477.29 2216.99 1181.08 1477.29 2216.25 1181.08 1483.69 2216.99 1181.08 1483.69 2216.25 1181.08 1489.42 2223.97 1194 1477.42 2223.97 1194 1489.42 2223.97 1193 1489.42 2189.97 1194 1477.42 2223.97 1193 1477.42 2189.97 1194 1489.42 2189.97 1193 1477.42 2189.97 1193 1477.07 2189.97 1202.6 1477.07 2189.97 1194 1486.16 2189.97 1194 1486.16 2189.97 1202.6 1486.16 2190.06 1194 1486.16 2190.06 1202.6 1477.07 2190.06 1202.6 1477.07 2190.06 1194 1477.07 2190.86 1202.6 1477.07 2190.86 1194 1486.16 2190.86 1194 1486.16 2190.86 1202.6 1486.16 2190.95 1194 1486.16 2190.95 1202.6 1477.07 2190.95 1202.6 1477.07 2190.95 1194 1486.34 2190.06 1194 1486.34 2190.06 1202.6 1486.34 2190.86 1194 1486.34 2190.86 1202.6 1486.16 2190.86 1202.49 1477.24 2190.86 1202.49 1477.24 2190.06 1202.49 1486.16 2190.06 1202.49 1477.24 2190.86 1194.11 1477.24 2190.06 1194.11 1486.16 2190.86 1194.11 1486.16 2190.06 1194.11 1477.2 2191.2 1201.08 1477.2 2191.2 1194 1482.86 2191.2 1194 1482.86 2191.2 1201.08 1482.86 2191.53 1194 1482.86 2191.53 1201.08 1477.2 2191.53 1201.08 1477.2 2191.53 1194 1477.2 2194.47 1201.08 1477.2 2194.47 1194 1482.86 2194.47 1194 1482.86 2194.47 1201.08 1482.86 2194.8 1194 1482.86 2194.8 1201.08 1477.2 2194.8 1201.08 1477.2 2194.8 1194 1482.96 2191.53 1194 1482.96 2191.53 1201.08 1482.96 2194.47 1194 1482.96 2194.47 1201.08 1482.86 2194.47 1200.99 1477.31 2194.47 1200.99 1477.31 2191.53 1200.99 1482.86 2191.53 1200.99 1477.31 2194.47 1194.09 1477.31 2191.53 1194.09 1482.86 2194.47 1194.09 1482.86 2191.53 1194.09 1477.22 2195.04 1202.74 1477.22 2195.04 1194 1482.46 2195.04 1194 1482.46 2195.04 1202.74 1482.46 2195.23 1194 1482.46 2195.23 1202.74 1477.22 2195.23 1202.74 1477.22 2195.23 1194 1477.22 2196.91 1202.74 1477.22 2196.91 1194 1482.46 2196.91 1194 1482.46 2196.91 1202.74 1482.46 2197.1 1194 1482.46 2197.1 1202.74 1477.22 2197.1 1202.74 1477.22 2197.1 1194 1482.56 2195.23 1194 1482.56 2195.23 1202.74 1482.56 2196.91 1194 1482.56 2196.91 1202.74 1482.46 2196.91 1202.63 1477.32 2196.91 1202.63 1477.32 2195.23 1202.63 1482.46 2195.23 1202.63 1477.32 2196.91 1194.12 1477.32 2195.23 1194.12 1482.46 2196.91 1194.12 1482.46 2195.23 1194.12 1477.18 2197.34 1200.84 1477.18 2197.34 1194 1483.34 2197.34 1194 1483.34 2197.34 1200.84 1483.34 2197.67 1194 1483.34 2197.67 1200.84 1477.18 2197.67 1200.84 1477.18 2197.67 1194 1477.18 2200.69 1200.84 1477.18 2200.69 1194 1483.34 2200.69 1194 1483.34 2200.69 1200.84 1483.34 2201.02 1194 1483.34 2201.02 1200.84 1477.18 2201.02 1200.84 1477.18 2201.02 1194 1483.46 2197.67 1194 1483.46 2197.67 1200.84 1483.46 2200.69 1194 1483.46 2200.69 1200.84 1483.34 2200.69 1200.75 1477.3 2200.69 1200.75 1477.3 2197.67 1200.75 1483.34 2197.67 1200.75 1477.3 2200.69 1194.09 1477.3 2197.67 1194.09 1483.34 2200.69 1194.09 1483.34 2197.67 1194.09 1477.12 2201.27 1200.44 1477.12 2201.27 1194 1485.04 2201.27 1194 1485.04 2201.27 1200.44 1485.04 2201.41 1194 1485.04 2201.41 1200.44 1477.12 2201.41 1200.44 1477.12 2201.41 1194 1477.12 2202.65 1200.44 1477.12 2202.65 1194 1485.04 2202.65 1194 1485.04 2202.65 1200.44 1485.04 2202.79 1194 1485.04 2202.79 1200.44 1477.12 2202.79 1200.44 1477.12 2202.79 1194 1485.19 2201.41 1194 1485.19 2201.41 1200.44 1485.19 2202.65 1194 1485.19 2202.65 1200.44 1485.04 2202.65 1200.36 1477.27 2202.65 1200.36 1477.27 2201.41 1200.36 1485.04 2201.41 1200.36 1477.27 2202.65 1194.08 1477.27 2201.41 1194.08 1485.04 2202.65 1194.08 1485.04 2201.41 1194.08 1477.16 2203.03 1203.67 1477.16 2203.03 1194.01 1483.7 2203.03 1194.01 1483.7 2203.03 1203.67 1483.7 2203.29 1194.01 1483.7 2203.29 1203.67 1477.16 2203.29 1203.67 1477.16 2203.29 1194.01 1477.16 2205.57 1203.67 1477.16 2205.57 1194.01 1483.7 2205.57 1194.01 1483.7 2205.57 1203.67 1483.7 2205.83 1194.01 1483.7 2205.83 1203.67 1477.16 2205.83 1203.67 1477.16 2205.83 1194.01 1483.82 2203.29 1194.01 1483.82 2203.29 1203.67 1483.82 2205.57 1194.01 1483.82 2205.57 1203.67 1483.7 2205.57 1203.55 1477.29 2205.57 1203.55 1477.29 2203.29 1203.55 1483.7 2203.29 1203.55 1477.29 2205.57 1194.13 1477.29 2203.29 1194.13 1483.7 2205.57 1194.13 1483.7 2203.29 1194.13 1477.11 2206.07 1204.86 1477.11 2206.07 1194 1485.26 2206.07 1194 1485.26 2206.07 1204.86 1485.26 2206.3 1194 1485.26 2206.3 1204.86 1477.11 2206.3 1204.86 1477.11 2206.3 1194 1477.11 2208.32 1204.86 1477.11 2208.32 1194 1485.26 2208.32 1194 1485.26 2208.32 1204.86 1485.26 2208.55 1194 1485.26 2208.55 1204.86 1477.11 2208.55 1204.86 1477.11 2208.55 1194 1485.42 2206.3 1194 1485.42 2206.3 1204.86 1485.42 2208.32 1194 1485.42 2208.32 1204.86 1485.26 2208.32 1204.72 1477.26 2208.32 1204.72 1477.26 2206.3 1204.72 1485.26 2206.3 1204.72 1477.26 2208.32 1194.14 1477.26 2206.3 1194.14 1485.26 2208.32 1194.14 1485.26 2206.3 1194.14 1477.08 2208.8 1200.5 1477.08 2208.8 1194 1485.92 2208.8 1194 1485.92 2208.8 1200.5 1485.92 2209.09 1194 1485.92 2209.09 1200.5 1477.08 2209.09 1200.5 1477.08 2209.09 1194 1477.08 2211.73 1200.5 1477.08 2211.73 1194 1485.92 2211.73 1194 1485.92 2211.73 1200.5 1485.92 2212.03 1194 1485.92 2212.03 1200.5 1477.08 2212.03 1200.5 1477.08 2212.03 1194 1486.09 2209.09 1194 1486.09 2209.09 1200.5 1486.09 2211.73 1194 1486.09 2211.73 1200.5 1485.92 2211.73 1200.41 1477.25 2211.73 1200.41 1477.25 2209.09 1200.41 1485.92 2209.09 1200.41 1477.25 2211.73 1194.09 1477.25 2209.09 1194.09 1485.92 2211.73 1194.09 1485.92 2209.09 1194.09 1477.2 2212.27 1204.49 1477.2 2212.27 1194.01 1482.85 2212.27 1194.01 1482.85 2212.27 1204.49 1482.85 2212.4 1194.01 1482.85 2212.4 1204.49 1477.2 2212.4 1204.49 1477.2 2212.4 1194.01 1477.2 2213.52 1204.49 1477.2 2213.52 1194.01 1482.85 2213.52 1194.01 1482.85 2213.52 1204.49 1482.85 2213.65 1194.01 1482.85 2213.65 1204.49 1477.2 2213.65 1204.49 1477.2 2213.65 1194.01 1482.96 2212.4 1194.01 1482.96 2212.4 1204.49 1482.96 2213.52 1194.01 1482.96 2213.52 1204.49 1482.85 2213.52 1204.36 1477.31 2213.52 1204.36 1477.31 2212.4 1204.36 1482.85 2212.4 1204.36 1477.31 2213.52 1194.14 1477.31 2212.4 1194.14 1482.85 2213.52 1194.14 1482.85 2212.4 1194.14 1477.17 2213.91 1201.36 1477.17 2213.91 1194 1483.73 2213.91 1194 1483.73 2213.91 1201.36 1483.73 2214.25 1194 1483.73 2214.25 1201.36 1477.17 2214.25 1201.36 1477.17 2214.25 1194 1477.17 2217.27 1201.36 1477.17 2217.27 1194 1483.73 2217.27 1194 1483.73 2217.27 1201.36 1483.73 2217.61 1194 1483.73 2217.61 1201.36 1477.17 2217.61 1201.36 1477.17 2217.61 1194 1483.85 2214.25 1194 1483.85 2214.25 1201.36 1483.85 2217.27 1194 1483.85 2217.27 1201.36 1483.73 2217.27 1201.26 1477.3 2217.27 1201.26 1477.3 2214.25 1201.26 1483.73 2214.25 1201.26 1477.3 2217.27 1194.1 1477.3 2214.25 1194.1 1483.73 2217.27 1194.1 1483.73 2214.25 1194.1 1489.42 2223.97 1207 1477.42 2223.97 1207 1489.42 2223.97 1206 1489.42 2189.97 1207 1477.42 2223.97 1206 1477.42 2189.97 1207 1489.42 2189.97 1206 1477.42 2189.97 1206 1477.08 2189.97 1214.96 1477.08 2189.97 1207 1485.84 2189.97 1207 1485.84 2189.97 1214.96 1485.84 2190.33 1207 1485.84 2190.33 1214.96 1477.08 2190.33 1214.96 1477.08 2190.33 1207 1477.08 2193.57 1214.96 1477.08 2193.57 1207 1485.84 2193.57 1207 1485.84 2193.57 1214.96 1485.84 2193.93 1207 1485.84 2193.93 1214.96 1477.08 2193.93 1214.96 1477.08 2193.93 1207 1486 2190.33 1207 1486 2190.33 1214.96 1486 2193.57 1207 1486 2193.57 1214.96 1485.84 2193.57 1214.86 1477.25 2193.57 1214.86 1477.25 2190.33 1214.86 1485.84 2190.33 1214.86 1477.25 2193.57 1207.1 1477.25 2190.33 1207.1 1485.84 2193.57 1207.1 1485.84 2190.33 1207.1 1477.16 2194.18 1213.79 1477.16 2194.18 1207 1483.94 2194.18 1207 1483.94 2194.18 1213.79 1483.94 2194.26 1207 1483.94 2194.26 1213.79 1477.16 2194.26 1213.79 1477.16 2194.26 1207 1477.16 2195.02 1213.79 1477.16 2195.02 1207 1483.94 2195.02 1207 1483.94 2195.02 1213.79 1483.94 2195.1 1207 1483.94 2195.1 1213.79 1477.16 2195.1 1213.79 1477.16 2195.1 1207 1484.07 2194.26 1207 1484.07 2194.26 1213.79 1484.07 2195.02 1207 1484.07 2195.02 1213.79 1483.94 2195.02 1213.7 1477.29 2195.02 1213.7 1477.29 2194.26 1213.7 1483.94 2194.26 1213.7 1477.29 2195.02 1207.08 1477.29 2194.26 1207.08 1483.94 2195.02 1207.08 1483.94 2194.26 1207.08 1477.12 2195.35 1213.53 1477.12 2195.35 1207 1484.91 2195.35 1207 1484.91 2195.35 1213.53 1484.91 2195.4 1207 1484.91 2195.4 1213.53 1477.12 2195.4 1213.53 1477.12 2195.4 1207 1477.12 2195.82 1213.53 1477.12 2195.82 1207 1484.91 2195.82 1207 1484.91 2195.82 1213.53 1484.91 2195.87 1207 1484.91 2195.87 1213.53 1477.12 2195.87 1213.53 1477.12 2195.87 1207 1485.06 2195.4 1207 1485.06 2195.4 1213.53 1485.06 2195.82 1207 1485.06 2195.82 1213.53 1484.91 2195.82 1213.44 1477.27 2195.82 1213.44 1477.27 2195.4 1213.44 1484.91 2195.4 1213.44 1477.27 2195.82 1207.08 1477.27 2195.4 1207.08 1484.91 2195.82 1207.08 1484.91 2195.4 1207.08 1477.1 2196.12 1213.06 1477.1 2196.12 1207 1485.57 2196.12 1207 1485.57 2196.12 1213.06 1485.57 2196.26 1207 1485.57 2196.26 1213.06 1477.1 2196.26 1213.06 1477.1 2196.26 1207 1477.1 2197.43 1213.06 1477.1 2197.43 1207 1485.57 2197.43 1207 1485.57 2197.43 1213.06 1485.57 2197.56 1207 1485.57 2197.56 1213.06 1477.1 2197.56 1213.06 1477.1 2197.56 1207 1485.73 2196.26 1207 1485.73 2196.26 1213.06 1485.73 2197.43 1207 1485.73 2197.43 1213.06 1485.57 2197.43 1212.98 1477.26 2197.43 1212.98 1477.26 2196.26 1212.98 1485.57 2196.26 1212.98 1477.26 2197.43 1207.08 1477.26 2196.26 1207.08 1485.57 2197.43 1207.08 1485.57 2196.26 1207.08 1477.21 2197.81 1215.89 1477.21 2197.81 1207.01 1482.44 2197.81 1207.01 1482.44 2197.81 1215.89 1482.44 2197.94 1207.01 1482.44 2197.94 1215.89 1477.21 2197.94 1215.89 1477.21 2197.94 1207.01 1477.21 2199.06 1215.89 1477.21 2199.06 1207.01 1482.44 2199.06 1207.01 1482.44 2199.06 1215.89 1482.44 2199.19 1207.01 1482.44 2199.19 1215.89 1477.21 2199.19 1215.89 1477.21 2199.19 1207.01 1482.54 2197.94 1207.01 1482.54 2197.94 1215.89 1482.54 2199.06 1207.01 1482.54 2199.06 1215.89 1482.44 2199.06 1215.78 1477.31 2199.06 1215.78 1477.31 2197.94 1215.78 1482.44 2197.94 1215.78 1477.31 2199.06 1207.12 1477.31 2197.94 1207.12 1482.44 2199.06 1207.12 1482.44 2197.94 1207.12 1477.18 2199.44 1217.76 1477.18 2199.44 1207.01 1483.21 2199.44 1207.01 1483.21 2199.44 1217.76 1483.21 2199.8 1207.01 1483.21 2199.8 1217.76 1477.18 2199.8 1217.76 1477.18 2199.8 1207.01 1477.18 2203 1217.76 1477.18 2203 1207.01 1483.21 2203 1207.01 1483.21 2203 1217.76 1483.21 2203.36 1207.01 1483.21 2203.36 1217.76 1477.18 2203.36 1217.76 1477.18 2203.36 1207.01 1483.32 2199.8 1207.01 1483.32 2199.8 1217.76 1483.32 2203 1207.01 1483.32 2203 1217.76 1483.21 2203 1217.61 1477.3 2203 1217.61 1477.3 2199.8 1217.61 1483.21 2199.8 1217.61 1477.3 2203 1207.15 1477.3 2199.8 1207.15 1483.21 2203 1207.15 1483.21 2199.8 1207.15 1477.19 2203.6 1214.8 1477.19 2203.6 1207 1483.15 2203.6 1207 1483.15 2203.6 1214.8 1483.15 2203.74 1207 1483.15 2203.74 1214.8 1477.19 2203.74 1214.8 1477.19 2203.74 1207 1477.19 2205 1214.8 1477.19 2205 1207 1483.15 2205 1207 1483.15 2205 1214.8 1483.15 2205.14 1207 1483.15 2205.14 1214.8 1477.19 2205.14 1214.8 1477.19 2205.14 1207 1483.26 2203.74 1207 1483.26 2203.74 1214.8 1483.26 2205 1207 1483.26 2205 1214.8 1483.15 2205 1214.7 1477.3 2205 1214.7 1477.3 2203.74 1214.7 1483.15 2203.74 1214.7 1477.3 2205 1207.1 1477.3 2203.74 1207.1 1483.15 2205 1207.1 1483.15 2203.74 1207.1 1477.07 2205.39 1215.85 1477.07 2205.39 1207 1486.05 2205.39 1207 1486.05 2205.39 1215.85 1486.05 2205.75 1207 1486.05 2205.75 1215.85 1477.07 2205.75 1215.85 1477.07 2205.75 1207 1477.07 2208.91 1215.85 1477.07 2208.91 1207 1486.05 2208.91 1207 1486.05 2208.91 1215.85 1486.05 2209.27 1207 1486.05 2209.27 1215.85 1477.07 2209.27 1215.85 1477.07 2209.27 1207 1486.22 2205.75 1207 1486.22 2205.75 1215.85 1486.22 2208.91 1207 1486.22 2208.91 1215.85 1486.05 2208.91 1215.73 1477.25 2208.91 1215.73 1477.25 2205.75 1215.73 1486.05 2205.75 1215.73 1477.25 2208.91 1207.11 1477.25 2205.75 1207.11 1486.05 2208.91 1207.11 1486.05 2205.75 1207.11 1477.14 2209.51 1217.24 1477.14 2209.51 1207 1484.57 2209.51 1207 1484.57 2209.51 1217.24 1484.57 2209.7 1207 1484.57 2209.7 1217.24 1477.14 2209.7 1217.24 1477.14 2209.7 1207 1477.14 2211.4 1217.24 1477.14 2211.4 1207 1484.57 2211.4 1207 1484.57 2211.4 1217.24 1484.57 2211.59 1207 1484.57 2211.59 1217.24 1477.14 2211.59 1217.24 1477.14 2211.59 1207 1484.71 2209.7 1207 1484.71 2209.7 1217.24 1484.71 2211.4 1207 1484.71 2211.4 1217.24 1484.57 2211.4 1217.11 1477.28 2211.4 1217.11 1477.28 2209.7 1217.11 1484.57 2209.7 1217.11 1477.28 2211.4 1207.13 1477.28 2209.7 1207.13 1484.57 2211.4 1207.13 1484.57 2209.7 1207.13 1477.14 2211.84 1217.92 1477.14 2211.84 1207 1484.4 2211.84 1207 1484.4 2211.84 1217.92 1484.4 2212.06 1207 1484.4 2212.06 1217.92 1477.14 2212.06 1217.92 1477.14 2212.06 1207 1477.14 2213.96 1217.92 1477.14 2213.96 1207 1484.4 2213.96 1207 1484.4 2213.96 1217.92 1484.4 2214.18 1207 1484.4 2214.18 1217.92 1477.14 2214.18 1217.92 1477.14 2214.18 1207 1484.54 2212.06 1207 1484.54 2212.06 1217.92 1484.54 2213.96 1207 1484.54 2213.96 1217.92 1484.4 2213.96 1217.78 1477.28 2213.96 1217.78 1477.28 2212.06 1217.78 1484.4 2212.06 1217.78 1477.28 2213.96 1207.14 1477.28 2212.06 1207.14 1484.4 2213.96 1207.14 1484.4 2212.06 1207.14 1477.14 2214.42 1213.94 1477.14 2214.42 1207 1484.35 2214.42 1207 1484.35 2214.42 1213.94 1484.35 2214.55 1207 1484.35 2214.55 1213.94 1477.14 2214.55 1213.94 1477.14 2214.55 1207 1477.14 2215.67 1213.94 1477.14 2215.67 1207 1484.35 2215.67 1207 1484.35 2215.67 1213.94 1484.35 2215.8 1207 1484.35 2215.8 1213.94 1477.14 2215.8 1213.94 1477.14 2215.8 1207 1484.48 2214.55 1207 1484.48 2214.55 1213.94 1484.48 2215.67 1207 1484.48 2215.67 1213.94 1484.35 2215.67 1213.85 1477.28 2215.67 1213.85 1477.28 2214.55 1213.85 1484.35 2214.55 1213.85 1477.28 2215.67 1207.09 1477.28 2214.55 1207.09 1484.35 2215.67 1207.09 1484.35 2214.55 1207.09 1477.2 2216.05 1214.72 1477.2 2216.05 1207 1483.04 2216.05 1207 1483.04 2216.05 1214.72 1483.04 2216.29 1207 1483.04 2216.29 1214.72 1477.2 2216.29 1214.72 1477.2 2216.29 1207 1477.2 2218.47 1214.72 1477.2 2218.47 1207 1483.04 2218.47 1207 1483.04 2218.47 1214.72 1483.04 2218.71 1207 1483.04 2218.71 1214.72 1477.2 2218.71 1214.72 1477.2 2218.71 1207 1483.15 2216.29 1207 1483.15 2216.29 1214.72 1483.15 2218.47 1207 1483.15 2218.47 1214.72 1483.04 2218.47 1214.62 1477.31 2218.47 1214.62 1477.31 2216.29 1214.62 1483.04 2216.29 1214.62 1477.31 2218.47 1207.1 1477.31 2216.29 1207.1 1483.04 2218.47 1207.1 1483.04 2216.29 1207.1 1489.42 2223.97 1220 1477.42 2223.97 1220 1489.42 2223.97 1219 1489.42 2189.97 1220 1477.42 2223.97 1219 1477.42 2189.97 1220 1489.42 2189.97 1219 1477.42 2189.97 1219 1477.2 2189.97 1227.08 1477.2 2189.97 1220 1482.95 2189.97 1220 1482.95 2189.97 1227.08 1482.95 2190.07 1220 1482.95 2190.07 1227.08 1477.2 2190.07 1227.08 1477.2 2190.07 1220 1477.2 2191.01 1227.08 1477.2 2191.01 1220 1482.95 2191.01 1220 1482.95 2191.01 1227.08 1482.95 2191.12 1220 1482.95 2191.12 1227.08 1477.2 2191.12 1227.08 1477.2 2191.12 1220 1483.06 2190.07 1220 1483.06 2190.07 1227.08 1483.06 2191.01 1220 1483.06 2191.01 1227.08 1482.95 2191.01 1226.99 1477.31 2191.01 1226.99 1477.31 2190.07 1226.99 1482.95 2190.07 1226.99 1477.31 2191.01 1220.09 1477.31 2190.07 1220.09 1482.95 2191.01 1220.09 1482.95 2190.07 1220.09 1477.08 2191.37 1227.93 1477.08 2191.37 1220.01 1485.84 2191.37 1220.01 1485.84 2191.37 1227.93 1485.84 2191.61 1220.01 1485.84 2191.61 1227.93 1477.08 2191.61 1227.93 1477.08 2191.61 1220.01 1477.08 2193.73 1227.93 1477.08 2193.73 1220.01 1485.84 2193.73 1220.01 1485.84 2193.73 1227.93 1485.84 2193.97 1220.01 1485.84 2193.97 1227.93 1477.08 2193.97 1227.93 1477.08 2193.97 1220.01 1486 2191.61 1220.01 1486 2191.61 1227.93 1486 2193.73 1220.01 1486 2193.73 1227.93 1485.84 2193.73 1227.83 1477.25 2193.73 1227.83 1477.25 2191.61 1227.83 1485.84 2191.61 1227.83 1477.25 2193.73 1220.11 1477.25 2191.61 1220.11 1485.84 2193.73 1220.11 1485.84 2191.61 1220.11 1477.08 2194.21 1226.54 1477.08 2194.21 1220 1486.16 2194.21 1220 1486.16 2194.21 1226.54 1486.16 2194.27 1220 1486.16 2194.27 1226.54 1477.08 2194.27 1226.54 1477.08 2194.27 1220 1477.08 2194.72 1226.54 1477.08 2194.72 1220 1486.16 2194.72 1220 1486.16 2194.72 1226.54 1486.16 2194.77 1220 1486.16 2194.77 1226.54 1477.08 2194.77 1226.54 1477.08 2194.77 1220 1486.33 2194.27 1220 1486.33 2194.27 1226.54 1486.33 2194.72 1220 1486.33 2194.72 1226.54 1486.16 2194.72 1226.45 1477.25 2194.72 1226.45 1477.25 2194.27 1226.45 1486.16 2194.27 1226.45 1477.25 2194.72 1220.09 1477.25 2194.27 1220.09 1486.16 2194.72 1220.09 1486.16 2194.27 1220.09 1477.09 2195.01 1230.64 1477.09 2195.01 1220 1485.58 2195.01 1220 1485.58 2195.01 1230.64 1485.58 2195.18 1220 1485.58 2195.18 1230.64 1477.09 2195.18 1230.64 1477.09 2195.18 1220 1477.09 2196.68 1230.64 1477.09 2196.68 1220 1485.58 2196.68 1220 1485.58 2196.68 1230.64 1485.58 2196.85 1220 1485.58 2196.85 1230.64 1477.09 2196.85 1230.64 1477.09 2196.85 1220 1485.74 2195.18 1220 1485.74 2195.18 1230.64 1485.74 2196.68 1220 1485.74 2196.68 1230.64 1485.58 2196.68 1230.5 1477.25 2196.68 1230.5 1477.25 2195.18 1230.5 1485.58 2195.18 1230.5 1477.25 2196.68 1220.14 1477.25 2195.18 1220.14 1485.58 2196.68 1220.14 1485.58 2195.18 1220.14 1477.2 2197.1 1228.02 1477.2 2197.1 1220 1482.95 2197.1 1220 1482.95 2197.1 1228.02 1482.95 2197.35 1220 1482.95 2197.35 1228.02 1477.2 2197.35 1228.02 1477.2 2197.35 1220 1477.2 2199.59 1228.02 1477.2 2199.59 1220 1482.95 2199.59 1220 1482.95 2199.59 1228.02 1482.95 2199.84 1220 1482.95 2199.84 1228.02 1477.2 2199.84 1228.02 1477.2 2199.84 1220 1483.06 2197.35 1220 1483.06 2197.35 1228.02 1483.06 2199.59 1220 1483.06 2199.59 1228.02 1482.95 2199.59 1227.91 1477.31 2199.59 1227.91 1477.31 2197.35 1227.91 1482.95 2197.35 1227.91 1477.31 2199.59 1220.11 1477.31 2197.35 1220.11 1482.95 2199.59 1220.11 1482.95 2197.35 1220.11 1477.21 2200.08 1229.45 1477.21 2200.08 1220.01 1482.44 2200.08 1220.01 1482.44 2200.08 1229.45 1482.44 2200.37 1220.01 1482.44 2200.37 1229.45 1477.21 2200.37 1229.45 1477.21 2200.37 1220.01 1477.21 2203.03 1229.45 1477.21 2203.03 1220.01 1482.44 2203.03 1220.01 1482.44 2203.03 1229.45 1482.44 2203.32 1220.01 1482.44 2203.32 1229.45 1477.21 2203.32 1229.45 1477.21 2203.32 1220.01 1482.54 2200.37 1220.01 1482.54 2200.37 1229.45 1482.54 2203.03 1220.01 1482.54 2203.03 1229.45 1482.44 2203.03 1229.33 1477.31 2203.03 1229.33 1477.31 2200.37 1229.33 1482.44 2200.37 1229.33 1477.31 2203.03 1220.13 1477.31 2200.37 1220.13 1482.44 2203.03 1220.13 1482.44 2200.37 1220.13 1477.16 2203.57 1228.74 1477.16 2203.57 1220 1483.94 2203.57 1220 1483.94 2203.57 1228.74 1483.94 2203.77 1220 1483.94 2203.77 1228.74 1477.16 2203.77 1228.74 1477.16 2203.77 1220 1477.16 2205.55 1228.74 1477.16 2205.55 1220 1483.94 2205.55 1220 1483.94 2205.55 1228.74 1483.94 2205.75 1220 1483.94 2205.75 1228.74 1477.16 2205.75 1228.74 1477.16 2205.75 1220 1484.07 2203.77 1220 1484.07 2203.77 1228.74 1484.07 2205.55 1220 1484.07 2205.55 1228.74 1483.94 2205.55 1228.63 1477.29 2205.55 1228.63 1477.29 2203.77 1228.63 1483.94 2203.77 1228.63 1477.29 2205.55 1220.12 1477.29 2203.77 1220.12 1483.94 2205.55 1220.12 1483.94 2203.77 1220.12 1477.18 2206.01 1228.98 1477.18 2206.01 1220 1483.36 2206.01 1220 1483.36 2206.01 1228.98 1483.36 2206.08 1220 1483.36 2206.08 1228.98 1477.18 2206.08 1228.98 1477.18 2206.08 1220 1477.18 2206.72 1228.98 1477.18 2206.72 1220 1483.36 2206.72 1220 1483.36 2206.72 1228.98 1483.36 2206.79 1220 1483.36 2206.79 1228.98 1477.18 2206.79 1228.98 1477.18 2206.79 1220 1483.48 2206.08 1220 1483.48 2206.08 1228.98 1483.48 2206.72 1220 1483.48 2206.72 1228.98 1483.36 2206.72 1228.86 1477.3 2206.72 1228.86 1477.3 2206.08 1228.86 1483.36 2206.08 1228.86 1477.3 2206.72 1220.12 1477.3 2206.08 1220.12 1483.36 2206.72 1220.12 1483.36 2206.08 1220.12 1477.16 2207.03 1228.12 1477.16 2207.03 1220 1483.95 2207.03 1220 1483.95 2207.03 1228.12 1483.95 2207.34 1220 1483.95 2207.34 1228.12 1477.16 2207.34 1228.12 1477.16 2207.34 1220 1477.16 2210.08 1228.12 1477.16 2210.08 1220 1483.95 2210.08 1220 1483.95 2210.08 1228.12 1483.95 2210.39 1220 1483.95 2210.39 1228.12 1477.16 2210.39 1228.12 1477.16 2210.39 1220 1484.08 2207.34 1220 1484.08 2207.34 1228.12 1484.08 2210.08 1220 1484.08 2210.08 1228.12 1483.95 2210.08 1228.02 1477.29 2210.08 1228.02 1477.29 2207.34 1228.02 1483.95 2207.34 1228.02 1477.29 2210.08 1220.1 1477.29 2207.34 1220.1 1483.95 2210.08 1220.1 1483.95 2207.34 1220.1 1477.07 2210.64 1227.56 1477.07 2210.64 1220 1486.22 2210.64 1220 1486.22 2210.64 1227.56 1486.22 2211 1220 1486.22 2211 1227.56 1477.07 2211 1227.56 1477.07 2211 1220 1477.07 2214.2 1227.56 1477.07 2214.2 1220 1486.22 2214.2 1220 1486.22 2214.2 1227.56 1486.22 2214.56 1220 1486.22 2214.56 1227.56 1477.07 2214.56 1227.56 1477.07 2214.56 1220 1486.39 2211 1220 1486.39 2211 1227.56 1486.39 2214.2 1220 1486.39 2214.2 1227.56 1486.22 2214.2 1227.46 1477.25 2214.2 1227.46 1477.25 2211 1227.46 1486.22 2211 1227.46 1477.25 2214.2 1220.1 1477.25 2211 1220.1 1486.22 2214.2 1220.1 1486.22 2211 1220.1 1477.08 2214.82 1230.86 1477.08 2214.82 1220 1486.01 2214.82 1220 1486.01 2214.82 1230.86 1486.01 2215.04 1220 1486.01 2215.04 1230.86 1477.08 2215.04 1230.86 1477.08 2215.04 1220 1477.08 2217.06 1230.86 1477.08 2217.06 1220 1486.01 2217.06 1220 1486.01 2217.06 1230.86 1486.01 2217.28 1220 1486.01 2217.28 1230.86 1477.08 2217.28 1230.86 1477.08 2217.28 1220 1486.18 2215.04 1220 1486.18 2215.04 1230.86 1486.18 2217.06 1220 1486.18 2217.06 1230.86 1486.01 2217.06 1230.72 1477.25 2217.06 1230.72 1477.25 2215.04 1230.72 1486.01 2215.04 1230.72 1477.25 2217.06 1220.14 1477.25 2215.04 1220.14 1486.01 2217.06 1220.14 1486.01 2215.04 1220.14 1489.42 2223.97 1233 1477.42 2223.97 1233 1489.42 2223.97 1232 1489.42 2189.97 1233 1477.42 2223.97 1232 1477.42 2189.97 1233 1489.42 2189.97 1232 1477.42 2189.97 1232 1477.11 2189.96 1242.86 1477.11 2189.96 1233.01 1485.22 2189.96 1233.01 1485.22 2189.96 1242.86 1485.22 2190.04 1233.01 1485.22 2190.04 1242.86 1477.11 2190.04 1242.86 1477.11 2190.04 1233.01 1477.11 2190.74 1242.86 1477.11 2190.74 1233.01 1485.22 2190.74 1233.01 1485.22 2190.74 1242.86 1485.22 2190.82 1233.01 1485.22 2190.82 1242.86 1477.11 2190.82 1242.86 1477.11 2190.82 1233.01 1485.37 2190.04 1233.01 1485.37 2190.04 1242.86 1485.37 2190.74 1233.01 1485.37 2190.74 1242.86 1485.22 2190.74 1242.73 1477.27 2190.74 1242.73 1477.27 2190.04 1242.73 1485.22 2190.04 1242.73 1477.27 2190.74 1233.13 1477.27 2190.04 1233.13 1485.22 2190.74 1233.13 1485.22 2190.04 1233.13 1477.16 2191.07 1243.5 1477.16 2191.07 1233 1484.12 2191.07 1233 1484.12 2191.07 1243.5 1484.12 2191.33 1233 1484.12 2191.33 1243.5 1477.16 2191.33 1243.5 1477.16 2191.33 1233 1477.16 2193.67 1243.5 1477.16 2193.67 1233 1484.12 2193.67 1233 1484.12 2193.67 1243.5 1484.12 2193.94 1233 1484.12 2193.94 1243.5 1477.16 2193.94 1243.5 1477.16 2193.94 1233 1484.25 2191.33 1233 1484.25 2191.33 1243.5 1484.25 2193.67 1233 1484.25 2193.67 1243.5 1484.12 2193.67 1243.36 1477.29 2193.67 1243.36 1477.29 2191.33 1243.36 1484.12 2191.33 1243.36 1477.29 2193.67 1233.14 1477.29 2191.33 1233.14 1484.12 2193.67 1233.14 1484.12 2191.33 1233.14 1477.21 2194.18 1241.45 1477.21 2194.18 1233.01 1482.5 2194.18 1233.01 1482.5 2194.18 1241.45 1482.5 2194.41 1233.01 1482.5 2194.41 1241.45 1477.21 2194.41 1241.45 1477.21 2194.41 1233.01 1477.21 2196.43 1241.45 1477.21 2196.43 1233.01 1482.5 2196.43 1233.01 1482.5 2196.43 1241.45 1482.5 2196.66 1233.01 1482.5 2196.66 1241.45 1477.21 2196.66 1241.45 1477.21 2196.66 1233.01 1482.6 2194.41 1233.01 1482.6 2194.41 1241.45 1482.6 2196.43 1233.01 1482.6 2196.43 1241.45 1482.5 2196.43 1241.34 1477.31 2196.43 1241.34 1477.31 2194.41 1241.34 1482.5 2194.41 1241.34 1477.31 2196.43 1233.12 1477.31 2194.41 1233.12 1482.5 2196.43 1233.12 1482.5 2194.41 1233.12 1477.14 2196.91 1241.3 1477.14 2196.91 1233 1484.47 2196.91 1233 1484.47 2196.91 1241.3 1484.47 2197.1 1233 1484.47 2197.1 1241.3 1477.14 2197.1 1241.3 1477.14 2197.1 1233 1477.14 2198.86 1241.3 1477.14 2198.86 1233 1484.47 2198.86 1233 1484.47 2198.86 1241.3 1484.47 2199.05 1233 1484.47 2199.05 1241.3 1477.14 2199.05 1241.3 1477.14 2199.05 1233 1484.61 2197.1 1233 1484.61 2197.1 1241.3 1484.61 2198.86 1233 1484.61 2198.86 1241.3 1484.47 2198.86 1241.19 1477.28 2198.86 1241.19 1477.28 2197.1 1241.19 1484.47 2197.1 1241.19 1477.28 2198.86 1233.11 1477.28 2197.1 1233.11 1484.47 2198.86 1233.11 1484.47 2197.1 1233.11 1477.11 2199.31 1243.07 1477.11 2199.31 1233 1485.26 2199.31 1233 1485.26 2199.31 1243.07 1485.26 2199.65 1233 1485.26 2199.65 1243.07 1477.11 2199.65 1243.07 1477.11 2199.65 1233 1477.11 2202.73 1243.07 1477.11 2202.73 1233 1485.26 2202.73 1233 1485.26 2202.73 1243.07 1485.26 2203.07 1233 1485.26 2203.07 1243.07 1477.11 2203.07 1243.07 1477.11 2203.07 1233 1485.41 2199.65 1233 1485.41 2199.65 1243.07 1485.41 2202.73 1233 1485.41 2202.73 1243.07 1485.26 2202.73 1242.93 1477.27 2202.73 1242.93 1477.27 2199.65 1242.93 1485.26 2199.65 1242.93 1477.27 2202.73 1233.13 1477.27 2199.65 1233.13 1485.26 2202.73 1233.13 1485.26 2199.65 1233.13 1477.09 2203.32 1239.82 1477.09 2203.32 1233 1485.64 2203.32 1233 1485.64 2203.32 1239.82 1485.64 2203.64 1233 1485.64 2203.64 1239.82 1477.09 2203.64 1239.82 1477.09 2203.64 1233 1477.09 2206.54 1239.82 1477.09 2206.54 1233 1485.64 2206.54 1233 1485.64 2206.54 1239.82 1485.64 2206.86 1233 1485.64 2206.86 1239.82 1477.09 2206.86 1239.82 1477.09 2206.86 1233 1485.8 2203.64 1233 1485.8 2203.64 1239.82 1485.8 2206.54 1233 1485.8 2206.54 1239.82 1485.64 2206.54 1239.73 1477.25 2206.54 1239.73 1477.25 2203.64 1239.73 1485.64 2203.64 1239.73 1477.25 2206.54 1233.09 1477.25 2203.64 1233.09 1485.64 2206.54 1233.09 1485.64 2203.64 1233.09 1477.12 2207.11 1243.2 1477.12 2207.11 1233 1484.72 2207.11 1233 1484.72 2207.11 1243.2 1484.72 2207.17 1233 1484.72 2207.17 1243.2 1477.12 2207.17 1243.2 1477.12 2207.17 1233 1477.12 2207.73 1243.2 1477.12 2207.73 1233 1484.72 2207.73 1233 1484.72 2207.73 1243.2 1484.72 2207.79 1233 1484.72 2207.79 1243.2 1477.12 2207.79 1243.2 1477.12 2207.79 1233 1484.86 2207.17 1233 1484.86 2207.17 1243.2 1484.86 2207.73 1233 1484.86 2207.73 1243.2 1484.72 2207.73 1243.07 1477.27 2207.73 1243.07 1477.27 2207.17 1243.07 1484.72 2207.17 1243.07 1477.27 2207.73 1233.13 1477.27 2207.17 1233.13 1484.72 2207.73 1233.13 1484.72 2207.17 1233.13 1477.07 2208.04 1241.76 1477.07 2208.04 1233 1486.22 2208.04 1233 1486.22 2208.04 1241.76 1486.22 2208.37 1233 1486.22 2208.37 1241.76 1477.07 2208.37 1241.76 1477.07 2208.37 1233 1477.07 2211.35 1241.76 1477.07 2211.35 1233 1486.22 2211.35 1233 1486.22 2211.35 1241.76 1486.22 2211.68 1233 1486.22 2211.68 1241.76 1477.07 2211.68 1241.76 1477.07 2211.68 1233 1486.4 2208.37 1233 1486.4 2208.37 1241.76 1486.4 2211.35 1233 1486.4 2211.35 1241.76 1486.22 2211.35 1241.64 1477.24 2211.35 1241.64 1477.24 2208.37 1241.64 1486.22 2208.37 1241.64 1477.24 2211.35 1233.12 1477.24 2208.37 1233.12 1486.22 2211.35 1233.12 1486.22 2208.37 1233.12 1477.16 2211.93 1242.67 1477.16 2211.93 1233.01 1483.85 2211.93 1233.01 1483.85 2211.93 1242.67 1483.85 2212.21 1233.01 1483.85 2212.21 1242.67 1477.16 2212.21 1242.67 1477.16 2212.21 1233.01 1477.16 2214.65 1242.67 1477.16 2214.65 1233.01 1483.85 2214.65 1233.01 1483.85 2214.65 1242.67 1483.85 2214.93 1233.01 1483.85 2214.93 1242.67 1477.16 2214.93 1242.67 1477.16 2214.93 1233.01 1483.98 2212.21 1233.01 1483.98 2212.21 1242.67 1483.98 2214.65 1233.01 1483.98 2214.65 1242.67 1483.85 2214.65 1242.55 1477.29 2214.65 1242.55 1477.29 2212.21 1242.55 1483.85 2212.21 1242.55 1477.29 2214.65 1233.13 1477.29 2212.21 1233.13 1483.85 2214.65 1233.13 1483.85 2212.21 1233.13 1477.21 2215.17 1243.24 1477.21 2215.17 1233 1482.58 2215.17 1233 1482.58 2215.17 1243.24 1482.58 2215.37 1233 1482.58 2215.37 1243.24 1477.21 2215.37 1243.24 1477.21 2215.37 1233 1477.21 2217.08 1243.24 1477.21 2217.08 1233 1482.58 2217.08 1233 1482.58 2217.08 1243.24 1482.58 2217.27 1233 1482.58 2217.27 1243.24 1477.21 2217.27 1243.24 1477.21 2217.27 1233 1482.68 2215.37 1233 1482.68 2215.37 1243.24 1482.68 2217.08 1233 1482.68 2217.08 1243.24 1482.58 2217.08 1243.11 1477.32 2217.08 1243.11 1477.32 2215.37 1243.11 1482.58 2215.37 1243.11 1477.32 2217.08 1233.13 1477.32 2215.37 1233.13 1482.58 2217.08 1233.13 1482.58 2215.37 1233.13 1489.42 2223.97 1246 1477.42 2223.97 1246 1489.42 2223.97 1245 1489.42 2189.97 1246 1477.42 2223.97 1245 1477.42 2189.97 1246 1489.42 2189.97 1245 1477.42 2189.97 1245 1489.42 2227.35 1246 1477.42 2227.35 1246 1489.42 2227.35 1141 1489.42 2226.35 1246 1477.42 2227.35 1141 1477.42 2226.35 1246 1489.42 2226.35 1141 1477.42 2226.35 1141 1489.42 2262.35 1246 1477.42 2262.35 1246 1489.42 2262.35 1141 1489.42 2261.35 1246 1477.42 2262.35 1141 1477.42 2261.35 1246 1489.42 2261.35 1141 1477.42 2261.35 1141 1489.42 2261.35 1142 1477.42 2261.35 1142 1489.42 2261.35 1141 1489.42 2227.35 1142 1477.42 2261.35 1141 1477.42 2227.35 1142 1489.42 2227.35 1141 1477.42 2227.35 1141 1477.15 2227.35 1152.4 1477.15 2227.35 1142 1484.24 2227.35 1142 1484.24 2227.35 1152.4 1484.24 2227.69 1142 1484.24 2227.69 1152.4 1477.15 2227.69 1152.4 1477.15 2227.69 1142 1477.15 2230.79 1152.4 1477.15 2230.79 1142 1484.24 2230.79 1142 1484.24 2230.79 1152.4 1484.24 2231.13 1142 1484.24 2231.13 1152.4 1477.15 2231.13 1152.4 1477.15 2231.13 1142 1484.37 2227.69 1142 1484.37 2227.69 1152.4 1484.37 2230.79 1142 1484.37 2230.79 1152.4 1484.24 2230.79 1152.27 1477.29 2230.79 1152.27 1477.29 2227.69 1152.27 1484.24 2227.69 1152.27 1477.29 2230.79 1142.13 1477.29 2227.69 1142.13 1484.24 2230.79 1142.13 1484.24 2227.69 1142.13 1477.18 2231.39 1149.06 1477.18 2231.39 1142.01 1483.36 2231.39 1142.01 1483.36 2231.39 1149.06 1483.36 2231.58 1142.01 1483.36 2231.58 1149.06 1477.18 2231.58 1149.06 1477.18 2231.58 1142.01 1477.18 2233.3 1149.06 1477.18 2233.3 1142.01 1483.36 2233.3 1142.01 1483.36 2233.3 1149.06 1483.36 2233.5 1142.01 1483.36 2233.5 1149.06 1477.18 2233.5 1149.06 1477.18 2233.5 1142.01 1483.48 2231.58 1142.01 1483.48 2231.58 1149.06 1483.48 2233.3 1142.01 1483.48 2233.3 1149.06 1483.36 2233.3 1148.96 1477.3 2233.3 1148.96 1477.3 2231.58 1148.96 1483.36 2231.58 1148.96 1477.3 2233.3 1142.1 1477.3 2231.58 1142.1 1483.36 2233.3 1142.1 1483.36 2231.58 1142.1 1477.07 2233.74 1152.99 1477.07 2233.74 1142.01 1485.93 2233.74 1142.01 1485.93 2233.74 1152.99 1485.93 2234.07 1142.01 1485.93 2234.07 1152.99 1477.07 2234.07 1152.99 1477.07 2234.07 1142.01 1477.07 2236.99 1152.99 1477.07 2236.99 1142.01 1485.93 2236.99 1142.01 1485.93 2236.99 1152.99 1485.93 2237.32 1142.01 1485.93 2237.32 1152.99 1477.07 2237.32 1152.99 1477.07 2237.32 1142.01 1486.1 2234.07 1142.01 1486.1 2234.07 1152.99 1486.1 2236.99 1142.01 1486.1 2236.99 1152.99 1485.93 2236.99 1152.85 1477.24 2236.99 1152.85 1477.24 2234.07 1152.85 1485.93 2234.07 1152.85 1477.24 2236.99 1142.15 1477.24 2234.07 1142.15 1485.93 2236.99 1142.15 1485.93 2234.07 1142.15 1477.13 2237.57 1150.01 1477.13 2237.57 1142 1484.58 2237.57 1142 1484.58 2237.57 1150.01 1484.58 2237.9 1142 1484.58 2237.9 1150.01 1477.13 2237.9 1150.01 1477.13 2237.9 1142 1477.13 2240.82 1150.01 1477.13 2240.82 1142 1484.58 2240.82 1142 1484.58 2240.82 1150.01 1484.58 2241.15 1142 1484.58 2241.15 1150.01 1477.13 2241.15 1150.01 1477.13 2241.15 1142 1484.72 2237.9 1142 1484.72 2237.9 1150.01 1484.72 2240.82 1142 1484.72 2240.82 1150.01 1484.58 2240.82 1149.9 1477.27 2240.82 1149.9 1477.27 2237.9 1149.9 1484.58 2237.9 1149.9 1477.27 2240.82 1142.1 1477.27 2237.9 1142.1 1484.58 2240.82 1142.1 1484.58 2237.9 1142.1 1477.12 2241.39 1149.52 1477.12 2241.39 1142 1484.99 2241.39 1142 1484.99 2241.39 1149.52 1484.99 2241.75 1142 1484.99 2241.75 1149.52 1477.12 2241.75 1149.52 1477.12 2241.75 1142 1477.12 2244.93 1149.52 1477.12 2244.93 1142 1484.99 2244.93 1142 1484.99 2244.93 1149.52 1484.99 2245.29 1142 1484.99 2245.29 1149.52 1477.12 2245.29 1149.52 1477.12 2245.29 1142 1485.14 2241.75 1142 1485.14 2241.75 1149.52 1485.14 2244.93 1142 1485.14 2244.93 1149.52 1484.99 2244.93 1149.42 1477.27 2244.93 1149.42 1477.27 2241.75 1149.42 1484.99 2241.75 1149.42 1477.27 2244.93 1142.1 1477.27 2241.75 1142.1 1484.99 2244.93 1142.1 1484.99 2241.75 1142.1 1477.1 2245.54 1151.56 1477.1 2245.54 1142.01 1485.38 2245.54 1142.01 1485.38 2245.54 1151.56 1485.38 2245.65 1142.01 1485.38 2245.65 1151.56 1477.1 2245.65 1151.56 1477.1 2245.65 1142.01 1477.1 2246.63 1151.56 1477.1 2246.63 1142.01 1485.38 2246.63 1142.01 1485.38 2246.63 1151.56 1485.38 2246.74 1142.01 1485.38 2246.74 1151.56 1477.1 2246.74 1151.56 1477.1 2246.74 1142.01 1485.54 2245.65 1142.01 1485.54 2245.65 1151.56 1485.54 2246.63 1142.01 1485.54 2246.63 1151.56 1485.38 2246.63 1151.43 1477.26 2246.63 1151.43 1477.26 2245.65 1151.43 1485.38 2245.65 1151.43 1477.26 2246.63 1142.13 1477.26 2245.65 1142.13 1485.38 2246.63 1142.13 1485.38 2245.65 1142.13 1489.42 2261.35 1155 1477.42 2261.35 1155 1489.42 2261.35 1154 1489.42 2227.35 1155 1477.42 2261.35 1154 1477.42 2227.35 1155 1489.42 2227.35 1154 1477.42 2227.35 1154 1477.17 2227.35 1161.86 1477.17 2227.35 1155 1483.69 2227.35 1155 1483.69 2227.35 1161.86 1483.69 2227.4 1155 1483.69 2227.4 1161.86 1477.17 2227.4 1161.86 1477.17 2227.4 1155 1477.17 2227.82 1161.86 1477.17 2227.82 1155 1483.69 2227.82 1155 1483.69 2227.82 1161.86 1483.69 2227.87 1155 1483.69 2227.87 1161.86 1477.17 2227.87 1161.86 1477.17 2227.87 1155 1483.82 2227.4 1155 1483.82 2227.4 1161.86 1483.82 2227.82 1155 1483.82 2227.82 1161.86 1483.69 2227.82 1161.77 1477.29 2227.82 1161.77 1477.29 2227.4 1161.77 1483.69 2227.4 1161.77 1477.29 2227.82 1155.09 1477.29 2227.4 1155.09 1483.69 2227.82 1155.09 1483.69 2227.4 1155.09 1477.15 2228.11 1162.78 1477.15 2228.11 1155 1484.2 2228.11 1155 1484.2 2228.11 1162.78 1484.2 2228.33 1155 1484.2 2228.33 1162.78 1477.15 2228.33 1162.78 1477.15 2228.33 1155 1477.15 2230.29 1162.78 1477.15 2230.29 1155 1484.2 2230.29 1155 1484.2 2230.29 1162.78 1484.2 2230.51 1155 1484.2 2230.51 1162.78 1477.15 2230.51 1162.78 1477.15 2230.51 1155 1484.34 2228.33 1155 1484.34 2228.33 1162.78 1484.34 2230.29 1155 1484.34 2230.29 1162.78 1484.2 2230.29 1162.68 1477.28 2230.29 1162.68 1477.28 2228.33 1162.68 1484.2 2228.33 1162.68 1477.28 2230.29 1155.1 1477.28 2228.33 1155.1 1484.2 2230.29 1155.1 1484.2 2228.33 1155.1 1477.16 2230.76 1165.84 1477.16 2230.76 1155 1483.99 2230.76 1155 1483.99 2230.76 1165.84 1483.99 2231.11 1155 1483.99 2231.11 1165.84 1477.16 2231.11 1165.84 1477.16 2231.11 1155 1477.16 2234.27 1165.84 1477.16 2234.27 1155 1483.99 2234.27 1155 1483.99 2234.27 1165.84 1483.99 2234.63 1155 1483.99 2234.63 1165.84 1477.16 2234.63 1165.84 1477.16 2234.63 1155 1484.12 2231.11 1155 1484.12 2231.11 1165.84 1484.12 2234.27 1155 1484.12 2234.27 1165.84 1483.99 2234.27 1165.7 1477.29 2234.27 1165.7 1477.29 2231.11 1165.7 1483.99 2231.11 1165.7 1477.29 2234.27 1155.14 1477.29 2231.11 1155.14 1483.99 2234.27 1155.14 1483.99 2231.11 1155.14 1477.16 2234.88 1164.45 1477.16 2234.88 1155.01 1483.84 2234.88 1155.01 1483.84 2234.88 1164.45 1483.84 2235.09 1155.01 1483.84 2235.09 1164.45 1477.16 2235.09 1164.45 1477.16 2235.09 1155.01 1477.16 2236.95 1164.45 1477.16 2236.95 1155.01 1483.84 2236.95 1155.01 1483.84 2236.95 1164.45 1483.84 2237.16 1155.01 1483.84 2237.16 1164.45 1477.16 2237.16 1164.45 1477.16 2237.16 1155.01 1483.96 2235.09 1155.01 1483.96 2235.09 1164.45 1483.96 2236.95 1155.01 1483.96 2236.95 1164.45 1483.84 2236.95 1164.33 1477.29 2236.95 1164.33 1477.29 2235.09 1164.33 1483.84 2235.09 1164.33 1477.29 2236.95 1155.13 1477.29 2235.09 1155.13 1483.84 2236.95 1155.13 1483.84 2235.09 1155.13 1477.09 2237.41 1162.54 1477.09 2237.41 1155 1485.81 2237.41 1155 1485.81 2237.41 1162.54 1485.81 2237.46 1155 1485.81 2237.46 1162.54 1477.09 2237.46 1162.54 1477.09 2237.46 1155 1477.09 2237.9 1162.54 1477.09 2237.9 1155 1485.81 2237.9 1155 1485.81 2237.9 1162.54 1485.81 2237.95 1155 1485.81 2237.95 1162.54 1477.09 2237.95 1162.54 1477.09 2237.95 1155 1485.97 2237.46 1155 1485.97 2237.46 1162.54 1485.97 2237.9 1155 1485.97 2237.9 1162.54 1485.81 2237.9 1162.44 1477.26 2237.9 1162.44 1477.26 2237.46 1162.44 1485.81 2237.46 1162.44 1477.26 2237.9 1155.1 1477.26 2237.46 1155.1 1485.81 2237.9 1155.1 1485.81 2237.46 1155.1 1477.13 2238.19 1163.32 1477.13 2238.19 1155 1484.75 2238.19 1155 1484.75 2238.19 1163.32 1484.75 2238.44 1155 1484.75 2238.44 1163.32 1477.13 2238.44 1163.32 1477.13 2238.44 1155 1477.13 2240.72 1163.32 1477.13 2240.72 1155 1484.75 2240.72 1155 1484.75 2240.72 1163.32 1484.75 2240.97 1155 1484.75 2240.97 1163.32 1477.13 2240.97 1163.32 1477.13 2240.97 1155 1484.9 2238.44 1155 1484.9 2238.44 1163.32 1484.9 2240.72 1155 1484.9 2240.72 1163.32 1484.75 2240.72 1163.21 1477.27 2240.72 1163.21 1477.27 2238.44 1163.21 1484.75 2238.44 1163.21 1477.27 2240.72 1155.11 1477.27 2238.44 1155.11 1484.75 2240.72 1155.11 1484.75 2238.44 1155.11 1477.21 2241.22 1162.5 1477.21 2241.22 1155 1482.69 2241.22 1155 1482.69 2241.22 1162.5 1482.69 2241.48 1155 1482.69 2241.48 1162.5 1477.21 2241.48 1162.5 1477.21 2241.48 1155 1477.21 2243.86 1162.5 1477.21 2243.86 1155 1482.69 2243.86 1155 1482.69 2243.86 1162.5 1482.69 2244.12 1155 1482.69 2244.12 1162.5 1477.21 2244.12 1162.5 1477.21 2244.12 1155 1482.8 2241.48 1155 1482.8 2241.48 1162.5 1482.8 2243.86 1155 1482.8 2243.86 1162.5 1482.69 2243.86 1162.4 1477.31 2243.86 1162.4 1477.31 2241.48 1162.4 1482.69 2241.48 1162.4 1477.31 2243.86 1155.1 1477.31 2241.48 1155.1 1482.69 2243.86 1155.1 1482.69 2241.48 1155.1 1477.11 2244.36 1165.36 1477.11 2244.36 1155 1485.4 2244.36 1155 1485.4 2244.36 1165.36 1485.4 2244.62 1155 1485.4 2244.62 1165.36 1477.11 2244.62 1165.36 1477.11 2244.62 1155 1477.11 2246.87 1165.36 1477.11 2246.87 1155 1485.4 2246.87 1155 1485.4 2246.87 1165.36 1485.4 2247.12 1155 1485.4 2247.12 1165.36 1477.11 2247.12 1165.36 1477.11 2247.12 1155 1485.55 2244.62 1155 1485.55 2244.62 1165.36 1485.55 2246.87 1155 1485.55 2246.87 1165.36 1485.4 2246.87 1165.22 1477.27 2246.87 1165.22 1477.27 2244.62 1165.22 1485.4 2244.62 1165.22 1477.27 2246.87 1155.14 1477.27 2244.62 1155.14 1485.4 2246.87 1155.14 1485.4 2244.62 1155.14 1489.42 2261.35 1168 1477.42 2261.35 1168 1489.42 2261.35 1167 1489.42 2227.35 1168 1477.42 2261.35 1167 1477.42 2227.35 1168 1489.42 2227.35 1167 1477.42 2227.35 1167 1477.11 2227.34 1174.66 1477.11 2227.34 1168 1485.24 2227.34 1168 1485.24 2227.34 1174.66 1485.24 2227.46 1168 1485.24 2227.46 1174.66 1477.11 2227.46 1174.66 1477.11 2227.46 1168 1477.11 2228.45 1174.66 1477.11 2228.45 1168 1485.24 2228.45 1168 1485.24 2228.45 1174.66 1485.24 2228.56 1168 1485.24 2228.56 1174.66 1477.11 2228.56 1174.66 1477.11 2228.56 1168 1485.4 2227.46 1168 1485.4 2227.46 1174.66 1485.4 2228.45 1168 1485.4 2228.45 1174.66 1485.24 2228.45 1174.58 1477.26 2228.45 1174.58 1477.26 2227.46 1174.58 1485.24 2227.46 1174.58 1477.26 2228.45 1168.08 1477.26 2227.46 1168.08 1485.24 2228.45 1168.08 1485.24 2227.46 1168.08 1477.1 2228.8 1175.12 1477.1 2228.8 1168 1485.55 2228.8 1168 1485.55 2228.8 1175.12 1485.55 2229.12 1168 1485.55 2229.12 1175.12 1477.1 2229.12 1175.12 1477.1 2229.12 1168 1477.1 2232 1175.12 1477.1 2232 1168 1485.55 2232 1168 1485.55 2232 1175.12 1485.55 2232.32 1168 1485.55 2232.32 1175.12 1477.1 2232.32 1175.12 1477.1 2232.32 1168 1485.71 2229.12 1168 1485.71 2229.12 1175.12 1485.71 2232 1168 1485.71 2232 1175.12 1485.55 2232 1175.03 1477.26 2232 1175.03 1477.26 2229.12 1175.03 1485.55 2229.12 1175.03 1477.26 2232 1168.09 1477.26 2229.12 1168.09 1485.55 2232 1168.09 1485.55 2229.12 1168.09 1477.19 2232.57 1175.24 1477.19 2232.57 1168 1483.24 2232.57 1168 1483.24 2232.57 1175.24 1483.24 2232.85 1168 1483.24 2232.85 1175.24 1477.19 2232.85 1175.24 1477.19 2232.85 1168 1477.19 2235.33 1175.24 1477.19 2235.33 1168 1483.24 2235.33 1168 1483.24 2235.33 1175.24 1483.24 2235.61 1168 1483.24 2235.61 1175.24 1477.19 2235.61 1175.24 1477.19 2235.61 1168 1483.36 2232.85 1168 1483.36 2232.85 1175.24 1483.36 2235.33 1168 1483.36 2235.33 1175.24 1483.24 2235.33 1175.14 1477.3 2235.33 1175.14 1477.3 2232.85 1175.14 1483.24 2232.85 1175.14 1477.3 2235.33 1168.1 1477.3 2232.85 1168.1 1483.24 2235.33 1168.1 1483.24 2232.85 1168.1 1477.16 2235.86 1177.12 1477.16 2235.86 1168 1483.81 2235.86 1168 1483.81 2235.86 1177.12 1483.81 2236.02 1168 1483.81 2236.02 1177.12 1477.16 2236.02 1177.12 1477.16 2236.02 1168 1477.16 2237.5 1177.12 1477.16 2237.5 1168 1483.81 2237.5 1168 1483.81 2237.5 1177.12 1483.81 2237.66 1168 1483.81 2237.66 1177.12 1477.16 2237.66 1177.12 1477.16 2237.66 1168 1483.94 2236.02 1168 1483.94 2236.02 1177.12 1483.94 2237.5 1168 1483.94 2237.5 1177.12 1483.81 2237.5 1177 1477.29 2237.5 1177 1477.29 2236.02 1177 1483.81 2236.02 1177 1477.29 2237.5 1168.12 1477.29 2236.02 1168.12 1483.81 2237.5 1168.12 1483.81 2236.02 1168.12 1477.18 2237.91 1175.34 1477.18 2237.91 1168 1483.4 2237.91 1168 1483.4 2237.91 1175.34 1483.4 2238.16 1168 1483.4 2238.16 1175.34 1477.18 2238.16 1175.34 1477.18 2238.16 1168 1477.18 2240.36 1175.34 1477.18 2240.36 1168 1483.4 2240.36 1168 1483.4 2240.36 1175.34 1483.4 2240.61 1168 1483.4 2240.61 1175.34 1477.18 2240.61 1175.34 1477.18 2240.61 1168 1483.52 2238.16 1168 1483.52 2238.16 1175.34 1483.52 2240.36 1168 1483.52 2240.36 1175.34 1483.4 2240.36 1175.24 1477.29 2240.36 1175.24 1477.29 2238.16 1175.24 1483.4 2238.16 1175.24 1477.29 2240.36 1168.1 1477.29 2238.16 1168.1 1483.4 2240.36 1168.1 1483.4 2238.16 1168.1 1477.17 2240.86 1178.48 1477.17 2240.86 1168 1483.6 2240.86 1168 1483.6 2240.86 1178.48 1483.6 2241.11 1168 1483.6 2241.11 1178.48 1477.17 2241.11 1178.48 1477.17 2241.11 1168 1477.17 2243.36 1178.48 1477.17 2243.36 1168 1483.6 2243.36 1168 1483.6 2243.36 1178.48 1483.6 2243.61 1168 1483.6 2243.61 1178.48 1477.17 2243.61 1178.48 1477.17 2243.61 1168 1483.72 2241.11 1168 1483.72 2241.11 1178.48 1483.72 2243.36 1168 1483.72 2243.36 1178.48 1483.6 2243.36 1178.34 1477.29 2243.36 1178.34 1477.29 2241.11 1178.34 1483.6 2241.11 1178.34 1477.29 2243.36 1168.14 1477.29 2241.11 1168.14 1483.6 2243.36 1168.14 1483.6 2241.11 1168.14 1477.17 2243.84 1176.11 1477.17 2243.84 1168 1483.42 2243.84 1168 1483.42 2243.84 1176.11 1483.42 2244.05 1168 1483.42 2244.05 1176.11 1477.17 2244.05 1176.11 1477.17 2244.05 1168 1477.17 2245.85 1176.11 1477.17 2245.85 1168 1483.42 2245.85 1168 1483.42 2245.85 1176.11 1483.42 2246.06 1168 1483.42 2246.06 1176.11 1477.17 2246.06 1176.11 1477.17 2246.06 1168 1483.54 2244.05 1168 1483.54 2244.05 1176.11 1483.54 2245.85 1168 1483.54 2245.85 1176.11 1483.42 2245.85 1176 1477.29 2245.85 1176 1477.29 2244.05 1176 1483.42 2244.05 1176 1477.29 2245.85 1168.1 1477.29 2244.05 1168.1 1483.42 2245.85 1168.1 1483.42 2244.05 1168.1 1489.42 2261.35 1181 1477.42 2261.35 1181 1489.42 2261.35 1180 1489.42 2227.35 1181 1477.42 2261.35 1180 1477.42 2227.35 1181 1489.42 2227.35 1180 1477.42 2227.35 1180 1477.16 2227.35 1187.33 1477.16 2227.35 1181 1483.92 2227.35 1181 1483.92 2227.35 1187.33 1483.92 2227.46 1181 1483.92 2227.46 1187.33 1477.16 2227.46 1187.33 1477.16 2227.46 1181 1477.16 2228.46 1187.33 1477.16 2228.46 1181 1483.92 2228.46 1181 1483.92 2228.46 1187.33 1483.92 2228.57 1181 1483.92 2228.57 1187.33 1477.16 2228.57 1187.33 1477.16 2228.57 1181 1484.05 2227.46 1181 1484.05 2227.46 1187.33 1484.05 2228.46 1181 1484.05 2228.46 1187.33 1483.92 2228.46 1187.24 1477.29 2228.46 1187.24 1477.29 2227.46 1187.24 1483.92 2227.46 1187.24 1477.29 2228.46 1181.08 1477.29 2227.46 1181.08 1483.92 2228.46 1181.08 1483.92 2227.46 1181.08 1477.2 2228.82 1187.76 1477.2 2228.82 1181 1483.1 2228.82 1181 1483.1 2228.82 1187.76 1483.1 2228.97 1181 1483.1 2228.97 1187.76 1477.2 2228.97 1187.76 1477.2 2228.97 1181 1477.2 2230.35 1187.76 1477.2 2230.35 1181 1483.1 2230.35 1181 1483.1 2230.35 1187.76 1483.1 2230.5 1181 1483.1 2230.5 1187.76 1477.2 2230.5 1187.76 1477.2 2230.5 1181 1483.21 2228.97 1181 1483.21 2228.97 1187.76 1483.21 2230.35 1181 1483.21 2230.35 1187.76 1483.1 2230.35 1187.67 1477.31 2230.35 1187.67 1477.31 2228.97 1187.67 1483.1 2228.97 1187.67 1477.31 2230.35 1181.09 1477.31 2228.97 1181.09 1483.1 2230.35 1181.09 1483.1 2228.97 1181.09 1477.16 2230.76 1187.1 1477.16 2230.76 1181 1483.95 2230.76 1181 1483.95 2230.76 1187.1 1483.95 2231.02 1181 1483.95 2231.02 1187.1 1477.16 2231.02 1187.1 1477.16 2231.02 1181 1477.16 2233.4 1187.1 1477.16 2233.4 1181 1483.95 2233.4 1181 1483.95 2233.4 1187.1 1483.95 2233.67 1181 1483.95 2233.67 1187.1 1477.16 2233.67 1187.1 1477.16 2233.67 1181 1484.08 2231.02 1181 1484.08 2231.02 1187.1 1484.08 2233.4 1181 1484.08 2233.4 1187.1 1483.95 2233.4 1187.02 1477.29 2233.4 1187.02 1477.29 2231.02 1187.02 1483.95 2231.02 1187.02 1477.29 2233.4 1181.08 1477.29 2231.02 1181.08 1483.95 2233.4 1181.08 1483.95 2231.02 1181.08 1477.07 2233.91 1190.26 1477.07 2233.91 1181.01 1486.01 2233.91 1181.01 1486.01 2233.91 1190.26 1486.01 2234.14 1181.01 1486.01 2234.14 1190.26 1477.07 2234.14 1190.26 1477.07 2234.14 1181.01 1477.07 2236.18 1190.26 1477.07 2236.18 1181.01 1486.01 2236.18 1181.01 1486.01 2236.18 1190.26 1486.01 2236.41 1181.01 1486.01 2236.41 1190.26 1477.07 2236.41 1190.26 1477.07 2236.41 1181.01 1486.18 2234.14 1181.01 1486.18 2234.14 1190.26 1486.18 2236.18 1181.01 1486.18 2236.18 1190.26 1486.01 2236.18 1190.13 1477.24 2236.18 1190.13 1477.24 2234.14 1190.13 1486.01 2234.14 1190.13 1477.24 2236.18 1181.13 1477.24 2234.14 1181.13 1486.01 2236.18 1181.13 1486.01 2234.14 1181.13 1477.09 2236.65 1188.61 1477.09 2236.65 1181 1485.58 2236.65 1181 1485.58 2236.65 1188.61 1485.58 2236.76 1181 1485.58 2236.76 1188.61 1477.09 2236.76 1188.61 1477.09 2236.76 1181 1477.09 2237.76 1188.61 1477.09 2237.76 1181 1485.58 2237.76 1181 1485.58 2237.76 1188.61 1485.58 2237.87 1181 1485.58 2237.87 1188.61 1477.09 2237.87 1188.61 1477.09 2237.87 1181 1485.74 2236.76 1181 1485.74 2236.76 1188.61 1485.74 2237.76 1181 1485.74 2237.76 1188.61 1485.58 2237.76 1188.5 1477.26 2237.76 1188.5 1477.26 2236.76 1188.5 1485.58 2236.76 1188.5 1477.26 2237.76 1181.1 1477.26 2236.76 1181.1 1485.58 2237.76 1181.1 1485.58 2236.76 1181.1 1477.1 2238.12 1187.54 1477.1 2238.12 1181 1485.65 2238.12 1181 1485.65 2238.12 1187.54 1485.65 2238.23 1181 1485.65 2238.23 1187.54 1477.1 2238.23 1187.54 1477.1 2238.23 1181 1477.1 2239.23 1187.54 1477.1 2239.23 1181 1485.65 2239.23 1181 1485.65 2239.23 1187.54 1485.65 2239.34 1181 1485.65 2239.34 1187.54 1477.1 2239.34 1187.54 1477.1 2239.34 1181 1485.81 2238.23 1181 1485.81 2238.23 1187.54 1485.81 2239.23 1181 1485.81 2239.23 1187.54 1485.65 2239.23 1187.45 1477.26 2239.23 1187.45 1477.26 2238.23 1187.45 1485.65 2238.23 1187.45 1477.26 2239.23 1181.09 1477.26 2238.23 1181.09 1485.65 2239.23 1181.09 1485.65 2238.23 1181.09 1477.09 2239.59 1187.88 1477.09 2239.59 1181 1485.56 2239.59 1181 1485.56 2239.59 1187.88 1485.56 2239.74 1181 1485.56 2239.74 1187.88 1477.09 2239.74 1187.88 1477.09 2239.74 1181 1477.09 2241.08 1187.88 1477.09 2241.08 1181 1485.56 2241.08 1181 1485.56 2241.08 1187.88 1485.56 2241.23 1181 1485.56 2241.23 1187.88 1477.09 2241.23 1187.88 1477.09 2241.23 1181 1485.72 2239.74 1181 1485.72 2239.74 1187.88 1485.72 2241.08 1181 1485.72 2241.08 1187.88 1485.56 2241.08 1187.79 1477.26 2241.08 1187.79 1477.26 2239.74 1187.79 1485.56 2239.74 1187.79 1477.26 2241.08 1181.09 1477.26 2239.74 1181.09 1485.56 2241.08 1181.09 1485.56 2239.74 1181.09 1477.16 2241.48 1187.54 1477.16 2241.48 1181 1483.91 2241.48 1181 1483.91 2241.48 1187.54 1483.91 2241.59 1181 1483.91 2241.59 1187.54 1477.16 2241.59 1187.54 1477.16 2241.59 1181 1477.16 2242.57 1187.54 1477.16 2242.57 1181 1483.91 2242.57 1181 1483.91 2242.57 1187.54 1483.91 2242.68 1181 1483.91 2242.68 1187.54 1477.16 2242.68 1187.54 1477.16 2242.68 1181 1484.04 2241.59 1181 1484.04 2241.59 1187.54 1484.04 2242.57 1181 1484.04 2242.57 1187.54 1483.91 2242.57 1187.45 1477.29 2242.57 1187.45 1477.29 2241.59 1187.45 1483.91 2241.59 1187.45 1477.29 2242.57 1181.09 1477.29 2241.59 1181.09 1483.91 2242.57 1181.09 1483.91 2241.59 1181.09 1477.19 2242.92 1191.07 1477.19 2242.92 1181 1483.22 2242.92 1181 1483.22 2242.92 1191.07 1483.22 2243.25 1181 1483.22 2243.25 1191.07 1477.19 2243.25 1191.07 1477.19 2243.25 1181 1477.19 2246.21 1191.07 1477.19 2246.21 1181 1483.22 2246.21 1181 1483.22 2246.21 1191.07 1483.22 2246.54 1181 1483.22 2246.54 1191.07 1477.19 2246.54 1191.07 1477.19 2246.54 1181 1483.33 2243.25 1181 1483.33 2243.25 1191.07 1483.33 2246.21 1181 1483.33 2246.21 1191.07 1483.22 2246.21 1190.93 1477.31 2246.21 1190.93 1477.31 2243.25 1190.93 1483.22 2243.25 1190.93 1477.31 2246.21 1181.13 1477.31 2243.25 1181.13 1483.22 2246.21 1181.13 1483.22 2243.25 1181.13 1489.42 2261.35 1194 1477.42 2261.35 1194 1489.42 2261.35 1193 1489.42 2227.35 1194 1477.42 2261.35 1193 1477.42 2227.35 1194 1489.42 2227.35 1193 1477.42 2227.35 1193 1477.21 2227.34 1202.13 1477.21 2227.34 1194.01 1482.56 2227.34 1194.01 1482.56 2227.34 1202.13 1482.56 2227.51 1194.01 1482.56 2227.51 1202.13 1477.21 2227.51 1202.13 1477.21 2227.51 1194.01 1477.21 2228.99 1202.13 1477.21 2228.99 1194.01 1482.56 2228.99 1194.01 1482.56 2228.99 1202.13 1482.56 2229.16 1194.01 1482.56 2229.16 1202.13 1477.21 2229.16 1202.13 1477.21 2229.16 1194.01 1482.66 2227.51 1194.01 1482.66 2227.51 1202.13 1482.66 2228.99 1194.01 1482.66 2228.99 1202.13 1482.56 2228.99 1202.03 1477.32 2228.99 1202.03 1477.32 2227.51 1202.03 1482.56 2227.51 1202.03 1477.32 2228.99 1194.11 1477.32 2227.51 1194.11 1482.56 2228.99 1194.11 1482.56 2227.51 1194.11 1477.08 2229.4 1202.38 1477.08 2229.4 1194 1485.9 2229.4 1194 1485.9 2229.4 1202.38 1485.9 2229.55 1194 1485.9 2229.55 1202.38 1477.08 2229.55 1202.38 1477.08 2229.55 1194 1477.08 2230.95 1202.38 1477.08 2230.95 1194 1485.9 2230.95 1194 1485.9 2230.95 1202.38 1485.9 2231.1 1194 1485.9 2231.1 1202.38 1477.08 2231.1 1202.38 1477.08 2231.1 1194 1486.06 2229.55 1194 1486.06 2229.55 1202.38 1486.06 2230.95 1194 1486.06 2230.95 1202.38 1485.9 2230.95 1202.27 1477.25 2230.95 1202.27 1477.25 2229.55 1202.27 1485.9 2229.55 1202.27 1477.25 2230.95 1194.11 1477.25 2229.55 1194.11 1485.9 2230.95 1194.11 1485.9 2229.55 1194.11 1477.08 2231.35 1204.27 1477.08 2231.35 1194 1485.93 2231.35 1194 1485.93 2231.35 1204.27 1485.93 2231.62 1194 1485.93 2231.62 1204.27 1477.08 2231.62 1204.27 1477.08 2231.62 1194 1477.08 2234.08 1204.27 1477.08 2234.08 1194 1485.93 2234.08 1194 1485.93 2234.08 1204.27 1485.93 2234.35 1194 1485.93 2234.35 1204.27 1477.08 2234.35 1204.27 1477.08 2234.35 1194 1486.1 2231.62 1194 1486.1 2231.62 1204.27 1486.1 2234.08 1194 1486.1 2234.08 1204.27 1485.93 2234.08 1204.13 1477.25 2234.08 1204.13 1477.25 2231.62 1204.13 1485.93 2231.62 1204.13 1477.25 2234.08 1194.13 1477.25 2231.62 1194.13 1485.93 2234.08 1194.13 1485.93 2231.62 1194.13 1477.13 2234.6 1203.76 1477.13 2234.6 1194 1484.69 2234.6 1194 1484.69 2234.6 1203.76 1484.69 2234.77 1194 1484.69 2234.77 1203.76 1477.13 2234.77 1203.76 1477.13 2234.77 1194 1477.13 2236.33 1203.76 1477.13 2236.33 1194 1484.69 2236.33 1194 1484.69 2236.33 1203.76 1484.69 2236.5 1194 1484.69 2236.5 1203.76 1477.13 2236.5 1203.76 1477.13 2236.5 1194 1484.84 2234.77 1194 1484.84 2234.77 1203.76 1484.84 2236.33 1194 1484.84 2236.33 1203.76 1484.69 2236.33 1203.63 1477.27 2236.33 1203.63 1477.27 2234.77 1203.63 1484.69 2234.77 1203.63 1477.27 2236.33 1194.13 1477.27 2234.77 1194.13 1484.69 2236.33 1194.13 1484.69 2234.77 1194.13 1477.21 2236.75 1202.26 1477.21 2236.75 1194 1482.67 2236.75 1194 1482.67 2236.75 1202.26 1482.67 2237.04 1194 1482.67 2237.04 1202.26 1477.21 2237.04 1202.26 1477.21 2237.04 1194 1477.21 2239.64 1202.26 1477.21 2239.64 1194 1482.67 2239.64 1194 1482.67 2239.64 1202.26 1482.67 2239.93 1194 1482.67 2239.93 1202.26 1477.21 2239.93 1202.26 1477.21 2239.93 1194 1482.77 2237.04 1194 1482.77 2237.04 1202.26 1482.77 2239.64 1194 1482.77 2239.64 1202.26 1482.67 2239.64 1202.15 1477.32 2239.64 1202.15 1477.32 2237.04 1202.15 1482.67 2237.04 1202.15 1477.32 2239.64 1194.11 1477.32 2237.04 1194.11 1482.67 2239.64 1194.11 1482.67 2237.04 1194.11 1477.21 2240.18 1204.58 1477.21 2240.18 1194.01 1482.58 2240.18 1194.01 1482.58 2240.18 1204.58 1482.58 2240.5 1194.01 1482.58 2240.5 1204.58 1477.21 2240.5 1204.58 1477.21 2240.5 1194.01 1477.21 2243.38 1204.58 1477.21 2243.38 1194.01 1482.58 2243.38 1194.01 1482.58 2243.38 1204.58 1482.58 2243.7 1194.01 1482.58 2243.7 1204.58 1477.21 2243.7 1204.58 1477.21 2243.7 1194.01 1482.68 2240.5 1194.01 1482.68 2240.5 1204.58 1482.68 2243.38 1194.01 1482.68 2243.38 1204.58 1482.58 2243.38 1204.44 1477.32 2243.38 1204.44 1477.32 2240.5 1204.44 1482.58 2240.5 1204.44 1477.32 2243.38 1194.14 1477.32 2240.5 1194.14 1482.58 2243.38 1194.14 1482.58 2240.5 1194.14 1477.21 2243.95 1202.36 1477.21 2243.95 1194.01 1482.77 2243.95 1194.01 1482.77 2243.95 1202.36 1482.77 2244.06 1194.01 1482.77 2244.06 1202.36 1477.21 2244.06 1202.36 1477.21 2244.06 1194.01 1477.21 2245.08 1202.36 1477.21 2245.08 1194.01 1482.77 2245.08 1194.01 1482.77 2245.08 1202.36 1482.77 2245.19 1194.01 1482.77 2245.19 1202.36 1477.21 2245.19 1202.36 1477.21 2245.19 1194.01 1482.88 2244.06 1194.01 1482.88 2244.06 1202.36 1482.88 2245.08 1194.01 1482.88 2245.08 1202.36 1482.77 2245.08 1202.25 1477.31 2245.08 1202.25 1477.31 2244.06 1202.25 1482.77 2244.06 1202.25 1477.31 2245.08 1194.11 1477.31 2244.06 1194.11 1482.77 2245.08 1194.11 1482.77 2244.06 1194.11 1477.13 2245.44 1201.72 1477.13 2245.44 1194 1484.56 2245.44 1194 1484.56 2245.44 1201.72 1484.56 2245.52 1194 1484.56 2245.52 1201.72 1477.13 2245.52 1201.72 1477.13 2245.52 1194 1477.13 2246.22 1201.72 1477.13 2246.22 1194 1484.56 2246.22 1194 1484.56 2246.22 1201.72 1484.56 2246.3 1194 1484.56 2246.3 1201.72 1477.13 2246.3 1201.72 1477.13 2246.3 1194 1484.7 2245.52 1194 1484.7 2245.52 1201.72 1484.7 2246.22 1194 1484.7 2246.22 1201.72 1484.56 2246.22 1201.62 1477.28 2246.22 1201.62 1477.28 2245.52 1201.62 1484.56 2245.52 1201.62 1477.28 2246.22 1194.1 1477.28 2245.52 1194.1 1484.56 2246.22 1194.1 1484.56 2245.52 1194.1 1489.42 2261.35 1207 1477.42 2261.35 1207 1489.42 2261.35 1206 1489.42 2227.35 1207 1477.42 2261.35 1206 1477.42 2227.35 1207 1489.42 2227.35 1206 1477.42 2227.35 1206 1477.14 2227.35 1216.15 1477.14 2227.35 1207.01 1484.65 2227.35 1207.01 1484.65 2227.35 1216.15 1484.65 2227.48 1207.01 1484.65 2227.48 1216.15 1477.14 2227.48 1216.15 1477.14 2227.48 1207.01 1477.14 2228.6 1216.15 1477.14 2228.6 1207.01 1484.65 2228.6 1207.01 1484.65 2228.6 1216.15 1484.65 2228.73 1207.01 1484.65 2228.73 1216.15 1477.14 2228.73 1216.15 1477.14 2228.73 1207.01 1484.79 2227.48 1207.01 1484.79 2227.48 1216.15 1484.79 2228.6 1207.01 1484.79 2228.6 1216.15 1484.65 2228.6 1216.03 1477.28 2228.6 1216.03 1477.28 2227.48 1216.03 1484.65 2227.48 1216.03 1477.28 2228.6 1207.13 1477.28 2227.48 1207.13 1484.65 2228.6 1207.13 1484.65 2227.48 1207.13 1477.07 2228.98 1215.52 1477.07 2228.98 1207 1485.97 2228.98 1207 1485.97 2228.98 1215.52 1485.97 2229.09 1207 1485.97 2229.09 1215.52 1477.07 2229.09 1215.52 1477.07 2229.09 1207 1477.07 2230.13 1215.52 1477.07 2230.13 1207 1485.97 2230.13 1207 1485.97 2230.13 1215.52 1485.97 2230.24 1207 1485.97 2230.24 1215.52 1477.07 2230.24 1215.52 1477.07 2230.24 1207 1486.14 2229.09 1207 1486.14 2229.09 1215.52 1486.14 2230.13 1207 1486.14 2230.13 1215.52 1485.97 2230.13 1215.41 1477.24 2230.13 1215.41 1477.24 2229.09 1215.41 1485.97 2229.09 1215.41 1477.24 2230.13 1207.11 1477.24 2229.09 1207.11 1485.97 2230.13 1207.11 1485.97 2229.09 1207.11 1477.12 2230.48 1217.26 1477.12 2230.48 1207 1484.79 2230.48 1207 1484.79 2230.48 1217.26 1484.79 2230.6 1207 1484.79 2230.6 1217.26 1477.12 2230.6 1217.26 1477.12 2230.6 1207 1477.12 2231.68 1217.26 1477.12 2231.68 1207 1484.79 2231.68 1207 1484.79 2231.68 1217.26 1484.79 2231.8 1207 1484.79 2231.8 1217.26 1477.12 2231.8 1217.26 1477.12 2231.8 1207 1484.94 2230.6 1207 1484.94 2230.6 1217.26 1484.94 2231.68 1207 1484.94 2231.68 1217.26 1484.79 2231.68 1217.13 1477.27 2231.68 1217.13 1477.27 2230.6 1217.13 1484.79 2230.6 1217.13 1477.27 2231.68 1207.14 1477.27 2230.6 1207.14 1484.79 2231.68 1207.14 1484.79 2230.6 1207.14 1477.17 2232.05 1214.17 1477.17 2232.05 1207.01 1483.48 2232.05 1207.01 1483.48 2232.05 1214.17 1483.48 2232.26 1207.01 1483.48 2232.26 1214.17 1477.17 2232.26 1214.17 1477.17 2232.26 1207.01 1477.17 2234.2 1214.17 1477.17 2234.2 1207.01 1483.48 2234.2 1207.01 1483.48 2234.2 1214.17 1483.48 2234.41 1207.01 1483.48 2234.41 1214.17 1477.17 2234.41 1214.17 1477.17 2234.41 1207.01 1483.6 2232.26 1207.01 1483.6 2232.26 1214.17 1483.6 2234.2 1207.01 1483.6 2234.2 1214.17 1483.48 2234.2 1214.08 1477.29 2234.2 1214.08 1477.29 2232.26 1214.08 1483.48 2232.26 1214.08 1477.29 2234.2 1207.1 1477.29 2232.26 1207.1 1483.48 2234.2 1207.1 1483.48 2232.26 1207.1 1477.17 2234.66 1214.92 1477.17 2234.66 1207 1483.6 2234.66 1207 1483.6 2234.66 1214.92 1483.6 2234.85 1207 1483.6 2234.85 1214.92 1477.17 2234.85 1214.92 1477.17 2234.85 1207 1477.17 2236.59 1214.92 1477.17 2236.59 1207 1483.6 2236.59 1207 1483.6 2236.59 1214.92 1483.6 2236.78 1207 1483.6 2236.78 1214.92 1477.17 2236.78 1214.92 1477.17 2236.78 1207 1483.72 2234.85 1207 1483.72 2234.85 1214.92 1483.72 2236.59 1207 1483.72 2236.59 1214.92 1483.6 2236.59 1214.82 1477.3 2236.59 1214.82 1477.3 2234.85 1214.82 1483.6 2234.85 1214.82 1477.3 2236.59 1207.1 1477.3 2234.85 1207.1 1483.6 2236.59 1207.1 1483.6 2234.85 1207.1 1477.14 2237.02 1214.95 1477.14 2237.02 1207.01 1484.43 2237.02 1207.01 1484.43 2237.02 1214.95 1484.43 2237.17 1207.01 1484.43 2237.17 1214.95 1477.14 2237.17 1214.95 1477.14 2237.17 1207.01 1477.14 2238.47 1214.95 1477.14 2238.47 1207.01 1484.43 2238.47 1207.01 1484.43 2238.47 1214.95 1484.43 2238.62 1207.01 1484.43 2238.62 1214.95 1477.14 2238.62 1214.95 1477.14 2238.62 1207.01 1484.57 2237.17 1207.01 1484.57 2237.17 1214.95 1484.57 2238.47 1207.01 1484.57 2238.47 1214.95 1484.43 2238.47 1214.85 1477.28 2238.47 1214.85 1477.28 2237.17 1214.85 1484.43 2237.17 1214.85 1477.28 2238.47 1207.11 1477.28 2237.17 1207.11 1484.43 2238.47 1207.11 1484.43 2237.17 1207.11 1477.14 2238.87 1216.27 1477.14 2238.87 1207 1484.36 2238.87 1207 1484.36 2238.87 1216.27 1484.36 2239.02 1207 1484.36 2239.02 1216.27 1477.14 2239.02 1216.27 1477.14 2239.02 1207 1477.14 2240.36 1216.27 1477.14 2240.36 1207 1484.36 2240.36 1207 1484.36 2240.36 1216.27 1484.36 2240.51 1207 1484.36 2240.51 1216.27 1477.14 2240.51 1216.27 1477.14 2240.51 1207 1484.5 2239.02 1207 1484.5 2239.02 1216.27 1484.5 2240.36 1207 1484.5 2240.36 1216.27 1484.36 2240.36 1216.14 1477.28 2240.36 1216.14 1477.28 2239.02 1216.14 1484.36 2239.02 1216.14 1477.28 2240.36 1207.12 1477.28 2239.02 1207.12 1484.36 2240.36 1207.12 1484.36 2239.02 1207.12 1477.16 2240.75 1213.44 1477.16 2240.75 1207 1483.87 2240.75 1207 1483.87 2240.75 1213.44 1483.87 2240.85 1207 1483.87 2240.85 1213.44 1477.16 2240.85 1213.44 1477.16 2240.85 1207 1477.16 2241.67 1213.44 1477.16 2241.67 1207 1483.87 2241.67 1207 1483.87 2241.67 1213.44 1483.87 2241.77 1207 1483.87 2241.77 1213.44 1477.16 2241.77 1213.44 1477.16 2241.77 1207 1484 2240.85 1207 1484 2240.85 1213.44 1484 2241.67 1207 1484 2241.67 1213.44 1483.87 2241.67 1213.36 1477.29 2241.67 1213.36 1477.29 2240.85 1213.36 1483.87 2240.85 1213.36 1477.29 2241.67 1207.08 1477.29 2240.85 1207.08 1483.87 2241.67 1207.08 1483.87 2240.85 1207.08 1477.07 2242.01 1217.94 1477.07 2242.01 1207 1486.18 2242.01 1207 1486.18 2242.01 1217.94 1486.18 2242.3 1207 1486.18 2242.3 1217.94 1477.07 2242.3 1217.94 1477.07 2242.3 1207 1477.07 2244.9 1217.94 1477.07 2244.9 1207 1486.18 2244.9 1207 1486.18 2244.9 1217.94 1486.18 2245.19 1207 1486.18 2245.19 1217.94 1477.07 2245.19 1217.94 1477.07 2245.19 1207 1486.35 2242.3 1207 1486.35 2242.3 1217.94 1486.35 2244.9 1207 1486.35 2244.9 1217.94 1486.18 2244.9 1217.8 1477.25 2244.9 1217.8 1477.25 2242.3 1217.8 1486.18 2242.3 1217.8 1477.25 2244.9 1207.14 1477.25 2242.3 1207.14 1486.18 2244.9 1207.14 1486.18 2242.3 1207.14 1477.22 2245.45 1217.58 1477.22 2245.45 1207 1482.54 2245.45 1207 1482.54 2245.45 1217.58 1482.54 2245.63 1207 1482.54 2245.63 1217.58 1477.22 2245.63 1217.58 1477.22 2245.63 1207 1477.22 2247.25 1217.58 1477.22 2247.25 1207 1482.54 2247.25 1207 1482.54 2247.25 1217.58 1482.54 2247.44 1207 1482.54 2247.44 1217.58 1477.22 2247.44 1217.58 1477.22 2247.44 1207 1482.64 2245.63 1207 1482.64 2245.63 1217.58 1482.64 2247.25 1207 1482.64 2247.25 1217.58 1482.54 2247.25 1217.44 1477.32 2247.25 1217.44 1477.32 2245.63 1217.44 1482.54 2245.63 1217.44 1477.32 2247.25 1207.14 1477.32 2245.63 1207.14 1482.54 2247.25 1207.14 1482.54 2245.63 1207.14 1489.42 2261.35 1220 1477.42 2261.35 1220 1489.42 2261.35 1219 1489.42 2227.35 1220 1477.42 2261.35 1219 1477.42 2227.35 1220 1489.42 2227.35 1219 1477.42 2227.35 1219 1477.16 2227.35 1229.42 1477.16 2227.35 1220 1483.82 2227.35 1220 1483.82 2227.35 1229.42 1483.82 2227.67 1220 1483.82 2227.67 1229.42 1477.16 2227.67 1229.42 1477.16 2227.67 1220 1477.16 2230.51 1229.42 1477.16 2230.51 1220 1483.82 2230.51 1220 1483.82 2230.51 1229.42 1483.82 2230.83 1220 1483.82 2230.83 1229.42 1477.16 2230.83 1229.42 1477.16 2230.83 1220 1483.94 2227.67 1220 1483.94 2227.67 1229.42 1483.94 2230.51 1220 1483.94 2230.51 1229.42 1483.82 2230.51 1229.3 1477.29 2230.51 1229.3 1477.29 2227.67 1229.3 1483.82 2227.67 1229.3 1477.29 2230.51 1220.12 1477.29 2227.67 1220.12 1483.82 2230.51 1220.12 1483.82 2227.67 1220.12 1477.09 2231.07 1229.39 1477.09 2231.07 1220.01 1485.58 2231.07 1220.01 1485.58 2231.07 1229.39 1485.58 2231.23 1220.01 1485.58 2231.23 1229.39 1477.09 2231.23 1229.39 1477.09 2231.23 1220.01 1477.09 2232.71 1229.39 1477.09 2232.71 1220.01 1485.58 2232.71 1220.01 1485.58 2232.71 1229.39 1485.58 2232.87 1220.01 1485.58 2232.87 1229.39 1477.09 2232.87 1229.39 1477.09 2232.87 1220.01 1485.74 2231.23 1220.01 1485.74 2231.23 1229.39 1485.74 2232.71 1220.01 1485.74 2232.71 1229.39 1485.58 2232.71 1229.27 1477.25 2232.71 1229.27 1477.25 2231.23 1229.27 1485.58 2231.23 1229.27 1477.25 2232.71 1220.13 1477.25 2231.23 1220.13 1485.58 2232.71 1220.13 1485.58 2231.23 1220.13 1477.08 2233.12 1226.79 1477.08 2233.12 1220 1485.93 2233.12 1220 1485.93 2233.12 1226.79 1485.93 2233.36 1220 1485.93 2233.36 1226.79 1477.08 2233.36 1226.79 1477.08 2233.36 1220 1477.08 2235.5 1226.79 1477.08 2235.5 1220 1485.93 2235.5 1220 1485.93 2235.5 1226.79 1485.93 2235.74 1220 1485.93 2235.74 1226.79 1477.08 2235.74 1226.79 1477.08 2235.74 1220 1486.1 2233.36 1220 1486.1 2233.36 1226.79 1486.1 2235.5 1220 1486.1 2235.5 1226.79 1485.93 2235.5 1226.7 1477.25 2235.5 1226.7 1477.25 2233.36 1226.7 1485.93 2233.36 1226.7 1477.25 2235.5 1220.08 1477.25 2233.36 1220.08 1485.93 2235.5 1220.08 1485.93 2233.36 1220.08 1477.11 2235.99 1228.3 1477.11 2235.99 1220 1485.01 2235.99 1220 1485.01 2235.99 1228.3 1485.01 2236.15 1220 1485.01 2236.15 1228.3 1477.11 2236.15 1228.3 1477.11 2236.15 1220 1477.11 2237.61 1228.3 1477.11 2237.61 1220 1485.01 2237.61 1220 1485.01 2237.61 1228.3 1485.01 2237.77 1220 1485.01 2237.77 1228.3 1477.11 2237.77 1228.3 1477.11 2237.77 1220 1485.16 2236.15 1220 1485.16 2236.15 1228.3 1485.16 2237.61 1220 1485.16 2237.61 1228.3 1485.01 2237.61 1228.19 1477.26 2237.61 1228.19 1477.26 2236.15 1228.19 1485.01 2236.15 1228.19 1477.26 2237.61 1220.11 1477.26 2236.15 1220.11 1485.01 2237.61 1220.11 1485.01 2236.15 1220.11 1477.14 2238.02 1227.03 1477.14 2238.02 1220 1484.5 2238.02 1220 1484.5 2238.02 1227.03 1484.5 2238.2 1220 1484.5 2238.2 1227.03 1477.14 2238.2 1227.03 1477.14 2238.2 1220 1477.14 2239.78 1227.03 1477.14 2239.78 1220 1484.5 2239.78 1220 1484.5 2239.78 1227.03 1484.5 2239.96 1220 1484.5 2239.96 1227.03 1477.14 2239.96 1227.03 1477.14 2239.96 1220 1484.64 2238.2 1220 1484.64 2238.2 1227.03 1484.64 2239.78 1220 1484.64 2239.78 1227.03 1484.5 2239.78 1226.93 1477.28 2239.78 1226.93 1477.28 2238.2 1226.93 1484.5 2238.2 1226.93 1477.28 2239.78 1220.09 1477.28 2238.2 1220.09 1484.5 2239.78 1220.09 1484.5 2238.2 1220.09 1477.08 2240.2 1230.76 1477.08 2240.2 1220.01 1485.76 2240.2 1220.01 1485.76 2240.2 1230.76 1485.76 2240.28 1220.01 1485.76 2240.28 1230.76 1477.08 2240.28 1230.76 1477.08 2240.28 1220.01 1477.08 2241 1230.76 1477.08 2241 1220.01 1485.76 2241 1220.01 1485.76 2241 1230.76 1485.76 2241.08 1220.01 1485.76 2241.08 1230.76 1477.08 2241.08 1230.76 1477.08 2241.08 1220.01 1485.92 2240.28 1220.01 1485.92 2240.28 1230.76 1485.92 2241 1220.01 1485.92 2241 1230.76 1485.76 2241 1230.61 1477.25 2241 1230.61 1477.25 2240.28 1230.61 1485.76 2240.28 1230.61 1477.25 2241 1220.15 1477.25 2240.28 1220.15 1485.76 2241 1220.15 1485.76 2240.28 1220.15 1477.09 2241.34 1230.3 1477.09 2241.34 1220 1485.6 2241.34 1220 1485.6 2241.34 1230.3 1485.6 2241.39 1220 1485.6 2241.39 1230.3 1477.09 2241.39 1230.3 1477.09 2241.39 1220 1477.09 2241.83 1230.3 1477.09 2241.83 1220 1485.6 2241.83 1220 1485.6 2241.83 1230.3 1485.6 2241.88 1220 1485.6 2241.88 1230.3 1477.09 2241.88 1230.3 1477.09 2241.88 1220 1485.76 2241.39 1220 1485.76 2241.39 1230.3 1485.76 2241.83 1220 1485.76 2241.83 1230.3 1485.6 2241.83 1230.16 1477.25 2241.83 1230.16 1477.25 2241.39 1230.16 1485.6 2241.39 1230.16 1477.25 2241.83 1220.14 1477.25 2241.39 1220.14 1485.6 2241.83 1220.14 1485.6 2241.39 1220.14 1477.18 2242.12 1230.46 1477.18 2242.12 1220 1483.42 2242.12 1220 1483.42 2242.12 1230.46 1483.42 2242.31 1220 1483.42 2242.31 1230.46 1477.18 2242.31 1230.46 1477.18 2242.31 1220 1477.18 2243.95 1230.46 1477.18 2243.95 1220 1483.42 2243.95 1220 1483.42 2243.95 1230.46 1483.42 2244.14 1220 1483.42 2244.14 1230.46 1477.18 2244.14 1230.46 1477.18 2244.14 1220 1483.54 2242.31 1220 1483.54 2242.31 1230.46 1483.54 2243.95 1220 1483.54 2243.95 1230.46 1483.42 2243.95 1230.32 1477.3 2243.95 1230.32 1477.3 2242.31 1230.32 1483.42 2242.31 1230.32 1477.3 2243.95 1220.14 1477.3 2242.31 1220.14 1483.42 2243.95 1220.14 1483.42 2242.31 1220.14 1477.09 2244.38 1229.32 1477.09 2244.38 1220 1485.91 2244.38 1220 1485.91 2244.38 1229.32 1485.91 2244.57 1220 1485.91 2244.57 1229.32 1477.09 2244.57 1229.32 1477.09 2244.57 1220 1477.09 2246.25 1229.32 1477.09 2246.25 1220 1485.91 2246.25 1220 1485.91 2246.25 1229.32 1485.91 2246.44 1220 1485.91 2246.44 1229.32 1477.09 2246.44 1229.32 1477.09 2246.44 1220 1486.07 2244.57 1220 1486.07 2244.57 1229.32 1486.07 2246.25 1220 1486.07 2246.25 1229.32 1485.91 2246.25 1229.2 1477.26 2246.25 1229.2 1477.26 2244.57 1229.2 1485.91 2244.57 1229.2 1477.26 2246.25 1220.12 1477.26 2244.57 1220.12 1485.91 2246.25 1220.12 1485.91 2244.57 1220.12 1489.42 2261.35 1233 1477.42 2261.35 1233 1489.42 2261.35 1232 1489.42 2227.35 1233 1477.42 2261.35 1232 1477.42 2227.35 1233 1489.42 2227.35 1232 1477.42 2227.35 1232 1477.21 2227.34 1242.72 1477.21 2227.34 1233 1482.73 2227.34 1233 1482.73 2227.34 1242.72 1482.73 2227.55 1233 1482.73 2227.55 1242.72 1477.21 2227.55 1242.72 1477.21 2227.55 1233 1477.21 2229.39 1242.72 1477.21 2229.39 1233 1482.73 2229.39 1233 1482.73 2229.39 1242.72 1482.73 2229.6 1233 1482.73 2229.6 1242.72 1477.21 2229.6 1242.72 1477.21 2229.6 1233 1482.84 2227.55 1233 1482.84 2227.55 1242.72 1482.84 2229.39 1233 1482.84 2229.39 1242.72 1482.73 2229.39 1242.59 1477.31 2229.39 1242.59 1477.31 2227.55 1242.59 1482.73 2227.55 1242.59 1477.31 2229.39 1233.13 1477.31 2227.55 1233.13 1482.73 2229.39 1233.13 1482.73 2227.55 1233.13 1477.1 2229.85 1239.13 1477.1 2229.85 1233.01 1485.34 2229.85 1233.01 1485.34 2229.85 1239.13 1485.34 2230.02 1233.01 1485.34 2230.02 1239.13 1477.1 2230.02 1239.13 1477.1 2230.02 1233.01 1477.1 2231.6 1239.13 1477.1 2231.6 1233.01 1485.34 2231.6 1233.01 1485.34 2231.6 1239.13 1485.34 2231.77 1233.01 1485.34 2231.77 1239.13 1477.1 2231.77 1239.13 1477.1 2231.77 1233.01 1485.5 2230.02 1233.01 1485.5 2230.02 1239.13 1485.5 2231.6 1233.01 1485.5 2231.6 1239.13 1485.34 2231.6 1239.05 1477.26 2231.6 1239.05 1477.26 2230.02 1239.05 1485.34 2230.02 1239.05 1477.26 2231.6 1233.09 1477.26 2230.02 1233.09 1485.34 2231.6 1233.09 1485.34 2230.02 1233.09 1477.09 2232.02 1241.29 1477.09 2232.02 1233 1485.69 2232.02 1233 1485.69 2232.02 1241.29 1485.69 2232.21 1233 1485.69 2232.21 1241.29 1477.09 2232.21 1241.29 1477.09 2232.21 1233 1477.09 2233.91 1241.29 1477.09 2233.91 1233 1485.69 2233.91 1233 1485.69 2233.91 1241.29 1485.69 2234.1 1233 1485.69 2234.1 1241.29 1477.09 2234.1 1241.29 1477.09 2234.1 1233 1485.86 2232.21 1233 1485.86 2232.21 1241.29 1485.86 2233.91 1233 1485.86 2233.91 1241.29 1485.69 2233.91 1241.18 1477.25 2233.91 1241.18 1477.25 2232.21 1241.18 1485.69 2232.21 1241.18 1477.25 2233.91 1233.1 1477.25 2232.21 1233.1 1485.69 2233.91 1233.1 1485.69 2232.21 1233.1 1477.11 2234.35 1241.08 1477.11 2234.35 1233.01 1485.11 2234.35 1233.01 1485.11 2234.35 1241.08 1485.11 2234.59 1233.01 1485.11 2234.59 1241.08 1477.11 2234.59 1241.08 1477.11 2234.59 1233.01 1477.11 2236.71 1241.08 1477.11 2236.71 1233.01 1485.11 2236.71 1233.01 1485.11 2236.71 1241.08 1485.11 2236.95 1233.01 1485.11 2236.95 1241.08 1477.11 2236.95 1241.08 1477.11 2236.95 1233.01 1485.26 2234.59 1233.01 1485.26 2234.59 1241.08 1485.26 2236.71 1233.01 1485.26 2236.71 1241.08 1485.11 2236.71 1240.97 1477.27 2236.71 1240.97 1477.27 2234.59 1240.97 1485.11 2234.59 1240.97 1477.27 2236.71 1233.11 1477.27 2234.59 1233.11 1485.11 2236.71 1233.11 1485.11 2234.59 1233.11 1477.07 2237.19 1241.92 1477.07 2237.19 1233 1486.13 2237.19 1233 1486.13 2237.19 1241.92 1486.13 2237.55 1233 1486.13 2237.55 1241.92 1477.07 2237.55 1241.92 1477.07 2237.55 1233 1477.07 2240.7 1241.92 1477.07 2240.7 1233 1486.13 2240.7 1233 1486.13 2240.7 1241.92 1486.13 2241.05 1233 1486.13 2241.05 1241.92 1477.07 2241.05 1241.92 1477.07 2241.05 1233 1486.3 2237.55 1233 1486.3 2237.55 1241.92 1486.3 2240.7 1233 1486.3 2240.7 1241.92 1486.13 2240.7 1241.81 1477.25 2240.7 1241.81 1477.25 2237.55 1241.81 1486.13 2237.55 1241.81 1477.25 2240.7 1233.11 1477.25 2237.55 1233.11 1486.13 2240.7 1233.11 1486.13 2237.55 1233.11 1477.11 2241.29 1243.04 1477.11 2241.29 1233.01 1485.2 2241.29 1233.01 1485.2 2241.29 1243.04 1485.2 2241.43 1233.01 1485.2 2241.43 1243.04 1477.11 2241.43 1243.04 1477.11 2241.43 1233.01 1477.11 2242.71 1243.04 1477.11 2242.71 1233.01 1485.2 2242.71 1233.01 1485.2 2242.71 1243.04 1485.2 2242.85 1233.01 1485.2 2242.85 1243.04 1477.11 2242.85 1243.04 1477.11 2242.85 1233.01 1485.36 2241.43 1233.01 1485.36 2241.43 1243.04 1485.36 2242.71 1233.01 1485.36 2242.71 1243.04 1485.2 2242.71 1242.9 1477.26 2242.71 1242.9 1477.26 2241.43 1242.9 1485.2 2241.43 1242.9 1477.26 2242.71 1233.14 1477.26 2241.43 1233.14 1485.2 2242.71 1233.14 1485.2 2241.43 1233.14 1477.11 2243.1 1239.08 1477.11 2243.1 1233 1485.32 2243.1 1233 1485.32 2243.1 1239.08 1485.32 2243.22 1233 1485.32 2243.22 1239.08 1477.11 2243.22 1239.08 1477.11 2243.22 1233 1477.11 2244.26 1239.08 1477.11 2244.26 1233 1485.32 2244.26 1233 1485.32 2244.26 1239.08 1485.32 2244.38 1233 1485.32 2244.38 1239.08 1477.11 2244.38 1239.08 1477.11 2244.38 1233 1485.47 2243.22 1233 1485.47 2243.22 1239.08 1485.47 2244.26 1233 1485.47 2244.26 1239.08 1485.32 2244.26 1239 1477.27 2244.26 1239 1477.27 2243.22 1239 1485.32 2243.22 1239 1477.27 2244.26 1233.08 1477.27 2243.22 1233.08 1485.32 2244.26 1233.08 1485.32 2243.22 1233.08 1477.1 2244.62 1242.38 1477.1 2244.62 1233 1485.36 2244.62 1233 1485.36 2244.62 1242.38 1485.36 2244.74 1233 1485.36 2244.74 1242.38 1477.1 2244.74 1242.38 1477.1 2244.74 1233 1477.1 2245.74 1242.38 1477.1 2245.74 1233 1485.36 2245.74 1233 1485.36 2245.74 1242.38 1485.36 2245.86 1233 1485.36 2245.86 1242.38 1477.1 2245.86 1242.38 1477.1 2245.86 1233 1485.52 2244.74 1233 1485.52 2244.74 1242.38 1485.52 2245.74 1233 1485.52 2245.74 1242.38 1485.36 2245.74 1242.26 1477.26 2245.74 1242.26 1477.26 2244.74 1242.26 1485.36 2244.74 1242.26 1477.26 2245.74 1233.12 1477.26 2244.74 1233.12 1485.36 2245.74 1233.12 1485.36 2244.74 1233.12 1489.42 2261.35 1246 1477.42 2261.35 1246 1489.42 2261.35 1245 1489.42 2227.35 1246 1477.42 2261.35 1245 1477.42 2227.35 1246 1489.42 2227.35 1245 1477.42 2227.35 1245 1556.58 2154.17 1165 1544.58 2154.17 1165 1544.58 2153.21 1165 1556.58 2153.21 1165 1544.58 2154.17 1141 1544.58 2153.21 1141 1556.58 2153.21 1141 1556.58 2154.17 1141 1556.58 2177.21 1165 1544.58 2177.21 1165 1556.58 2177.21 1141 1544.58 2177.21 1141 1544.58 2177.21 1141.96 1556.58 2177.21 1141.96 1549.14 2177.69 1158.86 1552.02 2177.69 1158.86 1552.02 2177.69 1158.09 1549.14 2177.69 1158.09 1549.14 2177.21 1158.86 1549.14 2177.21 1158.09 1552.02 2177.21 1158.86 1552.02 2177.21 1158.09 1549.14 2177.69 1147.91 1552.02 2177.69 1147.91 1552.02 2177.69 1147.14 1549.14 2177.69 1147.14 1549.14 2177.21 1147.91 1549.14 2177.21 1147.14 1552.02 2177.21 1147.91 1552.02 2177.21 1147.14 1555.52 2176.92 1142.06 1545.64 2176.92 1142.06 1545.64 2176.92 1153 1555.52 2176.92 1153 1545.54 2177.21 1164.04 1555.62 2177.21 1164.04 1555.52 2176.92 1163.94 1545.64 2176.92 1163.94 1545.54 2177.21 1141.96 1555.62 2177.21 1141.96 1545.54 2177.21 1165 1555.62 2177.21 1165 1572.33 2154.17 1165 1560.33 2154.17 1165 1560.33 2153.21 1165 1572.33 2153.21 1165 1560.33 2154.17 1141 1560.33 2153.21 1141 1572.33 2153.21 1141 1572.33 2154.17 1141 1572.33 2177.21 1165 1560.33 2177.21 1165 1572.33 2177.21 1141 1560.33 2177.21 1141 1560.33 2177.21 1141.96 1572.33 2177.21 1141.96 1564.89 2177.69 1158.86 1567.77 2177.69 1158.86 1567.77 2177.69 1158.09 1564.89 2177.69 1158.09 1564.89 2177.21 1158.86 1564.89 2177.21 1158.09 1567.77 2177.21 1158.86 1567.77 2177.21 1158.09 1564.89 2177.69 1147.91 1567.77 2177.69 1147.91 1567.77 2177.69 1147.14 1564.89 2177.69 1147.14 1564.89 2177.21 1147.91 1564.89 2177.21 1147.14 1567.77 2177.21 1147.91 1567.77 2177.21 1147.14 1571.27 2176.92 1142.06 1561.39 2176.92 1142.06 1561.39 2176.92 1153 1571.27 2176.92 1153 1561.29 2177.21 1164.04 1571.37 2177.21 1164.04 1571.27 2176.92 1163.94 1561.39 2176.92 1163.94 1561.29 2177.21 1141.96 1571.37 2177.21 1141.96 1561.29 2177.21 1165 1571.37 2177.21 1165 1602.76 2154.17 1165 1590.76 2154.17 1165 1590.76 2153.21 1165 1602.76 2153.21 1165 1590.76 2154.17 1141 1590.76 2153.21 1141 1602.76 2153.21 1141 1602.76 2154.17 1141 1602.76 2177.21 1165 1590.76 2177.21 1165 1602.76 2177.21 1141 1590.76 2177.21 1141 1590.76 2177.21 1141.96 1602.76 2177.21 1141.96 1595.32 2177.69 1158.86 1598.2 2177.69 1158.86 1598.2 2177.69 1158.09 1595.32 2177.69 1158.09 1595.32 2177.21 1158.86 1595.32 2177.21 1158.09 1598.2 2177.21 1158.86 1598.2 2177.21 1158.09 1595.32 2177.69 1147.91 1598.2 2177.69 1147.91 1598.2 2177.69 1147.14 1595.32 2177.69 1147.14 1595.32 2177.21 1147.91 1595.32 2177.21 1147.14 1598.2 2177.21 1147.91 1598.2 2177.21 1147.14 1601.7 2176.92 1142.06 1591.82 2176.92 1142.06 1591.82 2176.92 1153 1601.7 2176.92 1153 1591.72 2177.21 1164.04 1601.8 2177.21 1164.04 1601.7 2176.92 1163.94 1591.82 2176.92 1163.94 1591.72 2177.21 1141.96 1601.8 2177.21 1141.96 1591.72 2177.21 1165 1601.8 2177.21 1165 1587.02 2154.17 1165 1575.02 2154.17 1165 1575.02 2153.21 1165 1587.02 2153.21 1165 1575.02 2154.17 1141 1575.02 2153.21 1141 1587.02 2153.21 1141 1587.02 2154.17 1141 1587.02 2177.21 1165 1575.02 2177.21 1165 1587.02 2177.21 1141 1575.02 2177.21 1141 1575.02 2177.21 1141.96 1587.02 2177.21 1141.96 1579.58 2177.69 1158.86 1582.46 2177.69 1158.86 1582.46 2177.69 1158.09 1579.58 2177.69 1158.09 1579.58 2177.21 1158.86 1579.58 2177.21 1158.09 1582.46 2177.21 1158.86 1582.46 2177.21 1158.09 1579.58 2177.69 1147.91 1582.46 2177.69 1147.91 1582.46 2177.69 1147.14 1579.58 2177.69 1147.14 1579.58 2177.21 1147.91 1579.58 2177.21 1147.14 1582.46 2177.21 1147.91 1582.46 2177.21 1147.14 1585.96 2176.92 1142.06 1576.08 2176.92 1142.06 1576.08 2176.92 1153 1585.96 2176.92 1153 1575.98 2177.21 1164.04 1586.06 2177.21 1164.04 1585.96 2176.92 1163.94 1576.08 2176.92 1163.94 1575.98 2177.21 1141.96 1586.06 2177.21 1141.96 1575.98 2177.21 1165 1586.06 2177.21 1165 1647.05 2257.1 1189 1647.05 2210.7 1189 1647.05 2210.7 1227 1647.05 2257.1 1227 1646.55 2209.9 1188 1646.55 2209.9 1228 1647.55 2209.9 1188 1647.55 2209.9 1228 1646.55 2257.9 1228 1646.55 2257.9 1188 1647.55 2257.9 1228 1647.55 2257.9 1188 1646.55 2210.7 1227 1646.55 2210.7 1189 1646.55 2257.1 1227 1646.55 2257.1 1189 1647.55 2210.7 1227 1647.55 2210.7 1189 1647.55 2257.1 1189 1647.55 2257.1 1227 1571.59 2153.19 1212.89 1571.59 2153.19 1213.01 1570.99 2153.19 1212.89 1570.99 2153.19 1213.01 1573.67 2153.19 1215.09 1573.79 2153.19 1215.09 1573.67 2153.19 1215.69 1573.79 2153.19 1215.69 1575.87 2153.19 1213.01 1575.87 2153.19 1212.89 1576.47 2153.19 1213.01 1576.47 2153.19 1212.89 1573.79 2153.19 1210.81 1573.67 2153.19 1210.81 1573.79 2153.19 1210.21 1573.67 2153.19 1210.21 1574.03 2153.19 1213.15 1573.87 2153.19 1213.28 1572.49 2153.19 1211.31 1572.33 2153.19 1211.44 1571.97 2153.19 1210.85 1573.78 2153.19 1212.66 1574.01 2153.19 1212.85 1572.63 2153.19 1214.04 1572.85 2153.19 1214.23 1572.41 2153.19 1214.53 1568.87 2152.45 1212.36 1568.87 2151.84 1212.36 1569.2 2152.45 1211.12 1569.2 2151.84 1211.12 1569.84 2152.45 1210.02 1569.84 2151.84 1210.02 1570.75 2152.45 1209.11 1570.75 2151.84 1209.11 1571.85 2152.45 1208.47 1571.85 2151.84 1208.47 1573.09 2152.45 1208.14 1573.09 2151.84 1208.14 1574.37 2152.45 1208.14 1574.37 2151.84 1208.14 1575.61 2152.45 1208.47 1575.61 2151.84 1208.47 1576.71 2152.45 1209.11 1576.71 2151.84 1209.11 1577.62 2152.45 1210.02 1577.62 2151.84 1210.02 1578.26 2152.45 1211.12 1578.26 2151.84 1211.12 1578.59 2152.45 1212.36 1578.59 2151.84 1212.36 1578.59 2152.45 1213.64 1578.59 2151.84 1213.64 1578.26 2152.45 1214.88 1578.26 2151.84 1214.88 1577.62 2152.45 1215.98 1577.62 2151.84 1215.98 1576.71 2152.45 1216.89 1576.71 2151.84 1216.89 1575.61 2152.45 1217.53 1575.61 2151.84 1217.53 1574.37 2152.45 1217.86 1574.37 2151.84 1217.86 1573.09 2152.45 1217.86 1573.09 2151.84 1217.86 1571.85 2152.45 1217.53 1571.85 2151.84 1217.53 1570.75 2152.45 1216.89 1570.75 2151.84 1216.89 1569.84 2152.45 1215.98 1569.84 2151.84 1215.98 1569.2 2152.45 1214.88 1569.2 2151.84 1214.88 1568.87 2152.45 1213.64 1568.87 2151.84 1213.64 1570.22 2153.34 1212.47 1570.46 2153.34 1211.57 1570.93 2153.34 1210.76 1571.59 2153.34 1210.1 1572.4 2153.34 1209.64 1573.3 2153.34 1209.39 1574.23 2153.34 1209.39 1575.14 2153.34 1209.64 1575.94 2153.34 1210.1 1576.6 2153.34 1210.76 1577.07 2153.34 1211.57 1577.31 2153.34 1212.47 1577.31 2153.34 1213.41 1577.07 2153.34 1214.31 1576.6 2153.34 1215.12 1575.94 2153.34 1215.78 1575.14 2153.34 1216.24 1574.23 2153.34 1216.49 1573.3 2153.34 1216.49 1572.4 2153.34 1216.24 1571.59 2153.34 1215.78 1570.93 2153.34 1215.12 1570.46 2153.34 1214.31 1570.22 2153.34 1213.41 1570.8 2153.34 1212.48 1571 2153.34 1211.74 1571.38 2153.34 1211.07 1571.92 2153.34 1210.53 1572.59 2153.34 1210.15 1573.33 2153.34 1209.95 1574.1 2153.34 1209.95 1574.84 2153.34 1210.15 1575.5 2153.34 1210.53 1576.05 2153.34 1211.07 1576.43 2153.34 1211.74 1576.63 2153.34 1212.48 1576.63 2153.34 1213.25 1576.43 2153.34 1213.99 1576.05 2153.34 1214.65 1575.5 2153.34 1215.2 1574.84 2153.34 1215.58 1574.1 2153.34 1215.78 1573.33 2153.34 1215.78 1572.59 2153.34 1215.58 1571.92 2153.34 1215.2 1571.38 2153.34 1214.65 1571 2153.34 1213.99 1570.8 2153.34 1213.25 4 0 1 8 9 0.286061 0.22624 0.159772 1 4 9 8 12 13 0.286061 0.22624 0.159772 1 4 13 2 0 9 0.286061 0.22624 0.159772 1 4 13 12 3 2 0.286061 0.22624 0.159772 1 4 1 0 2 3 0.286061 0.22624 0.159772 1 4 12 8 1 3 0.286061 0.22624 0.159772 1 4 11 10 4 5 0.286061 0.22624 0.159772 1 4 4 6 7 5 0.286061 0.22624 0.159772 1 4 7 14 11 5 0.286061 0.22624 0.159772 1 4 14 7 6 15 0.286061 0.22624 0.159772 1 4 10 11 14 15 0.286061 0.22624 0.159772 1 4 6 4 10 15 0.286061 0.22624 0.159772 1 4 1 4 10 8 0.286061 0.22624 0.159772 1 4 4 6 15 10 0.286061 0.22624 0.159772 1 4 8 10 15 12 0.286061 0.22624 0.159772 1 4 12 15 6 3 0.286061 0.22624 0.159772 1 4 1 8 12 3 0.286061 0.22624 0.159772 1 4 6 4 1 3 0.286061 0.22624 0.159772 1 4 5 0 9 11 0.286061 0.22624 0.159772 1 4 11 14 7 5 0.286061 0.22624 0.159772 1 4 7 2 0 5 0.286061 0.22624 0.159772 1 4 2 7 14 13 0.286061 0.22624 0.159772 1 4 9 0 2 13 0.286061 0.22624 0.159772 1 4 11 9 13 14 0.286061 0.22624 0.159772 1 4 16 17 18 19 1 1 1 1 4 17 16 19 18 0.4 0.3 0.2 1 4 24 23 20 21 0.286061 0.22624 0.159772 1 4 23 25 22 20 0.286061 0.22624 0.159772 1 4 25 24 21 22 0.286061 0.22624 0.159772 1 4 233 231 229 227 0.9 0.4 0.1 1 4 225 223 221 219 0.9 0.4 0.1 1 4 217 215 213 211 0.9 0.4 0.1 1 4 209 207 205 203 0.9 0.4 0.1 1 3 201 200 199 0.9 0.4 0.1 1 3 198 197 196 0.9 0.4 0.1 1 3 195 194 193 0.9 0.4 0.1 1 3 192 191 190 0.9 0.4 0.1 1 3 189 188 187 0.9 0.4 0.1 1 3 186 185 184 0.9 0.4 0.1 1 3 183 182 181 0.9 0.4 0.1 1 3 180 179 178 0.9 0.4 0.1 1 3 177 176 175 0.9 0.4 0.1 1 3 174 173 172 0.9 0.4 0.1 1 3 171 170 169 0.9 0.4 0.1 1 3 168 167 166 0.9 0.4 0.1 1 3 165 164 163 0.9 0.4 0.1 1 3 162 161 160 0.9 0.4 0.1 1 3 159 158 157 0.9 0.4 0.1 1 3 156 155 154 0.9 0.4 0.1 1 4 153 152 151 150 0.9 0.4 0.1 1 4 149 148 147 146 0.9 0.4 0.1 1 4 145 144 143 142 0.9 0.4 0.1 1 4 141 140 139 138 0.9 0.4 0.1 1 4 137 136 135 134 0.9 0.4 0.1 1 4 133 132 131 130 0.9 0.4 0.1 1 4 129 128 127 126 0.9 0.4 0.1 1 4 125 124 123 122 0.9 0.4 0.1 1 4 121 120 119 118 0.9 0.4 0.1 1 4 117 116 115 114 0.9 0.4 0.1 1 4 113 112 111 110 0.9 0.4 0.1 1 4 109 108 107 106 0.9 0.4 0.1 1 4 105 104 103 102 0.9 0.4 0.1 1 4 101 100 99 98 0.9 0.4 0.1 1 4 97 96 95 94 0.9 0.4 0.1 1 4 93 92 91 90 0.9 0.4 0.1 1 4 89 88 87 86 0.9 0.4 0.1 1 4 85 84 83 82 0.9 0.4 0.1 1 4 81 80 79 78 0.9 0.4 0.1 1 4 77 76 75 74 0.9 0.4 0.1 1 4 73 72 71 70 0.9 0.4 0.1 1 4 69 68 67 66 0.9 0.4 0.1 1 4 65 64 63 62 0.9 0.4 0.1 1 4 61 60 59 58 0.9 0.4 0.1 1 4 57 56 55 54 0.9 0.4 0.1 1 4 53 52 51 50 0.9 0.4 0.1 1 4 49 48 47 46 0.9 0.4 0.1 1 4 45 44 43 42 0.9 0.4 0.1 1 4 41 40 39 38 0.9 0.4 0.1 1 4 37 36 35 34 0.9 0.4 0.1 1 4 33 32 31 30 0.9 0.4 0.1 1 4 29 28 27 26 0.9 0.4 0.1 1 4 232 226 69 66 0.9 0.4 0.1 1 4 230 232 71 72 0.9 0.4 0.1 1 4 228 230 49 46 0.9 0.4 0.1 1 4 226 228 43 44 0.9 0.4 0.1 1 4 224 218 133 130 0.9 0.4 0.1 1 4 222 224 135 136 0.9 0.4 0.1 1 4 220 222 113 110 0.9 0.4 0.1 1 4 218 220 107 108 0.9 0.4 0.1 1 4 216 210 101 98 0.9 0.4 0.1 1 4 214 216 91 92 0.9 0.4 0.1 1 4 212 214 117 114 0.9 0.4 0.1 1 4 210 212 119 120 0.9 0.4 0.1 1 4 208 202 55 56 0.9 0.4 0.1 1 4 206 208 37 34 0.9 0.4 0.1 1 4 204 206 27 28 0.9 0.4 0.1 1 4 202 204 53 50 0.9 0.4 0.1 1 4 201 199 42 43 0.9 0.4 0.1 1 4 200 201 46 47 0.9 0.4 0.1 1 4 199 200 38 39 0.9 0.4 0.1 1 4 198 196 28 29 0.9 0.4 0.1 1 4 197 198 40 41 0.9 0.4 0.1 1 4 196 197 52 53 0.9 0.4 0.1 1 4 195 193 48 49 0.9 0.4 0.1 1 4 194 195 72 73 0.9 0.4 0.1 1 4 193 194 60 61 0.9 0.4 0.1 1 4 192 190 50 51 0.9 0.4 0.1 1 4 191 192 58 59 0.9 0.4 0.1 1 4 190 191 54 55 0.9 0.4 0.1 1 4 189 187 70 71 0.9 0.4 0.1 1 4 188 189 66 67 0.9 0.4 0.1 1 4 187 188 62 63 0.9 0.4 0.1 1 4 186 184 56 57 0.9 0.4 0.1 1 4 185 186 64 65 0.9 0.4 0.1 1 4 184 185 36 37 0.9 0.4 0.1 1 4 183 181 30 31 0.9 0.4 0.1 1 4 182 183 26 27 0.9 0.4 0.1 1 4 181 182 34 35 0.9 0.4 0.1 1 4 180 178 68 69 0.9 0.4 0.1 1 4 179 180 44 45 0.9 0.4 0.1 1 4 178 179 32 33 0.9 0.4 0.1 1 4 177 175 90 91 0.9 0.4 0.1 1 4 176 177 98 99 0.9 0.4 0.1 1 4 175 176 94 95 0.9 0.4 0.1 1 4 174 172 108 109 0.9 0.4 0.1 1 4 173 174 96 97 0.9 0.4 0.1 1 4 172 173 132 133 0.9 0.4 0.1 1 4 171 169 100 101 0.9 0.4 0.1 1 4 170 171 120 121 0.9 0.4 0.1 1 4 169 170 128 129 0.9 0.4 0.1 1 4 168 166 130 131 0.9 0.4 0.1 1 4 167 168 126 127 0.9 0.4 0.1 1 4 166 167 134 135 0.9 0.4 0.1 1 4 165 163 118 119 0.9 0.4 0.1 1 4 164 165 114 115 0.9 0.4 0.1 1 4 163 164 122 123 0.9 0.4 0.1 1 4 162 160 112 113 0.9 0.4 0.1 1 4 161 162 136 137 0.9 0.4 0.1 1 4 160 161 124 125 0.9 0.4 0.1 1 4 159 157 104 105 0.9 0.4 0.1 1 4 158 159 116 117 0.9 0.4 0.1 1 4 157 158 92 93 0.9 0.4 0.1 1 4 156 154 106 107 0.9 0.4 0.1 1 4 155 156 110 111 0.9 0.4 0.1 1 4 154 155 102 103 0.9 0.4 0.1 1 4 153 150 97 94 0.9 0.4 0.1 1 4 152 153 99 100 0.9 0.4 0.1 1 4 151 152 129 126 0.9 0.4 0.1 1 4 150 151 131 132 0.9 0.4 0.1 1 4 149 146 121 118 0.9 0.4 0.1 1 4 148 149 123 124 0.9 0.4 0.1 1 4 147 148 137 134 0.9 0.4 0.1 1 4 146 147 127 128 0.9 0.4 0.1 1 4 145 142 111 112 0.9 0.4 0.1 1 4 144 145 125 122 0.9 0.4 0.1 1 4 143 144 115 116 0.9 0.4 0.1 1 4 142 143 105 102 0.9 0.4 0.1 1 4 141 138 95 96 0.9 0.4 0.1 1 4 140 141 109 106 0.9 0.4 0.1 1 4 139 140 103 104 0.9 0.4 0.1 1 4 138 139 93 90 0.9 0.4 0.1 1 4 89 86 33 30 0.9 0.4 0.1 1 4 88 89 35 36 0.9 0.4 0.1 1 4 87 88 65 62 0.9 0.4 0.1 1 4 86 87 67 68 0.9 0.4 0.1 1 4 85 82 57 54 0.9 0.4 0.1 1 4 84 85 59 60 0.9 0.4 0.1 1 4 83 84 73 70 0.9 0.4 0.1 1 4 82 83 63 64 0.9 0.4 0.1 1 4 81 78 47 48 0.9 0.4 0.1 1 4 80 81 61 58 0.9 0.4 0.1 1 4 79 80 51 52 0.9 0.4 0.1 1 4 78 79 41 38 0.9 0.4 0.1 1 4 77 74 31 32 0.9 0.4 0.1 1 4 76 77 45 42 0.9 0.4 0.1 1 4 75 76 39 40 0.9 0.4 0.1 1 4 74 75 29 26 0.9 0.4 0.1 1 4 222 136 162 113 0.9 0.4 0.1 1 4 220 110 156 107 0.9 0.4 0.1 1 4 218 108 172 133 0.9 0.4 0.1 1 4 224 130 166 135 0.9 0.4 0.1 1 4 173 97 150 132 0.9 0.4 0.1 1 4 176 99 153 94 0.9 0.4 0.1 1 4 169 129 152 100 0.9 0.4 0.1 1 4 168 131 151 126 0.9 0.4 0.1 1 4 170 121 146 128 0.9 0.4 0.1 1 4 163 123 149 118 0.9 0.4 0.1 1 4 161 137 148 124 0.9 0.4 0.1 1 4 167 127 147 134 0.9 0.4 0.1 1 4 212 114 165 119 0.9 0.4 0.1 1 4 210 120 171 101 0.9 0.4 0.1 1 4 216 98 177 91 0.9 0.4 0.1 1 4 214 92 158 117 0.9 0.4 0.1 1 4 155 111 142 102 0.9 0.4 0.1 1 4 160 125 145 112 0.9 0.4 0.1 1 4 164 115 144 122 0.9 0.4 0.1 1 4 159 105 143 116 0.9 0.4 0.1 1 4 175 95 138 90 0.9 0.4 0.1 1 4 174 109 141 96 0.9 0.4 0.1 1 4 154 103 140 106 0.9 0.4 0.1 1 4 157 93 139 104 0.9 0.4 0.1 1 4 228 46 201 43 0.9 0.4 0.1 1 4 226 44 180 69 0.9 0.4 0.1 1 4 178 33 86 68 0.9 0.4 0.1 1 4 181 35 89 30 0.9 0.4 0.1 1 4 185 65 88 36 0.9 0.4 0.1 1 4 188 67 87 62 0.9 0.4 0.1 1 4 186 57 82 64 0.9 0.4 0.1 1 4 191 59 85 54 0.9 0.4 0.1 1 4 194 73 84 60 0.9 0.4 0.1 1 4 187 63 83 70 0.9 0.4 0.1 1 4 202 50 190 55 0.9 0.4 0.1 1 4 208 56 184 37 0.9 0.4 0.1 1 4 200 47 78 38 0.9 0.4 0.1 1 4 193 61 81 48 0.9 0.4 0.1 1 4 192 51 80 58 0.9 0.4 0.1 1 4 197 41 79 52 0.9 0.4 0.1 1 4 183 31 74 26 0.9 0.4 0.1 1 4 179 45 77 32 0.9 0.4 0.1 1 4 199 39 76 42 0.9 0.4 0.1 1 4 198 29 75 40 0.9 0.4 0.1 1 4 232 66 189 71 0.9 0.4 0.1 1 4 230 72 195 49 0.9 0.4 0.1 1 4 206 34 182 27 0.9 0.4 0.1 1 4 204 28 196 53 0.9 0.4 0.1 1 4 234 235 236 237 0.06 0.06 0.06 1 4 238 239 240 241 0.06 0.06 0.06 1 4 242 243 244 245 0.06 0.06 0.06 1 4 246 247 248 249 0.06 0.06 0.06 1 4 250 251 252 253 0.06 0.06 0.06 1 4 254 255 256 257 0.06 0.06 0.06 1 4 258 259 260 261 0.06 0.06 0.06 1 4 262 263 264 265 0.06 0.06 0.06 1 4 266 267 268 269 0.06 0.06 0.06 1 4 270 271 272 273 0.06 0.06 0.06 1 4 274 275 276 277 0.06 0.06 0.06 1 4 278 279 280 281 0.06 0.06 0.06 1 4 282 283 284 285 0.06 0.06 0.06 1 4 286 287 288 289 0.06 0.06 0.06 1 4 290 291 292 293 0.06 0.06 0.06 1 4 294 295 296 297 0.06 0.06 0.06 1 4 298 299 300 301 0.06 0.06 0.06 1 4 302 303 305 304 0.06 0.06 0.06 1 4 304 305 307 306 0.06 0.06 0.06 1 4 306 307 309 308 0.06 0.06 0.06 1 4 308 309 311 310 0.06 0.06 0.06 1 4 310 311 313 312 0.06 0.06 0.06 1 4 312 313 315 314 0.06 0.06 0.06 1 4 314 315 317 316 0.06 0.06 0.06 1 4 316 317 303 302 0.06 0.06 0.06 1 4 318 319 321 320 0.08 0.08 0.08 1 4 320 321 323 322 0.08 0.08 0.08 1 4 322 323 325 324 0.08 0.08 0.08 1 4 324 325 327 326 0.08 0.08 0.08 1 4 326 327 329 328 0.08 0.08 0.08 1 4 328 329 331 330 0.08 0.08 0.08 1 4 330 331 333 332 0.08 0.08 0.08 1 4 332 333 319 318 0.08 0.08 0.08 1 8 334 335 336 337 338 339 340 341 0.08 0.08 0.08 1 8 342 343 344 345 346 347 348 349 0.08 0.08 0.08 1 4 350 351 353 352 0.08 0.08 0.08 1 4 352 353 355 354 0.08 0.08 0.08 1 4 354 355 357 356 0.08 0.08 0.08 1 4 356 357 359 358 0.08 0.08 0.08 1 4 358 359 361 360 0.08 0.08 0.08 1 4 360 361 363 362 0.08 0.08 0.08 1 4 362 363 365 364 0.08 0.08 0.08 1 4 364 365 351 350 0.08 0.08 0.08 1 8 366 367 368 369 370 371 372 373 0.08 0.08 0.08 1 8 374 375 376 377 378 379 380 381 0.08 0.08 0.08 1 4 382 383 384 385 0.6 0.6 0 1 4 386 387 385 384 0.6 0.3 0.2 1 3 388 387 386 0.1 0.1 0.1 1 4 389 382 385 390 0.6 0.6 0 1 4 387 391 390 385 0.6 0.3 0.2 1 3 388 391 387 0.1 0.1 0.1 1 4 392 389 390 393 0.6 0.6 0 1 4 391 394 393 390 0.6 0.3 0.2 1 3 388 394 391 0.1 0.1 0.1 1 4 395 392 393 396 0.6 0.6 0 1 4 394 397 396 393 0.6 0.3 0.2 1 3 388 397 394 0.1 0.1 0.1 1 4 398 395 396 399 0.6 0.6 0 1 4 397 400 399 396 0.6 0.3 0.2 1 3 388 400 397 0.1 0.1 0.1 1 4 383 398 399 384 0.6 0.6 0 1 4 400 386 384 399 0.6 0.3 0.2 1 3 388 386 400 0.1 0.1 0.1 1 6 382 389 392 395 398 383 0.6 0.3 0.2 1 6 401 402 403 404 405 406 0.1 0.1 0.1 1 4 408 407 410 409 0.6 0.6 0 1 4 412 411 409 410 0.6 0.3 0.2 1 3 412 413 411 0.1 0.1 0.1 1 4 407 414 415 410 0.6 0.6 0 1 4 416 412 410 415 0.6 0.3 0.2 1 3 416 413 412 0.1 0.1 0.1 1 4 414 417 418 415 0.6 0.6 0 1 4 419 416 415 418 0.6 0.3 0.2 1 3 419 413 416 0.1 0.1 0.1 1 4 417 420 421 418 0.6 0.6 0 1 4 422 419 418 421 0.6 0.3 0.2 1 3 422 413 419 0.1 0.1 0.1 1 4 420 423 424 421 0.6 0.6 0 1 4 425 422 421 424 0.6 0.3 0.2 1 3 425 413 422 0.1 0.1 0.1 1 4 423 408 409 424 0.6 0.6 0 1 4 411 425 424 409 0.6 0.3 0.2 1 3 411 413 425 0.1 0.1 0.1 1 6 414 407 408 423 420 417 0.6 0.3 0.2 1 6 427 426 431 430 429 428 0.1 0.1 0.1 1 4 433 432 435 434 0.6 0.6 0 1 4 437 436 434 435 0.6 0.3 0.2 1 3 437 438 436 0.1 0.1 0.1 1 4 432 439 440 435 0.6 0.6 0 1 4 441 437 435 440 0.6 0.3 0.2 1 3 441 438 437 0.1 0.1 0.1 1 4 439 442 443 440 0.6 0.6 0 1 4 444 441 440 443 0.6 0.3 0.2 1 3 444 438 441 0.1 0.1 0.1 1 4 442 445 446 443 0.6 0.6 0 1 4 447 444 443 446 0.6 0.3 0.2 1 3 447 438 444 0.1 0.1 0.1 1 4 445 448 449 446 0.6 0.6 0 1 4 450 447 446 449 0.6 0.3 0.2 1 3 450 438 447 0.1 0.1 0.1 1 4 448 433 434 449 0.6 0.6 0 1 4 436 450 449 434 0.6 0.3 0.2 1 3 436 438 450 0.1 0.1 0.1 1 6 439 432 433 448 445 442 0.6 0.3 0.2 1 6 452 451 456 455 454 453 0.1 0.1 0.1 1 4 457 458 459 460 0.6 0.6 0 1 4 461 462 460 459 0.6 0.3 0.2 1 3 463 462 461 0.1 0.1 0.1 1 4 464 457 460 465 0.6 0.6 0 1 4 462 466 465 460 0.6 0.3 0.2 1 3 463 466 462 0.1 0.1 0.1 1 4 467 464 465 468 0.6 0.6 0 1 4 466 469 468 465 0.6 0.3 0.2 1 3 463 469 466 0.1 0.1 0.1 1 4 470 467 468 471 0.6 0.6 0 1 4 469 472 471 468 0.6 0.3 0.2 1 3 463 472 469 0.1 0.1 0.1 1 4 473 470 471 474 0.6 0.6 0 1 4 472 475 474 471 0.6 0.3 0.2 1 3 463 475 472 0.1 0.1 0.1 1 4 458 473 474 459 0.6 0.6 0 1 4 475 461 459 474 0.6 0.3 0.2 1 3 463 461 475 0.1 0.1 0.1 1 6 457 464 467 470 473 458 0.6 0.3 0.2 1 6 476 477 478 479 480 481 0.1 0.1 0.1 1 4 555 537 536 556 0.8 0.8 0.8 1 4 554 538 537 555 0.8 0.8 0.8 1 4 553 539 538 554 0.8 0.8 0.8 1 4 552 540 539 553 0.8 0.8 0.8 1 4 551 541 540 552 0.8 0.8 0.8 1 4 550 542 541 551 0.8 0.8 0.8 1 4 549 543 542 550 0.8 0.8 0.8 1 4 548 544 543 549 0.8 0.8 0.8 1 4 547 545 544 548 0.8 0.8 0.8 1 4 546 514 545 547 0.8 0.8 0.8 1 4 577 515 514 546 0.8 0.8 0.8 1 4 576 516 515 577 0.8 0.8 0.8 1 4 575 517 516 576 0.8 0.8 0.8 1 4 574 518 517 575 0.8 0.8 0.8 1 4 573 519 518 574 0.8 0.8 0.8 1 4 572 520 519 573 0.8 0.8 0.8 1 4 571 521 520 572 0.8 0.8 0.8 1 4 570 522 521 571 0.8 0.8 0.8 1 4 569 523 522 570 0.8 0.8 0.8 1 4 568 524 523 569 0.8 0.8 0.8 1 4 567 525 524 568 0.8 0.8 0.8 1 4 566 526 525 567 0.8 0.8 0.8 1 4 565 527 526 566 0.8 0.8 0.8 1 4 564 528 527 565 0.8 0.8 0.8 1 4 563 529 528 564 0.8 0.8 0.8 1 4 562 530 529 563 0.8 0.8 0.8 1 4 561 531 530 562 0.8 0.8 0.8 1 4 560 532 531 561 0.8 0.8 0.8 1 4 559 533 532 560 0.8 0.8 0.8 1 4 558 534 533 559 0.8 0.8 0.8 1 4 557 535 534 558 0.8 0.8 0.8 1 4 556 536 535 557 0.8 0.8 0.8 1 32 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 0.8 0.8 0.8 1 4 482 514 515 483 0.863 0.165 0.304 1 4 483 515 516 484 0.863 0.165 0.304 1 4 484 516 517 485 0.863 0.165 0.304 1 4 485 517 518 486 0.863 0.165 0.304 1 4 486 518 519 487 0.863 0.165 0.304 1 4 487 519 520 488 0.863 0.165 0.304 1 4 488 520 521 489 0.863 0.165 0.304 1 4 489 521 522 490 0.863 0.165 0.304 1 4 490 522 523 491 0.863 0.165 0.304 1 4 491 523 524 492 0.863 0.165 0.304 1 4 492 524 525 493 0.863 0.165 0.304 1 4 493 525 526 494 0.863 0.165 0.304 1 4 494 526 527 495 0.863 0.165 0.304 1 4 495 527 528 496 0.863 0.165 0.304 1 4 496 528 529 497 0.863 0.165 0.304 1 4 497 529 530 498 0.863 0.165 0.304 1 4 498 530 531 499 0.863 0.165 0.304 1 4 499 531 532 500 0.863 0.165 0.304 1 4 500 532 533 501 0.863 0.165 0.304 1 4 501 533 534 502 0.863 0.165 0.304 1 4 502 534 535 503 0.863 0.165 0.304 1 4 503 535 536 504 0.863 0.165 0.304 1 4 504 536 537 505 0.863 0.165 0.304 1 4 505 537 538 506 0.863 0.165 0.304 1 4 506 538 539 507 0.863 0.165 0.304 1 4 507 539 540 508 0.863 0.165 0.304 1 4 508 540 541 509 0.863 0.165 0.304 1 4 509 541 542 510 0.863 0.165 0.304 1 4 510 542 543 511 0.863 0.165 0.304 1 4 511 543 544 512 0.863 0.165 0.304 1 4 512 544 545 513 0.863 0.165 0.304 1 4 513 545 514 482 0.863 0.165 0.304 1 4 578 546 547 579 0.8 0.8 0.8 1 4 579 547 548 580 0.8 0.8 0.8 1 4 580 548 549 581 0.8 0.8 0.8 1 4 581 549 550 582 0.8 0.8 0.8 1 4 582 550 551 583 0.8 0.8 0.8 1 4 583 551 552 584 0.8 0.8 0.8 1 4 584 552 553 585 0.8 0.8 0.8 1 4 585 553 554 586 0.8 0.8 0.8 1 4 586 554 555 587 0.8 0.8 0.8 1 4 587 555 556 588 0.8 0.8 0.8 1 4 588 556 557 589 0.8 0.8 0.8 1 4 589 557 558 590 0.8 0.8 0.8 1 4 590 558 559 591 0.8 0.8 0.8 1 4 591 559 560 592 0.8 0.8 0.8 1 4 592 560 561 593 0.8 0.8 0.8 1 4 593 561 562 594 0.8 0.8 0.8 1 4 594 562 563 595 0.8 0.8 0.8 1 4 595 563 564 596 0.8 0.8 0.8 1 4 596 564 565 597 0.8 0.8 0.8 1 4 597 565 566 598 0.8 0.8 0.8 1 4 598 566 567 599 0.8 0.8 0.8 1 4 599 567 568 600 0.8 0.8 0.8 1 4 600 568 569 601 0.8 0.8 0.8 1 4 601 569 570 602 0.8 0.8 0.8 1 4 602 570 571 603 0.8 0.8 0.8 1 4 603 571 572 604 0.8 0.8 0.8 1 4 604 572 573 605 0.8 0.8 0.8 1 4 605 573 574 606 0.8 0.8 0.8 1 4 606 574 575 607 0.8 0.8 0.8 1 4 607 575 576 608 0.8 0.8 0.8 1 4 608 576 577 609 0.8 0.8 0.8 1 4 609 577 546 578 0.8 0.8 0.8 1 32 608 609 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 0.8 0.8 0.8 1 4 684 666 665 685 0.8 0.8 0.8 1 4 683 667 666 684 0.8 0.8 0.8 1 4 682 668 667 683 0.8 0.8 0.8 1 4 681 669 668 682 0.8 0.8 0.8 1 4 680 670 669 681 0.8 0.8 0.8 1 4 679 671 670 680 0.8 0.8 0.8 1 4 678 672 671 679 0.8 0.8 0.8 1 4 677 673 672 678 0.8 0.8 0.8 1 4 676 674 673 677 0.8 0.8 0.8 1 4 675 643 674 676 0.8 0.8 0.8 1 4 706 644 643 675 0.8 0.8 0.8 1 4 705 645 644 706 0.8 0.8 0.8 1 4 704 646 645 705 0.8 0.8 0.8 1 4 703 647 646 704 0.8 0.8 0.8 1 4 702 648 647 703 0.8 0.8 0.8 1 4 701 649 648 702 0.8 0.8 0.8 1 4 700 650 649 701 0.8 0.8 0.8 1 4 699 651 650 700 0.8 0.8 0.8 1 4 698 652 651 699 0.8 0.8 0.8 1 4 697 653 652 698 0.8 0.8 0.8 1 4 696 654 653 697 0.8 0.8 0.8 1 4 695 655 654 696 0.8 0.8 0.8 1 4 694 656 655 695 0.8 0.8 0.8 1 4 693 657 656 694 0.8 0.8 0.8 1 4 692 658 657 693 0.8 0.8 0.8 1 4 691 659 658 692 0.8 0.8 0.8 1 4 690 660 659 691 0.8 0.8 0.8 1 4 689 661 660 690 0.8 0.8 0.8 1 4 688 662 661 689 0.8 0.8 0.8 1 4 687 663 662 688 0.8 0.8 0.8 1 4 686 664 663 687 0.8 0.8 0.8 1 4 685 665 664 686 0.8 0.8 0.8 1 32 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 0.8 0.8 0.8 1 4 611 643 644 612 0.05 0.2 0.1 1 4 612 644 645 613 0.05 0.2 0.1 1 4 613 645 646 614 0.05 0.2 0.1 1 4 614 646 647 615 0.05 0.2 0.1 1 4 615 647 648 616 0.05 0.2 0.1 1 4 616 648 649 617 0.05 0.2 0.1 1 4 617 649 650 618 0.05 0.2 0.1 1 4 618 650 651 619 0.05 0.2 0.1 1 4 619 651 652 620 0.05 0.2 0.1 1 4 620 652 653 621 0.05 0.2 0.1 1 4 621 653 654 622 0.05 0.2 0.1 1 4 622 654 655 623 0.05 0.2 0.1 1 4 623 655 656 624 0.05 0.2 0.1 1 4 624 656 657 625 0.05 0.2 0.1 1 4 625 657 658 626 0.05 0.2 0.1 1 4 626 658 659 627 0.05 0.2 0.1 1 4 627 659 660 628 0.05 0.2 0.1 1 4 628 660 661 629 0.05 0.2 0.1 1 4 629 661 662 630 0.05 0.2 0.1 1 4 630 662 663 631 0.05 0.2 0.1 1 4 631 663 664 632 0.05 0.2 0.1 1 4 632 664 665 633 0.05 0.2 0.1 1 4 633 665 666 634 0.05 0.2 0.1 1 4 634 666 667 635 0.05 0.2 0.1 1 4 635 667 668 636 0.05 0.2 0.1 1 4 636 668 669 637 0.05 0.2 0.1 1 4 637 669 670 638 0.05 0.2 0.1 1 4 638 670 671 639 0.05 0.2 0.1 1 4 639 671 672 640 0.05 0.2 0.1 1 4 640 672 673 641 0.05 0.2 0.1 1 4 641 673 674 642 0.05 0.2 0.1 1 4 642 674 643 611 0.05 0.2 0.1 1 4 707 675 676 708 0.8 0.8 0.8 1 4 708 676 677 709 0.8 0.8 0.8 1 4 709 677 678 710 0.8 0.8 0.8 1 4 710 678 679 711 0.8 0.8 0.8 1 4 711 679 680 712 0.8 0.8 0.8 1 4 712 680 681 713 0.8 0.8 0.8 1 4 713 681 682 714 0.8 0.8 0.8 1 4 714 682 683 715 0.8 0.8 0.8 1 4 715 683 684 716 0.8 0.8 0.8 1 4 716 684 685 717 0.8 0.8 0.8 1 4 717 685 686 718 0.8 0.8 0.8 1 4 718 686 687 719 0.8 0.8 0.8 1 4 719 687 688 720 0.8 0.8 0.8 1 4 720 688 689 721 0.8 0.8 0.8 1 4 721 689 690 722 0.8 0.8 0.8 1 4 722 690 691 723 0.8 0.8 0.8 1 4 723 691 692 724 0.8 0.8 0.8 1 4 724 692 693 725 0.8 0.8 0.8 1 4 725 693 694 726 0.8 0.8 0.8 1 4 726 694 695 727 0.8 0.8 0.8 1 4 727 695 696 728 0.8 0.8 0.8 1 4 728 696 697 729 0.8 0.8 0.8 1 4 729 697 698 730 0.8 0.8 0.8 1 4 730 698 699 731 0.8 0.8 0.8 1 4 731 699 700 732 0.8 0.8 0.8 1 4 732 700 701 733 0.8 0.8 0.8 1 4 733 701 702 734 0.8 0.8 0.8 1 4 734 702 703 735 0.8 0.8 0.8 1 4 735 703 704 736 0.8 0.8 0.8 1 4 736 704 705 737 0.8 0.8 0.8 1 4 737 705 706 738 0.8 0.8 0.8 1 4 738 706 675 707 0.8 0.8 0.8 1 32 737 738 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 0.8 0.8 0.8 1 4 740 741 742 743 0.6 0.6 0 1 4 744 745 743 742 0.6 0.3 0.2 1 3 746 745 744 0.1 0.1 0.1 1 4 747 740 743 748 0.6 0.6 0 1 4 745 749 748 743 0.6 0.3 0.2 1 3 746 749 745 0.1 0.1 0.1 1 4 750 747 748 751 0.6 0.6 0 1 4 749 752 751 748 0.6 0.3 0.2 1 3 746 752 749 0.1 0.1 0.1 1 4 753 750 751 754 0.6 0.6 0 1 4 752 755 754 751 0.6 0.3 0.2 1 3 746 755 752 0.1 0.1 0.1 1 4 756 753 754 757 0.6 0.6 0 1 4 755 758 757 754 0.6 0.3 0.2 1 3 746 758 755 0.1 0.1 0.1 1 4 741 756 757 742 0.6 0.6 0 1 4 758 744 742 757 0.6 0.3 0.2 1 3 746 744 758 0.1 0.1 0.1 1 6 740 747 750 753 756 741 0.6 0.3 0.2 1 6 759 760 761 762 763 764 0.1 0.1 0.1 1 4 765 766 767 768 0.163 0.743 0.145 1 4 767 769 770 768 0.163 0.743 0.145 1 4 770 771 765 768 0.163 0.743 0.145 1 4 771 770 769 772 0.163 0.743 0.145 1 4 766 765 771 772 0.163 0.743 0.145 1 4 769 767 766 772 0.163 0.743 0.145 1 4 773 774 775 776 0.163 0.743 0.145 1 4 775 777 778 776 0.163 0.743 0.145 1 4 778 779 773 776 0.163 0.743 0.145 1 4 779 778 777 780 0.163 0.743 0.145 1 4 774 773 779 780 0.163 0.743 0.145 1 4 777 775 774 780 0.163 0.743 0.145 1 4 770 769 781 782 0.163 0.743 0.145 1 4 781 783 784 782 0.163 0.743 0.145 1 4 784 776 770 782 0.163 0.743 0.145 1 4 776 784 783 775 0.163 0.743 0.145 1 4 769 770 776 775 0.163 0.743 0.145 1 4 783 781 769 775 0.163 0.743 0.145 1 4 785 786 787 788 0.7 0.7 0.7 1 4 786 789 790 787 0.7 0.7 0.7 1 4 789 791 792 790 0.7 0.7 0.7 1 3 799 797 798 0.1 0.1 0.1 1 3 801 798 797 0.1 0.1 0.1 1 3 803 799 800 0.1 0.1 0.1 1 3 805 800 799 0.1 0.1 0.1 1 3 804 802 801 0.1 0.1 0.1 1 3 806 801 802 0.1 0.1 0.1 1 3 797 803 804 0.1 0.1 0.1 1 3 807 804 803 0.1 0.1 0.1 1 3 798 806 805 0.1 0.1 0.1 1 3 808 805 806 0.1 0.1 0.1 1 3 800 808 807 0.1 0.1 0.1 1 3 802 807 808 0.1 0.1 0.1 1 3 797 799 803 0.1 0.1 0.1 1 3 805 799 798 0.1 0.1 0.1 1 3 804 801 797 0.1 0.1 0.1 1 3 798 801 806 0.1 0.1 0.1 1 3 803 800 807 0.1 0.1 0.1 1 3 808 800 805 0.1 0.1 0.1 1 3 807 802 804 0.1 0.1 0.1 1 3 806 802 808 0.1 0.1 0.1 1 3 811 809 810 0.1 0.1 0.1 1 3 813 810 809 0.1 0.1 0.1 1 3 815 811 812 0.1 0.1 0.1 1 3 817 812 811 0.1 0.1 0.1 1 3 816 814 813 0.1 0.1 0.1 1 3 818 813 814 0.1 0.1 0.1 1 3 809 815 816 0.1 0.1 0.1 1 3 819 816 815 0.1 0.1 0.1 1 3 810 818 817 0.1 0.1 0.1 1 3 820 817 818 0.1 0.1 0.1 1 3 812 820 819 0.1 0.1 0.1 1 3 814 819 820 0.1 0.1 0.1 1 3 809 811 815 0.1 0.1 0.1 1 3 817 811 810 0.1 0.1 0.1 1 3 816 813 809 0.1 0.1 0.1 1 3 810 813 818 0.1 0.1 0.1 1 3 815 812 819 0.1 0.1 0.1 1 3 820 812 817 0.1 0.1 0.1 1 3 819 814 816 0.1 0.1 0.1 1 3 818 814 820 0.1 0.1 0.1 1 3 823 821 822 0.1 0.1 0.1 1 3 825 822 821 0.1 0.1 0.1 1 3 827 823 824 0.1 0.1 0.1 1 3 829 824 823 0.1 0.1 0.1 1 3 828 826 825 0.1 0.1 0.1 1 3 830 825 826 0.1 0.1 0.1 1 3 821 827 828 0.1 0.1 0.1 1 3 831 828 827 0.1 0.1 0.1 1 3 822 830 829 0.1 0.1 0.1 1 3 832 829 830 0.1 0.1 0.1 1 3 824 832 831 0.1 0.1 0.1 1 3 826 831 832 0.1 0.1 0.1 1 3 821 823 827 0.1 0.1 0.1 1 3 829 823 822 0.1 0.1 0.1 1 3 828 825 821 0.1 0.1 0.1 1 3 822 825 830 0.1 0.1 0.1 1 3 827 824 831 0.1 0.1 0.1 1 3 832 824 829 0.1 0.1 0.1 1 3 831 826 828 0.1 0.1 0.1 1 3 830 826 832 0.1 0.1 0.1 1 3 835 833 834 0.1 0.1 0.1 1 3 837 834 833 0.1 0.1 0.1 1 3 839 835 836 0.1 0.1 0.1 1 3 841 836 835 0.1 0.1 0.1 1 3 840 838 837 0.1 0.1 0.1 1 3 842 837 838 0.1 0.1 0.1 1 3 833 839 840 0.1 0.1 0.1 1 3 843 840 839 0.1 0.1 0.1 1 3 834 842 841 0.1 0.1 0.1 1 3 844 841 842 0.1 0.1 0.1 1 3 836 844 843 0.1 0.1 0.1 1 3 838 843 844 0.1 0.1 0.1 1 3 833 835 839 0.1 0.1 0.1 1 3 841 835 834 0.1 0.1 0.1 1 3 840 837 833 0.1 0.1 0.1 1 3 834 837 842 0.1 0.1 0.1 1 3 839 836 843 0.1 0.1 0.1 1 3 844 836 841 0.1 0.1 0.1 1 3 843 838 840 0.1 0.1 0.1 1 3 842 838 844 0.1 0.1 0.1 1 4 846 847 848 845 0.1 0.1 0.1 1 4 850 848 847 849 0.1 0.1 0.1 1 4 850 851 845 848 0.1 0.1 0.1 1 4 851 850 849 852 0.1 0.1 0.1 1 4 846 845 851 852 0.1 0.1 0.1 1 4 849 847 846 852 0.1 0.1 0.1 1 4 854 794 796 853 0.8 0.8 0.8 1 4 855 793 794 854 0.8 0.8 0.8 1 4 855 854 853 856 0.8 0.8 0.8 1 4 856 795 793 855 0.8 0.8 0.8 1 4 853 796 795 856 0.8 0.8 0.8 1 4 857 858 859 860 0.9 0.4 0.1 1 4 862 864 866 868 0.9 0.4 0.1 1 4 869 870 871 872 0.9 0.4 0.1 1 4 873 874 875 876 0.9 0.4 0.1 1 4 878 880 882 884 0.9 0.4 0.1 1 4 885 886 887 888 0.9 0.4 0.1 1 4 871 857 860 872 0.9 0.4 0.1 1 4 867 865 869 872 0.9 0.4 0.1 1 4 860 859 861 867 0.9 0.4 0.1 1 4 886 885 863 861 0.9 0.4 0.1 1 4 888 876 875 885 0.9 0.4 0.1 1 4 874 865 863 875 0.9 0.4 0.1 1 4 874 873 870 869 0.9 0.4 0.1 1 4 876 883 881 873 0.9 0.4 0.1 1 4 879 871 870 881 0.9 0.4 0.1 1 4 877 883 888 887 0.9 0.4 0.1 1 4 858 857 879 877 0.9 0.4 0.1 1 4 886 859 858 887 0.9 0.4 0.1 1 3 872 860 867 0.9 0.4 0.1 1 3 857 871 879 0.9 0.4 0.1 1 3 869 865 874 0.9 0.4 0.1 1 3 861 859 886 0.9 0.4 0.1 1 3 885 875 863 0.9 0.4 0.1 1 3 877 887 858 0.9 0.4 0.1 1 3 873 881 870 0.9 0.4 0.1 1 3 888 883 876 0.9 0.4 0.1 1 4 890 892 894 896 0.9 0.4 0.1 1 4 897 898 899 900 0.9 0.4 0.1 1 4 901 902 903 904 0.9 0.4 0.1 1 4 906 908 910 912 0.9 0.4 0.1 1 4 913 914 915 916 0.9 0.4 0.1 1 4 917 918 919 920 0.9 0.4 0.1 1 4 903 889 895 904 0.9 0.4 0.1 1 4 900 899 901 904 0.9 0.4 0.1 1 4 895 893 897 900 0.9 0.4 0.1 1 4 918 917 898 897 0.9 0.4 0.1 1 4 920 911 909 917 0.9 0.4 0.1 1 4 907 899 898 909 0.9 0.4 0.1 1 4 907 905 902 901 0.9 0.4 0.1 1 4 911 916 915 905 0.9 0.4 0.1 1 4 914 903 902 915 0.9 0.4 0.1 1 4 913 916 920 919 0.9 0.4 0.1 1 4 891 889 914 913 0.9 0.4 0.1 1 4 918 893 891 919 0.9 0.4 0.1 1 3 904 895 900 0.9 0.4 0.1 1 3 889 903 914 0.9 0.4 0.1 1 3 901 899 907 0.9 0.4 0.1 1 3 897 893 918 0.9 0.4 0.1 1 3 917 909 898 0.9 0.4 0.1 1 3 913 919 891 0.9 0.4 0.1 1 3 905 915 902 0.9 0.4 0.1 1 3 920 916 911 0.9 0.4 0.1 1 6 922 923 929 930 924 921 0.8 0.8 0.8 1 4 925 921 924 926 0.8 0.8 0.8 1 4 927 928 929 930 0.8 0.8 0.8 1 4 931 932 927 930 0.8 0.8 0.8 1 4 932 931 933 934 0.8 0.8 0.8 1 4 928 927 932 934 0.8 0.8 0.8 1 4 933 929 928 934 0.8 0.8 0.8 1 6 925 926 941 942 936 935 0.8 0.8 0.8 1 4 937 935 936 938 0.8 0.8 0.8 1 4 939 940 941 942 0.8 0.8 0.8 1 4 943 944 939 942 0.8 0.8 0.8 1 4 944 943 945 946 0.8 0.8 0.8 1 4 940 939 944 946 0.8 0.8 0.8 1 4 945 941 940 946 0.8 0.8 0.8 1 6 938 953 954 948 947 937 0.8 0.8 0.8 1 4 949 947 948 950 0.8 0.8 0.8 1 4 951 952 953 954 0.8 0.8 0.8 1 4 955 956 951 954 0.8 0.8 0.8 1 4 956 955 957 958 0.8 0.8 0.8 1 4 952 951 956 958 0.8 0.8 0.8 1 4 957 953 952 958 0.8 0.8 0.8 1 6 950 963 964 960 959 949 0.8 0.8 0.8 1 4 922 959 960 923 0.8 0.8 0.8 1 4 961 962 963 964 0.8 0.8 0.8 1 4 965 966 961 964 0.8 0.8 0.8 1 4 966 965 967 968 0.8 0.8 0.8 1 4 962 961 966 968 0.8 0.8 0.8 1 4 967 963 962 968 0.8 0.8 0.8 1 16 923 960 964 963 950 948 954 953 938 936 942 941 926 924 930 929 0.8 0.8 0.8 1 4 969 970 971 972 0.702 0.198 0.106 1 4 971 973 974 972 0.702 0.198 0.106 1 4 974 975 969 972 0.702 0.198 0.106 1 4 975 974 973 976 0.702 0.198 0.106 1 4 970 969 975 976 0.702 0.198 0.106 1 4 973 971 970 976 0.702 0.198 0.106 1 4 977 978 979 980 0.702 0.198 0.106 1 4 979 981 982 980 0.702 0.198 0.106 1 4 982 983 977 980 0.702 0.198 0.106 1 4 983 982 981 984 0.702 0.198 0.106 1 4 978 977 983 984 0.702 0.198 0.106 1 4 981 979 978 984 0.702 0.198 0.106 1 4 985 986 987 988 0.702 0.198 0.106 1 4 987 978 977 988 0.702 0.198 0.106 1 4 977 972 985 988 0.702 0.198 0.106 1 4 972 977 978 971 0.702 0.198 0.106 1 4 986 985 972 971 0.702 0.198 0.106 1 4 978 987 986 971 0.702 0.198 0.106 1 40 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 0.7 0.7 0.7 1 40 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 0.7 0.7 0.7 1 4 989 1068 1067 990 0.7 0.7 0.7 1 4 990 1067 1066 991 0.7 0.7 0.7 1 4 991 1066 1065 992 0.7 0.7 0.7 1 4 992 1065 1064 993 0.7 0.7 0.7 1 4 993 1064 1063 994 0.7 0.7 0.7 1 4 994 1063 1062 995 0.7 0.7 0.7 1 4 995 1062 1061 996 0.7 0.7 0.7 1 4 996 1061 1060 997 0.7 0.7 0.7 1 4 997 1060 1059 998 0.7 0.7 0.7 1 4 998 1059 1058 999 0.7 0.7 0.7 1 4 999 1058 1057 1000 0.7 0.7 0.7 1 4 1000 1057 1056 1001 0.7 0.7 0.7 1 4 1001 1056 1055 1002 0.7 0.7 0.7 1 4 1002 1055 1054 1003 0.7 0.7 0.7 1 4 1003 1054 1053 1004 0.7 0.7 0.7 1 4 1004 1053 1052 1005 0.7 0.7 0.7 1 4 1005 1052 1051 1006 0.7 0.7 0.7 1 4 1006 1051 1050 1007 0.7 0.7 0.7 1 4 1007 1050 1049 1008 0.7 0.7 0.7 1 4 1008 1049 1048 1009 0.7 0.7 0.7 1 6 1011 1010 1009 1048 1047 1046 0.7 0.7 0.7 1 4 1011 1046 1045 1012 0.7 0.7 0.7 1 4 1012 1045 1044 1013 0.7 0.7 0.7 1 4 1013 1044 1043 1014 0.7 0.7 0.7 1 4 1014 1043 1042 1015 0.7 0.7 0.7 1 4 1015 1042 1041 1016 0.7 0.7 0.7 1 4 1016 1041 1040 1017 0.7 0.7 0.7 1 4 1017 1040 1039 1018 0.7 0.7 0.7 1 4 1018 1039 1038 1019 0.7 0.7 0.7 1 4 1019 1038 1037 1020 0.7 0.7 0.7 1 4 1020 1037 1036 1021 0.7 0.7 0.7 1 4 1021 1036 1035 1022 0.7 0.7 0.7 1 4 1022 1035 1034 1023 0.7 0.7 0.7 1 4 1023 1034 1033 1024 0.7 0.7 0.7 1 4 1024 1033 1032 1025 0.7 0.7 0.7 1 4 1025 1032 1031 1026 0.7 0.7 0.7 1 4 1026 1031 1030 1027 0.7 0.7 0.7 1 4 1027 1030 1029 1028 0.7 0.7 0.7 1 4 1028 1029 1068 989 0.7 0.7 0.7 1 40 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 989 0.7 0.7 0.7 1 40 1068 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 0.7 0.7 0.7 1 4 1107 1108 1068 989 0.7 0.7 0.7 1 4 1106 1109 1108 1107 0.7 0.7 0.7 1 4 1105 1110 1109 1106 0.7 0.7 0.7 1 4 1104 1111 1110 1105 0.7 0.7 0.7 1 4 1103 1112 1111 1104 0.7 0.7 0.7 1 4 1102 1113 1112 1103 0.7 0.7 0.7 1 4 1101 1114 1113 1102 0.7 0.7 0.7 1 4 1100 1115 1114 1101 0.7 0.7 0.7 1 4 1099 1116 1115 1100 0.7 0.7 0.7 1 4 1098 1117 1116 1099 0.7 0.7 0.7 1 4 1097 1118 1117 1098 0.7 0.7 0.7 1 4 1096 1119 1118 1097 0.7 0.7 0.7 1 4 1095 1120 1119 1096 0.7 0.7 0.7 1 4 1094 1121 1120 1095 0.7 0.7 0.7 1 4 1093 1122 1121 1094 0.7 0.7 0.7 1 4 1092 1123 1122 1093 0.7 0.7 0.7 1 4 1091 1124 1123 1092 0.7 0.7 0.7 1 4 1090 1125 1124 1091 0.7 0.7 0.7 1 4 1089 1126 1125 1090 0.7 0.7 0.7 1 4 1088 1127 1126 1089 0.7 0.7 0.7 1 6 1129 1128 1127 1088 1087 1086 0.7 0.7 0.7 1 4 1085 1130 1129 1086 0.7 0.7 0.7 1 4 1084 1131 1130 1085 0.7 0.7 0.7 1 4 1083 1132 1131 1084 0.7 0.7 0.7 1 4 1082 1133 1132 1083 0.7 0.7 0.7 1 4 1081 1134 1133 1082 0.7 0.7 0.7 1 4 1080 1135 1134 1081 0.7 0.7 0.7 1 4 1079 1136 1135 1080 0.7 0.7 0.7 1 4 1078 1137 1136 1079 0.7 0.7 0.7 1 4 1077 1138 1137 1078 0.7 0.7 0.7 1 4 1076 1139 1138 1077 0.7 0.7 0.7 1 4 1075 1140 1139 1076 0.7 0.7 0.7 1 4 1074 1141 1140 1075 0.7 0.7 0.7 1 4 1073 1142 1141 1074 0.7 0.7 0.7 1 4 1072 1143 1142 1073 0.7 0.7 0.7 1 4 1071 1144 1143 1072 0.7 0.7 0.7 1 4 1070 1145 1144 1071 0.7 0.7 0.7 1 4 1069 1146 1145 1070 0.7 0.7 0.7 1 4 989 1068 1146 1069 0.7 0.7 0.7 1 4 1147 1157 1158 1148 0.171 0.237 0.875 1 4 1148 1158 1150 1149 0.171 0.237 0.875 1 4 1149 1150 1160 1151 0.171 0.237 0.875 1 4 1151 1160 1161 1152 0.171 0.237 0.875 1 4 1152 1161 1162 1153 0.171 0.237 0.875 1 4 1153 1162 1155 1154 0.171 0.237 0.875 1 4 1154 1155 1164 1156 0.171 0.237 0.875 1 4 1156 1164 1157 1147 0.171 0.237 0.875 1 4 1157 1165 1166 1158 0.171 0.237 0.875 1 4 1158 1166 1159 1150 0.171 0.237 0.875 1 4 1150 1159 1168 1160 0.171 0.237 0.875 1 4 1160 1168 1169 1161 0.171 0.237 0.875 1 4 1161 1169 1170 1162 0.171 0.237 0.875 1 4 1162 1170 1163 1155 0.171 0.237 0.875 1 4 1155 1163 1172 1164 0.171 0.237 0.875 1 4 1164 1172 1165 1157 0.171 0.237 0.875 1 4 1165 1173 1174 1166 0.171 0.237 0.875 1 4 1166 1174 1167 1159 0.171 0.237 0.875 1 4 1159 1167 1176 1168 0.171 0.237 0.875 1 4 1168 1176 1177 1169 0.171 0.237 0.875 1 4 1169 1177 1178 1170 0.171 0.237 0.875 1 4 1170 1178 1171 1163 0.171 0.237 0.875 1 4 1163 1171 1180 1172 0.171 0.237 0.875 1 4 1172 1180 1173 1165 0.171 0.237 0.875 1 4 1173 1181 1182 1174 0.171 0.237 0.875 1 4 1174 1182 1175 1167 0.171 0.237 0.875 1 4 1167 1175 1184 1176 0.171 0.237 0.875 1 4 1176 1184 1185 1177 0.171 0.237 0.875 1 4 1177 1185 1186 1178 0.171 0.237 0.875 1 4 1178 1186 1179 1171 0.171 0.237 0.875 1 4 1171 1179 1188 1180 0.171 0.237 0.875 1 4 1180 1188 1181 1173 0.171 0.237 0.875 1 4 1181 1189 1190 1182 0.171 0.237 0.875 1 4 1182 1190 1183 1175 0.171 0.237 0.875 1 4 1175 1183 1192 1184 0.171 0.237 0.875 1 4 1184 1192 1193 1185 0.171 0.237 0.875 1 4 1185 1193 1194 1186 0.171 0.237 0.875 1 4 1186 1194 1187 1179 0.171 0.237 0.875 1 4 1179 1187 1196 1188 0.171 0.237 0.875 1 4 1188 1196 1189 1181 0.171 0.237 0.875 1 4 1189 1197 1198 1190 0.171 0.237 0.875 1 4 1190 1198 1191 1183 0.171 0.237 0.875 1 4 1183 1191 1200 1192 0.171 0.237 0.875 1 4 1192 1200 1201 1193 0.171 0.237 0.875 1 4 1193 1201 1202 1194 0.171 0.237 0.875 1 4 1194 1202 1195 1187 0.171 0.237 0.875 1 4 1187 1195 1204 1196 0.171 0.237 0.875 1 4 1196 1204 1197 1189 0.171 0.237 0.875 1 4 1197 1212 1214 1198 0.171 0.237 0.875 1 4 1198 1214 1199 1191 0.171 0.237 0.875 1 4 1191 1199 1217 1200 0.171 0.237 0.875 1 4 1200 1217 1205 1201 0.171 0.237 0.875 1 4 1201 1205 1207 1202 0.171 0.237 0.875 1 4 1202 1207 1203 1195 0.171 0.237 0.875 1 4 1195 1203 1210 1204 0.171 0.237 0.875 1 4 1204 1210 1212 1197 0.171 0.237 0.875 1 4 1205 1206 1208 1207 0.171 0.237 0.875 1 4 1207 1208 1209 1203 0.171 0.237 0.875 1 4 1203 1209 1211 1210 0.171 0.237 0.875 1 4 1210 1211 1213 1212 0.171 0.237 0.875 1 4 1212 1213 1215 1214 0.171 0.237 0.875 1 4 1214 1215 1216 1199 0.171 0.237 0.875 1 4 1199 1216 1218 1217 0.171 0.237 0.875 1 4 1217 1218 1206 1205 0.171 0.237 0.875 1 4 1327 1367 1366 1328 0.171 0.237 0.875 1 4 1329 1328 1366 1365 0.171 0.237 0.875 1 4 1330 1329 1365 1364 0.171 0.237 0.875 1 4 1331 1330 1364 1363 0.171 0.237 0.875 1 4 1332 1331 1363 1362 0.171 0.237 0.875 1 4 1333 1332 1362 1361 0.171 0.237 0.875 1 4 1334 1333 1361 1360 0.171 0.237 0.875 1 4 1335 1334 1360 1359 0.171 0.237 0.875 1 4 1336 1335 1359 1358 0.171 0.237 0.875 1 4 1337 1336 1358 1357 0.171 0.237 0.875 1 4 1338 1337 1357 1356 0.171 0.237 0.875 1 4 1339 1338 1356 1355 0.171 0.237 0.875 1 4 1340 1339 1355 1354 0.171 0.237 0.875 1 4 1340 1354 1353 1341 0.171 0.237 0.875 1 4 1341 1353 1352 1342 0.171 0.237 0.875 1 4 1342 1352 1351 1343 0.171 0.237 0.875 1 4 1343 1351 1350 1344 0.171 0.237 0.875 1 4 1344 1350 1349 1345 0.171 0.237 0.875 1 4 1345 1349 1348 1346 0.171 0.237 0.875 1 4 1346 1348 1347 1315 0.171 0.237 0.875 1 4 1315 1347 1378 1316 0.171 0.237 0.875 1 4 1316 1378 1377 1317 0.171 0.237 0.875 1 4 1317 1377 1376 1318 0.171 0.237 0.875 1 4 1318 1376 1375 1319 0.171 0.237 0.875 1 4 1319 1375 1374 1320 0.171 0.237 0.875 1 4 1320 1374 1373 1321 0.171 0.237 0.875 1 4 1321 1373 1372 1322 0.171 0.237 0.875 1 4 1322 1372 1371 1323 0.171 0.237 0.875 1 4 1323 1371 1370 1324 0.171 0.237 0.875 1 4 1324 1370 1369 1325 0.171 0.237 0.875 1 4 1325 1369 1368 1326 0.171 0.237 0.875 1 4 1326 1368 1367 1327 0.171 0.237 0.875 1 32 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 0.171 0.237 0.875 1 4 1219 1251 1252 1220 0.171 0.237 0.875 1 4 1220 1252 1253 1221 0.171 0.237 0.875 1 4 1221 1253 1254 1222 0.171 0.237 0.875 1 4 1222 1254 1255 1223 0.171 0.237 0.875 1 4 1223 1255 1256 1224 0.171 0.237 0.875 1 4 1224 1256 1257 1225 0.171 0.237 0.875 1 4 1225 1257 1258 1226 0.171 0.237 0.875 1 4 1226 1258 1259 1227 0.171 0.237 0.875 1 4 1227 1259 1260 1228 0.171 0.237 0.875 1 4 1228 1260 1261 1229 0.171 0.237 0.875 1 4 1229 1261 1262 1230 0.171 0.237 0.875 1 4 1230 1262 1263 1231 0.171 0.237 0.875 1 4 1231 1263 1264 1232 0.171 0.237 0.875 1 4 1232 1264 1265 1233 0.171 0.237 0.875 1 4 1233 1265 1266 1234 0.171 0.237 0.875 1 4 1234 1266 1267 1235 0.171 0.237 0.875 1 4 1235 1267 1268 1236 0.171 0.237 0.875 1 4 1236 1268 1269 1237 0.171 0.237 0.875 1 4 1237 1269 1270 1238 0.171 0.237 0.875 1 4 1238 1270 1271 1239 0.171 0.237 0.875 1 4 1239 1271 1272 1240 0.171 0.237 0.875 1 4 1240 1272 1273 1241 0.171 0.237 0.875 1 4 1241 1273 1274 1242 0.171 0.237 0.875 1 4 1242 1274 1275 1243 0.171 0.237 0.875 1 4 1243 1275 1276 1244 0.171 0.237 0.875 1 4 1244 1276 1277 1245 0.171 0.237 0.875 1 4 1245 1277 1278 1246 0.171 0.237 0.875 1 4 1246 1278 1279 1247 0.171 0.237 0.875 1 4 1247 1279 1280 1248 0.171 0.237 0.875 1 4 1248 1280 1281 1249 0.171 0.237 0.875 1 4 1249 1281 1282 1250 0.171 0.237 0.875 1 4 1250 1282 1251 1219 0.171 0.237 0.875 1 4 1251 1283 1284 1252 0.171 0.237 0.875 1 4 1252 1284 1285 1253 0.171 0.237 0.875 1 4 1253 1285 1286 1254 0.171 0.237 0.875 1 4 1254 1286 1287 1255 0.171 0.237 0.875 1 4 1255 1287 1288 1256 0.171 0.237 0.875 1 4 1256 1288 1289 1257 0.171 0.237 0.875 1 4 1257 1289 1290 1258 0.171 0.237 0.875 1 4 1258 1290 1291 1259 0.171 0.237 0.875 1 4 1259 1291 1292 1260 0.171 0.237 0.875 1 4 1260 1292 1293 1261 0.171 0.237 0.875 1 4 1261 1293 1294 1262 0.171 0.237 0.875 1 4 1262 1294 1295 1263 0.171 0.237 0.875 1 4 1263 1295 1296 1264 0.171 0.237 0.875 1 4 1264 1296 1297 1265 0.171 0.237 0.875 1 4 1265 1297 1298 1266 0.171 0.237 0.875 1 4 1266 1298 1299 1267 0.171 0.237 0.875 1 4 1267 1299 1300 1268 0.171 0.237 0.875 1 4 1268 1300 1301 1269 0.171 0.237 0.875 1 4 1269 1301 1302 1270 0.171 0.237 0.875 1 4 1270 1302 1303 1271 0.171 0.237 0.875 1 4 1271 1303 1304 1272 0.171 0.237 0.875 1 4 1272 1304 1305 1273 0.171 0.237 0.875 1 4 1273 1305 1306 1274 0.171 0.237 0.875 1 4 1274 1306 1307 1275 0.171 0.237 0.875 1 4 1275 1307 1308 1276 0.171 0.237 0.875 1 4 1276 1308 1309 1277 0.171 0.237 0.875 1 4 1277 1309 1310 1278 0.171 0.237 0.875 1 4 1278 1310 1311 1279 0.171 0.237 0.875 1 4 1279 1311 1312 1280 0.171 0.237 0.875 1 4 1280 1312 1313 1281 0.171 0.237 0.875 1 4 1281 1313 1314 1282 0.171 0.237 0.875 1 4 1282 1314 1283 1251 0.171 0.237 0.875 1 4 1283 1315 1316 1284 0.171 0.237 0.875 1 4 1284 1316 1317 1285 0.171 0.237 0.875 1 4 1285 1317 1318 1286 0.171 0.237 0.875 1 4 1286 1318 1319 1287 0.171 0.237 0.875 1 4 1287 1319 1320 1288 0.171 0.237 0.875 1 4 1288 1320 1321 1289 0.171 0.237 0.875 1 4 1289 1321 1322 1290 0.171 0.237 0.875 1 4 1290 1322 1323 1291 0.171 0.237 0.875 1 4 1291 1323 1324 1292 0.171 0.237 0.875 1 4 1292 1324 1325 1293 0.171 0.237 0.875 1 4 1293 1325 1326 1294 0.171 0.237 0.875 1 4 1294 1326 1327 1295 0.171 0.237 0.875 1 4 1295 1327 1328 1296 0.171 0.237 0.875 1 4 1296 1328 1329 1297 0.171 0.237 0.875 1 4 1297 1329 1330 1298 0.171 0.237 0.875 1 4 1298 1330 1331 1299 0.171 0.237 0.875 1 4 1299 1331 1332 1300 0.171 0.237 0.875 1 4 1300 1332 1333 1301 0.171 0.237 0.875 1 4 1301 1333 1334 1302 0.171 0.237 0.875 1 4 1302 1334 1335 1303 0.171 0.237 0.875 1 4 1303 1335 1336 1304 0.171 0.237 0.875 1 4 1304 1336 1337 1305 0.171 0.237 0.875 1 4 1305 1337 1338 1306 0.171 0.237 0.875 1 4 1306 1338 1339 1307 0.171 0.237 0.875 1 4 1307 1339 1340 1308 0.171 0.237 0.875 1 4 1308 1340 1341 1309 0.171 0.237 0.875 1 4 1309 1341 1342 1310 0.171 0.237 0.875 1 4 1310 1342 1343 1311 0.171 0.237 0.875 1 4 1311 1343 1344 1312 0.171 0.237 0.875 1 4 1312 1344 1345 1313 0.171 0.237 0.875 1 4 1313 1345 1346 1314 0.171 0.237 0.875 1 4 1314 1346 1315 1283 0.171 0.237 0.875 1 4 1379 1347 1348 1380 0.171 0.237 0.875 1 4 1380 1348 1349 1381 0.171 0.237 0.875 1 4 1381 1349 1350 1382 0.171 0.237 0.875 1 4 1382 1350 1351 1383 0.171 0.237 0.875 1 4 1383 1351 1352 1384 0.171 0.237 0.875 1 4 1384 1352 1353 1385 0.171 0.237 0.875 1 4 1385 1353 1354 1386 0.171 0.237 0.875 1 4 1386 1354 1355 1387 0.171 0.237 0.875 1 4 1387 1355 1356 1388 0.171 0.237 0.875 1 4 1388 1356 1357 1389 0.171 0.237 0.875 1 4 1389 1357 1358 1390 0.171 0.237 0.875 1 4 1390 1358 1359 1391 0.171 0.237 0.875 1 4 1391 1359 1360 1392 0.171 0.237 0.875 1 4 1392 1360 1361 1393 0.171 0.237 0.875 1 4 1393 1361 1362 1394 0.171 0.237 0.875 1 4 1394 1362 1363 1395 0.171 0.237 0.875 1 4 1395 1363 1364 1396 0.171 0.237 0.875 1 4 1396 1364 1365 1397 0.171 0.237 0.875 1 4 1397 1365 1366 1398 0.171 0.237 0.875 1 4 1398 1366 1367 1399 0.171 0.237 0.875 1 4 1399 1367 1368 1400 0.171 0.237 0.875 1 4 1400 1368 1369 1401 0.171 0.237 0.875 1 4 1401 1369 1370 1402 0.171 0.237 0.875 1 4 1402 1370 1371 1403 0.171 0.237 0.875 1 4 1403 1371 1372 1404 0.171 0.237 0.875 1 4 1404 1372 1373 1405 0.171 0.237 0.875 1 4 1405 1373 1374 1406 0.171 0.237 0.875 1 4 1406 1374 1375 1407 0.171 0.237 0.875 1 4 1407 1375 1376 1408 0.171 0.237 0.875 1 4 1408 1376 1377 1409 0.171 0.237 0.875 1 4 1409 1377 1378 1410 0.171 0.237 0.875 1 4 1410 1378 1347 1379 0.171 0.237 0.875 1 4 1411 1379 1380 1412 0.171 0.237 0.875 1 4 1412 1380 1381 1413 0.171 0.237 0.875 1 4 1413 1381 1382 1414 0.171 0.237 0.875 1 4 1414 1382 1383 1415 0.171 0.237 0.875 1 4 1415 1383 1384 1416 0.171 0.237 0.875 1 4 1416 1384 1385 1417 0.171 0.237 0.875 1 4 1417 1385 1386 1418 0.171 0.237 0.875 1 4 1418 1386 1387 1419 0.171 0.237 0.875 1 4 1419 1387 1388 1420 0.171 0.237 0.875 1 4 1420 1388 1389 1421 0.171 0.237 0.875 1 4 1421 1389 1390 1422 0.171 0.237 0.875 1 4 1422 1390 1391 1423 0.171 0.237 0.875 1 4 1423 1391 1392 1424 0.171 0.237 0.875 1 4 1424 1392 1393 1425 0.171 0.237 0.875 1 4 1425 1393 1394 1426 0.171 0.237 0.875 1 4 1426 1394 1395 1427 0.171 0.237 0.875 1 4 1427 1395 1396 1428 0.171 0.237 0.875 1 4 1428 1396 1397 1429 0.171 0.237 0.875 1 4 1429 1397 1398 1430 0.171 0.237 0.875 1 4 1430 1398 1399 1431 0.171 0.237 0.875 1 4 1431 1399 1400 1432 0.171 0.237 0.875 1 4 1432 1400 1401 1433 0.171 0.237 0.875 1 4 1433 1401 1402 1434 0.171 0.237 0.875 1 4 1434 1402 1403 1435 0.171 0.237 0.875 1 4 1435 1403 1404 1436 0.171 0.237 0.875 1 4 1436 1404 1405 1437 0.171 0.237 0.875 1 4 1437 1405 1406 1438 0.171 0.237 0.875 1 4 1438 1406 1407 1439 0.171 0.237 0.875 1 4 1439 1407 1408 1440 0.171 0.237 0.875 1 4 1440 1408 1409 1441 0.171 0.237 0.875 1 4 1441 1409 1410 1442 0.171 0.237 0.875 1 4 1442 1410 1379 1411 0.171 0.237 0.875 1 32 1441 1442 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 0.171 0.237 0.875 1 4 1444 1445 1446 1447 0.763 0.143 0.145 1 4 1446 1448 1449 1447 0.763 0.143 0.145 1 4 1449 1450 1444 1447 0.763 0.143 0.145 1 4 1450 1449 1448 1451 0.763 0.143 0.145 1 4 1445 1444 1450 1451 0.763 0.143 0.145 1 4 1448 1446 1445 1451 0.763 0.143 0.145 1 4 1452 1453 1454 1455 0.763 0.143 0.145 1 4 1454 1456 1457 1455 0.763 0.143 0.145 1 4 1457 1458 1452 1455 0.763 0.143 0.145 1 4 1458 1457 1456 1459 0.763 0.143 0.145 1 4 1453 1452 1458 1459 0.763 0.143 0.145 1 4 1456 1454 1453 1459 0.763 0.143 0.145 1 4 1449 1448 1460 1461 0.763 0.143 0.145 1 4 1460 1462 1463 1461 0.763 0.143 0.145 1 4 1463 1455 1449 1461 0.763 0.143 0.145 1 4 1455 1463 1462 1454 0.763 0.143 0.145 1 4 1448 1449 1455 1454 0.763 0.143 0.145 1 4 1462 1460 1448 1454 0.763 0.143 0.145 1 4 1464 1465 1466 1467 0.7 0.7 0.7 1 4 1465 1468 1469 1466 0.7 0.7 0.7 1 4 1468 1470 1471 1469 0.7 0.7 0.7 1 4 1472 1473 1474 1475 0.163 0.143 0.745 1 4 1474 1476 1477 1475 0.163 0.143 0.745 1 4 1477 1478 1472 1475 0.163 0.143 0.745 1 4 1478 1477 1476 1479 0.163 0.143 0.745 1 4 1473 1472 1478 1479 0.163 0.143 0.745 1 4 1476 1474 1473 1479 0.163 0.143 0.745 1 4 1480 1481 1482 1483 0.163 0.143 0.745 1 4 1482 1484 1485 1483 0.163 0.143 0.745 1 4 1485 1486 1480 1483 0.163 0.143 0.745 1 4 1486 1485 1484 1487 0.163 0.143 0.745 1 4 1481 1480 1486 1487 0.163 0.143 0.745 1 4 1484 1482 1481 1487 0.163 0.143 0.745 1 4 1477 1476 1488 1489 0.163 0.143 0.745 1 4 1488 1490 1491 1489 0.163 0.143 0.745 1 4 1491 1483 1477 1489 0.163 0.143 0.745 1 4 1483 1491 1490 1482 0.163 0.143 0.745 1 4 1476 1477 1483 1482 0.163 0.143 0.745 1 4 1490 1488 1476 1482 0.163 0.143 0.745 1 4 1492 1493 1494 1495 0.7 0.7 0.7 1 4 1493 1496 1497 1494 0.7 0.7 0.7 1 4 1496 1498 1499 1497 0.7 0.7 0.7 1 4 1770 1771 1755 1754 0.3 0.2 0.2 1 4 1769 1770 1754 1753 0.3 0.2 0.2 1 4 1768 1769 1753 1752 0.3 0.2 0.2 1 4 1767 1768 1752 1751 0.3 0.2 0.2 1 4 1766 1767 1751 1750 0.3 0.2 0.2 1 4 1765 1766 1750 1749 0.3 0.2 0.2 1 4 1764 1780 1765 1749 0.3 0.2 0.2 1 4 1763 1779 1780 1764 0.3 0.2 0.2 1 4 1779 1763 1762 1778 0.3 0.2 0.2 1 4 1778 1762 1761 1777 0.3 0.2 0.2 1 4 1777 1761 1760 1776 0.3 0.2 0.2 1 4 1776 1760 1759 1775 0.3 0.2 0.2 1 4 1775 1759 1758 1774 0.3 0.2 0.2 1 4 1774 1758 1757 1773 0.3 0.2 0.2 1 4 1756 1755 1771 1772 0.3 0.2 0.2 1 4 1757 1756 1772 1773 0.3 0.2 0.2 1 16 1664 1665 1666 1667 1668 1685 1687 1689 1691 1693 1695 1697 1699 1661 1662 1663 0.3 0.2 0.2 1 3 1502 1500 1501 0.3 0.2 0.2 1 3 1504 1501 1500 0.3 0.2 0.2 1 3 1506 1502 1503 0.3 0.2 0.2 1 3 1508 1503 1502 0.3 0.2 0.2 1 3 1507 1505 1504 0.3 0.2 0.2 1 3 1500 1506 1507 0.3 0.2 0.2 1 3 1509 1507 1506 0.3 0.2 0.2 1 3 1503 1510 1509 0.3 0.2 0.2 1 3 1505 1509 1510 0.3 0.2 0.2 1 3 1500 1502 1506 0.3 0.2 0.2 1 3 1508 1502 1501 0.3 0.2 0.2 1 3 1507 1504 1500 0.3 0.2 0.2 1 3 1506 1503 1509 0.3 0.2 0.2 1 3 1510 1503 1508 0.3 0.2 0.2 1 3 1509 1505 1507 0.3 0.2 0.2 1 3 1513 1511 1512 0.3 0.2 0.2 1 3 1515 1512 1511 0.3 0.2 0.2 1 3 1517 1513 1514 0.3 0.2 0.2 1 3 1519 1514 1513 0.3 0.2 0.2 1 3 1518 1516 1515 0.3 0.2 0.2 1 3 1520 1515 1516 0.3 0.2 0.2 1 3 1511 1517 1518 0.3 0.2 0.2 1 3 1521 1518 1517 0.3 0.2 0.2 1 3 1512 1520 1519 0.3 0.2 0.2 1 3 1522 1519 1520 0.3 0.2 0.2 1 3 1514 1522 1521 0.3 0.2 0.2 1 3 1516 1521 1522 0.3 0.2 0.2 1 3 1511 1513 1517 0.3 0.2 0.2 1 3 1519 1513 1512 0.3 0.2 0.2 1 3 1518 1515 1511 0.3 0.2 0.2 1 3 1512 1515 1520 0.3 0.2 0.2 1 3 1517 1514 1521 0.3 0.2 0.2 1 3 1522 1514 1519 0.3 0.2 0.2 1 3 1521 1516 1518 0.3 0.2 0.2 1 3 1520 1516 1522 0.3 0.2 0.2 1 3 1525 1523 1524 0.3 0.2 0.2 1 3 1527 1525 1526 0.3 0.2 0.2 1 3 1528 1526 1525 0.3 0.2 0.2 1 3 1526 1530 1529 0.3 0.2 0.2 1 3 1523 1525 1527 0.3 0.2 0.2 1 3 1528 1525 1524 0.3 0.2 0.2 1 3 1527 1526 1529 0.3 0.2 0.2 1 3 1530 1526 1528 0.3 0.2 0.2 1 4 1543 1559 1560 1544 0.3 0.2 0.2 1 4 1544 1560 1561 1545 0.3 0.2 0.2 1 4 1545 1561 1562 1546 0.3 0.2 0.2 1 4 1546 1562 1563 1547 0.3 0.2 0.2 1 4 1547 1563 1564 1548 0.3 0.2 0.2 1 4 1548 1564 1565 1549 0.3 0.2 0.2 1 4 1549 1565 1566 1550 0.3 0.2 0.2 1 4 1550 1566 1567 1551 0.3 0.2 0.2 1 4 1551 1567 1568 1552 0.3 0.2 0.2 1 4 1552 1568 1569 1553 0.3 0.2 0.2 1 4 1553 1569 1570 1554 0.3 0.2 0.2 1 4 1554 1570 1571 1555 0.3 0.2 0.2 1 4 1555 1571 1572 1556 0.3 0.2 0.2 1 4 1556 1572 1573 1557 0.3 0.2 0.2 1 4 1557 1573 1574 1558 0.3 0.2 0.2 1 4 1558 1574 1559 1543 0.3 0.2 0.2 1 4 1559 1575 1576 1560 0.3 0.2 0.2 1 4 1560 1576 1577 1561 0.3 0.2 0.2 1 4 1561 1577 1578 1562 0.3 0.2 0.2 1 4 1562 1578 1579 1563 0.3 0.2 0.2 1 4 1563 1579 1580 1564 0.3 0.2 0.2 1 4 1564 1580 1581 1565 0.3 0.2 0.2 1 4 1565 1581 1582 1566 0.3 0.2 0.2 1 4 1566 1582 1583 1567 0.3 0.2 0.2 1 4 1567 1583 1584 1568 0.3 0.2 0.2 1 4 1568 1584 1585 1569 0.3 0.2 0.2 1 4 1569 1585 1586 1570 0.3 0.2 0.2 1 4 1570 1586 1587 1571 0.3 0.2 0.2 1 4 1571 1587 1588 1572 0.3 0.2 0.2 1 4 1572 1588 1589 1573 0.3 0.2 0.2 1 4 1573 1589 1590 1574 0.3 0.2 0.2 1 4 1574 1590 1575 1559 0.3 0.2 0.2 1 16 1575 1590 1589 1588 1587 1586 1585 1584 1583 1582 1581 1580 1579 1578 1577 1576 0.3 0.2 0.2 1 4 1591 1592 1594 1593 0.3 0.2 0.2 1 4 1593 1594 1596 1595 0.3 0.2 0.2 1 4 1595 1596 1598 1597 0.3 0.2 0.2 1 4 1597 1598 1600 1599 0.3 0.2 0.2 1 4 1599 1600 1602 1601 0.3 0.2 0.2 1 4 1601 1602 1604 1603 0.3 0.2 0.2 1 4 1603 1604 1606 1605 0.3 0.2 0.2 1 4 1605 1606 1608 1607 0.3 0.2 0.2 1 4 1607 1608 1610 1609 0.3 0.2 0.2 1 4 1609 1610 1612 1611 0.3 0.2 0.2 1 4 1611 1612 1614 1613 0.3 0.2 0.2 1 4 1613 1614 1616 1615 0.3 0.2 0.2 1 4 1615 1616 1618 1617 0.3 0.2 0.2 1 4 1617 1618 1620 1619 0.3 0.2 0.2 1 4 1619 1620 1622 1621 0.3 0.2 0.2 1 4 1621 1622 1592 1591 0.3 0.2 0.2 1 4 1623 1624 1626 1625 0.3 0.2 0.2 1 4 1625 1626 1628 1627 0.3 0.2 0.2 1 4 1627 1628 1630 1629 0.3 0.2 0.2 1 4 1629 1630 1631 1600 0.3 0.2 0.2 1 4 1600 1631 1633 1632 0.3 0.2 0.2 1 4 1632 1633 1635 1634 0.3 0.2 0.2 1 4 1634 1635 1637 1636 0.3 0.2 0.2 1 4 1636 1637 1639 1638 0.3 0.2 0.2 1 4 1638 1639 1641 1640 0.3 0.2 0.2 1 4 1640 1641 1643 1642 0.3 0.2 0.2 1 4 1642 1643 1645 1644 0.3 0.2 0.2 1 4 1644 1645 1646 1616 0.3 0.2 0.2 1 4 1616 1646 1648 1647 0.3 0.2 0.2 1 4 1647 1648 1650 1649 0.3 0.2 0.2 1 4 1649 1650 1652 1651 0.3 0.2 0.2 1 4 1651 1652 1624 1623 0.3 0.2 0.2 1 4 1653 1669 1670 1654 0.3 0.2 0.2 1 4 1654 1670 1671 1655 0.3 0.2 0.2 1 4 1655 1671 1672 1656 0.3 0.2 0.2 1 4 1656 1672 1673 1657 0.3 0.2 0.2 1 4 1657 1673 1674 1658 0.3 0.2 0.2 1 4 1658 1674 1675 1659 0.3 0.2 0.2 1 4 1659 1675 1676 1660 0.3 0.2 0.2 1 4 1660 1676 1677 1661 0.3 0.2 0.2 1 4 1661 1677 1678 1662 0.3 0.2 0.2 1 4 1662 1678 1679 1663 0.3 0.2 0.2 1 4 1663 1679 1680 1664 0.3 0.2 0.2 1 4 1664 1680 1681 1665 0.3 0.2 0.2 1 4 1665 1681 1682 1666 0.3 0.2 0.2 1 4 1666 1682 1683 1667 0.3 0.2 0.2 1 4 1667 1683 1684 1668 0.3 0.2 0.2 1 4 1668 1684 1669 1653 0.3 0.2 0.2 1 4 1669 1717 1718 1670 0.3 0.2 0.2 1 4 1670 1718 1719 1671 0.3 0.2 0.2 1 4 1671 1719 1720 1672 0.3 0.2 0.2 1 4 1672 1720 1721 1673 0.3 0.2 0.2 1 4 1673 1721 1722 1674 0.3 0.2 0.2 1 4 1674 1722 1723 1675 0.3 0.2 0.2 1 4 1675 1723 1724 1676 0.3 0.2 0.2 1 4 1676 1724 1725 1677 0.3 0.2 0.2 1 4 1677 1725 1726 1678 0.3 0.2 0.2 1 4 1678 1726 1727 1679 0.3 0.2 0.2 1 4 1679 1727 1728 1680 0.3 0.2 0.2 1 4 1680 1728 1729 1681 0.3 0.2 0.2 1 4 1681 1729 1730 1682 0.3 0.2 0.2 1 4 1682 1730 1731 1683 0.3 0.2 0.2 1 4 1683 1731 1732 1684 0.3 0.2 0.2 1 4 1684 1732 1717 1669 0.3 0.2 0.2 1 4 1717 1749 1750 1718 0.3 0.2 0.2 1 4 1718 1750 1751 1719 0.3 0.2 0.2 1 4 1719 1751 1752 1720 0.3 0.2 0.2 1 4 1720 1752 1753 1721 0.3 0.2 0.2 1 4 1721 1753 1754 1722 0.3 0.2 0.2 1 4 1722 1754 1755 1723 0.3 0.2 0.2 1 4 1723 1755 1756 1724 0.3 0.2 0.2 1 4 1724 1756 1757 1725 0.3 0.2 0.2 1 4 1725 1757 1758 1726 0.3 0.2 0.2 1 4 1726 1758 1759 1727 0.3 0.2 0.2 1 4 1727 1759 1760 1728 0.3 0.2 0.2 1 4 1728 1760 1761 1729 0.3 0.2 0.2 1 4 1729 1761 1762 1730 0.3 0.2 0.2 1 4 1730 1762 1763 1731 0.3 0.2 0.2 1 4 1731 1763 1764 1732 0.3 0.2 0.2 1 4 1732 1764 1749 1717 0.3 0.2 0.2 1 4 1686 1685 1687 1688 0.9 0.9 0.9 1 4 1688 1687 1689 1690 0.9 0.9 0.9 1 4 1690 1689 1691 1692 0.9 0.9 0.9 1 4 1692 1691 1693 1694 0.9 0.9 0.9 1 4 1694 1693 1695 1696 0.9 0.9 0.9 1 4 1696 1695 1697 1698 0.9 0.9 0.9 1 4 1698 1697 1699 1700 0.9 0.9 0.9 1 4 1700 1699 1701 1702 0.9 0.9 0.9 1 4 1702 1701 1703 1704 0.9 0.9 0.9 1 4 1704 1703 1705 1706 0.9 0.9 0.9 1 4 1706 1705 1707 1708 0.9 0.9 0.9 1 4 1708 1707 1709 1710 0.9 0.9 0.9 1 4 1710 1709 1711 1712 0.9 0.9 0.9 1 4 1712 1711 1713 1714 0.9 0.9 0.9 1 4 1714 1713 1715 1716 0.9 0.9 0.9 1 4 1716 1715 1685 1686 0.9 0.9 0.9 1 4 1733 1686 1688 1734 0.9 0.9 0.9 1 4 1734 1688 1690 1735 0.9 0.9 0.9 1 4 1735 1690 1692 1736 0.9 0.9 0.9 1 4 1736 1692 1694 1737 0.9 0.9 0.9 1 4 1737 1694 1696 1738 0.9 0.9 0.9 1 4 1738 1696 1698 1739 0.9 0.9 0.9 1 4 1739 1698 1700 1740 0.9 0.9 0.9 1 4 1740 1700 1702 1741 0.9 0.9 0.9 1 4 1741 1702 1704 1742 0.9 0.9 0.9 1 4 1742 1704 1706 1743 0.9 0.9 0.9 1 4 1743 1706 1708 1744 0.9 0.9 0.9 1 4 1744 1708 1710 1745 0.9 0.9 0.9 1 4 1745 1710 1712 1746 0.9 0.9 0.9 1 4 1746 1712 1714 1747 0.9 0.9 0.9 1 4 1747 1714 1716 1748 0.9 0.9 0.9 1 4 1748 1716 1686 1733 0.9 0.9 0.9 1 4 1765 1733 1734 1766 0.9 0.9 0.9 1 4 1766 1734 1735 1767 0.9 0.9 0.9 1 4 1767 1735 1736 1768 0.9 0.9 0.9 1 4 1768 1736 1737 1769 0.9 0.9 0.9 1 4 1769 1737 1738 1770 0.9 0.9 0.9 1 4 1770 1738 1739 1771 0.9 0.9 0.9 1 4 1771 1739 1740 1772 0.9 0.9 0.9 1 4 1772 1740 1741 1773 0.9 0.9 0.9 1 4 1773 1741 1742 1774 0.9 0.9 0.9 1 4 1774 1742 1743 1775 0.9 0.9 0.9 1 4 1775 1743 1744 1776 0.9 0.9 0.9 1 4 1776 1744 1745 1777 0.9 0.9 0.9 1 4 1777 1745 1746 1778 0.9 0.9 0.9 1 4 1778 1746 1747 1779 0.9 0.9 0.9 1 4 1779 1747 1748 1780 0.9 0.9 0.9 1 4 1780 1748 1733 1765 0.9 0.9 0.9 1 3 1533 1531 1532 0 0 0 1 3 1535 1532 1531 0 0 0 1 3 1537 1533 1534 0 0 0 1 3 1539 1534 1533 0 0 0 1 3 1538 1536 1535 0 0 0 1 3 1540 1535 1536 0 0 0 1 3 1531 1537 1538 0 0 0 1 3 1541 1538 1537 0 0 0 1 3 1532 1540 1539 0 0 0 1 3 1542 1539 1540 0 0 0 1 3 1534 1542 1541 0 0 0 1 3 1536 1541 1542 0 0 0 1 3 1531 1533 1537 0 0 0 1 3 1539 1533 1532 0 0 0 1 3 1538 1535 1531 0 0 0 1 3 1532 1535 1540 0 0 0 1 3 1537 1534 1541 0 0 0 1 3 1542 1534 1539 0 0 0 1 3 1541 1536 1538 0 0 0 1 3 1540 1536 1542 0 0 0 1 8 1795 1802 1803 1781 1782 1783 1784 1794 0.1 0.05 0.07 1 4 1783 1785 1786 1784 0.1 0.05 0.07 1 8 1787 1781 1803 1802 1795 1794 1784 1786 0.1 0.05 0.07 1 4 1787 1786 1785 1788 0.1 0.05 0.07 1 4 1782 1781 1787 1788 0.1 0.05 0.07 1 4 1785 1783 1782 1788 0.1 0.05 0.07 1 5 1792 1791 1827 1793 1794 0.586256 0.592891 0.592891 1 5 1794 1795 1824 1789 1792 0.586256 0.592891 0.592891 1 6 1795 1796 1823 1790 1789 1824 0.586256 0.592891 0.592891 1 6 1791 1790 1823 1796 1793 1827 0.586256 0.592891 0.592891 1 8 1801 1802 1821 1800 1799 1822 1842 1831 0.586256 0.592891 0.592891 1 5 1797 1800 1821 1802 1803 0.586256 0.592891 0.592891 1 5 1803 1804 1828 1798 1797 0.586256 0.592891 0.592891 1 8 1799 1798 1828 1804 1801 1831 1842 1822 0.586256 0.592891 0.592891 1 8 1809 1810 1830 1808 1807 1837 1843 1832 0.586256 0.592891 0.592891 1 6 1810 1811 1829 1805 1808 1830 0.586256 0.592891 0.592891 1 5 1806 1805 1829 1811 1812 0.586256 0.592891 0.592891 1 7 1812 1809 1832 1843 1837 1807 1806 0.586256 0.592891 0.592891 1 5 1817 1818 1826 1816 1815 0.586256 0.592891 0.592891 1 6 1818 1819 1825 1813 1816 1826 0.586256 0.592891 0.592891 1 5 1814 1813 1825 1819 1820 0.586256 0.592891 0.592891 1 4 1817 1815 1814 1820 0.586256 0.592891 0.592891 1 5 1821 1822 1839 1823 1824 0.58256 0.592891 0.592891 1 4 1823 1796 1795 1824 0.58256 0.592891 0.592891 1 4 1795 1802 1821 1824 0.58256 0.592891 0.592891 1 5 1795 1796 1836 1801 1802 0.58256 0.592891 0.592891 1 6 1802 1801 1831 1842 1822 1821 0.58256 0.592891 0.592891 1 8 1831 1801 1836 1796 1823 1839 1822 1842 0.58256 0.592891 0.592891 1 4 1823 1825 1826 1827 0.58256 0.592891 0.592891 1 4 1826 1818 1793 1827 0.58256 0.592891 0.592891 1 4 1793 1796 1823 1827 0.58256 0.592891 0.592891 1 4 1796 1793 1818 1819 0.58256 0.592891 0.592891 1 4 1825 1823 1796 1819 0.58256 0.592891 0.592891 1 4 1818 1826 1825 1819 0.58256 0.592891 0.592891 1 4 1828 1829 1830 1822 0.58256 0.592891 0.592891 1 6 1810 1801 1831 1842 1822 1830 0.58256 0.592891 0.592891 1 6 1822 1842 1831 1801 1804 1828 0.58256 0.592891 0.592891 1 4 1804 1801 1810 1811 0.58256 0.592891 0.592891 1 4 1829 1828 1804 1811 0.58256 0.592891 0.592891 1 4 1810 1830 1829 1811 0.58256 0.592891 0.592891 1 4 1831 1832 1833 1834 0.58256 0.592891 0.592891 1 4 1833 1835 1836 1834 0.58256 0.592891 0.592891 1 4 1836 1801 1831 1834 0.58256 0.592891 0.592891 1 5 1835 1809 1810 1801 1836 0.58256 0.592891 0.592891 1 5 1831 1801 1810 1809 1832 0.58256 0.592891 0.592891 1 4 1835 1833 1832 1809 0.58256 0.592891 0.592891 1 5 1839 1822 1830 1837 1838 0.58256 0.592891 0.592891 1 4 1838 1840 1841 1839 0.58256 0.592891 0.592891 1 4 1841 1842 1822 1839 0.58256 0.592891 0.592891 1 4 1842 1841 1840 1843 0.58256 0.592891 0.592891 1 5 1843 1837 1830 1822 1842 0.58256 0.592891 0.592891 1 4 1840 1838 1837 1843 0.58256 0.592891 0.592891 1 8 1853 1862 1861 1844 1845 1846 1847 1854 0.586256 0.592891 0.592891 1 4 1846 1848 1849 1847 0.586256 0.592891 0.592891 1 12 1859 1864 1867 1850 1844 1861 1862 1853 1854 1847 1849 1856 0.586256 0.592891 0.592891 1 8 1851 1850 1867 1864 1859 1856 1849 1848 0.586256 0.592891 0.592891 1 4 1845 1844 1850 1851 0.586256 0.592891 0.592891 1 4 1848 1846 1845 1851 0.586256 0.592891 0.592891 1 4 1852 1853 1854 1855 0.586256 0.592891 0.592891 1 4 1854 1856 1857 1855 0.586256 0.592891 0.592891 1 4 1857 1858 1852 1855 0.586256 0.592891 0.592891 1 4 1858 1857 1856 1859 0.586256 0.592891 0.592891 1 4 1853 1852 1858 1859 0.586256 0.592891 0.592891 1 4 1856 1854 1853 1859 0.586256 0.592891 0.592891 1 4 1860 1861 1862 1863 0.586256 0.592891 0.592891 1 4 1862 1864 1865 1863 0.586256 0.592891 0.592891 1 4 1865 1866 1860 1863 0.586256 0.592891 0.592891 1 4 1866 1865 1864 1867 0.586256 0.592891 0.592891 1 4 1861 1860 1866 1867 0.586256 0.592891 0.592891 1 4 1864 1862 1861 1867 0.586256 0.592891 0.592891 1 8 1877 1886 1885 1868 1869 1870 1871 1878 0.586256 0.592891 0.592891 1 4 1870 1872 1873 1871 0.586256 0.592891 0.592891 1 12 1883 1888 1891 1874 1868 1885 1886 1877 1878 1871 1873 1880 0.586256 0.592891 0.592891 1 8 1875 1874 1891 1888 1883 1880 1873 1872 0.586256 0.592891 0.592891 1 4 1869 1868 1874 1875 0.586256 0.592891 0.592891 1 4 1872 1870 1869 1875 0.586256 0.592891 0.592891 1 4 1876 1877 1878 1879 0.586256 0.592891 0.592891 1 4 1878 1880 1881 1879 0.586256 0.592891 0.592891 1 4 1881 1882 1876 1879 0.586256 0.592891 0.592891 1 4 1882 1881 1880 1883 0.586256 0.592891 0.592891 1 4 1877 1876 1882 1883 0.586256 0.592891 0.592891 1 4 1880 1878 1877 1883 0.586256 0.592891 0.592891 1 4 1884 1885 1886 1887 0.586256 0.592891 0.592891 1 4 1886 1888 1889 1887 0.586256 0.592891 0.592891 1 4 1889 1890 1884 1887 0.586256 0.592891 0.592891 1 4 1890 1889 1888 1891 0.586256 0.592891 0.592891 1 4 1885 1884 1890 1891 0.586256 0.592891 0.592891 1 4 1888 1886 1885 1891 0.586256 0.592891 0.592891 1 4 1892 1893 1894 1895 0.332589 0.204 0.071 1 4 1896 1897 1898 1894 0.332589 0.204 0.071 1 4 1899 1900 1901 1896 0.332589 0.204 0.071 1 4 1902 1903 1899 1893 0.332589 0.204 0.071 1 4 1900 1903 1904 1905 0.332589 0.204 0.071 1 4 1901 1900 1905 1906 0.332589 0.204 0.071 1 4 1897 1901 1906 1907 0.332589 0.204 0.071 1 4 1898 1897 1907 1908 0.332589 0.204 0.071 1 4 1895 1898 1908 1909 0.332589 0.204 0.071 1 4 1892 1895 1909 1910 0.332589 0.204 0.071 1 4 1902 1892 1910 1911 0.332589 0.204 0.071 1 4 1903 1902 1911 1904 0.332589 0.204 0.071 1 4 1893 1899 1912 1913 0.332589 0.204 0.071 1 4 1894 1893 1913 1914 0.332589 0.204 0.071 1 4 1896 1894 1914 1915 0.332589 0.204 0.071 1 4 1899 1896 1915 1912 0.332589 0.204 0.071 1 4 1916 1917 1918 1919 0.332589 0.204 0.071 1 4 1920 1921 1922 1923 0.332589 0.204 0.071 1 4 1923 1922 1924 1925 0.332589 0.204 0.071 1 4 1925 1924 1926 1927 0.332589 0.204 0.071 1 4 1927 1926 1921 1920 0.332589 0.204 0.071 1 4 1928 1929 1930 1931 0.332589 0.204 0.071 1 4 1931 1930 1932 1933 0.332589 0.204 0.071 1 4 1933 1932 1934 1935 0.332589 0.204 0.071 1 4 1935 1934 1929 1928 0.332589 0.204 0.071 1 4 1936 1937 1938 1939 0.332589 0.204 0.071 1 4 1939 1938 1940 1941 0.332589 0.204 0.071 1 4 1941 1940 1942 1943 0.332589 0.204 0.071 1 4 1943 1942 1937 1936 0.332589 0.204 0.071 1 4 1944 1919 1945 1946 0.332589 0.204 0.071 1 4 1946 1945 1947 1948 0.332589 0.204 0.071 1 4 1948 1947 1916 1949 0.332589 0.204 0.071 1 4 1949 1916 1919 1944 0.332589 0.204 0.071 1 4 1929 1924 1922 1930 0.332589 0.204 0.071 1 4 1937 1947 1945 1938 0.332589 0.204 0.071 1 4 1921 1950 1951 1932 0.332589 0.204 0.071 1 4 1932 1951 1952 1934 0.332589 0.204 0.071 1 4 1934 1952 1953 1926 0.332589 0.204 0.071 1 4 1926 1953 1950 1921 0.332589 0.204 0.071 1 4 1919 1918 1954 1940 0.332589 0.204 0.071 1 4 1940 1954 1955 1942 0.332589 0.204 0.071 1 4 1942 1955 1917 1916 0.332589 0.204 0.071 1 4 1916 1917 1918 1919 0.332589 0.204 0.071 1 4 1956 1957 1958 1959 0.3 0.2 0.1 1 4 1960 1961 1950 1953 0.332589 0.204 0.071 1 4 1962 1963 1964 1965 0.332589 0.204 0.071 1 4 1952 1951 1966 1967 0.332589 0.204 0.071 1 4 1955 1954 1968 1969 0.332589 0.204 0.071 1 4 1970 1971 1972 1973 0.332589 0.204 0.071 1 4 1974 1975 1918 1917 0.332589 0.204 0.071 1 4 1964 1976 1977 1965 0.332589 0.204 0.071 1 4 1965 1977 1978 1960 0.332589 0.204 0.071 1 4 1960 1978 1979 1961 0.332589 0.204 0.071 1 4 1961 1979 1976 1964 0.332589 0.204 0.071 1 4 1966 1980 1981 1967 0.332589 0.204 0.071 1 4 1967 1981 1982 1962 0.332589 0.204 0.071 1 4 1962 1982 1983 1963 0.332589 0.204 0.071 1 4 1963 1983 1980 1966 0.332589 0.204 0.071 1 4 1970 1984 1985 1971 0.332589 0.204 0.071 1 4 1971 1985 1986 1968 0.332589 0.204 0.071 1 4 1968 1986 1987 1969 0.332589 0.204 0.071 1 4 1969 1987 1984 1970 0.332589 0.204 0.071 1 4 1974 1988 1989 1975 0.332589 0.204 0.071 1 4 1975 1989 1990 1972 0.332589 0.204 0.071 1 4 1972 1990 1991 1973 0.332589 0.204 0.071 1 4 1973 1991 1988 1974 0.332589 0.204 0.071 1 4 1956 1959 1992 1993 0.3 0.2 0.1 1 4 1959 1958 1994 1992 0.3 0.2 0.1 1 4 1958 1957 1995 1994 0.3 0.2 0.1 1 4 1957 1956 1993 1995 0.3 0.2 0.1 1 4 1994 1995 1993 1992 0.332589 0.204 0.071 1 4 1996 1997 1998 1999 0.64499 0.711458 0.704812 1 4 1997 1996 1999 1998 0.64499 0.711458 0.704812 1 4 2000 2001 2002 2003 0.286061 0.22624 0.159772 1 4 2002 2004 2005 2003 0.286061 0.22624 0.159772 1 4 2005 2006 2000 2003 0.286061 0.22624 0.159772 1 4 2006 2005 2004 2007 0.286061 0.22624 0.159772 1 4 2001 2000 2006 2007 0.286061 0.22624 0.159772 1 4 2004 2002 2001 2007 0.286061 0.22624 0.159772 1 4 2008 2009 2010 2011 0.286061 0.22624 0.159772 1 4 2010 2012 2013 2011 0.286061 0.22624 0.159772 1 4 2013 2014 2008 2011 0.286061 0.22624 0.159772 1 4 2014 2013 2012 2015 0.286061 0.22624 0.159772 1 4 2009 2008 2014 2015 0.286061 0.22624 0.159772 1 4 2012 2010 2009 2015 0.286061 0.22624 0.159772 1 4 2016 2001 2010 2017 0.286061 0.22624 0.159772 1 4 2010 2012 2018 2017 0.286061 0.22624 0.159772 1 4 2018 2019 2016 2017 0.286061 0.22624 0.159772 1 4 2019 2018 2012 2007 0.286061 0.22624 0.159772 1 4 2001 2016 2019 2007 0.286061 0.22624 0.159772 1 4 2012 2010 2001 2007 0.286061 0.22624 0.159772 1 4 2000 2020 2021 2011 0.286061 0.22624 0.159772 1 4 2021 2022 2013 2011 0.286061 0.22624 0.159772 1 4 2013 2006 2000 2011 0.286061 0.22624 0.159772 1 4 2006 2013 2022 2023 0.286061 0.22624 0.159772 1 4 2020 2000 2006 2023 0.286061 0.22624 0.159772 1 4 2022 2021 2020 2023 0.286061 0.22624 0.159772 1 4 2028 2025 2024 2026 0.4 0.3 0.2 1 4 2029 2027 2024 2025 0.4 0.3 0.2 1 4 2030 2026 2024 2027 0.4 0.3 0.2 1 4 2031 2030 2027 2029 0.4 0.3 0.2 1 4 2031 2028 2026 2030 0.4 0.3 0.2 1 4 2031 2029 2025 2028 0.4 0.3 0.2 1 4 2036 2033 2032 2034 0.4 0.3 0.2 1 4 2037 2035 2032 2033 0.4 0.3 0.2 1 4 2038 2034 2032 2035 0.4 0.3 0.2 1 4 2039 2038 2035 2037 0.4 0.3 0.2 1 4 2039 2036 2034 2038 0.4 0.3 0.2 1 4 2039 2037 2033 2036 0.4 0.3 0.2 1 4 2045 2043 2040 2041 0.4 0.3 0.2 1 4 2046 2042 2040 2043 0.4 0.3 0.2 1 4 2047 2044 2042 2046 0.4 0.3 0.2 1 4 2061 2062 2048 2051 0.7 0.7 0.7 1 4 2048 2049 2050 2051 0.672512 0.652607 0.44692 1 4 2050 2052 2053 2051 0.672512 0.652607 0.44692 1 4 2058 2060 2061 2059 0.672512 0.652607 0.44692 1 4 2062 2061 2060 2063 0.672512 0.652607 0.44692 1 4 2053 2052 2064 2065 0.672512 0.652607 0.44692 1 4 2064 2066 2067 2065 0.672512 0.652607 0.44692 1 4 2067 2059 2053 2065 0.672512 0.652607 0.44692 1 4 2059 2067 2066 2058 0.672512 0.652607 0.44692 1 4 2066 2064 2052 2058 0.672512 0.652607 0.44692 1 4 2089 2090 2076 2079 0.7 0.7 0.7 1 4 2076 2077 2078 2079 0.360664 0.453555 0.659242 1 4 2078 2080 2081 2079 0.360664 0.453555 0.659242 1 4 2086 2088 2089 2087 0.360664 0.453555 0.659242 1 4 2090 2089 2088 2091 0.360664 0.453555 0.659242 1 4 2081 2080 2092 2093 0.360664 0.453555 0.659242 1 4 2092 2094 2095 2093 0.360664 0.453555 0.659242 1 4 2095 2087 2081 2093 0.360664 0.453555 0.659242 1 4 2087 2095 2094 2086 0.360664 0.453555 0.659242 1 4 2094 2092 2080 2086 0.360664 0.453555 0.659242 1 4 2117 2118 2104 2107 0.7 0.7 0.7 1 4 2104 2105 2106 2107 0.825119 0.838389 0.705687 1 4 2106 2108 2109 2107 0.825119 0.838389 0.705687 1 4 2114 2116 2117 2115 0.825119 0.838389 0.705687 1 4 2118 2117 2116 2119 0.825119 0.838389 0.705687 1 4 2109 2108 2120 2121 0.825119 0.838389 0.705687 1 4 2120 2122 2123 2121 0.825119 0.838389 0.705687 1 4 2123 2115 2109 2121 0.825119 0.838389 0.705687 1 4 2115 2123 2122 2114 0.825119 0.838389 0.705687 1 4 2122 2120 2108 2114 0.825119 0.838389 0.705687 1 4 2145 2146 2132 2135 0.7 0.7 0.7 1 4 2132 2133 2134 2135 0.672512 0.652607 0.44692 1 4 2134 2136 2137 2135 0.672512 0.652607 0.44692 1 4 2142 2144 2145 2143 0.672512 0.652607 0.44692 1 4 2146 2145 2144 2147 0.672512 0.652607 0.44692 1 4 2137 2136 2148 2149 0.672512 0.652607 0.44692 1 4 2148 2150 2151 2149 0.672512 0.652607 0.44692 1 4 2151 2143 2137 2149 0.672512 0.652607 0.44692 1 4 2143 2151 2150 2142 0.672512 0.652607 0.44692 1 4 2150 2148 2136 2142 0.672512 0.652607 0.44692 1 4 2173 2174 2160 2163 0.7 0.7 0.7 1 4 2160 2161 2162 2163 0.360664 0.453555 0.659242 1 4 2162 2164 2165 2163 0.360664 0.453555 0.659242 1 4 2170 2172 2173 2171 0.360664 0.453555 0.659242 1 4 2174 2173 2172 2175 0.360664 0.453555 0.659242 1 4 2165 2164 2176 2177 0.360664 0.453555 0.659242 1 4 2176 2178 2179 2177 0.360664 0.453555 0.659242 1 4 2179 2171 2165 2177 0.360664 0.453555 0.659242 1 4 2171 2179 2178 2170 0.360664 0.453555 0.659242 1 4 2178 2176 2164 2170 0.360664 0.453555 0.659242 1 4 2201 2202 2188 2191 0.7 0.7 0.7 1 4 2188 2189 2190 2191 0.407109 0.718958 0.48673 1 4 2190 2192 2193 2191 0.407109 0.718958 0.48673 1 4 2198 2200 2201 2199 0.407109 0.718958 0.48673 1 4 2202 2201 2200 2203 0.407109 0.718958 0.48673 1 4 2193 2192 2204 2205 0.407109 0.718958 0.48673 1 4 2204 2206 2207 2205 0.407109 0.718958 0.48673 1 4 2207 2199 2193 2205 0.407109 0.718958 0.48673 1 4 2199 2207 2206 2198 0.407109 0.718958 0.48673 1 4 2206 2204 2192 2198 0.407109 0.718958 0.48673 1 4 2229 2230 2216 2219 0.7 0.7 0.7 1 4 2216 2217 2218 2219 0.672512 0.652607 0.44692 1 4 2218 2220 2221 2219 0.672512 0.652607 0.44692 1 4 2226 2228 2229 2227 0.672512 0.652607 0.44692 1 4 2230 2229 2228 2231 0.672512 0.652607 0.44692 1 4 2221 2220 2232 2233 0.672512 0.652607 0.44692 1 4 2232 2234 2235 2233 0.672512 0.652607 0.44692 1 4 2235 2227 2221 2233 0.672512 0.652607 0.44692 1 4 2227 2235 2234 2226 0.672512 0.652607 0.44692 1 4 2234 2232 2220 2226 0.672512 0.652607 0.44692 1 4 2257 2258 2244 2247 0.7 0.7 0.7 1 4 2244 2245 2246 2247 0.407109 0.718958 0.48673 1 4 2246 2248 2249 2247 0.407109 0.718958 0.48673 1 4 2254 2256 2257 2255 0.407109 0.718958 0.48673 1 4 2258 2257 2256 2259 0.407109 0.718958 0.48673 1 4 2249 2248 2260 2261 0.407109 0.718958 0.48673 1 4 2260 2262 2263 2261 0.407109 0.718958 0.48673 1 4 2263 2255 2249 2261 0.407109 0.718958 0.48673 1 4 2255 2263 2262 2254 0.407109 0.718958 0.48673 1 4 2262 2260 2248 2254 0.407109 0.718958 0.48673 1 4 2285 2286 2272 2275 0.7 0.7 0.7 1 4 2272 2273 2274 2275 0.878199 0.586256 0.47346 1 4 2274 2276 2277 2275 0.878199 0.586256 0.47346 1 4 2282 2284 2285 2283 0.878199 0.586256 0.47346 1 4 2286 2285 2284 2287 0.878199 0.586256 0.47346 1 4 2277 2276 2288 2289 0.878199 0.586256 0.47346 1 4 2288 2290 2291 2289 0.878199 0.586256 0.47346 1 4 2291 2283 2277 2289 0.878199 0.586256 0.47346 1 4 2283 2291 2290 2282 0.878199 0.586256 0.47346 1 4 2290 2288 2276 2282 0.878199 0.586256 0.47346 1 4 2313 2314 2300 2303 0.7 0.7 0.7 1 4 2300 2301 2302 2303 0.672512 0.652607 0.44692 1 4 2302 2304 2305 2303 0.672512 0.652607 0.44692 1 4 2310 2312 2313 2311 0.672512 0.652607 0.44692 1 4 2314 2313 2312 2315 0.672512 0.652607 0.44692 1 4 2305 2304 2316 2317 0.672512 0.652607 0.44692 1 4 2316 2318 2319 2317 0.672512 0.652607 0.44692 1 4 2319 2311 2305 2317 0.672512 0.652607 0.44692 1 4 2311 2319 2318 2310 0.672512 0.652607 0.44692 1 4 2318 2316 2304 2310 0.672512 0.652607 0.44692 1 4 2341 2342 2328 2331 0.7 0.7 0.7 1 4 2328 2329 2330 2331 0.407109 0.718958 0.48673 1 4 2330 2332 2333 2331 0.407109 0.718958 0.48673 1 4 2338 2340 2341 2339 0.407109 0.718958 0.48673 1 4 2342 2341 2340 2343 0.407109 0.718958 0.48673 1 4 2333 2332 2344 2345 0.407109 0.718958 0.48673 1 4 2344 2346 2347 2345 0.407109 0.718958 0.48673 1 4 2347 2339 2333 2345 0.407109 0.718958 0.48673 1 4 2339 2347 2346 2338 0.407109 0.718958 0.48673 1 4 2346 2344 2332 2338 0.407109 0.718958 0.48673 1 4 2369 2370 2356 2359 0.7 0.7 0.7 1 4 2356 2357 2358 2359 0.360664 0.453555 0.659242 1 4 2358 2360 2361 2359 0.360664 0.453555 0.659242 1 4 2366 2368 2369 2367 0.360664 0.453555 0.659242 1 4 2370 2369 2368 2371 0.360664 0.453555 0.659242 1 4 2361 2360 2372 2373 0.360664 0.453555 0.659242 1 4 2372 2374 2375 2373 0.360664 0.453555 0.659242 1 4 2375 2367 2361 2373 0.360664 0.453555 0.659242 1 4 2367 2375 2374 2366 0.360664 0.453555 0.659242 1 4 2374 2372 2360 2366 0.360664 0.453555 0.659242 1 4 2397 2398 2384 2387 0.7 0.7 0.7 1 4 2384 2385 2386 2387 0.878199 0.586256 0.47346 1 4 2386 2388 2389 2387 0.878199 0.586256 0.47346 1 4 2394 2396 2397 2395 0.878199 0.586256 0.47346 1 4 2398 2397 2396 2399 0.878199 0.586256 0.47346 1 4 2389 2388 2400 2401 0.878199 0.586256 0.47346 1 4 2400 2402 2403 2401 0.878199 0.586256 0.47346 1 4 2403 2395 2389 2401 0.878199 0.586256 0.47346 1 4 2395 2403 2402 2394 0.878199 0.586256 0.47346 1 4 2402 2400 2388 2394 0.878199 0.586256 0.47346 1 4 2425 2426 2412 2415 0.7 0.7 0.7 1 4 2412 2413 2414 2415 0.360664 0.453555 0.659242 1 4 2414 2416 2417 2415 0.360664 0.453555 0.659242 1 4 2422 2424 2425 2423 0.360664 0.453555 0.659242 1 4 2426 2425 2424 2427 0.360664 0.453555 0.659242 1 4 2417 2416 2428 2429 0.360664 0.453555 0.659242 1 4 2428 2430 2431 2429 0.360664 0.453555 0.659242 1 4 2431 2423 2417 2429 0.360664 0.453555 0.659242 1 4 2423 2431 2430 2422 0.360664 0.453555 0.659242 1 4 2430 2428 2416 2422 0.360664 0.453555 0.659242 1 4 2445 2443 2440 2441 0.4 0.3 0.2 1 4 2446 2442 2440 2443 0.4 0.3 0.2 1 4 2447 2444 2442 2446 0.4 0.3 0.2 1 4 2461 2462 2448 2451 0.7 0.7 0.7 1 4 2448 2449 2450 2451 0.44692 0.261137 0.48673 1 4 2450 2452 2453 2451 0.44692 0.261137 0.48673 1 4 2458 2460 2461 2459 0.44692 0.261137 0.48673 1 4 2462 2461 2460 2463 0.44692 0.261137 0.48673 1 4 2453 2452 2464 2465 0.44692 0.261137 0.48673 1 4 2464 2466 2467 2465 0.44692 0.261137 0.48673 1 4 2467 2459 2453 2465 0.44692 0.261137 0.48673 1 4 2459 2467 2466 2458 0.44692 0.261137 0.48673 1 4 2466 2464 2452 2458 0.44692 0.261137 0.48673 1 4 2489 2490 2476 2479 0.7 0.7 0.7 1 4 2476 2477 2478 2479 0.825119 0.838389 0.705687 1 4 2478 2480 2481 2479 0.825119 0.838389 0.705687 1 4 2486 2488 2489 2487 0.825119 0.838389 0.705687 1 4 2490 2489 2488 2491 0.825119 0.838389 0.705687 1 4 2481 2480 2492 2493 0.825119 0.838389 0.705687 1 4 2492 2494 2495 2493 0.825119 0.838389 0.705687 1 4 2495 2487 2481 2493 0.825119 0.838389 0.705687 1 4 2487 2495 2494 2486 0.825119 0.838389 0.705687 1 4 2494 2492 2480 2486 0.825119 0.838389 0.705687 1 4 2517 2518 2504 2507 0.7 0.7 0.7 1 4 2504 2505 2506 2507 0.878199 0.586256 0.47346 1 4 2506 2508 2509 2507 0.878199 0.586256 0.47346 1 4 2514 2516 2517 2515 0.878199 0.586256 0.47346 1 4 2518 2517 2516 2519 0.878199 0.586256 0.47346 1 4 2509 2508 2520 2521 0.878199 0.586256 0.47346 1 4 2520 2522 2523 2521 0.878199 0.586256 0.47346 1 4 2523 2515 2509 2521 0.878199 0.586256 0.47346 1 4 2515 2523 2522 2514 0.878199 0.586256 0.47346 1 4 2522 2520 2508 2514 0.878199 0.586256 0.47346 1 4 2545 2546 2532 2535 0.7 0.7 0.7 1 4 2532 2533 2534 2535 0.878199 0.586256 0.47346 1 4 2534 2536 2537 2535 0.878199 0.586256 0.47346 1 4 2542 2544 2545 2543 0.878199 0.586256 0.47346 1 4 2546 2545 2544 2547 0.878199 0.586256 0.47346 1 4 2537 2536 2548 2549 0.878199 0.586256 0.47346 1 4 2548 2550 2551 2549 0.878199 0.586256 0.47346 1 4 2551 2543 2537 2549 0.878199 0.586256 0.47346 1 4 2543 2551 2550 2542 0.878199 0.586256 0.47346 1 4 2550 2548 2536 2542 0.878199 0.586256 0.47346 1 4 2573 2574 2560 2563 0.7 0.7 0.7 1 4 2560 2561 2562 2563 0.360664 0.453555 0.659242 1 4 2562 2564 2565 2563 0.360664 0.453555 0.659242 1 4 2570 2572 2573 2571 0.360664 0.453555 0.659242 1 4 2574 2573 2572 2575 0.360664 0.453555 0.659242 1 4 2565 2564 2576 2577 0.360664 0.453555 0.659242 1 4 2576 2578 2579 2577 0.360664 0.453555 0.659242 1 4 2579 2571 2565 2577 0.360664 0.453555 0.659242 1 4 2571 2579 2578 2570 0.360664 0.453555 0.659242 1 4 2578 2576 2564 2570 0.360664 0.453555 0.659242 1 4 2601 2602 2588 2591 0.7 0.7 0.7 1 4 2588 2589 2590 2591 0.44692 0.261137 0.48673 1 4 2590 2592 2593 2591 0.44692 0.261137 0.48673 1 4 2598 2600 2601 2599 0.44692 0.261137 0.48673 1 4 2602 2601 2600 2603 0.44692 0.261137 0.48673 1 4 2593 2592 2604 2605 0.44692 0.261137 0.48673 1 4 2604 2606 2607 2605 0.44692 0.261137 0.48673 1 4 2607 2599 2593 2605 0.44692 0.261137 0.48673 1 4 2599 2607 2606 2598 0.44692 0.261137 0.48673 1 4 2606 2604 2592 2598 0.44692 0.261137 0.48673 1 4 2629 2630 2616 2619 0.7 0.7 0.7 1 4 2616 2617 2618 2619 0.672512 0.652607 0.44692 1 4 2618 2620 2621 2619 0.672512 0.652607 0.44692 1 4 2626 2628 2629 2627 0.672512 0.652607 0.44692 1 4 2630 2629 2628 2631 0.672512 0.652607 0.44692 1 4 2621 2620 2632 2633 0.672512 0.652607 0.44692 1 4 2632 2634 2635 2633 0.672512 0.652607 0.44692 1 4 2635 2627 2621 2633 0.672512 0.652607 0.44692 1 4 2627 2635 2634 2626 0.672512 0.652607 0.44692 1 4 2634 2632 2620 2626 0.672512 0.652607 0.44692 1 4 2657 2658 2644 2647 0.7 0.7 0.7 1 4 2644 2645 2646 2647 0.672512 0.652607 0.44692 1 4 2646 2648 2649 2647 0.672512 0.652607 0.44692 1 4 2654 2656 2657 2655 0.672512 0.652607 0.44692 1 4 2658 2657 2656 2659 0.672512 0.652607 0.44692 1 4 2649 2648 2660 2661 0.672512 0.652607 0.44692 1 4 2660 2662 2663 2661 0.672512 0.652607 0.44692 1 4 2663 2655 2649 2661 0.672512 0.652607 0.44692 1 4 2655 2663 2662 2654 0.672512 0.652607 0.44692 1 4 2662 2660 2648 2654 0.672512 0.652607 0.44692 1 4 2685 2686 2672 2675 0.7 0.7 0.7 1 4 2672 2673 2674 2675 0.825119 0.838389 0.705687 1 4 2674 2676 2677 2675 0.825119 0.838389 0.705687 1 4 2682 2684 2685 2683 0.825119 0.838389 0.705687 1 4 2686 2685 2684 2687 0.825119 0.838389 0.705687 1 4 2677 2676 2688 2689 0.825119 0.838389 0.705687 1 4 2688 2690 2691 2689 0.825119 0.838389 0.705687 1 4 2691 2683 2677 2689 0.825119 0.838389 0.705687 1 4 2683 2691 2690 2682 0.825119 0.838389 0.705687 1 4 2690 2688 2676 2682 0.825119 0.838389 0.705687 1 4 2713 2714 2700 2703 0.7 0.7 0.7 1 4 2700 2701 2702 2703 0.44692 0.261137 0.48673 1 4 2702 2704 2705 2703 0.44692 0.261137 0.48673 1 4 2710 2712 2713 2711 0.44692 0.261137 0.48673 1 4 2714 2713 2712 2715 0.44692 0.261137 0.48673 1 4 2705 2704 2716 2717 0.44692 0.261137 0.48673 1 4 2716 2718 2719 2717 0.44692 0.261137 0.48673 1 4 2719 2711 2705 2717 0.44692 0.261137 0.48673 1 4 2711 2719 2718 2710 0.44692 0.261137 0.48673 1 4 2718 2716 2704 2710 0.44692 0.261137 0.48673 1 4 2733 2731 2728 2729 0.4 0.3 0.2 1 4 2734 2730 2728 2731 0.4 0.3 0.2 1 4 2735 2732 2730 2734 0.4 0.3 0.2 1 4 2749 2750 2736 2739 0.7 0.7 0.7 1 4 2736 2737 2738 2739 0.360664 0.453555 0.659242 1 4 2738 2740 2741 2739 0.360664 0.453555 0.659242 1 4 2746 2748 2749 2747 0.360664 0.453555 0.659242 1 4 2750 2749 2748 2751 0.360664 0.453555 0.659242 1 4 2741 2740 2752 2753 0.360664 0.453555 0.659242 1 4 2752 2754 2755 2753 0.360664 0.453555 0.659242 1 4 2755 2747 2741 2753 0.360664 0.453555 0.659242 1 4 2747 2755 2754 2746 0.360664 0.453555 0.659242 1 4 2754 2752 2740 2746 0.360664 0.453555 0.659242 1 4 2777 2778 2764 2767 0.7 0.7 0.7 1 4 2764 2765 2766 2767 0.825119 0.838389 0.705687 1 4 2766 2768 2769 2767 0.825119 0.838389 0.705687 1 4 2774 2776 2777 2775 0.825119 0.838389 0.705687 1 4 2778 2777 2776 2779 0.825119 0.838389 0.705687 1 4 2769 2768 2780 2781 0.825119 0.838389 0.705687 1 4 2780 2782 2783 2781 0.825119 0.838389 0.705687 1 4 2783 2775 2769 2781 0.825119 0.838389 0.705687 1 4 2775 2783 2782 2774 0.825119 0.838389 0.705687 1 4 2782 2780 2768 2774 0.825119 0.838389 0.705687 1 4 2805 2806 2792 2795 0.7 0.7 0.7 1 4 2792 2793 2794 2795 0.878199 0.586256 0.47346 1 4 2794 2796 2797 2795 0.878199 0.586256 0.47346 1 4 2802 2804 2805 2803 0.878199 0.586256 0.47346 1 4 2806 2805 2804 2807 0.878199 0.586256 0.47346 1 4 2797 2796 2808 2809 0.878199 0.586256 0.47346 1 4 2808 2810 2811 2809 0.878199 0.586256 0.47346 1 4 2811 2803 2797 2809 0.878199 0.586256 0.47346 1 4 2803 2811 2810 2802 0.878199 0.586256 0.47346 1 4 2810 2808 2796 2802 0.878199 0.586256 0.47346 1 4 2833 2834 2820 2823 0.7 0.7 0.7 1 4 2820 2821 2822 2823 0.672512 0.652607 0.44692 1 4 2822 2824 2825 2823 0.672512 0.652607 0.44692 1 4 2830 2832 2833 2831 0.672512 0.652607 0.44692 1 4 2834 2833 2832 2835 0.672512 0.652607 0.44692 1 4 2825 2824 2836 2837 0.672512 0.652607 0.44692 1 4 2836 2838 2839 2837 0.672512 0.652607 0.44692 1 4 2839 2831 2825 2837 0.672512 0.652607 0.44692 1 4 2831 2839 2838 2830 0.672512 0.652607 0.44692 1 4 2838 2836 2824 2830 0.672512 0.652607 0.44692 1 4 2861 2862 2848 2851 0.7 0.7 0.7 1 4 2848 2849 2850 2851 0.360664 0.453555 0.659242 1 4 2850 2852 2853 2851 0.360664 0.453555 0.659242 1 4 2858 2860 2861 2859 0.360664 0.453555 0.659242 1 4 2862 2861 2860 2863 0.360664 0.453555 0.659242 1 4 2853 2852 2864 2865 0.360664 0.453555 0.659242 1 4 2864 2866 2867 2865 0.360664 0.453555 0.659242 1 4 2867 2859 2853 2865 0.360664 0.453555 0.659242 1 4 2859 2867 2866 2858 0.360664 0.453555 0.659242 1 4 2866 2864 2852 2858 0.360664 0.453555 0.659242 1 4 2889 2890 2876 2879 0.7 0.7 0.7 1 4 2876 2877 2878 2879 0.360664 0.453555 0.659242 1 4 2878 2880 2881 2879 0.360664 0.453555 0.659242 1 4 2886 2888 2889 2887 0.360664 0.453555 0.659242 1 4 2890 2889 2888 2891 0.360664 0.453555 0.659242 1 4 2881 2880 2892 2893 0.360664 0.453555 0.659242 1 4 2892 2894 2895 2893 0.360664 0.453555 0.659242 1 4 2895 2887 2881 2893 0.360664 0.453555 0.659242 1 4 2887 2895 2894 2886 0.360664 0.453555 0.659242 1 4 2894 2892 2880 2886 0.360664 0.453555 0.659242 1 4 2917 2918 2904 2907 0.7 0.7 0.7 1 4 2904 2905 2906 2907 0.878199 0.586256 0.47346 1 4 2906 2908 2909 2907 0.878199 0.586256 0.47346 1 4 2914 2916 2917 2915 0.878199 0.586256 0.47346 1 4 2918 2917 2916 2919 0.878199 0.586256 0.47346 1 4 2909 2908 2920 2921 0.878199 0.586256 0.47346 1 4 2920 2922 2923 2921 0.878199 0.586256 0.47346 1 4 2923 2915 2909 2921 0.878199 0.586256 0.47346 1 4 2915 2923 2922 2914 0.878199 0.586256 0.47346 1 4 2922 2920 2908 2914 0.878199 0.586256 0.47346 1 4 2945 2946 2932 2935 0.7 0.7 0.7 1 4 2932 2933 2934 2935 0.825119 0.838389 0.705687 1 4 2934 2936 2937 2935 0.825119 0.838389 0.705687 1 4 2942 2944 2945 2943 0.825119 0.838389 0.705687 1 4 2946 2945 2944 2947 0.825119 0.838389 0.705687 1 4 2937 2936 2948 2949 0.825119 0.838389 0.705687 1 4 2948 2950 2951 2949 0.825119 0.838389 0.705687 1 4 2951 2943 2937 2949 0.825119 0.838389 0.705687 1 4 2943 2951 2950 2942 0.825119 0.838389 0.705687 1 4 2950 2948 2936 2942 0.825119 0.838389 0.705687 1 4 2973 2974 2960 2963 0.7 0.7 0.7 1 4 2960 2961 2962 2963 0.672512 0.652607 0.44692 1 4 2962 2964 2965 2963 0.672512 0.652607 0.44692 1 4 2970 2972 2973 2971 0.672512 0.652607 0.44692 1 4 2974 2973 2972 2975 0.672512 0.652607 0.44692 1 4 2965 2964 2976 2977 0.672512 0.652607 0.44692 1 4 2976 2978 2979 2977 0.672512 0.652607 0.44692 1 4 2979 2971 2965 2977 0.672512 0.652607 0.44692 1 4 2971 2979 2978 2970 0.672512 0.652607 0.44692 1 4 2978 2976 2964 2970 0.672512 0.652607 0.44692 1 4 3001 3002 2988 2991 0.7 0.7 0.7 1 4 2988 2989 2990 2991 0.360664 0.453555 0.659242 1 4 2990 2992 2993 2991 0.360664 0.453555 0.659242 1 4 2998 3000 3001 2999 0.360664 0.453555 0.659242 1 4 3002 3001 3000 3003 0.360664 0.453555 0.659242 1 4 2993 2992 3004 3005 0.360664 0.453555 0.659242 1 4 3004 3006 3007 3005 0.360664 0.453555 0.659242 1 4 3007 2999 2993 3005 0.360664 0.453555 0.659242 1 4 2999 3007 3006 2998 0.360664 0.453555 0.659242 1 4 3006 3004 2992 2998 0.360664 0.453555 0.659242 1 4 3029 3030 3016 3019 0.7 0.7 0.7 1 4 3016 3017 3018 3019 0.672512 0.652607 0.44692 1 4 3018 3020 3021 3019 0.672512 0.652607 0.44692 1 4 3026 3028 3029 3027 0.672512 0.652607 0.44692 1 4 3030 3029 3028 3031 0.672512 0.652607 0.44692 1 4 3021 3020 3032 3033 0.672512 0.652607 0.44692 1 4 3032 3034 3035 3033 0.672512 0.652607 0.44692 1 4 3035 3027 3021 3033 0.672512 0.652607 0.44692 1 4 3027 3035 3034 3026 0.672512 0.652607 0.44692 1 4 3034 3032 3020 3026 0.672512 0.652607 0.44692 1 4 3057 3058 3044 3047 0.7 0.7 0.7 1 4 3044 3045 3046 3047 0.825119 0.838389 0.705687 1 4 3046 3048 3049 3047 0.825119 0.838389 0.705687 1 4 3054 3056 3057 3055 0.825119 0.838389 0.705687 1 4 3058 3057 3056 3059 0.825119 0.838389 0.705687 1 4 3049 3048 3060 3061 0.825119 0.838389 0.705687 1 4 3060 3062 3063 3061 0.825119 0.838389 0.705687 1 4 3063 3055 3049 3061 0.825119 0.838389 0.705687 1 4 3055 3063 3062 3054 0.825119 0.838389 0.705687 1 4 3062 3060 3048 3054 0.825119 0.838389 0.705687 1 4 3085 3086 3072 3075 0.7 0.7 0.7 1 4 3072 3073 3074 3075 0.878199 0.586256 0.47346 1 4 3074 3076 3077 3075 0.878199 0.586256 0.47346 1 4 3082 3084 3085 3083 0.878199 0.586256 0.47346 1 4 3086 3085 3084 3087 0.878199 0.586256 0.47346 1 4 3077 3076 3088 3089 0.878199 0.586256 0.47346 1 4 3088 3090 3091 3089 0.878199 0.586256 0.47346 1 4 3091 3083 3077 3089 0.878199 0.586256 0.47346 1 4 3083 3091 3090 3082 0.878199 0.586256 0.47346 1 4 3090 3088 3076 3082 0.878199 0.586256 0.47346 1 4 3105 3103 3100 3101 0.4 0.3 0.2 1 4 3106 3102 3100 3103 0.4 0.3 0.2 1 4 3107 3104 3102 3106 0.4 0.3 0.2 1 4 3121 3122 3108 3111 0.7 0.7 0.7 1 4 3108 3109 3110 3111 0.825119 0.838389 0.705687 1 4 3110 3112 3113 3111 0.825119 0.838389 0.705687 1 4 3118 3120 3121 3119 0.825119 0.838389 0.705687 1 4 3122 3121 3120 3123 0.825119 0.838389 0.705687 1 4 3113 3112 3124 3125 0.825119 0.838389 0.705687 1 4 3124 3126 3127 3125 0.825119 0.838389 0.705687 1 4 3127 3119 3113 3125 0.825119 0.838389 0.705687 1 4 3119 3127 3126 3118 0.825119 0.838389 0.705687 1 4 3126 3124 3112 3118 0.825119 0.838389 0.705687 1 4 3149 3150 3136 3139 0.7 0.7 0.7 1 4 3136 3137 3138 3139 0.825119 0.838389 0.705687 1 4 3138 3140 3141 3139 0.825119 0.838389 0.705687 1 4 3146 3148 3149 3147 0.825119 0.838389 0.705687 1 4 3150 3149 3148 3151 0.825119 0.838389 0.705687 1 4 3141 3140 3152 3153 0.825119 0.838389 0.705687 1 4 3152 3154 3155 3153 0.825119 0.838389 0.705687 1 4 3155 3147 3141 3153 0.825119 0.838389 0.705687 1 4 3147 3155 3154 3146 0.825119 0.838389 0.705687 1 4 3154 3152 3140 3146 0.825119 0.838389 0.705687 1 4 3177 3178 3164 3167 0.7 0.7 0.7 1 4 3164 3165 3166 3167 0.672512 0.652607 0.44692 1 4 3166 3168 3169 3167 0.672512 0.652607 0.44692 1 4 3174 3176 3177 3175 0.672512 0.652607 0.44692 1 4 3178 3177 3176 3179 0.672512 0.652607 0.44692 1 4 3169 3168 3180 3181 0.672512 0.652607 0.44692 1 4 3180 3182 3183 3181 0.672512 0.652607 0.44692 1 4 3183 3175 3169 3181 0.672512 0.652607 0.44692 1 4 3175 3183 3182 3174 0.672512 0.652607 0.44692 1 4 3182 3180 3168 3174 0.672512 0.652607 0.44692 1 4 3205 3206 3192 3195 0.7 0.7 0.7 1 4 3192 3193 3194 3195 0.44692 0.261137 0.48673 1 4 3194 3196 3197 3195 0.44692 0.261137 0.48673 1 4 3202 3204 3205 3203 0.44692 0.261137 0.48673 1 4 3206 3205 3204 3207 0.44692 0.261137 0.48673 1 4 3197 3196 3208 3209 0.44692 0.261137 0.48673 1 4 3208 3210 3211 3209 0.44692 0.261137 0.48673 1 4 3211 3203 3197 3209 0.44692 0.261137 0.48673 1 4 3203 3211 3210 3202 0.44692 0.261137 0.48673 1 4 3210 3208 3196 3202 0.44692 0.261137 0.48673 1 4 3233 3234 3220 3223 0.7 0.7 0.7 1 4 3220 3221 3222 3223 0.672512 0.652607 0.44692 1 4 3222 3224 3225 3223 0.672512 0.652607 0.44692 1 4 3230 3232 3233 3231 0.672512 0.652607 0.44692 1 4 3234 3233 3232 3235 0.672512 0.652607 0.44692 1 4 3225 3224 3236 3237 0.672512 0.652607 0.44692 1 4 3236 3238 3239 3237 0.672512 0.652607 0.44692 1 4 3239 3231 3225 3237 0.672512 0.652607 0.44692 1 4 3231 3239 3238 3230 0.672512 0.652607 0.44692 1 4 3238 3236 3224 3230 0.672512 0.652607 0.44692 1 4 3261 3262 3248 3251 0.7 0.7 0.7 1 4 3248 3249 3250 3251 0.360664 0.453555 0.659242 1 4 3250 3252 3253 3251 0.360664 0.453555 0.659242 1 4 3258 3260 3261 3259 0.360664 0.453555 0.659242 1 4 3262 3261 3260 3263 0.360664 0.453555 0.659242 1 4 3253 3252 3264 3265 0.360664 0.453555 0.659242 1 4 3264 3266 3267 3265 0.360664 0.453555 0.659242 1 4 3267 3259 3253 3265 0.360664 0.453555 0.659242 1 4 3259 3267 3266 3258 0.360664 0.453555 0.659242 1 4 3266 3264 3252 3258 0.360664 0.453555 0.659242 1 4 3289 3290 3276 3279 0.7 0.7 0.7 1 4 3276 3277 3278 3279 0.360664 0.453555 0.659242 1 4 3278 3280 3281 3279 0.360664 0.453555 0.659242 1 4 3286 3288 3289 3287 0.360664 0.453555 0.659242 1 4 3290 3289 3288 3291 0.360664 0.453555 0.659242 1 4 3281 3280 3292 3293 0.360664 0.453555 0.659242 1 4 3292 3294 3295 3293 0.360664 0.453555 0.659242 1 4 3295 3287 3281 3293 0.360664 0.453555 0.659242 1 4 3287 3295 3294 3286 0.360664 0.453555 0.659242 1 4 3294 3292 3280 3286 0.360664 0.453555 0.659242 1 4 3317 3318 3304 3307 0.7 0.7 0.7 1 4 3304 3305 3306 3307 0.407109 0.718958 0.48673 1 4 3306 3308 3309 3307 0.407109 0.718958 0.48673 1 4 3314 3316 3317 3315 0.407109 0.718958 0.48673 1 4 3318 3317 3316 3319 0.407109 0.718958 0.48673 1 4 3309 3308 3320 3321 0.407109 0.718958 0.48673 1 4 3320 3322 3323 3321 0.407109 0.718958 0.48673 1 4 3323 3315 3309 3321 0.407109 0.718958 0.48673 1 4 3315 3323 3322 3314 0.407109 0.718958 0.48673 1 4 3322 3320 3308 3314 0.407109 0.718958 0.48673 1 4 3345 3346 3332 3335 0.7 0.7 0.7 1 4 3332 3333 3334 3335 0.878199 0.586256 0.47346 1 4 3334 3336 3337 3335 0.878199 0.586256 0.47346 1 4 3342 3344 3345 3343 0.878199 0.586256 0.47346 1 4 3346 3345 3344 3347 0.878199 0.586256 0.47346 1 4 3337 3336 3348 3349 0.878199 0.586256 0.47346 1 4 3348 3350 3351 3349 0.878199 0.586256 0.47346 1 4 3351 3343 3337 3349 0.878199 0.586256 0.47346 1 4 3343 3351 3350 3342 0.878199 0.586256 0.47346 1 4 3350 3348 3336 3342 0.878199 0.586256 0.47346 1 4 3373 3374 3360 3363 0.7 0.7 0.7 1 4 3360 3361 3362 3363 0.672512 0.652607 0.44692 1 4 3362 3364 3365 3363 0.672512 0.652607 0.44692 1 4 3370 3372 3373 3371 0.672512 0.652607 0.44692 1 4 3374 3373 3372 3375 0.672512 0.652607 0.44692 1 4 3365 3364 3376 3377 0.672512 0.652607 0.44692 1 4 3376 3378 3379 3377 0.672512 0.652607 0.44692 1 4 3379 3371 3365 3377 0.672512 0.652607 0.44692 1 4 3371 3379 3378 3370 0.672512 0.652607 0.44692 1 4 3378 3376 3364 3370 0.672512 0.652607 0.44692 1 4 3401 3402 3388 3391 0.7 0.7 0.7 1 4 3388 3389 3390 3391 0.825119 0.838389 0.705687 1 4 3390 3392 3393 3391 0.825119 0.838389 0.705687 1 4 3398 3400 3401 3399 0.825119 0.838389 0.705687 1 4 3402 3401 3400 3403 0.825119 0.838389 0.705687 1 4 3393 3392 3404 3405 0.825119 0.838389 0.705687 1 4 3404 3406 3407 3405 0.825119 0.838389 0.705687 1 4 3407 3399 3393 3405 0.825119 0.838389 0.705687 1 4 3399 3407 3406 3398 0.825119 0.838389 0.705687 1 4 3406 3404 3392 3398 0.825119 0.838389 0.705687 1 4 3421 3419 3416 3417 0.4 0.3 0.2 1 4 3422 3418 3416 3419 0.4 0.3 0.2 1 4 3423 3420 3418 3422 0.4 0.3 0.2 1 4 3437 3438 3424 3427 0.7 0.7 0.7 1 4 3424 3425 3426 3427 0.878199 0.586256 0.47346 1 4 3426 3428 3429 3427 0.878199 0.586256 0.47346 1 4 3434 3436 3437 3435 0.878199 0.586256 0.47346 1 4 3438 3437 3436 3439 0.878199 0.586256 0.47346 1 4 3429 3428 3440 3441 0.878199 0.586256 0.47346 1 4 3440 3442 3443 3441 0.878199 0.586256 0.47346 1 4 3443 3435 3429 3441 0.878199 0.586256 0.47346 1 4 3435 3443 3442 3434 0.878199 0.586256 0.47346 1 4 3442 3440 3428 3434 0.878199 0.586256 0.47346 1 4 3465 3466 3452 3455 0.7 0.7 0.7 1 4 3452 3453 3454 3455 0.878199 0.586256 0.47346 1 4 3454 3456 3457 3455 0.878199 0.586256 0.47346 1 4 3462 3464 3465 3463 0.878199 0.586256 0.47346 1 4 3466 3465 3464 3467 0.878199 0.586256 0.47346 1 4 3457 3456 3468 3469 0.878199 0.586256 0.47346 1 4 3468 3470 3471 3469 0.878199 0.586256 0.47346 1 4 3471 3463 3457 3469 0.878199 0.586256 0.47346 1 4 3463 3471 3470 3462 0.878199 0.586256 0.47346 1 4 3470 3468 3456 3462 0.878199 0.586256 0.47346 1 4 3493 3494 3480 3483 0.7 0.7 0.7 1 4 3480 3481 3482 3483 0.407109 0.718958 0.48673 1 4 3482 3484 3485 3483 0.407109 0.718958 0.48673 1 4 3490 3492 3493 3491 0.407109 0.718958 0.48673 1 4 3494 3493 3492 3495 0.407109 0.718958 0.48673 1 4 3485 3484 3496 3497 0.407109 0.718958 0.48673 1 4 3496 3498 3499 3497 0.407109 0.718958 0.48673 1 4 3499 3491 3485 3497 0.407109 0.718958 0.48673 1 4 3491 3499 3498 3490 0.407109 0.718958 0.48673 1 4 3498 3496 3484 3490 0.407109 0.718958 0.48673 1 4 3521 3522 3508 3511 0.7 0.7 0.7 1 4 3508 3509 3510 3511 0.878199 0.586256 0.47346 1 4 3510 3512 3513 3511 0.878199 0.586256 0.47346 1 4 3518 3520 3521 3519 0.878199 0.586256 0.47346 1 4 3522 3521 3520 3523 0.878199 0.586256 0.47346 1 4 3513 3512 3524 3525 0.878199 0.586256 0.47346 1 4 3524 3526 3527 3525 0.878199 0.586256 0.47346 1 4 3527 3519 3513 3525 0.878199 0.586256 0.47346 1 4 3519 3527 3526 3518 0.878199 0.586256 0.47346 1 4 3526 3524 3512 3518 0.878199 0.586256 0.47346 1 4 3549 3550 3536 3539 0.7 0.7 0.7 1 4 3536 3537 3538 3539 0.825119 0.838389 0.705687 1 4 3538 3540 3541 3539 0.825119 0.838389 0.705687 1 4 3546 3548 3549 3547 0.825119 0.838389 0.705687 1 4 3550 3549 3548 3551 0.825119 0.838389 0.705687 1 4 3541 3540 3552 3553 0.825119 0.838389 0.705687 1 4 3552 3554 3555 3553 0.825119 0.838389 0.705687 1 4 3555 3547 3541 3553 0.825119 0.838389 0.705687 1 4 3547 3555 3554 3546 0.825119 0.838389 0.705687 1 4 3554 3552 3540 3546 0.825119 0.838389 0.705687 1 4 3577 3578 3564 3567 0.7 0.7 0.7 1 4 3564 3565 3566 3567 0.360664 0.453555 0.659242 1 4 3566 3568 3569 3567 0.360664 0.453555 0.659242 1 4 3574 3576 3577 3575 0.360664 0.453555 0.659242 1 4 3578 3577 3576 3579 0.360664 0.453555 0.659242 1 4 3569 3568 3580 3581 0.360664 0.453555 0.659242 1 4 3580 3582 3583 3581 0.360664 0.453555 0.659242 1 4 3583 3575 3569 3581 0.360664 0.453555 0.659242 1 4 3575 3583 3582 3574 0.360664 0.453555 0.659242 1 4 3582 3580 3568 3574 0.360664 0.453555 0.659242 1 4 3605 3606 3592 3595 0.7 0.7 0.7 1 4 3592 3593 3594 3595 0.825119 0.838389 0.705687 1 4 3594 3596 3597 3595 0.825119 0.838389 0.705687 1 4 3602 3604 3605 3603 0.825119 0.838389 0.705687 1 4 3606 3605 3604 3607 0.825119 0.838389 0.705687 1 4 3597 3596 3608 3609 0.825119 0.838389 0.705687 1 4 3608 3610 3611 3609 0.825119 0.838389 0.705687 1 4 3611 3603 3597 3609 0.825119 0.838389 0.705687 1 4 3603 3611 3610 3602 0.825119 0.838389 0.705687 1 4 3610 3608 3596 3602 0.825119 0.838389 0.705687 1 4 3633 3634 3620 3623 0.7 0.7 0.7 1 4 3620 3621 3622 3623 0.407109 0.718958 0.48673 1 4 3622 3624 3625 3623 0.407109 0.718958 0.48673 1 4 3630 3632 3633 3631 0.407109 0.718958 0.48673 1 4 3634 3633 3632 3635 0.407109 0.718958 0.48673 1 4 3625 3624 3636 3637 0.407109 0.718958 0.48673 1 4 3636 3638 3639 3637 0.407109 0.718958 0.48673 1 4 3639 3631 3625 3637 0.407109 0.718958 0.48673 1 4 3631 3639 3638 3630 0.407109 0.718958 0.48673 1 4 3638 3636 3624 3630 0.407109 0.718958 0.48673 1 4 3661 3662 3648 3651 0.7 0.7 0.7 1 4 3648 3649 3650 3651 0.672512 0.652607 0.44692 1 4 3650 3652 3653 3651 0.672512 0.652607 0.44692 1 4 3658 3660 3661 3659 0.672512 0.652607 0.44692 1 4 3662 3661 3660 3663 0.672512 0.652607 0.44692 1 4 3653 3652 3664 3665 0.672512 0.652607 0.44692 1 4 3664 3666 3667 3665 0.672512 0.652607 0.44692 1 4 3667 3659 3653 3665 0.672512 0.652607 0.44692 1 4 3659 3667 3666 3658 0.672512 0.652607 0.44692 1 4 3666 3664 3652 3658 0.672512 0.652607 0.44692 1 4 3689 3690 3676 3679 0.7 0.7 0.7 1 4 3676 3677 3678 3679 0.360664 0.453555 0.659242 1 4 3678 3680 3681 3679 0.360664 0.453555 0.659242 1 4 3686 3688 3689 3687 0.360664 0.453555 0.659242 1 4 3690 3689 3688 3691 0.360664 0.453555 0.659242 1 4 3681 3680 3692 3693 0.360664 0.453555 0.659242 1 4 3692 3694 3695 3693 0.360664 0.453555 0.659242 1 4 3695 3687 3681 3693 0.360664 0.453555 0.659242 1 4 3687 3695 3694 3686 0.360664 0.453555 0.659242 1 4 3694 3692 3680 3686 0.360664 0.453555 0.659242 1 4 3709 3707 3704 3705 0.4 0.3 0.2 1 4 3710 3706 3704 3707 0.4 0.3 0.2 1 4 3711 3708 3706 3710 0.4 0.3 0.2 1 4 3725 3726 3712 3715 0.7 0.7 0.7 1 4 3712 3713 3714 3715 0.44692 0.261137 0.48673 1 4 3714 3716 3717 3715 0.44692 0.261137 0.48673 1 4 3722 3724 3725 3723 0.44692 0.261137 0.48673 1 4 3726 3725 3724 3727 0.44692 0.261137 0.48673 1 4 3717 3716 3728 3729 0.44692 0.261137 0.48673 1 4 3728 3730 3731 3729 0.44692 0.261137 0.48673 1 4 3731 3723 3717 3729 0.44692 0.261137 0.48673 1 4 3723 3731 3730 3722 0.44692 0.261137 0.48673 1 4 3730 3728 3716 3722 0.44692 0.261137 0.48673 1 4 3753 3754 3740 3743 0.7 0.7 0.7 1 4 3740 3741 3742 3743 0.672512 0.652607 0.44692 1 4 3742 3744 3745 3743 0.672512 0.652607 0.44692 1 4 3750 3752 3753 3751 0.672512 0.652607 0.44692 1 4 3754 3753 3752 3755 0.672512 0.652607 0.44692 1 4 3745 3744 3756 3757 0.672512 0.652607 0.44692 1 4 3756 3758 3759 3757 0.672512 0.652607 0.44692 1 4 3759 3751 3745 3757 0.672512 0.652607 0.44692 1 4 3751 3759 3758 3750 0.672512 0.652607 0.44692 1 4 3758 3756 3744 3750 0.672512 0.652607 0.44692 1 4 3781 3782 3768 3771 0.7 0.7 0.7 1 4 3768 3769 3770 3771 0.878199 0.586256 0.47346 1 4 3770 3772 3773 3771 0.878199 0.586256 0.47346 1 4 3778 3780 3781 3779 0.878199 0.586256 0.47346 1 4 3782 3781 3780 3783 0.878199 0.586256 0.47346 1 4 3773 3772 3784 3785 0.878199 0.586256 0.47346 1 4 3784 3786 3787 3785 0.878199 0.586256 0.47346 1 4 3787 3779 3773 3785 0.878199 0.586256 0.47346 1 4 3779 3787 3786 3778 0.878199 0.586256 0.47346 1 4 3786 3784 3772 3778 0.878199 0.586256 0.47346 1 4 3809 3810 3796 3799 0.7 0.7 0.7 1 4 3796 3797 3798 3799 0.407109 0.718958 0.48673 1 4 3798 3800 3801 3799 0.407109 0.718958 0.48673 1 4 3806 3808 3809 3807 0.407109 0.718958 0.48673 1 4 3810 3809 3808 3811 0.407109 0.718958 0.48673 1 4 3801 3800 3812 3813 0.407109 0.718958 0.48673 1 4 3812 3814 3815 3813 0.407109 0.718958 0.48673 1 4 3815 3807 3801 3813 0.407109 0.718958 0.48673 1 4 3807 3815 3814 3806 0.407109 0.718958 0.48673 1 4 3814 3812 3800 3806 0.407109 0.718958 0.48673 1 4 3837 3838 3824 3827 0.7 0.7 0.7 1 4 3824 3825 3826 3827 0.407109 0.718958 0.48673 1 4 3826 3828 3829 3827 0.407109 0.718958 0.48673 1 4 3834 3836 3837 3835 0.407109 0.718958 0.48673 1 4 3838 3837 3836 3839 0.407109 0.718958 0.48673 1 4 3829 3828 3840 3841 0.407109 0.718958 0.48673 1 4 3840 3842 3843 3841 0.407109 0.718958 0.48673 1 4 3843 3835 3829 3841 0.407109 0.718958 0.48673 1 4 3835 3843 3842 3834 0.407109 0.718958 0.48673 1 4 3842 3840 3828 3834 0.407109 0.718958 0.48673 1 4 3865 3866 3852 3855 0.7 0.7 0.7 1 4 3852 3853 3854 3855 0.44692 0.261137 0.48673 1 4 3854 3856 3857 3855 0.44692 0.261137 0.48673 1 4 3862 3864 3865 3863 0.44692 0.261137 0.48673 1 4 3866 3865 3864 3867 0.44692 0.261137 0.48673 1 4 3857 3856 3868 3869 0.44692 0.261137 0.48673 1 4 3868 3870 3871 3869 0.44692 0.261137 0.48673 1 4 3871 3863 3857 3869 0.44692 0.261137 0.48673 1 4 3863 3871 3870 3862 0.44692 0.261137 0.48673 1 4 3870 3868 3856 3862 0.44692 0.261137 0.48673 1 4 3893 3894 3880 3883 0.7 0.7 0.7 1 4 3880 3881 3882 3883 0.407109 0.718958 0.48673 1 4 3882 3884 3885 3883 0.407109 0.718958 0.48673 1 4 3890 3892 3893 3891 0.407109 0.718958 0.48673 1 4 3894 3893 3892 3895 0.407109 0.718958 0.48673 1 4 3885 3884 3896 3897 0.407109 0.718958 0.48673 1 4 3896 3898 3899 3897 0.407109 0.718958 0.48673 1 4 3899 3891 3885 3897 0.407109 0.718958 0.48673 1 4 3891 3899 3898 3890 0.407109 0.718958 0.48673 1 4 3898 3896 3884 3890 0.407109 0.718958 0.48673 1 4 3921 3922 3908 3911 0.7 0.7 0.7 1 4 3908 3909 3910 3911 0.672512 0.652607 0.44692 1 4 3910 3912 3913 3911 0.672512 0.652607 0.44692 1 4 3918 3920 3921 3919 0.672512 0.652607 0.44692 1 4 3922 3921 3920 3923 0.672512 0.652607 0.44692 1 4 3913 3912 3924 3925 0.672512 0.652607 0.44692 1 4 3924 3926 3927 3925 0.672512 0.652607 0.44692 1 4 3927 3919 3913 3925 0.672512 0.652607 0.44692 1 4 3919 3927 3926 3918 0.672512 0.652607 0.44692 1 4 3926 3924 3912 3918 0.672512 0.652607 0.44692 1 4 3949 3950 3936 3939 0.7 0.7 0.7 1 4 3936 3937 3938 3939 0.407109 0.718958 0.48673 1 4 3938 3940 3941 3939 0.407109 0.718958 0.48673 1 4 3946 3948 3949 3947 0.407109 0.718958 0.48673 1 4 3950 3949 3948 3951 0.407109 0.718958 0.48673 1 4 3941 3940 3952 3953 0.407109 0.718958 0.48673 1 4 3952 3954 3955 3953 0.407109 0.718958 0.48673 1 4 3955 3947 3941 3953 0.407109 0.718958 0.48673 1 4 3947 3955 3954 3946 0.407109 0.718958 0.48673 1 4 3954 3952 3940 3946 0.407109 0.718958 0.48673 1 4 3977 3978 3964 3967 0.7 0.7 0.7 1 4 3964 3965 3966 3967 0.360664 0.453555 0.659242 1 4 3966 3968 3969 3967 0.360664 0.453555 0.659242 1 4 3974 3976 3977 3975 0.360664 0.453555 0.659242 1 4 3978 3977 3976 3979 0.360664 0.453555 0.659242 1 4 3969 3968 3980 3981 0.360664 0.453555 0.659242 1 4 3980 3982 3983 3981 0.360664 0.453555 0.659242 1 4 3983 3975 3969 3981 0.360664 0.453555 0.659242 1 4 3975 3983 3982 3974 0.360664 0.453555 0.659242 1 4 3982 3980 3968 3974 0.360664 0.453555 0.659242 1 4 4005 4006 3992 3995 0.7 0.7 0.7 1 4 3992 3993 3994 3995 0.360664 0.453555 0.659242 1 4 3994 3996 3997 3995 0.360664 0.453555 0.659242 1 4 4002 4004 4005 4003 0.360664 0.453555 0.659242 1 4 4006 4005 4004 4007 0.360664 0.453555 0.659242 1 4 3997 3996 4008 4009 0.360664 0.453555 0.659242 1 4 4008 4010 4011 4009 0.360664 0.453555 0.659242 1 4 4011 4003 3997 4009 0.360664 0.453555 0.659242 1 4 4003 4011 4010 4002 0.360664 0.453555 0.659242 1 4 4010 4008 3996 4002 0.360664 0.453555 0.659242 1 4 4033 4034 4020 4023 0.7 0.7 0.7 1 4 4020 4021 4022 4023 0.878199 0.586256 0.47346 1 4 4022 4024 4025 4023 0.878199 0.586256 0.47346 1 4 4030 4032 4033 4031 0.878199 0.586256 0.47346 1 4 4034 4033 4032 4035 0.878199 0.586256 0.47346 1 4 4025 4024 4036 4037 0.878199 0.586256 0.47346 1 4 4036 4038 4039 4037 0.878199 0.586256 0.47346 1 4 4039 4031 4025 4037 0.878199 0.586256 0.47346 1 4 4031 4039 4038 4030 0.878199 0.586256 0.47346 1 4 4038 4036 4024 4030 0.878199 0.586256 0.47346 1 4 4053 4051 4048 4049 0.4 0.3 0.2 1 4 4054 4050 4048 4051 0.4 0.3 0.2 1 4 4055 4052 4050 4054 0.4 0.3 0.2 1 4 4069 4070 4056 4059 0.7 0.7 0.7 1 4 4056 4057 4058 4059 0.407109 0.718958 0.48673 1 4 4058 4060 4061 4059 0.407109 0.718958 0.48673 1 4 4066 4068 4069 4067 0.407109 0.718958 0.48673 1 4 4070 4069 4068 4071 0.407109 0.718958 0.48673 1 4 4061 4060 4072 4073 0.407109 0.718958 0.48673 1 4 4072 4074 4075 4073 0.407109 0.718958 0.48673 1 4 4075 4067 4061 4073 0.407109 0.718958 0.48673 1 4 4067 4075 4074 4066 0.407109 0.718958 0.48673 1 4 4074 4072 4060 4066 0.407109 0.718958 0.48673 1 4 4097 4098 4084 4087 0.7 0.7 0.7 1 4 4084 4085 4086 4087 0.360664 0.453555 0.659242 1 4 4086 4088 4089 4087 0.360664 0.453555 0.659242 1 4 4094 4096 4097 4095 0.360664 0.453555 0.659242 1 4 4098 4097 4096 4099 0.360664 0.453555 0.659242 1 4 4089 4088 4100 4101 0.360664 0.453555 0.659242 1 4 4100 4102 4103 4101 0.360664 0.453555 0.659242 1 4 4103 4095 4089 4101 0.360664 0.453555 0.659242 1 4 4095 4103 4102 4094 0.360664 0.453555 0.659242 1 4 4102 4100 4088 4094 0.360664 0.453555 0.659242 1 4 4125 4126 4112 4115 0.7 0.7 0.7 1 4 4112 4113 4114 4115 0.44692 0.261137 0.48673 1 4 4114 4116 4117 4115 0.44692 0.261137 0.48673 1 4 4122 4124 4125 4123 0.44692 0.261137 0.48673 1 4 4126 4125 4124 4127 0.44692 0.261137 0.48673 1 4 4117 4116 4128 4129 0.44692 0.261137 0.48673 1 4 4128 4130 4131 4129 0.44692 0.261137 0.48673 1 4 4131 4123 4117 4129 0.44692 0.261137 0.48673 1 4 4123 4131 4130 4122 0.44692 0.261137 0.48673 1 4 4130 4128 4116 4122 0.44692 0.261137 0.48673 1 4 4153 4154 4140 4143 0.7 0.7 0.7 1 4 4140 4141 4142 4143 0.44692 0.261137 0.48673 1 4 4142 4144 4145 4143 0.44692 0.261137 0.48673 1 4 4150 4152 4153 4151 0.44692 0.261137 0.48673 1 4 4154 4153 4152 4155 0.44692 0.261137 0.48673 1 4 4145 4144 4156 4157 0.44692 0.261137 0.48673 1 4 4156 4158 4159 4157 0.44692 0.261137 0.48673 1 4 4159 4151 4145 4157 0.44692 0.261137 0.48673 1 4 4151 4159 4158 4150 0.44692 0.261137 0.48673 1 4 4158 4156 4144 4150 0.44692 0.261137 0.48673 1 4 4181 4182 4168 4171 0.7 0.7 0.7 1 4 4168 4169 4170 4171 0.44692 0.261137 0.48673 1 4 4170 4172 4173 4171 0.44692 0.261137 0.48673 1 4 4178 4180 4181 4179 0.44692 0.261137 0.48673 1 4 4182 4181 4180 4183 0.44692 0.261137 0.48673 1 4 4173 4172 4184 4185 0.44692 0.261137 0.48673 1 4 4184 4186 4187 4185 0.44692 0.261137 0.48673 1 4 4187 4179 4173 4185 0.44692 0.261137 0.48673 1 4 4179 4187 4186 4178 0.44692 0.261137 0.48673 1 4 4186 4184 4172 4178 0.44692 0.261137 0.48673 1 4 4209 4210 4196 4199 0.7 0.7 0.7 1 4 4196 4197 4198 4199 0.825119 0.838389 0.705687 1 4 4198 4200 4201 4199 0.825119 0.838389 0.705687 1 4 4206 4208 4209 4207 0.825119 0.838389 0.705687 1 4 4210 4209 4208 4211 0.825119 0.838389 0.705687 1 4 4201 4200 4212 4213 0.825119 0.838389 0.705687 1 4 4212 4214 4215 4213 0.825119 0.838389 0.705687 1 4 4215 4207 4201 4213 0.825119 0.838389 0.705687 1 4 4207 4215 4214 4206 0.825119 0.838389 0.705687 1 4 4214 4212 4200 4206 0.825119 0.838389 0.705687 1 4 4237 4238 4224 4227 0.7 0.7 0.7 1 4 4224 4225 4226 4227 0.407109 0.718958 0.48673 1 4 4226 4228 4229 4227 0.407109 0.718958 0.48673 1 4 4234 4236 4237 4235 0.407109 0.718958 0.48673 1 4 4238 4237 4236 4239 0.407109 0.718958 0.48673 1 4 4229 4228 4240 4241 0.407109 0.718958 0.48673 1 4 4240 4242 4243 4241 0.407109 0.718958 0.48673 1 4 4243 4235 4229 4241 0.407109 0.718958 0.48673 1 4 4235 4243 4242 4234 0.407109 0.718958 0.48673 1 4 4242 4240 4228 4234 0.407109 0.718958 0.48673 1 4 4265 4266 4252 4255 0.7 0.7 0.7 1 4 4252 4253 4254 4255 0.407109 0.718958 0.48673 1 4 4254 4256 4257 4255 0.407109 0.718958 0.48673 1 4 4262 4264 4265 4263 0.407109 0.718958 0.48673 1 4 4266 4265 4264 4267 0.407109 0.718958 0.48673 1 4 4257 4256 4268 4269 0.407109 0.718958 0.48673 1 4 4268 4270 4271 4269 0.407109 0.718958 0.48673 1 4 4271 4263 4257 4269 0.407109 0.718958 0.48673 1 4 4263 4271 4270 4262 0.407109 0.718958 0.48673 1 4 4270 4268 4256 4262 0.407109 0.718958 0.48673 1 4 4293 4294 4280 4283 0.7 0.7 0.7 1 4 4280 4281 4282 4283 0.44692 0.261137 0.48673 1 4 4282 4284 4285 4283 0.44692 0.261137 0.48673 1 4 4290 4292 4293 4291 0.44692 0.261137 0.48673 1 4 4294 4293 4292 4295 0.44692 0.261137 0.48673 1 4 4285 4284 4296 4297 0.44692 0.261137 0.48673 1 4 4296 4298 4299 4297 0.44692 0.261137 0.48673 1 4 4299 4291 4285 4297 0.44692 0.261137 0.48673 1 4 4291 4299 4298 4290 0.44692 0.261137 0.48673 1 4 4298 4296 4284 4290 0.44692 0.261137 0.48673 1 4 4321 4322 4308 4311 0.7 0.7 0.7 1 4 4308 4309 4310 4311 0.44692 0.261137 0.48673 1 4 4310 4312 4313 4311 0.44692 0.261137 0.48673 1 4 4318 4320 4321 4319 0.44692 0.261137 0.48673 1 4 4322 4321 4320 4323 0.44692 0.261137 0.48673 1 4 4313 4312 4324 4325 0.44692 0.261137 0.48673 1 4 4324 4326 4327 4325 0.44692 0.261137 0.48673 1 4 4327 4319 4313 4325 0.44692 0.261137 0.48673 1 4 4319 4327 4326 4318 0.44692 0.261137 0.48673 1 4 4326 4324 4312 4318 0.44692 0.261137 0.48673 1 4 4349 4350 4336 4339 0.7 0.7 0.7 1 4 4336 4337 4338 4339 0.825119 0.838389 0.705687 1 4 4338 4340 4341 4339 0.825119 0.838389 0.705687 1 4 4346 4348 4349 4347 0.825119 0.838389 0.705687 1 4 4350 4349 4348 4351 0.825119 0.838389 0.705687 1 4 4341 4340 4352 4353 0.825119 0.838389 0.705687 1 4 4352 4354 4355 4353 0.825119 0.838389 0.705687 1 4 4355 4347 4341 4353 0.825119 0.838389 0.705687 1 4 4347 4355 4354 4346 0.825119 0.838389 0.705687 1 4 4354 4352 4340 4346 0.825119 0.838389 0.705687 1 4 4369 4367 4364 4365 0.4 0.3 0.2 1 4 4370 4366 4364 4367 0.4 0.3 0.2 1 4 4371 4368 4366 4370 0.4 0.3 0.2 1 4 4385 4386 4372 4375 0.7 0.7 0.7 1 4 4372 4373 4374 4375 0.407109 0.718958 0.48673 1 4 4374 4376 4377 4375 0.407109 0.718958 0.48673 1 4 4382 4384 4385 4383 0.407109 0.718958 0.48673 1 4 4386 4385 4384 4387 0.407109 0.718958 0.48673 1 4 4377 4376 4388 4389 0.407109 0.718958 0.48673 1 4 4388 4390 4391 4389 0.407109 0.718958 0.48673 1 4 4391 4383 4377 4389 0.407109 0.718958 0.48673 1 4 4383 4391 4390 4382 0.407109 0.718958 0.48673 1 4 4390 4388 4376 4382 0.407109 0.718958 0.48673 1 4 4413 4414 4400 4403 0.7 0.7 0.7 1 4 4400 4401 4402 4403 0.878199 0.586256 0.47346 1 4 4402 4404 4405 4403 0.878199 0.586256 0.47346 1 4 4410 4412 4413 4411 0.878199 0.586256 0.47346 1 4 4414 4413 4412 4415 0.878199 0.586256 0.47346 1 4 4405 4404 4416 4417 0.878199 0.586256 0.47346 1 4 4416 4418 4419 4417 0.878199 0.586256 0.47346 1 4 4419 4411 4405 4417 0.878199 0.586256 0.47346 1 4 4411 4419 4418 4410 0.878199 0.586256 0.47346 1 4 4418 4416 4404 4410 0.878199 0.586256 0.47346 1 4 4441 4442 4428 4431 0.7 0.7 0.7 1 4 4428 4429 4430 4431 0.672512 0.652607 0.44692 1 4 4430 4432 4433 4431 0.672512 0.652607 0.44692 1 4 4438 4440 4441 4439 0.672512 0.652607 0.44692 1 4 4442 4441 4440 4443 0.672512 0.652607 0.44692 1 4 4433 4432 4444 4445 0.672512 0.652607 0.44692 1 4 4444 4446 4447 4445 0.672512 0.652607 0.44692 1 4 4447 4439 4433 4445 0.672512 0.652607 0.44692 1 4 4439 4447 4446 4438 0.672512 0.652607 0.44692 1 4 4446 4444 4432 4438 0.672512 0.652607 0.44692 1 4 4469 4470 4456 4459 0.7 0.7 0.7 1 4 4456 4457 4458 4459 0.360664 0.453555 0.659242 1 4 4458 4460 4461 4459 0.360664 0.453555 0.659242 1 4 4466 4468 4469 4467 0.360664 0.453555 0.659242 1 4 4470 4469 4468 4471 0.360664 0.453555 0.659242 1 4 4461 4460 4472 4473 0.360664 0.453555 0.659242 1 4 4472 4474 4475 4473 0.360664 0.453555 0.659242 1 4 4475 4467 4461 4473 0.360664 0.453555 0.659242 1 4 4467 4475 4474 4466 0.360664 0.453555 0.659242 1 4 4474 4472 4460 4466 0.360664 0.453555 0.659242 1 4 4497 4498 4484 4487 0.7 0.7 0.7 1 4 4484 4485 4486 4487 0.360664 0.453555 0.659242 1 4 4486 4488 4489 4487 0.360664 0.453555 0.659242 1 4 4494 4496 4497 4495 0.360664 0.453555 0.659242 1 4 4498 4497 4496 4499 0.360664 0.453555 0.659242 1 4 4489 4488 4500 4501 0.360664 0.453555 0.659242 1 4 4500 4502 4503 4501 0.360664 0.453555 0.659242 1 4 4503 4495 4489 4501 0.360664 0.453555 0.659242 1 4 4495 4503 4502 4494 0.360664 0.453555 0.659242 1 4 4502 4500 4488 4494 0.360664 0.453555 0.659242 1 4 4525 4526 4512 4515 0.7 0.7 0.7 1 4 4512 4513 4514 4515 0.878199 0.586256 0.47346 1 4 4514 4516 4517 4515 0.878199 0.586256 0.47346 1 4 4522 4524 4525 4523 0.878199 0.586256 0.47346 1 4 4526 4525 4524 4527 0.878199 0.586256 0.47346 1 4 4517 4516 4528 4529 0.878199 0.586256 0.47346 1 4 4528 4530 4531 4529 0.878199 0.586256 0.47346 1 4 4531 4523 4517 4529 0.878199 0.586256 0.47346 1 4 4523 4531 4530 4522 0.878199 0.586256 0.47346 1 4 4530 4528 4516 4522 0.878199 0.586256 0.47346 1 4 4553 4554 4540 4543 0.7 0.7 0.7 1 4 4540 4541 4542 4543 0.825119 0.838389 0.705687 1 4 4542 4544 4545 4543 0.825119 0.838389 0.705687 1 4 4550 4552 4553 4551 0.825119 0.838389 0.705687 1 4 4554 4553 4552 4555 0.825119 0.838389 0.705687 1 4 4545 4544 4556 4557 0.825119 0.838389 0.705687 1 4 4556 4558 4559 4557 0.825119 0.838389 0.705687 1 4 4559 4551 4545 4557 0.825119 0.838389 0.705687 1 4 4551 4559 4558 4550 0.825119 0.838389 0.705687 1 4 4558 4556 4544 4550 0.825119 0.838389 0.705687 1 4 4581 4582 4568 4571 0.7 0.7 0.7 1 4 4568 4569 4570 4571 0.44692 0.261137 0.48673 1 4 4570 4572 4573 4571 0.44692 0.261137 0.48673 1 4 4578 4580 4581 4579 0.44692 0.261137 0.48673 1 4 4582 4581 4580 4583 0.44692 0.261137 0.48673 1 4 4573 4572 4584 4585 0.44692 0.261137 0.48673 1 4 4584 4586 4587 4585 0.44692 0.261137 0.48673 1 4 4587 4579 4573 4585 0.44692 0.261137 0.48673 1 4 4579 4587 4586 4578 0.44692 0.261137 0.48673 1 4 4586 4584 4572 4578 0.44692 0.261137 0.48673 1 4 4609 4610 4596 4599 0.7 0.7 0.7 1 4 4596 4597 4598 4599 0.878199 0.586256 0.47346 1 4 4598 4600 4601 4599 0.878199 0.586256 0.47346 1 4 4606 4608 4609 4607 0.878199 0.586256 0.47346 1 4 4610 4609 4608 4611 0.878199 0.586256 0.47346 1 4 4601 4600 4612 4613 0.878199 0.586256 0.47346 1 4 4612 4614 4615 4613 0.878199 0.586256 0.47346 1 4 4615 4607 4601 4613 0.878199 0.586256 0.47346 1 4 4607 4615 4614 4606 0.878199 0.586256 0.47346 1 4 4614 4612 4600 4606 0.878199 0.586256 0.47346 1 4 4637 4638 4624 4627 0.7 0.7 0.7 1 4 4624 4625 4626 4627 0.672512 0.652607 0.44692 1 4 4626 4628 4629 4627 0.672512 0.652607 0.44692 1 4 4634 4636 4637 4635 0.672512 0.652607 0.44692 1 4 4638 4637 4636 4639 0.672512 0.652607 0.44692 1 4 4629 4628 4640 4641 0.672512 0.652607 0.44692 1 4 4640 4642 4643 4641 0.672512 0.652607 0.44692 1 4 4643 4635 4629 4641 0.672512 0.652607 0.44692 1 4 4635 4643 4642 4634 0.672512 0.652607 0.44692 1 4 4642 4640 4628 4634 0.672512 0.652607 0.44692 1 4 4657 4655 4652 4653 0.4 0.3 0.2 1 4 4658 4654 4652 4655 0.4 0.3 0.2 1 4 4659 4656 4654 4658 0.4 0.3 0.2 1 4 4664 4661 4660 4662 0.4 0.3 0.2 1 4 4665 4663 4660 4661 0.4 0.3 0.2 1 4 4666 4662 4660 4663 0.4 0.3 0.2 1 4 4667 4666 4663 4665 0.4 0.3 0.2 1 4 4667 4664 4662 4666 0.4 0.3 0.2 1 4 4667 4665 4661 4664 0.4 0.3 0.2 1 4 4672 4669 4668 4670 0.4 0.3 0.2 1 4 4673 4671 4668 4669 0.4 0.3 0.2 1 4 4674 4670 4668 4671 0.4 0.3 0.2 1 4 4675 4674 4671 4673 0.4 0.3 0.2 1 4 4675 4672 4670 4674 0.4 0.3 0.2 1 4 4675 4673 4669 4672 0.4 0.3 0.2 1 4 4681 4679 4676 4677 0.4 0.3 0.2 1 4 4682 4678 4676 4679 0.4 0.3 0.2 1 4 4683 4680 4678 4682 0.4 0.3 0.2 1 4 4697 4698 4684 4687 0.7 0.7 0.7 1 4 4684 4685 4686 4687 0.241232 0.287678 0.400474 1 4 4686 4688 4689 4687 0.241232 0.287678 0.400474 1 4 4694 4696 4697 4695 0.241232 0.287678 0.400474 1 4 4698 4697 4696 4699 0.241232 0.287678 0.400474 1 4 4689 4688 4700 4701 0.241232 0.287678 0.400474 1 4 4700 4702 4703 4701 0.241232 0.287678 0.400474 1 4 4703 4695 4689 4701 0.241232 0.287678 0.400474 1 4 4695 4703 4702 4694 0.241232 0.287678 0.400474 1 4 4702 4700 4688 4694 0.241232 0.287678 0.400474 1 4 4725 4726 4712 4715 0.7 0.7 0.7 1 4 4712 4713 4714 4715 0.752133 0.592891 0.639337 1 4 4714 4716 4717 4715 0.752133 0.592891 0.639337 1 4 4722 4724 4725 4723 0.752133 0.592891 0.639337 1 4 4726 4725 4724 4727 0.752133 0.592891 0.639337 1 4 4717 4716 4728 4729 0.752133 0.592891 0.639337 1 4 4728 4730 4731 4729 0.752133 0.592891 0.639337 1 4 4731 4723 4717 4729 0.752133 0.592891 0.639337 1 4 4723 4731 4730 4722 0.752133 0.592891 0.639337 1 4 4730 4728 4716 4722 0.752133 0.592891 0.639337 1 4 4753 4754 4740 4743 0.7 0.7 0.7 1 4 4740 4741 4742 4743 0.44692 0.261137 0.48673 1 4 4742 4744 4745 4743 0.44692 0.261137 0.48673 1 4 4750 4752 4753 4751 0.44692 0.261137 0.48673 1 4 4754 4753 4752 4755 0.44692 0.261137 0.48673 1 4 4745 4744 4756 4757 0.44692 0.261137 0.48673 1 4 4756 4758 4759 4757 0.44692 0.261137 0.48673 1 4 4759 4751 4745 4757 0.44692 0.261137 0.48673 1 4 4751 4759 4758 4750 0.44692 0.261137 0.48673 1 4 4758 4756 4744 4750 0.44692 0.261137 0.48673 1 4 4781 4782 4768 4771 0.7 0.7 0.7 1 4 4768 4769 4770 4771 0.154976 0.400474 0.347394 1 4 4770 4772 4773 4771 0.154976 0.400474 0.347394 1 4 4778 4780 4781 4779 0.154976 0.400474 0.347394 1 4 4782 4781 4780 4783 0.154976 0.400474 0.347394 1 4 4773 4772 4784 4785 0.154976 0.400474 0.347394 1 4 4784 4786 4787 4785 0.154976 0.400474 0.347394 1 4 4787 4779 4773 4785 0.154976 0.400474 0.347394 1 4 4779 4787 4786 4778 0.154976 0.400474 0.347394 1 4 4786 4784 4772 4778 0.154976 0.400474 0.347394 1 4 4809 4810 4796 4799 0.7 0.7 0.7 1 4 4796 4797 4798 4799 0.154976 0.400474 0.347394 1 4 4798 4800 4801 4799 0.154976 0.400474 0.347394 1 4 4806 4808 4809 4807 0.154976 0.400474 0.347394 1 4 4810 4809 4808 4811 0.154976 0.400474 0.347394 1 4 4801 4800 4812 4813 0.154976 0.400474 0.347394 1 4 4812 4814 4815 4813 0.154976 0.400474 0.347394 1 4 4815 4807 4801 4813 0.154976 0.400474 0.347394 1 4 4807 4815 4814 4806 0.154976 0.400474 0.347394 1 4 4814 4812 4800 4806 0.154976 0.400474 0.347394 1 4 4837 4838 4824 4827 0.7 0.7 0.7 1 4 4824 4825 4826 4827 0.241232 0.287678 0.400474 1 4 4826 4828 4829 4827 0.241232 0.287678 0.400474 1 4 4834 4836 4837 4835 0.241232 0.287678 0.400474 1 4 4838 4837 4836 4839 0.241232 0.287678 0.400474 1 4 4829 4828 4840 4841 0.241232 0.287678 0.400474 1 4 4840 4842 4843 4841 0.241232 0.287678 0.400474 1 4 4843 4835 4829 4841 0.241232 0.287678 0.400474 1 4 4835 4843 4842 4834 0.241232 0.287678 0.400474 1 4 4842 4840 4828 4834 0.241232 0.287678 0.400474 1 4 4857 4855 4852 4853 0.4 0.3 0.2 1 4 4858 4854 4852 4855 0.4 0.3 0.2 1 4 4859 4856 4854 4858 0.4 0.3 0.2 1 4 4873 4874 4860 4863 0.7 0.7 0.7 1 4 4860 4861 4862 4863 0.752133 0.592891 0.639337 1 4 4862 4864 4865 4863 0.752133 0.592891 0.639337 1 4 4870 4872 4873 4871 0.752133 0.592891 0.639337 1 4 4874 4873 4872 4875 0.752133 0.592891 0.639337 1 4 4865 4864 4876 4877 0.752133 0.592891 0.639337 1 4 4876 4878 4879 4877 0.752133 0.592891 0.639337 1 4 4879 4871 4865 4877 0.752133 0.592891 0.639337 1 4 4871 4879 4878 4870 0.752133 0.592891 0.639337 1 4 4878 4876 4864 4870 0.752133 0.592891 0.639337 1 4 4901 4902 4888 4891 0.7 0.7 0.7 1 4 4888 4889 4890 4891 0.44692 0.261137 0.48673 1 4 4890 4892 4893 4891 0.44692 0.261137 0.48673 1 4 4898 4900 4901 4899 0.44692 0.261137 0.48673 1 4 4902 4901 4900 4903 0.44692 0.261137 0.48673 1 4 4893 4892 4904 4905 0.44692 0.261137 0.48673 1 4 4904 4906 4907 4905 0.44692 0.261137 0.48673 1 4 4907 4899 4893 4905 0.44692 0.261137 0.48673 1 4 4899 4907 4906 4898 0.44692 0.261137 0.48673 1 4 4906 4904 4892 4898 0.44692 0.261137 0.48673 1 4 4929 4930 4916 4919 0.7 0.7 0.7 1 4 4916 4917 4918 4919 0.752133 0.592891 0.639337 1 4 4918 4920 4921 4919 0.752133 0.592891 0.639337 1 4 4926 4928 4929 4927 0.752133 0.592891 0.639337 1 4 4930 4929 4928 4931 0.752133 0.592891 0.639337 1 4 4921 4920 4932 4933 0.752133 0.592891 0.639337 1 4 4932 4934 4935 4933 0.752133 0.592891 0.639337 1 4 4935 4927 4921 4933 0.752133 0.592891 0.639337 1 4 4927 4935 4934 4926 0.752133 0.592891 0.639337 1 4 4934 4932 4920 4926 0.752133 0.592891 0.639337 1 4 4957 4958 4944 4947 0.7 0.7 0.7 1 4 4944 4945 4946 4947 0.752133 0.592891 0.639337 1 4 4946 4948 4949 4947 0.752133 0.592891 0.639337 1 4 4954 4956 4957 4955 0.752133 0.592891 0.639337 1 4 4958 4957 4956 4959 0.752133 0.592891 0.639337 1 4 4949 4948 4960 4961 0.752133 0.592891 0.639337 1 4 4960 4962 4963 4961 0.752133 0.592891 0.639337 1 4 4963 4955 4949 4961 0.752133 0.592891 0.639337 1 4 4955 4963 4962 4954 0.752133 0.592891 0.639337 1 4 4962 4960 4948 4954 0.752133 0.592891 0.639337 1 4 4985 4986 4972 4975 0.7 0.7 0.7 1 4 4972 4973 4974 4975 0.44692 0.261137 0.48673 1 4 4974 4976 4977 4975 0.44692 0.261137 0.48673 1 4 4982 4984 4985 4983 0.44692 0.261137 0.48673 1 4 4986 4985 4984 4987 0.44692 0.261137 0.48673 1 4 4977 4976 4988 4989 0.44692 0.261137 0.48673 1 4 4988 4990 4991 4989 0.44692 0.261137 0.48673 1 4 4991 4983 4977 4989 0.44692 0.261137 0.48673 1 4 4983 4991 4990 4982 0.44692 0.261137 0.48673 1 4 4990 4988 4976 4982 0.44692 0.261137 0.48673 1 4 5013 5014 5000 5003 0.7 0.7 0.7 1 4 5000 5001 5002 5003 0.44692 0.261137 0.48673 1 4 5002 5004 5005 5003 0.44692 0.261137 0.48673 1 4 5010 5012 5013 5011 0.44692 0.261137 0.48673 1 4 5014 5013 5012 5015 0.44692 0.261137 0.48673 1 4 5005 5004 5016 5017 0.44692 0.261137 0.48673 1 4 5016 5018 5019 5017 0.44692 0.261137 0.48673 1 4 5019 5011 5005 5017 0.44692 0.261137 0.48673 1 4 5011 5019 5018 5010 0.44692 0.261137 0.48673 1 4 5018 5016 5004 5010 0.44692 0.261137 0.48673 1 4 5041 5042 5028 5031 0.7 0.7 0.7 1 4 5028 5029 5030 5031 0.44692 0.261137 0.48673 1 4 5030 5032 5033 5031 0.44692 0.261137 0.48673 1 4 5038 5040 5041 5039 0.44692 0.261137 0.48673 1 4 5042 5041 5040 5043 0.44692 0.261137 0.48673 1 4 5033 5032 5044 5045 0.44692 0.261137 0.48673 1 4 5044 5046 5047 5045 0.44692 0.261137 0.48673 1 4 5047 5039 5033 5045 0.44692 0.261137 0.48673 1 4 5039 5047 5046 5038 0.44692 0.261137 0.48673 1 4 5046 5044 5032 5038 0.44692 0.261137 0.48673 1 4 5069 5070 5056 5059 0.7 0.7 0.7 1 4 5056 5057 5058 5059 0.241232 0.287678 0.400474 1 4 5058 5060 5061 5059 0.241232 0.287678 0.400474 1 4 5066 5068 5069 5067 0.241232 0.287678 0.400474 1 4 5070 5069 5068 5071 0.241232 0.287678 0.400474 1 4 5061 5060 5072 5073 0.241232 0.287678 0.400474 1 4 5072 5074 5075 5073 0.241232 0.287678 0.400474 1 4 5075 5067 5061 5073 0.241232 0.287678 0.400474 1 4 5067 5075 5074 5066 0.241232 0.287678 0.400474 1 4 5074 5072 5060 5066 0.241232 0.287678 0.400474 1 4 5089 5087 5084 5085 0.4 0.3 0.2 1 4 5090 5086 5084 5087 0.4 0.3 0.2 1 4 5091 5088 5086 5090 0.4 0.3 0.2 1 4 5105 5106 5092 5095 0.7 0.7 0.7 1 4 5092 5093 5094 5095 0.241232 0.287678 0.400474 1 4 5094 5096 5097 5095 0.241232 0.287678 0.400474 1 4 5102 5104 5105 5103 0.241232 0.287678 0.400474 1 4 5106 5105 5104 5107 0.241232 0.287678 0.400474 1 4 5097 5096 5108 5109 0.241232 0.287678 0.400474 1 4 5108 5110 5111 5109 0.241232 0.287678 0.400474 1 4 5111 5103 5097 5109 0.241232 0.287678 0.400474 1 4 5103 5111 5110 5102 0.241232 0.287678 0.400474 1 4 5110 5108 5096 5102 0.241232 0.287678 0.400474 1 4 5133 5134 5120 5123 0.7 0.7 0.7 1 4 5120 5121 5122 5123 0.825119 0.765403 0.539811 1 4 5122 5124 5125 5123 0.825119 0.765403 0.539811 1 4 5130 5132 5133 5131 0.825119 0.765403 0.539811 1 4 5134 5133 5132 5135 0.825119 0.765403 0.539811 1 4 5125 5124 5136 5137 0.825119 0.765403 0.539811 1 4 5136 5138 5139 5137 0.825119 0.765403 0.539811 1 4 5139 5131 5125 5137 0.825119 0.765403 0.539811 1 4 5131 5139 5138 5130 0.825119 0.765403 0.539811 1 4 5138 5136 5124 5130 0.825119 0.765403 0.539811 1 4 5161 5162 5148 5151 0.7 0.7 0.7 1 4 5148 5149 5150 5151 0.752133 0.592891 0.639337 1 4 5150 5152 5153 5151 0.752133 0.592891 0.639337 1 4 5158 5160 5161 5159 0.752133 0.592891 0.639337 1 4 5162 5161 5160 5163 0.752133 0.592891 0.639337 1 4 5153 5152 5164 5165 0.752133 0.592891 0.639337 1 4 5164 5166 5167 5165 0.752133 0.592891 0.639337 1 4 5167 5159 5153 5165 0.752133 0.592891 0.639337 1 4 5159 5167 5166 5158 0.752133 0.592891 0.639337 1 4 5166 5164 5152 5158 0.752133 0.592891 0.639337 1 4 5189 5190 5176 5179 0.7 0.7 0.7 1 4 5176 5177 5178 5179 0.154976 0.400474 0.347394 1 4 5178 5180 5181 5179 0.154976 0.400474 0.347394 1 4 5186 5188 5189 5187 0.154976 0.400474 0.347394 1 4 5190 5189 5188 5191 0.154976 0.400474 0.347394 1 4 5181 5180 5192 5193 0.154976 0.400474 0.347394 1 4 5192 5194 5195 5193 0.154976 0.400474 0.347394 1 4 5195 5187 5181 5193 0.154976 0.400474 0.347394 1 4 5187 5195 5194 5186 0.154976 0.400474 0.347394 1 4 5194 5192 5180 5186 0.154976 0.400474 0.347394 1 4 5217 5218 5204 5207 0.7 0.7 0.7 1 4 5204 5205 5206 5207 0.154976 0.400474 0.347394 1 4 5206 5208 5209 5207 0.154976 0.400474 0.347394 1 4 5214 5216 5217 5215 0.154976 0.400474 0.347394 1 4 5218 5217 5216 5219 0.154976 0.400474 0.347394 1 4 5209 5208 5220 5221 0.154976 0.400474 0.347394 1 4 5220 5222 5223 5221 0.154976 0.400474 0.347394 1 4 5223 5215 5209 5221 0.154976 0.400474 0.347394 1 4 5215 5223 5222 5214 0.154976 0.400474 0.347394 1 4 5222 5220 5208 5214 0.154976 0.400474 0.347394 1 4 5245 5246 5232 5235 0.7 0.7 0.7 1 4 5232 5233 5234 5235 0.44692 0.261137 0.48673 1 4 5234 5236 5237 5235 0.44692 0.261137 0.48673 1 4 5242 5244 5245 5243 0.44692 0.261137 0.48673 1 4 5246 5245 5244 5247 0.44692 0.261137 0.48673 1 4 5237 5236 5248 5249 0.44692 0.261137 0.48673 1 4 5248 5250 5251 5249 0.44692 0.261137 0.48673 1 4 5251 5243 5237 5249 0.44692 0.261137 0.48673 1 4 5243 5251 5250 5242 0.44692 0.261137 0.48673 1 4 5250 5248 5236 5242 0.44692 0.261137 0.48673 1 4 5273 5274 5260 5263 0.7 0.7 0.7 1 4 5260 5261 5262 5263 0.752133 0.592891 0.639337 1 4 5262 5264 5265 5263 0.752133 0.592891 0.639337 1 4 5270 5272 5273 5271 0.752133 0.592891 0.639337 1 4 5274 5273 5272 5275 0.752133 0.592891 0.639337 1 4 5265 5264 5276 5277 0.752133 0.592891 0.639337 1 4 5276 5278 5279 5277 0.752133 0.592891 0.639337 1 4 5279 5271 5265 5277 0.752133 0.592891 0.639337 1 4 5271 5279 5278 5270 0.752133 0.592891 0.639337 1 4 5278 5276 5264 5270 0.752133 0.592891 0.639337 1 4 5293 5291 5288 5289 0.4 0.3 0.2 1 4 5294 5290 5288 5291 0.4 0.3 0.2 1 4 5295 5292 5290 5294 0.4 0.3 0.2 1 4 5309 5310 5296 5299 0.7 0.7 0.7 1 4 5296 5297 5298 5299 0.752133 0.592891 0.639337 1 4 5298 5300 5301 5299 0.752133 0.592891 0.639337 1 4 5306 5308 5309 5307 0.752133 0.592891 0.639337 1 4 5310 5309 5308 5311 0.752133 0.592891 0.639337 1 4 5301 5300 5312 5313 0.752133 0.592891 0.639337 1 4 5312 5314 5315 5313 0.752133 0.592891 0.639337 1 4 5315 5307 5301 5313 0.752133 0.592891 0.639337 1 4 5307 5315 5314 5306 0.752133 0.592891 0.639337 1 4 5314 5312 5300 5306 0.752133 0.592891 0.639337 1 4 5337 5338 5324 5327 0.7 0.7 0.7 1 4 5324 5325 5326 5327 0.752133 0.592891 0.639337 1 4 5326 5328 5329 5327 0.752133 0.592891 0.639337 1 4 5334 5336 5337 5335 0.752133 0.592891 0.639337 1 4 5338 5337 5336 5339 0.752133 0.592891 0.639337 1 4 5329 5328 5340 5341 0.752133 0.592891 0.639337 1 4 5340 5342 5343 5341 0.752133 0.592891 0.639337 1 4 5343 5335 5329 5341 0.752133 0.592891 0.639337 1 4 5335 5343 5342 5334 0.752133 0.592891 0.639337 1 4 5342 5340 5328 5334 0.752133 0.592891 0.639337 1 4 5365 5366 5352 5355 0.7 0.7 0.7 1 4 5352 5353 5354 5355 0.825119 0.765403 0.539811 1 4 5354 5356 5357 5355 0.825119 0.765403 0.539811 1 4 5362 5364 5365 5363 0.825119 0.765403 0.539811 1 4 5366 5365 5364 5367 0.825119 0.765403 0.539811 1 4 5357 5356 5368 5369 0.825119 0.765403 0.539811 1 4 5368 5370 5371 5369 0.825119 0.765403 0.539811 1 4 5371 5363 5357 5369 0.825119 0.765403 0.539811 1 4 5363 5371 5370 5362 0.825119 0.765403 0.539811 1 4 5370 5368 5356 5362 0.825119 0.765403 0.539811 1 4 5393 5394 5380 5383 0.7 0.7 0.7 1 4 5380 5381 5382 5383 0.752133 0.592891 0.639337 1 4 5382 5384 5385 5383 0.752133 0.592891 0.639337 1 4 5390 5392 5393 5391 0.752133 0.592891 0.639337 1 4 5394 5393 5392 5395 0.752133 0.592891 0.639337 1 4 5385 5384 5396 5397 0.752133 0.592891 0.639337 1 4 5396 5398 5399 5397 0.752133 0.592891 0.639337 1 4 5399 5391 5385 5397 0.752133 0.592891 0.639337 1 4 5391 5399 5398 5390 0.752133 0.592891 0.639337 1 4 5398 5396 5384 5390 0.752133 0.592891 0.639337 1 4 5421 5422 5408 5411 0.7 0.7 0.7 1 4 5408 5409 5410 5411 0.752133 0.592891 0.639337 1 4 5410 5412 5413 5411 0.752133 0.592891 0.639337 1 4 5418 5420 5421 5419 0.752133 0.592891 0.639337 1 4 5422 5421 5420 5423 0.752133 0.592891 0.639337 1 4 5413 5412 5424 5425 0.752133 0.592891 0.639337 1 4 5424 5426 5427 5425 0.752133 0.592891 0.639337 1 4 5427 5419 5413 5425 0.752133 0.592891 0.639337 1 4 5419 5427 5426 5418 0.752133 0.592891 0.639337 1 4 5426 5424 5412 5418 0.752133 0.592891 0.639337 1 4 5449 5450 5436 5439 0.7 0.7 0.7 1 4 5436 5437 5438 5439 0.619431 0.599526 0.44692 1 4 5438 5440 5441 5439 0.619431 0.599526 0.44692 1 4 5446 5448 5449 5447 0.619431 0.599526 0.44692 1 4 5450 5449 5448 5451 0.619431 0.599526 0.44692 1 4 5441 5440 5452 5453 0.619431 0.599526 0.44692 1 4 5452 5454 5455 5453 0.619431 0.599526 0.44692 1 4 5455 5447 5441 5453 0.619431 0.599526 0.44692 1 4 5447 5455 5454 5446 0.619431 0.599526 0.44692 1 4 5454 5452 5440 5446 0.619431 0.599526 0.44692 1 4 5477 5478 5464 5467 0.7 0.7 0.7 1 4 5464 5465 5466 5467 0.241232 0.287678 0.400474 1 4 5466 5468 5469 5467 0.241232 0.287678 0.400474 1 4 5474 5476 5477 5475 0.241232 0.287678 0.400474 1 4 5478 5477 5476 5479 0.241232 0.287678 0.400474 1 4 5469 5468 5480 5481 0.241232 0.287678 0.400474 1 4 5480 5482 5483 5481 0.241232 0.287678 0.400474 1 4 5483 5475 5469 5481 0.241232 0.287678 0.400474 1 4 5475 5483 5482 5474 0.241232 0.287678 0.400474 1 4 5482 5480 5468 5474 0.241232 0.287678 0.400474 1 4 5505 5506 5492 5495 0.7 0.7 0.7 1 4 5492 5493 5494 5495 0.619431 0.599526 0.44692 1 4 5494 5496 5497 5495 0.619431 0.599526 0.44692 1 4 5502 5504 5505 5503 0.619431 0.599526 0.44692 1 4 5506 5505 5504 5507 0.619431 0.599526 0.44692 1 4 5497 5496 5508 5509 0.619431 0.599526 0.44692 1 4 5508 5510 5511 5509 0.619431 0.599526 0.44692 1 4 5511 5503 5497 5509 0.619431 0.599526 0.44692 1 4 5503 5511 5510 5502 0.619431 0.599526 0.44692 1 4 5510 5508 5496 5502 0.619431 0.599526 0.44692 1 4 5533 5534 5520 5523 0.7 0.7 0.7 1 4 5520 5521 5522 5523 0.752133 0.592891 0.639337 1 4 5522 5524 5525 5523 0.752133 0.592891 0.639337 1 4 5530 5532 5533 5531 0.752133 0.592891 0.639337 1 4 5534 5533 5532 5535 0.752133 0.592891 0.639337 1 4 5525 5524 5536 5537 0.752133 0.592891 0.639337 1 4 5536 5538 5539 5537 0.752133 0.592891 0.639337 1 4 5539 5531 5525 5537 0.752133 0.592891 0.639337 1 4 5531 5539 5538 5530 0.752133 0.592891 0.639337 1 4 5538 5536 5524 5530 0.752133 0.592891 0.639337 1 4 5553 5551 5548 5549 0.4 0.3 0.2 1 4 5554 5550 5548 5551 0.4 0.3 0.2 1 4 5555 5552 5550 5554 0.4 0.3 0.2 1 4 5569 5570 5556 5559 0.7 0.7 0.7 1 4 5556 5557 5558 5559 0.154976 0.400474 0.347394 1 4 5558 5560 5561 5559 0.154976 0.400474 0.347394 1 4 5566 5568 5569 5567 0.154976 0.400474 0.347394 1 4 5570 5569 5568 5571 0.154976 0.400474 0.347394 1 4 5561 5560 5572 5573 0.154976 0.400474 0.347394 1 4 5572 5574 5575 5573 0.154976 0.400474 0.347394 1 4 5575 5567 5561 5573 0.154976 0.400474 0.347394 1 4 5567 5575 5574 5566 0.154976 0.400474 0.347394 1 4 5574 5572 5560 5566 0.154976 0.400474 0.347394 1 4 5597 5598 5584 5587 0.7 0.7 0.7 1 4 5584 5585 5586 5587 0.825119 0.765403 0.539811 1 4 5586 5588 5589 5587 0.825119 0.765403 0.539811 1 4 5594 5596 5597 5595 0.825119 0.765403 0.539811 1 4 5598 5597 5596 5599 0.825119 0.765403 0.539811 1 4 5589 5588 5600 5601 0.825119 0.765403 0.539811 1 4 5600 5602 5603 5601 0.825119 0.765403 0.539811 1 4 5603 5595 5589 5601 0.825119 0.765403 0.539811 1 4 5595 5603 5602 5594 0.825119 0.765403 0.539811 1 4 5602 5600 5588 5594 0.825119 0.765403 0.539811 1 4 5625 5626 5612 5615 0.7 0.7 0.7 1 4 5612 5613 5614 5615 0.241232 0.287678 0.400474 1 4 5614 5616 5617 5615 0.241232 0.287678 0.400474 1 4 5622 5624 5625 5623 0.241232 0.287678 0.400474 1 4 5626 5625 5624 5627 0.241232 0.287678 0.400474 1 4 5617 5616 5628 5629 0.241232 0.287678 0.400474 1 4 5628 5630 5631 5629 0.241232 0.287678 0.400474 1 4 5631 5623 5617 5629 0.241232 0.287678 0.400474 1 4 5623 5631 5630 5622 0.241232 0.287678 0.400474 1 4 5630 5628 5616 5622 0.241232 0.287678 0.400474 1 4 5653 5654 5640 5643 0.7 0.7 0.7 1 4 5640 5641 5642 5643 0.752133 0.592891 0.639337 1 4 5642 5644 5645 5643 0.752133 0.592891 0.639337 1 4 5650 5652 5653 5651 0.752133 0.592891 0.639337 1 4 5654 5653 5652 5655 0.752133 0.592891 0.639337 1 4 5645 5644 5656 5657 0.752133 0.592891 0.639337 1 4 5656 5658 5659 5657 0.752133 0.592891 0.639337 1 4 5659 5651 5645 5657 0.752133 0.592891 0.639337 1 4 5651 5659 5658 5650 0.752133 0.592891 0.639337 1 4 5658 5656 5644 5650 0.752133 0.592891 0.639337 1 4 5681 5682 5668 5671 0.7 0.7 0.7 1 4 5668 5669 5670 5671 0.154976 0.400474 0.347394 1 4 5670 5672 5673 5671 0.154976 0.400474 0.347394 1 4 5678 5680 5681 5679 0.154976 0.400474 0.347394 1 4 5682 5681 5680 5683 0.154976 0.400474 0.347394 1 4 5673 5672 5684 5685 0.154976 0.400474 0.347394 1 4 5684 5686 5687 5685 0.154976 0.400474 0.347394 1 4 5687 5679 5673 5685 0.154976 0.400474 0.347394 1 4 5679 5687 5686 5678 0.154976 0.400474 0.347394 1 4 5686 5684 5672 5678 0.154976 0.400474 0.347394 1 4 5709 5710 5696 5699 0.7 0.7 0.7 1 4 5696 5697 5698 5699 0.619431 0.599526 0.44692 1 4 5698 5700 5701 5699 0.619431 0.599526 0.44692 1 4 5706 5708 5709 5707 0.619431 0.599526 0.44692 1 4 5710 5709 5708 5711 0.619431 0.599526 0.44692 1 4 5701 5700 5712 5713 0.619431 0.599526 0.44692 1 4 5712 5714 5715 5713 0.619431 0.599526 0.44692 1 4 5715 5707 5701 5713 0.619431 0.599526 0.44692 1 4 5707 5715 5714 5706 0.619431 0.599526 0.44692 1 4 5714 5712 5700 5706 0.619431 0.599526 0.44692 1 4 5737 5738 5724 5727 0.7 0.7 0.7 1 4 5724 5725 5726 5727 0.241232 0.287678 0.400474 1 4 5726 5728 5729 5727 0.241232 0.287678 0.400474 1 4 5734 5736 5737 5735 0.241232 0.287678 0.400474 1 4 5738 5737 5736 5739 0.241232 0.287678 0.400474 1 4 5729 5728 5740 5741 0.241232 0.287678 0.400474 1 4 5740 5742 5743 5741 0.241232 0.287678 0.400474 1 4 5743 5735 5729 5741 0.241232 0.287678 0.400474 1 4 5735 5743 5742 5734 0.241232 0.287678 0.400474 1 4 5742 5740 5728 5734 0.241232 0.287678 0.400474 1 4 5765 5766 5752 5755 0.7 0.7 0.7 1 4 5752 5753 5754 5755 0.752133 0.592891 0.639337 1 4 5754 5756 5757 5755 0.752133 0.592891 0.639337 1 4 5762 5764 5765 5763 0.752133 0.592891 0.639337 1 4 5766 5765 5764 5767 0.752133 0.592891 0.639337 1 4 5757 5756 5768 5769 0.752133 0.592891 0.639337 1 4 5768 5770 5771 5769 0.752133 0.592891 0.639337 1 4 5771 5763 5757 5769 0.752133 0.592891 0.639337 1 4 5763 5771 5770 5762 0.752133 0.592891 0.639337 1 4 5770 5768 5756 5762 0.752133 0.592891 0.639337 1 4 5785 5783 5780 5781 0.4 0.3 0.2 1 4 5786 5782 5780 5783 0.4 0.3 0.2 1 4 5787 5784 5782 5786 0.4 0.3 0.2 1 4 5801 5802 5788 5791 0.7 0.7 0.7 1 4 5788 5789 5790 5791 0.44692 0.261137 0.48673 1 4 5790 5792 5793 5791 0.44692 0.261137 0.48673 1 4 5798 5800 5801 5799 0.44692 0.261137 0.48673 1 4 5802 5801 5800 5803 0.44692 0.261137 0.48673 1 4 5793 5792 5804 5805 0.44692 0.261137 0.48673 1 4 5804 5806 5807 5805 0.44692 0.261137 0.48673 1 4 5807 5799 5793 5805 0.44692 0.261137 0.48673 1 4 5799 5807 5806 5798 0.44692 0.261137 0.48673 1 4 5806 5804 5792 5798 0.44692 0.261137 0.48673 1 4 5829 5830 5816 5819 0.7 0.7 0.7 1 4 5816 5817 5818 5819 0.241232 0.287678 0.400474 1 4 5818 5820 5821 5819 0.241232 0.287678 0.400474 1 4 5826 5828 5829 5827 0.241232 0.287678 0.400474 1 4 5830 5829 5828 5831 0.241232 0.287678 0.400474 1 4 5821 5820 5832 5833 0.241232 0.287678 0.400474 1 4 5832 5834 5835 5833 0.241232 0.287678 0.400474 1 4 5835 5827 5821 5833 0.241232 0.287678 0.400474 1 4 5827 5835 5834 5826 0.241232 0.287678 0.400474 1 4 5834 5832 5820 5826 0.241232 0.287678 0.400474 1 4 5857 5858 5844 5847 0.7 0.7 0.7 1 4 5844 5845 5846 5847 0.825119 0.765403 0.539811 1 4 5846 5848 5849 5847 0.825119 0.765403 0.539811 1 4 5854 5856 5857 5855 0.825119 0.765403 0.539811 1 4 5858 5857 5856 5859 0.825119 0.765403 0.539811 1 4 5849 5848 5860 5861 0.825119 0.765403 0.539811 1 4 5860 5862 5863 5861 0.825119 0.765403 0.539811 1 4 5863 5855 5849 5861 0.825119 0.765403 0.539811 1 4 5855 5863 5862 5854 0.825119 0.765403 0.539811 1 4 5862 5860 5848 5854 0.825119 0.765403 0.539811 1 4 5885 5886 5872 5875 0.7 0.7 0.7 1 4 5872 5873 5874 5875 0.619431 0.599526 0.44692 1 4 5874 5876 5877 5875 0.619431 0.599526 0.44692 1 4 5882 5884 5885 5883 0.619431 0.599526 0.44692 1 4 5886 5885 5884 5887 0.619431 0.599526 0.44692 1 4 5877 5876 5888 5889 0.619431 0.599526 0.44692 1 4 5888 5890 5891 5889 0.619431 0.599526 0.44692 1 4 5891 5883 5877 5889 0.619431 0.599526 0.44692 1 4 5883 5891 5890 5882 0.619431 0.599526 0.44692 1 4 5890 5888 5876 5882 0.619431 0.599526 0.44692 1 4 5913 5914 5900 5903 0.7 0.7 0.7 1 4 5900 5901 5902 5903 0.44692 0.261137 0.48673 1 4 5902 5904 5905 5903 0.44692 0.261137 0.48673 1 4 5910 5912 5913 5911 0.44692 0.261137 0.48673 1 4 5914 5913 5912 5915 0.44692 0.261137 0.48673 1 4 5905 5904 5916 5917 0.44692 0.261137 0.48673 1 4 5916 5918 5919 5917 0.44692 0.261137 0.48673 1 4 5919 5911 5905 5917 0.44692 0.261137 0.48673 1 4 5911 5919 5918 5910 0.44692 0.261137 0.48673 1 4 5918 5916 5904 5910 0.44692 0.261137 0.48673 1 4 5941 5942 5928 5931 0.7 0.7 0.7 1 4 5928 5929 5930 5931 0.752133 0.592891 0.639337 1 4 5930 5932 5933 5931 0.752133 0.592891 0.639337 1 4 5938 5940 5941 5939 0.752133 0.592891 0.639337 1 4 5942 5941 5940 5943 0.752133 0.592891 0.639337 1 4 5933 5932 5944 5945 0.752133 0.592891 0.639337 1 4 5944 5946 5947 5945 0.752133 0.592891 0.639337 1 4 5947 5939 5933 5945 0.752133 0.592891 0.639337 1 4 5939 5947 5946 5938 0.752133 0.592891 0.639337 1 4 5946 5944 5932 5938 0.752133 0.592891 0.639337 1 4 5969 5970 5956 5959 0.7 0.7 0.7 1 4 5956 5957 5958 5959 0.154976 0.400474 0.347394 1 4 5958 5960 5961 5959 0.154976 0.400474 0.347394 1 4 5966 5968 5969 5967 0.154976 0.400474 0.347394 1 4 5970 5969 5968 5971 0.154976 0.400474 0.347394 1 4 5961 5960 5972 5973 0.154976 0.400474 0.347394 1 4 5972 5974 5975 5973 0.154976 0.400474 0.347394 1 4 5975 5967 5961 5973 0.154976 0.400474 0.347394 1 4 5967 5975 5974 5966 0.154976 0.400474 0.347394 1 4 5974 5972 5960 5966 0.154976 0.400474 0.347394 1 4 5997 5998 5984 5987 0.7 0.7 0.7 1 4 5984 5985 5986 5987 0.154976 0.400474 0.347394 1 4 5986 5988 5989 5987 0.154976 0.400474 0.347394 1 4 5994 5996 5997 5995 0.154976 0.400474 0.347394 1 4 5998 5997 5996 5999 0.154976 0.400474 0.347394 1 4 5989 5988 6000 6001 0.154976 0.400474 0.347394 1 4 6000 6002 6003 6001 0.154976 0.400474 0.347394 1 4 6003 5995 5989 6001 0.154976 0.400474 0.347394 1 4 5995 6003 6002 5994 0.154976 0.400474 0.347394 1 4 6002 6000 5988 5994 0.154976 0.400474 0.347394 1 4 6025 6026 6012 6015 0.7 0.7 0.7 1 4 6012 6013 6014 6015 0.44692 0.261137 0.48673 1 4 6014 6016 6017 6015 0.44692 0.261137 0.48673 1 4 6022 6024 6025 6023 0.44692 0.261137 0.48673 1 4 6026 6025 6024 6027 0.44692 0.261137 0.48673 1 4 6017 6016 6028 6029 0.44692 0.261137 0.48673 1 4 6028 6030 6031 6029 0.44692 0.261137 0.48673 1 4 6031 6023 6017 6029 0.44692 0.261137 0.48673 1 4 6023 6031 6030 6022 0.44692 0.261137 0.48673 1 4 6030 6028 6016 6022 0.44692 0.261137 0.48673 1 4 6053 6054 6040 6043 0.7 0.7 0.7 1 4 6040 6041 6042 6043 0.825119 0.765403 0.539811 1 4 6042 6044 6045 6043 0.825119 0.765403 0.539811 1 4 6050 6052 6053 6051 0.825119 0.765403 0.539811 1 4 6054 6053 6052 6055 0.825119 0.765403 0.539811 1 4 6045 6044 6056 6057 0.825119 0.765403 0.539811 1 4 6056 6058 6059 6057 0.825119 0.765403 0.539811 1 4 6059 6051 6045 6057 0.825119 0.765403 0.539811 1 4 6051 6059 6058 6050 0.825119 0.765403 0.539811 1 4 6058 6056 6044 6050 0.825119 0.765403 0.539811 1 4 6073 6071 6068 6069 0.4 0.3 0.2 1 4 6074 6070 6068 6071 0.4 0.3 0.2 1 4 6075 6072 6070 6074 0.4 0.3 0.2 1 4 6089 6090 6076 6079 0.7 0.7 0.7 1 4 6076 6077 6078 6079 0.44692 0.261137 0.48673 1 4 6078 6080 6081 6079 0.44692 0.261137 0.48673 1 4 6086 6088 6089 6087 0.44692 0.261137 0.48673 1 4 6090 6089 6088 6091 0.44692 0.261137 0.48673 1 4 6081 6080 6092 6093 0.44692 0.261137 0.48673 1 4 6092 6094 6095 6093 0.44692 0.261137 0.48673 1 4 6095 6087 6081 6093 0.44692 0.261137 0.48673 1 4 6087 6095 6094 6086 0.44692 0.261137 0.48673 1 4 6094 6092 6080 6086 0.44692 0.261137 0.48673 1 4 6117 6118 6104 6107 0.7 0.7 0.7 1 4 6104 6105 6106 6107 0.154976 0.400474 0.347394 1 4 6106 6108 6109 6107 0.154976 0.400474 0.347394 1 4 6114 6116 6117 6115 0.154976 0.400474 0.347394 1 4 6118 6117 6116 6119 0.154976 0.400474 0.347394 1 4 6109 6108 6120 6121 0.154976 0.400474 0.347394 1 4 6120 6122 6123 6121 0.154976 0.400474 0.347394 1 4 6123 6115 6109 6121 0.154976 0.400474 0.347394 1 4 6115 6123 6122 6114 0.154976 0.400474 0.347394 1 4 6122 6120 6108 6114 0.154976 0.400474 0.347394 1 4 6145 6146 6132 6135 0.7 0.7 0.7 1 4 6132 6133 6134 6135 0.241232 0.287678 0.400474 1 4 6134 6136 6137 6135 0.241232 0.287678 0.400474 1 4 6142 6144 6145 6143 0.241232 0.287678 0.400474 1 4 6146 6145 6144 6147 0.241232 0.287678 0.400474 1 4 6137 6136 6148 6149 0.241232 0.287678 0.400474 1 4 6148 6150 6151 6149 0.241232 0.287678 0.400474 1 4 6151 6143 6137 6149 0.241232 0.287678 0.400474 1 4 6143 6151 6150 6142 0.241232 0.287678 0.400474 1 4 6150 6148 6136 6142 0.241232 0.287678 0.400474 1 4 6173 6174 6160 6163 0.7 0.7 0.7 1 4 6160 6161 6162 6163 0.619431 0.599526 0.44692 1 4 6162 6164 6165 6163 0.619431 0.599526 0.44692 1 4 6170 6172 6173 6171 0.619431 0.599526 0.44692 1 4 6174 6173 6172 6175 0.619431 0.599526 0.44692 1 4 6165 6164 6176 6177 0.619431 0.599526 0.44692 1 4 6176 6178 6179 6177 0.619431 0.599526 0.44692 1 4 6179 6171 6165 6177 0.619431 0.599526 0.44692 1 4 6171 6179 6178 6170 0.619431 0.599526 0.44692 1 4 6178 6176 6164 6170 0.619431 0.599526 0.44692 1 4 6201 6202 6188 6191 0.7 0.7 0.7 1 4 6188 6189 6190 6191 0.241232 0.287678 0.400474 1 4 6190 6192 6193 6191 0.241232 0.287678 0.400474 1 4 6198 6200 6201 6199 0.241232 0.287678 0.400474 1 4 6202 6201 6200 6203 0.241232 0.287678 0.400474 1 4 6193 6192 6204 6205 0.241232 0.287678 0.400474 1 4 6204 6206 6207 6205 0.241232 0.287678 0.400474 1 4 6207 6199 6193 6205 0.241232 0.287678 0.400474 1 4 6199 6207 6206 6198 0.241232 0.287678 0.400474 1 4 6206 6204 6192 6198 0.241232 0.287678 0.400474 1 4 6229 6230 6216 6219 0.7 0.7 0.7 1 4 6216 6217 6218 6219 0.752133 0.592891 0.639337 1 4 6218 6220 6221 6219 0.752133 0.592891 0.639337 1 4 6226 6228 6229 6227 0.752133 0.592891 0.639337 1 4 6230 6229 6228 6231 0.752133 0.592891 0.639337 1 4 6221 6220 6232 6233 0.752133 0.592891 0.639337 1 4 6232 6234 6235 6233 0.752133 0.592891 0.639337 1 4 6235 6227 6221 6233 0.752133 0.592891 0.639337 1 4 6227 6235 6234 6226 0.752133 0.592891 0.639337 1 4 6234 6232 6220 6226 0.752133 0.592891 0.639337 1 4 6257 6258 6244 6247 0.7 0.7 0.7 1 4 6244 6245 6246 6247 0.154976 0.400474 0.347394 1 4 6246 6248 6249 6247 0.154976 0.400474 0.347394 1 4 6254 6256 6257 6255 0.154976 0.400474 0.347394 1 4 6258 6257 6256 6259 0.154976 0.400474 0.347394 1 4 6249 6248 6260 6261 0.154976 0.400474 0.347394 1 4 6260 6262 6263 6261 0.154976 0.400474 0.347394 1 4 6263 6255 6249 6261 0.154976 0.400474 0.347394 1 4 6255 6263 6262 6254 0.154976 0.400474 0.347394 1 4 6262 6260 6248 6254 0.154976 0.400474 0.347394 1 4 6285 6286 6272 6275 0.7 0.7 0.7 1 4 6272 6273 6274 6275 0.44692 0.261137 0.48673 1 4 6274 6276 6277 6275 0.44692 0.261137 0.48673 1 4 6282 6284 6285 6283 0.44692 0.261137 0.48673 1 4 6286 6285 6284 6287 0.44692 0.261137 0.48673 1 4 6277 6276 6288 6289 0.44692 0.261137 0.48673 1 4 6288 6290 6291 6289 0.44692 0.261137 0.48673 1 4 6291 6283 6277 6289 0.44692 0.261137 0.48673 1 4 6283 6291 6290 6282 0.44692 0.261137 0.48673 1 4 6290 6288 6276 6282 0.44692 0.261137 0.48673 1 4 6313 6314 6300 6303 0.7 0.7 0.7 1 4 6300 6301 6302 6303 0.619431 0.599526 0.44692 1 4 6302 6304 6305 6303 0.619431 0.599526 0.44692 1 4 6310 6312 6313 6311 0.619431 0.599526 0.44692 1 4 6314 6313 6312 6315 0.619431 0.599526 0.44692 1 4 6305 6304 6316 6317 0.619431 0.599526 0.44692 1 4 6316 6318 6319 6317 0.619431 0.599526 0.44692 1 4 6319 6311 6305 6317 0.619431 0.599526 0.44692 1 4 6311 6319 6318 6310 0.619431 0.599526 0.44692 1 4 6318 6316 6304 6310 0.619431 0.599526 0.44692 1 4 6333 6331 6328 6329 0.4 0.3 0.2 1 4 6334 6330 6328 6331 0.4 0.3 0.2 1 4 6335 6332 6330 6334 0.4 0.3 0.2 1 4 6349 6350 6336 6339 0.7 0.7 0.7 1 4 6336 6337 6338 6339 0.825119 0.765403 0.539811 1 4 6338 6340 6341 6339 0.825119 0.765403 0.539811 1 4 6346 6348 6349 6347 0.825119 0.765403 0.539811 1 4 6350 6349 6348 6351 0.825119 0.765403 0.539811 1 4 6341 6340 6352 6353 0.825119 0.765403 0.539811 1 4 6352 6354 6355 6353 0.825119 0.765403 0.539811 1 4 6355 6347 6341 6353 0.825119 0.765403 0.539811 1 4 6347 6355 6354 6346 0.825119 0.765403 0.539811 1 4 6354 6352 6340 6346 0.825119 0.765403 0.539811 1 4 6377 6378 6364 6367 0.7 0.7 0.7 1 4 6364 6365 6366 6367 0.154976 0.400474 0.347394 1 4 6366 6368 6369 6367 0.154976 0.400474 0.347394 1 4 6374 6376 6377 6375 0.154976 0.400474 0.347394 1 4 6378 6377 6376 6379 0.154976 0.400474 0.347394 1 4 6369 6368 6380 6381 0.154976 0.400474 0.347394 1 4 6380 6382 6383 6381 0.154976 0.400474 0.347394 1 4 6383 6375 6369 6381 0.154976 0.400474 0.347394 1 4 6375 6383 6382 6374 0.154976 0.400474 0.347394 1 4 6382 6380 6368 6374 0.154976 0.400474 0.347394 1 4 6405 6406 6392 6395 0.7 0.7 0.7 1 4 6392 6393 6394 6395 0.825119 0.765403 0.539811 1 4 6394 6396 6397 6395 0.825119 0.765403 0.539811 1 4 6402 6404 6405 6403 0.825119 0.765403 0.539811 1 4 6406 6405 6404 6407 0.825119 0.765403 0.539811 1 4 6397 6396 6408 6409 0.825119 0.765403 0.539811 1 4 6408 6410 6411 6409 0.825119 0.765403 0.539811 1 4 6411 6403 6397 6409 0.825119 0.765403 0.539811 1 4 6403 6411 6410 6402 0.825119 0.765403 0.539811 1 4 6410 6408 6396 6402 0.825119 0.765403 0.539811 1 4 6433 6434 6420 6423 0.7 0.7 0.7 1 4 6420 6421 6422 6423 0.619431 0.599526 0.44692 1 4 6422 6424 6425 6423 0.619431 0.599526 0.44692 1 4 6430 6432 6433 6431 0.619431 0.599526 0.44692 1 4 6434 6433 6432 6435 0.619431 0.599526 0.44692 1 4 6425 6424 6436 6437 0.619431 0.599526 0.44692 1 4 6436 6438 6439 6437 0.619431 0.599526 0.44692 1 4 6439 6431 6425 6437 0.619431 0.599526 0.44692 1 4 6431 6439 6438 6430 0.619431 0.599526 0.44692 1 4 6438 6436 6424 6430 0.619431 0.599526 0.44692 1 4 6461 6462 6448 6451 0.7 0.7 0.7 1 4 6448 6449 6450 6451 0.825119 0.765403 0.539811 1 4 6450 6452 6453 6451 0.825119 0.765403 0.539811 1 4 6458 6460 6461 6459 0.825119 0.765403 0.539811 1 4 6462 6461 6460 6463 0.825119 0.765403 0.539811 1 4 6453 6452 6464 6465 0.825119 0.765403 0.539811 1 4 6464 6466 6467 6465 0.825119 0.765403 0.539811 1 4 6467 6459 6453 6465 0.825119 0.765403 0.539811 1 4 6459 6467 6466 6458 0.825119 0.765403 0.539811 1 4 6466 6464 6452 6458 0.825119 0.765403 0.539811 1 4 6489 6490 6476 6479 0.7 0.7 0.7 1 4 6476 6477 6478 6479 0.825119 0.765403 0.539811 1 4 6478 6480 6481 6479 0.825119 0.765403 0.539811 1 4 6486 6488 6489 6487 0.825119 0.765403 0.539811 1 4 6490 6489 6488 6491 0.825119 0.765403 0.539811 1 4 6481 6480 6492 6493 0.825119 0.765403 0.539811 1 4 6492 6494 6495 6493 0.825119 0.765403 0.539811 1 4 6495 6487 6481 6493 0.825119 0.765403 0.539811 1 4 6487 6495 6494 6486 0.825119 0.765403 0.539811 1 4 6494 6492 6480 6486 0.825119 0.765403 0.539811 1 4 6517 6518 6504 6507 0.7 0.7 0.7 1 4 6504 6505 6506 6507 0.44692 0.261137 0.48673 1 4 6506 6508 6509 6507 0.44692 0.261137 0.48673 1 4 6514 6516 6517 6515 0.44692 0.261137 0.48673 1 4 6518 6517 6516 6519 0.44692 0.261137 0.48673 1 4 6509 6508 6520 6521 0.44692 0.261137 0.48673 1 4 6520 6522 6523 6521 0.44692 0.261137 0.48673 1 4 6523 6515 6509 6521 0.44692 0.261137 0.48673 1 4 6515 6523 6522 6514 0.44692 0.261137 0.48673 1 4 6522 6520 6508 6514 0.44692 0.261137 0.48673 1 4 6545 6546 6532 6535 0.7 0.7 0.7 1 4 6532 6533 6534 6535 0.44692 0.261137 0.48673 1 4 6534 6536 6537 6535 0.44692 0.261137 0.48673 1 4 6542 6544 6545 6543 0.44692 0.261137 0.48673 1 4 6546 6545 6544 6547 0.44692 0.261137 0.48673 1 4 6537 6536 6548 6549 0.44692 0.261137 0.48673 1 4 6548 6550 6551 6549 0.44692 0.261137 0.48673 1 4 6551 6543 6537 6549 0.44692 0.261137 0.48673 1 4 6543 6551 6550 6542 0.44692 0.261137 0.48673 1 4 6550 6548 6536 6542 0.44692 0.261137 0.48673 1 4 6565 6563 6560 6561 0.4 0.3 0.2 1 4 6566 6562 6560 6563 0.4 0.3 0.2 1 4 6567 6564 6562 6566 0.4 0.3 0.2 1 4 6568 6569 6570 6571 0.47 0.2 0.07 1 4 6572 6573 6570 6569 0.47 0.2 0.07 1 4 6574 6575 6568 6571 0.47 0.2 0.07 1 4 6573 6574 6571 6570 0.47 0.2 0.07 1 4 6576 6577 6569 6568 0.47 0.2 0.07 1 4 6578 6579 6580 6581 0.47 0.2 0.07 1 4 6569 6577 6579 6572 0.47 0.2 0.07 1 4 6576 6568 6575 6578 0.47 0.2 0.07 1 4 6582 6583 6584 6585 0.611756 0.259474 0.078 1 4 6586 6582 6585 6587 0.611756 0.259474 0.078 1 4 6583 6588 6589 6584 0.611756 0.259474 0.078 1 4 6583 6582 6586 6588 0.611756 0.259474 0.078 1 4 6585 6584 6589 6587 0.611756 0.259474 0.078 1 4 6590 6591 6592 6593 0.611756 0.259474 0.078 1 4 6594 6590 6593 6595 0.611756 0.259474 0.078 1 4 6591 6596 6597 6592 0.611756 0.259474 0.078 1 4 6591 6590 6594 6596 0.611756 0.259474 0.078 1 4 6593 6592 6597 6595 0.611756 0.259474 0.078 1 4 6598 6599 6600 6601 0.731399 0.651637 0.598462 1 4 6602 6603 6604 6605 0.47 0.2 0.07 1 4 6602 6605 6599 6606 0.47 0.2 0.07 1 4 6607 6606 6599 6598 0.47 0.2 0.07 1 4 6603 6607 6598 6604 0.47 0.2 0.07 1 4 6601 6600 6605 6604 0.731399 0.651637 0.598462 1 4 6602 6608 6609 6603 0.47 0.2 0.07 1 4 6606 6580 6577 6608 0.47 0.2 0.07 1 4 6581 6607 6609 6576 0.47 0.2 0.07 1 4 6610 6611 6612 6613 0.47 0.2 0.07 1 4 6614 6615 6612 6611 0.47 0.2 0.07 1 4 6616 6617 6610 6613 0.47 0.2 0.07 1 4 6615 6616 6613 6612 0.47 0.2 0.07 1 4 6618 6619 6611 6610 0.47 0.2 0.07 1 4 6620 6621 6622 6623 0.47 0.2 0.07 1 4 6611 6619 6621 6614 0.47 0.2 0.07 1 4 6618 6610 6617 6620 0.47 0.2 0.07 1 4 6624 6625 6626 6627 0.611756 0.259474 0.078 1 4 6628 6624 6627 6629 0.611756 0.259474 0.078 1 4 6625 6630 6631 6626 0.611756 0.259474 0.078 1 4 6625 6624 6628 6630 0.611756 0.259474 0.078 1 4 6627 6626 6631 6629 0.611756 0.259474 0.078 1 4 6632 6633 6634 6635 0.611756 0.259474 0.078 1 4 6636 6632 6635 6637 0.611756 0.259474 0.078 1 4 6633 6638 6639 6634 0.611756 0.259474 0.078 1 4 6633 6632 6636 6638 0.611756 0.259474 0.078 1 4 6635 6634 6639 6637 0.611756 0.259474 0.078 1 4 6640 6641 6642 6643 0.731399 0.651637 0.598462 1 4 6644 6645 6646 6647 0.47 0.2 0.07 1 4 6644 6647 6641 6648 0.47 0.2 0.07 1 4 6649 6648 6641 6640 0.47 0.2 0.07 1 4 6645 6649 6640 6646 0.47 0.2 0.07 1 4 6643 6642 6647 6646 0.731399 0.651637 0.598462 1 4 6644 6650 6651 6645 0.47 0.2 0.07 1 4 6648 6622 6619 6650 0.47 0.2 0.07 1 4 6623 6649 6651 6618 0.47 0.2 0.07 1 4 6652 6653 6654 6655 0.47 0.2 0.07 1 4 6656 6657 6654 6653 0.47 0.2 0.07 1 4 6658 6659 6652 6655 0.47 0.2 0.07 1 4 6657 6658 6655 6654 0.47 0.2 0.07 1 4 6660 6661 6653 6652 0.47 0.2 0.07 1 4 6662 6663 6664 6665 0.47 0.2 0.07 1 4 6653 6661 6663 6656 0.47 0.2 0.07 1 4 6660 6652 6659 6662 0.47 0.2 0.07 1 4 6666 6667 6668 6669 0.611756 0.259474 0.078 1 4 6670 6666 6669 6671 0.611756 0.259474 0.078 1 4 6667 6672 6673 6668 0.611756 0.259474 0.078 1 4 6667 6666 6670 6672 0.611756 0.259474 0.078 1 4 6669 6668 6673 6671 0.611756 0.259474 0.078 1 4 6674 6675 6676 6677 0.611756 0.259474 0.078 1 4 6678 6674 6677 6679 0.611756 0.259474 0.078 1 4 6675 6680 6681 6676 0.611756 0.259474 0.078 1 4 6675 6674 6678 6680 0.611756 0.259474 0.078 1 4 6677 6676 6681 6679 0.611756 0.259474 0.078 1 4 6682 6683 6684 6685 0.731399 0.651637 0.598462 1 4 6686 6687 6688 6689 0.47 0.2 0.07 1 4 6686 6689 6683 6690 0.47 0.2 0.07 1 4 6691 6690 6683 6682 0.47 0.2 0.07 1 4 6687 6691 6682 6688 0.47 0.2 0.07 1 4 6685 6684 6689 6688 0.731399 0.651637 0.598462 1 4 6686 6692 6693 6687 0.47 0.2 0.07 1 4 6690 6664 6661 6692 0.47 0.2 0.07 1 4 6665 6691 6693 6660 0.47 0.2 0.07 1 4 6694 6695 6696 6697 0.47 0.2 0.07 1 4 6698 6699 6696 6695 0.47 0.2 0.07 1 4 6700 6701 6694 6697 0.47 0.2 0.07 1 4 6699 6700 6697 6696 0.47 0.2 0.07 1 4 6702 6703 6695 6694 0.47 0.2 0.07 1 4 6704 6705 6706 6707 0.47 0.2 0.07 1 4 6695 6703 6705 6698 0.47 0.2 0.07 1 4 6702 6694 6701 6704 0.47 0.2 0.07 1 4 6708 6709 6710 6711 0.611756 0.259474 0.078 1 4 6712 6708 6711 6713 0.611756 0.259474 0.078 1 4 6709 6714 6715 6710 0.611756 0.259474 0.078 1 4 6709 6708 6712 6714 0.611756 0.259474 0.078 1 4 6711 6710 6715 6713 0.611756 0.259474 0.078 1 4 6716 6717 6718 6719 0.611756 0.259474 0.078 1 4 6720 6716 6719 6721 0.611756 0.259474 0.078 1 4 6717 6722 6723 6718 0.611756 0.259474 0.078 1 4 6717 6716 6720 6722 0.611756 0.259474 0.078 1 4 6719 6718 6723 6721 0.611756 0.259474 0.078 1 4 6724 6725 6726 6727 0.731399 0.651637 0.598462 1 4 6728 6729 6730 6731 0.47 0.2 0.07 1 4 6728 6731 6725 6732 0.47 0.2 0.07 1 4 6733 6732 6725 6724 0.47 0.2 0.07 1 4 6729 6733 6724 6730 0.47 0.2 0.07 1 4 6727 6726 6731 6730 0.731399 0.651637 0.598462 1 4 6728 6734 6735 6729 0.47 0.2 0.07 1 4 6732 6706 6703 6734 0.47 0.2 0.07 1 4 6707 6733 6735 6702 0.47 0.2 0.07 1 4 6736 6737 6738 6739 1 1 1 1 4 6737 6736 6739 6738 1 1 1 1 4 6740 6741 6748 6749 0.286061 0.22624 0.159772 1 4 6749 6748 6752 6753 0.286061 0.22624 0.159772 1 4 6753 6742 6740 6749 0.286061 0.22624 0.159772 1 4 6753 6752 6743 6742 0.286061 0.22624 0.159772 1 4 6741 6740 6742 6743 0.286061 0.22624 0.159772 1 4 6752 6748 6741 6743 0.286061 0.22624 0.159772 1 4 6751 6750 6744 6745 0.286061 0.22624 0.159772 1 4 6744 6746 6747 6745 0.286061 0.22624 0.159772 1 4 6747 6754 6751 6745 0.286061 0.22624 0.159772 1 4 6754 6747 6746 6755 0.286061 0.22624 0.159772 1 4 6750 6751 6754 6755 0.286061 0.22624 0.159772 1 4 6746 6744 6750 6755 0.286061 0.22624 0.159772 1 4 6741 6744 6750 6748 0.286061 0.22624 0.159772 1 4 6744 6746 6755 6750 0.286061 0.22624 0.159772 1 4 6748 6750 6755 6752 0.286061 0.22624 0.159772 1 4 6752 6755 6746 6743 0.286061 0.22624 0.159772 1 4 6741 6748 6752 6743 0.286061 0.22624 0.159772 1 4 6746 6744 6741 6743 0.286061 0.22624 0.159772 1 4 6745 6740 6749 6751 0.286061 0.22624 0.159772 1 4 6751 6754 6747 6745 0.286061 0.22624 0.159772 1 4 6747 6742 6740 6745 0.286061 0.22624 0.159772 1 4 6742 6747 6754 6753 0.286061 0.22624 0.159772 1 4 6749 6740 6742 6753 0.286061 0.22624 0.159772 1 4 6751 6749 6753 6754 0.286061 0.22624 0.159772 1 4 6759 6757 6756 6758 0 0 0 1 4 6763 6761 6760 6762 0 0 0 1 4 6767 6765 6764 6766 0 0 0 1 4 6771 6769 6768 6770 0 0 0 1 5 6772 6774 6776 6775 6773 0 0 0 1 5 6777 6779 6781 6780 6778 0 0 0 1 24 6828 6826 6824 6822 6820 6818 6816 6814 6812 6810 6808 6806 6804 6802 6800 6798 6796 6794 6792 6790 6788 6786 6784 6782 0.9 0.9 0.9 1 4 6808 6810 6811 6809 0.1 0.3 0.1 1 4 6807 6806 6808 6809 0.1 0.3 0.1 1 4 6805 6804 6806 6807 0.1 0.3 0.1 1 4 6803 6802 6804 6805 0.1 0.3 0.1 1 4 6842 6806 6804 6841 0.1 0.3 0.1 1 4 6844 6810 6808 6843 0.1 0.3 0.1 1 4 6806 6842 6841 6804 0.1 0.3 0.1 1 4 6810 6844 6843 6808 0.1 0.3 0.1 1 4 6866 6842 6841 6865 0.1 0.3 0.1 1 4 6867 6843 6842 6866 0.1 0.3 0.1 1 4 6867 6868 6844 6843 0.1 0.3 0.1 1 4 6806 6842 6843 6808 0.1 0.3 0.1 1 4 6841 6804 6802 6840 0.1 0.3 0.1 1 4 6842 6806 6808 6843 0.1 0.3 0.1 1 4 6804 6841 6840 6802 0.1 0.3 0.1 1 4 6865 6841 6840 6864 0.1 0.3 0.1 1 4 6800 6802 6803 6801 0.1 0.3 0.1 1 4 6799 6798 6800 6801 0.1 0.3 0.1 1 4 6797 6796 6798 6799 0.1 0.3 0.1 1 4 6840 6802 6800 6839 0.1 0.3 0.1 1 4 6802 6840 6839 6800 0.1 0.3 0.1 1 4 6864 6840 6839 6863 0.1 0.3 0.1 1 4 6839 6800 6798 6838 0.1 0.3 0.1 1 4 6800 6839 6838 6798 0.1 0.3 0.1 1 4 6863 6839 6838 6862 0.1 0.3 0.1 1 4 6838 6798 6796 6837 0.1 0.3 0.1 1 4 6798 6838 6837 6796 0.1 0.3 0.1 1 4 6862 6838 6837 6861 0.1 0.3 0.1 1 4 6794 6796 6797 6795 0.1 0.3 0.1 1 4 6792 6794 6795 6793 0.1 0.3 0.1 1 4 6790 6792 6793 6791 0.1 0.3 0.1 1 4 6835 6836 6794 6792 0.1 0.3 0.1 1 4 6792 6794 6836 6835 0.1 0.3 0.1 1 4 6859 6860 6836 6835 0.1 0.3 0.1 1 4 6858 6859 6835 6834 0.1 0.3 0.1 1 4 6836 6860 6861 6837 0.1 0.3 0.1 1 4 6794 6836 6837 6796 0.1 0.3 0.1 1 4 6835 6792 6790 6834 0.1 0.3 0.1 1 4 6836 6794 6796 6837 0.1 0.3 0.1 1 4 6792 6835 6834 6790 0.1 0.3 0.1 1 4 6788 6790 6791 6789 0.1 0.3 0.1 1 4 6786 6788 6789 6787 0.1 0.3 0.1 1 4 6784 6786 6787 6785 0.1 0.3 0.1 1 4 6833 6834 6790 6788 0.1 0.3 0.1 1 4 6786 6832 6833 6788 0.1 0.3 0.1 1 4 6788 6790 6834 6833 0.1 0.3 0.1 1 4 6832 6786 6788 6833 0.1 0.3 0.1 1 4 6857 6858 6834 6833 0.1 0.3 0.1 1 4 6856 6857 6833 6832 0.1 0.3 0.1 1 4 6855 6856 6832 6831 0.1 0.3 0.1 1 4 6832 6786 6784 6831 0.1 0.3 0.1 1 4 6786 6832 6831 6784 0.1 0.3 0.1 1 4 6784 6785 6783 6782 0.1 0.3 0.1 1 4 6831 6784 6782 6830 0.1 0.3 0.1 1 4 6784 6831 6830 6782 0.1 0.3 0.1 1 4 6782 6783 6829 6828 0.1 0.3 0.1 1 4 6828 6829 6827 6826 0.1 0.3 0.1 1 4 6855 6831 6830 6854 0.1 0.3 0.1 1 4 6854 6830 6853 6877 0.1 0.3 0.1 1 4 6876 6877 6853 6852 0.1 0.3 0.1 1 4 6828 6853 6830 6782 0.1 0.3 0.1 1 4 6853 6828 6826 6852 0.1 0.3 0.1 1 4 6853 6828 6782 6830 0.1 0.3 0.1 1 4 6828 6853 6852 6826 0.1 0.3 0.1 1 4 6824 6826 6827 6825 0.1 0.3 0.1 1 4 6824 6825 6823 6822 0.1 0.3 0.1 1 4 6850 6851 6824 6822 0.1 0.3 0.1 1 4 6822 6824 6851 6850 0.1 0.3 0.1 1 4 6875 6876 6852 6851 0.1 0.3 0.1 1 4 6874 6875 6851 6850 0.1 0.3 0.1 1 4 6824 6851 6852 6826 0.1 0.3 0.1 1 4 6851 6824 6826 6852 0.1 0.3 0.1 1 4 6820 6822 6823 6821 0.1 0.3 0.1 1 4 6820 6821 6819 6818 0.1 0.3 0.1 1 4 6849 6850 6822 6820 0.1 0.3 0.1 1 4 6848 6849 6820 6818 0.1 0.3 0.1 1 4 6820 6822 6850 6849 0.1 0.3 0.1 1 4 6818 6820 6849 6848 0.1 0.3 0.1 1 4 6873 6874 6850 6849 0.1 0.3 0.1 1 4 6872 6873 6849 6848 0.1 0.3 0.1 1 4 6816 6818 6819 6817 0.1 0.3 0.1 1 4 6847 6848 6818 6816 0.1 0.3 0.1 1 4 6816 6818 6848 6847 0.1 0.3 0.1 1 4 6871 6872 6848 6847 0.1 0.3 0.1 1 4 6816 6817 6815 6814 0.1 0.3 0.1 1 4 6846 6847 6816 6814 0.1 0.3 0.1 1 4 6814 6816 6847 6846 0.1 0.3 0.1 1 4 6870 6871 6847 6846 0.1 0.3 0.1 1 4 6812 6814 6815 6813 0.1 0.3 0.1 1 4 6845 6846 6814 6812 0.1 0.3 0.1 1 4 6812 6814 6846 6845 0.1 0.3 0.1 1 4 6869 6870 6846 6845 0.1 0.3 0.1 1 4 6844 6868 6869 6845 0.1 0.3 0.1 1 4 6810 6844 6845 6812 0.1 0.3 0.1 1 4 6844 6810 6812 6845 0.1 0.3 0.1 1 4 6810 6812 6813 6811 0.1 0.3 0.1 1 geomview-1.9.5/data/geom/ref.inst0000644000175000017500000000030312310110173013565 00000000000000INST geom { < ref.list } transforms { = TLIST 1 0 0 0 0 1 0 0 0 0 1 0 2 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 2 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 2 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 }geomview-1.9.5/data/geom/ref.list0000644000175000017500000000011012310110173013557 00000000000000LIST < xyz.vect < dodec.quad { = QUAD -1 -1 0 1 -1 0 1 1 0 -1 1 0} geomview-1.9.5/data/geom/ref1.grp0000644000175000017500000000032312310110173013463 00000000000000GROUP 1 0 0 0 0 1 0 0 0 0 1 0 2 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 2 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 2 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 unit { = LIST < xyz.vect < dodec.quad } geomview-1.9.5/data/geom/ref2.list0000644000175000017500000000131112310110173013645 00000000000000LIST # A couple copies of the colored square (csquare.quad), included literally here. { = GROUP 1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 1 0 0 0 0 0 2 0 0 -2 0 0 1 0 0 1 unit { = CQUAD -1 -1 0 1 0 0 1 1 -1 0 0 1 0 1 1 1 0 0 1 0 1 -1 1 0 1 0 0 1 } } # Include Olaf's dodecahedron { < dodec.quad } # Any GeomReference can be enclosed in { }'s # But { }'s are only really needed for geom's, # where the trailing closebrace acts as an end-marker # for the various Load routines. # Finally an INST for a small skewed cube plus a set of axes { = INST transform .5 -.1 0 0 0 .5 .1 0 0 .1 .5 0 0 0 0 1 unit { = LIST < pieces/cube1.off < xyz.vect } } geomview-1.9.5/data/geom/sample.mesh0000644000175000017500000001013112310110173014251 00000000000000ZMESH 20 20 -0.219157 0.140415 0.461548 0.711596 0.878454 0.968101 0.998789 0.994056 0.976466 0.963128 0.963128 0.976466 0.994056 0.998789 0.968102 0.878454 0.711596 0.461548 0.140416 -0.219157 0.140415 0.499804 0.773227 0.938511 0.998789 0.976466 0.904231 0.816109 0.740817 0.698209 0.698209 0.740817 0.816109 0.904231 0.976466 0.998789 0.938511 0.773228 0.499804 0.140416 0.461548 0.773227 0.954415 0.998444 0.927061 0.780121 0.603206 0.437096 0.311734 0.245084 0.245084 0.311734 0.437096 0.603205 0.780121 0.927061 0.998444 0.954416 0.773228 0.461548 0.711596 0.938511 0.998444 0.904231 0.69821 0.437096 0.176034 -0.0431453 -0.196277 -0.273822 -0.273822 -0.196277 -0.0431456 0.176033 0.437096 0.698209 0.90423 0.998444 0.938511 0.711597 0.878454 0.998789 0.927061 0.69821 0.375793 0.0316473 -0.273822 -0.504476 -0.650363 -0.718644 -0.718644 -0.650363 -0.504476 -0.273823 0.0316467 0.375792 0.698209 0.927061 0.998789 0.878455 0.968101 0.976466 0.780121 0.437096 0.0316473 -0.351404 -0.650363 -0.84101 -0.936316 -0.970072 -0.970072 -0.936316 -0.84101 -0.650363 -0.351405 0.0316465 0.437096 0.78012 0.976466 0.968102 0.998789 0.904231 0.603206 0.176034 -0.273822 -0.650363 -0.892742 -0.992067 -0.991092 -0.961902 -0.961902 -0.991092 -0.992067 -0.892742 -0.650364 -0.273823 0.176033 0.603205 0.90423 0.998789 0.994056 0.816109 0.437096 -0.0431453 -0.504476 -0.84101 -0.992067 -0.961902 -0.823487 -0.699656 -0.699656 -0.823487 -0.961902 -0.992067 -0.841011 -0.504477 -0.0431462 0.437095 0.816108 0.994056 0.976466 0.740817 0.311734 -0.196277 -0.650363 -0.936316 -0.991092 -0.823487 -0.522306 -0.262148 -0.262147 -0.522306 -0.823486 -0.991092 -0.936317 -0.650364 -0.196278 0.311733 0.740816 0.976466 0.963128 0.698209 0.245084 -0.273822 -0.718644 -0.970072 -0.961902 -0.699656 -0.262148 0.193541 0.193541 -0.262147 -0.699655 -0.961902 -0.970072 -0.718644 -0.273823 0.245083 0.698209 0.963128 0.963128 0.698209 0.245084 -0.273822 -0.718644 -0.970072 -0.961902 -0.699656 -0.262147 0.193541 0.193542 -0.262147 -0.699655 -0.961902 -0.970072 -0.718645 -0.273823 0.245083 0.698209 0.963128 0.976466 0.740817 0.311734 -0.196277 -0.650363 -0.936316 -0.991092 -0.823487 -0.522306 -0.262147 -0.262147 -0.522305 -0.823486 -0.991092 -0.936317 -0.650364 -0.196278 0.311733 0.740816 0.976466 0.994056 0.816109 0.437096 -0.0431456 -0.504476 -0.84101 -0.992067 -0.961902 -0.823486 -0.699655 -0.699655 -0.823486 -0.961902 -0.992067 -0.841011 -0.504477 -0.0431465 0.437095 0.816108 0.994056 0.998789 0.904231 0.603205 0.176033 -0.273823 -0.650363 -0.892742 -0.992067 -0.991092 -0.961902 -0.961902 -0.991092 -0.992067 -0.892742 -0.650364 -0.273823 0.176032 0.603205 0.90423 0.998789 0.968102 0.976466 0.780121 0.437096 0.0316467 -0.351405 -0.650364 -0.841011 -0.936317 -0.970072 -0.970072 -0.936317 -0.841011 -0.650364 -0.351406 0.0316459 0.437095 0.78012 0.976466 0.968102 0.878454 0.998789 0.927061 0.698209 0.375792 0.0316465 -0.273823 -0.504477 -0.650364 -0.718644 -0.718645 -0.650364 -0.504477 -0.273823 0.0316459 0.375792 0.698209 0.92706 0.998789 0.878455 0.711596 0.938511 0.998444 0.90423 0.698209 0.437096 0.176033 -0.0431462 -0.196278 -0.273823 -0.273823 -0.196278 -0.0431465 0.176032 0.437095 0.698209 0.90423 0.998444 0.938511 0.711597 0.461548 0.773228 0.954416 0.998444 0.927061 0.78012 0.603205 0.437095 0.311733 0.245083 0.245083 0.311733 0.437095 0.603205 0.78012 0.92706 0.998444 0.954416 0.773228 0.461549 0.140416 0.499804 0.773228 0.938511 0.998789 0.976466 0.90423 0.816108 0.740816 0.698209 0.698209 0.740816 0.816108 0.90423 0.976466 0.998789 0.938511 0.773228 0.499805 0.140417 -0.219157 0.140416 0.461548 0.711597 0.878455 0.968102 0.998789 0.994056 0.976466 0.963128 0.963128 0.976466 0.994056 0.998789 0.968102 0.878455 0.711597 0.461549 0.140417 -0.219156 geomview-1.9.5/data/geom/sph12.mesh0000644000175000017500000002477212310110173013745 00000000000000CNMESH # 1/12th of a sphere. 13 13 1.525731 -0.723607 0.447213 0.525731 -0.723607 0.447213 1 0 0 1 1.586899 -0.658726 0.470776 0.586899 -0.658726 0.470776 1 0 0 1 1.643075 -0.588241 0.490334 0.643075 -0.588241 0.490334 1 0 0 1 1.693780 -0.512753 0.505721 0.693780 -0.512753 0.505721 1 0 0 1 1.738585 -0.432903 0.516806 0.738585 -0.432903 0.516806 1 0 0 1 1.777106 -0.349370 0.523495 0.777106 -0.349370 0.523495 1 0 0 1 1.809017 -0.262866 0.525731 0.809017 -0.262866 0.525731 1 0 0 1 1.834046 -0.174125 0.523495 0.834046 -0.174125 0.523495 1 0 0 1 1.851981 -0.083904 0.516806 0.851981 -0.083904 0.516806 1 0 0 1 1.862669 0.007031 0.505721 0.862669 0.007031 0.505721 1 0 0 1 1.866018 0.097907 0.490334 0.866018 0.097907 0.490334 1 0 0 1 1.862001 0.187949 0.470776 0.862001 0.187949 0.470776 1 0 0 1 1.850651 0.276393 0.447213 0.850651 0.276393 0.447213 1 0 0 1 1.499277 -0.687196 0.527716 0.499277 -0.687196 0.527716 1 0 0 1 1.553453 -0.623532 0.552176 0.553453 -0.623532 0.552176 1 0 0 1 1.603430 -0.555138 0.572446 0.603430 -0.555138 0.572446 1 0 0 1 1.648829 -0.482532 0.588373 0.648829 -0.482532 0.588373 1 0 0 1 1.689306 -0.406266 0.599837 0.689306 -0.406266 0.599837 1 0 0 1 1.724554 -0.326917 0.606751 0.724554 -0.326917 0.606751 1 0 0 1 1.754305 -0.245089 0.609061 0.754305 -0.245089 0.609061 1 0 0 1 1.778334 -0.161401 0.606751 0.778334 -0.161401 0.606751 1 0 0 1 1.796458 -0.076489 0.599837 0.796458 -0.076489 0.599837 1 0 0 1 1.808539 0.009004 0.588373 0.808539 0.009004 0.588373 1 0 0 1 1.814487 0.094428 0.572446 0.814487 0.094428 0.572446 1 0 0 1 1.814256 0.179136 0.552176 0.814256 0.179136 0.552176 1 0 0 1 1.807847 0.262485 0.527716 0.807847 0.262485 0.527716 1 0 0 1 1.468576 -0.644939 0.603730 0.468576 -0.644939 0.603730 1 0 0 1 1.515607 -0.583178 0.627736 0.515607 -0.583178 0.627736 1 0 0 1 1.559235 -0.517566 0.647597 0.559235 -0.517566 0.647597 1 0 0 1 1.599169 -0.448536 0.663183 0.599169 -0.448536 0.663183 1 0 0 1 1.635148 -0.376545 0.674389 0.635148 -0.376545 0.674389 1 0 0 1 1.666933 -0.302068 0.681142 0.666933 -0.302068 0.681142 1 0 0 1 1.694314 -0.225597 0.683399 0.694314 -0.225597 0.683399 1 0 0 1 1.717111 -0.147635 0.681142 0.717111 -0.147635 0.681142 1 0 0 1 1.735173 -0.068699 0.674389 0.735173 -0.068699 0.674389 1 0 0 1 1.748381 0.010690 0.663183 0.748381 0.010690 0.663183 1 0 0 1 1.756648 0.090009 0.647597 0.756648 0.090009 0.647597 1 0 0 1 1.759918 0.168734 0.627736 0.759918 0.168734 0.627736 1 0 0 1 1.758172 0.246345 0.603730 0.758172 0.246345 0.603730 1 0 0 1 1.433888 -0.597197 0.674609 0.433888 -0.597197 0.674609 1 0 0 1 1.473922 -0.538133 0.697001 0.473922 -0.538133 0.697001 1 0 0 1 1.511305 -0.476061 0.715495 0.511305 -0.476061 0.715495 1 0 0 1 1.545829 -0.411326 0.729988 0.545829 -0.411326 0.729988 1 0 0 1 1.577300 -0.344290 0.740398 0.577300 -0.344290 0.740398 1 0 0 1 1.605542 -0.275330 0.746667 0.605542 -0.275330 0.746667 1 0 0 1 1.630398 -0.204829 0.748761 0.630398 -0.204829 0.748761 1 0 0 1 1.651728 -0.133183 0.746667 0.651728 -0.133183 0.746667 1 0 0 1 1.669414 -0.060792 0.740398 0.669414 -0.060792 0.740398 1 0 0 1 1.683356 0.011939 0.729988 0.683356 0.011939 0.729988 1 0 0 1 1.693476 0.084603 0.715495 0.693476 0.084603 0.715495 1 0 0 1 1.699718 0.156794 0.697001 0.699718 0.156794 0.697001 1 0 0 1 1.702047 0.228109 0.674609 0.702047 0.228109 0.674609 1 0 0 1 1.395511 -0.544374 0.739749 0.395511 -0.544374 0.739749 1 0 0 1 1.428920 -0.488877 0.759623 0.428920 -0.488877 0.759623 1 0 0 1 1.460361 -0.431135 0.776009 0.460361 -0.431135 0.776009 1 0 0 1 1.489688 -0.371414 0.788833 0.489688 -0.371414 0.788833 1 0 0 1 1.516767 -0.309988 0.798035 0.516767 -0.309988 0.798035 1 0 0 1 1.541473 -0.247139 0.803573 0.541473 -0.247139 0.803573 1 0 0 1 1.563693 -0.183155 0.805422 0.563693 -0.183155 0.805422 1 0 0 1 1.583325 -0.118330 0.803573 0.583325 -0.118330 0.803573 1 0 0 1 1.600280 -0.052962 0.798035 0.600280 -0.052962 0.798035 1 0 0 1 1.614478 0.012649 0.788833 0.614478 0.012649 0.788833 1 0 0 1 1.625855 0.078202 0.776009 0.625855 0.078202 0.776009 1 0 0 1 1.634359 0.143396 0.759623 0.634359 0.143396 0.759623 1 0 0 1 1.639950 0.207932 0.739749 0.639950 0.207932 0.739749 1 0 0 1 1.353768 -0.486921 0.798596 0.353768 -0.486921 0.798596 1 0 0 1 1.381084 -0.435887 0.815339 0.381084 -0.435887 0.815339 1 0 0 1 1.407016 -0.383270 0.829121 0.407016 -0.383270 0.829121 1 0 0 1 1.431470 -0.329262 0.839893 0.431470 -0.329262 0.839893 1 0 0 1 1.454357 -0.274058 0.847615 0.454357 -0.274058 0.847615 1 0 0 1 1.475595 -0.217860 0.852260 0.475595 -0.217860 0.852260 1 0 0 1 1.495106 -0.160870 0.853810 0.495106 -0.160870 0.853810 1 0 0 1 1.512819 -0.103296 0.852260 0.512819 -0.103296 0.852260 1 0 0 1 1.528670 -0.045347 0.847615 0.528670 -0.045347 0.847615 1 0 0 1 1.542602 0.012767 0.839893 0.542602 0.012767 0.839893 1 0 0 1 1.554563 0.070834 0.829121 0.554563 0.070834 0.829121 1 0 0 1 1.564511 0.128644 0.815339 0.564511 0.128644 0.815339 1 0 0 1 1.572410 0.185987 0.798596 0.572410 0.185987 0.798596 1 0 0 1 1.309017 -0.425326 0.850651 0.309017 -0.425326 0.850651 1 0 0 1 1.330853 -0.379639 0.863950 0.330853 -0.379639 0.863950 1 0 0 1 1.351783 -0.332913 0.874882 0.351783 -0.332913 0.874882 1 0 0 1 1.371748 -0.285273 0.883415 0.371748 -0.285273 0.883415 1 0 0 1 1.390694 -0.236852 0.889527 0.390694 -0.236852 0.889527 1 0 0 1 1.408570 -0.187782 0.893201 0.408570 -0.187782 0.893201 1 0 0 1 1.425325 -0.138197 0.894427 0.425325 -0.138197 0.894427 1 0 0 1 1.440915 -0.088233 0.893201 0.440915 -0.088233 0.893201 1 0 0 1 1.455297 -0.038027 0.889527 0.455297 -0.038027 0.889527 1 0 0 1 1.468430 0.012283 0.883415 0.468430 0.012283 0.883415 1 0 0 1 1.480279 0.062559 0.874882 0.480279 0.062559 0.874882 1 0 0 1 1.490812 0.112664 0.863950 0.490812 0.112664 0.863950 1 0 0 1 1.500000 0.162460 0.850651 0.500000 0.162460 0.850651 1 0 0 1 1.261637 -0.360112 0.895469 0.261637 -0.360112 0.895469 1 0 0 1 1.278632 -0.320607 0.905304 0.278632 -0.320607 0.905304 1 0 0 1 1.295084 -0.280478 0.913377 0.295084 -0.280478 0.913377 1 0 0 1 1.310962 -0.239802 0.919672 0.310962 -0.239802 0.919672 1 0 0 1 1.326235 -0.198660 0.924178 0.326235 -0.198660 0.924178 1 0 0 1 1.340873 -0.157132 0.926885 0.340873 -0.157132 0.926885 1 0 0 1 1.354848 -0.115297 0.927787 0.354848 -0.115297 0.927787 1 0 0 1 1.368132 -0.073238 0.926885 0.368132 -0.073238 0.926885 1 0 0 1 1.380699 -0.031037 0.924178 0.380699 -0.031037 0.924178 1 0 0 1 1.392526 0.011225 0.919672 0.392526 0.011225 0.919672 1 0 0 1 1.403589 0.053465 0.913377 0.403589 0.053465 0.913377 1 0 0 1 1.413866 0.095601 0.905304 0.413866 0.095601 0.905304 1 0 0 1 1.423338 0.137551 0.895469 0.423338 0.137551 0.895469 1 0 0 1 1.212031 -0.291836 0.932671 0.212031 -0.291836 0.932671 1 0 0 1 1.224792 -0.259259 0.939283 0.224792 -0.259259 0.939283 1 0 0 1 1.237268 -0.226353 0.944706 0.237268 -0.226353 0.944706 1 0 0 1 1.249443 -0.193159 0.948930 0.249443 -0.193159 0.948930 1 0 0 1 1.261301 -0.159721 0.951951 0.261301 -0.159721 0.951951 1 0 0 1 1.272829 -0.126081 0.953765 0.272829 -0.126081 0.953765 1 0 0 1 1.284010 -0.092281 0.954370 0.284010 -0.092281 0.954370 1 0 0 1 1.294832 -0.058363 0.953765 0.294832 -0.058363 0.953765 1 0 0 1 1.305279 -0.024372 0.951951 0.305279 -0.024372 0.951951 1 0 0 1 1.315340 0.009650 0.948930 0.315340 0.009650 0.948930 1 0 0 1 1.325000 0.043660 0.944706 0.325000 0.043660 0.944706 1 0 0 1 1.334249 0.077615 0.939283 0.334249 0.077615 0.939283 1 0 0 1 1.343074 0.111471 0.932671 0.343074 0.111471 0.932671 1 0 0 1 1.160622 -0.221077 0.961938 0.160622 -0.221077 0.961938 1 0 0 1 1.169683 -0.196060 0.965799 0.169683 -0.196060 0.965799 1 0 0 1 1.178622 -0.170902 0.968962 0.178622 -0.170902 0.968962 1 0 0 1 1.187432 -0.145620 0.971424 0.187432 -0.145620 0.971424 1 0 0 1 1.196106 -0.120232 0.973184 0.196106 -0.120232 0.973184 1 0 0 1 1.204638 -0.094758 0.974240 0.204638 -0.094758 0.974240 1 0 0 1 1.213023 -0.069215 0.974592 0.213023 -0.069215 0.974592 1 0 0 1 1.221253 -0.043623 0.974240 0.221253 -0.043623 0.974240 1 0 0 1 1.229324 -0.017998 0.973184 0.229324 -0.017998 0.973184 1 0 0 1 1.237229 0.007639 0.971424 0.237229 0.007639 0.971424 1 0 0 1 1.244962 0.033271 0.968962 0.244962 0.033271 0.968962 1 0 0 1 1.252518 0.058879 0.965799 0.252518 0.058879 0.965799 1 0 0 1 1.259892 0.084444 0.961938 0.259892 0.084444 0.961938 1 0 0 1 1.107846 -0.148438 0.983024 0.107846 -0.148438 0.983024 1 0 0 1 1.113637 -0.131476 0.984785 0.113637 -0.131476 0.984785 1 0 0 1 1.119391 -0.114472 0.986226 0.119391 -0.114472 0.986226 1 0 0 1 1.125106 -0.097431 0.987348 0.125106 -0.097431 0.987348 1 0 0 1 1.130781 -0.080358 0.988149 0.130781 -0.080358 0.988149 1 0 0 1 1.136413 -0.063259 0.988630 0.136413 -0.063259 0.988630 1 0 0 1 1.142001 -0.046139 0.988791 0.142001 -0.046139 0.988791 1 0 0 1 1.147543 -0.029004 0.988630 0.147543 -0.029004 0.988630 1 0 0 1 1.153037 -0.011860 0.988149 0.153037 -0.011860 0.988149 1 0 0 1 1.158481 0.005287 0.987348 0.158481 0.005287 0.987348 1 0 0 1 1.163874 0.022433 0.986226 0.163874 0.022433 0.986226 1 0 0 1 1.169214 0.039572 0.984785 0.169214 0.039572 0.984785 1 0 0 1 1.174499 0.056698 0.983024 0.174499 0.056698 0.983024 1 0 0 1 1.054154 -0.074536 0.995747 0.054154 -0.074536 0.995747 1 0 0 1 1.056972 -0.065969 0.996194 0.056972 -0.065969 0.996194 1 0 0 1 1.059787 -0.057396 0.996560 0.059787 -0.057396 0.996560 1 0 0 1 1.062596 -0.048819 0.996844 0.062596 -0.048819 0.996844 1 0 0 1 1.065400 -0.040238 0.997048 0.065400 -0.040238 0.997048 1 0 0 1 1.068199 -0.031654 0.997169 0.068199 -0.031654 0.997169 1 0 0 1 1.070992 -0.023067 0.997210 0.070992 -0.023067 0.997210 1 0 0 1 1.073780 -0.014478 0.997169 0.073780 -0.014478 0.997169 1 0 0 1 1.076561 -0.005888 0.997048 0.076561 -0.005888 0.997048 1 0 0 1 1.079336 0.002703 0.996844 0.079336 0.002703 0.996844 1 0 0 1 1.082105 0.011293 0.996560 0.082105 0.011293 0.996560 1 0 0 1 1.084867 0.019882 0.996194 0.084867 0.019882 0.996194 1 0 0 1 1.087622 0.028470 0.995747 0.087622 0.028470 0.995747 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 } geomview-1.9.5/data/geom/sphere.mesh0000644000175000017500000000465612310110173014275 00000000000000MESH 10 10 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.34202 0 0.939693 0.262003 0.219846 0.939693 0.0593912 0.336824 0.939693 -0.17101 0.296198 0.939693 -0.321394 0.116978 0.939693 -0.321394 -0.116978 0.939693 -0.17101 -0.296198 0.939693 0.0593912 -0.336824 0.939693 0.262003 -0.219846 0.939693 0.34202 -8.37708e-17 0.939693 0.642788 0 0.766044 0.492404 0.413176 0.766044 0.111619 0.633022 0.766044 -0.321394 0.55667 0.766044 -0.604023 0.219846 0.766044 -0.604023 -0.219846 0.766044 -0.321394 -0.55667 0.766044 0.111619 -0.633022 0.766044 0.492404 -0.413176 0.766044 0.642788 -1.57438e-16 0.766044 0.866025 0 0.5 0.663414 0.55667 0.5 0.150384 0.852869 0.5 -0.433013 0.75 0.5 -0.813798 0.296198 0.5 -0.813798 -0.296198 0.5 -0.433013 -0.75 0.5 0.150384 -0.852869 0.5 0.663414 -0.55667 0.5 0.866025 -2.12115e-16 0.5 0.984808 0 0.173648 0.754407 0.633022 0.173648 0.17101 0.969846 0.173648 -0.492404 0.852868 0.173648 -0.925417 0.336824 0.173648 -0.925417 -0.336824 0.173648 -0.492404 -0.852869 0.173648 0.17101 -0.969846 0.173648 0.754407 -0.633022 0.173648 0.984808 -2.41208e-16 0.173648 0.984808 0 -0.173648 0.754407 0.633022 -0.173648 0.17101 0.969846 -0.173648 -0.492404 0.852868 -0.173648 -0.925417 0.336824 -0.173648 -0.925417 -0.336824 -0.173648 -0.492404 -0.852869 -0.173648 0.17101 -0.969846 -0.173648 0.754407 -0.633022 -0.173648 0.984808 -2.41208e-16 -0.173648 0.866025 0 -0.5 0.663414 0.55667 -0.5 0.150384 0.852868 -0.5 -0.433013 0.75 -0.5 -0.813798 0.296198 -0.5 -0.813798 -0.296198 -0.5 -0.433013 -0.75 -0.5 0.150384 -0.852868 -0.5 0.663414 -0.55667 -0.5 0.866025 -2.12115e-16 -0.5 0.642788 0 -0.766044 0.492404 0.413176 -0.766044 0.111619 0.633022 -0.766044 -0.321394 0.55667 -0.766044 -0.604023 0.219846 -0.766044 -0.604023 -0.219846 -0.766044 -0.321394 -0.55667 -0.766044 0.111619 -0.633022 -0.766044 0.492404 -0.413176 -0.766044 0.642788 -1.57438e-16 -0.766044 0.34202 0 -0.939693 0.262003 0.219846 -0.939693 0.0593912 0.336824 -0.939693 -0.17101 0.296198 -0.939693 -0.321394 0.116978 -0.939693 -0.321394 -0.116978 -0.939693 -0.17101 -0.296198 -0.939693 0.0593912 -0.336824 -0.939693 0.262003 -0.219846 -0.939693 0.34202 -8.37708e-17 -0.939693 1.22465e-16 0 -1 9.38134e-17 7.87188e-17 -1 2.12658e-17 1.20604e-16 -1 -6.12323e-17 1.06058e-16 -1 -1.15079e-16 4.18854e-17 -1 -1.15079e-16 -4.18854e-17 -1 -6.12323e-17 -1.06058e-16 -1 2.12658e-17 -1.20604e-16 -1 9.38134e-17 -7.87188e-17 -1 1.22465e-16 -2.99952e-32 -1 geomview-1.9.5/data/geom/square.quad0000644000175000017500000000004212310110173014266 00000000000000QUAD -1 -1 0 1 -1 0 1 1 0 -1 1 0 geomview-1.9.5/data/geom/teapot.bez0000644000175000017500000003003712310110173014117 00000000000000BBP 0.850000 0.000000 0.863037 0.850000 0.195999 0.863037 0.696000 0.350000 0.863037 0.500000 0.350000 0.863037 0.834375 0.000000 0.895020 0.834375 0.187250 0.895020 0.687250 0.334379 0.895020 0.500000 0.334379 0.895020 0.859375 0.000000 0.895020 0.859375 0.201250 0.895020 0.701250 0.359381 0.895020 0.500000 0.359381 0.895020 0.875000 0.000000 0.863037 0.875000 0.209999 0.863037 0.710000 0.375000 0.863037 0.500000 0.375000 0.863037 0.500000 0.350000 0.863037 0.304000 0.350000 0.863037 0.150000 0.195999 0.863037 0.150000 0.000000 0.863037 0.500000 0.334379 0.895020 0.312750 0.334379 0.895020 0.165625 0.187250 0.895020 0.165625 0.000000 0.895020 0.500000 0.359381 0.895020 0.298750 0.359381 0.895020 0.140625 0.201250 0.895020 0.140625 0.000000 0.895020 0.500000 0.375000 0.863037 0.290000 0.375000 0.863037 0.125000 0.209999 0.863037 0.125000 0.000000 0.863037 0.150000 0.000000 0.863037 0.150000 -0.195999 0.863037 0.304000 -0.350000 0.863037 0.500000 -0.350000 0.863037 0.165625 0.000000 0.895020 0.165625 -0.187250 0.895020 0.312750 -0.334379 0.895020 0.500000 -0.334379 0.895020 0.140625 0.000000 0.895020 0.140625 -0.201250 0.895020 0.298750 -0.359369 0.895020 0.500000 -0.359369 0.895020 0.125000 0.000000 0.863037 0.125000 -0.209999 0.863037 0.290000 -0.375000 0.863037 0.500000 -0.375000 0.863037 0.500000 -0.350000 0.863037 0.696000 -0.350000 0.863037 0.850000 -0.195999 0.863037 0.850000 0.000000 0.863037 0.500000 -0.334379 0.895020 0.687250 -0.334379 0.895020 0.834375 -0.187250 0.895020 0.834375 0.000000 0.895020 0.500000 -0.359369 0.895020 0.701250 -0.359369 0.895020 0.859375 -0.201250 0.895020 0.859375 0.000000 0.895020 0.500000 -0.375000 0.863037 0.710000 -0.375000 0.863037 0.875000 -0.209999 0.863037 0.875000 0.000000 0.863037 0.875000 0.000000 0.863037 0.875000 0.209999 0.863037 0.710000 0.375000 0.863037 0.500000 0.375000 0.863037 0.937500 0.000000 0.730957 0.937500 0.245001 0.730957 0.745000 0.437500 0.730957 0.500000 0.437500 0.730957 1.000000 0.000000 0.600098 1.000000 0.280001 0.600098 0.780000 0.500000 0.600098 0.500000 0.500000 0.600098 1.000000 0.000000 0.488037 1.000000 0.280001 0.488037 0.780000 0.500000 0.488037 0.500000 0.500000 0.488037 0.500000 0.375000 0.863037 0.290000 0.375000 0.863037 0.125000 0.209999 0.863037 0.125000 0.000000 0.863037 0.500000 0.437500 0.730957 0.255000 0.437500 0.730957 0.062500 0.245001 0.730957 0.062500 0.000000 0.730957 0.500000 0.500000 0.600098 0.220000 0.500000 0.600098 0.000000 0.280001 0.600098 0.000000 0.000000 0.600098 0.500000 0.500000 0.488037 0.220000 0.500000 0.488037 0.000000 0.280001 0.488037 0.000000 0.000000 0.488037 0.125000 0.000000 0.863037 0.125000 -0.209999 0.863037 0.290000 -0.375000 0.863037 0.500000 -0.375000 0.863037 0.062500 0.000000 0.730957 0.062500 -0.245001 0.730957 0.255000 -0.437500 0.730957 0.500000 -0.437500 0.730957 0.000000 0.000000 0.600098 0.000000 -0.280001 0.600098 0.220000 -0.500000 0.600098 0.500000 -0.500000 0.600098 0.000000 0.000000 0.488037 0.000000 -0.280001 0.488037 0.220000 -0.500000 0.488037 0.500000 -0.500000 0.488037 0.500000 -0.375000 0.863037 0.710000 -0.375000 0.863037 0.875000 -0.209999 0.863037 0.875000 0.000000 0.863037 0.500000 -0.437500 0.730957 0.745000 -0.437500 0.730957 0.937500 -0.245001 0.730957 0.937500 0.000000 0.730957 0.500000 -0.500000 0.600098 0.780000 -0.500000 0.600098 1.000000 -0.280001 0.600098 1.000000 0.000000 0.600098 0.500000 -0.500000 0.488037 0.780000 -0.500000 0.488037 1.000000 -0.280001 0.488037 1.000000 0.000000 0.488037 1.000000 0.000000 0.488037 1.000000 0.280001 0.488037 0.780000 0.500000 0.488037 0.500000 0.500000 0.488037 1.000000 0.000000 0.375000 1.000000 0.280001 0.375000 0.780000 0.500000 0.375000 0.500000 0.500000 0.375000 0.875000 0.000000 0.319092 0.875000 0.209999 0.319092 0.710000 0.375000 0.319092 0.500000 0.375000 0.319092 0.875000 0.000000 0.300049 0.875000 0.209999 0.300049 0.710000 0.375000 0.300049 0.500000 0.375000 0.300049 0.500000 0.500000 0.488037 0.220000 0.500000 0.488037 0.000000 0.280001 0.488037 0.000000 0.000000 0.488037 0.500000 0.500000 0.375000 0.220000 0.500000 0.375000 0.000000 0.280001 0.375000 0.000000 0.000000 0.375000 0.500000 0.375000 0.319092 0.290000 0.375000 0.319092 0.125000 0.209999 0.319092 0.125000 0.000000 0.319092 0.500000 0.375000 0.300049 0.290000 0.375000 0.300049 0.125000 0.209999 0.300049 0.125000 0.000000 0.300049 0.000000 0.000000 0.488037 0.000000 -0.280001 0.488037 0.220000 -0.500000 0.488037 0.500000 -0.500000 0.488037 0.000000 0.000000 0.375000 0.000000 -0.280001 0.375000 0.220000 -0.500000 0.375000 0.500000 -0.500000 0.375000 0.125000 0.000000 0.319092 0.125000 -0.209999 0.319092 0.290000 -0.375000 0.319092 0.500000 -0.375000 0.319092 0.125000 0.000000 0.300049 0.125000 -0.209999 0.300049 0.290000 -0.375000 0.300049 0.500000 -0.375000 0.300049 0.500000 -0.500000 0.488037 0.780000 -0.500000 0.488037 1.000000 -0.280001 0.488037 1.000000 0.000000 0.488037 0.500000 -0.500000 0.375000 0.780000 -0.500000 0.375000 1.000000 -0.280001 0.375000 1.000000 0.000000 0.375000 0.500000 -0.375000 0.319092 0.710000 -0.375000 0.319092 0.875000 -0.209999 0.319092 0.875000 0.000000 0.319092 0.500000 -0.375000 0.300049 0.710000 -0.375000 0.300049 0.875000 -0.209999 0.300049 0.875000 0.000000 0.300049 0.100000 0.000000 0.769043 0.100000 0.075001 0.769043 0.125000 0.075001 0.824951 0.125000 0.000000 0.824951 -0.075000 0.000000 0.769043 -0.075000 0.075001 0.769043 -0.125000 0.075001 0.824951 -0.125000 0.000000 0.824951 -0.175000 0.000000 0.769043 -0.175000 0.075001 0.769043 -0.250000 0.075001 0.824951 -0.250000 0.000000 0.824951 -0.175000 0.000000 0.712891 -0.175000 0.075001 0.712891 -0.250000 0.075001 0.712891 -0.250000 0.000000 0.712891 0.125000 0.000000 0.824951 0.125000 -0.075001 0.824951 0.100000 -0.075001 0.769043 0.100000 0.000000 0.769043 -0.125000 0.000000 0.824951 -0.125000 -0.075001 0.824951 -0.075000 -0.075001 0.769043 -0.075000 0.000000 0.769043 -0.250000 0.000000 0.824951 -0.250000 -0.075001 0.824951 -0.175000 -0.075001 0.769043 -0.175000 0.000000 0.769043 -0.250000 0.000000 0.712891 -0.250000 -0.075001 0.712891 -0.175000 -0.075001 0.712891 -0.175000 0.000000 0.712891 -0.175000 0.000000 0.712891 -0.175000 0.075001 0.712891 -0.250000 0.075001 0.712891 -0.250000 0.000000 0.712891 -0.175000 0.000000 0.656006 -0.175000 0.075001 0.656006 -0.250000 0.075001 0.600098 -0.250000 0.000000 0.600098 -0.125000 0.000000 0.543945 -0.125000 0.075001 0.543945 -0.162500 0.075001 0.497070 -0.162500 0.000000 0.497070 0.000000 0.000000 0.488037 0.000000 0.075001 0.488037 0.025000 0.075001 0.413086 0.025000 0.000000 0.413086 -0.250000 0.000000 0.712891 -0.250000 -0.075001 0.712891 -0.175000 -0.075001 0.712891 -0.175000 0.000000 0.712891 -0.250000 0.000000 0.600098 -0.250000 -0.075001 0.600098 -0.175000 -0.075001 0.656006 -0.175000 0.000000 0.656006 -0.162500 0.000000 0.497070 -0.162500 -0.075001 0.497070 -0.125000 -0.075001 0.543945 -0.125000 0.000000 0.543945 0.025000 0.000000 0.413086 0.025000 -0.075001 0.413086 0.000000 -0.075001 0.488037 0.000000 0.000000 0.488037 0.925000 0.000000 0.618896 0.925000 0.165001 0.618896 0.925000 0.165001 0.413086 0.925000 0.000000 0.413086 1.150000 0.000000 0.618896 1.150000 0.165001 0.618896 1.275000 0.165001 0.468994 1.275000 0.000000 0.468994 1.075000 0.000000 0.788086 1.075000 0.062500 0.788086 1.100000 0.062500 0.769043 1.100000 0.000000 0.769043 1.175000 0.000000 0.863037 1.175000 0.062500 0.863037 1.325000 0.062500 0.863037 1.325000 0.000000 0.863037 0.925000 0.000000 0.413086 0.925000 -0.165001 0.413086 0.925000 -0.165001 0.618896 0.925000 0.000000 0.618896 1.275000 0.000000 0.468994 1.275000 -0.165001 0.468994 1.150000 -0.165001 0.618896 1.150000 0.000000 0.618896 1.100000 0.000000 0.769043 1.100000 -0.062500 0.769043 1.075000 -0.062500 0.788086 1.075000 0.000000 0.788086 1.325000 0.000000 0.863037 1.325000 -0.062500 0.863037 1.175000 -0.062500 0.863037 1.175000 0.000000 0.863037 1.175000 0.000000 0.863037 1.175000 0.062500 0.863037 1.325000 0.062500 0.863037 1.325000 0.000000 0.863037 1.200000 0.000000 0.881104 1.200000 0.062500 0.881104 1.381250 0.062500 0.885986 1.381250 0.000000 0.885986 1.225000 0.000000 0.881104 1.225000 0.037500 0.881104 1.362500 0.037500 0.891113 1.362500 0.000000 0.891113 1.200000 0.000000 0.863037 1.200000 0.037500 0.863037 1.300000 0.037500 0.863037 1.300000 0.000000 0.863037 1.325000 0.000000 0.863037 1.325000 -0.062500 0.863037 1.175000 -0.062500 0.863037 1.175000 0.000000 0.863037 1.381250 0.000000 0.885986 1.381250 -0.062500 0.885986 1.200000 -0.062500 0.881104 1.200000 0.000000 0.881104 1.362500 0.000000 0.891113 1.362500 -0.037500 0.891113 1.225000 -0.037500 0.881104 1.225000 0.000000 0.881104 1.300000 0.000000 0.863037 1.300000 -0.037500 0.863037 1.200000 -0.037500 0.863037 1.200000 0.000000 0.863037 0.500000 0.000000 1.050049 0.500000 0.000000 1.050049 0.500000 0.000000 1.050049 0.500000 0.000000 1.050049 0.700000 0.000000 1.050049 0.700000 0.112499 1.050049 0.612500 0.200001 1.050049 0.500000 0.200001 1.050049 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.550000 0.000000 0.937988 0.550000 0.028000 0.937988 0.528000 0.049999 0.937988 0.500000 0.049999 0.937988 0.500000 0.000000 1.050049 0.500000 0.000000 1.050049 0.500000 0.000000 1.050049 0.500000 0.000000 1.050049 0.500000 0.200001 1.050049 0.387500 0.200001 1.050049 0.300000 0.112499 1.050049 0.300000 0.000000 1.050049 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.049999 0.937988 0.472000 0.049999 0.937988 0.450000 0.028000 0.937988 0.450000 0.000000 0.937988 0.500000 0.000000 1.050049 0.500000 -0.000000 1.050049 0.500000 0.000000 1.050049 0.500000 0.000000 1.050049 0.300000 0.000000 1.050049 0.300000 -0.112499 1.050049 0.387500 -0.200001 1.050049 0.500000 -0.200001 1.050049 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.450000 0.000000 0.937988 0.450000 -0.028000 0.937988 0.472000 -0.049999 0.937988 0.500000 -0.049999 0.937988 0.500000 0.000000 1.050049 0.500000 0.000000 1.050049 0.500000 -0.000000 1.050049 0.500000 0.000000 1.050049 0.500000 -0.200001 1.050049 0.612500 -0.200001 1.050049 0.700000 -0.112499 1.050049 0.700000 0.000000 1.050049 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 -0.049999 0.937988 0.528000 -0.049999 0.937988 0.550000 -0.028000 0.937988 0.550000 0.000000 0.937988 0.550000 0.000000 0.937988 0.550000 0.028000 0.937988 0.528000 0.049999 0.937988 0.500000 0.049999 0.937988 0.600000 0.000000 0.899902 0.600000 0.056000 0.899902 0.556000 0.100000 0.899902 0.500000 0.100000 0.899902 0.825000 0.000000 0.899902 0.825000 0.181999 0.899902 0.682000 0.325001 0.899902 0.500000 0.325001 0.899902 0.825000 0.000000 0.863037 0.825000 0.181999 0.863037 0.682000 0.325001 0.863037 0.500000 0.325001 0.863037 0.500000 0.049999 0.937988 0.472000 0.049999 0.937988 0.450000 0.028000 0.937988 0.450000 0.000000 0.937988 0.500000 0.100000 0.899902 0.444000 0.100000 0.899902 0.400000 0.056000 0.899902 0.400000 0.000000 0.899902 0.500000 0.325001 0.899902 0.318000 0.325001 0.899902 0.175000 0.181999 0.899902 0.175000 0.000000 0.899902 0.500000 0.325001 0.863037 0.318000 0.325001 0.863037 0.175000 0.181999 0.863037 0.175000 0.000000 0.863037 0.450000 0.000000 0.937988 0.450000 -0.028000 0.937988 0.472000 -0.049999 0.937988 0.500000 -0.049999 0.937988 0.400000 0.000000 0.899902 0.400000 -0.056000 0.899902 0.444000 -0.100000 0.899902 0.500000 -0.100000 0.899902 0.175000 0.000000 0.899902 0.175000 -0.181999 0.899902 0.318000 -0.325001 0.899902 0.500000 -0.325001 0.899902 0.175000 0.000000 0.863037 0.175000 -0.181999 0.863037 0.318000 -0.325001 0.863037 0.500000 -0.325001 0.863037 0.500000 -0.049999 0.937988 0.528000 -0.049999 0.937988 0.550000 -0.028000 0.937988 0.550000 0.000000 0.937988 0.500000 -0.100000 0.899902 0.556000 -0.100000 0.899902 0.600000 -0.056000 0.899902 0.600000 0.000000 0.899902 0.500000 -0.325001 0.899902 0.682000 -0.325001 0.899902 0.825000 -0.181999 0.899902 0.825000 0.000000 0.899902 0.500000 -0.325001 0.863037 0.682000 -0.325001 0.863037 0.825000 -0.181999 0.863037 0.825000 0.000000 0.863037 geomview-1.9.5/data/geom/tent.mesh0000644000175000017500000000024612310110173013750 00000000000000CMESH 3 3 0 0 0 1 0 0 1 1 0 1 0 1 0 1 2 0 0 0 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 2 1 0 0 0 1 1 0 2 0 1 0 0 1 1 2 1 0 1 0 1 2 2 0 0 0 1 1 geomview-1.9.5/data/geom/tetra0000644000175000017500000000033112310110173013155 00000000000000OFF 4 4 6 0.0 0.0 2.0 1.632993 -0.942809 -0.666667 0.000000 1.885618 -0.666667 -1.632993 -0.942809 -0.666667 3 1 0 3 0.784 0.000 0.000 3 2 0 1 0.000 0.784 0.000 3 3 0 2 0.000 0.000 0.784 3 3 2 1 0.392 0.392 0.392 geomview-1.9.5/data/geom/tetra.off0000644000175000017500000000033112310110173013726 00000000000000OFF 4 4 6 0.0 0.0 2.0 1.632993 -0.942809 -0.666667 0.000000 1.885618 -0.666667 -1.632993 -0.942809 -0.666667 3 1 0 3 0.784 0.000 0.000 3 2 0 1 0.784 0.000 0.000 3 3 0 2 0.784 0.000 0.000 3 3 2 1 0.784 0.000 0.000 geomview-1.9.5/data/geom/torus.bez0000644000175000017500000000077412310110173014004 00000000000000#rational patches for torus (exact) BEZ224 -1.0 .5 0 1 0 0 1.0 0 1.0 .5 0 1 -.5 0 0 0 0 0 .5 0 .5 0 0 0 -1.0 -.5 0 1 0 0 1.0 0 1.0 -.5 0 1 -1.0 -.5 0 1 0 0 1.0 0 1.0 -.5 0 1 .5 0 0 0 0 0 -.5 0 -.5 0 0 0 -1.0 .5 0 1 0 0 1.0 0 1.0 .5 0 1 -1.0 -.5 0 1 0 0 -1.0 0 1.0 -.5 0 1 -.5 0 0 0 0 0 -.5 0 .5 0 0 0 -1.0 .5 0 1 0 0 -1.0 0 1.0 .5 0 1 -1.0 .5 0 1 0 0 -1.0 0 1.0 .5 0 1 .5 0 0 0 0 0 .5 0 -.5 0 0 0 -1.0 -.5 0 1 0 0 -1.0 0 1.0 -.5 0 1 geomview-1.9.5/data/geom/torus3.oogl0000644000175000017500000000342612310110173014244 00000000000000INST transforms { TLIST # Reflect about X and Z axes 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 } geom { LIST { INST transform # Semicircular ends of torus 1 0 0 0 0 1 0 0 0 0 1 0 4 0 0 1 geom < pieces/linkA.bez } { INST transforms { TLIST # Joining pieces 1 0 0 0 0 1 0 0 0 0 1 0 -4 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -4 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 0 0 0 1 } geom { < pieces/linkB.bez } } } # #! /bin/sh # # case "$1" in # [0-9]*) ;; # *) # echo "Usage: mktorus nholes >torus.oogl # Constructs an N-holed torus using Bezier patch pieces in the data directory. # setenv GEOM_PATH /data when displaying the resulting objects # if you're not already in the data directory." >&2 # exit 1 # ;; # esac # # awk ' # BEGIN { # n = '$1'; # xfmt = "\t1 0 0 0\n\t0 %g 0 0\n\t0 0 1 0\n\t%g 0 0 1\n\n"; # print "INST transforms { TLIST # Reflect about X and Z axes"; # print " 1 0 0 0\n 0 1 0 0\n 0 0 1 0\n 0 0 0 1\n"; # print " 1 0 0 0\n 0 1 0 0\n 0 0 -1 0\n 0 0 0 1\n"; # print " -1 0 0 0\n 0 1 0 0\n 0 0 1 0\n 0 0 0 1\n"; # print " -1 0 0 0\n 0 1 0 0\n 0 0 -1 0\n 0 0 0 1\n"; # print " } geom {"; # print " LIST"; # print " { INST transform # Semicircular ends of torus"; # printf xfmt, 1, 2*(n-1); # print " geom < pieces/linkA.bez"; # print " }"; # if(n > 1) { # print " { INST transforms { TLIST # Joining pieces" # for(i = 0; i < n-1; i++) { # printf xfmt, 1, 4*i - 2*n + 2; # printf xfmt, -1, 4*i - 2*n + 2; # } # print " } geom { < pieces/linkB.bez }"; # print " }"; # } # print " }"; # exit # }' geomview-1.9.5/data/geom/torus8.oogl0000644000175000017500000000470312310110173014250 00000000000000INST transforms { TLIST # Reflect about X and Z axes 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 } geom { LIST { INST transform # Semicircular ends of torus 1 0 0 0 0 1 0 0 0 0 1 0 14 0 0 1 geom < pieces/linkA.bez } { INST transforms { TLIST # Joining pieces 1 0 0 0 0 1 0 0 0 0 1 0 -14 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -14 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 -10 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -10 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 -6 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -6 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 -2 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 2 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 2 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 6 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 6 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 10 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 10 0 0 1 } geom { < pieces/linkB.bez } } } # #! /bin/sh # # case "$1" in # [0-9]*) ;; # *) # echo "Usage: mktorus nholes >torus.oogl # Constructs an N-holed torus using Bezier patch pieces in the data directory. # setenv GEOM_PATH /data when displaying the resulting objects # if you're not already in the data directory." >&2 # exit 1 # ;; # esac # # awk ' # BEGIN { # n = '$1'; # xfmt = "\t1 0 0 0\n\t0 %g 0 0\n\t0 0 1 0\n\t%g 0 0 1\n\n"; # print "INST transforms { TLIST # Reflect about X and Z axes"; # print " 1 0 0 0\n 0 1 0 0\n 0 0 1 0\n 0 0 0 1\n"; # print " 1 0 0 0\n 0 1 0 0\n 0 0 -1 0\n 0 0 0 1\n"; # print " -1 0 0 0\n 0 1 0 0\n 0 0 1 0\n 0 0 0 1\n"; # print " -1 0 0 0\n 0 1 0 0\n 0 0 -1 0\n 0 0 0 1\n"; # print " } geom {"; # print " LIST"; # print " { INST transform # Semicircular ends of torus"; # printf xfmt, 1, 2*(n-1); # print " geom < pieces/linkA.bez"; # print " }"; # if(n > 1) { # print " { INST transforms { TLIST # Joining pieces" # for(i = 0; i < n-1; i++) { # printf xfmt, 1, 4*i - 2*n + 2; # printf xfmt, -1, 4*i - 2*n + 2; # } # print " } geom { < pieces/linkB.bez }"; # print " }"; # } # print " }"; # exit # }' # geomview-1.9.5/data/geom/trapezoid.4d.off0000644000175000017500000000073212310110173015123 000000000000004OFF 8 6 12 -1.000000 -1.000000 1.000000 1.0 -1.000000 1.000000 1.000000 1.0 1.000000 1.000000 1.000000 2.0 1.000000 -1.000000 1.000000 2.0 -1.000000 -1.000000 -1.000000 1.0 -1.000000 1.000000 -1.000000 1.0 1.000000 1.000000 -1.000000 2.0 1.000000 -1.000000 -1.000000 2.0 4 0 1 2 3 0.500000 1.000000 0.500000 4 4 5 1 0 1.0 .5 .5 4 2 1 5 6 0.500000 1.000000 0.500000 4 2 6 7 3 1.0 .5 .5 4 0 3 7 4 0.500000 1.000000 0.500000 4 7 6 5 4 0.500000 1.000000 0.500000 geomview-1.9.5/data/geom/tref.mesh0000644000175000017500000003274512310110173013747 00000000000000uvMESH 8 60 1.16052 0 0 1.10194 0.0514176 0.131743 0.960519 0.0727155 0.186313 0.819098 0.0514176 0.131743 0.760519 -6.35699e-09 -1.6288e-08 0.819098 -0.0514176 -0.131743 0.960519 -0.0727155 -0.186313 1.10194 -0.0514176 -0.131743 1.11488 -0.274977 0.102787 1.06204 -0.207072 0.229388 0.928492 -0.145075 0.271265 0.792476 -0.125302 0.203885 0.733664 -0.159337 0.06672 0.786508 -0.227241 -0.0598814 0.920053 -0.289238 -0.101758 1.05607 -0.309011 -0.0343783 0.984481 -0.519288 0.195458 0.942273 -0.437567 0.317817 0.829146 -0.339098 0.348438 0.711368 -0.281563 0.269384 0.657932 -0.298665 0.126963 0.700141 -0.380386 0.00460436 0.813268 -0.478854 -0.0260165 0.931045 -0.53639 0.0530378 0.787642 -0.707791 0.268925 0.7591 -0.616615 0.388523 0.676615 -0.489555 0.410508 0.588505 -0.401041 0.322002 0.546385 -0.402923 0.17485 0.574927 -0.494099 0.0552514 0.657412 -0.621159 0.0332663 0.745522 -0.709673 0.121773 0.551007 -0.825521 0.315604 0.536089 -0.730008 0.434289 0.490474 -0.584891 0.451373 0.440882 -0.475178 0.356848 0.416363 -0.465137 0.206085 0.431281 -0.560649 0.0873993 0.476896 -0.705766 0.0703155 0.526488 -0.815479 0.164841 0.304595 -0.870375 0.330244 0.299527 -0.77469 0.449618 0.29148 -0.622739 0.466275 0.285166 -0.503532 0.370456 0.284285 -0.486898 0.218292 0.289353 -0.582583 0.0989174 0.297401 -0.734534 0.0822608 0.303714 -0.853741 0.178079 0.0760747 -0.853537 0.311039 0.0740177 -0.759045 0.431448 0.0980713 -0.609266 0.45192 0.134145 -0.491938 0.360462 0.161108 -0.475792 0.21065 0.163165 -0.570284 0.0902408 0.139112 -0.720064 0.0697688 0.103038 -0.837391 0.161226 -0.1151 -0.796829 0.260925 -0.121743 -0.701586 0.380576 -0.075998 -0.557967 0.407268 -0.0046616 -0.450102 0.325368 0.0504781 -0.441177 0.182849 0.057121 -0.53642 0.0631992 0.0113757 -0.680038 0.0365064 -0.0599607 -0.787903 0.118407 -0.262324 -0.725952 0.188158 -0.278891 -0.626806 0.303602 -0.223522 -0.487739 0.335634 -0.128651 -0.390214 0.265492 -0.0498526 -0.391361 0.134263 -0.0332857 -0.490506 0.0188199 -0.0886548 -0.629573 -0.0132125 -0.183526 -0.727098 0.0569298 -0.372837 -0.660423 0.104212 -0.400224 -0.556537 0.213249 -0.344836 -0.417888 0.247015 -0.239119 -0.325695 0.185731 -0.145 -0.333963 0.0652954 -0.117613 -0.437849 -0.0437417 -0.173 -0.576498 -0.077508 -0.278717 -0.668691 -0.0162238 -0.463765 -0.605984 0.0183554 -0.497614 -0.500255 0.123746 -0.446192 -0.359881 0.156647 -0.339623 -0.267092 0.0977871 -0.240332 -0.276242 -0.0183554 -0.206483 -0.381971 -0.123745 -0.257904 -0.522344 -0.156647 -0.364474 -0.615134 -0.0977871 -0.555166 -0.555798 -0.066053 -0.586487 -0.453333 0.043269 -0.536201 -0.312889 0.0775972 -0.433767 -0.216737 0.0168226 -0.339189 -0.221202 -0.103454 -0.307869 -0.323667 -0.212776 -0.358154 -0.464111 -0.247104 -0.460588 -0.560263 -0.186329 -0.662885 -0.495954 -0.147625 -0.681035 -0.40325 -0.0271753 -0.623495 -0.267743 0.0147582 -0.523972 -0.16881 -0.0463885 -0.440765 -0.164406 -0.174797 -0.422615 -0.257109 -0.295246 -0.480155 -0.392616 -0.33718 -0.579678 -0.491549 -0.276033 -0.791919 -0.408513 -0.220497 -0.789658 -0.333738 -0.0869485 -0.714942 -0.211761 -0.0324458 -0.61154 -0.114033 -0.0889154 -0.540023 -0.0978028 -0.223278 -0.542285 -0.172577 -0.356826 -0.617 -0.294555 -0.411329 -0.720402 -0.392283 -0.354859 -0.931715 -0.276074 -0.274048 -0.908996 -0.227137 -0.130798 -0.811279 -0.130263 -0.0637276 -0.695807 -0.0421996 -0.112126 -0.630221 -0.0145326 -0.247641 -0.65294 -0.0634692 -0.390891 -0.750656 -0.160343 -0.457961 -0.866129 -0.248407 -0.409563 -1.05796 -0.0900454 -0.298258 -1.02124 -0.0713647 -0.150831 -0.902374 -0.0108795 -0.0757118 -0.770979 0.0559787 -0.116904 -0.704029 0.0900453 -0.250278 -0.740742 0.0713646 -0.397705 -0.859612 0.0108794 -0.472824 -0.991007 -0.0559788 -0.431632 -1.14146 0.144012 -0.288402 -1.09994 0.132584 -0.141513 -0.968686 0.149252 -0.0645272 -0.824597 0.184251 -0.102541 -0.752076 0.217079 -0.233287 -0.793604 0.228506 -0.380175 -0.924855 0.211839 -0.457162 -1.06894 0.17684 -0.419148 -1.15776 0.407336 -0.245681 -1.12011 0.369235 -0.102285 -0.988972 0.339958 -0.0289512 -0.84117 0.336655 -0.0686366 -0.76328 0.361261 -0.198094 -0.800931 0.399361 -0.341489 -0.932066 0.428639 -0.414824 -1.07987 0.431942 -0.375138 -1.09299 0.672381 -0.175534 -1.0662 0.612722 -0.0371343 -0.948404 0.540352 0.0285833 -0.808609 0.497665 -0.0168778 -0.728703 0.509666 -0.146887 -0.755493 0.569325 -0.285287 -0.873287 0.641695 -0.351005 -1.01308 0.684382 -0.305544 -0.946467 0.908233 -0.0859502 -0.935708 0.83295 0.046896 -0.84326 0.724417 0.102624 -0.723279 0.646212 0.0485885 -0.646046 0.644146 -0.0835567 -0.656805 0.71943 -0.216403 -0.749252 0.827962 -0.272131 -0.869234 0.906167 -0.218095 -0.730665 1.08623 0.0136632 -0.739325 1.0018 0.14105 -0.681786 0.867199 0.185811 -0.591754 0.76128 0.121727 -0.521967 0.746088 -0.0136633 -0.513307 0.830522 -0.14105 -0.570846 0.965122 -0.185811 -0.660878 1.07104 -0.121727 -0.468928 1.18519 0.11328 -0.498391 1.0984 0.235879 -0.482009 0.950069 0.26995 -0.429379 0.827089 0.195536 -0.37133 0.801501 0.0562271 -0.341867 0.888294 -0.0663717 -0.358249 1.03662 -0.100443 -0.410879 1.1596 -0.0260293 -0.191185 1.19527 0.202956 -0.240448 1.11266 0.322039 -0.267467 0.964058 0.34691 -0.256415 0.836509 0.263001 -0.213766 0.804731 0.119465 -0.164503 0.887339 0.000382881 -0.137484 1.03594 -0.0244886 -0.148536 1.16349 0.0594201 0.0715552 1.11969 0.273525 0.00608762 1.04645 0.390922 -0.0621312 0.910658 0.409301 -0.0931397 0.791852 0.317896 -0.0687734 0.759628 0.17025 -0.00330586 0.832863 0.0528523 0.064913 0.968656 0.0344734 0.0959215 1.08746 0.125879 0.292849 0.974045 0.317339 0.216954 0.912481 0.435158 0.114124 0.800184 0.450866 0.0445936 0.702937 0.355262 0.0490943 0.677706 0.20435 0.124989 0.73927 0.0865311 0.22782 0.851566 0.0708227 0.29735 0.948813 0.166426 0.455666 0.783464 0.329199 0.37588 0.731588 0.449093 0.248388 0.648694 0.466576 0.147872 0.58334 0.371409 0.133214 0.573809 0.219337 0.213 0.625685 0.0994431 0.340493 0.708579 0.0819592 0.441008 0.773933 0.177127 0.555738 0.577783 0.3076 0.477095 0.529256 0.429632 0.335871 0.474933 0.45279 0.214794 0.446635 0.36351 0.184789 0.46094 0.214089 0.263432 0.509467 0.092057 0.404656 0.56379 0.0688984 0.525733 0.592087 0.158179 0.602318 0.384866 0.256 0.526605 0.331302 0.377778 0.380342 0.297973 0.408237 0.249208 0.304402 0.329535 0.21002 0.346823 0.187774 0.285733 0.400387 0.0659964 0.431996 0.433717 0.0355373 0.56313 0.427288 0.11424 0.614539 0.222932 0.182934 0.540936 0.158042 0.300422 0.39403 0.134413 0.336361 0.259876 0.165886 0.2697 0.21706 0.234025 0.139487 0.290664 0.298915 0.0219997 0.43757 0.322544 -0.01394 0.571723 0.291071 0.0527211 0.612979 0.095046 0.0993822 0.54068 0.018068 0.210192 0.394164 -0.00582397 0.247522 0.259256 0.0373657 0.189504 0.214985 0.122337 0.0701247 0.287283 0.199315 -0.040685 0.4338 0.223207 -0.0780146 0.568707 0.180017 -0.0199969 0.611222 -0.010721 0.0137491 0.540538 -0.0942119 0.120822 0.394549 -0.122515 0.157118 0.258772 -0.0790501 0.101377 0.212745 0.0107211 -0.0137491 0.283429 0.094212 -0.120821 0.429418 0.122515 -0.157118 0.565195 0.0790502 -0.101377 0.61339 -0.115192 -0.0708197 0.544285 -0.194706 0.0402366 0.39885 -0.223834 0.0780755 0.262279 -0.185513 0.0205313 0.214574 -0.102191 -0.0986872 0.283678 -0.0226768 -0.209744 0.429113 0.00645086 -0.247582 0.565684 -0.0318703 -0.190038 0.615312 -0.239266 -0.152347 0.547759 -0.302298 -0.0303013 0.402907 -0.322087 0.0150592 0.265607 -0.287041 -0.0428368 0.216288 -0.21769 -0.170075 0.28384 -0.154658 -0.29212 0.428693 -0.134869 -0.337481 0.565993 -0.169915 -0.279585 0.603881 -0.395892 -0.224523 0.540906 -0.432178 -0.0898047 0.399003 -0.429606 -0.0324589 0.261298 -0.389683 -0.0860778 0.208457 -0.335796 -0.219252 0.271432 -0.299511 -0.35397 0.413335 -0.302083 -0.411316 0.551039 -0.342005 -0.357697 0.558831 -0.58399 -0.277133 0.507196 -0.589659 -0.133143 0.375348 -0.554148 -0.0639586 0.240521 -0.49826 -0.110107 0.181696 -0.454733 -0.244556 0.233331 -0.449064 -0.388546 0.365179 -0.484575 -0.45773 0.500006 -0.540463 -0.411581 0.460625 -0.786688 -0.300868 0.42772 -0.765293 -0.152912 0.316741 -0.693136 -0.0760447 0.192699 -0.612486 -0.115294 0.128255 -0.570585 -0.247667 0.161161 -0.59198 -0.395623 0.272139 -0.664137 -0.472491 0.396181 -0.744787 -0.433242 0.299392 -0.976155 -0.291249 0.290011 -0.936038 -0.143824 0.210899 -0.83139 -0.064948 0.108398 -0.723511 -0.100825 0.0425519 -0.675596 -0.230439 0.0519324 -0.715712 -0.377864 0.131045 -0.82036 -0.456741 0.233546 -0.928239 -0.420864 0.0790576 -1.12191 -0.249294 0.0945587 -1.0727 -0.10518 0.0554833 -0.945547 -0.0294313 -0.0152786 -0.814948 -0.0664208 -0.0762758 -0.757403 -0.19448 -0.0917769 -0.806619 -0.338595 -0.0527016 -0.933767 -0.414343 0.0180604 -1.06437 -0.377354 -0.183404 -1.19818 -0.180182 -0.144337 -1.14866 -0.0407094 -0.139327 -1.01205 0.0281752 -0.171308 -0.868386 -0.0138799 -0.221546 -0.801817 -0.142239 -0.260613 -0.851341 -0.281712 -0.265624 -0.987948 -0.350597 -0.233643 -1.13161 -0.308541 -0.461462 -1.18891 -0.0917207 -0.401911 -1.14637 0.0427267 -0.353031 -1.0142 0.102498 -0.343457 -0.869812 0.0525799 -0.378795 -0.797789 -0.0777862 -0.438347 -0.840321 -0.212234 -0.487226 -0.972494 -0.272005 -0.496801 -1.11688 -0.222087 -0.723964 -1.09057 0.00676369 -0.648297 -1.06073 0.136439 -0.559754 -0.946206 0.18619 -0.510202 -0.814079 0.126874 -0.528668 -0.741749 -0.00676382 -0.604335 -0.771588 -0.136439 -0.692878 -0.886115 -0.18619 -0.74243 -1.01824 -0.126874 -0.940824 -0.912865 0.10525 -0.854478 -0.899628 0.23095 -0.734026 -0.814082 0.27101 -0.650028 -0.70634 0.201964 -0.651688 -0.639515 0.0642574 -0.738035 -0.652752 -0.0614428 -0.858487 -0.738297 -0.101503 -0.942485 -0.846039 -0.032457 -1.08853 -0.676881 0.193738 -0.997652 -0.68186 0.316817 -0.855928 -0.633628 0.348744 -0.746373 -0.560439 0.270817 -0.733165 -0.505166 0.128684 -0.824039 -0.500187 0.00560425 -0.965763 -0.548419 -0.0263231 -1.07532 -0.621608 0.0516043 -1.15439 -0.411236 0.262963 -1.06501 -0.433105 0.385288 -0.914415 -0.426383 0.411896 -0.790829 -0.395009 0.327199 -0.766645 -0.35736 0.180812 -0.85603 -0.335492 0.0584864 -1.00662 -0.342213 0.0318787 -1.13021 -0.373588 0.116575 -1.13886 -0.146839 0.305185 -1.05532 -0.180979 0.428825 -0.908191 -0.214866 0.454064 -0.783664 -0.228648 0.366118 -0.754683 -0.214252 0.216504 -0.838224 -0.180112 0.092864 -0.98535 -0.146226 0.0676249 -1.10988 -0.132444 0.155571 -1.05546 0.0887768 0.315236 -0.978545 0.0496374 0.441659 -0.84448 -0.0185791 0.470027 -0.731805 -0.0759122 0.383722 -0.706522 -0.0887771 0.2333 -0.783442 -0.0496376 0.106877 -0.917506 0.0185788 0.0785087 -1.03018 0.075912 0.164814 -0.928331 0.276899 0.291933 -0.854123 0.24053 0.420782 -0.737062 0.148378 0.455941 -0.645721 0.0544246 0.376816 -0.633605 0.0137061 0.229756 -0.707813 0.0500752 0.100907 -0.824874 0.142227 0.0657474 -0.916215 0.236181 0.144873 -0.786413 0.411864 0.239378 -0.707808 0.383561 0.367642 -0.604695 0.27887 0.410525 -0.537477 0.159117 0.342906 -0.545529 0.0944509 0.204396 -0.624135 0.122753 0.0761325 -0.727247 0.227445 0.0332499 -0.794465 0.347198 0.100869 -0.654558 0.501694 0.166578 -0.565659 0.482781 0.289747 -0.468656 0.374476 0.337622 -0.420373 0.240223 0.282157 -0.449092 0.158665 0.155844 -0.537991 0.177579 0.0326744 -0.634994 0.285884 -0.0152002 -0.683277 0.420137 0.0402643 -0.544702 0.56311 0.0840524 -0.44516 0.552075 0.199815 -0.346799 0.44522 0.248176 -0.30724 0.305139 0.200806 -0.349654 0.21389 0.0854545 -0.449197 0.224925 -0.030308 -0.547557 0.33178 -0.0786691 -0.587116 0.47186 -0.0312995 -0.452733 0.613918 -0.00101605 -0.348389 0.607574 0.110803 -0.246189 0.503719 0.157716 -0.206 0.363191 0.11224 -0.251364 0.268308 0.00101618 -0.355707 0.274652 -0.110803 -0.457908 0.378507 -0.157716 -0.498097 0.519035 -0.11224 -0.362631 0.668195 -0.08614 -0.262962 0.661072 0.0298202 -0.160924 0.557952 0.0786647 -0.11629 0.419239 0.031781 -0.155205 0.326191 -0.0833669 -0.254874 0.333313 -0.199327 -0.356913 0.436434 -0.248172 -0.401547 0.575146 -0.201288 -0.254192 0.732783 -0.168653 -0.16974 0.718503 -0.0417848 -0.0772913 0.610587 0.0151249 -0.0310005 0.47225 -0.0312604 -0.0579844 0.384529 -0.153769 -0.142436 0.398809 -0.280637 -0.234885 0.506725 -0.337546 -0.281176 0.645062 -0.291161 -0.110013 0.802289 -0.24109 -0.0503428 0.778216 -0.102197 0.0198902 0.660879 -0.0334163 0.0595441 0.519011 -0.0750398 0.0453902 0.435717 -0.202685 -0.0142803 0.459789 -0.341578 -0.0845133 0.577127 -0.410358 -0.124167 0.718994 -0.368735 0.0781852 0.857898 -0.292909 0.107284 0.827785 -0.145674 0.143006 0.702118 -0.065905 0.164427 0.554511 -0.100328 0.158998 0.471431 -0.228779 0.129899 0.501545 -0.376013 0.0941767 0.627212 -0.455783 0.0727561 0.774818 -0.42136 0.304792 0.874101 -0.315333 0.303296 0.845848 -0.164897 0.296612 0.719644 -0.0785291 0.288656 0.569419 -0.106822 0.284088 0.483172 -0.233202 0.285584 0.511425 -0.383638 0.292268 0.637629 -0.470007 0.300224 0.787854 -0.441714 0.550501 0.828717 -0.304483 0.523383 0.810292 -0.154962 0.47301 0.695234 -0.0674651 0.428891 0.550942 -0.0932475 0.416869 0.46194 -0.217206 0.443987 0.480365 -0.366727 0.494359 0.595424 -0.454224 0.538479 0.739716 -0.428441 0.787182 0.710215 -0.261619 0.741913 0.707197 -0.115423 0.652769 0.615234 -0.0315931 0.571969 0.488195 -0.0592347 0.546845 0.400499 -0.182156 0.592113 0.403517 -0.328351 0.681258 0.49548 -0.412182 0.762058 0.622519 -0.38454 0.984301 0.520595 -0.191897 0.928727 0.535824 -0.0500835 0.810169 0.476747 0.0266331 0.698077 0.377971 -0.00668668 0.658113 0.297358 -0.130525 0.713687 0.282129 -0.272338 0.832245 0.341206 -0.349054 0.944337 0.439981 -0.315735 1.11489 0.274887 -0.10302 1.05624 0.308999 0.0341975 0.920291 0.289311 0.101735 0.786673 0.227356 0.0600301 0.733659 0.159427 -0.0664871 0.792304 0.125315 -0.203704 0.928254 0.145003 -0.271242 1.06187 0.206958 -0.229537 geomview-1.9.5/data/geom/tref.off0000644000175000017500000012022312310110173013552 00000000000000 OFF 1280 320 1280 5.40414 0.269732 0.917559 4.68585 0.381459 0.739248 4.35375 -1.08202 1.25418 5.02057 -1.34041 1.47509 4.68585 0.381459 0.739248 4.26875 0.269732 0.127895 3.9607 -1.10742 0.617722 4.35375 -1.08202 1.25418 4.26875 0.269732 0.127895 4.39716 2.04672e-08 -0.558376 4.07166 -1.40172 -0.0614581 3.9607 -1.10742 0.617722 4.39716 2.04672e-08 -0.558376 4.99586 -0.269732 -0.917559 4.62163 -1.79253 -0.385507 4.07166 -1.40172 -0.0614581 4.99586 -0.269732 -0.917559 5.71414 -0.381459 -0.739248 5.28845 -2.05092 -0.164601 4.62163 -1.79253 -0.385507 5.71414 -0.381459 -0.739248 6.13125 -0.269732 -0.127895 5.68151 -2.02552 0.471856 5.28845 -2.05092 -0.164601 6.13125 -0.269732 -0.127895 6.00284 -3.25924e-08 0.558376 5.57054 -1.73122 1.15104 5.68151 -2.02552 0.471856 6.00284 -3.25924e-08 0.558376 5.40414 0.269732 0.917559 5.02057 -1.34041 1.47509 5.57054 -1.73122 1.15104 5.02057 -1.34041 1.47509 4.35375 -1.08202 1.25418 3.50273 -2.13266 1.65138 3.97329 -2.64537 1.92691 4.35375 -1.08202 1.25418 3.9607 -1.10742 0.617722 3.21023 -1.99079 0.977188 3.50273 -2.13266 1.65138 3.9607 -1.10742 0.617722 4.07166 -1.40172 -0.0614581 3.26714 -2.30288 0.299266 3.21023 -1.99079 0.977188 4.07166 -1.40172 -0.0614581 4.62163 -1.79253 -0.385507 3.64011 -2.88609 0.0147317 3.26714 -2.30288 0.299266 4.62163 -1.79253 -0.385507 5.28845 -2.05092 -0.164601 4.11067 -3.3988 0.29026 3.64011 -2.88609 0.0147317 5.28845 -2.05092 -0.164601 5.68151 -2.02552 0.471856 4.40317 -3.54067 0.964452 4.11067 -3.3988 0.29026 5.68151 -2.02552 0.471856 5.57054 -1.73122 1.15104 4.34626 -3.22858 1.64237 4.40317 -3.54067 0.964452 5.57054 -1.73122 1.15104 5.02057 -1.34041 1.47509 3.97329 -2.64537 1.92691 4.34626 -3.22858 1.64237 3.97329 -2.64537 1.92691 3.50273 -2.13266 1.65138 2.32872 -2.69887 1.86633 2.51647 -3.36069 2.16123 3.50273 -2.13266 1.65138 3.21023 -1.99079 0.977188 2.21874 -2.4407 1.17246 2.32872 -2.69887 1.86633 3.21023 -1.99079 0.977188 3.26714 -2.30288 0.299266 2.25095 -2.73741 0.486061 2.21874 -2.4407 1.17246 3.26714 -2.30288 0.299266 3.64011 -2.88609 0.0147317 2.40649 -3.41519 0.20923 2.25095 -2.73741 0.486061 3.64011 -2.88609 0.0147317 4.11067 -3.3988 0.29026 2.59424 -4.07701 0.504126 2.40649 -3.41519 0.20923 4.11067 -3.3988 0.29026 4.40317 -3.54067 0.964452 2.70422 -4.33518 1.198 2.59424 -4.07701 0.504126 4.40317 -3.54067 0.964452 4.34626 -3.22858 1.64237 2.67201 -4.03847 1.8844 2.70422 -4.33518 1.198 4.34626 -3.22858 1.64237 3.97329 -2.64537 1.92691 2.51647 -3.36069 2.16123 2.67201 -4.03847 1.8844 2.51647 -3.36069 2.16123 2.32872 -2.69887 1.86633 1.09146 -2.76847 1.84044 0.988244 -3.45903 2.11005 2.32872 -2.69887 1.86633 2.21874 -2.4407 1.17246 1.21227 -2.47805 1.16127 1.09146 -2.76847 1.84044 2.21874 -2.4407 1.17246 2.25095 -2.73741 0.486061 1.27989 -2.7579 0.47038 1.21227 -2.47805 1.16127 2.25095 -2.73741 0.486061 2.40649 -3.41519 0.20923 1.25472 -3.44407 0.17249 1.27989 -2.7579 0.47038 2.40649 -3.41519 0.20923 2.59424 -4.07701 0.504126 1.1515 -4.13463 0.442098 1.25472 -3.44407 0.17249 2.59424 -4.07701 0.504126 2.70422 -4.33518 1.198 1.03069 -4.42505 1.12127 1.1515 -4.13463 0.442098 2.70422 -4.33518 1.198 2.67201 -4.03847 1.8844 0.963072 -4.1452 1.81216 1.03069 -4.42505 1.12127 2.67201 -4.03847 1.8844 2.51647 -3.36069 2.16123 0.988244 -3.45903 2.11005 0.963072 -4.1452 1.81216 0.988244 -3.45903 2.11005 1.09146 -2.76847 1.84044 -0.0214467 -2.47149 1.55103 -0.338791 -3.11465 1.76516 1.09146 -2.76847 1.84044 1.21227 -2.47805 1.16127 0.308461 -2.22665 0.925385 -0.0214467 -2.47149 1.55103 1.21227 -2.47805 1.16127 1.27989 -2.7579 0.47038 0.457677 -2.52356 0.25472 0.308461 -2.22665 0.925385 1.27989 -2.7579 0.47038 1.25472 -3.44407 0.17249 0.338791 -3.18829 -0.0681003 0.457677 -2.52356 0.25472 1.25472 -3.44407 0.17249 1.1515 -4.13463 0.442098 0.0214468 -3.83145 0.146028 0.338791 -3.18829 -0.0681003 1.1515 -4.13463 0.442098 1.03069 -4.42505 1.12127 -0.308461 -4.07629 0.771671 0.0214468 -3.83145 0.146028 1.03069 -4.42505 1.12127 0.963072 -4.1452 1.81216 -0.457677 -3.77938 1.44234 -0.308461 -4.07629 0.771671 0.963072 -4.1452 1.81216 0.988244 -3.45903 2.11005 -0.338791 -3.11465 1.76516 -0.457677 -3.77938 1.44234 -0.338791 -3.11465 1.76516 -0.0214467 -2.47149 1.55103 -0.940341 -2.01935 1.05187 -1.3601 -2.61621 1.2185 -0.0214467 -2.47149 1.55103 0.308461 -2.22665 0.925385 -0.487221 -1.83222 0.486294 -0.940341 -2.01935 1.05187 0.308461 -2.22665 0.925385 0.457677 -2.52356 0.25472 -0.266176 -2.16446 -0.146929 -0.487221 -1.83222 0.486294 0.457677 -2.52356 0.25472 0.338791 -3.18829 -0.0681003 -0.406691 -2.82143 -0.476862 -0.266176 -2.16446 -0.146929 0.338791 -3.18829 -0.0681003 0.0214468 -3.83145 0.146028 -0.826453 -3.4183 -0.310235 -0.406691 -2.82143 -0.476862 0.0214468 -3.83145 0.146028 -0.308461 -4.07629 0.771671 -1.27957 -3.60542 0.255346 -0.826453 -3.4183 -0.310235 -0.308461 -4.07629 0.771671 -0.457677 -3.77938 1.44234 -1.50062 -3.27318 0.888569 -1.27957 -3.60542 0.255346 -0.457677 -3.77938 1.44234 -0.338791 -3.11465 1.76516 -1.3601 -2.61621 1.2185 -1.50062 -3.27318 0.888569 -1.3601 -2.61621 1.2185 -0.940341 -2.01935 1.05187 -1.70702 -1.58035 0.496374 -2.15583 -2.1609 0.643822 -0.940341 -2.01935 1.05187 -0.487221 -1.83222 0.486294 -1.22742 -1.40801 -0.0518083 -1.70702 -1.58035 0.496374 -0.487221 -1.83222 0.486294 -0.266176 -2.16446 -0.146929 -0.997998 -1.74483 -0.679606 -1.22742 -1.40801 -0.0518083 -0.266176 -2.16446 -0.146929 -0.406691 -2.82143 -0.476862 -1.15313 -2.3935 -1.01926 -0.997998 -1.74483 -0.679606 -0.406691 -2.82143 -0.476862 -0.826453 -3.4183 -0.310235 -1.60194 -2.97405 -0.871816 -1.15313 -2.3935 -1.01926 -0.826453 -3.4183 -0.310235 -1.27957 -3.60542 0.255346 -2.08153 -3.14639 -0.323634 -1.60194 -2.97405 -0.871816 -1.27957 -3.60542 0.255346 -1.50062 -3.27318 0.888569 -2.31096 -2.80957 0.304164 -2.08153 -3.14639 -0.323634 -1.50062 -3.27318 0.888569 -1.3601 -2.61621 1.2185 -2.15583 -2.1609 0.643822 -2.31096 -2.80957 0.304164 -2.15583 -2.1609 0.643822 -1.70702 -1.58035 0.496374 -2.39421 -1.15689 0.0458258 -2.87646 -1.71508 0.172585 -1.70702 -1.58035 0.496374 -1.22742 -1.40801 -0.0518083 -1.94502 -0.964008 -0.520957 -2.39421 -1.15689 0.0458258 -1.22742 -1.40801 -0.0518083 -0.997998 -1.74483 -0.679606 -1.79203 -1.24942 -1.19575 -1.94502 -0.964008 -0.520957 -0.997998 -1.74483 -0.679606 -1.15313 -2.3935 -1.01926 -2.02486 -1.84594 -1.58327 -1.79203 -1.24942 -1.19575 -1.15313 -2.3935 -1.01926 -1.60194 -2.97405 -0.871816 -2.50711 -2.40413 -1.45651 -2.02486 -1.84594 -1.58327 -1.60194 -2.97405 -0.871816 -2.08153 -3.14639 -0.323634 -2.9563 -2.59701 -0.889727 -2.50711 -2.40413 -1.45651 -2.08153 -3.14639 -0.323634 -2.31096 -2.80957 0.304164 -3.10929 -2.3116 -0.214934 -2.9563 -2.59701 -0.889727 -2.31096 -2.80957 0.304164 -2.15583 -2.1609 0.643822 -2.87646 -1.71508 0.172585 -3.10929 -2.3116 -0.214934 -2.87646 -1.71508 0.172585 -2.39421 -1.15689 0.0458258 -3.04681 -0.626351 -0.229998 -3.61906 -1.10217 -0.150354 -2.39421 -1.15689 0.0458258 -1.94502 -0.964008 -0.520957 -2.61474 -0.409077 -0.801241 -3.04681 -0.626351 -0.229998 -1.94502 -0.964008 -0.520957 -1.79203 -1.24942 -1.19575 -2.57594 -0.577628 -1.52946 -2.61474 -0.409077 -0.801241 -1.79203 -1.24942 -1.19575 -2.02486 -1.84594 -1.58327 -2.95314 -1.03327 -1.98807 -2.57594 -0.577628 -1.52946 -2.02486 -1.84594 -1.58327 -2.50711 -2.40413 -1.45651 -3.52539 -1.50909 -1.90842 -2.95314 -1.03327 -1.98807 -2.50711 -2.40413 -1.45651 -2.9563 -2.59701 -0.889727 -3.95746 -1.72636 -1.33718 -3.52539 -1.50909 -1.90842 -2.9563 -2.59701 -0.889727 -3.10929 -2.3116 -0.214934 -3.99626 -1.55781 -0.608963 -3.95746 -1.72636 -1.33718 -3.10929 -2.3116 -0.214934 -2.87646 -1.71508 0.172585 -3.61906 -1.10217 -0.150354 -3.99626 -1.55781 -0.608963 -3.61906 -1.10217 -0.150354 -3.04681 -0.626351 -0.229998 -3.61886 0.159764 -0.313688 -4.30848 -0.129308 -0.281055 -3.04681 -0.626351 -0.229998 -2.61474 -0.409077 -0.801241 -3.1525 0.355248 -0.865511 -3.61886 0.159764 -0.313688 -2.61474 -0.409077 -0.801241 -2.57594 -0.577628 -1.52946 -3.18259 0.342633 -1.61327 -3.1525 0.355248 -0.865511 -2.57594 -0.577628 -1.52946 -2.95314 -1.03327 -1.98807 -3.69152 0.129307 -2.11895 -3.18259 0.342633 -1.61327 -2.95314 -1.03327 -1.98807 -3.52539 -1.50909 -1.90842 -4.38114 -0.159764 -2.08631 -3.69152 0.129307 -2.11895 -3.52539 -1.50909 -1.90842 -3.95746 -1.72636 -1.33718 -4.8475 -0.355248 -1.53449 -4.38114 -0.159764 -2.08631 -3.95746 -1.72636 -1.33718 -3.99626 -1.55781 -0.608963 -4.81741 -0.342633 -0.786727 -4.8475 -0.355248 -1.53449 -3.99626 -1.55781 -0.608963 -3.61906 -1.10217 -0.150354 -4.30848 -0.129308 -0.281055 -4.81741 -0.342633 -0.786727 -4.30848 -0.129308 -0.281055 -3.61886 0.159764 -0.313688 -3.91921 1.25858 -0.190259 -4.66728 1.24921 -0.167393 -3.61886 0.159764 -0.313688 -3.1525 0.355248 -0.865511 -3.4073 1.35338 -0.728003 -3.91921 1.25858 -0.190259 -3.1525 0.355248 -0.865511 -3.18259 0.342633 -1.61327 -3.43141 1.47808 -1.46562 -3.4073 1.35338 -0.728003 -3.18259 0.342633 -1.61327 -3.69152 0.129307 -2.11895 -3.97742 1.55963 -1.97103 -3.43141 1.47808 -1.46562 -3.69152 0.129307 -2.11895 -4.38114 -0.159764 -2.08631 -4.72549 1.55026 -1.94816 -3.97742 1.55963 -1.97103 -4.38114 -0.159764 -2.08631 -4.8475 -0.355248 -1.53449 -5.2374 1.45546 -1.41042 -4.72549 1.55026 -1.94816 -4.8475 -0.355248 -1.53449 -4.81741 -0.342633 -0.786727 -5.21329 1.33076 -0.672799 -5.2374 1.45546 -1.41042 -4.81741 -0.342633 -0.786727 -4.30848 -0.129308 -0.281055 -4.66728 1.24921 -0.167393 -5.21329 1.33076 -0.672799 -4.66728 1.24921 -0.167393 -3.91921 1.25858 -0.190259 -3.7162 2.51802 0.1314 -4.40172 2.81292 0.189037 -3.91921 1.25858 -0.190259 -3.4073 1.35338 -0.728003 -3.20952 2.45964 -0.41639 -3.7162 2.51802 0.1314 -3.4073 1.35338 -0.728003 -3.43141 1.47808 -1.46562 -3.17847 2.67196 -1.13344 -3.20952 2.45964 -0.41639 -3.43141 1.47808 -1.46562 -3.97742 1.55963 -1.97103 -3.64124 3.03062 -1.59972 -3.17847 2.67196 -1.13344 -3.97742 1.55963 -1.97103 -4.72549 1.55026 -1.94816 -4.32676 3.32552 -1.54208 -3.64124 3.03062 -1.59972 -4.72549 1.55026 -1.94816 -5.2374 1.45546 -1.41042 -4.83344 3.3839 -0.994294 -4.32676 3.32552 -1.54208 -5.2374 1.45546 -1.41042 -5.21329 1.33076 -0.672799 -4.86449 3.17158 -0.27724 -4.83344 3.3839 -0.994294 -5.21329 1.33076 -0.672799 -4.66728 1.24921 -0.167393 -4.40172 2.81292 0.189037 -4.86449 3.17158 -0.27724 -4.40172 2.81292 0.189037 -3.7162 2.51802 0.1314 -2.92684 3.61849 0.592935 -3.42313 4.16536 0.71483 -3.7162 2.51802 0.1314 -3.20952 2.45964 -0.41639 -2.50141 3.40931 0.0137415 -2.92684 3.61849 0.592935 -3.20952 2.45964 -0.41639 -3.17847 2.67196 -1.13344 -2.39605 3.66033 -0.683465 -2.50141 3.40931 0.0137415 -3.17847 2.67196 -1.13344 -3.64124 3.03062 -1.59972 -2.67247 4.22452 -1.09027 -2.39605 3.66033 -0.683465 -3.64124 3.03062 -1.59972 -4.32676 3.32552 -1.54208 -3.16876 4.77139 -0.968377 -2.67247 4.22452 -1.09027 -4.32676 3.32552 -1.54208 -4.83344 3.3839 -0.994294 -3.59419 4.98057 -0.389184 -3.16876 4.77139 -0.968377 -4.83344 3.3839 -0.994294 -4.86449 3.17158 -0.27724 -3.69955 4.72955 0.308023 -3.59419 4.98057 -0.389184 -4.86449 3.17158 -0.27724 -4.40172 2.81292 0.189037 -3.42313 4.16536 0.71483 -3.69955 4.72955 0.308023 -3.42313 4.16536 0.71483 -2.92684 3.61849 0.592935 -1.69742 4.24431 1.09751 -1.91179 4.93433 1.29277 -2.92684 3.61849 0.592935 -2.50141 3.40931 0.0137415 -1.4194 3.93231 0.476566 -1.69742 4.24431 1.09751 -2.50141 3.40931 0.0137415 -2.39605 3.66033 -0.683465 -1.24057 4.1811 -0.206321 -1.4194 3.93231 0.476566 -2.39605 3.66033 -0.683465 -2.67247 4.22452 -1.09027 -1.26569 4.84495 -0.551127 -1.24057 4.1811 -0.206321 -2.67247 4.22452 -1.09027 -3.16876 4.77139 -0.968377 -1.48006 5.53497 -0.355869 -1.26569 4.84495 -0.551127 -3.16876 4.77139 -0.968377 -3.59419 4.98057 -0.389184 -1.75808 5.84697 0.265073 -1.48006 5.53497 -0.355869 -3.59419 4.98057 -0.389184 -3.69955 4.72955 0.308023 -1.93691 5.59818 0.947961 -1.75808 5.84697 0.265073 -3.69955 4.72955 0.308023 -3.42313 4.16536 0.71483 -1.91179 4.93433 1.29277 -1.93691 5.59818 0.947961 -1.91179 4.93433 1.29277 -1.69742 4.24431 1.09751 -0.332444 4.23989 1.53801 -0.226866 4.93456 1.79588 -1.69742 4.24431 1.09751 -1.4194 3.93231 0.476566 -0.24328 3.90175 0.876246 -0.332444 4.23989 1.53801 -1.4194 3.93231 0.476566 -1.24057 4.1811 -0.206321 -0.011607 4.11822 0.198249 -0.24328 3.90175 0.876246 -1.24057 4.1811 -0.206321 -1.26569 4.84495 -0.551127 0.226866 4.7625 -0.098823 -0.011607 4.11822 0.198249 -1.26569 4.84495 -0.551127 -1.48006 5.53497 -0.355869 0.332443 5.45717 0.15905 0.226866 4.7625 -0.098823 -1.48006 5.53497 -0.355869 -1.75808 5.84697 0.265073 0.24328 5.79531 0.82081 0.332443 5.45717 0.15905 -1.75808 5.84697 0.265073 -1.93691 5.59818 0.947961 0.0116062 5.57884 1.49881 0.24328 5.79531 0.82081 -1.93691 5.59818 0.947961 -1.91179 4.93433 1.29277 -0.226866 4.93456 1.79588 0.0116062 5.57884 1.49881 -0.226866 4.93456 1.79588 -0.332444 4.23989 1.53801 0.855804 3.65823 1.82156 1.25493 4.22065 2.11241 -0.332444 4.23989 1.53801 -0.24328 3.90175 0.876246 0.746559 3.38793 1.1322 0.855804 3.65823 1.82156 -0.24328 3.90175 0.876246 -0.011607 4.11822 0.198249 0.991187 3.56808 0.448155 0.746559 3.38793 1.1322 -0.011607 4.11822 0.198249 0.226866 4.7625 -0.098823 1.44639 4.09315 0.170129 0.991187 3.56808 0.448155 0.226866 4.7625 -0.098823 0.332443 5.45717 0.15905 1.84552 4.65557 0.460984 1.44639 4.09315 0.170129 0.332443 5.45717 0.15905 0.24328 5.79531 0.82081 1.95476 4.92587 1.15034 1.84552 4.65557 0.460984 0.24328 5.79531 0.82081 0.0116062 5.57884 1.49881 1.71013 4.74572 1.83439 1.95476 4.92587 1.15034 0.0116062 5.57884 1.49881 -0.226866 4.93456 1.79588 1.25493 4.22065 2.11241 1.71013 4.74572 1.83439 1.25493 4.22065 2.11241 0.855804 3.65823 1.82156 1.67381 2.69508 1.88053 2.28014 3.03259 2.161 0.855804 3.65823 1.82156 0.746559 3.38793 1.1322 1.39961 2.58551 1.19277 1.67381 2.69508 1.88053 0.746559 3.38793 1.1322 0.991187 3.56808 0.448155 1.61817 2.76807 0.500584 1.39961 2.58551 1.19277 0.991187 3.56808 0.448155 1.44639 4.09315 0.170129 2.20146 3.13581 0.209458 1.61817 2.76807 0.500584 1.44639 4.09315 0.170129 1.84552 4.65557 0.460984 2.80779 3.47332 0.489925 2.20146 3.13581 0.209458 1.84552 4.65557 0.460984 1.95476 4.92587 1.15034 3.08199 3.58289 1.17769 2.80779 3.47332 0.489925 1.95476 4.92587 1.15034 1.71013 4.74572 1.83439 2.86343 3.40033 1.86988 3.08199 3.58289 1.17769 1.71013 4.74572 1.83439 1.25493 4.22065 2.11241 2.28014 3.03259 2.161 2.86343 3.40033 1.86988 2.28014 3.03259 2.161 1.67381 2.69508 1.88053 2.08869 1.58409 1.67757 2.7921 1.69244 1.90928 1.67381 2.69508 1.88053 1.39961 2.58551 1.19277 1.72313 1.68221 1.03185 2.08869 1.58409 1.67757 1.39961 2.58551 1.19277 1.61817 2.76807 0.500584 1.90955 1.92931 0.350383 1.72313 1.68221 1.03185 1.61817 2.76807 0.500584 2.20146 3.13581 0.209458 2.53876 2.18066 0.032359 1.90955 1.92931 0.350383 2.20146 3.13581 0.209458 2.80779 3.47332 0.489925 3.24217 2.28901 0.264073 2.53876 2.18066 0.032359 2.80779 3.47332 0.489925 3.08199 3.58289 1.17769 3.60773 2.1909 0.90979 3.24217 2.28901 0.264073 3.08199 3.58289 1.17769 2.86343 3.40033 1.86988 3.42131 1.94379 1.59126 3.60773 2.1909 0.90979 2.86343 3.40033 1.86988 2.28014 3.03259 2.161 2.7921 1.69244 1.90928 3.42131 1.94379 1.59126 2.7921 1.69244 1.90928 2.08869 1.58409 1.67757 2.21251 0.519551 1.23531 2.93865 0.481104 1.41266 2.08869 1.58409 1.67757 1.72313 1.68221 1.03185 1.8231 0.784179 0.653465 2.21251 0.519551 1.23531 1.72313 1.68221 1.03185 1.90955 1.92931 0.350383 1.99854 1.11997 0.00795818 1.8231 0.784179 0.653465 1.90955 1.92931 0.350383 2.53876 2.18066 0.032359 2.63605 1.33023 -0.323081 1.99854 1.11997 0.00795818 2.53876 2.18066 0.032359 3.24217 2.28901 0.264073 3.36219 1.29178 -0.145733 2.63605 1.33023 -0.323081 3.24217 2.28901 0.264073 3.60773 2.1909 0.90979 3.7516 1.02715 0.436113 3.36219 1.29178 -0.145733 3.60773 2.1909 0.90979 3.42131 1.94379 1.59126 3.57616 0.691358 1.08162 3.7516 1.02715 0.436113 3.42131 1.94379 1.59126 2.7921 1.69244 1.90928 2.93865 0.481104 1.41266 3.57616 0.691358 1.08162 2.93865 0.481104 1.41266 2.21251 0.519551 1.23531 2.22497 -0.407733 0.677821 2.95272 -0.4979 0.827717 2.21251 0.519551 1.23531 1.8231 0.784179 0.653465 1.83407 -0.0787205 0.130867 2.22497 -0.407733 0.677821 1.8231 0.784179 0.653465 1.99854 1.11997 0.00795818 2.009 0.296405 -0.492747 1.83407 -0.0787205 0.130867 1.99854 1.11997 0.00795818 2.63605 1.33023 -0.323081 2.64728 0.497901 -0.827717 2.009 0.296405 -0.492747 2.63605 1.33023 -0.323081 3.36219 1.29178 -0.145733 3.37503 0.407733 -0.677821 2.64728 0.497901 -0.827717 3.36219 1.29178 -0.145733 3.7516 1.02715 0.436113 3.76593 0.0787212 -0.130867 3.37503 0.407733 -0.677821 3.7516 1.02715 0.436113 3.57616 0.691358 1.08162 3.591 -0.296404 0.492748 3.76593 0.0787212 -0.130867 3.57616 0.691358 1.08162 2.93865 0.481104 1.41266 2.95272 -0.4979 0.827717 3.591 -0.296404 0.492748 2.95272 -0.4979 0.827717 2.22497 -0.407733 0.677821 2.21551 -1.22908 0.179609 2.94232 -1.34697 0.314034 2.22497 -0.407733 0.677821 1.83407 -0.0787205 0.130867 1.82368 -0.921732 -0.379158 2.21551 -1.22908 0.179609 1.83407 -0.0787205 0.130867 2.009 0.296405 -0.492747 1.99636 -0.604974 -1.03495 1.82368 -0.921732 -0.379158 2.009 0.296405 -0.492747 2.64728 0.497901 -0.827717 2.63238 -0.464356 -1.40361 1.99636 -0.604974 -1.03495 2.64728 0.497901 -0.827717 3.37503 0.407733 -0.677821 3.35919 -0.58225 -1.26918 2.63238 -0.464356 -1.40361 3.37503 0.407733 -0.677821 3.76593 0.0787212 -0.130867 3.75102 -0.889596 -0.710418 3.35919 -0.58225 -1.26918 3.76593 0.0787212 -0.130867 3.591 -0.296404 0.492748 3.57834 -1.20635 -0.0546273 3.75102 -0.889596 -0.710418 3.591 -0.296404 0.492748 2.95272 -0.4979 0.827717 2.94232 -1.34697 0.314034 3.57834 -1.20635 -0.0546273 2.94232 -1.34697 0.314034 2.21551 -1.22908 0.179609 2.13317 -2.04219 -0.157256 2.84615 -2.24907 -0.0619664 2.21551 -1.22908 0.179609 1.82368 -0.921732 -0.379158 1.73199 -1.77342 -0.729121 2.13317 -2.04219 -0.157256 1.82368 -0.921732 -0.379158 1.99636 -0.604974 -1.03495 1.8776 -1.60022 -1.44257 1.73199 -1.77342 -0.729121 1.99636 -0.604974 -1.03495 2.63238 -0.464356 -1.40361 2.48471 -1.62403 -1.87967 1.8776 -1.60022 -1.44257 2.63238 -0.464356 -1.40361 3.35919 -0.58225 -1.26918 3.19769 -1.83091 -1.78438 2.48471 -1.62403 -1.87967 3.35919 -0.58225 -1.26918 3.75102 -0.889596 -0.710418 3.59887 -2.09968 -1.21252 3.19769 -1.83091 -1.78438 3.75102 -0.889596 -0.710418 3.57834 -1.20635 -0.0546273 3.45326 -2.27288 -0.499071 3.59887 -2.09968 -1.21252 3.57834 -1.20635 -0.0546273 2.94232 -1.34697 0.314034 2.84615 -2.24907 -0.0619664 3.45326 -2.27288 -0.499071 2.84615 -2.24907 -0.0619664 2.13317 -2.04219 -0.157256 1.84486 -2.91718 -0.306775 2.48637 -3.30036 -0.263648 2.13317 -2.04219 -0.157256 1.73199 -1.77342 -0.729121 1.43529 -2.63184 -0.864489 1.84486 -2.91718 -0.306775 1.73199 -1.77342 -0.729121 1.8776 -1.60022 -1.44257 1.49758 -2.61149 -1.61009 1.43529 -2.63184 -0.864489 1.8776 -1.60022 -1.44257 2.48471 -1.62403 -1.87967 1.99523 -2.86804 -2.10681 1.49758 -2.61149 -1.61009 2.48471 -1.62403 -1.87967 3.19769 -1.83091 -1.78438 2.63674 -3.25122 -2.06369 1.99523 -2.86804 -2.10681 3.19769 -1.83091 -1.78438 3.59887 -2.09968 -1.21252 3.04631 -3.53656 -1.50597 2.63674 -3.25122 -2.06369 3.59887 -2.09968 -1.21252 3.45326 -2.27288 -0.499071 2.98402 -3.55691 -0.760371 3.04631 -3.53656 -1.50597 3.45326 -2.27288 -0.499071 2.84615 -2.24907 -0.0619664 2.48637 -3.30036 -0.263648 2.98402 -3.55691 -0.760371 2.48637 -3.30036 -0.263648 1.84486 -2.91718 -0.306775 1.18771 -3.78053 -0.253501 1.6523 -4.36707 -0.235078 1.84486 -2.91718 -0.306775 1.43529 -2.63184 -0.864489 0.818574 -3.41446 -0.791968 1.18771 -3.78053 -0.253501 1.43529 -2.63184 -0.864489 1.49758 -2.61149 -1.61009 0.761125 -3.48331 -1.53505 0.818574 -3.41446 -0.791968 1.49758 -2.61149 -1.61009 1.99523 -2.86804 -2.10681 1.04902 -3.94673 -2.04746 0.761125 -3.48331 -1.53505 1.99523 -2.86804 -2.10681 2.63674 -3.25122 -2.06369 1.51361 -4.53327 -2.02904 1.04902 -3.94673 -2.04746 2.63674 -3.25122 -2.06369 3.04631 -3.53656 -1.50597 1.88275 -4.89934 -1.49057 1.51361 -4.53327 -2.02904 3.04631 -3.53656 -1.50597 2.98402 -3.55691 -0.760371 1.94019 -4.83049 -0.747489 1.88275 -4.89934 -1.49057 2.98402 -3.55691 -0.760371 2.48637 -3.30036 -0.263648 1.6523 -4.36707 -0.235078 1.94019 -4.83049 -0.747489 1.6523 -4.36707 -0.235078 1.18771 -3.78053 -0.253501 0.108625 -4.3857 0.00606821 0.299132 -5.10845 0.0455106 1.18771 -3.78053 -0.253501 0.818574 -3.41446 -0.791968 -0.145512 -3.93407 -0.533985 0.108625 -4.3857 0.00606821 0.818574 -3.41446 -0.791968 0.761125 -3.48331 -1.53505 -0.31441 -4.01812 -1.25829 -0.145512 -3.93407 -0.533985 0.761125 -3.48331 -1.53505 1.04902 -3.94673 -2.04746 -0.29913 -4.58861 -1.74257 -0.31441 -4.01812 -1.25829 1.04902 -3.94673 -2.04746 1.51361 -4.53327 -2.02904 -0.108624 -5.31136 -1.70312 -0.29913 -4.58861 -1.74257 1.51361 -4.53327 -2.02904 1.88275 -4.89934 -1.49057 0.145513 -5.76299 -1.16307 -0.108624 -5.31136 -1.70312 1.88275 -4.89934 -1.49057 1.94019 -4.83049 -0.747489 0.314411 -5.67894 -0.438763 0.145513 -5.76299 -1.16307 1.94019 -4.83049 -0.747489 1.6523 -4.36707 -0.235078 0.299132 -5.10845 0.0455106 0.314411 -5.67894 -0.438763 0.299132 -5.10845 0.0455106 0.108625 -4.3857 0.00606821 -1.22485 -4.46327 0.430515 -1.34907 -5.19507 0.52674 0.108625 -4.3857 0.00606821 -0.145512 -3.93407 -0.533985 -1.3138 -3.98124 -0.135122 -1.22485 -4.46327 0.430515 -0.145512 -3.93407 -0.533985 -0.31441 -4.01812 -1.25829 -1.5638 -4.03133 -0.838828 -1.3138 -3.98124 -0.135122 -0.31441 -4.01812 -1.25829 -0.29913 -4.58861 -1.74257 -1.82841 -4.58421 -1.26838 -1.5638 -4.03133 -0.838828 -0.29913 -4.58861 -1.74257 -0.108624 -5.31136 -1.70312 -1.95263 -5.31601 -1.17216 -1.82841 -4.58421 -1.26838 -0.108624 -5.31136 -1.70312 0.145513 -5.76299 -1.16307 -1.86368 -5.79804 -0.60652 -1.95263 -5.31601 -1.17216 0.145513 -5.76299 -1.16307 0.314411 -5.67894 -0.438763 -1.61368 -5.74795 0.0971859 -1.86368 -5.79804 -0.60652 0.314411 -5.67894 -0.438763 0.299132 -5.10845 0.0455106 -1.34907 -5.19507 0.52674 -1.61368 -5.74795 0.0971859 -1.34907 -5.19507 0.52674 -1.22485 -4.46327 0.430515 -2.48435 -3.90592 0.932929 -2.8963 -4.50756 1.10186 -1.22485 -4.46327 0.430515 -1.3138 -3.98124 -0.135122 -2.40247 -3.47358 0.327462 -2.48435 -3.90592 0.932929 -1.3138 -3.98124 -0.135122 -1.5638 -4.03133 -0.838828 -2.69861 -3.4638 -0.359864 -2.40247 -3.47358 0.327462 -1.5638 -4.03133 -0.838828 -1.82841 -4.58421 -1.26838 -3.1993 -3.88232 -0.726422 -2.69861 -3.4638 -0.359864 -1.82841 -4.58421 -1.26838 -1.95263 -5.31601 -1.17216 -3.61125 -4.48396 -0.557487 -3.1993 -3.88232 -0.726422 -1.95263 -5.31601 -1.17216 -1.86368 -5.79804 -0.60652 -3.69313 -4.9163 0.0479803 -3.61125 -4.48396 -0.557487 -1.86368 -5.79804 -0.60652 -1.61368 -5.74795 0.0971859 -3.39699 -4.92608 0.735306 -3.69313 -4.9163 0.0479803 -1.61368 -5.74795 0.0971859 -1.34907 -5.19507 0.52674 -2.8963 -4.50756 1.10186 -3.39699 -4.92608 0.735306 -2.8963 -4.50756 1.10186 -2.48435 -3.90592 0.932929 -3.34524 -2.83435 1.40634 -3.95958 -3.18994 1.64375 -2.48435 -3.90592 0.932929 -2.40247 -3.47358 0.327462 -3.12704 -2.52998 0.758304 -3.34524 -2.83435 1.40634 -2.40247 -3.47358 0.327462 -2.69861 -3.4638 -0.359864 -3.43278 -2.45512 0.0792394 -3.12704 -2.52998 0.758304 -2.69861 -3.4638 -0.359864 -3.1993 -3.88232 -0.726422 -4.08338 -2.65362 -0.233062 -3.43278 -2.45512 0.0792394 -3.1993 -3.88232 -0.726422 -3.61125 -4.48396 -0.557487 -4.69772 -3.00921 0.0043401 -4.08338 -2.65362 -0.233062 -3.61125 -4.48396 -0.557487 -3.69313 -4.9163 0.0479803 -4.91592 -3.31358 0.65238 -4.69772 -3.00921 0.0043401 -3.69313 -4.9163 0.0479803 -3.39699 -4.92608 0.735306 -4.61018 -3.38844 1.33144 -4.91592 -3.31358 0.65238 -3.39699 -4.92608 0.735306 -2.8963 -4.50756 1.10186 -3.95958 -3.18994 1.64375 -4.61018 -3.38844 1.33144 -3.95958 -3.18994 1.64375 -3.34524 -2.83435 1.40634 -3.6318 -1.52494 1.75109 -4.32367 -1.56765 2.03342 -3.34524 -2.83435 1.40634 -3.12704 -2.52998 0.758304 -3.34445 -1.41163 1.06933 -3.6318 -1.52494 1.75109 -3.12704 -2.52998 0.758304 -3.43278 -2.45512 0.0792394 -3.62993 -1.2941 0.387497 -3.34445 -1.41163 1.06933 -3.43278 -2.45512 0.0792394 -4.08338 -2.65362 -0.233062 -4.32103 -1.24119 0.105002 -3.62993 -1.2941 0.387497 -4.08338 -2.65362 -0.233062 -4.69772 -3.00921 0.0043401 -5.0129 -1.2839 0.387327 -4.32103 -1.24119 0.105002 -4.69772 -3.00921 0.0043401 -4.91592 -3.31358 0.65238 -5.30025 -1.39721 1.06909 -5.0129 -1.2839 0.387327 -4.91592 -3.31358 0.65238 -4.61018 -3.38844 1.33144 -5.01477 -1.51474 1.75092 -5.30025 -1.39721 1.06909 -4.61018 -3.38844 1.33144 -3.95958 -3.18994 1.64375 -4.32367 -1.56765 2.03342 -5.01477 -1.51474 1.75092 -4.32367 -1.56765 2.03342 -3.6318 -1.52494 1.75109 -3.36153 -0.267629 1.89071 -3.99896 -0.000434571 2.17793 -3.6318 -1.52494 1.75109 -3.34445 -1.41163 1.06933 -3.0981 -0.37805 1.19888 -3.36153 -0.267629 1.89071 -3.34445 -1.41163 1.06933 -3.62993 -1.2941 0.387497 -3.36299 -0.267015 0.507707 -3.0981 -0.37805 1.19888 -3.62993 -1.2941 0.387497 -4.32103 -1.24119 0.105002 -4.00104 0.000433318 0.222073 -3.36299 -0.267015 0.507707 -4.32103 -1.24119 0.105002 -5.0129 -1.2839 0.387327 -4.63847 0.267628 0.509295 -4.00104 0.000433318 0.222073 -5.0129 -1.2839 0.387327 -5.30025 -1.39721 1.06909 -4.9019 0.378049 1.20112 -4.63847 0.267628 0.509295 -5.30025 -1.39721 1.06909 -5.01477 -1.51474 1.75092 -4.63701 0.267014 1.89229 -4.9019 0.378049 1.20112 -5.01477 -1.51474 1.75092 -4.32367 -1.56765 2.03342 -3.99896 -0.000434571 2.17793 -4.63701 0.267014 1.89229 -3.99896 -0.000434571 2.17793 -3.36153 -0.267629 1.89071 -2.69163 0.746882 1.77633 -3.18839 1.24832 2.02534 -3.36153 -0.267629 1.89071 -3.0981 -0.37805 1.19888 -2.54311 0.433386 1.1131 -2.69163 0.746882 1.77633 -3.0981 -0.37805 1.19888 -3.36299 -0.267015 0.507707 -2.82982 0.491474 0.424158 -2.54311 0.433386 1.1131 -3.36299 -0.267015 0.507707 -4.00104 0.000433318 0.222073 -3.38381 0.88712 0.113083 -2.82982 0.491474 0.424158 -4.00104 0.000433318 0.222073 -4.63847 0.267628 0.509295 -3.88057 1.38856 0.362095 -3.38381 0.88712 0.113083 -4.63847 0.267628 0.509295 -4.9019 0.378049 1.20112 -4.02909 1.70205 1.02532 -3.88057 1.38856 0.362095 -4.9019 0.378049 1.20112 -4.63701 0.267014 1.89229 -3.74238 1.64397 1.71426 -4.02909 1.70205 1.02532 -4.63701 0.267014 1.89229 -3.99896 -0.000434571 2.17793 -3.18839 1.24832 2.02534 -3.74238 1.64397 1.71426 -3.18839 1.24832 2.02534 -2.69163 0.746882 1.77633 -1.8423 1.46983 1.40514 -2.20333 2.09676 1.59706 -2.69163 0.746882 1.77633 -2.54311 0.433386 1.1131 -1.83763 1.0249 0.803287 -1.8423 1.46983 1.40514 -2.54311 0.433386 1.1131 -2.82982 0.491474 0.424158 -2.19207 1.02259 0.14406 -1.83763 1.0249 0.803287 -2.82982 0.491474 0.424158 -3.38381 0.88712 0.113083 -2.69799 1.46426 -0.186375 -2.19207 1.02259 0.14406 -3.38381 0.88712 0.113083 -3.88057 1.38856 0.362095 -3.05902 2.09119 0.0055466 -2.69799 1.46426 -0.186375 -3.88057 1.38856 0.362095 -4.02909 1.70205 1.02532 -3.06369 2.53612 0.607399 -3.05902 2.09119 0.0055466 -4.02909 1.70205 1.02532 -3.74238 1.64397 1.71426 -2.70925 2.53843 1.26663 -3.06369 2.53612 0.607399 -3.74238 1.64397 1.71426 -3.18839 1.24832 2.02534 -2.20333 2.09676 1.59706 -2.70925 2.53843 1.26663 -2.20333 2.09676 1.59706 -1.8423 1.46983 1.40514 -1.01372 1.98527 0.866354 -1.30899 2.65549 1.02071 -1.8423 1.46983 1.40514 -1.83763 1.0249 0.803287 -1.0938 1.48605 0.314462 -1.01372 1.98527 0.866354 -1.83763 1.0249 0.803287 -2.19207 1.02259 0.14406 -1.50232 1.45028 -0.311673 -1.0938 1.48605 0.314462 -2.19207 1.02259 0.14406 -2.69799 1.46426 -0.186375 -1.99997 1.89891 -0.645268 -1.50232 1.45028 -0.311673 -2.69799 1.46426 -0.186375 -3.05902 2.09119 0.0055466 -2.29524 2.56913 -0.49091 -1.99997 1.89891 -0.645268 -3.05902 2.09119 0.0055466 -3.06369 2.53612 0.607399 -2.21516 3.06835 0.0609821 -2.29524 2.56913 -0.49091 -3.06369 2.53612 0.607399 -2.70925 2.53843 1.26663 -1.80664 3.10412 0.687117 -2.21516 3.06835 0.0609821 -2.70925 2.53843 1.26663 -2.20333 2.09676 1.59706 -1.30899 2.65549 1.02071 -1.80664 3.10412 0.687117 -1.30899 2.65549 1.02071 -1.01372 1.98527 0.866354 -0.278682 2.40709 0.331668 -0.552041 3.08975 0.471175 -1.01372 1.98527 0.866354 -1.0938 1.48605 0.314462 -0.359558 1.90704 -0.219348 -0.278682 2.40709 0.331668 -1.0938 1.48605 0.314462 -1.50232 1.45028 -0.311673 -0.747291 1.88251 -0.859093 -0.359558 1.90704 -0.219348 -1.50232 1.45028 -0.311673 -1.99997 1.89891 -0.645268 -1.21475 2.34789 -1.21281 -0.747291 1.88251 -0.859093 -1.99997 1.89891 -0.645268 -2.29524 2.56913 -0.49091 -1.48811 3.03055 -1.07331 -1.21475 2.34789 -1.21281 -2.29524 2.56913 -0.49091 -2.21516 3.06835 0.0609821 -1.40724 3.5306 -0.522292 -1.48811 3.03055 -1.07331 -2.21516 3.06835 0.0609821 -1.80664 3.10412 0.687117 -1.0195 3.55513 0.117453 -1.40724 3.5306 -0.522292 -1.80664 3.10412 0.687117 -1.30899 2.65549 1.02071 -0.552041 3.08975 0.471175 -1.0195 3.55513 0.117453 -0.552041 3.08975 0.471175 -0.278682 2.40709 0.331668 0.441229 2.76906 -0.0640377 0.224691 3.47706 0.0458149 -0.278682 2.40709 0.331668 -0.359558 1.90704 -0.219348 0.399301 2.28508 -0.633434 0.441229 2.76906 -0.0640377 -0.359558 1.90704 -0.219348 -0.747291 1.88251 -0.859093 0.123468 2.30861 -1.32883 0.399301 2.28508 -0.633434 -0.747291 1.88251 -0.859093 -1.21475 2.34789 -1.21281 -0.224692 2.82588 -1.74287 0.123468 2.30861 -1.32883 -1.21475 2.34789 -1.21281 -1.48811 3.03055 -1.07331 -0.44123 3.53388 -1.63302 -0.224692 2.82588 -1.74287 -1.48811 3.03055 -1.07331 -1.40724 3.5306 -0.522292 -0.399302 4.01786 -1.06362 -0.44123 3.53388 -1.63302 -1.40724 3.5306 -0.522292 -1.0195 3.55513 0.117453 -0.123469 3.99433 -0.368226 -0.399302 4.01786 -1.06362 -1.0195 3.55513 0.117453 -0.552041 3.08975 0.471175 0.224691 3.47706 0.0458149 -0.123469 3.99433 -0.368226 0.224691 3.47706 0.0458149 0.441229 2.76906 -0.0640377 1.28094 3.0216 -0.277521 1.21738 3.76515 -0.219965 0.441229 2.76906 -0.0640377 0.399301 2.28508 -0.633434 1.25109 2.52991 -0.84105 1.28094 3.0216 -0.277521 0.399301 2.28508 -0.633434 0.123468 2.30861 -1.32883 1.14532 2.57811 -1.58044 1.25109 2.52991 -0.84105 0.123468 2.30861 -1.32883 -0.224692 2.82588 -1.74287 1.02558 3.13795 -2.06258 1.14532 2.57811 -1.58044 -0.224692 2.82588 -1.74287 -0.44123 3.53388 -1.63302 0.962025 3.8815 -2.00502 1.02558 3.13795 -2.06258 -0.44123 3.53388 -1.63302 -0.399302 4.01786 -1.06362 0.991873 4.37319 -1.44149 0.962025 3.8815 -2.00502 -0.399302 4.01786 -1.06362 -0.123469 3.99433 -0.368226 1.09764 4.32499 -0.702097 0.991873 4.37319 -1.44149 -0.123469 3.99433 -0.368226 0.224691 3.47706 0.0458149 1.21738 3.76515 -0.219965 1.09764 4.32499 -0.702097 1.21738 3.76515 -0.219965 1.28094 3.0216 -0.277521 2.30983 3.01577 -0.293692 2.4938 3.74101 -0.273837 1.28094 3.0216 -0.277521 1.25109 2.52991 -0.84105 2.2147 2.50854 -0.835798 2.30983 3.01577 -0.293692 1.25109 2.52991 -0.84105 1.14532 2.57811 -1.58044 2.26412 2.51645 -1.5826 2.2147 2.50854 -0.835798 1.14532 2.57811 -1.58044 1.02558 3.13795 -2.06258 2.42916 3.03487 -2.09662 2.26412 2.51645 -1.5826 1.02558 3.13795 -2.06258 0.962025 3.8815 -2.00502 2.61313 3.76011 -2.07677 2.42916 3.03487 -2.09662 0.962025 3.8815 -2.00502 0.991873 4.37319 -1.44149 2.70826 4.26734 -1.53466 2.61313 3.76011 -2.07677 0.991873 4.37319 -1.44149 1.09764 4.32499 -0.702097 2.65884 4.25943 -0.787864 2.70826 4.26734 -1.53466 1.09764 4.32499 -0.702097 1.21738 3.76515 -0.219965 2.4938 3.74101 -0.273837 2.65884 4.25943 -0.787864 2.4938 3.74101 -0.273837 2.30983 3.01577 -0.293692 3.41078 2.5587 -0.100919 3.86347 3.1542 -0.075158 2.30983 3.01577 -0.293692 2.2147 2.50854 -0.835798 3.19001 2.08448 -0.636257 3.41078 2.5587 -0.100919 2.2147 2.50854 -0.835798 2.26412 2.51645 -1.5826 3.33049 2.00932 -1.36758 3.19001 2.08448 -0.636257 2.26412 2.51645 -1.5826 2.42916 3.03487 -2.09662 3.74993 2.37726 -1.86648 3.33049 2.00932 -1.36758 2.42916 3.03487 -2.09662 2.61313 3.76011 -2.07677 4.20262 2.97276 -1.84072 3.74993 2.37726 -1.86648 2.61313 3.76011 -2.07677 2.70826 4.26734 -1.53466 4.42339 3.44698 -1.30538 4.20262 2.97276 -1.84072 2.70826 4.26734 -1.53466 2.65884 4.25943 -0.787864 4.28291 3.52214 -0.574064 4.42339 3.44698 -1.30538 2.65884 4.25943 -0.787864 2.4938 3.74101 -0.273837 3.86347 3.1542 -0.075158 4.28291 3.52214 -0.574064 3.86347 3.1542 -0.075158 3.41078 2.5587 -0.100919 4.29059 1.58749 0.276467 4.9453 1.94285 0.349222 3.41078 2.5587 -0.100919 3.19001 2.08448 -0.636257 3.94665 1.21982 -0.277369 4.29059 1.58749 0.276467 3.19001 2.08448 -0.636257 3.33049 2.00932 -1.36758 4.11495 1.05521 -0.987856 3.94665 1.21982 -0.277369 3.33049 2.00932 -1.36758 3.74993 2.37726 -1.86648 4.6969 1.19009 -1.4388 4.11495 1.05521 -0.987856 3.74993 2.37726 -1.86648 4.20262 2.97276 -1.84072 5.35161 1.54545 -1.36605 4.6969 1.19009 -1.4388 4.20262 2.97276 -1.84072 4.42339 3.44698 -1.30538 5.69555 1.91312 -0.812209 5.35161 1.54545 -1.36605 4.42339 3.44698 -1.30538 4.28291 3.52214 -0.574064 5.52725 2.07773 -0.101722 5.69555 1.91312 -0.812209 4.28291 3.52214 -0.574064 3.86347 3.1542 -0.075158 4.9453 1.94285 0.349222 5.52725 2.07773 -0.101722 4.9453 1.94285 0.349222 4.29059 1.58749 0.276467 4.63689 0.137701 0.787583 5.34579 0.348913 0.901858 4.29059 1.58749 0.276467 3.94665 1.21982 -0.277369 4.25785 -0.154175 0.211953 4.63689 0.137701 0.787583 3.94665 1.21982 -0.277369 4.11495 1.05521 -0.987856 4.43071 -0.355738 -0.487837 4.25785 -0.154175 0.211953 4.11495 1.05521 -0.987856 4.6969 1.19009 -1.4388 5.05421 -0.348913 -0.901858 4.43071 -0.355738 -0.487837 4.6969 1.19009 -1.4388 5.35161 1.54545 -1.36605 5.76311 -0.137701 -0.787583 5.05421 -0.348913 -0.901858 5.35161 1.54545 -1.36605 5.69555 1.91312 -0.812209 6.14215 0.154175 -0.211953 5.76311 -0.137701 -0.787583 5.69555 1.91312 -0.812209 5.52725 2.07773 -0.101722 5.96929 0.355738 0.487836 6.14215 0.154175 -0.211953 5.52725 2.07773 -0.101722 4.9453 1.94285 0.349222 5.34579 0.348913 0.901858 5.96929 0.355738 0.487836 4 0 1 2 3 4 4 5 6 7 4 8 9 10 11 4 12 13 14 15 4 16 17 18 19 4 20 21 22 23 4 24 25 26 27 4 28 29 30 31 4 32 33 34 35 4 36 37 38 39 4 40 41 42 43 4 44 45 46 47 4 48 49 50 51 4 52 53 54 55 4 56 57 58 59 4 60 61 62 63 4 64 65 66 67 4 68 69 70 71 4 72 73 74 75 4 76 77 78 79 4 80 81 82 83 4 84 85 86 87 4 88 89 90 91 4 92 93 94 95 4 96 97 98 99 4 100 101 102 103 4 104 105 106 107 4 108 109 110 111 4 112 113 114 115 4 116 117 118 119 4 120 121 122 123 4 124 125 126 127 4 128 129 130 131 4 132 133 134 135 4 136 137 138 139 4 140 141 142 143 4 144 145 146 147 4 148 149 150 151 4 152 153 154 155 4 156 157 158 159 4 160 161 162 163 4 164 165 166 167 4 168 169 170 171 4 172 173 174 175 4 176 177 178 179 4 180 181 182 183 4 184 185 186 187 4 188 189 190 191 4 192 193 194 195 4 196 197 198 199 4 200 201 202 203 4 204 205 206 207 4 208 209 210 211 4 212 213 214 215 4 216 217 218 219 4 220 221 222 223 4 224 225 226 227 4 228 229 230 231 4 232 233 234 235 4 236 237 238 239 4 240 241 242 243 4 244 245 246 247 4 248 249 250 251 4 252 253 254 255 4 256 257 258 259 4 260 261 262 263 4 264 265 266 267 4 268 269 270 271 4 272 273 274 275 4 276 277 278 279 4 280 281 282 283 4 284 285 286 287 4 288 289 290 291 4 292 293 294 295 4 296 297 298 299 4 300 301 302 303 4 304 305 306 307 4 308 309 310 311 4 312 313 314 315 4 316 317 318 319 4 320 321 322 323 4 324 325 326 327 4 328 329 330 331 4 332 333 334 335 4 336 337 338 339 4 340 341 342 343 4 344 345 346 347 4 348 349 350 351 4 352 353 354 355 4 356 357 358 359 4 360 361 362 363 4 364 365 366 367 4 368 369 370 371 4 372 373 374 375 4 376 377 378 379 4 380 381 382 383 4 384 385 386 387 4 388 389 390 391 4 392 393 394 395 4 396 397 398 399 4 400 401 402 403 4 404 405 406 407 4 408 409 410 411 4 412 413 414 415 4 416 417 418 419 4 420 421 422 423 4 424 425 426 427 4 428 429 430 431 4 432 433 434 435 4 436 437 438 439 4 440 441 442 443 4 444 445 446 447 4 448 449 450 451 4 452 453 454 455 4 456 457 458 459 4 460 461 462 463 4 464 465 466 467 4 468 469 470 471 4 472 473 474 475 4 476 477 478 479 4 480 481 482 483 4 484 485 486 487 4 488 489 490 491 4 492 493 494 495 4 496 497 498 499 4 500 501 502 503 4 504 505 506 507 4 508 509 510 511 4 512 513 514 515 4 516 517 518 519 4 520 521 522 523 4 524 525 526 527 4 528 529 530 531 4 532 533 534 535 4 536 537 538 539 4 540 541 542 543 4 544 545 546 547 4 548 549 550 551 4 552 553 554 555 4 556 557 558 559 4 560 561 562 563 4 564 565 566 567 4 568 569 570 571 4 572 573 574 575 4 576 577 578 579 4 580 581 582 583 4 584 585 586 587 4 588 589 590 591 4 592 593 594 595 4 596 597 598 599 4 600 601 602 603 4 604 605 606 607 4 608 609 610 611 4 612 613 614 615 4 616 617 618 619 4 620 621 622 623 4 624 625 626 627 4 628 629 630 631 4 632 633 634 635 4 636 637 638 639 4 640 641 642 643 4 644 645 646 647 4 648 649 650 651 4 652 653 654 655 4 656 657 658 659 4 660 661 662 663 4 664 665 666 667 4 668 669 670 671 4 672 673 674 675 4 676 677 678 679 4 680 681 682 683 4 684 685 686 687 4 688 689 690 691 4 692 693 694 695 4 696 697 698 699 4 700 701 702 703 4 704 705 706 707 4 708 709 710 711 4 712 713 714 715 4 716 717 718 719 4 720 721 722 723 4 724 725 726 727 4 728 729 730 731 4 732 733 734 735 4 736 737 738 739 4 740 741 742 743 4 744 745 746 747 4 748 749 750 751 4 752 753 754 755 4 756 757 758 759 4 760 761 762 763 4 764 765 766 767 4 768 769 770 771 4 772 773 774 775 4 776 777 778 779 4 780 781 782 783 4 784 785 786 787 4 788 789 790 791 4 792 793 794 795 4 796 797 798 799 4 800 801 802 803 4 804 805 806 807 4 808 809 810 811 4 812 813 814 815 4 816 817 818 819 4 820 821 822 823 4 824 825 826 827 4 828 829 830 831 4 832 833 834 835 4 836 837 838 839 4 840 841 842 843 4 844 845 846 847 4 848 849 850 851 4 852 853 854 855 4 856 857 858 859 4 860 861 862 863 4 864 865 866 867 4 868 869 870 871 4 872 873 874 875 4 876 877 878 879 4 880 881 882 883 4 884 885 886 887 4 888 889 890 891 4 892 893 894 895 4 896 897 898 899 4 900 901 902 903 4 904 905 906 907 4 908 909 910 911 4 912 913 914 915 4 916 917 918 919 4 920 921 922 923 4 924 925 926 927 4 928 929 930 931 4 932 933 934 935 4 936 937 938 939 4 940 941 942 943 4 944 945 946 947 4 948 949 950 951 4 952 953 954 955 4 956 957 958 959 4 960 961 962 963 4 964 965 966 967 4 968 969 970 971 4 972 973 974 975 4 976 977 978 979 4 980 981 982 983 4 984 985 986 987 4 988 989 990 991 4 992 993 994 995 4 996 997 998 999 4 1000 1001 1002 1003 4 1004 1005 1006 1007 4 1008 1009 1010 1011 4 1012 1013 1014 1015 4 1016 1017 1018 1019 4 1020 1021 1022 1023 4 1024 1025 1026 1027 4 1028 1029 1030 1031 4 1032 1033 1034 1035 4 1036 1037 1038 1039 4 1040 1041 1042 1043 4 1044 1045 1046 1047 4 1048 1049 1050 1051 4 1052 1053 1054 1055 4 1056 1057 1058 1059 4 1060 1061 1062 1063 4 1064 1065 1066 1067 4 1068 1069 1070 1071 4 1072 1073 1074 1075 4 1076 1077 1078 1079 4 1080 1081 1082 1083 4 1084 1085 1086 1087 4 1088 1089 1090 1091 4 1092 1093 1094 1095 4 1096 1097 1098 1099 4 1100 1101 1102 1103 4 1104 1105 1106 1107 4 1108 1109 1110 1111 4 1112 1113 1114 1115 4 1116 1117 1118 1119 4 1120 1121 1122 1123 4 1124 1125 1126 1127 4 1128 1129 1130 1131 4 1132 1133 1134 1135 4 1136 1137 1138 1139 4 1140 1141 1142 1143 4 1144 1145 1146 1147 4 1148 1149 1150 1151 4 1152 1153 1154 1155 4 1156 1157 1158 1159 4 1160 1161 1162 1163 4 1164 1165 1166 1167 4 1168 1169 1170 1171 4 1172 1173 1174 1175 4 1176 1177 1178 1179 4 1180 1181 1182 1183 4 1184 1185 1186 1187 4 1188 1189 1190 1191 4 1192 1193 1194 1195 4 1196 1197 1198 1199 4 1200 1201 1202 1203 4 1204 1205 1206 1207 4 1208 1209 1210 1211 4 1212 1213 1214 1215 4 1216 1217 1218 1219 4 1220 1221 1222 1223 4 1224 1225 1226 1227 4 1228 1229 1230 1231 4 1232 1233 1234 1235 4 1236 1237 1238 1239 4 1240 1241 1242 1243 4 1244 1245 1246 1247 4 1248 1249 1250 1251 4 1252 1253 1254 1255 4 1256 1257 1258 1259 4 1260 1261 1262 1263 4 1264 1265 1266 1267 4 1268 1269 1270 1271 4 1272 1273 1274 1275 4 1276 1277 1278 1279 geomview-1.9.5/data/geom/tri.4d.vect0000644000175000017500000000022612310110173014105 000000000000004VECT 1 3 0 -3 0 # 0.2 0.0 0.0 0.5 0.7 0.0 0.9 0.0 0.0 # 0.5 0.1 0.1 0.5 0.7 0.5 0.5 0.9 0.9 0.2 0.1 0.1 1.0 0.5 0.7 0.4 1.0 0.9 0.1 0.7 1.0 geomview-1.9.5/data/geom/tri.vect0000644000175000017500000000021112310110173013571 00000000000000VECT 1 3 0 -3 0 # 0.2 0.0 0.0 0.5 0.7 0.0 0.9 0.0 0.0 # 0.5 0.1 0.1 0.5 0.7 0.5 0.5 0.9 0.9 0.2 0.1 0.1 0.5 0.7 0.4 0.9 0.1 0.7 geomview-1.9.5/data/geom/triangle0000644000175000017500000000046412310110173013652 00000000000000{ = OFF 6 5 9 0.5 -0.5 -6.93889e-18 -0.5 -0.5 -3.46945e-17 4.16334e-17 -5.55112e-17 -5.55112e-17 0.5 -0.5 0.346901 2.95038e-17 -3.12521e-17 0.346901 -0.5 -0.5 0.346901 3 3 4 5 0.800 0.098 0.098 4 2 4 3 0 0.098 0.647 0.400 3 1 2 0 0.098 0.098 0.800 4 4 2 1 5 0.098 0.647 0.400 4 0 3 5 1 0.898 0.600 0.000 } geomview-1.9.5/data/geom/twosidedsquare.quad0000644000175000017500000000044112310110173016034 00000000000000#example of two sided surface #should be viewed with backface culling CQUAD -1 -1 0 1 0 0 1 1 -1 0 1 0 0 1 1 1 0 1 0 0 1 -1 1 0 1 0 0 1 #same points, with orientation reversed (clockwise instead of counterclockwise) -1 -1 0 0 1 0 1 -1 1 0 0 1 0 1 1 1 0 0 1 0 1 1 -1 0 0 1 0 1 geomview-1.9.5/data/geom/unit.sphere0000644000175000017500000000001712310110173014303 00000000000000SPHERE 1 0 0 0 geomview-1.9.5/data/geom/unitcube.off0000644000175000017500000000043512310110173014432 00000000000000OFF 8 6 12 0 0 0 # 0 1 0 0 # 1 1 1 0 # 2 0 1 0 # 3 0 0 1 # 4 1 0 1 # 5 1 1 1 # 6 0 1 1 # 7 4 0 1 2 3 0.800 0.098 0.098 4 4 5 6 7 0.098 0.647 0.400 4 2 3 7 6 0.098 0.098 0.800 4 0 1 5 4 0.898 0.600 0.000 4 0 4 7 3 0.000 0.600 0.800 4 1 2 6 5 0.498 0.000 0.898 geomview-1.9.5/data/geom/vertcube.off0000644000175000017500000000063312310110173014433 00000000000000# off file with per vertex colors COFF 8 6 12 1.0 1.0 1.0 .05 .8 .1 .75 1.0 1.0 -1.0 .2 .05 .8 .75 1.0 -1.0 1.0 .9 .9 .02 .75 1.0 -1.0 -1.0 .0 .7 .4 .75 -1.0 1.0 1.0 .1 .4 .7 .75 -1.0 1.0 -1.0 .7 .7 0 .75 -1.0 -1.0 1.0 0. 0. 0. .75 -1.0 -1.0 -1.0 1. 1. 1. .75 4 0 2 3 1 4 4 5 7 6 4 0 4 6 2 4 1 3 7 5 4 0 1 5 4 4 2 6 7 3 geomview-1.9.5/data/geom/warp.inst0000644000175000017500000000012012310110173013757 00000000000000INST transform { 1 0 0 0 0 9 0 0 0 0 3 0 0 0 0 1 } geom { < dodec.off } geomview-1.9.5/data/geom/wraptent.mesh0000644000175000017500000000024712310110173014643 00000000000000CuMESH 3 3 0 0 0 1 0 0 1 1 0 1 0 1 0 1 2 0 0 0 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 2 1 0 0 0 1 1 0 2 0 1 0 0 1 1 2 1 0 1 0 1 2 2 0 0 0 1 1 geomview-1.9.5/data/geom/xwyezed.vect0000644000175000017500000000105712310110173014503 00000000000000VECT 14 41 3 2 2 2 2 5 2 3 2 4 2 4 2 4 5 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 -.05 .05 1 .05 .25 1 .05 .05 1 -.05 .25 0 0 0 0 1 0 .175 1 .25 .15 1 .05 .125 1 .25 .10 1 .05 .075 1 .25 -.05 1 .25 0 1 .15 .05 1 .25 0 1 .15 0 1 .05 -.075 1 .15 -.125 1 .15 -.175 1 .25 -.075 1 .25 -.075 1 .05 -.175 1 .05 0 0 0 0 0 1 -.175 .25 1 -.075 .25 1 -.175 .05 1 -.075 .05 1 -.05 .15 1 0 .15 1 .05 .25 1 -.05 .25 1 -.05 .05 1 .05 .05 1 .075 .25 1 .075 .05 1 .175 .08 1 .175 .22 1 .075 .25 1 0 .8 0 1 .9 .9 0 1 0 .6 1 1 geomview-1.9.5/data/geom/xyz.grp0000644000175000017500000000106712310110173013466 00000000000000 GROUP 1 0 0 0 0 1 0 0 0 0 1 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 -1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 1 -1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 -1 -1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 1 1 -1 1 1 0 0 0 0 1 0 0 0 0 1 0 -1 1 -1 1 1 0 0 0 0 1 0 0 0 0 1 0 1 -1 -1 1 1 0 0 0 0 1 0 0 0 0 1 0 -1 -1 -1 1 unit { = VECT 8 19 3 2 2 2 2 2 3 2 4 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 -.05 .05 1 .05 .25 1 .05 .05 1 -.05 .25 0 0 0 0 1 0 -.05 1 .25 0 1 .15 .05 1 .25 0 1 .15 0 1 .05 0 0 0 0 0 1 -.05 .25 1 .05 .25 1 -.05 .05 1 .05 .05 1 1 0 0 1 0 1 0 1 0 .6 1 1 } geomview-1.9.5/data/geom/xyz.vect0000644000175000017500000000041612310110173013634 00000000000000VECT 8 19 3 2 2 2 2 2 3 2 4 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 -.05 .05 1 .05 .25 1 .05 .05 1 -.05 .25 0 0 0 0 1 0 -.05 1 .25 0 1 .15 .05 1 .25 0 1 .15 0 1 .05 0 0 0 0 0 1 -.05 .25 1 .05 .25 1 -.05 .05 1 .05 .05 1 1 0 0 1 0 1 0 1 0 .6 1 1 geomview-1.9.5/data/geom/ztent.mesh0000644000175000017500000000003412310110173014135 00000000000000ZMESH 3 3 0 1 0 0 1 0 0 1 0 geomview-1.9.5/data/groups/0000755000175000017500000000000012310165605012600 500000000000000geomview-1.9.5/data/groups/101a.dgp0000644000175000017500000000551612310110173013653 00000000000000DISCGRP (group 101a ) (attribute Hyperbolic ) (dimn 3 ) (ngens 12 ) (gens a 0.66237473 -0.42507491 0.88008505 -0.62767714 -0.65384501 -0.94948018 0.65384501 -0.86979264 0.47488055 -2.0088105 -0.03946 -1.8062084 -0.30292767 2.0291677 -0.4512428 2.3265655 b 0.66237473 -0.65384501 0.47488055 0.30292767 -0.42507491 -0.94948018 -2.0088105 -2.0291677 0.88008505 0.65384501 -0.03946 0.4512428 0.62767714 0.86979264 1.8062084 2.3265655 c 0.36602539 -0.06939514 0.93060488 -0.06939514 1.9306049 -0.36602539 -0.93060488 1.9306049 0.93060488 0.93060488 -0.36602539 0.93060488 1.9306049 0.06939514 -0.93060488 2.3660254 d 0.36602539 1.9306049 0.93060488 -1.9306049 -0.06939514 -0.36602539 0.93060488 -0.06939514 0.93060488 -0.93060488 -0.36602539 0.93060488 0.06939514 -1.9306049 -0.93060488 2.3660254 e -0.77675986 -1.0140597 1.9250748 -2.0826871 0.75717026 -0.28157547 0.91654527 -0.70188802 -0.21218036 0.79634935 0.62844467 -0.27227831 0.47083235 0.86126298 -1.985173 2.4298906 f -0.77675986 0.75717026 -0.21218036 -0.47083235 -1.0140597 -0.28157547 0.79634935 -0.86126298 1.9250748 0.91654527 0.62844467 1.985173 2.0826871 0.70188802 0.27227831 2.4298906 g 1.8453875 0.59374714 0.074157573 -1.6623747 -0.33685777 -1.2224727 0.18854263 0.80216014 1.280808 0.4645882 -1.2224727 -1.5332158 -2.0394599 -1.0309303 0.73176992 2.5995579 h 1.8453875 -0.33685777 1.280808 2.0394599 0.59374714 -1.2224727 0.4645882 1.0309303 0.074157573 0.18854263 -1.2224727 -0.73176992 1.6623747 -0.80216014 1.5332158 2.5995579 i -0.39831513 -0.91790462 -0.032289729 0.047397759 -0.98729986 0.46289459 1.943305 -1.991348 -0.37291476 0.1466748 -1.7389402 1.4780027 0.52199733 -0.27988189 -2.4086075 2.6743608 j -0.39831513 -0.98729986 -0.37291476 -0.52199733 -0.91790462 0.46289459 0.1466748 0.27988189 -0.032289729 1.943305 -1.7389402 2.4086075 -0.047397759 1.991348 -1.4780027 2.6743608 k 0.31145737 -1.5741575 -1.4597725 1.9250748 -0.41478261 0.31145737 -0.94018298 0.39114487 1.2028831 -0.41478261 -1.3003975 1.5198705 0.84615499 -1.3217497 -1.9250748 2.6774828 l 0.31145737 -0.41478261 1.2028831 -0.84615499 -1.5741575 0.31145737 -0.41478261 1.3217497 -1.4597725 -0.94018298 -1.3003975 1.9250748 -1.9250748 -0.39114487 -1.5198705 2.6774828 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) geomview-1.9.5/data/groups/101b.dgp0000644000175000017500000000643612310110173013656 00000000000000DISCGRP (group 101b ) (attribute Hyperbolic ) (dimn 3 ) (ngens 14 ) (gens a 1.3660254 0 0 -0.93060488 0 -0.36602539 0.93060488 0 0 -0.93060488 -0.36602539 0 -0.93060488 0 0 1.3660254 b 1.3660254 0 0 0.93060488 0 -0.36602539 -0.93060488 0 0 0.93060488 -0.36602539 0 0.93060488 0 0 1.3660254 c -0.41143784 0.35355341 0.88681328 -0.28411075 -0.35355341 0.91143787 -0.76204914 0.73241919 -0.88681328 -0.76204914 0.088562168 -0.61237246 0.28411075 0.73241919 -0.61237246 1.4114379 d -0.41143784 -0.35355341 -0.88681328 -0.28411075 0.35355341 0.91143787 -0.76204914 -0.73241919 0.88681328 -0.76204914 0.088562168 0.61237246 0.28411075 -0.73241919 0.61237246 1.4114379 e -0.29763967 0.95468229 -0.0044223098 -0.00521645 1.1645558 0.37555724 1.1271179 -1.3295217 0.64153272 0.19651297 -0.74158263 0.01124354 -0.9253884 -0.30179277 -0.90573674 1.6636651 f -0.29763967 -1.1645558 -0.64153272 0.9253884 -0.95468229 0.37555724 0.19651297 -0.30179277 0.0044223098 1.1271179 -0.74158263 -0.90573674 0.00521645 -1.3295217 0.01124354 1.6636651 g -0.29763967 1.1645558 0.64153272 0.9253884 0.95468229 0.37555724 0.19651297 0.30179277 -0.0044223098 1.1271179 -0.74158263 0.90573674 0.00521645 1.3295217 -0.01124354 1.6636651 h -0.29763967 -0.95468229 0.0044223098 -0.00521645 -1.1645558 0.37555724 1.1271179 1.3295217 -0.64153272 0.19651297 -0.74158263 -0.01124354 -0.9253884 0.30179277 0.90573674 1.6636651 i -1.0786567 0.14367995 0.24085826 -0.49209425 -0.14367995 -0.21263124 1.3199079 -0.89889526 -0.24085826 1.3199079 1.2126312 -1.5068656 0.49209425 -0.89889526 -1.5068656 2.0786567 j -1.0786567 -0.14367995 -0.24085826 -0.49209425 0.14367995 -0.21263124 1.3199079 0.89889526 0.24085826 1.3199079 1.2126312 1.5068656 0.49209425 0.89889526 1.5068656 2.0786567 k -0.82642937 -0.19862992 1.7812862 -1.7015934 -0.69586319 -1.042776 0.36134577 -0.83796078 0.6536147 -0.56925911 0.67675066 -0.45744896 0.77098858 0.67148465 -1.6617892 2.1924548 l -0.82642937 0.69586319 -0.6536147 -0.77098858 0.19862992 -1.042776 -0.56925911 0.67148465 -1.7812862 0.36134577 0.67675066 -1.6617892 1.7015934 -0.83796078 -0.45744896 2.1924548 K -0.82642955 -0.69586337 0.6536147 -0.77098894 -0.19862986 -1.0427761 -0.56925905 -0.67148447 1.781286 0.36134571 0.67675048 1.6617888 1.7015933 0.83796078 0.45744881 2.1924546 L -0.82642937 0.19863003 -1.7812862 -1.7015934 0.69586331 -1.0427763 0.36134583 0.83796102 -0.65361476 -0.56925905 0.67675042 0.45744881 0.77098846 -0.67148483 1.6617889 2.1924548 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) geomview-1.9.5/data/groups/120.dgp0000644000175000017500000000571712310110173013516 00000000000000DISCGRP (group 120cell ) (comment " This is a test of a spherical group. " ) (attribute Spherical ) (attribute Finite ) (display zcull) (enumdepth 6 ) (enumdist 4.0 ) (dimn 3 ) (ngens 12 ) (gens a 0.809017 0.5 0 0.309017 -0.5 0.809017 0.309017 0 0 -0.309017 0.809017 0.5 -0.309017 0 -0.5 0.809017 b 0.809017 0.5 0 -0.309017 -0.5 0.809017 -0.309017 0 0 0.309017 0.809017 0.5 0.309017 0 -0.5 0.809017 c 0.809017 0.309017 -0.5 0 -0.309017 0.809017 0 0.5 0.5 0 0.809017 0.309017 0 -0.5 -0.309017 0.809017 d 0.809017 0 -0.309017 0.5 0 0.809017 0.5 0.309017 0.309017 -0.5 0.809017 0 -0.5 -0.309017 0 0.809017 e 0.809017 0 0.309017 0.5 0 0.809017 0.5 -0.309017 -0.309017 -0.5 0.809017 0 -0.5 0.309017 0 0.809017 f 0.809017 0.309017 0.5 0 -0.309017 0.809017 0 -0.5 -0.5 0 0.809017 0.309017 0 0.5 -0.309017 0.809017 A 0.809017 -0.5 0 -0.309017 0.5 0.809017 -0.309017 0 0 0.309017 0.809017 -0.5 0.309017 0 0.5 0.809017 B 0.809017 -0.5 0 0.309017 0.5 0.809017 0.309017 0 0 -0.309017 0.809017 -0.5 -0.309017 0 0.5 0.809017 C 0.809017 -0.309017 0.49999997 1.4901161e-08 0.309017 0.809017 -1.4901161e-08 -0.5 -0.5 0 0.80901694 -0.30901697 0 0.5 0.309017 0.809017 D 0.809017 0 0.309017 -0.5 0 0.809017 -0.5 -0.309017 -0.309017 0.5 0.809017 0 0.5 0.309017 0 0.809017 E 0.809017 0 -0.309017 -0.5 0 0.809017 -0.5 0.309017 0.309017 0.5 0.809017 0 0.5 -0.309017 0 0.809017 F 0.809017 -0.309017 -0.49999997 -1.4901161e-08 0.309017 0.809017 1.4901161e-08 0.5 0.5 0 0.80901694 -0.30901697 0 -0.5 0.309017 0.809017 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) geomview-1.9.5/data/groups/230data0000644000175000017500000001176412310110173013600 000000000000001. tr xyz 2. tr XYZ 3. m xyZ 4. m i,xyZ 5. m' xyZ 6. m' i,xyZ 7. m XYz 8. m k,XYz 9. m' XYz 10. m XYz xyZ 11. m k,XYz xyZ 12. m' XYz xyZ 13. m XYz i,xyZ 14. m k,XYz i,xyZ 15. m' XYz i,xyZ 16. o XYz xYz 17. o k,XYz xYz 18. o XYz k,xYz 19. o XYz i,xYz 20. o k,XYz i,xYz 21. o XYz i+k,xYz 22. o k,XYz i+k,xYz 23. o i+j,XYz j,xYz 24. o i+j+k,XYz j,xYz 25. o i+j,XYz j+k,xYz 26. o' XYz xYz 27. o' k,XYz xYz 28. o' XYz k,xYz 29. o' XyZ Xyz 30. o' XyZ j,Xyz 31. o' XyZ i,Xyz 32. o' XyZ i+j,Xyz 33. o'' XYz xYz 34. o'' XYz .5i+.5j+.5k,xYz 35. o''' XYz xYz 36. o''' XYz k,xYz 37. o''' XYz i,xYz 38. o xYZ XyZ 39. o xYZ k,XyZ 40. o i+j,xYZ XYz 41. o i+j,xYZ i+k,XYz 42. o' xYZ k,XyZ 43. o' xYZ XyZ 44. o'' xYZ XyZ 45. o''' xYZ XyZ 46. o''' k,xYZ i,XyZ 47. o xYZ XyZ XYZ 48. o xYZ XyZ i+j+k,XYZ 49. o xYZ XyZ k,XYZ 50. o xYZ XyZ i+j,XYZ 51. o xYZ k,XyZ XYZ 52. o xYZ k,XyZ i+j,XYZ 53. o xYZ k,XyZ i,XYZ 54. o xYZ k,XyZ j,XYZ 55. o i+j,xYZ XYz XYZ 56. o i+j,xYZ XYz i+j+k,XYZ 57. o i+j,xYZ XYz j,XYZ 58. o i+j,xYZ XYz k,XYZ 59. o i+j,xYZ XYz i+j,XYZ 60. o i+j,xYZ XYz j+k,XYZ 61. o i+j,xYZ j+k,XyZ XYZ 62. o i+j,xYZ j+k,XyZ i+j,XYZ 63. o' xYZ k,XyZ XYZ 64. o' xYZ k,XyZ i,XYZ 65. o' xYZ XyZ XYZ 66. o' xYZ XyZ i+j+k,XYZ 67. o' xYZ XyZ i,XYZ 68. o' xYZ XyZ j+k,XYZ 69. o'' xYZ XyZ XYZ 70. o'' xYZ XyZ .5i+.5j+.5k,XYZ 71. o''' xYZ XyZ XYZ 72. o''' xYZ XyZ k,XYZ 73. o''' k,xYZ i,XyZ XYZ 74. o''' k,xYZ i,XyZ i+j,XYZ 75. t YxZ 76. t' YxZ 77. t xYZ XyZ yxz 78. t xYZ XyZ k,yxz 79. t XYz YxZ i+j,XyZ 80. t XYz YxZ i+j+k,XyZ 81. t xYZ XyZ yxz i+j,xyz 82. t xYZ XyZ k,yxz i+j,xyz 83. t yXZ i,XyZ i+j,xyz 84. t yXZ i+k,XyZ i+j,xyz 85. t' xYZ XyZ yxz 86. t' xYZ XyZ k,yxz 87. t' xYZ XyZ yxz i+j+k,xyz 88. t' yXZ i+.5k,XyZ i+j+k,xyz 89. t Yxz 90. t .5k,Yxz 91. t k,Yxz 92. t k+.5k,Yxz 93. t' Yxz 94. t' .5k,Yxz 95. t Yxz XYZ 96. t k,Yxz XYZ 97. t Yxz i+j,XYZ 98. t k,Yxz i+j,XYZ 99. t' Yxz XYZ 100. t' .5i+.5j+k+.5k,yXz j,xyZ i+j+k,xyz XYZ 101. t Yxz yxz 102. t Yxz i+j,yxz 103. t k,Yxz yxz 104. t i+j+k,yXz yxz 105. t Yxz k,yxz 106. t Yxz i+j+k,yxz 107. t k,Yxz k,yxz 108. t k,Yxz i+j+k,yxz 109. t' Yxz yxz 110. t' Yxz k,yxz 111. t' j+.5k,yXz Xyz 112. t' j+.5k,yXz k,Xyz 113. t yXz XyZ 114. t i+j,yXz i+j,XyZ 115. t k+.5k,yXz XyZ 116. t i+j+k+.5k,yXz i+j+.5k,XyZ 117. t k,yXz XyZ 118. t i+j+k,yXz i+j+k,XyZ 119. t .5k,yXz XyZ 120. t i+j+.5k,yXz xyZ 121. t' Yxz yxZ 122. t' j+.5k,yXz i+k+.5k,XyZ 123. t Yxz yxZ XYZ 124. t Yxz yxZ k,XYZ 125. t Yxz yxZ i+j,XYZ 126. t Yxz yxZ i+j+k,XYZ 127. t Yxz i+j,yxZ XYZ 128. t yXz xyZ i+j+k,Xyz 129. t i+j,yXz i+j,xyZ Xyz 130. t i+j,yXz i+j,xyZ k,Xyz 131. t k,yXz xyZ Xyz 132. t k,yXz k,xyZ k,Xyz 133. t k,yXz i+j,xyZ i+j,Xyz 134. t k,yXz i+j+k,xyZ i+j+k,Xyz 135. t k,yXz xyZ i+j,Xyz 136. t i+j+k,yXz xyZ i+j+k,Xyz 137. t i+j+k,yXz i+j+k,xyZ Xyz 138. t i+j+k,yXz i+j,xyZ k,Xyz 139. t' Yxz yxZ XYZ 140. t' Yxz yxZ k,XYZ 141. t' j+.5k,yXz i+k+.5k,xyZ Xyz 142. t' j+.5k,yXz i+.5k,xyZ k,Xyz 143. c xYZ XyZ zxy 144. c' xYZ XyZ zxy 145. c'' xYZ XyZ zxy 146. c i+j,xYZ j+k,XyZ zxy 147. c'' k,xYZ i,XyZ zxy 148. c xYZ XyZ zxy XYZ 149. c xYZ XyZ zxy i+j+k,XYZ 150. c' xYZ XyZ zxy XYZ 151. c' xYZ XyZ zxy .5i+.5j+.5k,XYZ 152. c'' xYZ XyZ zxy XYZ 153. c i+j,xYZ j+k,XyZ zxy XYZ 154. c'' k,xYZ i,XyZ zxy XYZ 155. c xYZ XyZ zxy yxz 156. c' xYZ XyZ zxy yxz 157. c'' xYZ XyZ zxy yxz 158. c xYZ XyZ zxy i+j+k,yxz 159. c' xYZ XyZ zxy i+j+k,yxz 160. c'' k,xYZ i,XyZ zxy .5i+.5j+.5k,yxz 161. c xYZ XyZ zxy YXZ 162. c xYZ XyZ zxy i+j+k,YXZ 163. c' xYZ XyZ zxy YXZ 164. c' xYZ XyZ zxy .5i+.5j+.5k,YXZ 165. c'' xYZ XyZ zxy YXZ 166. c i+j,xYZ j+k,XyZ zxy .5i+.5j+.5k,YXZ 167. c i+j,xYZ j+k,XyZ zxy i+.5i+j+.5j+k+.5k,YXZ 168. c'' k,xYZ i,XyZ zxy .5i+.5j+.5k,YXZ 169. c xYZ XyZ zxy YXZ XYZ 170. c xYZ XyZ zxy YXZ i+j+k,XYZ 171. c xYZ XyZ zxy i+j+k,YXZ XYZ 172. c xYZ XyZ zxy i+j+k,YXZ i+j+k,XYZ 173. c' xYZ XyZ zxy YXZ XYZ 174. c' xYZ XyZ zxy YXZ i+j+k,XYZ 175. c' xYZ XyZ zxy .5i+.5j+.5k,YXZ .5i+.5j+.5k,XYZ 176. c' xYZ XyZ zxy .5i+.5j+.5k,YXZ i+.5i+j+.5j+k+.5k,XYZ 177. c'' xYZ XyZ zxy YXZ XYZ 178. c'' k,xYZ i,XyZ zxy .5i+.5j+.5k,YXZ XYZ 179. h y-xXz 180. h .6k,y-xXz 181. h .6k+.6k,y-xXz 182. rh zxy 183. h y-xXz XYZ 184. rh zxy XYZ 185. h y-xXz YXz 186. h y-xXz yxz 187. h y-xXz k,xx-yz 188. h y-xXz k,yxz 189. rh zxy xzy 190. rh zxy i+j+k,xzy 191. h y-xXz YXZ 192. h y-xXz yxZ 193. h .6k,y-xXz .6k+.6k,YXZ 194. h .6k,y-xXz .6k+.6k,yxZ 195. h .6k+.6k,y-xXz .6k,YXZ 196. h .6k+.6k,y-xXz .6k,yxZ 197. rh zxy YXZ 198. h y-xXz YXZ XYZ 199. h y-xXz YXZ k,XYZ 200. h y-xXz yxZ XYZ 201. h y-xXz yxZ k,XYZ 202. rh zxy YXZ XYZ 203. rh zxy YXZ i+j+k,XYZ 204. h y-xXz xyZ 205. h y-xXz YXZ xyZ 206. h y-xXz YXZ k,xyZ 207. h y-xXz yxZ xyZ 208. h y-xXz yxZ k,xyZ 209. h yy-xz 210. h .3k,yy-xz 211. h .6k+.6k+.3k,yy-xz 212. h .6k,yy-xz 213. h .6k+.6k,yy-xz 214. h k,yy-xz 215. h yy-xz yxz 216. h yy-xz k,yxz 217. h k,yy-xz yxz 218. h k,yy-xz k,yxz 219. h yy-xz xyZ 220. h k,yy-xz xyZ 221. h yy-xz Xy-xZ 222. h .3k,yy-xz Xy-xZ 223. h .6k+.6k+.3k,yy-xz Xy-xZ 224. h .6k,yy-xz Xy-xZ 225. h .6k+.6k,yy-xz Xy-xZ 226. h k,yy-xz Xy-xZ 227. h yy-xz Xy-xZ xyZ 228. h yy-xz Xy-xZ k,xyZ 229. h k,yy-xz Xy-xZ xyZ 230. h k,yy-xz Xy-xZ k,xyZ geomview-1.9.5/data/groups/230data.Conway0000644000175000017500000000722512310110173015034 000000000000001. o+() 2. (2n2n2n2n) 3. o+[] 4. o-() 5. o-[] 6. o-(') 7. (2_02_02_02_0) 8. (2_12_12_12_1) 9. (2_02_02_12_1) 10. [2_02_02_02_0] 11. [2_12_12_12_1] 12. [2_02_02_12_1] 13. (2n2n2_02_0) 14. (2n2n2_12_1) 15. (2n2n2_02_1) 16. (+2.2.2.2.) 17. (+2:2.2:2.) 18. (+2:2:2:2:) 19. (2_02_0+.) 20. (2_12_1+:) 21. (2_02_0+:) 22. (2_12_1+.) 23. (2_02_0)o+ 24. (2_12_1)o+ 25. (2_02_0')o+ 26. (2_0+2.2.) 27. (2_1+2:2.) 28. (2_0+2:2:) 29. (+2.2.2:2.) 30. (2_02_1+.) 31. (+2:2:2:2.) 32. (2_02_1+:) 33. (+2.2:2:2.) 34. (2_02_1)o+ 35. (2_1+2.2.) 36. (2_0+2:2.) 37. (2_1+2:2:) 38. (+2_02_02_02_0) 39. (+2_12_12_12_1'') 40. (2_02_0+) 41. (2_12_1'+) 42. (2_0+2_12_1') 43. (+2_02_02_12_1') 44. (+2_02_12_02_1') 45. (2_1+2_02_0') 46. (2_1'+2_12_1) 47. [+2.2.2.2.] 48. (2n-2_02_0') 49. [+2:2:2:2:] 50. (2n-2_02_0) 51. [+2:2.2:2.] 52. (2n2_0-') 53. (+2:2:22:) 54. [2_12_1+:] 55. [2_12_1+.] 56. [2_02_0]o- 57. (2_1+22:) 58. (2n-2:2:) 59. [2_02_0]o+ 60. [2_12_0-:] 61. [2_12_1]o- 62. (2n2_1-:) 63. [2_1+2.2.] 64. [2_12_0-.] 65. [+2.2.2:2.] 66. (+2:22_02:) 67. [+2:2:2:2.] 68. [2_1+2:2.] 69. [+2.2:2:2.] 70. [2_12_1]o+ 71. [2_0+2:2.] 72. [2_0+2:2:] 73. [2_1+2:2:] 74. (+2:22_12:) 75. (4n4n2_0) 76. (4n4n2_1) 77. (+44:2.) 78. (+4:42_0) 79. (4n-2.) 80. (4n-2:) 81. (+44.2.) 82. (+44:2:) 83. (4n-2_0) 84. (4n-2_0') 85. (+4.42_1) 86. (+4:42_1) 87. (+44:2.) 88. (4n-2_1) 89. (4_04_02_0) 90. (4_14_12_1') 91. (4_24_22_0') 92. (4_14_12_1') 93. (4_04_22_1') 94. (4_14_32_0') 95. [4_04_02_0] 96. [4_24_22_0] 97. (4_04n2n) 98. (4_24n2n) 99. [4_04_22_1] 100. (4_14n2n) 101. (+4.4.2.) 102. (4_0+2.) 103. (+4.4:2:) 104. (4_2+2.) 105. (+4:4:2:) 106. (4_0+2:) 107. (+4:4.2.) 108. (4_2+2:) 109. (+4.4:2.) 110. (+4:4:2.) 111. (4_1+2.) 112. (4_1+2:) 113. (+4_04_02_0) 114. (4_0+2_0) 115. (+4_14_12_1') 116. (4_1+2_1') 117. (+4_24_22_0) 118. (4_2+2_0') 119. (+4_14_12_1') 120. (4_1+2_1') 121. (+4_04_22_1') 122. (+4_14_32_0') 123. [+4.4.2.] 124. [+4:4:2:] 125. (+4_04.2) 126. (+4_04:2) 127. [4_0+2.] 128. [4_0+2:] 129. (+4.42.) 130. (+4:42:) 131. [+4:4.2.] 132. [+4.4:2:] 133. (+4_24:2) 134. (+4_24.2) 135. [4_2-2.] 136. [4_2-2:] 137. (+4.42:) 138. (+4:42.) 139. [+4.4:2.] 140. [+4:4:2.] 141. (+4_14.2) 142. (+4_14:2) 143. (no fibration) 144. (no fibration) 145. (no fibration) 146. (no fibration) 147. (no fibration) 148. (no fibration) 149. (no fibration) 150. (no fibration) 151. (no fibration) 152. (no fibration) 153. (no fibration) 154. (no fibration) 155. (no fibration) 156. (no fibration) 157. (no fibration) 158. (no fibration) 159. (no fibration) 160. (no fibration) 161. (no fibration) 162. (no fibration) 163. (no fibration) 164. (no fibration) 165. (no fibration) 166. (no fibration) 167. (no fibration) 168. (no fibration) 169. (no fibration) 170. (no fibration) 171. (no fibration) 172. (no fibration) 173. (no fibration) 174. (no fibration) 175. (no fibration) 176. (no fibration) 177. (no fibration) 178. (no fibration) 179. (3_03_03_0) 180. (3_13_13_1') 181. (3_13_13_1') 182. (3_03_13_-1) 183. (6n3_02n) 184. (6n3_12n) 185. (3_0+3.) 186. (+3.3.3.) 187. (3_0+3:) 188. (+3:3:3:) 189. (3_1+3.) 190. (3_1+3:) 191. (+3_03_03_0) 192. (3_0+3_0) 193. (+3_03_13_2') 194. (3_1+3_1') 195. (+3_03_13_2') 196. (3_1+3_1') 197. (+3_13_13_1') 198. (+63_02.) 199. (+63_02:) 200. (+6.3.2) 201. (+6:3:2) 202. (+63_12.) 203. (+63_12:) 204. [3_03_03_0] 205. [3_0+3.] 206. [3_0+3:] 207. [+3.3.3.] 208. [+3:3:3:] 209. (6_03_02_0) 210. (6_13_12_1') 211. (6_13_12_1') 212. (6_23_22_0') 213. (6_23_22_0') 214. (6_33_02_1') 215. (+6.3.2.) 216. (+6:3:2:) 217. (+6.3.2:) 218. (+6:3:2.) 219. [6_03_02_0] 220. [6_33_02_1] 221. (+6_03_02_0) 222. (+6_13_12_1') 223. (+6_13_12_1') 224. (+6_23_22_0') 225. (+6_23_22_0') 226. (+6_33_02_1') 227. [+6.3.2.] 228. [+6:3:2:] 229. [+6.3.2:] 230. [+6:3:2.] geomview-1.9.5/data/groups/230data.lat0000644000175000017500000000030712310110173014346 000000000000001. 2i 2j 2k 2. 2i 2j 2k 3. 2i j+k j-k 4. 2i 2j 2k 5. i+j i-j 2k 6. j+k k+i i+j 7. 2i 2j 2k i+j+k 8. 2i 2j 2k 9. j+k k+i i+j 10. 2i 2j 2k 11. j+k k+i i+j 12. 2i 2j 2k i+j+k 13. 2i 2j 2k 14. 2i 2j 2k geomview-1.9.5/data/groups/230data.names0000644000175000017500000000514312310110173014674 000000000000001. p1 2. p^1 3. pm 4. pb 5. bm 6. bb 7. p2 8. p21 9. b2 10. p2/m 11. p21/m 12. b2/m 13. p2/b 14. p21/b 15. b2/b 16. p2mm 17. p21mc 18. p2cc 19. p2ma 20. p21ca 21. p2cn 22. p21mn 23. p2ba 24. p21bn 25. p2nn 26. c2mm 27. c21mc 28. c2cc 29. a2mm 30. a2ma 31. a2bm 32. a2ba 33. f2mm 34. f2dd 35. i2mm 36. i21mc 37. i2cc 38. p222 39. p2122 40. p22121 41. p212121 42. c2122 43. c222 44. f222 45. i222 46. i222- 47. p2/m2/m2/m 48. p2/n2/n2/n 49. p2/m2/c2/c 50. p2/n2/b2/a 51. p2/a21/m2/m 52. p2/a2/n21/n 53. p2/a21/c2/c 54. p2/m2/n21/c 55. p2/n21/m21/m 56. p2/m21/n21/n 57. p21/n2/c21/a 58. p2/n21/c21/c 59. p2/m21/b21/a 60. p2/m21/c21/a 61. p21/m21/n21/a 62. p21/a21/b21/c 63. c21/m2/m2/c 64. c21/a2/m2/c 65. c2/m2/m/2/m 66. c2/a2/c2/c 67. c2/a2/m2/m 68. c2/m2/c2/c 69. f2/m2/m2/m 70. f2/d2/d2/d 71. i2/m2/m2/m 72. i2/a2/m2/m 73. i2/m2/c2/c 74. i2/a2/c2/c 75. p^4 76. i^4 77. p^42m 78. p^42c 79. p^421m 80. p^421c 81. p^4m2 82. p^4c2 83. p^4y2 84. p^4n2 85. i^4m2 86. i^4c2 87. i^42m 88. i^42d 89. p4 90. p41 91. p42 92. p43 93. i4 94. i41 95. p4/m 96. p42/m 97. p4/n 98. p42/n 99. i4/m 100. i41/g 101. p4mm 102. p4gm 103. p42cm 104. p42nm 105. p4cc 106. p4nc 107. p42mc 108. p42gc 109. i4mm 110. i4cm 111. i41md 112. i41cd 113. p422 114. p4212 115. p4122 116. p41212 117. p4222 118. p42212 119. p4322 120. p43212 121. i422 122. i4122 123. p4/m2/m2/m 124. p4/m2/c2/c 125. p4/n2/g2/m 126. p4/n2/n2/c 127. p4/m21/g2/m 128. p4/m21/n2/c 129. p4/n21/m2/m 130. p4/n21/c2/c 131. p42/m2/m2/c 132. p42/m2/c2/m 133. p42/n2/g2/c 134. p42/n2/n2/m 135. p42/m21/n2/m 136. p42/m21/g2/c 137. p42/n21/m2/c 138. p42/n21/c2/m 139. i4/m2/m2/m 140. i4/m2/c2/m 141. i41/g2/m2/d 142. i41/g2/c2/d 143. p23 144. f23 145. i23 146. p213 147. i23- 148. p2/m^3 149. p2/n^3 150. f2/m^3 151. f2/d^3 152. i2/m^3 153. p21/a^3 154. i2/m^3- 155. p^43m 156. f^43m 157. i^43m 158. p^43n 159. f^43n 160. i^43d 161. p432 162. p4232 163. f432 164. f4132 165. i432 166. p4132 167. p4332 168. i4132 169. p4/m^32/n 170. p42/n^32/m 171. p42/m^32/n 172. p4/n^32/n 173. f4/m^32/m 174. f4/m^32/n 175. f41/d^32/m 176. f41/d^32/n 177. i4/m^32/m 178. i41/g^32/d 179. p3 180. p31 181. p32 182. r3 183. p^3 184. r^3 185. p31m 186. p3m 187. p31c 188. p3c 189. r3m 190. r3c 191. p312 192. p32 193. p3112 194. p312* 195. p3212 196. p322 197. r32 198. p^312/m 199. p^312/c 200. p^32/m 201. p^32/c 202. r^32/m 203. r^32/c 204. p^6 205. p^62m 206. p^62c 207. p^6m2 208. p^6c2 209. p6 210. p61 211. p65 212. p62 213. p64 214. p63 215. p6mm 216. p6cc 217. p63mc 218. p63cm 219. p6/m 220. p63/m 221. p622 222. p6122 223. p6522 224. p6222 225. p6422 226. p6322 227. p6/m2/m2/m 228. p6/m2/c2/c 229. p63/m2/m2/c 230. p63/m2/c2/m geomview-1.9.5/data/groups/3torus.dgp0000644000175000017500000000345112310110173014444 00000000000000{ = DISCGRP (group 3trans ) (comment " This is a test of the new discrete group library. " ) (attribute Euclidean ) #(display centercam ) (display drawdirdom ) (display geom ) (display zcull) (enumdepth 4 ) (enumdist 10.0 ) (dimn 3 ) (ngens 6 ) (gens a 1 0 0 0 0 1 0 0 0 0 1 0 1 0 -0.1 1 b 1 0 0 0 0 1 0 0 0 0 1 0 0.1 1 0 1 c 1 0 0 0 0 1 0 0 0 0 1 0 0 0.2 1 1 A 1 0 0 0 0 1 0 0 0 0 1 0 -1 0 0.1 1 B 1 0 0 0 0 1 0 0 0 0 1 0 -0.1 -1 0 1 C 1 0 0 0 0 1 0 0 0 0 1 0 0 -0.2 -1 1 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) (geom : dggeomhandle ) (camgeom { = OFF 5 2 5 0 0 0 -0.1 0 0.5 0.1 0 0.5 0 -0.1 0.5 0 0.1 0.5 3 0 1 2 200 200 0 .8 3 0 3 4 0 200 200 .8 } ) } geomview-1.9.5/data/groups/3torus2.dgp0000644000175000017500000000334012310110173014523 00000000000000DISCGRP (group 3trans ) (comment " This is a test of the new discrete group library. " ) (attribute Euclidean ) #(display centercam ) (display zcull) (enumdepth 4 ) (enumdist 10.0 ) (dimn 3 ) (ngens 6 ) (gens 1 0 0 0 0 1 0 0 0 0 1 0 1 0 -0.1 1 1 0 0 0 0 1 0 0 0 0 1 0 0.1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0.2 1 1 1 0 0 0 0 1 0 0 0 0 1 0 -1 0 0.1 1 1 0 0 0 0 1 0 0 0 0 1 0 -0.1 -1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 -0.2 -1 1 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) (camgeom { = OFF 5 2 5 0 0 0 -0.1 0 0.5 0.1 0 0.5 0 -0.1 0.5 0 0.1 0.5 3 0 1 2 200 200 0 .8 3 0 3 4 0 200 200 .8 } ) geomview-1.9.5/data/groups/94a.dgp0000644000175000017500000001035512310110173013603 00000000000000DISCGRP (group 94a ) (comment " Smallest volume hyperbolic manifold? " ) (attribute Hyperbolic ) (dimn 3 ) (ngens 18 ) (gens a 0.69515771 0.9325555 -0.44641247 0.74309361 0.9325555 -0.032798689 0.59483933 0.47388759 0.44641247 -0.59483933 -0.67271382 0.075245082 0.74309361 0.47388759 -0.075245082 1.3350728 b 0.69515771 0.9325555 0.44641247 -0.74309361 0.9325555 -0.032798689 -0.59483933 -0.47388759 -0.44641247 0.59483933 -0.67271382 0.075245082 -0.74309361 -0.47388759 -0.075245082 1.3350728 c -0.68359327 -0.69526094 -0.41063213 -0.34540731 0.61666775 -0.01459119 -0.8171525 0.2196137 0.39042497 -1.2022747 0.57508993 -0.9636516 -0.00323719 0.96388018 -0.40876076 1.4478124 d -0.68359327 -0.69526094 0.41063213 0.34540731 0.61666775 -0.01459119 0.8171525 -0.2196137 -0.39042497 1.2022747 0.57508993 -0.9636516 0.00323719 -0.96388018 -0.40876076 1.4478124 e -0.68359327 0.61666775 -0.39042497 -0.00323719 -0.69526094 -0.01459119 1.2022747 0.96388018 0.41063213 0.8171525 0.57508993 0.40876076 -0.34540731 0.2196137 0.9636516 1.4478124 f -0.68359327 0.61666775 0.39042497 0.00323719 -0.69526094 -0.01459119 -1.2022747 -0.96388018 -0.41063213 -0.8171525 0.57508993 0.40876076 0.34540731 -0.2196137 0.9636516 1.4478124 g -0.076824293 -0.42700848 -0.93487066 0.24944204 0.75604057 -0.90628034 0.5796203 -0.85375696 -1.607969 -0.20775621 -0.11486502 1.2813746 -1.4707357 0.21643215 -0.47237352 1.8528473 h -0.076824293 -0.42700848 0.93487066 -0.24944204 0.75604057 -0.90628034 -0.5796203 0.85375696 1.607969 0.20775621 -0.11486502 1.2813746 1.4707357 -0.21643215 -0.47237352 1.8528473 i -0.076824293 0.75604057 1.607969 -1.4707357 -0.42700848 -0.90628034 0.20775621 0.21643215 0.93487066 -0.5796203 -0.11486502 0.47237352 0.24944204 -0.85375696 -1.2813746 1.8528473 j -0.076824293 0.75604057 -1.607969 1.4707357 -0.42700848 -0.90628034 -0.20775621 -0.21643215 -0.93487066 0.5796203 -0.11486502 0.47237352 -0.24944204 0.85375696 -1.2813746 1.8528473 k 0.27656791 -0.88842064 0.40909496 -0.18204314 -1.7498865 -0.38950139 1.1830077 -1.900874 -0.48701927 -0.50451517 -0.72039133 -0.10337843 1.5413568 0.44219697 -1.0420315 2.1580429 l 0.27656791 -0.88842064 -0.40909496 0.18204314 -1.7498865 -0.38950139 -1.1830077 1.900874 0.48701927 0.50451517 -0.72039133 -0.10337843 -1.5413568 -0.44219697 -1.0420315 2.1580429 m 0.27656791 -1.7498865 -0.48701927 -1.5413568 -0.88842064 -0.38950139 -0.50451517 -0.44219697 0.40909496 1.1830077 -0.72039133 1.0420315 0.18204314 1.900874 0.10337843 2.1580429 n 0.27656791 -1.7498865 0.48701927 1.5413568 -0.88842064 -0.38950139 0.50451517 0.44219697 -0.40909496 -1.1830077 -0.72039133 1.0420315 -0.18204314 -1.900874 0.10337843 2.1580429 o 0.81944591 -0.41962752 1.7334049 -1.6888669 0.66800648 0.19330809 -1.1760963 0.9310227 0.18612789 0.89538449 0.79072976 -0.67941928 -0.39034319 0.12316083 -2.0032845 2.2761118 p 0.81944591 -0.41962752 -1.7334049 1.6888669 0.66800648 0.19330809 1.1760963 -0.9310227 -0.18612789 -0.89538449 0.79072976 -0.67941928 0.39034319 -0.12316083 -2.0032845 2.2761118 r 0.81944591 0.66800648 -0.18612789 -0.39034319 -0.41962752 0.19330809 -0.89538449 0.12316083 -1.7334049 1.1760963 0.79072976 2.0032845 -1.6888669 0.9310227 0.67941928 2.2761118 s 0.81944591 0.66800648 0.18612789 0.39034319 -0.41962752 0.19330809 0.89538449 -0.12316083 1.7334049 -1.1760963 0.79072976 2.0032845 1.6888669 -0.9310227 0.67941928 2.2761118 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) geomview-1.9.5/data/groups/94b.dgp0000644000175000017500000001036112310110173013601 00000000000000DISCGRP (group 94b ) (comment " Smallest volume hyperbolic manifold? " ) (attribute Hyperbolic ) (dimn 3 ) (ngens 18 ) (gens a -0.048432771 0.53946757 -1.2293712 -0.89706439 -0.64358145 -0.93467182 0.0067009302 0.53651971 -0.79742205 0.52994418 0.29093555 0.036963571 -0.22896452 -0.66744101 0.77203745 1.4470468 b -0.048432771 0.53946757 1.2293712 0.89706439 -0.64358145 -0.93467182 -0.0067009302 -0.53651971 0.79742205 -0.52994418 0.29093555 0.036963571 0.22896452 0.66744101 0.77203745 1.4470468 c -0.048432771 -0.64358145 0.79742205 -0.22896452 0.53946757 -0.93467182 -0.52994418 -0.66744101 1.2293712 -0.0067009302 0.29093555 -0.77203745 -0.89706439 0.53651971 -0.036963571 1.4470468 d -0.048432771 -0.64358145 -0.79742205 0.22896452 0.53946757 -0.93467182 0.52994418 0.66744101 -1.2293712 0.0067009302 0.29093555 -0.77203745 0.89706439 -0.53651971 -0.036963571 1.4470468 e 1.0941947 0.64803386 -0.01528549 -0.7857756 0.64803386 -0.43183565 0.82143694 -0.53027219 0.01528549 -0.82143694 -0.85671443 0.63949347 -0.7857756 -0.53027219 -0.63949347 1.5190735 f 1.0941947 0.64803386 0.01528549 0.7857756 0.64803386 -0.43183565 -0.82143694 0.53027219 -0.01528549 0.82143694 -0.85671443 0.63949347 0.7857756 0.53027219 -0.63949347 1.5190735 g -0.66216111 0.78015375 -0.0088203801 -0.21719833 -0.53177488 -0.036023311 1.656855 -1.4245176 0.72973353 0.62916303 0.26876017 -0.024273572 0.50373894 -0.076050997 -1.3481388 1.7541423 h -0.66216111 0.78015375 0.0088203801 0.21719833 -0.53177488 -0.036023311 -1.656855 1.4245176 -0.72973353 -0.62916303 0.26876017 -0.024273572 -0.50373894 0.076050997 -1.3481388 1.7541423 i -0.66216111 -0.53177488 -0.72973353 0.50373894 0.78015375 -0.036023311 -0.62916303 -0.076050997 0.0088203801 -1.656855 0.26876017 1.3481388 -0.21719833 -1.4245176 0.024273572 1.7541423 j -0.66216111 -0.53177488 0.72973353 -0.50373894 0.78015375 -0.036023311 0.62916303 0.076050997 -0.0088203801 1.656855 0.26876017 1.3481388 0.21719833 1.4245176 0.024273572 1.7541423 k 0.84087801 0.50452042 0.54290265 -0.50632006 -0.58311361 0.17187595 0.79599869 -0.056362201 0.98707831 -1.2011001 1.0970596 -1.6187973 -1.0106537 0.85248089 -1.0639064 1.9697821 l 0.84087801 0.50452042 -0.54290265 0.50632006 -0.58311361 0.17187595 -0.79599869 0.056362201 -0.98707831 1.2011001 1.0970596 -1.6187973 1.0106537 -0.85248089 -1.0639064 1.9697821 m 0.84087801 -0.58311361 -0.98707831 -1.0106537 0.50452042 0.17187595 1.2011001 0.85248089 -0.54290265 -0.79599869 1.0970596 1.0639064 -0.50632006 -0.056362201 1.6187973 1.9697821 n 0.84087801 -0.58311361 0.98707831 1.0106537 0.50452042 0.17187595 -1.2011001 -0.85248089 0.54290265 0.79599869 1.0970596 1.0639064 0.50632006 0.056362201 1.6187973 1.9697821 o -0.41325793 -0.94610953 -0.64901817 -0.69794691 -0.94610953 1.5756168 -0.035764281 1.5423913 0.64901817 0.035764281 -0.83344561 -0.34225029 -0.69794691 1.5423913 0.34225029 1.9958048 p -0.41325793 -0.94610953 0.64901817 0.69794691 -0.94610953 1.5756168 0.035764281 -1.5423913 -0.64901817 -0.035764281 -0.83344561 -0.34225029 0.69794691 -1.5423913 0.34225029 1.9958048 r -0.38950139 -1.7498865 1.1830077 -1.900874 -0.88842064 0.27656791 0.40909496 -0.18204314 -0.50451517 -0.48701927 -0.72039133 -0.10337843 0.44219697 1.5413568 -1.0420315 2.1580429 R -0.38950133 -0.88842058 -0.50451523 -0.44219705 -1.7498868 0.27656788 -0.4870193 -1.5413573 1.1830078 0.40909493 -0.72039133 1.0420315 1.9008741 0.18204316 0.10337844 2.1580429 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) geomview-1.9.5/data/groups/borrom.dgp0000644000175000017500000000552012310110173014504 00000000000000DISCGRP (group borrom ) (attribute Hyperbolic ) (dimn 3 ) (ngens 12 ) (gens a -1 -2 0 -2 2 1 0 2 0 0 1 0 2 2 0 3 b -1 2 0 2 -2 1 0 2 0 0 1 0 -2 2 0 3 c 1 0 0 0 0 -1 -2 -2 0 2 1 2 0 2 2 3 d 1 0 0 0 0 -1 2 2 0 -2 1 2 0 -2 2 3 e 1 0 2 2 0 1 0 0 -2 0 -1 -2 2 0 2 3 f 1 0 -2 2 0 1 0 0 2 0 -1 2 2 0 -2 3 g -1 2 0 -2 -2 1 0 -2 0 0 1 0 2 -2 0 3 h -1 -2 0 2 2 1 0 -2 0 0 1 0 -2 -2 0 3 i 1 0 0 0 0 -1 2 -2 0 -2 1 -2 0 2 -2 3 j 1 0 0 0 0 -1 -2 2 0 2 1 -2 0 -2 -2 3 k 1 0 -2 -2 0 1 0 0 2 0 -1 -2 -2 0 2 3 l 1 0 2 -2 0 1 0 0 -2 0 -1 2 -2 0 -2 3 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) geomview-1.9.5/data/groups/borrom2.dgp0000644000175000017500000000105612310110173014566 00000000000000DISCGRP (group borrom2 ) (comment " Order 2 Borromean orbifold. " ) (attribute Euclidean ) (display zcull) (enumdepth 4 ) (enumdist 10.0 ) (dimn 3 ) (ngens 6 ) (gens a -1 0 0 0 0 -1 0 0 0 0 1 0 1 0 0 1 d -1 0 0 0 0 -1 0 0 0 0 1 0 -1 0 0 1 b 1 0 0 0 0 -1 0 0 0 0 -1 0 0 1 0 1 e 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -1 0 1 c -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 1 1 f -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 -1 1 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) (camgeom { = OFF 5 2 5 0 0 0 -0.1 0 0.5 0.1 0 0.5 0 -0.1 0.5 0 0.1 0.5 3 0 1 2 200 200 0 3 0 3 4 0 200 200 } ) geomview-1.9.5/data/groups/borrom3.dgp0000644000175000017500000000552112310110173014570 00000000000000DISCGRP (group borrom3 ) (attribute Hyperbolic ) (dimn 3 ) (ngens 12 ) (gens a -1.6513901 1.15139 0 -1.74722 -1.15139 -0.5 0 -0.75874501 0 0 1 0 1.74722 -0.75874501 0 2.1513901 b -1.6513901 1.15139 0 1.74722 -1.15139 -0.5 0 0.75874501 0 0 1 0 -1.74722 0.75874501 0 2.1513901 c 1 0 0 0 0 -1.6513901 1.15139 -1.74722 0 -1.15139 -0.5 -0.75874501 0 1.74722 -0.75874501 2.1513901 d 1 0 0 0 0 -1.6513901 1.15139 1.74722 0 -1.15139 -0.5 0.75874501 0 -1.74722 0.75874501 2.1513901 e -0.5 0 -1.15139 -0.75874501 0 1 0 0 1.15139 0 -1.6513901 -1.74722 -0.75874501 0 1.74722 2.1513901 f -0.5 0 -1.15139 0.75874501 0 1 0 0 1.15139 0 -1.6513901 1.74722 0.75874501 0 -1.74722 2.1513901 g -1.6513901 -1.15139 0 -1.74722 1.15139 -0.5 0 0.75874501 0 0 1 0 1.74722 0.75874501 0 2.1513901 h -1.6513901 -1.15139 0 1.74722 1.15139 -0.5 0 -0.75874501 0 0 1 0 -1.74722 -0.75874501 0 2.1513901 i 1 0 0 0 0 -1.6513901 -1.15139 -1.74722 0 1.15139 -0.5 0.75874501 0 1.74722 0.75874501 2.1513901 j 1 0 0 0 0 -1.6513901 -1.15139 1.74722 0 1.15139 -0.5 -0.75874501 0 -1.74722 -0.75874501 2.1513901 k -0.5 0 1.15139 0.75874501 0 1 0 0 -1.15139 0 -1.6513901 -1.74722 0.75874501 0 1.74722 2.1513901 l -0.5 0 1.15139 -0.75874501 0 1 0 0 -1.15139 0 -1.6513901 1.74722 -0.75874501 0 -1.74722 2.1513901 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) geomview-1.9.5/data/groups/borrom4.dgp0000644000175000017500000000670012310110173014571 00000000000000DISCGRP (group borrom4 ) (comment " This is a test of the new discrete group library. " ) (attribute Hyperbolic ) # following command is dangerous unless the viewer is in hyperbolic mode (display centercam ) (display zcull ) (display drawdirdom ) (enumdepth 2 ) (enumdist 10.0 ) (dimn 3 ) (ngens 12 ) (geom : dggeomhandle ) (wafile borrom4.wa) (gens a -1.618033988749887 1.618033988749892 0 -2.058171027271484 -1.618033988749893 0 0 -1.272019649514066 0 0 1. 0 2.058171027271483 -1.272019649514065 0 2.618033988749887 d -1.618033988749887 1.618033988749892 0 2.058171027271484 -1.618033988749893 0 0 1.272019649514066 0 0 1. 0 -2.058171027271483 1.272019649514065 0 2.618033988749887 b 1. 0 0 0 0 -1.618033988749886 1.618033988749892 -2.058171027271483 0 -1.618033988749892 0 -1.272019649514065 0 2.058171027271483 -1.272019649514066 2.618033988749886 e 1. 0 0 0 0 -1.618033988749886 1.618033988749892 2.058171027271483 0 -1.618033988749892 0 1.272019649514065 0 -2.058171027271483 1.272019649514066 2.618033988749886 c 0 0 -1.618033988749892 -1.272019649514065 0 1. 0 0 1.618033988749892 0 -1.618033988749886 -2.058171027271483 -1.272019649514066 0 2.058171027271483 2.618033988749886 f 0 0 -1.618033988749892 1.272019649514065 0 1. 0 0 1.618033988749892 0 -1.618033988749886 2.058171027271483 1.272019649514066 0 -2.058171027271483 2.618033988749886 A -1.618033988749886 -1.618033988749892 0 -2.058171027271484 1.618033988749892 0 0 1.272019649514066 0 0 1. 0 2.058171027271483 1.272019649514065 0 2.618033988749886 D -1.618033988749886 -1.618033988749892 0 2.058171027271484 1.618033988749892 0 0 -1.272019649514066 0 0 1. 0 -2.058171027271483 -1.272019649514065 0 2.618033988749886 B 1. 0 0 0 0 -1.618033988749885 -1.618033988749892 -2.058171027271483 0 1.618033988749891 0 1.272019649514065 0 2.058171027271482 1.272019649514065 2.618033988749886 E 1. 0 0 0 0 -1.618033988749885 -1.618033988749892 2.058171027271483 0 1.618033988749891 0 -1.272019649514065 0 -2.058171027271482 -1.272019649514065 2.618033988749886 C 0 0 1.618033988749891 1.272019649514064 0 1. 0 0 -1.618033988749892 0 -1.618033988749885 -2.058171027271483 1.272019649514065 0 2.058171027271482 2.618033988749885 F 0 0 1.618033988749891 -1.272019649514064 0 1. 0 0 -1.618033988749892 0 -1.618033988749885 2.058171027271483 -1.272019649514065 0 -2.058171027271482 2.618033988749885 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) (camgeom { = OFF 5 2 5 0 0 0 -0.1 0 0.5 0.1 0 0.5 0 -0.1 0.5 0 0.1 0.5 3 0 1 2 200 200 0 1 3 0 3 4 0 200 200 1 } ) geomview-1.9.5/data/groups/borrom4.wa0000644000175000017500000000666712310110173014442 00000000000000Format 2.2 fsa { states 51 symbols 13 bfs min variables 1 alphabet {1 = a 2 = A 3 = b 4 = B 5 = c 6 = C 7 = d 8 = D 9 = e 10 = E 11 = f 12 = F 13 = $ } start { 1 } % atable 1 N 2 3 4 5 6 7 8 9 10 11 12 13 14; 2 N 3 0 4 5 6 7 8 9 10 11 12 13 14; 3 N 0 0 4 5 6 7 8 9 10 11 12 13 14; 4 N 0 3 5 0 6 7 8 9 10 11 12 13 14; 5 N 0 3 0 0 6 7 8 9 10 11 12 13 14; 6 N 15 3 0 16 17 0 0 0 10 11 12 13 14; 7 N 18 19 0 5 0 0 8 9 10 11 12 13 14; 8 N 2 3 20 16 17 0 21 0 10 11 12 13 14; 9 N 2 22 20 16 23 0 0 0 0 0 12 13 14; 10 N 3 0 4 5 24 25 0 9 26 0 12 13 14; 11 N 27 0 4 28 24 25 0 29 0 0 0 0 14; 12 N 0 0 5 0 6 7 30 9 0 11 31 0 14; 13 N 32 33 16 0 6 34 0 0 0 11 0 0 14; 14 A 0 0 0 0 0 0 0 0 0 0 0 0 14; 15 N 3 0 4 5 24 35 36 9 26 0 12 13 14; 16 N 0 3 0 0 6 37 21 0 10 11 12 13 14; 17 N 18 19 0 16 0 0 0 0 10 11 12 13 14; 18 N 19 0 38 5 0 35 36 9 26 0 12 13 14; 19 N 0 0 38 5 0 7 8 9 10 11 12 13 14; 20 N 0 3 16 0 6 37 39 0 40 11 0 13 14; 21 N 2 3 20 16 17 0 0 0 10 11 12 13 14; 22 N 0 0 0 0 6 7 8 9 10 11 12 13 14; 23 N 18 41 0 16 0 0 0 0 26 0 12 13 14; 24 N 15 42 0 16 23 0 0 0 26 0 12 13 14; 25 N 43 0 0 5 0 0 36 9 26 0 12 13 14; 26 N 3 0 4 5 24 25 0 9 0 0 12 13 14; 27 N 0 0 4 44 6 7 8 9 45 11 31 0 14; 28 N 0 19 0 0 0 0 8 9 10 11 12 13 14; 29 N 2 22 20 46 23 0 0 0 0 0 0 13 14; 30 N 47 3 48 0 17 0 21 0 10 11 12 13 14; 31 N 0 0 5 0 6 7 49 29 0 11 0 0 14; 32 N 27 0 4 44 6 7 30 9 0 11 31 0 14; 33 N 0 0 5 0 6 7 8 9 45 11 31 0 14; 34 N 0 0 0 5 0 0 8 9 10 11 12 13 14; 35 N 18 41 0 5 0 0 36 9 26 0 12 13 14; 36 N 15 3 0 16 17 0 21 0 10 11 12 13 14; 37 N 0 19 0 5 0 0 8 9 10 11 12 13 14; 38 N 0 27 5 0 6 7 8 9 45 11 31 0 14; 39 N 2 3 20 46 17 0 0 0 40 11 0 13 14; 40 N 3 0 50 5 23 0 0 9 26 0 12 13 14; 41 N 0 0 0 5 0 7 8 9 10 11 12 13 14; 42 N 0 0 0 5 6 7 8 9 10 11 12 13 14; 43 N 0 0 38 5 0 35 36 9 26 0 12 13 14; 44 N 0 19 0 0 0 7 8 9 10 11 12 13 14; 45 N 19 0 38 5 0 25 0 9 26 0 12 13 14; 46 N 0 3 0 0 17 0 21 0 10 11 12 13 14; 47 N 3 0 4 5 6 7 30 9 0 11 12 13 14; 48 N 0 3 0 0 6 37 39 0 40 11 0 13 14; 49 N 47 3 48 0 17 0 39 0 40 11 0 13 14; 50 N 0 3 5 0 6 7 51 29 40 11 0 13 14; 51 N 2 3 20 46 17 0 39 0 40 11 0 13 14; } # Symbols used for inverses of generators inverses { inv(a)=A inv(A)=a inv(b)=B inv(B)=b inv(c)=C inv(C)=c inv(d)=D inv(D)=d inv(e)=E inv(E)=e inv(f)=F inv(F)=f } geomview-1.9.5/data/groups/fig8.dgp0000644000175000017500000000366112310110173014045 00000000000000DISCGRP (group fig8 ) (attribute Hyperbolic ) (dimn 3 ) (ngens 8 ) (gens a 0.83333337 0.28867513 -0.5 -0.16666667 -0.86602545 0.5 -0.86602545 0.86602545 0.5 0.86602545 1 -1 -0.83333337 -0.28867513 -1 1.6666667 b -0.16666667 0.86602545 -0.5 -0.16666667 -0.86602545 0.5 0.86602545 -0.86602545 0.5 0.86602545 1 -1 0.16666667 -0.86602545 -1 1.6666667 c 0.83333337 0.86602545 -0.5 0.83333337 -0.28867513 0.5 0.86602545 -0.28867513 0.5 -0.86602545 1 -1 0.16666667 0.86602545 -1 1.6666667 d -0.16666667 -0.86602545 0.5 -0.16666667 0.86602545 0.5 0.86602545 0.86602545 -0.5 0.86602545 1 1 0.16666667 0.86602545 1 1.6666667 e 0.33333331 -1.1547005 0 -0.66666669 1.1547005 1 0 1.1547005 0 0 1 0 0.66666669 1.1547005 0 1.6666667 f 0.33333331 1.1547005 0 -0.66666669 -1.1547005 1 0 -1.1547005 0 0 1 0 0.66666669 -1.1547005 0 1.6666667 g 0.83333337 -0.28867513 0.5 -0.16666667 0.86602545 0.5 -0.86602545 -0.86602545 -0.5 0.86602545 1 1 -0.83333337 0.28867513 1 1.6666667 h 0.83333337 -0.86602545 0.5 0.83333337 0.28867513 0.5 0.86602545 0.28867513 -0.5 -0.86602545 1 1 0.16666667 -0.86602545 1 1.6666667 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) geomview-1.9.5/data/groups/g233.prj0000644000175000017500000000732412310110173013707 00000000000000# 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # a 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # ab 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abc 0.000000 0.707107 0.707107 0.000000 -0.707107 -0.500000 0.500000 0.000000 -0.707107 0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abca 0.000000 -0.707107 0.707107 0.000000 -0.707107 0.500000 0.500000 0.000000 -0.707107 -0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcab 0.000000 -0.707107 -0.707107 0.000000 -0.707107 0.500000 -0.500000 0.000000 -0.707107 -0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabc -1.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcb 0.000000 0.707107 -0.707107 0.000000 -0.707107 -0.500000 -0.500000 0.000000 -0.707107 0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # ac 0.000000 0.707107 0.707107 0.000000 -0.707107 -0.500000 0.500000 0.000000 0.707107 -0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # aca 0.000000 -0.707107 0.707107 0.000000 -0.707107 0.500000 0.500000 0.000000 0.707107 0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acab 0.000000 -0.707107 -0.707107 0.000000 -0.707107 0.500000 -0.500000 0.000000 0.707107 0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabc -1.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acb 0.000000 0.707107 -0.707107 0.000000 -0.707107 -0.500000 -0.500000 0.000000 0.707107 -0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # b 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bc 0.000000 0.707107 0.707107 0.000000 0.707107 0.500000 -0.500000 0.000000 -0.707107 0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bca 0.000000 -0.707107 0.707107 0.000000 0.707107 -0.500000 -0.500000 0.000000 -0.707107 -0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcab 0.000000 -0.707107 -0.707107 0.000000 0.707107 -0.500000 0.500000 0.000000 -0.707107 -0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabc -1.000001 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcb 0.000000 0.707107 -0.707107 0.000000 0.707107 0.500000 0.500000 0.000000 -0.707107 0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # c 0.000000 0.707107 0.707107 0.000000 0.707107 0.500000 -0.500000 0.000000 0.707107 -0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # ca 0.000000 -0.707107 0.707107 0.000000 0.707107 -0.500000 -0.500000 0.000000 0.707107 0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cab 0.000000 -0.707107 -0.707107 0.000000 0.707107 -0.500000 0.500000 0.000000 0.707107 0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabc -1.000001 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cb 0.000000 0.707107 -0.707107 0.000000 0.707107 0.500000 0.500000 0.000000 0.707107 -0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 geomview-1.9.5/data/groups/g234.prj0000644000175000017500000001676012310110173013714 00000000000000# 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # a 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # ab 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abc 0.500000 0.707107 0.500000 0.000000 -0.707107 0.000000 0.707107 0.000000 -0.500000 0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abca 0.500000 -0.707107 0.500000 0.000000 -0.707107 0.000000 0.707107 0.000000 -0.500000 -0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcab 0.500000 -0.707107 -0.500000 0.000000 -0.707107 0.000000 -0.707107 0.000000 -0.500000 -0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabc -0.500000 0.707107 0.500000 0.000000 -0.707107 0.000000 -0.707107 0.000000 -0.500000 -0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabca -0.500000 -0.707107 0.500000 0.000000 -0.707107 0.000000 -0.707107 0.000000 -0.500000 0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcab -0.500000 -0.707107 -0.500000 0.000000 -0.707107 0.000000 0.707107 0.000000 -0.500000 0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabc -1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcb -0.500000 0.707107 -0.500000 0.000000 -0.707107 0.000000 0.707107 0.000000 -0.500000 -0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcac 0.000000 0.000000 1.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcacb 0.000000 0.000000 -1.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcb 0.500000 0.707107 -0.500000 0.000000 -0.707107 0.000000 -0.707107 0.000000 -0.500000 0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # ac 0.500000 0.707107 0.500000 0.000000 -0.707107 0.000000 0.707107 0.000000 0.500000 -0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # aca 0.500000 -0.707107 0.500000 0.000000 -0.707107 0.000000 0.707107 0.000000 0.500000 0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acab 0.500000 -0.707107 -0.500000 0.000000 -0.707107 0.000000 -0.707107 0.000000 0.500000 0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabc -0.500000 0.707107 0.500000 0.000000 -0.707107 0.000000 -0.707107 0.000000 0.500000 0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabca -0.500000 -0.707107 0.500000 0.000000 -0.707107 0.000000 -0.707107 0.000000 0.500000 -0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcab -0.500000 -0.707107 -0.500000 0.000000 -0.707107 0.000000 0.707107 0.000000 0.500000 -0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabc -1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcb -0.500000 0.707107 -0.500000 0.000000 -0.707107 0.000000 0.707107 0.000000 0.500000 0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acac 0.000000 0.000000 1.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acacb 0.000000 0.000000 -1.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acb 0.500000 0.707107 -0.500000 0.000000 -0.707107 0.000000 -0.707107 0.000000 0.500000 -0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # b 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bc 0.500000 0.707107 0.500000 0.000000 0.707107 0.000000 -0.707107 0.000000 -0.500000 0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bca 0.500000 -0.707107 0.500000 0.000000 0.707107 0.000000 -0.707107 0.000000 -0.500000 -0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcab 0.500000 -0.707107 -0.500000 0.000000 0.707107 0.000000 0.707107 0.000000 -0.500000 -0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabc -0.500000 0.707107 0.500000 0.000000 0.707107 0.000000 0.707107 0.000000 -0.500000 -0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabca -0.500000 -0.707107 0.500000 0.000000 0.707107 0.000000 0.707107 0.000000 -0.500000 0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcab -0.500000 -0.707107 -0.500000 0.000000 0.707107 0.000000 -0.707107 0.000000 -0.500000 0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabc -1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcb -0.500000 0.707107 -0.500000 0.000000 0.707107 0.000000 -0.707107 0.000000 -0.500000 -0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcac 0.000000 0.000000 1.000000 0.000000 0.000000 1.000001 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcacb 0.000000 0.000000 -1.000000 0.000000 0.000000 1.000001 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcb 0.500000 0.707107 -0.500000 0.000000 0.707107 0.000000 0.707107 0.000000 -0.500000 0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # c 0.500000 0.707107 0.500000 0.000000 0.707107 0.000000 -0.707107 0.000000 0.500000 -0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # ca 0.500000 -0.707107 0.500000 0.000000 0.707107 0.000000 -0.707107 0.000000 0.500000 0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cab 0.500000 -0.707107 -0.500000 0.000000 0.707107 0.000000 0.707107 0.000000 0.500000 0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabc -0.500000 0.707107 0.500000 0.000000 0.707107 0.000000 0.707107 0.000000 0.500000 0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabca -0.500000 -0.707107 0.500000 0.000000 0.707107 0.000000 0.707107 0.000000 0.500000 -0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcab -0.500000 -0.707107 -0.500000 0.000000 0.707107 0.000000 -0.707107 0.000000 0.500000 -0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabc -1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcb -0.500000 0.707107 -0.500000 0.000000 0.707107 0.000000 -0.707107 0.000000 0.500000 0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cac 0.000000 0.000000 1.000000 0.000000 0.000000 1.000001 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cacb 0.000000 0.000000 -1.000000 0.000000 0.000000 1.000001 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cb 0.500000 0.707107 -0.500000 0.000000 0.707107 0.000000 0.707107 0.000000 0.500000 -0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 geomview-1.9.5/data/groups/g235.prj0000644000175000017500000004623012310110173013710 00000000000000# 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # a 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # ab 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abc 0.809017 0.500000 0.309017 0.000000 -0.500000 0.309017 0.809017 0.000000 -0.309017 0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abca 0.809017 -0.500000 0.309017 0.000000 -0.500000 -0.309017 0.809017 0.000000 -0.309017 -0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcab 0.809017 -0.500000 -0.309017 0.000000 -0.500000 -0.309017 -0.809017 0.000000 -0.309017 -0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabc 0.309017 0.809017 0.500000 0.000000 -0.809017 0.500000 -0.309017 0.000000 -0.500000 -0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabca 0.309017 -0.809017 0.500000 0.000000 -0.809017 -0.500000 -0.309017 0.000000 -0.500000 0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcab 0.309017 -0.809017 -0.500000 0.000000 -0.809017 -0.500000 0.309017 0.000000 -0.500000 0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabc -0.309017 0.809017 0.500000 0.000000 -0.809017 -0.500000 0.309017 0.000000 -0.500000 0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabca -0.309017 -0.809017 0.500000 0.000000 -0.809017 0.500000 0.309017 0.000000 -0.500000 -0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcab -0.309017 -0.809017 -0.500000 0.000000 -0.809017 0.500000 -0.309017 0.000000 -0.500000 -0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcabc -0.809017 0.500000 0.309017 0.000000 -0.500000 -0.309017 -0.809017 0.000000 -0.309017 -0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcabca -0.809017 -0.500000 0.309017 0.000000 -0.500000 0.309017 -0.809017 0.000000 -0.309017 0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcabcab -0.809017 -0.500000 -0.309017 0.000000 -0.500000 0.309017 0.809017 0.000000 -0.309017 0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcabcabc -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcabcb -0.809017 0.500000 -0.309017 0.000000 -0.500000 -0.309017 0.809017 0.000000 -0.309017 -0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcac -0.500000 -0.309017 0.809017 0.000000 -0.309017 -0.809017 -0.500000 0.000000 -0.809017 0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcacb -0.500000 -0.309017 -0.809017 0.000000 -0.309017 -0.809017 0.500000 0.000000 -0.809017 0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcb -0.309017 0.809017 -0.500000 0.000000 -0.809017 -0.500000 -0.309017 0.000000 -0.500000 0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcac 0.000000 0.000000 1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcacb 0.000000 0.000000 -1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcb 0.309017 0.809017 -0.500000 0.000000 -0.809017 0.500000 0.309017 0.000000 -0.500000 -0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcac 0.500000 0.309017 0.809017 0.000000 -0.309017 -0.809017 0.500000 0.000000 -0.809017 0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcaca 0.500000 -0.309017 0.809017 0.000000 -0.309017 0.809017 0.500000 0.000000 -0.809017 -0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcacab 0.500000 -0.309017 -0.809017 0.000000 -0.309017 0.809017 -0.500000 0.000000 -0.809017 -0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcacabc 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcacabca 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcacabcac -0.500000 0.309017 0.809017 0.000000 -0.309017 0.809017 -0.500000 0.000000 -0.809017 -0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcacabcacb -0.500000 0.309017 -0.809017 0.000000 -0.309017 0.809017 0.500000 0.000000 -0.809017 -0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcacb 0.500000 0.309017 -0.809017 0.000000 -0.309017 -0.809017 -0.500000 0.000000 -0.809017 0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcb 0.809017 0.500000 -0.309017 0.000000 -0.500000 0.309017 -0.809017 0.000000 -0.309017 0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # ac 0.809017 0.500000 0.309017 0.000000 -0.500000 0.309017 0.809017 0.000000 0.309017 -0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # aca 0.809017 -0.500000 0.309017 0.000000 -0.500000 -0.309017 0.809017 0.000000 0.309017 0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acab 0.809017 -0.500000 -0.309017 0.000000 -0.500000 -0.309017 -0.809017 0.000000 0.309017 0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabc 0.309017 0.809017 0.500000 0.000000 -0.809017 0.500000 -0.309017 0.000000 0.500000 0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabca 0.309017 -0.809017 0.500000 0.000000 -0.809017 -0.500000 -0.309017 0.000000 0.500000 -0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcab 0.309017 -0.809017 -0.500000 0.000000 -0.809017 -0.500000 0.309017 0.000000 0.500000 -0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabc -0.309017 0.809017 0.500000 0.000000 -0.809017 -0.500000 0.309017 0.000000 0.500000 -0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabca -0.309017 -0.809017 0.500000 0.000000 -0.809017 0.500000 0.309017 0.000000 0.500000 0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcab -0.309017 -0.809017 -0.500000 0.000000 -0.809017 0.500000 -0.309017 0.000000 0.500000 0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcabc -0.809017 0.500000 0.309017 0.000000 -0.500000 -0.309017 -0.809017 0.000000 0.309017 0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcabca -0.809017 -0.500000 0.309017 0.000000 -0.500000 0.309017 -0.809017 0.000000 0.309017 -0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcabcab -0.809017 -0.500000 -0.309017 0.000000 -0.500000 0.309017 0.809017 0.000000 0.309017 -0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcabcabc -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcabcb -0.809017 0.500000 -0.309017 0.000000 -0.500000 -0.309017 0.809017 0.000000 0.309017 0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcac -0.500000 -0.309017 0.809017 0.000000 -0.309017 -0.809017 -0.500000 0.000000 0.809017 -0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcacb -0.500000 -0.309017 -0.809017 0.000000 -0.309017 -0.809017 0.500000 0.000000 0.809017 -0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcb -0.309017 0.809017 -0.500000 0.000000 -0.809017 -0.500000 -0.309017 0.000000 0.500000 -0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcac 0.000000 0.000000 1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcacb 0.000000 0.000000 -1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcb 0.309017 0.809017 -0.500000 0.000000 -0.809017 0.500000 0.309017 0.000000 0.500000 0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # acac 0.500000 0.309017 0.809017 0.000000 -0.309017 -0.809017 0.500000 0.000000 0.809017 -0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # acaca 0.500000 -0.309017 0.809017 0.000000 -0.309017 0.809017 0.500000 0.000000 0.809017 0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # acacab 0.500000 -0.309017 -0.809017 0.000000 -0.309017 0.809017 -0.500000 0.000000 0.809017 0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # acacabc 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acacabca 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acacabcac -0.500000 0.309017 0.809017 0.000000 -0.309017 0.809017 -0.500000 0.000000 0.809017 0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # acacabcacb -0.500000 0.309017 -0.809017 0.000000 -0.309017 0.809017 0.500000 0.000000 0.809017 0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # acacb 0.500000 0.309017 -0.809017 0.000000 -0.309017 -0.809017 -0.500000 0.000000 0.809017 -0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # acb 0.809017 0.500000 -0.309017 0.000000 -0.500000 0.309017 -0.809017 0.000000 0.309017 -0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # b 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bc 0.809017 0.500000 0.309017 0.000000 0.500000 -0.309017 -0.809017 0.000000 -0.309017 0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bca 0.809017 -0.500000 0.309017 0.000000 0.500000 0.309017 -0.809017 0.000000 -0.309017 -0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcab 0.809017 -0.500000 -0.309017 0.000000 0.500000 0.309017 0.809017 0.000000 -0.309017 -0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabc 0.309017 0.809017 0.500000 0.000000 0.809017 -0.500000 0.309017 0.000000 -0.500000 -0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabca 0.309017 -0.809017 0.500000 0.000000 0.809017 0.500000 0.309017 0.000000 -0.500000 0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcab 0.309017 -0.809017 -0.500000 0.000000 0.809017 0.500000 -0.309017 0.000000 -0.500000 0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabc -0.309017 0.809017 0.500000 0.000000 0.809017 0.500000 -0.309017 0.000000 -0.500000 0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabca -0.309017 -0.809017 0.500000 0.000000 0.809017 -0.500000 -0.309017 0.000000 -0.500000 -0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcab -0.309017 -0.809017 -0.500000 0.000000 0.809017 -0.500000 0.309017 0.000000 -0.500000 -0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcabc -0.809017 0.500000 0.309017 0.000000 0.500000 0.309017 0.809017 0.000000 -0.309017 -0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcabca -0.809017 -0.500000 0.309017 0.000000 0.500000 -0.309017 0.809017 0.000000 -0.309017 0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcabcab -0.809017 -0.500000 -0.309017 0.000000 0.500000 -0.309017 -0.809017 0.000000 -0.309017 0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcabcabc -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcabcb -0.809017 0.500000 -0.309017 0.000000 0.500000 0.309017 -0.809017 0.000000 -0.309017 -0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcac -0.500000 -0.309017 0.809017 0.000000 0.309017 0.809017 0.500000 0.000000 -0.809017 0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcacb -0.500000 -0.309017 -0.809017 0.000000 0.309017 0.809017 -0.500000 0.000000 -0.809017 0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcb -0.309017 0.809017 -0.500000 0.000000 0.809017 0.500000 0.309017 0.000000 -0.500000 0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcac 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcacb 0.000000 0.000000 -1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcb 0.309017 0.809017 -0.500000 0.000000 0.809017 -0.500000 -0.309017 0.000000 -0.500000 -0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcac 0.500000 0.309017 0.809017 0.000000 0.309017 0.809017 -0.500000 0.000000 -0.809017 0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcaca 0.500000 -0.309017 0.809017 0.000000 0.309017 -0.809017 -0.500000 0.000000 -0.809017 -0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcacab 0.500000 -0.309017 -0.809017 0.000000 0.309017 -0.809017 0.500000 0.000000 -0.809017 -0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcacabc 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcacabca 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcacabcac -0.500000 0.309017 0.809017 0.000000 0.309017 -0.809017 0.500000 0.000000 -0.809017 -0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcacabcacb -0.500000 0.309017 -0.809017 0.000000 0.309017 -0.809017 -0.500000 0.000000 -0.809017 -0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcacb 0.500000 0.309017 -0.809017 0.000000 0.309017 0.809017 0.500000 0.000000 -0.809017 0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcb 0.809017 0.500000 -0.309017 0.000000 0.500000 -0.309017 0.809017 0.000000 -0.309017 0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # c 0.809017 0.500000 0.309017 0.000000 0.500000 -0.309017 -0.809017 0.000000 0.309017 -0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # ca 0.809017 -0.500000 0.309017 0.000000 0.500000 0.309017 -0.809017 0.000000 0.309017 0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cab 0.809017 -0.500000 -0.309017 0.000000 0.500000 0.309017 0.809017 0.000000 0.309017 0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabc 0.309017 0.809017 0.500000 0.000000 0.809017 -0.500000 0.309017 0.000000 0.500000 0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabca 0.309017 -0.809017 0.500000 0.000000 0.809017 0.500000 0.309017 0.000000 0.500000 -0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcab 0.309017 -0.809017 -0.500000 0.000000 0.809017 0.500000 -0.309017 0.000000 0.500000 -0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabc -0.309017 0.809017 0.500000 0.000000 0.809017 0.500000 -0.309017 0.000000 0.500000 -0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabca -0.309017 -0.809017 0.500000 0.000000 0.809017 -0.500000 -0.309017 0.000000 0.500000 0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcab -0.309017 -0.809017 -0.500000 0.000000 0.809017 -0.500000 0.309017 0.000000 0.500000 0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcabc -0.809017 0.500000 0.309017 0.000000 0.500000 0.309017 0.809017 0.000000 0.309017 0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcabca -0.809017 -0.500000 0.309017 0.000000 0.500000 -0.309017 0.809017 0.000000 0.309017 -0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcabcab -0.809017 -0.500000 -0.309017 0.000000 0.500000 -0.309017 -0.809017 0.000000 0.309017 -0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcabcabc -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcabcb -0.809017 0.500000 -0.309017 0.000000 0.500000 0.309017 -0.809017 0.000000 0.309017 0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcac -0.500000 -0.309017 0.809017 0.000000 0.309017 0.809017 0.500000 0.000000 0.809017 -0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcacb -0.500000 -0.309017 -0.809017 0.000000 0.309017 0.809017 -0.500000 0.000000 0.809017 -0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcb -0.309017 0.809017 -0.500000 0.000000 0.809017 0.500000 0.309017 0.000000 0.500000 -0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcac 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcacb 0.000000 0.000000 -1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcb 0.309017 0.809017 -0.500000 0.000000 0.809017 -0.500000 -0.309017 0.000000 0.500000 0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # cac 0.500000 0.309017 0.809017 0.000000 0.309017 0.809017 -0.500000 0.000000 0.809017 -0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # caca 0.500000 -0.309017 0.809017 0.000000 0.309017 -0.809017 -0.500000 0.000000 0.809017 0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # cacab 0.500000 -0.309017 -0.809017 0.000000 0.309017 -0.809017 0.500000 0.000000 0.809017 0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # cacabc 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cacabca 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cacabcac -0.500000 0.309017 0.809017 0.000000 0.309017 -0.809017 0.500000 0.000000 0.809017 0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # cacabcacb -0.500000 0.309017 -0.809017 0.000000 0.309017 -0.809017 -0.500000 0.000000 0.809017 0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # cacb 0.500000 0.309017 -0.809017 0.000000 0.309017 0.809017 0.500000 0.000000 0.809017 -0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # cb 0.809017 0.500000 -0.309017 0.000000 0.500000 -0.309017 0.809017 0.000000 0.309017 -0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 geomview-1.9.5/data/groups/g236.prj0000644000175000017500000013505012310110173013710 00000000000000# 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # a -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # ab -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abc 0.500000 0.866026 0.000000 0.000000 0.866026 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.750000 0.433013 0.000000 1.000000 # abca -0.500000 0.866026 0.000000 0.000000 -0.866026 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.750000 0.433013 0.000000 1.000000 # abcab -0.500000 -0.866026 0.000000 0.000000 -0.866026 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.750000 -0.433013 0.000000 1.000000 # abcabc 1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 0.866026 0.000000 1.000000 # abcabca -1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 0.866026 0.000000 1.000000 # abcabcab -1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 -0.866026 0.000000 1.000000 # abcabcabc 0.500001 0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 1.299039 0.000000 1.000000 # abcabcabca -0.500001 0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 1.299039 0.000000 1.000000 # abcabcabcab -0.500001 -0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -1.299039 0.000000 1.000000 # abcabcabcabc 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 1.732053 0.000000 1.000000 # abcabcabcabca -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 1.732053 0.000000 1.000000 # abcabcabcabcab -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 -1.732053 0.000000 1.000000 # abcabcabcabcabc 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 2.165067 0.000000 1.000000 # abcabcabcabcac 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 3.897120 0.000000 1.000000 # abcabcabcabcaca -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749998 3.897120 0.000000 1.000000 # abcabcabcabcacb 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 -3.897120 0.000000 1.000000 # abcabcabcabcb 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 -1.732053 0.000000 1.000000 # abcabcabcac -0.500002 0.866027 0.000000 0.000000 0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 3.031092 0.000000 1.000000 # abcabcabcaca 0.500002 0.866027 0.000000 0.000000 -0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 3.031092 0.000000 1.000000 # abcabcabcacab 0.500002 -0.866027 0.000000 0.000000 -0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -3.031092 0.000000 1.000000 # abcabcabcacabc 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -0.433015 0.000000 1.000000 # abcabcabcacabca -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 -0.433015 0.000000 1.000000 # abcabcabcacb -0.500002 -0.866027 0.000000 0.000000 0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -3.031092 0.000000 1.000000 # abcabcabcb 0.500001 -0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -1.299039 0.000000 1.000000 # abcabcac 0.500001 0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 2.165065 0.000000 1.000000 # abcabcaca -0.500001 0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 2.165065 0.000000 1.000000 # abcabcacab -0.500001 -0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -2.165065 0.000000 1.000000 # abcabcacabc 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 0.000000 0.000000 1.000000 # abcabcacabca -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 0.000000 0.000000 1.000000 # abcabcacabcac 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 3.031093 0.000000 1.000000 # abcabcacabcaca -0.500001 0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 3.031093 0.000000 1.000000 # abcabcacabcacab -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 -3.031093 0.000000 1.000000 # abcabcacabcacb 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 -3.031093 0.000000 1.000000 # abcabcacb 0.500001 -0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -2.165065 0.000000 1.000000 # abcabcb 1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -0.866026 0.000000 1.000000 # abcac -0.500001 0.866026 0.000000 0.000000 0.866026 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 1.299039 0.000000 1.000000 # abcaca 0.500001 0.866026 0.000000 0.000000 -0.866026 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 1.299039 0.000000 1.000000 # abcacab 0.500001 -0.866026 0.000000 0.000000 -0.866026 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -1.299039 0.000000 1.000000 # abcacabc 0.500001 -0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 0.433013 0.000000 1.000000 # abcacabca -0.500001 -0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 0.433013 0.000000 1.000000 # abcacabcab -0.500001 0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -0.433013 0.000000 1.000000 # abcacabcabc -0.500002 0.866027 0.000000 0.000000 0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 2.165066 0.000000 1.000000 # abcacabcabca 0.500002 0.866027 0.000000 0.000000 -0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 2.165066 0.000000 1.000000 # abcacabcabcab 0.500002 -0.866027 0.000000 0.000000 -0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -2.165066 0.000000 1.000000 # abcacabcabcabc 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 1.299039 0.000000 1.000000 # abcacabcabcabca -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 1.299039 0.000000 1.000000 # abcacabcabcabcb 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -1.299039 0.000000 1.000000 # abcacabcabcac -1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000003 3.464105 0.000000 1.000000 # abcacabcabcacb -1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000003 -3.464105 0.000000 1.000000 # abcacabcabcb -0.500002 -0.866027 0.000000 0.000000 0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -2.165066 0.000000 1.000000 # abcacabcac 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 2.598079 0.000000 1.000000 # abcacabcaca -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 2.598079 0.000000 1.000000 # abcacabcacab -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 -2.598079 0.000000 1.000000 # abcacabcacabc 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 0.433013 0.000000 1.000000 # abcacabcacabca -0.500001 0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 0.433013 0.000000 1.000000 # abcacabcacabcac -0.500002 0.866028 0.000000 0.000000 0.866028 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 3.897120 0.000000 1.000000 # abcacabcacb 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -2.598079 0.000000 1.000000 # abcacabcb 0.500001 0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -0.433013 0.000000 1.000000 # abcacac -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000002 1.732052 0.000000 1.000000 # abcacacb -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000002 -1.732052 0.000000 1.000000 # abcacb -0.500001 -0.866026 0.000000 0.000000 0.866026 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -1.299039 0.000000 1.000000 # abcb 0.500000 -0.866026 0.000000 0.000000 0.866026 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.750000 -0.433013 0.000000 1.000000 # ac 0.500000 0.866026 0.000000 0.000000 -0.866026 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.750000 0.433013 0.000000 1.000000 # aca -0.500000 0.866026 0.000000 0.000000 0.866026 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.750000 0.433013 0.000000 1.000000 # acab -0.500000 -0.866026 0.000000 0.000000 0.866026 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.750000 -0.433013 0.000000 1.000000 # acabc 1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 0.866026 0.000000 1.000000 # acabca -1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 0.866026 0.000000 1.000000 # acabcab -1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 -0.866026 0.000000 1.000000 # acabcabc 0.500001 0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 1.299039 0.000000 1.000000 # acabcabca -0.500001 0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 1.299039 0.000000 1.000000 # acabcabcab -0.500001 -0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -1.299039 0.000000 1.000000 # acabcabcabc 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 1.732053 0.000000 1.000000 # acabcabcabca -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 1.732053 0.000000 1.000000 # acabcabcabcab -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 -1.732053 0.000000 1.000000 # acabcabcabcabc 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 2.165067 0.000000 1.000000 # acabcabcabcabca -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 2.165067 0.000000 1.000000 # acabcabcabcabcb 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -2.165067 0.000000 1.000000 # acabcabcabcac 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 3.897120 0.000000 1.000000 # acabcabcabcaca -0.500001 0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749998 3.897120 0.000000 1.000000 # acabcabcabcacab -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749998 -3.897120 0.000000 1.000000 # acabcabcabcacb 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 -3.897120 0.000000 1.000000 # acabcabcabcb 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 -1.732053 0.000000 1.000000 # acabcabcac -0.500002 0.866027 0.000000 0.000000 -0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 3.031092 0.000000 1.000000 # acabcabcaca 0.500002 0.866027 0.000000 0.000000 0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 3.031092 0.000000 1.000000 # acabcabcacab 0.500002 -0.866027 0.000000 0.000000 0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -3.031092 0.000000 1.000000 # acabcabcacabc 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -0.433015 0.000000 1.000000 # acabcabcacabca -0.500001 -0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 -0.433015 0.000000 1.000000 # acabcabcacabcac 1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000004 3.464107 0.000000 1.000000 # acabcabcacb -0.500002 -0.866027 0.000000 0.000000 -0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -3.031092 0.000000 1.000000 # acabcabcb 0.500001 -0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -1.299039 0.000000 1.000000 # acabcac 0.500001 0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 2.165065 0.000000 1.000000 # acabcaca -0.500001 0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 2.165065 0.000000 1.000000 # acabcacab -0.500001 -0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -2.165065 0.000000 1.000000 # acabcacabc 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 0.000000 0.000000 1.000000 # acabcacabca -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 0.000000 0.000000 1.000000 # acabcacabcac 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 3.031093 0.000000 1.000000 # acabcacabcaca -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 3.031093 0.000000 1.000000 # acabcacabcacab -0.500001 -0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 -3.031093 0.000000 1.000000 # acabcacabcacabc 1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 4.500006 0.866027 0.000000 1.000000 # acabcacabcacb 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 -3.031093 0.000000 1.000000 # acabcacb 0.500001 -0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -2.165065 0.000000 1.000000 # acabcb 1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -0.866026 0.000000 1.000000 # acac -0.500001 0.866026 0.000000 0.000000 -0.866026 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 1.299039 0.000000 1.000000 # acaca 0.500001 0.866026 0.000000 0.000000 0.866026 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 1.299039 0.000000 1.000000 # acacab 0.500001 -0.866026 0.000000 0.000000 0.866026 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -1.299039 0.000000 1.000000 # acacabc 0.500001 -0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 0.433013 0.000000 1.000000 # acacabca -0.500001 -0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 0.433013 0.000000 1.000000 # acacabcab -0.500001 0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -0.433013 0.000000 1.000000 # acacabcabc -0.500002 0.866027 0.000000 0.000000 -0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 2.165066 0.000000 1.000000 # acacabcabca 0.500002 0.866027 0.000000 0.000000 0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 2.165066 0.000000 1.000000 # acacabcabcab 0.500002 -0.866027 0.000000 0.000000 0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -2.165066 0.000000 1.000000 # acacabcabcabc 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 1.299039 0.000000 1.000000 # acacabcabcabca -0.500001 -0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 1.299039 0.000000 1.000000 # acacabcabcabcab -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 -1.299039 0.000000 1.000000 # acacabcabcabcac 1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 4.330133 0.000000 1.000000 # acacabcabcabcb 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -1.299039 0.000000 1.000000 # acacabcabcac -1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000003 3.464105 0.000000 1.000000 # acacabcabcacb -1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000003 -3.464105 0.000000 1.000000 # acacabcabcb -0.500002 -0.866027 0.000000 0.000000 -0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -2.165066 0.000000 1.000000 # acacabcac 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 2.598079 0.000000 1.000000 # acacabcaca -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 2.598079 0.000000 1.000000 # acacabcacab -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 -2.598079 0.000000 1.000000 # acacabcacabc 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 0.433013 0.000000 1.000000 # acacabcacabca -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 0.433013 0.000000 1.000000 # acacabcacabcac -0.500002 0.866028 0.000000 0.000000 -0.866028 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 3.897120 0.000000 1.000000 # acacabcacabcaca 0.500002 0.866028 0.000000 0.000000 0.866028 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 3.897120 0.000000 1.000000 # acacabcacabcacb -0.500002 -0.866028 0.000000 0.000000 -0.866028 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 -3.897120 0.000000 1.000000 # acacabcacb 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -2.598079 0.000000 1.000000 # acacabcb 0.500001 0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -0.433013 0.000000 1.000000 # acacac -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000002 1.732052 0.000000 1.000000 # acacacb -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000002 -1.732052 0.000000 1.000000 # acacb -0.500001 -0.866026 0.000000 0.000000 -0.866026 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -1.299039 0.000000 1.000000 # acb 0.500000 -0.866026 0.000000 0.000000 -0.866026 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.750000 -0.433013 0.000000 1.000000 # b 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bc -0.500000 -0.866026 0.000000 0.000000 0.866026 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.750000 0.433013 0.000000 1.000000 # bca 0.500000 -0.866026 0.000000 0.000000 -0.866026 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.750000 0.433013 0.000000 1.000000 # bcab 0.500000 0.866026 0.000000 0.000000 -0.866026 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.750000 -0.433013 0.000000 1.000000 # bcabc -1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 0.866026 0.000000 1.000000 # bcabca 1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 0.866026 0.000000 1.000000 # bcabcab 1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 -0.866026 0.000000 1.000000 # bcabcabc -0.500001 -0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 1.299039 0.000000 1.000000 # bcabcabca 0.500001 -0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 1.299039 0.000000 1.000000 # bcabcabcab 0.500001 0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -1.299039 0.000000 1.000000 # bcabcabcabc -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 1.732053 0.000000 1.000000 # bcabcabcabca 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 1.732053 0.000000 1.000000 # bcabcabcabcab 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 -1.732053 0.000000 1.000000 # bcabcabcabcabc -0.500001 -0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 2.165067 0.000000 1.000000 # bcabcabcabcabca 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 2.165067 0.000000 1.000000 # bcabcabcabcabcb -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -2.165067 0.000000 1.000000 # bcabcabcabcac -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 3.897120 0.000000 1.000000 # bcabcabcabcaca 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749998 3.897120 0.000000 1.000000 # bcabcabcabcacab 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749998 -3.897120 0.000000 1.000000 # bcabcabcabcacb -0.500001 0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 -3.897120 0.000000 1.000000 # bcabcabcabcb -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 -1.732053 0.000000 1.000000 # bcabcabcac 0.500002 -0.866027 0.000000 0.000000 0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 3.031092 0.000000 1.000000 # bcabcabcaca -0.500002 -0.866027 0.000000 0.000000 -0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 3.031092 0.000000 1.000000 # bcabcabcacab -0.500002 0.866027 0.000000 0.000000 -0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -3.031092 0.000000 1.000000 # bcabcabcacabc -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -0.433015 0.000000 1.000000 # bcabcabcacabca 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 -0.433015 0.000000 1.000000 # bcabcabcacabcac -1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000004 3.464107 0.000000 1.000000 # bcabcabcacb 0.500002 0.866027 0.000000 0.000000 0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -3.031092 0.000000 1.000000 # bcabcabcb -0.500001 0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -1.299039 0.000000 1.000000 # bcabcac -0.500001 -0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 2.165065 0.000000 1.000000 # bcabcaca 0.500001 -0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 2.165065 0.000000 1.000000 # bcabcacab 0.500001 0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -2.165065 0.000000 1.000000 # bcabcacabc -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 0.000000 0.000000 1.000000 # bcabcacabca 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 0.000000 0.000000 1.000000 # bcabcacabcac -0.500001 -0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 3.031093 0.000000 1.000000 # bcabcacabcaca 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 3.031093 0.000000 1.000000 # bcabcacabcacab 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 -3.031093 0.000000 1.000000 # bcabcacabcacabc -1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 4.500006 0.866027 0.000000 1.000000 # bcabcacabcacb -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 -3.031093 0.000000 1.000000 # bcabcacb -0.500001 0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -2.165065 0.000000 1.000000 # bcabcb -1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -0.866026 0.000000 1.000000 # bcac 0.500001 -0.866026 0.000000 0.000000 0.866026 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 1.299039 0.000000 1.000000 # bcaca -0.500001 -0.866026 0.000000 0.000000 -0.866026 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 1.299039 0.000000 1.000000 # bcacab -0.500001 0.866026 0.000000 0.000000 -0.866026 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -1.299039 0.000000 1.000000 # bcacabc -0.500001 0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 0.433013 0.000000 1.000000 # bcacabca 0.500001 0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 0.433013 0.000000 1.000000 # bcacabcab 0.500001 -0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -0.433013 0.000000 1.000000 # bcacabcabc 0.500002 -0.866027 0.000000 0.000000 0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 2.165066 0.000000 1.000000 # bcacabcabca -0.500002 -0.866027 0.000000 0.000000 -0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 2.165066 0.000000 1.000000 # bcacabcabcab -0.500002 0.866027 0.000000 0.000000 -0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -2.165066 0.000000 1.000000 # bcacabcabcabc -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 1.299039 0.000000 1.000000 # bcacabcabcabca 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 1.299039 0.000000 1.000000 # bcacabcabcabcab 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 -1.299039 0.000000 1.000000 # bcacabcabcabcac -1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 4.330133 0.000000 1.000000 # bcacabcabcabcb -0.500001 -0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -1.299039 0.000000 1.000000 # bcacabcabcac 1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000003 3.464105 0.000000 1.000000 # bcacabcabcacb 1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000003 -3.464105 0.000000 1.000000 # bcacabcabcb 0.500002 0.866027 0.000000 0.000000 0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -2.165066 0.000000 1.000000 # bcacabcac -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 2.598079 0.000000 1.000000 # bcacabcaca 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 2.598079 0.000000 1.000000 # bcacabcacab 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 -2.598079 0.000000 1.000000 # bcacabcacabc -0.500001 -0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 0.433013 0.000000 1.000000 # bcacabcacabca 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 0.433013 0.000000 1.000000 # bcacabcacabcac 0.500002 -0.866028 0.000000 0.000000 0.866028 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 3.897120 0.000000 1.000000 # bcacabcacabcaca -0.500002 -0.866028 0.000000 0.000000 -0.866028 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 3.897120 0.000000 1.000000 # bcacabcacabcacb 0.500002 0.866028 0.000000 0.000000 0.866028 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 -3.897120 0.000000 1.000000 # bcacabcacb -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -2.598079 0.000000 1.000000 # bcacabcb -0.500001 -0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -0.433013 0.000000 1.000000 # bcacac 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000002 1.732052 0.000000 1.000000 # bcacacb 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000002 -1.732052 0.000000 1.000000 # bcacb 0.500001 0.866026 0.000000 0.000000 0.866026 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -1.299039 0.000000 1.000000 # bcb -0.500000 0.866026 0.000000 0.000000 0.866026 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.750000 -0.433013 0.000000 1.000000 # c -0.500000 -0.866026 0.000000 0.000000 -0.866026 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.750000 0.433013 0.000000 1.000000 # ca 0.500000 -0.866026 0.000000 0.000000 0.866026 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.750000 0.433013 0.000000 1.000000 # cab 0.500000 0.866026 0.000000 0.000000 0.866026 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.750000 -0.433013 0.000000 1.000000 # cabc -1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 0.866026 0.000000 1.000000 # cabca 1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 0.866026 0.000000 1.000000 # cabcab 1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 -0.866026 0.000000 1.000000 # cabcabc -0.500001 -0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 1.299039 0.000000 1.000000 # cabcabca 0.500001 -0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 1.299039 0.000000 1.000000 # cabcabcab 0.500001 0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -1.299039 0.000000 1.000000 # cabcabcabc -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 1.732053 0.000000 1.000000 # cabcabcabca 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 1.732053 0.000000 1.000000 # cabcabcabcab 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 -1.732053 0.000000 1.000000 # cabcabcabcabc -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 2.165067 0.000000 1.000000 # cabcabcabcabca 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 2.165067 0.000000 1.000000 # cabcabcabcabcab 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 -2.165067 0.000000 1.000000 # cabcabcabcabcac 0.500002 -0.866028 0.000000 0.000000 -0.866028 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 4.763147 0.000000 1.000000 # cabcabcabcabcb -0.500001 0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -2.165067 0.000000 1.000000 # cabcabcabcac -0.500001 -0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 3.897120 0.000000 1.000000 # cabcabcabcaca 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749998 3.897120 0.000000 1.000000 # cabcabcabcacab 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749998 -3.897120 0.000000 1.000000 # cabcabcabcacabc -1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 4.500006 -0.866029 0.000000 1.000000 # cabcabcabcacb -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 -3.897120 0.000000 1.000000 # cabcabcabcb -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 -1.732053 0.000000 1.000000 # cabcabcac 0.500002 -0.866027 0.000000 0.000000 -0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 3.031092 0.000000 1.000000 # cabcabcaca -0.500002 -0.866027 0.000000 0.000000 0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 3.031092 0.000000 1.000000 # cabcabcacab -0.500002 0.866027 0.000000 0.000000 0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -3.031092 0.000000 1.000000 # cabcabcacabc -0.500001 0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -0.433015 0.000000 1.000000 # cabcabcacabca 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 -0.433015 0.000000 1.000000 # cabcabcacabcac -1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000004 3.464107 0.000000 1.000000 # cabcabcacabcaca 1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000004 3.464107 0.000000 1.000000 # cabcabcacabcacb -1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000004 -3.464107 0.000000 1.000000 # cabcabcacb 0.500002 0.866027 0.000000 0.000000 -0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -3.031092 0.000000 1.000000 # cabcabcb -0.500001 0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -1.299039 0.000000 1.000000 # cabcac -0.500001 -0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 2.165065 0.000000 1.000000 # cabcaca 0.500001 -0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 2.165065 0.000000 1.000000 # cabcacab 0.500001 0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -2.165065 0.000000 1.000000 # cabcacabc -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 0.000000 0.000000 1.000000 # cabcacabca 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 0.000000 0.000000 1.000000 # cabcacabcac -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 3.031093 0.000000 1.000000 # cabcacabcaca 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 3.031093 0.000000 1.000000 # cabcacabcacab 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 -3.031093 0.000000 1.000000 # cabcacabcacabc -1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 4.500006 0.866027 0.000000 1.000000 # cabcacabcacabca 1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -4.500006 0.866027 0.000000 1.000000 # cabcacabcacb -0.500001 0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 -3.031093 0.000000 1.000000 # cabcacb -0.500001 0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -2.165065 0.000000 1.000000 # cabcb -1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -0.866026 0.000000 1.000000 # cac 0.500001 -0.866026 0.000000 0.000000 -0.866026 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 1.299039 0.000000 1.000000 # caca -0.500001 -0.866026 0.000000 0.000000 0.866026 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 1.299039 0.000000 1.000000 # cacab -0.500001 0.866026 0.000000 0.000000 0.866026 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -1.299039 0.000000 1.000000 # cacabc -0.500001 0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 0.433013 0.000000 1.000000 # cacabca 0.500001 0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 0.433013 0.000000 1.000000 # cacabcab 0.500001 -0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -0.433013 0.000000 1.000000 # cacabcabc 0.500002 -0.866027 0.000000 0.000000 -0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 2.165066 0.000000 1.000000 # cacabcabca -0.500002 -0.866027 0.000000 0.000000 0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 2.165066 0.000000 1.000000 # cacabcabcab -0.500002 0.866027 0.000000 0.000000 0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -2.165066 0.000000 1.000000 # cacabcabcabc -0.500001 0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 1.299039 0.000000 1.000000 # cacabcabcabca 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 1.299039 0.000000 1.000000 # cacabcabcabcab 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 -1.299039 0.000000 1.000000 # cacabcabcabcabc 0.500002 -0.866028 0.000000 0.000000 -0.866028 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 3.031094 0.000000 1.000000 # cacabcabcabcac -1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 4.330133 0.000000 1.000000 # cacabcabcabcaca 1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 4.330133 0.000000 1.000000 # cacabcabcabcacb -1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -4.330133 0.000000 1.000000 # cacabcabcabcb -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -1.299039 0.000000 1.000000 # cacabcabcac 1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000003 3.464105 0.000000 1.000000 # cacabcabcacb 1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000003 -3.464105 0.000000 1.000000 # cacabcabcb 0.500002 0.866027 0.000000 0.000000 -0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -2.165066 0.000000 1.000000 # cacabcac -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 2.598079 0.000000 1.000000 # cacabcaca 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 2.598079 0.000000 1.000000 # cacabcacab 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 -2.598079 0.000000 1.000000 # cacabcacabc -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 0.433013 0.000000 1.000000 # cacabcacabca 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 0.433013 0.000000 1.000000 # cacabcacabcac 0.500002 -0.866028 0.000000 0.000000 -0.866028 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 3.897120 0.000000 1.000000 # cacabcacabcaca -0.500002 -0.866028 0.000000 0.000000 0.866028 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 3.897120 0.000000 1.000000 # cacabcacabcacab -0.500002 0.866028 0.000000 0.000000 0.866028 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 -3.897120 0.000000 1.000000 # cacabcacabcacb 0.500002 0.866028 0.000000 0.000000 -0.866028 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 -3.897120 0.000000 1.000000 # cacabcacb -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -2.598079 0.000000 1.000000 # cacabcb -0.500001 -0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -0.433013 0.000000 1.000000 # cacac 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000002 1.732052 0.000000 1.000000 # cacacb 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000002 -1.732052 0.000000 1.000000 # cacb 0.500001 0.866026 0.000000 0.000000 -0.866026 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -1.299039 0.000000 1.000000 # cb -0.500000 0.866026 0.000000 0.000000 -0.866026 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.750000 -0.433013 0.000000 1.000000 geomview-1.9.5/data/groups/g237.prj0000644000175000017500000022223312310110173013711 00000000000000# 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # a 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # ab -1.655971 0.000000 0.000000 -1.319939 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # abc -1.032481 -1.294690 0.000000 -1.319939 -0.781832 0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # abca -1.032481 1.294690 0.000000 -1.319939 -0.781832 -0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # abcab -0.032481 1.294690 0.000000 -0.822968 1.294690 -0.623490 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # abcabc 0.991978 -0.832620 0.000000 -0.822968 0.319762 1.400969 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # abcabca 0.991978 0.832620 0.000000 -0.822968 0.319762 -1.400969 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # abcabcab -2.728954 0.832620 0.000000 -2.672162 0.832620 -1.400969 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # abcabcabc -1.050506 -2.652713 0.000000 -2.672162 -0.576191 1.524459 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # abcabcabca -1.050506 2.652713 0.000000 -2.672162 -0.576191 -1.524459 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # abcabcabcab -1.787482 2.652713 0.000000 -3.038417 2.652713 -1.524459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311942 # abcabcabcabc 0.959497 -3.051449 0.000000 -3.038417 0.462070 3.024459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311942 # abcabcabcabca 0.959497 3.051449 0.000000 -3.038417 0.462070 -3.024459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311942 # abcabcabcabcab -5.599424 3.051449 0.000000 -6.298007 3.051449 -3.024459 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 6.298007 -4.178360 0.000000 7.623883 # abcabcabcabcabc -1.105465 -6.280354 0.000000 -6.298007 -0.462070 4.271438 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 0.659969 7.529146 0.000000 7.623883 # abcabcabcabcac 2.983956 -1.152382 0.000000 -3.038417 -2.076522 2.246980 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -3.495130 2.318815 0.000000 4.311942 # abcabcabcabcaca 2.983956 1.152382 0.000000 -3.038417 -2.076522 -2.246980 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -3.495130 -2.318815 0.000000 4.311942 # abcabcabcabcacb -8.951868 -1.152382 0.000000 -8.970169 7.255281 2.246980 0.000000 7.529145 0.000000 0.000000 1.000000 0.000000 11.479332 2.318815 0.000000 11.753806 # abcabcabcabcb -5.599424 -3.051449 0.000000 -6.298007 3.051449 3.024459 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # abcabcabcac 1.418994 -2.475258 0.000000 -2.672162 -1.551119 0.500000 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # abcabcabcaca 1.418994 2.475258 0.000000 -2.672162 -1.551119 -0.500000 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # abcabcabcacab -5.876903 2.475258 0.000000 -6.298007 4.267165 -0.500000 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # abcabcabcacabc -1.728954 -6.138046 0.000000 -6.298007 2.269618 3.647949 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 2.672162 7.069876 0.000000 7.623883 # abcabcabcacabca -1.728954 6.138046 0.000000 -6.298007 2.269618 -3.647949 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 2.672162 -7.069876 0.000000 7.623883 # abcabcabcacabcb -5.449887 -6.138046 0.000000 -8.147201 1.756759 3.647949 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 5.638037 7.069876 0.000000 9.097836 # abcabcabcacac 2.819963 -0.433884 0.000000 -2.672162 -1.358023 -0.900969 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # abcabcabcacacb -8.196866 -0.433884 0.000000 -8.147200 3.947402 -0.900969 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 9.042710 0.000000 0.000000 9.097835 # abcabcabcacb -5.876903 -2.475258 0.000000 -6.298007 4.267165 0.500000 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # abcabcabcb -1.787482 -2.652713 0.000000 -3.038417 2.652713 1.524459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311942 # abcabcac 1.269457 0.256429 0.000000 -0.822968 -0.895953 1.123490 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # abcabcaca 1.269457 -0.256429 0.000000 -0.822968 -0.895953 -1.123490 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # abcabcacab -3.188451 -0.256429 0.000000 -3.038417 2.845809 -1.123490 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # abcabcacabc -2.188451 -2.332951 0.000000 -3.038417 0.895953 2.925428 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311941 # abcabcacabca -2.188451 2.332951 0.000000 -3.038417 0.895953 -2.925428 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311941 # abcabcacabcab -0.386513 2.332951 0.000000 -2.142907 2.332951 -2.925428 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311942 # abcabcacabcabc 1.582987 -1.756759 0.000000 -2.142907 -0.832621 3.647949 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311942 # abcabcacabcabca 1.582987 1.756759 0.000000 -2.142907 -0.832621 -3.647949 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 -1.482938 -3.923485 0.000000 4.311942 # abcabcacabcabcb -5.449887 -1.756759 0.000000 -5.638037 6.138046 3.647949 0.000000 7.069876 0.000000 0.000000 1.000000 0.000000 8.147201 3.923485 0.000000 9.097836 # abcabcacabcac 0.459497 -3.165571 0.000000 -3.038417 -1.728574 2.524459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311941 # abcabcacabcaca 0.459497 3.165571 0.000000 -3.038417 -1.728574 -2.524459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -1.482938 -3.923485 0.000000 4.311941 # abcabcacabcacab -4.771438 3.165571 0.000000 -5.638037 6.679090 -2.524459 0.000000 7.069875 0.000000 0.000000 1.000000 0.000000 8.147200 -3.923485 0.000000 9.097835 # abcabcacabcacac 2.761435 -1.614452 0.000000 -3.038417 -3.051450 0.222521 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -3.992101 1.286845 0.000000 4.311941 # abcabcacabcacb -4.771438 -3.165571 0.000000 -5.638037 6.679090 2.524459 0.000000 7.069875 0.000000 0.000000 1.000000 0.000000 8.147200 3.923485 0.000000 9.097835 # abcabcacabcb -0.386513 -2.332951 0.000000 -2.142907 2.332951 2.925428 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311942 # abcabcacac 0.591009 1.152383 0.000000 -0.822968 -1.436997 0.000000 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # abcabcacacb -2.064961 1.152383 0.000000 -2.142907 3.741762 0.000000 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # abcabcacb -3.188451 0.256429 0.000000 -3.038417 2.845809 1.123490 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 4.155100 0.572700 0.000000 4.311941 # abcabcb -2.728954 -0.832620 0.000000 -2.672162 0.832620 1.400969 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # abcac 0.368488 -1.614452 0.000000 -1.319939 -0.974928 -0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # abcaca 0.368488 1.614452 0.000000 -1.319939 -0.974928 0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # abcacab -2.352444 1.614452 0.000000 -2.672162 1.614452 0.222521 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # abcacabc -0.204495 -2.845809 0.000000 -2.672162 1.180568 1.123490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # abcacabca -0.204495 2.845809 0.000000 -2.672162 1.180568 -1.123490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # abcacabcab -3.188451 2.845809 0.000000 -4.155100 -0.256429 -1.123490 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311941 # abcacabcabc 0.236976 -4.267165 0.000000 -4.155100 -1.038261 0.500000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311941 # abcacabcabca 0.236976 4.267165 0.000000 -4.155100 -1.038261 -0.500000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311941 # abcacabcabcab -5.876903 4.267165 0.000000 -7.193517 2.475258 -0.500000 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 6.298007 -4.178360 0.000000 7.623883 # abcacabcabcabc -0.327985 -7.255281 0.000000 -7.193517 1.152383 2.246980 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 7.529145 0.000000 7.623883 # abcacabcabcabca -0.327985 7.255281 0.000000 -7.193517 1.152383 -2.246980 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 -7.529145 0.000000 7.623883 # abcacabcabcabcb -8.951868 -7.255281 0.000000 -11.479332 1.152382 2.246980 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 8.970169 7.529145 0.000000 11.753806 # abcacabcabcac 3.483956 -2.475258 0.000000 -4.155100 -1.038261 -0.500000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -3.495130 2.318815 0.000000 4.311941 # abcacabcabcaca 3.483956 2.475258 0.000000 -4.155100 -1.038261 0.500000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -3.495130 -2.318815 0.000000 4.311941 # abcacabcabcacab -11.253806 2.475258 0.000000 -11.479331 2.475258 0.500000 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 11.479331 -2.318815 0.000000 11.753806 # abcacabcabcacac 4.107446 1.180568 0.000000 -4.155100 -0.256429 -1.123490 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -3.992101 -1.286845 0.000000 4.311941 # abcacabcabcacb -11.253806 -2.475258 0.000000 -11.479331 2.475258 -0.500000 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 11.479331 2.318815 0.000000 11.753806 # abcacabcabcb -5.876903 -4.267165 0.000000 -7.193517 2.475258 0.500000 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # abcacabcac 2.097442 -1.934214 0.000000 -2.672162 -0.142308 1.623490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # abcacabcaca 2.097442 1.934214 0.000000 -2.672162 -0.142308 -1.623490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # abcacabcacab -7.000393 1.934214 0.000000 -7.193517 1.934214 -1.623490 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # abcacabcacabc -2.852444 -6.679090 0.000000 -7.193517 -0.063333 2.524459 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 7.069875 0.000000 7.623883 # abcacabcacabca -2.852444 6.679090 0.000000 -7.193517 -0.063333 -2.524459 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 -7.069875 0.000000 7.623883 # abcacabcacabcab -4.771438 6.679090 0.000000 -8.147200 3.165571 -2.524459 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 5.638037 -7.069875 0.000000 9.097835 # abcacabcacabcac 3.443453 -6.394475 0.000000 -7.193517 -2.013189 1.524459 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 -3.861386 6.497175 0.000000 7.623883 # abcacabcacabcb -4.771438 -6.679090 0.000000 -8.147200 3.165571 2.524459 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 5.638037 7.069875 0.000000 9.097835 # abcacabcacac 2.819963 0.433884 0.000000 -2.672162 -1.358023 0.900969 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # abcacabcacacb -8.196866 0.433884 0.000000 -8.147200 3.947403 0.900969 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 9.042710 0.000000 0.000000 9.097835 # abcacabcacb -7.000393 -1.934214 0.000000 -7.193517 1.934214 1.623490 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # abcacabcb -3.188451 -2.845809 0.000000 -4.155100 -0.256429 1.123490 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311941 # abcacac 1.491978 -0.718499 0.000000 -1.319939 -0.433884 -0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # abcacaca 1.491978 0.718499 0.000000 -1.319939 -0.433884 0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # abcacacab -4.212910 0.718499 0.000000 -4.155099 0.718499 0.900969 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 4.155099 -0.572700 0.000000 4.311941 # abcacacabc -2.064962 -3.741762 0.000000 -4.155099 1.152382 0.000000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311941 # abcacacabca -2.064962 3.741762 0.000000 -4.155099 1.152382 0.000000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311941 # abcacacabcac 1.637945 -3.947403 0.000000 -4.155099 0.718499 0.900969 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311941 # abcacacabcaca 1.637945 3.947403 0.000000 -4.155099 0.718499 -0.900969 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -1.482938 -3.923485 0.000000 4.311941 # abcacacabcacab -8.196866 3.947403 0.000000 -9.042710 -0.433884 -0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 8.147200 -3.923485 0.000000 9.097835 # abcacacabcacabc -2.024459 -8.869733 0.000000 -9.042710 -0.974928 0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.012192 8.815990 0.000000 9.097835 # abcacacabcacac 4.107446 -1.180568 0.000000 -4.155099 -0.256429 1.123490 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -3.992101 1.286845 0.000000 4.311941 # abcacacabcacacb -12.286286 -1.180568 0.000000 -12.302300 1.180568 1.123490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 12.302300 1.286845 0.000000 12.409776 # abcacacabcacb -8.196866 -3.947403 0.000000 -9.042710 -0.433884 0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 8.147200 3.923485 0.000000 9.097835 # abcacacb -4.212910 -0.718499 0.000000 -4.155099 0.718499 -0.900969 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 4.155099 0.572700 0.000000 4.311941 # abcacb -2.352444 -1.614452 0.000000 -2.672162 1.614452 -0.222521 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # abcb -0.032481 -1.294690 0.000000 -0.822968 1.294690 0.623490 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # ac 0.623490 0.781832 0.000000 0.000000 -0.781832 0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # aca 0.623490 -0.781832 0.000000 0.000000 -0.781832 -0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acab -1.032481 -0.781832 0.000000 -0.822968 1.294690 -0.623490 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # acabc -1.255002 -0.319762 0.000000 -0.822968 0.319762 1.400969 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # acabca -1.255002 0.319762 0.000000 -0.822968 0.319762 -1.400969 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # acabcab 0.991978 0.319762 0.000000 0.293714 0.832620 -1.400969 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # acabcabc 0.868488 0.576191 0.000000 0.293714 -0.576191 1.524459 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # acabcabca 0.868488 -0.576191 0.000000 0.293714 -0.576191 -1.524459 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # acabcabcab -1.050506 -0.576191 0.000000 -0.659969 2.652713 -1.524459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # acabcabcabc -1.105465 -0.462070 0.000000 -0.659969 0.462070 3.024459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # acabcabcabca -1.105465 0.462070 0.000000 -0.659969 0.462070 -3.024459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # acabcabcabcab 0.959497 0.462070 0.000000 0.366256 3.051449 -3.024459 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311942 # acabcabcabcabc 0.959497 0.462070 0.000000 0.366256 -0.462070 4.271438 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311942 # acabcabcabcabca 0.959497 -0.462070 0.000000 0.366256 -0.462070 -4.271438 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311942 # acabcabcabcabcb -1.105465 0.462070 0.000000 -0.659969 6.280354 4.271438 0.000000 7.529146 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # acabcabcabcac -0.327985 -1.152383 0.000000 -0.659969 -2.076522 2.246980 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # acabcabcabcaca -0.327985 1.152383 0.000000 -0.659969 -2.076522 -2.246980 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # acabcabcabcacab -0.327985 1.152383 0.000000 -0.659969 7.255281 -2.246980 0.000000 7.529145 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # acabcabcabcacac 0.696474 -0.974928 0.000000 -0.659969 -3.051450 -0.222521 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # acabcabcabcacb -0.327985 -1.152383 0.000000 -0.659969 7.255281 2.246980 0.000000 7.529145 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # acabcabcabcb 0.959497 -0.462070 0.000000 0.366256 3.051449 3.024459 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311942 # acabcabcac 0.091009 1.038261 0.000000 0.293714 -1.551119 0.500000 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # acabcabcaca 0.091009 -1.038261 0.000000 0.293714 -1.551119 -0.500000 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # acabcabcacab 0.236976 -1.038261 0.000000 0.366256 4.267165 -0.500000 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # acabcabcacabc -0.663993 0.832621 0.000000 0.366256 2.269618 3.647949 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311941 # acabcabcacabca -0.663993 -0.832621 0.000000 0.366256 2.269618 -3.647949 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311941 # acabcabcacabcab 1.582987 -0.832621 0.000000 1.482938 1.756759 -3.647949 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311942 # acabcabcacabcac -1.064962 0.000000 0.000000 0.366256 -1.436997 4.048918 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311941 # acabcabcacabcb 1.582987 0.832621 0.000000 1.482938 1.756759 3.647949 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311942 # acabcabcacac -0.755002 0.718499 0.000000 0.293714 -1.358023 -0.900969 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # acabcabcacacb 1.637945 0.718499 0.000000 1.482938 3.947402 -0.900969 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # acabcabcacb 0.236976 1.038261 0.000000 0.366256 4.267165 0.500000 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 4.155100 0.572700 0.000000 4.311941 # acabcabcb -1.050506 0.576191 0.000000 -0.659969 2.652713 1.524459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # acabcac -0.532481 -1.180568 0.000000 -0.822968 -0.895953 1.123490 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # acabcaca -0.532481 1.180568 0.000000 -0.822968 -0.895953 -1.123490 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # acabcacab -0.204495 1.180568 0.000000 -0.659969 2.845809 -1.123490 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # acabcacabc 0.795505 -0.895953 0.000000 -0.659969 0.895953 2.925428 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # acabcacabca 0.795505 0.895953 0.000000 -0.659969 0.895953 -2.925428 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # acabcacabcab -2.188451 0.895953 0.000000 -2.142907 2.332951 -2.925428 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311941 # acabcacabcabc -0.663993 -2.269618 0.000000 -2.142907 -0.832621 3.647949 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311941 # acabcacabcabca -0.663993 2.269618 0.000000 -2.142907 -0.832621 -3.647949 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311941 # acabcacabcabcab -1.728954 2.269618 0.000000 -2.672162 6.138046 -3.647949 0.000000 7.069876 0.000000 0.000000 1.000000 0.000000 6.298007 -4.178360 0.000000 7.623883 # acabcacabcabcac 1.360466 -1.934214 0.000000 -2.142907 -3.371212 1.623490 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 -3.495130 2.318815 0.000000 4.311941 # acabcacabcabcb -1.728954 -2.269618 0.000000 -2.672162 6.138046 3.647949 0.000000 7.069876 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # acabcacabcac 1.196473 0.063333 0.000000 -0.659969 -1.728574 2.524459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # acabcacabcaca 1.196473 -0.063333 0.000000 -0.659969 -1.728574 -2.524459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # acabcacabcacab -2.852444 -0.063333 0.000000 -2.672162 6.679090 -2.524459 0.000000 7.069875 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # acabcacabcacabc -1.827985 -2.190643 0.000000 -2.672162 2.190643 6.795897 0.000000 7.069875 0.000000 0.000000 1.000000 0.000000 2.672162 7.069875 0.000000 7.623883 # acabcacabcacac 0.696473 0.974928 0.000000 -0.659969 -3.051450 0.222521 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # acabcacabcacacb -2.024459 0.974928 0.000000 -2.012192 8.869733 0.222521 0.000000 8.815990 0.000000 0.000000 1.000000 0.000000 9.042710 0.000000 0.000000 9.097835 # acabcacabcacb -2.852444 0.063333 0.000000 -2.672162 6.679090 2.524459 0.000000 7.069875 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # acabcacabcb -2.188451 -0.895953 0.000000 -2.142907 2.332951 2.925428 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311941 # acabcacac 0.591009 -1.152382 0.000000 -0.822968 -1.436997 0.000000 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # acabcacacb -2.064962 -1.152382 0.000000 -2.142907 3.741762 0.000000 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 4.155099 0.572700 0.000000 4.311941 # acabcacb -0.204495 -1.180568 0.000000 -0.659969 2.845809 1.123490 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # acabcb 0.991978 -0.319762 0.000000 0.293714 0.832620 1.400969 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # acac -0.222521 0.974928 0.000000 0.000000 -0.974928 -0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acaca -0.222521 -0.974928 0.000000 0.000000 -0.974928 0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acacab 0.368488 -0.974928 0.000000 0.293714 1.614452 0.222521 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # acacabc -0.532481 0.895953 0.000000 0.293714 1.180568 1.123490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # acacabca -0.532481 -0.895953 0.000000 0.293714 1.180568 -1.123490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # acacabcab 1.269457 -0.895953 0.000000 1.189224 -0.256429 -1.123490 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # acacabcabc 0.091009 1.551119 0.000000 1.189224 -1.038261 0.500000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # acacabcabca 0.091009 -1.551119 0.000000 1.189224 -1.038261 -0.500000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # acacabcabcab 1.418994 -1.551119 0.000000 1.849193 2.475258 -0.500000 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # acacabcabcabc -0.327985 2.076522 0.000000 1.849193 1.152383 2.246980 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # acacabcabcabca -0.327985 -2.076522 0.000000 1.849193 1.152383 -2.246980 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # acacabcabcabcab 2.983956 -2.076522 0.000000 3.495130 1.152382 -2.246980 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311942 # acacabcabcabcac -1.827985 1.038261 0.000000 1.849193 -1.038261 2.301938 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # acacabcabcabcb 2.983956 2.076522 0.000000 3.495130 1.152382 2.246980 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311942 # acacabcabcac -1.155971 1.038261 0.000000 1.189224 -1.038261 -0.500000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # acacabcabcaca -1.155971 -1.038261 0.000000 1.189224 -1.038261 0.500000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # acacabcabcacab 3.483956 -1.038261 0.000000 3.495130 2.475258 0.500000 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # acacabcabcacabc 1.360466 3.371212 0.000000 3.495130 1.934214 1.623490 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311941 # acacabcabcacac -1.532481 -0.256429 0.000000 1.189224 -0.256429 -1.123490 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # acacabcabcacacb 4.107446 -0.256429 0.000000 3.992101 1.180568 -1.123490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # acacabcabcacb 3.483956 1.038261 0.000000 3.495130 2.475258 -0.500000 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 4.155100 0.572700 0.000000 4.311941 # acacabcabcb 1.418994 1.551119 0.000000 1.849193 2.475258 0.500000 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # acacabcac -1.032481 0.142308 0.000000 0.293714 -0.142308 1.623490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # acacabcaca -1.032481 -0.142308 0.000000 0.293714 -0.142308 -1.623490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # acacabcacab 2.097442 -0.142308 0.000000 1.849193 1.934214 -1.623490 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # acacabcacabc 1.196473 1.728574 0.000000 1.849193 -0.063333 2.524459 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # acacabcacabca 1.196473 -1.728574 0.000000 1.849193 -0.063333 -2.524459 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # acacabcacabcab 0.459497 -1.728574 0.000000 1.482938 3.165571 -2.524459 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311941 # acacabcacabcabc -1.064962 1.436997 0.000000 1.482938 0.000000 4.048918 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311941 # acacabcacabcac -0.605464 2.013189 0.000000 1.849193 -2.013189 1.524459 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # acacabcacabcaca -0.605464 -2.013189 0.000000 1.849193 -2.013189 -1.524459 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # acacabcacabcacb 3.443453 2.013189 0.000000 3.861386 6.394475 1.524459 0.000000 6.497175 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # acacabcacabcb 0.459497 1.728574 0.000000 1.482938 3.165571 2.524459 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311941 # acacabcacac -0.755002 -0.718499 0.000000 0.293714 -1.358023 0.900969 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # acacabcacacb 1.637945 -0.718499 0.000000 1.482938 3.947403 0.900969 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 4.155099 0.572700 0.000000 4.311941 # acacabcacb 2.097442 0.142308 0.000000 1.849193 1.934214 1.623490 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # acacabcb 1.269457 0.895953 0.000000 1.189224 -0.256429 1.123490 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # acacac -0.900969 0.433884 0.000000 0.000000 -0.433884 -0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acacaca -0.900969 -0.433884 0.000000 0.000000 -0.433884 0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acacacab 1.491978 -0.433884 0.000000 1.189224 0.718499 0.900969 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # acacacabc 0.591009 1.436997 0.000000 1.189224 1.152382 0.000000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # acacacabca 0.591009 -1.436997 0.000000 1.189224 1.152382 0.000000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # acacacabcac -0.755002 1.358023 0.000000 1.189224 0.718499 0.900969 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # acacacabcaca -0.755002 -1.358023 0.000000 1.189224 0.718499 -0.900969 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # acacacabcacab 2.819963 -1.358023 0.000000 2.965876 -0.433884 -0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # acacacabcacabc 0.696473 3.051450 0.000000 2.965876 -0.974928 0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # acacacabcacabca 0.696473 -3.051450 0.000000 2.965876 -0.974928 -0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # acacacabcacabcb 2.761435 3.051450 0.000000 3.992101 1.614452 0.222521 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311941 # acacacabcacac -1.532481 0.256429 0.000000 1.189224 -0.256429 1.123490 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # acacacabcacacb 4.107446 0.256429 0.000000 3.992101 1.180568 1.123490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 4.155099 0.572700 0.000000 4.311941 # acacacabcacb 2.819963 1.358023 0.000000 2.965876 -0.433884 0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # acacacb 1.491978 0.433884 0.000000 1.189224 0.718499 -0.900969 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # acacb 0.368488 0.974928 0.000000 0.293714 1.614452 -0.222521 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # acb -1.032481 0.781832 0.000000 -0.822968 1.294690 0.623490 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # b -1.655971 0.000000 0.000000 -1.319939 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # bc -1.032481 -1.294690 0.000000 -1.319939 0.781832 -0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # bca -1.032481 1.294690 0.000000 -1.319939 0.781832 0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # bcab -0.032481 1.294690 0.000000 -0.822968 -1.294690 0.623490 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # bcabc 0.991978 -0.832620 0.000000 -0.822968 -0.319762 -1.400969 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # bcabca 0.991978 0.832620 0.000000 -0.822968 -0.319762 1.400969 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # bcabcab -2.728954 0.832620 0.000000 -2.672162 -0.832620 1.400969 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # bcabcabc -1.050506 -2.652713 0.000000 -2.672162 0.576191 -1.524459 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # bcabcabca -1.050506 2.652713 0.000000 -2.672162 0.576191 1.524459 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # bcabcabcab -1.787482 2.652713 0.000000 -3.038417 -2.652713 1.524459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311942 # bcabcabcabc 0.959497 -3.051449 0.000000 -3.038417 -0.462070 -3.024459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311942 # bcabcabcabca 0.959497 3.051449 0.000000 -3.038417 -0.462070 3.024459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311942 # bcabcabcabcab -5.599424 3.051449 0.000000 -6.298007 -3.051449 3.024459 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 6.298007 -4.178360 0.000000 7.623883 # bcabcabcabcabc -1.105465 -6.280354 0.000000 -6.298007 0.462070 -4.271438 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 0.659969 7.529146 0.000000 7.623883 # bcabcabcabcabca -1.105465 6.280354 0.000000 -6.298007 0.462070 4.271438 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 0.659969 -7.529146 0.000000 7.623883 # bcabcabcabcabcb -6.482367 -6.280354 0.000000 -8.970169 -6.280354 -4.271438 0.000000 -7.529146 0.000000 0.000000 1.000000 0.000000 8.970169 7.529146 0.000000 11.753807 # bcabcabcabcac 2.983956 -1.152382 0.000000 -3.038417 2.076522 -2.246980 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -3.495130 2.318815 0.000000 4.311942 # bcabcabcabcaca 2.983956 1.152382 0.000000 -3.038417 2.076522 2.246980 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -3.495130 -2.318815 0.000000 4.311942 # bcabcabcabcacab -8.951868 1.152382 0.000000 -8.970169 -7.255281 2.246980 0.000000 -7.529145 0.000000 0.000000 1.000000 0.000000 11.479332 -2.318815 0.000000 11.753806 # bcabcabcabcacac 2.761435 1.614452 0.000000 -3.038417 3.051450 0.222521 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -3.992101 -1.286846 0.000000 4.311942 # bcabcabcabcacb -8.951868 -1.152382 0.000000 -8.970169 -7.255281 -2.246980 0.000000 -7.529145 0.000000 0.000000 1.000000 0.000000 11.479332 2.318815 0.000000 11.753806 # bcabcabcabcb -5.599424 -3.051449 0.000000 -6.298007 -3.051449 -3.024459 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # bcabcabcac 1.418994 -2.475258 0.000000 -2.672162 1.551119 -0.500000 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # bcabcabcaca 1.418994 2.475258 0.000000 -2.672162 1.551119 0.500000 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # bcabcabcacab -5.876903 2.475258 0.000000 -6.298007 -4.267165 0.500000 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # bcabcabcacabc -1.728954 -6.138046 0.000000 -6.298007 -2.269618 -3.647949 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 2.672162 7.069876 0.000000 7.623883 # bcabcabcacabca -1.728954 6.138046 0.000000 -6.298007 -2.269618 3.647949 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 2.672162 -7.069876 0.000000 7.623883 # bcabcabcacabcab -5.449887 6.138046 0.000000 -8.147201 -1.756759 3.647949 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 5.638037 -7.069876 0.000000 9.097836 # bcabcabcacabcac 3.720933 -5.178760 0.000000 -6.298007 1.436997 -4.048918 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 -3.861386 6.497176 0.000000 7.623883 # bcabcabcacabcb -5.449887 -6.138046 0.000000 -8.147201 -1.756759 -3.647949 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 5.638037 7.069876 0.000000 9.097836 # bcabcabcacac 2.819963 -0.433884 0.000000 -2.672162 1.358023 0.900969 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # bcabcabcacacb -8.196866 -0.433884 0.000000 -8.147200 -3.947402 0.900969 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 9.042710 0.000000 0.000000 9.097835 # bcabcabcacb -5.876903 -2.475258 0.000000 -6.298007 -4.267165 -0.500000 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # bcabcabcb -1.787482 -2.652713 0.000000 -3.038417 -2.652713 -1.524459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311942 # bcabcac 1.269457 0.256429 0.000000 -0.822968 0.895953 -1.123490 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # bcabcaca 1.269457 -0.256429 0.000000 -0.822968 0.895953 1.123490 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # bcabcacab -3.188451 -0.256429 0.000000 -3.038417 -2.845809 1.123490 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # bcabcacabc -2.188451 -2.332951 0.000000 -3.038417 -0.895953 -2.925428 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311941 # bcabcacabca -2.188451 2.332951 0.000000 -3.038417 -0.895953 2.925428 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311941 # bcabcacabcab -0.386513 2.332951 0.000000 -2.142907 -2.332951 2.925428 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311942 # bcabcacabcabc 1.582987 -1.756759 0.000000 -2.142907 0.832621 -3.647949 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311942 # bcabcacabcabca 1.582987 1.756759 0.000000 -2.142907 0.832621 3.647949 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 -1.482938 -3.923485 0.000000 4.311942 # bcabcacabcabcab -5.449887 1.756759 0.000000 -5.638037 -6.138046 3.647949 0.000000 -7.069876 0.000000 0.000000 1.000000 0.000000 8.147201 -3.923485 0.000000 9.097836 # bcabcacabcabcac 2.360466 0.142308 0.000000 -2.142907 3.371212 -1.623490 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 -3.992101 1.286845 0.000000 4.311942 # bcabcacabcabcb -5.449887 -1.756759 0.000000 -5.638037 -6.138046 -3.647949 0.000000 -7.069876 0.000000 0.000000 1.000000 0.000000 8.147201 3.923485 0.000000 9.097836 # bcabcacabcac 0.459497 -3.165571 0.000000 -3.038417 1.728574 -2.524459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311941 # bcabcacabcaca 0.459497 3.165571 0.000000 -3.038417 1.728574 2.524459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -1.482938 -3.923485 0.000000 4.311941 # bcabcacabcacab -4.771438 3.165571 0.000000 -5.638037 -6.679090 2.524459 0.000000 -7.069875 0.000000 0.000000 1.000000 0.000000 8.147200 -3.923485 0.000000 9.097835 # bcabcacabcacabc -0.500000 -5.704162 0.000000 -5.638037 -2.190643 -6.795897 0.000000 -7.069875 0.000000 0.000000 1.000000 0.000000 2.012192 8.815991 0.000000 9.097835 # bcabcacabcacac 2.761435 -1.614452 0.000000 -3.038417 3.051450 -0.222521 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -3.992101 1.286845 0.000000 4.311941 # bcabcacabcacacb -8.583380 -1.614452 0.000000 -8.676454 -8.869733 -0.222521 0.000000 -8.815990 0.000000 0.000000 1.000000 0.000000 12.302300 1.286845 0.000000 12.409777 # bcabcacabcacb -4.771438 -3.165571 0.000000 -5.638037 -6.679090 -2.524459 0.000000 -7.069875 0.000000 0.000000 1.000000 0.000000 8.147200 3.923485 0.000000 9.097835 # bcabcacabcb -0.386513 -2.332951 0.000000 -2.142907 -2.332951 -2.925428 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311942 # bcabcacac 0.591009 1.152383 0.000000 -0.822968 1.436997 0.000000 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # bcabcacacb -2.064961 1.152383 0.000000 -2.142907 -3.741762 0.000000 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # bcabcacb -3.188451 0.256429 0.000000 -3.038417 -2.845809 -1.123490 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 4.155100 0.572700 0.000000 4.311941 # bcabcb -2.728954 -0.832620 0.000000 -2.672162 -0.832620 -1.400969 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # bcac 0.368488 -1.614452 0.000000 -1.319939 0.974928 0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # bcaca 0.368488 1.614452 0.000000 -1.319939 0.974928 -0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # bcacab -2.352444 1.614452 0.000000 -2.672162 -1.614452 -0.222521 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # bcacabc -0.204495 -2.845809 0.000000 -2.672162 -1.180568 -1.123490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # bcacabca -0.204495 2.845809 0.000000 -2.672162 -1.180568 1.123490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # bcacabcab -3.188451 2.845809 0.000000 -4.155100 0.256429 1.123490 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311941 # bcacabcabc 0.236976 -4.267165 0.000000 -4.155100 1.038261 -0.500000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311941 # bcacabcabca 0.236976 4.267165 0.000000 -4.155100 1.038261 0.500000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311941 # bcacabcabcab -5.876903 4.267165 0.000000 -7.193517 -2.475258 0.500000 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 6.298007 -4.178360 0.000000 7.623883 # bcacabcabcabc -0.327985 -7.255281 0.000000 -7.193517 -1.152383 -2.246980 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 7.529145 0.000000 7.623883 # bcacabcabcabca -0.327985 7.255281 0.000000 -7.193517 -1.152383 2.246980 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 -7.529145 0.000000 7.623883 # bcacabcabcabcab -8.951868 7.255281 0.000000 -11.479332 -1.152382 2.246980 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 8.970169 -7.529145 0.000000 11.753806 # bcacabcabcabcac 5.467912 -4.780023 0.000000 -7.193517 1.038261 -2.301938 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -5.475039 5.210330 0.000000 7.623883 # bcacabcabcabcb -8.951868 -7.255281 0.000000 -11.479332 -1.152382 -2.246980 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 8.970169 7.529145 0.000000 11.753806 # bcacabcabcac 3.483956 -2.475258 0.000000 -4.155100 1.038261 0.500000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -3.495130 2.318815 0.000000 4.311941 # bcacabcabcaca 3.483956 2.475258 0.000000 -4.155100 1.038261 -0.500000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -3.495130 -2.318815 0.000000 4.311941 # bcacabcabcacab -11.253806 2.475258 0.000000 -11.479331 -2.475258 -0.500000 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 11.479331 -2.318815 0.000000 11.753806 # bcacabcabcacabc -5.081398 -10.341878 0.000000 -11.479331 -1.934214 -1.623490 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 5.344324 10.420660 0.000000 11.753806 # bcacabcabcacac 4.107446 1.180568 0.000000 -4.155100 0.256429 1.123490 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -3.992101 -1.286845 0.000000 4.311941 # bcacabcabcacacb -12.286286 1.180568 0.000000 -12.302300 -1.180568 1.123490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 12.302300 -1.286845 0.000000 12.409776 # bcacabcabcacb -11.253806 -2.475258 0.000000 -11.479331 -2.475258 0.500000 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 11.479331 2.318815 0.000000 11.753806 # bcacabcabcb -5.876903 -4.267165 0.000000 -7.193517 -2.475258 -0.500000 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # bcacabcac 2.097442 -1.934214 0.000000 -2.672162 0.142308 -1.623490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # bcacabcaca 2.097442 1.934214 0.000000 -2.672162 0.142308 1.623490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # bcacabcacab -7.000393 1.934214 0.000000 -7.193517 -1.934214 1.623490 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # bcacabcacabc -2.852444 -6.679090 0.000000 -7.193517 0.063333 -2.524459 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 7.069875 0.000000 7.623883 # bcacabcacabca -2.852444 6.679090 0.000000 -7.193517 0.063333 2.524459 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 -7.069875 0.000000 7.623883 # bcacabcacabcab -4.771438 6.679090 0.000000 -8.147200 -3.165571 2.524459 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 5.638037 -7.069875 0.000000 9.097835 # bcacabcacabcabc 2.246980 -7.894805 0.000000 -8.147200 0.000000 -4.048918 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 -2.012193 8.815990 0.000000 9.097835 # bcacabcacabcac 3.443453 -6.394475 0.000000 -7.193517 2.013189 -1.524459 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -3.861386 6.497175 0.000000 7.623883 # bcacabcacabcaca 3.443453 6.394475 0.000000 -7.193517 2.013189 1.524459 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -3.861386 -6.497175 0.000000 7.623883 # bcacabcacabcacb -15.197259 -6.394475 0.000000 -16.457399 -6.394475 -1.524459 0.000000 -6.497175 0.000000 0.000000 1.000000 0.000000 16.457399 6.497175 0.000000 17.721718 # bcacabcacabcb -4.771438 -6.679090 0.000000 -8.147200 -3.165571 -2.524459 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 5.638037 7.069875 0.000000 9.097835 # bcacabcacac 2.819963 0.433884 0.000000 -2.672162 1.358023 -0.900969 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # bcacabcacacb -8.196866 0.433884 0.000000 -8.147200 -3.947403 -0.900969 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 9.042710 0.000000 0.000000 9.097835 # bcacabcacb -7.000393 -1.934214 0.000000 -7.193517 -1.934214 -1.623490 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # bcacabcb -3.188451 -2.845809 0.000000 -4.155100 0.256429 -1.123490 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311941 # bcacac 1.491978 -0.718499 0.000000 -1.319939 0.433884 0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # bcacaca 1.491978 0.718499 0.000000 -1.319939 0.433884 -0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # bcacacab -4.212910 0.718499 0.000000 -4.155099 -0.718499 -0.900969 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 4.155099 -0.572700 0.000000 4.311941 # bcacacabc -2.064962 -3.741762 0.000000 -4.155099 -1.152382 0.000000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311941 # bcacacabca -2.064962 3.741762 0.000000 -4.155099 -1.152382 0.000000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311941 # bcacacabcac 1.637945 -3.947403 0.000000 -4.155099 -0.718499 -0.900969 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311941 # bcacacabcaca 1.637945 3.947403 0.000000 -4.155099 -0.718499 0.900969 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -1.482938 -3.923485 0.000000 4.311941 # bcacacabcacab -8.196866 3.947403 0.000000 -9.042710 0.433884 0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 8.147200 -3.923485 0.000000 9.097835 # bcacacabcacabc -2.024459 -8.869733 0.000000 -9.042710 0.974928 -0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.012192 8.815990 0.000000 9.097835 # bcacacabcacabca -2.024459 8.869733 0.000000 -9.042710 0.974928 0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.012192 -8.815990 0.000000 9.097835 # bcacacabcacabcb -8.583380 -8.869733 0.000000 -12.302300 -1.614452 -0.222521 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 8.676454 8.815990 0.000000 12.409777 # bcacacabcacac 4.107446 -1.180568 0.000000 -4.155099 0.256429 -1.123490 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -3.992101 1.286845 0.000000 4.311941 # bcacacabcacacb -12.286286 -1.180568 0.000000 -12.302300 -1.180568 -1.123490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 12.302300 1.286845 0.000000 12.409776 # bcacacabcacb -8.196866 -3.947403 0.000000 -9.042710 0.433884 -0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 8.147200 3.923485 0.000000 9.097835 # bcacacb -4.212910 -0.718499 0.000000 -4.155099 -0.718499 0.900969 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 4.155099 0.572700 0.000000 4.311941 # bcacb -2.352444 -1.614452 0.000000 -2.672162 -1.614452 0.222521 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # bcb -0.032481 -1.294690 0.000000 -0.822968 -1.294690 -0.623490 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # c 0.623490 0.781832 0.000000 0.000000 0.781832 -0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # ca 0.623490 -0.781832 0.000000 0.000000 0.781832 0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cab -1.032481 -0.781832 0.000000 -0.822968 -1.294690 0.623490 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # cabc -1.255002 -0.319762 0.000000 -0.822968 -0.319762 -1.400969 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # cabca -1.255002 0.319762 0.000000 -0.822968 -0.319762 1.400969 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # cabcab 0.991978 0.319762 0.000000 0.293714 -0.832620 1.400969 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # cabcabc 0.868488 0.576191 0.000000 0.293714 0.576191 -1.524459 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # cabcabca 0.868488 -0.576191 0.000000 0.293714 0.576191 1.524459 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # cabcabcab -1.050506 -0.576191 0.000000 -0.659969 -2.652713 1.524459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # cabcabcabc -1.105465 -0.462070 0.000000 -0.659969 -0.462070 -3.024459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # cabcabcabca -1.105465 0.462070 0.000000 -0.659969 -0.462070 3.024459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # cabcabcabcab 0.959497 0.462070 0.000000 0.366256 -3.051449 3.024459 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311942 # cabcabcabcabc 0.959497 0.462070 0.000000 0.366256 0.462070 -4.271438 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311942 # cabcabcabcabca 0.959497 -0.462070 0.000000 0.366256 0.462070 4.271438 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311942 # cabcabcabcabcab -1.105465 -0.462070 0.000000 -0.659969 -6.280354 4.271438 0.000000 -7.529146 0.000000 0.000000 1.000000 0.000000 6.298007 -4.178360 0.000000 7.623883 # cabcabcabcabcac 0.236976 1.038261 0.000000 0.366256 3.627641 -2.301938 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 -3.495130 2.318815 0.000000 4.311942 # cabcabcabcabcb -1.105465 0.462070 0.000000 -0.659969 -6.280354 -4.271438 0.000000 -7.529146 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # cabcabcabcac -0.327985 -1.152383 0.000000 -0.659969 2.076522 -2.246980 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # cabcabcabcaca -0.327985 1.152383 0.000000 -0.659969 2.076522 2.246980 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # cabcabcabcacab -0.327985 1.152383 0.000000 -0.659969 -7.255281 2.246980 0.000000 -7.529145 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # cabcabcabcacabc 0.696474 -0.974928 0.000000 -0.659969 -2.766834 -7.073377 0.000000 -7.529145 0.000000 0.000000 1.000000 0.000000 2.672162 7.069876 0.000000 7.623883 # cabcabcabcacac 0.696474 -0.974928 0.000000 -0.659969 3.051450 0.222521 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # cabcabcabcacacb -2.024459 -0.974928 0.000000 -2.012192 -8.869734 0.222521 0.000000 -8.815991 0.000000 0.000000 1.000000 0.000000 9.042710 0.000000 0.000000 9.097835 # cabcabcabcacb -0.327985 -1.152383 0.000000 -0.659969 -7.255281 -2.246980 0.000000 -7.529145 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # cabcabcabcb 0.959497 -0.462070 0.000000 0.366256 -3.051449 -3.024459 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311942 # cabcabcac 0.091009 1.038261 0.000000 0.293714 1.551119 -0.500000 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # cabcabcaca 0.091009 -1.038261 0.000000 0.293714 1.551119 0.500000 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # cabcabcacab 0.236976 -1.038261 0.000000 0.366256 -4.267165 0.500000 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # cabcabcacabc -0.663993 0.832621 0.000000 0.366256 -2.269618 -3.647949 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311941 # cabcabcacabca -0.663993 -0.832621 0.000000 0.366256 -2.269618 3.647949 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311941 # cabcabcacabcab 1.582987 -0.832621 0.000000 1.482938 -1.756759 3.647949 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311942 # cabcabcacabcabc 0.336007 1.756760 0.000000 1.482938 1.756760 -3.647948 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311942 # cabcabcacabcac -1.064962 0.000000 0.000000 0.366256 1.436997 -4.048918 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311941 # cabcabcacabcaca -1.064962 0.000000 0.000000 0.366256 1.436997 4.048918 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 -1.482938 -3.923485 0.000000 4.311941 # cabcabcacabcacb 2.246980 0.000000 0.000000 2.012193 -7.894805 -4.048918 0.000000 -8.815990 0.000000 0.000000 1.000000 0.000000 8.147200 3.923485 0.000000 9.097835 # cabcabcacabcb 1.582987 0.832621 0.000000 1.482938 -1.756759 -3.647949 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311942 # cabcabcacac -0.755002 0.718499 0.000000 0.293714 1.358023 0.900969 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # cabcabcacacb 1.637945 0.718499 0.000000 1.482938 -3.947402 0.900969 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # cabcabcacb 0.236976 1.038261 0.000000 0.366256 -4.267165 -0.500000 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 4.155100 0.572700 0.000000 4.311941 # cabcabcb -1.050506 0.576191 0.000000 -0.659969 -2.652713 -1.524459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # cabcac -0.532481 -1.180568 0.000000 -0.822968 0.895953 -1.123490 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # cabcaca -0.532481 1.180568 0.000000 -0.822968 0.895953 1.123490 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # cabcacab -0.204495 1.180568 0.000000 -0.659969 -2.845809 1.123490 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # cabcacabc 0.795505 -0.895953 0.000000 -0.659969 -0.895953 -2.925428 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # cabcacabca 0.795505 0.895953 0.000000 -0.659969 -0.895953 2.925428 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # cabcacabcab -2.188451 0.895953 0.000000 -2.142907 -2.332951 2.925428 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311941 # cabcacabcabc -0.663993 -2.269618 0.000000 -2.142907 0.832621 -3.647949 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311941 # cabcacabcabca -0.663993 2.269618 0.000000 -2.142907 0.832621 3.647949 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311941 # cabcacabcabcab -1.728954 2.269618 0.000000 -2.672162 -6.138046 3.647949 0.000000 -7.069876 0.000000 0.000000 1.000000 0.000000 6.298007 -4.178360 0.000000 7.623883 # cabcacabcabcabc 0.696474 -2.766834 0.000000 -2.672162 -0.974928 -7.073377 0.000000 -7.069876 0.000000 0.000000 1.000000 0.000000 0.659969 7.529145 0.000000 7.623883 # cabcacabcabcac 1.360466 -1.934214 0.000000 -2.142907 3.371212 -1.623490 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 -3.495130 2.318815 0.000000 4.311941 # cabcacabcabcaca 1.360466 1.934214 0.000000 -2.142907 3.371212 1.623490 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 -3.495130 -2.318815 0.000000 4.311941 # cabcacabcabcacb -5.081398 -1.934214 0.000000 -5.344324 -10.341878 -1.623490 0.000000 -10.420660 0.000000 0.000000 1.000000 0.000000 11.479331 2.318815 0.000000 11.753806 # cabcacabcabcb -1.728954 -2.269618 0.000000 -2.672162 -6.138046 -3.647949 0.000000 -7.069876 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # cabcacabcac 1.196473 0.063333 0.000000 -0.659969 1.728574 -2.524459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # cabcacabcaca 1.196473 -0.063333 0.000000 -0.659969 1.728574 2.524459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # cabcacabcacab -2.852444 -0.063333 0.000000 -2.672162 -6.679090 2.524459 0.000000 -7.069875 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # cabcacabcacabc -1.827985 -2.190643 0.000000 -2.672162 -2.190643 -6.795897 0.000000 -7.069875 0.000000 0.000000 1.000000 0.000000 2.672162 7.069875 0.000000 7.623883 # cabcacabcacabca -1.827985 2.190643 0.000000 -2.672162 -2.190643 6.795897 0.000000 -7.069875 0.000000 0.000000 1.000000 0.000000 2.672162 -7.069875 0.000000 7.623883 # cabcacabcacabcb -0.500000 -2.190643 0.000000 -2.012192 -5.704162 -6.795897 0.000000 -8.815991 0.000000 0.000000 1.000000 0.000000 5.638037 7.069875 0.000000 9.097835 # cabcacabcacac 0.696473 0.974928 0.000000 -0.659969 3.051450 -0.222521 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # cabcacabcacacb -2.024459 0.974928 0.000000 -2.012192 -8.869733 -0.222521 0.000000 -8.815990 0.000000 0.000000 1.000000 0.000000 9.042710 0.000000 0.000000 9.097835 # cabcacabcacb -2.852444 0.063333 0.000000 -2.672162 -6.679090 -2.524459 0.000000 -7.069875 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # cabcacabcb -2.188451 -0.895953 0.000000 -2.142907 -2.332951 -2.925428 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311941 # cabcacac 0.591009 -1.152382 0.000000 -0.822968 1.436997 0.000000 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # cabcacacb -2.064962 -1.152382 0.000000 -2.142907 -3.741762 0.000000 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 4.155099 0.572700 0.000000 4.311941 # cabcacb -0.204495 -1.180568 0.000000 -0.659969 -2.845809 -1.123490 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # cabcb 0.991978 -0.319762 0.000000 0.293714 -0.832620 -1.400969 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # cac -0.222521 0.974928 0.000000 0.000000 0.974928 0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # caca -0.222521 -0.974928 0.000000 0.000000 0.974928 -0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cacab 0.368488 -0.974928 0.000000 0.293714 -1.614452 -0.222521 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # cacabc -0.532481 0.895953 0.000000 0.293714 -1.180568 -1.123490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # cacabca -0.532481 -0.895953 0.000000 0.293714 -1.180568 1.123490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # cacabcab 1.269457 -0.895953 0.000000 1.189224 0.256429 1.123490 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # cacabcabc 0.091009 1.551119 0.000000 1.189224 1.038261 -0.500000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # cacabcabca 0.091009 -1.551119 0.000000 1.189224 1.038261 0.500000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # cacabcabcab 1.418994 -1.551119 0.000000 1.849193 -2.475258 0.500000 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # cacabcabcabc -0.327985 2.076522 0.000000 1.849193 -1.152383 -2.246980 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # cacabcabcabca -0.327985 -2.076522 0.000000 1.849193 -1.152383 2.246980 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # cacabcabcabcab 2.983956 -2.076522 0.000000 3.495130 -1.152382 2.246980 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311942 # cacabcabcabcabc 0.236976 3.627641 0.000000 3.495130 1.038261 -2.301938 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311942 # cacabcabcabcac -1.827985 1.038261 0.000000 1.849193 1.038261 -2.301938 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # cacabcabcabcaca -1.827985 -1.038261 0.000000 1.849193 1.038261 2.301938 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # cacabcabcabcacb 5.467912 1.038261 0.000000 5.475039 -4.780023 -2.301938 0.000000 -5.210330 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # cacabcabcabcb 2.983956 2.076522 0.000000 3.495130 -1.152382 -2.246980 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311942 # cacabcabcac -1.155971 1.038261 0.000000 1.189224 1.038261 0.500000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # cacabcabcaca -1.155971 -1.038261 0.000000 1.189224 1.038261 -0.500000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # cacabcabcacab 3.483956 -1.038261 0.000000 3.495130 -2.475258 -0.500000 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # cacabcabcacabc 1.360466 3.371212 0.000000 3.495130 -1.934214 -1.623490 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311941 # cacabcabcacabca 1.360466 -3.371212 0.000000 3.495130 -1.934214 1.623490 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311941 # cacabcabcacabcb 2.360466 3.371212 0.000000 3.992101 0.142308 -1.623490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311942 # cacabcabcacac -1.532481 -0.256429 0.000000 1.189224 0.256429 1.123490 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # cacabcabcacacb 4.107446 -0.256429 0.000000 3.992101 -1.180568 1.123490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # cacabcabcacb 3.483956 1.038261 0.000000 3.495130 -2.475258 0.500000 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 4.155100 0.572700 0.000000 4.311941 # cacabcabcb 1.418994 1.551119 0.000000 1.849193 -2.475258 -0.500000 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # cacabcac -1.032481 0.142308 0.000000 0.293714 0.142308 -1.623490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # cacabcaca -1.032481 -0.142308 0.000000 0.293714 0.142308 1.623490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # cacabcacab 2.097442 -0.142308 0.000000 1.849193 -1.934214 1.623490 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # cacabcacabc 1.196473 1.728574 0.000000 1.849193 0.063333 -2.524459 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # cacabcacabca 1.196473 -1.728574 0.000000 1.849193 0.063333 2.524459 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # cacabcacabcab 0.459497 -1.728574 0.000000 1.482938 -3.165571 2.524459 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311941 # cacabcacabcabc -1.064962 1.436997 0.000000 1.482938 0.000000 -4.048918 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311941 # cacabcacabcabca -1.064962 -1.436997 0.000000 1.482938 0.000000 4.048918 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311941 # cacabcacabcabcb 3.720933 1.436997 0.000000 3.861386 -5.178760 -4.048918 0.000000 -6.497176 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # cacabcacabcac -0.605464 2.013189 0.000000 1.849193 2.013189 -1.524459 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # cacabcacabcaca -0.605464 -2.013189 0.000000 1.849193 2.013189 1.524459 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # cacabcacabcacab 3.443453 -2.013189 0.000000 3.861386 -6.394475 1.524459 0.000000 -6.497175 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # cacabcacabcacac -1.951475 0.781831 0.000000 1.849193 2.447072 0.623490 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # cacabcacabcacb 3.443453 2.013189 0.000000 3.861386 -6.394475 -1.524459 0.000000 -6.497175 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # cacabcacabcb 0.459497 1.728574 0.000000 1.482938 -3.165571 -2.524459 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311941 # cacabcacac -0.755002 -0.718499 0.000000 0.293714 1.358023 -0.900969 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # cacabcacacb 1.637945 -0.718499 0.000000 1.482938 -3.947403 -0.900969 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 4.155099 0.572700 0.000000 4.311941 # cacabcacb 2.097442 0.142308 0.000000 1.849193 -1.934214 -1.623490 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # cacabcb 1.269457 0.895953 0.000000 1.189224 0.256429 -1.123490 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # cacac -0.900969 0.433884 0.000000 0.000000 0.433884 0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cacaca -0.900969 -0.433884 0.000000 0.000000 0.433884 -0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cacacab 1.491978 -0.433884 0.000000 1.189224 -0.718499 -0.900969 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # cacacabc 0.591009 1.436997 0.000000 1.189224 -1.152382 0.000000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # cacacabca 0.591009 -1.436997 0.000000 1.189224 -1.152382 0.000000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # cacacabcac -0.755002 1.358023 0.000000 1.189224 -0.718499 -0.900969 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # cacacabcaca -0.755002 -1.358023 0.000000 1.189224 -0.718499 0.900969 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # cacacabcacab 2.819963 -1.358023 0.000000 2.965876 0.433884 0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # cacacabcacabc 0.696473 3.051450 0.000000 2.965876 0.974928 -0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # cacacabcacabca 0.696473 -3.051450 0.000000 2.965876 0.974928 0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # cacacabcacabcab 2.761435 -3.051450 0.000000 3.992101 -1.614452 0.222521 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311941 # cacacabcacabcac -1.951475 2.447072 0.000000 2.965876 0.781831 0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # cacacabcacabcb 2.761435 3.051450 0.000000 3.992101 -1.614452 -0.222521 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311941 # cacacabcacac -1.532481 0.256429 0.000000 1.189224 0.256429 -1.123490 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # cacacabcacacb 4.107446 0.256429 0.000000 3.992101 -1.180568 -1.123490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 4.155099 0.572700 0.000000 4.311941 # cacacabcacb 2.819963 1.358023 0.000000 2.965876 0.433884 -0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # cacacb 1.491978 0.433884 0.000000 1.189224 -0.718499 0.900969 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # cacb 0.368488 0.974928 0.000000 0.293714 -1.614452 0.222521 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # cb -1.032481 0.781832 0.000000 -0.822968 -1.294690 -0.623490 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 geomview-1.9.5/data/groups/good_klein_quick.dgp0000644000175000017500000000364312310110173016516 00000000000000{ appearance { +edge -face } DISCGRP (group " 3trans " ) (comment " klein bottle for shape of space flythroughs " ) (attribute euclidean ) #(display zcull ) (geom < hook.off ) (display drawgeom ) #(display drawdirdom) #(display centercam) (dimn 3 ) (wafile klein.wa) (ngens 6 ) (gens a 1 0 0 0 0 -1 0 0 0 0 1 0 1 0 0 1 b 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 c 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 A 1 0 0 0 0 -1 0 0 0 0 1 0 -1 0 0 1 B 1 0 0 0 0 1 0 0 0 0 1 0 0 -1 0 1 C 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -1 1 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) (enumdepth 4) (enumdist 10 ) (scale 0.2 ) (geom { &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@ target_triplet = @target@ subdir = data DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(nobase_dist_geomdata_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(geomdatadir)" DATA = $(nobase_dist_geomdata_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir 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 DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = shaders # Current automake (version 1.4) will not create directory "b" if # "a/b/foo" is listed in a _DATA variable. # # # We can hack our way around this by taking advantage of the fact that # automake will install the various *_DATA files in order of the # variable name. groups = \ groups/101a.dgp\ groups/101b.dgp\ groups/120.dgp\ groups/230data\ groups/230data.Conway\ groups/230data.lat\ groups/230data.names\ groups/3torus.dgp\ groups/3torus2.dgp\ groups/94a.dgp\ groups/94b.dgp\ groups/borrom.dgp\ groups/borrom2.dgp\ groups/borrom3.dgp\ groups/borrom4.dgp\ groups/borrom4.wa\ groups/fig8.dgp\ groups/g233.prj\ groups/g234.prj\ groups/g235.prj\ groups/g236.prj\ groups/g237.prj\ groups/good_klein_quick.dgp\ groups/hook.off\ groups/klein.wa\ groups/klein_bricks.dgp\ groups/klein_whole.dgp\ groups/notknot.dgp\ groups/sample.proj.dgp\ groups/sample.uhs.dgp\ groups/spaceshipSpace.geom\ groups/tetra2.dgp\ groups/wholecube.geom gcl = \ gcl/arithmetic.gcl\ gcl/events.gcl nobase_dist_geomdata_DATA = .geomview cmap.fmap geom/abstr.off \ geom/alphabet.vect geom/antoine0.oogl geom/antoine1.oogl \ geom/antoine2.oogl geom/antoine3.oogl geom/axes.list \ geom/br2.grp geom/br2.off geom/br4.2 geom/br4fd.grp \ geom/br4fd.list geom/cam.off geom/camera-frustum geom/catenoid \ geom/cone.off geom/csquare.quad geom/cube geom/cube.off \ geom/diamond geom/dodec geom/dodec.off geom/dodec.quad \ geom/dodec2.off geom/facecube.off geom/hdodec.off \ geom/helicoid geom/hypercube.off geom/ico.grp geom/icosa.off \ geom/icosa.quad geom/jungle.list geom/klein8 geom/link2.grp \ geom/link8.grp geom/moebius.4d.mesh geom/moebius.skel \ geom/mushroom.off geom/nsquare.quad geom/octa.off \ geom/octant.bez geom/office.oogl geom/pieces/cube1.off \ geom/pieces/linkA.bez geom/pieces/linkB.bez \ geom/polyhedra/cube geom/polyhedra/cuboctahedron \ geom/polyhedra/dodecahedron geom/polyhedra/icosahedron \ geom/polyhedra/icosidodecahedron geom/polyhedra/octahedron \ geom/polyhedra/rhombicosidodecahedron \ geom/polyhedra/rhombicuboctahedron \ geom/polyhedra/rhombitruncated_cubeoctahedron \ geom/polyhedra/rhombitruncated_icosidodecahedron \ geom/polyhedra/snub_cube geom/polyhedra/snub_dodecahedron \ geom/polyhedra/tetrahedron geom/polyhedra/truncated_cube \ geom/polyhedra/truncated_dodecahedron \ geom/polyhedra/truncated_icosahedron \ geom/polyhedra/truncated_octahedron \ geom/polyhedra/truncated_tetrahedron geom/ref.inst \ geom/ref.list geom/ref1.grp geom/ref2.list geom/sample.mesh \ geom/sph12.mesh geom/sphere.mesh geom/spherical/dodecaplex.off \ geom/spherical/flattorus.mesh geom/spherical/hypercube.off \ geom/spherical/octaplex.off geom/spherical/orthoplex.off \ geom/spherical/ruledtorus.mesh geom/spherical/simplex.off \ geom/spherical/tetraplex.off geom/spherical/twosided.flattorus \ geom/square.quad geom/teapot.bez geom/tent.mesh geom/tetra \ geom/tetra.off geom/textured/Antenna.geom \ geom/textured/GCGball geom/textured/dodec.off \ geom/textured/lunar-t.oogl geom/textured/rabbitball \ geom/textured/square.off geom/textured/themi.bez \ geom/textured/sphere.gcl geom/textured/Earth.pam.bz2 \ geom/textured/NASA.pgm.gz geom/textured/geologo.pgm.gz \ geom/textured/grid.pgm.gz geom/textured/rabbits.ppm.gz \ geom/textured/white.pgm.gz geom/torus.bez geom/torus3.oogl \ geom/torus8.oogl geom/trapezoid.4d.off geom/tref.mesh \ geom/tref.off geom/tri.4d.vect geom/tri.vect geom/triangle \ geom/twosidedsquare.quad geom/unit.sphere geom/unitcube.off \ geom/vertcube.off geom/warp.inst geom/wraptent.mesh \ geom/xwyezed.vect geom/xyz.grp geom/xyz.vect geom/ztent.mesh \ $(groups) $(gcl) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu data/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-nobase_dist_geomdataDATA: $(nobase_dist_geomdata_DATA) @$(NORMAL_INSTALL) @list='$(nobase_dist_geomdata_DATA)'; test -n "$(geomdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(geomdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(geomdatadir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(geomdatadir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(geomdatadir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(geomdatadir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(geomdatadir)/$$dir" || exit $$?; }; \ done uninstall-nobase_dist_geomdataDATA: @$(NORMAL_UNINSTALL) @list='$(nobase_dist_geomdata_DATA)'; test -n "$(geomdatadir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(geomdatadir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(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-recursive 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" cscopelist: cscopelist-recursive 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 distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(geomdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-nobase_dist_geomdataDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-nobase_dist_geomdataDATA .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-nobase_dist_geomdataDATA install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-nobase_dist_geomdataDATA # 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: geomview-1.9.5/data/Makefile.am0000644000175000017500000000734112310110173013230 00000000000000SUBDIRS = shaders # Current automake (version 1.4) will not create directory "b" if # "a/b/foo" is listed in a _DATA variable. # # # We can hack our way around this by taking advantage of the fact that # automake will install the various *_DATA files in order of the # variable name. groups =\ groups/101a.dgp\ groups/101b.dgp\ groups/120.dgp\ groups/230data\ groups/230data.Conway\ groups/230data.lat\ groups/230data.names\ groups/3torus.dgp\ groups/3torus2.dgp\ groups/94a.dgp\ groups/94b.dgp\ groups/borrom.dgp\ groups/borrom2.dgp\ groups/borrom3.dgp\ groups/borrom4.dgp\ groups/borrom4.wa\ groups/fig8.dgp\ groups/g233.prj\ groups/g234.prj\ groups/g235.prj\ groups/g236.prj\ groups/g237.prj\ groups/good_klein_quick.dgp\ groups/hook.off\ groups/klein.wa\ groups/klein_bricks.dgp\ groups/klein_whole.dgp\ groups/notknot.dgp\ groups/sample.proj.dgp\ groups/sample.uhs.dgp\ groups/spaceshipSpace.geom\ groups/tetra2.dgp\ groups/wholecube.geom gcl =\ gcl/arithmetic.gcl\ gcl/events.gcl nobase_dist_geomdata_DATA =\ .geomview\ cmap.fmap\ geom/abstr.off\ geom/alphabet.vect\ geom/antoine0.oogl\ geom/antoine1.oogl\ geom/antoine2.oogl\ geom/antoine3.oogl\ geom/axes.list\ geom/br2.grp\ geom/br2.off\ geom/br4.2\ geom/br4fd.grp\ geom/br4fd.list\ geom/cam.off\ geom/camera-frustum\ geom/catenoid\ geom/cone.off\ geom/csquare.quad\ geom/cube\ geom/cube.off\ geom/diamond\ geom/dodec\ geom/dodec.off\ geom/dodec.quad\ geom/dodec2.off\ geom/facecube.off\ geom/hdodec.off\ geom/helicoid\ geom/hypercube.off\ geom/ico.grp\ geom/icosa.off\ geom/icosa.quad\ geom/jungle.list\ geom/klein8\ geom/link2.grp\ geom/link8.grp\ geom/moebius.4d.mesh\ geom/moebius.skel\ geom/mushroom.off\ geom/nsquare.quad\ geom/octa.off\ geom/octant.bez\ geom/office.oogl\ geom/pieces/cube1.off\ geom/pieces/linkA.bez\ geom/pieces/linkB.bez\ geom/polyhedra/cube\ geom/polyhedra/cuboctahedron\ geom/polyhedra/dodecahedron\ geom/polyhedra/icosahedron\ geom/polyhedra/icosidodecahedron\ geom/polyhedra/octahedron\ geom/polyhedra/rhombicosidodecahedron\ geom/polyhedra/rhombicuboctahedron\ geom/polyhedra/rhombitruncated_cubeoctahedron\ geom/polyhedra/rhombitruncated_icosidodecahedron\ geom/polyhedra/snub_cube\ geom/polyhedra/snub_dodecahedron\ geom/polyhedra/tetrahedron\ geom/polyhedra/truncated_cube\ geom/polyhedra/truncated_dodecahedron\ geom/polyhedra/truncated_icosahedron\ geom/polyhedra/truncated_octahedron\ geom/polyhedra/truncated_tetrahedron\ geom/ref.inst\ geom/ref.list\ geom/ref1.grp\ geom/ref2.list\ geom/sample.mesh\ geom/sph12.mesh\ geom/sphere.mesh\ geom/spherical/dodecaplex.off\ geom/spherical/flattorus.mesh\ geom/spherical/hypercube.off\ geom/spherical/octaplex.off\ geom/spherical/orthoplex.off\ geom/spherical/ruledtorus.mesh\ geom/spherical/simplex.off\ geom/spherical/tetraplex.off\ geom/spherical/twosided.flattorus\ geom/square.quad\ geom/teapot.bez\ geom/tent.mesh\ geom/tetra\ geom/tetra.off\ geom/textured/Antenna.geom\ geom/textured/GCGball\ geom/textured/dodec.off\ geom/textured/lunar-t.oogl\ geom/textured/rabbitball\ geom/textured/square.off\ geom/textured/themi.bez\ geom/textured/sphere.gcl\ geom/textured/Earth.pam.bz2\ geom/textured/NASA.pgm.gz\ geom/textured/geologo.pgm.gz\ geom/textured/grid.pgm.gz\ geom/textured/rabbits.ppm.gz\ geom/textured/white.pgm.gz\ geom/torus.bez\ geom/torus3.oogl\ geom/torus8.oogl\ geom/trapezoid.4d.off\ geom/tref.mesh\ geom/tref.off\ geom/tri.4d.vect\ geom/tri.vect\ geom/triangle\ geom/twosidedsquare.quad\ geom/unit.sphere\ geom/unitcube.off\ geom/vertcube.off\ geom/warp.inst\ geom/wraptent.mesh\ geom/xwyezed.vect\ geom/xyz.grp\ geom/xyz.vect\ geom/ztent.mesh nobase_dist_geomdata_DATA += $(groups) $(gcl) geomview-1.9.5/data/.geomview0000644000175000017500000000271312310110173013015 00000000000000(progn (if (sgi) (progn (ui-panel "geomview" on { position 8 8 426 426 }) (ui-panel "Tools" on { position 384 384 236 236 }) (ui-panel "Appearance" off { position 7 7 98 98 }) (ui-panel "Cameras" off { position 8 8 76 76 }) (ui-panel "Lighting" off { position 384 384 67 67 }) (ui-panel "Obscure" off { position 9 9 120 120 }) (ui-panel "Commands" off { position 408 408 6 6 }) (ui-panel "Materials" off { position 384 384 46 46 }) (ui-panel "Files" off { position 7 7 8 8 }) (window default { position 549 998 286 735 resize }) ) # else (if (NeXT) (progn (ui-panel geomview on { position 197 520 142 343 }) (ui-panel Tools on { position 93 192 142 669 }) (ui-panel Appearance on { position 765 1044 363 828 }) (ui-panel Commands off { position 531 1045 148 225 }) (window default { position 275 675 450 800 resize }) ) # else we are on some X11 box (progn (ui-panel "geomview" on { position 8 8 10 10 }) (ui-panel "Tools" on { position 410 410 10 10 }) (ui-panel "Appearance" off { position 8 8 660 660 }) (ui-panel "Credits" off { position 8 8 660 660 }) (ui-panel "Cameras" off { position 110 110 240 240 }) (ui-panel "Lighting" off { position 325 325 550 550 }) (ui-panel "Commands" off { position 8 8 660 660}) (ui-panel "Materials" off { position 8 8 660 660 }) (ui-panel "Files" off { position 80 80 300 300 }) (window default { position 549 998 286 735 resize }) ) ) ) ) geomview-1.9.5/data/cmap.fmap0000644000175000017500000000365712310110173012767 00000000000000# # This colormap is used by OFF objects when a single (integer) color component # is specified per face. # 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 .7 .15 .1 .75 .2 .2 .8 .75 .9 .6 .02 .75 .1 .3 .8 .75 .1 .7 .2 .75 .8 .8 .4 .75 .7 .7 0 .75 .7 0 .7 .75 0 .7 .7 .75 .9 0 .2 .75 .2 .9 0 .75 0 .2 .9 .75 .75 .75 .75 .75 .8 .4 0 .75 .8 .4 0 .75 0 .4 .8 .75 0 .4 .8 .75 0 .8 .4 .75 0 .8 .4 .75 .4 0 .8 .75 .4 0 .8 .75 .8 0 .4 .75 .8 0 .4 .75 .7 .5 .2 .75 .7 .5 .2 .75 .7 .7 0 .75 .7 0 .7 .75 0 .7 .7 .75 .9 0 0 .75 0 .9 0 .75 0 0 .9 .75 .75 .75 .75 .75 .8 .4 0 .75 .4 .8 0 .75 0 .4 .8 .75 0 .8 .4 .75 .4 0 .8 .75 .8 0 .4 .75 .7 .7 0 .75 .7 0 .7 .75 0 .7 .7 .75 .9 0 0 .75 0 .9 0 .75 0 0 .9 .75 .75 .75 .75 .75 .8 .4 0 .75 .4 .8 0 .75 0 .4 .8 .75 0 .8 .4 .75 .4 0 .8 .75 .8 0 .4 .75 .7 .7 0 .75 .7 0 .7 .75 0 .7 .7 .75 .9 0 0 .75 0 .9 0 .75 0 0 .9 .75 .75 .75 .75 .75 .8 .4 0 .75 .4 .8 0 .75 0 .4 .8 .75 0 .8 .4 .75 .4 0 .8 .75 .8 0 .4 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 .05 .3 .1 .75 .7 .01 .1 .75 .2 .05 .6 .75 .9 .9 .02 .75 .0 .2 .4 .75 .1 .4 .4 .75 .8 .8 .8 .75 .7 .7 0 .75 .7 .7 0 .75 .7 0 .7 .75 .7 0 .7 .75 0 .7 .7 .75 0 .7 .7 .75 .9 0 0 .75 .9 0 0 .75 0 .9 0 .75 0 .9 0 .75 0 0 .9 .75 0 0 .9 .75 .75 .75 .75 .75 .75 .75 .75 .75 .8 .4 0 .75 .8 .4 0 .75 0 .4 .8 .75 0 .4 .8 .75 0 .8 .4 .75 0 .8 .4 .75 .4 0 .8 .75 .4 0 .8 .75 .8 0 .4 .75 .8 0 .4 .75 .7 .5 .2 .75 .7 .5 .2 .75 .7 .7 0 .75 .7 0 .7 .75 0 .7 .7 .75 .9 0 0 .75 0 .9 0 .75 0 0 .9 .75 .75 .75 .75 .75 .8 .4 0 .75 .4 .8 0 .75 0 .4 .8 .75 0 .8 .4 .75 .4 0 .8 .75 .8 0 .4 .75 .7 .7 0 .75 .7 0 .7 .75 0 .7 .7 .75 .9 0 0 .75 0 .9 0 .75 0 0 .9 .75 .75 .75 .75 .75 .8 .4 0 .75 .4 .8 0 .75 0 .4 .8 .75 0 .8 .4 .75 .4 0 .8 .75 .8 0 .4 .75 .7 .7 0 .75 .7 0 .7 .75 0 .7 .7 .75 .9 0 0 .75 0 .9 0 .75 0 0 .9 .75 .75 .75 .75 .75 .8 .4 0 .75 .4 .8 0 .75 0 .4 .8 .75 0 .8 .4 .75 .4 0 .8 .75 .8 0 .4 .75 geomview-1.9.5/data/shaders/0000755000175000017500000000000012310165605012712 500000000000000geomview-1.9.5/data/shaders/Makefile.in0000644000175000017500000004332112310165551014702 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @AQSIS_SHADER_COMPILER_TRUE@am__append_1 = $(shader_src:.sl=.slx) @PIXIE_SHADER_COMPILER_TRUE@am__append_2 = $(shader_src:.sl=.sdr) @DELIGHT_SHADER_COMPILER_TRUE@am__append_3 = $(shader_src:.sl=.sdl) subdir = data/shaders DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs \ $(am__dist_geomshaderdata_DATA_DIST) README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__dist_geomshaderdata_DATA_DIST = hlight.slo hmatte.slo hplastic.slo \ hlight.slx hmatte.slx hplastic.slx GVblendconstant.slx \ GVblendplastic.slx GVdecalconstant.slx GVdecalplastic.slx \ GVmodulateconstant.slx GVmodulateplastic.slx \ GVreplaceconstant.slx GVreplaceplastic.slx hlight.sdr \ hmatte.sdr hplastic.sdr GVblendconstant.sdr GVblendplastic.sdr \ GVdecalconstant.sdr GVdecalplastic.sdr GVmodulateconstant.sdr \ GVmodulateplastic.sdr GVreplaceconstant.sdr \ GVreplaceplastic.sdr hlight.sdl hmatte.sdl hplastic.sdl \ GVblendconstant.sdl GVblendplastic.sdl GVdecalconstant.sdl \ GVdecalplastic.sdl GVmodulateconstant.sdl \ GVmodulateplastic.sdl GVreplaceconstant.sdl \ GVreplaceplastic.sdl am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(geomshaderdatadir)" DATA = $(dist_geomshaderdata_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ geomshaderdatadir = ${geomdatadir}/shaders # # Old pre-compiled shaders, probably BMRT(?) # dist_geomshaderdata_DATA = hlight.slo hmatte.slo hplastic.slo \ $(am__append_1) $(am__append_2) $(am__append_3) shader_src = \ hlight.sl hmatte.sl hplastic.sl \ GVblendconstant.sl GVblendplastic.sl \ GVdecalconstant.sl GVdecalplastic.sl \ GVmodulateconstant.sl GVmodulateplastic.sl \ GVreplaceconstant.sl GVreplaceplastic.sl EXTRA_DIST = $(shader_src) # hlight.slo hmatte.slo hplastic.slo all: all-am .SUFFIXES: .SUFFIXES: .sdl .sdr .sl .slx $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/shaders/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu data/shaders/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_geomshaderdataDATA: $(dist_geomshaderdata_DATA) @$(NORMAL_INSTALL) @list='$(dist_geomshaderdata_DATA)'; test -n "$(geomshaderdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(geomshaderdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(geomshaderdatadir)" || 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)$(geomshaderdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(geomshaderdatadir)" || exit $$?; \ done uninstall-dist_geomshaderdataDATA: @$(NORMAL_UNINSTALL) @list='$(dist_geomshaderdata_DATA)'; test -n "$(geomshaderdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(geomshaderdatadir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(geomshaderdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_geomshaderdataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_geomshaderdataDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ clean-local cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-dist_geomshaderdataDATA install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-dist_geomshaderdataDATA @AQSIS_SHADER_COMPILER_TRUE@.sl.slx: @AQSIS_SHADER_COMPILER_TRUE@ $(AQSIS_SHADER_COMPILER) -o $@ $< @PIXIE_SHADER_COMPILER_TRUE@.sl.sdr: @PIXIE_SHADER_COMPILER_TRUE@ $(PIXIE_SHADER_COMPILER) -o $@ $< # # SDLFLAGS = -O3 --embed-source --dso etc. # @DELIGHT_SHADER_COMPILER_TRUE@.sl.sdl: @DELIGHT_SHADER_COMPILER_TRUE@ $(DELIGHT_SHADER_COMPILER) $(SDLFLAGS) -o $@ $< clean-local: -rm -f *.slx *.sdr *.sdl # 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: geomview-1.9.5/data/shaders/Makefile.am0000644000175000017500000000163712310110173014663 00000000000000geomshaderdatadir=${geomdatadir}/shaders # # Old pre-compiled shaders, probably BMRT(?) # dist_geomshaderdata_DATA = hlight.slo hmatte.slo hplastic.slo shader_src = \ hlight.sl hmatte.sl hplastic.sl \ GVblendconstant.sl GVblendplastic.sl \ GVdecalconstant.sl GVdecalplastic.sl \ GVmodulateconstant.sl GVmodulateplastic.sl \ GVreplaceconstant.sl GVreplaceplastic.sl EXTRA_DIST = $(shader_src) # hlight.slo hmatte.slo hplastic.slo if AQSIS_SHADER_COMPILER dist_geomshaderdata_DATA += $(shader_src:.sl=.slx) .sl.slx: $(AQSIS_SHADER_COMPILER) -o $@ $< endif if PIXIE_SHADER_COMPILER dist_geomshaderdata_DATA += $(shader_src:.sl=.sdr) .sl.sdr: $(PIXIE_SHADER_COMPILER) -o $@ $< endif if DELIGHT_SHADER_COMPILER dist_geomshaderdata_DATA += $(shader_src:.sl=.sdl) # # SDLFLAGS = -O3 --embed-source --dso etc. # .sl.sdl: $(DELIGHT_SHADER_COMPILER) $(SDLFLAGS) -o $@ $< endif clean-local: -rm -f *.slx *.sdr *.sdl geomview-1.9.5/data/shaders/hlight.slo0000644000175000017500000000344412310110173014623 00000000000000shader_obj 3.1 1 0 hlight 35 5 8 20 33 0 4 4 0 4 14 4 22 eye object rgb camera 4 0.5 1 0.1 0 0 35 k1 4 5 -1 1 3 1 1 1 1 29 29 intensity 4 5 -1 2 3 1 2 2 2 28 28 lightcolor 3 5 2 3 3 1 3 3 3 3 28 from 2 5 1 4 3 1 4 4 4 4 33 $C1 4 2 -1 0 3 0 0 0 0 1 1 $C2 4 2 -1 1 3 0 0 0 0 2 23 $C3 4 2 -1 2 3 0 0 0 0 3 3 $S6 6 2 -1 3 3 0 0 0 0 4 4 $C4 4 2 -1 3 3 0 0 0 0 4 33 inpro 4 3 -1 0 2 0 0 21 21 21 26 hdis 4 3 -1 0 2 0 0 27 27 27 30 d 4 3 -1 0 2 0 0 17 17 17 20 PP 4 3 -1 0 2 0 0 9 12 9 17 QQ 4 3 -1 0 2 0 0 14 14 14 17 PQ 4 3 -1 0 2 0 0 16 16 16 21 sP 2 3 0 0 2 0 0 7 7 7 15 Cl 3 10 2 0 2 0 0 5 33 33 33 $?0 10 11 -1 0 2 0 0 6 33 6 33 $T2 4 4 -1 0 2 0 0 6 33 6 33 L 2 10 0 0 2 0 0 0 0 7 7 $T4 4 4 -1 0 2 0 0 8 32 8 32 $?1 10 11 -1 0 2 0 0 12 12 12 12 $T6 11 4 -1 0 2 0 0 11 33 11 33 $X0 9 8 -1 0 2 0 0 0 0 10 11 $X1 9 8 -1 0 2 0 0 0 0 11 12 $X2 9 8 -1 0 3 0 0 0 0 12 12 $T7 4 4 -1 0 3 0 0 13 30 13 30 $?2 10 11 -1 0 2 0 0 33 33 33 33 $X3 9 8 -1 0 2 0 0 0 0 18 19 $T19 4 4 -1 0 2 0 0 23 31 23 31 $T21 3 4 2 0 3 0 0 28 32 28 32 $T25 3 4 2 0 2 0 0 32 33 32 33 $X4 9 8 -1 0 2 0 0 0 0 19 33 $X5 9 8 -1 0 3 0 0 0 0 33 33 $X6 9 8 -1 0 2 0 0 0 0 6 33 98 0 4 1 5 2 5 5 6 3 7 8 8 8 16 8 18 17 8 34 3 15 3 19 20 15 15 12 5 20 22 23 24 25 21 22 12 8 12 8 26 3 3 13 5 26 20 15 3 14 5 20 11 12 13 22 28 32 33 27 22 11 8 20 11 9 14 20 20 9 9 29 20 5 20 29 29 20 20 9 29 10 20 30 1 2 26 0 29 26 10 20 29 31 30 20 16 16 31 _assign 2 0 _assign 2 2 _color 4 4 _pointtransform 5 8 _assign 2 13 _illuminate 5 15 _add 3 20 _dot 3 23 _subtract 3 26 _if 5 29 _lt 3 34 _assign 2 37 _dot 3 39 _subtract 3 42 _dot 3 45 _subtract 3 48 _multiply 3 51 _if 5 54 _gt 3 59 sqrt 2 62 _divide 3 64 _multiply 3 67 _subtract 3 70 abs 2 73 sqrt 2 75 _add 3 77 log 2 80 _scale 3 82 _negate 2 85 _multiply 3 87 exp 2 90 _scale 3 92 _add 3 95 geomview-1.9.5/data/shaders/hmatte.slo0000644000175000017500000000430512310110173014623 00000000000000shader_obj 3.1 1 0 hmatte 42 4 4 25 44 0 2 2 0 2 13 3 15 eye rgb shader 3 0.05 1 0 0 42 Ka 4 5 -1 1 3 1 1 1 1 38 38 Kd 4 5 -1 2 3 1 2 2 2 39 39 $C1 4 2 -1 0 3 0 0 0 0 1 1 $C2 4 2 -1 1 3 0 0 0 0 2 35 Lhw 4 3 -1 0 2 0 0 16 16 18 21 Nhw 4 3 -1 0 2 0 0 8 8 8 24 Nh 2 3 0 0 2 0 0 4 4 4 23 Lh 2 3 0 0 2 0 0 15 15 15 20 Px 2 3 0 0 2 0 0 5 5 5 43 b 4 3 -1 0 2 0 0 13 13 13 16 d 4 3 -1 0 2 0 0 29 35 29 40 N 2 10 0 0 2 0 0 0 0 3 3 $T1 2 4 0 0 2 0 0 3 15 3 15 I 2 10 0 0 2 0 0 0 0 4 4 $S6 6 2 -1 2 3 0 0 0 0 5 5 Ps 2 10 0 0 2 0 0 0 0 5 5 $C3 4 2 -1 2 3 0 0 0 0 6 43 Ci 3 10 1 0 2 0 0 6 43 43 43 $?0 10 11 -1 0 2 0 0 7 43 7 43 $T3 4 4 -1 0 2 0 0 7 43 7 43 L 2 10 0 0 2 0 0 0 0 9 15 $T5 4 4 -1 0 2 0 0 9 25 9 25 $T7 4 4 -1 0 2 0 0 11 29 11 29 $T18 4 4 -1 0 2 0 0 21 26 21 26 $T21 4 4 -1 0 2 0 0 24 29 24 29 $?1 10 11 -1 0 2 0 0 32 32 32 32 $T25 11 4 -1 0 2 0 0 31 35 31 35 $X0 9 8 -1 0 2 0 0 0 0 30 31 $X1 9 8 -1 0 2 0 0 0 0 31 32 $X2 9 8 -1 0 3 0 0 0 0 32 32 $?2 10 11 -1 0 2 0 0 35 35 35 35 $X3 9 8 -1 0 2 0 0 0 0 33 34 $X4 9 8 -1 0 2 0 0 0 0 34 35 $X5 9 8 -1 0 3 0 0 0 0 35 35 Os 3 10 -1 0 2 0 0 0 0 36 44 Cs 3 10 1 0 2 0 0 0 0 36 36 $T28 3 4 1 0 2 0 0 36 42 36 42 $T29 3 4 1 0 2 0 0 37 41 37 41 Cl 3 10 1 0 2 0 0 0 0 39 39 $T31 3 4 1 0 2 0 0 39 43 39 43 $X6 9 8 -1 0 2 0 0 0 0 7 43 Oi 3 10 -1 0 2 0 0 44 44 0 0 125 0 2 1 3 12 11 6 12 13 8 14 15 17 16 19 18 16 40 8 5 8 6 21 20 8 21 21 22 8 8 22 22 3 9 21 22 12 9 8 7 20 12 4 9 22 7 6 21 4 5 22 22 21 21 7 7 23 4 4 23 21 23 21 6 6 24 5 5 24 21 24 24 23 24 24 24 24 24 10 22 24 26 27 28 29 25 26 10 16 10 10 26 31 32 33 30 26 10 3 10 3 36 34 35 37 37 0 37 39 38 1 39 39 10 39 37 39 39 36 39 17 17 39 41 34 _assign 2 0 _assign 2 2 normalize 2 4 faceforward 3 6 transform 3 9 _assign 2 12 _illuminance 5 14 _dot 3 19 _dot 3 22 _negate 2 25 _dot 3 27 _subtract 3 30 _divide 3 33 _scale 3 36 _add 3 39 _assign 2 42 _dot 3 44 _multiply 3 47 _subtract 3 50 _dot 3 53 _multiply 3 56 _subtract 3 59 _dot 3 62 _multiply 3 65 _subtract 3 68 _multiply 3 71 abs 2 74 sqrt 2 76 _divide 3 78 _if 5 81 _lt 3 86 _negate 2 89 _if 5 91 _gt 3 96 _assign 2 99 _multiply 3 101 ambient 1 104 _scale 3 105 _scale 3 108 _scale 3 111 _add 3 114 _multiply 3 117 _add 3 120 _assign 2 123 geomview-1.9.5/data/shaders/hplastic.slo0000644000175000017500000001230512310110173015147 00000000000000shader_obj 3.1 1 0 hplastic 81 4 11 57 123 0 5 5 0 5 13 2 8 eye rgb 4 1 0.1 0 0.0001 0 81 Ka 4 5 -1 1 3 1 1 1 1 111 111 Kd 4 5 -1 2 3 1 2 2 2 112 112 Ks 4 5 -1 3 3 1 3 3 3 118 118 roughness 4 5 -1 4 3 1 4 4 4 12 12 specularcolor 3 5 1 5 3 1 5 5 5 5 116 $C1 4 2 -1 0 3 0 0 0 0 1 107 $C2 4 2 -1 1 3 0 0 0 0 4 4 Nh 2 3 0 0 2 0 0 14 14 14 92 Ih 2 3 0 0 2 0 0 20 37 20 77 M 2 3 0 0 2 0 0 66 90 66 95 Lh 2 3 0 0 2 0 0 46 57 46 86 Ihw 4 3 -1 0 2 0 0 27 38 29 79 Nhw 4 3 -1 0 2 0 0 15 15 15 93 Mw 4 3 -1 0 2 0 0 67 91 67 96 Lhw 4 3 -1 0 2 0 0 47 58 49 87 a 4 3 -1 0 2 0 0 75 75 75 78 b 4 3 -1 0 2 0 0 24 44 24 47 d 4 3 -1 0 2 0 0 62 65 62 112 ss 4 3 -1 0 2 0 0 101 107 101 119 nn 4 3 -1 0 2 0 0 19 19 19 100 mag2 4 3 -1 0 2 0 0 32 56 32 58 PdotP 4 3 -1 0 2 0 0 7 7 7 43 sP 2 3 0 0 2 0 0 6 6 7 121 total 3 3 1 0 2 0 0 39 121 115 122 spec 4 3 -1 0 3 0 0 12 12 12 119 Ps 2 10 0 0 2 0 0 0 0 6 6 $?8 10 11 -1 0 2 0 0 122 122 122 122 $T2 11 4 -1 0 2 0 0 9 122 9 122 $X22 9 8 -1 0 2 0 0 0 0 8 9 $C3 4 2 -1 2 3 0 0 0 0 10 121 Ci 3 10 1 0 2 0 0 10 122 0 0 Oi 3 10 -1 0 2 0 0 11 123 0 0 $X23 9 8 -1 0 2 0 0 0 0 9 11 N 2 10 0 0 2 0 0 0 0 13 13 $T5 2 4 0 0 2 0 0 13 77 13 77 I 2 10 0 0 2 0 0 0 0 14 20 $T8 4 4 -1 0 2 0 0 16 98 16 98 $T9 4 4 -1 0 2 0 0 17 101 17 101 $T10 4 4 -1 0 2 0 0 18 121 18 121 $?0 10 11 -1 0 2 0 0 36 36 36 36 $T23 11 4 -1 0 2 0 0 34 107 34 107 $X0 9 8 -1 0 2 0 0 0 0 33 34 $X1 9 8 -1 0 2 0 0 0 0 34 35 $X2 9 8 -1 0 2 0 0 0 0 35 36 $?1 10 11 -1 0 2 0 0 40 121 40 121 L 2 10 0 0 2 0 0 0 0 41 46 $T38 4 4 -1 0 2 0 0 50 100 50 100 $?2 10 11 -1 0 2 0 0 56 56 56 56 $X3 9 8 -1 0 2 0 0 0 0 53 54 $X4 9 8 -1 0 2 0 0 0 0 54 55 $X5 9 8 -1 0 2 0 0 0 0 55 56 $?3 10 11 -1 0 2 0 0 65 65 65 65 $X6 9 8 -1 0 2 0 0 0 0 63 64 $X7 9 8 -1 0 2 0 0 0 0 64 65 $X8 9 8 -1 0 3 0 0 0 0 65 65 $T56 4 4 -1 0 2 0 0 74 120 74 120 $?4 10 11 -1 0 2 0 0 87 87 87 87 $C4 4 2 -1 3 3 0 0 0 0 85 85 $X9 9 8 -1 0 2 0 0 0 0 80 85 $X10 9 8 -1 0 2 0 0 0 0 85 87 $X11 9 8 -1 0 3 0 0 0 0 87 87 $?5 10 11 -1 0 2 0 0 91 91 91 91 $X12 9 8 -1 0 2 0 0 0 0 88 89 $X13 9 8 -1 0 2 0 0 0 0 89 91 $X14 9 8 -1 0 3 0 0 0 0 91 91 $?6 10 11 -1 0 2 0 0 104 104 104 104 $X15 9 8 -1 0 2 0 0 0 0 102 103 $X16 9 8 -1 0 2 0 0 0 0 103 104 $X17 9 8 -1 0 3 0 0 0 0 104 104 $?7 10 11 -1 0 2 0 0 107 107 107 107 $X18 9 8 -1 0 2 0 0 0 0 105 106 $X19 9 8 -1 0 2 0 0 0 0 106 107 $X20 9 8 -1 0 3 0 0 0 0 107 107 Os 3 10 -1 0 2 0 0 0 0 108 123 Cs 3 10 1 0 2 0 0 0 0 108 108 $T83 3 4 1 0 2 0 0 108 114 108 114 Cl 3 10 1 0 2 0 0 0 0 109 117 $T84 3 4 1 0 2 0 0 109 121 109 121 $T86 3 4 1 0 2 0 0 111 120 111 120 $X21 9 8 -1 0 2 0 0 0 0 40 121 $X24 9 8 -1 0 2 0 0 0 0 11 122 352 0 5 1 5 2 5 3 6 4 5 5 5 22 25 21 22 22 27 28 32 80 26 27 21 5 30 29 31 5 24 5 3 34 33 7 34 35 12 22 7 36 7 7 37 12 12 38 36 37 19 38 8 35 38 8 22 37 38 38 21 5 16 37 38 34 16 22 8 8 34 11 16 38 8 8 37 11 11 36 38 37 38 36 20 38 40 41 42 43 39 40 20 29 20 5 20 20 5 8 20 8 11 20 11 23 29 38 44 29 79 22 37 45 22 36 37 37 21 5 16 36 37 34 16 22 10 45 34 14 16 37 10 10 36 14 14 46 37 36 37 46 20 37 40 48 49 50 47 40 20 29 20 5 20 20 5 10 20 10 14 20 14 46 10 7 37 14 12 36 46 37 17 36 19 40 52 53 54 51 40 17 5 17 5 9 8 10 13 11 14 46 8 9 37 11 13 36 46 37 46 36 37 10 9 36 14 13 55 37 36 15 46 55 34 15 10 9 8 34 55 15 14 13 11 55 40 58 59 60 56 55 9 9 46 13 13 37 55 46 55 37 40 55 57 9 10 13 14 40 62 63 64 61 40 13 29 9 9 13 13 55 9 7 46 13 12 37 55 46 55 9 9 46 13 13 36 55 46 55 36 46 55 55 46 19 18 37 55 40 66 67 68 65 40 18 29 18 18 40 70 71 72 69 40 18 5 18 5 75 73 74 77 75 76 75 78 0 75 55 1 17 75 78 55 78 77 75 23 23 78 78 73 4 77 78 76 78 77 2 55 18 24 77 78 55 23 23 77 30 23 31 73 _assign 2 0 _assign 2 2 _assign 2 4 _assign 2 6 _color 4 8 _assign 2 12 _dot 3 14 _if 5 17 _ge 3 22 _assign 2 25 _assign 2 27 _divide 3 29 normalize 2 32 faceforward 3 34 _dot 3 37 _dot 3 40 _multiply 3 43 _subtract 3 46 sqrt 2 49 _negate 2 51 _dot 3 53 _negate 2 56 _subtract 3 58 _divide 3 61 _scale 3 64 _add 3 67 _assign 2 70 _dot 3 72 _multiply 3 75 _subtract 3 78 abs 2 81 sqrt 2 83 _if 5 85 _ne 3 90 _divide 3 93 _assign 2 96 _scale 3 98 _multiply 3 101 _assign 2 104 _illuminance 5 106 _dot 3 111 _negate 2 114 _subtract 3 116 _divide 3 119 _scale 3 122 _add 3 125 _assign 2 128 _dot 3 130 _multiply 3 133 _subtract 3 136 abs 2 139 sqrt 2 141 _if 5 143 _ne 3 148 _divide 3 151 _assign 2 154 _scale 3 156 _multiply 3 159 _dot 3 162 _multiply 3 165 _subtract 3 168 _divide 3 171 _if 5 174 _gt 3 179 _assign 2 182 _subtract 3 184 _subtract 3 187 _dot 3 190 _multiply 3 193 _subtract 3 196 _negate 2 199 _dot 3 201 _multiply 3 204 _subtract 3 207 _divide 3 210 _scale 3 213 _add 3 216 _multiply 3 219 _add 3 222 _if 5 225 _dot 3 230 _multiply 3 233 _subtract 3 236 abs 2 239 _lt 3 241 _assign 2 244 _assign 2 246 _if 5 248 _lt 3 253 _negate 2 256 _negate 2 258 _dot 3 260 _multiply 3 263 _subtract 3 266 _dot 3 269 _multiply 3 272 _subtract 3 275 abs 2 278 sqrt 2 280 _multiply 3 282 _divide 3 285 _if 5 288 _lt 3 293 _negate 2 296 _if 5 298 _gt 3 303 _assign 2 306 _multiply 3 308 _multiply 3 311 ambient 1 314 _scale 3 315 _multiply 3 318 _add 3 321 _multiply 3 324 _add 3 327 _multiply 3 330 _multiply 3 333 _scale 3 336 pow 3 339 _scale 3 342 _add 3 345 _assign 2 348 _assign 2 350 geomview-1.9.5/data/shaders/hlight.slx0000644000175000017500000000325512310162276014647 00000000000000lightsource AQSIS_V 2 segment Data USES 96 param uniform float k1 param uniform float intensity param uniform color lightcolor param uniform point from varying float inpro varying float hdis varying float d varying float PP varying float QQ varying float PQ varying float PdotP varying point sP segment Init pushif 0.5 pop k1 pushif 1 pop intensity pushif 0.100000001 pushif 1 pushif 1 settc pop lightcolor pushif 0 pushif 0 pushif 0 settp pushis "current" pushis "camera" transform2 pop from segment Code pushif 0 setfc pop Cl :0 S_CLEAR pushv from illuminate S_JZ 1 RS_PUSH RS_GET pushv L pushv from addpp pop sP pushv sP pushv sP dotpp pop PdotP S_CLEAR pushif 1 pushv PdotP geff S_GET RS_PUSH RS_GET RS_JZ 2 pushv PdotP sqrt pushif 1 divff pop d pushv sP xcomp pushv d mulff pushv sP setxcomp pushv sP ycomp pushv d mulff pushv sP setycomp pushv sP zcomp pushv d mulff pushv sP setzcomp pushv sP pushv sP dotpp pop PdotP :2 RS_POP pushv PdotP pushif 1 subff pop PP S_CLEAR pushif 0 pushv PP lsff S_GET RS_PUSH RS_GET RS_JZ 3 pushif 0 pop PP :3 RS_POP pushv from pushv from dotpp pushif 1 subff pop QQ pushv from pushv sP dotpp pushif 1 subff pop PQ pushv QQ pushv PP mulff pop d S_CLEAR pushif 0 pushv d gtff S_GET RS_PUSH RS_GET RS_JZ 5 pushv d sqrt pushv PQ divff pop inpro pushif 1 pushv inpro pushv inpro mulff subff abs sqrt pushv inpro addff log pop hdis pushv hdis pushv k1 negf mulff exp setfc pushv lightcolor pushv intensity mulfc mulcc pushv Cl addcc pop Cl :5 RS_INVERSE RS_JZ 4 pushif 0 setfc pop Cl :4 RS_POP RS_POP jmp 0 :1 geomview-1.9.5/data/shaders/hmatte.slx0000644000175000017500000000254012310162276014646 00000000000000surface AQSIS_V 2 segment Data USES 461159 param uniform float Ka param uniform float Kd varying float Lhw varying float Nhw varying point Nh varying point Lh varying point Px varying float b varying float d segment Init pushif 0.0500000007 pop Ka pushif 1 pop Kd segment Code pushv I pushv N normalize faceforward pop Nh pushv P pushis "shader" transform pop Px pushif 0 setfc pop Ci pushv Px init_illuminance jz 1 :0 S_CLEAR pushv Px pushis "" illuminance S_JZ 2 RS_PUSH RS_GET pushv Nh pushv Px dotpp pop Nhw pushif 1 pushv Px pushv Px dotpp subff pushif 0 pushv Px pushv L dotpp subff negf divff pop b pushv Px pushv b mulfp pushv L addpp pop Lh pushv b pushif 0 addff pop Lhw pushv Nhw pushv Nhw mulff pushv Nh pushv Nh dotpp subff pushv Lhw pushv Lhw mulff pushv Lh pushv Lh dotpp subff mulff abs sqrt pushv Nhw pushv Lhw mulff pushv Nh pushv Lh dotpp subff divff pop d S_CLEAR pushif 0 pushv d lsff S_GET RS_PUSH RS_GET RS_JZ 3 pushv d negf pop d :3 RS_POP S_CLEAR pushif 1 pushv d gtff S_GET RS_PUSH RS_GET RS_JZ 4 pushif 1 pop d :4 RS_POP pushv d setfc pushv Kd setfc pushv Cl mulcc mulcc ambient pushv Ka mulfc addcc pushv Cs pushv Os mulcc mulcc pushv Ci addcc pop Ci RS_POP :2 advance_illuminance jnz 0 :1 pushv Os pop Oi geomview-1.9.5/data/shaders/hplastic.slx0000644000175000017500000000736512310162276015205 00000000000000surface AQSIS_V 2 segment Data USES 461159 param uniform float Ka param uniform float Kd param uniform float Ks param uniform float roughness param uniform color specularcolor varying point Nh varying point Ih varying point M varying point Lh varying float Ihw varying float Nhw varying float Mw varying float Lhw varying float a varying float b varying float d varying float ss varying float nn varying float mag2 varying float PdotP varying point sP varying color total uniform float spec segment Init pushif 1 pop Ka pushif 1 pop Kd pushif 1 pop Ks pushif 0.100000001 pop roughness pushif 1 pushif 1 pushif 1 settc pop specularcolor segment Code pushv P pop sP pushv sP pushv sP dotpp pop PdotP S_CLEAR pushif 1 pushv PdotP geff S_GET RS_PUSH RS_GET RS_JZ 1 pushif 0 setfc pop Ci pushif 1 setfc pop Oi :1 RS_INVERSE RS_JZ 0 pushv roughness pushif 1 divff pop spec pushv I pushv N normalize faceforward pop Nh pushv Nh pushv sP dotpp pop Nhw pushv Nhw pushv Nhw mulff pushv Nh pushv Nh dotpp subff sqrt pop nn pushv I negp pop Ih pushif 1 pushv PdotP subff pushif 0 pushv sP pushv Ih dotpp subff negf divff pop b pushv sP pushv b mulfp pushv Ih addpp pop Ih pushv b pushif 0 addff pop Ihw pushv Ihw pushv Ihw mulff pushv Ih pushv Ih dotpp subff abs sqrt pop mag2 S_CLEAR pushif 0 pushv mag2 neff S_GET RS_PUSH RS_GET RS_JZ 3 pushv mag2 pushif 1 divff pop mag2 :3 RS_INVERSE RS_JZ 2 pushif 1 pop mag2 :2 RS_POP pushv Ih pushv mag2 mulfp pop Ih pushv Ihw pushv mag2 mulff pop Ihw pushif 0 setfc pop total pushv sP init_illuminance jz 5 :4 S_CLEAR pushv sP pushis "" illuminance S_JZ 6 RS_PUSH RS_GET pushif 1 pushv PdotP subff pushif 0 pushv sP pushv L dotpp subff negf divff pop b pushv sP pushv b mulfp pushv L addpp pop Lh pushv b pushif 0 addff pop Lhw pushv Lhw pushv Lhw mulff pushv Lh pushv Lh dotpp subff abs sqrt pop mag2 S_CLEAR pushif 0 pushv mag2 neff S_GET RS_PUSH RS_GET RS_JZ 8 pushv mag2 pushif 1 divff pop mag2 :8 RS_INVERSE RS_JZ 7 pushif 1 pop mag2 :7 RS_POP pushv Lh pushv mag2 mulfp pop Lh pushv Lhw pushv mag2 mulff pop Lhw pushv nn pushv Nhw pushv Lhw mulff pushv Nh pushv Lh dotpp subff divff pop d S_CLEAR pushif 1 pushv d gtff S_GET RS_PUSH RS_GET RS_JZ 9 pushif 1 pop d :9 RS_POP pushv Lh pushv Ih subpp pop M pushv Lhw pushv Ihw subff pop Mw pushv Mw pushv Lhw mulff pushv M pushv Lh dotpp subff pushv Mw pushv Ihw mulff pushv M pushv Ih dotpp subff negf divff pop a pushv Lh pushv a mulfp pushv Ih addpp pop M pushv Lhw pushv a mulff pushv Ihw addff pop Mw S_CLEAR pushif 9.99999975e-05 pushv Mw pushv Mw mulff pushv M pushv M dotpp subff abs lsff S_GET RS_PUSH RS_GET RS_JZ 10 pushv Lh pop M pushv Lhw pop Mw :10 RS_POP S_CLEAR pushif 0 pushv Mw lsff S_GET RS_PUSH RS_GET RS_JZ 11 pushv M negp pop M pushv Mw negf pop Mw :11 RS_POP pushv nn pushv Mw pushv Mw mulff pushv M pushv M dotpp subff abs sqrt mulff pushv Nhw pushv Mw mulff pushv Nh pushv M dotpp subff divff pop ss S_CLEAR pushif 0 pushv ss lsff S_GET RS_PUSH RS_GET RS_JZ 12 pushv ss negf pop ss :12 RS_POP S_CLEAR pushif 1 pushv ss gtff S_GET RS_PUSH RS_GET RS_JZ 13 pushif 1 pop ss :13 RS_POP pushv d pushv Kd mulff setfc ambient pushv Ka mulfc addcc pushv Cl pushv Cs pushv Os mulcc mulcc mulcc pushv total addcc pop total pushv spec pushv ss pow setfc pushv Ks setfc pushv Cl pushv specularcolor pushv Os mulcc mulcc mulcc mulcc pushv total addcc pop total RS_POP :6 advance_illuminance jnz 4 :5 pushv total pop Ci :0 RS_POP pushv Os pop Oi geomview-1.9.5/data/shaders/GVblendconstant.slx0000644000175000017500000000241212310162276016455 00000000000000surface AQSIS_V 2 segment Data USES 442371 param uniform string texturename param uniform color bgcolor param uniform float At varying color Ct varying float Ot varying float channels segment Init pushis "" pop texturename pushif 0 setfc pop bgcolor pushif 1 pop At segment Code pushv Cs pop Ci pushv Os pop Oi S_CLEAR pushis "" pushv texturename ness pushif 1 pushis "channels" pushv texturename textureinfo channels eqff land S_GET RS_PUSH RS_GET RS_JZ 0 S_CLEAR pushif 3 pushv channels lsff S_GET RS_PUSH RS_GET RS_JZ 2 pushif 0 pushis "channel" pushif 0 pushis "width" pushv texturename pushif 4 ftexture1 setfc pop Ct pushif 1 pushis "channel" pushif 0 pushis "width" pushif 1 pushis "fill" pushv texturename pushif 6 ftexture1 pop Ot :2 RS_INVERSE RS_JZ 1 pushif 0 pushis "width" pushv texturename pushif 2 ctexture1 pop Ct pushif 3 pushis "channel" pushif 0 pushis "width" pushif 1 pushis "fill" pushv texturename pushif 6 ftexture1 pop Ot :1 RS_POP pushv bgcolor pushv Ct mulcc pushv Ci pushv Ct pushif 1 subfc mulcc addcc pop Ci pushv Ot pushv At mulff pushv At pushif 1 subff addff pop Ot pushv Ot setfc pushv Oi mulcc pop Oi :0 RS_POP pushv Oi pushv Ci mulcc pop Ci geomview-1.9.5/data/shaders/GVblendplastic.slx0000644000175000017500000000352412310162276016270 00000000000000surface AQSIS_V 2 segment Data USES 509959 param uniform float Ka param uniform float Kd param uniform float Ks param uniform float roughness param uniform color specularcolor param uniform string texturename param uniform color bgcolor param uniform float At varying normal Nf varying vector V varying color Ct varying float Ot varying float channels segment Init pushif 1 pop Ka pushif 0.5 pop Kd pushif 0.5 pop Ks pushif 0.100000001 pop roughness pushif 1 setfc pop specularcolor pushis "" pop texturename pushif 0 setfc pop bgcolor pushif 1 pop At segment Code pushv Cs pop Ci pushv Os pop Oi pushv I pushv N normalize faceforward pop Nf pushv I normalize negp pop V pushv roughness pushv V pushv Nf specular pushv Ks setfc pushv specularcolor mulcc mulcc pushv Nf diffuse pushv Kd mulfc ambient pushv Ka mulfc addcc pushv Ci mulcc addcc pop Ci S_CLEAR pushis "" pushv texturename ness pushif 1 pushis "channels" pushv texturename textureinfo channels eqff land S_GET RS_PUSH RS_GET RS_JZ 0 S_CLEAR pushif 3 pushv channels lsff S_GET RS_PUSH RS_GET RS_JZ 2 pushif 0 pushis "channel" pushif 0 pushis "width" pushv texturename pushif 4 ftexture1 setfc pop Ct pushif 1 pushis "channel" pushif 0 pushis "width" pushif 1 pushis "fill" pushv texturename pushif 6 ftexture1 pop Ot :2 RS_INVERSE RS_JZ 1 pushif 0 pushis "width" pushv texturename pushif 2 ctexture1 pop Ct pushif 3 pushis "channel" pushif 0 pushis "width" pushif 1 pushis "fill" pushv texturename pushif 6 ftexture1 pop Ot :1 RS_POP pushv bgcolor pushv Ct mulcc pushv Ci pushv Ct pushif 1 subfc mulcc addcc pop Ci pushv Ot pushv At mulff pushv At pushif 1 subff addff pop Ot pushv Ot setfc pushv Oi mulcc pop Oi :0 RS_POP pushv Oi pushv Ci mulcc pop Ci geomview-1.9.5/data/shaders/GVdecalconstant.slx0000644000175000017500000000115612310162276016445 00000000000000surface AQSIS_V 2 segment Data USES 442371 param uniform string texturename varying color Ct varying float Ot segment Init pushis "" pop texturename segment Code pushv Cs pop Ci pushv Os pop Oi S_CLEAR pushis "" pushv texturename ness S_GET RS_PUSH RS_GET RS_JZ 0 pushif 0 pushis "width" pushv texturename pushif 2 ctexture1 pop Ct pushif 3 pushis "channel" pushif 0 pushis "width" pushif 1 pushis "fill" pushv texturename pushif 6 ftexture1 pop Ot pushv Ct pushv Ot mulfc pushv Ci pushv Ot pushif 1 subff mulfc addcc pop Ci :0 RS_POP pushv Os pushv Ci mulcc pop Ci geomview-1.9.5/data/shaders/GVdecalplastic.slx0000644000175000017500000000227012310162276016251 00000000000000surface AQSIS_V 2 segment Data USES 509959 param uniform float Ka param uniform float Kd param uniform float Ks param uniform float roughness param uniform color specularcolor param uniform string texturename varying normal Nf varying vector V varying color Ct varying float Ot segment Init pushif 1 pop Ka pushif 0.5 pop Kd pushif 0.5 pop Ks pushif 0.100000001 pop roughness pushif 1 setfc pop specularcolor pushis "" pop texturename segment Code pushv Cs pop Ci pushv Os pop Oi pushv I pushv N normalize faceforward pop Nf pushv I normalize negp pop V pushv roughness pushv V pushv Nf specular pushv Ks setfc pushv specularcolor mulcc mulcc pushv Nf diffuse pushv Kd mulfc ambient pushv Ka mulfc addcc pushv Ci mulcc addcc pop Ci S_CLEAR pushis "" pushv texturename ness S_GET RS_PUSH RS_GET RS_JZ 0 pushif 0 pushis "width" pushv texturename pushif 2 ctexture1 pop Ct pushif 3 pushis "channel" pushif 0 pushis "width" pushif 1 pushis "fill" pushv texturename pushif 6 ftexture1 pop Ot pushv Ct pushv Ot mulfc pushv Ci pushv Ot pushif 1 subff mulfc addcc pop Ci :0 RS_POP pushv Os pushv Ci mulcc pop Ci geomview-1.9.5/data/shaders/GVmodulateconstant.slx0000644000175000017500000000222712310162276017207 00000000000000surface AQSIS_V 2 segment Data USES 442371 param uniform string texturename param uniform float At varying color Ct varying float Ot varying float channels segment Init pushis "" pop texturename pushif 1 pop At segment Code pushv Cs pop Ci pushv Os pop Oi S_CLEAR pushis "" pushv texturename ness pushif 1 pushis "channels" pushv texturename textureinfo channels eqff land S_GET RS_PUSH RS_GET RS_JZ 0 S_CLEAR pushif 3 pushv channels lsff S_GET RS_PUSH RS_GET RS_JZ 2 pushif 0 pushis "channel" pushif 0 pushis "width" pushv texturename pushif 4 ftexture1 setfc pop Ct pushif 1 pushis "channel" pushif 0 pushis "width" pushif 1 pushis "fill" pushv texturename pushif 6 ftexture1 pop Ot :2 RS_INVERSE RS_JZ 1 pushif 0 pushis "width" pushv texturename pushif 2 ctexture1 pop Ct pushif 3 pushis "channel" pushif 0 pushis "width" pushif 1 pushis "fill" pushv texturename pushif 6 ftexture1 pop Ot :1 RS_POP pushv Ot pushv At mulff pushv At pushif 1 subff addff pop Ot pushv Ct pushv Ci mulcc pop Ci pushv Ot setfc pushv Oi mulcc pop Oi :0 RS_POP pushv Oi pushv Ci mulcc pop Ci geomview-1.9.5/data/shaders/GVmodulateplastic.slx0000644000175000017500000000334112310162276017013 00000000000000surface AQSIS_V 2 segment Data USES 509959 param uniform float Ka param uniform float Kd param uniform float Ks param uniform float roughness param uniform color specularcolor param uniform string texturename param uniform float At varying normal Nf varying vector V varying color Ct varying float Ot varying float channels segment Init pushif 1 pop Ka pushif 0.5 pop Kd pushif 0.5 pop Ks pushif 0.100000001 pop roughness pushif 1 setfc pop specularcolor pushis "" pop texturename pushif 1 pop At segment Code pushv Cs pop Ci pushv Os pop Oi S_CLEAR pushis "" pushv texturename ness pushif 1 pushis "channels" pushv texturename textureinfo channels eqff land S_GET RS_PUSH RS_GET RS_JZ 0 S_CLEAR pushif 3 pushv channels lsff S_GET RS_PUSH RS_GET RS_JZ 2 pushif 0 pushis "channel" pushif 0 pushis "width" pushv texturename pushif 4 ftexture1 setfc pop Ct pushif 1 pushis "channel" pushif 0 pushis "width" pushif 1 pushis "fill" pushv texturename pushif 6 ftexture1 pop Ot :2 RS_INVERSE RS_JZ 1 pushif 0 pushis "width" pushv texturename pushif 2 ctexture1 pop Ct pushif 3 pushis "channel" pushif 0 pushis "width" pushif 1 pushis "fill" pushv texturename pushif 6 ftexture1 pop Ot :1 RS_POP pushv Ot pushv At mulff pushv At pushif 1 subff addff pop Ot pushv Ct pushv Ci mulcc pop Ci pushv Ot setfc pushv Oi mulcc pop Oi :0 RS_POP pushv I pushv N normalize faceforward pop Nf pushv I normalize negp pop V pushv roughness pushv V pushv Nf specular pushv Ks setfc pushv specularcolor mulcc mulcc pushv Nf diffuse pushv Kd mulfc ambient pushv Ka mulfc addcc pushv Ci mulcc addcc pop Ci pushv Oi pushv Ci mulcc pop Ci geomview-1.9.5/data/shaders/GVreplaceconstant.slx0000644000175000017500000000243512310162276017011 00000000000000surface AQSIS_V 2 segment Data USES 442371 param uniform string texturename param uniform float At varying color Ct varying float Ot varying float channels segment Init pushis "" pop texturename pushif 1 pop At segment Code S_CLEAR pushis "" pushv texturename ness pushif 1 pushis "channels" pushv texturename textureinfo channels eqff land S_GET RS_PUSH RS_GET RS_JZ 1 S_CLEAR pushif 3 pushv channels lsff S_GET RS_PUSH RS_GET RS_JZ 3 pushif 0 pushis "channel" pushif 0 pushis "width" pushv texturename pushif 4 ftexture1 setfc pop Ct S_CLEAR pushif 2 pushv channels eqff S_GET RS_PUSH RS_GET RS_JZ 4 pushif 1 pushis "channel" pushif 0 pushis "width" pushv texturename pushif 4 ftexture1 pop Ot :4 RS_POP :3 RS_INVERSE RS_JZ 2 pushif 0 pushis "width" pushv texturename pushif 2 ctexture1 pop Ct S_CLEAR pushif 4 pushv channels eqff S_GET RS_PUSH RS_GET RS_JZ 5 pushif 3 pushis "channel" pushif 0 pushis "width" pushv texturename pushif 4 ftexture1 pop Ot :5 RS_POP :2 RS_POP pushv Ot pushv At mulff pushv At pushif 1 subff addff pop Ot pushv Ot setfc pushv Ct mulcc pop Ci pushv Ot setfc pop Oi :1 RS_INVERSE RS_JZ 0 pushv Cs pop Ci pushv Os pop Oi pushv Os pushv Ci mulcc pop Ci :0 RS_POP geomview-1.9.5/data/shaders/GVreplaceplastic.slx0000644000175000017500000000360312310162276016615 00000000000000surface AQSIS_V 2 segment Data USES 509959 param uniform float Ka param uniform float Kd param uniform float Ks param uniform float roughness param uniform color specularcolor param uniform string texturename param uniform float At varying color Ct varying float Ot varying float channels varying normal b5::Nf varying vector b5::V segment Init pushif 1 pop Ka pushif 0.5 pop Kd pushif 0.5 pop Ks pushif 0.100000001 pop roughness pushif 1 setfc pop specularcolor pushis "" pop texturename pushif 1 pop At segment Code S_CLEAR pushis "" pushv texturename ness pushif 1 pushis "channels" pushv texturename textureinfo channels eqff land S_GET RS_PUSH RS_GET RS_JZ 1 S_CLEAR pushif 3 pushv channels lsff S_GET RS_PUSH RS_GET RS_JZ 3 pushif 0 pushis "channel" pushif 0 pushis "width" pushv texturename pushif 4 ftexture1 setfc pop Ct S_CLEAR pushif 2 pushv channels eqff S_GET RS_PUSH RS_GET RS_JZ 4 pushif 1 pushis "channel" pushif 0 pushis "width" pushv texturename pushif 4 ftexture1 pop Ot :4 RS_POP :3 RS_INVERSE RS_JZ 2 pushif 0 pushis "width" pushv texturename pushif 2 ctexture1 pop Ct S_CLEAR pushif 4 pushv channels eqff S_GET RS_PUSH RS_GET RS_JZ 5 pushif 3 pushis "channel" pushif 0 pushis "width" pushv texturename pushif 4 ftexture1 pop Ot :5 RS_POP :2 RS_POP pushv Ot pushv At mulff pushv At pushif 1 subff addff pop Ot pushv Ot setfc pushv Ct mulcc pop Ci pushv Ot setfc pop Oi :1 RS_INVERSE RS_JZ 0 pushv Cs pop Ci pushv Os pop Oi pushv I pushv N normalize faceforward pop b5::Nf pushv I normalize negp pop b5::V pushv roughness pushv b5::V pushv b5::Nf specular pushv Ks setfc pushv specularcolor mulcc mulcc pushv b5::Nf diffuse pushv Kd mulfc ambient pushv Ka mulfc addcc pushv Ci mulcc addcc pop Ci pushv Os pushv Ci mulcc pop Ci :0 RS_POP geomview-1.9.5/data/shaders/hlight.sdr0000644000175000017500000000664012310162276014632 00000000000000#!version 2.2.6 light #!parameters: uniform float k1 = 0.5 uniform float intensity = 1 uniform color lightcolor = [ 1 1 .1 ] uniform point from = "camera" [ 0 0 0 ] #!variables: uniform vector temporary_0 varying float inpro varying float hdis varying float d varying float PP varying float QQ varying float PQ varying float tmp varying float PdotP varying vector sP varying vector temporary_1 varying vector temporary_2 varying float temporary_3 varying float temporary_4 varying float temporary_5 uniform float temporary_6 uniform float temporary_7 varying float temporary_8 varying float temporary_9 varying float temporary_10 varying float temporary_11 varying vector temporary_12 uniform vector temporary_13 varying vector temporary_14 #!Init: vfromf temporary_0 0 0 0 pfrom from "camera" temporary_0 return #!Code: vfromf temporary_0 0 vuvector Cl temporary_0 vuvector temporary_1 from illuminate temporary_1 #!Label8 vuvector temporary_2 from addvv sP temporary_2 L dot PdotP sP sP vufloat temporary_4 1.0 fegt temporary_3 PdotP temporary_4 if temporary_3 #!Label9 vufloat temporary_4 1.0 sqrt ("f=f") temporary_5 PdotP divff d temporary_4 temporary_5 xcomp ("f=p") temporary_5 sP mulff temporary_4 d temporary_5 setxcomp ("o=Vf") sP temporary_4 ycomp ("f=p") temporary_5 sP mulff temporary_4 d temporary_5 setycomp ("o=Vf") sP temporary_4 zcomp ("f=p") temporary_5 sP mulff temporary_4 d temporary_5 setzcomp ("o=Vf") sP temporary_4 dot PdotP sP sP #!Label9: endif vufloat temporary_3 1.0 subff PP temporary_3 PdotP vufloat temporary_4 0 flt temporary_3 PP temporary_4 if temporary_3 #!Label11 vufloat PP 0 #!Label11: endif dot temporary_7 from from subff temporary_6 1.0 temporary_7 vufloat QQ temporary_6 vufloat temporary_3 1.0 vuvector temporary_2 from dot temporary_4 sP temporary_2 subff PQ temporary_3 temporary_4 mulff d PP QQ vufloat temporary_4 0 fgt temporary_3 d temporary_4 if temporary_3 #!Label14 sqrt ("f=f") temporary_4 d divff inpro PQ temporary_4 mulff temporary_10 inpro inpro vufloat temporary_11 1 subff temporary_9 temporary_10 temporary_11 abs ("f=f") temporary_8 temporary_9 sqrt ("f=f") temporary_5 temporary_8 addff temporary_4 inpro temporary_5 log ("f=f") hdis temporary_4 vfromf temporary_13 intensity mulvv temporary_0 temporary_13 lightcolor vuvector temporary_12 temporary_0 vufloat temporary_9 k1 mulff temporary_8 temporary_9 hdis negf temporary_5 temporary_8 exp ("f=f") temporary_4 temporary_5 vfromf temporary_14 temporary_4 mulvv temporary_2 temporary_12 temporary_14 addvv Cl Cl temporary_2 #!Label14: else #!Label13 vfromf temporary_0 0 vuvector Cl temporary_0 #!Label13: endif #!Label8: endilluminate return geomview-1.9.5/data/shaders/hmatte.sdr0000644000175000017500000000604712310162276014636 00000000000000#!version 2.2.6 surface #!parameters: uniform float Ka = 0.05 uniform float Kd = 1 #!variables: varying float Lhw varying float Nhw varying vector Nh varying vector Lh varying vector Px varying float b varying float d varying float nn varying vector temporary_0 uniform vector temporary_1 varying float temporary_2 varying float temporary_3 varying float temporary_4 varying float temporary_5 varying float temporary_6 varying vector temporary_7 varying float temporary_8 varying float temporary_9 varying float temporary_10 varying vector temporary_11 varying vector temporary_12 varying vector temporary_13 varying vector temporary_14 varying vector temporary_15 #!Init: return #!Code: normalize ("v=v") temporary_0 N faceforward ("v=vv") Nh temporary_0 I transform ("p=Sp") Px "shader" P vfromf temporary_1 0 vuvector Ci temporary_1 illuminance Px #!Label7 #!Label8 #!Label7: dot Nhw Px Nh dot temporary_4 L Px vufloat temporary_5 0 subff temporary_3 temporary_4 temporary_5 dot temporary_5 Px Px vufloat temporary_6 1 subff temporary_4 temporary_5 temporary_6 divff temporary_2 temporary_3 temporary_4 negf b temporary_2 vfromf temporary_7 b mulvv temporary_0 temporary_7 Px addvv Lh L temporary_0 vufloat temporary_2 0 addff Lhw temporary_2 b dot temporary_3 Lh Nh mulff temporary_4 Lhw Nhw subff temporary_2 temporary_3 temporary_4 dot temporary_8 Lh Lh mulff temporary_9 Lhw Lhw subff temporary_6 temporary_8 temporary_9 dot temporary_9 Nh Nh mulff temporary_10 Nhw Nhw subff temporary_8 temporary_9 temporary_10 mulff temporary_5 temporary_6 temporary_8 abs ("f=f") temporary_4 temporary_5 sqrt ("f=f") temporary_3 temporary_4 divff d temporary_2 temporary_3 vufloat temporary_3 0.0 flt temporary_2 d temporary_3 if temporary_2 #!Label9 negf d d #!Label9: endif vufloat temporary_3 1.0 fgt temporary_2 d temporary_3 if temporary_2 #!Label11 vufloat d 1.0 #!Label11: endif mulvv temporary_7 Os Cs vfromf temporary_1 Ka vuvector temporary_13 temporary_1 ambient ("c=") temporary_14 mulvv temporary_12 temporary_13 temporary_14 vfromf temporary_1 Kd vuvector temporary_15 temporary_1 mulvv temporary_14 Cl temporary_15 vfromf temporary_15 d mulvv temporary_13 temporary_14 temporary_15 addvv temporary_11 temporary_12 temporary_13 mulvv temporary_0 temporary_7 temporary_11 addvv Ci Ci temporary_0 #!Label8: endilluminance movevv Oi Os return geomview-1.9.5/data/shaders/hplastic.sdr0000644000175000017500000001660212310162276015161 00000000000000#!version 2.2.6 surface #!parameters: uniform float Ka = 1 uniform float Kd = 1 uniform float Ks = 1 uniform float roughness = .1 uniform color specularcolor = [ 1 1 1 ] #!variables: varying vector Nh varying vector Ih varying vector M varying vector Lh varying float Ihw varying float Nhw varying float Mw varying float Lhw varying float a varying float b varying float d varying float ss varying float nn varying float mag2 varying float PdotP varying vector sP varying vector total uniform float spec varying float temporary_0 varying float temporary_1 uniform vector temporary_2 varying vector temporary_3 varying float temporary_4 varying float temporary_5 varying float temporary_6 varying vector temporary_7 varying float temporary_8 varying float temporary_9 varying float temporary_10 varying vector temporary_11 varying vector temporary_12 varying vector temporary_13 varying vector temporary_14 #!Init: return #!Code: movevv sP P dot PdotP sP sP vufloat temporary_1 1.0 fegt temporary_0 PdotP temporary_1 if temporary_0 #!Label20 vfromf temporary_2 0 vuvector Ci temporary_2 vfromf temporary_2 1.0 vuvector Oi temporary_2 #!Label20: else #!Label19 divff spec 1.0 roughness normalize ("v=v") temporary_3 N faceforward ("v=vv") Nh temporary_3 I dot Nhw sP Nh dot temporary_4 Nh Nh mulff temporary_5 Nhw Nhw subff temporary_1 temporary_4 temporary_5 sqrt ("f=f") nn temporary_1 negv Ih I dot temporary_5 Ih sP vufloat temporary_6 0 subff temporary_4 temporary_5 temporary_6 vufloat temporary_6 1 subff temporary_5 PdotP temporary_6 divff temporary_1 temporary_4 temporary_5 negf b temporary_1 vfromf temporary_7 b mulvv temporary_3 temporary_7 sP addvv Ih Ih temporary_3 vufloat temporary_1 0 addff Ihw temporary_1 b dot temporary_5 Ih Ih mulff temporary_6 Ihw Ihw subff temporary_4 temporary_5 temporary_6 abs ("f=f") temporary_1 temporary_4 sqrt ("f=f") mag2 temporary_1 vufloat temporary_4 0.0 fneql temporary_1 mag2 temporary_4 if temporary_1 #!Label22 vufloat temporary_4 1.0 divff mag2 temporary_4 mag2 #!Label22: else #!Label21 vufloat mag2 1.0 #!Label21: endif vfromf temporary_3 mag2 mulvv Ih temporary_3 Ih mulff Ihw mag2 Ihw vfromf temporary_2 0 vuvector total temporary_2 illuminance sP #!Label23 #!Label24 #!Label23: dot temporary_5 L sP vufloat temporary_6 0 subff temporary_4 temporary_5 temporary_6 vufloat temporary_6 1 subff temporary_5 PdotP temporary_6 divff temporary_1 temporary_4 temporary_5 negf b temporary_1 vfromf temporary_7 b mulvv temporary_3 temporary_7 sP addvv Lh L temporary_3 vufloat temporary_1 0 addff Lhw temporary_1 b dot temporary_5 Lh Lh mulff temporary_6 Lhw Lhw subff temporary_4 temporary_5 temporary_6 abs ("f=f") temporary_1 temporary_4 sqrt ("f=f") mag2 temporary_1 vufloat temporary_4 0.0 fneql temporary_1 mag2 temporary_4 if temporary_1 #!Label26 vufloat temporary_4 1.0 divff mag2 temporary_4 mag2 #!Label26: else #!Label25 vufloat mag2 1.0 #!Label25: endif vfromf temporary_3 mag2 mulvv Lh temporary_3 Lh mulff Lhw mag2 Lhw dot temporary_4 Lh Nh mulff temporary_5 Lhw Nhw subff temporary_1 temporary_4 temporary_5 divff d temporary_1 nn vufloat temporary_4 1.0 fgt temporary_1 d temporary_4 if temporary_1 #!Label27 vufloat d 1.0 #!Label27: endif subvv M Ih Lh subff Mw Ihw Lhw dot temporary_5 Ih M mulff temporary_6 Ihw Mw subff temporary_4 temporary_5 temporary_6 dot temporary_6 Lh M mulff temporary_8 Lhw Mw subff temporary_5 temporary_6 temporary_8 divff temporary_1 temporary_4 temporary_5 negf a temporary_1 vfromf temporary_7 a mulvv temporary_3 temporary_7 Lh addvv M Ih temporary_3 mulff temporary_1 a Lhw addff Mw Ihw temporary_1 dot temporary_6 M M mulff temporary_8 Mw Mw subff temporary_5 temporary_6 temporary_8 abs ("f=f") temporary_4 temporary_5 vufloat temporary_5 .0001 flt temporary_1 temporary_4 temporary_5 if temporary_1 #!Label29 movevv M Lh moveff Mw Lhw #!Label29: endif vufloat temporary_4 0.0 flt temporary_1 Mw temporary_4 if temporary_1 #!Label31 negv M M negf Mw Mw #!Label31: endif dot temporary_4 M Nh mulff temporary_5 Mw Nhw subff temporary_1 temporary_4 temporary_5 dot temporary_9 M M mulff temporary_10 Mw Mw subff temporary_8 temporary_9 temporary_10 abs ("f=f") temporary_6 temporary_8 sqrt ("f=f") temporary_5 temporary_6 mulff temporary_4 temporary_5 nn divff ss temporary_1 temporary_4 vufloat temporary_4 0.0 flt temporary_1 ss temporary_4 if temporary_1 #!Label33 negf ss ss #!Label33: endif vufloat temporary_4 1.0 fgt temporary_1 ss temporary_4 if temporary_1 #!Label35 vufloat ss 1.0 #!Label35: endif mulvv temporary_11 Os Cs mulvv temporary_7 temporary_11 Cl vfromf temporary_2 Ka vuvector temporary_13 temporary_2 ambient ("c=") temporary_14 mulvv temporary_12 temporary_13 temporary_14 vufloat temporary_4 Kd mulff temporary_1 temporary_4 d vfromf temporary_13 temporary_1 addvv temporary_11 temporary_12 temporary_13 mulvv temporary_3 temporary_7 temporary_11 addvv total total temporary_3 vuvector temporary_13 specularcolor mulvv temporary_12 Os temporary_13 mulvv temporary_11 temporary_12 Cl vfromf temporary_2 Ks vuvector temporary_12 temporary_2 mulvv temporary_7 temporary_11 temporary_12 vufloat temporary_4 spec pow ("f=ff") temporary_1 ss temporary_4 vfromf temporary_11 temporary_1 mulvv temporary_3 temporary_7 temporary_11 addvv total total temporary_3 #!Label24: endilluminance movevv Ci total #!Label19: endif movevv Oi Os return geomview-1.9.5/data/shaders/GVblendconstant.sdr0000644000175000017500000000404712310162276016445 00000000000000#!version 2.2.6 surface #!parameters: uniform string texturename = "" uniform color bgcolor = 0 uniform float At = 1 #!variables: varying vector Ct varying float Ot varying float channels varying float temporary_0 varying float temporary_1 uniform float temporary_2 varying float temporary_3 varying float temporary_4 varying float temporary_5 varying vector temporary_6 varying vector temporary_7 varying vector temporary_8 uniform vector temporary_9 #!Init: return #!Code: movevv Ci Cs movevv Oi Os sneql temporary_2 texturename "" vufloat temporary_1 temporary_2 textureinfo ("f=SSF") temporary_4 texturename "channels" channels vufloat temporary_5 1.0 feql temporary_3 temporary_4 temporary_5 and temporary_0 temporary_1 temporary_3 if temporary_0 #!Label5 vufloat temporary_3 3 flt temporary_1 channels temporary_3 if temporary_1 #!Label8 texture ("f=SFffSf") temporary_3 texturename 0 s t "width" 0.0 vfromf Ct temporary_3 texture ("f=SFffSfsf") Ot texturename 1 s t "fill" 1.0 "width" 0.0 #!Label8: else #!Label7 texture ("c=SFffSf") Ct texturename 0 s t "width" 0.0 texture ("f=SFffSfsf") Ot texturename 3 s t "fill" 1.0 "width" 0.0 #!Label7: endif vfromf temporary_9 1.0 vuvector temporary_8 temporary_9 subvv temporary_7 temporary_8 Ct mulvv temporary_6 temporary_7 Ci vuvector temporary_8 bgcolor mulvv temporary_7 Ct temporary_8 addvv Ci temporary_6 temporary_7 subff temporary_2 1.0 At vufloat temporary_1 temporary_2 vufloat temporary_4 At mulff temporary_3 temporary_4 Ot addff Ot temporary_1 temporary_3 vfromf temporary_6 Ot mulvv Oi Oi temporary_6 #!Label5: endif mulvv Ci Ci Oi return geomview-1.9.5/data/shaders/GVblendplastic.sdr0000644000175000017500000000634512310162276016256 00000000000000#!version 2.2.6 surface #!parameters: uniform float Ka = 1 uniform float Kd = .5 uniform float Ks = .5 uniform float roughness = .1 uniform color specularcolor = 1 uniform string texturename = "" uniform color bgcolor = 0 uniform float At = 1 #!variables: varying vector Nf varying vector V varying vector Ct varying float Ot varying float channels varying vector temporary_0 varying vector temporary_1 varying vector temporary_2 varying vector temporary_3 uniform vector temporary_4 varying vector temporary_5 varying vector temporary_6 uniform vector temporary_7 varying float temporary_8 varying float temporary_9 uniform float temporary_10 varying float temporary_11 varying float temporary_12 varying float temporary_13 #!Init: return #!Code: movevv Ci Cs movevv Oi Os normalize ("v=v") temporary_0 N faceforward ("v=vv") Nf temporary_0 I normalize ("v=v") temporary_0 I negv V temporary_0 vfromf temporary_4 Ka vuvector temporary_3 temporary_4 ambient ("c=") temporary_5 mulvv temporary_2 temporary_3 temporary_5 vfromf temporary_4 Kd vuvector temporary_5 temporary_4 diffuse ("c=n") temporary_6 Nf mulvv temporary_3 temporary_5 temporary_6 addvv temporary_1 temporary_2 temporary_3 mulvv temporary_0 Ci temporary_1 vfromf temporary_7 Ks mulvv temporary_4 specularcolor temporary_7 vuvector temporary_2 temporary_4 vufloat temporary_8 roughness specular ("c=nvf") temporary_3 Nf V temporary_8 mulvv temporary_1 temporary_2 temporary_3 addvv Ci temporary_0 temporary_1 sneql temporary_10 texturename "" vufloat temporary_9 temporary_10 textureinfo ("f=SSF") temporary_12 texturename "channels" channels vufloat temporary_13 1.0 feql temporary_11 temporary_12 temporary_13 and temporary_8 temporary_9 temporary_11 if temporary_8 #!Label5 vufloat temporary_11 3 flt temporary_9 channels temporary_11 if temporary_9 #!Label8 texture ("f=SFffSf") temporary_11 texturename 0 s t "width" 0.0 vfromf Ct temporary_11 texture ("f=SFffSfsf") Ot texturename 1 s t "fill" 1.0 "width" 0.0 #!Label8: else #!Label7 texture ("c=SFffSf") Ct texturename 0 s t "width" 0.0 texture ("f=SFffSfsf") Ot texturename 3 s t "fill" 1.0 "width" 0.0 #!Label7: endif vfromf temporary_4 1.0 vuvector temporary_2 temporary_4 subvv temporary_1 temporary_2 Ct mulvv temporary_0 temporary_1 Ci vuvector temporary_2 bgcolor mulvv temporary_1 Ct temporary_2 addvv Ci temporary_0 temporary_1 subff temporary_10 1.0 At vufloat temporary_9 temporary_10 vufloat temporary_12 At mulff temporary_11 temporary_12 Ot addff Ot temporary_9 temporary_11 vfromf temporary_0 Ot mulvv Oi Oi temporary_0 #!Label5: endif mulvv Ci Ci Oi return geomview-1.9.5/data/shaders/GVdecalconstant.sdr0000644000175000017500000000202412310162276016422 00000000000000#!version 2.2.6 surface #!parameters: uniform string texturename = "" #!variables: varying vector Ct varying float Ot varying float temporary_0 uniform float temporary_1 varying vector temporary_2 varying vector temporary_3 varying float temporary_4 varying float temporary_5 varying vector temporary_6 #!Init: return #!Code: movevv Ci Cs movevv Oi Os sneql temporary_1 texturename "" vufloat temporary_0 temporary_1 if temporary_0 #!Label3 texture ("c=SFffSf") Ct texturename 0 s t "width" 0.0 texture ("f=SFffSfsf") Ot texturename 3 s t "fill" 1.0 "width" 0.0 vufloat temporary_5 1 subff temporary_4 temporary_5 Ot vfromf temporary_3 temporary_4 mulvv temporary_2 temporary_3 Ci vfromf temporary_6 Ot mulvv temporary_3 temporary_6 Ct addvv Ci temporary_2 temporary_3 #!Label3: endif mulvv Ci Ci Os return geomview-1.9.5/data/shaders/GVdecalplastic.sdr0000644000175000017500000000433512310162276016237 00000000000000#!version 2.2.6 surface #!parameters: uniform float Ka = 1 uniform float Kd = .5 uniform float Ks = .5 uniform float roughness = .1 uniform color specularcolor = 1 uniform string texturename = "" #!variables: varying vector Nf varying vector V varying vector Ct varying float Ot varying vector temporary_0 varying vector temporary_1 varying vector temporary_2 varying vector temporary_3 uniform vector temporary_4 varying vector temporary_5 varying vector temporary_6 uniform vector temporary_7 varying float temporary_8 uniform float temporary_9 varying float temporary_10 varying float temporary_11 #!Init: return #!Code: movevv Ci Cs movevv Oi Os normalize ("v=v") temporary_0 N faceforward ("v=vv") Nf temporary_0 I normalize ("v=v") temporary_0 I negv V temporary_0 vfromf temporary_4 Ka vuvector temporary_3 temporary_4 ambient ("c=") temporary_5 mulvv temporary_2 temporary_3 temporary_5 vfromf temporary_4 Kd vuvector temporary_5 temporary_4 diffuse ("c=n") temporary_6 Nf mulvv temporary_3 temporary_5 temporary_6 addvv temporary_1 temporary_2 temporary_3 mulvv temporary_0 Ci temporary_1 vfromf temporary_7 Ks mulvv temporary_4 specularcolor temporary_7 vuvector temporary_2 temporary_4 vufloat temporary_8 roughness specular ("c=nvf") temporary_3 Nf V temporary_8 mulvv temporary_1 temporary_2 temporary_3 addvv Ci temporary_0 temporary_1 sneql temporary_9 texturename "" vufloat temporary_8 temporary_9 if temporary_8 #!Label3 texture ("c=SFffSf") Ct texturename 0 s t "width" 0.0 texture ("f=SFffSfsf") Ot texturename 3 s t "fill" 1.0 "width" 0.0 vufloat temporary_11 1 subff temporary_10 temporary_11 Ot vfromf temporary_1 temporary_10 mulvv temporary_0 temporary_1 Ci vfromf temporary_2 Ot mulvv temporary_1 temporary_2 Ct addvv Ci temporary_0 temporary_1 #!Label3: endif mulvv Ci Ci Os return geomview-1.9.5/data/shaders/GVmodulateconstant.sdr0000644000175000017500000000324512310162276017172 00000000000000#!version 2.2.6 surface #!parameters: uniform string texturename = "" uniform float At = 1 #!variables: varying vector Ct varying float Ot varying float channels varying float temporary_0 varying float temporary_1 uniform float temporary_2 varying float temporary_3 varying float temporary_4 varying float temporary_5 varying vector temporary_6 #!Init: return #!Code: movevv Ci Cs movevv Oi Os sneql temporary_2 texturename "" vufloat temporary_1 temporary_2 textureinfo ("f=SSF") temporary_4 texturename "channels" channels vufloat temporary_5 1.0 feql temporary_3 temporary_4 temporary_5 and temporary_0 temporary_1 temporary_3 if temporary_0 #!Label5 vufloat temporary_3 3 flt temporary_1 channels temporary_3 if temporary_1 #!Label8 texture ("f=SFffSf") temporary_3 texturename 0 s t "width" 0.0 vfromf Ct temporary_3 texture ("f=SFffSfsf") Ot texturename 1 s t "fill" 1.0 "width" 0.0 #!Label8: else #!Label7 texture ("c=SFffSf") Ct texturename 0 s t "width" 0.0 texture ("f=SFffSfsf") Ot texturename 3 s t "fill" 1.0 "width" 0.0 #!Label7: endif subff temporary_2 1.0 At vufloat temporary_1 temporary_2 vufloat temporary_4 At mulff temporary_3 temporary_4 Ot addff Ot temporary_1 temporary_3 mulvv Ci Ci Ct vfromf temporary_6 Ot mulvv Oi Oi temporary_6 #!Label5: endif mulvv Ci Ci Oi return geomview-1.9.5/data/shaders/GVmodulateplastic.sdr0000644000175000017500000000566012310162276017003 00000000000000#!version 2.2.6 surface #!parameters: uniform float Ka = 1 uniform float Kd = .5 uniform float Ks = .5 uniform float roughness = .1 uniform color specularcolor = 1 uniform string texturename = "" uniform float At = 1 #!variables: varying vector Nf varying vector V varying vector Ct varying float Ot varying float channels varying float temporary_0 varying float temporary_1 uniform float temporary_2 varying float temporary_3 varying float temporary_4 varying float temporary_5 varying vector temporary_6 varying vector temporary_7 varying vector temporary_8 varying vector temporary_9 uniform vector temporary_10 varying vector temporary_11 varying vector temporary_12 uniform vector temporary_13 #!Init: return #!Code: movevv Ci Cs movevv Oi Os sneql temporary_2 texturename "" vufloat temporary_1 temporary_2 textureinfo ("f=SSF") temporary_4 texturename "channels" channels vufloat temporary_5 1.0 feql temporary_3 temporary_4 temporary_5 and temporary_0 temporary_1 temporary_3 if temporary_0 #!Label5 vufloat temporary_3 3 flt temporary_1 channels temporary_3 if temporary_1 #!Label8 texture ("f=SFffSf") temporary_3 texturename 0 s t "width" 0.0 vfromf Ct temporary_3 texture ("f=SFffSfsf") Ot texturename 1 s t "fill" 1.0 "width" 0.0 #!Label8: else #!Label7 texture ("c=SFffSf") Ct texturename 0 s t "width" 0.0 texture ("f=SFffSfsf") Ot texturename 3 s t "fill" 1.0 "width" 0.0 #!Label7: endif subff temporary_2 1.0 At vufloat temporary_1 temporary_2 vufloat temporary_4 At mulff temporary_3 temporary_4 Ot addff Ot temporary_1 temporary_3 mulvv Ci Ci Ct vfromf temporary_6 Ot mulvv Oi Oi temporary_6 #!Label5: endif normalize ("v=v") temporary_6 N faceforward ("v=vv") Nf temporary_6 I normalize ("v=v") temporary_6 I negv V temporary_6 vfromf temporary_10 Ka vuvector temporary_9 temporary_10 ambient ("c=") temporary_11 mulvv temporary_8 temporary_9 temporary_11 vfromf temporary_10 Kd vuvector temporary_11 temporary_10 diffuse ("c=n") temporary_12 Nf mulvv temporary_9 temporary_11 temporary_12 addvv temporary_7 temporary_8 temporary_9 mulvv temporary_6 Ci temporary_7 vfromf temporary_13 Ks mulvv temporary_10 specularcolor temporary_13 vuvector temporary_8 temporary_10 vufloat temporary_0 roughness specular ("c=nvf") temporary_9 Nf V temporary_0 mulvv temporary_7 temporary_8 temporary_9 addvv Ci temporary_6 temporary_7 mulvv Ci Ci Oi return geomview-1.9.5/data/shaders/GVreplaceconstant.sdr0000644000175000017500000000376112310162276016776 00000000000000#!version 2.2.6 surface #!parameters: uniform string texturename = "" uniform float At = 1 #!variables: varying vector Ct varying float Ot varying float channels varying float temporary_0 varying float temporary_1 uniform float temporary_2 varying float temporary_3 varying float temporary_4 varying float temporary_5 varying vector temporary_6 #!Init: return #!Code: sneql temporary_2 texturename "" vufloat temporary_1 temporary_2 textureinfo ("f=SSF") temporary_4 texturename "channels" channels vufloat temporary_5 1.0 feql temporary_3 temporary_4 temporary_5 and temporary_0 temporary_1 temporary_3 if temporary_0 #!Label10 vufloat temporary_3 3 flt temporary_1 channels temporary_3 if temporary_1 #!Label12 texture ("f=SFffSf") temporary_3 texturename 0 s t "width" 0.0 vfromf Ct temporary_3 vufloat temporary_4 2 feql temporary_3 channels temporary_4 if temporary_3 #!Label13 texture ("f=SFffSf") Ot texturename 1 s t "width" 0.0 #!Label13: endif #!Label12: else #!Label11 texture ("c=SFffSf") Ct texturename 0 s t "width" 0.0 vufloat temporary_4 4 feql temporary_3 channels temporary_4 if temporary_3 #!Label15 texture ("f=SFffSf") Ot texturename 3 s t "width" 0.0 #!Label15: endif #!Label11: endif subff temporary_2 1.0 At vufloat temporary_1 temporary_2 vufloat temporary_4 At mulff temporary_3 temporary_4 Ot addff Ot temporary_1 temporary_3 vfromf temporary_6 Ot mulvv Ci Ct temporary_6 vfromf Oi Ot #!Label10: else #!Label9 movevv Ci Cs movevv Oi Os mulvv Ci Ci Os #!Label9: endif return geomview-1.9.5/data/shaders/GVreplaceplastic.sdr0000644000175000017500000000645512310162276016607 00000000000000#!version 2.2.6 surface #!parameters: uniform float Ka = 1 uniform float Kd = .5 uniform float Ks = .5 uniform float roughness = .1 uniform color specularcolor = 1 uniform string texturename = "" uniform float At = 1 #!variables: varying vector Nf varying vector V varying vector Ct varying float Ot varying float channels varying float temporary_0 varying float temporary_1 uniform float temporary_2 varying float temporary_3 varying float temporary_4 varying float temporary_5 varying vector temporary_6 varying vector Nf_1 varying vector V_1 varying vector temporary_7 varying vector temporary_8 varying vector temporary_9 uniform vector temporary_10 varying vector temporary_11 varying vector temporary_12 uniform vector temporary_13 #!Init: return #!Code: sneql temporary_2 texturename "" vufloat temporary_1 temporary_2 textureinfo ("f=SSF") temporary_4 texturename "channels" channels vufloat temporary_5 1.0 feql temporary_3 temporary_4 temporary_5 and temporary_0 temporary_1 temporary_3 if temporary_0 #!Label10 vufloat temporary_3 3 flt temporary_1 channels temporary_3 if temporary_1 #!Label12 texture ("f=SFffSf") temporary_3 texturename 0 s t "width" 0.0 vfromf Ct temporary_3 vufloat temporary_4 2 feql temporary_3 channels temporary_4 if temporary_3 #!Label13 texture ("f=SFffSf") Ot texturename 1 s t "width" 0.0 #!Label13: endif #!Label12: else #!Label11 texture ("c=SFffSf") Ct texturename 0 s t "width" 0.0 vufloat temporary_4 4 feql temporary_3 channels temporary_4 if temporary_3 #!Label15 texture ("f=SFffSf") Ot texturename 3 s t "width" 0.0 #!Label15: endif #!Label11: endif subff temporary_2 1.0 At vufloat temporary_1 temporary_2 vufloat temporary_4 At mulff temporary_3 temporary_4 Ot addff Ot temporary_1 temporary_3 vfromf temporary_6 Ot mulvv Ci Ct temporary_6 vfromf Oi Ot #!Label10: else #!Label9 movevv Ci Cs movevv Oi Os normalize ("v=v") temporary_6 N faceforward ("v=vv") Nf_1 temporary_6 I normalize ("v=v") temporary_6 I negv V_1 temporary_6 vfromf temporary_10 Ka vuvector temporary_9 temporary_10 ambient ("c=") temporary_11 mulvv temporary_8 temporary_9 temporary_11 vfromf temporary_10 Kd vuvector temporary_11 temporary_10 diffuse ("c=n") temporary_12 Nf_1 mulvv temporary_9 temporary_11 temporary_12 addvv temporary_7 temporary_8 temporary_9 mulvv temporary_6 Ci temporary_7 vfromf temporary_13 Ks mulvv temporary_10 specularcolor temporary_13 vuvector temporary_8 temporary_10 vufloat temporary_1 roughness specular ("c=nvf") temporary_9 Nf_1 V_1 temporary_1 mulvv temporary_7 temporary_8 temporary_9 addvv Ci temporary_6 temporary_7 mulvv Ci Ci Os #!Label9: endif return geomview-1.9.5/data/shaders/hlight.sdl0000644000175000017500000000320312310162276014614 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 7.0.0 linux64 (Nov 29 2007) "Django" %code 6 52 3 27 4 Cl Ol L Ps 4 "k1" "" 2 1 0 0 "intensity" "" 2 1 0 0 "lightcolor" "rgb" 2 3 0 0 "from" "camera" 2 2 0 0 6 1 2 1 0 10 1 0 10 1 0 1 1 0 1 1 0 3 1 0 8 0 10 1 0 10 1 0 1 1 0 1 1 0 1 1 0 1 1 0 3 1 0 2 1 0 5 5 0 1 5.00000000e-01 1 1.00000000e+00 1 1.00000001e-01 1 0.00000000e+00 1 "camera" 3 1 4 23 3 1 5 24 5 18 6 24 24 25 9 18 8 26 26 26 20 7 8 2 0 0 0 0 0 0 273 358 18 1 24 24 24 6 0 26 359 295 14 22 7 22 22 3 2 345 9 14 364 9 230 358 360 14 36 21 7 2 58 16 21 21 69 15 16 24 362 359 17 15 14 15 345 10 15 364 10 46 358 360 15 104 17 16 50 16 24 17 194 17 21 42 19 16 17 197 21 19 195 19 21 42 17 16 19 198 21 17 196 17 21 42 19 16 17 199 21 19 58 16 21 21 362 359 358 360 14 37 16 24 16 64 15 16 26 362 359 17 15 14 15 345 10 15 364 10 8 358 360 15 1 16 26 362 359 58 11 7 7 37 12 24 11 358 360 14 1 17 12 58 19 21 7 37 18 24 19 42 16 16 17 68 15 16 26 362 359 17 15 14 15 345 10 15 364 10 60 358 360 15 104 19 16 50 16 18 19 42 19 16 16 37 17 19 24 115 17 17 104 17 17 32 16 16 17 106 16 16 362 359 43 13 5 6 62 12 4 358 360 15 42 16 12 16 103 17 16 45 20 13 17 36 0 0 20 362 359 347 15 15 14 345 10 15 364 10 8 358 360 15 6 0 26 362 359 378 14 3 2 0 22 346 14 14 345 9 14 364 9 10 358 360 14 18 0 26 26 26 362 359 %comment-3dl 6 52 0 %comment-user 6 52 0 geomview-1.9.5/data/shaders/hmatte.sdl0000644000175000017500000000245412310162276014626 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 7.0.0 linux64 (Nov 29 2007) "Django" %code 6 52 0 31 10 Ci Oi N I Ng P L Os Cs Cl 2 "Ka" "" 2 1 0 0 "Kd" "" 2 1 0 0 2 0 10 1 0 10 1 0 13 0 10 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 3 1 0 3 1 0 3 1 0 2 1 0 2 1 0 2 1 0 4 5 0 1 5.00000007e-02 1 1.00000000e+00 1 0.00000000e+00 0 3 1 10 28 3 1 11 29 0 0 0 0 203 206 24 27 2 213 25 27 24 3 358 4 24 25 359 29 26 27 5 1 358 6 0 30 359 300 12 26 27 0 0 364 12 167 358 58 15 26 25 58 16 25 25 42 17 15 15 37 20 16 17 46 21 7 8 359 358 58 16 6 26 62 18 16 58 17 26 26 37 19 17 29 50 16 18 19 43 25 16 26 36 25 6 25 58 19 25 24 42 17 16 15 37 18 19 17 58 17 25 25 42 16 16 16 37 16 17 16 42 16 16 20 115 16 16 104 16 16 50 16 18 16 64 14 16 30 359 345 13 14 364 13 8 358 360 14 62 16 16 362 359 358 68 14 16 29 359 345 13 14 364 13 8 358 360 14 1 16 29 362 359 267 22 27 358 43 22 10 22 45 23 9 11 45 23 23 16 36 22 22 23 46 22 21 22 36 0 0 22 359 302 12 26 27 0 0 364 12 2 357 -145 11 1 7 %comment-3dl 6 52 0 %comment-user 6 52 0 geomview-1.9.5/data/shaders/hplastic.sdl0000644000175000017500000000554512310162276015157 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 7.0.0 linux64 (Nov 29 2007) "Django" %code 6 52 0 46 10 Ci Oi P N I Ng L Os Cs Cl 5 "Ka" "" 2 1 0 0 "Kd" "" 2 1 0 0 "Ks" "" 2 1 0 0 "roughness" "" 2 1 0 0 "specularcolor" "rgb" 2 3 0 0 4 0 1 1 0 10 1 0 10 1 0 10 1 0 22 0 10 1 0 10 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 3 1 0 3 1 0 3 1 0 3 1 0 2 1 0 2 1 0 2 1 0 2 1 0 2 1 0 5 5 0 1 1.00000000e+00 1 1.00000001e-01 1 0.00000000e+00 1 9.99999975e-05 0 3 1 10 42 3 1 11 42 3 1 12 42 3 1 13 43 5 18 14 42 42 42 0 0 0 0 0 0 0 641 358 18 0 44 44 44 359 11 40 2 358 58 27 40 40 69 19 27 42 359 345 16 19 364 16 8 358 360 19 6 0 44 362 359 346 19 19 345 16 19 364 16 595 50 15 42 13 206 36 19 3 213 38 19 36 4 358 360 19 4 36 38 58 22 40 38 58 28 38 38 42 29 22 22 37 28 28 29 104 26 28 63 38 4 4 37 38 58 28 38 40 62 28 28 37 29 27 42 50 23 28 29 43 38 23 40 36 37 37 38 58 29 37 37 42 28 23 23 37 29 29 28 115 28 29 104 24 28 71 20 24 44 362 359 17 20 19 20 345 17 20 364 17 9 358 360 20 50 24 42 24 362 359 347 20 20 19 345 17 20 364 17 8 358 360 20 1 24 42 362 359 358 360 19 43 37 24 37 42 21 24 23 6 32 44 362 359 300 17 40 41 0 0 364 17 438 358 46 33 7 8 359 358 360 19 58 28 6 40 62 28 28 37 29 27 42 50 23 28 29 43 38 23 40 36 39 6 38 58 29 39 39 42 28 23 23 37 29 29 28 115 28 29 104 24 28 71 20 24 44 362 359 17 20 19 20 345 18 20 364 18 9 358 360 20 50 24 42 24 362 359 347 20 20 19 345 18 20 364 18 8 358 360 20 1 24 42 362 359 358 360 19 43 39 24 39 42 24 24 23 58 28 39 36 42 29 24 22 37 28 28 29 50 25 28 26 68 20 25 42 362 359 17 20 19 20 345 18 20 364 18 8 358 360 20 1 25 42 362 359 358 360 19 41 38 37 39 37 23 21 24 58 28 37 38 42 29 21 23 37 28 28 29 62 29 28 58 28 39 38 42 30 24 23 37 31 28 30 50 23 29 31 43 38 23 39 36 38 37 38 42 31 23 24 32 23 21 31 58 31 38 38 42 30 23 23 37 28 31 30 115 29 28 64 20 29 45 362 359 17 20 19 20 345 18 20 364 18 8 15 38 39 20 14 23 24 20 358 360 19 64 20 23 44 362 359 17 20 19 20 345 18 20 364 18 11 358 360 20 63 38 38 62 23 23 362 359 358 360 19 58 29 38 36 42 28 23 22 37 30 29 28 58 31 38 38 42 28 23 23 37 29 31 28 115 28 29 104 23 28 42 24 23 26 50 23 30 24 64 20 23 44 362 359 17 20 19 20 345 18 20 364 18 8 358 360 20 62 23 23 362 359 358 360 19 68 20 23 42 362 359 17 20 19 20 345 18 20 364 18 8 358 360 20 1 23 42 362 359 358 360 19 46 34 33 9 362 359 267 35 19 358 360 19 43 35 10 35 42 24 11 25 35 35 35 24 46 34 34 35 36 32 32 34 46 34 7 14 46 35 34 9 45 35 35 12 1 24 15 102 23 23 24 45 35 35 23 36 32 32 35 362 359 302 17 40 41 0 0 364 17 2 357 -432 15 0 32 19 11 1 7 %comment-3dl 6 52 0 %comment-user 6 52 0 geomview-1.9.5/data/shaders/GVblendconstant.sdl0000644000175000017500000000315712310162276016440 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 7.0.0 linux64 (Nov 29 2007) "Django" %code 6 52 0 35 8 Ci Oi Cs Os s t du dv 3 "texturename" "" 2 4 0 0 "bgcolor" "rgb" 2 3 0 0 "At" "" 2 1 0 0 4 0 10 1 0 1 1 0 1 1 0 10 1 0 12 0 10 1 0 1 1 0 1 1 0 3 1 0 3 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 8 5 0 4 "" 5 0 1 0.00000000e+00 5 1 1 1.00000000e+00 4 "channels" 1 3.00000000e+00 0 3 9 8 28 3 6 9 30 3 1 10 32 0 0 0 0 0 287 11 0 2 11 1 3 73 11 8 28 364 11 28 358 360 11 1 12 17 362 359 328 13 8 33 12 29 31 29 358 360 11 1 17 12 362 359 70 11 13 32 364 11 237 358 64 15 17 34 359 345 14 15 364 14 92 10 20 4 339 27 20 21 22 10 23 5 339 27 23 24 25 307 10 26 15 8 30 20 23 21 24 22 25 27 27 27 27 27 27 30 27 27 27 27 27 358 360 15 6 18 26 362 359 10 26 4 339 27 26 25 24 10 23 5 339 27 23 22 21 307 10 20 15 8 32 26 23 25 22 24 21 27 27 27 27 27 27 30 27 27 27 32 27 14 16 20 15 346 15 15 345 14 15 364 14 88 10 20 4 339 27 20 21 22 10 23 5 339 27 23 24 25 309 10 19 15 8 30 20 23 21 24 22 25 27 27 27 27 27 27 30 27 27 27 27 27 15 18 19 15 10 25 4 339 27 25 24 23 10 22 5 339 27 22 21 20 307 10 26 15 8 34 25 22 24 21 23 20 27 27 27 27 27 27 30 27 27 27 32 27 14 16 26 15 358 39 19 32 18 46 19 19 0 46 18 18 9 36 0 19 18 359 37 13 32 10 358 42 26 10 16 32 16 13 26 45 1 1 16 359 358 46 0 0 1 359 %comment-3dl 6 52 0 %comment-user 6 52 0 geomview-1.9.5/data/shaders/GVblendplastic.sdl0000644000175000017500000000407212310162276016243 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 7.0.0 linux64 (Nov 29 2007) "Django" %code 6 52 0 51 13 Ci Oi Cs Os N I Ng P L s t du dv 8 "Ka" "" 2 1 0 0 "Kd" "" 2 1 0 0 "Ks" "" 2 1 0 0 "roughness" "" 2 1 0 0 "specularcolor" "rgb" 2 3 0 0 "texturename" "" 2 4 0 0 "bgcolor" "rgb" 2 3 0 0 "At" "" 2 1 0 0 5 0 3 1 0 10 1 0 1 1 0 1 1 0 10 1 0 15 0 10 1 0 1 1 0 1 1 0 3 1 0 3 1 0 3 1 0 9 1 0 8 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 10 5 0 5 1 1 1.00000000e+00 1 5.00000000e-01 1 1.00000001e-01 4 "" 5 0 1 0.00000000e+00 4 "channels" 1 3.00000000e+00 0 3 1 13 43 3 1 14 44 3 1 15 44 3 1 16 45 3 6 17 43 3 9 18 46 3 6 19 48 3 1 20 43 0 0 0 0 0 0 0 0 0 0 352 11 0 2 11 1 3 206 33 41 4 213 32 41 33 5 206 33 41 5 358 63 33 33 359 267 30 41 358 43 30 13 30 359 269 31 41 32 358 43 31 14 31 36 30 30 31 46 30 0 30 359 45 21 17 15 271 31 41 32 33 16 358 46 31 21 31 36 0 30 31 359 73 22 18 46 364 22 28 358 360 22 1 23 28 362 359 328 24 18 49 23 47 42 47 358 360 22 1 28 23 362 359 70 22 24 43 364 22 237 358 64 26 28 50 359 345 25 26 364 25 92 10 34 9 339 41 34 35 36 10 37 10 339 41 37 38 39 307 10 40 26 18 48 34 37 35 38 36 39 41 41 41 41 41 41 48 41 41 41 41 41 358 360 26 6 29 40 362 359 10 40 9 339 41 40 39 38 10 37 10 339 41 37 36 35 307 10 34 26 18 43 40 37 39 36 38 35 41 41 41 41 41 41 48 41 41 41 43 41 14 27 34 26 346 26 26 345 25 26 364 25 88 10 34 9 339 41 34 35 36 10 37 10 339 41 37 38 39 309 10 31 26 18 48 34 37 35 38 36 39 41 41 41 41 41 41 48 41 41 41 41 41 15 29 31 26 10 39 9 339 41 39 38 37 10 36 10 339 41 36 35 34 307 10 40 26 18 50 39 36 38 35 37 34 41 41 41 41 41 41 48 41 41 41 43 41 14 27 40 26 358 39 31 43 29 46 31 31 0 46 30 29 19 36 0 31 30 359 37 24 43 20 358 42 40 20 27 32 27 24 40 45 1 1 27 359 358 46 0 0 1 359 %comment-3dl 6 52 0 %comment-user 6 52 0 geomview-1.9.5/data/shaders/GVdecalconstant.sdl0000644000175000017500000000177112310162276016424 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 7.0.0 linux64 (Nov 29 2007) "Django" %code 6 52 0 25 8 Ci Oi Cs Os s t du dv 1 "texturename" "" 2 4 0 0 1 0 10 1 0 10 0 1 1 0 1 1 0 3 1 0 3 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 5 5 0 4 "" 1 0.00000000e+00 1 3.00000000e+00 1 1.00000000e+00 0 3 9 8 21 0 0 0 123 11 0 2 11 1 3 73 9 8 21 364 9 104 10 14 4 339 20 14 15 16 10 17 5 339 20 17 18 19 309 10 13 20 8 22 14 17 15 18 16 19 20 20 20 20 20 20 22 20 20 20 20 20 11 12 13 10 19 4 339 20 19 18 17 10 16 5 339 20 16 15 14 307 10 11 20 8 23 19 16 18 15 17 14 20 20 20 20 20 20 22 20 20 20 24 20 10 10 11 358 37 11 24 11 43 13 11 0 43 12 10 12 36 0 13 12 359 358 46 0 0 3 359 %comment-3dl 6 52 0 %comment-user 6 52 0 geomview-1.9.5/data/shaders/GVdecalplastic.sdl0000644000175000017500000000267612310162276016237 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 7.0.0 linux64 (Nov 29 2007) "Django" %code 6 52 0 41 13 Ci Oi Cs Os N I Ng P L s t du dv 6 "Ka" "" 2 1 0 0 "Kd" "" 2 1 0 0 "Ks" "" 2 1 0 0 "roughness" "" 2 1 0 0 "specularcolor" "rgb" 2 3 0 0 "texturename" "" 2 4 0 0 2 0 3 1 0 10 1 0 13 0 1 1 0 1 1 0 3 1 0 3 1 0 3 1 0 9 1 0 8 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 7 5 0 1 1.00000000e+00 1 5.00000000e-01 1 1.00000001e-01 4 "" 1 0.00000000e+00 1 3.00000000e+00 0 3 1 13 35 3 1 14 36 3 1 15 36 3 1 16 37 3 6 17 35 3 9 18 38 0 0 0 0 0 0 0 0 188 11 0 2 11 1 3 206 27 34 4 213 26 34 27 5 206 27 34 5 358 63 27 27 359 267 23 34 358 43 23 13 23 359 269 24 34 26 358 43 24 14 24 36 23 23 24 46 23 0 23 359 45 19 17 15 271 24 34 26 27 16 358 46 25 19 24 36 0 23 25 359 73 20 18 38 364 20 104 10 28 9 339 34 28 29 30 10 31 10 339 34 31 32 33 309 10 25 34 18 39 28 31 29 32 30 33 34 34 34 34 34 34 39 34 34 34 34 34 11 23 25 10 33 9 339 34 33 32 31 10 30 10 339 34 30 29 28 307 10 22 34 18 40 33 30 32 29 31 28 34 34 34 34 34 34 39 34 34 34 35 34 10 21 22 358 37 22 35 22 43 25 22 0 43 24 21 23 36 0 25 24 359 358 46 0 0 3 359 %comment-3dl 6 52 0 %comment-user 6 52 0 geomview-1.9.5/data/shaders/GVmodulateconstant.sdl0000644000175000017500000000276212310162276017167 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 7.0.0 linux64 (Nov 29 2007) "Django" %code 6 52 0 33 8 Ci Oi Cs Os s t du dv 2 "texturename" "" 2 4 0 0 "At" "" 2 1 0 0 4 0 10 1 0 1 1 0 1 1 0 10 1 0 11 0 10 1 0 1 1 0 1 1 0 3 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 8 5 0 4 "" 5 1 1 1.00000000e+00 4 "channels" 1 3.00000000e+00 5 0 1 0.00000000e+00 0 3 9 8 26 3 1 9 28 0 0 0 0 261 11 0 2 11 1 3 73 10 8 26 364 10 28 358 360 10 1 11 16 362 359 328 12 8 29 11 31 27 31 358 360 10 1 16 11 362 359 70 10 12 28 364 10 211 358 64 14 16 30 359 345 13 14 364 13 88 10 18 4 339 25 18 19 20 10 21 5 339 25 21 22 23 307 10 24 14 8 32 18 21 19 22 20 23 25 25 25 25 25 25 32 25 25 25 25 25 358 360 14 6 17 24 362 359 10 24 4 339 25 24 23 22 10 21 5 339 25 21 20 19 307 10 15 14 8 28 24 21 23 20 22 19 25 25 25 25 25 25 32 25 25 25 28 25 346 14 14 345 13 14 364 13 80 10 19 4 339 25 19 20 21 10 22 5 339 25 22 23 24 309 10 17 14 8 32 19 22 20 23 21 24 25 25 25 25 25 25 32 25 25 25 25 25 10 24 4 339 25 24 23 22 10 21 5 339 25 21 20 19 307 10 15 14 8 30 24 21 23 20 22 19 25 25 25 25 25 25 32 25 25 25 28 25 37 12 28 9 358 42 19 9 15 32 15 12 19 46 0 0 17 45 1 1 15 359 358 46 0 0 1 359 %comment-3dl 6 52 0 %comment-user 6 52 0 geomview-1.9.5/data/shaders/GVmodulateplastic.sdl0000644000175000017500000000371212310162276016771 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 7.0.0 linux64 (Nov 29 2007) "Django" %code 6 52 0 49 13 Ci Oi Cs Os s t du dv N I Ng P L 7 "Ka" "" 2 1 0 0 "Kd" "" 2 1 0 0 "Ks" "" 2 1 0 0 "roughness" "" 2 1 0 0 "specularcolor" "rgb" 2 3 0 0 "texturename" "" 2 4 0 0 "At" "" 2 1 0 0 5 0 10 1 0 1 1 0 1 1 0 10 1 0 3 1 0 14 0 10 1 0 1 1 0 1 1 0 3 1 0 3 1 0 9 1 0 8 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 10 5 0 5 1 1 1.00000000e+00 1 5.00000000e-01 1 1.00000001e-01 4 "" 4 "channels" 1 3.00000000e+00 5 0 1 0.00000000e+00 0 3 1 13 41 3 1 14 42 3 1 15 42 3 1 16 43 3 6 17 41 3 9 18 44 3 1 19 41 0 0 0 0 0 0 0 0 0 332 11 0 2 11 1 3 73 20 18 44 364 20 28 358 360 20 1 21 27 362 359 328 22 18 45 21 47 40 47 358 360 20 1 27 21 362 359 70 20 22 41 364 20 219 358 64 25 27 46 359 345 23 25 364 23 92 10 32 4 339 39 32 33 34 10 35 5 339 39 35 36 37 307 10 38 25 18 48 32 35 33 36 34 37 39 39 39 39 39 39 48 39 39 39 39 39 358 360 25 6 28 38 362 359 10 38 4 339 39 38 37 36 10 35 5 339 39 35 34 33 307 10 32 25 18 41 38 35 37 34 36 33 39 39 39 39 39 39 48 39 39 39 41 39 14 26 32 25 346 25 25 345 23 25 364 23 84 10 32 4 339 39 32 33 34 10 35 5 339 39 35 36 37 309 10 28 25 18 48 32 35 33 36 34 37 39 39 39 39 39 39 48 39 39 39 39 39 10 37 4 339 39 37 36 35 10 34 5 339 39 34 33 32 307 10 38 25 18 46 37 34 36 33 35 32 39 39 39 39 39 39 48 39 39 39 41 39 14 26 38 25 37 22 41 19 358 42 38 19 26 32 26 22 38 46 0 0 28 45 1 1 26 359 206 31 39 8 213 30 39 31 9 206 31 39 9 358 63 31 31 359 267 28 39 358 43 28 13 28 359 269 29 39 30 358 43 29 14 29 36 28 28 29 46 28 0 28 359 45 24 17 15 271 29 39 30 31 16 358 46 29 24 29 36 0 28 29 46 0 0 1 359 %comment-3dl 6 52 0 %comment-user 6 52 0 geomview-1.9.5/data/shaders/GVreplaceconstant.sdl0000644000175000017500000000325512310162276016766 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 7.0.0 linux64 (Nov 29 2007) "Django" %code 6 52 0 37 8 Ci Oi s t du dv Cs Os 2 "texturename" "" 2 4 0 0 "At" "" 2 1 0 0 5 0 10 1 0 1 1 0 1 1 0 10 1 0 10 1 0 12 0 10 1 0 10 1 0 1 1 0 1 1 0 3 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 10 5 0 4 "" 5 1 1 1.00000000e+00 4 "channels" 1 3.00000000e+00 5 0 1 0.00000000e+00 1 2.00000000e+00 1 4.00000000e+00 0 3 9 8 28 3 1 9 30 0 0 0 0 303 73 10 8 28 364 10 28 358 360 10 1 11 18 362 359 328 12 8 31 11 33 29 33 358 360 10 1 18 11 362 359 70 10 12 30 364 10 253 358 64 15 18 32 359 345 13 15 364 13 106 10 20 2 339 27 20 21 22 10 23 3 339 27 23 24 25 307 10 26 15 8 34 20 23 21 24 22 25 27 27 27 27 27 27 34 27 27 27 27 27 358 360 15 6 19 26 70 16 18 35 362 359 17 16 15 16 345 14 16 364 14 44 10 26 2 339 27 26 25 24 10 23 3 339 27 23 22 21 307 10 20 16 8 30 26 23 25 22 24 21 27 27 27 27 27 27 34 27 27 27 27 27 14 17 20 16 346 15 15 345 13 15 364 13 103 10 20 2 339 27 20 21 22 10 23 3 339 27 23 24 25 309 10 19 15 8 34 20 23 21 24 22 25 27 27 27 27 27 27 34 27 27 27 27 27 358 360 15 70 16 18 36 362 359 17 16 15 16 345 14 16 364 14 44 10 25 2 339 27 25 24 23 10 22 3 339 27 22 21 20 307 10 26 16 8 32 25 22 24 21 23 20 27 27 27 27 27 27 34 27 27 27 27 27 14 17 26 16 37 12 30 9 358 42 26 9 17 32 17 12 26 45 0 19 17 6 1 17 359 357 12 11 0 6 11 1 7 358 46 0 0 7 359 %comment-3dl 6 52 0 %comment-user 6 52 0 geomview-1.9.5/data/shaders/GVreplaceplastic.sdl0000644000175000017500000000415412310162276016573 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 7.0.0 linux64 (Nov 29 2007) "Django" %code 6 52 0 53 13 Ci Oi s t du dv Cs Os N I Ng P L 7 "Ka" "" 2 1 0 0 "Kd" "" 2 1 0 0 "Ks" "" 2 1 0 0 "roughness" "" 2 1 0 0 "specularcolor" "rgb" 2 3 0 0 "texturename" "" 2 4 0 0 "At" "" 2 1 0 0 6 0 10 1 0 1 1 0 1 1 0 10 1 0 10 1 0 3 1 0 15 0 10 1 0 10 1 0 1 1 0 1 1 0 3 1 0 3 1 0 9 1 0 8 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 12 5 0 5 1 1 1.00000000e+00 1 5.00000000e-01 1 1.00000001e-01 4 "" 4 "channels" 1 3.00000000e+00 5 0 1 0.00000000e+00 1 2.00000000e+00 1 4.00000000e+00 0 3 1 13 43 3 1 14 44 3 1 15 44 3 1 16 45 3 6 17 43 3 9 18 46 3 1 19 43 0 0 0 0 0 0 0 0 0 366 73 20 18 46 364 20 28 358 360 20 1 21 29 362 359 328 22 18 47 21 49 42 49 358 360 20 1 29 21 362 359 70 20 22 43 364 20 253 358 64 26 29 48 359 345 23 26 364 23 106 10 34 2 339 41 34 35 36 10 37 3 339 41 37 38 39 307 10 40 26 18 50 34 37 35 38 36 39 41 41 41 41 41 41 50 41 41 41 41 41 358 360 26 6 30 40 70 27 29 51 362 359 17 27 26 27 345 24 27 364 24 44 10 40 2 339 41 40 39 38 10 37 3 339 41 37 36 35 307 10 34 27 18 43 40 37 39 36 38 35 41 41 41 41 41 41 50 41 41 41 41 41 14 28 34 27 346 26 26 345 23 26 364 23 103 10 34 2 339 41 34 35 36 10 37 3 339 41 37 38 39 309 10 30 26 18 50 34 37 35 38 36 39 41 41 41 41 41 41 50 41 41 41 41 41 358 360 26 70 27 29 52 362 359 17 27 26 27 345 24 27 364 24 44 10 39 2 339 41 39 38 37 10 36 3 339 41 36 35 34 307 10 40 27 18 48 39 36 38 35 37 34 41 41 41 41 41 41 50 41 41 41 41 41 14 28 40 27 37 22 43 19 358 42 40 19 28 32 28 22 40 45 0 30 28 6 1 28 359 357 75 11 0 6 11 1 7 206 33 41 8 213 32 41 33 9 206 33 41 9 358 63 33 33 359 267 30 41 358 43 30 13 30 359 269 31 41 32 358 43 31 14 31 36 30 30 31 46 30 0 30 359 45 25 17 15 271 31 41 32 33 16 358 46 31 25 31 36 0 30 31 46 0 0 7 359 %comment-3dl 6 52 0 %comment-user 6 52 0 geomview-1.9.5/data/shaders/README0000644000175000017500000000016412310110173013501 00000000000000The shaders in this directory are optionally used by the rib files generated by geomview when in hyperbolic space. geomview-1.9.5/data/shaders/hlight.sl0000644000175000017500000000257112310110173014444 00000000000000/* hlight.sl: shader for point lights in hyperbolic space * Author: Charlie Gunn * Description: * See hplastic.sl also. * This simulates a point light in hyperbolic space. The brightness of the light * decays exponentially since the surface area of the sphere of radius r in hyperbolic * space is exp(kr) for some constant k. Distance is given by Arccosh({p1,p1}), * where {p1,p0} is the Minkowski inner product on projective space. */ light hlight( float k1 = 0.5, intensity = 1; color lightcolor = color (1, 1, .1); point from = point "camera" (0,0,0); /* light position */ ) { float inpro, hdis, d; /* hyperbolic distance (sort of) */ float PP, QQ, PQ, tmp, PdotP; point sP; Cl = 0; illuminate(from) { sP = from + L; /* need to reconstruct the position of light */ PdotP = sP.sP; if (PdotP >= 1.0) { d = 1.0/sqrt(PdotP); setxcomp(sP, d * xcomp(sP)); setycomp(sP, d * ycomp(sP)); setzcomp(sP, d * zcomp(sP)); PdotP = sP.sP; } PP = 1.0 - PdotP; if (PP < 0 ) PP = 0; QQ = 1.0 - from.from; /* if (QQ < 0 ) QQ = 0; if the light's bad, we're doomed */ PQ = 1.0 - sP.from; /* if (PQ < 0 ) PQ = 0; ditto */ d = PP * QQ; if (d > 0) { inpro = PQ / sqrt (d); hdis = log(inpro + sqrt((abs(inpro*inpro - 1)))); Cl += intensity * lightcolor * (exp(-k1*hdis)); } else Cl = 0; } } geomview-1.9.5/data/shaders/hmatte.sl0000644000175000017500000000155212310110173014445 00000000000000surface hmatte( float Ka = 0.05, Kd = 1; ) { float Lhw,Nhw; /* w-cord of hyperbolic normal vector to P */ point Nh, Lh; /* first 3 cords of hyperbolic normal vector to P */ point Px; float b,d,nn; Nh = faceforward(normalize(N),I); Px = transform("shader",P); /* compute plane equation */ Ci = 0; illuminance(Px) { Nhw = Px.Nh; b = -(L.Px - 0)/(Px.Px - 1); Lh = L + b*Px; /* hyperbolic light vector is lin comb of L,P */ Lhw = 0 + b; d = (Lh.Nh - Lhw*Nhw)/sqrt(abs((Lh.Lh - Lhw*Lhw)*(Nh.Nh - Nhw*Nhw))); if (d < 0.0) d = -d; if (d > 1.0) { /* printf("Light:%f %f %f %f\n",xcomp(Lh),ycomp(Lh),zcomp(Lh),Lhw); printf("Normal:%f %f %f %f\n",xcomp(Nh),ycomp(Nh),zcomp(Nh),Nhw); printf("Posi:%f %f %f 1.0\n",xcomp(Px),ycomp(Px),zcomp(Px)); */ d = 1.0; } Ci += Os * Cs * (Ka*ambient() + Cl*Kd*d ); } Oi = Os; } geomview-1.9.5/data/shaders/hplastic.sl0000644000175000017500000001016512310110173014772 00000000000000/* * Copyright (c) 1990, Geometry Supercomputer Project * University of Minnesota * 1200 Washington Ave. S * Minneapolis, MN 55415 * * email address: software@geomview.org * * This software is copyrighted as noted above. It may be freely copied, * modified, and redistributed, provided that the copyright notice is * preserved on all copies. * * There is no warranty or other guarantee of fitness for this software, * it is provided solely "as is". Bug reports or fixes may be sent * to the authors, who may or may not act on them as they desire. * * You may not include this software in a program or other software product * without supplying the source, or without informing the end-user that the * source is available for no extra charge. * * If you modify this software, you should include a notice giving the * name of the person performing the modification, the date of modification, * and the reason for such modification. */ /* * hplastic.sl: a plastic shader for hyperbolic space * Author: Charlie Gunn * Description: * The parameters to this shader are the same as the parameters to the regular plastic * shader, but this shader computes angles and distances using the hyperbolic metric. * This metric is defined on homogeneous coordinates (x,y,z,w) and is induced by the * quadratic form x*x + y*y +z*z - w*w. * This metric is valid on the interior of the unit ball; the isometries of this metric * are projective transformations that preserve the unit sphere and map the interior to * itself. These are represented by 4x4 matrices hence can be implemented using the * regular geometry/viewing pipeline provided by Renderman (and other rendering systems). * Features: * It would be much easier to implement if there were more general datatypes in the * shading language. I mean if I could use 4-tuples as points instead of just 3-tuples * the code would be much more compact. As it is, I have to drag around a "w" coordinate * for each point through all the computations. Ugly. */ surface hplastic( float Ka = 1, Kd = 1, Ks = 1, roughness = .1; color specularcolor = color (1,1,1); ) { point Nh, Ih, M,Lh; float Ihw,Nhw, Mw, Lhw; float a,b,d,ss, nn, mag2,PdotP; point sP; color total; uniform float spec; sP = P; PdotP = sP.sP; /* turn it off if outside unit ball */ if (PdotP >= 1.0) { Ci = 0; Oi = 1.0; } else{ spec = 1.0/roughness; Nh = faceforward(normalize(N),I); /* make N be "tangent" to P i.e. = 0*/ Nhw = sP.Nh; nn = sqrt((Nh.Nh) - (Nhw*Nhw)); /* as a difference vector, I has w cord = 0 */ /* also, we want the L which points at the eye, not the surface */ Ih = -I; b = -((Ih.sP) - 0)/((PdotP) - 1); Ih = Ih + b*sP; /* hyperbolic eye vector is lin comb of I,P */ Ihw = 0 + b; /* normalize this light vector */ mag2 = sqrt(abs((Ih.Ih) - (Ihw*Ihw))); if (mag2 != 0.0) mag2 = 1.0/mag2; else mag2 = 1.0; Ih = mag2*Ih; Ihw = mag2*Ihw; total = 0; illuminance(sP) { /* compute specular */ /* first adjust light vector to be tangent at P */ /* L is also a difference vector, hence its w-cord = 0 */ b = -((L.sP) - 0)/((PdotP) - 1); Lh = L + b*sP; Lhw = 0 + b; /* normalize Lh */ mag2 = sqrt(abs((Lh.Lh) - (Lhw*Lhw))); if (mag2 != 0.0) mag2 = 1.0/mag2; else mag2 = 1.0; Lh = mag2*Lh; Lhw = mag2*Lhw; d = ((Lh.Nh) - (Lhw*Nhw))/nn; if (d > 1.0) /* printf("big d: %f\n",d); */ d = 1.0; /* now compute bisector of angle between L and I */ /* important for Lh, Ih to be unit length */ M = Ih - Lh; Mw = Ihw - Lhw; a = -((Ih.M) - (Ihw*Mw))/((Lh.M) - (Lhw*Mw)); M = Ih + a*Lh; Mw = Ihw + a*Lhw; /* detect very small vectors, reject them */ if (abs(M.M - Mw*Mw) < .0001) { M = Lh; Mw = Lhw; } if (Mw < 0.0) { M = -M; Mw = -Mw; } /* compute cos(angle between normal and mid-vector H) */ ss = ((M.Nh) - (Mw*Nhw))/(sqrt(abs((M.M - Mw*Mw))) * nn); if (ss < 0.0) ss = -ss; if (ss > 1.0) ss = 1.0; total = total + Os * Cs * Cl * (Ka*ambient() + Kd*d); total = total + Os * specularcolor * Cl * Ks*pow(ss,spec); } Ci = total; } Oi = Os; } geomview-1.9.5/data/shaders/GVblendconstant.sl0000644000175000017500000000406612310110173016261 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Implement Geomview's "apply = blend" for constant shading * * Maybe mgrib should set bgalpha to 0 if transparency is not enabled * (0 because this will leave the alpha channel of the surface * unaffected). * * The additional parameter At interpolates 1 and Ot; the effective * alpha contribution from the texture will be (1-At) + At * Ot. */ surface GVblendconstant(string texturename = ""; color bgcolor = 0; float At = 1;) { /* texture provided color (luminance) and alpha */ color Ct; float Ot; /* number of texture channels, * < 3: liminance and possibly alpha, > 2: rgb and possibly alpha */ float channels; Ci = Cs; Oi = Os; /* texture support a la GL_BLEND */ if (texturename != "" && textureinfo(texturename, "channels", channels) == 1.0) { if (channels < 3) { Ct = float texture(texturename[0], "width", 0.0); Ot = float texture(texturename[1], "fill", 1.0, "width", 0.0); } else { Ct = color texture(texturename, "width", 0.0); Ot = float texture(texturename[3], "fill", 1.0, "width", 0.0); } Ci = (1.0 - Ct) * Ci + Ct * bgcolor; Ot = (1.0 - At) + At * Ot; Oi *= Ot; } Ci *= Oi; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/data/shaders/GVblendplastic.sl0000644000175000017500000000526412310110173016070 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Implement Geomview's "apply = blend" for non-constant shading * * See also glTexEnvf(3). * * Note that we ignore the alpha value of the background color. This * is just what OpenGL does, as Geomview never uses GL_INTENSITY as * texture format. * * Note also that the background color is unaffected by lighting. This * means: we apply first the normal plastic shader, and then * interpolate between the shaded colour and the background color. * * If the texture has an alpha channel, then Oi = Os * Ot. * * The additional parameter At interpolates 1 and Ot; the effective * alpha contribution from the texture will be (1-At) + At * Ot. */ surface GVblendplastic(float Ka = 1, Kd = .5, Ks = .5, roughness = .1; color specularcolor = 1; string texturename = ""; color bgcolor = 0; float At = 1;) { /* variables used for lighting */ normal Nf; vector V; /* texture provided color (luminance) and alpha */ color Ct; float Ot; /* number of texture channels, * < 3: liminance and possibly alpha, > 2: rgb and possibly alpha */ float channels; /* normal plastic shader */ Ci = Cs; Oi = Os; Nf = faceforward (normalize(N),I); V = -normalize(I); Ci = Ci * (Ka*ambient() + Kd*diffuse(Nf)) + specularcolor * Ks*specular(Nf,V,roughness); /* texture support a la GL_BLEND */ if (texturename != "" && textureinfo(texturename, "channels", channels) == 1.0) { if (channels < 3) { Ct = float texture(texturename[0], "width", 0.0); Ot = float texture(texturename[1], "fill", 1.0, "width", 0.0); } else { Ct = color texture(texturename, "width", 0.0); Ot = float texture(texturename[3], "fill", 1.0, "width", 0.0); } Ci = (1.0 - Ct) * Ci + Ct * bgcolor; Ot = (1.0 - At) + At * Ot; Oi *= Ot; } Ci *= Oi; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/data/shaders/GVdecalconstant.sl0000644000175000017500000000310312310110173016234 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Implement Geomview's "apply = decal" for constant shading. This * means the alpha channel of the texture interpolates between the * texture and Cs, but Os remains unchanged. Note that the "fill == 1" * parameter automatically results in the "correct" (i.e. OpenGL) * behaviour when the texture does not carry an alpha-channel. */ surface GVdecalconstant(string texturename = "";) { /* texture provided color (luminance) and alpha */ color Ct; float Ot; Ci = Cs; Oi = Os; if (texturename != "") { Ct = color texture (texturename, "width", 0.0); Ot = float texture (texturename[3], "fill", 1.0, "width", 0.0); Ci = (1 - Ot) * Ci + Ot * Ct; } Ci *= Os; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/data/shaders/GVdecalplastic.sl0000644000175000017500000000444212310110173016051 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Implement Geomview's "apply = decal" for (non-)constant * shading. This means the alpha channel of the texture interpolates * between the texture and Cs, but Os remains unchanged. Note that the * "fill == 1" parameter automatically results in the "correct" * (i.e. OpenGL) behaviour when the texture does not carry an * alpha-channel. * * "apply = decal" interpolates between the _shaded_ surface color and * the _un_shaded texture color. The resulting alpha channel is * unaffected by the texture. */ surface GVdecalplastic(float Ka = 1, Kd = .5, Ks = .5, roughness = .1; color specularcolor = 1; string texturename = "";) { /* variables used for lighting */ normal Nf; vector V; /* texture provided color (luminance) and alpha */ color Ct; float Ot; Ci = Cs; Oi = Os; /* First compute the _shaded_ surface color */ Nf = faceforward (normalize(N),I); V = -normalize(I); Ci = Ci * (Ka*ambient() + Kd*diffuse(Nf)) + specularcolor * Ks*specular(Nf,V,roughness); /* Then interpolate with the texture color, if there is a * texture. If the texture does not have an alpha-channel, then this * shader has the same effect as the "GVreplaceplastic()" shader. */ if (texturename != "") { Ct = color texture (texturename, "width", 0.0); Ot = float texture (texturename[3], "fill", 1.0, "width", 0.0); Ci = (1 - Ot) * Ci + Ot * Ct; } Ci *= Os; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/data/shaders/GVmodulateconstant.sl0000644000175000017500000000351212310110173017002 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Implement Geomview's "apply = modulate" for constant shading. * * The additional parameter At interpolates 1 and Ot; the effective * alpha contribution from the texture will be (1-At) + At * Ot. */ surface GVmodulateconstant(string texturename = ""; float At = 1;) { /* texture provided color (luminance) and alpha */ color Ct; float Ot; /* number of texture channels, * < 3: liminance and possibly alpha, > 2: rgb and possibly alpha */ float channels; Ci = Cs; Oi = Os; if (texturename != "" && textureinfo(texturename, "channels", channels) == 1.0) { if (channels < 3) { Ct = float texture (texturename[0], "width", 0.0); Ot = texture (texturename[1], "fill", 1.0, "width", 0.0); } else { Ct = color texture (texturename, "width", 0.0); Ot = texture (texturename[3], "fill", 1.0, "width", 0.0); } Ot = (1.0 - At) + At * Ot; Ci *= Ct; Oi *= Ot; } Ci *= Oi; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/data/shaders/GVmodulateplastic.sl0000644000175000017500000000417612310110173016617 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Implement Geomview's "apply = modulate" for constant shading. * * The additional parameter At interpolates 1 and Ot; the effective * alpha contribution from the texture will be (1-At) + At * Ot. */ surface GVmodulateplastic(float Ka = 1, Kd = .5, Ks = .5, roughness = .1; color specularcolor = 1; string texturename = ""; float At = 1;) { /* variables used for lighting */ normal Nf; vector V; /* texture provided color (luminance) and alpha */ color Ct; float Ot; /* number of texture channels, * < 3: liminance and possibly alpha, > 2: rgb and possibly alpha */ float channels; Ci = Cs; Oi = Os; if (texturename != "" && textureinfo(texturename, "channels", channels) == 1.0) { if (channels < 3) { Ct = float texture (texturename[0], "width", 0.0); Ot = float texture (texturename[1], "fill", 1.0, "width", 0.0); } else { Ct = color texture (texturename, "width", 0.0); Ot = float texture (texturename[3], "fill", 1.0, "width", 0.0); } Ot = (1.0 - At) + At * Ot; Ci *= Ct; Oi *= Ot; } Nf = faceforward (normalize(N),I); V = -normalize(I); Ci = Ci * (Ka*ambient() + Kd*diffuse(Nf)) + specularcolor * Ks*specular(Nf,V,roughness); Ci *= Oi; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/data/shaders/GVreplaceconstant.sl0000644000175000017500000000413712310110173016607 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Implement Geomview's "apply = blend" for constant shading * * Maybe mgrib should set bgalpha to 0 if transparency is not enabled * (0 because this will leave the alpha channel of the surface * unaffected). * * The additional parameter At interpolates between 1 and Ot; the * effective alpha contribution from the texture will be (1-At) + At * * Ot. */ surface GVreplaceconstant(string texturename = ""; float At = 1;) { /* texture provided color (luminance) and alpha */ color Ct; float Ot; /* number of texture channels, * < 3: liminance and possibly alpha, > 2: rgb and possibly alpha */ float channels; if (texturename != "" && textureinfo(texturename, "channels", channels) == 1.0) { if (channels < 3) { Ct = float texture (texturename[0], "width", 0.0); if (channels == 2) { Ot = float texture (texturename[1], "width", 0.0); } } else { Ct = color texture (texturename, "width", 0.0); if (channels == 4) { Ot = float texture (texturename[3], "width", 0.0); } } Ot = (1.0 - At) + At * Ot; Ci = Ct * Ot; Oi = Ot; } else { /* no texture: use ordinary constant shader */ Ci = Cs; Oi = Os; Ci *= Os; } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/data/shaders/GVreplaceplastic.sl0000644000175000017500000000457012310110173016416 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Implement Geomview's "apply = replace" for (non-)constant * shading. The surface color simply is replaced by the texture color, * the result is constantly shaded. * * The additional parameter At interpolates between 1 and Ot; the * effective alpha contribution from the texture will be (1-At) + At * * Ot. */ surface GVreplaceplastic(float Ka = 1, Kd = .5, Ks = .5, roughness = .1; color specularcolor = 1; string texturename = ""; float At = 1;) { /* variables used for lighting */ normal Nf; vector V; /* texture provided color (luminance) and alpha */ color Ct; float Ot; /* number of texture channels, * < 3: liminance and possibly alpha, > 2: rgb and possibly alpha */ float channels; if (texturename != "" && textureinfo(texturename, "channels", channels) == 1.0) { if (channels < 3) { Ct = float texture (texturename[0], "width", 0.0); if (channels == 2) { Ot = float texture (texturename[1], "width", 0.0); } } else { Ct = color texture (texturename, "width", 0.0); if (channels == 4) { Ot = float texture (texturename[3], "width", 0.0); } } Ot = (1.0 - At) + At * Ot; Ci = Ct * Ot; Oi = Ot; } else { /* no texture: use ordinary plastic shader */ normal Nf; vector V; Ci = Cs; Oi = Os; Nf = faceforward (normalize(N),I); V = -normalize(I); Ci = Ci * (Ka*ambient() + Kd*diffuse(Nf)) + specularcolor * Ks*specular(Nf,V,roughness); Ci *= Os; } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.5/doc/0000755000175000017500000000000012310165605011115 500000000000000geomview-1.9.5/doc/FAQ/0000755000175000017500000000000012310165605011524 500000000000000geomview-1.9.5/doc/FAQ/FAQ-pt_BR.html0000644000175000017500000020414312310110176013742 00000000000000















No Title
FAQ Geomview

Índice

1  Questões Gerais
    1.1  O Que é Geomview?
    1.2  Como faço para ter o arquivo de instalação do Geomview?
    1.3  Qual a documentação para o Geomview que está disponível?
    1.4  Como eu posso interagir com outro usuários do Geomview?
2  Configuration/Installation/ Execution Problems
    2.1  As caixas de verificação e certos outros recursos da interface gráfica de usuário estão ou ausentes dos painéis do Geomview, ou não trabalham quando eu compilo a última versão. O que está acontecendo?
    2.2  O configure alega não poder encontrar a OpenGl no meu sistema, mas tenho certeza que ela está instalada
    2.3  O configure alega não poder encontrar a Motif (ou o Lesstif ou o OpenMotif) no meu sistema, mas tenh certeza que ele está instalado
3  Platforms
    3.1  Quais plataformas possuem binários disponíveis para download?
    3.2  Não existe um binário para minha estação de trabalho. Há esperança?
    3.3  Por que não existe uma versão para Windows?
    3.4  Tenho acesso a um X11 e a uma estação de trabalho SGI. Qual versão devo usar?
    3.5  O que ocorreu à versão NeXT Quick Renderman?
    3.6  What modules are shipped for which platforms with the current release?
4  Usando o Geomview
    4.1  Por que os objetos não aparecem nos lugares corretos?
    4.2  Por que está tudo centralizado e/ou uns por cima dos outros?
    4.3  Como posso mostrar uma coleção de pontos?
    4.4  Como posso tornar os pontos mais facilmente visíveis?
    4.5  Como posso colocar texto em uma cena?
    4.6  O Geomview faz visualização de volume?
    4.7  Pode o geomview fazer mapas de textura?
    4.8  Por que Geomview não lê meu arquivo OFF?
    4.9  Como posso colocar movimento em uma sequência de arquivos do Geomview/OOGL?
5  Saída
    5.1  Como posso criar uma animação de vídeo (MPEG/ QuickTime/animated GIF)?
    5.2  Como posso gravar uma figura de exatamente o que vejo em uma janela de câmera?
    5.3  Como posso fazer um verdadeiro arquivo PostScript que seja bom em múltiplas resoluções ao invés de apenas converter um bitmap em um PostScript?
    5.4  Por que meu instantâneo PostScript está péssimo?
    5.5  Como fazer uma imagem de alta qualidade com RenderMan?
6  Questões específicas do X
    6.1  Como posso aumentar a velocidade da versão X11?
    6.2  O que fazem os controles Z-Buffer e Dithering no painel de câmeras?
    6.3  What does "Not enough colors available. Using private colormap" mean?
    6.4  What does "Shared memory unavailable, using fallback display method" mean?
    6.5  Why do I get compiler errors about including files Xm/*.h?

1  Questões Gerais

1.1  O Que é Geomview?

Um programa visualizador de propósito geral e interativo para Unix. É usado na maioria das vezes para gráficos tridimensionais mas pode mostrar dados em 2D e 4D também. Veja a visão geral http://www.geomview.org/overview para comentários mais gerais sobre o Geomview.

1.2  Como faço para ter o arquivo de instalação do Geomview?

Geomview está disponível livremente a partir de http://www.geomview.org/download. Existem distribuições no formato binário para máquinas Linux, FreeBSD, SGI, Sun SPARC, HP-UX, IBM RS/6000, DEC Alpha, e NeXT, bem como uma distribuição na forma de código fonte.
Você pode também ter o arquivo de instalação por ftp anônimo a partir de ftp://ftp.geomview.org/pub.
Geomview é um software livre, mas gostaríamos saber das pessoas que o utilizam. Por favor envie-nos um email para register@geomview.org nos dizendo o que você está fazendo com o Geomview.

1.3  Qual a documentação para o Geomview que está disponível?

See the Documentation http://www.geomview.org/docs part of this web site.

1.4  Como eu posso interagir com outro usuários do Geomview?

Existe a lista de mensagens "geomview-users" para pessoas usando geomview que pode ser usada para comunicação entre usuários sobre problemas do geomview, quetões, experiências, etc. Os autores do geomview são também uma parte dessa lista e irão responder a questões postadas. Também usamos essa lista para fazer anúncios sobre novas versões e outras coisas do interesse dos usuários. Para usar essa lista, envie um email vazio com 'subscribe' na linha de assunto para geomview-users-request@lists.sourceforge.net, ou visite a página da lista em: http://lists.sourceforge.net/mailman/listinfo/geomview-users.
Veja também a lista de outros software e projetos: http://www.geomview.org/thirdparty.

2  Configuration/Installation/ Execution Problems

2.1  As caixas de verificação e certos outros recursos da interface gráfica de usuário estão ou ausentes dos painéis do Geomview, ou não trabalham quando eu compilo a última versão. O que está acontecendo?

Esses problemas parecem estarem associados com versões mais recentes da Lesstif (e.g. 0.91.x), pelo menos no GNU/Linux. Não sei se isso é um problema com o Lesstif propriamente dito, ou se alguma coisa está errada com o caminho que o Geomview usa Lesstif. Enquanto isso, se você experiencia esse problema, sugiro compilar Geomview com a Open Motif ao invés da Lesstif. Existe um arquivo leve de distribuição no formato binário da Open Motif 2.1.30 disponível na pagina de download do Geomview http://www.geomview.org/download, com instruções para usá-lo com o Geomview. Ou, você pode pegar a arquivo completo de distribuição da Open Motif (fonte ou binário) a partir de http://www.opengroup.org/motif ou de http://www.openmotif.com.
Se você está familiarizado com Lesstif e conhece o que pode causar ese problema (e especialmente se você sabe como consertar isso!), por favor me mand um email (mbp at geomtech.com).

2.2  O configure alega não poder encontrar a OpenGl no meu sistema, mas tenho certeza que ela está instalada

  • Garanta que você informou o argumento "-with-opengl=DIR" ao configure, onde DIR é o diretório contendo sua instalação da OpenGL. DIR deve ser o caminho absoluto para um diretório contendo subdiretórios chamados "include" e "lib". O subdiretório "include" deve por sua vez incluir um subdiretório chamado "GL" que tem o arquivo de cabeçalho "gl.h" (bem como outros arqwuivos de cabeçalho) dentro dele. O diretório "lib" deve conter os arquivos (.so) da biblioteca GL.
  • Algumas vezes 'configure' irá incorretamente reportar que a OpenGl está faltando quando de OpenGl estiver presente, mas o teste para detectar a presença da OpenGL falhou por alguma outra razão, tal como algum arquivo de cabeçalho ou biblioteca dependente faltando. Por exemplo, se sua instalação do X window está danificada ou incompleta, isso pode confundir os testes que 'configure' faz para OpenGl. Existem dois lugares para olhar para colher indícios a respeito disso:
    • A saida do 'configure' propriamente dito - olhe para as linhas relacionadas à verificação para X window, em particular. Se o X não for encontrado, ou o Geomview não puder ser linkado com suporte ao X, então esse é provavelmente o problema.
    • O arquivo 'config.log' queno 'configure' escreve enquanto é executado. Esse arquivo contém todos os detalhes terrívies sobre os testes que 'configure' está fazendo. O 'config.log' irá ter mensagens de erro que podem indicar por que certos testes falham. IMPORTANTE nota sobre a leitura do 'config.log': muitos dos testes do configure envolvem laços que tentam muitas possibilidades - por exemplo muitas localizações possíveis para um arquivo de cabeçalho. O 'configure' irá escrever um pequeno programa e tentar complá-lo uma vez para cada uma dessas localizações, até enconrar encontrar uma que trabalhe. Paa cada uma que não funcionou, irão existir mensagens de erro no arquivo 'config.log'. Quando for ler o 'config.log', garanta olhar para todos esses testes, não apenas o primeiro deles, durante a tentativa de decidor por que um teste está falhando.
  • se a saída do 'configure', ou o conteúdo do 'config.log', sugerem que alguma parte do X não pode ser encontrada (por exemplo se não puder encontrar certos cabeçalhos do X, como o "X11/X.h" ou o ."X11/Intrinsic.h"), então o problema pode ser que você não tenha instalado o pacote de desenvolvimento do X window para o seu sistema. Alguma distribuição GNU/Linux inclue o pacote com os executáveis mas não o(s) pacote(s) de desenvolvimento. Garanta ter instalado quaisquer pacotes que forem necessários para trabalho de desenvolvimento do X bem como o(s) pacote(s) com o(s) executávei(s) do X.
  • Se 'configure' reclama que não pode linkar com -lGL (ou -lGLU) mas você tem certeza que eles estão aí, encontre os diretórios contendo seus arquivos libGL.so.* e libGLU.so.*; chame esse diretório de DIR. DIR irá provavelmente conter um ou mais arquivos com nomes como libGL.so.VERSÃO e libGLU.so.VERSÃO, onde VERSÃO is some version number, such as "1.2.0" or "1.2.030200". Também deve conter entradas chamadas simplesmente libGL.so e libGLU.so, sem sfixo de VERSÃO; esses são comumente links simbólicos aos arquivos correspondentes com sufixos de versão. Por exemplo, no meu sistema tenho
                libGL.so -> libGL.so.1.2.030200
                libGLU.so -> libGLU.so.1.2.030200
    	    
    
    Se os links (ou arquivos) libGL.so e libGLU.so não estiverem presentes, crie-os fazendoos apontar para os arquivos correspondentes com o número mais alto de versão.
    Não entendo por que esses links podem não serem criados em alguma instalação da OpenGL, pelo fato de ser do meu entendimento que eles terem de estarem aí para que os programas possam usá-la propriamente. Admito todavia que não entendo todo o stuff .so e .so.VERSÃO, de forma que pode ser que esses links não sejam realmente necessários e que alguma modificação no script 'configure'do Geomview ou nos arquivos Makefiles possam eliminar a necessidade deles. Se você sabe uma forma de fazer isso, por favor me diga (mbp@geomtech.com).

2.3  O configure alega não poder encontrar a Motif (ou o Lesstif ou o OpenMotif) no meu sistema, mas tenh certeza que ele está instalado

Leia todas as sugestões acima na resposta da quetão análoga sobre a OpenGL na seção 2.2; elas todas se aplicam igualmente à Motif. (O arquivo de cabeçalho principal a procurar no diretório "include" é o "Xm/Xm.h").

3  Platforms

3.1  Quais plataformas possuem binários disponíveis para download?

SGI Irix, Linux, FreeBSD, Solaris, SunOS, HP, IBM RS/6000, DEC Alpha

3.2  Não existe um binário para minha estação de trabalho. Há esperança?

Certamente. Se sua estação de trabalho tem um X Window System, OpenGL, Motif, e um compilador ANSI (ISO) C, você pode compilar o geomview a partir da distribuição no formato de código fonte em http://www.geomview.org/download.
Note que existe uma versão livre da OpenGL chamada Mesa. (http://www.mesa3d.org) que executa em programas na maioria dos Unixes livres. Veja aquela página para detalhes sobre os contínuos esforços para incorporar suporte a hardwares para algumas das placas gráficas populares.
Note também que existe uma versão livre da Motif chamada lesstif http://www.lesstif.org/.
O arquivo INSTALL http://www.geomview.org/docs/INSTALL tem instruções sobre como portar a lesstif para novas arquiteturas. Se você tiver problemas, envie um email para software@geomview.org. Se você tiver sucesso, apreciaremos receber uma cópia do seu "makefile/mk.oquefor" e apender que modificaçòes de código fonte foram necessárias. Gostaríamos também de incluir seus binários na nossa lista de distribuições pré-compildas.

3.3  Por que não existe uma versão para Windows?

Não existe uma versão nativa do Geomview para o Microsoft Windows. A principal razão para isso é que na época que o Geomview foi escrito, cmputadores pessoais não eram rápidos o suficiente para construir gráficos tridimensionais interativos práticos de forma que focamos nossos esforços em estaçòes de trabalho Unix. Com o tempo PCs rápidos o sficiente chegaram, o Geometry Center, onde Geomview foi desenvolvido, estava em processo de fechamento. A equipe iniciou o trabalho sobre uma versão para Windows mas não teve tempo de terminá-la antes do Centro fechar.
Geomview pode executar sob Cygwin http://www.cygwin.com, que fornece ao Windows um ambiente semelhante ao Unix. Veja "Geomview para Windows?" http://www.geomview.org/windows/ para maiores informações.
Se você gostaria de ver uma versão do Geomview para Windows, você pode contrbuir para seu desenvolvimento de muitas maneiras. Veja contribuindo para o Geomview http://www.geomview.org/contributing para detalhes.

3.4  Tenho acesso a um X11 e a uma estação de trabalho SGI. Qual versão devo usar?

A versão SGI irá na maioria das vezes sempre ser significantemente mais rápida, devido ao suporte a hardware para gráficos tridimensionais. Por exemplo, Um Sun Sparcstation 10 é mais lento que um Indy (antiga entrada de SGI a nível de máquina). No futuro pode ser que exista suporte a hardware para certas placas gráficas OpenGL disponíveis para alguns PC Unixes.

3.5  O que ocorreu à versão NeXT Quick Renderman?

Não mais distribuimos a versão NeXTStep/OpenStep do Geomview, que usou a biblioteca gráfica Quick Renderman. Fizemos isso apenas para simplificar a manutensão docódigo básico após a versão 1.5.0. Binários grandes para as arquiteturas Motorola, Intel e HP-PA para a versão 1.5.0 estão ainda disponíveis em: http://www.geomview.org/download/dist/geomview-1.5.0-next.tar.

3.6  What modules are shipped for which platforms with the current release?

Liberamos a maioria de todos os módulos para todas as plataformas. A lista de módulos distribuídos está no arquivo README incluídos nas distribuições. Se o módulo que você deseja está naquela lista mas não aparece na lista de módulos no painel principal, Geomview provavelmente não está instalado de forma correta. Note que existem módulos adicionais escritos por terceiros http://www.geomview.org/thirdparty que não são parte da distribuição principal. Os módulos suportados na mais recente versão para GNU/Linux do Geomview (1.9.4) são:
MÓDULO DESCRIÇÃO
Animator percorre uma sequência de objetos
Antiprism models Cria, transforma, analisa, e visualiza poliedros
StageTools CenterStage, StageManager, StageStills, StageHand - permite criar objetos do Geomview suando fórmulas matemáticas
Clipboard grava um único objeto OOGL para uma área de transferência
Clock Mostra um relógio analógico na tela
Draw Boundary
Nose depuração/exemplo para seleção (veja o manual do Geomview)
Orrery Visualização do Sistema Solar
Os seguintes módulos usam tcl/tk:
MÓDULO DESCRIÇÃO
StageTools CenterStage, StageManager, StageStills, StageHand - permite criar objetos do Geomview suando fórmulas matemáticas
Os seguintes programas utilitários são também incluídos na distribuição 1:
UTILITÁRIO DESCRIÇÃO
anytooff convert one or many OOGL files into a single OFF file
anytoucd convert an OOGL file to UCD (AVS) format
bdy compute boundary of an object (helper for drawbdy)
bez2mesh dice BEZ file to list of MESHes
clip clip objects against plane/sphere/cylinder (helper for ginsu)
fd2ps xforms
fdesign xforms
hvectext generate vector text object
math2oogl convert Mathematica graphics to OOGL (helper for OOGL.m)
offconsol polylist vertex consolidator
oogl2rib convert OOGL to Renderman RIB format
oogl2vrml convert OOGL to VRML 1.0
oogl2vrml2
polymerge merge degenerate OFF vertices/edges/faces (to Evolver or OFF)
remotegv remotegv -help
togeomview send commands to geomview
ucdtooff convert UCD (AVS) format to OFF format
vrml2oogl convert VRML 1.0 to OOGL

4  Usando o Geomview

4.1  Por que os objetos não aparecem nos lugares corretos?

Quando objetos não aparece onde você pensa que eles deveriam estar, é provavelmente devido à normalização habilitada por padrão. Normalização simplesmente ajusta proporcionalmente um a caixa associada de um objeto para ser cotida dentro de uma esfera unitária, com o centro da caixa associada transladado para a orígem. Esse ajuste é útil quando examinamos um objeto simples, e faz você visualizar o objeto completo sem ter de se preocupar com o quanto grande esse objeto é. Todavia, isso também pode significar que se você estiver chamando múltiplos objetos que são supostamente pertencentes ao mesmo sistema de coordenadas, todos os objetos irão ser ajustados proporcionalmente e colocados na orígem. Para desabilitar a normalização, exponha o painel de aparência. Os controles da normalização estão no quadrante inferior direito do painel. Selecione a opção "None". A tecla de atalho alternativa é '0N'2.
Para desabilitar a normalização sempre, personalize o Geomview como mostrado em http://www.geomview.org/docs/html/Customization.html inserindo a linha (normalization allgeoms none) no arquivo chamado .geomview no seu diretório pessoal de usuário.
Quando você desabilitar a normalização seus objetos podem desaparece. Isso ocorre pelo fato do objeto não normalizado não cair no cone de visualizaçào da câmera. A maneira mais fácil de ver tudo é escolher o objeto mundo "World" no navegador de objetos, então clicar em olhar para "Look At" no painel de ferramentas.

4.2  Por que está tudo centralizado e/ou uns por cima dos outros?

Veja a resposta anterior.

4.3  Como posso mostrar uma coleção de pontos?

A forma mais eficiente de mostrar pontos no Geomview é usar o formato de arquivo VECT. Esse formato de arquivo é principalmente usado para contruir figuras compostas por segmentos mas podemos também usar esse formato de arquivo para especificar segmentos que possuem somente um vértice (i.e. pontos). Vamos dar uma olhada em um arquivo VECT exemplo que descreve 3 pontos coloridos em vermelho, verde e azul:
        VECT
        3 3 3      # n\'umero de linhas poligonais,
                   # n\'umero de v\'ertices,
                   # n\'umero de cores.

        1 1 1      # a poligonal n\'umero 1 tem 1 v\'ertice,
                   # a poligonal n\'umero 2 tem 1 v\'ertice,
                   # a poligonal n\'umero 3 tem 1 v\'ertice,
                   # nesse caso somente um por estarmos fazendo pontos.

        1 1 1      # a poligonal n\'umero 1 tem 1 cor
                   # a poligonal n\'umero 2 tem 1 cor
                   # a poligonal n\'umero 3 tem 1 cor

        -1 -.2 0   # As coordenadas do \'unico v\'ertice da poligonal 1.
         1 -.2 0   # As coordenadas do \'unico v\'ertice da poligonal 2.
         0  .9 0   # As coordenadas do \'unico v\'ertice da poligonal 3.

        1 0 0 1    # A cor da poligonal 1 no formato RGBA.
        0 1 0 1    # A cor da poligonal 2 no formato RGBA.
        0 0 1 1    # A cor da poligonal 3 no formato RGBA.
        
Quando chamarmos esse arquivo no Geomview, você irá provavelmente precisar desabilitar a caixa associada (via painel de aparência), caso contrário você pode não estar apto a ver os pontos.

4.4  Como posso tornar os pontos mais facilmente visíveis?

Por padrão, a espessura de linhas e pontos no Geomview é 1. Essa espessura pode estar ok para a maioria das linhas, mas faz com que cada ponto ocupe somente uma pixel na tela do computador. Você pode mudar a espessura das linhas e dos pontos adicionando um rótulo de aparência no topo de seu arquivo geométrico que se parece com isso:
appearance linewidth 4.
Nesse caso, temos aumentado nosso tamanho de linha/ponto para 4 e quaisquer pontos que tivermos em nosso arquivo irá agora aparecer como pequenos discos. Você pode também mudar a largura da linha usando o painel Appearance. O que Geomview faz atualmente é tratar cada ponto como um polígono de muitos lados que aproxima-se de um disco.
Se você deseja que os pontos como objetos sólidos tridimensionais, tais como pequenas esferas, você pode usar um método completamente diferente para representá- los: um objeto INST com múltiplas transformações. Isso permite a você especificar uma aparência geométrica arbitrária para ser usada para representar pontos. Por exemplo, o seginte arquivo representa os três pontos (1.5, 2.0, 0.1), (1.0, 0.5, 0.2), e (0.5, 0.3, 0.2) usando pequenos cubos:
        INST
        geom {
          OFF
          8 6 12              # VFA
          -0.05 -0.05 -0.05   # V0
           0.05 -0.05 -0.05   # V1
           0.05  0.05 -0.05   # V2
          -0.05  0.05 -0.05   # V3
          -0.05 -0.05  0.05   # V4
           0.05 -0.05  0.05   # V5
           0.05  0.05  0.05   # V6
          -0.05  0.05  0.05   # V7
          4 0 1 2 3           # F0
          4 4 5 6 7           # F1
          4 2 3 7 6           # F2
          4 0 1 5 4           # F3
          4 0 4 7 3           # F4
          4 1 2 6 5           # F5
        }
        transforms
        1 0 0 0  0 1 0 0  0 0 1 0  1.5 2.0 0.1 1
        1 0 0 0  0 1 0 0  0 0 1 0  1.0 0.5 0.2 1
        1 0 0 0  0 1 0 0  0 0 1 0  0.5 0.3 0.2 1
        #
        # these are the matrices:
        #
        # 1   0   0   0     1   0   0   0     1   0   0   0
        # 0   1   0   0     0   1   0   0     0   1   0   0
        # 0   0   1   0     0   0   1   0     0   0   1   0
        # 1.5 2.0 0.1 1     1.0 0.5 0.2 1     0.5 0.3 0.2 1
        
O objeto OFF entre "geom {" e "}" é o cubo. As três linhas após a palavra "transforms" are 4x4 transforms, one for each point. Note that you can use any valid OOGL expression for the geometry; for example, if you want to use small dodecahedra to represent points, you could repace the above OFF object with the following, which references the dodecahedron object in the file dodec.off (distributed with Geomview), scaling it by 0.05:
        INST
        geom {
          INST
          geom { < dodec.off }
          transform
            .05   0   0   0
              0 .05   0   0
              0   0 .05   0
              0   0   0   1
        }
        transforms
        1 0 0 0 0 1 0 0 0 0 1 0    1.5 2.0 0.1  1
        1 0 0 0 0 1 0 0 0 0 1 0    1.0 0.5 0.7  1
        1 0 0 0 0 1 0 0 0 0 1 0    0.5 0.3 0.2  1
        
Esteja ciente de que quanto mais complicada geometria você usa para seus pontos, mais tempo irá demorar o Geomview para atualizar a janela. Isso pode ser importante se você está pensando em trabalhar com um grande número de pontos, nesse caso você deve conduzir-se na direção de aparências de ponto muito simples o usar o método de mostrar pontos no formato VECT.

4.5  Como posso colocar texto em uma cena?

Você tem duas opções:
  • Você pode usar o módulo externo Labeler (rotulador-versão SGI), que fornece a você uma GUI para digitar texto e selecionar fonte: ou vetor ou uma versão poligonalizada de uma fonte instalada. Todavia, você precisa posicionar o texto em uma cena tridimensional, ou manualmente ou com algum outro módulo como o módulo Transformer (SGI).
  • Você pode usar o programa utilitário de linha de comando hvectext de fones vetoriais de Hershey, que permite a você especificar uma posição para o texto. Feito isso você deve chamar o arquivo resultante no Geomview.
Se você não precisa que o texto seja um objeto tridimensional na cena, você pode criar uma imagem http://www.geomview.org/FAQ/answers.shtml#images ou      um      arquivo postscript http://www.geomview.org/FAQ/answers.shtml#ps da   cena    e então usar um editor de imagens como o Illustrator, Showcase, ou o XPaint3 para colocar o texto.

4.6  O Geomview faz visualização de volume?

Não, Geomview é pensado para fazer visualização de superfícies. Você pode ou criar uma isosuperfície e então vê-la usando o Geomview, ou usar umpacote de visualização de volume. O toolkit vtk livre http://www.vtk.org/ de visualização tem suporte extensivo para visualização de volume, como faz também os pacotes comerciais como AVS http://www.avs.com, Iris Explorer http://www.nag.co.uk/Welcome\_IEC.html, or IBM Data Explorer . http://pic.dhe.ibm.com/infocenter/dataexpl/v8r2/index.jsp.         O Volvis http://labs.cs.sunysb.edu/labs/vislab/volvis/ é um software livre especificamente para visualização de volume.

4.7  Pode o geomview fazer mapas de textura?

Sim, no release 1.6 e mais novos, mas somente na versão OpenGL, não na versão X11.

4.8  Por que Geomview não lê meu arquivo OFF?

Isso é devido provavelmente um interpretação diferente de como um OFF deve ser escrito. Geomview indexa vértices iniciando em zero, enquanto alguns outros programas comprovadamente iniciam em um. O seguinte programa na linguagem C irá converter um arquivo OFF no formato texto puro indexado a partir da unidade em um arquivo OFF indexado a partir do zero. 4
        #include <stdio.h>
        #include <string.h>
        #include <stdlib.h>
        int main(void) {
            char s[256];
            int v, f, i, n, t;
            gets(s);
            if (strcmp(s, "OFF")) {
                fprintf(stderr, "not an OFF\n");
                exit(1);
            }
            puts(s); gets(s); puts(s);
            sscanf(s, "%d %d %d", &v, &f, &i);
            for (i=0; i!=v; ) {
                gets(s);
                if (strlen(s)) {
                    puts(s); i++;
                }
            }
            for (i=0; i!=f; i++) {
                scanf("%d", &n);
                printf("\n%d", n);
                for (v=0; v!=n; v++) {
                    scanf("%d", &t);
                    printf(" %d", t-1);
                }
            }
            printf("\n");
            return 0;
        }
        

4.9  Como posso colocar movimento em uma sequência de arquivos do Geomview/OOGL?

Você pode tentar usando o Animator, um módulo externo que é distribuído com todas as versões do Geomview. Com Animator, você pode dizer ao Geomview para ler uma sequência de arquivos OOGL e então exibir essa sequência avançando, voltando e também em passo de quadro usando interfaces semelhantes ao VCR5.
Para usar o Animator clique na entrada Animator no navegador de módulos externos do Geomview. Se o Animator não aparecer no navegador, então o Geomview provavelmente não foi instalado adequadamente. Para mais informação sobre Animator leia o painel info disponível através do programa ou a página de manual (digitando "man animate").

5  Saída

5.1  Como posso criar uma animação de vídeo (MPEG/ QuickTime/animated GIF)?

Existem muitas variantes dessa quetão:
  • primeira variante
                > Gostaria de gravar uma sequ\^encia de arquivos instant\^aneso no formato ppm de um \'unico
                > objeto no formato off enquanto esse objeto est\'a sendo rotacionado para converter a sequ\^encia
                > em um filme. O \'unico m\'etodo que conhe\c{c}o \'e rotacionar o objeto
                > lentamente com o mouse, parar omovimento, e gravar cada quadro
                > individualmente. Existe um m\'etodo mais r\'apido e autom\'atico, tal como
                > um acript de comandos. Se existe, voc\^e tem um exemplo de script de comando que possa
                > ser modificado?
    	    
    
    Duas opções:
    • Se o movimento é alinhado a algum eixo, é bastante fácil usar os comandos rotate e snapshot da GCL juntos:
      (snapshot targetcam /tmp/foo\%03d.rgb)
      (transform world world world rotate .1 0 0)
      (snapshot targetcam /tmp/foo\%03d.rgb)
      (transform world world world rotate .1 0 0)
      
      
      e assim por diante. O comando snapshot auto-incrementa o nome do arquivo.
    • Mas para um movimento mais complexo que a simples rotação em torno do eixo x que mostrei acima, considere usar StageTools, que é um conjunto de ferramentas pensado para ajudar pessoas a fazerem facilmente animações a partir do Geomview. StageTools está incluído como um módulo nas versões recentes, mas se você precisar copiá-lo ele está disponível em http://www.geom.umn.edu/software/StageTools/.
  • segunda variante
                > Tenho usado Geomview para ver filmes com ferramentas de anima\c{c}\~ao. como posso
                > converter aquele filme para ooutro formato de anima\c{c}\~ao (e.g. um GIF
                > animado) de forma que possa coloc\'a-lo em uma web page, vis\'ivel para
                > algu\'em sem Geomview?
    	    
    
    É verdade que StageTools irá fazer isso e muito mais também. Mas existe também um caminho muito fácil de fazer isso diretamente dentro do módulo Animator: a função Command irá executar um comando GCL após cada quadro. Então para pegar automaticamente instantâneos a cada quadro, você deverá pressionar o botão Command e digitar alguma coisa como
    (snapshot c0 /tmp/foo\%03d.rgb)
    
    
    no campo de texto. Então quando você pressionar play você irá ver que agora agitação uma vez que o Animator éstá gravando uma imagem offf para o disco de cada vez. Você pode desejar habilitar o botão de rádio "Once" de forma que o Animator pare após executar cada quadro uma única vez. Então você pode usar seu programa escolhido para criar um gif animado ou filme do quicktime a partir desso pacote de arquivos de imagem. Por exemplo, nos SGIs você pode fazer isso com o "mediaconvert".6

5.2  Como posso gravar uma figura de exatamente o que vejo em uma janela de câmera?

Garanta que a janela de câmera que você deseja seja a janela ativa no momento da foto, então selecione o item "Save" do menu "File" no painel principal (ou use a tecla de atalho " > "). No painel que aparece, existe uma caixa de eopção que é ajustada para Command por padrão. Selecione uma das opções de instantâneo, insira o nome do arquivo na entrada Selection, e clique "OK".
Na versão SGI, você tem três escolhas de instantâneo de imagem: SGI screen, PPM screen, e PPM software. Ambas as opções screen literalmente gravam os os pixels de tela em um arquivo, ou no formato SGI (também chamado RGB) ou em formato PPM. A opção PPM software irá reler a imagem em um espaço temporário de armazenagem fora da tela usando o software de releitura a partir da versão X vanilla do Geomview. Dessa forma, pode não ser idêntica pixel a pixel a imagem gravada em relação à imagem que você vê.
Na versão X11, você tem somente as opções PPM.

5.3  Como posso fazer um verdadeiro arquivo PostScript que seja bom em múltiplas resoluções ao invés de apenas converter um bitmap em um PostScript?

Garanta que a janela de câmera que você deseja seja a janela ativa no momento da foto, então selecione o item "Save" do menu "File" no painel principal (ou use a tecla de atalho " > "). No painel que aparece, existe uma caixa de eopção que é ajustada para Command por padrão. Selecione a opção PostScript snapshot, insira o nome de arquivo na entrada Selection, e clique "OK".
Esse método tem vantagens e desvantagens, comparado ao método de gravar um bitmap de imagem. A vantagem é que o resultado é independente da resolução - você pode imprimir em uma impressora de alta resolução e não ver qualquer aresta quadriculada. As desvantagens são que nosso releitor PostScript não pode fazer sombreamento suave e usa o algorítmo de painter para remoção de superfícies escondidas. Essa última observação significa que objetos que se interseptam e algumas outras cenas de condicionamento hostíl irão ser desenhadas incorretamente, ou mesmo que objetos próximos irão ser desenhados atrás de objetos distantes. Muitas vezes funciona, mas não sempre.

5.4  Por que meu instantâneo PostScript está péssimo?

Veja a resposta anterior.

5.5  Como fazer uma imagem de alta qualidade com RenderMan?

Se você tem o Photorealistic Renderman (um prodto comercial da Pixar), ou o BMRT (Blue Moon Rendering Toolkit, uma implementação de domínio público), você pode criar imagens de alta qualidade com transparência e iluminação mais precisa nas versões SGI e X11. Paa fazer isso, traga o painel Save e selecione "RMan [->tiff]" a partir das opções de gravar. Insira um nome de arquivo e clique "Ok". Aparecerá um janela de shell e mude o diretório para onde você gravou o arquivo. Digite "render /nomearquivo/" (onde /nomearquivo/ é o nome do arquivo que você gravou). Quando terminar, você irá ter uma imagem de alta qualidade em "/nomearquivo/.tiff". Para criar uma imagm de alta resolução (para reduzir arestas quadriculadas), edite o arquivo que você gravou. Deve existir uma linha adiante das quinze linhas a partir do topo que inicia-se com "Format", i.e. "Format 450 450 1". Os primeiros dois números são a resolução da imagem criada. Modifique esses dois números para aqueles que você gostaria (você deve manter a razão enre os números originais para evitar distorção), então reler o arquivo novamente.

6  Questões específicas do X

6.1  Como posso aumentar a velocidade da versão X11?

Veja a discursão de opções de renderização na questão seguinte.

6.2  O que fazem os controles Z-Buffer e Dithering no painel de câmeras?

Esses controles permitem a você mudar como a versão para X11 redesenha objetos. A caixa de verificação dithering, que somente aparece quando executando em um display de oito bits, permite a você habilitar ou não a mistura de cores. Dithering é o método pelo qual Geomview utiliza umpequeno conjunto de cores (abaixo de 217) para mostrar qualquer cor que você desejar. Isso é feito pela colocação de pixels de pequenas quantidades de cores diferentes próximas umas das outras permitindo que seus olhos harmonize-as juntas. Desafortunadamente, isso tem um custo computacional para ser feito. Desligando a mistura de cores irá aumantar a velocidade de processamento de imagens, mas as cores usadas não irão se exatamente o que você deseja. Dependendo de sua cena, pode ser uma preço a pagar aceitável.
O menu Z-Buffer que aparece permite a você selecionar entre três diferentes métodos esconder linhas e remover superfície: z-buffering, depth sort, e none. Z-buffering is the most accurate and enables the near and far clipping planes. Depth sort uses less computing, but will be inaccurate if objects intersect (polygons will pop in front when they should be partially obscured) and in certain other circumstances (long, narrow polygons close to other polygons are one example). Depending on your scene, using this method could look just the same as z-buffering but be much faster. The "None" option turns off all hidden line/surface removal. This is only recommended for a scene which consists of just lines in one color.

6.3  What does "Not enough colors available. Using private colormap" mean?

This happens when using the X11 version on an eight bit display (currently common on workstations). An eight bit display can only show 256 colors simultaneously. These colors are shared by all the programs running. Once a colorcell has been allocated by an application, its color is fixed. Geomview tries to grab many colors when it starts. If it fails to get them, it prints this message and uses a private colormap. A private colormap means that Geomview now has access to all 256 colorcells. Unfortunately, these colors will only be displayed when the cursor is inside one of Geomview's windows. The switching of colormaps when the cursor enters and leaves the windows will give a technicolor look to the rest of the display.
If you don't like the technicolor effect, you will have to quit the programs which are using up colormap space. Examples of programs which use lots of colormap space are background pictures, image viewers, visualization software, and WWW browsers.

6.4  What does "Shared memory unavailable, using fallback display method" mean?

The X11 version of Geomview uses the shared memory extension to move images quickly between the program and the X server. However, this method of communicating with the X server only works when running Geomview on the same machine as the display. If Geomview can't use shared memory, it prints this message and goes back to using standard X calls. Everything will work the same, it will just run much slower, especially if you're running over the network.

6.5  Why do I get compiler errors about including files Xm/*.h?

You're trying to compile the X11 version and the compiler can't find the Motif header files. If you have Motif but the headers are in a nonstandard place, change the "SYSCOPTS" in your makefiles/mk.$MACHTYPE file. If you don't have Motif, you won't be able to compile Geomview. In this case, use one of the binary distributions, if you can.

Footnotes:

1Nota do tradutor: para obter informações adicionais sobre os utilitários abaixo digite "man utilitario" em uma janela de shell ou "utilitario -help".
2Nota do tradutor: testei aqui [oO0]N e todas funcionaram.
3Nota do tradutor: temos também o gimp e o xfig.
4Nota do tradutor: digamos que você compile o programa com o comando "gcc 01.c -o 01". Para usar o programa acima em um shell faça "01 < arquivo1.off > arquivo0.off".
5Nota do tradutor: o VCR virou avifile http://avifile.sourceforge.net/. Temos também o kino e o muan.
6Nota do tradutor: temos também o recordmydesktop e o kino em GNU/Linux.


File translated from TEX by TTH, version 4.03.
On 7 Jun 2013, 05:21.
geomview-1.9.5/doc/FAQ/FAQ-pt_BR.tex0000644000175000017500000012177512310110176013607 00000000000000\documentclass[12pt,a4paper]{article} \usepackage[linktocpage]{hyperref} \hyphenation{for-ne-ce} \renewcommand{\contentsname}{\'Indice} \begin{document} \vspace*{6cm} \huge \begin{center} FAQ\\ Geomview \end{center} \normalsize \newpage \tableofcontents \newpage \section{Quest\~oes Gerais} \subsection{O Que \'e Geomview?} Um programa visualizador de prop\'{o}sito geral e interativo para Unix. \'E usado na maioria das vezes para gr\'aficos tridimensionais mas pode mostrar dados em 2D e 4D tamb\'em. Veja a vis\~ao geral .........................................................\\ \url{http://www.geomview.org/overview} para coment\'arios mais gerais sobre o Geomview. \subsection{Como fa\c{c}o para ter o arquivo de instala\c{c}\~ao do Geomview?} Geomview est\'a dispon\'ivel livremente a partir de ............................................\\ \url{http://www.geomview.org/download}. Existem distribui\c{c}\~oes no formato bin\'ario para m\'aquinas Linux, FreeBSD, SGI, Sun SPARC, HP-UX, IBM RS/6000, DEC Alpha, e NeXT, bem como uma distribui\c{c}\~ao na forma de c\'{o}digo fonte. Voc\^e pode tamb\'em ter o arquivo de instala\c{c}\~ao por ftp an\^onimo a partir de \url{ftp://ftp.geomview.org/pub}. Geomview \'e um software livre, mas gostar\'iamos saber das pessoas que o utilizam. Por favor envie-nos um email para register@geomview.org nos dizendo o que voc\^e est\'a fazendo com o Geomview. \subsection{Qual a documenta\c{c}\~ao para o Geomview que est\'a dispon\'ivel?} See the Documentation \url{http://www.geomview.org/docs} part of this web site. \subsection{Como eu posso interagir com outro usu\'arios do Geomview?} Existe a lista de mensagens ``geomview-users'' para pessoas usando geomview que pode ser usada para comunica\c{c}\~ao entre usu\'arios sobre problemas do geomview, quet\~oes, experi\^encias, etc. Os autores do geomview s\~ao tamb\'em uma parte dessa lista e ir\~ao responder a quest\~oes postadas. Tamb\'em usamos essa lista para fazer an\'uncios sobre novas vers\~oes e outras coisas do interesse dos usu\'arios. Para usar essa lista, envie um email vazio com 'subscribe' na linha de assunto para geomview-users-request@lists.sourceforge.net, ou visite a p\'agina da lista em:\\ \url{http://lists.sourceforge.net/mailman/listinfo/geomview-users}. \\ Veja tamb\'em a lista de outros software e projetos:\\ \url{http://www.geomview.org/thirdparty}. \section{Configuration/Installation/\\ Execution Problems} \subsection{As caixas de verifica\c{c}\~ao e certos outros recursos da interface gr\'afica de usu\'ario est\~ao ou \\ ausentes dos pain\'eis do Geomview, ou n\~ao trabalham quando eu compilo \\ a \'ultima vers\~ao. O que est\'a acontecendo?} Esses problemas parecem estarem associados com vers\~oes mais recentes da Lesstif (e.g. 0.91.x), pelo menos no GNU/Linux. N\~ao sei se isso \'e um problema com o Lesstif propriamente dito, ou se alguma coisa est\'a errada com o caminho que o Geomview usa Lesstif. Enquanto isso, se voc\^e experiencia esse problema, sugiro compilar Geomview com a Open Motif ao inv\'es da Lesstif. Existe um arquivo leve de distribui\c{c}\~ao no formato bin\'ario da Open Motif 2.1.30 dispon\'ivel na pagina de download do Geomview ................................\\ \url{http://www.geomview.org/download}, com instru\c{c}\~oes para us\'a-lo com o Geomview. Ou, voc\^e pode pegar a arquivo completo de distribui\c{c}\~ao da Open Motif (fonte ou bin\'ario) a partir de \url{http://www.opengroup.org/motif} ou de \url{http://www.openmotif.com}. Se voc\^e est\'a familiarizado com Lesstif e conhece o que pode causar ese problema (e especialmente se voc\^e sabe como consertar isso!), por favor me mand um email (mbp at geomtech.com). \subsection{O configure alega n\~ao poder encontrar a OpenGl no meu sistema, mas tenho certeza que ela est\'a instalada} \label{aswer:OpenGl} \begin{itemize} \item Garanta que voc\^e informou o argumento ``$--$with-opengl=DIR'' ao configure, onde DIR \'e o diret\'{o}rio contendo sua instala\c{c}\~ao da OpenGL. DIR deve ser o caminho absoluto para um diret\'{o}rio contendo subdiret\'{o}rios chamados ``include'' e ``lib''. O subdiret\'{o}rio ``include'' deve por sua vez incluir um subdiret\'{o}rio chamado ``GL'' que tem o arquivo de cabe\c{c}alho ``gl.h'' (bem como outros arqwuivos de cabe\c{c}alho) dentro dele. O diret\'{o}rio ``lib'' deve conter os arquivos (.so) da biblioteca GL. \item Algumas vezes 'configure' ir\'a incorretamente reportar que a OpenGl est\'a faltando quando de OpenGl estiver presente, mas o teste para detectar a presen\c{c}a da OpenGL falhou por alguma outra raz\~ao, tal como algum arquivo de cabe\c{c}alho ou biblioteca dependente faltando. Por exemplo, se sua instala\c{c}\~ao do X window est\'a danificada ou incompleta, isso pode confundir os testes que 'configure' faz para OpenGl. Existem dois lugares para olhar para colher ind\'icios a respeito disso: \begin{itemize} \item A saida do 'configure' propriamente dito --- olhe para as linhas relacionadas \`a verifica\c{c}\~ao para X window, em particular. Se o X n\~ao for encontrado, ou o Geomview n\~ao puder ser linkado com suporte ao X, ent\~ao esse \'e provavelmente o problema. \item O arquivo 'config.log' queno 'configure' escreve enquanto \'e executado. Esse arquivo cont\'em todos os detalhes terr\'ivies sobre os testes que 'configure' est\'a fazendo. O 'config.log' ir\'a ter mensagens de erro que podem indicar por que certos testes falham. IMPORTANTE nota sobre a leitura do 'config.log': muitos dos testes do configure envolvem la\c{c}os que tentam muitas possibilidades --- por exemplo muitas localiza\c{c}\~oes poss\'iveis para um arquivo de cabe\c{c}alho. O 'configure' ir\'a escrever um pequeno programa e tentar compl\'a-lo uma vez para cada uma dessas localiza\c{c}\~oes, at\'e enconrar encontrar uma que trabalhe. Paa cada uma que n\~ao funcionou, ir\~ao existir mensagens de erro no arquivo 'config.log'. Quando for ler o 'config.log', garanta olhar para todos esses testes, n\~ao apenas o primeiro deles, durante a tentativa de decidor por que um teste est\'a falhando. \end{itemize} \item se a sa\'ida do 'configure', ou o conte\'udo do 'config.log', sugerem que alguma parte do X n\~ao pode ser encontrada (por exemplo se n\~ao puder encontrar certos cabe\c{c}alhos do X, como o ``X11/X.h'' ou o ....................\\``X11/Intrinsic.h''), ent\~ao o problema pode ser que voc\^e n\~ao tenha instalado o pacote de desenvolvimento do X window para o seu sistema. Alguma distribui\c{c}\~ao GNU/Linux inclue o pacote com os execut\'aveis mas n\~ao o(s) pacote(s) de desenvolvimento. Garanta ter instalado quaisquer pacotes que forem necess\'arios para trabalho de desenvolvimento do X bem como o(s) pacote(s) com o(s) execut\'avei(s) do X. \item Se 'configure' reclama que n\~ao pode linkar com -lGL (ou -lGLU) mas voc\^e tem certeza que eles est\~ao a\'i, encontre os diret\'{o}rios contendo seus arquivos libGL.so.* e libGLU.so.*; chame esse diret\'{o}rio de DIR. DIR ir\'a provavelmente conter um ou mais arquivos com nomes como libGL.so.VERS\~AO e libGLU.so.VERS\~AO, onde VERS\~AO is some version number, such as ``1.2.0'' or ``1.2.030200''. Tamb\'em deve conter entradas chamadas simplesmente libGL.so e libGLU.so, sem sfixo de VERS\~AO; esses s\~ao comumente links simb\'{o}licos aos arquivos correspondentes com sufixos de vers\~ao. Por exemplo, no meu sistema tenho \begin{verbatim} libGL.so -> libGL.so.1.2.030200 libGLU.so -> libGLU.so.1.2.030200 \end{verbatim} Se os links (ou arquivos) libGL.so e libGLU.so n\~ao estiverem presentes, crie-os fazendoos apontar para os arquivos correspondentes com o n\'umero mais alto de vers\~ao. N\~ao entendo por que esses links podem n\~ao serem criados em alguma instala\c{c}\~ao da OpenGL, pelo fato de ser do meu entendimento que eles terem de estarem a\'i para que os programas possam us\'a-la propriamente. Admito todavia que n\~ao entendo todo o stuff .so e .so.VERS\~AO, de forma que pode ser que esses links n\~ao sejam realmente necess\'arios e que alguma modifica\c{c}\~ao no script 'configure'do Geomview ou nos arquivos Makefiles possam eliminar a necessidade deles. Se voc\^e sabe uma forma de fazer isso, por favor me diga (mbp@geomtech.com). \end{itemize} \subsection{O configure alega n\~ao poder encontrar a Motif (ou o Lesstif ou o OpenMotif) no meu sistema, mas tenh certeza que ele est\'a instalado} Leia todas as sugest\~oes acima na resposta da quet\~ao an\'aloga sobre a OpenGL na se\c{c}\~ao \ref{aswer:OpenGl}; elas todas se aplicam igualmente \`a Motif. (O arquivo de cabe\c{c}alho principal a procurar no diret\'{o}rio ``include'' \'e o ``Xm/Xm.h''). \section{Platforms} \subsection{Quais plataformas possuem bin\'arios dispon\'iveis para download?} SGI Irix, Linux, FreeBSD, Solaris, SunOS, HP, IBM RS/6000, DEC Alpha \subsection{N\~ao existe um bin\'ario para minha esta\c{c}\~ao de trabalho. H\'a esperan\c{c}a?} Certamente. Se sua esta\c{c}\~ao de trabalho tem um X Window System, OpenGL, Motif, e um compilador ANSI (ISO) C, voc\^e pode compilar o geomview a partir da distribui\c{c}\~ao no formato de c\'{o}digo fonte em ..........................................\\ \url{http://www.geomview.org/download}. Note que existe uma vers\~ao livre da OpenGL chamada Mesa....................\\ (\url{http://www.mesa3d.org}) que executa em programas na maioria dos Unixes livres. Veja aquela p\'agina para detalhes sobre os cont\'inuos esfor\c{c}os para incorporar suporte a hardwares para algumas das placas gr\'aficas populares. Note tamb\'em que existe uma vers\~ao livre da Motif chamada lesstif .......... \url{http://www.lesstif.org/}. O arquivo INSTALL \url{http://www.geomview.org/docs/INSTALL} tem instru\c{c}\~oes sobre como portar a lesstif para novas arquiteturas. Se voc\^e tiver problemas, envie um email para software@geomview.org. Se voc\^e tiver sucesso, apreciaremos receber uma c\'{o}pia do seu ``makefile/mk.oquefor'' e apender que modifica\c{c}òes de c\'{o}digo fonte foram necess\'arias. Gostar\'iamos tamb\'em de incluir seus bin\'arios na nossa lista de distribui\c{c}\~oes pr\'e-compildas. \subsection{Por que n\~ao existe uma vers\~ao para Windows?} N\~ao existe uma vers\~ao nativa do Geomview para o Microsoft Windows. A principal raz\~ao para isso \'e que na \'epoca que o Geomview foi escrito, cmputadores pessoais n\~ao eram r\'apidos o suficiente para construir gr\'aficos tridimensionais interativos pr\'aticos de forma que focamos nossos esfor\c{c}os em esta\c{c}òes de trabalho Unix. Com o tempo PCs r\'apidos o sficiente chegaram, o Geometry Center, onde Geomview foi desenvolvido, estava em processo de fechamento. A equipe iniciou o trabalho sobre uma vers\~ao para Windows mas n\~ao teve tempo de termin\'a-la antes do Centro fechar. Geomview pode executar sob Cygwin \url{http://www.cygwin.com}, que fornece ao Windows um ambiente semelhante ao Unix. Veja ``Geomview para Windows?'' \url{http://www.geomview.org/windows/} para maiores informa\c{c}\~oes. Se voc\^e gostaria de ver uma vers\~ao do Geomview para Windows, voc\^e pode contrbuir para seu desenvolvimento de muitas maneiras. Veja contribuindo para o Geomview \url{http://www.geomview.org/contributing} para detalhes. \subsection{Tenho acesso a um X11 e a uma esta\c{c}\~ao de trabalho SGI. Qual vers\~ao devo usar?} A vers\~ao SGI ir\'a na maioria das vezes sempre ser significantemente mais r\'apida, devido ao suporte a hardware para gr\'aficos tridimensionais. Por exemplo, Um Sun Sparcstation 10 \'e mais lento que um Indy (antiga entrada de SGI a n\'ivel de m\'aquina). No futuro pode ser que exista suporte a hardware para certas placas gr\'aficas OpenGL dispon\'iveis para alguns PC Unixes. \subsection{O que ocorreu \`a vers\~ao NeXT Quick Renderman?} N\~ao mais distribuimos a vers\~ao NeXTStep/OpenStep do Geomview, que usou a biblioteca gr\'afica Quick Renderman. Fizemos isso apenas para simplificar a manutens\~ao doc\'{o}digo b\'asico ap\'{o}s a vers\~ao 1.5.0. Bin\'arios grandes para as arquiteturas Motorola, Intel e HP-PA para a vers\~ao 1.5.0 est\~ao ainda dispon\'iveis em:\\ \url{http://www.geomview.org/download/dist/geomview-1.5.0-next.tar}. \subsection{What modules are shipped for which platforms with the current release?} Liberamos a maioria de todos os m\'{o}dulos para todas as plataformas. A lista de m\'{o}dulos distribu\'idos est\'a no arquivo README inclu\'idos nas distribui\c{c}\~oes. Se o m\'{o}dulo que voc\^e deseja est\'a naquela lista mas n\~ao aparece na lista de m\'{o}dulos no painel principal, Geomview provavelmente n\~ao est\'a instalado de forma correta. Note que existem m\'{o}dulos adicionais escritos por terceiros \url{http://www.geomview.org/thirdparty} que n\~ao s\~ao parte da distribui\c{c}\~ao principal. Os m\'{o}dulos suportados na mais recente vers\~ao para GNU/Linux do Geomview (1.9.4) s\~ao:\\ \begin{center} \begin{tabular}{|l|p{8cm}|} \hline M\'ODULO & DESCRI\c{C}\~AO \\ \hline Animator & percorre uma sequ\^encia de objetos \\ \hline Antiprism models & Cria, transforma, analisa, e visualiza poliedros\\ \hline StageTools & CenterStage, StageManager, StageStills, StageHand - permite criar objetos do Geomview suando f\'{o}rmulas matem\'aticas \\ \hline Clipboard & grava um \'unico objeto OOGL para uma \'area de transfer\^encia \\ \hline Clock & Mostra um rel\'{o}gio anal\'{o}gico na tela \\ \hline Draw Boundary & \\ \hline Nose & depura\c{c}\~ao/exemplo para sele\c{c}\~ao (veja o manual do Geomview) \\ \hline Orrery & Visualiza\c{c}\~ao do Sistema Solar \\ \hline \end{tabular} \end{center} Os seguintes m\'{o}dulos usam tcl/tk: \begin{center} \begin{tabular}{|l|p{8cm}|} \hline M\'ODULO & DESCRI\c{C}\~AO \\ \hline StageTools & CenterStage, StageManager, StageStills, StageHand - permite criar objetos do Geomview suando f\'{o}rmulas matem\'aticas \\ \hline \end{tabular} \end{center} Os seguintes programas utilit\'arios s\~ao tamb\'em inclu\'idos na distribui\c{c}\~ao \footnote{Nota do tradutor: para obter informa\c{c}\~oes adicionais sobre os utilit\'arios abaixo digite ``man utilitario'' em uma janela de shell ou ``utilitario $--$help''.}: \begin{center} \begin{tabular}{|l|p{8cm}|} \hline UTILIT\'ARIO & DESCRI\c{C}\~AO \\ \hline anytooff & convert one or many OOGL files into a single OFF file \\ \hline anytoucd & convert an OOGL file to UCD (AVS) format \\ \hline bdy & compute boundary of an object (helper for drawbdy) \\ \hline bez2mesh & dice BEZ file to list of MESHes \\ \hline clip & clip objects against plane/sphere/cylinder (helper for ginsu) \\ \hline fd2ps & xforms \\ \hline fdesign & xforms \\ \hline hvectext & generate vector text object \\ \hline math2oogl & convert Mathematica graphics to OOGL (helper for OOGL.m) \\ \hline offconsol & polylist vertex consolidator \\ \hline oogl2rib & convert OOGL to Renderman RIB format \\ \hline oogl2vrml & convert OOGL to VRML 1.0 \\ \hline oogl2vrml2 & \\ \hline polymerge & merge degenerate OFF vertices/edges/faces (to Evolver or OFF) \\ \hline remotegv & remotegv $--$help \\ \hline togeomview & send commands to geomview \\ \hline ucdtooff & convert UCD (AVS) format to OFF format \\ \hline vrml2oogl & convert VRML 1.0 to OOGL \\ \hline \end{tabular} \end{center} \section{Usando o Geomview} \subsection{Por que os objetos n\~ao aparecem nos lugares corretos?} Quando objetos n\~ao aparece onde voc\^e pensa que eles deveriam estar, \'e provavelmente devido \`a normaliza\c{c}\~ao habilitada por padr\~ao. Normaliza\c{c}\~ao simplesmente ajusta proporcionalmente um a caixa associada de um objeto para ser cotida dentro de uma esfera unit\'aria, com o centro da caixa associada transladado para a or\'igem. Esse ajuste \'e \'util quando examinamos um objeto simples, e faz voc\^e visualizar o objeto completo sem ter de se preocupar com o quanto grande esse objeto \'e. Todavia, isso tamb\'em pode significar que se voc\^e estiver chamando m\'ultiplos objetos que s\~ao supostamente pertencentes ao mesmo sistema de coordenadas, todos os objetos ir\~ao ser ajustados proporcionalmente e colocados na or\'igem. Para desabilitar a normaliza\c{c}\~ao, exponha o painel de apar\^encia. Os controles da normaliza\c{c}\~ao est\~ao no quadrante inferior direito do painel. Selecione a op\c{c}\~ao ``None''. A tecla de atalho alternativa \'e '0N'\footnote{Nota do tradutor: testei aqui [oO0]N e todas funcionaram.}. Para desabilitar a normaliza\c{c}\~ao sempre, personalize o Geomview como mostrado em \url{http://www.geomview.org/docs/html/Customization.html} inserindo a linha (normalization allgeoms none) no arquivo chamado .geomview no seu diret\'{o}rio pessoal de usu\'ario. Quando voc\^e desabilitar a normaliza\c{c}\~ao seus objetos podem desaparece. Isso ocorre pelo fato do objeto n\~ao normalizado n\~ao cair no cone de visualiza\c{c}\`ao da c\^amera. A maneira mais f\'acil de ver tudo \'e escolher o objeto mundo ``World'' no navegador de objetos, ent\~ao clicar em olhar para ``Look At'' no painel de ferramentas. \subsection{Por que est\'a tudo centralizado e/ou uns por cima dos outros?} Veja a resposta anterior. \subsection{Como posso mostrar uma cole\c{c}\~ao de pontos?} A forma mais eficiente de mostrar pontos no Geomview \'e usar o formato de arquivo VECT. Esse formato de arquivo \'e principalmente usado para contruir figuras compostas por segmentos mas podemos tamb\'em usar esse formato de arquivo para especificar segmentos que possuem somente um v\'ertice (i.e. pontos). Vamos dar uma olhada em um arquivo VECT exemplo que descreve 3 pontos coloridos em vermelho, verde e azul: \tiny \begin{verbatim} VECT 3 3 3 # n\'umero de linhas poligonais, # n\'umero de v\'ertices, # n\'umero de cores. 1 1 1 # a poligonal n\'umero 1 tem 1 v\'ertice, # a poligonal n\'umero 2 tem 1 v\'ertice, # a poligonal n\'umero 3 tem 1 v\'ertice, # nesse caso somente um por estarmos fazendo pontos. 1 1 1 # a poligonal n\'umero 1 tem 1 cor # a poligonal n\'umero 2 tem 1 cor # a poligonal n\'umero 3 tem 1 cor -1 -.2 0 # As coordenadas do \'unico v\'ertice da poligonal 1. 1 -.2 0 # As coordenadas do \'unico v\'ertice da poligonal 2. 0 .9 0 # As coordenadas do \'unico v\'ertice da poligonal 3. 1 0 0 1 # A cor da poligonal 1 no formato RGBA. 0 1 0 1 # A cor da poligonal 2 no formato RGBA. 0 0 1 1 # A cor da poligonal 3 no formato RGBA. \end{verbatim} \normalsize Quando chamarmos esse arquivo no Geomview, voc\^e ir\'a provavelmente precisar desabilitar a caixa associada (via painel de apar\^encia), caso contr\'ario voc\^e pode n\~ao estar apto a ver os pontos. \subsection{Como posso tornar os pontos mais facilmente\\ vis\'iveis?} Por padr\~ao, a espessura de linhas e pontos no Geomview \'e 1. Essa espessura pode estar ok para a maioria das linhas, mas faz com que cada ponto ocupe somente uma pixel na tela do computador. Voc\^e pode mudar a espessura das linhas e dos pontos adicionando um r\'{o}tulo de apar\^encia no topo de seu arquivo geom\'etrico que se parece com isso: appearance { linewidth 4. } Nesse caso, temos aumentado nosso tamanho de linha/ponto para 4 e quaisquer pontos que tivermos em nosso arquivo ir\'a agora aparecer como pequenos discos. Voc\^e pode tamb\'em mudar a largura da linha usando o painel Appearance. O que Geomview faz atualmente \'e tratar cada ponto como um pol\'igono de muitos lados que aproxima-se de um disco. Se voc\^e deseja que os pontos como objetos s\'{o}lidos tridimensionais, tais como pequenas esferas, voc\^e pode usar um m\'etodo completamente diferente para represent\'a- los: um objeto INST com m\'ultiplas transforma\c{c}\~oes. Isso permite a voc\^e especificar uma apar\^encia geom\'etrica arbitr\'aria para ser usada para representar pontos. Por exemplo, o seginte arquivo representa os tr\^es pontos (1.5, 2.0, 0.1), (1.0, 0.5, 0.2), e (0.5, 0.3, 0.2) usando pequenos cubos: \begin{verbatim} INST geom { OFF 8 6 12 # VFA -0.05 -0.05 -0.05 # V0 0.05 -0.05 -0.05 # V1 0.05 0.05 -0.05 # V2 -0.05 0.05 -0.05 # V3 -0.05 -0.05 0.05 # V4 0.05 -0.05 0.05 # V5 0.05 0.05 0.05 # V6 -0.05 0.05 0.05 # V7 4 0 1 2 3 # F0 4 4 5 6 7 # F1 4 2 3 7 6 # F2 4 0 1 5 4 # F3 4 0 4 7 3 # F4 4 1 2 6 5 # F5 } transforms 1 0 0 0 0 1 0 0 0 0 1 0 1.5 2.0 0.1 1 1 0 0 0 0 1 0 0 0 0 1 0 1.0 0.5 0.2 1 1 0 0 0 0 1 0 0 0 0 1 0 0.5 0.3 0.2 1 # # these are the matrices: # # 1 0 0 0 1 0 0 0 1 0 0 0 # 0 1 0 0 0 1 0 0 0 1 0 0 # 0 0 1 0 0 0 1 0 0 0 1 0 # 1.5 2.0 0.1 1 1.0 0.5 0.2 1 0.5 0.3 0.2 1 \end{verbatim} O objeto OFF entre ``geom \{'' e ``\}'' \'e o cubo. As tr\^es linhas ap\'{o}s a palavra ``transforms'' are 4x4 transforms, one for each point. Note that you can use any valid OOGL expression for the geometry; for example, if you want to use small dodecahedra to represent points, you could repace the above OFF object with the following, which references the dodecahedron object in the file dodec.off (distributed with Geomview), scaling it by 0.05: \begin{verbatim} INST geom { INST geom { < dodec.off } transform .05 0 0 0 0 .05 0 0 0 0 .05 0 0 0 0 1 } transforms 1 0 0 0 0 1 0 0 0 0 1 0 1.5 2.0 0.1 1 1 0 0 0 0 1 0 0 0 0 1 0 1.0 0.5 0.7 1 1 0 0 0 0 1 0 0 0 0 1 0 0.5 0.3 0.2 1 \end{verbatim} Esteja ciente de que quanto mais complicada geometria voc\^e usa para seus pontos, mais tempo ir\'a demorar o Geomview para atualizar a janela. Isso pode ser importante se voc\^e est\'a pensando em trabalhar com um grande n\'umero de pontos, nesse caso voc\^e deve conduzir-se na dire\c{c}\~ao de apar\^encias de ponto muito simples o usar o m\'etodo de mostrar pontos no formato VECT. \subsection{Como posso colocar texto em uma cena?} Voc\^e tem duas op\c{c}\~oes: \begin{itemize} \item Voc\^e pode usar o m\'{o}dulo externo Labeler (rotulador-vers\~ao SGI), que fornece a voc\^e uma GUI para digitar texto e selecionar fonte: ou vetor ou uma vers\~ao poligonalizada de uma fonte instalada. Todavia, voc\^e precisa posicionar o texto em uma cena tridimensional, ou manualmente ou com algum outro m\'{o}dulo como o m\'{o}dulo Transformer (SGI). \item Voc\^e pode usar o programa utilit\'ario de linha de comando hvectext de fones vetoriais de Hershey, que permite a voc\^e especificar uma posi\c{c}\~ao para o texto. Feito isso voc\^e deve chamar o arquivo resultante no Geomview. \end{itemize} Se voc\^e n\~ao precisa que o texto seja um objeto tridimensional na cena, voc\^e pode criar uma imagem ...................................................................... \url{http://www.geomview.org/FAQ/answers.shtml#images} ou \,\,\,\,\,um \,\,\,\,\,arquivo\\ postscript \url{http://www.geomview.org/FAQ/answers.shtml#ps} da\,\,\, cena\,\,\,\, e ent\~ao usar um editor de imagens como o Illustrator, Showcase, ou o XPaint\footnote{Nota do tradutor: temos tamb\'em o gimp e o xfig.} para colocar o texto. \subsection{O Geomview faz visualiza\c{c}\~ao de volume?} N\~ao, Geomview \'e pensado para fazer visualiza\c{c}\~ao de superf\'icies. Voc\^e pode ou criar uma isosuperf\'icie e ent\~ao v\^e-la usando o Geomview, ou usar umpacote de visualiza\c{c}\~ao de volume. O toolkit vtk livre \url{http://www.vtk.org/} de visualiza\c{c}\~ao tem suporte extensivo para visualiza\c{c}\~ao de volume, como faz tamb\'em os pacotes comerciais como AVS \url{http://www.avs.com}, Iris Explorer \url{http://www.nag.co.uk/Welcome\_IEC.html}, or IBM Data Explorer ..........\\ \url{http://pic.dhe.ibm.com/infocenter/dataexpl/v8r2/index.jsp}. \,\,\,\,\,\,\,\,O Volvis \url{http://labs.cs.sunysb.edu/labs/vislab/volvis/} \'e um software livre especificamente para visualiza\c{c}\~ao de volume. \subsection{Pode o geomview fazer mapas de textura?} Sim, no release 1.6 e mais novos, mas somente na vers\~ao OpenGL, n\~ao na vers\~ao X11. \subsection{Por que Geomview n\~ao l\^e meu arquivo OFF?} Isso \'e devido provavelmente um interpreta\c{c}\~ao diferente de como um OFF deve ser escrito. Geomview indexa v\'ertices iniciando em zero, enquanto alguns outros programas comprovadamente iniciam em um. O seguinte programa na linguagem C ir\'a converter um arquivo OFF no formato texto puro indexado a partir da unidade em um arquivo OFF indexado a partir do zero. \footnote{Nota do tradutor: digamos que voc\^e compile o programa com o comando ``gcc 01.c -o 01''. Para usar o programa acima em um shell fa\c{c}a ``01 $<$ arquivo1.off $>$ arquivo0.off''.} \begin{verbatim} #include #include #include int main(void) { char s[256]; int v, f, i, n, t; gets(s); if (strcmp(s, "OFF")) { fprintf(stderr, "not an OFF\n"); exit(1); } puts(s); gets(s); puts(s); sscanf(s, "%d %d %d", &v, &f, &i); for (i=0; i!=v; ) { gets(s); if (strlen(s)) { puts(s); i++; } } for (i=0; i!=f; i++) { scanf("%d", &n); printf("\n%d", n); for (v=0; v!=n; v++) { scanf("%d", &t); printf(" %d", t-1); } } printf("\n"); return 0; } \end{verbatim} \subsection{Como posso colocar movimento em uma sequ\^encia de arquivos do Geomview/OOGL?} Voc\^e pode tentar usando o Animator, um m\'{o}dulo externo que \'e distribu\'ido com todas as vers\~oes do Geomview. Com Animator, voc\^e pode dizer ao Geomview para ler uma sequ\^encia de arquivos OOGL e ent\~ao exibir essa sequ\^encia avan\c{c}ando, voltando e tamb\'em em passo de quadro usando interfaces semelhantes ao VCR\footnote{Nota do tradutor: o VCR virou avifile \url{http://avifile.sourceforge.net/}. Temos tamb\'em o kino e o muan.}. Para usar o Animator clique na entrada Animator no navegador de m\'{o}dulos externos do Geomview. Se o Animator n\~ao aparecer no navegador, ent\~ao o Geomview provavelmente n\~ao foi instalado adequadamente. Para mais informa\c{c}\~ao sobre Animator leia o painel info dispon\'ivel atrav\'es do programa ou a p\'agina de manual (digitando ``man animate''). \section{Sa\'ida} \subsection{Como posso criar uma anima\c{c}\~ao de v\'ideo (MPEG/\\ QuickTime/animated GIF)?} Existem muitas variantes dessa quet\~ao: \begin{itemize} \item primeira variante \\ \tiny \begin{verbatim} > Gostaria de gravar uma sequ\^encia de arquivos instant\^aneso no formato ppm de um \'unico > objeto no formato off enquanto esse objeto est\'a sendo rotacionado para converter a sequ\^encia > em um filme. O \'unico m\'etodo que conhe\c{c}o \'e rotacionar o objeto > lentamente com o mouse, parar omovimento, e gravar cada quadro > individualmente. Existe um m\'etodo mais r\'apido e autom\'atico, tal como > um acript de comandos. Se existe, voc\^e tem um exemplo de script de comando que possa > ser modificado? \end{verbatim} \normalsize Duas op\c{c}\~oes: \begin{itemize} \item Se o movimento \'e alinhado a algum eixo, \'e bastante f\'acil usar os comandos rotate e snapshot da GCL juntos: \begin{verbatim} (snapshot targetcam /tmp/foo\%03d.rgb) (transform world world world rotate .1 0 0) (snapshot targetcam /tmp/foo\%03d.rgb) (transform world world world rotate .1 0 0) \end{verbatim} e assim por diante. O comando snapshot auto-incrementa o nome do arquivo. \item Mas para um movimento mais complexo que a simples rota\c{c}\~ao em torno do eixo x que mostrei acima, considere usar StageTools, que \'e um conjunto de ferramentas pensado para ajudar pessoas a fazerem facilmente anima\c{c}\~oes a partir do Geomview. StageTools est\'a inclu\'ido como um m\'{o}dulo nas vers\~oes recentes, mas se voc\^e precisar copi\'a-lo ele est\'a dispon\'ivel em .................................. \url{http://www.geom.umn.edu/software/StageTools/}. \end{itemize} \item segunda variante \\ \tiny \begin{verbatim} > Tenho usado Geomview para ver filmes com ferramentas de anima\c{c}\~ao. como posso > converter aquele filme para ooutro formato de anima\c{c}\~ao (e.g. um GIF > animado) de forma que possa coloc\'a-lo em uma web page, vis\'ivel para > algu\'em sem Geomview? \end{verbatim} \normalsize \'E verdade que StageTools ir\'a fazer isso e muito mais tamb\'em. Mas existe tamb\'em um caminho muito f\'acil de fazer isso diretamente dentro do m\'{o}dulo Animator: a fun\c{c}\~ao Command ir\'a executar um comando GCL ap\'{o}s cada quadro. Ent\~ao para pegar automaticamente instant\^aneos a cada quadro, voc\^e dever\'a pressionar o bot\~ao Command e digitar alguma coisa como \begin{verbatim} (snapshot c0 /tmp/foo\%03d.rgb) \end{verbatim} no campo de texto. Ent\~ao quando voc\^e pressionar play voc\^e ir\'a ver que agora agita\c{c}\~ao uma vez que o Animator \'est\'a gravando uma imagem offf para o disco de cada vez. Voc\^e pode desejar habilitar o bot\~ao de r\'adio ``Once'' de forma que o Animator pare ap\'{o}s executar cada quadro uma \'unica vez. Ent\~ao voc\^e pode usar seu programa escolhido para criar um gif animado ou filme do quicktime a partir desso pacote de arquivos de imagem. Por exemplo, nos SGIs voc\^e pode fazer isso com o ``mediaconvert''.\footnote{Nota do tradutor: temos tamb\'em o recordmydesktop e o kino em GNU/Linux.} \end{itemize} \subsection{Como posso gravar uma figura de exatamente o que vejo em uma janela de c\^amera?} Garanta que a janela de c\^amera que voc\^e deseja seja a janela ativa no momento da foto, ent\~ao selecione o item ``Save'' do menu ``File'' no painel principal (ou use a tecla de atalho ``$>$''). No painel que aparece, existe uma caixa de eop\c{c}\~ao que \'e ajustada para Command por padr\~ao. Selecione uma das op\c{c}\~oes de instant\^aneo, insira o nome do arquivo na entrada Selection, e clique ``OK''. Na vers\~ao SGI, voc\^e tem tr\^es escolhas de instant\^aneo de imagem: SGI screen, PPM screen, e PPM software. Ambas as op\c{c}\~oes screen literalmente gravam os os pixels de tela em um arquivo, ou no formato SGI (tamb\'em chamado RGB) ou em formato PPM. A op\c{c}\~ao PPM software ir\'a reler a imagem em um espa\c{c}o tempor\'ario de armazenagem fora da tela usando o software de releitura a partir da vers\~ao X vanilla do Geomview. Dessa forma, pode n\~ao ser id\^entica pixel a pixel a imagem gravada em rela\c{c}\~ao \`a imagem que voc\^e v\^e. Na vers\~ao X11, voc\^e tem somente as op\c{c}\~oes PPM. \subsection{Como posso fazer um verdadeiro arquivo PostScript que seja bom em m\'ultiplas resolu\c{c}\~oes ao inv\'es de apenas converter um bitmap em um PostScript?} Garanta que a janela de c\^amera que voc\^e deseja seja a janela ativa no momento da foto, ent\~ao selecione o item ``Save'' do menu ``File'' no painel principal (ou use a tecla de atalho ``$>$''). No painel que aparece, existe uma caixa de eop\c{c}\~ao que \'e ajustada para Command por padr\~ao. Selecione a op\c{c}\~ao PostScript snapshot, insira o nome de arquivo na entrada Selection, e clique ``OK''. Esse m\'etodo tem vantagens e desvantagens, comparado ao m\'etodo de gravar um bitmap de imagem. A vantagem \'e que o resultado \'e independente da resolu\c{c}\~ao -- voc\^e pode imprimir em uma impressora de alta resolu\c{c}\~ao e n\~ao ver qualquer aresta quadriculada. As desvantagens s\~ao que nosso releitor PostScript n\~ao pode fazer sombreamento suave e usa o algor\'itmo de painter para remo\c{c}\~ao de superf\'icies escondidas. Essa \'ultima observa\c{c}\~ao significa que objetos que se interseptam e algumas outras cenas de condicionamento host\'il ir\~ao ser desenhadas incorretamente, ou mesmo que objetos pr\'{o}ximos ir\~ao ser desenhados atr\'as de objetos distantes. Muitas vezes funciona, mas n\~ao sempre. \subsection{Por que meu instant\^aneo PostScript est\'a p\'essimo?} Veja a resposta anterior. \subsection{Como fazer uma imagem de alta qualidade com RenderMan?} Se voc\^e tem o Photorealistic Renderman (um prodto comercial da Pixar), ou o BMRT (Blue Moon Rendering Toolkit, uma implementa\c{c}\~ao de dom\'inio p\'ublico), voc\^e pode criar imagens de alta qualidade com transpar\^encia e ilumina\c{c}\~ao mais precisa nas vers\~oes SGI e X11. Paa fazer isso, traga o painel Save e selecione ``RMan [->tiff]'' a partir das op\c{c}\~oes de gravar. Insira um nome de arquivo e clique ``Ok''. Aparecer\'a um janela de shell e mude o diret\'{o}rio para onde voc\^e gravou o arquivo. Digite ``render /nomearquivo/'' (onde /nomearquivo/ \'e o nome do arquivo que voc\^e gravou). Quando terminar, voc\^e ir\'a ter uma imagem de alta qualidade em ``/nomearquivo/.tiff''. Para criar uma imagm de alta resolu\c{c}\~ao (para reduzir arestas quadriculadas), edite o arquivo que voc\^e gravou. Deve existir uma linha adiante das quinze linhas a partir do topo que inicia-se com ``Format'', i.e. ``Format 450 450 1''. Os primeiros dois n\'umeros s\~ao a resolu\c{c}\~ao da imagem criada. Modifique esses dois n\'umeros para aqueles que voc\^e gostaria (voc\^e deve manter a raz\~ao enre os n\'umeros originais para evitar distor\c{c}\~ao), ent\~ao reler o arquivo novamente. \section{Quest\~oes espec\'ificas do X} \subsection{Como posso aumentar a velocidade da vers\~ao X11?} Veja a discurs\~ao de op\c{c}\~oes de renderiza\c{c}\~ao na quest\~ao seguinte. \subsection{O que fazem os controles Z-Buffer e Dithering no painel de c\^ameras?} Esses controles permitem a voc\^e mudar como a vers\~ao para X11 redesenha objetos. A caixa de verifica\c{c}\~ao dithering, que somente aparece quando executando em um display de oito bits, permite a voc\^e habilitar ou n\~ao a mistura de cores. Dithering \'e o m\'etodo pelo qual Geomview utiliza umpequeno conjunto de cores (abaixo de 217) para mostrar qualquer cor que voc\^e desejar. Isso \'e feito pela coloca\c{c}\~ao de pixels de pequenas quantidades de cores diferentes pr\'{o}ximas umas das outras permitindo que seus olhos harmonize-as juntas. Desafortunadamente, isso tem um custo computacional para ser feito. Desligando a mistura de cores ir\'a aumantar a velocidade de processamento de imagens, mas as cores usadas n\~ao ir\~ao se exatamente o que voc\^e deseja. Dependendo de sua cena, pode ser uma pre\c{c}o a pagar aceit\'avel. O menu Z-Buffer que aparece permite a voc\^e selecionar entre tr\^es diferentes m\'etodos esconder linhas e remover superf\'icie: z-buffering, depth sort, e none. Z-buffering is the most accurate and enables the near and far clipping planes. Depth sort uses less computing, but will be inaccurate if objects intersect (polygons will pop in front when they should be partially obscured) and in certain other circumstances (long, narrow polygons close to other polygons are one example). Depending on your scene, using this method could look just the same as z-buffering but be much faster. The ``None'' option turns off all hidden line/surface removal. This is only recommended for a scene which consists of just lines in one color. \subsection{What does ``Not enough colors available. Using private colormap'' mean?} This happens when using the X11 version on an eight bit display (currently common on workstations). An eight bit display can only show 256 colors simultaneously. These colors are shared by all the programs running. Once a colorcell has been allocated by an application, its color is fixed. Geomview tries to grab many colors when it starts. If it fails to get them, it prints this message and uses a private colormap. A private colormap means that Geomview now has access to all 256 colorcells. Unfortunately, these colors will only be displayed when the cursor is inside one of Geomview's windows. The switching of colormaps when the cursor enters and leaves the windows will give a technicolor look to the rest of the display. If you don't like the technicolor effect, you will have to quit the programs which are using up colormap space. Examples of programs which use lots of colormap space are background pictures, image viewers, visualization software, and WWW browsers. \subsection{What does ``Shared memory unavailable, using fallback display method'' mean?} The X11 version of Geomview uses the shared memory extension to move images quickly between the program and the X server. However, this method of communicating with the X server only works when running Geomview on the same machine as the display. If Geomview can't use shared memory, it prints this message and goes back to using standard X calls. Everything will work the same, it will just run much slower, especially if you're running over the network. \subsection{Why do I get compiler errors about including files Xm/*.h?} You're trying to compile the X11 version and the compiler can't find the Motif header files. If you have Motif but the headers are in a nonstandard place, change the ``SYSCOPTS'' in your makefiles/mk.\${MACHTYPE} file. If you don't have Motif, you won't be able to compile Geomview. In this case, use one of the binary distributions, if you can. \end{document} geomview-1.9.5/doc/FAQ/FAQ.html0000644000175000017500000016062412310110176012743 00000000000000















No Title
FAQ Geomview

Contents

1  General Questions
    1.1  What is Geomview?
    1.2  How do I download Geomview?
    1.3  What Geomview documentation is available?
    1.4  How can I get in touch with other Geomview users?
2  Configuration/Installation/ Execution Problems
    2.1  The checkboxes and certain other GUI widgets are either absent from Geomview's panels, or don't work when I compile the latest version. What's up?
    2.2  configure claims it can't find OpenGl on my system, but I'm sure that it is installed
    2.3  configure claims it can't find Motif (or Lesstif or OpenMotif) on my system, but I'm sure that it is installed
3  Platforms
    3.1  What platforms have binary downloads available?
    3.2  There isn't a binary for my workstation. Is there hope?
    3.3  Why isn't there a Windows version?
    3.4  How fast does Geomview run on various platforms?
    3.5  I have access to an X11 and SGI workstation. Which version should I use?
    3.6  What happened to the NeXT Quick Renderman version?
    3.7  What modules are shipped for which platforms with the current release?
4  Using Geomview
    4.1  Why don't objects appear in the right places?
    4.2  Why is everything centered and/or on top of each other?
    4.3  How can I display a collection of points?
    4.4  How do I make the points larger?
    4.5  How do I put text into a scene?
    4.6  Can Geomview do volume visualization?
    4.7  Can Geomview do texture maps?
    4.8  Why can't Geomview read my OFF file?
    4.9  How can I animate a sequence of Geomview/OOGL files?
5  Output
    5.1  How can I create a video animation (MPEG/ QuickTime/animated GIF)?
    5.2  How can I save a picture of exactly what I see in a camera window?
    5.3  How can I make a true PostScript file that looks good at multiple resolutions instead of just converting a bitmap into PostScript?
    5.4  Why does my PostScript snapshot look wrong?
    5.5  How can I make a high quality image with RenderMan?
6  X Specific Questions
    6.1  How do I speed up the X11 version?
    6.2  What do the Z-Buffer and Dithering controls in the Cameras panel do?
    6.3  What does "Not enough colors available. Using private colormap" mean?
    6.4  What does "Shared memory unavailable, using fallback display method" mean?
    6.5  Why do I get compiler errors about including files Xm/*.h?

1  General Questions

1.1  What is Geomview?

A general purpose interactive viewing program for Unix. It is used mostly for 3D graphics but can display data in 2D and 4D as well. See the overview http://www.geomview.org/overview for more general comments about Geomview.

1.2  How do I download Geomview?

Geomview is available for free from http://www.geomview.org/download. There are binary distributions for Linux, FreeBSD, SGI, Sun SPARC, HP-UX, IBM RS/6000, DEC Alpha, and NeXT machines, as well as a source code distribution.
You can also download it via anonymous ftp from
ftp://ftp.geomview.org/pub
Geomview is free software, but we like to hear from people using it. Please send us mail using register@geomview.org telling us what you're doing with it.

1.3  What Geomview documentation is available?

See the Documentation http://www.geomview.org/docs part of this web site.

1.4  How can I get in touch with other Geomview users?

There is a "geomview-users" mailing list for people using geomview that can be used for communication between users regarding geomview problems, questions, experiences, etc. The geomview authors are also a part of this list and will respond to questions posted to it. We also use this list to make announcements about new releases and other things of interest to users. To join the list, send an empty note with 'subscribe' in the subject line to geomview-users-request@lists.sourceforge.net , or visit the list web page at: http://lists.sourceforge.net/mailman/listinfo/geomview-users
See also the list of third party software and projects: http://www.geomview.org/thirdparty.

2  Configuration/Installation/ Execution Problems

2.1  The checkboxes and certain other GUI widgets are either absent from Geomview's panels, or don't work when I compile the latest version. What's up?

This problems seems to be associated with recent versions of Lesstif (e.g. 0.91.x), at least on GNU/Linux. I don't know if it's a problem with Lesstif itself, or if something is wrong with the way Geomview uses Lesstif. In the meantime, if you experience this problem, I suggest compiling Geomview with Open Motif instead of Lesstif. There's a lightweight binary distribution of Open Motif 2.1.30 available from the Geomview download page http://www.geomview.org/download, with instructions for using it with Geomview. Or, you can get the full Open Motif distribution (source or binary) from either http://www.opengroup.org/motif or http://www.openmotif.com.
If you're familiar with Lesstif and know what might cause this problem (and especially if you know how to fix it!), please email me (mbp at geomtech.com).

2.2  configure claims it can't find OpenGl on my system, but I'm sure that it is installed

  • Make sure you passed the argument "-with-opengl=DIR" to configure, where DIR is the directory containing your OpenGL installation. DIR should be the absolute path to a directory containing subdirectories named "include" and "lib". The "include" subdir should in turn include a subdir called "GL" that has the header file "gl.h" (as well as other header files) in it. The "lib" directory should contain the GL library (.so) files.
  • Sometimes 'configure' will incorrectly report that OpenGl is missing when in fact OpenGl is present, but the test for it fails for some other reason, such as some missing dependent header file or library. For example, if your installation of X window is screwed up or incomplete, it can confuse the tests that 'configure' does for OpenGl. There are two places to look for clues about this:
    • The output from 'configure' itself - look at the lines related to checking for X window, in particular. If X was not found, or couldn't be linked with, then that is probably the problem.
    • The file 'config.log' that 'configure' writes as it runs. This file contains all the gory details about the tests that 'configure' is doing. It'll have error messages that may indicate why certain tests fail. IMPORTANT note about reading 'config.log': many of configure's tests involve loops which try several possibilities - for example several possible locations for a header file. 'configure' will write a little program and try to compile it once for each of these locations, until it finds one that works. For each one that doesn't work, there will be error messages in the 'config.log' file. When reading 'config.log', be sure to look for ALL these test, not just the first one, in trying to decide why a test is failing.
  • If the output from 'configure', or the contents of 'config.log', suggest that some parts of X can't be found (for example if it can't find certain X header files, like "X11/X.h" or "X11/Intrinsic.h"), then the problem could be that you have not installed the X window development package for your system. Some default Linux distributions include the runtime X package but not the development package(s). Make sure you've installed whatever packages are necessary for X development work as well as the runtime X package(s).
  • If 'configure' claims that it can't link with -lGL (or -lGLU) but you are sure it's there, find the directory containing your libGL.so.* and libGLU.so.* files; call this directory DIR. DIR will probably contain one or more files with names like libGL.so.VERSION and libGLU.so.VERSI ON, where VERSION is some version number, such as "1.2.0" or "1.2.030200". It should also contain entries named simply libGL.so and libGLU.so, with no VERSION suffix; these are usually symbolic links to corresponding files with version suffixes. For example, on my system I have
                libGL.so -> libGL.so.1.2.030200
                libGLU.so -> libGLU.so.1.2.030200
    	    
    
    If the links (or files) libGL.so and libGLU.so are not present, create them by making symbolic links to the corresponding file with the highest version number.
    I do not understand why these links would be missing in some installations of OpenGL, because it's my understanding that they have to be there for programs to link properly. I admit however that I don't understand all the .so and .so.VERSION stuff, so it could be that these links aren't really necessary and that some change in Geomview's configure script or Makefiles could eliminate the need for them. If you know a way to do this, please let me [mbp@geomtech.com] know.

2.3  configure claims it can't find Motif (or Lesstif or OpenMotif) on my system, but I'm sure that it is installed

Read all the suggestions above in the answer to the analogous question about OpenGL in section 2.2; they all apply equally well to Motif. (The main header file to look for in the "include" directory is "Xm/Xm.h").

3  Platforms

3.1  What platforms have binary downloads available?

SGI Irix, Linux, FreeBSD, Solaris, SunOS, HP, IBM RS/6000, DEC Alpha

3.2  There isn't a binary for my workstation. Is there hope?

Certainly. If your workstation has the X Window System, OpenGL, Motif, and an ANSI (ISO) C compiler, you can compile geomview from the source code distribution at http://www.geomview.org/download.
Note that there is a free version of OpenGL called Mesa (http://www.mesa3d.org) which runs in software on most of the free Unixes. See that page for details on the ongoing efforts to incorporate hardware support for some of the popular graphics cards.
Note also that there is a free version of Motif called lesstif (www.lesstif.org) http://www.lesstif.org/.
The INSTALL http://www.geomview.org/docs/INSTALL file has instructions about how to port to new architectures. If you have problems, send mail to software@geomview.org. If you succeed, we would appreciate receiving a copy of your "makefile/mk.whatever" and hearing about what source modifications were necessary. Ideally we'd also like to include your binaries in our precompiled distribution list.

3.3  Why isn't there a Windows version?

There is not a native version of Geomview for Microsoft Windows. The main reason for this is that at the time when Geomview was written, personal computers were not fast enough to make interactive 3D graphics feasible so we focused our efforts on Unix workstations. By the time fast-enough PCs came around, the Geometry Center, where Geomview was developed, was in the process of being closed. The staff started work on a port to Windows but was not able to finish it before the Center shut down.
Geomview can run under Cygwin http://www.cygwin.com, which provides Windows with a Unix-alike environment. See Geomview for Windows? http://www.geomview.org/windows/ for more information.
If you would like to see a version of Geomview for Windows, you can contribute to its development in several ways. See Contributing to Geomview http://www.geomview.org/contributing for details.

3.4  How fast does Geomview run on various platforms?

The current speedtest result file http://www.geomview.org/docs/speeds is now quite out of date. You can test Geomview on your own platform using the files found in data/speedtests. Please contribute your timings back to us so that we can update our master file with results for modern machines.

3.5  I have access to an X11 and SGI workstation. Which version should I use?

The SGI version will almost always be significantly faster, due to hardware support for 3D graphics. For example, a Sun Sparcstation 10 is slower than an Indy (SGI's old entry level machine). In the future there might be hardware support for certain OpenGL graphics cards available on some of the PC Unixes.

3.6  What happened to the NeXT Quick Renderman version?

We no longer distribute the NeXTStep/OpenStep version of Geomview, which used the Quick Renderman graphics library. We did this just to simplify code base maintenance after version 1.5.0. Fat binaries for Motorola, Intel, and HP-PA architectures for version 1.5.0 are still available in http://www.geomview.org/download/dist/geomview-1.5.0-next.tar.

3.7  What modules are shipped for which platforms with the current release?

We release almost all external modules for all platforms. The list of distributed modules is in the README file included in the distributions. If the module you want is in that list but doesn't appear in the modules list on main panel, Geomview probably wasn't installed properly. Note that there are additional modules written by others http://www.geomview.org/thirdparty which are not part of the main distribution. The modules supported in the most recent GNU/Linux version of Geomview (1.9.4) are:
MODULE DESCRIPTION
Animator flip through a sequence of objects
Antiprism models Create, transform, analyse, and visualise polyhedra
StageTools CenterStage, StageManager, StageStills, StageHand - lets you create Geomview objects using mathematical formulas
Clipboard save a single OOGL object to a clipboard
Clock an animated clock
Draw Boundary
Nose debugging/example for picking (see Geomview manual)
Orrery Solar System Visualization
The following modules use tcl/tk:
MODULE DESCRIPTION
StageTools CenterStage, StageManager, StageStills, StageHand - lets you create Geomview objects using mathematical formulas
The following utility programs are also included in the distribution:
UTILITY DESCRIPTION
anytooff convert one or many OOGL files into a single OFF file
anytoucd convert an OOGL file to UCD (AVS) format
bdy compute boundary of an object (helper for drawbdy)
bez2mesh dice BEZ file to list of MESHes
clip clip objects against plane/sphere/cylinder (helper for ginsu)
fd2ps xforms
fdesign xforms
hvectext generate vector text object
math2oogl convert Mathematica graphics to OOGL (helper for OOGL.m)
offconsol polylist vertex consolidator
oogl2rib convert OOGL to Renderman RIB format
oogl2vrml convert OOGL to VRML 1.0
oogl2vrml2
polymerge merge degenerate OFF vertices/edges/faces (to Evolver or OFF)
remotegv remotegv -help
togeomview send commands to geomview
ucdtooff convert UCD (AVS) format to OFF format
vrml2oogl convert VRML 1.0 to OOGL

4  Using Geomview

4.1  Why don't objects appear in the right places?

When objects aren't appearing where you think they should, it's probably because normalization is on by default. Normalization simply scales an object's bounding box to fit into a unit sphere, with the center of the bounding box translated to the origin. This is useful when examining a single object, as you can easily view the whole object without having to worry about how big it is. However, it also means that if you're loading multiple objects that are supposed to belong in the same coordinate system, all the objects will be scaled and placed at the origin. To turn off normalization, bring up the Appearance Panel. The normalization controls are in the lower-right quadrant of the panel. Select the "None" option. The alternate hotkey shortcut is '0N'.
To turn off normalization by default, customize Geomview like showed in http://www.geomview.org/docs/html/Customization.html by inserting the line (normalization allgeoms none) into a file called .geomview in your home directory.
When you turn off normalization your objects might seem to vanish. This is because the unnormalized objects do not lie in the camera's viewing cone. The easiest way to see everything is to choose the "World" object in the Object Browser, then click on "Look At" in the Tools Panel.

4.2  Why is everything centered and/or on top of each other?

See previous answer.

4.3  How can I display a collection of points?

The most efficient way to display points in Geomview is to use the VECT file format. This file format is mainly used for building shapes made out of lines but we can also use it to specify lines that contain only one vertex (i.e. points). Let's take a look at an example VECT file that describes 3 points colored red, green and blue:
        VECT
        3 3 3      # num. of polylines, num. of vertices, num. of colors.

        1 1 1      # num. of vertices in each of the 3 polylines,
                   # in this case only 1 for each since we are doing points.

        1 1 1      # num. of colors supplied for each polyline.

        -1 -.2 0   # Here are the coordinates of each point.
         1 -.2 0
         0  .9 0

        1 0 0 1    # Color for each vertex in RGBA format.
        0 1 0 1
        0 0 1 1
        
When loading this file into Geomview, you will probably need to turn off the bounding box (via the appearance panel), otherwise you may not be able to see the points.

4.4  How do I make the points larger?

By default, the thickness of lines and points in Geomview is 1. This may be okay for most lines, but it causes each point to occupy only one pixel on the computer screen. You can change line and point thickness by adding an appearance tag to the top your geometry file that looks like this:
appearance linewidth 4.
In this case, we have increased our line/point size to 4 and any points we have in our file will now appear as small disks. You can also change the line width using the Appearance panel. What Geomview actually does is render each point as a many sided polygon which approximates a disk.
If you want the points to appear as solid 3-dimensional objects, such as tiny spheres, you can use a completely different method for representing them: an INST object with multiple transforms. This lets you specify an arbitrary geometric shape to be used to represent the points. For example, the following file represents the three points (1.5, 2.0, 0.1), (1.0, 0.5, 0.2), and (0.5, 0.3, 0.2) using small cubes:
        INST
        geom {
          OFF
          8 6 12
          -0.05 -0.05 -0.05
           0.05 -0.05 -0.05
           0.05  0.05 -0.05
          -0.05  0.05 -0.05
          -0.05 -0.05  0.05
           0.05 -0.05  0.05
           0.05  0.05  0.05
          -0.05  0.05  0.05
          4 0 1 2 3
          4 4 5 6 7
          4 2 3 7 6
          4 0 1 5 4
          4 0 4 7 3
          4 1 2 6 5
        }
        transforms
        1 0 0 0  0 1 0 0  0 0 1 0  1.5 2.0 0.1 1
        1 0 0 0  0 1 0 0  0 0 1 0  1.0 0.5 0.2 1
        1 0 0 0  0 1 0 0  0 0 1 0  0.5 0.3 0.2 1
        #
        # these are the matrices:
        #
        # 1   0   0   0     1   0   0   0     1   0   0   0
        # 0   1   0   0     0   1   0   0     0   1   0   0
        # 0   0   1   0     0   0   1   0     0   0   1   0
        # 1.5 2.0 0.1 1     1.0 0.5 0.2 1     0.5 0.3 0.2 1
        
The OFF object between "geom {" and "}" is the cube. The three lines after the word "transforms" are 4x4 transforms, one for each point. Note that you can use any valid OOGL expression for the geometry; for example, if you want to use small dodecahedra to represent points, you could repace the above OFF object with the following, which references the dodecahedron object in the file dodec.off (distributed with Geomview), scaling it by 0.05:
        INST
        geom {
          INST
          geom { < dodec.off }
          transform
            .05   0   0   0
              0 .05   0   0
              0   0 .05   0
              0   0   0   1
        }
        transforms
        1 0 0 0 0 1 0 0 0 0 1 0    1.5 2.0 0.1  1
        1 0 0 0 0 1 0 0 0 0 1 0    1.0 0.5 0.7  1
        1 0 0 0 0 1 0 0 0 0 1 0    0.5 0.3 0.2  1
        
Be aware that the more complicated the geometry you use for your points, the longer it will take Geomview to refresh the window. This can be important if you're dealing with a large number of points, in which case you should stick to very simple point shapes or use the method of displaying points in - VECT - format.

4.5  How do I put text into a scene?

You have two options:
  • You can use the Labeler external module, which gives you a GUI for typing text and selecting the font: either vector or a polygonalized version of an installed font. However, you need to position the text in the 3D scene, either by hand or with some other module like Transformer.
  • You can use the hvectext command-line utility program for Hershey vector fonts, which does let you specify a position for the text. You would then need to load the resulting file into Geomview.
If you don't need the text to be a 3D object in the scene, you can create an image http://www.geomview.org/FAQ/answers.shtml#images or postscript http://www.geomview.org/FAQ/answers.shtml#ps file of the scene and then use an image editor such as Illustrator, Showcase, or XPaint to annotate it with text.

4.6  Can Geomview do volume visualization?

No, Geomview is intended to do surface visualization. You can either create an isosurface and then view it using Geomview, or use a volume visualization package. The free vtk http://www.vtk.org/ visualization toolkit has extensive support for volume visualization, as do commercial packages like AVS http://www.avs.com, Iris Explorer . http://www.nag.co.uk/Welcome\_IEC.html, or IBM Data Explorer . http://pic.dhe.ibm.com/infocenter/dataexpl/v8r2/index.jsp. Volvis http://labs.cs.sunysb.edu/labs/vislab/volvis/ is free software specifically for volume visualization.

4.7  Can Geomview do texture maps?

Yes, in release 1.6 and higher, but only in the OpenGL version, not in the X11 version.

4.8  Why can't Geomview read my OFF file?

This is probably due to a different interpretation of how an OFF should be written. Geomview indexes vertices starting at zero, while some other programs are known to start at one. The following C program will convert a plain one-indexed OFF to a zero-indexed OFF.
        #include <stdio.h>
        #include <string.h>
        #include <stdlib.h>
        int main(void) {
            char s[256];
            int v, f, i, n, t;
            gets(s);
            if (strcmp(s, "OFF")) {
                fprintf(stderr, "not an OFF\n");
                exit(1);
            }
            puts(s); gets(s); puts(s);
            sscanf(s, "%d %d %d", &v, &f, &i);
            for (i=0; i!=v; ) {
                gets(s);
                if (strlen(s)) {
                    puts(s); i++;
                }
            }
            for (i=0; i!=f; i++) {
                scanf("%d", &n);
                printf("\n%d", n);
                for (v=0; v!=n; v++) {
                    scanf("%d", &t);
                    printf(" %d", t-1);
                }
            }
            printf("\n");
            return 0;
        }
        

4.9  How can I animate a sequence of Geomview/OOGL files?

You might try using Animator, an external module that is distributed with all versions of Geomview. With Animator, you can tell Geomview to read in a sequence of OOGL files and then play through this sequence forwards, backwards and also in single frame steps using the VCR like interface 1.
To use Animator click on the Animator entry in Geomview's External Modules browser. If it does not appear in the browser, then Geomview has probably not been installed properly. For more information about Animator read the info panel available through the program or the man page (by typing man animate).

5  Output

5.1  How can I create a video animation (MPEG/ QuickTime/animated GIF)?

There are several variants of this question:
  • first variant
                > I would like to save a sequence of ppm snapshot files of a single
                > off object while it is rotating so that I can convert the sequence
                > into a movie. The only method I know of is to rotate the object
                > slightly with the mouse, stop the motion, and save each frame
                > individually. Is there a faster more automatic method, such as a
                > command script. If so, do you have a sample command script that I
                > could modify?
    	    
    
    Two options:
    • If the motion is axis-aligned, it's pretty easy to use the rotate and snapshot GCL commands together:
      (snapshot targetcam /tmp/foo%03d.rgb) (transform world world world rotate .1 0 0) (snapshot targetcam /tmp/foo%03d.rgb) (transform world world world rotate .1 0 0)
      and so on. The snapshot commanad auto-increments the filename.
    • But for a more complex motion than the simple rotation around the x axis that I have above, consider using StageTools, which is a suite of tools designed to help people easily make animations from Geomview. StageTools is included as a module in recent versions, but if you need to download it is available at http://www.geom.umn.edu/software/StageTools/.
  • second variant
                > I have used Geomview to view movies with the animation tool. How can
                > I convert that movie to another animated format (e.g. an animated
                > GIF) so that I can put it on display in a web page, viewable by
                > someone without Geomview?
    	    
    
    It's true that StageTools will do this and much more too. But there's also a very easy way to do this directly inside the Animate module: the Command function will run an arbitrary GCL command after each frame. So to automatically take snapshots at each frame, you'd hit the Command button and type something like (snapshot c0 /tmp/foo%03d.rgb) into the text field. Then when you hit play you'll see that it's now jerky since it's saving an image off to disk each time. You might want to turn on the "Once" radio button so that it stops after running through each frame once. Then you can use your program of choice to create an animated gif or quicktime movie from this bunch of image files. For instance, on the SGIs you could do this with "mediaconvert".

5.2  How can I save a picture of exactly what I see in a camera window?

Make sure that the camera window you want is the active one, then select the "Save" item of the "File" menu on the main panel (or use the ">" hotkey). In the panel that appears, there is a choice box that is set to Command by default. Select one of the snapshot options, enter the filename in the Selection input, and click "OK".
In the SGI version, you have three image snapshot choices: SGI screen, PPM screen, and PPM software. Both the screen choices literally save the onscreen pixels into a file, in either SGI (aka RGB) or PPM format. The PPM software choice will rerender the image into an offscreen buffer using the software renderer from the vanilla X version of Geomview. Thus, it might not be pixel by pixel identical to what you see.
In the X11 version, you have only the PPM choices.

5.3  How can I make a true PostScript file that looks good at multiple resolutions instead of just converting a bitmap into PostScript?

Make sure that the camera window you want is the active one, then select the "Save" item of the "File" menu on the main panel (or use the ">" hotkey). In the panel that appears, there is a choice box that is set to Command by default. Select the PostScript snapshot option, enter the filename in the Selection input, and click "OK".
This method has advantages and disadvantages, compared to saving an image bitmap. The advantage is that the result is resolution independent - you can print it on a high resolution printer and not see any jagged edges. The disadvantages are that our PostScript renderer can't do smooth shading and uses the painter's algorithm for hidden surface removal. The latter means that intersecting objects and some other ill-conditioned scenes will be drawn incorrectly, or even that closer objects will be drawn behind faraway objects. It often works, but not always.

5.4  Why does my PostScript snapshot look wrong?

See previous answer.

5.5  How can I make a high quality image with RenderMan?

If you have Photorealistic Renderman (a commercial product of Pixar), or BMRT (Blue Moon Rendering Toolkit, a public domain implementation), you can create high quality images with transparency and more accurate lighting in the SGI and X11 versions. To do this, bring up the Save panel and select "RMan [->tiff]" from the save options. Enter a filename and click "Ok". Bring up a shell window and change directory to where you saved the file. Type "render /filename/" (where /filename/ is the name you saved as). When this finishes, you will have an high quality image in "/filename/.tiff". To create a higher resolution image (to reduce jagged edges), edit the file you saved. There will be a line about fifteen lines down from the top that begins with "Format", i.e. "Format 450 450 1". The first two numbers are the resolution of the created image. Change these to what you like (you should keep the ratio of the numbers the same to avoid distortion), then render the file again.

6  X Specific Questions

6.1  How do I speed up the X11 version?

See the discussion of rendering options in the next question.

6.2  What do the Z-Buffer and Dithering controls in the Cameras panel do?

These control allow you to change how the X11 version renders objects. The dithering checkbox, which only appears when running on an eight bit display, allows you to turn dithering on and off. Dithering is the method by which Geomview uses a small set of colors (less than 217) to show any color you request. This is done by placing pixels of slightly different color next to each other and letting your eye blend them together. Unfortunately, it takes a fair bit of computing to do this. Turning it dithering off will speed up rendering, but colors used won't be exactly what you want. Depending upon your scene, this may be an acceptable tradeoff.
The Z-Buffer popup menu allows you to select between three different methods of hidden line/surface removal: z-buffering, depth sort, and none. Z-buffering is the most accurate and enables the near and far clipping planes. Depth sort uses less computing, but will be inaccurate if objects intersect (polygons will pop in front when they should be partially obscured) and in certain other circumstances (long, narrow polygons close to other polygons are one example). Depending on your scene, using this method could look just the same as z-buffering but be much faster. The "None" option turns off all hidden line/surface removal. This is only recommended for a scene which consists of just lines in one color.

6.3  What does "Not enough colors available. Using private colormap" mean?

This happens when using the X11 version on an eight bit display (currently common on workstations). An eight bit display can only show 256 colors simultaneously. These colors are shared by all the programs running. Once a colorcell has been allocated by an application, its color is fixed. Geomview tries to grab many colors when it starts. If it fails to get them, it prints this message and uses a private colormap. A private colormap means that Geomview now has access to all 256 colorcells. Unfortunately, these colors will only be displayed when the cursor is inside one of Geomview's windows. The switching of colormaps when the cursor enters and leaves the windows will give a technicolor look to the rest of the display.
If you don't like the technicolor effect, you will have to quit the programs which are using up colormap space. Examples of programs which use lots of colormap space are background pictures, image viewers, visualization software, and WWW browsers.

6.4  What does "Shared memory unavailable, using fallback display method" mean?

The X11 version of Geomview uses the shared memory extension to move images quickly between the program and the X server. However, this method of communicating with the X server only works when running Geomview on the same machine as the display. If Geomview can't use shared memory, it prints this message and goes back to using standard X calls. Everything will work the same, it will just run much slower, especially if you're running over the network.

6.5  Why do I get compiler errors about including files Xm/*.h?

You're trying to compile the X11 version and the compiler can't find the Motif header files. If you have Motif but the headers are in a nonstandard place, change the "SYSCOPTS" in your makefiles/mk.$MACHTYPE file. If you don't have Motif, you won't be able to compile Geomview. In this case, use one of the binary distributions, if you can.

Footnotes:

1Note added by Jorge Barros de Abreu: the VCR changes to avifile http://avifile.sourceforge.net/. We have also kino and muan.


File translated from TEX by TTH, version 4.03.
On 7 Jun 2013, 05:20.
geomview-1.9.5/doc/FAQ/FAQ.tex0000644000175000017500000010656412310110176012602 00000000000000\documentclass[12pt,a4paper]{article} \usepackage[linktocpage]{hyperref} \begin{document} \vspace*{6cm} \huge \begin{center} FAQ\\ Geomview \end{center} \normalsize \newpage \tableofcontents \newpage \section{General Questions} \subsection{What is Geomview?} A general purpose interactive viewing program for Unix. It is used mostly for 3D graphics but can display data in 2D and 4D as well. See the overview \url{http://www.geomview.org/overview} for more general comments about Geomview. \subsection{How do I download Geomview?} Geomview is available for free from \url{http://www.geomview.org/download}. There are binary distributions for Linux, FreeBSD, SGI, Sun SPARC, HP-UX, IBM RS/6000, DEC Alpha, and NeXT machines, as well as a source code distribution. You can also download it via anonymous ftp from \url{ftp://ftp.geomview.org/pub} Geomview is free software, but we like to hear from people using it. Please send us mail using register@geomview.org telling us what you're doing with it. \subsection{What Geomview documentation is available?} See the Documentation \url{http://www.geomview.org/docs} part of this web site. \subsection{How can I get in touch with other Geomview users?} There is a ``geomview-users'' mailing list for people using geomview that can be used for communication between users regarding geomview problems, questions, experiences, etc. The geomview authors are also a part of this list and will respond to questions posted to it. We also use this list to make announcements about new releases and other things of interest to users. To join the list, send an empty note with 'subscribe' in the subject line to geomview-users-request@lists.sourceforge.net , or visit the list web page at:\\ \url{http://lists.sourceforge.net/mailman/listinfo/geomview-users} \\ See also the list of third party software and projects:\\ \url{http://www.geomview.org/thirdparty}. \section{Configuration/Installation/\\ Execution Problems} \subsection{The checkboxes and certain other GUI widgets are either \\ absent from Geomview's panels, or don't work when I compile \\ the latest version. What's up?} This problems seems to be associated with recent versions of Lesstif (e.g. 0.91.x), at least on GNU/Linux. I don't know if it's a problem with Lesstif itself, or if something is wrong with the way Geomview uses Lesstif. In the meantime, if you experience this problem, I suggest compiling Geomview with Open Motif instead of Lesstif. There's a lightweight binary distribution of Open Motif 2.1.30 available from the Geomview download page \url{http://www.geomview.org/download}, with instructions for using it with Geomview. Or, you can get the full Open Motif distribution (source or binary) from either \url{http://www.opengroup.org/motif} or ..............................\\ \url{http://www.openmotif.com}. If you're familiar with Lesstif and know what might cause this problem (and especially if you know how to fix it!), please email me (mbp at geomtech.com). \subsection{configure claims it can't find OpenGl on my system, but I'm sure that it is installed} \label{aswer:OpenGl} \begin{itemize} \item Make sure you passed the argument ``$--$with-opengl=DIR'' to configure, where DIR is the directory containing your OpenGL installation. DIR should be the absolute path to a directory containing subdirectories named ``include'' and ``lib''. The ``include'' subdir should in turn include a subdir called ``GL'' that has the header file ``gl.h'' (as well as other header files) in it. The ``lib'' directory should contain the GL library (.so) files. \item Sometimes 'configure' will incorrectly report that OpenGl is missing when in fact OpenGl is present, but the test for it fails for some other reason, such as some missing dependent header file or library. For example, if your installation of X window is screwed up or incomplete, it can confuse the tests that 'configure' does for OpenGl. There are two places to look for clues about this: \begin{itemize} \item The output from 'configure' itself --- look at the lines related to checking for X window, in particular. If X was not found, or couldn't be linked with, then that is probably the problem. \item The file 'config.log' that 'configure' writes as it runs. This file contains all the gory details about the tests that 'configure' is doing. It'll have error messages that may indicate why certain tests fail. IMPORTANT note about reading 'config.log': many of configure's tests involve loops which try several possibilities --- for example several possible locations for a header file. 'configure' will write a little program and try to compile it once for each of these locations, until it finds one that works. For each one that doesn't work, there will be error messages in the 'config.log' file. When reading 'config.log', be sure to look for ALL these test, not just the first one, in trying to decide why a test is failing. \end{itemize} \item If the output from 'configure', or the contents of 'config.log', suggest that some parts of X can't be found (for example if it can't find certain X header files, like ``X11/X.h'' or ``X11/Intrinsic.h''), then the problem could be that you have not installed the X window development package for your system. Some default Linux distributions include the runtime X package but not the development package(s). Make sure you've installed whatever packages are necessary for X development work as well as the runtime X package(s). \item If 'configure' claims that it can't link with -lGL (or -lGLU) but you are sure it's there, find the directory containing your libGL.so.* and libGLU.so.* files; call this directory DIR. DIR will probably contain one or more files with names like libGL.so.VERSION and libGLU.so.VERSI\\ ON, where VERSION is some version number, such as ``1.2.0'' or ``1.2.030200''. It should also contain entries named simply libGL.so and libGLU.so, with no VERSION suffix; these are usually symbolic links to corresponding files with version suffixes. For example, on my system I have \begin{verbatim} libGL.so -> libGL.so.1.2.030200 libGLU.so -> libGLU.so.1.2.030200 \end{verbatim} If the links (or files) libGL.so and libGLU.so are not present, create them by making symbolic links to the corresponding file with the highest version number. I do not understand why these links would be missing in some installations of OpenGL, because it's my understanding that they have to be there for programs to link properly. I admit however that I don't understand all the .so and .so.VERSION stuff, so it could be that these links aren't really necessary and that some change in Geomview's configure script or Makefiles could eliminate the need for them. If you know a way to do this, please let me [mbp@geomtech.com] know. \end{itemize} \subsection{configure claims it can't find Motif (or Lesstif or OpenMotif) on my system, but I'm sure that it is installed } Read all the suggestions above in the answer to the analogous question about OpenGL in section \ref{aswer:OpenGl}; they all apply equally well to Motif. (The main header file to look for in the ``include'' directory is ``Xm/Xm.h''). \section{Platforms} \subsection{What platforms have binary downloads available?} SGI Irix, Linux, FreeBSD, Solaris, SunOS, HP, IBM RS/6000, DEC Alpha \subsection{There isn't a binary for my workstation. Is there hope?} Certainly. If your workstation has the X Window System, OpenGL, Motif, and an ANSI (ISO) C compiler, you can compile geomview from the source code distribution at \url{http://www.geomview.org/download}. Note that there is a free version of OpenGL called Mesa\\ (\url{http://www.mesa3d.org})\\ which runs in software on most of the free Unixes. See that page for details on the ongoing efforts to incorporate hardware support for some of the popular graphics cards. Note also that there is a free version of Motif called lesstif (www.lesstif.org) \url{http://www.lesstif.org/}. The INSTALL \url{http://www.geomview.org/docs/INSTALL} file has instructions about how to port to new architectures. If you have problems, send mail to software@geomview.org. If you succeed, we would appreciate receiving a copy of your ``makefile/mk.whatever'' and hearing about what source modifications were necessary. Ideally we'd also like to include your binaries in our precompiled distribution list. \subsection{Why isn't there a Windows version?} There is not a native version of Geomview for Microsoft Windows. The main reason for this is that at the time when Geomview was written, personal computers were not fast enough to make interactive 3D graphics feasible so we focused our efforts on Unix workstations. By the time fast-enough PCs came around, the Geometry Center, where Geomview was developed, was in the process of being closed. The staff started work on a port to Windows but was not able to finish it before the Center shut down. Geomview can run under Cygwin \url{http://www.cygwin.com}, which provides Windows with a Unix-alike environment. See Geomview for Windows? \url{http://www.geomview.org/windows/} for more information. If you would like to see a version of Geomview for Windows, you can contribute to its development in several ways. See Contributing to Geomview \url{http://www.geomview.org/contributing} for details. \subsection{How fast does Geomview run on various platforms?} The current speedtest result file \url{http://www.geomview.org/docs/speeds} is now quite out of date. You can test Geomview on your own platform using the files found in data/speedtests. Please contribute your timings back to us so that we can update our master file with results for modern machines. \subsection{I have access to an X11 and SGI workstation. Which version should I use?} The SGI version will almost always be significantly faster, due to hardware support for 3D graphics. For example, a Sun Sparcstation 10 is slower than an Indy (SGI's old entry level machine). In the future there might be hardware support for certain OpenGL graphics cards available on some of the PC Unixes. \subsection{What happened to the NeXT Quick Renderman version?} We no longer distribute the NeXTStep/OpenStep version of Geomview, which used the Quick Renderman graphics library. We did this just to simplify code base maintenance after version 1.5.0. Fat binaries for Motorola, Intel, and HP-PA architectures for version 1.5.0 are still available in\\ \url{http://www.geomview.org/download/dist/geomview-1.5.0-next.tar}. \subsection{What modules are shipped for which platforms with the current release?} We release almost all external modules for all platforms. The list of distributed modules is in the README file included in the distributions. If the module you want is in that list but doesn't appear in the modules list on main panel, Geomview probably wasn't installed properly. Note that there are additional modules written by others \url{http://www.geomview.org/thirdparty} which are not part of the main distribution. The modules supported in the most recent GNU/Linux version of Geomview (1.9.4) are:\\ \begin{center} \begin{tabular}{|l|p{8cm}|} \hline MODULE & DESCRIPTION \\ \hline Animator & flip through a sequence of objects \\ \hline Antiprism models & Create, transform, analyse, and visualise polyhedra\\ \hline StageTools & CenterStage, StageManager, StageStills, StageHand - lets you create Geomview objects using mathematical formulas\\ \hline Clipboard & save a single OOGL object to a clipboard \\ \hline Clock & an animated clock \\ \hline Draw Boundary & \\ \hline Nose & debugging/example for picking (see Geomview manual)\\ \hline Orrery & Solar System Visualization \\ \hline \end{tabular} \end{center} The following modules use tcl/tk: \begin{center} \begin{tabular}{|l|p{8cm}|} \hline MODULE & DESCRIPTION \\ \hline StageTools & CenterStage, StageManager, StageStills, StageHand - lets you create Geomview objects using mathematical formulas\\ \hline \end{tabular} \end{center} The following utility programs are also included in the distribution: %%fd2ps fdesign oogl2vrml2 remotegv \begin{center} \begin{tabular}{|l|p{8cm}|} \hline UTILITY & DESCRIPTION \\ \hline anytooff & convert one or many OOGL files into a single OFF file \\ \hline anytoucd & convert an OOGL file to UCD (AVS) format \\ \hline bdy & compute boundary of an object (helper for drawbdy) \\ \hline bez2mesh & dice BEZ file to list of MESHes \\ \hline clip & clip objects against plane/sphere/cylinder (helper for ginsu) \\ \hline fd2ps & xforms \\ \hline fdesign & xforms \\ \hline hvectext & generate vector text object \\ \hline math2oogl & convert Mathematica graphics to OOGL (helper for OOGL.m) \\ \hline offconsol & polylist vertex consolidator \\ \hline oogl2rib & convert OOGL to Renderman RIB format \\ \hline oogl2vrml & convert OOGL to VRML 1.0 \\ \hline oogl2vrml2 & \\ \hline polymerge & merge degenerate OFF vertices/edges/faces (to Evolver or OFF) \\ \hline remotegv & remotegv $--$help \\ \hline togeomview & send commands to geomview \\ \hline ucdtooff & convert UCD (AVS) format to OFF format \\ \hline vrml2oogl & convert VRML 1.0 to OOGL \\ \hline \end{tabular} \end{center} \section{Using Geomview} \subsection{Why don't objects appear in the right places?} When objects aren't appearing where you think they should, it's probably because normalization is on by default. Normalization simply scales an object's bounding box to fit into a unit sphere, with the center of the bounding box translated to the origin. This is useful when examining a single object, as you can easily view the whole object without having to worry about how big it is. However, it also means that if you're loading multiple objects that are supposed to belong in the same coordinate system, all the objects will be scaled and placed at the origin. To turn off normalization, bring up the Appearance Panel. The normalization controls are in the lower-right quadrant of the panel. Select the ``None'' option. The alternate hotkey shortcut is '0N'. To turn off normalization by default, customize Geomview like showed in \url{http://www.geomview.org/docs/html/Customization.html} by inserting the line (normalization allgeoms none) into a file called .geomview in your home directory. When you turn off normalization your objects might seem to vanish. This is because the unnormalized objects do not lie in the camera's viewing cone. The easiest way to see everything is to choose the ``World'' object in the Object Browser, then click on ``Look At'' in the Tools Panel. \subsection{Why is everything centered and/or on top of each other?} See previous answer. \subsection{How can I display a collection of points?} The most efficient way to display points in Geomview is to use the VECT file format. This file format is mainly used for building shapes made out of lines but we can also use it to specify lines that contain only one vertex (i.e. points). Let's take a look at an example VECT file that describes 3 points colored red, green and blue: \tiny \begin{verbatim} VECT 3 3 3 # num. of polylines, num. of vertices, num. of colors. 1 1 1 # num. of vertices in each of the 3 polylines, # in this case only 1 for each since we are doing points. 1 1 1 # num. of colors supplied for each polyline. -1 -.2 0 # Here are the coordinates of each point. 1 -.2 0 0 .9 0 1 0 0 1 # Color for each vertex in RGBA format. 0 1 0 1 0 0 1 1 \end{verbatim} \normalsize When loading this file into Geomview, you will probably need to turn off the bounding box (via the appearance panel), otherwise you may not be able to see the points. \subsection{How do I make the points larger?} By default, the thickness of lines and points in Geomview is 1. This may be okay for most lines, but it causes each point to occupy only one pixel on the computer screen. You can change line and point thickness by adding an appearance tag to the top your geometry file that looks like this: appearance { linewidth 4. } In this case, we have increased our line/point size to 4 and any points we have in our file will now appear as small disks. You can also change the line width using the Appearance panel. What Geomview actually does is render each point as a many sided polygon which approximates a disk. If you want the points to appear as solid 3-dimensional objects, such as tiny spheres, you can use a completely different method for representing them: an INST object with multiple transforms. This lets you specify an arbitrary geometric shape to be used to represent the points. For example, the following file represents the three points (1.5, 2.0, 0.1), (1.0, 0.5, 0.2), and (0.5, 0.3, 0.2) using small cubes: \begin{verbatim} INST geom { OFF 8 6 12 -0.05 -0.05 -0.05 0.05 -0.05 -0.05 0.05 0.05 -0.05 -0.05 0.05 -0.05 -0.05 -0.05 0.05 0.05 -0.05 0.05 0.05 0.05 0.05 -0.05 0.05 0.05 4 0 1 2 3 4 4 5 6 7 4 2 3 7 6 4 0 1 5 4 4 0 4 7 3 4 1 2 6 5 } transforms 1 0 0 0 0 1 0 0 0 0 1 0 1.5 2.0 0.1 1 1 0 0 0 0 1 0 0 0 0 1 0 1.0 0.5 0.2 1 1 0 0 0 0 1 0 0 0 0 1 0 0.5 0.3 0.2 1 # # these are the matrices: # # 1 0 0 0 1 0 0 0 1 0 0 0 # 0 1 0 0 0 1 0 0 0 1 0 0 # 0 0 1 0 0 0 1 0 0 0 1 0 # 1.5 2.0 0.1 1 1.0 0.5 0.2 1 0.5 0.3 0.2 1 \end{verbatim} The OFF object between ``geom \{'' and ``\}'' is the cube. The three lines after the word ``transforms'' are 4x4 transforms, one for each point. Note that you can use any valid OOGL expression for the geometry; for example, if you want to use small dodecahedra to represent points, you could repace the above OFF object with the following, which references the dodecahedron object in the file dodec.off (distributed with Geomview), scaling it by 0.05: \begin{verbatim} INST geom { INST geom { < dodec.off } transform .05 0 0 0 0 .05 0 0 0 0 .05 0 0 0 0 1 } transforms 1 0 0 0 0 1 0 0 0 0 1 0 1.5 2.0 0.1 1 1 0 0 0 0 1 0 0 0 0 1 0 1.0 0.5 0.7 1 1 0 0 0 0 1 0 0 0 0 1 0 0.5 0.3 0.2 1 \end{verbatim} Be aware that the more complicated the geometry you use for your points, the longer it will take Geomview to refresh the window. This can be important if you're dealing with a large number of points, in which case you should stick to very simple point shapes or use the method of displaying points in |VECT| format. \subsection{How do I put text into a scene?} You have two options: \begin{itemize} \item You can use the Labeler external module, which gives you a GUI for typing text and selecting the font: either vector or a polygonalized version of an installed font. However, you need to position the text in the 3D scene, either by hand or with some other module like Transformer. \item You can use the hvectext command-line utility program for Hershey vector fonts, which does let you specify a position for the text. You would then need to load the resulting file into Geomview. \end{itemize} If you don't need the text to be a 3D object in the scene, you can create an image \url{http://www.geomview.org/FAQ/answers.shtml#images} or postscript \url{http://www.geomview.org/FAQ/answers.shtml#ps} file of the scene and then use an image editor such as Illustrator, Showcase, or XPaint to annotate it with text. \subsection{Can Geomview do volume visualization?} No, Geomview is intended to do surface visualization. You can either create an isosurface and then view it using Geomview, or use a volume visualization package. The free vtk \url{http://www.vtk.org/} visualization toolkit has extensive support for volume visualization, as do commercial packages like AVS \url{http://www.avs.com}, Iris Explorer .............................................................\\ \url{http://www.nag.co.uk/Welcome\_IEC.html}, or IBM Data Explorer ..........\\ \url{http://pic.dhe.ibm.com/infocenter/dataexpl/v8r2/index.jsp}. Volvis \url{http://labs.cs.sunysb.edu/labs/vislab/volvis/} is free software specifically for volume visualization. \subsection{Can Geomview do texture maps?} Yes, in release 1.6 and higher, but only in the OpenGL version, not in the X11 version. \subsection{Why can't Geomview read my OFF file?} This is probably due to a different interpretation of how an OFF should be written. Geomview indexes vertices starting at zero, while some other programs are known to start at one. The following C program will convert a plain one-indexed OFF to a zero-indexed OFF. \begin{verbatim} #include #include #include int main(void) { char s[256]; int v, f, i, n, t; gets(s); if (strcmp(s, "OFF")) { fprintf(stderr, "not an OFF\n"); exit(1); } puts(s); gets(s); puts(s); sscanf(s, "%d %d %d", &v, &f, &i); for (i=0; i!=v; ) { gets(s); if (strlen(s)) { puts(s); i++; } } for (i=0; i!=f; i++) { scanf("%d", &n); printf("\n%d", n); for (v=0; v!=n; v++) { scanf("%d", &t); printf(" %d", t-1); } } printf("\n"); return 0; } \end{verbatim} \subsection{How can I animate a sequence of Geomview/OOGL files?} You might try using Animator, an external module that is distributed with all versions of Geomview. With Animator, you can tell Geomview to read in a sequence of OOGL files and then play through this sequence forwards, backwards and also in single frame steps using the VCR like interface \footnote{Note added by Jorge Barros de Abreu: the VCR changes to avifile \url{http://avifile.sourceforge.net/}. We have also kino and muan.}. To use Animator click on the Animator entry in Geomview's External Modules browser. If it does not appear in the browser, then Geomview has probably not been installed properly. For more information about Animator read the info panel available through the program or the man page (by typing man animate). \section{Output} \subsection{How can I create a video animation (MPEG/\\ QuickTime/animated GIF)?} There are several variants of this question: \begin{itemize} \item first variant \\ \tiny \begin{verbatim} > I would like to save a sequence of ppm snapshot files of a single > off object while it is rotating so that I can convert the sequence > into a movie. The only method I know of is to rotate the object > slightly with the mouse, stop the motion, and save each frame > individually. Is there a faster more automatic method, such as a > command script. If so, do you have a sample command script that I > could modify? \end{verbatim} \normalsize Two options: \begin{itemize} \item If the motion is axis-aligned, it's pretty easy to use the rotate and snapshot GCL commands together: (snapshot targetcam /tmp/foo\%03d.rgb) (transform world world world rotate .1 0 0) (snapshot targetcam /tmp/foo\%03d.rgb) (transform world world world rotate .1 0 0) and so on. The snapshot commanad auto-increments the filename. \item But for a more complex motion than the simple rotation around the x axis that I have above, consider using StageTools, which is a suite of tools designed to help people easily make animations from Geomview. StageTools is included as a module in recent versions, but if you need to download it is available at \url{http://www.geom.umn.edu/software/StageTools/}. \end{itemize} \item second variant \\ \tiny \begin{verbatim} > I have used Geomview to view movies with the animation tool. How can > I convert that movie to another animated format (e.g. an animated > GIF) so that I can put it on display in a web page, viewable by > someone without Geomview? \end{verbatim} \normalsize It's true that StageTools will do this and much more too. But there's also a very easy way to do this directly inside the Animate module: the Command function will run an arbitrary GCL command after each frame. So to automatically take snapshots at each frame, you'd hit the Command button and type something like (snapshot c0 /tmp/foo\%03d.rgb) into the text field. Then when you hit play you'll see that it's now jerky since it's saving an image off to disk each time. You might want to turn on the ``Once'' radio button so that it stops after running through each frame once. Then you can use your program of choice to create an animated gif or quicktime movie from this bunch of image files. For instance, on the SGIs you could do this with ``mediaconvert''. \end{itemize} \subsection{How can I save a picture of exactly what I see in a camera window?} Make sure that the camera window you want is the active one, then select the ``Save'' item of the ``File'' menu on the main panel (or use the ``>'' hotkey). In the panel that appears, there is a choice box that is set to Command by default. Select one of the snapshot options, enter the filename in the Selection input, and click ``OK''. In the SGI version, you have three image snapshot choices: SGI screen, PPM screen, and PPM software. Both the screen choices literally save the onscreen pixels into a file, in either SGI (aka RGB) or PPM format. The PPM software choice will rerender the image into an offscreen buffer using the software renderer from the vanilla X version of Geomview. Thus, it might not be pixel by pixel identical to what you see. In the X11 version, you have only the PPM choices. \subsection{How can I make a true PostScript file that looks good at multiple resolutions instead of just converting a bitmap into PostScript?} Make sure that the camera window you want is the active one, then select the ``Save'' item of the ``File'' menu on the main panel (or use the ``>'' hotkey). In the panel that appears, there is a choice box that is set to Command by default. Select the PostScript snapshot option, enter the filename in the Selection input, and click ``OK''. This method has advantages and disadvantages, compared to saving an image bitmap. The advantage is that the result is resolution independent -- you can print it on a high resolution printer and not see any jagged edges. The disadvantages are that our PostScript renderer can't do smooth shading and uses the painter's algorithm for hidden surface removal. The latter means that intersecting objects and some other ill-conditioned scenes will be drawn incorrectly, or even that closer objects will be drawn behind faraway objects. It often works, but not always. \subsection{Why does my PostScript snapshot look wrong?} See previous answer. \subsection{How can I make a high quality image with RenderMan?} If you have Photorealistic Renderman (a commercial product of Pixar), or BMRT (Blue Moon Rendering Toolkit, a public domain implementation), you can create high quality images with transparency and more accurate lighting in the SGI and X11 versions. To do this, bring up the Save panel and select ``RMan [->tiff]'' from the save options. Enter a filename and click ``Ok''. Bring up a shell window and change directory to where you saved the file. Type ``render /filename/'' (where /filename/ is the name you saved as). When this finishes, you will have an high quality image in ``/filename/.tiff''. To create a higher resolution image (to reduce jagged edges), edit the file you saved. There will be a line about fifteen lines down from the top that begins with ``Format'', i.e. ``Format 450 450 1''. The first two numbers are the resolution of the created image. Change these to what you like (you should keep the ratio of the numbers the same to avoid distortion), then render the file again. \section{X Specific Questions} \subsection{How do I speed up the X11 version?} See the discussion of rendering options in the next question. \subsection{What do the Z-Buffer and Dithering controls in the Cameras panel do?} These control allow you to change how the X11 version renders objects. The dithering checkbox, which only appears when running on an eight bit display, allows you to turn dithering on and off. Dithering is the method by which Geomview uses a small set of colors (less than 217) to show any color you request. This is done by placing pixels of slightly different color next to each other and letting your eye blend them together. Unfortunately, it takes a fair bit of computing to do this. Turning it dithering off will speed up rendering, but colors used won't be exactly what you want. Depending upon your scene, this may be an acceptable tradeoff. The Z-Buffer popup menu allows you to select between three different methods of hidden line/surface removal: z-buffering, depth sort, and none. Z-buffering is the most accurate and enables the near and far clipping planes. Depth sort uses less computing, but will be inaccurate if objects intersect (polygons will pop in front when they should be partially obscured) and in certain other circumstances (long, narrow polygons close to other polygons are one example). Depending on your scene, using this method could look just the same as z-buffering but be much faster. The ``None'' option turns off all hidden line/surface removal. This is only recommended for a scene which consists of just lines in one color. \subsection{What does ``Not enough colors available. Using private colormap'' mean?} This happens when using the X11 version on an eight bit display (currently common on workstations). An eight bit display can only show 256 colors simultaneously. These colors are shared by all the programs running. Once a colorcell has been allocated by an application, its color is fixed. Geomview tries to grab many colors when it starts. If it fails to get them, it prints this message and uses a private colormap. A private colormap means that Geomview now has access to all 256 colorcells. Unfortunately, these colors will only be displayed when the cursor is inside one of Geomview's windows. The switching of colormaps when the cursor enters and leaves the windows will give a technicolor look to the rest of the display. If you don't like the technicolor effect, you will have to quit the programs which are using up colormap space. Examples of programs which use lots of colormap space are background pictures, image viewers, visualization software, and WWW browsers. \subsection{What does ``Shared memory unavailable, using fallback display method'' mean?} The X11 version of Geomview uses the shared memory extension to move images quickly between the program and the X server. However, this method of communicating with the X server only works when running Geomview on the same machine as the display. If Geomview can't use shared memory, it prints this message and goes back to using standard X calls. Everything will work the same, it will just run much slower, especially if you're running over the network. \subsection{Why do I get compiler errors about including files Xm/*.h?} You're trying to compile the X11 version and the compiler can't find the Motif header files. If you have Motif but the headers are in a nonstandard place, change the ``SYSCOPTS'' in your makefiles/mk.\${MACHTYPE} file. If you don't have Motif, you won't be able to compile Geomview. In this case, use one of the binary distributions, if you can. \end{document}geomview-1.9.5/doc/FAQ/README0000644000175000017500000000043112310110176012313 00000000000000The FAQ original english like in http://geomview.org/FAQ - FAQ.html The FAQ.html file ported to tex format...................- FAQ.tex The FAQ pt_BR............................................- FAQ-pt_BR.tex The FAQ pt_BR in html format.............................- FAQ-pt_BR.htmlgeomview-1.9.5/doc/figs/0000755000175000017500000000000012310165605012045 500000000000000geomview-1.9.5/doc/figs/ap.ps0000644000175000017500000021331412310110173012723 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: noname.ps %%Pages: 1 %%BoundingBox: 227 289 384 472 %%EndComments /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 326 string def %%EndProlog %%Page: 1 1 gsave 227.76 289.56 translate 156.48 182.88 scale 326 381 8 [ 326 0 0 -381 0 381 ] { picstr readstring } image 80008000ba000000e3d6019d5680d680d6fcd6019d56e2d6019d007f00d6 d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656 d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d45d69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6d69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d56000300d69d d6e59d0256d6d6809d809dfd9d0256d6d6e59d02569d000200d6d6e49d01 56d6809d809dfc9d0156d6e39d0156007f00d69dd69d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d567f9d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d56459d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569dd69d569d007f00d6d69d9d9d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d7f569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d45569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569dd69d9d9d56000600d69dd69d569d80008000c80006d6 9dd69d569d000700d6d69d9d9d560080d680d6cad60700d6d69d9d9d5600 7f00d69dd69d569d00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd6459dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9dd6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd600d69dd69d569d0008 00d6d69d9d9d5600d6ea9d0156d6809d959d0256d6d6ea9d0156d6ea9d08 5600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6d6809d979d 025656d6e99d0556d6d69d9d9df200fc9d085600d69dd69d569d000800d6 d69d9d9d5600d6eb9d025656d6ef9d010000809da89d0256d6d6eb9d0256 56d6fc9d0000f49d0d009d9d9d565600d6d69d9d9d56000900d69dd69d56 9d00d6d6eb9d0256d6d6f19dfd00809da99d025656d6e99d0656d6d69d9d 9d00f49d0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb 9d025656d6f19d0400009d0000809da99d0256d6d6eb9d025656d6fc9d00 00f49d0d00009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb 9d0256d6d6f29d1600009d00009d9d9d00009d0000009d9d9d00009d0000 00fc9dfc00fc9dfc00fd9d0600009d00009d9dfc00fd9d0500009d000000 fc9dfc00fc9dfc00809df39d025656d6e99d0656d6d69d9d9d00f49d0d00 009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6f2 9d2a00009d9d00009d9d9d0000009d9d00009d9d0000009d9d00009d9d00 009d9d00009d9d00009d9d00009d9dfb001f9d00009d9d00009d9d000000 9d9d00009d9d00009d9d00009d9d00009d9d0000809df39d0256d6d6eb9d 025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00d69dd6 9d569d00d6d69d9df000fd9d0256d6d6f39d2000009d9d00009d9d000000 9d9d9d00009d0000009d9d9d00009d00009d9d9d0000fa9d0500009d9d00 00f89d1a00009d9d00009d9d9d00009d00009d9d9d00009d00009d9d9d00 00809df49d025656d6f89dfc00f59d0656d6d69d9d9d00f49d0d00009d9d 9d5600d69dd69d569d000c00d6d69d9d9d5600d69d9d9d00f29d05009d9d 5656d6f39d0a00009d9d9d00009d9d0000fc9d0400009d0000fc9d020000 9dfa00fd9dfb00039d9d0000fb9dfb000c9d9d00009d9d9d00009d9d0000 fa9dfa00809df29d0256d6d6f99d04009d9d0000f79d025656d6fc9d0000 f49d0d00009d9d565600d6d69d9d9d56000c00d69dd69d569d00d6d69d9d 00f29d0600009d9d56d6d6f59df800149d9d00009d9d9d00009d9d00009d 9d9d00009d0000f99d0900009d9d00009d9d0000fc9d1100009d9d00009d 9d00009d9d9d00009d0000fa9d010000809dee9d025656d6f89d04009d9d 0000f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000b 00d6d69d9d9d5600d69d9d9def00039d5656d6f49d010000fc9d1600009d 9d00009d9d9d00009d9d00009d9d9d00009d0000fa9d2800009d9d9d0000 9d9d00009d9d9d00009d9d9d00009d9d00009d9d9d00009d00009d9d9d00 009d0000809ded9d0256d6d6f99dfb00f79d025656d6fc9d0000f49d0d00 009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6fc9df100049d 9d56d6d6f69d010000fb9d0200009dfc00049d00009d9dfc00169d00009d 9d00009d9d00009d9d00009d9d00009d9d0000fc9d1e00009d9d00009d9d 00009d9d9d00009d9d00009d9d00009d9d00009d9d0000809df29d025656 d6f79dfc00f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d56 9d000800d6d69d9d9d5600d6eb9d025656d6f59d010000fb9d1100009d00 009d0000009d9d9d00009d000000fc9dfc00fc9dfd00059d00009d0000fb 9dfd000d9d00009d00009d9d9d00009d9d9dfc00fc9dfc00809df09d0256 d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d560009 00d69dd69d569d00d6d6eb9d0256d6d6ec9d010000f99d010000809db69d 025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d 000800d6d69d9d9d5600d6eb9d025656d6ec9d010000f99d010000809db4 9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d 56000900d69dd69d569d00d6d6eb9d0256d6d6ed9d010000f99d01000080 9db59d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd6 9d569d000800d6d69d9d9d5600d6eb9d025656d6809d959d0256d6d6eb9d 025656d6fc9df1000b9d9d565600d6d69d9d9d56000900d69dd69d569d00 d6d6eb9d0256d6d6809d979d025656d6e99d0256d6d6fb9df300fd9d0856 00d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6809d959d0256 d6d6eb9d025656d6eb9d09565600d6d69d9d9d56007f00d69dd69d569d00 d69d9d569d569d569d569d569d569d569d569d569d569d56d6569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 7f9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d56459d569d569d569d569d569d5656d69d569d569d56 9d569d569d569d569d569d569d569d569d56d6569d569d569d569d569d56 9d569d569d569d569d569d5600d69dd69d569d0008009d569d9d9d56009d e956009d80569456009de856009de9560700d6d69d569d56000000fb5600 9d80008000c80001d69dfc56ff000000fcd6029d565680df80dfcadf0000 fad6ff000700d6d6d69d569d5680df80dfcbdf036400d69dfcd6ff000900 d6d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56000a00d69d d69d569d56dfdfafa9df80afd9afcbdf0700d69dd69d569d000a00d6d69d 9d9d5656dfdfafaadf006480afd9afccdf086400d6d69d9d9d56000c00d6 9dd69d569d56dfdfafdfdfadaf01646480afd9af01dfdfcfaf09646400d6 9dd69d569d000c00d6d69d9d9d5656dfdfafdfdfadaf01646480afd9af01 dfdfcfaf09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdfad af01646480afd9af01dfdfcfaf09646400d69dd69d569d000c00d6d69d9d 9d5656dfdfafdfdfadaf01646480afd9af01dfdfcfaf09646400d6d69d9d 9d56000c00d69dd69d569d56dfdfafdfdfadaf01646480afd9af01dfdfcf af09646400d69dd69d569d000c00d6d69d9d9d5656dfdfafdfdfadaf0164 6480afd9af01dfdfcfaf09646400d6d69d9d9d56000c00d69dd69d569d56 dfdfafdfdfadaf01646480afd9af01dfdfcfaf09646400d69dd69d569d00 0c00d6d69d9d9d5656dfdfafdfdff8affd00f1affd00faaff900d7af0164 64eeaff36480aff8af01dfdff5af0000faaf0300afaf00f9af0000edaf09 646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdff8af0000edaf 0000faaf0000fbaf010000e2af0000f7af016464eeaff46400dff9affd00 f0affd00f7affd00e2af0000f9af0000c8af01dfdff5af0000faaf0300af af00f9af0000edaf09646400d69dd69d569d000c00d6d69d9d9d5656dfdf afdfdff8af0000edaf0000faaf0000faaf0000e2af0000f7af016464eeaf 016464f7e201dfdff9af0000ecaf0000f9af060000afafaf0000e4af0000 f9af0000c8af01dfdff5af0000faaf0000f6af0000edaf09646400d6d69d 9d9d56000c00d69dd69d569d56dfdfafdfdff8af0000fcaffc000bafaf00 00afafaf0000afaf00faaf0000faaf0300afafaffc0002afaf00fbaf0200 afaffc00fdaf0100affb00f8af016464eeaf016464f7e201dfdff9af0000 ecaf0000f9af0000fbaf0000dcaf0000c8af01dfdff5af0000faaf0e00af af00afafaf000000af00afafaffc00f4af09646400d69dd69d569d000c00 d6d69d9d9d5656dfdfafdfdff8af1400afafaf0000afaf0000afaf00afaf af00afafaf00faaf0000fbaf0b00afafaf0000afaf0000af00fbaf0f00af 0000afaf0000afaf0000afafaf00f7af016464eeaf016464f7e201dfdff9 af0000fcaffc00fcaffc00fcaf0000faaf0000f9af0200af00fbaf0200af affc00fdaf1500af0000af00af0000af00afafaf000000af00afafaffc00 cfaf01dfdff5af0000faaf1300afaf00afaf0000afaf0000afaf0000afaf 0000f5af09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdff8 af0000f8af0600afafaf00af00fcaf0000faaffa00fcaf0000fcaf0a00af af00afafaf00afaf00fcaf0300afaf00fcaf0000f7af016464eeaf016464 f7e201dfdff9af1500afafaf0000afaf0000afaf0000afaf0000afafaf00 faaf0000f9af0200af00fbaf2400af0000afaf0000afaf0000afafaf0000 afafaf00afaf0000afaf0000afaf0000afaf0000d0af01dfdff5aff80005 afaf00afaf00fcaf0300afaf00fcaf0000f5af09646400d69dd69d569d00 0c00d6d69d9d9d5656dfdfafdfdff8af0000fcaffb00fcaf0000fbaf0000 faaf0000fbaf0300afafaffa0008afaf00afafaf00afaffa0002afaf00fc af0000f7af016464eeaf016464f7e201dfdff9af0000f8af0300afaf00fc af0400afafaf00faaf0000f9af0a00afaf00afafaf00afaf00fcaf0300af af00fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0000d0af01dfdff5 af0000faaf0600afaf00afaf00fcaf0200afaffa00f5af09646400d6d69d 9d9d56000c00d69dd69d569d56dfdfafdfdff8af0900afafaf0000afafaf 00fcaf0000fbaf0000faaf0000faaf0300afaf00f9af0700afafaf00afaf 00f9af0000fcaf0000f7af016464eeaf016464f7e201dfdff9af0000fcaf fb0002afaf00fcaf0400afafaf00faaf0000f9af0900afaf00afafaf00af affa0002afaf00fcaf0000fcaf0300afaf00fcaf0200afaffa00d0af01df dff5af0000faaf0600afaf00afaf00fcaf0300afaf00f0af09646400d69d d69d569d000c00d6d69d9d9d5656dfdfafdfdff8af0400afafaf00fcaf06 00afafaf00af00fcaf0000faaf0000faaf0300afaf00f8af0600af00afaf af00f9af0000fcaf0000f7af016464eeaf016464f7e201dfdff9af0c00af afaf0000afafaf00afaf00fcaf0400afafaf00faaf0000f9af0a00afaf00 afafaf00afaf00f9af0000fcaf0000fcaf0300afaf00fcaf0300afaf00cb af01dfdff5af0000faaf0600afaf00afaf00fcaf0300afaf00f0af096464 00d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdff8af1400afafaf00 00afaf0000afaf00afafaf00afafaf00faaf0000faaf1a00afaf0000afaf 0000afafaf00af00afafaf0000afaf0000afaf00fcaf0000f7af016464ee af016464f7e201dfdff9af0400afafaf00fcaf0300afaf00fcaf0400afaf af00f9af0000fbaf0000fcaf0600af00afafaf00f9af0000fcaf0000fcaf 0300afaf00fcaf0300afaf00cbaf01dfdff5af0000faaf1300afaf00afaf 0000afaf0000afaf0000afaf0000f5af09646400d69dd69d569d000c00d6 d69d9d9d5656dfdfafdfdff8af0000fcaffd0000affc00fdaf040000afaf 00faaf0000faaf0300afafaffc00fbaf0000fbaffc00fdaf0000fbaf0100 00f9af016464eeaf016464f7e201dfdff9af1500afafaf0000afaf0000af af0000afaf0000afafaf00f9af060000afafaf0000fcaf0e00af00afafaf 0000afaf0000afaf00fcaf0000fcaf1000afaf0000afaf0000afaf0000af af0000d0af01dfdff5af0000faaf0e00afaf00afafaf000000af00afafaf fc00f4af09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdff8 af0000edaf0000caaf016464eeaf016464f5dff9af0000fcaffd0004af00 00afaffc00fcaf0000f7affd00f9af0000fbaffc00fdaf0000fcaf0000fc af0b00afafaf000000af00afafaffc00cfaf01dfdfcfaf09646400d69dd6 9d569d000c00d6d69d9d9d5656dfdfafdfdff8af0000edaf0000caaf0164 64eeaf0064f4dff9af0000ecaf000095af01dfdfcfaf09646400d6d69d9d 9d56000c00d69dd69d569d56dfdfafdfdff8affd00f1affd00caaf016464 daaf0000ecaf000095af01dfdfcfaf09646400d69dd69d569d000c00d6d6 9d9d9d5656dfdfafdfdfadaf016464daaffd00f0affd0095af01dfdfcfaf 09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdfadaf016464 80afd9af01dfdfcfaf09646400d69dd69d569d000c00d6d69d9d9d5656df dfafdfdfadaf01646480afd9af01dfdfcfaf09646400d6d69d9d9d56000c 00d69dd69d569d56dfdfafdfdfadaf01646480afd9af01dfdfcfaf096464 00d69dd69d569d000c00d6d69d9d9d5656dfdfafdfdfadaf01646480afd9 af01dfdfcfaf09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdf dfadaf01646480afd9af01dfdfcd640700d69dd69d569d000c00d6d69d9d 9d5656dfdfafdfdfab6480afd9af00dfcc640700d6d69d9d9d56000b00d6 9dd69d569d56dfdfafdfaa6480afa6af09646400d69dd69d569d000900d6 d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80af80afceaf09646400d69dd69d569d000900d6d69d9d9d 5656dfdf80af80afceaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdf80af80afceaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf 80af80afceaf09646400d6d69d9d9d56000900d69dd69d569d56dfdff4af fd00f4af0000d3affd00fcaf000080af9faf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdff6af060000afafaf0000f6af0000d5af090000af afaf0000afaf0080af9faf09646400d6d69d9d9d56000900d69dd69d569d 56dfdff6af0000fbaf0000f6af0000d5af0000fbaf0300afaf0080af9faf 09646400d69dd69d569d000900d6d69d9d9d5656dfdff7af0000f6affc00 fdaf0300afafaffc00fdaf0500af0000af00e5af0000f8af0400af000000 fcaffc000dafaf00afafaf00afafaf00afaf0080afb9af09646400d6d69d 9d9d56000900d69dd69d569d56dfdff7af0000f7af180000afaf0000afaf 00afaf0000afaf0000afaf0000afafaf00e4af010000faaf1a0000afaf00 00afaf0000afaf0000af00afafaf00afafaf00afaf0080afb9af09646400 d69dd69d569d000900d6d69d9d9d5656dfdff7af0000f7af0000fcaf0600 afaf00afaf00fcaf0300afaf00ddaf010000fcaf0000fcaf0300afaf00fc af0a00af00afafaf00afafaf0080afb6af09646400d6d69d9d9d56000900 d69dd69d569d56dfdff7af0000f7af0000fcaf0600afaf00afaf00fcaf03 00afaf00dbaf040000afaf00fcaf0300afaf00fcaf0900afaf00afaf00af af0080afb5af09646400d69dd69d569d000900d6d69d9d9d5656dfdff7af 0000f7af0000fcaf0600afaf00afaf00fcaf0300afaf00daaf0300afaf00 fcaf0300afaf00fcaf0900afaf00afaf00afaf0080afb5af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdff6af0000fbaf0300afaf00fcaf06 00afaf00afaf00fcaf0300afaf00e0af0000fbaf0300afaf00fcaf0300af af00fcaf0900afaf00af00af00af0080afb5af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdff6af1c0000afafaf0000afaf0000afaf0000af af00afaf0000afaf0000afaf00fcaf0000e5af090000afafaf0000afaf00 fcaf1000afaf0000afaf0000afafaf00afafaf00fcaf000080afb9af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdff4affd00fbaffc00fdaf 0300afafaffc00fdaf0000fcaf0000e3affd00fcaf0000fcaf0300afafaf fc00fcaf0400afafaf00fcaf000080afb9af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf80af9aaffd00fcaf0000ecaf0300afaf00d4af09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80af9caf090000afaf af0000afaf00ecaf0300afaf00d4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdf80af9caf0000fbaf0300afaf00ecaf0000d1af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80af9caf0000f8af0400af00 0000fcaffc00fcaffd000baf00afaf00afaf00af000000fcaffd0001af00 e4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80af9baf0100 00faaf280000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00af af0000afaf0000afaf0000afaf0000e4af09646400d6d69d9d9d56000900 d69dd69d569d56dfdf80af99af010000fcaf0000fcaf0000f9af0300afaf 00fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000e4af09646400d69d d69d569d000900d6d69d9d9d5656dfdf80af97af040000afaf00fcaf0300 afafaffb0002afaf00fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000 e4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af96af0300 afaf00fcaf0b00afaf0000afafaf00afaf00fcaf0600afaf00afaf00fcaf 0300afaf00fcaf0000e4af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80af9caf0000fbaf0300afaf00fcaf0300afaf00fcaf0300afaf00 fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000e4af09646400d6d69d 9d9d56000900d69dd69d569d56dfdf80af9caf090000afafaf0000afaf00 fcaf1600afaf0000afaf0000afaf0000afaf0000afaf00afaf00fcaf0800 afaf0000afaf0000e4af09646400d69dd69d569d000900d6d69d9d9d5656 dfdf80af9aaffd00fcaf0000fcaf1600afafaf000000af0000afaf000000 af00afaf00afaf00fcaf0800afafaf000000af00e4af09646400d6d69d9d 9d56000900d69dd69d569d56dfdffcafd1df80af9eaf0000e4af09646400 d69dd69d569d000900d6d69d9d9d5656dfdffcafd2df006480afa3af0500 00afaf0000e4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffc af01dfdfd5af01646480afa2affc00e3af09646400d69dd69d569d000900 d6d69d9d9d5656dfdffcaf01dfdfd5af01646480af81af09646400d6d69d 9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af01646480aff8af8b 640bdfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdf d5af046464afafaff36488af00648ddf0c64dfaf646400d6d69d9d9d5600 0900d69dd69d569d56dfdffcaf01dfdff5affd00fcaffd00fbaffb00f4af 046464afafaff46400dff9affd00f6affb00faaff900aeaf0164df8d640b dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff5af 0000fcaf090000afafaf0000afaf00fcaf0000f4af066464afafaf6464f7 e201dfdff9af0000f5af0000fcaf0000faaf0000a8af0164df8f640ddf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff5af 0000fcaf0000fbaf0300afaf00fcaf0000f4af066464afafaf6464f7e201 dfdff9af0000f5af0000fcaf0000faaf0000a8af0364df646492af0edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff5 af0400afafaf00f8affd00fdaf0000f4af066464afafaf6464f7e201dfdf f9af0000fcaffc0008afaf000000afafaf00faaf0000f8affc00fcaffc00 fdaffc00fcaffd00caaf0364df646492af0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdff5af0400afafaf00f7af00 00fcaf0000f4af066464afafaf6464f7e201dfdff9af0c00afafaf0000af af0000afaf00fcaf0000faaf0000f9af1b0000afaf0000afaf0000afaf00 00af0000afaf0000afaf00afafaf00cbaf0964df6464af000000afaffc00 efaffd00f7affd00bcaf0edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdffcaf01dfdff5af0400afafaf00f7af0000fcaf0000f4af 066464afafaf6464f7e201dfdff9af0000f8af0300afaf00fcaf0000faaf fa00f9af0300afaf00faaf0000fcaf0400afaf0000c8af0964df6464af00 afafaf00fcaf0000eeaf0000f9af060000afafaf0000e7af0000edaf0000 ecaf0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffc af01dfdff5af0400afafaf00f7af0000fcaf0000f4af066464afafaf6464 f7e201dfdff9af0000fcaffb0002afaf00fcaf0000faaf0000f8affb0002 afaf00faaffa00fdaffd00caaf0964df6464af00afafaf00fcaf0000eeaf 0000f9af0000fbaf0000e7af0000edaf0000ecaf0edfdf64dfaf646400d6 9dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff5af0400afafaf00 f7af0000fcaf0000f4af066464afafaf6464f7e201dfdff9af0c00afafaf 0000afafaf00afaf00fcaf0000faaf0000f9af080000afafaf00afaf00fa af0000f6af010000cbaf0964df6464af00afafaf00fcaf0300afafaffc00 fcaffd00fcaf0000faaf0000f6affc00fdaf0400af000000fcaffd0007af af000000afafaffc00fdaf0900af000000afaf000000edaf0edfdf64dfaf 646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff5af0000 fcaf0000fbaf0300afaf00fcaf0000f4af066464afafaf6464f7e201dfdf f9af0400afafaf00fcaf0300afaf00fcaf0000faaf0000f9af0000fcaf03 00afaf00fcaf0200af00f5af0000cbaf0964df6464af00afafaf00fcaf13 00afaf0000afaf0000afaf00afafaf00afafaf00faaf0000f7af2b0000af af0000afaf0000afaf0000afaf00afafaf00afaf00afafaf0000afaf0000 afaf0000afaf0000afaf00ecaf0edfdf64dfaf646400d69dd69d569d0009 00d6d69d9d9d5656dfdffcaf01dfdff5af0000fcaf090000afafaf0000af af00fcaf0000f4af066464afafaf6464f7e201dfdff9af0c00afafaf0000 afaf0000afaf00fcaf0000faaf0000f9af1b0000afaf0000afaf0000afaf 0000af0000afaf0000afaf00afafaf00cbaf0964df6464af00afafaf00fc af0000f9af0400afaf0000faaf0000faaf0000f7af0000fcaf0300afaf00 fcaf0400afaf0000fbaf0000f8af0300afaf00fcaf0300afaf00ecaf0edf df64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdf f5af0000faaffd00fcaf0000fcaf0000f4af066464afafaf6464f5dff9af 0000fcaffd0004af0000af00fcaf0000faaf0000f8affd0004af0000afaf fc00fdaffc00fcaffd00caaf0964df6464af00afafaf00fcaf0300afafaf fb00fdaffd00fcaf0000faaf0000f7af0000fcaf0300afaf00fcaf0a00af afaf000000afafaf00fcaffb0002afaf00fcaf0300afaf00ecaf0edfdf64 dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff5af 0000eeaf0000f4af056464afafaf64f4dff9af0000f0af0000a1af0964df 6464af00afafaf00fcaf0800afaf0000afafaf00fbaf050000afafaf00fa af0000f7af0000fcaf0300afaf00fcaf0000fbaf100000afaf00afafaf00 00afafaf00afaf00fcaf0300afaf00ecaf0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdff5af0000eeaf0000f4af01 6464e9af0000f0af0000a1af0964df6464af00afafaf00fcaf0300afaf00 fcaf0000faaf0400afafaf00f9af0000fbaf0300afaf00fcaf0300afaf00 fcaf0000faaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00ec af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf 01dfdff5affd00f2affd00f4af016464e9affd00f4affd00a1af0964df64 64af00afafaf00fcaf1300afaf0000afaf0000afaf00afafaf00afafaf00 f9af110000afafaf0000afaf0000afaf0000afaf00fcaf1600afaf00afaf af00afaf00afafaf0000afaf0000afaf00fcaf0300afaf00ecaf0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af 01646480aff8af0564df6464af00fcaffc00fcaffd0007af0000afaf0000 00fcaf0000f7affd00fbaffc00fdaf0000fcaf0600afafaf000000fcaf0b 0000afaf000000af0000af00fcaf0500afafaf0000eeaf0edfdf64dfaf64 6400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdfd5af016464 80aff8af0564df6464af00e5af0000b0af0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdfd36480aff8af0564df6464 af00e5af0000b0af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d 9d5656dfdffcaf00dfd26480aff8af0764df6464af000000e9affd00b0af 0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcafd1 df80aff8af0364df646492000edfdf64dfaf646400d69dd69d569d000900 d6d69d9d9d5656dfdffcafd2df006480aff8af0364df646492000edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af 01646480aff8af0764df646400afafaffc0000afee00fdaffa00f9af0100 afbf000edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf fcaf01dfdfd5af01646480aff8af0564df646400affc00fdafec0000affa 0000aff90000aff60000afca000edfdf64dfaf646400d6d69d9d9d560009 00d69dd69d569d56dfdffcaf01dfdfd5af01646480aff8af0564df646400 affa0000afec0000affa0000aff90000aff60000afca000edfdf64dfaf64 6400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdfd5af046464 afafaff3df88af0564df646400affa0000affb00fcaffc00fdaffc0000af fa0000aff90003af000000fcaf040000afafafcb000edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff7affd00fcaffd 00f5affd00f6af046464afafaff4df0064f9affd00f0affd00faaff900f9 af0000baaf0564df646400affa0000affc0010afaf0000afaf0000af0000 00af000000affa0000aff9000baf0000afaf0000afaf0000afca000edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7 af0000fcaf060000afafaf0000f5af0000f6af066464afafafdfdff7af01 6464f9af0000ecaf0000faaf0000f3af0000baaf0564df646400affa0000 aff70004af0000afaffa0000affa00faaf020000aff90003af0000afca00 0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01 dfdff7af0000fcaf0000fbaf0000f5af0000f6af066464afafafdfdff7af 016464f9af0000ecaf0000faaf0000f3af0000baaf0564df646400affa00 00affb00fbaffd00fdaffc0000affa0000aff90003af000000fbaf020000 afca000edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf fcaf01dfdff7af0400afafaf00f6affc00fcaf0000f6af066464afafafdf dff7af016464f9af0000fcaffc00fcaffc00fcaf0000faaf0000f7affd00 0caf00afafaf000000af00afafaffc00fcaffd00d0af0564df646400affa 0000affc0005afaf000000affb0005afaf000000affa0000aff9000baf00 00afaf000000af0000afca000edfdf64dfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf01dfdff7af0400afafaf00f7af090000afaf00 00afafaf00f6af066464afafafdfdff7af016464f9af1500afafaf0000af af0000afaf0000afaf0000afafaf00faaf0000f8af1c0000afaf0000afaf 0000afaf0000afaf0000afaf0000afaf00afafaf00d1af0564df646400af fa0000affc0000affc0000affa0004af000000affa0000aff90003af0000 affc0003af0000afca000edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdffcaf01dfdff7af0400afafaf00f7af0000fcaf0400afaf af00f6af066464afafafdfdff7af016464f9af0000f8af0300afaf00fcaf 0400afafaf00faaffa00fdaf0000fcaf0300afaf00fcaf0300afaf00fcaf 0400afaf0000ceaf0564df646400affa0000affc0010afaf0000afaf0000 af000000af000000affa0000aff9000baf0000afaf0000afaf0000afca00 0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01 dfdff7af0400afafaf00f7affa00fdaf0000f6af066464afafafdfdff7af 016464f9af0000fcaffb0001afaffa00fdaf0000faaf0000f8af0000fcaf 0300afaf00fcaf0200afaffa00fdaffd00d0af0564df646400affa0000af fb00fdaf0700afaf0000afafaffc0000affa0000aff9000daf000000afaf af00afaf0000afafcc000edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdffcaf01dfdff7af0400afafaf00f7af0000f8af0000f6af 066464afafafdfdff7af016464f9af0c00afafaf0000afafaf00afaf00f8 af0000faaf0000f8af0000fcaf0300afaf00fcaf0300afaf00f6af010000 d1af0564df646400afe50000afb0000edfdf64dfaf646400d6d69d9d9d56 000900d69dd69d569d56dfdffcaf01dfdff7af0000fcaf0000fbaf0300af af00f8af0000f6af066464afafafdfdff7af016464f9af0400afafaf00fc af0300afaf00f8af0000faaf0000f8af0000fcaf0300afaf00fcaf0300af af00f5af0000d1af0564df646400afe50000afb0000edfdf64dfaf646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7af0000fcaf12 0000afafaf0000afaf0000afaf0000afafaf00f6af066464afafafdfdff7 af016464f9af1500afafaf0000afaf0000afaf0000afaf0000afafaf00fa af0000f8af1c0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf 00afafaf00d1af0764df646400afafafe900fdafb0000edfdf64dfaf6464 00d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff7af0000faaf fd00fbaffc00fcaf0000f6af066464afafafdfdff564f9af0000fcaffd00 04af0000afaffc00fcaf0000faaff900fdaffd000caf00afafaf000000af 00afafaffc00fcaffd00d0af0364df646492af0edfdf64dfaf646400d69d d69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7af0000eaaf0000f6 af056464afafafdff464f9af0000ecaf0000e4af0000c2af0364df646492 af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf 01dfdff7af0000eaaf0000f6af016464e9af0000ecaf0000e9af050000af af0000c2af0964df6464af000000afaffc00efaffd00f8affd00ddaf0000 dfaf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffc af01dfdff7affd00eeaffd00f6af016464e9affd00f0affd00e8affc00c1 af0964df6464af00afafaf00fcaf0000eeaf0000faaf060000afafaf0000 e3af0400afafaf00dfaf0edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf01dfdfd5af01646480aff8af0964df6464af00afaf af00fcaf0000eeaf0000faaf0000fbaf0000e3af0400afafaf00dfaf0edf df64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdf d5af01646480aff8af0564df6464af00f8af0300afafaffc00fcaffd00fc af0000faaf0000f8af0700af0000afaf0000fcaffc00fcaffc000bafaf00 0000afaf00af000000e3af0edfdf64dfaf646400d6d69d9d9d56000900d6 9dd69d569d56dfdffcaf01dfdfd36480aff8af0564df6464af00f9af1400 afafaf0000afaf0000afaf00afafaf00afafaf00f9af010000faaf240000 afaf0000afaf00afaf0000afaf0000afaf0000afaf0000afaf00afafaf00 00afaf0000e4af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d 5656dfdffcaf00dfd26480aff8af0564df6464af00faaf0000f7af0400af af0000faaf0000f7af010000fcaf0b00afafaf00afafaf00afaf00fcaf03 00afaf00fcaf0700afaf00afafaf00fcaf0000e4af0edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcafd1df80aff8af0564df64 64af00fbaf0000faaffb00fdaffd00fcaf0000f5af0f0000afaf00afafaf 00afafaf00afaf00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000 e4af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffc afd2df006480aff8af0564df6464af00fcaf0000faaf050000afafaf00fb af050000afafaf00f4af0e00afaf00afafaf00afafaf00afaf00fcaf0300 afaf00fcaf0700afaf00afafaf00fcaf0000e4af0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af01646480aff8 af0964df6464af00afafaf00f9af0000fcaf0000faaf0400afafaf00faaf 0000fbaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf07 00afaf00afafaf00fcaf0000e4af0edfdf64dfaf646400d69dd69d569d00 0900d6d69d9d9d5656dfdffcaf01dfdfd5af01646480aff8af0964df6464 af00afafaf00f9af100000afaf0000afaf00afafaf00afafaf00faaf2800 00afafaf0000afaf00afafaf00afafaf00afaf0000afaf0000afaf0000af af0000afaf00afafaf00fcaf0000e4af0edfdf64dfaf646400d6d69d9d9d 56000900d69dd69d569d56dfdffcaf01dfdfd5af01646480aff8af0864df 6464af00afafaffa00fdaffd0007af0000afaf000000fcaf0000f8affd00 fcaf0b00afafaf00afafaf00afafaffc00fcaffc00fcaf030000af00fcaf 0000e4af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656df dffcaf01dfdfd5af046464afafaff3df88af0564df6464af00e5af0000b0 af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf 01dfdff7affd00fcaffd00f5affd00f6af046464afafaff4df0064f9affd 00f0affd00faaf010000fbaf0000deaf0000d6af0564df6464af00e5af00 00b0af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf fcaf01dfdff7af0000fcaf060000afafaf0000f5af0000f6af066464afaf afdfdff7af016464f9af0000ecaf0000faaf0200af00fcaf0000deaf0000 d6af0764df6464af000000e9affd00b0af0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdff7af0000fcaf0000fbaf00 00f5af0000f6af066464afafafdfdff7af016464f9af0000ecaf0000faaf 0200af00fcaf0000deaf0000d6af0364df646492af0edfdf64dfaf646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7af0400afafaf 00f7af0400af000000fcaf0000f6af066464afafafdfdff7af016464f9af 0000fcaffc00fdaf0400af000000fcaf0000faaf0a00afaf00afafaf00af afaffc00fdaf0c00af0000af00af0000afaf0000fcaffc00fdaf0600afaf af000000dcaf0364df646492af0edfdf64dfaf646400d6d69d9d9d560009 00d69dd69d569d56dfdffcaf01dfdff7af0400afafaf00f7af090000afaf 0000afafaf00f6af066464afafafdfdff7af016464f9af1500afafaf0000 afaf0000afaf0000afaf0000afafaf00faaf3100afaf00afafaf00afaf00 00afaf0000afaf0000afafaf0000afaf0000afaf00afaf0000afaf0000af af00afaf00afafaf00ddaf0964df6464af000000afaffc00efaffd00f7af fd00faaffd00ddaf0000e9af0edfdf64dfaf646400d69dd69d569d000900 d6d69d9d9d5656dfdffcaf01dfdff7af0400afafaf00f7af0000fcaf0400 afafaf00f6af066464afafafdfdff7af016464f9af0000f8af0300afaf00 fcaf0400afafaf00faaf0a00afafaf00afaf00afaf00fcaf0300afaf00fc af0800afafaf00afafaf00f9af0700afaf00afaf0000daaf0964df6464af 00afafaf00fcaf0000eeaf0000f9af0f0000afafaf0000afaf0000afafaf 0000e3af0400afafaf00e9af0edfdf64dfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf01dfdff7af0400afafaf00f7af0000fcaf0400 afafaf00f6af066464afafafdfdff7af016464f9af0000fcaffb0002afaf 00fcaf0400afafaf00faaf0a00afafaf00afaf00afaf00fcaf0300afaf00 fcaf0b00afafaf00afafaf00afafaffb0008afaf00afafaf000000dcaf09 64df6464af00afafaf00fcaf0000eeaf0000f9af0000fbaf0300afaf00fb af0000e3af0400afafaf00e9af0edfdf64dfaf646400d69dd69d569d0009 00d6d69d9d9d5656dfdffcaf01dfdff7af0400afafaf00f7af0000fcaf04 00afafaf00f6af066464afafafdfdff7af016464f9af0c00afafaf0000af afaf00afaf00fcaf0400afafaf00faaf0000fcaf0500af00afaf00fcaf03 00afaf00fcaf1300afafaf00afafaf00afaf0000afafaf00afaf00fbaf01 0000ddaf0564df6464af00f8af0300afafaffc00fcaffd00fcaf0000faaf 0000f7af0000f8af0700af0000afaf0000fcaffc00fcaffc000bafaf0000 00afaf00af000000edaf0edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf01dfdff7af0000fcaf0000fbaf0300afaf00fcaf04 00afafaf00f6af066464afafafdfdff7af016464f9af0400afafaf00fcaf 0300afaf00fcaf0400afafaf00faaf0000fcaf0500af00afaf00fcaf0300 afaf00fcaf0b00afafaf00afafaf00afaf00fcaf0300afaf00faaf0000dd af0564df6464af00f8af1300afaf0000afaf0000afaf00afafaf00afafaf 00faaf0000f6af010000faaf240000afaf0000afaf00afaf0000afaf0000 afaf0000afaf0000afaf00afafaf0000afaf0000eeaf0edfdf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7af0000fcaf 090000afafaf0000afaf00fcaf0400afafaf00f6af066464afafafdfdff7 af016464f9af0c00afafaf0000afaf0000afaf00fcaf0400afafaf00faaf 0000fbaf0c0000afaf0000afaf0000afaf00fcaf1a00afafaf00afafaf00 afaf0000afaf0000afaf00afaf00afafaf00ddaf0564df6464af00fbaffd 00f8af0400afaf0000faaf0000faaf0000f4af010000fcaf0b00afafaf00 afafaf00afaf00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000ee af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf 01dfdff7af0000faaffd00fcaf0000fcaf0400afafaf00f6af066464afaf afdfdff564f9af0000fcaffd0004af0000af00fcaf0400afafaf00faaf00 00fbaf040000afafaffc00fdaf0000fcaf1900afafaf00afafaf00afafaf 000000af0000af00afafaf000000dcaf0564df6464af00f8af0300afafaf fb00fdaffd00fcaf0000faaf0000f2af0f0000afaf00afafaf00afafaf00 afaf00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000eeaf0edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7 af0000eaaf0000f6af056464afafafdff464f9af0000ecaf0000a5af0564 df6464af00f8af0800afaf0000afafaf00fbaf050000afafaf00faaf0000 f1af0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf0700af af00afafaf00fcaf0000eeaf0edfdf64dfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf01dfdff7af0000eaaf0000f6af016464e9af00 00ecaf0000a5af0964df6464af00afafaf00fcaf0300afaf00fcaf0000fa af0400afafaf00f9af0000fbaf0300afaf00fbaf0e00afaf00afafaf00af afaf00afaf00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000eeaf 0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01 dfdff7affd00eeaffd00f6af016464e9affd00f0affd00a5af0964df6464 af00afafaf00fcaf1300afaf0000afaf0000afaf00afafaf00afafaf00f9 af310000afafaf0000afaf0000afafaf0000afaf00afafaf00afafaf00af af0000afaf0000afaf0000afaf0000afaf00afafaf00fcaf0000eeaf0edf df64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdf d5af01646480aff8af0564df6464af00fcaffc00fcaffd0007af0000afaf 000000fcaf0000f7affd00faaffd00fcaf0b00afafaf00afafaf00afafaf fc00fcaffc00fcaf030000af00fcaf0000eeaf0edfdf64dfaf646400d69d d69d569d000900d6d69d9d9d5656dfdffcaf01dfdfd5af01646480aff8af 0564df6464af00e5af0000b0af0edfdf64dfaf646400d6d69d9d9d560009 00d69dd69d569d56dfdffcaf01dfdfd36480aff8af0564df6464af00e5af 0000b0af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656df dffcaf00dfd26480aff8af0764df6464af000000e9affd00b0af0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcafd1df80aff8 af0364df646492af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d 9d5656dfdffcafd2df006480aff8af0364df646492af0edfdf64dfaf6464 00d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af01646480 aff8af0364df646492af0edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdffcaf01dfdfd5af01646480aff8af0364df646492af0edf df64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdf d5af01646480aff8af0364df646492af0edfdf64dfaf646400d69dd69d56 9d000900d6d69d9d9d5656dfdffcaf01dfdfd5af01646480aff8af0364df 646492af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56df dffcaf01dfdfd5af01646480aff8af0364df646492af0edfdf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6affd00fcaf fd00fcaf0000fbaffd00f6af01646480aff8af0364df646492af0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff6af 0000fcaf090000afafaf0000afaf00f9af0000f6af046464afafaff3df88 af0364df646492af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d 9d5656dfdffcaf01dfdff6af0000fcaf0000fbaf0300afaf00f9af0000f6 af046464afafaff4df0064f9affd00f7af0000fbaffd00faaffa00fdaffa 00b9af0364df646492af0edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf01dfdff6af0400afafaf00f7af0800af000000afaf af00f6af066464afafafdfdff7af016464f9af0000f5af0000f9af0000fa af0000fcaf040000afaf00fcaf010000baaf0364df646492af0edfdf64df af646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af04 00afafaf00f7af080000afaf0000afaf00f6af066464afafafdfdff7af01 6464f9af0000f5af0000f9af0000faaf0000fbaf0300afaf00fbaf0000ba af0364df646492af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d 569d56dfdffcaf01dfdff6af0400afafaf00f7af0000fcaf0300afaf00f6 af066464afafafdfdff7af016464f9af0000fcaffc00fdaf0800af000000 afafaf00faaf0000fbaf0300afaf00fbaf0300afafaffc000aafaf0000af afaf0000afaffc00fcaffd00d7af0364df646492af0edfdf64dfaf646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af0400afafaf 00f7af0000fcaf0300afaf00f6af066464afafafdfdff7af016464f9af14 00afafaf0000afaf0000afaf0000afaf0000afaf00faaf0000fcaf0400af afaf00fcaf1f00afafaf0000afaf0000afaf00afafaf00afaf0000afaf00 00afaf00afafaf00d8af0364df646492af0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdff6af0400afafaf00f7af00 00fcaf0300afaf00f6af066464afafafdfdff7af016464f9af0000f8af03 00afaf00fcaf0300afaf00faaffb00fcaffb00fcaf0000fcaf0a00afafaf 00af00afafaf00fcaf0400afaf0000d5af0364df646492af0edfdf64dfaf 646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af0000 fcaf0000fbaf0300afaf00fcaf0300afaf00f6af066464afafafdfdff7af 016464f9af0000fcaffb0002afaf00fcaf0300afaf00faaf0000fcaf0400 afafaf00fcaf0400afafaf00fcaf0000fcaf0000fcaffa00fdaffd00d7af 0364df646492af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d56 9d56dfdffcaf01dfdff6af0000fcaf110000afafaf0000afaf0000afaf00 00afaf00f6af066464afafafdfdff7af016464f9af0c00afafaf0000afaf af00afaf00fcaf0300afaf00faaf0000fbaf0300afaf00fbaf0300afaf00 fcaf0000fcaf0000fcaf0000f6af010000d8af0364df646492af0edfdf64 dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af 0000faaffd00fcaf0800af000000afafaf00f6af066464afafafdfdff7af 016464f9af0400afafaf00fcaf0300afaf00fcaf0300afaf00faaf0000fb af0300afaf00fbaf0300afaf00fcaf0a00afafaf00af00afafaf00f5af00 00d8af0364df646492af0edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf01dfdff6af0000ebaf0000f6af066464afafafdfdf f7af016464f9af1400afafaf0000afaf0000afaf0000afaf0000afaf00fa af0000fcaf040000afaf00fcaf1f0000afaf0000afaf0000afaf00afafaf 00afaf0000afaf0000afaf00afafaf00d8af0364df646492af0edfdf64df af646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af00 00ebaf0000f6af066464afafafdfdff564f9af0000fcaffd000caf0000af 00af000000afafaf00faaffa00fdaffa00fcaffc000aafaf0000afafaf00 00afaffc00fcaffd00d7af0364df646492af0edfdf64dfaf646400d6d69d 9d9d56000900d69dd69d569d56dfdffcaf01dfdff6affd00efaffd00f6af 056464afafafdff464f9af0000edaf0000a4af0364df646492af0edfdf64 dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdfd5af 016464e9af0000edaf0000a4af0364df646492af0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af016464e9affd 00f1affd00a4af0364df646492af0edfdf64dfaf646400d69dd69d569d00 0900d6d69d9d9d5656dfdffcaf01dfdfd5af01646480aff8af0364df6464 90df0c64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01 dfdfd5af01646480aff8af0264df648fdf0c64dfaf646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf01dfdfd36480aff8af8b640bdfaf6464 00d6d69d9d9d56000900d69dd69d569d56dfdffcaf00dfd26480aff8af8a df0aaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf 09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af80afceaf0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80af80afceaf09646400d69d d69d569d000900d6d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d 9d56000900d69dd69d569d56dfdfcaaff36480af91af09646400d69dd69d 569d000900d6d69d9d9d5656dfdfcaaff46400dff9affd00f8af0000f9af fc00fbaf0000f9af000080afbdaf09646400d6d69d9d9d56000900d69dd6 9d569d56dfdfcaaf016464f7e201dfdff9af0000f6af0000f9af0300afaf 00fbaf0000f9af0000f0af000080afceaf09646400d69dd69d569d000900 d6d69d9d9d5656dfdfcaaf016464f7e201dfdff9af0000f5af0000fbaf04 00afafaf00faaf0000fbaf0000efaf000080afceaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdfcaaf016464f7e201dfdff9af0000fcaffc 00fdaf0000fbaf0400afafaf00faaf0000fbaf0300afafaffc00fcaffc00 09af000000afafaf00000080afd5af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfcaaf016464f7e201dfdff9af1600afafaf0000afaf0000 afaf0000afafaf0000afafaf00faaf200000afafaf0000afaf0000afaf00 00afaf0000afaf0000af00afafaf00afafaf0080afd6af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfcaaf016464f7e201dfdff9af0000f8 af0800afafaf00afafaf00fcaf0000f9af0800afafaf00afafaf00fcaf03 00afaf00faaf0500afafaf000080afd3af09646400d69dd69d569d000900 d6d69d9d9d5656dfdfcaaf016464f7e201dfdff9af0000fcaffb00fdaf04 00afafaf00fcaf0000f9af0700afafaf00afafaffa0002afaf00faaf0000 fcaffd0080afd5af09646400d6d69d9d9d56000900d69dd69d569d56dfdf caaf016464f7e201dfdff9af0900afafaf0000afafaf00fcaf0200af00fb af0000f8af0200af00fcaf0000f9af0000faaf0000faaf01000080afd6af 09646400d69dd69d569d000900d6d69d9d9d5656dfdfcaaf016464f7e201 dfdff9af0400afafaf00fcaf0000fcaf0200af00fbaf0000f8af0200af00 fcaf0000f9af0000fcaf0200af00f9af000080afd6af09646400d6d69d9d 9d56000900d69dd69d569d56dfdfcaaf016464f7e201dfdff9af0900afaf af0000afaf0000fbaf0000faaf0000f7af0000fbaf170000afaf0000afaf 0000afaf0000af00afafaf00afafaf0080afd6af09646400d69dd69d569d 000900d6d69d9d9d5656dfdfcaaf016464f5dff9af0000fcaffd0002af00 00fcaf0000faaf0000f7af0000faaffc00fcaffc00fdaf060000afaf0000 0080afd5af09646400d6d69d9d9d56000900d69dd69d569d56dfdfcaaf00 64f4dff9af0000ebaf000080afafaf09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfb6af0000ebaf000080afafaf09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfb6affd00efaffd00a6aff3df96af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdf80afc5aff4df0064f9affd00f4 affd00fbaff700bdaf09646400d6d69d9d9d56000900d69dd69d569d56df df80afc5af01dfdff7af016464f9af0000f5af0000fcaf0000f7af0000ec af0000ceaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc5 af01dfdff7af016464f9af0000f5af0000fcaf0000f7af0000ecaf0000ce af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc5af01dfdf f7af016464f9af0000fcaffc0008afaf000000afafaf00f7af0000faaffc 0006afaf0000afafaffb0002afaf00fcaf0700af00af0000afaffc00e2af 09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc5af01dfdff7 af016464f9af0c00afafaf0000afaf0000afaf00fcaf0000f7af0000fbaf 130000afaf0000afaf00afafaf00afaf00afafaf00fcaf0c00af0000afaf af0000afaf0000e3af09646400d6d69d9d9d56000900d69dd69d569d56df df80afc5af01dfdff7af016464f9af0000f8af0300afaf00fcaf0000f7af 0000fbaf0000fcaf0e00afafaf00af00afafaf00afafaf00fcaf0200af00 fcaf0000fcaf0000e3af09646400d69dd69d569d000900d6d69d9d9d5656 dfdff9aff36480afd9af01dfdff7af016464f9af0000fcaffb0002afaf00 fcaf0000f7af0000fbaffa00fcaf0000fcaf0400afafaf00fcaf0200af00 fcaffa00e3af09646400d6d69d9d9d56000900d69dd69d569d56dfdff9af f46400dff9affd00f1affd00faaff900f0af0000eaaf010000fbaf0000de af0000d4af01dfdff7af016464f9af0c00afafaf0000afafaf00afaf00fc af0000f7af0000fbaf0000f7af0000fcaf0400afafaf00fcaf0200af00fc af0000deaf09646400d69dd69d569d000900d6d69d9d9d5656dfdff9af01 6464f7e201dfdff9af0000edaf0000faaf0000eaaf0000eaaf0200af00fc af0000deaf0000d4af01dfdff7af016464f9af0400afafaf00fcaf0300af af00fcaf0000f7af0000fbaf0000f8af0a00af00afafaf00afafaf00fcaf 0200af00fcaf0000deaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdff9af016464f7e201dfdff9af0000edaf0000faaf0000d3af0200af00 fcaf0000deaf0000d4af01dfdff7af016464f9af0c00afafaf0000afaf00 00afaf00fcaf0000f7af0000fbaf1a0000afaf0000afaf00afafaf00afaf 00afafaf0000afaf0000af00fcaf050000afaf0000e3af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdff9af016464f7e201dfdff9af0000fc affc0002afaf00fbaf0300afaf00faaf0000f8affc00fcaffc0009afaf00 afaf00af000000fcaffd0001af00faaf0a00afaf00afafaf00afafaffc00 fdaf0c00af0000af00af0000afaf0000fcaffc00fdaf0600afafaf000000 daaf01dfdff564f9af0000fcaffd0009af0000afaf0000afaf00f7af0000 faaffc0015afaf0000afafaf0000afaf0000afaf000000af00af00fbaffc 00e2af09646400d6d69d9d9d56000900d69dd69d569d56dfdff9af016464 f7e201dfdff9af0b00afafaf0000afaf0000af00fbaf0300afaf00faaf00 00f9af1f0000afaf0000afaf0000afaf0000af00afaf0000afaf0000afaf 0000afaf0000faaf3100afaf00afafaf00afaf0000afaf0000afaf0000af afaf0000afaf0000afaf00afaf0000afaf0000afaf00afaf00afafaf00db af00dff464f9af0000f0af0000afaf09646400d69dd69d569d000900d6d6 9d9d9d5656dfdff9af016464f7e201dfdff9af0000f8af0b00afaf00afaf af00afafaf00faaffa00f9af0300afaf00faaf0300afaf00fcaf0300afaf 00fcaf0000faaf0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf0800 afafaf00afafaf00f9af0700afaf00afaf0000c4af0000f0af0000afaf09 646400d6d69d9d9d56000900d69dd69d569d56dfdff9af016464f7e201df dff9af0000fcaffb000aafaf00afafaf00afafaf00faaf0000f8affb0002 afaf00faaf0300afaf00fcaf0300afaf00fcaf0000faaf0a00afafaf00af af00afaf00fcaf0300afaf00fcaf0b00afafaf00afafaf00afafaffb0008 afaf00afafaf000000c6affd00f4affd00afaf09646400d69dd69d569d00 0900d6d69d9d9d5656dfdff9af016464f7e201dfdff9af1400afafaf0000 afafaf00afaf00afafaf00afafaf00faaf0000f9af080000afafaf00afaf 00faaf0300afaf00fcaf0300afaf00fcaf0000faaf0000fcaf0500af00af af00fcaf0300afaf00fcaf1300afafaf00afafaf00afaf0000afafaf00af af00fbaf01000080afe4af09646400d6d69d9d9d56000900d69dd69d569d 56dfdff9af016464f7e201dfdff9af0400afafaf00fcaf0600afafaf00af 00fcaf0000faaf0000f9af0000fcaf0300afaf00fcaf0500af00afaf00fc af0300afaf00fcaf0000faaf0000fcaf0500af00afaf00fcaf0300afaf00 fcaf0b00afafaf00afafaf00afaf00fcaf0300afaf00faaf000080afe4af 09646400d69dd69d569d000900d6d69d9d9d5656dfdff9af016464f7e201 dfdff9af0f00afafaf0000afaf0000afafaf00af00fcaf0000faaf0000f9 af120000afaf0000afaf0000afaf0000af00afaf00fcaf0800afaf0000af af0000faaf0000fbaf0c0000afaf0000afaf0000afaf00fcaf1a00afafaf 00afafaf00afaf0000afaf0000afaf00afaf00afafaf0080afe4af096464 00d6d69d9d9d56000900d69dd69d569d56dfdff9af016464f5dff9af0000 fcaffd0006af0000afafaf00fbaf0000faaf0000f8affd0004af0000afaf fc0005afaf00afaf00fcaf0800afafaf000000af00faaf0000fbaf040000 afafaffc00fdaf0000fcaf1900afafaf00afafaf00afafaf000000af0000 af00afafaf00000080afe3af09646400d69dd69d569d000900d6d69d9d9d 5656dfdff9af0064f4dff9af0000edaf0000d3af000080afacaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdfe5af0000edaf0000d8af0500 00afaf0000a3aff3df96af09646400d69dd69d569d000900d6d69d9d9d56 56dfdfe5affd00f1affd00d7affc00a2aff4df0064f9affd00f4affd00fd affd00f7affd00c1af09646400d6d69d9d9d56000900d69dd69d569d56df df80afc5af01dfdff7af016464f9af0000f4af0a0000afafaf0000afafaf 00f9af060000afafaf0000c3af09646400d69dd69d569d000900d6d69d9d 9d5656dfdf80afc5af01dfdff7af016464f9af0000f4af0000fbaf0400af afaf00f9af0000fbaf0000c3af09646400d6d69d9d9d56000900d69dd69d 569d56dfdf80afc5af01dfdff7af016464f9af0000fcaffc00fdaf0000f6 af0000faaf0000f6affc00fdaf0400af000000fcaffc00fdaffc0002afaf 00fbaf0200afaffc00f0af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80afc5af01dfdff7af016464f9af0c00afafaf0000afaf0000afaf 00f6af0000faaf0000f7af1e0000afaf0000afaf0000afaf0000afaf0000 afaf0000af0000afaf0000af00fbaf0700af0000afaf0000f1af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80afc5af01dfdff7af016464 f9af0000f8af0300afaf00f6af0000faaf0000f7af0000fcaf0300afaf00 fcaf0300afaf00f5af0a00afaf00afafaf00afaf00fcaf0000f1af096464 00d69dd69d569d000900d6d69d9d9d5656dfdff9aff3df80afd9af01dfdf f7af016464f9af0000fcaffb0002afaf00f6af0000faaf0000f7af0000fc af0300afaf00fcaf0300afaf00f9affb0008afaf00afafaf00afaffa00f1 af09646400d6d69d9d9d56000900d69dd69d569d56dfdff9aff4df0064f9 affd00f7af0400af000000f8affd00fcaf0000ecaf0000f1af0000faaf00 00adaf01dfdff7af016464f9af0c00afafaf0000afafaf00afaf00f6af00 00faaf0000f7af0000fcaf0300afaf00fcaf0300afaf00faaf0f0000afaf af00afaf00afafaf00afaf00ecaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdff9af01dfdff7af016464f9af0000f5af0400afafaf00faaf 090000afafaf0000afaf00ecaf0000f1af0000faaf0000adaf01dfdff7af 016464f9af0400afafaf00fcaf0400afafaf00fbaf0400afafaf00f9af00 00fbaf0300afaf00fcaf0300afaf00fcaf0300afaf00fcaf0200af00fcaf 0a00afafaf00af00afafaf00ecaf09646400d6d69d9d9d56000900d69dd6 9d569d56dfdff9af01dfdff7af016464f9af0000f5af0400afafaf00faaf 0000fbaf0300afaf00ecaf0000f1af0000a6af01dfdff7af016464f9af17 00afafaf0000afaf0000afafaf0000afafaf0000afafaf00f9af110000af afaf0000afaf0000afaf0000afaf00fcaf1e00afaf0000afaf0000af0000 afaf0000afafaf00af00afafaf0000afaf0000f1af09646400d69dd69d56 9d000900d6d69d9d9d5656dfdff9af01dfdff7af016464f9af0000fcaffc 00fdaf0400afafaf00faaf0000f8af0400af000000fcaffc00fcaffd0004 af00afafaffc00f8af0000faaf0700afaf00af000000fcaffc00fcaffd00 c3af01dfdff564f9af0000fcaffd0002af0000fcaffd00fbaf0000f7affd 00fbaffc00fdaf0000fcaf0300afafaffc00fdaffd0006af0000afafaf00 fbaffc00f0af09646400d6d69d9d9d56000900d69dd69d569d56dfdff9af 01dfdff7af016464f9af1000afafaf0000afaf0000afaf00afafaf00f9af 010000faaf1d0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf 0000afaf0000f9af0000faaf1700afaf0000afaf0000afaf0000afaf0000 afaf00afafaf00c4af00dff464f9af0000eaaf0000b5af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdff9af01dfdff7af016464f9af0000f8 af0700afaf00afafaf00f7af010000fcaf0000fcaf0000f9af0300afaf00 fcaf0300afaf00fcaf0000f9af0000faaf0300afaf00fcaf0300afaf00fc af0400afaf0000adaf0000eaaf0000b5af09646400d6d69d9d9d56000900 d69dd69d569d56dfdff9af01dfdff7af016464f9af0000fcaffb0006afaf 00afafaf00f5af040000afaf00fcaf0300afafaffb0002afaf00fcaf0200 afaffa00f9af0000faaf0300afaf00fcaf0200afaffa00fdaffd00afaffd 00eeaffd00b5af09646400d69dd69d569d000900d6d69d9d9d5656dfdff9 af01dfdff7af016464f9af1000afafaf0000afafaf00afaf00afafaf00f4 af0300afaf00fcaf0b00afaf0000afafaf00afaf00fcaf0300afaf00f4af 0000faaf0300afaf00fcaf0300afaf00f6af01000080afcdaf09646400d6 d69d9d9d56000900d69dd69d569d56dfdff9af01dfdff7af016464f9af04 00afafaf00fcaf0700afaf00afafaf00faaf0000fbaf0300afaf00fcaf03 00afaf00fcaf0300afaf00fcaf0300afaf00f4af0000faaf0300afaf00fc af0300afaf00f5af000080afcdaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdff9af01dfdff7af016464f9af1000afafaf0000afaf0000af af00afafaf00faaf090000afafaf0000afaf00fcaf1800afaf0000afaf00 00afaf0000afaf0000afaf0000afaf0000f9af0000faaf0300afaf00fcaf 0f00afaf0000afaf0000afaf00afafaf0080afcdaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdff9af01dfdff564f9af0000fcaffd0008af 0000af00afafaf00f8affd00fcaf0000fcaf1300afafaf000000af0000af af000000af00afafaffc00f8affa0004af00afaf00fcaf0300afafaffc00 fcaffd0080afccaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf f9af00dff464f9af0000f1af000080af80affaaf09646400d6d69d9d9d56 000900d69dd69d569d56dfdfe5af0000f1af000080af80affaaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdfe5affd00f5affd0080af80af faaf09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af80afceaf 09646400d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf80af80afceaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80af80afceaf09646400d69dd69d 569d000900d6d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56 000900d69dd69d569d56dfdf80af80afceaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56000900d6 9dd69d569d56dfdf80af80afceaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56000900d69dd69d56 9d56dfdf80af80afceaf09646400d69dd69d569d000900d6d69d9d9d5656 dfdffcafc86480af8aaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdffcafc96400df80af8aaf09646400d69dd69d569d000900d6d69d9d9d 5656dfdffcaf016464ccaf01dfdf80af8aaf09646400d6d69d9d9d560009 00d69dd69d569d56dfdffcaf016464ccaf01dfdf80af8aaf09646400d69d d69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf80af8aaf 09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01 dfdf80afe3af010000fbaf0000deaf0300afaf00d5af09646400d69dd69d 569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf80afe3af0200 af00fcaf0000deaf0300afaf00d5af09646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf016464ccaf01dfdf80afe3af0200af00fcaf0000de af0000d2af09646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01 6464ccaf01dfdf80afe3af0a00afaf00afafaf00afafaffc00fdaf0c00af 0000af00af0000afaf0000fcaffc00fdaf0400afaf00affa00fdaffc00e3 af09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464f7af 0000d6af07dfdfafafaf000000eeaffd00f9af0000faaf0000ebaf0000fb af0000fbaf0200af00f9af0000faaf0000c0af2d00afaf00afafaf00afaf 0000afaf0000afaf0000afafaf0000afaf0000afaf00afaf0000afaf0000 afaf00afaf00faaf0800afaf0000afaf0000e4af09646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf016464f9affd00d6af05dfdfafafaf00 eaaf0000f9af0000faaf0000ebaf0000fbaf0000fbaf0200af00f9af0700 afaf00afafaf00c0af0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf 0800afafaf00afafaf00f9af0600afaf00afaf00fbaf0400afafaf00fcaf 0000e4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf0164 64f7af0000d6af05dfdfafafaf00eaaf0000f9af0000e4af0000fcaf0200 af00fcaf0000f7af0700afaf00afafaf00c0af0a00afafaf00afaf00afaf 00fcaf0300afaf00fcaf0b00afafaf00afafaf00afafaffb0005afaf00af af00fcaf0000fcaffa00e4af09646400d69dd69d569d000900d6d69d9d9d 5656dfdffcaf016464f7af0000d6af05dfdfafafaf00fcaffc000eafaf00 afafaf00afafaf00afafaf00f9af0000faaf0700afaf00af000000fcaffc 00f9af2000afafaf00af00afafaf00afaf00afafaf000000af00af000000 afaf00af000000c4af0000fcaf0500af00afaf00fcaf0300afaf00fcaf1a 00afafaf00afafaf00afaf0000afafaf00afaf00afaf00afafaf00fbaf00 00dfaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464 f7af0000d6af1cdfdfafafaf00afafaf0000afaf0000af00afafaf00afaf af00afafaf00f9af0000faaf1000afaf0000afaf0000afaf0000afaf0000 faaf2100afafaf00af00afafaf00afaf00afaf0000afaf0000afaf00afaf af0000afaf0000c5af0000fcaf0500af00afaf00fcaf0300afaf00fcaf0b 00afafaf00afafaf00afaf00fcaf0900afaf00afaf00afaf00faaf0000df af09646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464f7af 0000d6af05dfdfafafaf00f8af0e00af00afafaf00afafaf00afafaf00f9 af0000faaf0300afaf00fcaf0300afaf00fcaf0000faaf1000afafaf00af 00afafaf00afaf00afaf00fcaf0700afaf00afafaf00fcaf0000c5af0000 fbaf0c0000afaf0000afaf0000afaf00fcaf1800afafaf00afafaf00afaf 0000afaf0000afaf00afaf00af00f9af050000afaf0000e4af09646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf016464f7af0000d6af05df dfafafaf00fcaffb0008afaf00afaf00afaf00fcaf0000f9af0000faaf03 00afaf00fcaf0200afaffa00f9af0f00af00afafaf00af00afafaf00afaf 00fcaf0700afaf00afafaf00fcaf0000c5af0000fbaf040000afafaffc00 fdaf0000fcaf1700afafaf00afafaf00afafaf000000af0000af00afaf00 affa00fdaffc00e3af09646400d69dd69d569d000900d6d69d9d9d5656df dffcaf016464f7af0000d6af17dfdfafafaf00afafaf0000afafaf00afaf 00afaf00afaf00fcaf0000f9af0000faaf0300afaf00fcaf0300afaf00f4 af0f00af00afafaf00af00afafaf00afaf00fcaf0700afaf00afafaf00fc af000080afecaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffc af016464f7af0000d6af09dfdfafafaf00afafaf00fcaf0900afaf00af00 af00af00fcaf0000f9af0000faaf0300afaf00fcaf0300afaf00f4af0f00 af00afafaf00af00afafaf00afaf00fcaf0700afaf00afafaf00fcaf0000 80afecaf09646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf0164 64f7af0000d6af16dfdfafafaf00afafaf0000afaf0000afafaf00afafaf 00fbaf0000f9af0000faaf0300afaf00fcaf0800afaf0000afaf0000f8af 0000fbaf0000fcaf0f00afaf0000afaf0000afaf00afafaf00fcaf000080 afecaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464 f7af0000d6af05dfdfafafaf00fcaffd0009af0000afaf00afafaf00fbaf 0000f9affa0004af00afaf00fcaf0300afafaffc00f7af0000fbaf0000fc af0f00afafaf000000af00afafaf0000af00fcaf000080afecaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf05dfdfafaf af00eaaf00009caf8b640bdfaf646400d6d69d9d9d56000900d69dd69d56 9d56dfdffcaf016464ccaf05dfdfafafaf00eaaf00009caf8cdf0c64dfaf 646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf07df dfafafaf000000eeaffd009caf8b640bdfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf016464ccaf01dfdf81af8d640ddf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81 af00648faf0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56 dfdffcaf016464ccaf01dfdf81af00648faf0edfdf64dfaf646400d69dd6 9d569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0664af 000000afaffc00fdaf010000fbaf0400af000000faaf010000fbaf0000b6 af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf 016464ccaf01dfdf81af0664af00afafaf00fcaf0500afaf00af00fcaf04 00afafaf00faaf0200af00fcaf0000b6af0edfdf64dfaf646400d69dd69d 569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0664af00 afafaf00fcaf0500afaf00af00fcaf0400afafaf00faaf0200af00fcaf00 00b6af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdf fcaf016464ccaf01dfdf81af0664af00afafaf00fcaf0e00afaf00afaf00 afafaf00afafaf00faaf0a00afaf00afafaf00afafaffc00fdaf0400af00 0000fcaffc00cdaf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d 9d5656dfdffcaf016464ccaf01dfdf81af0664af00afafaf00fcaf0e00af af00afaf00afafaf00afafaf00faaf1f00afaf00afafaf00afaf0000afaf 0000afaf0000afaf0000afaf0000afaf0000ceaf0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf84af09 64df6464af00afafaf00fcaf0e00afaf00afafaf00afaf00afafaf00faaf 0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000 ceaf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffc af016464cadf84af0964df6464af00afafaf00fcaf0e00afaf00afafaf00 afaf00afafaf00faaf0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf 0200afaffa00ceaf0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d 569d56dfdffcaf0064c9df84af0964df6464af00afafaf00fcaf0300afaf 00fcaf0600af00afafaf00faaf0000fcaf0500af00afaf00fcaf0300afaf 00fcaf0300afaf00c9af0edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdf80afc8af0964df6464af00afafaf00fcaf0300afaf00fc af0600af00afafaf00faaf0000fcaf0500af00afaf00fcaf0300afaf00fc af0300afaf00c9af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d 569d56dfdf80afc8af0964df6464af00afafaf00fcaf0300afaf00fbaf05 0000afafaf00faaf0000fbaf0c0000afaf0000afaf0000afaf00fcaf0800 afaf0000afaf0000ceaf0edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdf80afc8af0564df6464af00fcaffc00fdaf0000fbaf0500 00afafaf00faaf0000fbaf040000afafaffc00fdaf0000fcaf0300afafaf fc00cdaf0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56df dffcafc86484af0564df6464af00eaaf0000a8af0edfdf64dfaf646400d6 9dd69d569d000900d6d69d9d9d5656dfdffcafc96400df81af0264af00ea af0000a8af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56 dfdffcaf016464ccaf01dfdf81af0464af000000eeaffd00a8af0edfdf64 dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf 01dfdf81af00648f000edfdf64dfaf646400d6d69d9d9d56000900d69dd6 9d569d56dfdffcaf016464ccaf01dfdf81af00648f000edfdf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81 af046400afafaffc0000affc0001afaffb0004af00afafaff90000aff100 03af0000aff70000aff90000afef0000afe7000edfdf64dfaf646400d6d6 9d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af0264 00affc00fdaffc0002af00affc0004af000000aff90000aff10003af0000 aff70000aff90000afef0000afe7000edfdf64dfaf646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af026400affa00 00affc0002af00affc0004af000000aff90000aff10000afec0000afef00 00afe7000edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56df dffcaf016464ccaf01dfdf81af026400affa0000affc000baf0000af0000 00af000000aff90007af0000af00afafaffc00fdaf0600af0000af00affb 000daf00af000000afafaf00af0000affc0002af0000fcaffd0000afe700 0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01 6464f7af0000d6af01dfdf81af026400affa0000affc000baf0000af0000 00af000000aff90015af0000afaf0000afaf0000afaf0000afaf0000af00 affb000daf00af0000afaf0000afaf0000affc000aaf00afaf0000afaf00 00afe7000edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56df dffcaf016464f9affd00d6af07dfdfafafaf000000f7af0000faaffd00fa af010000fbaf0000deaf0000f9af0000deaf0000f6af026400affa0000af fc000baf000000af0000af000000aff90003af0000affc0003af0000affc 0010af0000af0000af000000af0000af0000affc0003af0000affc0000af fa0003af0000afe7000edfdf64dfaf646400d69dd69d569d000900d6d69d 9d9d5656dfdffcaf016464f7af0000d6af05dfdfafafaf00f5af0000f8af 0000faaf0200af00fcaf0000deaf0000f9af0000e2af0400afafaf00f6af 026400affa0000affc000baf000000af0000af000000aff90003af0000af fc0003af0000affc0010af0000af0000af000000af0000af0000affc0003 af0000affc0002af0000fbaf020000afe7000edfdf64dfaf646400d6d69d 9d9d56000900d69dd69d569d56dfdffcaf016464f7af0000d6af05dfdfaf afaf00f5af0000f8af0000faaf0200af00fcaf0000deaf0000f9af0000e2 af0400afafaf00f6af026400affa0000affc0000affc0006af00af000000 aff90003af0000affc0003af0000affc0010af0000af0000af000000af00 00af0000affc0003af0000affc000aaf00afaf000000af0000afe7000edf df64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464 f7af0000d6af05dfdfafafaf00fcaffc00fdaf0400af000000fcaf0000fa af0a00afaf00afafaf00afafaffc00fdaf0c00af0000af00af0000afaf00 00fcaffc00fdaf0000f9af0000f9affc00fdaf0400af000000fcaffd000c af00af000000afaf00af000000faaf026400affa0000affc0000affc0006 af00af000000aff90003af0000affc0003af0000affc0010af0000af0000 00af00af000000af0000affc0003af0000affc0002af00affc0003af0000 afe7000edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdf fcaf016464f7af0000d6af1adfdfafafaf00afafaf0000afaf0000afaf00 00afaf0000afafaf00faaf2a00afaf00afafaf00afaf0000afaf0000afaf 0000afafaf0000afaf0000afaf00afaf0000afaf0000afaf00f9af0000fa af210000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00afafaf 0000afaf0000fbaf026400affa0000affc0000affb0005afaf000000aff9 0003af0000affc002faf0000afaf0000afaf0000af000000af00af000000 af0000afaf0000afaf0000afaf0000afaf00afaf0000afaf0000afe7000e dfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf0164 64f7af0000d6af05dfdfafafaf00f8af0300afaf00fcaf0400afafaf00fa af0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf0800afafaf00afaf af00f9af0300afaf00f9af0000faaf0000fcaf0300afaf00fcaf0300afaf 00fcaf0700afaf00afafaf00fcaf0000fbaf026400affa0000affc0000af fb0005afaf000000aff90003af0000affc000baf000000afafaf00af0000 affc0000affc001aaf000000afafaf00af000000afafaf00af0000afafaf 00afaf00afe7000edfdf64dfaf646400d6d69d9d9d56000900d69dd69d56 9d56dfdffcaf016464f7af0000d6af05dfdfafafaf00fcaffb0002afaf00 fcaf0400afafaf00faaf0a00afafaf00afaf00afaf00fcaf0300afaf00fc af0b00afafaf00afafaf00afafaffb0002afaf00f9af0000faaffa0002af af00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000fbaf026400af ea0000afa8000edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d56 56dfdffcaf016464f7af0000d6af11dfdfafafaf00afafaf0000afafaf00 afaf00fcaf0400afafaf00faaf0000fcaf0500af00afaf00fcaf0300afaf 00fcaf1300afafaf00afafaf00afaf0000afafaf00afaf00f9af0000faaf 0000f9af0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000fbaf 026400afea0000afa8000edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf016464f7af0000d6af09dfdfafafaf00afafaf00fc af0300afaf00fcaf0400afafaf00faaf0000fcaf0500af00afaf00fcaf03 00afaf00fcaf0b00afafaf00afafaf00afaf00fcaf0300afaf00f9af0000 faaf0000f9af0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000 fbaf046400afafafee00fdafa8000edfdf64dfaf646400d69dd69d569d00 0900d6d69d9d9d5656dfdffcaf016464f7af0000d6af11dfdfafafaf00af afaf0000afaf0000afaf00fcaf0400afafaf00faaf0000fbaf0c0000afaf 0000afaf0000afaf00fcaf1300afafaf00afafaf00afaf0000afaf0000af af00f9af0000faaf080000afaf0000afaf00fcaf0f00afaf0000afaf0000 afaf00afafaf00fcaf0000fbaf00648faf0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf016464ccaf05dfdfafafaf00fcaf fd0004af0000af00fcaf0400afafaf00faaf0000fbaf040000afafaffc00 fdaf0000fcaf1300afafaf00afafaf00afafaf000000af0000af00f9affa 0001afaffc00fdaf0000fcaf0f00afafaf000000af00afafaf0000af00fc af0000fbaf00648faf0edfdf64dfaf646400d69dd69d569d000900d6d69d 9d9d5656dfdffcaf016464ccaf05dfdfafafaf00ecaf0000acaf0000efaf 0664af000000afaffc00fdaf010000fbaf0400af000000f8affd00b3af0e dfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf0164 64ccaf05dfdfafafaf00ecaf0000b1af050000afaf0000efaf0664af00af afaf00fcaf0500afaf00af00fcaf0400afafaf00faaf060000afafaf0000 b5af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffc af016464ccaf07dfdfafafaf000000f0affd00b0affc00eeaf0664af00af afaf00fcaf0500afaf00af00fcaf0400afafaf00faaf0000fbaf0000b5af 0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01 6464ccaf01dfdf81af0264af00f8af0e00afaf00afaf00afafaf00afafaf 00faaf0000f7affc00fcaffd0004af00afaf00fcaf0200afaffc00fdaf04 00af000000fcaffc00fdaffc00eaaf0edfdf64dfaf646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0264af00f9af 0f00afafaf00afaf00afafaf00afafaf00f9af010000faaf100000afaf00 00afaf0000afaf0000afaf00fcaf1e00af0000afaf0000afaf0000afaf00 00afaf0000afaf0000af0000afaf0000ebaf0edfdf64dfaf646400d6d69d 9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af0264af 00faaf0000fcaf0b00afafaf00afaf00afafaf00f7af010000fcaf0000fc af0300afaf00fcaf0300afaf00fcaf0200af00fcaf0300afaf00fcaf0300 afaf00faaf0000fcaf0000ebaf0edfdf64dfaf646400d69dd69d569d0009 00d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0264af00fbaf0000 fbaf0b00afafaf00afaf00afafaf00f5af030000afaffa0002afaf00fcaf 0300afaf00fcaf0100affa0002afaf00fcaf0300afaf00faaffa00ebaf0e dfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf0164 64ccaf01dfdf81af0264af00fcaf0000faaf0000fcaf0600af00afafaf00 f4af0300afaf00f9af0000fcaf0300afaf00fcaf0200af00f9af0000fcaf 0300afaf00faaf0000e6af0edfdf64dfaf646400d69dd69d569d000900d6 d69d9d9d5656dfdffcaf016464cadf81af0664af00afafaf00f9af0000fc af0600af00afafaf00faaf0000fbaf0300afaf00f9af0000fcaf0300afaf 00fcaf0200af00f9af0000fcaf0300afaf00fcaf0200af00e6af0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf0064c9df81 af0664af00afafaf00f9af0000fbaf050000afafaf00faaf280000afafaf 0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000af0000af af0000afaf00fcaf0f00afaf0000afaf0000af0000afaf0000ebaf0edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc8af0864 df6464af00afafaffa0002afaf00fbaf050000afafaf00f8affd00fbaffc 00fcaffd000baf00afafaf000000af00afaffc00fdaf0000fcaf0300afaf affc00fdaffc00eaaf0edfdf64dfaf646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80afc8af0564df6464af00eaaf0000e4af0000c5af0edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc8af0564 df6464af00eaaf0000e4af0000c5af0edfdf64dfaf646400d6d69d9d9d56 000900d69dd69d569d56dfdffcafc86484af0764df6464af000000eeaffd 00e4af0000c5af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d 5656dfdffcafc96400df84af0364df64648faf0edfdf64dfaf646400d6d6 9d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf84af0364 df64648faf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656 dfdffcaf016464ccaf01dfdf84af0964df6464af000000afaffc00fdaf01 0000fbaf0400af000000faaf0000fbaf0000b5af0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf84af09 64df6464af00afafaf00fcaf0500afaf00af00fcaf0400afafaf00faaf00 00fcaf0000b4af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d 5656dfdffcaf016464ccaf01dfdf81af0664af00afafaf00fcaf0500afaf 00af00fcaf0400afafaf00faaf0400afafaf00b3af0edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af 0264af00f8af0e00afaf00afaf00afafaf00afafaf00faaf0300afaf00fa affc00fcaffc00fdaf0400af000000ccaf0edfdf64dfaf646400d69dd69d 569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0264af00 f8af0e00afaf00afaf00afafaf00afafaf00faaf0200af00faaf150000af af0000afaf0000afaf0000afaf0000afaf0000cdaf0edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af 0264af00fbaffd00fdaf0b00afafaf00afaf00afafaf00faaffd00faaf00 00fcaf0300afaf00fcaf0300afaf00fcaf0000cdaf0edfdf64dfaf646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464f7af0000fbaffc 00dfaf01dfdf81af0264af00f8af0e00afaf00afafaf00afaf00afafaf00 faaf0300afaf00fbaffa0001afaffa0002afaf00fcaf0000cdaf0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464f9af fd00fcaf0000fcaf0000e0af01dfdf81af0264af00f8af0300afaf00fcaf 0600af00afafaf00faaf0400afafaf00fcaf0000f9af0000f9af0000fcaf 0000cdaf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656df dffcaf016464f7af0000fcaf0000fcaf0000e0af01dfdf81af0664af00af afaf00fcaf0300afaf00fcaf0600af00afafaf00faaf0000fcaf0400afaf af00f9af0000f9af0000fcaf0000cdaf0edfdf64dfaf646400d6d69d9d9d 56000900569d569d569d56dfdffcaf016464f7af0000fcaf0000fcaf0000 e0af01dfdf81af0664af00afafaf00fcaf0300afaf00fbaf050000afafaf 00faaf0000fbaf1800afaf0000afaf0000afaf0000afaf0000afaf0000af af0000cdaf0edfdf64dfaf646400d69dd69d569d000000fc56049d5656df dffcaf016464f7af0000fcaf0000fcaf0000e0af01dfdf81af0264af00fc affc00fdaf0000fbaf050000afafaf00faaf0000faaf0200afaffc00fcaf fc00fdaf0400af000000ccaf09dfdf64dfaf646400d6d6fc56ff000000fc d604569d56dfdffcaf016464f7af0000fcaf0000fcaf0000e0af07dfdfaf afaf000000f2af0400af000000faaffa00eaaf0000f5affb00fbaf0000f7 af0000ddaf0264af00eaaf0000e1af0000c8af09dfdf64dfaf646400d69d fcd6ff000900d6d6d69d9d5656dfdffcaf016464f7af0000fcaf0000fcaf 0000e0af05dfdfafafaf00f0af0400afafaf00faaf0000fcaf010000f6af 0000f6af0000f5af0000fcaf050000afafaf00f7af0000ddaf0264af00ea af0000e1af0000c8af0edfdf64dfaf646400d6d69dd6d6d6000900d69dd6 9d569d56dfdffcaf016464f7af0000fcaf0000fcaf0000e0af05dfdfafaf af00f0af0400afafaf00faaf0000fbaf0000f6af0000f6af0000f5af0000 fbaf0000cfaf0464af000000eeaffd00e1af0000c8af0edfdf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464f7af0000fcaf 0000fcaf0000e0af05dfdfafafaf00fcaffc00fcaffd0005af00afafaf00 faaf0000fbaf0300afafaffc0007afaf000000afafaffc0006afaf00af00 0000f9af0000faaf0600afaf00afafaffc0009afaf00afaf00af000000fc affd0001af00edaf00648faf0edfdf64dfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf016464f7af0000fcaf0000fcaf0000e0af1adf dfafafaf00afafaf0000afaf0000afaf0000afaf0000afafaf00faaf0000 fcaf1c0000afaf0000afaf0000afaf00afafaf0000afaf0000af0000afaf 0000faaf0000faaf1d00afaf00afaf0000afaf0000af00afaf0000afaf00 00afaf0000afaf0000edaf00648faf0edfdf64dfaf646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf016464f7af0000fbaffc00dfaf05dfdf afafaf00f8af0300afaf00fcaf0400afafaf00faaffa00f8af0700afaf00 afafaf00faaf0000fcaf0000faaf0000faaf0600afaf00afaf00faaf0300 afaf00fcaf0300afaf00fcaf0000edaf00648faf0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf05dfdfafafaf 00fcaffb0002afaf00fcaf0400afafaf00faaf0000f7affb0006afaf00af afaf00faaf0000fcaf0000faaf0000faaf0600afaf00afaf00faaf0300af af00fcaf0300afaf00fcaf0000edaf00648faf0edfdf64dfaf646400d69d d69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf11dfdfafafaf00 afafaf0000afafaf00afaf00fcaf0400afafaf00faaf0000f8af0c0000af afaf00afaf00afafaf00faaf0000fcaf0000faaf0000faaf0600afaf00af af00faaf0300afaf00fcaf0300afaf00fcaf0000edaf00648faf0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf 09dfdfafafaf00afafaf00fcaf0300afaf00fcaf0400afafaf00faaf0000 f8af0000fcaf0700afaf00afafaf00fcaf0200af00fcaf0000faaf0000fb af0700afafaf00afaf00fcaf0500af00afaf00fcaf0300afaf00fcaf0000 edaf00648faf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d56 56dfdffcaf016464ccaf1adfdfafafaf00afafaf0000afaf0000afaf0000 afaf0000afafaf00faaf0000f8af130000afaf0000afaf00afafaf0000af af0000af00fcaf0000faaf0000fcaf120000afafaf00afaf0000afaf0000 af00afaf00fcaf0800afaf0000afaf0000edaf00648faf0edfdf64dfaf64 6400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf05dfdf afafaf00fcaffd000daf0000afaf000000af00afafaf00faaf0000f7affd 0008af0000afaf0000afaffc0002afaf00fcaf0000faaffb00fbaf0300af afaffc0005afaf00afaf00fcaf0800afafaf000000af00edaf00648faf0e dfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf0164 64ccaf05dfdfafafaf00ecaf0000aeaf0000edaf00648faf0edfdf64dfaf 646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf05df dfafafaf00ecaf0000b3af050000afaf0000edaf00648faf0edfdf64dfaf 646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf07df dfafafaf000000f0affd00b2affc00ecaf00648faf0edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af 00648faf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656df dffcaf016464cadf81af00648faf0edfdf64dfaf646400d6d69d9d9d5600 0900d69dd69d569d56dfdffcaf0064c9df81af00648faf0edfdf64dfaf64 6400d69dd69d569d000900d6d69d9d9d5656dfdf80afc5af00648ddf0c64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc5af8cdf0c 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc5af8b64 0bdfaf646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc5af8adf 0aaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80648064cc640700d6 9dd69d569d000800d6d69d9d9d5656df80648064cb640700d6d69d9d9d56 000700d69dd69d569d5680008000c90006d69dd69d569d000600d6d69d9d 9d5680d680d6c6d6fd9d0156007f00d69dd69d569dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d6459dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69d569d000200d6d6e49d0156d6809d809dfc9d0156d6 e39d0156000300d69dd6e59d0256d6d6809d809dfd9d0256d6d6e59d0256 9d007f00d6d69d569d569d569d569d569d569d569d569d569d569d569d56 9d569d5656d6d6569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d7f569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d45569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d5656d6 d6569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 000100d6e25601d6d680568056fc5601d6d6e356ff0080008000ba00 grestore showpage %%Trailer geomview-1.9.5/doc/figs/command.ps0000644000175000017500000000771212310110173013744 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: blah-000.ps %%Pages: 1 %%BoundingBox: 198 342 414 449 %%EndComments %%Page: Image0 1 /picstr 1350 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def %%EndProlog %%Page: 1 1 gsave 198 342.72 translate 216 106.56 scale 450 222 8 [ 450 0 0 -222 0 222 ] { inputf picstr readstring pop } false 3 colorimage 78DAEDDDDB91DB3A1A85D18E5211302DC5D0D9F46BA762955546C1BC09247FF0 86B51E50B6A70F2D6BCAFB7C9238D35F5F006CF253C7F3F97C3C1E3F0007A9BD 42AFEBE72BFAFA69ECF9F82BFFED9C4EA773CFB3F60ABD2E9E5634FD62ACF4F8 9F0047A8B742AF2B0F5BB4D2E3F7DF2370EC8AD6BBF8B045DFEBEA743A9DCEA9 335FCBD116F514399D4EE7FC847E6C51F72D008CDED154D8A2F56E7F02B8A8A9 B59C5AD7A81B03DCE6E4743A0F3CD3106DBFDA8A16F5193D70F5DB93A256287F 91BEB445CF79A71670E3090D0CB0E10A95BF0B3ABAA27BB6E8C6A762EACF727E 577CCC70CB161D5DA1C2BF9EF997BDAF73A116ED8DE7E546C98AC2C95B74C55F E40BB5E87082AE354A26146ED3A2E92B2FD4A2251334FA4A3FFDB4F783A55F53 78FDA97F64F847B8EEFB12A045AFD8A21FD766EA95FE70C7869B56FE35F3D7DF FE65406B2DBAF4F6FE754FC5A2095DB47EE53F2E59ECD1AC2DF9A78090005BF4 12EF242DBA680A7AEB1DF872BE64CA364EE8E8BF0E0AD77B66546D2904B66879 A89CAA45D7BD2A0F6CD11D4274D1D23E977C10664821B645CBFF669DA74557BC A80F69D1F94F6D027FBC22386756F463A3025B5AB4F045FDD93EA35FF1D6E896 CFE8177DA0B37F883E7DAE0407B5E873C95BA3CDDE2F3AD3A595A2F439F1C1FD 7C55BAC709F66FD18D2B74EFFB4501DC2F5AE9A900B4A81605D0A25A14B87A8B AEF8A05C8B025A74C5966A51408B465D67458BA62FDB72BEAEE35BAF3A9DCE45 679ABE90AB45ADD04C8BA69FE6EB9AFE2C1B455D07684AE074445D2A6FD17C5A 5F86BFA3EF3A0D30F5FDE87BD3DAFBD6F3E90B7E01C8F4D6327D93FAFCD7F34C F58C01245DD7E5EF8B8EAE68EFD3284F1A409AD0B4A2859FD1E72BFA0DD0B0EE 9F45F78B5A5180D115D5A20047B56807D08CB47E812DFABE2C400B1F274DADE8 C616F5021F68E4557CBD16F5D21EB8B7F9150D69514F3270EFB743F76951CD0F DC4C1ABD7D5AD4130E34B8A25A14408B026851002D0AA045B528801605D0A200 5A14408B6A51C08A6A51002D0AA04501B4A81505ACA81605D0A2005A14408B5A 51408B6A51002D0AA04501B4288016D5A28015D5A2005A14408B0268512B0A58 512D0AA04501B4288016B5A28016D5A2005A14408B026851002DAA4501B42880 1605D0A2005AD48A0256548B026851002D0AA045AD286045B528801605D0A200 5A14408B6A51002D0AA04501B4288016D5A28015D5A2005A14408B0268512B0A 58512D0AA04501B4288016B5A28016D5A2005A14408B026851002DAA45012BAA 4501B428801605D0A25614B0A25A14408B026851002D6A45012DAA4501B42880 1605D0A2005A548B026851002D0AA04501B4A81505ACA81605D0A2005A14408B 5A51C08A6A51002D0AA04501B4288016D5A2005A14408B026851002DAA45012B AA4501B428801605D0A25614B0A25A14E0542DFA0B7047FBB4A8E71968734543 5A14E0DEEAB52840236AB4A8CE075A7B691FDBA2351E5E8D6B02C4BEBA3F618B A61BA56A5C13A0DE8A9EA145F3DB4D6B5C13B8A2ABBCA20F69D19055AF774DC0 8A06BEBCADD1A25614B8F78AE693B27F8BBE2E18B5A2EF4B0D4F2B0A375ED1C3 1F496F52766ED199AD5BD7A2BD09B5A260458F5DD1AA2DFA311AB528A0456317 4F8B025A74664287A3A74581D52B3A5C80F42BA3E330FF31CD795A747E427B7F 0A2D0AD458D1C2AF3F618B7EFD33BA78F97FAA45817D5AB4374AC3B13A5B8B6E 593C2D0AC4AE68FE83A98D3D558B6E5C3C2D0A2C5AD1A1F9280D5FD14BB468C9 1BAD33EF12005A74B44B0B5FD4DFA3453F4EA815052BBA6845CB1FC96DDE172D 9C502B0A56F4DBFBA24B96F9E33DA840CB2BFAED33FACDCB0CDC7545F771A716 ED5DB6F07F9B0F58D17A2B5AB545A7EE40D8B8A2F3136A45C18ADEA645573C3C FF2FCD8016B5A280165DD4A25D847AD7042EBDA2DD69546AD1D88757E39AC075 57B43B931A2D1AFEF06A5C13B8E88A762713DEA2000D0A6C51002BAA45018E6A D10EA019355AD4B30A346274FAA25A54DE03F7361590512DEA19065A5E512D0A A04501B428801605D0A25A1460638BA69F6A518092164DC1F95ED1C7FFB42860 45675A341FCCFC7DD17C63AD286045A75A34D75B51EF8B0294BC2F3ABAA2DE17 05F8F6193D40FD1675BF28801605D0A2005A14408B6A51002D0AA04501B42880 16B5A28015D5A2005A14408B0268512B0A58D1ED2DFA0BD0804A2DEA89051A5F D12D2D0AD0A0C01605B0A22B5AB403606D8B7ADE0056B7A8270D60758B7E01F0 BFF216FD01604C498BE65FE6743A9DCEE139D3A2B15EBF458DCB021CBE42332D 1AF85BBC1FBF21058E9AD0AA2BD46BD1F4E97CEC991E7FA5EB3B9D4EE7812B94 56F451CDFBF13F000E527585DCB700B0D11F63DEB779 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer geomview-1.9.5/doc/figs/light.ps0000644000175000017500000001245112310110173013431 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: blah-000.ps %%Pages: 1 %%BoundingBox: 233 354 378 437 %%EndComments %%Page: Image0 1 /picstr 903 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def %%EndProlog %%Page: 1 1 gsave 233.76 354.72 translate 144.48 82.56 scale 301 172 8 [ 301 0 0 -172 0 172 ] { inputf picstr readstring pop } false 3 colorimage 78DAED9DCB91E42A1045DBCAB2A05C7ACBB641DEF4765C791D53110A0D029440 262470EE8298D6A82889E270F9F3F585101AAF1F1B7D7F7FBF5EAF1F8466D6EB AFECE2FFC5E48AE1EF9FBA61F0FCEAF11312F609CF6CAC1EF3472786C1752D5D 9F1FA119757513A3F8033734C2909F12CD4EA21D205137FC5C272424B40B256E 482A11125A337875BD941BD27B8C90E9C084C40DED463110DA5919D78B5ED7EA A165B482704878663F574F55E186F49422BA3715C7DDAE6495BA21E386685E0C 55F2F09D68794B3088A7BF1B469FFF51C1C33F5EAFBB0D6D32E66E44B4308F05 B74DE486761842286EA8E886A599790D376CFF2C18E286FDDD30A8974EE18642 2BBC56BCAFFF155C0CAE672E926F7143DCB008C3284A293CA39FCA44887043B7 6E583A4FC0CE0DEF37D4B1067A9BBBA1BC2EE4C70D8B726CF0BDBA35D23AD0A2 315323DDD90D8BEA427EDCB0AE6259E486DDAC907E1BDC508EA12B37ACA897AA BB611D86F9EA28186EEB8645F5523F3DA515CD43B91BAA74CE28BA245ADB0DE5 CDC3AD7A4A532C970E55C8FF84C19DDDB091E8B5C70D8B0447A843DEDB73168D 103A1844B8E110372C6A562348C40DD54B24845CB961DD6C16D61B22DC5097E8 D25103DC10E1861E88AE70C3F3B32DE1E714806F76C623EC1E6AE5BD93E8F678 326EF8FDEF0E8A9FEBE7071BA5150F4203F39E56541937BC7F239B492264BA4F 69C066B025E949FD1F8490B6AE6E78DDBCF48AE1B51E4B8A21A4ABF7FB1DEC00 7CC730E865FA7CF0400869E8FD57453DA56088901D86C271433044083744A845 DE5A85B82102C3E13D33B821DA16433F7551DC1081A1370C71430486B8214260 881B2230DCD90D7FBF4878B1E886897285A45B1BE186A66EA88BE15C78CABBB5 33E9F051B74418586C5E5F361361344D70438B1F68250C253F562AB345FF9C08 C3A2470DDEB7E21B53091EAC39C20DA3097E2F03CF3F83EC17CD9C6ED96CC430 75A53F867D8A4D530C33451C6DC33B658FFFAEFBD516C030F8AF547DF55E7615 A5D8C06233F3A8C29AB910C30E19662E374CA5ADE4BA671F6CC730F382456597 2E86A6C566F486A218E418A648BF7F85B0B89BDD0D1BAFAF5A29CDC0589468EA 18DA159B290CE5CDD53A0C2BCA96C7C7DBC70DFDDBA20A868F5D34F2EB92D6E5 C062B367A554F7A53677C385DB861689361C43B9C1455B734695D28A977AEC7A 9DCE0D1FDB14D52D854D7A4A85D7EFA1B762B3AEF138DC0D67691BDE8B0E61CF 5BA68AB27CDB503E6E2869B3C88BAC81C566CF2E9A4C547618CE32A7748D396C 41AE783F49528849BA68323D7845188E2A36BBB50DF3455C4B71E7D60D8B7A1E D6C3F02DD0BC2FA8FB7B558FF54B30CC37E532031645C5DDBC6ED8799611725B 6CDA61D85FAC374493169BC268E79DDACD7A43B483704384C0D0CE0DDF3B8922 080C7DBAE127736E72E4071882A15B371476BCE386080C4DDD700700C1100CA7 70C3B57F3E305CE677742223370443E4FC777455C572E886757B0D81219A5ADE DC5017435D7EC11075C0D0AD1B3A890D0CD1746EF8B87FCEF5B6E80D99BD4A84 9FD29DD30886682E37ACDE9B2BBF6F58CB965F6088366F1BCA5749E7F70DB358 010D8668E1B6617411653B868FD18221C20DEF95523B374C75C5CC8561FFE118 964EEFD336EC5029DD04438B95B3F0B89B1B96564AEBBA68C0105BC40D336DC3 A3E4AC8496018B54CC5A99CD1AC3D293564A4F52C8DCDCFF1415D4C10D975407 0C255588F6535AF2E34460B8921B8261634BEDB1267F88B770977CA3FFEDCD71 43DCD00F86454336994A2918AEED865F8BCAA11B4A5AC7999A6A9FAE2D34C40D C1D0218687E0CCA6C71364D05C6E18F48E66F47883FA0767C7B0FD94968CEBB1 2FFA4A6ED88E61E6839986D292181E8993564A4F52788C192B5CD50DAB4DCDCE 46BD61E84A60B8BC1BDEDB20A903B9247E0786160C82E1DA6DC3C7A64D740E1B 18C2206EA8E886F7464DD1753044B8A18A1B822142B8A12B0CDF686FE1866088 5C1D83D2D30D255D31BB61F81F2A97DD715D3D9F7F881BE6072CA270E5C72CC0 100C85A7E0C96FF68061CF39A5FD2102C3C5301426B2FC4E27189AAEB0C84FCA 024304867DDCF03E580C8630058607ABEF4B04866038911B82211882A1073794 AFE3AE98C798AAE8822118E286BA18B62C33074330C40D8BE8004304863DDD30 BA3F6DE3D184600886B8A11C438BA309691B82216E588A6194A0EA3DFAFAAF51 0543305CC00D15311CB24E1C0CC110371CCB20187AC350BEA448BEFE08371462 3870BF1430F483A1D132C01DDC50E568C2C530FC8376D5A8593499018B2865A9 D3883233C6E7C290AC088663E794CEB8171F5B422123755B6191AA948221423D DD70D4946C3044B8E1320243B4801B8221423DDD90F586080D7743D61B22E4C7 0D25D60686080C596F08866893B6A1C57A433044B8612986517CAA173AD14583 70C3E1CB7E7143841B822142DBBA213DA50837F4B6DE705E0CD758A4C37AA596 F54DFDDDF0505A6F78AC328B66DE8C749DAFE8F609FD275D073774D5A6F38CE1 A4D527CF6F71DDD6C073D27570C39485E56D0E0CC1100C596F088660B8B61B2E 203004C305DC100CC1100C7143300443DC100CC1100C7143300443DC100CDB31 2CEA6AB6E8916EC7507D4306218675BB4C2BA6216EB8008641E691E42587184A 28B0C330939EEA85066EB82A867639A4278647EDA979BA181E4A47D9AA63881B BAC5509219EE46139DD07BBFA1A89266846174BE71E6BA0A86F2244ADD10BD3F E5F82D6E78D2871BBAC5F071F58A64D7910E18E6B3B7D6A3D661D892868F2FD2 EE86AF7F851BFAC43095B584370CC750F278D618B6A761FE81E56E7825EEDA36 3CBD123704C33A0C334D33271846BB52E5371C4FA7FE15B9E1A90043DA8660D8 88A124273B71C38A1B1E9FB0A86D18C590B6A1E79E52DCB0BDA7D40F86F4943A C7B0A25B43DEBD608A613E0F0FE9A291A767E72E1AC60D3D631854ED3255BE4C 6F64E68681181EBD062CF2B368EAD2304A5FCB80056EE81FC3E1624EA956D2E1 866008866E31C40DC1100C714330044330C40DC1100C714330044330D472C3B5 373F074330F4EF86CB9F41008660E8D90DF7111882A14F37E45C9EEA96E68CF2 FF166E1FCCD40D510586F3D607FCBF85DB073375438450637D153744C80986B8 2142B8214260881B22841B220486A56EF84608E9A9C20D4934842C3094BBE117 42C8407237FC410859EAD10DAF54121212DA852937D4D5EFB758448B504F9966 E3941B2AC6FF797E48440B6068C448E086671FA96E783F1D839070AEF0CCC646 F19F18BECC743F460AA1E9649A8DE93D46C883FE07744278A5 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer geomview-1.9.5/doc/figs/mat.ps0000644000175000017500000012060012310110173013077 00000000000000%!PS-Adobe-3.0 %%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner %%Title: foo.ps %%CreationDate: Mon May 19 07:57:13 2008 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%Pages: 1 %%BoundingBox: 14 14 143 186 %%EndComments %%BeginProlog % Use own dictionary to avoid conflicts 10 dict begin %%EndProlog %%Page: 1 1 % Translate for offset 14.173228346456694 14.173228346456694 translate % Translate to begin of first scanline 0 171.35241971158101 translate 128.15433070866143 -171.35241971158101 scale % Image geometry 178 238 8 % Transformation matrix [ 178 0 0 238 0 0 ] % Strings to hold RGB-samples per scanline /rstr 178 string def /gstr 178 string def /bstr 178 string def {currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} {currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} {currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} true 3 %%BeginData: 40326 ASCII Bytes colorimage k>\,Qb#El~> k@pUgb%ZA~> kIdJeb.N6~> ku7c`qnTP6TEM=BnbrF2<.F~> l"L8!r6WHZ\-0V%p&=s8Bn-~> l+@,trSQ8'c32Y[q#:9;]RT~> qc*%_!Ud:eT*(hdrVP+Cqc&(~> qe>Qu!rhc1TXP$6rr2iFrVL;Z~> qn2Cs!VY0=c3)Gmrr(@Gqn.F~> r`&pr!rKX5oU5iTrQ+Q!p&MOj!i#YBfU;r>c1(]1rD\:~> rb;E2!rL-ToWJ>'rmgSHp&MP.!kJrFpc~> rk/:1!rU]toY^gPro3Lmp&MPF!mpr.fYdp9iqEBNrOdX~> s&B$s!U[&\R/tssnX9@V")Yj0qY^E%R0*9aQe.W-SGiE+r`"C~> s(VN3!V!kpXo[JCnZr,o")Yj0qY^E%Z3't'XOjTWZ2OXLrb6l~> s1JC2!VFb0_ZAuhn]Un3")Yj0qY^E%b6%YA_:QR,`W#knrk*a~> s&9$t`;Gi&[d!A.ZMTje^&@G`$37NYYJS9&be!iTiK=3@qNCmYhi\)8rJQj s(MN4d/9mH`9m3L_Y^>6bPq"5$37NYYJS9&be!iTiN3+[qQ9ethlR!jrh-4hWW:WGo`3SAWW:WG o`3SAWW:WGo`s'JWj)I#Bk`(~> s1AC3h#+qjeFWFpdegf\f`(B\$37NYYJS9&be!iTiPtruqT&X9ho>iFrj9B<^] !`]-Qr/h3.lL=#sii)d;!S./ !bqVmr29hPmdoi0l+?kl!T*hFWsSj3g\CQh^:qkm!<&r%s5^5]jT#%V!<;\l!WN/sX8i4VWrhji U].1ul1Y#GnaGl/kNVrD$0h0\oC;;:ki_4/W!V_^qt'@HmHE`trhoqrrHN%,~> !keNtr4`HqoChbDn'(^E!U'IO`X2^Ng\CQh^:qkm!<'n@s4PE3q#C00!<;]2!WN/s`rH(q`WGkK \c0>Mn+lnUp%7hDmdL+h$1I]fp\"1Ln*]ZC^BsB)r:fmVo'c#8rkAR5rg:?K~> s8DkR#d*1Tqt/e%e>rP+!W)caM#[PSrrpZpa1G=OrJ:s_`aal'rr@nFs7kE,rr<"T"g@1ac\[MX rsFV_M2@`%pm?pa#QrO,RR~> s8Dkj#eoToqtB15h7W]]!W;rdV>pVprrpZpa1G=OrMC#'nXHEPrrAq rsGY'VP_K8po((is5'USf#!aPUC,*+m/?hWp?(MYP5_3`aQW!hqt]sJk/`_bUCbN1m/?hWp?(MY P,"eVrP`]*~> s8Mr.#gi)6rV>jIk0GN* rsH[D_o)!Cpr()Ms5(Wpj3t.0]*d0Ync&I`q s8DnO$';USm/$J=f\X%7L]@>BL&_5PrrqE5f#:VhrIuWu.8YlOrr@eeR5FqdLAq5RLB$C)s+Q4- ci=(G!/A/k2!&l[s5&J3V9sSfLC0d0hY6j@p"J)nFT.%&U>"Juq#L*AfqNTfLC0d0h>mBHo`3[> FT.$smI3Mo~> s8Dnh$)ki+nGE%Ii8qrVT`>#\U]:DnrrqE5f#:VhrM1b>BgetXrrAkNJQ)T@V#LDpV#S/Ns.lIj PQ1^`!2SER;oYI0s5'OQ]A/MITF/-ejSA]KpYt/?MZ07U[c6BDqZ-BMiO4XCTF/-ej8f)QpAj0\ MZ07MnFKq9~> s8Mu-$,>$Yp&4dXl0[%"\c;Zu_#OK6rrqE5f#:VhrP9f[^4t$"rrBmr8<3_b_>aK8_>fk6s1uPO @fQN/!5[_$Ng7BZs5(QndH7>*\I-IDm/-bYqWmFgT`2J/am/6ir;c][lH,^u\I-IDli@"]q>fg& T`2J'o_*HY~> s7?2=!I!,m!!:s%HN&BpqYfo5!!)rs"QID<8c\g>&cVk0oE,$mJ(XJprrR]M!.TLsrso6^rr@Ou rr@u0rr;s!s8Ur*!lLRIrdP8ubgGnLnaFlLG&I;/!d;f8r;ZrIb][n'Ifaf;dJX%IdEHcOrI4kH 4b*~> s7Q>Z!L)I=!!;36PQ%!Or;Q2W!!)rs"QID<8c\g]&cVk/r s7lQ"!O1hc!!;KIXT#R-r;Q3!!!)rs"QID<8c\h'&cVk&rZ;(>^%;4&ru8ZO!56)ErspitrrBaG rrC[Bs8W';s8Urh!oV1krj3$:ioTq0q"Nn0YabX!!jL\Gr;Zr]iinpOZi[Jkjo#/]jl3M6rNlV) C4H~> s6fi4!bL0:qu?fPgN!4>s8DG6!!)rs"P@TK!!)tE'E8(#r#5S8HiJWurr@EG!.0(m1&_._HiF(m HiF*-rso22!<<)UHNLdTC]8Y^A]`6rliYPTASV3k!bKL!qu?f?ASV3k"(fU"m/?tecH0X4rHeS> 4b*~> s7-&S!f#akqu?fXj,(eV8\TQNDolg&(gOeV8\TQNMumg%#%A"524ZK)M#: pf)b~> s7Q>r!iG8GquHc^!2KP!s8MN"!!)rs"P@TK!!)u0-3!uCjd5uI]Dk84rrKb3!5#lC"TSN(]DhlC ]Dhm0rs'5;!WW2V])pd4S,T]#VW$S.p@e1>iMN(CZ3$o^j88lYiMN(CZ3-u_j7WBO"68@;Rf0Mm qJ(N~> s5a-#$<=%Pec5^8j5$YFrcA1urU=n9!%PMYs$n:n:B1CnF92CArcB(Y!-HB]s8N(@kl5aHN5bYO /Th!mFEIN_K$+)m!W`9#hK/hNH=m.u$:W7ekNM-md*>'jrcAK9cHtb!_(D]r;ZrH c:):BF91\jJ,~> s69KE$@08nGLmI'E0g=U7jrfIP)f\5`\md8`\D12DG!c?TDr;ZrR fPQ'8OTFoMJ,~> s6ooh$D#H'kPtVTnE\>driQ:grp[E)!%PMYs$n:n:B1Cn\,lU0rjWmH!4_1js8N)/q#@k6U#Gh+ *k;4M\@DP=fB3)4!W`9#hREXP[@7)t$C'T4oCV\Hjl;SkriQTmj5on)o^h2)Pa; s53co$=7Q#dcCJpjP+K\rbqnNrU=e+!!O28p)P(grW)n9rrE":!s!:O)?'ULE)m>HE,\YW"@[80 !,ulW!,uKMrVut s5j3>$@drjgZnk/lJd_Nrf.$%rpZ0P!!O28p)P(grW)n]rrE"^!s"R&(]FCJPYDD`Pa#2M#]#Y) !0i]J!0h=$rVut`!8j"CQhk]Orf.%ghVA#/!o@@4rf.%ghVA#/!o@@4rf.=ohV8)2mf3@E@=.s5 !U s6T]b$DFK`jm`?DnE[*Ari6(Prp[Ar!!O28p)P(grW)o*rrE#+!s#cB')hkE[Qt&s[^K0:&"'d* !4K<9!4HM@rVuu-!8k3e\GM,Nri6*YkN;[B!p>K+ri6*YkN;[B!p>K+ri6BakN2aEoDemSMj41@ !UsiS~> s4$s[$!!&?hW==i/h:K2BE?_YnS7at[;#g-rDd;*BF5a6h;dV[lf[1G>5i1B*8B<0jlbsmi#Gr" BF5a6h;dV[lf[1G>5`+8g-'r~> s5!U/$$`B,jm)O)>"jPHL]QGDnW3AD[>tFWrbm;cL^Hi8jQZ!tnEf:2FoI1(9]G-tlg=3.k"Kps L^Hi8jQZ!tnEf:2Fo@*siDb=~> s5s6W$(8NlmI9o@L2 s3LUR$"G;[^"o/[/OO%HA-/@oGFN4IrP_fFraZ?JgY:]HjQH!s&Q\mA$5)%IiSrq]n*1KcraZ?J gY:]HjQH!s&Q\j@!Rs8_~> s4R=($%l#tbN,mT79P9AK`\USR@B-;rmGk;re1\IioB4clKn-27!&?]$:Nn6kNM3toC#(gre1\I ioB4clKn-27!&<\!Sp_*~> s5X$R$);[5g$H_N>]->8V#n^4\sor,rnid.rhTsFlK[g*nFH>FG)lQu$?k_"mdBT8p[`QgrhTsF lK[g*nFH>FG)lNt!Tn-I~> s2FkA#?t1p4?Pr1>Ph_.fDU,hA-KI@GXbkBrE]IiqDSF@<;g,'62EM@5udeh!($H?!C9]`?3//2 J,~> s3^^o#CLSr;Gp\>I/AEqi;T:=M$;$#QX>)hrI=lMqF^ikF8^Uh=SbYk=EFFk!*K(j!EaFAJ-"/! J,~> s5!RG#G$usB4l4HSbo)^kPi/dXTdGX[ s1nJ9"^=r(;H-ls>Q\cjrPG7;#%s5"rBa4^r*05#qG.,j=oDS*;u08j;d''(!)r_i!E3/">QM`* J,~> s3:Ch"atK3E--O)IKPJ_rm@Ep#*#hcr`a,br-eWcqJ?7QHMr9mEVaMQEI.S4!-.jP!HEGaIK@bo J,~> s4[=A"eCg9NKTk/T*)%RrnjEM#-uAMrc66Rf/iYO8=\6O.-$>!0?u5!KW]JT)m_^ J,~> s0h5r!Go3;r<0r$7T3C9=TPupJ,~> s2F;M!K"dgrWLPK?ugJ=H3)#bJ,~> s4$A'!N+>=rWM"oHB=H?RK:rRJ,~> s0:ll"]n]9N397[WX"rC8OQ6K<`d[N!O4e<~> s2"#H"aG0EUqaXA]a(a3AR9%gGBhM\!Pq`c~> s3^/#"dbIL]?np&c3M:tIs-L(Q^H0g!RYY4~> s/^dde@u&[X?D(~> s1Nuue@u'#]i9L~> s3?21e@u'?c>%k~> s/^dde\;3I:96U/~> s1Nuue\;3ICV<\t~> s3?21e\;3ILX'Xb~> s/c78Ja`U,gqWmX"-63Y4b*~> s1SHIJa`U,gqWmX"-762<.F~> s3CYZJa`U,gqWmX"-85_C4H~> s/c78Ja`U,h7j/Tn*c<4X?D(~> s1SHIJa`U,h7j/Tn*c s3CYZJa`U,h7j/Tn*c%k~> s/c78Ja`U,!5IF[s,[3K"-63Y4b*~> s1SHIJa`U,!5IF[s,[3K"-762<.F~> s3CYZJa`U,!5IF[s,[3K"-85_C4H~> s/c78Ja`U,!5IF[s,[3K"-63Y4b*~> s1SHIJa`U,!5IF[s,[3K"-762<.F~> s3CYZJa`U,!5IF[s,[3K"-85_C4H~> s/c78Ja`U,!5JF"r;c*Ns,[3K"-63Y4b*~> s1SHIJa`U,!5JF"r;c*Ns,[3K"-762<.F~> s3CYZJa`U,!5JF"r;c*Ns,[3K"-85_C4H~> s/c78Ja`U,!5JF"!!*#e!!) s1SHIJa`U,!5JF"!!*#e!!) s3CYZJa`U,!5JF"!!*#e!!) s/c78^@)%%o^;b[p[8(^g[>-WqsOLbrU1-pn*^5Vn*^8F!!)KVrW)f`s,[3K"-63Y4b*~> s1SHI^@)%%o^;b[p[8(^g[>-WqsOLbrU1-pn*^5Vn*^8F!!)KVrW)f`s,[3K"-762<.F~> s3CYZ^@)%%o^;b[p[8(^g[>-WqsOLbrU1-pn*^5Vn*^8F!!)KVrW)f`s,[3K"-85_C4H~> s/c78^@)%%r9jUcqX4Cad-gtLqsOLbrU19tmf;hF!:Kmfmf;hF!:KmfqsXQGs6g&N:96U/~> s1SHI^@)%%r9jUcqX4Cad-gtLqsOLbrU19tmf;hF!:Kmfmf;hF!:KmfqsXQGs6g&NCV<\t~> s3CYZ^@)%%r9jUcqX4Cad-gtLqsOLbrU19tmf;hF!:Kmfmf;hF!:KmfqsXQGs6g&NLX'Xb~> s/c78^@2(%rpKgerpLR%mf3@V!:T@Vmf3@V!:T@Vmf3@V!9!;G^\dI"!<)?k!:KpVmf;eVr9sRa qsXQGs6g&N:96U/~> s1SHI^@2(%rpKgerpLR%mf3@V!:T@Vmf3@V!:T@Vmf3@V!9!;G^\dI"!<)?k!:KpVmf;eVr9sRa qsXQGs6g&NCV<\t~> s3CYZ^@2(%rpKgerpLR%mf3@V!:T@Vmf3@V!:T@Vmf3@V!9!;G^\dI"!<)?k!:KpVmf;eVr9sRa qsXQGs6g&NLX'Xb~> s/c78^@)+'mf<.O!W_Zhr9jdhmf;hF!8HrB^\dI"!<)?k!:KpVmf;eVo'cU>s6g&N:96U/~> s1SHI^@)+'mf<.O!W_Zhr9jdhmf;hF!8HrB^\dI"!<)?k!:KpVmf;eVo'cU>s6g&NCV<\t~> s3CYZ^@)+'mf<.O!W_Zhr9jdhmf;hF!8HrB^\dI"!<)?k!:KpVmf;eVo'cU>s6g&NLX'Xb~> s/c78^@)%%rpKgerU0min*^8F!;c-g!:T@Vmf3@Emf:-"mf3@emg&p^mf;hF!:KpcmfNRY!!)ob s,[3K"-63Y4b*~> s1SHI^@)%%rpKgerU0min*^8F!;c-g!:T@Vmf3@Emf:-"mf3@emg&p^mf;hF!:KpcmfNRY!!)ob s,[3K"-762<.F~> s3CYZ^@)%%rpKgerU0min*^8F!;c-g!:T@Vmf3@Emf:-"mf3@emg&p^mf;hF!:KpcmfNRY!!)ob s,[3K"-85_C4H~> s/c78^@)%%rpKgeqX4Icmf<4Q"T\#[!:KpDmf:-"n,37bn,ECfmf3@cn,<=`n,JIKmfSVGX?D(~> s1SHI^@)%%rpKgeqX4Icmf<4Q"T\#[!:KpDmf:-"n,37bn,ECfmf3@cn,<=`n,JIKmfSVd]i9L~> s3CYZ^@)%%rpKgeqX4Icmf<4Q"T\#[!:KpDmf:-"n,37bn,ECfmf3@cn,<=`n,JIKmfSW+c>%k~> s/c78^@).(n*^8Sn,E@kmf;hF!:Tmes6g6on*^8Fmf3@V!9*AH^YeM[O8nYNO%uc>J,~> s1SHI^@).(n*^8Sn,E@kmf;hF!:Tmes6g6on*^8Fmf3@V!9*AH^YeM[O8nYNO))F.J,~> s3CYZ^@).(n*^8Sn,E@kmf;hF!:Tmes6g6on*^8Fmf3@V!9*AH^YeM[O8nYNO,)"qJ,~> s/c78Ja`U,!5IF[s,[3K"-63Y4b*~> s1SHIJa`U,!5IF[s,[3K"-762<.F~> s3CYZJa`U,!5IF[s,[3K"-85_C4H~> s/c78Ja`U,!5I?Ns6g&N:96U/~> s1SHIJa`U,!5I?Ns6g&NCV<\t~> s3CYZJa`U,!5I?Ns6g&NLX'Xb~> s/c78Ja`U,!5I?Ns6g&N:96U/~> s1SHIJa`U,!5I?Ns6g&NCV<\t~> s3CYZJa`U,!5I?Ns6g&NLX'Xb~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78qX4Xhn*^8F!:KpTmfWXZmf3@bmfELX!;5d\!1!!TO%uc>J,~> s1SHIqX4Xhn*^8F!:KpTmfWXZmf3@bmfELX!;5d\!1!!TO))F.J,~> s3CYZqX4Xhn*^8F!:KpTmfWXZmf3@bmfELX!;5d\!1!!TO,)"qJ,~> s/c78p$Vq^mf;bD!!*#e!!)ob!W_Zhp$Vk\Q1"g9:96U/~> s1SHIp$Vq^mf;bD!!*#e!!)ob!W_Zhp$Vk\Q1"g9CV<\t~> s3CYZp$Vq^mf;bD!!*#e!!)ob!W_Zhp$Vk\Q1"g9LX'Xb~> s/c78qPjO%uc>J,~> s1SHIqPjO))F.J,~> s3CYZqPjO,)"qJ,~> s/c78q s1SHIq s3CYZq%k~> s/c78q s1SHIq s3CYZq s/c78p[8:dmf;eVmf<1P!W_ZhqX4CarpKmgmf<=T"9@ljmf<1P!W_Zhr9jjjmf;hF!:Ko^mfSVG X?D(~> s1SHIp[8:dmf;eVmf<1P!W_ZhqX4CarpKmgmf<=T"9@ljmf<1P!W_Zhr9jjjmf;hF!:Ko^mfSVd ]i9L~> s3CYZp[8:dmf;eVmf<1P!W_ZhqX4CarpKmgmf<=T"9@ljmf<1P!W_Zhr9jjjmf;hF!:Ko^mfSW+ c>%k~> s/c78rU9^crpL*mmf;eVn*^5VrpTgdrpTjer9jUcrpL3pn*^5Vn*^8F!:TCU!<;Ne!<2Eq!:Kmf mf;eVn*^8Fn,<=en,<=Bn'd?rmfSVGX?D(~> s1SHIrU9^crpL*mmf;eVn*^5VrpTgdrpTjer9jUcrpL3pn*^5Vn*^8F!:TCU!<;Ne!<2Eq!:Kmf mf;eVn*^8Fn,<=en,<=Bn'd?rmfSVd]i9L~> s3CYZrU9^crpL*mmf;eVn*^5VrpTgdrpTjer9jUcrpL3pn*^5Vn*^8F!:TCU!<;Ne!<2Eq!:Kmf mf;eVn*^8Fn,<=en,<=Bn'd?rmfSW+c>%k~> s/c78M=8oSrU0iL:96U/~> s1SHIM=8oSrU0iLCV<\t~> s3CYZM=8oSrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1S.n*^5Vg$\pUrU0iL:96U/~> s1SHIM=1S.n*^5Vg$\pUrU0iLCV<\t~> s3CYZM=1S.n*^5Vg$\pUrU0iLLX'Xb~> s/c78s6l#0!5JO%!0>\!!5JL$"-63Y4b*~> s1SHIs6l#0!5JO%!0>\!!5JL$"-762<.F~> s3CYZs6l#0!5JO%!0>\!!5JL$"-85_C4H~> s/c78s6ouKV=3ccrpKiJeaELQrU0iL:96U/~> s1SHIs6ouKV=3ccrpKiJeaELQrU0iLCV<\t~> s3CYZs6ouKV=3ccrpKiJeaELQrU0iLLX'Xb~> s/c78s6ouKV=+E!q s1SHIs6ouKV=+E!q s3CYZs6ouKV=+E!q s/c78s6ouKV=+E!q s1SHIs6ouKV=+E!q s3CYZs6ouKV=+E!q s/c78s6ouKV=+E!q s1SHIs6ouKV=+E!q s3CYZs6ouKV=+E!q s/c78s6ouKV=+E!q s1SHIs6ouKV=+E!q s3CYZs6ouKV=+E!q s/c78s6ouKV=+E!q s1SHIs6ouKV=+E!q s3CYZs6ouKV=+E!q s/c78s6ouKV=+E!mZ.@_rpKiJqsOLbh!Y6XrU0iL:96U/~> s1SHIs6ouKV=+E!mZ.@_rpKiJqsOLbh!Y6XrU0iLCV<\t~> s3CYZs6ouKV=+E!mZ.@_rpKiJqsOLbh!Y6XrU0iLLX'Xb~> s/c78s6ouKOMCe`!0>\!!5JL$"-63Y4b*~> s1SHIs6ouKOMCe`!0>\!!5JL$"-762<.F~> s3CYZs6ouKOMCe`!0>\!!5JL$"-85_C4H~> s/c78s6frKO2(\_!0>\!!5JL$"-63Y4b*~> s1SHIs6frKO2(\_!0>\!!5JL$"-762<.F~> s3CYZs6frKO2(\_!0>\!!5JL$"-85_C4H~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78lL+]QnF-;Uq="=`_!_8aeA(tN"-63Y4b*~> s1SHIlL+]QnF-;Uq="=`_!_8aeA(tN"-762<.F~> s3CYZlL+]QnF-;Uq="=`_!_8aeA(tN"-85_C4H~> s/c78r9sXchsUOFrpKgeqsORdmf<%L!!&MW"-63Y4b*~> s1SHIr9sXchsUOFrpKgeqsORdmf<%L!!&MW"-762<.F~> s3CYZr9sXchsUOFrpKgeqsORdmf<%L!!&MW"-85_C4H~> s/c78r9sXcrpL!jmf;eV!<2He!<;Kq!:T@V!:T@Vmf3@VrW)rd!!*#e"p",\!!)KVrW)uerW)ue rVurerVurerW)uerW)rdrW)uerW'1k"-63Y4b*~> s1SHIr9sXcrpL!jmf;eV!<2He!<;Kq!:T@V!:T@Vmf3@VrW)rd!!*#e"p",\!!)KVrW)uerW)ue rVurerVurerW)uerW)rdrW)uerW'1k"-762<.F~> s3CYZr9sXcrpL!jmf;eV!<2He!<;Kq!:T@V!:T@Vmf3@VrW)rd!!*#e"p",\!!)KVrW)uerW)ue rVurerVurerW)uerW)rdrW)uerW'1k"-85_C4H~> s/c78rU1$mn*^8Fmf;hF!;c-j!:KpV!:T@Vmf<+NrW)rd#lsG_!:KpV!:Kp^mf3@cmfrj]!:T@V mf<1P!!':m"-63Y4b*~> s1SHIrU1$mn*^8Fmf;hF!;c-j!:KpV!:T@Vmf<+NrW)rd#lsG_!:KpV!:Kp^mf3@cmfrj]!:T@V mf<1P!!':m"-762<.F~> s3CYZrU1$mn*^8Fmf;hF!;c-j!:KpV!:T@Vmf<+NrW)rd#lsG_!:KpV!:Kp^mf3@cmfrj]!:T@V mf<1P!!':m"-85_C4H~> s/c78p[81an*^8QmfNRY!:Tjd!Ug$_mf`^[mf;hFr;Zuh!:KpVr;c]_!W_]Xr;[&j!:T@Vmf<:S r;a+k"-63Y4b*~> s1SHIp[81an*^8QmfNRY!:Tjd!Ug$_mf`^[mf;hFr;Zuh!:KpVr;c]_!W_]Xr;[&j!:T@Vmf<:S r;a+k"-762<.F~> s3CYZp[81an*^8QmfNRY!:Tjd!Ug$_mf`^[mf;hFr;Zuh!:KpVr;c]_!W_]Xr;[&j!:T@Vmf<:S r;a+k"-85_C4H~> s/c78p[81an*^8QmfWXZ!:Kpdmf3@^mf3@emfELX!<)?h!:KpV!;Z'b!:Kpcmfrj]!:T@Vmf9 s1SHIp[81an*^8QmfWXZ!:Kpdmf3@^mf3@emfELX!<)?h!:KpV!;Z'b!:Kpcmfrj]!:T@Vmf9 s3CYZp[81an*^8QmfWXZ!:Kpdmf3@^mf3@emfELX!<)?h!:KpV!;Z'b!:Kpcmfrj]!:T@Vmf9 s/c78rpKgerU0mimf;hF!<)?p!:Kmfmf;eVn*^8F!;Gp^!<2FJ,~> s1SHIrpKgerU0mimf;hF!<)?p!:Kmfmf;eVn*^8F!;Gp^!<2F s3CYZrpKgerU0mimf;hF!<)?p!:Kmfmf;eVn*^8F!;Gp^!<2F s/c78M=8oSrU0iL:96U/~> s1SHIM=8oSrU0iLCV<\t~> s3CYZM=8oSrU0iLLX'Xb~> s/c78M=8oSrU0iL:96U/~> s1SHIM=8oSrU0iLCV<\t~> s3CYZM=8oSrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1S.n*^5Vg$\pUrU0iL:96U/~> s1SHIM=1S.n*^5Vg$\pUrU0iLCV<\t~> s3CYZM=1S.n*^5Vg$\pUrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78s6l#0!5JO%!0@*I!s%fY!<2Ee!9*AH^]!U'O%uc>J,~> s1SHIs6l#0!5JO%!0@*I!s%fY!<2Ee!9*AH^]!U'O))F.J,~> s3CYZs6l#0!5JO%!0@*I!s%fY!<2Ee!9*AH^]!U'O,)"qJ,~> s/c78s6ouKk3q]P_!_9 s1SHIs6ouKk3q]P_!_9 s3CYZs6ouKk3q]P_!_9%k~> s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bqJ,~> s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bpl>EiplE5Z!5JO%!0>\!!5JL$"-63Y4b*~> s1SHIs6ouKk3i;bpl>EiplE5Z!5JO%!0>\!!5JL$"-762<.F~> s3CYZs6ouKk3i;bpl>EiplE5Z!5JO%!0>\!!5JL$"-85_C4H~> s/c78s6ouKOMCe`!0>\!!5JL$"-63Y4b*~> s1SHIs6ouKOMCe`!0>\!!5JL$"-762<.F~> s3CYZs6ouKOMCe`!0>\!!5JL$"-85_C4H~> s/c78s6frKO2(\_!0>\!!5JL$"-63Y4b*~> s1SHIs6frKO2(\_!0>\!!5JL$"-762<.F~> s3CYZs6frKO2(\_!0>\!!5JL$"-85_C4H~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78rU9adrpKgerU0^dR-t$9eA(tN"-63Y4b*~> s1SHIrU9adrpKgerU0^dR-t$9eA(tN"-762<.F~> s3CYZrU9adrpKgerU0^dR-t$9eA(tN"-85_C4H~> s/c78rpKgerpKmgmf7q-iU6l0:96U/~> s1SHIrpKgerpKmgmf7q-iU6l0CV<\t~> s3CYZrpKgerpKmgmf7q-iU6l0LX'Xb~> s/c78rpKger9sUbs6g*kmf;eV!;uJ,~> s1SHIrpKger9sUbs6g*kmf;eV!;u s3CYZrpKger9sUbs6g*kmf;eV!;u s/c78r9jUcrpL'ln*^8F!:Kp^mfrj]!:T@Vmf7q-qX4NI:96U/~> s1SHIr9jUcrpL'ln*^8F!:Kp^mfrj]!:T@Vmf7q-qX4NICV<\t~> s3CYZr9jUcrpL'ln*^8F!:Kp^mfrj]!:T@Vmf7q-qX4NILX'Xb~> s/c78qsXOb#k%c^mf;eVmf<+N!J,~> s1SHIqsXOb#k%c^mf;eVmf<+N! s3CYZqsXOb#k%c^mf;eVmf<+N! s/c78rpKgerpL-nmf;hF!:KpV!;Gp`!:Kp[mf3??mfSVGX?D(~> s1SHIrpKgerpL-nmf;hF!:KpV!;Gp`!:Kp[mf3??mfSVd]i9L~> s3CYZrpKgerpL-nmf;hF!:KpV!;Gp`!:Kp[mf3??mfSW+c>%k~> s/c78rpL9rn*^5Vmf;hF!:KpV!;Gpe!:KpVmf;eVq s1SHIrpL9rn*^5Vmf;hF!:KpV!;Gpe!:KpVmf;eVq s3CYZrpL9rn*^5Vmf;hF!:KpV!;Gpe!:KpVmf;eVq s/c78M=8oSrU0iL:96U/~> s1SHIM=8oSrU0iLCV<\t~> s3CYZM=8oSrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1S.n*^5Vg$\pUrU0iL:96U/~> s1SHIM=1S.n*^5Vg$\pUrU0iLCV<\t~> s3CYZM=1S.n*^5Vg$\pUrU0iLLX'Xb~> s/c78s6ku/rpKiJeaELQrU0iL:96U/~> s1SHIs6ku/rpKiJeaELQrU0iLCV<\t~> s3CYZs6ku/rpKiJeaELQrU0iLLX'Xb~> s/c78s6ouKp[@LaYO;J+rpKiJeaELQrU0iL:96U/~> s1SHIs6ouKp[@LaYO;J+rpKiJeaELQrU0iLCV<\t~> s3CYZs6ouKp[@LaYO;J+rpKiJeaELQrU0iLLX'Xb~> s/c78s6ouKp[@ml!0?oi!0=>P!5JO%!0@$G!W_]Xr;bjG!5JL$"-63Y4b*~> s1SHIs6ouKp[@ml!0?oi!0=>P!5JO%!0@$G!W_]Xr;bjG!5JL$"-762<.F~> s3CYZs6ouKp[@ml!0?oi!0=>P!5JO%!0@$G!W_]Xr;bjG!5JL$"-85_C4H~> s/c78s6ouKp[8*sq s1SHIs6ouKp[8*sq s3CYZs6ouKp[8*sq%k~> s/c78s6ouKp[8*sq s1SHIs6ouKp[8*sq s3CYZs6ouKp[8*sq%k~> s/c78s6ouKp[8*sq s1SHIs6ouKp[8*sq s3CYZs6ouKp[8*sq s/c78s6ouKp[8*sq s1SHIs6ouKp[8*sq s3CYZs6ouKp[8*sq s/c78s6ouKp[8*smZ4R?!5JO%!0@$G!s%fY!8m5F^]!U'O%uc>J,~> s1SHIs6ouKp[8*smZ4R?!5JO%!0@$G!s%fY!8m5F^]!U'O))F.J,~> s3CYZs6ouKp[8*smZ4R?!5JO%!0@$G!s%fY!8m5F^]!U'O,)"qJ,~> s/c78s6ouKp[@L1YO;J+rpKiJqsOLbrpTgdipQl^rU0iL:96U/~> s1SHIs6ouKp[@L1YO;J+rpKiJqsOLbrpTgdipQl^rU0iLCV<\t~> s3CYZs6ouKp[@L1YO;J+rpKiJqsOLbrpTgdipQl^rU0iLLX'Xb~> s/c78s6frKO2(\_!0>\!!5JL$"-63Y4b*~> s1SHIs6frKO2(\_!0>\!!5JL$"-762<.F~> s3CYZs6frKO2(\_!0>\!!5JL$"-85_C4H~> s/c78M=1S.n*^5Vg$\pUrU0iL:96U/~> s1SHIM=1S.n*^5Vg$\pUrU0iLCV<\t~> s3CYZM=1S.n*^5Vg$\pUrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78rU9adl0eTPo^D_Yq="=`_s[SdeA(tN"-63Y4b*~> s1SHIrU9adl0eTPo^D_Yq="=`_s[SdeA(tN"-762<.F~> s3CYZrU9adl0eTPo^D_Yq="=`_s[SdeA(tN"-85_C4H~> s/c78rpKsin*^5VlgFfRna?GXqX4Icmf:8oe%bkM"-63Y4b*~> s1SHIrpKsin*^5VlgFfRna?GXqX4Icmf:8oe%bkM"-762<.F~> s3CYZrpKsin*^5VlgFfRna?GXqX4Icmf:8oe%bkM"-85_C4H~> s/c78rpKger9sUbrpTgds6opes6g0mn*^8F!:TCU!<2Ee!;Gs]!!r#n!:KpVmf3@en,<:en,<:e n,<=dn,ECen,ECen,< s1SHIrpKger9sUbrpTgds6opes6g0mn*^8F!:TCU!<2Ee!;Gs]!!r#n!:KpVmf3@en,<:en,<:e n,<=dn,ECen,ECen,< s3CYZrpKger9sUbrpTgds6opes6g0mn*^8F!:TCU!<2Ee!;Gs]!!r#n!:KpVmf3@en,<:en,<:e n,<=dn,ECen,ECen,<%k~> s/c78rU0^drU1a,n*^8F!!)Hfn*^8F!!)Hfn*^8F!:Kmfmf;hF!;Z't!:T@Vmf3@V!:KpV!:T@V mf3@V!<)Bd!"nZ"n*^8F!!)Hfn*^8F!!)HfZgS!W:96U/~> s1SHIrU0^drU1a,n*^8F!!)Hfn*^8F!!)Hfn*^8F!:Kmfmf;hF!;Z't!:T@Vmf3@V!:KpV!:T@V mf3@V!<)Bd!"nZ"n*^8F!!)Hfn*^8F!!)HfZgS!WCV<\t~> s3CYZrU0^drU1a,n*^8F!!)Hfn*^8F!!)Hfn*^8F!:Kmfmf;hF!;Z't!:T@Vmf3@V!:KpV!:T@V mf3@V!<)Bd!"nZ"n*^8F!!)Hfn*^8F!!)HfZgS!WLX'Xb~> s/c78qsXOb"n)H[mf;hT!;c-h!:T@Vmf;hFrW)Z\!W_]Xr;Zuh!:KpVr;Zle!;Z*_!;u9e!:Kpd n,36mmfSVGX?D(~> s1SHIqsXOb"n)H[mf;hT!;c-h!:T@Vmf;hFrW)Z\!W_]Xr;Zuh!:KpVr;Zle!;Z*_!;u9e!:Kpd n,36mmfSVd]i9L~> s3CYZqsXOb"n)H[mf;hT!;c-h!:T@Vmf;hFrW)Z\!W_]Xr;Zuh!:KpVr;Zle!;Z*_!;u9e!:Kpd n,36mmfSW+c>%k~> s/c78qX4Xhmf;hF!:Kp^mg&p^mf;eVmf3@SmfWXZ!:Kpdmf3@an,ECamfELX!<)?d!3knoO%uc> J,~> s1SHIqX4Xhmf;hF!:Kp^mg&p^mf;eVmf3@SmfWXZ!:Kpdmf3@an,ECamfELX!<)?d!3knoO))F. J,~> s3CYZqX4Xhmf;hF!:Kp^mg&p^mf;eVmf3@SmfWXZ!:Kpdmf3@an,ECamfELX!<)?d!3knoO,)"q J,~> s/c78rpLs0n*^5Vmf;hF!:Kmfmf;hF!:Kmfmf;hF!:KpV!!)HfoC!7kmf3@V!:KpV!:T@Vmf3@V !<)Bd!!2Ngr9jsmmf;hF!:Kmfmf9]_"-63Y4b*~> s1SHIrpLs0n*^5Vmf;hF!:Kmfmf;hF!:Kmfmf;hF!:KpV!!)HfoC!7kmf3@V!:KpV!:T@Vmf3@V !<)Bd!!2Ngr9jsmmf;hF!:Kmfmf9]_"-762<.F~> s3CYZrpLs0n*^5Vmf;hF!:Kmfmf;hF!:Kmfmf;hF!:KpV!!)HfoC!7kmf3@V!:KpV!:T@Vmf3@V !<)Bd!!2Ngr9jsmmf;hF!:Kmfmf9]_"-85_C4H~> s/c78rU9adrpTgdrpTgds6operpTgd#O_Z]mf3@V!;,aZ!<;Kl!:KpVmf3@en,<=en,E@jmf3@V !<)?h!:T@V!<2Hd!9N[uO8\MLO%uc>J,~> s1SHIrU9adrpTgdrpTgds6operpTgd#O_Z]mf3@V!;,aZ!<;Kl!:KpVmf3@en,<=en,E@jmf3@V !<)?h!:T@V!<2Hd!9N[uO8\MLO))F.J,~> s3CYZrU9adrpTgdrpTgds6operpTgd#O_Z]mf3@V!;,aZ!<;Kl!:KpVmf3@en,<=en,E@jmf3@V !<)?h!:T@V!<2Hd!9N[uO8\MLO,)"qJ,~> s/c78q!S1_POAL4eaELQrU0iL:96U/~> s1SHIq!S1_POAL4eaELQrU0iLCV<\t~> s3CYZq!S1_POAL4eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78s6ku/rpKiJeaELQrU0iL:96U/~> s1SHIs6ku/rpKiJeaELQrU0iLCV<\t~> s3CYZs6ku/rpKiJeaELQrU0iLLX'Xb~> s/c78s6l#0!5JO%!0>\!!5JL$"-63Y4b*~> s1SHIs6l#0!5JO%!0>\!!5JL$"-762<.F~> s3CYZs6l#0!5JO%!0>\!!5JL$"-85_C4H~> s/c78s6ouKk3r)[!0?oi!0=qa!5JO%!0@'HrrDucrW)$J!5JL$"-63Y4b*~> s1SHIs6ouKk3r)[!0?oi!0=qa!5JO%!0@'HrrDucrW)$J!5JL$"-762<.F~> s3CYZs6ouKk3r)[!0?oi!0=qa!5JO%!0@'HrrDucrW)$J!5JL$"-85_C4H~> s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bmZ50P!5JO%!0@'HrrE)f!W_]XrW)$J!5JL$"-63Y4b*~> s1SHIs6ouKk3i;bmZ50P!5JO%!0@'HrrE)f!W_]XrW)$J!5JL$"-762<.F~> s3CYZs6ouKk3i;bmZ50P!5JO%!0@'HrrE)f!W_]XrW)$J!5JL$"-85_C4H~> s/c78s6ouKOMCe`!0>\!!5JL$"-63Y4b*~> s1SHIs6ouKOMCe`!0>\!!5JL$"-762<.F~> s3CYZs6ouKOMCe`!0>\!!5JL$"-85_C4H~> s/c78M=1S.n*^5Vg$\pUrU0iL:96U/~> s1SHIM=1S.n*^5Vg$\pUrU0iLCV<\t~> s3CYZM=1S.n*^5Vg$\pUrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78o^;b[p?qt]U[Q[HrU0iL:96U/~> s1SHIo^;b[p?qt]U[Q[HrU0iLCV<\t~> s3CYZo^;b[p?qt]U[Q[HrU0iLLX'Xb~> s/c78p$Vk\p$Vk\Ja`-t"-63Y4b*~> s1SHIp$Vk\p$Vk\Ja`-t"-762<.F~> s3CYZp$Vk\p$Vk\Ja`-t"-85_C4H~> s/c78oBuYZr9k'pmf3@V!:T@Vmf3@V!.jV7mfSVGX?D(~> s1SHIoBuYZr9k'pmf3@V!:T@Vmf3@V!.jV7mfSVd]i9L~> s3CYZoBuYZr9k'pmf3@V!:T@Vmf3@V!.jV7mfSW+c>%k~> s/c78oBuYZq s1SHIoBuYZq s3CYZoBuYZq%k~> s/c78p@%nZqX4[imf;hF!:KmfJa`@%"-63Y4b*~> s1SHIp@%nZqX4[imf;hF!:KmfJa`@%"-762<.F~> s3CYZp@%nZqX4[imf;hF!:KmfJa`@%"-85_C4H~> s/c78p?qt]rpKgeqX4Xhmf;hF!:Ko=n+Q2PO%uc>J,~> s1SHIp?qt]rpKgeqX4Xhmf;hF!:Ko=n+Q2PO))F.J,~> s3CYZp?qt]rpKgeqX4Xhmf;hF!:Ko=n+Q2PO,)"qJ,~> s/c78p[8(^p[A+^s6g6on*^8Fmf3@V!3GYJ,~> s1SHIp[8(^p[A+^s6g6on*^8Fmf3@V!3GY s3CYZp[8(^p[A+^s6g6on*^8Fmf3@V!3GY s/c78M=8oSrU0iL:96U/~> s1SHIM=8oSrU0iLCV<\t~> s3CYZM=8oSrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1S.n*^5Vg$\pUrU0iL:96U/~> s1SHIM=1S.n*^5Vg$\pUrU0iLCV<\t~> s3CYZM=1S.n*^5Vg$\pUrU0iLLX'Xb~> s/c78s6ku/rpKiJeaELQrU0iL:96U/~> s1SHIs6ku/rpKiJeaELQrU0iLCV<\t~> s3CYZs6ku/rpKiJeaELQrU0iLLX'Xb~> s/c78s6l#0!5JO%!0>\!!5JL$"-63Y4b*~> s1SHIs6l#0!5JO%!0>\!!5JL$"-762<.F~> s3CYZs6l#0!5JO%!0>\!!5JL$"-85_C4H~> s/c78s6ouKm-j_a!0?oi!0=_[!5JO%!0@*I!s%fY!<2Ee!;Z'`!:'"Q^]!U'O%uc>J,~> s1SHIs6ouKm-j_a!0?oi!0=_[!5JO%!0@*I!s%fY!<2Ee!;Z'`!:'"Q^]!U'O))F.J,~> s3CYZs6ouKm-j_a!0?oi!0=_[!5JO%!0@*I!s%fY!<2Ee!;Z'`!:'"Q^]!U'O,)"qJ,~> s/c78s6ouKm-aqhq s1SHIs6ouKm-aqhq s3CYZs6ouKm-aqhq s/c78s6ouKm-aqhq s1SHIs6ouKm-aqhq s3CYZs6ouKm-aqhq s/c78s6ouKm-aqhq s1SHIs6ouKm-aqhq s3CYZs6ouKm-aqhq s/c78s6ouKm-aqhq s1SHIs6ouKm-aqhq s3CYZs6ouKm-aqhq s/c78s6ouKm-aqhq s1SHIs6ouKm-aqhq s3CYZs6ouKm-aqhq s/c78s6ouKm-aqhmZ4sJ!5JO%!0>\!!5JL$"-63Y4b*~> s1SHIs6ouKm-aqhmZ4sJ!5JO%!0>\!!5JL$"-762<.F~> s3CYZs6ouKm-aqhmZ4sJ!5JO%!0>\!!5JL$"-85_C4H~> s/c78s6ouKOMCe`!0>\!!5JL$"-63Y4b*~> s1SHIs6ouKOMCe`!0>\!!5JL$"-762<.F~> s3CYZs6ouKOMCe`!0>\!!5JL$"-85_C4H~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eA(tN"-63Y4b*~> s1SHIM=1G*eA(tN"-762<.F~> s3CYZM=1G*eA(tN"-85_C4H~> s/c78qsX?Ar9sXcr9sF]rU9U`KC8o':96U/~> s1SHIqsX?Ar9sXcr9sF]rU9U`KC8o'CV<\t~> s3CYZqsX?Ar9sXcr9sF]rU9U`KC8o'LX'Xb~> s/c78qsONGqu6Z2r9jUcq!S1_p[8(^e*d8:YO;RS:96U/~> s1SHIqsONGqu6Z2r9jUcq!S1_p[8(^e*d8:YO;RSCV<\t~> s3CYZqsONGqZ$W2r9jUcq!S1_p[8(^e*d8:YO;RSLX'Xb~> s/c78qsONGqu6Z2r9j[en*g5UrU0^dp[8(^rpKphmf;hU!<;Ne!<2Hd!;c-e!:T@V!<2Hd!<2He !!)Ke!3knoO%uc>J,~> s1SHIqsONGqu6Z2r9j[en*g5UrU0^dp[8(^rpKphmf;hU!<;Ne!<2Hd!;c-e!:T@V!<2Hd!<2He !!)Ke!3knoO))F.J,~> s3CYZqsONGqZ$W2r9j[en*g5UrU0^dp[8(^rpKphmf;hU!<;Ne!<2Hd!;c-e!:T@V!<2Hd!<2He !!)Ke!3knoO,)"qJ,~> s/c78qsONGqu6Z2r9jgin*^8F!!*#e!!)c^!!*#errE)f$39Mp!:KpVmf;eVp[8^pmf;hF!:Kmf mf;hF!:Kmfmf9Q["-63Y4b*~> s1SHIqsONGqu6Z2r9jgin*^8F!!*#e!!)c^!!*#errE)f$39Mp!:KpVmf;eVp[8^pmf;hF!:Kmf mf;hF!:Kmfmf9Q["-762<.F~> s3CYZqsONGqZ$W2r9jgin*^8F!!*#e!!)c^!!*#errE)f$39Mp!:KpVmf;eVp[8^pmf;hF!:Kmf mf;hF!:Kmfmf9Q["-85_C4H~> s/c78qsONGqu6Z2r9j[en*g2TrpKgep[8(^rpKgerpTdc#4DQ\mf;hFrW)f`!W_ZhrU9[br9j[e mf9Q["-63Y4b*~> s1SHIqsONGqu6Z2r9j[en*g2TrpKgep[8(^rpKgerpTdc#4DQ\mf;hFrW)f`!W_ZhrU9[br9j[e mf9Q["-762<.F~> s3CYZqsONGqZ$W2r9j[en*g2TrpKgep[8(^rpKgerpTdc#4DQ\mf;hFrW)f`!W_ZhrU9[br9j[e mf9Q["-85_C4H~> s/c78qsONGqu6Z2r9jgin*^8Fmf<@U!!)c^!!*#e!!*#e#QX>^!:KpVmf<=T!!)la!W_ZhrU0^d q s1SHIqsONGqu6Z2r9jgin*^8Fmf<@U!!)c^!!*#e!!*#e#QX>^!:KpVmf<=T!!)la!W_ZhrU0^d q s3CYZqsONGqZ$W2r9jgin*^8Fmf<@U!!)c^!!*#e!!*#e#QX>^!:KpVmf<=T!!)la!W_ZhrU0^d q s/c78qsONGqu6Z2r9jgin*^8F!!*#e!!)c^!!*#e!!*#e$39Mp!:KpVmf;eVqX4jnmf3@V!:T@V mf3@V!;u9e!:KokmfSVGX?D(~> s1SHIqsONGqu6Z2r9jgin*^8F!!*#e!!)c^!!*#e!!*#e$39Mp!:KpVmf;eVqX4jnmf3@V!:T@V mf3@V!;u9e!:KokmfSVd]i9L~> s3CYZqsONGqZ$W2r9jgin*^8F!!*#e!!)c^!!*#e!!*#e$39Mp!:KpVmf;eVqX4jnmf3@V!:T@V mf3@V!;u9e!:KokmfSW+c>%k~> s/c78qsONGqS2ss"p",\!!)HfrpKgep[8(^rpKgerpTje#k%c^!:T@Vn*g5UrU9ad"n)H[mf3@e n,<=bmfNRYmf9T\"-63Y4b*~> s1SHIqsONGqS2ss"p",\!!)HfrpKgep[8(^rpKgerpTje#k%c^!:T@Vn*g5UrU9ad"n)H[mf3@e n,<=bmfNRYmf9T\"-762<.F~> s3CYZqsONGqS2ss"p",\!!)HfrpKgep[8(^rpKgerpTje#k%c^!:T@Vn*g5UrU9ad"n)H[mf3@e n,<=bmfNRYmf9T\"-85_C4H~> s/c78mdC,UJa_pn"-63Y4b*~> s1SHImdC,UJa_pn"-762<.F~> s3CYZmdC,UJa_pn"-85_C4H~> s/c78mdL/Up@&"]Ja`F'"-63Y4b*~> s1SHImdL/Up@&"]Ja`F'"-762<.F~> s3CYZmdL/Up@&"]Ja`F'"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78rU5;uooB*fkjJV7:96U/~> s1SHIrU5;uooB*fkjJV7CV<\t~> s3CYZrU5;uooB*fkjJV7LX'Xb~> s/c78rU5 s1SHIrU5 s3CYZrU5 s/c78rU0a$JWKPds1ddd"-63Y4b*~> s1SHIrU0a$JWKPds1ddd"-762<.F~> s3CYZrU0a$JWKPds1ddd"-85_C4H~> s/c78rU0d%O+Hcqn,C)cmfSVGX?D(~> s1SHIrU0d%O+Hcqn,C)cmfSVd]i9L~> s3CYZrU0d%O+Hcqn,C)cmfSW+c>%k~> s/c78rU0m(O7*&Ko'cSYrU9[brU9ads6omdr9sL_mI(#Tp?qt]p$_hZs6fpfo'ZV[mf;qIrkI[c "-63Y4b*~> s1SHIrU0m(O7*&Ko'cSYrU9[brU9ads6omdr9sL_mI(#Tp?qt]p$_hZs6fpfo'ZV[mf;qIrkI[c "-762<.F~> s3CYZrU0m(O7*&Ko'cSYrU9[brU9ads6omdr9sL_mI(#Tp?qt]p$_hZs6fpfo'ZV[mf;qIrkI[c "-85_C4H~> s/c78rU0p)O7*);n,<=^mf3@amf3@emg&p^!!)KV!:Kpemf3@Jmf3@]mf3@\mf3@emfELX!:oR[ !:KpYn,C)cmfSVGX?D(~> s1SHIrU0p)O7*);n,<=^mf3@amf3@emg&p^!!)KV!:Kpemf3@Jmf3@]mf3@\mf3@emfELX!:oR[ !:KpYn,C)cmfSVd]i9L~> s3CYZrU0p)O7*);n,<=^mf3@amf3@emg&p^!!)KV!:Kpemf3@Jmf3@]mf3@\mf3@emfELX!:oR[ !:KpYn,C)cmfSW+c>%k~> s/c78rU0j'O7*)Hmf s1SHIrU0j'O7*)Hmf s3CYZrU0j'O7*)Hmf%k~> s/c78rU0j'O7*)Hmg0!_!:T@Vmf;eVqX4CarpKphn*^8Tmf3@emf3@]mgB-amf;hF!:Kmfmf<1P !!)rc%05hs!:KpVmf;eV!:Kpdmf3@emiMPu!:Kmfmf;hF!:Kmfmf;hF!:KpV!!)Hfn*^8F!!)ud rkI[c"-63Y4b*~> s1SHIrU0j'O7*)Hmg0!_!:T@Vmf;eVqX4CarpKphn*^8Tmf3@emf3@]mgB-amf;hF!:Kmfmf<1P !!)rc%05hs!:KpVmf;eV!:Kpdmf3@emiMPu!:Kmfmf;hF!:Kmfmf;hF!:KpV!!)Hfn*^8F!!)ud rkI[c"-762<.F~> s3CYZrU0j'O7*)Hmg0!_!:T@Vmf;eVqX4CarpKphn*^8Tmf3@emf3@]mgB-amf;hF!:Kmfmf<1P !!)rc%05hs!:KpVmf;eV!:Kpdmf3@emiMPu!:Kmfmf;hF!:Kmfmf;hF!:KpV!!)Hfn*^8F!!)ud rkI[c"-85_C4H~> s/c78rU0j'O7*)HmfELX!<)?f!:Kpamf3@emf3@cmfELX!;um[!!)Kd!;u9c!<2Ee!;c-h !:KpVmf;hFrW)oc!!*#e!s%cin,37amg0!_!:T@Vmf;eVq s1SHIrU0j'O7*)HmfELX!<)?f!:Kpamf3@emf3@cmfELX!;um[!!)Kd!;u9c!<2Ee!;c-h !:KpVmf;hFrW)oc!!*#e!s%cin,37amg0!_!:T@Vmf;eVq s3CYZrU0j'O7*)HmfELX!<)?f!:Kpamf3@emf3@cmfELX!;um[!!)Kd!;u9c!<2Ee!;c-h !:KpVmf;hFrW)oc!!*#e!s%cin,37amg0!_!:T@Vmf;eVq s/c78rU0j'O7*)HmfELX!<)?f!:Kpamf3@emf3@cmfELX!:T@V!<)?d!;Z*]!;c-i!:KpVmf;eV !;l3b!<2Ei!:KpV!;Z'i!:KpVmf;eVmf<1P!!)udrkI[c"-63Y4b*~> s1SHIrU0j'O7*)HmfELX!<)?f!:Kpamf3@emf3@cmfELX!:T@V!<)?d!;Z*]!;c-i!:KpVmf;eV !;l3b!<2Ei!:KpV!;Z'i!:KpVmf;eVmf<1P!!)udrkI[c"-762<.F~> s3CYZrU0j'O7*)HmfELX!<)?f!:Kpamf3@emf3@cmfELX!:T@V!<)?d!;Z*]!;c-i!:KpVmf;eV !;l3b!<2Ei!:KpV!;Z'i!:KpVmf;eVmf<1P!!)udrkI[c"-85_C4H~> s/c78rU0j'O7*)HmfELX!<)?f!:Kpamf3@emg&p^!!)KV!:KpVmg&p^mf;eV!:Kpdmf3@_mgT9c !!)Hfn*^8F!!)HfrU0^drpL'lmf;eV!:Kpcmg0!_!:T@Vmf;eVr9j^fmf3@dn,C)cmfSVGX?D(~> s1SHIrU0j'O7*)HmfELX!<)?f!:Kpamf3@emg&p^!!)KV!:KpVmg&p^mf;eV!:Kpdmf3@_mgT9c !!)Hfn*^8F!!)HfrU0^drpL'lmf;eV!:Kpcmg0!_!:T@Vmf;eVr9j^fmf3@dn,C)cmfSVd]i9L~> s3CYZrU0j'O7*)HmfELX!<)?f!:Kpamf3@emg&p^!!)KV!:KpVmg&p^mf;eV!:Kpdmf3@_mgT9c !!)Hfn*^8F!!)HfrU0^drpL'lmf;eV!:Kpcmg0!_!:T@Vmf;eVr9j^fmf3@dn,C)cmfSW+c>%k~> s/c78rU0p)O7*);n,<=emf3@dmfNRYmf<7Rr;cfbrrE)f!!)HUrrE&erW)oc!!)c^rrE)f#lsG_ !:T@V!:Kpen,37dmfELXn,<=bmfELXn,<:hmf;eVr9sXc!Ug$en,C)cmfSVGX?D(~> s1SHIrU0p)O7*);n,<=emf3@dmfNRYmf<7Rr;cfbrrE)f!!)HUrrE&erW)oc!!)c^rrE)f#lsG_ !:T@V!:Kpen,37dmfELXn,<=bmfELXn,<:hmf;eVr9sXc!Ug$en,C)cmfSVd]i9L~> s3CYZrU0p)O7*);n,<=emf3@dmfNRYmf<7Rr;cfbrrE)f!!)HUrrE&erW)oc!!)c^rrE)f#lsG_ !:T@V!:Kpen,37dmfELXn,<=bmfELXn,<:hmf;eVr9sXc!Ug$en,C)cmfSW+c>%k~> s/c78rU0j'O7*($mfNRY!!)udrkI[c"-63Y4b*~> s1SHIrU0j'O7*($mfNRY!!)udrkI[c"-762<.F~> s3CYZrU0j'O7*($mfNRY!!)udrkI[c"-85_C4H~> s/c78rU0m(O7*&Ko'cSYQ1+\Pr9sX"kjJV7:96U/~> s1SHIrU0m(O7*&Ko'cSYQ1+\Pr9sX"kjJV7CV<\t~> s3CYZrU0m(O7*&Ko'cSYQ1+\Pr9sX"kjJV7LX'Xb~> s/c78rU0d%O+@<,!<0asmfSVGX?D(~> s1SHIrU0d%O+@<,!<0asmfSVd]i9L~> s3CYZrU0d%O+@<,!<0asmfSW+c>%k~> s/c78rU0m(Nr\Y;nc8^YqZ-ZbirK)I[K- s1SHIrU0m(Nr\Y;nc8^YqZ-ZbirK)I[K- s3CYZrU0m(Nr\Y;nc8^YqZ-ZbirK)I[K- s/c78rU1!+Nr\VK!:TCN!!)Ka!!)Ke!!)JR!<0asmfSVGX?D(~> s1SHIrU1!+Nr\VK!:TCN!!)Ka!!)Ke!!)JR!<0asmfSVd]i9L~> s3CYZrU1!+Nr\VK!:TCN!!)Ka!!)Ke!!)JR!<0asmfSW+c>%k~> s/c78rU0j'Nr\YF!<2Ej!:Kmfn*g,R!:TdbrpTgd"Rc s1SHIrU0j'Nr\YF!<2Ej!:Kmfn*g,R!:TdbrpTgd"Rc s3CYZrU0j'Nr\YF!<2Ej!:Kmfn*g,R!:TdbrpTgd"Rc s/c78rU0j'Nr\YF!!)Kd!!;Thn+Zn_n,E@fn+cqemf3@V!:T^`!:T^`!q--Xq#CKb!:Rl,rkI[c "-63Y4b*~> s1SHIrU0j'Nr\YF!!)Kd!!;Thn+Zn_n,E@fn+cqemf3@V!:T^`!:T^`!q--Xq#CKb!:Rl,rkI[c "-762<.F~> s3CYZrU0j'Nr\YF!!)Kd!!;Thn+Zn_n,E@fn+cqemf3@V!:T^`!:T^`!q--Xq#CKb!:Rl,rkI[c "-85_C4H~> s/c78rU0j'Nr\YF!!)Kd!!;Thn+H__mf;hP!<)?d!<)Ba!!)K`!!;Thn+cqbmf;gq!<0asmfSVG X?D(~> s1SHIrU0j'Nr\YF!!)Kd!!;Thn+H__mf;hP!<)?d!<)Ba!!)K`!!;Thn+cqbmf;gq!<0asmfSVd ]i9L~> s3CYZrU0j'Nr\YF!!)Kd!!;Thn+H__mf;hP!<)?d!<)Ba!!)K`!!;Thn+cqbmf;gq!<0asmfSW+ c>%k~> s/c78rU0j'Nr\YF!!)Kd!!;Thn+m"an,<:gmf;hP!!)Kd!!)K`!!)K^!!)K`!!;Thn&5;+^Zb+g O%uc>J,~> s1SHIrU0j'Nr\YF!!)Kd!!;Thn+m"an,<:gmf;hP!!)Kd!!)K`!!)K^!!)K`!!;Thn&5;+^Zb+g O))F.J,~> s3CYZrU0j'Nr\YF!!)Kd!!;Thn+m"an,<:gmf;hP!!)Kd!!)K`!!)K^!!)K`!!;Thn&5;+^Zb+g O,)"qJ,~> s/c78rU0j'Nr\YF!!)Kd!!;Thn+m%an,E@kmf;hF!:Tgc#k%`nmf;hF!:Tgc!:Taa%dsAtn*^8F !!)Hfn*^8F`;onPkjJV7:96U/~> s1SHIrU0j'Nr\YF!!)Kd!!;Thn+m%an,E@kmf;hF!:Tgc#k%`nmf;hF!:Tgc!:Taa%dsAtn*^8F !!)Hfn*^8F`;onPkjJV7CV<\t~> s3CYZrU0j'Nr\YF!!)Kd!!;Thn+m%an,E@kmf;hF!:Tgc#k%`nmf;hF!:Tgc!:Taa%dsAtn*^8F !!)Hfn*^8F`;onPkjJV7LX'Xb~> s/c78rU0j'Nr\X"!;ccq^Zb+gO%uc>J,~> s1SHIrU0j'Nr\X"!;ccq^Zb+gO))F.J,~> s3CYZrU0j'Nr\X"!;ccq^Zb+gO,)"qJ,~> s/c78rU0j'Nr\X"!;ccq^Zb+gO%uc>J,~> s1SHIrU0j'Nr\X"!;ccq^Zb+gO))F.J,~> s3CYZrU0j'Nr\X"!;ccq^Zb+gO,)"qJ,~> s/c78rU0d%O+Hcqn,C)cmfSVGX?D(~> s1SHIrU0d%O+Hcqn,C)cmfSVd]i9L~> s3CYZrU0d%O+Hcqn,C)cmfSW+c>%k~> s/c78rU0d%O+Hcqn,C)cmfSVGX?D(~> s1SHIrU0d%O+Hcqn,C)cmfSVd]i9L~> s3CYZrU0d%O+Hcqn,C)cmfSW+c>%k~> s/c78rU0p)O7*);n,<=^mf3@an,ECfmfELX!;#XZ!:fLX!:B4Z!:T@V!:KpYmfELX!9N\K^Zb+g O%uc>J,~> s1SHIrU0p)O7*);n,<=^mf3@an,ECfmfELX!;#XZ!:fLX!:B4Z!:T@V!:KpYmfELX!9N\K^Zb+g O))F.J,~> s3CYZrU0p)O7*);n,<=^mf3@an,ECfmfELX!;#XZ!:fLX!:B4Z!:T@V!:KpYmfELX!9N\K^Zb+g O,)"qJ,~> s/c78rU0j'O7*)Hmf3@`mf3@amf3@emf3@Xmf3@]n,ECemf3@Tmf3@emfELX!:oRY!9J,~> s1SHIrU0j'O7*)Hmf3@`mf3@amf3@emf3@Xmf3@]n,ECemf3@Tmf3@emfELX!:oRY!9 s3CYZrU0j'O7*)Hmf3@`mf3@amf3@emf3@Xmf3@]n,ECemf3@Tmf3@emfELX!:oRY!9 s/c78rU0j'O7*)Img9'`mf;hF!:KpV!;Z'`!<)?i!:Kmfmf<=T$39Mp!:KpV!:T@Vr9kC$n*^8F mf;eV!:KpVmf;eV!:KpVmf<=T!!*#e*WYX/mf;hF!:Kmfmf;hF!:Kmfmf;eVn*^8F!!)Hfn*g7j kjJV7:96U/~> s1SHIrU0j'O7*)Img9'`mf;hF!:KpV!;Z'`!<)?i!:Kmfmf<=T$39Mp!:KpV!:T@Vr9kC$n*^8F mf;eV!:KpVmf;eV!:KpVmf<=T!!*#e*WYX/mf;hF!:Kmfmf;hF!:Kmfmf;eVn*^8F!!)Hfn*g7j kjJV7CV<\t~> s3CYZrU0j'O7*)Img9'`mf;hF!:KpV!;Z'`!<)?i!:Kmfmf<=T$39Mp!:KpV!:T@Vr9kC$n*^8F mf;eV!:KpVmf;eV!:KpVmf<=T!!*#e*WYX/mf;hF!:Kmfmf;hF!:Kmfmf;eVn*^8F!!)Hfn*g7j kjJV7LX'Xb~> s/c78rU0j'O7*)Fmf3@dmfELX!;Q$_!<;Kk!:KpVmf<4Q#6=2mmf;hF!;u9k!:T@Vn*^8F!;Z'` !<)?d!<)Bb!<;Km!:KpVmf;eVqJ,~> s1SHIrU0j'O7*)Fmf3@dmfELX!;Q$_!<;Kk!:KpVmf<4Q#6=2mmf;hF!;u9k!:T@Vn*^8F!;Z'` !<)?d!<)Bb!<;Km!:KpVmf;eVq s3CYZrU0j'O7*)Fmf3@dmfELX!;Q$_!<;Kk!:KpVmf<4Q#6=2mmf;hF!;u9k!:T@Vn*^8F!;Z'` !<)?d!<)Bb!<;Km!:KpVmf;eVq s/c78rU0s*O7*);mf<=T!!)ud!W_Zhp?r4dmf;eVn*^8QmfWXZ!:Kp`n,37dmfELX!;Z'e!:KpV mf<=T!!*#e"9@ljmf<=T!!)i`#lsDomf;hF!:KpSn,C)cmfSVGX?D(~> s1SHIrU0s*O7*);mf<=T!!)ud!W_Zhp?r4dmf;eVn*^8QmfWXZ!:Kp`n,37dmfELX!;Z'e!:KpV mf<=T!!*#e"9@ljmf<=T!!)i`#lsDomf;hF!:KpSn,C)cmfSVd]i9L~> s3CYZrU0s*O7*);mf<=T!!)ud!W_Zhp?r4dmf;eVn*^8QmfWXZ!:Kp`n,37dmfELX!;Z'e!:KpV mf<=T!!*#e"9@ljmf<=T!!)i`#lsDomf;hF!:KpSn,C)cmfSW+c>%k~> s/c78rU0j'O7*)Fmf3@dmfELX!;c-a!<2El!:KpV!:T@VqX4Oemf;eVoBu_\mf<1P"T[ukn*^8T mf3@emfWXZ!:Kpdmf3@`mg0!_!:KpVmf;eVm-jqgkjJV7:96U/~> s1SHIrU0j'O7*)Fmf3@dmfELX!;c-a!<2El!:KpV!:T@VqX4Oemf;eVoBu_\mf<1P"T[ukn*^8T mf3@emfWXZ!:Kpdmf3@`mg0!_!:KpVmf;eVm-jqgkjJV7CV<\t~> s3CYZrU0j'O7*)Fmf3@dmfELX!;c-a!<2El!:KpV!:T@VqX4Oemf;eVoBu_\mf<1P"T[ukn*^8T mf3@emfWXZ!:Kpdmf3@`mg0!_!:KpVmf;eVm-jqgkjJV7LX'Xb~> s/c78rU0p)O7*);n,34emf<=T!s%fY!;Z*`!<;Kk!:KpVmf<:SrrE)f"9@oZ!!)rc!!)ud#6=2m mf;eV!;u9e!:TCT!<2Hc!<;Km!:T@V!:T@Vr9sXc%.=2b!:KpVmf;hF!!)HUrkI[c"-63Y4b*~> s1SHIrU0p)O7*);n,34emf<=T!s%fY!;Z*`!<;Kk!:KpVmf<:SrrE)f"9@oZ!!)rc!!)ud#6=2m mf;eV!;u9e!:TCT!<2Hc!<;Km!:T@V!:T@Vr9sXc%.=2b!:KpVmf;hF!!)HUrkI[c"-762<.F~> s3CYZrU0p)O7*);n,34emf<=T!s%fY!;Z*`!<;Kk!:KpVmf<:SrrE)f"9@oZ!!)rc!!)ud#6=2m mf;eV!;u9e!:TCT!<2Hc!<;Km!:T@V!:T@Vr9sXc%.=2b!:KpVmf;hF!!)HUrkI[c"-85_C4H~> s/c78rU0j'O7*(dmf3@!n,C)cmfSVGX?D(~> s1SHIrU0j'O7*(dmf3@!n,C)cmfSVd]i9L~> s3CYZrU0j'O7*(dmf3@!n,C)cmfSW+c>%k~> s/c78rU0m(O7*&Ko'cSYeaEJ s1SHIrU0m(O7*&Ko'cSYeaEJ s3CYZrU0m(O7*&Ko'cSYeaEJ s/c78rU0d%O+Hcqn,C)cmfSVGX?D(~> s1SHIrU0d%O+Hcqn,C)cmfSVd]i9L~> s3CYZrU0d%O+Hcqn,C)cmfSW+c>%k~> s/c78rU0d%O+Hcqn,C)cmfSVGX?D(~> s1SHIrU0d%O+Hcqn,C)cmfSVd]i9L~> s3CYZrU0d%O+Hcqn,C)cmfSW+c>%k~> s/c78rU0d%O+Hcqn,C)cmfSVGX?D(~> s1SHIrU0d%O+Hcqn,C)cmfSVd]i9L~> s3CYZrU0d%O+Hcqn,C)cmfSW+c>%k~> s/c78rU0d%O+G(>^Zb+gO%uc>J,~> s1SHIrU0d%O+G(>^Zb+gO))F.J,~> s3CYZrU0d%O+G(>^Zb+gO,)"qJ,~> s/c78rU0d%O+G(>^Zb+gO%uc>J,~> s1SHIrU0d%O+G(>^Zb+gO))F.J,~> s3CYZrU0d%O+G(>^Zb+gO,)"qJ,~> s/c78rU5 s1SHIrU5 s3CYZrU5 s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/Z48JWJ?B!`#g[J,~> s1JEIJWJ?B!c,JKJ,~> s3:VZJWJ?B!f,'9J,~> s/c0FJUZ@&rH\LG4b*~> s1SAsJXP8\rK[Jt<.F~> s3CSJJ[F1=rNQCKC4H~> s/Z9JIYNE,g4TW]IX$+=4b*~> s1JK"R@f&%g7AJ s3:\N[(([rg:%6o['6d[C4H~> s/Z6AFb,"oIKXt;END s1JGpP(B%RR08h;O1eMC~> s3:YIY( s/c65JS<_M!,DLK!N\G7~> s1SGfJV`!8!/^]4!PMH_~> s3CYAJZ%2!rMTbBC4H~> JZR5"!'Pi~> J\BFD!*"I~> J^2Wf!,@#~> JcF'rJ,~> JcF'rJ,~> JcF'rJ,~> %%EndData showpage %%Trailer end %%EOF geomview-1.9.5/doc/figs/secondlinelist.ps0000644000175000017500000024617412310110174015355 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: noname.ps %%Pages: 1 %%BoundingBox: 227 246 385 516 %%EndComments /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 329 string def %%EndProlog %%Page: 1 1 gsave 227.04 246.12 translate 157.92 269.76 scale 329 562 8 [ 329 0 0 -562 0 562 ] { picstr readstring } image 80008000b7000000e3d6019d5680d680d6f9d6015656e2d6019d007f00d6 d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656 d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d48d69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d56d6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9d9d0003 00d69dd6e59d0256d6d6809d809dfb9d035656d6d6e49d0156000200d6d6 e49d0156d6809d809df99d0156d6e49d02569d007f00d69dd69d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d567f 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d56419d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d56fb9d0156007f00d6d69d9d9d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d7f 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d48569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d9d9dd69d569d000600d69dd69d569d 80008000c50006d6d69d9d9d56000700d6d69d9d9d560080d680d6c7d607 00d69dd69d569d007f00d69dd69d569d00d6d69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd6d6d69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6489dd69d d69dd69dd69dd69dd69dd69d9dd6d69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69d00d6d69d9d9d56000800d6d69d9d9d5600d6ea9d0156d6809d929d01 56d6e99d0256d6d6eb9d085600d69dd69d569d000900d69dd69d569d00d6 d6eb9d0256d6d6809d939d0256d6d6eb9d025656d6fc9df200fd9d095656 00d6d69d9d9d56000800d6d69d9d9d5600d6eb9d025656d6f19df900069d 00009d9d0000809db09d025656d6e99d0656d6d69d9d9d00f49d0000fc9d 085600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6f29d01 0000fa9d0500009d9d0000809daf9d0256d6d6eb9d025656d6fc9d0000f4 9d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d0256 56d6f19d010000f79d010000809daf9d025656d6e99d0656d6d69d9d9d00 f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d569d00d6d6eb9d 0256d6d6f39d010000fa9d0800009d9d00009d9d9dfc00fc9dfc00809dbd 9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d 56000800d6d69d9d9d5600d6eb9d025656d6f29d010000fa9d1500009d9d 00009d9d00009d9d00009d9d00009d9d0000809dbf9d025656d6e99d0656 d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000b00d69dd69d56 9d00d6d69d9df000fd9d0256d6d6f39dfa00139d9d00009d00009d9d0000 9d9d9d00009d9d0000809dba9d0256d6d6f99dfc00f69d025656d6fc9d00 00f49d0d00009d9d565600d6d69d9d9d56000c00d6d69d9d9d5600d69d9d 9d00f29d05009d9d5656d6f39d010000fa9d0700009d9d00009d9dfa00fc 9dfd00809dbd9d025656d6f89d04009d9d0000f69d0656d6d69d9d9d00f4 9d0d00009d9d9d5600d69dd69d569d000c00d69dd69d569d00d6d69d9d00 f29d0600009d9d56d6d6f49d010000fa9d0800009d9d00009d0000f59d01 0000809dbd9d0256d6d6f99d04009d9d0000f79d025656d6fc9d0000f49d 0d00009d9d565600d6d69d9d9d56000b00d6d69d9d9d5600d69d9d9def00 039d5656d6f39d010000fa9d0800009d9d00009d0000fa9d0600009d9d9d 0000809dbe9d025656d6f89dfb00f69d0656d6d69d9d9d00f49d0d00009d 9d9d5600d69dd69d569d000900d69dd69d569d00d6d6fc9df100049d9d56 d6d6f59d010000fa9d1500009d9d00009d9d00009d9d00009d9d00009d9d 0000809dbc9d0256d6d6f89dfc00f79d025656d6fc9d0000f49d0d00009d 9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d025656d6f49d01 0000fa9d0800009d9d00009d9d9dfc00fc9dfc00809dbc9d025656d6e99d 0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69dd6 9d569d00d6d6eb9d0256d6d6809d939d0256d6d6eb9d025656d6fc9d0000 f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d02 5656d6809d939d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d56 00d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6809d939d02 56d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d5600 0800d6d69d9d9d5600d6eb9d025656d6809d939d025656d6e99d0556d6d6 9d9d9df100fd9d085600d69dd69d569d000900d69dd69d569d00d6d6eb9d 0256d6d6809d939d0256d6d6eb9d025656d6fa9df3000b9d9d565600d6d6 9d9d9d56000800d6d69d9d9d5600d6eb9d025656d6809d939d025656d6e9 9d0256d6d6eb9d085600d69dd69d569d007f00d69dd69d569d00d69d9d56 9d569d569d569d569d569d569d569d569d569d56d6569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d567f9d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d56489d569d569d569d569d569d569d569d56d6569d569d569d56 9d569d569d569d569d569d569d569d5656d69d569d569d569d569d569d56 9d569d569d569d569d565600d6d69d9d9d560008009d569d9d9d56009de9 56009d80569156009de856009de9560700d69dd69d569d000000fb56009d 80008000c50001d6d6fc56ff000000fcd6029d565680df80dfc7df0200d6 9dfcd6ff000800d6d6d69d569d56df80af80afc9af086400d6d69dd6d6d6 000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d6 9dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d 5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80 af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9 af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400 d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d 569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d560008 00d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd6 9d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656 df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80 afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af08 6400d69dd69d569d000800d69dd69d569d56dff3aff90004af00afaf0080 af80afe2af086400d6d69d9d9d56000800d6d69d9d9d5656dff3af0000f9 af0600afaf00afaf0080af80afe5af086400d69dd69d569d000800d69dd6 9d569d56dff3af0000f6af0300afaf0080af80afe5af086400d6d69d9d9d 56000800d6d69d9d9d5656dff3af0000f9af0a00afaf00af000000afafaf fc00fdaf0300af000080af80aff4af086400d69dd69d569d000800d69dd6 9d569d56dff3af0000f9af1300afaf00afaf00afafaf0000afaf0000afaf 000080af80aff2af086400d6d69d9d9d56000800d6d69d9d9d5656dff3af fa000cafaf00afaf00afaf00afafaf00fcaf0300afaf0080af80aff1af08 6400d69dd69d569d000800d69dd69d569d56dff3af0000f9af0900afaf00 afaf00afafaffa0002afaf0080af80aff1af086400d6d69d9d9d56000800 d6d69d9d9d5656dff3af0000f9af0a00afaf00afaf00afafaf00f9af0000 80af80aff1af086400d69dd69d569d000800d69dd69d569d56dff3af0000 f9af0a00afaf00afaf00afafaf00f9af000080af80aff1af086400d6d69d 9d9d56000800d6d69d9d9d5656dff3af0000f9af1200afaf00afaf00afaf af0000afaf0000afaf0080af80aff1af086400d69dd69d569d000800d69d d69d569d56dff3af0000f9af0a00afaf00afafaf0000afaffc00fdaf0000 80af80aff1af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80af c9af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af0864 00d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd6 9d569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d5600 0800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69d d69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d56 56df80af80afc9af086400d69dd69d569d000800d69dd69d569d56dff4af 80648064e164f4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af 80648064e26400dff4af086400d69dd69d569d000800d69dd69d569d56df f4af01646480af80afe5af01dfdff4af086400d6d69d9d9d56000800d6d6 9d9d9d5656dff4af01646480af80afe5af01dfdff4af086400d69dd69d56 9d000800d69dd69d569d56dff4af01646480af80afe5af01dfdff4af0864 00d6d69d9d9d56000800d6d69d9d9d5656dff4af01646480af80afe5af01 dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4af01646480 af80afe5af01dfdff4af086400d6d69d9d9d56000800d6d69d9d9d5656df f4af01646480af80afe5af01dfdff4af086400d69dd69d569d000800d69d d69d569d56dff4af01646480af80afe5af01dfdff4af086400d6d69d9d9d 56000800d6d69d9d9d5656dff4af01646480af80afe5af01dfdff4af0864 00d69dd69d569d000800d69dd69d569d56dff4af016464f8af0000f6af00 00e6af0000d8af0000faaf0000e8af0000daaf0400afafaf0088af01dfdf f4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af016464f8af00 00f6af0000e6af0000d8af0000faaf0000f6af0000f3af0000daaf0600af 00af00af008aaf01dfdff4af086400d69dd69d569d000800d69dd69d569d 56dff4af016464f9af0000f6af0000e6af0000d8af0000f9af0000f6af00 00f4af0000daaf0600afafaf00000089af01dfdff4af086400d6d69d9d9d 56000800d6d69d9d9d5656dff4af016464f9af0300afaf00fcaf0e00afaf 00afafaf000000af00afafaffc00fdaffd000caf00afafaf00afaf00af00 0000fcaffd0009af00afaf00af0000afaffc00fdaf0400af000000fcaf0b 00afafaf000000af00afafaffc0007afaf000000afafaffc00fcaf0b00af afaf000000af00afafaffc00fcaffc00fdaf0700af0000afaf0000fcaf07 00afaf00af00af008aaf01dfdff4af086400d69dd69d569d000800d69dd6 9d569d56dff4af016464f9af0300afaf00fcaf7f00afaf00afaf0000afaf 0000afaf0000afaf0000af0000afaf0000afafaf00afaf0000afaf0000af af0000afaf0000afaf0000afafaf0000afaf0000afaf0000afaf0000afaf af00afaf0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000 afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000afaf00000eaf af0000afaf0000afaf00afafaf00fcaf000088af01dfdff4af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff4af016464faaf0400afafaf00fcaf 0600af00afafaf00fcaf0300afaf00faaf0000fcaf0700afaf00afafaf00 fcaf0300afaf00fcaf0300afaf00f7af0300afaf00fcaf0700afaf00afaf af00fcaf0000f9af0300afaf00f8af0700afaf00afafaf00fcaf0300afaf 00fcaf0300afaf00fcaf0e00afaf00afafaf00afafaf00afaf0082af01df dff4af086400d69dd69d569d000800d69dd69d569d56dff4af016464faaf 0400afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000fcaf07 00afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fbaffb0002afaf00 fcaf0700afaf00afafaf00fcaf0300afafaffb0002afaf00fcaffb0006af af00afafaf00fcaf0200afaffa0002afaf00fcaf0e00afaf00afafaf00af afaf00afaf0082af01dfdff4af086400d6d69d9d9d56000800d6d69d9d9d 5656dff4af016464faaf0400afafaf00fcaf0600af00afafaf00fcaf0300 afaf00faaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300af af00fcaf080000afafaf00afaf00fcaf0700afaf00afafaf00fcaf1b00af af0000afafaf00afaf00afafaf0000afafaf00afaf00afafaf00fcaf0300 afaf00f9af0000fcaf0e00afaf00afafaf00afafaf00afaf0082af01dfdf f4af086400d69dd69d569d000800d69dd69d569d56dff4af016464fbaf00 00fcaf0000fcaf010000fcaf0000fcaf0300afaf00fcaf0200af00fcaf02 00af00fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0000fcaf0300af af00fcaf0200af00fcaf0000fcaf0300afaf00fcaf0700afaf00afafaf00 fcaf0200af00fcaf0000fcaf0300afaf00f9af0000fcaf0d00afaf00afaf af00afafaf00af0081af01dfdff4af086400d6d69d9d9d56000800d6d69d 9d9d5656dff4af016464fbaf0000fcaf060000afaf000000fcaf160000af af0000afaf0000afaf0000af0000afaf0000af00fcaf0000fcaf0b00afaf 0000afaf0000afaf00fcaf0f0000afaf0000afaf0000afaf0000af00fcaf 1b0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000af00fc af220000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00afafaf 00afafaf00af0081af01dfdff4af086400d69dd69d569d000800d69dd69d 569d56dff4af016464fbaf0000fbaffd0002af0000fbaffd0004af00afaf affc00fdaffd0003af00af00fcaf0000fcaf0b00afafaf000000af00afaf 00fbaffd000baf0000af00af000000afaf00fbaffd0017af00afafaf0000 00af0000afaf0000afaf000000af000000fbaffd0004af00afafaffc00fc affc00fdaf0a00afafaf00afafaf00af0081af01dfdff4af086400d6d69d 9d9d56000800d6d69d9d9d5656dff4af016464e6af0000f2af0000edaf00 00f1af0000d0af000080afe4af01dfdff4af086400d69dd69d569d000800 d69dd69d569d56dff4af016464ebaf050000afaf0000f7af050000afaf00 00f2af050000afaf0000f1af0000d5af050000afaf000080afe4af01dfdf f4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af016464eaaffc 00f5affc00f0affc00f0af0000d4affc0080afe3af01dfdff4af086400d6 9dd69d569d000800d69dd69d569d56dff4af01646480af80afe5af01dfdf f4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af01646480af80 afe5af01dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4af 01646480af80afe5af01dfdff4af086400d6d69d9d9d56000800d6d69d9d 9d5656dff4af01646480af80afe5af01dfdff4af086400d69dd69d569d00 0800d69dd69d569d56dff4af01646480af80afe5af01dfdff4af086400d6 d69d9d9d56000800d6d69d9d9d5656dff4af01646480df80dfe3dff4af08 6400d69dd69d569d000800d69dd69d569d56dff4af006480df80dfe2dff4 af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400 d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d 9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d0008 00d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d 9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d56 df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80 afc9af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af08 6400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69d d69d569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56 000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d6 9dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d 5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80 af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9 af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400 d6d69d9d9d56000800d6d69d9d9d5656dff3affb00fbaf0000d9af0000b8 aff90004af00afaf0080afddaf086400d69dd69d569d000800d69dd69d56 9d56dff3af0000fcaf050000afafaf00eaaf0000f0af0000b8af0000f9af 0300afaf0080afddaf086400d6d69d9d9d56000800d6d69d9d9d5656dff3 af0000fbaf0000e6af0000a7af0000f6af000080afddaf086400d69dd69d 569d000800d69dd69d569d56dff3af0000faaf0b00afaf00afaf00af0000 afaffc00fcaffc0006af000000afafaffc00fdaf0800af0000af00afafaf fc00fcaffd00c6af0000f9af0600afaf00afafaffc00fcaffd0080afebaf 086400d6d69d9d9d56000800d6d69d9d9d5656dff3af0000faaf3a00afaf 00afaf0000afafaf0000afaf0000afaf0000afaf0000af00afafaf0000af af0000afaf0000afafaf00afaf0000afaf0000afaf00afafaf00c7af0000 f9af1200afaf00afaf0000afaf0000afaf00afafaf0080afecaf086400d6 9dd69d569d000800d69dd69d569d56dff3af0000faaf0600afaf00afaf00 fcaf0000fcaf0300afaf00faaf0400afafaf00fcaf0300afaf00fcaf0300 afaf00fcaf0400afaf0000c4affa0008afaf00afaf00afaf00fcaf0400af af000080afe9af086400d6d69d9d9d56000800d6d69d9d9d5656dff3af00 00faaf0600afaf00afaf00fcaffa0002afaf00faaf0400afafaf00fcaf03 00afaf00fcaf0200afaffa00fdaffd00c6af0000f9af0500afaf00afaffa 00fdaffd0080afebaf086400d69dd69d569d000800d69dd69d569d56dff3 af0000faaf0600afaf00afaf00fcaf0000f9af0000faaf0400afafaf00fc af0300afaf00fcaf0300afaf00f6af010000c7af0000f9af0600afaf00af af00f6af01000080afecaf086400d6d69d9d9d56000800d6d69d9d9d5656 dff3af0000fbaf0700afafaf00afaf00fcaf0000f9af0000fcaf0600af00 afafaf00fcaf0300afaf00fcaf0300afaf00f5af0000c7af0000f9af0600 afaf00afaf00f5af000080afecaf086400d69dd69d569d000800d69dd69d 569d56dff3af0000fcaf080000afafaf00afaf00fcaf1b0000afaf0000af af0000afaf0000af00afafaf0000afaf0000afaf00fcaf0f00afaf0000af af0000afaf00afafaf00c7af0000f9af1200afaf00afaf0000afaf0000af af00afafaf0080afecaf086400d6d69d9d9d56000800d6d69d9d9d5656df f3affb00fbaf0300afaf00fbaffc00fcaffc00fdaf030000afaffc00fdaf 0000fcaf0300afafaffc00fcaffd00c6af0000f9af0600afaf00afafaffc 00fcaffd0080afebaf086400d69dd69d569d000800d69dd69d569d56df80 af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9 af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400 d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d 569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6afa264fcaff164f6af8064eb64fcaff164f6af08 6400d69dd69d569d000800d69dd69d569d56dff6afa36400dffcaff26400 dff6af8064ec6400dffcaff26400dff6af086400d6d69d9d9d56000800d6 d69d9d9d5656dff6af016464a6af01dfdffcaf016464fb9500dffb9501df dff6af01646480afefaf01dfdffcaf016464fb9500dffb9501dfdff6af08 6400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffc af016464fc9502dfdf64fc9501dfdff6af01646480afefaf01dfdffcaf01 6464fc9502dfdf64fc9501dfdff6af086400d6d69d9d9d56000800d6d69d 9d9d5656dff6af016464a6af01dfdffcaf016464fc9502dfdf64fc9501df dff6af01646480afefaf01dfdffcaf016464fc9502dfdf64fc9501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af046464afafafac 00fdaf01dfdffcaf0e6464959595dfdfaf6464959595dfdff6af01646480 afefaf01dfdffcaf0e6464959595dfdfaf6464959595dfdff6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6af046464afafafac00fdaf01df dffcaf0e6464959595dfdfaf6464959595dfdff6af01646480afefaf01df dffcaf0e6464959595dfdfaf6464959595dfdff6af086400d69dd69d569d 000800d69dd69d569d56dff6af046464afafafac00fdaf01dfdffcaf0e64 649595dfdfafafaf64649595dfdff6af016464fcaf0000faaf0300afaf00 e3affd00f5af0000aaaf01dfdffcaf0e64649595dfdfafafaf64649595df dff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af046464afaf afac00fdaf01dfdffcaf0e64649595dfdfafafaf64649595dfdff6af0164 64fcaf0000faaf0300afaf00e5af060000afafaf0000f7af0000aaaf01df dffcaf0e64649595dfdfafafaf64649595dfdff6af086400d69dd69d569d 000800d69dd69d569d56dff6af046464afafafac00fdaf01dfdffcaf0464 6495dfdffbaf04646495dfdff6af016464fcaf0000faaf0000e2af0000fb af0000f7af0000aaaf01dfdffcaf04646495dfdffbaf04646495dfdff6af 086400d6d69d9d9d56000800d6d69d9d9d5656dff6af046464afafafac00 fdaf01dfdffcaf04646495dfdffbaf04646495dfdff6af016464fcaf0000 faaf0a00afaf00afaf00af000000fcaffd0004af00afafaffc00fdaf0000 f7af0000fcaf0900af00af000000afafaffc00b5af01dfdffcaf04646495 dfdffbaf04646495dfdff6af086400d69dd69d569d000800d69dd69d569d 56dff6af046464afafafac00fdaf01dfdffcaf036464dfdff76401dfdff6 af016464fcaf0000faaf1e00afaf00afaf0000afaf0000afaf0000afaf00 00afaf0000afaf0000afaf00f7af0000fcaf0e00af0000afaf0000af0000 afaf0000b6af01dfdffcaf036464dfdff76401dfdff6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6af046464afafafac00fdaf01dfdffcaf 026464dff66401dfdff6af016464fcaff80005afaf00afaf00fcaf0300af af00fcaf0300afaf00fcaf0300afaf00f7af0000fcaf0200af00fcaf0200 af00fcaf0000b6af01dfdffcaf026464dff66401dfdff6af086400d69dd6 9d569d000800d69dd69d569d56dff6af046464afafafac00fdaf01dfdffc af016464f59501dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf 0300afaf00fcaf0200afaffa0002afaf00f7af0000fcaf0200af00fcaf01 00affa00b6af01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56 000800d6d69d9d9d5656dff6af046464afafafac00fdaf01dfdffcaf0164 64f3dff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fc af0300afaf00f9af0000f7af0000fcaf0200af00fcaf0200af00b1af01df dffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d56 9d56dff6af046464afafafac00fdaf01dfdffcaf016464f6df0264dfdff6 af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf0300af af00f8af0000fbaf0300afaf00fcaf0200af00fcaf0200af00b1af01dfdf fcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d56 56dff6af066464afafaf00afae00fdaf01dfdffcaf036464dfdff9af0364 64dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf3000afaf0000 afaf0000afaf0000afaf0000afafaf0000afafaf0000afaf0000afaf0000 af0000afaf0000af0000afaf0000b6af01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af066464afafaf00 afae00fdaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf00 00faaf0600afaf00afaf00fcaf0b00afafaf000000af00afafaffc00faaf fd00fbaffd000aaf00af00af000000afafaffc00b5af01dfdffcaf016464 f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af04 6464afafafac00fdaf01dfdffcaf036464dfdff9af036464dfdff6af0164 64e2af00008eaf01dfdffcaf016464f3dff6af086400d69dd69d569d0008 00d69dd69d569d56dff6af046464afafafac00fdaf01dfdffcaf036464df dff9af036464dfdff6af016464e7af050000afaf00008eaf01dfdffcaf01 6464f6df0264dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656df f6af046464afafafac00fdaf01dfdffcaf036464dfdff9af036464dfdff6 af016464e6affc008daf01dfdffcaf036464dfdff9af036464dfdff6af08 6400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffc af036464dfdff9af036464dfdff6af01646480afefaf01dfdffcaf036464 dfdff9af036464dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af016464 80afefaf01dfdffcaf036464dfdff9af036464dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf036464dfdf f9af036464dfdff6af01646480afefaf01dfdffcaf036464dfdff9af0364 64dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464 a6af01dfdffcaf036464dfdff9af036464dfdff6af01646480afefaf01df dffcaf036464dfdff9af036464dfdff6af086400d69dd69d569d000800d6 9dd69d569d56dff6af016464a6af01dfdffcaf036464dfdff9af036464df dff6af01646480afefaf01dfdffcaf036464dfdff9af036464dfdff6af08 6400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01dfdffc af036464dfdff9af036464dfdff6af016464fcaf0000faaf0300afaf00e6 affb00fbaf0000d6af0000ceaf01dfdffcaf036464dfdff76401dfdff6af 086400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdf fcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0300afaf00 e6af0000fcaf050000afafaf00d6af0000ceaf01dfdffcaf026464dff664 01dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464 a6af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf 0000e3af0000fbaf0000d2af0000ceaf01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01df dffcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0a00afaf 00afaf00af000000fcaffd0004af00afafaffc00fdaf0000faaf0600afaf 00afafaffc00fdaf0700af0000afaf0000fcaffc00fdaf0400af000000fc affd0001af00ceaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464dfdf f9af036464dfdff6af016464fcaf0000faaf1e00afaf00afaf0000afaf00 00afaf0000afaf0000afaf0000afaf0000afaf00faaf2e00afaf00afaf00 00afaf0000afaf0000afaf0000afaf00afaf0000afaf0000afaf0000afaf 0000afaf0000afaf0000ceaf01dfdffcaf016464f59501dfdff6af086400 d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf03 6464dfdff9af036464dfdff6af016464fcaff80005afaf00afaf00fcaf03 00afaf00fcaf0300afaf00fcaf0300afaf00faaf0300afaf00f9af0e00af af00afafaf00afafaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf00 00ceaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf 0200afaffa0002afaf00faaf0600afaf00afafaffb000dafaf00afafaf00 afafaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000ceaf01dfdf fcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d 56dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af0164 64fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf0300afaf00f9 af0000faaf1900afaf00afaf0000afafaf00afaf00afafaf00afafaf00af af00fcaf0300afaf00fcaf0300afaf00fcaf0000ceaf01dfdffcaf016464 f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af01 6464a6af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000 faaf0600afaf00afaf00fcaf0300afaf00fcaf0300afaf00f9af0000fbaf 0700afafaf00afaf00fcaf0e00afaf00afafaf00afafaf00afaf00fcaf03 00afaf00fcaf0300afaf00fcaf0000ceaf01dfdffcaf016464f59501dfdf f6af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf03 00afaf00aeaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf 0000faaf0600afaf00afaf00fcaf1300afaf0000afaf0000afaf0000afaf 0000afaf00fcaf230000afafaf00afaf0000afaf0000afaf00afafaf00af afaf00afaf0000afaf0000afaf00fcaf0800afaf0000afaf0000ceaf01df dffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6af016464fcaf0300afaf00aeaf01dfdffcaf036464dfdff9af03 6464dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0b00afafaf 000000af00afafaffc00fdaffb00fbaf1600afafaf000000af0000af00af afaf00afafaf00afafaffc00fdaf0000fcaf0800afafaf000000af00ceaf 01dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd6 9d569d56dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6 af016464e2af00008eaf01dfdffcaf016464f59501dfdff6af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464 dfdff9af036464dfdff6af016464e7af050000afaf00008eaf01dfdffcaf 016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56df f6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af016464e6 affc008daf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d5600 0800d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464dfdff9af03 6464dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af0864 00d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf 036464dfdff9af036464dfdff6af01646480afefaf01dfdffcaf016464f5 9501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af0164 64a6af01dfdffcaf036464dfdff9af036464dfdff6af01646480afefaf01 dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d 569d56dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af 01646480afefaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d 56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464dfdff9 af036464dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af 086400d69dd69d569d000800d69dd69d569d56dff6af016464f7af0000f9 af0000b8af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf00 00faaf0300afaf00e6affb00eeaf0000b0af01dfdffcaf016464f59501df dff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464f8af 010000f9af0000b8af01dfdffcaf036464dfdff9af036464dfdff6af0164 64fcaf0000faaf0300afaf00e6af0000fcaf010000f0af0000b0af01dfdf fcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d 56dff6af016464f9af0200af00f9af0000b8af01dfdffcaf036464dfdff9 af036464dfdff6af016464fcaf0000faaf0000e3af0000fbaf0000f0af00 00b0af01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6af016464faaf0b00afaf00afafaf000000af00b8af 01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0a00 afaf00afaf00af000000fcaffd0004af00afafaffc00fdaf0000faaf0300 afafaffc00fcaffd0004af00afafaffc00fcaffc00bfaf01dfdffcaf0164 64f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af 016464fbaf0c00afafaf00afaf0000afaf0000b8af01dfdffcaf036464df dff9af036464dfdff6af016464fcaf0000faaf1e00afaf00afaf0000afaf 0000afaf0000afaf0000afaf0000afaf0000afaf00faaf2000afaf0000af af0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000c0af01 dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d 9d5656dff6af016464fcaf0000fcaf0300afaf00fcaf0000b8af01dfdffc af036464dfdff9af036464dfdff6af016464fcaff80005afaf00afaf00fc af0300afaf00fcaf0300afaf00fcaf0300afaf00faaf0300afaf00fcaf03 00afaf00fcaf0300afaf00fcaf0300afaf00bbaf01dfdffcaf016464f595 01dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464 fcaf0000fcaf0300afaf00fcaf0000b8af01dfdffcaf036464dfdff9af03 6464dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00 fcaf0200afaffa0002afaf00faaf0300afaf00fcaf0300afaf00fcaf0200 afaffa0002afaf00bbaf01dfdffcaf016464f59501dfdff6af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff6af016464fcaff90001af00fcaf00 00b8af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000fa af0600afaf00afaf00fcaf0300afaf00fcaf0300afaf00f9af0000faaf03 00afaf00fcaf0300afaf00fcaf0300afaf00f9af0000bbaf01dfdffcaf01 6464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6 af016464f7af0300afaf00fcaf0000b8af01dfdffcaf036464dfdff9af03 6464dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00 fcaf0300afaf00f9af0000fbaf0400afafaf00fcaf0300afaf00fcaf0300 afaf00f9af0000fcaf0000c0af01dfdffcaf016464f59501dfdff6af0864 00d6d69d9d9d56000800d6d69d9d9d5656dff6af016464f7af0800afaf00 00afaf0000b8af01dfdffcaf036464dfdff9af036464dfdff6af016464fc af0000faaf0600afaf00afaf00fcaf1300afaf0000afaf0000afaf0000af af0000afaf00fcaf220000afafaf0000afaf0000afaf0000afaf0000afaf 0000afaf0000afaf0000afaf0000c0af01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af016464f7af0800 afafaf000000af00b8af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fcaf0000faaf0600afaf00afaf00fcaf0b00afafaf000000af00afaf affc00fdaffb00faaffc00fcaffd0004af00afafaffc00fcaffc00bfaf01 dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d 9d5656dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af 016464e2af00008eaf01dfdffcaf016464f59501dfdff6af086400d69dd6 9d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf036464df dff9af036464dfdff6af016464e7af050000afaf00008eaf01dfdffcaf01 6464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af016464e6af fc008daf01dfdffcaf016464f59501dfdff6af086400d69dd69d569d0008 00d69dd69d569d56dff6af016464a6af01dfdffcaf036464dfdff9af0364 64dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af086400 d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf03 6464dfdff9af036464dfdff6af01646480afefaf01dfdffcaf016464f595 01dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464 a6af01dfdffcaf036464dfdff9af036464dfdff6af01646480afefaf01df dffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af01 646480afefaf01dfdffcaf016464f59501dfdff6af086400d69dd69d569d 000800d69dd69d569d56dff6af016464a6af01dfdffcaf036464dfdff9af 036464dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af08 6400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464f9affd00c8af 0000f2af0000f8af01dfdffcaf036464dfdff9af036464dfdff6af016464 fcaf0000faaf0300afaf00e5af0000d4af0000c7af01dfdffcaf016464f5 9501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af0164 64fbaf060000afafaf0000e3af0000e8af0000f2af0000f8af01dfdffcaf 036464dfdff9af036464dfdff6af016464fcaf0000faaf0300afaf00e5af 0000d4af0000c7af01dfdffcaf016464f59501dfdff6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6af016464fbaf0000fbaf0000e3af0000 e8af0000f2af0000f8af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fcaf0000faaf0000e2af0000d4af0000c7af01dfdffcaf016464f595 01dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464 fcaf0000f7af0000fcaf0600af00af000000fbaf0200afaffc0007afaf00 0000afaf00fcaf0700af00af0000afaffc00fcaf0000f9affc00fdaf0400 af000000fcaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf 0000faaf0a00afaf00afaf00af000000fcaffd0004af00afafaffc00fcaf 0000f9affc00fdaf0400af000000fcaffd0004af00afafaffc0002afaf00 fcaf0900af00af000000afafaffc00d2af01dfdffcaf016464f59501dfdf f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf00 00f7af0000fcaf0600af0000afaf00fbaf0e00af0000afaf0000afaf00af afaf00fcaf1000af0000afafaf0000afaf0000afafaf00faaf120000afaf 0000afaf0000afaf0000afafafdfdffcaf036464dfdff9af036464dfdff6 af016464fcaf0000faaf1f00afaf00afaf0000afaf0000afaf0000afaf00 00afaf0000afaf0000afafaf00faaf1f0000afaf0000afaf0000afaf0000 afaf0000afaf0000afaf0000afaf0000af00fcaf0e00af0000afaf0000af 0000afaf0000d3af01dfdffcaf016464f59501dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464fcaf0000f7af0000fcaf0200 af00fcaf0400afafaf00f9af0700afaf00afafaf00fcaf0200af00fcaf00 00fcaf0400afafaf00f5af0300afaf00fcaf0500afafafdfdffcaf036464 dfdff9af036464dfdff6af016464fcaff80005afaf00afaf00fcaf0300af af00fcaf0300afaf00fcaf0400afafaf00faaf0000fcaf0300afaf00fcaf 0300afaf00fcaf0300afaf00faaf0000fcaf0200af00fcaf0200af00fcaf 0000d3af01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6af016464fcaf0000f7af0000fcaf0200af00fcaf 0700afafaf00afafaffb0006afaf00afafaf00fcaf0200af00fcaffa00fd af0000f9affb0002afaf00fcaf0500afafafdfdffcaf036464dfdff9af03 6464dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00 fcaf0200afaffa00fdaf0000faaf0000fcaf0300afaf00fcaf0300afaf00 fcaf0300afaf00faaf0000fcaf0200af00fcaf0100affa00d3af01dfdffc af016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56 dff6af016464fcaf0000f7af0000fcaf0200af00fcaf1300afafaf00afaf 0000afafaf00afaf00afafaf00fcaf0200af00fcaf0000f8af0000faaf08 0000afafaf00afaf00fcaf0500afafafdfdffcaf036464dfdff9af036464 dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf 0300afaf00f8af0000faaf0000fcaf0300afaf00fcaf0300afaf00fcaf03 00afaf00faaf0000fcaf0200af00fcaf0200af00ceaf01dfdffcaf016464 f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af01 6464fbaf0000fbaf0300afaf00fcaf0200af00fbaf0600af00afafaf00fc af0700afaf00afafaf00fcaf0200af00fcaf0000f8af0000faaf0000fcaf 0300afaf00fcaf0500afafafdfdffcaf036464dfdff9af036464dfdff6af 016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf0300afaf 00f8af0000faaf0000fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00 fcaf0200af00fcaf0200af00fcaf0200af00ceaf01dfdffcaf016464f595 01dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464 fbaf100000afafaf0000afaf0000afaf0000af00fbaf1900af00afafaf00 00afaf0000afaf00afafaf0000afaf0000af00fcaf090000afaf0000afaf af00faaf120000afaf0000afaf0000afaf0000afafafdfdffcaf036464df dff9af036464dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf14 00afaf0000afaf0000afaf0000afaf0000afafaf00faaf080000afaf0000 afaf00fcaf2500afaf0000afaf0000afaf0000afaf0000af0000afaf0000 af0000afaf0000af0000afaf0000d3af01dfdffcaf016464f59501dfdff6 af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464f9affd00 fbaffd0003af00af00faaf0000fbaffd000faf0000afaf0000afaf000000 af00af00fbaffc00fcaffa000dafaf000000af0000af00af000000fcaf01 dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0600af af00afaf00fcaf0b00afafaf000000af00afafaffc00fcaffa0001afaffc 00fdaf0000fcaf0b00afafaf000000af00afafaffc00fdaffd000aaf00af 00af000000afafaffc00d2af01dfdffcaf016464f59501dfdff6af086400 d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf03 6464dfdff9af036464dfdff6af016464e2af0000d9af0000b6af01dfdffc af016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af016464 e7af050000afaf0000deaf050000afaf0000b6af01dfdffcaf016464f595 01dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464 a6af01dfdffcaf036464dfdff9af036464dfdff6af016464e6affc00dcaf fc00b5af01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464dfdff76401df dff6af01646480afefaf01dfdffcaf016464f59501dfdff6af086400d69d d69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf026464 dff66401dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af 086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01dfdf fcaf016464f59501dfdff6af01646480afefaf01dfdffcaf016464f59501 dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464a6 af01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffcaf0164 64f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af 016464a6af01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdf fcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d 56dff6af016464fcaf0000f1af0300afaf00beaf01dfdffcaf016464f595 01dfdff6af016464fcaf0000faaf0300afaf00e7aff700a0af01dfdffcaf 016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656df f6af016464fcaf0000f1af0600afaf00afaf00e6af0000dcaf01dfdffcaf 016464f59501dfdff6af016464fcaf0000faaf0300afaf00e3af0000f3af 0000aaaf01dfdffcaf016464f59501dfdff6af086400d69dd69d569d0008 00d69dd69d569d56dff6af016464fcaf0000f1af0000fbaf0000e6af0000 dcaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf0000e0af 0000f3af0000aaaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6af016464fcaf0400af000000fcaffc00 fdaf0a00afaf00af000000afafaffc00fcaffc00fdaffc0004afaf000000 ddaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf0a00afaf 00afaf00af000000fcaffd0004af00afafaffc00faaf0000faaffc000caf af000000afaf00af0000afaffc00b7af01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf3100 00afaf0000afaf0000afaf0000afaf00afaf00afaf00afafaf0000afaf00 00afaf0000afaf0000af0000afaf0000afaf00dcaf01dfdffcaf016464f5 9501dfdff6af016464fcaf0000faaf1b00afaf00afaf0000afaf0000afaf 0000afaf0000afaf0000afaf0000fbaf0000fbaf160000afaf0000afaf00 afafaf0000afafaf0000afaf0000b8af01dfdffcaf016464f59501dfdff6 af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000 fcaf0300afaf00fcaf0d00afaf00afaf00afaf00afafaf00fcaf0300afaf 00f5af0300afaf00dcaf01dfdffcaf016464f59501dfdff6af016464fcaf f80005afaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000fbaf00 00fbaf0000fcaf0700afaf00afafaf00f7af0000b8af01dfdffcaf016464 f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af01 6464fcaf0000fcaf0200afaffa000cafaf00afaf00afaf00afafaf00fcaf 0300afaf00f9affb0002afaf00dcaf01dfdffcaf016464f59501dfdff6af 016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf0200afaf fa00fbaf0000fbaffa0006afaf00afafaf00fbaffb00b8af01dfdffcaf01 6464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 af016464fcaf0000fcaf0300afaf00f9af0a00afaf00afaf00afafaf00fc af0300afaf00faaf080000afafaf00afaf00dcaf01dfdffcaf016464f595 01dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fc af0300afaf00f6af0000fbaf0000f9af0400afafaf00fcaf050000afafaf 00b8af01dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800 d69dd69d569d56dff6af016464fcaf0000fcaf0300afaf00f9af0a00afaf 00afaf00afafaf00fcaf0300afaf00fcaf0200af00fcaf0300afaf00dcaf 01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf0600afaf00af af00fcaf0300afaf00fcaf0300afaf00f6af0000fbaf0000f9af0400afaf af00fcaf0000fcaf0000b8af01dfdffcaf016464f59501dfdff6af086400 d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000fcaf2c00 afaf0000afaf0000afaf00afaf00afaf00afafaf0000afaf0000afaf0000 afaf0000af0000afaf0000afaf00dcaf01dfdffcaf016464f59501dfdff6 af016464fcaf0000faaf0600afaf00afaf00fcaf1000afaf0000afaf0000 afaf0000afaf0000fbaf0000fbaf0c0000afaf0000afaf00afafaf00fcaf 050000afaf0000b8af01dfdffcaf016464f59501dfdff6af086400d69dd6 9d569d000800d69dd69d569d56dff6af016464fcaf0000fcaf0300afafaf fc00fdaf0a00afaf00afafaf0000afaffc00fcaffc00fdaffd0006af0000 afaf0000deaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf 0600afaf00afaf00fcaf0b00afafaf000000af00afafaffc00faaf0000fa affc00fcaf030000af00fbaffd0002af0000b9af01dfdffcaf016464f595 01dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464 a6af01dfdffcaf016464f59501dfdff6af016464e2af00008eaf01dfdffc af016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56 dff6af016464a6af01dfdffcaf016464f59501dfdff6af016464e7af0500 00afaf00008eaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d 56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf016464f59501 dfdff6af016464e6affc008daf01dfdffcaf016464f59501dfdff6af0864 00d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf 016464f59501dfdff6af01646480afefaf01dfdffcaf016464f59501dfdf f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01 dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffcaf016464f5 9501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af0164 64a6af01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffcaf 016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656df f6af016464a6af01dfdffcaf016464f59501dfdff6af01646480afefaf01 dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d 569d56dff6af016464a6af01dfdffcaf016464f59501dfdff6af01646480 afefaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6af016464fcaf0000f9af0000b3af01dfdffcaf0164 64f59501dfdff6af016464fcaf0000faaf0300afaf00e7aff700faaf0000 e6af0000c2af01dfdffcaf016464f59501dfdff6af086400d69dd69d569d 000800d69dd69d569d56dff6af016464fcaf0000f9af0000b3af01dfdffc af016464f59501dfdff6af016464fcaf0000faaf0300afaf00e3af0000f6 af0000e6af0000c2af01dfdffcaf016464f59501dfdff6af086400d6d69d 9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000abaf01dfdffcaf 016464f59501dfdff6af016464fcaf0000faaf0000e0af0000dbaf0000c2 af01dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69d d69d569d56dff6af016464fcaf0f00af000000afafaf00afaf00af000000 fcaffd0004af00afafaffc00caaf01dfdffcaf016464f59501dfdff6af01 6464fcaf0000faaf0a00afaf00afaf00af000000fcaffd0004af00afafaf fc00faaf0000fbaf0800af0000af00afafaffc00fdaf0400af000000fcaf fd0007af00afaf00afafaffc00c9af01dfdffcaf016464f59501dfdff6af 086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf200000 afaf0000afaf00afaf0000afaf0000afaf0000afaf0000afaf0000afaf00 00cbaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf1b00af af00afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000fbaf0000 fbaf280000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000af af0000afaf00afaf0000afaf0000caaf01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf0000 fcaf0600afaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000cbaf 01dfdffcaf016464f59501dfdff6af016464fcaff80005afaf00afaf00fc af0300afaf00fcaf0300afaf00fcaf0000fbaf0000fbaf0000fcaf0000f9 af0300afaf00fcaf0300afaf00fcaf0600afaf00afaf00fcaf0000caaf01 dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d 9d5656dff6af016464fcaf0000fcaf0600afaf00afaf00fcaf0300afaf00 fcaf0200afaffa00cbaf01dfdffcaf016464f59501dfdff6af016464fcaf 0000faaf0600afaf00afaf00fcaf0300afaf00fcaf0200afaffa00fbaf00 00fbaf0000fcaf0300afafaffb0002afaf00fcaf0300afaf00fcaf0500af af00afaffa00caaf01dfdffcaf016464f59501dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464fcaf0000fcaf0600afaf00af af00fcaf0300afaf00fcaf0300afaf00c6af01dfdffcaf016464f59501df dff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf03 00afaf00f6af0000fbaf0000fcaf0b00afaf0000afafaf00afaf00fcaf03 00afaf00fcaf0600afaf00afaf00c5af01dfdffcaf016464f59501dfdff6 af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000 fcaf0600afaf00afaf00fcaf0300afaf00fcaf0300afaf00c6af01dfdffc af016464f59501dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf 0300afaf00fcaf0300afaf00f6af0000fbaf0000fcaf0300afaf00fcaf03 00afaf00fcaf0300afaf00fcaf0600afaf00afaf00c5af01dfdffcaf0164 64f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af 016464fcaf0000fcaf0600afaf00afaf00fcaf1000afaf0000afaf0000af af0000afaf0000cbaf01dfdffcaf016464f59501dfdff6af016464fcaf00 00faaf0600afaf00afaf00fcaf1000afaf0000afaf0000afaf0000afaf00 00fbaf0000fbaf0000fcaf0b00afaf0000afaf0000afaf00fcaf1300afaf 0000afaf0000afaf00afaf0000afaf0000caaf01dfdffcaf016464f59501 dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fc af0000fcaf0600afaf00afaf00fcaf0b00afafaf000000af00afafaffc00 caaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf0600afaf 00afaf00fcaf0b00afafaf000000af00afafaffc00faaf0000fbaf0000fc af0b00afafaf000000af0000af00fcaf0e00afafaf000000af00afaf00af afaffc00c9af01dfdffcaf016464f59501dfdff6af086400d69dd69d569d 000800d69dd69d569d56dff6af016464e4af0000c3af01dfdffcaf016464 f59501dfdff6af016464e2af0000d0af0000bfaf01dfdffcaf016464f595 01dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464 e9af050000afaf0000c3af01dfdffcaf016464f59501dfdff6af016464e7 af050000afaf0000d5af050000afaf0000bfaf01dfdffcaf016464f59501 dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464e8 affc00c2af01dfdffcaf016464f59501dfdff6af016464e6affc00d3affc 00beaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6af016464a6af01dfdffcaf016464f59501dfdff6af 01646480afefaf01dfdffcaf016464f59501dfdff6af086400d69dd69d56 9d000800d69dd69d569d56dff6af016464a6af01dfdffcaf016464f59501 dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf0164 64f59501dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af 086400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdf fcaf016464f59501dfdff6af01646480afefaf01dfdffcaf016464f59501 dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6 af01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffcaf0164 64f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af 016464fcaf0000ddaf0000f2af0300afaf00e1af01dfdffcaf016464f595 01dfdff6af016464fcaf0000fbaf0300afaf00f6af0000f6affa00deaf05 0000afaf0000c0af01dfdffcaf016464f59501dfdff6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6af016464fcaf0000ddaf0000f2af0300 afaf00e1af01dfdffcaf016464f59501dfdff6af016464fcaf0000fcaf04 00afafaf00f6af0000f6af0000fcaf010000e0af0400afafaf00beaf01df dffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d56 9d56dff6af016464fcaf0000ddaf0000f2af0000deaf01dfdffcaf016464 f59501dfdff6af016464fcaf0400afafaf00fcaf0000ebaf0000fbaf0000 e0af0400afafaf00beaf01dfdffcaf016464f59501dfdff6af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0700af000000afaf 00fbaf0600af00af000000fcaffc00fdaf0c00af0000af00af000000afaf affc00fdaf0600afaf00afafaffc00e8af01dfdffcaf016464f59501dfdf f6af016464fcaf0300afaf00fbaf0300afafaffc00fdaf0b00afaf00af00 0000afafaf00fbaf0000faaffc00fdaf0400af000000f9affc0008afaf00 0000af000000bfaf01dfdffcaf016464f59501dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464fcaf080000afaf0000af0000 fcaf3100af0000afaf0000afaf0000afaf0000afaf0000afafaf0000afaf 0000af0000afaf0000afaf00afaf00afaf0000afaf0000e9af01dfdffcaf 016464f59501dfdff6af016464fcaf0200af00faaf1600afaf0000afaf00 00afaf00afaf0000afaf0000afaf00fcaf0000faaf0d0000afaf0000afaf 0000afaf0000fbaf0c0000afaf0000afaf00afafaf00beaf01dfdffcaf01 6464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 af016464fcaf0000fcaf0a00afaf00afafaf00afaf00fcaf0300afaf00fc af0300afaf00fcaf0000fcaf0200af00fcaf0900afaf00afaf00afaf00e4 af01dfdffcaf016464f59501dfdff6af016464fcaffd00faaf0300afaf00 fcaf0600afaf00afaf00fcaf0200afaffb00f4af0300afaf00fcaf0000fb af0000fcaf0700afaf00afafaf00beaf01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf0000 fcaf0a00afaf00afafaf00afaf00fcaf0200afaffa0002afaf00fcaf0000 fcaf0200af00fcaf0900afaf00afaf00afaf00e4af01dfdffcaf016464f5 9501dfdff6af016464fcaf0300afaf00fbaf0200afaffa0005afaf00afaf 00fcaf0300afaf00fcaf0000f9affb0002afaf00fcaf0000fbaf0000fcaf 0700afaf00afafaf00beaf01dfdffcaf016464f59501dfdff6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000fcaf0a00af afaf00afaf00afaf00fcaf0300afaf00f9af0000fcaf0000fcaf0200af00 fcaf0900afaf00afaf00afaf00e4af01dfdffcaf016464f59501dfdff6af 016464fcaf0400afafaf00fcaf0300afaf00f9af0300afaf00fcaf0300af af00fbaf0000fbaf080000afafaf00afaf00fcaf0000fbaf0000fcaf0700 afaf00afafaf00beaf01dfdffcaf016464f59501dfdff6af086400d69dd6 9d569d000800d69dd69d569d56dff6af016464fcaf0000fcaf0a00afafaf 00af00afafaf00fcaf0300afaf00f9af0000fcaf0000fcaf0200af00fcaf 0900afaf00afaf00afaf00fcaf0000e9af01dfdffcaf016464f59501dfdf f6af016464fcaf0000fcaf0700afafaf00afaf00f9af0300afaf00fcaf03 00afaf00fbaf0000fbaf0000fcaf0300afaf00fcaf0000fbaf0000fcaf07 00afaf00afafaf00beaf01dfdffcaf016464f59501dfdff6af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000fcaf0000fcaf 150000afafaf0000afaf0000afaf0000afaf0000afaf00fcaf1a0000afaf 0000af0000afaf0000afaf00afaf00afaf0000afaf0000e9af01dfdffcaf 016464f59501dfdff6af016464fcaf0000fbaf1100afaf00afaf0000afaf 0000afaf00afaf00fcaf0300afaf00fcaf260000afaf00afaf0000afaf00 00afaf0000afaf0000afaf00afaf0000afaf0000afaf00afafaf00beaf01 dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d 569d56dff6af016464fcaf0000fcaf0000fcaf0000fcaf0400af000000fc affc00fdaf0000fcaf0700af000000afafaffc00fdaf0600afaf00afafaf fc00e8af01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf0500 af00afafaffc00fdaf0300afaf00fcaf0200afaffa00fdaf1600afafaf00 0000af0000af00af000000afafaf00afafaffc00fdaf0400afafaf00beaf 01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d 9d9d5656dff6af016464f2af0000fcaf0000baaf01dfdffcaf016464f595 01dfdff6af016464c9af0000a7af01dfdffcaf016464f59501dfdff6af08 6400d69dd69d569d000800d69dd69d569d56dff6af016464f3af010000fc af0000baaf01dfdffcaf016464f59501dfdff6af016464c9af0000a7af01 dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d 9d5656dff6af016464f4af010000fbaf0000baaf01dfdffcaf016464f595 01dfdff6af016464c9af0000a7af01dfdffcaf016464f59501dfdff6af08 6400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffc af016464f59501dfdff6af01646480afefaf01dfdffcaf016464f59501df dff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af 01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffcaf016464 f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af01 6464a6af01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffc af016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af016464a6af01dfdffcaf016464f59501dfdff6af01646480afefaf 01dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd6 9d569d56dff6af016464a6af01dfdffcaf016464f59501dfdff6af016464 80afefaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6af016464fcaf0000abaf01dfdffcaf016464f595 01dfdff6af016464fcaf0000fbaf0300afaf00f6af0000f6affa00f1af05 0000afaf0000adaf01dfdffcaf016464f59501dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464fcaf0000abaf01dfdffcaf01 6464f59501dfdff6af016464fcaf0000fcaf0400afafaf00f6af0000f6af 0000fcaf010000f3af0400afafaf00abaf01dfdffcaf016464f59501dfdf f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01 dfdffcaf016464f59501dfdff6af016464fcaf0400afafaf00fcaf0000eb af0000fbaf0000f3af0400afafaf00abaf01dfdffcaf016464f59501dfdf f6af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf03 00afaf00fcaf1100af00af0000afaf0000afafaf00af000000c4af01dfdf fcaf016464f59501dfdff6af016464fcaf0300afaf00fbaf0300afafaffc 00fdaf0b00afaf00af000000afafaf00fbaf0000faaffc0008afaf000000 af000000acaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56 000800d6d69d9d9d5656dff6af016464fcaf0300afaf00fcaf1200af0000 afaf0000afaf00afaf0000afaf0000c5af01dfdffcaf016464f59501dfdf f6af016464fcaf0200af00faaf1600afaf0000afaf0000afaf00afaf0000 afaf0000afaf00fcaf0000faaf0c0000afaf0000afaf00afafaf00abaf01 dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d 569d56dff6af016464fcaf0300afaf00fcaf0d00af00afafaf00afafaf00 afaf00fcaf0000c5af01dfdffcaf016464f59501dfdff6af016464fcaffd 00faaf0300afaf00fcaf0600afaf00afaf00fcaf0200afaffb00f9af0000 fcaf0700afaf00afafaf00abaf01dfdffcaf016464f59501dfdff6af0864 00d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0300afaf00 fcaf0d00af00afafaf00afafaf00afaf00fcaf0000c5af01dfdffcaf0164 64f3dff6af016464fcaf0300afaf00fbaf0200afaffa0005afaf00afaf00 fcaf0300afaf00fcaf0000faaf0000fcaf0700afaf00afafaf00abaf01df dffcaf016464f3dff6af086400d69dd69d569d000800d69dd69d569d56df f6af016464fcaf0300afaf00fcaf0d00af00afafaf00afafaf00afaf00fc af0000c5af01dfdffcaf016464f7df036464dfdff6af016464fcaf0400af afaf00fcaf0300afaf00f9af0300afaf00fcaf0300afaf00fbaf0000fbaf 0000fcaf0700afaf00afafaf00abaf01dfdffcaf016464f7df036464dfdf f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf03 00afaf00fcaf0d00af00afafaf00afafaf00afaf00fcaf0000c5af01dfdf fcaf04646495dfdffbaf04646495dfdff6af016464fcaf0000fcaf0700af afaf00afaf00f9af0300afaf00fcaf0300afaf00fbaf0000fbaf0000fcaf 0700afaf00afafaf00abaf01dfdffcaf04646495dfdffbaf04646495dfdf f6af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf1a 00afaf0000afaf0000af00afafaf00afafaf00afaf0000afaf0000c5af01 dfdffcaf04646495dfdffbaf04646495dfdff6af016464fcaf0000fbaf11 00afaf00afaf0000afaf0000afaf00afaf00fcaf0300afaf00fcaf130000 afaf00afaf0000afaf0000afaf00afafaf00abaf01dfdffcaf04646495df dffbaf04646495dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af016464fcaf1900afafaf000000af00af00afafaf00afafaf00afaf 00af000000c4af01dfdffcaf0e64649595dfdfafafaf64649595dfdff6af 016464fcaf0000faaf0500af00afafaffc00fdaf0300afaf00fcaf0200af affa00fdaf0300afafaffc00fdaf0400afafaf00abaf01dfdffcaf0e6464 9595dfdfafafaf64649595dfdff6af086400d69dd69d569d000800d69dd6 9d569d56dff6af016464fcaf0000ecaf0000c0af01dfdffcaf0e64649595 dfdfafafaf64649595dfdff6af01646480afefaf01dfdffcaf0e64649595 dfdfafafaf64649595dfdff6af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6af016464fcaf0000ecaf0000c0af01dfdffcaf0e6464959595df dfaf6464959595dfdff6af01646480afefaf01dfdffcaf0e6464959595df dfaf6464959595dfdff6af086400d69dd69d569d000800d69dd69d569d56 dff6af056464afafaf00ebaf0000c0af01dfdffcaf0e6464959595dfdfaf 6464959595dfdff6af01646480afefaf01dfdffcaf0e6464959595dfdfaf 6464959595dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 af016464a6af01dfdffcaf016464fc9502df6464fc9501dfdff6af016464 80afefaf01dfdffcaf016464fc9502df6464fc9501dfdff6af086400d69d d69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf016464 fc9502df6464fc9501dfdff6af01646480afefaf01dfdffcaf016464fc95 02df6464fc9501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af016464a6af01dfdffcaf016464fb950064fb9501dfdff6af016464 80afefaf01dfdffcaf016464fb950064fb9501dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464a4dffcaf016464f3dff6af01 646480dfeddffcaf016464f3dff6af086400d6d69d9d9d56000800d6d69d 9d9d5656dff6af0064a3dffcaf0064f2dff6af006480dfecdffcaf0064f2 dff6af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af08 6400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69d d69d569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56 000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d6 9dd69d569d56dff6afa264e3af8064eb64e3af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6afa36400dfe3af8064ec6400dfe3af086400d69d d69d569d000800d69dd69d569d56dff6af016464f79501dfdfd695e7df02 95dfdff79501dfdfe3af016464f79501dfdfc295c4df0295dfdff79501df dfe3af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464f995 fddf0064d695e8df016495fcdff99501dfdfe3af016464f995fddf0064c2 95c5df016495fcdff99501dfdfe3af086400d69dd69d569d000800d69dd6 9d569d56dff6af016464fb95fcdf016464d69501dfdfebaf02646495fadf fb9501dfdfe3af016464fb95fcdf016464c29501dfdfc8af02646495fadf fb9501dfdfe3af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af04 6464959595fcdf03afaf6464d69501dfdfebaf06646495dfdfafaffcdffd 9501dfdfe3af046464959595fcdf03afaf6464c29501dfdfc8af06646495 dfdfafaffcdffd9501dfdfe3af086400d69dd69d569d000800d69dd69d56 9d56dff6af02646495fcdffcaf016464d69501dfdfebaf04646495dfdffc affcdf0295dfdfe3af02646495fcdffcaf016464c29501dfdfc8af046464 95dfdffcaffcdf0295dfdfe3af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6af046464dfdfdffaaf016464d69501dfdfebaf04646495dfdffa affd6401dfdfe3af046464dfdfdffaaf016464c29501dfdfc8af04646495 dfdffaaffd6401dfdfe3af086400d69dd69d569d000800d69dd69d569d56 dff6af02646495fc64fcaf016464d69501dfdfebaf04646495dfdffcaffc 640295dfdfe3af02646495fc64fcaf016464c29501dfdfc8af04646495df dffcaffc640295dfdfe3af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af046464959595fc6403afaf6464d69501dfdfebaf06646495dfdfaf affc64fd9501dfdfe3af046464959595fc6403afaf6464c29501dfdfc8af 06646495dfdfafaffc64fd9501dfdfe3af086400d69dd69d569d000800d6 9dd69d569d56dff6af016464fb95fa64d69501dfdfebaf04646495dfdffc 64fb9501dfdfe3af016464fb95fa64c29501dfdfc8af04646495dfdffc64 fb9501dfdfe3af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af01 6464f995fc64d69501dfdfe9640495df646464f99501dfdfe3af016464f9 95fc64c29501dfdfc6640495df646464f99501dfdfe3af086400d69dd69d 569d000800d69dd69d569d56dff6af016464f795016464d69500dfe86402 95df64f79501dfdfe3af016464f795016464c29500dfc5640295df64f795 01dfdfe3af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464 a4dfe3af01646480dfeddfe3af086400d69dd69d569d000800d69dd69d56 9d56dff6af0064a3dfe3af006480dfecdfe3af086400d6d69d9d9d560008 00d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd6 9d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656 df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80 afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af08 6400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d6 9d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d 000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6 d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd69d56 9d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 af80df80dfdddff6af086400d69dd69d569d000800d69dd69d569d56dff6 af80df80dfdedf0064f6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af80df80dfdfdf016464f6af086400d69dd69d569d000800d69dd69d 569d56dff6affddf80af80afe3affd64f6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6affddf80af80afe3affd64f6af086400d69dd69d56 9d000800d69dd69d569d56dff6affddf80af80afe3affd64f6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6affddf80af80afe3affd64f6af 086400d69dd69d569d000800d69dd69d569d56dff6affddf80af80afe3af fd64f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddfe1af fa00f1af0000f4af0000faaf000080afacaffd64f6af086400d69dd69d56 9d000800d69dd69d569d56dff6affddfe1af0000fcaf010000f6af0400af afaf00f4af0000faaf0000f7af000080afb6affd64f6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6affddfe1af0000fbaf0000f6af0400af afaf00f4af0000f0af000080afb6affd64f6af086400d69dd69d569d0008 00d69dd69d569d56dff6affddfe1af0000fbaf0300afafaffc000bafaf00 0000afaf00af000000f8af0000faaf0b00afafaf000000afaf00000080af b7affd64f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddf e1af0000fcaf150000afaf0000afaf0000afaf00afafaf0000afaf0000f9 af0000faaf0a00afaf00afafaf00afaf0080afb6affd64f6af086400d69d d69d569d000800d69dd69d569d56dff6affddfe1affa00f8af0700afaf00 afafaf00fcaf0000f9af0000faaf0400afaf0000fbaf000080afb6affd64 f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddfe1af0000 f7affb0006afaf00afafaf00fcaf0000f9af0000faaf0a00afafaf000000 afafaf0080afb6affd64f6af086400d69dd69d569d000800d69dd69d569d 56dff6affddfe1af0000f8af0c0000afafaf00afaf00afafaf00fcaf0000 f9af0000faaf0000fbaf040000afaf0080afb6affd64f6af086400d6d69d 9d9d56000800d6d69d9d9d5656dff6affddfe1af0000f8af0000fcaf0700 afaf00afafaf00fcaf0000f9af0000faaf0000faaf0300afaf0080afb6af fd64f6af086400d69dd69d569d000800d69dd69d569d56dff6affddfe1af 0000f8af0c0000afaf0000afaf00afafaf00fcaf0000f9af0000faaf0a00 afaf00afafaf00afaf0080afb6affd64f6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6affddfe1af0000f7affd0008af0000afaf0000af00 fcaf0000f9affa0007af00afafaf000000fcaf01000080afb8affd64f6af 086400d69dd69d569d000800d69dd69d569d56dff6affddf80af80afe3af fd64f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddf80af 80afe3affd64f6af086400d69dd69d569d000800d69dd69d569d56dff6af fddf80af80afe3affd64f6af086400d6d69d9d9d56000800d6d69d9d9d56 56dff6affddf80af80afe3affd64f6af086400d69dd69d569d000800d69d d69d569d56dff6affddffdaf80648064e96405dfafaf646464f6af086400 d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf006480df80dfeb df0664dfafaf646464f6af086400d69dd69d569d000800d69dd69d569d56 dff6affddffdaf0164df80af80afecaf0664dfafaf646464f6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0264dfaf80648064 ee6407af64dfafaf646464f6af086400d69dd69d569d000800d69dd69d56 9d56dff6affddffdaf0264dfaf80648064ef6408dfaf64dfafaf646464f6 af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464df af646480af80aff2af09dfdfaf64dfafaf646464f6af086400d69dd69d56 9d000800d69dd69d569d56dff6affddffdaf0464dfaf646480af80aff2af 09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6affddffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf64 6464f6af086400d69dd69d569d000800d69dd69d569d56dff6affddffdaf 0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464dfaf646480af80 aff2af09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d69d d69d569d56dff6affddffdaf0464dfaf646480af80aff2af09dfdfaf64df afaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affd dffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af0864 00d69dd69d569d000800d69dd69d569d56dff6affddffdaf0464dfaf6464 80af80aff2af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6affddffdaf0464dfaf646480af80aff2af09dfdf af64dfafaf646464f6af086400d69dd69d569d000800d69dd69d569d56df f6affddffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6 af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464df af646480af80aff2af09dfdfaf64dfafaf646464f6af086400d69dd69d56 9d000800d69dd69d569d56dff6affddffdaf0664dfaf6464af0080af80af f4af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d 9d9d5656dff6affddffdaf0664dfaf6464af0080af80aff4af09dfdfaf64 dfafaf646464f6af086400d69dd69d569d000800d69dd69d569d56dff6af fddffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af08 6400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464dfaf64 6480af80aff2af09dfdfaf64dfafaf646464f6af086400d69dd69d569d00 0800d69dd69d569d56dff6affddffdaf0464dfaf646480af80aff2af09df dfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6affddffdaf0464dfaf646480008000f20009dfdfaf64dfafaf646464 f6af086400d69dd69d569d000800d69dd69d569d56dff6affddffdaf0464 dfaf646480008000f20009dfdfaf64dfafaf646464f6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6affddffdaf0864dfaf6464000000aff6 0000afe60000afd80000affa0000afe80000af8000e50009dfdfaf64dfaf af646464f6af086400d69dd69d569d000800d69dd69d569d56dff6affddf fdaf0864dfaf6464000000aff60000afe60000afd80000affa0000aff600 00aff30000af8000e50009dfdfaf64dfafaf646464f6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6affddffdaf0764dfaf64640000aff600 00afe60000afd80000aff90000aff60000aff40000af8000e40009dfdfaf 64dfafaf646464f6af086400d69dd69d569d000800d69dd69d569d56dff6 affddffdaf0a64dfaf64640000af0000affc000eaf0000af000000afafaf 00af000000fcaffd00fdaf0c00af000000af0000af00afafaffc00fdaf09 00af0000af00afaf0000fcaffd0004af00afafaffc000baf000000afafaf 00af000000fcaf070000afafaf000000fcaffc000baf000000afafaf00af 000000fcaffc00fcaffd0007af00afaf0000afaf860009dfdfaf64dfafaf 646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffd af0a64dfaf64640000af0000affc007faf0000af0000afaf0000afaf0000 afaf0000afaf00afaf0000afaf000000af0000afaf0000afaf0000afaf00 00afaf0000afaf000000afaf0000afaf0000afaf0000afaf000000af0000 afaf0000afaf0000afaf0000afaf0000af000000afaf0000afaf000000af 0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf0a0000afaf00 00afaf0000af870009dfdfaf64dfafaf646464f6af086400d69dd69d569d 000800d69dd69d569d56dff6affddffdaf0a64dfaf646400af000000affc 0006af00af000000affc0003af0000affa0000affc0007af0000af000000 affc0003af0000affc0003af0000aff70003af0000affc0007af0000af00 0000affc0000aff90003af0000aff80007af0000af000000affc0003af00 00affc0003af0000affc000baf0000af000000af000000af870009dfdfaf 64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 affddffdaf0a64dfaf646400af000000affc0006af00af000000affc0003 af0000affa0000affc0007af0000af000000affc0003af0000affc0003af 0000affb00fbaf020000affc0007af0000af000000affc0003af000000fb af020000affc00fbaf060000af000000affc0002af0000faaf020000affc 000baf0000af000000af000000af870009dfdfaf64dfafaf646464f6af08 6400d69dd69d569d000800d69dd69d569d56dff6affddffdaf0a64dfaf64 6400af000000affc0006af00af000000affc0003af0000affa0000affc00 07af0000af000000affc0003af0000affc0003af0000affc0008afaf0000 00af0000affc0007af0000af000000affc001baf0000afaf000000af0000 af000000afaf000000af0000af000000affc0003af0000aff90000affc00 0baf0000af000000af000000af870009dfdfaf64dfafaf646464f6af0864 00d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0564dfaf6464 affc0000affc0001afaffc0000affc0003af0000affc0002af00affc0002 af00affc0000affc0003af0000affc0003af0000affc0000affc0003af00 00affc0002af00affc0000affc0003af0000affc0007af0000af000000af fc0002af00affc0000affc0003af0000aff90000affc000baf0000af0000 00af000000af870009dfdfaf64dfafaf646464f6af086400d69dd69d569d 000800d69dd69d569d56dff6affddffdaf0564dfaf6464affc0006afaf00 00afafaffc0016afaf0000afaf0000afaf0000afaf00afaf0000afaf00af fc0000affc000baf0000afaf0000afaf0000affc000fafaf0000afaf0000 afaf0000afaf00affc001bafaf0000afaf0000afaf0000afaf0000af0000 00afaf0000afaf00affc0020afaf0000afaf0000afaf0000afaf0000afaf 0000afaf0000af000000af000000af870009dfdfaf64dfafaf646464f6af 086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0564dfaf 6464affb00fdaf0200afaffb00fdaf0400af000000fcaffd00fdaf0300af 00affc0000affc000baf000000afafaf00af0000affb00fdaf0b00afaf00 af00afafaf0000affb00fdaf1700af000000afafaf00afaf0000afaf0000 afafaf00afafaffb00fdaf0400af000000fcaffc00fcaffd0008af000000 af000000af870009dfdfaf64dfafaf646464f6af086400d69dd69d569d00 0800d69dd69d569d56dff6affddffdaf0464dfaf6464eb0000aff20000af ed0000aff10000afd00000af8000ec0009dfdfaf64dfafaf646464f6af08 6400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464dfaf64 64f00005afaf0000afaff70005afaf0000afaff20005afaf0000afaff100 00afd50005afaf0000afaf8000ec0009dfdfaf64dfafaf646464f6af0864 00d69dd69d569d000800d69dd69d569d56dff6affddffdaf0464dfaf6464 ef00fcaff500fcaff000fcaff00000afd400fcaf8000eb0009dfdfaf64df afaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affd dffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af0864 00d69dd69d569d000800d69dd69d569d56dff6affddffdaf0464dfaf6464 80af80aff2af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6affddffdaf0864dfaf6464afafaf00f6af0000e6 af0000d8af0000faaf000080afccaf09dfdfaf64dfafaf646464f6af0864 00d69dd69d569d000800d69dd69d569d56dff6affddffdaf0864dfaf6464 afafaf00f6af0000e6af0000d8af0000faaf0000f6af000080afd7af09df dfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6affddffdaf0764dfaf6464afaf00f6af0000e6af0000d8af0000f9af 0000f6af000080afd7af09dfdfaf64dfafaf646464f6af086400d69dd69d 569d000800d69dd69d569d56dff6affddffdaf0a64dfaf6464afaf00afaf 00fcaf0e00afaf00afafaf000000af00afafaffc00fdaffd000caf00afaf af00afaf00af000000fcaffd0009af00afaf00af0000afaffc00fdaf0400 af000000fcaf0b00afafaf000000af00afafaffc0007afaf000000afafaf fc0080afdfaf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6affddffdaf0a64dfaf6464afaf00afaf00fcaf63 00afaf00afaf0000afaf0000afaf0000afaf0000af0000afaf0000afafaf 00afaf0000afaf0000afaf0000afaf0000afaf0000afafaf0000afaf0000 afaf0000afaf0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf 00afafaf0000afaf000080afe0af09dfdfaf64dfafaf646464f6af086400 d69dd69d569d000800d69dd69d569d56dff6affddffdaf0a64dfaf6464af 00afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000fcaf0700 afaf00afafaf00fcaf0300afaf00fcaf0300afaf00f7af0300afaf00fcaf 0700afaf00afafaf00fcaf0000f9af0300afaf00f8af000080afe0af09df dfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6affddffdaf0a64dfaf6464af00afafaf00fcaf0600af00afafaf00fc af0300afaf00faaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf 0300afaf00fbaffb0002afaf00fcaf0700afaf00afafaf00fcaf0300afaf affb0002afaf00fcaffb0080afe0af09dfdfaf64dfafaf646464f6af0864 00d69dd69d569d000800d69dd69d569d56dff6affddffdaf0a64dfaf6464 af00afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000fcaf07 00afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf080000afafaf 00afaf00fcaf0700afaf00afafaf00fcaf1400afaf0000afafaf00afaf00 afafaf0000afafaf0080afe0af09dfdfaf64dfafaf646464f6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0564dfaf646400fc af0000fcaf010000fcaf0000fcaf0300afaf00fcaf0200af00fcaf0200af 00fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0000fcaf0300afaf00 fcaf0200af00fcaf0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf 000080afe0af09dfdfaf64dfafaf646464f6af086400d69dd69d569d0008 00d69dd69d569d56dff6affddffdaf0564dfaf646400fcaf060000afaf00 0000fcaf160000afaf0000afaf0000afaf0000af0000afaf0000af00fcaf 0000fcaf0b00afaf0000afaf0000afaf00fcaf0f0000afaf0000afaf0000 afaf0000af00fcaf190000afaf0000afaf0000afaf0000afaf00afafaf00 00afaf000080afe0af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d 56000800d6d69d9d9d5656dff6affddffdaf0564dfaf646400fbaffd0002 af0000fbaffd0004af00afafaffc00fdaffd0003af00af00fcaf0000fcaf 0b00afafaf000000af00afaf00fbaffd000baf0000af00af000000afaf00 fbaffd0016af00afafaf000000af0000afaf0000afaf000000af000080af e1af09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d69dd6 9d569d56dff6affddffdaf0464dfaf6464ebaf0000f2af0000edaf0000f1 af000080afbbaf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d5600 0800d6d69d9d9d5656dff6affddffdaf0464dfaf6464f0af050000afaf00 00f7af050000afaf0000f2af050000afaf0000f1af000080afbbaf09dfdf af64dfafaf646464f6af086400d69dd69d569d000800d69dd69d569d56df f6affddffdaf0464dfaf6464efaffc00f5affc00f0affc00f0af000080af bbaf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d 9d9d5656dff6affddffdaf0464dfaf646480af80aff2af09dfdfaf64dfaf af646464f6af086400d69dd69d569d000800d69dd69d569d56dff6affddf fdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af086400 d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464dfaf646480 af80aff2af09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800 d69dd69d569d56dff6affddffdaf0464dfaf646480af80aff2af09dfdfaf 64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 affddffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af 086400d69dd69d569d000800d69dd69d569d56dff6affddffdaf0464dfaf 646480df80dff0df07af64dfafaf646464f6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6affddffdaf0364dfaf6480df80dfefdf07af64df afaf646464f6af086400d69dd69d569d000800d69dd69d569d56dff6affd dffdaf0164df80af80afecaf0664dfafaf646464f6af086400d6d69d9d9d 56000800d6d69d9d9d5656dff6affddffdaf80648064e96405dfafaf6464 64f6af086400d69dd69d569d000800d69dd69d569d56dff6affddffdaf80 df80dfe8df04afaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6affddf80af80afe3affd64f6af086400d69dd69d569d000800d6 9dd69d569d56dff6affddf80af80afe3affd64f6af086400d6d69d9d9d56 000800d6d69d9d9d5656dff6affddf80af80afe3affd64f6af086400d69d d69d569d000800d69dd69d569d56dff6affddf80af80afe3affd64f6af08 6400d6d69d9d9d56000800d6d69d9d9d5656dff6affddf80af80afe3affd 64f6af086400d69dd69d569d000800d69dd69d569d56dff6affddf806480 64e064f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af01dfdf 80648064df64f6af086400d69dd69d569d000800d69dd69d569d56dff6af 00df80648064de64f6af086400d6d69d9d9d56000800d6d69d9d9d5656df 80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80af c9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af0864 00d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d69d 9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d00 0800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d6 9d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d 56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af 80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af 086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d6 9dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d 56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800 d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d 9d5656dff1affd00f4af0000ebaf000080af80af0aafaf6400d69dd69d56 9d000800d69dd69d569d56dff3af060000afafaf0000f6af0000efaf0400 afafaf0080af80af0aafaf6400d6d69d9d9d56000800d6d69d9d9d5656df f3af0000fbaf0000f6af0000efaf000080af80affaaf086400d69dd69d56 9d000800d69dd69d569d56dff3af0000f7affc00fdaf0300afafaffc00fc affc0009af000000afaf00afafaffc00fdaf0400af00000080af8daf0864 00d6d69d9d9d56000800d6d69d9d9d5656dff2af010000faaf2e0000afaf 0000afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00afaf00 00afaf0000afaf0000afaf000080af8eaf086400d69dd69d569d000800d6 9dd69d569d56dff0af010000fcaf0000fcaf0600afaf00afaf00fcaf0300 afaf00faaf0700afafaf00afaf00fcaf0300afaf00fcaf000080af8eaf08 6400d6d69d9d9d56000800d6d69d9d9d5656dfeeaf030000afaffa0004af af00afaffa0002afaf00faaf0700afafaf00afaf00fcaf0300afaf00fcaf 000080af8eaf086400d69dd69d569d000800d69dd69d569d56dfedaf0300 afaf00f9af0300afaf00f9af0000faaf0700afafaf00afaf00fcaf0300af af00fcaf000080af8eaf086400d6d69d9d9d56000800d6d69d9d9d5656df f3af0000fbaf0300afaf00f9af0300afaf00f9af0000fcaf0900af00afaf af00afaf00fcaf0300afaf00fcaf000080af8eaf086400d69dd69d569d00 0800d69dd69d569d56dff3af320000afafaf0000afaf0000afaf0000afaf 00afaf0000afaf0000afaf0000afaf0000af00afafaf00afaf0000afaf00 00afaf00fcaf000080af8eaf086400d6d69d9d9d56000800d6d69d9d9d56 56dff1affd00fbaffc00fdaf0300afafaffc00fcaffc00fdaf060000af00 afafaffc00fdaf0000fcaf000080af8eaf086400d69dd69d569d000800d6 9dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d 5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80 af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9 af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400 d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d 569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d560008 00d6d69d9d9d5656dff4af80648064e164f4af086400d69dd69d569d0008 00d69dd69d569d56dff4af80648064e26400dff4af086400d6d69d9d9d56 000800d6d69d9d9d5656dff4af01646480af80afe5af01dfdff4af086400 d69dd69d569d000800d69dd69d569d56dff4af01646480af80afe5af01df dff4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af01646480af 80afe5af01dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4 af01646480af80afe5af01dfdff4af086400d6d69d9d9d56000800d6d69d 9d9d5656dff4af01646480af80afe5af01dfdff4af086400d69dd69d569d 000800d69dd69d569d56dff4af01646480af80afe5af01dfdff4af086400 d6d69d9d9d56000800d6d69d9d9d5656dff4af01646480af80afe5af01df dff4af086400d69dd69d569d000800d69dd69d569d56dff4af01646480af 80afe5af01dfdff4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4 af016464f8af0000f6af0000e6af0000d8af0000faaf0000e8af0000daaf 000084af01dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4 af016464f8af0000f6af0000e6af0000d8af0000faaf0000f6af0000f3af 0000daaf000084af01dfdff4af086400d6d69d9d9d56000800d6d69d9d9d 5656dff4af016464f9af0000f6af0000e6af0000d8af0000f9af0000f6af 0000f4af0000daaf000083af01dfdff4af086400d69dd69d569d000800d6 9dd69d569d56dff4af016464f9af0300afaf00fcaf0e00afaf00afafaf00 0000af00afafaffc00fdaffd000caf00afafaf00afaf00af000000fcaffd 0009af00afaf00af0000afaffc00fdaf0400af000000fcaf0b00afafaf00 0000af00afafaffc0007afaf000000afafaffc00fcaf0b00afafaf000000 af00afafaffc00fcaffc00fdaf0700af0000afaf0000fcaf000083af01df dff4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af016464f9af 0300afaf00fcaf7f00afaf00afaf0000afaf0000afaf0000afaf0000af00 00afaf0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000af afaf0000afaf0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf 0000afaf0000afaf00afafaf0000afaf0000afafaf00afaf0000afaf0000 afaf0000afaf0000afaf0000afaf00000eafaf0000afaf0000afaf00afaf af0083af01dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4 af016464faaf0400afafaf00fcaf0600af00afafaf00fcaf0300afaf00fa af0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00f7af 0300afaf00fcaf0700afaf00afafaf00fcaf0000f9af0300afaf00f8af07 00afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf0e00afaf00af afaf00afafaf00afaf0082af01dfdff4af086400d6d69d9d9d56000800d6 d69d9d9d5656dff4af016464faaf0400afafaf00fcaf0600af00afafaf00 fcaf0300afaf00faaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fc af0300afaf00fbaffb0002afaf00fcaf0700afaf00afafaf00fcaf0300af afaffb0002afaf00fcaffb0006afaf00afafaf00fcaf0200afaffa0002af af00fcaf0e00afaf00afafaf00afafaf00afaf0082af01dfdff4af086400 d69dd69d569d000800d69dd69d569d56dff4af016464faaf0400afafaf00 fcaf0600af00afafaf00fcaf0300afaf00faaf0000fcaf0700afaf00afaf af00fcaf0300afaf00fcaf0300afaf00fcaf080000afafaf00afaf00fcaf 0700afaf00afafaf00fcaf1b00afaf0000afafaf00afaf00afafaf0000af afaf00afaf00afafaf00fcaf0300afaf00f9af0000fcaf0e00afaf00afaf af00afafaf00afaf0082af01dfdff4af086400d6d69d9d9d56000800d6d6 9d9d9d5656dff4af016464fbaf0000fcaf0000fcaf010000fcaf0000fcaf 0300afaf00fcaf0200af00fcaf0200af00fcaf0000fcaf0300afaf00fcaf 0300afaf00fcaf0000fcaf0300afaf00fcaf0200af00fcaf0000fcaf0300 afaf00fcaf0700afaf00afafaf00fcaf0200af00fcaf0000fcaf0300afaf 00f9af0000fcaf0d00afaf00afafaf00afafaf00af0081af01dfdff4af08 6400d69dd69d569d000800d69dd69d569d56dff4af016464fbaf0000fcaf 060000afaf000000fcaf160000afaf0000afaf0000afaf0000af0000afaf 0000af00fcaf0000fcaf0b00afaf0000afaf0000afaf00fcaf0f0000afaf 0000afaf0000afaf0000af00fcaf1b0000afaf0000afaf0000afaf0000af af00afafaf0000afaf0000af00fcaf220000afaf0000afaf0000afaf0000 afaf0000afaf0000afaf00afafaf00afafaf00af0081af01dfdff4af0864 00d6d69d9d9d56000800d6d69d9d9d5656dff4af016464fbaf0000fbaffd 0002af0000fbaffd0004af00afafaffc00fdaffd0003af00af00fcaf0000 fcaf0b00afafaf000000af00afaf00fbaffd000baf0000af00af000000af af00fbaffd0017af00afafaf000000af0000afaf0000afaf000000af0000 00fbaffd0004af00afafaffc00fcaffc00fdaf0a00afafaf00afafaf00af 0081af01dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4af 016464e6af0000f2af0000edaf0000f1af0000d0af000080afe4af01dfdf f4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af016464ebaf05 0000afaf0000f7af050000afaf0000f2af050000afaf0000f1af0000d5af 050000afaf000080afe4af01dfdff4af086400d69dd69d569d000800d69d d69d569d56dff4af016464eaaffc00f5affc00f0affc00f0af0000d4affc 0080afe3af01dfdff4af086400d6d69d9d9d56000800d6d69d9d9d5656df f4af01646480af80afe5af01dfdff4af086400d69dd69d569d000800d69d d69d569d56dff4af01646480af80afe5af01dfdff4af086400d6d69d9d9d 56000800d6d69d9d9d5656dff4af01646480af80afe5af01dfdff4af0864 00d69dd69d569d000800d69dd69d569d56dff4af01646480af80afe5af01 dfdff4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af01646480 af80afe5af01dfdff4af086400d69dd69d569d000800d69dd69d569d56df f4af01646480df80dfe3dff4af086400d6d69d9d9d56000800d6d69d9d9d 5656dff4af006480df80dfe2dff4af086400d69dd69d569d000800d69dd6 9d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656 df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80 afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af08 6400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d6 9d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d 000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6 d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd69d56 9d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80 af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80afc9 af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400 d69dd69d569d000800d69dd69d569d56df80648064c8640700d6d69d9d9d 56000700d6d69d9d9d565680df80dfc8df086400d69dd69d569d000800d6 9dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d 5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80 af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9 af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400 d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d 569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d560008 00d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd6 9d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656 df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80 afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af08 6400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff3afc96480af8daf086400d69dd69d 569d000800d69dd69d569d56dff3af0064cbaf00df80af8daf086400d6d6 9d9d9d56000800d6d69d9d9d5656dff3af0064cbaf00df80af8daf086400 d69dd69d569d000800d69dd69d569d56dff3af0064cbaf00df80af8daf08 6400d6d69d9d9d56000800d6d69d9d9d5656dff3af0064cbaf00df80af8d af086400d69dd69d569d000800d69dd69d569d56dff3af0064fcafd3dffc af00dfbfafd3dfbaafd3dfeeaf086400d6d69d9d9d56000800d6d69d9d9d 5656dff3af0064fcafd4df0064fcaf00dfbfafd4df0064baafd4df0064ee af086400d69dd69d569d000800d69dd69d569d56dff3af0064fcafd5df01 6464fcaf00dfbfafd5df016464baafd5df016464eeaf086400d6d69d9d9d 56000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64fcaf00dfbfaf fddfd9affd64baaffddfd9affd64eeaf086400d69dd69d569d000800d69d d69d569d56dff3af0064fcaffddfd9affd64fcaf00dfbfaffddfd9affd64 baaffddfd9affd64eeaf086400d6d69d9d9d56000800d6d69d9d9d5656df f3af0064fcaffddfd9affd64fcaf00dfbfaffddfd9affd64baaffddfd9af fd64eeaf086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaf fddfd9affd64fcaf00dfbfaffddfd9affd64baaffddfd9affd64eeaf0864 00d6d69d9d9d56000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64 fcaf00dfbfaffddfd9affd64baaffddfd9affd64eeaf086400d69dd69d56 9d000800d69dd69d569d56dff3af0064fcaffddfd9affd64fcaf00dfbfaf fddfd9affd64baaffddfd9affd64eeaf086400d6d69d9d9d56000800d6d6 9d9d9d5656dff3af0064fcaffddff3affd00fbaf0000fbaf0000f5affd64 fcaf00dfbfaffddffbaff90004af00afaf00eaaffd64baaffddffaaf0000 faaf0300afaf00f9af0000f2affd64eeaf086400d69dd69d569d000800d6 9dd69d569d56dff3af0064fcaffddff5af0a0000afafaf0000afafaf00fc af0000f4affd64fcaf00dfbfaffddffbaf0000f9af0600afaf00afaf00ed affd64baaffddffaaf0000faaf0300afaf00f9af0000f2affd64eeaf0864 00d6d69d9d9d56000800d6d69d9d9d5656dff3af0064fcaffddff5af0000 fbaf0800afafaf00afafaf00f3affd64fcaf00dfbfaffddffbaf0000f6af 0300afaf00edaffd64baaffddffaaf0000faaf0000f6af0000f2affd64ee af086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaffddff6 af0000f9af0600afaf00afaf00f2affd64fcaf00dfbfaffddffbaf0000f9 af0a00afaf00af000000afafaffc00fdaf0300af0000fcaffd64baaffddf faaf0000faaf0e00afaf00afafaf000000af00afafaffc00f9affd64eeaf 086400d6d69d9d9d56000800d6d69d9d9d5656dff3af0064fcaffddff6af 0000f9af0500afaf00af00f1affd64fcaf00dfbfaffddffbaf0000f9af13 00afaf00afaf00afafaf0000afaf0000afaf0000faaffd64baaffddffaaf 0000faaf1300afaf00afaf0000afaf0000afaf0000afaf0000faaffd64ee af086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaffddff6 af0000f9af0500afaf000000f1affd64fcaf00dfbfaffddffbaffa000caf af00afaf00afaf00afafaf00fcaf0300afaf00f9affd64baaffddffaaff8 0005afaf00afaf00fcaf0300afaf00fcaf0000faaffd64eeaf086400d6d6 9d9d9d56000800d6d69d9d9d5656dff3af0064fcaffddff6af0000f9af06 00afaf00afaf00f2affd64fcaf00dfbfaffddffbaf0000f9af0900afaf00 afaf00afafaffa0002afaf00f9affd64baaffddffaaf0000faaf0600afaf 00afaf00fcaf0200afaffa00faaffd64eeaf086400d69dd69d569d000800 d69dd69d569d56dff3af0064fcaffddff6af0000f9af0700afaf00afafaf 00f3affd64fcaf00dfbfaffddffbaf0000f9af0a00afaf00afaf00afafaf 00f9af0000f9affd64baaffddffaaf0000faaf0600afaf00afaf00fcaf03 00afaf00f5affd64eeaf086400d6d69d9d9d56000800d6d69d9d9d5656df f3af0064fcaffddff5af0000fbaf0400afafaf00fcaf0000f4affd64fcaf 00dfbfaffddffbaf0000f9af0a00afaf00afaf00afafaf00f9af0000f9af fd64baaffddffaaf0000faaf0600afaf00afaf00fcaf0300afaf00f5affd 64eeaf086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaffd dff5af0a0000afafaf0000afafaf00fbaf0000f5affd64fcaf00dfbfaffd dffbaf0000f9af1200afaf00afaf00afafaf0000afaf0000afaf00f9affd 64baaffddffaaf0000faaf1300afaf00afaf0000afaf0000afaf0000afaf 0000faaffd64eeaf086400d6d69d9d9d56000800d6d69d9d9d5656dff3af 0064fcaffddff3affd00fbaf0000faaf0000f6affd64fcaf00dfbfaffddf fbaf0000f9af0a00afaf00afafaf0000afaffc00fdaf0000f9affd64baaf fddffaaf0000faaf0e00afaf00afafaf000000af00afafaffc00f9affd64 eeaf086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaffddf d9affd64fcaf00dfbfaffddfd9affd64baaffddfd9affd64eeaf086400d6 d69d9d9d56000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64fcaf 00dfbfaffddfd9affd64baaffddfd9affd64eeaf086400d69dd69d569d00 0800d69dd69d569d56dff3af0064fcaffddfd9affd64fcaf00dfbfaffddf d9affd64baaffddfd9affd64eeaf086400d6d69d9d9d560008009d569d9d 9d5656dff3af0064fcaffddfd9affd64fcaf00dfbfaffddfd9affd64baaf fddfd9affd64eeaf086400d69dd69d569d000000fb56029d56dff3af0064 fcaffddfd9affd64fcaf00dfbfaffddfd9affd64baaffddfd9affd64eeaf 036400d6d6fc56ff000000fcd6039d5656dff3af0064fcaffddfd9affd64 fcaf00dfbfaffddfd9affd64baaffddfd9affd64eeaf036400d69dfcd6ff 000800d6d6d69d569d56dff3af0064fcaffddfd9affd64fcaf00dfbfaffd dfd9affd64baaffddfd9affd64eeaf086400d6d69dd6d6d6000800d6d69d 9d9d5656dff3af0064fcaffddfd664fcaf00dfbfaffddfd664baaffddfd6 64eeaf086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaf01 dfdfd564fcaf00dfbfaf01dfdfd564baaf01dfdfd564eeaf086400d6d69d 9d9d56000800d6d69d9d9d5656dff3af0064fcaf00dfd464fcaf00dfbfaf 00dfd464baaf00dfd464eeaf086400d69dd69d569d000800d69dd69d569d 56dff3af0064cbaf00df80af8daf086400d6d69d9d9d56000800d6d69d9d 9d5656dff3af0064cbaf00df80af8daf086400d69dd69d569d000800d69d d69d569d56dff3af0064cbaf00df80af8daf086400d6d69d9d9d56000800 d6d69d9d9d5656dff3af0064cbaf00df80af8daf086400d69dd69d569d00 0800d69dd69d569d56dff3af0064cadf80af8daf086400d6d69d9d9d5600 0800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69d d69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d56 56df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af 80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af 086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6 d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d56 9d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800 d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd69d 569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df 80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80af c9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af0864 00d69dd69d569d000800d69dd69d569d56df80648064c8640700d6d69d9d 9d56000700d6d69d9d9d565680008000c60006d69dd69d569d000600d69d d69d569d80d680d6c3d6fd9d0156007f00d6d69d9d9dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d7fd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69d48d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69d569d000300d69dd6e59d0156d6809d80 9df99d0156d6e39d0156000200d6d6e59d035656d6d6809d809dfa9d0256 d6d6e59d02569d007f00d69d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d56d6d69d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d567f9d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d56489d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d5656d6d6569d569d569d569d569d569d569d569d569d569d 569d569d569d569d56000100d6e25601d6d680568056f95601d6d6e356ff 0080008000b700 grestore showpage %%Trailer geomview-1.9.5/doc/figs/cam.ps0000644000175000017500000022070212310110173013062 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: noname.ps %%Pages: 1 %%BoundingBox: 255 237 356 525 %%EndComments /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 210 string def %%EndProlog %%Page: 1 1 gsave 255.6 237.24 translate 100.8 287.52 scale 210 599 8 [ 210 0 0 -599 0 599 ] { picstr readstring } image 8000ae000000e3d6019d5680d6f0d6019d56e2d6019d007f00d6d69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69d51d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6d69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d56000300d69dd6 e59d0256d6d6809df19d0256d6d6e59d02569d000200d6d6e49d0156d680 9df09d0156d6e39d0156007f00d69dd69d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d56519d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569dd69d569d007f00d6d69d9d9d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d51569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569dd69d9d9d56000600d69dd69d569d8000bc0006d69d d69d569d000700d6d69d9d9d560080d6bed60700d6d69d9d9d56007f00d6 9dd69d569d00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd6519dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9dd6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd600d69dd69d569d0008 00d6d69d9d9d5600d6ea9d0156d6899d0256d6d6ea9d0156d6ea9d085600 d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6d68b9d025656d6 e99d0556d6d69d9d9df200fc9d085600d69dd69d569d000800d6d69d9d9d 5600d6eb9d025656d6ee9dfc009f9d0256d6d6eb9d025656d6fc9d0000f4 9d0d009d9d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d02 56d6d6f19dfd00039d9d0000a19d025656d6e99d0656d6d69d9d9d00f49d 0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656 d6f19d010000fc9d010000a09d0256d6d6eb9d025656d6fc9d0000f49d0d 00009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6 d6f39d010000f69dfc00fd9d0800009d00009d000000fc9dfc00fd9d0600 009d00009d9dfc00fc9dfc00d29d025656d6e99d0656d6d69d9d9d00f49d 0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656 d6f29d010000f79d1b00009d9d00009d9d0000009d0000009d00009d9d00 009d9d00009d9dfb000e9d00009d9d00009d9d00009d9d0000d29d0256d6 d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00 d69dd69d569d00d6d69d9df000fd9d0256d6d6f49d010000f29d1900009d 9d00009d9d00009d9d00009d00009d9d9d00009d9d0000f89d0500009d9d 0000cf9d025656d6f89dfc00f59d0656d6d69d9d9d00f49d0d00009d9d9d 5600d69dd69d569d000c00d6d69d9d9d5600d69d9d9d00f29d05009d9d56 56d6f39d010000f69dfb000d9d9d00009d9d00009d9d00009d9dfa00039d 9d0000fb9dfb00fc9dfd00d09d0256d6d6f99d04009d9d0000f79d025656 d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000c00d69dd69d569d 00d6d69d9d00f29d0600009d9d56d6d6f49d010000f79d1400009d9d0000 9d9d00009d9d00009d9d00009d0000f99d010000fc9d0500009d9d0000fa 9d010000d29d025656d6f89d04009d9d0000f69d0656d6d69d9d9d00f49d 0d00009d9d9d5600d69dd69d569d000b00d6d69d9d9d5600d69d9d9def00 039d5656d6f39d010000fb9d1800009d00009d9d9d00009d9d00009d9d00 009d9d00009d0000f99d1300009d9d9d00009d9d9d00009d00009d9d9d00 00d19d0256d6d6f99dfb00f79d025656d6fc9d0000f49d0d00009d9d5656 00d6d69d9d9d56000900d69dd69d569d00d6d6fc9df100049d9d56d6d6f3 9d2600009d9d0000009d9d00009d9d00009d9d00009d9d00009d9d00009d 9d00009d9d00009d9d0000fc9d0d00009d9d00009d9d00009d9d0000d19d 025656d6f79dfc00f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69d d69d569d000800d6d69d9d9d5600d6eb9d025656d6f19dfc00fb9dfd0010 9d00009d00009d9d00009d9d00009d9d9dfc00fd9d010000fb9dfd00049d 00009d9dfc00cf9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d56 5600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6d68b9d0256 56d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d0008 00d6d69d9d9d5600d6eb9d025656d6899d0256d6d6eb9d025656d6fc9d00 00f49d0d00009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb 9d0256d6d68b9d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d56 00d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6899d0256d6d6 eb9d025656d6fc9df1000b9d9d565600d6d69d9d9d56000900d69dd69d56 9d00d6d6eb9d0256d6d68b9d025656d6e99d0256d6d6fb9df300fd9d0856 00d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6899d0256d6d6 eb9d025656d6eb9d09565600d6d69d9d9d56007f00d69dd69d569d00d69d 9d569d569d569d569d569d569d569d569d569d569d56d6569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d56519d 569d569d569d569d569d569d569d569d569d569d569d5656d69d569d569d 569d569d569d569d569d569d569d569d569d56d6569d569d569d569d569d 569d569d569d569d569d569d5600d69dd69d569d0008009d569d9d9d5600 9de956009d8856009de856009de9560700d6d69d569d56000000fb56009d 8000bc0001d69dfc56ff000000fcd6029d565680dfbedf0000fad6ff0007 00d6d6d69d569d5680dfbfdf036400d69dfcd6ff000900d6d69d9d9d5656 dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af c2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69d d69d569d000900d6d69d9d9d5656dfdf80aff4afd2dffcaf09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80aff4afd3df0064fcaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdf80aff4af01dfdfd6af016464 fcaf09646400d6d69d9d9d56000900d69dd69d569d56dfdf80aff4af01df dfd6af016464fcaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf 80aff4af01dfdfd6af016464fcaf09646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80aff4af01dfdfd6af016464fcaf09646400d69dd69d569d 000900d6d69d9d9d5656dfdf80aff4af01dfdfd6af016464fcaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80aff4af01dfdfd6af016464 fcaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf80aff4af01df dffbaffb00e0af016464fcaf09646400d6d69d9d9d56000900d69dd69d56 9d56dfdf80aff4af01dfdffbaf0000fcaf010000e2af016464fcaf096464 00d69dd69d569d000900d6d69d9d9d5656dfdfbbaffd00bcaf01dfdffbaf 0000fbaf0000e2af016464fcaf09646400d6d69d9d9d56000900d69dd69d 569d56dfdfbdaf060000afafaf0000beaf01dfdffbaf0000faaf0300afaf affc00fdaf0400af000000fcaffc00faaf016464fcaf09646400d69dd69d 569d000900d6d69d9d9d5656dfdfbdaf0000fbaf0000beaf01dfdffbaf00 00faaf1800afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000fb af016464fcaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfbeaf 0000f6affc00fdaf0700af0000afaf0000fcaffc00fdaf0500af0000afaf fc00e5af01dfdffbaf0000faaf0300afaf00fcaf0300afaf00fcaf0300af af00fcaf0000fbaf016464fcaf09646400d69dd69d569d000900d6d69d9d 9d5656dfdfbeaf0000f7af250000afaf0000afaf0000afaf0000afaf00af af0000afaf0000afaf0000afafaf0000afaf0000e6af01dfdffbaf0000fa af0300afaf00fcaf0300afaf00fcaf0200afaffa00fbaf016464fcaf0964 6400d6d69d9d9d56000900d69dd69d569d56dfdfbeaf0000f2af0e00afaf 00afafaf00afafaf00afaf00fcaf0300afaf00f7af0000e6af01dfdffbaf 0000faaf0300afaf00fcaf0300afaf00fcaf0300afaf00f6af016464fcaf 09646400d69dd69d569d000900d6d69d9d9d5656dfdfbeaf0000f6affb00 0cafaf00afafaf00afafaf00afaffa0002afaf00fbaffb00e6af01dfdffb af0000fbaf0400afafaf00fcaf0300afaf00fcaf0300afaf00f6af016464 fcaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfbeaf0000f7af 130000afafaf00afaf00afafaf00afafaf00afaf00f9af0000fcaf050000 afafaf00e6af01dfdffbaf0000fcaf0d0000afafaf0000afaf0000afaf00 fcaf0800afaf0000afaf0000fbaf016464fcaf09646400d69dd69d569d00 0900d6d69d9d9d5656dfdfbdaf0000fbaf0300afaf00fcaf0e00afaf00af afaf00afafaf00afaf00f9af0000fcaf0000fcaf0000e6af01dfdffbaffb 00faaffc00fdaf0000fcaf0300afafaffc00faaf016464fcaf09646400d6 d69d9d9d56000900d69dd69d569d56dfdfbdaf240000afafaf0000afaf00 00afaf0000afaf00afafaf00afafaf00afaf0000afaf0000afaf00fcaf05 0000afaf0000e6af01dfdfd6af016464fcaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfbbaffd00fbaffd000faf0000af00afafaf00afaf af00afafaffc00fdaf0000fbaffd0002af0000e7af01dfdfd6af016464fc af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80aff4af01dfdf d6af016464fcaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf80 aff4af01dfdfd6af016464fcaf09646400d6d69d9d9d56000900d69dd69d 569d56dfdf80aff4af01dfdfd6af016464fcaf09646400d69dd69d569d00 0900d6d69d9d9d5656dfdf80aff4af01dfdfd6af016464fcaf09646400d6 d69d9d9d56000900d69dd69d569d56dfdf80aff4af01dfdfd6af016464fc af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80aff4af01dfdf d464fcaf09646400d6d69d9d9d56000900d69dd69d569d56dfdf80aff4af 00dfd364fcaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf80af c2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d 000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000b00d6 9dd69d569d56dfdfafaf80dfcadffaaf09646400d69dd69d569d000b00d6 d69d9d9d5656dfdfafaf80dfcbdf0064faaf09646400d6d69d9d9d56000d 00d69dd69d569d56dfdfafafdfdf80afceaf016464faaf09646400d69dd6 9d569d000d00d6d69d9d9d5656dfdfafafdfdf80afceaf016464faaf0964 6400d6d69d9d9d56000d00d69dd69d569d56dfdfafafdfdf80afceaf0164 64faaf09646400d69dd69d569d000d00d6d69d9d9d5656dfdfafafdfdf80 afceaf016464faaf09646400d6d69d9d9d56000d00d69dd69d569d56dfdf afafdfdf80afceaf016464faaf09646400d69dd69d569d000d00d6d69d9d 9d5656dfdfafafdfdf80afceaf016464faaf09646400d6d69d9d9d56000d 00d69dd69d569d56dfdfafafdfdfeeaffa00eeaf0000d1af0000f7affd00 f4af0000edaffd00fcaffd00fcaffa0004afaf000000eeaf016464faaf09 646400d69dd69d569d000d00d6d69d9d9d5656dfdfafafdfdfeeaf0000fc af010000efaf0000d1af0000f9af060000afafaf0000f6af0000edaf0000 fcaf090000afafaf0000afaf00fcaf050000afafaf00eeaf016464faaf09 646400d6d69d9d9d56000d00d69dd69d569d56dfdfafafdfdfeeaf0000fb af0000efaf0000d1af0000f9af0000fbaf0000f6af0000edaf0000fcaf00 00fbaf0300afaf00fbaf0400afafaf00eeaf016464faaf09646400d69dd6 9d569d000d00d6d69d9d9d5656dfdfafafdfdfeeaf0000fbaf0300afafaf fc00fcaffc0016afaf00afafaf00afafaf000000af00afaf00af0000afaf fc00fdaf0000fcaf0600af00af000000fcaffd0001af00faaf0000f6affc 00fdaf0300afafaffc00fdaf0300af0000fbaf0400afafaf00f7af0000fb af0400afafaf00eeaf016464faaf09646400d6d69d9d9d56000d00d69dd6 9d569d56dfdfafafdfdfeeaf0000fcaf2f00afafaf0000afaf0000afaf00 00afaf0000af00afaf00afafaf0000afaf0000afaf0000afafaf0000afaf 0000afaf00fcaf0f00af0000afaf0000afaf0000afaf0000faaf0000f7af 140000afaf0000afaf00afaf0000afaf0000afaf0000f9af0400afafaf00 f7af0000fcaf0000fcaf0000eeaf016464faaf09646400d69dd69d569d00 0d00d6d69d9d9d5656dfdfafafdfdfeeaffb00f7af0300afaf00faaf0200 af00fcaf0000fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf0200af00 fcaf0300afaf00fcaf0000faaf0000f7af0000fcaf0600afaf00afaf00fc af0300afaf00f8af0400afafaf00f7affb00fbaf0000eeaf016464faaf09 646400d6d69d9d9d56000d00d69dd69d569d56dfdfafafdfdfeeaf0000fc af0000fcaffb0002afaf00faaf010000fbaf0000fcaf0300afaf00fcaf00 00fcaf0300afaf00fcaf0200af00fcaf0300afaf00fcaf0000faaf0000f7 af0000fcaf0600afaf00afaf00fcaf0300afaf00f8af0400afafaf00f7af 0000fcaf0000fcaf0000eeaf016464faaf09646400d69dd69d569d000d00 d6d69d9d9d5656dfdfafafdfdfeeaf0000fbaf0b00afaf0000afafaf00af af00faaf0200af00fcaf0000fcaf0300afaf00fcaf0000fcaf0300afaf00 fcaf0200af00fcaf0300afaf00fcaf0000faaf0000f7af0000fcaf0600af af00afaf00fcaf0300afaf00f8af0400afafaf00f7af0000fbaf0400afaf af00eeaf016464faaf09646400d6d69d9d9d56000d00d69dd69d569d56df dfafafdfdfeeaf0000fbaf0300afaf00fcaf0300afaf00fcaf0900af00af af00afafaf00fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf0200af00 fcaf0300afaf00fcaf0000f9af0000fbaf0300afaf00fcaf0600afaf00af af00fcaf0300afaf00f8af0000fcaf0000fbaf0300afaf00fbaf0400afaf af00eeaf016464faaf09646400d69dd69d569d000d00d6d69d9d9d5656df dfafafdfdfeeaf0000fcaf220000afaf0000afaf0000afaf0000afaf0000 af00afafaf00afaf0000afaf0000afaf00fcaf0f0000afaf0000afaf0000 afaf0000af00fcaf0800afaf0000afaf0000f9af1c0000afafaf0000afaf 0000afaf0000afaf00afaf0000afaf0000afaf00f8af0000fcaf090000af afaf0000afaf00fcaf050000afafaf00eeaf016464faaf09646400d6d69d 9d9d56000d00d69dd69d569d56dfdfafafdfdfeeaffa00fcaffd0004af00 00afaffc0002afaf00fcaf0a00afaf000000af00afaf00fbaffc00fcaffd 0003af00af00fcaf0800afafaf000000af00f7affd00fbaffc00fdaf0300 afafaffc00fdaf0000f8af0000faaffd00fcaffa00fcaf0000eeaf016464 faaf09646400d69dd69d569d000d00d6d69d9d9d5656dfdfafafdfdfcaaf 0000b0af0000e9af0000eeaf016464faaf09646400d6d69d9d9d56000d00 d69dd69d569d56dfdfafafdfdfcfaf050000afaf0000b0af0000e9af0000 eeaf016464faaf09646400d69dd69d569d000d00d6d69d9d9d5656dfdfaf afdfdfceaffc00afaffd00edaffd00eeaf016464faaf09646400d6d69d9d 9d56000d00d69dd69d569d56dfdfafafdfdf80afceaf016464faaf096464 00d69dd69d569d000d00d6d69d9d9d5656dfdfafafdfdf80afceaf016464 faaf09646400d6d69d9d9d56000d00d69dd69d569d56dfdfafafdfdf80af ceaf016464faaf09646400d69dd69d569d000d00d6d69d9d9d5656dfdfaf afdfdf80afceaf016464faaf09646400d6d69d9d9d56000d00d69dd69d56 9d56dfdfafafdfdf8064cc64faaf09646400d69dd69d569d000c00d6d69d 9d9d5656dfdfafafdf8064cb64faaf09646400d6d69d9d9d56000900d69d d69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80 afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d 56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900 d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d 569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656df df80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2 af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af096464 00d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d 56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80 afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09 646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6 d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d56 9d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900 d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d 9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56df df80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2 af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af096464 00d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d 9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69d d69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80 afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d 56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900 d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d 569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656df df80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2 af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af096464 00d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdffbaff3df80afd4af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdffbaff4df0064f9affd00f2affd00f8affd00fc af0000eeaf0000edaffa00f5af050000afaf0000f2af0000cbaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af 0000eeaf0000faaf090000afafaf0000afaf00eeaf0000edaf0000fcaf01 0000f7af0400afafaf00f0af0000cbaf09646400d69dd69d569d000900d6 d69d9d9d5656dfdffbaf01dfdff7af016464f9af0000eeaf0000faaf0000 fbaf0000ebaf0000edaf0000fbaf0000f7af0400afafaf00baaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af 0300afaf00fbaf0500afaf000000fcaf0000faaf0000f8af0700afaf00af 000000fcaffd0007af00afaf00afafaffc00f4af0000fbaf0300afaf00fc affc0006af000000afafaffc00fdaf0c00af0000af00afaf00af000000fc affd0001af00dbaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf fbaf01dfdff7af016464f9af0300afaf00fbaf0a00af00afafaf00afafaf 00f9af010000faaf1b00afaf0000afaf0000afaf0000afaf0000afaf00af af0000afaf0000f5af0000fcaf0400afafaf00fcaf2700af00afafaf00af afaf0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf0000afaf 0000dbaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf01df dff7af016464f9af0c00afafaf00afafaf00afaf0000faaf0000f7af0100 00fcaf0300afaf00fcaf0300afaf00fcaf0600afaf00afaf00fcaf0000f5 affb00fcaf0000fcaf0a00af00afafaf00afafaf00fcaf0300afaf00fcaf 0300afaf00fcaf0300afaf00fcaf0000dbaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdffbaf01dfdff7af016464f9af0e00afafaf00afaf af00afafaf000000fcaf0000f5af070000afaf00afaf00fcaf0300afaf00 fcaf0500afaf00afaffa0001afaff90002afaf00fcaf0400afafaf00fcaf 0900af00afafaf00afafaffa0002afaf00fcaf0300afaf00fcaf0300afaf 00fcaf0000dbaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffb af01dfdff7af016464f9af0800afafaf00afafaf00fbaf050000afafaf00 f4af0600afaf00afaf00fcaf0300afaf00fcaf0600afaf00afaf00f0af00 00fbaf0300afaf00fcaf0a00af00afafaf00afafaf00f9af0000fcaf0300 afaf00fcaf0300afaf00fcaf0000dbaf09646400d69dd69d569d000900d6 d69d9d9d5656dfdffbaf01dfdff7af016464f9af0000fcaf0200af00f9af 0400afafaf00faaf0000fbaf0600afaf00afaf00fcaf0300afaf00fcaf06 00afaf00afaf00f0af0000fbaf0300afaf00fcaf0a00af00afafaf00afaf af00f9af0000fcaf0300afaf00fcaf0300afaf00fcaf0000dbaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af 0000fcaf0e00af00afafaf00afafaf00afafaf00faaf0c0000afafaf0000 afaf00afaf00fcaf1300afaf0000afaf0000afaf00afaf0000afaf0000f5 af0000fcaf1b0000afaf0000afaf0000af00afafaf00afafaf0000afaf00 00afaf00fcaf0300afaf00fcaf0800afaf0000afaf0000dbaf09646400d6 9dd69d569d000900d6d69d9d9d5656dfdffbaf01dfdff564f9af0000fbaf 0000fbaffd00fcaf0000f8affd00fcaf0300afaf00fcaf0e00afafaf0000 00af00afaf00afafaffc00f4affa00fcaffd0007af00af00afafaf00fcaf fc00fdaf0000fcaf0300afaf00fcaf0800afafaf000000af00dbaf096464 00d6d69d9d9d56000900d69dd69d569d56dfdffbaf00dff464f9af0000ee af0000e1af0000b5af0000dbaf09646400d69dd69d569d000900d6d69d9d 9d5656dfdfe7af0000eeaf0000e6af050000afaf0000baaf050000afaf00 00dbaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfe7affd00f2 affd00e5affc00b8affc00daaf09646400d69dd69d569d000900d6d69d9d 9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56df df80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2 af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af096464 00d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d 9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69d d69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d56 56dfdffbaff3df80afd4af09646400d6d69d9d9d56000900d69dd69d569d 56dfdffbaff4df0064f9affd00f1affd00f8affd00f3af010000d6affd00 fcaf0000ecaf0300afaf00d4af09646400d69dd69d569d000900d6d69d9d 9d5656dfdffbaf01dfdff7af016464f9af0000edaf0000faaf060000afaf af0000f6af0400afafaf00daaf090000afafaf0000afaf00ecaf0300afaf 00d4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdf f7af016464f9af0000edaf0000faaf0000fbaf0000f6af0400afafaf00da af0000fbaf0300afaf00ecaf0000d1af09646400d69dd69d569d000900d6 d69d9d9d5656dfdffbaf01dfdff7af016464f9af0300afaf00fbaf0000f6 af0000faaf0000f7affc0015afaf000000af000000af00afafaf00afafaf 00afafaffc00fdaf0500af0000afaffc00f9af0000f8af0400af000000fc affc00fcaffd000baf00afaf00afaf00af000000fcaffd0001af00e4af09 646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af0164 64f9af0300afaf00fbaf0000f6af0000f9af010000faaf2c0000afaf0000 afaf00afafaf00afaf00afafaf00afafaf00afaf0000afaf0000afaf0000 afafaf0000afaf0000f9af010000faaf280000afaf0000afaf0000afaf00 00afaf0000afaf0000afaf00afaf0000afaf0000afaf0000afaf0000e4af 09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01dfdff7af01 6464f9af1400afafaf00afafaf00afafaf0000afaf00afafaf00f7af0100 00fcaf0000fcaf1200afaf00afafaf00afaf00afafaf00afafaf00f9af03 00afaf00fcaf0000fcaf0000f7af010000fcaf0000fcaf0000f9af0300af af00fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000e4af09646400d6 d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af14 00afafaf00afafaf00afaf00af0000af00afafaf00f5af040000afaf00fc af1100afaf00afafaf00afafaf00afaf00afaf00fcaffb0002afaf00fcaf fa00f5af040000afaf00fcaf0300afafaffb0002afaf00fcaf0600afaf00 afaf00fcaf0300afaf00fcaf0000e4af09646400d69dd69d569d000900d6 d69d9d9d5656dfdffbaf01dfdff7af016464f9af0f00afafaf00afafaf00 afaf00afaf0000fcaf0000f4af0300afaf00fcaf1d00afaf00afafaf00af afaf00afaf00afaf00afafaf0000afafaf00afaf00fcaf0000efaf0300af af00fcaf0b00afaf0000afafaf00afaf00fcaf0600afaf00afaf00fcaf03 00afaf00fcaf0000e4af09646400d6d69d9d9d56000900d69dd69d569d56 dfdffbaf01dfdff7af016464f9af0000fcaf0200af00f4af0000faaf0000 fbaf0300afaf00fcaf1500afaf00afafaf00afafaf00af00af00af00afaf af00fcaf0300afaf00fcaf0000f5af0000fbaf0300afaf00fcaf0300afaf 00fcaf0300afaf00fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000e4 af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01dfdff7af 016464f9af0000fcaf0200af00f4af0000faaf150000afafaf0000afaf00 00afaf0000afaf00afafaf00fcaf0400afafaf00fcaf080000afaf0000af af00fcaf050000afaf0000faaf090000afafaf0000afaf00fcaf1600afaf 0000afaf0000afaf0000afaf0000afaf00afaf00fcaf0800afaf0000afaf 0000e4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf01df dff564f9af0000fbaf0000f3af0000f8affd00fbaffc00fdaf0000fcaf08 0000afaf00afafaf00fbaffd0004af0000af00fbaffc00f7affd00fcaf00 00fcaf1600afafaf000000af0000afaf000000af00afaf00afaf00fcaf08 00afafaf000000af00e4af09646400d69dd69d569d000900d6d69d9d9d56 56dfdffbaf00dff464f9af0000edaf00008daf0000e4af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfe7af0000edaf000092af050000afaf 0000e4af09646400d69dd69d569d000900d6d69d9d9d5656dfdfe7affd00 f1affd0091affc00e3af09646400d6d69d9d9d56000900d69dd69d569d56 dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80af c2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d 000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d 5656dfdffbaff36480afd4af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdffbaff46400dff9affd00f8affb00fcaffd00fbaff700e4affd00 efaffb00fbaf0000faaf0000ecaf0000d7af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdffbaf016464f7e201dfdff9af0000f6af0000fcaf 010000fcaf0000f7af0000e2af060000afafaf0000f1af0000fcaf0c0000 afafaf00afaf00afafaf00ecaf0000d7af09646400d6d69d9d9d56000900 d69dd69d569d56dfdffbaf016464f7e201dfdff9af0000f6af0000fbaf00 00fcaf0000f7af0000e2af0000fbaf0000f1af0000fbaf0000faaf0400af afaf00c2af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01 6464f7e201dfdff9af0300afaf00fbaf0200af00faaf0400afafaf00f7af 0000fbaf0000fcaf0b00af00af0000af00af000000f9af0000f9af0700af af00af000000f9af0000faaf0e00afaf00af000000afaf00af000000fcaf fc00fdaf0c00af0000af00afaf00af000000fcaffd0001af00e7af096464 00d6d69d9d9d56000900d69dd69d569d56dfdffbaf016464f7e201dfdff9 af0300afaf00fbaf0200af00faaf0400afafaf00f7af0000fbaf0000fcaf 0c00af0000afafaf0000afaf0000faaf0000f9af0800afaf0000afaf0000 faaf0000faaf2f00afaf00afaf00afafaf0000afaf0000afaf0000afaf00 00afaf0000afafaf00afaf0000afaf0000afaf0000afaf0000e7af096464 00d69dd69d569d000900d6d69d9d9d5656dfdffbaf016464f7e201dfdff9 af0b00afafaf00afafaf00afaf00faaf0400afafaf00f7af0000fbaf0000 fcaf0200af00fcaf0000fcaf0000faaf0000f9af0300afaf00fcaf0000fa af0000faaf0a00afaf00afaf00afafaf00fcaf0300afaf00fcaf0300afaf 00fcaf0300afaf00fcaf0300afaf00fcaf0000e7af09646400d6d69d9d9d 56000900d69dd69d569d56dfdffbaf016464f7e201dfdff9af0b00afafaf 00afafaf00afaf00faaf0400afafaf00f7af0000fbaf0000fcaf0200af00 fcaf0000fcaf0000faaf0000f9af0300afaf00fcaf0000faaf0000faaf0a 00afaf00afaf00afafaf00fcaf0200afaffa0002afaf00fcaf0300afaf00 fcaf0300afaf00fcaf0000e7af09646400d69dd69d569d000900d6d69d9d 9d5656dfdffbaf016464f7e201dfdff9af0b00afafaf00afafaf00afaf00 faaf0400afafaf00f7af0000fbaf0000fcaf0200af00fcaf0000fcaf0000 faaf0000f9af0300afaf00fcaf0000faaf0000faaf0a00afaf00afaf00af afaf00fcaf0300afaf00f9af0000fcaf0300afaf00fcaf0300afaf00fcaf 0000e7af09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf0164 64f7e201dfdff9af0000fcaf0600af00afafaf00fbaf0000fcaf0000f7af 0000fbaf0000fcaf0200af00fcaf0000fcaf0000f9af0000fbaf0400afaf af00fcaf0000faaf0000fbaf0b00afafaf00afaf00afafaf00fcaf0300af af00f9af0000fcaf0300afaf00fcaf0300afaf00fcaf0000e7af09646400 d69dd69d569d000900d6d69d9d9d5656dfdffbaf016464f7e201dfdff9af 0000fcaf0600af00afafaf00fcaf010000fcaf0000f7af0000fbaf070000 afaf0000af00fcaf0000fcaf0000f9af0a0000afafaf0000afafaf00fcaf 0000faaf0000fcaf0c0000afafaf00afaf00afafaf00fcaf0b00afaf0000 afaf0000afaf00fcaf0300afaf00fcaf0800afaf0000afaf0000e7af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdffbaf016464f5dff9af00 00fbaf0000fcaffb00faaf0000f7af0000faaffd0003af00af00fcaf0000 fcaf0000f7affd00fbaf0000fcaf0000faaffb00fbaf0700afafaf0000af 00fcaf0300afafaffc00fdaf0000fcaf0300afaf00fcaf0800afafaf0000 00af00e7af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf00 64f4dff9af0000ebaf00008caf0000e7af09646400d6d69d9d9d56000900 d69dd69d569d56dfdfe7af0000ebaf000091af050000afaf0000e7af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdfe7affd00efaffd0090af fc00e6af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af 09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d 569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d560009 00d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d 9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56 dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf f3df80afd4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf f4df0064f9affd00f3af0400af000000faaffb00ddaffd00f7af0000e5af fd00c9af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01df dff7af016464f9af0000f1af0400afafaf00faaf0000fcaf010000e1af0e 0000afafaf0000afafaf00afafaf00e7af060000afafaf0000cbaf096464 00d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9 af0000f1af0400afafaf00faaf0000fbaf0000e1af0000fbaf0800afafaf 00afafaf00e7af0000fbaf0000cbaf09646400d69dd69d569d000900d6d6 9d9d9d5656dfdffbaf01dfdff7af016464f9af0300afaf00fbaf0b00afaf 000000af00afafaf00faaf0000faaf0800afaf00af0000afaffc000aafaf 00afafaf00afafaf00faaf0000f9af0b00af000000afaf00af000000fcaf fc00fdaf0300af0000fbaf0000f6affc00fdaf0700af0000afaf0000fcaf fc00fdaf0500af0000afaffc00fcaffd00f9af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdffbaf01dfdff7af016464f9af0300afaf00fbaf 0b00af0000afaf0000afafaf00faaf0000faaf1700afaf0000afafaf0000 afaf0000af00afafaf00afafaf00faaf0000f9af1800afaf00afafaf0000 afaf0000afaf0000afaf0000afaf0000f9af0000f7af2c0000afaf0000af af0000afaf0000afaf00afaf0000afaf0000afaf0000afafaf0000afaf00 00afaf00afafaf00faaf09646400d69dd69d569d000900d6d69d9d9d5656 dfdffbaf01dfdff7af016464f9af0b00afafaf00afafaf00afaf00fcaf04 00afafaf00faaf0000faaf0300afaf00f7af0a00af00afafaf00afafaf00 faaf0000f9af0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00f8 af0000f2af0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f7af 0400afaf0000f7af09646400d6d69d9d9d56000900d69dd69d569d56dfdf fbaf01dfdff7af016464f9af0b00afafaf00afafaf00afaf00fcaf0400af afaf00faaf0000faaf0300afaf00fbaffb0008afaf00afaf00afaf00f9af 0000f9af0700afaf00afafaf00fcaf0200afaffa0002afaf00f8af0000f6 affb000cafaf00afafaf00afafaf00afaffa0002afaf00fbaffb00fdaffd 00f9af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01dfdf f7af016464f9af0b00afafaf00afafaf00afaf00fcaf0400afafaf00faaf 0000faaf0300afaf00fcaf0e0000afafaf00afaf00afaf00afaf00f9af00 00f9af0700afaf00afafaf00fcaf0300afaf00f9af0000f8af0000f7af13 0000afafaf00afaf00afafaf00afafaf00afaf00f9af0000fcaf050000af afaf00fbaf010000faaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdffbaf01dfdff7af016464f9af0000fcaf0600af00afafaf00fcaf0400 afafaf00faaf0000fbaf0400afafaf00fcaf0000fcaf0900afaf00af00af 00af00f8af0000fbaf0800afafaf00afafaf00fcaf0300afaf00f9af0000 f7af0000fbaf0300afaf00fcaf0e00afaf00afafaf00afafaf00afaf00f9 af0000fcaf0000fcaf0000faaf0000faaf09646400d69dd69d569d000900 d6d69d9d9d5656dfdffbaf01dfdff7af016464f9af0000fcaf0f00af00af afaf0000afaf0000afafaf00faaf0000fcaf050000afafaf00fcaf0d0000 afaf0000afafaf00afafaf00f7af0e0000afafaf0000afafaf00afafaf00 fcaf0b00afaf0000afaf0000afaf00f7af240000afafaf0000afaf0000af af0000afaf00afafaf00afafaf00afaf0000afaf0000afaf00fcaf0c0000 afaf0000afaf00afafaf00faaf09646400d6d69d9d9d56000900d69dd69d 569d56dfdffbaf01dfdff564f9af0000fbaf0000fbaffd0005af00afafaf 00faaffb00fbaf0000fbaffd0009af0000afaf00afafaf00f5affd00faaf 030000af00fcaf0300afafaffc00fdaf0000f5affd00fbaffd000faf0000 af00afafaf00afafaf00afafaffc00fdaf0000fbaffd0007af0000afaf00 0000f9af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf00df f464f9af0000edaf000080aff0af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdfe7af0000edaf000080aff0af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfe7affd00f1affd0080aff0af09646400d6d69d9d 9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656 dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af c2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69d d69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56 000900d69dd69d569d56dfdffbaff3df80afd4af09646400d69dd69d569d 000900d6d69d9d9d5656dfdffbaff4df0064f9affd00f7af0400af000000 f6affb00e0af0000faaf0000f6af0000f4affd00f4af0000caaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af 0000f5af0400afafaf00f6af0000fcaf010000e2af0000faaf0000f6af03 00afaf00f9af060000afafaf0000f6af0000caaf09646400d69dd69d569d 000900d6d69d9d9d5656dfdffbaf01dfdff7af016464f9af0000f1af0000 f6af0000fbaf0000e2af0000faaf0000f3af0000f9af0000fbaf0000f6af 0000caaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf01df dff7af016464f9af0000fcaffc00fdaf0400afafaf00f6af0000faaf0800 afaf00af0000afaffc000aafaf00afafaf00afafaf00faaf0000faaf0f00 afaf00af000000afafaf00af000000faaf0000f8af0c00af000000afafaf 00af000000fcaffc00fdaf0500af0000afaffc00e3af09646400d69dd69d 569d000900d6d69d9d9d5656dfdffbaf01dfdff7af016464f9af1000afaf af0000afaf0000afaf00afafaf00f6af0000faaf1700afaf0000afafaf00 00afaf0000af00afafaf00afafaf00faaf0000faaf0e00afaf0000afaf00 00afaf00afaf00f8af010000faaf220000afaf0000afaf0000afaf0000af af0000afaf0000afaf0000afafaf0000afaf0000e4af09646400d6d69d9d 9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af0000f8af 0700afaf00afafaf00f6af0000faaf0300afaf00f7af0a00af00afafaf00 afafaf00faaf0000faaf0300afaf00fcaf0600afaf00afaf00f6af010000 fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000fc af0000e4af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01 dfdff7af016464f9af0000fcaffb0006afaf00afafaf00f6af0000faaf03 00afaf00fbaffb0008afaf00afaf00afaf00f9af0000faaf0300afaf00fc af0600afaf00afaf00f4af040000afaf00fcaf0300afaf00fcaf0200afaf fa0002afaf00fcaffa00e4af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdffbaf01dfdff7af016464f9af1000afafaf0000afafaf00afaf00 afafaf00f6af0000faaf0300afaf00fcaf0e0000afafaf00afaf00afaf00 afaf00f9af0000faaf0300afaf00fcaf0600afaf00afaf00f3af0300afaf 00fcaf0300afaf00fcaf0300afaf00f9af0000fcaf0000dfaf09646400d6 9dd69d569d000900d6d69d9d9d5656dfdffbaf01dfdff7af016464f9af04 00afafaf00fcaf0700afaf00afafaf00f6af0000fbaf0400afafaf00fcaf 0000fcaf0900afaf00af00af00af00f9af0000faaf0300afaf00fcaf0600 afaf00afaf00f9af0000fbaf0300afaf00fcaf0300afaf00fcaf0300afaf 00f9af0000fcaf0000dfaf09646400d6d69d9d9d56000900d69dd69d569d 56dfdffbaf01dfdff7af016464f9af1000afafaf0000afaf0000afaf00af afaf00f6af0000fcaf050000afafaf00fcaf0d0000afaf0000afafaf00af afaf00f7af0000fcaf0400afafaf00fcaf0600afaf00afaf00f9af110000 afafaf0000afaf0000afaf0000afaf00fcaf0b00afaf0000afaf0000afaf 00fcaf050000afaf0000e4af09646400d69dd69d569d000900d6d69d9d9d 5656dfdffbaf01dfdff564f9af0000fcaffd0008af0000af00afafaf00f6 affb00fbaf0000fbaffd0009af0000afaf00afafaf00f6affc00fcaf0000 fcaf0800afaf00afafaf0000f9affd00fcaf0800af000000afafaf00fcaf 0300afafaffc00fdaf0000fbaffc00e3af09646400d6d69d9d9d56000900 d69dd69d569d56dfdffbaf00dff464f9af0000f1af0000abaf0000c2af09 646400d69dd69d569d000900d6d69d9d9d5656dfdfe7af0000f1af0000ab af0000c2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfe7affd 00f5affd00abaf0000c2af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80 afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d 56000900d69dd69d569d56dfdfc1affa00f0af0000ebaf0000aeaf096464 00d69dd69d569d000900d6d69d9d9d5656dfdfc1af0000fcaf010000f1af 0000efaf0400afafaf00aeaf09646400d6d69d9d9d56000900d69dd69d56 9d56dfdfc1af0000fbaf0000dfaf0000aaaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfc1af0000fbaf0800afaf00af0000afaffc00fdaf 0300afafaffc00fcaffc0009af000000afaf00afafaffc00fdaf0400af00 0000bdaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfc1af0000 fcaf370000afaf0000afafaf0000afaf0000afaf00afaf0000afaf0000af af0000afaf0000af00afafaf00afaf0000afaf0000afaf0000afaf0000be af09646400d69dd69d569d000900d6d69d9d9d5656dfdfc1affa00fdaf00 00fcaf0000fcaf0600afaf00afaf00fcaf0300afaf00faaf0700afafaf00 afaf00fcaf0300afaf00fcaf0000beaf09646400d6d69d9d9d56000900d6 9dd69d569d56dfdfc1af0000f8af0000fcaf0000fcaf0500afaf00afaffa 0002afaf00faaf0700afafaf00afaf00fcaf0300afaf00fcaf0000beaf09 646400d69dd69d569d000900d6d69d9d9d5656dfdfc1af0000f8af0000fc af0000fcaf0600afaf00afaf00f9af0000faaf0700afafaf00afaf00fcaf 0300afaf00fcaf0000beaf09646400d6d69d9d9d56000900d69dd69d569d 56dfdfc1af0000f8af0000fcaf0000fcaf0600afaf00afaf00f9af0000fc af0900af00afafaf00afaf00fcaf0300afaf00fcaf0000beaf09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfc1af0000f8af0000fcaf290000 afaf0000afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00af af0000afaf0000afaf00fcaf0000beaf09646400d6d69d9d9d56000900d6 9dd69d569d56dfdfc1af0000f8af0000fbaffc00fdaf0300afafaffc00fc affc00fdaf060000af00afafaffc00fdaf0000fcaf0000beaf09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfabaf000098af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfabaf000098af09646400d69dd69d56 9d000900d6d69d9d9d5656dfdfadaf01000097af09646400d6d69d9d9d56 000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6 d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf 80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af 09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf8064e26400df f2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf006480df e4df0164dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdfef af0164df8064e46400dff2af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdfefaf0164df8064e66402df64dff2af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdfefaf0364df646480afe9af03dfdf64dff2af09 646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0364df646480af e9af03dfdf64dff2af09646400d69dd69d569d000900d6d69d9d9d5656df dfefaf0964df6464af000000afaffc00efaffd00f3affd00f2af0000d4af 0000f9af0000dbaf03dfdf64dff2af09646400d6d69d9d9d56000900d69d d69d569d56dfdfefaf0964df6464af00afafaf00fcaf0000eeaf0000f5af 060000afafaf0000f8af0400afafaf00d4af0000f9af0000dbaf03dfdf64 dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0964df 6464af00afafaf00fcaf0000eeaf0000f5af0000fbaf0000f8af0400afaf af00d4af0000d3af03dfdf64dff2af09646400d6d69d9d9d56000900d69d d69d569d56dfdfefaf0964df6464af00afafaf00fcaf0200af00fbaf0600 af00af000000fcaf0000f6af0000f9af0400afaf00affb0006afaf00af00 0000fcaffc00fcaffd0009af00afaf00af0000afaffc00fdaf1300af0000 00afafaf00af000000afafaf00afafaffc00e2af03dfdf64dff2af096464 00d69dd69d569d000900d6d69d9d9d5656dfdfefaf0964df6464af00afaf af00fcaf0200af00fbaf0b00af0000afaf0000afafaf00f6af0000f9af49 00afaf0000afafaf00afafaf0000afaf0000afaf0000afaf0000afaf0000 afaf0000afaf0000afafaf0000afaf0000afaf0000afaf0000afaf0000af af0000afaf00afaf0000afaf0000e3af03dfdf64dff2af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfefaf0964df6464af00afafaf00fcaf 0a00afaf00afafaf00afaf00fcaf0400afafaf00f6af0000f9af0300afaf 00fcaf0400afafaf00fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00 f7af0300afaf00fcaf0300afaf00fcaf0600afaf00afaf00deaf03dfdf64 dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0964df 6464af00afafaf00fcaf0a00afaf00afafaf00afaf00fcaf0400afafaf00 f6af0000f9af0300afaf00fcaf0400afafaf00fcaf0300afaf00fcaf0300 afaf00fcaf0300afaf00fbaffb0002afaf00fcaf0300afaf00fcaf0600af af00afaf00deaf03dfdf64dff2af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdfefaf0964df6464af00afafaf00fcaf0a00afaf00afafaf00 afaf00fcaf0400afafaf00f6af0000f9af0300afaf00fcaf0400afafaf00 fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00fcaf080000afafaf00 afaf00fcaf0300afaf00fcaf0600afaf00afaf00deaf03dfdf64dff2af09 646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0964df6464af00 afafaf00fcaf0a00afafaf00af00afafaf00fcaf0400afafaf00f5af0000 fbaf0400afafaf00fcaf0400afafaf00fcaf0300afaf00fcaf0300afaf00 fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0600af af00afaf00fcaf0000e3af03dfdf64dff2af09646400d6d69d9d9d560009 00d69dd69d569d56dfdfefaf0964df6464af00afafaf00fcaf1300afafaf 00af00afafaf0000afaf0000afafaf00f5af0a0000afafaf0000afafaf00 fcaf0400afafaf00fcaf1300afaf0000afaf0000afaf0000afaf0000afaf 00fcaf100000afaf0000afaf0000afaf0000afaf00fcaf0b00afaf00afaf 0000afaf0000e3af03dfdf64dff2af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfefaf0564df6464af00fcaffc00fbaf0000fcaf0400af00 0000fcaf0000f3affd00fbaf0000fbaf030000af00fcaf0300afafaffc00 fcaffd0004af00afaf00fbaffd000caf0000af00af000000afafaf00fcaf 0600afaf00afafaffc00e2af03dfdf64dff2af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfefaf0564df6464af00eeaf0000f8af0000cdaf 0000f1af0000cbaf03dfdf64dff2af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfefaf0564df6464af00eeaf0000f8af0000d2af050000af af0000f1af0000cbaf03dfdf64dff2af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdfefaf0764df6464af000000f0af0000faaffd00d1affc 00f0af0000cbaf03dfdf64dff2af09646400d69dd69d569d000900d6d69d 9d9d5656dfdfefaf0364df64648000e90003dfdf64dff2af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdfefaf0364df64648000e90003dfdf 64dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0764 df646400afafaffc0000afee00fdaff600faafce0000afca0003dfdf64df f2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0564df64 6400affc00fdafec0000aff60000affc0001afafd30004af000000afca00 03dfdf64dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdfef af0564df646400affa0000afec0000aff60000affb0000afd30000afc600 03dfdf64dff2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfef af0564df646400affa0004af000000affb0006af00af00afafaffc0000af f60000affb0003af000000fcaffd0010af00afaf0000afafaf000000af00 afafaffc00fcaffc00fcaf0800afafaf0000af00affb0002af0000fcafd8 0003dfdf64dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf efaf0564df646400affa0004af000000affb000baf00afaf0000afaf0000 00aff60000affc0035afaf0000afaf0000afaf0000afaf000000af000000 af0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00af000000 af00affb0007af00afaf0000afafd90003dfdf64dff2af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfefaf0564df646400affa0000affc00 07af000000af0000affc0004af000000aff600faaffd0000affc0003af00 00affc0001afaffb0000affc0003af0000affc0003af0000affa000eaf00 0000af0000af000000af0000affc0000afd90003dfdf64dff2af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfefaf0564df646400affa0000 affc0007af000000af0000affc0004af000000aff60000aff800faaf0200 00affb00fdaffd0000affc0002af0000faaf020000affa000daf000000af 0000af000000af0000faafd90003dfdf64dff2af09646400d6d69d9d9d56 000900d69dd69d569d56dfdfefaf0564df646400affa0000affc0007af00 0000af0000affc0004af000000aff60000aff80000aff90000aff90004af af0000affc0003af0000aff90000affa000eaf000000af0000af000000af 0000afd40003dfdf64dff2af09646400d69dd69d569d000900d6d69d9d9d 5656dfdfefaf0564df646400affa0000affb0006af00af000000affc0004 af000000aff60000aff80000aff90000aff80003af0000affc0003af0000 aff90000affc0010af00af000000af000000af00af000000afd40003dfdf 64dff2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0564 df646400affa0000affb000faf00af000000afaf0000afaf000000aff600 00aff80008afaf0000afaf0000affc0031af000000af0000afaf0000afaf 0000afaf0000afaf0000afaf0000afaf00af000000af000000af00af0000 00afaf0000afafd90003dfdf64dff2af09646400d69dd69d569d000900d6 d69d9d9d5656dfdfefaf0564df646400affa0000affa0000affc0004af00 afafaffc0000aff60000aff700fcaffd0000affb00fdaffd0004af00afaf affc00fcaffc00fcaffd0003afaf00affc0000affb00fcafd80003dfdf64 dff2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0564df 646400afee0000aff80000afd90000afaf0003dfdf64dff2af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfefaf0564df646400afee0000af f80000afd90000afaf0003dfdf64dff2af09646400d6d69d9d9d56000900 d69dd69d569d56dfdfefaf0764df646400afafaff00000affa00fdafd900 00afaf0003dfdf64dff2af09646400d69dd69d569d000900d6d69d9d9d56 56dfdfefaf0364df646480dfe7df0164dff2af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfefaf0264df6480dfe6df0164dff2af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfefaf8064e26400dff2af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdfefaf80dfe1dff2af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d 000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d 5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf 80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af 09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400 d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d 9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656 dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af c2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69d d69d569d000900d6d69d9d9d5656dfdf8cafc264f4af09646400d6d69d9d 9d56000900d69dd69d569d56dfdf8cafc36400dff4af09646400d69dd69d 569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af 09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01 dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf0164 64c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf 8caf016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6 d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d56 000900d69dd69d569d56dfdfe0af010000fbaf0000deaf0300afaf00f2af fd00f1affd00fdaf016464f9affc00f7af0000dbaf01dfdff4af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfe0af0200af00fcaf0000deaf 0300afaf00f2af0000edaf0500afafaf6464faaf0000fcaf0000faaffd00 dbaf01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdfe0 af0200af00fcaf0000deaf0000efaf0000edaf0500afafaf6464faaf0000 fcaf0000f8af0000dbaf01dfdff4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfe0af0a00afaf00afafaf00afafaffc00fcaffc00fdaf03 00af0000faaffc000cafaf00afaf00afaf00af000000f9af0300afaf00fb af0600af00af000000fcaf0500afafaf6464faaf0000fcaf0000f8af0000 dbaf01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdfe0 af1b00afaf00afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000 f9af120000afaf0000af00afaf00afaf0000afaf0000faaf0300afaf00fb af1000af0000afaf0000afafaf00afafaf6464faaf0000fcaf0000f8af00 00dbaf01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf e0af0a00afafaf00afaf00afaf00fcaf0000f9af0300afaf00f8af0000fa af0600afaf00afaf00fcaf0000faaf0b00afafaf00afafaf00afaf00fcaf 0900afafaf00afafaf6464faaf0000fcaf0000f8af0000dbaf01dfdff4af 09646400d6d69d9d9d56000900d69dd69d569d56dfdfe0af0900afafaf00 afaf00afaffa00fdaffb0002afaf00f8af0000faaf0600afaf00afaf00fc af0000faaf0b00afafaf00afafaf00afaf00fcaf0900afafaf00afafaf64 64faaf0000fcaf0000f8af0000dbaf01dfdff4af09646400d69dd69d569d 000900d6d69d9d9d5656dfdfe0af0000fcaf0500af00afaf00f9af080000 afafaf00afaf00f8af0000faaf0600afaf00afaf00fcaf0000faaf0b00af afaf00afafaf00afaf00fcaf0900afafaf00afafaf6464faaf0000fcaf00 00f8af0000dbaf01dfdff4af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdfe0af0000fcaf0500af00afaf00f9af0000fcaf0300afaf00f8af 0000fcaf0800af00afaf00afaf00fcaf0000faaf0000fcaf0600af00afaf af00fcaf0900afafaf00afafaf6464faaf0000fcaf0000f8af0000dbaf01 dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdfe0af0000 fbaf140000afaf0000afaf0000afaf0000afaf0000afaf00f8af120000af af0000af00afaf00afaf0000afaf0000faaf0000fcaf0600af00afafaf00 fcaf0900afafaf00afafaf6464faaf0000fcaf0300afaf00fbaf0000dbaf 01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdfe0af00 00fbaf040000afafaffc00fcaffd0004af0000af00f7affc000cafaf00af af00afaf00af000000f9af0000fbaf0000fcaf0000fcaf0900afafaf00af afaf6464f9affc00fdaf0000fbaf0000dbaf01dfdff4af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdfb0af0000f5af0000edaf0500afafaf 6464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56df dfb0af0000f5af0000edaf0500afafaf6464c6af01dfdff4af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfb0af0000f5affd00f1affd00fd af016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d 56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af096464 00d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4 af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af 01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf01 6464c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656df df8caf016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d 569d56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900 d6d69d9d9d5656dfdf8caf016464c4dff4af09646400d6d69d9d9d560009 00d69dd69d569d56dfdf8caf0064c3dff4af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf8cafc264f4af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdf8cafc36400dff4af09646400d69dd69d569d000900d6 d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d56 000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69d d69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdf f4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6 af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf 016464c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656 dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdfd2aff900e7af0300afaf00f2affd00f7affb00fdaf016464 f7af0000fbaffc00fcaffc00e1af01dfdff4af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdfd2af0000e1af0300afaf00f2af0000f6af0000 fcaf0500afafaf6464f9affd00fcaf0000fcaf0300afaf00fcaf0000e2af 01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdfd2af00 00e1af0000efaf0000f6af0000fcaf0500afafaf6464f7af0000fcaf0000 fcaf0300afaf00fcaf0000e2af01dfdff4af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfd2af0000f8affc00fdaf0300af0000faaffc000c afaf00afaf00afaf00af000000f9af0300afaf00fbaffc00fdaf0500afaf af6464f7af0000fcaf0000fcaf0300afaf00fcaf0000e2af01dfdff4af09 646400d6d69d9d9d56000900d69dd69d569d56dfdfd2af0000f9af090000 afaf0000afaf0000f9af120000afaf0000af00afaf00afaf0000afaf0000 faaf0300afaf00fbaf0200af00fcaf0500afafaf6464f7af0000fcaf0000 fcaf0300afaf00fcaf0000e2af01dfdff4af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfd2affa00f9af0300afaf00f8af0000faaf0600af af00afaf00fcaf0000faaf0b00afafaf00afafaf00afaf00fcaf0500afaf af6464f7af0000fcaf0000fcaf0300afaf00fcaf0000e2af01dfdff4af09 646400d6d69d9d9d56000900d69dd69d569d56dfdfd2af0000f8affb0002 afaf00f8af0000faaf0600afaf00afaf00fcaf0000faaf0b00afafaf00af afaf00afaf00fcaf0500afafaf6464f7af0000fcaf0000fcaf0300afaf00 fcaf0000e2af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d56 56dfdfd2af0000f9af080000afafaf00afaf00f8af0000faaf0600afaf00 afaf00fcaf0000faaf0b00afafaf00afafaf00afaf00fcaf0500afafaf64 64f7af0000fcaf0000fcaf0300afaf00fcaf0000e2af01dfdff4af096464 00d6d69d9d9d56000900d69dd69d569d56dfdfd2af0000f9af0000fcaf03 00afaf00f8af0000fcaf0800af00afaf00afaf00fcaf0000faaf0000fcaf 0600af00afafaf00fcaf0500afafaf6464f7af0000fcaf0000fcaf0300af af00fcaf0000e2af01dfdff4af09646400d69dd69d569d000900d6d69d9d 9d5656dfdfd2af0000f9af080000afaf0000afaf00f8af120000afaf0000 af00afaf00afaf0000afaf0000faaf0000fcaf0600af00afafaf00fcaf05 00afafaf6464f7af0000fcaf0000fcaf0300afaf00fcaf0000e2af01dfdf f4af09646400d6d69d9d9d56000900d69dd69d569d56dfdfd2af0000f8af fd0004af0000af00f7affc000cafaf00afaf00afaf00af000000f9af0000 fbaf0000fcaf0000fcaf0500afafaf6464f7af0000fbaffc00fcaffc00e1 af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdfacaf 0000f5af0000f1af0500afafaf6464c6af01dfdff4af09646400d6d69d9d 9d56000900d69dd69d569d56dfdfacaf0000f5af0000f1af0500afafaf64 64c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf acaf0000f5affd00f5affd00fdaf016464c6af01dfdff4af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdf f4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6 af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf 016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56 dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6d69d 9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d560009 00d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd69d 569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c4dff4af096464 00d69dd69d569d000900d6d69d9d9d5656dfdf8caf0064c3dff4af096464 00d6d69d9d9d56000900d69dd69d569d56dfdf8cafc264f4af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdf8cafc36400dff4af09646400d6 d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09 646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01df dff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464 c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8c af016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d 56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdfc3aff900fcaffd00fcaf0000f9af00 00fbaffd00f2affd00fdaf016464f5af0300afafaffc00d9af01dfdff4af 09646400d6d69d9d9d56000900d69dd69d569d56dfdfc3af0000f8af0900 00afafaf0000afaf00f9af0000fbaf0000eeaf0500afafaf6464f6af0400 00afaf00fcaf0000daaf01dfdff4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfc3af0000f8af0000fbaf0400afafaf00fbaf0000faaf00 00eeaf0500afafaf6464f7af0500af00afaf00fcaf0000daaf01dfdff4af 09646400d6d69d9d9d56000900d69dd69d569d56dfdfc3af0000f9af0000 f9af0300afaf00fbaf0000faaf0300afaf00fbaf010000fbaf0800afaf00 afafaf6464f8af0600afaf00afaf00fcaf0000daaf01dfdff4af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfc3af0000f9af0000f9af0900 afaf0000afafaf0000faaf0300afaf00fbaf010000fbaf0800afaf00afaf af6464f9af0700afafaf00afaf00fcaf0000daaf01dfdff4af09646400d6 d69d9d9d56000900d69dd69d569d56dfdfc3affa0002afaf00f9af0800af afaf00afafaf00f9af1800afafaf00afafaf00afaf00afafaf00afafaf00 afafaf6464faaf0000fcaf0300afaf00fcaf0000daaf01dfdff4af096464 00d69dd69d569d000900d6d69d9d9d5656dfdfc3af0000f9af0000f9af08 00afafaf00afafaf00f9af1800afafaf00afafaf00afaf00afafaf00afaf af00afafaf6464faaf0000fcaf0300afaf00fcaf0000daaf01dfdff4af09 646400d6d69d9d9d56000900d69dd69d569d56dfdfc3af0000f9af0000f9 af0000fcaf0200af00f8af1800afafaf00afafaf00afaf00afafaf00afaf af00afafaf6464faaff90001af00fcaf0000daaf01dfdff4af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfc3af0000f8af0000fbaf0000fb af0200af00f8af0000fcaf0200af00fcaf0200af00fcaf0500afafaf6464 f5af0300afaf00fcaf0000daaf01dfdff4af09646400d6d69d9d9d560009 00d69dd69d569d56dfdfc3af0000f8af060000afafaf0000faaf0000f7af 0000fcaf0200af00fcaf0200af00fcaf0500afafaf6464f5af0300afaf00 fcaf0000daaf01dfdff4af09646400d69dd69d569d000900d6d69d9d9d56 56dfdfc3af0000f6affd00f8af0000f7af0000fbaf0000faaf0000fbaf05 00afafaf6464f5af0300afafaffc00d9af01dfdff4af09646400d6d69d9d 9d56000900d69dd69d569d56dfdfa3af0000eeaf0500afafaf6464c6af01 dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdfa3af0000 eeaf0500afafaf6464c6af01dfdff4af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdfa3affd00f2affd00fdaf016464c6af01dfdff4af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdf f4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6 af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf 016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56 dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6d69d 9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d560009 00d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd69d 569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af 09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01 dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf0164 64c4dff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf00 64c3dff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8cafc2 64f4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8cafc36400 dff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464 c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8c af016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d 56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af096464 00d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4 af09646400d69dd69d569d000900d6d69d9d9d5656dfdff5aff900e8af00 00f9af0000deaf0000f5affd00f8af0900af000000afafaf6464f9affc00 d1af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdff5 af0000e2af0000f9af0000e2af0400afafaf00f5af0000f6af0900afafaf 00afafaf6464faaf0000fcaf0000d2af01dfdff4af09646400d69dd69d56 9d000900d6d69d9d9d5656dfdff5af0000e2af0000f9af0000e2af0400af afaf00f5af0000f6af0900afafaf00afafaf6464faaf0000fcaf0000d2af 01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdff5af00 00f8affc00fcaffc00fdaffc00fdaf0000f9af0000f9affc00fdaf0400af 000000fcaffd000caf00af000000afaf00af000000f9af0300afaf00fbaf 0b00af00afafaf00afafaf6464f5af0000d2af01dfdff4af09646400d69d d69d569d000900d6d69d9d9d5656dfdff5af0000f9af170000afaf0000af af0000afaf0000af0000afaf0000afaf00f9af0000faaf210000afaf0000 afaf0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000faaf 0300afaf00fbaf0b00af00afafaf00afafaf6464f5af0000d2af01dfdff4 af09646400d6d69d9d9d56000900d69dd69d569d56dfdff5affa0002afaf 00fcaf0300afaf00f5af0300afaf00f9af0000faaf0000fcaf0300afaf00 fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000faaf1400afafaf00 afafaf00afaf00afafaf00afafaf6464f8affd00d1af01dfdff4af096464 00d69dd69d569d000900d6d69d9d9d5656dfdff5af0000f9af0000fcaf03 00afaf00f9affb0002afaf00f9af0000faaffa0002afaf00fcaf0300afaf 00fcaf0700afaf00afafaf00fcaf0000faaf1400afafaf00afafaf00afaf 00afafaf00afafaf6464f5af0000d2af01dfdff4af09646400d6d69d9d9d 56000900d69dd69d569d56dfdff5af0000f9af0000fcaf0300afaf00faaf 080000afafaf00afaf00f9af0000faaf0000f9af0000fcaf0300afaf00fc af0700afaf00afafaf00fcaf0000faaf1400afafaf00afafaf00afaf00af afaf00afafaf6464f5af0000d2af01dfdff4af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdff5af0000f9af0000fcaf0300afaf00fcaf0200 af00fcaf0300afaf00f9af0000faaf0000f9af0000fcaf0300afaf00fcaf 0700afaf00afafaf00fcaf0000faaf0000fcaf0f00af00afafaf00afafaf 00afafaf6464faaf0000fcaf0000d2af01dfdff4af09646400d6d69d9d9d 56000900d69dd69d569d56dfdff5af0000f9af170000afaf0000afaf0000 afaf0000af0000afaf0000afaf00f9af0000faaf080000afaf0000afaf00 fcaf0f00afaf0000afaf0000afaf00afafaf00fcaf0000faaf0000fcaf0f 00af00afafaf00afafaf00afafaf6464faaf0000fcaf0000d2af01dfdff4 af09646400d69dd69d569d000900d6d69d9d9d5656dfdff5af0000f8affc 00fcaffc00fdaffd0004af0000af00f9affa0001afaffc00fdaf0000fcaf 0f00afafaf000000af00afafaf0000af00fcaf0000faaf0000fbaf0000fc af0900afafaf00afafaf6464f9affc00d1af01dfdff4af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfb2af0000eeaf0000f2af0500afafaf 6464c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656df dfb7af050000afaf0000eeaf0000f2af0500afafaf6464c6af01dfdff4af 09646400d6d69d9d9d56000900d69dd69d569d56dfdfb6affc00edaffd00 f6affd00fdaf016464c6af01dfdff4af09646400d69dd69d569d000900d6 d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d56 000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69d d69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdf f4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6 af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf 016464c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656 dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf8caf016464c4dff4af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdf8caf0064c3dff4af09646400d69dd69d569d00 0700d6d69d9d9d56568aafc264f4af09646400d6d69d9d9d56000700d69d d69d569d568aafc36400dff4af09646400d69dd69d569d000700d6d69d9d 9d56568aaf016464c6af01dfdff4af09646400d6d69d9d9d56000700d69d d69d569d568aaf016464c6af01dfdff4af09646400d69dd69d569d000700 d6d69d9d9d56568aaf016464c6af01dfdff4af09646400d6d69d9d9d5600 0700d69dd69d569d568aaf016464c6af01dfdff4af09646400d69dd69d56 9d000700d6d69d9d9d56568aaf016464c6af01dfdff4af09646400d6d69d 9d9d56000700d69dd69d569d568aaf016464c6af01dfdff4af09646400d6 9dd69d569d000700d6d69d9d9d56568aaf016464c6af01dfdff4af096464 00d6d69d9d9d56000700d69dd69d569d56f3af0000faaf0000e0affd00fc af0000deaffd00f2affd00fdaf016464f9affc00d1af01dfdff4af096464 00d69dd69d569d000700d6d69d9d9d5656f3af0000faaf0000e2af090000 afafaf0000afaf00deaf0000eeaf0500afafaf6464faaf0000fcaf0000d2 af01dfdff4af09646400d6d69d9d9d56000700d69dd69d569d56f3af0000 dbaf0000fbaf0300afaf00deaf0000eeaf0500afafaf6464faaf0000fcaf 0000d2af01dfdff4af09646400d69dd69d569d000700d6d69d9d9d5656f3 af0000faaf0700afaf00af000000fcaffc00fcaffd00f9af0000f7af0300 afafaffc00fcaffd00fcaffc00fdaf0300af0000fbaf0300afaf00fbaf02 00afaffc00fdaf0500afafaf6464f5af0000d2af01dfdff4af09646400d6 d69d9d9d56000700d69dd69d569d56f3af0000faaf1700afaf0000afaf00 00afaf0000afaf0000afaf00afafaf00faaf0000f7af1b00afaf0000afaf 0000afaf00afafaf00afaf0000afaf0000afaf0000f9af0300afaf00fbaf 0f00af0000afaf0000afaf00afafaf6464f5af0000d2af01dfdff4af0964 6400d69dd69d569d000700d6d69d9d9d5656f3af0000faaf0300afaf00fc af0300afaf00fcaf0400afaf0000f7af0000f7af0300afaf00fcaf0400af af0000fbaf0000fcaf0300afaf00f8af0b00afafaf00afafaf00afaf00f9 af0500afafaf6464f8affd00d1af01dfdff4af09646400d6d69d9d9d5600 0700d69dd69d569d56f3af0000faaf0300afaf00fcaf0200afaffa00fdaf fd00f9af0000f7af0300afaf00fcaf0900afafaf000000afafaffa0002af af00f8af0b00afafaf00afafaf00afaf00f9af0500afafaf6464f5af0000 d2af01dfdff4af09646400d69dd69d569d000700d6d69d9d9d5656f3af00 00faaf0300afaf00fcaf0300afaf00f6af010000faaf0000f7af0300afaf 00fcaf0000fbaf040000afaf00f9af0000f8af0b00afafaf00afafaf00af af00f9af0500afafaf6464f5af0000d2af01dfdff4af09646400d6d69d9d 9d56000700d69dd69d569d56f3af0000faaf0300afaf00fcaf0300afaf00 f5af0000f9af0000fbaf0600afaf00afaf00fcaf0000faaf0300afaf00f9 af0000f8af0000fcaf0600af00afafaf00fcaf0800afaf00afafaf6464fa af0000fcaf0000d2af01dfdff4af09646400d69dd69d569d000700d6d69d 9d9d5656f3af0000faaf0300afaf00fcaf0f00afaf0000afaf0000afaf00 afafaf00f9af230000afafaf0000afaf00afaf0000afaf0000afaf00afaf af00afaf0000afaf0000afaf00f8af0000fcaf1300af00afafaf0000afaf 0000afaf00afafaf6464faaf0000fcaf0000d2af01dfdff4af09646400d6 d69d9d9d56000700d69dd69d569d56f3affa0004af00afaf00fcaf0300af afaffc00fcaffd00f6affd00fcaf0300afafaffc00fcaffd00fcaffc00fd af0000f8af0000fbaf0000fbaffc00fdaf0500afafaf6464f9affc00d1af 01dfdff4af09646400d69dd69d569d000700d6d69d9d9d5656a1af0000ee af0500afafaf6464c6af01dfdff4af09646400d6d69d9d9d56000700d69d d69d569d56a1af0000eeaf0500afafaf6464c6af01dfdff4af09646400d6 9dd69d569d000700d6d69d9d9d5656a1affd00f2affd00fdaf016464c6af 01dfdff4af09646400d6d69d9d9d56000700d69dd69d569d568aaf016464 c6af01dfdff4af09646400d69dd69d569d000700d6d69d9d9d56568aaf01 6464c6af01dfdff4af09646400d6d69d9d9d56000700d69dd69d569d568a af016464c6af01dfdff4af09646400d69dd69d569d000700d6d69d9d9d56 568aaf016464c6af01dfdff4af09646400d6d69d9d9d56000700d69dd69d 569d568aaf016464c6af01dfdff4af09646400d69dd69d569d000700d6d6 9d9d9d56568aaf016464c6af01dfdff4af09646400d6d69d9d9d56000700 d69dd69d569d568aaf016464c6af01dfdff4af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d 9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af096464 00d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c4dff4af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf8caf0064c3dff4af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d 000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d 5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf 80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af 09646400d6d69d9d9d56000900d69dd69d569d56dfdfc9affd00daaf0000 f7af0000f1af0000f6af0000c8af09646400d69dd69d569d000900d6d69d 9d9d5656dfdfcbaf060000afafaf0000dcaf010000f9af010000f1af0000 f6af0000c8af09646400d6d69d9d9d56000900d69dd69d569d56dfdfcbaf 0000fbaf0000dcaf010000f9af010000f1af0000f6af0000c8af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfcbaf0000f8af0400af000000 fcaffc00fcaffc00fdaffc00faaf0200af00fbaf0500af00afafaffc00fc affd0004af00afafaffc00fdaf0000c8af09646400d6d69d9d9d56000900 d69dd69d569d56dfdfcaaf010000faaf1c0000afaf0000afaf0000afaf00 00afaf0000afaf0000af0000afaf0000fbaf0200af00fbaf1d00af00afaf 0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00c8af096464 00d69dd69d569d000900d6d69d9d9d5656dfdfc8af010000fcaf0000fcaf 0000f9af0300afaf00faaf0000fcaf0000fbaf0d00afaf00afafaf00afaf 00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00c8af096464 00d6d69d9d9d56000900d69dd69d569d56dfdfc6af040000afaf00fcaf03 00afafaffb0002afaf00faaffa00fbaf0d00afaf00afafaf00afaf00afaf 00fcaf0300afaf00fcaf0200afaffa0002afaf00c8af09646400d69dd69d 569d000900d6d69d9d9d5656dfdfc5af0300afaf00fcaf0b00afaf0000af afaf00afaf00faaf0000f6af0d00afafaf00af00afafaf00afaf00fcaf03 00afaf00fcaf0300afaf00f9af0000c8af09646400d6d69d9d9d56000900 d69dd69d569d56dfdfcbaf0000fbaf0300afaf00fcaf0300afaf00fcaf03 00afaf00fcaf0200af00f6af0d00afafaf00af00afafaf00afaf00fcaf03 00afaf00fcaf0300afaf00f9af0000c8af09646400d69dd69d569d000900 d6d69d9d9d5656dfdfcbaf250000afafaf0000afaf0000afaf0000afaf00 00afaf0000afaf0000afaf0000af0000afaf0000fbaf0000fcaf0000fcaf 1b00afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00c8 af09646400d6d69d9d9d56000900d69dd69d569d56dfdfc9affd00fcaf04 00af000000fcaffd0004af0000afaffc00fdaffc00faaf0000fcaf0000fc af0300afafaffc00fcaffd0004af00afafaffc00fdaf0000c8af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfc2af000081af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdfc2af000081af09646400d69dd69d 569d000900d6d69d9d9d5656dfdfc2af000081af09646400d6d69d9d9d56 000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6 d69d9d9d5656dfdfefaf8064e56400dfefaf09646400d6d69d9d9d560009 00d69dd69d569d56dfdfefaf006480dfe7df0164dfefaf09646400d69dd6 9d569d000900d6d69d9d9d5656dfdfefaf0164df8064e76400dfefaf0964 6400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0164df8064e96402 df64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf03 64df64648000ec0003dfdf64dfefaf09646400d6d69d9d9d56000900d69d d69d569d56dfdfefaf0364df64648000ec0003dfdf64dfefaf09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfefaf0764df646400afafafee00 fdaffb0000aff90002af00afe60000afb00003dfdf64dfefaf09646400d6 d69d9d9d56000900d69dd69d569d56dfdfefaf0564df646400afea0000af fb0000aff90002af00aff90000afee0000afb00003dfdf64dfefaf096464 00d69dd69d569d000900d6d69d9d9d5656dfdfefaf0564df646400afea00 00affa0000affb0000aff60000afee0000afb00003dfdf64dfefaf096464 00d6d69d9d9d56000900d69dd69d569d56dfdfefaf1364df646400af0000 00af00afaf0000afaf0000affb0003af0000affa0000affb0007af0000af 0000af00fbaf020000affc0002af0000fcaffd0000afb00003dfdf64dfef af09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf1364df6464 00af000000afaf0000afaf0000af00affb0003af0000affa0015afaf0000 00afaf0000af0000afaf000000af000000affc000aaf00afaf0000afaf00 00afb00003dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d569d 56dfdfefaf1c64df646400af000000af000000af000000af0000af000000 af000000aff9000baf000000af000000af0000affc0004af000000affc00 00affa0003af0000afb00003dfdf64dfefaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfefaf1c64df646400af000000af000000af000000 af0000af000000af000000aff9000baf000000af000000af0000affc0004 af000000affc0002af0000fbaf020000afb00003dfdf64dfefaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdfefaf1c64df646400af000000 af000000af000000af0000af000000af000000aff80002af00affc0003af 0000affc0004af000000affc000aaf00afaf000000af0000afb00003dfdf 64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf1764 df646400af000000af000000af000000af000000af00affc0000aff80002 af00affc0003af0000affc0004af000000affc0002af00affc0003af0000 afb00003dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdfefaf1764df646400af000000af000000af000000af000000af00affc 0000aff70000affb0003af0000affc0013af000000afaf0000afaf00afaf 0000afaf0000afb00003dfdf64dfefaf09646400d69dd69d569d000900d6 d69d9d9d5656dfdfefaf1164df646400af000000af000000af000000affc 0000affb0000aff70000affb0003af0000affb0012afaf0000afafaf00af 0000afafaf00afaf00afb00003dfdf64dfefaf09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfefaf0564df646400afea0000af850003dfdf64 dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0564df 646400afea0000af850003dfdf64dfefaf09646400d6d69d9d9d56000900 d69dd69d569d56dfdfefaf0764df646400afafafee00fdaf850003dfdf64 dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0364df 646480afecaf03dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d 569d56dfdfefaf0364df646480afecaf03dfdf64dfefaf09646400d69dd6 9d569d000900d6d69d9d9d5656dfdfefaf0764df6464af000000edaffd00 faaffa00f0af0000ebaf0000b9af03dfdf64dfefaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdfefaf0564df6464af00e9af0000faaf0000 fcaf010000f1af0000efaf0400afafaf00b9af03dfdf64dfefaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdfefaf0564df6464af00e9af00 00faaf0000fbaf0000dfaf0000b5af03dfdf64dfefaf09646400d6d69d9d 9d56000900d69dd69d569d56dfdfefaf1864df6464af00afafaf00af0000 afaf0000afafaf00af000000fcaf0000faaf0000fbaf0800afaf00af0000 afaffc00fdaf0300afafaffc00fcaffc0008af000000afaf00af00fbaf02 00afaffc00c7af03dfdf64dfefaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdfefaf1d64df6464af00afafaf0000afaf0000afaf00afaf00 00afaf0000afafaf00faaf0000fcaf290000afaf0000afafaf0000afaf00 00afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00af00fbaf 0700af0000afaf0000c8af03dfdf64dfefaf09646400d6d69d9d9d560009 00d69dd69d569d56dfdfefaf1464df6464af00afafaf00afafaf00afafaf 00afaf00fcaf0400afafaf00faaffa00fdaf0000fcaf0000fcaf0600afaf 00afaf00fcaf0300afaf00faaf0e00afafaf00afaf00afafaf00afaf00fc af0000c8af03dfdf64dfefaf09646400d69dd69d569d000900d6d69d9d9d 5656dfdfefaf1464df6464af00afafaf00afafaf00afafaf00afaf00fcaf 0400afafaf00faaf0000f8af0000fcaf0000fcaf0500afaf00afaffa0002 afaf00faaf0d00afafaf00afaf00afafaf00afaffa00c8af03dfdf64dfef af09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf1464df6464 af00afafaf00afafaf00afafaf00afaf00fcaf0400afafaf00faaf0000f8 af0000fcaf0000fcaf0600afaf00afaf00f9af0000faaf0e00afafaf00af af00afafaf00afaf00c3af03dfdf64dfefaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfefaf1464df6464af00afafaf00afafaf00afafaf 00afaf00fcaf0400afafaf00faaf0000f8af0000fcaf0000fcaf0600afaf 00afaf00f9af0000fcaf1000af00afafaf00afafaf00af00afafaf00c3af 03dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfef af1d64df6464af00afafaf00afafaf00afafaf00afaf0000afaf0000afaf af00faaf0000f8af0000fcaf2d0000afaf0000afaf00afaf0000afaf0000 afaf0000afaf0000af00afafaf00afafaf00af00afafaf0000afaf0000c8 af03dfdf64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf efaf1864df6464af00afafaf00afafaf00afafaf00afaf00af000000fcaf 0000faaf0000f8af0000fbaffc00fdaf0300afafaffc00fcaffc00fdaf03 0000af00fcaf0000fbaffc00c7af03dfdf64dfefaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdfefaf0564df6464af00f2af0000f8af0000 e4af0000a3af03dfdf64dfefaf09646400d69dd69d569d000900d6d69d9d 9d5656dfdfefaf0564df6464af00f2af0000f8af0000e4af0000a3af03df df64dfefaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf07 64df6464af000000f4af0000faaffd00e6af010000a2af03dfdf64dfefaf 09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0364df646480 afecaf03dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdfefaf0364df646480afecaf03dfdf64dfefaf09646400d69dd69d569d 000900d6d69d9d9d5656dfdfefaf0764df6464af000000eeaffd00f7affd 00ebaf010000dfaf0000caaf03dfdf64dfefaf09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfefaf0564df6464af00eaaf0000f9af060000af afaf0000eeaf0000ddaf0000caaf03dfdf64dfefaf09646400d69dd69d56 9d000900d6d69d9d9d5656dfdfefaf0564df6464af00eaaf0000f9af0000 fbaf0000eeaf0000ddaf0000caaf03dfdf64dfefaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdfefaf1064df6464af00afafaf00af0000af af0000fcaffc00fdaf0000faaf0000f6affc00fdaf0c00af000000afaf00 0000afafaffc00fdaf0c00af0000af00af0000afaf0000fcaffc00fdaf00 00caaf03dfdf64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656 dfdfefaf1c64df6464af00afafaf0000afaf0000afaf00afaf0000afaf00 00afaf00faaf0000f7af340000afaf0000afaf0000afaf0000afaf00afaf af0000afaf0000afaf0000afafaf0000afaf0000afaf00afaf0000afaf00 00afaf00caaf03dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d 569d56dfdfefaf1464df6464af00afafaf00afafaf00afafaf00afaf00f9 af0000faaf0000f7af0000fcaf0300afaf00fcaf0700afaf00afafaf00fc af0300afaf00fcaf0800afafaf00afafaf00f9af0300afaf00caaf03dfdf 64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf1464 df6464af00afafaf00afafaf00afafaf00afaf00f9af0000faaf0000f7af 0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0b 00afafaf00afafaf00afafaffb0002afaf00caaf03dfdf64dfefaf096464 00d6d69d9d9d56000900d69dd69d569d56dfdfefaf1464df6464af00afaf af00afafaf00afafaf00afaf00f9af0000faaf0000f7af0000fcaf0300af af00fcaf0700afaf00afafaf00fcaf0300afaf00fcaf1300afafaf00afaf af00afaf0000afafaf00afaf00caaf03dfdf64dfefaf09646400d69dd69d 569d000900d6d69d9d9d5656dfdfefaf1464df6464af00afafaf00afafaf 00afafaf00afaf00fcaf0300afaf00f9af0000fbaf0300afaf00fcaf0300 afaf00fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0b00afafaf00af afaf00afaf00fcaf0300afaf00caaf03dfdf64dfefaf09646400d6d69d9d 9d56000900569d569d569d56dfdfefaf1c64df6464af00afafaf00afafaf 00afafaf00afaf0000afaf0000afaf00f9af110000afafaf0000afaf0000 afaf0000afaf00fcaf0f00afaf00afafaf0000afaf0000afaf00fcaf1300 afafaf00afafaf00afaf0000afaf0000afaf00caaf03dfdf64dfefaf0964 6400d69dd69d569d000000fc56049d5656dfdfefaf1464df6464af00afaf af00afafaf00afafaf00afafaffc00fdaf0000f7affd00fbaffc00fdaf00 00fcaf0300afaf00fcaffc00fdaf0000fcaf1300afafaf00afafaf00afaf af000000af0000af00caaf03dfdf64dfefaf04646400d6d6fc56ff000000 fcd604569d56dfdfefaf0564df6464af00eaaf000085af03dfdf64dfefaf 04646400d69dfcd6ff000900d6d6d69d9d5656dfdfefaf0564df6464af00 eaaf000085af03dfdf64dfefaf09646400d6d69dd6d6d6000900d69dd69d 569d56dfdfefaf0764df6464af000000eeaffd0085af03dfdf64dfefaf09 646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0364df646480af ecaf03dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d569d56df dfefaf0364df646480afecaf03dfdf64dfefaf09646400d69dd69d569d00 0900d6d69d9d9d5656dfdfefaf0364df646480afecaf03dfdf64dfefaf09 646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0364df646480af ecaf03dfdf64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656df dfefaf0364df646480afecaf03dfdf64dfefaf09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfefaf0364df646480afecaf03dfdf64dfefaf09 646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0364df646480df eadf0164dfefaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfef af0264df6480dfe9df0164dfefaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdfefaf8064e56400dfefaf09646400d6d69d9d9d56000900d6 9dd69d569d56dfdfefaf80dfe4dfefaf09646400d69dd69d569d000900d6 d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf 80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af 09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d 569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d560009 00d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d 9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56 dfdf8064c0640700d69dd69d569d000800d6d69d9d9d5656df8064bf6407 00d6d69d9d9d56000700d69dd69d569d568000bd0006d69dd69d569d0006 00d6d69d9d9d5680d6bad6fd9d0156007f00d69dd69d569dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6519dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d569d000200d6d6e49d0156d6809df0 9d0156d6e39d0156000300d69dd6e59d0256d6d6809df19d0256d6d6e59d 02569d007f00d6d69d569d569d569d569d569d569d569d569d569d569d56 9d569d569d5656d6d6569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d51569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d5656d6d6569d569d569d569d569d569d569d569d569d569d569d569d 569d569d56000100d6e25601d6d68056f05601d6d6e356ff008000ae00 grestore showpage %%Trailer geomview-1.9.5/doc/figs/fig2.ps0000644000175000017500000016477612310110173013173 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: noname.ps %%Pages: 1 %%BoundingBox: 201 276 410 485 %%EndComments /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 435 string def %%EndProlog %%Page: 1 1 gsave 201.6 276.6 translate 208.8 208.8 scale 435 435 8 [ 435 0 0 -435 0 435 ] { picstr readstring } image 800080008000cd000000e3d6019d5680d680d68fd6015656e2d6019d007f 00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d 5656d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69d7fd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d32d69dd6 9dd69dd69dd69dd69dd69dd69dd69d56d6d69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d9d9d000300d69dd6e59d0256d6d680 9d809d919d035656d6d6e49d0156000200d6d6e49d0156d6809d809d8f9d 0156d6e49d02569d007f00d69dd69d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d567f9d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d567f9d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d562b9d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d56fb9d0156007f00d6d6 9d9d9d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d7f569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d7f569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d32569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d9d9dd69d569d000600d69dd69d569d800080008000db 0006d6d69d9d9d56000700d6d69d9d9d560080d680d680d6ddd60700d69d d69d569d007f00d69dd69d569d00d6d69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9dd6d69dd6 9dd6329dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69d00d6d69d9d9d56000800d6d69d9d 9d5600d6ea9d0156d6809d809da89d0156d6e99d0256d6d6eb9d085600d6 9dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6809d809da99d02 56d6d6eb9d025656d6fc9df200fd9d09565600d6d69d9d9d56000800d6d6 9d9d9d5600d6eb9d025656d6ee9dfc00cc9d0200009df900ed9d0500009d 9d0000f99d010000d99d010000ed9d010000809ddd9d025656d6e99d0656 d6d69d9d9d00f49d0000fc9d085600d69dd69d569d000900d69dd69d569d 00d6d6eb9d0256d6d6f19dfd00039d9d0000ce9d0500009d9d0000e89d05 00009d9d0000f99d010000d99d010000ec9d010000809ddd9d0256d6d6eb 9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d6 9d9d9d5600d6eb9d025656d6f19d010000fc9d010000cf9d0600009d9d9d 0000e99d010000f59d010000c29d010000809dde9d025656d6e99d0656d6 d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d569d 00d6d6eb9d0256d6d6f39d010000f69dfc00fd9d0800009d00009d000000 fc9dfc00fd9d0600009d00009d9dfc00f99d0600009d9d9d0000f99d0900 009d9d9d00009d9d9dfc00fd9d1100009d9d00009d9d9d0000009d00009d 9d9dfc00fc9dfc00fd9d0500009d000000fa9d010000fc9d0700009d0000 9d9d9dfc00109d9d00009d9d00009d9d00009d9d9d0000809dde9d0256d6 d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800 d6d69d9d9d5600d6eb9d025656d6f29d010000f79d1b00009d9d00009d9d 0000009d0000009d00009d9d00009d9d00009d9dfb00069d00009d9d0000 fa9d0600009d9d9d0000f99d3800009d9d9d00009d9d00009d9d00009d9d 00009d9d00009d9d00009d9d0000009d9d00009d9d00009d9d00009d9d00 009d9d0000009d9d0000fb9d010000fc9d1c00009d00009d9d00009d9d00 009d00009d9d00009d9d00009d9d9d0000809ddf9d025656d6e99d0656d6 d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000b00d69dd69d569d 00d6d69d9df000fd9d0256d6d6f49d010000f29d1900009d9d00009d9d00 009d9d00009d00009d9d9d00009d9d0000f89d010000fb9d010000fc9df9 00029d0000fc9d1400009d00009d9d9d00009d00009d9d9d00009d0000fc 9d0900009d00009d9d9d0000fa9d0a00009d9d00009d9d9d0000fb9d2200 009d9d9d00009d9d00009d00009d9d9d00009d00009d9d00009d9d00009d 9d9d0000809dde9d0256d6d6f99dfc00f69d025656d6fc9d0000f49d0d00 009d9d565600d6d69d9d9d56000c00d6d69d9d9d5600d69d9d9d00f29d05 009d9d5656d6f39d010000f69dfb000d9d9d00009d9d00009d9d00009d9d fa00039d9d0000fb9dfb00fa9d0600009d9d9d0000f99d0a00009d9d9d00 009d9d0000fa9d1000009d9d00009d9d00009d9d9d00009d9dfa00fd9dfb 00089d9d00009d9d9d0000fa9d0b00009d9d00009d9d00009d9dfa000a9d 9d00009d0000009d0000fc9d010000809ddf9d025656d6f89d04009d9d00 00f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000c00 d69dd69d569d00d6d69d9d00f29d0600009d9d56d6d6f49d010000f79d14 00009d9d00009d9d00009d9d00009d9d00009d0000f99d010000fc9d0500 009d9d0000fa9d0600009d9d9d0000f99d0900009d9d9d00009d0000f99d 0800009d9d00009d0000fc9d0400009d0000f99d0e00009d9d00009d9d00 009d9d9d0000fa9d0c00009d9d00009d9d00009d0000f99d0800009d009d 009d0000fc9d010000809dde9d0256d6d6f99d04009d9d0000f79d025656 d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00d6d69d9d9d56 00d69d9d9def00039d5656d6f39d010000fb9d1800009d00009d9d9d0000 9d9d00009d9d00009d9d00009d0000f99d0b00009d9d9d00009d9d9d0000 fa9d0600009d9d9d0000fa9d1a00009d9d9d00009d9d00009d9d9d00009d 9d00009d9d00009d0000fc9d0400009d0000fa9d0f00009d9d9d00009d9d 00009d9d9d0000f99d0b009d00009d9d9d00009d0000f99dfc00039d0000 00fb9d010000809ddf9d025656d6f89dfb00f69d0656d6d69d9d9d00f49d 0d00009d9d9d5600d69dd69d569d000900d69dd69d569d00d6d6fc9df100 049d9d56d6d6f39d2600009d9d0000009d9d00009d9d00009d9d00009d9d 00009d9d00009d9d00009d9d00009d9d0000fc9d0500009d9d0000f99d05 00009d9d0000f99d3800009d9d0000009d9d00009d9d00009d9d00009d9d 00009d9d00009d9d0000009d9d00009d9d00009d9d00009d9d00009d9d00 009d9d9d0000f89dfd00fd9d0900009d9d00009d9d0000fc9d0500009d9d 0000fb9d010000809ddd9d0256d6d6f89dfc00f79d025656d6fc9d0000f4 9d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d0256 56d6f19dfc00fb9dfd00109d00009d00009d9d00009d9d00009d9d9dfc00 fd9d010000fb9dfd00029d0000fa9d0300009d9df900fd9dfd00059d0000 9d9d9dfc00fd9d1100009d9d00009d9d9d0000009d00009d9d9dfc00fc9d fd000a9d00009d00009d9d9d0000f89d010000fc9d0400009d9d9dfc00fb 9d0500009d9d0000fb9d010000809dde9d025656d6e99d0656d6d69d9d9d 00f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d569d00d6d6eb 9d0256d6d6ba9d010000979d010000809ddc9d0256d6d6eb9d025656d6fc 9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6 eb9d025656d6b99d010000989d010000809ddc9d025656d6e99d0656d6d6 9d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d569d00 d6d6eb9d0256d6d6b99d0100009a9d010000809dda9d0256d6d6eb9d0256 56d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d 5600d6eb9d025656d6809d809da99d025656d6e99d0556d6d69d9d9df100 fd9d085600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d680 9d809da99d0256d6d6eb9d025656d6fa9df3000b9d9d565600d6d69d9d9d 56000800d6d69d9d9d5600d6eb9d025656d6809d809da99d025656d6e99d 0256d6d6eb9d085600d69dd69d569d007f00d69dd69d569d00d69d9d569d 569d569d569d569d569d569d569d569d569d56d6569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d567f9d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d567f9d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d56d6569d569d56329d569d569d569d569d569d569d569d56 9d5656d69d569d569d569d569d569d569d569d569d569d569d565600d6d6 9d9d9d560008009d569d9d9d56009de956009d80568056a756009de85600 9de9560700d69dd69d569d000000fb56009d800080008000db0001d6d6fc 56ff000000fcd6029d5656805480548054dd540200d69dfcd6ff000700d6 d6d69d569d56805480548054dd540700d6d69dd6d6d6000700d6d69d9d9d 5656805480548054dd540700d69dd69d569d000700d69dd69d569d568054 80548054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054 dd540700d69dd69d569d000700d69dd69d569d56805480548054dd540700 d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d 569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d560007 00d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd6 9d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d565680548054 8054dd540700d69dd69d569d000700d69dd69d569d56805480548054dd54 0700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69d d69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d56 000700d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d6 9dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d 5656805480548054dd540700d69dd69d569d000700d69dd69d569d568054 80548054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054 dd540700d69dd69d569d000700d69dd69d569d56805480548054dd540700 d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d 569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d560007 00d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd6 9d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656ae548000 00008054b0540700d69dd69d569d000700d69dd69d569d56ae5400008054 00008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae5401000081 5400008054b1540700d69dd69d569d000700d69dd69d569d56ae54020054 00825400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae5403 00545400835400008054b1540700d69dd69d569d000700d69dd69d569d56 ae54040054545400845400008054b1540700d6d69d9d9d56000700d6d69d 9d9d5656ae540000fc540000855400008054b1540700d69dd69d569d0007 00d69dd69d569d56ae540000fb540000865400008054b1540700d6d69d9d 9d56000700d6d69d9d9d5656ae540000fa540000875400008054b1540700 d69dd69d569d000700d69dd69d569d56ae540000f9540000885400008054 b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000f95400008854 00008054b1540700d69dd69d569d000700d69dd69d569d56ae540000f854 0000895400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae54 0000f75400008a5400008054b1540700d69dd69d569d000700d69dd69d56 9d56ae540000f65400008b5400008054b1540700d6d69d9d9d56000700d6 d69d9d9d5656ae540000f55400008c5400008054b1540700d69dd69d569d 000700d69dd69d569d56ae540000f45400008d5400008054b1540700d6d6 9d9d9d56000700d6d69d9d9d5656ae540000f35400008e5400008054b154 0700d69dd69d569d000700d69dd69d569d56ae540000f25400008f540000 8054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000f1540000 905400008054b1540700d69dd69d569d000700d69dd69d569d56ae540000 f0540000915400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656 ae540000f0540000915400008054b1540700d69dd69d569d000700d69dd6 9d569d56ae540000ef540000925400008054b1540700d6d69d9d9d560007 00d6d69d9d9d5656ae540000ee540000935400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed5492008054b1540700d6d69d9d 9d56000700d6d69d9d9d5656ae540000ed540000cb540016ca5400008054 b1540700d69dd69d569d000700d69dd69d569d56ae540000ed540000cb54 011634cb5400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae 540000ed540000cc540316333333cc5400008054b1540700d69dd69d569d 000700d69dd69d569d56ae540000ed540000cc540317333433cc54000080 54b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000cd 5405171633333433cd5400008054b1540700d69dd69d569d000700d69dd6 9d569d56ae540000ed540000cd5405161733343334cd5400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000ce54fd16fb 33ce5400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000cf540916171634333433343334cf5400008054b1540700d6d6 9d9d9d56000700d6d69d9d9d5656ae540000ed540000cf54091616173333 3334333333cf5400008054b1540700d69dd69d569d000700d69dd69d569d 56ae540000ed540000d0540b171617163433343334333433d05400008054 b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000d054 fc16f833d05400008054b1540700d69dd69d569d000700d69dd69d569d56 ae540000ed540000d1540d1617161716343334333433343334d154000080 54b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000d1 540d1716161634333333343333333433d15400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed540000d2540f17161716173334 333433343334333433d25400008054b1540700d6d69d9d9d56000700d6d6 9d9d9d5656ae540000ed540000d354fa16f433d35400008054b1540700d6 9dd69d569d000700d69dd69d569d56ae540000ed540000d3541116171617 1617333433343334333433343334d35400008054b1540700d6d69d9d9d56 000700d6d69d9d9d5656ae540000ed540000d454fd161017161616343333 33343333333433333334d45400008054b1540700d69dd69d569d000700d6 9dd69d569d56ae540000ed540000d4541317161716171634333433343334 33343334333433d45400008054b1540700d6d69d9d9d56000700d6d69d9d 9d5656ae540000ed540000d554f916f133d55400008054b1540700d69dd6 9d569d000700d69dd69d569d56ae540000ed540000d65416171617161716 1716343334333433343334333433343334d55400008054b1540700d6d69d 9d9d56000700d6d69d9d9d5656ae540000ed540000d65417161716161617 161633343333333433333334333333343333d65400008054b1540700d69d d69d569d000700d69dd69d569d56ae540000ed540000d754191617161716 171617163433343334333433343334333433343334d75400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000d754f816ee 33d75400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000d8541b17161716171617161733343334333433343334333433 343334333433d85400008054b1540700d6d69d9d9d56000700d6d69d9d9d 5656ae540000ed540000d854fd1618171616161716333334333333343333 33343333333433333334d85400008054b1540700d69dd69d569d000700d6 9dd69d569d56ae540000ed540000d9541d16171617161716171617333433 3433343334333433343334333433343334d95400008054b1540700d6d69d 9d9d56000700d6d69d9d9d5656ae540000ed540000da54f516ec33d95400 008054b1540700d69dd69d569d000700d69dd69d569d56ae540000ed5400 00da541f1716171617161716171634333433343334333433343334333433 343334333433da5400008054b1540700d6d69d9d9d56000700d6d69d9d9d 5656ae540000ed540000db54211616171616161716161617333333343333 3334333333343333333433333334333333db5400008054b1540700d69dd6 9d569d000700d69dd69d569d56ae540000ed540000db5421161716171617 16171617163433343334333433343334333433343334333433343334db54 00008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed54 0000dc54f416e833dc5400008054b1540700d69dd69d569d000700d69dd6 9d569d56ae540000ed540000dc5423171617161716171617161716343334 333433343334333433343334333433343334333433dc5400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000dd54251716 161617161616171616163433333334333333343333333433333334333333 343333333433dd5400008054b1540700d69dd69d569d000700d69dd69d56 9d56ae540000ed540000de54271716171617161716171617161733343334 3334333433343334333433343334333433343334333433de5400008054b1 540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000de54f3 16e533de5400008054b1540700d69dd69d569d000700d69dd69d569d56ae 540000ed540000df54291617161716171617161716171617333433343334 33343334333433343334333433343334333433343334df5400008054b154 0700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000df542916 161716161617161616171616163433333334333333343333333433333334 3333333433333334333333df5400008054b1540700d69dd69d569d000700 d69dd69d569d56ae540000ed540000e0542b171617161716171617161716 171634333433343334333433343334333433343334333433343334333433 3433e05400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae54 0000ed540000e054f216e233e05400008054b1540700d69dd69d569d0007 00d69dd69d569d56ae540000ed540000e1542d1617161716171617161716 171617163433343334333433343334333433343334333433343334333433 3433343334e15400008054b1540700d6d69d9d9d56000700d6d69d9d9d56 56ae540000ed540000e2542f161716161617161616171616161716163334 333333343333333433333334333333343333333433333334333333343333 e25400008054b1540700d69dd69d569d000700d69dd69d569d56ae540000 ed540000e2542f1716171617161716171617161716171634333433343334 33343334333433343334333433343334333433343334333433e254000080 54b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000e3 54f016de33e35400008054b1540700d69dd69d569d000700d69dd69d569d 56ae540000ed540000e35431161716171617161716171617161716173334 333433343334333433343334333433343334333433343334333433343334 3334e35400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae54 0000ed540000e454fd163017161616171616161716161617163333343333 333433333334333333343333333433333334333333343333333433333334 e45400008054b1540700d69dd69d569d000700d69dd69d569d56ae540000 ed540000e554341617161716171617161716171617161716173334333433 343334333433343334333433343334333433343334333433343334333433 e45400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000 ed540000e554ee16dc33e55400008054b1540700d69dd69d569d000700d6 9dd69d569d56ae540000ed540000e6543717161716171617161716171617 161716171617333433343334333433343334333433343334333433343334 33343334333433343334333433e65400008054b1540700d6d69d9d9d5600 0700d6d69d9d9d5656ae540000ed540000e6543716171616161716161617 161616171616161733333334333333343333333433333334333333343333 33343333333433333334333333343333e65400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed540000e7543916171617161716 171617161716171617161716343334333433343334333433343334333433 343334333433343334333433343334333433343334e75400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000e754ed16d9 33e75400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000e8543b17161716171617161716171617161716171617163433 343334333433343334333433343334333433343334333433343334333433 3433343334333433e85400008054b1540700d6d69d9d9d56000700d6d69d 9d9d5656ae540000ed540000e9543c171616161716161617161616171616 16171616162e2d3333343333333433333334333333343333333433333334 33333334333333343333333433333334e85400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed540000e9543d16171617161716 1716171617161716171617162e2d2e2d2e33343334333433343334333433 34333433343334333433343334333433343334333433343334e954000080 54b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000ea 54ee16f82dda33ea5400008054b1540700d69dd69d569d000700d69dd69d 569d56ae540000ed540000ea543f17161716171617161716171617161716 172d2e2d2e2d2e2d2e2d2e2d343334333433343334333433343334333433 343334333433343334333433343334333433ea5400008054b1540700d6d6 9d9d9d56000700d6d69d9d9d5656ae540000ed540000eb54411616171616 1617161616171616161716162d2e2d2d2d2e2d2d2d2e2d2d2d2e33333334 333333343333333433333334333333343333333433333334333333343333 33eb5400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000eb5441161716171617161716171617161716172d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e3334333433343334333433343334333433343334 3334333433343334333433343334eb5400008054b1540700d6d69d9d9d56 000700d6d69d9d9d5656ae540000ed540000ec54f016ed2ddf33ec540000 8054b1540700d69dd69d569d000700d69dd69d569d56ae540000ed540000 ed5445161716171617161716171617161716172d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d3433343334333433343334333433343334333433 34333433343334333433343334ed5400008054b1540700d6d69d9d9d5600 0700d6d69d9d9d5656ae540000ed540000ed544517161616171616161716 16161716162d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d33 343333333433333334333333343333333433333334333333343333333433 ed5400008054b1540700d69dd69d569d000700d69dd69d569d56ae540000 ed540000ee54471716171617161716171617161716172d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e333433343334333433343334 33343334333433343334333433343334333433ee5400008054b1540700d6 d69d9d9d56000700d6d69d9d9d5656ae540000ed540000ee54f216e32de3 33ee5400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000ef544916171617161716171617161716172d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d34333433343334 33343334333433343334333433343334333433343334ef5400008054b154 0700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000ef544916 1617161616171616161716162d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e 2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e3333333433333334333333343333 33343333333433333334333333ef5400008054b1540700d69dd69d569d00 0700d69dd69d569d56ae540000ed540000f0544b17161716171617161716 1716172d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e333433343334333433343334333433343334333433 343334333433f05400008054b1540700d6d69d9d9d56000700d6d69d9d9d 5656ae540000ed540000f154f316d92de633f15400008054b1540700d69d d69d569d000700d69dd69d569d56ae540000ed540000f1544d1617161716 171617161716172d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d343334333433343334333433 34333433343334333433343334f15400008054b1540700d6d69d9d9d5600 0700d6d69d9d9d5656ae540000ed540000f2544f16171616161716161617 16162d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d 2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d3334333333343333333433333334 33333334333333343333f25400008054b1540700d69dd69d569d000700d6 9dd69d569d56ae540000ed540000f2544f17161716171617161716172d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e33343334333433343334333433343334 33343334333433f25400008054b1540700d6d69d9d9d56000700d6d69d9d 9d5656ae540000ed540000f354f516cf2dea33f35400008054b1540700d6 9dd69d569d000700d69dd69d569d56ae540000ed540000f4545217161716 171617161716172d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e33 34333433343334333433343334333433343334f35400008054b1540700d6 d69d9d9d56000700d6d69d9d9d5656ae540000ed540000f454fd16501716 16161716162d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d 2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e33 33333433333334333333343333333433333334f45400008054b1540700d6 9dd69d569d000700d69dd69d569d56ae540000ed540000f5545516171617 1617161716172d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d34333433343334333433343334333433343334f55400008054b154 0700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000f554f716 c52dee33f55400008054b1540700d69dd69d569d000700d69dd69d569d56 ae540000ed540000f654571716171617161716172d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e3334333433343334 333433343334333433f65400008054b1540700d6d69d9d9d56000700d6d6 9d9d9d5656ae540000ed540000f6545716171616161716162d2e2d2d2d2e 2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d 2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d3334 3333333433333334333333343333f65400008054b1540700d69dd69d569d 000700d69dd69d569d56ae540000ed540000f75459161716171617162e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d343334333433343334333433343334f75400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000f854f916ba 2df233f75400008054b1540700d69dd69d569d000700d69dd69d569d56ae 540000ed540000f8545b1716171617162e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e33 343334333433343334333433f85400008054b1540700d6d69d9d9d560007 00d6d69d9d9d5656ae540000ed540000f9545d1716161617162d2d2e2d2d 2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e 2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d 2d2e2d2d2d2e2d2d2d2e33333334333333343333333433f95400008054b1 540700d69dd69d569d000700d69dd69d569d56ae540000ed540000f9545d 16171617162e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d34333433343334 33343334f95400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656 ae540000ed540000fa54fb16b02df533fa5400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed540000fa545f171617162e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e333433343334333433fa 5400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed 540000fb5461161617162d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d 2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d 2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d 2d2d2e2d2d333433333334333333fb5400008054b1540700d69dd69d569d 000700d69dd69d569d56ae540000ed540000fc5463171617162e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d34333433343334 33fc5400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae5400 00ed540000fc54fd16a62df933fc5400008054b1540700d69dd69d569d00 0700d69dd69d569d56ae540000ed546d005454541617162e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e33343334 3334545454008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae54 80000100008054b1540700d69dd69d569d000700d69dd69d569d56ad54fb 00f2546d00545417162e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d343334335454008054b1540700 d6d69d9d9d56000700d6d69d9d9d5656a854fc00f65403005454169b2d04 33335454008054b1540700d69dd69d569d000700d69dd69d569d56a454fc 00fa546d0054162e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e333454008054b1540700 d6d69d9d9d56000700d6d69d9d9d5656a054fb006e5400162d2d2e2d2d2d 2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d 2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d 2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d 2d2d2e2d2d2d2e2d2d2d34008054b1540700d69dd69d569d000700d69dd6 9d569d569b5492008054b0540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d565680548054 8054dd540700d69dd69d569d000700d69dd69d569d56805480548054dd54 0700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69d d69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d56 000700d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d6 9dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d 5656805480548054dd540700d69dd69d569d000700d69dd69d569d568054 80548054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054 dd540700d69dd69d569d000700d69dd69d569d56805480548054dd540700 d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d 569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d560007 00d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd6 9d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d565680548054 8054dd540700d69dd69d569d000700d69dd69d569d56805480548054dd54 0700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69d d69d569d000700d69dd69d569d568054a8549400a1540700d6d69d9d9d56 000700d6d69d9d9d56568054a8540000985402005454fc00a5540700d69d d69d569d000700d69dd69d569d568054a854000098540000fa54fc00a954 0700d6d69d9d9d56000700d6d69d9d9d56568054a85401000099540000f6 54fb00ae540700d69dd69d569d000700d69dd69d569d568054a854010000 99540000f154fc00b2540700d6d69d9d9d56000700d6d69d9d9d56568054 a854010000cb54f037de540000ed54fc00b6540700d69dd69d569d000700 d69dd69d569d568054a8548000fb00ba540700d6d69d9d9d56000700d6d6 9d9d9d56568054a85402005400ec54b637f8540000e5540000bb540700d6 9dd69d569d000700d69dd69d569d568054a85402005400ec544a38373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 3837373738373737383737f9540000e5540000bb540700d6d69d9d9d5600 0700d6d69d9d9d56568054a85402005400ed54b337fa540000e5540000bb 540700d69dd69d569d000700d69dd69d569d568054a85402005400ed54fd 374938373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 37373837373738373737383737373837fa540000e5540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a85402005400ee54b137fb540000 e5540000bb540700d69dd69d569d000700d69dd69d569d568054a8540200 5400ef54fd374d3837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 37373738373737383737373837373738373737383737373837fc540000e5 540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854020054 00ef54af37fc540000e5540000bb540700d69dd69d569d000700d69dd69d 569d568054a85402005400f0545637373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 3737383737373854545400e5540000bb540700d6d69d9d9d56000700d6d6 9d9d9d56568054a85402005400f054ad37fd540000e5540000bb540700d6 9dd69d569d000700d69dd69d569d568054a85402005400f1545737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737545400e5540000bb54 0700d6d69d9d9d56000700d6d69d9d9d56568054a85402005400f254a937 015400e5540000bb540700d69dd69d569d000700d69dd69d569d568054a8 5402005400f2545838373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 37373837375400e5540000bb540700d6d69d9d9d56000700d6d69d9d9d56 568054a85402005400f354a7370000e5540000bb540700d69dd69d569d00 0700d69dd69d569d568054a85402005400f354fd37563837373738373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 38373737383737373837373738373737383737e5540000bb540700d6d69d 9d9d56000700d6d69d9d9d56568054a85402005400f454a537e5540000bb 540700d69dd69d569d000700d69dd69d569d568054a85402005400f4545b 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 3837e6540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854 02005400f554a237e7540000bb540700d69dd69d569d000700d69dd69d56 9d568054a85402005400f6545e3737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738e7540000bb540700d6d69d9d 9d56000700d6d69d9d9d56568054a85402005400f654a037e8540000bb54 0700d69dd69d569d000700d69dd69d569d568054a85402005400f7546137 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 37373837373738e9540000bb540700d6d69d9d9d56000700d6d69d9d9d56 568054a85402005400f7549e37e9540000bb540700d69dd69d569d000700 d69dd69d569d568054a85402005400f85463383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 38373737383737373837373738373737383737373837373738373737ea54 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a85402005400 f8549b37eb540000bb540700d69dd69d569d000700d69dd69d569d568054 a85402005400f954fd376238373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 3738373737383737373837373738373737383737eb540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a85402005400fa549837ec540000 bb540700d69dd69d569d000700d69dd69d569d568054a85402005400fa54 683737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 37383737373837373738373737383737ed540000bb540700d6d69d9d9d56 000700d6d69d9d9d56568054a85402005400fb549637ed540000bb540700 d69dd69d569d000700d69dd69d569d568054a85402005400fb546a373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 3837373738373737383737373837ee540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a85402005400fc549437ee540000bb540700d69d d69d569d000700d69dd69d569d568054a85402005400fc546c3837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 3738373737383737373837373738ef540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a854050054005454549137f0540000bb540700d6 9dd69d569d000700d69dd69d569d568054a8547400540054543837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 3738373737383737373837373738373737f0540000bb540700d6d69d9d9d 56000700d6d69d9d9d56568054a8540400540054548f37f1540000bb5407 00d69dd69d569d000700d69dd69d569d568054a854760054005437373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737f2540000bb540700d6 d69d9d9d56000700d6d69d9d9d56568054a85403005400548d37f2540000 bb540700d69dd69d569d000700d69dd69d569d568054a854770054003737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 37373837373738373737383737373837373738373737383737f3540000bb 540700d6d69d9d9d56000700d6d69d9d9d56568054a854020054008a37f4 540000bb540700d69dd69d569d000700d69dd69d569d568054a854780054 003837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 3737373837373738373737383737373837373738373737383737373837f4 540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854020037 008937f5540000bb540700d69dd69d569d000700d69dd69d569d568054a8 547900360037373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 3737373837373738377d3738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 37373724f5540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054 a85402003500c137027c7c7dcc37f4540000bb540700d69dd69d569d0007 00d69dd69d569d568054a854780036003637373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 38373737383737373837373738373737387c7d7c7d7c7d7c383737373837 373738373737383737373837373738373737383737373837373738373737 3837373738373737383737373824f4540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a854040035003536c637087c7d7c7d7c7d7c7d7c d0370024f4540000bb540700d69dd69d569d000700d69dd69d569d568054 a85477003600363636373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737377d7c7d7c7d7c7d7c7d7c7d7c7d37373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383724f3540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8 540600350035363536cc370f7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7cd537 012424f3540000bb540700d69dd69d569d000700d69dd69d569d568054a8 5402003600fb36fd376b3837373738373737383737373837373738373737 3837373738373737383737373837373738373737383737373837377c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c3737383737373837373738373737 38373737383737373837373738373737383737373837373738373724f254 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a85408003500 353635363536d137157d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7cd937012424f2540000bb540700d69dd69d569d000700d69dd69d569d56 8054a85402003600f936fd37693837373738373737383737373837373738 373737383737373837373738373737383737373837373738377d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d37383737373837373738 3737373837373738373737383737373837373738373737383737372424f2 540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8540a0035 003536353635363536d637fd7c187d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7ddd37012424f1540000bb540700d69dd69d569d0007 00d69dd69d569d568054a85402003600f736fd3766383737373837373738 3737373837373738373737383737373837373738373737383737377d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c38 373737383737373837373738373737383737373837373738373737383737 37242424f1540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054 a8540c00350035363536353635363536db37217d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7ce137fd24f15400 00bb540700d69dd69d569d000700d69dd69d569d568054a85402003600f5 36fd37633837373738373737383737373837373738373737383737373837 37373837377c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d3737373837373738373737383737373837 3737383737373837373738242424f0540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a8540e003500353635363536353635363536e037 277c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7d7c7ce537fd24f0540000bb540700d69dd69d569d00 0700d69dd69d569d568054a85402003600f336fd375d3837373738373737 3837373738373737383737373837373738377d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c373738373737383737373837373738373737383737373837fc24f054 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8540f003500 35363536353635363536353635e5372e7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7cea37fc24ef540000bb540700d69dd69d569d000700d69dd69d569d 568054a85402003600f2365e383737373837373738373737383737373837 373738373737387c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d373837 3737383737373837373738373737383737fc24ef540000bb540700d6d69d 9d9d56000700d6d69d9d9d56568054a85411003500353635363536353635 363536353635ea37347d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7dee37fc24ee540000bb540700d69dd69d569d000700d69dd69d569d56 8054a85402003600f0365b38373737383737373837373738373737383737 377d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c383737 37383737373837373738373737fc24ee540000bb540700d6d69d9d9d5600 0700d6d69d9d9d56568054a8541300350035363536353635363536353635 36353635ef373a7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7cf237fb24ee540000bb540700d69dd69d569d000700d69dd6 9d569d568054a85402003600ee365738373737383737373837373738377d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d3737373837373738373737fb24ed540000bb540700d6d69d9d9d5600 0700d6d69d9d9d56568054a8541500350035363536353635363536353635 363536353635f437407c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7cf637fb24ed540000bb540700d69dd69d 569d000700d69dd69d569d568054a85402003600ec365438373737383737 37387c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c37373837373738fa24ed540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a854170054003536353635363536 35363536353635363536353635f937467c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfa37fb 24ec540000bb540700d69dd69d569d000700d69dd69d569d568054a85402 005400ea3651383737377d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d373837fa24 ec540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8546900 5400353635363536353635363536353635363536353635363537377d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d37fa24eb540000bb540700d69dd69d56 9d000700d69dd69d569d568054a8540300540054e9364e7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7dfa24eb540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a854680054005436353635363536353635363536 353635363536353635367c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfa24 ea540000bb540700d69dd69d569d000700d69dd69d569d568054a8540400 54005454ea364d7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfa24ea5400 00bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8546800540054 5435363536353635363536353635363536353635363536357d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7dfb24e9540000bb540700d69dd69d569d000700 d69dd69d569d568054a85405005400545454ea364b7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7dfa24e9540000bb540700d6d69d9d9d56000700d6d69d9d 9d56568054a85402005400fc546035363536353635363536353635363536 35363536357d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24e8540000bb5407 00d69dd69d569d000700d69dd69d569d568054a85402005400fc54ea3649 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24e7540000bb540700d6d69d9d9d56 000700d6d69d9d9d56568054a85402005400fb545e363536353635363536 3536353635363536353635367c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7cfb24e754 0000bb540700d69dd69d569d000700d69dd69d569d568054a85402005400 fb54eb36487d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfb24e6540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a85402005400fa545c3536353635 363536353635363536353635363536357d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24 e6540000bb540700d69dd69d569d000700d69dd69d569d568054a8540200 5400fa54eb36467c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24e5540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a85402005400f9545a3635363536 3536353635363536353635363536357c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7dfb24e554 0000bb540700d69dd69d569d000700d69dd69d569d568054a85402005400 f854ec36447d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7dfb240000e5540000bb540700d6d69d9d 9d56000700d6d69d9d9d56568054a85402005400f8545835363536353635 363536353635363536353635367c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb240000e5540000 bb540700d69dd69d569d000700d69dd69d569d568054a85402005400f754 ed36447d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7dfc24015400e5540000bb540700d6d69d9d9d 56000700d6d69d9d9d56568054a85402005400f754563635363536353635 3635363536353635363536357d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7cfb24015400e5540000bb54 0700d69dd69d569d000700d69dd69d569d568054a85402005400f654ed36 427c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7cfc2402545400e5540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a85402005400f654543536353635363536353635 36353635363536357d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb2402545400e5540000bb540700d69d d69d569d000700d69dd69d569d568054a85402005400f554ed36407d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7dfc24fd540000e5540000bb540700d6d69d9d9d56000700d6d69d9d9d 56568054a85402005400f454513536353635363536353635363536353635 367c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7dfb24fd540000e5540000bb540700d69dd69d569d000700d69d d69d569d568054a85402005400f454ed363e7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfc24fc540000e55400 00bb540700d6d69d9d9d56000700d6d69d9d9d56568054a85402005400f3 544f3635363536353635363536353635363536357d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24fc540000e554 0000bb540700d69dd69d569d000700d69dd69d569d568054a85402005400 f354ee363d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7dfc24fb540000e5540000bb540700d6d69d9d9d56000700 d6d69d9d9d56568054a85402005400f2544e353635363536353635363536 3536353635367c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7cfc24fb540000e5540000bb540700d69dd69d569d000700 d69dd69d569d568054a85402005400f254ee363b7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfc24fa540000e5540000 bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854ee004c363536 35363536353635363536353635367c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7dfc24f900e5540000bb540700d69dd69d 569d000700d69dd69d569d568054a85402005400f054ef36397c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfc24f8540000e6 540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854020054 00f0544a35363536353635363536353635363536357d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7cfc24f7540000e7540000bb 540700d69dd69d569d000700d69dd69d569d568054a85402005400ef54f0 36387c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfc 24f5540000e8540000bb540700d6d69d9d9d56000700d6d69d9d9d565680 54a85402005400ef544836353635363536353635363536353635367c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfc24f4540000e9 540000bb540700d69dd69d569d000700d69dd69d569d568054a854020054 00ee54f036367d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7dfc24f2540000ea540000bb540700d6d69d9d9d56000700d6d69d9d9d56 568054a85402005400ed54453635363536353635363536353635367c7c7c 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7cfc24f1540000eb54 0000bb540700d69dd69d569d000700d69dd69d569d568054a85402005400 ed54f036347c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfc24 ef540000ec540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054 a85402005400ec54433536353635363536353635363536357d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfc24ee540000ed540000bb5407 00d69dd69d569d000700d69dd69d569d568054a85402005400eb54f23637 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c242424ec540000 ee540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8540200 5400e854413536353635363536353635367c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c242424ea540000ef540000bb540700d69dd69d569d00 0700d69dd69d569d568054a85402005400e554f736347d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d2424e9540000ef540000bb540700d6d69d 9d9d56000700d6d69d9d9d56568054a754010000e254393536353635367c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d2424e7540000f0540000bb 540700d69dd69d569d000700d69dd69d569d568054a754010000df54fc36 317c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c24e5540000f1540000bb 540700d6d69d9d9d56000700d6d69d9d9d56568054a754010000dc543135 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c24e3540000f2540000bb5407 00d69dd69d569d000700d69dd69d569d568054a7540100008c540000f354 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a7540100008b 540000f4540000bb540700d69dd69d569d000700d69dd69d569d568054a7 540100008a540000f5540000bb540700d6d69d9d9d56000700d6d69d9d9d 56568054a75401000089540000f6540000bb540700d69dd69d569d000700 d69dd69d569d568054a75401000088540000f7540000bb540700d6d69d9d 9d56000700d6d69d9d9d56568054a75401000087540000f8540000bb5407 00d69dd69d569d000700d69dd69d569d568054a75401000086540000f954 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a75401000085 540000fa540000bb540700d69dd69d569d000700d69dd69d569d568054a7 5401000085540000fa540000bb540700d6d69d9d9d56000700d6d69d9d9d 56568054a75401000084540000fb540000bb540700d69dd69d569d000700 d69dd69d569d568054a75401000083540000fc540000bb540700d6d69d9d 9d56000700d6d69d9d9d56568054a7540100008254040054545400bb5407 00d69dd69d569d000700d69dd69d569d568054a754010000815403005454 00bb540700d6d69d9d9d56000700d6d69d9d9d56568054a7540100008054 02005400bb540700d69dd69d569d000700d69dd69d569d568054a7540100 00805402540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a6 548000fd00ba540700d69dd69d569d000700d69dd69d569d568054805480 54dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd5407 00d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d 9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d00 0700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d6 9d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d 56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480 548054dd540700d69dd69d569d000700d69dd69d569d56805480548054dd 540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d6 9dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d 56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d000700 d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d 9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d5680 5480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054805480 54dd540700d69dd69d569d000700d69dd69d569d56805480548054dd5407 00d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd6 9d569d000700569d569d569d56805480548054dd540700d6d69d569d5600 0000fc56029d5656805480548054dd540200d69dfc56ff000000fcd60256 9d56805480548054dd540000fad6ff000700d6d6d69d9d56568054805480 54dd540200d69dfcd6ff000700d69dd69d569d56805480548054dd540700 d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d 569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d560007 00d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd6 9d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d565680548054 8054dd540700d69dd69d569d000700d69dd69d569d56800080008000dc00 06d6d69d9d9d56000600d6d69d9d9d5680d680d680d6dad6059dd69d569d 007f00d69dd69d569dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6329d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69d9d9d56000200d6d6e49d0156d680 9d809d8f9d0156d6e49d02569d000300d69dd6e59d0256d6d6809d809d91 9d035656d6d6e49d0156007f00d6d69d569d569d569d569d569d569d569d 569d569d569d569d569d569d5656d6d6569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d7f569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d7f 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d32569d569d569d569d569d569d569d569d569d56d6d6 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d00 0100d6e25601d6d6805680568f5601d6d6e356ff00800080008000cd00 grestore showpage %%Trailer geomview-1.9.5/doc/figs/load.ps0000644000175000017500000000724712310110173013250 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: blah-000.ps %%Pages: 1 %%BoundingBox: 173 366 438 426 %%EndComments %%Page: Image0 1 /picstr 1653 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def %%EndProlog %%Page: 1 1 gsave 173.76 366 translate 264.48 60 scale 551 125 8 [ 551 0 0 -125 0 125 ] { inputf picstr readstring pop } false 3 colorimage 78DAEDDD5D729B30180550AF322BF0B6B206EF26AFDD4A33F594D1F0233E8104 C29CF3A049A84308B4BABD58761E0F0038CE4F1BDFDFDF5F5F5F3F005CC1D73F EDF6FF1B0A69E8FC7E5A771C1D7FF5FD1B8D46A3B1FABCDD68C67E1B4267B4BD 96F4F801E859DA141AED7FD4741A858E4B097095DC691707B34DE7BDDD68341A 8DC6FD63A4E9384B46A3D168AC953869A3596A3A56F40150656974A4E9B45B47 0DC01D641ACDECF65AABE6AC97361A8DC6A6E330D97675541B9A8ED56B00B75A 72566BC9749A23A54DA787E307E080A498E657FC199CD17E8E6F3AB3C7BF6A74 F0B534DA2DC0E989D3B4E90467CED1C32ED474840E40574DA7748ED574240EA0 E9B46E3AA33B6C97683A997498BD7318D92E74004D47D3290A9D74FBB68F850E A0E95CA5E994BE0AB56ED3196D5C0DA6A5D6E32F2770C3A6B3743BA8E7A65334 638FBEEFFE7B6B99D0990DBB604801DCA1E92CCD8D9D379DA2D0497327DE744A 6BCEECC76A0EA0E96C0B9DAE9ACE863B6C559ACE52E804B70B1D40D329BAC3D6 CFEAB50D4FEBC49B8E2504002D9ACE77F8699D5BAD5ECB2457E9A2688BA5014D A7567E7DF6EB7400386BA6BDE73B1200A0E9683A009A8EA603A0E9346D3ADBDE 1940D301D074B6E557E9BA654D0740D33932BF36349DE16BF78CBFFBD9B907A3 D168341E33D30EF9B57F3F99A6333C32DD3E7CE14EB5F603C001336DAD5D659A CEF43B3E00609F77D31925D1B07DE841EF3F7A01C05669D3198C4227BD23E78C 01B0337446B9B3B47A4DE80050ABE9ACAE5E133A00D46A3AABAFD3113A009CD8 74FE1096BF10DD1EE185CE21F0F14D4794043D9FCFCE4367E9082F740E014D87 F76CD979E8648EF042E710B84FD37126973CFF0B864E6F47D8C3250E9E43E03E 4DC799143A4207D074848ED001341DA12374840E683A2D9ACEEC1BBEBDB70F0F 283AE0E9AE6E183A4B3F7E644BC5D099DDF9EA952DBD6A4207349DA2D0C96F2F 0D9DE9DC7BABD019FDC8D34F4BA777A1037C58D329CA91D207DF3074325B3201 747CE854B9E24207349D764D67F5BE5966CA1DEEDAA55B467B8BCCCFB307307B 60D3EFD83A74E227333EB11FD37466EFAC46AEB8D0014DA751E84CF362756FF9 1B4DD3BDAD86CED2C6A2833C3D748AAAC401A11339819993297440D3290A9DD9 A7FE57FF73BE34A12DFDDF38F269247456EFE015B589E343A7F479AE9DA1B3B4 5024726583CF40091DD074DA359DFCFD967CD3294A8ACCD4375B9AF237EBDC5E 8B1F4CD115173AA0E9B40B9DC801AFEE6767E8CCDEF929FAD17A089D57070B09 4A9BCECE7308683ADD86CE740CCEE4E786CEAB64F5DAAB9B25D34207E8B3E96C 584890BF4B36BBB7E02C1D79EEFB94D089BF4EE7D5C78B432D24003A6C3AAFD8 92E9A5670166E7DBD5250799AF5ADDD529A19339C8D7A617CE58320D7C52D3B9 39EFBD76D83904341D848ED001341DA12374004D47E8081DA1039A8EA6237484 0EA0E9081DA103DCB0E93C59130C9DDE8EB0AB4BEC1F2C683A12A762E8747884 5D5D62FF6041D39126B542A7CF23ECEA12FB070B376F3A007058D301004D0700 4D0700A1A3E900A0E900A0E9A4AC850620F8EA86FD4DC7E90560B0FA6B3DAB34 1D9D1180C8EF92AED2749C6A0082A1A3E900A0E900A0E9081D00FA693A8F0FE2 6F1140E74D47DC00081D4D47E8007C64D309464F6942B54BB4342E871F01804B 349D6B854EBADB347A00D074840E80A6330D9D74CBF4B992E96C5FF7F1B30935 FDD3D1FEA71F03D07FD319CDEAE77EBCFA484D07E0EA4D6776263F727BFEEE9C D001F898A6D33A5CA6DF54E800683A47361AA103A0E99C153AC14F850EC0A736 9DE33F8E3C52E8007C5ED33965C9F4EA57091D80739BCED06EBCF71A00D59BCE 902C43E80CBCCB3400159B4E1A31E9EDB537BF4F07808A4D27350A1DBF391480 BA4D67367436AF5E0340E8649A4EDDD56B00089D7CD3A9F83A1D00848EA60380 A60380A6136F3A7F00E090A6E30C03100F9D3D4D070082F6371D00280A1D4D07 004D07004D0700341D00341D00D07400D07400D074840E009A0E009A0E00683A 00683A00683A9A0E00A7349D0700EC106F3A3F00B05BB0E9A45B8C46A3D168DC 33E69B4E45EFD2F40DC015B49BB4979A4E8BE3973B0097489CA693F6B4E90CAB 086A8DC3F157DFB3D168341A5B8CED12216D3A5FCD0CA10340FF9A4EDA56F401 70A4BFD6503658 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer geomview-1.9.5/doc/figs/myfilelist.ps0000644000175000017500000023552012310110174014510 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: noname.ps %%Pages: 1 %%BoundingBox: 237 246 375 516 %%EndComments /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 286 string def %%EndProlog %%Page: 1 1 gsave 237.36 246.12 translate 137.28 269.76 scale 286 562 8 [ 286 0 0 -562 0 562 ] { picstr readstring } image 80008000e2000000e3d6019d5680d6a4d6019d56e2d6019d007f00d6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6 d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69d5656d6d61dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69d56000300d69dd6e59d0256d6d6809da59d02 56d6d6e59d02569d000200d6d6e49d0156d6809da49d0156d6e39d015600 7f00d69dd69d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d567f9d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d561d9d569d569d569d569d569d 569d569d569d569d569d569d569dd69d569d007f00d6d69d9d9d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d7f56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d1d569d569d569d569d569d569d569d569d569d569d569d 569dd69d9d9d56000600d69dd69d569d80008000f00006d69dd69d569d00 0700d6d69d9d9d560080d680d6f2d60700d6d69d9d9d56007f00d69dd69d 569d00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6d6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69d9dd6d61d9dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd600d69dd69d569d000800d6d69d9d9d5600d6ea9d0156d6809d bd9d0256d6d6ea9d0156d6ea9d085600d6d69d9d9d56000900d69dd69d56 9d00d6d6eb9d0256d6d6809dbf9d025656d6e99d0556d6d69d9d9df200fc 9d085600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6f19df9 00069d00009d9d0000809dda9d0256d6d6eb9d025656d6fc9d0000f49d0d 009d9d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6 d6f29d010000fa9d0500009d9d0000809ddb9d025656d6e99d0656d6d69d 9d9d00f49d0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6 eb9d025656d6f19d010000f79d010000809dd99d0256d6d6eb9d025656d6 fc9d0000f49d0d00009d9d565600d6d69d9d9d56000900d69dd69d569d00 d6d6eb9d0256d6d6f39d010000fa9d0800009d9d00009d9d9dfc00fc9dfc 00809de99d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d6 9dd69d569d000800d6d69d9d9d5600d6eb9d025656d6f29d010000fa9d15 00009d9d00009d9d00009d9d00009d9d00009d9d0000809de99d0256d6d6 eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00d6 9dd69d569d00d6d69d9df000fd9d0256d6d6f39dfa00139d9d00009d0000 9d9d00009d9d9d00009d9d0000809de69d025656d6f89dfc00f59d0656d6 d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000c00d6d69d9d9d56 00d69d9d9d00f29d05009d9d5656d6f39d010000fa9d0700009d9d00009d 9dfa00fc9dfd00809de79d0256d6d6f99d04009d9d0000f79d025656d6fc 9d0000f49d0d00009d9d565600d6d69d9d9d56000c00d69dd69d569d00d6 d69d9d00f29d0600009d9d56d6d6f49d010000fa9d0800009d9d00009d00 00f59d010000809de99d025656d6f89d04009d9d0000f69d0656d6d69d9d 9d00f49d0d00009d9d9d5600d69dd69d569d000b00d6d69d9d9d5600d69d 9d9def00039d5656d6f39d010000fa9d0800009d9d00009d0000fa9d0600 009d9d9d0000809de89d0256d6d6f99dfb00f79d025656d6fc9d0000f49d 0d00009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6fc9df100 049d9d56d6d6f59d010000fa9d1500009d9d00009d9d00009d9d00009d9d 00009d9d0000809de89d025656d6f79dfc00f69d0656d6d69d9d9d00f49d 0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656 d6f49d010000fa9d0800009d9d00009d9d9dfc00fc9dfc00809de69d0256 d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d560009 00d69dd69d569d00d6d6eb9d0256d6d6809dbf9d025656d6e99d0656d6d6 9d9d9d00f49d0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600 d6eb9d025656d6809dbd9d0256d6d6eb9d025656d6fc9d0000f49d0d0000 9d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6d680 9dbf9d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd6 9d569d000800d6d69d9d9d5600d6eb9d025656d6809dbd9d0256d6d6eb9d 025656d6fc9df1000b9d9d565600d6d69d9d9d56000900d69dd69d569d00 d6d6eb9d0256d6d6809dbf9d025656d6e99d0256d6d6fb9df300fd9d0856 00d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6809dbd9d0256 d6d6eb9d025656d6eb9d09565600d6d69d9d9d56007f00d69dd69d569d00 d69d9d569d569d569d569d569d569d569d569d569d569d56d6569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 7f9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d5656d69d569d569d569d569d569d569d569d569d 569d569d569d56d6561d9d569d569d569d569d569d569d569d569d569d56 9d5600d69dd69d569d0008009d569d9d9d56009de956009d8056bc56009d e856009de9560700d6d69d569d56000000fb56009d80008000f00001d69d fc56ff000000fcd6029d565680df80dff2df0000fad6ff000800d6d6d69d 569d56df80af80aff4af036400d69dfcd6ff000800d6d69d9d9d5656df80 af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4 af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400 d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d 569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d560008 00d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d69d 9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56 df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80 aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af08 6400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d6 9d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d569d 000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d6 9dd69d569d56dff3aff90004af00afaf0080af8daf086400d69dd69d569d 000800d6d69d9d9d5656dff3af0000f9af0600afaf00afaf0080af90af08 6400d6d69d9d9d56000800d69dd69d569d56dff3af0000f6af0300afaf00 80af90af086400d69dd69d569d000800d6d69d9d9d5656dff3af0000f9af 0a00afaf00af000000afafaffc00fdaf0300af000080af9faf086400d6d6 9d9d9d56000800d69dd69d569d56dff3af0000f9af1300afaf00afaf00af afaf0000afaf0000afaf000080af9daf086400d69dd69d569d000800d6d6 9d9d9d5656dff3affa000cafaf00afaf00afaf00afafaf00fcaf0300afaf 0080af9caf086400d6d69d9d9d56000800d69dd69d569d56dff3af0000f9 af0900afaf00afaf00afafaffa0002afaf0080af9caf086400d69dd69d56 9d000800d6d69d9d9d5656dff3af0000f9af0a00afaf00afaf00afafaf00 f9af000080af9caf086400d6d69d9d9d56000800d69dd69d569d56dff3af 0000f9af0a00afaf00afaf00afafaf00f9af000080af9caf086400d69dd6 9d569d000800d6d69d9d9d5656dff3af0000f9af1200afaf00afaf00afaf af0000afaf0000afaf0080af9caf086400d6d69d9d9d56000800d69dd69d 569d56dff3af0000f9af0a00afaf00afafaf0000afaffc00fdaf000080af 9caf086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af0864 00d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd6 9d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d5600 0800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d6 9d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d 56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af 80aff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af80648c64 f4af086400d69dd69d569d000800d6d69d9d9d5656dff4af80648d6400df f4af086400d6d69d9d9d56000800d69dd69d569d56dff4af01646480af90 af01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af0164 6480af90af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56df f4af01646480af90af01dfdff4af086400d69dd69d569d000800d6d69d9d 9d5656dff4af01646480af90af01dfdff4af086400d6d69d9d9d56000800 d69dd69d569d56dff4af01646480af90af01dfdff4af086400d69dd69d56 9d000800d6d69d9d9d5656dff4af01646480af90af01dfdff4af086400d6 d69d9d9d56000800d69dd69d569d56dff4af01646480af90af01dfdff4af 086400d69dd69d569d000800d6d69d9d9d5656dff4af01646480af90af01 dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af016464fa af0000fcaf0000d8af0000eaaf0200af00faaf0000f4af0000d5af0000ea af0000f5af0000f9af0000faaf0000fcaffd00e9af0000fcaf0400afafaf 00f8af01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af 016464faaf0000fcaf0000d8af0000eaaf0200af00faaf0000f4af0000d5 af0000eaaf0000f7affd00fbaffd00faaf0900afaf0000afafaf0000ebaf 0000fcaf0600af00af00af00faaf01dfdff4af086400d6d69d9d9d560008 00d69dd69d569d56dff4af016464faaf0400afafaf00d8af0000eaaf0300 afaf00eeaf0000beaf0000f4af0000f9af0000fbaf0400afafaf00fbaf00 00e7af0600afafaf000000f9af01dfdff4af086400d69dd69d569d000800 d6d69d9d9d5656dff4af016464faaf0b00afafaf00afaf00af000000fcaf fd0009af00afaf00af0000afaffc00fdaf0400af000000fcaf0f00afafaf 000000afafaf00af0000afaffc00fdaf1100afaf00af000000afaf00afaf 00af000000fcaf0b00afafaf000000af00afafaffc00fcaffc00fdaf0a00 af0000afaf0000afaf00fbaf0500af00afafaffc0016afaf00afafaf00af afaf00afafaf00af0000afafaf0000fcaf0000f9af0000fbaf0300afaf00 f9af0000faaffd00fcaffd000faf00afaf00afafaf00afaf00af00af00fa af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af0164 64fbaf7f0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000 afafaf0000afaf0000afaf0000afaf0000afafaf00afaf00afafaf00afaf 0000afafaf0000afaf0000afaf00afaf0000afaf0000af00afaf0000afaf 0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000 afaf0000afaf0000afaf00af0000fbaf1f00af00afaf0000afaf0000af00 afafaf00afafaf00afafaf00afaf00afafaf00fbaf0000f9af0000fbaf03 00afaf00f9af0000fbaf1300afafaf00afaf0000afaf0000afaf00afafaf 00fcaf0000f8af01dfdff4af086400d69dd69d569d000800d6d69d9d9d56 56dff4af016464faaf0700afaf00afafaf00fcaf0300afaf00fcaf0300af af00f7af0300afaf00fcaf0800afaf00afafaf0000fbaf0000fcaf0000fa af0400afafaf00fcaf0500af00afaf00fcaf0700afaf00afafaf00fcaf03 00afaf00fcaf0300afaf00fcaf1800afaf00afafaf00afafaf00afaf00af afaf00afaf00afaf00fcaf0d00af00afafaf00afafaf00afaf00fcaf0200 af00faaf0000f9af0000fcaf0400afafaf00f9af0000fbaf010000fbaf00 00fcaf0600afaf00afaf00f2af01dfdff4af086400d6d69d9d9d56000800 d69dd69d569d56dff4af016464faaf0700afaf00afafaf00fcaf0300afaf 00fcaf0300afaf00fbaffb0002afaf00fcaf0300afaf00fcaffd00fdaf00 00fcaf0000faaf0400afafaf00fcaf0500af00afaf00fcaf0700afaf00af afaf00fcaf0200afaffa0002afaf00fcaf1700afaf00afafaf00afafaf00 afaf00afafaf00afaf00afaffa000cafaf00afaf00afaf00afafaf00fbaf 0000f9af0000f9af0000fcaf0400afafaf00f9af0000faaffd00fdaf0000 fcaf0600afaf00afaf00f2af01dfdff4af086400d69dd69d569d000800d6 d69d9d9d5656dff4af016464faaf0700afaf00afafaf00fcaf0300afaf00 fcaf0300afaf00fcaf080000afafaf00afaf00fcaf0300afaf00faaf0400 00afaf00fcaf0000faaf0400afafaf00fcaf0500af00afaf00fcaf0700af af00afafaf00fcaf0300afaf00f9af0000fcaf1800afaf00afafaf00afaf af00afaf00afafaf00afaf00afaf00f9af0a00afaf00afaf00afafaf00fb af0000f9af0000f9af0000fcaf0400afafaf00f9af0000f8af040000afaf 00fcaf0600afaf00afaf00f2af01dfdff4af086400d6d69d9d9d56000800 d69dd69d569d56dff4af016464faaf0200af00fcaf0000fcaf0300afaf00 fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf0200af00f8af0300afaf 00fcaf0000fcaf010000fcaf0000fcaf0500af00afaf00fcaf0200af00fc af0000fcaf0300afaf00f9af0000fcaf1800afaf00afafaf00afafaf00af afaf00af00afafaf00afaf00f9af0900af00af00af00afaf00fbaf0200af 00faaf0000f9af0400afafaf00fbaf0000fbaf0000f6af0300afaf00fcaf 0500afaf00af00f1af01dfdff4af086400d69dd69d569d000800d6d69d9d 9d5656dff4af016464fbaf030000af00fcaf0000fcaf0b00afaf0000afaf 0000afaf00fcaf0f0000afaf0000afaf0000afaf0000af00fcaf0700afaf af00afaf00fcaf060000afaf000000fcaf0a0000afaf0000af00afaf00fc af0200af00fcaf3e0000afaf0000afaf0000afaf0000afaf0000afaf0000 afaf00afafaf00afafaf00afafaf00af00afafaf00afaf0000afaf0000af afaf00afafaf00afafaf00fcaf0400afafaf00fbaf0000f9af0400afafaf 00fbaf1e0000afafaf0000afafaf00afaf00afafaf00afaf0000afaf0000 afaf00af00f1af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d 56dff4af016464faaf0200af00fcaf0000fcaf0b00afafaf000000af00af af00fbaffd000baf0000af00af000000afaf00fbaffd00fdaf0000fbaffc 0001af00fcaf0a00af000000afaf00afaf00fcaf0200af00fbaffd0004af 00afafaffc00fcaffc00fdaf0800afafaf00afafaf00fcaf0000fcaf0300 afafaffc00fcaf1200afafaf00afafaf00afafaf0000afafaf0000fcaf00 00f9af0400afafaf00f9affd00fbaf0600afafaf000000fcaffd0006af00 afaf00af00f1af01dfdff4af086400d69dd69d569d000800d6d69d9d9d56 56dff4af016464e6af0000f1af0000c3af00008eaf0000ecaf01dfdff4af 086400d6d69d9d9d56000800d69dd69d569d56dff4af016464ebaf050000 afaf0000f1af0000c8af050000afaf000093af050000afaf0000ecaf01df dff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af016464eaaf fc00f0af0000c7affc0091affc00ebaf01dfdff4af086400d6d69d9d9d56 000800d69dd69d569d56dff4af01646480af90af01dfdff4af086400d69d d69d569d000800d6d69d9d9d5656dff4af01646480af90af01dfdff4af08 6400d6d69d9d9d56000800d69dd69d569d56dff4af01646480af90af01df dff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af01646480af 90af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af01 646480af90af01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656 dff4af01646480df8edff4af086400d6d69d9d9d56000800d69dd69d569d 56dff4af006480df8ddff4af086400d69dd69d569d000800d6d69d9d9d56 56df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af 80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af 086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d6 9dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d 56000800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800 d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d 569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df 80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80af f4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af0864 00d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd6 9d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d5600 0800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d6 9d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d 56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656dff3af fb00fbaf0000d9af0000b7aff90004af00afaf0089af086400d6d69d9d9d 56000800d69dd69d569d56dff3af0000fcaf050000afafaf00eaaf0000f0 af0000b7af0000f9af0300afaf0089af086400d69dd69d569d000800d6d6 9d9d9d5656dff3af0000fbaf0000e6af0000a6af0000f6af000089af0864 00d6d69d9d9d56000800d69dd69d569d56dff3af0000faaf0b00afaf00af af00af0000afaffc00fcaffc0006af000000afafaffc00fdaf0800af0000 af00afafaffc00fcaffd00c5af0000f9af0600afaf00afafaffc00fcaffd 0097af086400d69dd69d569d000800d6d69d9d9d5656dff3af0000faaf3a 00afaf00afaf0000afafaf0000afaf0000afaf0000afaf0000af00afafaf 0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf00afafaf00c6 af0000f9af1200afaf00afaf0000afaf0000afaf00afafaf0098af086400 d6d69d9d9d56000800d69dd69d569d56dff3af0000faaf0600afaf00afaf 00fcaf0000fcaf0300afaf00faaf0400afafaf00fcaf0300afaf00fcaf03 00afaf00fcaf0400afaf0000c3affa0008afaf00afaf00afaf00fcaf0400 afaf000095af086400d69dd69d569d000800d6d69d9d9d5656dff3af0000 faaf0600afaf00afaf00fcaffa0002afaf00faaf0400afafaf00fcaf0300 afaf00fcaf0200afaffa00fdaffd00c5af0000f9af0500afaf00afaffa00 fdaffd0097af086400d6d69d9d9d56000800d69dd69d569d56dff3af0000 faaf0600afaf00afaf00fcaf0000f9af0000faaf0400afafaf00fcaf0300 afaf00fcaf0300afaf00f6af010000c6af0000f9af0600afaf00afaf00f6 af01000098af086400d69dd69d569d000800d6d69d9d9d5656dff3af0000 fbaf0700afafaf00afaf00fcaf0000f9af0000fcaf0600af00afafaf00fc af0300afaf00fcaf0300afaf00f5af0000c6af0000f9af0600afaf00afaf 00f5af000098af086400d6d69d9d9d56000800d69dd69d569d56dff3af00 00fcaf080000afafaf00afaf00fcaf1b0000afaf0000afaf0000afaf0000 af00afafaf0000afaf0000afaf00fcaf0f00afaf0000afaf0000afaf00af afaf00c6af0000f9af1200afaf00afaf0000afaf0000afaf00afafaf0098 af086400d69dd69d569d000800d6d69d9d9d5656dff3affb00fbaf0300af af00fbaffc00fcaffc00fdaf030000afaffc00fdaf0000fcaf0300afafaf fc00fcaffd00c5af0000f9af0600afaf00afafaffc00fcaffd0097af0864 00d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd6 9d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d5600 0800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d6 9d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d 56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656dff6af a164fcaff164f6af9864fcaff164f5af086400d6d69d9d9d56000800d69d d69d569d56dff6afa26400dffcaff26400dff6af996400dffcaff26400df f5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01 dfdffcaf016464fb9500dffb9501dfdff6af0164649caf01dfdffcaf0164 64fb9500dffb9501dfdff5af086400d6d69d9d9d56000800d69dd69d569d 56dff6af016464a5af01dfdffcaf016464fc9502dfdf64fc9501dfdff6af 0164649caf01dfdffcaf016464fc9502dfdf64fc9501dfdff5af086400d6 9dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf0164 64fc9502dfdf64fc9501dfdff6af0164649caf01dfdffcaf016464fc9502 dfdf64fc9501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56df f6af046464afafafab00fdaf01dfdffcaf0e6464959595dfdfaf64649595 95dfdff6af0164649caf01dfdffcaf0e6464959595dfdfaf6464959595df dff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af046464afaf afab00fdaf01dfdffcaf0e6464959595dfdfaf6464959595dfdff6af0164 649caf01dfdffcaf0e6464959595dfdfaf6464959595dfdff5af086400d6 d69d9d9d56000800d69dd69d569d56dff6af046464afafaff10000aff500 00aff90000affa0000affc00fdafe90000affc0000affa00fdaf01dfdffc af0e64649595dfdfafafaf64649595dfdff6af016464fcaff90006afaf00 afafaf00faaff900fcaffd00c2af01dfdffcaf0e64649595dfdfafafaf64 649595dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af04 6464afafaff10000aff700fdaffb00fdaffa0009af0000afaf000000afaf eb0000affc0000affa00fdaf01dfdffcaf0e64649595dfdfafafaf646495 95dfdff6af016464fcaf0000f8af0400afafaf00faaf0000f8af060000af afaf0000c4af01dfdffcaf0e64649595dfdfafafaf64649595dfdff5af08 6400d6d69d9d9d56000800d69dd69d569d56dff6af046464afafaff20000 aff40000aff90000affb0004af000000affb0000afe70000aff900fdaf01 dfdffcaf04646495dfdffbaf04646495dfdff6af016464fcaf0000f8af04 00afafaf00faaf0000f8af0000fbaf0000c4af01dfdffcaf04646495dfdf fbaf04646495dfdff5af086400d69dd69d569d000800d6d69d9d9d5656df f6af1b6464afafaf0000af000000af000000af000000af00afaf000000af affc0000aff90000affb0003af0000aff90000affa00fdaffc00fdaf0800 af0000af000000aff900fdaf01dfdffcaf04646495dfdffbaf04646495df dff6af016464fcaf0000f8af0400afafaf00faaf0000f8af0000beaf01df dffcaf04646495dfdffbaf04646495dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464fcaf1400af000000af000000af000000 af0000af000000affb0000aff90000affb0003af0000aff90000affb0013 af000000af0000afaf0000afaf0000af000000aff900fdaf01dfdffcaf03 6464dfdff76401dfdff6af016464fcaf0000f8af0400afafaf00faaf0000 f7af010000c0af01dfdffcaf036464dfdff76401dfdff5af086400d69dd6 9d569d000800d6d69d9d9d5656dff6af016464fcaf0c00af000000af0000 00af0000affc0002af00affa0000aff90000affc0004af000000aff90000 affb0001afaffb0000affc0006af0000af0000aff800fdaf01dfdffcaf02 6464dff66401dfdff6af016464fcaffa00fdaf0400afafaf00faaffa00fa af010000c2af01dfdffcaf026464dff66401dfdff5af086400d6d69d9d9d 56000800d69dd69d569d56dff6af016464fcaf0c0000af0000af0000af00 0000affb0000aff90000aff90000affc0004af000000aff90000affa00fd affd0000affc0006af0000af0000aff800fdaf01dfdffcaf016464f59501 dfdff6af016464fcaf0000f8af0400afafaf00faaf0000f3af010000c4af 01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d 9d9d5656dff6af126464afafaf000000af0000af0000af000000affb0000 aff90000aff90000affc0004af000000aff90000aff80004afaf0000affc 0006af0000af0000aff800fdaf01dfdffcaf016464f3dff6af016464fcaf 0000f8af0400afafaf00faaf0000f2af0000c4af01dfdffcaf016464f3df f5af086400d6d69d9d9d56000800d69dd69d569d56dff6af116464afafaf 000000af00af00af00af0000affb0002af00affa0000aff90004af000000 affb0000affb0000aff60003af0000affc0005af0000af00aff700fdaf01 dfdffcaf016464f6df0264dfdff6af016464fcaf0000f8af0400afafaf00 faaf0000f8af0000fbaf0000c4af01dfdffcaf016464f6df0264dfdff5af 086400d69dd69d569d000800d6d69d9d9d5656dff6af016464fcaffd0008 af000000af000000affc0004af000000affb0000aff90004af000000affb 001eafaf000000afaf000000af0000af000000af0000afaf0000afaf0000 af00affc0000affc00fdaf01dfdffcaf036464dfdff9af036464dfdff6af 016464fcaf0000f8af0400afafaf00faaf0000f8af060000afafaf0000c4 af01dfdffcaf036464dfdff9af036464dfdff5af086400d6d69d9d9d5600 0800d69dd69d569d56dff6af046464afafaffc0012af000000af000000af 000000afaf000000afaffc0000aff90004af000000aff900fdaffb0006af 000000afafaffc00fdaf0600af0000af00affc0000affc00fdaf01dfdffc af036464dfdff9af036464dfdff6af016464fcaf0000f8af0300afafaffa 0000aff900fcaffd00c2af01dfdffcaf036464dfdff9af036464dfdff5af 086400d69dd69d569d000800d6d69d9d9d5656dff6af046464afafafba00 00aff200fdaf01dfdffcaf036464dfdff9af036464dfdff6af0164649caf 01dfdffcaf036464dfdff9af036464dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af046464afafafbf0005afaf0000afaff200fdaf 01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf03 6464dfdff9af036464dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af046464afafafbe00fcaff100fdaf01dfdffcaf036464dfdff9 af036464dfdff6af0164649caf01dfdffcaf036464dfdff9af036464dfdf f5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01 dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf0364 64dfdff9af036464dfdff5af086400d69dd69d569d000800d6d69d9d9d56 56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164 649caf01dfdffcaf036464dfdff9af036464dfdff5af086400d6d69d9d9d 56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9 af036464dfdff6af0164649caf01dfdffcaf036464dfdff9af036464dfdf f5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01 dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf0364 64dfdff9af036464dfdff5af086400d6d69d9d9d56000800d69dd69d569d 56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164 649caf01dfdffcaf036464dfdff9af036464dfdff5af086400d69dd69d56 9d000800d6d69d9d9d5656dff6af016464eeaf0000f5af0000f9af0000fa af0000fcaffd00e9af0000fcaf0000f7af01dfdffcaf036464dfdff9af03 6464dfdff6af056464afafaf00f7af0000f6af0000f1af060000af00afaf 00cbaf01dfdffcaf036464dfdff9af036464dfdff5af086400d6d69d9d9d 56000800d69dd69d569d56dff6af016464eeaf0000f7affd00fbaffd00fa af0900afaf0000afafaf0000ebaf0000fcaf0000f7af01dfdffcaf036464 dfdff9af036464dfdff6af066464afafaf0000f9af010000f6af0000f2af 0700afafaf00afaf00cbaf01dfdffcaf036464dfdff76401dfdff5af0864 00d69dd69d569d000800d6d69d9d9d5656dff6af016464efaf0000f4af00 00f9af0000fbaf0400afafaf00fbaf0000e7af0000f6af01dfdffcaf0364 64dfdff9af036464dfdff6af066464afafaf0000f9af010000f6af0000f2 af0000faaf0000cbaf01dfdffcaf026464dff66401dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af016464fbaf1400afafaf00afaf af00afafaf00af0000afafaf0000fcaf0000f9af0000fbaf0300afaf00f9 af0000faaffd00fcaffd0008af00afaf00afafaf00f6af01dfdffcaf0364 64dfdff9af036464dfdff6af076464afafaf00af00fbaf0500af00afafaf fc00fdaf0700afafaf00afafaffc000dafaf000000afaf00afaf00afafaf fc00d2af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af1a6464afafaf00af00afafaf00afafaf00afaf af00afaf00afafaf00fbaf0000f9af0000fbaf0300afaf00f9af0000fbaf 1300afafaf00afaf0000afaf0000afaf00afafaf00f6af01dfdffcaf0364 64dfdff9af036464dfdff6af076464afafaf00af00fbaf2b00af00afaf00 00afaf0000afaf00afaf00afafaf0000afaf0000afaf00afafaf00afaf00 afaf0000afaf0000d3af01dfdffcaf016464f59501dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af126464afafaf00af00afafaf00 afafaf00afaf00fcaf0200af00faaf0000f9af0000fcaf0400afafaf00f9 af0000fbaf010000fbaf0000fcaf0600afaf00afaf00f5af01dfdffcaf03 6464dfdff9af036464dfdff6af0f6464afafaf00afaf00afafaf00afaf00 f9af0500afaf00af00fcaf0000fcaf0d00afaf00afafaf00afaf00afaf00 fcaf0000d3af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d 000800d6d69d9d9d5656dff6af126464afafaf00afaf00afaf00afaf00af afaf00fbaf0000f9af0000f9af0000fcaf0400afafaf00f9af0000faaffd 00fdaf0000fcaf0600afaf00afaf00f5af01dfdffcaf036464dfdff9af03 6464dfdff6af126464afafaf00afaf00afafaf00afaf00afafaffb0003af af0000fbaffa000bafaf00afafaf00afaf00afaffa00d3af01dfdffcaf01 6464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6 af016464faaf0a00afaf00afaf00afafaf00fbaf0000f9af0000f9af0000 fcaf0400afafaf00f9af0000f8af040000afaf00fcaf0600afaf00afaf00 f5af01dfdffcaf036464dfdff9af036464dfdff6af1c6464afafaf00afaf af00af00afafaf00afaf0000afafaf00afaf00af00fcaf0000f9af0a00af afaf00afaf00afaf00ceaf01dfdffcaf016464f59501dfdff5af086400d6 9dd69d569d000800d6d69d9d9d5656dff6af016464faaf0900af00af00af 00afaf00fbaf0200af00faaf0000f9af0400afafaf00fbaf0000fbaf0000 f6af0300afaf00fcaf0500afaf00af00f4af01dfdffcaf036464dfdff9af 036464dfdff6af126464afafaf00afafaf00af00afafaf00afaf00fcaf0a 00afaf00afaf00afafaf00f9af0a00afafaf00afaf00afaf00ceaf01dfdf fcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d 56dff6af116464afafaf00afafaf00afafaf00afafaf00fcaf0400afafaf 00fbaf0000f9af0400afafaf00fbaf1e0000afafaf0000afafaf00afaf00 afafaf00afaf0000afaf0000afaf00af00fcaf0300afaf00fcaf01dfdffc af036464dfdff9af036464dfdff6af056464afafaf00fcaf0000fcaf2900 afaf0000afaf0000afaf00afafaf00afaf0000afaf0000afaf00afafaf00 afaf00afaf0000afaf0000d3af01dfdffcaf016464f59501dfdff5af0864 00d69dd69d569d000800d6d69d9d9d5656dff6af016464f9af1200afafaf 00afafaf00afafaf0000afafaf0000fcaf0000f9af0400afafaf00f9affd 00fbaf0600afafaf000000fcaffd0006af00afaf00af00fcaf0300afaf00 fcaf01dfdffcaf036464dfdff9af036464dfdff6af056464afafaf00fcaf 0000fcaf0b00afafaf000000af0000af00fcaf0200afaffc00fdaf0a00af afaf00afaf00afafaffc00d2af01dfdffcaf016464f59501dfdff5af0864 00d6d69d9d9d56000800d69dd69d569d56dff6af016464b7af0000efaf01 dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf0164 64f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af 016464bcaf050000afaf0000efaf01dfdffcaf036464dfdff9af036464df dff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d 9d56000800d69dd69d569d56dff6af016464bbaffc00eeaf01dfdffcaf03 6464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501df dff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af 01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf01 6464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6 af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf 01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d 9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6 af0164649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56 000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af 036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400 d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf03 6464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501df dff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af 01dfdffcaf036464dfdff9af036464dfdff6af056464afafaf00f7af0300 afaf00f5af0000b9af01dfdffcaf016464f59501dfdff5af086400d69dd6 9d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464df dff9af036464dfdff6af066464afafaf0000f9af040000afaf00f5af0000 b9af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d6 9dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464df dff6af066464afafaf0000f9af040000afaf00f5af0000b9af01dfdffcaf 016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656df f6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af076464af afaf00af00fbaf1400af00afaf00afafaf00afafaf000000af00afafaffc 00fdaf0400af000000c8af01dfdffcaf016464f59501dfdff5af086400d6 d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf0364 64dfdff9af036464dfdff6af076464afafaf00af00fbaf2100af00afaf00 afaf00afafaf0000afaf0000afaf0000afaf0000afaf0000afaf0000c9af 01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d 9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6 af146464afafaf00afaf00afafaf00afaf00afaf00af00fcaf0000fcaf03 00afaf00fcaf0300afaf00fcaf0000c9af01dfdffcaf016464f59501dfdf f5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01 dfdffcaf036464dfdff9af036464dfdff6af136464afafaf00afaf00afaf af00afaf00afaf0000fbaf0000fcaf0200afaffa0002afaf00fcaf0000c9 af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d6 9d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af146464afafaf00afafaf00af00afafaf00afaf00af00fcaf0000fcaf 0300afaf00f9af0000fcaf0000c9af01dfdffcaf016464f59501dfdff5af 086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdf fcaf036464dfdff9af036464dfdff6af196464afafaf00afafaf00af00af afaf00afaf00afaf00afafaf00fcaf0300afaf00f9af0000fcaf0000c9af 01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d 9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6 af056464afafaf00fcaf0000fcaf1f00afaf00afafaf00afaf0000afaf00 00afaf0000afaf0000afaf0000afaf0000c9af01dfdffcaf016464f59501 dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5 af01dfdffcaf036464dfdff9af036464dfdff6af056464afafaf00fcaf00 00fcaf0300afaf00fcaf0a00afaf000000af00afafaffc00fdaf0400af00 0000c8af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af016464d9af0000c4af01dfdffcaf016464f59501dfdff5af08 6400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffc af036464dfdff9af036464dfdff6af016464d9af0000c4af01dfdffcaf01 6464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6 af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af016464d9af 0000c4af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d69d d69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af016464fcaf0000f3af0300afaf00f9af0300afaf00f5af0100 00caaf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800 d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaf0000f3af0300afaf00f9af0300afaf00f6af0000c8 af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d6 9d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af016464fcaf0000f0af0000f9af0000f3af0000c8af01dfdffcaf0164 64f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af 016464a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf07 00af000000afaf00fcaf1f00af00afaf00afafaf000000af00afaf00afaf 00af000000afaf000000afafaffc00f9affc00dbaf01dfdffcaf016464f5 9501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af0164 64a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf070000 afaf0000af00fcaf2400af00afaf00afaf0000afaf0000afaf00afaf0000 afaf0000afaf00afafaf0000afaf0000fbaf050000afaf0000dcaf01dfdf fcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d 56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164 64fcaf0000fcaf0200af00fcaf0800af00afaf00afaf00fcaf0600afaf00 afaf00fcaf0700afaf00afafaf00fcaf0000fbaf0000d7af01dfdffcaf01 6464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6 af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf 0000fcaf0200af00fcaf0800af00afaf00afaf00fcaf0600afaf00afaf00 fcaf0700afaf00afafaf00fcaf0000fbaf0000d7af01dfdffcaf016464f5 9501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af0164 64a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000fc af0200af00fcaf0800af00afaf00afaf00fcaf0600afaf00afaf00fcaf07 00afaf00afafaf00fcaf0000fbaf0000d7af01dfdffcaf016464f59501df dff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af 01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000fcaf0200 af00fcaf0800af00afaf00afaf00fcaf0600afaf00afaf00fcaf0700afaf 00afafaf00fcaf0000fbaf0000fcaf0000dcaf01dfdffcaf016464f59501 dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5 af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf1f0000afaf 0000af0000afaf0000af00afaf00afaf0000afaf0000afaf00afaf00fcaf 1700afaf00afafaf0000afaf0000afaf00afaf0000afaf0000dcaf01dfdf fcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d56 56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164 64fcaf1f00af000000afafaf000000af00af00afaf00afafaf000000af00 afaf00afaf00fcaf0300afaf00fcaffc00fdaf0300afafaffc00dbaf01df dffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d69d d69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af016464fcaf0000f3af0300afaf 00f9af0300afaf00f5af010000caaf01dfdffcaf016464f59501dfdff5af 086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdf fcaf036464dfdff9af036464dfdff6af016464fcaf0000f3af0300afaf00 f9af0300afaf00f6af0000c8af01dfdffcaf016464f59501dfdff5af0864 00d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af016464fcaf0000f0af0000f9af0000f3 af0000c8af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d00 0800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af03 6464dfdff6af016464fcaf0700af000000afaf00fcaf1f00af00afaf00af afaf000000af00afaf00afaf00af000000afaf000000afafaffc00f9affc 00dbaf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800 d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaf070000afaf0000af00fcaf2400af00afaf00afaf00 00afaf0000afaf00afaf0000afaf0000afaf00afafaf0000afaf0000fbaf 050000afaf0000dcaf01dfdffcaf016464f59501dfdff5af086400d69dd6 9d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464df dff9af036464dfdff6af016464fcaf0000fcaf0200af00fcaf0800af00af af00afaf00fcaf0600afaf00afaf00fcaf0700afaf00afafaf00fcaf0000 fbaf0000fcaf0000dcaf01dfdffcaf016464f59501dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af016464fcaf0000fcaf0200af00fcaf0800af00 afaf00afaf00fcaf0600afaf00afaf00fcaf0700afaf00afafaf00fcaf00 00fbaf0000fcaf0000dcaf01dfdffcaf016464f59501dfdff5af086400d6 9dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf0364 64dfdff9af036464dfdff6af016464fcaf0000fcaf0200af00fcaf0800af 00afaf00afaf00fcaf0600afaf00afaf00fcaf0700afaf00afafaf00fcaf 0000fbaf0000fcaf0000dcaf01dfdffcaf016464f59501dfdff5af086400 d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf03 6464dfdff9af036464dfdff6af016464fcaf0000fcaf0200af00fcaf0800 af00afaf00afaf00fcaf0600afaf00afaf00fcaf0700afaf00afafaf00fc af0000fbaf0000fcaf0000dcaf01dfdffcaf016464f59501dfdff5af0864 00d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af016464fcaf1f0000afaf0000af0000af af0000af00afaf00afaf0000afaf0000afaf00afaf00fcaf1700afaf00af afaf0000afaf0000afaf00afaf0000afaf0000dcaf01dfdffcaf016464f5 9501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af0164 64a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf1f00af 000000afafaf000000af00af00afaf00afafaf000000af00afaf00afaf00 fcaf0300afaf00fcaffc00fdaf0300afafaffc00dbaf01dfdffcaf016464 f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d69d d69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fbaffc00fdaffc00fdaf1200af0000afaf0000afafaf00af0000afaf 0000f9affc00cdaf01dfdffcaf016464f59501dfdff5af086400d69dd69d 569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdf f9af036464dfdff6af016464fcaf220000afaf0000af0000afaf0000afaf 0000afaf0000afaf00afaf0000afaf0000afaf00fbaf050000afaf0000ce af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69d d69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af016464fcaf0000faaf0000fcaf1600afaf00afafaf00afafaf00afaf 00afafaf00afafaf00fbaf0000c9af01dfdffcaf016464f59501dfdff5af 086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdf fcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0000fcaf16 00afaf00afafaf00afafaf00afaf00afafaf00afafaf00fbaf0000c9af01 dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d 569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af 016464fcaf0000faaf0000fcaf1600afaf00afafaf00afafaf00afaf00af afaf00afafaf00fbaf0000c9af01dfdffcaf016464f59501dfdff5af0864 00d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af016464fcaf0000fcaf0200af00fcaf16 00afaf00afafaf00afafaf00afaf00afafaf00afafaf00fbaf0000fcaf00 00ceaf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800 d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaf2d0000afaf0000af0000afaf0000afaf00afafaf00 afafaf00afaf00afafaf00afafaf00afaf00afaf0000afaf0000ceaf01df dffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fbaffc00fdaffc00fdaf1900afafaf00afafaf00afaf00afafaf00af afaf00afaf00afafaffc00cdaf01dfdffcaf016464f59501dfdff5af0864 00d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501 dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5 af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf 016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56df f6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649c af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d6 9d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af0164649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d 56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9 af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af0864 00d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501 dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5 af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf 016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656df f6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649c af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69d d69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af0164649caf01dfdffcaf016464f59501dfdff5af086400d69dd69d56 9d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9 af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af0864 00d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501 dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5 af01dfdffcaf036464dfdff9af036464dfdff6af016464fbaffc00fdaffc 00fdaf1200af0000afaf0000afafaf00af0000afaf0000f9affc00cdaf01 dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d 569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af 016464fcaf220000afaf0000af0000afaf0000afaf0000afaf0000afaf00 afaf0000afaf0000afaf00fbaf050000afaf0000ceaf01dfdffcaf016464 f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000 faaf0000fcaf1600afaf00afafaf00afafaf00afaf00afafaf00afafaf00 fbaf0000fcaf0000ceaf01dfdffcaf016464f59501dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af016464fcaf0000faaf0000fcaf1600afaf00af afaf00afafaf00afaf00afafaf00afafaf00fbaf0000fcaf0000ceaf01df dffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fcaf0000faaf0000fcaf1600afaf00afafaf00afafaf00afaf00afaf af00afafaf00fbaf0000fcaf0000ceaf01dfdffcaf016464f59501dfdff5 af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af016464fcaf0000fcaf0200af00 fcaf1600afaf00afafaf00afafaf00afaf00afafaf00afafaf00fbaf0000 fcaf0000ceaf01dfdffcaf016464f59501dfdff5af086400d69dd69d569d 000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af 036464dfdff6af016464fcaf2d0000afaf0000af0000afaf0000afaf00af afaf00afafaf00afaf00afafaf00afafaf00afaf00afaf0000afaf0000ce af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69d d69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af016464fbaffc00fdaffc00fdaf1900afafaf00afafaf00afaf00afaf af00afafaf00afaf00afafaffc00cdaf01dfdffcaf016464f59501dfdff5 af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d69d d69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af016464f7af0000a6af01dfdffcaf016464f59501dfdff5af08 6400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffc af036464dfdff9af036464dfdff6af016464f7af0000a6af01dfdffcaf01 6464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6 af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af016464f7af 0000a6af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff76401df dff6af016464fbaffd0009af00afaf00af0000afaffc000dafaf00afafaf 00afafaf00afafaffc00fdaf0300af0000fbaffc00d4af01dfdffcaf0164 64f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af 016464a5af01dfdffcaf026464dff66401dfdff6af016464fcaf280000af af0000afaf0000afafaf0000afaf0000af00afafaf00afafaf00afaf0000 afaf0000afaf0000faaf050000afaf0000d5af01dfdffcaf016464f59501 dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5 af01dfdffcaf016464f59501dfdff6af016464fcaf0000fcaf0300afaf00 f7af0d00af00afafaf00afafaf00afaf00fcaf0300afaf00f9af0000d0af 01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d 9d9d5656dff6af016464a5af01dfdffcaf016464f3dff6af016464fcaf00 00fcaf0300afaf00fbaffb000bafaf00afaf00afaf00afafaffa0002afaf 00f9af0000d0af01dfdffcaf016464f3dff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf016464f7df036464df dff6af016464fcaf0000fcaf0300afaf00fcaf120000afafaf00afaf00af af00afaf00afafaf00f9af0000f9af0000d0af01dfdffcaf016464f7df03 6464dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af0164 64a5af01dfdffcaf04646495dfdffbaf04646495dfdff6af016464fcaf00 00fcaf0300afaf00fcaf0000fcaf0d00afaf00af00af00af00afafaf00f9 af0000f9af0000fcaf0000d5af01dfdffcaf04646495dfdffbaf04646495 dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5 af01dfdffcaf04646495dfdffbaf04646495dfdff6af016464fcaf080000 afaf0000afaf00fcaf0d0000afaf0000afafaf00afafaf00fcaf080000af af0000afaf00fcaf0800afaf0000afaf0000d5af01dfdffcaf04646495df dffbaf04646495dfdff5af086400d69dd69d569d000800d6d69d9d9d5656 dff6af016464a5af01dfdffcaf0e64649595dfdfafafaf64649595dfdff6 af016464fbaffd0004af00afaf00fbaffd0009af0000afaf00afafaf00fb affc00fdaf0000fcaf0300afafaffc00d4af01dfdffcaf0e64649595dfdf afafaf64649595dfdff5af086400d6d69d9d9d56000800d69dd69d569d56 dff6af016464a5af01dfdffcaf0e64649595dfdfafafaf64649595dfdff6 af0164649caf01dfdffcaf0e64649595dfdfafafaf64649595dfdff5af08 6400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffc af0e6464959595dfdfaf6464959595dfdff6af0164649caf01dfdffcaf0e 6464959595dfdfaf6464959595dfdff5af086400d6d69d9d9d56000800d6 9dd69d569d56dff6af016464a5af01dfdffcaf0e6464959595dfdfaf6464 959595dfdff6af0164649caf01dfdffcaf0e6464959595dfdfaf64649595 95dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464 a5af01dfdffcaf016464fc9502df6464fc9501dfdff6af0164649caf01df dffcaf016464fc9502df6464fc9501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf016464fc9502df6464 fc9501dfdff6af0164649caf01dfdffcaf016464fc9502df6464fc9501df dff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af 01dfdffcaf016464fb950064fb9501dfdff6af0164649caf01dfdffcaf01 6464fb950064fb9501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a3dffcaf016464f3dff6af0164649adffcaf016464f3 dff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af0064a2dffc af0064f2dff6af006499dffcaf0064f2dff5af086400d6d69d9d9d560008 00d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d69d 9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56 df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80 aff4af086400d6d69d9d9d56000800d69dd69d569d56dff6afa164e3af98 64e2af086400d69dd69d569d000800d6d69d9d9d5656dff6afa26400dfe3 af996400dfe2af086400d6d69d9d9d56000800d69dd69d569d56dff6af01 6464f79501dfdfd495e8df0295dfdff79501dfdfe3af016464f79501dfdf c995eadf0295dfdff79501dfdfe2af086400d69dd69d569d000800d6d69d 9d9d5656dff6af016464f995fddf0064d495e9df016495fcdff99501dfdf e3af016464f995fddf0064c995ebdf016495fcdff99501dfdfe2af086400 d6d69d9d9d56000800d69dd69d569d56dff6af016464fb95fcdf016464d4 9501dfdfecaf02646495fadffb9501dfdfe3af016464fb95fcdf016464c9 9501dfdfeeaf02646495fadffb9501dfdfe2af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af046464959595fcdf03afaf6464d49501dfdfec af06646495dfdfafaffcdffd9501dfdfe3af046464959595fcdf03afaf64 64c99501dfdfeeaf06646495dfdfafaffcdffd9501dfdfe2af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af02646495fcdffcaf016464d495 01dfdfecaf04646495dfdffcaffcdf0295dfdfe3af02646495fcdffcaf01 6464c99501dfdfeeaf04646495dfdffcaffcdf0295dfdfe2af086400d69d d69d569d000800d6d69d9d9d5656dff6af046464dfdfdffaaf016464d495 01dfdfecaf04646495dfdffaaffd6401dfdfe3af046464dfdfdffaaf0164 64c99501dfdfeeaf04646495dfdffaaffd6401dfdfe2af086400d6d69d9d 9d56000800d69dd69d569d56dff6af02646495fc64fcaf016464d49501df dfecaf04646495dfdffcaffc640295dfdfe3af02646495fc64fcaf016464 c99501dfdfeeaf04646495dfdffcaffc640295dfdfe2af086400d69dd69d 569d000800d6d69d9d9d5656dff6af046464959595fc6403afaf6464d495 01dfdfecaf06646495dfdfafaffc64fd9501dfdfe3af046464959595fc64 03afaf6464c99501dfdfeeaf06646495dfdfafaffc64fd9501dfdfe2af08 6400d6d69d9d9d56000800d69dd69d569d56dff6af016464fb95fa64d495 01dfdfecaf04646495dfdffc64fb9501dfdfe3af016464fb95fa64c99501 dfdfeeaf04646495dfdffc64fb9501dfdfe2af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464f995fc64d49501dfdfea640495df6464 64f99501dfdfe3af016464f995fc64c99501dfdfec640495df646464f995 01dfdfe2af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464 f795016464d49500dfe9640295df64f79501dfdfe3af016464f795016464 c99500dfeb640295df64f79501dfdfe2af086400d69dd69d569d000800d6 d69d9d9d5656dff6af016464a3dfe3af0164649adfe2af086400d6d69d9d 9d56000800d69dd69d569d56dff6af0064a2dfe3af006499dfe2af086400 d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d 9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d569d0008 00d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd6 9d569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656 df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80 aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af08 6400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69d d69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56 000800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6 d69d9d9d5656dff6af80df88dff6af086400d6d69d9d9d56000800d69dd6 9d569d56dff6af80df89df0064f6af086400d69dd69d569d000800d6d69d 9d9d5656dff6af80df8adf016464f6af086400d6d69d9d9d56000800d69d d69d569d56dff6affddf80af8eaffd64f6af086400d69dd69d569d000800 d6d69d9d9d5656dff6affddf80af8eaffd64f6af086400d6d69d9d9d5600 0800d69dd69d569d56dff6affddf80af8eaffd64f6af086400d69dd69d56 9d000800d6d69d9d9d5656dff6affddf80af8eaffd64f6af086400d6d69d 9d9d56000800d69dd69d569d56dff6affddf80af8eaffd64f6af086400d6 9dd69d569d000800d6d69d9d9d5656dff6affddfe1affa00f1af0000f4af 0000faaf000080afd7affd64f6af086400d6d69d9d9d56000800d69dd69d 569d56dff6affddfe1af0000fcaf010000f6af0400afafaf00f4af0000fa af0000f7af000080afe1affd64f6af086400d69dd69d569d000800d6d69d 9d9d5656dff6affddfe1af0000fbaf0000f6af0400afafaf00f4af0000f0 af000080afe1affd64f6af086400d6d69d9d9d56000800d69dd69d569d56 dff6affddfe1af0000fbaf0300afafaffc000bafaf000000afaf00af0000 00f8af0000faaf0b00afafaf000000afaf00000080afe2affd64f6af0864 00d69dd69d569d000800d6d69d9d9d5656dff6affddfe1af0000fcaf1500 00afaf0000afaf0000afaf00afafaf0000afaf0000f9af0000faaf0a00af af00afafaf00afaf0080afe1affd64f6af086400d6d69d9d9d56000800d6 9dd69d569d56dff6affddfe1affa00f8af0700afaf00afafaf00fcaf0000 f9af0000faaf0400afaf0000fbaf000080afe1affd64f6af086400d69dd6 9d569d000800d6d69d9d9d5656dff6affddfe1af0000f7affb0006afaf00 afafaf00fcaf0000f9af0000faaf0a00afafaf000000afafaf0080afe1af fd64f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddfe1af 0000f8af0c0000afafaf00afaf00afafaf00fcaf0000f9af0000faaf0000 fbaf040000afaf0080afe1affd64f6af086400d69dd69d569d000800d6d6 9d9d9d5656dff6affddfe1af0000f8af0000fcaf0700afaf00afafaf00fc af0000f9af0000faaf0000faaf0300afaf0080afe1affd64f6af086400d6 d69d9d9d56000800d69dd69d569d56dff6affddfe1af0000f8af0c0000af af0000afaf00afafaf00fcaf0000f9af0000faaf0a00afaf00afafaf00af af0080afe1affd64f6af086400d69dd69d569d000800d6d69d9d9d5656df f6affddfe1af0000f7affd0008af0000afaf0000af00fcaf0000f9affa00 07af00afafaf000000fcaf01000080afe3affd64f6af086400d6d69d9d9d 56000800d69dd69d569d56dff6affddf80af8eaffd64f6af086400d69dd6 9d569d000800d6d69d9d9d5656dff6affddf80af8eaffd64f6af086400d6 d69d9d9d56000800d69dd69d569d56dff6affddf80af8eaffd64f6af0864 00d69dd69d569d000800d6d69d9d9d5656dff6affddf80af8eaffd64f6af 086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf80649464 05dfafaf646464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6 affddffdaf006480df96df0664dfafaf646464f6af086400d6d69d9d9d56 000800d69dd69d569d56dff6affddffdaf0164df80af97af0664dfafaf64 6464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf 0264dfaf8064996407af64dfafaf646464f6af086400d6d69d9d9d560008 00d69dd69d569d56dff6affddffdaf0264dfaf80649a6408dfaf64dfafaf 646464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6affddffd af0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d6d69d 9d9d56000800d69dd69d569d56dff6affddffdaf0464dfaf646480af9daf 09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d9d9d 5656dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464 f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0464 dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d69dd69d569d 000800d6d69d9d9d5656dff6affddffdaf0464dfaf646480af9daf09dfdf af64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d569d56df f6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af08 6400d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf0464dfaf64 6480af9daf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800 d69dd69d569d56dff6affddffdaf0464dfaf646480af9daf09dfdfaf64df afaf646464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6affd dffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d6 d69d9d9d56000800d69dd69d569d56dff6affddffdaf0464dfaf646480af 9daf09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d 9d9d5656dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf64 6464f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf 0664dfaf6464af0080af9faf09dfdfaf64dfafaf646464f6af086400d69d d69d569d000800d6d69d9d9d5656dff6affddffdaf0664dfaf6464af0080 af9faf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69d d69d569d56dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf 646464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6affddffd af0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d6d69d 9d9d56000800d69dd69d569d56dff6affddffdaf0464dfaf646480af9daf 09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d9d9d 5656dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464 f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0464 dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d69dd69d569d 000800d6d69d9d9d5656dff6affddffdaf0864dfaf6464afafaf00f6af00 00e6af0000d8af0000faaf0000e8af000090af09dfdfaf64dfafaf646464 f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0864 dfaf6464afafaf00f6af0000e6af0000d8af0000faaf0000f6af0000f3af 000090af09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6 d69d9d9d5656dff6affddffdaf0764dfaf6464afaf00f6af0000e6af0000 d8af0000f9af0000f6af0000f4af00008faf09dfdfaf64dfafaf646464f6 af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0a64df af6464afaf00afaf00fcaf0e00afaf00afafaf000000af00afafaffc00fd affd000caf00afafaf00afaf00af000000fcaffd0009af00afaf00af0000 afaffc00fdaf0400af000000fcaf0b00afafaf000000af00afafaffc0007 afaf000000afafaffc00fcaf0b00afafaf000000af00afafaffc00fcaffc 00fdaf0700af0000afaf0000b1af09dfdfaf64dfafaf646464f6af086400 d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf0a64dfaf6464af af00afaf00fcaf7f00afaf00afaf0000afaf0000afaf0000afaf0000af00 00afaf0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000af afaf0000afaf0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf 0000afaf0000afaf00afafaf0000afaf0000afafaf00afaf0000afaf0000 afaf0000afaf0000afaf0000afaf00000aafaf0000afaf0000afaf00b2af 09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d56 9d56dff6affddffdaf0a64dfaf6464af00afafaf00fcaf0600af00afafaf 00fcaf0300afaf00faaf0000fcaf0700afaf00afafaf00fcaf0300afaf00 fcaf0300afaf00f7af0300afaf00fcaf0700afaf00afafaf00fcaf0000f9 af0300afaf00f8af0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf 00fcaf0b00afaf00afafaf00afafaf00b2af09dfdfaf64dfafaf646464f6 af086400d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf0a64df af6464af00afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000 fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fbaffb0002 afaf00fcaf0700afaf00afafaf00fcaf0300afafaffb0002afaf00fcaffb 0006afaf00afafaf00fcaf0200afaffa0002afaf00fcaf0b00afaf00afaf af00afafaf00b2af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56 000800d69dd69d569d56dff6affddffdaf0a64dfaf6464af00afafaf00fc af0600af00afafaf00fcaf0300afaf00faaf0000fcaf0700afaf00afafaf 00fcaf0300afaf00fcaf0300afaf00fcaf080000afafaf00afaf00fcaf07 00afaf00afafaf00fcaf1b00afaf0000afafaf00afaf00afafaf0000afaf af00afaf00afafaf00fcaf0300afaf00f9af0000fcaf0b00afaf00afafaf 00afafaf00b2af09dfdfaf64dfafaf646464f6af086400d69dd69d569d00 0800d6d69d9d9d5656dff6affddffdaf0564dfaf646400fcaf0000fcaf01 0000fcaf0000fcaf0300afaf00fcaf0200af00fcaf0200af00fcaf0000fc af0300afaf00fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf0200af00 fcaf0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0200af00fcaf 0000fcaf0300afaf00f9af0000fcaf0b00afaf00afafaf00afafaf00b2af 09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d56 9d56dff6affddffdaf0564dfaf646400fcaf060000afaf000000fcaf1600 00afaf0000afaf0000afaf0000af0000afaf0000af00fcaf0000fcaf0b00 afaf0000afaf0000afaf00fcaf0f0000afaf0000afaf0000afaf0000af00 fcaf1b0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000af 00fcaf200000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00af afaf00afafaf00b2af09dfdfaf64dfafaf646464f6af086400d69dd69d56 9d000800d6d69d9d9d5656dff6affddffdaf0564dfaf646400fbaffd0002 af0000fbaffd0004af00afafaffc00fdaffd0003af00af00fcaf0000fcaf 0b00afafaf000000af00afaf00fbaffd000baf0000af00af000000afaf00 fbaffd0017af00afafaf000000af0000afaf0000afaf000000af000000fb affd0004af00afafaffc00fcaffc00fdaf0800afafaf00afafaf00b2af09 dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d569d 56dff6affddffdaf0464dfaf6464ebaf0000f2af0000edaf0000f1af0000 d0af000097af09dfdfaf64dfafaf646464f6af086400d69dd69d569d0008 00d6d69d9d9d5656dff6affddffdaf0464dfaf6464f0af050000afaf0000 f7af050000afaf0000f2af050000afaf0000f1af0000d5af050000afaf00 0097af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69d d69d569d56dff6affddffdaf0464dfaf6464efaffc00f5affc00f0affc00 f0af0000d4affc0096af09dfdfaf64dfafaf646464f6af086400d69dd69d 569d000800d6d69d9d9d5656dff6affddffdaf0464dfaf646480af9daf09 dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d569d 56dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464f6 af086400d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf0864df af6464afafaf00f6af0000e6af0000d8af0000faaf000080aff7af09dfdf af64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d569d56df f6affddffdaf0864dfaf6464afafaf00f6af0000e6af0000d8af0000faaf 0000f6af000082af09dfdfaf64dfafaf646464f6af086400d69dd69d569d 000800d6d69d9d9d5656dff6affddffdaf0764dfaf6464afaf00f6af0000 e6af0000d8af0000f9af0000f6af000082af09dfdfaf64dfafaf646464f6 af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0a64df af6464afaf00afaf00fcaf0e00afaf00afafaf000000af00afafaffc00fd affd000caf00afafaf00afaf00af000000fcaffd0009af00afaf00af0000 afaffc00fdaf0400af000000fcaf0b00afafaf000000af00afafaffc0007 afaf000000afafaffc008aaf09dfdfaf64dfafaf646464f6af086400d69d d69d569d000800d6d69d9d9d5656dff6affddffdaf0a64dfaf6464afaf00 afaf00fcaf6300afaf00afaf0000afaf0000afaf0000afaf0000af0000af af0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000afafaf 0000afaf0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf0000 afaf0000afaf00afafaf0000afaf00008baf09dfdfaf64dfafaf646464f6 af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0a64df af6464af00afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000 fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00f7af0300af af00fcaf0700afaf00afafaf00fcaf0000f9af0300afaf00f8af00008baf 09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d9d9d 5656dff6affddffdaf0a64dfaf6464af00afafaf00fcaf0600af00afafaf 00fcaf0300afaf00faaf0000fcaf0700afaf00afafaf00fcaf0300afaf00 fcaf0300afaf00fbaffb0002afaf00fcaf0700afaf00afafaf00fcaf0300 afafaffb0002afaf00fcaffb008baf09dfdfaf64dfafaf646464f6af0864 00d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0a64dfaf6464 af00afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000fcaf07 00afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf080000afafaf 00afaf00fcaf0700afaf00afafaf00fcaf1400afaf0000afafaf00afaf00 afafaf0000afafaf008baf09dfdfaf64dfafaf646464f6af086400d69dd6 9d569d000800d6d69d9d9d5656dff6affddffdaf0564dfaf646400fcaf00 00fcaf010000fcaf0000fcaf0300afaf00fcaf0200af00fcaf0200af00fc af0000fcaf0300afaf00fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf 0200af00fcaf0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000 8baf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd6 9d569d56dff6affddffdaf0564dfaf646400fcaf060000afaf000000fcaf 160000afaf0000afaf0000afaf0000af0000afaf0000af00fcaf0000fcaf 0b00afaf0000afaf0000afaf00fcaf0f0000afaf0000afaf0000afaf0000 af00fcaf190000afaf0000afaf0000afaf0000afaf00afafaf0000afaf00 008baf09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d6 9d9d9d5656dff6affddffdaf0564dfaf646400fbaffd0002af0000fbaffd 0004af00afafaffc00fdaffd0003af00af00fcaf0000fcaf0b00afafaf00 0000af00afaf00fbaffd000baf0000af00af000000afaf00fbaffd0016af 00afafaf000000af0000afaf0000afaf000000af00008caf09dfdfaf64df afaf646464f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affd dffdaf0464dfaf6464ebaf0000f2af0000edaf0000f1af000080afe6af09 dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d9d9d56 56dff6affddffdaf0464dfaf6464f0af050000afaf0000f7af050000afaf 0000f2af050000afaf0000f1af000080afe6af09dfdfaf64dfafaf646464 f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0464 dfaf6464efaffc00f5affc00f0affc00f0af000080afe6af09dfdfaf64df afaf646464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6affd dffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d6 d69d9d9d56000800d69dd69d569d56dff6affddffdaf0464dfaf646480af 9daf09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d 9d9d5656dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf64 6464f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf 0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d69dd69d 569d000800d6d69d9d9d5656dff6affddffdaf0464dfaf646480af9daf09 dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d569d 56dff6affddffdaf0464dfaf646480df9bdf07af64dfafaf646464f6af08 6400d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf0364dfaf64 80df9adf07af64dfafaf646464f6af086400d6d69d9d9d56000800d69dd6 9d569d56dff6affddffdaf0164df80af97af0664dfafaf646464f6af0864 00d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf8064946405df afaf646464f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affd dffdaf80df93df04afaf646464f6af086400d69dd69d569d000800d6d69d 9d9d5656dff6affddf80af8eaffd64f6af086400d6d69d9d9d56000800d6 9dd69d569d56dff6affddf80af8eaffd64f6af086400d69dd69d569d0008 00d6d69d9d9d5656dff6affddf80af8eaffd64f6af086400d6d69d9d9d56 000800d69dd69d569d56dff6affddf80af8eaffd64f6af086400d69dd69d 569d000800d6d69d9d9d5656dff6affddf80af8eaffd64f6af086400d6d6 9d9d9d56000800d69dd69d569d56dff6affddf80648b64f6af086400d69d d69d569d000800d6d69d9d9d5656dff6af01dfdf80648a64f6af086400d6 d69d9d9d56000800d69dd69d569d56dff6af00df80648964f6af086400d6 9dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d 56000800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800 d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d 569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df 80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80af f4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af0864 00d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd6 9d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d5600 0800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d6 9d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d 56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af 80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af 086400d69dd69d569d000800d6d69d9d9d5656dff1affd00f4af0000ebaf 000080afa9af086400d6d69d9d9d56000800d69dd69d569d56dff3af0600 00afafaf0000f6af0000efaf0400afafaf0080afa9af086400d69dd69d56 9d000800d6d69d9d9d5656dff3af0000fbaf0000f6af0000efaf000080af a5af086400d6d69d9d9d56000800d69dd69d569d56dff3af0000f7affc00 fdaf0300afafaffc00fcaffc0009af000000afaf00afafaffc00fdaf0400 af00000080afb8af086400d69dd69d569d000800d6d69d9d9d5656dff2af 010000faaf2e0000afaf0000afaf00afaf0000afaf0000afaf0000afaf00 00af00afafaf00afaf0000afaf0000afaf0000afaf000080afb9af086400 d6d69d9d9d56000800d69dd69d569d56dff0af010000fcaf0000fcaf0600 afaf00afaf00fcaf0300afaf00faaf0700afafaf00afaf00fcaf0300afaf 00fcaf000080afb9af086400d69dd69d569d000800d6d69d9d9d5656dfee af030000afaffa0004afaf00afaffa0002afaf00faaf0700afafaf00afaf 00fcaf0300afaf00fcaf000080afb9af086400d6d69d9d9d56000800d69d d69d569d56dfedaf0300afaf00f9af0300afaf00f9af0000faaf0700afaf af00afaf00fcaf0300afaf00fcaf000080afb9af086400d69dd69d569d00 0800d6d69d9d9d5656dff3af0000fbaf0300afaf00f9af0300afaf00f9af 0000fcaf0900af00afafaf00afaf00fcaf0300afaf00fcaf000080afb9af 086400d6d69d9d9d56000800d69dd69d569d56dff3af320000afafaf0000 afaf0000afaf0000afaf00afaf0000afaf0000afaf0000afaf0000af00af afaf00afaf0000afaf0000afaf00fcaf000080afb9af086400d69dd69d56 9d000800d6d69d9d9d5656dff1affd00fbaffc00fdaf0300afafaffc00fc affc00fdaf060000af00afafaffc00fdaf0000fcaf000080afb9af086400 d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d 569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d560008 00d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d69d 9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56 df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80 aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af08 6400d69dd69d569d000800d6d69d9d9d5656dff4af80648c64f4af086400 d6d69d9d9d56000800d69dd69d569d56dff4af80648d6400dff4af086400 d69dd69d569d000800d6d69d9d9d5656dff4af01646480af90af01dfdff4 af086400d6d69d9d9d56000800d69dd69d569d56dff4af01646480af90af 01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af016464 80af90af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4 af01646480af90af01dfdff4af086400d69dd69d569d000800d6d69d9d9d 5656dff4af01646480af90af01dfdff4af086400d6d69d9d9d56000800d6 9dd69d569d56dff4af01646480af90af01dfdff4af086400d69dd69d569d 000800d6d69d9d9d5656dff4af01646480af90af01dfdff4af086400d6d6 9d9d9d56000800d69dd69d569d56dff4af01646480af90af01dfdff4af08 6400d69dd69d569d000800d6d69d9d9d5656dff4af016464f3af0000fcaf 0000d8af0000eaaf0200af00faaf0000f4af0000d5af0000eaaf0000f5af 0000f9af0000faaf0000fcaffd00e9af0000fcaf0000fbaf01dfdff4af08 6400d6d69d9d9d56000800d69dd69d569d56dff4af016464f3af0000fcaf 0000d8af0000eaaf0200af00faaf0000f4af0000d5af0000eaaf0000f7af fd00fbaffd00faaf0900afaf0000afafaf0000ebaf0000fcaf0000fbaf01 dfdff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af016464f3 af0400afafaf00d8af0000eaaf0300afaf00eeaf0000beaf0000f4af0000 f9af0000fbaf0400afafaf00fbaf0000e7af0000faaf01dfdff4af086400 d6d69d9d9d56000800d69dd69d569d56dff4af016464fbaf130000afaf00 0000af00afafaf00afaf00af000000fcaffd0009af00afaf00af0000afaf fc00fdaf0400af000000fcaf0f00afafaf000000afafaf00af0000afaffc 00fdaf1100afaf00af000000afaf00afaf00af000000fcaf0b00afafaf00 0000af00afafaffc00fcaffc00fdaf0a00af0000afaf0000afaf00fbaf05 00af00afafaffc0016afaf00afafaf00afafaf00afafaf00af0000afafaf 0000fcaf0000f9af0000fbaf0300afaf00f9af0000faaffd00fcaffd0008 af00afaf00afafaf00faaf01dfdff4af086400d69dd69d569d000800d6d6 9d9d9d5656dff4af016464f8af7f0000afaf0000afafaf00afaf0000afaf 0000afaf0000afaf0000afaf0000afafaf0000afaf0000afaf0000afaf00 00afafaf00afaf00afafaf00afaf0000afafaf0000afaf0000afaf00afaf 0000afaf0000af00afaf0000afaf0000afafaf00afaf0000afaf0000afaf 0000afaf0000afaf0000afaf0000afaf0000afaf000004afaf00af00fbaf 1f00af00afaf0000afaf0000af00afafaf00afafaf00afafaf00afaf00af afaf00fbaf0000f9af0000fbaf0300afaf00f9af0000fbaf1300afafaf00 afaf0000afaf0000afaf00afafaf00faaf01dfdff4af086400d6d69d9d9d 56000800d69dd69d569d56dff4af016464f8af0000fcaf0700afaf00afaf af00fcaf0300afaf00fcaf0300afaf00f7af0300afaf00fcaf0800afaf00 afafaf0000fbaf0000fcaf0000faaf0400afafaf00fcaf0500af00afaf00 fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf1800af af00afafaf00afafaf00afaf00afafaf00afaf00afaf00fcaf0d00af00af afaf00afafaf00afaf00fcaf0200af00faaf0000f9af0000fcaf0400afaf af00f9af0000fbaf010000fbaf0000fcaf0600afaf00afaf00f9af01dfdf f4af086400d69dd69d569d000800d6d69d9d9d5656dff4af016464f8af00 00fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fbaffb00 02afaf00fcaf0300afaf00fcaffd00fdaf0000fcaf0000faaf0400afafaf 00fcaf0500af00afaf00fcaf0700afaf00afafaf00fcaf0200afaffa0002 afaf00fcaf1700afaf00afafaf00afafaf00afaf00afafaf00afaf00afaf fa000cafaf00afaf00afaf00afafaf00fbaf0000f9af0000f9af0000fcaf 0400afafaf00f9af0000faaffd00fdaf0000fcaf0600afaf00afaf00f9af 01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af016464 f8af0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fc af080000afafaf00afaf00fcaf0300afaf00faaf040000afaf00fcaf0000 faaf0400afafaf00fcaf0500af00afaf00fcaf0700afaf00afafaf00fcaf 0300afaf00f9af0000fcaf1800afaf00afafaf00afafaf00afaf00afafaf 00afaf00afaf00f9af0a00afaf00afaf00afafaf00fbaf0000f9af0000f9 af0000fcaf0400afafaf00f9af0000f8af040000afaf00fcaf0600afaf00 afaf00f9af01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656df f4af016464f8af0000fcaf0200af00fcaf0000fcaf0300afaf00fcaf0300 afaf00fcaf0000fcaf0300afaf00fcaf0200af00f8af0300afaf00fcaf00 00fcaf010000fcaf0000fcaf0500af00afaf00fcaf0200af00fcaf0000fc af0300afaf00f9af0000fcaf1800afaf00afafaf00afafaf00afafaf00af 00afafaf00afaf00f9af0900af00af00af00afaf00fbaf0200af00faaf00 00f9af0400afafaf00fbaf0000fbaf0000f6af0300afaf00fcaf0500afaf 00af00f8af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56df f4af016464f8af070000afaf0000af00fcaf0000fcaf0b00afaf0000afaf 0000afaf00fcaf0f0000afaf0000afaf0000afaf0000af00fcaf0700afaf af00afaf00fcaf060000afaf000000fcaf0a0000afaf0000af00afaf00fc af0200af00fcaf3e0000afaf0000afaf0000afaf0000afaf0000afaf0000 afaf00afafaf00afafaf00afafaf00af00afafaf00afaf0000afaf0000af afaf00afafaf00afafaf00fcaf0400afafaf00fbaf0000f9af0400afafaf 00fbaf1e0000afafaf0000afafaf00afaf00afafaf00afaf0000afaf0000 afaf00af00f8af01dfdff4af086400d69dd69d569d000800d6d69d9d9d56 56dff4af016464f7affd0003af00af00fcaf0000fcaf0b00afafaf000000 af00afaf00fbaffd000baf0000af00af000000afaf00fbaffd00fdaf0000 fbaffc0001af00fcaf0a00af000000afaf00afaf00fcaf0200af00fbaffd 0004af00afafaffc00fcaffc00fdaf0800afafaf00afafaf00fcaf0000fc af0300afafaffc00fcaf1200afafaf00afafaf00afafaf0000afafaf0000 fcaf0000f9af0400afafaf00f9affd00fbaf0600afafaf000000fcaffd00 06af00afaf00af00f8af01dfdff4af086400d6d69d9d9d56000800d69dd6 9d569d56dff4af016464dfaf0000f1af0000c3af00008eaf0000f3af01df dff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af016464e4af 050000afaf0000f1af0000c8af050000afaf000093af050000afaf0000f3 af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af0164 64e3affc00f0af0000c7affc0091affc00f2af01dfdff4af086400d69dd6 9d569d000800d6d69d9d9d5656dff4af01646480af90af01dfdff4af0864 00d6d69d9d9d56000800d69dd69d569d56dff4af01646480af90af01dfdf f4af086400d69dd69d569d000800d6d69d9d9d5656dff4af01646480af90 af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af0164 6480af90af01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656df f4af01646480af90af01dfdff4af086400d6d69d9d9d56000800d69dd69d 569d56dff4af01646480df8edff4af086400d69dd69d569d000800d6d69d 9d9d5656dff4af006480df8ddff4af086400d6d69d9d9d56000800d69dd6 9d569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656 df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80 aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af08 6400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69d d69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56 000800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6 d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d56 9d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80 af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4 af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400 d6d69d9d9d56000800d69dd69d569d56df80648064f3640700d69dd69d56 9d000700d6d69d9d9d565680df80dff3df086400d6d69d9d9d56000800d6 9dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d 5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80 af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4 af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400 d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d 9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d569d0008 00d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd6 9d569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656 df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80 aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af08 6400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69d d69d569d000800d6d69d9d9d5656dff3afc96480afb8af086400d6d69d9d 9d56000800d69dd69d569d56dff3af0064cbaf00df80afb8af086400d69d d69d569d000800d6d69d9d9d5656dff3af0064cbaf00df80afb8af086400 d6d69d9d9d56000800d69dd69d569d56dff3af0064cbaf00df80afb8af08 6400d69dd69d569d000800d6d69d9d9d5656dff3af0064cbaf00df80afb8 af086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcafd3dffc af00dfd5afd3dfd0afd3dfedaf086400d69dd69d569d000800d6d69d9d9d 5656dff3af0064fcafd4df0064fcaf00dfd5afd4df0064d0afd4df0064ed af086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcafd5df01 6464fcaf00dfd5afd5df016464d0afd5df016464edaf086400d69dd69d56 9d000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64fcaf00dfd5af fddfd9affd64d0affddfd9affd64edaf086400d6d69d9d9d56000800d69d d69d569d56dff3af0064fcaffddfd9affd64fcaf00dfd5affddfd9affd64 d0affddfd9affd64edaf086400d69dd69d569d000800d6d69d9d9d5656df f3af0064fcaffddfd9affd64fcaf00dfd5affddfd9affd64d0affddfd9af fd64edaf086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaf fddfd9affd64fcaf00dfd5affddfd9affd64d0affddfd9affd64edaf0864 00d69dd69d569d000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64 fcaf00dfd5affddfd9affd64d0affddfd9affd64edaf086400d6d69d9d9d 56000800d69dd69d569d56dff3af0064fcaffddfd9affd64fcaf00dfd5af fddfd9affd64d0affddfd9affd64edaf086400d69dd69d569d000800d6d6 9d9d9d5656dff3af0064fcaffddff3affd00fbaf0000fbaf0000f5affd64 fcaf00dfd5affddffbaff90004af00afaf00eaaffd64d0affddffaaf0000 faaf0300afaf00f9af0000f2affd64edaf086400d6d69d9d9d56000800d6 9dd69d569d56dff3af0064fcaffddff5af0a0000afafaf0000afafaf00fc af0000f4affd64fcaf00dfd5affddffbaf0000f9af0600afaf00afaf00ed affd64d0affddffaaf0000faaf0300afaf00f9af0000f2affd64edaf0864 00d69dd69d569d000800d6d69d9d9d5656dff3af0064fcaffddff5af0000 fbaf0800afafaf00afafaf00f3affd64fcaf00dfd5affddffbaf0000f6af 0300afaf00edaffd64d0affddffaaf0000faaf0000f6af0000f2affd64ed af086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaffddff6 af0000f9af0600afaf00afaf00f2affd64fcaf00dfd5affddffbaf0000f9 af0a00afaf00af000000afafaffc00fdaf0300af0000fcaffd64d0affddf faaf0000faaf0e00afaf00afafaf000000af00afafaffc00f9affd64edaf 086400d69dd69d569d000800d6d69d9d9d5656dff3af0064fcaffddff6af 0000f9af0500afaf00af00f1affd64fcaf00dfd5affddffbaf0000f9af13 00afaf00afaf00afafaf0000afaf0000afaf0000faaffd64d0affddffaaf 0000faaf1300afaf00afaf0000afaf0000afaf0000afaf0000faaffd64ed af086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaffddff6 af0000f9af0500afaf000000f1affd64fcaf00dfd5affddffbaffa000caf af00afaf00afaf00afafaf00fcaf0300afaf00f9affd64d0affddffaaff8 0005afaf00afaf00fcaf0300afaf00fcaf0000faaffd64edaf086400d69d d69d569d000800d6d69d9d9d5656dff3af0064fcaffddff6af0000f9af06 00afaf00afaf00f2affd64fcaf00dfd5affddffbaf0000f9af0900afaf00 afaf00afafaffa0002afaf00f9affd64d0affddffaaf0000faaf0600afaf 00afaf00fcaf0200afaffa00faaffd64edaf086400d6d69d9d9d56000800 d69dd69d569d56dff3af0064fcaffddff6af0000f9af0700afaf00afafaf 00f3affd64fcaf00dfd5affddffbaf0000f9af0a00afaf00afaf00afafaf 00f9af0000f9affd64d0affddffaaf0000faaf0600afaf00afaf00fcaf03 00afaf00f5affd64edaf086400d69dd69d569d000800d6d69d9d9d5656df f3af0064fcaffddff5af0000fbaf0400afafaf00fcaf0000f4affd64fcaf 00dfd5affddffbaf0000f9af0a00afaf00afaf00afafaf00f9af0000f9af fd64d0affddffaaf0000faaf0600afaf00afaf00fcaf0300afaf00f5affd 64edaf086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaffd dff5af0a0000afafaf0000afafaf00fbaf0000f5affd64fcaf00dfd5affd dffbaf0000f9af1200afaf00afaf00afafaf0000afaf0000afaf00f9affd 64d0affddffaaf0000faaf1300afaf00afaf0000afaf0000afaf0000afaf 0000faaffd64edaf086400d69dd69d569d000800d6d69d9d9d5656dff3af 0064fcaffddff3affd00fbaf0000faaf0000f6affd64fcaf00dfd5affddf fbaf0000f9af0a00afaf00afafaf0000afaffc00fdaf0000f9affd64d0af fddffaaf0000faaf0e00afaf00afafaf000000af00afafaffc00f9affd64 edaf086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaffddf d9affd64fcaf00dfd5affddfd9affd64d0affddfd9affd64edaf086400d6 9dd69d569d000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64fcaf 00dfd5affddfd9affd64d0affddfd9affd64edaf086400d6d69d9d9d5600 0800d69dd69d569d56dff3af0064fcaffddfd9affd64fcaf00dfd5affddf d9affd64d0affddfd9affd64edaf086400d69dd69d569d0008009d569d9d 9d5656dff3af0064fcaffddfd9affd64fcaf00dfd5affddfd9affd64d0af fddfd9affd64edaf086400d6d69d569d56000000fb56029d56dff3af0064 fcaffddfd9affd64fcaf00dfd5affddfd9affd64d0affddfd9affd64edaf 036400d69dfc56ff000000fcd6039d5656dff3af0064fcaffddfd9affd64 fcaf00dfd5affddfd9affd64d0affddfd9affd64edaf016400fad6ff0008 00d6d6d69d569d56dff3af0064fcaffddfd9affd64fcaf00dfd5affddfd9 affd64d0affddfd9affd64edaf036400d69dfcd6ff000800d6d69d9d9d56 56dff3af0064fcaffddfd664fcaf00dfd5affddfd664d0affddfd664edaf 086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaf01dfdfd5 64fcaf00dfd5af01dfdfd564d0af01dfdfd564edaf086400d69dd69d569d 000800d6d69d9d9d5656dff3af0064fcaf00dfd464fcaf00dfd5af00dfd4 64d0af00dfd464edaf086400d6d69d9d9d56000800d69dd69d569d56dff3 af0064cbaf00df80afb8af086400d69dd69d569d000800d6d69d9d9d5656 dff3af0064cbaf00df80afb8af086400d6d69d9d9d56000800d69dd69d56 9d56dff3af0064cbaf00df80afb8af086400d69dd69d569d000800d6d69d 9d9d5656dff3af0064cbaf00df80afb8af086400d6d69d9d9d56000800d6 9dd69d569d56dff3af0064cadf80afb8af086400d69dd69d569d000800d6 d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d56 9d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80 af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4 af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400 d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d 569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d560008 00d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d69d 9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56 df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80 aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af08 6400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d6 9d9d9d56000800d69dd69d569d56df80648064f3640700d69dd69d569d00 0700d6d69d9d9d565680008000f10006d6d69d9d9d56000600d69dd69d56 9d80d680d6efd6059dd69d569d007f00d6d69d9d9dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d7fd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69d1dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9d 9d56000300d69dd6e59d0156d6809da49d0156d6e49d02569d000200d6d6 e59d035656d6d6809da69d035656d6d6e49d0156007f00d69d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d56d6d69d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 7f9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d56d6d61d9d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d000100d6e25601d6d68056a45601d6d6e356ff0080 008000e200 grestore showpage %%Trailer geomview-1.9.5/doc/figs/tools.ps0000644000175000017500000002514212310110174013464 00000000000000%!PS-Adobe-3.0 EPSF-3.0 %%LanguageLevel: 3 %%Creator: pnmtops %%Title: Bildschirmphoto5.ps %%Pages: 1 %%BoundingBox: 279 267 333 525 %%EndComments %%BeginSetup %%EndSetup %%Page: 1 1 gsave 279.12 267.12 translate 53.76 257.76 scale 112 537 8 [ 112 0 0 -537 0 537 ] { currentfile /ASCIIHexDecode filter /FlateDecode filter false 3 colorimage } exec 78DAED9D5B9015C519C7794C1E92AA3CE521F12D95AA24651EF2622AA5556AF4 C5581A1114F192184409221705022A97A08882B88204B92A97A8084AC0282888 788312949B02BBECB2EC9DBDEFD93BBB2CC4FC774F79B23933D3D3DDD333D373 E6FFD5575BB373BA67BEF9CDD7B799EE6F6A6B2926A5866254AA2946A5CA432E 5FFE0FD54BABBCA5D221C425A9956E52314C722907062E95D7367F78B864FBFE E3EB761E58F3AFCFA9AFBDFFE5CE4F4E1C29AE6EEFEACD81BA74E972C5FFCBB9 EF2497A6B5BD1B18576FFF8CEAAA70B0A325D5395C07BF3E375CCA8724F72B52 E25EAC7CEB53AA58DFFEE8181C2F0B6DF3AE43E5DFC9D921C9EEFFFCF8D9155B 3F76D55D9F9F2CAF696E6CEDEAECBE80BF474B6ADEF9F46BAFC41AFAD5E9AAAE 9E3E19454A4BB2AFDD712057F61F5AF47A9664595959764F5975D3B22DFB9DBA 6DDFB12325D54D6D5D7DFD1791BDA1B5B3B6A9BDBA2153DD98397CBA6ACBDEAF 5C73A96A4D6306D676F7F65F1CB8D4DB87135D68EDE8696EEF6ECA74E38C7543 67ACAA6F8322A53DD9FFB9FB30DA1AD0FBF848E99DB356950D49B60142B5F0C2 EBFBF274F3EE4327CAEAAA1BDA5A3B7A91EF42FF004E74BEB903C7AFAC6FC32D 38515AB7E1DD2F9C1955F5D8995A987DBEA5233374C7FB2F5EBAD0771197D6D5 DB8F3D2811B8109CB1E27C2B522EDEB8DB9EECDF9CADCB3A64966776BBB8A27E C9E6BD4E7DFBA3E3C5158D704860ECEB1F1818B88C9BD89CE9C691CB6B5BF0F7 64F9F96D1F1E59BC698F6B7679DDF345310CC66DAA6FE9C085C024B80AAE0B27 C5195BDA07CF5879BEF55C5D2B52CE59BEC59EEC28F55986BB0E9CBC6DCAF3D9 6D54868B367C90A72F6ED9BFEBC0293821FCBCA5BDA7B76FE0E2C0A08B76745F 808B965436965537E314EF1D38B574F31E677625DDB4EB100E555ADD74AEB605 C50D67E91FB8DCD73F78453D172EE2ECA5D5CD67AA9ACED5B520E5F4C51B64B2 8F1812D5ECD95CC3CF9EDD23C89E6D985019DE70EF4C64812E7F73FF53EB77E7 E9B31BF71C3E55895B73B6B6A5B9BD07CE0F3B41151BA85BCED6349F3A578F53 7CF8E599056BFEFDF7B5EF398F20AFCF6DDA5B5ED782BAE5F4B9061C1CA7E8BE 80123780BFD9D3613F7E451AA49CB6E815DFEC23868952F65CAEECD973FF0AB2 E78AFC35A326669BAD796BDE75EACC9776C009C16D84B7E05754298F156D7BFC A5B75C0F22A938170AC257C5D530BBBEA52BD375A1A3BBAFB3A71F7FB18D3DD8 8F5F910629272F5C2BCEEEB433D4ECD01CCFB68E1EE8132FBFE3D4F1CFBC7EB6 A6097E7EB2BCDE15E637E5E75146CA6A9AC62F7C6DDA92CDAE0791549CEB4C55 E3A1535547CFD4A0BA6EE9E869E9EC6DEBECC55F6C630FF6E357A441CA890BD6 08B27BDD7AC9ECD9B30FCFE87B7628DA2F287836B6764267ADD8E1D43B1F7FE5 F4B97A10C3DD41F592671ECE82F28E5B76E864E5ED33564E7C6A9DEB412475F4 ECF5A5554D8771452535D50DED8D6D837D155432F88B6DECC17EFC8A34483961 FE2A41762F9E92D9B3671F9ED1F7EC50549E50F0AC6DCC40A72FDBEE54E4DDB2 F748594DF360C552D150D3D89E3B45537B774D533B6A030CF391E6C607178E9F B7CAF520927AE3232BE0E730FB78695D75637B7D6B5743DB2049FCC536F6603F 7E451AA47C60CECA50B33BEF85383BB439D30505CF8ABA16E8D417B639F5BE79 1B272DDE8A9B525CD1F075591DC0D63577E0E02886F01CF82760A2899FB464EB F5F7CC1C377795EB4124F5AAFB97C0D5E1F0DF9C3DEFE560A7878A0352DEFFC4 8A08B2D7B7753566BA65B243D17D85826769552374D292375DF5DA0797AED8F6 298E5352D900AA68EB315E004F74EFD1FBC5BF478B6B7E397AFE1FFE3C63DCFC B55E0791D15FDCF174B62A86CF7B01C1ED437D8E94F7CE5A1E76F6FAD6CE86D6 AEC6B6AE5C5D2AC80EAD1CEAA082273AE4D009CFBEE1AAA367ADBE72EC33456F 7C04E668CA518BD60DF6ED7B3B7BFAE0AB2BB67EF2EBB1CFFCEAE649B74D5CF0 C0820D5E0791D19FDEFCE4E015553761985059DF8ABA05C73FDFD289D28AB280 56BEBEA51306A32821E5D8192F5A951D9A754BF03C76A606FAC0C2D75C75DC53 9B6F9E5CF4F35B678EFCDBDAA5AFEDDBF7E5199CF1E0D7156B771C1CF3E4AB57 5C3FFECA1BEFF9FD5D93C7CC5886945E0791D11FDD30B36CE88AE024E8D3560D 8E5606072CA855702D7012F49A9A32830E8394773CF68255D9A159B7044FF4D8 A1F72FD8E4A5F7CD7D65D4B4A5BF19F9E84FAE9BF0C36B1EFEFED5537E70CDC4 1F5F33EE67D7DEF3DB9BEEBDE1EE69B74F597CDF9C758223C8E895772DFCDED5 5365F48A1BFE3A6AEAF35665871E2DA98682E78113E5D0FBE66FF4D4791BEE7E 72FDE8C796DD347EFEF563A75D3DF2A1DFDDF217FCC536F6603F7E451AD111E4 74D463CBAE1B33E5AA3FFC49AC488394B6653F74B2020A9E1F1F2985DE33F755 B1DE3D67FD98D9AB464D5F3E72EAD23F4E5E82BFD8C61EECF7CD2BA9773DBEE6 F66945B73EF29C589106296DCBFED9B1B350F0DC7BA8183AF6C9F5D420FAE1E1 122878EE3A70120AE6D420BAFBE0292878EEFCE40474CCECD5D4209AC5089E6F ED3B0ABDE5E145D4209AC5389CE77E8AAE90A741292A2A12F0CC5054A46848C8 933C13CD33C6EA48E97262B7D3729EB02D113C73762AF18CA5EC68F08CD14EF2 244FF2244FF2244FF2244FF20C8FE78811235C8FEFB55FE657E33CF3E63058CE D369A141B34DF1D4BB9B76F2743A466E3BBB21E01F06CFBC3D5EE639AD1278B8 D9F2EE6A8CABE5CE0DD79491F1F432CFD554C10123E329BE0AB19131F294DC19 5E7B2476CBBC9292509E82462D329EBEE53D89FE194D7F49C3B6587806B4399A F22EDECE951199D62AE2FEA7A0FBE1DB13E0F888E34DF2244FF2244FF2244FF2 244FF24C33CFA2384483678C76CAF32C8A495479C66B27E72B8651F6C9933CC9 933CC9933CC9933C29E4499EE449214FF2244FB1B806EF327E8A14FA6778574D 9E79AE9B97C6395D53303726D4C9DE09E2A934DF35C804B9149677DF5964E4A9 54DE95788A73B1BC6BFB27DB233D9EAC3F35DA77D7C50E32ED7BC6E8AAA8948C 8F22F3C002E6E93B639C3CB5C7AA1CBFF37908853CC9933C29AA3C8B2846E72B 12975854E3016A4C6D4D8F68C457244FF2244FF2A418E12988BB429E7AFE4998 2CEFF6FBA74CE40DDF0798923BD3E09FE419BD7F8AE7CCB8BE354BAD7F665402 2B49C688B3EAFD45F4EDBBD3D9C288199536FF244F83FD4F010AF2D4E87F9AE5 99F2FAD3D7B55463C4D13F393EE2F89DCF9758DEC9933CC9933CC9933CC9D37E 9EFC36B1A9EF6F12A6599E1449214FF2244FF2244FF2244FF2A4248567C06041 5C0F2BA0A101873C2551C87C22D3374050642F682CE7A937FD499C853C258949 6649394FC990418C17A4EA9F924ECB784182F69DE5DD78FF5372FA934CFBCEF1 11C747E4499EE4499EE4499EE4499EE9E4C908368C17C478410915CE57244FF2 244FF28C8B27D77319F74FC26479B7DF3FC3F0D2C4797E48F182C833A07FAACE 72B1ED5B5A36FB6712BFA59594FA3329DFD2B2BCFE4CDCB7B46CF6CF247E4B2B 89F5A764A5CAF22E9ED49A886F6915CCF8A8C0C6AAB18CDF931B4ECDDAE74B49 ECABF37908799227853CC9933CC993F182182F88F182D223E4499E85C153A91A 214F233CD9A752E5E97B28C193A58CF70B23F11BA580CF5AA30C4B12194F57F3 7C575B07441A7D589204F114BF0675FD2E83D2C35823614992C2D36C0C81F0C2 9244CFD3B542934F90F1F8E487119E92B74C701F13ED9F417886149684E55DD2 69254F915C9E326D77F4614992527F6AB4EFE2FE6748614954794A2E6354EDC5 15CC4B64259EF2CB42C933D4E74BE2E15E214D72E0F33AF2244FF2244FF2244F F2A49027799227853CC9933CC9933CC9933CC993429EE4499E14F2244FF2244F 799EB12F9BB2D09224F274CE3FB1C792E03C63294AD65A429E76F21C31E2DB50 559EE7B7210B79223B799AE2993B027906E7997790C2E029B840F254E5E95A9B 45C353D21EF294E799577F9227DB23F22CE0F688FD25D77B419EA64892A75992 E4691C26791AA74A9E2CEF1696F7E1E31AF2340233CDFDCF20DD75DF6E7F3A79 6A23F51D43A596A72A55C9D17DCA79CA80554A4C9EAAC2E721AEED7B1830E3E2 E99A3196FE924192F1FAA733BB6DCF93F59E8506E769AA7BCCF7EF66919227FD D39EF94BB6D59F89E6694FFBCEF975E469154FCEA7254F3B7916C521D65A1290 67514C62AD255CCF65CF7A2E0A7992277952F4787A8573179C28C8AFAA32FC73 4B9968E35D6BF3344BCC384FAF0DCB79E6B9419E87487E48C8F733437A3C871F C7D5E08CDC5790240BA0299EAA9FBAD0F8D5A07FCA7C5046F22B48E1F9A7EACE 787906BC220B790A3E2464E47B7CF23C25BF8214657957DDA9F199A19078CA1B 2F5F646CE619B67F06343E329E5EEDA66BABEAFB55C1803C5DDB77573B5D7B29 1197F7F0FA9046CA7BF4B6916742C79B11F3D428AA7C1EC2E74BE4494411F064 FC3AC6AF63FC3A5753ADB5843CEDE419EF2CACC29B0F66763587EA2CEB3C4BC2 9BE6975A9E6188853C872F9B559A6B1D124FD5A53D56F1CC5B33AB443E0C9EAA 4B932C2FEF4A298DF3D458806615CFE1368B2FC135A5599E7AA102EDE1E915C8 423EA5419EAAD17558DE0BBBFEF40A1A20D3D492A71225DF7E0B79B2BC87C7D3 D7EB24DB0EF2145F947C005EF2647F3E0C9E06233390A7DEF0843CF5CABBDEC3 B4D4F234F8EC513E2A42A18EDFF5C2CFCAB831796AF3744D96669E41FA485E69 D2F97C29084FF1AFA67806294109E2E9EB1B46780689319E149E92956A709E46 C2B65BCE53BEC50FC8D35498716B79AA765383F0341806DF4E9E1A7D7E6D9E06 A38E5BD8FFD41E3D69F0343ED326D1E3A3B0C7EF8531DF26329EA99A0FC6F98A 9C4FCBF9C909E5C9F8750679327E1DD77359BB9E8B429EE4499E94803CBD96EA EB2DE10F69D5BF3816996D3C0DC2098FA7EF86853C5D03C1B97A85D74EDF2C41 780AC2D9650CC52932C85335E451045198821B69034F999FE4AF37B53C05E55D 10822FD428767A3C039ECE787B2469610451EC54DB23677C30D69F05C33360FB EE1BE1369AFE52F0D359D5FF0C49E4C3AF91A7419E460CB66ABC191E4FDF7076 A6ACE5F3103E5F224FF264FC3AC6AF63FC3A8DA264AD25E469274FCE0733CE33 C6598205395F31C659AC05399F963CD3C633E0CCF364F10CB24A456F3D57A1F2 0CBEEA873CE5832490A72992E4699624DB23E321506CE82FC5B53E4E69157FEC FD4FD5183896F074C518977F2AC5C88D7DFDA678957490906B06DB23DFEEAE20 5A4B8C3C657A4151F2745D7C2D63A16D3C7D2BF908787A2D66F72D3EE499F18B 279077585F98798959DEBF15861B55AA07D81EC997146748073BFBF3F1F69724 C7B376C60BB2AD3FAF1448CDC27856B68D37F59C93CF4332E6E2DBF0799D419E 7C9E6C8A27DF7704E9B9693F05E5FB38BE2FE6FB77F224CFA4F0E47C30CE57B4 73BE22E7D392A79D3C19BFCE204FC6AFE37A2E6BD77351C8933CC993129CA76D 210504E715982AD8A9741546786AFC142A4FD55F35B244C053109F2AA318C22E 482026F149F38E9CF7D7D512A58216867F060CC1947775AA48E5433C796D5B55 DE35A257658C06400B1832CB2A9E5E6CC9933C63E72919B2D24E9E16D69F06DB 77233C258F2F6EDF553BD2EC7F5A383E224F8E37F93C84CF97C8933C63E1C9F8 758C5FC7F875AEA65A6B0979DAC993F3C1A2E369626100792AC3142235CC33C0 E28438791AF98C3D790681E97169619577F5A9E1F1F03432B59A3C4DC1742035 CF53776557D43C8D2F0048B37F86B4A6229D3CC35CA692C6F65D29508873BF30 BB319EAE616E54C27044CAD37569ABCCBF7957E7D86986A7D76A5B951A803C45 DEE81598C9B6F22EA8A022E02958F8ADB753BA650CA53D92891614194FC186D7 B6D09ED8DA7741F0325F9E01DBA382E419BCFED4EE2F85B7BA38D1ED51409E05 E09FE4194D7F5E5CA3BA8235C5B300DA776BC79B49EC7F26856722C647F63F0F 49D0F83D41CFEB12F4FE88CF93D3F9BE83EFE3D2F9FE88EF8B53389F21A13C39 DF2625F3C112CD93F315399F96F39319BF8EF1EB1C57C1F8755CCF65ED7A2E0A 79922779520CF21444A0720DD0E17A84BC0D5511DB1030DA58F43CBD6C900465 84A7E00885CD5310BC4E3B30853C4FED783B76F2341B234895A76A3CA828E305 B9DAE014A5CBB48A67C4F1AC829777F2647927CF8CA1787A8968DF9D616983B7 EF66E3E949220D83A7C1EE9CD9EE6204F1CAC8D3FEF1A67602233C630C5EC7E7 21E4499EE4C9F8758C5FC7F8757A45C95A4BC8D34E9E9C0F669EA7C627D543E2 296F897ACA48FD3334A4CAFE2969897AB2A8CB7B384875CABB8C25EA6962A83F C52102A2AC3FBD2CF18D66E09AC092F532F1B6475E8B5EB3FF3A37FCEC8FAD7D B784A79725E2F9F3BA2B7752EA9F017E8AADFEB481A7AF25E2FDEA2B1FD99F4F D87A2EF224CFA4F0545F1667B2FFA96789CDF567F43C65A2EEF8B6F296FBA7D6 E30803FDCFE07B52CBD3D7FD7C2DD18D0C439EE4C9F2CEF688FDA504F497D89F 274FF2244F3EAF4B907F16C0F364DBCA7B01BCEFB0DC3F93F83ECE9EFAB300DE 17733E4381F12C98F93636F02C98F960ECCF733E2DE727337E1DE3D7317E1DE3 D7257C3D17853CC9933C29F23CA30C17A07A1CD7B0755E91C7CC02CC3BA0124F E31C0CF2F462284860034F5F07C8F319C9003279516804FF8A2D91E7E91A51C7 D55A81FDCE5C21F1D40BC0251FA6C97999BEE864CE2BCE2EE3F01AE55D6943FE AAB52F4170678D78B252B28879FAC69872F522DFA082C1793ACFE22C0832C668 F3F48AEB25E99F1A4555701C99E22FE99F928D9DD9F65DA9B0988A1A27E99F01 79465F7FCA6F6B07889369DF0DF2D46EDF9D69ECEC7F86D75F0DDB42F24CC378 5383A7E4EDB68727853CC9933C29E4499EE4499EE4499EE4499E14833C8B28EA E2C593644CF17C7CE54EA7CE5DFD2ED5559DACF2782EDAF001F4B94D7BF0F7E9 57763FB59E2AD2F96BDF9BB76610EC132FBFE3CA33E79080F9CCABEFE32F55AC 0BD6ED02AED9FFD8396BC50E681ECF69456F3DFAE2DB33966F6731572AF52006 6EA097C773D29237A18F3CBF75EA0BDBF0EBF465DBA962054928584D59BA0DDC F2783EB4E8F5AC4E78F60DAA8C4E7C6ECBC38BFFA7793CA946143CA966F5BFA6 4DE99B > grestore showpage %%Trailer geomview-1.9.5/doc/figs/color.ps0000644000175000017500000001173712310110173013446 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: blah-000.ps %%Pages: 1 %%BoundingBox: 253 344 359 448 %%EndComments %%Page: Image0 1 /picstr 660 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def %%EndProlog %%Page: 1 1 gsave 253.2 344.4 translate 105.6 103.2 scale 220 215 8 [ 220 0 0 -215 0 215 ] { inputf picstr readstring pop } false 3 colorimage 78DAED9D4192DB2010457D4A9FC017CA224B9FC1B7996D8E92B8E22A8A92056A 503774A3F717AA8CA29125F1FC044830B71B21EEF26393E7F379BFDF7FC842B1 2ED3F7FE7326DF3FEA2EEFFF937F1CCBE84BEB327DEF3C319956EA261DFF93AC 12BB327DEFF9DB9346C74F39AEC7A4DDCEBF3DF9619525CB91CB9CBD5D4F7289 588E07F2D093F44590617D3E424FDA751011925262AFC4AA56639F8EA0C596A9 58CFEFADC393B4BBE9C0B12BD3FC76DCEA49FA27170052510EDF652AAF3DEE32 39D2937D97E2F05CC84439EC96A9B080F2CD3EFB89E249208CE8C98E920DE749 405AD29369CB409EAC0059BA956BADC79378B289C97CBDC5BFF164384FB676CE 9FF4645D6569FD6683C3F597AD181CCAA1E9DEE1C4934DE5B8F92EA8DFB80F01 AB837DCDB67C5D0EF2EFAC2B4FF6DD7F9B3CD974E3966C4C4B4AEE49F965F1E3 C98EDBB78A275B6FD04256AFA6CA434F0A6FDFDEDADD1D554AB92769DDCC6D77 CBAB94D769774B2A93BB68D10B44FFE4944B41E89F9CF81C87E0493C8927F124 59CF931D8D5F3C8927ED3CD944269E24033CD9BD9F0E4FA6CDCE2CDFFB61B8E8 F4650249656F5A655AF164FA3167359DCBC968ED87F82908AD5DE59ECC417DE7 FB1319774C468EEFDE80BA19CA9D367811629CDD6904364CE60A7DFFCA1F42CC 92987C66F3006C98DCB4896092D8E5F178E49E94B4BB7326B9C510DD3CFE67E3 C9C3FE499824C398ECF664A05A0A49F159405A9E0C544B216E99FC1490AE2743 DC11C886496F05A4EB499884497526F1244CE2499884493C19B1818027F1A42B 26EDF48E279764327495E3CA9E4CAF1E0D3BC1EFCF8249F9296C5E185BCC939B 931A768E307992C94A2146F7E4F7B9C0643826C794DA184F1E9EC8EE0DE2F3EF DD1B4769FBD24E4632B97BB2A5E33FBC4469BD1326372B550A6E8A27EB4CE647 D8FDEFCA06AE982CD5612232A952706E3D593A65C9FAD68DA733D9F15F6E9954 59EFD093A5F65D2B93929D38645258795B83494943DE83274B35AB339EF45C9F 2C1547BD6B623D4F7A6E77ABDC025C31B99B3A81BBE83A6F770F667264FFA4B0 79B2461B47788FF0C9A4BC109BDA44B33C59EA03F95E5F6A8A4ABA20A2F4051D B6CE061CB690C97AF54F72CD0FCB689627FDC46DBBDB2193730B88F782E6F64F 1E4A1526F1A4E9BDBB7EFF82493C19A24061124FC2249E844998C49330892761 1226277AF2E13EEA051AEEB0679D82FC4C153DF98810DD028D78D8B34EA19B49 E69F247E6EE2CC3F497C32892797C9DF98C1936B33F92B603C78F2416C1A44CB 3039DE9320A49B542278F293D6F75AD301FCDE8BDDAC50BF174D5E2278722E93 1F3FC83786493C798649610540BE254CE2499884493C09937832C74F32C61926 61124FC224F5499884493C099378122661124FC2249E1CF9BC1B2661D2DB7B41 300993813C297F1F46FEF20C4CE2C96E268D5EE882493C79C8E41FA2FD0743F1 E41926A108265D7992301EC79B27094CE24998C493042619B7C8585A3C09938C A575EE49C9EBE5511EF6C51ACF4BFF6469EC43E9C7B599F4309E97FE49C9BB6A 6B3019E53D103C297C7F122661726E7D525E938449981CD9EE5EAC8D0393CBF4 4F2ED3C681C995FA276112266977C3249EBC42FF244CF21C072661D2E7781C98 84496FE316611226F164F4F1BC78F2224C061ACF8B27194BCBB8C5553D094530 C9781CC6E3E04902938CC7618C189E8449C68839F464E96162F73CBD21263173 357C8C76374C7A1B3E46BBFB0AEFAAC57AEC8827611226797F1226F164DFB8C5 A6A1B5300993D6FD933009933EDF3397CF3F00933039E0390E4CC2A4C3E738F2 A930601226C73CEF864998E43D7398C4933009937892E16378124F861B3E8627 1923C6789C553D094530C9781CC6E3E049425AAB737892B86572014F324C2CFA A0CBF53C49B1461F74B9AA27B903864BC269554F52C4CB308927099E84498227 099E8449822761124F4661F296A5FEBFBB9327547EB1723CBA1F5AD95EFEA195 0D5AD7E3C9334C7E5FE4FA7ED206955F3C2CA6C30F154EFC553A18950F3D3CD3 D64B87272D986C9A39615526BBBFCE9E3D79DB4BDF7DA4F58FE5456752286D15 849C33A9FEF7BB77F12BFDB85953F92F532677B7ECAB4F4A98947CE9F26B22A9 2B9EF9F6ED566257F26487822A5FDB594CD68FF90C93928F96EFDFEE4C3B6E58 513CD9741B9AC2A4BCF63580C9BEF57667BAA427CFD4D3C6D4272FC2A42ECCB1 3C5971FE610F58DFFDE20C937D25A5D8C651E996B16EEC5FD093272F452B93F2 FAAD2293DDEC9D61B2BB7DBD76BBBBE9CAE8D6275FE5272392AF89EE731CC943 A2338F54EA1FDAF1C46A99E738AEDADDC4793C78B2D45D69D43F49823239D893 7514759FE3103C392B3089276192E04998C4937892E0499884493C49F0244C12 3C49F0E45C2699413AEEC4D74B7A92925D8949E6E9257E6A5FCC674E7C32C93C BDC4DBDCD1CC674EBCCD1D4DFF24A17F122609CF71089E8449822761124FC224 09E449E1A0F8C379A2EAEB61F26A9E4C6EECF0E4E108EEDDA1B5464C4E9951F9 FC3CCFAFF6B19C5366C91EE9C97B165D4F566615E89E3EB47BBE200F53F75410 3A731B1296D19959B24D3D991398DFBBD3FFEA7A52FE8B5760B2B487266B4D99 91D8DA93291B262DEA93F5FB8BC4150B3359FFF25E84C90D96E7DBDDB74224B7 A7A6CB159AC9C3B9108D26BD549C257BB17677C58D1E987C1566C2D462B234F5 59B760A7CC921DA87F526552FAA64B61C1E4F836CEE1FCB1F26B3E6646E2653C 29BC2CD764B2DE63731D26077B52D29069BD0EEBF505BD0CE68137EA2558A63E D9F4D75ED49974358DB32993A6B36407F2E4F89C9C3B7AF034CEAFC6E7382FF1 9F121B3F4B76144F3A61D2F462123CD9CAE480E762044FCA99CCDFEB004B3C39 9DC9EE0794044F5A30297F8849F0E4AC7637C1933049F0244CE249E69F24CC3F 2961929265FE49428C7A4E987F923864B2C393CC50478C26A2ECF324978E5833 D9E449424CD3EAC91B21F6917BF28790819178325FC392E59865C5938AF928F7 49168A6999EE7AD2E2F8C1723D268D68F9F6E4EEA47F6796E9F8D5F7CC72D6D2 BA4C139377B37C4FE646A2C7B44CE98B200EF30F4B460C7C > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer geomview-1.9.5/doc/figs/initial.ps0000644000175000017500000010104212310110173013746 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: blah-000.ps %%Pages: 1 %%BoundingBox: 60 276 551 516 %%EndComments %%Page: Image0 1 /picstr 3066 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def %%EndProlog %%Page: 1 1 gsave 60.72 276.48 translate 490.56 239.04 scale 1022 498 8 [ 1022 0 0 -498 0 498 ] { inputf picstr readstring pop } false 3 colorimage 78DAEDDDCD91E336A370E109C49B594C04AEBAF5ADBD9EE51B42A7F0EE9DC48D 4359388D09C55F97BBAE4A1649100001E2EF390B558F8692D812D53A3C02C1BF FF06000000000000000000000000000000000000002CC1370040537C1201006E 33FFBFEAF0E79F7FFEF1C71F7F01C0B0D4FE3BF679FFCC1F80C28CDBDAD1D3FC 3F3F80CA5EFEF10FAF1F702E5DBA7439D665EDBF639F77CEFC0128CC5316E63E DBD1D72BF2FC182ACBF3F7FD1300C6A4DEDFB1CF7BD6FC012C62FE0B16E63EDB D1EB2B52E91393390018DDFCEBDD39F30730BDF92F5B983B6C476FAFC8D7FDB8 74E9D2A5CB7A97AF7F6F993F80459AFF8285B9C376B47D457C28BB74E9D2656D EDD7FC012CD8FC7D04346F47BBAF8803A501A006BB7F6FB90180759A3F756FDB 8E765F917A076203C0B21CFDBDE50600966AFE2A50C37674743FA50E4336A5A7 4B972E87BE7CFE29BB7E6F9A3F00CD5F616EDB8E02AF88B97D000C3D214F577F C75E3FEC347F008B37FF450A7387EDE8F415997BB62500536A7FC1ECB0FD3B16 FFCDECAEF96BFE0034FF9E0BF3DCEDA8DE2B72F1C3F7E8D3B3379E6B78FAB99F 77B76F3F07166BF58B37B93970CFDFEDDDBF63919BEEEB625FF7A3F903D0FC3B 2FCCD3B7A30E5F91B75FB96745ACB79ED39B3FF9C7D0CD3F630BD7FC0168FEB5 0B738C452FDE8E7A6BFEDB17A85B3F7C5BB182EB197957A39B33F3C7F4CDFFB9 A4E60F40F3BFB330673BC6F4EDA8ABE61FF332EDEEC1BD0DB9D97E719074DB3F 23C61AC56B7F78C9F02A05968FBCABC8DF7A77E5037B61A70F1DF333F987E6AF F903D0FC6BFCA9BF221873B7A3AE9AFFE9CB14F6C9ADCAC6BB68CCAD8A9BFFF5 9F6BDC3CD5FC777F66FED0FC357F0068529803561308A49AFF733D534F3490F7 E19B2A8149AE1B1FD5E3379EA3CD2990E5635629F2FAC8DF2EE6198BFC35939E 58E68F9E9B7FD2E04FCD1F00C66AFEE1A1E3A712A8F9A70A79DE4E53EA509FBC C41DDFBAE387C15C0FFE191B67CC6F17F38C5D5C93D32736723F08B8B3F9C71F 98AFF90340EDE65FBC30C70CB40E68FFDCED28F215C94BF1659B7FF6E096A4B9 71EE19EA1379938CE07F712722E9E6310FFD76C9FCD149F38FDF02357F00A8DA FCCB16E653D938D598B9DB51E42B92B13B56A4F9A70ED7B968FE194A9CB758EA AF9361FE798FBEBB7967EFBF9C1E47CCFCD1AAF947461BCD1F006E68FE050B73 5EF08F1FB2327A3B8A3FF222E38B982B73FB14398235757057C62CFA498BF573 6C6FA47BC7CF3B94F164D27EB46AFE495FD76AFE0050BBF9172CCC17CD7FFA76 D4E77CFEE1E1F77FE61E491A7F586B7C4E0F8F404B9D84B3D27C9E7FA61F0E9C F495D9A9D8337F74D5FC2FFE1DD3FC01A0CFC29C776C6FEADC3E43B7A3E1CEAA DC09ACD51388A19BFF95BF639A3F00F45998F3E6F37CBBDEDC3E3D7CF81257CF 1EA0F903C0ACCDBF93C26C3E7FCD9FBE7ADEA0F96BFE00D07FF3D78E347F009A 7FF1BFDB198351357F009ABFE6AFF903C058CD3FC9FF357F00CC5FF3EFA71D69 FE0034FFDA7FC7347F009ABFE6DF433B0ABC22CFC7BA72F9793F17EFC1A54B97 2E532F9F7FB78BDC5BA9BF639A3F00CD7FF1E6DFBC1D3DCF86F0763FCF07BA48 A9FB0180567F7C4ADDD5EBDFEDD7DD016E0060C1E6DF6D619EBB1D7DDE64FB19 F70D005081E75FECD7DD016E006062F31FB1304FDC8E9EF7F37A6F9FFC070050 94B7BFB75F307F00739BBFC2DC553B7AFD247ADD89F0190D0035CCFFEBBB5AE6 0F609DD13EDBC2FC0B89946A47BBC70B307F00A8D7FCCDED036041F37F2DCC4C 3E898F8F8F52ED68F77801E60F00559BBFB97D002C65FE6F85F94B681F88E0E3 1FAACEE7CFFC0140F3078022E6BF2DCCCC3FCFFC2BCDE7CFFC0140F307801B9A 7FDB813491FADD70DD347F00D0FC01608EE6DF76FC7CB7E6FF5C37CD1F00347F 0098A9F9B71A459364FE4DD64DF30700CD1F00666AFECC3FC6FC357F00D0FC01 40F3D7FC357F00D0FC0140F3D7FC357F00D0FC0140F3D7FC7D460380E60F009A BFE60F00D0FC0140F3D7FC01009A3F0068FE9A3F0068FE9A3F00CD9FF96BFE00 A0F90380E6FF79DB5D2B3EBA3EE67F4B99FFB77FA3F90300347F00CC3FBBF9EF 4A7541D3BE68FE79BB1B9A3F0068FE00A0F96798FFB6BA3F7FFEFA21B0A750D0 FCDFAE395AABEDCA1C7D6BA0F90380E60F004B35FFAD516FDD7E57F8DF347B57 FE2B99FFD15AEDAEE1D11D6AFE00A0F903C052CD3F6CFE61F10E787513F38FBC 52F30700CD1F00D66CFEA7A9FF6DC0CC58E67F7498B0E60F009A3F00ACD6FC03 E67F3ADA67A0E66F9C3F0068FE00A0F9E7E9F49DE67F71558DF30700CD1F0034 FFD39F9F4365628EFFBD673EFFC08C43A7B30069FE00A0F903C06ACDDF397C35 7F00D0FC016085E6CFFC357F00D0FC0140F3D7FC357F00D0FC0140F3D7FC357F 00D0FC0140F3D7FC357F00D0FC0140F3D7FC01009A3F0068FE9A3F0040F30700 CD5FF3070068FE00347FCD5FF30700CD9F1B00D0FC99BFE60F009A3F00ACD0FC 3F1A9164FE4DD64DF30700CD1F00A669FE1FED8837FF56EBA6F90380E60F0073 347FC48CFCD1FC0140F30780D19B3FE2CD5FF30700CD1F00347FCD5FF30700CD 1F00347FCD5FF30700CD1F00347FCDDF67340068FE00A0F96BFE0000CD1F007A 6BFEDFF628FE109A3F0040F307804E9A7F3D3F6F68FE9A3F0068FE00A0F99FFA F9F62B80AF9F9FD73CFFF76D99D75B55FA1E41F30700CD1F0034FF22E6BF15FE 57D53FBDF26D01CD1F00A0F90340B7CD3FECF0A792DF83F96BFE00A0F90380E6 1F3FDA27C9FCC3B7D2FC01009A3F0074D5FCE393FE69DED7FC01009A3F0074DB FC9306F318E70F00D0FC0160D0E6FF362DCF760E9FC8B97DDE760D347F0080E6 0F007F0F7B0EDF9BABBEE60F009A3F0068FE4D6CBF5BF3D7FC0140F30700CDBF 88FCDF3C9247F30700CD1F00347F68FE00A0F90380E6BFA6F96BFE00A0F90380 E6AFF96BFE00A0F90380E6AFF96BFE00D067F3FF06007D53B0F97F600FCD1F00 1669FECF258BF3F5A07F0198972F91AB77FF49A939A6F993FC2DAF5F8868FE00 307DF37F7EC296BD7C5382E2F7EFD2A5CB1E2E9F6FF3E2F7FC458DE66F54CF93 B7A1509A3F00ACD0FCDF3E6A4BF1AA0400E6E37507BFD2FDD768FE843FC6FC35 7F0098BBF957327F7604CC2DFFF5FE8068FE9A3F00A05EF37F3619972E5DBA6C 72A9F96BFE0080DB9A3FF170E9D2655BEDCF134ECD5FF30700CD3FA3F99B4510 4013AE08A7E6AFF90380E69FD1FCEB4DF50900475C144ECD5FF30700CD3FAFF9 979AA6CF949E2E5D7678F97C7B76B5560D9BFFE76D4F7F0EB3BB64FCCD357F00 40DBE66F6E1FC0843CB74DDEFBFA97E7FEE6CFFC357F00D0FC3B51020035CCBF C87B7CBB13113FAAFFED7E3A6FFECFD57EFBDFD7CBD725357FCD1F00D669FEBB 4A10CFAE1EDC4C93470F3852A9F5E9E1B9ADF48C51FA1BDE9BA73B11912FC4DB 626D9BFFABA56F7F38FAF9754760F707CD5FF30700CD3F52E41AEA77F387DE7D F4EBEB33D9735BFCD75967F7A176F34F7DB69B37FFDD801F63FE91576AFE9A3F 0068FE91EAB566CE7DFBAD2B696DABE7B6C6AFC3FC876BFE6F037E7A68FECC5F F30700CDFF9EAE18E35D47433B76AFDF8E9339ADC447436BB6F71FF3730DAD8D FFF5DB3EB7E1E76D771453F8818AFC3AE12D2170E5E916A2F98FDEFCC3D2AEF9 6BFE00A0F997ED8AA72A952ADE5BBDDC55CD53F3DFFDB989F99FEEBF1C3DFAFD CF6DFC53143EF633CFFC63563B66AD02F730AEF96BFEF798BF71FE9A3F008CD8 FC53CFC299D7154F7371647A4D32CF98DBC63CEE9DCD3FFE57E8FFB94D52EE3C EDBFA2F7F1AB3459F38FDFB559A7F907E6F6399A0548F3D7FC0160C4E69FE439 6F1FE51787FA045AEBA9A4E545EC8CC78D997E27BC8B94ADFD81D5EBE4B98DBF CFE2E69FF4D0A75F434CA6FDE1F766D2EF3B53F3770E5FCD1F0034FF54F37F95 FF2BCD3F664CF595289D11AE8FD6EDF5B261F0EFE7B98D3FE220FE508B48F3CF 7BE848BD9FE610E0D3E61FF9FB4ED6FC99BFE60F009AFFB7748A34FF8CE1EB79 83CCF3D47A77C04CC1F9F6AB9A7FEDE7365EDA4B99FF959D8EF86994D669FE49 037E347FCD5FF30780699A7F86FFE7CD1F927124E6959F771F28E3B6659D3063 A84F6A09BFE1B9CD183F1F7E51CAFE3A4506FF4FDCFCE387FA6BFE9ABFE60F00 9335FF3BE70FD986F45315399D1026DEDE4F877C9FFAE7CDE69F7430E6CDCF6D F83E93BE6E4855D3983982329ED59986FA98DB079A3F0068FE3D9CC3178BB3E6 89DB7A6BFE577622347FCD5FF30700CD1FA0FD9ABFE6AFF9FB8C0600CD1FA0FD 9AFF3DCDFF17FE8DE60F009ABFE60F68FE79CD3FEFC47FF7347F9E1F69FE9AFF E9E72C8009D0FC357F40F3BFBE13913A0FD83DCD1F6134FF0CF3DFFDAFE72580 B6EFD3A337E394E6AFF903B8BFF967DFCF0DCD1FF1E6AFF9C718C5AE5404FE0B 803769B7CDFF79C32B979FF773F11E5CBA7459E3B2D47BF3B91371FD7E347FCD 7F44A9D8CA43E0BF007887366FFECF055E3F6A9F9FC51729753F00CA52F0BD59 EAAE347FCD7F50AF88D70C00DE9ECD9BFFF643DCE11E009AF0F587EB6D77A0E7 E6FFBAF27937D7FCE7508BC8A10500BC379B37FFBF5E78AB6400701BAF7FB89E F4DCFCDFBC3D43E37B367FCD3FD52EFE737638212503BC317B68FE6FDAFF5AC9 00E01EDE8433DBFC6F6BFE6169DF7E11F0F5F3EB95BBCB1CDD4AF31F4230FEF3 7F138624DD048077E5FDCDDFC85800430F32B9F9AF59C0C6B7EABE75FEC09247 B7D2FC87700CF20F8CA2FDFF31B78FD930000C3BC8A49FE67FE4F091571E2DA0 F90F64FE610F2169C06DDA1FF36ED5FC993F00CDFF8AF96F8FFC8D31FFF0AD34 FFB1CC3F3B4202487A279EEE656BFE9A3F00CDFF9EE69FF14540E4A368FEFD9B FF22CA01781B6AFE003077F37F1CCFED33C7681FCDBF8872907FC07B50F30780 D19BFF7688CEEEF5A7621F33B78FE63FB475FCC731BFC05D6FC0DDF79AE6AFF9 03D0FCA1F9DF66FE79D703A8FD16D3FC357F009ABF1742F3AF61FEE47F08FEDF 019E9941B55FF357C90068FED0FC9B983FF91FCBF6ED054CA0FD9A7FF14AF66D 8F47CD23D48E1E7177C9B2EB70F398DB4ACF5BB7AB57EA991FFA65229C9ABFE6 3FB7F993FF1155DF8EC0B8DAAFF917AF64B7597786D785CF983996F95F79E8DD A308FBDC3149FDAFDDE787F96BFE9ABFE6DFB3F993FF096CDF5EC028DAAFF9D7 68FE37DB7286F9975A9971CDBFFF2A5ED0FCA1F91FFD35FBC0019AFFCDE64FFE 67B27D7B013D6BBFE6DFB6F99F8ECF29322CE468C451C1870EDCE1D1BC7CE185 C3D75F5CF3D3530E5D59B752AFECDB4B16B87EF73CA78193A526BD2298BBF933 FC5DDE9E1FCDFF3697389AED93FC0FAAFA76046E7BAF259D085BF3BFA7F9EF8E B4399AC5BAA0C71E3D5CD9E67FFA40910BC7FF7C7DCD8FCE105A64DDAEBFB291 E65FF599C722CDDF13FECAF6F9D1FC6F7689EB62C3F687C3AB76E7AEB1E65FBC F9EF1E6C7B6ADD57CCFFE8F0DED3536A1634FFD33D82F8B58A59C92276BA1BF0 B3BFC149BD938CE7367E2B8A39FF69F14D1183367F4F788CF96BFE77BA84913F D3ABBE1D81866F0ACDBF6DF32F352C24E6BFEE37FF47C459384F9F907AE61F4E E5817132A7EB76FD9565FECC5FF3D7FC97357FF2BFA0EDDB0BB8EDEDA0F9B71A E77FC3D49A3D987FBC5D9F3E75F5EC34F5CB8B7BBE8F088CFC61FE9ABFE6AFF9 CF6DFEE47F65DBB71750F58DA0F9376CFEEB987FF6A89EA3E52BCDED73712452 916310983F347FCD9FF9937FAA6F47A0D25B40F36FD8FC673AC237C93FDB1EE1 1B98CFBFB7237C23874885BF58495A98F96BFECC5FF3EFCA25569BF087CFDB0B 086FE4D78F76D7FC5B35FF47B9593DC307F986CF235C64A723639C7FA99933AF 3F6FBBD13E3C3DE9EE149A3566F58CF967F8497B44CFEAC9FC357F68FEDDBAC4 C4F24FDAED08DCBCCD6BFECE7A79333D8B25E985E65FEF8D30C4FB4BF3EFD625 66927F666E2FA0E1D6AEF9976DFE60FEC0E8CD9FF96BFE7DBAC4D0F2CFC0ED05 74B29D6BFE9A3FBB66FED0FC5FDF05814183AFEF94F00138E1534B6BFE9AFFF4 F24FB3ED08F4B9856BFE059BFFB763EA99EAFD0FFA3898DC7E94FD8E26CF58D9 F51CF199C7A0CD3FE668F1C0958F0A139A69FE2B9B7FE7F2CFA5ED05F4BF6D6B FE9A3F00CD3FE6CBAFB0D83F12E795D5FC35FF69E49F36DB051868ABD6FC8DF3 07A0F907CC3F7CF6EAC0970231E7BCD6FC997FF6236EEFF9FA8487B41FF7CBFF CD1BB3E6AFF903D0FC5347FBC42F70FA5582E6CFFC878EFF3C99F98FB50D6BFE 9A3F00CDFFBAF91BE7AFF9377189B6F24F92C9FF705BAFE6AFF903D0FCB7C37B B6A37D1E9B597DDE963F9D11C8DC3E9AFF4CF24F8FC9FF88DBADE6AFF903D0FC 8B30C17C539AFFA02ED144A2B831F31FF1BB2ACD3FBE927D00C05D346CFED9B6 3FB1F96BFEFDBBC4CD2A458CC9FFA043D434FFC84AC64300DC6FFE4334FF994E 30A1F90FED124773A4D07EF423FFCDE7A4D2FCE32B1900DCC628CD7F3234FF09 5CA2B6FC9361F2DFEDC6C9FCCB8EF307807B18749CBFE6AFF977E212DF6AC284 57A3EAE6E4DDDA73F3F799086085B97D98BFE63F81F9575A131A2CFB8F38B65F F337B70F0073FB307FCD7F29F3BFBE320498FC77B541327FCD1F80E6AFF96BFE 5C22BC3ED9ABC47E997F91A3CE99BFE60FA013E56B88E6AFF933FF1BD6277BAD A82F7AD80E99BFE60F6002F37F3570CD5FF367FEB5CD3FF52860D28B8CA37D8B 6CA8CC5FF307505BF99A0CEFD1FC357FE67FB3F90BFEA897FD99BFE60F80F9A7 9ABFE6AFF933FFE6E64F779121FFCC5FF307C0FC357FCD5FF31FCBFC892EF2E4 9FF96BFE0098BFE6AFF96BFECC1FCC9FF98FDBFC3F16800C80F96BFE9ABFE6BF A0F9535C64CB3FF39FB5F94FAFFDBEEC00F3D7FC99BFE6BFA0F9935B5C917FE6 3F77F3E74280AD7DD0E6FF0B07E756D0FC993FC0FC357FE67F1BBBB3E34EF93C CFFDDB8DBEB5EFBE2ECF2B8F5EB5A457B361F327F991E6AFF9AF66FEB41617E5 9FF96BFECCFFA2F34FECFF7DFE5E796B75FD956AF56CF469FE559BFFDBEFDEFC E4C59DAC46D95D30CD7F44F327B4B82EFFCC5FF367FE17D57162F99FC3FC4BED A98D65FE81DFA2FFE6DF8372BFFEE29DAC46D95D30CD9FF983F9337FCD9FF9C7 D863DE02B8E78588593EE3956AF8FA5E6FFEAF6B7EB4D3DA73F3BF7F337BFBC5 3B590DCD7F71F3A7B22822FFCC5FF367FEA57A2FF3BF799CD595172EF24E7A18 D375D1FC5FD739E6E70E9B3FF3D7FC993F894529F967FE9A3FF3BFA7F7C6DF49 FCF70BBB0B87353570CFA96D3CE351B23D3CCFC0937ED911CD3FB07A4703FE4F AFD7FC357FCD9FF983F97BB74ED3FC2F26D0C5CDBF60AF0EEB68A4BD4752DCFC 4F1FA8B8F9E72D5C76AB1EB7F91F2D70BA416AFE9A3FF3EFC1FCE92B0ACA3FF3 5FADF99F8E5761FE65952FDCE46B2C19BEF975F34F7AA024F32FFE7230FFF8E6 1FF367A479F3FFAD3291E6FF7765347FE64FFB514FFE99FF82CD9FF93731FFD5 AE8C9F04297BAE9EA425AF0FD761FECD9B7FB7E6FF79DB56E6AFF9337F80F96B FE91E6FF6A44CCFFE270F170753FBDCF8229FE669F8FFF8D1A9A7F91E1FA8EF0 D5FC77CDFF7973CD9FF917377FCA8AE2F2CFFC576EFEBBA6C7FC997F11F3DF6E 606FF93D6FA8CF15F30F8FA19AD5FC1F7566F5D4FCDFB4BFA0FC6BFECC9FF6A3 9EFC337FCD9FF9D71B581E7FF8ED9DE61FBFDF71DAED638EF30D0CBCB9D3FCAF 3B7C6FE67F030335FF808DCF6DFE9AFFACE64F535149FE99FFE2CD9FF933FFDA E6BFB5FDC05E40D597E3A2C633FF6E9BFFEEC0FB1BCC3F7265347FE6CFFCC1FC 99BFE63FA2F9C74FFF5ED5517B30FFA4A72E7EE40FF3D7FCC732FFB771FEF79B BFE63FA5F91354D483F96BFECCBF94F52595FCB6E6FF889BCEBDE0D1B89147FB 327FCD7F20F3EFE1085FCD7F3EF3A7A6B873AA1FE6AFF933FFBCEC7FFD9C56B7 1DB77BC5FC1F8967E36A6BFE194F0BF3D7FC1FE6F6D1FC993F983FF3D7FCD736 FF78890DFC6FEA954907A866286EFCEECCE9AD62CE385C4AA4F3BEA4C87B5699 FF2873FBB43AC257F367FE65CD9F94A207F967FEB336FFD4FF5DDCFC1F11F3C3 C774EF18498E5CAC89F927FD46CDCDFFE2B3CAFC5798CFFF29F09ABFE6DFD6FC E9283A917FE63F6BF367FE05FDFFED7FE3BF32289EE26F30FFA4DFA8B9F95F19 DAC4FCE79ECFFF4DE0357FCD9FF983F933FFF99A7F590D5BD0FC81FBB7F68F76 4CD9FC770F0DD0FC35FF86EB4344D18FFC33FF999AFF4C2EC409B188F97F3465 BEE6BFBB629ABFE6DF707D2828BA927FE63F53F367FE00AE0CFE99669CBFE6AF F9337F80F96BFECC1FC0A9F98F3ECE5FF3D7FCFB711BF289DEE49FF96BFECC1F C034CD7FEBED9ABFE6DF6A7D68273A947FE6AFF9337F007334FFC0CCFF9ABFE6 CFFCC1FC99BFE6CFFC0174D2FCAF9CA8EBF4845F9ABFE67FF3FA104EF429FFCC 5FF367FE007A68FE57CED27B7A9E5FCD5FF3BF737DA826BA957FE6AFF9337F00 9D34FFB0BD474EE3338DF96BFECC1F60FE9A3FF3073071F38F34F9A3397C6632 7FCD7F50F32799E859FE99BFE6CFFC01F4D6FC33087F35A0F96BFEF7AC0FBD44 E7F2CFFC357FE60FA09FB97D6A687F13F3DFBDA1E6CFFC01E6AFF9E735FF5F53 C3C480D59A7F78244FB6F3376CFEDB9B6BFE739B3FB144FF30FF419BFFAFD961 62C09ACD3F7E172069F29F8BE65FEA5C039AFFC42E412931DCD1BECC7F94E60F 007337FFE23437FF2FF9D7FC993FC0FC35FFD4E60F008B34FF69CC5FF39FDB25 C824C83FF3D7FC0168FE439B7FA9E9868CF39FDB256824C83FF3D7FC0168FEA3 37FFEBDA6F6E9FE95D824082FC337FCD1F80E6AFF99BCF9FF903CC5FF3D7FC01 68FECC5FF39FC025A86355FEFB0F9E8709E45FF32F329F3F10E673FBF12460BB 55F4D9FC6FDEC7E96D3534FF115D8234D676FE573C2743CBBFE66F3E7FD4E669 FE9E0ABC6D157D367FE6AFF9337F1C693FF967FE9ABF814038F58AB0E961D9AD 42F3D7FC993FED1FCBF9F9FFE8F2AFF91769FE3406CC1F35CC5FF3D7FC993FED EF53FBC9FFA0F2AFF96BFE60FEE86D83D1FC357FE6CFFCFBD77EF2CFFC357F80 F9A3A0F9DFD9FC5B1DE9DCDB6A68FE03B904456CEBFCFC7F44F9D7FC1769FEDF 8E215AEB987F871BC07605C2AB94BAC265EF6DE2E6DF708EA3DE5643F31FC525 C8613FDA4FFE07927FCD7FC1E67F9BEDD8ADE8D0FC7B7B0577CDFFE871337655 4637FF7B9A7FE0D9B8F8045E7C869F377FBD9FDB5E35CD9FF9737EFECFFC357F E6CFFC993FF39FACF9EF6AF6EBE5DB7746BBFFCC5820F2E5DBDEED763D8F1E6E 77B3895C07CDBF6797A0857D6A3FF9EF5FFE357FCD7F3B0E24F0B9F9BACCEE07 7AC10F7DE67F9BF91FBD5281EB8F36925D553BBDF9AEEC9D5E7F346669772BDD 2E93716F8B34FF806647A6F8F805AE34FFDDF58CFF454ED741F3EFD6250861B7 CECFFFFB977FCD5FF3DF75FB801026FD7CE5439FF9DFD9FC63B4ADF6469264FE 171F28FEDE061D6472BDF9A75E99344AA794F917BC95E6CFFC693FF967FE9AFF 9AE3FCC3B214BFD891106AFE0D5FFAC0E1BDBB193CFBD5CF70B3246DBBB235EE 9AFF69FD5EAAF9E759F4EE777FA7DF259532FFD347BF32DA47F3EFC725A8E028 DA4FFEFB947FCD5FF30F7C28C79B7FE4CD8DF61965A7EF54DB32CC3FE6E60DCD FF748C5313F31FA8F9272D90BAC5D678F4A4D13E9A7F272E410207727EFEDFA7 FC6BFE9AFFEE808D2BCD3F661783F98F68FEA93709C4F318F30F7F0D51B5F9B7 DD6E076DFE4DC6F9673CBA71FECC9FF6937FE6AFF91BE75F70B44FAA2B32FF4E CC3F69B44F86F9A78EF6E9CAFC1FCB8FF37F1C1FB6BFBBC0EEBC3A7973FB3C22 0E3A3E7AF452A37D34FF1E5C82FE0DEAFCFCBF2BF9D7FC35FF47CA41918EF09D D5FCAF1CE19BDAFC2347FB64DF61FCCFFD1FE1DBF97CFE4DB658F3F9AF69FEC4 6F02ED27FF3DC8BFE6AFF9EFE6B2C0FC2A91B37A1E099571FE6D5FFADD01ED49 F3F384A7E58C19E77FBA8DA5DE61CCAC9E314DB8C3593D9B347FE6AFF9337FCE CFFF99BFE63F8DF9DF3374041D9A3F46D9605A35FFBC335ED5DE576DB54A9A3F F3A7FDE49FF96BFE2B9B7F601677307F8CDEFCA1F9F7EC12FFF33FFF43FC66D2 7EF29FCA8F1F3F98BFE6DF76B8083160FE98A9F943F3EFDCFCC9FF4CCECFFF53 B59FF96BFE60FE187DABE8A4F9FF6A4A6FABA1F977EB12E47F4AED27FF776ABF E6AFF983F9A367F3BFA7F937F4EDCFDFB4B7D5D0FC3B377FF23F99F3F3FF18ED 67FE5D357FE0942FB500DEB68AAE9A7FABE134BDAD86E6DFBFF993FF29B59FFC 07B49FF9F7D3FC7F0140B911260D9B3FF3D7FC07327FF23FA5F693FF23ED67FE FD347F00E8F0C052CD5FF39FCFFC65FFE99D9FFFD70EFE9ABFD93000F46CFE9A BFE6CFFC65FF05B59FFC570AFE9ABFE60F40F37FBBF2EFCA449A7FABD5D0FC07 32FF35E5FFBF8B41FB99BFE60F40F3AFD7FC9384F6B74492CCFFB76AA49ABFE6 DFADF9AF26FFFF5D92C5B59FF96BFE0034FF4E9A7F6DF3AF51FB33CC5FF3EFC7 259695FFFF2E0FED67FE9A3F00CDBF55F3FFF2E7A7CF47EE205432FFA47D04CD 7F3EF39F5EFE69FF0AF2FFE300E6DF4FF337213980F9E6F34F32ED18F37FDB47 286EFEAFBB159A3FF3A7FDE49FF933FF4ACDFFEBB31B089F1BD49380A30D639A 71FE494B9635FFED6822CD7F4DF39F52FE79FE3AFEFFE318E6DF55F3776E5638 81EFCA5CF91270DCE6FF2AD861DFDE5DB2A0F91F1D4AA0F94F6CFEEBC83FBD5F 47FE6FD37ECDBF48F3273F60FE86EB2499FFD0CDFF4DAD03B27DB46429F30F1F 47ACF9AF69FE73C83FAB5FCAFF7F0461FEDD36FF6FC086A7E01DA905C665FB67 E1EB55FEDF7FF3B9CCF69A78F31F656E9F86A37D8CF367FE93C93F995F4AFE7F 9CC1FCBB6DFE2C17CC9FF9BF99FF53F2B3CDBFB7E6BFB5EB5DE5DE95F0A1CD5F F31FCBFC07957F0EBF9AFFFF8880F9F7DCFC9FD7876DF0F51EDEAED92E99714D F8A193AE470DF3DFDD18021B490CD937CCE6CEC75AD9FCBB6AFE619F3F9D6053 F3D7FCC93FED27FF6DB55FF32FDBFC63FC792B7E173D9FF98F65FEDB5DBF5D91 8ED7F8DD3D880ECD7FBE3D8553F37F2EB07BBDB97D347FCD9FF9D3FE95E59FF9 CFD1FCAB9AFF539F98FFF4E61FAFCAD93764FE43987F3FCDFFB4E4471E90ABF9 6BFEB799FF10F2CFD5D7F4FF1F7130FFB19AFF9BF36498FFEE024737391AFBF1 E696E1D5C3CDE3FC03E61F69CB816562B690C096101E4D9474E7F70F466A6EFE 6FFFBBFDAFB19A7F78DECEE789BA347FCDBF37F3EF5CFE29FA9AF2FF231AE63F 50F3DF0EBDA86AFE81874B5A1EC3997F60844FFCB671FAF3EE0A67DF09F337B7 CF7067F2D2FC3B7489A1E59F992FEBFF6DB55FF3AFD7FC8F0CBF9EF9273DDC95 2143B86EFE4709FDCA0899DDF61E736F81630D027B16F1072C2C68FEBB7F31DE FE77A0E69F3DA9FED14CFB239ABFE63FB4F9F726FF847C59F9FF9102F31FAEF9 1731FF80F05F7938E63F56F33F9D24EAA8F31FB9FAEE5DC52CCFFC6F36FFE6CD 3FEF2CBAF399BFE63FBAF97722FF3C7C65FFFF9108F35FB3F9337FE69F7DEC6D 64C38F31FFF8DD0AE6FF14FBC0097CA799DB277E68FD2B9ABFE6BFA6F9D3EFC5 E59FF96BFECCDFDC3E55E7F6B928E7A75F4330FF23F3FF083250F3CF13FBD37D 8482E67FF4B582E6BF82F98F25FFC47B71F9EF44FB35FFAACDBFC811BEF1137E 263D9C237C5798CF3FA6F95F39C237F5CE579BD5F388519A7FCCB89DBCAF0646 347FCD7F0EF36F22FF7C9BFFFF4887F90FD7FCF3E63FCC36FFF0AC9EE1594035 FF9B47FB1C6D24A763F84FFD3FFE08DFA3AF815267F53C3D88206F776682D13E A7F4DFFC8B98FFEE629ABFE6DFD0FC6F967F9A4DFE7F64C1FC876BFEA7A29EB7 0C261BE7DF15F365F90ECD7FA071FE018B4E12EC7AE69FBD57A2F92F6EFEF7C8 3FBBE6FFD9DACFFC071DE79F3A9C86F9337FE63F8DF907947EACE69F67FEE1FF 2D62FE57BE92D0FC6772893EE59F5493FF3EB55FF32FDEFC0333AB879DDF607B E6CFFC99FF1CCDFF34B95F37FFF81944357FE67FB3FC7369FE7F51FB99FF28CD 9F0861570E6D24CC7F9DE61F39F8FFA2F9A79E3E40F367FEB7993F8526FFCC7F 9DE64F84C0FC99FFCACD3F7EB69F2BE6FF5B3A9A3FF3BF47FEC933F92FA2FDCC 7FA0E69F34314BF804A99D8CFD383AF7134A99FFD16120E11725FE94BE46F868 FE3734FFD469FFB3CDFFB75C34FF89CDBF07F9E7CCFC7F14EDD7FCCB36FFA409 D823CFDC14739F35E42D307F234A997F78EEFDD3A73DFE7509EF4A789934FF2B E69F71B6AF3CF3FFED329A3FF3AF21FF5499FC17D47EE63F5CF3BFD25A99FF52 E6FF3A85FE23EB1CBE45CC1F9AFF23773EFFEC33FCA69AFF6F45D1FC997F29F9 67C8FCBFB8F633FFA19BFFDB749D19E61F9EFC677799A313F5061A72F83EFB1C 8934BAF96F853F63BFEFE826495B48FFA3CE34FF09CEE15BEF4C5E7968FECCFF BAFC1363F25F43FB99FFB8CDFF74907C46F30F9C29E0689448CC6AC4DC27CD2B 68FEBBCF6D11F3CFDB42BCE29AFFAEF9D723C9FC2BA1F94FE612779A3F1FE6FF E3067FCDBF5EF3DFF6FF22E6BFFB5FF1CE76FAA03CB0B6F9C73CE177BE9A0EE2 D6FC7B36FF26ABA1F92F6BFE31F24F83C9FFD0C15FF3AFDAFC6B98FFEE742E61 4B0FCF00C3FC2733FFD42DC4681FCD7FF777B987B0F9B75A0DCD7F65F30FCB3F 0126FF55B59FF96BFE91061E7EDCD3FD02E67FB3F9EFFA798DE69FF4CDD1D136 83059B3FF3D7FC5736FF5DF9E7BD38F2FF1F4561FE9AFF75F337DAA72BF33F7A FE8BCCED53C4FCBDE245CCFFE318CD5FF3D7FCC7927FBA8B23F91F4EFB35FFAA CDBFD511BE47FD76F7268EF0EDD3FCF3E6F3CFDB42BCE2C5CDFF2388E6AFF96B FEFD9BFF97FCB35C04FCFF476998FFD0CDFF516256CF239DDB6A61F881DEA6E8 7C1C1F3E90F45D03CA9A7FEA09792367F50C6F21C6F91737FFFF3D43F3D7FC35 FF21CC9FDC220CF3D7FC2F9E2995712D68FE60FEFD34FF8F46F4B61A9A3FF327 FFB85FFB99FF04E3FC53E74B64FECC1FCCBF55F3FF68476FABA1F98FEB12CC1F 823FF3BFB9F9279D3CD7280BE60FE6DF43F347BD5D30CD7F68F327FF982CF86B FE659B3FC0FC99FF88CD7F1B22E2AF6FF255E66E6329FE889A3FF367FE60FE9A 3FF307F3C7C4CDFFE2F14AB799FFE90F9A3FF367FE60FE9A7FED71FE49637B8E 9A55C6E766EA875DBD9145190738AC6CFE3173FB8467E937484CF32FDEFC8F3A FFE94C50A7B38495FA9BF03A59D9DB1BA1E044B59AFF882E41FE41FB997F0F73 FB1C7D009D7E368D65FEE6024D32FFC0108598D10BCC5FF3AFDAFC23BB7AE495 65FF3864AFA4E6CFFC993F98BFE65F693E7FE64F0E03E67F142A239F4C4FAFE6 5FBBF907B6BAF8D3CC4D63FE9AFFCAE64FFE5155FB99FF34CD3F7C26AF24F33F FD62FDF4CC5C57968F3C63D4F69461ECF4C8FC230727A73AD8EE8B62BF4CF3CF 1EE77F3474277CDAC1C0E9C24BFD654832FFEC87D3FC993FF307F3D7FC23CD3F 66B87BCC70EEA3FB69F5F3E992DCF2D4FCE355EAE8250898D5DBCFCC5FF3BF32 CE3F6F47F551F9C0DBD4D45FC4FC35FF815C82F9C3501FE67F7FF33FB5FAC8F1 1B47F773F3F5196BC52D77CD3FE9098FF1F6F04BC9FC35FF65C7F997357FCD7F 71F327FF9823F86BFE559B7F46DE6F62FEBBDFC233FF11CD3FFC5256AAAFCC7F E2E67F656E9FC0C0C2DB9AFFC5AD5DF367FECC1FCC5FF3BF6EFE3163FE5B35FF C88F4BE67FC5FC77153DFED5CF7E2999BFE67FFF7CFE95883FE6BD94F96BFE63 B904F907ED67FE9D34FFD44FD54ECC3FF29FCCFFD4FC4FB5FCD46DF25ECAA30C 0BCD7F62F3BFB8C29A3FF367FE60FE9A7FBCF99F1E037BD1FCEFFF396649E65F C4FCE3CFEC167350B6D745F34F6AFEA7B30DF460FE815149A53675CD7F5C97F8 7C50E68FFECDBFD5BB43F3AF349FFFD1F9258F66B74B9DFFE7FE593D4F6FC530 AF987FCC9C87A7D3FE9F9E05D8EBA2F987CD1F9A3FF327FFB827F833FF999A7F 467DA2640B9A3F987F6FCD1F9AFF1CE6FF1FD37BA2FBC93C99FF64E3FC4FE7F3 67FECC1FCC5FF3D7FC99FF40E64FFE693FF3D7FCB7D3B684875E1C8D5965FECC 1FCC5FF3D7FC997FC1F561FEE836F833FF099A3FC0FC99BFE6AFF96BFECC1FCC 9FF9AFD0FC01E6CFFC476CFEBF9AD2DB6A68FE33993FF947B7DACFFCE718E77F 3A686777C29CF85BD1AD09CCFF685AA4A4E1619E5BCDBF60F36FE8DBAF7BC49D AC86E63F99F9D7907F3ECCFC8B4CE0CFFC279EDB6757D8224FEC7B3A6D350632 FFF853AD0D714225E63F53F36F359CA6B7D5D0FC993FF9DFF2FD1F683FF3D7FC 6F307FD637B1F9E7BDD0B601CDBF46F367FE9AFFACE62FFB17D1FE05E5BFF619 7B99FF64CD3F7C26AC18F38F9F14687B57E16945936EE88B8626E6FFB870E2B6 EC6D009AFF277F5726D2FC5BAD86E6CFFC993FF367FE9A7F91F9FCCB9AFF91D7 057E8E5FF891754A02449A7FEA199C335EEBBC6D009AFF9772FF568D24F36FB2 1A9AFF94E64FFE8B68FF52F25F5BFB99FF64CD3FC6E4AF37FFD311E3BB3F470E 3537C2A492F9C7BC28792FD9F56D009AFF53B96B64F60CF3BF7F35347FE6CFFC 03DABF8EFC337FCDBF43F3DF9D1026C6FA4E6F18B87F141CED73DDFCB3B701E6 AFF9337FCD7F29F327FFA5B47F05F9BF41FB99BFE67F65B4CF95DE1B58BD9863 90D1D6FC4F5F4AE6AFF9CFD7FCDFC6ED68FECC9FF9337FE6CFFCBB6AFE79E3FC 1FC1295F4A8DF488D9312187F79BFFE9E6C4FC35FF6E9BFF91961731FFDD41FB 9A3FF38F7C50E65F44FBA797FF1BB49FF9CFD7FCAF1FE1FB883EEA3663B44FF8 860F07813635FFBCD7FDFA3600CDFFA2F9879D7C5CF3D7FC99FF52F2FF3D1ADA CFFC35FFDD41F2E12B2307F604C6E11FED5F047E8E995E66F7FE71C5FC1FB9E7 F0CD98D533631B80E69F6DFE3136AEF96BFECDD747F6CFD0FEDF5F5841FEEFD1 7EE63F59F34F857DAD63FE60FE9335FF780FD7FC35FF1ECC9FFCC79BFFEF074C 6CFEB7693FF39FAFF9337F307FE63F77F34F35F0718FF0D5FC99FF22E67FEAFC BBFECFFC99FFB2CD3F63EC841117CC1FCC7FB8E69F57DDDBCEEAF95C55CD9FF9 9795FF99B4FFF72CA691FF3BB59FF94FD0FC01E6CFFCA76FFE5706DBD430FFC8 655ED756F367FEB23F98BFE67FBDF903CC9FF94FDCFC7785BF49F37FBD3EBC02 BBFB299A3FF3FF5A86F9A39EF9476E84DEAD9A3F1631FF981334C75F7F7432DF 4A9C9E50206FC0DB5823DF966AFEA77375C61F1750EA08DFD37307EC6ABFE6CF FC2B993FF9A7FDCC5FF3078ECC3F467153CD7FEBD20399FF9D2BAFF9A79A7FCC 5C9DB799FF764D22574FF367FEBBCB307FD430FFA48D90F96BFE58C1FC1F1127 71C836FF47E5D9A2CADEF9CD2BAFF9679BFFE991B3B5CD7F57F263BE8FD0FC99 FF0DE64FFE693FF3D7FCC1FC93CCFFF4745D79E61F73E2B6D73B3F3AD9DC761D DE7E88BFE195950F9CE058F3AFDAFCDB9AFF91E13F653EACFD6F0B6BFECCFFB9 0CF347F1E0CFFC357F30FFD773F8061437FEE7F0809998BBDD35FFA475485DB8 C6CAB7FA8260C1E6DF7CB4CF5BB4CF1E05A4F9337FE60FE6AFF96BFE686EFE31 63E9638EF08DF1EA40F38F5F87F805CAAE7CE48829CDBFD4DC3E3D1CE11BF9D5 C3EB570081237F357FE6FFBA0CF9A7FDC567F264FE9A3F987F7864CB45790E1B 72E7E69FBAF23D1C0EB0E07CFE0D67F58C3977C0D14C3ECEE1CBFC993F98BFE6 AFF9A395F91F4D6259509EB39DBC07F38FBFF90AE6DFE1397CEF3F9357FC6345 AE98E6CFFCB7CB907FDA5FF6D45DCC5FF307F3BFADF9AF60FE8B8CF6E9F01CBE 498E5DD6FC93827FF66A68FE6B9A7F41F9E7D26B9A7F918D90F96BFE98C9FCC3 1375963D4836EFD8DB80C09F1EE19B74C3EB2BDFBCFC2FDBFCAFF8FFF5E61FC9 95D5D0FC993FF367FECC5FF367FEA86DFE8F6BB37A868F938D9C6FF3749A9DF0 AC9EF137BCB2F24BCDEAD96DF3CFF3FF7BCCFFE20E88E6BFACF9937FDA5F4AFB 99BFE60FE66F23790C728A2ECD3FD5FCE3FDBFB6F9171974A4F9337FE6CFFC99 BFE6CFFCC1FCF354FF74B40FF31FBDF927CDFF59EA1CBED947196BFECC3FBC0C F9A7FDD7B59FF96BFE60FECB6E2447C37898FF64CD3F7C5EAD22E65F0ACD9FF9 1F2DF3FDFB77E6CFFC53F9DC6C98BFE60F30FFE95F5CCDBFAC72F76CFE9AFF0A E6FFFDFF60FECC3F49FBBF60FE9A3FC0FC99FF9ACD7F3EF3D7FC993FF9A7FDCC 5FF32775C836FFC024F619C369AE0CC5C91BBA933DEC87F96BFE9ABFE6DFA1F9 7FFF37CC9FF92769FF56FE99BFE60FE61FF6E7CECDFFE25C9A930DF25FA1F957 22D5FCEF5F0DCD9FF9CBFEB49FF96BFECC1F65CDFF11777EDB7EA4FAE29714CC 7FACE65F9578F36FB21A9AFF82E6FF7D0FE6CFFC93B4FF4DFE99BFE60FE61F6F FEA7A7F4DA9EC4767BBAABC7DEA49ABBB70D2C10A3EEBBBFC8DB5AED7E651079 D2B198339169FE059BFF6D84CDBFD56A68FEAB99FFF703983FF3CF30FFA7FC33 7FCD1FCC7F57B6B73F1FCD819FF4736070CE7607E11137F17EE44EC1D10AC4AC 4CF817D95DF3565F284CDCFC99BFE6CFFCC93FEDCFD37EE6AFF983F96798FFAE 57275D1F96E15DF38F1FB7131EA7943A9629BC0E81DFBAED08A2F99AFF47237A 5B0DCD7F29F3FF7E06F367FE49DAFF947FE6AFF983F98747CBC718FEEEE09948 F30FDF366F929F6CF38FF945C2BFF522A37D6E6BFE1FEDE86D35347FE62FFBD3 7EE6AFF9337F9432FF53818F6CFBA9C93DFCFD42863F679BFFE9CA447E59D036 FECFD4FC516F174CF3EFD9FCBFC7C1FC997F92F67FC1FC357F30FFEBCDFF8AF9 E73D68CC3519E65F6AD852F66E8BE68F24F3D7FC993FF367FECC5FF367FE4832 FFB0BA173FC237303827E308DFF84386939ABF237C357FCD9FF93731FFEF2990 7FDA9FA4FDBB67F565FE9A3F98FF51DC2E35ABE756DDDF743A7E56CFED9D04EE FC113DCEFF1137F5E8B2B37A6AFE9A3FF3AF61FEDF1361FECC3FC3FC4FE59FF9 6BFE987EB44F06F39D036B9A1777CAE69F3AA76B6D028F9B74EE898C435A347F E64FFE69FF15ED67FE9A3F987FAAEA349FBB12AB35FFF853B6DD66FEA9FF9B71 13CD7F29F3FF9E05F367FE795B0EF3D7FCC1FC23E59FF633FF26CDFF68233C9D 523530142D7BDF21FCA0DB93563F82E7924B7A5B69FECCBFACFC73EFA1CD3F7B B361FE9A3F983F98FF40CD3F3C13D4E99581434B92CCFF745ADAD363D8357FE6 7F45FB657FC1BFB8FC337FCD1FCC1FCCBF93E69F21F9313B0BF5CC3F729D8DF3 67FE0DE59F81AF16FC99BFE60FE69FAA1F06FC68FEAD9A7FCC991716317FCD7F 0EF3BF226FBFFF83ECBF66F0FF7AF58BCB3FF3D7FCB188F9270D36BE6EFEF61D 34FFBCE6CFFC35FF99CCFFA2F33F61FEAB99FFDB065050FE99BFE68F75CCFF4E 2167FE9A7F46F38F3C6B739FE66F9C3FF32F62FEBF1FC0FCD731FFA36D80F96B FE440817CDFF68EE91EDEC2581393F77E763893931D6EE742858B9F9179CDBA7 88F947DEFF2338B74FD246AEF9CF64FEA59C5FF65F3CF85FF47FE6AFF96341F3 0F0C4B389D9CE4E202E16538BFE6FF98623EFF5268FE6B9AFFEF7130FF95837F B6FF337FCD1FCCFFC861324632270D93B85862B1C8DC3ECC5FF39FC0FC0B0ABF EC2FF85FDC0560FE9A3F9632FFC8B1D3D9E6FFEDDF307FCD3FA3F91F9D18B795 F907F66D357FE67FDDFC7FCF85F90BFE19FECFFC357FAC66FE5B4A997FFC1068 E6AFF943F35FC4FC6B383FF367FE57FC9FF96BFED0FC4B99BFD13E9AFFC5E60F CD7F26F3AFE4FCE49FF65FF47FE6AFF96305F30F0FC82FDBFC338EF0F57A2DDB FC7F35A5B7D5D0FCE736FFDF8BC2FC997F9EFF337FCD1FCCBFEC38FFC7D9343E 474383B060F36FE8DBAF7F3C3B590DCD7F1AF3AF27FCE49FF65FDF0560FE9A3F 5618ED03E6DF6DF36F359CA6B7D5D0FC2733FF57EFFABC9EF933FFFBCDFF6DC3 63FE9A3F983F987FF3E6CFFC35FF99CC7FDBF96B68FF45F9E7E71D9A7FA58D64 BBF97D6EA2CC5FF307F307F3D7FC357FE67F7D7DEE44F69F29F8DFBCF178B76A FE60FE60FE9ABFE6CFFC0BAECC0DEBC0FCE730FF29374ECD5FF307F387E61FF8 5DFEAE4CA4F9B75A0DCD7F5C97D88DA8B7AD00F9A7FDD9F27FF3DB44F3D7FC71 BFF96F67D7091039F76691F9794CF2A3F907EEF667349399BFE6DFBF4BEC3ED0 9D26C3FC99FF10DBAAE6AFF9E366F3DF4EA7792ADBB7997FFCFE48D51D8421F6 3E166CFE3F13B9C1FC53773A34FF595DA2B9F65F917FAEDE83F9F7F09669F866 D1FC357F5435FF54D1BDD3FC23EF87F9AFD6FC7F66318DF96BFE3DBB4427DA2F FB0BFE436CB79ABFE68F3BCD3F46F203A7D93ADA05D81A7BE07E02553F7C4EB1 F03DC73CDCF6A1B7378CBC73CDFFCEE6FFF302F78CF689177ECD7F3297E847FB AFEC0530F626E6DFE71BA7C95B46F3D7FCD1C4FC0367DD4D32FFF0D97B634A7B E0F4BE477B19493F472E90B4FE9A7FA5E6FFF3321398BFE6DFA74B74ABFD197B 01A4FD1EED1FE2BD73FFBB46F3D7FCD1CAFCC3837CE29BFFC5C142A9E67FFA70 81E593D67335F36FDEFC7F16A29EF9E70DF5D1FC477789A3697CFA5717E67FBF F9F7FFF6B97363D6FC357FF4D6FC7707C05C19ED9367D4498F956DFE31EBB9BB 8CE67F43F3FF5914CD5FF35F2DF527ED02F0F6E2E63FC19BE8B6B7CFCACDFFB9 80E68FE6CD3F7B9CFFE96102313B1D37987FCC7A1E2DA3F9D76EFE3F2B609CBF E64FFB037B01D4FDBAF6CFF73EBAE71DB472F3FFE3DF68FE286BFE4975FD8AF9 5F1F45738FF927DD7041F3FFE4F52FD26DCDFF6735CCEDA3F9D37EA0E116AEF9 EF3699E79E82E68F1AE69F71786CA0963F7F4E3A7236FEBB86F0633DA20FD40D 377F47F80684F3C96DCD7F57A18FBC7A7B7DF8E645CCFFED21DE7E8EF17FCD7F 3897A0FD20FFCCBF78F37FD37ECD1FC5CDFF6D744D60D44DCC3098570F0FFC6F E421C081EC1FB37F111899733ACEFF7427E8744AD24ECCFF571C49E3FCB3CDFF 4AF37F8BEAF1FF7C53F1ED95D7CD7F77B72275FC8FE63F96F9D37E907FE65FAF F91BE78FDAE68F095EDC54F37F5DA0F371FE0399FFD1509FB2E6AFF9B77509DA 0FF25FF5DDB478F337B70F983FAE8CF6D9FD8BF1F6BF9DCFEDB3ABF75BC1AE6D FE47A386228FF00D0F58D2FC8730FFA3B90D693F9695FFEBEF29CD5FF307F347 9FE6DFB0F96F137A5BF30FFC70F473786534FFFECDFFE8B6B41F2BCB7FA5B795 E6AFF983F923CFFCB7F2BFFDAF219AFF91E72799FF95237CFB317FCDFF7E97A0 FD408D3782E6AFF983F9A35BF36FDEFC4B8DF3CF9BD5B3DECCA29A7FE7E64FFB 814A6F07CD5FF307F34771F37F95FFDDEBFB6FFE658FF0BD62FE9AFF6AE64FFB 817A6F0ACD5FF307F347B7E63FCDDC3EA39BBFE67F9B4B543AAA1198E05D56E4 6877CD5FF307F3470DF3FF92FCDD2BC79ADB67F720DFA36B7677018A98BFB97D A6377FD3F80037EC1A6BFE9A3F983FBA35FF7EC6F9171C631F6FFEE6F35FC7FC 8DF001EE19F9A3F96BFE60FEA864FE9F6CAF19716E9F9ECDDF397C27307FDA0F DC26FF9A7FA9E6FF0B38386DAB8D6462B6A298B46168FE79E6BF1D08B4FD16E0 F429D2FC3B317FDA0FDC29FF9A7F91E6CF7F706AFE9E8A15CC3F75C3E8B6F957 92FFB0722799FFE9F985CB9ABFE65FC925683F70B3FC6BFE179B3F00E4D173F3 AF21FFA7CA9D61FEF1637B34FF0ECD9FF603F7CBBFE67FA5F90B9E004A7D65D0 5BF32F2BFF31CADDB3F96BFEC5CD9FF6034DE45FF3BFD2FC01A038FD34FF52F2 1FA9DC79E69F37D447F36F68FE811908693F5056FE77DF809A7F76F30780AAE6 DFBCF95F97FF78E5D6FC5730FF15AC03F01ED4FC0160D0E67F45FE9394DB38FF E9AD83F603DE869A3F0074DEFCF3E43F55B9CDED33B772240D480090F74E3C1D 4AA7F96BFE0034FFF853685DD4FE41CD5FF3BF68FE06F603CDDF8FE137A3E6AF F903D0FC6B5063B44FC1D5D0FC8B9B3FED07FA917FCD3FBE92997E1CC06D346C FE37EFE3F4B61A9AFF3D9A41FB01EFCA9E9B3F0F0170BFF93769FECC5FF32FE2 1881A105B41FF0C6ECB9F97F0380DBD1FC35FF710523703821ED07BC377B6EFE 7F01403B347FCD7F38BB084C2148FB016FCF9E9BFFEB0D5DBA74E9B2D5A5E6AF F98FA216F19A01C03BB4ABE65F96CF07AD71B700FAA1EADBBC76F36F7544436F ABA1F95FF18AA4A10500BC497B6BFE053FB2BF9480FC03D39B7FA5BF21559B7F C363997B5B0DCD3FEF73F668C290D329C401DC29FF47EFD399CEA997D1FC9F35 A6ECE573352ADDBF4B972EDB5E3EDFE695EEBF52F347BD53AAADD3FC014CC09A CDFF8F6A3C9500C0AC547D9B576AFEBB7C7D0A7CFDB0FDAFD70502F7F0F6433C E147CFBBC326A7545BA4F903C0A0CD1F007AE6B6E61FF0F648A5BF68FE81DBDE 6FFE9A3F00CCD7FC01600E8A34FF24F37FEE9BEC7E35902ADEF1E6BF7BFF472B 93B40BA0F903C0DCCD1F006632FFDB9A7FD8B1EB35FF53B77FBB32694D347F00 D0FC0160B5E6BF2549CB3B31FFD4D5D0FC0140F30700CD3F30EA664AF3D7FC01 40F30780159ABFD13E9A3F0068FE00A0F90F64FED947F86AFE00A0F90380E6BF 9D4EE72DB05F9CDB277C7C41EADC3EF1F2AFF90380E60F004B35FFB293E41799 7EBFDEE36AFE00A0F903C0B2CD9FF96BFE00A0F903C0DCCDFF54BFAB9AFFD19D 577D5CCD1F00347F0098B8F9FF6A4A6FABA1F90380E60F00B336FF86BEFDA9D6 BDAD86E60F009A3F00CCDDFC1FB7F3A5D6BDAD86E60F009A3F00CCDDFC99BFE6 0F009A3F0068FE9ABFE60F009A3F0068FE9ABFE60F009A3F000CD7FC6BAF5BA4 F9B75A0DCD1F00347F0058A4F97FDEFCE73F3437FFF8D5C85852F30700CD1F00 34FFAAF29FD4FC2357236331CD1F00347F00D0FCABCA7FEA689F98D5C85846F3 0700CD1F0034FF5D5B2EB5179031CEFF68355EAF8C5F40F30700CD1F0034FFED A1B53F5F6865FE47ABF1FCE7F687D395D7FC0140F30700CDFFC8BA1B9AFFD16A FCDC10B9E69A3F0068FE00A0F98FD2FCAFFC97E60F009A3F0068FE4745BD95F9 9FAE46F8FADD1B6AFE00A0F90380E65F9511CFE4A5F90380E60F0073377FE6AF F90380E60F009ABFE6AFF90380E60F007337FF9F075432FFC861FC49070268FE 00A0F90380E6DF9BF91FC97FE46A98DB0700347F6E0040F3BF62FE3159BE94F9 473E68FC8A69FE00A0F90380E6DF89F99F26FDD3D508DC83E60F009A3F0068FE CC5FF30700CD1F0034FFBFD71BEDA3F90380E60F002B37FF758EF0D5FC0140F3 0780959BFF3AB37A6AFE00A0F903C09ACDFF0ACEE1ABF90380E60F00A334FFD5 CC5FF30700CD1F00347FCD5FF30700CD1F0034FF22E69F318CFFF4869A3F0068 FE00A0F977D8FC4FA7EE49FD2FCD1F00347F00D0FC3B34FF578D0F54FDA3FF8D 5F0DCD1F00347F00D0FC7B6BFECF7F6E7FD0FC0140F3D7FC0168FE838EF37FFE FC7A7DC6029A3F0068FE00A0F97768FE31E708CB5846F30700CD1F0034FF7ECC 3FF2D4C0198B69FE00A0F90380E6DF89F947FA7CDE929A3F0068FE00A0F9F7D3 FCEF5F0DCD1F00347F0058A4F9DF46D8FC5BAD86E60F009A3F002CD2FC99BFE6 0F009A3F0068FE9ABFE60F009A3F0068FE9ABFE60F009A3F0068FE9ABFE60F00 9A3F00346FFE1F8DE86D35347F00D0FC0160E2E6FFD18EDE5643F30700CD1F00 666DFE088C02D2FC0140F30780CECDFFF9E7EEB4F9E3D4FCDF745DF30700CD1F 00FA31FF3FFE8DE67FB1F9BF3E999A3F0068FE00D0D5689F279AFFF5E6FF4A9E F9EF7E0BE3331A00EA35FF2BDFD502C088E61F18E7FFED1F02F67BBA403C91F7 F37CC4D7E5B73F175CB1A335DC8EF3BF68FEBBDFC2F88C06804ACDFFE277B500 309CF987C7F9C7C8F3FDE67F64FB81056A9B7FC1B97DDEBE85F1190D00959AFF C56203006399FFE9DC3E9175FD2DC8BF19F2F6CA6D96DF5DE6E856A9E6BFBDE1 D14A06567B7BAB1A73FB6CBF85F1190D00959A3FF307A0F9679BFF69787FB3E8 8C86BFBB2F90F770E19BC77C89603E7F0018BAF99BDB0780E6BF3BDA27E987A3 113219FB088174FF764D602725635C50AAF99BCF1F00466CFEE6F601A0F99735 FF57E2CDFFE856D7CD7F7BCFDBD13EA7ABADF90380E60F001337FF5DC78E6FFE 195F046C6FB51D8D7F74ABF87B8E3C3A58F30700CD1F00A66FFEA963664A5D19 1EED73D1FC8DF30700CD5FF307A0F967987FEADC3E81E37063E6F6C933FFECB9 7DB6CB68FE00A0F903C094CDBFF67CFE65A7FDBF61C5347F00D0FC0160CAE6CF FC03E6AFF90380E60F00A337FFD34362EF37FFC8FD11CD1F00A0F9034064F387 E60F009A3F00ACD0FCA1F90380E60F009A3FF3D7FC0140F30700CD5FF3D7FC01 40F30700CD5FF3D7FC0140F30700CD5FF3D7FC0140F30700CD5FF3070068FE00 A0F96BFE0000CD1F00347FCD1F0098BFE60F40F37F9AFF97D372FBB0F36BFE00 A0F903C0D0CDFFE9B40C3FDEFC357F00D0FC0160ACE6FF0DE968FE00A0F903C0 58CDFF2FE4A2F90380E60F00A334FFD73F832EF32E6B347F5FA900409FDFD502 C0A0CDBF2C9F7F426BDCED106B58B6F9FB320500BAFDAE1600C66DFE05D5F7CB ABBB95FFDA6B58AAF9FB0EC5A54B972E7BFEAE1600866BFECFF1E4652F9F125B E9FE3B5FC3EBCD7FB56F610060B8EF6A01602CF3FFA31A5F5EFD47C7545DC322 CD7F9D6F610060C4EF6A016020F347557C0BE3D2A54B97737F570B00806F6100 6085EF6A0100F02D0C00ACF05D2D0000000000000000E89CFF0FEBFBC679 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer geomview-1.9.5/doc/figs/main.ps0000644000175000017500000002710412310110173013247 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: blah-000.ps %%Pages: 1 %%BoundingBox: 210 321 401 470 %%EndComments %%Page: Image0 1 /picstr 1191 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def %%EndProlog %%Page: 1 1 gsave 210.72 321.6 translate 190.56 148.8 scale 397 310 8 [ 397 0 0 -310 0 310 ] { inputf picstr readstring pop } false 3 colorimage 78DAED9D5D929CBA120667955E81B7741FBD0676E3576FE53ACE447460904A55 A5D27FE603316E77030D22FB9310D2D71700C0ECFC6EC3AF5FBF7EFCF8F11B00 F6E5C77FB45BFF5F8DDC35F5F79FB1CBC7FE87AF9F254B96332C3F9779F89ABF F968EAF17A14F7FD0780FDB8A79146EB7FA4A9469AE25402EC6DAA760249A6A9 EFD759B264C972D45293A6384A2C59B21CEBA87B6ACAA529EE7E02C0C08E079A 34D5AE970200400E2135255F8FBAC3486F04962C275C7E2ECFA9F6CA91A6B8D3 07C0EDB96EFD8EEEE6B1A629FA4D01ECAAA9906BFC6D3C7D4BD4633DFDD35472 FFF524BF4B67866C5D38A151FB33C3B16D74C4F04F876BB3683CE58978BC6DAD 34F52872038BDF6C92ACDF9FCD8E6DF8D739C775ADD394F568AF95A692E5E4CC 1FCAC7B76E740D8E3AB62DBE0E9A5A2E4D3DEA7D4BA4294D21C925FCE4EBEFEA 52F1F73757C37AAF5FF3778B6B50FFF5C71E5BF9B8252BB3F28642BE8E5C1284 178B25843475489A2A9E77AB25DED742F2BA286A2AF9F7104D15659BDB7AFF63 AB3F4472E3AA4F539ADDD6EC95B0867535B5659AB2F623F519BBF843ACFC5133 5D269ACF6AB6DB334DE9BFC2FCC7D6E4079FA36A5CA4DFA5CDD294DEC3F3A429 D349796CB7B2C627FC8A154B942F1E38B6ABB91927FBDCED2861F72639B6FA75 866BCAB4E962C0DBCC51F2B569FABEF3A4295F0CA84C539A76809A9F7B4724C8 EDDB7D39304ACD736CF5AD64FAE641A5A67C9B56BA689B36F6629A527EDFA9D2 94A3DE579FA61C4D2EBE86119F0792F5A6C07E4D4D35D5FAD8EA0D13A5A91A43 EA6FAA9E93A64CF5BE79EEF4399AA76AEEF4396EABF96EC3C96DB6CADB82BFA2 FB5EC66680FEC7D6D1E6239F94D8AF13D260B5719AD2374F9DDC6FEA519F928F 5BF1F6905E35C5660AE5EDA46E9A32B576763EB6F23A4D41CE7A1D69EE183A8E EA4E353EFA4DE98D0DB071FBCFD269AAC678DBA729C051388A34459A021C05A4 29D214C0E169CAD71B9C3405007DD2944956A42900E89FA6DCEB71A4A9CF676B 96DFB3CCFF62661F962C275B465D9B1FE3D5AF474853BFFE9D21EBFBF5CF072B 895A0F00C412786D46AD4A4853EF2D325918000C9CA7EFE1AEC7947C1F2BFE01 00E8CB3D4DDD27EFBB6BEA5E4FE48801404F7EFEFCF99821F4ADA9C75D80EF0F 5E0000EDF9F91FA63B7D680A0046694AD96F0A4D0100690A0080340500A42900 00D2140090A6485300409A0200204D0100694A26F908E1F7EB9F37B4F86AB9ED 26DFD9624F1A7DAF9EC8C76D9E9D8C3A0B1B9C32D2942F4D759683A3C8BDF724 64970696F9FA4D3FEC34B3ACE41FA0E26E3FBE264E38364D0DB99C1D9A8ADDA5 D535B54AD208D41490A63469AA58410BAC0BE4AA9FE13B20ACF6FDA2E6CDF2EB 21FB2F7CBC7E0F63CFF5E3240AAFBFB7F8FE67719F57A90B93A61A69EA5D7EDA 5D68B98DB64853C5CD29DFACFF3B6AFF93EB89DAC3A873ADD454D3B3001BA4A9 643B76510EF59ACAB59FE736D44E53457DE9F74DB3AB81974F321AB9D3B27525 EEE3AC2F5DF2A79A165158374DC5D60534FF354A5342A52FE734C1F64D2F1F61 8BB98A52710FA3CE359A224DF56C9BEAD61F601E4DE925503C8CAD2F1F6B38EC 99F7E4F62834459A4253F59A7257EE72EF6F7AA7AFB25A1AD87A86A6485343D2 D4AE4DE8A60B64862674A1DFD49C4DE8CA5AB31C5F4D6F465367A6A92BBA4382 DC8A2EF7870FF4A4A36D2AEA767FD4314CC621B97F45F2BE7FBB0E099A7FCA07 F05277484053FBA529880A81EC21A02946484002680A485380A600664B53C23C CBAD2FA5519BBE32DD87D652E5C0A317BBB73CD8429A0200583D4D010090A600 8034459A0200D2140000690A0048530000B3A5A99F0000BD70A4290E1A00F4D7 94354D010074C3D7360500D007D214004CEE28F79D3E6EF601409FDB7C35698A 6308003D35459A02800FC3EB7AA429009859537FBD449A02806935F5ED25D214 00283535AA318A3405002B6A8A34050027A4A9139E2DA200039A5A3A4D6DEF28 3224A0A93DD2D4DE278E020C686A833485A65A70CEF4734CAE37B3A692E7E5F3 62EEACE9CF26696A514D9D3657E69CDFCBB757F5676AD4D1985353A4A9393595 2BE71B9B6A0F4D45FDACACA529E15B90A676D554B16C33FFF8242742F37EC799 1A787EEBD3D47DCF73BFB0A4A99D34454BCE703BF934E53B593354ED2B3575DF 67CDDFA4A94535155244F52BD127B7E49BE56B4A58B3357538B6E296864F17A6 2FBBA2A684DDCB3552155F274DADAEA9C024205F3B4AD52809D7547143E19AF2 BD39562CEBA6A9DC1BE46236304DE97FB6D054C83191D34E8B77CA1FAFD79469 43264D859F0E34A54F5353B54DE97FB0D054ACA64E7B517F4BD47DE7CEF4CEFA 5A1B9AEA99A6D05460F92CB60F28A34B60C8E92C1FFD371AA8A99026269AD049 53686A334DBD0BFF23D8F86A7C359A2AB6FC6FA9A9AB4D87842169EA5D72D054 7D6388BE7DBBA7A6F4922C26224D43BA50FFEAA9A97AE1CCA6A9D64C95A672E5 134DA1A9104DBDD52428AB5B137AD3ED9EA0A96E694AEE1283A694D9D85795AB B9A066D094E9D0E92B80688A34459A6A1AA84C1969ACA62E45B799404DC53E08 89A68E4A53B44D0506AAFA8E8EDD1AC66B347519BB688ED594E3B0A0A939D314 95BED86020FCAFF545530BB0E37A343D95E3F8460EAD55EA22FCA8A229FA4DAD A5A94BD10F4793281C4FC1B813420B4D5DC6A151C66AAAF2A8A229D2D4729AD2 C7277D180B0F391D3465FA46C3355553C39D4A5363E746214DADA52980FEA57D F8144E9DD3148F1E03ACA5A919669A63BC29340530398C3785A600D6D214690A 4D0190A6D0140090A6D01400690A4D5172004853680A004853680A803485A600 803485A6004853EE34F5676B283900ABA7A93FBB43C901583A4D01004C9EA600 00485300409A224D0100690A0080340500A429A1DF141C88EF678BE3067211A2 DF144451A3298E1E0845A8519AA232786632AFD1140710FAA7298E39650C4D41 0B4D91A6004D01690AD014050648534ABEF2506036D3D4846739398DBBE9FDD6 F5D7AC8D343589B236DB109A6A778DB7D3546EBB0EAF6EACA963DBA6D0149A42 53A4A9153595AC207CFF7D7FF1FE9EC73B1F1F4FAE6D9B6AE68A9ACA9D0EE1F5 5C49B8FFF3B139E1E3EF9DD4BC9EABBA268BE2FB3D8EB591A6E6D4D45B2F42C1 36FD9DDCE806A65A344D25CF82F51457960493A62A37A45F5BFFC2499AAA0CF9 F249D7BF2D57B04953ADCFAFD07E9E0C18EE535CCC6FB2A68AE6AC2972494DE5 3ED5BF7092A62A2B7D0E4D293F4EA56F86B629E1B4EA4FA5720DB369AA58D5A5 6D6A894A5F7D9AD2F8104D4DAB29EB478458A2D1941CF09AA6A9B1859334E5D0 5460A5CF5AE6D1544F4D992A7D0E4D592B7D53698AB6A955D254B1D6E66BCFA4 097D064DD534A15BD394B2D2E75EA1FEEFA59BD04953B986A3649783E4DB922D 12B2D9689B1AD50BDD74B74EEE51A0699B2A1624476397A9285E5B7448E099BE D66D201BC3337D409A9AD64B63EFE1A229384D53A4A9CA0A05650C4D01690AD0 1490A6485380A6E08434054C0B622A9C009D679661828C9371688A8306721162 D6630098BF32C8ACC700B090A6485300409A0200204D0100690A4D01C0BA698A 8E1F747A711742803EFDA6BE37040752D90B1DA05B2F741E7C383999F3B00CB4 28428DD21449FE344234C561DCA324F8AAF357C767FA2872C7B627A029781480 A822D43A4D7DC1EE7C8A4194A6A8FB2CCA5B08DF27F47FFFF2F73DEF574C9A0A 4F535CC5680A4DA1A98791922F8E4D539FFF924BFB7D25B9690D1FE3DE9B5E91 376D7A1D3A684A9EE0D237566AFF41568F1AD0B59BA65AA429CDC5FE2E969552 42534B6B4A3FE59CD203C20C3253696A69AD1535752F2AB9D707A6A9A69ABA6E 73FAA0A9A334A5BFAEDD1F4453136AAA439A7A9C1187A6926FC87D2497F91F25 5FDE3D18DB36254FD15B396FAFA6C0080543AE549A56BEFAC41FB2A61EFF9BFC AF49D2D43B7237D594B039D3FB61754D0915BD904984AFFCECC9EE95A0A95169 2AA7A3769A326DAEA6E688A6C235559C68D8716927538D666DC539D9931AD437 B2EDAD29E1F9DF39D35488A6043BD56C0E4D2D9DA68A779073092A2796E4AABE 7493B0A3A9769A5A254DA1293455D9EC6C4D471A4DE91D7894A63E9D10842EE8 A42934C59D3EE183952629063C34253BCAA1A90E692AA4095DDF57C1B4399AD0 0FEC37A54953354DE8D6956FDC2121C784FDA61CF76ADD9A923B24C81D184853 632B7DB932536C772ACA4ADF849ECBDBD60E09C5862F9F7BD7AAF469A6E79BB3 17FA65EFF90907B64D4DC5D749CFBF74D0D49C6D53D65A159A4253686A034DE5 4EFD3C6D5342971559503410A1293485A65AA729CEDD398593815C28098BA629 CE1D9A4253686AFE3465BA2F23F7E99D24F3CBCF47A0A9704DE55A32E573A4EF 944E458F3465EAD9A2ECBFF755F7507C48BB0445B78FA6E43E4EC5B3A03F4D5F A5511460EF3455F3B385A64ED6D4576AD41DD3590ED1149C96A6DECFB6583525 DF0A4CBE27D7D5BCF8746A6E9D73564837D3D4DB4E8EDFACAFFCE02DFA02337F 5B04692A304D151B761C694AF9F0827537F40F4450381BF542177C55A3295F81 A1009C93A6344F973B3495FC2F7D89F20D1344296DA729D393B91D4E2E374D4E 4B532D34551C1748A839BA4733A3B8AEAB296B81A1D2479A8A4D53CAC4559418 9A1AAB2961E89ED834658AE8B92204A4A9169AA2D23779DB94324D39EEF48568 8A0260D5D4CCE34D5DD334A19B1A5169425F4253BE7E53BE024301A8D154ECB0 781DFA4DD57748C8153661E81EB957837CDF39573229A5433465ED52AEEC9020 1718DAA66A34153E2C5EE75EE8A37A69C25A9A02343555BF293485A638A4686A 489A3275FF265DA32940539DD314A0293485A6264F5380A6D0149A9ABF6DCA54 C5CB3D0DEA68B0B25618DB5530371EA56A923B7D726F289A0E4853454D59FD50 BCEFBF96A6F6EEC630C97853688A34D57ABC293485A6AEEAF1A6DC73220369CA D4BDD3A429CD9CA142A5B2F2FD8E818CB6BC7739CF7853CA19D8F50F1D63B933 D394A68946F93855CD24DAE17F17DF499AB26ACA31DE946606F6E4394253A4A9 D68F1E5FE2335F4D5F77EC159AD268CA3D904BF1EFE49AD11469AA66A482819A 2A0E4984A616D5947C6695E71ACE4C539A76AA51694A29193435C37853F2B3C3 C5338BA648538ECAD4CC9A52FE134D39DAA694E725F78AEFCCBE9770669A2A36 32576AAAFFDF878F5235E17853F22D3FA1C99D5629D2D4A37140D36260D5D435 A243C2E1A354CD39EBB1DC7E55ECC78EA64E4E53A6A61E0A0C9A02347531DE14 A029204D31DE149A4253688AF1A6004D01698AF1A6004DC1EE6D53C5BA9B69B0 296A8527682A77CFD4D468C0D9214D450DE4E2EB9A9E6B99870D34A5EF8E5B79 1F1948534D3545993C4753BEF34E91204DD577EF2C3EB17279C7C413FA586A46 62517E90083783A6AE8ACEBDEE22017BA7A9E2683FF59A723CF3A27FF3B5F5A8 E6B369CAFA4842E063509CEB93D394E3C997CA30AF1FA131648C293415A529DF B078EED74D4502B64F531D34551C2ACA371291BC7E0AE7F0F1A66A460F4353A4 A99E9AD2FC10EB7FA9AFD2DD258AEE129A2A9E5934459A928D147BA72F2AE16B 2C4AD11DAEA99AD1CCD01469AA5D13FAA56ED67654FAE40FD2AC3A95A67CC5A0 BE48C0DE69EA52F42EB6D6EF84B6A3CB387B8872C0ABE4FA299C33F442777448 701409D83B4D59A16C1CAB29405303D3149A4253680A4D4D3EDE945E50246D34 0568EA62BC294053409A023485A6D014690AF6D5947B5029F93E609F2685D899 493BEF3C690AD094A6CC2887463469EA7DE12FA4A99E3B4F9A0234A5D4D4E57D F4DB3ACD68534D355ADBB19A224DC1FC9A2AF6E1F4694AD3B9F7317BBB7276DA C71FA6696DDD3BDF7F845BD2149CA629B95BB8FE6FB9DEA4596D5253EDC6346B B4F31DA217690AD0947CB56A1EB3129AA04DAB750F6CD579E7951567D2145731 9A7268AA72048CAB7AC8A0393565DDF9CE4D58A429384D53CA510A6BAE74B740 66D094FEE3FB698A3405E7A4A91334B565A58F3405C33525F731886D85F6356E CBA31927FF2E6AAAD1CEF7CC54A4294053C919B1AD1D12E48668655781E24D37 B94382FE83353BBF718704D214CC50E93B9C450706214D019ADADB4B1B8C664C 9A02347582A9961E638D3405680AD014690AD01490A6004D593515382C40CF31 F96BAA6FB44D91A660214D39E6441BAEA9CA6E004B0FFE4F9A82333575C53DFA D1C70095F10F4D91A660334D39260F4D3E21F8EE0F204F3C2ACF67AA545072E8 2AFD34BB8E3793A6D0149AEA3C908BFB5197EBDFC75E4C0337299F6AD10F7150 F4A1E38B8C7A5E86340568EA6D8CA4046A1E22CE89C531AAB97254287D9556DE 07CDD382A4293485A63A8F90205F98CA116084118C35CF0E9B64E5D094E68BC8 DF7ACB4A1F690A26D154D136CAD4640D337272735CEC6E4D15774619C3BAC52A D21490A6FA68CAB751CD2B0E4D45D55E699B425368AAF37853C9FA54D4C85195 4DE8FA3679539AA2099D34052B6AEA8AEB90906CE4C9C944F38C70EE0DA6A1AB 723B731DDF218134053354FA1C2CDD3172B392409A0234A5AC7FC1AE9A224DC1 42696A83319AD014690ACEA9F401698A3405680A485380A634E34D091540CE05 698A34059D35656A77AAD714A2234D019A7268AAA73DD014690AD05488A692BD 34AFD7B324727785DCE49BA63EA29C7AD2141CAE29C7284C516FB8ECD3BE0369 0AD054AE6A263F1DAC79A24DF3F85BCD0809688A34055B6ACA3ACE805553C571 9CD014690AD0545153A6D1ED4C9AD28CE384A6485380A606A6298D82D014690A D0945066F403B9D4A72947133A679C340568AAB5A6AED2384EEFF6AB5CCA02D2 141C5BE90334459A023405A4298A1C9A4253688A3405680A4853A4294053409A 02347595C69B728CE5A29C72BD066EF991A6004D0913DE0DD7945E9E4D6D369B 2A495370A0A6AC57654F4D5D134C347CACA648533083A634462A0E397529E631 F70D2A659A09D4B1B9C001B24853680A86684A33A2944653BE41A54C23CCB827 5BBF829EEE214DA12918A529B9AEA74F53957546ABA68A9B730F9035437D706C 9AFAD8893405F3A429618C175FA5CF77F99BB6E5D694724C9BB1F5BEB169EAC7 BF90A660AA34E56E9BD20C3C553464074D2907C81AFE8874CF347537D2BD6DEA 93B54853D05A53A6DC52A3A9FACA541F4D993E389BA6FEE8B0A6A90F0F4DD136 053D35E5687F1672C87DE416E57A4C294EDED6A56E0997D3D48A4DE8829AEE6F B0B64D253545DB14F4D4D4A3922554BE34B5A1BB348A034FF93495DCD6651CC3 2A6480AC51A6122A7D39573CFE973B7DB0A2A660C592D05A53F49B023405E19A 7A9B2AF95FA4294053B087A6485380A6A085A61E3ACABD4E9A0234051B688A34 05680A1A69EADB48C917495380A660274D91A6004D413B4DFDE5FDCAF034F507 CE2050531CCCD54BC2432FE10FCBC4A6294E199AB26A8A23B999A6428A50BB34 05A751AF29A008754B53702C6E4D010845283C4D117AC9FCBEA657805C110A4F 530000E195C1D8340500D05453A42900204D010090A600803475D714B75001A0 0FBE34C5710380CE9A32A5290E1A00CC9CA6BE0000BAA34F53BF0100C6514C53 776BB164C992E5A8652E4DC5F2772B2D560B00F3D0F432CFA5A9C0F57FEF3FA6 02D85E538D1CF248539F7B7CB1CBCFFE375A3F4B962CC72E3F9779A3F57F34F5 A3199FFD07805D697A9973F71300E6E7FF1439BD97 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer geomview-1.9.5/doc/figs/save.ps0000644000175000017500000024146712310110174013274 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: noname.ps %%Pages: 1 %%BoundingBox: 216 249 395 512 %%EndComments /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 371 string def %%EndProlog %%Page: 1 1 gsave 216.96 249.72 translate 178.08 262.56 scale 371 547 8 [ 371 0 0 -547 0 547 ] { picstr readstring } image 800080008d000000e3d6019d5680d680d6cfd6015656e2d6019d007f00d6 d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656 d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d72d69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69d56d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69d9d9d000300d69dd6e59d0256d6d6809d809dd19d0356 56d6d6e49d0156000200d6d6e49d0156d6809d809dcf9d0156d6e49d0256 9d007f00d69dd69d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d567f9d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d566b9d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d56fb9d0156007f00d6d69d9d9d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d7f569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d72569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d9d9dd69d569d000600 d69dd69d569d800080009b0006d6d69d9d9d56000700d6d69d9d9d560080 d680d69dd60700d69dd69d569d007f00d69dd69d569d00d6d69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd6d6d69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd6729dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d 9dd6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69d00d6d69d9d9d56000800 d6d69d9d9d5600d6ea9d0156d6809d809de89d0156d6e99d0256d6d6eb9d 085600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6809d80 9de99d0256d6d6eb9d025656d6fc9df200fd9d09565600d6d69d9d9d5600 0800d6d69d9d9d5600d6eb9d025656d6f09dfb00809d809d049d9d5656d6 e99d0656d6d69d9d9d00f49d0000fc9d085600d69dd69d569d000900d69d d69d569d00d6d6eb9d0256d6d6f29d0600009d9d9d0000809d809d049d9d 56d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d5600 0800d6d69d9d9d5600d6eb9d025656d6f29d010000fc9d010000809d809d 039d5656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d56 9d000900d69dd69d569d00d6d6eb9d0256d6d6f39dfd00f89dfc00039d9d 0000fc9d0300009d9dfc00809d959d0256d6d6eb9d025656d6fc9d0000f4 9d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d0256 56d6f19dfc00fb9d0800009d9d00009d0000fc9d0800009d00009d9d0000 809d979d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69d d69d569d000b00d69dd69d569d00d6d69d9df000fd9d0256d6d6f09dfd00 f89d1100009d00009d9d9d00009d00009d9d9d0000809d969d0256d6d6f9 9dfc00f69d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d5600 0c00d6d69d9d9d5600d69d9d9d00f29d05009d9d5656d6ee9dfd00fd9dfb 00099d9d00009d9d00009d9dfa00809d969d025656d6f89d04009d9d0000 f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000c00d6 9dd69d569d00d6d69d9d00f29d0600009d9d56d6d6ee9d1400009d9d0000 9d9d00009d9d00009d9d00009d0000809d909d0256d6d6f99d04009d9d00 00f79d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00 d6d69d9d9d5600d69d9d9def00039d5656d6f49d010000fb9d1400009d00 009d9d9d00009d9d9d009d00009d9d0000809d919d025656d6f89dfb00f6 9d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69d d69d569d00d6d6fc9df100049d9d56d6d6f59d010000fc9d0900009d9d00 009d9d0000fc9dfd00fd9d0500009d9d0000809d949d0256d6d6f89dfc00 f79d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6 d69d9d9d5600d6eb9d025656d6f39dfa00fc9dfd00079d00009d9d9d0000 fb9dfc00809d949d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d 5600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6809d809d e99d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d 9d56000800d6d69d9d9d5600d6eb9d025656d6809d809de99d025656d6e9 9d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69d d69d569d00d6d6eb9d0256d6d6809d809de99d0256d6d6eb9d025656d6fc 9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6 eb9d025656d6809d809de99d025656d6e99d0556d6d69d9d9df100fd9d08 5600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6809d809d e99d0256d6d6eb9d025656d6fa9df3000b9d9d565600d6d69d9d9d560008 00d6d69d9d9d5600d6eb9d025656d6809d809de99d025656d6e99d0256d6 d6eb9d085600d69dd69d569d007f00d69dd69d569d00d69d9d569d569d56 9d569d569d569d569d569d569d569d56d6569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d567f9d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 56729d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 d6569d569d569d569d569d569d569d569d569d569d569d5656d69d569d56 9d569d569d569d569d569d569d569d569d565600d6d69d9d9d560008009d 569d9d9d56009de956009d80568056e756009de856009de9560700d69dd6 9d569d000000fb56009d800080009b0001d6d6fc56ff000000fcd6029d56 5680af80af9daf0200d69dfcd6ff000700d6d6d69d569d5680af80af9daf 0700d6d69dd6d6d6000700d6d69d9d9d565680af80af9daf0700d69dd69d 569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6 d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d56 80af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf 0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d 9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d6 9dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d5656 80af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf 0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d 569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6 d69d9d9d5656f3aff90004af00afaf0080af80afb6af0700d69dd69d569d 000700d69dd69d569d56f3af0000f9af0600afaf00afaf0080af80afb9af 0700d6d69d9d9d56000700d6d69d9d9d5656f3af0000f6af0300afaf0080 af80afb9af0700d69dd69d569d000700d69dd69d569d56f3af0000f9af0a 00afaf00af000000afafaffc00fdaf0300af000080af80afc8af0700d6d6 9d9d9d56000700d6d69d9d9d5656f3af0000f9af1300afaf00afaf00afaf af0000afaf0000afaf000080af80afc6af0700d69dd69d569d000700d69d d69d569d56f3affa000cafaf00afaf00afaf00afafaf00fcaf0300afaf00 80af80afc5af0700d6d69d9d9d56000700d6d69d9d9d5656f3af0000f9af 0900afaf00afaf00afafaffa0002afaf0080af80afc5af0700d69dd69d56 9d000700d69dd69d569d56f3af0000f9af0a00afaf00afaf00afafaf00f9 af000080af80afc5af0700d6d69d9d9d56000700d6d69d9d9d5656f3af00 00f9af0a00afaf00afaf00afafaf00f9af000080af80afc5af0700d69dd6 9d569d000700d69dd69d569d56f3af0000f9af1200afaf00afaf00afafaf 0000afaf0000afaf0080af80afc5af0700d6d69d9d9d56000700d6d69d9d 9d5656f3af0000f9af0a00afaf00afafaf0000afaffc00fdaf000080af80 afc5af0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6 d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d00 0700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d 9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80 af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d6 9dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d5600 0700d6d69d9d9d5656f4af80648064b564f4af0700d69dd69d569d000700 d69dd69d569d56f4af80648064b66400dff4af0700d6d69d9d9d56000700 d6d69d9d9d5656f4af01646480af80afb9af01dfdff4af0700d69dd69d56 9d000700d69dd69d569d56f4af01646480af80afb9af01dfdff4af0700d6 d69d9d9d56000700d6d69d9d9d5656f4af01646480af80afb9af01dfdff4 af0700d69dd69d569d000700d69dd69d569d56f4af01646480af80afb9af 01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af01646480af 80afb9af01dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af01 646480af80afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d56 56f4af01646480af80afb9af01dfdff4af0700d69dd69d569d000700d69d d69d569d56f4af016464f8af0000e7af0000fcaf0000d8af0000faaf0000 e8af0000c0af0400afafaf0080afefaf01dfdff4af0700d6d69d9d9d5600 0700d6d69d9d9d5656f4af016464f8af0000e7af0000fcaf0000d8af0000 faaf0000f6af0000f3af0000c0af0600af00af00af0080aff1af01dfdff4 af0700d69dd69d569d000700d69dd69d569d56f4af016464f9af0000e6af 0400afafaf00d8af0000f9af0000f6af0000f4af0000c0af0600afafaf00 000080aff0af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4 af016464f9af0300afaf00fcaf1e00afaf000000afafaf00af0000afaf00 0000af00afafaf00afaf00af000000fcaffd0009af00afaf00af0000afaf fc00fdaf0400af000000fcaf0b00afafaf000000af00afafaffc0007afaf 000000afafaffc00fcaf0b00afafaf000000af00afafaffc00fcaffc00fd af0f00af0000afaf0000afafaf00af000000fcaffc0015afaf00afafaf00 afafaf00afafaf00afaf00af00af0080aff1af01dfdff4af0700d69dd69d 569d000700d69dd69d569d56f4af016464f9af0300afaf00fcaf7f00af00 afafaf00afaf0000afafaf0000afaf0000afafaf00afaf0000afaf0000af af0000afaf0000afaf0000afafaf0000afaf0000afaf0000afaf0000afaf af00afaf0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000 afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf 0000afaf002100afaf00afaf0000afaf0000afaf0000afaf0000af00afaf af00afafaf00afafaf00fcaf000080afefaf01dfdff4af0700d6d69d9d9d 56000700d6d69d9d9d5656f4af016464faaf0400afafaf00fcaf0300af00 00fbaf0000fcaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf03 00afaf00f7af0300afaf00fcaf0700afaf00afafaf00fcaf0000f9af0300 afaf00f8af0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf 0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf0d00af00af afaf00afafaf00afaf0080afe9af01dfdff4af0700d69dd69d569d000700 d69dd69d569d56f4af016464faaf0400afafaf00fcaf0900afaf000000af afaf00fcaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300af af00fbaffb0002afaf00fcaf0700afaf00afafaf00fcaf0300afafaffb00 02afaf00fcaffb0006afaf00afafaf00fcaf0200afaffa0002afaf00fcaf 0e00afaf00afafaf00afafaf00afaf00fcaf0200afaffa000cafaf00afaf 00afaf00afafaf0080afe9af01dfdff4af0700d6d69d9d9d56000700d6d6 9d9d9d5656f4af016464faaf0400afafaf00fcaf0000fcaf040000afaf00 fcaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fc af080000afafaf00afaf00fcaf0700afaf00afafaf00fcaf1b00afaf0000 afafaf00afaf00afafaf0000afafaf00afaf00afafaf00fcaf0300afaf00 f9af0000fcaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9 af0a00afaf00afaf00afafaf0080afe9af01dfdff4af0700d69dd69d569d 000700d69dd69d569d56f4af016464fbaf0000fcaf0000fcaf0000fbaf03 00afaf00fcaf0000fcaf0200af00fcaf0000fcaf0300afaf00fcaf0300af af00fcaf0000fcaf0300afaf00fcaf0200af00fcaf0000fcaf0300afaf00 fcaf0700afaf00afafaf00fcaf0200af00fcaf0000fcaf0300afaf00f9af 0000fcaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af09 00af00af00af00afaf0080afe8af01dfdff4af0700d6d69d9d9d56000700 d6d69d9d9d5656f4af016464fbaf0000fcaf0e0000afaf0000af00afafaf 00afaf00fcaf070000afaf0000af00fcaf0000fcaf0b00afaf0000afaf00 00afaf00fcaf0f0000afaf0000afaf0000afaf0000af00fcaf1b0000afaf 0000afaf0000afaf0000afaf00afafaf0000afaf0000af00fcaf230000af af0000afaf0000afaf0000afaf0000afaf0000afaf00afafaf00afafaf00 afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00afafaf0080afe8 af01dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af016464fb af0000fbaffd000aaf00afaf000000afafaf00fbaffd0003af00af00fcaf 0000fcaf0b00afafaf000000af00afaf00fbaffd000baf0000af00af0000 00afaf00fbaffd0017af00afafaf000000af0000afaf0000afaf000000af 000000fbaffd0004af00afafaffc00fcaffc00fdaf0b00afafaf00afafaf 00afaf00fcaf0300afafaffc00fcaf0800afafaf00afafaf0080afe8af01 dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af016464caaf00 00f1af0000d0af000080afb1af01dfdff4af0700d69dd69d569d000700d6 9dd69d569d56f4af016464cfaf050000afaf0000f1af0000d5af050000af af000080afb1af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656 f4af016464ceaffc00f0af0000d4affc0080afb0af01dfdff4af0700d69d d69d569d000700d69dd69d569d56f4af01646480af80afb9af01dfdff4af 0700d6d69d9d9d56000700d6d69d9d9d5656f4af01646480af80afb9af01 dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af01646480af80 afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af0164 6480af80afb9af01dfdff4af0700d69dd69d569d000700d69dd69d569d56 f4af01646480af80afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d 9d9d5656f4af01646480df80dfb7dff4af0700d69dd69d569d000700d69d d69d569d56f4af006480df80dfb6dff4af0700d6d69d9d9d56000700d6d6 9d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680 af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf07 00d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d 56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680 af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf07 00d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d56 9d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d6 9d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680 af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf07 00d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d 56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d5656f3 affb00fbaf0000d9af000091aff90004af00afaf0080afd8af0700d69dd6 9d569d000700d69dd69d569d56f3af0000fcaf050000afafaf00eaaf0000 f0af000091af0000f9af0300afaf0080afd8af0700d6d69d9d9d56000700 d6d69d9d9d5656f3af0000fbaf0000e6af000080af0000f6af000080afd8 af0700d69dd69d569d000700d69dd69d569d56f3af0000faaf0b00afaf00 afaf00af0000afaffc00fcaffc0006af000000afafaffc00fdaf0800af00 00af00afafaffc00fcaffd009faf0000f9af0600afaf00afafaffc00fcaf fd0080afe6af0700d6d69d9d9d56000700d6d69d9d9d5656f3af0000faaf 3a00afaf00afaf0000afafaf0000afaf0000afaf0000afaf0000af00afaf af0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf00afafaf00 a0af0000f9af1200afaf00afaf0000afaf0000afaf00afafaf0080afe7af 0700d69dd69d569d000700d69dd69d569d56f3af0000faaf0600afaf00af af00fcaf0000fcaf0300afaf00faaf0400afafaf00fcaf0300afaf00fcaf 0300afaf00fcaf0400afaf00009daffa0008afaf00afaf00afaf00fcaf04 00afaf000080afe4af0700d6d69d9d9d56000700d6d69d9d9d5656f3af00 00faaf0600afaf00afaf00fcaffa0002afaf00faaf0400afafaf00fcaf03 00afaf00fcaf0200afaffa00fdaffd009faf0000f9af0500afaf00afaffa 00fdaffd0080afe6af0700d69dd69d569d000700d69dd69d569d56f3af00 00faaf0600afaf00afaf00fcaf0000f9af0000faaf0400afafaf00fcaf03 00afaf00fcaf0300afaf00f6af010000a0af0000f9af0600afaf00afaf00 f6af01000080afe7af0700d6d69d9d9d56000700d6d69d9d9d5656f3af00 00fbaf0700afafaf00afaf00fcaf0000f9af0000fcaf0600af00afafaf00 fcaf0300afaf00fcaf0300afaf00f5af0000a0af0000f9af0600afaf00af af00f5af000080afe7af0700d69dd69d569d000700d69dd69d569d56f3af 0000fcaf080000afafaf00afaf00fcaf1b0000afaf0000afaf0000afaf00 00af00afafaf0000afaf0000afaf00fcaf0f00afaf0000afaf0000afaf00 afafaf00a0af0000f9af1200afaf00afaf0000afaf0000afaf00afafaf00 80afe7af0700d6d69d9d9d56000700d6d69d9d9d5656f3affb00fbaf0300 afaf00fbaffc00fcaffc00fdaf030000afaffc00fdaf0000fcaf0300afaf affc00fcaffd009faf0000f9af0600afaf00afafaffc00fcaffd0080afe6 af0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d 9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700 d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d56 5680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9d af0700d6d69d9d9d56000700d6d69d9d9d5656f6af8064fb64fcaff164f6 af8064e764fcaff164f5af0700d69dd69d569d000700d69dd69d569d56f6 af8064fc6400dffcaff26400dff6af8064e86400dffcaff26400dff5af07 00d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf 016464fb9500dffb9501dfdff6af01646480afebaf01dfdffcaf016464fb 9500dffb9501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af 01646480af02afdfdffcaf016464fc9502dfdf64fc9501dfdff6af016464 80afebaf01dfdffcaf016464fc9502dfdf64fc9501dfdff5af0700d6d69d 9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf016464fc 9502dfdf64fc9501dfdff6af01646480afebaf01dfdffcaf016464fc9502 dfdf64fc9501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af 046464afafaf8500fdaf01dfdffcaf0e6464959595dfdfaf6464959595df dff6af01646480afebaf01dfdffcaf0e6464959595dfdfaf6464959595df dff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af046464afafaf85 00fdaf01dfdffcaf0e6464959595dfdfaf6464959595dfdff6af01646480 afebaf01dfdffcaf0e6464959595dfdfaf6464959595dfdff5af0700d69d d69d569d000700d69dd69d569d56f6af046464afafafd30000afb300fdaf 01dfdffcaf0e64649595dfdfafafaf64649595dfdff6af016464fcaffa00 d5af050000afaf0000a6af01dfdffcaf0e64649595dfdfafafaf64649595 dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af046464afafaf d30000afb300fdaf01dfdffcaf0e64649595dfdfafafaf64649595dfdff6 af016464fcaf0000f9af0000f5af0000e5af0400afafaf00a4af01dfdffc af0e64649595dfdfafafaf64649595dfdff5af0700d69dd69d569d000700 d69dd69d569d56f6af046464afafafd40000afb200fdaf01dfdffcaf0464 6495dfdffbaf04646495dfdff6af016464fcaf0000f9af0000f5af0000e5 af0400afafaf00a4af01dfdffcaf04646495dfdffbaf04646495dfdff5af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464faaffd000faf00 afaf0000afaf000000af00afafaffc00fcaf0e0000af000000af000000af 000000afb200fdaf01dfdffcaf04646495dfdffbaf04646495dfdff6af01 6464fcaf0000faaffd00fdaffc000cafaf000000afaf00af0000afaffc00 f9affc0008afaf000000af000000a5af01dfdffcaf04646495dfdffbaf04 646495dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af316464 afafaf0000afaf0000afaf0000afaf0000af0000afaf0000afaf0000afaf 0000afaf00af000000af000000af000000afb200fdaf01dfdffcaf036464 dfdff76401dfdff6af016464fcaffb00fdaf1a00afafaf0000afaf0000af af00afafaf0000afafaf0000afaf0000fbaf0c0000afaf0000afaf00afaf af00a4af01dfdffcaf036464dfdff76401dfdff5af0700d6d69d9d9d5600 0700d6d69d9d9d5656f6af166464afafaf000000af0000af000000af0000 00af0000affc0003af0000affc000daf00af000000af000000af0000afb1 00fdaf01dfdffcaf026464dff66401dfdff6af016464f7af0700afaf00af afaf00fcaf0700afaf00afafaf00f7af0000fbaf0000fcaf0700afaf00af afaf00a4af01dfdffcaf026464dff66401dfdff5af0700d69dd69d569d00 0700d69dd69d569d56f6af166464afafaf000000af0000af000000af0000 00af0000affc0002af0000faaf0c0000af0000af0000af000000afb100fd af01dfdffcaf016464f59501dfdff6af016464f7af0600afaf00afafaffa 0006afaf00afafaf00fbaffb00fbaf0000fcaf0700afaf00afafaf00a4af 01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af166464afafaf000000af0000af000000af000000af0000affc 0003af0000aff9000aaf0000af0000af000000afb100fdaf01dfdffcaf01 6464f3dff6af016464f7af0700afaf00afafaf00f9af0400afafaf00fcaf 050000afafaf00fbaf0000fcaf0700afaf00afafaf00a4af01dfdffcaf01 6464f3dff5af0700d69dd69d569d000700d69dd69d569d56f6af166464af afaf000000af0000af000000af000000af0000affc0003af0000aff90009 af00af00af00af0000afb000fdaf01dfdffcaf016464f6df0264dfdff6af 016464fcaf0000fcaf0700afaf00afafaf00f9af0400afafaf00fcaf0000 fcaf0000fbaf0000fcaf0700afaf00afafaf00a4af01dfdffcaf016464f6 df0264dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af166464 afafaf0000afaf0000af000000af000000af0000affc0014af0000afaf00 00afaf000000af000000af000000affc0000afb500fdaf01dfdffcaf0364 64dfdff9af036464dfdff6af016464fcaf0000fcaf1300afaf00afafaf00 00afaf0000afaf00afafaf00fcaf170000afaf0000afaf00afaf0000afaf 0000afaf00afafaf00a4af01dfdffcaf036464dfdff9af036464dfdff5af 0700d69dd69d569d000700d69dd69d569d56f6af016464faaffd000baf00 0000af000000af0000affc0003af000000fcaffc0008af000000af000000 affc0000afb500fdaf01dfdffcaf036464dfdff9af036464dfdff6af0164 64fbaffc00fcaf030000afaffc00fcaf030000af00fbaffd0007af0000af 00afafaffc00fdaf0400afafaf00a4af01dfdffcaf036464dfdff9af0364 64dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af046464afaf af8500fdaf01dfdffcaf036464dfdff9af036464dfdff6af01646480afeb af01dfdffcaf036464dfdff9af036464dfdff5af0700d69dd69d569d0007 00d69dd69d569d56f6af046464afafaf8500fdaf01dfdffcaf036464dfdf f9af036464dfdff6af01646480afebaf01dfdffcaf036464dfdff9af0364 64dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af046464afaf af8500fdaf01dfdffcaf036464dfdff9af036464dfdff6af01646480afeb af01dfdffcaf036464dfdff9af036464dfdff5af0700d69dd69d569d0007 00d69dd69d569d56f6af01646480af02afdfdffcaf036464dfdff9af0364 64dfdff6af01646480afebaf01dfdffcaf036464dfdff9af036464dfdff5 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdf fcaf036464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf0364 64dfdff9af036464dfdff5af0700d69dd69d569d000700d69dd69d569d56 f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6af016464 80afebaf01dfdffcaf036464dfdff9af036464dfdff5af0700d6d69d9d9d 56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf036464dfdff9 af036464dfdff6af01646480afebaf01dfdffcaf036464dfdff9af036464 dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01646480af02 afdfdffcaf036464dfdff9af036464dfdff6af01646480afebaf01dfdffc af036464dfdff9af036464dfdff5af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af016464d0af0000b0af01dfdffcaf036464dfdff9af036464df dff6af016464f8af0000e7af0000fbaf0300afaf00f6af0000f5affc00b1 af01dfdffcaf036464dfdff9af036464dfdff5af0700d69dd69d569d0007 00d69dd69d569d56f6af016464d0af0000b0af01dfdffcaf036464dfdff9 af036464dfdff6af016464f8af0000e7af0000fcaf0400afafaf00f6af00 00f6af0000fcaf0000b2af01dfdffcaf036464dfdff9af036464dfdff5af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d1af0000afaf01 dfdffcaf036464dfdff9af036464dfdff6af016464f8af0000e7af0400af afaf00fcaf0000ebaf0000fcaf0000b2af01dfdffcaf036464dfdff9af03 6464dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af1a6464af afaf000000afafaf00af0000afaf0000afafaf00af000000fcaffc000eaf af00afafaf00afafaf00afafaf00afaf01dfdffcaf036464dfdff9af0364 64dfdff6af016464f8af0300afafaffc00fcaffc00fcaffd00fdaf0300af af00fbaf0300afafaffc00fdaf0b00afaf00af000000afafaf00fcaf0000 b2af01dfdffcaf036464dfdff9af036464dfdff5af0700d6d69d9d9d5600 0700d6d69d9d9d5656f6af016464fbaf2a0000afaf0000afaf0000afaf00 afaf0000afaf0000afaf0000afaf0000af00afafaf00afafaf00afafaf00 afaf01dfdffcaf036464dfdff9af036464dfdff6af016464f8af1c00afaf 0000afaf0000afaf0000afaf0000afaf00afafaf00afaf00af00faaf1600 afaf0000afaf0000afaf00afaf0000afaf0000afaf00fcaf0000b2af01df dffcaf036464dfdff9af036464dfdff5af0700d69dd69d569d000700d69d d69d569d56f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf 0300afaf00fcaf0d00af00afafaf00afafaf00afaf00aeaf01dfdffcaf03 6464dfdff9af036464dfdff6af016464f8af0300afaf00fcaf0300afaf00 fcaf0400afaf0000fbaffd00faaf0300afaf00fcaf0600afaf00afaf00fc af0300afafaffc00b1af01dfdffcaf036464dfdff9af036464dfdff5af07 00d6d69d9d9d56000700d6d69d9d9d5656f6af016464faaf0e00afaf00af afaf00afafaf00afaf00fcaf0200afaffa000cafaf00afaf00afaf00afaf af00aeaf01dfdffcaf036464dfdff9af036464dfdff6af016464f8af0300 afaf00fcaf0200afaffa00fdaffd00fdaf0300afaf00fbaf0200afaffa00 05afaf00afaf00fcaf0300afaf00fcaf0000b2af01dfdffcaf036464dfdf f9af036464dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01 6464faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af0a 00afaf00afaf00afafaf00aeaf01dfdffcaf036464dfdff9af036464dfdf f6af016464f8af0300afaf00fcaf0300afaf00f6af080000afaf00afafaf 00fcaf0300afaf00f9af0300afaf00fcaf0300afaf00fcaf0000b2af01df dffcaf036464dfdff9af036464dfdff5af0700d6d69d9d9d56000700d6d6 9d9d9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf 0300afaf00f9af0900af00af00af00afaf00adaf01dfdffcaf036464dfdf f9af036464dfdff6af056464afafaf00fcaf0300afaf00fcaf0300afaf00 f5af0300afaf00fcaf0700afafaf00afaf00f9af0300afaf00fcaf0300af af00fcaf0000b2af01dfdffcaf036464dfdff9af036464dfdff5af0700d6 9dd69d569d000700d69dd69d569d56f6af016464fbaf0f0000afaf00afaf af00afafaf00afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00af afaf00fcaf0300afaf00b5af01dfdffcaf036464dfdff9af036464dfdff6 af056464afafaf00fcaf1a00afaf0000afaf0000afaf0000afaf0000afaf 00afafaf00afaf00fbaf1100afaf00afaf0000afaf0000afaf00afaf00fc af0300afaf00fcaf0000b2af01dfdffcaf036464dfdff9af036464dfdff5 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af166464afafaf000000 afafaf00afafaf00afafaf00afaf00fcaf0300afafaffc00fcaf0800afaf af00afafaf00fcaf0300afaf00b5af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaffc00fcaffc00fcaffc00fcaffd00fdaf0000faaf05 00af00afafaffc00fdaf0300afaf00fcaf0300afafaffc00b1af01dfdffc af036464dfdff9af036464dfdff5af0700d69dd69d569d000700d69dd69d 569d56f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6af 01646480afebaf01dfdffcaf036464dfdff9af036464dfdff5af0700d6d6 9d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf036464 dfdff9af036464dfdff6af01646480afebaf01dfdffcaf036464dfdff9af 036464dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464 80af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afebaf01 dfdffcaf036464dfdff76401dfdff5af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6 af01646480afebaf01dfdffcaf026464dff66401dfdff5af0700d69dd69d 569d000700d69dd69d569d56f6af01646480af02afdfdffcaf036464dfdf f9af036464dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdf fcaf036464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf0164 64f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af0164 6480af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afebaf 01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6af 01646480afebaf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d 000700d69dd69d569d56f6af016464d0af0000faaf0000f9af0000bfaf01 dfdffcaf036464dfdff9af036464dfdff6af016464fcaff900fdaff900fb af0000fbaffb00fcaf0000f7af0200afaff900a8af01dfdffcaf016464f5 9501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d0 af0000fbaf010000f9af0000bfaf01dfdffcaf036464dfdff9af036464df dff6af016464fcaf0000fbaf040000afaf00f6affd00fcaf0000fcaf0500 00afaf0000f9af040000afaf00a2af01dfdffcaf016464f59501dfdff5af 0700d69dd69d569d000700d69dd69d569d56f6af016464d1af0000fbaf02 00af00f9af0000bfaf01dfdffcaf036464dfdff9af036464dfdff6af0164 64fcaf0000faaf0300afaf00f6af0200af00fcaf0000fbaf0400afaf0000 f9af040000afaf00a2af01dfdffcaf016464f59501dfdff5af0700d6d69d 9d9d56000700d6d69d9d9d5656f6af1a6464afafaf000000afafaf00af00 00afaf0000afafaf00af000000fcaffc000eafaf00afafaf00afafaf00af afaf00fcaf0b00afaf00afafaf000000af00bfaf01dfdffcaf036464dfdf f9af036464dfdff6af016464fcaf0000faaf0300afaf00f6af0200af00fc af0000faaf0400af00af00fbaf0500af00afaf00a2af01dfdffcaf016464 f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464 fbaf3a0000afaf0000afaf0000afaf00afaf0000afaf0000afaf0000afaf 0000af00afafaf00afafaf00afafaf00afafaf00afafaf00afaf0000afaf 0000bfaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000 fbaf0400afafaf00f7af0800afafaf00afafaf00faaf0400af00af00fbaf 0500af00afaf00a2af01dfdffcaf016464f59501dfdff5af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af016464faaf0e00afaf00afafaf00afaf af00afaf00fcaf0300afaf00fcaf1100af00afafaf00afafaf00afaf00af afaf00fcaf0300afaf00fcaf0000bfaf01dfdffcaf036464dfdff9af0364 64dfdff6af016464fcaffa00fcaffa00fcaf0800afafaf00afafaf00faaf 0e00af00afaf00afafaf00afaf00afaffa00a7af01dfdffcaf016464f595 01dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464faaf 0e00afaf00afafaf00afafaf00afaf00fcaf0200afaffa0010afaf00afaf 00afaf00afafaf00afafaf00fcaf0300afaf00fcaf0000bfaf01dfdffcaf 036464dfdff9af036464dfdff6af016464fcaf0000fbaf0400afafaf00f8 af0000fbaf0300afaf00faaf0f00af00afaf00afafaf00afaf00afaf00a2 af01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf03 00afaf00f9af0d00afaf00afaf00afafaf00afafaff90001af00fcaf0000 bfaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf 0300afaf00f8aff90002afaf00faaf0f00af00afafaf00af00afafaf00af af00a2af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700 d69dd69d569d56f6af016464faaf0e00afaf00afafaf00afafaf00afaf00 fcaf0300afaf00f9af0900af00af00af00afaf00f7af0300afaf00fcaf00 00bfaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000fa af0300afaf00f8af0000fbaf0300afaf00fbaf1000afaf00afafaf00af00 afafaf00afaf00a2af01dfdffcaf016464f59501dfdff5af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af016464fbaf0f0000afaf00afafaf00af afaf00afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00afafaf00 f7af0800afaf0000afaf0000bfaf01dfdffcaf036464dfdff9af036464df dff6af016464fcaf0000faaf0300afaf00f9af0000f9af0200af00fcaf04 0000afaf00fcaf0000fcaf0300afaf00a2af01dfdffcaf016464f59501df dff5af0700d69dd69d569d000700d69dd69d569d56f6af166464afafaf00 0000afafaf00afafaf00afafaf00afaf00fcaf0300afafaffc00fcaf0800 afafaf00afafaf00f7af0800afafaf000000af00bfaf01dfdffcaf036464 dfdff9af036464dfdff6af016464fcaf0000faaf0200afaff90001af00f9 af0100affb00fcaf0000fcaf0000fcaf0200afaff900a8af01dfdffcaf01 6464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01 646480af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afeb af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd6 9d569d56f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6 af01646480afebaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d 56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf036464dfdff9 af036464dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af 0700d69dd69d569d000700d69dd69d569d56f6af01646480af02afdfdffc af036464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf016464 f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464 80af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afebaf01 dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd69d56 9d56f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6af01 646480afebaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d5600 0700d6d69d9d9d5656f6af01646480af02afdfdffcaf036464dfdff9af03 6464dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af0700 d69dd69d569d000700d69dd69d569d56f6af01646480af02afdfdffcaf03 6464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf016464f595 01dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d0af 0000dcaf0000d5af01dfdffcaf036464dfdff9af036464dfdff6af016464 fcaff900fdaff900fbaf0000fbaffb00fcaf0000f7af0200afaff900a8af 01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd69d 569d56f6af016464d0af0000dcaf0000d5af01dfdffcaf036464dfdff9af 036464dfdff6af016464fcaf0000fbaf040000afaf00f6affd00fcaf0000 fcaf050000afaf0000f9af040000afaf00a2af01dfdffcaf016464f59501 dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d1af00 00afaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000fa af0300afaf00f6af0200af00fcaf0000fbaf0400afaf0000f9af040000af af00a2af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700 d69dd69d569d56f6af1a6464afafaf000000afafaf00af0000afaf0000af afaf00af000000fcaffc0011afaf00afafaf00afafaf00afafaf00afafaf fc0002afaf00fbaf0200afaffc00fdaf0f00af0000afaf000000afafaf00 afafaffc00fdaf0400af000000e4af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaf0000faaf0300afaf00f6af0200af00fcaf0000faaf 0400af00af00fbaf0500af00afaf00a2af01dfdffcaf016464f59501dfdf f5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464fbaf340000 afaf0000afaf0000afaf00afaf0000afaf0000afaf0000afaf0000af00af afaf00afafaf00afafaf00afaf0000afaf0000af00fbaf2600af0000afaf 0000afaf0000afafaf00afafaf00afaf00afaf0000afaf0000afaf0000af af0000e5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf00 00fbaf0400afafaf00f7af0800afafaf00afafaf00faaf0400af00af00fb af0500af00afaf00a2af01dfdffcaf016464f59501dfdff5af0700d69dd6 9d569d000700d69dd69d569d56f6af016464faaf0e00afaf00afafaf00af afaf00afaf00fcaf0300afaf00fcaf1100af00afafaf00afafaf00afaf00 afafaf00fcaf0a00afaf00afafaf00afaf00fcaf0300afaf00fcaf010000 fbaf0300afaf00fcaf0300afaf00fcaf0000e5af01dfdffcaf036464dfdf f9af036464dfdff6af016464fcaffa00fcaffa00fcaf0800afafaf00afaf af00faaf0e00af00afaf00afafaf00afaf00afaffa00fcaf040000afaf00 b0af01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d6 9d9d9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf 0200afaffa000fafaf00afaf00afaf00afafaf00afafaffa0008afaf00af afaf00afaffa0002afaf00fbaffd00fdaf0300afaf00fcaf0300afaf00fc af0000e5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf00 00fbaf0400afafaf00f8af0000fbaf0300afaf00faaf0f00af00afaf00af afaf00afaf00afaf00f8af0500af0000af00b0af01dfdffcaf016464f595 01dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464faaf 0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af0e00afaf00 afaf00afafaf00afafaf00f9af0700afafaf00afaf00f9af0000f9af0700 00afaf00afaf00fcaf0300afaf00fcaf0000e5af01dfdffcaf036464dfdf f9af036464dfdff6af016464fcaf0000faaf0300afaf00f8aff90002afaf 00faaf0f00af00afafaf00af00afafaf00afaf00f8af0400afaf0000afaf 01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300 afaf00f9af0900af00af00af00afaf00fcaf0000f8af0600af00afafaf00 f9af0000f8af0600afaf00afaf00fcaf0300afaf00fcaf0000e5af01dfdf fcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0300afaf00 f8af0000fbaf0300afaf00fbaf1000afaf00afafaf00af00afafaf00afaf 00a2af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d6 9dd69d569d56f6af016464fbaf0f0000afaf00afafaf00afafaf00afaf00 fcaf1400afaf0000afaf0000afafaf00afafaf00afafaf00fcaf170000af af0000afafaf00af00afafaf0000afaf0000afaf00fcaf1200afafaf00af af00afaf0000afaf0000afaf00fcaf0000e5af01dfdffcaf036464dfdff9 af036464dfdff6af016464fcaf0000faaf0300afaf00f9af0000f9af0200 af00fcaf040000afaf00fcaf0000fcaf0300afaf00a2af01dfdffcaf0164 64f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af1664 64afafaf000000afafaf00afafaf00afafaf00afaf00fcaf0300afafaffc 00fcaf0800afafaf00afafaf00fbaffc00fbaf0000fbaffc00fdaf0000fb affd00fdaf0300afafaffc00fdaf0000fcaf0000e5af01dfdffcaf036464 dfdff9af036464dfdff6af016464fcaf0000faaf0200afaff90001af00f9 af0100affb00fcaf0000fcaf0000fcaf0200afaff900a8af01dfdffcaf01 6464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01 646480af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afeb af01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6 af01646480afebaf01dfdffcaf016464f59501dfdff5af0700d69dd69d56 9d000700d69dd69d569d56f6af01646480af02afdfdffcaf036464dfdff9 af036464dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffc af036464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf016464 f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464 80af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afebaf01 dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d 5656f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6af01 646480afebaf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d00 0700d69dd69d569d56f6af01646480af02afdfdffcaf036464dfdff9af03 6464dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af0700 d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf03 6464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf016464f595 01dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464d0af 0200af00ddaf0000f2af0300afaf00e8af01dfdffcaf036464dfdff9af03 6464dfdff6af016464dbaf0300afaf0094af01dfdffcaf016464f59501df dff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d0af0200 af00ddaf0000f2af0300afaf00e8af01dfdffcaf036464dfdff9af036464 dfdff6af016464dbaf0300afaf00f7af00009eaf01dfdffcaf016464f595 01dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464d1af 0300afaf00ddaf0000f2af0000e5af01dfdffcaf036464dfdff9af036464 dfdff6af016464dbaf0000f4af00009eaf01dfdffcaf016464f59501dfdf f5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af1a6464afafaf0000 00afafaf00af0000afaf0000afafaf00af000000fcaffc0018afaf00afaf af00afafaf00afafaf00afaf00af000000afaf00fbaf0600af00af000000 fcaffc00fdaf0c00af0000af00af000000afafaffc00fdaf0600afaf00af afaffc00efaf01dfdffcaf036464dfdff9af036464dfdff6af016464fbaf fc000aafaf0000afafaf0000afaffc00fcaffd00faaf0e00afaf00afafaf 000000afaf0000009faf01dfdffcaf016464f59501dfdff5af0700d69dd6 9d569d000700d69dd69d569d56f6af016464fbaf350000afaf0000afaf00 00afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00afafaf00 afafaf00afaf0000afaf0000af0000fcaf3100af0000afaf0000afaf0000 afaf0000afaf0000afafaf0000afaf0000af0000afaf0000afaf00afaf00 afaf0000afaf0000f0af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fcaf1b0000afaf0000afaf00afafaf00afaf0000afaf0000afaf00af afaf00fbaf0d00afaf00afaf00afafaf00afaf009eaf01dfdffcaf016464 f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464 faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf1100af 00afafaf00afafaf00afaf00afafaf00fcaf0a00afaf00afafaf00afaf00 fcaf0300afaf00fcaf0300afaf00fcaf0000fcaf0200af00fcaf0900afaf 00afaf00afaf00ebaf01dfdffcaf036464dfdff9af036464dfdff6af0164 64f7af0a00afafaf00af00afafaf00fcaf0400afaf0000f8af0700afaf00 afaf0000fbaf00009eaf01dfdffcaf016464f59501dfdff5af0700d69dd6 9d569d000700d69dd69d569d56f6af016464faaf0e00afaf00afafaf00af afaf00afaf00fcaf0200afaffa0010afaf00afaf00afaf00afafaf00afaf af00fcaf0a00afaf00afafaf00afaf00fcaf0200afaffa0002afaf00fcaf 0000fcaf0200af00fcaf0900afaf00afaf00afaf00ebaf01dfdffcaf0364 64dfdff9af036464dfdff6af016464fbaffb00fcaf0000fcaffa00fdaffd 00faaf0d00afaf00afafaf000000afafaf009eaf01dfdffcaf016464f595 01dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464faaf 0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af0e00afaf00 afaf00afafaf00afafaf00fcaf0a00afafaf00afaf00afaf00fcaf0300af af00f9af0000fcaf0000fcaf0200af00fcaf0900afaf00afaf00afaf00eb af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf050000afaf af00fcaf0000fcaf0000f6af010000fbaf0300afaf00fbaf040000afaf00 9eaf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69d d69d569d56f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf 0300afaf00f9af0900af00af00af00afaf00fcaf0000fcaf0a00afafaf00 af00afafaf00fcaf0300afaf00f9af0000fcaf0000fcaf0200af00fcaf09 00afaf00afaf00afaf00fcaf0000f0af01dfdffcaf036464dfdff9af0364 64dfdff6af016464fcaf0000fcaf0a00afafaf00af00afafaf00f5af0000 fbaf0300afaf00faaf0300afaf009eaf01dfdffcaf016464f59501dfdff5 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464fbaf0f0000af af00afafaf00afafaf00afaf00fcaf1400afaf0000afaf0000afafaf00af afaf00afafaf00fcaf0000fcaf0000fcaf150000afafaf0000afaf0000af af0000afaf0000afaf00fcaf1a0000afaf0000af0000afaf0000afaf00af af00afaf0000afaf0000f0af01dfdffcaf036464dfdff9af036464dfdff6 af016464fcaf2e0000afaf0000afaf00afafaf00afaf0000afaf0000afaf 00afafaf00afaf00afaf00afaf00afaf00afafaf00afaf009eaf01dfdffc af016464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6 af166464afafaf000000afafaf00afafaf00afafaf00afaf00fcaf0300af afaffc00fcaf0800afafaf00afafaf00fcaf0000fcaf0000fcaf0000fcaf 0400af000000fcaffc00fdaf0000fcaf0700af000000afafaffc00fdaf06 00afaf00afafaffc00efaf01dfdffcaf036464dfdff76401dfdff6af0164 64fbaffd0000affc00fdaf030000afaffc00fcaffd00fdaf0c00afaf00af af00afafaf000000fcaf010000a0af01dfdffcaf016464f59501dfdff5af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464c4af0000fcaf00 00c1af01dfdffcaf026464dff66401dfdff6af01646480afebaf01dfdffc af016464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6 af016464c5af010000fcaf0000c1af01dfdffcaf016464f59501dfdff6af 01646480afebaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56 000700d6d69d9d9d5656f6af016464c6af010000fbaf0000c1af01dfdffc af016464f59501dfdff6af01646480afebaf01dfdffcaf016464f59501df dff5af0700d69dd69d569d000700d69dd69d569d56f6af01646480af02af dfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf016464f5 9501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480 af02afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf01 6464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01 646480af02afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdf fcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656 f6af01646480af02afdfdffcaf016464f59501dfdff6af01646480afebaf 01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd69d 569d56f6af01646480af02afdfdffcaf016464f59501dfdff6af01646480 afebaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6 d69d9d9d5656f6af016464d0af0200af00b2af01dfdffcaf016464f59501 dfdff6af016464fcaf0000f4affc00f2af0300afaf00fbaf0000faaf0000 9faf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69d d69d569d56f6af016464d0af0200af00b2af01dfdffcaf016464f59501df dff6af016464fcaf0000f5af0000fcaf0000f3af0300afaf00fbaf0000fa af00009faf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d560007 00d6d69d9d9d5656f6af016464d1af0000afaf01dfdffcaf016464f59501 dfdff6af016464fcaf0000f5af0000fcaf0000f3af0300afaf00fbaf0000 faaf00009faf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d00 0700d69dd69d569d56f6af1a6464afafaf000000afafaf00af0000afaf00 00afafaf00af000000fcaffc0014afaf00afafaf00afafaf00afafaf00af af00afafaffc00fdaffc00c0af01dfdffcaf016464f59501dfdff6af0164 64fcaf0a00af000000afaf00af0000faaf0000faaffc00fdaf0300afaf00 fbaf1200af000000afaf00af000000afaf00af000000aaaf01dfdffcaf01 6464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01 6464fbaf3c0000afaf0000afaf0000afaf00afaf0000afaf0000afaf0000 afaf0000af00afafaf00afafaf00afafaf00afaf00afaf0000afaf0000af 0000afaf0000c1af01dfdffcaf016464f59501dfdff6af016464fcaf0800 00afaf0000af0000f9af0000faaf0b0000afaf0000afaf00afaf00fbaf13 0000afaf0000af0000afaf0000af0000afaf0000abaf01dfdffcaf016464 f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464 faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf1400af 00afafaf00afafaf00afaf00afafaf00afaf00faaf0000fcaf0000c1af01 dfdffcaf016464f59501dfdff6af016464fcaf0000fcaf0200af00f9af00 00f4af0600afaf00afaf00fbaf0000fcaf0200af00fcaf0200af00fcaf00 00abaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6 d69d9d9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fc af0200afaffa0013afaf00afaf00afaf00afafaf00afafaf00afaf00faaf 0000fcaf0000c1af01dfdffcaf016464f59501dfdff6af016464fcaf0000 fcaf0200af00faaf0000f7affb0005afaf00afaf00fbaf0000fcaf0200af 00fcaf0200af00fcaf0000abaf01dfdffcaf016464f59501dfdff5af0700 d69dd69d569d000700d69dd69d569d56f6af016464faaf0e00afaf00afaf af00afafaf00afaf00fcaf0300afaf00f9af1100afaf00afaf00afafaf00 afafaf00afaf00faaf0000fcaf0000c1af01dfdffcaf016464f59501dfdf f6af016464fcaf0000fcaf0200af00fbaf0000f7af0b0000afafaf00afaf 00afaf00fbaf0000fcaf0200af00fcaf0200af00fcaf0000abaf01dfdffc af016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6 af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9 af0900af00af00af00afaf00fcaf0300afaf00fcaf0200af00fcaf0000c1 af01dfdffcaf016464f59501dfdff6af016464fcaf0000fcaf0200af00fc af0000f6af0000fcaf0600afaf00afaf00fbaf0000fcaf0200af00fcaf02 00af00fcaf0000abaf01dfdffcaf016464f59501dfdff5af0700d69dd69d 569d000700d69dd69d569d56f6af016464fbaf0f0000afaf00afafaf00af afaf00afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00afafaf00 fcaf0f00afaf0000afaf0000af0000afaf0000c1af01dfdffcaf016464f5 9501dfdff6af016464fcaf070000afaf0000af00fcaf0000f9af2700afaf 0000afaf0000afaf00afaf00afaf00afaf0000afaf0000af0000afaf0000 af0000afaf0000abaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af166464afafaf000000afafaf00afafaf 00afafaf00afaf00fcaf0300afafaffc00fcaf0800afafaf00afafaf00fc af0300afafaffc00fdaffc00c0af01dfdffcaf016464f59501dfdff6af01 6464fcaf0700af000000afaf00fcaffa0028afaf00afafaf000000af0000 af00afaf00afaf00afaf00af000000afaf00af000000afaf00af000000aa af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd6 9d569d56f6af01646480af02afdfdffcaf016464f59501dfdff6af016464 c6af0000a6af01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d5600 0700d6d69d9d9d5656f6af01646480af02afdfdffcaf016464f59501dfdf f6af016464c6af0000a6af01dfdffcaf016464f59501dfdff5af0700d69d d69d569d000700d69dd69d569d56f6af01646480af02afdfdffcaf016464 f59501dfdff6af016464c6af0000a6af01dfdffcaf016464f59501dfdff5 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdf fcaf016464f59501dfdff6af01646480afebaf01dfdffcaf016464f59501 dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01646480af02 afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf016464 f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464 80af02afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf 016464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af 01646480af02afdfdffcaf016464f59501dfdff6af01646480afebaf01df dffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d56 56f6af01646480af02afdfdffcaf016464f59501dfdff6af01646480afeb af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd6 9d569d56f6af016464d0af0700af00afafaf0000b7af01dfdffcaf016464 f59501dfdff6af016464edaf0000e4af0000f1af0000e3af050000afaf00 00cfaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6 d69d9d9d5656f6af016464d0af0500af00afaf00b5af01dfdffcaf016464 f59501dfdff6af016464edaf0000e4af0000f1af0000e4af0400afafaf00 cdaf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69d d69d569d56f6af016464d1af0000fbaf0000b5af01dfdffcaf016464f595 01dfdff6af016464edaf0000e4af0000f1af0000e4af0400afafaf00cdaf 01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af1a6464afafaf000000afafaf00af0000afaf0000afafaf00af 000000fcaffc001bafaf00afafaf00afafaf00afafaf00afaf00af000000 afafaf000000bcaf01dfdffcaf016464f59501dfdff6af016464fbaffc00 fdaffc00fdaf0300afafaffc00fdaf0300af0000f6affd0004af00afafaf fc00fcaffd0004af00afafaffc00fcaffc00faaffc0008afaf000000af00 0000ceaf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700 d69dd69d569d56f6af016464fbaf380000afaf0000afaf0000afaf00afaf 0000afaf0000afaf0000afaf0000af00afafaf00afafaf00afafaf00afaf 00afaf00afafaf00afafaf00bdaf01dfdffcaf016464f59501dfdff6af01 6464fcaf1b0000afaf0000af0000afaf0000afaf00afaf0000afaf0000af af0000f5af250000afaf0000afaf0000afaf0000afaf0000afaf0000afaf 0000afaf0000afaf0000afaf0000fcaf0c0000afaf0000afaf00afafaf00 cdaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d6 9d9d9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf 0300afaf00fcaf1900af00afafaf00afafaf00afaf00afafaf00afaf00af afaf0000baaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf 0000fcaf0600afaf00afaf00fcaf0300afaf00f4af0000fcaf0300afaf00 fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00f7af0000fcaf0700af af00afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700d69dd69d56 9d000700d69dd69d569d56f6af016464faaf0e00afaf00afafaf00afafaf 00afaf00fcaf0200afaffa0013afaf00afaf00afaf00afafaf00afafaf00 afaf00fcaffd00bcaf01dfdffcaf016464f59501dfdff6af016464fcaf00 00faaf0000fcaf0600afaf00afaf00fcaf0300afaf00f4af0000fcaf0300 afaf00fcaf0300afaf00fcaf0200afaffa0002afaf00f7af0000fcaf0700 afaf00afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af016464faaf0e00afaf00afafaf00afaf af00afaf00fcaf0300afaf00f9af1100afaf00afaf00afafaf00afafaf00 afaf00faaf010000bdaf01dfdffcaf016464f59501dfdff6af016464fcaf 0000faaf0000fcaf0600afaf00afaf00fcaf0300afaf00f4af0000fcaf03 00afaf00fcaf0300afaf00fcaf0300afaf00f9af0000f7af0000fcaf0700 afaf00afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700d69dd69d 569d000700d69dd69d569d56f6af016464faaf0e00afaf00afafaf00afaf af00afaf00fcaf0300afaf00f9af0900af00af00af00afaf00fcaf0300af af00f9af0000bdaf01dfdffcaf016464f59501dfdff6af016464fcaf0000 fcaf0200af00fcaf0600afaf00afaf00fcaf0300afaf00f4af0000fcaf03 00afaf00fcaf0300afaf00fcaf0300afaf00f9af0000fcaf0000fcaf0000 fcaf0700afaf00afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700 d6d69d9d9d56000700d6d69d9d9d5656f6af016464fbaf0f0000afaf00af afaf00afafaf00afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00 afafaf00fcaf0b00afaf00afafaf00afafaf00bdaf01dfdffcaf016464f5 9501dfdff6af016464fcaf1a0000afaf0000af0000afaf0000afaf00afaf 0000afaf0000afaf00f4af360000afaf0000afaf0000afaf0000afaf0000 afaf0000afaf0000afaf0000afaf0000afaf0000af00afaf0000afaf0000 afaf00afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700d69dd69d 569d000700d69dd69d569d56f6af166464afafaf000000afafaf00afafaf 00afafaf00afaf00fcaf0300afafaffc00fcaf0800afafaf00afafaf00fc af0300afaf00fcaffd00bcaf01dfdffcaf016464f59501dfdff6af016464 fbaffc00fdaffc00fdaf0300afafaffc00fdaf0000f3affd0004af00afaf affc00fcaffd0004af00afafaffc00fcaffc0005afaf00afafaffc00fdaf 0400afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d 56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf016464f59501 dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af0700d69d d69d569d000700d69dd69d569d56f6af01646480af02afdfdffcaf016464 f59501dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af07 00d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf 016464f59501dfdff6af016464deaff80095af01dfdffcaf016464f59501 dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01646480af02 afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf016464 f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464 80af02afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf 016464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af 01646480af02afdfdffcaf016464f59501dfdff6af01646480afebaf01df dffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d56 56f6af01646480af02afdfdffcaf016464f59501dfdff6af01646480afeb af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd6 9d569d56f6af01646480af02afdfdffcaf016464f59501dfdff6af016464 80afebaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700 d6d69d9d9d5656f6af016464d0af0000caaf050000afaf0000ecaf01dfdf fcaf016464f59501dfdff6af016464edaf0000e8af010000d2af0000e6af 050000afaf0000e8af01dfdffcaf016464f59501dfdff5af0700d69dd69d 569d000700d69dd69d569d56f6af016464d0af0000d6af0000f6af0400af afaf00eaaf01dfdffcaf016464f59501dfdff6af016464edaf0000e9af00 00d0af0000e7af0400afafaf00e6af01dfdffcaf016464f59501dfdff5af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d1af0000d5af00 00f6af0400afafaf00eaaf01dfdffcaf016464f59501dfdff6af016464ed af0000e9af0000d0af0000e7af0400afafaf00e6af01dfdffcaf016464f5 9501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af1a6464af afaf000000afafaf00af0000afaf0000afafaf00af000000fcaffc0015af af00afafaf00afafaf00afafaf00afaf00af000000fcaffc000aafaf00af afaf00afafaf00f5affd0007afaf000000afaf00fcaffc0003af000000eb af01dfdffcaf016464f59501dfdff6af016464fbaffc00fdaffc00fdaf03 00afafaffc00fdaf0300af0000f8affd00fdaffc00fcaffc00fdaffc00f4 affc0002afaf00fcaf0900af00af000000afafaffc00f9affc0008afaf00 0000af000000e7af01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d 56000700d6d69d9d9d5656f6af016464fbaf440000afaf0000afaf0000af af00afaf0000afaf0000afaf0000afaf0000af00afafaf00afafaf00afaf af00afaf0000afaf0000afaf0000afaf0000af00afafaf00afafaf00f6af 0b00afafaf00afaf00afafaf00fcaf0600af00afafaf00eaaf01dfdffcaf 016464f59501dfdff6af016464fcaf1b0000afaf0000af0000afaf0000af af00afaf0000afaf0000afaf0000f5af1800afafaf0000afaf0000afaf00 00afaf0000af0000afaf0000f6af070000afaf0000af00fcaf0e00af0000 afaf0000af0000afaf0000fbaf0c0000afaf0000afaf00afafaf00e6af01 dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd69d56 9d56f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300af af00fcaf1100af00afafaf00afafaf00afaf00afafaf00fcaf0300afaf00 fcaf0a00af00afafaf00afafaf00f6af010000fbaf0400afafaf00fcaf06 00af00afafaf00eaaf01dfdffcaf016464f59501dfdff6af016464fcaf00 00faaf0000fcaf0600afaf00afaf00fcaf0300afaf00f4af0000f8af0300 afaf00faaf0000fcaf0000f6af0000faaf0000fcaf0200af00fcaf0200af 00fcaf0000fbaf0000fcaf0700afaf00afafaf00e6af01dfdffcaf016464 f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464 faaf0e00afaf00afafaf00afafaf00afaf00fcaf0200afaffa0010afaf00 afaf00afaf00afafaf00afafaf00fcaf0200afaffa0008afaf00afaf00af af00f4affd00fdaf0400afafaf00fcaf0600af00afafaf00eaaf01dfdffc af016464f3dff6af016464fcaf0000faaf0000fcaf0600afaf00afaf00fc af0300afaf00f4af0000fcaffb0002afaf00faaffa00f6af0000faaf0000 fcaf0200af00fcaf0100affa00fbaf0000fcaf0700afaf00afafaf00e6af 01dfdffcaf016464f3dff5af0700d69dd69d569d000700d69dd69d569d56 f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00 f9af0e00afaf00afaf00afafaf00afafaf00fcaf0300afaf00f9af0600af af00afaf00f2af080000afaf00afafaf00fcaf0600af00afafaf00eaaf01 dfdffcaf016464f7df036464dfdff6af016464fcaf0000faaf0000fcaf06 00afaf00afaf00fcaf0300afaf00f4af0c00afafaf0000afafaf00afaf00 faaf0000f1af0000faaf0000fcaf0200af00fcaf0200af00f6af0000fcaf 0700afaf00afafaf00e6af01dfdffcaf016464f7df036464dfdff5af0700 d6d69d9d9d56000700d6d69d9d9d5656f6af016464faaf0e00afaf00afaf af00afafaf00afaf00fcaf0300afaf00f9af0900af00af00af00afaf00fc af0000fcaf0300afaf00f9af0600af00af00af00f1af0700afaf00afafaf 00fcaf0600af00afafaf00eaaf01dfdffcaf04646495dfdffbaf04646495 dfdff6af016464fcaf0000fcaf0200af00fcaf0600afaf00afaf00fcaf03 00afaf00f4af0400afafaf00fcaf0300afaf00fcaf0200af00f1af0000fc af0200af00fcaf0200af00fcaf0200af00f6af0000fcaf0700afaf00afaf af00e6af01dfdffcaf04646495dfdffbaf04646495dfdff5af0700d69dd6 9d569d000700d69dd69d569d56f6af016464fbaf0f0000afaf00afafaf00 afafaf00afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00afafaf 00fcaf0000fcaf1000afaf0000afaf0000afafaf00afafaf00f4af1600af afaf00afaf00afafaf0000afaf0000af00afafaf00eaaf01dfdffcaf0464 6495dfdffbaf04646495dfdff6af016464fcaf1a0000afaf0000af0000af af0000afaf00afaf0000afaf0000afaf00f4af1800afafaf0000afaf0000 afaf0000afaf0000af0000afaf0000f6af2c0000afaf0000af0000afaf00 00af0000afaf0000af0000afaf0000afaf00afaf0000afaf0000afaf00af afaf00e6af01dfdffcaf04646495dfdffbaf04646495dfdff5af0700d6d6 9d9d9d56000700d6d69d9d9d5656f6af166464afafaf000000afafaf00af afaf00afafaf00afaf00fcaf0300afafaffc00fcaf0800afafaf00afafaf 00fcaf0000fcaf0300afafaffc00fcaf0400afafaf00f3affd00fcaf0e00 00afaf000000af00af00afafaf00eaaf01dfdffcaf0e64649595dfdfafaf af64649595dfdff6af016464fbaffc00fdaffc00fdaf0300afafaffc00fd af0000f4af0000fcaffd0004af0000afaffc00fdaffc00f4affc00fdaffd 000aaf00af00af000000afafaffc00fdaf0300afafaffc00fdaf0400afaf af00e6af01dfdffcaf0e64649595dfdfafafaf64649595dfdff5af0700d6 9dd69d569d000700d69dd69d569d56f6af01646480af02afdfdffcaf0e64 649595dfdfafafaf64649595dfdff6af01646480afebaf01dfdffcaf0e64 649595dfdfafafaf64649595dfdff5af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af01646480af02afdfdffcaf0e6464959595dfdfaf64649595 95dfdff6af01646480afebaf01dfdffcaf0e6464959595dfdfaf64649595 95dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464b5af f800d2af01dfdffcaf0e6464959595dfdfaf6464959595dfdff6af016464 deaff800e5aff800b8af01dfdffcaf0e6464959595dfdfaf6464959595df dff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02af dfdffcaf016464fc9502df6464fc9501dfdff6af01646480afebaf01dfdf fcaf016464fc9502df6464fc9501dfdff5af0700d69dd69d569d000700d6 9dd69d569d56f6af01646480af02afdfdffcaf016464fc9502df6464fc95 01dfdff6af01646480afebaf01dfdffcaf016464fc9502df6464fc9501df dff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02af dfdffcaf016464fb950064fb9501dfdff6af01646480afebaf01dfdffcaf 016464fb950064fb9501dfdff5af0700d69dd69d569d000700d69dd69d56 9d56f6af01646480dffddffcaf016464f3dff6af01646480dfe9dffcaf01 6464f3dff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af006480df fcdffcaf0064f2dff6af006480dfe8dffcaf0064f2dff5af0700d69dd69d 569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6 d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d56 80af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf 0700d69dd69d569d000700d69dd69d569d56f6af8064fb64e3af8064e764 e2af0700d6d69d9d9d56000700d6d69d9d9d5656f6af8064fc6400dfe3af 8064e86400dfe2af0700d69dd69d569d000700d69dd69d569d56f6af0164 64f79501dfdfcc95cadf0295dfdff79501dfdfe3af016464f79501dfdfbd 95c5df0295dfdff79501dfdfe2af0700d6d69d9d9d56000700d6d69d9d9d 5656f6af016464f995fddf0064cc95cbdf016495fcdff99501dfdfe3af01 6464f995fddf0064bd95c6df016495fcdff99501dfdfe2af0700d69dd69d 569d000700d69dd69d569d56f6af016464fb95fcdf016464cc9501dfdfce af02646495fadffb9501dfdfe3af016464fb95fcdf016464bd9501dfdfc9 af02646495fadffb9501dfdfe2af0700d6d69d9d9d56000700d6d69d9d9d 5656f6af046464959595fcdf03afaf6464cc9501dfdfceaf06646495dfdf afaffcdffd9501dfdfe3af046464959595fcdf03afaf6464bd9501dfdfc9 af06646495dfdfafaffcdffd9501dfdfe2af0700d69dd69d569d000700d6 9dd69d569d56f6af02646495fcdffcaf016464cc9501dfdfceaf04646495 dfdffcaffcdf0295dfdfe3af02646495fcdffcaf016464bd9501dfdfc9af 04646495dfdffcaffcdf0295dfdfe2af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af046464dfdfdffaaf016464cc9501dfdfceaf04646495dfdf faaffd6401dfdfe3af046464dfdfdffaaf016464bd9501dfdfc9af046464 95dfdffaaffd6401dfdfe2af0700d69dd69d569d000700d69dd69d569d56 f6af02646495fc64fcaf016464cc9501dfdfceaf04646495dfdffcaffc64 0295dfdfe3af02646495fc64fcaf016464bd9501dfdfc9af04646495dfdf fcaffc640295dfdfe2af0700d6d69d9d9d56000700d6d69d9d9d5656f6af 046464959595fc6403afaf6464cc9501dfdfceaf06646495dfdfafaffc64 fd9501dfdfe3af046464959595fc6403afaf6464bd9501dfdfc9af066464 95dfdfafaffc64fd9501dfdfe2af0700d69dd69d569d000700d69dd69d56 9d56f6af016464fb95fa64cc9501dfdfceaf04646495dfdffc64fb9501df dfe3af016464fb95fa64bd9501dfdfc9af04646495dfdffc64fb9501dfdf e2af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464f995fc64cc 9501dfdfcc640495df646464f99501dfdfe3af016464f995fc64bd9501df dfc7640495df646464f99501dfdfe2af0700d69dd69d569d000700d69dd6 9d569d56f6af016464f795016464cc9500dfcb640295df64f79501dfdfe3 af016464f795016464bd9500dfc6640295df64f79501dfdfe2af0700d6d6 9d9d9d56000700d6d69d9d9d5656f6af01646480dffddfe3af01646480df e9dfe2af0700d69dd69d569d000700d69dd69d569d56f6af006480dffcdf e3af006480dfe8dfe2af0700d6d69d9d9d56000700d6d69d9d9d565680af 80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700 d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d 000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d 9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af 80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700 d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56 000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd6 9d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d5656f6af 80df80dfb1dff6af0700d69dd69d569d000700d69dd69d569d56f6af80df 80dfb2df0064f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01df df80af80afb5af016464f6af0700d69dd69d569d000700d69dd69d569d56 f6af01dfdf80af80afb5af016464f6af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af01dfdf80af80afb5af016464f6af0700d69dd69d569d0007 00d69dd69d569d56f6af01dfdf80af80afb5af016464f6af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af01dfdf80af80afb5af016464f6af0700 d69dd69d569d000700d69dd69d569d56f6af01dfdf80af80afb5af016464 f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdf80af80afb5 af016464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdf80 af80afb5af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af 01dfdf80af80afb5af016464f6af0700d69dd69d569d000700d69dd69d56 9d56f6af01dfdfd8af80dfc6df97af016464f6af0700d6d69d9d9d560007 00d6d69d9d9d5656f6af01dfdfd8af80dfc7df006497af016464f6af0700 d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af01dfdf80afcaaf 01646497af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af 01dfdfd8af01dfdf80afcaaf01646497af016464f6af0700d69dd69d569d 000700d69dd69d569d56f6af01dfdfd8af01dfdf80afcaaf01646497af01 6464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd8af01 dfdf80afcaaf01646497af016464f6af0700d69dd69d569d000700d69dd6 9d569d56f6af01dfdfd8af01dfdfd1affd00c9af0000b4af01646497af01 6464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd8af01 dfdfd3af060000afafaf0000cbaf0000b4af01646497af016464f6af0700 d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af01dfdfd3af0000 fbaf0000cbaf0000caaff2dff8af01646497af016464f6af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af01dfdfd8af01dfdfd4af0000f6affc00 fdaf1200af0000afaf0000afafaf00af0000afaf0000fcaffc00fdaf0400 af000000fcaffd0007af00afafaf000000d0aff3df0064f8af01646497af 016464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af 01dfdfd4af0000f7af3a0000afaf0000afaf0000afaf0000afaf00afaf00 00afaf0000afaf00afaf0000afaf0000afaf0000afaf0000afaf0000afaf 0000afaf00afafaf00d1af01dfdff6af016464f8af01646497af016464f6 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd8af01dfdfd4 af0000f7af0000fcaf1600afaf00afafaf00afafaf00afaf00afafaf00af afaf00f9af0300afaf00fcaf0300afaf00fcaf0400afaf0000ceaf01dfdf f6af016464f8af01646497af016464f6af0700d69dd69d569d000700d69d d69d569d56f6af01dfdfd8af01dfdfd4af0000f7af0000fcaf1900afaf00 afafaf00afafaf00afaf00afafaf00afafaf00afafaffb0002afaf00fcaf 0300afaf00fcaf0600afafaf000000d0af01dfdff6af016464f8af016464 97af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdf d8af01dfdfd4af0000f7af0000fcaf2100afaf00afafaf00afafaf00afaf 00afafaf00afafaf00afaf0000afafaf00afaf00fcaf0300afaf00fcaf00 00fbaf010000d1af01dfdff6af016464f8af01646497af016464f6af0700 d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af01dfdfd3af0000 fbaf0300afaf00fcaf1900afaf00afafaf00afafaf00afaf00afafaf00af afaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000faaf0000d1af 01dfdff464f8af01646497af016464f6af0700d6d69d9d9d56000700d6d6 9d9d9d5656f6af01dfdfd8af01dfdfd3af2f0000afafaf0000afaf0000af af0000afaf00afafaf00afafaf00afaf00afafaf00afafaf00afaf0000af af0000afaf00fcaf0f00afaf0000afaf0000afaf00afafaf00d1af00dff3 64f8af01646497af016464f6af0700d69dd69d569d000700d69dd69d569d 56f6af01dfdfd8af01dfdfd1affd00fbaffc00fdaf1e00afafaf00afafaf 00afaf00afafaf00afafaf00afafaf000000af0000af00fcaf0e00afafaf 000000af00afafaf000000baaf01646497af016464f6af0700d6d69d9d9d 56000700d6d69d9d9d5656f6af01dfdfd8af01dfdf80afcaaf01646497af 016464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af 01dfdf80afcaaf01646497af016464f6af0700d6d69d9d9d56000700d6d6 9d9d9d5656f6af01dfdfd8af01dfdf80afcaaf01646497af016464f6af07 00d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af01dfdf80afca af01646497af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6 af01dfdfd8af01dfdf80afcaaf01646497af016464f6af0700d69dd69d56 9d000700d69dd69d569d56f6af01dfdfd8af01dfdf8064c86497af016464 f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd8af00df80 64c76497af016464f6af0700d69dd69d569d000700d69dd69d569d56f6af 01dfdf80af80afb5af016464f6af0700d6d69d9d9d56000700d6d69d9d9d 5656f6af01dfdf80af80afb5af016464f6af0700d69dd69d569d000700d6 9dd69d569d56f6af01dfdf80af80afb5af016464f6af0700d6d69d9d9d56 000700d6d69d9d9d5656f6af01dfdf80af80afb5af016464f6af0700d69d d69d569d000700d69dd69d569d56f6af01dfdf80af80afb5af016464f6af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdf80af80afb5af01 6464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdf80af80 afb5af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01df df80af80afb5af016464f6af0700d69dd69d569d000700d69dd69d569d56 f6af01dfdfa8af8064c164ccaf016464f6af0700d6d69d9d9d56000700d6 d69d9d9d5656f6af01dfdfa8af8064c26400dfccaf016464f6af0700d69d d69d569d000700d69dd69d569d56f6af01dfdfa8af01646480afc5af01df dfccaf016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01df dfa8af01646480afc5af01dfdfccaf016464f6af0700d69dd69d569d0007 00d69dd69d569d56f6af01dfdfa8af01646480afc5af01dfdfccaf016464 f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfa8af016464 80afc5af01dfdfccaf016464f6af0700d69dd69d569d000700d69dd69d56 9d56f6af01dfdfa8af01646480afc5af01dfdfccaf016464f6af0700d6d6 9d9d9d56000700d6d69d9d9d5656f6af01dfdfa8af01646480afc5af01df dfccaf016464f6af0700d69dd69d569d000700d69dd69d569d56f6af01df dfa8af01646480afc5af01dfdfccaf016464f6af0700d6d69d9d9d560007 00d6d69d9d9d5656f6af01dfdfd7aff900d8af016464fbaf0000fbaf0000 fbaf0000f2af0000f9af000080afeeaf01dfdfccaf016464f6af0700d69d d69d569d000700d69dd69d569d56f6af01dfdfd7af0000d2af016464fbaf 0000fbaf0000fbaf0000f2af0000f9af000080afeeaf01dfdfccaf016464 f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd7af0000d2 af016464fbaf0000fcaf0200af00fcaf0000f2af0000f9af000080afeeaf 01dfdfccaf016464f6af0700d69dd69d569d000700d69dd69d569d56f6af 01dfdfd7af0000f8affc00fdaf0500af0000af00e7af016464faaf0d00af afaf00af00afafaf00afafaffc00fdaf0d00af0000af00afafaf000000af 0080afeeaf01dfdfccaf016464f6af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af01dfdfd7af0000f9af0d0000afaf0000afaf0000afafaf00e7 af016464faaf2200afafaf00af00afafaf00afaf0000afaf0000afaf0000 afafaf00afaf0000afaf000080afeeaf01dfdfccaf016464f6af0700d69d d69d569d000700d69dd69d569d56f6af01dfdfd7affa0002afaf00fcaf03 00afaf00e2af016464faaf0d00afafaf00af00afafaf00afaf00fcaf0300 afaf00fcaf0300afaf00fcaf000080afeeaf01dfdfccaf016464f6af0700 d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd7af0000f9af0000fc af0300afaf00e2af016464f9af0c00af00afafaf00af00afafaf00fcaf03 00afaf00fcaf0300afaf00fcaf000080afeeaf01dfdfccaf016464f6af07 00d69dd69d569d000700d69dd69d569d56f6af01dfdfd7af0000f9af0000 fcaf0300afaf00e2af016464f9af0c00af00afafaf00af00afafaf00fcaf 0300afaf00fcaf0300afaf00fcaf000080afeeaf01dfdfccaf016464f6af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd7af0000f9af00 00fcaf0300afaf00e2af016464f9af0c00af00afafaf00af00afafaf00fc af0300afaf00fcaf0300afaf00fcaf000080afeeaf01dfdfccaf016464f6 af0700d69dd69d569d000700d69dd69d569d56f6af01dfdfd7af0000f9af 080000afaf0000afaf00fcaf0000e7af016464f8af0000fbaf0000fcaf08 0000afaf0000afaf00fcaf0800afaf0000afaf000080afeeaf01dfdfccaf 016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd7af 0000f8affc00fdaf0000fcaf0000e7af016464f8af0000fbaf0000fbaffc 00fdaf0000fcaf0800afafaf000000af0080afeeaf01dfdfccaf016464f6 af0700d69dd69d569d000700d69dd69d569d56f6af01dfdfa8af01646480 afc5af01dfdfccaf016464f6af0700d6d69d9d9d56000700d6d69d9d9d56 56f6af01dfdfa8af01646480afc5af01dfdfccaf016464f6af0700d69dd6 9d569d000700d69dd69d569d56f6af01dfdfa8af01646480afc5af01dfdf ccaf016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdf a8af01646480afc5af01dfdfccaf016464f6af0700d69dd69d569d000700 d69dd69d569d56f6af01dfdfa8af01646480afc5af01dfdfccaf016464f6 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfa8af01646480 afc5af01dfdfccaf016464f6af0700d69dd69d569d000700d69dd69d569d 56f6af01dfdfa8af01646480afc5af01dfdfccaf016464f6af0700d6d69d 9d9d56000700d6d69d9d9d5656f6af01dfdfa8af01646480afc5af01dfdf ccaf016464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdf a8af01646480afc5af01dfdfccaf016464f6af0700d6d69d9d9d56000700 d6d69d9d9d5656f6af01dfdfa8af01646480afc5af01dfdfccaf016464f6 af0700d69dd69d569d000700d69dd69d569d56f6af01dfdfa8af01646480 dfc3dfccaf016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af 01dfdfa8af006480dfc2dfccaf016464f6af0700d69dd69d569d000700d6 9dd69d569d56f6af01dfdf80af80afb5af016464f6af0700d6d69d9d9d56 000700d6d69d9d9d5656f6af01dfdf80af80afb5af016464f6af0700d69d d69d569d000700d69dd69d569d56f6af01dfdf80af80afb5af016464f6af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdf80af80afb5af01 6464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdf80af80 afb5af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01df df80af80afb5af016464f6af0700d69dd69d569d000700d69dd69d569d56 f6af01dfdf80af80afb5af016464f6af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af01dfdf80af80afb5af016464f6af0700d69dd69d569d0007 00d69dd69d569d56f6af01dfdf80648064b364f6af0700d6d69d9d9d5600 0700d6d69d9d9d5656f6af00df80648064b264f6af0700d69dd69d569d00 0700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d 9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80 af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d6 9dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d5600 0700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d 569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80 af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6 d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d00 0700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d 9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80 af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d6 9dd69d569d000700d69dd69d569d56f1affd00f4af0000ebaf000080af80 afd2af0700d6d69d9d9d56000700d6d69d9d9d5656f3af060000afafaf00 00f6af0000efaf0400afafaf0080af80afd2af0700d69dd69d569d000700 d69dd69d569d56f3af0000fbaf0000f6af0000efaf000080af80afceaf07 00d6d69d9d9d56000700d6d69d9d9d5656f3af0000f7affc00fdaf0300af afaffc00fcaffc0009af000000afaf00afafaffc00fdaf0400af00000080 af80afe1af0700d69dd69d569d000700d69dd69d569d56f2af010000faaf 2e0000afaf0000afaf00afaf0000afaf0000afaf0000afaf0000af00afaf af00afaf0000afaf0000afaf0000afaf000080af80afe2af0700d6d69d9d 9d56000700d6d69d9d9d5656f0af010000fcaf0000fcaf0600afaf00afaf 00fcaf0300afaf00faaf0700afafaf00afaf00fcaf0300afaf00fcaf0000 80af80afe2af0700d69dd69d569d000700d69dd69d569d56eeaf030000af affa0004afaf00afaffa0002afaf00faaf0700afafaf00afaf00fcaf0300 afaf00fcaf000080af80afe2af0700d6d69d9d9d56000700d6d69d9d9d56 56edaf0300afaf00f9af0300afaf00f9af0000faaf0700afafaf00afaf00 fcaf0300afaf00fcaf000080af80afe2af0700d69dd69d569d000700d69d d69d569d56f3af0000fbaf0300afaf00f9af0300afaf00f9af0000fcaf09 00af00afafaf00afaf00fcaf0300afaf00fcaf000080af80afe2af0700d6 d69d9d9d56000700d6d69d9d9d5656f3af320000afafaf0000afaf0000af af0000afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00afaf 0000afaf0000afaf00fcaf000080af80afe2af0700d69dd69d569d000700 d69dd69d569d56f1affd00fbaffc00fdaf0300afafaffc00fcaffc00fdaf 060000af00afafaffc00fdaf0000fcaf000080af80afe2af0700d6d69d9d 9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d6 9dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d5656 80af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf 0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d 569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6 d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d56 f4af80648064b564f4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af 80648064b66400dff4af0700d69dd69d569d000700d69dd69d569d56f4af 01646480af80afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d 5656f4af01646480af80afb9af01dfdff4af0700d69dd69d569d000700d6 9dd69d569d56f4af01646480af80afb9af01dfdff4af0700d6d69d9d9d56 000700d6d69d9d9d5656f4af01646480af80afb9af01dfdff4af0700d69d d69d569d000700d69dd69d569d56f4af01646480af80afb9af01dfdff4af 0700d6d69d9d9d56000700d6d69d9d9d5656f4af01646480af80afb9af01 dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af01646480af80 afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af0164 64f8af0000e7af0000fcaf0000d8af0000faaf0000e8af0000c0af000080 afebaf01dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af0164 64f8af0000e7af0000fcaf0000d8af0000faaf0000f6af0000f3af0000c0 af000080afebaf01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656 f4af016464f9af0000e6af0400afafaf00d8af0000f9af0000f6af0000f4 af0000c0af000080afeaaf01dfdff4af0700d69dd69d569d000700d69dd6 9d569d56f4af016464f9af0300afaf00fcaf1e00afaf000000afafaf00af 0000afaf000000af00afafaf00afaf00af000000fcaffd0009af00afaf00 af0000afaffc00fdaf0400af000000fcaf0b00afafaf000000af00afafaf fc0007afaf000000afafaffc00fcaf0b00afafaf000000af00afafaffc00 fcaffc00fdaf0f00af0000afaf0000afafaf00af000000fcaffc000eafaf 00afafaf00afafaf00afafaf0080afeaaf01dfdff4af0700d6d69d9d9d56 000700d6d69d9d9d5656f4af016464f9af0300afaf00fcaf7f00af00afaf af00afaf0000afafaf0000afaf0000afafaf00afaf0000afaf0000afaf00 00afaf0000afaf0000afafaf0000afaf0000afaf0000afaf0000afafaf00 afaf0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000afaf af00afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000 afaf002100afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00 afafaf00afafaf0080afeaaf01dfdff4af0700d69dd69d569d000700d69d d69d569d56f4af016464faaf0400afafaf00fcaf0300af0000fbaf0000fc af0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00f7af 0300afaf00fcaf0700afaf00afafaf00fcaf0000f9af0300afaf00f8af07 00afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf0e00afaf00af afaf00afafaf00afaf00fcaf0300afaf00fcaf0d00af00afafaf00afafaf 00afaf0080afe9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d56 56f4af016464faaf0400afafaf00fcaf0900afaf000000afafaf00fcaf00 00fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fbaffb00 02afaf00fcaf0700afaf00afafaf00fcaf0300afafaffb0002afaf00fcaf fb0006afaf00afafaf00fcaf0200afaffa0002afaf00fcaf0e00afaf00af afaf00afafaf00afaf00fcaf0200afaffa000cafaf00afaf00afaf00afaf af0080afe9af01dfdff4af0700d69dd69d569d000700d69dd69d569d56f4 af016464faaf0400afafaf00fcaf0000fcaf040000afaf00fcaf0000fcaf 0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf080000afaf af00afaf00fcaf0700afaf00afafaf00fcaf1b00afaf0000afafaf00afaf 00afafaf0000afafaf00afaf00afafaf00fcaf0300afaf00f9af0000fcaf 0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af0a00afaf00 afaf00afafaf0080afe9af01dfdff4af0700d6d69d9d9d56000700d6d69d 9d9d5656f4af016464fbaf0000fcaf0000fcaf0000fbaf0300afaf00fcaf 0000fcaf0200af00fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0000 fcaf0300afaf00fcaf0200af00fcaf0000fcaf0300afaf00fcaf0700afaf 00afafaf00fcaf0200af00fcaf0000fcaf0300afaf00f9af0000fcaf0e00 afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af0900af00af00af 00afaf0080afe8af01dfdff4af0700d69dd69d569d000700d69dd69d569d 56f4af016464fbaf0000fcaf0e0000afaf0000af00afafaf00afaf00fcaf 070000afaf0000af00fcaf0000fcaf0b00afaf0000afaf0000afaf00fcaf 0f0000afaf0000afaf0000afaf0000af00fcaf1b0000afaf0000afaf0000 afaf0000afaf00afafaf0000afaf0000af00fcaf230000afaf0000afaf00 00afaf0000afaf0000afaf0000afaf00afafaf00afafaf00afaf00fcaf14 00afaf0000afaf0000afafaf00afafaf00afafaf0080afe8af01dfdff4af 0700d6d69d9d9d56000700d6d69d9d9d5656f4af016464fbaf0000fbaffd 000aaf00afaf000000afafaf00fbaffd0003af00af00fcaf0000fcaf0b00 afafaf000000af00afaf00fbaffd000baf0000af00af000000afaf00fbaf fd0017af00afafaf000000af0000afaf0000afaf000000af000000fbaffd 0004af00afafaffc00fcaffc00fdaf0b00afafaf00afafaf00afaf00fcaf 0300afafaffc00fcaf0800afafaf00afafaf0080afe8af01dfdff4af0700 d69dd69d569d000700d69dd69d569d56f4af016464caaf0000f1af0000d0 af0000c5af000080afedaf01dfdff4af0700d6d69d9d9d56000700d6d69d 9d9d5656f4af016464cfaf050000afaf0000f1af0000d5af050000afaf00 00c6affd0080afeeaf01dfdff4af0700d69dd69d569d000700d69dd69d56 9d56f4af016464ceaffc00f0af0000d4affc00c6af040000af000080afef af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af01646480 afd0af060000afafaf000080aff0af01dfdff4af0700d69dd69d569d0007 00d69dd69d569d56f4af01646480afd1af010000fbaf01000080aff1af01 dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af01646480af80 afb9af01dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af0164 6480af80afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656 f4af01646480af80afb9af01dfdff4af0700d69dd69d569d000700d69dd6 9d569d56f4af01646480df80dfb7dff4af0700d6d69d9d9d56000700d6d6 9d9d9d5656f4af006480df80dfb6dff4af0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680 af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf07 00d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d56 9d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d6 9d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680 af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf07 00d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d 56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680 af80af9daf0700d69dd69d569d000700d69dd69d569d56806480649d6407 00d6d69d9d9d56000700d6d69d9d9d565680df80df9ddf0700d69dd69d56 9d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d6 9d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680 af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf07 00d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d 56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680 af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf07 00d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d56 9d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d6 9d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680 af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf07 00d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d 56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680 af80af9daf0700d69dd69d569d000700d69dd69d569d56eeafd5dfa1afd5 dfa1afd5dfeeaf0700d6d69d9d9d56000700d6d69d9d9d5656eeafd6df00 64a1afd6df0064a1afd6df0064eeaf0700d69dd69d569d000700d69dd69d 569d56eeaf01dfdfd9af016464a1af01dfdfd9af016464a1af01dfdfd9af 016464eeaf0700d6d69d9d9d56000700d6d69d9d9d5656eeaf01dfdfd9af 016464a1af01dfdfd9af016464a1af01dfdfd9af016464eeaf0700d69dd6 9d569d000700d69dd69d569d56eeaf01dfdfd9af016464a1af01dfdfd9af 016464a1af01dfdfd9af016464eeaf0700d6d69d9d9d56000700d6d69d9d 9d5656eeaf01dfdfd9af016464a1af01dfdfd9af016464a1af01dfdfd9af 016464eeaf0700d69dd69d569d000700d69dd69d569d56eeaf01dfdfd9af 016464a1af01dfdfd9af016464a1af01dfdfd9af016464eeaf0700d6d69d 9d9d56000700d6d69d9d9d5656eeaf01dfdfd9af016464a1af01dfdfd9af 016464a1af01dfdfd9af016464eeaf0700d69dd69d569d000700d69dd69d 569d56eeaf01dfdff3affd00fbaf0000fbaf0000f5af016464a1af01dfdf fbaff90004af00afaf00eaaf016464a1af01dfdffaaf0000faaf0300afaf 00f9af0000f2af016464eeaf0700d6d69d9d9d56000700d6d69d9d9d5656 eeaf01dfdff5af0a0000afafaf0000afafaf00fcaf0000f4af016464a1af 01dfdffbaf0000f9af0600afaf00afaf00edaf016464a1af01dfdffaaf00 00faaf0300afaf00f9af0000f2af016464eeaf0700d69dd69d569d000700 d69dd69d569d56eeaf01dfdff5af0000fbaf0800afafaf00afafaf00f3af 016464a1af01dfdffbaf0000f6af0300afaf00edaf016464a1af01dfdffa af0000faaf0000f6af0000f2af016464eeaf0700d6d69d9d9d56000700d6 d69d9d9d5656eeaf01dfdff6af0000f9af0600afaf00afaf00f2af016464 a1af01dfdffbaf0000f9af0a00afaf00af000000afafaffc00fdaf0300af 0000fcaf016464a1af01dfdffaaf0000faaf0e00afaf00afafaf000000af 00afafaffc00f9af016464eeaf0700d69dd69d569d000700d69dd69d569d 56eeaf01dfdff6af0000f9af0500afaf00af00f1af016464a1af01dfdffb af0000f9af1300afaf00afaf00afafaf0000afaf0000afaf0000faaf0164 64a1af01dfdffaaf0000faaf1300afaf00afaf0000afaf0000afaf0000af af0000faaf016464eeaf0700d6d69d9d9d56000700d6d69d9d9d5656eeaf 01dfdff6af0000f9af0500afaf000000f1af016464a1af01dfdffbaffa00 0cafaf00afaf00afaf00afafaf00fcaf0300afaf00f9af016464a1af01df dffaaff80005afaf00afaf00fcaf0300afaf00fcaf0000faaf016464eeaf 0700d69dd69d569d000700d69dd69d569d56eeaf01dfdff6af0000f9af06 00afaf00afaf00f2af016464a1af01dfdffbaf0000f9af0900afaf00afaf 00afafaffa0002afaf00f9af016464a1af01dfdffaaf0000faaf0600afaf 00afaf00fcaf0200afaffa00faaf016464eeaf0700d6d69d9d9d56000700 d6d69d9d9d5656eeaf01dfdff6af0000f9af0700afaf00afafaf00f3af01 6464a1af01dfdffbaf0000f9af0a00afaf00afaf00afafaf00f9af0000f9 af016464a1af01dfdffaaf0000faaf0600afaf00afaf00fcaf0300afaf00 f5af016464eeaf0700d69dd69d569d000700d69dd69d569d56eeaf01dfdf f5af0000fbaf0400afafaf00fcaf0000f4af016464a1af01dfdffbaf0000 f9af0a00afaf00afaf00afafaf00f9af0000f9af016464a1af01dfdffaaf 0000faaf0600afaf00afaf00fcaf0300afaf00f5af016464eeaf0700d6d6 9d9d9d56000700d6d69d9d9d5656eeaf01dfdff5af0a0000afafaf0000af afaf00fbaf0000f5af016464a1af01dfdffbaf0000f9af1200afaf00afaf 00afafaf0000afaf0000afaf00f9af016464a1af01dfdffaaf0000faaf13 00afaf00afaf0000afaf0000afaf0000afaf0000faaf016464eeaf0700d6 9dd69d569d000700d69dd69d569d56eeaf01dfdff3affd00fbaf0000faaf 0000f6af016464a1af01dfdffbaf0000f9af0a00afaf00afafaf0000afaf fc00fdaf0000f9af016464a1af01dfdffaaf0000faaf0e00afaf00afafaf 000000af00afafaffc00f9af016464eeaf0700d6d69d9d9d56000700d6d6 9d9d9d5656eeaf01dfdfd9af016464a1af01dfdfd9af016464a1af01dfdf d9af016464eeaf0700d69dd69d569d000700569d569d569d56eeaf01dfdf d9af016464a1af01dfdfd9af016464a1af01dfdfd9af016464eeaf0700d6 d69d569d56000000fc56029d5656eeaf01dfdfd9af016464a1af01dfdfd9 af016464a1af01dfdfd9af016464eeaf0200d69dfc56ff000000fcd60256 9d56eeaf01dfdfd9af016464a1af01dfdfd9af016464a1af01dfdfd9af01 6464eeaf0000fad6ff000700d6d6d69d9d5656eeaf01dfdfd9af016464a1 af01dfdfd9af016464a1af01dfdfd9af016464eeaf0200d69dfcd6ff0007 00d69dd69d569d56eeaf01dfdfd9af016464a1af01dfdfd9af016464a1af 01dfdfd9af016464eeaf0700d6d69d9d9d56000700d6d69d9d9d5656eeaf 01dfdfd9af016464a1af01dfdfd9af016464a1af01dfdfd9af016464eeaf 0700d69dd69d569d000700d69dd69d569d56eeaf01dfdfd764a1af01dfdf d764a1af01dfdfd764eeaf0700d6d69d9d9d56000700d6d69d9d9d5656ee af00dfd664a1af00dfd664a1af00dfd664eeaf0700d69dd69d569d000700 d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d56 5680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9d af0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd6 9d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700 d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d 5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9d af0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d 9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700 d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d56 5680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9d af0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd6 9d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700 d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d 5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9d af0700d69dd69d569d000700d69dd69d569d56800080009c0006d6d69d9d 9d56000600d6d69d9d9d5680d680d69ad6059dd69d569d007f00d69dd69d 569dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd6729dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69d9d9d56000200d6d6e49d0156d6809d809dcf9d0156d6e49d0256 9d000300d69dd6e59d0256d6d6809d809dd19d035656d6d6e49d0156007f 00d6d69d569d569d569d569d569d569d569d569d569d569d569d569d569d 5656d6d6569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d7f569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d72569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d56d6d69d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d000100d6e25601d6d680568056cf5601d6d6 e356ff00800080008d00 grestore showpage %%Trailer geomview-1.9.5/doc/figs/trefdodecinter.ps0000644000175000017500000014763012310110174015334 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: noname.ps %%Pages: 1 %%BoundingBox: 194 263 418 499 %%EndComments /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 466 string def %%EndProlog %%Page: 1 1 gsave 194.16 263.4 translate 223.68 235.2 scale 466 490 8 [ 466 0 0 -490 0 490 ] { picstr readstring } image 800080008000ae000000e3d6019d5680d680d680d6f0d6019d56e2d6019d 007f00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69d5656d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69d7fd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d51d6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6d69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69d56000300d69dd6e59d0256 d6d6809d809d809df19d0256d6d6e59d02569d000200d6d6e49d0156d680 9d809d809df09d0156d6e39d0156007f00d69dd69d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d567f9d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d567f9d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d56519d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d d69d569d007f00d6d69d9d9d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d7f569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d7f569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d51569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569dd69d9d9d56000600d69dd6 9d569d800080008000bc0006d69dd69d569d000700d6d69d9d9d560080d6 80d680d6bed60700d6d69d9d9d56007f00d69dd69d569d00d6d69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd6d6d69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd6519dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69d9dd6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd600d69d d69d569d000800d6d69d9d9d5600d6ea9d0156d6809d809d899d0256d6d6 ea9d0156d6ea9d085600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d 0256d6d6809d809d8b9d025656d6e99d0556d6d69d9d9df200fc9d085600 d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6ee9dfc00cc9d02 00009df900ed9d0500009d9d0000f99d010000d99d010000ed9d01000080 9dbd9d0256d6d6eb9d025656d6fc9d0000f49d0d009d9d9d565600d6d69d 9d9d56000900d69dd69d569d00d6d6eb9d0256d6d6f19dfd00039d9d0000 ce9d0500009d9d0000e89d0500009d9d0000f99d010000d99d010000ec9d 010000809dbf9d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d56 00d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6f19d010000fc 9d010000cf9d0600009d9d9d0000e99d010000f59d010000c29d01000080 9dbe9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d 9d9d56000900d69dd69d569d00d6d6eb9d0256d6d6f39d010000f69dfc00 fd9d0800009d00009d000000fc9dfc00fd9d0600009d00009d9dfc00f99d 0600009d9d9d0000f99d0900009d9d9d00009d9d9dfc00fd9d1100009d9d 00009d9d9d0000009d00009d9d9dfc00fc9dfc00fd9d0500009d000000fa 9d010000fc9d0700009d00009d9d9dfc00109d9d00009d9d00009d9d0000 9d9d9d0000809dc09d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d 9d5600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6f29d0100 00f79d1b00009d9d00009d9d0000009d0000009d00009d9d00009d9d0000 9d9dfb00069d00009d9d0000fa9d0600009d9d9d0000f99d3800009d9d9d 00009d9d00009d9d00009d9d00009d9d00009d9d00009d9d0000009d9d00 009d9d00009d9d00009d9d00009d9d0000009d9d0000fb9d010000fc9d1c 00009d00009d9d00009d9d00009d00009d9d00009d9d00009d9d9d000080 9dbf9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d 9d9d56000b00d69dd69d569d00d6d69d9df000fd9d0256d6d6f49d010000 f29d1900009d9d00009d9d00009d9d00009d00009d9d9d00009d9d0000f8 9d010000fb9d010000fc9df900029d0000fc9d1400009d00009d9d9d0000 9d00009d9d9d00009d0000fc9d0900009d00009d9d9d0000fa9d0a00009d 9d00009d9d9d0000fb9d2200009d9d9d00009d9d00009d00009d9d9d0000 9d00009d9d00009d9d00009d9d9d0000809dc09d025656d6f89dfc00f59d 0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000c00d6d69d 9d9d5600d69d9d9d00f29d05009d9d5656d6f39d010000f69dfb000d9d9d 00009d9d00009d9d00009d9dfa00039d9d0000fb9dfb00fa9d0600009d9d 9d0000f99d0a00009d9d9d00009d9d0000fa9d1000009d9d00009d9d0000 9d9d9d00009d9dfa00fd9dfb00089d9d00009d9d9d0000fa9d0b00009d9d 00009d9d00009d9dfa000a9d9d00009d0000009d0000fc9d010000809dbf 9d0256d6d6f99d04009d9d0000f79d025656d6fc9d0000f49d0d00009d9d 565600d6d69d9d9d56000c00d69dd69d569d00d6d69d9d00f29d0600009d 9d56d6d6f49d010000f79d1400009d9d00009d9d00009d9d00009d9d0000 9d0000f99d010000fc9d0500009d9d0000fa9d0600009d9d9d0000f99d09 00009d9d9d00009d0000f99d0800009d9d00009d0000fc9d0400009d0000 f99d0e00009d9d00009d9d00009d9d9d0000fa9d0c00009d9d00009d9d00 009d0000f99d0800009d009d009d0000fc9d010000809dc09d025656d6f8 9d04009d9d0000f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd6 9d569d000b00d6d69d9d9d5600d69d9d9def00039d5656d6f39d010000fb 9d1800009d00009d9d9d00009d9d00009d9d00009d9d00009d0000f99d0b 00009d9d9d00009d9d9d0000fa9d0600009d9d9d0000fa9d1a00009d9d9d 00009d9d00009d9d9d00009d9d00009d9d00009d0000fc9d0400009d0000 fa9d0f00009d9d9d00009d9d00009d9d9d0000f99d0b009d00009d9d9d00 009d0000f99dfc00039d000000fb9d010000809dbf9d0256d6d6f99dfb00 f79d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000900d6 9dd69d569d00d6d6fc9df100049d9d56d6d6f39d2600009d9d0000009d9d 00009d9d00009d9d00009d9d00009d9d00009d9d00009d9d00009d9d0000 fc9d0500009d9d0000f99d0500009d9d0000f99d3800009d9d0000009d9d 00009d9d00009d9d00009d9d00009d9d00009d9d0000009d9d00009d9d00 009d9d00009d9d00009d9d00009d9d9d0000f89dfd00fd9d0900009d9d00 009d9d0000fc9d0500009d9d0000fb9d010000809dbf9d025656d6f79dfc 00f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000800 d6d69d9d9d5600d6eb9d025656d6f19dfc00fb9dfd00109d00009d00009d 9d00009d9d00009d9d9dfc00fd9d010000fb9dfd00029d0000fa9d030000 9d9df900fd9dfd00059d00009d9d9dfc00fd9d1100009d9d00009d9d9d00 00009d00009d9d9dfc00fc9dfd000a9d00009d00009d9d9d0000f89d0100 00fc9d0400009d9d9dfc00fb9d0500009d9d0000fb9d010000809dbe9d02 56d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d5600 0900d69dd69d569d00d6d6eb9d0256d6d6ba9d010000979d010000809dbe 9d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d56 9d000800d6d69d9d9d5600d6eb9d025656d6b99d010000989d010000809d bc9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d 9d56000900d69dd69d569d00d6d6eb9d0256d6d6b99d0100009a9d010000 809dbc9d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69d d69d569d000800d6d69d9d9d5600d6eb9d025656d6809d809d899d0256d6 d6eb9d025656d6fc9df1000b9d9d565600d6d69d9d9d56000900d69dd69d 569d00d6d6eb9d0256d6d6809d809d8b9d025656d6e99d0256d6d6fb9df3 00fd9d085600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d680 9d809d899d0256d6d6eb9d025656d6eb9d09565600d6d69d9d9d56007f00 d69dd69d569d00d69d9d569d569d569d569d569d569d569d569d569d569d 56d6569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d567f9d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d567f9d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d56519d569d56 9d569d569d569d569d569d569d569d569d569d5656d69d569d569d569d56 9d569d569d569d569d569d569d569d56d6569d569d569d569d569d569d56 9d569d569d569d569d5600d69dd69d569d0008009d569d9d9d56009de956 009d805680568856009de856009de9560700d6d69d569d56000000fb5600 9d800080008000bc0001d69dfc56ff000000fcd6029d5656805580558055 be550000fad6ff000700d6d6d69d569d56805580558055be550200d69dfc d6ff000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d6 9d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d569d 000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d6 9dd69d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d 5656805580558055be550700d6d69d9d9d56000700d69dd69d569d568055 80558055be550700d69dd69d569d000700d6d69d9d9d5656805580558055 be550700d6d69d9d9d56000700d69dd69d569d56805580558055be550700 d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d 9d56000700d69dd69d569d56805580558055be550700d69dd69d569d0007 00d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd6 9d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d5656 805580558055be550700d6d69d9d9d56000700d69dd69d569d5680558055 8055be550700d69dd69d569d000700d6d69d9d9d5656805580558055be55 0700d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69d d69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56 000700d69dd69d569d56805580558055be550700d69dd69d569d000700d6 d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d56 9d56805580558055be550700d69dd69d569d000700d6d69d9d9d56568055 80558055be550700d6d69d9d9d56000700d69dd69d569d56805580558055 be550700d69dd69d569d000700d6d69d9d9d5656805580558055be550700 d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d 569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d6 9d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d569d 000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d6 9dd69d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d 5656805580558055be550700d6d69d9d9d56000700d69dd69d569d568055 80558055be550700d69dd69d569d000700d6d69d9d9d5656805580558055 be550700d6d69d9d9d56000700d69dd69d569d56805580558055be550700 d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d 9d56000700d69dd69d569d56805580558055be550700d69dd69d569d0007 00d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd6 9d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d5656 805580558055be550700d6d69d9d9d56000700d69dd69d569d5680558055 8055be550700d69dd69d569d000700d6d69d9d9d5656805580558055be55 0700d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69d d69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56 000700d69dd69d569d56805580558055be550700d69dd69d569d000700d6 d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d56 9d56805580558055be550700d69dd69d569d000700d6d69d9d9d56568055 80558055be550700d6d69d9d9d56000700d69dd69d569d56805580558055 be550700d69dd69d569d000700d6d69d9d9d5656805580558055be550700 d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d 569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656b75580008000d000b7550700 d6d69d9d9d56000700d69dd69d569d56b75501000080558055d455010000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550200550080558055 d65502005500b7550700d6d69d9d9d56000700d69dd69d569d56b7550300 55550080558055d8550300555500b7550700d69dd69d569d000700d6d69d 9d9d5656b75504005555550080558055da55040055555500b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000fc55000080558055dc550000 fc550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fb55 000080558055de550000fb550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000fa55000080558055e0550000fa550000b7550700d69d d69d569d000700d6d69d9d9d5656b7550000f955000080558055e2550000 f9550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f855 00009055f7aa8055dd550000f8550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000f75500009a55e9aa8055e3550000f7550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000f6550000a455dcaa 8055e8550000f6550000b7550700d69dd69d569d000700d6d69d9d9d5656 b7550000f5550000ad55cfaa8055ee550000f5550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000f4550000b1550099c9aa8055f355 0000f4550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000 f4550000b355019999c3aa8055f8550000f4550000b7550700d6d69d9d9d 56000700d69dd69d569d56b7550000f3550000b655fc99bfaa8055fd5500 00f3550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f2 550000b955fb99e9aaf5dddeaa00bb81550000f2550000b7550700d6d69d 9d9d56000700d69dd69d569d56b75580008000d000b7550700d69dd69d56 9d000700d6d69d9d9d5656b755010000f1550000bf55f899f7aadddde9aa f9bb87550000f155010000b7550700d6d69d9d9d56000700d69dd69d569d 56b75502005500f1550000c355f69901aaaad0ddf0aaf6bb89550000f155 02005500b7550700d69dd69d569d000700d6d69d9d9d5656b75503005555 00f1550000c655f699c7ddf6aaf3bb8c550000f1550300555500b7550700 d6d69d9d9d56000700d69dd69d569d56b755040055555500f1550000c955 f699c0ddfdaaefbb8f550000f155040055555500b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000fc550000f1550000cc55f699bbddeebb 91550000f1550000fc550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000fb550000f1550000cf55f699b7ddeebb94550000f1550000 fb550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fa55 0000f1550000d255f599b4ddeebb97550000f1550000fa550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000f9550000f1550000d555 f599b1ddeebb99550000f1550000f9550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000f8550000f155d700f599adddeebb9b00f155 0000f8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 f755010000f3550000da55f599a9ddefbb9d550000f355010000f7550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f5550000f455 0000db550088f799a6ddeebb9f550000f4550000f5550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000f4550000f5550000dc550188 88f999a2ddeebba1550000f5550000f4550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000f3550000f6550000dd55018888fa999edd efbba2550000f6550000f3550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000f2550000f7550000de55fd88fc999addefbba4550000 f7550000f2550000b7550700d69dd69d569d000700d6d69d9d9d5656b755 0000f1550000f8550000df55fd88fd99aadd011919efddeebba6550000f8 550000f1550000b7550700d6d69d9d9d56000700d69dd69d569d56b75500 00f0550000f9550000e055fc880099adddf419f2ddefbba7550000f95500 00f0550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000ef 550000fa550000e155fc88ccddfbaafd99ebddec19f4ddf0bba8550000fa 550000ef550000b7550700d6d69d9d9d56000700d69dd69d569d56b75500 00ee550000fb550000e255fc88d2ddf4aaf899f5dde219f8ddf0bba95500 00fb550000ee550000b7550700d69dd69d569d000700d6d69d9d9d5656b7 550000ed550000fc550000e355fc88d8ddedaaf39901ddddda19faddf1bb aa550000fc550000ed550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000ec55040055555500e455fc88dfdde5aaf599d219fcddf2bb ab55040055555500ec550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000eb550300005500e555fc88e0ddfdbbe6aafa99cc19fcddf3 bbab550300550000eb550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000e955010000e655fc88e1ddfbbbe6aa019999c71903ddddee eef3bbac55010000e9550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000e8550000e755fc88e1ddf9bbeaaac21900ddfceef3bbad55 0000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 e855010000e955fc88e2ddf7bbeeaabd19fbeef3bbaf55010000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e85502005500 eb55fc88e3ddf5bbf2aab819fbeef3bbb15502005500e8550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000e8550300555500ed55fc 88e4ddf2bbf8aab219fbeef3bbfc19b7550300555500e8550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000e855040055555500ef55 fc88e5ddf0bbfcaaad19fbeef3bbf919bc55040055555500e8550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000fc550000 f155fc88e6ddedbb00aaaa19fceef2bbf519c2550000fc550000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000fb55 0000f355fc88e7ddecbba719fceef3bbf119c7550000fb550000e8550000 b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000fa55 0000f555fc88e8ddecbba419fceef3bbee19cc550000fa550000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000f955 0000f755fc88e9ddecbba119fceef3bbea19d2550000f9550000e8550000 b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000f855 0000f955fb88ebddecbb9f19fbeef3bbe719d7550000f8550000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000f755 010000fc55fb88ebddedbb9c19fbeef3bbe719da55010000f7550000e855 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000 f55502005555fb88ebddeebb9919fbeef3bbe719dc550000f5550000e855 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000 f455010055fc88ebddefbb9619fbeef3bbe819dd550000f4550000e85500 00b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000f3 55fc88ebddf0bb9319fbeef4bbe719df550000f3550000e8550000b75507 00d69dd69d569d000700d6d69d9d9d5656b7550000e8550000f355fd88eb ddf0bb9119fbeef4bbe719e1550000f2550000e8550000b7550700d6d69d 9d9d56000700d69dd69d569d56b7550000e8550000f455fd88ebddf1bb8e 19fceef3bbe719e3550000f1550000e8550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000e8550000f455018888ebddf2bb8b19fcee f3bbe819e4550000f0550000e8550000b7550700d6d69d9d9d56000700d6 9dd69d569d56b7550000e8550000f555028888eeecddf3bb8819fceef4bb 00cce819e6550000ef550000e8550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000e8550000f555038888eeeeeeddf3bb8619fceef7 bbfdcce719e8550000ee550000e8550000b7550700d6d69d9d9d56000700 d69dd69d569d56b7550000e8550000f655018888fceef0ddf4bb8319fcee fabbfacce819e9550000ed550000e8550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000e8550000f655018888fbeef2ddf5bb8019fc eefdbbf9cce619eb550000ec550000e8550000b7550700d6d69d9d9d5600 0700d69dd69d569d56b7550000e8550000f755018888faeef3ddf5bb8019 0019fbeef8cce419ee55010000eb550000e8550000b7550700d69dd69d56 9d000700d6d69d9d9d5656b7550000e8550000f755018888f9eef5ddf4bb 8019051919eeeefffff9cce319ef550000e9550000e8550000b7550700d6 d69d9d9d56000700d69dd69d569d56b7550000e8550000f855018888f7ee f6ddf5bb8019fc19fcfffacce219f1550000e8550000e8550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000e8550000f855018888f6 eef8ddf5bb8019fa19fdfffbcce019f200e7550000e8550000b7550700d6 d69d9d9d56000700d69dd69d569d56b7550000e8550000f955018888f4ee faddf4bb8019f81904ffffccccccdf19f3550000e7550000e8550000b755 0700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000f9550188 88f4eefbddf4bb8019f61902ffccccdd19f4550000e7550000e8550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000fa5501 8888f2eefdddf4bb8019f41901ffccdc19f5550000e7550000e8550000b7 550700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000fa5501 8888f1ee00ddf3bb8019ce19f5550000e7550000e8550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000e8550000fb55018888f0eef3 bb8019cc19f6550000e7550000e8550000b7550700d69dd69d569d000700 d6d69d9d9d5656b7550000e8550000fb55018888f0eef4bb8019ca19f755 0000e7550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56 b7550000e8550000fc55018888f0eef3bb8019ca19f7550000e7550000e8 550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e85500 00fc55018888f0eef4bb8019c819f8550000e7550000e8550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000e85505005555558888f0 eef4bb8019c619f9550000e7550000e8550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000e85505005555558888f0eef4bb8019c619 f9550000e7550000e8550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000e855040055558888f0eef4bb8019c419fa550000e7550000 e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e855 040055888888f0eef5bb8019c219fb550000e7550000e8550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000e8550300558888f0eef4 bb8019c219fb550000e7550000e8550000b7550700d69dd69d569d000700 d6d69d9d9d5656b7550000e8550300888888f0eef5bb8019c019fc550000 e7550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000e85502008888f0eef5bb8019be19fd550000e7550000e8550000b755 0700d69dd69d569d000700d6d69d9d9d5656b7550000e85502008888f0ee f6bb8019bc1902555500e7550000e8550000b7550700d6d69d9d9d560007 00d69dd69d569d56b7550000e855010088f0eef5bb8019bc1902555500e7 550000e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b75500 00e855018888f0eef6bb8019ba19015500e7550000e8550000b7550700d6 d69d9d9d56000700d69dd69d569d56b7550000e8550088f0eef6bb8019b8 190000e7550000e8550000b7550700d69dd69d569d000700d6d69d9d9d56 56b7550000e8550088f0eef6bb8019b8190000e7550000e8550000b75507 00d6d69d9d9d56000700d69dd69d569d56b7550000e8550288fffff3eef6 bb8019b619e7550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000e855fcfff4eef7bb8019b419e8550000e8550000b75507 00d6d69d9d9d56000700d69dd69d569d56b7550000e9550088fafff6eef7 bb8019b419e8550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000e9550088f9fff8eef7bb8019b219e9550000e8550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000e9550088f7fffa eef8bb8019b019ea550000e8550000b7550700d69dd69d569d000700d6d6 9d9d9d5656b7550000e9550088f5fffdeef7bb8019b01901eeeeec550000 e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e955 0088f4ff01eeeef8bb8019ae1901eeeeed550000e8550000b7550700d69d d69d569d000700d6d69d9d9d5656b7550000e9550088f3fff8bb8019ac19 01eeeeee550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d 56b7550000ea550088f2fff8bb8019ac19fdeeef550000e8550000b75507 00d69dd69d569d000700d6d69d9d9d5656b7550000ea550088f2fff9bb80 19aa19fdeef0550000e8550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000ea550088f2fffabb8019a819fdeef1550000e8550000b7 550700d69dd69d569d000700d6d69d9d9d5656b7550000ea550088f2fffa bb8019a819fdee0088f2550000e8550000b7550700d6d69d9d9d56000700 d69dd69d569d56b7550000ea550088f2fffbbb8019a619fdee0088f35500 00e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000eb 55018888f3fffbbb8019a419fdee0088f4550000e8550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000eb550088f2fffbbb8019a419 fdee0088f4550000e8550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000eb550088f2fffcbb8019a219fdee0088f5550000e8550000 b7550700d6d69d9d9d56000700d69dd69d569d56b7550000eb550088f2ff fdbb8019a01903eeee8888f6550000e8550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000eb550088f2fffdbb8019a019fdee0088f6 550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b75500 00eb550088f2ff01bbbb80199e19fdee0088f7550000e8550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000ec55018888f2ff00bb80 199c1902eeee88f7550000e8550000b7550700d6d69d9d9d56000700d69d d69d569d56b7550000ec550088f2ff00bb80199a1902eeee88f8550000e8 550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000ec5500 88f2ff00bb80199a19fdee0088f9550000e8550000b7550700d6d69d9d9d 56000700d69dd69d569d56b7550000ec550088f2ff8019981902eeee88f9 550000e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b75500 00ec550088f3ff8019961902eeee88fa550000e8550000b7550700d6d69d 9d9d56000700d69dd69d569d56b7550000ed55018888f3ff8c190147478c 19fdee0088fb550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000ed55018888f4ff8c19fc478c1902eeee88fb550000e855 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ed550088 f4ff8d19f8478d1902eeee88fc550000e8550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000ed550088f4ff8e19f6478e19fdeefc55 0000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 ec55f5ff8f19f2478f1906eeee8855555500e8550000b7550700d69dd69d 569d000700d6d69d9d9d5656b7550000ec55f6ff8f19f0478f1905eeee88 555500e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b75500 00ec55f6ff9119ec479119fdee02555500e8550000b7550700d69dd69d56 9d000700d6d69d9d9d5656b7550000ec55f7ff9119ea47911904eeee8855 00e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ec 550088f9ff9119e847911903eeee5500e8550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000ec550088f9ff9319e4479319fdee0000 e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ec55 0088faff9319e247931902eeee88e8550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000ec550088fbff9419de47941901dddde85500 00b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ec550088fb ff9519dc47951902dddd88e9550000b7550700d69dd69d569d000700d6d6 9d9d9d5656b7550000ec550088fcff9619d847961902dd8888ea550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000ec550388ffffff 9619d6479619018888ea550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000eb55fdff9719d447971902dd8888eb550000b7550700d6 d69d9d9d56000700d69dd69d569d56b7550000eb5501ffff9819d0479819 018888eb550000b7550700d69dd69d569d000700d6d69d9d9d5656b75500 00eb5500889819ce4798190088eb550000b7550700d6d69d9d9d56000700 d69dd69d569d56b7550000eb5501880b9b19ca479b1902178888ec550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000eb550288ff0b 9d19c8479d190317dd8888ec550000b7550700d6d69d9d9d56000700d69d d69d569d56b7550000eb550388ff0b0b9f19c6479f19041717dd8888ec55 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000eb550388 ff0b0ba119c247a119041717dd8888ec550000b7550700d6d69d9d9d5600 0700d69dd69d569d56b7550000eb550488ff0b0b0ba319c047a319fd1703 dd888888ed550000b7550700d69dd69d569d000700d6d69d9d9d5656b755 0000eb550588ffff0b0b0ba619bc47a619fd17fddd018888ed550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000eb550288fffffc0b a819ba47a819fc17fddd018888ed550000b7550700d69dd69d569d000700 d6d69d9d9d5656b7550000ea550688ff0bbbbb0b0bab19b647ab19fb17fd dd018888ed550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000ea550188fffcbb010b0bad19b447ad19fa17fdddfd88ee550000b755 0700d69dd69d569d000700d6d69d9d9d5656b7550000ea550088fabb010b 0baf19b247af19fa17fbdd018888ee550000b7550700d6d69d9d9d560007 00d69dd69d569d56b7550000ea550088f9bb000bb119ae47b119fa17fbdd 018888ee550000b7550700d69dd69d569d000700d6d69d9d9d5656b75500 00ea55f7bb000bb319ac47b319f917fbdd018888ee550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000eb55f6bb01ff0bb619a847b6 19f817fadd018888ef550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000eb55f7bb03ffff0b0bb819a647b819f817f9dd018888ef55 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ec55f7bb fcff010b0bbb19a247bb19f717f9dd018888ef550000b7550700d69dd69d 569d000700d6d69d9d9d5656b7550000ed55f6bbfcfffd0bbd19a047bd19 f617f9dd018888ef550000b7550700d6d69d9d9d56000700d69dd69d569d 56b7550000ed55f7bbfaff010b0bbe199e47be19f617f8dd018888f05500 00b7550700d69dd69d569d000700d6d69d9d9d5656b7550000ee55f7bbf9 fffd0bc1199a47c119f617f7dd018888f0550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000ef55f6bbf8fffd0bc3199847c319f617 f6dd018888f0550000b7550700d69dd69d569d000700d6d69d9d9d5656b7 550000ef55f7bbf6fffd0bc6199447c619f517f6dd018888f0550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000f055f7bbf5fffc0b c8199247c819f517f4dd018888f1550000b7550700d69dd69d569d000700 d6d69d9d9d5656b7550000f055f7bbf4fffc0bcb198e47cb19f517f3dd01 8888f1550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 f055f8bbf3fffb0bcd198c47cd19f417f3dd018888f1550000b7550700d6 9dd69d569d000700d6d69d9d9d5656b7550000f155f8bbf1fffc0bce198a 47ce19f517f2dd018888f1550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000f155f8bbf1fffb0bd1198647d119f517f1ddfd88f255 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f155f8bb f0fffb0bd3198447d319f417f1ddfd88f2550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f255f8bbeffffa0bd6198047d619f417 f0ddfd88f2550000b7550700d69dd69d569d000700d6d69d9d9d5656b755 0000f255f8bbeefffa0bd8198047014747d819f317f0ddfd88f2550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000f255f8bbeefff9 0bdb198047fa47db19f3170088f0ddfc88f3550000b7550700d69dd69d56 9d000700d6d69d9d9d5656b7550000f355f7bbedfffa0bdc198047f847dc 19f3170088f0ddfc88f3550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000f355f8bbecfff90bde198047f647de19f317018888f0dd fc88f3550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000 f355f8bbecff00aaf90be1198047f247e119f217018888f0ddfc88f35500 00b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f455f7bbed ff0199aaf80be3198047f047e319f217fd88f0ddfc88f3550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000f455f8bbecfffd99f80b e6198047ec47e619f117fd88f0ddfc88f3550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f455f8bbecfffd99f70be8198047ea47 e819f117fd88efddfc88f3550000b7550700d69dd69d569d000700d6d69d 9d9d5656b7550000f555f7bbedfffc99f60beb198047e647eb19f117fc88 efddfc88f3550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000f555f8bbecfffb99f70bec198047e447ec19f117fc88f0ddfc88f255 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f555f8bb ecfffb99f60bee198047e247ee19f117fb88f0ddfc88f2550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000f655f7bbedfff999f60b f1198047de47f119f017fb88f0ddfc88f2550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000f655f8bbecfff999f50bf3198047dc47 f319f017fa88f0ddfc88f2550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000f655f8bbecfff999f40bf6198047d847f619ef17fa88 f0ddfc88f2550000b7550700d69dd69d569d000700d6d69d9d9d5656b755 0000f755f7bbedfff799f40bf8198047d647f819ef17f988f0ddfc88f255 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f755f8bb ecfff799f40bf9198047d447f919ef17f988f0ddfc88f2550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000f855f7bbecfff799f30b fc198047d047fc19ef17f888f0ddfc88f2550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f855f7bbedfff599f30b0119198047ce 47011919ee17f888f0ddfc88f2550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000f855f8bbecfff599f20b8047cc47ee17f788f0dd fc88f2550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 f955f7bbecfff499f30b8047cc47ee17f788f0ddfc88f2550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000f955f7bbecfff499f20b 8047ce47ee17f788efddfc88f2550000b7550700d6d69d9d9d56000700d6 9dd69d569d56b7550000f955f8bbecfff399f20b8047ce47ee17f788efdd fd88f1550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000 f95500aaf9bbecfff299f30b8047ce47ef17f688efddfd88f1550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000f955fdaafbbbecff f299f20b8047d047ef17f688efddfc88f1550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000f955fcaafdbbecfff199f20b8047d047 ef17f688efddfc88f1550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000f955faaa00bbecfff099f20b8047d247ef17f588efddfc88 f1550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f955 f9aa00eeedfff099f20b8047d247ef17f688eeddfc88f1550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000f955f9aafbeef2ffee99 f30b8047d247f017f588eeddfc88f1550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000f955f9aaf7eef6ffee99f20b8047d447ef17 f688edddfc88f1550000b7550700d6d69d9d9d56000700d69dd69d569d56 b7550000f955f9aaf3eefaffee99f20b8047d447f017f588edddfc88f155 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f955f9aa efee00ffed990033f20b8047d647ef17f688eddd049999888888f1550000 b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f955f9aaeeee f688f7990033f20b8047d647f017f588eddd049999888888f1550000b755 0700d69dd69d569d000700d6d69d9d9d5656b7550000f955f9aaeeeeee88 013333f20b8047d647f117f588edddfc99018888f1550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000f955f9aaeeeeee88013333f1 0b8047d847f017f588edddfc990088f0550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000f955f9aaeeeeee88013333f10b8047d847 f117f488edddfb99f0550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000fa55f8aaeeeeee88fd33f10b8047da47f017f588edddfa99 f0550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fa55 f8aaeeeeee88fd33f10b8047da47f117f488edddfa99f0550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000fa55f8aaeeeeee88fd33 f10b8047da47f117f588edddf999f0550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000fa55f8aaeeeeee88fd33f00b8047dc47f117 f488edddfa99ef550000b7550700d6d69d9d9d56000700d69dd69d569d56 b7550000fa55f8aaeeeeee88fc33f10b8047dc47f117f588edddf999ef55 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fa55f8aa eeeeee88fc33f00b8047de47f117f488edddfa99ee550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000fa55f8aaeeeeee88fc33f00b 8047de47f217f388edddfa99ee550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000fa55f8aaeeeeee88fb33f10b8047de47f217f488 edddfa99ed550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000fa55f8aaeeeeee88fb33f00b8047e047f217f388edddfa99ed550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fa55f8aaeeee ee88fb33f00b8047e047f217f488edddf999ed550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000fa55f8aaeeeeee88fb33ef0b8047 e247f217f388edddfa99ec550000b7550700d69dd69d569d000700d6d69d 9d9d5656b7550000fa55f8aaeeeeee88fa33f00b8047e247f217f488eddd f999ec550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 fa55f8aaeeeeee88fa33ef0b8047e447f217f488ecddfa99eb550000b755 0700d69dd69d569d000700d6d69d9d9d5656b7550000fa55f8aaedeeef88 fb330055ef0b8047e447f317f488ebddfa99eb550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000fa55f8aaedeeef88fc33fd55f00b 8047e447f317f588ebddfa99ea550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000fa55f8aaedeeef88fd33fc55ef0b8047e647f317 f488ebddfa99ea550000b7550700d6d69d9d9d56000700d69dd69d569d56 b7550000fa55f8aaedeeef88013333fb55ef0b8047e647f317f588ebddfa 99e9550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fa 55f8aaedeeef880033f955ef0b8047e847f317f588eaddfa99e9550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000fa55f8aaedeef0 88017777f955ef0b8047e847f417f588eaddf999e9550000b7550700d69d d69d569d000700d6d69d9d9d5656b7550000fa55f8aaedeef488fa77f955 ef0b8047e847f417f688e9ddfa99e8550000b7550700d6d69d9d9d560007 00d69dd69d569d56b7550000fa55f8aaedeef888f677f855ef0b8047ea47 f417f688e8ddfa99e8550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000f955f9aaedeefb88f277f955ef0b8047ea47f417f788e8dd fa990000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000f955f9aaedee0088ee77f955ee0b8047ec47f417f788e7ddfa990000 e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f955 f9aaeddded77f855ef0b8047ec47f517f788e7ddfa99015500e8550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000f855faaaedddec 77f955ef0b8047ec47f517f888e7dd01aaaafb99015500e8550000b75507 00d69dd69d569d000700d6d69d9d9d5656b7550000f855f9aaeeddec77f9 55ee0b8047ee47f517f888e7ddfdaafb99015500e8550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000f855f9aaeddded77f955ee0b 8047ee47f517f988e7ddfcaafc9902555500e8550000b7550700d69dd69d 569d000700d6d69d9d9d5656b7550000f755faaaedddec77f955ee0b8047 f047f517f888e8ddfbaafc9902555500e8550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f755f9aaeddded77f955ee0b8047f047 f517f988e7ddfaaa05999955555500e8550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000f755f9aaeddded77f955ee0b8047f047f6 17f988e7ddf9aa05999955555500e8550000b7550700d6d69d9d9d560007 00d69dd69d569d56b7550000f655faaaedddec77fa550066ee0b8047f247 f617f988e7ddf8aa0099fc550000e8550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000f655f9aaeddded77fb55fd66ef0b8047f247 f617fa8800eee8ddf7aa0099fc550000e8550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f655f9aaeddded77fb55fd66ee0b8047 f447f617fb88fdeee9ddf6aafb550000e8550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000f555faaaedddec77fd55fb66ef0b8047 f447f717fc88faeeebddf6aafa550000e8550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f555f9aaeddded77fd55fa66f00b8047 f447f717018888f8eeecddf6aaf9550000e8550000b7550700d69dd69d56 9d000700d6d69d9d9d5656b7550000f555f9aaeddded77015555f966ef0b 8047f647f7170088f5eeeeddf6aaf8550000e8550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000f555f9aaedddec770055f866f00b 8047f647f717f3eef0ddf6aaf7550000e8550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000f455f9aaeddded77f766ef0b8047f847 f717f2eef1ddf5aaf7550000e8550000b7550700d6d69d9d9d56000700d6 9dd69d569d56b7550000f455f9aaeddded77f666f00b8047f847f717f1ee f3ddf5aaf6550000e8550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000f455f9aaedddec77f766f00b8047f847f817efeef5ddf5aa f5550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000f355f9aaedddec77f766f00b8047fa47f717efeef5ddf6aaf4550000 e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f355 f9aaedddeb77f866f00b8047fa47f817edeef7ddf6aaf3550000e8550000 b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f355f9aaeddd eb77f866ef0b8047fc47f717eceef9ddf6aaf2550000e8550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000f255f9aaedddeb77f866 f00b8047fc47f817ebeefaddf6aaf1550000e8550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000f255f9aaedddea77f966f00b8047 fc47f817eaeefcddf6aaf0550000e8550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000f255f9aaeddde977f966f00b8047014747f8 17e9eefdddf6aaef550000e8550000b7550700d6d69d9d9d56000700d69d d69d569d56b7550000f155f9aaeddde977fa66f00b8047014747f817e8ee 00ddf6aaee550000e8550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000f155f9aaeddde977f966f00b8047f817e7ee00bbf7aaed55 0000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 f155f9aaecdde977fa66f00b8047f817e9eefdbbf8aaec550000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f055f9aaeddd e877fb660077f10b8047f917eaeefbbbf9aaeb550000e8550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000f055f9aaecdde877fc66 017777f10b8247f817eceef9bbfaaaea550000e8550000b7550700d69dd6 9d569d000700d6d69d9d9d5656b7550000f055f9aaebdde977fc66017777 f10b8247f917eceef8bbfaaaea550000e8550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000ef55f9aaebdde977fd66fd77f10b8447 f817eeeef6bbfbaae9550000e8550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000ee55faaaebdde877046666777777f10b8447f917 efeef4bbfcaae8550000e8550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000ee55f9aaebdde377f20b8447f917f1eef2bbfdaae755 0000e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000 ed55faaaeadde9770088fb77f20b8647f917f2eeefbb01aa00e7550000e8 550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ec55fa aaeaddeb77fd88fc77f20b8647f917f3eeeebb015500e7550000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000eb55faaaeadd ec77fb88fd77f20b8847f917f4eeeebbfd550000e7550000e8550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000eb55f9aaebdded77 f988017777f20b8847f917f6eeeebbfb550000e7550000e8550000b75507 00d69dd69d569d000700d6d69d9d9d5656b7550000ea55faaaeaddef77f6 880077f30b8847fa17f7eeedbbfa550000e7550000e8550000b7550700d6 d69d9d9d56000700d69dd69d569d56b7550000e955faaaeaddf177f48800 77f30b8a47f917f9eeedbbf700e7550000e8550000b7550700d69dd69d56 9d000700d6d69d9d9d5656b7550000e855faaaeaddf377f288f30b8a47fa 17f9eeeebbf5550000e8550000e8550000b7550700d6d69d9d9d56000700 d69dd69d569d56b7550000e855f9aaeaddf477f288f20b8c47f917fbeeee bbf2550000e9550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000e8550000f9aaebddf577f088f30b8c47fa1700eefcccef bbef55010000eb550000e8550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000e855010055faaaeaddf777ef88f30b8c47fa17fbccf1 bbeb550000ec550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000e85502005555faaaeaddf977ed88f30b8e47f917faccf4 bbe8550000ed550000e8550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000e85502005555f9aaeaddfb77ec88f30b8e47f917faccf5 bbe6550000ee550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000e8550300555555f9aaeaddfc77eb88f30b9047f917f9cc f7bbe3550000ef550000e8550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000e8550000fc55faaaeaddfd77ea88f30b9047f917f9cc f9bbe0550000f0550000e8550000b7550700d69dd69d569d000700d6d69d 9d9d5656b7550000e8550000fb55faaaeadd0077e888f40b9047f917f9cc fbbbdd550000f1550000e8550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000e8550000fb55f9aaeadde888f30b9247f817f9ccfdbb 0017db550000f2550000e8550000b7550700d69dd69d569d000700d6d69d 9d9d5656b7550000e8550000fa55f9aae9dde988f40b9247f817f9cc01bb 17d8550000f3550000e8550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000e8550000f955f9aae9ddea88f30b9447f717faccd45500 00f4550000e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7 550000e8550000f855faaae7ddea880099f60b9447f81701ccccce550000 f5550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000e8550000f855f9aae6ddec88fb99f90b9647f917c955010000f75500 00e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8 550000f8550000f9aae6ddee88f699fd0b9647fd17c3550000f8550000e8 550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e85500 00f95502005555f9aae5ddf088d199e2aafbffdfccbb550000f9550000e8 550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e85500 00fa550000fc55f9aae5ddf188d199e4aaedfff0ccb5550000fa550000e8 550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e85500 00fb550000fb55f9aae3ddf488d099e5aaeafffdaaa9550000fb550000e8 550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e85500 00fc550000f855faaae2ddf688d099e6aaeaff01aaaaa6550000fc550000 e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e855 040055555500f655faaae2ddf888cf99e8aae9ff01aaaaa4550400555555 00e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8 550300555500f355faaae2ddfa88ce99ecaae8ff01aaaaa1550300555500 e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e855 02005500f155faaae2ddfb88ce99efaae6ff01aaaa9f5502005500e85500 00b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e855010000 ee55faaae2dd018888cd99f1aae5ff01aaaa9d55010000e8550000b75507 00d6d69d9d9d56000700d69dd69d569d56b7550000e8550000ec55faaae2 dd0088cd99f4aae4ff01aaaa9a550000e8550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000e955010000eb55f9aae0ddd099f6aae3 ff01aaaa9955010000e9550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000eb550300005500e955f9aadeddd399faaae1ff00aa9755 0300550000eb550000b7550700d69dd69d569d000700d6d69d9d9d5656b7 550000ec55040055555500e855f9aadaddd899fcaae1ff01aaaa96550400 55555500ec550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000ed550000fc550000e655f9aad8dddc9900aadfff00aa94550000fc55 0000ed550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000 ee550000fb550000e555f9aad5dde799f9eedfff00aa93550000fb550000 ee550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ef55 0000fa550000e355f9aad3ddf899eceee1ff01aaaa92550000fa550000ef 550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f05500 00f9550000e255f9aad2dde6eee2ff00aa90550000f9550000f0550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000f1550000f85500 00e055f9aad5dde5eee3ff00aa8f550000f8550000f1550000b7550700d6 9dd69d569d000700d6d69d9d9d5656b7550000f2550000f7550000df55f9 aad6dde5eee5ff00aa8d550000f7550000f2550000b7550700d6d69d9d9d 56000700d69dd69d569d56b7550000f3550000f6550000dd55f9aad8dde5 eee8fffdbb8c550000f6550000f3550000b7550700d69dd69d569d000700 d6d69d9d9d5656b7550000f4550000f5550000dc55f9aadadde4eeebfffc bb8a550000f5550000f4550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000f5550000f4550000da55f9aadcdde4eeeefffcbb875500 00f4550000f5550000b7550700d69dd69d569d000700d6d69d9d9d5656b7 550000f755010000f3550000d955f8aadedde4eef0fffdbb84550000f355 010000f7550000b7550700d6d69d9d9d56000700d69dd69d569d56b75500 00f8550000f155d500f8bbe2dde3eef3fffdbb8000f1550000f8550000b7 550700d69dd69d569d000700d6d69d9d9d5656b7550000f9550000f15500 00d155f8bbe6dde3eef6fffcbb805502555500f1550000f9550000b75507 00d6d69d9d9d56000700d69dd69d569d56b7550000fa550000f1550000cd 55f7bbebdde2eef8fffdbb8055fa550000f1550000fa550000b7550700d6 9dd69d569d000700d6d69d9d9d5656b7550000fb550000f1550000c855f7 bbefdde2eefbfffdbb8055f6550000f1550000fb550000b7550700d6d69d 9d9d56000700d69dd69d569d56b7550000fc550000f1550000c455f6bbf3 dde2ee04ffffbbbbbb8055f2550000f1550000fc550000b7550700d69dd6 9d569d000700d6d69d9d9d5656b755040055555500f1550000bf55f6bbf8 dde1ee01bbbb8055ee550000f155040055555500b7550700d6d69d9d9d56 000700d69dd69d569d56b7550300555500f1550000bb55f5bbfcddf1eef1 bb8055ea550000f1550300555500b7550700d69dd69d569d000700d6d69d 9d9d5656b75502005500f1550000b655dabb8055e6550000f15502005500 b7550700d6d69d9d9d56000700d69dd69d569d56b755010000f1550000b2 55f3bb8055cf550000f155010000b7550700d69dd69d569d000700d6d69d 9d9d5656b75580008000d000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000f255000080558055f0550000f2550000b7550700d69dd69d 569d000700d6d69d9d9d5656b7550000f355000080558055ee550000f355 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f4550000 80558055ec550000f4550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000f455000080558055ec550000f4550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000f555000080558055ea550000f555 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f6550000 80558055e8550000f6550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000f755000080558055e6550000f7550000b7550700d69dd69d 569d000700d6d69d9d9d5656b7550000f855000080558055e4550000f855 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f9550000 80558055e2550000f9550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000fa55000080558055e0550000fa550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000fb55000080558055de550000fb55 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fc550000 80558055dc550000fc550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b75504005555550080558055da55040055555500b7550700d69dd69d 569d000700d6d69d9d9d5656b755030055550080558055d8550300555500 b7550700d6d69d9d9d56000700d69dd69d569d56b7550200550080558055 d65502005500b7550700d69dd69d569d000700d6d69d9d9d5656b7550100 0080558055d455010000b7550700d6d69d9d9d56000700d69dd69d569d56 b75580008000d000b7550700d69dd69d569d000700d6d69d9d9d56568055 80558055be550700d6d69d9d9d56000700d69dd69d569d56805580558055 be550700d69dd69d569d000700d6d69d9d9d5656805580558055be550700 d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d 569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d6 9d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d569d 000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d6 9dd69d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d 5656805580558055be550700d6d69d9d9d56000700d69dd69d569d568055 80558055be550700d69dd69d569d000700d6d69d9d9d5656805580558055 be550700d6d69d9d9d56000700d69dd69d569d56805580558055be550700 d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d 9d56000700d69dd69d569d56805580558055be550700d69dd69d569d0007 00d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd6 9d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d5656 805580558055be550700d6d69d9d9d56000700d69dd69d569d5680558055 8055be550700d69dd69d569d000700d6d69d9d9d5656805580558055be55 0700d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69d d69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56 000700d69dd69d569d56805580558055be550700d69dd69d569d000700d6 d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d56 9d56805580558055be550700d69dd69d569d000700d6d69d9d9d56568055 80558055be550700d6d69d9d9d56000700d69dd69d569d56805580558055 be550700d69dd69d569d000700d6d69d9d9d5656805580558055be550700 d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d 569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d6 9d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d569d 0007009d569d9d9d5656805580558055be550700d6d69d569d56000000fb 56019d56805580558055be550200d69dfc56ff000000fcd6029d56568055 80558055be550000fad6ff000700d6d6d69d569d56805580558055be5502 00d69dfcd6ff000700d6d69d9d9d5656805580558055be550700d6d69d9d 9d56000700d69dd69d569d56805580558055be550700d69dd69d569d0007 00d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd6 9d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d5656 805580558055be550700d6d69d9d9d56000700d69dd69d569d5680558055 8055be550700d69dd69d569d000700d6d69d9d9d5656805580558055be55 0700d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69d d69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56 000700d69dd69d569d56805580558055be550700d69dd69d569d000700d6 d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d56 9d56805580558055be550700d69dd69d569d000700d6d69d9d9d56568055 80558055be550700d6d69d9d9d56000700d69dd69d569d56805580558055 be550700d69dd69d569d000700d6d69d9d9d5656805580558055be550700 d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d 569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656800080008000bd0006d6d69d 9d9d56000600d69dd69d569d80d680d680d6bbd6059dd69d569d007f00d6 d69d9d9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d51d69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69d9d9d56000300d69dd6e59d0156d6809d80 9d809df09d0156d6e49d02569d000200d6d6e59d035656d6d6809d809d80 9df29d035656d6d6e49d0156007f00d69d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d56d6d69d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d567f9d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 567f9d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d56519d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 56d6d69d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d000100d6e25601d6d6805680568056f05601d6d6e356ff0080008000 8000ae00 grestore showpage %%Trailer geomview-1.9.5/doc/figs/ap.png0000644000175000017500000001203212310162310013057 00000000000000‰PNG  IHDRF}ŠDÜ­PLTEÖÖÖßßßdddââ⯯¯VVVÝŽÚ½IDATxœíÍnÜ8Çé\sÝ>s·ŸÉb`±à _‰à9súõ·Éª"‹Ÿ"ÕÕ™ér·åVë§??TU¤(¥~{8Eöq:ÜR„7õðÙùôt´¥?Ô÷wi§÷£-Aø°:Æ[â_°§øw«ãÇMÛ7Ôñç-ÛêøvtßÒ°ÒñÇ!]LŸ=°Ž§oÁäëcì]"xŸêj’ýUAø:ЇôÉ_NïÔB/ŒÏþµšhMêxAxÃWï禎o33ñ•ZÐQ½=NÁC+ë¨t´Œê"æÛã¥Z¼Ñ÷e#þ¸ˆ¬è{ [§ãæÂòh™ÞÅ—zt?ìvúÚ²GGîÖ½ŽoˆçTt’º]Ô;ý¸l§ïMQG*•šŽt¨7¯£B%-‡-ZKªœjøqÕVe:R©œ+:2ã#éh;(fqœïT²ôõ¨íZêHŒ5¹¬ÏOK5Ò3*Þà·lùNG[ZïvÍŒ¤£²˜ ›±l4ôcë&ƒ:¾©¦ŽÞÎO‚1îzœžøÃª¸a׳¶DÐ ë\ËV^goÒq­ŽWë8ÓRù’²XçYª#CÞ²Žáµ×ñIij¿Eÿ%‘NÇÇŸï?>ÎÁäëyöSþ"ž~þP¿Ï7_œ/e}z:?ß®=œNÿ¾0~| R·—‡o–ñéýülnÕ¾r»þxþ>pj;4Ïýãy„ñe*ã‹Ðñµûó¾îÁX=üW¡cõMù^0¥Öb¼ëØow·±¿—ŽZÑÜ‹ËõŠ{…WÎþÜŽñr¯šŽö}€GRö#Á˜ÕÒ}×}EŒ´ ’ãV­ß¬TJt´;YAÔ#–’Œš6¸Ï‹»¤£ÁVttå©E›T–jYƒQ»“ImLŽÛÃè‘×GQÖžQk³Ì¨Ê:šXÇšµs£6£±>ñö#F,€µŒq›Éë#¨´ïÁÞܵ·ßr›Áþp#1vµ(õ=­ëLÍ£óæ‘Q+ Ü÷àuÆž“¢úÝÙ÷”ŽÖ¼Î,3~Œ={Ö­ßï‰}ŠeÆ`à_mϸ•ÿ˜øÃÖ¯cŸÝýðìhwì—ÐñåkÍ„Žõ7e¶cýhBÇ~Ä=ë&tœzÜ:Rµ»ŽÛØ/©#¹ßE«v¼‹¥:*t´+ŒÎ»†Yll©Ž@:U9›j‰Žˆæ"J0¤Œ6¬̯èIÀ‰ŽЏ0ÄO”ûV˜_™Ç˜ëˆA& |nEs|;ƒ± cƒ‘"QÀ@½ð÷]Çtœ‰Œy»®3êˆ`cÞ?†6I£þ‘ò+>ý³;cá:úž´Uhj3˜Ž˜ÆxäõZE"Ô2V‡ú=œú"«3¨#Ä\PyÛ¡:‚±ÙWå€ÍªiºÎ&zª£u±4ˆ/ŸÂLôÃ5pßuÊ·¤£1”¾¦!‹*ã±ñ ²ÁíêbÔæVu¤þQ´¾Î&ŒÇ_gl6_Qß㮳-+s€^g£·êc…q‹Qþk÷åâþœÌ¨Ó!ÅXÇâ>³3›¥ãç@r3±×>ñÍ×°~öO Lgí½ttŽàX{Äøj8„Ó*j3kŠŒ‰ìuè\=c2³#̙؟±¬c¸Hmɸ²¦|)ëèúPeF›ê ó:x.ŠRbÄpsÆ‚Ž>Pb 1­ý3'hò@‹QèùðUG}nêX/kvMÜÌ̇ÕdŒCa<Áx(¼Z¥#Ï>á²vIS7ßd¡¬sFHêt•qTGåu$)HG“ÏŸ+1b6b'Eq—«æ.é b¼¦c³]CÄè}´ç"#VgðŒÁwÔbÚȲŽÍþqu›á²ÖNoÏâQÙÆ’ŽÞùdÆdö‰¬8¥£ïá²VQY3#öu\Ù;t$óŒùì“Ñ ®(kmp¾XÂèŠG è˜0šdÓŒ\`☠KÊŒ¹ŽÜ¨‚OŒ‡˜M¸Í(ÚŒHvòÜ4®ì ã$ÿÑ2b¿£Á–ùd'ÖGû¬ì¡o/븣4(¾-·LDzwt<£Ð±âãmÄuMÝÞq¦ã~ñõçËëî‰ûWZ÷‹¯¯cœÕ®ÿ°ÍÚÚÐÌ\¨ÓUtÜ•/™l–Q)¢Ö·¢£VBÇ1Ưo;ž‘ÃÏnôlLG<üáÿ4&™‰©¨R 0:OÎ}#nÓQ‹8Ã3ÒO‰#¢×FÄB­ä6ŒÖG-âŒÁ•ETÖktôqF‘1½»§T›+ÊÚ‚Fe½FGgÓ»;âA š_鱓Œºƒ±¢£fG4/ë0ã_‘c%ƒ’EW´™šŽJ•µRÌFÄâ–Žå²w&Q}´°VÇr}¤ˆ:gt,5ÿ…5¤ëÑ‘ãŒ2#4Ûõq-c¥ܾ͉ý²FGŽ3£÷uÁÈ»;ÖÁ®¾gËü£T‚_#[¢X nÆ’Ž)c E¾¯qëN`Ìó…8«+eÃŽÞ§0ɦìóë·îÆ,·—ßËY¨Ï³ãë”1“­Æ85¾ÎóîBƒíÍ^ºuZþóãkHr)˜”}WZ³çÆ×à3e”¤Ù” 'è´‡˜_[F02ÿh kºÄ8+¾þ“ºý4œÏÒ±üñ¶k#óº›qb»¶G—9{ðe-¯÷Ɖ:¢/òšÛ ÷=înôã¬øz«ü£Ý8_—ÆâÑ7Ë?ŽÇ×0À¸Qþ‘Ž Ýñõc'T‰±ÏøŽ¶_Ç×ÚøÜU 'DÚÚˆ¯µñ76„ Û¥ˆ¡>~½àD6u쉯Aεã›ì‹þnuüzɉlêXcÔÑê #þ±\Ö9#àå¥éD®Ò1^=AÇŒ|çÅWõ—œÈV»®2B‹‘‚ïb}DÆtüzɉlõ £•2”ØÐn3À‘V4~½äDVãB¾öŒI|1ò Xqñ–VYÇã×fÁ‰Ü2¾^0QÖÞäOh:h›Å׌\s¹ˆ€Ûõ°Žkâë~Æ|üºíDÞÄøõ‚y¿Þñ>~-×í87¾¾‚qZ»^·ãÜv½nÇ»Žñ‡üót Žráz} c¦#„¥ ˜q“\ÊŒ™ŽÎ{ÒÆKvpªÉ£2îJŒä¤*”}gÆ‚Žî˜~ên“Q‡ÄËŽŒU©¼k¹”ˆ‘×Þ¤ö¶5cMÇ£˜­9–e÷™ì­Guä\ à/i ¸H¡®Œ²ïÕ®keí§Ìi/EéÖŒµþ±ÖfÄôh_™Ñ½¿ØÌ7ׯ3•¾jŒÀ5q{Æ‚ŽÞJŒq›Áþqï6SÒ1cLs)Ô÷øëÌÎ}O¦cšl­äRÄ©tØLÿ ¯zl¦ÿèE?ä—ðÿT¢Î%›é‡¯D|NuÜ1OQþè‹uÜ1—ò}­Œ÷ÿ—\'îí®ã6ö÷Ñq»ö½Æút¤ŽÊø‘*ãW¼n¯±NãûØi 8f¯cìÒ1»×Þ„àu㨎8<(鿀…°¯bÕ1<ÔÁ„à̯µ¸ãx}ÔÆ—ÂŒîÊû¬cÕQãJwQ)€í9®#ÞE$©gÅqïGu„2£ÆiÆq•áI˜-Ý¿ÍtéˆÎ¦áø:bôK}[KOz˜p$õ{ ør_õÓ$F¯Q<3ÄÆ6ËDÆ&bàý/=ËÍòÿ¿º£îŸthsdõ>ašŽ¯îhfã:º‰o²ïrwʹL«»Ñ4cœ¯£|jøãè¨ÂýBÕGÉè’þìK…´ºd”:RVfoFñ¤/0áAeĘ5õXGdübÄT­ô²j«RM‡lKʨ!ÑÑDŒÙ¾‰Žÿ±ÎÃs„â/Í9cñ;Ó²6IYgŒ‘ŽËŒÎJÆZ›7³²Ðfª:¢{ ÌHî\gº§‡ó“[è“ÁPï{œßdýÒBßSÓÏ*0z71¬³ëÇd§‡ó“[Œ(¡²àkÖG`¿UÉ•Ìx Ë` ñ¯ÍéáÂÖ0Vë£RžÑ~œæÐªÁX.…OÑËXÓQƒ‰UIÇÞéáWY£>Ò8%3K“1ŒunËX×QGŒ¾Í€áuv¡{zø•Œ‘Ž_Ø[¦B‡þ‘î»&Ñ”fÆ®éáW2F:> F²Š(û¥É2«ù= ŒÙ:»K¶G<³ðŒÀlÝ%+Æ3áFŸÆc⟠7¸Uí¨xàM;*žAR`d¿P¥2âñÆžñ°xF0Ê5.Tx¼±g<,ž‘Œ&^+D8ê&Õñšb€ã™ £7öŒRÇ´‡ ›¿TäoCøÙߑ♠£ò:²%:ʳ5†½G?:äjFjÒ¡] Fð¡¬`Œt,2‚1Æ~KÛLÜ?ú…*±Íðã=cUG? ÀM~tu àj7%q—nKÊâÃãñB• óÄ`¢¾§¦cXëÆžP´ž¢c ³ÏÚ²âÓ[ÍúÈ® &ÀÁˆZÃŒìáö»k«õ‘ℤ’@F¿:ñUgfÃ;;“ºŽÏ8£-{Z©£1» Ä™f}ôe IïPdk惌u¹Íðí¯¥6ÃÁÍR›¹Ž1Ò1é!¨¬yæ2=:„º»¸7Ë}ÏuŒ‘ŽY11l©ÚRœ“ü-‘i@Çœ1:¨Ÿ¥²ŽQñn¾B^ŒŠ—‚"ÆÆ¥ñxpÃ×¢€…´;%Ɉ99(Žzèˆ3U"F1G…1Aµ4.›3bYëòŽÆ¤ŒœÆ Œ@eÝNÂhŸ½ö:º6c?¸Ðfê#Ö™4ÕLkhÄb€Ñgêsrõ¾§_Gª3y:Ü 3ÙP}´uFëGtÔšžg¤úã6‡¤îA:º<®gŒÒ¸ÑÎXáómÆØ{½W‘¶Ù}Ã;2®¿o8¹ÿºÍ8<ö#mŽŽ×ÙzƯd\»cº®ÂÍ2NÒQ»Iþ.ÖrKQAgË›©#_¦ðú\hªŒ³t¼†q®ŽìÚ‰ K¦['ŒsuŒ“Ü:ã¿| âÄ(šV¹g:6.I»26îêJul-»²#-é4-)Õq?»’qJ>\0úõ¤ãéQMÆi:Rˆ%åô¨&c_>üÊœ½cô{fíºn׿ì?¯bœuYé"ϼÎt>nñyq7Ë8IGpÏU´—w+6 ¦g•ŠÔBÆ8IGÀLг4Çgéè¸ Œ*C;RGz)1BÈÙ+\dÐýÝeC–t¬åR6gä/dt÷8]^¸ià :ÖsöŠÏ 3ñ¨Bl1‚gôßÿ~öëzµÇ¨Æ#%Fd´§¿Xwf´)ý#è+uä ªUÄIËüŠ1†#€ ŒÅ²WàÇ$Uª¨ÂŠ/cŒ ] qŒüöb›Wðñ±ŒGx¤y´AäËŒ®¨žâB²ò=òEFºáÄéè—ùÙ´ê·Aý=òP¨ #š›2Ž+TÍ£ñ‡í~Žï*µd, T…6“Œ1ÌÉ?jš1.ó*ã–nð·À†1†9ùG¡/tÁïô™ä»gLê8Ê(F'³ÜtÞÎ2¦£ÿÌî˜IŒNfŒµŠ_dœ–4qnÏ~>¶¯èNÍ„qZþ‘:~º()cÄõR'wj&ŒuO‰âš)ÓSÑ`ãdµ‘ŒVÁpÍÔ|–I&}LÖèòDŒZ^¨û¾LÅŒSò¸Ô®£®3BÎ8%+óÕ-]¸•Ü©3ÎËãb•£[Hm?Ã}ýŽîÔ„„qZ7Dk÷å“ó¸Þ ú[㬚3:gû’1͹4çé¨UðÍ\w)s.MÆB|]Xg3µ(kë(²Ùd,äq ûlÆè}3ÍùŒâñbÆ‚Žû0ꘑ“m=ŒVÇß>¢|Ï®Œal¸¿ÍX;ÿÜ_ÇtüÚ@wßóûùRO¿/êè¼–EÓ4ðíÚÆJ:üž2zK‰ê„¬ãé߯åúè7±*|¾fRµã“eü¶\3F]`¬ÖýÏÖøõ"co»ÖaÝftã¨îG€u,]l“M+^gêŒñ¸‚7À‰%Ę,¶¹cïu&tÂx-Ã,¢ô´ˆLá7/+ÇŒáå©ögìÏã&ã ~yª[ÒQ›„ˆQ{FÍ™‘ãtŒÚŒm†•Ñéb›[0Ž+ˆ¾ÇàÒš¸¸&µ#î‘0Õ¸Yß³ç¸Âíš ú>~¿þ±lkÆd7ûÏšg¿cŽô*ÆIyÜ«ç¬OñÙ8ý¶MËãnwÒŽ¶Ù}H;Úz¹ç@®/½ÍëXyàç-˜×q`®Èlcÿ:ݰ‘ŽßnÚPGiñ¯GØÇSü»Õ1~ÃiJÕ§ãOiçÓÏ£-E¸èxŽít>Ü„G÷-=öî!É/ÊóüIEND®B`‚geomview-1.9.5/doc/figs/command.png0000644000175000017500000000227512310162310014105 00000000000000‰PNG  IHDRÂÞ\U"PLTEÖÖÖßßßddd¯¯¯VVVE°ÁGcIDATxœíÝŠò0ES¨s=ò=@e^@™û %×ñ^Aúþð%M’ØÖQªé>žUpšvìY'§þÌŒB'‘J‚(D’yÔ2Ã& pÉ¡tQ²Ä& ŒCÿˆ?Ä# `*¬Ã+]2ë°ˆÝÏ_FÒ:áìÉ73îPÌ;´ŠL¥Š"íoíØ„OŽ2~Ï9´ M¥ê0iÛŒ ³ÙÁ:ø‹ÃîA@ï°™¼Ž)¼ÍfÖ:Ëåk ;Ÿ)‡©=Xôû„E:lú^Ò6uaJö½A¦i¦¶ì¦¦ö`‘zMÛͤnªx-íÔ:lN9ìª4ušbô³Ùq›P¬&¡u(lã›ì¥]¡—¢ßV×h¬Ã¶µ?p=íÅÂÍ&Zu«ºXÏŸ‡éµ<«zÀÝGáꔳŸd׳øªëneÒ#Qµ®R™Õ9U)¿uB¥bOäUl“ƒI˜•dî»^ªòŸEŽûîzXÓMøQ÷ôøñîbw…ÅÙþøw±KjqŽ¡Ãcì¢Zšcèð{F ³»uø»¬–%¿uø{NË’³CxØ!>ìvˆ;ćâÃña‡ø°C|Ø!>ìvˆ;ćâÃña‡ø°C|Ø!>ìvˆ;ćâÃña‡ø°C|Ø!>ìvˆ;ćâÃña‡ø°C|Ø!>ìvˆ;ćâÃña‡ø°C|Ø!>ìvˆ;ćâÃña‡ø°C|Ø!>#©ýWö[‡±g´47cWÕâ„cÿ õ8Œ]S/ pè F¨L;Ü#T¦îƒÑÊ™«R×áðQ3Ç}0Z9S ‡änÇVæ¦K¸Ñ@$ÿ¤£ý¨C©OXU|ÂСÎt¢í°ÏDÕaU51ê©n*ûÕ2æpÓêpÓ†óú+¡3 í°ÒS6$¹uhn*³9<ÕK7¨ëPažü„s+ LÂÖ¡¾Ñ ÍpßaÓv`ÂöðýuØ(Ü %|t œuH¿—Þð‡'£ÓX98´À=~äùa¥„®Ã­óZj0Z9ÞdB‡î¹`´ròý8CïçŒV΄ÂÐ!E|‡ù4‡µŒ ùÏVß…c—Ôâä¡ÃØZœœÂÃñù ‡é•´ÃëY|Õ5a‡ªÖU*3Â¥üÖ I¯C“{)*|=ćâÃña‡ø°C|Ø!>èpê7Þq RûÛ¼<Rä³Þ?œz+Áa왼ŠÞ!U…ƒCA•ÎáA’¥u˜¦qXº¨¬Ä&`ºÔòÓyaíPùHN@;¬}d Nໟ¿žÿp 0; aIEND®B`‚geomview-1.9.5/doc/figs/light.png0000644000175000017500000000363312310162310013575 00000000000000‰PNG  IHDR-¬ÜVçPLTEÖÖÖ•••ßßßddd¯¯¯VVV@`>IDATxœíMo¤8†½‡ö\—C+÷Ý?°ÚD96­œ;ÄÕÒŽ8§qùû£°iÌF]=h€~üRe›¦ 9¨ýÖ96t-ìéæ.Ÿg®³cSwna7w±Ÿ¹>zÛ†®o`Ãíì.s½Ü5îâ^vs¿¸^ÃÑLéõu0ëÏB¯kë˜àY'õúlPûý¬ôê>ŒÙó›Z•tÕzY×àpîw2§$;N|½¬­w‹_vIÃ'¤sõÃgL¯IÍ9õýõ´ —.‰Û¬—(åšÒËã"Õ¹|½$×)C/k®>—.‰›Ñë´¬ižÈ‰ôä:Oät%uÏç}z ®ùC8Û‰#VÖL•†éEôÕàèEzÀ¹ ®º%É“€ê%OÑU×B¸½F"üu¹ ¤«¬.¦—â:)½€kÞÈpÕŽB/Á…ê¥Îã jp[e.(iN`½—ÔËv{[³Š&J"Ëz¹µ€z&z¡Vå0qgüRV?žÆJZïÔF÷Æ ¤uz)¯ÜÄ ôÚÔœ’n:$dú×væëÕ«ˆp0½´½ÎVãíi·f¢]ÒÍšz¾úÏa2fÏokvI_Ö¼ÐëÇ4®ý8M¼Ÿé<=Êþ:wç†Ö$®ýì>:¸§çñ@ö맺‡ƒq©øõÐË6̽Zë…`½4×+¾úÒ\¯øêËC¯¸}½Ø—_?:êYÉÅx]TÒz™)ç<…sÉ\.¯~œ‹Ž.±>ùz -’\à÷LLÂÕ¢õ Ï#3ûÁêl½rüktŽç‚úß“8×ÜâHë>aœ!ÁÅ.J£\Lq±8…ƒâzüøu×S^œ ò<ƒ¡õ ýž†\Ë÷GÇp½\¸‰Ê¿gà< ­_à_P#S§T>ÁèB|Ð\͵`4²àÄ{ˆ²NI½z®2¿~WÄvÊ¿¼ú gMÜ·ÿ_ù×^–§×%ÏÞöà²õzËëÓØ…ËÖëí¨zåa5Ð+ëX5¹ºûzíÍõ‚razQ4·©É…®—ÃE÷çZÐ Yh¢×|+cpŸ¥Ð¨­æÜßZèeš.ШQ-º?Wà_2—„F›EîÊåù!6o4ârõbÔÓkLqE‚I²(‡Ëó/ÿ¡‰nÈr‘–q•ë%ˆTHáç±—«WÎH*¦—¸tyk1¼VÖs¹zUà]9¬,ˆùzÍW#/šj–ËeBŠèb*kªûzY\À6frÍ'Ow0ˆ¸B ¹|½ˆÃ•Ö ³R®P/ž€ñóÂJ¸2z‚–¹ÿÒÝÇEzöEôšyÔTrK¹B½ŽÁU¨W^ÏÁJ{/×k®×¨^Âçs¹þXoºÝCÆ{'8и1׋äú'Ê»?F`ªr½ ß–ÿŹ‚|‚ŸÇp…zã"V½rbK ½ŽÃå·)ßV'u±zY\r¢Ñk<W¨—½çv½¬Ñ{¥Ü1ô²G}£ép+½l®XkëzEäªÀ%{íåwèmœ–s¹ÙV®^zô>‹+onÅã½½‡áüe®Ì¡Áõ\±ûcÌ«®,’O$ŸNh5>”z:¡íønmÇÓpk2>´6ÿÚŒ«0ÿÚŒ«0ÿÚŒ«0ÿÚŒ+‘G/7Ïiæ÷Ëù×Qõ:’¹ùW+®Tþ•àJf,w¤9c<Þ[ùW:Þ'ŠxÇ7@3·—ˆ^¢°P#œkùt¼£üz{Eþr+ä_›qæ_ûé•´Vzƒë¡×:®ï®—L×ܺÅeº‡¨æbêÒwöªª‘#¡(—àö¸Ô8¥Ó§UU/:z-Ÿ‹Æ¹ìÞ?‡«Ž^âÀÆÜáA(—üî‚ÍO„ˆ½äC>¶^§¯B½Dr«ԣȆ‹‰‡¨¾Ëi.³—xØÁÖëÇ4UЋ©g:ôßã’™Çeí†H½ôû6å¢&Ûô¹àÑA÷Àè”ÔK¿`S.¨ÃôÕ“yð'©—õ~€Âëñ½Ôר®ŠñËö` ù=¿¯ïMœˆr…q‚È\]~ŠZqâ»ßks=ôZÇõÐk—«WV;}½òFUv×+óq£ÝõÊRëÙyyöÅ$iïøoØw‡B½î0ôàŠ ÝÿÒY ×q¬õ÷E1{èµÎz­3[¯å+~g3z%"ÑÎfôZ~¨pwSz}´~SºoR¯?¨°l —óvÈáÜ·0ïw ÂßW˜šüîCïýî×Ë{ke·ý‹1#v{r—g.ï­•Ýö/ÆŒØíÉ]nPû²^|Ê„yòIEND®B`‚geomview-1.9.5/doc/figs/mat.png0000644000175000017500000001160412310162310013244 00000000000000‰PNG  IHDR²î¤Ê³KIDATxœíkpUÕÇ£öõ¡ÓöƒÓRýâLgj§éŒ3õC;ZÔÖÚbÕ€EkkÅbA@ä!â#jEЋ”!"P3¼AŒÑ€ ¯’È‹NBH ]7Çžnöëì}Þ÷žõ›5Ì9g¯½ö:{ÿÏ>»£Y÷þãS­`MnÞv¸O–å¡ ú.õo+«ý`WåòÂR4ÖVo;TVuª£«'úúàÈ¢¿@ÛΞëA,û¨Mnÿù¸Ì”\ENºÚ“ÉÂôèë»ôé•ë’eKÖïT±›?‡3üüp]Þæ}ê–e‡V´t4S«ûÙ{¯poIE]{g7+Ž,RmíçA¹ëv¨[剿ãMgs7íÕ2kø'L˜°mÛ¶šššÞÞ^RºÓÑR³ÅÀÀ¢5Ÿiu¸çöÖÆbsôw8ΑÅβê«¶‘V°óÐé¶Îsç/”VÖoÚ~€*Û²·NlþÚݺ_PP°oß¾õë×oß¾½¸¸xß EEE¦,ÄԲ˗/‹Ž‹Š<·…û¡÷æ,ß¿p­Õ¥Ÿ|^vªµ²çbŸÙÿ'šÚ èÙùùþyšFAñ¡?Nšû¥,^Yþ±eóò“ŇAJ­í]½}ý.ö5騡þÈ©2[x1Qyhו…Ç)JÑzAe9¹µ¸ ÅT¢nb}¨îãn&üœ…p@Y Ì_°ÃleuPHT@Y P”Âep@Y P”Âep@Y P”ÂAOÜ).×°‹¸Š­„²®.óp5[x+ Q(”EðhË‚'l‡M¾PV¾ŠýW²žÊÃã1'YYOv¡\Š­pV‰ƒ²0…í²GVÜéıøteŽŸ-ÜÜD¸¥O—­ , $ Ñ<Ïö8åÃ=Be º}H.wªT”›(IÅ8Áàãú;M¨¬ð»E˜„¬*+”E˜PãÔˆ£,Bep@Y ,Y„òÀk¡'‹€Ÿzb9‰tœ-ÌÓ!ÍÈ“t‡'"Ý‹²ðÉ}VÒc*³E(w”…7ø' #Œ°( o@Y$N1-@Y$N1-@Y$N1-HºøÏNdˆ,\¾Œ!,ä9ü"’º²µ÷2r‚~I-Y ~ƒ²@8 ,q”…³'ê,¹‹Ô¢BtžÞ¨¬”dä0pWw²Šùd†zÆ¡,¨Õ³¢u¼ò%»ä†H ¢Š»¢mQ»r‡ø $ î0S”n؃$BaêD“ä¦'†Êpøl¡+ êªÕ ÎÀ .ÆMC”•mä & YpëÚ—GP¼ÊÝÏ1Ä^’!‘”º¼‰È›cg ®·Çc~·Ç¿·y•Ê"LBÖ•Ê"L1üʉ؂²@8 ,‰tü«2Äop¶@8¤¥,z7ŠIñ¢=îwÂn.NdáGŽñ<™àAY(%A%$/õ<™àÑ•…uÄ?} ,ÂÇ™,KÉ@Y„ÞD”’ BY¼ßŠKÉ@Y„‚DaYÈßß$¥ž'<" 7ï“r‚~I]Y„Ú{ 9A¿ˆ¤–,¿IcYPRt—ì"¢3SYi,ñÅEÒ1AOÖrþà®Ãfýå»d´x.¶ŽªÏÜ›ˆÖ'üëŒ4Bã‘Sò—†Ž,äÓÎQÀÕ³…›ÙÂTFˆhÈ«ق»+òGB¿[„Œä3ÀPY¡,Â$‘¾Ÿ³ÿ@Y P‡D:þùPÀO=ñ€G_ˆYØFôäç™øL÷Ö]Ê"!ýy0"=<¶²`¿ùú}ñE¢"I]•È™Š–,‚OÉ@Y„ÊBXea"—E` ,Â'.²Pz'ãáÏ9FXÜDkea(Ì}‘¼a"Ž!À×ñV$©% Äoéøññœ-i, oç7­åœ¶\é¾8:OoTVÚk9]â ˆ¨JüUA¸R !³Òy„’ˆírC²ö_e0¹Ò˜PâÌnK*JÎ7ãQ½‰pw%Ã#?.)å"¬ØºUª›-7Nf£ñÈ)ï8ÉõÄ•YÑ6K¶ Wl‘(·]‰Œp¶½‰H®~ òÙ ÜÙ‚j”­"—¯bœÌÆÉ#§ãé—+ ­~çÖUl]tlp•8™“TvR¥ŽÈ$:³…mˆP’•¤]Å8Þâæ%o¡²Òþœ«ëÆoéû9 ñ”ÂepHKYüÔÈpô… ,Â'™îËpÌÓð# ‰üÅ‘\Ü—a__’èÈBT”ˆ÷ žú$Ãn’²]Yœ’²g²À›Êg‹+AYPF¬ž-´ÞèHú—’ÿ›™°È"’Z²@üÆ’…¯“-(‹h³ÂepÈLY¨Üq5—„Àrm!³r% ÅñFY¤ÜD¸Ÿi üƒœtÆYPEa}ÐEã\YW"ò1ijY\É‚»Íúˆþ¬‰,ea;´¢ûT)JÄñoCžCe…ß-Â$d-PY¡,Â$‘‘Ÿ³— ,( „C"Xø©'>àè AY„O2ÝWg™§á¾I‰ü ‹DºK|½ºï„# QQ"ë¼YPœ&©æQd‘üχ¨]QQáãL\p¶Èð&Âi’jeAqmÎXYh½¿‘¸l:šdÈ ªäq9A¿ˆ¤–,¿AY P”Â!:nTVª²P|Yà~}Ë ÷ñ ×GèÉâòå,ÊXOùpª¬ Ö=ÿˆT2Aâ£,DS‚T‘û·\ÅwiÅPTJúÊA­HÈÂ<¢2$¢Rö;&Û•ZFÝà­,¨íØÉ‚Wùgfª UÝÖÇQ»K"s§.yLÉy‰"pRÿ²çEµiY°»ê³ë¬+ 6Õ­rpp….‰)’…z­Zi ÉAª”Ý–×]ñ\7²O¹W¶mÜd$W?7 bZ[kY("*ÖS2`ÜdD×+Û–Ö£, CÐ}Ü®q€hÕå"©«“-¸jÉB$ÊÉ‚ºÈD$ºª¸×¨$ TdQ[êA¸ìà±ç%ê.6 ÒA" nQ„dO¤g ]e8¨‚pM9!Ë" ‰$áËÂÜÕJZTÅA(íúÚDDˆ„,ÌTTz\ä`0OXˆ"$ Ë3KA:¢ƒ”¿(×S./ƒyÄQÙM"- v×v¨Èñ¸)Æ´-rãe2JŠždì®$ÝVŽ " ò¸â€‰v‹ë¢,B–…Uds·ŠOIª®mÌ´ º²@BepY¶ŠxÊá¾,²ì~)&•’³?";ëmnu+sÝ€Îj)!YXHNU" •êºa)—­ˆZt# Ÿˆœ,¨‹Þ¸²×Ôcùs+rKÙ¦U²âÖçf+ÉA1¾m-]"' Ñ@J–ÜJä­¸‘…$ù.uÓ °<¾n-E"$ Û~drQi‰3×M>ŠòÈ¢Ó±ÍeA£% Å9YTÑAo¢,tqû&"ï Ûkšt“߸·É„lý+¿ïP3 ÷ 7IÚrõsSR'B²HGÒ:y ‘…n纼<$"i°°ó“áˉ ( „Êá²,’H´AY B}‚–7ø²H ±‡–ÅÌ…-{.w3Z¬Œ}ZPÎXœ1R/âk§0Ü8ë¸æï¯x¿}¤HñÓe²|;#Y¢¿ïIÈ]è_§@ï§ýõå3Ü>O”ç@·Óy}†›oåÏ7_ï§·Ýõþy·…—ážps}†›¿…—ïÇ–ñò÷¡õvV^¾îÎuÒ^þÚ%½©Ô¿ÏÆËÓO'ÿó†zË]÷Õzyvñéýü¶‹‚ëú)Ñ/ç¥wôNé¥Ý÷)%ÒåÛû/ÈË›ù<ò@ÞÈV”öºB“—òÃ뜗D~oF{©)æ¼TGm‚ø–õò¡ì¥à{}˜~Nφü^Y˼4”ækmJs]©œ—ÄÆ)ãåy^eôÙ‚Q{ùJ䕲^jŽWû7™ÈCä_S^÷UÇÖœ—†òÁx©)µ=—š2륹ãòo )EZR^÷•”½4˜ÆË­#ޤìeø7mŸ-L/·Ö¼gc×^v)¸î§Mtîå›Isí¥•óòìU¿ìTíö¯ûé}V^>ü~ûõ~sò?o)ÿº¿½ÏÊË¿n·ƒ×Ço7Ñ2x¾]¬ÿœO'AùþþWÿ=ý<É8~;4¥‰ã÷R§—ÃËn /ñ4¼ÄÓðOÃK<Ý©—SaŽR¶/T¢ÄK*¾™üï8J¼¤âÇá(a/áŒPNÉžlN —òŽùu %^N±GQÒÝ÷‚—wG2_ù8NõÆ”÷’òQf½q‡îHæ+ç%£2%Ú‘Ì׿ã‡ÔðOÃK<ݧ—×cISF^~ìê9ãåËÖw³¨‹ú/ñòe?$@†rxÙ¯á%ž†—x*y©š‰¨8ØrD£ý4=„Ág¶RB^6SÒ<å$JÈKšròŸ™jyЩ­”—¢ePÔГ­E„RÕt$>1]o#¢íC¡[•ܺ‰È&§Õ¼T”ª¥ˆLX‚Ò~™ýÜ¡ëÅnÛí§«=—ò‰§¶¥Hká¹j9d–Aµ'¹¶%÷ÛîæÚ‚—s”L¶ *½EŒsÄû-å/Ià¥Ú"Üo§ÛÂKy‰¹SÈ¥·ßçµÛ%E¢¼¤²ý…û±GSŠ/·Ÿ‡±ÇÛ61ôrJr÷S"EÉU÷Å´ŸN)3GHx¼3TÓº^:™ÇÊ]Œ&{B!÷ÁT”‰t»ºL#yø)C‰Þ_á%Ó™±—vŸ`JÖ•åK< /ñtß^>ï=>0”¦Œ½Ü+ìå15Ú‚ñ4¼ÄÓðOÃK< /ñ4¼ÄÓðOwê%Uj  í‹Å!kŒŽÆ±`‘mR©¹¶ksÅ46+¸JSÃй"hlã¦úmn„3Ñ8Hdûÿ¥o8wd#%ॠ¤®•R·ùëÖË¢·š²âÈFÊŒ—¶]7h«vmnJ"š5kŽl¤ÌxÉÍ(Q’¹>&ãåü‘”/yâ%çåJC9d#%Ç%‹)«žËù#)áôÒoã×mþ»Æ8ïaܶâ™ñªôeµ”è>óñCjx‰§»ôò£mHß‹=A†7V0 8òò£p& ïæ„gdÊ(àØË—–ñÏد_ÿþúUµ,_ûï-pìåÊǧ•(]À^nA™xY?qƒì"¾× t§^’²ÛËÇïüê()P‰ÔåŽhï,¥p¿—³”„«ÚEe·—S8ò‡GŠjÀVJ/à~/J;(NMÕ˜$]i^DÙëåó“È"bJÿËPš!s•”~ÀÝ^>_J¹ŸzU%GiFÕRz#¤—B±—^å8 $uõŒ8à~/½â”’syY¥„²û¹ŒOJÇ{)/i#¥8/‰=ÜÅ ™^Š¯ÆØSö‹Ò¤D*ïcåS"Ôç2¤ Tå[ŽÒàûŸËeíÝ-R>­îeåÝÍRzw—ÕKw²·¬¾ åðòÿÒKš”Õ™ˆëpÖHÁ½(¹!{ Pªaøí”×Rù2Ë·°)Ëù8eR£ Ì{™FvÅéß×R®ò\Æ5 ê½dãÿ®šÙK™s&5 jºhø»jÊu¼Œj”ÙWk–Q®ó\F5 j^°9¦—\Çñðõ)/Æ TÕ(tzi_¦ñ»âª)/±(mJ¤òùºä´]q )Ñšùx–¢&à5ŸK§ÞÅF^vÖ(¶ñ²G›>—x”ÃK<Êûõ’òº´®¾F¡U(H xÉp)½1;‹)/i/e ¿F±˜2õ’•óØ Ê´F¡GÅèÿg“û /i¹¼RE™Ô(¢¯VJ LT.û•)ó5а»‘(_öPÒ\"ê´h¤L½$bl/%·5ЍӢ‘L/‘)Ã}Wå=ý±'©QtÆ8ïéM‰âEoJ´f>N[+R®V&B­Q¬ç%fb”/ñ(‡—x”wëeqÔ‚É…)LIÓñDphÅܼÂK3J ¾Î>”©—4 ¸•2öRJ¨|éF)‰¡˜HŒ¹Ð¯üpÎÍô^U5 Ié÷KÉOÈRUV7£”(WTk¦ðrÓUÕ(䮨H$ƒc4;¹M‹—ª\È霘¾_âsUB?a ÛAªÓKÅdúD°DW ™žÀ«ªFQ $¹¬¾ÙKxÉõÏzQr΋^fTÇuTò%”´“’6SÂé¥zÄE8ñä]u±Ç«QØØãíÓ êcO&ï‘3zÉš•™¼‹qýÊHšäô^•£žÄÓç÷KÈZFcJ´uE†k†rÓ> ¼qnX”`mœ[+e8âGø^^· Dx'Åv\/·¡¼S/M1¥¢ ¤É‰¢”4Ò%\&â& ñ”^ªŠÒžØ€Úâ%_J 2õ’©Æ;ÆÍpc™ñÊÙE+)Ã…ܧê%¤2Y¯ðÒ¶ŽRƽBLËT)·%«†æÛÙçR—©miæpd(…ú§J©¼îÆWöQ˜ù l[8¸ÈTÞK¿F!½Ôõ^ß«½ä%©õ2¢äÚ=ÊU=-œq¤ž2×ßPRŠE¹ðŽÃ^öÆ¿Fáb]{@/uJ¤f ÐU ü"eœqY“"U‹æmš'ÖÒ€×+ª"ïå‘ú(Fùrx¹åz©rÇ¥”4W£˜+Q—)Á²:&¥Fê£ÌÖ{:(#H­”©—ÌÔ&Ì,þÍ”i‚f{61“ÕS¦^Êò¿ÂÊ´F93x£¶|i¥³ÝÊB‚{AÒrA³¶¬n‚Ëv#”½Œk²'Á.Mb¦)Cô² –²ºéíp^6<ç%"%í ,xÙ{â… Îþß{ ^v¤DqBGM°­)Q1ŸIá—Ö(f3Ž–2Ñìz"ËjË”´x9»žÈ²EÅ2%£|9ÊêÃK4Êl»º“Ù“dkpªîòEÙîI“àÆ«wQš(TŸš¤GM˜]^Îvµ”Þ©@£죠\ zR•3,€ÆÙ:D)¹ÔѲj")Í 'ÕWôvÌQ‚}„«áNzíBÓÌ梆 ¢¤Ü/ö¨"¹+™ÖÖ~/¹jªêT i1°«óáUì+H¶rÁОKKIt% žRÝñ òÃeÏD%è¥+­óVJw3Ì\Ïí‹í¥·îbLÉ Ù”(¦ì¾ã°—ÞºŸ´-öps˜¡4ñÈVóñ¼?ìÚ„M)—“J Ç#:9³‹v{)U×{Ô’74?U—‰ÈÁ(A/uýô8”£|‰G9¼Ä£¼S/»ÛÕ35Š–•W—”ÕÛ(35ЦuÖ~.³5Š>JpùÒ•Yy+e®FAæ+R‚óÀ0W‚i¥¤¹Å^rS\o¤k¦ø¿œ2ãe5e…–R>^¾tRB'^Š<©Šr -¡|¼ØŠôrJ àØËç ¯¥ä×ç˜r‚D LN¼kÊÕQ^¯‰—ߦ„®Ÿ2 8}.'Ì*Êëx.'ÌnJ ` ŽO‰j¥8ˆãß®×NJ(`(½ÌQzyç+pA±ïÛ,åS)Óó˜ò) ²Ež÷m޲˜5§q¼­HR6ÜpìeW`˜5Š’—Õ(«ãix‰§á%ž†—xºK/ÿAËã°¤(C/Gùt^^a/7æŠúД±—»B%ú^¢éòÒ¤þg|¾çO•^ÚA4¦¤[RÎyiù”zǪ÷’Ù9(7^‚“*­H9ï¥j­ÆGHJ36c3Ê9/‰vÐ S”ôpÏ%ws³rwÇ奸Ab/98Њ”5^Ò”ò`Ï¥øaç@â{ÅžºçRO˜ÌUt’Ïåòy}PþùøÎ^â)ëåÇÒÞâô=ëec£õšzúž÷ò8/¿ï}Ÿ­>J^î gô\ör‡› éRörW6§ËðMÃK< /ñ4¼ÄÓáeÓ›¿ëiÆËãQŽç²S„—äšñro<­9/©<Šù§P(ígÐA” —Í”leJÐK–rA”„”à_‚B zɦë1jçQ³—ˆ–A9­êz¢Ds„j*tÛzöU±(a/¥7‰*ñ¦Zµó+¹™–X´íö¯ç%÷Nø'æo‘7’QýS~¹_|3}×™þÉìoÔ%äå%åÜ£Ô[ò'S3æ£S.ñ’^ª-îyI6ñRÞGn®E²Géí÷yí6>%X¾$"?öhJ9¡’ÝOÂØãm«}k{)çJöS"E)S"¢¦Vàú“ÜR+Ù‘0%ZÙKw I§ÝÕX²'bÊ^Y&ÒɲL#Iø)CÙ›ç(K^R®X¸½´ûSš3°)GY½Ss^zóÍõJÚ8ÖbJÐËfJ ý‘ô’¦\ã[Q‚^ê¹2ÌtÛ¢¯ÙÎå¯×(–©·9¢´º' %ì%³“{è…Pý¹üÝôÞd„-S9µSÂíDjšF=¥‹ ÅLGb§Í±ã(_!Ͷ•)™Á_Ýu¹Õ±\Ï<å/Ià¥Y‚jk/©„GÍ;záhCéíîýZ”`YË:˜{4¥šdÊìç›ÅØKµâ——)J™©11”èOnõbºe97wÑÐdÏjª,é»è¦Çö&ÊÞ–²ä¥ÉO\"ã>mK9Ê—^âéðrïÑNFE/ñ^ îTÑËn.¬’—{vò”÷òH/uå½<”ÆXV< /ñ”órïÄ'–¢Œ¼,N,²‡@/÷†JyyPÝåûãÕðOÃK< /ñ4¼ÄÓðO÷ê¥nY èØY‰—D¿ÚjÑš¦Â_I‰—ԭâ´?#à%?ˆY›LŽs˰ïF{)îw°œ»Yòa…n§zÊ$Ž3Ó™g{!+Vu_›2M/å˜!j–]<%^R×çMB ÅqŸ’‚J/ÁØs(/eÞã§Dœ˜äå!5ÊDx^âix‰§ØË½[U#iÊÈ˽±B=g¼|Ùún¥»L/_öCd(‡—ý^âix‰§’—K‡þÓôÎò}ÉË¥Cÿ×£„¼¤iø@2ô"‚Î[@ y¹pè¿;CQ¹"| %è岡ÿnÛíG¢¼\:ôßœá~K{+Ç/—ý׃ì½ß¢Q.ð27ôßž±‰— ‡þÛm’"Q^.úïm›˜ƒF z¹hè¿w†jWZ×K§ö¡ÿÈ-^e¢ö¡ÿèmï^¶ýGùl”/ñ4¼ÄÓ}{y˜!õJš2öro¬H°—ÇÔh ÆÓðOÃK< /ñ4¼ÄÓ½yy¸÷<<9/÷.ý”4žK< /ñ4¼ÄÓðOÃK< /ñt§^ÊO/ûQÆ^Pös;ñò%쎔ÃK4^f&ܨ „O¬øã²—4”©—ð)O‹)_–R>9ÊZ/¯K)ŸSºˆ@/p>ª(¡#j’Ùì% %äåñ(‡—x”ÃK<ʼ—r †ãPM)¦‰èTSRï5²˜2ë%ÓóƒÒ6Jy…Xʬ—L bî”jJ¾œ’ÔY/å_ÅüS¼Ô£ÅxŸV/åB¸„Wz©/ÇQr3²°™ÒŽLlñÒ zi‰=ŠÒŒ&«¦$úT=J­ÅË…w\x©^MmöRzChÛs¹$öh/ùbJ{IC9ǧD¨”³éecªn)Õ¸A¤Ø3›÷(3[)õçvJ8%º÷|üH”wäåÃï{ðò¯Ûíà^ÞnÓ?îåé$(þ\þ<%ql½¬¡{¯«(3—4”@‡{Êk(—6Îf/i(ô<£†¾V eî’†r´_¢ix‰§Ä˸àyyHÝißÙ!5¼ÄÓðOÃK< /ñ4¼ÄÓ½ Æ[És/ž-íåùà’^¾ùz?¿í¯ÏpSyéëvÚ&«Ïs°)¼|uzß_Ÿ_Âí‰òêtÛ_Ÿ_Âí½“™Jý,ÀÃ2¶{ªIEND®B`‚geomview-1.9.5/doc/figs/cam.png0000644000175000017500000001106712310162310013226 00000000000000‰PNG  IHDRÒWU3PLTEÖÖÖßßßdddââ⯯¯VVVÝŽÚÚIDATxœíÏnå*‡é‘Rw{³ˆî>-Ýõ¨{4O0^DÙ¢¾ëîE”×Cý¡À€±Áétb¢$>>>üÎg—¡ 0ójéÓm’žn'¥<£óé.I/·wsRžÑóéÛ£NO·sR–Ñ“gJ÷¤/”²Œ<ÓÓ+¤oÈô|~ºC¦‡ó œ˜~̲ìjúÄL·ßbÒÛ#éQg$Lwu“Ù•~V2zŠLjçÀýôôS¿¸}¤ë³(˜^dûa9dgÒLKF¸uóøÒdz0f§ÐŠ ·Ì“yÜ­Ta2m¦‡pêü47Ë_Úz Í‰L¨äÏ Y„ nÉÆßÌÂÄ™QÖ‹0 4.2Ód¢óñ LxøBñ€?a+ìð¶ÒbºÁÓQcb¥›„éunLxvð™­1‘R‰ÏÞbòùgJ†v¶˜Œi2±ÔM´½¾úñç±mÈD¦¹ã~òTÞÂCÖÁÈqG£ì8t?Iˈ#é#0qqp:KÏ·…éNyf xu?õ Q`ºy~üñô“ÞÞ›žõ ѧ»çæ——Wð÷ž^–³w{÷rvZB§?¥§§³…>úæ•î_îݹé+ÛÞÓùJt?]LõT±‡˜*†wSqï×3˜êJÓˆÒïÌd)*Íg²ÎåR{™ìê»Ö”lI©ŸÉÂê»Ö”Ür¨qÖµp*w2¾k]ɪŸÝLä 80¿¬]ò1PVR¿»™B–†~øëšìŒ®”Œ9Èä3ÿCYåg´ÀäŽ1ù›•–/k×7Û^Ai'“QLx甘–½þä’e³=È”  0Á·£•?‚5%üÒ‹(¤#e„5‚}iÿºSéw.ËkJÓˆÒl¦¯ÅtÓçºÒkŒ(½o¦ÓÂv¨%Lç }ΙÎ;s9ÓÉJÓˆÒ¯e2Ê]„ʧÃ~rÊ£#¢ pÁíŒyÔ™ÀE‡§¥dè8¥D^eêrÖ™@ ´”ø¸D ÐG¶+¥29Ÿä„ `ZŒ¿§² ~;œQ©Ìd‡YÀ›ä¾Úa¦Á—5äÌF%èb2x¥ƒï qºå1þ’LÙ]JƸn&‡Q‹3îˆR/S¸¨0ÂÔbP¶ª¤Ž‹J{m/Þi³üÄø‹2²RÚu?…2Âø=X[°r Û— ã/6ã-'Z9*qÑÅ´NÐxO'[Üî.Ëé\*õ0­·ªJ¦´ù±ê§s”~ S9ô™‘2¦J5Mé}Çg+]L#JÓˆÒÅ4¢t1(]L#JÓˆÒÅ4¢t1(]L#JÓˆÒÅ4¢t1(]L#Jïœé»t¾ž¢¤˜¾Kç«´¡†ÿ øºW‹:ºâH 9ª¤¤™þ»’ì€Æ•”hì¡jío*i¦ŠRÒ8(ÙL©‘ªLFÄÅŽà.lï%ßÞ†† Än°n&½4@Ýz¡\–ÐíºT¤3L Cìfò?ÆÉ7= {,Bw+­†!v3…±9£óñý+ûÁ"½n)5˜¼Õñ%I˜\rè`wÉ…« b{”j÷ÙðýÄ\‰EP×—Cc7X“é37nã­Â×ɲEdVn¸ëËÊDÝ Öbúª”(åŸ)äQH[L1U”úº¼:î'upRÂÆÔ×åU<êªsÇ”.¦¥wÎt²¶ò÷/ 7¸¤(—ɰ»^PÚðÂ0VTÊ…ÆCl+mø{~ dXQ)Hs‡²PÛ7RJ¡ØôîÈØr~‚ÂÿÊ3 ¡¬·:™´R[*U™¯Ÿ w7-K¿áµáñ9–k|Bßå<|¦—)äjøÊ°“`ÉwAŸ‹‡ÄYªÔM[©ÁVŽO•h,’\|rTŽ19ò:ØöDÉZ5É%ïn(5ý½x?±E ÛªŸ 0|nÅ"ÂÀ¡µEh¦Ì c¥8¬ˆÖðön»c†," PR*X¹f*xa•;¾#µ®S騣JíûI)™|coÊŸÀºêÜA¥‹iDé—0ý#eÄ)JŠ •¾8q‰B-ÂÌ<$Š÷eh¦‚¤0WH)Óþ·$-}‚+¨¼Lbo‰Û¡¤™VJ®¢1;&Ú* «L€5”³»ì0Á B7&¸@$³l²{Tk§ª2•Œ‹ƒ°¹²Ç5¾´NÛ©ªLèåLäWý–®ä¿]LÇ”íTÓ™Ün&l7R¶§•ðQ‚>¥ÚýÞO8.›>o°A•lTj´S¥L_8RC†pûËý´X­(9#¼TFrc…imåšé^)q:î5®S1û£JÍûIfÖ[{SV(_uî˜ÒÅ4¢ôáÚ°27y„âØ9‚¾ªR³ÝÈÆâ:ÂÂVû:™ªJ¥®€•Rá°&•µ(YÇÏó€TºË™Å" GÔ¶(ÉnlLj1Ãé¥S¥W#Ëx¦ú” Lÿž¸X›é$¥SˆË9áÀ[pø¿” ö†Ùd ¡‘$K¹¹r^ЫTb²É÷d¥J†-&ü¦~¢V‚Ðo°CžÂB_„7]‘¹‡)(ùšŽ•¸àÐk‹!rè1&ãË™ð7(…rÇ7m{w†· }'>ôàuJ•ü狽`6œ.§•ÊÆy€Éÿ±ôë˜'e:züé¯(R GAÕÔ»˜üǵE MØ‚EÈ¡™ÂVVN‚›ÌʽVØ»eå&LrÎòTÚ·uö*L'(•˜Ä^½RÑx(˜¾œ}˜f 5™fŸÍ8÷ûT$šðAÚXNSº˜F”.¦¥‹iDébQú­˜6j]VšÀÔU½Ïaj¾{ÏJ3˜ú”.¦¥ÅdJ ÒÒ*-dËFIVzx(Uª2A©[”b–¨Õºm¦²Òj#Q:ÈÄÏBðÃ@a”ª<>­:#:•êLz”Š £TåñiÕ1ÌÄV°IíCvj¸fâ+V= 4¢Ô`²2^ól&Ÿø!%PJ±3bœI7Ù¸Ü" Jp˜)´N-Îë2+' V¢Gƒ1Õ¨¿¸uVY~Xé S^Âv(}¨úiºÒÅ4¢t1(Í`êiJœÂ´ÑB<“éŠ ÛëSº˜F”Þ“Éž[Ì¢BËuU”¶˜ò¦Q¡uâYÆa:™VJɆ(9»©ÔÃT ô+õ05¢Â‰L&t·7#¨‰LQáÄë´NdÚˆ §25£Â©×©N*#*âñ>3~:¨t˜ÉÈ¿«~º˜)]L#J3˜^-~êŒÔNŸ$R;=&”Hí²½¥‹iDéÍ1YC³ÎaßM²Î *Ù‚–(u2ÑàÌ!AIÞa¥Úó»™0SÇ} +%[{ ø“tzý7ø?(Á¦Ò&üÅG®r%[ôÉ1á„.'mãÿõ Íe:¬´û:á: ¹’o¶˜m{¬º–cT3•IŒá˜Ò&ZÚ^[¦œ[F”•;7~:¨t”iUÂn*}àúi‚ÒÅ4¢t1(]1a™éŠ ÛëSº˜F”~†~1+ŒÀ²th8 ÑÙRJ™r'´ Äó:X: Fû˜NT*0áSˆ2á58šL4„Ô¼E‡ ¼åÝL<÷Ð@ÜEsO‚D…{”2¦¸â mŠŸ!þZÚÇTPÚ¶ˆ)qŸ$_ ¦tä:±’I˜Ü°R• `K‰'q=l{5‹p<©èA¥Âý$VŽ}vÆ^ò&,wcDÉÆûiw±$C+;Î(Ëõ컕ö1©ò—§}¾b‹é ÒÅ4¢ôžÇYÚ;Îò4¥Õ8˥滫ët¾ÒÅ4¢ôþ™¨µ=Ij&¯tgHý‘ZÊTP óÑ­•dk·›g ó´S” Lj.?Gˆ<ë™Z• ü‘qœå&“‰¿Ž«ry%tÝwÆZ‰ ǩ׀èå¤:#µ“Ã…ôÙ#ÿ_­Ê•)09GcE)†9G”jLòm#™¨Ä+y ÙžŽÉè~Ò•¢E쿟 ÎßÑÊ©ŒÐVΤj4ñî2¢; ô©¯t”iïÝû¯ŸÎTº˜F”^ŸéŠ S¥·(u¥ßlŽ™N¥‹iDém1×ùÃÿk~)u0o• ¾Ó¯ÔÁd‹™ìVêa yÉœœ4S´ï™Mšz ZJ=×É8=k…ÁöyTJûÀF™‚P8Ô6ªWª4§øn&ìJ}_—rK•hæ(“Ãa€F˜\è¥ÕrwƒL–•è÷ Rïý´¶'qVŸEô–4Û2D+w*Îê±òÞr6ÞßJýeù¸ÒÛcM§ÏûwƒiêÚ.Ÿÿn1M]q¥É4SiƒiÞŒöÿúÜf:I©2w>%_Êøé!ÊÛš¾´É¤2¥Õ)5çÅæ9¿Õ|ß³™,NUŽS­ã_KùùÃÁÙ™LAˆ•œÁq8G;}‡iL8ugÅ; LÏä·×ÂíK“ų“Ö^fé=+=kíe–¥ž¶ö2ËáYÙyk/³LÇ'®½ÌòxVræÚË,ÛùY±©k/³\ž13)r^)5wíe–ͳb“×^f9¯7–™½ö2ËèY¡ék/³¼×õKÌ_{™eõ¬È¶—YåŸÁö2ËìY)l/³ü?§Î=‡íe–Ý3fv"ïÉ<‰íe–߳ܳØ^fEÞw•ñr§âï!’¦Œg;¿õ¹ Sʳ][~Ä:€ ’gÃ÷÷·TAòìóû‡™] <û¼{¶+´ö2ƒñlxx¶§¢µ—ŠgÃð¨g{*Z{™x6|?ß?»Lk/3φû®ñQÏvˆÖ^fž}.žE‡Ö^fž ¯r¶C´ö2ƒðlX{[ÑÚË Â³Ï»f?Ïz½sl/3Ï–}~ÏžE†Ö^fž úœE—´ö2ðlØzWÑÚˬ~Ïõì;.´ö2«ß³Oõ¨1º¢µ—Yõž z9‹«híeV»g“e[ÏbvŽíeV»gc-»¯ßJ=‹­½Ì*÷l°xaZ{™UîÙ`.g1­½ÌêöìeÙçÖ²ˆcÇö2«Û³ç¹Ùô^Íz¤ÈTîÙàò,4´ö2«Ù³aA¯gÁ­½ÌjöìÓ~ÔQÑÚˬbÏ^µly/ÈvÝÝdªölðyVÑÚˬ^ÏO9 -iíeV¯gŸ~Ï:ͬZÏæZ¶ýÙ™²îì2õz¶¶ÌxvlZ{™ÕêÙR΂*Z{™UêÙê™ÿر½Ì*õlunæ¬g¢µ—Yž)–YÃ*Z{™ÕéÙZÎDk/³*=b<óU´ö2«Ñ3¥–Þ ²]ã;€Lž}ÆyÖ]fz6 1åÌ[ÒÚˬBÏ6–9ÏÎ*Z{™Õç™ZËÌïÙ®±@¦B϶–…xæÜ9¶—Yužm«YH=sV´ö2«Í3Ͳ Ï\¦µ—YmžmÏͬï >Gk/³Ê<Ó-óžùŽÛˬ2ÏôjTÎ\­½ÌêòÌPÍB=³†Ö^fUy¦Õ²ûúßWP=³ïÛˬ*Ï –ý÷u_U´ö2«É3½–}=9RÒÚˬ&Ï4˾þ›—ý­½Ì*òL«e÷¨¾–5 ¦w™ª>虆ÌR™æê„ÈP:õ,™fY2ëÓ³d–Í×ÍJŸž%ÔÌe=‹BÉ,¥eÓÕ['D†Ò¥gi5³‹FÏ¢Xg–Ö2‡iô, %³äX;!2”=Kn™54zÅ*³ôšÙB£gQ,™e°Ìv5„žE1g–Å2‹hô,ŠUf9ê™Ù4zÅ+³\š%ͬ3ÏrYöaºîHÏ¢xf–K²¦Nˆ ¥3ÏòYfºBÏ¢˜2ËdØ ½"Céʳ¬–%̬'ÏòصBë„ÈPzòLÀœc¦Ñ³(ž™åfÛ ‘¡täY~ËþnB£gQŒ™•@í„ÈP:ò¬€e“dÖ‹g…<[‡FÏ¢8½®gv½î¼î„ÌPºñìßQÏ~ÿìy™Ò ™¡täÙûKæõ÷ϸD¿î¬tBf(yöï}—_#ÏÈþüƾ0Ifyö¾×´?¿«%êµgµ2Céʳ}¦Ýƒú]¯1–¥É¬+Ïö˜öûG[‚_{ÞtBf(ymšXDU;'ʬ3Ï"M3Gö¨jAçfôì³g1¦©uL]whFÏâX< 6ÍêXà¹Ú9Yfýyhš/2oUK—Y‡ž…˜æ Ì{®¦GFÏâP<ó›f¯cÁçj 3ëÒ3iAŽyÎÕÎôì(Ïþ¹‹ Íb™=‹cëÙ»ï ~Äb¼’2³N=³™XÇ~=çjÆÈèYšgfÓ¢û5Ÿ«¥Í¬[Ï ¦í L¯jgz&€Á³­iû›ªšj™!2z‡É3Õ´uÌv®–:³ž=[™v̱yùºBÏ8]LžÍ¦‰Döªj¶ÈèY÷ÌLžM¦É6Uµé HÚÌ:÷ìaÚÁ:¦®ŽÈèYße2‹ö.hÙcÉY?ž]Ìž½g‹ŒžÅ1þnnÏrdÖ‘gKE­gŽÈèYÓgM˜E˵k¤gq=có7Xå¯9ž3fÖ¥g *Úëtšž‰±ý›âÒíœ3³>=3ˆ&RÍè™ ÛÌLíH=ËšY§žD“¨fôL“†è5ÇñJã„«2CéÖ3ƒiÕìâ †žEaÈLðš£òs3{2ô, CfšhÕìÙ–µ"CéØ3ýMb×85fë„ÈPzöLM(2k8ô, cf[ÓŽž›­›3wBd(]{&SÑÂ?r‡žEaÎl{ì(´kœ {lÇPúölkÚ^ÏÌ-†<´g({öàà5LjߤgQ82»¬lÛµk´6éd×Pzñìâ¼xyÙ&™!"z‡/³Ëd[|5sµé¹¿z¦}ÍÑ™=‹#,3ñV÷vo“ž%nÖzgÿ&éYêv-·l‘ž%oØxóÈéYú– ·mžehZ»qlsô,GÛ›ÿnžei\ùïèÆèY–Æ•ÿŽnŒžåi}õïámѳLÍÏÿß=ËÕþ…žÅR:³G`ô,Žâ™y~ì±z×…~<3üfLv„ÒgíБgÍ@Ïð gxÐ3<èô z†=ÞáAÏð gxÐ3<èô z†=Þá±xv»Þè½n£g·;ô »g°Æ}ãÛ=C`ŒêímÊŒõ ‚G={fÆãFx܈ÏÏð gxÐ3<èô z†=ÞáAÏð gxÐ3<èô z†=ÞáAÏð gxÐ3<èšgI>›‹ˆ²ñì zöÆbYyfåæ|–$À=å³g® 0´¼ÜÅ eÞHB…Bw´Î”¹VÊÄMláŠRóhM„bGŸÈ|®P¢¦¸ŽÔ0ÜŽ°£¥B±û)ôÎÛ¹:Ú˜)vH†n@ö·r¸ɦ2¹G‹ËÎ=$ógŸ5ü)™€M!`SØ6… 4åÏN®° º,zy×J™Àº C!«Á¢HÈ×#üSöfbC‰.Š„|=²ÁŸÏ%ðUl ›BÀ¦°))»‡ä 1¡ø¦ý†àmmÊÊ&| L9ø%†Â¦°)l iŠzø?6.âÉÒ”‡¡äÉ“¦ÊÒLEº‰Àe*YC›²ŠªˆPv™RJ(+Sì5m2ømN´Û+²†6Å^Ò¶z˜Åš¢7™õÓl:²˜PÖ}Jˆž]^(Må…òÈeó(*Ê¢£•Eu´”)ÄŒ¥„‚ßuÐógÄšÒ÷ð7þ”l°¦à@\øxŠÁš‚_ÁGÞkŠ …ÑZø-Í'`SØ”½ß‘!&ß”·£ßQ¬La¾’‰€M!`SØ6…€M!`SØ6…€M!`SØ6…€M!˜Myx§ œ)ãÃ{Ä3å[ï?›<|vuö`N!wmñéÇ…`Jp ò©>èÞç2†€)‹;wÔ_~oä/aùè0MþÝ^h ÍÒ8ŒIEND®B`‚geomview-1.9.5/doc/figs/myfilelist.png0000644000175000017500000001072012310162310014642 00000000000000‰PNG  IHDR2ïa¸5PLTEÖÖÖ•••ßßßddd¯¯¯VVV@`sIDATxœíËrä¨@ñÂ9Û©…ãîíû]þ€v…×î…Ã["ºƒuÏ¢£~D’<$A IHȲÚv©JÓG€BHˆƒÅÝ©§]c¸¹7q÷ЋÛéaÏnî·¸ûñÆÇé}ÏlîCûéÒŸÜ:†›Ó~>?ŒŸ?G‰ãç­v§¸#?¿÷Íãɸ³~N?|„ï·÷psÎÏC:Áoÿ$6÷áýn^þ|üNœÞ)õÞw<?7û^Ï"ÞÅ@¡ŸnsoæÝýûõ#ðgž‘»½ ?ú×Û}yž„ÁûÑ$o÷Ýo!Þñ§X,ócyì« PŽ[Dz?]r~Ã]˜†üò”Úâ›óc“³ÀýUýÐò–ðcyî­â!5åÓñ¤üØýu{ñèD]Çø‚õc¬Ÿ “³ñó&X?.n=žòÙ}aù³],,Ÿ·‹æ‡¡[Ä:ŠÿÞùyÎþ·ùYÖ?áD¸9ôsÿçý÷ÇÍGø~›øN„›»{øó[üu»æüëãÖí¯ÓÃí|Œ¸;þîx>>žÕâ×ÝÍóð~; å¯ãø1åO󿇿‡æ‡æ‡Ãûéª ²"ÏÀè‰êð ü HMž¨)” @ìÏñƒûKàkžŸ.=¨²×?¬O*MìÍ“òS‹'åG§æ•î·Ä/dxV‡ÛÅúÙ‚GC HO3õ¶@¯õmßèmüÛ©7Ÿ¤u÷–‘†“õÓmOh±úowb¨ôù¼>å;­¿§™p6‰³›¯5èóIÜø™ÏQ¯[v¤šò£·'Ü«;ÓÀžuØiý™)œÕ¼yôlÄ㜄<ús\¥Ö={§ý¢Û§ð“£2IPÚü¬Òo¡)—Ú\âýŸV2libÓOGâÁýç1'û=\¬ç¦Ç£[t¢äào"–7ƒ{—q|÷í‡ì73â.ñ¤ýèÁãg›"ø´úO&OóÃóÜÏK­Ž- ?µpÎq?µ£µñÑüðÑüðÑüðÑüðÑüðÑüðqx?BŸMAdÎØg£XÝ›)rý]B¸m·ò,=ÓJžqÿ„Þ–ç­æ/2ä÷OÐÍH¦B÷#À4h‚i±˜87Öß‚mîXÆ3ö#©‘X˜Vלi›§ylSО¸×ì%]þLlÃõf’ =R~”íð謗·¿ô²K÷WÚùQjâ¿M<=å2ÁË_žGy²Ò¸‰ù<ÑòÇ7SRzV»¥çhù,•k¢¤ j¯ü~ðãWåh~ø8¸Ÿ¹Ý[”¢7¯K–6 Ú¥ˆ§çgæ_Ï¢ÿYð—[WÄÏë,»çŽçññ©û·di?;žïßÏQ?KxÎß×ò<]<Ïz?ey†~òo…Ãóô|]ËsÖ?Ä3ôS›'áÜoýƒÖ€DbyÎÝÔÀ¼›:þžnéë”0ÌÀ‹¦Y<ú¯áÑïÄT­lÌ“ð#C?`~õ F¹¦x`ªV†<ÝjðWÜ4¯NµôÃséóºêmÞM!Ï5äù¾›>áð<êHí¯I :^<¦ËgÁñCžàjQŒ'#=Ó%·„¡ûOaZqû „Ï_†DŸ'•~ ›ç’L?”ÁGú.À¥g0E$òèÅRς㗤21Â37rüð¡÷×–<³ý(wˆÛÅÏœØÃOmžæ‡çù$~|k˜ép8î%åÁÁ¯@P¹òl?¦ú"T²—pœG({H÷ÇÓI¶þãVcW*}GÆQ6ׯ7]ÿQ¦>5ÙK8ÎÝL`ŽrØÉP‡©/ÉÃ×€x&{ 3ÛJsÊež¼Go@¥ó¬²7¾Ÿé p.¬ËÓ3ðØüþÄï·’gfŒyVûÙx|ÈÚ<ëǽ¬_ôZ²|.˳ÞÏÿ×Oû=ågæã¶Ç‹ë/ú~f®M©—g>Žæqëû©m|l>îgî׃•-ûuȳfüð—õ<ÏCž¾¬Ëž£fÓ§o¾ÎëWÆ-mêÙ~ ßξâö£×x¾Lò\žÎß<©¥‡<ßÏç(ÏÈOW—MðøÅ®ÝŠ¿Ey’K?öutB 4í§+(sxžv@cžôÒcÕMú9»sª Õx˜¥#<ДŸ½‰<ž.; y¸¥c<ŠNl?ø €,ž_×ï#?ÌÒ1žëu:ýt«Ìâép"é'½t„çzÍÉ_]!•Ásépbù+¹ô˜GÏ™Sþ$y‚bõIãDËžçâÖðýr}Ì*ºUÆWv y¾ŒM.mx®O_XÜÏìújoe‹ê«¬Ÿ™k¬l>ΘçÐõŸêÑüðÑüðÑüðÑüð1ðósA‰_*Ì«ï§&Ïë±ü\^£~öO2Wâø©ÎÓüð<ŸËîÂŒù+UúâZÞ´Oô„!Oi¨L?övŽGmÉ3éÇ ³{ÎøÁ¶á™ô#›ê ô~ ž ?‚¬]’5àQ¢¦óTK?ú—íêÓφ"F·°€tÏBûØ7 iê—p·äÏç‰ú1ÉÜô*žˆÝX‰¹É§gâñw/áyýôL»[ò ùÑ0Ua~7<ÁÝKzàb;b ,ánÉ/âÇÏhK8¿^}ÒEebæñ 4?þA0Bœ'¿Lò0~ìMd~üÿ.Γ|.m>O«ÿð<%ë?%xJÖJð¬ÿá)Xÿ)ÂS°þ³•Ÿ¥õŸ­ü,­ÿá)XÿÙÊÏÂúÏf~Ö6ô³¨þ[ùñ3ίÿ¬æ)Zÿ)ÀS´þS€§Õxžæ‡çù~öïÀúYp—RAžÃ÷O¨Ð ìO2ôS©Ëú§éÿS›§ùáyî§JnÇ ž¾ŸËôróôýÔÉú©¿ÿ«z4?|4?|4?|4?|4?|ßµA­¥{v'ùt#Œƒ;ó ü€\ÝÙ·³ÝÈÂÔ\·Æ‘xé‚Î<?zoùGñÒ8¼¶Ù{žaþ’öÒ€»zỬìÁ3*t[»ÞI4ôîÞ<ãòü5­ <‘üòÈÊ~ )=JϵÒÎÖa~Wt‘§^ú©íøÎGóÃGóÃÇÐϯºÍQ#?õxžã~^wßE&~ZžŸê<ÍÏÓüð<ÍÏ÷“¨ ‚«»GÑt¼â~ î7à½sKÜÖ„Ÿ-x°&Œ<¶‘ Æ“òþ¢›ð±YcË¢ö,¬ÁvÈTvZof2=8uß A‰”èÏ?…;Q:ÛÏOè)+œ¦C&~®ÜÓ a8+½ { ôN&Åûá:d ó-5 Œf·}iÏ&mç@{†©,P‡A=ÍúIwÈ”"Ƀ'ý=aŸÂãÝ„<ŠÎêú<9~|‡L…i#áGü(–‡Îz³ü$:dºið<á‘vHý©Âýa#®¦ü¤;dùÂw¤ã Ó²ç±Oá‘*tÔH .=÷xbå×!S¢Îß&¿#O/¿[iïQÓ¯ ¿ƒI9 \~ŸòÓ üMÄÄ×é ²2ïøžÙ!“{‚'®U2ÓOf‡Ìű]·ûVÿÉäi~xžƒû©ÐÒDÂO-œsÜOíhíc|4?|4?|4?|4?|×OÅž´a8?Õ콸´ôÃFË_|4?|4?|4?|4?|ÞSxÝ…gà‡ÙèG~ªó4?<ÏÈOâÔO|î{råŽgä'¾ÈeÏë,žË|?×Y<—y<þ÷¨ŸÈz~¥yb'˪äÊOÄOUžæ‡çi~xž¤)¨Á4æ:k&ÝáG<)?’Æ<‚ \wøÈ™<)?ÔÁBúEx5“G%xR~_†‹Lù¡QÈôHFY~ìEònÝþ:=ÆÏéôwÇs ô£yúù+Úú“ä‰^¨Jó$VîxÆù+~%,É3«í*¹rïgTþD—HòÄ7äI­<í'­ýç<÷Ãô«â§r¾}¾r4?|4?|4?|4?|4?|·ÿ˜8FX??N òóp˜@?ïa|<¼ïƒÍ?aÜN{¡D7×ùùèÇéc×l®ósëÇé¶k 6÷»vÆ¿•))w~?IEND®B`‚geomview-1.9.5/doc/figs/tools.png0000644000175000017500000001371312310162311013627 00000000000000‰PNG  IHDRpñæ,§’IDATxœí[UÕ™ÇÏãÌÃLÕ<ÍÃLÞ¦¦j’ræ%SSZ•8ú’Xf¢˜ ^f%D( ^a0ˆ‚x„ƒ ŠA 8 ˆ­F¬€¢\š¦o4}ïÓwºiòÞzÜìuÙßZûÛ{­Ýçû×Ç©Ýëú_¿³ÖÚûôÙ½)œa‘ªÐÂ"U¡™EªB“B/þ?‡*TÐ@…FAÎíæ%Dt BCH•¢ããêÏt½·¿vkÍç/nß»æws¼úûO·xøÀñæ¾Á‘ ¨ .6\®Âé¯U)ÔÓ7_ØúGiÀ ;XÛ\ÁõɧÃ*ÔO¨’ EáÝxþÍ8ôñÖû‡`æÐ6îØWÿµ §&d|üù©U›?ÆŽÔ·tuô  ƒ×ƒµ-oô…ª°E|v¬ipxPÒ“êk·í­,ÿ»—¼,ÔÕÕIuÍ+6Õˆ±eÏ¡µÍ½ƒ£cç¡~{ÏÀ™Î¾æöRsGiÿ±¦M»?“Ö2–ŽØ;?~ad::×Ó?ÜÕ7ÔY‚['zljë…€’þTÿíÎýp¾z8ùÓù«æW@!¶†g_Û‰;÷®kmnïíéŠçÆÆ¡§³]ýÐAc[/¼‡O¶®çObEÓ8tâ ø>ÛÝ_šxÏÇÎ_87zÆ682)°&`$ÐcÃÙ(¹ô•þTÿòTk0#¿üp¼¡mÙÆÝb¼õþçÇ:`JÇѱñññ‹ð6v•† éú3Ýðz¤þì–÷,ݰKZ»þtÃûÔÖÝ#K0Y``Ð)ôØÝWî±ñlÏéÖ(ùØÊMþT‡…0ܱ÷Èg=óPØ—¬ÿC$žÛT³cïQ˜†0Õ»û†GFÇÏ—'iÿÐ9˜¤µuÍ]ÐÇ»{.߸K¬nv샦N6wž>Ó +z¿8:VÒð¹óÐûÉæ®M§[»¡äƒK×cª&dZ=¨î=HÑTÎN°^sÛ¼ÔXùFÍëvFâ©Wví?ÚoΩ3Ý]}Ã0ÿÁ(`…Ø_Nµt=Ý}¼÷é‰Ekþï×¾+¶€§7ì®oí†íåØévhº:‹n^ƒî r¡ ”œ³ä¥Øê…ŒªWj½W~ÔT¯¬ú«¦Ì('¯kÞcÞ¯¶Á4pµ ¶•Š[þÕ›ÒF}ÁRøìx3ønë, žëƒW8†H‡\(%ï_¼V_]ô™juˆo€ööC<ò›·Å˜þäk§Z:aª©o“Òü²þ,,“º–Îé‹_³l£´d@_'š:öm:x¢¶ìîþáî‘Þx…cHtÈ…2PrÆ¢5šêª÷Y=è=\1¶w8‰A”vô @Ì_µMŒŸ>üÒ±Óm€ ÞØb"þ Xòð¦í;ÒxãÜçg<ñ¢´dÜôк“MûaHµ-Íí}½åKØgàŽ!Ò!Ê@É{®ÖTWEVzWŒí6Pˆ2Ð3%ˆWl*oÚ} ®¥«¼¹4´·tôUúèìjéìƒ >òC™k¶xú‚ÕÒFqí}«`¦ƒïÏO¶6wôµõ ¶÷–QÂ+C ¤C.”’w=ö|ªÕÅ7C_¢«4QÚÐÚ 1ûÙ-bÜ¾à•™K7ÃÛr¼¡ý‹ºV ÛÚÕ­ÃJ„¹3h‰~æ²ÍWß:ïÎÇWKAÆwïX“¦ü—§Îª¦Ø±‰%ïxdUÕÛz;JC˜êp Qz²©bæ²7¤ñ½Ÿ-_µå#h¨¶±°Â>9P¸Î‡Ë`øñàñ–oß´ð‡ÿ5÷Î…kU`âŸ~òË`;†Y¯"ïìéPò¶ù+Ó®ÞÖ3ÐÞ3ØÑ;XÙO5Õ!'.TË@áÊâž§^—ÆMó_¸bÚ“Å×ßèpB‡´µ|‘?20< ³uÕæÿyÚ“ß¹næg,ºkÑzU#˜øûë-©¹>/4¶õÀöíŸí€ «ÎõmÝà”œ6÷9¯ªCó² ôЉˆ»¿*;ŸØxÝýÅüѼþgíòW÷ìùôtùÉ k·}2õÑ—¿uõô+®½õßo¾êÜPRÕ&þæšyuC‚i×¶MåÏ-å.°±À``šÀÅSg©þ²>nylÝÔ‡VOypå ³—ÿÇýËàŽ!Òcë"ãæ‡×Ü8§ø£ûžÖ”’¾Uÿã¡Se »÷‡˜öè:Ž$ñÞþZˆ2Ð{@uŽ$±ó“£e Û?< 1õ¡8’D€± ôÍ=!®¿w G’0^´†e+J©b±¨Zb™¨8!J&J,,Ðìw¢ŠŒÆãܧï@Á\.€V|š5[r挪8÷É@ Ä@‰Å@‰Å@‰Å@‰Å@‰Å@‰E´P(H;P¥crUF‘}Fnn0j )J ¢EBßT@5?’(S âÔ¨š7  ‘•=Ñ•fŽ/y©©uñ@ZRj)# *{R«š³ª†ÞeÉPd¢Ô'ÍII?1#‹%§@5g¶ì€Æ.yͰKžÕtšÊe“…9'@z–ZÍhéò“#攥2Š”éu¨˜ŽˆÆg" i‹hb Äb Äb Äb Äb Äb Äb Äb Ä²Zt!£±9÷£€:qY4êÖgpÌ·3’‰‹‹‹‹‹‹‹‹‹‹‹Ë  ™È» mP%/€V”Þ°è7)Ò[e"÷Å•´·Í¤4ë¥ò¨ê¾-é}gInŸ#”×@¥YÉoŸKU¾OS úZ©Êk ø ¨* j9=M ¼‡Ê¥?Ë‹góR¥æ,_ºœxªò he6õÊ7PÕ~êPùZÊö¢£ÜõM ”X ”X ”X ”XX EVœ(¥" °@³\;9’Š&%%%Pé¯&«V43”iVÄKžX”34ö+³X¹ýND”3”–²Ÿ¡Ò¯ÌT-äñtG¼‡Š_Õ"ïEÐT¯F šI§ª‚IÌ…R™¡ 48¦¹Õ°` 6ס´@«}ÕWR¤gyé1ŸåYüYžZüÛ&bñ’'%%%%%–=ЖZÆ@ÝÚõ_f@YH1Pb1Pb1Pb1Pb1Pb1Pb1Pby´’]urKò¨æ»R»\É  zš[£"ß<«~,eøï@ínÒWIUyªIŒ­’ªrT¨0PË%߳ª^ v¼4D Tµ0~2ŠY¼4h" ÒbU T3¤iQ„@­ßïœÕçRM²†ò4vvÅ_¥å(rcMIS?ßâÏû ÑÔ¿÷žÅ£LÔ‚¦æí÷¨)Í$@­iŠXµÛòÉ&G±í#PkY%— éÉhJQ¥@:!š™bºuÎb NÂYüì;'I:ƒ8 œ$ÊR‰‹‹‹+)PÕßöÛýÍJ Ð<Є¼G Y„UŒšµxÊ©(ЦˆdižHƒ¬b§ðƒwTÉQÙ0Pä,@&R /¡I ÑÅdÅ–d _ÇNÆH]Õ)¢p¹¬‡§r’Þ®JRBZÄ/ùä2š˜¾ÍûZò h)ÙY^ Õz/¡Š?ZȯëД¤Ù—éx1ИDSùõÑ3%‰{~ΚŠ9B,J,J,K 5îä­“\¿kôÇ PiVz’~yë“p%pÎâ›ÅœPux¡?Nˆ¦!; ®œ0Pb'Õ4áÍé9ª*Ðä7üç¨~œ ÔÌbì(Örl 4ޖѨø¤¤3d1$ç—M·M²ÜRŠ,6ìP)GW34œ®÷ ŽÆ^ á÷\ ‘5kE¤é(æb(K ¢¤Cï€j0eTʳ€¨Î‰TeCºéûÔ‡%™bRvç|R’#Ó0ÕÏÇ@5Xñ4¥):Ô¯*÷@U¦ñ²ŠïéÍ# F¾Éâ-Åö ¨t ÅGr'€šbÍ (Ƴ¿@ñX3Šwë;P Vk ªöíÎy¶Å0hhÆ:ñh’aøã„;a ÄNˆ¦@]9¡šªŒ€:tB43Åuë$œÅ@ œ„³øÙwN’u2qþ8I”¥%%%%PßžA éWcU“h4  YéIß©ÅÃ1œ-„$Z‰}0N¸ŠÝìÀti9ò*ub´ÔR™¡ú§ùÄ&F†gÊÙiä×xv¼äØi­'©iûF%cE T—2P€b6S|bÆ@}ÜC !©L‹S8’HÙ~åXSï¯C‰Å@‰Å=‰Å¿!%%–%ÐwòÖI.Šß5úㄨ4+=I¿¼õÇI8‹8 gñÍbN2Jñ× ôkYÜi> c  þ‚Á)Pë»Z(MÅØˆ†MÊP’»¯(M)=P«õî(ÍËÇI´âÖPÙ¥¥bZ•@Ó ù5Sb ˆ]Û Rëª!Å–$é%rŒÀš-а3£#Ãi€Jß°ØŠªZï~©‰¦3ªÚ=ôˆ5‰èÓc @cgAÆ@5ªc­@UST˜ ”b •´J€â ft2ÌPJ Tµ JF «Ê$*egšèh:›—P•"óQúÖJ‡Ä@ã¦^l aªšÒÂ%Д˜"†aTã§l’3Å ÃhØ­¡2JÈ=ŒÉ”„©É0l€Z­ww@25FÌÐ$L͇Q5@/™3µƤ>Ë'aj;Œ*J!b ©9!š™bºuÎb NÂYüì;'I:ƒ8 œ$ÊR‰‹‹‹‹håÏûUOs‰ýûëçŒ =X4kZ…¨Ê’ PM “¨ê‘5Òçç$÷ۻƒªAQ΀Ò>Zãß»˜˜éc†¤&DÓ+ Ff¼Xò Ôx0¼ä¨¥%/–|I˜¦ MÚ‘~d©UÇ*¥4a™$Ò·Ÿvï%J®T>zZH.Mô^â_Ž‹‹Ëh;yë$—@ÅïýqBTš•ž¤_Þúã$œÅ@ œ„³øf1'¤@ ï­&†½ó’5òg(3 x'æÅ²Š·h(c H'æe2q@רÆI8_á$ —.¿çšB–@UN*?Šqþ {¢=P•ý=öjóŽ€z>Cd¹jõ×zYu¢O—Ut4YÍÜ %vÂ@‰d ÔüèÃ@]‡Ú9ñzͨŠ)Ò‰/gy=ÐØÑÊdÙ/Ú[U€±NÔ-0Pš¨E¿9^ò|RÊ1PýÅƉîвš¹Jì„;™ì@Í·ÈØŠÕ 4‚†"«ê†éHõ¹†Nª¨þ“’x ©…p2Ù†‰DxY@8™Ô@1ŸÌËT+Päg0óbU ý‰Ö¢dUuç„ hfŠêÖI8‹8 gñ³ïœ$êd â0üq’(K%J,J,J,J, Y>_À´È³KÄF*¹äÏ ˆ4hÔ´u*—øò±Ï_ñhì§à;yvæG½<ÐH#·ÿb­´€âGñgZÓ¾_}uÌ”·YòFøa[AZL|Å´lÚ‹X,k aa\ÆVQ5b T쥒Ž÷_JTê?C5,,Ú‰¤¨fŸªei/ú*ªº–gy£õ’$Ñb1jìŶ¬÷Ö’ÇG–Œ4QåR\õÒ*ÒS z·±þÃ?zzj*|¿i;d Äòô£§©]gà9B,J,J,J,J,J,J,J,J,J,J¬x E–¹”@]Ë«$@~~»¿ð‡4DVQ KÖÿâé »àõ—/í|b‡.®}wÁš2ÙG~ó¶heJÍ'_þ=¼rècÑ‹;×C¿Þ>Õ6ˆ(Ð9Å7ñÜ[sWnå•n´ðpzQ 3—½qß3›g?»²\±•C€XÍZ¾¸EÞ½äµ îyêuLÌxzÓ½K¿‰(P’(…„ñgOŸé›eì3ÑIEND®B`‚geomview-1.9.5/doc/figs/color.png0000644000175000017500000000330612310162311013602 00000000000000‰PNG  IHDRÜ׃³"qPLTEÖÖÖ‘‘‘ÿÿÿ•••ßßßddd¯¯¯VVV½ÏˆccIDATxœíœËnâ:€Í ww²ŠºW˜Wè¼Á™ªp@,é egi4ÈKºByÛßïŽclƒJ~‘¶ÁŸó;±Á mcÓ1t%Ã.í6½c× »´ Ø|žôºSÁ°Jˆùó×[qViÄnhŸÌîÚ(zfwlԸݥhòc#ìºOúúÍqÒK“v}8—–ÇW ´AÙi¼µÝ _ú/݉'ÆvÂyìF±N7É Ýn*íÈÖ¶§1j²X;QÜŒ]&.`âvGR“˜KJäÙÜqk>ÊÙ‰–¯ìh¦·€/©0nÇë"dÇ ;J;ÀôÐÊLåQ;þöBv·vs¬Nå_’í8.d'*s«ÙM¯|¡ëKìx£ f¦Àq»üLavGµ“ÁíX;˜’di;ÈlwÙ‘yTÉŽç²6v‚×ÈN­K»^ë ¾ÞÚ›üÒÑK£vÛëé2Œ*ôõ¬¸ê¿è¥mú뼌c«~æ0N•Ùõ#nÓÐîŸ 7 7ˆÍ'Áõ§± î 2søûQ¿*ÏÑîÆF8e«ÎEï%XaÃJàÞM»°Ây.PÐÞ´k[í,œ›é¸ ;7åÒq9vN9é8Ëg+”ƒCÀ-ȵC;›åá°[k‡èOœSkiùb8-äyªŽ”DþOWP‡Ù«Éîa5ëÚQP§GG*>ŽCÚ#lG6†t!¯ ãØvÓO§-a;’U@ ‡qS)a;`Ø…÷`Û&Ùa¯RI—Ð÷ È?Q83=8O»#‚›I^AG §RÅsTA…àæË$9ª°WC­!d3Uf†p¾È=#¨vÇrb.ߎÎâ²ììrÒq÷=ßÕÆ=Ýû>&Îù·… dÚ…i&Î-ÍÂ…J9?Ïø®@y~F£´ÝŸÑØEr&‡yœÏ.÷±ÈNœ4ñþííí—9êø÷m>~%à4;îãþ+„ Ú±Ê=ó§R¸ ]ÜíXïñ»Ú}ï}÷­íÔ1³‰] \ÐŽ÷HøSu;óÜRÕ.ò¹m,2ívõpÐW©ˆ{>»Š¿’ýÌ…™)>ªÝ‡[r¬;¸ôŒ >ªÅù»ƒËÏwh;pgœïjãô}êãŒÌœO•’vx>UŠÚÕO•;ffB»+¹ïŽ*e÷]ãÌ|4»Xw°‚]¬;˜m×¶'V±ã÷}•Џ§ùL bmô +ArÛÝBÏß÷Üv—pb8Vå;lm\þ|w3nÙù®¤Ý´ã`C»8ãlŽìªÚ5ÀGØÔ®nÙÙ¼¬]}\Ž;þïøy ¶õuáívmû*ëgb9ñ€ß½žs;Jn¤Ø•Ãí’ì·×"‹ßIvEq«]AÜjÇçs2©|;K{Pl ð™rì[[ºâ3Iû"×Ä%Ù!1•³ÉxdŠN¾š4ˆøJ5+1ÏNà  Îã°gÚ±¯²YUðº˜Åa ‡c8Óò žt¢#°qäIî;†cs!{ÖÞ™ €ÿìiá]–œZ|/-ñ|O/ñ.2*é¿Ëì?}Zx—e¯ÉÅLx¹ED’ù»ÀþÓ§‰w9Vðkñ¯ }ýü=ÿìiâ]޵½ÄâKîëåö_ ݽ»[!T‹1ýˆ|^`ÿ%ÒÛ»/)û§û!‘e²ÿ=ÿÿ¹ÓÙ»/iûÇz qÜoÊ¯×Øßö_$}½K¬®…d"”hOnìïòû/’&ÞåX!V‹¢åéèÚ÷ùw±·ïÃaÿErÆ»§¬PP‹àò·/j¥ù‹,¨þ›¯ÇìéG'u‘ÄþÎÛßÅšQõû/’Þ=g…sµP¨I'ˆÿuøÏþé Ç\Ãþ«„å]öå)+”×Â]Èj{ŒÏzã,¾—Á¿ìï¬`ÿ…Âõn`a>g…ªZЉ¯w¤Ÿ›õÞ0º›`Óo~3#¿[oXST´vAú}þaÿë†ëÝв|Ê Uµð+c€S´drŒèãþN <&cä%ñ‡ý¯¦wEþa3û»§ øËŸË•©-r»úûLz§#X?­)ÑO±&æ|ä%ñ'ggö_=LïšmÂUû»lûëwÛßW´mi{{=,oöè”è§K“´V,׈ù;[ëTØý0½kücé>i…x-ìeï±»wÿv ±‚[‹GßÀèÅ‘ zþÉîÝ.ô¿+8µx…ý/ôü/’Ý»ÿêæyÏ÷þ ì¿HvïöÂ?yÜø_$°ÿ"¡öçoÅ[T³ÇýïØ‘Pûó÷á+ð‡ýïØ‘ØöçnÄ;ø3ÇýïØ‘Øöo?ì‡Àþ‹öGäû/Ø‘ì¿H`D>°ÿ"ýùÀþ‹öGäû/Ø‘ì¿H`D>°ÿ" Ù_iû'}Ãÿq5?ØÿýIÈþÇQœƒøûk‰ þ°ÿû/’ ý þO§«ŸÇê Š¿¦c<‹ïÛ°ÿû/’ ýµÚÿ?ØЬøïc(úì¯Àþ‹$¼ïào˜>@fâ¯ÃøÃþwì¿HÂö'êW®ÇËðß{aÿ;ö_$‘že;ÿ”ý±ï»Àþ‹$bŸbþÁ±ï¿Àþ‹$vÜÿøVÊêŒâ÷?Žã°ÿ½û/œõ‡Èö_$8ç‘ì¿H`D>°ÿ"ýùÀþ‹öGäû/Ø‘ì¿H`D>°ÿ"ýùÀþ‹öGäû/Ø‘ì¿Hlû¿3ãàÏö¿K`ÿEbÙŸK¿ƒ?wØÿ.ý µëÀþw ì¿H¨ý{àûß!°ÿ"ýùÀþ‹öGäû/Ø‘ì¿H`D>°ÿ"áÙ_©ÌC¼RÏ÷²ð‡ýïØ‘°íŸœ?ì‡Àþ‹„½ïoßÇóùŸã^žéÇ{Rüaÿ;ö_$eöwžà¸ŸØÿýI¡ý ì‘Çyäð‡ýïØ‘îûÏüržâû#$°ÿ")³¿óìÃ=ìÀþ‹¤nß_cßIö_$=ÿÛ“¿iÏ¿FÏ?Bû/’Sgý±œoãûß!°ÿ"©>çŸ<ò³ØÿýI½ýy§ú¸øÃþwì¿HpÅ"Ø‘àŠ?D>°ÿ"ýùÀþ‹öGäãØ_!óÄÏØŸ}ŸïšÀþ7Šcÿï_yýH¾”ä#Ó˜¯.þÆþ-éÿ ûß(®ý_~~}=–ØÄûø*ùúH¶å«‡?µ³íþ¿;þ°ÿâÙÿ±äÅòñ’z)ÉG¦1?Röoÿ+ìƒìŸZ$A¿\Òé²û#ò Ùÿ_ƒ¿^}ö`D>Aû^úïþõ`öGä¶ÿèC^7Oˆ=Ø‘OØþéãHÛÙƒýùDì;&…ã~Å_¯Åmƶ?¹—IÉm½âø¿Âþ7HÌþ5ÕH(Ñ6‹øû`Û¿%þ°ÿ·É‹Ä¥ü¹^°÷úë쯎çzl÷ô‚ý‘lŠìÿ2Ù¶Ô²Â,yÀ+_ò™ÉO9=‘l‚mö|çÑÖV¿ðí¿Ý»Óº÷1öG²9kÿBlŒJWáò"Ÿ™˜ˆìZ!g÷“ ì¿É>ü0ØÉæ¤ý7Rä5ú˜b’Nîg¦&Òÿ2û?¶þKìß Øÿ9g ʾ-½ý|nºÇîÛòê–8…N”ÿ™æsÔ1”¬Q1µ=~Z×§¥ý ç°?R‘sö'd¸L« §ƒŸíÅöÍÄŸ¬@ö’¼Ï´?Àt¬ùøÓ‘éÇÐsø7µìû#ù$ìïž‹öꙌhÖR¥ƒFËqìoO î3¢_­Oõ z¿œ‹i3{M"kÿ£ç?û#ù$ìï,øÊ7i_C„ðv­B͆µYà Í›ìÏ´ß{5o™‰˜OöWdè©6s¦'añÀþ·JÊþörü0SÈþ¯Ư¯†¾”÷q^£ûÕù—}&ý29gB_ùò· V‡ØßšžˆýÛáûß!)û{[ÿaûS^‚ø¿:Û鯯ÇÖ{„®,þ¹Ï´9áZOõ}QjgëöG'Ùóïíü‡zþ½Ž|þWåêHÖ‰·íïú:û™öÚç€>=ÿ…€üi›YøÃþÈðœ>îÿØŠ7K¶Š¡~€eÌËÅ߯†÷™æ=g3Á%‘ð>QbÛ¿iÏ;üaÿ;äFçüK¨¼"Mû·Ãö¿CΟó¿JFÑû#Óæ6öD#ûÿmØÿF¹ý%kÿܪ¼ýÒßËþÞq%¤8øßÄþÃ’±¿³`Ù¿uzØÿXzÕ§Àb|ŸÍ%„?ìß49û†gíßÿæöÿÜ–ããˆp³Åìÿ¾õËè{`/øk³ÈnbÿíÛ¼@ò‘n5×þ¯%ï{! &6‰'Úf±7îbgiF²o4×þÏårHG²ççñ¿uöÿÝXûÛÛ²H.òmæïû¿¼<ƒ ËÏßäçvÿö?®ý?ûÓž¬ó“¼z4™·ïÿ²9•{üö7œ«ýÆ¿êx}Ü ˜…ûÿt`;HZ´X¸ç¿Ë&L„=Ö_FÑÖéV:ÙüsãÑß®çøK„½2û‡oý§˜û=íOŽûƒÿDL#ÉâûÏû?»)þf« ýìb‡n"ÁþWŽ˜ýuèÆ¿3Ú_v‰¾bš5ì?[ÎØÿèù?¿ñßÓþà?vmûÏ–3ö7Çý½ñ¯ÕóϬBWû£0gßö¿rNÙ_® }íø‰l‰6ìÁœ³¿X:Ûÿs.þÿoËèz|¦¨‡ý/˜»ÚþÿÏÉØÚøÒÝþÛ©è™®£½Ôö[¼lÝógèçTŒûô“•‘Ïmí?ÿ.ùã×&énÒÚ}KÅ‹³‰ ܺ±¸“°F³^è3OÂl˜ûÚ,ÿqô®B ÒßþÁ—n<ücÅÏá_6‰c´þÓ…aÿ÷¦gÿaüçѳ 6Çhû/*u¯7QÏ N"·Ì¥)û¯ægplrfKhœXíÔ±Þ0ẻqN-††aÿ¦ôÿhs°ÿ|òû¯ö¶P¡¡ýí¯Ìu$I0í‹MBIëWû;<¶2?Cã„kgáŸùô±aÙ¿ÝÇÿý;ÒþŸ±e¾IjÐï· ˆ­ ûÛßœ0¾#Â_Õ¹}ÿ£Ù–WÎÏèÆ¹Rtk’ÑÚØíq?u üÇÝçÿÀý?;íœ!¿Ï: Ú ÃíÛ¾¦/xøkg…a_˜EQ9“ ã„k·þw¶{þeÐo¼ ˆ7Âà}ÿ UøÛ(+:…ŠîD~‹Aï;+àkû7å_ýv«€DŒ¶dÁ©Ä?°Ñ¿ÿ[ÇQÉqôjøßÛþøoC~›u@ªFÛW®ƒÿ^(ÿ`ø;ˆ¿ÒÑòÉ®?ò_¬ëÏš‹Qý?å´F_xìþlÿè?Ó÷gÎŒ¬'ÒRþÂcEé±Ãí8^¼vþäcè¯óàwû›Áçñ^ä ®Òó~½sþk˜Îi£Ø?Ù•í3‡ý?eøï¾Ä* 3ç×»âø›Ø¿%þ£íšÿqèŸ\äæö¯g…ðíïÝÀÛìË»HÅ™Æþ'øÍ=MmÃd›¥›ý§Ï$—Å+¦E>%>Þ 'ö¦RhÚ}iwhÖ}ü<ö¯ã4î¡T´K¾U.dĤbß_Ùk-ÿö/ç4çñ6 £Q.´ï˜”îû›s zdif²ÿqè‹yÀhÆSá5 gvaÿ+§Ðþ¶òó§?æ2•ý?Ë6F#žJA›ðZö¿d*÷ýõ÷ýéûŒe}4áé°›„Ù °ÿ%SbsŽ•sÓþfyf³?ŸÿÑ|ç"5Ÿ°ÿ•sÓG5¦³?›‹Ñxç"3—ìßôŽ2H*µçü'.Kà?ý™dŒ¦;ŸóóhihÿÑÜ9Õö—8¥aBûzÏ· d4Ûœd›ƒu„£‹ý‘aÁ±âñ²£Éæ¥zöN´\zZ±}dTpÅ_°|:£Áæ%3mZ.9-ôüO\ïŸ*)=šknjæílË%§…žÿÉ‚ëý“åƒÅGSÍOñ¬o¹ä´`ÿÉûgÊF 5?«o ^ùä´`ÿæ)Øï×°®|`ŒÑL—¤d¾dZ.9-Ø¿y zý4ìŸ+ÿéuŽ&º,ñî>Øÿ’a7æûŽ?ì/ï2è²°gKªå’Ó‚ý›§Ø?^Þe4Ï¥aΖXË%§û7ìZð¼Ìòî(£i.k¶äZ.9-Ø¿y`ÿЂç½`–wG syX³%×rÉieì/y.{»evîÀþ¡Ï{Á,ï¼ÍrM³%ØrÉieì/Hÿm7(`ÿЂç½`–·_&¹.ÙÙ’l¹ä´²ö—\®î™ö/¾  KÙ4ÈuÉΖdË%§•µwÈÓÂ$2þÆÞûœ››ð‘[ôÒ°íß’þ¥ì?šãÚdfK´å’ÓšÎþÒ÷ã/ŸŽ?F¸6Ü)—㟱¿.9•¨´°^Èþ£)®Or¶d[.9­Ùì¿“&Æÿyüc«£zü)عö×D¿—Ö Ù4ÄõIΖlË%§5™ý e‚;Eq?׬Òå¢ Û_ÙþI‘ýy3óþ^ZX¯cÿÑ ŸIb¶„[.9­ÉìO‘Àóû¯Öà’Ý“ þÊùþI‘ýyóSÿöMð¹DgKºå’ÓšËþ¤”‡žy¹?æFy˜ºÖöJÀö±v&-Ïÿ1Ò¾ûO~þög”ÿþeå“ÓbÚ?¨À¢pñ$¬Y¿)'Ö4lüI‘þþ¯ñ9>gÿý%™5ØŸQþx=šß³‰Ì–xË%§Å´?Ù$ç-J^ªñ7vOýf†ñwŠXŸæwõeª”{ÇNR°Ôþo™hŠ¿K²½˜ýGÓ{>ÁÙ’o¹ä´¸ö7 =k‘CLéÇÿÁN=ÿðv~;ü™ö¯Àÿ‹ÿôö ïùgK¾å’Ó*°¿:!W“2üÉ~²%ó¨Ú3?BSaãoí|ÄÊÅSÞõ×Ìþß/bÿÑìJ$0[ Z.9­û+ÚMUœ™ð×ûtWÀ¯„©‰Ù݈–‹§üÀ_+û?†^Âþ£É•Éø—ØŸ,ÄÅ©Øø7;ö‘•Ax{EALo,¾PT¾ÑJ(hxH8âçükÿm9üç¶ÿhn¥2ÿû¯j2þÊúÎU‰øÚÁÿY"¿U|iûÆV*ãñŸÍþÊú-c þÎÙ;N%âŸ-Osû³ñìûóðŸÚþ£©•Ëpü§²¿…”ªÅ_–w ZӦݱ:\Êþ%]3Û4³’‰Ì¢`Ë%§5—ý©þ醺ÖIàóø;S)Àß›x¬\4ÓØÿ*=ÿ£‘•Ld[.9­Éìosy¼r8ýq¡öZD{SñVNè‹à'FF=3ç'zþÃô_Õþ£‰•Mp%[.9­¹ÎúÓ´“Î25åV¹3ðw¦R€ð#£Ó¾ç?”oÖõ%í?šWéfQ´å’Ӛ묿ç'ñ“!Öûæ¥ÿ#XÄJþ¡}‰È¨Á´·þ“øÏkÿѸJ'0‹¢-—œ×þqZ˜¹ó½þJn†,aÿç(×´ÿhZåSÛ¼ÞÿŠáÓ/dÿ?øÏjÿѬ¶H]K\ðzDfßÿºöj‹ÔµìÅHìû_×þ£Im“š–€ý/û?A¿¢ýGsÚ*å-Á/Ÿœì?YÎÛãüŠÇýGcÚ*å-Á/Ÿœì?YJì:ׇœ¤¯fÿÑ”¶KiK”ON öŸ,%öëg远ýG3Ú2e-QÒrÉiÁþ“¥ÈþÜÀ:H_Ìþ£m™²–(i¹ä´`ÿÉRf w÷Ú}-û&´m`D—ÛßË›þóÙ4Ÿ­û#¥=ÿ)ú™øoƒôìögëÌiþãaséNÒ’)=î…Ÿmÿç@=¹ýGÓÙ>3Ú_Ž~àÏJõÝ~\ø#ø‡3½ýG³Ù#mZ.9­Œý‘Þi}ŸÿÿznûF³GÚ´\rZû#½Óô)?ËÚ4™}Ò¢åÒÓ‚ý'Kÿgü½Í¿ï?šË^‘o¹Ì´`ÿÉÒöAú?ôÄöMe¿H·\nZ°ÿdÁ~ýŒ†²_¤[.7-زt·ÿ™ì?Äÿò±²-—Vö¸ÿš)¸ÁÖ$ù«“ì…ìÏZ™”ޝFÙ…ÿ>2â“%[.?­ŽÇý;æÿÑU(Œ…?Óþ-ñŸÈþü÷ßaüK¶\~Z9û¯¹ðþwµŠÃþ±ô'ð_’þŸ.×rùäíÏ]~§ÊâøÃþ&ýùû÷ß©ù‡ý³Yÿ#°¿îôýûï`þ¥ZŽØ¶píÏíR,-¬ç²oö\øG¬dZŽ“Vöwž¨×;eøWÕ}Ø©÷ìßè;ù0íÏ>¢PZXOeÿÞä…蟌ÿUìÏXô[­ ñÏü<<0::üóö?¦ü¨à§*úœæl&±_ìÂð÷_H´+-÷ý;ûo4+½=‚œ<ÜziUêùæs¼½ÞŸŽêTaû÷¥.NÿLü/fE´Çs»áåT uøïµQ¦†Ïj[Ï?FPÖOeŠì¢ ¼Ã¨:ßþÍ–Úí—Ö\*k<{Ê®ÂöïŠ\ þî+€³-Çý+4·¿RæÛúEÅ–STÚŸÒ“«¶ƒ°ˆýŽfÍg‘ýÝöQü£CL¦°Oàrô÷åÿlËqÿ }öý ö/;[Ò©éú{VÉ"Ç­¶¦mzBs¦•5„7Ÿ%ö÷~ì[UûLYs-©ÊÍbÿž¼å韅ÿµì¿/‡6þÖÀY6þ5©¥ UÛš6þdw‚Sõ3öw^ºs™*IÊObÿްqàï¼8Órü¿Bsû+² Ùp˜eNœü݇À)þfs!cÿmbŒùî†§È £ž¿yÿ›‚ÎÏŽÙð|ú^Q'A´¹3IÿBûàÍ/—°¿ÿýè?Ã?“þîö§ëý¿ùñ·o¹m‘lnŒŽ[Bfu@ðÿ~¹ýìÛó¿ˆýeðïIÿ þÇàϰ¿ µƒ¿6CÝ’þà àï=ñ‚ó(üËìO|oõï]Ìþ•ü÷…¿~ðkjû?~u÷ i þ;°\“û›Z+çwÿm%sŸBƒÿãÕóE½ýÍá¾7ûàÞÅì_Çúëøÿ5žýÍs+Të&ùÖ óû&‹ÿ±áy8Çñ¼Ààø7ïùÏŸö3‡ýÏò?þªŸþ!öß±Oã¯Â?{gÇ_™uxè*û!ÛOúÌò¶½!†ÿÖÊWÕöÎÏ_ò³ÆYŸ.þ¥ü¢¿˜ÿ_ÃðgÚß%ÚìÚÛÛÿ3á¯ûïU6+ë=Îïñ/°¿.Ÿ þSÚ¿Œÿqð—®~Ãÿœý—Â߉k{Š¿½vhƒÿ_sn¢DÏ¿Aïüç´ þcé/â þ—µ?§ç?È7Ù\h‹ÿ{ ¾ý£ñ¿¥ð_åœÿÏü¦¿€ÿ"úÇØ?Òõgt íúã÷§öuý¹o‹âÿ?“ZûÓM}þSøOb&ÿ£Ñ¦Žþ®ø3ûk÷0ØÎš¦ÿk}¬è±³ÎáŸõgíë1ÇûV×Às° þñ ~Ùöà¿ýrÿYíÏã4÷{ªèŸÐþO†b¨f§þœ½gâã_½ïo.ò³YNã¿ÌŸ!üóü†ž¦‚þ íïmÇÿêü·õûþ!üÍ+Æ?´É0­ý+øM¼iúûÛÿ8J~Äúeº,ÿû¥ë þöÁÁÙíÂ?ÉÿhÜýÒßÿ¬ý{!›E.øma« @‡ðwOXÐþ)üG³ÊÌøgí߇ É,µýíþÀß=7èXmè…ìç4éáÑ?›ý•sÔLkw#{÷A8§ý(RÛc!PÃ>•kh÷$íãïѬ7ô¤ö/á4æñÈÑßÝþÎ!së4ú^Š•y_4slŸ|¸]Ü0­ìï¤=üô¿mk=©ýÃøùÍx*lú;ãϰ¿½ô.„¿ žõÁ¿[Dí;ï'„þǸ«Ù?ÀÿhÀsaÒ?§ýÕ㤘Ç+úÿq`{­Ž„ÛÒlÞ+ßa¨ÍqÅ_øœÿ}€S뺚šêIÚ?Aÿ©‡|ÍnÿÑtçãJû“]wÏþÖ™²naû,Ú>ÙÏúÓ)üýZ÷ª¥ ýÓÑ6þÉÌk–þG£Í‹„ü‡Øßœ"À{aÃCŠÁŸ~4§fÝú&í_‚?³°žÍþýæšù±¿Öqü·®tƒ¸é[Ÿ·Ömü3íψÁŸ[X¯bÂÿhªùÉÒ¿¨ýék¥ìbƒðßOÙ_koîfØøgÚŸ‘jü°ÿÎÿh¤Ë’¡Aûkçµ[xо?ùhëÓøwÝ÷?y½?#W°†ÿÑ<—æ$ýcìÏíúÓö€‘][ý̉6uÕº{×_ôv°¿•8þÿ,ÿOôwÇŸyÜ?|ào§è¸þد&‡Òv¨Fáïžä·¯¹œZwß÷ßîö·’À4Éu™ÿ‚³þ(ÝX®È"çüŸ»Û÷qÂ¥…õRö_’ÿý“Úß;eøWGÄþ\ ßK ëùì5ýŸ¢¿¿ýùt§äê,ÞþM3›ý/¦ÿsòÇõþ¹âaiÍ,IDAT,Þþ?QÊþi’\7“S#YÉþÀÿLp½ÿHÙ?Ø'à¼yü öoš©ð/¼ÞŸ\(ã-hîò”ÞAhw€HÏ¿9Ò?vÏEÌþšœauÆpøÙÌ?Ò9ý/ÅÿIú‡^ïo‘‘ß­7¿{o6Â0r½ÿ:ø³ío™ÜúoÞÀhN¦³?ð¯n¹Ì´ ¯÷_ çzûŒ…a´¿²_ßÎ⿎ýã?Eÿ¼ö'gÏÛø“­NršOèwët›–wˆ]ïoÁb_ðÓs ¹ïO/UÖt®"w4ÓÚÅ?Ph-ûÿúÔ÷§;Òæ ¼oò›.z‰]ïonFpTcNüùûþþ:.ׯçª?‚ÿ\ö¿ÐÖÿYú§»âïXÚr?½1šâï|´²¿·wçĿ۾ÿ¹ìýŸ–ÿà+þ(÷ ìÉUõþ#ñ7Kº²Eõ÷ügî[fÏt¨ÐböþÕ)¶¿2 ‘Ö6Ì)ëÀ?p½¿ Ul>üÏ÷OÆÚz‹â?™ý¯Âÿyú‡Úß]äŠðWîMñß?—.î!üw]v‹ì¾¿>…pÔ íü«[.9­Âëý£øó¾•îØõ·WMoõ7Õ&ÕhYXõ¤ì¯ìŸÌ :6ã3Ú_]nK¶\rZ…×ûÈqðgø#Cúáo=åçøŸž 8þ<û7ËŒöOâ¿ ÿIùÁ×û÷®øû¬ÀÿÇþ’›þÛ×ûËöÿ”ÆþÓ{þ³Ú×û‹öÿ¬ÁÿúOÒ?«ý—ËòøÃþ¡òÀ¿ªå’ÓÂõþÝ#s¯?nJ ëií¿<ÿiúgµ?ÝÒw.÷×Sîìçü›Òý–aÕÚ#s§_fÞK ëií¿ü=ÿÒôÏj—z¨ŒDž&“~ÝC##cÞg]â>ÿG±žúÿú’žbFþÓÚß, >þäÿiòת¶SÅñuÅ}þ?+ñï¨ÿ¯/qþ3ôOmråŽ{ÖÏör?›‡^Ûk ê¶‘Â?tnR ®]ª'eN7šâÏ-¬'¶?ð¯h¹ä´ÊŽûÇñ÷Îðµmxg??;þîù‰Ñ³‘;WOÊþÞ’qðgÖ3Û¿ÿ__âüçèŸÙþÞ9¾äweÞ$› оß#ûÖÇ» ×µKõÄìÿ–Ò¹‡?¯°žÙþ½ðÿú’çNü ®øËnü;HY×úÇï>%žØõþÇ@]¹iZ=9û·ÃRû÷áÿëKžÿ,ýKÛŸºÖÖ.ézŸR±)ñojÿǦ~ÿIíüG^ïïâoºÕcÔš¢52óãÊþ;Ýü·]ýþ³Ú?Á¿©__ øÏÒ?µýU°ëÏîÖó6þÍ !]šíÕ3\×.Õki÷9ügµý}5à?/ÿ™íOO¡ÓÚÞê?öíÝ[çZ·ØÞï‘èYÞ?¯®]ª×Îþí‹Ú¿¹þŸÔÿ÷IþóôÏl7½P©Ê-Îù×>þ6صsþwø÷€ÈDôOm'À¿>ìïb}®ëo^û7ÆŸÀ¿­$¦:-þÌëý­Lx™ÍòøWØßw:ÿÀß÷ˆ+Ù?ο§ûÛàüT9ôÏjÿå²<þÅömѧð·^¿…ðŸØþ=:ÿ…3/þ¸Þ¿wÄí¿±Ï´ÿÛZt[q,eÿøm?GcK”~™EÁ–KNëÒö'»(ö‰ æŽÅ©¨hkôhõdíOõÙ}±®¿?æÜ€ýB€µìŸ¸ëïhÎÉË8þ¶¿uWû§9 ‘þœÑ£Õµ?=ÔÇÀÿíÍi=û7Ýûoø¦ÿpü/lúôžþ¹ãñ·Y£G«'jÿ7º!ŸÅÿÍà¬Ö³ÿb{ÿ‰=ÿáø_ÙþôŒ#òS[g“s“Ïû²Sòøç<¹$0zÑMÄíÏÇÇþí¡ÿñëZö_Kÿ‰~¿áø_×þæ„>û[krŽ¿}frî¶Éѹâö/ØøˆþÏo'`1û~ùä´.lzN¯{YÏÑuç¼é–UÌÑuÁcB…{þKºþ¬M…7²êXÍþ+ñŸ <þ—µÿ±äwÿ¯wô’ŽñãþìÖ9ÁÖ¹«ÙøÃþ±ìwû¡· ñ€»{ $þÅgýñNû±ËX£,gÿuøOÑ?ÿÛ_ÑÿŠsþ9'ýúòÖkØ?ÎÿhÜݤèÿUí¿Óèwç=‡j¿SÜЀvý9ƒÂ£kÍæ¿ÑùK~ÞÜ„ ëEìüaÿpüƒþLçuXÏØœø³…F>ðWy½î‚ß8ý+Úþ“ôÇÿªöo3iþ~< ïöîÍ ão¸žý?¯|rZ—µ¿øTÅîÖô^ä0`쬿@7á’ö_‚ÿ4ýãñ‡ý¹‘ºXã;ý&ñeEû­ŒÿWt¶¤[.9-Ø¿{pŸÿO ü¿¾büFž&Fÿ×Wd¶Ä[.9-Ø¿{ß矇ÿüöã?ÿQùÏ‚ÿ•ížwÚˆw‡…6õçß÷—Âzû?î»*þÊgK¾å’Óº²ý½›’Éã<”'²ë/iÿdN=âszû§ðŸ†ÿ„ü'ÁÿÂö'‡ñä9n8ôŸkÿL´…?³°^ÃþÛC8ÖÄ«|`¶´\rZ—¶¿ÊÎquÿv5Àóhžy臲Îë;^l7°ŸtâýÊ­ž”ý1øs ë%ìÿuü¿&Àÿºö?˜žÞ«÷§.í×Ú=¿W“5„7‰Â³~ÅìÏH5þ“Ûÿk þ3ôÏ€ÿuíOñ×ÁŸ†Wr~¯fvÜÝS–^À­žˆýß™)-¬W°?yßzø“ÊÇÿ²ö?öÞ­Ëv¬k€·"Ç0¿ó?€?9û_rãŸa.Ð聾õ öÏâ?ÿ9ùÏ€ÿeíO¯÷·¬¯¦Í‚pRü˜ÒöRlã?oÿ¦™ÞþÖ#xWÃߪüpüïeÿ­„¯t«ýßÃ?0œN•Q=û7Íôöþå“Óº¬ý 鉮¿G`ןÝ+èØ¿u×ì/ÿùùùõµÿ ú·sÿêZöÇÇ?zàOïïYoƒ·í}ëxaƒ°¼¼GÿÚøgQ²å’Óº¬ýýÁü¾ù¶‘²¿{ˆ2—£œsnƒ×é1¹ý]€&åŸGÿhü¯jkˆØµú‘²¿ò^¤£ÜWÞR…yíï´6þ_Ym¹ä´nb©kõ%"fÿ}¶ÈqÇcß&|ãxÿy£¦{B&sÛß(Ìÿ”ø*˜EÑ–KNëöŸ*²ö7Ç,È£3ƒÆ*fßËt!ûšRÿ\ùþa™,?Ûþ÷šÆ_»¿™Lmÿ@3êŸMÿXü¯l{©žeë_Òþô,QügµˆŸÿþ›Oÿaùÿ÷_‚Ø_&Îõþ{Âø÷_)HÚ¿þ“Ú?ÿþ§ÃÿQÕ(ÿ°¿LÜ|'3#þlûÓÝÿ ü×Û÷Ãá6ü÷ºÎ„ÿ•í¿Ë‘öw‡÷t¨ãõÞÞºzzþ#ø[½JÏ þéô—pPÞüòÉi]ØþÇö-éä¾´NäíP½YŽûÇ2¯ýcðO§ÿ4ýÞ  ¼%øå“Óº°ýÉîm`W›¡Öt‡êIöü[/Ò)ÂJûGÙŸMÿùûk€Ò–((ŸœÖuíoíð'×íφ?ÓþÊþ™‹wÒo,ÓÚ?ÿdúçÐo­J[¢ |rZ×µ?½Þ?Ôßm÷–M…?®ø –OÁ¿$þdPÖ%-—œÖmíO‘Ÿ \ñ*Ÿ„*þÙô“ì/•À¿aû{]}ª'r¯?nJ ëiퟆUü÷ì/þäº}rà¯KõDîôËÌ{ia=«ýÓìÏÄýûöÊ Îù¿á}þŸð«ëᯞ+Ø_(Ëãûüûå¿ *%üO‚²ÚÏ™ú‚ýe²<þ°¿_ž“9ô’?«úmZ.9-Ø¿{`ÿÏâ…XñÊΊ¿ÐìÙ¥`ÿp–ÇŸû„ßL4ÅŸ[XOhÅÆcþ+è?øg5†÷¢>×¶¿ÅoöÄ×).ù)}Âïo+"øÏdÅ.¹,þóûg²Ÿó¿ÒßÃÀß^adÖ•« qûÿþæ_Çðw×ü'²ý!þÇã_Ò ìæ€ýc!—üXŒrð×3à_f—þƒk}ÿyì_Dÿxý×É¿`>aÿLèI¿˜³zÌÙ¾Š7WÃ' ™wi¡è­Jª'kŸþlØøÿíü>­ýËèd&üË›„Ù °,.þ»ÚzþÚJ’ïcá|‡Ï.©ž¨ýCôoüëøÏbÿ úÅ%úó ûgâá¿ýçÙß '%]üI!zb0Oÿû‡éò¯£øûÛþsÚïò¯[ÒGâ_UaÖìÂþ™øö?®üõ7þ}ŒUëJââ­IûÇèÀ­W·­úMÆà___Æ·´ÿ÷ë‹Ú_‡7þm‹;·ˆàoÝ* üR!AûÇéÿá_/¾ïžþGzò}æ<·´ÿÇO®aÇå:€¿ó>×þî qü_~þ û§èÿæ_¯Ýó/DÿbÉÎuÛ}ÿïõÁ5ìoŽû;]Ïo§ ï'æ§)c÷óé>]¯?†ý7‚wŸ?Í@ÆÿQà7oNûß“þü|7Ý÷¹Ì¾¿ÖÇI<Ö¿ç…þæ• à¿•qï@öýé­ ùßñ·/µ·÷ýø‡ìÿ¹ýߟ?ÇÄÿ·÷ÿ”ö¿+ýÙ9GÏ&‹œóoЯÜ÷¯Æßöã?Úþ÷¥?7ïèùÏdüÿ·µòãUUÏÿFýoþ¿-á[?h?¡žÁþêÎôþÃmã½8ñA°÷äñgÛÿ7Q9ÿãßþmŠë‰ì¯ïÝ"©€ý3Yÿ'ÿÏ•ößÁwðÿèú+äýoO² `ÿL–Ç¿Àþ±}ÿÀ_ú áDöýŸ©F€ý3Yÿþ·Ÿuöwý…ð_Ãþ ÿ‘h3Àþ™,¿@ÏÿYü‡Ù?Ùíu§Äº?aÿLÖÁÿ·õ=ÿȾÿqÚO ÿ?³÷üß¼ËßNxMûg²<þeûþ…'ýÎ|ÜþV‚Íûg²þÿ{?sÅ_5þ“žõú„¤³ýÙˆš'³Wûɘ5¨Ÿýç=çô{ 4I_û"äTf¯ö³i­Ô]µ+þ@ ~£ô´?Ò+uwûIÑ¿Øõþ ?¯Y:ÚŒï™û×Þìk»ý€þH¢ ÔÞþH÷”Þé7NÿJ÷úS ?š£i”õkû#ÝS|Ÿÿ(ý Ù_r‘¾^Úµì?[ÊŸò£}ПN³Æ‚ýgKÅ3þ"ô/ÓóïlÝ"^è¾ìåÔ<á7Lÿ*ÏøÃn?#¦‘`ÿ+§æ ¿‘èÄÆ´°îmÐÏŠ¿‰ÔÒþ£ƒß8lû³V&¥…ãk &öýÜ´h±˜ýG#pç°íßÿNöWæ’Iƒ&‹Ø_!sû+òÉE¾ÍÂöAÆæ&öWô’x£íÿ‚¯á_w°¿½4#ùH·ZÈþñ|¤ÞDÊ’iÌœý¹= ¥…ûÙßÙ–En¶ ý£KäGòm¤(éÆÌÙŸÝ‘XZ¸—ýÍm½@ALÇŸÄIR¾ý?R_/™÷ñÅÿúnÌäûIû7Mû#§#¿cÿd^2ï#É4fÒþ[Žç“Z¥Ï,÷Kúo…ðomd†¸öGæ ÃþèñAüa<ü[Û™!Žý‘Y±¿ƒ¿ÚžE®<ÇÛøoï+úÜsØÿ~qìÌ–ý•õ*Ž¿r~8¥aÿ»ö_$qû?ãÐ]„¿[ö¿K`ÿEÂÛ÷?V§ñ‡ýïØ‘°öý7þaÿ;ö_$M÷ý]°ÿû/~Ï¿ nÐï½áž›Øÿ.ýIÔþÁ×~TàU,°ÿ]û/’¨ýáûß!°ÿ"‰Ø_…^ñW¼r;þ°ÿû/ïzÿ‚g‡•>h ö¿K`ÿEâ]ïÏÌ{iaØÿFýÉÕîöƒÌØ‘\í^È ý ìÈö_$°?"Ø‘$Ÿñ‰…?·0ì£Àþ‹$øŒ¿ßÞcº­ØøÛ…½ß`ÿö_$aû§ùwìoö~ýoØ‘Džð›äßÝø§…½×°ÿ û/’ؾÿº±U€·ï¿þí½„ýoØ‘Dìÿot ÀïúÛ ÿ÷üGF‡ýoØ‘Ä{þKðß ÿþýÛ¼² Ãþ7 ì¿HDízûß0°ÿ"‰ïûàO ›Ÿ¿±ïÛÀþ‹$jÿDΜöûß!°ÿ"ÁYˆ|`ÿEû#òýIÎþ¿ÿöº‚ÇýýÂØ÷¿m`ÿE’³? ÿ?¤»Ÿôý[…aÿö_$yû›ÿ÷û‡ÿ‡ýoØ‘äíoþßcãO”O Caÿö_$çí_†?ì‡Àþ‹ä¼ý½bÉØÿý‰HÏA×ì‡Àþ‹D¤ç¿àÀì‡Àþ‹gý!òý ÎúCäû/Ø‘ì¿HDì_pÁ/ì‡Àþ‹DÆþüÛ}Àþwì¿H„öýÙ7û‚ýïØ‘ˆÚŸq«OØÿý‰Ð¾?ûFß°ÿû/ û—<æö¿C`ÿE"`ÿ¢‡|Áþwì¿HÎۿ쟰ÿû/œõ‡Èö_$!û3bðç†ýoØ‘„ìߨÿý ìÈö_$°?"Ø‘Àþˆ|`ÿEâÙÿ™Ò°ÿû/×þ\ ßK Ãþ7 ì¿Hû7 ì—Àþ‹D}ÿ•ˆý›ãÿ ö¿x`ÿE¢>~ÒÑþ?û_<°ÿ"ù^Oÿ¹Ÿýâã¿mƒŒ^l™­<à?sÔË‹Ù÷Wê@•¼´c ÿ.¥¶a*>Ê>Ösß?ˆÿ¶ 2z±EdB¶ò€ÿ̱zþ• lMðŽBñöü?¶AF/¶ˆLÈVðŸ9VÏ¿åò‡Ü•>~<õ¾½VG!ÿç }´cäçTÏÿ öý/²•ügŽc "uõ¤ÙÁ]Qîi!3nà¸ÿ]‚žÿEâØßý§µ· Cö5… ¾ëŒŒãþ· zþ‰»ïÂ_)åà¿ ã¯ö={dØÿ6ý‰oulùû{úØW0Cìwµ7 Øÿ.ý‰×ó¯<Ò3ÿAü±ïëÀþ‹Äµ¿ým÷ü{´çßÇ?Ðó¯³=ÿ°ÿ•û/’âãþVTâ7?°ÿ]û/Ïþñ‡ýïØ‘Øö'½v<üUì—þ°ÿû/\ïÈö_$ÎÝ~šãûß!°ÿ"ýùÀþ‹öGäû/Ø‘ì¿H`D>°ÿ"ýùÀþ‹öGäû/Ø‘ì¿HŒý÷gñ´ƒö¿K`ÿErØÿ½þ°ÿû/’Ý»ªO`ÿ[ö_$Ûzú¥W`ÿ;ö_$ÏõôKǯ”ý;mƒ ­û¯õ$2–Ô›•cÅíßmi؉<×ÓQR?’oW޳Ïm|µþ‚ýˆzìsÇ¿^2ïW¶b}Qµ ‚´g+øÏõò‘ÌKæýª±"ö.GUÛ Hë°¶ò€ÿÌÓ3äÕ¢É6¾Z1¶ò€?’K›m¤u[yÀÉeÌ6Ò:€?‚Ü8ÀAn›ÿ)™Û:¶µ'IEND®B`‚geomview-1.9.5/doc/figs/main.png0000644000175000017500000001032012310162311013402 00000000000000‰PNG  IHDR6o„ÓTPLTEÖÖÖ•••ßßßddd¯¯¯VVV@`sIDATxœí];Ûºæ-<§½.ŒôÉýØEêàlÚ) ·²`-ÿý#rfÈ¡DJ¢DY’¯Ç뵞C~ú8$‡/)õ òŸc$×ãäÓG¼jpœ"¹O{x÷Òàøy‘r=^v ×S¼oùˆÄ»[•x÷åãºwa>þì\.'äã¼vž9SŽÄÇïUòÎjòßóqüDnoJ.Ç̉³çã,ÿzºlT®'±#óÝßqõf˳k“ï’q\®¿S|ÜüöYÚΉƒV<ž¾³uËpÄ[bvq|`ç!>Îê’ +…ÃÇGÜ©òúAÔqÌ.Èá8 ð¡Fà.1ÏÜǼ‡™•ÀÇ¡ŸTnSˆý6ÉÆ=ÂæÇîŸÝ'й:+J-‰;Ý=6í5ØÓÚí¸´ÙcÅŸ&î˜r© ~¸pr·©CeK„Cy¸9 .fgº.Çã8>0Åëþƒ&p©™pÐMÜIfã̈SžûÇ—\.Ã8¼.˧«ƒàŸQˆÍåÀÖx¶©¾GûNŇåq¨Ë8ȇêçƒB~uö¦JŸ‹:ø­(X=ØÄl®lq7ø‹]Ç>fH› ç°;çÃKàã$ƒ>­Õ 5(ŸÄö‡ØF>.¿¯· r{[rÛÄ6òñ×í¶ûö«ÛÍöœn/»–¿OÇ£Åq½®“yòíøóèò«Û‹Ù±¼ãüêºs\~<ùØ‚<ùØ–<ùØ–<ùØ–tùÐMKˆ®²ÇìO|8¾¦+ZåÏP ÇF¶Gº|hÓ‰0‡Ô–aÆ×tâ¤Áä(¼ÀÝQG‡D=S‚£ïIK5$χÓ…¥mrSŽ‚¶)§9bjüŠóî&q*Òà¾Í!Õp¬IÉ)>lÝŠRd+]Ùkl²Pá#Ï+º‰OIˆ£­`ŽÊ>!aCÙÖ±í°<ƒF¥…§Œ?ò^ Dû›ç¤°<ª“D’8 !´9Z‡%ÐÚ1’ëãÈØG¤´EÜ­¸`ìT‚*°)ë.|ŒÆ¡ÝίB’Ó ãÈñ1ÆÎ)i;wåGÖÎne ñç»6õ»|Wf*Á>dæ*ïâ|·‰m;ßE³·‡廕ù˜ 0éTU©Rß…I§ªÊãòaÛÛ¡»†Çö­ÝËFÜœU‰åqý}Ê“mÉ“mÉ#òñ}Ïøx];*³Dð±kù;ØÇ®åAøxùÕ×µ3"ícß8vÆÇ¯d²ÚI¯ÂÇ÷=òÑ=öþ}|t½?,ï£ê2?îû ãø‡cMâFòñcŒªMâˆùø1FU ‡îi¬Š.qQoà/Ø Øí¤"º·ÕM^7tB5©‹³8êð¡\{: Þ;ˆC‹çÑ‹Ã]€Çêñ¡„Q)+#|¯ë h‹|hêq¨È==ñë²ñB^Ó'pø^Þz|ˆ5Ç\¬l9ÇMÓ³Ö|ÀGÚÇÙÄ¡°O™{ãêñ,Cc3:ýð áž‹px.#J윻‰3|àÝ=6Û‹Ã=ÿø;Õ<§GçR.Ü4” LņFk ü¸¿`Ô‡–Üàèò1¦ZLßœÌ3è’$ѽ3€#¶ój|â°Ã@î‹8B¦1€#Îw“|h˜”®,%àY@C·¹tp€,ÚÓ8Ú’å¿,ðÓ´•áHðážQåqDÑIã X¦¬J8ªðÁåy­dQh Yy5UìƒëW¾xëxÀÁ—$q˜ªöa¥Õwq %Q1L{TF5“çèÆ|ãÀ|Ÿ²òu4®š'q„WákuÖ®(©p=1ƒ/Iâ0cGªÅ w“_Én³$ê‰÷“_Éœýµ—d¤Z{ÉÊòäc[òäc[òäc[òäc[ÒæãmÌ ˆMâˆù5˜c“8vÖ_›‘Ýõ×fäÉǶäÉǶdÒx†BñÏg å¼™‰åG™¼z£ ÙryKð±@Ú :ßê+gµm>ö‹ãÉÇHÙrÄD‰äqdÇÖ@¼ðA¼Ó‘b>t*ÀAéÁ‘Ó F,`Æá(°Mã(äöªÛ鲚zŸRmâ±ôãÐ`¸ÛDOÔ¹ðQàfòBèIá(ãCãDhîºÓ×q5‡qÓ·;jåÂnR´X!£Ø>pš3'¶ü^;;/]ã$îh¹`€!ÆÈ©ß-…öáFÚˆ• æ¦+ÃK°ZZ!…ƒû“8ÊøÐ øÀ床'àÀ=÷xˆ±`@àØD˜d¦c®}pº2QrÍã¨cdt‹Ø9óé*,|@Ÿ;/µ°k0ð ³ìÃ.‰D¹”b>ì*ç»ö;ïN¬_uK9ŽJ2£¾[²ˆÍ–ë»:AoN¶ÌG‰l™Y…%Ú3Vh/IÏj›)ÇÊ­tùØ­4EˆŠ8¨… èD³j¶ >…ãË×ïY>Ú8´®ƒÚ¼t"º“qtùŒ£ùÕv*6ÞÛn‚™8¨Z4 ú¾Ó¯y†!ŒÀñbÞÿÉóá5p`SþVÄÑ^1Ùµ-†ž‚2]>,†¾3q`/ ÇRɾÛ&êÇàøòÕýËñ!qØ."·U ó¡0×’+&k—®¦âèçc1$rÅdl/Àᦴ¼­ÂG7¿ñ5¦Ç«ÄÑåCÚ¹·íÐÄ1Ûλå÷°soÁŸ­äíƒóÀ€Ãå»vcv¾Û-Ï}_廾·`DºrÒSžcÁ½ñ›†#1ÈŸêÅ‘·×­² ÆŽœÎðaS­v0Ì@ ·…£ÅGOHÓdÁz{õBâï„£Íe&:ßÃ-(?`§T4YS‰QK Ií¨QcU‡ôÇ¡ w5÷áP¾ü "B×ÁÑæ¼öEpèPžKÅ2‚­4ãp“l9(žç èLÅ¡~Eà’GŠptùPTF>°¾ È*xÃTÚD8hˆŽi˜‡£Ë-p`ÈŌܛ„Z8h`Oz@RŽ.1¥ˆ—ÍÔÆáÆ+aª È>ˆ¨Á‡­'@ć!…¯ù)æÃ㨒®Œ‰ò+‰c‚}ôø;2ɹvn„ÿìÜL³ó×0Îw ¾IÅ$r#–p4ç<ÊW ¿eš}D~Tª<Ï<›"‹¶ïæýANWfo8Ú|àòa&Ùˆ<)À•ø¨¸ÕBâW⃎ t;¹FðQŽH:¿ryá•_…ÁÁ½8FeÀiÿ£>Ž´ÿ±ö?`‚ïÔ‹#ã0a°®ÿ…G$ã–áXMœ@ÌèòÓ°Ê|ÆWP2þ‡shðÍrup Õwuâk *Œ™z;~ oŸ‹#Sß…4ôFªápêÚo™†#ÍZHŠ3 Gð?À««ƒ#ÍôâГqÿ#à°CðçãHûGÂÎ ‘œÿ¡ ©žöBá|ØüUáDLcÝ|·Àɶ':+QP ÇÓÿàÓÿèUûô?&¸ªÿáGª6c$Ìõ×Î3¿qþ‡æJyXxyr€¹þóÊ8’þ‡Ç3Ý„.¯sq>4Íu‹æj“*{AG(\½€â¼q\ùáC¢°V2§xÜR4ìªLcGª¾kb>¨ù5ò>&âðïBOàÏѪïšvºá.˜Q/úÈà‰ƒ»Vªà惻½|­½¨¡ºª[åWÚ´pÌHWÀþGuIÿ#*?¸“¿7~ŽsùÍü®aç)ÿG@9ÕÖ°çðÓa÷§âðå¹)P#ßM·'ZœŽ²Wó?X §£,ÀÕüºrv ‘|ú½jÿ_üj!q€­öv·øÕÝšÈj°ÊçckóÃ-¯íˆF8 ïý¬ÍFq´½hí€IËÚ|X¶‰—›y¹4Ôšg™ø>¡TÊ+]™W+ †ª£TÙi{9Ü“YEfe>¢E¢ðTåâ£rÔ>õˆ¥Æ^÷å|l…{ÅA¿ðåWæCÑBW:Øy/±¼×Ž•ù‡cDºº+ßšÿ:²sÑ¥Â?¸Ïů3ÎÎïʇÃ!ò]EÝØv:™Ë»€p`¾ëÊó‘ùîVëWÍtk—ç#epaªð1¸0ÕNøV»>†Õ®ï †ÎVHN·}8Ä{.‡Ô®ï¤p„t¬ÇýýÙùG:SS{BkÙò;þº}Ç[ð?¢ »@Ø)QÂMIÙ„ÿQõÐU)it8(ñAâÒQ»…únèü°84Âb Vñq¨ËpºZÃÿÚUyµh&ñ8°Û… kþ9ƒqá€àp°#ˆÛÆt³¶-øñH.içÜÝâÆÛùýý8ß5´R­|g'ÙvqÌwש_͵vyî¤dÙÛœÚ-ðQ²ìmNíø¨¡v |ÔP»¾ÿa¥¾¯Òÿ!qLƒ´6Ý–ÁJ8Vð?Ür+~à•â·f”©Ý€ÿf¸òüóò›ð?°®H#q|°Lí껇Ÿ>ÇZý4Ðç1øÐõÒÕþ‡àÃÛy©Ú-øÂ>—w*.EÖ.?ª©}Öw'øä£W퓉¶üòÌDƒ@™Ú•ëW¼änìÇ$Õ®]ߥ˜vqàöd÷åÃEË5Áñdgœb¸…Ô{#8Ýàƒãîõ+nE<ÔŠÊwÚCyzº±k |PÃ4õ~ø)%ŒÃð´>—ª³¤ù8ü¹+J‰tå'%ë6MoÏÇ_·Û]ù0"]Ñ3÷ý:žK×!»|ÜnMº:žî˜_IÒN‡<—Efë½Ç=˲s18Âe'ZÓMòvîÞÊá׿úy¼wyNù®tE¯é#ŽέÇs¸NyGßúÔK㨦¶cÏõÝžõÛë…ÄÞ Çžùèy¿A½8À;áØ3Ÿ_³ïÿ¨x'»æãÙúnýwUIµ·ë%->êÄ"qTTkøõ`I>ªñDàX@;©mñQï=UB<ŽE´ó{â">*òÄãXDû ½gô!ß?¸[yò±-yD>^Êï"‚µ£2K»¦CðQå-2ë óñó¸s!>N»ÇÇEÊõtÙƒ|Ļȇ”Ûñ~‘™!§h×òqåx݃||Š÷·XŽ·=Èǧxí,³šü Š^Õ tO‚§IEND®B`‚geomview-1.9.5/doc/figs/save.png0000644000175000017500000001202612310162311013421 00000000000000‰PNG  IHDRs#òæËPLTEÖÖÖ•••ßßßddd¯¯¯VVV@`¹IDATxœí];oܼå-W]hË« ÎB3ABvä©B8¾“ÅÔJËcšº(æž ¶”:ª:¯èD^çU¢¤.*Gñ QïDŠW˜¼t*GMWŽ«QOhÃÀäï[uQ¦¶­ð  'ðŒ² ’U'† ŸÓjú%ôöz tÕ[àU:pÕ¶¦\õáŽúׄ®z tÕ[ «Þ]õ誷@W½îHuÞáŒvcåvm­7 çèÔ7ͦÎtü 6qŽÓ(Xá ªXA-#£KyB Ñ~U” L7nò ˜T]˜ƒªÔ‘Ñ¥ `²wÝŽ{¥÷6븆螯ÚìS]G2&ñ­ôÎ\MbµGò{T3~}¤Îc\Ù†›«aª³©êüPêÝ)7U{àÑÆ¢êÙyÝ$ªÁS¯Ã¤˜Â‹)þ4¦*G¦†°VŽ÷Ó†9ºê-p?ª—~aÔ»J½¦'ª—Ûÿ®íÿ¬N}bzªzé·ø{°ÿãË—o_¾<Õ1è7=U½ŽýÇçÕ¨¦×Q}êSÕiÑòDÊþÿ]‡úhz¦ú¨GªùIûßÙe¤NÞfK=5«zuÎOrt™¦6 gÔãT‡8æŠú`Z¼¬@Ý2Ô0||˜Ah@äOuÙ%2¼ªN™JlüϨÏTWÞ‘÷—Nýç3äYy˜q…2‡çx\SÓH^WBSù«)Ô/uf >dÙ©4ê–i$¯[Ô‡#T;§îLVvëPŸ©Ní #B×)Ë z¨ÛÅTZ)Ï0óö:©«¹êEÔÇŠQUŽL”}ÅÅôþÛ0¹ö{Ëјõ9Ö°¿"õPŸc ûëQö9V°¿õ®ºmgªƒ aöHk-Ënuѽ.¬Pu,Ÿz¼oJ2©ƒlt1RR}½Ì+ §:Oïlêz¤ê\¯DkàÈ…w*Pëó¤/²¬ºÇÁ£ª!™EÝÄ¿ &õ…öºqðT2ƒ:‘ÍFbQg¢ÙH¢8õ —d9xùÔA«NUÎÑÔ!…xºêÆÁã5Y6uµb’PB6ד|uõeßT;xªSGu¨Dë‡Á<ÝyR@]üŠzaJ¨c½_˜ƒ'»¬²U—ùmH¨§)l÷4M±¿³6LŠýÞrÄLwÕ½ö»ê˜é®º×þÎT‡Ùüé´¥ƒ—Á‹¦k9xëGð`-/6‚Går‚j%ÙÒQK°¦R_ÍKò8xrÑFJÍãB«ËÔ×qðb#x2©„g,Q;xñù&ÍK²<éá¨uTeÓ8’:„<*†²­¢:}S¦Td)¤P÷;x ‡3|SéàI‰˜éGÊ¡^ÙÁ‹àÉ¥š™‰ƒgO] QÏÁ‹àQó4d:¯ë‰¨1Ô×pðî¿ “b¿·1Ó]u¯ý®:fº«îµ¿3Õ‘F’:â>#¨'?F-ÓY¾éüv€1‰§>7¸€ì^€úÔþ"uûòxdGðÔzñz³ *V—-{$BQ›Hš‘‚bB^)õØ ÚÁÓ[lÈ3í­s1/I³3k•PÙ¬®¯zœƒ§Ú­òP×þ,èö¹ê  òo9õ´èÁ– Ô©tKõM•aÖWÙÔ©½YF4u¢ÛçÊOï…)ˆàõµ#ÔÁ²?s5ô•Ìr­×PÝ7DSzyã`ËÜb ÕŠilO»eºrdÌ_9º³|ù”O«r•דײ*kÃL=QÜþl–oµiuÛþ^ZŽdúØ_¶¿Õ3ìïEõ û]uÌtWÝkªÇö‚#Ôå•fcÙÙ»\W-SÏ÷MÓ¨›GB=ê+Dð¶¢Á“í•Å^eŒ:±! çªÚ<ò™ÅÿÒ¨ÇFðÌÊ+ÉÔ¥k(•–-MÓêLÚ”+?‚GYlók–aìáÀ 2Œhë/Û QàSž”+ßV¢Á+¤.‡4Àfª êÊÁ‹»•—:ˆ»UÍ0ñsðJŠ© ßi‡°N1žƒWT92í+¬­S96mÃ@‰é¶-G(1ÝU÷ÚïíuÌtWÝk¿«Ž™Nð’¢|~ê“G>Lþ*ž¯ù¾i\k£: 4j²#x‘ ¥-©'DðbV­G¨SÝ™-‡tŠÃ|H’ì´`á/$ЪɎà©ÿ!ƒº !Œ:Ç8 \ÚŽ ?‚G£:óñÝN×± ;¨C<ê`Q^÷;xyf‰ºÚ{$ztOôE¬Aiﯪê‚úèàååu0‘¾u¨ º‘•ÅTQGŠ)$Óè^v^w+GyR9ê“â©ß&×þ]µIâ”j¯é®º×~Ïë˜é®º×þT¿Ik4L´«á«cœÛ8† |S”´úÈú0Žº÷‘ nÂIVà5¦Á³“âJîŽQµ/dˆ:âàÓrÑÝÞrŠŸöɰ}²#xNRi"ÛeKªcži;ê#*~ ÎE÷QÈàÙIy3GPWƒ¹Ñ)u’ Þ€ºi’ê!š&©2Œ‡úd¯œºrëtƒÆ¢îÛGaj:až•”—ú2Œ° S§ UgsÕY˜zê*švRßΗaž&»™ ÞÔÔi uÛt|ÏJ*ã KÛuÌÁC‹©LÚ熩ÇGðÆ¤¼’ˆBýÑÙ¹qð„³H&•£°åž;§þع§õZ˜Q_¥åØf—ªPÿtËeê3/`-L}Ù.«5zGÓ+탷 õu¼¤ë¹?|ª?•bÚ(6è5=Qýg ûO–ýrƒ^Ó÷³¿é‘ÐUoê»Ê¾¸öË zMWßË÷ûzÔ'¦§ªs×ïñÛýU×·'q”ú‚A`­ˆ›žª.èýÈ¡þãéÉC=d0Š:nz®úãÓs€úäòƒïÂo€P4Ô}vý¦gª?>}ÿ“I 7˜SŒ¤Ž™žªþødz;Ò©7˜Q_0K1=U}¸Quvù9¥¾`0šúÜôTõ¯Cí™Oýr™©¾`0šúÜô,¯·Ê¦~¹ y=l0–:bz^Ã|½\2©_.h 4I3Ôë_CÔŸ½ÏºÏä[2h¨‡£¸iìiú5@=dûZ– jø%ñšžÕ0¥˜Õ0õV½†ƒç ®ƒRýHè^R tÕ[ «Þ]õ¸Õ+>¶×„hLToÍ)/˜ê-¾ùdüyá¯SÕ[2І¢ÞUß]õ誷À¿BõUŒÔ#T_“ùsõÕsÌG"køC‚ê¹¼"PB½«ž‹Fª׫\=¥ê48S|êùª‡ç[‡¨[UzÕA\/‡ÓëñúzG¾ÙŸ??YUzÕu½Ž;^’;3x)¥^¨ºñlfB˜1û‚P‰z¡êêTLÕc™W¦^Wub©îŸß\u:æ˜LðPS0¼Ôe`®”za½®Ë£Q˜Aúþbú\‡záÓT‘7yÏ"  •£…Þ†a£ÞUÏEWù¨‡FM”¢€z„êÁ ©÷Þ¯MÑUo®z tÕ[ \õ5ŸT—ÙÔŒ9õÕW¦îƒ[Cõ”““ñ{‘z‰êÄ–±L½«^]u­©ß·êÔ³>ÚE‡t˜¿³.UT÷(ZSQÝcARØ»êj‹Jû¸X‘E.²¢?%î%¨¦ºZÖ!6RןNVê*BÕÕÓŒcQgÖ&–•POuu¾®Ó¸ÆÎ¶Ô#óú©ÿ T—[T:ÄÄÓD(L}ºm1­×Õ•öñ‘ºùtÓÊñ¾Û0>´¦ÞU¯®:ŽÖÔ»êõÑUÇÑšz‰êkŽSžM¥žS/P½æ”ïê=ª±)ºê-ÐUo®z યP¬IÝU}ÕGõ€©~$ôuZ «Þ]õ誷@W½ºê-pOªëÙD0žl—˜ªn¦î‚>Ã?©«1¦ª›Ñ- Ïäª]`¦ºx!j ˆÜ=KÉÛ©q=Ìò:aÌš¶+7æ1›ï ó†¨I¤zTÔÿ×R¯µ‘–Úk¿ÔçõºÙH‹±}SÇj`#uØ/u¬^G‹éþ¨cOS»rdb Ý|DI{ÜSæ8誷@W½îHõÖþQx‘Ô'ª·f…ï¸êë9PÃMfª7¤‹ß]õ誷Àªö‰ã´#ævv’…È5ïbRÝ¡±D˜ýÇ‹¨#ª»wÁû)s©/2ÃŒd" ºZç ĺ{­=ð%øôú{j‘) Dï MÔîÐã‚}Ò¹õS:ª:Èi/„“¼T×^{Z«ð¹i‚t)¬CQuPÙœ¹;ú;Ud§NsÖ_Ó{™Ã|bP êˆê`2Ìœú¸þžÌ$"¥r•=~uÑûf‹ñªÔ}ª3µäÛ„:qT—)b©Îfª³Õ¨ÏUW²+Žj>éØy§J‚“9Æ4F}@Õî'¿êTîS/™ÕÔeç*„”¹ÅÔJ[ ö1=Ó³nP'¨:¯èä6ö|·z3ÑK~·¯Wçð¯0eoŸU9jê¢÷o-ê m˜ü"œŸëåöÔ–£ôZµ—Ž_–dÕÇ ù8æF¡Zmëö:ñ/ešŠÛëœw-Ù»—Ôw¨úºvêW}å¹Fu€«~ ÜQÿúÐUo®z tÕ[ «Þw¡zë8n2þoToÝLÆÿz^o€^ô@W½ºê-ÐUo®z tÕ[ «Þ]õ@TG½)ÿúa860‚¨Ž^ðRã®u`ª#Fþ$ßu}#˜êëߵБ®zâ]«éª'ÞµŠ¿êbP”<”sW¾§…3^-‹:03nbÄ«:•ƒÕYÔ™(¨Q›ºOu!¸Ÿ˜KÕ¡ÎXŠê o;» þ®Ju¢·®(R‹C¸"T—ÔµdEF/BP@}\É Zu=æ)³˜šñ¼"ÛdQ're=¶5^õ †ê}9ŠTWC›Sòza15C‘kPŸ0YªajTŽkQ_ª× IÌ.¦…Ô±bºô4•²Pkp”ªŽVŽGoÃ|º²åxTÿtû8¢ê·ÛaNŸ¨úéÄ©2¯ êÝKнk#X½Ž ƒH¾ëúFÕÑ’SﺑÞÓÛ]õ誷@W½ºê-ÐUo®z tÕ[ «Þ£êäpЪ¿Ÿ­ú¯B©nãê&w„w7)TwŽ\O²IÁõý즹ê6n§âýì¦ê7§ÛNñþÙM·®äJð:\fѰ÷0{IEND®B`‚geomview-1.9.5/doc/figs/trefdodecinter.png0000644000175000017500000001273012310162311015466 00000000000000‰PNG  IHDRÒꇗ?Ä*­ýXô+Ç×›QiÍ}n%of¥þ×2JÝR{Æú¦±¯ʈ]iÒþ•R òµ eä×U)ë–•¢ü’-ÝŒ˜Ï¢ã÷#+uÞòãF¸\¯5yöŸç‚èÛ'oª{¨–îFŒUÜŒßO¯tc Ÿÿz•"8 V:ýÖ¸¾é•ÞÆ•0´ñ*äõŒK•(åUºYRétZ÷Mè¸=ýÙ<\O¾7ÝD›F_z]áùgcq‹›éƒ0/8ýÀ©`¥“a½†¸yŠ˜|oòçm¥î|ß|ÞŒy—`JsU:;¾åù¬fƒ7ƒ›^ãUÜ3ÃéŒÿ·4½ãÆfw ¦tÒÒl’WéÜ—]é|»k§dÖdn+Ý‘þüüØBž§¦·èºôä.¿,½ójÉ(„]©y«ã%ÉJ[GSYÄv×ø†éü^\J§¿@”N+5ׇY©µå%*ocJ- öæ7b)µ/y_KÇ_ŠÍkª¥ÓJ-/{×z2uíñ»/³¤ŒH] ¯LÝâkÅ̽dëîŒNZ2ŸLK¼.}ÎmóÈd2ôéì_ÏmÓ§½ÍtIÌKc›0Yó‚`J_—f£‚ï¥"7g£]T*6i£TªðUjíÇêñÒÆ U:“ú£•¶O RÇ÷íJ‰3?ßjŸÉ¸Ò¯_òìjÊÈ«Òë¿·×qB}_) 9xjÁPéïXéíbÖ{Jw¼²7·F¼þÿEéœû©Ø7¥C¯µ²”á¹ô¡tÜ_ªý€”¥Ì÷xUi÷Ì_—ªÒîÑJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJá(Wé¢ßP¾Bò ¾X¥ä Ȫ´X¥uMÎa¬ô¢NcÉ:«’•ªÓHòŽªh¥ê4ŠÌ“*[©: ÷  WªNƒdŸSéJÕi€üc*^i§ÇÒwœ@)•¯TÌéÑÌ'RbH•vJ˜ìBk‘ITZÆiŒÊƽ–‘H¥ùžØBÔZhB2•fVzJ5Ú–×bJE*ÍéôtZ¨´­¥$Ti¾‡|ò}–zÈô€R)4Ÿ²ÇKù_ð¬†ù7ßäéŽ+K ªÑ‹R*Öpº¨Ô~Ø‹nïtzPéõzx²è!¥c¦‹J]<™—P®N‡×ÔE+™ˆc0}TšÏi¡/¯‡9 W”k,TšÉi>¡#–Ri§Î¡ôRi§™…Ö—êI7•.vz*`´®Tb ýTºÌi!¡5Rãè¨R×K°HÊ uKÍÿöƒØ)-¼À{¼³õˆ|ðe…:¥f[wšÙ(Ê?^÷àÏ¥…ºœ–—JN¢¯J/ þ|..´ŠÔ…Ñ£îBèH 󔌇ѲBR³ À 9‡î*ež8u¾)-/T\*9†þ*eíÛÝŒ–øñvZP*ý: ß]HUÊxv”±ù" 5Û¢‡Ðc¥Ñï“ FSŒY¨º?ø¤fCì º¬4òÝL¾Ñé‘PÇ+—MÛ«Sr}VuÌcÔq¶ÂiJH§©UÄ)9N+82eÔs’ØDhœÎ©V§äz­t| Ì÷àcŒ^§RʳI8Í6 s*ÄYFÝVz±Þñ5ˆ0:NÛ§4EçÝé~_Ü)¹öýVê[m”ršló¦t¿/ï4a*컯”þ‹6úvn#ûòNéMT畺Nf]§ŒSÏŽDß•º—…Œš»£¹mRN‡ïæ j¥®…£³‡ü:=N3iõ¾‚ë½R{©ßè\èഀлӃËér¯þ÷Yº¯t¾ØkÔ!ô@:Éît¶|á<€+5—ûŒŠ pš¨5tÌ Òé”î[ÜêŽì÷»]„Q[)ûÜNŒJŸF§N›2úñ±Û=œú/Ç^ùèljV:QºoÔèè4ÂèLJ÷sS8SYLÅJ§FNÛÚìÞ/·îà•:”¶hôê4¨ét¥•šFG§mœÆ\*fݱ++Ý·ò¦Q*1ë]©e4ò¸GÃD¬;t¥~¥µí¤^wäJ#mGiJ#}9]c¥˜FŸN×X©*^À¦N¥¨FN×WéÙ«´¶•eø×¶RÜHÛP*_)r¤7§««Úèèt…•ÒJkûÈAu¥*…Ž´¥â•¢Gzuº¶Já~|¬®RUÊYÀ¦F¥»¸QÏÉ`V:œGéTZÛCNØSé¹ÒóngJU¥Þlä+½+ÝAeýè“›j•>¥b¥œBWz— éðã4œ©€T::E5J8…¯t·Ã5êvŠX©i\©í±R·ÒÚÓ/ƒÃéj*­=ûRØNWSiíÑ—âªô5¸JkO¾–SÀJÏŽÞÚs/ÉÜ)`¥ëŠ´’RáJm¥µ§^–™ÓUTZ{楹*=‡¦â[À|õJk¼4f¦k¨´öÄËc8Å«ô÷ŸÈØøBŤnÝ™v\éNÂišQ§[âÉ´ãJwÿÊ;M5*àt+¡T¼ÒÒJÓ… HQ*_iY§ËŒvº•ºœö\iY§K…–•:}wgÚs¥ƒÒbNs-çt+¤TüUþ…œæZLêVJ©ø'ª ?Ì_Äi>£Eœn_JN{®ôöIGœæ4ZÀéÓ¨;Óž+½Ä\n¥y…*¨T¸Òççïæušßhf§[ØJ_¿n"ç;ƒ%„敺*u9í·Ò—ÑŒo#•2šÏ©i´´RÑJ'F³9-'4›Ô­¬RÉJ3¥9œ–5šÅéVX©d¥†Ñ<™–6šÃ©¥Ôá´ÓJgF3dZ^h©¶ÑÂJå*=Ì•.v*ct¡S‡Q˜J-£ J ]&u+¯T¬R‡ÑEGe$¦;uu8í²R—Òt§²B“¥FË*¯t7WšâTÞh’Óm¥R•:¦fZÃhŠSÊ(F¥¥\§u„&H%ÚÇL*MpZÏ(Ó)¹Ù-¬T¨RÊèM)ÃiM¡<©£•’J™Nkwº­¦´v¥w¥qNkë¼Á7zv(ü5OüÁ Uê|QÊδ¶Ë+•©Ôc4>ÓÚ&_p"WêRzŒsZ[£ Ǩ´R‘J}ÛÝÓC©ßim‡sXF+õEz:ÂNk tkT\©h¥¥¤ÓÚöܤí¿RïvwªÔí´¶:šH£ÂJ%* DÈ´¶7‰J-£ÝVVêpZÛšŸ(£ÂJ* mw}Nk+ ã7ZC©@¥ÁH§JÿuftæÔi·Ò8¥ÿú:@­¢´|¥Û]·ÓÚ¦â …«4"R§ÒÚž84¥´x¥¾HÝJÿõ&tÀg­Ò¨í®å´¶!>£•”ŠUêt¦ô_m?)ÐFÁ*ÛîÎÖÖ“B3JKWš¦´C§ £ •†Œ®M)1® ƒ/^é1Viï[^Ú¨´ÒÒ•Ç¥Ý9eíºÒ›Ó°QUšið•R#”víÔc²Ò+ûõ*µŒbTzÜøv½ƒÄ‰¥ÒÑJ»rÊŠ©RS+²Ro¤h•>µÚFOÿõê”éé„WéÈk­ñ”ú#-­´V¥¥þCQ2:8%Æ•að-TJ)íÆ)7Ò«Rj\ßr¥½*=‡•ž¨qe|éJ,¥}:åGZViáJW¨4&R­´m"]o¥]8Í)p¥=fš#RàJ;Ì4K¤+ª´;¥ç”6Vi[Þ,‘"WÚ]¦y"]S¥+eì­«ÒÆfŠºÒÎ2Í)t¥}eÊ2ꉣRÛéhôÒ¯ÒQ)¥Õ*u+½^A)×(p¥ÃU:Ê4[¤¸•ŽWPÊ6 [éýªÝ8e•SÚN¥__÷«v©4Òèz*ý¹_µs¥n£þHÁ*ýzò¸n'NYF•V;Cp?óÙ_¦N¥~£¤¹Ž*õ)ý²¸_ÇRÚ¤S–QI¥B•:VÒ6Ú×–7Á(m®§J/¥]myJI£Ç£ ÒâŸNFfÊQÚ SžQI¥B•ò¶¼}*õ=Þvw1*ͳåmÎ)#Ò£°ÒòŸÇ‹™)3ÒÁé¬R\¥qF• |¶}–÷»u§l£ÇÓl*世^â7Pð3ýþ¶Ö–h2WºT*VéR¥M9Ýï)¥O£ÇùTÈq-¼Èosâny¿¿[ÏÔ0z{3Æ(L¥ìL¿Nkkœ2QúxË:Æ(Z¥ÑJ¿ÝJrú2:9 at¥•~=”6œéS©qh)l§RžÓoJi3NÝFçJµ”Šü–á4¥ÍfJ(Ý®µR:ÓÚ*F §N£@•b9¥"%”ÒS‰YÀ¼L¥L¥_}(uœ|0ºÞJI¥M8¥#}9%Œ"UŠ”©ÏèÞo©R®Ò¯^•î½F×\iÃNýF÷^£P•¦:íNéÞgªR˜LCF÷ѵTÚW¦¥‡ÃÁc«R~¦7§_m*%…>•ÆM%¸€?x±J2~µåÔéý×zzŒ®¦R醴M¥£õ•ŠUšèô«)§t¤Ï_}ð«Ôs ’oÓÛ¤RЛRÆT ØHVš’éÖ•3¥œ©°­Ô—)åôÜ”S§ÑÜ#í­Ò§÷ýoY©eôàñW)ßéãóÚpê0êêóƒW)÷éôù™+*u ­®T¶R^¦“ÏEjH©GèÁ»î¾%ýVÊrj|ÖUNÍHB7ØSé¹R†Ó³A3JýÛÜÀÊCVê}:}TZÅé4R¯PÏÚcVº‰ÜE:ŸËônôóJ@è°–îõǬt·émEé§Ciü@+z:µŒVwº(ý %&€ZiÄÓ©Ãh«JY#€­4ìÔ¥´®SÃèg„Pç `+ nzFTÊn¥§n£¦Ó”&L¸Rÿ¦7F©°Ó­¥t›2äJýN)©í(j͹Ò4§Õ2ÝšJ“]©ÿé””zª«”gÓžv¥L ©ã'‹;½ MÅkà•zßì%œžžH+Í3 ìJCï"9¥žx½ì>Cdt¥“wN3*ÝÙ±i¯5k\ü{ªUiÄ«S‡T¦QŸR‡Ñ+GÏ9¸9æ\iìnïLj>¥”ÑlëXoçÒ<÷S§ÒÉBŽS®QR©[hQ£ÖŠÛ 3ÝM•JÍeñRÙJN Ÿ……ºÖÜ\–ë^jT:_í4ƒRʧ€QתOe»“ •:–ÄIå+¥…J%ÏHºt_©ƒ(§ •z|Ê¥VÞ»€â•Q1RŸ¿}9A©O¨˜Q:Ó~+ÝÐO'‘R™Z#|^f[ëöÙ ü»­Ô»í”ã5F¨œQz½VêµÍ”§5äS2Ñ‹gVxOìÂvêÓzÿÑ•¶ŒÒ#è³ÒÐ;×#|©/­®O®ih£;@ΠËJƒÇ—n¤8}wÉŒQ*,Ô3„+ ~À—Jõ+7JO¡ÃJ#ÎÕxÂvš¦T^¨g ýUº¡¸aJMPwfuvÈ9tWiÔIrSXN=FÝJ#O•/9ˆÞ*Myð ©<¥õ|^–þE» J7i›˜c´TŽÒš>/ÖÖ–³‡}å+µöíâyüÄ_ºÑýÜ'ãÞ‹;¥ƒ/^éÒ½õ°ÖH¥U7¸O¨qtTiŽ×_¯V¯Ñ}#ÜÄ@ú©4Û+jZk„Òf|¸GÒM¥Yß#9¸µ†”6åsÀ9”^*Íÿ®—­ÕotßšÏ×X:©´Ìû˜S«¥0ü‰DÕq ¦J˽3}9D‘ïþrc¦‹J èDýb=ßM—«Ta‘oðRÇK37Ú?®É/U£å®‰TªF;¸&~¼T¹ƒs¼TyÐïñR5JQdF•ªQ’2‡À‹WªF=9^ºR5ê¥Ä!ð•ªÑ—­Tɼh¥j4‚ì‡ÀKVªF£È}¼`¥j4’̇ÀËUªF£É{¼ÜñÒl7µú8^ª°È7øb•*•(W©R ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ŽW¥×k¥ •þŽ•þh¥ýs­tP9>—vUi÷Œ&ßÞnJõ¹á¹ô¡TŸK!Ð=^8ôu)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)V¥‹~E¹Ò³Jß”þ1*}Ó/ˆ¯W¥4¿¾…JüF^•’—øõ.VÄ ¹Uúëûz ,×/鯀‘A鯗·ÀrEš€‘šûÜJþUÍÃ̼§¹êIEND®B`‚geomview-1.9.5/doc/figs/ap.pdf0000644000175000017500000002103512310162276013062 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hjf¢g6´0²2ÍõL---LLõÌ !Š-\ò¹`ë¯endstream endobj 6 0 obj 67 endobj 4 0 obj <
> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <
> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 5936>>stream xœí];rä8Í9ʸmµ;'ѹ€Ž¡ˆ 92ö­ ´CK†N ·­qç$±Å€ÌDâK€A¾ ©ªH? 3Aþ7 àøÇ·úëóu§i!¾ž'¿þr¾>á±Ïúk¼B,|þzÐøxwý¸žµWŸ…ϧEÞ Ü,YPjü|º_¹¯‰=¥Æ£å¼¯É"5>ïU?:ÃÊžRã/o¿ç†ßVö´]ýž»¿óxÁ_¾Yj”Û¢KµÔÎ~‹…©[jLÚr‡xô²纰@ÛwXÔ£FiËÏóz„K3+ Ïø¼§/Ÿ¯Ægè•Æ   ùj|ü¼[9&©ñAÂ5*çwòa¶è}-‰¿IÅÚÁŽj\ˆy_ëöJÓ»^Lÿxk…Ôȇ2ïö– +L’ï¦ù¡!îßù{!Ji†Õ”45>Ó“z~·Ô¨Oþy­—ïèÀJ)€aÃäêâ Áhæ™Ô”T52§’DJ®œÜîÐ K¾¡bmépV#58‰jä~gj¤Ô¸ù!%Üuº5 5NÿrÕhÉÔ¨ëé\ƒM;,70’[n`ˆ£Æ±lKiôuwÞÜð7Õ·ÙÝ]ûf#ôCØsc¶A>t½ÕØ'»«±S„ÔH—°]"¤FFä­Fj–Ûjü’£¬¯¯‡Ç0w{=Ør¬q±`Ôøþù4ñù°ˆxr,ïΓu­˜Ô8±ùü=»ãÔyøçk"ø×’˜÷øüߣè”øs ï›iœtyÓ˜·ŸÿL‘ü…Æ©­y¨ñ÷Ñu:|ÀOÖR?Ôøû{äòdýŸ¬ßÕh|ûQe³Å‘söo²+çNCcòÙO•ZRãMc\¶ñ¦1 ·mÜj,‚[Ep«±*¨qé/ô’aùÎVûveÓø¿´Â2¡qÕÛúI¿c„Ô(ýÆlyúàÑl Dã˺OûÊ‘EÂjyÒ¡G!“F¯C4†Ž6DãÔÇÿ©}ŠÔç0qè¿tµhäÛLjRãT}Gs6kqý¾|}|šëý¨wU‚ÆÑYÄõ“dxÔ8UsÂ1jVçÏ#¯Ô¦€Z ËùjTǩߩ(†QºfãúÏ}ºiÄgFªD´m\øð)Íÿõ‚AóŒ¿fÒh¯“FZj-ê<Ý ×÷Ñsf‘¶Q×MR¥°õŽ”>t%ß`ññZ4º¯™ït£àQ£Ú.(Fôy„Õhä ÐÈÛ0Þ¤m¨ÔE#°’ÞÓB|“Q¶Ñœ ©Ôk4êÚ§F²3ßéF!“Æ5:›lЍ|.¼V¶ÔbùšÕ¤Ñ×ÄÄØÆQ5ˆž9˵ìúeT»ÚÞÄà~£ëšùNw#ÞOæ(&2/æ ³k#L:<ë|øšñëðÄaÃ(&}WˆÅ¨î÷¨àáñ¸&Òwç{8+ù®‰ú¸ýEЇÇ­Æ"¸ÕX·‹à;¼¥ÿHVcƆÂ8 9'/ª± ‹g¡1²m<ú¨NÙ6}T§Ã­Æ"¸ÕX·‹ ¨FæHó´ ÜYØ+j´’Ráù# F dƒÐ?¾n5bþ@ûêiž‚{Û8`ˆs Ph¬‚ýjÄ9rä–PÖ€E˜:¥1F(d™½Lc~ɵ= Zy4¢&†þ²#%N¨¬FàôuLcLKC£ôãõ}yÕ9¥#Ûo”š˜PÏšöÑ/eì…ÊèQŒÔáxƒ“º¤ñ¢cjßH5Õt_ÖÃã©æÐxI5úGª©ÆæºjtŒTu6ÚÒ£ ‹Ü¸¬]#Uװן&yY5©.‹Ü=ä[Nî/ËÚO¦ñªjª>–µ«1ž‘*ÜjŒ†s¤Š›>ˆuâ²jGª*k¤jŒëðˆjL¼§OÿÌçÙÆ4Ïrçé˜iÍÄ&Hº½TrÕ˜U©™- ÷Ò0â´ÊÂB£'~‹/ o?ÒU¯ì^jäþPr@xbw[¥Ž¢q¹+Z¶›­»˜×¿}…^“›Ffn¥=™[é‚6Õë*ùÚ&ª1»¥–œŸDfÕ°'âÑ۰̳*D¬:¶îN+÷hbx¥FæÖ¦‘]åµ dÕKØF õB¢Ñ—mÄw8)Óá±*52·AqÏÌŽrÙHU#…@cÌ]Lò4±R+{$u\%›£+„岑®F ›F ÐÈ$hµÔŽ‚Ò66«‘×1¶ÀM#›œTý&±M ²ôÌtKML!5¾£¢‘¦ä˜î n¢¿ŠSÕ¢r«.õÂÔ<øit ¸U ©1ÉãtÓèPcšß®-&¸‚q©1 ­Ä©'îºÇ¶1ÍÄ©¤±·–ú§ Öj5ª1>:»L"Bj<1hhɱò¦èC4f2Ú±)Uõh,¤FbMjrlQWÕtL#r_e Z,JM®ÏiTMŽï––4V]¨?gшœpú¸D¢ÕH½@¯¿Ðø›|ge¬ÒuµhTŸF Õ•ÄtV¶Ø…t>Õ¸Ù_©wR#:K<R¼—F‹–üøòs52Æb¥Ö„:+õ^jÄçL|¡ËÁûh´&éØp!ó:3”`ÓÈ$(Ð8@ÓÔh¼F)•šxéqãòŽ*Çu"lbRÕˆÏ~=ø`¥6&^P£EŸ*X R«8€ß6jÿn:¶¨‘|ˆ¨ÔÄw¤Ûá •ZÄöÑCfKN#g'ÆM¶QD=Óúghbœ’Ü¡Šij4–ÊÝáAž^f¥§m˜QLáO£ùEX4byD÷[ÆÆnxÃù‘4Êê‘n@|~cœÔÃW5^ÒmׄxׄXzk¨$61/”Þ¨Š&ÐØ›¿1ŠÆäõ¬hA5F|{4ÎÚ+»·el ü/¦a UþþãÔ¤»5RyéD=³^ìpíuÇqj¦8<@§>ÀôJ×m0è6Nýƒ>=°¶z»\¥iì-NýŸ»#¿qÁP’Æ~[j < åÄEPUÐ(71$‘]ÑèÓ_YóW5PWýâáMŒí  ë2J«±™8u[ùõãÔ# ˆ,¢¤µüÆâÔáãÙŠŒöòëÇ©kÑ]º’ÔˆGvG6*N͈{¦Ä( r‡1ZGûéªTAèiˆƒÜø€BÎ|êmžÇl5Z‹2ãÔºÓËû½dóƒf4éó©·zsÕ˜L£ŠS§Óˆ~™R©£hT¶Þ6ú6¢h¬¬F>óÓ¸´3.i„;JÉþF\a²<™-u:Iq4âå)¶›Ç`Ðlk£ç1³ß˜¥Fé‡Fcb J¯Z9hÄá+ËßH¶µÉó˜ĵB¦Ñ§vÓˆ;6Ü6ª_¦ÚF½ ÙßÈøØàyl3N½b¥&WL6Ãv[‰S—@æ|ê46§.€¼ùÔ[<}ûIGGò7Z£f”c=}{¿](nQúSK¨Gcqê–üIh*N½ëûSïºÇ~[ê]÷ØoK½ëo5Á­Æ"¸ÕXñjÿqܘzw´¬FÁo d<ÐXòÉ®{LP#aRò S1ÎU‚bƒ‹ÖÕˆ<#fÖ§>ø˜¬ F¿–¸Ñz´®Fì`Iå† 4¿i œI@*7$&Ÿ¸i4ÓÈÌ1L¨ò'Rc"’+m} ¾æ¬‰¬«Pyó;±C ±< ÖÕÈ*aj¥›F[„KÒ”Ÿ¡R§ö›ž|â´œF³ýxA6¯F4ŠIëðú¢hD•šAÍ«ÑB‘&÷OÞÄĪ‘Á¦1”|B;<ó2Š9w‡'¬Æ@ÞjZòI¡Ž¶Œ–ÕDRòI¯4Vô7Ú:®›{Ò©wÇDãÞ¾ìÓû½ûãCýjš˜bjô?tœ4òy·hÞîIPR1÷,=3*{x®DcEc0ߢ4šÑ›¿14}Ô‚µ7ïwT¿ÕÄQdØœþÔx—P#ºi›«Ã¥oPe2¬òØ%7®¢Fë6hf]9»îлõ¸q5®dÕÂŽ ðXÕ_Ó}j’Ξ—Ƙéå]#Ù¶« 71#Y>1Ãd*µ“6hFó±ɶߎ{$Ä,ÌjØBcú]¿e8\%‘£FÜyh$} /Pú®ß‡!Ë6šóµˆà´äÓˆ—ר‰‘«ÆU*"v£¡M /+¨1¹‰9~5†bTº±Fo¸o†mâN#Éña¶1ñ®ß‡Á«ÆÈUšNšVU.R=<›hŒlÅIb1ÛæR†‡[‹À“Kùç/<=-ÉÇU¼ß¦U$´&û2j$)¿f1]ÚGBsa¨'lp5 w½±hçŽ/õĈíäeÔ¸~ðÒȆS¸ž›1qhøÔxPça¢b1hq Ô#Ff|j uÈCº¬` ð…GÉQ±ÇQ8hdžñ¨ýj g ]c'-ЈGšŽ–Z¤ù ì›UiøÕO#95jb|ýFî#¡MŒ¦ÑÕÄ$«I˜°xgA{#p7ÁüH,¾Æ@,Æì7Ñës^€Ž™{b@î𤪑ÒÖ#1µÛ÷gÎ _pq“y4Æ>­lȶ?g”ݬ·7x#’9ª1äÞ‰ÆdÛÈb1ú¸ˆïÕ”±º ju Ç¢¸Í²;ÊQ#ŘCc²ú`z#àZÝvÐÅ,ÛˆÎ]l©]ï ^k¶ãÕ«FÖÐ~£Ôv8š^|ksüj ?TÕ49<³ÍdìÏü»Šux‚W‡3J§¶Æbngl‹Åœ´ –GoþƃЛ÷û Üj,‚[Ep«±n5Á­Æ"¸ÕX·‹àVcÜj,§soç~’™®…áTc&/×T²G9ºJz EGð¨ñ¦1·‹àZjxÚ‰»¤#Ék©1i.|*Rc[ \O:¾¥Àœí(‰Þƒ5&\™™Æ@Î Ïåã'ŠþÛ¹SÛ`hŒ¼¥Ân„Õ˜ý[hôgpåÑX$ŸBq(dºáí£"$ÛÆ*jŒ¢Ñ}¢¶ Û‘F“ gŽ!|?£Û˜E£™“#\kPçÀrmõ)™ó]³W†ekãæ"¹hD™pæ˜ÃÔR#š“ã¡QÈ“â4’$©  ‚F³œ˜Çª©ÑáT#;hDeÂ6*€U\BºG1?÷Þã¿]ªñ8ûR£jsõÓBÑý”Ôr„9Ó} IK:UãˆïÖ½äጃ›¡r4v¦F•N±4Ú¸ÕÈhÔ"ñ=Ót =˜lÔu!Û¸nWcB—ë4r#¦Ñ,ÀO÷۪ƌz+!Ç,Jš'EÞ#Š‚@#¦r]Ž^ßMA¾ÿFD55âòúsr,$’Fä½™PœF5ßnÏM£2yy4Ž0ªF+`ä )¹½Š÷.D „ ™4šBœFüÕOcÅ™4]”Ð1O ïÝÂ;“i¥(‹FÔ|ùÖ£›˜Š37/ !Õs°i”œÕ8Î2$ÓÈû6d¡^¹îå Û¨N FüKD#Ð †häpó°UÕˆf"X4B£W™ÛZVe4Ö‰©4âåA£R.†¸° ª«Ñš¥·9O ïÝâ4ö“ߨlãˆ'X4FÌ“Z~1ÿíâÚ6¶Aã.3${£¡üF(O¨«FŽÒ4:ÂÊÁÄ<ÄnÔS£}½KK´M`ç7šÿeÐkdP×^GbžZ xP‰š.k̉ ¹€>#ƒšFÔB4ê - *a°Gƒj(èÌLé[¸6c‘RÿÖ{E}Ž®Õhþ[4*%N°i”›^—€žÕh™¨”ø ‰©‘/ö¶IýeÛi©A¢Q«4…F³X@Ù¶ ÒHýÄ»énKؘ3¦‰é/¿‘X8B£é²îø€5æŒìðô—m+ÀÛãÞÒïXêÓØY¶­TûƒÑzj9RããÛ·™Æ¯¶Ñ*eÙ&Äã ~DåNC#L<~ ä7–¤ÑÁEcƹeϧ.¡Æ²-5¶N&ÔÁi\ (ÒÍíæ©õ€sBÄp]Ãù94zf"°•¦0n, j}D»Úp~cê(Fè^æÿ¬ïÓ§qä›s^Ô†Õ˜´Íˆ™ P>h¬‘më‰0@ú ±†­óµhDÖÏ6¹ÓXKÎ&fþ 41œF­XÓÄ(lbjÎD;<@ ¨¡bP‡Ç,i­ÃsÖ™Ñx™-Vê3ÎDpõb;Rã‘hO'ͶÝ{fÛî½Çþò!ÿêoAoÙ¶ÐÞÓ‹NŠÖž^tR¡ÆGƒÐ›‚¨Æ·£ê„°Õx³˜K¿Ž>¢s‚©ñõèã9-ˆÿúº_¹/£F'>_}k¯‚ J¾ xY¾ü,(5~>9_ð:åI]ýbaRã«÷B¼‚ý5`áAãø?’K¾å endstream endobj 11 0 obj <>stream 2014-03-12T23:50:38+01:00 2014-03-12T23:50:38+01:00 pnmtops noname.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000384 00000 n 0000008160 00000 n 0000000325 00000 n 0000000170 00000 n 0000000015 00000 n 0000000152 00000 n 0000000449 00000 n 0000000549 00000 n 0000000490 00000 n 0000000519 00000 n 0000006677 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<3EE0D10E7CD35A2CC72C29FA52550E2E><3EE0D10E7CD35A2CC72C29FA52550E2E>] >> startxref 8340 %%EOF geomview-1.9.5/doc/figs/command.pdf0000644000175000017500000001156712310162277014112 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`dh–R0403Õ3R æz†–––Æe .ù\@¿kendstream endobj 6 0 obj 61 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 2179>>stream xœíÝ1rÓL€aqZW´œ€‚Š&ànÒ¸àä4T9AZ*ÎóëGd#˲$ûÛ•%ùyfØIŒYK™ÉÇkÙwïê_þü)±õËËËóóóããc‰ÍF•žBõþ_¿~}£õç?~̸ÖG_o›N ûþV«Õ:¼–žBõþ?~üø7FÓ­yGuú{ ûÎS”›BõΟ>}êÖhÞǨ^OÀ n¥èê¯Ñf¾Z­V«õÜÚž–ý5º„£´Z­Öe®íëŸÏ5ZÏ× °j½Ó²¿FëùZè]P+µÛíz§åÙÍõ.¨æÁnþ¾«ÕzŸk=>þDñÝš1šn™T£/á×¶ž½R\î9ß»”rM¡öÓô—Kk4~ñ}€ûñüúžù,sãt Míçé驽OêËùj4øµhŸjûd–¯9òu3,J®ëBõwè”oÏöÝš}ÖT£i€6ç°º©´º†E™¡F'ŽÑªõ¼¦=AëšJë:ZX¦…Ôhõú½¼¦2ƒzŸì§?ØùàÒûLÜÿÜio>°0@}uá×btŒ¶ïpúqu2é®»Ïðþñ»Ã6X£—þPS{~OÿZ\4C«±YvÝÇçîÜC_‚0:á £vÑ“¼¥ÔèÄGíÜùÒ½zŒfœ¡¿0†gèðou64LaºáKCfth,«F/£íÇÎU£3¤èE£v4E§ŸÐ6¥F§?á[PŽ>dGýØYjôÜÌÊ>"¯HÎ1:Z©À€ÑmºŽí=ôaWÔhÕ7¼ª¬³2øñèÝ¦ì ›R`Ó/.¥F¯yßh£·L;¿UâÂèÓÉ›¢Îueï=`Ø_©œƒŸ©.â}£GG_åûZ÷Cƒ.¢F޾R£ÀåJ×èôÔ(°>¥k´1q˜ªQ`•ŠÖèÕû\S£Í]§ü£ëã_7ÿ?Q­VëŠÖ4û²ì–k ÕhóGõçíùš~ )(}Q¦Ë8:rmÕ®ÑölýŒ><5 4Ö2F Öèu#OµŒÑªPž›¡§“T½¦_6ì½¥w8 ¿TsÎ jtx†vNC½‚ctâý§˜»F›ÑVýn§#/Ig¢F^k4%×éU_Šu¸6 ¬R®1Úþ zy:>stream 2014-03-12T23:50:39+01:00 2014-03-12T23:50:39+01:00 pnmtops blah-000.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000378 00000 n 0000004408 00000 n 0000000319 00000 n 0000000164 00000 n 0000000015 00000 n 0000000146 00000 n 0000000443 00000 n 0000000543 00000 n 0000000484 00000 n 0000000513 00000 n 0000002923 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 4590 %%EOF geomview-1.9.5/doc/figs/light.pdf0000644000175000017500000001344412310162277013577 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hbb¢g¶02Õ3S0×3µ´´0Ò†–––¦Å .ù\@a±Âendstream endobj 6 0 obj 67 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 3115>>stream xœí=’Ô<†›£n!'  "’½Ç ™dîÀ^€d#¨ÚlJDÊU>úÖhdYjIÝRË~Ÿ*\ƒ­‘-¯¿þŸWÍ«åßïß¿5ª~~~~zzº\.•Ð×õºñ¢ÉçÏŸÿy¸üÿÝ»w‚ÃEB¿âõcˆaŸá'â5;5þyLÂo€lÍôÁn¼Ôÿýû÷›<Ô˜ÇÒH¦F¯/5¿ÿ>’‡n†b¨7 TŒç¡…Åãe~ìíæá2A<‚‹½Ý<\&(]ÌàÌÜÝÝEco7¥.f¸Ù?õŒáÙ†ôwßÏZßóÍrjäóð¹ùÑΗ‚Aö½'¡Ëo¾YNË‚<´ÐJ”‡þ^?ôëáŸ@yxxðëYøúåa´Y\ ץώ¯+ŽM]ßKÔ(½t3N ŠÍ”‡zBÑS¡‡Lé¥Ë$Û¿ σ<¤Û]Ó9ò†ëÞù2ÆŸ´~ö Ðfo~;räaªüåÞ¿ýýotR`rt8ÇÌÃÒÛküËæá¶@Â(æ$pHÒ}¿7d(™s —n“Jðz’_ :G0;Ù¾·öRÎÙPyHÞ6€Ÿ‡ÝÂ3S0;Ù=>>rF˜æé; ýæ÷pdÊz8—ŸÝÙí½©K{ݿժ+aàvÓol¢Âè:q÷¬åaõ·fô0±2׿Öv’ëmkcýÿNäaÑ¢ú…ëæ¸·ÂWuºÐ|yÝ ºÁ–o»!Ll-ÐèaШ`å/ëþ|[¾eÇÃ`‡‚”ûÌyèw)ºÕ,û9ú§²™“²“övY×Ïuklàv3±¨Ñ–V{˜h¾“åávCÅßa«ÖH‹‡´ßÀ¢—¬‡ªÛÍh¢ønk[dz`nïæËÃjéÐû¥+[‹Vš¸‡zÛÍ=£ßô°bãýìs¢<ô§’IE‘ÍàØö¿SxØÿªŒ‘ë@`Eñø0+|PªùçÏŸJ5û¸åßóPý~šÄu‹µžmùÄÕ|xxNøº?¿pŸ?GÚCêyi‹Ú‡FØöã=\·d–¤^Ž~y¸÷Þ~éDÀC#ÛCÒÎÃàH¹vuáØâyü ²ÏÃÃjŽí!áyü4ðÐÇöPåý¥Ùû÷+nð>øÓxh„c{H²ï/mô°åÁs%ࡎí¡âû¼ÀC%;Çö´óп@Ø»vŸu žc{¨{|Xñ¢) šáØ’jîíO2Çoéÿxh„c{¨ž‡‚y <4±=¤YòpÔ»Œà¡\?v-ËÚ-9XðpŽ<%!ÁC3,ý˜¯V<$í<$‰Ÿ.<˜‡ü§rÀÁv?MâºÅZ϶|`Ýöñy¯[@Â3câþÒ±VÒï=Ðïy‹½ýÒ‰€‡@‰®y8êþl)à!PÏxþ°x”Àó‡ÀC ž?,%ðüað(ç €‡@‰¹Ÿ?ä%¦|Þ‚JSx”˜ïy‹ä!8³æá¶|à!Pb¾<ÄùRp<¦þp^]m“²6êV !Úsæ{þЯ':UxèXÖÀzë¢ÍVýìaOüUçƒç Ððpºý[×cMµÂÑÁËzˆç3ÀC‚‡ 0=$<˜_:‹‡Öò£Pq¾4Ãpiçú¡È9&u¦;ñó4üõÙù< áúaË÷Óø{}‰s’‰L4<¤ÛvEûQ⺅_,ººš]‡Ó/: ä¡ <î/­y(<$xØòPxHð°ä¡ ðàaÈCà!ÁÇ2ÀC‚‡ ôÎC›¯R–<¬¢k[B‚‡ð°–NyØ©5€‡ð°‚yhó÷FôòÐíÉOGà¡ÁV8 .˜n‚R–l°—0ñ=´ÙŠõl…5tóP ò€ñ ò€ñ ò€ñ4å¡ÍóÂLJMBBd)ÎÃeÚ˜%àÐä¡ÿ’S€8ù>stream 2014-03-12T23:50:39+01:00 2014-03-12T23:50:39+01:00 pnmtops blah-000.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000383 00000 n 0000005349 00000 n 0000000324 00000 n 0000000170 00000 n 0000000015 00000 n 0000000152 00000 n 0000000448 00000 n 0000000548 00000 n 0000000489 00000 n 0000000518 00000 n 0000003864 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 5531 %%EOF geomview-1.9.5/doc/figs/mat.pdf0000644000175000017500000002036312310162300013232 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hda¨gj7474Ö35R0Ô3762²€ÐÆå .ù\@|`ôendstream endobj 6 0 obj 66 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 5538>>stream xœíyœÅÙÇ{î]vÙƒ½¸åFŽ}W ‚¨ \áˆy#D‚(ÄQ!|"‰/#¯Â‹hIÔD5%‚!‹r/rã"r/°\»°ËžsäÙíµ··»º¦º§gº{æùþ1Ÿêkª~ýTu3¶qÿ‹Óß®cjQÉÝüÛè,Ǧ—,@~`óS%e•—¯•é’f”‘çîØ"­]óÔÄx7gn}dñÑ"õO¼»ZZš¸t‡Ý~Ïž€§Èn³îž.h½,x5øýþ¯¿=zízÅ¥âR–=.çÄ}w>³ÿøö|üzToºÁ[ŸïbOÍŠ@¹8;·uÿq£òïéÒ&«}ËôÆâ¸†â¨“¯‰â’2ÐÄÅ¢ö¤oËíèv»¿Úõƒª =ø³>|àÑG;vl«Z ÁàÍÏvªJЊÜ?"×n·-ýd£Ýn70‡ý¾Qý °ýà‰¯ãOÖËbëþc{ŽœGÈnž~c×6ñçÑ3—Î\(:uþŠ$Ů횼±ÓâO·«ÍÊccû­Y³&33óôéÓiii‡ÃãñÀù¢¢¢!C†@൷júެ<:æ¦?}²x>‰—t'9!nâÐ^ þ²Æo·;ø“7uo×¹MÑ>ÿdá¶õ®E_KÛuÿèqð>£F ‰c—Öl9(Ž0 §}«ÌT·ËQQå­ªöAïa˾ /7p$ƒûvéÒ6ëµUâÌ»ú¯^½º[·nà$àðСCÅÅÅHIIÉÍÍ…À++·Æ3Æõ»VpdÙÖËîØ/wd ÏÂUdÑ€¥Ò%¹¥ÍfßE8ŸŒ‰„νÃrþüÅv¿·Êéªó”cå¤6nÅ^VQíóû}þ4ëPþ@\Ë'y{„¸º[N{ ø­_Î^ê»ÚÁæóùáÔ‚¿®g7»EÆOº·÷¸’ÅUV{/—Bÿ¨¼²êðñs'ÎÕûŒÇ' ‚Ôü7«-ŽY¿¼ò$îÞ½Ûét–•••––.]ºtåÊ•/ýu£põé ¶^«|gÅ–N ®'Ƶw¸šA‚A“ö=¦öM®¬¬,(¸°jûI0ãí_þÛ&øìÔµ}ÿéíÕùߟZw蟎`aÞ¬6‘¤ÊʪåßuÕàmøK``NÛs—Š÷8’Ð8‰?Ó«cË.m›ºœöÌÔÆP…Pì^ŸÊº¦GN]ظcoRjZ˜,S7‡±vÛ¡·V|Y'‹—ßûJÈk|œ»S«Ì²›A—$)!*ºVP·ËyøÄù}ß×74OOªqøâ*d䙉·‰eM ‚«mD.\²xñý¯…«¿½çÖnÓò:¿­ß#G¬ÛÓ@`ð“~í¾?õ­}Cw®šùôò ©.;XÚjûöpÂçòÞ¸wM‡uó¿øÁ7¶Útö.žš3ý0€» ‰ü´sûžwÎ]ý„ga~·—'„«s?øFí7ÒF›¬”îí2>ü|CRJ]¶ÈLŸï´Û›e$ó¨}¸ .^… o?x|ßÃi™Íˆ–—ãzyÝ2»ez%8‰Ú4âÝù'/H,øùÍÐÕ7mŽ­äzÏÿ þ5µ¼Ò ªÖAòŽž¾XRV¹rÝ6—'Ž?3ûþáà-ž_ž§¶8ž»ÿ±,¸Ze ä¹sçB·ã–Õ{¯9÷ÝUèó–”Û’âÛú*OÂ!LÙ·uj£xWMÍáiùû7þÂ[òq!,¤àJȽh¾ä*„ç}qxtï–2mµBqƵòUÖˆ~λQÜ»ý‘“…ûöHI¯+m(ü_ Îu9­›6á__ýôꪽ¾ÿÚ]qíbjF3‰e¯Ž-„÷~_Š%ðì”ïžn»rõ:üŸ¨¹PT:ëWƒ+ª|ÝÛ×[sµò¹äõ“ù3Ï?8ª&¡e  þ8uˆDùùùK–,Ù²eË®]5¯¦³ß®÷^/L Ux¥Ê›ä/l=þ³‚O‚C0€óÏOòÜŠo}U—lvûì·Öñ–|\ç&º¿½^]“„ ®®•\…pA•¯¹ËžÒ(®Ä›È'O\ýÝ;zŽüR¸­W»‹EW·ìØ’V' (ü©wÞ dÁñ£u²ð¿½z³Ë[ššÑTb™Û¹•8ÍíO*YBšéÉ üÉÝù§åi¿»oøÐ‰3lg ‹à`á‡õOüÉóEcoÏéZÓ9ºµ«‰p¡¸´:žUÕ;ŸZ¿igr“LÞò‘»n…;ÍzcÚâ˜?m8ô7,X0lØ08>|øÑ£G322²²² + gž\ò¥`<ïáaP…ÂáðwôÌíØÔQ[vü™'äyêõµp¦©«°_¿}:6={öüè‘· ›¾Tœ~þ³ÃÃ;'÷éT§~8Ë•O!L™ûÞ?w^:_”šÎŸÙ{ôìKÜ BVZß B– /_?:kñê6)ö”ô¦š-s:Õ{‹=G ä–À¬ICÆüz–íxAMwìÕêeqåjYRB>~ÐŽïÎm?Ü`À#(KfަL{媴"ÏN˜‘š0~æË‰)éžø:ßþù¦ƒyKƒ':øðö§Ãîõúà±ðÀ+·vMOú± Ãa üfÂíSžxÎömþi8X¼ªAߚػöwïÒñ‘q·¶m–öï]GÖïÊ?¸}}fz“¶ÝúØD£rý{fßuǽðÞ7Å%åa-ÄècÉoFo;pòÕ?ÿúj“öqÞÞËžälœÛé„–ª:õqW5øÔ»þ0¤WÓ¤&Yá³fŒôð¬l›÷ÖŒ[¿ù©ôMÝçõV•—^>w¢ª¢föË×(­Y[w|¢Ãé”XþvòÐN­³æ¼›¯àa(½(dìÀCût˜ýæ?woÛ˜Þ2ÛátÛDsf§¿Û]VB(ÉFÐx·È†Ï°Z‚#xrÎ<Û†ÿ?Ð#•Ç ü•å×ýޚμÝéGg³Fï“ãsK·ìf›÷Ÿ\¾&ʧ¸BÄåöôÌÎzèΚ)¡!¿z*!9­q“,ÉœHyI1<’ò¸N§ÛŸàpºÂjùàßòÌØÖl>ï}!VKZrâˆ=†õ»!Ät¢žM{=û¿¯yâ7ÉtºÜv‡ÔûˤQ7¿¸`±mõ×{áào_†:9¨<󥦦@ƒ’Ý"Ãàü¿ùŒŠ®•¿RºmÛÖêÊò¸FINOœ;¼¯ÍfŽ%†ß4ÿOoÚV­ß iö«Fç1žWVm›4fØ«¯¿²@êØ³gOÞÑ ‚,rrrŒÎRÔP$oÇ×ûòåËQ¦&’²€{Mž<™CY˜¨ªÈÔH>QÖe Ê"55Uér#”…•P’… q8bKì¥ÔR¯ PEPYˆy/"„! 9ÃÛ¿E¬ËB©v ©õ °ËB,± ”ÎKÒŒ9Yp¢R»ß Åô|X EòçA£,ÈeÄbC,î°ç¸!:Ê‚N,ÊBæ6É”rdtÂa‚½ËÉâ-°©ƒ¥Ó®V‘ôª^På]Nb,ìr&ñ%N¹÷ÀÉÊWÞá€Dp8 !€²@ì©%b·CYX”bP”Be@Y P”Be@Y P”BeP' â‚”×W-Ë ïbÎeº–#$o¡¯,8…JEYDÕ²û‰ ÕF_(«´Qé^\h«´µ-–5"! qDŽ$ > ´fUÛ]ˆ–²¤ƒ„]A—=ÊÊjw âÓe±|¬¡±oJ#B¼J± ñ.( 0ÉBÉÏËK\b#ÅÉZnb—S¾°]r‰SÞWIì=(­Þ¦¤ø…µf€_®Çƒãƒ²@@ˆëÃ($ÛPƒ²@ ,‚,ŒIS' ótˆ¢‰œZø°%½…x_""&Ä^(‹è„²c˜RÓ|yÒ½…!­ ÊBÂ' Έy”…> ,PP( ( ”P~v"JdC[ºcùTÔD8°¶,pƒ²@ ,±( m=êTê/–‹m¢`=¦yzoZdÉjÀ E†£QÄ-=rKú’]îÇ%¸|D¢”RG¡*…层&S°®ü&n¾à”ŸE¥¥áŒ{=øn(2Šö‰p̲ÎkÞ$O˜8=5b6(Lè)G1’…|;KâœBᆢp\”*¡\å”·î„" b#Â)<ýúž×£´-Ž[ŒyVËâö!²@Äâ('”BeXnÅ]eH¸Ao°¤,ÌóúMP–øÇ #0kЕߡlàŒ7&®”…b&ÄðËR4lÁ°je!\âÂÖ'EY6YD,KʰaÊ„”…Ò\qIJġ, " £0‹,(/#pkÊU3bˆD‰,¢àÐlX^¨‰p`mY áÆÂ² n_µ¥Ž:b¬NA×a#чê•ßi÷•|¶Ü^²y ÷r™Ö¾qÐMÃî.Üa Tt9);)TÉB8Ctè-Ì@H}‹P¼EPБˆ Yèå-”…ฅÁ˜gýn2ÎBÂÊ!€²@Xrûy:DQ†à!,é-X–áÄøê~ DÉ2Ͳ ,Î㯚¡D"OPY(ýÞWd²Äé% K/ôШ’Edz( ãAY ,°ËÂ,q( CˆYh~AYDm#ÊØÊ"¨·ˆÌÜ` ¬=n„K~#á½BÀ²Ð׿©ZÎ)„)kûtÌ[ä1OïMãö!½*@ÃK—R”(ØUÊD£¾hßU&œáŒ[€”–õÓ ºNXˆB\r¬”+¥°Ø’qƒS,ÀÚˆ7jþ‡ÊUb.é)+­)—¤/$¥6·Ät¢}¶ 6WÏ1x %”&šå:“\RJx_b“±©mS¡îMDÛ†Aº·%÷”*”îˆÒ}U¥Ýè³}HíyÍÎ9ˆ©´‡ËÉÁ1tTÕ®{ˆ2ôΊÍrŒ2Â" ŽíoYÌCÀÁo„Ê!À$ ¥ÙÄj€Iæù‘@„‚²@e˜¾²Œ‘…V‹ r„'Ö0Yhx«”GQš‰LŒm$—ˆª`eaßÉ#É’Ú!mC«¦˼}@Z&Δ²Œ†‚¾² . P› ËB@¾Bi˜YE]iì™S_+ŒÃÛô”‰®‹ž&å{)¥@LPWž yq™ZògÝ[p²R+ ¥i[Êdñ^’/Å©™`S’{:ªb ÷µ€,('%Wåaz\Ucê¹<¥W мä=5–C«`jYH^Ïä|ò(\×.%3É‹YPK¥K¡˜™¨’£%e°A>L‰²Ð+Md!ï[°ûmÞ‚1.ÊBÀYp¤1;b” ƒÐJy ¦ÀÉz?ô4-yeÊ!`°,p‰¯91~ND¯»":b¼,‚΋Qšn%vÙçÒ4Ìâ†8ñKŸOgO!LóÏ&’…å«Rd!U•c–(òQK]dÁi­à°.H0,$ow\ÃRcWŒÒK#åªüÖ,¹â”_J)i*ÉB[úAc©Åt²PªHzÃ)4%ô»„" U2•d•‡’á é«Åˆ‰d´¿0cMSŒ‰fBXCµÑ¿%( )ªdÁè“•"j,Ø õM„£®úL36"rcÉIù­Å‡’OJ,¹§!ž$æ’mºú‰YbÇD²°"–Î<SÈ‚³ì_ÓÊ"•aˆ‚ñ²Ðë®ˆŽ ,( „€Á²ÀŸd49( „þ#B Ò²@b ²,Ð= RYìÎ?-\s:Æe 1¯Ï'„s;·j PCœÛéŒËb ~ÀëóWU{!Ü»këzYlÙÜa·Å{ÜFç1pUÞ@ psÏìzY|µã;ø´ÙlFg1»­¾æÝØ©^"P#‹v&ÿ«7 endstream endobj 11 0 obj <>stream 2014-03-12T23:50:40+01:00 2014-03-12T23:50:40+01:00 GIMP PostScript file plugin V 1.17 by Peter Kirchgessner foo.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000383 00000 n 0000007816 00000 n 0000000324 00000 n 0000000169 00000 n 0000000015 00000 n 0000000151 00000 n 0000000448 00000 n 0000000548 00000 n 0000000489 00000 n 0000000518 00000 n 0000006287 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<059C5F256A0962A637945EAE6C0FF59B><059C5F256A0962A637945EAE6C0FF59B>] >> startxref 8042 %%EOF geomview-1.9.5/doc/figs/secondlinelist.pdf0000644000175000017500000002117012310162300015465 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hjn©g62³4×3ª2¶´´40R0Ô32Ì!Ê-\ò¹€¶endstream endobj 6 0 obj 68 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 6026>>stream xœí;–ܶE᡼ԑ:Ô¼–Uò& atÒIžƒ{J*’×ê(”"§o*¯È"€‹ÿï€Y÷´Ý]E²ˆË£ âKÔo‚…Ñoâߨîo;2¹Þî?1ýøº8ùãsðçc9AdÿóüÜ‘Šìbqr}Òrè?îAµ 3âãÛÊdìˆ76rU܈?6&?þàŸúŸÕJÉäè`Žü#Ä‚¢bòëN™ä„z ¨˜ü­ ±Âú}CQ1ª =Y%H|.½Þ¯“þ¢éÙÊîàõ†ªƒ‹s“%'8«‚†‰Õb³8y_¶Ëcr;Ñv®÷¯÷ó,ÿŸKîõª=«Å_é¯oê™”îÓÉ$“†“÷ËobòÝóò,*crÍÞµL:H.¹ý]è¿×~LÚNÚÿ\(&í†Î»ÉÇŽ¯¤Ì9‰‹«ôõš™¬É¯¦_ß#I!Tî>—äz¿šx2i9¹xn2i9ix , “†“¥LÚç}O0IßžÂIÊäò«–IÇK›É“—7Â(Œ%ºì>{hÏúäÙµcçÜb&ab&AJ2ind&ÃJ0iyÉL•bÒ³Ýeò‡¨öímø0è®?¡ë½[ìß®™|_Fl?¾Ý›3^ýØ~V¯7´C3ùßõ0ï®Ö¿ë4¶oY?>Ä_ƒã9¬þóï2”-~_\îýÒ1õýïe¦ÀæärÃìdîNše73Y©•IZŸd&+ÅL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢”bòòøs»ÜÄý?VX)&¥}'Ṵ̀’LÞèKv2¬"&ïYýöÈðËŸû[6V+—I»ÿäÿ,­$“ëïur1sº£&±“¶ÊËn²…ETÁ$;éU“²Äa' •1¹Ù¸Õ‚„;±¸Ý÷¡ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢”`òû°À¡?Éë“ìdL¯†U)&ÿ´?Î’ú$,'ãL²“A9N2“•b&Qb&Qb&Qb&Qb&QªdÒœŒRvGúv`ðøÌ]FvÞW2ÙÝIó£ÙN>~2SŪŽÉ>FO[‚¤5¤ŽI9éBO¸Éiô­ž=$·=¦‘¹Db;ucΑ/ s>ÒE¨hŽÇ$q’Î ºÿ¯.Íݵmw6x$Ç…Nä/]¢*&IØž¹A­t—1}ÈÆšº@Œˆì?5©ŠÉV'×ÉD'}úµ:Vø?;¡“;0©r¬ï@²ÏxmA}'3˜Ô9QÝé©3æáqÒ{¼{`p¿ð99ØÈ*&•‰ª\ö•8¦tú}¼g›b2¸ß*i&t2—ÉGµDè—º†òxk8©kAä£[-èbŸã¦­²¢®Mëdm»ÛºßuÙÛŠ¯}´YQ!ú‚¬yæ¾içÞ©è%ÆÌ?—¤Ìqþ·ám%ÆøN0•¸%îŸD‰™D‰™D‰™D©É×½ã;’J˜d#c*`’•-žÓ‹3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰RÖºjÉ%™cϰi[D4k½ 9Ï'g3ÎI=Ií Nf¬a¹’~IÎ|'sÖ°ºl‹‘Ù÷¿îâžÖô²z,&!çì¨ÌuÕ.j¢¾o.dp2~ø¦!ÓIÌ9;ªI¹Eß»œ‰Ìôo=î"¢íçì¨2&e¦&+yzÜAænÌ9;ª’IcŸÉí¨ú˶œ„œ³£òËn¯“žG!¬J ì> 9gGÕ'}3éÇ3[ÿ™Jœü6ŽšioÌ ×#Åì“Ö‚¸Ý ÷¡ÄL¢ÄL¢ÄL¢e²ïJº)è©ØS.28Æd×ËY—üînÚ!éJ%"Ž3Ùo¾þcºûwñ²¼ùòÏú[ì“t¥RÇ™ÜÇÉ/âúbÇ5·“¾ˆg`ò,N&˜¼têfÄuGþ5“žK©ˆ“L²“›ÒNŽfr G½ I›½£™½ºŠRg²ÙI5¼$ßrr0“[4ú•NšöËGd$÷v2ñp&óœÜƈU%é±´,¼Ü¬/†D)íäX&_ÅUn}M8YöFÈã„”' Ùa”Šx4“¯*,Ÿ“êxß°3jD†–]t£TÄ£™|Ñ[“¹[˜n§ :)“)ñp&éö2'Íábáe¨´“£ï“R×Ô}2”«UÙ=ÚÉ“7¼—†“¿db¹NZ%Ž3]©s‰SÏälN: ®é6Ž\ß­o-Hošì>q2¬“Rwöñ÷ÉR'G-¸–º³ÉA ®¥"Ýg^™»(íäØ>ó39ÉL扙D‰™DéÐLfõ™—?ÆVv¨TºWmb&óœ¤ÓŽsÕâd°WíLFd>d©ÁÉêvw'Õ´»££æ$jã»_ô&ãó•W·»;©ÂÉøèCà ðçj#>&“Û»œÑ³ï÷²Áù\mÄ'`2>ú@r·ääÌLŒ>èÜÍL69é±m:&ãµ¹ZáFŒú¤ûÝ/Á'Øj#®gr6'Z¤£¾?Fh7…ó[ŸZÐÄ÷ɰ:üÛ¦tèû¤W£GNÄäàчó09J'dr˜I”˜I”˜I”@LZ\\\ÈÑs3ºxÇ0©êo3:©Z‹îf¤ LêɈ£œŒH÷`x6…`Rwýá¦wö}0Öo±Þ·×åLZ}*u}‰ÒÔÔ¯ >úéÉÄDÜÔ?9ÌÉòчÈ ˆ˜|¼?ßÒiô!v(âöúäÜNÊnÝàÍ‘ƒÚ83”8éчÁ%Nvgx-ÈŠÃ}] :d»^ïNë|}AóŽ>ŽÉiGŽÆä(ÉAb&Qb&Qb&Q‚0y©/,­ŠŸz‹ë3/«[ÖWDý“êqôŠŸÉÉ$“îý¼ANV¥Ý|°!Pÿ¤ŽB?Ó¯úoìOvßt“WöÇóÜèC0 ó8+øòê=¨ÏÜpRužêg5H§–Ñ-£Ì°»ep£¡$¬ÿiðU‹dtaRþ@u¥ÎnãrÜú 7ú`ÜÂý˜ft]–=˜¤—`=k voYO;íéµ’(sR~éd“ö³Î?7ÉzLF´“(f²LȲۈÂýjœ¨“v–ÜÙI;[wq2¿>IïÝÒIZâÐ[{‡GåêD‰ã?ÎûëdAG®l$¯OnRñêÝ´ã_Ö“V›jABÝš±¡+^¡ãdtýjA‡lwçæÎŠ\Òùú‚r3&z”â„LæfLð(ÅüLFV—JÓ3[]v*ÍÎd(®#:9þ»H|qÑIf2OÈv÷C´¡Ö/®ì>sÙ_Ô}2²/è!Òâð+Ëg˜“nŠÀÚ8U&ãáöp2®IœL3©{óUߘÙx%óïn™‘åLGH ¡C ˜´{òUîö÷¶ôÊÝ‘ù¥²ÓÄì—·ñÏ>'ížB÷mu\£ÆošÐû>û`\”ÏI:ÂÐWÁèéàSé“-“2i\—µÇah« ÏÜ.uhâ6'“q'õ°ÃD¢l¼\Ÿù¤NZ¡t²t£Ž£mG…`òb:xš¾è¸*F.j©cá}¢-`ÈÚ,º(<€Ž«rô!và¥)`lÿ¤·‹°.Ót}Â`[ÀØ>s'¶í:;ÄU3ú@»ÿ„ßÉú€w`²N½úÌ·,c²SÄmLÎédøo_'k˜Râ$GìÜ÷}Kœ &Õ‚‚‰»÷IY!¢h ¸c»»%§ì?úÐí¢.}A€€G@Ã}˜lØsô3\Áý“(qÿ$JÌ$JÌ$JÌ$Jøyæ>YÇd´Ë jæ¾–áãåú;¦´OŸyO'/7ròÑ›ŠÏ:A­F1Ù—JZ¹J5™ØnNf>û Ãv… K ØÃy/×Ií=·ºq.Ì!µéÑ Ÿ¡Cæ™n¾¹Ý1î\ÔTÇK¦“¤Ã3BpõõÙ3SÛ„géýS×­zn¢ÑçŽ>ÐÞ ·M˜¬áØ· ;Ïܾ ÑÙI’»Izî?¢öƒx«pLÚ@È+èë¤/=sÓEeå£0)ܵ–h¼'C—P\ J9ér:/“FábÝö{•8BëlNî Åßö/q²™TäÙ„êøZ*3禷N™˜Q3>1“ZÑì Ž«¶Ý Ï#`_¬Qî×ÌeÒí×äþÉ“¾ˆãL¾Š~J´{&]©Tk1Âd׫ù妰WÒ•ŠGc’U (“¬1“(1“(%ÊVsú&]©xÄñúdG½FÙŸÑÉDÄq&Õ˜ÅñOvŠ_B;þ!g¡•Z_\uI…“¡’ˆãL¾¨`®/3¸ …~}Yöü“W]Ò%ád¨(â &—³]E‰“Þ$×>f!#Ës²4é‚p2Tq’Éå\¿ÌÁÉ„bNþº7_×Èrœ,Oº œ •Eœ`òq1è¤xD–v²&é‚p2TqœÉWÙ²D:¹–̯)'«’.'Ce'˜ü)Õ(¤“K ç%ÍdMÒád¨,âä}òqA8'רòî“åI„“¡²ˆ3ÊîŸëŒ“Wy¦¼²»4é‚p2TqV}ò§(sòêßñòå*t=1¯>Y–tQ8*‰8³ó³ÄÉPä÷¸HË%·S’tQ8*‰8YvwSºìžM Lv}Ç5¡‘ L² Ä}æ(1“(1“(1“(1“(1“(1“(1“(1“(E™ü40°ƒ(s®;™ÒUOË`&[t†“Q&ù¦Ñw!ò™d'#²d&kÅL¢ÄL¢„dÒ¿bÏÍ}ÓçñÖÁB2©ž°¦âNžÈS(“öŠ=!'#Ž+8“äAõËcÍò=aò¢Ž8‰àLÚ+I+;h'­õ,N (“ëoÂ]MEn“» «ÓÎ ü}r}µüŠ:)è^§þ>)„ñe!'Õ:*gQ&åz¼Nò}2(ƒÉK'3˜d'-Ý-©erºUΆê“ð:™Å$;Ip’™,3‰3‰3‰3‰3‰3‰3‰3‰R“'lW“ì$ß'Qâû$JÌ$J-Lþ="àiõ¿&ÙIª€“¹LÞ.jyi+²Ë{`ðøì P#“Ý4?z@'3™ìcdð´3ÙÈä2§o}Àá"ÔW«y|úíE˜_é÷xQÇ©Î9è¼@ß~AÏñ˜`8JÍL'oöõ•ÏÖ.õl‰µÁs 9.t"ûø1jbrîñ –ÂÀS˜o]7zÁ6Ö’=a;Ù7“yL¶:)gìûœ4öé×êXáÿìtNî¤ʱ¾É>ãµõôNfö A<±í2ÿ“Þã݃ûÅœÌ쟲8ú¥]â˜ЂÁ>Þ³–8þýô¸ÌgR>½¤^Úµ ÃI] "ÝjA7ûô‹¬eE)\ šÔÉúv·u)¾+³·_ý8»"jlw²êƾª²·ú\bÌèúwXP&eŽó¿ o+1Æw‚)ÔtŸð´â>s”Çq¬Õ.ʃ<ò¢-Lvwò8¦¶1ÙÇÈS9™É¤|4[>©½6êtG¤|{3+ìÛûí°ò©eóy¢ùŸZnf’8é´ßtûÄ×Äólðh¯ë2­šçmNÒuèÝÎZ¼Á:ÄÝh¯M`.1³šçµ8¹5¤½Nû¯çÖH&UŽöHö©.Œ©Õ4CåÄ‹Ð/oÔ\ýGxœôïhäøiÕÂäßÒDU.ûJÓ R8Ç{¶¿ÄÉgRùÉ—v-ÈpRׂÈG·ZÐÅ>éÖC7Ó Þî¶r¡/SÚۦϸYBΟ´r¡/Sz3ꩬcÒj‹øš&Þmgv’û'‹Åý“(1“(1“(1“(µ0É«/™ªf’´TËäˆX'W“#_L~çTÎ$+$^%f%f%f¥"&¯#"<²™d#Êe’L)“IVøû»Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&QJ3y1§“ú§’žc‚i“RLªGåÔÇ3õðÇs+ÅäöBÊIVšI2)_.GCWœú©ûiÙ'Sò>I–53Y2ŸRò<ûlÊ(»Çë<Ï,z®{.eÕ'õ²=“ê店\”WŸ$_›/åv2¿ì9y¹±“«²ë“ù%Îó:™ÙÆ Õ‚„rSð¤Nr»"î B‰™D‰™D‰™D‰™D‰™D)Á$?}Â8Á$;“ñ@g’I~°;¨OÂr2Î$;”ã$3Y)f%f%f%f%f¥J&£Ó0rvy Ÿy¢¡}ó•LvwÒüè!Ìb²‘ÁÓÁÈJ&í…‰;¯°ïIƒžãF'† S5“t>Kïö'rŽŸËÉ&UØû¬°<Ùgœ{ˆª˜lu²p…}ãDÂÿÙ ÜÉÒö=iÁÉ &uNÜe…}w¿ð99ØÈ*&•‰û¬°ïßo•4:™Ë$]þ¾ï ûÞ4Œ‰Is:YÛî¶.Äw]ö¶âkmVTˆ¾ =VØŸ¾:„É=VØŸþŸ%îŸD‰™D‰™D‰™D©I^>¢&ÙȘ ˜de‹çô¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢äa’¿ì¡N.“£#:¨®|Ÿ‰ï“(qÙ3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰RŠÉÊ¥—žp†[ŠÉïUž|zB®“L²“™b&Qb&QÊbòSÉ—·;Yœd»“Ìb²$ëú]¼bj I¢™¼ŠÝ¼‚ê\Iæ2™iÍws²,Év5&™Ë$;™J’™D%ÉL¢’d&QI2“¨$«˜T+UßF8'«‘5Ü+€;©×î1Ö…I$YÁ¤þZP½„ˆ•ÐI}-3'r²”IM¢ZâÇNï¤.µÔÓI’t2Ér&£”ôeÒXð²­¸Ó›I{±P’åLš×fA²Cî¶¿g´³“¾¯6íÀ¤³xJ§çF´V ëàä¶Ag:cU³>Lî›»enz!¬þLªÕÍÉ“l½OîUâXL’={9éÖõL5—ݻׂ&v²±>Ù¹f.qvr² ÄimãP+;;)׷ݘ,©q»’$÷¡’d&QI&ß?þ`&ë“$LþwyÏLÖ&¹0ùvÿ»Þ'…øÁLÖ&¹2yÿûûê$ß'ë“\7'#ewþ£Ê0'Ë’lWc’™ewÁ3ß(' “lWc’yõÉ’‡çAN–&Ù®Æ$yþ$J<%f%f¥$“uËË>§“üŒDüŒJÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$J¼N/L“ßFGtXYL~Ï‘E™üüƒZ~“a»?Þ";ŸI #“ÁÄ[l÷é#jÄÆä½äÿ¼‰øþgù¹#õÛ¿0ùý·xñýO£„w'YýW«3! endstream endobj 11 0 obj <>stream 2014-03-12T23:50:40+01:00 2014-03-12T23:50:40+01:00 pnmtops noname.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000385 00000 n 0000008251 00000 n 0000000326 00000 n 0000000171 00000 n 0000000015 00000 n 0000000153 00000 n 0000000450 00000 n 0000000550 00000 n 0000000491 00000 n 0000000520 00000 n 0000006768 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<1D8636ACED3D2A8EE7B0E0630108F4CB><1D8636ACED3D2A8EE7B0E0630108F4CB>] >> startxref 8431 %%EOF geomview-1.9.5/doc/figs/cam.pdf0000644000175000017500000002027012310162300013206 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`h``4²07Õ3R0S0Ò31002†¨²PpÉç Bõ +endstream endobj 6 0 obj 61 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 5585>>stream xœí];’Ü8Åe]Yru‚6Æ¢£ˆµû±ÑŽŒ½ƒt9´dô äŽ5îœd#¶X$€ÌDÄŸ@U>©ë¢Px|`ÈX¨‡ÃêïÐáßï*‹³ý~Ý(ýþâý÷¡nŽ÷ÿwV£Ÿ7J·g?éÛ9 ½á}¼ì* ŒÑY´J/ñoc¢Uºº.µA•^{µ›†8˜h•~mùøt01*ùlù`6üÖ¶¾xjôÉQ‰·#—Y<¯­öÕhkhŽJI%7Æ­Gõ|ï^#|íÿP»*1*±%¿…4…ï\5z…ØÞ|¨|•^7>¯­9ª„(mµÉWi'ÓœRšJ·Ú䫹 ð–tÿpi¦‰¦7ÕŽ*J¯GÜÈì?`š“’È©ŽJtñÃ)™VŒTúõPäË¡£Ð¹$§©ôJêûÃQ‰¶;"ë²i6ÇaR9™sùŠÎIªJ®~•h«Ò"ÙlP ävTÂ2'ªD þáQ‰¶1–’~°o’8Y•î5!\ã-!å¨dì'1%Ƶx|1µè—”¹P~¼b«L8È‘7Úè×/õBÏÑC/ˆJ N}•©GP‰IwUúÍ{¾Þ߯ñ`Ýjî9â«‘UéÇÇËÆí6P`ñâIoïûl*mÌþP_ïÙ÷‘ý¹cn¯ÿ{u…Šñ¯ÝùéNiÓkzJß¾ÿ½ywJ›¸©ô×Õ•*Â/õX¼G „û%Qi< ¯Òç¤Ü[͇W)‰Ò·?Õ*Å׿—Ò”W)‡’¨Ô¢’•®ÀAiÙÖ“¼s©´lt–R­UZÎÏj ¥ãÑ‹¶*ÝOèÙY¢tÚÚàö´'íx¯Z«uVcàPÚÎ÷§«¸€“ª¿›$[¨KiåŸUc•,%ç„’s Nr&¥û®*š¨R\ö4Jö³TÒ= ¤¤lÒiãX¼(JMUÚ[—«’ΤÇPB-Õ6<Æ<4µxðd²”ìÕ¤´=O)ÔbxÓ~ žTÓðàyŽ3Qè5zØžou”ÐyÖÇ}ÅÈH\Í3‚¨tD%5…JßrÏ¡R £9TJÇð*¥CTšÏ£RZ jìRxTš’Ò=`Pi¾Æ·*ÍMIT¢Ò ÈP xjqz¢/úøPq\A6:¡éj÷£»y3TòE­r)9ñ–vI†œ™9*yâ+Ù”hy~JÈÏiÝÈ~J)*!ÿæþ ¼sëýkAˆå¨ o­ ú¥K¶™QœÆ©~4¥•êD=hàTê¸fÂ[\¼ÆÍÄQò¹œsTR \•Ö·½¬è›¸7î1®¢\8‚P2U¨¬Œ¯(s…w¡T[%s‘‚ø ªqJµ¯%ç{s-%RbËc)‘œ1”Rû%×< +›ÉfjŠ®|&^ƒ A_Ú¦_º?Sl,µ­¯±~Èί e#~™—½RÒÑC-•bÀ|S|ÖQéìËOÂyyȤTI¥“5yàW"[e¾4*D¥pªRRXg„Uš‘QX¥™ñ<‘‹™!*ÍQiˆJ3@Tš¢Ò •f€¨4D¥ *ÍQiˆJ3@Tš¢Ò •f€¨4D¥ *ÍQiˆJ3@TšO¥Ú‡:I¿JÒ±cÕ]S ïjgnÉ­³¿‹[í›·ž9¤Ò_6“¦ä­/^ÎfqÓv…~>%ŸJI”|ûU<©4¿gÓA’U›I`CƒËïé,°Jߥ´èUúLJàž,¦¬HJI*éºèÓj6…ØV[âaJ`÷‰)mìrËŠ¤”v-]#öt[RîÎgKÌžY•Éâˈm™é×’=ŸŽ…Ó’0”ÔNa{O\•ðñLJY*)n×Íâ¥Ä3›ÉiÇ=U:¾2$U€Rb¿„¿_Sý’©Æ©ypöuÑ­žNY‘”|*µâ¨_ÒÍ_Kö½½NFüþh­³½¬ºG!-+’’G%¸úý´«õ"®q(½–"Ë |MÍMZUú%¾`ÿ°•Ï^m“V|YO5_š¢Ò •f€¨4âëw›Ï2J„µÓð³ðZÒ–~Å*ÅqJqN¯p#h„Ìk)¶¨Î”Jú%¾¼À°µN½_O5_š¢Ò •fÀS©ô fûóšÚeÁ¯¤ôvè†ýAè&Ò:þٹ¿,;‰¤„TúÎô?ÝA¹fTŠæ¦áïu¼H¤¤Žq‹(ùT:§Dg/g”˜-ä'rÜL*ä "\Ⱥ#'7\md)e­!‚®B x†¼”ô܈wûÀ –»\9Žè’„²Õ)\mÁüÎ=”¸8Q‰dçr›ó˜©R,%» |»’2™J`5‘þf”[[ZÜðZ¨| ”h{à SIgm_ U´ËŒ·xæÈa+V°B‡±x%›fa)­ŠT! k€÷¦']QJЄóÑËŸæö˜‡¼5DÔˆoô0þ.O€w‘|`Ý‘ùƒ¹áj#-ÀŒkˆ‚˜n Ñ9æ[CtЧš/M QiˆJ3@Tšr·(ä±B#‡(§ž—ÎP$s¨•ï!"Cl;¹€¥dæ?ÔÑU@©Ì‡^žÔÂ¥Þ9%ôS þR³óýKŒÓk±þ.诵S_rÌ·áÎO)Ñ÷àÎ#ImO^xjj©ØÉ¡÷ï,ö¬²¯¥%D Z¿J梠?Á÷|Ò$s|Û«SJ!§——’ò¬F±ßhÞ„)%úñˆЧtz(yÕQ1Jé~³ /N¥©(Eª´(ßB ÷¶Û$OÒ•Ì}OP¤Ò˜ÓÀ$²(ÙYƒR¬J±”°g2›Rj©¤kmWù€³=É÷ÃÜ9½aƒø.òk®¦’¡—0”lÍ"VöÈ%Sʸ–ˆsÇ«<Ì8ƒìÇøƒm°ÚµT•’{§íbJ«%]¨’âwÏNîa/%ÿAŸ=¥”Ó/ñ»çvJ¦_r)¹€1€R®yHPÉZUmû#®ìèA_*Î9kÄuöÅÞJ5n•gÄT"0IÞÿá‚2j¨ä©EbuØU“R¬JÞ(yz@’kPýUúžó…íñOJSQŠTI …UÇóFÁ÷±`ÊA‘J«‰ ësdKªàþƒ9)Ÿ0(Si±Uæê„^¦U0“Άr•àÕ?2¢<”`ŸzÈ»’þVÙ>x]Ì'õÁ|Jé*JJïxgüÓŸòÍŒv¶´Ô|Jé*™‚׆Òýq±áÅ…Ó…O-5ŸRƵ¢¤_jnz¶Žh¢c”’>)ù”*«´æY9êTŠE=‹wŒ›S(1 N¿×E€RË(e¨d¦ópa–lXÞAóà”šO)«_Òç×cÄwNöú q¥iÙ¼…FW¸}ËõeæPªt-Ùec÷e ¢ÚÆ•M©šÅ[lx÷a\ ÆHX€}Î¥T±_Bw\ÅÛ¶À¯¸…))ô±´0â•ÇxÙu©„#ñ(‰J£#N¥²EÜMñÆT6F¥2'[K|ã)E¨ôö­O Ó‘¯Ò ”ÞŠTúÞ§’IøÇ×ðâTšŠR¤Jzº€`æöÖæn&“Ù(¥*y*´z(1ÙûQŠU)D‰0SSJP 8 4JÉÞ3á8v¬Ó]UÉr()}ø˜O¬š= =(%©dþàÛƒ<)éãcª”G ¶Ã.”ꨤ#CI7ÄÑUN)Áô.”òTr(#¬Ió©’Ó#h—©4¥H•øè²IÁx˜uêÕrõ•ªä« ‰‚¯ ¥9¥X•"(ET¶¦3¶†JvÿPJ:‰? 0ô>¦Xmn•¼&‚R‚J‹3Æq4¹q&/Cg¨.¥$•ÌŸó€bNx|–R—RŠJJº^¥ƒ+OIŸˆº”*©ä¥„ƒ¯ŒJÙ¸L¥¥Û"ÊÍym•8ó`«~b ¥6æ!W%Έ›>#®4-œ¯2¥¼Ñ¡àAÍŽÕEåÑÃДbUÂ-ÄvGþZç_%q(U©iåò ó%”Ë;_‚‰¾6Ñü2/¹Fó%Ó“ú–ëÆT·6¥²ùï0™® ”7_"+²@¥ÌÅÄh`Úê/¤¥²ù’C‰[Xß ©F©`$®•ÐüÈŽ¹Ý±.(áJ•jSÒÞóÇQ‰,é­F©l¾äX¼$J¤Z”´J__>^ÒçKN¿„hJ$ÍWH-JZ¥¯·÷/Ñ*¹öWà£Nƒ…ØUõ(©÷Û‹íZº=½g®@@¥Û‹OwJ¿óGW p-}Ù)%Í—v§KÍ!ó%”k6J¢Ò@•P®Ù(Å©4æê÷•ÆdT RŸúå W¥Ï}ª—…L•¦ÂÓî_š ¢Ò •f€¨4X•Ýø W¥Ù¹*ý¼ºFå *½_]Ÿ*@*}ùýÿ¬J^|¼‡Ž^“i•B_€p´J/Þê}‹Œôï¬F›JïÁ“ò®ÂÇûã¤F7J‡ÿ*ðì endstream endobj 11 0 obj <>stream 2014-03-12T23:50:40+01:00 2014-03-12T23:50:40+01:00 pnmtops noname.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000378 00000 n 0000007803 00000 n 0000000319 00000 n 0000000164 00000 n 0000000015 00000 n 0000000146 00000 n 0000000443 00000 n 0000000543 00000 n 0000000484 00000 n 0000000513 00000 n 0000006320 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 7983 %%EOF geomview-1.9.5/doc/figs/fig2.pdf0000644000175000017500000001603612310162301013303 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`d`a3ÌÌô €À¢ÆBÁ%Ÿ+ÚE Ìendstream endobj 6 0 obj 54 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 4414>>stream xœíMrÛF†©Šsƒ8 ËEm³ò&Îd3«ØÊX¹/¢‹h”‹`2+p¡Ê̬½Ê&É,ÇWñC ÿh4úk¼K–HŠ@«_>x˜ ¸Qˆ¾»ŸO‘Z¯χ*³çSµÏý¸„¿\5ñÜ+D•Yý…‹jAŸF`€Jß”Ÿ>Ôžù¾ã‘EÆ?姇ֳÓ..uh7ÏÖ .c.BTzuž"‰fÐèÕyöÁ»ËRàëV¯Î3×.?võºˆï¨3{0<³ï¬`¿q)œ3ë:¼ª22<£,ÌŨÃTw0žªÛ?Œó¬]€Ê¡Y™ƒx:tC°ÜYtWÆ.rä©aÙæž:̃ü3ÔWfxvòì8x03&¡ x¦dvýfxÖÌÇ„Y©â|œrÇÜ9çͳzã8Õ3y:Úmd½É{:ˆ6Lé6y+ªFÖ_ëÐ]’ïP–Ø>¼{ÞHßx>x„Í3i6úYj¦ó ÌœnéhffÿðÝ(´ÌÚn™…òL?òd<ôÉÐfV‰ByÄmš›åꢨŸ•%ÉkQ¦­’[fÒ̪ûtDÏZ OƳAß4š2Å¡lÎìšÝnPfü¶$y-Öï–VyŸ ä9ŒŒ4³uߌè™)‘Û3ËVMÍÄÅÌL¹ÁÐL_‹-3ùÕ…Kf²gJfTÏôå>9<Ó7ƒÖÌŒi6¯è 123¿³ý)-©‹~/…Af²gÕ?S=3R3<ì©?8nsqάëŽÞ³ëoÃëð±þ•™Íï2=ŸÄÿVäø±z颸ºÎ¬Ú~"³ä9V¯Am3«Š ž¥ÏQÛo„gésÔŽÏàYúÀ3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~Dðì|‰Dök 0<;®=g« 0Q<[yÎòË,‚g+OZ~™-ïÙ~åYË/³(}¶ê´å—Y ÏÖ·ü2‹´ß¸âÄå—YÏÖœ¹ü2‹v|¶ÚÔå—Y,ÏY(bžYkîòË,šg«M^~™Å<߸Îìå—YDÏVš¾ü2‹{^ùË/³¨ž­2ùeûÿÏâÏ`~™Eöl…)Ì/³øÿO{óË,ºgÈl&«¼$ò$æ—Y|ÏbÏb~™­òº«¸¯ŸË.³5<›øÔ/ÿlœY˳i™½Þ…g8yVÞ qhœáäÙùUqAf¬<;_îĤÐòËŒgeqõ¬Ø…gøxV qW}¦‹–_fL<+‹ËëKq™bZ~™1ñ¬Å+qí³ ¢å—ÏΗÎ3ònH~™ñðìÚfM ºhùeÆÂ³²<+vóÀ&ž¯=öúÒôyã˜_f<«Ú¬>:›ÔhùeÆÀ³²þ÷Nº…Z~™1ð¬n3Ù³b7wœáàYÙôXßg×ÝÌp†ƒgu›õ{äFË/³ä=kÚL©3Aj´ü2Kݳsk–êY±›7ΤïYÙvØ]!÷Ù… Z~™%îYYØ=#˜–_f‰{Ö¶™^g‚Ðhùe–¶g·6SŽÎˆûŽùe–¶gå­¿î„Ög¢ØÍg÷¬k3›gÅnú8“¶geÿ¥Ùg£-¿ÌRö¬k3s¯‘Ðhùe–°geß]¯„Ùgc_’_f {Ö·™Ã³b7uœIÙ3©Í¬uV1F´ü2K׳óeгQ–_fÉzv–zëµ¥ËF¿6$¿ÌRõL¶Ìzt6Ú´ü2KÕ3¹Íœu&Æ4Z~™%êYYŒô¬ØMg’õ¬TzËÝg#DË/³4=SÚ̹×8®ÑòË,MÏ”6óÕ™-¿Ì’ôLm³ÏŠ}œIÓ³Rë,ýµ ú‡ß´ü2Kѳó…äÙ@£å—Y‚ž•ÚuUxCË/³=ÓÚÌ{t6¢ÑòË,=ÏJ½¯,¯¡¼6$¿Ì’óL·lŒgÞFË/³ä<ÓÛlLŸy-¿ÌRóLßgç™Ï´ü2KÍ3ýØÌùZÑÇhùe–˜gf›  í;æ—Ybž™m6ªÎ„§ÑòË,-Ï,m6Ö3g£å—YRž-]õÕåŘ>ÅŽ0Î$晥;ªþý|N£å—YJž™eö²ýübÔªì[Çü2KÉ3£Í¾ì¿þbr£å—YBž•zG½T®>ÜiÖÐòË,!Ïô6ûR»>Üj»±àLJžémöÒü–ÁZ³‰–_fÉx6dÙ¸VÛ[gòììë²þã…¿Ó,¢å—Y*žGX6¦ÕÌÐòË,ÏÔ6³tY·Õ¶Y"ž•#-nµÝ˜p&ÏÊ1]6êXÍ-¿ÌÒðìL°l¨ÕôÐòË, Ï”2óvY»Õ´ÐòË, Ïä6c™¿ÕvÃàLž•¤.>V»÷­Œ=ix&µÙhË|­–{f x&µÙÈ.ë±·šZ~™­ïÙdËÜ®í†À™<+'u™ÿXm70Î$àY¿Ï8Å2×äÎ?Î$àY×fä.ë1[Mj´ü2[Û³®Í&[foµ{ï8³¾gå¬.s«åœÙÊžµmöÕÇì­¶ó €3k{Ö–ÙŒ*“P[­-¿ÌÖõìÌ2³Õî=àÌÊž5¯y9§Ç<Çj÷îpfeÏÊ –é­¶s€3ëzV·Y˜.ë‘ZíÞ9άëÙ9¸ej«åšÙŠž•a»Ìr¬vïgÖôl!Ë”V»w €3kzV†ï²ž¶ÕòÌl5ÏÊå,“Zm—cfË{|‰T²ËlqÏšÐÔy»>õÏËZÖµÚ=<›¼"!çvÆr¹.“x!rÌlyÏú•‰[nÇ}¹¼em«íòË,’gÝ «öÇ/9.³~|ñïì2‹èY¿Ö+éÈ,²øžÙ¬ã˜<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ãÇf<‹ù§Yþì›ñ,Ú’¾®Hýçá×°Ï"fV‹å¶Ïbý)iéÉay3ˆ kØŒg+dÖ®8tnðÌÏ_Úõ»áÙÞÒH„ÌmCž%@˜Ü¶ãÙÞº¢{4›¾0;BÛñÌžÙ½ÉÉÝmE¾AùQ¶íY8ÍÄÍ4x gfáÞN(^f[ö,¨f­hð,¶Ì‚Zv3 žÑYXbe¶]Ïþ ÿy¯àY@¬™çžÄÌì¯%Þˆòž…ÃÈlË*îàY0ŒÌžQΆÀ³`è™-¤™¿Á³PX2[¢ÏúóŽöAùQ6êÙbšyÿ‹ ž‘02[Ȳ}A~”mz¶ fÂc<#¡d¶¤eÍÙ× ‚ü(›ôlYÍÜ¢Á3rf‹œc<#¡d¶øÚ¢Á3Rf Q>ì¡Á3RfËk&¡Á3}fË<ÏHt™E±LØEƒg$¤Ì"Xæ0 ž‘¸eK3«hðŒD—Y$Ë„í¼#<#ÑfO3›hðŒD›YŒc3÷ÙxF¢É,¦fÂ4 ž‘¨3‹jÙe¹Ì¶äYdÍŒÐà‰*³8g@<¦Á3mf±Y&³íxömtË íl<#Qg¶rhðŒÄ5³¿Å·L¨gCà‰ã·¿­ã™,<#q|ûϹ}öþ—)ûôF<£püæ_3={'Š_&< }6™«go‹–}_\ªË?¨ûïyðŒÂÕ³oŠbòÃß5‘—_‰ü´Dfòìú´ŸfÙûKÑ_~¡V»FÏæ¡yvùÌý­ã6‹­f‹ žÑÐ=Ÿ¹,ûžYa?V[4³zæ2í=íÄ–ëXÍ<£axf7ÒdòE?V[6³Ízf1ØdîV«"ƒgs±x¦›6Õ±[«©–Y"ƒg4lž©¦½£÷˜ëXmé̶ì™d}oѺ¼ðl>ÇýÑâYgÚŒ&3[Í¥<£qÍÌæYcÚÌ&SZ­9²lf÷¬2mÒ1™óXÍ<£Qý.ÓŸö»ÂYV]~ªºhfÛñlÿ§}’ßÇŠ žÑ¨7×.ZXÏ~®—¹lfòLüaŸæBöYí™=2xF£ù[vÑBn}›FxF£ý›.VÓ~½itDÏh´™-ÝhÞÈàÛß(³î;¾Ögq2Û–gvÑ‚yæÛðŒH÷77m4¿fðŒF—™U´@{Ž‘Á3ýß¶5ÚÃòÇfÍ ‚ü(›óÌnZF«#ûï3 )3[£Ù8֛ƙmÏ3›hÁ<{ƒ÷ó †’™eœslö@ð¾¹ÁPÞKË"Z€c•Ù¼?u8”Ì,6ÿ­ÝчgÁPßr‰F«ÛÌŸ <#¡½«iÚÜsŽ·c3x -³ðÖ´< ˆþžâæ¾ã¼FëN[Á³`™ß1ϳ¶ÍàY@ôÌl6§Ïn›Fx#3S´9{Ž]dð,Gã–·Ïfmo– ÏBaxf1mzh]› o0ðŒ„%3£Ñ¦Ÿsì7— <#aÉÌm²gJdžhà kf¡MÞ46+s "ȲeÏ Ñ&î9ê‘9Ãg$¬™é¦M<ç¨m›ÕÙäGÙ´gaÍ™#xFž™¾ï8霣¹ilVhDeÛžé¦Mõlä/OÃ3®Ì„êÚ„sŽŽÈl Á3žÌ„dÛ„=ÇŸÆÿ¶<£qô7ÛèGgd–ˆà¡ÌDc9´Ÿ ¯õ†g4Fdvåê9G_dFHðŒÆ¸Ì‚¯uï¾6y™ðláÕî]W¦/ž-½Þ½ýëK„g‹¯xoûrÎáÙòkÞ›_ÍZ<‹°ê½þżÅÁ³ëÞ«Ÿg. žEYù^þ4wað,ÊÊÃfÏ¢¬}ßÿ;{Yð,Òê÷žQY9³:/xFcí̪ÀàÕ3øoWÂrà»!lÇ3ËoÆD'̳f;žåÆ<ËxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆÞ³NðŒ•gפ®žýx½öÏpõìtýTo…x„g 8~¬?}]göŒ>ã@Õg¢É ûLÀ~#?p|ÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆók ¢yö¸öxÀTϾ{Æ…ÃEòÌÉéÑw/Xÿ”wžùàç$üSÞzvzp^® xtߋ˗Go"µgÞØ¯™…|a¦üêàÆÿ0©ð endstream endobj 11 0 obj <>stream 2014-03-12T23:50:41+01:00 2014-03-12T23:50:41+01:00 pnmtops noname.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000371 00000 n 0000006625 00000 n 0000000312 00000 n 0000000157 00000 n 0000000015 00000 n 0000000139 00000 n 0000000436 00000 n 0000000536 00000 n 0000000477 00000 n 0000000506 00000 n 0000005142 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<2917BE68FC2709C646D267F9318BD71B><2917BE68FC2709C646D267F9318BD71B>] >> startxref 6805 %%EOF geomview-1.9.5/doc/figs/load.pdf0000644000175000017500000001141312310162301013365 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`dfb¢g630P0×3µ´´´P°ÔR–æ¥ .ù\@CÝhendstream endobj 6 0 obj 65 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 2068>>stream xœíÝ=rÛ8Pæ:ªÒæ)R¥ñLêÃ#Hã*…O6Uγœ ËPüE©÷f#Ë4Q3øòI´÷]¹¼«ÿûýû÷Sÿüùóíííz½n19i…íz»M»…¯_¿þKúë>$ëÈi?äóF£1íØT…ä3‡ ø—:o¤Ò~ig ­vUØbÓ®çÿþýûM×Ùâ1ê' ra»M»žùãÇ]'|Ãh4Æõc'x†»N 5FãÑÇ)íJ3Úuêo$¯W<”~¥í:õ76ºœ€Gp¹\+Íh×Iu9uxøÝ/4ƳŽÕŸw±JÛiÛ9‚`¾ëü\}ÛkØ6–p§}Kôë.í !´ ë”ð“0*ª?¿¯Óž'þcþoß¾µçi>©É×uŸÀ¬ð ›Õ§²Ñ´ûºo§˜­`õæ³sv;Rב:‹lÝu"S§úÕuDpZåtêöM¶ct‰xh¿·Ø>`öþúN©œ˜®3õâ×=vÿ}·§8ºsv¥ª ýÀë»NçÎÙdê ë'6½Ó޽!48OUH׉|ÔÎÁK8¦èT#=&è‰iN`v§möä˜Í° ®³(uªVâÅw¥Egð¶¢<šÙ®™:euÙ‡ì¨;I×KÈûǦ8‡˜®Óþò]gpéÓ–v×Ügv§üh§ ®sŸE]g0ÒúÞÄ\íšiàqœó¶„O€´ü¾ÎÔ !]gæ –®3õH(C׉ÿq]àü6í:Adöè:'·u×¹{ž{ºNxÔpÏÝãõ53F£qzLµÓ6¶~ž©®þŽ@}hûÍX©YI¸Ó¦šjªë<==uòŽ?m¡ë„·ì‚›Ïu‚Hõ/_¾ä^ gñùóç¦ë4w^.—›Ôi¿—'u¸[HêO²4Ás“:í|*]€Ú]gþ6]€5Ú]'Üó6ñû:•®À k»Îû÷ïwZùñüúõkâ»%œÉÁ–°°Æô9Ê·¶ëµ%•ìåååÓ§Oì~&ÇV¸û³ç(Ÿ®“C½]ÖcÉ©3±ÂB^â˜s”/Y×ñÖǘ?~„‘©“ÿLN¯°„—8òåKÖu¤Î©³žÔÓÐu6'uÖ“:pºÎæ¤ÎzRN#Gש£çëëk}=†ÂÈ÷§ŠüÙ]l”:Íyè<ýþÉœ=½kRgpòÙWvÑ+>»Bà@rtÙ­giê´›oÉÁ“»uzÞôÏf'¯¯¯{/àvë:çHy°ˆ®³ŠÔXdÏ®SoÙ1ÙyØÝÇ/š¹ú?/ãH€Eöì:ÇJö´Ím©°ˆ®sÏ´Rà>ûwfãnGEûÎÎvßžaýñÕÐ'Lýïvæïß ÆÎ]§ºÝÖ÷½L©ë¬´×iîioå9ïïˆù)©pŸ‚>×Ù"]úO¦|‡ÔØÎuþƒ¤ÀvNÞubR'òK©°^¡]§Ê~5AÌ£K€•Jì:ÕWNÏþ”ÔXoU×yzz ý¦=ú;lŒYÔušdùÛuêÔiŽ ß¨üÍiÆÅw)ÁÍ;lÁõz}À®È€Hñ]§ír¹Ü¤NøhÇÿK€i‹>×iîü—:w_ÃÀÚí6Ðn¿¯ÀÒuÈG× Ÿ|]çùù9ùê8¢Í»ŽÈ ±m×€H ºDÒuÈG× ]€|tòÑuÈG× ]€|tòÑuÈG× ]€|tòÑuÈgqשiï5p` ºÎõzÝgœHl× ·F£Ñh\?†í: …Ú´ÅÌ$·Ý¦=Úu’?Lx³Nð.\J¶Ý¦=ÐušK RͨǴ3F£q‹±I-æÿ×u¶»| Iæ ¡M7í¿]òøÚì€ô endstream endobj 11 0 obj <>stream 2014-03-12T23:50:41+01:00 2014-03-12T23:50:41+01:00 pnmtops blah-000.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000381 00000 n 0000004300 00000 n 0000000322 00000 n 0000000168 00000 n 0000000015 00000 n 0000000150 00000 n 0000000446 00000 n 0000000546 00000 n 0000000487 00000 n 0000000516 00000 n 0000002815 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<7C0C65011ED6EA2F6B9AF6612961A6C1><7C0C65011ED6EA2F6B9AF6612961A6C1>] >> startxref 4482 %%EOF geomview-1.9.5/doc/figs/myfilelist.pdf0000644000175000017500000002015212310162301014627 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hln¤g62³4×3S0Ö3300T0Ô3´´´4‡(¶PpÉç B_¦endstream endobj 6 0 obj 68 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 5500>>stream xœí½uܺ…qKy©#)t^KŽ˜ÜT†%ܬœ0’×R íÈõ¼áþ6~’ÀðlÙš’l}Hÿ, Ä_´úóãu§@ŽP¬tŸÏ“=Ÿ_ƒ?âšXß÷O¬t?¯ö\_Ã^ýk{.ÝÇ·™˜À»+¤çãÿØ?“+’ž£ciïgªq4=Ï{ñ܉W$=?aû~:}Y\Qô„Ú÷;nׯûÏ×@é¾8ôøëð»h¹‚íw¨tÓÎäГ•rGºýÊ0—άwßÄLK =nÊKZoÏ×tžoiµ¯Ðßx)Ý3-ÅôáCÓ#-éÈž(=†=S™ÖÐóæyÛ¶²è¹ªœžig{úµAíHmý¿IU¢Ç>t~óÑ3¯x&•sÓÖãol1žGϳYÄç7‡!ÔÎÕ¬Aúoülü!sé±ì™¶4é±ì1˜i JÉy&=vÂozèÇví¡ôL¿Jéq ²éé²b6j³ò©Ürõج‹={zÔžGÍ=ŠéAbz°bô˜K™µf)aÓ#—Jç£çÓ5çõõðk*«®.Ö„J§éyûø6ùt=@öê[`yW "´b¢gréñïm3¾ÎeêïçdÜÏyËõýGÔ”þ7_öûr³gâè¿?GÔ’Þü®ðÍöLu´`{ˆ®ö˜-ÓCu£ç“÷0=TLÓÅô@1=PLÓÅô@1=PLÓ£g˜_Æa×§SŒéÉlÏéŠÒ3Ò·g´'žëž6ÎûÛôrýx÷n¥Ò£w®Éùÿî¥çö{¤öL®œeG+¡gÒyìÉl¹È’ûW='³'—Y5ŸÄž zo–†ý€p÷ŸsAñ;ÓÅô@1=PLÓ¡çý°ÀŽÓwò>BÏ íy1Ê£ç»ýõ;׃°ìÁôœÞ¦‡Šébz ˜(¦Šé*¢G^½IS`Ãa\Vëszƒ »ïiVóåËà7iz=½Ø#P† ËõÊÀEË¥\óÏmI1=ëÝñ­©Ðeíu{~Õq‡óY.Þ-ë‹é!—ÙoÉ-ŸGzÑ]ŒF~Öz¹‰‘Ò¨R“šWñõU‘l$Ë=è«ýƒJϰÇÞÛ¬ȸÖÐ3Èâ ÷¿gÎÖX¯6¬=©ÿGbN‚ZäR°g°²$WÅ×Ñã\_7vkᲫӜÉ÷í}©’uô¯L’ ëÜzÍ©t{ÌÀܾ´î Ûs»ên—N_ K·G¸ ¹öè5A{¬ÀìYKÝ¡H~)h¢=VÉÂôeË³Ç ¬=º¤žÝÀ¹½^M­ìÑ»“Þh©O¥;ž‹G\0 `¹SDÏR’Ý€´(VMJÿld½ ›Úö«dŸ=¤N7ØóP4èêÆÓfÐZØS@m—ÓçAû!»øÜK?t½¡ÿäÁ†Ý2@Ñ-ü »z/G!œ#“ ôxe'lÎÓºo×˲Æ»wlaq©β =’pcYq}©m¬`–ÜßÅý=PLÓÅô@eÒó²w|‡+‡žó¹“CÏÙţà˜(¦Šébz ˜(¦Šébz ˜(¦Šébz ˜(¦*i û>T½Ë L­”tû Æ`±Åí1ƪ¢´Y@tnŽ99D‰³ È‘Bd$å2ð™ñÈj±¢\=uÍSâƒ9éÎã ¼´6–É´§R¢yʤG.ÑՀ㼮û3»Ã+$š§E¦7òÚ³lRu窔hž é1ÖøéY¶ZQËž:‰æ)½åòÚ£ì©X÷ÔI4OYÇ=êC¨j&ÕÃÝTÍéG̓(i Ôm½¢ëžv>ç ‹ÏØ¡˜(¦Šé‚ôl<ÿÊw7 =To¯¹_`˜žmC¼Íóî.Ú#ïÄ bôl8ðrãø.§O¿n¿ÅNy§£g'{žÄåQm'ˆFèiÙž=ÃaFd׈䫙÷抑@ÏÙíÉ£gÜ÷Ëë¨NR½²)ìzCóV×rèyºZVáì4D>=ÚžQŸÏ+{–»F½Ù#KOíQËô-’¥J°'‹ EÏ8Ðw~úO¯"[âÑïtÞ{².Oz "‰YîQÞŸ*qì±÷6ëÏ&ö¬R‚=±ãžÁ´ÇCIÀ¹½êXôÚó".2¿—<{*ô9G‚H9î,k–[²…eQz9o]Kì3ìQùì‘[;U³|_§j‘D)›š =òª ¶çQ“¹sÍŸ*UÍÞ ÒZ®R{„Ú©=4Ü|{êTÍ ÒZ®eºŠA¹ãÙ¹¨q¤å©=ÆAÙ%³î©Ør‚Hª{ŒŠÙ×€“%ªYÓ¸‘k>ª¹3ìù#s˵§ÞqO ˆÄã£íò7ì¤MÒÍ–Õ°¯µGe¶dTï¨سË9—u¤˜jÏÖªCÏ*ÉË\Ö=›Ó#/©š‹z±çàÞÂÖí9¸·°u{˜¦§,¦§2=¾AZôp6|¤fŒ-K³‡ô]ŒÂóvþ¼bÜ|uzho‹é«68Î/±G¦D“ôœ’V°§¸¿Ç-£ýÁ€èÀÿõšöÀ<‘*ô÷¨ròäI†ëØcïmúÌhp¦í\2i2zN…"ô  9¼.ßžý=Õ'ÿ-´‡¤c÷4gÖµ'vεÑ俉U³Uµ j¦J’,M=o'«AÉÝGMОeçªfêQ’-‚=ó’ºöÄ[®R{„9Ú¹ÈaL&kÓ£ó-k¼ÖÓ#æ«Oþ›oió^öDëó€"RÝàÉe9’ Õ·¬ºx§ª9á¸Ç°Èß°«÷BWÈvþÎÕƒ­ì¢í¼¬œª7컜s¹à7uÎµŽžU 0ß‹=›Óãg¾{¸¿çøº'Yëö0=LO$¦Ñ'=úhÉ:g(8€AôIÑ[x=-ÓÓ€=-ÓcôŽäÔKŸa©çÄ­ ¢Sz,{ä)±ïÿª z¥ÇèÎ1û7¬×UAôJÕ#h÷Ϥííi›Ú[èÒC>¯ ¢[zŒÎTÚc¹—=Ócø1ø«å-«æÆéqëâ}ö†éIѪ#ľéIÑÖö0=÷LO• î—ž*A0=0¦ÁôÀ :¥Çl–ÌS £{¬ðÀ°szí)nÜÀñm]ÝÒ3>=NEõêÛé¥üä‘,½Ó#ïB¤G•ŒP¥C è°ÃÔ“øîéªÇ™v8 ç-í÷Iß×z§çx{˜ž3Ò“äQïôÈi&d mUÍÔ·ÆN¢[zT£=zvAúY…©*ê5ì-Ó³µ:§gk1=IA0=0¦ÁôÀ ˜Óƒè”ž:S[¦§ÎÔ~è! öëLm›žÃ;S›¦çøÎÔ¶éÜß#skÒ¦‡é‰Ñ+=Çw¦¶MÏá©-Ó³µ:§gk1=IA0=0¦ÁôÀ ˜Óƒ`z`L ‚éAôJ<‘úqrf;ãÄ3V5#ˆNé1ÏØCý¨9ݧþ :¥gé´±ûuÌ·"±sÑ+=ÇÛÃôôM9]fØžz§Çªš½öduŸúƒè”§aسaÃÞ2=[«wz6Ó“Óƒ`z`L ‚éA0=0¦ÁôÀ ˜D¯ôß™Ú2= t¦¶LOVwØ û{Ž·‡é雞c;S›¦çøÎÔ–éi 3µez¶Vïôl,¦')¦ÁôÀ ˜Óƒ`z`=ÓS::%#ˆžé9Ö¦§mz.r‘ÿœky`ð|;¿y^jv²ŠüS¯èQî„ÏØ…zórÏ¿<µžr’}âÞ>=ÈŒþ² £u®NWgï†ÐCb{¦]GÝ‚,÷-5džXaO ˆèQ‘]½…Ë«ÐÝ_äÞuá¾Ö ¢zšõ;’·iú0ÿìÉñ(Dô`{èÕ,r P˜K”qÅUsØž£é™+CõÆÌ[ßÒ/?º_‘NÖ¢>ÕH-ÐíÙX öNÏ‘|Ý'ïÔ š §m{ާG<]æ—C;4—Ç@ éq]Ó˜VüJЬ8ïX9A$Ñ3%wyöør½uÅ [š=ùyGÂÈ "ž)±?济¢¸TOåÃ[Š=%yGÂÈ "JÏ ¨i˜c‹ÛS–w$Œ¬ bô¼È3ªöÜÚ¥—˜=…yGÂÈ "JÏo1Tµgj´ãô”å #+ˆ„ºg²¢=·¸Òêž’¼#ad‘Ôrý¾}¨dÏE&•Öråç #+ˆÄãžß™!>éA)†Ÿ.BϤ÷äæ ##ˆä£æßyöøÝ™"#Ç©GÍyyGÃÈ"¡åÚNñ–k­¡gûÎÔp`;v¦‚(¸¿‰{ ¡˜(¦Šébz ˜(¦Šébz  =v¤Èi¢ç¤ö\ô•S¦ÇÑEö@zÎW½ ‘NÛÃôbz ˜¨šôÈÛñÌ…£ûaû‰+«&=ú.=²ÛÓºQUéÑ›é>{À‚ÆTr£Ù0ßø:èŽÐ3èGË7¬êôXÓuš·,j{èÍÕ «*=·ß„}›§k°÷Ä&U¿î¹½›~A{–ýª7{Ö×=¸Çç‚â3v(¦ŠéÊ¥g¯;«ZÐËŸlzöÆÖ€.{¢ôDn »#½Ñóç$û×wŸ= ôœÃžk9KéÙcB‹ƒõ ¼ö$Ñs^{˜žYLÓÅô@1=PLÓÅô@1=P«èiýÃz­¢ç´öpÝ3‹ë(¦Šébz VÒc (¹…‹ Yݽ©\IÏæö˜_mÅžDz¶q'˜ìþÇYëè!Ó£QÈ£ÔG20Õót$²ÒIc Ï¯õåáyhýö¤ÓCì± OŸ°á<[ž<IÀ é¨Ö@BööÛÛ“~εØCG€ÑÄ;gmâ.´G‘Ñ‘xÁ„Ⱥ}ìI?çZc¹êØc¬ÓïÕ¶ÂÿÝ;¢‡Ž\u6¤£Z=#\Z¼Mz~¨aú­*®ùâ³Ç»½»apýaö$ÑóC:CÆOºU³Y*ßÓ‘Œ ÃU³½ûÐúìI§G ?•oí†Ý°Çût¤¥aì4F]~¡îX 6ìÍÑã=ç²âó…k/Ë.Re€jž±[f¾ã4ï±[Ni79ø «*=ÖƒÂ|Ï ó.Ë)mîÃÈÖ‰û{ ¸¿ª¯þžÝÕWÏî꪿guÕß³¿ºêïÙ_=õ÷ žú{POý=¨£þž=ì°ÕQϾÆÈÒvÓßs„?]ö÷ì§Þú{vVwý=ûŠû{ ¸¿Šébz ˜¨5ôœâVÿbzNáN1=GÄz„Šè9"ЃT@ÏÃq¥|zN&žý Šébz ˜¨,z½o%ÓsJw’é9§;©ô°øù\PLÓÅô@1=PLÓÅô@1=PLÓÅô@1=Pqz¬çùÇ/5<ªi•bô¨ÿjc„o{‡ŠÑ³ !Ùs¯ŠÒCFW껤¹qZ ĵﹹEë¹c‘±Ùž!ÜžûkîB -—s—€ç~ ï=w ¤ãy»šô¨··µ÷mOÂq¹ÙÊ|+_îØž´–+dÏ0Þ¹=iÇ=éUóÙ“xÔjØ…²HopOöð9WX|ÆÅô@1=PLÓÅô@Eè9Óˆx)zóQ„žÚcÜA¥ç7rz–=˜žÓÛÃôP1=PLÓÅô@1=PkèÉë l¸Lóc­Ïé_ &ì¾§Y…/O’r­¡§{è|Ør•3ZÀþfÀžLzÖ»ã[S¡sÚë¶#àŒð½„5k•¼f“3¯¥°× =C˜Ó¸hO.‚ÈKG‚>¯aPÛÑ‹ºÔ{o³ ¶'ž²y-õöž+AÃMÕ¼„Dì1/"ÑK‘&%{<ŸVÐ#“¥ØWþäVƆb¤ß%ÉRÆR%ëˆÝÆd[¯©¬-{ÌÀHJé‰Úã™×Rí\Yö7!×½ &h²§=¾y-—Åôxrté1Ê–gX5ztI=»r{= cmœ`0¯è/ßÈ숾‹§Â²  –—ÒS4¯%jiýŒ´ {‚U²ÏR§ìy(tuãi3h­_N(ž×RÇ'”kºa'ò”‡šÐ¬ud©{d0:rA °–ž ®ÞÏyZ÷í YV`X›x*=‰å]˘iO^â9Z›x*=絇é 'ÎôÀÄ™˜8Ó/¢‡Þ”iÞ߶žùÎtrojb ’—IÚ7:Ç/ Ç¸¥×Êf=ÎéN¬‡Ø“Kf†Þækd²Æ³ñ$%Nì!™Äϧþ•kѳÜà-È,5é±o &žOY ë\u粟™RÍßY¶ Ç¹sxuÕìLB]eϲ€N.`ԛгÕÎ¥&: OS©HšäbÎ œøÚº§~ÕlÑCÖÔ·Ç=$±´ºåÚ°aoÞ•Ç=Õ ÃUsu{rªæµGÍÔŸjöÈùlĸ=Y ;Ÿs…ç3v˜8Ó'ô¼}|czì¥=Wf®ôü;}fzÌ¥Wz>®¯ÓÎu}ùdzÌ¥?þÞ^¿ÜìáºÇ^:Õ=b±´\éw1Ø“—xŽÖ&žØreÜã•oOfâ9Z›xÚqOÎpÙöä&ž£µ‰óø(ßÅô@1=PQzÊfǺ#{xT|X<*Šébz ˜(¦Šébz ˜(¦Šébz ˜(ž; Ë¡ççѵ%‹ž¯GÇÓš z¾~òý£é ›øñ Vv/\:MOp ñŠVw®Xéfz®íVøçUàõ}ÿDJ7Ñó ~x}ߊ”îJ èÿV.f endstream endobj 11 0 obj <>stream 2014-03-12T23:50:41+01:00 2014-03-12T23:50:41+01:00 pnmtops noname.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000385 00000 n 0000007725 00000 n 0000000326 00000 n 0000000171 00000 n 0000000015 00000 n 0000000153 00000 n 0000000450 00000 n 0000000550 00000 n 0000000491 00000 n 0000000520 00000 n 0000006242 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<9077D2AB8AAFE6F96304FED50BB074A9><9077D2AB8AAFE6F96304FED50BB074A9>] >> startxref 7905 %%EOF geomview-1.9.5/doc/figs/tools.pdf0000644000175000017500000002235412310162302013615 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`jl®g5251 õ ---M¡´D±…‚K>W `¨¶endstream endobj 6 0 obj 61 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 6633>>stream xœí ”Åy€»gfïs¤] s!âˆM ¶9mç qˆ vŒ1†ØNHBœ‡<۱͋—Gˆ¯Ä&Ævޝ>x¶yðˆ8b$΀d$:VÇîêZ¤]í½;3»ùg µÝÕÕÕÕwWOÿ߃QoW}SÕU=S]cö÷÷f___Ü1Ôæþýû㎡¦0÷íÛÇMX¶lyÄ¡$ˆþ~×jmîÝ»×¶jùòá†S+ôõq*·¹gÏžê+V¬´fgg÷ÚsàèÈøÔ±‘ñÙÙ¹ˆbÔ˜–¦†Ö¦úe‹ò§,ëjkn´VÎÍÍÙ´š½½½ÖÒÊ•«¬…áщ'^Ü584a´I"›Íœ{úò³O[fýù̶½KZßH5wïÞ ÿ¬ZµÚú{ËÎþç·ï/–f#3a,^Ðvñ¹§u¶5Ãò÷~îÂÓ»¬õæ®]»àŸÕ«{àõ©—z7ïàwK{Nê:}åâÖæÆ¦†Üätq`p¸ÿÈÐþCǰâ»àÌÕp|™-_Ýwøé­{l+cÙ½¡¾î=—cUÿ›nÿá'ÞófX0wîÜÙÓs ,õ¼öà¦mÎCœÔÝÙsòÂå‹òí- S3EøÊoùªj‡ŽŽô >Špq¸ê’u­M¦iÖ×eáø3…Rå$@ù‚”¬? #“1üØfMv_ØÑrÍåçf2™_nÞuç}~þÆË^ »Ýóà3ÐÙÎÔo=ëÔeù¶¦–¦F '›˜š™¶œÎÍ ʼn©Â‹;ú á (ô’óN_”o53fSC]{scå=+7…“b©43Sªœ³œ«áÑÉGž~)WW¯ÉîW¼yí«—ÂÂꮲÐRår¹cÿáŸ?¹Õ™Ïž“»aë¶–8SKc}6“™.'§ c“ÓpFx»Æ'§·ï9ýx{ƒ…küš•‹3¦Y—Ët´ÂÙr•·¬ÜŒBV¦f £ÓpÈ宾#¿|vK{~¡&»Ãeô†+~úåoÞûÐëB±që¶Þƒ¶L65Ö¯Y¾è´åÝõu9è447Öç²8ÓL¡8>9ÅüB“·}ï¡WzfJºV'/êü­³O…âËdt´4Ôÿ™¹r)™ƒ¢o᱑ ÈdøÉ-»µuûÂEK=wo¨ËB„êk÷žeåæeºPªž½¥©\_ÝwÄm÷¼û"Ð::1µþ¦Ï™SÓXu×OŸ<>f¯ïu¹ì¥ç¯éηÁAá}Ÿ Þ7p oÚñQˆ³ïf^Ü1gB2ÊBá=[Ù9cÓuÙl÷‚ÖÆú:(òPd*õlN7xl ®l­Í ÷oxñÐ@ß‚ùYrîÞÖÜPM“ßýŒž%ÖJ¸šÁÙ[›^¯Ý[v¸íþî·ŸeÕú‹¯ù s´rݼã{ÿãÌ$´æP˜Aâ©Ë»ÝDìê„êðÝŸjÈ™u ¾$ÚÎõá?¸ðøø¼‹Ðþ56äÀ&6!WSÓÅ#C#…b©£¥ñ›lšÌw/ì¾´«Ív|ÐÞîÀgnüÃzìx¹=ù—ïopfòÈÐØ­¸. p¬3O±xi÷¸ÜÀÅóöï<ÒZ?ÛÜÚ!%œë–÷_6<YÊ,Ê·56ÔPBá²e”oG -g;[ïøÞ†ºâX¾{‰ÛîÐëæžâ™mûdv·ÎÞÕÑRMí?2,>;ðé½ ^ßqíÇÌÃGG`éK?xÔÁžÇ>û'¿ õê6ô¶ óĦÂiŽMÂe.O·ßóàâöúö|—¼A»Ž~áO¯›„ ÑÕÙAxŸ¬ èW¼6< ítn>õï?[ØPèìZâ¶û¹kùBŸ- õÞÝ:ûâoÜýì?4,>;ðw|¼^ù¡[ÌþÃC°ôå>æŒ`ß¡¡?ºtÝykW@W ê8]¾¸ÓJ:2<™‡‹N.óÜöýß¾ï¡UKv,Xä[ä ¶ì:ðõ¿½zt|:SiUàtf¥ß0W¹_†*5 º2Ð߸éö{WvflYÂÝ}ʼnlVÙ¼c@°;pëuWÀëU¾ÕÜ3ð,}å¿9BŸhoiºùš‹¡‚˜ U‚†þäî(’ÐLMÏà¿ÙÙò¾/oy~uOO[çBçA$y꥽߽íƒ3•þí¯Ÿzw›—{‚©k?{Ï'5u,\öîÂu|q¾Õswà×–…¾÷¦Oš;ö†¥¯Þû87ˆ­;û×_ñï|ËZ«_hÖ¡M,WÃ-Ÿ¸ö3ß^Ý2¾dÕš¦–v¡4žÛùÀBU*Í­]Å¿ ÜÝ?ÅíÊßu~O»-Kè»<:R¹ä”? ±®§‚Ý[Þ9¼~àæ¿7·î>KÿvßÜ Ž¼²ÿè W^ð»þZ¦tîá&6—Æý'm¾ë§K#Ö¬X´pÉŠ\}÷ 2üüÉm~ýf³|o}[3›>®i×5¸RWîÐ ¥·~ôËo{SWûü,Å»;ð7ï»^oüøm拯–?|þÚýÿËÍçÜììáÁ×vì;xæÚÓ.:«gÝšep­<|lî6<ÿêÆM›:³“‹ºt/;¥¥} ú£Ç¶<û·”— Pd¬ •ÿ€a¹ú‡™L¡X„š±öê¸âì%í ë³;ð±÷^¯vëçÍg·í…¥;Ä ”ŠÅ‰Ñ¡Þ}‡‡&F‹ÙÂ\.gšé¶ìtW³ÙšïêèZ 6³óïŽýòüö¾}ƒ2[v7N¿åÌSÚæ7€ñîüåÕÃë_}úŸÌ[ÊŸ‡~ã'Oºcn®T*ÍLŽ MŸ™š˜-2¹ºúÆæÆ–Ž–ö|}Sk6›5‚ÝË£ÃGzáU¼Y3´}'÷À«V»ÿùú·Áë-ŸûgóñÿÛKßz`£ø@pÃR*Š…° ˆòÕ4WV³¹ºJ8þÌäx±8#Þ,—«¯ojójµûGÿð­ðúÉ/|Ñ|ä™í°ôŸ?Û$>!æ†ß¿^o»ý«æƒËŸÚý×/Hh ®û½²Ðüâ×ÌžØK?xèé¸CJ6ï{×ðzÇ¿~üà °ô?wHÉæº«Þ ¯_¹ó[oýëõÄURùÒýO“P46oÞüØ®)W¡ëÖ­‹9ÀDq÷ÝwÃ+ Eƒ„"#+® q…èë=NÝ…Ây¯¿þz_Û‡‹Çy­8ý ¸ú[Á)1NŠ E†„"CB‘!¡ÈPdH(2hBóùüÐÐónëeRÝ•Ä'œŽÝ@òÔ¾Àê ‘»2x ’p…²ÁÈ¿òD*´Z@Ø5Ö²µ xÂj[ãž3*ç–Ü8ª¼->v3ɶP[pÂêž3*î–Ü8Ã*Ά8J#>¡’+¹qâ4Jâ‚YÝ>ÑBÙ#Ä&Ô³Ê'H¨ ) ¥Û¤\,BÆÌ 5:¡ÆüÆQ¦Ér T¿ýPA'DAœt§„ E†„"CB‘!¡ÈPdH(2$ŠŒºÐXº(1NBã6äWh¼qÊ %$!¡ÈPdH(2$Š E†„"CB‘!¡ÈPdH(2$-„ÚÆ"XàŽâ cX(-„V /Û$ô5Ö‚`ªÁŒóáî%EƒŽÖB} ˆu®4\F{…ŠÖB¹IÁ‡Ï…ŠîBãuÝ–¹ÃíH¨ýOµêväð¨¡t å#nåmí;»¸•7潄!²2(&ÙB=•GO²…ÑvÚeH¼PÝ ¡ÈPdH(2$Y¡Öv„ÃI¨˜u ¿B}}Mì8tŠ E†„"CB‘AÊýh2µà”P²Y…ª<2˜%TfÚ1ñ~§†f %¡Fô%T<œÆ¹eâš;äk¨ü„LžÃiœ©‰¹•w·0&›Ò™PJ( Åì‡ \P•~(®Ð´_CËÕ5Ö‚d í­ÊϤɰ,"½†J^XÝöJÈ%Ôà5ÐÜ+¬L+oÌ7žâ¿SJ\Ͻ¼Ûõ´ˆíÓ¦$vÚeˆ¿Ê×$Š E†„"CB‘¡i†B¦B†¦ Š EƇP«-ó$åo²PØ&å]+ßBPÐWe?Zf× Ód7‚Û#¤ò»ûÚ+:¡Ü¯7<ÎøÉið£Õ²Pç±,± Á° ÃeÔ…çH#AB埑wî+ˆÇvƒ7,Cò GVB¤BÙõ’ßԻ凛%®5A’Â{&x#“]BBÙ?%…Šwa%$U(J•ç®T>E‚…Ê´àjog`zUyv½ü5”MòÕÁr뇺5ÙÜxÄ­¼S‚¡ž÷Kb¡nìoêƒ?¡2wŸ$ÔˆàÓ&A[왚,èã;dH(2$Š E†„"CB‘!¡ÈPdH(2$Š E†„"CB‘!¡ÈPdH(2$Š E†„"CB‘Q*ùCØâÑ'‹„ u>¡O$„F|5àFÓ'6‰„"DÂ&šÏw†x…¡¡a6VÐÎÎp#EÂ&Õ¬PÓ4ææÐ"I»P°iå4ÕB«6-PœÆ/”͆-‡òÐ×qæAÍ©‚P;MµP8;{ EiÒ+Ôvºi”H¨QK’Q“Bƒ`Y)$4(¶rMBÕá^vI¨"Ül“РØ2OBAU>¬*o¹°îpH¨ ‚k…²7Î ˆûÿ)j¨Þ yÞM¥W¨-ž8t.iZE`Ö×ç&$Ô7âBF¡Aâö¼DÄ"´Úoc‰§Û$½äÕ6®êÜ]»˜±Ê\hp¬¼$©c/@¡FÅ) E‹J(Ú]C±ˆE¨F­<:4ú™Ô O¡ñFÂ&‘P„HØ$E¡±<0ÀªC$êBãzüÂ)T“H,…nPdH(2$ŠŒ¢Pç4ÔžS{þv â¤Öyæç›l?@6êB}ýTDÀT¿HþðDÊþŠ„ó7O ¹&ÿ©[0 ¦¨ÚæžË­PKs¡#"øj¸ý*/‡å,Ÿ#ÏpJ¨ß•29—‰Þ ±P·Ÿ ñ<—x„:ðDæÇUä‘*ˆ„sU÷wtPZI¡òÁ;ì†ÖBîòƒçŠPÃ¥õ4xí¸³UÅjåÙ“zVy·¾JÔUÞse,(TU,H(2ÑÝzF‰-˜(c£G!¡ÈPd}ë ¶xô‰Ä"aBiî;Lj ƒÙÐ'6)Ðx‡hé ›P¿£Š=bÛ"Áî+6©¦„"ÎXÅ:¬^BÙÉ©<óÌÇI¨/õÚ ­F/#Ô¦> ¡~aÒN¨-'òyC¨Â<ƒz e3)ÊÝW¨Ú<ƒ µåP ÔmKD¡¾vƦ…PgdžÑÛ¶¤k¨=gNœ+Ýž '¡ö ¸9±UmÁü$T*'Tåíx õ,w‚ml[’P‘)v†+™þ •Ê uì툟RÇšËÁ ¡j7*Ò.T&,¿¤W(âg‘ì¡Rz/ïY—ý~øX…„ò‘¯Y6R-Ô³3ï´“”~ÚD¨Ø–Ð u(IB=+)ŠPÉîš8HÝ…Jö ‚ õÕù|ø­µPù>V@¡~o%œ¡š õÛ] "TÁ¦÷í×Q¨Bç_Y¨²Í*¶B W?ÔðÓ·gQ\%KõÃF½„*ß•ÒPdh°2©ÎžBã„M"¡‘°I4÷B$êB5™qNŸH,…nPdH(2$ŠLP¡nÏö«=óÒ¼ ‚ MÐψ Ô- …Xê‘°I4X !6)¨Ðê ›„ 4®a®úDÂ&‘P„HؤÚÊ^ BM˜P·@°„:/¬~£MŒPñ\$Ô_ˆ,Ê’P3TPï°XPûOi£¤0oŠd6BíoTªÔHhê’P¿3çè"”[*%§Ë¨±ÊÛªõUbêÙäǶ%b£ä|JYrª‚˜…z^þ#êÔ'!»BÅu*¡\w2ȶ ‰-ö™zMvÆ-„:Ãe7ˆ²„Îñ¦+õu) Fi^ž ºmnc•ön“§Mg„‚íµêt{ùMÉ[8„úŠ[!b¡¾ŠgÀiؤZûp„[—Åx…Vƒ“ÌIdBQÞZ6©Ö>`–Šxña“jö+Y_'Fh5\ t¡X$Lhlè ›DB"a“H(B$l Cˆ„M¢áŒ‘°I4à!6‰„"DÂ&ÑÜw‘X¨ ÕdÆ9}"±PJ¸AB‘!¡ÈPdH(2Bu›ƒ@p^A¨‚•¾æ&ÀªÕ,â“*LŽ›PÁÄVlªÛÄ8ìÑ‚Là$>©íȶWn$ΰ„RBNÝdœ˜xȘ?ñŸ$òSCóçÀD™k _¨Â´Wâl„'ÔmŠ)„ºÉ%¡$T¡2S… G#ÔÐðŠØÊ+çÇó¤ÝÜVÞ˜¯Ûê‡"CB‘¡[OdèÃdH(2$™@ßzÆ‚-}"±H˜Pšû“Úè C6ô‰„M¢Áb‘°I¡ Åxz€„žéád¡òÏ#úŒ„M A¨ÚÈW^ÆH¨ªM GÞªòþGÇ$4ø¨ìùùL·P¬1îLVñ…ª=ʃPÜ'Nä3­%4Œç/*N¥Ð0ŸfIe+/˜bÆmî î\+¼ÍЄÚÎ✞ÄKk´B¹S}ÈüÉNçÃ[‰#”;-ŽçšùP·™ —2Ë#¦*/¸HE Ôíêá6uçJæ€q4JâR±Pö˜¶·eî‚£P®>çÐ*jRm 5_C™ã¨E'¡¸““´–PÊ$…Ù±?á…¿†Ý]({ü¤¶ò褺é½S ‰”ÞËŽz„Bß nä¼ ˜…xUp'ôˆd50œÎÏgŠ¿Sr‹ØŽì¥¾„VÃU€—CÊDì —ì¥¸•—Œž‹{–H(2©}žBã„M"¡‘°I4÷B$êB5™qNŸH,…nPdH(2$Š ¦PÁÔUÜI=¸GP›gD2ñÙÅ!I‚,Ô×ô8¾Ž<µÃ&I¨Û”5Üùs‚ÇàyvAHnt›Pŧ$c?»s¥|¯tl©êY=#q? e ¡U¨Êó F)ñBk¼ÛêØ#CB‘!¡ÈÐÇwȤûæHýW ØÐ—tȤþkdlÒ=Ð!R<'Ò:X,4R×± O¡ñFÂ&‘P„HØ$šû! u¡šÌ8§O$ŠB 7H(2$Š EƇÐ(çð;õBž7ås9Œ9l¡úÙ  B3Û¸m€BP¡žE@mÚ¶ìضì"9Uwî<<Ühñ;÷ K¨ÚÔ]òÓ;9ó)9å’ø¼âÝeмJ•÷µÀpú)™y¡lo-JY–?¡ìŸ’BÅ»` už¥º^¼šPnÄò%TàBá8¶5n¥O TÐRù F±•÷U_‚¬T¨Œ…Æp •_¶lù±­”i1» G뿤•7„Èlòç ;BŠŒ¦·ž~‘-U ëEgõ¬ÐÇ_Øi”ŸÐ);­¼fbV{¬§™ BQ¥o?çTƒúȳ¯œØÎe’b>•‚÷ÆŸ—œ·Æ`…(”…¾uýMq‡QSü?žYÿ endstream endobj 11 0 obj <>stream 2014-03-12T23:50:42+01:00 2014-03-12T23:50:42+01:00 pnmtops Bildschirmphoto5.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000377 00000 n 0000008869 00000 n 0000000318 00000 n 0000000164 00000 n 0000000015 00000 n 0000000146 00000 n 0000000442 00000 n 0000000542 00000 n 0000000483 00000 n 0000000512 00000 n 0000007376 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<300AD0E1C0346DDBA39BE06B9526CB90><300AD0E1C0346DDBA39BE06B9526CB90>] >> startxref 9059 %%EOF geomview-1.9.5/doc/figs/color.pdf0000644000175000017500000001320412310162302013565 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`h`j4406R0R0ÈZ(¸äs!‹ •endstream endobj 6 0 obj 53 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 2968>>stream xœí=’Ô:…ïÛ èBV@$L2UÄ,ƒd’Þ9 ªf“±žg0ãÑèÏWÖ•tu}¾ªqu«Õú±NI¶¥ùPÆËßïß¿[$ýððpww×"q0„Ömº¤ÿñãÇ'Q.ï_¿~-x\J¿$»U@<}û[·é’þׯ_ÿ‰r •þö«OŒ¢]›.)¿yóÆwJÙ<è±P¤%š¶iÜ)WµâˆcÏ£«½¸Sj(%Žç9ºãÆûŒS.jmaÎxDµwÊE­®°q¹\¢ÚK:¥Ôu¢5³á×2p”:.­¹6k}j«(Ëœ²~†uÙ·îå®ãHµ©Û!;e}êÓ5Ü?^ñi…°Mù3/_¾¸élÞ×Ï)‹h ÝÊ€H¹C´M—&ã4mMg§\E  ÒÁ)™¢$§eçsJˆR%NI-;“Sfévën©pÃÀ)Ÿ•ž ÏEJ”nx‹×æ1蔥7xÜ_çŒ&ÖÍSÕn8Lˆ»îPÔ{hqJf®^äR§döÝ´§°¼²·OO%ͼ;lM¶û£Õå”E¢tóæ;eQß͉| /“pœ’ß“(rÊÝ,=–¼Eœ²´fŠõT¢$†SºoçpÊhÑó”:%¦8íà¸X©Å)Q䔜¥g„¸ÄÇà컦¸÷=\§|Vz’; 8å³:À)‡§|Vz‚Sê µSòS€S‚?´vʦ4á”àMòp:GœrÊY%™9Þýeø:Γ7%‰¤&Õ¦9§\ï¾,ï]µn·d*ÙN ‹`CH%å:¥«Ô?¢¼½½õ²ÄºoЇÕ)]‰?uß[ÐãÇý‹NÅÍÍM¸½Àåry&J×EQ¾|ù²w1Áiøõë×*ÊgòDé΀è¯SB” ×ëõÝ»w›S²fß®S.ŠXz`?~,ÇM”Üë”ä8%D dñDI‡r–®?!…­¶4˜S*¬^È:R] Ehkµµ„R³mU]E¨jµ­„RIõ¢@”!ªZ-%J‚Sž U­§PÕjpJzÎXU­§ ›(Û]4PÕjpJúT¹é¨CU«õvÊ%õõÅ·oßWí)G//ˆ2$U…­½Vú´Z?§\«·ÕÊ{Ûˆ’C¦ÕܳקÕú9e(Ž0¤%U­ÖÉ)wkâv®›.¯£=~*~*‘h³g¦¯ÊÑÊF-'_N/\‰(½@‘†óèä”yQºÂá×™ªD™ÆÌ(J‘† £Å)Suö~d)E.ÊT‡˜ï+uŠ’sÎwÃ=T8%%fy¥¢ôBfe'bC”^Rz2ìÑê2>|L™ê¹ò(lˆ’Óaª˜}‹ôªDV?˜šú(e¦„­EI=¯S2ç(ùñõ,0œb½Dø ¢ä7"¿áÂÂh¹£ã†§&¤aè%• Ô,Êð£”ñë¼£Ã9ç» ç{ßH;ݷJD9<%$€ÈuÊhä¦ÅvQÕjpJDîèd"¯@”pÊ ßûœRˆR8¥¥,pJ JYà”@”²´rÊëõ:¨F\ÄEÙ§ÊME©ªÕ„RUÝRÈŠ²[•Û‰R[«I:%R`J 8¥YÞ¿?ºGøþý;œÒ,‹(?þ<ºżxñb¼S®%‚¬³"3¢à”¥,Ÿ>}Z[ÄŒ(©Ò)Kt¥GQ¾zõ*üèíÛ·•5LñóçÏF)e=cÆDY딣Dy½^‡àGŽfg“¢$…NÉ,‰lÝÖnÌTv0)JN Qò1)J‚SNIQ 8e4'ˆ²&EIpÊ©1)JŒ)çÆ¤( N95&E §œ“¢$8åÔ˜å°{ߥ&EI£ž‚(E0)JNÉ\D²ˆ’¿Ü¢TËNÙhYD©ENÉÆìbL”4Ä)¡HYŒ‰ktì`F”„ÕŒf0#J8¥̈’à”f0#J¬f´€±%¶„uß³co‰­ŒSæ·›÷P~ßo®e¾&/žSýSB´÷9<̈RÃ2_“¢”žr÷ÿòM!ÊY 1)JjñegpGgˆ²3Šî}C”"˜¥®ÕŒ€(;§Üg®e¾&E §ô™k™¯IQÒ(§Ä‚FAŒ‰rŒSB‘²%aŽ̈«í`F”„5:0¶p «§ÇÞÂ1ªqÊÔ³‡wòUŽÂ5e&/ U9%D™¢Ûš2“¢$ñ5:³?º–AáH“¢Äó”@”-Àó”U@”-hµšÑåî#•¥“ Jñë”eDɧá“ç‹™@”^L‚([ÜÑ(= J> ïèð÷o(½˜Q¶Û!¢Ü€(ù(º÷ Qn1 ¢Tò”D¹Å$ˆNy…kÊLŠ’à”|®)3)ÊaN‰e:‚%á3À˜(±FÇfDIX͆§ê0è”X‰65‹ :%D9/ë-³N¹®}±ÉɬSB”Ó‘%Á)Á(à”@pJ 8%Pœ¨ã¤N¹ýƒŠm‘à~êÅÙýbfí‡l¦™øüL3JÃ9£SzÒÙ]E´EÈ|q÷ßXífÊÜ,U‘LwkZzêŽqF§,:³E[*d"L-J~‚"trʰ¯¡½.,Õe¤¾bC”©tDDYš¸)§Œ¶ewÀrCÂsA ]Ö‹23ÓSWŠÒ}»›'~åÏ/¬©5§Ì7a>Â1_i!JJ·PiRE¦[:f-Í”_S槆aNIYÍí~½ƒ(ù#0N©*Ey,¼]M™µ8Æ0§¬«1ÏDÉÉTVÍ"ôsJ/$Sçpºs¬Ë¨屦œè¤º‘Ýp‘×dZj§¬<¥¢äq9•*Í´§(wN:E©bLÙh¢C13&†(S_d–Š“i4ñÒp~¦™¬&ÓJÎ8ûÊQá”ôøû ¦©^ƒ*®SåhqÊ-d}}¼ïÖŒ)rÎxï(çŒO åÀ):à”@pJ 8%Pœ¨N Ôaß)±eõ¤˜uJ(r^l:%˜ƒN fÇ Sb'ß© ·—&N QÎKt{i;N‰KBÓë”@ö¯SB”Ó§ê€SuÀ):ú9%sµüú‚¿OAˆrRÊœòöövuG÷("ÊèÛow£k!ÊÝõÝö(Š@å+°Ëq§„"A#:åÀƒ3Pì”Ëg#Ë ÎASº;ЖS®¯qıç1甂¬¦Û"e0ЦmwJñ<Ö‘ti†vmwJo7Àú#=n¨µí›…ãìÇÖmúä”íf6[¥úÓ´Mÿ‰Uü3èÆ endstream endobj 11 0 obj <>stream 2014-03-12T23:50:42+01:00 2014-03-12T23:50:42+01:00 pnmtops blah-000.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000370 00000 n 0000005189 00000 n 0000000311 00000 n 0000000156 00000 n 0000000015 00000 n 0000000138 00000 n 0000000435 00000 n 0000000535 00000 n 0000000476 00000 n 0000000505 00000 n 0000003704 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<10FC5FBCD2418F7C026863963C561174><10FC5FBCD2418F7C026863963C561174>] >> startxref 5371 %%EOF geomview-1.9.5/doc/figs/initial.pdf0000644000175000017500000005745212310162302014115 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`bi`ªg62¶4Ð3Q0×32000T0ѳ€¨´PpÉç B0õendstream endobj 6 0 obj 65 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 21550>>stream xœíÝ¿ª$IzþñXÉ—!§1ú ¦Á04¬c¬±ÍÂÐmè º1æ\\íÎÀ"k¬11Žü1väj¯@ _1ñëÜì̈7߈Œ?oD|?FQ'++3êTå9O>••õ³ÿû¿ÿsf÷3¢?°¢?°¢?°¢? ®Ÿýìg½‡KÛ?ÑP×#úÿû¿ÿ{%ÿîw¿ûöÛo¿þúë €jÿ{,ÿ«¯¾"ú˜sm©ÿ8¶èÿøôË_þ²àåãÿåc±Û¿ÌâËç’K.¹¬}YûïØcù¿ÿýï‰þ¦µrÇ\{„¿û¸=RòÏÈö¨ì¶Ç[|ÉÐF½¿c%ÿíßþ-­?€™­Ü17n2ž‘‚O´çÿe’ûŒ«êß1Z“[¼cnÙ)ž¿.¹ä’K.ë]îÿÞÒú˜ÙâsÕ~[¨õ·ð‘K.¹ärÖË}óõ-­?€¹Ñ1Wú/⯗jýË©óüÀÒ‚o‰þ¦EÇܬ=ºóŒ<–SéÓØ°¬7oÞÿÞýL‹Ž¹ ¹=RŠ=#¥>í×Òý3Ö\rÉ%—y—¿`¿üéOÙý¥ùè¿M¡õ0?:æR.Û#%áùÝíÏ$|kþÓ¦ôm¹s*”ú;¶ÿgû»Mô0›Å;f×°=*õŒÜyº þ÷¥o?œI¹È_žóß1ý;Õû9÷­ ­?€UŒØ1Ú)Õ{Fnþ÷ÝÿË´|H˜ÛW?‰Ýzg±‡Ka¶Æn®ºãȱ‚R·ƒÇbÛûÁ~6¿ZË®c·=R2øŒlô2øv§ èõ–# «úw;{9´þ–3\Çúï÷"ˆþP–þþÝÚm"ÑÀÌbóo~ó›~ƒÒ«W¯äöH)øé Gë¥m­?gø°ŠXÇLôOòüüüOÿôOr{¤üô­?·oý9À%Ä:fýÿë¿þ«ãØFñ/ÿò/Ký]óú;Z(ÖÀrb3Ñ_oý+ןÖŠ£õ°Mëÿúõë~Ôî~t¤­?ŒˆÖÀr4­Çèÿüüüöí[Íœí¹ÖFDë`9úÖ¿ýÁ?>R'EÿfƒÜÖFDë`9úÖŸè¿‹þ´þ0 ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°œ;­ÿÓÓÓËËËy™±éš[÷îDÿÇZö·*רG룣õ°œ;­¿×‡Tœ˜çfôßA¿¿‘16Z­?€åÜlýÝUôßÚ÷ýÝ_v FÿÔب΃9Ïy­?ŒˆÖÀrn¶þ>.Ÿô>Üïo:\q"u°•¯ýc£:&8çyl´þ0"Z˹¬¿ýÏ3¯8Ñ_9ñ<6Z­?€åÜoýÝUÙ¿Í?bôß/ÖfBë`9EÎð‹þ—üØþ±ÓúÀèhý,§Hë»n'úßêy´þ0:ZË)u^ế²½-Ð,úïo ž†È…Î;$Œ?66Z­?€åðm¾yhý`t´þ–s§õ¯mÄèO룠õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°}ëÿüüÜe„IÑ¿ñ iý`\´þ–£lý{å~—ýÛ’ÖÆEë`9šÖ2Z­?€åhZÈhý`D´þ–Cë­?ŒˆÖÀrhýï£õ€ÑúX­ÿ}´þ0"ZË¡õ¿ÖFDë`9í[ÿ§§§óÄ———²«(»@­?ŒˆÖÀr:¶þõzÇèO룠õ°œŽÇúŸúö†À6ÝϳÍégØO9ßë¼Úhý`D´þ–c§õ?¤ùCÖ¿œx˜Ö £õ°S­ÿù¦`²¿œcý—hý,ÇNëï>þ°>úï—Ð=úÓúÀ(hý,ÇNë¯/õc3Ä–\­?ŒˆÖÀrì´þIÇó8ŽõÜCë`9vZ÷ñÉyçöÙÏ ŸáÇ}¼oЭ?ŒˆÖÀrý6߯½¾ŒÖFDë`9[ÿT±ãþ»£õ€ÑúXÎX­û¯ëÒ õ€ÑúXÎ@­¿Y´þ0"ZË«õ·‰ÖFDë`9´þ÷ÑúÀˆhý,‡Öÿ>ZQBëÿøÓÜoœpM™85­¿¶8xûö­¿Bë#Jhý·?ÍÅù}ޝ¿þºÆÂXðþýûÇe½ÍüñgD_6kZ¢ÿÙ»wï¶·Dhý`Di­ÿ¶—àç.uéÛ-_>—\riárÛÃ/¾dÿ§#5ú;Eë¿•ÜxýúµÛ Eë#JnýÿkKÙg‚²K`Á~¿Æfž”8õ­?Ñ#DÿÃo’ÖÌÊlý‹ÃGr?0±z›yjâ¤õÏ@ëÈoý·V†K.¹ä²ËåþoÙ·´þ•ÑúÀnµþþ÷sÉ%—k^ú¿By‰“Ö?­?Lànëÿø_ÛcØVw'qÒúg õ€ Ümýÿk+ñbÞ¼ys'qÒúg õ€ hýKñÓ¯¥ûù¹ä’Ëý¥ûé kÛæþ/Oð/—ìNëÿôôôòò"_—çÔß½Z˜@™Öÿw·OÙñ-gøL*¸m~[è¾û¿ëìÿßlý÷5iÒÅÃ\ö¥}öóìÅæ×;/$ö0•«kÿ»ÕüÞ.¬r`ú[3QÒªrÙú_þ*¶å¸‰ZÿÑúÀÊ·þ©#xÜå~ë¯Icwâév—sÊÔGØýBÎÓóÈ¿ åðô ¬ñ»U.Sž¢_ˆæ^Â#©fÕÃÑ´þÂç¥Ñú‹Ö&På ?Iqç«M^ö~ògÒåáq%­Qžóy-IË-¶ÁïV9ÈØ˜ÏOJÙ‡“wS©§Ø‚Ëmóü Œ-ÇÑúŒÖ&0ê~Ü)pì3D,‹¯ëÓÛå!ÕÈ…Êñh†\òv½öïV^ŽüKÓü2/ŸaØÊå%Œ‹3üý7´þ0QÏ븉¶eœ×?áANÖ&0pëÅ‘û õ'úohý`´þ¹¿™Å[ÿwïÞ%<ÈÐúÀÐhýD5hýõwoßú“ûÏhý3<þÑö€þþïÿ¾÷  õ ©Úú{ʀƭ?d´þz[ô?ç†ÇM‰þ²ù¸ü‰°1 ›ðˆhýDÕný³—Ó õ‡ŒÖ_o çT!Ü ™¥6Ò2­¿¿óÖÓä]>2Áû÷ïï,K.¹¬qYjÛtö"î/‡Ö¿;Z½}b8¤á&m¬¶…¦µþ_ýôÍ»9üÿ¿ö«_Ç{ÓöO€)·ÍR‹¢õïŽÖ_O&¦ÉÀ(Ü<ÓZÿ/¾øbgÿ¿¶Ý`àÿ—ëýû÷Ûã­ÿÓÓÓvýåå%ãî÷ª‡Ö_/é‚iâ`ßšÛfαþžŸÛ}èÉ ™W¯^m¹¶‰oÞ¼1Ûú‚{FŽ·ý­¿(öÁAá3…s$ À²e7ÌäcýýõsOmëDצõ?œÎÛýdñcUck ÎYv »-ë|±)—ߪöÐOÓšhý õ×»&HÿÝ¥f}{mdo8ëDÿF­,fUþÊžÇps03åU?Jh- £Ò øò$‰°ŒÖßZ½›a‚ôß^Ù¸Ãn@%w6™u¢¿kÖúë3YÑ¿Ô`Æþe5ŒþN³Ö߯goß¾u´þ)î‡ Òmâ~ »¥ÜÜXÖ‰þ[ÿ؉ð’\²-ÿ0†ûG¼h;=Ÿ<³<ýæÈ/¿{èÎØä™SÛK‘_E‡ñ_¾äJ½PJ³ÖŸèôîÝ»ýï‡Ö_£H˜ˆôsš8Ò^߬/cO OpsHúJìu¢¿ëÛú¶qgµA6¸Šâü\®H9³þúý‘»Ð/¼ÔØ‚3¤ŽPý«þæÑKãÖß7Üð^¿~í>þýÐúk ÷“Íâ,Çýv4Jí¯ýÛµþ‡)±´}HuÙY6¶Fa5¢lEî”#/G%O.${ü‡á)Ÿ”¤±å 5ö6‘òU$ßK9½4ný‰þ{±èïhýEeÃÿ$1ëËØ8+¸Q¬ýÍÖ¯Òá+òªF?à'¸ÃòkGÿýõD3¶Ã¢?’ÐúwD럧x˜ ýËæ‹û1ì¸Ò›Ã:Ñßܱþ¥–ñè¿MqWñúòWw9±Þ9¼?Ðæ‰Ãê²Ó<Ñ8´þÑúç©&HÿëÄý˜5wŠoëDg°õ_'úkfVFÿsÎvöØäéDÜDëß­žJabñôOÖ—­°'PcX'ú[lýÝDóM  ±Qé¯ßŒþîã ÿþxc Î:H!Žk~™I¿y¢¿)´þÑúç©&V;íq?Ï”»•>ò¾NôwÖZ÷!~y7ƒìÁy/‘o.²×!dÇýö·ž§»ø/$8ýÎȃSŽ-îƒc;/$ixšè/¬+¸›-ÑßZÿŽhýóÔ± 4AL!ë×0Áž@½×ü:Ñ¿QëK–“¥å±aÝ[ÿJÂÛ­žab¦ôOÜoiÄÝ€ª¯öu¢¿kÓúã’åÿ–džutoý‰þ´þ©Ú„‰¡Ó?qß‚!vj¿Î׉þ´þVXþ÷oylXGßÖ?xÞyÊKè«å„ƒý‚ÇÑD럧Y˜(ý“õí3¸'Ðà¾Nôw Zÿàa÷^¥ÿvÂë­ô¼^ãÿË÷zýÆRÉãÜØ0 2Õúk>2®ÿ ¹ýW,­ž–aÂrú'îËÂn@›×ö:ÑŸÖÀÌë/Ÿ¼ër†¡£¿£õ5ÖÒ?‰&½öš½ª×‰þŽcý ÁTëïB'†R¾- ÜË,Zÿ<íÃDð‡÷Ï{˜Ü?ŸÆé¿ñ‹yèOë` ¦Z}©›!¸X³hýóô ê¢ÿ|ZFÿö¯áu¢¿£õ0S­Òñ<Žcýãhý[®ºY‚!÷ϪMúïòê]'úÓúƒ…Öß‰ß <"H>ÃÏy±6Ñúçé&z¥rÿÜj§ÿ^¯Ûu¢¿£õ0„î­¶!z}­žîa¢KŠ"úÏ­jôïønU÷­µb­ÿóós‡áXRÇÖ?Iìè AÑúç±&g)rÿ *¥ÿ¾G©YØZk+Óú“û´4Pë?Ê×uiÐúç1&bgJ)>rÿ:Чÿó ²ñ™©Œl­Uký ™W¯^ ÑúO†Ö?©0ŒVÇ@î_MÁô_ûÅ™7†Žƒ©¤Ø±þÐÆóóó@­ÿLhýóX ¾F­äóÏ?¯·pôÝwßÕ[x—­ÃÔÖZgø0’îgøY­ka¢Þ±ÔTþkº_ü[øŠË•Nýgø0„qÏð3Zÿ<ÖÂDl¥7Cî_Ùô_éYv0½ÆS­?€‘ÐúwDëŸÇZ˜Çãr² ú¯,/ú˯7ƒ[ÇLÑßÑúøÌ×Ñö†Ö¿#Zÿ<ÖÂÄåJ3FEîGjú¯ñ:¼ÏÚÖZ­?€k}£ÿóóóÁiý;¢õÏc-LhVšôQ`>Ú /é#¿š¡©­c²èïhýö™¯±C§õïˆÖ?µ0¡ŒþúQùÃÓÿÅ_„¥XÛZk õpÍfô§õoŒÖ?µ0Q6u‘û±§LÿDÿŽhý\³ý­[´þy¬…‰‚©‹Ü3Mú'úwDëàšÍèOëß­ka‚誈þÆÕmýýÿ†¹‘ °›ÑßÑú·EëŸÇZ˜(•ºÈýˆ¹LÿDÿŽê¶þÓGÿwïÞñvV`3úÓú7FëŸÇZ˜(’ºÈýÉéŸèßQ‹ÖÖÿÃИÍèïê·þÝûòip´þ©¬… ¢? ú›Õ¢õ'ú×ðôôtžøòòÒ~$µmtÊG7ŠØ«ýñ윟—mbðVazPÇÖŸÜDëŸÊZ˜¸ŸºÈýÐÒ?Ñ¿#Zÿ|½¢0ôïM‘mFÿ¼Qž»ŒGÔë·a3ú»š­ÿ¦ï×™mƒ12Œ ­¿žµ0q3u‘û¡KÿDÿŽhýóu‰þ±ìx?Sš5GôvØòv†ˆþ1C´þ›Ž™{ÿ5ÆF†±¡õ׳&ˆþh†èo­¾öÑceª<ŠHý=çÏñŸßû­ÿþñ§»Èƒ2Òú·ïðÀ ã0Ö_ÃZ˜¸“ºÈýHLÿDÿŽhýóuŒþBì³Ù‘Ï!ûó±'EùdYø\ÇÍèï‚þúž‘Ö¿{æ62ŒÃtZ ka";u‘û‘çœþ‰þÑúçküŸ¸Hã«_ˆþ_âf–@"ïù&9 ãL Ü—A­ÿÍÔˆ^Ñ?ï—#G´Œ9/?m,ܽHô¿gñèŸ7sÙWõXÇúk¢ÿá¾´þ›¢¿£õY y©‹Ü;éŸèßQŸÖ_þ_ÒG;(úË­|0”ßœS¾ûýè¯gð9ú§~l—è3ú_>k­ÿ?üÃ?hV‘íÿñý9úùå—U‡ñÍ7߇±¡õ׳&2R¹÷íÓ?Ñ¿£n­?Ñ?U‘èY½O6Q˜r9§,/úß?j‹èß½õ7ý?ùä“ü±Ô0’¢¿£õY DtAô7¢ëï¯>íGô?Ó4å‡:ü²b/XÆ7ôúGÔ1ú¥¾ÔÇþ®ÂÇ|­ÿÜﯔJÿ´þY ©©‹ÜR¶ôOôï¨ëþOô"úß9^èüclºÓÉŽþòaT×[–Í“{Òú{[î÷ФZÿ‚¬…‰¤ÔEîGY>ýý;²ÒúÇnµÌNô—ç”[çàœ ¢¿0ÎËCóõÈ}œéƒÇÞÈ•sL^ô×üZJ­·¬^Ÿ1uCµþûÌ}ˆãz#FZ™µ0¡O]ä~ÔðHÿDÿŽL´þD ¢ÿèïNq_Ø ÐÈ~:òrç.EØŒþ¦ZÿsàÎKÿ©Ñ?¸–ûéŸÖ¿ ka‚辈þ}Ñúç3{^ýa<òå›,Dÿ¤ãò…ƒ|R+ÿ¤1ýo¥õïý«Þë_äó¾´þY ÊÔõù矷ôÝwßý{¡õÏgüÛ|ùèíÍU .?Ú›´´Ô1ýo¢õÃÔÇ|­¿ÈZ˜Ð¬”¾µ¿çëÀÚÖ1Yôw´þ:FI~—7¯P¯118`yžŒw‚kiý/Gűþ2Zÿà0LEZ™µ0Aô‡Dÿ^hýóu CÊ+Üš:1éSªW¿?KóšsÅ$í*hä½Câ²~«E|“Íèoªõwý>æëzGGë/²&.WJîGrú·¶uLýßæ›¡W’?äûЪp¯XVÎÖ%ú ã .§oôF›:¢¿ÙÖÿ&Ù ~ÄèOë/³&ä•’ûÑ’þ­m“E¾Í7GÇ0ät5ÿå6IŸˆÍÐ+úŸï›GXH³èjÒ}ïø&›ÑßZëŸçð^ÁˆÑßÑú‹¬… ¢?ì ú·×­õ÷WJå°.úF %ÿj~~î5€)[ÿàÇFŒþ´þ2kaBX)¹íÅÒ¿µ­c²èߺõŸÑëx¼Ú;æ~7cëÌèƒFGë/²&b+%÷£—`ú7µuôO }Zÿ9ýöfjýÝ)©ýiýeÖÂÑÖý[¢õÏGôÚ›¦õwðãhýEÖÂDp¥ä~ôuNÿv¶ŽŽã©Ö?ÑhošÖÿ|&PÿE¼#FZ™µ0q^)¹Ò¿‘­£ïxj õÏGôÚ›£õ¾`ÄèïhýEÖÂÑ6ýÛ õÏGôÚ³Ðúûz>û!Èßü5bô§õ—Y ‡•’ûaÇ>ý[Ø:”7…Ö?ÑhÏBë¿}ýVÆø/¿ñwÄèïhýEÖÂÄ~¥ä~X³¥ÿî[‡þ¦±Ðúç#úíiý·[õ;ç“ùg1úÓúˬ… ¢?,#ú×FëŸè´g§õ?ö‚gò‰Í{þQy÷" Ô_O^—èoü¼þµõ­¿^ƒ0AîÏf'÷{¤ÿlEÒÿ:ÑßÑúobÿMý•—Ó‰…ÙÎež‹Ÿ?;µð›†©èž«fc™x»×6³&©»”×Xê]èUw^þe+|¹4×D÷Öÿrb3v¢?­¿Œèo“µÐ¿Ç@¢¿­-«•÷ÙìD ¡cëï²¾úªž¾C¢õ×#úd9÷{¤ÿTD%Zÿbbe0dD$éÕúã€Ö_¯A˜øÃþðgög÷—³û¹ß#ýëýÏÿüϧŸ~z9ëDZÿ2bE@@ôG’^­?hýõÚDÿÇ%éÿÒ(¡€KÜÿ¸$ú+Ñú£3¢?΄?í[ÿׯ_ß|8wlƒ12Œ ­¿^›0Aú¿4bî÷Hÿ‚‚¹ß­ýiýÑ ÑgÊèߦõÛÅÛ·oM cCë¯×2ú;Òȸ¡€3ŸûÑ?EõֿŃÀà|ôï= Øb­õo¿_êé!úwÆa:­¿FãèïHÿ›#÷{¤ÿ½-÷;¢Šº­ßw¨ ÍTëß=sÆa:­¿FûèïHÿÌ”û=Ò¿·ÏýŽèŸ¢nëeÑú÷Æa:­¿F³0Añ¿7_èßc FåïVŠþµZ(‹Ö¿ï0Óiý5ºD·vúŸ;÷{+§ÿJ•¿[)ú;ZCèÞúùå—åMÀ7ß|ã¯ÈÑ¿×06´þz½¢¿[2ý¯ú÷Ü8ä~GôODë`$Ý[ÿ¤ÌýÉ'Ÿèg~øñÇõÑ?uáE†±¡õ×ëýÝbéµÜï-•þϹßýÑúÉX­íèÿ˜?iù~±´þµ ˦ÿ5CÿÞ ;µs¿[)úÓúÃ(­¿Ð>ú_ôm¡RôOÚIȈþŽÖ_Ô=ú»ÙÓ?¹ß›;ýs¿#ú§«ØúsRÙÌž×_ý·¨­‰þ‡„âÑ¿_q9³£õ¯€è_¹oâôOô/¥bë￳ÍÃÀ ü—øö̾Ýy”ÖßS¶þû9ËFÿÃGÊ‘Ðú—e!ú»Ó?¡?f¾€XîwDÿtu[¾¥—x‘LlŸSß·õß'r9úç,ýƒŸ4Ðì-Ðú—Õ8L,’þÉý²™Ò³ÜïVŠþ[Rd¼HfuÈîúèï_ƒ¶þ‡8.DÿØœ¥¢¿ð cÍH´þÙ‰þnŠôOè×›`@ÈýŽèŸ¥Qëÿø÷Ðæñ` ?üðƒOxþErÎ×ùû§|RüùϾŸíW¿úÕ¿þ뿦8õ?Îdë¿×ý€DZþ˜ŠþnðôOîO5tú—s¿#úgiÔúýqFôŸ˜&úo)?8qÄÖÿœÅƒÑ?Ù‡ŽþŽÖ_d-ú»1Ó?¡ÿŽw.s¿#úgi×ú¿¼¼øéOOO€¶Ù¶9cw|LϘ"¯:8sÒB Œþû_µðÔ'­h»{ê³=ÖØl]6µ‰þÎRë/zy67xô§õ—µó¥rÿ}c¥ÿ.¹ß­ý[´þš}˜gÿc^Ð'ú[vŽþ‡Ä¼ýxžît9>¸÷Ø ”§Fÿùv.£¿ø‚ÓmýÏ9àÇÑú‹ˆþ7‘ûK(ýýëiÚúWþþGa —ˆþeGÿà” ì;ÞDôoý™Öÿ²Ëæ9Ì9bô§õ—ÙŒþn„ôOè¯Áþ€&÷;¢®n­ÿ¾ˆÝnJŠþÁbw9wÆû»†ʺ<Ö_ˆþ±‰úybϸ‹t¤yEe,¼ýñH ÈÑËý±›Æjý…¾zå‰8þŽÖ_d6ú;ÛéŸÜ_åô¯ÌýŽèŸ«Oë¿O<‡ë5¢¿°:wÚçAA ¢¿‹ä£m\^?$þ› ™C›èïÌ´þ1Ýøió•^´þ².abèôOèoÃà@ßÜïVŠþ­[ÿXįý“Vwç¨!èÅ¢¬D?Ü=).ŸwbÅÖ"ŒäN»ú-,ý¹?xë@­öÉõƒþŽÖ_d<ú;céŸÜß’©ô¯ÏýŽèC·Ö¿HôwñÄguDÿ6Jµþ±Æy¢P´Êûó¢4óÇöUˆþ®Nôw½[ÿ¼ïÓ ýiýeö£¿³‘þ ý½XØHÊýŽèÃØ­¿#ú¬Í?ÊeÆZüËù÷SÜÕ~Ñÿñt»Ÿ’}ìŽÛ £´þå±ø#FGë/"úkûûêžþ‰þÍÐúý»é{†Ÿ›éüò¢¿‹D!÷»ÄèﺶþyÉ>h¿¨‚Ñ?øžƒfoÖ¿¬^ab ôOî· cú7’ûÝJÑ¿CëïJ|Ì7vÓy9I«‹Í²úž×_Óú+¯ëß"Ð,dš¯ô åXÿË#yô{‡?bôw´þ¢Q¢¿ë‘þ ýÖ´ßHÍýŽèO·óúÒÒùhiw: bvô-VÞÓõý6_å±ûû½ÄËêå±þ±èRög† ðsÉ~ë_$ú³ûˆÑŸÖ_6PôwmÓ?¹ß¦–é?#÷;¢ÿ=&¾ÍW“­Éßó¹<Öß”ùŠùªò¢¿=¸qZÿ˯ñÄ‚{©è/ìœ\î0Ðú—5VôwMÒ?¡ß¾;y¹ßýï±u^Ñ>Dÿ‰ÉÑ_Èô£ë'úË‘½Hô¿ó¦­qÄÍôOîEÕôo0÷»•¢£ÖßO?Ø gúØQÑbm¢ÿˆ­ÿåQ:÷£¿òŒ¢òiý 1ú»:éŸÐ?¢;Ù¹ßýokÔúOuèâeŠþHBë¾IyF ›Ñ?é›bã§õ/‹èï‘ûÇU<ýý;jÔú“êpFôŸ­ÿá&ý™@ïDÿÔo;ÓÑúW0hôwEÓ?¹tÓÿÜïˆþ·µkýƒ§F‰‰nåÆ#-,v–Fè]FÿÃ917±_µpHXÞ³ÃA>Ùhý·›ROÿŸý3r¿ÜK¡õ/¨o˜èžþ ý3¹¿`9÷»Þ[kíZýw0ù+š¯pÒ,³Fz žÊ©äè/Ÿƒß]¥yýó"ÌÉ“›Ößß”ñµ_yÑ?;÷oû*´þ ýݽôOîŸÏô3÷;¢ M[}ŠR~{+ÑhBôßN¢Ÿým¾E¢?²-ÒúËò¾ë75úßý{~´þeý]Vú'ôÏ-cà~îwDÿºµþ‡oMº vÁ)ÛSÜ霡û;©h0ÿÉË´y0Ò(bÑÿœø3vübwÙ®k^!ö<3k‘Ö_—û]ѯôÊCë_ÜÑß%¦rÿ ’Ò‘Üïˆþ%ôiý/”Ïhýcˌͣ†f™dÁ<Áèü݉þy¯žñ<Ó·þõ$EÿJc õ/«{˜hYüúW£Ü¢òw¶Öú´þçwŠDÿà2õ¡ír¥Á²ÎÑ_ó ?ßTäÙ<|Θ'ZoúÖ¿}ôï2Œ ­¿^÷0Ѭø'÷¯é2ýRù;[kÝZÿÑÿp«&¦Ë§Ž!úWÕ>úæÑGÿýÝyº5&ný›‘£¯a¦Óúkt¥¢¿Ó?¹eBú/•ûÑ¿i[Í<±£;b+%ú—ŒþçÙ‚Ÿq·[ÿàtÍ+Ó‘þ&ný›(ú;ZQ÷0Q0ú»Pú'ôÃ;ïÌýŽè_ÈT­ÿÍ`Gôo,é¼þÊ/ÌP$úkV wýý3Dë¿(úÓúË,„‰zéŸÜ½}ú.÷;mÝZ×éc¾±Ö?x>æ[Uvô×TïÙóeg¯!ú ¹ßÑúï ý­¿ÈB˜(ýÝOéŸÐ˜Ç@ÙÜïˆþåt;¯ÿþÈéìÖß…òܶØó<Âñß/W§tt‘Cƒ‚ÙŠ›o𾇉Á…Ä^!ëŸ-ýþóŸËwüÕ¯~åhý2Pô§õ—YÅ£ÿßýÝß•] &³* ¢)&¾ÍW“žIØó¹ŒþW›èß²õ—߬¨çý»cCë¯g!LþŽô¸â¹ßýË1z^ÿ3¢ÿ|ˆþ›¬õï¸ÝÇÑßÂ06´þzFÂÅ?š´òwf¶Öªš¶þ~º|pÎZÌŠè?±™ZÑúë ÿhcÜÊß™ÙZ«j×ú·y<Ñb3µþ{±w)óÎúZéÍÌà' „¯ÈÈCë¯g$LýÑÑ߸v­“‡ƒ‘ý'6këó3K÷ï’´XáÊ}´þzFÂÑmýkz¬¿Ÿ®<¼ÇEZ«ÃÌÙ'{)8Ò’]â‡&Vä ?òÙúùˆH/·þÁÏ,or¡I%Ý%Ïöâß(ïäm&´þzvÂéµ û¥­µgøÙȧV=úsJÐ9úÇN½/ß´Ÿ‡èßÑô­¿²YWN,ûÇ!{Ihýõì„ ¢?j#úÛ×í¼þADÿ¥ÑÿÜåïyÐ š™¾õ^u—/¿ù¢?­¿ÌN˜¨ýéÔÈýŽè_Z·Ö?øfô2ú_¾·|W½Ôü.þ™¿ý­‡åÇXôW œ‚OJìЋşšû¦oý]ü€áÚvýü ßÏÙ2úg¿Úiýõì„ ¢?ª"úÁîyý…wöƒËéuýrT„˽`ô¿úßùµþŽÖ_d*LPü£’ *glk­¤[ë/DMÊ—ïXpúaDÿ‚GÿÃÝ‹ÿ€½ZÿóÛM‡›\ä(Á-p_Þ%2úŸLBë¯g*LýQ ÑæZÿØ¿" ­¿<˜¤Q‘/]$úŸg‹“—E¾Ky*‰þeMßú'ÝÔ˜ò]Saº­¿žµ0AúGqsä~gok­ÁVëŸúoÕHôWþHô?H:¯ÿe”¹ýÏ—…âºVhýõ75¦Œþ7Lë¯g-LýQÑ ÝZwõA؃Ôè[~½ëšµý÷²£ÿÓé£Õ‡ùƒKp‘Ofó¼Ô0qëïâ'õ2òâ9¿ÂÝil÷_ê´þzÖÂÄc¥Ÿ}öYñÅýWV#úÿý÷]¶S[k ÝÎë>ìu?q#g2ùÀ¡óò«¸f~IöòC bºBßæœ?8Ex*y^Š›µõdžÖ_ÏZ˜¨ýéU•*¢%&¾ÍW“·Èdó¹Œþ׬­?6´þzÖ„_)gùD)•ÎéÙqëH½i,vÏë@ôŸÑb´þÓ£õ׳&êEGú_O½£ü‰þ•4mýýôó!r¦?ÜÓ úOŒÖz´þzÖÂĶRŠÜWïk¼ˆþ•´kýÛ< „è?1ZÿéÑúëY DDôN»Ö¿ÉÃÁHˆþ›©õ÷¥—m0F†±¡õ׳&ö+%ýãŽz¹ßØ:ô7¥é±þ~ºüeXÛõÃqAš{qDÐX‚Ñ?vr¤ý/ã•ÐÝL­ÇÌýø=l»ÄF†±¡õ׳&+-žþ‰þë(ý÷'ò·°u(o‹‰3üxò™:cßÇä®N_ ³‚ßæ«üÎ5—rŠO´7_ëßþ( ÿHÑ¿û0Óiý5¬…‰ÚÑß­—þ¿ÒÇå¹P¯jåïllÊ›ÆÒí¼þgyÑ¿ø÷Ô ™Ëè¿Iz¢y X0_ëß=sÆa:­¿†µ0q^)Åÿ>÷{sDC¥ª•¿3³uôO ÝZù+±œ"úkö%«Øî%Ÿ]4鎇٠w'ú»Ó+Ä_Ñ|#[ökz·þ_~ù¥fÙ¶ÿ¦rôï5Œ ­¿žµ0Aô/‹è_ Ñ¿ Cçõ/ýcÁN¸®ŸY¾ J±èþð†üÈx®c×/Ÿw(MÜú?2÷'Ÿ|¢YK†üQý» cCë¯g-LWJúϳÏýÞéðRíÜï,mÇSCŸÖ_åï·þÁ™c‹+N¿3xÁèïB‰ÿ2ú+?!pó5½¹[ÿGæ~„cÍŠ’øÅ&EÿöÃØÐúëY DÿRιߛ# ʈþãêÖú7ˆþÁÓÂhbßa9±ô™tÚœeÌW¾5é©$úW2}ëOô§õ׳&b+%ý'‰å~oŽŒÓ ÷;c[G¯ñÔ0më¯é5±O^pùÐký/ŸJ¢%´þJEÿý@ã¤õ/ÎZ˜ úAô/ˆèß’‰Ö;Â;)ú§?Ø#¶.Òá}w¢ÿåË)x/ù¾Dÿ‚hý[4?,¤Hô? u¨´þÅY ÂJ˦ÿ‰£¿œû½9bbPÙèÌýÎÞÖ1YôïÐú»Ûó=,'¶ØóuÍ?ò…Ù Wê¼þÊçÝÝ~ @Ö?è˧‰þŽÖ_d-L4‹þnÒô¯ÉýÞIñ Måïìm“E×þ¼þûã°î0ÑéŽíq§|¶ŸÜÁ®ǦY~l8+øm¾‡çBÿT&½ Gë ‡þmžA£?­¿ÌZ˜WJñ/;çþý«ôüãáÖ9Ââ^›ÊßÙÛ:&‹þ&¾ÍWÀS FÌÖ£ ýÛœƒFGë/²&.WJúì£ìõ¹ß˜#,nšå~goë˜,ú; ßæ+ úO‰è?1Z—ú·ùý˜/­¿ÌZ˜ úgÛr¿æ•¹íÌ‘=¢ãñÔдõ÷Ó“B|Þ½0¢ÿÄoýSCÿv¯Ž'÷ôc~,Ö¿8kaB³Ò‚éšèÿø½å½ ûsDÆ–¹ßÙÛ:&‹þ®Aëßæñ` Dÿ‰-Ûúß9Þ¦FôWγ-­qÖÂDãèï&Jÿ‹#úÏý[´þMFBôŸØ‚­°éߪtͨ ð³M—ÜQ¡õ/ÎZ˜Ð¬ô1ÏgŸ}VjDÿ9Œþßÿ½æEhjë˜,ú;Z´'DÿËOwè¿êÁſַ’Ë/H]ÚaÊ¿-Õú_ž²ó<1¨àÇ|Ñ?8€sîw´þuX í£¿#ý¯låOôïˆÖÝÄ¢¿æ©Ñ_øZ€âŠGÿ–ƒ/eÖÿò3µ-£ÿ9è+‡·Ÿ‡Ö¿8kaBýópÄ?6£ÿ§Ÿ~ª–Z©’µ­µZt#DÿóW¼܉þÂÝ‹(»ðƃ/eÖ_¨Õ÷34ˆþÁ”¯yGâ0­qÖÂD—èïHÿ#+~”?Ñ¿#Zt“ý/¿·+¶Ã §gÍ7¸í‡|S"8†Ãýï ^øªã–lýûFÿXÄ÷óÇpÞUØf¦õ/ËZ˜HJ]ÿp¥+—ø"lÉÚÖZ­?º‰}›¯ðõºçt»¾Ìñ—‹ Fÿ¤1죯Á÷z‹`ÁÖßõ>àçpvÎóœî@ Zÿ⬅ ¢?Rý{§Zt“ýƒ XHÆû‰û…ùåŦŽA?CÙÁÇÜÒ:­¿³ñ1_å›îþAl´—ÃØÐúëY ©©‹ô¿¸â¹ßý»¢õG7çè/Ür3=ËY¹Ø^Ñ?uðÂÒšY§õßt<¹çeî?O˜ŸÖ¿8ka‚è$DÿŽã©ÖÝ£ÿy¶âéYsw³Ñ_÷¢¿‘Ö¯ýWz]q›ðhý˲&2RéY5r¿#úwEënzµþÙ‹(ú/rÀ³Ôúï)Cöù^w¢Rå/ÏLë_–µ0‘—ºJ¥¢ÿXJEÿÃw÷ý;¢õG7‡èÿÈÁœš÷Ûóö?&-j».$øØ/£¥ÁÇ jfÙÖ/uà~ë¯t¹ßBë_–µ0Aô‡Ñ¿ïxj õG7IÑßí>ðú’~rÏÔs˜¦¿ìNë)´ìç1(ëù²ƒ?ìBÄö(j[¼õßÓï´‰þ7÷@6´þzÖÂDvê"ý¯¦RîwDÿ®hýÑMì¼þËê{t~Y´þš€ÚÑ¿ÈqGZ=ka‚è%¢÷ñÔ@ënˆþš~EëtyÐRßæ{4ZZÿ⬅‰;©‹ô¿Žz¹ßý»¢õG7D?Üht´þ‚ØsoFÿRhý‹³&²S×üÇüÕ_ýU‘1ýí+ýÿ÷ÿ÷oþæo‰þÑú£¢ÿÄhý3ŒýiýeÖÂD^êzä~¥Hú'úÛW$ú?r¿¿rHÿDÿŽhýÑ Ñb´þÆþŽÖ_d-LXˆþŽôo[ÁÊß_!úÛAën„è/œÌ>ÕÏΦÞwºžŒuåÝÑ&Zÿ ãFZ™µ0‘‘º¶ÜïQüO¯låïíÓ?Ñ¿#Zt‹þÁm<úß<¥æLçöñ¦oý5kÉýÛcCë¯g-L‰þŽôoUñÊß#úAën„è/ŸD?I›T}óm ¢ÿfˆÖ_³ŠlúèßeZ=ka"5ur¿Gñ?±•¿·¥¢G´þè&;ú_~·—û¸€ß¾ Ø}ü}·çskï+,<8<ù¦ý£;|]×åºbƒ”gæÛ|Ïî´þÍÈÑ¿×0Óiý5¬…‰¤ÔÌýŽè?µzÑß}HÿDÿŽhýÑM0úÒöùzì\øI×…ãs×åî ÓƒÑ߉û$8òóÚ˜¸õof èOë/³&ŠDGúŸTÕÜïˆþÐú£›ìè|7 iºœ†Ï÷Í>è_9Í›Áy„Gí:õýÞ|­¿•¶wˆþ݇±¡õ׳&ô©KÈýÞýôOô·æ~ôr¿÷HÿDÿŽhýÑÍ9ú GÌk"þaùIÑ?xìMFôß/M?€ó—$8§ 4ñ?®Uëß+p»£¿…alhýõ¬… SÑß‘þ-©]ù{Dÿ¾hýÑM0úŸgÓGÿ`ÆU&o:ü&;ú_øò“ —ow]p®GúŸ©õG­¿žµ0¡L]¯^½Ò,â& *ï‡~ ú÷BënŠ·þw¢¿¼ÌËãs4#W à‘K±±50Së Z=ka‚袿µ­µZtsˆþ !d÷âóµþyóÕn86>æëÑú‚Ö_ÏZ˜Ð¬ôòPŸ=Òÿšå~ïðý¾gÖ¶ŽÉ¢¿£õG{yÑß}|{pºÓÜó°–ý2• ?58ÃyÀÊcýƒáþüƒãX­ÿ}´þzÖÂÄåJ“r¿#úÏ¢qôwWéßÚÖ1Yô§õG±óú'éRiãÒ¬­ì³½>S!¬Wª0Q¿AÑúëY Å£¿#ý¯}îwDÿNhýÑM^ô¿<öÌÚú ɸË^¨¼ÒŒ†çEZ™µ0!¯4#÷;¢ÿøºD'¦k[ÇdÑŸÖd·þšcoÐ×Ä­ìà«Ø1iûû&ž?Ç’}")aù‡í“‹“ÑúëY 5¢¿»þ‰þ}ÝŒþy¹ßý{ õG7EøMë´þòù .'ºøÇK4”+Õ|ýÎ?´þ2kaBXivîwÿ#ëUù{±ôomë˜,úÓú£¢ÿĦoýÏ?æEÿìä·ü¤9e´þzÖÂD¥èï(þ‡Õ«ò÷ˆþÑú£!úëóóµi…Ö?¶°`ô§õ—Y ±•ÞÉýþ™úó?ÿóüaý„ôßÞýÊÿ/þâ/—üã³—Lÿ¦¶Ž^ã©ÖÝÄ¢ÒÇ÷£?;5¬Ðúý­¿Žµ0\ivî?LÄNæsžhMl7€è_,ú[‹û_ÌëDGëöòZÿ½ìèXTF¤NZWvô׌38Ow+´þ¥r¿·…rZZÿ«.µöˆþ÷¢¿ñÄÐìU½Nô×¶þü~ ­?î¸ÙúŸ§gð#Üë°ŠóÄÚÑ_3ÎØ<ÝMßú—ÍýžOç#FGë/j&æÈý~7€ô‡ß¢ÇŠûm^ÛëD§lý¿øâ‹ýiýqGê~ FÿË,[Åå½ÊFÿ¤;Ê¡±f­ÿû÷ï·›šµþ5r¿÷èœá‡Ö¿ìЦÉ+@ƒWø:Ñ?íXÏÏíhý‘+õ¼þIó=Ï™ôñÙ=yº¼.åê.[>æ{XÎ>qn7½yó¦Mëï#õ!C'§Ëw/ý«Ø·þ±qÐúÔ&Lû±‚Ú¯óu¢¿Óëï¯s¬?îËø6ßý7š#aÜ.ˆ ·ºS^?¬ôò݆ú\(”dž-_?3¶ðñ̤ŢÿãéÖÜ=éXÿ-ý§Fÿ;­¿Î[­®ÿq»›x?úŸïÑL9 õ/¨A˜ ÷cU_íëDÎðƒ„èÑeDÿ2ð3?Ö è;ÃOÙèïhýEµÃ¹«©÷š_'ú;Îðƒöˆþøñ‡ôþbn5~†ŸC^?/¿Mô8<èH3q¿@Zÿ‚ê…‰Ø)§É(@L,ý»{'ý\'úÓú£¢ÿÄÚDÿŽ­¿¿.—ë-£ÿ~‡+±ëÁ+.+ú;ZQ¥0»ï4ÕØÖ‰þŽÖíý'&Ì÷þÏ7 ÑúoÎõ¿>úo2>æk'úÓúËj„ r?à*lëDZt@ôŸX›èß½õßÜ<Ö¿œÔè_­qÅùؔÝÖ‰þŽÖíý'vyrÏ-ý§ÛoýË~ÌwCëO럽´ir ªàF±Nô§õGDÿ‰µ‰þÓœág3hôw´þ¢‚a¢ÒGÑ•úÈû:ÑßÑú£=¢ÿÄ4_éõHùþ©?Lt#´þ.ò\^ìèÿýœe£ÿ~áœáÇš"a‚“ù—îï¯ýiýÑÑbm¢¿cýKá¼þ´þI³M“E€Rnn,ëDGëöˆþÓDÿ‡ÿüÏÿIßæ»GëïnD÷ñ¡;.ô>€œû­Qw¹Ƚá¬ý]ÕÖŸH‡˜-úó"™Ò!úëŸeã­¿‹|‰ïMòAöIÑß¾iø­AÙa‚ÜdËÛ|Ö‰þµZÿ6À|,·þþJÙô¿%ò‚ÑsyxÏ­Aya‚ÜÜ”±­ý]Ößÿ£€<–[¯Túßçò£?­¿¬`¾Ÿ&|mÜĦÙú*¶þPœÖß»Ÿþ¡¼lôáç­AIaB8á4ÉhIHùî´­­ý]ÖŠ3Õú{wÒÿ9‹Óú¯Üú¯;€öØ÷hýŒÄZëïå¥ÿ`1ú;Z‘2L¬9€^Ø 7´þFb°õ÷RÓ,‹s†Ÿ5[ÿ¤cdÐM·Nô§õ0›­¿§OÿBþ1ú;ZÑe˜àC½@3òæ¶Nôw´þ†`¶õ/¥Æ?‡±¡õדÄãC½@[yo²M³Ikýý²@[ÿfäèßk‡é´þ9cšØ´òVY¦õ'÷h©cëßÌ@ÑŸÖ_L ÂÑÓ$ À²e7Ì­ÿãßm‘X­—a¦ÓúkOÞûLá4ñ°oÍmónëÿ¸ÞeÜàhý›ã0Ö_C8q¸þœâjXpó¼ÕúûûpÉ%—\ö½¤õo6ŒÃtZ e˜˜&XcYm ÍoýËŽã±Ö¯¿þºøbØQu3¯Ýú÷úDÓ!úwƆÖ_OsÁ4©ÑRé­Ö¿ßî<2A…0ÂGWçoHÕÖ¿ã™ öÑßÂ06´þzþœ!.tÚËS‰hCþ€¯¿2ÇvšÓúo}LÙË-TZ>—\rÙ÷Ò}ØÃÿþ}åWjýD믷åC›)ú'´þÿÙ•†²e‚JËÐ]ÕÍ<5ú»ßMþôôô¸|yyy\y\nòÓý Âü­ç%Ü\»¼^y0z´þ0¢´Ö¿Ë@©Yë/we¦¿ý…ûÞY ­?Œ(¡õ€9iý“¢¿/ãݮ߿9à{z}ô.?6˜Øƒhý`D ­?Ì¡qëÈâ­JÊè/¯÷<1i$´þ0"ZË)ÛúŸoMÊåF¢¿K|çÖFDë`9íõßï!Ìýiý`´þ–ÓøXÿéøq´þ0ZËáXÿûƒ¡õ€ÑúXNß3ü*öŒƒmbŸ4МY(81¸? £õ€ÑúXNÁÖÿæmÿ^ðVÎë‹ õ°œEZÿí8Ÿóá^ò06´þ0"ZË™¬õßúÇõ}²ß&êg‡±¡õ€ÑúXÎL­ì#¼{óÐúÀ”hý,gšÖ_“éóf£õ€)ÑúXέ¿2Ð;uôßÏIëS¢õ°œiZÿöÃØÐúÀˆhý,çNëߌý{ ã0ÖÆBë`9wZÿfŠþ´þ0 ZË¡õÏÆa:­?Œ…ÖÀrhý³‡q˜Nëc¡õ°Zÿìa¦ÓúÀXhý,'£õ~~î2ÔCôï>Œ ­?ŒˆÖÀrR[ÿ^Û}ý- cCë#¢õ°œ¤ÖA´þ0"ZËyÍÇŸ9ÿ÷ÎOZ[ÿ-¯Óú€Y´þ–óš_|ñÅ~ ­ªCë—ýiý 6ZËÙ:foK®D½Cë¿÷æÍ›Œè|†èeí[ÿ໵D³ÙGáXÿ§§§ÇåËËKl9—3è=¥YζÆýüçëáùXÿí¦¼è|†èem­ìÝZ¢?€Ù(Ïð£‰ãÊÈ~Iýýlrô/8°Ø+áÇÛþ'ý ¬­õßÛW6D³QžágkÐå~}?Å_ÙGäóÄs1œ'v¯Ôè¾cl°Ï÷ªq†cý žý±þÛD¢?€™%µþÊèY½Âw0 ÇÖââ;y«“ï®yóúÀˆ8Àå$µþ©Wö’ö4-~lßCØKÉ84(5ús^gø°œÔcýïDÿýúè»×ýè^ò6]3€m"­?ŒˆÖÀròZÿ`ÈÖ·þÁ‰—Ýüá^‡›„{é—,ß%öXhý`D´þ–“q†Ÿ¤ÃfJM<ÏP0ús¬?,ˆÖÀrR[ýuåÁ/?Œ+Üëfô—y9lWù ?´þP­?€å<¯¿’~uµFë#¢õ°œŒÖ?†èOë¡õ°}ëï>> æàr†â”kl00Z­?€å([hý`D´þ–£lý! õ€ÑúX­ÿ}´þ0"ZË¡õ¿ÖFDë`9´þ÷ÑúÀˆhý,‡Öÿ>Z­?€åÐúßGë#¢õ°Zÿûhý`D´þ–Cë­?ŒˆÖÀräÖÿùùùqùöíÛ~4͇~ÖÆBë`9Bëïs¿#úÇ£?­?Œ‚ÖÀrbóïÿûžÃ­? „ÖÀr‚óãzïqŠÖFAë`9çŽÙÿäòÎ¥ÿM–mýyŠ£õ°–CÇ\vá¿¡_ýuñÅTo„e[Þ‡€Jhý,äÜ1—â»êG°®±ð"j°Tëoá} .¹ä’˹/ƒ·‰þf³uÌÛ1åe/·`]iùÆGx¿õ/ûtÛd-ß­%ú˜šïß¿¯´|¬ë-ÿ¾ª#,Òú—bÿ}5~·–è`6 Ù{“ËnýG|—ƒK.¹ä²Áe³wk‰þ€ºxdÍÞ­%úêâ}è‹è¬…è,áÿ«æ>¿ endstream endobj 11 0 obj <>stream 2014-03-12T23:50:42+01:00 2014-03-12T23:50:42+01:00 pnmtops blah-000.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000382 00000 n 0000023786 00000 n 0000000323 00000 n 0000000168 00000 n 0000000015 00000 n 0000000150 00000 n 0000000447 00000 n 0000000547 00000 n 0000000488 00000 n 0000000517 00000 n 0000022301 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<1E0CCD4B68E68FB2BD58AC5EC770B472><1E0CCD4B68E68FB2BD58AC5EC770B472>] >> startxref 23968 %%EOF geomview-1.9.5/doc/figs/main.pdf0000644000175000017500000002277012310162303013404 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hi`ªg64±°P0×3´´´4U0Ó3#ˆZ —|®@ P?qendstream endobj 6 0 obj 66 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 6911>>stream xœí;²å4׆õ ¥ÓŽšPEG$=†ÑI''`ôH:‚*F@)Sùw¡¿.KKW/y?OÕqùȲ.¶üîW²lÿÏØæ¿¿ÿþ{FÒüñÇï¿ÿþéÓ§‰€ü>ï2ÈÈ?þøŸN=þÿöÛo."u®ÀðôY²diayØ‘á){éøO§‚ £8W`lÊ`³™q™?Òÿå—_^ù©y<*€Hܘy—ù#åï¾û.á§ü–,Y²¼jHUÚOY((K–,ŸséUèl›²~ê±a¸…(Û¦¬Ÿzl˜4Y ÇÛ·o“¶)ë§FMVðÙ_~ë”%K–ç¥û·oeíÚ<+—޲Ÿú£{ÿwî÷˜dàµùû éGgåñ²Uá§,TÆ2P\Ü¿ó§Îéè¸?þ|NçqZç§’Ðs®êQ™Åø2,Î=wŽÅU Çv 7«Î:¯Í8µ@ògDs"‚h›ù©£Ùù:\"ç’ØQÉþòÜìØ¯Îµg|%³ý”R§Ü×£½™ŸJ6”çi=g‚ZOº¯:¶3ªƒN)±ã§Üë®ß~JÓJr&?~$¬¸ü/p¼K.ýs„Üz3Å‚iª/'˜‹£L¼xlsûÛd ÉŒ†TGn BQ…Š e0 ~Jª€¾ÜÅúuµK¡©%7%×/Ñ©¸.ÊÜ×[e:.ÒˆsÕr%﬎¾TB A97âž~J?zï9g¬×láÊtyƒ#„kÖ5ûjò]é§ôÕ/¦æ¹ðØÊUÓWG>zÍb¤/ÒvÈ×fÑžŸÓqFü”2× r­f[d,—r“j3ÅßÏ8NÎMÄI¦£9ÅËFNöÂc«OS(X›NUe]´x7)'^›ÇU¬©¯!?U¥SGÞ~Êe. a¯±Ú$äÄ9/sñõ4›)}‚šDš)e²mÓom3Sú¬7¢è§”:eËO³ xäÝï§4M§S§Ü×cÚ 7>»*M}èÔìc«—˜Q:Õ#‘E锳ÞŸ:ÿ»‡ŸJ]¦ÁO¹T‹wê £a=¨WÃϬòG¸ ½HU`ñ±ÕÿH$Ë\ýÎê´mº‡HyŠ×fð3,¤ãŒø©6zæOyŽÎTrSn—s`­Ö$C„v¹NÉÅK¦|Äœ}lå4«¬œ¦:ÅMšÃ(þ6:uÏû}+Pä6r`æOIA¤€Ÿ*T@‘Z~Jª\Î?¥ß?i¦ú)R­ðS`¶ŸjN§ÅOù\5Ÿ²–Ÿþåòí°dÉ2XŽº6ÉëOGòSŸÿ;þÝ×/gù Ÿ¿N(ïä(˜bàµ9*)ÉO}øð!Ȳj `ÞOùޤçÕø”ÇkØcå§Ÿ~Z]@xnÞ¼ysø©#ðíÛ·¯têÜÃD§`%///?ÿüóùË¡>ü•N®ÜW?õ×_]Rbx*~ýõ×ÇÒë”ö~ßá§Ð)XÀY§œrþ”ÃOÀBðS`üX?ÖÁO€uðS`üX?ÖYá§~øá‡8ðË—/ðÇÒGð+cÉ囌9£$“êµ’ãZ®ˆ|œ«Î NÙ-Yá§rç~N)“K2¤H6úþ¬½B‰ÿšB(›¦Øçc…NÙd‘ŸÒ7”4èÔØ"í®S3ŽÉ êØÄœŸ:wÖ†_iÁÖ#— $£:;šdã@Md9|Hù…£×_B9r[QsÂ*·® Ŧ8¶…€’+ýT²·å^7 yWZ2£Iý¾bvÊÈúõQåw©S0ª„ÉmåÔèÔÔ³SYä§‚œ(M­óbËå+d4O§rÙ¹¨¡Ë&‡'é¬EPHåiª*aOsÆ\ٺ佔á0‹~êÌÔž‹\’:åòý¾d"Aúktê\N}u4% BÐ)Èak|jìYßB§ŽWRâa,vRkW:¾ ÓféA§lbÎO=§Ni"+u*¾P; ß\B9=æü”»é8zÕ’+›~}ˆN¹×樿TA “ÚŠ*h‡æÀVtj=¶ü”ûÚ&~üˆ‹„gÀ¦NôSwuþÌ¡Sð ØÔ)7ÐO¡S3H~¨î–Ÿ¥;jzËÚíBN§’š=sŸ¡Õž?ÕËU:Uü”æÍ®g›:ÕVªþÎ^u4lê”ÃO¹D§r }÷¯. ÜC§F} |/ÊŸZÇz:·õÜÏ”†P{œ“ñçÂóÛï§ÎõM†»T¥ðS½\¨SBµé>îAó˜`î¤(O–…±ÈNòUЯà§zY¬SC~Kõ‰è½›ÿy "ËýPáúŒ7ɳPÎZu(ªF›^TUv`¾ct*?Ö©s‹áø©^®Ò©¶*·§†˜Åá|a÷!:U,çpj‹<Öáî5>¥Ñ©`_C~JÿÃe¹ó²‘NÉ~'© 1åÝûuJYÎdWBÖ©ÚqqtªS§äŠ\é§”£ýú›—°£NMÍÍ…bL™6êï¼£SþßE~ ªEãA£Q4/mÎbõÑ×èBJRÛÂ÷Õ)7aÝá§Š Sqdk:å¢Öü› w:šuJîMÌw,6ç%\ã§â¦ƒN4ˆÈ¿çɘ tJ(gq8I_#÷ºQ%»`¹@›Ni˨|ÇòŒÏ÷Å”ïD§Щr‘6 š¥¡ùt´%Ò³ËlêÔ:?%üŽ¡Sgô=}oNÞQÞdA§ªÆ’„¾^­™ª*:Õ~ªãóÑy JÛ™µ@qì¼*µÚ2 S=XñSA¸c|*OÑR/È6«2#0Y`9NƒGKæ²X§Š¥b|JÀ–ŸJ‚NÅ(/9akm`Õ0péߜôhîU隆6ï階êwbS§˜?UÆæû§r£ÂÂ^¹KWíÊ™LçZJ[[tÊÿ‹ŸÒbù}ž¹a}O§Óæ,Щx÷\!‘e:µjßþwrè”ÿêçzðSð~tx|k¿J¤ÜU~ʯXûѨ‚çáÑÚ/)Çû§šA§Ãû§ªA§ƒŸªX ~ªt `1ø©jÐ)€Å৪A§ƒŸªX ~ªt `1ø©jÐ)€Å৪A§3ÑO}üøqaEVƒN,c–Ÿº·H9t `!SüÀ@¦ø)€à§À:ø)°~ ¬ƒŸëLœ?OÈÇ~·h0plBÌŸ‚a¼¼¼4ë \¾ ÍòSmí¶¦ù¼Ó`À“k ýÍîÙ@§ ¥Ná§ t :ÁOÁtÐ)è?• ù tåšÅ²NÉß»¿„ø»ßò—Àk¿>6µ5à§ ,;m6ÛÇŒëÔÀ‹|Irõ6éÓ×o½ üTtªtª t*?U yÚÎ…c«yn7G4~Žì~ŽÄ1ØhjÙQ§‚ë?è §ÒE-áü¯{}B…ÝãBj“ ºLS lKÍ-?U@þqË­+£ëÉ–jó÷­ŠuÊeÎB|Om çÜ‹áéS[ß8ñSŠgBþuÒGË]7À¸N!E‹‘»Jk[B\Y§r¹W5­b¸f/·¼qâ§ û}NüuŠÿÍ]qüóÖ­1®SÊß¡ø_ý©T¦`M§’µsW4NüT¹ßç­AŽ&dçµ)7Ö)Í©TŸr‘š;ŽõSÉjºU?U@n4n²N ᱯNUõûrivÊG2S :¥Œ3üTÙOý ŽJæ¢w×\ ±©Nµ@ߊ~JØ}H‚úõªâYÓ)üTèW¾D·Ÿ…hÉQ YÚÜþ>g^§âÀ/¯ç—¸Òå}ìuDÖÈŠ«iHµ ºTÓŠÓÃkSsKÀO-ⶨË:[€ŸšEîø A§ üÔDr¶ùÙ@§ üL‚NðS0t :Yí§&WŒÂ÷f “u~êÝ»w3*[РS48³ÈO „ï!€uðS`üX?ÖÁO€uÆû)æÂ<3ÌŸ‚NÍŸò3J'Õ,óòòÒ3}F‘`/rMhŠŸâˆç„çf “uÏ÷9a柊÷ïß÷ëmæ&÷¥ƒxÇãeøU!rÖò{þA`’Nå>pÞ±öí©ë?LðTïË_¦SSü”æjâœÿmS%tj3tJÿ):§á»2S©Õ©­u­¨Sg=Ê…_駦êÔùS?¹8U¹·%ò´\¨SÉ$Í;v‚N¹ :µÂOŸ?;ÎìGЩd„Ü.ů›ÅûÆÅãS‚Nåõqr À‰Ÿí+6°†Äwÿ˜£¬S‡ ›¬ø)ù­G"£tªøÅWe|ØB§\¾¯§o*Åõø¤=‰lÇ2šî§rz4O§ª²ëé<>-ót*gO‚Ý«®íX­r}Ì\.BŸÔE:¨h»·N"•ÛjÈO Ñ)——§žìЩìø©\;‰ Ø¢8)Müœ°¢SçøÍ:µŸrè”ìèTµþ¨ÿâJ¢öT:å2yyÉíè#à§´Ù¡S ì~¿¯SJŠzœ\A¤\½N­ðSnÄ8znSœNUv¹ø °ûü)ŸR®ëÍ—&‘íP>7cn|Ê5ݲmÖ©\²²,&‹9vŸ®o:ÿÂÛmq|*WAW#¾Öû}E ù© Æy¶çû¶¶˜Ï2rÃý”ñ6ý­óIt rlì§hs·ÏÞ~*yg$GînKqÇeäî(?- t*¸;òÂ@AÛÉ¢¯§ao?¥Ÿ‰çW4ù4iÎh[É92OÎl’ç:¹’ôèO““s­a{?¥?ÇÊ Ç蔦êÔ1Y©y>ú ·òSÁܹb³K†)!.šîpnß¹ùÉÖ)§i³Oz ót*–§†­Ü.Ǻ¦ÁØްÀ}üTqp§ÁO)Ÿcp‘®ÉÅФIKuÓtJóJ°5Iîw®¶ÁЊÜÇO èCœØ\šT1Sš©À Òÿxk’!'7Èç¼'¹•Ÿš¡SÁV¦ÈwŽÐ)=;êTG¯SçÝ9ûø© ?¥‰“sõ¹LÑ)I:GKhºn?• ×4T‡T½?5^§ªŠN ,ž?¥!ÂÒdýl,{OÞ ?å.GÏù©ä.Œ£ë¹P§4¦¦yªZ–½'Ï-˜?uîÞ7û)—jmG²qaâKéö³Ëôi¦ƒóÑ“ûÉDr †ñ) ËÞ“·z>ºæRGŒÃó}àÙø}žµý¾tÊ8èx¶÷S~“ÜG‹Á`o:ž½ýTmma/Ð)ðìí§:*€Ngo?¥ì¾ÅýAaGå UíØÖ¼±°†¹]0r¿OžÅ(çööS 7õŠ·ÿ÷Ò©{Ïf0òþ)têr¶÷Sè:% èT 2òôº†Ùê0[ù)yžçG£SÉŽa.}yj_C|—é[ã ¥É÷ÅÎû§’Ïl®½!sUÜÇOi†iouL¦sÕz±T7núvÞ?œ‘ä)Hž#tj÷ñSE RZ÷\:‹ÃJu¿¦oê½.ÅõdÊèÔnå§ÒE-У Gt*Çv:ìžëZÞïLÍæ)ü”f¬*¸Ì7¡S1ÖÞ?[$WsfÑ©fîï§„6aY§”ÿ¢S2cß?Õ£Sñ²¶.ÏÌ­ü”+4ÔêT.ýyëšÜÑ)áïŸä,wŽÜÝOÓîã§Üi€ ¾ÂÏÈ-Fî?ÆéYË£‰ï22$Wá~€‘ùèÉøÉáÌÞø4-à>~*@Óh1Æáù>ðÜÇO ®;:et <Ûû)¿)¶î²;‚MÐ)ðìí§jk {Ngo?ÕQqØt <{û)M÷-yM¿à ™÷|ß!y«Î)Æ h+ÙÛO›‹<É 7+Ïež8…Å\øÜŒ|ÞÑ©Ålï§fèTq^2¬aNTwšÄbnå§äy’N¡Sá ²8ö’'FTíD{Z®Õ)5¿¢™µÛÜ$ É}ü”üÜɧG§ÑG–7='ót*”Ûç 4 B’ûø©†‡`üT2r.Yaì#ÞS˜[2ï} Ås$o­ ¯jäV~jN%ï ieNîÚ¨ºët{ì¼JØ+Øš~JŠou¥ŸbM£Š—LÿiÙB§Šgêç¶~ꆨҩdøp“ŸË‹¶p­N[Wr/y_tª[ù)×=ޤ“K6^×ôûä…hO‹ùSÊfປ$¹Ÿr¯ ‚:]ÏE­çžTCa=Y6Mú¹BÞSóуS£?³UM’ÜÇOÕ‚Ó¶Ï÷çV~ª tÊ>èx¶÷S~S•â´íëA§À³·Ÿª­-ì:ž½ýTGÅaÐ)ðà§À.Suª8@©ŸaçòÓ'QœÀU›ZbmH?v™§Sš1ÊZ¦_ g¸N­,|ø)°ËTЧôè”°ûÆ&¾¸ð à§À.ëuª8™3§nÅÇnŽpÍ“^I»—,C°¢ß±§ðÂdýIà§À.óæ£ ÄõÇœ‘ŸÐÊ%•Ô©ª2hžÍš]øæ ?vY¯SÊGÿŠãèB|9ÙÚ2è#Œ-|®À“ÀO]Ö¼wxÔ¥._ÏÊd¯Ò©Ú ©Í?v™÷>πᗺfw³:¥ßý~:åðSP˾~ª9Ùtê–ý>üT3\§m1yQµaÇ)œÿ­JêXä&·cQ§&>×7œ~ ì²X§ÜiDùKý¼„ $¾ò…ð/§ ‚‰Ë 4>c è]Nþ‚Ÿ»ð|ßp–(?vA§úÑôû샟» SCÈõ:7?vA§ÀƒŸ» SàÁO]¿ªyŒ¹gpºvßóÍ»†¼Úv¼üØeñû§ŒëTçl€MïôyðS`—Åïu¹D§zr©ÊÂOÁ.Ô©â„O½I*ðh¹9îÉ}…ēœ7kÌá,æ•+¤™ùè¯RD§žŠ«ÞëÒüÔËy]è¦å|IF8£ð%YMaäŠ\õè ~ ìr¡N垕Ӈ˗nñÁX­4ÐØ±ÜS5Å'gƒŸ»\õ¾ùÊðà§À.èxðS`t <ø)° :üØ~ ì2ûýS~¥êÕ.ò]¹!÷ì¸ñƒŸ»Ì{¾Ïe>„—c™NéÕsªœYÓJüØeÁsÈžâe¹R§”/ÆB§~ ,°æ¹™y¦üˆLîdýK¦ä§rÊšìâ¬ãcO—L|%ø)°Ëz*>Ô¢Ô)y&z®Ê÷Æä4QŸõ}V‚Ÿ»\¢SÊGgŠÚ‘LVŸ{­NU=ÿÜSÎKº„û©ÏŸ?{y:68ü|å*?u¦Y§‚¤®ÿª¼šuJSÎdœ•\ì§>|øpÞ?g.÷SqxC¿OØ+È"œ­Sšræâ¬d¥ŸúôéÓ±õÕø”Çk˜ÃOÁWÖßï¨SEáÈeQÜk¬NUí(Wa9zœ\Íîµ~êØúöíÛW:ÅøĬŸ?U5ŽǬŸ>#‡Ëy)³+ú©ÇÑzyy9"ÔŽORõJ§¸ßI.™~îi:Dî¤ÂV‰KiÑÇy¹”‚äŠ-¯ÇåÌ%þå¢/w ý¾£gwŽoå~Ì‚çûÀ³L§ó§ t <ò8z UÉMø)˜:že:åðSP :žâ¼„³åÂñS0t <ËtÊá§ t <šyžIòs‚@‡Ÿ‚© SàY¦S?µ SàQ>7óçŸ!×û)å”yØ:E›ÙšÏ͸±~Š÷<ŒÒ)ÚÌî:¥?¡×ø©¶J¾ôëÔŒRÁF,õS“êöiÖ©…Yä§üX<- :E›3+üÀXÆû)€±à§À:ø)°~ ¬3ÀOù§ufÓè§)XF‹ŸB¤`%Õ~ê±íš’ÀSá§ÎùXLÙOyÁbÉ’%Ëk—Y?5VÙ|úôix²`‡©—yÖO Ìà±|T`Fâ`¯Snކ„~ê¸Ó7vyT`Rú,Y²¼vé¾Ú‘ÇrFúÿù)ŸÍ Ž LJ.gêeþÿ:`™ÿ‚C„ endstream endobj 11 0 obj <>stream 2014-03-12T23:50:43+01:00 2014-03-12T23:50:43+01:00 pnmtops blah-000.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000383 00000 n 0000009145 00000 n 0000000324 00000 n 0000000169 00000 n 0000000015 00000 n 0000000151 00000 n 0000000448 00000 n 0000000548 00000 n 0000000489 00000 n 0000000518 00000 n 0000007660 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<0CE8C2AFB85C026FF823C5A07DB68003><0CE8C2AFB85C026FF823C5A07DB68003>] >> startxref 9327 %%EOF geomview-1.9.5/doc/figs/save.pdf0000644000175000017500000002122712310162303013412 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hna g6232Õ3S°Ô3300T0×3´´´°€(¶PpÉç B_£¬endstream endobj 6 0 obj 68 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 6057>>stream xœí;’Ü8E1˜=ŒÛVËì(BcÑ鈱kå”SÆìa´9´Zµ™’Õë™äÀÃÿCðdÞ›Re&Á$ožAüøqëâïXò7¦@n£·Ç#¦/‹ç?þ>>– DÒñpL#©B,ž¯/BZ6ЃÛkÁ4fÙÇ·•óØo°¼PqË>>ïœ|ƃ㱚.9ïÌs<„XðVœ¿0ýðžZÞŠóoÑ"#ÔB¿íx+ÎCEFñG©3/çþ“-Ê-! ¯ÎK6­ë—až ¿.Ë¿åq¾o€êe߯“ËãŒLY¿ŒjÑú¦žó—ÅäÜðüáW=ç›Ûð¼ó5s©åüEç+K&ó•| Ûû§çÚÙÍæ¯Êóõ<…Zqn_Œ~õ~›ê_eþþtù¼vÆürþb:öòÕÿmn¦ïå—õ_ˆgÊ[ˆ3/æ¼sËóåÛñåZ/†×$‹y&Î ÏK9··ûÕâüEeå:+yy¶œ|å|ùS˹ãºÍ9-¤è"‹´ÿ¹|'Îzór‹Îµ«éyóÉJŠœåsHб|mçÎÙ•äÜ\Î[(Á¹å:8o çžå.ç?ü.ÞÞºwQôræñeø—kο.ý.>¾=.9½úX %hÎÿ\WCÿý½vÙý¶õ…þñ!þÓ9ž'Ðô÷ÒuEü¶z¾ä?ðütMK¢Ýó%cççk²Ê-àü|MVùœŸ/pÎ/pÎ/pÎ/pÎ/pÎ/pÎ/pÎ/pÎ/pί8çÓö4O³xüƒÚ(ι4zó¶·Q‚󙾄çmTÀù#£™·ìfyz¼ÅWP§<ÎuÞ²8-ÿCuJp¾þ©ç‹ÕÈg©œóEðüˆJË-d T©bÎáùas.Ï¡ð¼Z%œï†ïeÅÁÞD¨oáêùÎùÎùÎùÎùÎùåü¯naÝNÿ&¯£œÃóVzýEÞ$8ÿ·ýa¨F¿ Óó(çð¼‰lÏÁùùçüçüçüçüªâ<ÜD!;äi_1¸þá¦iÈö”*ÎÏóÜühÏ·ÇÁÍ4V ç‘c(ËÓ‚m|¶ æb¸þN5œËNDÓ¼ÑÖunÚºìÒ®ur™ZA®-äïA}hM3:äyÒ­Îz“¹9!»Úÿ7â|÷\˜ }äû¿ggÅŒ Yë[‹,Ïo’Ÿ“£Ùû)êcóõ©3úÖY W花 ‘47ÉNPœ^è®iÏמvÏ4ýšìÇûY3›žÞ”êçBè.EIÏU~á[‘¤¯­JŠsõòJž§97 ÆaËßv0K°3`žáM™žïçÍQ-¯à\ÓMŠ)æ"_ýCpOv±s¨?®gç-úç24浜«B é:·-2òµ¾Y×Ñý§IYpÖ¦ Yþ —ÏÍ"æ•öb/†5¯RçÖ+zǽ”XxË3's.ïÆ² }¸ºPÎ/ÔŸó œó œó œó«ˆóWîèîª|Îay+es"ô?ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8çWÆüç²_hÞö˜»¦\q†öŒù'î è,f÷Üè} å̯9˜îÇIèK®²æ•êɰ¬íÙÝêQ{º 眻®VÖ<¢“:å?¥ÅÑ;ÙkÁ¹ëjq.—èÌ“Œ’pŸ9PsDZíºZ%œË,…Ìîõ|_¥CÞºëjUqn¤ø9ß×:ýÈ-Ï9w]­Ür‹×s=63à9{~ιëj”ÏÕ›Ð9ÔZ…sh@ס“be ­ÒÅGwhÊŠ^¡¾…_¨Wä8ç8ç8çW„ó!f(^×üå.Ú4D„>E£Žq>­ó)ÿå.Ú4B„>Å£ŽsÞ}×6öé/ñiyóåûúWPÏ»GèS"ê8ç݈FÿE¼oO—òÜõ…8¿“çqÎ'f#úGÔòÙŒp<%¢NrÏË•ö¼!çsÓoÈð| Z½ ꆊ\=EL"ê¶œwòÜlFq^Û:½¢7íy;ÎÛZnx¾Ç¬_éöÜuN¹EM~6{æ'›åôeSoÏi¿}Ê5Ú7Dдs«×Óž§87Û…œøX<ïré«??Ÿes‰9ƒ ͻّQçäç³Aó¼w&ڟ픆¢ž«à=žoÇaÌŽiùª›uÝ´”ˆ:'?x¾}|_tæVYQ*PV$msÆÌ»v7WNÏQä\½<ÙscN“$ç‚ö!3p²sîúçºòúhn¹ßówO~îñ’æ3xþ^˜ŸÏ"·ÐIW%æ-7<ÿ%cJxnŸ'}SÕóyî:§^ÑôUY«:\ôöœ–\R¬ÌÏ­þÂx~…ú–¸ç£é(çð¼\àœ_ ò󎺫çWh'º›ç༵À9¿À9¿X9o~¥‘íyxÏ꺟Ž{¡­¢y]:+çÃzn]zÚ/ÇÍÉyû êFžGŒíãyº^QˆìI6V‘çÖ¨:©VÔ5.ò0Æäܺ–oמnÜ¥n&:ùc@Î…Qå<é ÷g;¥­Š<Ÿ­gÙ *fÏ*:›Ρév¿çkô=Šç{`ž¼ÅŒÙøcÔ9b@ÏI¡Äh½°cîèy-ç*þo$™ã¹“§ÐÂ7ÍDò<ÅyÑ${_äyè*T\ô:0ç“°|uN>½=÷•ͲâzœVë\ßs(ê[Z õŠüçü:Ú_±¯.îyežº¶çµýûꮞƒóÖçübå\]o(ûšH¨-‚ö6×½Ïu,ª®ë´á-¬œËãdö\íÕ¨ÞÒVc­õÎ'ç²jƒ›s³~\î›Ô¤L£yžWß’Ý6'k!…˜‡ñ|¯üTË»{žU¯˜Ý6'kÂèÏùxô9y‹Qƒo`0žçGê϶¹ÆU¤çÐÙ|åzNÂ,­^õü<àù÷4[+ð{îrN+Í·W¦çWæ\ÛómáÌï¹á¥* šµç3=†ótçÊs§m® ç¦ç&çêFñ<«‹/oñµÍÉ#æ?‡Z¿½ýyRås]ZÀó¼~\Žçþ¶¹ýP{•·ÅäÁ¼5ÏE÷¸m.Ô·ð뮞ƒóÖçüçüçüçüçüêÐNÔb¥]wm›ã7×ÞóÝÝ µÍ]~Üœ§ŽKWµ¨:®¡±ÈZA´¹Òö\8˜çì¶9zrm'†öPÚ6G ²¾²­ó=79WG`{~Žõoñå-¾¶9Z¼™=÷zÏ¡'yNy Gàðr’Zõãr<´Í©ahÆ[+?7·ô|[<~Ûê[Z õŠüçüçüçüçüçüçübn'ʹ³։]¶ñüü+OSÌí¡ã{Îà>ó¸¹:σjæyÞî‰yÜÜž*«ó¬•Å^_=©Vz]‡ã/(Ïó=¡*ÕèÁs«Âvß—?oÃó¶ãæ¬Æ wåöž«–ògßÙêÍÑ·…FÍ4nŽxnc/DÒsÇü6 kŸòèLÏ/“Ÿ—Îi©~âúti5ƱžCouÏ›Ž›sþØeE²°¨¬¹Oî£Ü˜SV$†ë.-çª[}‹?³(Tb7Ô·šDKÏÑ_ÖóS8oT¾«çW¨?¿›çW¨?¿›ç༵À9¿À9¿l'*P–çÆ>ÝK+]Û¢®ÿOÖ€í¡*öÜs%6¢çW7w7Ï›Ž›#5'Þ ”¶ÑKÏ÷ö@Y“"ÍöM¡Ôzúé q›3šçW'åyNÛ±œÖ[šëµŠ¯*êÆÍÑŸ0˵?­·÷9QÏzû&ñUEÝ|Ü\wÏõ.' ÊóÖãæúzN-7jχò¼õ¸¹–ÇTì9Ù!‰g8Ï›ßo®×9”šHOöVóßçÐÖ÷›ëWVÂèÔ±5ÙÍÚóqÊŠOZßrN¶² õŠuõœ·8ç8ç8ç8ç8çW‡v¢†Ww5žG $vb¼ôRy­ÊßÚ²Ö×suu](æqs¢mÁ÷®žŸ1n®Õð´<ÏÍ Zå3ÓœaÚg0¢}¥­÷²qOÈ!vUÇÁ=nÎüŽª´mΣ>R{üAà¿ GÛ…s­?µÍµ:–´ûÛõåö©Å Üÿì¬Ù)?x¾¦…Úæ8󖣞ëñ¬9çÆQÒ¡Îƹ¬ž·7çC½jÚæynüéÇyqÛÜ@çPÃó¼s¨õñœ—·Í±çç±²"ÝX^YÑúx§ü¼£P߯»z~sΧý¹ÍC–À9¿žžóçüçüçübn'ªŠ1ÜÖ´Í¢´(r4ñF;æöКU#—{-=/"üÄê¨ãæžÛóÆãæ‚©jjjÉI­ªžiØ67ÑuBýµuÔBOÈIVÊk´ã7N•;ÔUe¤öç¹ms³S·h¯cŽpWʬpä7H¥Ç%DSÏgåi²þ\ º¶ÜX…Ä%ŒA0™ëüãæ©zf=i–ç¯tá¡v"–ïDÊs½R¡ç¨O¹ßœ7•½0~%ž¿Gï •ôœŒ¥ÂÝk˜sAŠ=7£>å~s¾TûØ ó–ý·©_‘­< ê¹›õYq¹™J½ç¨O7çOµ]RGN´Õžg¶Íé=¦Î¡¾'{»‡nΛJö¨§–ÜZÇr<ßNBê…áyfÛœÌÏåm’ÃeE×ÙnŽçþ¨/Sßó|4¥=¿H½â#jù¬’ˆÐ§DÔlœ×5‘5ðE£Žq¤çÐIçüçüŠ–[P´08D„>Å‹°Ñòy½þХޡOñ¨ãœ«½/â{Å®¿T|FˆïdgÆ¥„«ÃZª xUAÔqÎ?©PÞ?>SÕ!¼Z>ö]n!ÏóÚ-Õ{^uçËÆÞEçñ}û´¶©,úž±…ÃZª X’u’óeS¿Ì~Ùªöü—ø]¬ñçx~$BKÇ<Ï:Áùv<‚ßs±ÅŸöüX„–ŽzžuœóWYMÐÁóµTòšòü`„–Ž{žu‚óŸb+kvð|)~Js~,BKÇ=ω:™ŸoÇÄîù{^~~$BKG=Ï‹:£Üòs}Ãêù»Üa^¹¥>BKÇ<Ï:«|þSÔzþž^Éѧ/ïB—»óÊçµZª xUAԙס?ë<¯:‚Gôäê2÷:´.BKu¯*ˆ:Yné­t¹eDÕs>ÂÅ=!BŸª9‡NÚ‰øÎùÎùÎùÎùÎùÎùÎùÎùáü÷ŽaÝPº> Â9äŠ ‰rÏ›Éôœsœó œó œó œó œó œó«9ç×½be£ª9ç—õüm¾€8¿f.Ä8Gà œÃó‚]sþ]sþ]õá<6«râ“­&ÍZôDœo“]Ö¹~Ïù9Ÿô„¿ÅªôÜ,ÍÊhŸ‡s:­ðMi/'T%©öMùJ7˜çË- Ïí·ÏŠ.ç“0óñês¨1 ±»ç=¯C­9ÜÝü|Ö·®9TVôë‰8FOÅù çüçüçüº6çõBôÕ…9¿ªåæJ ý¸øÎùÎùÎùÎùÎùÎùÕóQš ©îœ_ÛóÄÝ*ü€ó!ïÍ—§:[àüÉ=çeçüçüçüçü…óýní¹=}öhß«cé–;šFá¼Ðš§÷¼ çõžOºoœgƒ7õ¼)çt°JØ/ÀÖ1‘v7§Ÿ•ÝÓhœÓζF½žÛŸÕãŠÆÒ0œ¯­®âéLÏ#ÝÍGÒpœ—y® W]ÊŸÄó–ù9< œÑpœ[ÃQ’Âyh(Ëhs:X¥Ôsç³7.+¢¾¥L£p~ €Ë œó œó œó œó œó œó œó œó벜z#ç,]“óK[~MΟPÝ9Bs~s~s~s~s~s~es~Ù©pFTç°¼¥²8‡NR„sè$s~s~s~s~s~s~s~s~s~s~s~s~¥8·îäS5àH«‘çܹ£­ënÍ]±ž\qιUüžCEJp® ¥w)ê¶µb»…­5È€i‡R"?—ùJøöµž™@F½<’’å–ýÖÌz¾5¦?0VFù|CwÑιz¹¦ÂóRå”ÏÉDæKùÏ‹”Yn yœe +³|ž…çIå^‡†ÊŠBù.rfê[zõŠüçüçüçüçüçüŠr~í{7 %:©D”sxÞJƽ»œ_xΑd‡KpÏ›ÈöœŸ/pÎ/pÎ/pÎ/pί*Îíe¤5–^¯1›Kª8?Ïsó£Oâyç‘#)ê¯hõp6}SË«8§ ûúfYêîkò¤ZIçýýìt¨£·LØÒö͉PºÑ)OÝ0j¢Iò[¸·j%çV× Ú!À×wÎí1Z1cCY=®äyçêh6ØÍŧ™&Û=ëÜ…FþOWŒmˆ¤¹IvÊ€ªàÜðÂêRõ|ígðÜHÓ¯É~¼Ÿ5³9¹ Ýø€:ƹVס(žbvjÃtšñÚú¡¤8W/¯äyšsÃ`a¶üm³;æÞt‘éùöÖò Î5ÝÂ잨øê‚{²‹Cýét=;oÑ?—¡1¯å\u~¾/2ª¬¨VX×ѽ§IYpÖ¦ 5>#XVt<7‹˜Wòü„úûØ‹½8bވƟ[¯èÛRbÃÑÁ1Cg:™sù{7–•¸àÛ@ɧç#ߨIºuý¹3 u ݹþ\^%fú­9Twæ|Ts~q~í›Ú ¤|Îay+es"ô?ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç—Ãù?{GtýÏæü¿½#º¿þ…üœ]ÈÏù…r ¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿28ÿ=k¿Ò«ÑM"Éà<ûï'?ºI$YœgBsú¯›D’Åù-ŽtœHÀ9$àœ?pÎ 8礜s5‡ùÞ~Sí‘lsü‰È¬glžïû·çl‹GRʹž …LDÙ~SIÏ9þlîyçšnwÒ1nÏ…ÈsQ*’BΣˆuáܘäXÎ-Û‰s{ʼ@$…œ›‡kÖ/o1&BfŒÄôÜ™’9ÉΩÊxÏ¡Î<¹ä‡Ççùþ^ÿì9TÛs>DÞ¢&·Ô³fvã\ÍoºEŠäP~ÞùjqNR:{ž(?+·ŒRV¼šç‡Êç}®‰ÂçоžgŸC]‡RÓûx.'9soÎóËŠ¨oáŽDsþççϨWäˆdáüáôƒó?ï>ƒs†Hœ<žÖ¼Eˆ7pÎÉô÷úôÛêùäç‘,ù¹ØÏ åô#½E$9œgoþô#½G$è—Ë/ôËå8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç—Ãù·Þ=,ÎßzÇó29ÿãÂyPo±TÈ£¸eŠóØ¢_ äèCÄ-Û9ÿø|<6ðNÅÃ÷x‹:ºrþýÚž·¤à”°ìÁ9Ä­ÿ†—jÇ endstream endobj 11 0 obj <>stream 2014-03-12T23:50:43+01:00 2014-03-12T23:50:43+01:00 pnmtops noname.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000385 00000 n 0000008282 00000 n 0000000326 00000 n 0000000171 00000 n 0000000015 00000 n 0000000153 00000 n 0000000450 00000 n 0000000550 00000 n 0000000491 00000 n 0000000520 00000 n 0000006799 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<63C834810EDBA0F22F9867EAC4131EA6><63C834810EDBA0F22F9867EAC4131EA6>] >> startxref 8462 %%EOF geomview-1.9.5/doc/figs/trefdodecinter.pdf0000644000175000017500000002117712310162303015461 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`ddl¦g6265R0Ô3300T0Ö³3ˆR —|®@ ?ˆ=endstream endobj 6 0 obj 65 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 6036>>stream xœí½‹$Iz‡cýEP2e®¹Æ:m-,²úXKpά%DîyÜ:+³áœ“)£1åL;rNÐhÌAc ÁîÉZóÎìÿ`¥ŠüŒï¬ˆ7"~ùþŠîªÊ¬ÊÌzŸz"¿¢ª>°|"~ þðüH´ œ´Äˆ|xH?|é½<‹ëãùB}‰y~{Ez½öC¿¾'c9ô yþz¶48&ÚW"DVKŸ¿æ ÂE’\-m½,|)q‘kÐÝÒªvƒS- ÉÕÒ·Á}Îù|!¹YêÛ—á}˜Î.âK‘Ï-KÝÛQ¼ÅÛ(Þ}ÙÐZ–fM™S5ÏÂçÒLDßöy#f+S,uNùa™HnÄ›‡}ì‘Óßv'u’‰G‹Ï¥…ȃúågqÜÒ¡?#ÁçDŠÀ4j©†T¾Þã–Îå:P´é)Þçi#nE€4ÏÒëë=n©Z­¥žÚÓ7ba­ S›hè~oÂvÿ:B›âòôím¥<ðAù`Jh©R¬½ˆsµ´Â eÈöD©û/4PH—?0¤¥,5!½±¦lÖÊ(¼FJ{ÆJaž®©™~­MI‹61c–`H—Œ­Ñ´¥œœÄ,5 ²¥$b©c¸méwÏÏÇÇæ}Oy¹’óŒñÙ-}óüµdûæÙýnùÚ3œS9ÞÂûFHK%ÙOÄ7Óøïøù郄ývþ0âõöÿµ^ Îyš»b>!•¾2ÒÑóô“ìu=#•ÛIléðy2¶xÙÒáódì—²¥Ã‡-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKáRÏÒ§R:I^•šP=KŸÊ-ä R°Z-}õÄLSS²X-}%˜ibŠÖª¦¥‚™¦¥l©ªZÊL“R¸Ru-e¦ )]¨Ê–2ÓhŠ×©¶¥Ì4’òeªni¦Ûü8ÚQ¡Jõ-%cê™K×\k‰ÀÒÊLS¦Ý+Ö*5¢°´ÓìIöǵN‰H,-Ïôþrìy]a­T!K #½‰Îé…k5¤$––dzý» ©LXkˆÈÒr‹,úˆÞí7?F'ty]dy§R}êž/åädKÍ…¼ý}x¿\o’Þy¨Ä£ë2‰f¦šÅ(z ¼ÞºÔZì›–ú~»uIA©Åäº7ܘڥd]Zé½ãVfv®Úª¸TGa†X—:Îë]î@—|tl[‘Cu•eK 1-tÊÏÖb¦Î¢Œbi ¦…Ê´…ê.É0–ÞÌôÞyóæ4„ê)È8–ÞÆ´PÑ©¯YêÚKÌ¿î7 •±¡þªüLìøÞà#YjíF'.|=C×XP D5ì*=0F²Ô¸¸ðwÛ¾F% ¢Iëë­ÄX–Š ·î>Ö*CõÆ7zÒ,ˆÎÄdvÉX‰Ö*CÜúzë0œ¥™§îæc<õÊBõ–aÎ2¼¥æè QPµÐec15ætkähèø–êãCDIŠ8Sq k윀¥êD©Š$¦2y\£g,ÝoLŸCs>ºÐÀ&’d¬ñóÿ–®;ÞYD«˜¦ôíİt¾C”¨(Î4©{$ˆ¥ÓïŠÔ"JTä0M@šÖ·ÆÒÀ¦‘I”¨p0=®ibßNK%ÒþˆdšÚ·ÇÒD¢Ä@Eò®Œˆ0MîÛ‰cé] Qz "ƒiizßNKïÄ·®³ÙÑ&@…Íôòwžú™fô턱ôŠÔq:» ¢Ó‹>¤^¦9};Q,•Dí. *Ñv@…ÊtþÐU¦¦Y};Q,‘L¢MŠéò¹H¯¥n¦y};A,]ˆêH;":ïʬ ä'êbšÛ·ÄÒ©Ê´›VwÊ{GÐQ©·Ë+¶¥Q•iO’^óg±®NƒHM¦ùä0,UnL;#:1†‰ ñíž—¶¥*Ñ•i_Íîœ?K¦1¢º¦~>Ø–:öHôÊôcœ¨Î´1ÒV–êD'¦}•LªLOj©‰T¼trÐèhúAÚÈR‹hây޳3=§¥a¤#U˜žÒR@IûAÚÆRDIw¦g´“èÆôŒ–2ÒäÙic)*Ñ•éù,½!¤#]˜žÏR\Iû@Joé€%™žÎÒ? ˜žÐR?Òñ‰J¦ç³ZÒ’[Ú8B zez6KïЉ ñ—³YÊHsFd§…¥?èwñˆ>&ƒié[¡wÆÞâÍú˜LdDvè-½J*³Ce¤ÁÙ¡·tAº1…$šõѧðˆì4³T¬PW¤XD}L¡-•y•T~œæ;ÇPpK…dŠ*©‡)¼¥B¼[®ñˆº™"ZªGj3E´Ô‘¨“éi,Å$êbzK‘¾Ö¿Vý,–¢u0´ôNؼ¸Dm¦€–žKÒFH‰-µ‘"µ˜žÂRl¢’ékå”ð),ÅGªjzKщLñ,56xÅ;|¢SÓK‹”ÔRSÒ3Õ˜ZzR¤SxKÿ¦ÔÌ:Ï´HZz¢ S8K­£H¿ÿÓ`®[Ó g©Ž´ Qш)!RRKýb¹nuaŠgi[¤_l·è™.gÃá,><±„œèÚ=r¨³¦p–*HmÅÙRb¤&Pb¨SÓ liD0}ýÏÒuû¨ ¢ ˜~‡gi¤> 2¤P¯Mï_£ZÚ Qr¦FÐ=ƒ[JI4 T†ê{ñž1ƒ[Jˆ4N””é{ñäÑtlK鈦•¡ƒúþI¸™miD)™þ–)mÁ·„HÓ‰2õi:¬¥W¤TDs€ÊPAõh:®¥wÿ\jú‘ä%d féÝïÿªÔ BÉ*Cõ—ß95ØÒ>%`zŒ( Ó_þ˽2ØÒ>Õ™%JÀôA€”ÜÒÚH•© •)½¥u™ÞF´2Ó_„Dêb:²¥¢*Ó[ÊÔƒ*‰^+S)ù'×®H«1-A´Ó+Q¤äߨòé¿‹_×aZ¨L¨’( ¥W¤òÃüU˜–#Z…éDtFê`:²¥wÓU¦%‰V`ºuk:²¥3RñëÂHË•) •)±¥ÛÏO”eZžha¦3QDK÷¹/xd°P™rP¢3RÓq-ÝÞ‹r‡‘j-ÇT'Z)©¥ QQŠi= 2E ®D‰RZª4»B:ŒT—h¦Q@K5IËhZ›h ¦RÓA-5ˆд>P™¡ÚD+#¥³ToveneJCôF¦¢0–š’Š™R•9u'J†”ÌRÑ›ÎÊP=ÎÔIÔÁtHK]H3¥*sª‡h]¤ä–ªD'¤G˜Ò=ÄT!Jˆ”ÊR'Ñ£š¶ z„©OR KHs™¶*“ ÕKÔ>g dé¦íˆf2õ6»•‘Yê#:#Í`Ú¨L:ÔQK½H3™¶&šÎT%J‹´µ¥ Ò4¦íÊ$AÕˆþÎvEª3ÏRçNé’tMû šÆ´!RKý’fhÚ Ñ¦:Ql© éÓ?Ìצý•‰@ÕˆR#%±4Ôî¾¾,HÃLû"aj´4$ék!¾_nú™öTÆU'JŽ”ÔÒR/Ó‰ú™Æ‰Žoi°Ý R7Ó>Ê8¡ÚD‰‘RX‘4¢i¿DÝLZD‡µ4ŽÔÁ´g¢.¦¢ÄH ,µ»"À´o 2Tƒh ¤–F%U‘êLû'j0uŵ4 ©Ât 2;T“h¤õ-MhwÝLG!º3õ…³4AR'ÒqˆnLû@ZÝÒ¤n¤Ó‘€ÊH¨>¢h–&µ»ÓшJ¦ÑFHÉ, Jj _•Z Âü·5d% fiZ»+ ¦Œôpê[z é€L3ˆ‚X#z6¤÷¶u™¯£HGoy-¤Qj¤µ-½^MP3‘Ç4“èÐ–Š‰iœ(#-K¯¹$ ši€(¤¥×Ü_쇜© ÂÒ¹áÕ±šD‡Þ@2‘†$E±t¾c Ši–¤H–®™±"# JŠféš‹MT¼þ_íî8Ló$}'^à,²#ÝÚb¤aIk#me©£Ý} HcDÅ•)¶¥ÛS ¤Ã0Í•ôŠtäo';!R…¨éüOÉ@–®Kš†tL¦ù’ÖEZÙÒ"M‘”-í;ÙGâÄ–Á´„¤À–ލi I-PÓ"’žÈÒáªD[!íÌÒñZ^?Ò ¢È–§iIÏdéÀH36ŽÎeiçL I mé`š’ÚÒ±4Í"ÃR›é„ô³ÿ0ƒ4F” i3KÝH?Âd:"Ò\¢À–^‰ZH;fZLR\K%Q¤ÙDa-ýl¾†iQ:¤ýXú"~žo ‰4‘èy,}™þc õÀ J féË6dA: Ó,¢„H›õœ‘¾hƒÆÒÔ‰4Lô;ßè, !}±ùvÉ4‹(%R"KïìG8>3TË« M%úÎKn$K—W™†t¨–×ÔËå㼆¡AZýÛɼšæ íiQJ¤D–æµ¼c" ¾ó“ÊÒ2-owL3$>ÒDˆ´þ÷ñbjš)©dú.@nDKq‘¦%DJðÝöZÞË¿Y#úbšMT¼ÈýKhzÂbÚ7Òoíã&s¶ÏÓ!%³ôV¤]15ˆ~kÙܲÚ{ꆃbivË;}GךnH%ÑùûiL ¢0–fk:ÅŠÉ´S¤ë»šDÑ,MFº|iNÇšîD¿ÝÚL-¢'µTü¼~R¿šnHÿ¤5™ÚDq,ÍcºU¦[MÝDM¤Ê÷àÐ"%ù•ácH»ÕÔƒTgê"zVKýšö†ôOæ…©“(¥XL}’z*D,ÍDº•¦o¤Q…©›èy-õ"í‚©_R±-¹‡(’¥Hš$]ÜGÉÒ\¤+ÓáN î%zfK;f&ª{²IÊÒ£L‡Cª~Õ®EÊRMcDÅÇm«×&zKÇÒ4‚ôã¾iç Šei¾¦sm.ÿ¢ì©›èÖP¸‰bYz@Ó©8ÑÓ¤[¿1'ÑÓXlzûD Ú)™¥™^DOLý’îÛ¹R7Q0K]BMo—H-¢êo„H¤¢h–ÑtŽÎ´?¤ú¾¼ø‰ÂYÒÔÇô25c½0u5ÅG¼|ãåƒf馗¹ë©ET¼öó³4ŸéԳ쥦¢ !>x–æ®N—¾‚/½"umŽ”ÖÒ¢•€ óu;Ç–™OK•‘9Ls‰zŸàësP‘¨õÂí‘…fÓÄR}\:Ôl¤Îgx¬*Páxåú¸Rsia©9*™i¤þÊU'êzéʨb3i`©£¬iPó‰šO Ô€¨ûµ/cƶÔ10‰éHCE#*@×¥ž7jÊîŒðÿ¢«/;Ò`ɨˆú5×ÒëK wÃBÍÄzQ§íËÐimšÙ4´–·ã“™Ê¤r½ˆ8P*EE £ZÞÛ΄š†õ-¢"PA-ÙLEë2©è&)Q Æ´4väzJ>Ô«k¤”î4?_ †´4z~iΦpa¤´ŠŠ@F´4~xM>Ô· Rr¢þ* hé~7¾ðÙL!¥(Ãx–*÷R>ê¤ï’zV·ÃYšÔINMÓPãê'·§Z b4K,|Ô<¤íxŠ[ßèi³ °Ô8–ºðëÃâPs6jp×­mBoÐüYÔ·ÔÚ¶KŸÆ.ןܨÕF¾S¾ô¤Qï$§¾¥·n­¯?êÇšˆ´iƒ»ÅWŽ,-±ÿµýì«kø`Â:¶qƒ»ÇSq,-¶GíÇš€´ž2î’ ciÑc$ûo4kXcH»â)ã,Ê(––?êec—ÿØOWY±´ÎqLåÕ%V©ñˆþxÊ8 3†¥õŽL«Xé“§Œ]š!,õî‚•‰Fµ_xžØ;ë#XZjB'É–Ö:y’Š'×hΗ2Q+õN®‘XÊD©vrü|)g ÎùRΚqÏ—2Q_ªÔˆÂR&êM"XÊD©r ¼¶¥L4˜§À+[ÊD#©p ¼®¥L4šò§À«ZÊDRüxMK™hRJŸ¯h)MLáSàõ,e¢É){ ¼ÞùR&šž¢§ÀëõjàädK9RÏRN£°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸ì–¾yþš-Eˆ´ôêæÕÒoä]¶tü\-}¾^Ɇ÷zõ-?O?MWŸOHy]й. RÞâ…oñÂ…÷Ká–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ËÒ·­—ˆsk K¿l½<œÛ£Yúå¾ \vKýàŸ#9 &²[ê}„x æ'Fd¶ôº½ë¿<Šðx¾P_"D¤¥ÁwÅ£çP'Bäj),ÿ)è|Ú endstream endobj 11 0 obj <>stream 2014-03-12T23:50:43+01:00 2014-03-12T23:50:43+01:00 pnmtops noname.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000382 00000 n 0000008258 00000 n 0000000323 00000 n 0000000168 00000 n 0000000015 00000 n 0000000150 00000 n 0000000447 00000 n 0000000547 00000 n 0000000488 00000 n 0000000517 00000 n 0000006775 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<20C2983F0CFBAF25A6E502131622C3D7><20C2983F0CFBAF25A6E502131622C3D7>] >> startxref 8438 %%EOF geomview-1.9.5/doc/figs/ap.eps0000644000175000017500000037717212310162276013120 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: noname.ps %%Creator: pnmtops %%CreationDate: 12. Mär 17:51 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 227 289 385 473 %%HiResBoundingBox: 227.753993 289.559944 384.245988 472.445986 %%EndComments %%BeginProlog %%BeginPreview: 156 182 8 728 % 29292929292929292929292929296229292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929292929292929292929292929292929a9292929292929292929292929292962 % 29626262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a96262626262626262626262626262a9 % 296262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9 % a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9 % a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262 % 626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a92962a9 % 296262ff292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929292929292929292929292929292929292929292929292929292929ff2962a9 % 296262ff626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262a96262626262626262626262ff2962a9 % 296262ff62626262626262626262a9296262626262626262ff626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262a96262ff62626262626262a9ff2962a9 % 296262ff62626262626262626262a92962626262626262ffff626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262a96262ff62626262626262a9ff2962a9 % 296262ff62626262626262626262a929626262626262ff62ff6262ff62ff62ff62ff62ff62ff62ff % 62ff62ffff62ff62ff62ff62ff62ff62ff62ff62ff62626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262a96262ff62626262626262a9ff2962a9 % 296262ff62626262626262626262a929626262626262ff62ff62ff6262ffff6262ff62ffffff62ff % ffffff626262ffff62ff6262ff62626262ffffff6262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a929626262ff62ff62626262a96262ff62626262626262a9ff2962a9 % 296262ff6262ffffffffffffffffa9296262626262ff6262ff62ff6262ffff6262ffff626262ff62 % 62ffff6262ff62ff62ff6262ffff62ff62ff62626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a929626262ffffff62626262a96262ff62626262626262a9ff2962a9 % 296262ff62626262626262626262a9296262626262ff6262ff62ffffff62ffffff6262ffff6262ff % 62ffff6262ffffff62ff62ff6262ff6262ffff626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262a96262ff62626262626262a9ff2962a9 % 296262ff62626262626262626262a929626262626262626262ff6262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262a96262ff62626262626262a9ff2962a9 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262a96262ffffffffffffff62a9ff2962a9 % 2929a9ff62a9626262626262626262296262a9a9a9a9a9a9a9a9a9a9a9a962626262626262626262 % 6262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262 % 62626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9 % a9a9a9a9a9a96262a9626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262ff626262 % a9a9a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62a9a9 % 2929a9a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020202020202020202020202020202020202020202020202020ff622929 % 2929a9a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020202020202020202020202020202020202020202020202020ff626262 % 2929a9a9202050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050505050505050505050505050509bff626262 % 2929a9a9202050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050505050505050505050505050509bff626262 % 2929a9a9202050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050505050505050505050505050509bff626262 % 2929a9a9202050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050505050505050505050505050509bff626262 % 2929a9a9202050505050505050505050505050ff505050505050ff50505050505050505050505050 % 50ff505050509b50505050505050509b9b9b9b9b9b20505050ff5050505050505050ffff50505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205050505050ff50505050505050505050505050505050509bff626262 % 2929a9a92020505050505050ffff50ff505050ff505050505050ff50ffff5050505050ffff505050 % ffff505050509b50505050505050509b1d1d1d1d1d20505050ff505050505050505050ff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205050505050ff505050505050ff505050ffff50505050509bff626262 % 2929a9a920205050505050505050ff50ffff50ff505050ffffff5050505050ff50ff505050ff5050 % 50ff505050509b50505050505050509b1d1d1d1d1d20505050ff50ff50ff50ff50ff50ff5050ff50 % 5050ffff5050ffff50ff50ff50ff505050ff50ff50ff50ff50505050505050505050505050505050 % 50505050505050205050505050ffffffff5050ff505050ff505050505050509bff626262 % 2929a9a92020505050505050ff50ff50505050ff505050505050ff50505050ff50ff505050505050 % 50ff505050509b50505050505050509b1d1d1d1d1d20505050ff50ffffff505050ff50ff5050ff50 % 5050ff50505050ffffff505050ff505050ff505050ffffff50505050505050505050505050505050 % 50505050505050205050505050ff5050505050ff505050ff505050505050509bff626262 % 296262a92020505050505050ffffffff505050ff505050505050ff50ffff5050ff5050ffff505050 % 5050505050509b50505050505050509b1d1d1d1d1d20505050ff50ff50ff50ff50ff50ff505050ff % 50ff5050ffff50ff50ff505050ff505050ff50ff50ff50ff50505050505050505050505050505050 % 50505050505050205050505050ff505050505050ff505050ffff50505050509bff2962a9 % 296262a9202050505050505050505050505050ff5050505050505050505050505050505050505050 % 5050505050509b50505050505050509b202020202020505050ff505050505050505050ff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050505050505050505050505050509bff2962a9 % 296262a9202050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b505050505050505050505050505050505050ff5050505050505050ffff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050505050505050505050505050509bff2962a9 % 296262a9202050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050505050505050505050505050509bff2962a9 % 296262a9202050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050505050505050505050505050509bff2962a9 % 296262a920209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a92050505050ff5050ff5050505050505050505050505050505050505050505050505050ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a920505050505050505050ffff505050ffff505050ffff5050505050505050505050505050 % 50505050ff5050ffff50ff50ff5050ff505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050ff50505050ff505050505050505050505050505050505050 % ff50505050ff505050ffff50ff505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a92050505050ff5050ff505050ff50505050ff505050505050505050505050505050505050 % 5050505050ff505050ff505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a9205050505050ffff5050ffff505050ffff50505050ff5050505050505050505050505050 % ff50505050ff50ffff5050ff50ff50ff505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff50ff50ff50 % 5050505050505050ff505050505050505050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050505050505050505050505050ffff % ff5050ffff50ffffff5050ffffff5050ff50505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050505050505050505050ff5050ff50 % 5050505050505050ff5050ff505050ff5050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050505050505050505050505050ff50 % 5050ff5050505050ff5050ff505050ff5050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff50ff50ff50 % 5050ff50ff50ff50ff5050ff505050ff50ff505050505050505050505050509bff626262 % 2929a9a9205020202020202020202020202020202020202020202020205050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050ffff505050505050505050505050509bff626262 % 2929a9a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b209bff626262 % 2929a9a9205020505050505050ff5050ffff5050ffff5050505050509b509b9b9b9b9b9b20505050 % ffff50505050ffffff505050ffffff50505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b209bff626262 % 2929a9a92050205050505050505050ff505050ff50505050505050509b509b1d1d1d1d1d20505050 % ff50505050505050ff50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 296262a9205020505050505050505050505050ff50505050505050509b509b1d1d1d1d1d20505050 % ff505050ff505050ff505050ffff5050505050ff5050505050ffff50505050505050505050505050 % 50505050505050505050505050509b9b5050505050ff5050505050505050ff505050ff50ff505050 % 505050505050505050ff5050505050505050505050505050505050505020209bff2962a9 % 296262a9205020505050505050505050505050ff50505050505050509b509b1d1d1d1d1d20505050 % ff50ff50ff505050ff505050505050ff505050ff5050505050505050ff5050505050505050505050 % 50505050505050505050505050509b9b5050505050ff50ffff5050ff5050ff5050505050505050ff % ff50ffffff50ffff50ff5050ffff50ffffffffff50505050505050505020209bff2962a9 % 296262a92050205050505050505050ff505050ff50505050505050509b509b1d1d1d1d1d20505050 % ff50ff50ff505050ff505050505050ff50ff50ff50ff50ff50ffff50ff5050505050505050505050 % 50505050505050505050505050509b9b5050505050ff50505050ff505050ff50505050505050ff50 % 5050ff505050ff5050ff5050505050ff5050505050505050505050505020209bff2962a9 % 296262a92050205050505050505050505050505050505050505050509b509b202020202020505050 % ff50505050505050ff50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b5050505050ffff5050505050ff50ff50505050505050ff50 % 5050ff50505050ff50ff50ff505050ff5050505050505050505050505020209bff2962a9 % 296262a9205020505050505050ff50505050505050ff5050505050509b5050505050505050505050 % ffff5050505050ffff50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b5050505050ffff50ff50ff50ff50ff505050ff50ff50ff50 % ff50ff505050505050ff50ff50ff50ff5050505050505050505050505020209bff2962a9 % 296262a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b5050505050505050505050505050ff505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a92050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b50ff5050505050505050505050ffff505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a9205020202020202020202020202020202020202020202020205050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9bffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 296262a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9bffffff5050ffffffffffffffffff50ffffffffffff50ffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 296262a92050205050505050505050505050505050505050505050509b5020202020202020505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9bffffffff50ffff5050ffff50ffff50ffffffffffff50ff50 % 50ff5050ffffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 296262a920502050505050505050ff5050ff505050505050505050509b502050505050509b505050 % ff505050505050505050ff505050505050505050ff50505050505050505050505050505050505050 % 50505050505050505050505050509b9bffffffff50ffffffffff50ffffff50ffffff5050ff50ffff % ff50ffffffffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 296262a9205020505050505050505050505050ffff505050505050509b502050505050509b505050 % ff50ffff5050ffff5050ff50505050505050ffffff50ffffff50ffff5050ff505050505050505050 % 50505050505050505050505050509b9bffffffff50ff50ffffffffff50ff50ffffffffffff50ff50 % ff50ffffffffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 2929a9a92050205050505050505050505050ffffff505050505050509b502050505050509b505050 % ff50ffffff50ffffff50ff505050505050505050ff505050ff50ffff5050ff505050505050505050 % 50505050505050505050505050509b9bffffffff50ffff50ff50ff50ffff50ffffffffffff50ff50 % 5050ff50ffffffffffffffffffffffffffffffffffffffffffffffffff20209bff626262 % 2929a9a920502050505050505050ff5050ffff5050505050505050509b502050505050509b505050 % ff505050ff5050505050ff505050505050505050ff505050ff505050505050ff5050505050505050 % 50505050505050505050505050509b9bffffffffffffffffffffffffffff50ffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20209bff626262 % 2929a9a92050205050505050505050ffff5050ffff505050505050509b50209b9b9b9b9b9b505050 % ff50ffffff50ffff5050ff505050ffffff50ffffff50ffffff50ffff5050ff505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050205050505050505050505050505050505050505050509b5050505050505050505050 % ff505050505050505050ff5050505050505050505050ff50ff505050505050505050505050505050 % 50505050505050505050505050509b9b50ff50ffff5050505050505050ffff505050ffff50505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b5050505050ff5050505050505050ff5050505050ff505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050ff50ff50ff50ff50ff505050ff505050ff50 % ff5050ff50ff50ff50ff505050ff50ff5050505050505050505050505020209bff626262 % 2929a9a9205020202020202020202020202020202020202020202020205050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b50505050505050ffff5050ff5050ff5050505050ff505050 % 505050ff5050505050ff5050505050ff5050505050505050505050505020209bff626262 % 2929a9a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050ff5050505050ff50ff5050505050ff505050 % 505050ff5050505050ff5050505050ff5050505050505050505050505020209bff626262 % 2929a9a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050ffffff50ff50ff50ff5050ff505050ffff50505050 % 50505050ffff50ffff5050ff505050ff5050505050505050505050505020209bff626262 % 2929a9a92050205050505050ff5050ffff5050505050ff50505050509b502020202020209b505050 % ffff50505050505050ffff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b5050505050505050505050505050ff505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920502050505050505050ff5050ff505050505050505050509b502050505050509b505050 % ff505050505050505050ff505050ff50505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050205050505050505050505050ff50ff505050505050509b502050505050509b505050 % ff50ff50ff50ff50ff50ff50505050505050ff50ff50ff5050ffff50ff50ff50ff5050ff50ff5050 % 50505050505050505050505050509b9b50ff50ffff5050505050505050ffff50505050ff505050ff % ff5050505050505050505050505050505050505050505050505050505020209bff626262 % 296262a92050205050505050505050505050ff5050505050505050509b502050505050509b505050 % ff50ff50ff505050ff50ff50505050505050ff505050ff505050ff50ff50ff50ff50505050ff5050 % 50505050505050505050505050509b9b5050505050ff50ffff5050ff5050ff50505050505050ff50 % 50505050ff505050ffff5050ffff50ffff50ffff50505050505050505020209bff2962a9 % 296262a920502050505050505050ff5050ffff5050505050505050509b502050505050509b505050 % ff50ff50ff505050ff50ff5050505050ff50ff50ff50ff505050ff50ff50ff50ff5050ff50ff5050 % 50505050505050505050505050509b9b50505050ff5050505050ff505050ff505050505050505050 % ff5050505050ff505050ff505050ff505050505050505050505050505020209bff2962a9 % 296262a92050205050505050505050505050505050505050505050509b50209b9b9b9b9b9b505050 % ff505050505050505050ff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b5050505050ffff5050505050ff50ff505050505050505050 % 50ff50505050ff505050ff505050ff505050505050505050505050505020209bff2962a9 % 296262a92050205050505050ff505050505050505050ff50505050509b5050505050505050505050 % ffff50505050505050ffff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b5050505050ffff50ff50ff50ff50ff505050ff50ff50ff50 % 50ff50505050ff50ff50ff50ff50ff505050505050505050505050505020209bff2962a9 % 296262a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b5050505050505050505050505050ff505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a92050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b50ff5050505050505050505050ffff505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a9205020202020202020202020202020202020202020202020205050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a92050205050505050ffff5050ff5050505050ff50505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a92050205050505050ff5050505050505050505050505050509b502020202020209b505050 % ffff50505050505050ff505050ffffff50ffffff5050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a92050205050505050ff50ff50505050ff50ff5050505050509b502050505050509b505050 % ff505050505050505050505050ff505050ff5050ff50505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 2929a9a92050205050505050ff50ff505050505050ff5050505050509b502050505050509b505050 % ff505050ff505050ff50505050ffff5050ffffff50505050ff505050505050ff50ff505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050205050505050ff5050ff50ff50ff50ff5050505050509b502050505050509b505050 % ff50ff50ff505050ff50505050ff505050ff5050ff505050ff50ff50505050505050ff5050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050205050505050ff5050505050505050505050505050509b502050505050509b505050 % ff50ff50ff50ff50ff50505050ff50ff50ff5050ff50ff50ff5050ff50ff50ff5050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050205050505050ffff5050505050505050ff50505050509b50209b9b9b9b9b9b505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050205050505050505050505050505050505050505050509b5050505050505050505050 % ffff50505050505050ff505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020202020202020209bff626262 % 2929a9a92050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020202020202020209bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a920505050505050505050505050505050505050505050505050509b9b9b9b9b9b9b505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a920505050505050505050505050505050505050505050505050509b1d1d1d1d1d20505050 % ff50505050ff505050ff50505050505050ff50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a920505050505050505050505050505050505050505050505050509b1d1d1d1d1d20505050 % ff50ffff505050505050505050505050505050ffff5050ffffff5050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 296262a920505050505050505050505050505050505050505050505050509b1d1d1d1d1d20505050 % ff50ffffff50ff50ff5050505050ff50ff50ffffff50ff5050505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a920505050505050505050505050505050505050505050505050509b1d1d1d1d1d20505050 % ff505050ff50505050505050505050505050ff505050ff505050505050ff50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a920505050505050505050505050505050505050505050505050509b202020202020505050 % ff50ffffff5050ff50505050505050ff505050ffff5050ffff50ff50ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502020202020209b505050ff505050505050ffff5050ffffffff50 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b5050505050505050505050ff50505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b5050505050ff50ff505050ff50505050505050 % ff50ff5050505050505050ffff5050ff50ff505050505050505050505050509bff2962a9 % 296262a9205050509b9b9b9b9b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b5050505050ffffff505050ff50505050505050 % ffffff5050505050505050ffff5050ffffff505050505050505050505050509bff2962a9 % 296262a9205050509b1d1d1d1d2050505050505050505050505050ff5050ff505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b50505050505050ff505050ff50505050505050 % 50505050ffff5050505050ffff5050505050505050505050505050505050509bff2962a9 % 296262a9205050509b1d1d1d1d20505050505050ffff5050505050ff5050ff50505050ffff5050ff % ff505050ff5050ffffff5050505050505050ffff50ffff5050ffff5050ffff50505050ff50505050 % 5050505050505050505050505050209b9b9b9b9b9b5050505050ffffff50ff50ff50505050505050 % ffff50ff505050ff50ffffffff5050ffff50505050505050505050505050509bff2962a9 % 296262a9205050509b1d1d1d1d20505050505050505050ff50ff50ff5050ffffff5050505050ff50 % 5050505050ff505050ff50505050ff5050ff505050ff5050505050ff505050ff5050ff5050505050 % 5050505050505050505050505050505050505050505050505050505050505050ff50505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050509b1d1d1d1d205050505050ff505050ff50ff50ff5050ff505050ff505050ff50 % 5050505050ff505050ff50505050505050ff505050ff5050505050ff50ff50ff50505050ff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a9205050509b2020202020505050505050ff50ff50ff5050ff5050ff50505050ff50ff50ff % ff50505050ff50ffffff5050505050ff5050ffff50ff5050505050ff50ffffff505050ff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a92050505050505050505050505050505050505050505050ff505050505050505050505050 % 50505050505050ff50ff505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502020202020202050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b505050505050505050ff5050ff5050505050ff % 50ff50505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b5050505050ffff50505050505050505050ff50 % 50505050ffff5050ff5050ffff5050ffff505050ff50ffff505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b50505050505050ff505050505050505050ff50 % 505050ff5050505050ff5050505050505050505050ff5050505050505050509bff626262 % 2929a9a92050505020202020202050505050ff50505050ffffff50505050ff505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b5050505050ff50ff505050505050505050ff50 % 505050ff5050505050ff50505050ff505050505050ff5050505050505050509bff626262 % 2929a9a92050505020505050509b505050505050505050ff50ff5050505050ff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b5050505050ff50ff50ff5050ff5050505050ff % 50ff50ff50ff505050ff50ff50ffff50ff50ffff50ff50ff505050505050509bff626262 % 2929a9a92050505020505050509b5050505050ff50ff50ff50ff505050ff505050ff50ff50ff50ff % 50ffff50ff50ff5050505050505050ff50ff50ff50ff50ff50ff5050505050505050505050505050 % 5050505050505050505050505050209b9b9b9b9b9b50505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a92050505020505050509b505050505050ffff50ff50ff5050505050ff505050ff50ffffff % 50505050ffffff5050505050505050ff505050ffffff5050ff505050505050505050505050505050 % 505050505050505050505050505050505050505050505050ff505050505050505050ff5050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a92050505020505050509b5050505050ff505050ff50ff5050505050ff505050ff505050ff % 50505050ff50505050505050505050ff505050ff5050505050ff5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a920505050209b9b9b9b9b505050505050ff50ffff50ff50505050ff50505050ff50ffffff % 50ff505050ffff50505050ffffff50ff50505050ffff5050ff505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050ff5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a920509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050505050505050ff50505050505050 % 50505050505050505050ff50505050505050505050505050505050505050509bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050ff50ff50ffff50ffff50 % 50ff50ff5050ff505050ffffffff5050ffff505050505050505050505050509bff2962a9 % 296262a920509b50505050ff50505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050ff505050505050505050505050ff5050ffff505050ff5050505050 % 5050505050505050505050505050505050505050505050505050505050505050ff50505050ff5050 % 50505050505050ff5050ff5050ff50ff5050505050505050505050505050509bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050ffff50 % ff505050505050505050505050ffffffff5050ffff505050ff5050505050ff50ffffffffff50ffff % 50505050505050505050505050505050505050505050505050505050505050ffff50505050ff5050 % 5050505050ff50ff5050ff50ff5050ff5050505050505050505050505050509bff2962a9 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050ffffff % 505050ff505050505050505050ffff505050ffffff505050505050ffff50ff505050ff5050505050 % 5050505050505050505050505050505050505050505050505050505050505050ff50ffff50ff5050 % 505050505050ffff5050ffffffff5050ffff505050505050505050505050509bff626262 % 2929a9a920509b5050505050505050505050505050505050505050505050505020505050505050ff % 5050ffff505050505050505050ffff505050ff5050505050505050ffff50ff505050ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050ffffff % 50ff5050505050505050ffffffffff50505050ffff50505050ff50505050ff50ffffff50ff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020202020202020209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff50ff505050ff5050ff50ff505050505050ff505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff50ff505050ffff50ff50ff50505050ff50ff50ffff50ffff % ff5050ffff50505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050209bff50ff505050ff5050ff50ff505050505050ffff505050ff50 % 5050ff505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b202020202020202020202020202020202020202020202020202050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050209bff50ff505050ff50ffff50ff5050505050ffffff505050ff50 % 5050ff505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050209bff50ff505050ff5050ff50ff505050505050ffff50ff50ff50 % 5050ff50ff50505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050209bff50505050505050505050ff50505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b5050ffffffff50ffff505050ffffff50ffffffffffffffff50 % ffffffff50ffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b50ffffffffff50ffff50ff50ffffff50ffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b50ffffffffff5050ff50ff50ffffff50ff50ffff50ff50ff50 % 50ffff5050ffff50ff50ffffff50ff50ffffffffffffffffffffffffff20209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 5050505050505050ffff505050505050505050505050505050505050ff505050ff50505050505050 % 50505050505050ff50ff505050509b50ffffffffff50ffff50ff50ffffff50ffffffff50ffffff50 % ffffffff50ffffffff50ffffff505050ffffffffffffffffffffffffff20209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050ffff50 % 5050ff5050505050ff5050505050ff505050ffffff50ff5050ffff50ff505050ff505050ffff50ff % ffff5050ff5050ff50ffff5050509b50ffffffffff50ff5050ff50ffffff50ffffffff50ffffff50 % ff5050ff50ffffffff50ffffffffff50ffffffffffffffffffffffffff20209bff2962a9 % 296262a920509b5050505050505050505050505050505050505050505050505020505050505050ff % 5050505050505050ff50ff5050ff50ff505050ff50ff50ff50505050ff505050ff505050505050ff % 505050ff505050ff50ff50ff50509b50ffffffffff50ffff50ff50ffffff50ffffffffff50ffff50 % ffffffff50ff50ffffff50ffff505050ffffffffffffffffffffffffff20209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050ff50ff % 5050505050505050ff50505050ff50ff505050ff50ff50ff50ff5050ff505050ff505050505050ff % 505050ff505050ff50ff50ff50509b50ffffffffffffffffffff50ffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050ff50ff % 5050505050505050ff5050ff50ff50ff505050ff50ff50ff50ffff50ff505050ff505050ff5050ff % 505050ff50ff50ff50ff50ff50509b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bffff50ffff50ff5050ffffff50505050ff5050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a920509b50505050505050505050505050505050505050505050505050205050ff50505050 % 50505050ff5050505050505050505050505050505050505050505050505050505050505050505050 % 50505050ffff50505050505050509bff50ff505050ff5050ff50ff50505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff505050ff50ffff50ff50ff505050ff505050ff50ff50ff50 % ff505050ffff50ff50ff50ff50ff50ffff50ff5050505050505050505020209bff2962a9 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff5050505050ff50ffff50ff50505050505050505050505050 % ff505050ffff5050505050ff50505050ff50505050505050505050505020209bff626262 % 2929a9a920509b202020202020202020202020202020202020202020202020202050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff50ff505050ff5050ff50ff505050ff50ff50ff50ff50ff50 % ff50ff50ffff50ff505050ff50ff50ffff50ff5050505050505050505020209bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050209bff50505050505050505050ff50505050505050505050505050 % ff5050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050209bffff5050505050505050ffff50505050505050505050505050 % ff5050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050209b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050209bff50ff505050ff5050ff50ff5050505050ff50505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff5050505050ffff50ff50ff50505050ff5050ffff5050ffff % 505050ff5050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff5050ffff50ff5050ff50ff505050ff5050505050ff505050 % ff505050ff50505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b50505050ff5050ff50505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff5050505050ff50ffff50ff50505050505050505050505050 % 50505050ff50505050505050505050505050505050505050505050505020209bff626262 % a9a9a9a920509b50505050505050ff50505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff50ff505050ff5050ff50ff50505050505050ff50ff50ff50 % ff50ff50ff50505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b50505050505050ff5050505050505050505050505050505050205050ff50505050 % 50505050ff505050ffffff50505050505050505050505050505050ffffff5050ff50505050ff5050 % 50505050505050505050505050509bff50505050505050505050ff50505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff622929 % 2929a9a920509b50505050505050ff50505050505050505050505050505050502050505050505050 % 5050505050505050ff5050ff50505050ff50505050505050505050ff5050ff505050505050505050 % 50505050505050505050505050509bffff5050505050505050ffff50505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 296262a920509b5050505050505050ffff50505050505050505050505050505020505050505050ff % 5050505050505050ffffff5050505050ff50ff5050505050ff5050ff50505050ff50505050ffff50 % 5050ff50505050505050505050509b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050ff50ff % 5050505050505050ff50505050ff5050ff50ff5050505050ff5050ff50505050ff50505050ffff50 % 5050ff50505050505050505050509b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050ff50ff % 50ffff5050505050ff50505050ffff50ff50ff50ff505050ff5050ff5050ff50ff50ff50ffffff50 % 5050ff50ff5050505050505050509b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a920509b50505050505050505050505050505050505050505050505050205050ff50505050 % 50505050ff5050505050505050505050505050505050505050505050505050505050505050505050 % 505050ffff5050505050505050509b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a920509b202020202020202020202020202020202020202020202020202050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b20202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020202020202020209bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b209bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a99b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9bff2962a9 % 29626229292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929292929292929292929292929292929292929292929292929292929292962a9 % 29626262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a96262626262626262626262626262a9 % 29a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9 %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice /pop load def %%EndProlog %%Page 1 1 /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 326 string def gsave 227.76 289.56 translate 156.48 182.88 scale 326 381 8 [ 326 0 0 -381 0 381 ] { picstr readstring } image 80008000ba000000e3d6019d5680d680d6fcd6019d56e2d6019d007f00d6 d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656 d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d45d69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6d69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d56000300d69d d6e59d0256d6d6809d809dfd9d0256d6d6e59d02569d000200d6d6e49d01 56d6809d809dfc9d0156d6e39d0156007f00d69dd69d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d567f9d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d56459d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569dd69d569d007f00d6d69d9d9d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d7f569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d45569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569dd69d9d9d56000600d69dd69d569d80008000c80006d6 9dd69d569d000700d6d69d9d9d560080d680d6cad60700d6d69d9d9d5600 7f00d69dd69d569d00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd6459dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9dd6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd600d69dd69d569d0008 00d6d69d9d9d5600d6ea9d0156d6809d959d0256d6d6ea9d0156d6ea9d08 5600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6d6809d979d 025656d6e99d0556d6d69d9d9df200fc9d085600d69dd69d569d000800d6 d69d9d9d5600d6eb9d025656d6ef9d010000809da89d0256d6d6eb9d0256 56d6fc9d0000f49d0d009d9d9d565600d6d69d9d9d56000900d69dd69d56 9d00d6d6eb9d0256d6d6f19dfd00809da99d025656d6e99d0656d6d69d9d 9d00f49d0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb 9d025656d6f19d0400009d0000809da99d0256d6d6eb9d025656d6fc9d00 00f49d0d00009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb 9d0256d6d6f29d1600009d00009d9d9d00009d0000009d9d9d00009d0000 00fc9dfc00fc9dfc00fd9d0600009d00009d9dfc00fd9d0500009d000000 fc9dfc00fc9dfc00809df39d025656d6e99d0656d6d69d9d9d00f49d0d00 009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6f2 9d2a00009d9d00009d9d9d0000009d9d00009d9d0000009d9d00009d9d00 009d9d00009d9d00009d9d00009d9dfb001f9d00009d9d00009d9d000000 9d9d00009d9d00009d9d00009d9d00009d9d0000809df39d0256d6d6eb9d 025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00d69dd6 9d569d00d6d69d9df000fd9d0256d6d6f39d2000009d9d00009d9d000000 9d9d9d00009d0000009d9d9d00009d00009d9d9d0000fa9d0500009d9d00 00f89d1a00009d9d00009d9d9d00009d00009d9d9d00009d00009d9d9d00 00809df49d025656d6f89dfc00f59d0656d6d69d9d9d00f49d0d00009d9d 9d5600d69dd69d569d000c00d6d69d9d9d5600d69d9d9d00f29d05009d9d 5656d6f39d0a00009d9d9d00009d9d0000fc9d0400009d0000fc9d020000 9dfa00fd9dfb00039d9d0000fb9dfb000c9d9d00009d9d9d00009d9d0000 fa9dfa00809df29d0256d6d6f99d04009d9d0000f79d025656d6fc9d0000 f49d0d00009d9d565600d6d69d9d9d56000c00d69dd69d569d00d6d69d9d 00f29d0600009d9d56d6d6f59df800149d9d00009d9d9d00009d9d00009d 9d9d00009d0000f99d0900009d9d00009d9d0000fc9d1100009d9d00009d 9d00009d9d9d00009d0000fa9d010000809dee9d025656d6f89d04009d9d 0000f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000b 00d6d69d9d9d5600d69d9d9def00039d5656d6f49d010000fc9d1600009d 9d00009d9d9d00009d9d00009d9d9d00009d0000fa9d2800009d9d9d0000 9d9d00009d9d9d00009d9d9d00009d9d00009d9d9d00009d00009d9d9d00 009d0000809ded9d0256d6d6f99dfb00f79d025656d6fc9d0000f49d0d00 009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6fc9df100049d 9d56d6d6f69d010000fb9d0200009dfc00049d00009d9dfc00169d00009d 9d00009d9d00009d9d00009d9d00009d9d0000fc9d1e00009d9d00009d9d 00009d9d9d00009d9d00009d9d00009d9d00009d9d0000809df29d025656 d6f79dfc00f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d56 9d000800d6d69d9d9d5600d6eb9d025656d6f59d010000fb9d1100009d00 009d0000009d9d9d00009d000000fc9dfc00fc9dfd00059d00009d0000fb 9dfd000d9d00009d00009d9d9d00009d9d9dfc00fc9dfc00809df09d0256 d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d560009 00d69dd69d569d00d6d6eb9d0256d6d6ec9d010000f99d010000809db69d 025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d 000800d6d69d9d9d5600d6eb9d025656d6ec9d010000f99d010000809db4 9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d 56000900d69dd69d569d00d6d6eb9d0256d6d6ed9d010000f99d01000080 9db59d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd6 9d569d000800d6d69d9d9d5600d6eb9d025656d6809d959d0256d6d6eb9d 025656d6fc9df1000b9d9d565600d6d69d9d9d56000900d69dd69d569d00 d6d6eb9d0256d6d6809d979d025656d6e99d0256d6d6fb9df300fd9d0856 00d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6809d959d0256 d6d6eb9d025656d6eb9d09565600d6d69d9d9d56007f00d69dd69d569d00 d69d9d569d569d569d569d569d569d569d569d569d569d56d6569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 7f9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d56459d569d569d569d569d569d5656d69d569d569d56 9d569d569d569d569d569d569d569d569d56d6569d569d569d569d569d56 9d569d569d569d569d569d5600d69dd69d569d0008009d569d9d9d56009d e956009d80569456009de856009de9560700d6d69d569d56000000fb5600 9d80008000c80001d69dfc56ff000000fcd6029d565680df80dfcadf0000 fad6ff000700d6d6d69d569d5680df80dfcbdf036400d69dfcd6ff000900 d6d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56000a00d69d d69d569d56dfdfafa9df80afd9afcbdf0700d69dd69d569d000a00d6d69d 9d9d5656dfdfafaadf006480afd9afccdf086400d6d69d9d9d56000c00d6 9dd69d569d56dfdfafdfdfadaf01646480afd9af01dfdfcfaf09646400d6 9dd69d569d000c00d6d69d9d9d5656dfdfafdfdfadaf01646480afd9af01 dfdfcfaf09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdfad af01646480afd9af01dfdfcfaf09646400d69dd69d569d000c00d6d69d9d 9d5656dfdfafdfdfadaf01646480afd9af01dfdfcfaf09646400d6d69d9d 9d56000c00d69dd69d569d56dfdfafdfdfadaf01646480afd9af01dfdfcf af09646400d69dd69d569d000c00d6d69d9d9d5656dfdfafdfdfadaf0164 6480afd9af01dfdfcfaf09646400d6d69d9d9d56000c00d69dd69d569d56 dfdfafdfdfadaf01646480afd9af01dfdfcfaf09646400d69dd69d569d00 0c00d6d69d9d9d5656dfdfafdfdff8affd00f1affd00faaff900d7af0164 64eeaff36480aff8af01dfdff5af0000faaf0300afaf00f9af0000edaf09 646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdff8af0000edaf 0000faaf0000fbaf010000e2af0000f7af016464eeaff46400dff9affd00 f0affd00f7affd00e2af0000f9af0000c8af01dfdff5af0000faaf0300af af00f9af0000edaf09646400d69dd69d569d000c00d6d69d9d9d5656dfdf afdfdff8af0000edaf0000faaf0000faaf0000e2af0000f7af016464eeaf 016464f7e201dfdff9af0000ecaf0000f9af060000afafaf0000e4af0000 f9af0000c8af01dfdff5af0000faaf0000f6af0000edaf09646400d6d69d 9d9d56000c00d69dd69d569d56dfdfafdfdff8af0000fcaffc000bafaf00 00afafaf0000afaf00faaf0000faaf0300afafaffc0002afaf00fbaf0200 afaffc00fdaf0100affb00f8af016464eeaf016464f7e201dfdff9af0000 ecaf0000f9af0000fbaf0000dcaf0000c8af01dfdff5af0000faaf0e00af af00afafaf000000af00afafaffc00f4af09646400d69dd69d569d000c00 d6d69d9d9d5656dfdfafdfdff8af1400afafaf0000afaf0000afaf00afaf af00afafaf00faaf0000fbaf0b00afafaf0000afaf0000af00fbaf0f00af 0000afaf0000afaf0000afafaf00f7af016464eeaf016464f7e201dfdff9 af0000fcaffc00fcaffc00fcaf0000faaf0000f9af0200af00fbaf0200af affc00fdaf1500af0000af00af0000af00afafaf000000af00afafaffc00 cfaf01dfdff5af0000faaf1300afaf00afaf0000afaf0000afaf0000afaf 0000f5af09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdff8 af0000f8af0600afafaf00af00fcaf0000faaffa00fcaf0000fcaf0a00af af00afafaf00afaf00fcaf0300afaf00fcaf0000f7af016464eeaf016464 f7e201dfdff9af1500afafaf0000afaf0000afaf0000afaf0000afafaf00 faaf0000f9af0200af00fbaf2400af0000afaf0000afaf0000afafaf0000 afafaf00afaf0000afaf0000afaf0000afaf0000d0af01dfdff5aff80005 afaf00afaf00fcaf0300afaf00fcaf0000f5af09646400d69dd69d569d00 0c00d6d69d9d9d5656dfdfafdfdff8af0000fcaffb00fcaf0000fbaf0000 faaf0000fbaf0300afafaffa0008afaf00afafaf00afaffa0002afaf00fc af0000f7af016464eeaf016464f7e201dfdff9af0000f8af0300afaf00fc af0400afafaf00faaf0000f9af0a00afaf00afafaf00afaf00fcaf0300af af00fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0000d0af01dfdff5 af0000faaf0600afaf00afaf00fcaf0200afaffa00f5af09646400d6d69d 9d9d56000c00d69dd69d569d56dfdfafdfdff8af0900afafaf0000afafaf 00fcaf0000fbaf0000faaf0000faaf0300afaf00f9af0700afafaf00afaf 00f9af0000fcaf0000f7af016464eeaf016464f7e201dfdff9af0000fcaf fb0002afaf00fcaf0400afafaf00faaf0000f9af0900afaf00afafaf00af affa0002afaf00fcaf0000fcaf0300afaf00fcaf0200afaffa00d0af01df dff5af0000faaf0600afaf00afaf00fcaf0300afaf00f0af09646400d69d d69d569d000c00d6d69d9d9d5656dfdfafdfdff8af0400afafaf00fcaf06 00afafaf00af00fcaf0000faaf0000faaf0300afaf00f8af0600af00afaf af00f9af0000fcaf0000f7af016464eeaf016464f7e201dfdff9af0c00af afaf0000afafaf00afaf00fcaf0400afafaf00faaf0000f9af0a00afaf00 afafaf00afaf00f9af0000fcaf0000fcaf0300afaf00fcaf0300afaf00cb af01dfdff5af0000faaf0600afaf00afaf00fcaf0300afaf00f0af096464 00d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdff8af1400afafaf00 00afaf0000afaf00afafaf00afafaf00faaf0000faaf1a00afaf0000afaf 0000afafaf00af00afafaf0000afaf0000afaf00fcaf0000f7af016464ee af016464f7e201dfdff9af0400afafaf00fcaf0300afaf00fcaf0400afaf af00f9af0000fbaf0000fcaf0600af00afafaf00f9af0000fcaf0000fcaf 0300afaf00fcaf0300afaf00cbaf01dfdff5af0000faaf1300afaf00afaf 0000afaf0000afaf0000afaf0000f5af09646400d69dd69d569d000c00d6 d69d9d9d5656dfdfafdfdff8af0000fcaffd0000affc00fdaf040000afaf 00faaf0000faaf0300afafaffc00fbaf0000fbaffc00fdaf0000fbaf0100 00f9af016464eeaf016464f7e201dfdff9af1500afafaf0000afaf0000af af0000afaf0000afafaf00f9af060000afafaf0000fcaf0e00af00afafaf 0000afaf0000afaf00fcaf0000fcaf1000afaf0000afaf0000afaf0000af af0000d0af01dfdff5af0000faaf0e00afaf00afafaf000000af00afafaf fc00f4af09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdff8 af0000edaf0000caaf016464eeaf016464f5dff9af0000fcaffd0004af00 00afaffc00fcaf0000f7affd00f9af0000fbaffc00fdaf0000fcaf0000fc af0b00afafaf000000af00afafaffc00cfaf01dfdfcfaf09646400d69dd6 9d569d000c00d6d69d9d9d5656dfdfafdfdff8af0000edaf0000caaf0164 64eeaf0064f4dff9af0000ecaf000095af01dfdfcfaf09646400d6d69d9d 9d56000c00d69dd69d569d56dfdfafdfdff8affd00f1affd00caaf016464 daaf0000ecaf000095af01dfdfcfaf09646400d69dd69d569d000c00d6d6 9d9d9d5656dfdfafdfdfadaf016464daaffd00f0affd0095af01dfdfcfaf 09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdfadaf016464 80afd9af01dfdfcfaf09646400d69dd69d569d000c00d6d69d9d9d5656df dfafdfdfadaf01646480afd9af01dfdfcfaf09646400d6d69d9d9d56000c 00d69dd69d569d56dfdfafdfdfadaf01646480afd9af01dfdfcfaf096464 00d69dd69d569d000c00d6d69d9d9d5656dfdfafdfdfadaf01646480afd9 af01dfdfcfaf09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdf dfadaf01646480afd9af01dfdfcd640700d69dd69d569d000c00d6d69d9d 9d5656dfdfafdfdfab6480afd9af00dfcc640700d6d69d9d9d56000b00d6 9dd69d569d56dfdfafdfaa6480afa6af09646400d69dd69d569d000900d6 d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80af80afceaf09646400d69dd69d569d000900d6d69d9d9d 5656dfdf80af80afceaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdf80af80afceaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf 80af80afceaf09646400d6d69d9d9d56000900d69dd69d569d56dfdff4af fd00f4af0000d3affd00fcaf000080af9faf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdff6af060000afafaf0000f6af0000d5af090000af afaf0000afaf0080af9faf09646400d6d69d9d9d56000900d69dd69d569d 56dfdff6af0000fbaf0000f6af0000d5af0000fbaf0300afaf0080af9faf 09646400d69dd69d569d000900d6d69d9d9d5656dfdff7af0000f6affc00 fdaf0300afafaffc00fdaf0500af0000af00e5af0000f8af0400af000000 fcaffc000dafaf00afafaf00afafaf00afaf0080afb9af09646400d6d69d 9d9d56000900d69dd69d569d56dfdff7af0000f7af180000afaf0000afaf 00afaf0000afaf0000afaf0000afafaf00e4af010000faaf1a0000afaf00 00afaf0000afaf0000af00afafaf00afafaf00afaf0080afb9af09646400 d69dd69d569d000900d6d69d9d9d5656dfdff7af0000f7af0000fcaf0600 afaf00afaf00fcaf0300afaf00ddaf010000fcaf0000fcaf0300afaf00fc af0a00af00afafaf00afafaf0080afb6af09646400d6d69d9d9d56000900 d69dd69d569d56dfdff7af0000f7af0000fcaf0600afaf00afaf00fcaf03 00afaf00dbaf040000afaf00fcaf0300afaf00fcaf0900afaf00afaf00af af0080afb5af09646400d69dd69d569d000900d6d69d9d9d5656dfdff7af 0000f7af0000fcaf0600afaf00afaf00fcaf0300afaf00daaf0300afaf00 fcaf0300afaf00fcaf0900afaf00afaf00afaf0080afb5af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdff6af0000fbaf0300afaf00fcaf06 00afaf00afaf00fcaf0300afaf00e0af0000fbaf0300afaf00fcaf0300af af00fcaf0900afaf00af00af00af0080afb5af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdff6af1c0000afafaf0000afaf0000afaf0000af af00afaf0000afaf0000afaf00fcaf0000e5af090000afafaf0000afaf00 fcaf1000afaf0000afaf0000afafaf00afafaf00fcaf000080afb9af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdff4affd00fbaffc00fdaf 0300afafaffc00fdaf0000fcaf0000e3affd00fcaf0000fcaf0300afafaf fc00fcaf0400afafaf00fcaf000080afb9af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf80af9aaffd00fcaf0000ecaf0300afaf00d4af09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80af9caf090000afaf af0000afaf00ecaf0300afaf00d4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdf80af9caf0000fbaf0300afaf00ecaf0000d1af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80af9caf0000f8af0400af00 0000fcaffc00fcaffd000baf00afaf00afaf00af000000fcaffd0001af00 e4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80af9baf0100 00faaf280000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00af af0000afaf0000afaf0000afaf0000e4af09646400d6d69d9d9d56000900 d69dd69d569d56dfdf80af99af010000fcaf0000fcaf0000f9af0300afaf 00fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000e4af09646400d69d d69d569d000900d6d69d9d9d5656dfdf80af97af040000afaf00fcaf0300 afafaffb0002afaf00fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000 e4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af96af0300 afaf00fcaf0b00afaf0000afafaf00afaf00fcaf0600afaf00afaf00fcaf 0300afaf00fcaf0000e4af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80af9caf0000fbaf0300afaf00fcaf0300afaf00fcaf0300afaf00 fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000e4af09646400d6d69d 9d9d56000900d69dd69d569d56dfdf80af9caf090000afafaf0000afaf00 fcaf1600afaf0000afaf0000afaf0000afaf0000afaf00afaf00fcaf0800 afaf0000afaf0000e4af09646400d69dd69d569d000900d6d69d9d9d5656 dfdf80af9aaffd00fcaf0000fcaf1600afafaf000000af0000afaf000000 af00afaf00afaf00fcaf0800afafaf000000af00e4af09646400d6d69d9d 9d56000900d69dd69d569d56dfdffcafd1df80af9eaf0000e4af09646400 d69dd69d569d000900d6d69d9d9d5656dfdffcafd2df006480afa3af0500 00afaf0000e4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffc af01dfdfd5af01646480afa2affc00e3af09646400d69dd69d569d000900 d6d69d9d9d5656dfdffcaf01dfdfd5af01646480af81af09646400d6d69d 9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af01646480aff8af8b 640bdfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdf d5af046464afafaff36488af00648ddf0c64dfaf646400d6d69d9d9d5600 0900d69dd69d569d56dfdffcaf01dfdff5affd00fcaffd00fbaffb00f4af 046464afafaff46400dff9affd00f6affb00faaff900aeaf0164df8d640b dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff5af 0000fcaf090000afafaf0000afaf00fcaf0000f4af066464afafaf6464f7 e201dfdff9af0000f5af0000fcaf0000faaf0000a8af0164df8f640ddf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff5af 0000fcaf0000fbaf0300afaf00fcaf0000f4af066464afafaf6464f7e201 dfdff9af0000f5af0000fcaf0000faaf0000a8af0364df646492af0edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff5 af0400afafaf00f8affd00fdaf0000f4af066464afafaf6464f7e201dfdf f9af0000fcaffc0008afaf000000afafaf00faaf0000f8affc00fcaffc00 fdaffc00fcaffd00caaf0364df646492af0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdff5af0400afafaf00f7af00 00fcaf0000f4af066464afafaf6464f7e201dfdff9af0c00afafaf0000af af0000afaf00fcaf0000faaf0000f9af1b0000afaf0000afaf0000afaf00 00af0000afaf0000afaf00afafaf00cbaf0964df6464af000000afaffc00 efaffd00f7affd00bcaf0edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdffcaf01dfdff5af0400afafaf00f7af0000fcaf0000f4af 066464afafaf6464f7e201dfdff9af0000f8af0300afaf00fcaf0000faaf fa00f9af0300afaf00faaf0000fcaf0400afaf0000c8af0964df6464af00 afafaf00fcaf0000eeaf0000f9af060000afafaf0000e7af0000edaf0000 ecaf0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffc af01dfdff5af0400afafaf00f7af0000fcaf0000f4af066464afafaf6464 f7e201dfdff9af0000fcaffb0002afaf00fcaf0000faaf0000f8affb0002 afaf00faaffa00fdaffd00caaf0964df6464af00afafaf00fcaf0000eeaf 0000f9af0000fbaf0000e7af0000edaf0000ecaf0edfdf64dfaf646400d6 9dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff5af0400afafaf00 f7af0000fcaf0000f4af066464afafaf6464f7e201dfdff9af0c00afafaf 0000afafaf00afaf00fcaf0000faaf0000f9af080000afafaf00afaf00fa af0000f6af010000cbaf0964df6464af00afafaf00fcaf0300afafaffc00 fcaffd00fcaf0000faaf0000f6affc00fdaf0400af000000fcaffd0007af af000000afafaffc00fdaf0900af000000afaf000000edaf0edfdf64dfaf 646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff5af0000 fcaf0000fbaf0300afaf00fcaf0000f4af066464afafaf6464f7e201dfdf f9af0400afafaf00fcaf0300afaf00fcaf0000faaf0000f9af0000fcaf03 00afaf00fcaf0200af00f5af0000cbaf0964df6464af00afafaf00fcaf13 00afaf0000afaf0000afaf00afafaf00afafaf00faaf0000f7af2b0000af af0000afaf0000afaf0000afaf00afafaf00afaf00afafaf0000afaf0000 afaf0000afaf0000afaf00ecaf0edfdf64dfaf646400d69dd69d569d0009 00d6d69d9d9d5656dfdffcaf01dfdff5af0000fcaf090000afafaf0000af af00fcaf0000f4af066464afafaf6464f7e201dfdff9af0c00afafaf0000 afaf0000afaf00fcaf0000faaf0000f9af1b0000afaf0000afaf0000afaf 0000af0000afaf0000afaf00afafaf00cbaf0964df6464af00afafaf00fc af0000f9af0400afaf0000faaf0000faaf0000f7af0000fcaf0300afaf00 fcaf0400afaf0000fbaf0000f8af0300afaf00fcaf0300afaf00ecaf0edf df64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdf f5af0000faaffd00fcaf0000fcaf0000f4af066464afafaf6464f5dff9af 0000fcaffd0004af0000af00fcaf0000faaf0000f8affd0004af0000afaf fc00fdaffc00fcaffd00caaf0964df6464af00afafaf00fcaf0300afafaf fb00fdaffd00fcaf0000faaf0000f7af0000fcaf0300afaf00fcaf0a00af afaf000000afafaf00fcaffb0002afaf00fcaf0300afaf00ecaf0edfdf64 dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff5af 0000eeaf0000f4af056464afafaf64f4dff9af0000f0af0000a1af0964df 6464af00afafaf00fcaf0800afaf0000afafaf00fbaf050000afafaf00fa af0000f7af0000fcaf0300afaf00fcaf0000fbaf100000afaf00afafaf00 00afafaf00afaf00fcaf0300afaf00ecaf0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdff5af0000eeaf0000f4af01 6464e9af0000f0af0000a1af0964df6464af00afafaf00fcaf0300afaf00 fcaf0000faaf0400afafaf00f9af0000fbaf0300afaf00fcaf0300afaf00 fcaf0000faaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00ec af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf 01dfdff5affd00f2affd00f4af016464e9affd00f4affd00a1af0964df64 64af00afafaf00fcaf1300afaf0000afaf0000afaf00afafaf00afafaf00 f9af110000afafaf0000afaf0000afaf0000afaf00fcaf1600afaf00afaf af00afaf00afafaf0000afaf0000afaf00fcaf0300afaf00ecaf0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af 01646480aff8af0564df6464af00fcaffc00fcaffd0007af0000afaf0000 00fcaf0000f7affd00fbaffc00fdaf0000fcaf0600afafaf000000fcaf0b 0000afaf000000af0000af00fcaf0500afafaf0000eeaf0edfdf64dfaf64 6400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdfd5af016464 80aff8af0564df6464af00e5af0000b0af0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdfd36480aff8af0564df6464 af00e5af0000b0af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d 9d5656dfdffcaf00dfd26480aff8af0764df6464af000000e9affd00b0af 0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcafd1 df80aff8af0364df646492000edfdf64dfaf646400d69dd69d569d000900 d6d69d9d9d5656dfdffcafd2df006480aff8af0364df646492000edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af 01646480aff8af0764df646400afafaffc0000afee00fdaffa00f9af0100 afbf000edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf fcaf01dfdfd5af01646480aff8af0564df646400affc00fdafec0000affa 0000aff90000aff60000afca000edfdf64dfaf646400d6d69d9d9d560009 00d69dd69d569d56dfdffcaf01dfdfd5af01646480aff8af0564df646400 affa0000afec0000affa0000aff90000aff60000afca000edfdf64dfaf64 6400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdfd5af046464 afafaff3df88af0564df646400affa0000affb00fcaffc00fdaffc0000af fa0000aff90003af000000fcaf040000afafafcb000edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff7affd00fcaffd 00f5affd00f6af046464afafaff4df0064f9affd00f0affd00faaff900f9 af0000baaf0564df646400affa0000affc0010afaf0000afaf0000af0000 00af000000affa0000aff9000baf0000afaf0000afaf0000afca000edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7 af0000fcaf060000afafaf0000f5af0000f6af066464afafafdfdff7af01 6464f9af0000ecaf0000faaf0000f3af0000baaf0564df646400affa0000 aff70004af0000afaffa0000affa00faaf020000aff90003af0000afca00 0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01 dfdff7af0000fcaf0000fbaf0000f5af0000f6af066464afafafdfdff7af 016464f9af0000ecaf0000faaf0000f3af0000baaf0564df646400affa00 00affb00fbaffd00fdaffc0000affa0000aff90003af000000fbaf020000 afca000edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf fcaf01dfdff7af0400afafaf00f6affc00fcaf0000f6af066464afafafdf dff7af016464f9af0000fcaffc00fcaffc00fcaf0000faaf0000f7affd00 0caf00afafaf000000af00afafaffc00fcaffd00d0af0564df646400affa 0000affc0005afaf000000affb0005afaf000000affa0000aff9000baf00 00afaf000000af0000afca000edfdf64dfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf01dfdff7af0400afafaf00f7af090000afaf00 00afafaf00f6af066464afafafdfdff7af016464f9af1500afafaf0000af af0000afaf0000afaf0000afafaf00faaf0000f8af1c0000afaf0000afaf 0000afaf0000afaf0000afaf0000afaf00afafaf00d1af0564df646400af fa0000affc0000affc0000affa0004af000000affa0000aff90003af0000 affc0003af0000afca000edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdffcaf01dfdff7af0400afafaf00f7af0000fcaf0400afaf af00f6af066464afafafdfdff7af016464f9af0000f8af0300afaf00fcaf 0400afafaf00faaffa00fdaf0000fcaf0300afaf00fcaf0300afaf00fcaf 0400afaf0000ceaf0564df646400affa0000affc0010afaf0000afaf0000 af000000af000000affa0000aff9000baf0000afaf0000afaf0000afca00 0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01 dfdff7af0400afafaf00f7affa00fdaf0000f6af066464afafafdfdff7af 016464f9af0000fcaffb0001afaffa00fdaf0000faaf0000f8af0000fcaf 0300afaf00fcaf0200afaffa00fdaffd00d0af0564df646400affa0000af fb00fdaf0700afaf0000afafaffc0000affa0000aff9000daf000000afaf af00afaf0000afafcc000edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdffcaf01dfdff7af0400afafaf00f7af0000f8af0000f6af 066464afafafdfdff7af016464f9af0c00afafaf0000afafaf00afaf00f8 af0000faaf0000f8af0000fcaf0300afaf00fcaf0300afaf00f6af010000 d1af0564df646400afe50000afb0000edfdf64dfaf646400d6d69d9d9d56 000900d69dd69d569d56dfdffcaf01dfdff7af0000fcaf0000fbaf0300af af00f8af0000f6af066464afafafdfdff7af016464f9af0400afafaf00fc af0300afaf00f8af0000faaf0000f8af0000fcaf0300afaf00fcaf0300af af00f5af0000d1af0564df646400afe50000afb0000edfdf64dfaf646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7af0000fcaf12 0000afafaf0000afaf0000afaf0000afafaf00f6af066464afafafdfdff7 af016464f9af1500afafaf0000afaf0000afaf0000afaf0000afafaf00fa af0000f8af1c0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf 00afafaf00d1af0764df646400afafafe900fdafb0000edfdf64dfaf6464 00d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff7af0000faaf fd00fbaffc00fcaf0000f6af066464afafafdfdff564f9af0000fcaffd00 04af0000afaffc00fcaf0000faaff900fdaffd000caf00afafaf000000af 00afafaffc00fcaffd00d0af0364df646492af0edfdf64dfaf646400d69d d69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7af0000eaaf0000f6 af056464afafafdff464f9af0000ecaf0000e4af0000c2af0364df646492 af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf 01dfdff7af0000eaaf0000f6af016464e9af0000ecaf0000e9af050000af af0000c2af0964df6464af000000afaffc00efaffd00f8affd00ddaf0000 dfaf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffc af01dfdff7affd00eeaffd00f6af016464e9affd00f0affd00e8affc00c1 af0964df6464af00afafaf00fcaf0000eeaf0000faaf060000afafaf0000 e3af0400afafaf00dfaf0edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf01dfdfd5af01646480aff8af0964df6464af00afaf af00fcaf0000eeaf0000faaf0000fbaf0000e3af0400afafaf00dfaf0edf df64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdf d5af01646480aff8af0564df6464af00f8af0300afafaffc00fcaffd00fc af0000faaf0000f8af0700af0000afaf0000fcaffc00fcaffc000bafaf00 0000afaf00af000000e3af0edfdf64dfaf646400d6d69d9d9d56000900d6 9dd69d569d56dfdffcaf01dfdfd36480aff8af0564df6464af00f9af1400 afafaf0000afaf0000afaf00afafaf00afafaf00f9af010000faaf240000 afaf0000afaf00afaf0000afaf0000afaf0000afaf0000afaf00afafaf00 00afaf0000e4af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d 5656dfdffcaf00dfd26480aff8af0564df6464af00faaf0000f7af0400af af0000faaf0000f7af010000fcaf0b00afafaf00afafaf00afaf00fcaf03 00afaf00fcaf0700afaf00afafaf00fcaf0000e4af0edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcafd1df80aff8af0564df64 64af00fbaf0000faaffb00fdaffd00fcaf0000f5af0f0000afaf00afafaf 00afafaf00afaf00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000 e4af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffc afd2df006480aff8af0564df6464af00fcaf0000faaf050000afafaf00fb af050000afafaf00f4af0e00afaf00afafaf00afafaf00afaf00fcaf0300 afaf00fcaf0700afaf00afafaf00fcaf0000e4af0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af01646480aff8 af0964df6464af00afafaf00f9af0000fcaf0000faaf0400afafaf00faaf 0000fbaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf07 00afaf00afafaf00fcaf0000e4af0edfdf64dfaf646400d69dd69d569d00 0900d6d69d9d9d5656dfdffcaf01dfdfd5af01646480aff8af0964df6464 af00afafaf00f9af100000afaf0000afaf00afafaf00afafaf00faaf2800 00afafaf0000afaf00afafaf00afafaf00afaf0000afaf0000afaf0000af af0000afaf00afafaf00fcaf0000e4af0edfdf64dfaf646400d6d69d9d9d 56000900d69dd69d569d56dfdffcaf01dfdfd5af01646480aff8af0864df 6464af00afafaffa00fdaffd0007af0000afaf000000fcaf0000f8affd00 fcaf0b00afafaf00afafaf00afafaffc00fcaffc00fcaf030000af00fcaf 0000e4af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656df dffcaf01dfdfd5af046464afafaff3df88af0564df6464af00e5af0000b0 af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf 01dfdff7affd00fcaffd00f5affd00f6af046464afafaff4df0064f9affd 00f0affd00faaf010000fbaf0000deaf0000d6af0564df6464af00e5af00 00b0af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf fcaf01dfdff7af0000fcaf060000afafaf0000f5af0000f6af066464afaf afdfdff7af016464f9af0000ecaf0000faaf0200af00fcaf0000deaf0000 d6af0764df6464af000000e9affd00b0af0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdff7af0000fcaf0000fbaf00 00f5af0000f6af066464afafafdfdff7af016464f9af0000ecaf0000faaf 0200af00fcaf0000deaf0000d6af0364df646492af0edfdf64dfaf646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7af0400afafaf 00f7af0400af000000fcaf0000f6af066464afafafdfdff7af016464f9af 0000fcaffc00fdaf0400af000000fcaf0000faaf0a00afaf00afafaf00af afaffc00fdaf0c00af0000af00af0000afaf0000fcaffc00fdaf0600afaf af000000dcaf0364df646492af0edfdf64dfaf646400d6d69d9d9d560009 00d69dd69d569d56dfdffcaf01dfdff7af0400afafaf00f7af090000afaf 0000afafaf00f6af066464afafafdfdff7af016464f9af1500afafaf0000 afaf0000afaf0000afaf0000afafaf00faaf3100afaf00afafaf00afaf00 00afaf0000afaf0000afafaf0000afaf0000afaf00afaf0000afaf0000af af00afaf00afafaf00ddaf0964df6464af000000afaffc00efaffd00f7af fd00faaffd00ddaf0000e9af0edfdf64dfaf646400d69dd69d569d000900 d6d69d9d9d5656dfdffcaf01dfdff7af0400afafaf00f7af0000fcaf0400 afafaf00f6af066464afafafdfdff7af016464f9af0000f8af0300afaf00 fcaf0400afafaf00faaf0a00afafaf00afaf00afaf00fcaf0300afaf00fc af0800afafaf00afafaf00f9af0700afaf00afaf0000daaf0964df6464af 00afafaf00fcaf0000eeaf0000f9af0f0000afafaf0000afaf0000afafaf 0000e3af0400afafaf00e9af0edfdf64dfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf01dfdff7af0400afafaf00f7af0000fcaf0400 afafaf00f6af066464afafafdfdff7af016464f9af0000fcaffb0002afaf 00fcaf0400afafaf00faaf0a00afafaf00afaf00afaf00fcaf0300afaf00 fcaf0b00afafaf00afafaf00afafaffb0008afaf00afafaf000000dcaf09 64df6464af00afafaf00fcaf0000eeaf0000f9af0000fbaf0300afaf00fb af0000e3af0400afafaf00e9af0edfdf64dfaf646400d69dd69d569d0009 00d6d69d9d9d5656dfdffcaf01dfdff7af0400afafaf00f7af0000fcaf04 00afafaf00f6af066464afafafdfdff7af016464f9af0c00afafaf0000af afaf00afaf00fcaf0400afafaf00faaf0000fcaf0500af00afaf00fcaf03 00afaf00fcaf1300afafaf00afafaf00afaf0000afafaf00afaf00fbaf01 0000ddaf0564df6464af00f8af0300afafaffc00fcaffd00fcaf0000faaf 0000f7af0000f8af0700af0000afaf0000fcaffc00fcaffc000bafaf0000 00afaf00af000000edaf0edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf01dfdff7af0000fcaf0000fbaf0300afaf00fcaf04 00afafaf00f6af066464afafafdfdff7af016464f9af0400afafaf00fcaf 0300afaf00fcaf0400afafaf00faaf0000fcaf0500af00afaf00fcaf0300 afaf00fcaf0b00afafaf00afafaf00afaf00fcaf0300afaf00faaf0000dd af0564df6464af00f8af1300afaf0000afaf0000afaf00afafaf00afafaf 00faaf0000f6af010000faaf240000afaf0000afaf00afaf0000afaf0000 afaf0000afaf0000afaf00afafaf0000afaf0000eeaf0edfdf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7af0000fcaf 090000afafaf0000afaf00fcaf0400afafaf00f6af066464afafafdfdff7 af016464f9af0c00afafaf0000afaf0000afaf00fcaf0400afafaf00faaf 0000fbaf0c0000afaf0000afaf0000afaf00fcaf1a00afafaf00afafaf00 afaf0000afaf0000afaf00afaf00afafaf00ddaf0564df6464af00fbaffd 00f8af0400afaf0000faaf0000faaf0000f4af010000fcaf0b00afafaf00 afafaf00afaf00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000ee af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf 01dfdff7af0000faaffd00fcaf0000fcaf0400afafaf00f6af066464afaf afdfdff564f9af0000fcaffd0004af0000af00fcaf0400afafaf00faaf00 00fbaf040000afafaffc00fdaf0000fcaf1900afafaf00afafaf00afafaf 000000af0000af00afafaf000000dcaf0564df6464af00f8af0300afafaf fb00fdaffd00fcaf0000faaf0000f2af0f0000afaf00afafaf00afafaf00 afaf00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000eeaf0edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7 af0000eaaf0000f6af056464afafafdff464f9af0000ecaf0000a5af0564 df6464af00f8af0800afaf0000afafaf00fbaf050000afafaf00faaf0000 f1af0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf0700af af00afafaf00fcaf0000eeaf0edfdf64dfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf01dfdff7af0000eaaf0000f6af016464e9af00 00ecaf0000a5af0964df6464af00afafaf00fcaf0300afaf00fcaf0000fa af0400afafaf00f9af0000fbaf0300afaf00fbaf0e00afaf00afafaf00af afaf00afaf00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000eeaf 0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01 dfdff7affd00eeaffd00f6af016464e9affd00f0affd00a5af0964df6464 af00afafaf00fcaf1300afaf0000afaf0000afaf00afafaf00afafaf00f9 af310000afafaf0000afaf0000afafaf0000afaf00afafaf00afafaf00af af0000afaf0000afaf0000afaf0000afaf00afafaf00fcaf0000eeaf0edf df64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdf d5af01646480aff8af0564df6464af00fcaffc00fcaffd0007af0000afaf 000000fcaf0000f7affd00faaffd00fcaf0b00afafaf00afafaf00afafaf fc00fcaffc00fcaf030000af00fcaf0000eeaf0edfdf64dfaf646400d69d d69d569d000900d6d69d9d9d5656dfdffcaf01dfdfd5af01646480aff8af 0564df6464af00e5af0000b0af0edfdf64dfaf646400d6d69d9d9d560009 00d69dd69d569d56dfdffcaf01dfdfd36480aff8af0564df6464af00e5af 0000b0af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656df dffcaf00dfd26480aff8af0764df6464af000000e9affd00b0af0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcafd1df80aff8 af0364df646492af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d 9d5656dfdffcafd2df006480aff8af0364df646492af0edfdf64dfaf6464 00d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af01646480 aff8af0364df646492af0edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdffcaf01dfdfd5af01646480aff8af0364df646492af0edf df64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdf d5af01646480aff8af0364df646492af0edfdf64dfaf646400d69dd69d56 9d000900d6d69d9d9d5656dfdffcaf01dfdfd5af01646480aff8af0364df 646492af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56df dffcaf01dfdfd5af01646480aff8af0364df646492af0edfdf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6affd00fcaf fd00fcaf0000fbaffd00f6af01646480aff8af0364df646492af0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff6af 0000fcaf090000afafaf0000afaf00f9af0000f6af046464afafaff3df88 af0364df646492af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d 9d5656dfdffcaf01dfdff6af0000fcaf0000fbaf0300afaf00f9af0000f6 af046464afafaff4df0064f9affd00f7af0000fbaffd00faaffa00fdaffa 00b9af0364df646492af0edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf01dfdff6af0400afafaf00f7af0800af000000afaf af00f6af066464afafafdfdff7af016464f9af0000f5af0000f9af0000fa af0000fcaf040000afaf00fcaf010000baaf0364df646492af0edfdf64df af646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af04 00afafaf00f7af080000afaf0000afaf00f6af066464afafafdfdff7af01 6464f9af0000f5af0000f9af0000faaf0000fbaf0300afaf00fbaf0000ba af0364df646492af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d 569d56dfdffcaf01dfdff6af0400afafaf00f7af0000fcaf0300afaf00f6 af066464afafafdfdff7af016464f9af0000fcaffc00fdaf0800af000000 afafaf00faaf0000fbaf0300afaf00fbaf0300afafaffc000aafaf0000af afaf0000afaffc00fcaffd00d7af0364df646492af0edfdf64dfaf646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af0400afafaf 00f7af0000fcaf0300afaf00f6af066464afafafdfdff7af016464f9af14 00afafaf0000afaf0000afaf0000afaf0000afaf00faaf0000fcaf0400af afaf00fcaf1f00afafaf0000afaf0000afaf00afafaf00afaf0000afaf00 00afaf00afafaf00d8af0364df646492af0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdff6af0400afafaf00f7af00 00fcaf0300afaf00f6af066464afafafdfdff7af016464f9af0000f8af03 00afaf00fcaf0300afaf00faaffb00fcaffb00fcaf0000fcaf0a00afafaf 00af00afafaf00fcaf0400afaf0000d5af0364df646492af0edfdf64dfaf 646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af0000 fcaf0000fbaf0300afaf00fcaf0300afaf00f6af066464afafafdfdff7af 016464f9af0000fcaffb0002afaf00fcaf0300afaf00faaf0000fcaf0400 afafaf00fcaf0400afafaf00fcaf0000fcaf0000fcaffa00fdaffd00d7af 0364df646492af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d56 9d56dfdffcaf01dfdff6af0000fcaf110000afafaf0000afaf0000afaf00 00afaf00f6af066464afafafdfdff7af016464f9af0c00afafaf0000afaf af00afaf00fcaf0300afaf00faaf0000fbaf0300afaf00fbaf0300afaf00 fcaf0000fcaf0000fcaf0000f6af010000d8af0364df646492af0edfdf64 dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af 0000faaffd00fcaf0800af000000afafaf00f6af066464afafafdfdff7af 016464f9af0400afafaf00fcaf0300afaf00fcaf0300afaf00faaf0000fb af0300afaf00fbaf0300afaf00fcaf0a00afafaf00af00afafaf00f5af00 00d8af0364df646492af0edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf01dfdff6af0000ebaf0000f6af066464afafafdfdf f7af016464f9af1400afafaf0000afaf0000afaf0000afaf0000afaf00fa af0000fcaf040000afaf00fcaf1f0000afaf0000afaf0000afaf00afafaf 00afaf0000afaf0000afaf00afafaf00d8af0364df646492af0edfdf64df af646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af00 00ebaf0000f6af066464afafafdfdff564f9af0000fcaffd000caf0000af 00af000000afafaf00faaffa00fdaffa00fcaffc000aafaf0000afafaf00 00afaffc00fcaffd00d7af0364df646492af0edfdf64dfaf646400d6d69d 9d9d56000900d69dd69d569d56dfdffcaf01dfdff6affd00efaffd00f6af 056464afafafdff464f9af0000edaf0000a4af0364df646492af0edfdf64 dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdfd5af 016464e9af0000edaf0000a4af0364df646492af0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af016464e9affd 00f1affd00a4af0364df646492af0edfdf64dfaf646400d69dd69d569d00 0900d6d69d9d9d5656dfdffcaf01dfdfd5af01646480aff8af0364df6464 90df0c64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01 dfdfd5af01646480aff8af0264df648fdf0c64dfaf646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf01dfdfd36480aff8af8b640bdfaf6464 00d6d69d9d9d56000900d69dd69d569d56dfdffcaf00dfd26480aff8af8a df0aaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf 09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af80afceaf0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80af80afceaf09646400d69d d69d569d000900d6d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d 9d56000900d69dd69d569d56dfdfcaaff36480af91af09646400d69dd69d 569d000900d6d69d9d9d5656dfdfcaaff46400dff9affd00f8af0000f9af fc00fbaf0000f9af000080afbdaf09646400d6d69d9d9d56000900d69dd6 9d569d56dfdfcaaf016464f7e201dfdff9af0000f6af0000f9af0300afaf 00fbaf0000f9af0000f0af000080afceaf09646400d69dd69d569d000900 d6d69d9d9d5656dfdfcaaf016464f7e201dfdff9af0000f5af0000fbaf04 00afafaf00faaf0000fbaf0000efaf000080afceaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdfcaaf016464f7e201dfdff9af0000fcaffc 00fdaf0000fbaf0400afafaf00faaf0000fbaf0300afafaffc00fcaffc00 09af000000afafaf00000080afd5af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfcaaf016464f7e201dfdff9af1600afafaf0000afaf0000 afaf0000afafaf0000afafaf00faaf200000afafaf0000afaf0000afaf00 00afaf0000afaf0000af00afafaf00afafaf0080afd6af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfcaaf016464f7e201dfdff9af0000f8 af0800afafaf00afafaf00fcaf0000f9af0800afafaf00afafaf00fcaf03 00afaf00faaf0500afafaf000080afd3af09646400d69dd69d569d000900 d6d69d9d9d5656dfdfcaaf016464f7e201dfdff9af0000fcaffb00fdaf04 00afafaf00fcaf0000f9af0700afafaf00afafaffa0002afaf00faaf0000 fcaffd0080afd5af09646400d6d69d9d9d56000900d69dd69d569d56dfdf caaf016464f7e201dfdff9af0900afafaf0000afafaf00fcaf0200af00fb af0000f8af0200af00fcaf0000f9af0000faaf0000faaf01000080afd6af 09646400d69dd69d569d000900d6d69d9d9d5656dfdfcaaf016464f7e201 dfdff9af0400afafaf00fcaf0000fcaf0200af00fbaf0000f8af0200af00 fcaf0000f9af0000fcaf0200af00f9af000080afd6af09646400d6d69d9d 9d56000900d69dd69d569d56dfdfcaaf016464f7e201dfdff9af0900afaf af0000afaf0000fbaf0000faaf0000f7af0000fbaf170000afaf0000afaf 0000afaf0000af00afafaf00afafaf0080afd6af09646400d69dd69d569d 000900d6d69d9d9d5656dfdfcaaf016464f5dff9af0000fcaffd0002af00 00fcaf0000faaf0000f7af0000faaffc00fcaffc00fdaf060000afaf0000 0080afd5af09646400d6d69d9d9d56000900d69dd69d569d56dfdfcaaf00 64f4dff9af0000ebaf000080afafaf09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfb6af0000ebaf000080afafaf09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfb6affd00efaffd00a6aff3df96af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdf80afc5aff4df0064f9affd00f4 affd00fbaff700bdaf09646400d6d69d9d9d56000900d69dd69d569d56df df80afc5af01dfdff7af016464f9af0000f5af0000fcaf0000f7af0000ec af0000ceaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc5 af01dfdff7af016464f9af0000f5af0000fcaf0000f7af0000ecaf0000ce af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc5af01dfdf f7af016464f9af0000fcaffc0008afaf000000afafaf00f7af0000faaffc 0006afaf0000afafaffb0002afaf00fcaf0700af00af0000afaffc00e2af 09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc5af01dfdff7 af016464f9af0c00afafaf0000afaf0000afaf00fcaf0000f7af0000fbaf 130000afaf0000afaf00afafaf00afaf00afafaf00fcaf0c00af0000afaf af0000afaf0000e3af09646400d6d69d9d9d56000900d69dd69d569d56df df80afc5af01dfdff7af016464f9af0000f8af0300afaf00fcaf0000f7af 0000fbaf0000fcaf0e00afafaf00af00afafaf00afafaf00fcaf0200af00 fcaf0000fcaf0000e3af09646400d69dd69d569d000900d6d69d9d9d5656 dfdff9aff36480afd9af01dfdff7af016464f9af0000fcaffb0002afaf00 fcaf0000f7af0000fbaffa00fcaf0000fcaf0400afafaf00fcaf0200af00 fcaffa00e3af09646400d6d69d9d9d56000900d69dd69d569d56dfdff9af f46400dff9affd00f1affd00faaff900f0af0000eaaf010000fbaf0000de af0000d4af01dfdff7af016464f9af0c00afafaf0000afafaf00afaf00fc af0000f7af0000fbaf0000f7af0000fcaf0400afafaf00fcaf0200af00fc af0000deaf09646400d69dd69d569d000900d6d69d9d9d5656dfdff9af01 6464f7e201dfdff9af0000edaf0000faaf0000eaaf0000eaaf0200af00fc af0000deaf0000d4af01dfdff7af016464f9af0400afafaf00fcaf0300af af00fcaf0000f7af0000fbaf0000f8af0a00af00afafaf00afafaf00fcaf 0200af00fcaf0000deaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdff9af016464f7e201dfdff9af0000edaf0000faaf0000d3af0200af00 fcaf0000deaf0000d4af01dfdff7af016464f9af0c00afafaf0000afaf00 00afaf00fcaf0000f7af0000fbaf1a0000afaf0000afaf00afafaf00afaf 00afafaf0000afaf0000af00fcaf050000afaf0000e3af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdff9af016464f7e201dfdff9af0000fc affc0002afaf00fbaf0300afaf00faaf0000f8affc00fcaffc0009afaf00 afaf00af000000fcaffd0001af00faaf0a00afaf00afafaf00afafaffc00 fdaf0c00af0000af00af0000afaf0000fcaffc00fdaf0600afafaf000000 daaf01dfdff564f9af0000fcaffd0009af0000afaf0000afaf00f7af0000 faaffc0015afaf0000afafaf0000afaf0000afaf000000af00af00fbaffc 00e2af09646400d6d69d9d9d56000900d69dd69d569d56dfdff9af016464 f7e201dfdff9af0b00afafaf0000afaf0000af00fbaf0300afaf00faaf00 00f9af1f0000afaf0000afaf0000afaf0000af00afaf0000afaf0000afaf 0000afaf0000faaf3100afaf00afafaf00afaf0000afaf0000afaf0000af afaf0000afaf0000afaf00afaf0000afaf0000afaf00afaf00afafaf00db af00dff464f9af0000f0af0000afaf09646400d69dd69d569d000900d6d6 9d9d9d5656dfdff9af016464f7e201dfdff9af0000f8af0b00afaf00afaf af00afafaf00faaffa00f9af0300afaf00faaf0300afaf00fcaf0300afaf 00fcaf0000faaf0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf0800 afafaf00afafaf00f9af0700afaf00afaf0000c4af0000f0af0000afaf09 646400d6d69d9d9d56000900d69dd69d569d56dfdff9af016464f7e201df dff9af0000fcaffb000aafaf00afafaf00afafaf00faaf0000f8affb0002 afaf00faaf0300afaf00fcaf0300afaf00fcaf0000faaf0a00afafaf00af af00afaf00fcaf0300afaf00fcaf0b00afafaf00afafaf00afafaffb0008 afaf00afafaf000000c6affd00f4affd00afaf09646400d69dd69d569d00 0900d6d69d9d9d5656dfdff9af016464f7e201dfdff9af1400afafaf0000 afafaf00afaf00afafaf00afafaf00faaf0000f9af080000afafaf00afaf 00faaf0300afaf00fcaf0300afaf00fcaf0000faaf0000fcaf0500af00af af00fcaf0300afaf00fcaf1300afafaf00afafaf00afaf0000afafaf00af af00fbaf01000080afe4af09646400d6d69d9d9d56000900d69dd69d569d 56dfdff9af016464f7e201dfdff9af0400afafaf00fcaf0600afafaf00af 00fcaf0000faaf0000f9af0000fcaf0300afaf00fcaf0500af00afaf00fc af0300afaf00fcaf0000faaf0000fcaf0500af00afaf00fcaf0300afaf00 fcaf0b00afafaf00afafaf00afaf00fcaf0300afaf00faaf000080afe4af 09646400d69dd69d569d000900d6d69d9d9d5656dfdff9af016464f7e201 dfdff9af0f00afafaf0000afaf0000afafaf00af00fcaf0000faaf0000f9 af120000afaf0000afaf0000afaf0000af00afaf00fcaf0800afaf0000af af0000faaf0000fbaf0c0000afaf0000afaf0000afaf00fcaf1a00afafaf 00afafaf00afaf0000afaf0000afaf00afaf00afafaf0080afe4af096464 00d6d69d9d9d56000900d69dd69d569d56dfdff9af016464f5dff9af0000 fcaffd0006af0000afafaf00fbaf0000faaf0000f8affd0004af0000afaf fc0005afaf00afaf00fcaf0800afafaf000000af00faaf0000fbaf040000 afafaffc00fdaf0000fcaf1900afafaf00afafaf00afafaf000000af0000 af00afafaf00000080afe3af09646400d69dd69d569d000900d6d69d9d9d 5656dfdff9af0064f4dff9af0000edaf0000d3af000080afacaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdfe5af0000edaf0000d8af0500 00afaf0000a3aff3df96af09646400d69dd69d569d000900d6d69d9d9d56 56dfdfe5affd00f1affd00d7affc00a2aff4df0064f9affd00f4affd00fd affd00f7affd00c1af09646400d6d69d9d9d56000900d69dd69d569d56df df80afc5af01dfdff7af016464f9af0000f4af0a0000afafaf0000afafaf 00f9af060000afafaf0000c3af09646400d69dd69d569d000900d6d69d9d 9d5656dfdf80afc5af01dfdff7af016464f9af0000f4af0000fbaf0400af afaf00f9af0000fbaf0000c3af09646400d6d69d9d9d56000900d69dd69d 569d56dfdf80afc5af01dfdff7af016464f9af0000fcaffc00fdaf0000f6 af0000faaf0000f6affc00fdaf0400af000000fcaffc00fdaffc0002afaf 00fbaf0200afaffc00f0af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80afc5af01dfdff7af016464f9af0c00afafaf0000afaf0000afaf 00f6af0000faaf0000f7af1e0000afaf0000afaf0000afaf0000afaf0000 afaf0000af0000afaf0000af00fbaf0700af0000afaf0000f1af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80afc5af01dfdff7af016464 f9af0000f8af0300afaf00f6af0000faaf0000f7af0000fcaf0300afaf00 fcaf0300afaf00f5af0a00afaf00afafaf00afaf00fcaf0000f1af096464 00d69dd69d569d000900d6d69d9d9d5656dfdff9aff3df80afd9af01dfdf f7af016464f9af0000fcaffb0002afaf00f6af0000faaf0000f7af0000fc af0300afaf00fcaf0300afaf00f9affb0008afaf00afafaf00afaffa00f1 af09646400d6d69d9d9d56000900d69dd69d569d56dfdff9aff4df0064f9 affd00f7af0400af000000f8affd00fcaf0000ecaf0000f1af0000faaf00 00adaf01dfdff7af016464f9af0c00afafaf0000afafaf00afaf00f6af00 00faaf0000f7af0000fcaf0300afaf00fcaf0300afaf00faaf0f0000afaf af00afaf00afafaf00afaf00ecaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdff9af01dfdff7af016464f9af0000f5af0400afafaf00faaf 090000afafaf0000afaf00ecaf0000f1af0000faaf0000adaf01dfdff7af 016464f9af0400afafaf00fcaf0400afafaf00fbaf0400afafaf00f9af00 00fbaf0300afaf00fcaf0300afaf00fcaf0300afaf00fcaf0200af00fcaf 0a00afafaf00af00afafaf00ecaf09646400d6d69d9d9d56000900d69dd6 9d569d56dfdff9af01dfdff7af016464f9af0000f5af0400afafaf00faaf 0000fbaf0300afaf00ecaf0000f1af0000a6af01dfdff7af016464f9af17 00afafaf0000afaf0000afafaf0000afafaf0000afafaf00f9af110000af afaf0000afaf0000afaf0000afaf00fcaf1e00afaf0000afaf0000af0000 afaf0000afafaf00af00afafaf0000afaf0000f1af09646400d69dd69d56 9d000900d6d69d9d9d5656dfdff9af01dfdff7af016464f9af0000fcaffc 00fdaf0400afafaf00faaf0000f8af0400af000000fcaffc00fcaffd0004 af00afafaffc00f8af0000faaf0700afaf00af000000fcaffc00fcaffd00 c3af01dfdff564f9af0000fcaffd0002af0000fcaffd00fbaf0000f7affd 00fbaffc00fdaf0000fcaf0300afafaffc00fdaffd0006af0000afafaf00 fbaffc00f0af09646400d6d69d9d9d56000900d69dd69d569d56dfdff9af 01dfdff7af016464f9af1000afafaf0000afaf0000afaf00afafaf00f9af 010000faaf1d0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf 0000afaf0000f9af0000faaf1700afaf0000afaf0000afaf0000afaf0000 afaf00afafaf00c4af00dff464f9af0000eaaf0000b5af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdff9af01dfdff7af016464f9af0000f8 af0700afaf00afafaf00f7af010000fcaf0000fcaf0000f9af0300afaf00 fcaf0300afaf00fcaf0000f9af0000faaf0300afaf00fcaf0300afaf00fc af0400afaf0000adaf0000eaaf0000b5af09646400d6d69d9d9d56000900 d69dd69d569d56dfdff9af01dfdff7af016464f9af0000fcaffb0006afaf 00afafaf00f5af040000afaf00fcaf0300afafaffb0002afaf00fcaf0200 afaffa00f9af0000faaf0300afaf00fcaf0200afaffa00fdaffd00afaffd 00eeaffd00b5af09646400d69dd69d569d000900d6d69d9d9d5656dfdff9 af01dfdff7af016464f9af1000afafaf0000afafaf00afaf00afafaf00f4 af0300afaf00fcaf0b00afaf0000afafaf00afaf00fcaf0300afaf00f4af 0000faaf0300afaf00fcaf0300afaf00f6af01000080afcdaf09646400d6 d69d9d9d56000900d69dd69d569d56dfdff9af01dfdff7af016464f9af04 00afafaf00fcaf0700afaf00afafaf00faaf0000fbaf0300afaf00fcaf03 00afaf00fcaf0300afaf00fcaf0300afaf00f4af0000faaf0300afaf00fc af0300afaf00f5af000080afcdaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdff9af01dfdff7af016464f9af1000afafaf0000afaf0000af af00afafaf00faaf090000afafaf0000afaf00fcaf1800afaf0000afaf00 00afaf0000afaf0000afaf0000afaf0000f9af0000faaf0300afaf00fcaf 0f00afaf0000afaf0000afaf00afafaf0080afcdaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdff9af01dfdff564f9af0000fcaffd0008af 0000af00afafaf00f8affd00fcaf0000fcaf1300afafaf000000af0000af af000000af00afafaffc00f8affa0004af00afaf00fcaf0300afafaffc00 fcaffd0080afccaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf f9af00dff464f9af0000f1af000080af80affaaf09646400d6d69d9d9d56 000900d69dd69d569d56dfdfe5af0000f1af000080af80affaaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdfe5affd00f5affd0080af80af faaf09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af80afceaf 09646400d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf80af80afceaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80af80afceaf09646400d69dd69d 569d000900d6d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56 000900d69dd69d569d56dfdf80af80afceaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56000900d6 9dd69d569d56dfdf80af80afceaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56000900d69dd69d56 9d56dfdf80af80afceaf09646400d69dd69d569d000900d6d69d9d9d5656 dfdffcafc86480af8aaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdffcafc96400df80af8aaf09646400d69dd69d569d000900d6d69d9d9d 5656dfdffcaf016464ccaf01dfdf80af8aaf09646400d6d69d9d9d560009 00d69dd69d569d56dfdffcaf016464ccaf01dfdf80af8aaf09646400d69d d69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf80af8aaf 09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01 dfdf80afe3af010000fbaf0000deaf0300afaf00d5af09646400d69dd69d 569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf80afe3af0200 af00fcaf0000deaf0300afaf00d5af09646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf016464ccaf01dfdf80afe3af0200af00fcaf0000de af0000d2af09646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01 6464ccaf01dfdf80afe3af0a00afaf00afafaf00afafaffc00fdaf0c00af 0000af00af0000afaf0000fcaffc00fdaf0400afaf00affa00fdaffc00e3 af09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464f7af 0000d6af07dfdfafafaf000000eeaffd00f9af0000faaf0000ebaf0000fb af0000fbaf0200af00f9af0000faaf0000c0af2d00afaf00afafaf00afaf 0000afaf0000afaf0000afafaf0000afaf0000afaf00afaf0000afaf0000 afaf00afaf00faaf0800afaf0000afaf0000e4af09646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf016464f9affd00d6af05dfdfafafaf00 eaaf0000f9af0000faaf0000ebaf0000fbaf0000fbaf0200af00f9af0700 afaf00afafaf00c0af0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf 0800afafaf00afafaf00f9af0600afaf00afaf00fbaf0400afafaf00fcaf 0000e4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf0164 64f7af0000d6af05dfdfafafaf00eaaf0000f9af0000e4af0000fcaf0200 af00fcaf0000f7af0700afaf00afafaf00c0af0a00afafaf00afaf00afaf 00fcaf0300afaf00fcaf0b00afafaf00afafaf00afafaffb0005afaf00af af00fcaf0000fcaffa00e4af09646400d69dd69d569d000900d6d69d9d9d 5656dfdffcaf016464f7af0000d6af05dfdfafafaf00fcaffc000eafaf00 afafaf00afafaf00afafaf00f9af0000faaf0700afaf00af000000fcaffc 00f9af2000afafaf00af00afafaf00afaf00afafaf000000af00af000000 afaf00af000000c4af0000fcaf0500af00afaf00fcaf0300afaf00fcaf1a 00afafaf00afafaf00afaf0000afafaf00afaf00afaf00afafaf00fbaf00 00dfaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464 f7af0000d6af1cdfdfafafaf00afafaf0000afaf0000af00afafaf00afaf af00afafaf00f9af0000faaf1000afaf0000afaf0000afaf0000afaf0000 faaf2100afafaf00af00afafaf00afaf00afaf0000afaf0000afaf00afaf af0000afaf0000c5af0000fcaf0500af00afaf00fcaf0300afaf00fcaf0b 00afafaf00afafaf00afaf00fcaf0900afaf00afaf00afaf00faaf0000df af09646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464f7af 0000d6af05dfdfafafaf00f8af0e00af00afafaf00afafaf00afafaf00f9 af0000faaf0300afaf00fcaf0300afaf00fcaf0000faaf1000afafaf00af 00afafaf00afaf00afaf00fcaf0700afaf00afafaf00fcaf0000c5af0000 fbaf0c0000afaf0000afaf0000afaf00fcaf1800afafaf00afafaf00afaf 0000afaf0000afaf00afaf00af00f9af050000afaf0000e4af09646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf016464f7af0000d6af05df dfafafaf00fcaffb0008afaf00afaf00afaf00fcaf0000f9af0000faaf03 00afaf00fcaf0200afaffa00f9af0f00af00afafaf00af00afafaf00afaf 00fcaf0700afaf00afafaf00fcaf0000c5af0000fbaf040000afafaffc00 fdaf0000fcaf1700afafaf00afafaf00afafaf000000af0000af00afaf00 affa00fdaffc00e3af09646400d69dd69d569d000900d6d69d9d9d5656df dffcaf016464f7af0000d6af17dfdfafafaf00afafaf0000afafaf00afaf 00afaf00afaf00fcaf0000f9af0000faaf0300afaf00fcaf0300afaf00f4 af0f00af00afafaf00af00afafaf00afaf00fcaf0700afaf00afafaf00fc af000080afecaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffc af016464f7af0000d6af09dfdfafafaf00afafaf00fcaf0900afaf00af00 af00af00fcaf0000f9af0000faaf0300afaf00fcaf0300afaf00f4af0f00 af00afafaf00af00afafaf00afaf00fcaf0700afaf00afafaf00fcaf0000 80afecaf09646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf0164 64f7af0000d6af16dfdfafafaf00afafaf0000afaf0000afafaf00afafaf 00fbaf0000f9af0000faaf0300afaf00fcaf0800afaf0000afaf0000f8af 0000fbaf0000fcaf0f00afaf0000afaf0000afaf00afafaf00fcaf000080 afecaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464 f7af0000d6af05dfdfafafaf00fcaffd0009af0000afaf00afafaf00fbaf 0000f9affa0004af00afaf00fcaf0300afafaffc00f7af0000fbaf0000fc af0f00afafaf000000af00afafaf0000af00fcaf000080afecaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf05dfdfafaf af00eaaf00009caf8b640bdfaf646400d6d69d9d9d56000900d69dd69d56 9d56dfdffcaf016464ccaf05dfdfafafaf00eaaf00009caf8cdf0c64dfaf 646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf07df dfafafaf000000eeaffd009caf8b640bdfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf016464ccaf01dfdf81af8d640ddf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81 af00648faf0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56 dfdffcaf016464ccaf01dfdf81af00648faf0edfdf64dfaf646400d69dd6 9d569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0664af 000000afaffc00fdaf010000fbaf0400af000000faaf010000fbaf0000b6 af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf 016464ccaf01dfdf81af0664af00afafaf00fcaf0500afaf00af00fcaf04 00afafaf00faaf0200af00fcaf0000b6af0edfdf64dfaf646400d69dd69d 569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0664af00 afafaf00fcaf0500afaf00af00fcaf0400afafaf00faaf0200af00fcaf00 00b6af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdf fcaf016464ccaf01dfdf81af0664af00afafaf00fcaf0e00afaf00afaf00 afafaf00afafaf00faaf0a00afaf00afafaf00afafaffc00fdaf0400af00 0000fcaffc00cdaf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d 9d5656dfdffcaf016464ccaf01dfdf81af0664af00afafaf00fcaf0e00af af00afaf00afafaf00afafaf00faaf1f00afaf00afafaf00afaf0000afaf 0000afaf0000afaf0000afaf0000afaf0000ceaf0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf84af09 64df6464af00afafaf00fcaf0e00afaf00afafaf00afaf00afafaf00faaf 0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000 ceaf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffc af016464cadf84af0964df6464af00afafaf00fcaf0e00afaf00afafaf00 afaf00afafaf00faaf0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf 0200afaffa00ceaf0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d 569d56dfdffcaf0064c9df84af0964df6464af00afafaf00fcaf0300afaf 00fcaf0600af00afafaf00faaf0000fcaf0500af00afaf00fcaf0300afaf 00fcaf0300afaf00c9af0edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdf80afc8af0964df6464af00afafaf00fcaf0300afaf00fc af0600af00afafaf00faaf0000fcaf0500af00afaf00fcaf0300afaf00fc af0300afaf00c9af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d 569d56dfdf80afc8af0964df6464af00afafaf00fcaf0300afaf00fbaf05 0000afafaf00faaf0000fbaf0c0000afaf0000afaf0000afaf00fcaf0800 afaf0000afaf0000ceaf0edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdf80afc8af0564df6464af00fcaffc00fdaf0000fbaf0500 00afafaf00faaf0000fbaf040000afafaffc00fdaf0000fcaf0300afafaf fc00cdaf0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56df dffcafc86484af0564df6464af00eaaf0000a8af0edfdf64dfaf646400d6 9dd69d569d000900d6d69d9d9d5656dfdffcafc96400df81af0264af00ea af0000a8af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56 dfdffcaf016464ccaf01dfdf81af0464af000000eeaffd00a8af0edfdf64 dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf 01dfdf81af00648f000edfdf64dfaf646400d6d69d9d9d56000900d69dd6 9d569d56dfdffcaf016464ccaf01dfdf81af00648f000edfdf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81 af046400afafaffc0000affc0001afaffb0004af00afafaff90000aff100 03af0000aff70000aff90000afef0000afe7000edfdf64dfaf646400d6d6 9d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af0264 00affc00fdaffc0002af00affc0004af000000aff90000aff10003af0000 aff70000aff90000afef0000afe7000edfdf64dfaf646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af026400affa00 00affc0002af00affc0004af000000aff90000aff10000afec0000afef00 00afe7000edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56df dffcaf016464ccaf01dfdf81af026400affa0000affc000baf0000af0000 00af000000aff90007af0000af00afafaffc00fdaf0600af0000af00affb 000daf00af000000afafaf00af0000affc0002af0000fcaffd0000afe700 0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01 6464f7af0000d6af01dfdf81af026400affa0000affc000baf0000af0000 00af000000aff90015af0000afaf0000afaf0000afaf0000afaf0000af00 affb000daf00af0000afaf0000afaf0000affc000aaf00afaf0000afaf00 00afe7000edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56df dffcaf016464f9affd00d6af07dfdfafafaf000000f7af0000faaffd00fa af010000fbaf0000deaf0000f9af0000deaf0000f6af026400affa0000af fc000baf000000af0000af000000aff90003af0000affc0003af0000affc 0010af0000af0000af000000af0000af0000affc0003af0000affc0000af fa0003af0000afe7000edfdf64dfaf646400d69dd69d569d000900d6d69d 9d9d5656dfdffcaf016464f7af0000d6af05dfdfafafaf00f5af0000f8af 0000faaf0200af00fcaf0000deaf0000f9af0000e2af0400afafaf00f6af 026400affa0000affc000baf000000af0000af000000aff90003af0000af fc0003af0000affc0010af0000af0000af000000af0000af0000affc0003 af0000affc0002af0000fbaf020000afe7000edfdf64dfaf646400d6d69d 9d9d56000900d69dd69d569d56dfdffcaf016464f7af0000d6af05dfdfaf afaf00f5af0000f8af0000faaf0200af00fcaf0000deaf0000f9af0000e2 af0400afafaf00f6af026400affa0000affc0000affc0006af00af000000 aff90003af0000affc0003af0000affc0010af0000af0000af000000af00 00af0000affc0003af0000affc000aaf00afaf000000af0000afe7000edf df64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464 f7af0000d6af05dfdfafafaf00fcaffc00fdaf0400af000000fcaf0000fa af0a00afaf00afafaf00afafaffc00fdaf0c00af0000af00af0000afaf00 00fcaffc00fdaf0000f9af0000f9affc00fdaf0400af000000fcaffd000c af00af000000afaf00af000000faaf026400affa0000affc0000affc0006 af00af000000aff90003af0000affc0003af0000affc0010af0000af0000 00af00af000000af0000affc0003af0000affc0002af00affc0003af0000 afe7000edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdf fcaf016464f7af0000d6af1adfdfafafaf00afafaf0000afaf0000afaf00 00afaf0000afafaf00faaf2a00afaf00afafaf00afaf0000afaf0000afaf 0000afafaf0000afaf0000afaf00afaf0000afaf0000afaf00f9af0000fa af210000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00afafaf 0000afaf0000fbaf026400affa0000affc0000affb0005afaf000000aff9 0003af0000affc002faf0000afaf0000afaf0000af000000af00af000000 af0000afaf0000afaf0000afaf0000afaf00afaf0000afaf0000afe7000e dfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf0164 64f7af0000d6af05dfdfafafaf00f8af0300afaf00fcaf0400afafaf00fa af0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf0800afafaf00afaf af00f9af0300afaf00f9af0000faaf0000fcaf0300afaf00fcaf0300afaf 00fcaf0700afaf00afafaf00fcaf0000fbaf026400affa0000affc0000af fb0005afaf000000aff90003af0000affc000baf000000afafaf00af0000 affc0000affc001aaf000000afafaf00af000000afafaf00af0000afafaf 00afaf00afe7000edfdf64dfaf646400d6d69d9d9d56000900d69dd69d56 9d56dfdffcaf016464f7af0000d6af05dfdfafafaf00fcaffb0002afaf00 fcaf0400afafaf00faaf0a00afafaf00afaf00afaf00fcaf0300afaf00fc af0b00afafaf00afafaf00afafaffb0002afaf00f9af0000faaffa0002af af00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000fbaf026400af ea0000afa8000edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d56 56dfdffcaf016464f7af0000d6af11dfdfafafaf00afafaf0000afafaf00 afaf00fcaf0400afafaf00faaf0000fcaf0500af00afaf00fcaf0300afaf 00fcaf1300afafaf00afafaf00afaf0000afafaf00afaf00f9af0000faaf 0000f9af0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000fbaf 026400afea0000afa8000edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf016464f7af0000d6af09dfdfafafaf00afafaf00fc af0300afaf00fcaf0400afafaf00faaf0000fcaf0500af00afaf00fcaf03 00afaf00fcaf0b00afafaf00afafaf00afaf00fcaf0300afaf00f9af0000 faaf0000f9af0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000 fbaf046400afafafee00fdafa8000edfdf64dfaf646400d69dd69d569d00 0900d6d69d9d9d5656dfdffcaf016464f7af0000d6af11dfdfafafaf00af afaf0000afaf0000afaf00fcaf0400afafaf00faaf0000fbaf0c0000afaf 0000afaf0000afaf00fcaf1300afafaf00afafaf00afaf0000afaf0000af af00f9af0000faaf080000afaf0000afaf00fcaf0f00afaf0000afaf0000 afaf00afafaf00fcaf0000fbaf00648faf0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf016464ccaf05dfdfafafaf00fcaf fd0004af0000af00fcaf0400afafaf00faaf0000fbaf040000afafaffc00 fdaf0000fcaf1300afafaf00afafaf00afafaf000000af0000af00f9affa 0001afaffc00fdaf0000fcaf0f00afafaf000000af00afafaf0000af00fc af0000fbaf00648faf0edfdf64dfaf646400d69dd69d569d000900d6d69d 9d9d5656dfdffcaf016464ccaf05dfdfafafaf00ecaf0000acaf0000efaf 0664af000000afaffc00fdaf010000fbaf0400af000000f8affd00b3af0e dfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf0164 64ccaf05dfdfafafaf00ecaf0000b1af050000afaf0000efaf0664af00af afaf00fcaf0500afaf00af00fcaf0400afafaf00faaf060000afafaf0000 b5af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffc af016464ccaf07dfdfafafaf000000f0affd00b0affc00eeaf0664af00af afaf00fcaf0500afaf00af00fcaf0400afafaf00faaf0000fbaf0000b5af 0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01 6464ccaf01dfdf81af0264af00f8af0e00afaf00afaf00afafaf00afafaf 00faaf0000f7affc00fcaffd0004af00afaf00fcaf0200afaffc00fdaf04 00af000000fcaffc00fdaffc00eaaf0edfdf64dfaf646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0264af00f9af 0f00afafaf00afaf00afafaf00afafaf00f9af010000faaf100000afaf00 00afaf0000afaf0000afaf00fcaf1e00af0000afaf0000afaf0000afaf00 00afaf0000afaf0000af0000afaf0000ebaf0edfdf64dfaf646400d6d69d 9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af0264af 00faaf0000fcaf0b00afafaf00afaf00afafaf00f7af010000fcaf0000fc af0300afaf00fcaf0300afaf00fcaf0200af00fcaf0300afaf00fcaf0300 afaf00faaf0000fcaf0000ebaf0edfdf64dfaf646400d69dd69d569d0009 00d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0264af00fbaf0000 fbaf0b00afafaf00afaf00afafaf00f5af030000afaffa0002afaf00fcaf 0300afaf00fcaf0100affa0002afaf00fcaf0300afaf00faaffa00ebaf0e dfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf0164 64ccaf01dfdf81af0264af00fcaf0000faaf0000fcaf0600af00afafaf00 f4af0300afaf00f9af0000fcaf0300afaf00fcaf0200af00f9af0000fcaf 0300afaf00faaf0000e6af0edfdf64dfaf646400d69dd69d569d000900d6 d69d9d9d5656dfdffcaf016464cadf81af0664af00afafaf00f9af0000fc af0600af00afafaf00faaf0000fbaf0300afaf00f9af0000fcaf0300afaf 00fcaf0200af00f9af0000fcaf0300afaf00fcaf0200af00e6af0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf0064c9df81 af0664af00afafaf00f9af0000fbaf050000afafaf00faaf280000afafaf 0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000af0000af af0000afaf00fcaf0f00afaf0000afaf0000af0000afaf0000ebaf0edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc8af0864 df6464af00afafaffa0002afaf00fbaf050000afafaf00f8affd00fbaffc 00fcaffd000baf00afafaf000000af00afaffc00fdaf0000fcaf0300afaf affc00fdaffc00eaaf0edfdf64dfaf646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80afc8af0564df6464af00eaaf0000e4af0000c5af0edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc8af0564 df6464af00eaaf0000e4af0000c5af0edfdf64dfaf646400d6d69d9d9d56 000900d69dd69d569d56dfdffcafc86484af0764df6464af000000eeaffd 00e4af0000c5af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d 5656dfdffcafc96400df84af0364df64648faf0edfdf64dfaf646400d6d6 9d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf84af0364 df64648faf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656 dfdffcaf016464ccaf01dfdf84af0964df6464af000000afaffc00fdaf01 0000fbaf0400af000000faaf0000fbaf0000b5af0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf84af09 64df6464af00afafaf00fcaf0500afaf00af00fcaf0400afafaf00faaf00 00fcaf0000b4af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d 5656dfdffcaf016464ccaf01dfdf81af0664af00afafaf00fcaf0500afaf 00af00fcaf0400afafaf00faaf0400afafaf00b3af0edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af 0264af00f8af0e00afaf00afaf00afafaf00afafaf00faaf0300afaf00fa affc00fcaffc00fdaf0400af000000ccaf0edfdf64dfaf646400d69dd69d 569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0264af00 f8af0e00afaf00afaf00afafaf00afafaf00faaf0200af00faaf150000af af0000afaf0000afaf0000afaf0000afaf0000cdaf0edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af 0264af00fbaffd00fdaf0b00afafaf00afaf00afafaf00faaffd00faaf00 00fcaf0300afaf00fcaf0300afaf00fcaf0000cdaf0edfdf64dfaf646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464f7af0000fbaffc 00dfaf01dfdf81af0264af00f8af0e00afaf00afafaf00afaf00afafaf00 faaf0300afaf00fbaffa0001afaffa0002afaf00fcaf0000cdaf0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464f9af fd00fcaf0000fcaf0000e0af01dfdf81af0264af00f8af0300afaf00fcaf 0600af00afafaf00faaf0400afafaf00fcaf0000f9af0000f9af0000fcaf 0000cdaf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656df dffcaf016464f7af0000fcaf0000fcaf0000e0af01dfdf81af0664af00af afaf00fcaf0300afaf00fcaf0600af00afafaf00faaf0000fcaf0400afaf af00f9af0000f9af0000fcaf0000cdaf0edfdf64dfaf646400d6d69d9d9d 56000900569d569d569d56dfdffcaf016464f7af0000fcaf0000fcaf0000 e0af01dfdf81af0664af00afafaf00fcaf0300afaf00fbaf050000afafaf 00faaf0000fbaf1800afaf0000afaf0000afaf0000afaf0000afaf0000af af0000cdaf0edfdf64dfaf646400d69dd69d569d000000fc56049d5656df dffcaf016464f7af0000fcaf0000fcaf0000e0af01dfdf81af0264af00fc affc00fdaf0000fbaf050000afafaf00faaf0000faaf0200afaffc00fcaf fc00fdaf0400af000000ccaf09dfdf64dfaf646400d6d6fc56ff000000fc d604569d56dfdffcaf016464f7af0000fcaf0000fcaf0000e0af07dfdfaf afaf000000f2af0400af000000faaffa00eaaf0000f5affb00fbaf0000f7 af0000ddaf0264af00eaaf0000e1af0000c8af09dfdf64dfaf646400d69d fcd6ff000900d6d6d69d9d5656dfdffcaf016464f7af0000fcaf0000fcaf 0000e0af05dfdfafafaf00f0af0400afafaf00faaf0000fcaf010000f6af 0000f6af0000f5af0000fcaf050000afafaf00f7af0000ddaf0264af00ea af0000e1af0000c8af0edfdf64dfaf646400d6d69dd6d6d6000900d69dd6 9d569d56dfdffcaf016464f7af0000fcaf0000fcaf0000e0af05dfdfafaf af00f0af0400afafaf00faaf0000fbaf0000f6af0000f6af0000f5af0000 fbaf0000cfaf0464af000000eeaffd00e1af0000c8af0edfdf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464f7af0000fcaf 0000fcaf0000e0af05dfdfafafaf00fcaffc00fcaffd0005af00afafaf00 faaf0000fbaf0300afafaffc0007afaf000000afafaffc0006afaf00af00 0000f9af0000faaf0600afaf00afafaffc0009afaf00afaf00af000000fc affd0001af00edaf00648faf0edfdf64dfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf016464f7af0000fcaf0000fcaf0000e0af1adf dfafafaf00afafaf0000afaf0000afaf0000afaf0000afafaf00faaf0000 fcaf1c0000afaf0000afaf0000afaf00afafaf0000afaf0000af0000afaf 0000faaf0000faaf1d00afaf00afaf0000afaf0000af00afaf0000afaf00 00afaf0000afaf0000edaf00648faf0edfdf64dfaf646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf016464f7af0000fbaffc00dfaf05dfdf afafaf00f8af0300afaf00fcaf0400afafaf00faaffa00f8af0700afaf00 afafaf00faaf0000fcaf0000faaf0000faaf0600afaf00afaf00faaf0300 afaf00fcaf0300afaf00fcaf0000edaf00648faf0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf05dfdfafafaf 00fcaffb0002afaf00fcaf0400afafaf00faaf0000f7affb0006afaf00af afaf00faaf0000fcaf0000faaf0000faaf0600afaf00afaf00faaf0300af af00fcaf0300afaf00fcaf0000edaf00648faf0edfdf64dfaf646400d69d d69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf11dfdfafafaf00 afafaf0000afafaf00afaf00fcaf0400afafaf00faaf0000f8af0c0000af afaf00afaf00afafaf00faaf0000fcaf0000faaf0000faaf0600afaf00af af00faaf0300afaf00fcaf0300afaf00fcaf0000edaf00648faf0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf 09dfdfafafaf00afafaf00fcaf0300afaf00fcaf0400afafaf00faaf0000 f8af0000fcaf0700afaf00afafaf00fcaf0200af00fcaf0000faaf0000fb af0700afafaf00afaf00fcaf0500af00afaf00fcaf0300afaf00fcaf0000 edaf00648faf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d56 56dfdffcaf016464ccaf1adfdfafafaf00afafaf0000afaf0000afaf0000 afaf0000afafaf00faaf0000f8af130000afaf0000afaf00afafaf0000af af0000af00fcaf0000faaf0000fcaf120000afafaf00afaf0000afaf0000 af00afaf00fcaf0800afaf0000afaf0000edaf00648faf0edfdf64dfaf64 6400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf05dfdf afafaf00fcaffd000daf0000afaf000000af00afafaf00faaf0000f7affd 0008af0000afaf0000afaffc0002afaf00fcaf0000faaffb00fbaf0300af afaffc0005afaf00afaf00fcaf0800afafaf000000af00edaf00648faf0e dfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf0164 64ccaf05dfdfafafaf00ecaf0000aeaf0000edaf00648faf0edfdf64dfaf 646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf05df dfafafaf00ecaf0000b3af050000afaf0000edaf00648faf0edfdf64dfaf 646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf07df dfafafaf000000f0affd00b2affc00ecaf00648faf0edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af 00648faf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656df dffcaf016464cadf81af00648faf0edfdf64dfaf646400d6d69d9d9d5600 0900d69dd69d569d56dfdffcaf0064c9df81af00648faf0edfdf64dfaf64 6400d69dd69d569d000900d6d69d9d9d5656dfdf80afc5af00648ddf0c64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc5af8cdf0c 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc5af8b64 0bdfaf646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc5af8adf 0aaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80648064cc640700d6 9dd69d569d000800d6d69d9d9d5656df80648064cb640700d6d69d9d9d56 000700d69dd69d569d5680008000c90006d69dd69d569d000600d6d69d9d 9d5680d680d6c6d6fd9d0156007f00d69dd69d569dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d6459dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69d569d000200d6d6e49d0156d6809d809dfc9d0156d6 e39d0156000300d69dd6e59d0256d6d6809d809dfd9d0256d6d6e59d0256 9d007f00d6d69d569d569d569d569d569d569d569d569d569d569d569d56 9d569d5656d6d6569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d7f569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d45569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d5656d6 d6569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 000100d6e25601d6d680568056fc5601d6d6e356ff0080008000ba00 grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.5/doc/figs/command.eps0000644000175000017500000014554312310162276014131 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: blah-000.ps %%Creator: pnmtops %%CreationDate: 12. Mär 17:51 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 197 342 414 450 %%HiResBoundingBox: 197.999994 342.719990 413.999987 449.279986 %%EndComments %%BeginProlog %%BeginPreview: 216 106 8 636 % 32323232323232323232323232327432323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % bb323232323232323232323232323274 % 32327474747474747474747474747432747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % bb327474747474747474747474747474 % 3232bbbbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb74747474 % 7474747474747474bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbb % bbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474 % bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb74747474 % 7474747474747474bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbb % bbbbbbbb747474747474747474747474 % 3232bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffff747474 % 3232bbff323232323232323274747432747474747474747432323232323232323232323274747474 % 74747474747474743232323232323232323232327474747474747474747474743232323232323232 % 32323232747474747474747474747474323232323232323232323232747474747474747474747474 % 32323232323232323232323274747474747474747474747432323232323232323232323274747474 % 74747474747474743232323232323232323232327474747474747474747474743232323232323232 % 743232327474747474747474ff747474 % 327474ff74747474747474747474bb327474747474747474ffff7474747474747474747474747474 % 7474747474747474747474747474ff74747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474bb3274747474747474747474 % bb7474ff7474747474ff74bbff3274bb % 327474ff74747474747474747474bb3274747474747474ff7474ff74747474747474747474747474 % 7474747474747474747474747474ff74747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474bb3274747474747474747474 % bb7474ff7474747474ff74bbff3274bb % 327474ff74747474747474747474bb3274747474747474ff74747474ff74ff74ff74ff7474ffffff % ffff74ff74ff74ff74ff74ff74ffff74ff74ff747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474bb3274747474747474747474 % bb7474ff7474747474ff74bbff3274bb % 327474ff74747474747474747474bb32747474747474ff74747474ff7474ffff74ff74ff74ff74ff % 74ff74ffffff74ff74ff74ff74ff7474ffff74747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474bb3274747474ff7474747474 % bb7474ff7474747474ff74bbff3274bb % 327474ff7474ffffffffffffffffbb32747474747474ff7474ff74ff74ff74ff74ff74ff74ff74ff % 74ffff7474ff74ff74ffff7474ff74ff74ff74747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474bb32747474ffff7474747474 % bb7474ff7474747474ff74bbff3274bb % 327474ff74747474747474747474bb3274747474747474ffff7474ffff7474ff74ff74ffff74ff74 % ff7474ff74ffff74ff7474ff74ff74ffff7474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474bb3274747474747474747474 % bb7474ff7474747474ff74bbff3274bb % 327474ff74747474747474747474bb32747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474bb3274747474747474747474 % bb7474ff7474747474ff74bbff3274bb % 327474ff74747474747474747474bb32747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474bb3274747474747474747474 % bb7474ffffffffffffff74bbff3274bb % 327474ff74747474747474747474bb32747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474bb3274747474747474747474 % bb74747474747474747474bbff3274bb % 747474ffbbbbbbbbbbbbbbbbbbbbbb74bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbff32bbbb % 323274bb282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 282828282828282828282828ff323232 % 327474bb282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 2828282828282828282828aeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060aeff747474 % 3232bbbb286060282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 2828282828282828282860aeff747474 % 3232bbbb28606028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeae602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 327474bb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff3274bb % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606028602860aeff747474 % 3232bbbb28606028ae28282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 2828282828282828602860aeff747474 % 3232bbbb286060286060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060602860aeff747474 % 3232bbbb286060282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 2828282828282828282860aeff747474 % 3232bbbb28606028282828282828282828282860282828282828282828282828ae60606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060aeff747474 % 3232bbbb2860602860606060606060606060ae602828606060606060606060aeae60606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060602828282828282828282828282828 % 282828282828282828ae60aeff747474 % 3232bbbb2860602860606060606060606060ae602828606060606060606060aeae60606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060602828606060606060606060606060 % 6060606060606060aeae60aeff747474 % 3232bbbb2860602860606060606060606060ae602828606060606060606060aeae60606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060602828606060606060606060606060 % 6060606060606060aeae60aeff747474 % 3232bbbb28606028606060ff606060606060ae602828606060606060606060aeae60606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060606060606060606028286060606060606060ff606060 % 6060606060606060aeae60aeff747474 % 327474bb2860602860606060ffffff606060ae602828606060ffffff606060aeae60606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060606060606060606028286060606060606060ff6060ff % 60ff60ff60606060aeae60aeff3274bb % 327474bb2860602860606060ffffff606060ae6028286060ffffffffffff60aeae60606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060606060606060606028286060606060606060ff606060 % 60ffffff60606060aeae60aeff3274bb % 327474bb2860602860606060ffffff606060ae6028286060ffffffffff6060aeae60606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060606060606060606028286060606060606060ff6060ff % 60ff60ff60606060aeae60aeff3274bb % 327474bb2860602860606060ffffff606060ae602828606060ffffff606060aeae60606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060602828606060606060606060606060 % 6060606060606060aeae60aeff3274bb % 327474bb2860602860606060ffffff606060ae60282860606060ff60606060aeae60606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060602828606060606060606060606060 % 6060606060606060aeae60aeff3274bb % 327474bb2860602860606060606060606060ae602828606060606060606060aeae60606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060602828606060606060606060606060 % 6060606060606060aeae60aeff3274bb % 327474bb28606028aeaeaeaeaeaeaeaeaeaeae6028aeaeaeaeaeaeaeaeaeaeaeae60606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060606060606060606028aeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeae60aeff3274bb % 327474bb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060aeff3274bb % 327474bb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060aeff3274bb % 327474bb286060aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeae6060aeff3274bb % 327474bb286060ae6060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060286060aeff3274bb % 327474bb286060ae6060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060286060aeff3274bb % 3232bbbb286060ae6060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060286060aeff747474 % bbbbbbbb286060ae6060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060286060aeff74bbbb % 3232bbbb286060ae6060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060286060aeff743232 % 3232bbbb286060ae6060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060286060aeff747474 % 3232bbbb286060ae6060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060286060aeff747474 % 3232bbbb286060ae6060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060286060aeff747474 % 3232bbbb286060ae6060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060286060aeff747474 % 3232bbbb286060ae6060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060286060aeff747474 % 3232bbbb286060ae6060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060286060aeff747474 % 3232bbbb286060ae6060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060286060aeff747474 % 3232bbbb286060ae2828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 2828282828282828286060aeff747474 % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060aeff747474 % 327474bb28aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeff3274bb % 327474bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffff3274bb % 32747474747474747474747432323232323232323232323274747474747474747474747432323232 % 32323232323232327474747474747474747474743232323232323232323232327474747474747474 % 74747474323232323232323232323232747474747474747474747474323232323232323232323232 % 74747474747474747474747432323232323232323232323274747474747474747474747432323232 % 32323232323232327474747474747474747474743232323232323232323232327474747474747474 % 747474743232323232323232323274bb % 3274747474747474747474747474bb32747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % bb3274747474747474747474747474bb % 32bbbbbbbbbbbbbbbbbbbbbbbbbbbb32bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bb32bbbbbbbbbbbbbbbbbbbbbbbbbbbb %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice /pop load def %%EndProlog %%Page 1 1 /picstr 1350 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def gsave 198 342.72 translate 216 106.56 scale 450 222 8 [ 450 0 0 -222 0 222 ] { inputf picstr readstring pop } false 3 colorimage 78DAEDDDDB91DB3A1A85D18E5211302DC5D0D9F46BA762955546C1BC09247FF0 86B51E50B6A70F2D6BCAFB7C9238D35F5F006CF253C7F3F97C3C1E3F0007A9BD 42AFEBE72BFAFA69ECF9F82BFFED9C4EA773CFB3F60ABD2E9E5634FD62ACF4F8 9F0047A8B742AF2B0F5BB4D2E3F7DF2370EC8AD6BBF8B045DFEBEA743A9DCEA9 335FCBD116F514399D4EE7FC847E6C51F72D008CDED154D8A2F56E7F02B8A8A9 B59C5AD7A81B03DCE6E4743A0F3CD3106DBFDA8A16F5193D70F5DB93A256287F 91BEB445CF79A71670E3090D0CB0E10A95BF0B3ABAA27BB6E8C6A762EACF727E 577CCC70CB161D5DA1C2BF9EF997BDAF73A116ED8DE7E546C98AC2C95B74C55F E40BB5E87082AE354A26146ED3A2E92B2FD4A2251334FA4A3FFDB4F783A55F53 78FDA97F64F847B8EEFB12A045AFD8A21FD766EA95FE70C7869B56FE35F3D7DF FE65406B2DBAF4F6FE754FC5A2095DB47EE53F2E59ECD1AC2DF9A78090005BF4 12EF242DBA680A7AEB1DF872BE64CA364EE8E8BF0E0AD77B66546D2904B66879 A89CAA45D7BD2A0F6CD11D4274D1D23E977C10664821B645CBFF669DA74557BC A80F69D1F94F6D027FBC22386756F463A3025B5AB4F045FDD93EA35FF1D6E896 CFE8177DA0B37F883E7DAE0407B5E873C95BA3CDDE2F3AD3A595A2F439F1C1FD 7C55BAC709F66FD18D2B74EFFB4501DC2F5AE9A900B4A81605D0A25A14B87A8B AEF8A05C8B025A74C5966A51408B465D67458BA62FDB72BEAEE35BAF3A9DCE45 679ABE90AB45ADD04C8BA69FE6EB9AFE2C1B455D07684AE074445D2A6FD17C5A 5F86BFA3EF3A0D30F5FDE87BD3DAFBD6F3E90B7E01C8F4D6327D93FAFCD7F34C F58C01245DD7E5EF8B8EAE68EFD3284F1A409AD0B4A2859FD1E72BFA0DD0B0EE 9F45F78B5A5180D115D5A20047B56807D08CB47E812DFABE2C400B1F274DADE8 C616F5021F68E4557CBD16F5D21EB8B7F9150D69514F3270EFB743F76951CD0F DC4C1ABD7D5AD4130E34B8A25A14408B026851002D0AA045B528801605D0A200 5A14408B6A51C08A6A51002D0AA04501B4A81505ACA81605D0A2005A14408B5A 51408B6A51002D0AA04501B4288016D5A28015D5A2005A14408B0268512B0A58 512D0AA04501B4288016B5A28016D5A2005A14408B026851002DAA4501B42880 1605D0A2005AD48A0256548B026851002D0AA045AD286045B528801605D0A200 5A14408B6A51002D0AA04501B4288016D5A28015D5A2005A14408B0268512B0A 58512D0AA04501B4288016B5A28016D5A2005A14408B026851002DAA45012BAA 4501B428801605D0A25614B0A25A14408B026851002D6A45012DAA4501B42880 1605D0A2005A548B026851002D0AA04501B4A81505ACA81605D0A2005A14408B 5A51C08A6A51002D0AA04501B4288016D5A2005A14408B026851002DAA45012B AA4501B428801605D0A25614B0A25A14E0542DFA0B7047FBB4A8E71968734543 5A14E0DEEAB52840236AB4A8CE075A7B691FDBA2351E5E8D6B02C4BEBA3F618B A61BA56A5C13A0DE8A9EA145F3DB4D6B5C13B8A2ABBCA20F69D19055AF774DC0 8A06BEBCADD1A25614B8F78AE693B27F8BBE2E18B5A2EF4B0D4F2B0A375ED1C3 1F496F52766ED199AD5BD7A2BD09B5A260458F5DD1AA2DFA311AB528A0456317 4F8B025A74664287A3A74581D52B3A5C80F42BA3E330FF31CD795A747E427B7F 0A2D0AD458D1C2AF3F618B7EFD33BA78F97FAA45817D5AB4374AC3B13A5B8B6E 593C2D0AC4AE68FE83A98D3D558B6E5C3C2D0A2C5AD1A1F9280D5FD14BB468C9 1BAD33EF12005A74B44B0B5FD4DFA3453F4EA815052BBA6845CB1FC96DDE172D 9C502B0A56F4DBFBA24B96F9E33DA840CB2BFAED33FACDCB0CDC7545F771A716 ED5DB6F07F9B0F58D17A2B5AB545A7EE40D8B8A2F3136A45C18ADEA645573C3C FF2FCD8016B5A280165DD4A25D847AD7042EBDA2DD69546AD1D88757E39AC075 57B43B931A2D1AFEF06A5C13B8E88A762713DEA2000D0A6C51002BAA45018E6A D10EA019355AD4B30A346274FAA25A54DE03F7361590512DEA19065A5E512D0A A04501B428801605D0A25A1460638BA69F6A518092164DC1F95ED1C7FFB42860 45675A341FCCFC7DD17C63AD286045A75A34D75B51EF8B0294BC2F3ABAA2DE17 05F8F6193D40FD1675BF28801605D0A2005A14408B6A51002D0AA04501B42880 16B5A28015D5A2005A14408B0268512B0A58D1ED2DFA0BD0804A2DEA89051A5F D12D2D0AD0A0C01605B0A22B5AB403606D8B7ADE0056B7A8270D60758B7E01F0 BFF216FD01604C498BE65FE6743A9DCEE139D3A2B15EBF458DCB021CBE42332D 1AF85BBC1FBF21058E9AD0AA2BD46BD1F4E97CEC991E7FA5EB3B9D4EE7812B94 56F451CDFBF13F000E527585DCB700B0D11F63DEB779 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.5/doc/figs/light.eps0000644000175000017500000007320512310162277013616 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: blah-000.ps %%Creator: pnmtops %%CreationDate: 12. Mär 17:51 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 233 354 379 438 %%HiResBoundingBox: 233.759946 354.720013 378.239965 437.279963 %%EndComments %%BeginProlog %%BeginPreview: 144 82 8 328 % 32323232323232323232323232327432323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 3232323232323232bb323232323232323232323232323274 % 32327474747474747474747474747432747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 7474747474747474bb3274747474747474747474747474bb % 3232bbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb74747474747474747474 % 7474bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb7474 % 74747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbb % bbbbbbbbbbbb747474747474747474747474bbbbbb7474bb % 3232bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffff3274bb % 3232bbff323274747474747474747432747432323232323232323232323274747474747474747474 % 74743232323232323232323232327474747474747474747474743232323232323232323232327474 % 74747474747474747474323232323232323232323232747474747474747474747474323274323232 % 3232323232327474747474747474747474743232ff3274bb % 327474ff74747474747474747474bb3274747474747474ff747474ff7474747474ff747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb747474 % 7474747474747474bb3274ff7474747474747474ff747474 % 327474ff74747474747474747474bb3274747474747474ff7474747474747474ff74747474ff7474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb747474 % 7474747474747474bb3274ff7474747474747474ff747474 % 327474ff74747474747474747474bb32747474747474ff747474ff74ff74ff74ffffffff74ff74ff % 74ff7474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb747474 % 7474747474747474bb3274ff7474747474747474ff747474 % 327474ff74747474747474747474bb32747474747474ff747474ff74ff74ff74ff74ff74ff747474 % ff747474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb747474 % 74ff74ff74747474bb3274ff7474747474747474ff747474 % 327474ff7474ffffffffffffffffbb32747474747474ff747474ffff7474ff74ff74ff74ff74ff74 % 74ff7474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb747474 % 74ffffff74747474bb3274ff7474747474747474ff747474 % 327474ff74747474747474747474bb327474747474ffffffffff7474ff7474ff7474ff74ff7474ff % ff747474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb747474 % 7474747474747474bb3274ff7474747474747474ff747474 % 327474ff74747474747474747474bb327474747474747474747474ff74ff74747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb747474 % 7474747474747474bb3274ff7474747474747474ff747474 % 327474ff74747474747474747474bb32747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb747474 % 7474747474747474bb3274ffffffffffffff7474ff747474 % 327474ff74747474747474747474bb32747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb747474 % 7474747474747474bb3274747474747474747474ff747474 % 747474ffbbbbbbbbbbbbbbbbbbbbbb74bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbff747474 % 323274bb282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 2828282828282828282828282828282828282828ff743232 % 327474bb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff747474 % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606028282828 % 28282828282828282828282828282828282828aeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606028606060 % 606060606060606060606060606060606060aeaeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606028606060 % 606060606060606060606060606060606060aeaeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606028606060 % 606060606060606060606060606060606060aeaeff3274bb % 3232bbbb286060606060606060606060606060606060606060ff606060ff60606060606060606060 % 606060606060606060606060606060606028282828282860606060ffff6060606060606060606060 % 606060606060606060ff60606060ff60606060606060606060ffffff60606060ff60606028606060 % 606060606060606060606060606060606060aeaeff3274bb % 3232bbbb286060606060606060606060606060606060ff6060ffffff60ff60ffff60606060606060 % 60606060606060606060606060606060602860606060ae606060ff6060ff60606060606060606060 % 6060606060606060606060606060ff606060ff606060606060ff60ff606060606060606028606060 % 6060ff606060606060606060606060606060aeaeff3274bb % 3232bbbb2860606060606060606060606060606060ff606060ff606060ff60ff6060606060606060 % 60606060606060606060606060606060602860606060ae60606060ff606060ff60ff60ff60ff6060 % 606060606060606060ffff60ff60ff60ff60ff60ff60606060ff60ff606060606060606028606060 % 606060ff60ffff60ffffff6060ffff606060aeaeff3274bb % 3232bbbb2860606060606060606060606060606060ff606060ff606060ff6060ff60606060606060 % 60606060606060606060606060606060602860606060ae606060606060ff606060ff606060ffff60 % 60ff60606060606060ffff606060ff606060ff6060ff606060ff60ff60ffff606060606028606060 % 606060ff60606060ff606060ff6060606060aeaeff3274bb % 3232bbbb2860606060606060606060606060606060ff60ff60ff606060ff60606060606060606060 % 60606060606060606060606060606060602860606060ae606060ff6060ff606060ff606060ffffff % ffff60606060606060ffff606060ff606060ff606060606060ff60ff606060606060606028606060 % 606060ff60606060ff606060ff6060606060aeaeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606028aeaeaeaeae60606060ffff60606060ff60ffff606060 % 606060606060ffffffff60ff6060ff60606060ff60ff606060ff60ff60ffff606060606028606060 % 6060ff6060ffff60ff606060ff60ff606060aeaeff3274bb % 3232bbbb286060606060606060606060606060606060ffff60606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060ff60ff606060606060606060606060ff6060606060606060606028606060 % 606060606060606060606060606060606060aeaeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606028606060 % 606060606060606060606060606060606060aeaeff3274bb % 327474bb2860ae282828282828282828282828282828282828282828282828282828282828282828 % 28282828286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606028606060 % 606060606060606060606060606060606060aeaeff747474 % 327474bb2860aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeae28286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606028606060 % 606060606060606060606060606060606060aeaeff747474 % 327474bb2860aeae6060606060606060606060606060606060606060606060606060606060606060 % 60606028286060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060606060606060606060606060606060606060aeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeff747474 % 327474bb2860aeae60606060606060606060606060ff6060606060606060ff606060606060606060 % 60606028286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff747474 % 327474bb2860aeae60ffff606060ff60ff6060ff60ff60ffff606060ff60ff606060606060606060 % 60606028286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff747474 % 327474bb2860aeae606060ff6060606060606060ffff606060ff606060ffff606060606060606060 % 60606028286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff747474 % 327474bb2860aeae60ff60ff6060606060606060ffff60606060606060ffff606060606060606060 % 6060602828606060606060606060606060606060606060606060606060606060606060ff60606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff747474 % 327474bb2860aeae60ff60ff606060606060ff60ffff60ff60ff606060ffff606060606060606060 % 60606028286060606060606060606060606060606060ff6060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff747474 % 327474bb2860aeae6060606060606060606060606060606060606060606060606060606060606060 % 606060282860606060606060606060606060ff60ff60ff60ff60ff60ff60ff60606060ff6060ff60 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff747474 % 327474bb2860aeae6060606060606060606060606060606060606060606060606060606060606060 % 606060282860606060606060606060606060ff606060ff60ffffff606060ff60ffff60ff6060ff60 % ff606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff747474 % 327474bb2860aeaeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffff282860606060606060606060606060ff606060ff60ff6060606060ff60606060ff60606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff747474 % 327474bb2860aeaeffff60ffffffffffffffff60ffffffff60ffffffffffffffffffffffffffffff % ffffff282860606060606060606060606060ff60606060ff60ff60606060ff60ffff60ff60ff60ff % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff747474 % 3232bbbb2860aeaeffff60ff60ff60ff60ffff60ffffffffffffffffffffffffffffffffffffffff % ffffff2828606060606060606060606060606060606060606060606060606060606060606060ff60 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff3274bb % 3232bbbb2860aeaeffff60ffffff60ffffffff60ffffffffffffffffffffffffffffffffffffffff % ffffff28286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff3274bb % 3232bbbb2860aeaeffff60ffffff60ffffffff60ffffffffffffffffffffffffffffffffffffffff % ffffff282860606060606060606060aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae2860aeff3274bb % 3232bbbb2860aeaeffff60ff606060ffffffffff60ffffffffffffffffffffffffffffffffffffff % ffffff282860606060606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2828282828282828282828282828 % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860aeff3274bb % 3232bbbb2860aeaeffffffff60ff60ffffffffffffffffffffffffffffffffffffffffffffffffff % ffffff282860606060606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c28606060606060286060606060ae % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860aeff3274bb % 3232bbbb2860aeae6060606060606060606060606060606060606060606060606060606060606060 % 606060282860606060606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c28606060606060286060606060ae % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860aeff3274bb % 3232bbbb2860aeae6060ff60606060606060606060606060ffff6060606060606060606060606060 % 606060282860606060606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c28606060606060286060606060ae % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860aeff3274bb % 3232bbbb2860aeae6060606060606060606060ff606060ff60606060606060606060606060606060 % 606060282860606060606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c28606060606060286060606060ae % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860aeff3274bb % 3232bbbb2860aeae6060ff60ff60ff60ff6060ff6060606060ff6060606060606060606060606060 % 606060282860606060606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c28606060606060286060606060ae % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860aeff3274bb % 3232bbbb2860aeae6060ff606060ff60606060ff60606060ff606060606060606060606060606060 % 606060282860606060606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c28606060606060286060606060ae % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860aeff3274bb % 3232bbbb2860aeae6060ff606060ff60606060ff606060ff60606060606060606060606060606060 % 606060282860606060606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7caeaeaeaeaeaeaeaeaeaeaeaeaeae % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860aeff3274bb % 3232bbbb2860aeae6060ff60ffffff6060606060ff6060ffffff6060606060606060606060606060 % 606060282860606060606060606060ae282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282860aeff3274bb % 327474bb2860aeae60606060ffff6060606060606060606060606060606060606060606060606060 % 60606028286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff747474 % 327474bb2860aeae6060606060606060606060606060606060606060606060606060606060606060 % 60606028286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff747474 % 327474bb2860aeae6060ff6060606060606060ff606060ff60606060606060606060606060606060 % 60606028286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff747474 % 327474bb2860aeae6060ff60ffffff6060ff60ff6060606060606060606060606060606060606060 % 60606028286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff747474 % 327474bb2860aeae6060ff606060ff60606060ff60606060ffff6060606060606060606060606060 % 60606028286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff747474 % 327474bb2860aeae6060ff606060ff60606060ff6060606060606060606060606060606060606060 % 60606028286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff747474 % 327474bb2860aeae6060ff60ff60ff60606060ff606060ff60606060606060606060606060606060 % 60606028286060606060606060606028282828282828282828282828282828282828282828282828 % 28282828282860282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828606060aeff747474 % 327474bb2860aeae606060606060ff60606060606060606060606060606060606060606060606060 % 60606028286060606060606060606028606060606060606060606060606060606060606060606060 % 6060606060ae60286060606060606060606060606060606060606060606060ae2860606060606060 % 606060606060606060606060606060ae606060aeff747474 % 327474bb2860aeae60606060ffff6060606060606060606060606060606060606060606060606060 % 60606028286060606060606060606028606060606060606060606060606060606060606060606060 % 6060606060ae60286060606060606060606060606060606060606060606060ae2860606060606060 % 606060606060606060606060606060ae606060aeff747474 % 327474bb2860aeae6060606060606060606060606060606060606060606060606060606060606060 % 60606028286060606060606060606028606060606060606060606060606060606060606060606060 % 6060606060ae60286060606060606060606060606060606060606060606060ae2860606060606060 % 606060606060606060606060606060ae606060aeff747474 % 327474bb2860aeae6060606060606060606060606060606060606060606060606060606060606060 % 60606028286060606060606060606028606060606060606060606060606060606060606060606060 % 6060606060ae60286060606060606060606060606060606060606060606060ae2860606060606060 % 606060606060606060606060606060ae606060aeff747474 % 327474bb2860aeae6060606060606060606060606060606060606060606060606060606060606060 % 606060282860606060606060606060286060606060606060ffff6060606060ff6060606060606060 % 6060606060ae602860606060606060ff6060606060606060ff606060606060ae2860ffffff606060 % 606060ff6060606060606060606060ae606060aeff747474 % 3232bbbb2860aeae6060606060606060606060606060606060606060606060606060606060606060 % 60606028286060606060606060606028606060606060606060606060ffff60ff60ffff6060606060 % 6060606060ae60286060606060606060606060ff6060ffffff606060606060ae2860ff6060606060 % ffff60ff60ffff60ff6060ffff6060ae606060aeff3274bb % bbbbbbbb2860aeae6060606060606060606060606060606060606060606060606060606060606060 % 606060282860606060606060606060286060606060606060606060ff606060ff606060ff60606060 % 6060606060ae6028606060606060ff60ff60ff6060606060ff606060606060ae2860ff60606060ff % 606060ff60606060ff60ff60606060ae606060aeff32bbbb % 3232bbbb2860aeae6060606060606060606060606060606060606060606060606060606060606060 % 606060282860606060606060606060286060606060606060606060ff606060ff606060ff60606060 % 6060606060ae6028606060606060ffffff60ff6060606060ff606060606060ae2860ff60606060ff % 606060ff60606060ff60ff60606060ae606060aeff323232 % 3232bbbb2860aeae6060606060606060606060606060606060606060606060606060606060606060 % 6060602828606060606060606060602860606060606060ff606060ff60ff60ff60ff60ff60606060 % 6060606060ae60286060606060ff606060ffff60ff60ff60ff606060606060ae2860ff6060ff60ff % 60ff60ff60ffff60ff60ff60ff6060ae606060aeff3274bb % 3232bbbb2860aeae6060606060606060606060606060606060606060606060606060606060606060 % 60606028286060606060606060606028606060606060606060606060606060606060606060606060 % 6060606060ae60286060606060606060606060606060606060606060606060ae2860606060606060 % 606060606060606060606060606060ae606060aeff3274bb % 3232bbbb2860aeae6060606060606060606060606060606060606060606060606060606060606060 % 60606028286060606060606060606028606060606060606060606060606060606060606060606060 % 6060606060ae60286060606060606060606060606060606060606060606060ae2860606060606060 % 606060606060606060606060606060ae606060aeff3274bb % 3232bbbb2860aeae6060606060606060606060606060606060606060606060606060606060606060 % 60606028286060606060606060606028606060606060606060606060606060606060606060606060 % 6060606060ae60286060606060606060606060606060606060606060606060ae2860606060606060 % 606060606060606060606060606060ae606060aeff3274bb % 3232bbbb2860aeae2828282828282828282828282828282828282828282828282828282828282828 % 28282828286060606060606060606028606060606060606060606060606060606060606060606060 % 6060606060ae60286060606060606060606060606060606060606060606060ae2860606060606060 % 606060606060606060606060606060ae606060aeff3274bb % 3232bbbb2860aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeae286060606060606060606028606060606060606060606060606060606060606060606060 % 6060606060ae60286060606060606060606060606060606060606060606060ae2860606060606060 % 606060606060606060606060606060ae606060aeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeae6028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae606060aeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060aeff3274bb % 327474bb28aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeff747474 % 327474bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffff747474 % 32747474747432323232323232323232323274747474747474747474747432323232323232323232 % 32327474747474747474747474743232323232323232323232327474747474747474747474743232 % 32323232323232323232747474747474747474747474323232323232323232323232747474747474 % 747474747474323232323232323232323232747474747474 % 3274747474747474747474747474bb32747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 7474747474747474bb327474747474747474747474747474 % 32bbbbbbbbbbbbbbbbbbbbbbbbbbbb32bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbb32bbbbbbbbbbbbbbbbbbbbbbbbbbbb %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice /pop load def %%EndProlog %%Page 1 1 /picstr 903 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def gsave 233.76 354.72 translate 144.48 82.56 scale 301 172 8 [ 301 0 0 -172 0 172 ] { inputf picstr readstring pop } false 3 colorimage 78DAED9DCB91E42A1045DBCAB2A05C7ACBB641DEF4765C791D53110A0D029440 262470EE8298D6A82889E270F9F3F585101AAF1F1B7D7F7FBF5EAF1F8466D6EB AFECE2FFC5E48AE1EF9FBA61F0FCEAF11312F609CF6CAC1EF3472786C1752D5D 9F1FA119757513A3F8033734C2909F12CD4EA21D205137FC5C272424B40B256E 482A11125A337875BD941BD27B8C90E9C084C40DED463110DA5919D78B5ED7EA A165B482704878663F574F55E186F49422BA3715C7DDAE6495BA21E386685E0C 55F2F09D68794B3088A7BF1B469FFF51C1C33F5EAFBB0D6D32E66E44B4308F05 B74DE486761842286EA8E886A599790D376CFF2C18E286FDDD30A8974EE18642 2BBC56BCAFFF155C0CAE672E926F7143DCB008C3284A293CA39FCA44887043B7 6E583A4FC0CE0DEF37D4B1067A9BBBA1BC2EE4C70D8B726CF0BDBA35D23AD0A2 315323DDD90D8BEA427EDCB0AE6259E486DDAC907E1BDC508EA12B37ACA897AA BB611D86F9EA28186EEB8645F5523F3DA515CD43B91BAA74CE28BA245ADB0DE5 CDC3AD7A4A532C970E55C8FF84C19DDDB091E8B5C70D8B0447A843DEDB73168D 103A1844B8E110372C6A562348C40DD54B24845CB961DD6C16D61B22DC5097E8 D25103DC10E1861E88AE70C3F3B32DE1E714806F76C623EC1E6AE5BD93E8F678 326EF8FDEF0E8A9FEBE7071BA5150F4203F39E56541937BC7F239B492264BA4F 69C066B025E949FD1F8490B6AE6E78DDBCF48AE1B51E4B8A21A4ABF7FB1DEC00 7CC730E865FA7CF0400869E8FD57453DA56088901D86C271433044083744A845 DE5A85B82102C3E13D33B821DA16433F7551DC1081A1370C71430486B8214260 881B2230DCD90D7FBF4878B1E886897285A45B1BE186A66EA88BE15C78CABBB5 33E9F051B74418586C5E5F361361344D70438B1F68250C253F562AB345FF9C08 C3A2470DDEB7E21B53091EAC39C20DA3097E2F03CF3F83EC17CD9C6ED96CC430 75A53F867D8A4D530C33451C6DC33B658FFFAEFBD516C030F8AF547DF55E7615 A5D8C06233F3A8C29AB910C30E19662E374CA5ADE4BA671F6CC730F382456597 2E86A6C566F486A218E418A648BF7F85B0B89BDD0D1BAFAF5A29CDC0589468EA 18DA159B290CE5CDD53A0C2BCA96C7C7DBC70DFDDBA20A868F5D34F2EB92D6E5 C062B367A554F7A53677C385DB861689361C43B9C1455B734695D28A977AEC7A 9DCE0D1FDB14D52D854D7A4A85D7EFA1B762B3AEF138DC0D67691BDE8B0E61CF 5BA68AB27CDB503E6E2869B3C88BAC81C566CF2E9A4C547618CE32A7748D396C 41AE783F49528849BA68323D7845188E2A36BBB50DF3455C4B71E7D60D8B7A1E D6C3F02DD0BC2FA8FB7B558FF54B30CC37E532031645C5DDBC6ED8799611725B 6CDA61D85FAC374493169BC268E79DDACD7A43B483704384C0D0CE0DDF3B8922 080C7DBAE127736E72E4071882A15B371476BCE386080C4DDD700700C1100CA7 70C3B57F3E305CE677742223370443E4FC777455C572E886757B0D81219A5ADE DC5017435D7EC11075C0D0AD1B3A890D0CD1746EF8B87FCEF5B6E80D99BD4A84 9FD29DD30886682E37ACDE9B2BBF6F58CB965F6088366F1BCA5749E7F70DB358 010D8668E1B6617411653B868FD18221C20DEF95523B374C75C5CC8561FFE118 964EEFD336EC5029DD04438B95B3F0B89B1B96564AEBBA68C0105BC40D336DC3 A3E4AC8496018B54CC5A99CD1AC3D293564A4F52C8DCDCFF1415D4C10D975407 0C255588F6535AF2E34460B8921B8261634BEDB1267F88B770977CA3FFEDCD71 43DCD00F86454336994A2918AEED865F8BCAA11B4A5AC7999A6A9FAE2D34C40D C1D0218687E0CCA6C71364D05C6E18F48E66F47883FA0767C7B0FD94968CEBB1 2FFA4A6ED88E61E6839986D292181E8993564A4F52788C192B5CD50DAB4DCDCE 46BD61E84A60B8BC1BDEDB20A903B9247E0786160C82E1DA6DC3C7A64D740E1B 18C2206EA8E886F7464DD1753044B8A18A1B822142B8A12B0CDF686FE1866088 5C1D83D2D30D255D31BB61F81F2A97DD715D3D9F7F881BE6072CA270E5C72CC0 100C85A7E0C96FF68061CF39A5FD2102C3C5301426B2FC4E27189AAEB0C84FCA 024304867DDCF03E580C8630058607ABEF4B04866038911B82211882A1073794 AFE3AE98C798AAE8822118E286BA18B62C33074330C40D8BE8004304863DDD30 BA3F6DE3D184600886B8A11C438BA309691B82216E588A6194A0EA3DFAFAAF51 0543305CC00D15311CB24E1C0CC110371CCB20187AC350BEA448BEFE08371462 3870BF1430F483A1D132C01DDC50E568C2C530FC8376D5A8593499018B2865A9 D3883233C6E7C290AC088663E794CEB8171F5B422123755B6191AA948221423D DD70D4946C3044B8E1320243B4801B8221423DDD90F586080D7743D61B22E4C7 0D25D60686080C596F08866893B6A1C57A433044B8612986517CAA173AD14583 70C3E1CB7E7143841B822142DBBA213DA50837F4B6DE705E0CD758A4C37AA596 F54DFDDDF0505A6F78AC328B66DE8C749DAFE8F609FD275D073774D5A6F38CE1 A4D527CF6F71DDD6C073D27570C39485E56D0E0CC1100C596F088660B8B61B2E 203004C305DC100CC1100C7143300443DC100CC1100C7143300443DC100CDB31 2CEA6AB6E8916EC7507D4306218675BB4C2BA6216EB8008641E691E42587184A 28B0C330939EEA85066EB82A867639A4278647EDA979BA181E4A47D9AA63881B BAC5509219EE46139DD07BBFA1A89266846174BE71E6BA0A86F2244ADD10BD3F E5F82D6E78D2871BBAC5F071F58A64D7910E18E6B3B7D6A3D661D892868F2FD2 EE86AF7F851BFAC43095B584370CC750F278D618B6A761FE81E56E7825EEDA36 3CBD123704C33A0C334D33271846BB52E5371C4FA7FE15B9E1A90043DA8660D8 88A124273B71C38A1B1E9FB0A86D18C590B6A1E79E52DCB0BDA7D40F86F4943A C7B0A25B43DEBD608A613E0F0FE9A291A767E72E1AC60D3D631854ED3255BE4C 6F64E68681181EBD062CF2B368EAD2304A5FCB80056EE81FC3E1624EA956D2E1 866008866E31C40DC1100C714330044330C40DC1100C714330044330D472C3B5 373F074330F4EF86CB9F41008660E8D90DF7111882A14F37E45C9EEA96E68CF2 FF166E1FCCD40D510586F3D607FCBF85DB073375438450637D153744C80986B8 2142B8214260881B22841B220486A56EF84608E9A9C20D4934842C3094BBE117 42C8407237FC410859EAD10DAF54121212DA852937D4D5EFB758448B504F9966 E3941B2AC6FF797E48440B6068C448E086671FA96E783F1D839070AEF0CCC646 F19F18BECC743F460AA1E9649A8DE93D46C883FE07744278A5 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.5/doc/figs/mat.eps0000644000175000017500000025252112310162277013270 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: foo.ps %%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner %%CreationDate: Mon May 19 07:57:13 2008 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 14 14 143 186 %%HiResBoundingBox: 14.166000 14.173171 142.327543 185.525994 %%EndComments %%BeginProlog %%BeginPreview: 128 171 8 684 % a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6020202020202020202020202020202020202020202 % 02020202020202020202020202020202020202020202020202020202020202020202020202020202 % 020202020202020202a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6 % a6a6a6a6a6a6a6a6 % a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a602043c5959595959595959595959595959595959595959 % 59595959595959595959595959595959595959595959595959595959595959595959595959595959 % 59595959595959502e0202a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6 % a6a6a6a6a6a6a6a6 % a6a6a6a60202020202020202020202020211495b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b % 5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b % 5b5b5b5b5b5b5b5b5b02020402020202020202020202020202020202020202020202020202020202 % 02020202a6a6a6a6 % a6a60213646464646464646464646428216060606060606060606060ffffa54c2affffff60606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060600466646464646464646464646464646464646464646464646464646464 % 646464610239a6a6 % a6a63c69696969170e32696969696902666666666666666666666666ff58604a463e52ff66666666 % 66666666666666666666666666666666666666006666666666006666666666666666666666666666 % 666666666666666666666659746b6969340d0d0d0d0d34696969340d0d0d0d0d34696969340d0d0d % 0d0d0d69690202a6 % a6026b6b6b6b3210171e556b6b6b6b02686868686868686868686868ff5d09093c4f3cff68686800 % 68682b6868686868680068686868686868686800ff68686868006868686868686868686868686868 % 6868686868686868686868686c706b6b1d051012171e1d6b6b6b1d051012171e1d6b6b6b1d0c1012 % 171e1f6b6b05029e % 020274746b491f05081a224974747402707070707070707070707070ff000000243246ff70707000 % c36975ff7031be007000ff7000a00071006eff00ff31f9be78007070707070707070707070707070 % 7070707070707070707070702d8574745b2308050a255b8b74745b2308050a255b8b74745b25ff05 % 0aff278b74741310 % 0d0d7b7b8228ffffffff24317b7b7b02777777777777777777777777ff000000004649ff77777700 % 0405f6ff771f00007700ff77000000f300ff7700ff1f0000f7007777777777777777777777777777 % 7777777777777777777777775f8f7b7b822e100e102e82907b7b822effffff2e82907b7b8233ffff % ff2e33907b7b7b02 % 1c1c84849d552effff14235584848402808080808080808080808080ffdf0000c8d5c1ff80808000 % 808080ff8032000080130080790727df00ff8000ff320000ff008080808080808080808080808080 % 8080808080808080808080807d968484a92f1816182fa9988484a92f1816182fa9988484a932ffff % ff2f329884848415 % 21218888978c291aff14258b88888802828282828282828282828282ffff060be9edffff828282ff % 828282ff82a7ffff82c2f68282fbf6aaffff82ffffa7feffff828282828282828282828282828282 % 82828282828282828282827fa4978888b42dffffffffb49b8888b42dffffffffb49b8888b42affff % ffff2a9b8888881b % 2c2c8e8e8e9e6c221b0dbac68e8e8e28598787878787878787878787ffffffffffffffff87878787 % 87878787878787878787878787878787878787878787878787878787878787878787878787878787 % 878787878787878787878717a6978e8ec6231c1a1419c6a18e8ec6231c1a1419c6a18e8ec6251c1a % 141920a18e8e8e26 % 3b3b969696969abac1c1a39a9696969628788d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d % 8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d % 8d8d8d8d8d8d8d8d8d45027e9b97969696c7c7c7c7c7bba3969696c7c7c7c7c7bba3969696bbc7c7 % c7c7c7a396969637 % 3f3f9898989898a2a6a69998989898988c023b8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f % 8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f % 8f8f8f8f8f8f8f8f890202b99a98989898a9a9a9a9a9a59c989898a9a9a9a9a9a59c989898a5a9a9 % a9a9a99c9898983d % 4e4e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ea1905052535353535353535353535353535353535353 % 53535353535353535353535353535353535353535353535353535353535353535353535353535353 % 5353535353535378b0ada79f9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d4e % 53534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4daa53 % 53534d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d83aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414144d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d831483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414144d14141414141414141414141414141414141414141414 % 141414831483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414144d14141414ffffff141414141414141414141414141414 % 141414831483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414144d14141414ff1414ff1414141414141414141414141414 % 141414831483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414141414ff141414141414141414ff14141414141414ff14141414141414141414 % 14141414141414141414141414141414144d14141414ff141414ff14ffff14ffffff14ffffff1414 % 141414831483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414141414ffff1414ff141414ffffff141414ff14ff14ff14ff14ff141414141414 % 14141414141414141414141414141414144d14141414ff141414ffff141414ff141414ffffff1414 % 141414831483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414141414ff1414141414141414ffff1414141414ff14ff14141414141414141414 % 14141414141414141414141414141414144d14141414ff141414ffff141414ff1414141414141414 % 141414831483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414141414ff1414ff1414141414ffff1414141414ff14ff14ff1414141414141414 % 14141414141414141414141414141414144d14141414ff1414ff14ff141414ff141414ff14ff1414 % 141414831483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414141414ff14ff14141414ff14ff14ff14ffff14ff14ff14ffff14141414141414 % 14141414141414141414141414141414144d14141414141414141414141414141414141414141414 % 141414831483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414144d14141414141414141414141414141414141414141414 % 141414831483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414144d83838383838383838383838383838383838383838383 % 838383831483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414ff1414141414141414141414141414ff1414ff14141414ff141414 % 14141414141414ff1414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d141414141414ffff1414ff14141414141414ffff1414141414ff14ff1414141414ff1414ff % 14ff14ff14ff14ff14ff14ff141414ffffffff141414ffff14141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d141414141414ffff1414ff1414141414141414ff1414141414ffff141414141414ff1414ff % 14141414141414ff141414ff141414ffff141414141414ff14141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414ff1414ff14141414141414ffff1414141414ff1414ff14141414ff1414ff % 14141414141414ff141414ff141414ffff1414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d141414ffff1414ff1414ff14ffff1414ffff1414ffff141414ff1414ff14ffff14ff141414 % ffff14ffffff141414ffffff141414ff14ffff1414ffff1414141414141414141414141414141414 % 14141414141414141483838383838383838383838383838383838383838383838383838383838383 % 838383141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483838383838383838383838383838383838383838383838383838383838383 % 838383141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14838383838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14838314141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414144d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14838314141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414144d14141414141414 % 1414141414838314148314141414ff14141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14838314141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414144d14141414141414 % 1414141414838314148314141414ff14141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14838314141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414144d14141414141414 % 1414141414838314148314141414ff14141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14838314141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414144d83838383838383 % 8383838383838314148314141414ff14141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d1483834d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14834d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414ff141414141414141414141414141414141414141414141414141414ff14141414 % ff14ff1414141414141414ff14141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414ff1414ff1414ffff1414ff14141414ff141414ffffffff1414141414ff1414ff14 % ffffff14ffff1414ffff14ffffffffff14ffff1414ffffff14ffff14141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d141414ff14ff14ff14ff1414141414ff1414ff14ff141414141414141414ffff1414ff14ff % ff14ffff14141414141414ff1414141414ff14ff14141414141414ff141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414ff14ff1414141414ff1414ff14141414141414141414141414ff14ff1414 % ff14ffff141414141414ffff1414141414ff14ff1414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d1414ff141414ffff14ff141414ffffff1414ff14ff1414141414141414141414ff14ff14ff % ff14ffffff14141414ffffff14ff14ff14ff14ff14ff14ff14ffffff141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483838383838383838383838383838383838383838383838383838383838383 % 838383141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141414141414831414ff141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d148383141414141414141414141414141414141414144d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414ff14ff1414ff141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d148383141414141414141414141414141414141414144d1414141414148314141414141483 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414ff14ff14141414ff14141414141414141414141414141414141414 % 14144d141483aa53 % 53534d148383141414141414141414141414141414141414144d1414141414148314141414141483 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414ff14ff1414ff141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d148383141414141414141414141414141414141414144d1414141414148314141414141483 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414ff14ff1414ff141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d148383141414141414141414141414141414141414144d1414141414148314141414141483 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d1483834d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14834d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d141414ff141414141414ff1414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141414141414834d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d141483aa53 % 53534d1414ff1414ff14141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d1414ff14141414ffff14ff1414ff14141414ff141414ff1414ffff1414ffff141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414ffff14141414ff1414141414141414ff14ffffff14ffff1414ffff141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d1414ff1414ff14141414ff1414141414141414ff14ff141414141414141414ff1414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d1414ff14ffff14141414ff1414141414141414ff14ff14ff14141414141414ff1414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141414141414831414ff141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14838383838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d148383141414141414144d4d4d4d4d4d4d4d4d4d4d4d4d4d4d141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d148383141414141414144d1414141414141414141414148383141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414148314141414ff14141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d148383141414141414144d1414141414141414141414148383141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414148314141414ff14141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d148383141414141414144d1414141414141414141414148383141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414148314141414ff14141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d148383141414141414144d8383838383838383838383838383141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414148314141414ff14141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14838314141414141414838383838383838383838383838383141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414148314141414ff1414ffffff1414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141414141414831414ff141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d141414ff14141414141414141414141414141414141414141414141414141414ffffff1414 % 141414ffff1414141414141414141414141414141414141414141414141414141414141414141414 % 141414141414141414834d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d141483aa53 % 53534d1414ff14ffff14141414141414141414141414141414141414141414141414141414ff1414 % 14141414ff1414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d141483aa53 % 53534d1414ff14141414ffff1414ffff14ffffff14ff14ff141414ffff1414ff14141414141414ff % ff14ff14ff14ffff1414ffff14ffff14ffff1414ff141414ff1414ffff1414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414ffff14141414ffffff1414141414ff14ff141414ffff1414141414141414ff14ff % ffff1414ff14ffff14ff141414141414ffff141414ff14ff1414ffffff1414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d1414141414ff14141414ff14141414141414ff14ff1414ffff141414141414141414141414 % 14141414ff14141414ff1414141414ff1414141414ff14ff1414ff14141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d1414ff14ffff14141414ffffff14ff14ff14ff14ff1414ffffff14141414141414141414ff % ffff1414ff14141414ffffff141414ff14ff141414ff14ff14ffffff141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14838383838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14838383838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d148383141414141414141414141414141414141414144d1414141414148314141414141483 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414ff14ff1414ff141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d148383141414141414141414141414141414141414144d1414141414148314141414141483 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414ff14ff141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d148383141414141414141414141414141414141414144d1414141414148314141414141483 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414ff14ff141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d148383141414141414141414141414141414141414144d1414141414148314141414141483 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414ff14ff1414ff141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d148383141414141414141414141414141414141414144d8383838383838383838383838383 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414148314141414ff14141414ffff14141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141414141414831414ff141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d141414141414141414ff1414141414141414ff141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d141483aa53 % 53534d141414141414141414141414141414141414ff141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414ff14141414141414ff14ff14141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d1414141414141414ffffffff141414141414ff14ff14ff1414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d1414141414141414ff1414ff141414141414ff14ff14141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483838383838383838383838383838383838383838383838383838383838383 % 838383141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141414141414831414ff141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14838383838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d1483831414141414141414141414141414144d4d4d4d4d4d4d4d4d4d4d4d4d4d1414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414ff14ff1414ff141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d1483831414141414141414141414141414144d1414141414144d1414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414ff14ff1414ff141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d1483831414141414141414141414141414144d1414141414144d1414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414ff14ff141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d1483831414141414141414141414141414144d1414141414144d1414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414ff14ff1414ff141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d1483831414141414141414141414141414144d1414141414144d1414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414ff14ff1414ff141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d1483834d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141483141414141414141414141414141414141414141414141414141414141414 % 14144d141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141414141414834d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d141483aa53 % 53534d1414141483838383838314141414ff14141414ffffffffffff1414ffffffffff1414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d1414141483090909094d141414141414ffff141414ff14141414141414ff141414ff14ffff % 14ffff141414ffff14141414141414ff1414ffffff1414ff14ffff14141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d1414141483090909094d141414141414ffffff1414ff14141414141414ff1414ff141414ff % 14ff14ff14ff1414141414141414ff14ff14ff14ff14ff14ff141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d1414141483090909094d141414141414ffffff1414ff14141414141414ff1414141414ffff % 14ff14ff1414ffff141414141414ff141414ffffff141414ff141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d1414141483090909094d141414141414ffffff1414ff14141414141414ff141414141414ff % 14ff14ff14ff141414141414ff14ff14ff14ff14ff141414ff141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414834d4d4d4d4d141414141414ff14ff1414ff14141414141414ff1414141414ff14 % 14ff14ff1414ffff141414ff141414ff1414ffffff141414ff14ff14141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d1414141414141414141414141414ff1414141414141414ffff141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53534d1414144d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383838383838383838383838383838383838383834d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d14ffff14141414141414141414ffff141414ffffff1414ffff14ffffff14141414 % ffffffff1414141414141414141414141414ff1414141414141414ff1414141414141414ffffff14 % 14ff14141414141414141414ff1414141414141414141414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d14ff14ffff14141414141414ff141414141414141414ff1414ffff1414ff141414 % 141414141414141414141414141414141414ff1414141414141414ff1414141414141414ff1414ff % 14ff14141414141414141414ff1414141414141414141414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d14ff141414ff14ffff141414ff141414141414141414ff141414ff1414ff141414 % 1414141414141414ff1414ffff1414141414141414141414ffff14ffff1414ffffff1414ff1414ff % 14ff14ffff1414ffff1414ffff1414ff14ff1414ff141414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d14ff141414ff14ff1414ff14ff141414141414141414141414ffff14141414ff14 % 14141414141414ffffff14ffff14141414ff1414ff141414141414ff14ff14ffffff1414ff1414ff % 14ffffffff1414141414ff14ff1414ff1414141414141414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d14ff141414ff14ff1414ff14ff141414141414141414141414ffff141414141414 % 14141414141414ff141414141414141414ffffffff141414141414ff14ff14ff14141414ff1414ff % 14ffff14141414141414ff14ff1414ff1414141414141414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d14ff14ffff1414ff1414ff14141414141414ffffff1414ffff14ff141414141414 % 1414141414141414ff1414ffff141414ff14141414141414ffff14ff14ff14ffff141414ffffff14 % 14ff14ffff141414141414ffff1414ff14141414ff141414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d14ff14141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141414141414141414141414141414141414ff1414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d14ffff14141414141414141414ffff141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414141414141414141414141414ffff1414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144dff1414ffffffffffffffffffff1414ffffffff1414ffffffffffffffffffffffff % ffffffffffffffffff1414ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffff4d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144dff14ff1414ffffffffffffff14ffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffff4d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144dff14ffffffffff1414ffffff14ffffffffffffffffffff1414ffff14ff1414ffff % 1414ffff1414ffffffffffff14ff1414ffff1414ff141414ffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffff4d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144dff14ffffffffff14ffff14ff14ffffffffffffffffff14ffffffffff141414ff14 % 1414ffffffffffffffffffff1414ffffffffffff1414ffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffff4d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144dff14ffffffffff14ffff14ff14ffffffffffffffffff14ffffffffff14ffffff14 % ffffffffffffffffffffffffff14ffffffffffff1414ffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffff4d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144dff14ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffff4d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144dff14ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffff4d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141414141414141414141414141414141414141414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d14ff14ffff14141414141414ff1414141414ff141414ff14141414141414141414 % 141414141414141414141414ff1414141414141414141414141414ff14ffffff1414141414141414 % 141414ffff14141414141414141414141414141414141414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d14ff141414ff141414141414ff1414141414141414141414141414141414141414 % 1414141414141414ffff1414ff1414141414141414141414141414ff1414ffff1414141414141414 % 141414ff1414141414141414141414141414141414141414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d14ff1414141414ff1414ff14ff141414141414ffff14ffff14141414141414ff14 % 14ff14ff141414141414ff14ffff141414141414ff141414141414ffffff14ff14ff14ffff141414 % 141414ffff14ff14ffff1414141414141414141414141414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d14ff14ff141414ff1414ff14ff141414141414141414ffff14141414141414ff14 % 14ff141414141414ffffff14ffff141414141414ffff1414141414ff1414ffff14ff1414ff141414 % 141414ffff14ff14ffff1414141414141414141414141414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d14ff1414141414ff1414ff14ff141414141414141414ffff14141414141414ff14 % 14ff14141414141414141414ffff141414141414ffff1414141414ff1414ffff14ff1414ff141414 % 141414ffff14ff14ffff1414141414141414141414141414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d14ff14141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414ff1414141414141414141414141414141414141414141414141414 % 141414141414141414141414141414141414141414141414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d14ffff14141414141414141414ffff141414141414141414141414141414141414 % 14141414141414141414141414ff1414141414141414141414141414141414141414141414141414 % 14141414141414141414ffff141414141414141414141414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141414141414141414141414141414141414141414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141414141414141414141414141414141414141414144d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d14141414141414141414141414 % 141414141483aa53 % 53534d1414144d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d14141414141414141414141414 % 141414141483aa53 % 53534d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414141414141414141414141414141414141414141414141414141414141414 % 141414141483aa53 % 53538383838383838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383838383838383838383838383838383838383838383838383838383838383838383 % 838383838383aa53 % 53537c75767676767676767676767676767676767676767676767676767676767676767676767676 % 76767676767676767676767676767676767676767676767676767676767676767676767676767676 % 76767676767676767676767676767676767676767676767676767676767676767676767676767676 % 7676767678818153 % 5353837c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c868753 % 53535353535353535353535353535353535353535353535353535353535353535353535353535353 % 53535353535353535353535353535353535353535353535353535353535353535353535353535353 % 53535353535353535353535353535353535353535353535353535353535353535353535353535353 % 5353535353535353 %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice /pop load def %%EndProlog %%Page 1 1 % Use own dictionary to avoid conflicts 10 dict begin % Translate for offset 14.173228346456694 14.173228346456694 translate % Translate to begin of first scanline 0 171.35241971158101 translate 128.15433070866143 -171.35241971158101 scale % Image geometry 178 238 8 % Transformation matrix [ 178 0 0 238 0 0 ] % Strings to hold RGB-samples per scanline /rstr 178 string def /gstr 178 string def /bstr 178 string def {currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} {currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} {currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} true 3 colorimage k>\,Qb#El~> k@pUgb%ZA~> kIdJeb.N6~> ku7c`qnTP6TEM=BnbrF2<.F~> l"L8!r6WHZ\-0V%p&=s8Bn-~> l+@,trSQ8'c32Y[q#:9;]RT~> qc*%_!Ud:eT*(hdrVP+Cqc&(~> qe>Qu!rhc1TXP$6rr2iFrVL;Z~> qn2Cs!VY0=c3)Gmrr(@Gqn.F~> r`&pr!rKX5oU5iTrQ+Q!p&MOj!i#YBfU;r>c1(]1rD\:~> rb;E2!rL-ToWJ>'rmgSHp&MP.!kJrFpc~> rk/:1!rU]toY^gPro3Lmp&MPF!mpr.fYdp9iqEBNrOdX~> s&B$s!U[&\R/tssnX9@V")Yj0qY^E%R0*9aQe.W-SGiE+r`"C~> s(VN3!V!kpXo[JCnZr,o")Yj0qY^E%Z3't'XOjTWZ2OXLrb6l~> s1JC2!VFb0_ZAuhn]Un3")Yj0qY^E%b6%YA_:QR,`W#knrk*a~> s&9$t`;Gi&[d!A.ZMTje^&@G`$37NYYJS9&be!iTiK=3@qNCmYhi\)8rJQj s(MN4d/9mH`9m3L_Y^>6bPq"5$37NYYJS9&be!iTiN3+[qQ9ethlR!jrh-4hWW:WGo`3SAWW:WG o`3SAWW:WGo`s'JWj)I#Bk`(~> s1AC3h#+qjeFWFpdegf\f`(B\$37NYYJS9&be!iTiPtruqT&X9ho>iFrj9B<^] !`]-Qr/h3.lL=#sii)d;!S./ !bqVmr29hPmdoi0l+?kl!T*hFWsSj3g\CQh^:qkm!<&r%s5^5]jT#%V!<;\l!WN/sX8i4VWrhji U].1ul1Y#GnaGl/kNVrD$0h0\oC;;:ki_4/W!V_^qt'@HmHE`trhoqrrHN%,~> !keNtr4`HqoChbDn'(^E!U'IO`X2^Ng\CQh^:qkm!<'n@s4PE3q#C00!<;]2!WN/s`rH(q`WGkK \c0>Mn+lnUp%7hDmdL+h$1I]fp\"1Ln*]ZC^BsB)r:fmVo'c#8rkAR5rg:?K~> s8DkR#d*1Tqt/e%e>rP+!W)caM#[PSrrpZpa1G=OrJ:s_`aal'rr@nFs7kE,rr<"T"g@1ac\[MX rsFV_M2@`%pm?pa#QrO,RR~> s8Dkj#eoToqtB15h7W]]!W;rdV>pVprrpZpa1G=OrMC#'nXHEPrrAq rsGY'VP_K8po((is5'USf#!aPUC,*+m/?hWp?(MYP5_3`aQW!hqt]sJk/`_bUCbN1m/?hWp?(MY P,"eVrP`]*~> s8Mr.#gi)6rV>jIk0GN* rsH[D_o)!Cpr()Ms5(Wpj3t.0]*d0Ync&I`q s8DnO$';USm/$J=f\X%7L]@>BL&_5PrrqE5f#:VhrIuWu.8YlOrr@eeR5FqdLAq5RLB$C)s+Q4- ci=(G!/A/k2!&l[s5&J3V9sSfLC0d0hY6j@p"J)nFT.%&U>"Juq#L*AfqNTfLC0d0h>mBHo`3[> FT.$smI3Mo~> s8Dnh$)ki+nGE%Ii8qrVT`>#\U]:DnrrqE5f#:VhrM1b>BgetXrrAkNJQ)T@V#LDpV#S/Ns.lIj PQ1^`!2SER;oYI0s5'OQ]A/MITF/-ejSA]KpYt/?MZ07U[c6BDqZ-BMiO4XCTF/-ej8f)QpAj0\ MZ07MnFKq9~> s8Mu-$,>$Yp&4dXl0[%"\c;Zu_#OK6rrqE5f#:VhrP9f[^4t$"rrBmr8<3_b_>aK8_>fk6s1uPO @fQN/!5[_$Ng7BZs5(QndH7>*\I-IDm/-bYqWmFgT`2J/am/6ir;c][lH,^u\I-IDli@"]q>fg& T`2J'o_*HY~> s7?2=!I!,m!!:s%HN&BpqYfo5!!)rs"QID<8c\g>&cVk0oE,$mJ(XJprrR]M!.TLsrso6^rr@Ou rr@u0rr;s!s8Ur*!lLRIrdP8ubgGnLnaFlLG&I;/!d;f8r;ZrIb][n'Ifaf;dJX%IdEHcOrI4kH 4b*~> s7Q>Z!L)I=!!;36PQ%!Or;Q2W!!)rs"QID<8c\g]&cVk/r s7lQ"!O1hc!!;KIXT#R-r;Q3!!!)rs"QID<8c\h'&cVk&rZ;(>^%;4&ru8ZO!56)ErspitrrBaG rrC[Bs8W';s8Urh!oV1krj3$:ioTq0q"Nn0YabX!!jL\Gr;Zr]iinpOZi[Jkjo#/]jl3M6rNlV) C4H~> s6fi4!bL0:qu?fPgN!4>s8DG6!!)rs"P@TK!!)tE'E8(#r#5S8HiJWurr@EG!.0(m1&_._HiF(m HiF*-rso22!<<)UHNLdTC]8Y^A]`6rliYPTASV3k!bKL!qu?f?ASV3k"(fU"m/?tecH0X4rHeS> 4b*~> s7-&S!f#akqu?fXj,(eV8\TQNDolg&(gOeV8\TQNMumg%#%A"524ZK)M#: pf)b~> s7Q>r!iG8GquHc^!2KP!s8MN"!!)rs"P@TK!!)u0-3!uCjd5uI]Dk84rrKb3!5#lC"TSN(]DhlC ]Dhm0rs'5;!WW2V])pd4S,T]#VW$S.p@e1>iMN(CZ3$o^j88lYiMN(CZ3-u_j7WBO"68@;Rf0Mm qJ(N~> s5a-#$<=%Pec5^8j5$YFrcA1urU=n9!%PMYs$n:n:B1CnF92CArcB(Y!-HB]s8N(@kl5aHN5bYO /Th!mFEIN_K$+)m!W`9#hK/hNH=m.u$:W7ekNM-md*>'jrcAK9cHtb!_(D]r;ZrH c:):BF91\jJ,~> s69KE$@08nGLmI'E0g=U7jrfIP)f\5`\md8`\D12DG!c?TDr;ZrR fPQ'8OTFoMJ,~> s6ooh$D#H'kPtVTnE\>driQ:grp[E)!%PMYs$n:n:B1Cn\,lU0rjWmH!4_1js8N)/q#@k6U#Gh+ *k;4M\@DP=fB3)4!W`9#hREXP[@7)t$C'T4oCV\Hjl;SkriQTmj5on)o^h2)Pa; s53co$=7Q#dcCJpjP+K\rbqnNrU=e+!!O28p)P(grW)n9rrE":!s!:O)?'ULE)m>HE,\YW"@[80 !,ulW!,uKMrVut s5j3>$@drjgZnk/lJd_Nrf.$%rpZ0P!!O28p)P(grW)n]rrE"^!s"R&(]FCJPYDD`Pa#2M#]#Y) !0i]J!0h=$rVut`!8j"CQhk]Orf.%ghVA#/!o@@4rf.%ghVA#/!o@@4rf.=ohV8)2mf3@E@=.s5 !U s6T]b$DFK`jm`?DnE[*Ari6(Prp[Ar!!O28p)P(grW)o*rrE#+!s#cB')hkE[Qt&s[^K0:&"'d* !4K<9!4HM@rVuu-!8k3e\GM,Nri6*YkN;[B!p>K+ri6*YkN;[B!p>K+ri6BakN2aEoDemSMj41@ !UsiS~> s4$s[$!!&?hW==i/h:K2BE?_YnS7at[;#g-rDd;*BF5a6h;dV[lf[1G>5i1B*8B<0jlbsmi#Gr" BF5a6h;dV[lf[1G>5`+8g-'r~> s5!U/$$`B,jm)O)>"jPHL]QGDnW3AD[>tFWrbm;cL^Hi8jQZ!tnEf:2FoI1(9]G-tlg=3.k"Kps L^Hi8jQZ!tnEf:2Fo@*siDb=~> s5s6W$(8NlmI9o@L2 s3LUR$"G;[^"o/[/OO%HA-/@oGFN4IrP_fFraZ?JgY:]HjQH!s&Q\mA$5)%IiSrq]n*1KcraZ?J gY:]HjQH!s&Q\j@!Rs8_~> s4R=($%l#tbN,mT79P9AK`\USR@B-;rmGk;re1\IioB4clKn-27!&?]$:Nn6kNM3toC#(gre1\I ioB4clKn-27!&<\!Sp_*~> s5X$R$);[5g$H_N>]->8V#n^4\sor,rnid.rhTsFlK[g*nFH>FG)lQu$?k_"mdBT8p[`QgrhTsF lK[g*nFH>FG)lNt!Tn-I~> s2FkA#?t1p4?Pr1>Ph_.fDU,hA-KI@GXbkBrE]IiqDSF@<;g,'62EM@5udeh!($H?!C9]`?3//2 J,~> s3^^o#CLSr;Gp\>I/AEqi;T:=M$;$#QX>)hrI=lMqF^ikF8^Uh=SbYk=EFFk!*K(j!EaFAJ-"/! J,~> s5!RG#G$usB4l4HSbo)^kPi/dXTdGX[ s1nJ9"^=r(;H-ls>Q\cjrPG7;#%s5"rBa4^r*05#qG.,j=oDS*;u08j;d''(!)r_i!E3/">QM`* J,~> s3:Ch"atK3E--O)IKPJ_rm@Ep#*#hcr`a,br-eWcqJ?7QHMr9mEVaMQEI.S4!-.jP!HEGaIK@bo J,~> s4[=A"eCg9NKTk/T*)%RrnjEM#-uAMrc66Rf/iYO8=\6O.-$>!0?u5!KW]JT)m_^ J,~> s0h5r!Go3;r<0r$7T3C9=TPupJ,~> s2F;M!K"dgrWLPK?ugJ=H3)#bJ,~> s4$A'!N+>=rWM"oHB=H?RK:rRJ,~> s0:ll"]n]9N397[WX"rC8OQ6K<`d[N!O4e<~> s2"#H"aG0EUqaXA]a(a3AR9%gGBhM\!Pq`c~> s3^/#"dbIL]?np&c3M:tIs-L(Q^H0g!RYY4~> s/^dde@u&[X?D(~> s1Nuue@u'#]i9L~> s3?21e@u'?c>%k~> s/^dde\;3I:96U/~> s1Nuue\;3ICV<\t~> s3?21e\;3ILX'Xb~> s/c78Ja`U,gqWmX"-63Y4b*~> s1SHIJa`U,gqWmX"-762<.F~> s3CYZJa`U,gqWmX"-85_C4H~> s/c78Ja`U,h7j/Tn*c<4X?D(~> s1SHIJa`U,h7j/Tn*c s3CYZJa`U,h7j/Tn*c%k~> s/c78Ja`U,!5IF[s,[3K"-63Y4b*~> s1SHIJa`U,!5IF[s,[3K"-762<.F~> s3CYZJa`U,!5IF[s,[3K"-85_C4H~> s/c78Ja`U,!5IF[s,[3K"-63Y4b*~> s1SHIJa`U,!5IF[s,[3K"-762<.F~> s3CYZJa`U,!5IF[s,[3K"-85_C4H~> s/c78Ja`U,!5JF"r;c*Ns,[3K"-63Y4b*~> s1SHIJa`U,!5JF"r;c*Ns,[3K"-762<.F~> s3CYZJa`U,!5JF"r;c*Ns,[3K"-85_C4H~> s/c78Ja`U,!5JF"!!*#e!!) s1SHIJa`U,!5JF"!!*#e!!) s3CYZJa`U,!5JF"!!*#e!!) s/c78^@)%%o^;b[p[8(^g[>-WqsOLbrU1-pn*^5Vn*^8F!!)KVrW)f`s,[3K"-63Y4b*~> s1SHI^@)%%o^;b[p[8(^g[>-WqsOLbrU1-pn*^5Vn*^8F!!)KVrW)f`s,[3K"-762<.F~> s3CYZ^@)%%o^;b[p[8(^g[>-WqsOLbrU1-pn*^5Vn*^8F!!)KVrW)f`s,[3K"-85_C4H~> s/c78^@)%%r9jUcqX4Cad-gtLqsOLbrU19tmf;hF!:Kmfmf;hF!:KmfqsXQGs6g&N:96U/~> s1SHI^@)%%r9jUcqX4Cad-gtLqsOLbrU19tmf;hF!:Kmfmf;hF!:KmfqsXQGs6g&NCV<\t~> s3CYZ^@)%%r9jUcqX4Cad-gtLqsOLbrU19tmf;hF!:Kmfmf;hF!:KmfqsXQGs6g&NLX'Xb~> s/c78^@2(%rpKgerpLR%mf3@V!:T@Vmf3@V!:T@Vmf3@V!9!;G^\dI"!<)?k!:KpVmf;eVr9sRa qsXQGs6g&N:96U/~> s1SHI^@2(%rpKgerpLR%mf3@V!:T@Vmf3@V!:T@Vmf3@V!9!;G^\dI"!<)?k!:KpVmf;eVr9sRa qsXQGs6g&NCV<\t~> s3CYZ^@2(%rpKgerpLR%mf3@V!:T@Vmf3@V!:T@Vmf3@V!9!;G^\dI"!<)?k!:KpVmf;eVr9sRa qsXQGs6g&NLX'Xb~> s/c78^@)+'mf<.O!W_Zhr9jdhmf;hF!8HrB^\dI"!<)?k!:KpVmf;eVo'cU>s6g&N:96U/~> s1SHI^@)+'mf<.O!W_Zhr9jdhmf;hF!8HrB^\dI"!<)?k!:KpVmf;eVo'cU>s6g&NCV<\t~> s3CYZ^@)+'mf<.O!W_Zhr9jdhmf;hF!8HrB^\dI"!<)?k!:KpVmf;eVo'cU>s6g&NLX'Xb~> s/c78^@)%%rpKgerU0min*^8F!;c-g!:T@Vmf3@Emf:-"mf3@emg&p^mf;hF!:KpcmfNRY!!)ob s,[3K"-63Y4b*~> s1SHI^@)%%rpKgerU0min*^8F!;c-g!:T@Vmf3@Emf:-"mf3@emg&p^mf;hF!:KpcmfNRY!!)ob s,[3K"-762<.F~> s3CYZ^@)%%rpKgerU0min*^8F!;c-g!:T@Vmf3@Emf:-"mf3@emg&p^mf;hF!:KpcmfNRY!!)ob s,[3K"-85_C4H~> s/c78^@)%%rpKgeqX4Icmf<4Q"T\#[!:KpDmf:-"n,37bn,ECfmf3@cn,<=`n,JIKmfSVGX?D(~> s1SHI^@)%%rpKgeqX4Icmf<4Q"T\#[!:KpDmf:-"n,37bn,ECfmf3@cn,<=`n,JIKmfSVd]i9L~> s3CYZ^@)%%rpKgeqX4Icmf<4Q"T\#[!:KpDmf:-"n,37bn,ECfmf3@cn,<=`n,JIKmfSW+c>%k~> s/c78^@).(n*^8Sn,E@kmf;hF!:Tmes6g6on*^8Fmf3@V!9*AH^YeM[O8nYNO%uc>J,~> s1SHI^@).(n*^8Sn,E@kmf;hF!:Tmes6g6on*^8Fmf3@V!9*AH^YeM[O8nYNO))F.J,~> s3CYZ^@).(n*^8Sn,E@kmf;hF!:Tmes6g6on*^8Fmf3@V!9*AH^YeM[O8nYNO,)"qJ,~> s/c78Ja`U,!5IF[s,[3K"-63Y4b*~> s1SHIJa`U,!5IF[s,[3K"-762<.F~> s3CYZJa`U,!5IF[s,[3K"-85_C4H~> s/c78Ja`U,!5I?Ns6g&N:96U/~> s1SHIJa`U,!5I?Ns6g&NCV<\t~> s3CYZJa`U,!5I?Ns6g&NLX'Xb~> s/c78Ja`U,!5I?Ns6g&N:96U/~> s1SHIJa`U,!5I?Ns6g&NCV<\t~> s3CYZJa`U,!5I?Ns6g&NLX'Xb~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78qX4Xhn*^8F!:KpTmfWXZmf3@bmfELX!;5d\!1!!TO%uc>J,~> s1SHIqX4Xhn*^8F!:KpTmfWXZmf3@bmfELX!;5d\!1!!TO))F.J,~> s3CYZqX4Xhn*^8F!:KpTmfWXZmf3@bmfELX!;5d\!1!!TO,)"qJ,~> s/c78p$Vq^mf;bD!!*#e!!)ob!W_Zhp$Vk\Q1"g9:96U/~> s1SHIp$Vq^mf;bD!!*#e!!)ob!W_Zhp$Vk\Q1"g9CV<\t~> s3CYZp$Vq^mf;bD!!*#e!!)ob!W_Zhp$Vk\Q1"g9LX'Xb~> s/c78qPjO%uc>J,~> s1SHIqPjO))F.J,~> s3CYZqPjO,)"qJ,~> s/c78q s1SHIq s3CYZq%k~> s/c78q s1SHIq s3CYZq s/c78p[8:dmf;eVmf<1P!W_ZhqX4CarpKmgmf<=T"9@ljmf<1P!W_Zhr9jjjmf;hF!:Ko^mfSVG X?D(~> s1SHIp[8:dmf;eVmf<1P!W_ZhqX4CarpKmgmf<=T"9@ljmf<1P!W_Zhr9jjjmf;hF!:Ko^mfSVd ]i9L~> s3CYZp[8:dmf;eVmf<1P!W_ZhqX4CarpKmgmf<=T"9@ljmf<1P!W_Zhr9jjjmf;hF!:Ko^mfSW+ c>%k~> s/c78rU9^crpL*mmf;eVn*^5VrpTgdrpTjer9jUcrpL3pn*^5Vn*^8F!:TCU!<;Ne!<2Eq!:Kmf mf;eVn*^8Fn,<=en,<=Bn'd?rmfSVGX?D(~> s1SHIrU9^crpL*mmf;eVn*^5VrpTgdrpTjer9jUcrpL3pn*^5Vn*^8F!:TCU!<;Ne!<2Eq!:Kmf mf;eVn*^8Fn,<=en,<=Bn'd?rmfSVd]i9L~> s3CYZrU9^crpL*mmf;eVn*^5VrpTgdrpTjer9jUcrpL3pn*^5Vn*^8F!:TCU!<;Ne!<2Eq!:Kmf mf;eVn*^8Fn,<=en,<=Bn'd?rmfSW+c>%k~> s/c78M=8oSrU0iL:96U/~> s1SHIM=8oSrU0iLCV<\t~> s3CYZM=8oSrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1S.n*^5Vg$\pUrU0iL:96U/~> s1SHIM=1S.n*^5Vg$\pUrU0iLCV<\t~> s3CYZM=1S.n*^5Vg$\pUrU0iLLX'Xb~> s/c78s6l#0!5JO%!0>\!!5JL$"-63Y4b*~> s1SHIs6l#0!5JO%!0>\!!5JL$"-762<.F~> s3CYZs6l#0!5JO%!0>\!!5JL$"-85_C4H~> s/c78s6ouKV=3ccrpKiJeaELQrU0iL:96U/~> s1SHIs6ouKV=3ccrpKiJeaELQrU0iLCV<\t~> s3CYZs6ouKV=3ccrpKiJeaELQrU0iLLX'Xb~> s/c78s6ouKV=+E!q s1SHIs6ouKV=+E!q s3CYZs6ouKV=+E!q s/c78s6ouKV=+E!q s1SHIs6ouKV=+E!q s3CYZs6ouKV=+E!q s/c78s6ouKV=+E!q s1SHIs6ouKV=+E!q s3CYZs6ouKV=+E!q s/c78s6ouKV=+E!q s1SHIs6ouKV=+E!q s3CYZs6ouKV=+E!q s/c78s6ouKV=+E!q s1SHIs6ouKV=+E!q s3CYZs6ouKV=+E!q s/c78s6ouKV=+E!mZ.@_rpKiJqsOLbh!Y6XrU0iL:96U/~> s1SHIs6ouKV=+E!mZ.@_rpKiJqsOLbh!Y6XrU0iLCV<\t~> s3CYZs6ouKV=+E!mZ.@_rpKiJqsOLbh!Y6XrU0iLLX'Xb~> s/c78s6ouKOMCe`!0>\!!5JL$"-63Y4b*~> s1SHIs6ouKOMCe`!0>\!!5JL$"-762<.F~> s3CYZs6ouKOMCe`!0>\!!5JL$"-85_C4H~> s/c78s6frKO2(\_!0>\!!5JL$"-63Y4b*~> s1SHIs6frKO2(\_!0>\!!5JL$"-762<.F~> s3CYZs6frKO2(\_!0>\!!5JL$"-85_C4H~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78lL+]QnF-;Uq="=`_!_8aeA(tN"-63Y4b*~> s1SHIlL+]QnF-;Uq="=`_!_8aeA(tN"-762<.F~> s3CYZlL+]QnF-;Uq="=`_!_8aeA(tN"-85_C4H~> s/c78r9sXchsUOFrpKgeqsORdmf<%L!!&MW"-63Y4b*~> s1SHIr9sXchsUOFrpKgeqsORdmf<%L!!&MW"-762<.F~> s3CYZr9sXchsUOFrpKgeqsORdmf<%L!!&MW"-85_C4H~> s/c78r9sXcrpL!jmf;eV!<2He!<;Kq!:T@V!:T@Vmf3@VrW)rd!!*#e"p",\!!)KVrW)uerW)ue rVurerVurerW)uerW)rdrW)uerW'1k"-63Y4b*~> s1SHIr9sXcrpL!jmf;eV!<2He!<;Kq!:T@V!:T@Vmf3@VrW)rd!!*#e"p",\!!)KVrW)uerW)ue rVurerVurerW)uerW)rdrW)uerW'1k"-762<.F~> s3CYZr9sXcrpL!jmf;eV!<2He!<;Kq!:T@V!:T@Vmf3@VrW)rd!!*#e"p",\!!)KVrW)uerW)ue rVurerVurerW)uerW)rdrW)uerW'1k"-85_C4H~> s/c78rU1$mn*^8Fmf;hF!;c-j!:KpV!:T@Vmf<+NrW)rd#lsG_!:KpV!:Kp^mf3@cmfrj]!:T@V mf<1P!!':m"-63Y4b*~> s1SHIrU1$mn*^8Fmf;hF!;c-j!:KpV!:T@Vmf<+NrW)rd#lsG_!:KpV!:Kp^mf3@cmfrj]!:T@V mf<1P!!':m"-762<.F~> s3CYZrU1$mn*^8Fmf;hF!;c-j!:KpV!:T@Vmf<+NrW)rd#lsG_!:KpV!:Kp^mf3@cmfrj]!:T@V mf<1P!!':m"-85_C4H~> s/c78p[81an*^8QmfNRY!:Tjd!Ug$_mf`^[mf;hFr;Zuh!:KpVr;c]_!W_]Xr;[&j!:T@Vmf<:S r;a+k"-63Y4b*~> s1SHIp[81an*^8QmfNRY!:Tjd!Ug$_mf`^[mf;hFr;Zuh!:KpVr;c]_!W_]Xr;[&j!:T@Vmf<:S r;a+k"-762<.F~> s3CYZp[81an*^8QmfNRY!:Tjd!Ug$_mf`^[mf;hFr;Zuh!:KpVr;c]_!W_]Xr;[&j!:T@Vmf<:S r;a+k"-85_C4H~> s/c78p[81an*^8QmfWXZ!:Kpdmf3@^mf3@emfELX!<)?h!:KpV!;Z'b!:Kpcmfrj]!:T@Vmf9 s1SHIp[81an*^8QmfWXZ!:Kpdmf3@^mf3@emfELX!<)?h!:KpV!;Z'b!:Kpcmfrj]!:T@Vmf9 s3CYZp[81an*^8QmfWXZ!:Kpdmf3@^mf3@emfELX!<)?h!:KpV!;Z'b!:Kpcmfrj]!:T@Vmf9 s/c78rpKgerU0mimf;hF!<)?p!:Kmfmf;eVn*^8F!;Gp^!<2FJ,~> s1SHIrpKgerU0mimf;hF!<)?p!:Kmfmf;eVn*^8F!;Gp^!<2F s3CYZrpKgerU0mimf;hF!<)?p!:Kmfmf;eVn*^8F!;Gp^!<2F s/c78M=8oSrU0iL:96U/~> s1SHIM=8oSrU0iLCV<\t~> s3CYZM=8oSrU0iLLX'Xb~> s/c78M=8oSrU0iL:96U/~> s1SHIM=8oSrU0iLCV<\t~> s3CYZM=8oSrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1S.n*^5Vg$\pUrU0iL:96U/~> s1SHIM=1S.n*^5Vg$\pUrU0iLCV<\t~> s3CYZM=1S.n*^5Vg$\pUrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78s6l#0!5JO%!0@*I!s%fY!<2Ee!9*AH^]!U'O%uc>J,~> s1SHIs6l#0!5JO%!0@*I!s%fY!<2Ee!9*AH^]!U'O))F.J,~> s3CYZs6l#0!5JO%!0@*I!s%fY!<2Ee!9*AH^]!U'O,)"qJ,~> s/c78s6ouKk3q]P_!_9 s1SHIs6ouKk3q]P_!_9 s3CYZs6ouKk3q]P_!_9%k~> s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bqJ,~> s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bpl>EiplE5Z!5JO%!0>\!!5JL$"-63Y4b*~> s1SHIs6ouKk3i;bpl>EiplE5Z!5JO%!0>\!!5JL$"-762<.F~> s3CYZs6ouKk3i;bpl>EiplE5Z!5JO%!0>\!!5JL$"-85_C4H~> s/c78s6ouKOMCe`!0>\!!5JL$"-63Y4b*~> s1SHIs6ouKOMCe`!0>\!!5JL$"-762<.F~> s3CYZs6ouKOMCe`!0>\!!5JL$"-85_C4H~> s/c78s6frKO2(\_!0>\!!5JL$"-63Y4b*~> s1SHIs6frKO2(\_!0>\!!5JL$"-762<.F~> s3CYZs6frKO2(\_!0>\!!5JL$"-85_C4H~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78rU9adrpKgerU0^dR-t$9eA(tN"-63Y4b*~> s1SHIrU9adrpKgerU0^dR-t$9eA(tN"-762<.F~> s3CYZrU9adrpKgerU0^dR-t$9eA(tN"-85_C4H~> s/c78rpKgerpKmgmf7q-iU6l0:96U/~> s1SHIrpKgerpKmgmf7q-iU6l0CV<\t~> s3CYZrpKgerpKmgmf7q-iU6l0LX'Xb~> s/c78rpKger9sUbs6g*kmf;eV!;uJ,~> s1SHIrpKger9sUbs6g*kmf;eV!;u s3CYZrpKger9sUbs6g*kmf;eV!;u s/c78r9jUcrpL'ln*^8F!:Kp^mfrj]!:T@Vmf7q-qX4NI:96U/~> s1SHIr9jUcrpL'ln*^8F!:Kp^mfrj]!:T@Vmf7q-qX4NICV<\t~> s3CYZr9jUcrpL'ln*^8F!:Kp^mfrj]!:T@Vmf7q-qX4NILX'Xb~> s/c78qsXOb#k%c^mf;eVmf<+N!J,~> s1SHIqsXOb#k%c^mf;eVmf<+N! s3CYZqsXOb#k%c^mf;eVmf<+N! s/c78rpKgerpL-nmf;hF!:KpV!;Gp`!:Kp[mf3??mfSVGX?D(~> s1SHIrpKgerpL-nmf;hF!:KpV!;Gp`!:Kp[mf3??mfSVd]i9L~> s3CYZrpKgerpL-nmf;hF!:KpV!;Gp`!:Kp[mf3??mfSW+c>%k~> s/c78rpL9rn*^5Vmf;hF!:KpV!;Gpe!:KpVmf;eVq s1SHIrpL9rn*^5Vmf;hF!:KpV!;Gpe!:KpVmf;eVq s3CYZrpL9rn*^5Vmf;hF!:KpV!;Gpe!:KpVmf;eVq s/c78M=8oSrU0iL:96U/~> s1SHIM=8oSrU0iLCV<\t~> s3CYZM=8oSrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1S.n*^5Vg$\pUrU0iL:96U/~> s1SHIM=1S.n*^5Vg$\pUrU0iLCV<\t~> s3CYZM=1S.n*^5Vg$\pUrU0iLLX'Xb~> s/c78s6ku/rpKiJeaELQrU0iL:96U/~> s1SHIs6ku/rpKiJeaELQrU0iLCV<\t~> s3CYZs6ku/rpKiJeaELQrU0iLLX'Xb~> s/c78s6ouKp[@LaYO;J+rpKiJeaELQrU0iL:96U/~> s1SHIs6ouKp[@LaYO;J+rpKiJeaELQrU0iLCV<\t~> s3CYZs6ouKp[@LaYO;J+rpKiJeaELQrU0iLLX'Xb~> s/c78s6ouKp[@ml!0?oi!0=>P!5JO%!0@$G!W_]Xr;bjG!5JL$"-63Y4b*~> s1SHIs6ouKp[@ml!0?oi!0=>P!5JO%!0@$G!W_]Xr;bjG!5JL$"-762<.F~> s3CYZs6ouKp[@ml!0?oi!0=>P!5JO%!0@$G!W_]Xr;bjG!5JL$"-85_C4H~> s/c78s6ouKp[8*sq s1SHIs6ouKp[8*sq s3CYZs6ouKp[8*sq%k~> s/c78s6ouKp[8*sq s1SHIs6ouKp[8*sq s3CYZs6ouKp[8*sq%k~> s/c78s6ouKp[8*sq s1SHIs6ouKp[8*sq s3CYZs6ouKp[8*sq s/c78s6ouKp[8*sq s1SHIs6ouKp[8*sq s3CYZs6ouKp[8*sq s/c78s6ouKp[8*smZ4R?!5JO%!0@$G!s%fY!8m5F^]!U'O%uc>J,~> s1SHIs6ouKp[8*smZ4R?!5JO%!0@$G!s%fY!8m5F^]!U'O))F.J,~> s3CYZs6ouKp[8*smZ4R?!5JO%!0@$G!s%fY!8m5F^]!U'O,)"qJ,~> s/c78s6ouKp[@L1YO;J+rpKiJqsOLbrpTgdipQl^rU0iL:96U/~> s1SHIs6ouKp[@L1YO;J+rpKiJqsOLbrpTgdipQl^rU0iLCV<\t~> s3CYZs6ouKp[@L1YO;J+rpKiJqsOLbrpTgdipQl^rU0iLLX'Xb~> s/c78s6frKO2(\_!0>\!!5JL$"-63Y4b*~> s1SHIs6frKO2(\_!0>\!!5JL$"-762<.F~> s3CYZs6frKO2(\_!0>\!!5JL$"-85_C4H~> s/c78M=1S.n*^5Vg$\pUrU0iL:96U/~> s1SHIM=1S.n*^5Vg$\pUrU0iLCV<\t~> s3CYZM=1S.n*^5Vg$\pUrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78rU9adl0eTPo^D_Yq="=`_s[SdeA(tN"-63Y4b*~> s1SHIrU9adl0eTPo^D_Yq="=`_s[SdeA(tN"-762<.F~> s3CYZrU9adl0eTPo^D_Yq="=`_s[SdeA(tN"-85_C4H~> s/c78rpKsin*^5VlgFfRna?GXqX4Icmf:8oe%bkM"-63Y4b*~> s1SHIrpKsin*^5VlgFfRna?GXqX4Icmf:8oe%bkM"-762<.F~> s3CYZrpKsin*^5VlgFfRna?GXqX4Icmf:8oe%bkM"-85_C4H~> s/c78rpKger9sUbrpTgds6opes6g0mn*^8F!:TCU!<2Ee!;Gs]!!r#n!:KpVmf3@en,<:en,<:e n,<=dn,ECen,ECen,< s1SHIrpKger9sUbrpTgds6opes6g0mn*^8F!:TCU!<2Ee!;Gs]!!r#n!:KpVmf3@en,<:en,<:e n,<=dn,ECen,ECen,< s3CYZrpKger9sUbrpTgds6opes6g0mn*^8F!:TCU!<2Ee!;Gs]!!r#n!:KpVmf3@en,<:en,<:e n,<=dn,ECen,ECen,<%k~> s/c78rU0^drU1a,n*^8F!!)Hfn*^8F!!)Hfn*^8F!:Kmfmf;hF!;Z't!:T@Vmf3@V!:KpV!:T@V mf3@V!<)Bd!"nZ"n*^8F!!)Hfn*^8F!!)HfZgS!W:96U/~> s1SHIrU0^drU1a,n*^8F!!)Hfn*^8F!!)Hfn*^8F!:Kmfmf;hF!;Z't!:T@Vmf3@V!:KpV!:T@V mf3@V!<)Bd!"nZ"n*^8F!!)Hfn*^8F!!)HfZgS!WCV<\t~> s3CYZrU0^drU1a,n*^8F!!)Hfn*^8F!!)Hfn*^8F!:Kmfmf;hF!;Z't!:T@Vmf3@V!:KpV!:T@V mf3@V!<)Bd!"nZ"n*^8F!!)Hfn*^8F!!)HfZgS!WLX'Xb~> s/c78qsXOb"n)H[mf;hT!;c-h!:T@Vmf;hFrW)Z\!W_]Xr;Zuh!:KpVr;Zle!;Z*_!;u9e!:Kpd n,36mmfSVGX?D(~> s1SHIqsXOb"n)H[mf;hT!;c-h!:T@Vmf;hFrW)Z\!W_]Xr;Zuh!:KpVr;Zle!;Z*_!;u9e!:Kpd n,36mmfSVd]i9L~> s3CYZqsXOb"n)H[mf;hT!;c-h!:T@Vmf;hFrW)Z\!W_]Xr;Zuh!:KpVr;Zle!;Z*_!;u9e!:Kpd n,36mmfSW+c>%k~> s/c78qX4Xhmf;hF!:Kp^mg&p^mf;eVmf3@SmfWXZ!:Kpdmf3@an,ECamfELX!<)?d!3knoO%uc> J,~> s1SHIqX4Xhmf;hF!:Kp^mg&p^mf;eVmf3@SmfWXZ!:Kpdmf3@an,ECamfELX!<)?d!3knoO))F. J,~> s3CYZqX4Xhmf;hF!:Kp^mg&p^mf;eVmf3@SmfWXZ!:Kpdmf3@an,ECamfELX!<)?d!3knoO,)"q J,~> s/c78rpLs0n*^5Vmf;hF!:Kmfmf;hF!:Kmfmf;hF!:KpV!!)HfoC!7kmf3@V!:KpV!:T@Vmf3@V !<)Bd!!2Ngr9jsmmf;hF!:Kmfmf9]_"-63Y4b*~> s1SHIrpLs0n*^5Vmf;hF!:Kmfmf;hF!:Kmfmf;hF!:KpV!!)HfoC!7kmf3@V!:KpV!:T@Vmf3@V !<)Bd!!2Ngr9jsmmf;hF!:Kmfmf9]_"-762<.F~> s3CYZrpLs0n*^5Vmf;hF!:Kmfmf;hF!:Kmfmf;hF!:KpV!!)HfoC!7kmf3@V!:KpV!:T@Vmf3@V !<)Bd!!2Ngr9jsmmf;hF!:Kmfmf9]_"-85_C4H~> s/c78rU9adrpTgdrpTgds6operpTgd#O_Z]mf3@V!;,aZ!<;Kl!:KpVmf3@en,<=en,E@jmf3@V !<)?h!:T@V!<2Hd!9N[uO8\MLO%uc>J,~> s1SHIrU9adrpTgdrpTgds6operpTgd#O_Z]mf3@V!;,aZ!<;Kl!:KpVmf3@en,<=en,E@jmf3@V !<)?h!:T@V!<2Hd!9N[uO8\MLO))F.J,~> s3CYZrU9adrpTgdrpTgds6operpTgd#O_Z]mf3@V!;,aZ!<;Kl!:KpVmf3@en,<=en,E@jmf3@V !<)?h!:T@V!<2Hd!9N[uO8\MLO,)"qJ,~> s/c78q!S1_POAL4eaELQrU0iL:96U/~> s1SHIq!S1_POAL4eaELQrU0iLCV<\t~> s3CYZq!S1_POAL4eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78s6ku/rpKiJeaELQrU0iL:96U/~> s1SHIs6ku/rpKiJeaELQrU0iLCV<\t~> s3CYZs6ku/rpKiJeaELQrU0iLLX'Xb~> s/c78s6l#0!5JO%!0>\!!5JL$"-63Y4b*~> s1SHIs6l#0!5JO%!0>\!!5JL$"-762<.F~> s3CYZs6l#0!5JO%!0>\!!5JL$"-85_C4H~> s/c78s6ouKk3r)[!0?oi!0=qa!5JO%!0@'HrrDucrW)$J!5JL$"-63Y4b*~> s1SHIs6ouKk3r)[!0?oi!0=qa!5JO%!0@'HrrDucrW)$J!5JL$"-762<.F~> s3CYZs6ouKk3r)[!0?oi!0=qa!5JO%!0@'HrrDucrW)$J!5JL$"-85_C4H~> s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bq s1SHIs6ouKk3i;bq s3CYZs6ouKk3i;bq s/c78s6ouKk3i;bmZ50P!5JO%!0@'HrrE)f!W_]XrW)$J!5JL$"-63Y4b*~> s1SHIs6ouKk3i;bmZ50P!5JO%!0@'HrrE)f!W_]XrW)$J!5JL$"-762<.F~> s3CYZs6ouKk3i;bmZ50P!5JO%!0@'HrrE)f!W_]XrW)$J!5JL$"-85_C4H~> s/c78s6ouKOMCe`!0>\!!5JL$"-63Y4b*~> s1SHIs6ouKOMCe`!0>\!!5JL$"-762<.F~> s3CYZs6ouKOMCe`!0>\!!5JL$"-85_C4H~> s/c78M=1S.n*^5Vg$\pUrU0iL:96U/~> s1SHIM=1S.n*^5Vg$\pUrU0iLCV<\t~> s3CYZM=1S.n*^5Vg$\pUrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78o^;b[p?qt]U[Q[HrU0iL:96U/~> s1SHIo^;b[p?qt]U[Q[HrU0iLCV<\t~> s3CYZo^;b[p?qt]U[Q[HrU0iLLX'Xb~> s/c78p$Vk\p$Vk\Ja`-t"-63Y4b*~> s1SHIp$Vk\p$Vk\Ja`-t"-762<.F~> s3CYZp$Vk\p$Vk\Ja`-t"-85_C4H~> s/c78oBuYZr9k'pmf3@V!:T@Vmf3@V!.jV7mfSVGX?D(~> s1SHIoBuYZr9k'pmf3@V!:T@Vmf3@V!.jV7mfSVd]i9L~> s3CYZoBuYZr9k'pmf3@V!:T@Vmf3@V!.jV7mfSW+c>%k~> s/c78oBuYZq s1SHIoBuYZq s3CYZoBuYZq%k~> s/c78p@%nZqX4[imf;hF!:KmfJa`@%"-63Y4b*~> s1SHIp@%nZqX4[imf;hF!:KmfJa`@%"-762<.F~> s3CYZp@%nZqX4[imf;hF!:KmfJa`@%"-85_C4H~> s/c78p?qt]rpKgeqX4Xhmf;hF!:Ko=n+Q2PO%uc>J,~> s1SHIp?qt]rpKgeqX4Xhmf;hF!:Ko=n+Q2PO))F.J,~> s3CYZp?qt]rpKgeqX4Xhmf;hF!:Ko=n+Q2PO,)"qJ,~> s/c78p[8(^p[A+^s6g6on*^8Fmf3@V!3GYJ,~> s1SHIp[8(^p[A+^s6g6on*^8Fmf3@V!3GY s3CYZp[8(^p[A+^s6g6on*^8Fmf3@V!3GY s/c78M=8oSrU0iL:96U/~> s1SHIM=8oSrU0iLCV<\t~> s3CYZM=8oSrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1S.n*^5Vg$\pUrU0iL:96U/~> s1SHIM=1S.n*^5Vg$\pUrU0iLCV<\t~> s3CYZM=1S.n*^5Vg$\pUrU0iLLX'Xb~> s/c78s6ku/rpKiJeaELQrU0iL:96U/~> s1SHIs6ku/rpKiJeaELQrU0iLCV<\t~> s3CYZs6ku/rpKiJeaELQrU0iLLX'Xb~> s/c78s6l#0!5JO%!0>\!!5JL$"-63Y4b*~> s1SHIs6l#0!5JO%!0>\!!5JL$"-762<.F~> s3CYZs6l#0!5JO%!0>\!!5JL$"-85_C4H~> s/c78s6ouKm-j_a!0?oi!0=_[!5JO%!0@*I!s%fY!<2Ee!;Z'`!:'"Q^]!U'O%uc>J,~> s1SHIs6ouKm-j_a!0?oi!0=_[!5JO%!0@*I!s%fY!<2Ee!;Z'`!:'"Q^]!U'O))F.J,~> s3CYZs6ouKm-j_a!0?oi!0=_[!5JO%!0@*I!s%fY!<2Ee!;Z'`!:'"Q^]!U'O,)"qJ,~> s/c78s6ouKm-aqhq s1SHIs6ouKm-aqhq s3CYZs6ouKm-aqhq s/c78s6ouKm-aqhq s1SHIs6ouKm-aqhq s3CYZs6ouKm-aqhq s/c78s6ouKm-aqhq s1SHIs6ouKm-aqhq s3CYZs6ouKm-aqhq s/c78s6ouKm-aqhq s1SHIs6ouKm-aqhq s3CYZs6ouKm-aqhq s/c78s6ouKm-aqhq s1SHIs6ouKm-aqhq s3CYZs6ouKm-aqhq s/c78s6ouKm-aqhmZ4sJ!5JO%!0>\!!5JL$"-63Y4b*~> s1SHIs6ouKm-aqhmZ4sJ!5JO%!0>\!!5JL$"-762<.F~> s3CYZs6ouKm-aqhmZ4sJ!5JO%!0>\!!5JL$"-85_C4H~> s/c78s6ouKOMCe`!0>\!!5JL$"-63Y4b*~> s1SHIs6ouKOMCe`!0>\!!5JL$"-762<.F~> s3CYZs6ouKOMCe`!0>\!!5JL$"-85_C4H~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eaELQrU0iL:96U/~> s1SHIM=1G*eaELQrU0iLCV<\t~> s3CYZM=1G*eaELQrU0iLLX'Xb~> s/c78M=1G*eA(tN"-63Y4b*~> s1SHIM=1G*eA(tN"-762<.F~> s3CYZM=1G*eA(tN"-85_C4H~> s/c78qsX?Ar9sXcr9sF]rU9U`KC8o':96U/~> s1SHIqsX?Ar9sXcr9sF]rU9U`KC8o'CV<\t~> s3CYZqsX?Ar9sXcr9sF]rU9U`KC8o'LX'Xb~> s/c78qsONGqu6Z2r9jUcq!S1_p[8(^e*d8:YO;RS:96U/~> s1SHIqsONGqu6Z2r9jUcq!S1_p[8(^e*d8:YO;RSCV<\t~> s3CYZqsONGqZ$W2r9jUcq!S1_p[8(^e*d8:YO;RSLX'Xb~> s/c78qsONGqu6Z2r9j[en*g5UrU0^dp[8(^rpKphmf;hU!<;Ne!<2Hd!;c-e!:T@V!<2Hd!<2He !!)Ke!3knoO%uc>J,~> s1SHIqsONGqu6Z2r9j[en*g5UrU0^dp[8(^rpKphmf;hU!<;Ne!<2Hd!;c-e!:T@V!<2Hd!<2He !!)Ke!3knoO))F.J,~> s3CYZqsONGqZ$W2r9j[en*g5UrU0^dp[8(^rpKphmf;hU!<;Ne!<2Hd!;c-e!:T@V!<2Hd!<2He !!)Ke!3knoO,)"qJ,~> s/c78qsONGqu6Z2r9jgin*^8F!!*#e!!)c^!!*#errE)f$39Mp!:KpVmf;eVp[8^pmf;hF!:Kmf mf;hF!:Kmfmf9Q["-63Y4b*~> s1SHIqsONGqu6Z2r9jgin*^8F!!*#e!!)c^!!*#errE)f$39Mp!:KpVmf;eVp[8^pmf;hF!:Kmf mf;hF!:Kmfmf9Q["-762<.F~> s3CYZqsONGqZ$W2r9jgin*^8F!!*#e!!)c^!!*#errE)f$39Mp!:KpVmf;eVp[8^pmf;hF!:Kmf mf;hF!:Kmfmf9Q["-85_C4H~> s/c78qsONGqu6Z2r9j[en*g2TrpKgep[8(^rpKgerpTdc#4DQ\mf;hFrW)f`!W_ZhrU9[br9j[e mf9Q["-63Y4b*~> s1SHIqsONGqu6Z2r9j[en*g2TrpKgep[8(^rpKgerpTdc#4DQ\mf;hFrW)f`!W_ZhrU9[br9j[e mf9Q["-762<.F~> s3CYZqsONGqZ$W2r9j[en*g2TrpKgep[8(^rpKgerpTdc#4DQ\mf;hFrW)f`!W_ZhrU9[br9j[e mf9Q["-85_C4H~> s/c78qsONGqu6Z2r9jgin*^8Fmf<@U!!)c^!!*#e!!*#e#QX>^!:KpVmf<=T!!)la!W_ZhrU0^d q s1SHIqsONGqu6Z2r9jgin*^8Fmf<@U!!)c^!!*#e!!*#e#QX>^!:KpVmf<=T!!)la!W_ZhrU0^d q s3CYZqsONGqZ$W2r9jgin*^8Fmf<@U!!)c^!!*#e!!*#e#QX>^!:KpVmf<=T!!)la!W_ZhrU0^d q s/c78qsONGqu6Z2r9jgin*^8F!!*#e!!)c^!!*#e!!*#e$39Mp!:KpVmf;eVqX4jnmf3@V!:T@V mf3@V!;u9e!:KokmfSVGX?D(~> s1SHIqsONGqu6Z2r9jgin*^8F!!*#e!!)c^!!*#e!!*#e$39Mp!:KpVmf;eVqX4jnmf3@V!:T@V mf3@V!;u9e!:KokmfSVd]i9L~> s3CYZqsONGqZ$W2r9jgin*^8F!!*#e!!)c^!!*#e!!*#e$39Mp!:KpVmf;eVqX4jnmf3@V!:T@V mf3@V!;u9e!:KokmfSW+c>%k~> s/c78qsONGqS2ss"p",\!!)HfrpKgep[8(^rpKgerpTje#k%c^!:T@Vn*g5UrU9ad"n)H[mf3@e n,<=bmfNRYmf9T\"-63Y4b*~> s1SHIqsONGqS2ss"p",\!!)HfrpKgep[8(^rpKgerpTje#k%c^!:T@Vn*g5UrU9ad"n)H[mf3@e n,<=bmfNRYmf9T\"-762<.F~> s3CYZqsONGqS2ss"p",\!!)HfrpKgep[8(^rpKgerpTje#k%c^!:T@Vn*g5UrU9ad"n)H[mf3@e n,<=bmfNRYmf9T\"-85_C4H~> s/c78mdC,UJa_pn"-63Y4b*~> s1SHImdC,UJa_pn"-762<.F~> s3CYZmdC,UJa_pn"-85_C4H~> s/c78mdL/Up@&"]Ja`F'"-63Y4b*~> s1SHImdL/Up@&"]Ja`F'"-762<.F~> s3CYZmdL/Up@&"]Ja`F'"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/c78rU5;uooB*fkjJV7:96U/~> s1SHIrU5;uooB*fkjJV7CV<\t~> s3CYZrU5;uooB*fkjJV7LX'Xb~> s/c78rU5 s1SHIrU5 s3CYZrU5 s/c78rU0a$JWKPds1ddd"-63Y4b*~> s1SHIrU0a$JWKPds1ddd"-762<.F~> s3CYZrU0a$JWKPds1ddd"-85_C4H~> s/c78rU0d%O+Hcqn,C)cmfSVGX?D(~> s1SHIrU0d%O+Hcqn,C)cmfSVd]i9L~> s3CYZrU0d%O+Hcqn,C)cmfSW+c>%k~> s/c78rU0m(O7*&Ko'cSYrU9[brU9ads6omdr9sL_mI(#Tp?qt]p$_hZs6fpfo'ZV[mf;qIrkI[c "-63Y4b*~> s1SHIrU0m(O7*&Ko'cSYrU9[brU9ads6omdr9sL_mI(#Tp?qt]p$_hZs6fpfo'ZV[mf;qIrkI[c "-762<.F~> s3CYZrU0m(O7*&Ko'cSYrU9[brU9ads6omdr9sL_mI(#Tp?qt]p$_hZs6fpfo'ZV[mf;qIrkI[c "-85_C4H~> s/c78rU0p)O7*);n,<=^mf3@amf3@emg&p^!!)KV!:Kpemf3@Jmf3@]mf3@\mf3@emfELX!:oR[ !:KpYn,C)cmfSVGX?D(~> s1SHIrU0p)O7*);n,<=^mf3@amf3@emg&p^!!)KV!:Kpemf3@Jmf3@]mf3@\mf3@emfELX!:oR[ !:KpYn,C)cmfSVd]i9L~> s3CYZrU0p)O7*);n,<=^mf3@amf3@emg&p^!!)KV!:Kpemf3@Jmf3@]mf3@\mf3@emfELX!:oR[ !:KpYn,C)cmfSW+c>%k~> s/c78rU0j'O7*)Hmf s1SHIrU0j'O7*)Hmf s3CYZrU0j'O7*)Hmf%k~> s/c78rU0j'O7*)Hmg0!_!:T@Vmf;eVqX4CarpKphn*^8Tmf3@emf3@]mgB-amf;hF!:Kmfmf<1P !!)rc%05hs!:KpVmf;eV!:Kpdmf3@emiMPu!:Kmfmf;hF!:Kmfmf;hF!:KpV!!)Hfn*^8F!!)ud rkI[c"-63Y4b*~> s1SHIrU0j'O7*)Hmg0!_!:T@Vmf;eVqX4CarpKphn*^8Tmf3@emf3@]mgB-amf;hF!:Kmfmf<1P !!)rc%05hs!:KpVmf;eV!:Kpdmf3@emiMPu!:Kmfmf;hF!:Kmfmf;hF!:KpV!!)Hfn*^8F!!)ud rkI[c"-762<.F~> s3CYZrU0j'O7*)Hmg0!_!:T@Vmf;eVqX4CarpKphn*^8Tmf3@emf3@]mgB-amf;hF!:Kmfmf<1P !!)rc%05hs!:KpVmf;eV!:Kpdmf3@emiMPu!:Kmfmf;hF!:Kmfmf;hF!:KpV!!)Hfn*^8F!!)ud rkI[c"-85_C4H~> s/c78rU0j'O7*)HmfELX!<)?f!:Kpamf3@emf3@cmfELX!;um[!!)Kd!;u9c!<2Ee!;c-h !:KpVmf;hFrW)oc!!*#e!s%cin,37amg0!_!:T@Vmf;eVq s1SHIrU0j'O7*)HmfELX!<)?f!:Kpamf3@emf3@cmfELX!;um[!!)Kd!;u9c!<2Ee!;c-h !:KpVmf;hFrW)oc!!*#e!s%cin,37amg0!_!:T@Vmf;eVq s3CYZrU0j'O7*)HmfELX!<)?f!:Kpamf3@emf3@cmfELX!;um[!!)Kd!;u9c!<2Ee!;c-h !:KpVmf;hFrW)oc!!*#e!s%cin,37amg0!_!:T@Vmf;eVq s/c78rU0j'O7*)HmfELX!<)?f!:Kpamf3@emf3@cmfELX!:T@V!<)?d!;Z*]!;c-i!:KpVmf;eV !;l3b!<2Ei!:KpV!;Z'i!:KpVmf;eVmf<1P!!)udrkI[c"-63Y4b*~> s1SHIrU0j'O7*)HmfELX!<)?f!:Kpamf3@emf3@cmfELX!:T@V!<)?d!;Z*]!;c-i!:KpVmf;eV !;l3b!<2Ei!:KpV!;Z'i!:KpVmf;eVmf<1P!!)udrkI[c"-762<.F~> s3CYZrU0j'O7*)HmfELX!<)?f!:Kpamf3@emf3@cmfELX!:T@V!<)?d!;Z*]!;c-i!:KpVmf;eV !;l3b!<2Ei!:KpV!;Z'i!:KpVmf;eVmf<1P!!)udrkI[c"-85_C4H~> s/c78rU0j'O7*)HmfELX!<)?f!:Kpamf3@emg&p^!!)KV!:KpVmg&p^mf;eV!:Kpdmf3@_mgT9c !!)Hfn*^8F!!)HfrU0^drpL'lmf;eV!:Kpcmg0!_!:T@Vmf;eVr9j^fmf3@dn,C)cmfSVGX?D(~> s1SHIrU0j'O7*)HmfELX!<)?f!:Kpamf3@emg&p^!!)KV!:KpVmg&p^mf;eV!:Kpdmf3@_mgT9c !!)Hfn*^8F!!)HfrU0^drpL'lmf;eV!:Kpcmg0!_!:T@Vmf;eVr9j^fmf3@dn,C)cmfSVd]i9L~> s3CYZrU0j'O7*)HmfELX!<)?f!:Kpamf3@emg&p^!!)KV!:KpVmg&p^mf;eV!:Kpdmf3@_mgT9c !!)Hfn*^8F!!)HfrU0^drpL'lmf;eV!:Kpcmg0!_!:T@Vmf;eVr9j^fmf3@dn,C)cmfSW+c>%k~> s/c78rU0p)O7*);n,<=emf3@dmfNRYmf<7Rr;cfbrrE)f!!)HUrrE&erW)oc!!)c^rrE)f#lsG_ !:T@V!:Kpen,37dmfELXn,<=bmfELXn,<:hmf;eVr9sXc!Ug$en,C)cmfSVGX?D(~> s1SHIrU0p)O7*);n,<=emf3@dmfNRYmf<7Rr;cfbrrE)f!!)HUrrE&erW)oc!!)c^rrE)f#lsG_ !:T@V!:Kpen,37dmfELXn,<=bmfELXn,<:hmf;eVr9sXc!Ug$en,C)cmfSVd]i9L~> s3CYZrU0p)O7*);n,<=emf3@dmfNRYmf<7Rr;cfbrrE)f!!)HUrrE&erW)oc!!)c^rrE)f#lsG_ !:T@V!:Kpen,37dmfELXn,<=bmfELXn,<:hmf;eVr9sXc!Ug$en,C)cmfSW+c>%k~> s/c78rU0j'O7*($mfNRY!!)udrkI[c"-63Y4b*~> s1SHIrU0j'O7*($mfNRY!!)udrkI[c"-762<.F~> s3CYZrU0j'O7*($mfNRY!!)udrkI[c"-85_C4H~> s/c78rU0m(O7*&Ko'cSYQ1+\Pr9sX"kjJV7:96U/~> s1SHIrU0m(O7*&Ko'cSYQ1+\Pr9sX"kjJV7CV<\t~> s3CYZrU0m(O7*&Ko'cSYQ1+\Pr9sX"kjJV7LX'Xb~> s/c78rU0d%O+@<,!<0asmfSVGX?D(~> s1SHIrU0d%O+@<,!<0asmfSVd]i9L~> s3CYZrU0d%O+@<,!<0asmfSW+c>%k~> s/c78rU0m(Nr\Y;nc8^YqZ-ZbirK)I[K- s1SHIrU0m(Nr\Y;nc8^YqZ-ZbirK)I[K- s3CYZrU0m(Nr\Y;nc8^YqZ-ZbirK)I[K- s/c78rU1!+Nr\VK!:TCN!!)Ka!!)Ke!!)JR!<0asmfSVGX?D(~> s1SHIrU1!+Nr\VK!:TCN!!)Ka!!)Ke!!)JR!<0asmfSVd]i9L~> s3CYZrU1!+Nr\VK!:TCN!!)Ka!!)Ke!!)JR!<0asmfSW+c>%k~> s/c78rU0j'Nr\YF!<2Ej!:Kmfn*g,R!:TdbrpTgd"Rc s1SHIrU0j'Nr\YF!<2Ej!:Kmfn*g,R!:TdbrpTgd"Rc s3CYZrU0j'Nr\YF!<2Ej!:Kmfn*g,R!:TdbrpTgd"Rc s/c78rU0j'Nr\YF!!)Kd!!;Thn+Zn_n,E@fn+cqemf3@V!:T^`!:T^`!q--Xq#CKb!:Rl,rkI[c "-63Y4b*~> s1SHIrU0j'Nr\YF!!)Kd!!;Thn+Zn_n,E@fn+cqemf3@V!:T^`!:T^`!q--Xq#CKb!:Rl,rkI[c "-762<.F~> s3CYZrU0j'Nr\YF!!)Kd!!;Thn+Zn_n,E@fn+cqemf3@V!:T^`!:T^`!q--Xq#CKb!:Rl,rkI[c "-85_C4H~> s/c78rU0j'Nr\YF!!)Kd!!;Thn+H__mf;hP!<)?d!<)Ba!!)K`!!;Thn+cqbmf;gq!<0asmfSVG X?D(~> s1SHIrU0j'Nr\YF!!)Kd!!;Thn+H__mf;hP!<)?d!<)Ba!!)K`!!;Thn+cqbmf;gq!<0asmfSVd ]i9L~> s3CYZrU0j'Nr\YF!!)Kd!!;Thn+H__mf;hP!<)?d!<)Ba!!)K`!!;Thn+cqbmf;gq!<0asmfSW+ c>%k~> s/c78rU0j'Nr\YF!!)Kd!!;Thn+m"an,<:gmf;hP!!)Kd!!)K`!!)K^!!)K`!!;Thn&5;+^Zb+g O%uc>J,~> s1SHIrU0j'Nr\YF!!)Kd!!;Thn+m"an,<:gmf;hP!!)Kd!!)K`!!)K^!!)K`!!;Thn&5;+^Zb+g O))F.J,~> s3CYZrU0j'Nr\YF!!)Kd!!;Thn+m"an,<:gmf;hP!!)Kd!!)K`!!)K^!!)K`!!;Thn&5;+^Zb+g O,)"qJ,~> s/c78rU0j'Nr\YF!!)Kd!!;Thn+m%an,E@kmf;hF!:Tgc#k%`nmf;hF!:Tgc!:Taa%dsAtn*^8F !!)Hfn*^8F`;onPkjJV7:96U/~> s1SHIrU0j'Nr\YF!!)Kd!!;Thn+m%an,E@kmf;hF!:Tgc#k%`nmf;hF!:Tgc!:Taa%dsAtn*^8F !!)Hfn*^8F`;onPkjJV7CV<\t~> s3CYZrU0j'Nr\YF!!)Kd!!;Thn+m%an,E@kmf;hF!:Tgc#k%`nmf;hF!:Tgc!:Taa%dsAtn*^8F !!)Hfn*^8F`;onPkjJV7LX'Xb~> s/c78rU0j'Nr\X"!;ccq^Zb+gO%uc>J,~> s1SHIrU0j'Nr\X"!;ccq^Zb+gO))F.J,~> s3CYZrU0j'Nr\X"!;ccq^Zb+gO,)"qJ,~> s/c78rU0j'Nr\X"!;ccq^Zb+gO%uc>J,~> s1SHIrU0j'Nr\X"!;ccq^Zb+gO))F.J,~> s3CYZrU0j'Nr\X"!;ccq^Zb+gO,)"qJ,~> s/c78rU0d%O+Hcqn,C)cmfSVGX?D(~> s1SHIrU0d%O+Hcqn,C)cmfSVd]i9L~> s3CYZrU0d%O+Hcqn,C)cmfSW+c>%k~> s/c78rU0d%O+Hcqn,C)cmfSVGX?D(~> s1SHIrU0d%O+Hcqn,C)cmfSVd]i9L~> s3CYZrU0d%O+Hcqn,C)cmfSW+c>%k~> s/c78rU0p)O7*);n,<=^mf3@an,ECfmfELX!;#XZ!:fLX!:B4Z!:T@V!:KpYmfELX!9N\K^Zb+g O%uc>J,~> s1SHIrU0p)O7*);n,<=^mf3@an,ECfmfELX!;#XZ!:fLX!:B4Z!:T@V!:KpYmfELX!9N\K^Zb+g O))F.J,~> s3CYZrU0p)O7*);n,<=^mf3@an,ECfmfELX!;#XZ!:fLX!:B4Z!:T@V!:KpYmfELX!9N\K^Zb+g O,)"qJ,~> s/c78rU0j'O7*)Hmf3@`mf3@amf3@emf3@Xmf3@]n,ECemf3@Tmf3@emfELX!:oRY!9J,~> s1SHIrU0j'O7*)Hmf3@`mf3@amf3@emf3@Xmf3@]n,ECemf3@Tmf3@emfELX!:oRY!9 s3CYZrU0j'O7*)Hmf3@`mf3@amf3@emf3@Xmf3@]n,ECemf3@Tmf3@emfELX!:oRY!9 s/c78rU0j'O7*)Img9'`mf;hF!:KpV!;Z'`!<)?i!:Kmfmf<=T$39Mp!:KpV!:T@Vr9kC$n*^8F mf;eV!:KpVmf;eV!:KpVmf<=T!!*#e*WYX/mf;hF!:Kmfmf;hF!:Kmfmf;eVn*^8F!!)Hfn*g7j kjJV7:96U/~> s1SHIrU0j'O7*)Img9'`mf;hF!:KpV!;Z'`!<)?i!:Kmfmf<=T$39Mp!:KpV!:T@Vr9kC$n*^8F mf;eV!:KpVmf;eV!:KpVmf<=T!!*#e*WYX/mf;hF!:Kmfmf;hF!:Kmfmf;eVn*^8F!!)Hfn*g7j kjJV7CV<\t~> s3CYZrU0j'O7*)Img9'`mf;hF!:KpV!;Z'`!<)?i!:Kmfmf<=T$39Mp!:KpV!:T@Vr9kC$n*^8F mf;eV!:KpVmf;eV!:KpVmf<=T!!*#e*WYX/mf;hF!:Kmfmf;hF!:Kmfmf;eVn*^8F!!)Hfn*g7j kjJV7LX'Xb~> s/c78rU0j'O7*)Fmf3@dmfELX!;Q$_!<;Kk!:KpVmf<4Q#6=2mmf;hF!;u9k!:T@Vn*^8F!;Z'` !<)?d!<)Bb!<;Km!:KpVmf;eVqJ,~> s1SHIrU0j'O7*)Fmf3@dmfELX!;Q$_!<;Kk!:KpVmf<4Q#6=2mmf;hF!;u9k!:T@Vn*^8F!;Z'` !<)?d!<)Bb!<;Km!:KpVmf;eVq s3CYZrU0j'O7*)Fmf3@dmfELX!;Q$_!<;Kk!:KpVmf<4Q#6=2mmf;hF!;u9k!:T@Vn*^8F!;Z'` !<)?d!<)Bb!<;Km!:KpVmf;eVq s/c78rU0s*O7*);mf<=T!!)ud!W_Zhp?r4dmf;eVn*^8QmfWXZ!:Kp`n,37dmfELX!;Z'e!:KpV mf<=T!!*#e"9@ljmf<=T!!)i`#lsDomf;hF!:KpSn,C)cmfSVGX?D(~> s1SHIrU0s*O7*);mf<=T!!)ud!W_Zhp?r4dmf;eVn*^8QmfWXZ!:Kp`n,37dmfELX!;Z'e!:KpV mf<=T!!*#e"9@ljmf<=T!!)i`#lsDomf;hF!:KpSn,C)cmfSVd]i9L~> s3CYZrU0s*O7*);mf<=T!!)ud!W_Zhp?r4dmf;eVn*^8QmfWXZ!:Kp`n,37dmfELX!;Z'e!:KpV mf<=T!!*#e"9@ljmf<=T!!)i`#lsDomf;hF!:KpSn,C)cmfSW+c>%k~> s/c78rU0j'O7*)Fmf3@dmfELX!;c-a!<2El!:KpV!:T@VqX4Oemf;eVoBu_\mf<1P"T[ukn*^8T mf3@emfWXZ!:Kpdmf3@`mg0!_!:KpVmf;eVm-jqgkjJV7:96U/~> s1SHIrU0j'O7*)Fmf3@dmfELX!;c-a!<2El!:KpV!:T@VqX4Oemf;eVoBu_\mf<1P"T[ukn*^8T mf3@emfWXZ!:Kpdmf3@`mg0!_!:KpVmf;eVm-jqgkjJV7CV<\t~> s3CYZrU0j'O7*)Fmf3@dmfELX!;c-a!<2El!:KpV!:T@VqX4Oemf;eVoBu_\mf<1P"T[ukn*^8T mf3@emfWXZ!:Kpdmf3@`mg0!_!:KpVmf;eVm-jqgkjJV7LX'Xb~> s/c78rU0p)O7*);n,34emf<=T!s%fY!;Z*`!<;Kk!:KpVmf<:SrrE)f"9@oZ!!)rc!!)ud#6=2m mf;eV!;u9e!:TCT!<2Hc!<;Km!:T@V!:T@Vr9sXc%.=2b!:KpVmf;hF!!)HUrkI[c"-63Y4b*~> s1SHIrU0p)O7*);n,34emf<=T!s%fY!;Z*`!<;Kk!:KpVmf<:SrrE)f"9@oZ!!)rc!!)ud#6=2m mf;eV!;u9e!:TCT!<2Hc!<;Km!:T@V!:T@Vr9sXc%.=2b!:KpVmf;hF!!)HUrkI[c"-762<.F~> s3CYZrU0p)O7*);n,34emf<=T!s%fY!;Z*`!<;Kk!:KpVmf<:SrrE)f"9@oZ!!)rc!!)ud#6=2m mf;eV!;u9e!:TCT!<2Hc!<;Km!:T@V!:T@Vr9sXc%.=2b!:KpVmf;hF!!)HUrkI[c"-85_C4H~> s/c78rU0j'O7*(dmf3@!n,C)cmfSVGX?D(~> s1SHIrU0j'O7*(dmf3@!n,C)cmfSVd]i9L~> s3CYZrU0j'O7*(dmf3@!n,C)cmfSW+c>%k~> s/c78rU0m(O7*&Ko'cSYeaEJ s1SHIrU0m(O7*&Ko'cSYeaEJ s3CYZrU0m(O7*&Ko'cSYeaEJ s/c78rU0d%O+Hcqn,C)cmfSVGX?D(~> s1SHIrU0d%O+Hcqn,C)cmfSVd]i9L~> s3CYZrU0d%O+Hcqn,C)cmfSW+c>%k~> s/c78rU0d%O+Hcqn,C)cmfSVGX?D(~> s1SHIrU0d%O+Hcqn,C)cmfSVd]i9L~> s3CYZrU0d%O+Hcqn,C)cmfSW+c>%k~> s/c78rU0d%O+Hcqn,C)cmfSVGX?D(~> s1SHIrU0d%O+Hcqn,C)cmfSVd]i9L~> s3CYZrU0d%O+Hcqn,C)cmfSW+c>%k~> s/c78rU0d%O+G(>^Zb+gO%uc>J,~> s1SHIrU0d%O+G(>^Zb+gO))F.J,~> s3CYZrU0d%O+G(>^Zb+gO,)"qJ,~> s/c78rU0d%O+G(>^Zb+gO%uc>J,~> s1SHIrU0d%O+G(>^Zb+gO))F.J,~> s3CYZrU0d%O+G(>^Zb+gO,)"qJ,~> s/c78rU5 s1SHIrU5 s3CYZrU5 s/c78Ja_4Z"-63Y4b*~> s1SHIJa_4Z"-762<.F~> s3CYZJa_4Z"-85_C4H~> s/Z48JWJ?B!`#g[J,~> s1JEIJWJ?B!c,JKJ,~> s3:VZJWJ?B!f,'9J,~> s/c0FJUZ@&rH\LG4b*~> s1SAsJXP8\rK[Jt<.F~> s3CSJJ[F1=rNQCKC4H~> s/Z9JIYNE,g4TW]IX$+=4b*~> s1JK"R@f&%g7AJ s3:\N[(([rg:%6o['6d[C4H~> s/Z6AFb,"oIKXt;END s1JGpP(B%RR08h;O1eMC~> s3:YIY( s/c65JS<_M!,DLK!N\G7~> s1SGfJV`!8!/^]4!PMH_~> s3CYAJZ%2!rMTbBC4H~> JZR5"!'Pi~> J\BFD!*"I~> J^2Wf!,@#~> JcF'rJ,~> JcF'rJ,~> JcF'rJ,~> showpage end %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.5/doc/figs/secondlinelist.eps0000644000175000017500000052370312310162300015514 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: noname.ps %%Creator: pnmtops %%CreationDate: 12. Mär 17:51 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 227 246 385 516 %%HiResBoundingBox: 227.033993 246.113992 384.965988 515.879984 %%EndComments %%BeginProlog %%BeginPreview: 158 270 8 1080 % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ff62626262626262626262626229a929292929292929292929626262626262626262626262292929 % 29292929292929292962626262626262626262626229292929292929292929292962626262626262 % 62626262622929292929292929292929296262626262626262626262622929292929292929292929 % 29626262626262626262626262292929292929292929a92929626262626262626262626262ff % ff626262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262a96262626262626262626262626262ff % ff29a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2962ff % ff29a9ff292929292929292929626229626262626262626262292929292929292929292929626262 % 62626262626262626229292929292929292929292962626262626262626262626229292929292929 % 29292929296262626262626262626262622929292929292929292929296262626262626262626262 % 62292929292929292929622929626262626262626262626262292929292929292929ff2962ff % ff29a9ff296262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a92962626262626262626262a96262ffffffffffffff62a9ff2962ff % ff29a9ff29626262626262626262622962626262626262ff626262ff62ff62626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a92962626262626262626262a96262626262626262ff62a9ff2962ff % ff29a9ff29626262626262626262622962626262626262ff6262ff62ff6262ffff6262ffff626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a92962626262626262626262a96262626262626262ff62a9ff2962ff % ff29a9ff2962ffffffffffffff62622962626262626262ffff62ff62ff62ff62ff62ff6262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a929626262ffff6262626262a96262626262626262ff62a9ff2962ff % ff29a9ff296262626262626262ff6229626262626262ff626262ff62ffff626262626262ff626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a92962626262ff6262626262a96262626262626262ff62a9ff2962ff % ff29a9ff296262ffffffffffffff6229626262626262ff6262ff62ff62ff62ff62ff62ff62626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a929626262ffff6262626262a96262626262626262ff62a9ff2962ff % ff29a9ff296262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a92962626262626262626262a96262626262626262ff62a9ff2962ff % ff29a9ff296262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a92962626262626262626262a96262626262626262ff62a9ff2962ff % ff29a9ff296262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a92962626262626262626262a9626262ffffffffffff62a9ff2962ff % ff29a9ff62a9a9a9a9a9a9a9a9626229626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262 % 626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9 % a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262626262626262626262 % 62a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262a96262a9a9a9a9a9a9a9a9a9ff2962ff % ff2962a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020ff6229ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a950505050505050505050ff5050ff50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a950505050505050505050ff5050ff5050ffff50ffff505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a950505050505050ffff50ff5050ff50ff505050ff50505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a950505050505050505050ff5050ff50ff505050ff50505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff29a9a950505050505050505050ff505050ff50ffff50ff50505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a95050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b505050505050ff2962ff % ff29a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b505050505050505050ff505050505050505050505050ff505050505050 % 50505050505050505050505050505050ff5050505050505050505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b505050ff50505050505050505050505050505050505050505050505050 % 505050505050505050505050ff505050ff50505050ff505050505050505050505050505050505050 % 505050505050ff50ffff505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b505050ff505050ff5050ff50ff50ff50ffff50ff505050ff50ff50ff50 % ff50ff50ff50ff50ff50ff50ff50ff50ff50ff50ffff50ff50ff505050ff50ff50ff50ff50ff50ff % 50ff50ff5050ff505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff6262a95050505050509b50505050505050ffff50ff505050505050ff505050ff50ff5050505050 % ff505050ff505050ff50ff5050505050ff50ff50ffff50ff505050ff50ff505050505050505050ff % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b5050ff5050ff50ff5050ff50ff50ff50ffff50ff505050ff505050ff50 % ff505050ff50ff50ff50ffff5050ff50ff50ff50ffff50ff50ff505050ff50ff50ff50ff50ff50ff % 5050505050ff50505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % ff50505050505050ff50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b5050505050505050505050ffff5050505050ffff50505050505050ffff % 5050505050505050ff505050505050505050505050505050505050505050ffff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b2020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050ff50ff50505050505050505050ff50505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a95050505050505050505050ff5050ff50ffff5050ff50ff5050ffff50ffff505050ff5050 % ffff50505050505050505050505050505050505050505050505050505050505050ff505050ffff50 % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a95050505050505050505050ff505050ff505050ff5050ff50ff505050ff505050ff50ff50 % ff5050505050505050505050505050505050505050505050505050505050ffffffff5050ff505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a95050505050505050505050ff505050ff505050ff5050ff50ff505050ff505050ff505050 % 50ff50505050505050505050505050505050505050505050505050505050505050ff5050ff505050 % 5050ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050ff50ff505050ff50ff50ff50ffff50ff50ff50ff505050ff50ff50 % 505050505050505050505050505050505050505050505050505050505050505050ff5050ff50ff50 % ff50ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a950505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b50509b9b9b9b9b9b9b50505050509b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b2050509b9b9b9b9b9b205050505050ff2962ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a209b6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a9b6a6a205050505050ff6262ff % ff6262a950505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffff502050509b6a6a209b6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a209b6a6a205050505050ff6262ff % ff6262a950505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffff502050509b6a2050506a2050505050509b5050ff5050ff5050505050 % 505050505050505050ff5050ff505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a20509b6a205050505050ff6262ff % ff6262a950505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffff502050509b6a2050509b2050505050509b5050ff5050ff5050ffffff % 5050ff5050ffff505050505050505050ff50ff5050ffff5050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b2050509b6a205050505050ff6262ff % ff6262a950505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffff502050509b209b9b9b9b2050505050509b5050ffffffff5050ff5050 % 50ff5050505050ff5050505050505050ff5050ffff50505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b9b9b9b9b9b205050505050ff6262ff % ff6262a950505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffff502050509b20202020202050505050509b5050ff5050ff5050ff5050 % 50ff5050505050505050505050505050ff5050ffff50505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050ffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffff502050509b205050509b2050505050509b5050ff5050ff5050ff5050 % 50ff50ff50ff50ff50ff5050ff50ff50ffff50ffff50ff5050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffff502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b2020202020205050505050ff6262ff % ff6262a950505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffff502050509b205050509b2050505050509b5050505050505050505050 % 5050ffff505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b205050509b205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b205050509b205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b205050509b205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050505050 % 505050505050505050ffff5050505050505050505050505050505050505050505050ff5050505050 % 505050505050505050505050505050505050502050509b209b9b9b9b205050505050ff6262ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050ffffff % 5050ff5050ffff5050505050ff505050ff505050ff50ff5050ffff50ffff5050ffffff5050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ffffffff5050ff5050 % 50ff5050505050ff50505050ff50505050ff505050505050ff505050ff50ff505050ff5050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050ff5050 % 50ff50505050505050505050ff5050ff50ff505050505050ff505050ff50ff505050ff5050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ffff5050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050ff5050 % 50ff50ff50ff50ff505050ff505050ff50ff505050505050ff50ff50ff50ff50ff50ff5050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 5050ffff505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b50505050ff505050ff505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050505050 % 505050505050505050ffff5050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050ffff505050ff505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b50505050ff50ff50ff505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050ff50ff % 50ff50ff50ff50ff50505050ff50ff50ffff50ff50ff50ff50ff50ff505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff50ff505050ff505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050ff5050 % 50ff505050ffffff50505050ff505050ffff505050ffffff50ff5050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff6262a950505050509b50505050ff50ff50ff505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050ff5050 % 50ff50ff50ff50ff505050ff5050ff50ffff50ff50ff50ff50ff50ff505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 5050ffff505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050ffff50505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050505050 % 505050505050505050ff505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050505050ff505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050505050 % 505050505050505050ff505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ff505050505050ffff50ff505050ff50ff5050505050ffff50ff50ff % 5050505050ff50ff50ff50ff502050509b205050509b2050505050509b5050ff5050ff5050ff50ff % 50ff50ff50ff50ff50ff505050ff50ff5050ff50ff50ff50ff50ff50505050ff50ffff50ff505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ff505050505050ffff5050505050ffffff5050505050ffff50ffffff % 505050505050ffff505050ff502050509b205050509b2050505050509b5050ff5050ff5050ff5050 % 50ff505050ffffff50ff5050505050ff50505050ff505050ff5050505050505050ffffffff505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050505050ff505050ffff5050ffff505050ff5050505050ffff50ff5050 % 5050505050ff5050505050ff502050509b205050509b2050505050509b5050ff5050ff5050ff5050 % 50ff50505050505050ff5050505050ff50505050ff505050ff5050505050505050ffff5050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050ffff5050ffffffff5050505050ffffff50ff50ffffffff5050ffff % 5050ffffff50ff50ff50ff50502050509b205050509b2050505050509b5050ff5050ff5050ff5050 % 5050ff5050ffff5050ffffff50ffff505050505050ff505050ffff50ff505050ff5050ffff505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50ff50ff50505050505050505050505050505050ff50ff5050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b209b9b9b9b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff5050505050505050ff505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050505050 % 5050505050505050ffffffffff505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050505050 % 50505050505050505050ff5050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff50ff50ff50ff5050ff50505050ff50ff50ff50ff50ff5050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050ff50ff % 50ff50ff50ff50ff5050ff5050ff50ff505050ff50ff50ff50505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff50ff50ffffff5050ff505050505050ff505050ffffff5050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050ff5050 % 50ff505050ffffff5050ff5050ffffff505050505050ffff50505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff50ff505050505050ff505050505050ff5050505050ff5050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050ff5050 % 50ff5050505050505050ff5050ff50505050505050ff505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff50ff50ffff505050ff50ff50ffff5050ffff50ffffff50ff505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050ff5050 % 5050ff5050ffff505050ff505050ffff50ff50505050ff50ff505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50ff50ff505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff6262a950505050509b5050ff505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050505050 % 50505050505050505050ff5050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ff50ff5050ff50ff50ff50ff50ff50ff505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050ff50ff % 50ff50ff50ff50ff5050ff5050ff505050ff50ff50ff50ff50ff50ff5050ff50ff50505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ff50ff5050ff505050ff505050ffffff505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050ff5050 % 50ff505050ffffff5050ff5050ff505050ffffff505050ff505050ff5050ffffff50505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ff50ff5050ff505050ff505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050ff5050 % 50ff5050505050505050ff5050ff5050505050ff505050ff505050ff505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ff50ff5050ff50505050ff5050ffff50505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050ff5050 % 5050ff5050ffff505050ff5050ff505050ffffff505050ff50ffffff5050ffff5050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050505050505050505050ff50ff50505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50ff50ff505050505050505050505050505050505050505050ff50ff505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ff50505050505050505050505050505050ff50505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff50ff50ff50505050 % 5050505050505050ff50505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ffff50ff5050ffffffff5050ff505050ffffffff50ffff5050505050 % ffff50505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff505050ff50ffff50 % 5050ffffff50505050505050ffff505050ff505050ffff50ffffffff505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ff50ff50505050ff505050ff50ff505050ff5050505050ff505050ff % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ffff5050ff505050ff % 5050ff505050ffff505050505050ff5050505050505050ff50505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff29a9a950505050509b5050ff50ff50ffff50ff505050ff5050505050ff5050505050ff505050ff % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff50ff50ff50505050 % 5050ff5050505050505050505050ff5050505050505050ff50505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff50ff50505050ffffff5050ff50505050ffffff50ffff5050505050 % ffff50505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ffff50ffff50 % 5050ff505050ffffff50ff50ffffff5050ff50ff50ffff5050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050ff5050ff5050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff50ff50ff50505050 % 5050505050505050ff5050505050505050ff50505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ffff50505050ff50ff50ffffff505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff505050ff50ffff50 % 5050ffffff50505050505050ffff50ffffff50505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ffff5050505050505050ff5050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ffff5050ff505050ff % 5050ff505050ffff505050505050ff5050ff50505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ffff5050505050505050ff5050505050505050505050505050505050 % 505050505050505050505050502050509b202020209b2050505050509b5050ff505050ff50505050 % 5050ff5050505050505050505050ff5050ff50505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b202020209b205050505050ff2962ff % ff29a9a950505050509b5050ffff50ff505050505050ff50ff505050505050505050505050505050 % 505050505050505050505050502050509b6a2050509b2050505050509b5050ff505050ff50ff50ff % 5050ff5050505050ff50ff50ff50ff5050ff50505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b2050509b6a205050505050ff2962ff % ff29a9a950505050509b5050ff505050505050505050ff5050505050505050505050505050505050 % 505050505050505050505050502050509b6a2050506a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a20509b6a205050505050ff2962ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a209b6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a9b6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202050509b20202020202050505050509b2020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020205050202020202020205050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a950505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b50505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b205050505050505050505050505050ff6262ff % ff6262a950505050509b6a6a6a20206a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20202020 % 202020202020209b20206a6a6a2050505050505050505050505050509b6a6a6a6a206a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20202020202020202020202020202020 % 2020202020202020202020202020206a6a6a6a205050505050505050505050505050ff6262ff % ff6262a950505050509b6a6a20509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20505050 % 505050505050509b205020206a2050505050505050505050505050509b6a6a20209b6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20505050505050505050505050505050 % 5050505050505050505050509b205020206a6a205050505050505050505050505050ff6262ff % ff6262a950505050509b202050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20505050 % 505050505050509b205050509b2050505050505050505050505050509b202050509b6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20505050505050505050505050505050 % 5050505050505050505050509b205050509b9b205050505050505050505050505050ff6262ff % ff6262a950505050509b6a6a9b509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20505050 % 505050505050509b20509b9b6a2050505050505050505050505050509b6a6a9b9b9b6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20505050505050505050505050505050 % 5050505050505050505050509b20509b9b6a6a205050505050505050505050505050ff6262ff % ff6262a950505050509b6a6a6a9b9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a209b9b9b % 9b9b9b9b9b9b9b9b209b6a6a6a2050505050505050505050505050509b6a6a6a6a9b6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b209b6a6a6a6a205050505050505050505050505050ff6262ff % ff6262a950505050509b202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202050505050505050505050505050509b2020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020205050505050505050505050505050ff6262ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020202020209b5050505050ff2962ff % ff29a9a9505050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff2962ff % ff29a9a9505050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff2962ff % ff29a9a9505050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff2962ff % ff29a9a9505050505020205050505050505050505050505050ff5050ff5050505050505050505050 % 5050505050ff50505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff2962ff % ff29a9a9505050505020205050505050505050505050505050ff5050ff50ffff50ffff5050ff5050 % 5050505050ff50ffffffff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff2962ff % ff29a9a9505050505020205050505050505050505050505050ffffff50505050ff50505050505050 % 5050505050ff50ff5050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff2962ff % ff6262a9505050505020205050505050505050505050505050ff505050505050ff50505050505050 % 5050505050ff50505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff6262ff % ff6262a9505050505020205050505050505050505050505050ff50505050ffffff50ff5050505050 % 5050ffffffff50ffff50ff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff6262ff % ff6262a9505050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff6262ff % ff6262a9505050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff6262ff % ff6262a950505050502020509b202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff29a9a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9bffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9bffffffffffffff50ffffffffffffffffffffffff50ffffffffff % ffffffffffffffffffffffffffffffffff50ffffffff50ffffffffffff50ffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9bff50ffffff50ffffff50ffff5050ffff50ffffffff5050ffff50 % 5050ffff50ff5050ffff50ffff50ff505050ff5050ff50ffff5050ffffffff50ffff5050ffff5050 % ffffff50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9bffffffffff5050ff50ffffffffffff50ffffff50ff50ff50ffff % ff50ffffffffffffffffff50ffffffffff50ffffffff50ffffffffff50ff50ffffffffff50ffffff % 50ffffffff50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9bffffffffff5050ff50ffffffffffff50ffffff50ff50ff50ffff % ff50ffffff50ffffffffff50ffffffffff50ff50ffff50ff50ffffff50ff50ffffffffffffffffff % 50ffffffff50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9b50ffff50ff50ffff50ff50ff50ff5050ff50ffffff50ff50ff50 % ff50ffffff50ff50ff50ff5050ffff50ff50ff50ffff50ff50ff50ffffff50ff50ff50ff50ff50ff % 50ffffffff50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9bffffffffffffffffffffffffffffffffffffffffffffffffffff % ff50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9bffffffffffffffffff5050ffffffffff5050ffffffffffffff50 % 50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5050ffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9b50505050505050ff505050505050505050505050ff5050505050 % 5050505050505050505050505050505050ff50505050ff5050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff2962ff % ff6262a950505050502020509b9b50ff505050ff5050ff50ff50ff50ffff50ff505050ff50ff50ff % 50ff50ff50ff50ff50ff50ff50ff50ff50ff50ff5050ff50ff50ff50505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050ffff50ff505050505050ff505050ff50ff50ff5050 % 50ff50505050ffff505050ff5050505050ff50ffff50ff5050ffff50505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9bff50505050ff5050ff5050505050ffff5050505050ff50ff5050 % 50ff505050ff5050505050ffff50505050ff50505050ff50ff505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9bff5050ffffff505050ff5050ffff5050ff50505050ff50ff50ff % ffff50505050ff50ff50ff50ff5050ffffff50ffffff50ff50ff50ff505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050ff50ff50505050ff50ff50505050505050ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b2020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b509b9b5050505050ff6262ff % ff6262a9505050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff6262ff % ff6262a9505050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff6262ff % ff29a9a9505050505020209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050ff2962ff % ff29a9a95050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a950505050505050ff50ff50505050505050505050505050ff50ff50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a95050505050505050505050ffff50505050ffff5050ff50ff50ff50ffff505050ff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a95050505050505050ff50505050ff5050ff505050ff5050ff50ff505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff6262a9505050505050505050ff505050505050ff505050ff50ffff50ff505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a95050505050505050ff5050ffff50505050ffff5050ff5050ffff50ffff50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a95050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b505050505050ff6262ff % ff6262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b505050505050505050ff505050505050505050505050ff505050505050 % 50505050505050505050505050505050ff5050505050505050505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b505050ff50505050505050505050505050505050505050505050505050 % 505050505050505050505050ff505050ff50505050ff505050505050505050505050505050505050 % 505050505050ff505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff29a9a95050505050509b50505050505050ffff50ff505050505050ff505050ff50ff5050505050 % ff50505050505050ff50ff5050505050ff505050ffff5050505050ff50ff5050505050ff505050ff % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b50505050505050ffff50ff505050505050ff505050ff50ff5050505050 % ff505050ff505050ff50ff5050505050ff50ff50ffff50ff505050ff50ff505050505050505050ff % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b5050ff5050ff50ff5050ff50ff50ff50ffff50ff505050ff505050ff50 % ff505050ff50ff50ff50ffff5050ff50ff50ff50ffff50ff50ff505050ff50ff50ff50ff50ff50ff % 5050505050ff50505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % ff50505050505050ff50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b5050505050505050505050ffff5050505050ffff50505050505050ffff % 5050505050505050ff505050505050505050505050505050505050505050ffff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b2020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff29a9a95050505050505050502020202020202020202020202020202020202020209b5050505050 % 50505050505050505050505050505050505050505050505050505050202020202020202020202020 % 2020202020202020209b505050505050505050505050505050505050505050505050505050505050 % 5050502020202020202020202020202020202020202020209b505050505050505050ff2962ff % ff29a9a950505050505050505020505050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505050505050505050505050202050505050505050505050 % 50505050505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050505050505050505050505050509b505050505050505050ff2962ff % ff29a9a950505050505050505020505050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505050505050505050505050202050505050505050505050 % 50505050505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050505050505050505050505050509b505050505050505050ff2962ff % ff29a9a950505050505050505020505050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505050505050505050505050202050505050505050505050 % 50505050505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050505050505050505050505050509b505050505050505050ff2962ff % ff29a9a950505050505050505020505050505050ff50ff505050505050505050509b9b5050505050 % 5050505050505050505050505050505050505050505050505050505020205050ff50505050ff5050 % 50505050505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050ff50505050ff505050505050509b505050505050505050ff2962ff % ff29a9a9505050505050505050205050505050ff505050ff5050505050505050509b9b5050505050 % 5050505050505050505050505050505050505050505050505050505020205050ff50505050ffffff % 50ffff5050ff50509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050ff5050ffffff50ffff505050509b505050505050505050ff2962ff % ff29a9a9505050505050505050205050505050ff505050ff50ff505050505050509b9b5050505050 % 5050505050505050505050505050505050505050505050505050505020205050ffffff5050ff5050 % 505050ff505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050ffffffff50505050ff505050ff5050509b505050505050505050ff2962ff % ff29a9a9505050505050505050205050505050ff505050ff5050ff5050505050509b9b5050505050 % 5050505050505050505050505050505050505050505050505050505020205050ff50505050ff5050 % 50505050505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050ff50505050ff505050505050509b505050505050505050ff2962ff % ff29a9a950505050505050505020505050505050ff50ff50505050ff50505050509b9b5050505050 % 5050505050505050505050505050505050505050505050505050505020205050ff50505050ff5050 % 50ff50ff505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050ff5050ff50ff50ff50ff5050509b505050505050505050ff2962ff % ff29a9a950505050505050505020505050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505050505050505050505050202050505050505050505050 % 50505050505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050505050505050505050505050509b505050505050505050ff2962ff % ff29a9a950505050505050505020505050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505050505050505050505050202050505050505050505050 % 50505050505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050505050505050505050505050509b505050505050505050ff2962ff % ffa9a9a950505050505050505020505050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505050505050505050505050202050505050505050505050 % 50505050505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050505050505050505050505050509b505050505050505050ff29a9ff % ff6262a9505050505050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050 % 5050505050505050505050505050505050505050505050505050505020209b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b505050505050505050505050505050505050505050505050505050505050 % 50505020209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b505050505050505050ff6262ff % ff6262a95050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050 % 50505050505050505050505050505050505050505050505050505050209b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b505050505050505050505050505050505050505050505050505050505050 % 505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6262ff % ff296262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262a96262626262626262626262626262ff % ffa9a9a9a9a9a9a9a9a9a9a9a9626229626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262 % 626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9 % a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262626262626262626262 % 62a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262a92962a9a9a9a9a9a9a9a9a9a9a9a9ff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice /pop load def %%EndProlog %%Page 1 1 /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 329 string def gsave 227.04 246.12 translate 157.92 269.76 scale 329 562 8 [ 329 0 0 -562 0 562 ] { picstr readstring } image 80008000b7000000e3d6019d5680d680d6f9d6015656e2d6019d007f00d6 d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656 d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d48d69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d56d6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9d9d0003 00d69dd6e59d0256d6d6809d809dfb9d035656d6d6e49d0156000200d6d6 e49d0156d6809d809df99d0156d6e49d02569d007f00d69dd69d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d567f 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d56419d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d56fb9d0156007f00d6d69d9d9d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d7f 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d48569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d9d9dd69d569d000600d69dd69d569d 80008000c50006d6d69d9d9d56000700d6d69d9d9d560080d680d6c7d607 00d69dd69d569d007f00d69dd69d569d00d6d69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd6d6d69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6489dd69d d69dd69dd69dd69dd69dd69d9dd6d69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69d00d6d69d9d9d56000800d6d69d9d9d5600d6ea9d0156d6809d929d01 56d6e99d0256d6d6eb9d085600d69dd69d569d000900d69dd69d569d00d6 d6eb9d0256d6d6809d939d0256d6d6eb9d025656d6fc9df200fd9d095656 00d6d69d9d9d56000800d6d69d9d9d5600d6eb9d025656d6f19df900069d 00009d9d0000809db09d025656d6e99d0656d6d69d9d9d00f49d0000fc9d 085600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6f29d01 0000fa9d0500009d9d0000809daf9d0256d6d6eb9d025656d6fc9d0000f4 9d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d0256 56d6f19d010000f79d010000809daf9d025656d6e99d0656d6d69d9d9d00 f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d569d00d6d6eb9d 0256d6d6f39d010000fa9d0800009d9d00009d9d9dfc00fc9dfc00809dbd 9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d 56000800d6d69d9d9d5600d6eb9d025656d6f29d010000fa9d1500009d9d 00009d9d00009d9d00009d9d00009d9d0000809dbf9d025656d6e99d0656 d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000b00d69dd69d56 9d00d6d69d9df000fd9d0256d6d6f39dfa00139d9d00009d00009d9d0000 9d9d9d00009d9d0000809dba9d0256d6d6f99dfc00f69d025656d6fc9d00 00f49d0d00009d9d565600d6d69d9d9d56000c00d6d69d9d9d5600d69d9d 9d00f29d05009d9d5656d6f39d010000fa9d0700009d9d00009d9dfa00fc 9dfd00809dbd9d025656d6f89d04009d9d0000f69d0656d6d69d9d9d00f4 9d0d00009d9d9d5600d69dd69d569d000c00d69dd69d569d00d6d69d9d00 f29d0600009d9d56d6d6f49d010000fa9d0800009d9d00009d0000f59d01 0000809dbd9d0256d6d6f99d04009d9d0000f79d025656d6fc9d0000f49d 0d00009d9d565600d6d69d9d9d56000b00d6d69d9d9d5600d69d9d9def00 039d5656d6f39d010000fa9d0800009d9d00009d0000fa9d0600009d9d9d 0000809dbe9d025656d6f89dfb00f69d0656d6d69d9d9d00f49d0d00009d 9d9d5600d69dd69d569d000900d69dd69d569d00d6d6fc9df100049d9d56 d6d6f59d010000fa9d1500009d9d00009d9d00009d9d00009d9d00009d9d 0000809dbc9d0256d6d6f89dfc00f79d025656d6fc9d0000f49d0d00009d 9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d025656d6f49d01 0000fa9d0800009d9d00009d9d9dfc00fc9dfc00809dbc9d025656d6e99d 0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69dd6 9d569d00d6d6eb9d0256d6d6809d939d0256d6d6eb9d025656d6fc9d0000 f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d02 5656d6809d939d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d56 00d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6809d939d02 56d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d5600 0800d6d69d9d9d5600d6eb9d025656d6809d939d025656d6e99d0556d6d6 9d9d9df100fd9d085600d69dd69d569d000900d69dd69d569d00d6d6eb9d 0256d6d6809d939d0256d6d6eb9d025656d6fa9df3000b9d9d565600d6d6 9d9d9d56000800d6d69d9d9d5600d6eb9d025656d6809d939d025656d6e9 9d0256d6d6eb9d085600d69dd69d569d007f00d69dd69d569d00d69d9d56 9d569d569d569d569d569d569d569d569d569d56d6569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d567f9d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d56489d569d569d569d569d569d569d569d56d6569d569d569d56 9d569d569d569d569d569d569d569d5656d69d569d569d569d569d569d56 9d569d569d569d569d565600d6d69d9d9d560008009d569d9d9d56009de9 56009d80569156009de856009de9560700d69dd69d569d000000fb56009d 80008000c50001d6d6fc56ff000000fcd6029d565680df80dfc7df0200d6 9dfcd6ff000800d6d6d69d569d56df80af80afc9af086400d6d69dd6d6d6 000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d6 9dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d 5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80 af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9 af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400 d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d 569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d560008 00d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd6 9d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656 df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80 afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af08 6400d69dd69d569d000800d69dd69d569d56dff3aff90004af00afaf0080 af80afe2af086400d6d69d9d9d56000800d6d69d9d9d5656dff3af0000f9 af0600afaf00afaf0080af80afe5af086400d69dd69d569d000800d69dd6 9d569d56dff3af0000f6af0300afaf0080af80afe5af086400d6d69d9d9d 56000800d6d69d9d9d5656dff3af0000f9af0a00afaf00af000000afafaf fc00fdaf0300af000080af80aff4af086400d69dd69d569d000800d69dd6 9d569d56dff3af0000f9af1300afaf00afaf00afafaf0000afaf0000afaf 000080af80aff2af086400d6d69d9d9d56000800d6d69d9d9d5656dff3af fa000cafaf00afaf00afaf00afafaf00fcaf0300afaf0080af80aff1af08 6400d69dd69d569d000800d69dd69d569d56dff3af0000f9af0900afaf00 afaf00afafaffa0002afaf0080af80aff1af086400d6d69d9d9d56000800 d6d69d9d9d5656dff3af0000f9af0a00afaf00afaf00afafaf00f9af0000 80af80aff1af086400d69dd69d569d000800d69dd69d569d56dff3af0000 f9af0a00afaf00afaf00afafaf00f9af000080af80aff1af086400d6d69d 9d9d56000800d6d69d9d9d5656dff3af0000f9af1200afaf00afaf00afaf af0000afaf0000afaf0080af80aff1af086400d69dd69d569d000800d69d d69d569d56dff3af0000f9af0a00afaf00afafaf0000afaffc00fdaf0000 80af80aff1af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80af c9af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af0864 00d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd6 9d569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d5600 0800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69d d69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d56 56df80af80afc9af086400d69dd69d569d000800d69dd69d569d56dff4af 80648064e164f4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af 80648064e26400dff4af086400d69dd69d569d000800d69dd69d569d56df f4af01646480af80afe5af01dfdff4af086400d6d69d9d9d56000800d6d6 9d9d9d5656dff4af01646480af80afe5af01dfdff4af086400d69dd69d56 9d000800d69dd69d569d56dff4af01646480af80afe5af01dfdff4af0864 00d6d69d9d9d56000800d6d69d9d9d5656dff4af01646480af80afe5af01 dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4af01646480 af80afe5af01dfdff4af086400d6d69d9d9d56000800d6d69d9d9d5656df f4af01646480af80afe5af01dfdff4af086400d69dd69d569d000800d69d d69d569d56dff4af01646480af80afe5af01dfdff4af086400d6d69d9d9d 56000800d6d69d9d9d5656dff4af01646480af80afe5af01dfdff4af0864 00d69dd69d569d000800d69dd69d569d56dff4af016464f8af0000f6af00 00e6af0000d8af0000faaf0000e8af0000daaf0400afafaf0088af01dfdf f4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af016464f8af00 00f6af0000e6af0000d8af0000faaf0000f6af0000f3af0000daaf0600af 00af00af008aaf01dfdff4af086400d69dd69d569d000800d69dd69d569d 56dff4af016464f9af0000f6af0000e6af0000d8af0000f9af0000f6af00 00f4af0000daaf0600afafaf00000089af01dfdff4af086400d6d69d9d9d 56000800d6d69d9d9d5656dff4af016464f9af0300afaf00fcaf0e00afaf 00afafaf000000af00afafaffc00fdaffd000caf00afafaf00afaf00af00 0000fcaffd0009af00afaf00af0000afaffc00fdaf0400af000000fcaf0b 00afafaf000000af00afafaffc0007afaf000000afafaffc00fcaf0b00af afaf000000af00afafaffc00fcaffc00fdaf0700af0000afaf0000fcaf07 00afaf00af00af008aaf01dfdff4af086400d69dd69d569d000800d69dd6 9d569d56dff4af016464f9af0300afaf00fcaf7f00afaf00afaf0000afaf 0000afaf0000afaf0000af0000afaf0000afafaf00afaf0000afaf0000af af0000afaf0000afaf0000afafaf0000afaf0000afaf0000afaf0000afaf af00afaf0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000 afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000afaf00000eaf af0000afaf0000afaf00afafaf00fcaf000088af01dfdff4af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff4af016464faaf0400afafaf00fcaf 0600af00afafaf00fcaf0300afaf00faaf0000fcaf0700afaf00afafaf00 fcaf0300afaf00fcaf0300afaf00f7af0300afaf00fcaf0700afaf00afaf af00fcaf0000f9af0300afaf00f8af0700afaf00afafaf00fcaf0300afaf 00fcaf0300afaf00fcaf0e00afaf00afafaf00afafaf00afaf0082af01df dff4af086400d69dd69d569d000800d69dd69d569d56dff4af016464faaf 0400afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000fcaf07 00afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fbaffb0002afaf00 fcaf0700afaf00afafaf00fcaf0300afafaffb0002afaf00fcaffb0006af af00afafaf00fcaf0200afaffa0002afaf00fcaf0e00afaf00afafaf00af afaf00afaf0082af01dfdff4af086400d6d69d9d9d56000800d6d69d9d9d 5656dff4af016464faaf0400afafaf00fcaf0600af00afafaf00fcaf0300 afaf00faaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300af af00fcaf080000afafaf00afaf00fcaf0700afaf00afafaf00fcaf1b00af af0000afafaf00afaf00afafaf0000afafaf00afaf00afafaf00fcaf0300 afaf00f9af0000fcaf0e00afaf00afafaf00afafaf00afaf0082af01dfdf f4af086400d69dd69d569d000800d69dd69d569d56dff4af016464fbaf00 00fcaf0000fcaf010000fcaf0000fcaf0300afaf00fcaf0200af00fcaf02 00af00fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0000fcaf0300af af00fcaf0200af00fcaf0000fcaf0300afaf00fcaf0700afaf00afafaf00 fcaf0200af00fcaf0000fcaf0300afaf00f9af0000fcaf0d00afaf00afaf af00afafaf00af0081af01dfdff4af086400d6d69d9d9d56000800d6d69d 9d9d5656dff4af016464fbaf0000fcaf060000afaf000000fcaf160000af af0000afaf0000afaf0000af0000afaf0000af00fcaf0000fcaf0b00afaf 0000afaf0000afaf00fcaf0f0000afaf0000afaf0000afaf0000af00fcaf 1b0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000af00fc af220000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00afafaf 00afafaf00af0081af01dfdff4af086400d69dd69d569d000800d69dd69d 569d56dff4af016464fbaf0000fbaffd0002af0000fbaffd0004af00afaf affc00fdaffd0003af00af00fcaf0000fcaf0b00afafaf000000af00afaf 00fbaffd000baf0000af00af000000afaf00fbaffd0017af00afafaf0000 00af0000afaf0000afaf000000af000000fbaffd0004af00afafaffc00fc affc00fdaf0a00afafaf00afafaf00af0081af01dfdff4af086400d6d69d 9d9d56000800d6d69d9d9d5656dff4af016464e6af0000f2af0000edaf00 00f1af0000d0af000080afe4af01dfdff4af086400d69dd69d569d000800 d69dd69d569d56dff4af016464ebaf050000afaf0000f7af050000afaf00 00f2af050000afaf0000f1af0000d5af050000afaf000080afe4af01dfdf f4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af016464eaaffc 00f5affc00f0affc00f0af0000d4affc0080afe3af01dfdff4af086400d6 9dd69d569d000800d69dd69d569d56dff4af01646480af80afe5af01dfdf f4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af01646480af80 afe5af01dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4af 01646480af80afe5af01dfdff4af086400d6d69d9d9d56000800d6d69d9d 9d5656dff4af01646480af80afe5af01dfdff4af086400d69dd69d569d00 0800d69dd69d569d56dff4af01646480af80afe5af01dfdff4af086400d6 d69d9d9d56000800d6d69d9d9d5656dff4af01646480df80dfe3dff4af08 6400d69dd69d569d000800d69dd69d569d56dff4af006480df80dfe2dff4 af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400 d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d 9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d0008 00d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d 9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d56 df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80 afc9af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af08 6400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69d d69d569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56 000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d6 9dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d 5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80 af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9 af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400 d6d69d9d9d56000800d6d69d9d9d5656dff3affb00fbaf0000d9af0000b8 aff90004af00afaf0080afddaf086400d69dd69d569d000800d69dd69d56 9d56dff3af0000fcaf050000afafaf00eaaf0000f0af0000b8af0000f9af 0300afaf0080afddaf086400d6d69d9d9d56000800d6d69d9d9d5656dff3 af0000fbaf0000e6af0000a7af0000f6af000080afddaf086400d69dd69d 569d000800d69dd69d569d56dff3af0000faaf0b00afaf00afaf00af0000 afaffc00fcaffc0006af000000afafaffc00fdaf0800af0000af00afafaf fc00fcaffd00c6af0000f9af0600afaf00afafaffc00fcaffd0080afebaf 086400d6d69d9d9d56000800d6d69d9d9d5656dff3af0000faaf3a00afaf 00afaf0000afafaf0000afaf0000afaf0000afaf0000af00afafaf0000af af0000afaf0000afafaf00afaf0000afaf0000afaf00afafaf00c7af0000 f9af1200afaf00afaf0000afaf0000afaf00afafaf0080afecaf086400d6 9dd69d569d000800d69dd69d569d56dff3af0000faaf0600afaf00afaf00 fcaf0000fcaf0300afaf00faaf0400afafaf00fcaf0300afaf00fcaf0300 afaf00fcaf0400afaf0000c4affa0008afaf00afaf00afaf00fcaf0400af af000080afe9af086400d6d69d9d9d56000800d6d69d9d9d5656dff3af00 00faaf0600afaf00afaf00fcaffa0002afaf00faaf0400afafaf00fcaf03 00afaf00fcaf0200afaffa00fdaffd00c6af0000f9af0500afaf00afaffa 00fdaffd0080afebaf086400d69dd69d569d000800d69dd69d569d56dff3 af0000faaf0600afaf00afaf00fcaf0000f9af0000faaf0400afafaf00fc af0300afaf00fcaf0300afaf00f6af010000c7af0000f9af0600afaf00af af00f6af01000080afecaf086400d6d69d9d9d56000800d6d69d9d9d5656 dff3af0000fbaf0700afafaf00afaf00fcaf0000f9af0000fcaf0600af00 afafaf00fcaf0300afaf00fcaf0300afaf00f5af0000c7af0000f9af0600 afaf00afaf00f5af000080afecaf086400d69dd69d569d000800d69dd69d 569d56dff3af0000fcaf080000afafaf00afaf00fcaf1b0000afaf0000af af0000afaf0000af00afafaf0000afaf0000afaf00fcaf0f00afaf0000af af0000afaf00afafaf00c7af0000f9af1200afaf00afaf0000afaf0000af af00afafaf0080afecaf086400d6d69d9d9d56000800d6d69d9d9d5656df f3affb00fbaf0300afaf00fbaffc00fcaffc00fdaf030000afaffc00fdaf 0000fcaf0300afafaffc00fcaffd00c6af0000f9af0600afaf00afafaffc 00fcaffd0080afebaf086400d69dd69d569d000800d69dd69d569d56df80 af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9 af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400 d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d 569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6afa264fcaff164f6af8064eb64fcaff164f6af08 6400d69dd69d569d000800d69dd69d569d56dff6afa36400dffcaff26400 dff6af8064ec6400dffcaff26400dff6af086400d6d69d9d9d56000800d6 d69d9d9d5656dff6af016464a6af01dfdffcaf016464fb9500dffb9501df dff6af01646480afefaf01dfdffcaf016464fb9500dffb9501dfdff6af08 6400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffc af016464fc9502dfdf64fc9501dfdff6af01646480afefaf01dfdffcaf01 6464fc9502dfdf64fc9501dfdff6af086400d6d69d9d9d56000800d6d69d 9d9d5656dff6af016464a6af01dfdffcaf016464fc9502dfdf64fc9501df dff6af01646480afefaf01dfdffcaf016464fc9502dfdf64fc9501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af046464afafafac 00fdaf01dfdffcaf0e6464959595dfdfaf6464959595dfdff6af01646480 afefaf01dfdffcaf0e6464959595dfdfaf6464959595dfdff6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6af046464afafafac00fdaf01df dffcaf0e6464959595dfdfaf6464959595dfdff6af01646480afefaf01df dffcaf0e6464959595dfdfaf6464959595dfdff6af086400d69dd69d569d 000800d69dd69d569d56dff6af046464afafafac00fdaf01dfdffcaf0e64 649595dfdfafafaf64649595dfdff6af016464fcaf0000faaf0300afaf00 e3affd00f5af0000aaaf01dfdffcaf0e64649595dfdfafafaf64649595df dff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af046464afaf afac00fdaf01dfdffcaf0e64649595dfdfafafaf64649595dfdff6af0164 64fcaf0000faaf0300afaf00e5af060000afafaf0000f7af0000aaaf01df dffcaf0e64649595dfdfafafaf64649595dfdff6af086400d69dd69d569d 000800d69dd69d569d56dff6af046464afafafac00fdaf01dfdffcaf0464 6495dfdffbaf04646495dfdff6af016464fcaf0000faaf0000e2af0000fb af0000f7af0000aaaf01dfdffcaf04646495dfdffbaf04646495dfdff6af 086400d6d69d9d9d56000800d6d69d9d9d5656dff6af046464afafafac00 fdaf01dfdffcaf04646495dfdffbaf04646495dfdff6af016464fcaf0000 faaf0a00afaf00afaf00af000000fcaffd0004af00afafaffc00fdaf0000 f7af0000fcaf0900af00af000000afafaffc00b5af01dfdffcaf04646495 dfdffbaf04646495dfdff6af086400d69dd69d569d000800d69dd69d569d 56dff6af046464afafafac00fdaf01dfdffcaf036464dfdff76401dfdff6 af016464fcaf0000faaf1e00afaf00afaf0000afaf0000afaf0000afaf00 00afaf0000afaf0000afaf00f7af0000fcaf0e00af0000afaf0000af0000 afaf0000b6af01dfdffcaf036464dfdff76401dfdff6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6af046464afafafac00fdaf01dfdffcaf 026464dff66401dfdff6af016464fcaff80005afaf00afaf00fcaf0300af af00fcaf0300afaf00fcaf0300afaf00f7af0000fcaf0200af00fcaf0200 af00fcaf0000b6af01dfdffcaf026464dff66401dfdff6af086400d69dd6 9d569d000800d69dd69d569d56dff6af046464afafafac00fdaf01dfdffc af016464f59501dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf 0300afaf00fcaf0200afaffa0002afaf00f7af0000fcaf0200af00fcaf01 00affa00b6af01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56 000800d6d69d9d9d5656dff6af046464afafafac00fdaf01dfdffcaf0164 64f3dff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fc af0300afaf00f9af0000f7af0000fcaf0200af00fcaf0200af00b1af01df dffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d56 9d56dff6af046464afafafac00fdaf01dfdffcaf016464f6df0264dfdff6 af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf0300af af00f8af0000fbaf0300afaf00fcaf0200af00fcaf0200af00b1af01dfdf fcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d56 56dff6af066464afafaf00afae00fdaf01dfdffcaf036464dfdff9af0364 64dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf3000afaf0000 afaf0000afaf0000afaf0000afafaf0000afafaf0000afaf0000afaf0000 af0000afaf0000af0000afaf0000b6af01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af066464afafaf00 afae00fdaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf00 00faaf0600afaf00afaf00fcaf0b00afafaf000000af00afafaffc00faaf fd00fbaffd000aaf00af00af000000afafaffc00b5af01dfdffcaf016464 f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af04 6464afafafac00fdaf01dfdffcaf036464dfdff9af036464dfdff6af0164 64e2af00008eaf01dfdffcaf016464f3dff6af086400d69dd69d569d0008 00d69dd69d569d56dff6af046464afafafac00fdaf01dfdffcaf036464df dff9af036464dfdff6af016464e7af050000afaf00008eaf01dfdffcaf01 6464f6df0264dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656df f6af046464afafafac00fdaf01dfdffcaf036464dfdff9af036464dfdff6 af016464e6affc008daf01dfdffcaf036464dfdff9af036464dfdff6af08 6400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffc af036464dfdff9af036464dfdff6af01646480afefaf01dfdffcaf036464 dfdff9af036464dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af016464 80afefaf01dfdffcaf036464dfdff9af036464dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf036464dfdf f9af036464dfdff6af01646480afefaf01dfdffcaf036464dfdff9af0364 64dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464 a6af01dfdffcaf036464dfdff9af036464dfdff6af01646480afefaf01df dffcaf036464dfdff9af036464dfdff6af086400d69dd69d569d000800d6 9dd69d569d56dff6af016464a6af01dfdffcaf036464dfdff9af036464df dff6af01646480afefaf01dfdffcaf036464dfdff9af036464dfdff6af08 6400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01dfdffc af036464dfdff9af036464dfdff6af016464fcaf0000faaf0300afaf00e6 affb00fbaf0000d6af0000ceaf01dfdffcaf036464dfdff76401dfdff6af 086400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdf fcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0300afaf00 e6af0000fcaf050000afafaf00d6af0000ceaf01dfdffcaf026464dff664 01dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464 a6af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf 0000e3af0000fbaf0000d2af0000ceaf01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01df dffcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0a00afaf 00afaf00af000000fcaffd0004af00afafaffc00fdaf0000faaf0600afaf 00afafaffc00fdaf0700af0000afaf0000fcaffc00fdaf0400af000000fc affd0001af00ceaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464dfdf f9af036464dfdff6af016464fcaf0000faaf1e00afaf00afaf0000afaf00 00afaf0000afaf0000afaf0000afaf0000afaf00faaf2e00afaf00afaf00 00afaf0000afaf0000afaf0000afaf00afaf0000afaf0000afaf0000afaf 0000afaf0000afaf0000ceaf01dfdffcaf016464f59501dfdff6af086400 d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf03 6464dfdff9af036464dfdff6af016464fcaff80005afaf00afaf00fcaf03 00afaf00fcaf0300afaf00fcaf0300afaf00faaf0300afaf00f9af0e00af af00afafaf00afafaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf00 00ceaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf 0200afaffa0002afaf00faaf0600afaf00afafaffb000dafaf00afafaf00 afafaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000ceaf01dfdf fcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d 56dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af0164 64fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf0300afaf00f9 af0000faaf1900afaf00afaf0000afafaf00afaf00afafaf00afafaf00af af00fcaf0300afaf00fcaf0300afaf00fcaf0000ceaf01dfdffcaf016464 f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af01 6464a6af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000 faaf0600afaf00afaf00fcaf0300afaf00fcaf0300afaf00f9af0000fbaf 0700afafaf00afaf00fcaf0e00afaf00afafaf00afafaf00afaf00fcaf03 00afaf00fcaf0300afaf00fcaf0000ceaf01dfdffcaf016464f59501dfdf f6af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf03 00afaf00aeaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf 0000faaf0600afaf00afaf00fcaf1300afaf0000afaf0000afaf0000afaf 0000afaf00fcaf230000afafaf00afaf0000afaf0000afaf00afafaf00af afaf00afaf0000afaf0000afaf00fcaf0800afaf0000afaf0000ceaf01df dffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6af016464fcaf0300afaf00aeaf01dfdffcaf036464dfdff9af03 6464dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0b00afafaf 000000af00afafaffc00fdaffb00fbaf1600afafaf000000af0000af00af afaf00afafaf00afafaffc00fdaf0000fcaf0800afafaf000000af00ceaf 01dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd6 9d569d56dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6 af016464e2af00008eaf01dfdffcaf016464f59501dfdff6af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464 dfdff9af036464dfdff6af016464e7af050000afaf00008eaf01dfdffcaf 016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56df f6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af016464e6 affc008daf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d5600 0800d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464dfdff9af03 6464dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af0864 00d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf 036464dfdff9af036464dfdff6af01646480afefaf01dfdffcaf016464f5 9501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af0164 64a6af01dfdffcaf036464dfdff9af036464dfdff6af01646480afefaf01 dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d 569d56dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af 01646480afefaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d 56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464dfdff9 af036464dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af 086400d69dd69d569d000800d69dd69d569d56dff6af016464f7af0000f9 af0000b8af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf00 00faaf0300afaf00e6affb00eeaf0000b0af01dfdffcaf016464f59501df dff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464f8af 010000f9af0000b8af01dfdffcaf036464dfdff9af036464dfdff6af0164 64fcaf0000faaf0300afaf00e6af0000fcaf010000f0af0000b0af01dfdf fcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d 56dff6af016464f9af0200af00f9af0000b8af01dfdffcaf036464dfdff9 af036464dfdff6af016464fcaf0000faaf0000e3af0000fbaf0000f0af00 00b0af01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6af016464faaf0b00afaf00afafaf000000af00b8af 01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0a00 afaf00afaf00af000000fcaffd0004af00afafaffc00fdaf0000faaf0300 afafaffc00fcaffd0004af00afafaffc00fcaffc00bfaf01dfdffcaf0164 64f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af 016464fbaf0c00afafaf00afaf0000afaf0000b8af01dfdffcaf036464df dff9af036464dfdff6af016464fcaf0000faaf1e00afaf00afaf0000afaf 0000afaf0000afaf0000afaf0000afaf0000afaf00faaf2000afaf0000af af0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000c0af01 dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d 9d5656dff6af016464fcaf0000fcaf0300afaf00fcaf0000b8af01dfdffc af036464dfdff9af036464dfdff6af016464fcaff80005afaf00afaf00fc af0300afaf00fcaf0300afaf00fcaf0300afaf00faaf0300afaf00fcaf03 00afaf00fcaf0300afaf00fcaf0300afaf00bbaf01dfdffcaf016464f595 01dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464 fcaf0000fcaf0300afaf00fcaf0000b8af01dfdffcaf036464dfdff9af03 6464dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00 fcaf0200afaffa0002afaf00faaf0300afaf00fcaf0300afaf00fcaf0200 afaffa0002afaf00bbaf01dfdffcaf016464f59501dfdff6af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff6af016464fcaff90001af00fcaf00 00b8af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000fa af0600afaf00afaf00fcaf0300afaf00fcaf0300afaf00f9af0000faaf03 00afaf00fcaf0300afaf00fcaf0300afaf00f9af0000bbaf01dfdffcaf01 6464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6 af016464f7af0300afaf00fcaf0000b8af01dfdffcaf036464dfdff9af03 6464dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00 fcaf0300afaf00f9af0000fbaf0400afafaf00fcaf0300afaf00fcaf0300 afaf00f9af0000fcaf0000c0af01dfdffcaf016464f59501dfdff6af0864 00d6d69d9d9d56000800d6d69d9d9d5656dff6af016464f7af0800afaf00 00afaf0000b8af01dfdffcaf036464dfdff9af036464dfdff6af016464fc af0000faaf0600afaf00afaf00fcaf1300afaf0000afaf0000afaf0000af af0000afaf00fcaf220000afafaf0000afaf0000afaf0000afaf0000afaf 0000afaf0000afaf0000afaf0000c0af01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af016464f7af0800 afafaf000000af00b8af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fcaf0000faaf0600afaf00afaf00fcaf0b00afafaf000000af00afaf affc00fdaffb00faaffc00fcaffd0004af00afafaffc00fcaffc00bfaf01 dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d 9d5656dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af 016464e2af00008eaf01dfdffcaf016464f59501dfdff6af086400d69dd6 9d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf036464df dff9af036464dfdff6af016464e7af050000afaf00008eaf01dfdffcaf01 6464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af016464e6af fc008daf01dfdffcaf016464f59501dfdff6af086400d69dd69d569d0008 00d69dd69d569d56dff6af016464a6af01dfdffcaf036464dfdff9af0364 64dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af086400 d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf03 6464dfdff9af036464dfdff6af01646480afefaf01dfdffcaf016464f595 01dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464 a6af01dfdffcaf036464dfdff9af036464dfdff6af01646480afefaf01df dffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af01 646480afefaf01dfdffcaf016464f59501dfdff6af086400d69dd69d569d 000800d69dd69d569d56dff6af016464a6af01dfdffcaf036464dfdff9af 036464dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af08 6400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464f9affd00c8af 0000f2af0000f8af01dfdffcaf036464dfdff9af036464dfdff6af016464 fcaf0000faaf0300afaf00e5af0000d4af0000c7af01dfdffcaf016464f5 9501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af0164 64fbaf060000afafaf0000e3af0000e8af0000f2af0000f8af01dfdffcaf 036464dfdff9af036464dfdff6af016464fcaf0000faaf0300afaf00e5af 0000d4af0000c7af01dfdffcaf016464f59501dfdff6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6af016464fbaf0000fbaf0000e3af0000 e8af0000f2af0000f8af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fcaf0000faaf0000e2af0000d4af0000c7af01dfdffcaf016464f595 01dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464 fcaf0000f7af0000fcaf0600af00af000000fbaf0200afaffc0007afaf00 0000afaf00fcaf0700af00af0000afaffc00fcaf0000f9affc00fdaf0400 af000000fcaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf 0000faaf0a00afaf00afaf00af000000fcaffd0004af00afafaffc00fcaf 0000f9affc00fdaf0400af000000fcaffd0004af00afafaffc0002afaf00 fcaf0900af00af000000afafaffc00d2af01dfdffcaf016464f59501dfdf f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf00 00f7af0000fcaf0600af0000afaf00fbaf0e00af0000afaf0000afaf00af afaf00fcaf1000af0000afafaf0000afaf0000afafaf00faaf120000afaf 0000afaf0000afaf0000afafafdfdffcaf036464dfdff9af036464dfdff6 af016464fcaf0000faaf1f00afaf00afaf0000afaf0000afaf0000afaf00 00afaf0000afaf0000afafaf00faaf1f0000afaf0000afaf0000afaf0000 afaf0000afaf0000afaf0000afaf0000af00fcaf0e00af0000afaf0000af 0000afaf0000d3af01dfdffcaf016464f59501dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464fcaf0000f7af0000fcaf0200 af00fcaf0400afafaf00f9af0700afaf00afafaf00fcaf0200af00fcaf00 00fcaf0400afafaf00f5af0300afaf00fcaf0500afafafdfdffcaf036464 dfdff9af036464dfdff6af016464fcaff80005afaf00afaf00fcaf0300af af00fcaf0300afaf00fcaf0400afafaf00faaf0000fcaf0300afaf00fcaf 0300afaf00fcaf0300afaf00faaf0000fcaf0200af00fcaf0200af00fcaf 0000d3af01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6af016464fcaf0000f7af0000fcaf0200af00fcaf 0700afafaf00afafaffb0006afaf00afafaf00fcaf0200af00fcaffa00fd af0000f9affb0002afaf00fcaf0500afafafdfdffcaf036464dfdff9af03 6464dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00 fcaf0200afaffa00fdaf0000faaf0000fcaf0300afaf00fcaf0300afaf00 fcaf0300afaf00faaf0000fcaf0200af00fcaf0100affa00d3af01dfdffc af016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56 dff6af016464fcaf0000f7af0000fcaf0200af00fcaf1300afafaf00afaf 0000afafaf00afaf00afafaf00fcaf0200af00fcaf0000f8af0000faaf08 0000afafaf00afaf00fcaf0500afafafdfdffcaf036464dfdff9af036464 dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf 0300afaf00f8af0000faaf0000fcaf0300afaf00fcaf0300afaf00fcaf03 00afaf00faaf0000fcaf0200af00fcaf0200af00ceaf01dfdffcaf016464 f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af01 6464fbaf0000fbaf0300afaf00fcaf0200af00fbaf0600af00afafaf00fc af0700afaf00afafaf00fcaf0200af00fcaf0000f8af0000faaf0000fcaf 0300afaf00fcaf0500afafafdfdffcaf036464dfdff9af036464dfdff6af 016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf0300afaf 00f8af0000faaf0000fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00 fcaf0200af00fcaf0200af00fcaf0200af00ceaf01dfdffcaf016464f595 01dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464 fbaf100000afafaf0000afaf0000afaf0000af00fbaf1900af00afafaf00 00afaf0000afaf00afafaf0000afaf0000af00fcaf090000afaf0000afaf af00faaf120000afaf0000afaf0000afaf0000afafafdfdffcaf036464df dff9af036464dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf14 00afaf0000afaf0000afaf0000afaf0000afafaf00faaf080000afaf0000 afaf00fcaf2500afaf0000afaf0000afaf0000afaf0000af0000afaf0000 af0000afaf0000af0000afaf0000d3af01dfdffcaf016464f59501dfdff6 af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464f9affd00 fbaffd0003af00af00faaf0000fbaffd000faf0000afaf0000afaf000000 af00af00fbaffc00fcaffa000dafaf000000af0000af00af000000fcaf01 dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0600af af00afaf00fcaf0b00afafaf000000af00afafaffc00fcaffa0001afaffc 00fdaf0000fcaf0b00afafaf000000af00afafaffc00fdaffd000aaf00af 00af000000afafaffc00d2af01dfdffcaf016464f59501dfdff6af086400 d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf03 6464dfdff9af036464dfdff6af016464e2af0000d9af0000b6af01dfdffc af016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af016464 e7af050000afaf0000deaf050000afaf0000b6af01dfdffcaf016464f595 01dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464 a6af01dfdffcaf036464dfdff9af036464dfdff6af016464e6affc00dcaf fc00b5af01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464dfdff76401df dff6af01646480afefaf01dfdffcaf016464f59501dfdff6af086400d69d d69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf026464 dff66401dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af 086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01dfdf fcaf016464f59501dfdff6af01646480afefaf01dfdffcaf016464f59501 dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464a6 af01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffcaf0164 64f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af 016464a6af01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdf fcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d 56dff6af016464fcaf0000f1af0300afaf00beaf01dfdffcaf016464f595 01dfdff6af016464fcaf0000faaf0300afaf00e7aff700a0af01dfdffcaf 016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656df f6af016464fcaf0000f1af0600afaf00afaf00e6af0000dcaf01dfdffcaf 016464f59501dfdff6af016464fcaf0000faaf0300afaf00e3af0000f3af 0000aaaf01dfdffcaf016464f59501dfdff6af086400d69dd69d569d0008 00d69dd69d569d56dff6af016464fcaf0000f1af0000fbaf0000e6af0000 dcaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf0000e0af 0000f3af0000aaaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6af016464fcaf0400af000000fcaffc00 fdaf0a00afaf00af000000afafaffc00fcaffc00fdaffc0004afaf000000 ddaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf0a00afaf 00afaf00af000000fcaffd0004af00afafaffc00faaf0000faaffc000caf af000000afaf00af0000afaffc00b7af01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf3100 00afaf0000afaf0000afaf0000afaf00afaf00afaf00afafaf0000afaf00 00afaf0000afaf0000af0000afaf0000afaf00dcaf01dfdffcaf016464f5 9501dfdff6af016464fcaf0000faaf1b00afaf00afaf0000afaf0000afaf 0000afaf0000afaf0000afaf0000fbaf0000fbaf160000afaf0000afaf00 afafaf0000afafaf0000afaf0000b8af01dfdffcaf016464f59501dfdff6 af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000 fcaf0300afaf00fcaf0d00afaf00afaf00afaf00afafaf00fcaf0300afaf 00f5af0300afaf00dcaf01dfdffcaf016464f59501dfdff6af016464fcaf f80005afaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000fbaf00 00fbaf0000fcaf0700afaf00afafaf00f7af0000b8af01dfdffcaf016464 f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af01 6464fcaf0000fcaf0200afaffa000cafaf00afaf00afaf00afafaf00fcaf 0300afaf00f9affb0002afaf00dcaf01dfdffcaf016464f59501dfdff6af 016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf0200afaf fa00fbaf0000fbaffa0006afaf00afafaf00fbaffb00b8af01dfdffcaf01 6464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 af016464fcaf0000fcaf0300afaf00f9af0a00afaf00afaf00afafaf00fc af0300afaf00faaf080000afafaf00afaf00dcaf01dfdffcaf016464f595 01dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fc af0300afaf00f6af0000fbaf0000f9af0400afafaf00fcaf050000afafaf 00b8af01dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800 d69dd69d569d56dff6af016464fcaf0000fcaf0300afaf00f9af0a00afaf 00afaf00afafaf00fcaf0300afaf00fcaf0200af00fcaf0300afaf00dcaf 01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf0600afaf00af af00fcaf0300afaf00fcaf0300afaf00f6af0000fbaf0000f9af0400afaf af00fcaf0000fcaf0000b8af01dfdffcaf016464f59501dfdff6af086400 d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000fcaf2c00 afaf0000afaf0000afaf00afaf00afaf00afafaf0000afaf0000afaf0000 afaf0000af0000afaf0000afaf00dcaf01dfdffcaf016464f59501dfdff6 af016464fcaf0000faaf0600afaf00afaf00fcaf1000afaf0000afaf0000 afaf0000afaf0000fbaf0000fbaf0c0000afaf0000afaf00afafaf00fcaf 050000afaf0000b8af01dfdffcaf016464f59501dfdff6af086400d69dd6 9d569d000800d69dd69d569d56dff6af016464fcaf0000fcaf0300afafaf fc00fdaf0a00afaf00afafaf0000afaffc00fcaffc00fdaffd0006af0000 afaf0000deaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf 0600afaf00afaf00fcaf0b00afafaf000000af00afafaffc00faaf0000fa affc00fcaf030000af00fbaffd0002af0000b9af01dfdffcaf016464f595 01dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464 a6af01dfdffcaf016464f59501dfdff6af016464e2af00008eaf01dfdffc af016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56 dff6af016464a6af01dfdffcaf016464f59501dfdff6af016464e7af0500 00afaf00008eaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d 56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf016464f59501 dfdff6af016464e6affc008daf01dfdffcaf016464f59501dfdff6af0864 00d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf 016464f59501dfdff6af01646480afefaf01dfdffcaf016464f59501dfdf f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01 dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffcaf016464f5 9501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af0164 64a6af01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffcaf 016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656df f6af016464a6af01dfdffcaf016464f59501dfdff6af01646480afefaf01 dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d 569d56dff6af016464a6af01dfdffcaf016464f59501dfdff6af01646480 afefaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6af016464fcaf0000f9af0000b3af01dfdffcaf0164 64f59501dfdff6af016464fcaf0000faaf0300afaf00e7aff700faaf0000 e6af0000c2af01dfdffcaf016464f59501dfdff6af086400d69dd69d569d 000800d69dd69d569d56dff6af016464fcaf0000f9af0000b3af01dfdffc af016464f59501dfdff6af016464fcaf0000faaf0300afaf00e3af0000f6 af0000e6af0000c2af01dfdffcaf016464f59501dfdff6af086400d6d69d 9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000abaf01dfdffcaf 016464f59501dfdff6af016464fcaf0000faaf0000e0af0000dbaf0000c2 af01dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69d d69d569d56dff6af016464fcaf0f00af000000afafaf00afaf00af000000 fcaffd0004af00afafaffc00caaf01dfdffcaf016464f59501dfdff6af01 6464fcaf0000faaf0a00afaf00afaf00af000000fcaffd0004af00afafaf fc00faaf0000fbaf0800af0000af00afafaffc00fdaf0400af000000fcaf fd0007af00afaf00afafaffc00c9af01dfdffcaf016464f59501dfdff6af 086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf200000 afaf0000afaf00afaf0000afaf0000afaf0000afaf0000afaf0000afaf00 00cbaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf1b00af af00afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000fbaf0000 fbaf280000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000af af0000afaf00afaf0000afaf0000caaf01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf0000 fcaf0600afaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000cbaf 01dfdffcaf016464f59501dfdff6af016464fcaff80005afaf00afaf00fc af0300afaf00fcaf0300afaf00fcaf0000fbaf0000fbaf0000fcaf0000f9 af0300afaf00fcaf0300afaf00fcaf0600afaf00afaf00fcaf0000caaf01 dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d 9d5656dff6af016464fcaf0000fcaf0600afaf00afaf00fcaf0300afaf00 fcaf0200afaffa00cbaf01dfdffcaf016464f59501dfdff6af016464fcaf 0000faaf0600afaf00afaf00fcaf0300afaf00fcaf0200afaffa00fbaf00 00fbaf0000fcaf0300afafaffb0002afaf00fcaf0300afaf00fcaf0500af af00afaffa00caaf01dfdffcaf016464f59501dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464fcaf0000fcaf0600afaf00af af00fcaf0300afaf00fcaf0300afaf00c6af01dfdffcaf016464f59501df dff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf03 00afaf00f6af0000fbaf0000fcaf0b00afaf0000afafaf00afaf00fcaf03 00afaf00fcaf0600afaf00afaf00c5af01dfdffcaf016464f59501dfdff6 af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000 fcaf0600afaf00afaf00fcaf0300afaf00fcaf0300afaf00c6af01dfdffc af016464f59501dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf 0300afaf00fcaf0300afaf00f6af0000fbaf0000fcaf0300afaf00fcaf03 00afaf00fcaf0300afaf00fcaf0600afaf00afaf00c5af01dfdffcaf0164 64f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af 016464fcaf0000fcaf0600afaf00afaf00fcaf1000afaf0000afaf0000af af0000afaf0000cbaf01dfdffcaf016464f59501dfdff6af016464fcaf00 00faaf0600afaf00afaf00fcaf1000afaf0000afaf0000afaf0000afaf00 00fbaf0000fbaf0000fcaf0b00afaf0000afaf0000afaf00fcaf1300afaf 0000afaf0000afaf00afaf0000afaf0000caaf01dfdffcaf016464f59501 dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fc af0000fcaf0600afaf00afaf00fcaf0b00afafaf000000af00afafaffc00 caaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf0600afaf 00afaf00fcaf0b00afafaf000000af00afafaffc00faaf0000fbaf0000fc af0b00afafaf000000af0000af00fcaf0e00afafaf000000af00afaf00af afaffc00c9af01dfdffcaf016464f59501dfdff6af086400d69dd69d569d 000800d69dd69d569d56dff6af016464e4af0000c3af01dfdffcaf016464 f59501dfdff6af016464e2af0000d0af0000bfaf01dfdffcaf016464f595 01dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464 e9af050000afaf0000c3af01dfdffcaf016464f59501dfdff6af016464e7 af050000afaf0000d5af050000afaf0000bfaf01dfdffcaf016464f59501 dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464e8 affc00c2af01dfdffcaf016464f59501dfdff6af016464e6affc00d3affc 00beaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6af016464a6af01dfdffcaf016464f59501dfdff6af 01646480afefaf01dfdffcaf016464f59501dfdff6af086400d69dd69d56 9d000800d69dd69d569d56dff6af016464a6af01dfdffcaf016464f59501 dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf0164 64f59501dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af 086400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdf fcaf016464f59501dfdff6af01646480afefaf01dfdffcaf016464f59501 dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6 af01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffcaf0164 64f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af 016464fcaf0000ddaf0000f2af0300afaf00e1af01dfdffcaf016464f595 01dfdff6af016464fcaf0000fbaf0300afaf00f6af0000f6affa00deaf05 0000afaf0000c0af01dfdffcaf016464f59501dfdff6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6af016464fcaf0000ddaf0000f2af0300 afaf00e1af01dfdffcaf016464f59501dfdff6af016464fcaf0000fcaf04 00afafaf00f6af0000f6af0000fcaf010000e0af0400afafaf00beaf01df dffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d56 9d56dff6af016464fcaf0000ddaf0000f2af0000deaf01dfdffcaf016464 f59501dfdff6af016464fcaf0400afafaf00fcaf0000ebaf0000fbaf0000 e0af0400afafaf00beaf01dfdffcaf016464f59501dfdff6af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0700af000000afaf 00fbaf0600af00af000000fcaffc00fdaf0c00af0000af00af000000afaf affc00fdaf0600afaf00afafaffc00e8af01dfdffcaf016464f59501dfdf f6af016464fcaf0300afaf00fbaf0300afafaffc00fdaf0b00afaf00af00 0000afafaf00fbaf0000faaffc00fdaf0400af000000f9affc0008afaf00 0000af000000bfaf01dfdffcaf016464f59501dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464fcaf080000afaf0000af0000 fcaf3100af0000afaf0000afaf0000afaf0000afaf0000afafaf0000afaf 0000af0000afaf0000afaf00afaf00afaf0000afaf0000e9af01dfdffcaf 016464f59501dfdff6af016464fcaf0200af00faaf1600afaf0000afaf00 00afaf00afaf0000afaf0000afaf00fcaf0000faaf0d0000afaf0000afaf 0000afaf0000fbaf0c0000afaf0000afaf00afafaf00beaf01dfdffcaf01 6464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 af016464fcaf0000fcaf0a00afaf00afafaf00afaf00fcaf0300afaf00fc af0300afaf00fcaf0000fcaf0200af00fcaf0900afaf00afaf00afaf00e4 af01dfdffcaf016464f59501dfdff6af016464fcaffd00faaf0300afaf00 fcaf0600afaf00afaf00fcaf0200afaffb00f4af0300afaf00fcaf0000fb af0000fcaf0700afaf00afafaf00beaf01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf0000 fcaf0a00afaf00afafaf00afaf00fcaf0200afaffa0002afaf00fcaf0000 fcaf0200af00fcaf0900afaf00afaf00afaf00e4af01dfdffcaf016464f5 9501dfdff6af016464fcaf0300afaf00fbaf0200afaffa0005afaf00afaf 00fcaf0300afaf00fcaf0000f9affb0002afaf00fcaf0000fbaf0000fcaf 0700afaf00afafaf00beaf01dfdffcaf016464f59501dfdff6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000fcaf0a00af afaf00afaf00afaf00fcaf0300afaf00f9af0000fcaf0000fcaf0200af00 fcaf0900afaf00afaf00afaf00e4af01dfdffcaf016464f59501dfdff6af 016464fcaf0400afafaf00fcaf0300afaf00f9af0300afaf00fcaf0300af af00fbaf0000fbaf080000afafaf00afaf00fcaf0000fbaf0000fcaf0700 afaf00afafaf00beaf01dfdffcaf016464f59501dfdff6af086400d69dd6 9d569d000800d69dd69d569d56dff6af016464fcaf0000fcaf0a00afafaf 00af00afafaf00fcaf0300afaf00f9af0000fcaf0000fcaf0200af00fcaf 0900afaf00afaf00afaf00fcaf0000e9af01dfdffcaf016464f59501dfdf f6af016464fcaf0000fcaf0700afafaf00afaf00f9af0300afaf00fcaf03 00afaf00fbaf0000fbaf0000fcaf0300afaf00fcaf0000fbaf0000fcaf07 00afaf00afafaf00beaf01dfdffcaf016464f59501dfdff6af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000fcaf0000fcaf 150000afafaf0000afaf0000afaf0000afaf0000afaf00fcaf1a0000afaf 0000af0000afaf0000afaf00afaf00afaf0000afaf0000e9af01dfdffcaf 016464f59501dfdff6af016464fcaf0000fbaf1100afaf00afaf0000afaf 0000afaf00afaf00fcaf0300afaf00fcaf260000afaf00afaf0000afaf00 00afaf0000afaf0000afaf00afaf0000afaf0000afaf00afafaf00beaf01 dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d 569d56dff6af016464fcaf0000fcaf0000fcaf0000fcaf0400af000000fc affc00fdaf0000fcaf0700af000000afafaffc00fdaf0600afaf00afafaf fc00e8af01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf0500 af00afafaffc00fdaf0300afaf00fcaf0200afaffa00fdaf1600afafaf00 0000af0000af00af000000afafaf00afafaffc00fdaf0400afafaf00beaf 01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d 9d9d5656dff6af016464f2af0000fcaf0000baaf01dfdffcaf016464f595 01dfdff6af016464c9af0000a7af01dfdffcaf016464f59501dfdff6af08 6400d69dd69d569d000800d69dd69d569d56dff6af016464f3af010000fc af0000baaf01dfdffcaf016464f59501dfdff6af016464c9af0000a7af01 dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d 9d5656dff6af016464f4af010000fbaf0000baaf01dfdffcaf016464f595 01dfdff6af016464c9af0000a7af01dfdffcaf016464f59501dfdff6af08 6400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffc af016464f59501dfdff6af01646480afefaf01dfdffcaf016464f59501df dff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af 01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffcaf016464 f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af01 6464a6af01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffc af016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af016464a6af01dfdffcaf016464f59501dfdff6af01646480afefaf 01dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd6 9d569d56dff6af016464a6af01dfdffcaf016464f59501dfdff6af016464 80afefaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6af016464fcaf0000abaf01dfdffcaf016464f595 01dfdff6af016464fcaf0000fbaf0300afaf00f6af0000f6affa00f1af05 0000afaf0000adaf01dfdffcaf016464f59501dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464fcaf0000abaf01dfdffcaf01 6464f59501dfdff6af016464fcaf0000fcaf0400afafaf00f6af0000f6af 0000fcaf010000f3af0400afafaf00abaf01dfdffcaf016464f59501dfdf f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01 dfdffcaf016464f59501dfdff6af016464fcaf0400afafaf00fcaf0000eb af0000fbaf0000f3af0400afafaf00abaf01dfdffcaf016464f59501dfdf f6af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf03 00afaf00fcaf1100af00af0000afaf0000afafaf00af000000c4af01dfdf fcaf016464f59501dfdff6af016464fcaf0300afaf00fbaf0300afafaffc 00fdaf0b00afaf00af000000afafaf00fbaf0000faaffc0008afaf000000 af000000acaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56 000800d6d69d9d9d5656dff6af016464fcaf0300afaf00fcaf1200af0000 afaf0000afaf00afaf0000afaf0000c5af01dfdffcaf016464f59501dfdf f6af016464fcaf0200af00faaf1600afaf0000afaf0000afaf00afaf0000 afaf0000afaf00fcaf0000faaf0c0000afaf0000afaf00afafaf00abaf01 dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d 569d56dff6af016464fcaf0300afaf00fcaf0d00af00afafaf00afafaf00 afaf00fcaf0000c5af01dfdffcaf016464f59501dfdff6af016464fcaffd 00faaf0300afaf00fcaf0600afaf00afaf00fcaf0200afaffb00f9af0000 fcaf0700afaf00afafaf00abaf01dfdffcaf016464f59501dfdff6af0864 00d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0300afaf00 fcaf0d00af00afafaf00afafaf00afaf00fcaf0000c5af01dfdffcaf0164 64f3dff6af016464fcaf0300afaf00fbaf0200afaffa0005afaf00afaf00 fcaf0300afaf00fcaf0000faaf0000fcaf0700afaf00afafaf00abaf01df dffcaf016464f3dff6af086400d69dd69d569d000800d69dd69d569d56df f6af016464fcaf0300afaf00fcaf0d00af00afafaf00afafaf00afaf00fc af0000c5af01dfdffcaf016464f7df036464dfdff6af016464fcaf0400af afaf00fcaf0300afaf00f9af0300afaf00fcaf0300afaf00fbaf0000fbaf 0000fcaf0700afaf00afafaf00abaf01dfdffcaf016464f7df036464dfdf f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf03 00afaf00fcaf0d00af00afafaf00afafaf00afaf00fcaf0000c5af01dfdf fcaf04646495dfdffbaf04646495dfdff6af016464fcaf0000fcaf0700af afaf00afaf00f9af0300afaf00fcaf0300afaf00fbaf0000fbaf0000fcaf 0700afaf00afafaf00abaf01dfdffcaf04646495dfdffbaf04646495dfdf f6af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf1a 00afaf0000afaf0000af00afafaf00afafaf00afaf0000afaf0000c5af01 dfdffcaf04646495dfdffbaf04646495dfdff6af016464fcaf0000fbaf11 00afaf00afaf0000afaf0000afaf00afaf00fcaf0300afaf00fcaf130000 afaf00afaf0000afaf0000afaf00afafaf00abaf01dfdffcaf04646495df dffbaf04646495dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af016464fcaf1900afafaf000000af00af00afafaf00afafaf00afaf 00af000000c4af01dfdffcaf0e64649595dfdfafafaf64649595dfdff6af 016464fcaf0000faaf0500af00afafaffc00fdaf0300afaf00fcaf0200af affa00fdaf0300afafaffc00fdaf0400afafaf00abaf01dfdffcaf0e6464 9595dfdfafafaf64649595dfdff6af086400d69dd69d569d000800d69dd6 9d569d56dff6af016464fcaf0000ecaf0000c0af01dfdffcaf0e64649595 dfdfafafaf64649595dfdff6af01646480afefaf01dfdffcaf0e64649595 dfdfafafaf64649595dfdff6af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6af016464fcaf0000ecaf0000c0af01dfdffcaf0e6464959595df dfaf6464959595dfdff6af01646480afefaf01dfdffcaf0e6464959595df dfaf6464959595dfdff6af086400d69dd69d569d000800d69dd69d569d56 dff6af056464afafaf00ebaf0000c0af01dfdffcaf0e6464959595dfdfaf 6464959595dfdff6af01646480afefaf01dfdffcaf0e6464959595dfdfaf 6464959595dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 af016464a6af01dfdffcaf016464fc9502df6464fc9501dfdff6af016464 80afefaf01dfdffcaf016464fc9502df6464fc9501dfdff6af086400d69d d69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf016464 fc9502df6464fc9501dfdff6af01646480afefaf01dfdffcaf016464fc95 02df6464fc9501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af016464a6af01dfdffcaf016464fb950064fb9501dfdff6af016464 80afefaf01dfdffcaf016464fb950064fb9501dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464a4dffcaf016464f3dff6af01 646480dfeddffcaf016464f3dff6af086400d6d69d9d9d56000800d6d69d 9d9d5656dff6af0064a3dffcaf0064f2dff6af006480dfecdffcaf0064f2 dff6af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af08 6400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69d d69d569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56 000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d6 9dd69d569d56dff6afa264e3af8064eb64e3af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6afa36400dfe3af8064ec6400dfe3af086400d69d d69d569d000800d69dd69d569d56dff6af016464f79501dfdfd695e7df02 95dfdff79501dfdfe3af016464f79501dfdfc295c4df0295dfdff79501df dfe3af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464f995 fddf0064d695e8df016495fcdff99501dfdfe3af016464f995fddf0064c2 95c5df016495fcdff99501dfdfe3af086400d69dd69d569d000800d69dd6 9d569d56dff6af016464fb95fcdf016464d69501dfdfebaf02646495fadf fb9501dfdfe3af016464fb95fcdf016464c29501dfdfc8af02646495fadf fb9501dfdfe3af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af04 6464959595fcdf03afaf6464d69501dfdfebaf06646495dfdfafaffcdffd 9501dfdfe3af046464959595fcdf03afaf6464c29501dfdfc8af06646495 dfdfafaffcdffd9501dfdfe3af086400d69dd69d569d000800d69dd69d56 9d56dff6af02646495fcdffcaf016464d69501dfdfebaf04646495dfdffc affcdf0295dfdfe3af02646495fcdffcaf016464c29501dfdfc8af046464 95dfdffcaffcdf0295dfdfe3af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6af046464dfdfdffaaf016464d69501dfdfebaf04646495dfdffa affd6401dfdfe3af046464dfdfdffaaf016464c29501dfdfc8af04646495 dfdffaaffd6401dfdfe3af086400d69dd69d569d000800d69dd69d569d56 dff6af02646495fc64fcaf016464d69501dfdfebaf04646495dfdffcaffc 640295dfdfe3af02646495fc64fcaf016464c29501dfdfc8af04646495df dffcaffc640295dfdfe3af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af046464959595fc6403afaf6464d69501dfdfebaf06646495dfdfaf affc64fd9501dfdfe3af046464959595fc6403afaf6464c29501dfdfc8af 06646495dfdfafaffc64fd9501dfdfe3af086400d69dd69d569d000800d6 9dd69d569d56dff6af016464fb95fa64d69501dfdfebaf04646495dfdffc 64fb9501dfdfe3af016464fb95fa64c29501dfdfc8af04646495dfdffc64 fb9501dfdfe3af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af01 6464f995fc64d69501dfdfe9640495df646464f99501dfdfe3af016464f9 95fc64c29501dfdfc6640495df646464f99501dfdfe3af086400d69dd69d 569d000800d69dd69d569d56dff6af016464f795016464d69500dfe86402 95df64f79501dfdfe3af016464f795016464c29500dfc5640295df64f795 01dfdfe3af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464 a4dfe3af01646480dfeddfe3af086400d69dd69d569d000800d69dd69d56 9d56dff6af0064a3dfe3af006480dfecdfe3af086400d6d69d9d9d560008 00d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd6 9d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656 df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80 afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af08 6400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d6 9d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d 000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6 d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd69d56 9d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 af80df80dfdddff6af086400d69dd69d569d000800d69dd69d569d56dff6 af80df80dfdedf0064f6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af80df80dfdfdf016464f6af086400d69dd69d569d000800d69dd69d 569d56dff6affddf80af80afe3affd64f6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6affddf80af80afe3affd64f6af086400d69dd69d56 9d000800d69dd69d569d56dff6affddf80af80afe3affd64f6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6affddf80af80afe3affd64f6af 086400d69dd69d569d000800d69dd69d569d56dff6affddf80af80afe3af fd64f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddfe1af fa00f1af0000f4af0000faaf000080afacaffd64f6af086400d69dd69d56 9d000800d69dd69d569d56dff6affddfe1af0000fcaf010000f6af0400af afaf00f4af0000faaf0000f7af000080afb6affd64f6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6affddfe1af0000fbaf0000f6af0400af afaf00f4af0000f0af000080afb6affd64f6af086400d69dd69d569d0008 00d69dd69d569d56dff6affddfe1af0000fbaf0300afafaffc000bafaf00 0000afaf00af000000f8af0000faaf0b00afafaf000000afaf00000080af b7affd64f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddf e1af0000fcaf150000afaf0000afaf0000afaf00afafaf0000afaf0000f9 af0000faaf0a00afaf00afafaf00afaf0080afb6affd64f6af086400d69d d69d569d000800d69dd69d569d56dff6affddfe1affa00f8af0700afaf00 afafaf00fcaf0000f9af0000faaf0400afaf0000fbaf000080afb6affd64 f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddfe1af0000 f7affb0006afaf00afafaf00fcaf0000f9af0000faaf0a00afafaf000000 afafaf0080afb6affd64f6af086400d69dd69d569d000800d69dd69d569d 56dff6affddfe1af0000f8af0c0000afafaf00afaf00afafaf00fcaf0000 f9af0000faaf0000fbaf040000afaf0080afb6affd64f6af086400d6d69d 9d9d56000800d6d69d9d9d5656dff6affddfe1af0000f8af0000fcaf0700 afaf00afafaf00fcaf0000f9af0000faaf0000faaf0300afaf0080afb6af fd64f6af086400d69dd69d569d000800d69dd69d569d56dff6affddfe1af 0000f8af0c0000afaf0000afaf00afafaf00fcaf0000f9af0000faaf0a00 afaf00afafaf00afaf0080afb6affd64f6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6affddfe1af0000f7affd0008af0000afaf0000af00 fcaf0000f9affa0007af00afafaf000000fcaf01000080afb8affd64f6af 086400d69dd69d569d000800d69dd69d569d56dff6affddf80af80afe3af fd64f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddf80af 80afe3affd64f6af086400d69dd69d569d000800d69dd69d569d56dff6af fddf80af80afe3affd64f6af086400d6d69d9d9d56000800d6d69d9d9d56 56dff6affddf80af80afe3affd64f6af086400d69dd69d569d000800d69d d69d569d56dff6affddffdaf80648064e96405dfafaf646464f6af086400 d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf006480df80dfeb df0664dfafaf646464f6af086400d69dd69d569d000800d69dd69d569d56 dff6affddffdaf0164df80af80afecaf0664dfafaf646464f6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0264dfaf80648064 ee6407af64dfafaf646464f6af086400d69dd69d569d000800d69dd69d56 9d56dff6affddffdaf0264dfaf80648064ef6408dfaf64dfafaf646464f6 af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464df af646480af80aff2af09dfdfaf64dfafaf646464f6af086400d69dd69d56 9d000800d69dd69d569d56dff6affddffdaf0464dfaf646480af80aff2af 09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6affddffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf64 6464f6af086400d69dd69d569d000800d69dd69d569d56dff6affddffdaf 0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464dfaf646480af80 aff2af09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d69d d69d569d56dff6affddffdaf0464dfaf646480af80aff2af09dfdfaf64df afaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affd dffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af0864 00d69dd69d569d000800d69dd69d569d56dff6affddffdaf0464dfaf6464 80af80aff2af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6affddffdaf0464dfaf646480af80aff2af09dfdf af64dfafaf646464f6af086400d69dd69d569d000800d69dd69d569d56df f6affddffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6 af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464df af646480af80aff2af09dfdfaf64dfafaf646464f6af086400d69dd69d56 9d000800d69dd69d569d56dff6affddffdaf0664dfaf6464af0080af80af f4af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d 9d9d5656dff6affddffdaf0664dfaf6464af0080af80aff4af09dfdfaf64 dfafaf646464f6af086400d69dd69d569d000800d69dd69d569d56dff6af fddffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af08 6400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464dfaf64 6480af80aff2af09dfdfaf64dfafaf646464f6af086400d69dd69d569d00 0800d69dd69d569d56dff6affddffdaf0464dfaf646480af80aff2af09df dfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6affddffdaf0464dfaf646480008000f20009dfdfaf64dfafaf646464 f6af086400d69dd69d569d000800d69dd69d569d56dff6affddffdaf0464 dfaf646480008000f20009dfdfaf64dfafaf646464f6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6affddffdaf0864dfaf6464000000aff6 0000afe60000afd80000affa0000afe80000af8000e50009dfdfaf64dfaf af646464f6af086400d69dd69d569d000800d69dd69d569d56dff6affddf fdaf0864dfaf6464000000aff60000afe60000afd80000affa0000aff600 00aff30000af8000e50009dfdfaf64dfafaf646464f6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6affddffdaf0764dfaf64640000aff600 00afe60000afd80000aff90000aff60000aff40000af8000e40009dfdfaf 64dfafaf646464f6af086400d69dd69d569d000800d69dd69d569d56dff6 affddffdaf0a64dfaf64640000af0000affc000eaf0000af000000afafaf 00af000000fcaffd00fdaf0c00af000000af0000af00afafaffc00fdaf09 00af0000af00afaf0000fcaffd0004af00afafaffc000baf000000afafaf 00af000000fcaf070000afafaf000000fcaffc000baf000000afafaf00af 000000fcaffc00fcaffd0007af00afaf0000afaf860009dfdfaf64dfafaf 646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffd af0a64dfaf64640000af0000affc007faf0000af0000afaf0000afaf0000 afaf0000afaf00afaf0000afaf000000af0000afaf0000afaf0000afaf00 00afaf0000afaf000000afaf0000afaf0000afaf0000afaf000000af0000 afaf0000afaf0000afaf0000afaf0000af000000afaf0000afaf000000af 0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf0a0000afaf00 00afaf0000af870009dfdfaf64dfafaf646464f6af086400d69dd69d569d 000800d69dd69d569d56dff6affddffdaf0a64dfaf646400af000000affc 0006af00af000000affc0003af0000affa0000affc0007af0000af000000 affc0003af0000affc0003af0000aff70003af0000affc0007af0000af00 0000affc0000aff90003af0000aff80007af0000af000000affc0003af00 00affc0003af0000affc000baf0000af000000af000000af870009dfdfaf 64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 affddffdaf0a64dfaf646400af000000affc0006af00af000000affc0003 af0000affa0000affc0007af0000af000000affc0003af0000affc0003af 0000affb00fbaf020000affc0007af0000af000000affc0003af000000fb af020000affc00fbaf060000af000000affc0002af0000faaf020000affc 000baf0000af000000af000000af870009dfdfaf64dfafaf646464f6af08 6400d69dd69d569d000800d69dd69d569d56dff6affddffdaf0a64dfaf64 6400af000000affc0006af00af000000affc0003af0000affa0000affc00 07af0000af000000affc0003af0000affc0003af0000affc0008afaf0000 00af0000affc0007af0000af000000affc001baf0000afaf000000af0000 af000000afaf000000af0000af000000affc0003af0000aff90000affc00 0baf0000af000000af000000af870009dfdfaf64dfafaf646464f6af0864 00d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0564dfaf6464 affc0000affc0001afaffc0000affc0003af0000affc0002af00affc0002 af00affc0000affc0003af0000affc0003af0000affc0000affc0003af00 00affc0002af00affc0000affc0003af0000affc0007af0000af000000af fc0002af00affc0000affc0003af0000aff90000affc000baf0000af0000 00af000000af870009dfdfaf64dfafaf646464f6af086400d69dd69d569d 000800d69dd69d569d56dff6affddffdaf0564dfaf6464affc0006afaf00 00afafaffc0016afaf0000afaf0000afaf0000afaf00afaf0000afaf00af fc0000affc000baf0000afaf0000afaf0000affc000fafaf0000afaf0000 afaf0000afaf00affc001bafaf0000afaf0000afaf0000afaf0000af0000 00afaf0000afaf00affc0020afaf0000afaf0000afaf0000afaf0000afaf 0000afaf0000af000000af000000af870009dfdfaf64dfafaf646464f6af 086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0564dfaf 6464affb00fdaf0200afaffb00fdaf0400af000000fcaffd00fdaf0300af 00affc0000affc000baf000000afafaf00af0000affb00fdaf0b00afaf00 af00afafaf0000affb00fdaf1700af000000afafaf00afaf0000afaf0000 afafaf00afafaffb00fdaf0400af000000fcaffc00fcaffd0008af000000 af000000af870009dfdfaf64dfafaf646464f6af086400d69dd69d569d00 0800d69dd69d569d56dff6affddffdaf0464dfaf6464eb0000aff20000af ed0000aff10000afd00000af8000ec0009dfdfaf64dfafaf646464f6af08 6400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464dfaf64 64f00005afaf0000afaff70005afaf0000afaff20005afaf0000afaff100 00afd50005afaf0000afaf8000ec0009dfdfaf64dfafaf646464f6af0864 00d69dd69d569d000800d69dd69d569d56dff6affddffdaf0464dfaf6464 ef00fcaff500fcaff000fcaff00000afd400fcaf8000eb0009dfdfaf64df afaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affd dffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af0864 00d69dd69d569d000800d69dd69d569d56dff6affddffdaf0464dfaf6464 80af80aff2af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6affddffdaf0864dfaf6464afafaf00f6af0000e6 af0000d8af0000faaf000080afccaf09dfdfaf64dfafaf646464f6af0864 00d69dd69d569d000800d69dd69d569d56dff6affddffdaf0864dfaf6464 afafaf00f6af0000e6af0000d8af0000faaf0000f6af000080afd7af09df dfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6affddffdaf0764dfaf6464afaf00f6af0000e6af0000d8af0000f9af 0000f6af000080afd7af09dfdfaf64dfafaf646464f6af086400d69dd69d 569d000800d69dd69d569d56dff6affddffdaf0a64dfaf6464afaf00afaf 00fcaf0e00afaf00afafaf000000af00afafaffc00fdaffd000caf00afaf af00afaf00af000000fcaffd0009af00afaf00af0000afaffc00fdaf0400 af000000fcaf0b00afafaf000000af00afafaffc0007afaf000000afafaf fc0080afdfaf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6affddffdaf0a64dfaf6464afaf00afaf00fcaf63 00afaf00afaf0000afaf0000afaf0000afaf0000af0000afaf0000afafaf 00afaf0000afaf0000afaf0000afaf0000afaf0000afafaf0000afaf0000 afaf0000afaf0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf 00afafaf0000afaf000080afe0af09dfdfaf64dfafaf646464f6af086400 d69dd69d569d000800d69dd69d569d56dff6affddffdaf0a64dfaf6464af 00afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000fcaf0700 afaf00afafaf00fcaf0300afaf00fcaf0300afaf00f7af0300afaf00fcaf 0700afaf00afafaf00fcaf0000f9af0300afaf00f8af000080afe0af09df dfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6affddffdaf0a64dfaf6464af00afafaf00fcaf0600af00afafaf00fc af0300afaf00faaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf 0300afaf00fbaffb0002afaf00fcaf0700afaf00afafaf00fcaf0300afaf affb0002afaf00fcaffb0080afe0af09dfdfaf64dfafaf646464f6af0864 00d69dd69d569d000800d69dd69d569d56dff6affddffdaf0a64dfaf6464 af00afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000fcaf07 00afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf080000afafaf 00afaf00fcaf0700afaf00afafaf00fcaf1400afaf0000afafaf00afaf00 afafaf0000afafaf0080afe0af09dfdfaf64dfafaf646464f6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0564dfaf646400fc af0000fcaf010000fcaf0000fcaf0300afaf00fcaf0200af00fcaf0200af 00fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0000fcaf0300afaf00 fcaf0200af00fcaf0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf 000080afe0af09dfdfaf64dfafaf646464f6af086400d69dd69d569d0008 00d69dd69d569d56dff6affddffdaf0564dfaf646400fcaf060000afaf00 0000fcaf160000afaf0000afaf0000afaf0000af0000afaf0000af00fcaf 0000fcaf0b00afaf0000afaf0000afaf00fcaf0f0000afaf0000afaf0000 afaf0000af00fcaf190000afaf0000afaf0000afaf0000afaf00afafaf00 00afaf000080afe0af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d 56000800d6d69d9d9d5656dff6affddffdaf0564dfaf646400fbaffd0002 af0000fbaffd0004af00afafaffc00fdaffd0003af00af00fcaf0000fcaf 0b00afafaf000000af00afaf00fbaffd000baf0000af00af000000afaf00 fbaffd0016af00afafaf000000af0000afaf0000afaf000000af000080af e1af09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d69dd6 9d569d56dff6affddffdaf0464dfaf6464ebaf0000f2af0000edaf0000f1 af000080afbbaf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d5600 0800d6d69d9d9d5656dff6affddffdaf0464dfaf6464f0af050000afaf00 00f7af050000afaf0000f2af050000afaf0000f1af000080afbbaf09dfdf af64dfafaf646464f6af086400d69dd69d569d000800d69dd69d569d56df f6affddffdaf0464dfaf6464efaffc00f5affc00f0affc00f0af000080af bbaf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d 9d9d5656dff6affddffdaf0464dfaf646480af80aff2af09dfdfaf64dfaf af646464f6af086400d69dd69d569d000800d69dd69d569d56dff6affddf fdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af086400 d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464dfaf646480 af80aff2af09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800 d69dd69d569d56dff6affddffdaf0464dfaf646480af80aff2af09dfdfaf 64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 affddffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af 086400d69dd69d569d000800d69dd69d569d56dff6affddffdaf0464dfaf 646480df80dff0df07af64dfafaf646464f6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6affddffdaf0364dfaf6480df80dfefdf07af64df afaf646464f6af086400d69dd69d569d000800d69dd69d569d56dff6affd dffdaf0164df80af80afecaf0664dfafaf646464f6af086400d6d69d9d9d 56000800d6d69d9d9d5656dff6affddffdaf80648064e96405dfafaf6464 64f6af086400d69dd69d569d000800d69dd69d569d56dff6affddffdaf80 df80dfe8df04afaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6affddf80af80afe3affd64f6af086400d69dd69d569d000800d6 9dd69d569d56dff6affddf80af80afe3affd64f6af086400d6d69d9d9d56 000800d6d69d9d9d5656dff6affddf80af80afe3affd64f6af086400d69d d69d569d000800d69dd69d569d56dff6affddf80af80afe3affd64f6af08 6400d6d69d9d9d56000800d6d69d9d9d5656dff6affddf80af80afe3affd 64f6af086400d69dd69d569d000800d69dd69d569d56dff6affddf806480 64e064f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af01dfdf 80648064df64f6af086400d69dd69d569d000800d69dd69d569d56dff6af 00df80648064de64f6af086400d6d69d9d9d56000800d6d69d9d9d5656df 80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80af c9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af0864 00d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d69d 9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d00 0800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d6 9d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d 56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af 80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af 086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d6 9dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d 56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800 d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d 9d5656dff1affd00f4af0000ebaf000080af80af0aafaf6400d69dd69d56 9d000800d69dd69d569d56dff3af060000afafaf0000f6af0000efaf0400 afafaf0080af80af0aafaf6400d6d69d9d9d56000800d6d69d9d9d5656df f3af0000fbaf0000f6af0000efaf000080af80affaaf086400d69dd69d56 9d000800d69dd69d569d56dff3af0000f7affc00fdaf0300afafaffc00fc affc0009af000000afaf00afafaffc00fdaf0400af00000080af8daf0864 00d6d69d9d9d56000800d6d69d9d9d5656dff2af010000faaf2e0000afaf 0000afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00afaf00 00afaf0000afaf0000afaf000080af8eaf086400d69dd69d569d000800d6 9dd69d569d56dff0af010000fcaf0000fcaf0600afaf00afaf00fcaf0300 afaf00faaf0700afafaf00afaf00fcaf0300afaf00fcaf000080af8eaf08 6400d6d69d9d9d56000800d6d69d9d9d5656dfeeaf030000afaffa0004af af00afaffa0002afaf00faaf0700afafaf00afaf00fcaf0300afaf00fcaf 000080af8eaf086400d69dd69d569d000800d69dd69d569d56dfedaf0300 afaf00f9af0300afaf00f9af0000faaf0700afafaf00afaf00fcaf0300af af00fcaf000080af8eaf086400d6d69d9d9d56000800d6d69d9d9d5656df f3af0000fbaf0300afaf00f9af0300afaf00f9af0000fcaf0900af00afaf af00afaf00fcaf0300afaf00fcaf000080af8eaf086400d69dd69d569d00 0800d69dd69d569d56dff3af320000afafaf0000afaf0000afaf0000afaf 00afaf0000afaf0000afaf0000afaf0000af00afafaf00afaf0000afaf00 00afaf00fcaf000080af8eaf086400d6d69d9d9d56000800d6d69d9d9d56 56dff1affd00fbaffc00fdaf0300afafaffc00fcaffc00fdaf060000af00 afafaffc00fdaf0000fcaf000080af8eaf086400d69dd69d569d000800d6 9dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d 5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80 af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9 af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400 d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d 569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d560008 00d6d69d9d9d5656dff4af80648064e164f4af086400d69dd69d569d0008 00d69dd69d569d56dff4af80648064e26400dff4af086400d6d69d9d9d56 000800d6d69d9d9d5656dff4af01646480af80afe5af01dfdff4af086400 d69dd69d569d000800d69dd69d569d56dff4af01646480af80afe5af01df dff4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af01646480af 80afe5af01dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4 af01646480af80afe5af01dfdff4af086400d6d69d9d9d56000800d6d69d 9d9d5656dff4af01646480af80afe5af01dfdff4af086400d69dd69d569d 000800d69dd69d569d56dff4af01646480af80afe5af01dfdff4af086400 d6d69d9d9d56000800d6d69d9d9d5656dff4af01646480af80afe5af01df dff4af086400d69dd69d569d000800d69dd69d569d56dff4af01646480af 80afe5af01dfdff4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4 af016464f8af0000f6af0000e6af0000d8af0000faaf0000e8af0000daaf 000084af01dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4 af016464f8af0000f6af0000e6af0000d8af0000faaf0000f6af0000f3af 0000daaf000084af01dfdff4af086400d6d69d9d9d56000800d6d69d9d9d 5656dff4af016464f9af0000f6af0000e6af0000d8af0000f9af0000f6af 0000f4af0000daaf000083af01dfdff4af086400d69dd69d569d000800d6 9dd69d569d56dff4af016464f9af0300afaf00fcaf0e00afaf00afafaf00 0000af00afafaffc00fdaffd000caf00afafaf00afaf00af000000fcaffd 0009af00afaf00af0000afaffc00fdaf0400af000000fcaf0b00afafaf00 0000af00afafaffc0007afaf000000afafaffc00fcaf0b00afafaf000000 af00afafaffc00fcaffc00fdaf0700af0000afaf0000fcaf000083af01df dff4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af016464f9af 0300afaf00fcaf7f00afaf00afaf0000afaf0000afaf0000afaf0000af00 00afaf0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000af afaf0000afaf0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf 0000afaf0000afaf00afafaf0000afaf0000afafaf00afaf0000afaf0000 afaf0000afaf0000afaf0000afaf00000eafaf0000afaf0000afaf00afaf af0083af01dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4 af016464faaf0400afafaf00fcaf0600af00afafaf00fcaf0300afaf00fa af0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00f7af 0300afaf00fcaf0700afaf00afafaf00fcaf0000f9af0300afaf00f8af07 00afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf0e00afaf00af afaf00afafaf00afaf0082af01dfdff4af086400d6d69d9d9d56000800d6 d69d9d9d5656dff4af016464faaf0400afafaf00fcaf0600af00afafaf00 fcaf0300afaf00faaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fc af0300afaf00fbaffb0002afaf00fcaf0700afaf00afafaf00fcaf0300af afaffb0002afaf00fcaffb0006afaf00afafaf00fcaf0200afaffa0002af af00fcaf0e00afaf00afafaf00afafaf00afaf0082af01dfdff4af086400 d69dd69d569d000800d69dd69d569d56dff4af016464faaf0400afafaf00 fcaf0600af00afafaf00fcaf0300afaf00faaf0000fcaf0700afaf00afaf af00fcaf0300afaf00fcaf0300afaf00fcaf080000afafaf00afaf00fcaf 0700afaf00afafaf00fcaf1b00afaf0000afafaf00afaf00afafaf0000af afaf00afaf00afafaf00fcaf0300afaf00f9af0000fcaf0e00afaf00afaf af00afafaf00afaf0082af01dfdff4af086400d6d69d9d9d56000800d6d6 9d9d9d5656dff4af016464fbaf0000fcaf0000fcaf010000fcaf0000fcaf 0300afaf00fcaf0200af00fcaf0200af00fcaf0000fcaf0300afaf00fcaf 0300afaf00fcaf0000fcaf0300afaf00fcaf0200af00fcaf0000fcaf0300 afaf00fcaf0700afaf00afafaf00fcaf0200af00fcaf0000fcaf0300afaf 00f9af0000fcaf0d00afaf00afafaf00afafaf00af0081af01dfdff4af08 6400d69dd69d569d000800d69dd69d569d56dff4af016464fbaf0000fcaf 060000afaf000000fcaf160000afaf0000afaf0000afaf0000af0000afaf 0000af00fcaf0000fcaf0b00afaf0000afaf0000afaf00fcaf0f0000afaf 0000afaf0000afaf0000af00fcaf1b0000afaf0000afaf0000afaf0000af af00afafaf0000afaf0000af00fcaf220000afaf0000afaf0000afaf0000 afaf0000afaf0000afaf00afafaf00afafaf00af0081af01dfdff4af0864 00d6d69d9d9d56000800d6d69d9d9d5656dff4af016464fbaf0000fbaffd 0002af0000fbaffd0004af00afafaffc00fdaffd0003af00af00fcaf0000 fcaf0b00afafaf000000af00afaf00fbaffd000baf0000af00af000000af af00fbaffd0017af00afafaf000000af0000afaf0000afaf000000af0000 00fbaffd0004af00afafaffc00fcaffc00fdaf0a00afafaf00afafaf00af 0081af01dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4af 016464e6af0000f2af0000edaf0000f1af0000d0af000080afe4af01dfdf f4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af016464ebaf05 0000afaf0000f7af050000afaf0000f2af050000afaf0000f1af0000d5af 050000afaf000080afe4af01dfdff4af086400d69dd69d569d000800d69d d69d569d56dff4af016464eaaffc00f5affc00f0affc00f0af0000d4affc 0080afe3af01dfdff4af086400d6d69d9d9d56000800d6d69d9d9d5656df f4af01646480af80afe5af01dfdff4af086400d69dd69d569d000800d69d d69d569d56dff4af01646480af80afe5af01dfdff4af086400d6d69d9d9d 56000800d6d69d9d9d5656dff4af01646480af80afe5af01dfdff4af0864 00d69dd69d569d000800d69dd69d569d56dff4af01646480af80afe5af01 dfdff4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af01646480 af80afe5af01dfdff4af086400d69dd69d569d000800d69dd69d569d56df f4af01646480df80dfe3dff4af086400d6d69d9d9d56000800d6d69d9d9d 5656dff4af006480df80dfe2dff4af086400d69dd69d569d000800d69dd6 9d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656 df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80 afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af08 6400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d6 9d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d 000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6 d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd69d56 9d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80 af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80afc9 af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400 d69dd69d569d000800d69dd69d569d56df80648064c8640700d6d69d9d9d 56000700d6d69d9d9d565680df80dfc8df086400d69dd69d569d000800d6 9dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d 5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80 af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9 af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400 d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d 569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d560008 00d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd6 9d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656 df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80 afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af08 6400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff3afc96480af8daf086400d69dd69d 569d000800d69dd69d569d56dff3af0064cbaf00df80af8daf086400d6d6 9d9d9d56000800d6d69d9d9d5656dff3af0064cbaf00df80af8daf086400 d69dd69d569d000800d69dd69d569d56dff3af0064cbaf00df80af8daf08 6400d6d69d9d9d56000800d6d69d9d9d5656dff3af0064cbaf00df80af8d af086400d69dd69d569d000800d69dd69d569d56dff3af0064fcafd3dffc af00dfbfafd3dfbaafd3dfeeaf086400d6d69d9d9d56000800d6d69d9d9d 5656dff3af0064fcafd4df0064fcaf00dfbfafd4df0064baafd4df0064ee af086400d69dd69d569d000800d69dd69d569d56dff3af0064fcafd5df01 6464fcaf00dfbfafd5df016464baafd5df016464eeaf086400d6d69d9d9d 56000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64fcaf00dfbfaf fddfd9affd64baaffddfd9affd64eeaf086400d69dd69d569d000800d69d d69d569d56dff3af0064fcaffddfd9affd64fcaf00dfbfaffddfd9affd64 baaffddfd9affd64eeaf086400d6d69d9d9d56000800d6d69d9d9d5656df f3af0064fcaffddfd9affd64fcaf00dfbfaffddfd9affd64baaffddfd9af fd64eeaf086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaf fddfd9affd64fcaf00dfbfaffddfd9affd64baaffddfd9affd64eeaf0864 00d6d69d9d9d56000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64 fcaf00dfbfaffddfd9affd64baaffddfd9affd64eeaf086400d69dd69d56 9d000800d69dd69d569d56dff3af0064fcaffddfd9affd64fcaf00dfbfaf fddfd9affd64baaffddfd9affd64eeaf086400d6d69d9d9d56000800d6d6 9d9d9d5656dff3af0064fcaffddff3affd00fbaf0000fbaf0000f5affd64 fcaf00dfbfaffddffbaff90004af00afaf00eaaffd64baaffddffaaf0000 faaf0300afaf00f9af0000f2affd64eeaf086400d69dd69d569d000800d6 9dd69d569d56dff3af0064fcaffddff5af0a0000afafaf0000afafaf00fc af0000f4affd64fcaf00dfbfaffddffbaf0000f9af0600afaf00afaf00ed affd64baaffddffaaf0000faaf0300afaf00f9af0000f2affd64eeaf0864 00d6d69d9d9d56000800d6d69d9d9d5656dff3af0064fcaffddff5af0000 fbaf0800afafaf00afafaf00f3affd64fcaf00dfbfaffddffbaf0000f6af 0300afaf00edaffd64baaffddffaaf0000faaf0000f6af0000f2affd64ee af086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaffddff6 af0000f9af0600afaf00afaf00f2affd64fcaf00dfbfaffddffbaf0000f9 af0a00afaf00af000000afafaffc00fdaf0300af0000fcaffd64baaffddf faaf0000faaf0e00afaf00afafaf000000af00afafaffc00f9affd64eeaf 086400d6d69d9d9d56000800d6d69d9d9d5656dff3af0064fcaffddff6af 0000f9af0500afaf00af00f1affd64fcaf00dfbfaffddffbaf0000f9af13 00afaf00afaf00afafaf0000afaf0000afaf0000faaffd64baaffddffaaf 0000faaf1300afaf00afaf0000afaf0000afaf0000afaf0000faaffd64ee af086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaffddff6 af0000f9af0500afaf000000f1affd64fcaf00dfbfaffddffbaffa000caf af00afaf00afaf00afafaf00fcaf0300afaf00f9affd64baaffddffaaff8 0005afaf00afaf00fcaf0300afaf00fcaf0000faaffd64eeaf086400d6d6 9d9d9d56000800d6d69d9d9d5656dff3af0064fcaffddff6af0000f9af06 00afaf00afaf00f2affd64fcaf00dfbfaffddffbaf0000f9af0900afaf00 afaf00afafaffa0002afaf00f9affd64baaffddffaaf0000faaf0600afaf 00afaf00fcaf0200afaffa00faaffd64eeaf086400d69dd69d569d000800 d69dd69d569d56dff3af0064fcaffddff6af0000f9af0700afaf00afafaf 00f3affd64fcaf00dfbfaffddffbaf0000f9af0a00afaf00afaf00afafaf 00f9af0000f9affd64baaffddffaaf0000faaf0600afaf00afaf00fcaf03 00afaf00f5affd64eeaf086400d6d69d9d9d56000800d6d69d9d9d5656df f3af0064fcaffddff5af0000fbaf0400afafaf00fcaf0000f4affd64fcaf 00dfbfaffddffbaf0000f9af0a00afaf00afaf00afafaf00f9af0000f9af fd64baaffddffaaf0000faaf0600afaf00afaf00fcaf0300afaf00f5affd 64eeaf086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaffd dff5af0a0000afafaf0000afafaf00fbaf0000f5affd64fcaf00dfbfaffd dffbaf0000f9af1200afaf00afaf00afafaf0000afaf0000afaf00f9affd 64baaffddffaaf0000faaf1300afaf00afaf0000afaf0000afaf0000afaf 0000faaffd64eeaf086400d6d69d9d9d56000800d6d69d9d9d5656dff3af 0064fcaffddff3affd00fbaf0000faaf0000f6affd64fcaf00dfbfaffddf fbaf0000f9af0a00afaf00afafaf0000afaffc00fdaf0000f9affd64baaf fddffaaf0000faaf0e00afaf00afafaf000000af00afafaffc00f9affd64 eeaf086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaffddf d9affd64fcaf00dfbfaffddfd9affd64baaffddfd9affd64eeaf086400d6 d69d9d9d56000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64fcaf 00dfbfaffddfd9affd64baaffddfd9affd64eeaf086400d69dd69d569d00 0800d69dd69d569d56dff3af0064fcaffddfd9affd64fcaf00dfbfaffddf d9affd64baaffddfd9affd64eeaf086400d6d69d9d9d560008009d569d9d 9d5656dff3af0064fcaffddfd9affd64fcaf00dfbfaffddfd9affd64baaf fddfd9affd64eeaf086400d69dd69d569d000000fb56029d56dff3af0064 fcaffddfd9affd64fcaf00dfbfaffddfd9affd64baaffddfd9affd64eeaf 036400d6d6fc56ff000000fcd6039d5656dff3af0064fcaffddfd9affd64 fcaf00dfbfaffddfd9affd64baaffddfd9affd64eeaf036400d69dfcd6ff 000800d6d6d69d569d56dff3af0064fcaffddfd9affd64fcaf00dfbfaffd dfd9affd64baaffddfd9affd64eeaf086400d6d69dd6d6d6000800d6d69d 9d9d5656dff3af0064fcaffddfd664fcaf00dfbfaffddfd664baaffddfd6 64eeaf086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaf01 dfdfd564fcaf00dfbfaf01dfdfd564baaf01dfdfd564eeaf086400d6d69d 9d9d56000800d6d69d9d9d5656dff3af0064fcaf00dfd464fcaf00dfbfaf 00dfd464baaf00dfd464eeaf086400d69dd69d569d000800d69dd69d569d 56dff3af0064cbaf00df80af8daf086400d6d69d9d9d56000800d6d69d9d 9d5656dff3af0064cbaf00df80af8daf086400d69dd69d569d000800d69d d69d569d56dff3af0064cbaf00df80af8daf086400d6d69d9d9d56000800 d6d69d9d9d5656dff3af0064cbaf00df80af8daf086400d69dd69d569d00 0800d69dd69d569d56dff3af0064cadf80af8daf086400d6d69d9d9d5600 0800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69d d69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d56 56df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af 80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af 086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6 d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d56 9d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800 d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd69d 569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df 80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80af c9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af0864 00d69dd69d569d000800d69dd69d569d56df80648064c8640700d6d69d9d 9d56000700d6d69d9d9d565680008000c60006d69dd69d569d000600d69d d69d569d80d680d6c3d6fd9d0156007f00d6d69d9d9dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d7fd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69d48d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69d569d000300d69dd6e59d0156d6809d80 9df99d0156d6e39d0156000200d6d6e59d035656d6d6809d809dfa9d0256 d6d6e59d02569d007f00d69d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d56d6d69d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d567f9d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d56489d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d5656d6d6569d569d569d569d569d569d569d569d569d569d 569d569d569d569d56000100d6e25601d6d680568056f95601d6d6e356ff 0080008000b700 grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.5/doc/figs/cam.eps0000644000175000017500000040707012310162300013233 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: noname.ps %%Creator: pnmtops %%CreationDate: 12. Mär 17:51 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 255 237 357 525 %%HiResBoundingBox: 255.599992 237.239993 356.399989 524.759961 %%EndComments %%BeginProlog %%BeginPreview: 100 288 8 864 % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffff % 2962292929292929292929292929a929626262626262626262622929292929292929292929296262 % 62626262626262626262292929292929292929292929626262626262626262626262292929292929 % 29292929a92962626262626262626262626229a9 % 2962626262626262626262626262a962626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262622962626262626262626262626262a9 % 2962a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262 % 62626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9 % a9a9a9a9a9a962626262626262626262626262a9 % 2962a929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292962a9 % 2962a92962626262626262626262a962626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626229626262626262 % 62626262622962626262626262626262a92962a9 % 2929622962626262626262626262a92962626262626262ffff626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262626262a929626262626262 % 62626262622962ff626262626262ff62a9296262 % 2929622962626262626262626262a929626262626262ff6262626262ffff62ff62ffffff6262ff62 % 62ffff62ffff6262ffff62626262626262626262626262626262626262626262a929626262626262 % 62626262622962ff626262626262ff62a9296262 % 2929622962ffffffffffffffff62a929626262626262ff626262626262ff62ff62ff62ff62ff62ff % 62ff62626262ff62ff6262626262626262626262626262626262626262626262a929626262ffff62 % 62626262622962ff626262626262ff62a9296262 % 2929622962ff62626262626262ffa929626262626262ff62626262ff62ff62ff62ff62ffff626262 % ff6262ff62ff626262ff62626262626262626262626262626262626262626262a929626262ff62ff % 62626262622962ff626262626262ff62a9296262 % 292962296262ffffffffffffffffa929626262626262ff62ffffff62ff62ff62ff62ff62ff62ff62 % ff6262ff62ff62ff62ff62626262626262626262626262626262626262626262a92962626262ffff % 62626262622962ff626262626262ff62a9296262 % 2929622962626262626262626262a929626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262626262a929626262626262 % 62626262622962ff626262626262ff62a9296262 % 2929622962626262626262626262a929626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262626262a929626262626262 % 62626262622962ff626262626262ff62a9296262 % 2929622962626262626262626262a929626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262626262a929626262626262 % 6262626262296262ffffffffffffff62a9296262 % 2929622962626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9 % a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a929626262626262 % 626262626229a9a9a9a9a9a9a9a9a9a9a9296262 % a9a962ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffff29a9a9 % 29296220202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020209b292929 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050502020202020202020 % 202020202020202020202020202050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050502050505050505050 % 505050505050505050505050509b50509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050502050505050505050 % 505050505050505050505050509b50509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050502050505050505050 % 505050505050505050505050509b50509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050505050505050205050ffff505050 % 505050505050505050505050509b50509b2962a9 % 2962a92050505050505050505050505050505050505050505050505050505050505050505050ff50 % 50505050505050505050505050505050505050505050505050505050505050502050505050505050 % 505050505050505050505050509b50509b2962a9 % 2962a9205050505050505050505050505050505050505050505050505050505050505050505050ff % 5050505050505050505050505050505050505050505050505050505050505050205050505050ff50 % ff50ff50ff5050ff50ff5050509b50509b2962a9 % 2962a9205050505050505050505050505050505050505050505050505050505050505050ff505050 % 50ff50ff50ff50ff5050ff50ff50ff50ff50ff50505050505050505050505050205050505050ff50 % 5050ff50505050ffffff5050509b50509b2962a9 % 2962a9205050505050505050505050505050505050505050505050505050505050505050ff505050 % 50ffffff505050505050ffffff50505050ffff505050505050505050505050502050505050505050 % 5050ff50505050ff50505050509b50509b2962a9 % 2962a9205050505050505050505050505050505050505050505050505050505050505050505050ff % 505050ff505050505050505050505050ff505050505050505050505050505050205050ffff505050 % ffff505050505050ffff5050509b50509b2962a9 % 2962a92050505050505050505050505050505050505050505050505050505050505050505050ff50 % 50ffffff505050505050ffff5050505050ff50ff5050505050505050505050502050505050505050 % 505050505050505050505050509b50509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050502050505050505050 % 505050505050505050505050509b50509b2962a9 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050502050505050505050 % 505050505050505050505050509b50509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050509b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b50509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220502020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020205050509b296262 % 29296220502050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b5050509b296262 % 29296220502050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b5050509b296262 % 29296220502050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b5050509b296262 % 292962205020505050505050505050ffffff5050505050505050ff50505050505050505050505050 % 5050505050505050505050505050ffff505050505050505050505050505050ffff50ffff5050ffff % ff50ff5050505050505050509b5050509b296262 % 2929622050205050505050505050505050505050505050505050ff50505050505050505050505050 % 50505050505050505050505050ff5050ff5050505050505050505050505050ff50505050ff505050 % 5050505050505050505050509b5050509b296262 % 2929622050205050505050505050505050ff50ff50ff50ff50ffff505050ff50ff50ff50ff50ff50 % 5050ffff50ff50ff50ff5050505050505050ff50ff5050ff50ff50ff505050ff50ff505050505050 % ff50505050505050505050509b5050509b296262 % 2929622050205050505050505050505050ff5050ffff50ff5050ff5050505050ff505050ff50ff50 % 5050ffff505050ff505050505050505050505050ff50505050ff5050505050ff50ff505050505050 % ff50505050505050505050509b5050509b296262 % 2962a92050205050505050505050505050ff50ff50ff50ff50ffff50ff50ff50ff505050ff50ff50 % ff50ffff505050ff50ff505050ff5050ff50ff50ff5050ff50ff5050505050ff50505050ff505050 % ff50505050505050505050509b5050509b2962a9 % 2962a92050205050505050505050505050505050505050505050505050505050ff50505050505050 % 50505050505050505050505050505050505050505050505050505050505050ff5050505050505050 % 5050505050505050505050509b5050509b2962a9 % 2962a9205020505050505050505050505050505050505050505050505050ffff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050ffff50505050505050 % 5050ff5050505050505050509b5050509b2962a9 % 2962a920502050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b5050509b2962a9 % 2962a920502050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b5050509b2962a9 % 2962a92050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b5050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050202020202020505050ffff50505050505050ff50505050ff5050ff505050505050 % 5050ff505050505050505050ffffff5050505050ff50ff5050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a92050505020505050509b505050ff5050505050505050505050505050505050505050505050 % 5050ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a92050505020505050509b505050ff505050505050505050505050ff505050ff50ff50ffff50 % ff50ff50ff50ff50505050505050ff50ff505050505050ff50ff50ff505050ff50ff50ff50ff5050 % 505050505050505050505050505050509b2962a9 % 2962a92050505020505050509b505050ff50ff50ff50ffff50505050505050ff50ff505050ffff50 % 5050ff50ffffff50ffffff505050ff50ff505050505050ffffff50ff505050ff5050505050ff5050 % 505050505050505050505050505050509b2962a9 % 2962a92050505020505050509b505050ff50505050505050505050505050505050ff505050ffff50 % 5050ff50505050505050505050505050ff505050505050ff505050ff505050ff5050505050ff5050 % 505050505050505050505050505050509b2962a9 % 2962a920505050209b9b9b9b9b505050ff5050ff5050ffff505050505050ff5050ff505050ff50ff % 5050ff50ffff505050505050ffffff5050ff505050505050ffff50ff505050ff505050ffffff5050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050ff505050505050505050505050505050505050505050ff50 % ff50505050505050505050505050505050505050505050505050505050505050505050ff50ff5050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050202020202020505050ffff50505050505050ff50505050ffff505050505050ff50 % 50505050505050505050505050505050505050ffff50ff5050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 2929622050505020505050509b505050ff505050505050505050505050ff5050ff505050505050ff % 505050505050505050505050505050505050ff5050ffff5050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 2929622050505020505050509b505050ff50505050505050505050505050ff505050ff50ff5050ff % 505050505050ff50ff50ff50ff50ff50505050ff5050ff50ff50ff50ff50ff50ff5050ff50ff50ff % 50ff50505050505050505050505050509b296262 % 2929622050505020505050509b505050ff50ff50ff5050ffff50505050505050ff505050ff5050ff % 50ff5050ff5050ffff505050ffffff505050505050ffff50505050ffff50ff50505050ff505050ff % 505050505050505050505050505050509b296262 % 2929622050505020505050509b505050ff505050505050505050505050ff5050ff505050ff5050ff % 50ffffffff50ff5050505050ff5050505050ff5050ffff505050ff505050ff50505050ff505050ff % 505050505050505050505050505050509b296262 % 29296220505050209b9b9b9b9b505050ff5050ff50505050505050505050ffff5050ffff50505050 % ff505050505050ff50ff505050ffff50505050ffff50ff50505050ff50ff50ff505050ff50505050 % ff5050505050505050505050505050509b296262 % 29296220505050505050505050505050ff5050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050505050505050505050ff % 50ff50505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 2962a9205050509b9b9b9b9b9b505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a9205050509b1d1d1d1d20505050ff50505050505050ff505050505050505050505050505050 % 50505050505050ff50ff50505050505050ff5050ff5050ff50ff505050505050505050ff50505050 % 505050505050505050505050505050509b2962a9 % 2962a9205050509b1d1d1d1d20505050ff5050505050505050ff5050505050505050505050ff50ff % ffffff505050ff50505050ffffff505050ff5050505050ff50ffffff5050ffff50ffffff5050ff50 % 50ffffff5050505050505050505050509b2962a9 % 2962a9205050509b1d1d1d1d20505050ff50ff50ff50505050ff5050505050505050505050ff5050 % ff5050505050ff50505050ff5050505050ff5050505050ff50ff505050ff505050ff50ff505050ff % 505050ff5050505050505050505050509b2962a9 % 2962a9205050509b1d1d1d1d20505050ff50ff50ff50505050ff5050505050505050505050ff5050 % ff5050505050ff50505050ff5050505050ff5050505050ff50ff505050ff505050ff50ff505050ff % 505050ff5050505050505050505050509b2962a9 % 2962a9205050509b1d1d1d1d20505050ff50505050505050ff50505050505050505050ff50ff5050 % ff505050505050ff50ff50ff5050505050ff5050ff5050ff50ff505050ff50ff50ff50ff505050ff % 50ff50ff5050505050505050505050509b2962a9 % 2962a920505050202020202020505050ff5050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050ff5050505050505050505050509b2962a9 % 2962a920505050505050505050505050ffff5050505050505050ff50505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50ffff505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050202020202020505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2929622050505020505050509b505050ff50505050505050ff50505050ff5050ff50505050505050 % 50505050505050505050ff50ff50ff50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 2929622050505020505050509b505050ff5050505050ff50ff50505050ff50505050ff5050ffff50 % 50505050505050ff50505050ff50ff50ff50ff50ff50ff505050ff50505050ff50ff50ff50ff5050 % ff50ff50ff50ff50ff50ff50ff5050509b296262 % 2929622050505020505050509b505050ff50ff50ff505050ff50505050ff50505050ff5050ffff50 % ff5050ff505050ff50505050ff50ff505050ffffff5050505050ff5050505050ffff505050505050 % ffffff50ff5050ffff5050ff505050509b296262 % 2929622050505020505050509b505050ff50505050505050ff50505050ff5050ff50ff5050505050 % ffffffff505050505050ff50ff50ff505050ff505050505050505050505050ff5050505050505050 % ff505050ff50ff5050505050ff5050509b296262 % 29296220505050209b9b9b9b9b505050ff5050ff5050ffffff50505050ffffff5050ff5050ff50ff % 505050505050505050ff505050ffff50505050ffff50505050505050ff505050ff50505050505050 % 50ffff50ff5050ff50ff50ff505050509b296262 % 29296220505050505050505050505050ff5050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050202020202020505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 2929622050505020505050509b505050ff5050505050ff50ff50505050ff5050ff50505050505050 % 50505050505050ff5050ff505050505050ff505050ff50ff5050505050ff50505050505050505050 % 505050505050505050505050505050509b296262 % 2962a92050505020505050509b505050ff50ff50ff50ff50ff50505050ff50505050ff5050ffff50 % 50505050505050ff5050ff50ff50ff5050ff50505050505050ff50ff50ff50ff50ff50ff50ff50ff % 50ff50505050505050505050505050509b2962a9 % 2962a92050505020505050509b505050ff5050ffff50ff50ff50505050ff50505050ff5050ffff50 % ff5050ff505050ff5050ff505050ff5050ff5050505050ff50ff505050ff505050ffffff505050ff % ffff50505050505050505050505050509b2962a9 % 2962a92050505020505050509b505050ff50ff505050ff50ff50505050ff5050ff50ff5050505050 % ffffffff505050ff5050ff505050ff5050ff505050ff505050ff505050ff505050ff5050505050ff % 505050505050505050505050505050509b2962a9 % 2962a920505050209b9b9b9b9b505050ff5050ff50ffff50ff50505050ffffff5050ff5050ff50ff % 5050505050505050ffff50505050ff505050ff505050ff5050ffffff50ff50505050ff5050505050 % ffff50505050505050505050505050509b2962a9 % 2962a920505050505050505050505050ff50505050505050ff505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050ff5050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050ff5050 % 5050505050ff50505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % ff50ffff50ff50ffff5050ffffffff505050ffff50ffff5050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a92050505050505050505050505050505050505050505050505050505050505050ffffff5050 % 50ff505050ff505050ffff505050505050ff505050ff50ff50505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50ff505050ff50505050ff505050505050ff505050ff50ff50505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 5050ffff50ff50ffff5050ffff50ff505050ffff50ff50ff50505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050ff50505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020505050505050509b296262 % 29296220505050505050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b2020505050505050509b296262 % 29296220505050505050505050205050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502020505050505050509b296262 % 29296220505050505050505050205050505050ff5050505050505050ff5050505050ff5050ff5050 % 50ff50ff505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502020505050505050509b296262 % 29296220505050505050505050205050505050ffff5050ffffff5050ff5050505050505050505050 % ffff50ffffff5050ffff50ffffff5050ff50ffff50ffff505050ff50505050ffff50505050505050 % 505050505050502020505050505050509b296262 % 29296220505050505050505050205050505050ff50505050ff50ff50ff5050505050505050505050 % 50ff50ff505050ff5050505050ff50505050505050ff50ff505050ff5050ff505050505050505050 % 505050505050502020505050505050509b296262 % 29296220505050505050505050205050505050ff50505050ff50ff50ff5050505050505050505050 % 50ff50ff505050ff5050505050ff505050ff505050ff50ff505050ff5050ff505050505050505050 % 505050505050502020505050505050509b296262 % 2962a92050505050505050505020505050ffff5050505050ffff5050ff505050505050ffff505050 % 5050ffff50505050ffff50ffffff50505050ff50ffffff50505050ff505050ffff50505050505050 % 505050505050502020505050505050509b2962a9 % 2962a9205050505050505050502050505050505050505050ff505050ff5050505050505050505050 % 5050505050505050505050ff50ff50505050505050ff505050505050505050505050505050505050 % 505050505050502020505050505050509b2962a9 % 2962a92050505050505050505020ffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff2020505050505050509b2962a9 % 2962a92050505050505050505020ff50ffff50ffffffffffffffff5050ffffffffff505050ffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff2020505050505050509b2962a9 % 2962a92050505050505050505020ffffffff50ffffffffffffffffff50ffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff2020505050505050509b2962a9 % 2962a92050505050505050505020ffffffff50ff50ffff5050ff50ff50ffffffffffffff50ff50ff % 50ff50ff50ff50ff50ffff50ff50ff50ff50ffffffffffff5050ff50ffffffffffffffffffffffff % ffffffffffffff2020505050505050509b2962a9 % 2962a92050505050505050505020ffffffff50ffffffffff50ff50ff50ffffffffffffffffff5050 % 50ffffffff50ffffffffff505050ff50ffffffffffffffffff505050ffffffffffffffffffffffff % ffffffffffffff2020505050505050509b2962a9 % 2962a92050505050505050505020ffffffff50ffff5050ff50ff50ff50ffffffffffffffffffffff % ffffffffffff50ffffffff50ffffff50ffffffffffff5050ff50ffffffffffffffffffffffffffff % ffffffffffffff2020505050505050509b2962a9 % 2962a92050505050505050505020ffffffff50ffffffffff5050ffff50ffffffffffffffffff5050 % ffffffffff50ffffff50ffff5050ffff5050ff50ffffffffffff5050ffffffffffffffffffffffff % ffffffffffffff2020505050505050509b2962a9 % 2962a92050505050505050505020ffffffffffffffffffff50ffffff50ffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff2020505050505050509b2962a9 % 2962a920505050505050505050202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020505050505050509b2962a9 % 2962a9205050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b20505050505050509b2962a9 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 2962a92050505050505050505050505050505050505050ff50505050505050505050505050505050 % 50ff50505050505050505050505050505050ff509b5050505050ff505050ff505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a9205050505050505050505050505050505050ff50ff50ffff5050ffff50ffff505050ffff50 % 50ff5050ff50505050505050505050ff5050ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a92050505050505050505050505050505050505050ff5050505050505050ff50505050505050 % 50ff505050ff50505050ff50ff505050ff50ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050ffff50505050ff505050ff50505050505050 % 50ff505050ff50505050ff50ff505050ff50ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a92050505050505050505050505050505050505050ff50ffff50ff50ff50ff50505050ffff50 % 50ff50ff50ff50505050505050505050ff50ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050ff509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050ff50505050505050ffff509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b20202020202020202020202020202020202020 % 202020202020202020205050505050509b2962a9 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 2929622050505050505050505050505050505050505050505050ffffffff50505050505050505050 % 505050ff505050505050ffff50505050ffffff509b50505050ff5050ffff5050ffff505050505050 % 505050505050505050205050505050509b296262 % 2929622050505050505050505050505050505050505050505050ff50505050505050505050505050 % 50505050505050505050ff50505050505050ff509b50505050ff50505050ff505050505050505050 % 505050505050505050205050505050509b296262 % 2929622050505050505050505050505050505050505050505050ff505050ff50ff50ff505050ff50 % ff5050ff50ff50ff5050ff50505050505050ff509b50505050ff50505050ff505050505050505050 % 505050505050505050205050505050509b296262 % 2929622050505050505050505050505050505050505050505050ff50505050ffff50ff505050ff50 % 505050ff505050ff5050ff50ff50ff505050ff509b50505050ff50505050ff505050505050505050 % 505050505050505050205050505050509b296262 % 2929622050505050505050505050505050505050505050505050ff505050ff505050ff505050ff50 % 505050ff505050ff5050ff50505050505050ff509b50505050ff50505050ff505050505050505050 % 505050505050505050205050505050509b296262 % 2929622050505050505050505050505050505050505050505050ff50505050ff50ffff50505050ff % ff5050ff5050ff505050ff5050ff50505050ff509b50505050ff5050ffff5050ffff505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050ff50505050505050ff509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b20202020202020202020202020202020202020 % 202020202020202020205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050ffffff5050ff % 5050ff505050ff5050ff50505050505050ffff509b5050505050ff50ffff50505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050ff5050505050505050ff509b50505050ffff505050ff505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50ff50ff50ff505050ffff5050ff50505050ff509b505050ff50ff505050ff505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50ff50ff50ff505050ff50505050ff50ff50ff509b5050505050ff505050ff505050505050505050 % 505050505050505050205050505050509b2962a9 % 2929622050505050505050505050505050505050505050505050505050505050505050505050ff50 % ff505050ff50505050ff50ffff5050505050ff509b5050505050ff505050ff505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050ff5050505050505050ff509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050ff50505050505050ffff509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b20202020202020202020202020202020202020 % 202020202020202020205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b5050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 2962a920505050505050ffffff505050505050505050505050505050ff5050505050505050505050 % 5050505050ff5050505050ff50505050ffffff509b505050ffff5050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050ff5050505050505050505050 % 505050ff50ff50505050505050505050ff50ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a9205050505050505050505050ff50ff50ff50ff50ff50505050ff505050ff50ff50ff5050ff % 50ff50ff50ff50ff50505050ff5050ffff50ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a92050505050505050505050505050ff505050ffffff50505050ff505050ffffff50505050ff % 505050ff50ff50505050505050505050ff50ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a92050505050505050505050505050ff5050505050ff50505050ff50505050505050505050ff % 505050ff50ff50505050505050ffff50ff50ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a92050505050505050505050ffff5050ffff50ffffff50505050ffffff50ffff505050505050 % ff505050ffff50505050505050505050ff50ff509b505050ffff5050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a9205050505050505050505050505050505050505050505050505050505050505050505050ff % 50ff50505050505050505050505050505050ff509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b20202020202020202020202020202020202020 % 202020202020202020205050505050509b2962a9 % 29296250505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b205050505050509b296262 % 29296250505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050505050ff505050505050505050505050505050ff5050ff50505050505050 % 505050505050505050ff50505050505050ffff509b505050ffff5050505050505050505050505050 % 505050505050505050205050505050509b296262 % 2929625050505050505050505050505050505050505050505050505050505050ff50505050505050 % 505050505050505050ff5050505050505050ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050505050ffff50ff50ff50ff50ff50ff5050ff50505050ff50ff50ff5050ff % 50ff50ff50ff505050ffff5050ffff50ff50ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050505050ffff505050ffffff5050ff505050ff50505050ff505050ff50ff50 % 50ffffff5050505050ff50505050ff505050ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050505050ffff505050ff5050505050ff50505050505050ff505050ff5050ff % 505050505050505050ff50ffff50ff505050ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050ffffffffff50505050ffff5050ff5050505050ff5050ff50ffff5050ff50 % 50ffff505050505050ff5050505050ffff50ff509b505050ffff5050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050ff5050505050505050ff509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 2962a950505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a950505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b20202020202020202020202020202020202020 % 202020202020202020205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a9205050505050505050505050505050505050505050505050505050ff50ff50505050505050 % 50505050505050505050ff50505050ff505050505050505050505050ff5050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050ffffff50ffff % 5050ffff5050ffff5050ffff5050ffff50ffff5050ff505050ffff50ff5050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050ff5050ff5050505050 % ff50505050ff50505050ff50505050ff505050ff50505050ff505050ff5050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050ff505050ff50 % ff50505050ff50505050ff50ffff50ff505050ff50505050ff505050ff5050505050505050505050 % 505050505050505050505050505050509b2962a9 % 29296220505050505050505050505050505050505050505050505050505050ff5050ffffff50ffff % ff50ffff5050ffff5050ff50505050ff50ffff5050ff505050ffff50ff5050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020209b5050505050505050509b296262 % 29296220505050505050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b5050505050505050509b296262 % 2929622050505050505050505020ffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffff9b5050505050505050509b296262 % 2929622050505050505050505020ffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffff9b5050505050505050509b296262 % 2929622050505050505050505020ffffffff50ff50ffffffffffffffff50ffff50ffff505050ff50 % ffffff5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffff9b5050505050505050509b296262 % 2929622050505050505050505020ffffffffffffffff50ff50ffffffffffffffffffff50ffffff50 % ffffffffff50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffff9b5050505050505050509b296262 % 2929622050505050505050505020ffffffffffffffff50ff50ffffffffff5050ffffff50ffffff50 % ffffff50ff50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffff9b5050505050505050509b296262 % 2929622050505050505050505020ffffffffffffffffffffffffffffffffffffffffff50ffffff50 % ff50ff50ff50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffff9b5050505050505050509b296262 % 2929622050505050505050505020ffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffff9b5050505050505050509b296262 % 2962a920505050505050505050205050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a9205050505050505050502050ff50505050505050505050ff505050ffffff50505050505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a92050505050505050505020505050505050505050505050ff50505050505050505050505050 % 505050505050505050ff505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a92050505050505050505020505050ff50ff5050ff50ff50ff5050505050ff50ff5050ffff50 % ff50ff50ff50ff50ffff505050505050ff50ff505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a920505050505050505050205050505050505050ff505050ff50505050505050ff5050505050 % ff50ffffff50505050ff5050ff50ff50ffffff505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a920505050505050505050205050505050505050ff505050ff50505050505050ff5050505050 % ff50505050505050ffff505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a920505050505050505050205050505050505050ffffff50ff50505050505050ff5050ffff50 % ff50ffff5050ffff5050505050ff5050ffff50505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a920505050505050505050205050505050505050ff505050ff50505050505050505050505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a920505050505050505050205050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a9205050505050505050502050ff505050505050505050ff5050505050ff5050505050505050 % 5050ff50505050505050505050505050505050ff5050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a920505050505050505050205050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050ff5050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a92050505050505050505020505050ff50ff5050ff50ff50505050ff50505050ff50ff50ff50 % ff505050ff50ff50ff50ff50ff5050ff50ff50ff5050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 29296220505050505050505050205050505050505050ff505050505050ff50505050ff5050505050 % ff5050505050ff5050505050505050ff505050ff5050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b296262 % a9a96220505050505050505050205050505050505050ff50ff5050505050ff50ff50ff50ff505050 % ff505050ff50ff5050505050505050ff50ff50ff5050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b296262 % 29296220505050505050505050205050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b292929 % 292962205050505050505050502050ff505050505050505050ff5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b296262 % 29296220505050505050505050205050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b296262 % 29296220505050505050505050205050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b296262 % 29296220505050505050505050205050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b296262 % 29296220505050505050505050202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020209b5050505050505050509b296262 % 29296220505050505050505050202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020205050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a9209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b2962a9 % 2962a929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292962a9 % 2962626262626262626262626262a962626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262622962626262626262626262626262a9 % 2962a9a9a9a9a9a9a9a9a9a9a9a9a92962626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262 % 62626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9 % a9a9a9a9a929626262626262626262626262a9a9 % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffff %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice /pop load def %%EndProlog %%Page 1 1 /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 210 string def gsave 255.6 237.24 translate 100.8 287.52 scale 210 599 8 [ 210 0 0 -599 0 599 ] { picstr readstring } image 8000ae000000e3d6019d5680d6f0d6019d56e2d6019d007f00d6d69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69d51d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6d69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d56000300d69dd6 e59d0256d6d6809df19d0256d6d6e59d02569d000200d6d6e49d0156d680 9df09d0156d6e39d0156007f00d69dd69d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d56519d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569dd69d569d007f00d6d69d9d9d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d51569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569dd69d9d9d56000600d69dd69d569d8000bc0006d69d d69d569d000700d6d69d9d9d560080d6bed60700d6d69d9d9d56007f00d6 9dd69d569d00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd6519dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9dd6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd600d69dd69d569d0008 00d6d69d9d9d5600d6ea9d0156d6899d0256d6d6ea9d0156d6ea9d085600 d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6d68b9d025656d6 e99d0556d6d69d9d9df200fc9d085600d69dd69d569d000800d6d69d9d9d 5600d6eb9d025656d6ee9dfc009f9d0256d6d6eb9d025656d6fc9d0000f4 9d0d009d9d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d02 56d6d6f19dfd00039d9d0000a19d025656d6e99d0656d6d69d9d9d00f49d 0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656 d6f19d010000fc9d010000a09d0256d6d6eb9d025656d6fc9d0000f49d0d 00009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6 d6f39d010000f69dfc00fd9d0800009d00009d000000fc9dfc00fd9d0600 009d00009d9dfc00fc9dfc00d29d025656d6e99d0656d6d69d9d9d00f49d 0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656 d6f29d010000f79d1b00009d9d00009d9d0000009d0000009d00009d9d00 009d9d00009d9dfb000e9d00009d9d00009d9d00009d9d0000d29d0256d6 d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00 d69dd69d569d00d6d69d9df000fd9d0256d6d6f49d010000f29d1900009d 9d00009d9d00009d9d00009d00009d9d9d00009d9d0000f89d0500009d9d 0000cf9d025656d6f89dfc00f59d0656d6d69d9d9d00f49d0d00009d9d9d 5600d69dd69d569d000c00d6d69d9d9d5600d69d9d9d00f29d05009d9d56 56d6f39d010000f69dfb000d9d9d00009d9d00009d9d00009d9dfa00039d 9d0000fb9dfb00fc9dfd00d09d0256d6d6f99d04009d9d0000f79d025656 d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000c00d69dd69d569d 00d6d69d9d00f29d0600009d9d56d6d6f49d010000f79d1400009d9d0000 9d9d00009d9d00009d9d00009d0000f99d010000fc9d0500009d9d0000fa 9d010000d29d025656d6f89d04009d9d0000f69d0656d6d69d9d9d00f49d 0d00009d9d9d5600d69dd69d569d000b00d6d69d9d9d5600d69d9d9def00 039d5656d6f39d010000fb9d1800009d00009d9d9d00009d9d00009d9d00 009d9d00009d0000f99d1300009d9d9d00009d9d9d00009d00009d9d9d00 00d19d0256d6d6f99dfb00f79d025656d6fc9d0000f49d0d00009d9d5656 00d6d69d9d9d56000900d69dd69d569d00d6d6fc9df100049d9d56d6d6f3 9d2600009d9d0000009d9d00009d9d00009d9d00009d9d00009d9d00009d 9d00009d9d00009d9d0000fc9d0d00009d9d00009d9d00009d9d0000d19d 025656d6f79dfc00f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69d d69d569d000800d6d69d9d9d5600d6eb9d025656d6f19dfc00fb9dfd0010 9d00009d00009d9d00009d9d00009d9d9dfc00fd9d010000fb9dfd00049d 00009d9dfc00cf9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d56 5600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6d68b9d0256 56d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d0008 00d6d69d9d9d5600d6eb9d025656d6899d0256d6d6eb9d025656d6fc9d00 00f49d0d00009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb 9d0256d6d68b9d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d56 00d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6899d0256d6d6 eb9d025656d6fc9df1000b9d9d565600d6d69d9d9d56000900d69dd69d56 9d00d6d6eb9d0256d6d68b9d025656d6e99d0256d6d6fb9df300fd9d0856 00d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6899d0256d6d6 eb9d025656d6eb9d09565600d6d69d9d9d56007f00d69dd69d569d00d69d 9d569d569d569d569d569d569d569d569d569d569d56d6569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d56519d 569d569d569d569d569d569d569d569d569d569d569d5656d69d569d569d 569d569d569d569d569d569d569d569d569d56d6569d569d569d569d569d 569d569d569d569d569d569d5600d69dd69d569d0008009d569d9d9d5600 9de956009d8856009de856009de9560700d6d69d569d56000000fb56009d 8000bc0001d69dfc56ff000000fcd6029d565680dfbedf0000fad6ff0007 00d6d6d69d569d5680dfbfdf036400d69dfcd6ff000900d6d69d9d9d5656 dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af c2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69d d69d569d000900d6d69d9d9d5656dfdf80aff4afd2dffcaf09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80aff4afd3df0064fcaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdf80aff4af01dfdfd6af016464 fcaf09646400d6d69d9d9d56000900d69dd69d569d56dfdf80aff4af01df dfd6af016464fcaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf 80aff4af01dfdfd6af016464fcaf09646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80aff4af01dfdfd6af016464fcaf09646400d69dd69d569d 000900d6d69d9d9d5656dfdf80aff4af01dfdfd6af016464fcaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80aff4af01dfdfd6af016464 fcaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf80aff4af01df dffbaffb00e0af016464fcaf09646400d6d69d9d9d56000900d69dd69d56 9d56dfdf80aff4af01dfdffbaf0000fcaf010000e2af016464fcaf096464 00d69dd69d569d000900d6d69d9d9d5656dfdfbbaffd00bcaf01dfdffbaf 0000fbaf0000e2af016464fcaf09646400d6d69d9d9d56000900d69dd69d 569d56dfdfbdaf060000afafaf0000beaf01dfdffbaf0000faaf0300afaf affc00fdaf0400af000000fcaffc00faaf016464fcaf09646400d69dd69d 569d000900d6d69d9d9d5656dfdfbdaf0000fbaf0000beaf01dfdffbaf00 00faaf1800afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000fb af016464fcaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfbeaf 0000f6affc00fdaf0700af0000afaf0000fcaffc00fdaf0500af0000afaf fc00e5af01dfdffbaf0000faaf0300afaf00fcaf0300afaf00fcaf0300af af00fcaf0000fbaf016464fcaf09646400d69dd69d569d000900d6d69d9d 9d5656dfdfbeaf0000f7af250000afaf0000afaf0000afaf0000afaf00af af0000afaf0000afaf0000afafaf0000afaf0000e6af01dfdffbaf0000fa af0300afaf00fcaf0300afaf00fcaf0200afaffa00fbaf016464fcaf0964 6400d6d69d9d9d56000900d69dd69d569d56dfdfbeaf0000f2af0e00afaf 00afafaf00afafaf00afaf00fcaf0300afaf00f7af0000e6af01dfdffbaf 0000faaf0300afaf00fcaf0300afaf00fcaf0300afaf00f6af016464fcaf 09646400d69dd69d569d000900d6d69d9d9d5656dfdfbeaf0000f6affb00 0cafaf00afafaf00afafaf00afaffa0002afaf00fbaffb00e6af01dfdffb af0000fbaf0400afafaf00fcaf0300afaf00fcaf0300afaf00f6af016464 fcaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfbeaf0000f7af 130000afafaf00afaf00afafaf00afafaf00afaf00f9af0000fcaf050000 afafaf00e6af01dfdffbaf0000fcaf0d0000afafaf0000afaf0000afaf00 fcaf0800afaf0000afaf0000fbaf016464fcaf09646400d69dd69d569d00 0900d6d69d9d9d5656dfdfbdaf0000fbaf0300afaf00fcaf0e00afaf00af afaf00afafaf00afaf00f9af0000fcaf0000fcaf0000e6af01dfdffbaffb 00faaffc00fdaf0000fcaf0300afafaffc00faaf016464fcaf09646400d6 d69d9d9d56000900d69dd69d569d56dfdfbdaf240000afafaf0000afaf00 00afaf0000afaf00afafaf00afafaf00afaf0000afaf0000afaf00fcaf05 0000afaf0000e6af01dfdfd6af016464fcaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfbbaffd00fbaffd000faf0000af00afafaf00afaf af00afafaffc00fdaf0000fbaffd0002af0000e7af01dfdfd6af016464fc af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80aff4af01dfdf d6af016464fcaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf80 aff4af01dfdfd6af016464fcaf09646400d6d69d9d9d56000900d69dd69d 569d56dfdf80aff4af01dfdfd6af016464fcaf09646400d69dd69d569d00 0900d6d69d9d9d5656dfdf80aff4af01dfdfd6af016464fcaf09646400d6 d69d9d9d56000900d69dd69d569d56dfdf80aff4af01dfdfd6af016464fc af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80aff4af01dfdf d464fcaf09646400d6d69d9d9d56000900d69dd69d569d56dfdf80aff4af 00dfd364fcaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf80af c2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d 000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000b00d6 9dd69d569d56dfdfafaf80dfcadffaaf09646400d69dd69d569d000b00d6 d69d9d9d5656dfdfafaf80dfcbdf0064faaf09646400d6d69d9d9d56000d 00d69dd69d569d56dfdfafafdfdf80afceaf016464faaf09646400d69dd6 9d569d000d00d6d69d9d9d5656dfdfafafdfdf80afceaf016464faaf0964 6400d6d69d9d9d56000d00d69dd69d569d56dfdfafafdfdf80afceaf0164 64faaf09646400d69dd69d569d000d00d6d69d9d9d5656dfdfafafdfdf80 afceaf016464faaf09646400d6d69d9d9d56000d00d69dd69d569d56dfdf afafdfdf80afceaf016464faaf09646400d69dd69d569d000d00d6d69d9d 9d5656dfdfafafdfdf80afceaf016464faaf09646400d6d69d9d9d56000d 00d69dd69d569d56dfdfafafdfdfeeaffa00eeaf0000d1af0000f7affd00 f4af0000edaffd00fcaffd00fcaffa0004afaf000000eeaf016464faaf09 646400d69dd69d569d000d00d6d69d9d9d5656dfdfafafdfdfeeaf0000fc af010000efaf0000d1af0000f9af060000afafaf0000f6af0000edaf0000 fcaf090000afafaf0000afaf00fcaf050000afafaf00eeaf016464faaf09 646400d6d69d9d9d56000d00d69dd69d569d56dfdfafafdfdfeeaf0000fb af0000efaf0000d1af0000f9af0000fbaf0000f6af0000edaf0000fcaf00 00fbaf0300afaf00fbaf0400afafaf00eeaf016464faaf09646400d69dd6 9d569d000d00d6d69d9d9d5656dfdfafafdfdfeeaf0000fbaf0300afafaf fc00fcaffc0016afaf00afafaf00afafaf000000af00afaf00af0000afaf fc00fdaf0000fcaf0600af00af000000fcaffd0001af00faaf0000f6affc 00fdaf0300afafaffc00fdaf0300af0000fbaf0400afafaf00f7af0000fb af0400afafaf00eeaf016464faaf09646400d6d69d9d9d56000d00d69dd6 9d569d56dfdfafafdfdfeeaf0000fcaf2f00afafaf0000afaf0000afaf00 00afaf0000af00afaf00afafaf0000afaf0000afaf0000afafaf0000afaf 0000afaf00fcaf0f00af0000afaf0000afaf0000afaf0000faaf0000f7af 140000afaf0000afaf00afaf0000afaf0000afaf0000f9af0400afafaf00 f7af0000fcaf0000fcaf0000eeaf016464faaf09646400d69dd69d569d00 0d00d6d69d9d9d5656dfdfafafdfdfeeaffb00f7af0300afaf00faaf0200 af00fcaf0000fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf0200af00 fcaf0300afaf00fcaf0000faaf0000f7af0000fcaf0600afaf00afaf00fc af0300afaf00f8af0400afafaf00f7affb00fbaf0000eeaf016464faaf09 646400d6d69d9d9d56000d00d69dd69d569d56dfdfafafdfdfeeaf0000fc af0000fcaffb0002afaf00faaf010000fbaf0000fcaf0300afaf00fcaf00 00fcaf0300afaf00fcaf0200af00fcaf0300afaf00fcaf0000faaf0000f7 af0000fcaf0600afaf00afaf00fcaf0300afaf00f8af0400afafaf00f7af 0000fcaf0000fcaf0000eeaf016464faaf09646400d69dd69d569d000d00 d6d69d9d9d5656dfdfafafdfdfeeaf0000fbaf0b00afaf0000afafaf00af af00faaf0200af00fcaf0000fcaf0300afaf00fcaf0000fcaf0300afaf00 fcaf0200af00fcaf0300afaf00fcaf0000faaf0000f7af0000fcaf0600af af00afaf00fcaf0300afaf00f8af0400afafaf00f7af0000fbaf0400afaf af00eeaf016464faaf09646400d6d69d9d9d56000d00d69dd69d569d56df dfafafdfdfeeaf0000fbaf0300afaf00fcaf0300afaf00fcaf0900af00af af00afafaf00fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf0200af00 fcaf0300afaf00fcaf0000f9af0000fbaf0300afaf00fcaf0600afaf00af af00fcaf0300afaf00f8af0000fcaf0000fbaf0300afaf00fbaf0400afaf af00eeaf016464faaf09646400d69dd69d569d000d00d6d69d9d9d5656df dfafafdfdfeeaf0000fcaf220000afaf0000afaf0000afaf0000afaf0000 af00afafaf00afaf0000afaf0000afaf00fcaf0f0000afaf0000afaf0000 afaf0000af00fcaf0800afaf0000afaf0000f9af1c0000afafaf0000afaf 0000afaf0000afaf00afaf0000afaf0000afaf00f8af0000fcaf090000af afaf0000afaf00fcaf050000afafaf00eeaf016464faaf09646400d6d69d 9d9d56000d00d69dd69d569d56dfdfafafdfdfeeaffa00fcaffd0004af00 00afaffc0002afaf00fcaf0a00afaf000000af00afaf00fbaffc00fcaffd 0003af00af00fcaf0800afafaf000000af00f7affd00fbaffc00fdaf0300 afafaffc00fdaf0000f8af0000faaffd00fcaffa00fcaf0000eeaf016464 faaf09646400d69dd69d569d000d00d6d69d9d9d5656dfdfafafdfdfcaaf 0000b0af0000e9af0000eeaf016464faaf09646400d6d69d9d9d56000d00 d69dd69d569d56dfdfafafdfdfcfaf050000afaf0000b0af0000e9af0000 eeaf016464faaf09646400d69dd69d569d000d00d6d69d9d9d5656dfdfaf afdfdfceaffc00afaffd00edaffd00eeaf016464faaf09646400d6d69d9d 9d56000d00d69dd69d569d56dfdfafafdfdf80afceaf016464faaf096464 00d69dd69d569d000d00d6d69d9d9d5656dfdfafafdfdf80afceaf016464 faaf09646400d6d69d9d9d56000d00d69dd69d569d56dfdfafafdfdf80af ceaf016464faaf09646400d69dd69d569d000d00d6d69d9d9d5656dfdfaf afdfdf80afceaf016464faaf09646400d6d69d9d9d56000d00d69dd69d56 9d56dfdfafafdfdf8064cc64faaf09646400d69dd69d569d000c00d6d69d 9d9d5656dfdfafafdf8064cb64faaf09646400d6d69d9d9d56000900d69d d69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80 afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d 56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900 d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d 569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656df df80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2 af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af096464 00d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d 56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80 afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09 646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6 d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d56 9d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900 d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d 9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56df df80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2 af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af096464 00d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d 9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69d d69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80 afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d 56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900 d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d 569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656df df80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2 af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af096464 00d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdffbaff3df80afd4af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdffbaff4df0064f9affd00f2affd00f8affd00fc af0000eeaf0000edaffa00f5af050000afaf0000f2af0000cbaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af 0000eeaf0000faaf090000afafaf0000afaf00eeaf0000edaf0000fcaf01 0000f7af0400afafaf00f0af0000cbaf09646400d69dd69d569d000900d6 d69d9d9d5656dfdffbaf01dfdff7af016464f9af0000eeaf0000faaf0000 fbaf0000ebaf0000edaf0000fbaf0000f7af0400afafaf00baaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af 0300afaf00fbaf0500afaf000000fcaf0000faaf0000f8af0700afaf00af 000000fcaffd0007af00afaf00afafaffc00f4af0000fbaf0300afaf00fc affc0006af000000afafaffc00fdaf0c00af0000af00afaf00af000000fc affd0001af00dbaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf fbaf01dfdff7af016464f9af0300afaf00fbaf0a00af00afafaf00afafaf 00f9af010000faaf1b00afaf0000afaf0000afaf0000afaf0000afaf00af af0000afaf0000f5af0000fcaf0400afafaf00fcaf2700af00afafaf00af afaf0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf0000afaf 0000dbaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf01df dff7af016464f9af0c00afafaf00afafaf00afaf0000faaf0000f7af0100 00fcaf0300afaf00fcaf0300afaf00fcaf0600afaf00afaf00fcaf0000f5 affb00fcaf0000fcaf0a00af00afafaf00afafaf00fcaf0300afaf00fcaf 0300afaf00fcaf0300afaf00fcaf0000dbaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdffbaf01dfdff7af016464f9af0e00afafaf00afaf af00afafaf000000fcaf0000f5af070000afaf00afaf00fcaf0300afaf00 fcaf0500afaf00afaffa0001afaff90002afaf00fcaf0400afafaf00fcaf 0900af00afafaf00afafaffa0002afaf00fcaf0300afaf00fcaf0300afaf 00fcaf0000dbaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffb af01dfdff7af016464f9af0800afafaf00afafaf00fbaf050000afafaf00 f4af0600afaf00afaf00fcaf0300afaf00fcaf0600afaf00afaf00f0af00 00fbaf0300afaf00fcaf0a00af00afafaf00afafaf00f9af0000fcaf0300 afaf00fcaf0300afaf00fcaf0000dbaf09646400d69dd69d569d000900d6 d69d9d9d5656dfdffbaf01dfdff7af016464f9af0000fcaf0200af00f9af 0400afafaf00faaf0000fbaf0600afaf00afaf00fcaf0300afaf00fcaf06 00afaf00afaf00f0af0000fbaf0300afaf00fcaf0a00af00afafaf00afaf af00f9af0000fcaf0300afaf00fcaf0300afaf00fcaf0000dbaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af 0000fcaf0e00af00afafaf00afafaf00afafaf00faaf0c0000afafaf0000 afaf00afaf00fcaf1300afaf0000afaf0000afaf00afaf0000afaf0000f5 af0000fcaf1b0000afaf0000afaf0000af00afafaf00afafaf0000afaf00 00afaf00fcaf0300afaf00fcaf0800afaf0000afaf0000dbaf09646400d6 9dd69d569d000900d6d69d9d9d5656dfdffbaf01dfdff564f9af0000fbaf 0000fbaffd00fcaf0000f8affd00fcaf0300afaf00fcaf0e00afafaf0000 00af00afaf00afafaffc00f4affa00fcaffd0007af00af00afafaf00fcaf fc00fdaf0000fcaf0300afaf00fcaf0800afafaf000000af00dbaf096464 00d6d69d9d9d56000900d69dd69d569d56dfdffbaf00dff464f9af0000ee af0000e1af0000b5af0000dbaf09646400d69dd69d569d000900d6d69d9d 9d5656dfdfe7af0000eeaf0000e6af050000afaf0000baaf050000afaf00 00dbaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfe7affd00f2 affd00e5affc00b8affc00daaf09646400d69dd69d569d000900d6d69d9d 9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56df df80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2 af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af096464 00d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d 9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69d d69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d56 56dfdffbaff3df80afd4af09646400d6d69d9d9d56000900d69dd69d569d 56dfdffbaff4df0064f9affd00f1affd00f8affd00f3af010000d6affd00 fcaf0000ecaf0300afaf00d4af09646400d69dd69d569d000900d6d69d9d 9d5656dfdffbaf01dfdff7af016464f9af0000edaf0000faaf060000afaf af0000f6af0400afafaf00daaf090000afafaf0000afaf00ecaf0300afaf 00d4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdf f7af016464f9af0000edaf0000faaf0000fbaf0000f6af0400afafaf00da af0000fbaf0300afaf00ecaf0000d1af09646400d69dd69d569d000900d6 d69d9d9d5656dfdffbaf01dfdff7af016464f9af0300afaf00fbaf0000f6 af0000faaf0000f7affc0015afaf000000af000000af00afafaf00afafaf 00afafaffc00fdaf0500af0000afaffc00f9af0000f8af0400af000000fc affc00fcaffd000baf00afaf00afaf00af000000fcaffd0001af00e4af09 646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af0164 64f9af0300afaf00fbaf0000f6af0000f9af010000faaf2c0000afaf0000 afaf00afafaf00afaf00afafaf00afafaf00afaf0000afaf0000afaf0000 afafaf0000afaf0000f9af010000faaf280000afaf0000afaf0000afaf00 00afaf0000afaf0000afaf00afaf0000afaf0000afaf0000afaf0000e4af 09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01dfdff7af01 6464f9af1400afafaf00afafaf00afafaf0000afaf00afafaf00f7af0100 00fcaf0000fcaf1200afaf00afafaf00afaf00afafaf00afafaf00f9af03 00afaf00fcaf0000fcaf0000f7af010000fcaf0000fcaf0000f9af0300af af00fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000e4af09646400d6 d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af14 00afafaf00afafaf00afaf00af0000af00afafaf00f5af040000afaf00fc af1100afaf00afafaf00afafaf00afaf00afaf00fcaffb0002afaf00fcaf fa00f5af040000afaf00fcaf0300afafaffb0002afaf00fcaf0600afaf00 afaf00fcaf0300afaf00fcaf0000e4af09646400d69dd69d569d000900d6 d69d9d9d5656dfdffbaf01dfdff7af016464f9af0f00afafaf00afafaf00 afaf00afaf0000fcaf0000f4af0300afaf00fcaf1d00afaf00afafaf00af afaf00afaf00afaf00afafaf0000afafaf00afaf00fcaf0000efaf0300af af00fcaf0b00afaf0000afafaf00afaf00fcaf0600afaf00afaf00fcaf03 00afaf00fcaf0000e4af09646400d6d69d9d9d56000900d69dd69d569d56 dfdffbaf01dfdff7af016464f9af0000fcaf0200af00f4af0000faaf0000 fbaf0300afaf00fcaf1500afaf00afafaf00afafaf00af00af00af00afaf af00fcaf0300afaf00fcaf0000f5af0000fbaf0300afaf00fcaf0300afaf 00fcaf0300afaf00fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000e4 af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01dfdff7af 016464f9af0000fcaf0200af00f4af0000faaf150000afafaf0000afaf00 00afaf0000afaf00afafaf00fcaf0400afafaf00fcaf080000afaf0000af af00fcaf050000afaf0000faaf090000afafaf0000afaf00fcaf1600afaf 0000afaf0000afaf0000afaf0000afaf00afaf00fcaf0800afaf0000afaf 0000e4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf01df dff564f9af0000fbaf0000f3af0000f8affd00fbaffc00fdaf0000fcaf08 0000afaf00afafaf00fbaffd0004af0000af00fbaffc00f7affd00fcaf00 00fcaf1600afafaf000000af0000afaf000000af00afaf00afaf00fcaf08 00afafaf000000af00e4af09646400d69dd69d569d000900d6d69d9d9d56 56dfdffbaf00dff464f9af0000edaf00008daf0000e4af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfe7af0000edaf000092af050000afaf 0000e4af09646400d69dd69d569d000900d6d69d9d9d5656dfdfe7affd00 f1affd0091affc00e3af09646400d6d69d9d9d56000900d69dd69d569d56 dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80af c2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d 000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d 5656dfdffbaff36480afd4af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdffbaff46400dff9affd00f8affb00fcaffd00fbaff700e4affd00 efaffb00fbaf0000faaf0000ecaf0000d7af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdffbaf016464f7e201dfdff9af0000f6af0000fcaf 010000fcaf0000f7af0000e2af060000afafaf0000f1af0000fcaf0c0000 afafaf00afaf00afafaf00ecaf0000d7af09646400d6d69d9d9d56000900 d69dd69d569d56dfdffbaf016464f7e201dfdff9af0000f6af0000fbaf00 00fcaf0000f7af0000e2af0000fbaf0000f1af0000fbaf0000faaf0400af afaf00c2af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01 6464f7e201dfdff9af0300afaf00fbaf0200af00faaf0400afafaf00f7af 0000fbaf0000fcaf0b00af00af0000af00af000000f9af0000f9af0700af af00af000000f9af0000faaf0e00afaf00af000000afaf00af000000fcaf fc00fdaf0c00af0000af00afaf00af000000fcaffd0001af00e7af096464 00d6d69d9d9d56000900d69dd69d569d56dfdffbaf016464f7e201dfdff9 af0300afaf00fbaf0200af00faaf0400afafaf00f7af0000fbaf0000fcaf 0c00af0000afafaf0000afaf0000faaf0000f9af0800afaf0000afaf0000 faaf0000faaf2f00afaf00afaf00afafaf0000afaf0000afaf0000afaf00 00afaf0000afafaf00afaf0000afaf0000afaf0000afaf0000e7af096464 00d69dd69d569d000900d6d69d9d9d5656dfdffbaf016464f7e201dfdff9 af0b00afafaf00afafaf00afaf00faaf0400afafaf00f7af0000fbaf0000 fcaf0200af00fcaf0000fcaf0000faaf0000f9af0300afaf00fcaf0000fa af0000faaf0a00afaf00afaf00afafaf00fcaf0300afaf00fcaf0300afaf 00fcaf0300afaf00fcaf0300afaf00fcaf0000e7af09646400d6d69d9d9d 56000900d69dd69d569d56dfdffbaf016464f7e201dfdff9af0b00afafaf 00afafaf00afaf00faaf0400afafaf00f7af0000fbaf0000fcaf0200af00 fcaf0000fcaf0000faaf0000f9af0300afaf00fcaf0000faaf0000faaf0a 00afaf00afaf00afafaf00fcaf0200afaffa0002afaf00fcaf0300afaf00 fcaf0300afaf00fcaf0000e7af09646400d69dd69d569d000900d6d69d9d 9d5656dfdffbaf016464f7e201dfdff9af0b00afafaf00afafaf00afaf00 faaf0400afafaf00f7af0000fbaf0000fcaf0200af00fcaf0000fcaf0000 faaf0000f9af0300afaf00fcaf0000faaf0000faaf0a00afaf00afaf00af afaf00fcaf0300afaf00f9af0000fcaf0300afaf00fcaf0300afaf00fcaf 0000e7af09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf0164 64f7e201dfdff9af0000fcaf0600af00afafaf00fbaf0000fcaf0000f7af 0000fbaf0000fcaf0200af00fcaf0000fcaf0000f9af0000fbaf0400afaf af00fcaf0000faaf0000fbaf0b00afafaf00afaf00afafaf00fcaf0300af af00f9af0000fcaf0300afaf00fcaf0300afaf00fcaf0000e7af09646400 d69dd69d569d000900d6d69d9d9d5656dfdffbaf016464f7e201dfdff9af 0000fcaf0600af00afafaf00fcaf010000fcaf0000f7af0000fbaf070000 afaf0000af00fcaf0000fcaf0000f9af0a0000afafaf0000afafaf00fcaf 0000faaf0000fcaf0c0000afafaf00afaf00afafaf00fcaf0b00afaf0000 afaf0000afaf00fcaf0300afaf00fcaf0800afaf0000afaf0000e7af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdffbaf016464f5dff9af00 00fbaf0000fcaffb00faaf0000f7af0000faaffd0003af00af00fcaf0000 fcaf0000f7affd00fbaf0000fcaf0000faaffb00fbaf0700afafaf0000af 00fcaf0300afafaffc00fdaf0000fcaf0300afaf00fcaf0800afafaf0000 00af00e7af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf00 64f4dff9af0000ebaf00008caf0000e7af09646400d6d69d9d9d56000900 d69dd69d569d56dfdfe7af0000ebaf000091af050000afaf0000e7af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdfe7affd00efaffd0090af fc00e6af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af 09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d 569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d560009 00d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d 9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56 dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf f3df80afd4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf f4df0064f9affd00f3af0400af000000faaffb00ddaffd00f7af0000e5af fd00c9af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01df dff7af016464f9af0000f1af0400afafaf00faaf0000fcaf010000e1af0e 0000afafaf0000afafaf00afafaf00e7af060000afafaf0000cbaf096464 00d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9 af0000f1af0400afafaf00faaf0000fbaf0000e1af0000fbaf0800afafaf 00afafaf00e7af0000fbaf0000cbaf09646400d69dd69d569d000900d6d6 9d9d9d5656dfdffbaf01dfdff7af016464f9af0300afaf00fbaf0b00afaf 000000af00afafaf00faaf0000faaf0800afaf00af0000afaffc000aafaf 00afafaf00afafaf00faaf0000f9af0b00af000000afaf00af000000fcaf fc00fdaf0300af0000fbaf0000f6affc00fdaf0700af0000afaf0000fcaf fc00fdaf0500af0000afaffc00fcaffd00f9af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdffbaf01dfdff7af016464f9af0300afaf00fbaf 0b00af0000afaf0000afafaf00faaf0000faaf1700afaf0000afafaf0000 afaf0000af00afafaf00afafaf00faaf0000f9af1800afaf00afafaf0000 afaf0000afaf0000afaf0000afaf0000f9af0000f7af2c0000afaf0000af af0000afaf0000afaf00afaf0000afaf0000afaf0000afafaf0000afaf00 00afaf00afafaf00faaf09646400d69dd69d569d000900d6d69d9d9d5656 dfdffbaf01dfdff7af016464f9af0b00afafaf00afafaf00afaf00fcaf04 00afafaf00faaf0000faaf0300afaf00f7af0a00af00afafaf00afafaf00 faaf0000f9af0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00f8 af0000f2af0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f7af 0400afaf0000f7af09646400d6d69d9d9d56000900d69dd69d569d56dfdf fbaf01dfdff7af016464f9af0b00afafaf00afafaf00afaf00fcaf0400af afaf00faaf0000faaf0300afaf00fbaffb0008afaf00afaf00afaf00f9af 0000f9af0700afaf00afafaf00fcaf0200afaffa0002afaf00f8af0000f6 affb000cafaf00afafaf00afafaf00afaffa0002afaf00fbaffb00fdaffd 00f9af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01dfdf f7af016464f9af0b00afafaf00afafaf00afaf00fcaf0400afafaf00faaf 0000faaf0300afaf00fcaf0e0000afafaf00afaf00afaf00afaf00f9af00 00f9af0700afaf00afafaf00fcaf0300afaf00f9af0000f8af0000f7af13 0000afafaf00afaf00afafaf00afafaf00afaf00f9af0000fcaf050000af afaf00fbaf010000faaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdffbaf01dfdff7af016464f9af0000fcaf0600af00afafaf00fcaf0400 afafaf00faaf0000fbaf0400afafaf00fcaf0000fcaf0900afaf00af00af 00af00f8af0000fbaf0800afafaf00afafaf00fcaf0300afaf00f9af0000 f7af0000fbaf0300afaf00fcaf0e00afaf00afafaf00afafaf00afaf00f9 af0000fcaf0000fcaf0000faaf0000faaf09646400d69dd69d569d000900 d6d69d9d9d5656dfdffbaf01dfdff7af016464f9af0000fcaf0f00af00af afaf0000afaf0000afafaf00faaf0000fcaf050000afafaf00fcaf0d0000 afaf0000afafaf00afafaf00f7af0e0000afafaf0000afafaf00afafaf00 fcaf0b00afaf0000afaf0000afaf00f7af240000afafaf0000afaf0000af af0000afaf00afafaf00afafaf00afaf0000afaf0000afaf00fcaf0c0000 afaf0000afaf00afafaf00faaf09646400d6d69d9d9d56000900d69dd69d 569d56dfdffbaf01dfdff564f9af0000fbaf0000fbaffd0005af00afafaf 00faaffb00fbaf0000fbaffd0009af0000afaf00afafaf00f5affd00faaf 030000af00fcaf0300afafaffc00fdaf0000f5affd00fbaffd000faf0000 af00afafaf00afafaf00afafaffc00fdaf0000fbaffd0007af0000afaf00 0000f9af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf00df f464f9af0000edaf000080aff0af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdfe7af0000edaf000080aff0af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfe7affd00f1affd0080aff0af09646400d6d69d9d 9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656 dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af c2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69d d69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56 000900d69dd69d569d56dfdffbaff3df80afd4af09646400d69dd69d569d 000900d6d69d9d9d5656dfdffbaff4df0064f9affd00f7af0400af000000 f6affb00e0af0000faaf0000f6af0000f4affd00f4af0000caaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af 0000f5af0400afafaf00f6af0000fcaf010000e2af0000faaf0000f6af03 00afaf00f9af060000afafaf0000f6af0000caaf09646400d69dd69d569d 000900d6d69d9d9d5656dfdffbaf01dfdff7af016464f9af0000f1af0000 f6af0000fbaf0000e2af0000faaf0000f3af0000f9af0000fbaf0000f6af 0000caaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf01df dff7af016464f9af0000fcaffc00fdaf0400afafaf00f6af0000faaf0800 afaf00af0000afaffc000aafaf00afafaf00afafaf00faaf0000faaf0f00 afaf00af000000afafaf00af000000faaf0000f8af0c00af000000afafaf 00af000000fcaffc00fdaf0500af0000afaffc00e3af09646400d69dd69d 569d000900d6d69d9d9d5656dfdffbaf01dfdff7af016464f9af1000afaf af0000afaf0000afaf00afafaf00f6af0000faaf1700afaf0000afafaf00 00afaf0000af00afafaf00afafaf00faaf0000faaf0e00afaf0000afaf00 00afaf00afaf00f8af010000faaf220000afaf0000afaf0000afaf0000af af0000afaf0000afaf0000afafaf0000afaf0000e4af09646400d6d69d9d 9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af0000f8af 0700afaf00afafaf00f6af0000faaf0300afaf00f7af0a00af00afafaf00 afafaf00faaf0000faaf0300afaf00fcaf0600afaf00afaf00f6af010000 fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000fc af0000e4af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01 dfdff7af016464f9af0000fcaffb0006afaf00afafaf00f6af0000faaf03 00afaf00fbaffb0008afaf00afaf00afaf00f9af0000faaf0300afaf00fc af0600afaf00afaf00f4af040000afaf00fcaf0300afaf00fcaf0200afaf fa0002afaf00fcaffa00e4af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdffbaf01dfdff7af016464f9af1000afafaf0000afafaf00afaf00 afafaf00f6af0000faaf0300afaf00fcaf0e0000afafaf00afaf00afaf00 afaf00f9af0000faaf0300afaf00fcaf0600afaf00afaf00f3af0300afaf 00fcaf0300afaf00fcaf0300afaf00f9af0000fcaf0000dfaf09646400d6 9dd69d569d000900d6d69d9d9d5656dfdffbaf01dfdff7af016464f9af04 00afafaf00fcaf0700afaf00afafaf00f6af0000fbaf0400afafaf00fcaf 0000fcaf0900afaf00af00af00af00f9af0000faaf0300afaf00fcaf0600 afaf00afaf00f9af0000fbaf0300afaf00fcaf0300afaf00fcaf0300afaf 00f9af0000fcaf0000dfaf09646400d6d69d9d9d56000900d69dd69d569d 56dfdffbaf01dfdff7af016464f9af1000afafaf0000afaf0000afaf00af afaf00f6af0000fcaf050000afafaf00fcaf0d0000afaf0000afafaf00af afaf00f7af0000fcaf0400afafaf00fcaf0600afaf00afaf00f9af110000 afafaf0000afaf0000afaf0000afaf00fcaf0b00afaf0000afaf0000afaf 00fcaf050000afaf0000e4af09646400d69dd69d569d000900d6d69d9d9d 5656dfdffbaf01dfdff564f9af0000fcaffd0008af0000af00afafaf00f6 affb00fbaf0000fbaffd0009af0000afaf00afafaf00f6affc00fcaf0000 fcaf0800afaf00afafaf0000f9affd00fcaf0800af000000afafaf00fcaf 0300afafaffc00fdaf0000fbaffc00e3af09646400d6d69d9d9d56000900 d69dd69d569d56dfdffbaf00dff464f9af0000f1af0000abaf0000c2af09 646400d69dd69d569d000900d6d69d9d9d5656dfdfe7af0000f1af0000ab af0000c2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfe7affd 00f5affd00abaf0000c2af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80 afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d 56000900d69dd69d569d56dfdfc1affa00f0af0000ebaf0000aeaf096464 00d69dd69d569d000900d6d69d9d9d5656dfdfc1af0000fcaf010000f1af 0000efaf0400afafaf00aeaf09646400d6d69d9d9d56000900d69dd69d56 9d56dfdfc1af0000fbaf0000dfaf0000aaaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfc1af0000fbaf0800afaf00af0000afaffc00fdaf 0300afafaffc00fcaffc0009af000000afaf00afafaffc00fdaf0400af00 0000bdaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfc1af0000 fcaf370000afaf0000afafaf0000afaf0000afaf00afaf0000afaf0000af af0000afaf0000af00afafaf00afaf0000afaf0000afaf0000afaf0000be af09646400d69dd69d569d000900d6d69d9d9d5656dfdfc1affa00fdaf00 00fcaf0000fcaf0600afaf00afaf00fcaf0300afaf00faaf0700afafaf00 afaf00fcaf0300afaf00fcaf0000beaf09646400d6d69d9d9d56000900d6 9dd69d569d56dfdfc1af0000f8af0000fcaf0000fcaf0500afaf00afaffa 0002afaf00faaf0700afafaf00afaf00fcaf0300afaf00fcaf0000beaf09 646400d69dd69d569d000900d6d69d9d9d5656dfdfc1af0000f8af0000fc af0000fcaf0600afaf00afaf00f9af0000faaf0700afafaf00afaf00fcaf 0300afaf00fcaf0000beaf09646400d6d69d9d9d56000900d69dd69d569d 56dfdfc1af0000f8af0000fcaf0000fcaf0600afaf00afaf00f9af0000fc af0900af00afafaf00afaf00fcaf0300afaf00fcaf0000beaf09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfc1af0000f8af0000fcaf290000 afaf0000afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00af af0000afaf0000afaf00fcaf0000beaf09646400d6d69d9d9d56000900d6 9dd69d569d56dfdfc1af0000f8af0000fbaffc00fdaf0300afafaffc00fc affc00fdaf060000af00afafaffc00fdaf0000fcaf0000beaf09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfabaf000098af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfabaf000098af09646400d69dd69d56 9d000900d6d69d9d9d5656dfdfadaf01000097af09646400d6d69d9d9d56 000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6 d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf 80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af 09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf8064e26400df f2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf006480df e4df0164dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdfef af0164df8064e46400dff2af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdfefaf0164df8064e66402df64dff2af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdfefaf0364df646480afe9af03dfdf64dff2af09 646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0364df646480af e9af03dfdf64dff2af09646400d69dd69d569d000900d6d69d9d9d5656df dfefaf0964df6464af000000afaffc00efaffd00f3affd00f2af0000d4af 0000f9af0000dbaf03dfdf64dff2af09646400d6d69d9d9d56000900d69d d69d569d56dfdfefaf0964df6464af00afafaf00fcaf0000eeaf0000f5af 060000afafaf0000f8af0400afafaf00d4af0000f9af0000dbaf03dfdf64 dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0964df 6464af00afafaf00fcaf0000eeaf0000f5af0000fbaf0000f8af0400afaf af00d4af0000d3af03dfdf64dff2af09646400d6d69d9d9d56000900d69d d69d569d56dfdfefaf0964df6464af00afafaf00fcaf0200af00fbaf0600 af00af000000fcaf0000f6af0000f9af0400afaf00affb0006afaf00af00 0000fcaffc00fcaffd0009af00afaf00af0000afaffc00fdaf1300af0000 00afafaf00af000000afafaf00afafaffc00e2af03dfdf64dff2af096464 00d69dd69d569d000900d6d69d9d9d5656dfdfefaf0964df6464af00afaf af00fcaf0200af00fbaf0b00af0000afaf0000afafaf00f6af0000f9af49 00afaf0000afafaf00afafaf0000afaf0000afaf0000afaf0000afaf0000 afaf0000afaf0000afafaf0000afaf0000afaf0000afaf0000afaf0000af af0000afaf00afaf0000afaf0000e3af03dfdf64dff2af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfefaf0964df6464af00afafaf00fcaf 0a00afaf00afafaf00afaf00fcaf0400afafaf00f6af0000f9af0300afaf 00fcaf0400afafaf00fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00 f7af0300afaf00fcaf0300afaf00fcaf0600afaf00afaf00deaf03dfdf64 dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0964df 6464af00afafaf00fcaf0a00afaf00afafaf00afaf00fcaf0400afafaf00 f6af0000f9af0300afaf00fcaf0400afafaf00fcaf0300afaf00fcaf0300 afaf00fcaf0300afaf00fbaffb0002afaf00fcaf0300afaf00fcaf0600af af00afaf00deaf03dfdf64dff2af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdfefaf0964df6464af00afafaf00fcaf0a00afaf00afafaf00 afaf00fcaf0400afafaf00f6af0000f9af0300afaf00fcaf0400afafaf00 fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00fcaf080000afafaf00 afaf00fcaf0300afaf00fcaf0600afaf00afaf00deaf03dfdf64dff2af09 646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0964df6464af00 afafaf00fcaf0a00afafaf00af00afafaf00fcaf0400afafaf00f5af0000 fbaf0400afafaf00fcaf0400afafaf00fcaf0300afaf00fcaf0300afaf00 fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0600af af00afaf00fcaf0000e3af03dfdf64dff2af09646400d6d69d9d9d560009 00d69dd69d569d56dfdfefaf0964df6464af00afafaf00fcaf1300afafaf 00af00afafaf0000afaf0000afafaf00f5af0a0000afafaf0000afafaf00 fcaf0400afafaf00fcaf1300afaf0000afaf0000afaf0000afaf0000afaf 00fcaf100000afaf0000afaf0000afaf0000afaf00fcaf0b00afaf00afaf 0000afaf0000e3af03dfdf64dff2af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfefaf0564df6464af00fcaffc00fbaf0000fcaf0400af00 0000fcaf0000f3affd00fbaf0000fbaf030000af00fcaf0300afafaffc00 fcaffd0004af00afaf00fbaffd000caf0000af00af000000afafaf00fcaf 0600afaf00afafaffc00e2af03dfdf64dff2af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfefaf0564df6464af00eeaf0000f8af0000cdaf 0000f1af0000cbaf03dfdf64dff2af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfefaf0564df6464af00eeaf0000f8af0000d2af050000af af0000f1af0000cbaf03dfdf64dff2af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdfefaf0764df6464af000000f0af0000faaffd00d1affc 00f0af0000cbaf03dfdf64dff2af09646400d69dd69d569d000900d6d69d 9d9d5656dfdfefaf0364df64648000e90003dfdf64dff2af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdfefaf0364df64648000e90003dfdf 64dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0764 df646400afafaffc0000afee00fdaff600faafce0000afca0003dfdf64df f2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0564df64 6400affc00fdafec0000aff60000affc0001afafd30004af000000afca00 03dfdf64dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdfef af0564df646400affa0000afec0000aff60000affb0000afd30000afc600 03dfdf64dff2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfef af0564df646400affa0004af000000affb0006af00af00afafaffc0000af f60000affb0003af000000fcaffd0010af00afaf0000afafaf000000af00 afafaffc00fcaffc00fcaf0800afafaf0000af00affb0002af0000fcafd8 0003dfdf64dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf efaf0564df646400affa0004af000000affb000baf00afaf0000afaf0000 00aff60000affc0035afaf0000afaf0000afaf0000afaf000000af000000 af0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00af000000 af00affb0007af00afaf0000afafd90003dfdf64dff2af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfefaf0564df646400affa0000affc00 07af000000af0000affc0004af000000aff600faaffd0000affc0003af00 00affc0001afaffb0000affc0003af0000affc0003af0000affa000eaf00 0000af0000af000000af0000affc0000afd90003dfdf64dff2af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfefaf0564df646400affa0000 affc0007af000000af0000affc0004af000000aff60000aff800faaf0200 00affb00fdaffd0000affc0002af0000faaf020000affa000daf000000af 0000af000000af0000faafd90003dfdf64dff2af09646400d6d69d9d9d56 000900d69dd69d569d56dfdfefaf0564df646400affa0000affc0007af00 0000af0000affc0004af000000aff60000aff80000aff90000aff90004af af0000affc0003af0000aff90000affa000eaf000000af0000af000000af 0000afd40003dfdf64dff2af09646400d69dd69d569d000900d6d69d9d9d 5656dfdfefaf0564df646400affa0000affb0006af00af000000affc0004 af000000aff60000aff80000aff90000aff80003af0000affc0003af0000 aff90000affc0010af00af000000af000000af00af000000afd40003dfdf 64dff2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0564 df646400affa0000affb000faf00af000000afaf0000afaf000000aff600 00aff80008afaf0000afaf0000affc0031af000000af0000afaf0000afaf 0000afaf0000afaf0000afaf0000afaf00af000000af000000af00af0000 00afaf0000afafd90003dfdf64dff2af09646400d69dd69d569d000900d6 d69d9d9d5656dfdfefaf0564df646400affa0000affa0000affc0004af00 afafaffc0000aff60000aff700fcaffd0000affb00fdaffd0004af00afaf affc00fcaffc00fcaffd0003afaf00affc0000affb00fcafd80003dfdf64 dff2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0564df 646400afee0000aff80000afd90000afaf0003dfdf64dff2af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfefaf0564df646400afee0000af f80000afd90000afaf0003dfdf64dff2af09646400d6d69d9d9d56000900 d69dd69d569d56dfdfefaf0764df646400afafaff00000affa00fdafd900 00afaf0003dfdf64dff2af09646400d69dd69d569d000900d6d69d9d9d56 56dfdfefaf0364df646480dfe7df0164dff2af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfefaf0264df6480dfe6df0164dff2af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfefaf8064e26400dff2af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdfefaf80dfe1dff2af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d 000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d 5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf 80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af 09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400 d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d 9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656 dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af c2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69d d69d569d000900d6d69d9d9d5656dfdf8cafc264f4af09646400d6d69d9d 9d56000900d69dd69d569d56dfdf8cafc36400dff4af09646400d69dd69d 569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af 09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01 dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf0164 64c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf 8caf016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6 d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d56 000900d69dd69d569d56dfdfe0af010000fbaf0000deaf0300afaf00f2af fd00f1affd00fdaf016464f9affc00f7af0000dbaf01dfdff4af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfe0af0200af00fcaf0000deaf 0300afaf00f2af0000edaf0500afafaf6464faaf0000fcaf0000faaffd00 dbaf01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdfe0 af0200af00fcaf0000deaf0000efaf0000edaf0500afafaf6464faaf0000 fcaf0000f8af0000dbaf01dfdff4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfe0af0a00afaf00afafaf00afafaffc00fcaffc00fdaf03 00af0000faaffc000cafaf00afaf00afaf00af000000f9af0300afaf00fb af0600af00af000000fcaf0500afafaf6464faaf0000fcaf0000f8af0000 dbaf01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdfe0 af1b00afaf00afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000 f9af120000afaf0000af00afaf00afaf0000afaf0000faaf0300afaf00fb af1000af0000afaf0000afafaf00afafaf6464faaf0000fcaf0000f8af00 00dbaf01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf e0af0a00afafaf00afaf00afaf00fcaf0000f9af0300afaf00f8af0000fa af0600afaf00afaf00fcaf0000faaf0b00afafaf00afafaf00afaf00fcaf 0900afafaf00afafaf6464faaf0000fcaf0000f8af0000dbaf01dfdff4af 09646400d6d69d9d9d56000900d69dd69d569d56dfdfe0af0900afafaf00 afaf00afaffa00fdaffb0002afaf00f8af0000faaf0600afaf00afaf00fc af0000faaf0b00afafaf00afafaf00afaf00fcaf0900afafaf00afafaf64 64faaf0000fcaf0000f8af0000dbaf01dfdff4af09646400d69dd69d569d 000900d6d69d9d9d5656dfdfe0af0000fcaf0500af00afaf00f9af080000 afafaf00afaf00f8af0000faaf0600afaf00afaf00fcaf0000faaf0b00af afaf00afafaf00afaf00fcaf0900afafaf00afafaf6464faaf0000fcaf00 00f8af0000dbaf01dfdff4af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdfe0af0000fcaf0500af00afaf00f9af0000fcaf0300afaf00f8af 0000fcaf0800af00afaf00afaf00fcaf0000faaf0000fcaf0600af00afaf af00fcaf0900afafaf00afafaf6464faaf0000fcaf0000f8af0000dbaf01 dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdfe0af0000 fbaf140000afaf0000afaf0000afaf0000afaf0000afaf00f8af120000af af0000af00afaf00afaf0000afaf0000faaf0000fcaf0600af00afafaf00 fcaf0900afafaf00afafaf6464faaf0000fcaf0300afaf00fbaf0000dbaf 01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdfe0af00 00fbaf040000afafaffc00fcaffd0004af0000af00f7affc000cafaf00af af00afaf00af000000f9af0000fbaf0000fcaf0000fcaf0900afafaf00af afaf6464f9affc00fdaf0000fbaf0000dbaf01dfdff4af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdfb0af0000f5af0000edaf0500afafaf 6464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56df dfb0af0000f5af0000edaf0500afafaf6464c6af01dfdff4af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfb0af0000f5affd00f1affd00fd af016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d 56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af096464 00d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4 af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af 01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf01 6464c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656df df8caf016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d 569d56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900 d6d69d9d9d5656dfdf8caf016464c4dff4af09646400d6d69d9d9d560009 00d69dd69d569d56dfdf8caf0064c3dff4af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf8cafc264f4af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdf8cafc36400dff4af09646400d69dd69d569d000900d6 d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d56 000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69d d69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdf f4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6 af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf 016464c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656 dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdfd2aff900e7af0300afaf00f2affd00f7affb00fdaf016464 f7af0000fbaffc00fcaffc00e1af01dfdff4af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdfd2af0000e1af0300afaf00f2af0000f6af0000 fcaf0500afafaf6464f9affd00fcaf0000fcaf0300afaf00fcaf0000e2af 01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdfd2af00 00e1af0000efaf0000f6af0000fcaf0500afafaf6464f7af0000fcaf0000 fcaf0300afaf00fcaf0000e2af01dfdff4af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfd2af0000f8affc00fdaf0300af0000faaffc000c afaf00afaf00afaf00af000000f9af0300afaf00fbaffc00fdaf0500afaf af6464f7af0000fcaf0000fcaf0300afaf00fcaf0000e2af01dfdff4af09 646400d6d69d9d9d56000900d69dd69d569d56dfdfd2af0000f9af090000 afaf0000afaf0000f9af120000afaf0000af00afaf00afaf0000afaf0000 faaf0300afaf00fbaf0200af00fcaf0500afafaf6464f7af0000fcaf0000 fcaf0300afaf00fcaf0000e2af01dfdff4af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfd2affa00f9af0300afaf00f8af0000faaf0600af af00afaf00fcaf0000faaf0b00afafaf00afafaf00afaf00fcaf0500afaf af6464f7af0000fcaf0000fcaf0300afaf00fcaf0000e2af01dfdff4af09 646400d6d69d9d9d56000900d69dd69d569d56dfdfd2af0000f8affb0002 afaf00f8af0000faaf0600afaf00afaf00fcaf0000faaf0b00afafaf00af afaf00afaf00fcaf0500afafaf6464f7af0000fcaf0000fcaf0300afaf00 fcaf0000e2af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d56 56dfdfd2af0000f9af080000afafaf00afaf00f8af0000faaf0600afaf00 afaf00fcaf0000faaf0b00afafaf00afafaf00afaf00fcaf0500afafaf64 64f7af0000fcaf0000fcaf0300afaf00fcaf0000e2af01dfdff4af096464 00d6d69d9d9d56000900d69dd69d569d56dfdfd2af0000f9af0000fcaf03 00afaf00f8af0000fcaf0800af00afaf00afaf00fcaf0000faaf0000fcaf 0600af00afafaf00fcaf0500afafaf6464f7af0000fcaf0000fcaf0300af af00fcaf0000e2af01dfdff4af09646400d69dd69d569d000900d6d69d9d 9d5656dfdfd2af0000f9af080000afaf0000afaf00f8af120000afaf0000 af00afaf00afaf0000afaf0000faaf0000fcaf0600af00afafaf00fcaf05 00afafaf6464f7af0000fcaf0000fcaf0300afaf00fcaf0000e2af01dfdf f4af09646400d6d69d9d9d56000900d69dd69d569d56dfdfd2af0000f8af fd0004af0000af00f7affc000cafaf00afaf00afaf00af000000f9af0000 fbaf0000fcaf0000fcaf0500afafaf6464f7af0000fbaffc00fcaffc00e1 af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdfacaf 0000f5af0000f1af0500afafaf6464c6af01dfdff4af09646400d6d69d9d 9d56000900d69dd69d569d56dfdfacaf0000f5af0000f1af0500afafaf64 64c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf acaf0000f5affd00f5affd00fdaf016464c6af01dfdff4af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdf f4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6 af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf 016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56 dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6d69d 9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d560009 00d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd69d 569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c4dff4af096464 00d69dd69d569d000900d6d69d9d9d5656dfdf8caf0064c3dff4af096464 00d6d69d9d9d56000900d69dd69d569d56dfdf8cafc264f4af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdf8cafc36400dff4af09646400d6 d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09 646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01df dff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464 c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8c af016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d 56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdfc3aff900fcaffd00fcaf0000f9af00 00fbaffd00f2affd00fdaf016464f5af0300afafaffc00d9af01dfdff4af 09646400d6d69d9d9d56000900d69dd69d569d56dfdfc3af0000f8af0900 00afafaf0000afaf00f9af0000fbaf0000eeaf0500afafaf6464f6af0400 00afaf00fcaf0000daaf01dfdff4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfc3af0000f8af0000fbaf0400afafaf00fbaf0000faaf00 00eeaf0500afafaf6464f7af0500af00afaf00fcaf0000daaf01dfdff4af 09646400d6d69d9d9d56000900d69dd69d569d56dfdfc3af0000f9af0000 f9af0300afaf00fbaf0000faaf0300afaf00fbaf010000fbaf0800afaf00 afafaf6464f8af0600afaf00afaf00fcaf0000daaf01dfdff4af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfc3af0000f9af0000f9af0900 afaf0000afafaf0000faaf0300afaf00fbaf010000fbaf0800afaf00afaf af6464f9af0700afafaf00afaf00fcaf0000daaf01dfdff4af09646400d6 d69d9d9d56000900d69dd69d569d56dfdfc3affa0002afaf00f9af0800af afaf00afafaf00f9af1800afafaf00afafaf00afaf00afafaf00afafaf00 afafaf6464faaf0000fcaf0300afaf00fcaf0000daaf01dfdff4af096464 00d69dd69d569d000900d6d69d9d9d5656dfdfc3af0000f9af0000f9af08 00afafaf00afafaf00f9af1800afafaf00afafaf00afaf00afafaf00afaf af00afafaf6464faaf0000fcaf0300afaf00fcaf0000daaf01dfdff4af09 646400d6d69d9d9d56000900d69dd69d569d56dfdfc3af0000f9af0000f9 af0000fcaf0200af00f8af1800afafaf00afafaf00afaf00afafaf00afaf af00afafaf6464faaff90001af00fcaf0000daaf01dfdff4af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfc3af0000f8af0000fbaf0000fb af0200af00f8af0000fcaf0200af00fcaf0200af00fcaf0500afafaf6464 f5af0300afaf00fcaf0000daaf01dfdff4af09646400d6d69d9d9d560009 00d69dd69d569d56dfdfc3af0000f8af060000afafaf0000faaf0000f7af 0000fcaf0200af00fcaf0200af00fcaf0500afafaf6464f5af0300afaf00 fcaf0000daaf01dfdff4af09646400d69dd69d569d000900d6d69d9d9d56 56dfdfc3af0000f6affd00f8af0000f7af0000fbaf0000faaf0000fbaf05 00afafaf6464f5af0300afafaffc00d9af01dfdff4af09646400d6d69d9d 9d56000900d69dd69d569d56dfdfa3af0000eeaf0500afafaf6464c6af01 dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdfa3af0000 eeaf0500afafaf6464c6af01dfdff4af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdfa3affd00f2affd00fdaf016464c6af01dfdff4af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdf f4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6 af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf 016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56 dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6d69d 9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d560009 00d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd69d 569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af 09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01 dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf0164 64c4dff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf00 64c3dff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8cafc2 64f4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8cafc36400 dff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464 c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8c af016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d 56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af096464 00d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4 af09646400d69dd69d569d000900d6d69d9d9d5656dfdff5aff900e8af00 00f9af0000deaf0000f5affd00f8af0900af000000afafaf6464f9affc00 d1af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdff5 af0000e2af0000f9af0000e2af0400afafaf00f5af0000f6af0900afafaf 00afafaf6464faaf0000fcaf0000d2af01dfdff4af09646400d69dd69d56 9d000900d6d69d9d9d5656dfdff5af0000e2af0000f9af0000e2af0400af afaf00f5af0000f6af0900afafaf00afafaf6464faaf0000fcaf0000d2af 01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdff5af00 00f8affc00fcaffc00fdaffc00fdaf0000f9af0000f9affc00fdaf0400af 000000fcaffd000caf00af000000afaf00af000000f9af0300afaf00fbaf 0b00af00afafaf00afafaf6464f5af0000d2af01dfdff4af09646400d69d d69d569d000900d6d69d9d9d5656dfdff5af0000f9af170000afaf0000af af0000afaf0000af0000afaf0000afaf00f9af0000faaf210000afaf0000 afaf0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000faaf 0300afaf00fbaf0b00af00afafaf00afafaf6464f5af0000d2af01dfdff4 af09646400d6d69d9d9d56000900d69dd69d569d56dfdff5affa0002afaf 00fcaf0300afaf00f5af0300afaf00f9af0000faaf0000fcaf0300afaf00 fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000faaf1400afafaf00 afafaf00afaf00afafaf00afafaf6464f8affd00d1af01dfdff4af096464 00d69dd69d569d000900d6d69d9d9d5656dfdff5af0000f9af0000fcaf03 00afaf00f9affb0002afaf00f9af0000faaffa0002afaf00fcaf0300afaf 00fcaf0700afaf00afafaf00fcaf0000faaf1400afafaf00afafaf00afaf 00afafaf00afafaf6464f5af0000d2af01dfdff4af09646400d6d69d9d9d 56000900d69dd69d569d56dfdff5af0000f9af0000fcaf0300afaf00faaf 080000afafaf00afaf00f9af0000faaf0000f9af0000fcaf0300afaf00fc af0700afaf00afafaf00fcaf0000faaf1400afafaf00afafaf00afaf00af afaf00afafaf6464f5af0000d2af01dfdff4af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdff5af0000f9af0000fcaf0300afaf00fcaf0200 af00fcaf0300afaf00f9af0000faaf0000f9af0000fcaf0300afaf00fcaf 0700afaf00afafaf00fcaf0000faaf0000fcaf0f00af00afafaf00afafaf 00afafaf6464faaf0000fcaf0000d2af01dfdff4af09646400d6d69d9d9d 56000900d69dd69d569d56dfdff5af0000f9af170000afaf0000afaf0000 afaf0000af0000afaf0000afaf00f9af0000faaf080000afaf0000afaf00 fcaf0f00afaf0000afaf0000afaf00afafaf00fcaf0000faaf0000fcaf0f 00af00afafaf00afafaf00afafaf6464faaf0000fcaf0000d2af01dfdff4 af09646400d69dd69d569d000900d6d69d9d9d5656dfdff5af0000f8affc 00fcaffc00fdaffd0004af0000af00f9affa0001afaffc00fdaf0000fcaf 0f00afafaf000000af00afafaf0000af00fcaf0000faaf0000fbaf0000fc af0900afafaf00afafaf6464f9affc00d1af01dfdff4af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfb2af0000eeaf0000f2af0500afafaf 6464c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656df dfb7af050000afaf0000eeaf0000f2af0500afafaf6464c6af01dfdff4af 09646400d6d69d9d9d56000900d69dd69d569d56dfdfb6affc00edaffd00 f6affd00fdaf016464c6af01dfdff4af09646400d69dd69d569d000900d6 d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d56 000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69d d69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdf f4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6 af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf 016464c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656 dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf8caf016464c4dff4af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdf8caf0064c3dff4af09646400d69dd69d569d00 0700d6d69d9d9d56568aafc264f4af09646400d6d69d9d9d56000700d69d d69d569d568aafc36400dff4af09646400d69dd69d569d000700d6d69d9d 9d56568aaf016464c6af01dfdff4af09646400d6d69d9d9d56000700d69d d69d569d568aaf016464c6af01dfdff4af09646400d69dd69d569d000700 d6d69d9d9d56568aaf016464c6af01dfdff4af09646400d6d69d9d9d5600 0700d69dd69d569d568aaf016464c6af01dfdff4af09646400d69dd69d56 9d000700d6d69d9d9d56568aaf016464c6af01dfdff4af09646400d6d69d 9d9d56000700d69dd69d569d568aaf016464c6af01dfdff4af09646400d6 9dd69d569d000700d6d69d9d9d56568aaf016464c6af01dfdff4af096464 00d6d69d9d9d56000700d69dd69d569d56f3af0000faaf0000e0affd00fc af0000deaffd00f2affd00fdaf016464f9affc00d1af01dfdff4af096464 00d69dd69d569d000700d6d69d9d9d5656f3af0000faaf0000e2af090000 afafaf0000afaf00deaf0000eeaf0500afafaf6464faaf0000fcaf0000d2 af01dfdff4af09646400d6d69d9d9d56000700d69dd69d569d56f3af0000 dbaf0000fbaf0300afaf00deaf0000eeaf0500afafaf6464faaf0000fcaf 0000d2af01dfdff4af09646400d69dd69d569d000700d6d69d9d9d5656f3 af0000faaf0700afaf00af000000fcaffc00fcaffd00f9af0000f7af0300 afafaffc00fcaffd00fcaffc00fdaf0300af0000fbaf0300afaf00fbaf02 00afaffc00fdaf0500afafaf6464f5af0000d2af01dfdff4af09646400d6 d69d9d9d56000700d69dd69d569d56f3af0000faaf1700afaf0000afaf00 00afaf0000afaf0000afaf00afafaf00faaf0000f7af1b00afaf0000afaf 0000afaf00afafaf00afaf0000afaf0000afaf0000f9af0300afaf00fbaf 0f00af0000afaf0000afaf00afafaf6464f5af0000d2af01dfdff4af0964 6400d69dd69d569d000700d6d69d9d9d5656f3af0000faaf0300afaf00fc af0300afaf00fcaf0400afaf0000f7af0000f7af0300afaf00fcaf0400af af0000fbaf0000fcaf0300afaf00f8af0b00afafaf00afafaf00afaf00f9 af0500afafaf6464f8affd00d1af01dfdff4af09646400d6d69d9d9d5600 0700d69dd69d569d56f3af0000faaf0300afaf00fcaf0200afaffa00fdaf fd00f9af0000f7af0300afaf00fcaf0900afafaf000000afafaffa0002af af00f8af0b00afafaf00afafaf00afaf00f9af0500afafaf6464f5af0000 d2af01dfdff4af09646400d69dd69d569d000700d6d69d9d9d5656f3af00 00faaf0300afaf00fcaf0300afaf00f6af010000faaf0000f7af0300afaf 00fcaf0000fbaf040000afaf00f9af0000f8af0b00afafaf00afafaf00af af00f9af0500afafaf6464f5af0000d2af01dfdff4af09646400d6d69d9d 9d56000700d69dd69d569d56f3af0000faaf0300afaf00fcaf0300afaf00 f5af0000f9af0000fbaf0600afaf00afaf00fcaf0000faaf0300afaf00f9 af0000f8af0000fcaf0600af00afafaf00fcaf0800afaf00afafaf6464fa af0000fcaf0000d2af01dfdff4af09646400d69dd69d569d000700d6d69d 9d9d5656f3af0000faaf0300afaf00fcaf0f00afaf0000afaf0000afaf00 afafaf00f9af230000afafaf0000afaf00afaf0000afaf0000afaf00afaf af00afaf0000afaf0000afaf00f8af0000fcaf1300af00afafaf0000afaf 0000afaf00afafaf6464faaf0000fcaf0000d2af01dfdff4af09646400d6 d69d9d9d56000700d69dd69d569d56f3affa0004af00afaf00fcaf0300af afaffc00fcaffd00f6affd00fcaf0300afafaffc00fcaffd00fcaffc00fd af0000f8af0000fbaf0000fbaffc00fdaf0500afafaf6464f9affc00d1af 01dfdff4af09646400d69dd69d569d000700d6d69d9d9d5656a1af0000ee af0500afafaf6464c6af01dfdff4af09646400d6d69d9d9d56000700d69d d69d569d56a1af0000eeaf0500afafaf6464c6af01dfdff4af09646400d6 9dd69d569d000700d6d69d9d9d5656a1affd00f2affd00fdaf016464c6af 01dfdff4af09646400d6d69d9d9d56000700d69dd69d569d568aaf016464 c6af01dfdff4af09646400d69dd69d569d000700d6d69d9d9d56568aaf01 6464c6af01dfdff4af09646400d6d69d9d9d56000700d69dd69d569d568a af016464c6af01dfdff4af09646400d69dd69d569d000700d6d69d9d9d56 568aaf016464c6af01dfdff4af09646400d6d69d9d9d56000700d69dd69d 569d568aaf016464c6af01dfdff4af09646400d69dd69d569d000700d6d6 9d9d9d56568aaf016464c6af01dfdff4af09646400d6d69d9d9d56000700 d69dd69d569d568aaf016464c6af01dfdff4af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d 9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af096464 00d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c4dff4af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf8caf0064c3dff4af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d 000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d 5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf 80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af 09646400d6d69d9d9d56000900d69dd69d569d56dfdfc9affd00daaf0000 f7af0000f1af0000f6af0000c8af09646400d69dd69d569d000900d6d69d 9d9d5656dfdfcbaf060000afafaf0000dcaf010000f9af010000f1af0000 f6af0000c8af09646400d6d69d9d9d56000900d69dd69d569d56dfdfcbaf 0000fbaf0000dcaf010000f9af010000f1af0000f6af0000c8af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfcbaf0000f8af0400af000000 fcaffc00fcaffc00fdaffc00faaf0200af00fbaf0500af00afafaffc00fc affd0004af00afafaffc00fdaf0000c8af09646400d6d69d9d9d56000900 d69dd69d569d56dfdfcaaf010000faaf1c0000afaf0000afaf0000afaf00 00afaf0000afaf0000af0000afaf0000fbaf0200af00fbaf1d00af00afaf 0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00c8af096464 00d69dd69d569d000900d6d69d9d9d5656dfdfc8af010000fcaf0000fcaf 0000f9af0300afaf00faaf0000fcaf0000fbaf0d00afaf00afafaf00afaf 00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00c8af096464 00d6d69d9d9d56000900d69dd69d569d56dfdfc6af040000afaf00fcaf03 00afafaffb0002afaf00faaffa00fbaf0d00afaf00afafaf00afaf00afaf 00fcaf0300afaf00fcaf0200afaffa0002afaf00c8af09646400d69dd69d 569d000900d6d69d9d9d5656dfdfc5af0300afaf00fcaf0b00afaf0000af afaf00afaf00faaf0000f6af0d00afafaf00af00afafaf00afaf00fcaf03 00afaf00fcaf0300afaf00f9af0000c8af09646400d6d69d9d9d56000900 d69dd69d569d56dfdfcbaf0000fbaf0300afaf00fcaf0300afaf00fcaf03 00afaf00fcaf0200af00f6af0d00afafaf00af00afafaf00afaf00fcaf03 00afaf00fcaf0300afaf00f9af0000c8af09646400d69dd69d569d000900 d6d69d9d9d5656dfdfcbaf250000afafaf0000afaf0000afaf0000afaf00 00afaf0000afaf0000afaf0000af0000afaf0000fbaf0000fcaf0000fcaf 1b00afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00c8 af09646400d6d69d9d9d56000900d69dd69d569d56dfdfc9affd00fcaf04 00af000000fcaffd0004af0000afaffc00fdaffc00faaf0000fcaf0000fc af0300afafaffc00fcaffd0004af00afafaffc00fdaf0000c8af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfc2af000081af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdfc2af000081af09646400d69dd69d 569d000900d6d69d9d9d5656dfdfc2af000081af09646400d6d69d9d9d56 000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6 d69d9d9d5656dfdfefaf8064e56400dfefaf09646400d6d69d9d9d560009 00d69dd69d569d56dfdfefaf006480dfe7df0164dfefaf09646400d69dd6 9d569d000900d6d69d9d9d5656dfdfefaf0164df8064e76400dfefaf0964 6400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0164df8064e96402 df64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf03 64df64648000ec0003dfdf64dfefaf09646400d6d69d9d9d56000900d69d d69d569d56dfdfefaf0364df64648000ec0003dfdf64dfefaf09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfefaf0764df646400afafafee00 fdaffb0000aff90002af00afe60000afb00003dfdf64dfefaf09646400d6 d69d9d9d56000900d69dd69d569d56dfdfefaf0564df646400afea0000af fb0000aff90002af00aff90000afee0000afb00003dfdf64dfefaf096464 00d69dd69d569d000900d6d69d9d9d5656dfdfefaf0564df646400afea00 00affa0000affb0000aff60000afee0000afb00003dfdf64dfefaf096464 00d6d69d9d9d56000900d69dd69d569d56dfdfefaf1364df646400af0000 00af00afaf0000afaf0000affb0003af0000affa0000affb0007af0000af 0000af00fbaf020000affc0002af0000fcaffd0000afb00003dfdf64dfef af09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf1364df6464 00af000000afaf0000afaf0000af00affb0003af0000affa0015afaf0000 00afaf0000af0000afaf000000af000000affc000aaf00afaf0000afaf00 00afb00003dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d569d 56dfdfefaf1c64df646400af000000af000000af000000af0000af000000 af000000aff9000baf000000af000000af0000affc0004af000000affc00 00affa0003af0000afb00003dfdf64dfefaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfefaf1c64df646400af000000af000000af000000 af0000af000000af000000aff9000baf000000af000000af0000affc0004 af000000affc0002af0000fbaf020000afb00003dfdf64dfefaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdfefaf1c64df646400af000000 af000000af000000af0000af000000af000000aff80002af00affc0003af 0000affc0004af000000affc000aaf00afaf000000af0000afb00003dfdf 64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf1764 df646400af000000af000000af000000af000000af00affc0000aff80002 af00affc0003af0000affc0004af000000affc0002af00affc0003af0000 afb00003dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdfefaf1764df646400af000000af000000af000000af000000af00affc 0000aff70000affb0003af0000affc0013af000000afaf0000afaf00afaf 0000afaf0000afb00003dfdf64dfefaf09646400d69dd69d569d000900d6 d69d9d9d5656dfdfefaf1164df646400af000000af000000af000000affc 0000affb0000aff70000affb0003af0000affb0012afaf0000afafaf00af 0000afafaf00afaf00afb00003dfdf64dfefaf09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfefaf0564df646400afea0000af850003dfdf64 dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0564df 646400afea0000af850003dfdf64dfefaf09646400d6d69d9d9d56000900 d69dd69d569d56dfdfefaf0764df646400afafafee00fdaf850003dfdf64 dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0364df 646480afecaf03dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d 569d56dfdfefaf0364df646480afecaf03dfdf64dfefaf09646400d69dd6 9d569d000900d6d69d9d9d5656dfdfefaf0764df6464af000000edaffd00 faaffa00f0af0000ebaf0000b9af03dfdf64dfefaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdfefaf0564df6464af00e9af0000faaf0000 fcaf010000f1af0000efaf0400afafaf00b9af03dfdf64dfefaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdfefaf0564df6464af00e9af00 00faaf0000fbaf0000dfaf0000b5af03dfdf64dfefaf09646400d6d69d9d 9d56000900d69dd69d569d56dfdfefaf1864df6464af00afafaf00af0000 afaf0000afafaf00af000000fcaf0000faaf0000fbaf0800afaf00af0000 afaffc00fdaf0300afafaffc00fcaffc0008af000000afaf00af00fbaf02 00afaffc00c7af03dfdf64dfefaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdfefaf1d64df6464af00afafaf0000afaf0000afaf00afaf00 00afaf0000afafaf00faaf0000fcaf290000afaf0000afafaf0000afaf00 00afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00af00fbaf 0700af0000afaf0000c8af03dfdf64dfefaf09646400d6d69d9d9d560009 00d69dd69d569d56dfdfefaf1464df6464af00afafaf00afafaf00afafaf 00afaf00fcaf0400afafaf00faaffa00fdaf0000fcaf0000fcaf0600afaf 00afaf00fcaf0300afaf00faaf0e00afafaf00afaf00afafaf00afaf00fc af0000c8af03dfdf64dfefaf09646400d69dd69d569d000900d6d69d9d9d 5656dfdfefaf1464df6464af00afafaf00afafaf00afafaf00afaf00fcaf 0400afafaf00faaf0000f8af0000fcaf0000fcaf0500afaf00afaffa0002 afaf00faaf0d00afafaf00afaf00afafaf00afaffa00c8af03dfdf64dfef af09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf1464df6464 af00afafaf00afafaf00afafaf00afaf00fcaf0400afafaf00faaf0000f8 af0000fcaf0000fcaf0600afaf00afaf00f9af0000faaf0e00afafaf00af af00afafaf00afaf00c3af03dfdf64dfefaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfefaf1464df6464af00afafaf00afafaf00afafaf 00afaf00fcaf0400afafaf00faaf0000f8af0000fcaf0000fcaf0600afaf 00afaf00f9af0000fcaf1000af00afafaf00afafaf00af00afafaf00c3af 03dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfef af1d64df6464af00afafaf00afafaf00afafaf00afaf0000afaf0000afaf af00faaf0000f8af0000fcaf2d0000afaf0000afaf00afaf0000afaf0000 afaf0000afaf0000af00afafaf00afafaf00af00afafaf0000afaf0000c8 af03dfdf64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf efaf1864df6464af00afafaf00afafaf00afafaf00afaf00af000000fcaf 0000faaf0000f8af0000fbaffc00fdaf0300afafaffc00fcaffc00fdaf03 0000af00fcaf0000fbaffc00c7af03dfdf64dfefaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdfefaf0564df6464af00f2af0000f8af0000 e4af0000a3af03dfdf64dfefaf09646400d69dd69d569d000900d6d69d9d 9d5656dfdfefaf0564df6464af00f2af0000f8af0000e4af0000a3af03df df64dfefaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf07 64df6464af000000f4af0000faaffd00e6af010000a2af03dfdf64dfefaf 09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0364df646480 afecaf03dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdfefaf0364df646480afecaf03dfdf64dfefaf09646400d69dd69d569d 000900d6d69d9d9d5656dfdfefaf0764df6464af000000eeaffd00f7affd 00ebaf010000dfaf0000caaf03dfdf64dfefaf09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfefaf0564df6464af00eaaf0000f9af060000af afaf0000eeaf0000ddaf0000caaf03dfdf64dfefaf09646400d69dd69d56 9d000900d6d69d9d9d5656dfdfefaf0564df6464af00eaaf0000f9af0000 fbaf0000eeaf0000ddaf0000caaf03dfdf64dfefaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdfefaf1064df6464af00afafaf00af0000af af0000fcaffc00fdaf0000faaf0000f6affc00fdaf0c00af000000afaf00 0000afafaffc00fdaf0c00af0000af00af0000afaf0000fcaffc00fdaf00 00caaf03dfdf64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656 dfdfefaf1c64df6464af00afafaf0000afaf0000afaf00afaf0000afaf00 00afaf00faaf0000f7af340000afaf0000afaf0000afaf0000afaf00afaf af0000afaf0000afaf0000afafaf0000afaf0000afaf00afaf0000afaf00 00afaf00caaf03dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d 569d56dfdfefaf1464df6464af00afafaf00afafaf00afafaf00afaf00f9 af0000faaf0000f7af0000fcaf0300afaf00fcaf0700afaf00afafaf00fc af0300afaf00fcaf0800afafaf00afafaf00f9af0300afaf00caaf03dfdf 64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf1464 df6464af00afafaf00afafaf00afafaf00afaf00f9af0000faaf0000f7af 0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0b 00afafaf00afafaf00afafaffb0002afaf00caaf03dfdf64dfefaf096464 00d6d69d9d9d56000900d69dd69d569d56dfdfefaf1464df6464af00afaf af00afafaf00afafaf00afaf00f9af0000faaf0000f7af0000fcaf0300af af00fcaf0700afaf00afafaf00fcaf0300afaf00fcaf1300afafaf00afaf af00afaf0000afafaf00afaf00caaf03dfdf64dfefaf09646400d69dd69d 569d000900d6d69d9d9d5656dfdfefaf1464df6464af00afafaf00afafaf 00afafaf00afaf00fcaf0300afaf00f9af0000fbaf0300afaf00fcaf0300 afaf00fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0b00afafaf00af afaf00afaf00fcaf0300afaf00caaf03dfdf64dfefaf09646400d6d69d9d 9d56000900569d569d569d56dfdfefaf1c64df6464af00afafaf00afafaf 00afafaf00afaf0000afaf0000afaf00f9af110000afafaf0000afaf0000 afaf0000afaf00fcaf0f00afaf00afafaf0000afaf0000afaf00fcaf1300 afafaf00afafaf00afaf0000afaf0000afaf00caaf03dfdf64dfefaf0964 6400d69dd69d569d000000fc56049d5656dfdfefaf1464df6464af00afaf af00afafaf00afafaf00afafaffc00fdaf0000f7affd00fbaffc00fdaf00 00fcaf0300afaf00fcaffc00fdaf0000fcaf1300afafaf00afafaf00afaf af000000af0000af00caaf03dfdf64dfefaf04646400d6d6fc56ff000000 fcd604569d56dfdfefaf0564df6464af00eaaf000085af03dfdf64dfefaf 04646400d69dfcd6ff000900d6d6d69d9d5656dfdfefaf0564df6464af00 eaaf000085af03dfdf64dfefaf09646400d6d69dd6d6d6000900d69dd69d 569d56dfdfefaf0764df6464af000000eeaffd0085af03dfdf64dfefaf09 646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0364df646480af ecaf03dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d569d56df dfefaf0364df646480afecaf03dfdf64dfefaf09646400d69dd69d569d00 0900d6d69d9d9d5656dfdfefaf0364df646480afecaf03dfdf64dfefaf09 646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0364df646480af ecaf03dfdf64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656df dfefaf0364df646480afecaf03dfdf64dfefaf09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfefaf0364df646480afecaf03dfdf64dfefaf09 646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0364df646480df eadf0164dfefaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfef af0264df6480dfe9df0164dfefaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdfefaf8064e56400dfefaf09646400d6d69d9d9d56000900d6 9dd69d569d56dfdfefaf80dfe4dfefaf09646400d69dd69d569d000900d6 d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf 80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af 09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d 569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d560009 00d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d 9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56 dfdf8064c0640700d69dd69d569d000800d6d69d9d9d5656df8064bf6407 00d6d69d9d9d56000700d69dd69d569d568000bd0006d69dd69d569d0006 00d6d69d9d9d5680d6bad6fd9d0156007f00d69dd69d569dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6519dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d569d000200d6d6e49d0156d6809df0 9d0156d6e39d0156000300d69dd6e59d0256d6d6809df19d0256d6d6e59d 02569d007f00d6d69d569d569d569d569d569d569d569d569d569d569d56 9d569d569d5656d6d6569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d51569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d5656d6d6569d569d569d569d569d569d569d569d569d569d569d569d 569d569d56000100d6e25601d6d68056f05601d6d6e356ff008000ae00 grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.5/doc/figs/fig2.eps0000644000175000017500000044576512310162301013340 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: noname.ps %%Creator: pnmtops %%CreationDate: 12. Mär 17:51 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 201 276 411 486 %%HiResBoundingBox: 201.599994 276.599945 410.399987 485.405985 %%EndComments %%BeginProlog %%BeginPreview: 208 208 8 1248 % 2929292929292929292929292929a929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929292929292929292929292929292929292929292929292929292929a929292929292929 % 2929292929292962 % 2929626262626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262626262a929626262626262 % 62626262626262a9 % 2962a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262 % 62626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9 % a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a962626262626262626262 % 6262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262 % 62626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9 % a9a9a9a9a9626262 % 2962a929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929296262 % 2962a92962626262626262626262a962626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626229626262626262626262626229626262626262 % 62626262a9296262 % 2962a92962626262626262626262a9626262626262626262ffff6262626262626262626262626262 % 6262626262626262626262ffffffffff626262626262626262ff62ff626262ff6262626262626262 % 6262626262626262626262ff626262626262626262ff626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a92962626262626262626262622962ff62626262 % 62626262a9296262 % 2962a92962626262626262626262a96262626262626262ff62626262626262626262626262626262 % 62626262626262626262ff62ff6262626262626262626262ff626262626262ff6262626262626262 % 626262626262626262626262626262626262626262ff626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a92962626262626262626262622962ff62626262 % 6262ff62a9296262 % 2962a92962626262626262626262a962626262626262ff62626262ff62ff62ffffffffff62ff62ff % 62ffff62ff62ff6262626262ff626262ff6262ff62ffff62ff62ff62ff62ffff62ffff62ff62ff62 % ffff62ff6262ff6262ffff62ff62ff62ff6262ff6262ff6262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a92962626262626262626262622962ff62626262 % 6262ff62a9296262 % 2962a92962ff6262626262626262a962626262626262ff62626262ffffff62ff62ff62ff62ffff62 % ff626262ffff626262ff62ff62626262ff62ff62ff626262ff62ff62ff62ff62ffffff62ffffff62 % ff62ff626262ff62ff62ff62ffffff62ffff62ff6262ff6262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a929626262ff62ff62626262622962ff62626262 % 6262ff62a9296262 % 2962a92962ffffffffffffffffffa962626262626262ff6262ffff6262ff62ff62ff62ffff626262 % ff6262ff62ff626262ff62ff626262ff6262ff62ff62ff62ff62ffff6262ff62ff6262ff6262ff62 % ff62ff626262ffff6262ffff62626262ffffff626262ff6262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a929626262ffffff62626262622962ff62626262 % 6262ff62a9296262 % 2962a92962626262626262626262a96262626262626262ffff6262ff62ffff62ff62ff6262ff6262 % ff6262ffffff626262ff62ffffff6262ff62ff62ffff62ff62ff6262ff62ff62ffff6262ff62ffff % 6262ff626262ff6262ff6262ffff6262ff62ff6262ff626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a92962626262626262626262622962ff62626262 % 6262ff62a9296262 % 2962a92962626262626262626262a962626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262ff62626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a92962626262626262626262622962ff62626262 % 6262ff62a9296262 % 2962a92962626262626262626262a962626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a92962626262626262626262622962ffffffffff % ffffff62a9296262 % 2962a92962626262626262626262a962626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a929626262626262626262626229626262626262 % 62626262a9296262 % a9a962ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffff29a9a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab292929 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababffabababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababffababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababffabababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababffababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababababababababababe9ab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababababababababababcccc % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababababababababababe8cccb % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababababababababababe9cccc % ccababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababababababababe9e8cccb % ccababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababababababababe9e9cccc % ccccabababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababababababababe8e9cbcccb % cccbabababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababababababe9e9e9cccccc % ccccccababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababababababe9e8e9cbcccb % cccbcccbabababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababababababe8e9e9e9cccccc % ccccccccabababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababababababe8e9e9e9cccccc % ccccccccccababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababababe8e8e9e9cccccccc % ccccccccccccabababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababababe8e8e9e9cccccccc % ccccccccccccabababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababababe8e8e8e9e9cccccccc % ccccccccccccabababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababababe8e8e8e9e9cccccccc % cccccccccccccbababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababe8e8e8e8e9e9cccccccc % cccccccccccccbababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababe8e8e8e8e8e9cccccccccc % cccccccccccccbcbabababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababe8e8e8e8e8e9cccccccccc % cccccccccccccbcbcbababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababe8e8e8e8e8e8e9cccccccccc % cccccccccccccbcbcbababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababe8e8e8e8e8e8e9cccccccccc % cccccccccccccbcbcbcbabababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababe8e8e8e8e8e8e8e9cccccccccc % cccccccccccccbcbcbcbabababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababe9e9e9e9e9e9e9e9cccbcccbcccb % cccbcccbcccbccccccccccababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababe9e9e9e9e9e9e9e9cccccccccccc % ccccccccccccccccccccccccabababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababe9e9e9e9e9e9e9e9e9cccbcccbcccb % cccbcccbcccbccccccccccccabababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababe9e9e9e9e9e9e9e9e9cccccccccccc % ccccccccccccccccccccccccccababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababe9e9e9e9e9e9e9e9e9e9cccbcccbcccb % cccbcccbcccbccccccccccccccababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababe9e9e9e9e9e9e9e9e9d2d2d2d2cccccccc % ccccccccccccccccccccccccccccabababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababe9e9e9e9e9e9e9e9d2d2d2d2d1d2d1cccb % cccbcccbcccbccccccccccccccccccababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababe9e9e9e9e9e9e9e9d2d2d2d2d2d2d2d2d2cc % ccccccccccccccccccccccccccccccababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababe9e9e9e9e9e9e9d2d2d2d2d2d2d1d2d1d2d1 % d2cbcccbcccbccccccccccccccccccccabababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababe9e9e9e9e9e9d2d2d2d2d2d2d2d2d2d2d2d2 % d2d2ccccccccccccccccccccccccccccabababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababe9e9e9e9e9e9d2d2d2d2d2d2d2d2d1d2d1d2d1 % d2d1d2d1cccbccccccccccccccccccccccababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababe9e9e9e9e9e9d2d2d2d2d2d2d2d2d2d2d2d2d2d2 % d2d2d2d2d2ccccccccccccccccccccccccccabababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababe9e9e8e8e8d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1cbcbcbcbcbcbcbcbcbcbcbabababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababe9e9e9e8e8d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1cbcbcbcbcbcbcbcbcbabababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababe9e9e9e9e8d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1cbcbcbcbcbcbcbcbccababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababe9e9e9e9d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1cbcbcbcbcbcbccccabababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababe9e9e9e9d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1d1cbcbcbcbcbccccabababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababe9e9e9d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1cbcbcbccccccababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababe9e9e9d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1cbcbccccccababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababe9e9d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1ccccccccabababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababe9e9d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2ccccccccababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabe9e9d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2ccccccababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababffffffababababababffabe9d2d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2ccccabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababffffababffe9d2d2d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2ccabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffabababababababababababab % abababababababababababababababababababababababababababababababababababababababff % ffababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffabababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababffffababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffabababababababababababab % ababababababababababababababc8c8c8c8c8c8c8ababababababababababababababababababab % abababababababffffababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababababababc8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8abababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababababababc8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8ababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababababababc8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8ababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababababababc8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8abababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababababc8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8abababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababababc8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8ababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababababc8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8abab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababc8c8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8abab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababc8c8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8ab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababc7c8c7c8c7c8c7 % c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7 % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababc7c8c7c8c7c8c7c8 % c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8 % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababc8c7c8c7c8c7c8c7 % c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7 % c8ababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababc8c7c8c7c8c7c8c7c8 % c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8 % c7c8abababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababc7c8c7c8c7c8c7c8c7 % c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7 % c8c7abababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabc7c8c7c8c7c8c7c8c7c8 % c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8 % c7c8c7ababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabc8c7c8c7c8c7c8c7c8c7 % c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7 % c8c7c8ababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc8c7c8c7c8c7c8c7c8c7c8 % c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8 % c7c8c7c8abababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc8c8c7c8c7c8c7c8c7c8c7 % c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7 % c8c7c8c7c8ababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc8c7c8c7c8c7c8c7c8c7c8 % c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8 % c7c8c7c8c7ababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc8c8c7c8c7c8c7c8c7c8c7 % c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c782c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7 % c8c7c8c7c8dbabababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc8c7c8c7c8c7c8c7c8c7c8 % c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7828282c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8 % c7c8c7c8c7ababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9c8c8c8c8c8c8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c88383838383838383c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 % c8c8c8c8dbababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cac8c8c8c8c8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c88383838383838383838383c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 % c8c8c8dbabababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacac8c8c8c8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c883838383838383838383838383c8c8c8c8c8c8c8c8c8c8c8c8c8c8 % c8c8c8dbabababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacac8c8c8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c882828283838383838383838383838382c8c8c8c8c8c8c8c8c8c8c8c8c8 % c8c8dbdbabababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacacac8c8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c882838283838383838383838383838383838283c8c8c8c8c8c8c8c8c8c8c8 % c8c8dbababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacacacac8c8c8c8c8 % c8c8c8c8c8c8c8c882828282828283838383838383838383838382828282c8c8c8c8c8c8c8c8c8c8 % c8dbdbababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacacacacac8c8c8c8 % c8c8c8c8c8c88283828382838283838383838383838383838383838283828382c8c8c8c8c8c8c8c8 % dbdbabababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacacacacacac8c8c8 % c8c8c8c8c882828282828282828283838383838383838383838382828282828282c8c8c8c8c8c8c8 % dbdbabababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacacacacacacac8c8 % c8c8c88382838283828382838283838383838383838383838383838283828382838283c8c8c8c8db % dbdbabababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacacacacacacacac8 % c8c882828282828282828282828283838383838383838383838382828282828282828282c8c8c8db % dbababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacacacacacacacaca % c883828382838283828382838283838383838383838383838383838283828382838283828382dbdb % dbababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacacacacacacacaca % 8383828282828282828282828282838383838383838383838383828282828282828282828282dbdb % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabc9c9c9c9c9c9c9c9c9c9 % c9828383838383838383838383838282828282828282828282828383838383838383838383dbdbdb % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabc9c9c9c9c9c9c9c9c9c9 % c9828383838383838383838383838282828282828282828282828383838383838383838383dbdbab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababc9c9c9c9c9c9c9c9c9 % c98283838383838383838383838382828282828282828282828283838383838383838383dbdbabab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababc9c9c9c9c9c9c9c9c9 % c9c983838383838383838383838382828282828282828282828283838383838383838383dbdbabab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababc9c9c9c9c9c9c9c9 % c9c9838383838383838383838383828282828282828282828282838383838383838383dbdbdbabab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababc9c9c9c9c9c9c9 % c9c9838383838383838383838383828282828282828282828282838383838383838383dbdbababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababc9c9c9c9c9c9c9 % c9c9838383838383838383838383828282828282828282828282838383838383838383dbdbababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababc9c9c9c9c9c9 % c9c9c983838383838383838383838282828282828282828282828383838383838383dbdbabababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababc9c9c9c9c9c9 % c9c9c983838383838383838383838282828282828282828282828383838383838383dbdbabababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababababc9c9c9c9c9 % c9c9c9838383838383838383838382828282828282828282828283838383838383dbdbababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababababc9c9c9c9c9 % c9c9c9c98383838383838383838382828282828282828282828283838383838383dbdbababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababababc9c9c9c9 % c9c9c9c983838383838383838383828282828282828282828282838383838383dbdbabababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababababababcacaca % cacac9c9c9828282828282828282838383838383838383838383828282828282dbdbabababababff % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababababababcaca % cacac9c9c98382838283828382838383838383838383838383838382838283dbdbababababababab % ffababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababababababcaca % cacac9c9c98282828282828282828383838383838383838383838282828282dbdbababababababab % abffabababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababababababababab % cacac9c9c9c9828382838283828383838383838383838383838383828382dbdbabababababababab % ababffababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababc9c9c9828282828282828283838383838383838383838382828282dbababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababababab8283828382838283838383838383838383838383838283dbabababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababffababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababffabababababababababababababababababababababababababababababab % ababababab296262 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababffababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % a9a962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab29a9a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab292929 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929296262 % 2929626262626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262626262a929626262626262 % 62626262626262a9 % 29a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9 %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice /pop load def %%EndProlog %%Page 1 1 /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 435 string def gsave 201.6 276.6 translate 208.8 208.8 scale 435 435 8 [ 435 0 0 -435 0 435 ] { picstr readstring } image 800080008000cd000000e3d6019d5680d680d68fd6015656e2d6019d007f 00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d 5656d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69d7fd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d32d69dd6 9dd69dd69dd69dd69dd69dd69dd69d56d6d69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d9d9d000300d69dd6e59d0256d6d680 9d809d919d035656d6d6e49d0156000200d6d6e49d0156d6809d809d8f9d 0156d6e49d02569d007f00d69dd69d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d567f9d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d567f9d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d562b9d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d56fb9d0156007f00d6d6 9d9d9d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d7f569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d7f569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d32569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d9d9dd69d569d000600d69dd69d569d800080008000db 0006d6d69d9d9d56000700d6d69d9d9d560080d680d680d6ddd60700d69d d69d569d007f00d69dd69d569d00d6d69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9dd6d69dd6 9dd6329dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69d00d6d69d9d9d56000800d6d69d9d 9d5600d6ea9d0156d6809d809da89d0156d6e99d0256d6d6eb9d085600d6 9dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6809d809da99d02 56d6d6eb9d025656d6fc9df200fd9d09565600d6d69d9d9d56000800d6d6 9d9d9d5600d6eb9d025656d6ee9dfc00cc9d0200009df900ed9d0500009d 9d0000f99d010000d99d010000ed9d010000809ddd9d025656d6e99d0656 d6d69d9d9d00f49d0000fc9d085600d69dd69d569d000900d69dd69d569d 00d6d6eb9d0256d6d6f19dfd00039d9d0000ce9d0500009d9d0000e89d05 00009d9d0000f99d010000d99d010000ec9d010000809ddd9d0256d6d6eb 9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d6 9d9d9d5600d6eb9d025656d6f19d010000fc9d010000cf9d0600009d9d9d 0000e99d010000f59d010000c29d010000809dde9d025656d6e99d0656d6 d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d569d 00d6d6eb9d0256d6d6f39d010000f69dfc00fd9d0800009d00009d000000 fc9dfc00fd9d0600009d00009d9dfc00f99d0600009d9d9d0000f99d0900 009d9d9d00009d9d9dfc00fd9d1100009d9d00009d9d9d0000009d00009d 9d9dfc00fc9dfc00fd9d0500009d000000fa9d010000fc9d0700009d0000 9d9d9dfc00109d9d00009d9d00009d9d00009d9d9d0000809dde9d0256d6 d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800 d6d69d9d9d5600d6eb9d025656d6f29d010000f79d1b00009d9d00009d9d 0000009d0000009d00009d9d00009d9d00009d9dfb00069d00009d9d0000 fa9d0600009d9d9d0000f99d3800009d9d9d00009d9d00009d9d00009d9d 00009d9d00009d9d00009d9d0000009d9d00009d9d00009d9d00009d9d00 009d9d0000009d9d0000fb9d010000fc9d1c00009d00009d9d00009d9d00 009d00009d9d00009d9d00009d9d9d0000809ddf9d025656d6e99d0656d6 d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000b00d69dd69d569d 00d6d69d9df000fd9d0256d6d6f49d010000f29d1900009d9d00009d9d00 009d9d00009d00009d9d9d00009d9d0000f89d010000fb9d010000fc9df9 00029d0000fc9d1400009d00009d9d9d00009d00009d9d9d00009d0000fc 9d0900009d00009d9d9d0000fa9d0a00009d9d00009d9d9d0000fb9d2200 009d9d9d00009d9d00009d00009d9d9d00009d00009d9d00009d9d00009d 9d9d0000809dde9d0256d6d6f99dfc00f69d025656d6fc9d0000f49d0d00 009d9d565600d6d69d9d9d56000c00d6d69d9d9d5600d69d9d9d00f29d05 009d9d5656d6f39d010000f69dfb000d9d9d00009d9d00009d9d00009d9d fa00039d9d0000fb9dfb00fa9d0600009d9d9d0000f99d0a00009d9d9d00 009d9d0000fa9d1000009d9d00009d9d00009d9d9d00009d9dfa00fd9dfb 00089d9d00009d9d9d0000fa9d0b00009d9d00009d9d00009d9dfa000a9d 9d00009d0000009d0000fc9d010000809ddf9d025656d6f89d04009d9d00 00f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000c00 d69dd69d569d00d6d69d9d00f29d0600009d9d56d6d6f49d010000f79d14 00009d9d00009d9d00009d9d00009d9d00009d0000f99d010000fc9d0500 009d9d0000fa9d0600009d9d9d0000f99d0900009d9d9d00009d0000f99d 0800009d9d00009d0000fc9d0400009d0000f99d0e00009d9d00009d9d00 009d9d9d0000fa9d0c00009d9d00009d9d00009d0000f99d0800009d009d 009d0000fc9d010000809dde9d0256d6d6f99d04009d9d0000f79d025656 d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00d6d69d9d9d56 00d69d9d9def00039d5656d6f39d010000fb9d1800009d00009d9d9d0000 9d9d00009d9d00009d9d00009d0000f99d0b00009d9d9d00009d9d9d0000 fa9d0600009d9d9d0000fa9d1a00009d9d9d00009d9d00009d9d9d00009d 9d00009d9d00009d0000fc9d0400009d0000fa9d0f00009d9d9d00009d9d 00009d9d9d0000f99d0b009d00009d9d9d00009d0000f99dfc00039d0000 00fb9d010000809ddf9d025656d6f89dfb00f69d0656d6d69d9d9d00f49d 0d00009d9d9d5600d69dd69d569d000900d69dd69d569d00d6d6fc9df100 049d9d56d6d6f39d2600009d9d0000009d9d00009d9d00009d9d00009d9d 00009d9d00009d9d00009d9d00009d9d0000fc9d0500009d9d0000f99d05 00009d9d0000f99d3800009d9d0000009d9d00009d9d00009d9d00009d9d 00009d9d00009d9d0000009d9d00009d9d00009d9d00009d9d00009d9d00 009d9d9d0000f89dfd00fd9d0900009d9d00009d9d0000fc9d0500009d9d 0000fb9d010000809ddd9d0256d6d6f89dfc00f79d025656d6fc9d0000f4 9d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d0256 56d6f19dfc00fb9dfd00109d00009d00009d9d00009d9d00009d9d9dfc00 fd9d010000fb9dfd00029d0000fa9d0300009d9df900fd9dfd00059d0000 9d9d9dfc00fd9d1100009d9d00009d9d9d0000009d00009d9d9dfc00fc9d fd000a9d00009d00009d9d9d0000f89d010000fc9d0400009d9d9dfc00fb 9d0500009d9d0000fb9d010000809dde9d025656d6e99d0656d6d69d9d9d 00f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d569d00d6d6eb 9d0256d6d6ba9d010000979d010000809ddc9d0256d6d6eb9d025656d6fc 9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6 eb9d025656d6b99d010000989d010000809ddc9d025656d6e99d0656d6d6 9d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d569d00 d6d6eb9d0256d6d6b99d0100009a9d010000809dda9d0256d6d6eb9d0256 56d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d 5600d6eb9d025656d6809d809da99d025656d6e99d0556d6d69d9d9df100 fd9d085600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d680 9d809da99d0256d6d6eb9d025656d6fa9df3000b9d9d565600d6d69d9d9d 56000800d6d69d9d9d5600d6eb9d025656d6809d809da99d025656d6e99d 0256d6d6eb9d085600d69dd69d569d007f00d69dd69d569d00d69d9d569d 569d569d569d569d569d569d569d569d569d56d6569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d567f9d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d567f9d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d56d6569d569d56329d569d569d569d569d569d569d569d56 9d5656d69d569d569d569d569d569d569d569d569d569d569d565600d6d6 9d9d9d560008009d569d9d9d56009de956009d80568056a756009de85600 9de9560700d69dd69d569d000000fb56009d800080008000db0001d6d6fc 56ff000000fcd6029d5656805480548054dd540200d69dfcd6ff000700d6 d6d69d569d56805480548054dd540700d6d69dd6d6d6000700d6d69d9d9d 5656805480548054dd540700d69dd69d569d000700d69dd69d569d568054 80548054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054 dd540700d69dd69d569d000700d69dd69d569d56805480548054dd540700 d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d 569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d560007 00d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd6 9d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d565680548054 8054dd540700d69dd69d569d000700d69dd69d569d56805480548054dd54 0700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69d d69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d56 000700d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d6 9dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d 5656805480548054dd540700d69dd69d569d000700d69dd69d569d568054 80548054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054 dd540700d69dd69d569d000700d69dd69d569d56805480548054dd540700 d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d 569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d560007 00d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd6 9d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656ae548000 00008054b0540700d69dd69d569d000700d69dd69d569d56ae5400008054 00008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae5401000081 5400008054b1540700d69dd69d569d000700d69dd69d569d56ae54020054 00825400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae5403 00545400835400008054b1540700d69dd69d569d000700d69dd69d569d56 ae54040054545400845400008054b1540700d6d69d9d9d56000700d6d69d 9d9d5656ae540000fc540000855400008054b1540700d69dd69d569d0007 00d69dd69d569d56ae540000fb540000865400008054b1540700d6d69d9d 9d56000700d6d69d9d9d5656ae540000fa540000875400008054b1540700 d69dd69d569d000700d69dd69d569d56ae540000f9540000885400008054 b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000f95400008854 00008054b1540700d69dd69d569d000700d69dd69d569d56ae540000f854 0000895400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae54 0000f75400008a5400008054b1540700d69dd69d569d000700d69dd69d56 9d56ae540000f65400008b5400008054b1540700d6d69d9d9d56000700d6 d69d9d9d5656ae540000f55400008c5400008054b1540700d69dd69d569d 000700d69dd69d569d56ae540000f45400008d5400008054b1540700d6d6 9d9d9d56000700d6d69d9d9d5656ae540000f35400008e5400008054b154 0700d69dd69d569d000700d69dd69d569d56ae540000f25400008f540000 8054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000f1540000 905400008054b1540700d69dd69d569d000700d69dd69d569d56ae540000 f0540000915400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656 ae540000f0540000915400008054b1540700d69dd69d569d000700d69dd6 9d569d56ae540000ef540000925400008054b1540700d6d69d9d9d560007 00d6d69d9d9d5656ae540000ee540000935400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed5492008054b1540700d6d69d9d 9d56000700d6d69d9d9d5656ae540000ed540000cb540016ca5400008054 b1540700d69dd69d569d000700d69dd69d569d56ae540000ed540000cb54 011634cb5400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae 540000ed540000cc540316333333cc5400008054b1540700d69dd69d569d 000700d69dd69d569d56ae540000ed540000cc540317333433cc54000080 54b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000cd 5405171633333433cd5400008054b1540700d69dd69d569d000700d69dd6 9d569d56ae540000ed540000cd5405161733343334cd5400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000ce54fd16fb 33ce5400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000cf540916171634333433343334cf5400008054b1540700d6d6 9d9d9d56000700d6d69d9d9d5656ae540000ed540000cf54091616173333 3334333333cf5400008054b1540700d69dd69d569d000700d69dd69d569d 56ae540000ed540000d0540b171617163433343334333433d05400008054 b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000d054 fc16f833d05400008054b1540700d69dd69d569d000700d69dd69d569d56 ae540000ed540000d1540d1617161716343334333433343334d154000080 54b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000d1 540d1716161634333333343333333433d15400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed540000d2540f17161716173334 333433343334333433d25400008054b1540700d6d69d9d9d56000700d6d6 9d9d9d5656ae540000ed540000d354fa16f433d35400008054b1540700d6 9dd69d569d000700d69dd69d569d56ae540000ed540000d3541116171617 1617333433343334333433343334d35400008054b1540700d6d69d9d9d56 000700d6d69d9d9d5656ae540000ed540000d454fd161017161616343333 33343333333433333334d45400008054b1540700d69dd69d569d000700d6 9dd69d569d56ae540000ed540000d4541317161716171634333433343334 33343334333433d45400008054b1540700d6d69d9d9d56000700d6d69d9d 9d5656ae540000ed540000d554f916f133d55400008054b1540700d69dd6 9d569d000700d69dd69d569d56ae540000ed540000d65416171617161716 1716343334333433343334333433343334d55400008054b1540700d6d69d 9d9d56000700d6d69d9d9d5656ae540000ed540000d65417161716161617 161633343333333433333334333333343333d65400008054b1540700d69d d69d569d000700d69dd69d569d56ae540000ed540000d754191617161716 171617163433343334333433343334333433343334d75400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000d754f816ee 33d75400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000d8541b17161716171617161733343334333433343334333433 343334333433d85400008054b1540700d6d69d9d9d56000700d6d69d9d9d 5656ae540000ed540000d854fd1618171616161716333334333333343333 33343333333433333334d85400008054b1540700d69dd69d569d000700d6 9dd69d569d56ae540000ed540000d9541d16171617161716171617333433 3433343334333433343334333433343334d95400008054b1540700d6d69d 9d9d56000700d6d69d9d9d5656ae540000ed540000da54f516ec33d95400 008054b1540700d69dd69d569d000700d69dd69d569d56ae540000ed5400 00da541f1716171617161716171634333433343334333433343334333433 343334333433da5400008054b1540700d6d69d9d9d56000700d6d69d9d9d 5656ae540000ed540000db54211616171616161716161617333333343333 3334333333343333333433333334333333db5400008054b1540700d69dd6 9d569d000700d69dd69d569d56ae540000ed540000db5421161716171617 16171617163433343334333433343334333433343334333433343334db54 00008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed54 0000dc54f416e833dc5400008054b1540700d69dd69d569d000700d69dd6 9d569d56ae540000ed540000dc5423171617161716171617161716343334 333433343334333433343334333433343334333433dc5400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000dd54251716 161617161616171616163433333334333333343333333433333334333333 343333333433dd5400008054b1540700d69dd69d569d000700d69dd69d56 9d56ae540000ed540000de54271716171617161716171617161733343334 3334333433343334333433343334333433343334333433de5400008054b1 540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000de54f3 16e533de5400008054b1540700d69dd69d569d000700d69dd69d569d56ae 540000ed540000df54291617161716171617161716171617333433343334 33343334333433343334333433343334333433343334df5400008054b154 0700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000df542916 161716161617161616171616163433333334333333343333333433333334 3333333433333334333333df5400008054b1540700d69dd69d569d000700 d69dd69d569d56ae540000ed540000e0542b171617161716171617161716 171634333433343334333433343334333433343334333433343334333433 3433e05400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae54 0000ed540000e054f216e233e05400008054b1540700d69dd69d569d0007 00d69dd69d569d56ae540000ed540000e1542d1617161716171617161716 171617163433343334333433343334333433343334333433343334333433 3433343334e15400008054b1540700d6d69d9d9d56000700d6d69d9d9d56 56ae540000ed540000e2542f161716161617161616171616161716163334 333333343333333433333334333333343333333433333334333333343333 e25400008054b1540700d69dd69d569d000700d69dd69d569d56ae540000 ed540000e2542f1716171617161716171617161716171634333433343334 33343334333433343334333433343334333433343334333433e254000080 54b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000e3 54f016de33e35400008054b1540700d69dd69d569d000700d69dd69d569d 56ae540000ed540000e35431161716171617161716171617161716173334 333433343334333433343334333433343334333433343334333433343334 3334e35400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae54 0000ed540000e454fd163017161616171616161716161617163333343333 333433333334333333343333333433333334333333343333333433333334 e45400008054b1540700d69dd69d569d000700d69dd69d569d56ae540000 ed540000e554341617161716171617161716171617161716173334333433 343334333433343334333433343334333433343334333433343334333433 e45400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000 ed540000e554ee16dc33e55400008054b1540700d69dd69d569d000700d6 9dd69d569d56ae540000ed540000e6543717161716171617161716171617 161716171617333433343334333433343334333433343334333433343334 33343334333433343334333433e65400008054b1540700d6d69d9d9d5600 0700d6d69d9d9d5656ae540000ed540000e6543716171616161716161617 161616171616161733333334333333343333333433333334333333343333 33343333333433333334333333343333e65400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed540000e7543916171617161716 171617161716171617161716343334333433343334333433343334333433 343334333433343334333433343334333433343334e75400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000e754ed16d9 33e75400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000e8543b17161716171617161716171617161716171617163433 343334333433343334333433343334333433343334333433343334333433 3433343334333433e85400008054b1540700d6d69d9d9d56000700d6d69d 9d9d5656ae540000ed540000e9543c171616161716161617161616171616 16171616162e2d3333343333333433333334333333343333333433333334 33333334333333343333333433333334e85400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed540000e9543d16171617161716 1716171617161716171617162e2d2e2d2e33343334333433343334333433 34333433343334333433343334333433343334333433343334e954000080 54b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000ea 54ee16f82dda33ea5400008054b1540700d69dd69d569d000700d69dd69d 569d56ae540000ed540000ea543f17161716171617161716171617161716 172d2e2d2e2d2e2d2e2d2e2d343334333433343334333433343334333433 343334333433343334333433343334333433ea5400008054b1540700d6d6 9d9d9d56000700d6d69d9d9d5656ae540000ed540000eb54411616171616 1617161616171616161716162d2e2d2d2d2e2d2d2d2e2d2d2d2e33333334 333333343333333433333334333333343333333433333334333333343333 33eb5400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000eb5441161716171617161716171617161716172d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e3334333433343334333433343334333433343334 3334333433343334333433343334eb5400008054b1540700d6d69d9d9d56 000700d6d69d9d9d5656ae540000ed540000ec54f016ed2ddf33ec540000 8054b1540700d69dd69d569d000700d69dd69d569d56ae540000ed540000 ed5445161716171617161716171617161716172d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d3433343334333433343334333433343334333433 34333433343334333433343334ed5400008054b1540700d6d69d9d9d5600 0700d6d69d9d9d5656ae540000ed540000ed544517161616171616161716 16161716162d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d33 343333333433333334333333343333333433333334333333343333333433 ed5400008054b1540700d69dd69d569d000700d69dd69d569d56ae540000 ed540000ee54471716171617161716171617161716172d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e333433343334333433343334 33343334333433343334333433343334333433ee5400008054b1540700d6 d69d9d9d56000700d6d69d9d9d5656ae540000ed540000ee54f216e32de3 33ee5400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000ef544916171617161716171617161716172d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d34333433343334 33343334333433343334333433343334333433343334ef5400008054b154 0700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000ef544916 1617161616171616161716162d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e 2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e3333333433333334333333343333 33343333333433333334333333ef5400008054b1540700d69dd69d569d00 0700d69dd69d569d56ae540000ed540000f0544b17161716171617161716 1716172d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e333433343334333433343334333433343334333433 343334333433f05400008054b1540700d6d69d9d9d56000700d6d69d9d9d 5656ae540000ed540000f154f316d92de633f15400008054b1540700d69d d69d569d000700d69dd69d569d56ae540000ed540000f1544d1617161716 171617161716172d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d343334333433343334333433 34333433343334333433343334f15400008054b1540700d6d69d9d9d5600 0700d6d69d9d9d5656ae540000ed540000f2544f16171616161716161617 16162d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d 2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d3334333333343333333433333334 33333334333333343333f25400008054b1540700d69dd69d569d000700d6 9dd69d569d56ae540000ed540000f2544f17161716171617161716172d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e33343334333433343334333433343334 33343334333433f25400008054b1540700d6d69d9d9d56000700d6d69d9d 9d5656ae540000ed540000f354f516cf2dea33f35400008054b1540700d6 9dd69d569d000700d69dd69d569d56ae540000ed540000f4545217161716 171617161716172d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e33 34333433343334333433343334333433343334f35400008054b1540700d6 d69d9d9d56000700d6d69d9d9d5656ae540000ed540000f454fd16501716 16161716162d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d 2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e33 33333433333334333333343333333433333334f45400008054b1540700d6 9dd69d569d000700d69dd69d569d56ae540000ed540000f5545516171617 1617161716172d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d34333433343334333433343334333433343334f55400008054b154 0700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000f554f716 c52dee33f55400008054b1540700d69dd69d569d000700d69dd69d569d56 ae540000ed540000f654571716171617161716172d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e3334333433343334 333433343334333433f65400008054b1540700d6d69d9d9d56000700d6d6 9d9d9d5656ae540000ed540000f6545716171616161716162d2e2d2d2d2e 2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d 2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d3334 3333333433333334333333343333f65400008054b1540700d69dd69d569d 000700d69dd69d569d56ae540000ed540000f75459161716171617162e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d343334333433343334333433343334f75400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000f854f916ba 2df233f75400008054b1540700d69dd69d569d000700d69dd69d569d56ae 540000ed540000f8545b1716171617162e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e33 343334333433343334333433f85400008054b1540700d6d69d9d9d560007 00d6d69d9d9d5656ae540000ed540000f9545d1716161617162d2d2e2d2d 2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e 2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d 2d2e2d2d2d2e2d2d2d2e33333334333333343333333433f95400008054b1 540700d69dd69d569d000700d69dd69d569d56ae540000ed540000f9545d 16171617162e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d34333433343334 33343334f95400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656 ae540000ed540000fa54fb16b02df533fa5400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed540000fa545f171617162e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e333433343334333433fa 5400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed 540000fb5461161617162d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d 2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d 2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d 2d2d2e2d2d333433333334333333fb5400008054b1540700d69dd69d569d 000700d69dd69d569d56ae540000ed540000fc5463171617162e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d34333433343334 33fc5400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae5400 00ed540000fc54fd16a62df933fc5400008054b1540700d69dd69d569d00 0700d69dd69d569d56ae540000ed546d005454541617162e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e33343334 3334545454008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae54 80000100008054b1540700d69dd69d569d000700d69dd69d569d56ad54fb 00f2546d00545417162e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d343334335454008054b1540700 d6d69d9d9d56000700d6d69d9d9d5656a854fc00f65403005454169b2d04 33335454008054b1540700d69dd69d569d000700d69dd69d569d56a454fc 00fa546d0054162e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e333454008054b1540700 d6d69d9d9d56000700d6d69d9d9d5656a054fb006e5400162d2d2e2d2d2d 2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d 2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d 2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d 2d2d2e2d2d2d2e2d2d2d34008054b1540700d69dd69d569d000700d69dd6 9d569d569b5492008054b0540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d565680548054 8054dd540700d69dd69d569d000700d69dd69d569d56805480548054dd54 0700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69d d69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d56 000700d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d6 9dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d 5656805480548054dd540700d69dd69d569d000700d69dd69d569d568054 80548054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054 dd540700d69dd69d569d000700d69dd69d569d56805480548054dd540700 d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d 569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d560007 00d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd6 9d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d565680548054 8054dd540700d69dd69d569d000700d69dd69d569d56805480548054dd54 0700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69d d69d569d000700d69dd69d569d568054a8549400a1540700d6d69d9d9d56 000700d6d69d9d9d56568054a8540000985402005454fc00a5540700d69d d69d569d000700d69dd69d569d568054a854000098540000fa54fc00a954 0700d6d69d9d9d56000700d6d69d9d9d56568054a85401000099540000f6 54fb00ae540700d69dd69d569d000700d69dd69d569d568054a854010000 99540000f154fc00b2540700d6d69d9d9d56000700d6d69d9d9d56568054 a854010000cb54f037de540000ed54fc00b6540700d69dd69d569d000700 d69dd69d569d568054a8548000fb00ba540700d6d69d9d9d56000700d6d6 9d9d9d56568054a85402005400ec54b637f8540000e5540000bb540700d6 9dd69d569d000700d69dd69d569d568054a85402005400ec544a38373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 3837373738373737383737f9540000e5540000bb540700d6d69d9d9d5600 0700d6d69d9d9d56568054a85402005400ed54b337fa540000e5540000bb 540700d69dd69d569d000700d69dd69d569d568054a85402005400ed54fd 374938373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 37373837373738373737383737373837fa540000e5540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a85402005400ee54b137fb540000 e5540000bb540700d69dd69d569d000700d69dd69d569d568054a8540200 5400ef54fd374d3837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 37373738373737383737373837373738373737383737373837fc540000e5 540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854020054 00ef54af37fc540000e5540000bb540700d69dd69d569d000700d69dd69d 569d568054a85402005400f0545637373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 3737383737373854545400e5540000bb540700d6d69d9d9d56000700d6d6 9d9d9d56568054a85402005400f054ad37fd540000e5540000bb540700d6 9dd69d569d000700d69dd69d569d568054a85402005400f1545737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737545400e5540000bb54 0700d6d69d9d9d56000700d6d69d9d9d56568054a85402005400f254a937 015400e5540000bb540700d69dd69d569d000700d69dd69d569d568054a8 5402005400f2545838373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 37373837375400e5540000bb540700d6d69d9d9d56000700d6d69d9d9d56 568054a85402005400f354a7370000e5540000bb540700d69dd69d569d00 0700d69dd69d569d568054a85402005400f354fd37563837373738373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 38373737383737373837373738373737383737e5540000bb540700d6d69d 9d9d56000700d6d69d9d9d56568054a85402005400f454a537e5540000bb 540700d69dd69d569d000700d69dd69d569d568054a85402005400f4545b 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 3837e6540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854 02005400f554a237e7540000bb540700d69dd69d569d000700d69dd69d56 9d568054a85402005400f6545e3737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738e7540000bb540700d6d69d9d 9d56000700d6d69d9d9d56568054a85402005400f654a037e8540000bb54 0700d69dd69d569d000700d69dd69d569d568054a85402005400f7546137 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 37373837373738e9540000bb540700d6d69d9d9d56000700d6d69d9d9d56 568054a85402005400f7549e37e9540000bb540700d69dd69d569d000700 d69dd69d569d568054a85402005400f85463383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 38373737383737373837373738373737383737373837373738373737ea54 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a85402005400 f8549b37eb540000bb540700d69dd69d569d000700d69dd69d569d568054 a85402005400f954fd376238373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 3738373737383737373837373738373737383737eb540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a85402005400fa549837ec540000 bb540700d69dd69d569d000700d69dd69d569d568054a85402005400fa54 683737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 37383737373837373738373737383737ed540000bb540700d6d69d9d9d56 000700d6d69d9d9d56568054a85402005400fb549637ed540000bb540700 d69dd69d569d000700d69dd69d569d568054a85402005400fb546a373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 3837373738373737383737373837ee540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a85402005400fc549437ee540000bb540700d69d d69d569d000700d69dd69d569d568054a85402005400fc546c3837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 3738373737383737373837373738ef540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a854050054005454549137f0540000bb540700d6 9dd69d569d000700d69dd69d569d568054a8547400540054543837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 3738373737383737373837373738373737f0540000bb540700d6d69d9d9d 56000700d6d69d9d9d56568054a8540400540054548f37f1540000bb5407 00d69dd69d569d000700d69dd69d569d568054a854760054005437373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737f2540000bb540700d6 d69d9d9d56000700d6d69d9d9d56568054a85403005400548d37f2540000 bb540700d69dd69d569d000700d69dd69d569d568054a854770054003737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 37373837373738373737383737373837373738373737383737f3540000bb 540700d6d69d9d9d56000700d6d69d9d9d56568054a854020054008a37f4 540000bb540700d69dd69d569d000700d69dd69d569d568054a854780054 003837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 3737373837373738373737383737373837373738373737383737373837f4 540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854020037 008937f5540000bb540700d69dd69d569d000700d69dd69d569d568054a8 547900360037373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 3737373837373738377d3738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 37373724f5540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054 a85402003500c137027c7c7dcc37f4540000bb540700d69dd69d569d0007 00d69dd69d569d568054a854780036003637373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 38373737383737373837373738373737387c7d7c7d7c7d7c383737373837 373738373737383737373837373738373737383737373837373738373737 3837373738373737383737373824f4540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a854040035003536c637087c7d7c7d7c7d7c7d7c d0370024f4540000bb540700d69dd69d569d000700d69dd69d569d568054 a85477003600363636373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737377d7c7d7c7d7c7d7c7d7c7d7c7d37373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383724f3540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8 540600350035363536cc370f7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7cd537 012424f3540000bb540700d69dd69d569d000700d69dd69d569d568054a8 5402003600fb36fd376b3837373738373737383737373837373738373737 3837373738373737383737373837373738373737383737373837377c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c3737383737373837373738373737 38373737383737373837373738373737383737373837373738373724f254 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a85408003500 353635363536d137157d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7cd937012424f2540000bb540700d69dd69d569d000700d69dd69d569d56 8054a85402003600f936fd37693837373738373737383737373837373738 373737383737373837373738373737383737373837373738377d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d37383737373837373738 3737373837373738373737383737373837373738373737383737372424f2 540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8540a0035 003536353635363536d637fd7c187d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7ddd37012424f1540000bb540700d69dd69d569d0007 00d69dd69d569d568054a85402003600f736fd3766383737373837373738 3737373837373738373737383737373837373738373737383737377d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c38 373737383737373837373738373737383737373837373738373737383737 37242424f1540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054 a8540c00350035363536353635363536db37217d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7ce137fd24f15400 00bb540700d69dd69d569d000700d69dd69d569d568054a85402003600f5 36fd37633837373738373737383737373837373738373737383737373837 37373837377c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d3737373837373738373737383737373837 3737383737373837373738242424f0540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a8540e003500353635363536353635363536e037 277c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7d7c7ce537fd24f0540000bb540700d69dd69d569d00 0700d69dd69d569d568054a85402003600f336fd375d3837373738373737 3837373738373737383737373837373738377d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c373738373737383737373837373738373737383737373837fc24f054 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8540f003500 35363536353635363536353635e5372e7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7cea37fc24ef540000bb540700d69dd69d569d000700d69dd69d569d 568054a85402003600f2365e383737373837373738373737383737373837 373738373737387c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d373837 3737383737373837373738373737383737fc24ef540000bb540700d6d69d 9d9d56000700d6d69d9d9d56568054a85411003500353635363536353635 363536353635ea37347d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7dee37fc24ee540000bb540700d69dd69d569d000700d69dd69d569d56 8054a85402003600f0365b38373737383737373837373738373737383737 377d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c383737 37383737373837373738373737fc24ee540000bb540700d6d69d9d9d5600 0700d6d69d9d9d56568054a8541300350035363536353635363536353635 36353635ef373a7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7cf237fb24ee540000bb540700d69dd69d569d000700d69dd6 9d569d568054a85402003600ee365738373737383737373837373738377d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d3737373837373738373737fb24ed540000bb540700d6d69d9d9d5600 0700d6d69d9d9d56568054a8541500350035363536353635363536353635 363536353635f437407c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7cf637fb24ed540000bb540700d69dd69d 569d000700d69dd69d569d568054a85402003600ec365438373737383737 37387c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c37373837373738fa24ed540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a854170054003536353635363536 35363536353635363536353635f937467c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfa37fb 24ec540000bb540700d69dd69d569d000700d69dd69d569d568054a85402 005400ea3651383737377d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d373837fa24 ec540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8546900 5400353635363536353635363536353635363536353635363537377d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d37fa24eb540000bb540700d69dd69d56 9d000700d69dd69d569d568054a8540300540054e9364e7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7dfa24eb540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a854680054005436353635363536353635363536 353635363536353635367c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfa24 ea540000bb540700d69dd69d569d000700d69dd69d569d568054a8540400 54005454ea364d7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfa24ea5400 00bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8546800540054 5435363536353635363536353635363536353635363536357d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7dfb24e9540000bb540700d69dd69d569d000700 d69dd69d569d568054a85405005400545454ea364b7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7dfa24e9540000bb540700d6d69d9d9d56000700d6d69d9d 9d56568054a85402005400fc546035363536353635363536353635363536 35363536357d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24e8540000bb5407 00d69dd69d569d000700d69dd69d569d568054a85402005400fc54ea3649 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24e7540000bb540700d6d69d9d9d56 000700d6d69d9d9d56568054a85402005400fb545e363536353635363536 3536353635363536353635367c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7cfb24e754 0000bb540700d69dd69d569d000700d69dd69d569d568054a85402005400 fb54eb36487d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfb24e6540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a85402005400fa545c3536353635 363536353635363536353635363536357d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24 e6540000bb540700d69dd69d569d000700d69dd69d569d568054a8540200 5400fa54eb36467c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24e5540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a85402005400f9545a3635363536 3536353635363536353635363536357c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7dfb24e554 0000bb540700d69dd69d569d000700d69dd69d569d568054a85402005400 f854ec36447d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7dfb240000e5540000bb540700d6d69d9d 9d56000700d6d69d9d9d56568054a85402005400f8545835363536353635 363536353635363536353635367c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb240000e5540000 bb540700d69dd69d569d000700d69dd69d569d568054a85402005400f754 ed36447d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7dfc24015400e5540000bb540700d6d69d9d9d 56000700d6d69d9d9d56568054a85402005400f754563635363536353635 3635363536353635363536357d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7cfb24015400e5540000bb54 0700d69dd69d569d000700d69dd69d569d568054a85402005400f654ed36 427c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7cfc2402545400e5540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a85402005400f654543536353635363536353635 36353635363536357d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb2402545400e5540000bb540700d69d d69d569d000700d69dd69d569d568054a85402005400f554ed36407d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7dfc24fd540000e5540000bb540700d6d69d9d9d56000700d6d69d9d9d 56568054a85402005400f454513536353635363536353635363536353635 367c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7dfb24fd540000e5540000bb540700d69dd69d569d000700d69d d69d569d568054a85402005400f454ed363e7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfc24fc540000e55400 00bb540700d6d69d9d9d56000700d6d69d9d9d56568054a85402005400f3 544f3635363536353635363536353635363536357d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24fc540000e554 0000bb540700d69dd69d569d000700d69dd69d569d568054a85402005400 f354ee363d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7dfc24fb540000e5540000bb540700d6d69d9d9d56000700 d6d69d9d9d56568054a85402005400f2544e353635363536353635363536 3536353635367c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7cfc24fb540000e5540000bb540700d69dd69d569d000700 d69dd69d569d568054a85402005400f254ee363b7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfc24fa540000e5540000 bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854ee004c363536 35363536353635363536353635367c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7dfc24f900e5540000bb540700d69dd69d 569d000700d69dd69d569d568054a85402005400f054ef36397c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfc24f8540000e6 540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854020054 00f0544a35363536353635363536353635363536357d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7cfc24f7540000e7540000bb 540700d69dd69d569d000700d69dd69d569d568054a85402005400ef54f0 36387c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfc 24f5540000e8540000bb540700d6d69d9d9d56000700d6d69d9d9d565680 54a85402005400ef544836353635363536353635363536353635367c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfc24f4540000e9 540000bb540700d69dd69d569d000700d69dd69d569d568054a854020054 00ee54f036367d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7dfc24f2540000ea540000bb540700d6d69d9d9d56000700d6d69d9d9d56 568054a85402005400ed54453635363536353635363536353635367c7c7c 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7cfc24f1540000eb54 0000bb540700d69dd69d569d000700d69dd69d569d568054a85402005400 ed54f036347c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfc24 ef540000ec540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054 a85402005400ec54433536353635363536353635363536357d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfc24ee540000ed540000bb5407 00d69dd69d569d000700d69dd69d569d568054a85402005400eb54f23637 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c242424ec540000 ee540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8540200 5400e854413536353635363536353635367c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c242424ea540000ef540000bb540700d69dd69d569d00 0700d69dd69d569d568054a85402005400e554f736347d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d2424e9540000ef540000bb540700d6d69d 9d9d56000700d6d69d9d9d56568054a754010000e254393536353635367c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d2424e7540000f0540000bb 540700d69dd69d569d000700d69dd69d569d568054a754010000df54fc36 317c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c24e5540000f1540000bb 540700d6d69d9d9d56000700d6d69d9d9d56568054a754010000dc543135 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c24e3540000f2540000bb5407 00d69dd69d569d000700d69dd69d569d568054a7540100008c540000f354 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a7540100008b 540000f4540000bb540700d69dd69d569d000700d69dd69d569d568054a7 540100008a540000f5540000bb540700d6d69d9d9d56000700d6d69d9d9d 56568054a75401000089540000f6540000bb540700d69dd69d569d000700 d69dd69d569d568054a75401000088540000f7540000bb540700d6d69d9d 9d56000700d6d69d9d9d56568054a75401000087540000f8540000bb5407 00d69dd69d569d000700d69dd69d569d568054a75401000086540000f954 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a75401000085 540000fa540000bb540700d69dd69d569d000700d69dd69d569d568054a7 5401000085540000fa540000bb540700d6d69d9d9d56000700d6d69d9d9d 56568054a75401000084540000fb540000bb540700d69dd69d569d000700 d69dd69d569d568054a75401000083540000fc540000bb540700d6d69d9d 9d56000700d6d69d9d9d56568054a7540100008254040054545400bb5407 00d69dd69d569d000700d69dd69d569d568054a754010000815403005454 00bb540700d6d69d9d9d56000700d6d69d9d9d56568054a7540100008054 02005400bb540700d69dd69d569d000700d69dd69d569d568054a7540100 00805402540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a6 548000fd00ba540700d69dd69d569d000700d69dd69d569d568054805480 54dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd5407 00d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d 9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d00 0700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d6 9d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d 56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480 548054dd540700d69dd69d569d000700d69dd69d569d56805480548054dd 540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d6 9dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d 56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d000700 d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d 9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d5680 5480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054805480 54dd540700d69dd69d569d000700d69dd69d569d56805480548054dd5407 00d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd6 9d569d000700569d569d569d56805480548054dd540700d6d69d569d5600 0000fc56029d5656805480548054dd540200d69dfc56ff000000fcd60256 9d56805480548054dd540000fad6ff000700d6d6d69d9d56568054805480 54dd540200d69dfcd6ff000700d69dd69d569d56805480548054dd540700 d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d 569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d560007 00d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd6 9d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d565680548054 8054dd540700d69dd69d569d000700d69dd69d569d56800080008000dc00 06d6d69d9d9d56000600d6d69d9d9d5680d680d680d6dad6059dd69d569d 007f00d69dd69d569dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6329d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69d9d9d56000200d6d6e49d0156d680 9d809d8f9d0156d6e49d02569d000300d69dd6e59d0256d6d6809d809d91 9d035656d6d6e49d0156007f00d6d69d569d569d569d569d569d569d569d 569d569d569d569d569d569d5656d6d6569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d7f569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d7f 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d32569d569d569d569d569d569d569d569d569d56d6d6 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d00 0100d6e25601d6d6805680568f5601d6d6e356ff00800080008000cd00 grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.5/doc/figs/load.eps0000644000175000017500000011022712310162301013406 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: blah-000.ps %%Creator: pnmtops %%CreationDate: 12. Mär 17:51 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 173 365 439 427 %%HiResBoundingBox: 173.753995 365.993989 438.245987 426.005987 %%EndComments %%BeginProlog %%BeginPreview: 264 60 8 420 % 32323232323232323232323232327432323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 3232323232323232bb323232323232323232323232323274 % 32327474747474747474747474747432747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 7474747474747474bb3274747474747474747474747474bb % 3232bbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb74747474747474747474 % 7474bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb7474 % 74747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbb % bbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb74747474747474747474 % 7474bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb7474 % 74747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbb % bbbbbbbbbbbb747474747474747474747474bbbbbb7474bb % 3232bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffff3274bb % 3232bbff323274747474747474747432747432323232323232323232323274747474747474747474 % 74743232323232323232323232327474747474747474747474743232323232323232323232327474 % 74747474747474747474323232323232323232323232747474747474747474747474323232323232 % 32323232323274747474747474747474747432323232323232323232323274747474747474747474 % 74743232323232323232323232327474747474747474747474743232323232323232323232327474 % 74747474747474747474323232323232323232323232747474747474747474747474323274323232 % 3232323232327474747474747474747474743232ff3274bb % 3232bbff327474747474747474747432747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb327474 % 7474747474747474bb7474ffffffffffffff74bbff3274bb % 3232bbff32747474747474747474743274747474747474ff74747474747474747474747474ff7474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb327474 % 7474747474747474bb7474ff74747474747474bbff3274bb % 3232bbff327474747474747474747432747474747474ff74747474ffff74ffff7474ffffff747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb327474 % 7474747474747474bb7474ff74747474747474bbff3274bb % 3232bbff3274ffffffffffffff747432747474747474ff747474ff74ff747474ffff7474ff747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb327474 % 74ffff7474747474bb7474ff74747474747474bbff3274bb % 3232bbff327474747474747474ff7432747474747474ff7474ff7474ff7474ff74ff7474ff747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb327474 % 74ff74ff74747474bb7474ff74747474747474bbff3274bb % 3232bbff3274ffffffffffffffff74327474747474ff747474ff74ff74ff74ff74ff74ff74747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb327474 % 7474ffff74747474bb7474ff74747474747474bbff3274bb % 3232bbff327474747474747474747432747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb327474 % 7474747474747474bb7474ff74747474747474bbff3274bb % 327474ff74747474747474747474bb32747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb747474 % 7474747474747474bb3274ffffffffffffff7474ff747474 % 327474ff74747474747474747474bb32747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 747474747474747474747474747474747474747474747474747474747474747474747474bb747474 % 7474747474747474bb3274747474747474747474ff747474 % 747474ffbbbbbbbbbbbbbbbbbbbbbb74bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbff747474 % 323274bb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff743232 % 327474bb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff747474 % 327474bb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff747474 % 327474bb606028282828282828282828282828282828282828282828282828282828282828282828 % 282828282828282828282828282860606060602828282828282828282828282828282828282828ae % 60606028282828282828282828282828282828282828282828ae6060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff747474 % 327474bb606028606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060ae606060606028606060606060606060606060606060606060aeae % 606060282860606060606060606060606060606060606060aeae6060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff747474 % 327474bb606028606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060ae606060606028606060606060606060606060606060606060aeae % 606060282860606060606060606060606060606060606060aeae6060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff747474 % 327474bb6060286060606060ffffff6060ff606060606060ffffff60606060606060606060606060 % 60606060606060606060606060ae606060606028606060606060ffff6060ff6060ff60606060aeae % 6060602828606060ff6060ff606060606060606060606060aeae6060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff747474 % 327474bb60602860606060606060606060ff606060606060ff6060ff606060606060606060606060 % 60606060606060606060606060ae6060606060286060606060606060ff60ff60ff6060606060aeae % 6060602828606060ff6060ff606060606060606060606060aeae6060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff747474 % 327474bb60602860606060606060606060ffff60ff606060ff60606060ff60ff60ffff60ff60ff60 % 606060ff60ff60ff6060606060ae6060606060286060606060ff60606060ffff606060606060aeae % 6060602828606060ff6060ff6060ff60ff60ff60ff606060aeae6060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff747474 % 3232bbbb60602860606060606060606060ffff6060606060ff6060ff6060606060ff6060ff606060 % 60ff6060606060606060606060ae6060606060286060606060ff60606060ff60ff6060606060aeae % 6060602828606060ff6060ff6060ff606060ff6060606060aeae6060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbb60602860606060606060606060ffff60ff606060ff6060ff606060ff60ff60ff60ff6060 % 606060ff60ff60606060606060ae6060606060286060606060606060ff60ff6060ff60606060aeae % 6060602828606060ff6060ff6060ff60ff60ff60ff606060aeae6060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbb606028606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060ae606060606028606060606060606060606060606060606060aeae % 606060282860606060606060606060606060606060606060aeae6060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbb606028606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060ae606060606028606060606060606060606060606060606060aeae % 606060282860606060606060606060606060606060606060aeae6060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbb606028606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060ae606060606028606060606060606060606060606060606060aeae % 606060282860606060606060606060606060606060606060aeae6060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbb606028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeae606060606028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % 6060602828aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae6060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbb6060aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeae6060606060aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % 60606028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae6060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbb6060aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae60606060ff3274bb % 3232bbbb6060ae606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602860606060ff3274bb % 327474bb6060ae606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602860606060ff747474 % 327474bb6060ae606060ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602860606060ff747474 % 327474bb6060ae60606060ffffffffffffffffffffffffff60ffffffffffffffffffffffffffff60 % ffff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602860606060ff747474 % 327474bb6060ae60606060ffffffffffffffffffffffffff60ffffffffffffffffffffffffff60ff % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602860606060ff747474 % 327474bb6060ae60606060ff60ff60ff60ff60ff60ff60ff60ff60ff60ffff60ffff60ff60ff60ff % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602860606060ff747474 % 327474bb6060ae60606060ffffff60ffffffffff60ffffff60ff606060ffffffffff60ffffff60ff % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602860606060ff747474 % 327474bb6060ae60606060ffffff60ffffffffff60ffffff60ffffffffffffffffff60ffffff60ff % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602860606060ff747474 % 327474bb6060ae60606060ffffffff60ffff6060ffff606060ff6060ffff6060ffffff6060ff60ff % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602860606060ff747474 % bbbb74bb6060ae606060ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602860606060ff74bbbb % 323274bb6060ae606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602860606060ff743232 % 327474bb6060ae606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602860606060ff747474 % 327474bb6060ae606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602860606060ff747474 % 3232bbbb6060ae282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 2828282828282828282828282828282860606060ff3274bb % 3232bbbb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060ff3274bb % 3232bbbbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffff3274bb % 3232bb32323274747474747474747474747432323232323232323232323274747474747474747474 % 74743232323232323232323232327474747474747474747474743232323232323232323232327474 % 74747474747474747474323232323232323232323232747474747474747474747474323232323232 % 32323232323274747474747474747474747432323232323232323232323274747474747474747474 % 74743232323232323232323232327474747474747474747474743232323232323232323232327474 % 74747474747474747474323232323232323232323232747474747474747474747474323232323232 % 3232323232327474747474747474747474743232323274bb % 32327474747474747474747474747432747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 7474747474747474bb3274747474747474747474747474bb % 32bbbbbbbbbbbbbbbbbbbbbbbbbbbb32bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbb32bbbbbbbbbbbbbbbbbbbbbbbbbbbb %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice /pop load def %%EndProlog %%Page 1 1 /picstr 1653 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def gsave 173.76 366 translate 264.48 60 scale 551 125 8 [ 551 0 0 -125 0 125 ] { inputf picstr readstring pop } false 3 colorimage 78DAEDDD5D729B30180550AF322BF0B6B206EF26AFDD4A33F594D1F0233E8104 C29CF3A049A84308B4BABD58761E0F0038CE4F1BDFDFDF5F5F5F3F005CC1D73F EDF6FF1B0A69E8FC7E5A771C1D7FF5FD1B8D46A3B1FABCDD68C67E1B4267B4BD 96F4F801E859DA141AED7FD4741A858E4B097095DC691707B34DE7BDDD68341A 8DC6FD63A4E9384B46A3D168AC953869A3596A3A56F40150656974A4E9B45B47 0DC01D641ACDECF65AABE6AC97361A8DC6A6E330D97675541B9A8ED56B00B75A 72566BC9749A23A54DA787E307E080A498E657FC199CD17E8E6F3AB3C7BF6A74 F0B534DA2DC0E989D3B4E90467CED1C32ED474840E40574DA7748ED574240EA0 E9B46E3AA33B6C97683A997498BD7318D92E74004D47D3290A9D74FBB68F850E A0E95CA5E994BE0AB56ED3196D5C0DA6A5D6E32F2770C3A6B3743BA8E7A65334 638FBEEFFE7B6B99D0990DBB604801DCA1E92CCD8D9D379DA2D0497327DE744A 6BCEECC76A0EA0E96C0B9DAE9ACE863B6C559ACE52E804B70B1D40D329BAC3D6 CFEAB50D4FEBC49B8E2504002D9ACE77F8699D5BAD5ECB2457E9A2688BA5014D A7567E7DF6EB7400386BA6BDE73B1200A0E9683A009A8EA603A0E9346D3ADBDE 1940D301D074B6E557E9BA654D0740D33932BF36349DE16BF78CBFFBD9B907A3 D168341E33D30EF9B57F3F99A6333C32DD3E7CE14EB5F603C001336DAD5D659A CEF43B3E00609F77D31925D1B07DE841EF3F7A01C05669D3198C4227BD23E78C 01B0337446B9B3B47A4DE80050ABE9ACAE5E133A00D46A3AABAFD3113A009CD8 74FE1096BF10DD1EE185CE21F0F14D4794043D9FCFCE4367E9082F740E014D87 F76CD979E8648EF042E710B84FD37126973CFF0B864E6F47D8C3250E9E43E03E 4DC799143A4207D074848ED001341DA12374840E683A2D9ACEEC1BBEBDB70F0F 283AE0E9AE6E183A4B3F7E644BC5D099DDF9EA952DBD6A4207349DA2D0C96F2F 0D9DE9DC7BABD019FDC8D34F4BA777A1037C58D329CA91D207DF3074325B3201 747CE854B9E24207349D764D67F5BE5966CA1DEEDAA55B467B8BCCCFB307307B 60D3EFD83A74E227333EB11FD37466EFAC46AEB8D0014DA751E84CF362756FF9 1B4DD3BDAD86CED2C6A2833C3D748AAAC401A11339819993297440D3290A9DD9 A7FE57FF73BE34A12DFDDF38F269247456EFE015B589E343A7F479AE9DA1B3B4 5024726583CF40091DD074DA359DFCFD967CD3294A8ACCD4375B9AF237EBDC5E 8B1F4CD115173AA0E9B40B9DC801AFEE6767E8CCDEF929FAD17A089D57070B09 4A9BCECE7308683ADD86CE740CCEE4E786CEAB64F5DAAB9B25D34207E8B3E96C 584890BF4B36BBB7E02C1D79EEFB94D089BF4EE7D5C78B432D24003A6C3AAFD8 92E9A5670166E7DBD5250799AF5ADDD529A19339C8D7A617CE58320D7C52D3B9 39EFBD76D83904341D848ED001341DA12374004D47E8081DA1039A8EA6237484 0EA0E9081DA103DCB0E93C59130C9DDE8EB0AB4BEC1F2C683A12A762E8747884 5D5D62FF6041D39126B542A7CF23ECEA12FB070B376F3A007058D301004D0700 4D0700A1A3E900A0E900A0E9A4AC850620F8EA86FD4DC7E90560B0FA6B3DAB34 1D9D1180C8EF92AED2749C6A0082A1A3E900A0E900A0E9081D00FA693A8F0FE2 6F1140E74D47DC00081D4D47E8007C64D309464F6942B54BB4342E871F01804B 349D6B854EBADB347A00D074840E80A6330D9D74CBF4B992E96C5FF7F1B30935 FDD3D1FEA71F03D07FD319CDEAE77EBCFA484D07E0EA4D6776263F727BFEEE9C D001F898A6D33A5CA6DF54E800683A47361AA103A0E99C153AC14F850EC0A736 9DE33F8E3C52E8007C5ED33965C9F4EA57091D80739BCED06EBCF71A00D59BCE 902C43E80CBCCB3400159B4E1A31E9EDB537BF4F07808A4D27350A1DBF391480 BA4D67367436AF5E0340E8649A4EDDD56B00089D7CD3A9F83A1D00848EA60380 A60380A6136F3A7F00E090A6E30C03100F9D3D4D070082F6371D00280A1D4D07 004D07004D0700341D00341D00D07400D07400D074840E009A0E009A0E00683A 00683A00683A9A0E00A7349D0700EC106F3A3F00B05BB0E9A45B8C46A3D168DC 33E69B4E45EFD2F40DC015B49BB4979A4E8BE3973B0097489CA693F6B4E90CAB 086A8DC3F157DFB3D168341A5B8CED12216D3A5FCD0CA10340FF9A4EDA56F401 70A4BFD6503658 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.5/doc/figs/myfilelist.eps0000644000175000017500000046614712310162301014667 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: noname.ps %%Creator: pnmtops %%CreationDate: 12. Mär 17:51 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 237 246 375 516 %%HiResBoundingBox: 237.359946 246.113992 374.639965 515.879984 %%EndComments %%BeginProlog %%BeginPreview: 138 270 8 1080 % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffff % ff2929292929292929626262626262a9296262626229292929292929292929292962626262626262 % 62626262622929292929292929292929296262626262626262626262622929292929292929292929 % 29626262626262626262626262292929292929292929292929626262626262626262626262292929 % 29a9292929292929296262626262626262ff % ff2962626262626262626262626262a9626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262296262626262626262626262626262ff % ff626262ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffff2929a9ff % ff626262296262626229292929292929292929292962626262626262626262626229292929292929 % 29292929296262626262626262626262622929292929292929292929296262626262626262626262 % 62292929292929292929292929626262626262626262626262292929292929292929292929626262 % 62622962626262626229292929292929a9ff % ff6262622962626262626262626262a9296262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262a929626262626262626262 % 6262296262ffffffffffff6262a92929a9ff % ff6262622962626262626262626262a929626262626262ff626262ff62ff62626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262a929626262626262626262 % 6262296262626262626262ff62a92929a9ff % ff6262622962626262626262626262a929626262626262ff626262ff62ff62ffff6262ffff626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262a929626262626262626262 % 6262296262626262626262ff62a92929a9ff % ff6262622962ffffffffffffffff62a929626262626262ffffff62ffff62ff626262ff6262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262a92962626262ffff626262 % 6262296262626262626262ff62a92929a9ff % ff6262622962ff626262626262ff62a9296262626262ff626262ff62ff62ff6262626262ff626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262a9296262626262ff626262 % 6262296262626262626262ff62a92929a9ff % ff626262296262ffffffffffffff62a9296262626262ff626262ff62ff62ff62ffff62ff62626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262a92962626262ffff626262 % 6262296262626262626262ff62a92929a9ff % ff6262622962626262626262626262a9296262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262a929626262626262626262 % 6262296262626262626262ff62a92929a9ff % ff6262622962626262626262626262a9296262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262a929626262626262626262 % 6262296262626262626262ff62a92929a9ff % ff6262622962626262626262626262a9296262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262a929626262626262626262 % 626229626262ffffffffffff62a92929a9ff % ff6262622962626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9 % a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262626262626262626262 % 62a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a929a9a9a9a9a9a9626262 % 626229626262626262a9a9a9a9a92929a9ff % ff2929a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020202020202020292929ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050ff5050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050ffffff50ffff50ffff505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a920505050505050ffffff5050ff505050505050ff50505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050ff505050505050ff50505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff626262205050505050505050505050ff50ff50ffff50ff50505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff6262622050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b50505050509b2929a9ff % ff6262622050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050509b2929a9ff % ff6262622050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050509b2929a9ff % ff6262622050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050509b2929a9ff % ff6262622050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050509b2929a9ff % ff6262622050505050509b505050ff505050505050505050505050505050505050505050ff505050 % 50505050505050ffff505050505050505050505050505050505050505050505050505050505050ff % 50505050505050505050ff505050505050505050505050ff50ffff50505050505050505050505050 % ff50ff505050502050505050509b2929a9ff % ff6262622050505050509b505050ff50ff5050505050505050505050505050505050505050505050 % 5050505050505050ff5050505050505050ff50505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050ff505050505050505050505050 % 5050ff505050502050505050509b2929a9ff % ff6262622050505050509b505050ff50ff50ff50ffff50ff50ff5050ff50ff50ffff505050ff50ff % 50ff50ff50ff5050ff50ff5050ff50ff50ff50ff50ff50ff50ff50ff5050ff50ff50ffff5050ffff % 5050ff5050505050505050ff505050505050505050505050ff505050505050505050ff50ff505050 % 5050ff505050502050505050509b2929a9ff % ff2962a92050505050509b505050ff5050505050ffff505050ff5050ff50ff50505050ff505050ff % 505050ff5050ff50ff50505050ff50505050505050ff5050505050505050ff50ff50ff50505050ff % 50505050ff5050ff50ff5050ff505050505050505050ff50ff50505050505050ff50ff50505050ff % 505050505050502050505050509b296262ff % ff2962a92050505050509b505050ffff50505050ffff50ff50ff5050ff50ff50ffff505050ff50ff % 505050ff50ff5050ff50ff5050ff5050505050ff50ff50ff50ff50ff5050ff50ff50ff50ffff50ff % 5050ff5050505050505050ff505050505050505050505050505050ff50ff50505050ff50ff505050 % 505050505050502050505050509b296262ff % ff2962a92050505050509b5050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050ff505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050509b296262ff % ff2962a92050505050509b5050505050505050505050ffff50505050505050505050505050505050 % 50505050505050505050505050505050505050ffff50505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050505050505050505050ffff505050 % 505050505050502050505050509b296262ff % ff2962a92050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050509b296262ff % ff2962a92050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050509b296262ff % ff2962a92050505050509b2020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050ff5050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050ff505050ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff62626220505050505050505050ff5050ffff50ffff5050ffffffff50ffff5050ff505050ffff50 % 50ff50505050505050505050505050505050505050505050505050505050ff505050ff505050ffff % 50ffff50505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff62626220505050505050505050ff5050ff5050505050ff50505050505050ff50505050ff505050 % ff5050505050505050505050505050505050505050505050505050505050ffffff50ff5050ff5050 % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff62626220505050505050505050ff5050ff5050505050ff50505050505050ff50505050ff505050 % 5050ff505050505050505050505050505050505050505050505050505050ff505050ff5050ff5050 % 5050ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050ff505050ff5050ffff50ff50ff505050ff50ff50505050ff50ff50 % ff50ff505050505050505050505050505050505050505050505050505050ff505050ff5050ff50ff % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff62626220505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50509b9b9b9b9b9b9b50505050509b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b2050 % 509b9b9b9b9b9b9b50505050509b2929a9ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b6a6a206a6a2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a206a6a2050505050509b296262ff % ff2962a920505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffff502050509b6a20509b6a2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a20509b6a2050505050509b296262ff % ff2962a920505050509b5050ffffffffffffff50ffffffff50ffffff50ffffff5050ffff50ffffff % ffffffffffffffffff50ffffff502050509b6a20509b6a2050505050509b505050505050ff50ff50 % 50ff50505050ff50ff50505050505050505050505050505050505050505050505050505050502050 % 509b6a20509b6a2050505050509b296262ff % ff2962a920505050509b5050ffffffffffffffff50ff50ffffffffffffffffffffffffffffffffff % 5050ffff5050ffffffffffffff502050509b205050509b2050505050509b505050505050ff50ff50 % 50ff5050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b205050509b2050505050509b296262ff % ff2962a920505050509b5050ffffffffffff50ffff50ffffffffffffffffff50ffffffffffffffff % 50ffff50ff50ffff50ffffffff502050509b9b9b9b9b9b2050505050509b5050ffffff50ff50ff50 % 50ffffff505050ff5050505050505050505050505050505050505050505050505050505050502050 % 509b9b9b9b9b9b2050505050509b296262ff % ff2962a920505050509b5050ff50ffff50ff50ffffffffffffffffffffffff50ffffffffffffffff % ff50ff50ff50ffff50ffffffff502050509b20202020202050505050509b505050505050ff50ff50 % 50ff5050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b20202020202050505050509b296262ff % ff2962a920505050509b5050ffffffffffffffff50ffffffffffffffffffffffff50ffff50ff50ff % ffffff50ff50ffffffff50ffff502050509b205050509b2050505050509b505050505050ff50ff50 % 50ff50505050ff50ff50505050505050505050505050505050505050505050505050505050502050 % 509b205050509b2050505050509b296262ff % ff2962a920505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffff50ffffffffffffff502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b205050509b2050505050509b296262ff % ff2962a920505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffff50ffffffffffffffff502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b205050509b2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b205050509b2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b205050509b2050505050509b296262ff % ff2962a920505050509b505050505050505050ff505050505050505050505050ff50ffff50505050 % 505050505050505050ff505050502050509b205050509b2050505050509b50ff50505050ff505050 % 50ff50505050505050ff5050ff505050505050505050505050505050505050505050505050502050 % 509b205050509b2050505050509b296262ff % ff62626220505050509b50505050505050505050ff50ff5050505050505050505050505050505050 % ffff5050ffff50505050505050502050509b205050509b2050505050509b50ffff5050ffff50ffff % 50ff50ff50ffff50ffff5050ff50ffff505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b5050505050505050ff5050ff505050505050505050ff5050505050505050 % ff5050ff50ff5050ff50505050502050509b205050509b2050505050509b50ff50505050ff505050 % ffffff50505050ff50505050ffff5050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050ff5050ff50ff505050505050505050505050ff5050505050505050 % 50ff50ff50ff5050ff50505050502050509b205050509b2050505050509b50ff50ffff50ff50ff50 % ffffff505050505050505050ffff5050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b50505050505050505050ff505050505050505050505050ff5050ff50ff50 % 505050ff50ff50505050ff5050502050509b205050509b2050505050509b50ff50505050ff50ff50 % ffff50ff50ff50ff50505050ffff50ff505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 5050505050ff50505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050ff5050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50ff50505050ff505050 % 505050ff505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50ff50505050ff505050 % 505050ff505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50ffff5050ffff5050ff % 50ff50ff50ff50ff50ff50ff50505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50ff50505050ff50ff50 % 505050ff50ffffff505050ff50505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50ff50505050ff505050 % 50ff50ff50ff50ff50ff50ff50505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % ff50505050ff5050505050ff50505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b5050ff50ffff50505050 % ffff50ff50ff50ff50ff50505050ff505050ff50ff50505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050ffff50505050 % ffff505050ff505050ff505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050ffff50505050 % ffff505050ff505050ff50505050505050505050ff50505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b505050ff5050ff505050 % ff50ff5050ff505050ff505050ffff50ff50ffff5050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % ff50505050ff5050505050ff50505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b5050ff50ffff50505050 % ffff50ff50ff50ff50ff50505050ff505050ff50ff50505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050ffff50505050 % ffff505050ff505050ff50505050505050505050ff50505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050ffff50505050 % ffff505050ff505050ff50505050505050505050ff50505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b505050ff5050ff505050 % ff50ff5050ff505050ff505050ffff50ff50ffff5050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b5050ff50ffff50ff50ff % 50ff5050ff50ff50ff5050ff50ff5050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b5050505050ff505050ff % 50505050ff50ff50ff5050ff50505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050ffff505050ff % 50505050ff50ff50ff5050ff50ff5050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b5050ffff5050ffff50ff % 50505050ff50ff50ff505050ff505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b5050ffff5050ffff50ff % ff50ff50ffff50ff50505050ff505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b5050505050ff505050ff % 50505050ff50ff50ff5050ff50ff5050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b296262ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050ffff505050ff % 50505050ff50ff50ff5050ff50ff5050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b5050ffff5050ffff50ff % 50505050ff50ff50ff505050ff505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b50505050ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b209b9b9b9b2050505050509b5050ffffff5050ff50ff % ffff50ff50ff50ffff505050ff5050ffff5050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b6a6a6a6a6a2050505050509b50505050ff5050505050 % 50ff50ff50ff505050ff50505050ff50505050505050505050505050505050505050505050502050 % 509b6a6a6a6a6a2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b202020209b2050505050509b50505050ff505050ff50 % 505050ff50505050505050505050ff50505050505050505050505050505050505050505050502050 % 509b202020209b2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b205050509b2050505050509b5050ff50ff505050ff50 % ff50ff50ff5050ff50ff50505050ff50ff5050505050505050505050505050505050505050502050 % 509b205050509b2050505050509b2929a9ff % ff62626220505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b6a20509b6a2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a20509b6a2050505050509b2929a9ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b6a6a9b6a6a2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a9b6a6a2050505050509b296262ff % ff2962a920505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050509b6a6a9b6a6a2050505050509b50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050502050 % 509b6a6a9b6a6a2050505050509b296262ff % ff2962a920505050509b202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202050502020202020202050505050502020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202050 % 502020202020202050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a920505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b2050 % 505050505050505050505050509b296262ff % ff2962a920505050509b6a6a6a6a209b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a202020 % 20202020202020206a20206a6a6a2050505050505050505050505050509b6a6a6a20206a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a202020202020202020206a20206a6a6a2050 % 505050505050505050505050509b296262ff % ff2962a920505050509b6a6a2020509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050 % 505050505050509b6a205020206a2050505050505050505050505050509b6a2020509b6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a2050505050505050509b6a205020206a2050 % 505050505050505050505050509b296262ff % ff2962a920505050509b20205050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050 % 505050505050509b6a205050509b2050505050505050505050505050509b205050509b6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a2050505050505050509b6a205050509b2050 % 505050505050505050505050509b296262ff % ff2962a920505050509b6a6a9b9b509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050 % 505050505050509b6a20509b9b6a2050505050505050505050505050509b6a9b9b509b6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a2050505050505050509b6a20509b9b6a2050 % 505050505050505050505050509b296262ff % ff2962a920505050509b6a6a6a6a9b9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a209b9b % 9b9b9b9b9b9b9b9b6a9b9b6a6a6a2050505050505050505050505050509b6a6a6a9b9b6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a209b9b9b9b9b9b9b9b9b6a9b9b6a6a6a2050 % 505050505050505050505050509b296262ff % ff2962a920505050509b202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202050505050505050505050505050509b20202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202050 % 505050505050505050505050509b296262ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020209b505050509b2929a9ff % ff626262205050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b505050509b2929a9ff % ff626262205050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b505050509b2929a9ff % ff626262205050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b505050509b2929a9ff % ff626262205050505020205050505050505050505050505050505050ff5050505050505050505050 % 5050ff5050ff50505050ff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b505050509b2929a9ff % ff626262205050505020205050505050505050505050505050505050505050ffffffff5050ff5050 % 5050ff5050ff50ffff50ff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b505050509b2929a9ff % ff62626220505050502020505050505050505050505050505050ffffff505050505050505050ff50 % 5050ff5050ff50ff5050ff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b505050509b2929a9ff % ff2962a92050505050202050505050505050505050505050505050505050ff50505050505050ff50 % 5050ff5050ff50505050ff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b505050509b296262ff % ff2962a9205050505020205050505050505050505050505050505050505050ff5050ff505050ff50 % 5050ffffffff50ffff5050ff50505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b505050509b296262ff % ff2962a9205050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b505050509b296262ff % ff2962a9205050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b505050509b296262ff % ff2962a920505050502020509b202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020209b509b9b505050509b296262ff % ff2962a920505050502020509b509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b509b9b505050509b296262ff % ff2962a920505050502020509b509b50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b296262ff % ff2962a920505050502020509b509b50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b296262ff % ff2962a920505050502020509b509b50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b296262ff % ff2962a920505050502020509b509b50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b296262ff % ff2962a920505050502020509b509b50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b296262ff % ff2962a920505050502020509b509b50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b296262ff % ff62626220505050502020509b509b50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b2929a9ff % ff62626220505050502020509b509b50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b2929a9ff % ff62626220505050502020509b509b50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b2929a9ff % ff62626220505050502020509b509b50ff50505050ff505050505050505050505050ff5050505050 % 5050505050505050505050505050ff5050ff5050505050505050505050ff50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b2929a9ff % ff62626220505050502020509b509b5050ff5050505050ff505050ffff50ffffff5050ffffff5050 % ff5050ffff50ffff50ffffff50505050ffff50ffff50ffff50ffff50505050ff505050ffff5050ff % ff5050ff50ff50505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b2929a9ff % ff62626220505050502020509b509bff50ff50505050ff505050ff5050505050ffff50ff505050ff % 505050ff5050505050ff505050ff50ff50ff505050ff5050505050ff5050ff505050ff505050ff50 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b2929a9ff % ff62626220505050502020509b509bff50ff50505050ff505050ff5050505050ffff50ff505050ff % 505050ff50ff505050ff505050ff50ff50ff50ff50ff505050ff50ff5050ff505050ff505050ff50 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b2929a9ff % ff62626220505050502020509b509b5050ff50ffff50ff50ff50ff50ff50ff50ff5050ff505050ff % 50ff50ff50ff50ff50ff50ff505050ff50ff50ff50ff505050ff50ffff50ff50ff50ff50ff50ff50 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b2929a9ff % ff62626220505050502020509b509b5050505050505050505050505050505050ff50505050505050 % 505050505050505050ff505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b2929a9ff % ff62626220505050502020509b509b5050505050505050ffff5050505050ffff5050505050505050 % ffff50505050505050ff505050505050505050505050505050505050505050ffff50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b2929a9ff % ff62626220505050502020509b509b50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b2929a9ff % ff62626220505050502020509b509b50ff50505050ff505050505050505050505050ff5050505050 % 5050505050505050505050505050ff5050ff50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b2929a9ff % ff2962a920505050502020509b509b5050ff50505050ff50ff50ff50ff50ff50ff5050ff50ff50ff % 50ff50ff50ff50ff50ff50ff505050ff50ff50ff50ff505050ff50ff505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b296262ff % ff2962a920505050502020509b509bff50ff50505050ff505050ff5050505050ffff50ff505050ff % 505050ff5050ffff50ff505050ff50ff50ff50ffffff505050ffffff505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b296262ff % ff2962a920505050502020509b509b5050ff5050ff50ff505050ff5050505050ff5050ff505050ff % 505050ff50ff505050ff5050505050ff50ff505050ff5050505050ff505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b296262ff % ff2962a920505050502020509b509b505050ff50ff5050ff505050ffff50ffffff5050ff50505050 % ff5050ff5050ff50ffffffff50505050ffff50ffffff50ff50ffffff505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b296262ff % ff2962a920505050502020509b509b50505050505050ff50ff5050505050ff50ff505050505050ff % 50ff50505050505050ff505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b296262ff % ff2962a920505050502020509b509b50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b296262ff % ff2962a920505050502020509b509b50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b296262ff % ff2962a920505050502020509b509b50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b509b9b505050509b296262ff % ff2962a920505050502020509b502020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020209b509b9b505050509b296262ff % ff2962a920505050502020509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b509b9b505050509b296262ff % ff2962a9205050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b505050509b296262ff % ff2962a9205050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b505050509b296262ff % ff626262205050505020209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b505050509b2929a9ff % ff6262622050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff62626220505050505050ff50ff5050505050ff5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050ffff50ff50ffff5050ffffffff505050ff505050ff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff6262622050505050505050ff5050ff505050ff50505050ff505050505050ff50ff505050ff5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff2962a92050505050505050505050ff505050ff50505050ff505050505050ff50ff505050ff5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a92050505050505050ff505050ffff50ff50ffff5050ffff50ff505050ff50505050ff5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a92050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b50505050509b296262ff % ff2962a92050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050509b296262ff % ff2962a92050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050509b296262ff % ff2962a92050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050509b296262ff % ff2962a92050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050509b296262ff % ff2962a92050505050509b505050505050505050ff50505050505050505050505050505050505050 % 505050505050505050505050505050ff5050505050ff505050505050505050505050505050505050 % 5050ff50505050505050505050ff5050505050ff505050ff5050ff5050ff50505050505050505050 % 50ff50505050502050505050509b296262ff % ff2962a92050505050509b50505050505050505050505050505050505050505050505050505050ff % 50505050505050505050ff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050ff505050ff50505050505050505050505050505050 % 505050ff5050502050505050509b296262ff % ff6262622050505050509b50505050ff505050ff505050ff505050ff5050505050ff505050ff5050 % 50ff5050ff50ff50505050505050ffff50505050ff50ff505050ff5050505050ff505050505050ff % 5050ff505050ffff50ff50ff50505050505050ff505050ff50ff50ff505050ff5050ff5050ff5050 % 50ff50505050502050505050509b2929a9ff % ff6262622050505050509b50505050ff505050ff505050ff505050ff505050ff50ff505050ff5050 % 5050ff50ff50ff50505050505050ffff50505050ff50ff505050ff5050505050ff505050505050ff % 5050ff505050505050ff5050505050ff505050ff505050ff50ff50ff505050ff50505050ffff5050 % 50ff50505050502050505050509b2929a9ff % ff6262622050505050509b50505050ff50ff5050505050ff50ff50ff505050ff50ff50ff50ffff50 % 50505050ff50ff50ffff5050ff50ffff505050505050ff50ff50ff50ff50ff50ff50505050505050 % 5050ff50ff50ff50ff50ff50ff50ff50ff5050ff505050ff50505050ff50ff505050ff50ffff50ff % 50ffff505050502050505050509b2929a9ff % ff6262622050505050509b50505050505050505050505050505050ff505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050509b2929a9ff % ff6262622050505050509b5050505050505050505050505050ffff50505050505050505050505050 % 5050505050505050505050505050505050505050505050ffff505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050505050505050505050505050ffff % 505050505050502050505050509b2929a9ff % ff6262622050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050509b2929a9ff % ff6262622050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050509b2929a9ff % ff6262622050505050509b2020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff626262205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b2929a9ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020209b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff6262622050505050505050502020202020202020202020202020202020202020209b5050505050 % 5050505050505050505050505050505050502020202020202020202020202020202020202020209b % 50505050505050505050505050505050505050505050502020202020202020202020202020202020 % 2020209b5050505050505050509b2929a9ff % ff62626220505050505050505020205050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505020505050505050505050505050505050505050509b9b % 50505050505050505050505050505050505050505050502050505050505050505050505050505050 % 5050509b5050505050505050509b2929a9ff % ff62626220505050505050505020205050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505020505050505050505050505050505050505050509b9b % 50505050505050505050505050505050505050505050502050505050505050505050505050505050 % 5050509b5050505050505050509b2929a9ff % ff62626220505050505050505020205050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505020505050505050505050505050505050505050509b9b % 50505050505050505050505050505050505050505050502050505050505050505050505050505050 % 5050509b5050505050505050509b2929a9ff % ff62626220505050505050505020205050505050ff50ff50505050ff50505050509b9b5050505050 % 505050505050505050505050505050505050205050505050505050ff505050505050505050509b9b % 505050505050505050505050505050505050505050505020505050505050ff505050505050505050 % 5050509b5050505050505050509b2929a9ff % ff62626220505050505050505020205050505050505050ff5050ff5050505050509b9b5050505050 % 505050505050505050505050505050505050205050505050505050ffff5050ffff50ffff50509b9b % 505050505050505050505050505050505050505050505020505050505050ff505050ff5050ffff50 % 5050509b5050505050505050509b2929a9ff % ff62626220505050505050505020205050505050505050ff50ff505050505050509b9b5050505050 % 50505050505050505050505050505050505020505050ffffff5050ff5050ff505050ff5050509b9b % 505050505050505050505050505050505050505050505020505050ffffffff5050ff5050505050ff % 5050509b5050505050505050509b2929a9ff % ff62626220505050505050505020205050505050505050ff5050505050505050509b9b5050505050 % 505050505050505050505050505050505050205050505050505050ff5050ff505050ff5050509b9b % 505050505050505050505050505050505050505050505020505050505050ff5050ff505050505050 % 5050509b5050505050505050509b2929a9ff % ff62626220505050505050505020205050505050ff50ff505050505050505050509b9b5050505050 % 505050505050505050505050505050505050205050505050505050ff5050ff50ff50ff5050509b9b % 505050505050505050505050505050505050505050505020505050505050ff5050ff50ff50ff50ff % 5050509b5050505050505050509b2929a9ff % ff62626220505050505050505020205050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505020505050505050505050505050505050505050509b9b % 50505050505050505050505050505050505050505050502050505050505050505050505050505050 % 5050509b5050505050505050509b2929a9ff % ff62626220505050505050505020205050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505020505050505050505050505050505050505050509b9b % 50505050505050505050505050505050505050505050502050505050505050505050505050505050 % 5050509b5050505050505050509b2929a9ff % ffa9a96220505050505050505020205050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505020505050505050505050505050505050505050509b9b % 50505050505050505050505050505050505050505050502050505050505050505050505050505050 % 5050509b5050505050505050509b29a9a9ff % ff2962a920505050505050505020209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050 % 505050505050505050505050505050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 5050505050505050505050505050505050505050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b5050505050505050509b296262ff % ff2962a9205050505050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050 % 5050505050505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 50505050505050505050505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b5050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b296262ff % ff2962a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffff296262ff % ff6262626262626262626262626262a9626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62622962626262626262626262626262a9ff % ff6262626262626262a9a9a9a9a9a9a929a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9 % a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262626262626262626262 % 62a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262 % 626229626262626262a9a9a9a9a9a9a9a9ff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffff %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice /pop load def %%EndProlog %%Page 1 1 /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 286 string def gsave 237.36 246.12 translate 137.28 269.76 scale 286 562 8 [ 286 0 0 -562 0 562 ] { picstr readstring } image 80008000e2000000e3d6019d5680d6a4d6019d56e2d6019d007f00d6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6 d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69d5656d6d61dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69d56000300d69dd6e59d0256d6d6809da59d02 56d6d6e59d02569d000200d6d6e49d0156d6809da49d0156d6e39d015600 7f00d69dd69d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d567f9d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d561d9d569d569d569d569d569d 569d569d569d569d569d569d569dd69d569d007f00d6d69d9d9d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d7f56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d1d569d569d569d569d569d569d569d569d569d569d569d 569dd69d9d9d56000600d69dd69d569d80008000f00006d69dd69d569d00 0700d6d69d9d9d560080d680d6f2d60700d6d69d9d9d56007f00d69dd69d 569d00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6d6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69d9dd6d61d9dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd600d69dd69d569d000800d6d69d9d9d5600d6ea9d0156d6809d bd9d0256d6d6ea9d0156d6ea9d085600d6d69d9d9d56000900d69dd69d56 9d00d6d6eb9d0256d6d6809dbf9d025656d6e99d0556d6d69d9d9df200fc 9d085600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6f19df9 00069d00009d9d0000809dda9d0256d6d6eb9d025656d6fc9d0000f49d0d 009d9d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6 d6f29d010000fa9d0500009d9d0000809ddb9d025656d6e99d0656d6d69d 9d9d00f49d0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6 eb9d025656d6f19d010000f79d010000809dd99d0256d6d6eb9d025656d6 fc9d0000f49d0d00009d9d565600d6d69d9d9d56000900d69dd69d569d00 d6d6eb9d0256d6d6f39d010000fa9d0800009d9d00009d9d9dfc00fc9dfc 00809de99d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d6 9dd69d569d000800d6d69d9d9d5600d6eb9d025656d6f29d010000fa9d15 00009d9d00009d9d00009d9d00009d9d00009d9d0000809de99d0256d6d6 eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00d6 9dd69d569d00d6d69d9df000fd9d0256d6d6f39dfa00139d9d00009d0000 9d9d00009d9d9d00009d9d0000809de69d025656d6f89dfc00f59d0656d6 d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000c00d6d69d9d9d56 00d69d9d9d00f29d05009d9d5656d6f39d010000fa9d0700009d9d00009d 9dfa00fc9dfd00809de79d0256d6d6f99d04009d9d0000f79d025656d6fc 9d0000f49d0d00009d9d565600d6d69d9d9d56000c00d69dd69d569d00d6 d69d9d00f29d0600009d9d56d6d6f49d010000fa9d0800009d9d00009d00 00f59d010000809de99d025656d6f89d04009d9d0000f69d0656d6d69d9d 9d00f49d0d00009d9d9d5600d69dd69d569d000b00d6d69d9d9d5600d69d 9d9def00039d5656d6f39d010000fa9d0800009d9d00009d0000fa9d0600 009d9d9d0000809de89d0256d6d6f99dfb00f79d025656d6fc9d0000f49d 0d00009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6fc9df100 049d9d56d6d6f59d010000fa9d1500009d9d00009d9d00009d9d00009d9d 00009d9d0000809de89d025656d6f79dfc00f69d0656d6d69d9d9d00f49d 0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656 d6f49d010000fa9d0800009d9d00009d9d9dfc00fc9dfc00809de69d0256 d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d560009 00d69dd69d569d00d6d6eb9d0256d6d6809dbf9d025656d6e99d0656d6d6 9d9d9d00f49d0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600 d6eb9d025656d6809dbd9d0256d6d6eb9d025656d6fc9d0000f49d0d0000 9d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6d680 9dbf9d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd6 9d569d000800d6d69d9d9d5600d6eb9d025656d6809dbd9d0256d6d6eb9d 025656d6fc9df1000b9d9d565600d6d69d9d9d56000900d69dd69d569d00 d6d6eb9d0256d6d6809dbf9d025656d6e99d0256d6d6fb9df300fd9d0856 00d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6809dbd9d0256 d6d6eb9d025656d6eb9d09565600d6d69d9d9d56007f00d69dd69d569d00 d69d9d569d569d569d569d569d569d569d569d569d569d56d6569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 7f9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d5656d69d569d569d569d569d569d569d569d569d 569d569d569d56d6561d9d569d569d569d569d569d569d569d569d569d56 9d5600d69dd69d569d0008009d569d9d9d56009de956009d8056bc56009d e856009de9560700d6d69d569d56000000fb56009d80008000f00001d69d fc56ff000000fcd6029d565680df80dff2df0000fad6ff000800d6d6d69d 569d56df80af80aff4af036400d69dfcd6ff000800d6d69d9d9d5656df80 af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4 af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400 d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d 569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d560008 00d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d69d 9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56 df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80 aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af08 6400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d6 9d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d569d 000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d6 9dd69d569d56dff3aff90004af00afaf0080af8daf086400d69dd69d569d 000800d6d69d9d9d5656dff3af0000f9af0600afaf00afaf0080af90af08 6400d6d69d9d9d56000800d69dd69d569d56dff3af0000f6af0300afaf00 80af90af086400d69dd69d569d000800d6d69d9d9d5656dff3af0000f9af 0a00afaf00af000000afafaffc00fdaf0300af000080af9faf086400d6d6 9d9d9d56000800d69dd69d569d56dff3af0000f9af1300afaf00afaf00af afaf0000afaf0000afaf000080af9daf086400d69dd69d569d000800d6d6 9d9d9d5656dff3affa000cafaf00afaf00afaf00afafaf00fcaf0300afaf 0080af9caf086400d6d69d9d9d56000800d69dd69d569d56dff3af0000f9 af0900afaf00afaf00afafaffa0002afaf0080af9caf086400d69dd69d56 9d000800d6d69d9d9d5656dff3af0000f9af0a00afaf00afaf00afafaf00 f9af000080af9caf086400d6d69d9d9d56000800d69dd69d569d56dff3af 0000f9af0a00afaf00afaf00afafaf00f9af000080af9caf086400d69dd6 9d569d000800d6d69d9d9d5656dff3af0000f9af1200afaf00afaf00afaf af0000afaf0000afaf0080af9caf086400d6d69d9d9d56000800d69dd69d 569d56dff3af0000f9af0a00afaf00afafaf0000afaffc00fdaf000080af 9caf086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af0864 00d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd6 9d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d5600 0800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d6 9d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d 56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af 80aff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af80648c64 f4af086400d69dd69d569d000800d6d69d9d9d5656dff4af80648d6400df f4af086400d6d69d9d9d56000800d69dd69d569d56dff4af01646480af90 af01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af0164 6480af90af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56df f4af01646480af90af01dfdff4af086400d69dd69d569d000800d6d69d9d 9d5656dff4af01646480af90af01dfdff4af086400d6d69d9d9d56000800 d69dd69d569d56dff4af01646480af90af01dfdff4af086400d69dd69d56 9d000800d6d69d9d9d5656dff4af01646480af90af01dfdff4af086400d6 d69d9d9d56000800d69dd69d569d56dff4af01646480af90af01dfdff4af 086400d69dd69d569d000800d6d69d9d9d5656dff4af01646480af90af01 dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af016464fa af0000fcaf0000d8af0000eaaf0200af00faaf0000f4af0000d5af0000ea af0000f5af0000f9af0000faaf0000fcaffd00e9af0000fcaf0400afafaf 00f8af01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af 016464faaf0000fcaf0000d8af0000eaaf0200af00faaf0000f4af0000d5 af0000eaaf0000f7affd00fbaffd00faaf0900afaf0000afafaf0000ebaf 0000fcaf0600af00af00af00faaf01dfdff4af086400d6d69d9d9d560008 00d69dd69d569d56dff4af016464faaf0400afafaf00d8af0000eaaf0300 afaf00eeaf0000beaf0000f4af0000f9af0000fbaf0400afafaf00fbaf00 00e7af0600afafaf000000f9af01dfdff4af086400d69dd69d569d000800 d6d69d9d9d5656dff4af016464faaf0b00afafaf00afaf00af000000fcaf fd0009af00afaf00af0000afaffc00fdaf0400af000000fcaf0f00afafaf 000000afafaf00af0000afaffc00fdaf1100afaf00af000000afaf00afaf 00af000000fcaf0b00afafaf000000af00afafaffc00fcaffc00fdaf0a00 af0000afaf0000afaf00fbaf0500af00afafaffc0016afaf00afafaf00af afaf00afafaf00af0000afafaf0000fcaf0000f9af0000fbaf0300afaf00 f9af0000faaffd00fcaffd000faf00afaf00afafaf00afaf00af00af00fa af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af0164 64fbaf7f0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000 afafaf0000afaf0000afaf0000afaf0000afafaf00afaf00afafaf00afaf 0000afafaf0000afaf0000afaf00afaf0000afaf0000af00afaf0000afaf 0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000 afaf0000afaf0000afaf00af0000fbaf1f00af00afaf0000afaf0000af00 afafaf00afafaf00afafaf00afaf00afafaf00fbaf0000f9af0000fbaf03 00afaf00f9af0000fbaf1300afafaf00afaf0000afaf0000afaf00afafaf 00fcaf0000f8af01dfdff4af086400d69dd69d569d000800d6d69d9d9d56 56dff4af016464faaf0700afaf00afafaf00fcaf0300afaf00fcaf0300af af00f7af0300afaf00fcaf0800afaf00afafaf0000fbaf0000fcaf0000fa af0400afafaf00fcaf0500af00afaf00fcaf0700afaf00afafaf00fcaf03 00afaf00fcaf0300afaf00fcaf1800afaf00afafaf00afafaf00afaf00af afaf00afaf00afaf00fcaf0d00af00afafaf00afafaf00afaf00fcaf0200 af00faaf0000f9af0000fcaf0400afafaf00f9af0000fbaf010000fbaf00 00fcaf0600afaf00afaf00f2af01dfdff4af086400d6d69d9d9d56000800 d69dd69d569d56dff4af016464faaf0700afaf00afafaf00fcaf0300afaf 00fcaf0300afaf00fbaffb0002afaf00fcaf0300afaf00fcaffd00fdaf00 00fcaf0000faaf0400afafaf00fcaf0500af00afaf00fcaf0700afaf00af afaf00fcaf0200afaffa0002afaf00fcaf1700afaf00afafaf00afafaf00 afaf00afafaf00afaf00afaffa000cafaf00afaf00afaf00afafaf00fbaf 0000f9af0000f9af0000fcaf0400afafaf00f9af0000faaffd00fdaf0000 fcaf0600afaf00afaf00f2af01dfdff4af086400d69dd69d569d000800d6 d69d9d9d5656dff4af016464faaf0700afaf00afafaf00fcaf0300afaf00 fcaf0300afaf00fcaf080000afafaf00afaf00fcaf0300afaf00faaf0400 00afaf00fcaf0000faaf0400afafaf00fcaf0500af00afaf00fcaf0700af af00afafaf00fcaf0300afaf00f9af0000fcaf1800afaf00afafaf00afaf af00afaf00afafaf00afaf00afaf00f9af0a00afaf00afaf00afafaf00fb af0000f9af0000f9af0000fcaf0400afafaf00f9af0000f8af040000afaf 00fcaf0600afaf00afaf00f2af01dfdff4af086400d6d69d9d9d56000800 d69dd69d569d56dff4af016464faaf0200af00fcaf0000fcaf0300afaf00 fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf0200af00f8af0300afaf 00fcaf0000fcaf010000fcaf0000fcaf0500af00afaf00fcaf0200af00fc af0000fcaf0300afaf00f9af0000fcaf1800afaf00afafaf00afafaf00af afaf00af00afafaf00afaf00f9af0900af00af00af00afaf00fbaf0200af 00faaf0000f9af0400afafaf00fbaf0000fbaf0000f6af0300afaf00fcaf 0500afaf00af00f1af01dfdff4af086400d69dd69d569d000800d6d69d9d 9d5656dff4af016464fbaf030000af00fcaf0000fcaf0b00afaf0000afaf 0000afaf00fcaf0f0000afaf0000afaf0000afaf0000af00fcaf0700afaf af00afaf00fcaf060000afaf000000fcaf0a0000afaf0000af00afaf00fc af0200af00fcaf3e0000afaf0000afaf0000afaf0000afaf0000afaf0000 afaf00afafaf00afafaf00afafaf00af00afafaf00afaf0000afaf0000af afaf00afafaf00afafaf00fcaf0400afafaf00fbaf0000f9af0400afafaf 00fbaf1e0000afafaf0000afafaf00afaf00afafaf00afaf0000afaf0000 afaf00af00f1af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d 56dff4af016464faaf0200af00fcaf0000fcaf0b00afafaf000000af00af af00fbaffd000baf0000af00af000000afaf00fbaffd00fdaf0000fbaffc 0001af00fcaf0a00af000000afaf00afaf00fcaf0200af00fbaffd0004af 00afafaffc00fcaffc00fdaf0800afafaf00afafaf00fcaf0000fcaf0300 afafaffc00fcaf1200afafaf00afafaf00afafaf0000afafaf0000fcaf00 00f9af0400afafaf00f9affd00fbaf0600afafaf000000fcaffd0006af00 afaf00af00f1af01dfdff4af086400d69dd69d569d000800d6d69d9d9d56 56dff4af016464e6af0000f1af0000c3af00008eaf0000ecaf01dfdff4af 086400d6d69d9d9d56000800d69dd69d569d56dff4af016464ebaf050000 afaf0000f1af0000c8af050000afaf000093af050000afaf0000ecaf01df dff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af016464eaaf fc00f0af0000c7affc0091affc00ebaf01dfdff4af086400d6d69d9d9d56 000800d69dd69d569d56dff4af01646480af90af01dfdff4af086400d69d d69d569d000800d6d69d9d9d5656dff4af01646480af90af01dfdff4af08 6400d6d69d9d9d56000800d69dd69d569d56dff4af01646480af90af01df dff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af01646480af 90af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af01 646480af90af01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656 dff4af01646480df8edff4af086400d6d69d9d9d56000800d69dd69d569d 56dff4af006480df8ddff4af086400d69dd69d569d000800d6d69d9d9d56 56df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af 80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af 086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d6 9dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d 56000800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800 d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d 569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df 80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80af f4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af0864 00d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd6 9d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d5600 0800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d6 9d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d 56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656dff3af fb00fbaf0000d9af0000b7aff90004af00afaf0089af086400d6d69d9d9d 56000800d69dd69d569d56dff3af0000fcaf050000afafaf00eaaf0000f0 af0000b7af0000f9af0300afaf0089af086400d69dd69d569d000800d6d6 9d9d9d5656dff3af0000fbaf0000e6af0000a6af0000f6af000089af0864 00d6d69d9d9d56000800d69dd69d569d56dff3af0000faaf0b00afaf00af af00af0000afaffc00fcaffc0006af000000afafaffc00fdaf0800af0000 af00afafaffc00fcaffd00c5af0000f9af0600afaf00afafaffc00fcaffd 0097af086400d69dd69d569d000800d6d69d9d9d5656dff3af0000faaf3a 00afaf00afaf0000afafaf0000afaf0000afaf0000afaf0000af00afafaf 0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf00afafaf00c6 af0000f9af1200afaf00afaf0000afaf0000afaf00afafaf0098af086400 d6d69d9d9d56000800d69dd69d569d56dff3af0000faaf0600afaf00afaf 00fcaf0000fcaf0300afaf00faaf0400afafaf00fcaf0300afaf00fcaf03 00afaf00fcaf0400afaf0000c3affa0008afaf00afaf00afaf00fcaf0400 afaf000095af086400d69dd69d569d000800d6d69d9d9d5656dff3af0000 faaf0600afaf00afaf00fcaffa0002afaf00faaf0400afafaf00fcaf0300 afaf00fcaf0200afaffa00fdaffd00c5af0000f9af0500afaf00afaffa00 fdaffd0097af086400d6d69d9d9d56000800d69dd69d569d56dff3af0000 faaf0600afaf00afaf00fcaf0000f9af0000faaf0400afafaf00fcaf0300 afaf00fcaf0300afaf00f6af010000c6af0000f9af0600afaf00afaf00f6 af01000098af086400d69dd69d569d000800d6d69d9d9d5656dff3af0000 fbaf0700afafaf00afaf00fcaf0000f9af0000fcaf0600af00afafaf00fc af0300afaf00fcaf0300afaf00f5af0000c6af0000f9af0600afaf00afaf 00f5af000098af086400d6d69d9d9d56000800d69dd69d569d56dff3af00 00fcaf080000afafaf00afaf00fcaf1b0000afaf0000afaf0000afaf0000 af00afafaf0000afaf0000afaf00fcaf0f00afaf0000afaf0000afaf00af afaf00c6af0000f9af1200afaf00afaf0000afaf0000afaf00afafaf0098 af086400d69dd69d569d000800d6d69d9d9d5656dff3affb00fbaf0300af af00fbaffc00fcaffc00fdaf030000afaffc00fdaf0000fcaf0300afafaf fc00fcaffd00c5af0000f9af0600afaf00afafaffc00fcaffd0097af0864 00d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd6 9d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d5600 0800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d6 9d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d 56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656dff6af a164fcaff164f6af9864fcaff164f5af086400d6d69d9d9d56000800d69d d69d569d56dff6afa26400dffcaff26400dff6af996400dffcaff26400df f5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01 dfdffcaf016464fb9500dffb9501dfdff6af0164649caf01dfdffcaf0164 64fb9500dffb9501dfdff5af086400d6d69d9d9d56000800d69dd69d569d 56dff6af016464a5af01dfdffcaf016464fc9502dfdf64fc9501dfdff6af 0164649caf01dfdffcaf016464fc9502dfdf64fc9501dfdff5af086400d6 9dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf0164 64fc9502dfdf64fc9501dfdff6af0164649caf01dfdffcaf016464fc9502 dfdf64fc9501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56df f6af046464afafafab00fdaf01dfdffcaf0e6464959595dfdfaf64649595 95dfdff6af0164649caf01dfdffcaf0e6464959595dfdfaf6464959595df dff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af046464afaf afab00fdaf01dfdffcaf0e6464959595dfdfaf6464959595dfdff6af0164 649caf01dfdffcaf0e6464959595dfdfaf6464959595dfdff5af086400d6 d69d9d9d56000800d69dd69d569d56dff6af046464afafaff10000aff500 00aff90000affa0000affc00fdafe90000affc0000affa00fdaf01dfdffc af0e64649595dfdfafafaf64649595dfdff6af016464fcaff90006afaf00 afafaf00faaff900fcaffd00c2af01dfdffcaf0e64649595dfdfafafaf64 649595dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af04 6464afafaff10000aff700fdaffb00fdaffa0009af0000afaf000000afaf eb0000affc0000affa00fdaf01dfdffcaf0e64649595dfdfafafaf646495 95dfdff6af016464fcaf0000f8af0400afafaf00faaf0000f8af060000af afaf0000c4af01dfdffcaf0e64649595dfdfafafaf64649595dfdff5af08 6400d6d69d9d9d56000800d69dd69d569d56dff6af046464afafaff20000 aff40000aff90000affb0004af000000affb0000afe70000aff900fdaf01 dfdffcaf04646495dfdffbaf04646495dfdff6af016464fcaf0000f8af04 00afafaf00faaf0000f8af0000fbaf0000c4af01dfdffcaf04646495dfdf fbaf04646495dfdff5af086400d69dd69d569d000800d6d69d9d9d5656df f6af1b6464afafaf0000af000000af000000af000000af00afaf000000af affc0000aff90000affb0003af0000aff90000affa00fdaffc00fdaf0800 af0000af000000aff900fdaf01dfdffcaf04646495dfdffbaf04646495df dff6af016464fcaf0000f8af0400afafaf00faaf0000f8af0000beaf01df dffcaf04646495dfdffbaf04646495dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464fcaf1400af000000af000000af000000 af0000af000000affb0000aff90000affb0003af0000aff90000affb0013 af000000af0000afaf0000afaf0000af000000aff900fdaf01dfdffcaf03 6464dfdff76401dfdff6af016464fcaf0000f8af0400afafaf00faaf0000 f7af010000c0af01dfdffcaf036464dfdff76401dfdff5af086400d69dd6 9d569d000800d6d69d9d9d5656dff6af016464fcaf0c00af000000af0000 00af0000affc0002af00affa0000aff90000affc0004af000000aff90000 affb0001afaffb0000affc0006af0000af0000aff800fdaf01dfdffcaf02 6464dff66401dfdff6af016464fcaffa00fdaf0400afafaf00faaffa00fa af010000c2af01dfdffcaf026464dff66401dfdff5af086400d6d69d9d9d 56000800d69dd69d569d56dff6af016464fcaf0c0000af0000af0000af00 0000affb0000aff90000aff90000affc0004af000000aff90000affa00fd affd0000affc0006af0000af0000aff800fdaf01dfdffcaf016464f59501 dfdff6af016464fcaf0000f8af0400afafaf00faaf0000f3af010000c4af 01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d 9d9d5656dff6af126464afafaf000000af0000af0000af000000affb0000 aff90000aff90000affc0004af000000aff90000aff80004afaf0000affc 0006af0000af0000aff800fdaf01dfdffcaf016464f3dff6af016464fcaf 0000f8af0400afafaf00faaf0000f2af0000c4af01dfdffcaf016464f3df f5af086400d6d69d9d9d56000800d69dd69d569d56dff6af116464afafaf 000000af00af00af00af0000affb0002af00affa0000aff90004af000000 affb0000affb0000aff60003af0000affc0005af0000af00aff700fdaf01 dfdffcaf016464f6df0264dfdff6af016464fcaf0000f8af0400afafaf00 faaf0000f8af0000fbaf0000c4af01dfdffcaf016464f6df0264dfdff5af 086400d69dd69d569d000800d6d69d9d9d5656dff6af016464fcaffd0008 af000000af000000affc0004af000000affb0000aff90004af000000affb 001eafaf000000afaf000000af0000af000000af0000afaf0000afaf0000 af00affc0000affc00fdaf01dfdffcaf036464dfdff9af036464dfdff6af 016464fcaf0000f8af0400afafaf00faaf0000f8af060000afafaf0000c4 af01dfdffcaf036464dfdff9af036464dfdff5af086400d6d69d9d9d5600 0800d69dd69d569d56dff6af046464afafaffc0012af000000af000000af 000000afaf000000afaffc0000aff90004af000000aff900fdaffb0006af 000000afafaffc00fdaf0600af0000af00affc0000affc00fdaf01dfdffc af036464dfdff9af036464dfdff6af016464fcaf0000f8af0300afafaffa 0000aff900fcaffd00c2af01dfdffcaf036464dfdff9af036464dfdff5af 086400d69dd69d569d000800d6d69d9d9d5656dff6af046464afafafba00 00aff200fdaf01dfdffcaf036464dfdff9af036464dfdff6af0164649caf 01dfdffcaf036464dfdff9af036464dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af046464afafafbf0005afaf0000afaff200fdaf 01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf03 6464dfdff9af036464dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af046464afafafbe00fcaff100fdaf01dfdffcaf036464dfdff9 af036464dfdff6af0164649caf01dfdffcaf036464dfdff9af036464dfdf f5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01 dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf0364 64dfdff9af036464dfdff5af086400d69dd69d569d000800d6d69d9d9d56 56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164 649caf01dfdffcaf036464dfdff9af036464dfdff5af086400d6d69d9d9d 56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9 af036464dfdff6af0164649caf01dfdffcaf036464dfdff9af036464dfdf f5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01 dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf0364 64dfdff9af036464dfdff5af086400d6d69d9d9d56000800d69dd69d569d 56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164 649caf01dfdffcaf036464dfdff9af036464dfdff5af086400d69dd69d56 9d000800d6d69d9d9d5656dff6af016464eeaf0000f5af0000f9af0000fa af0000fcaffd00e9af0000fcaf0000f7af01dfdffcaf036464dfdff9af03 6464dfdff6af056464afafaf00f7af0000f6af0000f1af060000af00afaf 00cbaf01dfdffcaf036464dfdff9af036464dfdff5af086400d6d69d9d9d 56000800d69dd69d569d56dff6af016464eeaf0000f7affd00fbaffd00fa af0900afaf0000afafaf0000ebaf0000fcaf0000f7af01dfdffcaf036464 dfdff9af036464dfdff6af066464afafaf0000f9af010000f6af0000f2af 0700afafaf00afaf00cbaf01dfdffcaf036464dfdff76401dfdff5af0864 00d69dd69d569d000800d6d69d9d9d5656dff6af016464efaf0000f4af00 00f9af0000fbaf0400afafaf00fbaf0000e7af0000f6af01dfdffcaf0364 64dfdff9af036464dfdff6af066464afafaf0000f9af010000f6af0000f2 af0000faaf0000cbaf01dfdffcaf026464dff66401dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af016464fbaf1400afafaf00afaf af00afafaf00af0000afafaf0000fcaf0000f9af0000fbaf0300afaf00f9 af0000faaffd00fcaffd0008af00afaf00afafaf00f6af01dfdffcaf0364 64dfdff9af036464dfdff6af076464afafaf00af00fbaf0500af00afafaf fc00fdaf0700afafaf00afafaffc000dafaf000000afaf00afaf00afafaf fc00d2af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af1a6464afafaf00af00afafaf00afafaf00afaf af00afaf00afafaf00fbaf0000f9af0000fbaf0300afaf00f9af0000fbaf 1300afafaf00afaf0000afaf0000afaf00afafaf00f6af01dfdffcaf0364 64dfdff9af036464dfdff6af076464afafaf00af00fbaf2b00af00afaf00 00afaf0000afaf00afaf00afafaf0000afaf0000afaf00afafaf00afaf00 afaf0000afaf0000d3af01dfdffcaf016464f59501dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af126464afafaf00af00afafaf00 afafaf00afaf00fcaf0200af00faaf0000f9af0000fcaf0400afafaf00f9 af0000fbaf010000fbaf0000fcaf0600afaf00afaf00f5af01dfdffcaf03 6464dfdff9af036464dfdff6af0f6464afafaf00afaf00afafaf00afaf00 f9af0500afaf00af00fcaf0000fcaf0d00afaf00afafaf00afaf00afaf00 fcaf0000d3af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d 000800d6d69d9d9d5656dff6af126464afafaf00afaf00afaf00afaf00af afaf00fbaf0000f9af0000f9af0000fcaf0400afafaf00f9af0000faaffd 00fdaf0000fcaf0600afaf00afaf00f5af01dfdffcaf036464dfdff9af03 6464dfdff6af126464afafaf00afaf00afafaf00afaf00afafaffb0003af af0000fbaffa000bafaf00afafaf00afaf00afaffa00d3af01dfdffcaf01 6464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6 af016464faaf0a00afaf00afaf00afafaf00fbaf0000f9af0000f9af0000 fcaf0400afafaf00f9af0000f8af040000afaf00fcaf0600afaf00afaf00 f5af01dfdffcaf036464dfdff9af036464dfdff6af1c6464afafaf00afaf af00af00afafaf00afaf0000afafaf00afaf00af00fcaf0000f9af0a00af afaf00afaf00afaf00ceaf01dfdffcaf016464f59501dfdff5af086400d6 9dd69d569d000800d6d69d9d9d5656dff6af016464faaf0900af00af00af 00afaf00fbaf0200af00faaf0000f9af0400afafaf00fbaf0000fbaf0000 f6af0300afaf00fcaf0500afaf00af00f4af01dfdffcaf036464dfdff9af 036464dfdff6af126464afafaf00afafaf00af00afafaf00afaf00fcaf0a 00afaf00afaf00afafaf00f9af0a00afafaf00afaf00afaf00ceaf01dfdf fcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d 56dff6af116464afafaf00afafaf00afafaf00afafaf00fcaf0400afafaf 00fbaf0000f9af0400afafaf00fbaf1e0000afafaf0000afafaf00afaf00 afafaf00afaf0000afaf0000afaf00af00fcaf0300afaf00fcaf01dfdffc af036464dfdff9af036464dfdff6af056464afafaf00fcaf0000fcaf2900 afaf0000afaf0000afaf00afafaf00afaf0000afaf0000afaf00afafaf00 afaf00afaf0000afaf0000d3af01dfdffcaf016464f59501dfdff5af0864 00d69dd69d569d000800d6d69d9d9d5656dff6af016464f9af1200afafaf 00afafaf00afafaf0000afafaf0000fcaf0000f9af0400afafaf00f9affd 00fbaf0600afafaf000000fcaffd0006af00afaf00af00fcaf0300afaf00 fcaf01dfdffcaf036464dfdff9af036464dfdff6af056464afafaf00fcaf 0000fcaf0b00afafaf000000af0000af00fcaf0200afaffc00fdaf0a00af afaf00afaf00afafaffc00d2af01dfdffcaf016464f59501dfdff5af0864 00d6d69d9d9d56000800d69dd69d569d56dff6af016464b7af0000efaf01 dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf0164 64f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af 016464bcaf050000afaf0000efaf01dfdffcaf036464dfdff9af036464df dff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d 9d56000800d69dd69d569d56dff6af016464bbaffc00eeaf01dfdffcaf03 6464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501df dff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af 01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf01 6464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6 af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf 01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d 9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6 af0164649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56 000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af 036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400 d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf03 6464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501df dff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af 01dfdffcaf036464dfdff9af036464dfdff6af056464afafaf00f7af0300 afaf00f5af0000b9af01dfdffcaf016464f59501dfdff5af086400d69dd6 9d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464df dff9af036464dfdff6af066464afafaf0000f9af040000afaf00f5af0000 b9af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d6 9dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464df dff6af066464afafaf0000f9af040000afaf00f5af0000b9af01dfdffcaf 016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656df f6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af076464af afaf00af00fbaf1400af00afaf00afafaf00afafaf000000af00afafaffc 00fdaf0400af000000c8af01dfdffcaf016464f59501dfdff5af086400d6 d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf0364 64dfdff9af036464dfdff6af076464afafaf00af00fbaf2100af00afaf00 afaf00afafaf0000afaf0000afaf0000afaf0000afaf0000afaf0000c9af 01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d 9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6 af146464afafaf00afaf00afafaf00afaf00afaf00af00fcaf0000fcaf03 00afaf00fcaf0300afaf00fcaf0000c9af01dfdffcaf016464f59501dfdf f5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01 dfdffcaf036464dfdff9af036464dfdff6af136464afafaf00afaf00afaf af00afaf00afaf0000fbaf0000fcaf0200afaffa0002afaf00fcaf0000c9 af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d6 9d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af146464afafaf00afafaf00af00afafaf00afaf00af00fcaf0000fcaf 0300afaf00f9af0000fcaf0000c9af01dfdffcaf016464f59501dfdff5af 086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdf fcaf036464dfdff9af036464dfdff6af196464afafaf00afafaf00af00af afaf00afaf00afaf00afafaf00fcaf0300afaf00f9af0000fcaf0000c9af 01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d 9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6 af056464afafaf00fcaf0000fcaf1f00afaf00afafaf00afaf0000afaf00 00afaf0000afaf0000afaf0000afaf0000c9af01dfdffcaf016464f59501 dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5 af01dfdffcaf036464dfdff9af036464dfdff6af056464afafaf00fcaf00 00fcaf0300afaf00fcaf0a00afaf000000af00afafaffc00fdaf0400af00 0000c8af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af016464d9af0000c4af01dfdffcaf016464f59501dfdff5af08 6400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffc af036464dfdff9af036464dfdff6af016464d9af0000c4af01dfdffcaf01 6464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6 af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af016464d9af 0000c4af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d69d d69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af016464fcaf0000f3af0300afaf00f9af0300afaf00f5af0100 00caaf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800 d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaf0000f3af0300afaf00f9af0300afaf00f6af0000c8 af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d6 9d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af016464fcaf0000f0af0000f9af0000f3af0000c8af01dfdffcaf0164 64f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af 016464a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf07 00af000000afaf00fcaf1f00af00afaf00afafaf000000af00afaf00afaf 00af000000afaf000000afafaffc00f9affc00dbaf01dfdffcaf016464f5 9501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af0164 64a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf070000 afaf0000af00fcaf2400af00afaf00afaf0000afaf0000afaf00afaf0000 afaf0000afaf00afafaf0000afaf0000fbaf050000afaf0000dcaf01dfdf fcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d 56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164 64fcaf0000fcaf0200af00fcaf0800af00afaf00afaf00fcaf0600afaf00 afaf00fcaf0700afaf00afafaf00fcaf0000fbaf0000d7af01dfdffcaf01 6464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6 af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf 0000fcaf0200af00fcaf0800af00afaf00afaf00fcaf0600afaf00afaf00 fcaf0700afaf00afafaf00fcaf0000fbaf0000d7af01dfdffcaf016464f5 9501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af0164 64a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000fc af0200af00fcaf0800af00afaf00afaf00fcaf0600afaf00afaf00fcaf07 00afaf00afafaf00fcaf0000fbaf0000d7af01dfdffcaf016464f59501df dff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af 01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000fcaf0200 af00fcaf0800af00afaf00afaf00fcaf0600afaf00afaf00fcaf0700afaf 00afafaf00fcaf0000fbaf0000fcaf0000dcaf01dfdffcaf016464f59501 dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5 af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf1f0000afaf 0000af0000afaf0000af00afaf00afaf0000afaf0000afaf00afaf00fcaf 1700afaf00afafaf0000afaf0000afaf00afaf0000afaf0000dcaf01dfdf fcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d56 56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164 64fcaf1f00af000000afafaf000000af00af00afaf00afafaf000000af00 afaf00afaf00fcaf0300afaf00fcaffc00fdaf0300afafaffc00dbaf01df dffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d69d d69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af016464fcaf0000f3af0300afaf 00f9af0300afaf00f5af010000caaf01dfdffcaf016464f59501dfdff5af 086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdf fcaf036464dfdff9af036464dfdff6af016464fcaf0000f3af0300afaf00 f9af0300afaf00f6af0000c8af01dfdffcaf016464f59501dfdff5af0864 00d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af016464fcaf0000f0af0000f9af0000f3 af0000c8af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d00 0800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af03 6464dfdff6af016464fcaf0700af000000afaf00fcaf1f00af00afaf00af afaf000000af00afaf00afaf00af000000afaf000000afafaffc00f9affc 00dbaf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800 d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaf070000afaf0000af00fcaf2400af00afaf00afaf00 00afaf0000afaf00afaf0000afaf0000afaf00afafaf0000afaf0000fbaf 050000afaf0000dcaf01dfdffcaf016464f59501dfdff5af086400d69dd6 9d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464df dff9af036464dfdff6af016464fcaf0000fcaf0200af00fcaf0800af00af af00afaf00fcaf0600afaf00afaf00fcaf0700afaf00afafaf00fcaf0000 fbaf0000fcaf0000dcaf01dfdffcaf016464f59501dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af016464fcaf0000fcaf0200af00fcaf0800af00 afaf00afaf00fcaf0600afaf00afaf00fcaf0700afaf00afafaf00fcaf00 00fbaf0000fcaf0000dcaf01dfdffcaf016464f59501dfdff5af086400d6 9dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf0364 64dfdff9af036464dfdff6af016464fcaf0000fcaf0200af00fcaf0800af 00afaf00afaf00fcaf0600afaf00afaf00fcaf0700afaf00afafaf00fcaf 0000fbaf0000fcaf0000dcaf01dfdffcaf016464f59501dfdff5af086400 d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf03 6464dfdff9af036464dfdff6af016464fcaf0000fcaf0200af00fcaf0800 af00afaf00afaf00fcaf0600afaf00afaf00fcaf0700afaf00afafaf00fc af0000fbaf0000fcaf0000dcaf01dfdffcaf016464f59501dfdff5af0864 00d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af016464fcaf1f0000afaf0000af0000af af0000af00afaf00afaf0000afaf0000afaf00afaf00fcaf1700afaf00af afaf0000afaf0000afaf00afaf0000afaf0000dcaf01dfdffcaf016464f5 9501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af0164 64a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf1f00af 000000afafaf000000af00af00afaf00afafaf000000af00afaf00afaf00 fcaf0300afaf00fcaffc00fdaf0300afafaffc00dbaf01dfdffcaf016464 f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d69d d69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fbaffc00fdaffc00fdaf1200af0000afaf0000afafaf00af0000afaf 0000f9affc00cdaf01dfdffcaf016464f59501dfdff5af086400d69dd69d 569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdf f9af036464dfdff6af016464fcaf220000afaf0000af0000afaf0000afaf 0000afaf0000afaf00afaf0000afaf0000afaf00fbaf050000afaf0000ce af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69d d69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af016464fcaf0000faaf0000fcaf1600afaf00afafaf00afafaf00afaf 00afafaf00afafaf00fbaf0000c9af01dfdffcaf016464f59501dfdff5af 086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdf fcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0000fcaf16 00afaf00afafaf00afafaf00afaf00afafaf00afafaf00fbaf0000c9af01 dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d 569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af 016464fcaf0000faaf0000fcaf1600afaf00afafaf00afafaf00afaf00af afaf00afafaf00fbaf0000c9af01dfdffcaf016464f59501dfdff5af0864 00d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af016464fcaf0000fcaf0200af00fcaf16 00afaf00afafaf00afafaf00afaf00afafaf00afafaf00fbaf0000fcaf00 00ceaf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800 d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaf2d0000afaf0000af0000afaf0000afaf00afafaf00 afafaf00afaf00afafaf00afafaf00afaf00afaf0000afaf0000ceaf01df dffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fbaffc00fdaffc00fdaf1900afafaf00afafaf00afaf00afafaf00af afaf00afaf00afafaffc00cdaf01dfdffcaf016464f59501dfdff5af0864 00d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501 dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5 af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf 016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56df f6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649c af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d6 9d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af0164649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d 56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9 af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af0864 00d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501 dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5 af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf 016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656df f6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649c af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69d d69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af0164649caf01dfdffcaf016464f59501dfdff5af086400d69dd69d56 9d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9 af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af0864 00d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501 dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5 af01dfdffcaf036464dfdff9af036464dfdff6af016464fbaffc00fdaffc 00fdaf1200af0000afaf0000afafaf00af0000afaf0000f9affc00cdaf01 dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d 569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af 016464fcaf220000afaf0000af0000afaf0000afaf0000afaf0000afaf00 afaf0000afaf0000afaf00fbaf050000afaf0000ceaf01dfdffcaf016464 f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000 faaf0000fcaf1600afaf00afafaf00afafaf00afaf00afafaf00afafaf00 fbaf0000fcaf0000ceaf01dfdffcaf016464f59501dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af016464fcaf0000faaf0000fcaf1600afaf00af afaf00afafaf00afaf00afafaf00afafaf00fbaf0000fcaf0000ceaf01df dffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fcaf0000faaf0000fcaf1600afaf00afafaf00afafaf00afaf00afaf af00afafaf00fbaf0000fcaf0000ceaf01dfdffcaf016464f59501dfdff5 af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af016464fcaf0000fcaf0200af00 fcaf1600afaf00afafaf00afafaf00afaf00afafaf00afafaf00fbaf0000 fcaf0000ceaf01dfdffcaf016464f59501dfdff5af086400d69dd69d569d 000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af 036464dfdff6af016464fcaf2d0000afaf0000af0000afaf0000afaf00af afaf00afafaf00afaf00afafaf00afafaf00afaf00afaf0000afaf0000ce af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69d d69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af016464fbaffc00fdaffc00fdaf1900afafaf00afafaf00afaf00afaf af00afafaf00afaf00afafaffc00cdaf01dfdffcaf016464f59501dfdff5 af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d69d d69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af016464f7af0000a6af01dfdffcaf016464f59501dfdff5af08 6400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffc af036464dfdff9af036464dfdff6af016464f7af0000a6af01dfdffcaf01 6464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6 af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af016464f7af 0000a6af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff76401df dff6af016464fbaffd0009af00afaf00af0000afaffc000dafaf00afafaf 00afafaf00afafaffc00fdaf0300af0000fbaffc00d4af01dfdffcaf0164 64f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af 016464a5af01dfdffcaf026464dff66401dfdff6af016464fcaf280000af af0000afaf0000afafaf0000afaf0000af00afafaf00afafaf00afaf0000 afaf0000afaf0000faaf050000afaf0000d5af01dfdffcaf016464f59501 dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5 af01dfdffcaf016464f59501dfdff6af016464fcaf0000fcaf0300afaf00 f7af0d00af00afafaf00afafaf00afaf00fcaf0300afaf00f9af0000d0af 01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d 9d9d5656dff6af016464a5af01dfdffcaf016464f3dff6af016464fcaf00 00fcaf0300afaf00fbaffb000bafaf00afaf00afaf00afafaffa0002afaf 00f9af0000d0af01dfdffcaf016464f3dff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf016464f7df036464df dff6af016464fcaf0000fcaf0300afaf00fcaf120000afafaf00afaf00af af00afaf00afafaf00f9af0000f9af0000d0af01dfdffcaf016464f7df03 6464dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af0164 64a5af01dfdffcaf04646495dfdffbaf04646495dfdff6af016464fcaf00 00fcaf0300afaf00fcaf0000fcaf0d00afaf00af00af00af00afafaf00f9 af0000f9af0000fcaf0000d5af01dfdffcaf04646495dfdffbaf04646495 dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5 af01dfdffcaf04646495dfdffbaf04646495dfdff6af016464fcaf080000 afaf0000afaf00fcaf0d0000afaf0000afafaf00afafaf00fcaf080000af af0000afaf00fcaf0800afaf0000afaf0000d5af01dfdffcaf04646495df dffbaf04646495dfdff5af086400d69dd69d569d000800d6d69d9d9d5656 dff6af016464a5af01dfdffcaf0e64649595dfdfafafaf64649595dfdff6 af016464fbaffd0004af00afaf00fbaffd0009af0000afaf00afafaf00fb affc00fdaf0000fcaf0300afafaffc00d4af01dfdffcaf0e64649595dfdf afafaf64649595dfdff5af086400d6d69d9d9d56000800d69dd69d569d56 dff6af016464a5af01dfdffcaf0e64649595dfdfafafaf64649595dfdff6 af0164649caf01dfdffcaf0e64649595dfdfafafaf64649595dfdff5af08 6400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffc af0e6464959595dfdfaf6464959595dfdff6af0164649caf01dfdffcaf0e 6464959595dfdfaf6464959595dfdff5af086400d6d69d9d9d56000800d6 9dd69d569d56dff6af016464a5af01dfdffcaf0e6464959595dfdfaf6464 959595dfdff6af0164649caf01dfdffcaf0e6464959595dfdfaf64649595 95dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464 a5af01dfdffcaf016464fc9502df6464fc9501dfdff6af0164649caf01df dffcaf016464fc9502df6464fc9501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf016464fc9502df6464 fc9501dfdff6af0164649caf01dfdffcaf016464fc9502df6464fc9501df dff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af 01dfdffcaf016464fb950064fb9501dfdff6af0164649caf01dfdffcaf01 6464fb950064fb9501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a3dffcaf016464f3dff6af0164649adffcaf016464f3 dff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af0064a2dffc af0064f2dff6af006499dffcaf0064f2dff5af086400d6d69d9d9d560008 00d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d69d 9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56 df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80 aff4af086400d6d69d9d9d56000800d69dd69d569d56dff6afa164e3af98 64e2af086400d69dd69d569d000800d6d69d9d9d5656dff6afa26400dfe3 af996400dfe2af086400d6d69d9d9d56000800d69dd69d569d56dff6af01 6464f79501dfdfd495e8df0295dfdff79501dfdfe3af016464f79501dfdf c995eadf0295dfdff79501dfdfe2af086400d69dd69d569d000800d6d69d 9d9d5656dff6af016464f995fddf0064d495e9df016495fcdff99501dfdf e3af016464f995fddf0064c995ebdf016495fcdff99501dfdfe2af086400 d6d69d9d9d56000800d69dd69d569d56dff6af016464fb95fcdf016464d4 9501dfdfecaf02646495fadffb9501dfdfe3af016464fb95fcdf016464c9 9501dfdfeeaf02646495fadffb9501dfdfe2af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af046464959595fcdf03afaf6464d49501dfdfec af06646495dfdfafaffcdffd9501dfdfe3af046464959595fcdf03afaf64 64c99501dfdfeeaf06646495dfdfafaffcdffd9501dfdfe2af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af02646495fcdffcaf016464d495 01dfdfecaf04646495dfdffcaffcdf0295dfdfe3af02646495fcdffcaf01 6464c99501dfdfeeaf04646495dfdffcaffcdf0295dfdfe2af086400d69d d69d569d000800d6d69d9d9d5656dff6af046464dfdfdffaaf016464d495 01dfdfecaf04646495dfdffaaffd6401dfdfe3af046464dfdfdffaaf0164 64c99501dfdfeeaf04646495dfdffaaffd6401dfdfe2af086400d6d69d9d 9d56000800d69dd69d569d56dff6af02646495fc64fcaf016464d49501df dfecaf04646495dfdffcaffc640295dfdfe3af02646495fc64fcaf016464 c99501dfdfeeaf04646495dfdffcaffc640295dfdfe2af086400d69dd69d 569d000800d6d69d9d9d5656dff6af046464959595fc6403afaf6464d495 01dfdfecaf06646495dfdfafaffc64fd9501dfdfe3af046464959595fc64 03afaf6464c99501dfdfeeaf06646495dfdfafaffc64fd9501dfdfe2af08 6400d6d69d9d9d56000800d69dd69d569d56dff6af016464fb95fa64d495 01dfdfecaf04646495dfdffc64fb9501dfdfe3af016464fb95fa64c99501 dfdfeeaf04646495dfdffc64fb9501dfdfe2af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464f995fc64d49501dfdfea640495df6464 64f99501dfdfe3af016464f995fc64c99501dfdfec640495df646464f995 01dfdfe2af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464 f795016464d49500dfe9640295df64f79501dfdfe3af016464f795016464 c99500dfeb640295df64f79501dfdfe2af086400d69dd69d569d000800d6 d69d9d9d5656dff6af016464a3dfe3af0164649adfe2af086400d6d69d9d 9d56000800d69dd69d569d56dff6af0064a2dfe3af006499dfe2af086400 d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d 9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d569d0008 00d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd6 9d569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656 df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80 aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af08 6400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69d d69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56 000800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6 d69d9d9d5656dff6af80df88dff6af086400d6d69d9d9d56000800d69dd6 9d569d56dff6af80df89df0064f6af086400d69dd69d569d000800d6d69d 9d9d5656dff6af80df8adf016464f6af086400d6d69d9d9d56000800d69d d69d569d56dff6affddf80af8eaffd64f6af086400d69dd69d569d000800 d6d69d9d9d5656dff6affddf80af8eaffd64f6af086400d6d69d9d9d5600 0800d69dd69d569d56dff6affddf80af8eaffd64f6af086400d69dd69d56 9d000800d6d69d9d9d5656dff6affddf80af8eaffd64f6af086400d6d69d 9d9d56000800d69dd69d569d56dff6affddf80af8eaffd64f6af086400d6 9dd69d569d000800d6d69d9d9d5656dff6affddfe1affa00f1af0000f4af 0000faaf000080afd7affd64f6af086400d6d69d9d9d56000800d69dd69d 569d56dff6affddfe1af0000fcaf010000f6af0400afafaf00f4af0000fa af0000f7af000080afe1affd64f6af086400d69dd69d569d000800d6d69d 9d9d5656dff6affddfe1af0000fbaf0000f6af0400afafaf00f4af0000f0 af000080afe1affd64f6af086400d6d69d9d9d56000800d69dd69d569d56 dff6affddfe1af0000fbaf0300afafaffc000bafaf000000afaf00af0000 00f8af0000faaf0b00afafaf000000afaf00000080afe2affd64f6af0864 00d69dd69d569d000800d6d69d9d9d5656dff6affddfe1af0000fcaf1500 00afaf0000afaf0000afaf00afafaf0000afaf0000f9af0000faaf0a00af af00afafaf00afaf0080afe1affd64f6af086400d6d69d9d9d56000800d6 9dd69d569d56dff6affddfe1affa00f8af0700afaf00afafaf00fcaf0000 f9af0000faaf0400afaf0000fbaf000080afe1affd64f6af086400d69dd6 9d569d000800d6d69d9d9d5656dff6affddfe1af0000f7affb0006afaf00 afafaf00fcaf0000f9af0000faaf0a00afafaf000000afafaf0080afe1af fd64f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddfe1af 0000f8af0c0000afafaf00afaf00afafaf00fcaf0000f9af0000faaf0000 fbaf040000afaf0080afe1affd64f6af086400d69dd69d569d000800d6d6 9d9d9d5656dff6affddfe1af0000f8af0000fcaf0700afaf00afafaf00fc af0000f9af0000faaf0000faaf0300afaf0080afe1affd64f6af086400d6 d69d9d9d56000800d69dd69d569d56dff6affddfe1af0000f8af0c0000af af0000afaf00afafaf00fcaf0000f9af0000faaf0a00afaf00afafaf00af af0080afe1affd64f6af086400d69dd69d569d000800d6d69d9d9d5656df f6affddfe1af0000f7affd0008af0000afaf0000af00fcaf0000f9affa00 07af00afafaf000000fcaf01000080afe3affd64f6af086400d6d69d9d9d 56000800d69dd69d569d56dff6affddf80af8eaffd64f6af086400d69dd6 9d569d000800d6d69d9d9d5656dff6affddf80af8eaffd64f6af086400d6 d69d9d9d56000800d69dd69d569d56dff6affddf80af8eaffd64f6af0864 00d69dd69d569d000800d6d69d9d9d5656dff6affddf80af8eaffd64f6af 086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf80649464 05dfafaf646464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6 affddffdaf006480df96df0664dfafaf646464f6af086400d6d69d9d9d56 000800d69dd69d569d56dff6affddffdaf0164df80af97af0664dfafaf64 6464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf 0264dfaf8064996407af64dfafaf646464f6af086400d6d69d9d9d560008 00d69dd69d569d56dff6affddffdaf0264dfaf80649a6408dfaf64dfafaf 646464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6affddffd af0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d6d69d 9d9d56000800d69dd69d569d56dff6affddffdaf0464dfaf646480af9daf 09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d9d9d 5656dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464 f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0464 dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d69dd69d569d 000800d6d69d9d9d5656dff6affddffdaf0464dfaf646480af9daf09dfdf af64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d569d56df f6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af08 6400d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf0464dfaf64 6480af9daf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800 d69dd69d569d56dff6affddffdaf0464dfaf646480af9daf09dfdfaf64df afaf646464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6affd dffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d6 d69d9d9d56000800d69dd69d569d56dff6affddffdaf0464dfaf646480af 9daf09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d 9d9d5656dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf64 6464f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf 0664dfaf6464af0080af9faf09dfdfaf64dfafaf646464f6af086400d69d d69d569d000800d6d69d9d9d5656dff6affddffdaf0664dfaf6464af0080 af9faf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69d d69d569d56dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf 646464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6affddffd af0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d6d69d 9d9d56000800d69dd69d569d56dff6affddffdaf0464dfaf646480af9daf 09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d9d9d 5656dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464 f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0464 dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d69dd69d569d 000800d6d69d9d9d5656dff6affddffdaf0864dfaf6464afafaf00f6af00 00e6af0000d8af0000faaf0000e8af000090af09dfdfaf64dfafaf646464 f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0864 dfaf6464afafaf00f6af0000e6af0000d8af0000faaf0000f6af0000f3af 000090af09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6 d69d9d9d5656dff6affddffdaf0764dfaf6464afaf00f6af0000e6af0000 d8af0000f9af0000f6af0000f4af00008faf09dfdfaf64dfafaf646464f6 af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0a64df af6464afaf00afaf00fcaf0e00afaf00afafaf000000af00afafaffc00fd affd000caf00afafaf00afaf00af000000fcaffd0009af00afaf00af0000 afaffc00fdaf0400af000000fcaf0b00afafaf000000af00afafaffc0007 afaf000000afafaffc00fcaf0b00afafaf000000af00afafaffc00fcaffc 00fdaf0700af0000afaf0000b1af09dfdfaf64dfafaf646464f6af086400 d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf0a64dfaf6464af af00afaf00fcaf7f00afaf00afaf0000afaf0000afaf0000afaf0000af00 00afaf0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000af afaf0000afaf0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf 0000afaf0000afaf00afafaf0000afaf0000afafaf00afaf0000afaf0000 afaf0000afaf0000afaf0000afaf00000aafaf0000afaf0000afaf00b2af 09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d56 9d56dff6affddffdaf0a64dfaf6464af00afafaf00fcaf0600af00afafaf 00fcaf0300afaf00faaf0000fcaf0700afaf00afafaf00fcaf0300afaf00 fcaf0300afaf00f7af0300afaf00fcaf0700afaf00afafaf00fcaf0000f9 af0300afaf00f8af0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf 00fcaf0b00afaf00afafaf00afafaf00b2af09dfdfaf64dfafaf646464f6 af086400d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf0a64df af6464af00afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000 fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fbaffb0002 afaf00fcaf0700afaf00afafaf00fcaf0300afafaffb0002afaf00fcaffb 0006afaf00afafaf00fcaf0200afaffa0002afaf00fcaf0b00afaf00afaf af00afafaf00b2af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56 000800d69dd69d569d56dff6affddffdaf0a64dfaf6464af00afafaf00fc af0600af00afafaf00fcaf0300afaf00faaf0000fcaf0700afaf00afafaf 00fcaf0300afaf00fcaf0300afaf00fcaf080000afafaf00afaf00fcaf07 00afaf00afafaf00fcaf1b00afaf0000afafaf00afaf00afafaf0000afaf af00afaf00afafaf00fcaf0300afaf00f9af0000fcaf0b00afaf00afafaf 00afafaf00b2af09dfdfaf64dfafaf646464f6af086400d69dd69d569d00 0800d6d69d9d9d5656dff6affddffdaf0564dfaf646400fcaf0000fcaf01 0000fcaf0000fcaf0300afaf00fcaf0200af00fcaf0200af00fcaf0000fc af0300afaf00fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf0200af00 fcaf0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0200af00fcaf 0000fcaf0300afaf00f9af0000fcaf0b00afaf00afafaf00afafaf00b2af 09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d56 9d56dff6affddffdaf0564dfaf646400fcaf060000afaf000000fcaf1600 00afaf0000afaf0000afaf0000af0000afaf0000af00fcaf0000fcaf0b00 afaf0000afaf0000afaf00fcaf0f0000afaf0000afaf0000afaf0000af00 fcaf1b0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000af 00fcaf200000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00af afaf00afafaf00b2af09dfdfaf64dfafaf646464f6af086400d69dd69d56 9d000800d6d69d9d9d5656dff6affddffdaf0564dfaf646400fbaffd0002 af0000fbaffd0004af00afafaffc00fdaffd0003af00af00fcaf0000fcaf 0b00afafaf000000af00afaf00fbaffd000baf0000af00af000000afaf00 fbaffd0017af00afafaf000000af0000afaf0000afaf000000af000000fb affd0004af00afafaffc00fcaffc00fdaf0800afafaf00afafaf00b2af09 dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d569d 56dff6affddffdaf0464dfaf6464ebaf0000f2af0000edaf0000f1af0000 d0af000097af09dfdfaf64dfafaf646464f6af086400d69dd69d569d0008 00d6d69d9d9d5656dff6affddffdaf0464dfaf6464f0af050000afaf0000 f7af050000afaf0000f2af050000afaf0000f1af0000d5af050000afaf00 0097af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69d d69d569d56dff6affddffdaf0464dfaf6464efaffc00f5affc00f0affc00 f0af0000d4affc0096af09dfdfaf64dfafaf646464f6af086400d69dd69d 569d000800d6d69d9d9d5656dff6affddffdaf0464dfaf646480af9daf09 dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d569d 56dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464f6 af086400d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf0864df af6464afafaf00f6af0000e6af0000d8af0000faaf000080aff7af09dfdf af64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d569d56df f6affddffdaf0864dfaf6464afafaf00f6af0000e6af0000d8af0000faaf 0000f6af000082af09dfdfaf64dfafaf646464f6af086400d69dd69d569d 000800d6d69d9d9d5656dff6affddffdaf0764dfaf6464afaf00f6af0000 e6af0000d8af0000f9af0000f6af000082af09dfdfaf64dfafaf646464f6 af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0a64df af6464afaf00afaf00fcaf0e00afaf00afafaf000000af00afafaffc00fd affd000caf00afafaf00afaf00af000000fcaffd0009af00afaf00af0000 afaffc00fdaf0400af000000fcaf0b00afafaf000000af00afafaffc0007 afaf000000afafaffc008aaf09dfdfaf64dfafaf646464f6af086400d69d d69d569d000800d6d69d9d9d5656dff6affddffdaf0a64dfaf6464afaf00 afaf00fcaf6300afaf00afaf0000afaf0000afaf0000afaf0000af0000af af0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000afafaf 0000afaf0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf0000 afaf0000afaf00afafaf0000afaf00008baf09dfdfaf64dfafaf646464f6 af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0a64df af6464af00afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000 fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00f7af0300af af00fcaf0700afaf00afafaf00fcaf0000f9af0300afaf00f8af00008baf 09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d9d9d 5656dff6affddffdaf0a64dfaf6464af00afafaf00fcaf0600af00afafaf 00fcaf0300afaf00faaf0000fcaf0700afaf00afafaf00fcaf0300afaf00 fcaf0300afaf00fbaffb0002afaf00fcaf0700afaf00afafaf00fcaf0300 afafaffb0002afaf00fcaffb008baf09dfdfaf64dfafaf646464f6af0864 00d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0a64dfaf6464 af00afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000fcaf07 00afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf080000afafaf 00afaf00fcaf0700afaf00afafaf00fcaf1400afaf0000afafaf00afaf00 afafaf0000afafaf008baf09dfdfaf64dfafaf646464f6af086400d69dd6 9d569d000800d6d69d9d9d5656dff6affddffdaf0564dfaf646400fcaf00 00fcaf010000fcaf0000fcaf0300afaf00fcaf0200af00fcaf0200af00fc af0000fcaf0300afaf00fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf 0200af00fcaf0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000 8baf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd6 9d569d56dff6affddffdaf0564dfaf646400fcaf060000afaf000000fcaf 160000afaf0000afaf0000afaf0000af0000afaf0000af00fcaf0000fcaf 0b00afaf0000afaf0000afaf00fcaf0f0000afaf0000afaf0000afaf0000 af00fcaf190000afaf0000afaf0000afaf0000afaf00afafaf0000afaf00 008baf09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d6 9d9d9d5656dff6affddffdaf0564dfaf646400fbaffd0002af0000fbaffd 0004af00afafaffc00fdaffd0003af00af00fcaf0000fcaf0b00afafaf00 0000af00afaf00fbaffd000baf0000af00af000000afaf00fbaffd0016af 00afafaf000000af0000afaf0000afaf000000af00008caf09dfdfaf64df afaf646464f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affd dffdaf0464dfaf6464ebaf0000f2af0000edaf0000f1af000080afe6af09 dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d9d9d56 56dff6affddffdaf0464dfaf6464f0af050000afaf0000f7af050000afaf 0000f2af050000afaf0000f1af000080afe6af09dfdfaf64dfafaf646464 f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0464 dfaf6464efaffc00f5affc00f0affc00f0af000080afe6af09dfdfaf64df afaf646464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6affd dffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d6 d69d9d9d56000800d69dd69d569d56dff6affddffdaf0464dfaf646480af 9daf09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d 9d9d5656dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf64 6464f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf 0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d69dd69d 569d000800d6d69d9d9d5656dff6affddffdaf0464dfaf646480af9daf09 dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d569d 56dff6affddffdaf0464dfaf646480df9bdf07af64dfafaf646464f6af08 6400d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf0364dfaf64 80df9adf07af64dfafaf646464f6af086400d6d69d9d9d56000800d69dd6 9d569d56dff6affddffdaf0164df80af97af0664dfafaf646464f6af0864 00d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf8064946405df afaf646464f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affd dffdaf80df93df04afaf646464f6af086400d69dd69d569d000800d6d69d 9d9d5656dff6affddf80af8eaffd64f6af086400d6d69d9d9d56000800d6 9dd69d569d56dff6affddf80af8eaffd64f6af086400d69dd69d569d0008 00d6d69d9d9d5656dff6affddf80af8eaffd64f6af086400d6d69d9d9d56 000800d69dd69d569d56dff6affddf80af8eaffd64f6af086400d69dd69d 569d000800d6d69d9d9d5656dff6affddf80af8eaffd64f6af086400d6d6 9d9d9d56000800d69dd69d569d56dff6affddf80648b64f6af086400d69d d69d569d000800d6d69d9d9d5656dff6af01dfdf80648a64f6af086400d6 d69d9d9d56000800d69dd69d569d56dff6af00df80648964f6af086400d6 9dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d 56000800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800 d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d 569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df 80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80af f4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af0864 00d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd6 9d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d5600 0800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d6 9d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d 56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af 80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af 086400d69dd69d569d000800d6d69d9d9d5656dff1affd00f4af0000ebaf 000080afa9af086400d6d69d9d9d56000800d69dd69d569d56dff3af0600 00afafaf0000f6af0000efaf0400afafaf0080afa9af086400d69dd69d56 9d000800d6d69d9d9d5656dff3af0000fbaf0000f6af0000efaf000080af a5af086400d6d69d9d9d56000800d69dd69d569d56dff3af0000f7affc00 fdaf0300afafaffc00fcaffc0009af000000afaf00afafaffc00fdaf0400 af00000080afb8af086400d69dd69d569d000800d6d69d9d9d5656dff2af 010000faaf2e0000afaf0000afaf00afaf0000afaf0000afaf0000afaf00 00af00afafaf00afaf0000afaf0000afaf0000afaf000080afb9af086400 d6d69d9d9d56000800d69dd69d569d56dff0af010000fcaf0000fcaf0600 afaf00afaf00fcaf0300afaf00faaf0700afafaf00afaf00fcaf0300afaf 00fcaf000080afb9af086400d69dd69d569d000800d6d69d9d9d5656dfee af030000afaffa0004afaf00afaffa0002afaf00faaf0700afafaf00afaf 00fcaf0300afaf00fcaf000080afb9af086400d6d69d9d9d56000800d69d d69d569d56dfedaf0300afaf00f9af0300afaf00f9af0000faaf0700afaf af00afaf00fcaf0300afaf00fcaf000080afb9af086400d69dd69d569d00 0800d6d69d9d9d5656dff3af0000fbaf0300afaf00f9af0300afaf00f9af 0000fcaf0900af00afafaf00afaf00fcaf0300afaf00fcaf000080afb9af 086400d6d69d9d9d56000800d69dd69d569d56dff3af320000afafaf0000 afaf0000afaf0000afaf00afaf0000afaf0000afaf0000afaf0000af00af afaf00afaf0000afaf0000afaf00fcaf000080afb9af086400d69dd69d56 9d000800d6d69d9d9d5656dff1affd00fbaffc00fdaf0300afafaffc00fc affc00fdaf060000af00afafaffc00fdaf0000fcaf000080afb9af086400 d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d 569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d560008 00d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d69d 9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56 df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80 aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af08 6400d69dd69d569d000800d6d69d9d9d5656dff4af80648c64f4af086400 d6d69d9d9d56000800d69dd69d569d56dff4af80648d6400dff4af086400 d69dd69d569d000800d6d69d9d9d5656dff4af01646480af90af01dfdff4 af086400d6d69d9d9d56000800d69dd69d569d56dff4af01646480af90af 01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af016464 80af90af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4 af01646480af90af01dfdff4af086400d69dd69d569d000800d6d69d9d9d 5656dff4af01646480af90af01dfdff4af086400d6d69d9d9d56000800d6 9dd69d569d56dff4af01646480af90af01dfdff4af086400d69dd69d569d 000800d6d69d9d9d5656dff4af01646480af90af01dfdff4af086400d6d6 9d9d9d56000800d69dd69d569d56dff4af01646480af90af01dfdff4af08 6400d69dd69d569d000800d6d69d9d9d5656dff4af016464f3af0000fcaf 0000d8af0000eaaf0200af00faaf0000f4af0000d5af0000eaaf0000f5af 0000f9af0000faaf0000fcaffd00e9af0000fcaf0000fbaf01dfdff4af08 6400d6d69d9d9d56000800d69dd69d569d56dff4af016464f3af0000fcaf 0000d8af0000eaaf0200af00faaf0000f4af0000d5af0000eaaf0000f7af fd00fbaffd00faaf0900afaf0000afafaf0000ebaf0000fcaf0000fbaf01 dfdff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af016464f3 af0400afafaf00d8af0000eaaf0300afaf00eeaf0000beaf0000f4af0000 f9af0000fbaf0400afafaf00fbaf0000e7af0000faaf01dfdff4af086400 d6d69d9d9d56000800d69dd69d569d56dff4af016464fbaf130000afaf00 0000af00afafaf00afaf00af000000fcaffd0009af00afaf00af0000afaf fc00fdaf0400af000000fcaf0f00afafaf000000afafaf00af0000afaffc 00fdaf1100afaf00af000000afaf00afaf00af000000fcaf0b00afafaf00 0000af00afafaffc00fcaffc00fdaf0a00af0000afaf0000afaf00fbaf05 00af00afafaffc0016afaf00afafaf00afafaf00afafaf00af0000afafaf 0000fcaf0000f9af0000fbaf0300afaf00f9af0000faaffd00fcaffd0008 af00afaf00afafaf00faaf01dfdff4af086400d69dd69d569d000800d6d6 9d9d9d5656dff4af016464f8af7f0000afaf0000afafaf00afaf0000afaf 0000afaf0000afaf0000afaf0000afafaf0000afaf0000afaf0000afaf00 00afafaf00afaf00afafaf00afaf0000afafaf0000afaf0000afaf00afaf 0000afaf0000af00afaf0000afaf0000afafaf00afaf0000afaf0000afaf 0000afaf0000afaf0000afaf0000afaf0000afaf000004afaf00af00fbaf 1f00af00afaf0000afaf0000af00afafaf00afafaf00afafaf00afaf00af afaf00fbaf0000f9af0000fbaf0300afaf00f9af0000fbaf1300afafaf00 afaf0000afaf0000afaf00afafaf00faaf01dfdff4af086400d6d69d9d9d 56000800d69dd69d569d56dff4af016464f8af0000fcaf0700afaf00afaf af00fcaf0300afaf00fcaf0300afaf00f7af0300afaf00fcaf0800afaf00 afafaf0000fbaf0000fcaf0000faaf0400afafaf00fcaf0500af00afaf00 fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf1800af af00afafaf00afafaf00afaf00afafaf00afaf00afaf00fcaf0d00af00af afaf00afafaf00afaf00fcaf0200af00faaf0000f9af0000fcaf0400afaf af00f9af0000fbaf010000fbaf0000fcaf0600afaf00afaf00f9af01dfdf f4af086400d69dd69d569d000800d6d69d9d9d5656dff4af016464f8af00 00fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fbaffb00 02afaf00fcaf0300afaf00fcaffd00fdaf0000fcaf0000faaf0400afafaf 00fcaf0500af00afaf00fcaf0700afaf00afafaf00fcaf0200afaffa0002 afaf00fcaf1700afaf00afafaf00afafaf00afaf00afafaf00afaf00afaf fa000cafaf00afaf00afaf00afafaf00fbaf0000f9af0000f9af0000fcaf 0400afafaf00f9af0000faaffd00fdaf0000fcaf0600afaf00afaf00f9af 01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af016464 f8af0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fc af080000afafaf00afaf00fcaf0300afaf00faaf040000afaf00fcaf0000 faaf0400afafaf00fcaf0500af00afaf00fcaf0700afaf00afafaf00fcaf 0300afaf00f9af0000fcaf1800afaf00afafaf00afafaf00afaf00afafaf 00afaf00afaf00f9af0a00afaf00afaf00afafaf00fbaf0000f9af0000f9 af0000fcaf0400afafaf00f9af0000f8af040000afaf00fcaf0600afaf00 afaf00f9af01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656df f4af016464f8af0000fcaf0200af00fcaf0000fcaf0300afaf00fcaf0300 afaf00fcaf0000fcaf0300afaf00fcaf0200af00f8af0300afaf00fcaf00 00fcaf010000fcaf0000fcaf0500af00afaf00fcaf0200af00fcaf0000fc af0300afaf00f9af0000fcaf1800afaf00afafaf00afafaf00afafaf00af 00afafaf00afaf00f9af0900af00af00af00afaf00fbaf0200af00faaf00 00f9af0400afafaf00fbaf0000fbaf0000f6af0300afaf00fcaf0500afaf 00af00f8af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56df f4af016464f8af070000afaf0000af00fcaf0000fcaf0b00afaf0000afaf 0000afaf00fcaf0f0000afaf0000afaf0000afaf0000af00fcaf0700afaf af00afaf00fcaf060000afaf000000fcaf0a0000afaf0000af00afaf00fc af0200af00fcaf3e0000afaf0000afaf0000afaf0000afaf0000afaf0000 afaf00afafaf00afafaf00afafaf00af00afafaf00afaf0000afaf0000af afaf00afafaf00afafaf00fcaf0400afafaf00fbaf0000f9af0400afafaf 00fbaf1e0000afafaf0000afafaf00afaf00afafaf00afaf0000afaf0000 afaf00af00f8af01dfdff4af086400d69dd69d569d000800d6d69d9d9d56 56dff4af016464f7affd0003af00af00fcaf0000fcaf0b00afafaf000000 af00afaf00fbaffd000baf0000af00af000000afaf00fbaffd00fdaf0000 fbaffc0001af00fcaf0a00af000000afaf00afaf00fcaf0200af00fbaffd 0004af00afafaffc00fcaffc00fdaf0800afafaf00afafaf00fcaf0000fc af0300afafaffc00fcaf1200afafaf00afafaf00afafaf0000afafaf0000 fcaf0000f9af0400afafaf00f9affd00fbaf0600afafaf000000fcaffd00 06af00afaf00af00f8af01dfdff4af086400d6d69d9d9d56000800d69dd6 9d569d56dff4af016464dfaf0000f1af0000c3af00008eaf0000f3af01df dff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af016464e4af 050000afaf0000f1af0000c8af050000afaf000093af050000afaf0000f3 af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af0164 64e3affc00f0af0000c7affc0091affc00f2af01dfdff4af086400d69dd6 9d569d000800d6d69d9d9d5656dff4af01646480af90af01dfdff4af0864 00d6d69d9d9d56000800d69dd69d569d56dff4af01646480af90af01dfdf f4af086400d69dd69d569d000800d6d69d9d9d5656dff4af01646480af90 af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af0164 6480af90af01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656df f4af01646480af90af01dfdff4af086400d6d69d9d9d56000800d69dd69d 569d56dff4af01646480df8edff4af086400d69dd69d569d000800d6d69d 9d9d5656dff4af006480df8ddff4af086400d6d69d9d9d56000800d69dd6 9d569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656 df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80 aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af08 6400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69d d69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56 000800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6 d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d56 9d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80 af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4 af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400 d6d69d9d9d56000800d69dd69d569d56df80648064f3640700d69dd69d56 9d000700d6d69d9d9d565680df80dff3df086400d6d69d9d9d56000800d6 9dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d 5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80 af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4 af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400 d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d 9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d569d0008 00d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd6 9d569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656 df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80 aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af08 6400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69d d69d569d000800d6d69d9d9d5656dff3afc96480afb8af086400d6d69d9d 9d56000800d69dd69d569d56dff3af0064cbaf00df80afb8af086400d69d d69d569d000800d6d69d9d9d5656dff3af0064cbaf00df80afb8af086400 d6d69d9d9d56000800d69dd69d569d56dff3af0064cbaf00df80afb8af08 6400d69dd69d569d000800d6d69d9d9d5656dff3af0064cbaf00df80afb8 af086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcafd3dffc af00dfd5afd3dfd0afd3dfedaf086400d69dd69d569d000800d6d69d9d9d 5656dff3af0064fcafd4df0064fcaf00dfd5afd4df0064d0afd4df0064ed af086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcafd5df01 6464fcaf00dfd5afd5df016464d0afd5df016464edaf086400d69dd69d56 9d000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64fcaf00dfd5af fddfd9affd64d0affddfd9affd64edaf086400d6d69d9d9d56000800d69d d69d569d56dff3af0064fcaffddfd9affd64fcaf00dfd5affddfd9affd64 d0affddfd9affd64edaf086400d69dd69d569d000800d6d69d9d9d5656df f3af0064fcaffddfd9affd64fcaf00dfd5affddfd9affd64d0affddfd9af fd64edaf086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaf fddfd9affd64fcaf00dfd5affddfd9affd64d0affddfd9affd64edaf0864 00d69dd69d569d000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64 fcaf00dfd5affddfd9affd64d0affddfd9affd64edaf086400d6d69d9d9d 56000800d69dd69d569d56dff3af0064fcaffddfd9affd64fcaf00dfd5af fddfd9affd64d0affddfd9affd64edaf086400d69dd69d569d000800d6d6 9d9d9d5656dff3af0064fcaffddff3affd00fbaf0000fbaf0000f5affd64 fcaf00dfd5affddffbaff90004af00afaf00eaaffd64d0affddffaaf0000 faaf0300afaf00f9af0000f2affd64edaf086400d6d69d9d9d56000800d6 9dd69d569d56dff3af0064fcaffddff5af0a0000afafaf0000afafaf00fc af0000f4affd64fcaf00dfd5affddffbaf0000f9af0600afaf00afaf00ed affd64d0affddffaaf0000faaf0300afaf00f9af0000f2affd64edaf0864 00d69dd69d569d000800d6d69d9d9d5656dff3af0064fcaffddff5af0000 fbaf0800afafaf00afafaf00f3affd64fcaf00dfd5affddffbaf0000f6af 0300afaf00edaffd64d0affddffaaf0000faaf0000f6af0000f2affd64ed af086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaffddff6 af0000f9af0600afaf00afaf00f2affd64fcaf00dfd5affddffbaf0000f9 af0a00afaf00af000000afafaffc00fdaf0300af0000fcaffd64d0affddf faaf0000faaf0e00afaf00afafaf000000af00afafaffc00f9affd64edaf 086400d69dd69d569d000800d6d69d9d9d5656dff3af0064fcaffddff6af 0000f9af0500afaf00af00f1affd64fcaf00dfd5affddffbaf0000f9af13 00afaf00afaf00afafaf0000afaf0000afaf0000faaffd64d0affddffaaf 0000faaf1300afaf00afaf0000afaf0000afaf0000afaf0000faaffd64ed af086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaffddff6 af0000f9af0500afaf000000f1affd64fcaf00dfd5affddffbaffa000caf af00afaf00afaf00afafaf00fcaf0300afaf00f9affd64d0affddffaaff8 0005afaf00afaf00fcaf0300afaf00fcaf0000faaffd64edaf086400d69d d69d569d000800d6d69d9d9d5656dff3af0064fcaffddff6af0000f9af06 00afaf00afaf00f2affd64fcaf00dfd5affddffbaf0000f9af0900afaf00 afaf00afafaffa0002afaf00f9affd64d0affddffaaf0000faaf0600afaf 00afaf00fcaf0200afaffa00faaffd64edaf086400d6d69d9d9d56000800 d69dd69d569d56dff3af0064fcaffddff6af0000f9af0700afaf00afafaf 00f3affd64fcaf00dfd5affddffbaf0000f9af0a00afaf00afaf00afafaf 00f9af0000f9affd64d0affddffaaf0000faaf0600afaf00afaf00fcaf03 00afaf00f5affd64edaf086400d69dd69d569d000800d6d69d9d9d5656df f3af0064fcaffddff5af0000fbaf0400afafaf00fcaf0000f4affd64fcaf 00dfd5affddffbaf0000f9af0a00afaf00afaf00afafaf00f9af0000f9af fd64d0affddffaaf0000faaf0600afaf00afaf00fcaf0300afaf00f5affd 64edaf086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaffd dff5af0a0000afafaf0000afafaf00fbaf0000f5affd64fcaf00dfd5affd dffbaf0000f9af1200afaf00afaf00afafaf0000afaf0000afaf00f9affd 64d0affddffaaf0000faaf1300afaf00afaf0000afaf0000afaf0000afaf 0000faaffd64edaf086400d69dd69d569d000800d6d69d9d9d5656dff3af 0064fcaffddff3affd00fbaf0000faaf0000f6affd64fcaf00dfd5affddf fbaf0000f9af0a00afaf00afafaf0000afaffc00fdaf0000f9affd64d0af fddffaaf0000faaf0e00afaf00afafaf000000af00afafaffc00f9affd64 edaf086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaffddf d9affd64fcaf00dfd5affddfd9affd64d0affddfd9affd64edaf086400d6 9dd69d569d000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64fcaf 00dfd5affddfd9affd64d0affddfd9affd64edaf086400d6d69d9d9d5600 0800d69dd69d569d56dff3af0064fcaffddfd9affd64fcaf00dfd5affddf d9affd64d0affddfd9affd64edaf086400d69dd69d569d0008009d569d9d 9d5656dff3af0064fcaffddfd9affd64fcaf00dfd5affddfd9affd64d0af fddfd9affd64edaf086400d6d69d569d56000000fb56029d56dff3af0064 fcaffddfd9affd64fcaf00dfd5affddfd9affd64d0affddfd9affd64edaf 036400d69dfc56ff000000fcd6039d5656dff3af0064fcaffddfd9affd64 fcaf00dfd5affddfd9affd64d0affddfd9affd64edaf016400fad6ff0008 00d6d6d69d569d56dff3af0064fcaffddfd9affd64fcaf00dfd5affddfd9 affd64d0affddfd9affd64edaf036400d69dfcd6ff000800d6d69d9d9d56 56dff3af0064fcaffddfd664fcaf00dfd5affddfd664d0affddfd664edaf 086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaf01dfdfd5 64fcaf00dfd5af01dfdfd564d0af01dfdfd564edaf086400d69dd69d569d 000800d6d69d9d9d5656dff3af0064fcaf00dfd464fcaf00dfd5af00dfd4 64d0af00dfd464edaf086400d6d69d9d9d56000800d69dd69d569d56dff3 af0064cbaf00df80afb8af086400d69dd69d569d000800d6d69d9d9d5656 dff3af0064cbaf00df80afb8af086400d6d69d9d9d56000800d69dd69d56 9d56dff3af0064cbaf00df80afb8af086400d69dd69d569d000800d6d69d 9d9d5656dff3af0064cbaf00df80afb8af086400d6d69d9d9d56000800d6 9dd69d569d56dff3af0064cadf80afb8af086400d69dd69d569d000800d6 d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d56 9d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80 af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4 af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400 d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d 569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d560008 00d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d69d 9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56 df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80 aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af08 6400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d6 9d9d9d56000800d69dd69d569d56df80648064f3640700d69dd69d569d00 0700d6d69d9d9d565680008000f10006d6d69d9d9d56000600d69dd69d56 9d80d680d6efd6059dd69d569d007f00d6d69d9d9dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d7fd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69d1dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9d 9d56000300d69dd6e59d0156d6809da49d0156d6e49d02569d000200d6d6 e59d035656d6d6809da69d035656d6d6e49d0156007f00d69d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d56d6d69d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 7f9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d56d6d61d9d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d000100d6e25601d6d68056a45601d6d6e356ff0080 008000e200 grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.5/doc/figs/tools.eps0000644000175000017500000011717412310162302013640 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: Bildschirmphoto5.ps %%Creator: pnmtops %%CreationDate: 12. Mär 17:51 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 279 267 333 525 %%HiResBoundingBox: 279.119945 267.119922 332.879966 524.879984 %%EndComments %%BeginProlog %%BeginPreview: 54 258 8 516 % 22222222222222222222222222222222222222222222222222222222222222222222222222222222 % 2222222222222222222222222222 % 24242424242424242424242424242424242424242424242424242424242424242424242424242424 % 2424242424242424242424242424 % 26262602020202020202020202020202020202020202020202020202020202020202020202020202 % 0202020202020202020202262626 % 2a020266666666666666666666666666666666666666666666666666666666666666666666666666 % 6666666666666666666651022a2a % 2c026b6b6b5316101b1d556b6b6b6b6b6b6b6b6b6b6b0d051014171f1d6b6b6b0d051014171e1f6b % 6b6b0d051014171e1f6b6b053f2c % 022971717129120515232c72717171717171717171711f1902060c20457171711f1902060c202271 % 71711f1902060c202282716202a7 % 086a7777732014080c24227a77777777777777777777222a0c090c2e72777777222a0cffff2a2277 % 7777222aff09ffff228e777702bf % 127e7e7e9027ffffffff25917e7e7e7e7e7e7e7e7e7e273113111336907e7e7e2731ffffffff277e % 7e7e273113ffff3127937e7e09bf % 1c8484849d2429ffff1c23af84848484848484848484242f18161832a9848484242f1816182f2484 % 8484242fffffff2f2498848415bf % 268b8b8b8b682820111933b48b8b8b8b8b8b8b8b8b8b2528ffffff23be8b8b8b2528ffffffff248b % 8b8b2528ff1713ff249e8b8b20bf % 3191919191a89f42399acca19191919191919191919125241f1e1915cd91919125241f1e19101691 % 919125241f1e191016a391912cbf % 3b9696969697a3bac4baa39796969696969696969696a3c7c7c7c7c7bb969696a3c7c7c7c7c7c796 % 9696a3c7c7c7c7c7c7a3969637bf % 449a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a % 9a9a9a9a9a9a9a9a9a9a9a9a43bf % 4e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d4ebf % 53aa4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d4d4d53bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d141414141414144d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d148353bf % 53aa4d4d14141414141414141414141414141414141483141414141414144d141414141414141414 % 14141414141414141483148353bf % 53aa4d4d14141414141414141414141414141414141483141414141414144d141414141414141414 % 14141414141414141483148353bf % 53aa4d4d14141414141414141414141414141414141483141414141414144d141414141414141414 % 14141414141414141483148353bf % 53aa4d4d14141414141414141414141414141414141483141414141414144d141414141414141414 % 14141414141414141483148353bf % 53aa4d4d1414141414141414141414ff14141414141483141414141414144d1414ffffff14141414 % 14141414141414141483148353bf % 53aa4d4d141414ff1414ff1414ff14ff1414ff14141483141414141414144d1414ff1414ff14ff14 % 1414ff1414ff14141483148353bf % 53aa4d4d14141414141414141414ffff14141414141483141414141414144d1414ff1414ff1414ff % 14141414ff14ff141483148353bf % 53aa4d4d14141414ffff1414ff14ffff14141414141483141414141414144d1414ff1414ff1414ff % 14141414ff1414141483148353bf % 53aa4d4d141414141414141414ff14ff14141414141483141414141414144d1414ffffff1414ff14 % 1414141414ff14141483148353bf % 53aa4d4d14141414141414141414141414141414141483141414141414144d141414141414141414 % 14141414141414141483148353bf % 53aa4d4d14141414141414141414141414141414141483141414141414144d141414141414141414 % 14141414141414141483148353bf % 53aa4d4d14141414141414141414141414141414141483141414141414144d141414141414141414 % 14141414141414141483148353bf % 53aa4d4d14141414141414141414141414141414141483141414141414144d141414141414141414 % 14141414141414141483148353bf % 53aa4d4d83838383838383838383838383838383838383141414141414144d838383838383838383 % 83838383838383838383148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d141414141414141414141414141414ffffffff141414141414141414141414ff1414141414 % 14141414141414141414148353bf % 53aa4d1414141414141414141414141414141414141414ff14141414ffff14ffff14ff1414141414 % 14141414141414141414148353bf % 53aa4d1414141414141414141414141414141414141414ffff1414ff14ff14ffff14ff1414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414ff14ff1414ff14ff14141414ff1414141414 % 14141414141414141414148353bf % 53aa4d1414141414141414141414141414141414141414141414141414ff14141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414ff1414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d83838383838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383838383148353bf % 53aa4d83141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d83141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d83141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d831414ff141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d831414ffff14ff14ff141414141414141414ff141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d831414141414ff141414141414ff1414ff14ff141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d83141414141414141414141414141414ff14ff141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d8314141414ff14ff1414141414141414ff14ff141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d83141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d83141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d83141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d83141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d83141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d834d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414ffff1414141414141414ff14141414141414141414 % 14141414141414141414148353bf % 53aa4d141414141414141414141414141414ff14141414ffff14ffff14ff14ffff14ffff14141414 % 14141414141414141414148353bf % 53aa4d141414141414141414141414141414ff14141414141414ff1414ff14141414ff1414141414 % 14141414141414141414148353bf % 53aa4d141414141414141414141414141414ff14141414141414ff1414ff14141414ff1414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414ffff1414ffff14ff1414ff14ffff14ff1414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d83838383838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383838383148353bf % 53aa4d83141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d83141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d831414ff141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d831414ffff1414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d831414ffff14ffff14ffff14141414ff14ffff141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d831414ffff14141414ff14ff1414ff14ff1414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d831414ffff14141414ff14ff1414ff14141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d831414ffff14ffffffff1414141414ff1414ff141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d831414ff14141414141414ff14141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d83141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d83141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d83141414141414141414141414141414141414141414141414141414141414141414141414 % 1414141414141414144d148353bf % 53aa4d834d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d4d4d148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d144d4d4d4d4d4d141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d144d141414148314141414ffffff14ff14ffffff14141414141414141414ffff1414141414 % 141414ff141414141414148353bf % 53aa4d144d141414148314141414141414ff1414ff14141414ff141414ff1414ff14141414ffff14 % 14ff14ff14ffff14ffff148353bf % 53aa4d144d14141414831414141414ffff141414ffffff14ff14ff14ff141414ff14141414141414 % 141414ff14141414ff14148353bf % 53aa4d144d141414148314141414141414ff1414ff141414ff14ffff14141414ff14141414141414 % 141414ff14141414ff14148353bf % 53aa4d144d14141414831414141414ffff141414ffffff1414ff141414ff141414ffff1414ffff14 % 141414ff14ffff14ff14148353bf % 53aa4d14838383838383141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d1414144d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d14144d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d1414148353bf % 53aa4d1414144d1414141414141414141414141414141414148314144d1414141414141414141414 % 14141414141414831414148353bf % 53aa4d1414144d14c9c9c9c9c9c9c9c9c9c9c9c9c9c9c914148314144d1400000000000000000000 % 00000000001414831414148353bf % 53aa4d1414144d14c9c9c9c9c9c9c9c9c9c9c9c9c9c9c914148314144d140000c9c9000000000000 % 00000000001414831414148353bf % 53aa4d1414144d14c9c9c9c90000c9c9c9c9c9c9c9c9c914148314144d140000c9c9000000000000 % 00000000001414831414148353bf % 53aa4d1414144d14c9c9c9c9000000c9c9c9c9c9c9c9c914148314144d1400c9c9c9c90000000000 % 00000000001414831414148353bf % 53aa4d1414144d14c9c9c9c90000c9c9c9c9c9c9c9c9c914148314144d140000c9c9000000000000 % 00000000001414831414148353bf % 53aa4d1414144d14c9c9c9c9c9c9c9c9c9c9c9c9c9000014148314144d140000c9c9000000000000 % 00000000001414831414148353bf % 53aa4d1414144d14c9c9c9c9c9c9c9c9c9c9c90000000014148314144d140000c9c9000000000000 % 00000000001414831414148353bf % 53aa4d1414144d14c9c9c9c9c9c9c9c9c9c9c9c900000014148314144d140000c9c9000000000000 % 00000000001414831414148353bf % 53aa4d1414144d14c9c9c9c9c9c9c9c9c9c9c90000c9c914148314144d140000c9c9000000000000 % 00000000001414831414148353bf % 53aa4d1414144d1400c9c9c9c9c9c9c9c9c90000c9c9c914148314144d140000c9c9000000000000 % 00000000001414831414148353bf % 53aa4d1414144d1400000000c9c9c9c9000000c9c9c9c914148314144d140000c9c9000000000000 % 00000000001414831414148353bf % 53aa4d1414144d14c9000000000000000000c9c9c9c9c914148314144d140000c9c9000000000000 % 0000c900001414831414148353bf % 53aa4d1414144d14c9c9c9c900000000c9c9c9c9c9c9c914148314144d140000c9c9c9c9c9c9c9c9 % c9c9c9c9001414831414148353bf % 53aa4d1414144d14c9c9c9c9c9c9c9c9c9c9c9c9c9c9c914148314144d140000c9c9c9c9c9c9c9c9 % c9c9c9c9001414831414148353bf % 53aa4d1414144d14c9c9c9c9c9c9c9c9c9c9c9c9c9c9c914148314144d1400000000000000000000 % 0000c900001414831414148353bf % 53aa4d1414144d14c9c9c9c9c9c9c9c9c9c9c9c9c9c9c914148314144d1400000000000000000000 % 00000000001414831414148353bf % 53aa4d1414144d8383838383838383838383838383838383838314144d8383838383838383838383 % 83838383838383831414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d141414141414ff14141414ff14141414141414141414141414141414ff1414ff1414141414 % 14141414141414141414148353bf % 53aa4d14141414ff14ff14141414ffff14ff1414ff14ff1414141414141414ff1414ff14ff1414ff % 14ff1414ff1414141414148353bf % 53aa4d14141414ff14ff14141414ff14ffff1414ffffff1414141414141414ff1414ff141414ffff % 1414141414ff14141414148353bf % 53aa4d14141414ff14ff14141414ffff14ff1414ff14ff1414141414141414ff1414ff14141414ff % 14141414ff1414141414148353bf % 53aa4d141414141414ff141414141414141414141414141414141414141414ff1414ff1414141414 % 14141414141414141414148353bf % 53aa4d141414ff1414ff141414141414141414141414141414141414141414ff1414ff1414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d1414144d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d14144d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d1414148353bf % 53aa4d1414144d1414141414141414141414141414141414148314144d1414141414141414141414 % 14141414141414831414148353bf % 53aa4d1414144d1400000000000000c9c9c9c9c9c9c9c914148314144d14c9c9c9c9c9c9c9c9c9c9 % c9c9c9c9c91414831414148353bf % 53aa4d1414144d14000000000000c9c90000000000c9c914148314144d14c9000000000000c90000 % 00000000c91414831414148353bf % 53aa4d1414144d1400000000000000c9000000000000c914148314144d14c90000000000c9c9c900 % 00000000c91414831414148353bf % 53aa4d1414144d1400000000000000c9000000c90000c914148314144d14c900000000c9c9c9c900 % 00000000c91414831414148353bf % 53aa4d1414144d1400000000c90000c90000c9000000c914148314144d14c9000000000000c90000 % 00000000c91414831414148353bf % 53aa4d1414144d1400000000000000c9000000000000c914148314144d14c9000000000000c90000 % 00000000c91414831414148353bf % 53aa4d1414144d1400000000000000c9c90000000000c914148314144d14c9000000000000c90000 % 00000000c91414831414148353bf % 53aa4d1414144d140000c900000000c9c9c9c9c9c9c9c914148314144d14c90000000000c9c9c900 % 00000000c91414831414148353bf % 53aa4d1414144d1400000000000000000000000000000014148314144d14c90000000000c9c9c900 % 00000000c91414831414148353bf % 53aa4d1414144d1400c9c9c9c9c900000000000000000014148314144d14c90000000000c9c9c900 % 00000000c91414831414148353bf % 53aa4d1414144d1400c9000000c90000000000c900000014148314144d14c900000000c9c9c9c900 % 00000000c91414831414148353bf % 53aa4d1414144d1400c9000000c900000000000000000014148314144d14c9000000c9c9c9c9c9c9 % c9000000c91414831414148353bf % 53aa4d1414144d1400c9000000c900c90000000000000014148314144d14c90000c9c9c9c9c9c9c9 % c9c90000c91414831414148353bf % 53aa4d1414144d1400c9c9c9c9c9c9000000000000000014148314144d14c9c9c9c9c9c9c9c9c9c9 % c9c9c9c9c91414831414148353bf % 53aa4d1414144d1400000000000000000000000000000014148314144d14c9c9c9c9c9c9c9c9c9c9 % c9c9c9c9c91414831414148353bf % 53aa4d1414144d1414141414141414141414141414141414148314144d1414141414141414141414 % 14141414141414831414148353bf % 53aa4d1414144d8383838383838383838383838383838383838314144d8383838383838383838383 % 83838383838383831414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414ff141414141414141414141414141414141414141414141414141414ff1414ff14 % 14141414141414141414148353bf % 53aa4d14141414ff1414ff1414ff1414ff14ff1414ff14ff1414141414141414141414ff1414ffff % 14ff1414141414141414148353bf % 53aa4d14141414ff14ff141414ff141414ffff1414ffffff1414141414141414141414ff1414ffff % 14141414141414141414148353bf % 53aa4d14141414ff14ff14141414ff1414ff14141414ff141414141414141414141414ff1414ff14 % ff141414141414141414148353bf % 53aa4d14141414ff1414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d1414144d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d8314144d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d831414148353bf % 53aa4d1414144d1414141414141414141414141414141414148314144d1414141414141414141414 % 14141414141414831414148353bf % 53aa4d1414144d14c9c9c9c9c9c9c9c9c9c9c9c9c9c9c914148314144d14c9c9c9c9c9c9c9c9c9c9 % c9c9c9c9c91414831414148353bf % 53aa4d1414144d14c900000000000000000000000000c914148314144d14c9000000000000000000 % 00000000c91414831414148353bf % 53aa4d1414144d14c9000000000000000000c9c90000c914148314144d14c9000000c9c9c9000000 % 00000000c91414831414148353bf % 53aa4d1414144d14c900000000000000c9c9c9000000c914148314144d14c9000000c9c9c9000000 % 00000000c91414831414148353bf % 53aa4d1414144d14c9000000000000c9c90000000000c914148314144d14c9000000c9c900000000 % 00000000c91414831414148353bf % 53aa4d1414144d14c900000000c9c900000000000000c914148314144d14c90000000000c9000000 % 0000c9c9c91414831414148353bf % 53aa4d1414144d14c900c9c9000000c9000000000000c914148314144d14c90000c9c900c9c90000 % 00c9c9c9c91414831414148353bf % 53aa4d1414144d14c900c9c9000000c9000000000000c914148314144d14c900c9c9c900c9c90000 % c9c900c9c91414831414148353bf % 53aa4d1414144d14c90000c9c90000c9000000000000c914148314144d14c900c9c900000000c9c9 % c9000000c91414831414148353bf % 53aa4d1414144d14c900000000c9c900000000000000c914148314144d14c9c9c90000000000c9c9 % 00000000c91414831414148353bf % 53aa4d1414144d14c9000000000000c9c90000000000c914148314144d14c9c9c9c9c9c9c9c9c900 % 00000000c91414831414148353bf % 53aa4d1414144d14c900000000000000c9c9c9000000c914148314144d14c9c9c9c9c9c9c9c90000 % 00000000c91414831414148353bf % 53aa4d1414144d14c9000000000000000000c9c90000c914148314144d14c9000000000000000000 % 00000000c91414831414148353bf % 53aa4d1414144d14c900000000000000000000000000c914148314144d14c9000000000000000000 % 00000000c91414831414148353bf % 53aa4d1414144d14c9c9c9c9c9c9c9c9c9c9c9c9c9c9c914148314144d14c9c9c9c9c9c9c9c9c9c9 % c9c9c9c9c91414831414148353bf % 53aa4d1414144d1414141414141414141414141414141414148314144d1414141414141414141414 % 14141414141414831414148353bf % 53aa4d1414144d8383838383838383838383838383838383838314144d8383838383838383838383 % 83838383838383831414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d1414141414ff141414ff141414141414141414141414141414141414ff141414ff14141414 % 1414ff14141414141414148353bf % 53aa4d141414141414ffff14ff14ff1414ffff14ffff1414141414141414141414ff141414ffff14 % ff14ffffff1414141414148353bf % 53aa4d14141414141414ff14ff1414ff14141414ff1414ff1414141414141414ff14ff1414ff1414 % 1414ff14141414141414148353bf % 53aa4d141414141414141414ff1414ff14141414ff1414ff1414141414141414ff14ff1414ff1414 % 1414ff14141414141414148353bf % 53aa4d141414141414ffff14ff14ff1414ffff14ff1414ff141414141414141414ff141414ff1414 % ff14ff14ff1414141414148353bf % 53aa4d141414141414141414ff141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d1414144d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d8314144d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d831414148353bf % 53aa4d1414144d1414141414141414141414141414141414148314144d1414141414141414141414 % 14141414141414831414148353bf % 53aa4d1414144d1400000000909090909090900000000014148314144d1400000000000000000000 % 00000000001414831414148353bf % 53aa4d1414144d1400000090909090909090909000000014148314144d1400000000000000900000 % 00000000001414831414148353bf % 53aa4d1414144d1400009090909090909090909090000014148314144d1400000000000090909000 % 00000000001414831414148353bf % 53aa4d1414144d1400909090909090909090909090900014148314144d1400000000000000900000 % 00000000001414831414148353bf % 53aa4d1414144d1490000000900000900000900000009014148314144d1400000000009000900090 % 00000000001414831414148353bf % 53aa4d1414144d1490009000909000900090000090009014148314144d1400000000900090909000 % 00000000001414831414148353bf % 53aa4d1414144d1490900090909000900090000090009014148314144d1490009000009000900000 % 90000090001414831414148353bf % 53aa4d1414144d1490909000909000900090000090909014148314144d1490909090909090909090 % 90909090001414831414148353bf % 53aa4d1414144d1490009000909000900090000090909014148314144d1490009000009000900000 % 90000090001414831414148353bf % 53aa4d1414144d1490909090909090909090909090909014148314144d1400000000900090909000 % 00000000001414831414148353bf % 53aa4d1414144d1490909090909090909090909090909014148314144d1400000000009000900090 % 00000000001414831414148353bf % 53aa4d1414144d1400909090909090909090909090900014148314144d1400000000000000900000 % 00000000001414831414148353bf % 53aa4d1414144d1400009090909090909090909090000014148314144d1400000000000090909000 % 00000000001414831414148353bf % 53aa4d1414144d1400000000909090909090900000000014148314144d1400000000000090909000 % 00000000001414831414148353bf % 53aa4d1414144d1400000000000000000000000000000014148314144d1400000000000000000000 % 00000000001414831414148353bf % 53aa4d1414144d1414141414141414141414141414141414148314144d1414141414141414141414 % 14141414141414831414148353bf % 53aa4d14141483838383838383838383838383838383838383831414838383838383838383838383 % 83838383838383831414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d141414141414ff1414141414141414141414ff1414141414141414ff14141414ff14141414 % 141414ff141414141414148353bf % 53aa4d141414141414ff14141414141414ff141414ff1414141414141414ff14141414ff14ffff14 % ffff14ff141414141414148353bf % 53aa4d141414141414ff14ffffff14141414ff1414ff1414141414141414ff14141414ff14141414 % 141414ff141414141414148353bf % 53aa4d141414141414ff141414141414ff14ff1414ff1414141414141414ff14141414ff14141414 % 141414ffff1414141414148353bf % 53aa4d141414141414ff14141414141414ff141414ff1414141414141414ff14ffff14ff14ffff14 % ffff14ff14ff14141414148353bf % 53aa4d141414141414ff1414141414141414141414141414141414141414ff14141414ff14141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d1414144d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d14144d4d4d4d4d4d4d4d4d4d4d4d % 4d4d4d4d4d4d4d4d1414148353bf % 53aa4d1414144d1414141414141414141414141414141414148314144d1414141414141414141414 % 14141414141414831414148353bf % 53aa4d1414144d1400000000000000000000000000000014148314144d1400000000000000000000 % 00000000001414831414148353bf % 53aa4d1414144d1400900000000000000000000000000014148314144d1400900000000000900000 % 00000090001414831414148353bf % 53aa4d1414144d1400009000000000000000000000000014148314144d1400009000000000900000 % 00009000001414831414148353bf % 53aa4d1414144d1400000090000000000000000000000014148314144d1400000090000090909000 % 00900000001414831414148353bf % 53aa4d1414144d1400009090000000000000000000000014148314144d1400009090000000900000 % 00909000001414831414148353bf % 53aa4d1414144d1400000000000000000000000000000014148314144d1400000000000000000000 % 00000000001414831414148353bf % 53aa4d1414144d1400000000000090909000000000000014148314144d1400009000000090909000 % 00009000001414831414148353bf % 53aa4d1414144d1400000000000090009000000000000014148314144d1400000090000090000000 % 00900000001414831414148353bf % 53aa4d1414144d1400000000000090009000000000000014148314144d1490909090000090000000 % 00909090901414831414148353bf % 53aa4d1414144d1400000000000090909000000000000014148314144d1400009000000090909000 % 00009000001414831414148353bf % 53aa4d1414144d1400000000000000000000000000000014148314144d1400000000000000000000 % 00000000001414831414148353bf % 53aa4d1414144d1400000000000000000000000000000014148314144d1400009090000000900000 % 00909000001414831414148353bf % 53aa4d1414144d1400000000000000000000000000000014148314144d1400000090000090909000 % 00900000001414831414148353bf % 53aa4d1414144d1400000000000000000000000000000014148314144d1400009000000000900000 % 00009000001414831414148353bf % 53aa4d1414144d1400000000000000000000000000000014148314144d1400900000000000900000 % 00000090001414831414148353bf % 53aa4d1414144d1400000000000000000000000000000014148314144d1400000000000000000000 % 00000000001414831414148353bf % 53aa4d1414144d1414141414141414141414141414141414148314144d1414141414141414141414 % 14141414141414831414148353bf % 53aa4d14141483838383838383838383838383838383838383831414838383838383838383838383 % 83838383838383831414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14ff14141414ff1414141414141414141414ff14141414141414ffff14ff14ffff14141414 % 14141414141414141414148353bf % 53aa4d1414141414141414ff14ff1414ff14ff1414ff14141414ff1414141414ff14141414ff1414 % 1414ff1414ff14ff1414148353bf % 53aa4d1414ff1414ff1414ff141414ffff14141414ff14ffff14ff14141414141414141414ff14ff % ff1414ff14ffffff1414148353bf % 53aa4d1414141414141414ff14ff1414ff14141414ff14141414ff14141414ff14ff141414ff1414 % 1414ff1414ff14ff1414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14ff14141414ff14141414141414141414141414141414141414ff1414141414ff14141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d14141414141414141414141414141414141414141414141414141414141414141414141414 % 14141414141414141414148353bf % 53aa4d83838383838383838383838383838383838383838383838383838383838383838383838383 % 83838383838383838383838353bf % 537f7f7f7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7f7f53bf % 5387837c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c8653bf % 538f8f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e % 8e8e8e8e8e8e8e8e8e8e8d8c53bf % bfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbf % bfbfbfbfbfbfbfbfbfbfbfbfbfbf %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice /pop load def %%EndProlog %%Page 1 1 gsave 279.12 267.12 translate 53.76 257.76 scale 112 537 8 [ 112 0 0 -537 0 537 ] { currentfile /ASCIIHexDecode filter /FlateDecode filter false 3 colorimage } exec 78DAED9D5B9015C519C7794C1E92AA3CE521F12D95AA24651EF2622AA5556AF4 C5581A1114F192184409221705022A97A08882B88204B92A97A8084AC0282888 788312949B02BBECB2EC9DBDEFD93BBB2CC4FC774F79B23933D3D3DDD333D373 E6FFD5575BB373BA67BEF9CDD7B799EE6F6A6B2926A5866254AA2946A5CA432E 5FFE0FD54BABBCA5D221C425A9956E52314C722907062E95D7367F78B864FBFE E3EB761E58F3AFCFA9AFBDFFE5CE4F4E1C29AE6EEFEACD81BA74E972C5FFCBB9 EF2497A6B5BD1B18576FFF8CEAAA70B0A325D5395C07BF3E375CCA8724F72B52 E25EAC7CEB53AA58DFFEE8181C2F0B6DF3AE43E5DFC9D921C9EEFFFCF8D9155B 3F76D55D9F9F2CAF696E6CEDEAECBE80BF474B6ADEF9F46BAFC41AFAD5E9AAAE 9E3E19454A4BB2AFDD712057F61F5AF47A9664595959764F5975D3B22DFB9DBA 6DDFB12325D54D6D5D7DFD1791BDA1B5B3B6A9BDBA2153DD98397CBA6ACBDEAF 5C73A96A4D6306D676F7F65F1CB8D4DB87135D68EDE8696EEF6ECA74E38C7543 67ACAA6F8322A53DD9FFB9FB30DA1AD0FBF848E99DB356950D49B60142B5F0C2 EBFBF274F3EE4327CAEAAA1BDA5A3B7A91EF42FF004E74BEB903C7AFAC6FC32D 38515AB7E1DD2F9C1955F5D8995A987DBEA5233374C7FB2F5EBAD0771197D6D5 DB8F3D2811B8109CB1E27C2B522EDEB8DB9EECDF9CADCB3A64966776BBB8A27E C9E6BD4E7DFBA3E3C5158D704860ECEB1F1818B88C9BD89CE9C691CB6B5BF0F7 64F9F96D1F1E59BC698F6B7679DDF345310CC66DAA6FE9C085C024B80AAE0B27 C5195BDA07CF5879BEF55C5D2B52CE59BEC59EEC28F55986BB0E9CBC6DCAF3D9 6D54868B367C90A72F6ED9BFEBC0293821FCBCA5BDA7B76FE0E2C0A08B76745F 808B965436965537E314EF1D38B574F31E677625DDB4EB100E555ADD74AEB605 C50D67E91FB8DCD73F78453D172EE2ECA5D5CD67AA9ACED5B520E5F4C51B64B2 8F1812D5ECD95CC3CF9EDD23C89E6D985019DE70EF4C64812E7F73FF53EB77E7 E9B31BF71C3E55895B73B6B6A5B9BD07CE0F3B41151BA85BCED6349F3A578F53 7CF8E599056BFEFDF7B5EF398F20AFCF6DDA5B5ED782BAE5F4B9061C1CA7E8BE 80123780BFD9D3613F7E451AA49CB6E815DFEC23868952F65CAEECD973FF0AB2 E78AFC35A326669BAD796BDE75EACC9776C009C16D84B7E05754298F156D7BFC A5B75C0F22A938170AC257C5D530BBBEA52BD375A1A3BBAFB3A71F7FB18D3DD8 8F5F910629272F5C2BCEEEB433D4ECD01CCFB68E1EE8132FBFE3D4F1CFBC7EB6 A6097E7EB2BCDE15E637E5E75146CA6A9AC62F7C6DDA92CDAE0791549CEB4C55 E3A1535547CFD4A0BA6EE9E869E9EC6DEBECC55F6C630FF6E357A441CA890BD6 08B27BDD7AC9ECD9B30FCFE87B7628DA2F287836B6764267ADD8E1D43B1F7FE5 F4B97A10C3DD41F592671ECE82F28E5B76E864E5ED33564E7C6A9DEB412475F4 ECF5A5554D8771452535D50DED8D6D837D155432F88B6DECC17EFC8A34483961 FE2A41762F9E92D9B3671F9ED1F7EC50549E50F0AC6DCC40A72FDBEE54E4DDB2 F748594DF360C552D150D3D89E3B45537B774D533B6A030CF391E6C607178E9F B7CAF520927AE3232BE0E730FB78695D75637B7D6B5743DB2049FCC536F6603F 7E451AA47C60CECA50B33BEF85383BB439D30505CF8ABA16E8D417B639F5BE79 1B272DDE8A9B525CD1F075591DC0D63577E0E02886F01CF82760A2899FB464EB F5F7CC1C377795EB4124F5AAFB97C0D5E1F0DF9C3DEFE560A7878A0352DEFFC4 8A08B2D7B7753566BA65B243D17D85826769552374D292375DF5DA0797AED8F6 298E5352D900AA68EB315E004F74EFD1FBC5BF478B6B7E397AFE1FFE3C63DCFC B55E0791D15FDCF174B62A86CF7B01C1ED437D8E94F7CE5A1E76F6FAD6CE86D6 AEC6B6AE5C5D2AC80EAD1CEAA082273AE4D009CFBEE1AAA367ADBE72EC33456F 7C04E668CA518BD60DF6ED7B3B7BFAE0AB2BB67EF2EBB1CFFCEAE649B74D5CF0 C0820D5E0791D19FDEFCE4E015553761985059DF8ABA05C73FDFD289D28AB280 56BEBEA51306A32821E5D8192F5A951D9A754BF03C76A606FAC0C2D75C75DC53 9B6F9E5CF4F35B678EFCDBDAA5AFEDDBF7E5199CF1E0D7156B771C1CF3E4AB57 5C3FFECA1BEFF9FD5D93C7CC5886945E0791D11FDD30B36CE88AE024E8D3560D 8E5606072CA855702D7012F49A9A32830E8394773CF68255D9A159B7044FF4D8 A1F72FD8E4A5F7CD7D65D4B4A5BF19F9E84FAE9BF0C36B1EFEFED5537E70CDC4 1F5F33EE67D7DEF3DB9BEEBDE1EE69B74F597CDF9C758223C8E895772DFCDED5 5365F48A1BFE3A6AEAF35665871E2DA98682E78113E5D0FBE66FF4D4791BEE7E 72FDE8C796DD347EFEF563A75D3DF2A1DFDDF217FCC536F6603F7E451AD111E4 74D463CBAE1B33E5AA3FFC49AC488394B6653F74B2020A9E1F1F2985DE33F755 B1DE3D67FD98D9AB464D5F3E72EAD23F4E5E82BFD8C61EECF7CD2BA9773DBEE6 F66945B73EF29C589106296DCBFED9B1B350F0DC7BA8183AF6C9F5D420FAE1E1 122878EE3A70120AE6D420BAFBE0292878EEFCE40474CCECD5D4209AC5089E6F ED3B0ABDE5E145D4209AC5389CE77E8AAE90A741292A2A12F0CC5054A46848C8 933C13CD33C6EA48E97262B7D3729EB02D113C73762AF18CA5EC68F08CD14EF2 244FF2244FF2244FF2244FF20C8FE78811235C8FEFB55FE657E33CF3E63058CE D369A141B34DF1D4BB9B76F2743A466E3BBB21E01F06CFBC3D5EE639AD1278B8 D9F2EE6A8CABE5CE0DD79491F1F432CFD554C10123E329BE0AB19131F294DC19 5E7B2476CBBC9292509E82462D329EBEE53D89FE194D7F49C3B6587806B4399A F22EDECE951199D62AE2FEA7A0FBE1DB13E0F888E34DF2244FF2244FF2244FF2 244FF24C33CFA2384483678C76CAF32C8A495479C66B27E72B8651F6C9933CC9 933CC9933CC9933C29E4499EE449214FF2244FB1B806EF327E8A14FA6778574D 9E79AE9B97C6395D53303726D4C9DE09E2A934DF35C804B9149677DF5964E4A9 54DE95788A73B1BC6BFB27DB233D9EAC3F35DA77D7C50E32ED7BC6E8AAA8948C 8F22F3C002E6E93B639C3CB5C7AA1CBFF37908853CC9933C29AA3C8B2846E72B 12975854E3016A4C6D4D8F68C457244FF2244FF2A418E12988BB429E7AFE4998 2CEFF6FBA74CE40DDF0798923BD3E09FE419BD7F8AE7CCB8BE354BAD7F665402 2B49C688B3EAFD45F4EDBBD3D9C288199536FF244F83FD4F010AF2D4E87F9AE5 99F2FAD3D7B55463C4D13F393EE2F89DCF9758DEC9933CC9933CC9933CC9D37E 9EFC36B1A9EF6F12A6599E1449214FF2244FF2244FF2244FF2A4248567C06041 5C0F2BA0A101873C2551C87C22D3374050642F682CE7A937FD499C853C258949 6649394FC990418C17A4EA9F924ECB784182F69DE5DD78FF5372FA934CFBCEF1 11C747E4499EE4499EE4499EE4499EE9E4C908368C17C478410915CE57244FF2 244FF28C8B27D77319F74FC26479B7DF3FC3F0D2C4797E48F182C833A07FAACE 72B1ED5B5A36FB6712BFA59594FA3329DFD2B2BCFE4CDCB7B46CF6CF247E4B2B 89F5A764A5CAF22E9ED49A886F6915CCF8A8C0C6AAB18CDF931B4ECDDAE74B49 ECABF37908799227853CC9933CC993F182182F88F182D223E4499E85C153A91A 214F233CD9A752E5E97B28C193A58CF70B23F11BA580CF5AA30C4B12194F57F3 7C575B07441A7D589204F114BF0675FD2E83D2C35823614992C2D36C0C81F0C2 9244CFD3B542934F90F1F8E487119E92B74C701F13ED9F417886149684E55DD2 69254F915C9E326D77F4614992527F6AB4EFE2FE6748614954794A2E6354EDC5 15CC4B64259EF2CB42C933D4E74BE2E15E214D72E0F33AF2244FF2244FF2244F F2A49027799227853CC9933CC9933CC9933CC993429EE4499E14F2244FF2244F 799EB12F9BB2D09224F274CE3FB1C792E03C63294AD65A429E76F21C31E2DB50 559EE7B7210B79223B799AE2993B027906E7997790C2E029B840F254E5E95A9B 45C353D21EF294E799577F9227DB23F22CE0F688FD25D77B419EA64892A75992 E4691C26791AA74A9E2CEF1696F7E1E31AF2340233CDFDCF20DD75DF6E7F3A79 6A23F51D43A596A72A55C9D17DCA79CA80554A4C9EAAC2E721AEED7B1830E3E2 E99A3196FE924192F1FAA733BB6DCF93F59E8506E769AA7BCCF7EF66919227FD D39EF94BB6D59F89E6694FFBCEF975E469154FCEA7254F3B7916C521D65A1290 67514C62AD255CCF65CF7A2E0A7992277952F4787A8573179C28C8AFAA32FC73 4B9968E35D6BF3344BCC384FAF0DCB79E6B9419E87487E48C8F733437A3C871F C7D5E08CDC5790240BA0299EAA9FBAD0F8D5A07FCA7C5046F22B48E1F9A7EACE 787906BC220B790A3E2464E47B7CF23C25BF8214657957DDA9F199A19078CA1B 2F5F646CE619B67F06343E329E5EEDA66BABEAFB55C1803C5DDB77573B5D7B29 1197F7F0FA9046CA7BF4B6916742C79B11F3D428AA7C1EC2E74BE4494411F064 FC3AC6AF63FC3A5753ADB5843CEDE419EF2CACC29B0F66763587EA2CEB3C4BC2 9BE6975A9E6188853C872F9B559A6B1D124FD5A53D56F1CC5B33AB443E0C9EAA 4B932C2FEF4A298DF3D458806615CFE1368B2FC135A5599E7AA102EDE1E915C8 423EA5419EAAD17558DE0BBBFEF40A1A20D3D492A71225DF7E0B79B2BC87C7D3 D7EB24DB0EF2145F947C005EF2647F3E0C9E06233390A7DEF0843CF5CABBDEC3 B4D4F234F8EC513E2A42A18EDFF5C2CFCAB831796AF3744D96669E41FA485E69 D2F97C29084FF1AFA67806294109E2E9EB1B46780689319E149E92956A709E46 C2B65BCE53BEC50FC8D35498716B79AA765383F0341806DF4E9E1A7D7E6D9E06 A38E5BD8FFD41E3D69F0343ED326D1E3A3B0C7EF8531DF26329EA99A0FC6F98A 9C4FCBF9C909E5C9F8750679327E1DD77359BB9E8B429EE4499E94803CBD96EA EB2DE10F69D5BF3816996D3C0DC2098FA7EF86853C5D03C1B97A85D74EDF2C41 780AC2D9650CC52932C85335E451045198821B69034F999FE4AF37B53C05E55D 10822FD428767A3C039ECE787B2469610451EC54DB23677C30D69F05C33360FB EE1BE1369AFE52F0D359D5FF0C49E4C3AF91A7419E460CB66ABC191E4FDF7076 A6ACE5F3103E5F224FF264FC3AC6AF63FC3A8DA264AD25E469274FCE0733CE33 C6598205395F31C659AC05399F963CD3C633E0CCF364F10CB24A456F3D57A1F2 0CBEEA873CE5832490A72992E4699624DB23E321506CE82FC5B53E4E69157FEC FD4FD5183896F074C518977F2AC5C88D7DFDA678957490906B06DB23DFEEAE20 5A4B8C3C657A4151F2745D7C2D63A16D3C7D2BF908787A2D66F72D3EE499F18B 279077585F98798959DEBF15861B55AA07D81EC997146748073BFBF3F1F69724 C7B376C60BB2AD3FAF1448CDC27856B68D37F59C93CF4332E6E2DBF0799D419E 7C9E6C8A27DF7704E9B9693F05E5FB38BE2FE6FB77F224CFA4F0E47C30CE57B4 73BE22E7D392A79D3C19BFCE204FC6AFE37A2E6BD77351C8933CC993129CA76D 210504E715982AD8A9741546786AFC142A4FD55F35B244C053109F2AA318C22E 482026F149F38E9CF7D7D512A58216867F060CC1947775AA48E5433C796D5B55 DE35A257658C06400B1832CB2A9E5E6CC9933C63E72919B2D24E9E16D69F06DB 77233C258F2F6EDF553BD2EC7F5A383E224F8E37F93C84CF97C8933C63E1C9F8 758C5FC7F875AEA65A6B0979DAC993F3C1A2E369626100792AC3142235CC33C0 E28438791AF98C3D790681E97169619577F5A9E1F1F03432B59A3C4DC1742035 CF53776557D43C8D2F0048B37F86B4A6229D3CC35CA692C6F65D29508873BF30 BB319EAE616E54C27044CAD37569ABCCBF7957E7D86986A7D76A5B951A803C45 DEE81598C9B6F22EA8A022E02958F8ADB753BA650CA53D92891614194FC186D7 B6D09ED8DA7741F0325F9E01DBA382E419BCFED4EE2F85B7BA38D1ED51409E05 E09FE4194D7F5E5CA3BA8235C5B300DA776BC79B49EC7F26856722C647F63F0F 49D0F83D41CFEB12F4FE88CF93D3F9BE83EFE3D2F9FE88EF8B53389F21A13C39 DF2625F3C112CD93F315399F96F39319BF8EF1EB1C57C1F8755CCF65ED7A2E0A 79922779520CF21444A0720DD0E17A84BC0D5511DB1030DA58F43CBD6C900465 84A7E00885CD5310BC4E3B30853C4FED783B76F2341B234895A76A3CA828E305 B9DAE014A5CBB48A67C4F1AC829777F2647927CF8CA1787A8968DF9D616983B7 EF66E3E949220D83A7C1EE9CD9EE6204F1CAC8D3FEF1A67602233C630C5EC7E7 21E4499EE4C9F8758C5FC7F8757A45C95A4BC8D34E9E9C0F669EA7C627D543E2 296F897ACA48FD3334A4CAFE2969897AB2A8CB7B384875CABB8C25EA6962A83F C52102A2AC3FBD2CF18D66E09AC092F532F1B6475E8B5EB3FF3A37FCEC8FAD7D B784A79725E2F9F3BA2B7752EA9F017E8AADFEB481A7AF25E2FDEA2B1FD99F4F D87A2EF224CFA4F0545F1667B2FFA96789CDF567F43C65A2EEF8B6F296FBA7D6 E30803FDCFE07B52CBD3D7FD7C2DD18D0C439EE4C9F2CEF688FDA504F497D89F 274FF2244F3EAF4B907F16C0F364DBCA7B01BCEFB0DC3F93F83ECE9EFAB300DE 17733E4381F12C98F93636F02C98F960ECCF733E2DE727337E1DE3D7317E1DE3 D7257C3D17853CC9933C29F23CA30C17A07A1CD7B0755E91C7CC02CC3BA0124F E31C0CF2F462284860034F5F07C8F319C9003279516804FF8A2D91E7E91A51C7 D55A81FDCE5C21F1D40BC0251FA6C97999BEE864CE2BCE2EE3F01AE55D6943FE AAB52F4170678D78B252B28879FAC69872F522DFA082C1793ACFE22C0832C668 F3F48AEB25E99F1A4555701C99E22FE99F928D9DD9F65DA9B0988A1A27E99F01 79465F7FCA6F6B07889369DF0DF2D46EDF9D69ECEC7F86D75F0DDB42F24CC378 5383A7E4EDB68727853CC9933C29E4499EE4499EE4499EE4499E14833C8B28EA E2C593644CF17C7CE54EA7CE5DFD2ED5559DACF2782EDAF001F4B94D7BF0F7E9 57763FB59E2AD2F96BDF9BB76610EC132FBFE3CA33E79080F9CCABEFE32F55AC 0BD6ED02AED9FFD8396BC50E681ECF69456F3DFAE2DB33966F6731572AF52006 6EA097C773D29237A18F3CBF75EA0BDBF0EBF465DBA962054928584D59BA0DDC F2783EB4E8F5AC4E78F60DAA8C4E7C6ECBC38BFFA7793CA946143CA966F5BFA6 4DE99B > grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.5/doc/figs/color.eps0000644000175000017500000006735412310162302013622 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: blah-000.ps %%Creator: pnmtops %%CreationDate: 12. Mär 17:51 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 253 344 359 448 %%HiResBoundingBox: 253.199945 344.393989 358.799966 447.605986 %%EndComments %%BeginProlog %%BeginPreview: 106 104 8 312 % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffff % ff3232323274747474747474747474bb323232323232323232323232327474747474747474747474 % 74323232323232323232323232747474747474747474747474323232323232323232323232747474 % 747474747474747474bb323232323232323232323274747474ff % ff3274747474747474747474747474bb747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474327474747474747474747474747474ff % ff3274bbbb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb7474747474747474747474 % 74bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb747474 % 747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb74747474ff % ff3274bb323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232327474ff % ff3274bb3274747474747474747474bb747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474743274 % 747474747474747474743274747474747474747474bb327474ff % ff3274bb3274747474747474747474bb74747474747474ffffffff74747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474743274 % 747474747474747474bb327474747474747474ff74bb327474ff % ff3274bb3274747474747474747474bb74747474747474ff74747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474743274 % 747474747474747474bb327474747474747474ff74bb327474ff % ff3274bb3274747474747474747474bb74747474747474ff747474ff7474ff74ff74ff74ff74ff74 % ff747474747474747474747474747474747474747474747474747474747474747474747474743274 % 747474747474747474bb327474747474747474ff74bb327474ff % ff3274bb327474747474747474ff74bb747474747474ff74747474ffff74ff747474ffffff7474ff % 74747474747474747474747474747474747474747474747474747474747474747474747474743274 % 74747474ff74747474bb327474747474747474ff74bb327474ff % ff747474327474ffffffffffffff74bb327474747474ff747474ff74ffff74ff74ff74ff74ff74ff % 74747474747474747474747474747474747474747474747474747474747474747474747474bb3274 % 747474ffff7474747474327474747474747474ff74bb3232bbff % ff7474743274747474747474747474bb327474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474bb3274 % 74747474747474747474327474747474747474ff74bb3232bbff % ff7474743274747474747474747474bb327474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474bb3274 % 74747474747474747474327474747474747474ff74bb3232bbff % ff7474743274747474747474747474bb327474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474bb3274 % 7474747474747474747432747474ffffffffffff74bb3232bbff % ff74747432bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbb % bb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474bb32bb % bbbbbbbbbbbbbbbbbb743274747474747474747474bb3232bbff % ffbbbb74ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffff32bbbbff % ff327474602828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282860323232ff % ff747474606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060606060603232bbff % ff747474606028282828282828282828282828282828282828282828282828282860606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060282828 % 282828282828282828282828282828282828282860603232bbff % ff74747460602860606060606060606060606060606060606060606060606060ae60606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060ae60603232bbff % ff74747460602860606060606060606060606060606060606060606060606060ae60606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060ae60603232bbff % ff74747460602860606060606060606060606060606060606060606060606060ae60606060606060 % 60606060602828282828282828282828282828282828286060606060606060606060606060606060 % 60606060606060606060606060606060606060ae60603232bbff % ff3274bb60602860606060ffff60606060606060606060606060606060ff6060ae60606060606060 % 60606060602860606060606060606060606060606060ae6060606060606060606060606060606060 % ffffff60606060606060606060606060606060ae6060327474ff % ff3274bb606028606060ff6060ff606060606060606060606060606060ff6060ae60606060606060 % 60606060602860606060606060606060606060606060ae6060606060606060606060606060606060 % ff6060ff606060606060606060606060606060ae6060327474ff % ff3274bb6060286060606060606060ff6060ff60ff60ff60ff60ff60ffff6060ae60606060606060 % 6060606060286060606060ff606060ffff606060ff60ae6060606060606060606060606060606060 % ff60606060ff60ff60ff60ff60ff60ff606060ae6060327474ff % ff3274bb6060286060606060606060ffff60ff606060ff606060ffffffff6060ae60606060606060 % 6060606060286060606060ff60606060606060606060ae6060606060606060606060606060606060 % ff60606060ff6060606060ff60ffffff606060ae6060327474ff % ff3274bb606028606060ff6060ff60606060ff606060ff606060606060ff6060ae60606060606060 % 6060606060286060ffffffff6060ff6060ff60ff6060ae6060606060606060606060606060606060 % ff6060ff60ff6060606060ff60606060606060ae6060327474ff % ff3274bb60602860606060ffff6060ffffffff60606060ffff60ffff60ff6060ae60606060606060 % 6060606060286060606060ff606060ff606060606060ae6060606060606060606060606060606060 % ffffff606060ffff606060ff60ffff60606060ae6060327474ff % ff3274bb60602860606060606060606060606060606060606060606060606060ae60606060606060 % 6060606060286060606060ff606060ff6060ff606060ae6060606060606060606060606060606060 % 60606060606060606060606060606060606060ae6060327474ff % ff3274bb60602860606060606060606060606060606060606060606060606060ae60606060606060 % 60606060602860606060606060606060606060606060ae6060606060606060606060606060606060 % 60606060606060606060606060606060606060ae6060327474ff % ff3274bb60602860606060606060606060606060606060606060606060606060ae60606060606060 % 60606060602860606060606060606060606060606060ae6060606060606060606060606060606060 % 60606060606060606060606060606060606060ae6060327474ff % ff3274bb60602860606060606060606060606060606060606060606060606060ae60606060606060 % 60606060602860606060606060606060606060606060ae6060606060606060606060606060606060 % 60606060606060606060606060606060606060ae6060327474ff % ff3274bb606028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae60606060606060 % 606060606028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae6060606060606060606060606060aeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae6060327474ff % ff3274bb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060327474ff % ff747474606060606060606060606060aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae60808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060ff6060606060606060ae7c7c7c28282828282828282828282828287c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060ff6060606060606060ae7c7c7c28606060606060286060606060ae7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060ff6060606060606060ae7c7c7c28606060606060286060606060ae7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060ff6060606060606060ae7c7c7c28606060606060286060606060ae7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060ff6060606060606060ae7c7c7c28606060606060286060606060ae7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060ff6060606060606060ae7c7c7c28606060606060286060606060ae7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060606060606060606060ae7c7c7c28606060606060286060606060ae7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060606060606060606060ae7c7c7caeaeaeaeaeaeaeaeaeaeaeaeaeae7c7c7c7c7c7c % 7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060606060606060606060282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282860808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff3274bb60606060ffff606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c28282828282828282828282828287c7c7c7c7c7c7c7c7c7c7c7c7c7c2860808080808080808080 % 80808080808080808080808080808080808080806060327474ff % ff3274bb606060ff6060ff6060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c28606060606060286060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860808080808080808080 % 80808080808080808080808080808080808080806060327474ff % ff3274bb60606060ff60606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c28606060606060286060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860808080808080808080 % 80808080808080808080808080808080808080806060327474ff % ff3274bb606060606060ff6060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c28606060606060286060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860808080808080808080 % 80808080808080808080808080808080808080806060327474ff % ff3274bb606060ff6060ff6060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c28606060606060286060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860808080808080808080 % 80808080808080808080808080808080808080806060327474ff % ff3274bb60606060ffff606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c28606060606060286060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860808080808080808080 % 80808080808080808080808080808080808080806060327474ff % ff3274bb606060606060606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c28606060606060286060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860808080808080808080 % 80808080808080808080808080808080808080806060327474ff % ff3274bb606060606060606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7caeaeaeaeaeaeaeaeaeaeaeaeaeae7c7c7c7c7c7c7c7c7c7c7c7c7c7c2860808080808080808080 % 80808080808080808080808080808080808080806060327474ff % ff3274bb606060606060606060606060282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282860808080808080808080 % 80808080808080808080808080808080808080806060327474ff % ff3274bb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060808080808080808080 % 80808080808080808080808080808080808080806060327474ff % ff3274bb606060606060606060606060aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae2860808080808080808080 % 80808080808080808080808080808080808080806060327474ff % ff3274bb606060606060606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c28282828282828ae282828282828ae7c7c7c7c7c7c7c7c7c2860808080808080808080 % 80808080808080808080808080808080808080806060327474ff % ff747474606060ff6060ff6060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c28606060606060ae606060606060ae7c7c7c7c7c7c7c7c7c2860808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060606060606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c28606060606060ae606060606060ae7c7c7c7c7c7c7c7c7c2860808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff74747460606060ffff606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c28606060606060ae606060606060ae7c7c7c7c7c7c7c7c7c2860808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060606060606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c28606060606060ae606060606060ae7c7c7c7c7c7c7c7c7c2860808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060606060606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c28606060606060ae606060606060ae7c7c7c7c7c7c7c7c7c2860808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060606060606060606060ae7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c % 7c7c7c7c7c28aeaeaeaeaeaeaeaeaeaeaeaeaeae7c7c7c7c7c7c7c7c7c2860808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060606060606060606060282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282860808080808080808080 % 808080808080808080808080808080808080808060603232bbff % ff747474606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060606060603232bbff % ff74747460606060606060606060606060606060606060606060606060aeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae60603232bbff % ff747474606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060602860603232bbff % ff747474606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060602860603232bbff % ff747474606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060602860603232bbff % ff3274bb6060606060606060606060606060606060606060606060606060606060ffff606060ffff % ff60ffff6060606060606060ff606060ffffff6060ffff60ffffff606060ffff60606060ff6060ff % ff6060ffff6060606060606060606060606060286060327474ff % ff3274bb60606060606060606060606060606060606060606060606060606060ff60606060606060 % 60ff606060606060606060ff60ff6060ff606060ff606060ff60606060606060ff6060ff60ff6060 % 6060606060ff60606060606060606060606060286060327474ff % ff3274bb606060606060606060ff60ff6060ff606060ff606060606060606060ff606060606060ff % 60ffffff60606060606060ff60ff6060ffffff6060606060ffff606060606060ff60606060606060 % ff60606060ff60606060606060606060606060286060327474ff % ff3274bb606060606060606060ff606060606060606060606060606060606060ff60606060606060 % 60ff606060606060606060ff60ff606060606060606060606060ff6060606060ff606060ff606060 % 60ff606060ff60606060606060606060606060286060327474ff % ff3274bb606060606060ffffff60606060ffff60ffff60606060606060606060ff6060606060ff60 % 60ff606060606060606060ff60ff6060ff606060ff606060ff60ff6060606060ff6060ff60606060 % 60ff606060ff60606060606060606060606060286060327474ff % ff3274bb606060606060606060ff60606060ff6060606060606060606060606060ffff60ff60ff60 % 6060ffff6060606060606060ff60606060ffff6060ffff6060ff60606060ffff606060ffffff60ff % ff6060ffff6060606060606060606060606060286060327474ff % ff3274bb606060606060606060ff60ff60ffff606060ff6060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060286060327474ff % ff3274bb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060286060327474ff % ff3274bb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060286060327474ff % ff3274bb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060286060327474ff % ff3274bb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060286060327474ff % ff3274bb606060606060606060606060606060606060606060606060602828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828286060327474ff % ff747474606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060606060603232bbff % ff74747460606060606060606060606060606060606060606060606060aeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae60603232bbff % ff747474606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060602860603232bbff % ff747474606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060602860603232bbff % ff747474606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060602860603232bbff % ff747474606060606060ff60606060ff60ff606060606060606060606060606060ffff606060ffff % 6060ffff6060ffff60606060ff60606060ffff6060606060ffffff606060ffff606060ffffff60ff % ff606060ff60606060606060606060606060602860603232bbff % ff323274606060606060ff60606060ff606060ff6060ff606060606060606060ff60606060606060 % ffff606060ff6060606060ff60ff6060ff606060606060606060606060606060ff60606060606060 % 60606060ff6060606060606060606060606060286060323232ff % ff747474606060606060ffffffff606060606060606060606060606060606060ff60606060606060 % ffff606060ff6060606060ff60ff6060ffffff606060606060ff606060606060ff60606060606060 % ff606060ff60606060606060606060606060602860603232bbff % ff747474606060606060ff606060606060606060ffff60606060606060606060ff60606060606060 % ff60606060ff6060606060ff60ff6060ff606060ff6060606060606060606060ff606060ff606060 % 60ff6060ff60606060606060606060606060602860603232bbff % ff747474606060606060ff60606060ff60ff6060606060606060606060606060ff60606060606060 % ffff606060ff6060606060ff60ff6060ff606060606060606060606060606060ff60606060606060 % 60ff6060ff60606060606060606060606060602860603232bbff % ff7474746060606060606060606060606060606060606060606060606060606060ffff60ff60ffff % 6060ffff6060ffff60606060ff60606060ffff6060606060606060606060ffff60606060606060ff % ff606060ff60606060606060606060606060602860603232bbff % ff747474606060606060606060606060606060606060606060606060606060ffff60606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060602860603232bbff % ff3274bb6060606060606060606060606060606060606060606060606060ff6060ff606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060286060327474ff % ff3274bb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060286060327474ff % ff3274bb606060606060606060606060606060606060606060606060602828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828286060327474ff % ff3274bb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060327474ff % ff3274bb60aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae60327474ff % ff3274bb606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060327474ff % ff3274bb323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232327474ff % ff3274747474747474747474747474bb747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474327474747474747474747474747474ff % ff32bbbbbb74747474747474747474bb32bbbbbbbbbbbbbbbbbbbbbbbb7474747474747474747474 % 74bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb747474 % 747474747474747474bb32bbbbbbbbbbbbbbbbbbbb74747474ff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffff %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice /pop load def %%EndProlog %%Page 1 1 /picstr 660 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def gsave 253.2 344.4 translate 105.6 103.2 scale 220 215 8 [ 220 0 0 -215 0 215 ] { inputf picstr readstring pop } false 3 colorimage 78DAED9D4192DB2010457D4A9FC017CA224B9FC1B7996D8E92B8E22A8A92056A 503774A3F717AA8CA29125F1FC044830B71B21EEF26393E7F379BFDF7FC842B1 2ED3F7FE7326DF3FEA2EEFFF937F1CCBE84BEB327DEF3C319956EA261DFF93AC 12BB327DEFF9DB9346C74F39AEC7A4DDCEBF3DF9619525CB91CB9CBD5D4F7289 588E07F2D093F44590617D3E424FDA751011925262AFC4AA56639F8EA0C596A9 58CFEFADC393B4BBE9C0B12BD3FC76DCEA49FA27170052510EDF652AAF3DEE32 39D2937D97E2F05CC84439EC96A9B080F2CD3EFB89E249208CE8C98E920DE749 405AD29369CB409EAC0059BA956BADC79378B289C97CBDC5BFF164384FB676CE 9FF4645D6569FD6683C3F597AD181CCAA1E9DEE1C4934DE5B8F92EA8DFB80F01 AB837DCDB67C5D0EF2EFAC2B4FF6DD7F9B3CD974E3966C4C4B4AEE49F965F1E3 C98EDBB78A275B6FD04256AFA6CA434F0A6FDFDEDADD1D554AB92769DDCC6D77 CBAB94D769774B2A93BB68D10B44FFE4944B41E89F9CF81C87E0493C8927F124 59CF931D8D5F3C8927ED3CD944269E24033CD9BD9F0E4FA6CDCE2CDFFB61B8E8 F4650249656F5A655AF164FA3167359DCBC968ED87F82908AD5DE59ECC417DE7 FB1319774C468EEFDE80BA19CA9D367811629CDD6904364CE60A7DFFCA1F42CC 92987C66F3006C98DCB4896092D8E5F178E49E94B4BB7326B9C510DD3CFE67E3 C9C3FE499824C398ECF664A05A0A49F159405A9E0C544B216E99FC1490AE2743 DC11C886496F05A4EB499884497526F1244CE2499884493C19B1818027F1A42B 26EDF48E279764327495E3CA9E4CAF1E0D3BC1EFCF8249F9296C5E185BCC939B 931A768E307992C94A2146F7E4F7B9C0643826C794DA184F1E9EC8EE0DE2F3EF DD1B4769FBD24E4632B97BB2A5E33FBC4469BD1326372B550A6E8A27EB4CE647 D8FDEFCA06AE982CD5612232A952706E3D593A65C9FAD68DA733D9F15F6E9954 59EFD093A5F65D2B93929D38645258795B83494943DE83274B35AB339EF45C9F 2C1547BD6B623D4F7A6E77ABDC025C31B99B3A81BBE83A6F770F667264FFA4B0 79B2461B47788FF0C9A4BC109BDA44B33C59EA03F95E5F6A8A4ABA20A2F4051D B6CE061CB690C97AF54F72CD0FCB689627FDC46DBBDB2193730B88F782E6F64F 1E4A1526F1A4E9BDBB7EFF82493C19A24061124FC2249E844998C49330892761 1226277AF2E13EEA051AEEB0679D82FC4C153DF98810DD028D78D8B34EA19B49 E69F247E6EE2CC3F497C32892797C9DF98C1936B33F92B603C78F2416C1A44CB 3039DE9320A49B542278F293D6F75AD301FCDE8BDDAC50BF174D5E2278722E93 1F3FC83786493C798649610540BE254CE2499884493C09937832C74F32C61926 61124FC224F5499884493C099378122661124FC2249E1CF9BC1B2661D2DB7B41 300993813C297F1F46FEF20C4CE2C96E268D5EE882493C79C8E41FA2FD0743F1 E41926A108265D7992301EC79B27094CE24998C493042619B7C8585A3C09938C A575EE49C9EBE5511EF6C51ACF4BFF6469EC43E9C7B599F4309E97FE49C9BB6A 6B3019E53D103C297C7F122661726E7D525E938449981CD9EE5EAC8D0393CBF4 4F2ED3C681C995FA276112266977C3249EBC42FF244CF21C072661D2E7781C98 84496FE316611226F164F4F1BC78F2224C061ACF8B27194BCBB8C5553D094530 C9781CC6E3E04902938CC7618C189E8449C68839F464E96162F73CBD21263173 357C8C76374C7A1B3E46BBFB0AEFAAC57AEC8827611226797F1226F164DFB8C5 A6A1B5300993D6FD933009933EDF3397CF3F00933039E0390E4CC2A4C3E738F2 A930601226C73CEF864998E43D7398C4933009937892E16378124F861B3E8627 1923C6789C553D094530C9781CC6E3E049425AAB737892B86572014F324C2CFA A0CBF53C49B1461F74B9AA27B903864BC269554F52C4CB308927099E84498227 099E8449822761124F4661F296A5FEBFBB9327547EB1723CBA1F5AD95EFEA195 0D5AD7E3C9334C7E5FE4FA7ED206955F3C2CA6C30F154EFC553A18950F3D3CD3 D64B87272D986C9A39615526BBBFCE9E3D79DB4BDF7DA4F58FE5456752286D15 849C33A9FEF7BB77F12BFDB85953F92F532677B7ECAB4F4A98947CE9F26B22A9 2B9EF9F6ED566257F26487822A5FDB594CD68FF90C93928F96EFDFEE4C3B6E58 513CD9741B9AC2A4BCF63580C9BEF57667BAA427CFD4D3C6D4272FC2A42ECCB1 3C5971FE610F58DFFDE20C937D25A5D8C651E996B16EEC5FD093272F452B93F2 FAAD2293DDEC9D61B2BB7DBD76BBBBE9CAE8D6275FE5272392AF89EE731CC943 A2338F54EA1FDAF1C46A99E738AEDADDC4793C78B2D45D69D43F49823239D893 7514759FE3103C392B3089276192E04998C4937892E0499884493C49F0244C12 3C49F0E45C2699413AEEC4D74B7A92925D8949E6E9257E6A5FCC674E7C32C93C BDC4DBDCD1CC674EBCCD1D4DFF24A17F122609CF71089E8449822761124FC224 09E449E1A0F8C379A2EAEB61F26A9E4C6EECF0E4E108EEDDA1B5464C4E9951F9 FC3CCFAFF6B19C5366C91EE9C97B165D4F566615E89E3EB47BBE200F53F75410 3A731B1296D19959B24D3D991398DFBBD3FFEA7A52FE8B5760B2B487266B4D99 91D8DA93291B262DEA93F5FB8BC4150B3359FFF25E84C90D96E7DBDDB74224B7 A7A6CB159AC9C3B9108D26BD549C257BB17677C58D1E987C1566C2D462B234F5 59B760A7CC921DA87F526552FAA64B61C1E4F836CEE1FCB1F26B3E6646E2653C 29BC2CD764B2DE63731D26077B52D29069BD0EEBF505BD0CE68137EA2558A63E D9F4D75ED49974358DB32993A6B36407F2E4F89C9C3B7AF034CEAFC6E7382FF1 9F121B3F4B76144F3A61D2F462123CD9CAE480E762044FCA99CCDFEB004B3C39 9DC9EE0794044F5A30297F8849F0E4AC7637C1933049F0244CE249E69F24CC3F 2961929265FE49428C7A4E987F923864B2C393CC50478C26A2ECF324978E5833 D9E449424CD3EAC91B21F6917BF28790819178325FC392E59865C5938AF928F7 49168A6999EE7AD2E2F8C1723D268D68F9F6E4EEA47F6796E9F8D5F7CC72D6D2 BA4C139377B37C4FE646A2C7B44CE98B200EF30F4B460C7C > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.5/doc/figs/initial.eps0000644000175000017500000102742212310162302014126 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: blah-000.ps %%Creator: pnmtops %%CreationDate: 12. Mär 17:51 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 60 276 552 516 %%HiResBoundingBox: 60.719975 276.479992 551.280007 515.519984 %%EndComments %%BeginProlog %%BeginPreview: 488 237 8 3081 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000ffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffff00000000000000ff4545454545459292929292929292cc459292 % 45454545454545454545454592929292929292929292929245454545454545454545454592929292 % 92929292929292924545454545454545454545459292929292929292929292924545454545454545 % 45454545929292929292929292929292454545454545454545454545929292929292929292929292 % 45454545454545454545454592929292929292929292929245454545454545454545454592929292 % 92929292929292924545454545454545454545459292929292929292929292924545454545454545 % 45454545929292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % 9292929292929292454545cc45454545454545459292929292929292929292924545454545cc4545 % 45454545929292929292929292ff00000000000000ff4592929292929292929292929292cc929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292924592929292929292 % 92929292929292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % 92929292929292929292929245929292929292929292929292929292929292929292929292924592 % 92929292929292929292929292ff00000000000000ff4592cccccccc929292929292929292929292 % cccccccccccccccccccccccc929292929292929292929292cccccccccccccccccccccccc92929292 % 9292929292929292cccccccccccccccccccccccc929292929292929292929292cccccccccccccccc % cccccccc929292929292929292929292cccccccccccccccccccccccc929292929292929292929292 % cccccccccccccccccccccccc929292929292929292929292cccccccccccccccccccccccc92929292 % 9292929292929292cccccccccccccccccccccccc929292929292929292929292cccccccccccccccc % cccccccc929292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % 9292929292929292cccccccccccccccccccccccc929292929292929292929292cccccccccccccccc % cccccccc929292929292929292ff00000000000000ff4592cc454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % ff454545454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545459292ff00000000000000ff4592cc4592929292929292929292cc929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292924592929292929292929292924592929292929292 % 92929292459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % ff929292929292929292929245929292929292929292929292924592929292929292929292924592 % 929292929292929292cc459292ff00000000000000ff4592cc4592929292929292929292cc929292 % 929292929292ffff92929292929292929292929292929292929292929292929292ffffffff929292 % 92929292929292ffff92929292ff929292929292929292929292929292929292ff92929292929292 % 929292ff929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292924592929292929292929292924592929292929292 % 92ff92cc459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % ff92929292929292929292cc459292ffffffff929292929292924592929292929292929292cc4592 % 929292929292929292cc459292ff00000000000000ff4592cc4592929292929292929292cc929292 % 92929292ff9292ff929292929292929292929292929292929292929292929292ff92ff9292929292 % 929292929292ff9292929292ff929292929292929292929292929292929292929292929292929292 % 929292ff929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292924592929292929292929292924592929292929292 % 92ff92cc459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % ff92929292929292929292cc45929292ff9292929292929292924592929292929292929292cc4592 % 92929292929292ff92cc459292ff00000000000000ff4592cc4592929292929292929292cc929292 % 92929292ff92929292ff92ff92ff92ff92ff92ff92ff92ffffff92ff929292ff9292ff929292ff92 % ff92ff92ff92ff92ff92ff92ff92ff92ff92ff92ff92ff92ff929292ff9292ffff92ff92ffff92ff % 92ff9292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292924592929292929292929292924592929292929292 % 92ff92cc459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % ff92929292929292929292cc45929292ff9292ffff92ff9292924592929292929292929292cc4592 % 92929292929292ff92cc459292ff00000000000000ff4592cc4592ff929292929292ff92cc929292 % 929292ff9292929292ffffffff92ff92ff92ffffff92ff9292ffffff929292ff92ff929292ff9292 % ff92ff929292ff9292ff9292ff92ffffff92ffff92ff9292ff929292ff92ff9292ffffff92ff92ff % 92ff9292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 9292929292929292929292929292929292929292459292929292ff92929292924592929292929292 % 92ff92cc459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % ff459292929292929292ff92459292ff9292ff92ffff929292cc459292929292ff92929292924592 % 92929292929292ff92cc4545ccff00000000000000ff929292459292ffffffffffffff92cc459292 % 92929292ff92ff92ff92ff92ff92ff92ff92ff92ff92ff92ff92ff92929292ff92ff929292ff92ff % 92ff92ff92ff92ff92ff92ff92ff92ff92ff92ff92ff92ff92929292ffff92ff92ff92ff9292ff92 % ff9292ff929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292924592929292ffff92929292924592929292929292 % 92ff92924545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % ff459292ffffffffffffff92459292ff9292ff9292ff92ff92cc4592929292ffff92929292924592 % 92929292929292ff92cc4545ccff00000000000000ff9292924592929292929292929292cc459292 % 92929292929292929292929292929292929292929292929292929292929292ff9292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 929292ff929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292924592929292929292929292924592929292929292 % 92ff92924545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % ff459292929292929292929245929292929292929292929292cc4592929292929292929292924592 % 92929292929292ff92cc4545ccff00000000000000ff9292924592929292929292929292cc459292 % 9292929292929292929292929292929292929292929292929292929292929292ff92929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 9292ff92929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292924592929292929292929292924592929292929292 % 92ff92924545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % ff459292929292929292929245929292929292929292929292cc4592929292929292929292924592 % 92929292929292ff92cc4545ccff00000000000000ff9292924592929292929292929292cc459292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 929292929292929292929292929292929292929245929292929292929292929245929292ffffffff % ffff92924545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % ff459292929292929292929245929292929292929292929292cc4592929292929292929292924592 % 9292ffffffffffff92cc4545ccff00000000000000ff929292459292cccccccccccccccccccccccc % 929292929292929292929292cccccccccccccccccccccccc929292929292929292929292cccccccc % cccccccccccccccc929292929292929292929292cccccccccccccccccccccccc9292929292929292 % 92929292cccccccccccccccccccccccc929292929292929292929292cccccccccccccccccccccccc % 929292929292929292929292cccccccccccccccccccccccc929292929292929292929292cccccccc % cccccccccccccccc92929292929292929292929245cccccccccccccccccccccc4592929292929292 % 929292924545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % ff92cccccccccccc929292924592929292929292cccccccccccc45cccccccccc9292929292924592 % 92929292cccccccccccc4545ccff00000000000000ffcccc92ffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffff45ccccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000cccccc % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffff45ccccff00000000000000ff459292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd454545ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc282828282828282828282828282828282828282828282828282828282828282828282828282828 % 282828282828282828ae454545ff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286028282828282828282828282828282828282828ae6060606060602828282828282828282828 % 28282828282828ae60ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286028606060606060606060606060606060606060ae6060606060602860606060606060606060 % 60606060606060ae60ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286028606060606060606060606060606060606060ae6060606060602860606060606060606060 % 60606060606060ae60ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc286028606060606060606060606060606060606060ae6060606060602860606060606060606060 % 60606060606060ae60ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc286028606060606060606060606060606060606060ae6060606060602860606060606060606060 % 60606060606060ae60ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc286028606060ff6060ff6060606060606060606060ae6060606060602860606060606060606060 % 60606060606060ae60ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc2860286060606060ffff60606060ff60ff60606060ae6060606060602860606060ff60606060ff % 60ff6060ff6060ae60ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc286028606060606060ff60ffff60ff606060606060ae6060606060602860606060ff60606060ff % 60ff60ffff6060ae60ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc28602860606060ff60ff60606060ff606060606060ae60606060606028606060606060606060ff % 60ff6060ff6060ae60ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc286028606060606060606060606060606060606060ae6060606060602860606060606060606060 % 60606060606060ae60ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc286028606060606060606060606060606060606060ae6060606060602860606060606060606060 % 60606060606060ae60ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc286028606060606060606060606060606060606060ae6060606060602860606060606060606060 % 60606060606060ae60ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc286028606060606060606060606060606060606060ae6060606060602860606060606060606060 % 60606060606060ae60ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc286028606060606060606060606060606060606060ae6060606060602860606060606060606060 % 60606060606060ae60ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc286028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae60606060606028aeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeae60ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060ff6060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286060606060606060606060606060606060ff6060ff60ff60ff60606060ff6060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc28606060606060606060606060606060606060ff60ff60ff60ff60ffff60ff6060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286060606060606060606060606060606060ff6060ff60ff60ff60606060ff6060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc28606060606060606060606060606060606060606060606060ff60606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286060606060606060606060606060606060606060606060ff6060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff4545454545454545454545454545cc454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 4545454545454545454545454545cc454545454545454545454545454545ff0000000000004545cc % cc2860aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeae6060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff4592929292929292929292929292cc929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 9292929292929292929292929292924592929292929292929292929292ccff000000000000459292 % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060286060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc929292929292929292929292cccccccccccccccccccccccc929292929292929292929292 % cccccccccccccccccccccccc929292929292929292929292cccccccccccccccccccccccc92929292 % 9292929292929292cccccccccccccccccccccccc929292929292929292929292cccccccccccccccc % cccccccc929292929292929292929292cccccccccccccccccccccccc929292929292929292929292 % cccccccccccccccccccccccc929292929292929292929292cccccc9245ccff000000000000459292 % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060286060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 4545454545454545454545454545454545454545454545454545454545ccff000000000000459292 % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060286060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc9292929292929292929292cc929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 9292924592929292929292929292924592929292929292929292cc4545ccff000000000000459292 % cc2860ae60606060ff60ff606060606060ff6060ff60606060606060606060606060606060606060 % 606060606060286060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc9292929292929292929292cc929292929292929292ffff92929292929292929292929292 % 929292929292ff9292929292929292929292929292929292ffffffff92ff92929292929292929292 % ffff92929292929292929292929292929292929292929292929292929292929292ffff9292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 9292cc4592929292929292929292924592929292929292929292cc4545ccff000000000000459292 % cc2860ae606060ffff606060606060ff60ff6060ff60606060606060606060606060606060606060 % 606060606060286060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc9292929292929292929292cc92929292929292ff929292ff929292929292929292929292 % 9292929292929292929292929292929292929292929292929292ff92ff92929292929292929292ff % 9292ff929292929292929292929292929292929292ff92929292929292929292ff9292ff92929292 % 9292929292ff92929292929292929292929292929292929292929292929292929292929292929292 % 9292cc459292929292929292929292459292929292929292ff92cc4545ccff000000000000459292 % cc2860ae606060ff60606060606060ff60ff6060ff60606060606060606060606060606060606060 % 606060606060286060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc9292929292929292929292cc92929292929292ff92929292ff92ff92ff92ff92ff92ff92 % 92ff9292ffff92ff92ff92ffff92ff92929292929292929292ff9292ffffffff92ff92ff9292ff92 % 92929292ff92ff9292ff92ffffffffff92ff92ff92ff92ffffffff92ff9292929292929292ff92ff % 92ff92ff92ff92ff92ff92ffffff9292929292929292929292929292929292929292929292929292 % 9292cc459292929292929292929292459292929292929292ff92cc4545ccff000000000000459292 % cc2860ae6060606060ff6060606060ff60ff6060ff60606060606060606060606060606060606060 % 606060606060286060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc929292929292929292ff92cc929292929292ff929292ff92ffff92ff9292ffff92ff92ff % 92ff92ff92ff92ffffff92ffff92ff929292ffffff92929292ff9292ff92ff92ffffff929292ff92 % 92ff92ffffff92ff92ff92ff92ff92ff92ffffffff9292ff9292ff92ff9292ff92929292ffffff92 % ff9292ffff9292ffffff92ff92929292929292929292929292929292929292929292929292929292 % 9292cc459292929292ff9292929292459292929292929292ff92cc4545ccff000000000000459292 % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060286060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc9292ffffffffffffffff92cc929292929292ff9292ff92ff929292ff92ff92ff92ff92ff % 92ffff9292ffff92929292ff92ff9292929292929292929292ff9292ff92ff92ff9292929292ff92 % 92ff92ff929292ff92ff92ff92ff92ffff929292ff9292ff9292ffff929292ff9292ff92ff929292 % ff9292ffff92ff92929292ff92929292929292929292929292929292929292929292929292929292 % 9292cc4592929292ffff9292929292459292929292929292ff92cc4545ccff000000000000459292 % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060286060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc9292929292929292929292cc92929292929292ffff929292ff9292ffff9292ff92ff92ff % 92ff9292ff9292ffff9292ff92ff92929292929292929292ff9292ff9292ff92ffff9292929292ff % ffff92ffff9292ffff92ff92ff92ff9292ffff92ff92ff929292ff9292929292ffff9292ffff9292 % ff92ff92ff9292ffff92ff9292929292929292929292929292929292929292929292929292929292 % 9292cc459292929292929292929292459292929292929292ff92cc4545ccff000000000000459292 % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060286060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc9292929292929292929292cc929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292ff9292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 9292cc459292929292929292929292459292929292929292ff92cc4545ccff000000000000459292 % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060286060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc9292929292929292929292cc929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 9292cc459292929292929292929292459292ffffffffffffff92cc4545ccff000000000000459292 % cc286028282828282828282828282828282828282828282828282828282828282828282828282828 % 282828282828286060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff92929292cccccccccccccccccccccc929292929292929292929292cccccccccccccccccccccccc % 929292929292929292929292cccccccccccccccccccccccc929292929292929292929292cccccccc % cccccccccccccccc929292929292929292929292cccccccccccccccccccccccc9292929292929292 % 92929292cccccccccccccccccccccccc929292929292929292929292cccccccccccccccccccccccc % 929292459292929292929292cccccc45cccccccccccccccc9292cc459292ff0000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ffcccc92ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffff45ccccff0000000000004545cc % cc286060606060606060606060606060ffff60606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff459292282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 2828282828282828282828282828282828282828282828282828ae459245ff0000000000004545cc % cc28606060606060606060606060606060606060ff60ffff60ffff60ffff60ff6060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff929292286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc286060606060606060606060606060606060ff6060ff60ff606060606060ff6060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff929292286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc286060606060606060606060606060606060ff6060ff60ff606060606060ff6060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdffbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff929292286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc286060606060606060606060606060ffff6060ff60ff60ff60ff60ffff60ff6060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdffbdbdbdffbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % ffbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff929292286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdffbdbdbdffbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdd5d5d5bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdff % bdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060606060ffffff606060606060606060606060606060ffffff6060606060ff6060 % 606060606060606060606060606060606060606060606060606060606060606060606060606060ff % 606060606060606060606060606060606060606060606060ff60606060ff606060606060ff606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdffbdbdbdffbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbd % bdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff929292286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060ff6060606060606060606060 % 606060606060606060606060606060606060606060606060ff60606060ff60606060ff6060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc2860aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeae60ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdffbdbdbdffbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbd % bdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060606060606060606060ff60ff60606060606060606060606060ff60ff60ff6060 % 60606060606060606060ff60ff60606060ff60ff60ff60ff60ff60ffff606060606060606060ff60 % 6060ff60ff60ff60ff60ff60ffff60ff6060606060606060ffff6060ffff60ffff60ff60ff60ff60 % ff60ff60606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060602860ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060606060606060606060ffffff60606060606060606060606060ff606060ff6060 % 60606060606060606060ff60ff60ffff60ff606060ffffff60606060ff6060606060606060606060 % ff60ff60606060ffff60606060ffffff6060606060606060ff60606060ff60606060ff60ff606060 % ff606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060602860ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060606060606060606060ff606060606060606060606060606060ff606060ff6060 % 60606060606060606060ff60ff60606060ff606060ff6060606060ffff6060606060606060606060 % 6060ff606060ff60ff606060ffff60606060606060606060ff60ffff60ff60606060ff60ff606060 % ff606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060602860ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff4592cc286060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060ff60606060606060606060606060606060606060606060 % 6060ff60606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc2860ae60606060606060606060606060606060ff60606060606060606060606060606060606060 % 606060606060602860ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc286060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060ff60606060606060606060606060606060606060606060 % 6060ff60606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc2860ae6060ffff60ff60606060ff606060ff60ff60606060606060606060606060606060606060 % 606060606060602860ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc2860ae606060606060ff606060606060ff60ffff60606060606060606060606060606060606060 % 606060606060602860ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc2860ae60606060ff60ff606060606060ff6060ff60606060606060606060606060606060606060 % 606060606060602860ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdff % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc2860ae606060ff60ff60606060ff606060ff60ff60606060606060606060606060606060606060 % 606060606060602860ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % ffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc28aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae4545ccff000000000000459292 % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060602860ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 2828282828282828282828282828282828282828282828282828284545ccff000000000000459292 % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060602860ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdff % bdbdffbdbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbdffbdbdffbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060602860ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdffbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060602860ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdffbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606028282828282828282828282828282828282828286060ae4545ccff000000000000459292 % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060602860ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdffffffffffffffd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5ffffffffffffffffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606028606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060602860ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606028606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc2860ae606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060602860ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff92929228606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606060286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606028606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc2860ae282828282828282828282828282828282828282828282828282828282828282828282828 % 282828282828282860ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060ae60606060606060606060606060606060606060606060606060606060606060 % 6060606028606060606060606060606060606060606060ffffffffff606060606060606060606060 % 606060606060606060606060606060606060606060ffff6060606060606060606060606060606060 % 6060606060ffff60606060606060ffff606060606060606060ff6060606060606060606060606060 % 6060606028606060606060ffff606060ff606060606060606060ae459292ff0000000000004545cc % cc286060282828282828282828282828282828282828282860602828282828282828282828282828 % 282828282828606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606060286060606060606060606060606060606060ffff606060ffff6060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060ffff606060606060ffff60ff60606060606060ffff6060606060606060606060606060 % 6060606028606060606060ffff60ffffff60ffff606060606060ae459292ff0000000000004545cc % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606060286060606060606060606060606060606060ffff606060606060606060ffff60606060ff % ff60606060ff60ff60ffffff6060ffff606060ff60ffff606060ffff606060ff6060ffff6060ffff % 60606060ffffff6060606060ffff6060ffff6060606060ffffff6060606060606060606060606060 % 6060606028606060ffffffffff606060ff606060ff6060606060ae459292ff0000000000004545cc % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060ae606060ff606060606060606060606060606060606060606060606060606060 % 60606060286060606060606060606060606060606060ff6060606060606060ffff60ffff6060ffff % 60ffff6060ffff60ffff60ffff60ffff606060ff60ffff6060ffff60ffff60ff6060ffff6060ff60 % 6060606060ffff6060606060ffff6060606060606060606060ff6060606060606060606060606060 % 6060606028606060606060ffff606060ff606060606060606060ae459292ff0000000000004545cc % cc286060286060eaeaeaeaeaeaeaeaeaeaeaeaeaeaea60ae60602860000000000000000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060ae606060ff60ffff606060606060606060606060606060606060606060606060 % 60606060286060606060606060606060606060606060ff606060ffffffff60ff606060ff60ffff60 % 6060ff6060ff6060ff6060ffff6060ff6060ffff60ffff60ffff606060ff60ff6060ffff6060ff60 % 6060606060ffff6060606060ffffffffff6060606060606060ff6060606060606060606060606060 % 6060606028606060606060ffff60ff60ff60ff60ff6060606060ae459292ff0000000000004545cc % cc286060286060eaeaeaeaeaeaeaeaeaeaeaeaeaeaea60ae60602860000000ea0000000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060ae606060ff60ff60606060606060606060606060606060606060606060606060 % 60606060286060606060606060606060606060606060ff6060606060ffff60ffffffffff60ffff60 % 6060ff6060ff6060ff6060ffff6060ffff60ff6060ffff60ffffffffffff606060ffffffff60ff60 % 6060606060ffff6060606060ffff6060ff6060606060606060ff6060606060606060606060606060 % 6060606028606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc286060286060eaeaeaea0000eaeaeaeaeaeaeaeaea60ae606028600000eaea0000000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5ffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060ae606060ff60ff60606060606060606060606060606060606060606060606060 % 60606060286060606060606060606060606060606060ffff60606060ffff60ff6060606060ffff60 % 6060ff6060ff6060ff6060ffff6060ffff60ff6060ffff60ffff606060606060ffff6060ffff6060 % 6060606060ffff6060606060ffff6060ffff60606060606060ff6060606060606060606060606060 % 6060606028606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc286060286060eaeaea000000eaeaeaeaeaeaeaeaea60ae60602860000000eaea00000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5ffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060ae606060ff60ff60606060606060606060606060606060606060606060606060 % 60606060286060606060606060606060606060606060ffff606060ffffff60ffff6060ff6060ff60 % 60ffff6060ff6060ff6060ffff606060ffffff6060ffff6060ff606060ff6060ffff6060ffff6060 % 6060606060ffff606060606060ff6060ff6060606060606060ff6060606060606060606060606060 % 6060606028606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc286060286060eaeaea000000eaeaeaeaeaeaeaeaea60ae60602860000000ea0000000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060ae606060ff606060606060606060606060606060606060606060606060606060 % 6060606028606060606060606060606060606060606060ffffffffffffff6060ffffffff6060ffff % ffff606060ff6060ff6060ffff606060ffff606060ffff6060ffffffffff6060ffff6060ffff6060 % 6060606060ffff606060ff6060ffffffff6060ffff60606060ff6060606060606060606060606060 % 6060606028606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc286060286060eaeaeaeaeaeaeaeaeaeaeaeaea00ea60ae60602860000000ea0000000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060ae606060ffff6060ff6060606060606060606060606060606060606060606060 % 60606060286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae6060ae459292ff0000000000004545cc % cc286060286060eaeaeaeaeaeaeaeaeaeaeaea0000ea60ae60602860000000ea0000000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606060286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc286060286060eaeaeaeaeaeaeaeaeaeaeaea0000ea60ae60602860000000ea0000000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff4592cc28606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606060286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc286060286060eaeaeaeaeaeaeaeaeaeaea0000eaea60ae60602860000000ea0000000000000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc28606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606060286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc28606028606000eaeaeaeaeaeaeaeaea0000eaeaea60ae60602860000000ea0000000000000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc28606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606060286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc286060286060000000eaeaeaeaea000000eaeaeaea60ae60602860000000ea0000000000000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc28606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606060286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc286060286060ea000000000000000000eaeaeaeaea60ae60602860000000ea0000000000000000 % ea00000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc28606060ae28282828282828282828282828282828282828282828282828282828282828 % 28282828286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc286060286060eaeaea0000000000eaeaeaeaeaeaea60ae60602860000000eaeaeaeaeaeaeaeaea % eaeaea0060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc286060286060eaeaeaeaeaeaeaeaeaeaeaeaeaeaea60ae60602860000000eaeaeaeaeaeaeaeaea % eaeaea0060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc286060286060eaeaeaeaeaeaeaeaeaeaeaeaeaeaea60ae60602860000000000000000000000000 % ea00000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc286060286060eaeaeaeaeaeaeaeaeaeaeaeaeaeaea60ae60602860000000000000000000000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d59dd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc28606060ae28282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828aeae28282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 2828282828282828282828282828282828282828282828606060ae4545ccff000000000000459292 % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d59d9d9dd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc28606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060aeae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606028606060ae4545ccff000000000000459292 % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d59d9d9d9d9d9d9dd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc28606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060aeae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc28606028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae606028aeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d59d9d9d9d9d9d9d9d9dd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc28606060ae60606060606060606060606060606060606060606060606060606060ff6060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060aeae6060606060606060606060606060606060606060ff60 % 60606060606060606060606060606060606060606060606060ff606060ff60606060606060ff6060 % 6060606060606060606060606060606060606060606060606060ae4545ccff000000000000459292 % cc28606060ff6060ff60606060ff60606060606060606060606060606060ff606060606060606060 % 606060606060606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d59d9d9d9d9d9d9d9d9d9d9d9d9dd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff92929228606060ae60606060606060606060606060606060606060606060606060606060ff6060 % ff60ff60ff60ff60ff60ff60ff606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060aeae6060606060606060606060606060606060606060ff60 % 60606060ff606060ff60ff60ff60ff60ff60ff60ff60606060606060ffff60ff60ff60ff60ff6060 % 606060ff60ff60ff60ff60606060606060606060606060606060ae459292ff0000000000004545cc % cc28606060ff6060ff60606060ff606060ff6060ff60ff60606060606060ff6060ff606060ff6060 % 6060ff606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d59d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9dd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060ae60606060606060606060606060606060606060606060606060606060ff6060 % ffffff606060ff606060ffffff606060ffff60606060606060606060606060606060606060606060 % 60606060606060606060606060606060aeae6060606060606060606060606060606060606060ff60 % 6060606060606060ffffff606060ff60ff60ffffff6060606060ff6060ff606060ff606060ff6060 % 606060ffffff6060ff6060606060606060606060606060606060ae459292ff0000000000004545cc % cc28606060ff6060ff60606060ff60ff60ff6060ff606060606060606060ff6060ff60ff60ff6060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d59d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9dd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060ae60606060606060606060606060606060606060606060606060606060ff6060 % 6060ff606060ff606060ff6060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060aeae6060606060606060606060606060606060606060ff60 % 606060ff60606060606060606060ff60ff606060ff6060606060606060ff606060ff606060ff6060 % 606060ff6060606060ff60606060606060606060606060606060ae459292ff0000000000004545cc % cc28606060ff6060ff60ffff60ff6060ff6060ff60ff6060606060606060ff6060ff6060ff606060 % 606060ff6060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d59d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9dd5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060ae60606060606060606060606060606060606060606060606060606060ff6060 % ffffff60606060ff606060ff6060ff60ffff60606060606060606060606060606060606060606060 % 60606060606060606060606060606060aeae6060606060606060606060606060606060606060ffff % ffffff60ff60ff60ffff60606060ff60ff60ffffff606060606060ff60ff60ffff6060ffffff60ff % 60606060ffff6060ff6060606060606060606060606060606060ae459292ff0000000000004545cc % cc28606060ff6060ff60606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d59d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9dd5d5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060ae60606060606060606060606060606060606060606060606060606060606060 % 606060606060ff60ff60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060aeae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdd5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % d59d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9dd5d5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5bdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060aeae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606028606060ae459292ff0000000000004545cc % cc286060282828282828282828282828282828282828282860602828282828282828282828282828 % 282828282828606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdd6d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5 % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9dd5d5d5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e3bdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae28606060ae459292ff0000000000004545cc % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdd6d6d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d59d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9dd5d5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e3e3bdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff929292286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdd6d6d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d59d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9dd5d5d5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e3e3bdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff929292286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc28606028606000000000000000000000000000000060ae60602860000000000000000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdd6d6d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d59d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9dd5d5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e3e3e3bdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff929292286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc28606028606000000000000000eaeaeaeaeaeaea0060ae60602860000000000000000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d59d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9dd5d5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e3e3e3bdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff92929228606060aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae28606060ae459292ff0000000000004545cc % cc2860602860600000000000ea00ea0000000000ea0060ae6060286000000000000000ea00000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6d6d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d59d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9dd5d5d5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e3e3e3e3bdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae28aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeae6060aeaeaeaeaeaeaeae28606060ae459292ff0000000000004545cc % cc28606028606000000000000000ea0000000000ea0060ae60602860000000000000eaeaea000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6d6d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d59d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9dd5d5 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e3e3e3e3e3bdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff4592cc2860606028aeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff2828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c28ae7c7c2828606060ae4545ccff000000000000459292 % cc28606028606000000000000000ea0000ea0000ea0060ae6060286000000000000000ea00000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6d6d6 % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d59d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e3e3e3e3e3e3bdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae60ffffffffffffff60ff60ffff60ffff60ffffffffffffffffff60ffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff2828aeff60ff606060ff606060606060ff60ff606060606060 % 60606060606060606060ff6060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c28ae7c7c2828606060ae4545ccff000000000000459292 % cc28606028606000000000000000ea0000000000ea0060ae6060286000000000000000ea00000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6d6d6 % d6d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d59d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9dd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e3e3e3e3e3e3bdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae60ffff60ffffffff60ff60ffffffffffffff60ff6060ffffff6060ff6060 % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff2828ae6060ff60606060ff6060606060ff606060ffffff6060 % ffff60ffff6060ffff60ffffff6060ff60ffff606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c286060ae7c2828606060ae4545ccff000000000000459292 % cc2860602860600000ea00000000eaea00000000ea0060ae6060286000000000000000ea00000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6d6d6 % d6d6d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d59d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9dd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e3e3e3e3e3e3e3bdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae60ff60ffffffffff60ff60ffffffffffffff60ffffff60ffffff60ffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff2828ae60ff6060606060ff606060606060ff6060ff60606060 % 606060ff60ff60ff6060ff606060ff60ff6060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c286060ae7c2828606060ae4545ccff000000000000459292 % cc28606028606000000000000000eaeaeaeaeaeaea0060ae60602860000000000000eaeaea000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6d6 % d6d6d6d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d59d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9dd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e3e3e3e3e3e3e3e3bdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae60ff60ffffffffff60ff60ffffff6060ff60ffffffff60ffffff60ffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff2828ae6060ff60606060ff606060606060606060ff606060ff % 606060ff60ff6060ff60ff606060ff60ff6060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae28aeaeaeaeae2828606060ae4545ccff000000000000459292 % cc286060286060000000000000ea000000000000000060ae60602860000000000000eaeaea000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6d6 % d6d6d6d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d59d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9dd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e3e3e3e3e3e3e3e3bdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae60ff60ff60ffffff60ff60ffffffffffffffffff60ff60ffffff60ff60ff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff2828aeff60ff606060ff606060606060ff60ff60ff606060ff % 60ff60ff60ff60606060ff606060ff60ff6060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc28606028606000eaeaeaeaea00000000000000000060ae60602860000000000000eaeaea000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6d6 % d6d6d6d6d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d59d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9dd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e3e3e3e3e3e3e3e3bdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae60ffffffffffffffffff60ffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff2828ae60606060606060606060606060606060606060606060 % 606060ff606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae2828282828ae2828606060ae4545ccff000000000000459292 % cc2860602860600000000000ea0000000000ea00000060ae606028600000000000eaeaeaeaea0000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6d6 % d6d6d6d6d6d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d59d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9dd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae6060ff6060ffffffff6060ffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff2828ae60606060606060606060606060606060606060606060 % 606060ff606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae2860606060ae2828606060ae4545ccff000000000000459292 % cc2860602860600000000000ea00000000000000000060ae6060286000000000eaeaeaeaeaeaea00 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6d6 % d6d6d6d6d6d6d5d5d5d5d5d5d5d5d5d5d5d5d5d59d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9dd5d5d5d5d5d5d5d5d5d5d5d5d5e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae2860606060ae2828606060ae4545ccff000000000000459292 % cc2860602860600000000000ea0000ea00000000000060ae6060286000000000eaeaeaeaeaeaeaea % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6d6 % d6d6d6d6d6d6d6d5d5d5d5d5d5d5d5d5d5d5d59d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9dd5d5d5d5d5d5d5d5d5d5d5d5e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028aeff6060606060ffff6060ff6060606060606060ff60606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae6060ff606060ff6060606060ff606060606060606060 % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae2860606060ae2828606060ae4545ccff000000000000459292 % cc2860602860600000000000ea00000000000000000060ae60602860000000eaeaeaeaeaeaeaeaea % ea00000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6 % d6d6d6d6d6d6d6d6d5d5d5d5d5d5d5d5d59d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9dd5d5d5d5d5d5d5d5d5d5e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028aeff6060ff606060ff6060ff6060ffff60ffff60ff60ffff60ffff60606060 % ff60ffffffff60606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60ffff60606060ff60606060ff6060ffff60ffff6060 % ffff60ff606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae2860606060ae2828606060ae4545ccff000000000000459292 % cc28606028606000eaeaeaeaea00000000000000000060ae60602860000000000000000000000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6 % d6d6d6d6d6d6d6d6d5d5d5d5d5d5d5d59d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9dd5d5d5d5d5d5d5d5e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028aeff60ff60606060ff6060ff6060606060606060ff60ff60606060ff6060ff % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828aeff60ff60606060ff60606060ff60606060ff60606060 % 60ff60ff606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae2860606060ae2828606060ae4545ccff000000000000459292 % cc28606028606000000000000000000000000000000060ae60602860000000000000000000000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6 % d6d6d6d6d6d6d6d6d6d5d5d5d5d59d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9dd5d5d5d5d5e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff9292922860606028aeff60ff60606060ff6060ff6060606060606060ff60ff60606060ff6060ff % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae6060ff606060606060606060ff606060606060606060 % 60ff6060ff6060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae28aeaeaeaeae2828606060ae459292ff0000000000004545cc % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6 % d6d6d6d6d6d6d6d6d6d6d5d59d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9dd5d5e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028aeff6060ff606060ff6060ff606060ff60ffff6060ffff6060ffffff606060 % ff606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae6060ff60ffff606060606060ff6060ffff6060ff6060 % 60ff60ff606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6 % d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028aeff60ff60ff6060606060ff60606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc28606028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae6060aeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6 % d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc2860606060ff606060ff606060606060606060606060606060606060606060ff60ffff60606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6 % d6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028aeffff60606060ffff60ffff60606060606060606060606060606060606060 % 606060606060606060606060ff60ff60606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae6060ff60ffff6060ff606060ffff6060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc2860606060ff60ff60ff60ffff6060ff606060ffff60606060606060606060ffffffff6060ff60 % ff6060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6 % d6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028aeff60606060606060ff60ff60606060606060606060606060606060606060 % 60606060606060606060606060ff6060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae6060ff60606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc2860606060ff606060ff606060606060ff6060606060606060606060606060ff6060ff6060ff60 % ff6060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6 % d6d6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028aeff60ff60ff6060606060ff606060ff60ff6060ff60ff60ff60ff60ff60ff % 60ff60ff60ff6060ff60ff6060ff6060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae6060ff60606060ff60ff60ff60ffff60ff6060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc2860606060ff606060ff60606060ff60ff6060606060606060606060606060ff6060ff60606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6 % d6d6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028aeff60ff60606060606060ff6060606060ff60606060ff606060ff606060ff % ffff6060606060606060ff6060ff6060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828aeff60ff60606060ff60ff60ff60ffffffff60ff6060ff % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc2860606060ff60ff60ff60ffff6060ff606060ffff60606060606060606060ff6060ff606060ff % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6 % d6d6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028aeff60ff60606060606060ff6060606060ff60606060ff606060ff606060ff % 6060606060ff60606060ff6060ff6060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae6060ff60606060606060606060ffff606060ffffffff % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc2860606060ff606060ff606060606060606060606060606060606060606060ff6060ff60606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % d6d6d6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028aeff6060ff6060ffffff60ff6060606060ff60ff606060ffff6060ff606060 % ff6060ffff60ff60ffff606060ff6060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae6060ff60ffff60606060ff6060ff60ffff6060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % d6d6d6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028aeff60ff60ff6060606060ff60606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdd6d6d6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdd6d6d6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff4592cc2860606028aeff60606060606060606060606060ff60ff60606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828aeff60ff606060ff60606060ff60606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdd6d6d6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9de69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028aeff6060ffff6060606060606060ff60606060ffff606060ff60ff6060ffff % 6060ff60ffff60606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828aeff606060606060ff60ffffff60ffff60ffff60ff6060 % ffff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc28606028606000000000000000000000000000000060ae60602860000000000000000000000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdd6d6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9de6e69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028aeff60ff60606060606060606060ff606060606060ff606060606060ff6060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828aeff60ff60606060ff606060ff60606060ff60ff60ff60 % 6060ff60606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc286060286060ea000000000000000000000000000060ae60602860000000000000000000000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdd6d6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9de6e6e69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028aeff60ff60606060606060606060ff60606060ff60ff606060606060ff6060 % 606060ff606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828aeff60ff60606060ff606060ff60606060ff60ff60ff60 % 6060ff60606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc286060286060ea000000000000000000000000000060ae6060286000000000eaea000000000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdd6d6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9de6e6e6e6e69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028aeff60ff60ff606060606060606060ff60ff60ff60ff606060606060ff60ff % 606060ff60ff60606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828aeff60ff606060ff6060ff60ff60ffff60ff60ff60ff60 % ff60ff60606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc286060286060ea0000000000000000eaeaea00000060ae6060286000000000eaeaea0000000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdd6d6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9de6e6e6e6e6e6e69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028aeff6060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc286060286060ea000000000000eaeaea000000000060ae6060286000000000eaeaea0000000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdd6d6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9de6e6d9d9d9e6e69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028aeffff60606060606060ff6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc286060286060ea00000000eaeaea0000000000000060ae60602860000000000000000000000000 % 00ea000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdd6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9dd9d9d9d9d9d9d9d9d99d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc286060286060ea0000eaeaea00ea0000000000000060ae6060286000000000ea00ea00000000ea % eaea000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdd6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3ffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60ff6060606060606060606060606060ff6060606060 % 6060606060606060606060ff60606060606060606060ff6060ff6060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc286060286060ea00eaea000000ea0000000000000060ae6060286000000000ea00eaea00000000 % eaea000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdd6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3ffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60ff606060ff606060ff606060606060606060ffff60 % ff606060ffff6060ff6060ff6060ff6060ff60606060ff6060ff60ffff60ff60ff60606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc286060286060ea00ea00000000ea0000000000000060ae60602860000000eaea00eaea000000ea % ea00000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdd6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3bdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae6060ff60ff606060ff6060606060ffff6060ff606060 % ff606060606060ff606060ff606060ffff6060606060ffffff606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc286060286060ea00eaeaea0000ea0000000000000060ae60602860000000ea00000000ea00eaea % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdd6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3bdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828aeffffff60ff606060ff606060606060606060ff606060 % ff606060606060ff606060ff606060ffff6060606060ff6060ff6060606060ff6060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc286060286060ea000000eaeaea000000000000000060ae606028600000eaea00000000eaeaea00 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdd6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3bdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae606060ff60ff606060ff60606060ffffff6060ffff60 % 60ff606060606060ff6060ff606060ff60ff60606060ffffff6060ffff60ff60ff60606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc286060286060ea000000000000eaeaea000000000060ae606028600000eaeaeaeaeaeaea000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdd6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3bdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060ff60ff606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc286060286060ea0000000000000000eaeaea00000060ae60602860000000eaeaeaea0000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdd6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e3bdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc286060286060ea000000000000000000000000000060ae60602860000000000000000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbde6e6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e6e6bdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060ff6060606060606060606060606060606060 % 60ff60606060606060ff6060606060606060ff606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc286060286060ea000000000000000000000000000060ae60602860000000000000000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbde6e6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e6e6bdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60ff6060ff6060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc28606028606000000000000000000000000000000060ae60602860000000000000000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbde6e6e6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e6e6e6e6bdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae6060ff60ff60ff60ff60ff60ff6060ff60ff60ff60ff % 60ff60ffff606060ff606060ff60606060606060ff60ff60ff60ffff60ff60606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbde6e6e6e6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e6e6e6e6bdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828aeff606060ff606060ff60ffffff60606060606060ffff % 60ff6060606060606060ff60ff60606060606060ffffff60606060ffffff60ffff60606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc28606028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae6060aeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbde6e6e6e6e6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e6e6e6e6e6e6ffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828aeff606060ff606060ff60606060606060606060ff6060 % 60ff60606060606060606060ff606060606060606060ff606060ffff606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbde6e6e6e6e6e6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e6e6e6e6e6e6ffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae606060ffff60ffffff60ffff6060ffff60606060ff60 % ffff60ffff60606060ff606060ff606060606060ffffff60ffff6060ff6060ffff60606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbde6e6e6e6e6e6e6e6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e6e6e6e6e6e6e6e6bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae606060606060ff60ff60606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc2860606060ff606060ff606060606060606060606060606060606060ff60606060606060ff6060 % 6060ff606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbde6e6e6e6e6e6e6e6d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e3e6e6e6e6e6e6e6e6bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc2860606060ff606060ff60606060ff60ff60ffffff60606060606060ff6060ff6060ff60ff60ff % 6060ff606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbde6e6e6e6e6e6e6e6e6e6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9de3e3e3e3e3e3e3e3e3e3e6e6e6e6e6e6e6e6e6e6bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae6060606060606060ff60606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc2860606060ff606060ff60606060ff60ff606060ff60606060606060ff6060ff6060ff60ff60ff % 6060ff606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbde6e6e6e6e6e6e6e6e6d9d6d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9de3e3e3e3e3e3e3e3e3e3e3d9e6e6e6e6e6e6e6e6e6bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff4592cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60ff6060ffffff60ff6060ff60ff60ffff60ffff60ff % ff606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc2860606060ff60ff60ff60ffff6060ff60606060ff60606060606060ff60ff606060ff60ffff60 % 6060ff606060606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbde6e6e6e6e6e6e6d9d9d9d9d9d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9de3e3e3e3e3e3e3e3e3e3d9d9d9d9d9e6e6e6e6e6e6e6bdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae6060ff60ff606060ff6060606060606060ff60606060 % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc2860606060ff606060ff606060606060606060606060606060606060ff60606060606060606060 % 606060606060606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbde6e6e6e6e6e6d9d9d9d9d9d9d9d9d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9de3e3e3e3e3e3e3e3e3e3d9d9d9d9d9d9d9d9e6e6e6e6e6e6bdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828aeffffff60ff606060ff606060606060ff60ff60606060 % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbde6e6e6e6d9d9d9d9d9d9d9d9d9d9d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9de3e3e3e3e3e3e3e3e3e3d9d9d9d9d9d9d9d9d9d9e6e6e6e6bdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae606060ffff606060ff606060606060ff60ff606060ff % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc286060282828282828282828282828282828282828282860602828282828282828282828282828 % 282828282828606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bde6e6e6d9d9d9d9d9d9d9d9d9d9d9d9d9d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9de3e3e3e3e3e3e3e3e3d9d9d9d9d9d9d9d9d9d9d9d9d9e6e6e6bdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bde6d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d6d6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9de3e3e3e3e3e3e3e3e3e3d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9e6bdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % ffffffffffffffffffffffffffffffffffffd6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9d9de3e3e3e3e3e3e3e3e3e3ffffffffffffffffffffffffffffffffffbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc28606028606000000000000000000000000000000060ae60602860000000000000000000000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9de3e3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60ff60ff606060606060ff6060606060606060606060 % 60606060ff6060606060ff6060606060606060606060606060ff6060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc286060286060000000c4c4c4c4c4c4c4c40000000060ae60602860000000000000c4c4c4000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9de3e3e3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828aeff60606060ffff606060ff606060606060ffff60ffff % 60606060ff60606060ffff6060ffff6060ff60ff6060ffff60ff6060ff6060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc2860602860600000c4c4c4c4c4c4c4c4c4c400000060ae6060286000000000000000c400000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6d6d6d6d69d9d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % 9de3e3e3e3e3e3e3bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4592cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828aeff606060606060ff6060ff606060606060606060ff60 % 606060ff6060606060ffff60ff606060606060606060606060ff606060ff60606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc28606028606000c4c4c4c4c4c4c4c4c4c4c4c4000060ae60602860000000000000c4c4c4000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdffbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd6d6d6d69d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % e3e3e3e3bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdffbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ffcc92cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828aeff606060606060606060ff6060606060ff606060ff60 % 606060ffffff606060ffff60ff6060606060606060ff606060ff60ff60ff60606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae4545ccff000000000000459292 % cc28606028606000c4c4c4c4c4c4c4c4c4c4c4c4c40060ae6060286000000000000000c400000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdffbdbdffbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdd69d9d9d9d9d9d9d9d9d9d9d % 9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d % e3bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff4545cc2860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60ff60ff60ff60ff6060ff60ff606060ff60ff60ff60 % 6060ff60606060ff60ffff60ff60ff606060606060ff60ff60ff60ff60ff60606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae454545ff000000000000459292 % cc286060286060c40000c4000000c40000c40000c40060ae606028600000000000c400c400c40000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdffbdbdffbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c286060ae7c2828606060ae459292ff0000000000004545cc % cc286060286060c400c4c4c400c4c400c40000c4000060ae6060286000c40000000000c400000000 % 0000c40060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdffbdbdbdffbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c286060ae7c2828606060ae459292ff0000000000004545cc % cc286060286060c4c400c4c400c4c400c4000000c40060ae6060286000c4000000c400c400c40000 % c400c40060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdffbdbdbdffbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c28ae7c7c2828606060ae459292ff0000000000004545cc % cc286060286060c4c4c400c400c4c400c40000c4c40060ae6060286000c4000000c400c400c40000 % c400c40060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdffbdbdbdffbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdff % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c28ae7c7c2828606060ae459292ff0000000000004545cc % cc286060286060c40000c4c400c4c40000c400c4c40060ae6060286000c40000000000c400000000 % 0000c40060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % ffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff9292922860606028ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060602828ae60606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060ae7c7c7c7c7c7c2828606060ae459292ff0000000000004545cc % cc286060286060c4c4c4c4c4c4c4c4c4c4c4c4c4c40060ae6060286000000000c40000c40000c400 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff929292286060602828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 2828282828282828282828286060ae2828282828282828606060ae459292ff0000000000004545cc % cc28606028606000c4c4c4c4c4c4c4c4c4c4c4c4c40060ae60602860000000000000c4c4c4000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff929292286060602828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 2828282828282828282828282828282828282828282828606060ae459292ff0000000000004545cc % cc28606028606000c4c4c4c4c4c4c4c4c4c4c4c4000060ae6060286000000000000000c400000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff929292286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc2860602860600000c4c4c4c4c4c4c4c4c4c400000060ae6060286000000000000000c400000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff929292286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc286060286060000000c4c4c4c4c4c4c4c40000000060ae60602860000000000000c4c4c4000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdffbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff929292286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060606060606060606060606060606060606060ae459292ff0000000000004545cc % cc28606028606000000000000000000000000000000060ae60602860000000000000000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdffbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff929292aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae459292ff0000000000004545cc % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffffbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdffbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff929292454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 454545454545454545454545454545454545454545454545454545459292ff0000000000004545cc % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdffbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % ff4592929292929292929292929292cc929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 9292929292929292929292929292924592929292929292929292929292ccff000000000000459292 % cc28606028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae6060aeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdffbdbdbdffffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % ffcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc % cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc % cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc % cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc % cccccccccccccccccccccccccccccc45ccccccccccccccccccccccccccccff000000000000459292 % cc286060606060606060606060ff60606060ff606060606060606060ffff6060ff60606060606060 % 606060606060606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc286060606060606060606060ff60ffff60ffff606060606060606060ff6060ff60ffff6060ff60 % 6060ff606060606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc2860606060606060ffffff60ff60606060ff60606060606060606060ff6060ff60606060ff60ff % 60ff60606060606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc286060606060606060606060ff60606060ff60606060606060606060ff6060ff60606060ff60ff % 606060606060606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc286060606060606060606060ff60ffffffff60606060606060606060ffffffff60ffff6060ff60 % 606060606060606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc286060606060606060606060ff606060606060606060606060606060606060ff60606060606060 % 606060606060606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc286060282828282828282828282828282828282828282860602828282828282828282828282828 % 282828282828606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc28606028606000000000000000000000000000000060ae60602860000000000000000000000000 % 0000000060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc28606028606000000000000000000000000000000060ae6060286000c40000000000c400000000 % 0000c40060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc2860602860600000c4c4000000000000000000000060ae60602860000000c40000c4c400c400c4 % c400000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc2860602860600000c4c4000000000000000000000060ae60602860000000c4000000c4c40000c4 % c400000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc28606028606000000000000000000000000000000060ae60602860000000000000000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc28606028606000000000000000000000000000000060ae60602860000000000000000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc2860602860600000000000c4c4c4c400000000000060ae60602860000000c40000c4c4c4c40000 % c400000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc2860602860600000000000c40000c400000000000060ae6060286000c4c4c40000c40000c400c4 % c4c4c40060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc2860602860600000000000c40000c400000000000060ae60602860000000c40000c40000c40000 % c400000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc2860602860600000000000c4c4c4c400000000000060ae606028600000c4000000c4c4c4c40000 % 00c4000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc28606028606000000000000000000000000000000060ae60602860000000000000000000000000 % 0000000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc28606028606000000000000000000000000000000060ae606028600000c4c4000000c4000000c4 % c4c4000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc28606028606000000000000000000000000000000060ae60602860000000c40000c4c4c40000c4 % c400000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc28606028606000000000000000000000000000000060ae606028600000c400000000c400c400c4 % 00c4000060ae606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc28606028606000000000000000000000000000000060ae6060286000c40000000000c400000000 % 0000c40060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc28606028606060606060606060606060606060606060ae60602860606060606060606060606060 % 6060606060ae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc28606028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae6060aeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeae606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000929292 % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000454592 % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae454545ff00000000000000ffcc92ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc2860ff60606060606060606060606060606060ff60606060606060ff60ff6060ff606060606060 % 606060606060ff6060ae459292ff00000000000000ff4545ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd454545ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc2860ffff60ff606060ff60ff60606060ff60ffff60ff60ff60ff606060ff6060ff60ff60606060 % ff6060ff6060ff6060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc2860ff6060ff606060ff606060ffff60ff60ffff60ffffff6060606060606060ff606060ffff60 % 60ff60ffff60ff6060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc2860ff60ff60ff6060ff60ff60606060ff60ffff60ff60ff60606060ff60ff60ff606060606060 % ff6060ff6060ff6060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000459292 % cc2860ff6060606060606060606060606060606060606060606060606060606060ff606060606060 % 606060606060606060ae459292ff00000000000000ff4592ccbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd459292ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % cc286060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060ae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % ccaeae60606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060606060aeae4545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000004545cc % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 454545454545454545454545ccff00000000000000ff929292bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbd4545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000454592 % 92929292929292929292929245929292929292929292929292929292929292929292929292924592 % 929292929292929292929292ccff00000000000000ff929292454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 45454545454545454545454545454545454545454545454545454545454545454545454545454545 % 454545454545ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000000000000045cccc % cccccccccccccccc929292924592929292929292cccccccccccccccccccccccc9292929292924592 % 92929292ccccccccccccccccccff00000000000000ff9292929292929292929292929292cc929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292929292929292929292 % 92929292929292929292929292929292929292929292929292929292929292924592929292929292 % 929292929292ccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000ffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffff00000000000000ff929292929292cccccccccccccccccc45cccc % 929292929292929292929292cccccccccccccccccccccccc929292929292929292929292cccccccc % cccccccccccccccc929292929292929292929292cccccccccccccccccccccccc9292929292929292 % 92929292cccccccccccccccccccccccc929292929292929292929292cccccccccccccccccccccccc % 929292929292929292929292cccccccccccccccccccccccc929292929292929292929292cccccccc % cccccccccccccccc929292929292929292929292cccccccccccccccccccccccc4592929292929292 % 92929292ccccccff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffff %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice /pop load def %%EndProlog %%Page 1 1 /picstr 3066 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def gsave 60.72 276.48 translate 490.56 239.04 scale 1022 498 8 [ 1022 0 0 -498 0 498 ] { inputf picstr readstring pop } false 3 colorimage 78DAEDDDCD91E336A370E109C49B594C04AEBAF5ADBD9EE51B42A7F0EE9DC48D 4359388D09C55F97BBAE4A1649100001E2EF390B558F8692D812D53A3C02C1BF FF06000000000000000000000000000000000000002CC1370040537C1201006E 33FFBFEAF0E79F7FFEF1C71F7F01C0B0D4FE3BF679FFCC1F80C28CDBDAD1D3FC 3F3F80CA5EFEF10FAF1F702E5DBA7439D665EDBF639F77CEFC0128CC5316E63E DBD1D72BF2FC182ACBF3F7FD1300C6A4DEDFB1CF7BD6FC012C62FE0B16E63EDB D1EB2B52E91393390018DDFCEBDD39F30730BDF92F5B983B6C476FAFC8D7FDB8 74E9D2A5CB7A97AF7F6F993F80459AFF8285B9C376B47D457C28BB74E9D2656D EDD7FC012CD8FC7D04346F47BBAF8803A501A006BB7F6FB90180759A3F756FDB 8E765F917A076203C0B21CFDBDE50600966AFE2A50C37674743FA50E4336A5A7 4B972E87BE7CFE29BB7E6F9A3F00CD5F616EDB8E02AF88B97D000C3D214F577F C75E3FEC347F008B37FF450A7387EDE8F415997BB62500536A7FC1ECB0FD3B16 FFCDECAEF96BFE0034FF9E0BF3DCEDA8DE2B72F1C3F7E8D3B3379E6B78FAB99F 77B76F3F07166BF58B37B93970CFDFEDDDBF63919BEEEB625FF7A3F903D0FC3B 2FCCD3B7A30E5F91B75FB96745ACB79ED39B3FF9C7D0CD3F630BD7FC0168FEB5 0B738C452FDE8E7A6BFEDB17A85B3F7C5BB182EB197957A39B33F3C7F4CDFFB9 A4E60F40F3BFB330673BC6F4EDA8ABE61FF332EDEEC1BD0DB9D97E719074DB3F 23C61AC56B7F78C9F02A05968FBCABC8DF7A77E5037B61A70F1DF333F987E6AF F903D0FC6BFCA9BF221873B7A3AE9AFFE9CB14F6C9ADCAC6BB68CCAD8A9BFFF5 9F6BDC3CD5FC777F66FED0FC357F0068529803561308A49AFF733D534F3490F7 E19B2A8149AE1B1FD5E3379EA3CD2990E5635629F2FAC8DF2EE6198BFC35939E 58E68F9E9B7FD2E04FCD1F00C66AFEE1A1E3A712A8F9A70A79DE4E53EA509FBC C41DDFBAE387C15C0FFE191B67CC6F17F38C5D5C93D32736723F08B8B3F9C71F 98AFF90340EDE65FBC30C70CB40E68FFDCED28F215C94BF1659B7FF6E096A4B9 71EE19EA1379938CE07F712722E9E6310FFD76C9FCD149F38FDF02357F00A8DA FCCB16E653D938D598B9DB51E42B92B13B56A4F9A70ED7B968FE194A9CB758EA AF9361FE798FBEBB7967EFBF9C1E47CCFCD1AAF947461BCD1F006E68FE050B73 5EF08F1FB2327A3B8A3FF222E38B982B73FB14398235757057C62CFA498BF573 6C6FA47BC7CF3B94F164D27EB46AFE495FD76AFE0050BBF9172CCC17CD7FFA76 D4E77CFEE1E1F77FE61E491A7F586B7C4E0F8F404B9D84B3D27C9E7FA61F0E9C F495D9A9D8337F74D5FC2FFE1DD3FC01A0CFC29C776C6FEADC3E43B7A3E1CEAA DC09ACD51388A19BFF95BF639A3F00F45998F3E6F37CBBDEDC3E3D7CF81257CF 1EA0F903C0ACCDBF93C26C3E7FCD9FBE7ADEA0F96BFE00D07FF3D78E347F009A 7FF1BFDB198351357F009ABFE6AFF903C058CD3FC9FF357F00CC5FF3EFA71D69 FE0034FFDA7FC7347F009ABFE6DF433B0ABC22CFC7BA72F9793F17EFC1A54B97 2E532F9F7FB78BDC5BA9BF639A3F00CD7FF1E6DFBC1D3DCF86F0763FCF07BA48 A9FB0180567F7C4ADDD5EBDFEDD7DD016E0060C1E6DF6D619EBB1D7DDE64FB19 F70D005081E75FECD7DD016E006062F31FB1304FDC8E9EF7F37A6F9FFC070050 94B7BFB75F307F00739BBFC2DC553B7AFD247ADD89F0190D0035CCFFEBBB5AE6 0F609DD13EDBC2FC0B89946A47BBC70B307F00A8D7FCCDED036041F37F2DCC4C 3E898F8F8F52ED68F77801E60F00559BBFB97D002C65FE6F85F94B681F88E0E3 1FAACEE7CFFC0140F3078022E6BF2DCCCC3FCFFC2BCDE7CFFC0140F307801B9A 7FDB813491FADD70DD347F00D0FC01608EE6DF76FC7CB7E6FF5C37CD1F00347F 0098A9F9B71A459364FE4DD64DF30700CD1F00666AFECC3FC6FC357F00D0FC01 40F3D7FC357F00D0FC0140F3D7FC357F00D0FC0140F3D7FC7D460380E60F009A BFE60F00D0FC0140F3D7FC01009A3F0068FE9A3F0068FE9A3F00CD9FF96BFE00 A0F90380E6FF79DB5D2B3EBA3EE67F4B99FFB77FA3F90300347F00CC3FBBF9EF 4A7541D3BE68FE79BB1B9A3F0068FE00A0F96798FFB6BA3F7FFEFA21B0A750D0 FCDFAE395AABEDCA1C7D6BA0F90380E60F004B35FFAD516FDD7E57F8DF347B57 FE2B99FFD15AEDAEE1D11D6AFE00A0F903C052CD3F6CFE61F10E787513F38FBC 52F30700CD1F00D66CFEA7A9FF6DC0CC58E67F7498B0E60F009A3F00ACD6FC03 E67F3ADA67A0E66F9C3F0068FE00A0F9E7E9F49DE67F71558DF30700CD1F0034 FFD39F9F4365628EFFBD673EFFC08C43A7B30069FE00A0F903C06ACDDF397C35 7F00D0FC016085E6CFFC357F00D0FC0140F3D7FC357F00D0FC0140F3D7FC357F 00D0FC0140F3D7FC357F00D0FC0140F3D7FC01009A3F0068FE9A3F0040F30700 CD5FF3070068FE00347FCD5FF30700CD9F1B00D0FC99BFE60F009A3F00ACD0FC 3F1A9164FE4DD64DF30700CD1F00A669FE1FED8837FF56EBA6F90380E60F0073 347FC48CFCD1FC0140F30780D19B3FE2CD5FF30700CD1F00347FCD5FF30700CD 1F00347FCD5FF30700CD1F00347FCDDF67340068FE00A0F96BFE0000CD1F007A 6BFEDFF628FE109A3F0040F307804E9A7F3D3F6F68FE9A3F0068FE00A0F99FFA F9F62B80AF9F9FD73CFFF76D99D75B55FA1E41F30700CD1F0034FF22E6BF15FE 57D53FBDF26D01CD1F00A0F90340B7CD3FECF0A792DF83F96BFE00A0F90380E6 1F3FDA27C9FCC3B7D2FC01009A3F0074D5FCE393FE69DED7FC01009A3F0074DB FC9306F318E70F00D0FC0160D0E6FF362DCF760E9FC8B97DDE760D347F0080E6 0F007F0F7B0EDF9BABBEE60F009A3F0068FE4D6CBF5BF3D7FC0140F30700CDBF 88FCDF3C9247F30700CD1F00347F68FE00A0F90380E6BFA6F96BFE00A0F90380 E6AFF96BFE00A0F90380E6AFF96BFE00D067F3FF06007D53B0F97F600FCD1F00 1669FECF258BF3F5A07F0198972F91AB77FF49A939A6F993FC2DAF5F8868FE00 307DF37F7EC296BD7C5382E2F7EFD2A5CB1E2E9F6FF3E2F7FC458DE66F54CF93 B7A1509A3F00ACD0FCDF3E6A4BF1AA0400E6E37507BFD2FDD768FE843FC6FC35 7F0098BBF957327F7604CC2DFFF5FE8068FE9A3F00A05EF37F3619972E5DBA6C 72A9F96BFE0080DB9A3FF170E9D2655BEDCF134ECD5FF30700CD3FA3F99B4510 4013AE08A7E6AFF90380E69FD1FCEB4DF50900475C144ECD5FF30700CD3FAFF9 979AA6CF949E2E5D7678F97C7B76B5560D9BFFE76D4F7F0EB3BB64FCCD357F00 40DBE66F6E1FC0843CB74DDEFBFA97E7FEE6CFFC357F00D0FC3B51020035CCBF C87B7CBB13113FAAFFED7E3A6FFECFD57EFBDFD7CBD725357FCD1F00D669FEBB 4A10CFAE1EDC4C93470F3852A9F5E9E1B9ADF48C51FA1BDE9BA73B11912FC4DB 626D9BFFABA56F7F38FAF9754760F707CD5FF30700CD3F52E41AEA77F387DE7D F4EBEB33D9735BFCD75967F7A176F34F7DB69B37FFDD801F63FE91576AFE9A3F 0068FE91EAB566CE7DFBAD2B696DABE7B6C6AFC3FC876BFE6F037E7A68FECC5F F30700CDFF9EAE18E35D47433B76AFDF8E9339ADC447436BB6F71FF3730DAD8D FFF5DB3EB7E1E76D771453F8818AFC3AE12D2170E5E916A2F98FDEFCC3D2AEF9 6BFE00A0F997ED8AA72A952ADE5BBDDC55CD53F3DFFDB989F99FEEBF1C3DFAFD CF6DFC53143EF633CFFC63563B66AD02F730AEF96BFEF798BF71FE9A3F008CD8 FC53CFC299D7154F7371647A4D32CF98DBC63CEE9DCD3FFE57E8FFB94D52EE3C EDBFA2F7F1AB3459F38FDFB559A7F907E6F6399A0548F3D7FC0160C4E69FE439 6F1FE51787FA045AEBA9A4E545EC8CC78D997E27BC8B94ADFD81D5EBE4B98DBF CFE2E69FF4D0A75F434CA6FDE1F766D2EF3B53F3770E5FCD1F0034FF54F37F95 FF2BCD3F664CF595289D11AE8FD6EDF5B261F0EFE7B98D3FE220FE508B48F3CF 7BE848BD9FE610E0D3E61FF9FB4ED6FC99BFE60F009AFFB7748A34FF8CE1EB79 83CCF3D47A77C04CC1F9F6AB9A7FEDE7365EDA4B99FF959D8EF86994D669FE49 037E347FCD5FF30780699A7F86FFE7CD1F927124E6959F771F28E3B6659D3063 A84F6A09BFE1B9CD183F1F7E51CAFE3A4506FF4FDCFCE387FA6BFE9ABFE60F00 9335FF3BE70FD986F45315399D1026DEDE4F877C9FFAE7CDE69F7430E6CDCF6D F83E93BE6E4855D3983982329ED59986FA98DB079A3F0068FE3D9CC3178BB3E6 89DB7A6BFE577622347FCD5FF30700CD1FA0FD9ABFE6AFF9FB8C0600CD1FA0FD 9AFF3DCDFF17FE8DE60F009ABFE60F68FE79CD3FEFC47FF7347F9E1F69FE9AFF E9E72C8009D0FC357F40F3BFBE13913A0FD83DCD1F6134FF0CF3DFFDAFE72580 B6EFD3A337E394E6AFF903B8BFF967DFCF0DCD1FF1E6AFF9C718C5AE5404FE0B 803769B7CDFF79C32B979FF773F11E5CBA7459E3B2D47BF3B91371FD7E347FCD 7F44A9D8CA43E0BF007887366FFECF055E3F6A9F9FC51729753F00CA52F0BD59 EAAE347FCD7F50AF88D70C00DE9ECD9BFFF643DCE11E009AF0F587EB6D77A0E7 E6FFBAF27937D7FCE7508BC8A10500BC379B37FFBF5E78AB6400701BAF7FB89E F4DCFCDFBC3D43E37B367FCD3FD52EFE737638212503BC317B68FE6FDAFF5AC9 00E01EDE8433DBFC6F6BFE6169DF7E11F0F5F3EB95BBCB1CDD4AF31F4230FEF3 7F138624DD048077E5FDCDDFC85800430F32B9F9AF59C0C6B7EABE75FEC09247 B7D2FC87700CF20F8CA2FDFF31B78FD930000C3BC8A49FE67FE4F091571E2DA0 F90F64FE610F2169C06DDA1FF36ED5FC993F00CDFF8AF96F8FFC8D31FFF0AD34 FFB1CC3F3B4202487A279EEE656BFE9A3F00CDFF9EE69FF14540E4A368FEFD9B FF22CA01781B6AFE003077F37F1CCFED33C7681FCDBF8872907FC07B50F30780 D19BFF7688CEEEF5A7621F33B78FE63FB475FCC731BFC05D6FC0DDF79AE6AFF9 03D0FCA1F9DF66FE79D703A8FD16D3FC357F009ABF1742F3AF61FEE47F08FEDF 019E9941B55FF357C90068FED0FC9B983FF91FCBF6ED054CA0FD9A7FF14AF66D 8F47CD23D48E1E7177C9B2EB70F398DB4ACF5BB7AB57EA991FFA65229C9ABFE6 3FB7F993FF1155DF8EC0B8DAAFF917AF64B7597786D785CF983996F95F79E8DD A308FBDC3149FDAFDDE787F96BFE9ABFE6DFB3F993FF096CDF5EC028DAAFF9D7 68FE37DB7286F9975A9971CDBFFF2A5ED0FCA1F91FFD35FBC0019AFFCDE64FFE 67B27D7B013D6BBFE6DFB6F99F8ECF29322CE468C451C1870EDCE1D1BC7CE185 C3D75F5CF3D3530E5D59B752AFECDB4B16B87EF73CA78193A526BD2298BBF933 FC5DDE9E1FCDFF3697389AED93FC0FAAFA76046E7BAF259D085BF3BFA7F9EF8E B4399AC5BAA0C71E3D5CD9E67FFA40910BC7FF7C7DCD8FCE105A64DDAEBFB291 E65FF599C722CDDF13FECAF6F9D1FC6F7689EB62C3F687C3AB76E7AEB1E65FBC F9EF1E6C7B6ADD57CCFFE8F0DED3536A1634FFD33D82F8B58A59C92276BA1BF0 B3BFC149BD938CE7367E2B8A39FF69F14D1183367F4F788CF96BFE77BA84913F D3ABBE1D81866F0ACDBF6DF32F352C24E6BFEE37FF47C459384F9F907AE61F4E E5817132A7EB76FD9565FECC5FF3D7FC97357FF2BFA0EDDB0BB8EDEDA0F9B71A E77FC3D49A3D987FBC5D9F3E75F5EC34F5CB8B7BBE8F088CFC61FE9ABFE6AFF9 CF6DFEE47F65DBB71750F58DA0F9376CFEEB987FF6A89EA3E52BCDED73712452 916310983F347FCD9FF9937FAA6F47A0D25B40F36FD8FC673AC237C93FDB1EE1 1B98CFBFB7237C23874885BF58495A98F96BFECC5FF3EFCA25569BF087CFDB0B 086FE4D78F76D7FC5B35FF47B9593DC307F986CF235C64A723639C7FA99933AF 3F6FBBD13E3C3DE9EE149A3566F58CF967F8497B44CFEAC9FC357F68FEDDBAC4 C4F24FDAED08DCBCCD6BFECE7A79333D8B25E985E65FEF8D30C4FB4BF3EFD625 66927F666E2FA0E1D6AEF9976DFE60FEC0E8CD9FF96BFE7DBAC4D0F2CFC0ED05 74B29D6BFE9A3FBB66FED0FC5FDF05814183AFEF94F00138E1534B6BFE9AFFF4 F24FB3ED08F4B9856BFE059BFFB763EA99EAFD0FFA3898DC7E94FD8E26CF58D9 F51CF199C7A0CD3FE668F1C0958F0A139A69FE2B9B7FE7F2CFA5ED05F4BF6D6B FE9A3F00CD3FE6CBAFB0D83F12E795D5FC35FF69E49F36DB051868ABD6FC8DF3 07A0F907CC3F7CF6EAC0970231E7BCD6FC997FF6236EEFF9FA8487B41FF7CBFF CD1BB3E6AFF903D0FC5347FBC42F70FA5582E6CFFC878EFF3C99F98FB50D6BFE 9A3F00CDFFBAF91BE7AFF9377189B6F24F92C9FF705BAFE6AFF903D0FCB7C37B B6A37D1E9B597DDE963F9D11C8DC3E9AFF4CF24F8FC9FF88DBADE6AFF903D0FC 8B30C17C539AFFA02ED144A2B831F31FF1BB2ACD3FBE927D00C05D346CFED9B6 3FB1F96BFEFDBBC4CD2A458CC9FFA043D434FFC84AC64300DC6FFE4334FF994E 30A1F90FED124773A4D07EF423FFCDE7A4D2FCE32B1900DCC628CD7F3234FF09 5CA2B6FC9361F2DFEDC6C9FCCB8EF307807B18749CBFE6AFF977E212DF6AC284 57A3EAE6E4DDDA73F3F799086085B97D98BFE63F81F9575A131A2CFB8F38B65F F337B70F0073FB307FCD7F29F3BFBE320498FC77B541327FCD1F80E6AFF96BFE 5C22BC3ED9ABC47E997F91A3CE99BFE60FA013E56B88E6AFF933FF1BD6277BAD A82F7AD80E99BFE60F6002F37F3570CD5FF367FEB5CD3FF52860D28B8CA37D8B 6CA8CC5FF307505BF99A0CEFD1FC357FE67FB3F90BFEA897FD99BFE60F80F9A7 9ABFE6AFF933FFE6E64F779121FFCC5FF307C0FC357FCD5FF31FCBFC892EF2E4 9FF96BFE0098BFE6AFF96BFECC1FCC9FF98FDBFC3F16800C80F96BFE9ABFE6BF A0F9535C64CB3FF39FB5F94FAFFDBEEC00F3D7FC99BFE6BFA0F9935B5C917FE6 3F77F3E74280AD7DD0E6FF0B07E756D0FC993FC0FC357FE67F1BBBB3E34EF93C CFFDDB8DBEB5EFBE2ECF2B8F5EB5A457B361F327F991E6AFF9AF66FEB41617E5 9FF96BFECCFFA2F34FECFF7DFE5E796B75FD956AF56CF469FE559BFFDBEFDEFC E4C59DAC46D95D30CD7F44F327B4B82EFFCC5FF367FE17D57162F99FC3FC4BED A98D65FE81DFA2FFE6DF8372BFFEE29DAC46D95D30CD9FF983F9337FCD9FF9C7 D863DE02B8E78588593EE3956AF8FA5E6FFEAF6B7EB4D3DA73F3BF7F337BFBC5 3B590DCD7F71F3A7B22822FFCC5FF367FEA57A2FF3BF799CD595172EF24E7A18 D375D1FC5FD739E6E70E9B3FF3D7FC993F894529F967FE9A3FF3BFA7F7C6DF49 FCF70BBB0B87353570CFA96D3CE351B23D3CCFC0937ED911CD3FB07A4703FE4F AFD7FC357FCD9FF983F97BB74ED3FC2F26D0C5CDBF60AF0EEB68A4BD4752DCFC 4F1FA8B8F9E72D5C76AB1EB7F91F2D70BA416AFE9A3FF3EFC1FCE92B0ACA3FF3 5FADF99F8E5761FE65952FDCE46B2C19BEF975F34F7AA024F32FFE7230FFF8E6 1FF367A479F3FFAD3291E6FF7765347FE64FFB514FFE99FF82CD9FF93731FFD5 AE8C9F04297BAE9EA425AF0FD761FECD9B7FB7E6FF79DB56E6AFF9337F80F96B FE91E6FF6A44CCFFE270F170753FBDCF8229FE669F8FFF8D1A9A7F91E1FA8EF0 D5FC77CDFF7973CD9FF917377FCA8AE2F2CFFC576EFEBBA6C7FC997F11F3DF6E 606FF93D6FA8CF15F30F8FA19AD5FC1F7566F5D4FCDFB4BFA0FC6BFECC9FF6A3 9EFC337FCD9FF9D71B581E7FF8ED9DE61FBFDF71DAED638EF30D0CBCB9D3FCAF 3B7C6FE67F030335FF808DCF6DFE9AFFACE64F535149FE99FFE2CD9FF933FFDA E6BFB5FDC05E40D597E3A2C633FF6E9BFFEEC0FB1BCC3F7265347FE6CFFCC1FC 99BFE63FA2F9C74FFF5ED5517B30FFA4A72E7EE40FF3D7FCC732FFB771FEF79B BFE63FA5F91354D483F96BFECCBF94F52595FCB6E6FF889BCEBDE0D1B89147FB 327FCD7F20F3EFE1085FCD7F3EF3A7A6B873AA1FE6AFF933FFBCEC7FFD9C56B7 1DB77BC5FC1F8967E36A6BFE194F0BF3D7FC1FE6F6D1FC993F983FF3D7FCD736 FF78890DFC6FEA954907A866286EFCEECCE9AD62CE385C4AA4F3BEA4C87B5699 FF2873FBB43AC257F367FE65CD9F94A207F967FEB336FFD4FF5DDCFC1F11F3C3 C774EF18498E5CAC89F927FD46CDCDFFE2B3CAFC5798CFFF29F09ABFE6DFD6FC E9283A917FE63F6BF367FE05FDFFED7FE3BF32289EE26F30FFA4DFA8B9F95F19 DAC4FCE79ECFFF4DE0357FCD9FF983F933FFF99A7F590D5BD0FC81FBB7F68F76 4CD9FC770F0DD0FC35FF86EB4344D18FFC33FF999AFF4C2EC409B188F97F3465 BEE6BFBB629ABFE6DF707D2828BA927FE63F53F367FE00AE0CFE99669CBFE6AF F9337F80F96BFECC1FC0A9F98F3ECE5FF3D7FCFB711BF289DEE49FF96BFECC1F C034CD7FEBED9ABFE6DF6A7D68273A947FE6AFF9337F007334FFC0CCFF9ABFE6 CFFCC1FC99BFE6CFFC0174D2FCAF9CA8EBF4845F9ABFE67FF3FA104EF429FFCC 5FF367FE007A68FE57CED27B7A9E5FCD5FF3BF737DA826BA957FE6AFF9337F00 9D34FFB0BD474EE3338DF96BFECC1F60FE9A3FF3073071F38F34F9A3397C6632 7FCD7F50F32799E859FE99BFE6CFFC01F4D6FC33087F35A0F96BFEF7AC0FBD44 E7F2CFFC357FE60FA09FB97D6A687F13F3DFBDA1E6CFFC01E6AFF9E735FF5F53 C3C480D59A7F78244FB6F3376CFEDB9B6BFE739B3FB144FF30FF419BFFAFD961 62C09ACD3F7E172069F29F8BE65FEA5C039AFFC42E412931DCD1BECC7F94E60F 007337FFE23437FF2FF9D7FC993FC0FC35FFD4E60F008B34FF69CC5FF39FDB25 C824C83FF3D7FC0168FE439B7FA9E9868CF39FDB256824C83FF3D7FC0168FEA3 37FFEBDA6F6E9FE95D824082FC337FCD1F80E6AFF99BCF9FF903CC5FF3D7FC01 68FECC5FF39FC025A86355FEFB0F9E8709E45FF32F329F3F10E673FBF12460BB 55F4D9FC6FDEC7E96D3534FF115D8234D676FE573C2743CBBFE66F3E7FD4E669 FE9E0ABC6D157D367FE6AFF9337F1C693FF967FE9ABF814038F58AB0E961D9AD 42F3D7FC993FED1FCBF9F9FFE8F2AFF91769FE3406CC1F35CC5FF3D7FC993FED EF53FBC9FFA0F2AFF96BFE60FEE86D83D1FC357FE6CFFCFBD77EF2CFFC357F80 F9A3A0F9DFD9FC5B1DE9DCDB6A68FE03B904456CEBFCFC7F44F9D7FC1769FEDF 8E215AEB987F871BC07605C2AB94BAC265EF6DE2E6DF708EA3DE5643F31FC525 C8613FDA4FFE07927FCD7FC1E67F9BEDD8ADE8D0FC7B7B0577CDFFE871337655 4637FF7B9A7FE0D9B8F8045E7C869F377FBD9FDB5E35CD9FF9737EFECFFC357F E6CFFC993FF39FACF9EF6AF6EBE5DB7746BBFFCC5820F2E5DBDEED763D8F1E6E 77B3895C07CDBF6797A0857D6A3FF9EF5FFE357FCD7F3B0E24F0B9F9BACCEE07 7AC10F7DE67F9BF91FBD5281EB8F36925D553BBDF9AEEC9D5E7F346669772BDD 2E93716F8B34FF806647A6F8F805AE34FFDDF58CFF454ED741F3EFD6250861B7 CECFFFFB977FCD5FF3DF75FB801026FD7CE5439FF9DFD9FC63B4ADF6469264FE 171F28FEDE061D6472BDF9A75E99344AA794F917BC95E6CFFC693FF967FE9AFF 9AE3FCC3B214BFD891106AFE0D5FFAC0E1BDBB193CFBD5CF70B3246DBBB235EE 9AFF69FD5EAAF9E759F4EE777FA7DF259532FFD347BF32DA47F3EFC725A8E028 DA4FFEFB947FCD5FF30F7C28C79B7FE4CD8DF61965A7EF54DB32CC3FE6E60DCD FF748C5313F31FA8F9272D90BAC5D678F4A4D13E9A7F272E410207727EFEDFA7 FC6BFE9AFFEE808D2BCD3F661783F98F68FEA93709C4F318F30F7F0D51B5F9B7 DD6E076DFE4DC6F9673CBA71FECC9FF6937FE6AFF91BE75F70B44FAA2B32FF4E CC3F69B44F86F9A78EF6E9CAFC1FCB8FF37F1C1FB6BFBBC0EEBC3A7973FB3C22 0E3A3E7AF452A37D34FF1E5C82FE0DEAFCFCBF2BF9D7FC35FF47CA41918EF09D D5FCAF1CE19BDAFC2347FB64DF61FCCFFD1FE1DBF97CFE4DB658F3F9AF69FEC4 6F02ED27FF3DC8BFE6AFF9EFE6B2C0FC2A91B37A1E099571FE6D5FFADD01ED49 F3F384A7E58C19E77FBA8DA5DE61CCAC9E314DB8C3593D9B347FE6AFF9337FCE CFFF99BFE63F8DF9DF3374041D9A3F46D9605A35FFBC335ED5DE576DB54A9A3F F3A7FDE49FF96BFE2B9B7F601677307F8CDEFCA1F9F7EC12FFF33FFF43FC66D2 7EF29FCA8F1F3F98BFE6DF76B8083160FE98A9F943F3EFDCFCC9FF4CCECFFF53 B59FF96BFE60FE187DABE8A4F9FF6A4A6FABA1F977EB12E47F4AED27FF776ABF E6AFF983F9A367F3BFA7F937F4EDCFDFB4B7D5D0FC3B377FF23F99F3F3FF18ED 67FE5D357FE0942FB500DEB68AAE9A7FABE134BDAD86E6DFBFF993FF29B59FFC 07B49FF9F7D3FC7F0140B911260D9B3FF3D7FC07327FF23FA5F693FF23ED67FE FD347F00E8F0C052CD5FF39FCFFC65FFE99D9FFFD70EFE9ABFD93000F46CFE9A BFE6CFFC65FF05B59FFC570AFE9ABFE60F40F37FBBF2EFCA449A7FABD5D0FC07 32FF35E5FFBF8B41FB99BFE60F40F3AFD7FC9384F6B74492CCFFB76AA49ABFE6 DFADF9AF26FFFF5D92C5B59FF96BFE0034FF4E9A7F6DF3AF51FB33CC5FF3EFC7 259695FFFF2E0FED67FE9A3F00CDBF55F3FFF2E7A7CF47EE205432FFA47D04CD 7F3EF39F5EFE69FF0AF2FFE300E6DF4FF337213980F9E6F34F32ED18F37FDB47 286EFEAFBB159A3FF3A7FDE49FF933FF4ACDFFEBB31B089F1BD49380A30D639A 71FE494B9635FFED6822CD7F4DF39F52FE79FE3AFEFFE318E6DF55F3776E5638 81EFCA5CF91270DCE6FF2AD861DFDE5DB2A0F91F1D4AA0F94F6CFEEBC83FBD5F 47FE6FD37ECDBF48F3273F60FE86EB2499FFD0CDFF4DAD03B27DB46429F30F1F 47ACF9AF69FE73C83FAB5FCAFF7F0461FEDD36FF6FC086A7E01DA905C665FB67 E1EB55FEDF7FF3B9CCF69A78F31F656E9F86A37D8CF367FE93C93F995F4AFE7F 9CC1FCBB6DFE2C17CC9FF9BF99FF53F2B3CDBFB7E6BFB5EB5DE5DE95F0A1CD5F F31FCBFC07957F0EBF9AFFFF8880F9F7DCFC9FD7876DF0F51EDEAED92E99714D F8A193AE470DF3DFDD18021B490CD937CCE6CEC75AD9FCBB6AFE619F3F9D6053 F3D7FCC93FED27FF6DB55FF32FDBFC63FC792B7E173D9FF98F65FEDB5DBF5D91 8ED7F8DD3D880ECD7FBE3D8553F37F2EB07BBDB97D347FCD9FF9D3FE95E59FF9 CFD1FCAB9AFF539F98FFF4E61FAFCAD93764FE43987F3FCDFFB4E4471E90ABF9 6BFEB799FF10F2CFD5D7F4FF1F7130FFB19AFF9BF36498FFEE024737391AFBF1 E696E1D5C3CDE3FC03E61F69CB816562B690C096101E4D9474E7F70F466A6EFE 6FFFBBFDAFB19A7F78DECEE789BA347FCDBF37F3EF5CFE29FA9AF2FF231AE63F 50F3DF0EBDA86AFE81874B5A1EC3997F60844FFCB671FAF3EE0A67DF09F337B7 CF7067F2D2FC3B7489A1E59F992FEBFF6DB55FF3AFD7FC8F0CBF9EF9273DDC95 2143B86EFE4709FDCA0899DDF61E736F81630D027B16F1072C2C68FEBB7F31DE FE77A0E69F3DA9FED14CFB239ABFE63FB4F9F726FF847C59F9FF9102F31FAEF9 1731FF80F05F7938E63F56F33F9D24EAA8F31FB9FAEE5DC52CCFFC6F36FFE6CD 3FEF2CBAF399BFE63FBAF97722FF3C7C65FFFF9108F35FB3F9337FE69F7DEC6D 64C38F31FFF8DD0AE6FF14FBC0097CA799DB277E68FD2B9ABFE6BFA6F9D3EFC5 E59FF96BFECCDFDC3E55E7F6B928E7A75F4330FF23F3FF083250F3CF13FBD37D 8482E67FF4B582E6BF82F98F25FFC47B71F9EF44FB35FFAACDBFC811BEF1137E 263D9C237C5798CF3FA6F95F39C237F5CE579BD5F388519A7FCCB89DBCAF0646 347FCD7F0EF36F22FF7C9BFFFF4887F90FD7FCF3E63FCC36FFF0AC9EE1594035 FF9B47FB1C6D24A763F84FFD3FFE08DFA3AF815267F53C3D88206F776682D13E A7F4DFFC8B98FFEE629ABFE6DFD0FC6F967F9A4DFE7F64C1FC876BFEA7A29EB7 0C261BE7DF15F365F90ECD7FA071FE018B4E12EC7AE69FBD57A2F92F6EFEF7C8 3FBBE6FFD9DACFFC071DE79F3A9C86F9337FE63F8DF907947EACE69F67FEE1FF 2D62FE57BE92D0FC6772893EE59F5493FF3EB55FF32FDEFC0333AB879DDF607B E6CFFC99FF1CCDFF34B95F37FFF81944357FE67FB3FC7369FE7F51FB99FF28CD 9F0861570E6D24CC7F9DE61F39F8FFA2F9A79E3E40F367FEB7993F8526FFCC7F 9DE64F84C0FC99FFCACD3F7EB69F2BE6FF5B3A9A3FF3BF47FEC933F92FA2FDCC 7FA0E69F34314BF804A99D8CFD383AF7134A99FFD16120E11725FE94BE46F868 FE3734FFD469FFB3CDFFB75C34FF89CDBF07F9E7CCFC7F14EDD7FCCB36FFA409 D823CFDC14739F35E42D307F234A997F78EEFDD3A73DFE7509EF4A789934FF2B E69F71B6AF3CF3FFED329A3FF3AF21FF5499FC17D47EE63F5CF3BFD25A99FF52 E6FF3A85FE23EB1CBE45CC1F9AFF23773EFFEC33FCA69AFF6F45D1FC997F29F9 67C8FCBFB8F633FFA19BFFDB749D19E61F9EFC677799A313F5061A72F83EFB1C 8934BAF96F853F63BFEFE826495B48FFA3CE34FF09CEE15BEF4C5E7968FECCFF BAFC1363F25F43FB99FFB8CDFF74907C46F30F9C29E0689448CC6AC4DC27CD2B 68FEBBCF6D11F3CFDB42BCE29AFFAEF9D723C9FC2BA1F94FE612779A3F1FE6FF E3067FCDBF5EF3DFF6FF22E6BFFB5FF1CE76FAA03CB0B6F9C73CE177BE9A0EE2 D6FC7B36FF26ABA1F92F6BFE31F24F83C9FFD0C15FF3AFDAFC6B98FFEE742E61 4B0FCF00C3FC2733FFD42DC4681FCD7FF777B987B0F9B75A0DCD7F65F30FCB3F 0126FF55B59FF96BFE91061E7EDCD3FD02E67FB3F9EFFA798DE69FF4CDD1D136 83059B3FF3D7FC5736FF5DF9E7BD38F2FF1F4561FE9AFF75F337DAA72BF33F7A FE8BCCED53C4FCBDE245CCFFE318CD5FF3D7FCC7927FBA8B23F91F4EFB35FFAA CDBFD511BE47FD76F7268EF0EDD3FCF3E6F3CFDB42BCE2C5CDFF2388E6AFF96B FEFD9BFF97FCB35C04FCFF476998FFD0CDFF516256CF239DDB6A61F881DEA6E8 7C1C1F3E90F45D03CA9A7FEA09792367F50C6F21C6F91737FFFF3D43F3D7FC35 FF21CC9FDC220CF3D7FC2F9E2995712D68FE60FEFD34FF8F46F4B61A9A3FF327 FFB85FFB99FF04E3FC53E74B64FECC1FCCBF55F3FF68476FABA1F98FEB12CC1F 823FF3BFB9F9279D3CD7280BE60FE6DF43F347BD5D30CD7F68F327FF982CF86B FE659B3FC0FC99FF88CD7F1B22E2AF6FF255E66E6329FE889A3FF367FE60FE9A 3FF307F3C7C4CDFFE2F14AB799FFE90F9A3FF367FE60FE9A7FED71FE49637B8E 9A55C6E766EA875DBD9145190738AC6CFE3173FB8467E937484CF32FDEFC8F3A FFE94C50A7B38495FA9BF03A59D9DB1BA1E044B59AFF882E41FE41FB997F0F73 FB1C7D009D7E368D65FEE6024D32FFC0108598D10BCC5FF3AFDAFC23BB7AE495 65FF3864AFA4E6CFFC993F98BFE65F693E7FE64F0E03E67F142A239F4C4FAFE6 5FBBF907B6BAF8D3CC4D63FE9AFFCAE64FFE5155FB99FF34CD3F7C26AF24F33F FD62FDF4CC5C57968F3C63D4F69461ECF4C8FC230727A73AD8EE8B62BF4CF3CF 1EE77F3474277CDAC1C0E9C24BFD654832FFEC87D3FC993FF307F3D7FC23CD3F 66B87BCC70EEA3FB69F5F3E992DCF2D4FCE355EAE8250898D5DBCFCC5FF3BF32 CE3F6F47F551F9C0DBD4D45FC4FC35FF815C82F9C3501FE67F7FF33FB5FAC8F1 1B47F773F3F5196BC52D77CD3FE9098FF1F6F04BC9FC35FF65C7F997357FCD7F 71F327FF9823F86BFE559B7F46DE6F62FEBBDFC233FF11CD3FFC5256AAAFCC7F E2E67F656E9FC0C0C2DB9AFFC5AD5DF367FECC1FCC5FF3BF6EFE3163FE5B35FF C88F4BE67FC5FC77153DFED5CF7E2999BFE67FFF7CFE95883FE6BD94F96BFE63 B904F907ED67FE9D34FFD44FD54ECC3FF29FCCFFD4FC4FB5FCD46DF25ECAA30C 0BCD7F62F3BFB8C29A3FF367FE60FE9A7FBCF99F1E037BD1FCEFFF396649E65F C4FCE3CFEC167350B6D745F34F6AFEA7B30DF460FE815149A53675CD7F5C97F8 7C50E68FFECDBFD5BB43F3AF349FFFD1F9258F66B74B9DFFE7FE593D4F6FC530 AF987FCC9C87A7D3FE9F9E05D8EBA2F987CD1F9A3FF327FFB827F833FF999A7F 467DA2640B9A3F987F6FCD1F9AFF1CE6FF1FD37BA2FBC93C99FF64E3FC4FE7F3 67FECC1FCC5FF3D7FC99FF40E64FFE693FF3D7FCB7D3B684875E1C8D5965FECC 1FCC5FF3D7FC997FC1F561FEE836F833FF099A3FC0FC99BFE6AFF96BFECC1FCC 9FF9AFD0FC01E6CFFC476CFEBF9AD2DB6A68FE33993FF947B7DACFFCE718E77F 3A686777C29CF85BD1AD09CCFF685AA4A4E1619E5BCDBF60F36FE8DBAF7BC49D AC86E63F99F9D7907F3ECCFC8B4CE0CFFC279EDB6757D8224FEC7B3A6D350632 FFF853AD0D714225E63F53F36F359CA6B7D5D0FC993FF9DFF2FD1F683FF3D7FC 6F307FD637B1F9E7BDD0B601CDBF46F367FE9AFFACE62FFB17D1FE05E5BFF619 7B99FF64CD3F7C26AC18F38F9F14687B57E16945936EE88B8626E6FFB870E2B6 EC6D009AFF277F5726D2FC5BAD86E6CFFC993FF367FE9A7F91F9FCCB9AFF91D7 057E8E5FF891754A02449A7FEA199C335EEBBC6D009AFF9772FF568D24F36FB2 1A9AFF94E64FFE8B68FF52F25F5BFB99FF64CD3FC6E4AF37FFD311E3BB3F470E 3537C2A492F9C7BC28792FD9F56D009AFF53B96B64F60CF3BF7F35347FE6CFFC 03DABF8EFC337FCDBF43F3DF9D1026C6FA4E6F18B87F141CED73DDFCB3B701E6 AFF9337FCD7F29F327FFA5B47F05F9BF41FB99BFE67F65B4CF95DE1B58BD9863 90D1D6FC4F5F4AE6AFF9CFD7FCDFC6ED68FECC9FF9337FE6CFFCBB6AFE79E3FC 1FC1295F4A8DF488D9312187F79BFFE9E6C4FC35FF6E9BFF91961731FFDD41FB 9A3FF38F7C50E65F44FBA797FF1BB49FF9CFD7FCAF1FE1FB883EEA3663B44FF8 860F07813635FFBCD7FDFA3600CDFFA2F9879D7C5CF3D7FC99FF52F2FF3D1ADA CFFC35FFDD41F2E12B2307F604C6E11FED5F047E8E995E66F7FE71C5FC1FB9E7 F0CD98D533631B80E69F6DFE3136AEF96BFECDD747F6CFD0FEDF5F5841FEEFD1 7EE63F59F34F857DAD63FE60FE9335FF780FD7FC35FF1ECC9FFCC79BFFEF074C 6CFEB7693FF39FAFF9337F307FE63F77F34F35F0718FF0D5FC99FF22E67FEAFC BBFECFFC99FFB2CD3F63EC841117CC1FCC7FB8E69F57DDDBCEEAF95C55CD9FF9 9795FF99B4FFF72CA691FF3BB59FF94FD0FC01E6CFFCA76FFE5706DBD430FFC8 655ED756F367FEB23F98BFE67FBDF903CC9FF94FDCFC7785BF49F37FBD3EBC02 BBFB299A3FF3FF5A86F9A39EF9476E84DEAD9A3F1631FF981334C75F7F7432DF 4A9C9E50206FC0DB5823DF966AFEA77375C61F1750EA08DFD37307EC6ABFE6CF FC2B993FF9A7FDCC5FF3078ECC3F467153CD7FEBD20399FF9D2BAFF9A79A7FCC 5C9DB799FF764D22574FF367FEBBCB307FD430FFA48D90F96BFE58C1FC1F1127 71C836FF47E5D9A2CADEF9CD2BAFF9679BFFE991B3B5CD7F57F263BE8FD0FC99 FF0DE64FFE693FF3D7FCC1FC93CCFFF4745D79E61F73E2B6D73B3F3AD9DC761D DE7E88BFE195950F9CE058F3AFDAFCDB9AFF91E13F653EACFD6F0B6BFECCFFB9 0CF347F1E0CFFC357F30FFD773F8061437FEE7F0809998BBDD35FFA475485DB8 C6CAB7FA8260C1E6DF7CB4CF5BB4CF1E05A4F9337FE60FE6AFF96BFE686EFE31 63E9638EF08DF1EA40F38F5F87F805CAAE7CE48829CDBFD4DC3E3D1CE11BF9D5 C3EB570081237F357FE6FFBA0CF9A7FDC567F264FE9A3F987F7864CB45790E1B 72E7E69FBAF23D1C0EB0E07CFE0D67F58C3977C0D14C3ECEE1CBFC993F98BFE6 AFF9A395F91F4D6259509EB39DBC07F38FBFF90AE6DFE1397CEF3F9357FC6345 AE98E6CFFCB7CB907FDA5FF6D45DCC5FF307F3BFADF9AF60FE8B8CF6E9F01CBE 498E5DD6FC93827FF66A68FE6B9A7F41F9E7D26B9A7F918D90F96BFE98C9FCC3 1375963D4836EFD8DB80C09F1EE19B74C3EB2BDFBCFC2FDBFCAFF8FFF5E61FC9 95D5D0FC993FF367FECC5FF367FEA86DFE8F6BB37A868F938D9C6FF3749A9DF0 AC9EF137BCB2F24BCDEAD96DF3CFF3FF7BCCFFE20E88E6BFACF9937FDA5F4AFB 99BFE60FE66F23790C728A2ECD3FD5FCE3FDBFB6F9171974A4F9337FE6CFFC99 BFE6CFFCC1FCF354FF74B40FF31FBDF927CDFF59EA1CBED947196BFECC3FBC0C F9A7FDD7B59FF96BFE60FECB6E2447C37898FF64CD3F7C5EAD22E65F0ACD9FF9 1F2DF3FDFB77E6CFFC53F9DC6C98BFE60F30FFE95F5CCDBFAC72F76CFE9AFF0A E6FFFDFF60FECC3F49FBBF60FE9A3FC0FC99FF9ACD7F3EF3D7FC993FF9A7FDCC 5FF32775C836FFC024F619C369AE0CC5C91BBA933DEC87F96BFE9ABFE6DFA1F9 7FFF37CC9FF92769FF56FE99BFE60FE61FF6E7CECDFFE25C9A930DF25FA1F957 22D5FCEF5F0DCD9FF9CBFEB49FF96BFECC1F65CDFF11777EDB7EA4FAE29714CC 7FACE65F9578F36FB21A9AFF82E6FF7D0FE6CFFC93B4FF4DFE99BFE60FE61F6F FEA7A7F4DA9EC4767BBAABC7DEA49ABBB70D2C10A3EEBBBFC8DB5AED7E651079 D2B198339169FE059BFF6D84CDBFD56A68FEAB99FFF703983FF3CF30FFA7FC33 7FCD1FCC7F57B6B73F1FCD819FF4736070CE7607E11137F17EE44EC1D10AC4AC 4CF817D95DF3565F284CDCFC99BFE6CFFCC93FEDCFD37EE6AFF983F96798FFAE 57275D1F96E15DF38F1FB7131EA7943A9629BC0E81DFBAED08A2F99AFF47237A 5B0DCD7F29F3FF7E06F367FE49DAFF947FE6AFF983F98747CBC718FEEEE09948 F30FDF366F929F6CF38FF945C2BFF522A37D6E6BFE1FEDE86D35347FE62FFBD3 7EE6AFF9337F9432FF53818F6CFBA9C93DFCFD42863F679BFFE9CA447E59D036 FECFD4FC516F174CF3EFD9FCBFC7C1FC997F92F67FC1FC357F30FFEBCDFF8AF9 E73D68CC3519E65F6AD852F66E8BE68F24F3D7FC993FF367FECC5FF367FE4832 FFB0BA173FC237303827E308DFF84386939ABF237C357FCD9FF93731FFEF2990 7FDA9FA4FDBB67F565FE9A3F98FF51DC2E35ABE756DDDF743A7E56CFED9D04EE FC113DCEFF1137F5E8B2B37A6AFE9A3FF3AF61FEDF1361FECC3FC3FC4FE59FF9 6BFE987EB44F06F39D036B9A1777CAE69F3AA76B6D028F9B74EE898C435A347F E64FFE69FF15ED67FE9A3F987FAAEA349FBB12AB35FFF853B6DD66FEA9FF9B71 13CD7F29F3FF9E05F367FE795B0EF3D7FCC1FC23E59FF633FF26CDFF68233C9D 523530142D7BDF21FCA0DB93563F82E7924B7A5B69FECCBFACFC73EFA1CD3F7B B361FE9A3F983F98FF40CD3F3C13D4E99581434B92CCFF745ADAD363D8357FE6 7F45FB657FC1BFB8FC337FCD1FCC1FCCBF93E69F21F9313B0BF5CC3F729D8DF3 67FE0DE59F81AF16FC99BFE60FE69FAA1F06FC68FEAD9A7FCC991716317FCD7F 0EF3BF226FBFFF83ECBF66F0FF7AF58BCB3FF3D7FCB188F9270D36BE6EFEF61D 34FFBCE6CFFC35FF99CCFFA2F33F61FEAB99FFDB065050FE99BFE68F75CCFF4E 2167FE9A7F46F38F3C6B739FE66F9C3FF32F62FEBF1FC0FCD731FFA36D80F96B FE440817CDFF68EE91EDEC2581393F77E763893931D6EE742858B9F9179CDBA7 88F947DEFF2338B74FD246AEF9CF64FEA59C5FF65F3CF85FF47FE6AFF96341F3 0F0C4B389D9CE4E202E16538BFE6FF98623EFF5268FE6B9AFFEF7130FF95837F B6FF337FCD1FCCFFC861324632270D93B85862B1C8DC3ECC5FF39FC0FC0B0ABF EC2FF85FDC0560FE9A3F9632FFC8B1D3D9E6FFEDDF307FCD3FA3F91F9D18B795 F907F66D357FE67FDDFC7FCF85F90BFE19FECFFC357FAC66FE5B4A997FFC1068 E6AFF943F35FC4FC6B383FF367FE57FC9FF96BFED0FC4B99BFD13E9AFFC5E60F CD7F26F3AFE4FCE49FF65FF47FE6AFF96305F30F0FC82FDBFC338EF0F57A2DDB FC7F35A5B7D5D0FCE736FFDF8BC2FC997F9EFF337FCD1FCCBFEC38FFC7D9343E 474383B060F36FE8DBAF7F3C3B590DCD7F1AF3AF27FCE49FF65FDF0560FE9A3F 5618ED03E6DF6DF36F359CA6B7D5D0FC2733FF57EFFABC9EF933FFFBCDFF6DC3 63FE9A3F983F987FF3E6CFFC35FF99CC7FDBF96B68FF45F9E7E71D9A7FA58D64 BBF97D6EA2CC5FF307F307F3D7FC357FE67F7D7DEE44F69F29F8DFBCF178B76A FE60FE60FE9ABFE6CFFC0BAECC0DEBC0FCE730FF29374ECD5FF307F387E61FF8 5DFEAE4CA4F9B75A0DCD7F5C97D88DA8B7AD00F9A7FDD9F27FF3DB44F3D7FC71 BFF96F67D7091039F76691F9794CF2A3F907EEF667349399BFE6DFBF4BEC3ED0 9D26C3FC99FF10DBAAE6AFF9E366F3DF4EA7792ADBB7997FFCFE48D51D8421F6 3E166CFE3F13B9C1FC53773A34FF595DA2B9F65F917FAEDE83F9F7F09669F866 D1FC357F5435FF54D1BDD3FC23EF87F9AFD6FC7F66318DF96BFE3DBB4427DA2F FB0BFE436CB79ABFE68F3BCD3F46F203A7D93ADA05D81A7BE07E02553F7C4EB1 F03DC73CDCF6A1B7378CBC73CDFFCEE6FFF302F78CF689177ECD7F3297E847FB AFEC0530F626E6DFE71BA7C95B46F3D7FCD1C4FC0367DD4D32FFF0D97B634A7B E0F4BE477B19493F472E90B4FE9A7FA5E6FFF3321398BFE6DFA74B74ABFD197B 01A4FD1EED1FE2BD73FFBB46F3D7FCD1CAFCC3837CE29BFFC5C142A9E67FFA70 81E593D67335F36FDEFC7F16A29EF9E70DF5D1FC477789A3697CFA5717E67FBF F9F7FFF6B97363D6FC357FF4D6FC7707C05C19ED9367D4498F956DFE31EBB9BB 8CE67F43F3FF5914CD5FF35F2DF527ED02F0F6E2E63FC19BE8B6B7CFCACDFFB9 80E68FE6CD3F7B9CFFE96102313B1D37987FCC7A1E2DA3F9D76EFE3F2B609CBF E64FFB037B01D4FDBAF6CFF73EBAE71DB472F3FFE3DF68FE286BFE4975FD8AF9 5F1F45738FF927DD7041F3FFE4F52FD26DCDFF6735CCEDA3F9D37EA0E116AEF9 EF3699E79E82E68F1AE69F71786CA0963F7F4E3A7236FEBB86F0633DA20FD40D 377F47F80684F3C96DCD7F57A18FBC7A7B7DF8E645CCFFED21DE7E8EF17FCD7F 3897A0FD20FFCCBF78F37FD37ECD1FC5CDFF6D744D60D44DCC3098570F0FFC6F E421C081EC1FB37F111899733ACEFF7427E8744AD24ECCFF571C49E3FCB3CDFF 4AF37F8BEAF1FF7C53F1ED95D7CD7F77B72275FC8FE63F96F9D37E907FE65FAF F91BE78FDAE68F095EDC54F37F5DA0F371FE0399FFD1509FB2E6AFF9B77509DA 0FF25FF5DDB478F337B70F983FAE8CF6D9FD8BF1F6BF9DCFEDB3ABF75BC1AE6D FE47A386228FF00D0F58D2FC8730FFA3B90D693F9695FFEBEF29CD5FF307F347 9FE6DFB0F96F137A5BF30FFC70F473786534FFFECDFFE8B6B41F2BCB7FA5B795 E6AFF983F923CFFCB7F2BFFDAF219AFF91E72799FF95237CFB317FCDFF7E97A0 FD408D3782E6AFF983F9A35BF36FDEFC4B8DF3CF9BD5B3DECCA29A7FE7E64FFB 814A6F07CD5FF307F34771F37F95FFDDEBFB6FFE658FF0BD62FE9AFF6AE64FFB 817A6F0ACD5FF307F347B7E63FCDDC3EA39BBFE67F9B4B543AAA1198E05D56E4 6877CD5FF307F3470DF3FF92FCDD2BC79ADB67F720DFA36B7677018A98BFB97D A6377FD3F80037EC1A6BFE9A3F983FBA35FF7EC6F9171C631F6FFEE6F35FC7FC 8DF001EE19F9A3F96BFE60FEA864FE9F6CAF19716E9F9ECDDF397C27307FDA0F DC26FF9A7FA9E6FF0B38386DAB8D6462B6A298B46168FE79E6BF1D08B4FD16E0 F429D2FC3B317FDA0FDC29FF9A7F91E6CF7F706AFE9E8A15CC3F75C3E8B6F957 92FFB0722799FFE9F985CB9ABFE65FC925683F70B3FC6BFE179B3F00E4D173F3 AF21FFA7CA9D61FEF1637B34FF0ECD9FF603F7CBBFE67FA5F90B9E004A7D65D0 5BF32F2BFF31CADDB3F96BFEC5CD9FF6034DE45FF3BFD2FC01A038FD34FF52F2 1FA9DC79E69F37D447F36F68FE811908693F5056FE77DF809A7F76F30780AAE6 DFBCF95F97FF78E5D6FC5730FF15AC03F01ED4FC0160D0E67F45FE9394DB38FF E9AD83F603DE869A3F0074DEFCF3E43F55B9CDED33B772240D480090F74E3C1D 4AA7F96BFE0034FFF853685DD4FE41CD5FF3BF68FE06F603CDDF8FE137A3E6AF F903D0FC6B5063B44FC1D5D0FC8B9B3FED07FA917FCD3FBE92997E1CC06D346C FE37EFE3F4B61A9AFF3D9A41FB01EFCA9E9B3F0F0170BFF93769FECC5FF32FE2 1881A105B41FF0C6ECB9F97F0380DBD1FC35FF710523703821ED07BC377B6EFE 7F01403B347FCD7F38BB084C2148FB016FCF9E9BFFEB0D5DBA74E9B2D5A5E6AF F98FA216F19A01C03BB4ABE65F96CF07AD71B700FAA1EADBBC76F36F7544436F ABA1F95FF18AA4A10500BC497B6BFE053FB2BF9480FC03D39B7FA5BF21559B7F C363997B5B0DCD3FEF73F668C290D329C401DC29FF47EFD399CEA997D1FC9F35 A6ECE573352ADDBF4B972EDB5E3EDFE695EEBF52F347BD53AAADD3FC014CC09A CDFF8F6A3C9500C0AC547D9B576AFEBB7C7D0A7CFDB0FDAFD70502F7F0F6433C E147CFBBC326A7545BA4F903C0A0CD1F007AE6B6E61FF0F648A5BF68FE81DBDE 6FFE9A3F00CCD7FC01600E8A34FF24F37FEE9BEC7E35902ADEF1E6BF7BFF472B 93B40BA0F903C0DCCD1F006632FFDB9A7FD8B1EB35FF53B77FBB32694D347F00 D0FC0160B5E6BF2549CB3B31FFD4D5D0FC0140F30700CD3F30EA664AF3D7FC01 40F30780159ABFD13E9A3F0068FE00A0F90F64FED947F86AFE00A0F90380E6BF 9D4EE72DB05F9CDB277C7C41EADC3EF1F2AFF90380E60F004B35FFB293E41799 7EBFDEE36AFE00A0F903C0B2CD9FF96BFE00A0F903C0DCCDFF54BFAB9AFFD19D 577D5CCD1F00347F0098B8F9FF6A4A6FABA1F90380E60F00B336FF86BEFDA9D6 BDAD86E60F009A3F00CCDDFC1FB7F3A5D6BDAD86E60F009A3F00CCDDFC99BFE6 0F009A3F0068FE9ABFE60F009A3F0068FE9ABFE60F009A3F000CD7FC6BAF5BA4 F9B75A0DCD1F00347F0058A4F97FDEFCE73F3437FFF8D5C85852F30700CD1F00 34FFAAF29FD4FC2357236331CD1F00347F00D0FCABCA7FEA689F98D5C85846F3 0700CD1F0034FF5D5B2EB5179031CEFF68355EAF8C5F40F30700CD1F0034FFED A1B53F5F6865FE47ABF1FCE7F687D395D7FC0140F30700CDFFC8BA1B9AFFD16A FCDC10B9E69A3F0068FE00A0F98FD2FCAFFC97E60F009A3F0068FE4745BD95F9 9FAE46F8FADD1B6AFE00A0F90380E65F9511CFE4A5F90380E60F0073377FE6AF F90380E60F009ABFE6AFF90380E60F007337FF9F075432FFC861FC49070268FE 00A0F90380E6DF9BF91FC97FE46A98DB0700347F6E0040F3BF62FE3159BE94F9 473E68FC8A69FE00A0F90380E6DF89F99F26FDD3D508DC83E60F009A3F0068FE CC5FF30700CD1F0034FFBFD71BEDA3F90380E60F002B37FF758EF0D5FC0140F3 0780959BFF3AB37A6AFE00A0F903C09ACDFF0ACEE1ABF90380E60F00A334FFD5 CC5FF30700CD1F00347FCD5FF30700CD1F0034FF22E69F318CFFF4869A3F0068 FE00A0F977D8FC4FA7EE49FD2FCD1F00347F00D0FC3B34FF578D0F54FDA3FF8D 5F0DCD1F00347F00D0FC7B6BFECF7F6E7FD0FC0140F3D7FC0168FE838EF37FFE FC7A7DC6029A3F0068FE00A0F97768FE31E708CB5846F30700CD1F0034FF7ECC 3FF2D4C0198B69FE00A0F90380E6DF89F947FA7CDE929A3F0068FE00A0F9F7D3 FCEF5F0DCD1F00347F0058A4F9DF46D8FC5BAD86E60F009A3F002CD2FC99BFE6 0F009A3F0068FE9ABFE60F009A3F0068FE9ABFE60F009A3F0068FE9ABFE60F00 9A3F00346FFE1F8DE86D35347F00D0FC0160E2E6FFD18EDE5643F30700CD1F00 666DFE088C02D2FC0140F30780CECDFFF9E7EEB4F9E3D4FCDF745DF30700CD1F 00FA31FF3FFE8DE67FB1F9BF3E999A3F0068FE00D0D5689F279AFFF5E6FF4A9E F9EF7E0BE3331A00EA35FF2BDFD502C088E61F18E7FFED1F02F67BBA403C91F7 F37CC4D7E5B73F175CB1A335DC8EF3BF68FEBBDFC2F88C06804ACDFFE277B500 309CF987C7F9C7C8F3FDE67F64FB81056A9B7FC1B97DDEBE85F1190D00959AFF C56203006399FFE9DC3E9175FD2DC8BF19F2F6CA6D96DF5DE6E856A9E6BFBDE1 D14A06567B7BAB1A73FB6CBF85F1190D00959A3FF307A0F9679BFF69787FB3E8 8C86BFBB2F90F770E19BC77C89603E7F0018BAF99BDB0780E6BF3BDA27E987A3 113219FB088174FF764D602725635C50AAF99BCF1F00466CFEE6F601A0F99735 FF57E2CDFFE856D7CD7F7BCFDBD13EA7ABADF90380E60F001337FF5DC78E6FFE 195F046C6FB51D8D7F74ABF87B8E3C3A58F30700CD1F00A66FFEA963664A5D19 1EED73D1FC8DF30700CD5FF307A0F967987FEADC3E81E37063E6F6C933FFECB9 7DB6CB68FE00A0F903C094CDBFF67CFE65A7FDBF61C5347F00D0FC0160CAE6CF FC03E6AFF90380E60F00A337FFD34362EF37FFC8FD11CD1F00A0F9034064F387 E60F009A3F00ACD0FCA1F90380E60F009A3FF3D7FC0140F30700CD5FF3D7FC01 40F30700CD5FF3D7FC0140F30700CD5FF3D7FC0140F30700CD5FF3070068FE00 A0F96BFE0000CD1F00347FCD1F0098BFE60F40F37F9AFF97D372FBB0F36BFE00 A0F903C0D0CDFFE9B40C3FDEFC357F00D0FC0160ACE6FF0DE968FE00A0F903C0 58CDFF2FE4A2F90380E60F00A334FFD73F832EF32E6B347F5FA900409FDFD502 C0A0CDBF2C9F7F426BDCED106B58B6F9FB320500BAFDAE1600C66DFE05D5F7CB ABBB95FFDA6B58AAF9FB0EC5A54B972E7BFEAE1600866BFECFF1E4652F9F125B E9FE3B5FC3EBCD7FB56F610060B8EF6A01602CF3FFA31A5F5EFD47C7545DC322 CD7F9D6F610060C4EF6A016020F347557C0BE3D2A54B97737F570B00806F6100 6085EF6A0100F02D0C00ACF05D2D0000000000000000E89CFF0FEBFBC679 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.5/doc/figs/main.eps0000644000175000017500000021174512310162303013424 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: blah-000.ps %%Creator: pnmtops %%CreationDate: 12. Mär 17:51 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 210 321 402 471 %%HiResBoundingBox: 210.719947 321.600014 401.279964 470.400033 %%EndComments %%BeginProlog %%BeginPreview: 190 148 8 740 % 32323232323232323232323232327432323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 3232323232323232323232323232bb323232323232323232323232323274 % 32327474747474747474747474747432747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 7474747474747474747474747474bb3274747474747474747474747474bb % 3274747474bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbb % bb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbb % bbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb74747474747474 % 7474747474bbbbbbbbbbbbbbbbbbbbbbbb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbb % bb747474747474747474747474bbbbbbbbbbbbbbbbbbbbbbbb7474747474 % 327474ff323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 3232323232323232323232323232323232323232323232323232ff747474 % 327474ff747474747474747474747432747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 7474bb7474747474747474747474bb3274747474747474747474ff747474 % 327474ff74747474747474747474bb327474747474747474ffff7474747474747474747474747474 % 7474747474ff747474747474747474747474747474747474ffffffffff7474747474747474747474 % ffff74747474747474747474747474747474747474747474747474747474747474ffff7474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 7474bb7474747474747474747474bb3274ff7474747474747474ff747474 % 327474ff74747474747474747474bb3274747474747474ff7474ff74747474747474747474747474 % 74747474747474747474747474747474747474747474747474ff7474ff747474747474747474ff74 % 7474ff747474747474747474747474747474747474ff74747474747474747474ff74ff7474747474 % 7474747474ff74747474747474747474747474747474747474747474747474747474747474747474 % 7474bb7474747474747474747474bb3274ff747474747474ff74ff747474 % 327474ff74747474747474747474bb32747474747474ff7474747474ffff74ff74ff74ffffffffff % 747474ff74ff74ff74ffff74ff74ff74747474747474747474ff7474ff74ff74ff74ff747474ff74 % 747474ff74ff74ff74ff74ff74ff74ff74ff74ff747474ffffff7474ff7474ff74747474ff74ff74 % ffff74ff747474ff74ff74ffff747474747474747474747474747474747474747474747474747474 % 7474bb7474747474747474747474bb3274ff747474747474ff74ff747474 % 327474ff74ff7474747474747474bb32747474747474ff7474ff74ffffff74ff74ff74ff74ff74ff % 7474ff74ff74ffffff74ff74ffff747474ffffffff747474747474ff7474ff74ffffff7474ff7474 % 74ff74ffffff74ff74ffff74ff74ff74ffffff74ff74ff7474ff74ff747474ff74747474ffffff74 % ff74ff74ff74ffffff74ff7474747474747474747474747474747474747474747474747474747474 % 7474bb74747474ff74ff74747474bb3274ff747474747474ff74ff747474 % 327474ff74ffffffffffffffffffbb32747474747474ff7474ff74ff7474ff7474ff74ff74ff74ff % 7474ff74ff74ff747474ffff74ff74747474747474747474747474ff7474ffff7474747474ff7474 % ff74ff747474ff747474ff74ff74ff74ff747474ff74ff7474ff74ff747474ff7474ffff74747474 % ff74ff74ff74ff747474ff7474747474747474747474747474747474747474747474747474747474 % 7474bb74747474ffffff74747474bb3274ff747474747474ff74ff747474 % 327474ff74747474747474747474bb3274747474747474ffffff74ffff7474ffff74ff74ff74ff74 % 74ff7474ff74ffff747474ff747474747474747474747474ff7474ff74ff7474ffff74747474ffff % 747474ffff7474ffff74ff74ff74ff74ffff7474ff74ff747474ff7474747474ff747474ffff74ff % 7474ff74ff74ffff7474ff7474747474747474747474747474747474747474747474747474747474 % 7474bb7474747474747474747474bb3274ff747474747474ff74ff747474 % 327474ff74747474747474747474bb32747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474ff7474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 7474bb7474747474747474747474bb3274ff747474747474ff74ff747474 % 327474ff74747474747474747474bb32747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 7474bb7474747474747474747474bb3274ffffffffffffffff74ff747474 % 327474ff74747474747474747474bb32747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 7474bb7474747474747474747474bb3274747474747474747474ff747474 % bbbbbbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffff32bbbb % 3232bbbb282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 2828282828282828282828282828282828282828282828282828ff323232 % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff3274bb % 3232bbbb286060606060606060606060ff606060606060606060606060606060606060606060ff60 % 606060606060606060606060606060606060606060606060606060606060ff606060606060606060 % 60ff60ff606060606060606060606060606060606060606060606060ff606060606060606060ff60 % ff606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff3274bb % 3232bbbb286060606060606060606060ff60ffff606060606060606060606060606060ff6060ffff % ff6060606060606060606060ffff6060ffff60ffffff6060ff6060ffff60ff606060606060606060 % 6060606060ffffff60ffff6060ffff6060ffff606060606060606060ffff6060ff6060ffff60ff60 % ff60ffff60ffffff6060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff3274bb % 3232bbbb28606060606060ffffff6060ffff606060606060606060606060ffffff60ff606060ff60 % 606060606060606060606060ff60ff60ff6060ff606060ff60ff60606060ff606060606060606060 % 6060ff6060ff6060606060ff60606060ff6060606060606060606060ff6060606060ff606060ff60 % ff606060ffff60606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff3274bb % 3232bbbb286060606060606060606060ffff60606060606060606060606060606060ff606060ff60 % 606060606060606060606060ff60ff6060ff60ff606060ff606060606060ff606060606060606060 % 6060606060ff606060ff60ff60606060ff6060606060606060606060ff60ffff6060ff606060ff60 % ff606060ffff60606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff3274bb % 3232bbbb286060606060606060606060ffff60ff6060606060606060606060606060ff60ff60ff60 % 606060606060606060606060ff60ff60606060ff60ff60ff60ff60ff60ffff606060606060606060 % 60ff60ff60ff60ff60ff60ff60ff60ffff60ff606060606060606060ff6060606060ff60ff60ff60 % ff60ff60ffff60606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff3274bb % 327474bb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060ff6060606060606060606060606060606060606060 % 6060606060ff60606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff747474 % 327474bb286060606060ffffffffff6060606060606060606060606060ffffffffff606060606060 % 60606060606060606060ffff60606060606060606060606060606060606060606060606060606060 % ffffffffff6060606060606060606060606060606060606060606060ffffffffffff606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff747474 % 327474bb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff747474 % 327474bb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff747474 % 327474bb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff747474 % 327474bb28aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeff747474 % 327474bb282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 2828282828282828282828282828282828282828282828282828ff747474 % 327474bb282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828aeff747474 % 327474bb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff747474 % 327474bb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606028282828282828282828282828282828282828282860aeff747474 % 327474bb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060602828606060606060606060606060606060606060ae60aeff747474 % 327474bb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060602828606060606060606060606060606060606060ae60aeff747474 % 3232bbbb28606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606028606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060602828606060606060606060606060606060606060ae60aeff3274bb % 3232bbbb28606060ae60606060606060606060606060606060606060606060606060606060606060 % 6060602860606060606060606060606060606060606060ffffffffff606060606060606060606060 % 606060606060606060606060606060606060606060ff606060606060606060606060606060606060 % 6060606060ff6060606060606060ffff6060606060606060ffff6060606060606060606060606060 % 60606028286060ff60606060ff60606060606060606060ae60aeff3274bb % 3232bbbb28606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606028606060606060606060606060606060606060ffff606060ffff6060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 6060606060ff606060606060ffff6060ff60606060606060ffff6060606060606060606060606060 % 60606028286060ff60606060ff60ff606060ffff606060ae60aeff3274bb % 3232bbbb28606060ae60606060606060606060606060606060606060606060606060606060606060 % 606060286060606060606060606060606060606060ffff606060606060606060ffff6060606060ff % ff606060ffffffff60ffff606060ff606060ffff60ff60606060ffff6060ffff6060ff606060ff60 % 606060ffffff606060606060ff606060ff6060606060ffffffff6060606060606060606060606060 % 60606028286060ffffffff60ffff606060ff6060606060ae60aeff3274bb % 3232bbbb28606060ae606060ff60606060ff60606060606060606060606060606060606060606060 % 606060286060606060606060606060606060606060ffff6060606060606060ffff60ffff60ffff60 % ffff6060ffff60ffff60ffff6060ff606060ffff60ff6060ffff60ffff6060ff6060ff606060ff60 % 6060606060ff606060606060ff6060606060606060606060ffff6060606060606060606060606060 % 60606028286060ff60606060ffff606060ff6060606060ae60aeff3274bb % 3232bbbb28606060ae60606060606060606060606060606060606060606060606060606060606060 % 606060286060606060606060606060606060606060ffff6060ffffffff60ffff606060ff60ff6060 % 60ffff60ffff6060ff6060ff6060ffff6060ff6060ff6060ff606060ffff60ff60ffffff60ffff60 % 6060606060ff606060606060ffffffffff60606060606060ffff6060606060606060606060606060 % 60606028286060ff60606060ffff60ff60ff60ff606060ae60aeff3274bb % 3232bbbb28606060ae60606060606060ff6060606060606060606060606060606060606060606060 % 606060286060606060606060606060606060606060ffff6060606060ff60ffffffffffff60ff6060 % 60ffff60ffff6060ff6060ff606060ff60ffff6060ff6060ffffffffffff60ff60ff60ff60ff6060 % 6060606060ff606060606060ffff6060ff60606060606060ffff6060606060606060606060606060 % 6060602828606060606060606060606060606060606060ae60aeff3274bb % 3232bbbb28606060ae6060606060ff60606060606060606060606060606060606060606060606060 % 606060286060606060606060606060606060606060ffff6060606060ff60ffff6060606060ff6060 % 60ffff60ffff6060ff6060ff606060ff60ffff6060ff6060ff60606060606060ffff60ff60ff6060 % 6060606060ff606060606060ff606060ff60606060606060ffff6060606060606060606060606060 % 6060602828606060606060606060606060606060606060ae60aeff3274bb % 3232bbbb28606060ae60606060606060ff6060606060606060606060606060606060606060606060 % 60606028606060606060606060606060606060606060ffff606060ffff6060ff606060ff60ffff60 % 60ff6060ffff6060ff6060ff606060ffffff606060ff6060ffff6060ffff6060ffff60ffffff6060 % 6060606060ff606060606060ffff6060ff60606060606060ffff6060606060606060606060606060 % 6060602828606060606060606060606060606060606060ae60aeff3274bb % 3232bbbb28606060ae60606060606060606060606060606060606060606060606060606060606060 % 6060602860606060606060606060606060606060606060ffffffff60ff6060ffffffffff6060ffff % ffff6060ffff6060ff6060ff60606060ffff606060ff606060ffffffff606060ff606060ff606060 % 6060606060ff606060ffff6060ffffffff6060ff60606060ffff6060606060606060606060606060 % 6060602828606060606060606060606060606060606060ae60aeff3274bb % 3232bbbb28606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606028606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606028aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae60aeff3274bb % 3232bbbb28606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606028606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff3274bb % 327474bb28606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606028606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff747474 % 327474bb28606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606028606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff747474 % 327474bb28606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606028606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff747474 % 327474bb28606060ae60606060606060606060606060606060606060606060606060606060606060 % 60606028606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff747474 % 327474bb286060602828282828282828282828282828282828282828282828282828282828282828 % 28282828606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff747474 % 327474bb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff747474 % 327474bb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff747474 % 327474bb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff747474 % 327474bb286060602828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282860606060606060606028282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 282828282828282828282828282828282828282828ae606060aeff747474 % 327474bb286060602860606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606028606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060606060ae606060aeff747474 % 327474bb286060602860606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606028606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060606060ae606060aeff747474 % 327474bb286060602860606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060ff6060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060286060606060606060606060606060ff606060606060 % 60ff606060606060606060606060606060606060ff606060ff60606060606060ff60606060ff6060 % 606060606060606060606060606060606060606060ae606060aeff747474 % 3232bbbb286060602860606060606060606060606060606060606060606060606060606060606060 % ffff60ff6060ff60ff60ff60ffff60ff60ff60606060606060606060606060606060606060606060 % 606060606060606060606060606060606060286060606060606060606060606060ff606060606060 % 60ff60ff60ff60ff60ff60ff60ff60ff60606060606060606060ff60ff60ff60ff606060ffff60ff % 6060ff60ff60606060606060606060606060606060ae606060aeff3274bb % 3232bbbb286060602860606060606060606060606060606060606060606060606060606060606060 % ffff60ff60606060ff60ffffffff6060ff6060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060286060606060606060606060606060ff606060606060 % 60ff60ffffff606060ff60606060ffff6060606060ff60ff6060ff6060606060ff606060ffff60ff % ff6060ff6060606060606060606060606060606060ae606060aeff3274bb % 3232bbbb286060602860606060606060606060606060606060606060606060606060606060606060 % 606060ff60606060ff60606060ff606060ff60606060606060606060606060606060606060606060 % 606060606060606060606060606060606060286060606060606060606060606060ff60606060ffff % 60ff60ff6060606060ff606060ff606060606060606060606060ff6060606060ff606060ffff6060 % 60606060ff60606060606060606060606060606060ae606060aeff3274bb % 3232bbbb286060602860606060606060606060606060606060606060606060606060606060606060 % ff60ffff6060ffffff60ffff6060ff60ff6060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060286060606060606060606060606060ffffffffff6060 % ff60ff60ff60606060ff60606060ff60ff6060606060ff60606060ffff60ffffff60ffffffff60ff % ff6060ff6060606060606060606060606060606060ae606060aeff3274bb % 3232bbbb286060602860606060606060606060606060606060606060606060606060606060606060 % 606060606060ff60ff60606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606028606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060606060ae606060aeff3274bb % 3232bbbb286060602860606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606028606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060606060ae606060aeff3274bb % 3232bbbb28606060aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeae606060606060606060aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae606060aeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff3274bb % 3232bbbb286060aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeae606060606060606060aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae606060aeff3274bb % 3232bbbb286060ae6060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606028606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060606060ae606060aeff3274bb % 327474bb286060ae60aeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60ae6060ffffffffff60ff6060ffff60ffff60ffffffffffffffffff60ffffff % 60ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff286060606060606060606028ae60ffff60ffffff60606060606060ffff60606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c28ae7c7c28ae606060aeff747474 % 327474bb286060ae60ae60ffffffffff60ff60ff60ffff60ffffffffffffffffffffffff60ffffff % 60ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff286060606060606060606028ae60606060ff6060ff6060606060ff6060ff606060 % 6060606060606060606060606060606060606060ff60606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c28ae7c7c28ae606060aeff747474 % 327474bb286060ae60ae60ff60ff60ff60ff60ff60ffffffffffffffffff60ff60ff60ff60ff60ff % 60ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff286060606060606060606028ae60606060ff606060606060606060ff606060ff60 % ff60ff60ffff60ff60ff60ff60ff60ff6060ff60ff60606060606060606060606060606060606060 % 60606060606060606060602860ae7c286060ae7c28ae606060aeff747474 % 327474bb286060ae60ae60ff60ffffff60ff60ff60ffffff6060ff6060ffffff60ffffff60ffffff % 60ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff286060606060606060606028ae60606060ff60606060ffffffff606060ff606060 % ff60ffffffff60606060ff60606060ff60606060ff60606060606060606060606060606060606060 % 60606060606060606060602860ae7c286060ae7c28ae606060aeff747474 % 327474bb286060ae60ae60ff60ffffff60ff60ff60ffffff6060ff6060ffffff60ffffff60ffffff % 60ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff286060606060606060606028ae60606060ff6060ff6060606060ff6060ff606060 % ff606060ffff6060606060ff606060ff60606060ff60606060606060606060606060606060606060 % 60606060606060606060602860ae28aeaeaeaeae28ae606060aeff747474 % 327474bb286060ae60ae60ffff60ffffff60ffff60ffffffffffffffffff6060ffffffff60ff6060 % 60ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff286060606060606060606028ae60ffff60ffffff60606060606060ffff60606060 % ff60ffffffffffff6060ff60606060ff60ffff6060ff606060606060606060606060606060606060 % 60606060606060606060602860ae28282828282828ae606060aeff747474 % 327474bb286060ae60ae60ff60ff60ffffffffff60ffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff286060606060606060606028ae6060606060606060606060606060606060606060 % 6060606060ff60606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae2860606060ae28ae606060aeff747474 % 327474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae2860606060ae28ae606060aeff747474 % 327474bb286060ae60aeffff6060606060ff60ffff60606060606060606060606060606060606060 % 606060ff60ff60606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60606060ffffff60606060ffffffff6060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae2860606060ae28ae606060aeff747474 % 327474bb286060ae60aeff606060606060ff6060ff6060606060606060ff60606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60606060ff6060ff6060606060606060606060ff % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae2860606060ae28ae606060aeff747474 % 327474bb286060ae60aeff60ff60ff6060ff6060ff6060606060ff60ffff60ff6060ff60ff6060ff % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60606060ff60606060606060606060ff60ff60ff % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae2860606060ae28ae606060aeff747474 % 3232bbbb286060ae60aeff60ff60606060ff6060ff6060606060606060ff60ff6060ff60ff6060ff % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60ffffffff60606060606060606060ff606060ff % 60ff60606060ff606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae2860606060ae28ae606060aeff3274bb % 3232bbbb286060ae60aeff60ff60ff6060ff6060ff6060606060ff60ffff60ff6060ff60ff6060ff % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60606060ff6060ff60606060606060ff60ff60ff % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae28aeaeaeaeae28ae606060aeff3274bb % 3232bbbb286060ae60aeff606060606060606060ff60606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60aeffff60ffff60606060ffff60606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60aeff6060606060ff60ff60ff60606060606060606060606060606060606060 % 60606060606060606060606060ff6060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060ff60ff6060ff6060606060ff606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60aeff6060ff60606060ff60ff60606060ff6060ff606060ffff6060ff606060 % ff6060ffff606060ffff60ffffff6060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60ff6060ff60606060ff6060ffff60ffff60ff60 % ff60ff60606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60aeff60ff60606060ff6060ff6060606060ff60606060ff606060ff606060ff % 60ff6060606060606060ff6060ff6060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60606060ff6060606060606060ff606060ffff60 % ff60ff60606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60aeff60ff60606060606060ff6060606060ff60606060ff606060ff606060ff % 60606060606060606060ff6060ff6060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60ffffffff6060606060ffff60ff606060606060 % ff606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60aeff60ff60ff60ff606060ff6060606060ff60ffff60ff60ff60ff60ff60ff % 60ff60ff60ffff60ff60ff6060ff6060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60606060ff6060ff6060606060ff60ff60ff60ff % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60aeff606060606060606060ff60606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60aeffff60ffff60606060ffff60606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 327474bb286060ae60aeffff60606060ffff60ff6060606060ff6060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60ffff60ffffff60606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60aeff6060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60606060ff6060ff606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60aeff60ff60ff6060606060606060ff60606060ff60ff60ff60ff6060ff60ff % 60ff60ff60ff60606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60ffff60ff60606060ff60ff60ff60ff60ff60ff % 6060ff60ff6060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60aeff60ff60606060606060606060ff6060606060ffff606060606060ffffff % 60606060ffff60606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60606060ff60606060ff606060ffffff60606060 % 6060ff60606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60aeff60ff606060606060606060606060606060ff60ff606060606060ff6060 % 606060ff606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60606060ff6060ff60ff60606060606060606060 % 6060ff60606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60aeff6060ffff60ffff60606060606060ff606060ffff60606060606060ffff % 60606060ff60ff606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60ffff60ffffff606060ff6060ffff6060606060 % 606060ffff6060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60aeff6060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60606060606060ff606060ff6060ffffff606060 % 606060606060606060606060ff606060606060606060606060ffffff606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60ffff60606060ff606060ff6060ff6060ff6060 % 606060606060606060606060ff606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060ff60ff60ff60ff6060ff60606060ff % 60ff60606060ff60ff60ff60ff6060ff60ff60ff60ff6060606060ff60ff60ff6060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae606060ff606060ff606060ff6060ff6060606060 % 60ff606060606060ff606060ff6060ff60ff606060ff6060606060ff606060ff6060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028aeff60606060ff60ff60ff60ff6060ff6060ff60ff % 60ff60ff60606060ff60ff60ff6060ff60ff60ff60ff6060606060ff60ff60ff6060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 606060606060606060606060606060606060606060ff606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060ffff60606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60ffff6060606060606060606060606060606060 % 60606060606060606060ff6060ff606060606060ff60606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60ffff60606060ff606060ffff6060ff60ffff60 % ffff606060ffff606060ff6060606060606060ffff6060ffff6060ffff60ffff6060ff6060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae606060606060ff606060ff6060606060ffff6060 % 6060ff606060606060606060ff60606060606060ff6060606060ff6060ff606060ff606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60ffffff6060ff606060ff6060606060ffff6060 % ff60ff60606060606060606060ff606060606060ff60ff606060ff6060ff6060606060ff60606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028aeff6060606060ff60ff60ff60ff60ff60ffff6060 % ff60ff6060ff60ff6060ff6060ff60ff60606060ff60ff60ff60ff60ffff60ff60ff60ff60606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60606060606060ffff6060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff3274bb % 327474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae60ffff60606060606060606060606060606060ff % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060ff60ff6060ff60ff6060ff60ff60ff % 60ff60ff60ff60606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae606060ff606060ff6060ff60ff606060ffff60ff % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae606060ff606060ff6060ff60ff6060ff606060ff % 60ff6060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028aeff606060606060ff6060ff60ff606060ff60ff60 % ff60ffff606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060ff606060606060ff6060606060ff60606060 % 606060606060ff606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae606060606060606060ff6060606060ff60606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 327474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060ff60ff60ff6060ff60ffff60ff60ff % 60ff606060ff60ff60ff6060606060ff6060ff60ff60ff60ff60ff6060ff60ff6060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 747474bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060ffffff60ff6060ff60ffff60ffffff % 606060606060606060ff6060606060606060ff60ff60ff60ffffff606060ffff6060606060606060 % 60606060606060606060602860ae7c7c7c7c7c7c28ae606060aeff747474 % 323274bb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060ff606060ff6060ff60ffff606060ff % 606060606060606060ff6060606060606060ff60ff60ff606060ff6060ff60606060606060606060 % 60606060606060606060602860ae28282828282828ae606060aeff743232 % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c286060ae7c28ae606060aeff3274bb % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c286060ae7c28ae606060aeff3274bb % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c28ae7c7c28ae606060aeff3274bb % 3232bbbb286060ae60ae606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060286060606060606060606028ae6060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060602860ae7c7c28ae7c7c28ae606060aeff3274bb % 3232bbbb286060ae60ae282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828286060606060606060606028ae2828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282860ae28282828282828ae606060aeff3274bb % 3232bbbb286060ae6060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606028606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 606060606060606060606060606060606060606060ae606060aeff3274bb % 3232bbbb286060282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282860606060606060606028282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828282828282828282828282828282828282828 % 28282828282828282828282828282828282828282828606060aeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff3274bb % 3232bbbb286060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060606060606060606060606060606060 % 60606060606060606060606060606060606060606060606060aeff3274bb % 3232bbbb28aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeff3274bb % 3232bbbbaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae % aeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeff3274bb % 3232bb32323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 32323232323232323232323232323232323232323232323232323232323232323232323232323232 % 3232323232323232323232323232323232323232323232323232323274bb % 3274747474747474747474747474bb32747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 74747474747474747474747474747474747474747474747474747474747474747474747474747474 % 7474747474747474747474747474bb327474747474747474747474747474 % 32bbbbbbbbbbbbbbbbbbbbbbbbbbbb32bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb % bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb32bbbbbbbbbbbbbbbbbbbbbbbbbbbb %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice /pop load def %%EndProlog %%Page 1 1 /picstr 1191 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def gsave 210.72 321.6 translate 190.56 148.8 scale 397 310 8 [ 397 0 0 -310 0 310 ] { inputf picstr readstring pop } false 3 colorimage 78DAED9D5D929CBA120667955E81B7741FBD0676E3576FE53ACE447460904A55 A5D27FE603316E77030D22FB9310D2D71700C0ECFC6EC3AF5FBF7EFCF8F11B00 F6E5C77FB45BFF5F8DDC35F5F79FB1CBC7FE87AF9F254B96332C3F9779F89ABF F968EAF17A14F7FD0780FDB8A79146EB7FA4A9469AE25402EC6DAA760249A6A9 EFD759B264C972D45293A6384A2C59B21CEBA87B6ACAA529EE7E02C0C08E079A 34D5AE970200400E2135255F8FBAC3486F04962C275C7E2ECFA9F6CA91A6B8D3 07C0EDB96EFD8EEEE6B1A629FA4D01ECAAA9906BFC6D3C7D4BD4633DFDD35472 FFF524BF4B67866C5D38A151FB33C3B16D74C4F04F876BB3683CE58978BC6DAD 34F52872038BDF6C92ACDF9FCD8E6DF8D739C775ADD394F568AF95A692E5E4CC 1FCAC7B76E740D8E3AB62DBE0E9A5A2E4D3DEA7D4BA4294D21C925FCE4EBEFEA 52F1F73757C37AAF5FF3778B6B50FFF5C71E5BF9B8252BB3F28642BE8E5C1284 178B25843475489A2A9E77AB25DED742F2BA286A2AF9F7104D15659BDB7AFF63 AB3F4472E3AA4F539ADDD6EC95B0867535B5659AB2F623F519BBF843ACFC5133 5D269ACF6AB6DB334DE9BFC2FCC7D6E4079FA36A5CA4DFA5CDD294DEC3F3A429 D349796CB7B2C627FC8A154B942F1E38B6ABB91927FBDCED2861F72639B6FA75 866BCAB4E962C0DBCC51F2B569FABEF3A4295F0CA84C539A76809A9F7B4724C8 EDDB7D39304ACD736CF5AD64FAE641A5A67C9B56BA689B36F6629A527EDFA9D2 94A3DE579FA61C4D2EBE86119F0792F5A6C07E4D4D35D5FAD8EA0D13A5A91A43 EA6FAA9E93A64CF5BE79EEF4399AA76AEEF4396EABF96EC3C96DB6CADB82BFA2 FB5EC66680FEC7D6D1E6239F94D8AF13D260B5719AD2374F9DDC6FEA519F928F 5BF1F6905E35C5660AE5EDA46E9A32B576763EB6F23A4D41CE7A1D69EE183A8E EA4E353EFA4DE98D0DB071FBCFD269AAC678DBA729C051388A34459A021C05A4 29D214C0E169CAD71B9C3405007DD2944956A42900E89FA6DCEB71A4A9CF676B 96DFB3CCFF62661F962C275B465D9B1FE3D5AF474853BFFE9D21EBFBF5CF072B 895A0F00C412786D46AD4A4853EF2D325918000C9CA7EFE1AEC7947C1F2BFE01 00E8CB3D4DDD27EFBB6BEA5E4FE48801404F7EFEFCF99821F4ADA9C75D80EF0F 5E0000EDF9F91FA63B7D680A0046694AD96F0A4D0100690A0080340500A42900 00D2140090A6485300409A0200204D0100694A26F908E1F7EB9F37B4F86AB9ED 26DFD9624F1A7DAF9EC8C76D9E9D8C3A0B1B9C32D2942F4D759683A3C8BDF724 64970696F9FA4D3FEC34B3ACE41FA0E26E3FBE264E38364D0DB99C1D9A8ADDA5 D535B54AD208D41490A63469AA58410BAC0BE4AA9FE13B20ACF6FDA2E6CDF2EB 21FB2F7CBC7E0F63CFF5E3240AAFBFB7F8FE67719F57A90B93A61A69EA5D7EDA 5D68B98DB64853C5CD29DFACFF3B6AFF93EB89DAC3A873ADD454D3B3001BA4A9 643B76510EF59ACAB59FE736D44E53457DE9F74DB3AB81974F321AB9D3B27525 EEE3AC2F5DF2A79A165158374DC5D60534FF354A5342A52FE734C1F64D2F1F61 8BB98A52710FA3CE359A224DF56C9BEAD61F601E4DE925503C8CAD2F1F6B38EC 99F7E4F62834459A4253F59A7257EE72EF6F7AA7AFB25A1AD87A86A6485343D2 D4AE4DE8A60B64862674A1DFD49C4DE8CA5AB31C5F4D6F465367A6A92BBA4382 DC8A2EF7870FF4A4A36D2AEA767FD4314CC621B97F45F2BE7FBB0E099A7FCA07 F05277484053FBA529880A81EC21A02946484002680A485380A600664B53C23C CBAD2FA5519BBE32DD87D652E5C0A317BBB73CD8429A0200583D4D010090A600 8034459A0200D2140000690A0048530000B3A5A99F0000BD70A4290E1A00F4D7 94354D010074C3D7360500D007D214004CEE28F79D3E6EF601409FDB7C35698A 6308003D35459A02800FC3EB7AA429009859537FBD449A02806935F5ED25D214 00283535AA318A3405002B6A8A34050027A4A9139E2DA200039A5A3A4D6DEF28 3224A0A93DD2D4DE278E020C686A833485A65A70CEF4734CAE37B3A692E7E5F3 62EEACE9CF26696A514D9D3657E69CDFCBB757F5676AD4D1985353A4A9393595 2BE71B9B6A0F4D45FDACACA529E15B90A676D554B16C33FFF8242742F37EC799 1A787EEBD3D47DCF73BFB0A4A99D34454BCE703BF934E53B593354ED2B3575DF 67CDDFA4A94535155244F52BD127B7E49BE56B4A58B3357538B6E296864F17A6 2FBBA2A684DDCB3552155F274DADAEA9C024205F3B4AD52809D7547143E19AF2 BD39562CEBA6A9DC1BE46236304DE97FB6D054C83191D34E8B77CA1FAFD79469 43264D859F0E34A54F5353B54DE97FB0D054ACA64E7B517F4BD47DE7CEF4CEFA 5A1B9AEA99A6D05460F92CB60F28A34B60C8E92C1FFD371AA8A99026269AD049 53686A334DBD0BFF23D8F86A7C359A2AB6FC6FA9A9AB4D87842169EA5D72D054 7D6388BE7DBBA7A6F4922C26224D43BA50FFEAA9A97AE1CCA6A9D64C95A672E5 134DA1A9104DBDD52428AB5B137AD3ED9EA0A96E694AEE1283A694D9D85795AB B9A066D094E9D0E92B80688A34459A6A1AA84C1969ACA62E45B799404DC53E08 89A68E4A53B44D0506AAFA8E8EDD1AC66B347519BB688ED594E3B0A0A939D314 95BED86020FCAFF545530BB0E37A343D95E3F8460EAD55EA22FCA8A229FA4DAD A5A94BD10F4793281C4FC1B813420B4D5DC6A151C66AAAF2A8A229D2D4729AD2 C7277D180B0F391D3465FA46C3355553C39D4A5363E746214DADA52980FEA57D F8144E9DD3148F1E03ACA5A919669A63BC29340530398C3785A600D6D214690A 4D0190A6D0140090A6D01400690A4D5172004853680A004853680A803485A600 803485A6004853EE34F5676B283900ABA7A93FBB43C901583A4D01004C9EA600 00485300409A224D0100690A0080340500A429A1DF141C88EF678BE3067211A2 DF144451A3298E1E0845A8519AA232786632AFD1140710FAA7298E39650C4D41 0B4D91A6004D01690AD014050648534ABEF2506036D3D4846739398DBBE9FDD6 F5D7AC8D343589B236DB109A6A778DB7D3546EBB0EAF6EACA963DBA6D0149A42 53A4A9153595AC207CFF7D7FF1FE9EC73B1F1F4FAE6D9B6AE68A9ACA9D0EE1F5 5C49B8FFF3B139E1E3EF9DD4BC9EABBA268BE2FB3D8EB591A6E6D4D45B2F42C1 36FD9DDCE806A65A344D25CF82F51457960493A62A37A45F5BFFC2499AAA0CF9 F249D7BF2D57B04953ADCFAFD07E9E0C18EE535CCC6FB2A68AE6AC2972494DE5 3ED5BF7092A62A2B7D0E4D293F4EA56F86B629E1B4EA4FA5720DB369AA58D5A5 6D6A894A5F7D9AD2F8104D4DAB29EB478458A2D1941CF09AA6A9B1859334E5D0 5460A5CF5AE6D1544F4D992A7D0E4D592B7D53698AB6A955D254B1D6E66BCFA4 097D064DD534A15BD394B2D2E75EA1FEEFA59BD04953B986A3649783E4DB922D 12B2D9689B1AD50BDD74B74EEE51A0699B2A1624476397A9285E5B7448E099BE D66D201BC3337D409A9AD64B63EFE1A229384D53A4A9CA0A05650C4D01690AD0 1490A6485380A6E08434054C0B622A9C009D679661828C9371688A8306721162 D6630098BF32C8ACC700B090A6485300409A0200204D0100690A4D01C0BA698A 8E1F747A711742803EFDA6BE37040752D90B1DA05B2F741E7C383999F3B00CB4 28428DD21449FE344234C561DCA324F8AAF357C767FA2872C7B627A029781480 A822D43A4D7DC1EE7C8A4194A6A8FB2CCA5B08DF27F47FFFF2F73DEF574C9A0A 4F535CC5680A4DA1A98791922F8E4D539FFF924BFB7D25B9690D1FE3DE9B5E91 376D7A1D3A684A9EE0D237566AFF41568F1AD0B59BA65AA429CDC5FE2E969552 42534B6B4A3FE59CD203C20C3253696A69AD1535752F2AB9D707A6A9A69ABA6E 73FAA0A9A334A5BFAEDD1F4453136AAA439A7A9C1187A6926FC87D2497F91F25 5FDE3D18DB36254FD15B396FAFA6C0080543AE549A56BEFAC41FB2A61EFF9BFC AF49D2D43B7237D594B039D3FB61754D0915BD904984AFFCECC9EE95A0A95169 2AA7A3769A326DAEA6E688A6C235559C68D8716927538D666DC539D9931AD437 B2EDAD29E1F9DF39D35488A6043BD56C0E4D2D9DA68A779073092A2796E4AABE 7493B0A3A9769A5A254DA1293455D9EC6C4D471A4DE91D7894A63E9D10842EE8 A42934C59D3EE183952629063C34253BCAA1A90E692AA4095DDF57C1B4399AD0 0FEC37A54953354DE8D6956FDC2121C784FDA61CF76ADD9A923B24C81D184853 632B7DB932536C772ACA4ADF849ECBDBD60E09C5862F9F7BD7AAF469A6E79BB3 17FA65EFF90907B64D4DC5D749CFBF74D0D49C6D53D65A159A4253686A034DE5 4EFD3C6D5342971559503410A1293485A65AA729CEDD398593815C28098BA629 CE1D9A4253686AFE3465BA2F23F7E99D24F3CBCF47A0A9704DE55A32E573A4EF 944E458F3465EAD9A2ECBFF755F7507C48BB0445B78FA6E43E4EC5B3A03F4D5F A5511460EF3455F3B385A64ED6D4576AD41DD3590ED1149C96A6DECFB6583525 DF0A4CBE27D7D5BCF8746A6E9D73564837D3D4DB4E8EDFACAFFCE02DFA02337F 5B04692A304D151B761C694AF9F0827537F40F4450381BF542177C55A3295F81 A1009C93A6344F973B3495FC2F7D89F20D1344296DA729D393B91D4E2E374D4E 4B532D34551C1748A839BA4733A3B8AEAB296B81A1D2479A8A4D53CAC4559418 9A1AAB2961E89ED834658AE8B92204A4A9169AA2D23779DB94324D39EEF48568 8A0260D5D4CCE34D5DD334A19B1A5169425F4253BE7E53BE024301A8D154ECB0 781DFA4DD57748C8153661E81EB957837CDF39573229A5433465ED52AEEC9020 1718DAA66A34153E2C5EE75EE8A37A69C25A9A02343555BF293485A638A4686A 489A3275FF265DA32940539DD314A0293485A6264F5380A6D0149A9ABF6DCA54 C5CB3D0DEA68B0B25618DB5530371EA56A923B7D726F289A0E4853454D59FD50 BCEFBF96A6F6EEC630C97853688A34D57ABC293485A6AEEAF1A6DC73220369CA D4BDD3A429CD9CA142A5B2F2FD8E818CB6BC7739CF7853CA19D8F50F1D63B933 D394A68946F93855CD24DAE17F17DF499AB26ACA31DE946606F6E4394253A4A9 D68F1E5FE2335F4D5F77EC159AD268CA3D904BF1EFE49AD11469AA66A482819A 2A0E4984A616D5947C6695E71ACE4C539A76AA51694A29193435C37853F2B3C3 C5338BA648538ECAD4CC9A52FE134D39DAA694E725F78AEFCCBE9770669A2A36 32576AAAFFDF878F5235E17853F22D3FA1C99D5629D2D4A37140D36260D5D435 A243C2E1A354CD39EBB1DC7E55ECC78EA64E4E53A6A61E0A0C9A02347531DE14 A029204D31DE149A4253688AF1A6004D01698AF1A6004DC1EE6D53C5BA9B69B0 296A8527682A77CFD4D468C0D9214D450DE4E2EB9A9E6B99870D34A5EF8E5B79 1F1948534D3545993C4753BEF34E91204DD577EF2C3EB17279C7C413FA586A46 62517E90083783A6AE8ACEBDEE22017BA7A9E2683FF59A723CF3A27FF3B5F5A8 E6B369CAFA4842E063509CEB93D394E3C997CA30AF1FA131648C293415A529DF B078EED74D4502B64F531D34551C2ACA371291BC7E0AE7F0F1A66A460F4353A4 A99E9AD2FC10EB7FA9AFD2DD258AEE129A2A9E5934459A928D147BA72F2AE16B 2C4AD11DAEA99AD1CCD01469AA5D13FAA56ED67654FAE40FD2AC3A95A67CC5A0 BE48C0DE69EA52F42EB6D6EF84B6A3CB387B8872C0ABE4FA299C33F442777448 701409D83B4D59A16C1CAB29405303D3149A4253680A4D4D3EDE945E50246D34 0568EA62BC294053409A023485A6D014690AF6D5947B5029F93E609F2685D899 493BEF3C690AD094A6CC2887463469EA7DE12FA4A99E3B4F9A0234A5D4D4E57D F4DB3ACD68534D355ADBB19A224DC1FC9A2AF6E1F4694AD3B9F7317BBB7276DA C71FA6696DDD3BDF7F845BD2149CA629B95BB8FE6FB9DEA4596D5253EDC6346B B4F31DA217690AD0947CB56A1EB3129AA04DAB750F6CD579E7951567D2145731 9A7268AA72048CAB7AC8A0393565DDF9CE4D58A429384D53CA510A6BAE74B740 66D094FEE3FB698A3405E7A4A91334B565A58F3405C33525F731886D85F6356E CBA31927FF2E6AAAD1CEF7CC54A4294053C919B1AD1D12E48668655781E24D37 B94382FE83353BBF718704D214CC50E93B9C450706214D019ADADB4B1B8C664C 9A02347582A9961E638D3405680AD014690AD01490A6004D593515382C40CF31 F96BAA6FB44D91A660214D39E6441BAEA9CA6E004B0FFE4F9A82333575C53DFA D1C70095F10F4D91A660334D39260F4D3E21F8EE0F204F3C2ACF67AA545072E8 2AFD34BB8E3793A6D0149AEA3C908BFB5197EBDFC75E4C0337299F6AD10F7150 F4A1E38B8C7A5E86340568EA6D8CA4046A1E22CE89C531AAB97254287D9556DE 07CDD382A4293485A63A8F90205F98CA116084118C35CF0E9B64E5D094E68BC8 DF7ACB4A1F690A26D154D136CAD4640D337272735CEC6E4D15774619C3BAC52A D21490A6FA68CAB751CD2B0E4D45D55E699B425368AAF37853C9FA54D4C85195 4DE8FA3679539AA2099D34052B6AEA8AEB90906CE4C9C944F38C70EE0DA6A1AB 723B731DDF218134053354FA1C2CDD3172B392409A0234A5AC7FC1AE9A224DC1 42696A83319AD014690ACEA9F401698A3405680A485380A634E34D091540CE05 698A34059D35656A77AAD714A2234D019A7268AAA73DD014690AD05488A692BD 34AFD7B324727785DCE49BA63EA29C7AD2141CAE29C7284C516FB8ECD3BE0369 0AD054AE6A263F1DAC79A24DF3F85BCD0809688A34055B6ACA3ACE805553C571 9CD014690AD0545153A6D1ED4C9AD28CE384A6485380A606A6298D82D014690A D0945066F403B9D4A72947133A679C340568AAB5A6AED2384EEFF6AB5CCA02D2 141C5BE90334459A023405A4298A1C9A4253688A3405680A4853A4294053409A 02347595C69B728CE5A29C72BD066EF991A6004D0913DE0DD7945E9E4D6D369B 2A495370A0A6AC57654F4D5D134C347CACA648533083A634462A0E397529E631 F70D2A659A09D4B1B9C001B24853680A86684A33A2944653BE41A54C23CCB827 5BBF829EEE214DA12918A529B9AEA74F53957546ABA68A9B730F9035437D706C 9AFAD8893405F3A429618C175FA5CF77F99BB6E5D694724C9BB1F5BEB169EAC7 BF90A660AA34E56E9BD20C3C553464074D2907C81AFE8874CF347537D2BD6DEA 93B54853D05A53A6DC52A3A9FACA541F4D993E389BA6FEE8B0A6A90F0F4DD136 053D35E5687F1672C87DE416E57A4C294EDED6A56E0997D3D48A4DE8829AEE6F B0B64D253545DB14F4D4D4A3922554BE34B5A1BB348A034FF93495DCD6651CC3 2A6480AC51A6122A7D39573CFE973B7DB0A2A660C592D05A53F49B023405E19A 7A9B2AF95FA4294053B087A6485380A6A085A61E3ACABD4E9A0234051B688A34 05680A1A69EADB48C917495380A660274D91A6004D413B4DFDE5FDCAF034F507 CE2050531CCCD54BC2432FE10FCBC4A6294E199AB26A8A23B999A6428A50BB34 05A751AF29A008754B53702C6E4D010845283C4D117AC9FCBEA657805C110A4F 530000E195C1D8340500D05453A42900204D010090A600803475D714B75001A0 0FBE34C5710380CE9A32A5290E1A00CC9CA6BE0000BAA34F53BF0100C6514C53 776BB164C992E5A8652E4DC5F2772B2D560B00F3D0F432CFA5A9C0F57FEF3FA6 02D85E538D1CF248539F7B7CB1CBCFFE375A3F4B962CC72E3F9779A3F57F34F5 A3199FFD07805D697A9973F71300E6E7FF1439BD97 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.5/doc/figs/save.eps0000644000175000017500000054010012310162303013424 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: noname.ps %%Creator: pnmtops %%CreationDate: 12. Mär 17:51 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 216 249 396 513 %%HiResBoundingBox: 216.953993 249.713992 395.045988 512.279984 %%EndComments %%BeginProlog %%BeginPreview: 178 262 8 1310 % 29292929292929292929292929296229292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929a9292929292929292929292929292962 % 29296262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262a92962626262626262626262626262a9 % 2929a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262626262 % 62626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9 % a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9 % a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262626262 % 62626262626262a9a9a9a9a9a9a9a96262a9 % 2929a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff2962a9 % 2929a9ff292929292929296262626229626262626262622929292929292929292929296262626262 % 62626262626262292929292929292929292929626262626262626262626262292929292929292929 % 29292962626262626262626262626229292929292929292929292962626262626262626262626229 % 29292929292929292929296262626262626262626262622929292929292962292929296262626262 % 6262626262626229292929292929ff2962a9 % 296262ff62626262626262626262a92962626262626262ffffff6262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a9626262626262626262 % 6262a92962ff6262626262ff6262ff626262 % 296262ff62626262626262626262a929626262626262626262ff6262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a9626262626262626262 % 6262a92962ff6262626262ff6262ff626262 % 296262ff62626262626262626262a92962626262626262ffff6262ff62ff62ff6262ffff62ff6262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a9626262626262626262 % 6262a92962ff6262626262ff6262ff626262 % 296262ff62626262626262626262a9296262626262626262ffff62ffffff62ff62ff62ffff626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a96262626262ff626262 % 6262a92962ff6262626262ff6262ff626262 % 296262ff6262ffffffffffffffffa929626262626262ff6262ffff6262ff62ffff62ff6262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a962626262ffff626262 % 6262a92962ff6262626262ff6262ff626262 % 296262ff62626262626262626262a929626262626262ffffff6262ff62ff62ff626262ff62626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a9626262626262626262 % 6262a92962ff6262626262ff6262ff626262 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a9626262626262626262 % 6262a92962ff6262626262ff6262ff626262 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a9626262626262626262 % 6262a92962ffffffffffffff6262ff626262 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a9626262626262626262 % 6262a92962626262626262626262ff626262 % 626262ffa9a9a9a9a9a9a9a9a9a9a962a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9ff626262 % 292962a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff622929 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050ff50505050ff505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050ff50505050ffffff50ffff5050ff50505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050ffffff5050ff5050505050ff505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050ff50505050ff505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050ff50505050ff505050ff50ff505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a95050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b505050505050ff626262 % 296262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b505050ff5050505050505050505050505050ff50505050505050505050 % 505050505050505050505050ff5050505050505050505050ff505050505050505050505050505050 % 505050505050505050505050505050ffffffff505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b50505050ff505050ffff50ffff50ff50505050ffffff5050ffff5050ff % 50ffff50ffffff50ff50ffffff50ffff50ffff50ffff50505050ff505050ff5050ffff505050ff50 % ff50ffff5050ffff50ff50ff50ff5050ffffff505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b5050ff50ff505050ff5050ff50ff505050ff50ff505050ff50ff505050 % 50505050ff50505050505050ff505050ff505050505050ff50ff505050ff50ff505050ff50505050 % 5050ff50ff505050ffff50ff50ff5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b5050ff50ff50505050ff50ff50ff505050ff50ff505050ff50ff505050 % ff505050ff50505050505050ff50ff50ff5050ff505050ff50ff505050ff5050505050ff50505050 % 5050ff50ff505050505050ff50505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b50505050ff50ff50505050ff50ff50ff505050ff505050ff50ff505050 % ff50ff50ff50ffff5050ff50ff50ff50ff5050ff50ff505050ff50ff50ff50ff50ff50ff50505050 % 5050ff50ff50ff50ff50ff50ff50ff50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b50505050505050505050505050505050505050505050505050ff505050 % 50505050ff5050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 2929a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a9505050505050202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 296262a9505050505050ff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050ff5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050ff5050ff5050ff5050ff50ff5050ff505050ff50ff50ff50ffff50ff50ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050ff5050ff50ff50ff50505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050ff5050ff5050ff5050ffffff5050505050505050ff505050ffffffff5050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050ff50ffff5050ff5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050ff5050505050ff50505050505050505050505050ff505050ffff50505050 % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050ff505050505050ff50505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050ffff50505050ff5050ffff5050ffff50ff50ffff50505050ff50ffff5050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050ff50ffff5050ff5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a950505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50509b9b9b9b9b9b % 9b9b505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 50509b9b9b9b9b9b9b5050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a206a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a209b6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a206a6a205050505050ff626262 % 296262a950505050509b50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff502050509b6a6a209b6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a20509b6a205050505050ff626262 % 296262a950505050509b50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff502050509b6a2050509b % 6a20505050509b5050ff505050ff505050505050505050505050505050505050ff50ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a20509b6a205050505050ff626262 % 2929a9a950505050509b50ff50ff50ff50ffff50ff50ff50ff5050ff50ff50ff50ffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff502050509b209b9b9b9b % 9b20505050509b5050ffffff50ff50ff50ff505050ff50ff50ff5050ff50ff50ff50ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b209b9b9b9b205050505050ff2962a9 % 2929a9a950505050509b50ff50ffffffffffff50ffffff505050ffff50ffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff502050509b6a6a6a6a6a % 6a20505050509b505050505050ff50ffffff505050505050ffff5050ff505050ff50ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b50ff50ffffffffffff50ffffffffffffffffffffff50ffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff502050509b2020202020 % 9b20505050509b5050ff505050ff505050505050505050ff50505050ff505050ff50ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b202020209b205050505050ff2962a9 % 2929a9a950505050509b5050ffffffffffffff50ffffff5050ffff50ff50ff50ffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff502050509b2050505050 % 9b20505050509b505050ffff5050ffffff5050ff50505050ff50ff5050ffff50ff50ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 2929a9a950505050509b50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b50505050ff5050505050505050505050505050ff505050505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 2929a9a950505050509b50ff505050ff50ff50ffffff50ffff50ff50ff50ff50ff50505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b50505050ff50ffff5050ffff5050ff505050ff50505050ffff50ff5050ff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 2929a9a950505050509b5050ff505050505050ff5050505050ffff50ff50ff505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b50505050ff50505050ff505050ff505050ff50505050ff505050ff505050ff50ff % ff505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 2929a9a950505050509b5050ff505050505050ff5050505050505050ff5050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b50505050ff50505050ff5050505050ff505050505050ff505050ff505050ff5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 296262a950505050509b50ff50505050505050ff505050ffff5050ff50ff50ff5050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b5050ffff5050ffff5050ffff5050ff5050505050505050ffff50ff505050ff50ff % ff505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b9b9b9b9b9b205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b50505050505050505050505050505050505050505050505050ff50505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b5050ff5050ff50ff50505050ffff50505050ff50ff505050ff50ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b50ff505050ff50ff50ffffff50ffff50ff50ff50ff50ff5050505050ff50 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b5050ff50505050ff50505050ffff5050505050ff505050505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff505050505050ff5050505050ffff50ff50ff505050505050ff5050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b5050ffffff5050ffffff505050505050505050ff50ff50ff5050ffffff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff505050505050ff5050505050505050ff5050505050ffffffff5050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b5050ff50505050ff505050ffffffff50505050ff505050505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff505050505050ff505050ff50ff50ff50ff50ff5050505050ff50ff % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b5050ff50505050ff50505050505050505050ff505050ff505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050ff50505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b5050ff5050ff50ff50505050ffff50505050ff50ff505050ff50ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b50ff505050ff50ff50ffffff50ffff50ff50ff50ff50ff50ffff50505050 % 50ffff505050ffffff50ff50ffff505050ff505050505050505050505050502050509b2050505050 % 9b20505050509b5050ff50505050ff50505050ffff5050505050ff505050505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b5050ff505050505050ff5050505050ffff50ff50ff505050505050ff50ff % 505050ff505050ff5050ff505050ff505050ff5050505050505050505050502050509b2050505050 % 9b20505050509b5050ffffff5050ffffff505050505050505050ff50ff50ff5050ffffff5050ff50 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b5050ff505050505050ff5050505050505050ff5050505050505050ff50ff % 5050505050505050ff50ff505050ff505050ff5050505050505050505050502050509b2050505050 % 9b20505050509b5050ff50505050ff505050ffffffff50505050ff505050505050ff5050505050ff % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b5050ff505050505050ff505050ff50ff50ff50ff50ff5050ffff50505050 % 50ff50ff505050505050ff50ff50ff505050ff5050505050505050505050502050509b2050505050 % 9b20505050509b5050ff50505050ff50505050505050505050ff505050ff505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050ffff50505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050ff5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 296262a950505050509b50ff505050ff50ff50ffffff50ffff50ff50ff50ff50ff5050ff50505050 % 5050ff5050ffff50ffff5050ff5050ffff50ffff50ffff50505050505050502050509b2050505050 % 9b20505050509b505050ffff50ff50ff50ffff5050ff505050ff5050ffff50ff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff505050505050ff5050505050ffff50ff50ff505050505050ff50ff % 505050ff50505050ff50505050ffff505050ffff50505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050ff505050ff50505050ff5050ff5050ff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff505050505050ff5050505050505050ff50505050505050505050ff % 505050ff50505050ff50505050ffff505050ffff50505050505050505050502050509b2050505050 % 9b20505050509b5050ff50505050ff50ff5050505050ff5050ff505050ff50ff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff505050505050ff505050ff50ff50ff50ff50ff505050505050ff50 % 50ff50ff50ff5050ff5050ff50ffff50ff50ffff50ff50ff505050505050502050509b2050505050 % 9b20505050509b5050ff50ff50ff5050ff50ff50ff50ff5050ff5050505050ff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b50505050505050505050505050505050505050505050505050505050ff50 % 505050505050505050505050505050505050505050505050505050505050502050509b209b9b9b9b % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050ff5050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff5050505050ffff50505050505050ff505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b50505050505050505050505050505050505050505050ff50505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff50505050505050ff505050505050ff505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff50ff50ff5050ff50ff50ff50ffff50ff50ff50ff5050ff50ffff50 % ff5050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff50ff50ff505050505050ff50ff50ff505050ff50ff50ff50ffff50ff5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff505050505050ff505050ffffff5050ff505050505050505050ff50 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff5050505050505050505050ffff50ff505050ff5050505050ffff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 2929a9a950505050509b5050ff505050505050ff505050ff50ff50ff50ff50ff505050ff50ffff50 % ff5050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff50ff5050505050505050ff50ff50ff505050ff50ff50ff50ffff50ff5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b50505050505050505050505050505050505050505050505050505050ff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b50505050505050505050505050505050505050505050505050505050ff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b50505050505050505050505050505050505050505050505050ff50505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050ff50505050505050505050505050ff50505050505050ff50 % 505050505050505050505050ff50ff50505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b50505050505050505050505050505050505050505050ff50505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050ff50505050505050505050505050ff50505050505050ff50 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b5050ff50ff50ff5050ff50ff50ff50ffff50ff50ff50ff50505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff50ff50ff5050ff50ff50ff50ff5050505050ff50ff50ff50ff50ff50ffff % 50ff50ff50ff5050ff50ff5050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b5050ff505050505050ff505050ffffff5050ff5050505050505050ffff50 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff505050505050ff505050ff505050505050505050ff505050ff505050ffff % ffff50ff50505050ff50505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b5050ff505050505050ff5050505050505050505050ff5050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff505050505050ff505050ff505050505050505050ff505050ff505050ffff % 505050ff50505050ff50505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b50ff50505050505050ff505050ffff5050ff50ff50ff5050505050ffff50 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050ffff50ffff50ff50ffff5050505050505050ffffff50ffff5050ffffff50 % ffff5050ffff505050ffff5050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050ff50ff5050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050ff5050505050505050505050ff5050505050505050505050 % 5050505050505050505050ff505050505050505050505050ff50ff50505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b50505050505050505050505050505050505050505050ff50505050505050 % 50505050505050505050505050ff505050505050ff505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050ff5050505050505050505050505050505050505050505050 % 5050505050505050505050ff50505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff50ff50ff5050ff50ff50ff50ffff50ff50ff50ff50ffff50ff50ff % 50505050505050505050505050ff50ff50505050ff505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff50ff50ff5050ff50ff50ff50ff50505050505050ff50ff50ff50ffff50ff % 5050505050ff50ffff5050ff50ff50ff50ff5050ff50ff5050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff505050505050ff505050ffffff5050ff5050505050505050ffffff % 50ff5050ff5050505050ffff50ff50ff50505050ff505050505050505050502050509b2020202020 % 2020505050509b5050ff505050505050ff505050ff505050505050505050ffffff50505050ffffff % 5050505050505050ff5050ff505050ffffff5050ff50505050505050505050505050505050505020 % 50509b2020202020205050505050ff626262 % 296262a950505050509b5050ff505050505050ff5050505050505050505050ff5050505050ff5050 % 50ffffffff5050505050505050ff50ff50505050ff505050505050505050502050509b6a2050509b % 6a20505050509b5050ff505050505050ff505050ff5050505050505050505050ff505050ffff5050 % 50505050505050ffff5050ff5050505050505050ff50505050505050505050505050505050505020 % 50509b205050506a205050505050ff626262 % 296262a950505050509b50ff50505050505050ff505050ffff5050ff50ff50ff505050505050ffff % 50505050505050505050ffff5050ff50ff505050ff505050505050505050502050509b6a2050509b % 6a20505050509b505050ffff50ffff50ff50ffff50505050505050505050ffffff50ffff5050ff50 % 5050505050ffff5050ff50ffffff50ffff50505050ffff5050505050505050505050505050505020 % 50509b6a20509b6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a209b6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a20509b6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a209b6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a9b6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a9b6a6a205050505050ff626262 % 296262a9505050505020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020202020202020202050509b2020202020 % 2020505050509b202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 5050202020202020205050505050ff626262 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a950505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050505050 % 5050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 5050505050505050505050505050ff2962a9 % 2929a9a950505050509b6a6a6a6a206a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 2020202020202020202020202020202020202020202020202020206a6a6a6a205050505050505050 % 5050505050509b6a6a6a6a6a206a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a202020202020202020202020202020202020202020202020202020206a206a6a6a6a20 % 5050505050505050505050505050ff2962a9 % 2929a9a950505050509b6a6a20209b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 205050505050505050505050505050505050505050505050509b2020206a6a205050505050505050 % 5050505050509b6a6a6a20209b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a2050505050505050505050505050505050505050505050505050509b6a20206a6a6a20 % 5050505050505050505050505050ff2962a9 % 2929a9a950505050509b202050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 205050505050505050505050505050505050505050505050509b2050502020205050505050505050 % 5050505050509b6a202050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a2050505050505050505050505050505050505050505050505050509b6a205020206a20 % 5050505050505050505050505050ff2962a9 % 2929a9a950505050509b9b9b50509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 205050505050505050505050505050505050505050505050509b2050509b9b205050505050505050 % 5050505050509b6a9b9b50509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a2050505050505050505050505050505050505050505050505050509b6a20509b9b6a20 % 5050505050505050505050505050ff2962a9 % 2929a9a950505050509b6a6a9b9b9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 205050505050505050505050505050505050505050505050509b209b9b6a6a205050505050505050 % 5050505050509b6a6a6a9b9b9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a2050505050505050505050505050505050505050505050505050509b6a209b6a6a6a20 % 5050505050505050505050505050ff2962a9 % 2929a9a950505050509b6a6a6a6a9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b206a6a6a6a205050505050505050 % 5050505050509b6a6a6a6a6a9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b6a9b6a6a6a6a20 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020205050505050505050 % 5050505050509b202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020205050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050502020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020205050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050502050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050505050505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050502050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050505050505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050502050505050505050505050 % 5050505050505050505050ff5050ff50505050505050505050505050505050505050505050505050 % ff5050505050505050505050505050505050505050505050505050505050505050505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050502050505050505050505050 % 50505050505050505050505050505050ffff50ffff50ff505050ff50ff5050ff505050ff5050ffff % ff50ff505050505050505050505050505050505050505050505050202020202020505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 2929a9a9505050505020505050505050505050505050505050505050502050505050505050505050 % 505050505050505050505050505050505050ffff50ff50ff50505050505050ffff505050ff505050 % ff50ff50505050505050505050505050505050505050505050505050505050509b505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050502050505050505050505050 % 5050505050505050505050ff5050ff505050ffff50ff50ff505050505050ff50ff505050ff505050 % ff5050ff50505050505050505050505050505050505050505050509b9b9b9b9b9b505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050502050505050505050505050 % 505050505050505050505050ffff5050ffff50ff50ff50ff50505050505050ffff505050ff50ffff % ff50ff505050505050505050505050505050505050505050505050505050505050505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050502050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050505050505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050502050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050505050505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a950505050502050505050505050505050505050505050505050209b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a950505050502050505050505050505050505050505050505050ffffffff50505050505050 % 5050505050505050505050509b5050ff5050ff505050505050505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a950505050502050505050505050505050505050505050505050ff50505050505050505050 % 5050505050505050505050509b5050ff505050505050505050505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a950505050502050505050505050505050505050505050505050ff505050ff50ff50ff50ff % 5050505050505050505050509b50505050505050ff50ff50ff50ff50ff50ffff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a950505050502050505050505050505050505050505050505050ff505050ff50ff50505050 % 5050505050505050505050509b505050ffff505050505050ff505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a950505050502050505050505050505050505050505050505050ff505050ff50ff50505050 % 5050505050505050505050509b505050ffff505050505050ff505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a950505050502050505050505050505050505050505050505050ff50505050ff50505050ff % 5050505050505050505050509b505050505050ff5050ffff50505050ff50ff505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020205050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a95050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b5050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050ff50ff5050505050ff505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050ff50505050ffff50ff50ffff5050ffffffff505050ffff50ffff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a950505050505050ff5050ff505050ff505050ffff505050505050ff505050ff50ff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a950505050505050505050ff505050ff50505050ff505050505050ff505050ff50ff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050ff50ff50ff50ff50ff50ff50ffff50ff50505050ff50ff50ff50ff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a95050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b505050505050ff626262 % 296262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 2929a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b505050ff5050505050505050505050505050ff50505050505050505050 % 505050505050505050505050ff5050505050505050505050ff505050505050505050505050505050 % 505050505050505050505050505050ff505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b50505050ff505050ffff50ffff50ff50505050ffffff5050ffff5050ff % 50ffff50ffffff50ff50ffffff50ffff50ffff50ffff50505050ff505050ff5050ffff505050ff50 % ff50ffff5050ffff50ff50ff50ff5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b5050ff50ff505050ff5050ff50ff505050ff50ff505050ff50ff505050 % 50505050ff50505050505050ff505050ff505050505050ff50ff505050ff50ff505050ff50505050 % 5050ff50ff505050ffff50ff50ff5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b5050ff50ff50505050ff50ff50ff505050ff50ff505050ff50ff505050 % ff505050ff50505050505050ff50ff50ff5050ff505050ff50ff505050ff5050505050ff50505050 % 5050ff50ff505050505050ff50505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b50505050ff50ff50505050ff50ff50ff505050ff505050ff50ff505050 % ff50ff50ff50ffff5050ff50ff50ff50ff5050ff50ff505050ff50ff50ff50ff50ff50ff50505050 % 5050ff50ff50ff50ff50ff50ff50ff50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b50505050505050505050505050505050505050505050505050ff505050 % 50505050ff5050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050ff5050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b505050505050505050505050505050505050505050505050ff50505050 % 50505050ff505050505050505050505050505050505050505050ffff505050505050505050505050 % 505050505050505050505050505050ff50ff50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050ff505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b2020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020505050505050ff2962a9 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020202020202020ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505020202020202020202020202020202020202020202050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 20202020202020202020202020202020202020505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050202020202020202020202020202020 % 2020202020205050505050505050ff2962a9 % 2929a9a9505050505050505020505050505050505050505050505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050505050505050505050505050505050509b505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050205050505050505050505050505050 % 50505050509b5050505050505050ff2962a9 % 2929a9a9505050505050505020505050505050505050505050505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050505050505050505050505050505050509b505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050205050505050505050505050505050 % 50505050509b5050505050505050ff2962a9 % 2929a9a9505050505050505020505050505050505050505050505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050505050505050505050505050505050509b505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050205050505050505050505050505050 % 50505050509b5050505050505050ff2962a9 % 2929a9a950505050505050502050505050505050ff5050ff5050ff50505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050ffffff5050ff505050505050505050509b505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505020505050505050ff50505050ff5050 % 50505050509b5050505050505050ff2962a9 % 2929a9a950505050505050502050505050505050505050ff50ff5050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050ff50505050ff505050505050505050509b505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505020505050505050ff50505050ff5050 % 50505050509b5050505050505050ff2962a9 % 2929a9a95050505050505050205050505050ff505050ffffff505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050ff50505050ff505050ff50ff505050509b505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505020505050505050ff5050ff50ff50ff % 50ff5050509b5050505050505050ff2962a9 % 2929a9a95050505050505050205050505050ff505050ffff50505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050ff50505050ff505050ffffff505050509b505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505020505050505050ff50505050ff50ff % ffff5050509b5050505050505050ff2962a9 % 2929a9a950505050505050502050505050505050505050ff50505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050ff50505050ff505050505050505050509b505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505020505050505050ff50505050ff5050 % 50505050509b5050505050505050ff2962a9 % 296262a9505050505050505020505050505050505050505050505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050505050505050505050505050505050509b505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050205050505050505050505050505050 % 50505050509b5050505050505050ff626262 % a9a962a9505050505050505020505050505050505050505050505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050505050505050505050505050505050509b505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050205050505050505050505050505050 % 50505050509b5050505050505050ff62a9a9 % 292962a9505050505050505020505050505050505050505050505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050505050505050505050505050505050509b505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050205050505050505050505050505050 % 50505050509b5050505050505050ff622929 % 296262a9505050505050505020505050505050505050505050505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050505050505050505050505050505050509b505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050205050505050505050505050505050 % 50505050509b5050505050505050ff626262 % 296262a95050505050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50505050505050 % 5050505050505050505050505050505050505050505050505050505050505050505050505050509b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b5050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff2962a9 % 2929a929292929292929296262626262626262626262622929292929292929292929296262626262 % 62626262626262292929292929292929292929626262626262626262626262292929292929292929 % 29292962626262626262626262626229292929292929292929292962626262626262626262626229 % 29292929292929292929296262626262626262626262622929292929292929292929296262626262 % 6262626262626229292929292929292962a9 % 29296262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262a92962626262626262626262626262a9 % 29a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9 %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice /pop load def %%EndProlog %%Page 1 1 /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 371 string def gsave 216.96 249.72 translate 178.08 262.56 scale 371 547 8 [ 371 0 0 -547 0 547 ] { picstr readstring } image 800080008d000000e3d6019d5680d680d6cfd6015656e2d6019d007f00d6 d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656 d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d72d69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69d56d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69d9d9d000300d69dd6e59d0256d6d6809d809dd19d0356 56d6d6e49d0156000200d6d6e49d0156d6809d809dcf9d0156d6e49d0256 9d007f00d69dd69d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d567f9d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d566b9d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d56fb9d0156007f00d6d69d9d9d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d7f569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d72569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d9d9dd69d569d000600 d69dd69d569d800080009b0006d6d69d9d9d56000700d6d69d9d9d560080 d680d69dd60700d69dd69d569d007f00d69dd69d569d00d6d69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd6d6d69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd6729dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d 9dd6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69d00d6d69d9d9d56000800 d6d69d9d9d5600d6ea9d0156d6809d809de89d0156d6e99d0256d6d6eb9d 085600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6809d80 9de99d0256d6d6eb9d025656d6fc9df200fd9d09565600d6d69d9d9d5600 0800d6d69d9d9d5600d6eb9d025656d6f09dfb00809d809d049d9d5656d6 e99d0656d6d69d9d9d00f49d0000fc9d085600d69dd69d569d000900d69d d69d569d00d6d6eb9d0256d6d6f29d0600009d9d9d0000809d809d049d9d 56d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d5600 0800d6d69d9d9d5600d6eb9d025656d6f29d010000fc9d010000809d809d 039d5656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d56 9d000900d69dd69d569d00d6d6eb9d0256d6d6f39dfd00f89dfc00039d9d 0000fc9d0300009d9dfc00809d959d0256d6d6eb9d025656d6fc9d0000f4 9d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d0256 56d6f19dfc00fb9d0800009d9d00009d0000fc9d0800009d00009d9d0000 809d979d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69d d69d569d000b00d69dd69d569d00d6d69d9df000fd9d0256d6d6f09dfd00 f89d1100009d00009d9d9d00009d00009d9d9d0000809d969d0256d6d6f9 9dfc00f69d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d5600 0c00d6d69d9d9d5600d69d9d9d00f29d05009d9d5656d6ee9dfd00fd9dfb 00099d9d00009d9d00009d9dfa00809d969d025656d6f89d04009d9d0000 f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000c00d6 9dd69d569d00d6d69d9d00f29d0600009d9d56d6d6ee9d1400009d9d0000 9d9d00009d9d00009d9d00009d0000809d909d0256d6d6f99d04009d9d00 00f79d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00 d6d69d9d9d5600d69d9d9def00039d5656d6f49d010000fb9d1400009d00 009d9d9d00009d9d9d009d00009d9d0000809d919d025656d6f89dfb00f6 9d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69d d69d569d00d6d6fc9df100049d9d56d6d6f59d010000fc9d0900009d9d00 009d9d0000fc9dfd00fd9d0500009d9d0000809d949d0256d6d6f89dfc00 f79d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6 d69d9d9d5600d6eb9d025656d6f39dfa00fc9dfd00079d00009d9d9d0000 fb9dfc00809d949d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d 5600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6809d809d e99d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d 9d56000800d6d69d9d9d5600d6eb9d025656d6809d809de99d025656d6e9 9d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69d d69d569d00d6d6eb9d0256d6d6809d809de99d0256d6d6eb9d025656d6fc 9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6 eb9d025656d6809d809de99d025656d6e99d0556d6d69d9d9df100fd9d08 5600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6809d809d e99d0256d6d6eb9d025656d6fa9df3000b9d9d565600d6d69d9d9d560008 00d6d69d9d9d5600d6eb9d025656d6809d809de99d025656d6e99d0256d6 d6eb9d085600d69dd69d569d007f00d69dd69d569d00d69d9d569d569d56 9d569d569d569d569d569d569d569d56d6569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d567f9d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 56729d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 d6569d569d569d569d569d569d569d569d569d569d569d5656d69d569d56 9d569d569d569d569d569d569d569d569d565600d6d69d9d9d560008009d 569d9d9d56009de956009d80568056e756009de856009de9560700d69dd6 9d569d000000fb56009d800080009b0001d6d6fc56ff000000fcd6029d56 5680af80af9daf0200d69dfcd6ff000700d6d6d69d569d5680af80af9daf 0700d6d69dd6d6d6000700d6d69d9d9d565680af80af9daf0700d69dd69d 569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6 d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d56 80af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf 0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d 9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d6 9dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d5656 80af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf 0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d 569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6 d69d9d9d5656f3aff90004af00afaf0080af80afb6af0700d69dd69d569d 000700d69dd69d569d56f3af0000f9af0600afaf00afaf0080af80afb9af 0700d6d69d9d9d56000700d6d69d9d9d5656f3af0000f6af0300afaf0080 af80afb9af0700d69dd69d569d000700d69dd69d569d56f3af0000f9af0a 00afaf00af000000afafaffc00fdaf0300af000080af80afc8af0700d6d6 9d9d9d56000700d6d69d9d9d5656f3af0000f9af1300afaf00afaf00afaf af0000afaf0000afaf000080af80afc6af0700d69dd69d569d000700d69d d69d569d56f3affa000cafaf00afaf00afaf00afafaf00fcaf0300afaf00 80af80afc5af0700d6d69d9d9d56000700d6d69d9d9d5656f3af0000f9af 0900afaf00afaf00afafaffa0002afaf0080af80afc5af0700d69dd69d56 9d000700d69dd69d569d56f3af0000f9af0a00afaf00afaf00afafaf00f9 af000080af80afc5af0700d6d69d9d9d56000700d6d69d9d9d5656f3af00 00f9af0a00afaf00afaf00afafaf00f9af000080af80afc5af0700d69dd6 9d569d000700d69dd69d569d56f3af0000f9af1200afaf00afaf00afafaf 0000afaf0000afaf0080af80afc5af0700d6d69d9d9d56000700d6d69d9d 9d5656f3af0000f9af0a00afaf00afafaf0000afaffc00fdaf000080af80 afc5af0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6 d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d00 0700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d 9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80 af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d6 9dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d5600 0700d6d69d9d9d5656f4af80648064b564f4af0700d69dd69d569d000700 d69dd69d569d56f4af80648064b66400dff4af0700d6d69d9d9d56000700 d6d69d9d9d5656f4af01646480af80afb9af01dfdff4af0700d69dd69d56 9d000700d69dd69d569d56f4af01646480af80afb9af01dfdff4af0700d6 d69d9d9d56000700d6d69d9d9d5656f4af01646480af80afb9af01dfdff4 af0700d69dd69d569d000700d69dd69d569d56f4af01646480af80afb9af 01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af01646480af 80afb9af01dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af01 646480af80afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d56 56f4af01646480af80afb9af01dfdff4af0700d69dd69d569d000700d69d d69d569d56f4af016464f8af0000e7af0000fcaf0000d8af0000faaf0000 e8af0000c0af0400afafaf0080afefaf01dfdff4af0700d6d69d9d9d5600 0700d6d69d9d9d5656f4af016464f8af0000e7af0000fcaf0000d8af0000 faaf0000f6af0000f3af0000c0af0600af00af00af0080aff1af01dfdff4 af0700d69dd69d569d000700d69dd69d569d56f4af016464f9af0000e6af 0400afafaf00d8af0000f9af0000f6af0000f4af0000c0af0600afafaf00 000080aff0af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4 af016464f9af0300afaf00fcaf1e00afaf000000afafaf00af0000afaf00 0000af00afafaf00afaf00af000000fcaffd0009af00afaf00af0000afaf fc00fdaf0400af000000fcaf0b00afafaf000000af00afafaffc0007afaf 000000afafaffc00fcaf0b00afafaf000000af00afafaffc00fcaffc00fd af0f00af0000afaf0000afafaf00af000000fcaffc0015afaf00afafaf00 afafaf00afafaf00afaf00af00af0080aff1af01dfdff4af0700d69dd69d 569d000700d69dd69d569d56f4af016464f9af0300afaf00fcaf7f00af00 afafaf00afaf0000afafaf0000afaf0000afafaf00afaf0000afaf0000af af0000afaf0000afaf0000afafaf0000afaf0000afaf0000afaf0000afaf af00afaf0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000 afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf 0000afaf002100afaf00afaf0000afaf0000afaf0000afaf0000af00afaf af00afafaf00afafaf00fcaf000080afefaf01dfdff4af0700d6d69d9d9d 56000700d6d69d9d9d5656f4af016464faaf0400afafaf00fcaf0300af00 00fbaf0000fcaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf03 00afaf00f7af0300afaf00fcaf0700afaf00afafaf00fcaf0000f9af0300 afaf00f8af0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf 0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf0d00af00af afaf00afafaf00afaf0080afe9af01dfdff4af0700d69dd69d569d000700 d69dd69d569d56f4af016464faaf0400afafaf00fcaf0900afaf000000af afaf00fcaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300af af00fbaffb0002afaf00fcaf0700afaf00afafaf00fcaf0300afafaffb00 02afaf00fcaffb0006afaf00afafaf00fcaf0200afaffa0002afaf00fcaf 0e00afaf00afafaf00afafaf00afaf00fcaf0200afaffa000cafaf00afaf 00afaf00afafaf0080afe9af01dfdff4af0700d6d69d9d9d56000700d6d6 9d9d9d5656f4af016464faaf0400afafaf00fcaf0000fcaf040000afaf00 fcaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fc af080000afafaf00afaf00fcaf0700afaf00afafaf00fcaf1b00afaf0000 afafaf00afaf00afafaf0000afafaf00afaf00afafaf00fcaf0300afaf00 f9af0000fcaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9 af0a00afaf00afaf00afafaf0080afe9af01dfdff4af0700d69dd69d569d 000700d69dd69d569d56f4af016464fbaf0000fcaf0000fcaf0000fbaf03 00afaf00fcaf0000fcaf0200af00fcaf0000fcaf0300afaf00fcaf0300af af00fcaf0000fcaf0300afaf00fcaf0200af00fcaf0000fcaf0300afaf00 fcaf0700afaf00afafaf00fcaf0200af00fcaf0000fcaf0300afaf00f9af 0000fcaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af09 00af00af00af00afaf0080afe8af01dfdff4af0700d6d69d9d9d56000700 d6d69d9d9d5656f4af016464fbaf0000fcaf0e0000afaf0000af00afafaf 00afaf00fcaf070000afaf0000af00fcaf0000fcaf0b00afaf0000afaf00 00afaf00fcaf0f0000afaf0000afaf0000afaf0000af00fcaf1b0000afaf 0000afaf0000afaf0000afaf00afafaf0000afaf0000af00fcaf230000af af0000afaf0000afaf0000afaf0000afaf0000afaf00afafaf00afafaf00 afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00afafaf0080afe8 af01dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af016464fb af0000fbaffd000aaf00afaf000000afafaf00fbaffd0003af00af00fcaf 0000fcaf0b00afafaf000000af00afaf00fbaffd000baf0000af00af0000 00afaf00fbaffd0017af00afafaf000000af0000afaf0000afaf000000af 000000fbaffd0004af00afafaffc00fcaffc00fdaf0b00afafaf00afafaf 00afaf00fcaf0300afafaffc00fcaf0800afafaf00afafaf0080afe8af01 dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af016464caaf00 00f1af0000d0af000080afb1af01dfdff4af0700d69dd69d569d000700d6 9dd69d569d56f4af016464cfaf050000afaf0000f1af0000d5af050000af af000080afb1af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656 f4af016464ceaffc00f0af0000d4affc0080afb0af01dfdff4af0700d69d d69d569d000700d69dd69d569d56f4af01646480af80afb9af01dfdff4af 0700d6d69d9d9d56000700d6d69d9d9d5656f4af01646480af80afb9af01 dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af01646480af80 afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af0164 6480af80afb9af01dfdff4af0700d69dd69d569d000700d69dd69d569d56 f4af01646480af80afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d 9d9d5656f4af01646480df80dfb7dff4af0700d69dd69d569d000700d69d d69d569d56f4af006480df80dfb6dff4af0700d6d69d9d9d56000700d6d6 9d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680 af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf07 00d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d 56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680 af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf07 00d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d56 9d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d6 9d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680 af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf07 00d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d 56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d5656f3 affb00fbaf0000d9af000091aff90004af00afaf0080afd8af0700d69dd6 9d569d000700d69dd69d569d56f3af0000fcaf050000afafaf00eaaf0000 f0af000091af0000f9af0300afaf0080afd8af0700d6d69d9d9d56000700 d6d69d9d9d5656f3af0000fbaf0000e6af000080af0000f6af000080afd8 af0700d69dd69d569d000700d69dd69d569d56f3af0000faaf0b00afaf00 afaf00af0000afaffc00fcaffc0006af000000afafaffc00fdaf0800af00 00af00afafaffc00fcaffd009faf0000f9af0600afaf00afafaffc00fcaf fd0080afe6af0700d6d69d9d9d56000700d6d69d9d9d5656f3af0000faaf 3a00afaf00afaf0000afafaf0000afaf0000afaf0000afaf0000af00afaf af0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf00afafaf00 a0af0000f9af1200afaf00afaf0000afaf0000afaf00afafaf0080afe7af 0700d69dd69d569d000700d69dd69d569d56f3af0000faaf0600afaf00af af00fcaf0000fcaf0300afaf00faaf0400afafaf00fcaf0300afaf00fcaf 0300afaf00fcaf0400afaf00009daffa0008afaf00afaf00afaf00fcaf04 00afaf000080afe4af0700d6d69d9d9d56000700d6d69d9d9d5656f3af00 00faaf0600afaf00afaf00fcaffa0002afaf00faaf0400afafaf00fcaf03 00afaf00fcaf0200afaffa00fdaffd009faf0000f9af0500afaf00afaffa 00fdaffd0080afe6af0700d69dd69d569d000700d69dd69d569d56f3af00 00faaf0600afaf00afaf00fcaf0000f9af0000faaf0400afafaf00fcaf03 00afaf00fcaf0300afaf00f6af010000a0af0000f9af0600afaf00afaf00 f6af01000080afe7af0700d6d69d9d9d56000700d6d69d9d9d5656f3af00 00fbaf0700afafaf00afaf00fcaf0000f9af0000fcaf0600af00afafaf00 fcaf0300afaf00fcaf0300afaf00f5af0000a0af0000f9af0600afaf00af af00f5af000080afe7af0700d69dd69d569d000700d69dd69d569d56f3af 0000fcaf080000afafaf00afaf00fcaf1b0000afaf0000afaf0000afaf00 00af00afafaf0000afaf0000afaf00fcaf0f00afaf0000afaf0000afaf00 afafaf00a0af0000f9af1200afaf00afaf0000afaf0000afaf00afafaf00 80afe7af0700d6d69d9d9d56000700d6d69d9d9d5656f3affb00fbaf0300 afaf00fbaffc00fcaffc00fdaf030000afaffc00fdaf0000fcaf0300afaf affc00fcaffd009faf0000f9af0600afaf00afafaffc00fcaffd0080afe6 af0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d 9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700 d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d56 5680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9d af0700d6d69d9d9d56000700d6d69d9d9d5656f6af8064fb64fcaff164f6 af8064e764fcaff164f5af0700d69dd69d569d000700d69dd69d569d56f6 af8064fc6400dffcaff26400dff6af8064e86400dffcaff26400dff5af07 00d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf 016464fb9500dffb9501dfdff6af01646480afebaf01dfdffcaf016464fb 9500dffb9501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af 01646480af02afdfdffcaf016464fc9502dfdf64fc9501dfdff6af016464 80afebaf01dfdffcaf016464fc9502dfdf64fc9501dfdff5af0700d6d69d 9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf016464fc 9502dfdf64fc9501dfdff6af01646480afebaf01dfdffcaf016464fc9502 dfdf64fc9501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af 046464afafaf8500fdaf01dfdffcaf0e6464959595dfdfaf6464959595df dff6af01646480afebaf01dfdffcaf0e6464959595dfdfaf6464959595df dff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af046464afafaf85 00fdaf01dfdffcaf0e6464959595dfdfaf6464959595dfdff6af01646480 afebaf01dfdffcaf0e6464959595dfdfaf6464959595dfdff5af0700d69d d69d569d000700d69dd69d569d56f6af046464afafafd30000afb300fdaf 01dfdffcaf0e64649595dfdfafafaf64649595dfdff6af016464fcaffa00 d5af050000afaf0000a6af01dfdffcaf0e64649595dfdfafafaf64649595 dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af046464afafaf d30000afb300fdaf01dfdffcaf0e64649595dfdfafafaf64649595dfdff6 af016464fcaf0000f9af0000f5af0000e5af0400afafaf00a4af01dfdffc af0e64649595dfdfafafaf64649595dfdff5af0700d69dd69d569d000700 d69dd69d569d56f6af046464afafafd40000afb200fdaf01dfdffcaf0464 6495dfdffbaf04646495dfdff6af016464fcaf0000f9af0000f5af0000e5 af0400afafaf00a4af01dfdffcaf04646495dfdffbaf04646495dfdff5af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464faaffd000faf00 afaf0000afaf000000af00afafaffc00fcaf0e0000af000000af000000af 000000afb200fdaf01dfdffcaf04646495dfdffbaf04646495dfdff6af01 6464fcaf0000faaffd00fdaffc000cafaf000000afaf00af0000afaffc00 f9affc0008afaf000000af000000a5af01dfdffcaf04646495dfdffbaf04 646495dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af316464 afafaf0000afaf0000afaf0000afaf0000af0000afaf0000afaf0000afaf 0000afaf00af000000af000000af000000afb200fdaf01dfdffcaf036464 dfdff76401dfdff6af016464fcaffb00fdaf1a00afafaf0000afaf0000af af00afafaf0000afafaf0000afaf0000fbaf0c0000afaf0000afaf00afaf af00a4af01dfdffcaf036464dfdff76401dfdff5af0700d6d69d9d9d5600 0700d6d69d9d9d5656f6af166464afafaf000000af0000af000000af0000 00af0000affc0003af0000affc000daf00af000000af000000af0000afb1 00fdaf01dfdffcaf026464dff66401dfdff6af016464f7af0700afaf00af afaf00fcaf0700afaf00afafaf00f7af0000fbaf0000fcaf0700afaf00af afaf00a4af01dfdffcaf026464dff66401dfdff5af0700d69dd69d569d00 0700d69dd69d569d56f6af166464afafaf000000af0000af000000af0000 00af0000affc0002af0000faaf0c0000af0000af0000af000000afb100fd af01dfdffcaf016464f59501dfdff6af016464f7af0600afaf00afafaffa 0006afaf00afafaf00fbaffb00fbaf0000fcaf0700afaf00afafaf00a4af 01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af166464afafaf000000af0000af000000af000000af0000affc 0003af0000aff9000aaf0000af0000af000000afb100fdaf01dfdffcaf01 6464f3dff6af016464f7af0700afaf00afafaf00f9af0400afafaf00fcaf 050000afafaf00fbaf0000fcaf0700afaf00afafaf00a4af01dfdffcaf01 6464f3dff5af0700d69dd69d569d000700d69dd69d569d56f6af166464af afaf000000af0000af000000af000000af0000affc0003af0000aff90009 af00af00af00af0000afb000fdaf01dfdffcaf016464f6df0264dfdff6af 016464fcaf0000fcaf0700afaf00afafaf00f9af0400afafaf00fcaf0000 fcaf0000fbaf0000fcaf0700afaf00afafaf00a4af01dfdffcaf016464f6 df0264dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af166464 afafaf0000afaf0000af000000af000000af0000affc0014af0000afaf00 00afaf000000af000000af000000affc0000afb500fdaf01dfdffcaf0364 64dfdff9af036464dfdff6af016464fcaf0000fcaf1300afaf00afafaf00 00afaf0000afaf00afafaf00fcaf170000afaf0000afaf00afaf0000afaf 0000afaf00afafaf00a4af01dfdffcaf036464dfdff9af036464dfdff5af 0700d69dd69d569d000700d69dd69d569d56f6af016464faaffd000baf00 0000af000000af0000affc0003af000000fcaffc0008af000000af000000 affc0000afb500fdaf01dfdffcaf036464dfdff9af036464dfdff6af0164 64fbaffc00fcaf030000afaffc00fcaf030000af00fbaffd0007af0000af 00afafaffc00fdaf0400afafaf00a4af01dfdffcaf036464dfdff9af0364 64dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af046464afaf af8500fdaf01dfdffcaf036464dfdff9af036464dfdff6af01646480afeb af01dfdffcaf036464dfdff9af036464dfdff5af0700d69dd69d569d0007 00d69dd69d569d56f6af046464afafaf8500fdaf01dfdffcaf036464dfdf f9af036464dfdff6af01646480afebaf01dfdffcaf036464dfdff9af0364 64dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af046464afaf af8500fdaf01dfdffcaf036464dfdff9af036464dfdff6af01646480afeb af01dfdffcaf036464dfdff9af036464dfdff5af0700d69dd69d569d0007 00d69dd69d569d56f6af01646480af02afdfdffcaf036464dfdff9af0364 64dfdff6af01646480afebaf01dfdffcaf036464dfdff9af036464dfdff5 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdf fcaf036464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf0364 64dfdff9af036464dfdff5af0700d69dd69d569d000700d69dd69d569d56 f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6af016464 80afebaf01dfdffcaf036464dfdff9af036464dfdff5af0700d6d69d9d9d 56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf036464dfdff9 af036464dfdff6af01646480afebaf01dfdffcaf036464dfdff9af036464 dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01646480af02 afdfdffcaf036464dfdff9af036464dfdff6af01646480afebaf01dfdffc af036464dfdff9af036464dfdff5af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af016464d0af0000b0af01dfdffcaf036464dfdff9af036464df dff6af016464f8af0000e7af0000fbaf0300afaf00f6af0000f5affc00b1 af01dfdffcaf036464dfdff9af036464dfdff5af0700d69dd69d569d0007 00d69dd69d569d56f6af016464d0af0000b0af01dfdffcaf036464dfdff9 af036464dfdff6af016464f8af0000e7af0000fcaf0400afafaf00f6af00 00f6af0000fcaf0000b2af01dfdffcaf036464dfdff9af036464dfdff5af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d1af0000afaf01 dfdffcaf036464dfdff9af036464dfdff6af016464f8af0000e7af0400af afaf00fcaf0000ebaf0000fcaf0000b2af01dfdffcaf036464dfdff9af03 6464dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af1a6464af afaf000000afafaf00af0000afaf0000afafaf00af000000fcaffc000eaf af00afafaf00afafaf00afafaf00afaf01dfdffcaf036464dfdff9af0364 64dfdff6af016464f8af0300afafaffc00fcaffc00fcaffd00fdaf0300af af00fbaf0300afafaffc00fdaf0b00afaf00af000000afafaf00fcaf0000 b2af01dfdffcaf036464dfdff9af036464dfdff5af0700d6d69d9d9d5600 0700d6d69d9d9d5656f6af016464fbaf2a0000afaf0000afaf0000afaf00 afaf0000afaf0000afaf0000afaf0000af00afafaf00afafaf00afafaf00 afaf01dfdffcaf036464dfdff9af036464dfdff6af016464f8af1c00afaf 0000afaf0000afaf0000afaf0000afaf00afafaf00afaf00af00faaf1600 afaf0000afaf0000afaf00afaf0000afaf0000afaf00fcaf0000b2af01df dffcaf036464dfdff9af036464dfdff5af0700d69dd69d569d000700d69d d69d569d56f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf 0300afaf00fcaf0d00af00afafaf00afafaf00afaf00aeaf01dfdffcaf03 6464dfdff9af036464dfdff6af016464f8af0300afaf00fcaf0300afaf00 fcaf0400afaf0000fbaffd00faaf0300afaf00fcaf0600afaf00afaf00fc af0300afafaffc00b1af01dfdffcaf036464dfdff9af036464dfdff5af07 00d6d69d9d9d56000700d6d69d9d9d5656f6af016464faaf0e00afaf00af afaf00afafaf00afaf00fcaf0200afaffa000cafaf00afaf00afaf00afaf af00aeaf01dfdffcaf036464dfdff9af036464dfdff6af016464f8af0300 afaf00fcaf0200afaffa00fdaffd00fdaf0300afaf00fbaf0200afaffa00 05afaf00afaf00fcaf0300afaf00fcaf0000b2af01dfdffcaf036464dfdf f9af036464dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01 6464faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af0a 00afaf00afaf00afafaf00aeaf01dfdffcaf036464dfdff9af036464dfdf f6af016464f8af0300afaf00fcaf0300afaf00f6af080000afaf00afafaf 00fcaf0300afaf00f9af0300afaf00fcaf0300afaf00fcaf0000b2af01df dffcaf036464dfdff9af036464dfdff5af0700d6d69d9d9d56000700d6d6 9d9d9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf 0300afaf00f9af0900af00af00af00afaf00adaf01dfdffcaf036464dfdf f9af036464dfdff6af056464afafaf00fcaf0300afaf00fcaf0300afaf00 f5af0300afaf00fcaf0700afafaf00afaf00f9af0300afaf00fcaf0300af af00fcaf0000b2af01dfdffcaf036464dfdff9af036464dfdff5af0700d6 9dd69d569d000700d69dd69d569d56f6af016464fbaf0f0000afaf00afaf af00afafaf00afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00af afaf00fcaf0300afaf00b5af01dfdffcaf036464dfdff9af036464dfdff6 af056464afafaf00fcaf1a00afaf0000afaf0000afaf0000afaf0000afaf 00afafaf00afaf00fbaf1100afaf00afaf0000afaf0000afaf00afaf00fc af0300afaf00fcaf0000b2af01dfdffcaf036464dfdff9af036464dfdff5 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af166464afafaf000000 afafaf00afafaf00afafaf00afaf00fcaf0300afafaffc00fcaf0800afaf af00afafaf00fcaf0300afaf00b5af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaffc00fcaffc00fcaffc00fcaffd00fdaf0000faaf05 00af00afafaffc00fdaf0300afaf00fcaf0300afafaffc00b1af01dfdffc af036464dfdff9af036464dfdff5af0700d69dd69d569d000700d69dd69d 569d56f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6af 01646480afebaf01dfdffcaf036464dfdff9af036464dfdff5af0700d6d6 9d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf036464 dfdff9af036464dfdff6af01646480afebaf01dfdffcaf036464dfdff9af 036464dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464 80af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afebaf01 dfdffcaf036464dfdff76401dfdff5af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6 af01646480afebaf01dfdffcaf026464dff66401dfdff5af0700d69dd69d 569d000700d69dd69d569d56f6af01646480af02afdfdffcaf036464dfdf f9af036464dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdf fcaf036464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf0164 64f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af0164 6480af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afebaf 01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6af 01646480afebaf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d 000700d69dd69d569d56f6af016464d0af0000faaf0000f9af0000bfaf01 dfdffcaf036464dfdff9af036464dfdff6af016464fcaff900fdaff900fb af0000fbaffb00fcaf0000f7af0200afaff900a8af01dfdffcaf016464f5 9501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d0 af0000fbaf010000f9af0000bfaf01dfdffcaf036464dfdff9af036464df dff6af016464fcaf0000fbaf040000afaf00f6affd00fcaf0000fcaf0500 00afaf0000f9af040000afaf00a2af01dfdffcaf016464f59501dfdff5af 0700d69dd69d569d000700d69dd69d569d56f6af016464d1af0000fbaf02 00af00f9af0000bfaf01dfdffcaf036464dfdff9af036464dfdff6af0164 64fcaf0000faaf0300afaf00f6af0200af00fcaf0000fbaf0400afaf0000 f9af040000afaf00a2af01dfdffcaf016464f59501dfdff5af0700d6d69d 9d9d56000700d6d69d9d9d5656f6af1a6464afafaf000000afafaf00af00 00afaf0000afafaf00af000000fcaffc000eafaf00afafaf00afafaf00af afaf00fcaf0b00afaf00afafaf000000af00bfaf01dfdffcaf036464dfdf f9af036464dfdff6af016464fcaf0000faaf0300afaf00f6af0200af00fc af0000faaf0400af00af00fbaf0500af00afaf00a2af01dfdffcaf016464 f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464 fbaf3a0000afaf0000afaf0000afaf00afaf0000afaf0000afaf0000afaf 0000af00afafaf00afafaf00afafaf00afafaf00afafaf00afaf0000afaf 0000bfaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000 fbaf0400afafaf00f7af0800afafaf00afafaf00faaf0400af00af00fbaf 0500af00afaf00a2af01dfdffcaf016464f59501dfdff5af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af016464faaf0e00afaf00afafaf00afaf af00afaf00fcaf0300afaf00fcaf1100af00afafaf00afafaf00afaf00af afaf00fcaf0300afaf00fcaf0000bfaf01dfdffcaf036464dfdff9af0364 64dfdff6af016464fcaffa00fcaffa00fcaf0800afafaf00afafaf00faaf 0e00af00afaf00afafaf00afaf00afaffa00a7af01dfdffcaf016464f595 01dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464faaf 0e00afaf00afafaf00afafaf00afaf00fcaf0200afaffa0010afaf00afaf 00afaf00afafaf00afafaf00fcaf0300afaf00fcaf0000bfaf01dfdffcaf 036464dfdff9af036464dfdff6af016464fcaf0000fbaf0400afafaf00f8 af0000fbaf0300afaf00faaf0f00af00afaf00afafaf00afaf00afaf00a2 af01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf03 00afaf00f9af0d00afaf00afaf00afafaf00afafaff90001af00fcaf0000 bfaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf 0300afaf00f8aff90002afaf00faaf0f00af00afafaf00af00afafaf00af af00a2af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700 d69dd69d569d56f6af016464faaf0e00afaf00afafaf00afafaf00afaf00 fcaf0300afaf00f9af0900af00af00af00afaf00f7af0300afaf00fcaf00 00bfaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000fa af0300afaf00f8af0000fbaf0300afaf00fbaf1000afaf00afafaf00af00 afafaf00afaf00a2af01dfdffcaf016464f59501dfdff5af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af016464fbaf0f0000afaf00afafaf00af afaf00afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00afafaf00 f7af0800afaf0000afaf0000bfaf01dfdffcaf036464dfdff9af036464df dff6af016464fcaf0000faaf0300afaf00f9af0000f9af0200af00fcaf04 0000afaf00fcaf0000fcaf0300afaf00a2af01dfdffcaf016464f59501df dff5af0700d69dd69d569d000700d69dd69d569d56f6af166464afafaf00 0000afafaf00afafaf00afafaf00afaf00fcaf0300afafaffc00fcaf0800 afafaf00afafaf00f7af0800afafaf000000af00bfaf01dfdffcaf036464 dfdff9af036464dfdff6af016464fcaf0000faaf0200afaff90001af00f9 af0100affb00fcaf0000fcaf0000fcaf0200afaff900a8af01dfdffcaf01 6464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01 646480af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afeb af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd6 9d569d56f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6 af01646480afebaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d 56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf036464dfdff9 af036464dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af 0700d69dd69d569d000700d69dd69d569d56f6af01646480af02afdfdffc af036464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf016464 f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464 80af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afebaf01 dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd69d56 9d56f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6af01 646480afebaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d5600 0700d6d69d9d9d5656f6af01646480af02afdfdffcaf036464dfdff9af03 6464dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af0700 d69dd69d569d000700d69dd69d569d56f6af01646480af02afdfdffcaf03 6464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf016464f595 01dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d0af 0000dcaf0000d5af01dfdffcaf036464dfdff9af036464dfdff6af016464 fcaff900fdaff900fbaf0000fbaffb00fcaf0000f7af0200afaff900a8af 01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd69d 569d56f6af016464d0af0000dcaf0000d5af01dfdffcaf036464dfdff9af 036464dfdff6af016464fcaf0000fbaf040000afaf00f6affd00fcaf0000 fcaf050000afaf0000f9af040000afaf00a2af01dfdffcaf016464f59501 dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d1af00 00afaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000fa af0300afaf00f6af0200af00fcaf0000fbaf0400afaf0000f9af040000af af00a2af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700 d69dd69d569d56f6af1a6464afafaf000000afafaf00af0000afaf0000af afaf00af000000fcaffc0011afaf00afafaf00afafaf00afafaf00afafaf fc0002afaf00fbaf0200afaffc00fdaf0f00af0000afaf000000afafaf00 afafaffc00fdaf0400af000000e4af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaf0000faaf0300afaf00f6af0200af00fcaf0000faaf 0400af00af00fbaf0500af00afaf00a2af01dfdffcaf016464f59501dfdf f5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464fbaf340000 afaf0000afaf0000afaf00afaf0000afaf0000afaf0000afaf0000af00af afaf00afafaf00afafaf00afaf0000afaf0000af00fbaf2600af0000afaf 0000afaf0000afafaf00afafaf00afaf00afaf0000afaf0000afaf0000af af0000e5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf00 00fbaf0400afafaf00f7af0800afafaf00afafaf00faaf0400af00af00fb af0500af00afaf00a2af01dfdffcaf016464f59501dfdff5af0700d69dd6 9d569d000700d69dd69d569d56f6af016464faaf0e00afaf00afafaf00af afaf00afaf00fcaf0300afaf00fcaf1100af00afafaf00afafaf00afaf00 afafaf00fcaf0a00afaf00afafaf00afaf00fcaf0300afaf00fcaf010000 fbaf0300afaf00fcaf0300afaf00fcaf0000e5af01dfdffcaf036464dfdf f9af036464dfdff6af016464fcaffa00fcaffa00fcaf0800afafaf00afaf af00faaf0e00af00afaf00afafaf00afaf00afaffa00fcaf040000afaf00 b0af01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d6 9d9d9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf 0200afaffa000fafaf00afaf00afaf00afafaf00afafaffa0008afaf00af afaf00afaffa0002afaf00fbaffd00fdaf0300afaf00fcaf0300afaf00fc af0000e5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf00 00fbaf0400afafaf00f8af0000fbaf0300afaf00faaf0f00af00afaf00af afaf00afaf00afaf00f8af0500af0000af00b0af01dfdffcaf016464f595 01dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464faaf 0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af0e00afaf00 afaf00afafaf00afafaf00f9af0700afafaf00afaf00f9af0000f9af0700 00afaf00afaf00fcaf0300afaf00fcaf0000e5af01dfdffcaf036464dfdf f9af036464dfdff6af016464fcaf0000faaf0300afaf00f8aff90002afaf 00faaf0f00af00afafaf00af00afafaf00afaf00f8af0400afaf0000afaf 01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300 afaf00f9af0900af00af00af00afaf00fcaf0000f8af0600af00afafaf00 f9af0000f8af0600afaf00afaf00fcaf0300afaf00fcaf0000e5af01dfdf fcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0300afaf00 f8af0000fbaf0300afaf00fbaf1000afaf00afafaf00af00afafaf00afaf 00a2af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d6 9dd69d569d56f6af016464fbaf0f0000afaf00afafaf00afafaf00afaf00 fcaf1400afaf0000afaf0000afafaf00afafaf00afafaf00fcaf170000af af0000afafaf00af00afafaf0000afaf0000afaf00fcaf1200afafaf00af af00afaf0000afaf0000afaf00fcaf0000e5af01dfdffcaf036464dfdff9 af036464dfdff6af016464fcaf0000faaf0300afaf00f9af0000f9af0200 af00fcaf040000afaf00fcaf0000fcaf0300afaf00a2af01dfdffcaf0164 64f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af1664 64afafaf000000afafaf00afafaf00afafaf00afaf00fcaf0300afafaffc 00fcaf0800afafaf00afafaf00fbaffc00fbaf0000fbaffc00fdaf0000fb affd00fdaf0300afafaffc00fdaf0000fcaf0000e5af01dfdffcaf036464 dfdff9af036464dfdff6af016464fcaf0000faaf0200afaff90001af00f9 af0100affb00fcaf0000fcaf0000fcaf0200afaff900a8af01dfdffcaf01 6464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01 646480af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afeb af01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6 af01646480afebaf01dfdffcaf016464f59501dfdff5af0700d69dd69d56 9d000700d69dd69d569d56f6af01646480af02afdfdffcaf036464dfdff9 af036464dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffc af036464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf016464 f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464 80af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afebaf01 dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d 5656f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6af01 646480afebaf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d00 0700d69dd69d569d56f6af01646480af02afdfdffcaf036464dfdff9af03 6464dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af0700 d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf03 6464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf016464f595 01dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464d0af 0200af00ddaf0000f2af0300afaf00e8af01dfdffcaf036464dfdff9af03 6464dfdff6af016464dbaf0300afaf0094af01dfdffcaf016464f59501df dff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d0af0200 af00ddaf0000f2af0300afaf00e8af01dfdffcaf036464dfdff9af036464 dfdff6af016464dbaf0300afaf00f7af00009eaf01dfdffcaf016464f595 01dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464d1af 0300afaf00ddaf0000f2af0000e5af01dfdffcaf036464dfdff9af036464 dfdff6af016464dbaf0000f4af00009eaf01dfdffcaf016464f59501dfdf f5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af1a6464afafaf0000 00afafaf00af0000afaf0000afafaf00af000000fcaffc0018afaf00afaf af00afafaf00afafaf00afaf00af000000afaf00fbaf0600af00af000000 fcaffc00fdaf0c00af0000af00af000000afafaffc00fdaf0600afaf00af afaffc00efaf01dfdffcaf036464dfdff9af036464dfdff6af016464fbaf fc000aafaf0000afafaf0000afaffc00fcaffd00faaf0e00afaf00afafaf 000000afaf0000009faf01dfdffcaf016464f59501dfdff5af0700d69dd6 9d569d000700d69dd69d569d56f6af016464fbaf350000afaf0000afaf00 00afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00afafaf00 afafaf00afaf0000afaf0000af0000fcaf3100af0000afaf0000afaf0000 afaf0000afaf0000afafaf0000afaf0000af0000afaf0000afaf00afaf00 afaf0000afaf0000f0af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fcaf1b0000afaf0000afaf00afafaf00afaf0000afaf0000afaf00af afaf00fbaf0d00afaf00afaf00afafaf00afaf009eaf01dfdffcaf016464 f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464 faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf1100af 00afafaf00afafaf00afaf00afafaf00fcaf0a00afaf00afafaf00afaf00 fcaf0300afaf00fcaf0300afaf00fcaf0000fcaf0200af00fcaf0900afaf 00afaf00afaf00ebaf01dfdffcaf036464dfdff9af036464dfdff6af0164 64f7af0a00afafaf00af00afafaf00fcaf0400afaf0000f8af0700afaf00 afaf0000fbaf00009eaf01dfdffcaf016464f59501dfdff5af0700d69dd6 9d569d000700d69dd69d569d56f6af016464faaf0e00afaf00afafaf00af afaf00afaf00fcaf0200afaffa0010afaf00afaf00afaf00afafaf00afaf af00fcaf0a00afaf00afafaf00afaf00fcaf0200afaffa0002afaf00fcaf 0000fcaf0200af00fcaf0900afaf00afaf00afaf00ebaf01dfdffcaf0364 64dfdff9af036464dfdff6af016464fbaffb00fcaf0000fcaffa00fdaffd 00faaf0d00afaf00afafaf000000afafaf009eaf01dfdffcaf016464f595 01dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464faaf 0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af0e00afaf00 afaf00afafaf00afafaf00fcaf0a00afafaf00afaf00afaf00fcaf0300af af00f9af0000fcaf0000fcaf0200af00fcaf0900afaf00afaf00afaf00eb af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf050000afaf af00fcaf0000fcaf0000f6af010000fbaf0300afaf00fbaf040000afaf00 9eaf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69d d69d569d56f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf 0300afaf00f9af0900af00af00af00afaf00fcaf0000fcaf0a00afafaf00 af00afafaf00fcaf0300afaf00f9af0000fcaf0000fcaf0200af00fcaf09 00afaf00afaf00afaf00fcaf0000f0af01dfdffcaf036464dfdff9af0364 64dfdff6af016464fcaf0000fcaf0a00afafaf00af00afafaf00f5af0000 fbaf0300afaf00faaf0300afaf009eaf01dfdffcaf016464f59501dfdff5 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464fbaf0f0000af af00afafaf00afafaf00afaf00fcaf1400afaf0000afaf0000afafaf00af afaf00afafaf00fcaf0000fcaf0000fcaf150000afafaf0000afaf0000af af0000afaf0000afaf00fcaf1a0000afaf0000af0000afaf0000afaf00af af00afaf0000afaf0000f0af01dfdffcaf036464dfdff9af036464dfdff6 af016464fcaf2e0000afaf0000afaf00afafaf00afaf0000afaf0000afaf 00afafaf00afaf00afaf00afaf00afaf00afafaf00afaf009eaf01dfdffc af016464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6 af166464afafaf000000afafaf00afafaf00afafaf00afaf00fcaf0300af afaffc00fcaf0800afafaf00afafaf00fcaf0000fcaf0000fcaf0000fcaf 0400af000000fcaffc00fdaf0000fcaf0700af000000afafaffc00fdaf06 00afaf00afafaffc00efaf01dfdffcaf036464dfdff76401dfdff6af0164 64fbaffd0000affc00fdaf030000afaffc00fcaffd00fdaf0c00afaf00af af00afafaf000000fcaf010000a0af01dfdffcaf016464f59501dfdff5af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464c4af0000fcaf00 00c1af01dfdffcaf026464dff66401dfdff6af01646480afebaf01dfdffc af016464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6 af016464c5af010000fcaf0000c1af01dfdffcaf016464f59501dfdff6af 01646480afebaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56 000700d6d69d9d9d5656f6af016464c6af010000fbaf0000c1af01dfdffc af016464f59501dfdff6af01646480afebaf01dfdffcaf016464f59501df dff5af0700d69dd69d569d000700d69dd69d569d56f6af01646480af02af dfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf016464f5 9501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480 af02afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf01 6464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01 646480af02afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdf fcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656 f6af01646480af02afdfdffcaf016464f59501dfdff6af01646480afebaf 01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd69d 569d56f6af01646480af02afdfdffcaf016464f59501dfdff6af01646480 afebaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6 d69d9d9d5656f6af016464d0af0200af00b2af01dfdffcaf016464f59501 dfdff6af016464fcaf0000f4affc00f2af0300afaf00fbaf0000faaf0000 9faf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69d d69d569d56f6af016464d0af0200af00b2af01dfdffcaf016464f59501df dff6af016464fcaf0000f5af0000fcaf0000f3af0300afaf00fbaf0000fa af00009faf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d560007 00d6d69d9d9d5656f6af016464d1af0000afaf01dfdffcaf016464f59501 dfdff6af016464fcaf0000f5af0000fcaf0000f3af0300afaf00fbaf0000 faaf00009faf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d00 0700d69dd69d569d56f6af1a6464afafaf000000afafaf00af0000afaf00 00afafaf00af000000fcaffc0014afaf00afafaf00afafaf00afafaf00af af00afafaffc00fdaffc00c0af01dfdffcaf016464f59501dfdff6af0164 64fcaf0a00af000000afaf00af0000faaf0000faaffc00fdaf0300afaf00 fbaf1200af000000afaf00af000000afaf00af000000aaaf01dfdffcaf01 6464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01 6464fbaf3c0000afaf0000afaf0000afaf00afaf0000afaf0000afaf0000 afaf0000af00afafaf00afafaf00afafaf00afaf00afaf0000afaf0000af 0000afaf0000c1af01dfdffcaf016464f59501dfdff6af016464fcaf0800 00afaf0000af0000f9af0000faaf0b0000afaf0000afaf00afaf00fbaf13 0000afaf0000af0000afaf0000af0000afaf0000abaf01dfdffcaf016464 f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464 faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf1400af 00afafaf00afafaf00afaf00afafaf00afaf00faaf0000fcaf0000c1af01 dfdffcaf016464f59501dfdff6af016464fcaf0000fcaf0200af00f9af00 00f4af0600afaf00afaf00fbaf0000fcaf0200af00fcaf0200af00fcaf00 00abaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6 d69d9d9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fc af0200afaffa0013afaf00afaf00afaf00afafaf00afafaf00afaf00faaf 0000fcaf0000c1af01dfdffcaf016464f59501dfdff6af016464fcaf0000 fcaf0200af00faaf0000f7affb0005afaf00afaf00fbaf0000fcaf0200af 00fcaf0200af00fcaf0000abaf01dfdffcaf016464f59501dfdff5af0700 d69dd69d569d000700d69dd69d569d56f6af016464faaf0e00afaf00afaf af00afafaf00afaf00fcaf0300afaf00f9af1100afaf00afaf00afafaf00 afafaf00afaf00faaf0000fcaf0000c1af01dfdffcaf016464f59501dfdf f6af016464fcaf0000fcaf0200af00fbaf0000f7af0b0000afafaf00afaf 00afaf00fbaf0000fcaf0200af00fcaf0200af00fcaf0000abaf01dfdffc af016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6 af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9 af0900af00af00af00afaf00fcaf0300afaf00fcaf0200af00fcaf0000c1 af01dfdffcaf016464f59501dfdff6af016464fcaf0000fcaf0200af00fc af0000f6af0000fcaf0600afaf00afaf00fbaf0000fcaf0200af00fcaf02 00af00fcaf0000abaf01dfdffcaf016464f59501dfdff5af0700d69dd69d 569d000700d69dd69d569d56f6af016464fbaf0f0000afaf00afafaf00af afaf00afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00afafaf00 fcaf0f00afaf0000afaf0000af0000afaf0000c1af01dfdffcaf016464f5 9501dfdff6af016464fcaf070000afaf0000af00fcaf0000f9af2700afaf 0000afaf0000afaf00afaf00afaf00afaf0000afaf0000af0000afaf0000 af0000afaf0000abaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af166464afafaf000000afafaf00afafaf 00afafaf00afaf00fcaf0300afafaffc00fcaf0800afafaf00afafaf00fc af0300afafaffc00fdaffc00c0af01dfdffcaf016464f59501dfdff6af01 6464fcaf0700af000000afaf00fcaffa0028afaf00afafaf000000af0000 af00afaf00afaf00afaf00af000000afaf00af000000afaf00af000000aa af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd6 9d569d56f6af01646480af02afdfdffcaf016464f59501dfdff6af016464 c6af0000a6af01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d5600 0700d6d69d9d9d5656f6af01646480af02afdfdffcaf016464f59501dfdf f6af016464c6af0000a6af01dfdffcaf016464f59501dfdff5af0700d69d d69d569d000700d69dd69d569d56f6af01646480af02afdfdffcaf016464 f59501dfdff6af016464c6af0000a6af01dfdffcaf016464f59501dfdff5 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdf fcaf016464f59501dfdff6af01646480afebaf01dfdffcaf016464f59501 dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01646480af02 afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf016464 f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464 80af02afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf 016464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af 01646480af02afdfdffcaf016464f59501dfdff6af01646480afebaf01df dffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d56 56f6af01646480af02afdfdffcaf016464f59501dfdff6af01646480afeb af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd6 9d569d56f6af016464d0af0700af00afafaf0000b7af01dfdffcaf016464 f59501dfdff6af016464edaf0000e4af0000f1af0000e3af050000afaf00 00cfaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6 d69d9d9d5656f6af016464d0af0500af00afaf00b5af01dfdffcaf016464 f59501dfdff6af016464edaf0000e4af0000f1af0000e4af0400afafaf00 cdaf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69d d69d569d56f6af016464d1af0000fbaf0000b5af01dfdffcaf016464f595 01dfdff6af016464edaf0000e4af0000f1af0000e4af0400afafaf00cdaf 01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af1a6464afafaf000000afafaf00af0000afaf0000afafaf00af 000000fcaffc001bafaf00afafaf00afafaf00afafaf00afaf00af000000 afafaf000000bcaf01dfdffcaf016464f59501dfdff6af016464fbaffc00 fdaffc00fdaf0300afafaffc00fdaf0300af0000f6affd0004af00afafaf fc00fcaffd0004af00afafaffc00fcaffc00faaffc0008afaf000000af00 0000ceaf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700 d69dd69d569d56f6af016464fbaf380000afaf0000afaf0000afaf00afaf 0000afaf0000afaf0000afaf0000af00afafaf00afafaf00afafaf00afaf 00afaf00afafaf00afafaf00bdaf01dfdffcaf016464f59501dfdff6af01 6464fcaf1b0000afaf0000af0000afaf0000afaf00afaf0000afaf0000af af0000f5af250000afaf0000afaf0000afaf0000afaf0000afaf0000afaf 0000afaf0000afaf0000afaf0000fcaf0c0000afaf0000afaf00afafaf00 cdaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d6 9d9d9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf 0300afaf00fcaf1900af00afafaf00afafaf00afaf00afafaf00afaf00af afaf0000baaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf 0000fcaf0600afaf00afaf00fcaf0300afaf00f4af0000fcaf0300afaf00 fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00f7af0000fcaf0700af af00afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700d69dd69d56 9d000700d69dd69d569d56f6af016464faaf0e00afaf00afafaf00afafaf 00afaf00fcaf0200afaffa0013afaf00afaf00afaf00afafaf00afafaf00 afaf00fcaffd00bcaf01dfdffcaf016464f59501dfdff6af016464fcaf00 00faaf0000fcaf0600afaf00afaf00fcaf0300afaf00f4af0000fcaf0300 afaf00fcaf0300afaf00fcaf0200afaffa0002afaf00f7af0000fcaf0700 afaf00afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af016464faaf0e00afaf00afafaf00afaf af00afaf00fcaf0300afaf00f9af1100afaf00afaf00afafaf00afafaf00 afaf00faaf010000bdaf01dfdffcaf016464f59501dfdff6af016464fcaf 0000faaf0000fcaf0600afaf00afaf00fcaf0300afaf00f4af0000fcaf03 00afaf00fcaf0300afaf00fcaf0300afaf00f9af0000f7af0000fcaf0700 afaf00afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700d69dd69d 569d000700d69dd69d569d56f6af016464faaf0e00afaf00afafaf00afaf af00afaf00fcaf0300afaf00f9af0900af00af00af00afaf00fcaf0300af af00f9af0000bdaf01dfdffcaf016464f59501dfdff6af016464fcaf0000 fcaf0200af00fcaf0600afaf00afaf00fcaf0300afaf00f4af0000fcaf03 00afaf00fcaf0300afaf00fcaf0300afaf00f9af0000fcaf0000fcaf0000 fcaf0700afaf00afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700 d6d69d9d9d56000700d6d69d9d9d5656f6af016464fbaf0f0000afaf00af afaf00afafaf00afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00 afafaf00fcaf0b00afaf00afafaf00afafaf00bdaf01dfdffcaf016464f5 9501dfdff6af016464fcaf1a0000afaf0000af0000afaf0000afaf00afaf 0000afaf0000afaf00f4af360000afaf0000afaf0000afaf0000afaf0000 afaf0000afaf0000afaf0000afaf0000afaf0000af00afaf0000afaf0000 afaf00afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700d69dd69d 569d000700d69dd69d569d56f6af166464afafaf000000afafaf00afafaf 00afafaf00afaf00fcaf0300afafaffc00fcaf0800afafaf00afafaf00fc af0300afaf00fcaffd00bcaf01dfdffcaf016464f59501dfdff6af016464 fbaffc00fdaffc00fdaf0300afafaffc00fdaf0000f3affd0004af00afaf affc00fcaffd0004af00afafaffc00fcaffc0005afaf00afafaffc00fdaf 0400afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d 56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf016464f59501 dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af0700d69d d69d569d000700d69dd69d569d56f6af01646480af02afdfdffcaf016464 f59501dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af07 00d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf 016464f59501dfdff6af016464deaff80095af01dfdffcaf016464f59501 dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01646480af02 afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf016464 f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464 80af02afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf 016464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af 01646480af02afdfdffcaf016464f59501dfdff6af01646480afebaf01df dffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d56 56f6af01646480af02afdfdffcaf016464f59501dfdff6af01646480afeb af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd6 9d569d56f6af01646480af02afdfdffcaf016464f59501dfdff6af016464 80afebaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700 d6d69d9d9d5656f6af016464d0af0000caaf050000afaf0000ecaf01dfdf fcaf016464f59501dfdff6af016464edaf0000e8af010000d2af0000e6af 050000afaf0000e8af01dfdffcaf016464f59501dfdff5af0700d69dd69d 569d000700d69dd69d569d56f6af016464d0af0000d6af0000f6af0400af afaf00eaaf01dfdffcaf016464f59501dfdff6af016464edaf0000e9af00 00d0af0000e7af0400afafaf00e6af01dfdffcaf016464f59501dfdff5af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d1af0000d5af00 00f6af0400afafaf00eaaf01dfdffcaf016464f59501dfdff6af016464ed af0000e9af0000d0af0000e7af0400afafaf00e6af01dfdffcaf016464f5 9501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af1a6464af afaf000000afafaf00af0000afaf0000afafaf00af000000fcaffc0015af af00afafaf00afafaf00afafaf00afaf00af000000fcaffc000aafaf00af afaf00afafaf00f5affd0007afaf000000afaf00fcaffc0003af000000eb af01dfdffcaf016464f59501dfdff6af016464fbaffc00fdaffc00fdaf03 00afafaffc00fdaf0300af0000f8affd00fdaffc00fcaffc00fdaffc00f4 affc0002afaf00fcaf0900af00af000000afafaffc00f9affc0008afaf00 0000af000000e7af01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d 56000700d6d69d9d9d5656f6af016464fbaf440000afaf0000afaf0000af af00afaf0000afaf0000afaf0000afaf0000af00afafaf00afafaf00afaf af00afaf0000afaf0000afaf0000afaf0000af00afafaf00afafaf00f6af 0b00afafaf00afaf00afafaf00fcaf0600af00afafaf00eaaf01dfdffcaf 016464f59501dfdff6af016464fcaf1b0000afaf0000af0000afaf0000af af00afaf0000afaf0000afaf0000f5af1800afafaf0000afaf0000afaf00 00afaf0000af0000afaf0000f6af070000afaf0000af00fcaf0e00af0000 afaf0000af0000afaf0000fbaf0c0000afaf0000afaf00afafaf00e6af01 dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd69d56 9d56f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300af af00fcaf1100af00afafaf00afafaf00afaf00afafaf00fcaf0300afaf00 fcaf0a00af00afafaf00afafaf00f6af010000fbaf0400afafaf00fcaf06 00af00afafaf00eaaf01dfdffcaf016464f59501dfdff6af016464fcaf00 00faaf0000fcaf0600afaf00afaf00fcaf0300afaf00f4af0000f8af0300 afaf00faaf0000fcaf0000f6af0000faaf0000fcaf0200af00fcaf0200af 00fcaf0000fbaf0000fcaf0700afaf00afafaf00e6af01dfdffcaf016464 f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464 faaf0e00afaf00afafaf00afafaf00afaf00fcaf0200afaffa0010afaf00 afaf00afaf00afafaf00afafaf00fcaf0200afaffa0008afaf00afaf00af af00f4affd00fdaf0400afafaf00fcaf0600af00afafaf00eaaf01dfdffc af016464f3dff6af016464fcaf0000faaf0000fcaf0600afaf00afaf00fc af0300afaf00f4af0000fcaffb0002afaf00faaffa00f6af0000faaf0000 fcaf0200af00fcaf0100affa00fbaf0000fcaf0700afaf00afafaf00e6af 01dfdffcaf016464f3dff5af0700d69dd69d569d000700d69dd69d569d56 f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00 f9af0e00afaf00afaf00afafaf00afafaf00fcaf0300afaf00f9af0600af af00afaf00f2af080000afaf00afafaf00fcaf0600af00afafaf00eaaf01 dfdffcaf016464f7df036464dfdff6af016464fcaf0000faaf0000fcaf06 00afaf00afaf00fcaf0300afaf00f4af0c00afafaf0000afafaf00afaf00 faaf0000f1af0000faaf0000fcaf0200af00fcaf0200af00f6af0000fcaf 0700afaf00afafaf00e6af01dfdffcaf016464f7df036464dfdff5af0700 d6d69d9d9d56000700d6d69d9d9d5656f6af016464faaf0e00afaf00afaf af00afafaf00afaf00fcaf0300afaf00f9af0900af00af00af00afaf00fc af0000fcaf0300afaf00f9af0600af00af00af00f1af0700afaf00afafaf 00fcaf0600af00afafaf00eaaf01dfdffcaf04646495dfdffbaf04646495 dfdff6af016464fcaf0000fcaf0200af00fcaf0600afaf00afaf00fcaf03 00afaf00f4af0400afafaf00fcaf0300afaf00fcaf0200af00f1af0000fc af0200af00fcaf0200af00fcaf0200af00f6af0000fcaf0700afaf00afaf af00e6af01dfdffcaf04646495dfdffbaf04646495dfdff5af0700d69dd6 9d569d000700d69dd69d569d56f6af016464fbaf0f0000afaf00afafaf00 afafaf00afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00afafaf 00fcaf0000fcaf1000afaf0000afaf0000afafaf00afafaf00f4af1600af afaf00afaf00afafaf0000afaf0000af00afafaf00eaaf01dfdffcaf0464 6495dfdffbaf04646495dfdff6af016464fcaf1a0000afaf0000af0000af af0000afaf00afaf0000afaf0000afaf00f4af1800afafaf0000afaf0000 afaf0000afaf0000af0000afaf0000f6af2c0000afaf0000af0000afaf00 00af0000afaf0000af0000afaf0000afaf00afaf0000afaf0000afaf00af afaf00e6af01dfdffcaf04646495dfdffbaf04646495dfdff5af0700d6d6 9d9d9d56000700d6d69d9d9d5656f6af166464afafaf000000afafaf00af afaf00afafaf00afaf00fcaf0300afafaffc00fcaf0800afafaf00afafaf 00fcaf0000fcaf0300afafaffc00fcaf0400afafaf00f3affd00fcaf0e00 00afaf000000af00af00afafaf00eaaf01dfdffcaf0e64649595dfdfafaf af64649595dfdff6af016464fbaffc00fdaffc00fdaf0300afafaffc00fd af0000f4af0000fcaffd0004af0000afaffc00fdaffc00f4affc00fdaffd 000aaf00af00af000000afafaffc00fdaf0300afafaffc00fdaf0400afaf af00e6af01dfdffcaf0e64649595dfdfafafaf64649595dfdff5af0700d6 9dd69d569d000700d69dd69d569d56f6af01646480af02afdfdffcaf0e64 649595dfdfafafaf64649595dfdff6af01646480afebaf01dfdffcaf0e64 649595dfdfafafaf64649595dfdff5af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af01646480af02afdfdffcaf0e6464959595dfdfaf64649595 95dfdff6af01646480afebaf01dfdffcaf0e6464959595dfdfaf64649595 95dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464b5af f800d2af01dfdffcaf0e6464959595dfdfaf6464959595dfdff6af016464 deaff800e5aff800b8af01dfdffcaf0e6464959595dfdfaf6464959595df dff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02af dfdffcaf016464fc9502df6464fc9501dfdff6af01646480afebaf01dfdf fcaf016464fc9502df6464fc9501dfdff5af0700d69dd69d569d000700d6 9dd69d569d56f6af01646480af02afdfdffcaf016464fc9502df6464fc95 01dfdff6af01646480afebaf01dfdffcaf016464fc9502df6464fc9501df dff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02af dfdffcaf016464fb950064fb9501dfdff6af01646480afebaf01dfdffcaf 016464fb950064fb9501dfdff5af0700d69dd69d569d000700d69dd69d56 9d56f6af01646480dffddffcaf016464f3dff6af01646480dfe9dffcaf01 6464f3dff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af006480df fcdffcaf0064f2dff6af006480dfe8dffcaf0064f2dff5af0700d69dd69d 569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6 d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d56 80af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf 0700d69dd69d569d000700d69dd69d569d56f6af8064fb64e3af8064e764 e2af0700d6d69d9d9d56000700d6d69d9d9d5656f6af8064fc6400dfe3af 8064e86400dfe2af0700d69dd69d569d000700d69dd69d569d56f6af0164 64f79501dfdfcc95cadf0295dfdff79501dfdfe3af016464f79501dfdfbd 95c5df0295dfdff79501dfdfe2af0700d6d69d9d9d56000700d6d69d9d9d 5656f6af016464f995fddf0064cc95cbdf016495fcdff99501dfdfe3af01 6464f995fddf0064bd95c6df016495fcdff99501dfdfe2af0700d69dd69d 569d000700d69dd69d569d56f6af016464fb95fcdf016464cc9501dfdfce af02646495fadffb9501dfdfe3af016464fb95fcdf016464bd9501dfdfc9 af02646495fadffb9501dfdfe2af0700d6d69d9d9d56000700d6d69d9d9d 5656f6af046464959595fcdf03afaf6464cc9501dfdfceaf06646495dfdf afaffcdffd9501dfdfe3af046464959595fcdf03afaf6464bd9501dfdfc9 af06646495dfdfafaffcdffd9501dfdfe2af0700d69dd69d569d000700d6 9dd69d569d56f6af02646495fcdffcaf016464cc9501dfdfceaf04646495 dfdffcaffcdf0295dfdfe3af02646495fcdffcaf016464bd9501dfdfc9af 04646495dfdffcaffcdf0295dfdfe2af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af046464dfdfdffaaf016464cc9501dfdfceaf04646495dfdf faaffd6401dfdfe3af046464dfdfdffaaf016464bd9501dfdfc9af046464 95dfdffaaffd6401dfdfe2af0700d69dd69d569d000700d69dd69d569d56 f6af02646495fc64fcaf016464cc9501dfdfceaf04646495dfdffcaffc64 0295dfdfe3af02646495fc64fcaf016464bd9501dfdfc9af04646495dfdf fcaffc640295dfdfe2af0700d6d69d9d9d56000700d6d69d9d9d5656f6af 046464959595fc6403afaf6464cc9501dfdfceaf06646495dfdfafaffc64 fd9501dfdfe3af046464959595fc6403afaf6464bd9501dfdfc9af066464 95dfdfafaffc64fd9501dfdfe2af0700d69dd69d569d000700d69dd69d56 9d56f6af016464fb95fa64cc9501dfdfceaf04646495dfdffc64fb9501df dfe3af016464fb95fa64bd9501dfdfc9af04646495dfdffc64fb9501dfdf e2af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464f995fc64cc 9501dfdfcc640495df646464f99501dfdfe3af016464f995fc64bd9501df dfc7640495df646464f99501dfdfe2af0700d69dd69d569d000700d69dd6 9d569d56f6af016464f795016464cc9500dfcb640295df64f79501dfdfe3 af016464f795016464bd9500dfc6640295df64f79501dfdfe2af0700d6d6 9d9d9d56000700d6d69d9d9d5656f6af01646480dffddfe3af01646480df e9dfe2af0700d69dd69d569d000700d69dd69d569d56f6af006480dffcdf e3af006480dfe8dfe2af0700d6d69d9d9d56000700d6d69d9d9d565680af 80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700 d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d 000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d 9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af 80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700 d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56 000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd6 9d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d5656f6af 80df80dfb1dff6af0700d69dd69d569d000700d69dd69d569d56f6af80df 80dfb2df0064f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01df df80af80afb5af016464f6af0700d69dd69d569d000700d69dd69d569d56 f6af01dfdf80af80afb5af016464f6af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af01dfdf80af80afb5af016464f6af0700d69dd69d569d0007 00d69dd69d569d56f6af01dfdf80af80afb5af016464f6af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af01dfdf80af80afb5af016464f6af0700 d69dd69d569d000700d69dd69d569d56f6af01dfdf80af80afb5af016464 f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdf80af80afb5 af016464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdf80 af80afb5af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af 01dfdf80af80afb5af016464f6af0700d69dd69d569d000700d69dd69d56 9d56f6af01dfdfd8af80dfc6df97af016464f6af0700d6d69d9d9d560007 00d6d69d9d9d5656f6af01dfdfd8af80dfc7df006497af016464f6af0700 d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af01dfdf80afcaaf 01646497af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af 01dfdfd8af01dfdf80afcaaf01646497af016464f6af0700d69dd69d569d 000700d69dd69d569d56f6af01dfdfd8af01dfdf80afcaaf01646497af01 6464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd8af01 dfdf80afcaaf01646497af016464f6af0700d69dd69d569d000700d69dd6 9d569d56f6af01dfdfd8af01dfdfd1affd00c9af0000b4af01646497af01 6464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd8af01 dfdfd3af060000afafaf0000cbaf0000b4af01646497af016464f6af0700 d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af01dfdfd3af0000 fbaf0000cbaf0000caaff2dff8af01646497af016464f6af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af01dfdfd8af01dfdfd4af0000f6affc00 fdaf1200af0000afaf0000afafaf00af0000afaf0000fcaffc00fdaf0400 af000000fcaffd0007af00afafaf000000d0aff3df0064f8af01646497af 016464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af 01dfdfd4af0000f7af3a0000afaf0000afaf0000afaf0000afaf00afaf00 00afaf0000afaf00afaf0000afaf0000afaf0000afaf0000afaf0000afaf 0000afaf00afafaf00d1af01dfdff6af016464f8af01646497af016464f6 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd8af01dfdfd4 af0000f7af0000fcaf1600afaf00afafaf00afafaf00afaf00afafaf00af afaf00f9af0300afaf00fcaf0300afaf00fcaf0400afaf0000ceaf01dfdf f6af016464f8af01646497af016464f6af0700d69dd69d569d000700d69d d69d569d56f6af01dfdfd8af01dfdfd4af0000f7af0000fcaf1900afaf00 afafaf00afafaf00afaf00afafaf00afafaf00afafaffb0002afaf00fcaf 0300afaf00fcaf0600afafaf000000d0af01dfdff6af016464f8af016464 97af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdf d8af01dfdfd4af0000f7af0000fcaf2100afaf00afafaf00afafaf00afaf 00afafaf00afafaf00afaf0000afafaf00afaf00fcaf0300afaf00fcaf00 00fbaf010000d1af01dfdff6af016464f8af01646497af016464f6af0700 d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af01dfdfd3af0000 fbaf0300afaf00fcaf1900afaf00afafaf00afafaf00afaf00afafaf00af afaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000faaf0000d1af 01dfdff464f8af01646497af016464f6af0700d6d69d9d9d56000700d6d6 9d9d9d5656f6af01dfdfd8af01dfdfd3af2f0000afafaf0000afaf0000af af0000afaf00afafaf00afafaf00afaf00afafaf00afafaf00afaf0000af af0000afaf00fcaf0f00afaf0000afaf0000afaf00afafaf00d1af00dff3 64f8af01646497af016464f6af0700d69dd69d569d000700d69dd69d569d 56f6af01dfdfd8af01dfdfd1affd00fbaffc00fdaf1e00afafaf00afafaf 00afaf00afafaf00afafaf00afafaf000000af0000af00fcaf0e00afafaf 000000af00afafaf000000baaf01646497af016464f6af0700d6d69d9d9d 56000700d6d69d9d9d5656f6af01dfdfd8af01dfdf80afcaaf01646497af 016464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af 01dfdf80afcaaf01646497af016464f6af0700d6d69d9d9d56000700d6d6 9d9d9d5656f6af01dfdfd8af01dfdf80afcaaf01646497af016464f6af07 00d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af01dfdf80afca af01646497af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6 af01dfdfd8af01dfdf80afcaaf01646497af016464f6af0700d69dd69d56 9d000700d69dd69d569d56f6af01dfdfd8af01dfdf8064c86497af016464 f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd8af00df80 64c76497af016464f6af0700d69dd69d569d000700d69dd69d569d56f6af 01dfdf80af80afb5af016464f6af0700d6d69d9d9d56000700d6d69d9d9d 5656f6af01dfdf80af80afb5af016464f6af0700d69dd69d569d000700d6 9dd69d569d56f6af01dfdf80af80afb5af016464f6af0700d6d69d9d9d56 000700d6d69d9d9d5656f6af01dfdf80af80afb5af016464f6af0700d69d d69d569d000700d69dd69d569d56f6af01dfdf80af80afb5af016464f6af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdf80af80afb5af01 6464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdf80af80 afb5af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01df df80af80afb5af016464f6af0700d69dd69d569d000700d69dd69d569d56 f6af01dfdfa8af8064c164ccaf016464f6af0700d6d69d9d9d56000700d6 d69d9d9d5656f6af01dfdfa8af8064c26400dfccaf016464f6af0700d69d d69d569d000700d69dd69d569d56f6af01dfdfa8af01646480afc5af01df dfccaf016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01df dfa8af01646480afc5af01dfdfccaf016464f6af0700d69dd69d569d0007 00d69dd69d569d56f6af01dfdfa8af01646480afc5af01dfdfccaf016464 f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfa8af016464 80afc5af01dfdfccaf016464f6af0700d69dd69d569d000700d69dd69d56 9d56f6af01dfdfa8af01646480afc5af01dfdfccaf016464f6af0700d6d6 9d9d9d56000700d6d69d9d9d5656f6af01dfdfa8af01646480afc5af01df dfccaf016464f6af0700d69dd69d569d000700d69dd69d569d56f6af01df dfa8af01646480afc5af01dfdfccaf016464f6af0700d6d69d9d9d560007 00d6d69d9d9d5656f6af01dfdfd7aff900d8af016464fbaf0000fbaf0000 fbaf0000f2af0000f9af000080afeeaf01dfdfccaf016464f6af0700d69d d69d569d000700d69dd69d569d56f6af01dfdfd7af0000d2af016464fbaf 0000fbaf0000fbaf0000f2af0000f9af000080afeeaf01dfdfccaf016464 f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd7af0000d2 af016464fbaf0000fcaf0200af00fcaf0000f2af0000f9af000080afeeaf 01dfdfccaf016464f6af0700d69dd69d569d000700d69dd69d569d56f6af 01dfdfd7af0000f8affc00fdaf0500af0000af00e7af016464faaf0d00af afaf00af00afafaf00afafaffc00fdaf0d00af0000af00afafaf000000af 0080afeeaf01dfdfccaf016464f6af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af01dfdfd7af0000f9af0d0000afaf0000afaf0000afafaf00e7 af016464faaf2200afafaf00af00afafaf00afaf0000afaf0000afaf0000 afafaf00afaf0000afaf000080afeeaf01dfdfccaf016464f6af0700d69d d69d569d000700d69dd69d569d56f6af01dfdfd7affa0002afaf00fcaf03 00afaf00e2af016464faaf0d00afafaf00af00afafaf00afaf00fcaf0300 afaf00fcaf0300afaf00fcaf000080afeeaf01dfdfccaf016464f6af0700 d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd7af0000f9af0000fc af0300afaf00e2af016464f9af0c00af00afafaf00af00afafaf00fcaf03 00afaf00fcaf0300afaf00fcaf000080afeeaf01dfdfccaf016464f6af07 00d69dd69d569d000700d69dd69d569d56f6af01dfdfd7af0000f9af0000 fcaf0300afaf00e2af016464f9af0c00af00afafaf00af00afafaf00fcaf 0300afaf00fcaf0300afaf00fcaf000080afeeaf01dfdfccaf016464f6af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd7af0000f9af00 00fcaf0300afaf00e2af016464f9af0c00af00afafaf00af00afafaf00fc af0300afaf00fcaf0300afaf00fcaf000080afeeaf01dfdfccaf016464f6 af0700d69dd69d569d000700d69dd69d569d56f6af01dfdfd7af0000f9af 080000afaf0000afaf00fcaf0000e7af016464f8af0000fbaf0000fcaf08 0000afaf0000afaf00fcaf0800afaf0000afaf000080afeeaf01dfdfccaf 016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd7af 0000f8affc00fdaf0000fcaf0000e7af016464f8af0000fbaf0000fbaffc 00fdaf0000fcaf0800afafaf000000af0080afeeaf01dfdfccaf016464f6 af0700d69dd69d569d000700d69dd69d569d56f6af01dfdfa8af01646480 afc5af01dfdfccaf016464f6af0700d6d69d9d9d56000700d6d69d9d9d56 56f6af01dfdfa8af01646480afc5af01dfdfccaf016464f6af0700d69dd6 9d569d000700d69dd69d569d56f6af01dfdfa8af01646480afc5af01dfdf ccaf016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdf a8af01646480afc5af01dfdfccaf016464f6af0700d69dd69d569d000700 d69dd69d569d56f6af01dfdfa8af01646480afc5af01dfdfccaf016464f6 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfa8af01646480 afc5af01dfdfccaf016464f6af0700d69dd69d569d000700d69dd69d569d 56f6af01dfdfa8af01646480afc5af01dfdfccaf016464f6af0700d6d69d 9d9d56000700d6d69d9d9d5656f6af01dfdfa8af01646480afc5af01dfdf ccaf016464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdf a8af01646480afc5af01dfdfccaf016464f6af0700d6d69d9d9d56000700 d6d69d9d9d5656f6af01dfdfa8af01646480afc5af01dfdfccaf016464f6 af0700d69dd69d569d000700d69dd69d569d56f6af01dfdfa8af01646480 dfc3dfccaf016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af 01dfdfa8af006480dfc2dfccaf016464f6af0700d69dd69d569d000700d6 9dd69d569d56f6af01dfdf80af80afb5af016464f6af0700d6d69d9d9d56 000700d6d69d9d9d5656f6af01dfdf80af80afb5af016464f6af0700d69d d69d569d000700d69dd69d569d56f6af01dfdf80af80afb5af016464f6af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdf80af80afb5af01 6464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdf80af80 afb5af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01df df80af80afb5af016464f6af0700d69dd69d569d000700d69dd69d569d56 f6af01dfdf80af80afb5af016464f6af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af01dfdf80af80afb5af016464f6af0700d69dd69d569d0007 00d69dd69d569d56f6af01dfdf80648064b364f6af0700d6d69d9d9d5600 0700d6d69d9d9d5656f6af00df80648064b264f6af0700d69dd69d569d00 0700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d 9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80 af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d6 9dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d5600 0700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d 569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80 af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6 d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d00 0700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d 9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80 af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d6 9dd69d569d000700d69dd69d569d56f1affd00f4af0000ebaf000080af80 afd2af0700d6d69d9d9d56000700d6d69d9d9d5656f3af060000afafaf00 00f6af0000efaf0400afafaf0080af80afd2af0700d69dd69d569d000700 d69dd69d569d56f3af0000fbaf0000f6af0000efaf000080af80afceaf07 00d6d69d9d9d56000700d6d69d9d9d5656f3af0000f7affc00fdaf0300af afaffc00fcaffc0009af000000afaf00afafaffc00fdaf0400af00000080 af80afe1af0700d69dd69d569d000700d69dd69d569d56f2af010000faaf 2e0000afaf0000afaf00afaf0000afaf0000afaf0000afaf0000af00afaf af00afaf0000afaf0000afaf0000afaf000080af80afe2af0700d6d69d9d 9d56000700d6d69d9d9d5656f0af010000fcaf0000fcaf0600afaf00afaf 00fcaf0300afaf00faaf0700afafaf00afaf00fcaf0300afaf00fcaf0000 80af80afe2af0700d69dd69d569d000700d69dd69d569d56eeaf030000af affa0004afaf00afaffa0002afaf00faaf0700afafaf00afaf00fcaf0300 afaf00fcaf000080af80afe2af0700d6d69d9d9d56000700d6d69d9d9d56 56edaf0300afaf00f9af0300afaf00f9af0000faaf0700afafaf00afaf00 fcaf0300afaf00fcaf000080af80afe2af0700d69dd69d569d000700d69d d69d569d56f3af0000fbaf0300afaf00f9af0300afaf00f9af0000fcaf09 00af00afafaf00afaf00fcaf0300afaf00fcaf000080af80afe2af0700d6 d69d9d9d56000700d6d69d9d9d5656f3af320000afafaf0000afaf0000af af0000afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00afaf 0000afaf0000afaf00fcaf000080af80afe2af0700d69dd69d569d000700 d69dd69d569d56f1affd00fbaffc00fdaf0300afafaffc00fcaffc00fdaf 060000af00afafaffc00fdaf0000fcaf000080af80afe2af0700d6d69d9d 9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d6 9dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d5656 80af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf 0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d 569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6 d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d56 f4af80648064b564f4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af 80648064b66400dff4af0700d69dd69d569d000700d69dd69d569d56f4af 01646480af80afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d 5656f4af01646480af80afb9af01dfdff4af0700d69dd69d569d000700d6 9dd69d569d56f4af01646480af80afb9af01dfdff4af0700d6d69d9d9d56 000700d6d69d9d9d5656f4af01646480af80afb9af01dfdff4af0700d69d d69d569d000700d69dd69d569d56f4af01646480af80afb9af01dfdff4af 0700d6d69d9d9d56000700d6d69d9d9d5656f4af01646480af80afb9af01 dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af01646480af80 afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af0164 64f8af0000e7af0000fcaf0000d8af0000faaf0000e8af0000c0af000080 afebaf01dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af0164 64f8af0000e7af0000fcaf0000d8af0000faaf0000f6af0000f3af0000c0 af000080afebaf01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656 f4af016464f9af0000e6af0400afafaf00d8af0000f9af0000f6af0000f4 af0000c0af000080afeaaf01dfdff4af0700d69dd69d569d000700d69dd6 9d569d56f4af016464f9af0300afaf00fcaf1e00afaf000000afafaf00af 0000afaf000000af00afafaf00afaf00af000000fcaffd0009af00afaf00 af0000afaffc00fdaf0400af000000fcaf0b00afafaf000000af00afafaf fc0007afaf000000afafaffc00fcaf0b00afafaf000000af00afafaffc00 fcaffc00fdaf0f00af0000afaf0000afafaf00af000000fcaffc000eafaf 00afafaf00afafaf00afafaf0080afeaaf01dfdff4af0700d6d69d9d9d56 000700d6d69d9d9d5656f4af016464f9af0300afaf00fcaf7f00af00afaf af00afaf0000afafaf0000afaf0000afafaf00afaf0000afaf0000afaf00 00afaf0000afaf0000afafaf0000afaf0000afaf0000afaf0000afafaf00 afaf0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000afaf af00afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000 afaf002100afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00 afafaf00afafaf0080afeaaf01dfdff4af0700d69dd69d569d000700d69d d69d569d56f4af016464faaf0400afafaf00fcaf0300af0000fbaf0000fc af0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00f7af 0300afaf00fcaf0700afaf00afafaf00fcaf0000f9af0300afaf00f8af07 00afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf0e00afaf00af afaf00afafaf00afaf00fcaf0300afaf00fcaf0d00af00afafaf00afafaf 00afaf0080afe9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d56 56f4af016464faaf0400afafaf00fcaf0900afaf000000afafaf00fcaf00 00fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fbaffb00 02afaf00fcaf0700afaf00afafaf00fcaf0300afafaffb0002afaf00fcaf fb0006afaf00afafaf00fcaf0200afaffa0002afaf00fcaf0e00afaf00af afaf00afafaf00afaf00fcaf0200afaffa000cafaf00afaf00afaf00afaf af0080afe9af01dfdff4af0700d69dd69d569d000700d69dd69d569d56f4 af016464faaf0400afafaf00fcaf0000fcaf040000afaf00fcaf0000fcaf 0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf080000afaf af00afaf00fcaf0700afaf00afafaf00fcaf1b00afaf0000afafaf00afaf 00afafaf0000afafaf00afaf00afafaf00fcaf0300afaf00f9af0000fcaf 0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af0a00afaf00 afaf00afafaf0080afe9af01dfdff4af0700d6d69d9d9d56000700d6d69d 9d9d5656f4af016464fbaf0000fcaf0000fcaf0000fbaf0300afaf00fcaf 0000fcaf0200af00fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0000 fcaf0300afaf00fcaf0200af00fcaf0000fcaf0300afaf00fcaf0700afaf 00afafaf00fcaf0200af00fcaf0000fcaf0300afaf00f9af0000fcaf0e00 afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af0900af00af00af 00afaf0080afe8af01dfdff4af0700d69dd69d569d000700d69dd69d569d 56f4af016464fbaf0000fcaf0e0000afaf0000af00afafaf00afaf00fcaf 070000afaf0000af00fcaf0000fcaf0b00afaf0000afaf0000afaf00fcaf 0f0000afaf0000afaf0000afaf0000af00fcaf1b0000afaf0000afaf0000 afaf0000afaf00afafaf0000afaf0000af00fcaf230000afaf0000afaf00 00afaf0000afaf0000afaf0000afaf00afafaf00afafaf00afaf00fcaf14 00afaf0000afaf0000afafaf00afafaf00afafaf0080afe8af01dfdff4af 0700d6d69d9d9d56000700d6d69d9d9d5656f4af016464fbaf0000fbaffd 000aaf00afaf000000afafaf00fbaffd0003af00af00fcaf0000fcaf0b00 afafaf000000af00afaf00fbaffd000baf0000af00af000000afaf00fbaf fd0017af00afafaf000000af0000afaf0000afaf000000af000000fbaffd 0004af00afafaffc00fcaffc00fdaf0b00afafaf00afafaf00afaf00fcaf 0300afafaffc00fcaf0800afafaf00afafaf0080afe8af01dfdff4af0700 d69dd69d569d000700d69dd69d569d56f4af016464caaf0000f1af0000d0 af0000c5af000080afedaf01dfdff4af0700d6d69d9d9d56000700d6d69d 9d9d5656f4af016464cfaf050000afaf0000f1af0000d5af050000afaf00 00c6affd0080afeeaf01dfdff4af0700d69dd69d569d000700d69dd69d56 9d56f4af016464ceaffc00f0af0000d4affc00c6af040000af000080afef af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af01646480 afd0af060000afafaf000080aff0af01dfdff4af0700d69dd69d569d0007 00d69dd69d569d56f4af01646480afd1af010000fbaf01000080aff1af01 dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af01646480af80 afb9af01dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af0164 6480af80afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656 f4af01646480af80afb9af01dfdff4af0700d69dd69d569d000700d69dd6 9d569d56f4af01646480df80dfb7dff4af0700d6d69d9d9d56000700d6d6 9d9d9d5656f4af006480df80dfb6dff4af0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680 af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf07 00d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d56 9d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d6 9d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680 af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf07 00d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d 56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680 af80af9daf0700d69dd69d569d000700d69dd69d569d56806480649d6407 00d6d69d9d9d56000700d6d69d9d9d565680df80df9ddf0700d69dd69d56 9d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d6 9d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680 af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf07 00d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d 56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680 af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf07 00d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d56 9d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d6 9d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680 af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf07 00d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d 56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680 af80af9daf0700d69dd69d569d000700d69dd69d569d56eeafd5dfa1afd5 dfa1afd5dfeeaf0700d6d69d9d9d56000700d6d69d9d9d5656eeafd6df00 64a1afd6df0064a1afd6df0064eeaf0700d69dd69d569d000700d69dd69d 569d56eeaf01dfdfd9af016464a1af01dfdfd9af016464a1af01dfdfd9af 016464eeaf0700d6d69d9d9d56000700d6d69d9d9d5656eeaf01dfdfd9af 016464a1af01dfdfd9af016464a1af01dfdfd9af016464eeaf0700d69dd6 9d569d000700d69dd69d569d56eeaf01dfdfd9af016464a1af01dfdfd9af 016464a1af01dfdfd9af016464eeaf0700d6d69d9d9d56000700d6d69d9d 9d5656eeaf01dfdfd9af016464a1af01dfdfd9af016464a1af01dfdfd9af 016464eeaf0700d69dd69d569d000700d69dd69d569d56eeaf01dfdfd9af 016464a1af01dfdfd9af016464a1af01dfdfd9af016464eeaf0700d6d69d 9d9d56000700d6d69d9d9d5656eeaf01dfdfd9af016464a1af01dfdfd9af 016464a1af01dfdfd9af016464eeaf0700d69dd69d569d000700d69dd69d 569d56eeaf01dfdff3affd00fbaf0000fbaf0000f5af016464a1af01dfdf fbaff90004af00afaf00eaaf016464a1af01dfdffaaf0000faaf0300afaf 00f9af0000f2af016464eeaf0700d6d69d9d9d56000700d6d69d9d9d5656 eeaf01dfdff5af0a0000afafaf0000afafaf00fcaf0000f4af016464a1af 01dfdffbaf0000f9af0600afaf00afaf00edaf016464a1af01dfdffaaf00 00faaf0300afaf00f9af0000f2af016464eeaf0700d69dd69d569d000700 d69dd69d569d56eeaf01dfdff5af0000fbaf0800afafaf00afafaf00f3af 016464a1af01dfdffbaf0000f6af0300afaf00edaf016464a1af01dfdffa af0000faaf0000f6af0000f2af016464eeaf0700d6d69d9d9d56000700d6 d69d9d9d5656eeaf01dfdff6af0000f9af0600afaf00afaf00f2af016464 a1af01dfdffbaf0000f9af0a00afaf00af000000afafaffc00fdaf0300af 0000fcaf016464a1af01dfdffaaf0000faaf0e00afaf00afafaf000000af 00afafaffc00f9af016464eeaf0700d69dd69d569d000700d69dd69d569d 56eeaf01dfdff6af0000f9af0500afaf00af00f1af016464a1af01dfdffb af0000f9af1300afaf00afaf00afafaf0000afaf0000afaf0000faaf0164 64a1af01dfdffaaf0000faaf1300afaf00afaf0000afaf0000afaf0000af af0000faaf016464eeaf0700d6d69d9d9d56000700d6d69d9d9d5656eeaf 01dfdff6af0000f9af0500afaf000000f1af016464a1af01dfdffbaffa00 0cafaf00afaf00afaf00afafaf00fcaf0300afaf00f9af016464a1af01df dffaaff80005afaf00afaf00fcaf0300afaf00fcaf0000faaf016464eeaf 0700d69dd69d569d000700d69dd69d569d56eeaf01dfdff6af0000f9af06 00afaf00afaf00f2af016464a1af01dfdffbaf0000f9af0900afaf00afaf 00afafaffa0002afaf00f9af016464a1af01dfdffaaf0000faaf0600afaf 00afaf00fcaf0200afaffa00faaf016464eeaf0700d6d69d9d9d56000700 d6d69d9d9d5656eeaf01dfdff6af0000f9af0700afaf00afafaf00f3af01 6464a1af01dfdffbaf0000f9af0a00afaf00afaf00afafaf00f9af0000f9 af016464a1af01dfdffaaf0000faaf0600afaf00afaf00fcaf0300afaf00 f5af016464eeaf0700d69dd69d569d000700d69dd69d569d56eeaf01dfdf f5af0000fbaf0400afafaf00fcaf0000f4af016464a1af01dfdffbaf0000 f9af0a00afaf00afaf00afafaf00f9af0000f9af016464a1af01dfdffaaf 0000faaf0600afaf00afaf00fcaf0300afaf00f5af016464eeaf0700d6d6 9d9d9d56000700d6d69d9d9d5656eeaf01dfdff5af0a0000afafaf0000af afaf00fbaf0000f5af016464a1af01dfdffbaf0000f9af1200afaf00afaf 00afafaf0000afaf0000afaf00f9af016464a1af01dfdffaaf0000faaf13 00afaf00afaf0000afaf0000afaf0000afaf0000faaf016464eeaf0700d6 9dd69d569d000700d69dd69d569d56eeaf01dfdff3affd00fbaf0000faaf 0000f6af016464a1af01dfdffbaf0000f9af0a00afaf00afafaf0000afaf fc00fdaf0000f9af016464a1af01dfdffaaf0000faaf0e00afaf00afafaf 000000af00afafaffc00f9af016464eeaf0700d6d69d9d9d56000700d6d6 9d9d9d5656eeaf01dfdfd9af016464a1af01dfdfd9af016464a1af01dfdf d9af016464eeaf0700d69dd69d569d000700569d569d569d56eeaf01dfdf d9af016464a1af01dfdfd9af016464a1af01dfdfd9af016464eeaf0700d6 d69d569d56000000fc56029d5656eeaf01dfdfd9af016464a1af01dfdfd9 af016464a1af01dfdfd9af016464eeaf0200d69dfc56ff000000fcd60256 9d56eeaf01dfdfd9af016464a1af01dfdfd9af016464a1af01dfdfd9af01 6464eeaf0000fad6ff000700d6d6d69d9d5656eeaf01dfdfd9af016464a1 af01dfdfd9af016464a1af01dfdfd9af016464eeaf0200d69dfcd6ff0007 00d69dd69d569d56eeaf01dfdfd9af016464a1af01dfdfd9af016464a1af 01dfdfd9af016464eeaf0700d6d69d9d9d56000700d6d69d9d9d5656eeaf 01dfdfd9af016464a1af01dfdfd9af016464a1af01dfdfd9af016464eeaf 0700d69dd69d569d000700d69dd69d569d56eeaf01dfdfd764a1af01dfdf d764a1af01dfdfd764eeaf0700d6d69d9d9d56000700d6d69d9d9d5656ee af00dfd664a1af00dfd664a1af00dfd664eeaf0700d69dd69d569d000700 d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d56 5680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9d af0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd6 9d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700 d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d 5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9d af0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d 9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700 d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d56 5680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9d af0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd6 9d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700 d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d 5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9d af0700d69dd69d569d000700d69dd69d569d56800080009c0006d6d69d9d 9d56000600d6d69d9d9d5680d680d69ad6059dd69d569d007f00d69dd69d 569dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd6729dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69d9d9d56000200d6d6e49d0156d6809d809dcf9d0156d6e49d0256 9d000300d69dd6e59d0256d6d6809d809dd19d035656d6d6e49d0156007f 00d6d69d569d569d569d569d569d569d569d569d569d569d569d569d569d 5656d6d6569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d7f569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d72569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d56d6d69d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d000100d6e25601d6d680568056cf5601d6d6 e356ff00800080008d00 grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.5/doc/figs/trefdodecinter.eps0000644000175000017500000047720712310162303015510 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: noname.ps %%Creator: pnmtops %%CreationDate: 12. Mär 17:51 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 194 263 418 499 %%HiResBoundingBox: 194.159947 263.393992 417.839964 498.599985 %%EndComments %%BeginProlog %%BeginPreview: 224 236 8 1416 % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff % ff2929296262626262626262626262a9292929292929292929292929626262626262626262626262 % 29292929292929292929292962626262626262626262626229292929292929292929292962626262 % 62626262626262622929292929292929292929296262626262626262626262622929292929292929 % 29292929626262626262626262626262292929292929292929292929626262626262626262626262 % 29292929292929292929292962626262626262626262626229292929292929292929292962626262 % 6262626262626262292929292929292929292929626262ff % ff2962626262626262626262626262a9626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262296262626262626262626262626262ff % ff2962a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262 % a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a962626262 % 6262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9 % a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262 % a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a962626262 % 6262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262ff % ff2962a9292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929292929292929292929292929292929296262ff % ff2962a96262626262626262626262a9626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626229626262 % 6262626262626262296262626262626262626262296262ff % ff2962a96262626262626262626262a9626262626262626262ffff62626262626262626262626262 % 62626262626262626262626262ffffff626262626262626262ff62ff62626262ff62626262626262 % 6262626262626262626262ff626262626262626262ff626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626229626262 % 6262626262626262296262626262626262ff62a9296262ff % ff2962a96262626262626262626262a962626262626262ff6262ff62626262626262626262626262 % 6262626262626262626262ff62ff6262626262626262626262ff6262626262ff6262626262626262 % 62626262626262626262626262626262626262626262ff6262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626229626262 % 6262626262626262296262626262626262ff62a9296262ff % ff2962a96262626262626262626262a962626262626262ff62626262ff62ff62ff62ff62ff62ff62 % 62ffffffff62ff626262ff62ff62626262ff62ff62ff62ff62ff62ff62ff62ff62ff62ff62ff62ff % 62ff62ff626262ff62ff62ff62ff62ffff62ff62ff62ff6262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626229626262 % 6262626262626262296262626262626262ff62a9296262ff % ff2962a9626262626262626262ff62a9626262626262ff6262626262ffff62ff62ff62ff62ffffff % 62ff6262ffffff626262ff62ff626262ff6262ff62ff6262ff62ff62ff6262ff62ffffff62ffff62 % ff6262ff626262ffff62ff62ffffff62ff62ff626262ff6262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626229626262 % 6262ff6262626262296262626262626262ff62a9296262ff % ff626262296262ffffffffffffff62a962626262626262ff62ff62ff62ff62ff62ff62ff62ff62ff % ff6262ff62ff62626262ff6262626262ff62ff62ff62ff62ff62ff62ff62ff62ff62ff62ff62ff62 % ff62ff62626262ff6262ff62ff62ff6262ff62ff6262ff6262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626229626262 % 62ffff6262626262296262626262626262ff62622929a9ff % ff6262622962626262626262626262a9626262626262626262626262626262626262626262626262 % 62626262626262626262ff6262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262ff626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626229626262 % 6262626262626262296262626262626262ff62622929a9ff % ff6262622962626262626262626262a9626262626262626262626262626262626262626262626262 % 6262626262626262626262ff62626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262ff62626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626229626262 % 6262626262626262296262626262626262ff62622929a9ff % ff6262622962626262626262626262a9626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626229626262 % 626262626262626229626262ffffffffffff62622929a9ff % ff62626262a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9 % 626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9 % a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262626262626262 % 62626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9 % 626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a962626262626262626262626229a9a9a9 % a9a9a9a9a9a9a9a92962626262626262626262622929a9ff % ffa9a962ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffff29a9a9ff % ff296262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa292929ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaa5555555555555555555555aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaa555555555555555555555555555555555555555555555555aaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaa665555555555555555555555555555555555555555555555555555555555aaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aa6666555555555555555555555522222222222255555555555555555555555555555555aaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa66 % 6666665555555522222222222222222222222222222222225555555555555555555555444444aaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa66666666 % 22222222222222222222222222222222222222222222222222222222222222554444444444444444 % 44aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa666666662222 % 22222222222222222222222222222222222222222222222222222222222222222244444444444444 % 4444aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa6666666666222222 % 22222222222222222222222222222222222222222222222222222222222222222222224444444444 % 44444444aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaffaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa66666666662222222222 % 22222222222222222222222222222222222222222222222222222222222222222222222222444444 % 4444444444aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaffaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaffaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa7766666622222222222222 % 22222222222222222222222222222222222222222222222222222222222222222222222222224444 % 44444444444444aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaffaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaffaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa776666222222222222222222 % 22222222222222222222222222222222222222222222222222222222222222222222222222222222 % 4444444444444444aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaffaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaffaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa77772222222222222222222222 % 2222222222222222222222222222222222222222222222222222222222e6e6e6e6e6e62222222222 % 22224444444444444444aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaffaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaffaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaa7777222222222222222222222222 % 22222222222222222222555555555555666666662222222222e6e6e6e6e6e6e6e6e6e6e6e6e6e622 % 2222224444444444444444aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaffaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaffaaffaaaaaaaaaaaaaaaaaaaaaaaaaa777722222222222222222222222222 % 222222555555555555555555555555556666666666e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6222244444444444444aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaffaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaa77772222222222222222222222222222 % 2244445555555555555555555555555566e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e62211444444444444aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaa7777222222222222222222222222222244 % 444444445555555555555555e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6111111444444444444aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffffaaaaaaaaaaaaaaaaaa777722222222222222222222222222444444 % 4444444455555555e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6111111444444444444e6e6aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaffffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaa77772222222222222222222222224444444444 % 44444444e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e61111444444444444e6e6e6e6e6e6e6aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaa7777222222222222222222222244444444444444 % 4444e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e61111444444444444e6e6e6e6e6e6e6e6e6e6e6aaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaffaaaa777722222222222222222222444444444444444444 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6111111444444444444e6e6e6e6e6e6e6e6e6e6e6e6aaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaffaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaff7777222222222222222222224444444444444444e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6111111444444444444e6e6e6e6e6e6e6e6e6e6e6aaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaffaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaa77222222222222222222224444444444444444e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e61111114444444444e6e6e6e6e6e6e6e6e6e6e6e6aaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaffaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaa772222222222222222222244444444444444e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e61111444444444444e6e6e6e6e6e6e6e6e6e6e6e6aaaaaaaaaaaaaaaaaa % aaaaaaaaffaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaa7711222222222222222244444444444444e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e61111444444443333e6e6e6e6e6e6e6e6e6e6e6e6aaaaaaaaaaaaaaaa % aaaaaaffaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaa77111111222222222222444444444444e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e611114433333333e6e6e6e6e6e6e6e6e6e6e6e6aaaaaaaaaaaaaaaa % aaaaffaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaa771111112222222222444444444444e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e61100333333e6e6e6e6e6e6e6e6e6e6e6e6e6e6aaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaa771111111111222222224444444444e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6003333e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6ffffffffffff % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaa771111111111112222444444444444e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e633e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6aaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaa771111111111111111444444444444e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6aaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaa771111111111111111444444444444e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6aaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaa7711111111111111114444444444e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6aaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaff771111111111111111444444444444e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6aaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaff7711111111111111114444444444e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6aaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaff11111111111111114444444444e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6aa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaff11111111111111114444444444e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6aa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaa77111111111111114444444444e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaa77111111111111114444444444e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaa000000111111111144444444e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaa0000000011111144444444e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6aaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaa0000000000001144444444e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e611aaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaa7700000000000044444444e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e611aaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaa77000000000000444444e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e61177aaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaa770000000000004444e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e61177aaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaa000000000000004444e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e61111aaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaa0000000000000044e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e61177aaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaa7700000000000000e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e611aaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaa7700000000000044e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e61111aaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaa77000000000000e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e61177aaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaa770000000000e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6b8b8e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e611aaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaa000000000000e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6b8b8b8b8e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e61111aaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaa0000000000e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6b8b8b8b8b8b8b8b8e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e61177ffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaa00000000e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6b8b8b8b8b8b8b8b8b8b8e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e611ffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaa77000000e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e611ffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaa770000e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e622aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaa7700e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e677aaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaa00e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e677aaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaf4e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e877aaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaa00f4e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e82277aaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaa00f4e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e82277aaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaa00f4f4e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e8e82277aaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaa774444f4e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e8e8e8227777aaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaa77444444e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e8e822222277aaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaa4444444400e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6e8e8e822222277aaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaa444444440000f4e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6e8e8e8e822222277aaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaa44444444000000f4e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e6e8e8e8e8e82222222277aaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaa444444440000000000f4e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e6e8e8e8e8e8222222222277aaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaa44444444440000000000f4f4e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e6e8e8e8e8e822222222222277aaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaa4444444400000000000000f4f4e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e6e8e8e8e8e8e822222222222277aaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaa4444444400000000000000f4f4f4e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e6e8e8e8e8e8e8222222222222227777aaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaa44444444000000000000000000f4f4f4e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e8e8e8e8e8e8e8222222222222227777aaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaa44444444000000000000000000f4f4f4e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e6e8e8e8e8e8e877222222222222227777aaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaa4444444400000000000000000055f4f4f4e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6e6e6 % e6e8e8e8e8e8e8e877222222222222227777aaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaa444444440000000000000000000066f4f4f4f4e6e6e6e6e6e6e6e6e6e6e6e6b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e6e6 % e8e8e8e8e8e8e87777222222222222227777aaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaa444444440000000000000000006666f4f4f4f4f4e6e6e6e6e6e6e6e6e6e6b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e6e8 % e8e8e8e8e8e8777722222222222222227777aaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaa44444444000000000000000000666666f4f4f4f4e6e6e6e6e6e6e6e6e6b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e6e6e8 % e8e8e8e8e8e8777722222222222222227777aaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaa4444444400000000000000000000666666f4f4f4f4f4e6e6e6e6e6e6e6b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6e6e6e6e6e8e8 % e8e8e8e8e877777722222222222222227777aaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaa444444440000000000000000006666666666f4f4f4f4f4e6e6e6e6b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6e6e8e8e8 % e8e8e8e8e877777722222222222222227777aaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaa44444444440000000000000000006666666666f4f4f4f4f4f4e6b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6e8e8e8e8 % e8e8e8e87777777722222222222222227777aaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaa4444444400000000000000000000666666666666f4f4f4f4f4f4b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8 % e8e8e8e87777777722222222222222227777aaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaa4444444400000000000000000066666666666666f4f4f4f4f4f4b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8 % e8e8e87777777777222222222222222277aaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaa5544444400000000000000000066666666666666f4f4f4f4f4f4f4b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e8 % e8e8777777777722222222222222227777aaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaa555555000000000000000000006666666666666666f4f4f4f4f4f4b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e8 % e8e8777777777722222222222222227777aaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaa555555111111000000000000666666666666666666f4f4f4f4f4f4b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e8 % e877777777777722222222222222227777aaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaa555555111111111111000000666666666666666666f4f4f4f4f4f4f4b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e8e8 % e877777777772222222222222222227777aaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaa555555111111111111111111777777777766666666f4f4f4f4f4f4f4b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e8e8 % 7777777777772222222222222222226677aaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaa555555111111111111111111777777777777777777f4f4f4f4f4f4f4f4b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e8e8e8 % 7777777777222222222222222222666677aaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaa55555555111111111111111111777777777777777777ccf4f4f4f4f4f4f4b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e8e8e8 % 7777777777222222222222222222666666aaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaa55555555111111111111111111777777777777777777ccf4f4f4f4f4f4f4b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e8e877 % 7777777722222222222222222266666666aaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaa55555555111111111111111111777777777777777777ccf4f4f4f4f4f4f4f4b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e8e8e877 % 77777777222222222222222222666666aaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaa55555555111111111111111111777777777777777777ccccf4f4f4f4f4f4f4b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e8e87777 % 777777222222222222222222666666aaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaa55555555111111111111111111777777777777777777ccccf4f4f4f4f4f4f4f4b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e8e8777777 % 777777222222222222222222666666aaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaa55555555111111111111111111777777777777777777ccccf4f4f4f4f4f4f4f4b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e8e8777777 % 777722222222222222222222666666aaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaa55555555111111111111111111777777777777777777ccccf4f4f4f4f4f4f4f4f4b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e8e877777777 % 7722222222222222222222226666aaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaa55555555111111111111111111777777777777777777ccaaaaf4f4f4f4f4f4f4f4b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e87777777777 % 7722222222222222222222666666aaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaa55555555111111111111111111777777777777777777aaaaaaf4f4f4f4f4f4f4f4f4b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e8e87777777777 % 22222222222222222222226666aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaa55555555111111111111111111777777777777888888aaaaaaf4f4f4f4f4f4f4f4f4b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e8777777777722 % 22222222222222222222666666aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaa555555111111111111111111777777888888888888aaaaaaaaf4f4f4f4f4f4f4f4b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e8e8777777772222 % 222222222222222222226666ffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaa555555222222222222222222888888888888888888aaaaaaaaf4f4f4f4f4f4f4f4b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e877777777222222 % 222222222222222222666666ffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaa55555555222222222222222288888888888888888888aaaaaaf4f4f4f4f4f4f4f4f4b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e87777777722222222 % 222222222222222255556666ffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaa555555222222222222222222888888888888888888aaaaaaaaf4f4f4f4f4f4f4f4b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8e87777777722222222 % 222222222222225555556666ffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaa555555222222222222222222888888888888888888aaaaaaaaf4f4f4f4f4f4f4f4b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8777777772222222222 % 2222222222222255555566aaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaa55555555222222222222222222888888888888888888aaaa9999f4f4f4f4f4f4f4f4b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e877777711222222222222 % 22222222225555555555aaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaa555555222222222222222222888888888888888888aaaa999999f4f4f4f4f4f4f4b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e877111111112222222222 % 222222225555555555aaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaa5555552222222222222222228888888888888888888899999999f4f4f4f4f4f4f4f4b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e81111111111111122222222 % 2222225555555555aaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaa555555552222222222222222228888888888888888889999999999f4f4f4f4f4f4f4b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e81111111111111122222222 % 2222555555555555aaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaa5555552222222222222222228888888888888888888899999999f4f4f4f4f4f4f4f4 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8111111111111111111222222 % 22225555555555aaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaa5555552222222222222222228888888888888888888899999999f4f4f4f4f4f4f4f4 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8111111111111111111112222 % 225555555555aaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaa555555552222222222222222228888888888888888888899999999f4f4f4f4f4f4f4 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e8111111111111111111112222 % 5555555555aaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaa5555552222222222222222228888888888888888888888999999f4f4f4f4f4f4f4 % f4b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e811111111111111111111111155 % 55555555aaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaa555555222222222222222222228888888888888888888888999999f4f4f4f4f4f4 % f4b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e811111111111111111111114455 % 555555aaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaa55555555222222222222222222888888888888888888888888999988f4f4f4f4f4 % f4f4b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e81111111111111111111144444455 % 5555aaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaa555555222222222222222222228888888888888888888888999988f4f4f4f4f4 % f4f4b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e81111111111111111444444444455 % 55aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaa55555555222222222222222222228888888888888888888888888888f4f4f4f4 % f4f4b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8111111111111114444444444444455 % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaa5555222222222222222222222288888888888888888888777788f4f4f4f4 % f4f4f4b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8111111111111444444444444444444aa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaa555555222222222222222222222288888888888888887777777788f4f4f4 % f4f4f4b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e811111111444444444444444444aaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaa5555552222222222222222222288888888888888777777777777f4f4f4 % f4f4f4f4b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8111111114444444444444444aaaaaaaaaa % ffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaff5555552222222222222222222288888888887777777777777777f4f4 % f4f4f4f4b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e833334444444444444444aaaaaaaaaaaaaa % aaffaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaff5555552222222222222222222222888888777777777777777777f4f4 % f4f4f4f4f4b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e83333334444444444aaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaa5555552222222222222222222222888877777777777777777777f4 % f4f4f4f4f4b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e83333333344444444aaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaa55555522222222222222222222887777777777777777777777f4 % f4f4f4f4f4b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8333333334444aaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaa5555555522222222222222222222227777777777777777777777 % f4f4f4f4f4f4b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e833333333e8aaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaa55555522222222222222222222222277777777777777777777 % 77f4f4f4f4f4b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8e8e833aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaff555555222222222222222222222222227777777777777777 % 6666666666f4f4b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8 % b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e8e8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaffaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaffaaaa5555552222222222222222222222222277777777777777 % 66666666666666666666666666666666666666666666665555555555555555555555555500000000 % 00000000003333333333333333aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaffaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaffaaaaaaaa55555522222222222222222222222222227777777777 % 66666666666666666666666666666666666666666666665555555555555555555555550000000000 % 00000000000055aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaffaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaa5555552222222222222222222222222222777766 % 66666666666666666666666666666666666666666666665555555555555555550000000000000000 % 0000000055aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaa55555522222222222222222222222222227766 % 66666666666666666666666666666666666666666666665555555555550000000000000000000000 % 00000055aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaffffaaaaaaaaaaaaaaaaaaaaaa5555552222222222222222222222222222 % 22226666666666666666666666666666666666666666666655555500000000000000000000000000 % 0000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffffaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaa55555522222222222222222222222222 % 22222222222222666666666666666666666666666666666600000000000000000000000000000000 % 55aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaa555555552222222222222222222222 % 22222222222222222222666666661111111111111111111100000000000000000000000000000055 % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa55555522222222222222222222 % 2222222222222222222222111111111111111111111111110000000000000000000000000000aaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa555555552222222222222222 % 22222222222222222222221111111111111111111111111100000000000000000000004444aaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa55555522222222222222 % 22222222222222222222111111111111111111111111111100000000000000004444aaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaffaaaaaaaaaaaaaaffffffffffffffffffffffffffffffffffffffffff4444444422222222 % 2222222222222222222211111111111111111111111111110000000000004444ffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffaaaaaaaaaaaaaaffaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaffaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4444444422 % 2222222222222222221111111111111111111111111111110000000044aaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaffaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaffaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4444 % 4444442222222222221111111111111111111111111111110044aaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaffaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % ffaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaa444444444422221111111111111144444444444444aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaffffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % ffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaff % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ffa962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2929a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa292929ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff2962a9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa296262ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa % aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2929a9ff % ff626262292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929a9ff % ff6262626262626262626262626262a9626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262622962626262626262626262626262a9ff % ff626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9 % 626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9 % a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262626262626262 % 62626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9 % 626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9 % a9a9a9a9a9a9a9a9296262626262626262626262a9a9a9ff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice /pop load def %%EndProlog %%Page 1 1 /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 466 string def gsave 194.16 263.4 translate 223.68 235.2 scale 466 490 8 [ 466 0 0 -490 0 490 ] { picstr readstring } image 800080008000ae000000e3d6019d5680d680d680d6f0d6019d56e2d6019d 007f00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69d5656d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69d7fd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d51d6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6d69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69d56000300d69dd6e59d0256 d6d6809d809d809df19d0256d6d6e59d02569d000200d6d6e49d0156d680 9d809d809df09d0156d6e39d0156007f00d69dd69d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d567f9d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d567f9d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d56519d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d d69d569d007f00d6d69d9d9d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d7f569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d7f569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d51569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569dd69d9d9d56000600d69dd6 9d569d800080008000bc0006d69dd69d569d000700d6d69d9d9d560080d6 80d680d6bed60700d6d69d9d9d56007f00d69dd69d569d00d6d69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd6d6d69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd6519dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69d9dd6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd600d69d d69d569d000800d6d69d9d9d5600d6ea9d0156d6809d809d899d0256d6d6 ea9d0156d6ea9d085600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d 0256d6d6809d809d8b9d025656d6e99d0556d6d69d9d9df200fc9d085600 d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6ee9dfc00cc9d02 00009df900ed9d0500009d9d0000f99d010000d99d010000ed9d01000080 9dbd9d0256d6d6eb9d025656d6fc9d0000f49d0d009d9d9d565600d6d69d 9d9d56000900d69dd69d569d00d6d6eb9d0256d6d6f19dfd00039d9d0000 ce9d0500009d9d0000e89d0500009d9d0000f99d010000d99d010000ec9d 010000809dbf9d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d56 00d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6f19d010000fc 9d010000cf9d0600009d9d9d0000e99d010000f59d010000c29d01000080 9dbe9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d 9d9d56000900d69dd69d569d00d6d6eb9d0256d6d6f39d010000f69dfc00 fd9d0800009d00009d000000fc9dfc00fd9d0600009d00009d9dfc00f99d 0600009d9d9d0000f99d0900009d9d9d00009d9d9dfc00fd9d1100009d9d 00009d9d9d0000009d00009d9d9dfc00fc9dfc00fd9d0500009d000000fa 9d010000fc9d0700009d00009d9d9dfc00109d9d00009d9d00009d9d0000 9d9d9d0000809dc09d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d 9d5600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6f29d0100 00f79d1b00009d9d00009d9d0000009d0000009d00009d9d00009d9d0000 9d9dfb00069d00009d9d0000fa9d0600009d9d9d0000f99d3800009d9d9d 00009d9d00009d9d00009d9d00009d9d00009d9d00009d9d0000009d9d00 009d9d00009d9d00009d9d00009d9d0000009d9d0000fb9d010000fc9d1c 00009d00009d9d00009d9d00009d00009d9d00009d9d00009d9d9d000080 9dbf9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d 9d9d56000b00d69dd69d569d00d6d69d9df000fd9d0256d6d6f49d010000 f29d1900009d9d00009d9d00009d9d00009d00009d9d9d00009d9d0000f8 9d010000fb9d010000fc9df900029d0000fc9d1400009d00009d9d9d0000 9d00009d9d9d00009d0000fc9d0900009d00009d9d9d0000fa9d0a00009d 9d00009d9d9d0000fb9d2200009d9d9d00009d9d00009d00009d9d9d0000 9d00009d9d00009d9d00009d9d9d0000809dc09d025656d6f89dfc00f59d 0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000c00d6d69d 9d9d5600d69d9d9d00f29d05009d9d5656d6f39d010000f69dfb000d9d9d 00009d9d00009d9d00009d9dfa00039d9d0000fb9dfb00fa9d0600009d9d 9d0000f99d0a00009d9d9d00009d9d0000fa9d1000009d9d00009d9d0000 9d9d9d00009d9dfa00fd9dfb00089d9d00009d9d9d0000fa9d0b00009d9d 00009d9d00009d9dfa000a9d9d00009d0000009d0000fc9d010000809dbf 9d0256d6d6f99d04009d9d0000f79d025656d6fc9d0000f49d0d00009d9d 565600d6d69d9d9d56000c00d69dd69d569d00d6d69d9d00f29d0600009d 9d56d6d6f49d010000f79d1400009d9d00009d9d00009d9d00009d9d0000 9d0000f99d010000fc9d0500009d9d0000fa9d0600009d9d9d0000f99d09 00009d9d9d00009d0000f99d0800009d9d00009d0000fc9d0400009d0000 f99d0e00009d9d00009d9d00009d9d9d0000fa9d0c00009d9d00009d9d00 009d0000f99d0800009d009d009d0000fc9d010000809dc09d025656d6f8 9d04009d9d0000f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd6 9d569d000b00d6d69d9d9d5600d69d9d9def00039d5656d6f39d010000fb 9d1800009d00009d9d9d00009d9d00009d9d00009d9d00009d0000f99d0b 00009d9d9d00009d9d9d0000fa9d0600009d9d9d0000fa9d1a00009d9d9d 00009d9d00009d9d9d00009d9d00009d9d00009d0000fc9d0400009d0000 fa9d0f00009d9d9d00009d9d00009d9d9d0000f99d0b009d00009d9d9d00 009d0000f99dfc00039d000000fb9d010000809dbf9d0256d6d6f99dfb00 f79d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000900d6 9dd69d569d00d6d6fc9df100049d9d56d6d6f39d2600009d9d0000009d9d 00009d9d00009d9d00009d9d00009d9d00009d9d00009d9d00009d9d0000 fc9d0500009d9d0000f99d0500009d9d0000f99d3800009d9d0000009d9d 00009d9d00009d9d00009d9d00009d9d00009d9d0000009d9d00009d9d00 009d9d00009d9d00009d9d00009d9d9d0000f89dfd00fd9d0900009d9d00 009d9d0000fc9d0500009d9d0000fb9d010000809dbf9d025656d6f79dfc 00f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000800 d6d69d9d9d5600d6eb9d025656d6f19dfc00fb9dfd00109d00009d00009d 9d00009d9d00009d9d9dfc00fd9d010000fb9dfd00029d0000fa9d030000 9d9df900fd9dfd00059d00009d9d9dfc00fd9d1100009d9d00009d9d9d00 00009d00009d9d9dfc00fc9dfd000a9d00009d00009d9d9d0000f89d0100 00fc9d0400009d9d9dfc00fb9d0500009d9d0000fb9d010000809dbe9d02 56d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d5600 0900d69dd69d569d00d6d6eb9d0256d6d6ba9d010000979d010000809dbe 9d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d56 9d000800d6d69d9d9d5600d6eb9d025656d6b99d010000989d010000809d bc9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d 9d56000900d69dd69d569d00d6d6eb9d0256d6d6b99d0100009a9d010000 809dbc9d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69d d69d569d000800d6d69d9d9d5600d6eb9d025656d6809d809d899d0256d6 d6eb9d025656d6fc9df1000b9d9d565600d6d69d9d9d56000900d69dd69d 569d00d6d6eb9d0256d6d6809d809d8b9d025656d6e99d0256d6d6fb9df3 00fd9d085600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d680 9d809d899d0256d6d6eb9d025656d6eb9d09565600d6d69d9d9d56007f00 d69dd69d569d00d69d9d569d569d569d569d569d569d569d569d569d569d 56d6569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d567f9d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d567f9d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d56519d569d56 9d569d569d569d569d569d569d569d569d569d5656d69d569d569d569d56 9d569d569d569d569d569d569d569d56d6569d569d569d569d569d569d56 9d569d569d569d569d5600d69dd69d569d0008009d569d9d9d56009de956 009d805680568856009de856009de9560700d6d69d569d56000000fb5600 9d800080008000bc0001d69dfc56ff000000fcd6029d5656805580558055 be550000fad6ff000700d6d6d69d569d56805580558055be550200d69dfc d6ff000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d6 9d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d569d 000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d6 9dd69d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d 5656805580558055be550700d6d69d9d9d56000700d69dd69d569d568055 80558055be550700d69dd69d569d000700d6d69d9d9d5656805580558055 be550700d6d69d9d9d56000700d69dd69d569d56805580558055be550700 d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d 9d56000700d69dd69d569d56805580558055be550700d69dd69d569d0007 00d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd6 9d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d5656 805580558055be550700d6d69d9d9d56000700d69dd69d569d5680558055 8055be550700d69dd69d569d000700d6d69d9d9d5656805580558055be55 0700d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69d d69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56 000700d69dd69d569d56805580558055be550700d69dd69d569d000700d6 d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d56 9d56805580558055be550700d69dd69d569d000700d6d69d9d9d56568055 80558055be550700d6d69d9d9d56000700d69dd69d569d56805580558055 be550700d69dd69d569d000700d6d69d9d9d5656805580558055be550700 d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d 569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d6 9d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d569d 000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d6 9dd69d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d 5656805580558055be550700d6d69d9d9d56000700d69dd69d569d568055 80558055be550700d69dd69d569d000700d6d69d9d9d5656805580558055 be550700d6d69d9d9d56000700d69dd69d569d56805580558055be550700 d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d 9d56000700d69dd69d569d56805580558055be550700d69dd69d569d0007 00d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd6 9d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d5656 805580558055be550700d6d69d9d9d56000700d69dd69d569d5680558055 8055be550700d69dd69d569d000700d6d69d9d9d5656805580558055be55 0700d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69d d69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56 000700d69dd69d569d56805580558055be550700d69dd69d569d000700d6 d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d56 9d56805580558055be550700d69dd69d569d000700d6d69d9d9d56568055 80558055be550700d6d69d9d9d56000700d69dd69d569d56805580558055 be550700d69dd69d569d000700d6d69d9d9d5656805580558055be550700 d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d 569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656b75580008000d000b7550700 d6d69d9d9d56000700d69dd69d569d56b75501000080558055d455010000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550200550080558055 d65502005500b7550700d6d69d9d9d56000700d69dd69d569d56b7550300 55550080558055d8550300555500b7550700d69dd69d569d000700d6d69d 9d9d5656b75504005555550080558055da55040055555500b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000fc55000080558055dc550000 fc550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fb55 000080558055de550000fb550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000fa55000080558055e0550000fa550000b7550700d69d d69d569d000700d6d69d9d9d5656b7550000f955000080558055e2550000 f9550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f855 00009055f7aa8055dd550000f8550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000f75500009a55e9aa8055e3550000f7550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000f6550000a455dcaa 8055e8550000f6550000b7550700d69dd69d569d000700d6d69d9d9d5656 b7550000f5550000ad55cfaa8055ee550000f5550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000f4550000b1550099c9aa8055f355 0000f4550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000 f4550000b355019999c3aa8055f8550000f4550000b7550700d6d69d9d9d 56000700d69dd69d569d56b7550000f3550000b655fc99bfaa8055fd5500 00f3550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f2 550000b955fb99e9aaf5dddeaa00bb81550000f2550000b7550700d6d69d 9d9d56000700d69dd69d569d56b75580008000d000b7550700d69dd69d56 9d000700d6d69d9d9d5656b755010000f1550000bf55f899f7aadddde9aa f9bb87550000f155010000b7550700d6d69d9d9d56000700d69dd69d569d 56b75502005500f1550000c355f69901aaaad0ddf0aaf6bb89550000f155 02005500b7550700d69dd69d569d000700d6d69d9d9d5656b75503005555 00f1550000c655f699c7ddf6aaf3bb8c550000f1550300555500b7550700 d6d69d9d9d56000700d69dd69d569d56b755040055555500f1550000c955 f699c0ddfdaaefbb8f550000f155040055555500b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000fc550000f1550000cc55f699bbddeebb 91550000f1550000fc550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000fb550000f1550000cf55f699b7ddeebb94550000f1550000 fb550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fa55 0000f1550000d255f599b4ddeebb97550000f1550000fa550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000f9550000f1550000d555 f599b1ddeebb99550000f1550000f9550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000f8550000f155d700f599adddeebb9b00f155 0000f8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 f755010000f3550000da55f599a9ddefbb9d550000f355010000f7550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f5550000f455 0000db550088f799a6ddeebb9f550000f4550000f5550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000f4550000f5550000dc550188 88f999a2ddeebba1550000f5550000f4550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000f3550000f6550000dd55018888fa999edd efbba2550000f6550000f3550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000f2550000f7550000de55fd88fc999addefbba4550000 f7550000f2550000b7550700d69dd69d569d000700d6d69d9d9d5656b755 0000f1550000f8550000df55fd88fd99aadd011919efddeebba6550000f8 550000f1550000b7550700d6d69d9d9d56000700d69dd69d569d56b75500 00f0550000f9550000e055fc880099adddf419f2ddefbba7550000f95500 00f0550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000ef 550000fa550000e155fc88ccddfbaafd99ebddec19f4ddf0bba8550000fa 550000ef550000b7550700d6d69d9d9d56000700d69dd69d569d56b75500 00ee550000fb550000e255fc88d2ddf4aaf899f5dde219f8ddf0bba95500 00fb550000ee550000b7550700d69dd69d569d000700d6d69d9d9d5656b7 550000ed550000fc550000e355fc88d8ddedaaf39901ddddda19faddf1bb aa550000fc550000ed550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000ec55040055555500e455fc88dfdde5aaf599d219fcddf2bb ab55040055555500ec550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000eb550300005500e555fc88e0ddfdbbe6aafa99cc19fcddf3 bbab550300550000eb550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000e955010000e655fc88e1ddfbbbe6aa019999c71903ddddee eef3bbac55010000e9550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000e8550000e755fc88e1ddf9bbeaaac21900ddfceef3bbad55 0000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 e855010000e955fc88e2ddf7bbeeaabd19fbeef3bbaf55010000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e85502005500 eb55fc88e3ddf5bbf2aab819fbeef3bbb15502005500e8550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000e8550300555500ed55fc 88e4ddf2bbf8aab219fbeef3bbfc19b7550300555500e8550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000e855040055555500ef55 fc88e5ddf0bbfcaaad19fbeef3bbf919bc55040055555500e8550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000fc550000 f155fc88e6ddedbb00aaaa19fceef2bbf519c2550000fc550000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000fb55 0000f355fc88e7ddecbba719fceef3bbf119c7550000fb550000e8550000 b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000fa55 0000f555fc88e8ddecbba419fceef3bbee19cc550000fa550000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000f955 0000f755fc88e9ddecbba119fceef3bbea19d2550000f9550000e8550000 b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000f855 0000f955fb88ebddecbb9f19fbeef3bbe719d7550000f8550000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000f755 010000fc55fb88ebddedbb9c19fbeef3bbe719da55010000f7550000e855 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000 f55502005555fb88ebddeebb9919fbeef3bbe719dc550000f5550000e855 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000 f455010055fc88ebddefbb9619fbeef3bbe819dd550000f4550000e85500 00b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000f3 55fc88ebddf0bb9319fbeef4bbe719df550000f3550000e8550000b75507 00d69dd69d569d000700d6d69d9d9d5656b7550000e8550000f355fd88eb ddf0bb9119fbeef4bbe719e1550000f2550000e8550000b7550700d6d69d 9d9d56000700d69dd69d569d56b7550000e8550000f455fd88ebddf1bb8e 19fceef3bbe719e3550000f1550000e8550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000e8550000f455018888ebddf2bb8b19fcee f3bbe819e4550000f0550000e8550000b7550700d6d69d9d9d56000700d6 9dd69d569d56b7550000e8550000f555028888eeecddf3bb8819fceef4bb 00cce819e6550000ef550000e8550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000e8550000f555038888eeeeeeddf3bb8619fceef7 bbfdcce719e8550000ee550000e8550000b7550700d6d69d9d9d56000700 d69dd69d569d56b7550000e8550000f655018888fceef0ddf4bb8319fcee fabbfacce819e9550000ed550000e8550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000e8550000f655018888fbeef2ddf5bb8019fc eefdbbf9cce619eb550000ec550000e8550000b7550700d6d69d9d9d5600 0700d69dd69d569d56b7550000e8550000f755018888faeef3ddf5bb8019 0019fbeef8cce419ee55010000eb550000e8550000b7550700d69dd69d56 9d000700d6d69d9d9d5656b7550000e8550000f755018888f9eef5ddf4bb 8019051919eeeefffff9cce319ef550000e9550000e8550000b7550700d6 d69d9d9d56000700d69dd69d569d56b7550000e8550000f855018888f7ee f6ddf5bb8019fc19fcfffacce219f1550000e8550000e8550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000e8550000f855018888f6 eef8ddf5bb8019fa19fdfffbcce019f200e7550000e8550000b7550700d6 d69d9d9d56000700d69dd69d569d56b7550000e8550000f955018888f4ee faddf4bb8019f81904ffffccccccdf19f3550000e7550000e8550000b755 0700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000f9550188 88f4eefbddf4bb8019f61902ffccccdd19f4550000e7550000e8550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000fa5501 8888f2eefdddf4bb8019f41901ffccdc19f5550000e7550000e8550000b7 550700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000fa5501 8888f1ee00ddf3bb8019ce19f5550000e7550000e8550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000e8550000fb55018888f0eef3 bb8019cc19f6550000e7550000e8550000b7550700d69dd69d569d000700 d6d69d9d9d5656b7550000e8550000fb55018888f0eef4bb8019ca19f755 0000e7550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56 b7550000e8550000fc55018888f0eef3bb8019ca19f7550000e7550000e8 550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e85500 00fc55018888f0eef4bb8019c819f8550000e7550000e8550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000e85505005555558888f0 eef4bb8019c619f9550000e7550000e8550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000e85505005555558888f0eef4bb8019c619 f9550000e7550000e8550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000e855040055558888f0eef4bb8019c419fa550000e7550000 e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e855 040055888888f0eef5bb8019c219fb550000e7550000e8550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000e8550300558888f0eef4 bb8019c219fb550000e7550000e8550000b7550700d69dd69d569d000700 d6d69d9d9d5656b7550000e8550300888888f0eef5bb8019c019fc550000 e7550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000e85502008888f0eef5bb8019be19fd550000e7550000e8550000b755 0700d69dd69d569d000700d6d69d9d9d5656b7550000e85502008888f0ee f6bb8019bc1902555500e7550000e8550000b7550700d6d69d9d9d560007 00d69dd69d569d56b7550000e855010088f0eef5bb8019bc1902555500e7 550000e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b75500 00e855018888f0eef6bb8019ba19015500e7550000e8550000b7550700d6 d69d9d9d56000700d69dd69d569d56b7550000e8550088f0eef6bb8019b8 190000e7550000e8550000b7550700d69dd69d569d000700d6d69d9d9d56 56b7550000e8550088f0eef6bb8019b8190000e7550000e8550000b75507 00d6d69d9d9d56000700d69dd69d569d56b7550000e8550288fffff3eef6 bb8019b619e7550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000e855fcfff4eef7bb8019b419e8550000e8550000b75507 00d6d69d9d9d56000700d69dd69d569d56b7550000e9550088fafff6eef7 bb8019b419e8550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000e9550088f9fff8eef7bb8019b219e9550000e8550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000e9550088f7fffa eef8bb8019b019ea550000e8550000b7550700d69dd69d569d000700d6d6 9d9d9d5656b7550000e9550088f5fffdeef7bb8019b01901eeeeec550000 e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e955 0088f4ff01eeeef8bb8019ae1901eeeeed550000e8550000b7550700d69d d69d569d000700d6d69d9d9d5656b7550000e9550088f3fff8bb8019ac19 01eeeeee550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d 56b7550000ea550088f2fff8bb8019ac19fdeeef550000e8550000b75507 00d69dd69d569d000700d6d69d9d9d5656b7550000ea550088f2fff9bb80 19aa19fdeef0550000e8550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000ea550088f2fffabb8019a819fdeef1550000e8550000b7 550700d69dd69d569d000700d6d69d9d9d5656b7550000ea550088f2fffa bb8019a819fdee0088f2550000e8550000b7550700d6d69d9d9d56000700 d69dd69d569d56b7550000ea550088f2fffbbb8019a619fdee0088f35500 00e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000eb 55018888f3fffbbb8019a419fdee0088f4550000e8550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000eb550088f2fffbbb8019a419 fdee0088f4550000e8550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000eb550088f2fffcbb8019a219fdee0088f5550000e8550000 b7550700d6d69d9d9d56000700d69dd69d569d56b7550000eb550088f2ff fdbb8019a01903eeee8888f6550000e8550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000eb550088f2fffdbb8019a019fdee0088f6 550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b75500 00eb550088f2ff01bbbb80199e19fdee0088f7550000e8550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000ec55018888f2ff00bb80 199c1902eeee88f7550000e8550000b7550700d6d69d9d9d56000700d69d d69d569d56b7550000ec550088f2ff00bb80199a1902eeee88f8550000e8 550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000ec5500 88f2ff00bb80199a19fdee0088f9550000e8550000b7550700d6d69d9d9d 56000700d69dd69d569d56b7550000ec550088f2ff8019981902eeee88f9 550000e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b75500 00ec550088f3ff8019961902eeee88fa550000e8550000b7550700d6d69d 9d9d56000700d69dd69d569d56b7550000ed55018888f3ff8c190147478c 19fdee0088fb550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000ed55018888f4ff8c19fc478c1902eeee88fb550000e855 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ed550088 f4ff8d19f8478d1902eeee88fc550000e8550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000ed550088f4ff8e19f6478e19fdeefc55 0000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 ec55f5ff8f19f2478f1906eeee8855555500e8550000b7550700d69dd69d 569d000700d6d69d9d9d5656b7550000ec55f6ff8f19f0478f1905eeee88 555500e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b75500 00ec55f6ff9119ec479119fdee02555500e8550000b7550700d69dd69d56 9d000700d6d69d9d9d5656b7550000ec55f7ff9119ea47911904eeee8855 00e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ec 550088f9ff9119e847911903eeee5500e8550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000ec550088f9ff9319e4479319fdee0000 e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ec55 0088faff9319e247931902eeee88e8550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000ec550088fbff9419de47941901dddde85500 00b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ec550088fb ff9519dc47951902dddd88e9550000b7550700d69dd69d569d000700d6d6 9d9d9d5656b7550000ec550088fcff9619d847961902dd8888ea550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000ec550388ffffff 9619d6479619018888ea550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000eb55fdff9719d447971902dd8888eb550000b7550700d6 d69d9d9d56000700d69dd69d569d56b7550000eb5501ffff9819d0479819 018888eb550000b7550700d69dd69d569d000700d6d69d9d9d5656b75500 00eb5500889819ce4798190088eb550000b7550700d6d69d9d9d56000700 d69dd69d569d56b7550000eb5501880b9b19ca479b1902178888ec550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000eb550288ff0b 9d19c8479d190317dd8888ec550000b7550700d6d69d9d9d56000700d69d d69d569d56b7550000eb550388ff0b0b9f19c6479f19041717dd8888ec55 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000eb550388 ff0b0ba119c247a119041717dd8888ec550000b7550700d6d69d9d9d5600 0700d69dd69d569d56b7550000eb550488ff0b0b0ba319c047a319fd1703 dd888888ed550000b7550700d69dd69d569d000700d6d69d9d9d5656b755 0000eb550588ffff0b0b0ba619bc47a619fd17fddd018888ed550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000eb550288fffffc0b a819ba47a819fc17fddd018888ed550000b7550700d69dd69d569d000700 d6d69d9d9d5656b7550000ea550688ff0bbbbb0b0bab19b647ab19fb17fd dd018888ed550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000ea550188fffcbb010b0bad19b447ad19fa17fdddfd88ee550000b755 0700d69dd69d569d000700d6d69d9d9d5656b7550000ea550088fabb010b 0baf19b247af19fa17fbdd018888ee550000b7550700d6d69d9d9d560007 00d69dd69d569d56b7550000ea550088f9bb000bb119ae47b119fa17fbdd 018888ee550000b7550700d69dd69d569d000700d6d69d9d9d5656b75500 00ea55f7bb000bb319ac47b319f917fbdd018888ee550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000eb55f6bb01ff0bb619a847b6 19f817fadd018888ef550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000eb55f7bb03ffff0b0bb819a647b819f817f9dd018888ef55 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ec55f7bb fcff010b0bbb19a247bb19f717f9dd018888ef550000b7550700d69dd69d 569d000700d6d69d9d9d5656b7550000ed55f6bbfcfffd0bbd19a047bd19 f617f9dd018888ef550000b7550700d6d69d9d9d56000700d69dd69d569d 56b7550000ed55f7bbfaff010b0bbe199e47be19f617f8dd018888f05500 00b7550700d69dd69d569d000700d6d69d9d9d5656b7550000ee55f7bbf9 fffd0bc1199a47c119f617f7dd018888f0550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000ef55f6bbf8fffd0bc3199847c319f617 f6dd018888f0550000b7550700d69dd69d569d000700d6d69d9d9d5656b7 550000ef55f7bbf6fffd0bc6199447c619f517f6dd018888f0550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000f055f7bbf5fffc0b c8199247c819f517f4dd018888f1550000b7550700d69dd69d569d000700 d6d69d9d9d5656b7550000f055f7bbf4fffc0bcb198e47cb19f517f3dd01 8888f1550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 f055f8bbf3fffb0bcd198c47cd19f417f3dd018888f1550000b7550700d6 9dd69d569d000700d6d69d9d9d5656b7550000f155f8bbf1fffc0bce198a 47ce19f517f2dd018888f1550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000f155f8bbf1fffb0bd1198647d119f517f1ddfd88f255 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f155f8bb f0fffb0bd3198447d319f417f1ddfd88f2550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f255f8bbeffffa0bd6198047d619f417 f0ddfd88f2550000b7550700d69dd69d569d000700d6d69d9d9d5656b755 0000f255f8bbeefffa0bd8198047014747d819f317f0ddfd88f2550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000f255f8bbeefff9 0bdb198047fa47db19f3170088f0ddfc88f3550000b7550700d69dd69d56 9d000700d6d69d9d9d5656b7550000f355f7bbedfffa0bdc198047f847dc 19f3170088f0ddfc88f3550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000f355f8bbecfff90bde198047f647de19f317018888f0dd fc88f3550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000 f355f8bbecff00aaf90be1198047f247e119f217018888f0ddfc88f35500 00b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f455f7bbed ff0199aaf80be3198047f047e319f217fd88f0ddfc88f3550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000f455f8bbecfffd99f80b e6198047ec47e619f117fd88f0ddfc88f3550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f455f8bbecfffd99f70be8198047ea47 e819f117fd88efddfc88f3550000b7550700d69dd69d569d000700d6d69d 9d9d5656b7550000f555f7bbedfffc99f60beb198047e647eb19f117fc88 efddfc88f3550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000f555f8bbecfffb99f70bec198047e447ec19f117fc88f0ddfc88f255 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f555f8bb ecfffb99f60bee198047e247ee19f117fb88f0ddfc88f2550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000f655f7bbedfff999f60b f1198047de47f119f017fb88f0ddfc88f2550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000f655f8bbecfff999f50bf3198047dc47 f319f017fa88f0ddfc88f2550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000f655f8bbecfff999f40bf6198047d847f619ef17fa88 f0ddfc88f2550000b7550700d69dd69d569d000700d6d69d9d9d5656b755 0000f755f7bbedfff799f40bf8198047d647f819ef17f988f0ddfc88f255 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f755f8bb ecfff799f40bf9198047d447f919ef17f988f0ddfc88f2550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000f855f7bbecfff799f30b fc198047d047fc19ef17f888f0ddfc88f2550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f855f7bbedfff599f30b0119198047ce 47011919ee17f888f0ddfc88f2550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000f855f8bbecfff599f20b8047cc47ee17f788f0dd fc88f2550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 f955f7bbecfff499f30b8047cc47ee17f788f0ddfc88f2550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000f955f7bbecfff499f20b 8047ce47ee17f788efddfc88f2550000b7550700d6d69d9d9d56000700d6 9dd69d569d56b7550000f955f8bbecfff399f20b8047ce47ee17f788efdd fd88f1550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000 f95500aaf9bbecfff299f30b8047ce47ef17f688efddfd88f1550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000f955fdaafbbbecff f299f20b8047d047ef17f688efddfc88f1550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000f955fcaafdbbecfff199f20b8047d047 ef17f688efddfc88f1550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000f955faaa00bbecfff099f20b8047d247ef17f588efddfc88 f1550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f955 f9aa00eeedfff099f20b8047d247ef17f688eeddfc88f1550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000f955f9aafbeef2ffee99 f30b8047d247f017f588eeddfc88f1550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000f955f9aaf7eef6ffee99f20b8047d447ef17 f688edddfc88f1550000b7550700d6d69d9d9d56000700d69dd69d569d56 b7550000f955f9aaf3eefaffee99f20b8047d447f017f588edddfc88f155 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f955f9aa efee00ffed990033f20b8047d647ef17f688eddd049999888888f1550000 b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f955f9aaeeee f688f7990033f20b8047d647f017f588eddd049999888888f1550000b755 0700d69dd69d569d000700d6d69d9d9d5656b7550000f955f9aaeeeeee88 013333f20b8047d647f117f588edddfc99018888f1550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000f955f9aaeeeeee88013333f1 0b8047d847f017f588edddfc990088f0550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000f955f9aaeeeeee88013333f10b8047d847 f117f488edddfb99f0550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000fa55f8aaeeeeee88fd33f10b8047da47f017f588edddfa99 f0550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fa55 f8aaeeeeee88fd33f10b8047da47f117f488edddfa99f0550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000fa55f8aaeeeeee88fd33 f10b8047da47f117f588edddf999f0550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000fa55f8aaeeeeee88fd33f00b8047dc47f117 f488edddfa99ef550000b7550700d6d69d9d9d56000700d69dd69d569d56 b7550000fa55f8aaeeeeee88fc33f10b8047dc47f117f588edddf999ef55 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fa55f8aa eeeeee88fc33f00b8047de47f117f488edddfa99ee550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000fa55f8aaeeeeee88fc33f00b 8047de47f217f388edddfa99ee550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000fa55f8aaeeeeee88fb33f10b8047de47f217f488 edddfa99ed550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000fa55f8aaeeeeee88fb33f00b8047e047f217f388edddfa99ed550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fa55f8aaeeee ee88fb33f00b8047e047f217f488edddf999ed550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000fa55f8aaeeeeee88fb33ef0b8047 e247f217f388edddfa99ec550000b7550700d69dd69d569d000700d6d69d 9d9d5656b7550000fa55f8aaeeeeee88fa33f00b8047e247f217f488eddd f999ec550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 fa55f8aaeeeeee88fa33ef0b8047e447f217f488ecddfa99eb550000b755 0700d69dd69d569d000700d6d69d9d9d5656b7550000fa55f8aaedeeef88 fb330055ef0b8047e447f317f488ebddfa99eb550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000fa55f8aaedeeef88fc33fd55f00b 8047e447f317f588ebddfa99ea550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000fa55f8aaedeeef88fd33fc55ef0b8047e647f317 f488ebddfa99ea550000b7550700d6d69d9d9d56000700d69dd69d569d56 b7550000fa55f8aaedeeef88013333fb55ef0b8047e647f317f588ebddfa 99e9550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fa 55f8aaedeeef880033f955ef0b8047e847f317f588eaddfa99e9550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000fa55f8aaedeef0 88017777f955ef0b8047e847f417f588eaddf999e9550000b7550700d69d d69d569d000700d6d69d9d9d5656b7550000fa55f8aaedeef488fa77f955 ef0b8047e847f417f688e9ddfa99e8550000b7550700d6d69d9d9d560007 00d69dd69d569d56b7550000fa55f8aaedeef888f677f855ef0b8047ea47 f417f688e8ddfa99e8550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000f955f9aaedeefb88f277f955ef0b8047ea47f417f788e8dd fa990000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000f955f9aaedee0088ee77f955ee0b8047ec47f417f788e7ddfa990000 e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f955 f9aaeddded77f855ef0b8047ec47f517f788e7ddfa99015500e8550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000f855faaaedddec 77f955ef0b8047ec47f517f888e7dd01aaaafb99015500e8550000b75507 00d69dd69d569d000700d6d69d9d9d5656b7550000f855f9aaeeddec77f9 55ee0b8047ee47f517f888e7ddfdaafb99015500e8550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000f855f9aaeddded77f955ee0b 8047ee47f517f988e7ddfcaafc9902555500e8550000b7550700d69dd69d 569d000700d6d69d9d9d5656b7550000f755faaaedddec77f955ee0b8047 f047f517f888e8ddfbaafc9902555500e8550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f755f9aaeddded77f955ee0b8047f047 f517f988e7ddfaaa05999955555500e8550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000f755f9aaeddded77f955ee0b8047f047f6 17f988e7ddf9aa05999955555500e8550000b7550700d6d69d9d9d560007 00d69dd69d569d56b7550000f655faaaedddec77fa550066ee0b8047f247 f617f988e7ddf8aa0099fc550000e8550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000f655f9aaeddded77fb55fd66ef0b8047f247 f617fa8800eee8ddf7aa0099fc550000e8550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f655f9aaeddded77fb55fd66ee0b8047 f447f617fb88fdeee9ddf6aafb550000e8550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000f555faaaedddec77fd55fb66ef0b8047 f447f717fc88faeeebddf6aafa550000e8550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f555f9aaeddded77fd55fa66f00b8047 f447f717018888f8eeecddf6aaf9550000e8550000b7550700d69dd69d56 9d000700d6d69d9d9d5656b7550000f555f9aaeddded77015555f966ef0b 8047f647f7170088f5eeeeddf6aaf8550000e8550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000f555f9aaedddec770055f866f00b 8047f647f717f3eef0ddf6aaf7550000e8550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000f455f9aaeddded77f766ef0b8047f847 f717f2eef1ddf5aaf7550000e8550000b7550700d6d69d9d9d56000700d6 9dd69d569d56b7550000f455f9aaeddded77f666f00b8047f847f717f1ee f3ddf5aaf6550000e8550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000f455f9aaedddec77f766f00b8047f847f817efeef5ddf5aa f5550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000f355f9aaedddec77f766f00b8047fa47f717efeef5ddf6aaf4550000 e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f355 f9aaedddeb77f866f00b8047fa47f817edeef7ddf6aaf3550000e8550000 b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f355f9aaeddd eb77f866ef0b8047fc47f717eceef9ddf6aaf2550000e8550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000f255f9aaedddeb77f866 f00b8047fc47f817ebeefaddf6aaf1550000e8550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000f255f9aaedddea77f966f00b8047 fc47f817eaeefcddf6aaf0550000e8550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000f255f9aaeddde977f966f00b8047014747f8 17e9eefdddf6aaef550000e8550000b7550700d6d69d9d9d56000700d69d d69d569d56b7550000f155f9aaeddde977fa66f00b8047014747f817e8ee 00ddf6aaee550000e8550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000f155f9aaeddde977f966f00b8047f817e7ee00bbf7aaed55 0000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 f155f9aaecdde977fa66f00b8047f817e9eefdbbf8aaec550000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f055f9aaeddd e877fb660077f10b8047f917eaeefbbbf9aaeb550000e8550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000f055f9aaecdde877fc66 017777f10b8247f817eceef9bbfaaaea550000e8550000b7550700d69dd6 9d569d000700d6d69d9d9d5656b7550000f055f9aaebdde977fc66017777 f10b8247f917eceef8bbfaaaea550000e8550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000ef55f9aaebdde977fd66fd77f10b8447 f817eeeef6bbfbaae9550000e8550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000ee55faaaebdde877046666777777f10b8447f917 efeef4bbfcaae8550000e8550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000ee55f9aaebdde377f20b8447f917f1eef2bbfdaae755 0000e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000 ed55faaaeadde9770088fb77f20b8647f917f2eeefbb01aa00e7550000e8 550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ec55fa aaeaddeb77fd88fc77f20b8647f917f3eeeebb015500e7550000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000eb55faaaeadd ec77fb88fd77f20b8847f917f4eeeebbfd550000e7550000e8550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000eb55f9aaebdded77 f988017777f20b8847f917f6eeeebbfb550000e7550000e8550000b75507 00d69dd69d569d000700d6d69d9d9d5656b7550000ea55faaaeaddef77f6 880077f30b8847fa17f7eeedbbfa550000e7550000e8550000b7550700d6 d69d9d9d56000700d69dd69d569d56b7550000e955faaaeaddf177f48800 77f30b8a47f917f9eeedbbf700e7550000e8550000b7550700d69dd69d56 9d000700d6d69d9d9d5656b7550000e855faaaeaddf377f288f30b8a47fa 17f9eeeebbf5550000e8550000e8550000b7550700d6d69d9d9d56000700 d69dd69d569d56b7550000e855f9aaeaddf477f288f20b8c47f917fbeeee bbf2550000e9550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000e8550000f9aaebddf577f088f30b8c47fa1700eefcccef bbef55010000eb550000e8550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000e855010055faaaeaddf777ef88f30b8c47fa17fbccf1 bbeb550000ec550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000e85502005555faaaeaddf977ed88f30b8e47f917faccf4 bbe8550000ed550000e8550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000e85502005555f9aaeaddfb77ec88f30b8e47f917faccf5 bbe6550000ee550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000e8550300555555f9aaeaddfc77eb88f30b9047f917f9cc f7bbe3550000ef550000e8550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000e8550000fc55faaaeaddfd77ea88f30b9047f917f9cc f9bbe0550000f0550000e8550000b7550700d69dd69d569d000700d6d69d 9d9d5656b7550000e8550000fb55faaaeadd0077e888f40b9047f917f9cc fbbbdd550000f1550000e8550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000e8550000fb55f9aaeadde888f30b9247f817f9ccfdbb 0017db550000f2550000e8550000b7550700d69dd69d569d000700d6d69d 9d9d5656b7550000e8550000fa55f9aae9dde988f40b9247f817f9cc01bb 17d8550000f3550000e8550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000e8550000f955f9aae9ddea88f30b9447f717faccd45500 00f4550000e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7 550000e8550000f855faaae7ddea880099f60b9447f81701ccccce550000 f5550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000e8550000f855f9aae6ddec88fb99f90b9647f917c955010000f75500 00e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8 550000f8550000f9aae6ddee88f699fd0b9647fd17c3550000f8550000e8 550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e85500 00f95502005555f9aae5ddf088d199e2aafbffdfccbb550000f9550000e8 550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e85500 00fa550000fc55f9aae5ddf188d199e4aaedfff0ccb5550000fa550000e8 550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e85500 00fb550000fb55f9aae3ddf488d099e5aaeafffdaaa9550000fb550000e8 550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e85500 00fc550000f855faaae2ddf688d099e6aaeaff01aaaaa6550000fc550000 e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e855 040055555500f655faaae2ddf888cf99e8aae9ff01aaaaa4550400555555 00e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8 550300555500f355faaae2ddfa88ce99ecaae8ff01aaaaa1550300555500 e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e855 02005500f155faaae2ddfb88ce99efaae6ff01aaaa9f5502005500e85500 00b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e855010000 ee55faaae2dd018888cd99f1aae5ff01aaaa9d55010000e8550000b75507 00d6d69d9d9d56000700d69dd69d569d56b7550000e8550000ec55faaae2 dd0088cd99f4aae4ff01aaaa9a550000e8550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000e955010000eb55f9aae0ddd099f6aae3 ff01aaaa9955010000e9550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000eb550300005500e955f9aadeddd399faaae1ff00aa9755 0300550000eb550000b7550700d69dd69d569d000700d6d69d9d9d5656b7 550000ec55040055555500e855f9aadaddd899fcaae1ff01aaaa96550400 55555500ec550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000ed550000fc550000e655f9aad8dddc9900aadfff00aa94550000fc55 0000ed550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000 ee550000fb550000e555f9aad5dde799f9eedfff00aa93550000fb550000 ee550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ef55 0000fa550000e355f9aad3ddf899eceee1ff01aaaa92550000fa550000ef 550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f05500 00f9550000e255f9aad2dde6eee2ff00aa90550000f9550000f0550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000f1550000f85500 00e055f9aad5dde5eee3ff00aa8f550000f8550000f1550000b7550700d6 9dd69d569d000700d6d69d9d9d5656b7550000f2550000f7550000df55f9 aad6dde5eee5ff00aa8d550000f7550000f2550000b7550700d6d69d9d9d 56000700d69dd69d569d56b7550000f3550000f6550000dd55f9aad8dde5 eee8fffdbb8c550000f6550000f3550000b7550700d69dd69d569d000700 d6d69d9d9d5656b7550000f4550000f5550000dc55f9aadadde4eeebfffc bb8a550000f5550000f4550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000f5550000f4550000da55f9aadcdde4eeeefffcbb875500 00f4550000f5550000b7550700d69dd69d569d000700d6d69d9d9d5656b7 550000f755010000f3550000d955f8aadedde4eef0fffdbb84550000f355 010000f7550000b7550700d6d69d9d9d56000700d69dd69d569d56b75500 00f8550000f155d500f8bbe2dde3eef3fffdbb8000f1550000f8550000b7 550700d69dd69d569d000700d6d69d9d9d5656b7550000f9550000f15500 00d155f8bbe6dde3eef6fffcbb805502555500f1550000f9550000b75507 00d6d69d9d9d56000700d69dd69d569d56b7550000fa550000f1550000cd 55f7bbebdde2eef8fffdbb8055fa550000f1550000fa550000b7550700d6 9dd69d569d000700d6d69d9d9d5656b7550000fb550000f1550000c855f7 bbefdde2eefbfffdbb8055f6550000f1550000fb550000b7550700d6d69d 9d9d56000700d69dd69d569d56b7550000fc550000f1550000c455f6bbf3 dde2ee04ffffbbbbbb8055f2550000f1550000fc550000b7550700d69dd6 9d569d000700d6d69d9d9d5656b755040055555500f1550000bf55f6bbf8 dde1ee01bbbb8055ee550000f155040055555500b7550700d6d69d9d9d56 000700d69dd69d569d56b7550300555500f1550000bb55f5bbfcddf1eef1 bb8055ea550000f1550300555500b7550700d69dd69d569d000700d6d69d 9d9d5656b75502005500f1550000b655dabb8055e6550000f15502005500 b7550700d6d69d9d9d56000700d69dd69d569d56b755010000f1550000b2 55f3bb8055cf550000f155010000b7550700d69dd69d569d000700d6d69d 9d9d5656b75580008000d000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000f255000080558055f0550000f2550000b7550700d69dd69d 569d000700d6d69d9d9d5656b7550000f355000080558055ee550000f355 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f4550000 80558055ec550000f4550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000f455000080558055ec550000f4550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000f555000080558055ea550000f555 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f6550000 80558055e8550000f6550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000f755000080558055e6550000f7550000b7550700d69dd69d 569d000700d6d69d9d9d5656b7550000f855000080558055e4550000f855 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f9550000 80558055e2550000f9550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000fa55000080558055e0550000fa550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000fb55000080558055de550000fb55 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fc550000 80558055dc550000fc550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b75504005555550080558055da55040055555500b7550700d69dd69d 569d000700d6d69d9d9d5656b755030055550080558055d8550300555500 b7550700d6d69d9d9d56000700d69dd69d569d56b7550200550080558055 d65502005500b7550700d69dd69d569d000700d6d69d9d9d5656b7550100 0080558055d455010000b7550700d6d69d9d9d56000700d69dd69d569d56 b75580008000d000b7550700d69dd69d569d000700d6d69d9d9d56568055 80558055be550700d6d69d9d9d56000700d69dd69d569d56805580558055 be550700d69dd69d569d000700d6d69d9d9d5656805580558055be550700 d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d 569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d6 9d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d569d 000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d6 9dd69d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d 5656805580558055be550700d6d69d9d9d56000700d69dd69d569d568055 80558055be550700d69dd69d569d000700d6d69d9d9d5656805580558055 be550700d6d69d9d9d56000700d69dd69d569d56805580558055be550700 d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d 9d56000700d69dd69d569d56805580558055be550700d69dd69d569d0007 00d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd6 9d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d5656 805580558055be550700d6d69d9d9d56000700d69dd69d569d5680558055 8055be550700d69dd69d569d000700d6d69d9d9d5656805580558055be55 0700d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69d d69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56 000700d69dd69d569d56805580558055be550700d69dd69d569d000700d6 d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d56 9d56805580558055be550700d69dd69d569d000700d6d69d9d9d56568055 80558055be550700d6d69d9d9d56000700d69dd69d569d56805580558055 be550700d69dd69d569d000700d6d69d9d9d5656805580558055be550700 d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d 569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d6 9d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d569d 0007009d569d9d9d5656805580558055be550700d6d69d569d56000000fb 56019d56805580558055be550200d69dfc56ff000000fcd6029d56568055 80558055be550000fad6ff000700d6d6d69d569d56805580558055be5502 00d69dfcd6ff000700d6d69d9d9d5656805580558055be550700d6d69d9d 9d56000700d69dd69d569d56805580558055be550700d69dd69d569d0007 00d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd6 9d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d5656 805580558055be550700d6d69d9d9d56000700d69dd69d569d5680558055 8055be550700d69dd69d569d000700d6d69d9d9d5656805580558055be55 0700d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69d d69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56 000700d69dd69d569d56805580558055be550700d69dd69d569d000700d6 d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d56 9d56805580558055be550700d69dd69d569d000700d6d69d9d9d56568055 80558055be550700d6d69d9d9d56000700d69dd69d569d56805580558055 be550700d69dd69d569d000700d6d69d9d9d5656805580558055be550700 d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d 569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656800080008000bd0006d6d69d 9d9d56000600d69dd69d569d80d680d680d6bbd6059dd69d569d007f00d6 d69d9d9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d51d69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69d9d9d56000300d69dd6e59d0156d6809d80 9d809df09d0156d6e49d02569d000200d6d6e59d035656d6d6809d809d80 9df29d035656d6d6e49d0156007f00d69d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d56d6d69d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d567f9d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 567f9d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d56519d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 56d6d69d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d000100d6e25601d6d6805680568056f05601d6d6e356ff0080008000 8000ae00 grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.5/doc/pt_BR/0000755000175000017500000000000012310165605012123 500000000000000geomview-1.9.5/doc/pt_BR/texinfo.tex0000644000175000017500000100560512310110175014240 00000000000000% texinfo.tex -- TeX macros to handle Texinfo files. %changed by Joge Barros de abreu in 24/08/2008 % % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % \def\texinfoversion{2007-02-11.16} % % Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, % 2007 Free Software Foundation, Inc. % % This texinfo.tex file is free software; you can redistribute it and/or % modify it under the terms of the GNU General Public License as % published by the Free Software Foundation; either version 2, or (at % your option) any later version. % % This texinfo.tex file is distributed in the hope that it will be % useful, but WITHOUT ANY WARRANTY; without even the implied warranty % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU % General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this texinfo.tex file; see the file COPYING. If not, write % to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, % Boston, MA 02110-1301, USA. % % As a special exception, when this file is read by TeX when processing % a Texinfo source document, you may use the result without % restriction. (This has been our intent since Texinfo was invented.) % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://www.gnu.org/software/texinfo/ (the Texinfo home page), or % ftp://tug.org/tex/texinfo.tex % (and all CTAN mirrors, see http://www.ctan.org). % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. Please include including a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary. % % It is possible to adapt texinfo.tex for other languages, to some % extent. You can get the existing language-specific files from the % full Texinfo distribution. % % The GNU Texinfo home page is http://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. % For @tex, we can use \tabalign. \let\+ = \relax % Save some plain tex macros whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexfootnote=\footnote \let\ptexgtr=> \let\ptexhat=^ \let\ptexi=\i \let\ptexindent=\indent \let\ptexinsert=\insert \let\ptexlbrace=\{ \let\ptexless=< \let\ptexnewwrite\newwrite \let\ptexnoindent=\noindent \let\ptexplus=+ \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexstar=\* \let\ptext=\t % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Pre-3.0. \else \def\linenumber{l.\the\inputlineno:\space} \fi % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Ap\^endice}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Cap\'itulo}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{p\'agina}\fi \ifx\putwordsection\undefined \gdef\putwordsection{se\,{c}\~ao}\fi \ifx\putwordSection\undefined \gdef\putwordSection{se\,{c}\~ao}\fi \ifx\putwordsee\undefined \gdef\putwordsee{veja}\fi \ifx\putwordSee\undefined \gdef\putwordSee{Veja}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{\'Indice Resumido}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{\'Indice}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % Since the category of space is not known, we have to be careful. \chardef\spacecat = 10 \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; \chardef\underChar = `\_ % Ignore a token. % \def\gobble#1{} % The following is used inside several \edef's. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} % Hyphenation fixes. \hyphenation{ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ap-pen-dix bit-map bit-maps data-base data-bases eshell fall-ing half-way long-est man-u-script man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces spell-ing spell-ings stand-alone strong-est time-stamp time-stamps which-ever white-space wide-spread wrap-around } % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt} % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. We also make % some effort to order the tracing commands to reduce output in the log % file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\undefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % For @cropmarks command. % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\cornerlong \cornerlong=1pc \newdimen\cornerthick \cornerthick=.3pt \newdimen\topandbottommargin \topandbottommargin=.75in % Main output routine. \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions, but you have to call it yourself. \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% % {% % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \indexdummies % don't expand commands in the output. \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an example. % We don't want .vr (or whatever) entries like this: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; % it needs to be % {\code {{\tt \backslashcurfont }acronym} \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \vskip-\topandbottommargin \vtop to0pt{% \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \unvbox\footlinebox \fi % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \vbox to0pt{\vss \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% }% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \indexdummies \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1 \unvbox#1 \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % This space token undergoes the same procedure and is eventually removed % by \finishparsearg. % \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% \def\temp{#3}% \ifx\temp\empty % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: \let\temp\finishparsearg \else \let\temp\argcheckspaces \fi % Put the space token in: \temp#1 #3\ArgTerm } % If a _delimited_ argument is enclosed in braces, they get stripped; so % to get _exactly_ the rest of the line, we had to prevent such situation. % We prepended an \empty token at the very beginning and we expand it now, % just before passing the control to \argtorun. % (Similarily, we have to think about #3 of \argcheckspacesY above: it is % either the null string, or it ends with \^^M---thus there is no danger % that a pair of braces would be stripped. % % But first, we have to remove the trailing space token. % \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} % % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my % favourite TeX trick. --kasal, 16nov03 \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } \def\doparseargdef#1#2{% \def#2{\parsearg#1}% \def#1##1% } % Several utility definitions with active space: { \obeyspaces \gdef\obeyedspace{ } % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % \gdef\sepspaces{\obeyspaces\let =\tie} % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\leavevmode \penalty \@M \ ). \gdef\unsepspaces{\let =\space} } \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} % Define the framework for environments in texinfo.tex. It's used like this: % % \envdef\foo{...} % \def\Efoo{...} % % It's the responsibility of \envdef to insert \begingroup before the % actual body; @end closes the group after calling \Efoo. \envdef also % defines \thisenv, so the current environment is known; @end checks % whether the environment name matches. The \checkenv macro can also be % used to check whether the current environment is the one expected. % % Non-false conditionals (@iftex, @ifset) don't fit into this, so they % are not treated as enviroments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At runtime, environments start with this: \def\startenvironment#1{\begingroup\def\thisenv{#1}} % initialize \let\thisenv\empty % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% \def\temp{#1}% \ifx\thisenv\temp \else \badenverr \fi } % Evironment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty out of any environment% \else in environment \expandafter\string#1% \fi } % @end foo executes the definition of \Efoo. % But first, it executes a specialized version of \checkenv % \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03 \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} %% Simple single-character @ commands % @@ prints an @ % Kludge this until the fonts are right (grr). \def\@{{\tt\char64}} % This is turned off because it was never documented % and you can use @w{...} around a quote to suppress ligatures. %% Define @` and @' to be the same as ` and ' %% but suppressing ligatures. %\def\`{{`}} %\def\'{{'}} % Used to generate quoted braces. \def\mylbrace {{\tt\char123}} \def\myrbrace {{\tt\char125}} \let\{=\mylbrace \let\}=\myrbrace \begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux/toc files. \catcode`\{ = \other \catcode`\} = \other \catcode`\[ = 1 \catcode`\] = 2 \catcode`\! = 0 \catcode`\\ = \other !gdef!lbracecmd[\{]% !gdef!rbracecmd[\}]% !gdef!lbraceatcmd[@{]% !gdef!rbraceatcmd[@}]% !endgroup % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \c \let\dotaccent = \. \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \t \let\ubaraccent = \b \let\udotaccent = \d % Other special characters: @questiondown @exclamdown @ordf @ordm % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ptexi \else\ifx\temp\jmacro \j \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % The \TeX{} logo, as in plain, but resetting the spacing so that a % period following counts as ending a sentence. (Idea found in latex.) % \edef\TeX{\TeX \spacefactor=1000 } % @LaTeX{} logo. Not quite the same results as the definition in % latex.ltx, since we use a different font for the raised A; it's most % convenient for us to use an explicitly smaller font, rather than using % the \scriptstyle font (since we don't reset \scriptstyle and % \scriptscriptstyle). % \def\LaTeX{% L\kern-.36em {\setbox0=\hbox{T}% \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}% \kern-.15em \TeX } % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \def\?{?\spacefactor=\endofsentencespacefactor\space} % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \plainfrenchspacing \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on/off}% \fi\fi } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % Another complication is that the group might be very large. This can % cause the glue on the previous page to be unduly stretched, because it % does not have much material. In this case, it's better to add an % explicit \vfill so that the extra space is at the bottom. The % threshold for doing this is if the group is more than \vfilllimit % percent of a page (\vfilllimit can be changed inside of @tex). % \newbox\groupbox \def\vfilllimit{0.7} % \envdef\group{% \ifnum\catcode`\^^M=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \startsavinginserts % \setbox\groupbox = \vtop\bgroup % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % The \vtop produces a box with normal height and large depth; thus, TeX puts % \baselineskip glue before it, and (when the next line of text is done) % \lineskip glue after it. Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% % To get correct interline space between the last line of the group % and the first line afterwards, we have to propagate \prevdepth. \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \pageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\pageheight \page \fi \fi \box\groupbox \prevdepth = \dimen1 \checkinserts } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in % Old definition--didn't work. %\parseargdef\need{\par % %% This method tries to make TeX break the page naturally %% if the depth of the box does not fit. %{\baselineskip=0pt% %\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak %\prevdepth=-1000pt %}} \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion % class. WHICH is `l' or `r'. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @include file insert text of that file as input. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable \def\temp{\input #1 }% \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \catcode`^=\other \catcode`_=\other \catcode`|=\other \catcode`<=\other \catcode`>=\other \catcode`+=\other \catcode`-=\other } \def\pushthisfilestack{% \expandafter\pushthisfilestackX\popthisfilestack\StackTerm } \def\pushthisfilestackX{% \expandafter\pushthisfilestackY\thisfile\StackTerm } \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% } \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} \def\thisfile{} % @center line % outputs that line, centered. % \parseargdef\center{% \ifhmode \let\next\centerH \else \let\next\centerV \fi \next{\hfil \ignorespaces#1\unskip \hfil}% } \def\centerH#1{% {% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }% } \def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}} % @sp n outputs n lines of vertical space \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment \def\comment{\begingroup \catcode`\^^M=\other% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \commentxxx} {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} \let\c=\comment % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % NCHARS can also be the word `asis' or `none'. % We cannot feasibly implement @paragraphindent asis, though. % \def\asisword{asis} % no translation, these are keywords \def\noneword{none} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % We'll use ems for NCHARS like @paragraphindent. % It seems @exampleindent asis isn't necessary, but % I preserve it to make it similar to @paragraphindent. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \fi } % @firstparagraphindent WORD % If WORD is `none', then suppress indentation of the first paragraph % after a section heading. If WORD is `insert', then do indent at such % paragraphs. % % The paragraph indentation is suppressed or not by calling % \suppressfirstparagraphindent, which the sectioning commands do. % We switch the definition of this back and forth according to WORD. % By default, we suppress indentation. % \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} \def\insertword{insert} % \parseargdef\firstparagraphindent{% \def\temp{#1}% \ifx\temp\noneword \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent \else\ifx\temp\insertword \let\suppressfirstparagraphindent = \relax \else \errhelp = \EMsimple \errmessage{Unknown @firstparagraphindent option `\temp'}% \fi\fi } % Here is how we actually suppress indentation. Redefine \everypar to % \kern backwards by \parindent, and then reset itself to empty. % % We also make \indent itself not actually do anything until the next % paragraph. % \gdef\dosuppressfirstparagraphindent{% \gdef\indent{% \restorefirstparagraphindent \indent }% \gdef\noindent{% \restorefirstparagraphindent \noindent }% \global\everypar = {% \kern -\parindent \restorefirstparagraphindent }% } \gdef\restorefirstparagraphindent{% \global \let \indent = \ptexindent \global \let \noindent = \ptexnoindent \global \everypar = {}% } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ active, and distinguish by seeing if the current family is \slfam, % which is what @var uses. { \catcode`\_ = \active \gdef\mathunderscore{% \catcode`\_=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a \ character. % FYI, plain.tex uses \\ as a temporary control sequence (why?), but % this is not advertised and we don't care. Texinfo does not % otherwise define @\. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \tex \mathunderscore \let\\ = \mathbackslash \mathactive $\finishmath } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. % Some active characters (such as <) are spaced differently in math. % We have to reset their definitions in case the @math was an argument % to a command which sets the catcodes (such as @item or @section). % { \catcode`^ = \active \catcode`< = \active \catcode`> = \active \catcode`+ = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus } } % @bullet and @minus need the same treatment as @math, just above. \def\bullet{$\ptexbullet$} \def\minus{$-$} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @comma{} is so commas can be inserted into text without messing up % Texinfo's parsing. % \let\comma = , % @refill is a no-op. \let\refill=\relax % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate (before @setfilename). % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \fixbackslash % Turn off hack to swallow `\input texinfo'. \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi % \openindices needs to do some work in any case. \openindices \let\setfilename=\comment % Ignore extra @setfilename cmds. % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 % \comment % Ignore the actual filename. } % Called from \setfilename. % \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as \undefined, % borrowed from ifpdf.sty. \ifx\pdfoutput\undefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. % http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html % (and related messages, the final outcome is that it is up to the TeX % user to double the backslashes and otherwise make the string valid, so % that's what we do). % double active backslashes. % {\catcode`\@=0 \catcode`\\=\active @gdef@activebackslashdouble{% @catcode`@\=@active @let\=@doublebackslash} } % To handle parens, we must adopt a different approach, since parens are % not active characters. hyperref.dtx (which has the same problem as % us) handles it with this amazing macro to replace tokens, with minor % changes for Texinfo. It is included here under the GPL by permission % from the author, Heiko Oberdiek. % % #1 is the tokens to replace. % #2 is the replacement. % #3 is the control sequence with the string. % \def\HyPsdSubst#1#2#3{% \def\HyPsdReplace##1#1##2\END{% ##1% \ifx\\##2\\% \else #2% \HyReturnAfterFi{% \HyPsdReplace##2\END }% \fi }% \xdef#3{\expandafter\HyPsdReplace#3#1\END}% } \long\def\HyReturnAfterFi#1\fi{\fi#1} % #1 is a control sequence in which to do the replacements. \def\backslashparens#1{% \xdef#1{#1}% redefine it as its expansion; the definition is simply % \lastnode when called from \setref -> \pdfmkdest. \HyPsdSubst{(}{\realbackslash(}{#1}% \HyPsdSubst{)}{\realbackslash)}{#1}% } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images with PDF output, and none of those formats could be found. (.eps cannot be supported due to the design of the PDF format; use regular TeX (DVI output) for that.)} \ifpdf \input pdfcolor \pdfcatalog{/PageMode /UseOutlines} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .png, .jpg, .pdf (among % others). Let's try in that order. \let\pdfimgext=\empty \begingroup \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \openin 1 #1.pdf \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{pdf}% \fi \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \fi \closein 1 \endgroup % % without \immediate, pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifdim \wd0 >0pt width \imagewidth \fi \ifdim \wd2 >0pt height \imageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\pdfmkdest#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \turnoffactive \activebackslashdouble \makevalueexpandable \def\pdfdestname{#1}% \backslashparens\pdfdestname \pdfdest name{\pdfdestname} xyz% }} % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % \let\linkcolor = \Blue % was Cyan, but that seems light? \def\endlink{\Black\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #1 is the section text, which is what will be displayed in the % outline by the pdf viewer. #2 is the pdf expression for the number % of subentries (or empty, for subsubsections). #3 is the node text, % which might be empty if this toc entry had no corresponding node. % #4 is the page number % \def\dopdfoutline#1#2#3#4{% % Generate a link to the node text if that exists; else, use the % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. \def\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else % Doubled backslashes in the name. {\activebackslashdouble \xdef\pdfoutlinedest{#3}% \backslashparens\pdfoutlinedest}% \fi % % Also double the backslashes in the display string. {\activebackslashdouble \xdef\pdfoutlinetext{#1}% \backslashparens\pdfoutlinetext}% % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Thanh's hack / proper braces in bookmarks \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace % % Read toc silently, to get counts of subentries for \pdfoutline. \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \def\thissecnum{0}% \def\thissubsecnum{0}% }% \def\numsecentry##1##2##3##4{% \advancenumber{chap\thischapnum}% \def\thissecnum{##2}% \def\thissubsecnum{0}% }% \def\numsubsecentry##1##2##3##4{% \advancenumber{sec\thissecnum}% \def\thissubsecnum{##2}% }% \def\numsubsubsecentry##1##2##3##4{% \advancenumber{subsec\thissubsecnum}% }% \def\thischapnum{0}% \def\thissecnum{0}% \def\thissubsecnum{0}% % % use \def rather than \let here because we redefine \chapentry et % al. a second time, below. \def\appentry{\numchapentry}% \def\appsecentry{\numsecentry}% \def\appsubsecentry{\numsubsecentry}% \def\appsubsubsecentry{\numsubsubsecentry}% \def\unnchapentry{\numchapentry}% \def\unnsecentry{\numsecentry}% \def\unnsubsecentry{\numsubsecentry}% \def\unnsubsubsecentry{\numsubsubsecentry}% \readdatafile{toc}% % % Read toc second time, this time actually producing the outlines. % The `-' means take the \expnumber as the absolute number of % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. \def\numchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% count is always zero \dopdfoutline{##1}{}{##3}{##4}}% % % PDF outlines are displayed using system fonts, instead of % document fonts. Therefore we cannot use special characters, % since the encoding is unknown. For example, the eogonek from % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % % xx to do this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Right % now, I guess we'll just let the pdf reader have its way. \indexnofonts \setupdatafile \catcode`\\=\active \otherbackslash \input \jobname.toc \endgroup } % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \ifx\p\space\else\addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \fi \nextsp} \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable \leavevmode\Red \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \linkcolor #1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\linkcolor = \relax \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput \message{fonts,} % Change the current font style to #1, remembering it in \curfontstyle. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in % italics, not bold italics. % \def\setfontstyle#1{% \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. \csname ten#1\endcsname % change the current font } % Select #1 fonts with the current style. % \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} \def\rm{\fam=0 \setfontstyle{rm}} \def\it{\fam=\itfam \setfontstyle{it}} \def\sl{\fam=\slfam \setfontstyle{sl}} \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} \def\tt{\fam=\ttfam \setfontstyle{tt}} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % Default leading. \newdimen\textleading \textleading = 13.2pt % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % \def\setleading#1{% \normalbaselineskip = #1\relax \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % Set the font macro #1 to the font named #2, adding on the % specified font prefix (normally `cm'). % #3 is the font's design size, #4 is a scale factor \def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4} % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\undefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} %where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Definitions for a main text size of 11pt. This is the default in % Texinfo. % \def\definetextfontsizexi{ % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep} \setfont\texttt\ttshape{10}{\mainmagstep} \setfont\textbf\bfshape{10}{\mainmagstep} \setfont\textit\itshape{10}{\mainmagstep} \setfont\textsl\slshape{10}{\mainmagstep} \setfont\textsf\sfshape{10}{\mainmagstep} \setfont\textsc\scshape{10}{\mainmagstep} \setfont\textttsl\ttslshape{10}{\mainmagstep} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1} \setfont\deftt\ttshape{10}{\magstep1} \setfont\defttsl\ttslshape{10}{\magstep1} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000} \setfont\smalltt\ttshape{9}{1000} \setfont\smallbf\bfshape{10}{900} \setfont\smallit\itshape{9}{1000} \setfont\smallsl\slshape{9}{1000} \setfont\smallsf\sfshape{9}{1000} \setfont\smallsc\scshape{10}{900} \setfont\smallttsl\ttslshape{10}{900} \font\smalli=cmmi9 \font\smallsy=cmsy9 % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000} \setfont\smallertt\ttshape{8}{1000} \setfont\smallerbf\bfshape{10}{800} \setfont\smallerit\itshape{8}{1000} \setfont\smallersl\slshape{8}{1000} \setfont\smallersf\sfshape{8}{1000} \setfont\smallersc\scshape{10}{800} \setfont\smallerttsl\ttslshape{10}{800} \font\smalleri=cmmi8 \font\smallersy=cmsy8 % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3} \setfont\titleit\itbshape{10}{\magstep4} \setfont\titlesl\slbshape{10}{\magstep4} \setfont\titlett\ttbshape{12}{\magstep3} \setfont\titlettsl\ttslshape{10}{\magstep4} \setfont\titlesf\sfbshape{17}{\magstep1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\authorrm{\secrm} \def\authortt{\sectt} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2} \setfont\chapit\itbshape{10}{\magstep3} \setfont\chapsl\slbshape{10}{\magstep3} \setfont\chaptt\ttbshape{12}{\magstep2} \setfont\chapttsl\ttslshape{10}{\magstep3} \setfont\chapsf\sfbshape{17}{1000} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1} \setfont\secit\itbshape{10}{\magstep2} \setfont\secsl\slbshape{10}{\magstep2} \setfont\sectt\ttbshape{12}{\magstep1} \setfont\secttsl\ttslshape{10}{\magstep2} \setfont\secsf\sfbshape{12}{\magstep1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf} \setfont\ssecit\itbshape{10}{1315} \setfont\ssecsl\slbshape{10}{1315} \setfont\ssectt\ttbshape{12}{\magstephalf} \setfont\ssecttsl\ttslshape{10}{1315} \setfont\ssecsf\sfbshape{12}{\magstephalf} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 % Reduced fonts for @acro in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000} \setfont\reducedtt\ttshape{10}{1000} \setfont\reducedbf\bfshape{10}{1000} \setfont\reducedit\itshape{10}{1000} \setfont\reducedsl\slshape{10}{1000} \setfont\reducedsf\sfshape{10}{1000} \setfont\reducedsc\scshape{10}{1000} \setfont\reducedttsl\ttslshape{10}{1000} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 % reset the current fonts \textfonts \rm } % end of 11pt text font size definitions % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep} \setfont\texttt\ttshape{10}{\mainmagstep} \setfont\textbf\bfshape{10}{\mainmagstep} \setfont\textit\itshape{10}{\mainmagstep} \setfont\textsl\slshape{10}{\mainmagstep} \setfont\textsf\sfshape{10}{\mainmagstep} \setfont\textsc\scshape{10}{\mainmagstep} \setfont\textttsl\ttslshape{10}{\mainmagstep} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf} \setfont\deftt\ttshape{10}{\magstephalf} \setfont\defttsl\ttslshape{10}{\magstephalf} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000} \setfont\smalltt\ttshape{9}{1000} \setfont\smallbf\bfshape{10}{900} \setfont\smallit\itshape{9}{1000} \setfont\smallsl\slshape{9}{1000} \setfont\smallsf\sfshape{9}{1000} \setfont\smallsc\scshape{10}{900} \setfont\smallttsl\ttslshape{10}{900} \font\smalli=cmmi9 \font\smallsy=cmsy9 % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000} \setfont\smallertt\ttshape{8}{1000} \setfont\smallerbf\bfshape{10}{800} \setfont\smallerit\itshape{8}{1000} \setfont\smallersl\slshape{8}{1000} \setfont\smallersf\sfshape{8}{1000} \setfont\smallersc\scshape{10}{800} \setfont\smallerttsl\ttslshape{10}{800} \font\smalleri=cmmi8 \font\smallersy=cmsy8 % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3} \setfont\titleit\itbshape{10}{\magstep4} \setfont\titlesl\slbshape{10}{\magstep4} \setfont\titlett\ttbshape{12}{\magstep3} \setfont\titlettsl\ttslshape{10}{\magstep4} \setfont\titlesf\sfbshape{17}{\magstep1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\authorrm{\secrm} \def\authortt{\sectt} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1} \setfont\chapit\itbshape{10}{\magstep2} \setfont\chapsl\slbshape{10}{\magstep2} \setfont\chaptt\ttbshape{12}{\magstep1} \setfont\chapttsl\ttslshape{10}{\magstep2} \setfont\chapsf\sfbshape{12}{\magstep1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000} \setfont\secit\itbshape{10}{\magstep1} \setfont\secsl\slbshape{10}{\magstep1} \setfont\sectt\ttbshape{12}{1000} \setfont\secttsl\ttslshape{10}{\magstep1} \setfont\secsf\sfbshape{12}{1000} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000} \setfont\ssecit\itbshape{10}{1000} \setfont\ssecsl\slbshape{10}{1000} \setfont\ssectt\ttbshape{10}{1000} \setfont\ssecttsl\ttslshape{10}{1000} \setfont\ssecsf\sfbshape{10}{1000} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000} \font\sseci=cmmi10 \font\ssecsy=cmsy10 % Reduced fonts for @acro in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000} \setfont\reducedtt\ttshape{9}{1000} \setfont\reducedbf\bfshape{10}{900} \setfont\reducedit\itshape{9}{1000} \setfont\reducedsl\slshape{9}{1000} \setfont\reducedsf\sfshape{9}{1000} \setfont\reducedsc\scshape{10}{900} \setfont\reducedttsl\ttslshape{10}{900} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 % reduce space between paragraphs \divide\parskip by 2 % reset the current fonts \textfonts \rm } % end of 10pt text font size definitions % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xword{10} \def\xiword{11} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% \wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts except % in the main text, we don't bother to reset \scriptfont and % \scriptscriptfont (which would also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf \textfont\ttfam=\tentt \textfont\sffam=\tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this because \STYLE needs to also set the % current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire % \tenSTYLE to set the current font. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used in % the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \def\curfontsize{text}% \def\lsize{reduced}\def\lllsize{smaller}% \resetmathfonts \setleading{\textleading}} \def\titlefonts{% \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy \let\tenttsl=\titlettsl \def\curfontsize{title}% \def\lsize{chap}\def\lllsize{subsec}% \resetmathfonts \setleading{25pt}} \def\titlefont#1{{\titlefonts\rm #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl \def\curfontsize{chap}% \def\lsize{sec}\def\lllsize{text}% \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl \def\curfontsize{sec}% \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl \def\curfontsize{ssec}% \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} \let\subsubsecfonts = \subsecfonts \def\reducedfonts{% \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy \let\tenttsl=\reducedttsl \def\curfontsize{reduced}% \def\lsize{small}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallfonts{% \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy \let\tenttsl=\smallttsl \def\curfontsize{small}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallerfonts{% \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy \let\tenttsl=\smallerttsl \def\curfontsize{smaller}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{9.5pt}} % Set the fonts to use with the @small... environments. \let\smallexamplefonts = \smallfonts % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample % can fit this many characters: % 8.5x11=86 smallbook=72 a4=90 a5=69 % If we use \scriptfonts (8pt), then we can fit this many characters: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 % For me, subjectively, the few extra characters that fit aren't worth % the additional smallness of 8pt. So I'm making the default 9pt. % % By the way, for comparison, here's what fits with @example (10pt): % 8.5x11=71 smallbook=60 a4=75 a5=58 % % I wish the USA used A4 paper. % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi % Define these so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000} \setfont\shortcontbf\bfshape{10}{\magstep1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000} \setfont\shortconttt\ttshape{12}{1000} %% Add scribe-like font environments, plus @l for inline lisp (usually sans %% serif) and @ii for TeX italic % \smartitalic{ARG} outputs arg in italics, followed by an italic correction % unless the following character is such as not to need one. \def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else \ptexslash\fi\fi\fi} \def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} \def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} % like \smartslanted except unconditionally uses \ttsl. % @var is set to this for defun arguments. \def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx} % like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitalicx} \let\i=\smartitalic \let\slanted=\smartslanted \let\var=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % @b, explicit bold. \def\b#1{{\bf #1}} \let\strong=\b % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } % Set sfcode to normal for the chars that usually have another value. % Can't use plain's \frenchspacing because it uses the `\x notation, and % sometimes \x has an active definition that messes things up. % \catcode`@=11 \def\plainfrenchspacing{% \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \def\endofsentencespacefactor{3000}% default \def\t#1{% {\tt \rawbackslash \plainfrenchspacing #1}% \null } \def\samp#1{`\tclose{#1}'\null} \setfont\keyrm\rmshape{8}{1000} \font\keysy=cmsy9 \def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% \vbox{\hrule\kern-0.4pt \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% \kern-0.4pt\hrule}% \kern-.06em\raise0.4pt\hbox{\angleright}}}} \def\key #1{{\nohyphenation \uppercase{#1}}\null} % The old definition, with no lozenge: %\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} \def\ctrl #1{{\tt \rawbackslash \hat}#1} % @file, @option are the same as @samp. \let\file=\samp \let\option=\samp % @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \rawbackslash \plainfrenchspacing #1% }% \null } % We *must* turn on hyphenation at `-' and `_' in @code. % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. % -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active % \global\def\code{\begingroup \catcode\rquoteChar=\active \catcode\lquoteChar=\active \let'\codequoteright \let`\codequoteleft % \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\realdash \let_\realunder \fi \codex } } \def\realdash{-} \def\codedash{-\discretionary{}{}{}} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } \def\codex #1{\tclose{#1}\endgroup} % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is undesirable in % some manuals, especially if they don't have long identifiers in % general. @allowcodebreaks provides a way to control this. % \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} \def\keywordfalse{false} \parseargdef\allowcodebreaks{% \def\txiarg{#1}% \ifx\txiarg\keywordtrue \allowcodebreakstrue \else\ifx\txiarg\keywordfalse \allowcodebreaksfalse \else \errhelp = \EMsimple \errmessage{Unknown @allowcodebreaks option `\txiarg'}% \fi\fi } % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \parseargdef\kbdinputstyle{% \def\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle option `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct.' \kbdinputstyle distinct \def\xkey{\key} \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\look}}\fi \else{\tclose{\kbdfont\look}}\fi} % For @indicateurl, @env, @command quotes seem unnecessary, so use \code. \let\indicateurl=\code \let\env=\code \let\command=\code % @uref (abbreviation for `urlref') takes an optional (comma-separated) % second argument specifying the text to display and an optional third % arg as text to display instead of (rather than in addition to) the url % itself. First (mandatory) arg is the url. Perhaps eventually put in % a hypertex \special here. % \def\uref#1{\douref #1,,,\finish} \def\douref#1,#2,#3,#4\finish{\begingroup \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url \fi \else \code{#1}% only url given, so show it \fi \fi \endlink \endgroup} % @url synonym for @uref, since that's how everyone uses it. % \let\url=\uref % rms does not like angle brackets --karl, 17may97. % So now @email is just like @uref, unless we are pdf. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdf \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} % @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. % \def\acronym#1{\doacronym #1,,\finish} \def\doacronym#1,#2,#3\finish{% {\selectfonts\lsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi } % @abbr for "Comput. J." and the like. % No font change, but don't do end-of-sentence spacing. % \def\abbr#1{\doabbr #1,,\finish} \def\doabbr#1,#2,#3\finish{% {\plainfrenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi } % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{{\it\$}} % @euro{} comes from a separate font, depending on the current style. % We use the free feym* fonts from the eurosym package by Henrik % Theiling, which support regular, slanted, bold and bold slanted (and % "outlined" (blackboard board, sort of) versions, which we don't need). % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. % % Although only regular is the truly official Euro symbol, we ignore % that. The Euro is designed to be slightly taller than the regular % font height. % % feymr - regular % feymo - slanted % feybr - bold % feybo - bold slanted % % There is no good (free) typewriter version, to my knowledge. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. % Hmm. % % Also doesn't work in math. Do we need to do math with euro symbols? % Hope not. % % \def\euro{{\eurofont e}} \def\eurofont{% % We set the font at each command, rather than predefining it in % \textfonts and the other font-switching commands, so that % installations which never need the symbol don't have to have the % font installed. % % There is only one designed size (nominal 10pt), so we always scale % that to the current nominal size. % % By the way, simply using "at 1em" works for cmr10 and the like, but % does not work for cmbx10 and other extended/shrunken fonts. % \def\eurosize{\csname\curfontsize nominalsize\endcsname}% % \ifx\curfontstyle\bfstylename % bold: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize \else % regular: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize \fi \thiseurofont } % @registeredsymbol - R in a circle. The font for the R should really % be smaller yet, but lllsize is the best we can do for now. % Adapted from the plain.tex definition of \copyright. % \def\registeredsymbol{% $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. % \ifx\Orb\undefined \def\Orb{\mathhexbox20D} \fi \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % \newif\ifsetcontentsaftertitlepage \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue \parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \let\page = \oldpage \page \null }% } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup % % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon % % If they want short, they certainly want long too. \ifsetshortcontentsaftertitlepage \shortcontents \contents \global\let\shortcontents = \relax \global\let\contents = \relax \fi % \ifsetcontentsaftertitlepage \contents \global\let\contents = \relax \global\let\shortcontents = \relax \fi } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } %%% Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines \let\tt=\authortt} \parseargdef\title{% \checkenv\titlepage \leftline{\titlefonts\rm #1} % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt } \parseargdef\subtitle{% \checkenv\titlepage {\subtitlefont \rightline{#1}}% } % @author should come last, but may come many times. % It can also be used inside @quotation. % \parseargdef\author{% \def\temp{\quotation}% \ifx\thisenv\temp \def\quotationauthor{#1}% printed in \Equotation. \else \checkenv\titlepage \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi {\authorfont \leftline{#1}}% \fi } %%% Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \def\evenfooting{\parsearg\evenfootingxxx} \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddfooting{\parsearg\oddfootingxxx} \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\pageheight by -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\HEADINGSoff{% \global\evenheadline={\hfil} \global\evenfootline={\hfil} \global\oddheadline={\hfil} \global\oddfootline={\hfil}} \HEADINGSoff % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\undefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @ftable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. However, if % what follows is an environment such as @example, there will be no % \parskip glue; then the negative vskip we just inserted would % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \envdef\table{% \let\itemindex\gobble \tablecheck{table}% } \envdef\ftable{% \def\itemindex ##1{\doind {fn}{\code{##1}}}% \tablecheck{ftable}% } \envdef\vtable{% \def\itemindex ##1{\doind {vr}{\code{##1}}}% \tablecheck{vtable}% } \def\tablecheck#1{% \ifnum \the\catcode`\^^M=\active \endgroup \errmessage{This command won't work in this context; perhaps the problem is that we are \inenvironment\thisenv}% \def\next{\doignore{#1}}% \else \let\next\tablex \fi \next } \def\tablex#1{% \def\itemindicate{#1}% \parsearg\tabley } \def\tabley#1{% {% \makevalueexpandable \edef\temp{\noexpand\tablez #1\space\space\space}% \expandafter }\temp \endtablez } \def\tablez #1 #2 #3 #4\endtablez{% \aboveenvbreak \ifnum 0#1>0 \advance \leftskip by #1\mil \fi \ifnum 0#2>0 \tableindent=#2\mil \fi \ifnum 0#3>0 \advance \rightskip by #3\mil \fi \itemmax=\tableindent \advance \itemmax by -\itemmargin \advance \leftskip by \tableindent \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi \let\item = \internalBitem \let\itemx = \internalBitemx } \def\Etable{\endgraf\afterenvbreak} \let\Eftable\Etable \let\Evtable\Etable \let\Eitemize\Etable \let\Eenumerate\Etable % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \envdef\itemize{\parsearg\doitemize} \def\doitemize#1{% \aboveenvbreak \itemmax=\itemindent \advance\itemmax by -\itemmargin \advance\leftskip by \itemindent \exdentamount=\itemindent \parindent=0pt \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi \def\itemcontents{#1}% % @itemize with no arg is equivalent to @itemize @bullet. \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi \let\item=\itemizeitem } % Definition of @item while inside @itemize and @enumerate. % \def\itemizeitem{% \advance\itemno by 1 % for enumerations {\let\par=\endgraf \smallbreak}% reasonable place to break {% % If the document has an @itemize directly after a section title, a % \nobreak will be last on the list, and \sectionheading will have % done a \vskip-\parskip. In that case, we don't want to zero % parskip, or the item text will crash with the heading. On the % other hand, when there is normal text preceding the item (as there % usually is), we do want to zero parskip, or there would be too much % space. In that case, we won't have a \nobreak before. At least % that's the theory. \ifnum\lastpenalty<10000 \parskip=0in \fi \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% \vadjust{\penalty 1200}}% not good to break after first line of item. \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call \doitemize, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \doitemize{#1.}\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % Each new table line starts with @item, each subsequent new column % starts with @tab. Empty columns may be produced by supplying @tab's % with nothing between them for as many times as empty columns are needed, % ie, @tab@tab@tab will produce two empty columns. % @item, @tab do not need to be on their own lines, but it will not hurt % if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #1 is the @columnfraction, usually a decimal number like .5, but might % be just 1. We just use it, whatever it is. % \def\pickupwholefraction#1 {% \global\advance\colcount by 1 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a % separator; typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi \fi \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % multitable-only commands. % % @headitem starts a heading row, which we typeset in bold. % Assignments have to be global since we are inside the implicit group % of an alignment entry. Note that \everycr resets \everytab. \def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}% % % A \tab used to include \hskip1sp. But then the space in a template % line is not enough. That is bad. So let's go back to just `&' until % we encounter the problem it was intended to solve again. % --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% % @multitable ... @end multitable definitions: % \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \startsavinginserts % % @item within a multitable starts a normal row. % We use \def instead of \let so that if one of the multitable entries % contains an @itemize, we don't choke on the \item (seen as \crcr aka % \endtemplate) expanding \doitemize. \def\item{\crcr}% % \tolerance=9500 \hbadness=9500 \setmultitablespacing \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% \global\colcount=0 % Reset the column counter. % Check for saved footnotes, etc. \checkinserts % Keeps underfull box messages off when table breaks over pages. %\filbreak % Maybe so, but it also creates really weird page breaks when the % table breaks over pages. Wouldn't \vfil be better? Wait until the % problem manifests itself, so it can be fixed for real --karl. }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 \multistrut \vtop{% % Use the current \colcount to find the correct column width: \hsize=\expandafter\csname col\the\colcount\endcsname % % In order to keep entries from bumping into each other % we will add a \leftskip of \multitablecolspace to all columns after % the first one. % % If a template has been used, we will add \multitablecolspace % to the width of each template entry. % % If the user has set preamble in terms of percent of \hsize we will % use that dimension as the width of the column, and the \leftskip % will keep entries from bumping into each other. Table will start at % left margin and final column will justify at right margin. % % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 % The first column will be indented with the surrounding text. \advance\hsize by\leftskip \else \ifsetpercent \else % If user has not set preamble in terms of percent of \hsize % we will advance \hsize by \multitablecolspace. \advance\hsize by \multitablecolspace \fi % In either case we will make \leftskip=\multitablecolspace: \leftskip=\multitablecolspace \fi % Ignoring space at the beginning and end avoids an occasional spurious % blank line, when TeX decides to break the line at the space before the % box from the multistrut, so the strut ends up on a line by itself. % For example: % @multitable @columnfractions .11 .89 % @item @code{#} % @tab Legal holiday which is valid in major parts of the whole country. % Is automatically provided with highlighting sequences respectively % marking characters. \noindent\ignorespaces##\unskip\multistrut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \def\setmultitablespacing{% \def\multistrut{\strut}% just use the standard line spacing % % Compute \multitablelinespace (if not defined by user) for use in % \multitableparskip calculation. We used define \multistrut based on % this, but (ironically) that caused the spacing to be off. % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. \ifdim\multitablelinespace=0pt \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip \global\advance\multitablelinespace by-\ht0 \fi %% Test to see if parskip is larger than space between lines of %% table. If not, do nothing. %% If so, set to same dimension as multitablelinespace. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller %% than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller %% than skip between lines in the table. \fi} \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't % attempt to close an environment group. % \def\makecond#1{% \expandafter\let\csname #1\endcsname = \relax \expandafter\let\csname iscond.#1\endcsname = 1 } \makecond{iftex} \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} \makecond{ifnotplaintext} \makecond{ifnotxml} % Ignore @ignore, @ifhtml, @ifinfo, and the like. % \def\direntry{\doignore{direntry}} \def\documentdescription{\doignore{documentdescription}} \def\docbook{\doignore{docbook}} \def\html{\doignore{html}} \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} % Ignore text until a line `@end #1', keeping track of nested conditionals. % % A count to remember the depth of nesting. \newcount\doignorecount \def\doignore#1{\begingroup % Scan in ``verbatim'' mode: \obeylines \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \spaceisspace % % Count number of #1's that we've seen. \doignorecount = 0 % % Swallow text until we reach the matching `@end #1'. \dodoignore{#1}% } { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. \obeylines % % \gdef\dodoignore#1{% % #1 contains the command name as a string, e.g., `ifinfo'. % % Define a command to find the next `@end #1'. \long\def\doignoretext##1^^M@end #1{% \doignoretextyyy##1^^M@#1\_STOP_}% % % And this command to find another #1 command, at the beginning of a % line. (Otherwise, we would consider a line `@c @ifset', for % example, to count as an @ifset for nesting.) \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% % % And now expand that command. \doignoretext ^^M% }% } \def\doignoreyyy#1{% \def\temp{#1}% \ifx\temp\empty % Nothing found. \let\next\doignoretextzzz \else % Found a nested condition, ... \advance\doignorecount by 1 \let\next\doignoretextyyy % ..., look for another. % If we're here, #1 ends with ^^M\ifinfo (for example). \fi \next #1% the token \_STOP_ is present just after this macro. } % We have to swallow the remaining "\_STOP_". % \def\doignoretextzzz#1{% \ifnum\doignorecount = 0 % We have just found the outermost @end. \let\next\enddoignore \else % Still inside a nested condition. \advance\doignorecount by -1 \let\next\doignoretext % Look for the next @end. \fi \next } % Finish off ignored text. { \obeylines% % Ignore anything after the last `@end #1'; this matters in verbatim % environments, where otherwise the newline after an ignored conditional % would result in a blank line in the output. \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \makevalueexpandable \def\temp{#2}% \edef\next{\gdef\makecsname{SET#1}}% \ifx\temp\empty \next{}% \else \setzzz#2\endsetzzz \fi }% } % Remove the trailing space \setxxx inserted. \def\setzzz#1 \endsetzzz{\next{#1}} % @clear VAR clears (i.e., unsets) the variable VAR. % \parseargdef\clear{% {% \makevalueexpandable \global\expandafter\let\csname SET#1\endcsname=\relax }% } % @value{foo} gets the text saved in variable foo. \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { \catcode`\- = \active \catcode`\_ = \active % \gdef\makevalueexpandable{% \let\value = \expandablevalue % We don't want these characters active, ... \catcode`\-=\other \catcode`\_=\other % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. \let-\realdash \let_\normalunderscore } } % We have this subroutine so that we can handle at least some @value's % properly in indexes (we call \makevalueexpandable in \indexdummies). % The command has to be fully expandable (if the variable is set), since % the result winds up in the index file. This means that if the % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). % \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% \message{Variable `#1', used in @value, is not set.}% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get special treatment of `@end ifset,' call \makeond and the redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} \def\doifset#1#2{% {% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname SET#2\endcsname\relax #1% If not set, redefine \next. \fi \expandafter }\next } \def\ifsetfail{\doignore{ifset}} % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the % above code: if the variable is not set, do nothing, if it is set, % then redefine \next to \ifclearfail. % \makecond{ifclear} \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment % @defininfoenclose. \let\definfoenclose=\comment \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \fi \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 \fi \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% % Only do \closeout if we haven't already done it, else we'll end up % closing the target index. \expandafter \ifx\csname donesynindex#2\endcsname \undefined % The \closeout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. \expandafter\closeout\csname#2indfile\endcsname \expandafter\let\csname\donesynindex#2\endcsname = 1 \fi % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} % Take care of Texinfo commands that can appear in an index entry. % Since there are some commands we want to expand, and others we don't, % we have to laboriously prevent expansion for those that we don't. % \def\indexdummies{% \escapechar = `\\ % use backslash in output files. \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % % Need these in case \tex is in effect and \{ is a \delimiter again. % But can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. \let\{ = \mylbrace \let\} = \myrbrace % % I don't entirely understand this, but when an index entry is % generated from a macro call, the \endinput which \scanmacro inserts % causes processing to be prematurely terminated. This is, % apparently, because \indexsorttmp is fully expanded, and \endinput % is an expandable command. The redefinition below makes \endinput % disappear altogether for that purpose -- although logging shows that % processing continues to some further point. On the other hand, it % seems \endinput does not hurt in the printed index arg, since that % is still getting written without apparent harm. % % Sample source (mac-idx3.tex, reported by Graham Percival to % help-texinfo, 22may06): % @macro funindex {WORD} % @findex xyz % @end macro % ... % @funindex commtest % % The above is not enough to reproduce the bug, but it gives the flavor. % % Sample whatsit resulting: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} % % So: \let\endinput = \empty % % Do the redefinitions. \commondummies } % For the aux and toc files, @ is the escape character. So we want to % redefine everything using @ as the escape character (instead of % \realbackslash, still used for index files). When everything uses @, % this will be simpler. % \def\atdummies{% \def\@{@@}% \def\ {@ }% \let\{ = \lbraceatcmd \let\} = \rbraceatcmd % % Do the redefinitions. \commondummies \otherbackslash } % Called from \indexdummies and \atdummies. % \def\commondummies{% % % \definedummyword defines \#1 as \string\#1\space, thus effectively % preventing its expansion. This is used only for control% words, % not control letters, because the \space would be incorrect for % control characters, but is needed to separate the control word % from whatever follows. % % For control letters, we have \definedummyletter, which omits the % space. % % These can be used both for control words that take an argument and % those that do not. If it is followed by {arg} in the input, then % that will dutifully get written to the index (or wherever). % \def\definedummyword ##1{\def##1{\string##1\space}}% \def\definedummyletter##1{\def##1{\string##1}}% \let\definedummyaccent\definedummyletter % \commondummiesnofonts % \definedummyletter\_% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\L \definedummyword\OE \definedummyword\O \definedummyword\aa \definedummyword\ae \definedummyword\l \definedummyword\oe \definedummyword\o \definedummyword\ss \definedummyword\exclamdown \definedummyword\questiondown \definedummyword\ordf \definedummyword\ordm % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword\bf \definedummyword\gtr \definedummyword\hat \definedummyword\less \definedummyword\sf \definedummyword\sl \definedummyword\tclose \definedummyword\tt % \definedummyword\LaTeX \definedummyword\TeX % % Assorted special characters. \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\expansion \definedummyword\minus \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\result \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist % \normalturnoffactive % % Handle some cases of @value -- where it does not contain any % (non-fully-expandable) commands. \makevalueexpandable } % \commondummiesnofonts: common to \commondummies and \indexnofonts. % \def\commondummiesnofonts{% % Control letters and accents. \definedummyletter\!% \definedummyaccent\"% \definedummyaccent\'% \definedummyletter\*% \definedummyaccent\,% \definedummyletter\.% \definedummyletter\/% \definedummyletter\:% \definedummyaccent\=% \definedummyletter\?% \definedummyaccent\^% \definedummyaccent\`% \definedummyaccent\~% \definedummyword\u \definedummyword\v \definedummyword\H \definedummyword\dotaccent \definedummyword\ringaccent \definedummyword\tieaccent \definedummyword\ubaraccent \definedummyword\udotaccent \definedummyword\dotless % % Texinfo font commands. \definedummyword\b \definedummyword\i \definedummyword\r \definedummyword\sc \definedummyword\t % % Commands that take arguments. \definedummyword\acronym \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn \definedummyword\emph \definedummyword\env \definedummyword\file \definedummyword\kbd \definedummyword\key \definedummyword\math \definedummyword\option \definedummyword\pxref \definedummyword\ref \definedummyword\samp \definedummyword\strong \definedummyword\tie \definedummyword\uref \definedummyword\url \definedummyword\var \definedummyword\verb \definedummyword\w \definedummyword\xref } % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string % would be for a given command (usually its argument). % \def\indexnofonts{% % Accent commands should become @asis. \def\definedummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% % Hopefully, all control words can become @asis. \let\definedummyword\definedummyaccent % \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |, etc. % Likewise with the other plain tex font commands. %\let\tt=\asis % \def\ { }% \def\@{@}% % how to handle braces? \def\_{\normalunderscore}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\aa{aa}% \def\ae{ae}% \def\l{l}% \def\oe{oe}% \def\o{o}% \def\ss{ss}% \def\exclamdown{!}% \def\questiondown{?}% \def\ordf{a}% \def\ordm{o}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\registeredsymbol{R}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% \def\expansion{==>}% \def\minus{-}% \def\pounds{pounds}% \def\point{.}% \def\print{-|}% \def\result{=>}% \def\textdegree{degrees}% % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % makeinfo does not expand macros in the argument to @deffn, which ends up % writing an index entry, and texindex isn't prepared for an index sort entry % that starts with \. % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % \macrolist } \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} % Workhorse for all \fooindexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % empty if called from \doind, as we usually are (the main exception % is with most defuns, which call us directly). % \def\dosubind#1#2#3{% \iflinks {% % Store the main index entry text (including the third arg). \toks0 = {#2}% % If third arg is present, precede it with a space. \def\thirdarg{#3}% \ifx\thirdarg\empty \else \toks0 = \expandafter{\the\toks0 \space #3}% \fi % \edef\writeto{\csname#1indfile\endcsname}% % \ifvmode \dosubindsanitize \else \dosubindwrite \fi }% \fi } % Write the entry in \toks0 to the index file: % \def\dosubindwrite{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% \fi % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash. % % Process the index entry with all font commands turned off, to % get the string to sort by. {\indexnofonts \edef\temp{\the\toks0}% need full expansion \xdef\indexsorttmp{\temp}% }% % % Set up the complete index entry, with both the sort key and % the original text, including any font commands. We write % three arguments to \entry to the .?? file (four in the % subentry case), texindex reduces to two when writing the .??s % sorted result. \edef\temp{% \write\writeto{% \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% }% \temp } % Take care of unwanted page breaks: % % If a skip is the last thing on the list now, preserve it % by backing up by \lastskip, doing the \write, then inserting % the skip again. Otherwise, the whatsit generated by the % \write will make \lastskip zero. The result is that sequences % like this: % @end defun % @tindex whatever % @defun ... % will have extra space inserted, because the \medbreak in the % start of the @defun won't see the skip inserted by the @end of % the previous defun. % % But don't do any of this if we're not in vertical mode. We % don't want to do a \vskip and prematurely end a paragraph. % % Avoid page breaks due to these extra skips, too. % % But wait, there is a catch there: % We'll have to check whether \lastskip is zero skip. \ifdim is not % sufficient for this purpose, as it ignores stretch and shrink parts % of the skip. The only way seems to be to check the textual % representation of the skip. % % The following is almost like \def\zeroskipmacro{0.0pt} except that % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). % \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} % % ..., ready, GO: % \def\dosubindsanitize{% % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \skip0 = \lastskip \edef\lastskipmacro{\the\lastskip}% \count255 = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\skip0 glue we're inserting is preceded by a % non-discardable item, therefore it is not a potential % breakpoint, therefore no \nobreak needed. \ifx\lastskipmacro\zeroskipmacro \else \vskip-\skip0 \fi % \dosubindwrite % \ifx\lastskipmacro\zeroskipmacro % If \lastskip was zero, perhaps the last item was a penalty, and % perhaps it was >=10000, e.g., a \nobreak. In that case, we want % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: % % @deffn deffn-whatever % @vindex index-whatever % Description. % would allow a break between the index-whatever whatsit % and the "Description." paragraph. \ifnum\count255>9999 \penalty\count255 \fi \else % On the other hand, if we had a nonzero \lastskip, % this make-up glue would be preceded by a non-discardable item % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\skip0 \fi } % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \everypar = {}% don't want the \kern\-parindent from indentation suppression. % % See if the index file exists and is nonempty. % Change catcode of @ here so that if the index file contains % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 \openin 1 \jobname.#1s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \else % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 \putwordIndexIsEmpty \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. \def\indexbackslash{\backslashcurfont}% \catcode`\\ = 0 \escapechar = `\\ \begindoublecolumns \input \jobname.#1s \enddoublecolumns \fi \fi \closein 1 \endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. \def\initial#1{{% % Some minor font changes for the special characters. \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt % % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. \nobreak \vskip 0pt plus 3\baselineskip \penalty 0 \vskip 0pt plus -3\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus .5\baselineskip \leftline{\secbf #1}% % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip }} % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % % A straightforward implementation would start like this: % \def\entry#1#2{... % But this frozes the catcodes in the argument, and can cause problems to % @code, which sets - active. This problem was fixed by a kludge--- % ``-'' was active throughout whole index, but this isn't really right. % % The right solution is to prevent \entry from swallowing the whole text. % --kasal, 21nov03 \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent = 2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % A bit of stretch before each entry for the benefit of balancing % columns. \vskip 0pt plus1pt % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\doentry{% \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. } \def\finishentry#1{% % #1 is the page number. % % The following is kludged to not output a line of dots in the index if % there are no page numbers. The next person who breaks this will be % cursed by a Unix daemon. \def\tempa{{\rm }}% \def\tempb{#1}% \edef\tempc{\tempa}% \edef\tempd{\tempb}% \ifx\tempc\tempd \ % \else % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ifpdf \pdfgettoks#1.% \ \the\toksA \else \ #1% \fi \fi \par \endgroup } % Like plain.tex's \dotfill, except uses up at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary#1#2{{% \parfillskip=0in \parskip=0in \hangindent=1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else #2 \fi \par }} % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case we just ship out what is in \partialpage with the normal % output routine. Generally, \partialpage will be empty when this % runs and this will be a no-op. See the indexspread.tex test case. \ifvoid\partialpage \else \onepageout{\pagecontents\partialpage}% \fi % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% }% \eject % run that output routine to set \partialpage % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize } % The double-column output routine for all double-column pages except % the last. % \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@ = \vsize \divide\dimen@ by 2 \advance\dimen@ by -\ht\partialpage % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% } % % All done with double columns. \def\enddoublecolumns{% \output = {% % Split the last of the double-column material. Leave it on the % current page, no automatic page break. \balancecolumns % % If we end up splitting too much material for the current page, % though, there will be another page break right after this \output % invocation ends. Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. (We hope \balancecolumns will never be % called on to balance too much material, but if it is, this makes % the output somewhat more palatable.) \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize (after the % \endgroup where \vsize got restored). \pagegoal = \vsize } % % Called at the end of the double column material. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% \splittopskip = \topskip % Loop until we get a decent breakpoint. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by 1pt \repeat }% %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% % \pagesofar } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % \unnumberedno is an oxymoron, of course. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 % chapters, we're in trouble anyway, I'm sure.) \newcount\unnumberedno \unnumberedno = 10000 \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ % % \def\appendixletter{\char\the\appendixno} % We do the following ugly conditional instead of the above simple % construct for the sake of pdftex, which needs the actual % letter in the expansion, not just typeset. % \def\appendixletter{% \ifnum\appendixno=`A A% \else\ifnum\appendixno=`B B% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines this as the name of the chapter. % page headings and footings can use it. @section does likewise. % However, they are not reliable, because we don't use marks. \def\thischapter{} \def\thissection{} \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achive this, remember the "biggest" unnum. sec. we are currently in: \chardef\unmlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. \def\chapheadtype{N} % Choose a heading macro % #1 is heading type % #2 is heading level % #3 is text for heading \def\genhead#1#2#3{% % Compute the abs. sec. level: \absseclevel=#2 \advance\absseclevel by \secbase % Make sure \absseclevel doesn't fall outside the range: \ifnum \absseclevel < 0 \absseclevel = 0 \else \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unmlevel \chardef\unmlevel = \absseclevel \fi \else % Check for appendix sections: \ifnum \absseclevel = 0 \edef\chapheadtype{\headtype}% \else \if \headtype A\if \chapheadtype N% \errmessage{@appendix... within a non-appendix chapter}% \fi\fi \fi % Check for numbered within unnumbered: \ifnum \absseclevel > \unmlevel \def\headtype{U}% \else \chardef\unmlevel = 3 \fi \fi % Now print the heading: \if \headtype U% \ifcase\absseclevel \unnumberedzzz{#3}% \or \unnumberedseczzz{#3}% \or \unnumberedsubseczzz{#3}% \or \unnumberedsubsubseczzz{#3}% \fi \else \if \headtype A% \ifcase\absseclevel \appendixzzz{#3}% \or \appendixsectionzzz{#3}% \or \appendixsubseczzz{#3}% \or \appendixsubsubseczzz{#3}% \fi \else \ifcase\absseclevel \chapterzzz{#3}% \or \seczzz{#3}% \or \numberedsubseczzz{#3}% \or \numberedsubsubseczzz{#3}% \fi \fi \fi \suppressfirstparagraphindent } % an interface: \def\numhead{\genhead N} \def\apphead{\genhead A} \def\unnmhead{\genhead U} % @chapter, @appendix, @unnumbered. Increment top-level counter, reset % all lower-level sectioning counters to zero. % % Also set \chaplevelprefix, which we prepend to @float sequence numbers % (e.g., figures), q.v. By default (before any chapter), that is empty. \let\chaplevelprefix = \empty % \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz#1{% % section resetting is \global in case the chapter is in a group, such % as an @include file. \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\chapno by 1 % % Used for \float. \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % \message{\putwordChapter\space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% % % So @section and the like are numbered underneath this chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec } \outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % \def\appendixnum{\putwordAppendix\space \appendixletter}% \message{\appendixnum}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } \outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty \resetallfloatnos % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of . (We also do this for % the toc entries.) \toks0 = {#1}% \message{(\the\toks0)}% % \chapmacro{#1}{Ynothing}{\the\unnumberedno}% % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec } % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% % Well, we could do the following in a group, but that would break % an assumption that \chapmacro is called at the outermost level. % Thus we are safer this way: --kasal, 24feb04 \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } \outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. \outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } \outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading % NOTE on use of \vbox for chapter headings, section headings, and such: % 1) We use \vbox rather than the earlier \line to permit % overlong headings to fold. % 2) \hyphenpenalty is set to 10000 because hyphenation in a % heading is obnoxious; this forbids it. % 3) Likewise, headings look best if no \parindent is used, and % if justification is not attempted. Hence \raggedright. \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}% \bigskip \par\penalty 200\relax \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. %%% Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} %%% Define plain chapter starts, and page on/off switching for it % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} \def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yomitfromtockeyword{Yomitfromtoc} \def\Yappendixkeyword{Yappendix} % \def\chapmacro#1#2#3{% \pchapsepmacro {% \chapfonts \rm % % Have to define \thissection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\thissection{#1}% \gdef\thischaptername{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \gdef\thischapternum{}% \gdef\thischapter{#1}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \gdef\thischapternum{}% \gdef\thischapter{}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \xdef\thischapternum{\appendixletter}% % We don't substitute the actual chapter name into \thischapter % because we don't want its macros evaluated now. And we don't % use \thissection because that changes with each section. % \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \xdef\thischapternum{\the\chapno}% \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerparameters{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt } % I don't think this chapter style is supported any more, so I'm not % updating it with the new noderef stuff. We'll see. --karl, 11aug03. % \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} % \def\unnchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}\bigskip \par\nobreak } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt \hfill {\rm #1}\hfill}}\bigskip \par\nobreak } \def\CHAPFopen{% \global\let\chapmacro=\chfopen \global\let\centerchapmacro=\centerchfopen} % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip{-1000}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Print any size, any type, section title. % % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the % section number. % \def\sectionheading#1#2#3#4{% {% % Switch to the right set of fonts. \csname #2fonts\endcsname \rm % % Insert space above the heading. \csname #2headingbreak\endcsname % % Only insert the space after the number if we have a section number. \def\sectionlevel{#2}% \def\temptype{#3}% % \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\thissection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \thissection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\thissection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\thissection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chapmacro. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chapmacro. \donoderef{#3}% % % Interline glue will be inserted when the vbox is completed. % That glue will be a valid breakpoint for the page, since it'll be % preceded by a whatsit (usually from the \donoderef, or from the % \writetocentry if there was no node). We don't want to allow that % break, since then the whatsits could end up on page n while the % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. \nobreak % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % Add extra space after the heading -- half of whatever came above it. % Don't allow stretch, though. \kern .5 \csname #2headingskip\endcsname % % Do not let the kern be a potential breakpoint, as it would be if it % was followed by glue. \nobreak % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a % discardable item.) \vskip-\parskip % % This is purely so the last item on the list is a known \penalty > % 10000. This is so \startdefun can avoid allowing breakpoints after % section headings. Otherwise, it would insert a valid breakpoint between: % % @section sec-whatever % @deffn def-whatever \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. % % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} % We append the current node name (if any) and page number as additional % arguments for the \{chap,sec,...}entry macros which will eventually % read this. The node name is used in the pdf outlines as the % destination to jump to. % % We open the .toc file for writing here instead of at @setfilename (or % any other fixed time) so that @contents can be anywhere in the document. % But if #1 is `omit', then we don't do anything. This is used for the % table of contents chapter openings themselves. % \newif\iftocfileopened \def\omitkeyword{omit}% % \def\writetocentry#1#2#3{% \edef\writetoctype{#1}% \ifx\writetoctype\omitkeyword \else \iftocfileopened\else \immediate\openout\tocfile = \jobname.toc \global\tocfileopenedtrue \fi % \iflinks {\atdummies \edef\temp{% \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% \temp }% \fi \fi % % Tell \shipout to create a pdf destination on each page, if we're % writing pdf. These are used in the table of contents. We can't % just write one on every page because the title pages are numbered % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. \ifpdf \global\pdfmakepagedesttrue \fi } % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. % \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active \catcode`\<=\active \catcode`\>=\active \catcode`\\=\active \catcode`\^=\active \catcode`\_=\active \catcode`\|=\active \catcode`\~=\active } % Read the toc file, which is essentially Texinfo input. \def\readtocfile{% \setupdatafile \activecatcodes \input \jobname.toc } \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % Prepare to read what we've written to \tocfile. % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. Thus, we maintain % \contentsalignmacro in parallel with \pagealignmacro. % From: Torbjorn Granlund \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \def\thischapter{}% \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. \advance\hsize by -\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi } % Normal (long) toc. \def\contents{% \startcontents{\putwordTOC}% \openin 1 \jobname.toc \ifeof 1 \else \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \let\tt=\shortconttt \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry \let\numsubsecentry = \numsecentry \let\appsubsecentry = \numsecentry \let\unnsubsecentry = \numsecentry \let\numsubsubsecentry = \numsecentry \let\appsubsubsecentry = \numsecentry \let\unnsubsubsecentry = \numsecentry \openin 1 \jobname.toc \ifeof 1 \else \readtocfile \fi \closein 1 \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } \let\shortcontents = \summarycontents % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. % \def\shortchaplabel#1{% % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % But use \hss just in case. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) % % We'd like to right-justify chapter numbers, but that looks strange % with appendix letters. And right-justifying numbers and % left-justifying letters looks strange when there is less than 10 % chapters. Have to read the whole toc once to know how many chapters % there are before deciding ... \hbox to 1em{#1\hss}% } % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. % Need the word Appendix, and a fixed-size box. % \def\appendixbox#1{% % We use M since it's probably the widest letter. \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} \let\appsubsubsecentry=\numsubsubsecentry \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} % This parameter controls the indentation of the various levels. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} % We use the same \entry macro as for the index entries. \let\tocentry = \entry % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, it should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @tex ... @end tex escapes into raw Tex temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain tex @ character. \envdef\tex{% \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \escapechar=`\\ % \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\*=\ptexstar \let\t=\ptext \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @lisp environment forms a group so it can rebind things, % including the definition of @end lisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip % it's not a good place to break if the last penalty was \nobreak % or better ... \ifnum\lastpenalty<10000 \penalty-50 \fi \vskip\envskipamount \fi \fi }} \let\afterenvbreak = \aboveenvbreak % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will % also clear it, so that its embedded environments do the narrowing again. \let\nonarrowing=\relax % @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \envdef\cartouche{% \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt % we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing = t% \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \kern3pt \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \comment % For explanation, see the end of \def\group. } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \def\nonfillstart{% \aboveenvbreak \hfuzz = 12pt % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt \parindent = 0pt \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: % @example, @display, @format, @lisp % \def\smallword{small} \def\nosmallword{nosmall} \let\SETdispenvsize\relax \def\setnormaldispenv{% \ifx\SETdispenvsize\smallword % end paragraph for sake of leading, in case document has no blank % line. This is redundant with what happens in \aboveenvbreak, but % we need to do it before changing the fonts, and it's inconvenient % to change the fonts afterward. \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it by one command: \def\makedispenv #1#2{ \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } % Define two synonyms: \def\maketwodispenvs #1#2#3{ \makedispenv{#1}{#3} \makedispenv{#2}{#3} } % @lisp: indented, narrowed, typewriter font; @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvs {lisp}{example}{% \nonfillstart \tt\quoteexpand \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenv {display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenv{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill \gobble } \let\Eflushright = \afterenvbreak % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. We keep \parskip nonzero in general, since % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % \envdef\quotation{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \advance\rightskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\undefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% \def\temp{#1}% \ifx\temp\empty \else {\bf #1: }% \fi } % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [Knuth] p.344; only we need to do the other characters Texinfo sets % active too. Otherwise, they get lost as the first character on a % verbatim line. \def\dospecials{% \do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % [Knuth] pp. 380,381,391 % Disable Spanish ligatures ?` and !` of \tt font \begingroup \catcode`\`=\active\gdef`{\relax\lq} \endgroup % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \catcode`\`=\active \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % \def\starttabbox{\setbox0=\hbox\bgroup} % Allow an option to not replace quotes with a regular directed right % quote/apostrophe (char 0x27), but instead use the undirected quote % from cmtt (char 0x0d). The undirected quote is ugly, so don't make it % the default, but it works for pasting with more pdf viewers (at least % evince), the lilypond developers report. xpdf does work with the % regular 0x27. % \def\codequoteright{% \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax `% \else \char'22 \fi } % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen0=\wd0 % the width so far, or since the previous tab \divide\dimen0 by\tabw \multiply\dimen0 by\tabw % compute previous multiple of \tabw \advance\dimen0 by\tabw % advance to next multiple of \tabw \wd0=\dimen0 \box0 \starttabbox }% } \catcode`\'=\active \gdef\rquoteexpand{\catcode\rquoteChar=\active \def'{\codequoteright}}% % \catcode`\`=\active \gdef\lquoteexpand{\catcode\lquoteChar=\active \def`{\codequoteleft}}% % \gdef\quoteexpand{\rquoteexpand \lquoteexpand}% \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart % Easiest (and conventionally used) font for verbatim \tt \def\par{\leavevmode\egroup\box0\endgraf}% \catcode`\`=\active \tabexpand \quoteexpand % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % For Texinfo it's a lot easier than for LaTeX, % because texinfo's \verbatim doesn't stop at '\end{verbatim}': % we need not redefine '\', '{' and '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \obeylines % % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. \endgroup % \envdef\verbatim{% \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim \input #1 \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % We save the uninterpreted tokens, rather than creating a box. % Saving the text in a box would be much easier, but then all the % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as % possible is very desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} % \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page \scanexp\copyingtext \endgroup } \message{defuns,} % @defun etc. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \else % If there are two @def commands in a row, we'll have a \nobreak, % which is there to keep the function description together with its % header. But if there's nothing but headers, we need to allow a % break somewhere. Check specifically for penalty 10002, inserted % by \defargscommonending, instead of 10000, since the sectioning % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % \ifnum\lastpenalty=10002 \penalty2000 \fi % % Similarly, after a section heading, do not allow a break. % But do insert the glue. \medskip % preceded by discardable penalty, so not a breakpoint \fi % \parindent=0in \advance\leftskip by \defbodyindent \exdentamount=\defbodyindent } \def\dodefunx#1{% % First, check whether we are in the right environment: \checkenv#1% % % As above, allow line break if we have multiple x headers in a row. % It's not a great place, though. \ifnum\lastpenalty=10002 \penalty3000 \fi % % And now, it's time to reuse the body of the original defun: \expandafter\gobbledefun#1% } \def\gobbledefun#1\startdefun{} % \printdefunline \deffnheader{text} % \def\printdefunline#1#2{% \begingroup % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil \endgraf \nobreak\vskip -\parskip \penalty 10002 % signal to \startdefun and \dodefunx % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts \endgroup } \def\Edefun{\endgraf\medbreak} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remainnig is to define \deffnheader. % \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } % \domakedefun \deffn \deffnx \deffnheader % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } %%% Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} % @deffn category class name args \makedefun{defop}#1 {\defopon{#1\ \putwordon}} % \defopon {category on}class name args \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deffngeneral {subind}category name args % \def\deffngeneral#1#2 #3 #4\endheader{% % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. \dosubind{fn}{\code{#3}}{#1}% \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } %%% Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} % \deftypeopon {category on}class type name args \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deftypefngeneral {subind}category type name args % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } %%% Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} % \deftypecvof {category of}class type var args \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } % \deftypecvgeneral {subind}category type var args % \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% \dosubind{vr}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } %%% Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } %%% Type: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \defname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: \makedefun{defun}{\deffnheader{\putwordDeffunc} } \makedefun{defmac}{\deffnheader{\putwordDefmac} } \makedefun{defspec}{\deffnheader{\putwordDefspec} } \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } \makedefun{defmethod}{\defopon\putwordMethodon} \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} \makedefun{defivar}{\defcvof\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} % \defname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % \def\defname#1#2#3{% % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % How we'll format the type name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % % Figure out line sizes for the paragraph shape. % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % (plain.tex says that \dimen1 should be used only as global.) \parshape 2 0in \dimen0 \defargsindent \dimen2 % % Put the type name to the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize % \hsize has to be shortened this way: \kern\leftskip % Intentionally do not respect \rightskip, since we need the space. }% % % Allow all lines to be underfull without complaint: \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's % common to leave accents off identifiers. The result looks ok in % tt, but exceedingly strange in rm. % . we don't want -- and --- to be treated as ligatures. % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt \def\temp{#2}% return value type \ifx\temp\empty\else \tclose{\temp} \fi #3% output function name }% {\rm\enskip}% hskip 0.5 em of \tenrm % \boldbrax % arguments will be output next, if any. } % Print arguments in slanted roman (not ttsl), inconsistently with using % tt for the name. This is because literal text is sometimes needed in % the argument list (groff manual), and ttsl and tt are not very % distinguishable. Prevent hyphenation at `-' chars. % \def\defunargs#1{% % use sl by default (not ttsl), % tt for the names. \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we % want a way to get ttsl. Let's try @var for that. \let\var=\ttslanted #1% \sl\hyphenchar\font=45 } % We want ()&[] to print specially on the defun line. % \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\[=\active \catcode`\]=\active \catcode`\&=\active } % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. { \activeparens \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\bf\ }} \def\parenfont{% \ifampseen % At the first level, print parens in roman, % otherwise use the default font. \ifnum \parencount=1 \rm \fi \else % The \sf parens (in \boldbrax) actually are a little bolder than % the contained text. This is especially needed for [ and ] . \sf \fi } \def\infirstlevel#1{% \ifampseen \ifnum\parencount=1 #1% \fi \fi } \def\bfafterword#1 {#1 \bf} \def\opnr{% \global\advance\parencount by 1 {\parenfont(}% \infirstlevel \bfafterword } \def\clnr{% {\parenfont)}% \infirstlevel \sl \global\advance\parencount by -1 } \newcount\brackcount \def\lbrb{% \global\advance\brackcount by 1 {\bf[}% } \def\rbrb{% {\bf]}% \global\advance\brackcount by -1 } \def\checkparencounts{% \ifnum\parencount=0 \else \badparencount \fi \ifnum\brackcount=0 \else \badbrackcount \fi } \def\badparencount{% \errmessage{Unbalanced parentheses in @def}% \global\parencount=0 } \def\badbrackcount{% \errmessage{Unbalanced square braces in @def}% \global\brackcount=0 } \message{macros,} % @macro. % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. \ifx\eTeXversion\undefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \def\scanmacro#1{% \begingroup \newlinechar`\^^M \let\xeatspaces\eatspaces % Undo catcode changes of \startcontents and \doprintindex % When called from @insertcopying or (short)caption, we need active % backslash to get it printed correctly. Previously, we had % \catcode`\\=\other instead. We'll see whether a problem appears % with macro expansion. --kasal, 19aug04 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ % ... and \example \spaceisspace % % Append \endinput to make sure that TeX does not see the ending newline. % I've verified that it is necessary both for e-TeX and for ordinary TeX % --kasal, 29nov03 \scantokens{#1\endinput}% \endgroup } \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% \temp } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \definedummyword\macro1\definedummyword\macro2... % Currently is also contains all @aliases; the list can be split % if there is a need. \def\macrolist{} % Add the macro to \macrolist \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} \def\addtomacrolistxxx#1{% \toks0 = \expandafter{\macrolist\definedummyword#1}% \xdef\macrolist{\the\toks0}% } % Utility routines. % This does \let #1 = #2, with \csnames; that is, % \let \csname#1\endcsname = \csname#2\endcsname % (except of course we have to play expansion games). % \def\cslet#1#2{% \expandafter\let \csname#1\expandafter\endcsname \csname#2\endcsname } % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \. % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. \def\scanctxt{% \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\@=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other } \def\scanargctxt{% \scanctxt \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% \scanctxt \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } \def\macroargctxt{% \scanctxt \catcode`\\=\other } % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0% \else \expandafter\parsemargdef \argl;% \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \else \errmessage{Macro name \the\macname\space already defined}\fi \global\cslet{macsave.\the\macname}{\the\macname}% \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% \addtomacrolist{\the\macname}% \fi \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \parseargdef\unmacro{% \if1\csname ismacro.#1\endcsname \global\cslet{#1}{macsave.#1}% \global\expandafter\let \csname ismacro.#1\endcsname=0% % Remove the macro name from \macrolist: \begingroup \expandafter\let\csname#1\endcsname \relax \let\definedummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \else \errmessage{Macro #1 not defined}% \fi } % Called by \do from \dounmacro on each macro. The idea is to omit any % macro definitions that have been changed to \relax. % \def\unmacrodo#1{% \ifx #1\relax % remove this \else \noexpand\definedummyword \noexpand#1% \fi } % This makes use of the obscure feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname #1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % Parse the optional {params} list. Set up \paramno and \paramlist % so \defmacro knows what to do. Define \macarg.blah for each blah % in the params list, to be ##N where N is the position in that list. % That gets used by \mbodybackslash (above). % We need to get `macro parameter char #' into several definitions. % The technique used is stolen from LaTeX: let \hash be something % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \eatspaces till just before % the macro is used. \def\parsemargdef#1;{\paramno=0\def\paramlist{}% \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1% \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% % This defines the macro itself. There are six cases: recursive and % nonrecursive macros of zero, one, and many arguments. % Much magic with \expandafter here. % \xdef is used so that macro definitions will survive the file % they're defined in; @include reads the file inside a group. \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifrecursive \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\temp}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup\noexpand\scanmacro{\temp}}% \else % many \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{\egroup\noexpand\scanmacro{\temp}}% \fi \else \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % many \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \expandafter\noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \fi \fi} \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} % \braceorline decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence % as an argument (by \parsebrace or \parsearg) \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else \expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Just make them active and then expand them all to nothing. \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \addtomacrolist{#1}% \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in % cross-references. The @node line might or might not have commas, and % might or might not have spaces before the first comma, like: % @node foo , bar , ... % We don't want such trailing spaces in the node name. % \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} % % also remove a trailing comma, in case of something like this: % @node Help-Cross, , , Cross-refs \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} \let\nwnode=\node \let\lastnode=\empty % Write a cross-reference definition for the current node. #1 is the % type (Ynumbered, Yappendix, Ynothing). % \def\donoderef#1{% \ifx\lastnode\empty\else \setref{\lastnode}{#1}% \global\let\lastnode=\empty \fi } % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an % anchor), which consists of three parts: % 1) NAME-title - the current sectioning name taken from \thissection, % or the anchor name. % 2) NAME-snt - section number and type, passed as the SNT arg, or % empty for anchors. % 3) NAME-pg - the page number. % % This is called from \donoderef, \anchor, and \dofloat. In the case of % floats, there is an additional part, which is not written here: % 4) NAME-lof - the text as it should appear in a @listoffloats. % \def\setref#1#2{% \pdfmkdest{#1}% \iflinks {% \atdummies % preserve commands, but don't expand them \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\thissection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \writexrdef{pg}{\folio}% will be written later, during \shipout }% \fi } % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces \def\printedmanual{\ignorespaces #5}% \def\printedrefname{\ignorespaces #3}% \setbox1=\hbox{\printedmanual\unskip}% \setbox0=\hbox{\printedrefname\unskip}% \ifdim \wd0 = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax % Use the node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Use the actual chapter/section title appear inside % the square brackets. Use the real section title if we have it. \ifdim \wd1 > 0pt % It is in another manual, so we don't have it. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf \leavevmode \getfilename{#4}% {\indexnofonts \turnoffactive % See comments at \activebackslashdouble. {\activebackslashdouble \xdef\pdfxrefdest{#1}% \backslashparens\pdfxrefdest}% % \ifnum\filenamelength>0 \startlink attr{/Border [0 0 0]}% goto file{\the\filename.pdf} name{\pdfxrefdest}% \else \startlink attr{/Border [0 0 0]}% goto name{\pdfmkpgn{\pdfxrefdest}}% \fi }% \linkcolor \fi % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". We distinguish them by the % LABEL-title being set to a magic string. {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd0 = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % if the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd1 > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not % insert empty discretionaries after hyphens, which means that it will % not find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, this % is a loss. Therefore, we give the text of the node name again, so it % is as if TeX is seeing it for the first time. \ifdim \wd1 > 0pt \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% \else % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of % printing. So we \turnoffactive for the \refx-snt, back on for the % printing, back off for the \refx-pg. {\turnoffactive % Only output a following space if the -snt ref is nonempty; for % @unnumbered and @anchor, it won't be. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi }% % output the `[mynode]' via a macro so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% \fi \fi \endlink \endgroup} % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly % one that Bob is working on :). % \def\xrefprintnodename#1{[#1]} % Things referred to by \setref. % \def\Ynothing{} \def\Yomitfromtoc{} \def\Ynumbered{% \ifnum\secno=0 \putwordChapter@tie \the\chapno \else \ifnum\subsecno=0 \putwordSection@tie \the\chapno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno \else \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } \def\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno \else \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. % \def\refx#1#2{% {% \indexnofonts \otherbackslash \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% \ifx\thisrefX\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs \message{\linenumber Undefined cross reference `#1'.}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Usually it's % just a \def (we prepend XR to the control sequence name to avoid % collisions). But if this is a float type, we have more work to do. % \def\xrdef#1#2{% {% The node name might contain 8-bit characters, which in our current % implementation are changed to commands like @'e. Don't let these % mess up the control sequence name. \indexnofonts \turnoffactive \xdef\safexrefname{#1}% }% % \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR\safexrefname\endcsname % it was a float, and we have the (safe) float type in \iffloattype. \expandafter\let\expandafter\floatlist \csname floatlist\iffloattype\endcsname % % Is this the first time we've seen this float type? \expandafter\ifx\floatlist\relax \toks0 = {\do}% yes, so just \do \else % had it before, so preserve previous elements in list. \toks0 = \expandafter{\floatlist\do}% \fi % % Remember this xref in the control sequence \floatlistFLOATTYPE, % for later use in \listoffloats. \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 {\safexrefname}}% \fi } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readdatafile{aux}% \global\havexrefstrue \fi \closein 1 } \def\setupdatafile{% \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. % in xref tags, i.e., node names. But since ^^e4 notation isn't % supported in the main text, it doesn't seem desirable. Furthermore, % that is not enough: for node names that actually contain a ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % % This is to support \ in node names and titles, since the \ % characters end up in a \csname. It's easier than % leaving it active and making its active definition an actual \ % character. What I don't understand is why it works in the *value* % of the xrdef. Seems like it should be a catcode12 \, and that % should not typeset properly. But it works, so I'm moving on for % now. --karl, 15jan04. \catcode`\\=\other % % Make the characters 128-255 be printing characters. {% \count1=128 \def\loop{% \catcode\count1=\other \advance\count1 by 1 \ifnum \count1<256 \loop \fi }% }% % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \let\indent=\ptexindent \let\noindent=\ptexnoindent \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \dofootnote }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset (and anything else that uses % \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \hsize=\pagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut \futurelet\next\fo@t } }%end \catcode `\@=11 % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarily, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. % \def\startsavinginserts{% \ifx \insert\ptexinsert \let\insert\saveinsert \else \let\checkinserts\relax \fi } % This \insert replacement works for both \insert\footins{foo} and % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. % \def\saveinsert#1{% \edef\next{\noexpand\savetobox \makeSAVEname#1}% \afterassignment\next % swallow the left brace \let\temp = } \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} \def\placesaveins#1{% \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname {\box#1}% } % eat @SAVE -- beware, all of them have catcode \other: { \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) \gdef\gobblesave @SAVE{} } % initialization: \def\newsaveins #1{% \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% \next } \def\newsaveinsX #1{% \csname newbox\endcsname #1% \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts \checksaveins #1}% } % initialize: \let\checkinserts\empty \newsaveins\footins \newsaveins\margin % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % Do not bother showing banner with epsf.tex v2.7k (available in % doc/epsf.tex and on ctan). \def\epsfannounce{\toks0 = }% \input epsf.tex \fi \closein 1 % % We will only complain once about lack of epsf.tex. \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from ftp://tug.org/tex/epsf.tex.} % \def\image#1{% \ifx\epsfbox\undefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing this stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names % If the image is by itself, center it. \ifvmode \imagevmodetrue \nobreak\bigskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \nobreak\vskip\parskip \nobreak \line\bgroup \fi % % Output the image. \ifpdf \dopdfimage{#1}{#2}{#3}% \else % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \fi % \ifimagevmode \egroup \bigbreak \fi % space after the image \endgroup} % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, % etc. We don't actually implement floating yet, we always include the % float "here". But it seemed the best name for the future. % \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} % There may be a space before second and/or third parameter; delete it. \def\eatcommaspace#1, {#1,} % #1 is the optional FLOATTYPE, the text label for this float, typically % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, % this float will not be numbered and cannot be referred to. % % #2 is the optional xref label. Also must be present for the float to % be referable. % % #3 is the optional positioning argument; for now, it is ignored. It % will somehow specify the positions allowed to float to (here, top, bottom). % % We keep a separate counter for each FLOATTYPE, which we reset at each % chapter-level command. \let\resetallfloatnos=\empty % \def\dofloat#1,#2,#3,#4\finish{% \let\thiscaption=\empty \let\thisshortcaption=\empty % % don't lose footnotes inside @float. % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \startsavinginserts % % We can't be used inside a paragraph. \par % \vtop\bgroup \def\floattype{#1}% \def\floatlabel{#2}% \def\floatloc{#3}% we do nothing with this yet. % \ifx\floattype\empty \let\safefloattype=\empty \else {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% \fi % % If label is given but no type, we handle that as the empty type. \ifx\floatlabel\empty \else % We want each FLOATTYPE to be numbered separately (Figure 1, % Table 1, Figure 2, ...). (And if no label, no number.) % \expandafter\getfloatno\csname\safefloattype floatno\endcsname \global\advance\floatno by 1 % {% % This magic value for \thissection is output by \setref as the % XREFLABEL-title value. \xrefX uses it to distinguish float % labels (which have a completely different output format) from % node and anchor labels. And \xrdef uses it to construct the % lists of floats. % \edef\thissection{\floatmagic=\safefloattype}% \setref{\floatlabel}{Yfloat}% }% \fi % % start with \parskip glue, I guess. \vskip\parskip % % Don't suppress indentation if a float happens to start a section. \restorefirstparagraphindent } % we have these possibilities: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap % @float Foo,lbl & no caption: Foo 1.1 % @float Foo & @caption{Cap}: Foo: Cap % @float Foo & no caption: Foo % @float ,lbl & Caption{Cap}: 1.1: Cap % @float ,lbl & no caption: 1.1 % @float & @caption{Cap}: Cap % @float & no caption: % \def\Efloat{% \let\floatident = \empty % % In all cases, if we have a float type, it comes first. \ifx\floattype\empty \else \def\floatident{\floattype}\fi % % If we have an xref label, the number comes next. \ifx\floatlabel\empty \else \ifx\floattype\empty \else % if also had float type, need tie first. \appendtomacro\floatident{\tie}% \fi % the number. \appendtomacro\floatident{\chaplevelprefix\the\floatno}% \fi % % Start the printed caption with what we've constructed in % \floatident, but keep it separate; we need \floatident again. \let\captionline = \floatident % \ifx\thiscaption\empty \else \ifx\floatident\empty \else \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. \appendtomacro\captionline{\scanexp\thiscaption}% \fi % % If we have anything to print, print it, with space before. % Eventually this needs to become an \insert. \ifx\captionline\empty \else \vskip.5\parskip \captionline % % Space below caption. \vskip\parskip \fi % % If have an xref label, write the list of floats info. Do this % after the caption, to avoid chance of it being a breakpoint. \ifx\floatlabel\empty \else % Write the text that goes in the lof to the aux file as % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% \atdummies % % since we read the caption text in the macro world, where ^^M % is turned into a normal character, we have to scan it back, so % we don't write the literal three characters "^^M" into the aux file. \scanexp{% \xdef\noexpand\gtemp{% \ifx\thisshortcaption\empty \thiscaption \else \thisshortcaption \fi }% }% \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % % place the captured inserts % % BEWARE: when the floats start floating, we have to issue warning % whenever an insert appears inside a float which could possibly % float. --kasal, 26may04 % \checkinserts } % Append the tokens #2 to the definition of macro #1, not expanding either. % \def\appendtomacro#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2}% } % @caption, @shortcaption % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} \def\defcaption#1#2{\egroup \def#1{#2}} % The parameter is the control sequence identifying the counter we are % going to use. Create it if it doesn't exist and assign it to \floatno. \def\getfloatno#1{% \ifx#1\relax % Haven't seen this figure type before. \csname newcount\endcsname #1% % % Remember to reset this floatno at the next chap. \expandafter\gdef\expandafter\resetallfloatnos \expandafter{\resetallfloatnos #1=0 }% \fi \let\floatno#1% } % \setref calls this to get the XREFLABEL-snt value. We want an @xref % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we % first read the @float command. % \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% % Magic string used for the XREFLABEL-title value, so \xrefX can % distinguish floats from other xref types. \def\floatmagic{!!float!!} % #1 is the control sequence we are passed; we expand into a conditional % which is true if #1 represents a float ref. That is, the magic % \thissection value which we \setref above. % \def\iffloat#1{\expandafter\doiffloat#1==\finish} % % #1 is (maybe) the \floatmagic string. If so, #2 will be the % (safe) float type for this float. We set \iffloattype to #2. % \def\doiffloat#1=#2=#3\finish{% \def\temp{#1}% \def\iffloattype{#2}% \ifx\temp\floatmagic } % @listoffloats FLOATTYPE - print a list of floats like a table of contents. % \parseargdef\listoffloats{% \def\floattype{#1}% floattype {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% % % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax \ifhavexrefs % if the user said @listoffloats foo but never @float foo. \message{\linenumber No `\safefloattype' floats to list.}% \fi \else \begingroup \leftskip=\tocindent % indent these entries like a toc \let\do=\listoffloatsdo \csname floatlist\safefloattype\endcsname \endgroup \fi } % This is called on each entry in a list of floats. We're passed the % xref label, in the form LABEL-title, which is how we save it in the % aux file. We strip off the -title and look up \XRLABEL-lof, which % has the text we're supposed to typeset here. % % Figures without xref labels will not be included in the list (since % they won't appear in the aux file). % \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} \def\listoffloatsdoentry#1-title\finish{{% % Can't fully expand XR#1-lof because it can contain anything. Just % pass the control sequence. On the other hand, XR#1-pg is just the % page number, and we want to fully expand that so we can get a link % in pdf output. \toksA = \expandafter{\csname XR#1-lof\endcsname}% % % use the same \entry macro we use to generate the TOC and index. \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% \writeentry }} \message{localization,} % @documentlanguage is usually given very early, just after % @setfilename. If done too late, it may not override everything % properly. Single argument is the language abbreviation. % It would be nice if we could set up a hyphenation file here. % \parseargdef\documentlanguage{% \tex % read txi-??.tex file in plain TeX. % Read the file if it exists. \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \input txi-#1.tex \fi \closein 1 \endgroup } \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? In the current directory should work if nowhere else does.} % Set the catcode of characters 128 through 255 to the specified number. % \def\setnonasciicharscatcode#1{% \count255=128 \loop\ifnum\count255<256 \global\catcode\count255=#1 \advance\count255 by 1 \repeat } % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % \parseargdef\documentencoding{% % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % % Supported encodings: names converted to tokens in order to be able % to compare them with \ifx. \def\ascii{\csname US-ASCII.enc\endcsname}% \def\latnine{\csname ISO-8859-15.enc\endcsname}% \def\latone{\csname ISO-8859-1.enc\endcsname}% \def\lattwo{\csname ISO-8859-2.enc\endcsname}% \def\utfeight{\csname UTF-8.enc\endcsname}% % \ifx \declaredencoding \ascii \asciichardefs % \else \ifx \declaredencoding \lattwo \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \setnonasciicharscatcode\active \utfeightchardefs % \else \message{Unknown document encoding #1, ignoring.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii } % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} % First, make active non-ASCII characters in order for them to be % correctly categorized when TeX reads the replacement text of % macros containing the character definitions. \setnonasciicharscatcode\active % % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdef^^a0{~} \gdef^^a1{\exclamdown} \gdef^^a2{\missingcharmsg{CENT SIGN}} \gdef^^a3{{\pounds}} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\missingcharmsg{YEN SIGN}} \gdef^^a6{\missingcharmsg{BROKEN BAR}} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\copyright} \gdef^^aa{\ordf} \gdef^^ab{\missingcharmsg{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}} \gdef^^ac{$\lnot$} \gdef^^ad{\-} \gdef^^ae{\registeredsymbol} \gdef^^af{\={}} % \gdef^^b0{\textdegree} \gdef^^b1{$\pm$} \gdef^^b2{$^2$} \gdef^^b3{$^3$} \gdef^^b4{\'{}} \gdef^^b5{$\mu$} \gdef^^b6{\P} % \gdef^^b7{$^.$} \gdef^^b8{\cedilla\ } \gdef^^b9{$^1$} \gdef^^ba{\ordm} % \gdef^^bb{\missingcharmsg{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}} \gdef^^bc{$1\over4$} \gdef^^bd{$1\over2$} \gdef^^be{$3\over4$} \gdef^^bf{\questiondown} % \gdef^^c0{\`A} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\~A} \gdef^^c4{\"A} \gdef^^c5{\ringaccent A} \gdef^^c6{\AE} \gdef^^c7{\cedilla C} \gdef^^c8{\`E} \gdef^^c9{\'E} \gdef^^ca{\^E} \gdef^^cb{\"E} \gdef^^cc{\`I} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\"I} % \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER ETH}} \gdef^^d1{\~N} \gdef^^d2{\`O} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\~O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\O} \gdef^^d9{\`U} \gdef^^da{\'U} \gdef^^db{\^U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\missingcharmsg{LATIN CAPITAL LETTER THORN}} \gdef^^df{\ss} % \gdef^^e0{\`a} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\~a} \gdef^^e4{\"a} \gdef^^e5{\ringaccent a} \gdef^^e6{\ae} \gdef^^e7{\cedilla c} \gdef^^e8{\`e} \gdef^^e9{\'e} \gdef^^ea{\^e} \gdef^^eb{\"e} \gdef^^ec{\`{\dotless i}} \gdef^^ed{\'{\dotless i}} \gdef^^ee{\^{\dotless i}} \gdef^^ef{\"{\dotless i}} % \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER ETH}} \gdef^^f1{\~n} \gdef^^f2{\`o} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\~o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\o} \gdef^^f9{\`u} \gdef^^fa{\'u} \gdef^^fb{\^u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\missingcharmsg{LATIN SMALL LETTER THORN}} \gdef^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdef^^a4{\euro} \gdef^^a6{\v S} \gdef^^a8{\v s} \gdef^^b4{\v Z} \gdef^^b8{\v z} \gdef^^bc{\OE} \gdef^^bd{\oe} \gdef^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdef^^a0{~} \gdef^^a1{\missingcharmsg{LATIN CAPITAL LETTER A WITH OGONEK}} \gdef^^a2{\u{}} \gdef^^a3{\L} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\v L} \gdef^^a6{\'S} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\v S} \gdef^^aa{\cedilla S} \gdef^^ab{\v T} \gdef^^ac{\'Z} \gdef^^ad{\-} \gdef^^ae{\v Z} \gdef^^af{\dotaccent Z} % \gdef^^b0{\textdegree} \gdef^^b1{\missingcharmsg{LATIN SMALL LETTER A WITH OGONEK}} \gdef^^b2{\missingcharmsg{OGONEK}} \gdef^^b3{\l} \gdef^^b4{\'{}} \gdef^^b5{\v l} \gdef^^b6{\'s} \gdef^^b7{\v{}} \gdef^^b8{\cedilla\ } \gdef^^b9{\v s} \gdef^^ba{\cedilla s} \gdef^^bb{\v t} \gdef^^bc{\'z} \gdef^^bd{\H{}} \gdef^^be{\v z} \gdef^^bf{\dotaccent z} % \gdef^^c0{\'R} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\u A} \gdef^^c4{\"A} \gdef^^c5{\'L} \gdef^^c6{\'C} \gdef^^c7{\cedilla C} \gdef^^c8{\v C} \gdef^^c9{\'E} \gdef^^ca{\missingcharmsg{LATIN CAPITAL LETTER E WITH OGONEK}} \gdef^^cb{\"E} \gdef^^cc{\v E} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\v D} % \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER D WITH STROKE}} \gdef^^d1{\'N} \gdef^^d2{\v N} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\H O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\v R} \gdef^^d9{\ringaccent U} \gdef^^da{\'U} \gdef^^db{\H U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\cedilla T} \gdef^^df{\ss} % \gdef^^e0{\'r} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\u a} \gdef^^e4{\"a} \gdef^^e5{\'l} \gdef^^e6{\'c} \gdef^^e7{\cedilla c} \gdef^^e8{\v c} \gdef^^e9{\'e} \gdef^^ea{\missingcharmsg{LATIN SMALL LETTER E WITH OGONEK}} \gdef^^eb{\"e} \gdef^^ec{\v e} \gdef^^ed{\'\i} \gdef^^ee{\^\i} \gdef^^ef{\v d} % \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER D WITH STROKE}} \gdef^^f1{\'n} \gdef^^f2{\v n} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\H o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\v r} \gdef^^f9{\ringaccent u} \gdef^^fa{\'u} \gdef^^fb{\H u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\cedilla t} \gdef^^ff{\dotaccent{}} } % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. % \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz \gdef\UTFviiiTwoOctets#1#2{\expandafter \UTFviiiDefined\csname u8:#1\string #2\endcsname} % \gdef\UTFviiiThreeOctets#1#2#3{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} % \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} \gdef\UTFviiiDefined#1{% \ifx #1\relax \message{\linenumber Unicode char \string #1 not defined for Texinfo}% \else \expandafter #1% \fi } \begingroup \catcode`\~13 \catcode`\"12 \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiTwoOctets\string~}} \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiThreeOctets\string~}} \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiFourOctets\string~}} \UTFviiiLoop \endgroup \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacter#1#2{% \countUTFz = "#1\relax \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref \def\UTFviiiTwoOctets##1##2{% \csname u8:##1\string ##2\endcsname}% \def\UTFviiiThreeOctets##1##2##3{% \csname u8:##1\string ##2\string ##3\endcsname}% \def\UTFviiiFourOctets##1##2##3##4{% \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \gdef\UTFviiiTmp{#2}% \endgroup} \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctets.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% \fi\fi\fi } \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz \multiply\countUTFz by 64 \advance\countUTFx by -\countUTFz \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup \def\utfeightchardefs{% \DeclareUnicodeCharacter{00A0}{\tie} \DeclareUnicodeCharacter{00A1}{\exclamdown} \DeclareUnicodeCharacter{00A3}{\pounds} \DeclareUnicodeCharacter{00A8}{\"{ }} \DeclareUnicodeCharacter{00A9}{\copyright} \DeclareUnicodeCharacter{00AA}{\ordf} \DeclareUnicodeCharacter{00AD}{\-} \DeclareUnicodeCharacter{00AE}{\registeredsymbol} \DeclareUnicodeCharacter{00AF}{\={ }} \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} \DeclareUnicodeCharacter{00B4}{\'{ }} \DeclareUnicodeCharacter{00B8}{\cedilla{ }} \DeclareUnicodeCharacter{00BA}{\ordm} \DeclareUnicodeCharacter{00BF}{\questiondown} \DeclareUnicodeCharacter{00C0}{\`A} \DeclareUnicodeCharacter{00C1}{\'A} \DeclareUnicodeCharacter{00C2}{\^A} \DeclareUnicodeCharacter{00C3}{\~A} \DeclareUnicodeCharacter{00C4}{\"A} \DeclareUnicodeCharacter{00C5}{\AA} \DeclareUnicodeCharacter{00C6}{\AE} \DeclareUnicodeCharacter{00C7}{\cedilla{C}} \DeclareUnicodeCharacter{00C8}{\`E} \DeclareUnicodeCharacter{00C9}{\'E} \DeclareUnicodeCharacter{00CA}{\^E} \DeclareUnicodeCharacter{00CB}{\"E} \DeclareUnicodeCharacter{00CC}{\`I} \DeclareUnicodeCharacter{00CD}{\'I} \DeclareUnicodeCharacter{00CE}{\^I} \DeclareUnicodeCharacter{00CF}{\"I} \DeclareUnicodeCharacter{00D1}{\~N} \DeclareUnicodeCharacter{00D2}{\`O} \DeclareUnicodeCharacter{00D3}{\'O} \DeclareUnicodeCharacter{00D4}{\^O} \DeclareUnicodeCharacter{00D5}{\~O} \DeclareUnicodeCharacter{00D6}{\"O} \DeclareUnicodeCharacter{00D8}{\O} \DeclareUnicodeCharacter{00D9}{\`U} \DeclareUnicodeCharacter{00DA}{\'U} \DeclareUnicodeCharacter{00DB}{\^U} \DeclareUnicodeCharacter{00DC}{\"U} \DeclareUnicodeCharacter{00DD}{\'Y} \DeclareUnicodeCharacter{00DF}{\ss} \DeclareUnicodeCharacter{00E0}{\`a} \DeclareUnicodeCharacter{00E1}{\'a} \DeclareUnicodeCharacter{00E2}{\^a} \DeclareUnicodeCharacter{00E3}{\~a} \DeclareUnicodeCharacter{00E4}{\"a} \DeclareUnicodeCharacter{00E5}{\aa} \DeclareUnicodeCharacter{00E6}{\ae} \DeclareUnicodeCharacter{00E7}{\cedilla{c}} \DeclareUnicodeCharacter{00E8}{\`e} \DeclareUnicodeCharacter{00E9}{\'e} \DeclareUnicodeCharacter{00EA}{\^e} \DeclareUnicodeCharacter{00EB}{\"e} \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} \DeclareUnicodeCharacter{00F1}{\~n} \DeclareUnicodeCharacter{00F2}{\`o} \DeclareUnicodeCharacter{00F3}{\'o} \DeclareUnicodeCharacter{00F4}{\^o} \DeclareUnicodeCharacter{00F5}{\~o} \DeclareUnicodeCharacter{00F6}{\"o} \DeclareUnicodeCharacter{00F8}{\o} \DeclareUnicodeCharacter{00F9}{\`u} \DeclareUnicodeCharacter{00FA}{\'u} \DeclareUnicodeCharacter{00FB}{\^u} \DeclareUnicodeCharacter{00FC}{\"u} \DeclareUnicodeCharacter{00FD}{\'y} \DeclareUnicodeCharacter{00FF}{\"y} \DeclareUnicodeCharacter{0100}{\=A} \DeclareUnicodeCharacter{0101}{\=a} \DeclareUnicodeCharacter{0102}{\u{A}} \DeclareUnicodeCharacter{0103}{\u{a}} \DeclareUnicodeCharacter{0106}{\'C} \DeclareUnicodeCharacter{0107}{\'c} \DeclareUnicodeCharacter{0108}{\^C} \DeclareUnicodeCharacter{0109}{\^c} \DeclareUnicodeCharacter{010A}{\dotaccent{C}} \DeclareUnicodeCharacter{010B}{\dotaccent{c}} \DeclareUnicodeCharacter{010C}{\v{C}} \DeclareUnicodeCharacter{010D}{\v{c}} \DeclareUnicodeCharacter{010E}{\v{D}} \DeclareUnicodeCharacter{0112}{\=E} \DeclareUnicodeCharacter{0113}{\=e} \DeclareUnicodeCharacter{0114}{\u{E}} \DeclareUnicodeCharacter{0115}{\u{e}} \DeclareUnicodeCharacter{0116}{\dotaccent{E}} \DeclareUnicodeCharacter{0117}{\dotaccent{e}} \DeclareUnicodeCharacter{011A}{\v{E}} \DeclareUnicodeCharacter{011B}{\v{e}} \DeclareUnicodeCharacter{011C}{\^G} \DeclareUnicodeCharacter{011D}{\^g} \DeclareUnicodeCharacter{011E}{\u{G}} \DeclareUnicodeCharacter{011F}{\u{g}} \DeclareUnicodeCharacter{0120}{\dotaccent{G}} \DeclareUnicodeCharacter{0121}{\dotaccent{g}} \DeclareUnicodeCharacter{0124}{\^H} \DeclareUnicodeCharacter{0125}{\^h} \DeclareUnicodeCharacter{0128}{\~I} \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} \DeclareUnicodeCharacter{012A}{\=I} \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} \DeclareUnicodeCharacter{012C}{\u{I}} \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} \DeclareUnicodeCharacter{0130}{\dotaccent{I}} \DeclareUnicodeCharacter{0131}{\dotless{i}} \DeclareUnicodeCharacter{0132}{IJ} \DeclareUnicodeCharacter{0133}{ij} \DeclareUnicodeCharacter{0134}{\^J} \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} \DeclareUnicodeCharacter{0139}{\'L} \DeclareUnicodeCharacter{013A}{\'l} \DeclareUnicodeCharacter{0141}{\L} \DeclareUnicodeCharacter{0142}{\l} \DeclareUnicodeCharacter{0143}{\'N} \DeclareUnicodeCharacter{0144}{\'n} \DeclareUnicodeCharacter{0147}{\v{N}} \DeclareUnicodeCharacter{0148}{\v{n}} \DeclareUnicodeCharacter{014C}{\=O} \DeclareUnicodeCharacter{014D}{\=o} \DeclareUnicodeCharacter{014E}{\u{O}} \DeclareUnicodeCharacter{014F}{\u{o}} \DeclareUnicodeCharacter{0150}{\H{O}} \DeclareUnicodeCharacter{0151}{\H{o}} \DeclareUnicodeCharacter{0152}{\OE} \DeclareUnicodeCharacter{0153}{\oe} \DeclareUnicodeCharacter{0154}{\'R} \DeclareUnicodeCharacter{0155}{\'r} \DeclareUnicodeCharacter{0158}{\v{R}} \DeclareUnicodeCharacter{0159}{\v{r}} \DeclareUnicodeCharacter{015A}{\'S} \DeclareUnicodeCharacter{015B}{\'s} \DeclareUnicodeCharacter{015C}{\^S} \DeclareUnicodeCharacter{015D}{\^s} \DeclareUnicodeCharacter{015E}{\cedilla{S}} \DeclareUnicodeCharacter{015F}{\cedilla{s}} \DeclareUnicodeCharacter{0160}{\v{S}} \DeclareUnicodeCharacter{0161}{\v{s}} \DeclareUnicodeCharacter{0162}{\cedilla{t}} \DeclareUnicodeCharacter{0163}{\cedilla{T}} \DeclareUnicodeCharacter{0164}{\v{T}} \DeclareUnicodeCharacter{0168}{\~U} \DeclareUnicodeCharacter{0169}{\~u} \DeclareUnicodeCharacter{016A}{\=U} \DeclareUnicodeCharacter{016B}{\=u} \DeclareUnicodeCharacter{016C}{\u{U}} \DeclareUnicodeCharacter{016D}{\u{u}} \DeclareUnicodeCharacter{016E}{\ringaccent{U}} \DeclareUnicodeCharacter{016F}{\ringaccent{u}} \DeclareUnicodeCharacter{0170}{\H{U}} \DeclareUnicodeCharacter{0171}{\H{u}} \DeclareUnicodeCharacter{0174}{\^W} \DeclareUnicodeCharacter{0175}{\^w} \DeclareUnicodeCharacter{0176}{\^Y} \DeclareUnicodeCharacter{0177}{\^y} \DeclareUnicodeCharacter{0178}{\"Y} \DeclareUnicodeCharacter{0179}{\'Z} \DeclareUnicodeCharacter{017A}{\'z} \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} \DeclareUnicodeCharacter{017C}{\dotaccent{z}} \DeclareUnicodeCharacter{017D}{\v{Z}} \DeclareUnicodeCharacter{017E}{\v{z}} \DeclareUnicodeCharacter{01C4}{D\v{Z}} \DeclareUnicodeCharacter{01C5}{D\v{z}} \DeclareUnicodeCharacter{01C6}{d\v{z}} \DeclareUnicodeCharacter{01C7}{LJ} \DeclareUnicodeCharacter{01C8}{Lj} \DeclareUnicodeCharacter{01C9}{lj} \DeclareUnicodeCharacter{01CA}{NJ} \DeclareUnicodeCharacter{01CB}{Nj} \DeclareUnicodeCharacter{01CC}{nj} \DeclareUnicodeCharacter{01CD}{\v{A}} \DeclareUnicodeCharacter{01CE}{\v{a}} \DeclareUnicodeCharacter{01CF}{\v{I}} \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} \DeclareUnicodeCharacter{01D1}{\v{O}} \DeclareUnicodeCharacter{01D2}{\v{o}} \DeclareUnicodeCharacter{01D3}{\v{U}} \DeclareUnicodeCharacter{01D4}{\v{u}} \DeclareUnicodeCharacter{01E2}{\={\AE}} \DeclareUnicodeCharacter{01E3}{\={\ae}} \DeclareUnicodeCharacter{01E6}{\v{G}} \DeclareUnicodeCharacter{01E7}{\v{g}} \DeclareUnicodeCharacter{01E8}{\v{K}} \DeclareUnicodeCharacter{01E9}{\v{k}} \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} \DeclareUnicodeCharacter{01F1}{DZ} \DeclareUnicodeCharacter{01F2}{Dz} \DeclareUnicodeCharacter{01F3}{dz} \DeclareUnicodeCharacter{01F4}{\'G} \DeclareUnicodeCharacter{01F5}{\'g} \DeclareUnicodeCharacter{01F8}{\`N} \DeclareUnicodeCharacter{01F9}{\`n} \DeclareUnicodeCharacter{01FC}{\'{\AE}} \DeclareUnicodeCharacter{01FD}{\'{\ae}} \DeclareUnicodeCharacter{01FE}{\'{\O}} \DeclareUnicodeCharacter{01FF}{\'{\o}} \DeclareUnicodeCharacter{021E}{\v{H}} \DeclareUnicodeCharacter{021F}{\v{h}} \DeclareUnicodeCharacter{0226}{\dotaccent{A}} \DeclareUnicodeCharacter{0227}{\dotaccent{a}} \DeclareUnicodeCharacter{0228}{\cedilla{E}} \DeclareUnicodeCharacter{0229}{\cedilla{e}} \DeclareUnicodeCharacter{022E}{\dotaccent{O}} \DeclareUnicodeCharacter{022F}{\dotaccent{o}} \DeclareUnicodeCharacter{0232}{\=Y} \DeclareUnicodeCharacter{0233}{\=y} \DeclareUnicodeCharacter{0237}{\dotless{j}} \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} \DeclareUnicodeCharacter{1E20}{\=G} \DeclareUnicodeCharacter{1E21}{\=g} \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} \DeclareUnicodeCharacter{1E26}{\"H} \DeclareUnicodeCharacter{1E27}{\"h} \DeclareUnicodeCharacter{1E30}{\'K} \DeclareUnicodeCharacter{1E31}{\'k} \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} \DeclareUnicodeCharacter{1E3E}{\'M} \DeclareUnicodeCharacter{1E3F}{\'m} \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} \DeclareUnicodeCharacter{1E54}{\'P} \DeclareUnicodeCharacter{1E55}{\'p} \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} \DeclareUnicodeCharacter{1E7C}{\~V} \DeclareUnicodeCharacter{1E7D}{\~v} \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} \DeclareUnicodeCharacter{1E80}{\`W} \DeclareUnicodeCharacter{1E81}{\`w} \DeclareUnicodeCharacter{1E82}{\'W} \DeclareUnicodeCharacter{1E83}{\'w} \DeclareUnicodeCharacter{1E84}{\"W} \DeclareUnicodeCharacter{1E85}{\"w} \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} \DeclareUnicodeCharacter{1E8C}{\"X} \DeclareUnicodeCharacter{1E8D}{\"x} \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} \DeclareUnicodeCharacter{1E90}{\^Z} \DeclareUnicodeCharacter{1E91}{\^z} \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} \DeclareUnicodeCharacter{1E97}{\"t} \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} \DeclareUnicodeCharacter{1EBC}{\~E} \DeclareUnicodeCharacter{1EBD}{\~e} \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} \DeclareUnicodeCharacter{1EF2}{\`Y} \DeclareUnicodeCharacter{1EF3}{\`y} \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} \DeclareUnicodeCharacter{1EF8}{\~Y} \DeclareUnicodeCharacter{1EF9}{\~y} \DeclareUnicodeCharacter{2013}{--} \DeclareUnicodeCharacter{2014}{---} \DeclareUnicodeCharacter{2022}{\bullet} \DeclareUnicodeCharacter{2026}{\dots} \DeclareUnicodeCharacter{20AC}{\euro} \DeclareUnicodeCharacter{2192}{\expansion} \DeclareUnicodeCharacter{21D2}{\result} \DeclareUnicodeCharacter{2212}{\minus} \DeclareUnicodeCharacter{2217}{\point} \DeclareUnicodeCharacter{2261}{\equiv} }% end of \utfeightchardefs % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Make non-ASCII characters printable again for compatibility with % existing Texinfo documents that may use them, even without declaring a % document encoding. % \setnonasciicharscatcode \other \message{formatting,} \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be so finicky about underfull hboxes, either. \hbadness = 2000 % Following George Bush, just get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % Parameters in order: 1) textheight; 2) textwidth; % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; % 7) physical page height; 8) physical page width. % % We also call \setleading{\textleading}, so the caller should define % \textleading. The caller should also set \parskip. % \def\internalpagesizes#1#2#3#4#5#6#7#8{% \voffset = #3\relax \topskip = #6\relax \splittopskip = \topskip % \vsize = #1\relax \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \pageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \pagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @letterpaper (the default). \def\letterpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % If page is nothing but text, make it come out even. \internalpagesizes{46\baselineskip}{6in}% {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {\voffset}{.25in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @smallerbook to reset parameters for 6x9 trim size. % (Just testing, parameters still in flux.) \def\smallerbook{{\globaldefs = 1 \parskip = 1.5pt plus 1pt \textleading = 12pt % \internalpagesizes{7.4in}{4.8in}% {-.2in}{-.4in}% {0pt}{14pt}% {9in}{6in}% % \lispnarrowing = 0.25in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .4cm }} % Use @afourpaper to print on European A4 paper. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % Double-side printing via postscript on Laserjet 4050 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. % To change the settings for a different printer or situation, adjust % \normaloffset until the front-side and back-side texts align. Then % do the same for \bindingoffset. You can set these for testing in % your texinfo source file like this: % @tex % \global\normaloffset = -6mm % \global\bindingoffset = 10mm % @end tex \internalpagesizes{51\baselineskip}{160mm} {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \hfuzz = 1.2pt \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \internalpagesizes{237mm}{150mm}% {\voffset}{4.6mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% % % Must explicitly reset to 0 because we call \afourpaper. \globaldefs = 0 }} % Use @afourwide to print on A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \internalpagesizes{241mm}{165mm}% {\voffset}{-2.95mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% \globaldefs = 0 }} % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1 \advance\dimen0 by \voffset % \dimen2 = \hsize \advance\dimen2 by \normaloffset % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper \message{and turning on texinfo input format.} % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \catcode`\~=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\+=\other \catcode`\$=\other \def\normaldoublequote{"} \def\normaltilde{~} \def\normalcaret{^} \def\normalunderscore{_} \def\normalverticalbar{|} \def\normalless{<} \def\normalgreater{>} \def\normalplus{+} \def\normaldollar{$}%$ font-lock fix % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def~{{\tt\char126}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \let\realunder=_ % Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have \everyjob (or @setfilename) turn them on. % \otherifyactive is called near the end of this file. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ \global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work % \realbackslash is an actual character `\' with catcode other, and % \doublebackslash is two of them (for the pdf outlines). {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} % In texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active @def@normalbackslash{{@tt@backslashcurfont}} % On startup, @fixbackslash assigns: % @let \ = @normalbackslash % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. % @def@normalturnoffactive{% @let\=@normalbackslash @let"=@normaldoublequote @let~=@normaltilde @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let<=@normalless @let>=@normalgreater @let+=@normalplus @let$=@normaldollar %$ font-lock fix @unsepspaces } % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @otherifyactive % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\' in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{% @ifx\@eatinput @let\ = @normalbackslash @fi @catcode`+=@active @catcode`@_=@active } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These look ok in all fonts, so just make them not special. @catcode`@& = @other @catcode`@# = @other @catcode`@% = @other @c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @ignore arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 @end ignore geomview-1.9.5/doc/pt_BR/acentos_texinfo.sh0000644000175000017500000000330412310110175015557 00000000000000#!/bin/bash #powered by Jorge Barros de Abreu under GPL #ficmatin01 at solar dot com dot br # this script needs "sed" and "mktemp" command #adjust iso8859-1 characters to texinfo ARQ_TMP='mkstemp' if [ $# = 0 ] #testa se nao existe parametro then echo -e "\n\tScript for diacritical marks in texinfo" echo -e "\n\tThis script needs "sed" and "mktemp" command" echo -e "\tusage: $0 file.texi" echo -e "\tthe output is renamed to file.texi itself" echo exit 1 fi cat $1 | sed "/é/s/é/@'{e}/g" > $ARQ_TMP cat $ARQ_TMP | sed "/á/s/á/@'{a}/g" > $1 # cat $1 | sed "/ç/s/ç/@value{cedilha}/g" > $ARQ_TMP # cat $1 | sed "/Ç/s/Ç/@value{Cedilha}/g" > $ARQ_TMP cat $1 | sed "/ç/s/ç/@,{c}/g" > $ARQ_TMP cat $ARQ_TMP | sed "/ã/s/ã/@~{a}/g" > $1 cat $1 | sed "/Á/s/Á/@'{A}/g" > $ARQ_TMP cat $ARQ_TMP | sed "/à/s/à/@\`{a}/g" > $1 cat $1 | sed "/À/s/À/@\`{A}/g" > $ARQ_TMP cat $ARQ_TMP | sed "/É/s/É/@'{E}/g" > $1 cat $1 | sed "/Í/s/Í/@'{I}/g" > $ARQ_TMP cat $ARQ_TMP | sed "/ú/s/ú/@'{u}/g" > $1 cat $1 | sed "/Ú/s/Ú/@'{U}/g" > $ARQ_TMP cat $ARQ_TMP | sed "/Ç/s/Ç/@,{C}/g" > $1 cat $1 | sed "/õ/s/õ/@~{o}/g" > $ARQ_TMP cat $ARQ_TMP | sed "/Õ/s/Õ/@~{O}/g" > $1 cat $1 | sed "/ü/s/ü/@\"{u}/g" > $ARQ_TMP cat $ARQ_TMP | sed "/Ü/s/Ü/@\"{U}/g" > $1 cat $1 | sed "/Ã/s/Ã/@~{A}/g" > $ARQ_TMP cat $ARQ_TMP | sed "/ó/s/ó/@'{o}/g" > $1 cat $1 | sed "/Ê/s/Ê/@^{E}/g" > $ARQ_TMP cat $ARQ_TMP | sed "/ê/s/ê/@^{e}/g" > $1 cat $1 | sed "/í/s/í/@'{i}/g" > $ARQ_TMP cat $ARQ_TMP | sed "/ê/s/ê/@^{e}/g" > $1 cat $1 | sed "/ô/s/ô/@^{o}/g" > $ARQ_TMP cat $ARQ_TMP | sed "/Ô/s/Ô/@^{O}/g" > $1 cat $1 | sed "/â/s/â/@^{a}/g" > $ARQ_TMP cat $ARQ_TMP | sed "/Â/s/Â/@^{A}/g" > $1 rm $ARQ_TMPgeomview-1.9.5/doc/pt_BR/geomview_cvs.sh0000755000175000017500000000104412310110175015066 00000000000000#commands for manual-pt_BR creation (manual compilation only) #texi2dvi needs two excutions for index and links creation #created on a slackware 12 under GPL by #Jorge Barros de Abreu cd ../figs eps2pdf1.sh cd ../pt_BR texi2dvi --pdf --batch ../geomview-pt_BR.texi texi2dvi --pdf --batch ../geomview-pt_BR.texi makeinfo --force --enable-encoding ../geomview-pt_BR.texi -o geomview.info texi2html -lang pt --split=chapter --output=tmp-html ../geomview-pt_BR.texi rm *.vr *.tp *.toc *.pg *.ky *BR.log *.fn* *.cp *.aux cd ../figs rm *.pdf cd ../pt_BR geomview-1.9.5/doc/Makefile.in0000644000175000017500000011147312310165551013111 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = doc DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs mdate-sh $(srcdir)/version.texi \ $(srcdir)/stamp-vti $(srcdir)/version-pt_BR.texi \ $(srcdir)/stamp-1 texinfo.tex README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/set-prefix.m4 \ $(top_srcdir)/m4/withtool.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = AM_V_DVIPS = $(am__v_DVIPS_@AM_V@) am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@) am__v_DVIPS_0 = @echo " DVIPS " $@; am__v_DVIPS_1 = AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@) am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@) am__v_MAKEINFO_0 = @echo " MAKEINFO" $@; am__v_MAKEINFO_1 = AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@) am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@) am__v_INFOHTML_0 = @echo " INFOHTML" $@; am__v_INFOHTML_1 = AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@) am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@) am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@; am__v_TEXI2DVI_1 = AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@) am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@) am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@; am__v_TEXI2PDF_1 = AM_V_texinfo = $(am__v_texinfo_@AM_V@) am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@) am__v_texinfo_0 = -q am__v_texinfo_1 = AM_V_texidevnull = $(am__v_texidevnull_@AM_V@) am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@) am__v_texidevnull_0 = > /dev/null am__v_texidevnull_1 = INFO_DEPS = $(srcdir)/geomview $(srcdir)/geomview-pt_BR am__TEXINFO_TEX_DIR = $(srcdir) DVIS = geomview.dvi geomview-pt_BR.dvi PDFS = geomview.pdf geomview-pt_BR.pdf PSS = geomview.ps geomview-pt_BR.ps HTMLS = geomview.html geomview-pt_BR.html TEXINFOS = geomview.texi geomview-pt_BR.texi TEXI2DVI = texi2dvi TEXI2PDF = $(TEXI2DVI) --pdf --batch MAKEINFOHTML = $(MAKEINFO) --html AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) DVIPS = dvips am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man3dir)" \ "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(docdir)" \ "$(DESTDIR)$(infoimgdir)" 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; }; \ } man3dir = $(mandir)/man3 man5dir = $(mandir)/man5 NROFF = nroff MANS = $(man_MANS) DATA = $(doc_DATA) $(nobase_infoimg_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ 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@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ PSIMAGES = figs/ap.ps figs/command.ps figs/light.ps figs/mat.ps\ figs/secondlinelist.ps figs/cam.ps figs/fig2.ps figs/load.ps\ figs/myfilelist.ps figs/tools.ps figs/color.ps figs/initial.ps\ figs/main.ps figs/save.ps figs/trefdodecinter.ps EPSIMAGES = $(PSIMAGES:.ps=.eps) PDFIMAGES = $(PSIMAGES:.ps=.pdf) PNGIMAGES = $(PSIMAGES:.ps=.png) LANGUAGES = "" "-pt_BR" man_MANS = geomview.5gv lisp.3gv oogl.5gv EXTRA_DIST = geomview.pdf geomview.html\ geomview-pt_BR.pdf geomview-pt_BR.html\ README README.gvplot oogltour oogltour-pt_BR\ example1.c example2.c example3.c example4.tcl\ OOGL.m.txt motion.tex $(man_MANS)\ $(PSIMAGES) $(PNGIMAGES) $(PDFIMAGES) $(EPSIMAGES)\ pt_BR/texinfo.tex pt_BR/acentos_texinfo.sh pt_BR/geomview_cvs.sh\ FAQ/FAQ-pt_BR.html FAQ/FAQ-pt_BR.tex FAQ/FAQ.html FAQ/FAQ.tex FAQ/README AM_MAKEINFOFLAGS = --no-validate info_TEXINFOS = geomview.texi geomview-pt_BR.texi infoimgdir = $(infodir) nobase_infoimg_DATA = $(PNGIMAGES) geomview_pt_BR_texi_MAKEINFOFLAGS = --enable-encoding --lang=pt_BR dochtmldir = $(docdir)/html doc_DATA = geomview.pdf geomview-pt_BR.pdf TEXINPUTS = $(srcdir):.: MAINTAINERCLEANFILES = \ $(PNGIMAGES) $(PDFIMAGES) $(EPSIMAGES) geomview.pdf geomview-pt_BR.pdf all: all-am .SUFFIXES: .SUFFIXES: .dvi .eps .html .pdf .png .ps .texi $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs $(srcdir)/geomview: geomview.texi $(srcdir)/version.texi $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \ am__cwd=`pwd` && $(am__cd) $(srcdir) && \ rm -rf $$backupdir && mkdir $$backupdir && \ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ done; \ else :; fi && \ cd "$$am__cwd"; \ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $@ $(srcdir)/geomview.texi; \ then \ rc=0; \ $(am__cd) $(srcdir); \ else \ rc=$$?; \ $(am__cd) $(srcdir) && \ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ fi; \ rm -rf $$backupdir; exit $$rc .texi.dvi: $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \ $< .texi.pdf: $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \ $< .texi.html: $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp) $(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $(@:.html=.htp) $<; \ then \ rm -rf $@ && mv $(@:.html=.htp) $@; \ else \ rm -rf $(@:.html=.htp); exit 1; \ fi $(srcdir)/version.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/stamp-vti $(srcdir)/stamp-vti: geomview.texi $(top_srcdir)/configure @(dir=.; test -f ./geomview.texi || dir=$(srcdir); \ set `$(SHELL) $(srcdir)/mdate-sh $$dir/geomview.texi`; \ echo "@set UPDATED $$1 $$2 $$3"; \ echo "@set UPDATED-MONTH $$2 $$3"; \ echo "@set EDITION $(VERSION)"; \ echo "@set VERSION $(VERSION)") > vti.tmp @cmp -s vti.tmp $(srcdir)/version.texi \ || (echo "Updating $(srcdir)/version.texi"; \ cp vti.tmp $(srcdir)/version.texi) -@rm -f vti.tmp @cp $(srcdir)/version.texi $@ mostlyclean-vti: -rm -f vti.tmp maintainer-clean-vti: @MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi $(srcdir)/geomview-pt_BR: geomview-pt_BR.texi $(srcdir)/version-pt_BR.texi $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \ am__cwd=`pwd` && $(am__cd) $(srcdir) && \ rm -rf $$backupdir && mkdir $$backupdir && \ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ done; \ else :; fi && \ cd "$$am__cwd"; \ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $@ $(srcdir)/geomview-pt_BR.texi; \ then \ rc=0; \ $(am__cd) $(srcdir); \ else \ rc=$$?; \ $(am__cd) $(srcdir) && \ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ fi; \ rm -rf $$backupdir; exit $$rc $(srcdir)/version-pt_BR.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/stamp-1 $(srcdir)/stamp-1: geomview-pt_BR.texi $(top_srcdir)/configure @(dir=.; test -f ./geomview-pt_BR.texi || dir=$(srcdir); \ set `$(SHELL) $(srcdir)/mdate-sh $$dir/geomview-pt_BR.texi`; \ echo "@set UPDATED $$1 $$2 $$3"; \ echo "@set UPDATED-MONTH $$2 $$3"; \ echo "@set EDITION $(VERSION)"; \ echo "@set VERSION $(VERSION)") > 1.tmp @cmp -s 1.tmp $(srcdir)/version-pt_BR.texi \ || (echo "Updating $(srcdir)/version-pt_BR.texi"; \ cp 1.tmp $(srcdir)/version-pt_BR.texi) -@rm -f 1.tmp @cp $(srcdir)/version-pt_BR.texi $@ mostlyclean-1: -rm -f 1.tmp maintainer-clean-1: @MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/stamp-1 $(srcdir)/version-pt_BR.texi .dvi.ps: $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ $(DVIPS) $(AM_V_texinfo) -o $@ $< uninstall-dvi-am: @$(NORMAL_UNINSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ rm -f "$(DESTDIR)$(dvidir)/$$f"; \ done uninstall-html-am: @$(NORMAL_UNINSTALL) @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ done uninstall-info-am: @$(PRE_UNINSTALL) @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ done; \ else :; fi @$(NORMAL_UNINSTALL) @list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ else :; fi); \ done uninstall-pdf-am: @$(NORMAL_UNINSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ done uninstall-ps-am: @$(NORMAL_UNINSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ rm -f "$(DESTDIR)$(psdir)/$$f"; \ done dist-info: $(INFO_DEPS) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; \ for base in $$list; do \ case $$base in \ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$base; then d=.; else d=$(srcdir); fi; \ base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ if test -f $$file; then \ relfile=`expr "$$file" : "$$d/\(.*\)"`; \ test -f "$(distdir)/$$relfile" || \ cp -p $$file "$(distdir)/$$relfile"; \ else :; fi; \ done; \ done clean-aminfo: -test -z "geomview.dvi geomview.pdf geomview.ps geomview.html geomview-pt_BR.dvi \ geomview-pt_BR.pdf geomview-pt_BR.ps geomview-pt_BR.html" \ || rm -rf geomview.dvi geomview.pdf geomview.ps geomview.html geomview-pt_BR.dvi \ geomview-pt_BR.pdf geomview-pt_BR.ps geomview-pt_BR.html maintainer-clean-aminfo: @list='$(INFO_DEPS)'; for i in $$list; do \ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ done install-man3: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man3dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.3[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ done; } uninstall-man3: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man3dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.3[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) install-man5: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man5dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.5[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ done; } uninstall-man5: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man5dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.5[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir) install-docDATA: $(doc_DATA) @$(NORMAL_INSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || 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)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-docDATA: @$(NORMAL_UNINSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) install-nobase_infoimgDATA: $(nobase_infoimg_DATA) @$(NORMAL_INSTALL) @list='$(nobase_infoimg_DATA)'; test -n "$(infoimgdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(infoimgdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(infoimgdir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(infoimgdir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(infoimgdir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(infoimgdir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(infoimgdir)/$$dir" || exit $$?; }; \ done uninstall-nobase_infoimgDATA: @$(NORMAL_UNINSTALL) @list='$(nobase_infoimg_DATA)'; test -n "$(infoimgdir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(infoimgdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-info dist-hook check-am: all-am check: check-am all-am: Makefile $(INFO_DEPS) $(MANS) $(DATA) all-local installdirs: for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(infoimgdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-aminfo clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-local dvi: dvi-am dvi-am: $(DVIS) html: html-am html-am: $(HTMLS) info: info-am info-am: $(INFO_DEPS) install-data-am: install-data-local install-docDATA install-info-am \ install-man install-nobase_infoimgDATA install-dvi: install-dvi-am install-dvi-am: $(DVIS) @$(NORMAL_INSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dvidir)" || 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)$(dvidir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ done install-exec-am: install-html: install-html-am install-html-am: $(HTMLS) @$(NORMAL_INSTALL) @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__strip_dir) \ d2=$$d$$p; \ if test -d "$$d2"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \ $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ else \ list2="$$list2 $$d2"; \ fi; \ done; \ test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ done; } install-info: install-info-am install-info-am: $(INFO_DEPS) @$(NORMAL_INSTALL) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \ $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \ fi; \ for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ if test -f $$ifile; then \ echo "$$ifile"; \ else : ; fi; \ done; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done @$(POST_INSTALL) @if $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ done; \ else : ; fi install-man: install-man3 install-man5 install-pdf: install-pdf-am install-pdf-am: $(PDFS) @$(NORMAL_INSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || 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)$(pdfdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done install-ps: install-ps-am install-ps-am: $(PSS) @$(NORMAL_INSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(psdir)" || 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)$(psdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-1 \ maintainer-clean-aminfo maintainer-clean-generic \ maintainer-clean-vti mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-1 mostlyclean-aminfo mostlyclean-generic \ mostlyclean-libtool mostlyclean-vti pdf: pdf-am pdf-am: $(PDFS) ps: ps-am ps-am: $(PSS) uninstall-am: uninstall-docDATA uninstall-dvi-am uninstall-html-am \ uninstall-info-am uninstall-local uninstall-man \ uninstall-nobase_infoimgDATA uninstall-pdf-am uninstall-ps-am uninstall-man: uninstall-man3 uninstall-man5 .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-aminfo \ clean-generic clean-libtool cscopelist-am ctags-am dist-hook \ dist-info distclean distclean-generic distclean-libtool \ distclean-local distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-data-local install-docDATA install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man3 \ install-man5 install-nobase_infoimgDATA install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-1 maintainer-clean-aminfo \ maintainer-clean-generic maintainer-clean-vti mostlyclean \ mostlyclean-1 mostlyclean-aminfo mostlyclean-generic \ mostlyclean-libtool mostlyclean-vti pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am uninstall-docDATA \ uninstall-dvi-am uninstall-html-am uninstall-info-am \ uninstall-local uninstall-man uninstall-man3 uninstall-man5 \ uninstall-nobase_infoimgDATA uninstall-pdf-am uninstall-ps-am geomview.pdf: $(PDFIMAGES) geomview.ps: $(EPSIMAGES) geomview.dvi: $(EPSIMAGES) geomview.html: $(PNGIMAGES) geomview-pt_BR.pdf: $(PDFIMAGES) geomview-pt_BR.ps: $(EPSIMAGES) geomview-pt_BR.dvi: $(EPSIMAGES) geomview-pt_BR.html: $(PNGIMAGES) all-local: htdocs pdf htdocs/*.html htdocs/figs/*.png: htdocs htdocs: geomview.html geomview-pt_BR.html if test -d $@; then rm -rf $@; fi for loc in $(LANGUAGES); do \ if test -d $(srcdir)/geomview$${loc}.html; then \ htmldir=$(srcdir)/geomview$${loc}.html; \ else \ htmldir=geomview$${loc}.html; \ fi; \ loc2=`echo $${loc}|$(SED) -e 's/-//g'`; \ $(MKDIR_P) $@/$${loc2}; \ cp -R $${htmldir}/. $@/$${loc2}/.; \ $(MKDIR_P) $@/$${loc2}/figs; \ chmod 0755 $@/$${loc2}/figs; \ for f in $(PNGIMAGES); do \ test -f $(srcdir)/$$f && f=$(srcdir)/$$f; \ cp $$f $@/$${loc2}/figs/; \ done; \ done; \ chmod 0755 $@; \ find $@ -type f -exec chmod 644 \{\} \; install-data-local: htdocs $(MKDIR_P) $(DESTDIR)$(dochtmldir) cp -pR htdocs/. $(DESTDIR)$(dochtmldir)/. chmod 0755 $(DESTDIR)$(dochtmldir) find $(DESTDIR)$(dochtmldir) -type d -exec chmod 0755 \{\} \; find $(DESTDIR)$(dochtmldir) -type f -exec chmod 644 \{\} \; uninstall-local: rm -rf $(DESTDIR)$(dochtmldir) .ps.eps: @D=`dirname $@`; $(MKDIR_P) $$D $(PS2EPSI) $< $@ .eps.pdf: @D=`dirname $@`; $(MKDIR_P) $$D $(EPSTOPDF) $< .pdf.png: $(MKDIR_P) figs $(PDFIMAGESPROG) $< $(<:.pdf=) $(PNMTOPNG) $(<:.pdf=-000.ppm) > $@ -rm -f $(<:.pdf=-000.ppm) # Anoyingly, automake includes XXX~ files into the distro, caused by a # somewhat broken dist-info: target. dist-hook: html pdf rm -rf `find $(distdir) -name '*~'` distclean-local: -rm -rf htdocs -rm -rf *.t2d maintainerclean-local: -for loc in $(LANGUAGES); do rm -rf geomview$${loc}.html; done # # override to disable deletion of .pdf, .html by the user. # mostlyclean-aminfo: -for loc in $(LANGUAGES); do \ rm -rf \ geomview$${loc}.aux geomview$${loc}.cp geomview$${loc}.cps \ geomview$${loc}.fn geomview$${loc}.fns geomview$${loc}.ky \ geomview$${loc}.kys geomview$${loc}.log geomview$${loc}.pg \ geomview$${loc}.pgs geomview$${loc}.tmp geomview$${loc}.toc \ geomview$${loc}.tp geomview$${loc}.tps geomview$${loc}.vr \ geomview$${loc}.vrs geomview$${loc}.dvi geomview$${loc}.ps ; \ done # 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: geomview-1.9.5/doc/Makefile.am0000644000175000017500000000701312310163346013072 00000000000000PSIMAGES = figs/ap.ps figs/command.ps figs/light.ps figs/mat.ps\ figs/secondlinelist.ps figs/cam.ps figs/fig2.ps figs/load.ps\ figs/myfilelist.ps figs/tools.ps figs/color.ps figs/initial.ps\ figs/main.ps figs/save.ps figs/trefdodecinter.ps EPSIMAGES = $(PSIMAGES:.ps=.eps) PDFIMAGES = $(PSIMAGES:.ps=.pdf) PNGIMAGES = $(PSIMAGES:.ps=.png) LANGUAGES = "" "-pt_BR" man_MANS = geomview.5gv lisp.3gv oogl.5gv EXTRA_DIST = geomview.pdf geomview.html\ geomview-pt_BR.pdf geomview-pt_BR.html\ README README.gvplot oogltour oogltour-pt_BR\ example1.c example2.c example3.c example4.tcl\ OOGL.m.txt motion.tex $(man_MANS)\ $(PSIMAGES) $(PNGIMAGES) $(PDFIMAGES) $(EPSIMAGES)\ pt_BR/texinfo.tex pt_BR/acentos_texinfo.sh pt_BR/geomview_cvs.sh\ FAQ/FAQ-pt_BR.html FAQ/FAQ-pt_BR.tex FAQ/FAQ.html FAQ/FAQ.tex FAQ/README AM_MAKEINFOFLAGS = --no-validate info_TEXINFOS = geomview.texi geomview-pt_BR.texi infoimgdir = $(infodir) nobase_infoimg_DATA = $(PNGIMAGES) geomview_pt_BR_texi_MAKEINFOFLAGS = --enable-encoding --lang=pt_BR dochtmldir = $(docdir)/html doc_DATA = geomview.pdf geomview-pt_BR.pdf geomview.pdf: $(PDFIMAGES) geomview.ps: $(EPSIMAGES) geomview.dvi: $(EPSIMAGES) geomview.html: $(PNGIMAGES) geomview-pt_BR.pdf: $(PDFIMAGES) geomview-pt_BR.ps: $(EPSIMAGES) geomview-pt_BR.dvi: $(EPSIMAGES) geomview-pt_BR.html: $(PNGIMAGES) TEXINPUTS = $(srcdir):.: all-local: htdocs pdf htdocs/*.html htdocs/figs/*.png: htdocs htdocs: geomview.html geomview-pt_BR.html if test -d $@; then rm -rf $@; fi for loc in $(LANGUAGES); do \ if test -d $(srcdir)/geomview$${loc}.html; then \ htmldir=$(srcdir)/geomview$${loc}.html; \ else \ htmldir=geomview$${loc}.html; \ fi; \ loc2=`echo $${loc}|$(SED) -e 's/-//g'`; \ $(MKDIR_P) $@/$${loc2}; \ cp -R $${htmldir}/. $@/$${loc2}/.; \ $(MKDIR_P) $@/$${loc2}/figs; \ chmod 0755 $@/$${loc2}/figs; \ for f in $(PNGIMAGES); do \ test -f $(srcdir)/$$f && f=$(srcdir)/$$f; \ cp $$f $@/$${loc2}/figs/; \ done; \ done; \ chmod 0755 $@; \ find $@ -type f -exec chmod 644 \{\} \; install-data-local: htdocs $(MKDIR_P) $(DESTDIR)$(dochtmldir) cp -pR htdocs/. $(DESTDIR)$(dochtmldir)/. chmod 0755 $(DESTDIR)$(dochtmldir) find $(DESTDIR)$(dochtmldir) -type d -exec chmod 0755 \{\} \; find $(DESTDIR)$(dochtmldir) -type f -exec chmod 644 \{\} \; uninstall-local: rm -rf $(DESTDIR)$(dochtmldir) .ps.eps: @D=`dirname $@`; $(MKDIR_P) $$D $(PS2EPSI) $< $@ .eps.pdf: @D=`dirname $@`; $(MKDIR_P) $$D $(EPSTOPDF) $< .pdf.png: $(MKDIR_P) figs $(PDFIMAGESPROG) $< $(<:.pdf=) $(PNMTOPNG) $(<:.pdf=-000.ppm) > $@ -rm -f $(<:.pdf=-000.ppm) # Anoyingly, automake includes XXX~ files into the distro, caused by a # somewhat broken dist-info: target. dist-hook: html pdf rm -rf `find $(distdir) -name '*~'` MAINTAINERCLEANFILES = \ $(PNGIMAGES) $(PDFIMAGES) $(EPSIMAGES) geomview.pdf geomview-pt_BR.pdf distclean-local: -rm -rf htdocs -rm -rf *.t2d maintainerclean-local: -for loc in $(LANGUAGES); do rm -rf geomview$${loc}.html; done # # override to disable deletion of .pdf, .html by the user. # mostlyclean-aminfo: -for loc in $(LANGUAGES); do \ rm -rf \ geomview$${loc}.aux geomview$${loc}.cp geomview$${loc}.cps \ geomview$${loc}.fn geomview$${loc}.fns geomview$${loc}.ky \ geomview$${loc}.kys geomview$${loc}.log geomview$${loc}.pg \ geomview$${loc}.pgs geomview$${loc}.tmp geomview$${loc}.toc \ geomview$${loc}.tp geomview$${loc}.tps geomview$${loc}.vr \ geomview$${loc}.vrs geomview$${loc}.dvi geomview$${loc}.ps ; \ done geomview-1.9.5/doc/mdate-sh0000755000175000017500000001363712310165551012477 00000000000000#!/bin/sh # Get modification time of a file or directory and pretty-print it. scriptversion=2010-08-21.06; # UTC # Copyright (C) 1995-2013 Free Software Foundation, Inc. # written by Ulrich Drepper , June 1995 # # This program is free software; you can redistribute 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 # . 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 fi case $1 in '') echo "$0: No file. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: mdate-sh [--help] [--version] FILE Pretty-print the modification day of FILE, in the format: 1 January 1970 Report bugs to . EOF exit $? ;; -v | --v*) echo "mdate-sh $scriptversion" exit $? ;; esac error () { echo "$0: $1" >&2 exit 1 } # Prevent date giving response in another language. LANG=C export LANG LC_ALL=C export LC_ALL LC_TIME=C export LC_TIME # GNU ls changes its time format in response to the TIME_STYLE # variable. Since we cannot assume 'unset' works, revert this # variable to its documented default. if test "${TIME_STYLE+set}" = set; then TIME_STYLE=posix-long-iso export TIME_STYLE fi save_arg1=$1 # Find out how to get the extended ls output of a file or directory. if ls -L /dev/null 1>/dev/null 2>&1; then ls_command='ls -L -l -d' else ls_command='ls -l -d' fi # Avoid user/group names that might have spaces, when possible. if ls -n /dev/null 1>/dev/null 2>&1; then ls_command="$ls_command -n" fi # A 'ls -l' line looks as follows on OS/2. # drwxrwx--- 0 Aug 11 2001 foo # This differs from Unix, which adds ownership information. # drwxrwx--- 2 root root 4096 Aug 11 2001 foo # # To find the date, we split the line on spaces and iterate on words # until we find a month. This cannot work with files whose owner is a # user named "Jan", or "Feb", etc. However, it's unlikely that '/' # will be owned by a user whose name is a month. So we first look at # the extended ls output of the root directory to decide how many # words should be skipped to get the date. # On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. set x`$ls_command /` # Find which argument is the month. month= command= until test $month do test $# -gt 0 || error "failed parsing '$ls_command /' output" shift # Add another shift to the command. command="$command shift;" case $1 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac done test -n "$month" || error "failed parsing '$ls_command /' output" # Get the extended ls output of the file or directory. set dummy x`eval "$ls_command \"\\\$save_arg1\""` # Remove all preceding arguments eval $command # Because of the dummy argument above, month is in $2. # # On a POSIX system, we should have # # $# = 5 # $1 = file size # $2 = month # $3 = day # $4 = year or time # $5 = filename # # On Darwin 7.7.0 and 7.6.0, we have # # $# = 4 # $1 = day # $2 = month # $3 = year or time # $4 = filename # Get the month. case $2 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac case $3 in ???*) day=$1;; *) day=$3; shift;; esac # Here we have to deal with the problem that the ls output gives either # the time of day or the year. case $3 in *:*) set `date`; eval year=\$$# case $2 in Jan) nummonthtod=1;; Feb) nummonthtod=2;; Mar) nummonthtod=3;; Apr) nummonthtod=4;; May) nummonthtod=5;; Jun) nummonthtod=6;; Jul) nummonthtod=7;; Aug) nummonthtod=8;; Sep) nummonthtod=9;; Oct) nummonthtod=10;; Nov) nummonthtod=11;; Dec) nummonthtod=12;; esac # For the first six month of the year the time notation can also # be used for files modified in the last year. if (expr $nummonth \> $nummonthtod) > /dev/null; then year=`expr $year - 1` fi;; *) year=$3;; esac # The result. echo $day $month $year # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: geomview-1.9.5/doc/version.texi0000644000175000017500000000013712310147164013416 00000000000000@set UPDATED 12 March 2014 @set UPDATED-MONTH March 2014 @set EDITION 1.9.5 @set VERSION 1.9.5 geomview-1.9.5/doc/stamp-vti0000644000175000017500000000013712310165605012705 00000000000000@set UPDATED 12 March 2014 @set UPDATED-MONTH March 2014 @set EDITION 1.9.5 @set VERSION 1.9.5 geomview-1.9.5/doc/version-pt_BR.texi0000644000175000017500000000013712310147164014422 00000000000000@set UPDATED 12 March 2014 @set UPDATED-MONTH March 2014 @set EDITION 1.9.5 @set VERSION 1.9.5 geomview-1.9.5/doc/stamp-10000644000175000017500000000013712310165605012243 00000000000000@set UPDATED 12 March 2014 @set UPDATED-MONTH March 2014 @set EDITION 1.9.5 @set VERSION 1.9.5 geomview-1.9.5/doc/texinfo.tex0000644000175000017500000116703612310165551013251 00000000000000% texinfo.tex -- TeX macros to handle Texinfo files. % % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % \def\texinfoversion{2013-02-01.11} % % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, % 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. % % This texinfo.tex 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 texinfo.tex file is distributed in the hope that it will be % useful, but WITHOUT ANY WARRANTY; without even the implied warranty % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU % 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, when this file is read by TeX when processing % a Texinfo source document, you may use the result without % restriction. This Exception is an additional permission under section 7 % of the GNU General Public License, version 3 ("GPLv3"). % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or % http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or % http://www.gnu.org/software/texinfo/ (the Texinfo home page) % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. Please include including a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary. % % It is possible to adapt texinfo.tex for other languages, to some % extent. You can get the existing language-specific files from the % full Texinfo distribution. % % The GNU Texinfo home page is http://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. % For @tex, we can use \tabalign. \let\+ = \relax % Save some plain tex macros whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexfootnote=\footnote \let\ptexgtr=> \let\ptexhat=^ \let\ptexi=\i \let\ptexindent=\indent \let\ptexinsert=\insert \let\ptexlbrace=\{ \let\ptexless=< \let\ptexnewwrite\newwrite \let\ptexnoindent=\noindent \let\ptexplus=+ \let\ptexraggedright=\raggedright \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexstar=\* \let\ptext=\t \let\ptextop=\top {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Pre-3.0. \else \def\linenumber{l.\the\inputlineno:\space} \fi % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi \ifx\putworderror\undefined \gdef\putworderror{error}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % Since the category of space is not known, we have to be careful. \chardef\spacecat = 10 \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. \chardef\ampChar = `\& \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\hashChar = `\# \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; \chardef\slashChar = `\/ \chardef\underChar = `\_ % Ignore a token. % \def\gobble#1{} % The following is used inside several \edef's. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} % Hyphenation fixes. \hyphenation{ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ap-pen-dix bit-map bit-maps data-base data-bases eshell fall-ing half-way long-est man-u-script man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces spell-ing spell-ings stand-alone strong-est time-stamp time-stamps which-ever white-space wide-spread wrap-around } % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. We also make % some effort to order the tracing commands to reduce output in the log % file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\thisisundefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % @errormsg{MSG}. Do the index-like expansions on MSG, but if things % aren't perfect, it's not the end of the world, being an error message, % after all. % \def\errormsg{\begingroup \indexnofonts \doerrormsg} \def\doerrormsg#1{\errmessage{#1}} % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\cornerlong \cornerlong=1pc \newdimen\cornerthick \cornerthick=.3pt \newdimen\topandbottommargin \topandbottommargin=.75in % Output a mark which sets \thischapter, \thissection and \thiscolor. % We dump everything together because we only have one kind of mark. % This works because we only use \botmark / \topmark, not \firstmark. % % A mark contains a subexpression of the \ifcase ... \fi construct. % \get*marks macros below extract the needed part using \ifcase. % % Another complication is to let the user choose whether \thischapter % (\thissection) refers to the chapter (section) in effect at the top % of a page, or that at the bottom of a page. The solution is % described on page 260 of The TeXbook. It involves outputting two % marks for the sectioning macros, one before the section break, and % one after. I won't pretend I can describe this better than DEK... \def\domark{% \toks0=\expandafter{\lastchapterdefs}% \toks2=\expandafter{\lastsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\lastcolordefs}% \mark{% \the\toks0 \the\toks2 \noexpand\or \the\toks4 \the\toks6 \noexpand\else \the\toks8 }% } % \topmark doesn't work for the very first chapter (after the title % page or the contents), so we use \firstmark there -- this gets us % the mark with the chapter defs, unless the user sneaks in, e.g., % @setcolor (or @url, or @link, etc.) between @contents and the very % first @chapter. \def\gettopheadingmarks{% \ifcase0\topmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\topmark\fi} % Avoid "undefined control sequence" errors. \def\lastchapterdefs{} \def\lastsectiondefs{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\lastcolordefs{} % Main output routine. \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions, but you have to call it yourself. \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% % {% % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \indexdummies % don't expand commands in the output. \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an example. % We don't want .vr (or whatever) entries like this: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; % it needs to be % {\code {{\tt \backslashcurfont }acronym} \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \vskip-\topandbottommargin \vtop to0pt{% \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \unvbox\footlinebox \fi % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \vbox to0pt{\vss \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% }% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \indexdummies \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1\relax \unvbox#1\relax \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurrence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % This space token undergoes the same procedure and is eventually removed % by \finishparsearg. % \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% \def\temp{#3}% \ifx\temp\empty % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: \let\temp\finishparsearg \else \let\temp\argcheckspaces \fi % Put the space token in: \temp#1 #3\ArgTerm } % If a _delimited_ argument is enclosed in braces, they get stripped; so % to get _exactly_ the rest of the line, we had to prevent such situation. % We prepended an \empty token at the very beginning and we expand it now, % just before passing the control to \argtorun. % (Similarly, we have to think about #3 of \argcheckspacesY above: it is % either the null string, or it ends with \^^M---thus there is no danger % that a pair of braces would be stripped. % % But first, we have to remove the trailing space token. % \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} % % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my % favourite TeX trick. --kasal, 16nov03 \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } \def\doparseargdef#1#2{% \def#2{\parsearg#1}% \def#1##1% } % Several utility definitions with active space: { \obeyspaces \gdef\obeyedspace{ } % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % \gdef\sepspaces{\obeyspaces\let =\tie} % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\leavevmode \penalty \@M \ ). \gdef\unsepspaces{\let =\space} } \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} % Define the framework for environments in texinfo.tex. It's used like this: % % \envdef\foo{...} % \def\Efoo{...} % % It's the responsibility of \envdef to insert \begingroup before the % actual body; @end closes the group after calling \Efoo. \envdef also % defines \thisenv, so the current environment is known; @end checks % whether the environment name matches. The \checkenv macro can also be % used to check whether the current environment is the one expected. % % Non-false conditionals (@iftex, @ifset) don't fit into this, so they % are not treated as environments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At run-time, environments start with this: \def\startenvironment#1{\begingroup\def\thisenv{#1}} % initialize \let\thisenv\empty % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% \def\temp{#1}% \ifx\thisenv\temp \else \badenverr \fi } % Environment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty outside of any environment% \else in environment \expandafter\string#1% \fi } % @end foo executes the definition of \Efoo. % But first, it executes a specialized version of \checkenv % \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal. \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\unskip\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \def\?{?\spacefactor=\endofsentencespacefactor\space} % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \plainfrenchspacing \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% \fi\fi } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % Another complication is that the group might be very large. This can % cause the glue on the previous page to be unduly stretched, because it % does not have much material. In this case, it's better to add an % explicit \vfill so that the extra space is at the bottom. The % threshold for doing this is if the group is more than \vfilllimit % percent of a page (\vfilllimit can be changed inside of @tex). % \newbox\groupbox \def\vfilllimit{0.7} % \envdef\group{% \ifnum\catcode`\^^M=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \startsavinginserts % \setbox\groupbox = \vtop\bgroup % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % The \vtop produces a box with normal height and large depth; thus, TeX puts % \baselineskip glue before it, and (when the next line of text is done) % \lineskip glue after it. Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% % To get correct interline space between the last line of the group % and the first line afterwards, we have to propagate \prevdepth. \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \pageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\pageheight \page \fi \fi \box\groupbox \prevdepth = \dimen1 \checkinserts } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion % class. WHICH is `l' or `r'. Not documented, written for gawk manual. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). This command % is not documented, not supported, and doesn't work. % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % @include FILE -- \input text of FILE. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable % we want to expand any @value in FILE. \turnoffactive % and allow special characters in the expansion \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @include of #1^^J}% \edef\temp{\noexpand\input #1 }% % % This trickery is to read FILE outside of a group, in case it makes % definitions, etc. \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \catcode`^=\other \catcode`_=\other \catcode`|=\other \catcode`<=\other \catcode`>=\other \catcode`+=\other \catcode`-=\other \catcode`\`=\other \catcode`\'=\other } \def\pushthisfilestack{% \expandafter\pushthisfilestackX\popthisfilestack\StackTerm } \def\pushthisfilestackX{% \expandafter\pushthisfilestackY\thisfile\StackTerm } \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% } \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} % \def\thisfile{} % @center line % outputs that line, centered. % \parseargdef\center{% \ifhmode \let\centersub\centerH \else \let\centersub\centerV \fi \centersub{\hfil \ignorespaces#1\unskip \hfil}% \let\centersub\relax % don't let the definition persist, just in case } \def\centerH#1{{% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }} % \newcount\centerpenalty \def\centerV#1{% % The idea here is the same as in \startdefun, \cartouche, etc.: if % @center is the first thing after a section heading, we need to wipe % out the negative parskip inserted by \sectionheading, but still % prevent a page break here. \centerpenalty = \lastpenalty \ifnum\centerpenalty>10000 \vskip\parskip \fi \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi \line{\kern\leftskip #1\kern\rightskip}% } % @sp n outputs n lines of vertical space % \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment % \def\comment{\begingroup \catcode`\^^M=\other% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \commentxxx} {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} % \let\c=\comment % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % NCHARS can also be the word `asis' or `none'. % We cannot feasibly implement @paragraphindent asis, though. % \def\asisword{asis} % no translation, these are keywords \def\noneword{none} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % We'll use ems for NCHARS like @paragraphindent. % It seems @exampleindent asis isn't necessary, but % I preserve it to make it similar to @paragraphindent. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \fi } % @firstparagraphindent WORD % If WORD is `none', then suppress indentation of the first paragraph % after a section heading. If WORD is `insert', then do indent at such % paragraphs. % % The paragraph indentation is suppressed or not by calling % \suppressfirstparagraphindent, which the sectioning commands do. % We switch the definition of this back and forth according to WORD. % By default, we suppress indentation. % \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} \def\insertword{insert} % \parseargdef\firstparagraphindent{% \def\temp{#1}% \ifx\temp\noneword \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent \else\ifx\temp\insertword \let\suppressfirstparagraphindent = \relax \else \errhelp = \EMsimple \errmessage{Unknown @firstparagraphindent option `\temp'}% \fi\fi } % Here is how we actually suppress indentation. Redefine \everypar to % \kern backwards by \parindent, and then reset itself to empty. % % We also make \indent itself not actually do anything until the next % paragraph. % \gdef\dosuppressfirstparagraphindent{% \gdef\indent{% \restorefirstparagraphindent \indent }% \gdef\noindent{% \restorefirstparagraphindent \noindent }% \global\everypar = {% \kern -\parindent \restorefirstparagraphindent }% } \gdef\restorefirstparagraphindent{% \global \let \indent = \ptexindent \global \let \noindent = \ptexnoindent \global \everypar = {}% } % @refill is a no-op. \let\refill=\relax % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate (before @setfilename). % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \fixbackslash % Turn off hack to swallow `\input texinfo'. \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi % \openindices needs to do some work in any case. \openindices \let\setfilename=\comment % Ignore extra @setfilename cmds. % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 % \comment % Ignore the actual filename. } % Called from \setfilename. % \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as being undefined. \ifx\pdfoutput\thisisundefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. % % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and % related messages. The final outcome is that it is up to the TeX user % to double the backslashes and otherwise make the string valid, so % that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to % do this reliably, so we use it. % #1 is a control sequence in which to do the replacements, % which we \xdef. \def\txiescapepdf#1{% \ifx\pdfescapestring\thisisundefined % No primitive available; should we give a warning or log? % Many times it won't matter. \else % The expandable \pdfescapestring primitive escapes parentheses, % backslashes, and other special chars. \xdef#1{\pdfescapestring{#1}}% \fi } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images with PDF output, and none of those formats could be found. (.eps cannot be supported due to the design of the PDF format; use regular TeX (DVI output) for that.)} \ifpdf % % Color manipulation macros based on pdfcolor.tex, % except using rgb instead of cmyk; the latter is said to render as a % very dark gray on-screen and a very dark halftone in print, instead % of actual black. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % % k sets the color for filling (usual text, etc.); % K sets the color for stroking (thin rules, e.g., normal _'s). \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\lastcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % \pdfcatalog{/PageMode /UseOutlines} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .pdf, .png, .jpg (among % others). Let's try in that order, PDF first since if % someone has a scalable image, presumably better to use that than a % bitmap. \let\pdfimgext=\empty \begingroup \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \fi \else \gdef\pdfimgext{PDF}% \fi \else \gdef\pdfimgext{pdf}% \fi \closein 1 \endgroup % % without \immediate, ancient pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifdim \wd0 >0pt width \pdfimagewidth \fi \ifdim \wd2 >0pt height \pdfimageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\pdfmkdest#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \turnoffactive \makevalueexpandable \def\pdfdestname{#1}% \txiescapepdf\pdfdestname \safewhatsit{\pdfdest name{\pdfdestname} xyz}% }} % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use a color that is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. \def\urlcolor{\rgbDarkRed} \def\linkcolor{\rgbDarkRed} \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #1 is the section text, which is what will be displayed in the % outline by the pdf viewer. #2 is the pdf expression for the number % of subentries (or empty, for subsubsections). #3 is the node text, % which might be empty if this toc entry had no corresponding node. % #4 is the page number % \def\dopdfoutline#1#2#3#4{% % Generate a link to the node text if that exists; else, use the % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. \edef\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else \txiescapepdf\pdfoutlinedest \fi % % Also escape PDF chars in the display string. \edef\pdfoutlinetext{#1}% \txiescapepdf\pdfoutlinetext % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Read toc silently, to get counts of subentries for \pdfoutline. \def\partentry##1##2##3##4{}% ignore parts in the outlines \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \def\thissecnum{0}% \def\thissubsecnum{0}% }% \def\numsecentry##1##2##3##4{% \advancenumber{chap\thischapnum}% \def\thissecnum{##2}% \def\thissubsecnum{0}% }% \def\numsubsecentry##1##2##3##4{% \advancenumber{sec\thissecnum}% \def\thissubsecnum{##2}% }% \def\numsubsubsecentry##1##2##3##4{% \advancenumber{subsec\thissubsecnum}% }% \def\thischapnum{0}% \def\thissecnum{0}% \def\thissubsecnum{0}% % % use \def rather than \let here because we redefine \chapentry et % al. a second time, below. \def\appentry{\numchapentry}% \def\appsecentry{\numsecentry}% \def\appsubsecentry{\numsubsecentry}% \def\appsubsubsecentry{\numsubsubsecentry}% \def\unnchapentry{\numchapentry}% \def\unnsecentry{\numsecentry}% \def\unnsubsecentry{\numsubsecentry}% \def\unnsubsubsecentry{\numsubsubsecentry}% \readdatafile{toc}% % % Read toc second time, this time actually producing the outlines. % The `-' means take the \expnumber as the absolute number of % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. \def\numchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% count is always zero \dopdfoutline{##1}{}{##3}{##4}}% % % PDF outlines are displayed using system fonts, instead of % document fonts. Therefore we cannot use special characters, % since the encoding is unknown. For example, the eogonek from % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % % TODO this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Too % much work for too little return. Just use the ASCII equivalents % we use for the index sort strings. % \indexnofonts \setupdatafile % We can have normal brace characters in the PDF outlines, unlike % Texinfo index files. So set that up. \def\{{\lbracecharliteral}% \def\}{\rbracecharliteral}% \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } {\catcode`[=1 \catcode`]=2 \catcode`{=\other \catcode`}=\other \gdef\lbracecharliteral[{]% \gdef\rbracecharliteral[}]% ] % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \nextsp} \def\getfilename#1{% \filenamelength=0 % If we don't expand the argument now, \skipspaces will get % snagged on things like "@value{foo}". \edef\temp{#1}% \expandafter\skipspaces\temp|\relax } \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else % non-pdf mode \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\setcolor = \gobble \let\pdfsetcolor = \gobble \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput \message{fonts,} % Change the current font style to #1, remembering it in \curfontstyle. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in % italics, not bold italics. % \def\setfontstyle#1{% \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. \csname ten#1\endcsname % change the current font } % Select #1 fonts with the current style. % \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} \def\rm{\fam=0 \setfontstyle{rm}} \def\it{\fam=\itfam \setfontstyle{it}} \def\sl{\fam=\slfam \setfontstyle{sl}} \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} \def\tt{\fam=\ttfam \setfontstyle{tt}} % Unfortunately, we have to override this for titles and the like, since % in those cases "rm" is bold. Sigh. \def\rmisbold{\rm\def\curfontstyle{bf}} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % % can get a sort of poor man's double spacing by redefining this. \def\baselinefactor{1} % \newdimen\textleading \def\setleading#1{% \dimen0 = #1\relax \normalbaselineskip = \baselinefactor\dimen0 \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % PDF CMaps. See also LaTeX's t1.cmap. % % do nothing with this by default. \expandafter\let\csname cmapOT1\endcsname\gobble \expandafter\let\csname cmapOT1IT\endcsname\gobble \expandafter\let\csname cmapOT1TT\endcsname\gobble % if we are producing pdf, and we have \pdffontattr, then define cmaps. % (\pdffontattr was introduced many years ago, but people still run % older pdftex's; it's easy to conditionalize, so we do.) \ifpdf \ifx\pdffontattr\thisisundefined \else \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1-0) %%Title: (TeX-OT1-0 TeX OT1 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1) /Supplement 0 >> def /CMapName /TeX-OT1-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <23> <26> <0023> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 40 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1IT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1IT-0) %%Title: (TeX-OT1IT-0 TeX OT1IT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1IT) /Supplement 0 >> def /CMapName /TeX-OT1IT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <25> <26> <0025> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 42 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <23> <0023> <24> <00A3> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1IT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1TT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1TT-0) %%Title: (TeX-OT1TT-0 TeX OT1TT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1TT) /Supplement 0 >> def /CMapName /TeX-OT1TT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 5 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <21> <26> <0021> <28> <5F> <0028> <61> <7E> <0061> endbfrange 32 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <2191> <0C> <2193> <0D> <0027> <0E> <00A1> <0F> <00BF> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <20> <2423> <27> <2019> <60> <2018> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1TT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% \fi\fi % Set the font macro #1 to the font named \fontprefix#2. % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). % Example: % #1 = \textrm % #2 = \rmshape % #3 = 10 % #4 = \mainmagstep % #5 = OT1 % \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% } % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % % (end of cmaps) % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\thisisundefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} % where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Definitions for a main text size of 11pt. (The default in Texinfo.) % \def\definetextfontsizexi{% % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1095} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1}{OT1} \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2}{OT1} \setfont\chapit\itbshape{10}{\magstep3}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep3}{OT1} \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} \setfont\chapsf\sfbshape{17}{1000}{OT1} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3}{OT1} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \def\chapecsize{1728} % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1}{OT1} \setfont\secit\itbshape{10}{\magstep2}{OT1IT} \setfont\secsl\slbshape{10}{\magstep2}{OT1} \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\secsf\sfbshape{12}{\magstep1}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2}{OT1} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 \def\sececsize{1440} % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} \setfont\ssecit\itbshape{10}{1315}{OT1IT} \setfont\ssecsl\slbshape{10}{1315}{OT1} \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315}{OT1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 \def\ssececsize{1200} % Reduced fonts for @acro in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000}{OT1} \setfont\reducedtt\ttshape{10}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{1000}{OT1} \setfont\reducedit\itshape{10}{1000}{OT1IT} \setfont\reducedsl\slshape{10}{1000}{OT1} \setfont\reducedsf\sfshape{10}{1000}{OT1} \setfont\reducedsc\scshape{10}{1000}{OT1} \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 \def\reducedecsize{1000} \textleading = 13.2pt % line spacing for 11pt CM \textfonts % reset the current fonts \rm } % end of 11pt text font size definitions, \definetextfontsizexi % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1000} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf}{OT1} \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1}{OT1} \setfont\chapit\itbshape{10}{\magstep2}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep2}{OT1} \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\chapsf\sfbshape{12}{\magstep1}{OT1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2}{OT1} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 \def\chapecsize{1440} % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000}{OT1} \setfont\secit\itbshape{10}{\magstep1}{OT1IT} \setfont\secsl\slbshape{10}{\magstep1}{OT1} \setfont\sectt\ttbshape{12}{1000}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} \setfont\secsf\sfbshape{12}{1000}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1}{OT1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 \def\sececsize{1200} % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000}{OT1} \setfont\ssecit\itbshape{10}{1000}{OT1IT} \setfont\ssecsl\slbshape{10}{1000}{OT1} \setfont\ssectt\ttbshape{10}{1000}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} \setfont\ssecsf\sfbshape{10}{1000}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000}{OT1} \font\sseci=cmmi10 \font\ssecsy=cmsy10 \def\ssececsize{1000} % Reduced fonts for @acro in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000}{OT1} \setfont\reducedtt\ttshape{9}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{900}{OT1} \setfont\reducedit\itshape{9}{1000}{OT1IT} \setfont\reducedsl\slshape{9}{1000}{OT1} \setfont\reducedsf\sfshape{9}{1000}{OT1} \setfont\reducedsc\scshape{10}{900}{OT1} \setfont\reducedttsl\ttslshape{10}{900}{OT1TT} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 \def\reducedecsize{0900} \divide\parskip by 2 % reduce space between paragraphs \textleading = 12pt % line spacing for 10pt CM \textfonts % reset the current fonts \rm } % end of 10pt text font size definitions, \definetextfontsizex % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xiword{11} \def\xword{10} \def\xwordpt{10pt} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% %\wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts except % in the main text, we don't bother to reset \scriptfont and % \scriptscriptfont (which would also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf \textfont\ttfam=\tentt \textfont\sffam=\tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this because \STYLE needs to also set the % current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire % \tenSTYLE to set the current font. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used in % the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \def\curfontsize{text}% \def\lsize{reduced}\def\lllsize{smaller}% \resetmathfonts \setleading{\textleading}} \def\titlefonts{% \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy \let\tenttsl=\titlettsl \def\curfontsize{title}% \def\lsize{chap}\def\lllsize{subsec}% \resetmathfonts \setleading{27pt}} \def\titlefont#1{{\titlefonts\rmisbold #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl \def\curfontsize{chap}% \def\lsize{sec}\def\lllsize{text}% \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl \def\curfontsize{sec}% \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl \def\curfontsize{ssec}% \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} \let\subsubsecfonts = \subsecfonts \def\reducedfonts{% \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy \let\tenttsl=\reducedttsl \def\curfontsize{reduced}% \def\lsize{small}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallfonts{% \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy \let\tenttsl=\smallttsl \def\curfontsize{small}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallerfonts{% \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy \let\tenttsl=\smallerttsl \def\curfontsize{smaller}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{9.5pt}} % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000}{OT1} \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000}{OT1} \setfont\shortconttt\ttshape{12}{1000}{OT1TT} % Define these just so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Set the fonts to use with the @small... environments. \let\smallexamplefonts = \smallfonts % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample % can fit this many characters: % 8.5x11=86 smallbook=72 a4=90 a5=69 % If we use \scriptfonts (8pt), then we can fit this many characters: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 % For me, subjectively, the few extra characters that fit aren't worth % the additional smallness of 8pt. So I'm making the default 9pt. % % By the way, for comparison, here's what fits with @example (10pt): % 8.5x11=71 smallbook=60 a4=75 a5=58 % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi \message{markup,} % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Markup style infrastructure. \defmarkupstylesetup\INITMACRO will % define and register \INITMACRO to be called on markup style changes. % \INITMACRO can check \currentmarkupstyle for the innermost % style and the set of \ifmarkupSTYLE switches for all styles % currently in effect. \newif\ifmarkupvar \newif\ifmarkupsamp \newif\ifmarkupkey %\newif\ifmarkupfile % @file == @samp. %\newif\ifmarkupoption % @option == @samp. \newif\ifmarkupcode \newif\ifmarkupkbd %\newif\ifmarkupenv % @env == @code. %\newif\ifmarkupcommand % @command == @code. \newif\ifmarkuptex % @tex (and part of @math, for now). \newif\ifmarkupexample \newif\ifmarkupverb \newif\ifmarkupverbatim \let\currentmarkupstyle\empty \def\setupmarkupstyle#1{% \csname markup#1true\endcsname \def\currentmarkupstyle{#1}% \markupstylesetup } \let\markupstylesetup\empty \def\defmarkupstylesetup#1{% \expandafter\def\expandafter\markupstylesetup \expandafter{\markupstylesetup #1}% \def#1% } % Markup style setup for left and right quotes. \defmarkupstylesetup\markupsetuplq{% \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuplqdefault \else \temp \fi } \defmarkupstylesetup\markupsetuprq{% \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuprqdefault \else \temp \fi } { \catcode`\'=\active \catcode`\`=\active \gdef\markupsetuplqdefault{\let`\lq} \gdef\markupsetuprqdefault{\let'\rq} \gdef\markupsetcodequoteleft{\let`\codequoteleft} \gdef\markupsetcodequoteright{\let'\codequoteright} } \let\markupsetuplqcode \markupsetcodequoteleft \let\markupsetuprqcode \markupsetcodequoteright % \let\markupsetuplqexample \markupsetcodequoteleft \let\markupsetuprqexample \markupsetcodequoteright % \let\markupsetuplqkbd \markupsetcodequoteleft \let\markupsetuprqkbd \markupsetcodequoteright % \let\markupsetuplqsamp \markupsetcodequoteleft \let\markupsetuprqsamp \markupsetcodequoteright % \let\markupsetuplqverb \markupsetcodequoteleft \let\markupsetuprqverb \markupsetcodequoteright % \let\markupsetuplqverbatim \markupsetcodequoteleft \let\markupsetuprqverbatim \markupsetcodequoteright % Allow an option to not use regular directed right quote/apostrophe % (char 0x27), but instead the undirected quote from cmtt (char 0x0d). % The undirected quote is ugly, so don't make it the default, but it % works for pasting with more pdf viewers (at least evince), the % lilypond developers report. xpdf does work with the regular 0x27. % \def\codequoteright{% \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi \else \char'15 \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax % [Knuth] pp. 380,381,391 % \relax disables Spanish ligatures ?` and !` of \tt font. \relax`% \else \char'22 \fi \else \char'22 \fi } % Commands to set the quote options. % \parseargdef\codequoteundirected{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequoteundirected\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequoteundirected\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% \fi\fi } % \parseargdef\codequotebacktick{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequotebacktick\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequotebacktick\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% \fi\fi } % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. \def\noligaturesquoteleft{\relax\lq} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Font commands. % #1 is the font command (\sl or \it), #2 is the text to slant. % If we are in a monospaced environment, however, 1) always use \ttsl, % and 2) do not add an italic correction. \def\dosmartslant#1#2{% \ifusingtt {{\ttsl #2}\let\next=\relax}% {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% \next } \def\smartslanted{\dosmartslant\sl} \def\smartitalic{\dosmartslant\it} % Output an italic correction unless \next (presumed to be the following % character) is such as not to need one. \def\smartitaliccorrection{% \ifx\next,% \else\ifx\next-% \else\ifx\next.% \else\ptexslash \fi\fi\fi \aftersmartic } % Unconditional use \ttsl, and no ic. @var is set to this for defuns. \def\ttslanted#1{{\ttsl #1}} % @cite is like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} \def\aftersmartic{} \def\var#1{% \let\saveaftersmartic = \aftersmartic \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% \smartslanted{#1}% } \let\i=\smartitalic \let\slanted=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @b, explicit bold. Also @strong. \def\b#1{{\bf #1}} \let\strong=\b % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } % Set sfcode to normal for the chars that usually have another value. % Can't use plain's \frenchspacing because it uses the `\x notation, and % sometimes \x has an active definition that messes things up. % \catcode`@=11 \def\plainfrenchspacing{% \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \def\endofsentencespacefactor{3000}% default % @t, explicit typewriter. \def\t#1{% {\tt \rawbackslash \plainfrenchspacing #1}% \null } % @samp. \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} % @indicateurl is \samp, that is, with quotes. \let\indicateurl=\samp % @code (and similar) prints in typewriter, but with spaces the same % size as normal in the surrounding text, without hyphenation, etc. % This is a subroutine for that. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \rawbackslash \plainfrenchspacing #1% }% \null % reset spacefactor to 1000 } % We *must* turn on hyphenation at `-' and `_' in @code. % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. % -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup \setupmarkupstyle{code}% % The following should really be moved into \setupmarkupstyle handlers. \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\normaldash \let_\realunder \fi \codex } } \def\codex #1{\tclose{#1}\endgroup} \def\normaldash{-} \def\codedash{-\discretionary{}{}{}} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is bad. % @allowcodebreaks provides a document-level way to turn breaking at - % and _ on and off. % \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} \def\keywordfalse{false} \parseargdef\allowcodebreaks{% \def\txiarg{#1}% \ifx\txiarg\keywordtrue \allowcodebreakstrue \else\ifx\txiarg\keywordfalse \allowcodebreaksfalse \else \errhelp = \EMsimple \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% \fi\fi } % For @command, @env, @file, @option quotes seem unnecessary, % so use \code rather than \samp. \let\command=\code \let\env=\code \let\file=\code \let\option=\code % @uref (abbreviation for `urlref') takes an optional (comma-separated) % second argument specifying the text to display and an optional third % arg as text to display instead of (rather than in addition to) the url % itself. First (mandatory) arg is the url. % (This \urefnobreak definition isn't used now, leaving it for a while % for comparison.) \def\urefnobreak#1{\dourefnobreak #1,,,\finish} \def\dourefnobreak#1,#2,#3,#4\finish{\begingroup \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url \fi \else \code{#1}% only url given, so show it \fi \fi \endlink \endgroup} % This \urefbreak definition is the active one. \def\urefbreak{\begingroup \urefcatcodes \dourefbreak} \let\uref=\urefbreak \def\dourefbreak#1{\urefbreakfinish #1,,,\finish} \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url \fi \else \urefcode{#1}% only url given, so show it \fi \fi \endlink \endgroup} % Allow line breaks around only a few characters (only). \def\urefcatcodes{% \catcode\ampChar=\active \catcode\dotChar=\active \catcode\hashChar=\active \catcode\questChar=\active \catcode\slashChar=\active } { \urefcatcodes % \global\def\urefcode{\begingroup \setupmarkupstyle{code}% \urefcatcodes \let&\urefcodeamp \let.\urefcodedot \let#\urefcodehash \let?\urefcodequest \let/\urefcodeslash \codex } % % By default, they are just regular characters. \global\def&{\normalamp} \global\def.{\normaldot} \global\def#{\normalhash} \global\def?{\normalquest} \global\def/{\normalslash} } % we put a little stretch before and after the breakable chars, to help % line breaking of long url's. The unequal skips make look better in % cmtt at least, especially for dots. \def\urefprestretch{\urefprebreak \hskip0pt plus.13em } \def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } % \def\urefcodeamp{\urefprestretch \&\urefpoststretch} \def\urefcodedot{\urefprestretch .\urefpoststretch} \def\urefcodehash{\urefprestretch \#\urefpoststretch} \def\urefcodequest{\urefprestretch ?\urefpoststretch} \def\urefcodeslash{\futurelet\next\urefcodeslashfinish} { \catcode`\/=\active \global\def\urefcodeslashfinish{% \urefprestretch \slashChar % Allow line break only after the final / in a sequence of % slashes, to avoid line break between the slashes in http://. \ifx\next/\else \urefpoststretch \fi } } % One more complication: by default we'll break after the special % characters, but some people like to break before the special chars, so % allow that. Also allow no breaking at all, for manual control. % \parseargdef\urefbreakstyle{% \def\txiarg{#1}% \ifx\txiarg\wordnone \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordbefore \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordafter \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} \else \errhelp = \EMsimple \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% \fi\fi\fi } \def\wordafter{after} \def\wordbefore{before} \def\wordnone{none} \urefbreakstyle after % @url synonym for @uref, since that's how everyone uses it. % \let\url=\uref % rms does not like angle brackets --karl, 17may97. % So now @email is just like @uref, unless we are pdf. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdf \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \parseargdef\kbdinputstyle{% \def\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct'. \kbdinputstyle distinct % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. \def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} \def\xkey{\key} \def\kbdsub#1#2#3\par{% \def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi } % definition of @key that produces a lozenge. Doesn't adjust to text size. %\setfont\keyrm\rmshape{8}{1000}{OT1} %\font\keysy=cmsy9 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% % \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% % \vbox{\hrule\kern-0.4pt % \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% % \kern-0.4pt\hrule}% % \kern-.06em\raise0.4pt\hbox{\angleright}}}} % definition of @key with no lozenge. If the current font is already % monospace, don't change it; that way, we respect @kbdinputstyle. But % if it isn't monospace, then use \tt. % \def\key#1{{\setupmarkupstyle{key}% \nohyphenation \ifmonospace\else\tt\fi #1}\null} % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} % @clickstyle @arrow (by default) \parseargdef\clickstyle{\def\click{#1}} \def\click{\arrow} % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} % @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. % \def\acronym#1{\doacronym #1,,\finish} \def\doacronym#1,#2,#3\finish{% {\selectfonts\lsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @abbr for "Comput. J." and the like. % No font change, but don't do end-of-sentence spacing. % \def\abbr#1{\doabbr #1,,\finish} \def\doabbr#1,#2,#3\finish{% {\plainfrenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ active, and distinguish by seeing if the current family is \slfam, % which is what @var uses. { \catcode`\_ = \active \gdef\mathunderscore{% \catcode`\_=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a math (or tt) \. % FYI, plain.tex uses \\ as a temporary control sequence (for no % particular reason), but this is not advertised and we don't care. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \tex \mathunderscore \let\\ = \mathbackslash \mathactive % make the texinfo accent commands work in math mode \let\"=\ddot \let\'=\acute \let\==\bar \let\^=\hat \let\`=\grave \let\u=\breve \let\v=\check \let\~=\tilde \let\dotaccent=\dot $\finishmath } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. % Some active characters (such as <) are spaced differently in math. % We have to reset their definitions in case the @math was an argument % to a command which sets the catcodes (such as @item or @section). % { \catcode`^ = \active \catcode`< = \active \catcode`> = \active \catcode`+ = \active \catcode`' = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus \let' = \ptexquoteright } } % ctrl is no longer a Texinfo command, but leave this definition for fun. \def\ctrl #1{{\tt \rawbackslash \hat}#1} % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, % except specified as a normal braced arg, so no newlines to worry about. % \def\outfmtnametex{tex} % \long\def\inlinefmt#1{\doinlinefmt #1,\finish} \long\def\doinlinefmt#1,#2,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi } % For raw, must switch into @tex before parsing the argument, to avoid % setting catcodes prematurely. Doing it this way means that, for % example, @inlineraw{html, foo{bar} gets a parse error instead of being % ignored. But this isn't important because if people want a literal % *right* brace they would have to use a command anyway, so they may as % well use a command to get a left brace too. We could re-use the % delimiter character idea from \verb, but it seems like overkill. % \long\def\inlineraw{\tex \doinlineraw} \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} \def\doinlinerawtwo#1,#2,\finish{% \def\inlinerawname{#1}% \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi \endgroup % close group opened by \tex. } \message{glyphs,} % and logos. % @@ prints an @, as does @atchar{}. \def\@{\char64 } \let\atchar=\@ % @{ @} @lbracechar{} @rbracechar{} all generate brace characters. % Unless we're in typewriter, use \ecfont because the CM text fonts do % not have braces, and we don't want to switch into math. \def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} \def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} \let\{=\mylbrace \let\lbracechar=\{ \let\}=\myrbrace \let\rbracechar=\} \begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux/toc files. \catcode`\{ = \other \catcode`\} = \other \catcode`\[ = 1 \catcode`\] = 2 \catcode`\! = 0 \catcode`\\ = \other !gdef!lbracecmd[\{]% !gdef!rbracecmd[\}]% !gdef!lbraceatcmd[@{]% !gdef!rbraceatcmd[@}]% !endgroup % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \ptexc \let\dotaccent = \ptexdot \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \ptext \let\ubaraccent = \ptexb \let\udotaccent = \d % Other special characters: @questiondown @exclamdown @ordf @ordm % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % The \TeX{} logo, as in plain, but resetting the spacing so that a % period following counts as ending a sentence. (Idea found in latex.) % \edef\TeX{\TeX \spacefactor=1000 } % @LaTeX{} logo. Not quite the same results as the definition in % latex.ltx, since we use a different font for the raised A; it's most % convenient for us to use an explicitly smaller font, rather than using % the \scriptstyle font (since we don't reset \scriptstyle and % \scriptscriptstyle). % \def\LaTeX{% L\kern-.36em {\setbox0=\hbox{T}% \vbox to \ht0{\hbox{% \ifx\textnominalsize\xwordpt % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. % Revert to plain's \scriptsize, which is 7pt. \count255=\the\fam $\fam\count255 \scriptstyle A$% \else % For 11pt, we can use our lllsize. \selectfonts\lllsize A% \fi }% \vss }}% \kern-.15em \TeX } % Some math mode symbols. \def\bullet{$\ptexbullet$} \def\geq{\ifmmode \ge\else $\ge$\fi} \def\leq{\ifmmode \le\else $\le$\fi} \def\minus{\ifmmode -\else $-$\fi} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, they should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{{\it\$}} % @euro{} comes from a separate font, depending on the current style. % We use the free feym* fonts from the eurosym package by Henrik % Theiling, which support regular, slanted, bold and bold slanted (and % "outlined" (blackboard board, sort of) versions, which we don't need). % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. % % Although only regular is the truly official Euro symbol, we ignore % that. The Euro is designed to be slightly taller than the regular % font height. % % feymr - regular % feymo - slanted % feybr - bold % feybo - bold slanted % % There is no good (free) typewriter version, to my knowledge. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. % Hmm. % % Also doesn't work in math. Do we need to do math with euro symbols? % Hope not. % % \def\euro{{\eurofont e}} \def\eurofont{% % We set the font at each command, rather than predefining it in % \textfonts and the other font-switching commands, so that % installations which never need the symbol don't have to have the % font installed. % % There is only one designed size (nominal 10pt), so we always scale % that to the current nominal size. % % By the way, simply using "at 1em" works for cmr10 and the like, but % does not work for cmbx10 and other extended/shrunken fonts. % \def\eurosize{\csname\curfontsize nominalsize\endcsname}% % \ifx\curfontstyle\bfstylename % bold: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize \else % regular: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize \fi \thiseurofont } % Glyphs from the EC fonts. We don't use \let for the aliases, because % sometimes we redefine the original macro, and the alias should reflect % the redefinition. % % Use LaTeX names for the Icelandic letters. \def\DH{{\ecfont \char"D0}} % Eth \def\dh{{\ecfont \char"F0}} % eth \def\TH{{\ecfont \char"DE}} % Thorn \def\th{{\ecfont \char"FE}} % thorn % \def\guillemetleft{{\ecfont \char"13}} \def\guillemotleft{\guillemetleft} \def\guillemetright{{\ecfont \char"14}} \def\guillemotright{\guillemetright} \def\guilsinglleft{{\ecfont \char"0E}} \def\guilsinglright{{\ecfont \char"0F}} \def\quotedblbase{{\ecfont \char"12}} \def\quotesinglbase{{\ecfont \char"0D}} % % This positioning is not perfect (see the ogonek LaTeX package), but % we have the precomposed glyphs for the most common cases. We put the % tests to use those glyphs in the single \ogonek macro so we have fewer % dummy definitions to worry about for index entries, etc. % % ogonek is also used with other letters in Lithuanian (IOU), but using % the precomposed glyphs for those is not so easy since they aren't in % the same EC font. \def\ogonek#1{{% \def\temp{#1}% \ifx\temp\macrocharA\Aogonek \else\ifx\temp\macrochara\aogonek \else\ifx\temp\macrocharE\Eogonek \else\ifx\temp\macrochare\eogonek \else \ecfont \setbox0=\hbox{#1}% \ifdim\ht0=1ex\accent"0C #1% \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% \fi \fi\fi\fi\fi }% } \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} % % Use the ec* fonts (cm-super in outline format) for non-CM glyphs. \def\ecfont{% % We can't distinguish serif/sans and italic/slanted, but this % is used for crude hacks anyway (like adding French and German % quotes to documents typeset with CM, where we lose kerning), so % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% \ifmonospace % typewriter: \font\thisecfont = ectt\ecsize \space at \nominalsize \else \ifx\curfontstyle\bfstylename % bold: \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize \fi \fi \thisecfont } % @registeredsymbol - R in a circle. The font for the R should really % be smaller yet, but lllsize is the best we can do for now. % Adapted from the plain.tex definition of \copyright. % \def\registeredsymbol{% $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. % \ifx\Orb\thisisundefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quotedblleft="5C \chardef\quotedblright=`\" \chardef\quoteleft=`\` \chardef\quoteright=`\' \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % \newif\ifsetcontentsaftertitlepage \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue \parseargdef\shorttitlepage{% \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \let\page = \oldpage \page \null }% } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup % % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon % % If they want short, they certainly want long too. \ifsetshortcontentsaftertitlepage \shortcontents \contents \global\let\shortcontents = \relax \global\let\contents = \relax \fi % \ifsetcontentsaftertitlepage \contents \global\let\contents = \relax \global\let\shortcontents = \relax \fi } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } % Settings used for typesetting titles: no hyphenation, no indentation, % don't worry much about spacing, ragged right. This should be used % inside a \vbox, and fonts need to be set appropriately first. Because % it is always used for titles, nothing else, we call \rmisbold. \par % should be specified before the end of the \vbox, since a vbox is a group. % \def\raggedtitlesettings{% \rmisbold \hyphenpenalty=10000 \parindent=0pt \tolerance=5000 \ptexraggedright } % Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \parseargdef\title{% \checkenv\titlepage \vbox{\titlefonts \raggedtitlesettings #1\par}% % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt } \parseargdef\subtitle{% \checkenv\titlepage {\subtitlefont \rightline{#1}}% } % @author should come last, but may come many times. % It can also be used inside @quotation. % \parseargdef\author{% \def\temp{\quotation}% \ifx\thisenv\temp \def\quotationauthor{#1}% printed in \Equotation. \else \checkenv\titlepage \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi {\secfonts\rmisbold \leftline{#1}}% \fi } % Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \def\evenfooting{\parsearg\evenfootingxxx} \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddfooting{\parsearg\oddfootingxxx} \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\pageheight by -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @evenheadingmarks top \thischapter <- chapter at the top of a page % @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page % % The same set of arguments for: % % @oddheadingmarks % @evenfootingmarks % @oddfootingmarks % @everyheadingmarks % @everyfootingmarks \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} \headingmarks{odd}{footing}{#1} } % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. \def\headingmarks#1#2#3 {% \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname \global\expandafter\let\csname get#1#2marks\endcsname \temp } \everyheadingmarks bottom \everyfootingmarks bottom % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\headingsoff{% non-global headings elimination \evenheadline={\hfil}\evenfootline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}% } \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting \HEADINGSoff % it's the default % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\thisisundefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @ftable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil\relax \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. However, if % what follows is an environment such as @example, there will be no % \parskip glue; then the negative vskip we just inserted would % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \envdef\table{% \let\itemindex\gobble \tablecheck{table}% } \envdef\ftable{% \def\itemindex ##1{\doind {fn}{\code{##1}}}% \tablecheck{ftable}% } \envdef\vtable{% \def\itemindex ##1{\doind {vr}{\code{##1}}}% \tablecheck{vtable}% } \def\tablecheck#1{% \ifnum \the\catcode`\^^M=\active \endgroup \errmessage{This command won't work in this context; perhaps the problem is that we are \inenvironment\thisenv}% \def\next{\doignore{#1}}% \else \let\next\tablex \fi \next } \def\tablex#1{% \def\itemindicate{#1}% \parsearg\tabley } \def\tabley#1{% {% \makevalueexpandable \edef\temp{\noexpand\tablez #1\space\space\space}% \expandafter }\temp \endtablez } \def\tablez #1 #2 #3 #4\endtablez{% \aboveenvbreak \ifnum 0#1>0 \advance \leftskip by #1\mil \fi \ifnum 0#2>0 \tableindent=#2\mil \fi \ifnum 0#3>0 \advance \rightskip by #3\mil \fi \itemmax=\tableindent \advance \itemmax by -\itemmargin \advance \leftskip by \tableindent \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi \let\item = \internalBitem \let\itemx = \internalBitemx } \def\Etable{\endgraf\afterenvbreak} \let\Eftable\Etable \let\Evtable\Etable \let\Eitemize\Etable \let\Eenumerate\Etable % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \envdef\itemize{\parsearg\doitemize} \def\doitemize#1{% \aboveenvbreak \itemmax=\itemindent \advance\itemmax by -\itemmargin \advance\leftskip by \itemindent \exdentamount=\itemindent \parindent=0pt \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi % % Try typesetting the item mark that if the document erroneously says % something like @itemize @samp (intending @table), there's an error % right away at the @itemize. It's not the best error message in the % world, but it's better than leaving it to the @item. This means if % the user wants an empty mark, they have to say @w{} not just @w. \def\itemcontents{#1}% \setbox0 = \hbox{\itemcontents}% % % @itemize with no arg is equivalent to @itemize @bullet. \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi % \let\item=\itemizeitem } % Definition of @item while inside @itemize and @enumerate. % \def\itemizeitem{% \advance\itemno by 1 % for enumerations {\let\par=\endgraf \smallbreak}% reasonable place to break {% % If the document has an @itemize directly after a section title, a % \nobreak will be last on the list, and \sectionheading will have % done a \vskip-\parskip. In that case, we don't want to zero % parskip, or the item text will crash with the heading. On the % other hand, when there is normal text preceding the item (as there % usually is), we do want to zero parskip, or there would be too much % space. In that case, we won't have a \nobreak before. At least % that's the theory. \ifnum\lastpenalty<10000 \parskip=0in \fi \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% % \vadjust{\penalty 1200}}% not good to break after first line of item. \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call \doitemize, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \doitemize{#1.}\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % Each new table line starts with @item, each subsequent new column % starts with @tab. Empty columns may be produced by supplying @tab's % with nothing between them for as many times as empty columns are needed, % ie, @tab@tab@tab will produce two empty columns. % @item, @tab do not need to be on their own lines, but it will not hurt % if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #1 is the @columnfraction, usually a decimal number like .5, but might % be just 1. We just use it, whatever it is. % \def\pickupwholefraction#1 {% \global\advance\colcount by 1 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a % separator; typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi \fi \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % multitable-only commands. % % @headitem starts a heading row, which we typeset in bold. % Assignments have to be global since we are inside the implicit group % of an alignment entry. \everycr resets \everytab so we don't have to % undo it ourselves. \def\headitemfont{\b}% for people to use in the template row; not changeable \def\headitem{% \checkenv\multitable \crcr \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % % A \tab used to include \hskip1sp. But then the space in a template % line is not enough. That is bad. So let's go back to just `&' until % we again encounter the problem the 1sp was intended to solve. % --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% % @multitable ... @end multitable definitions: % \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \startsavinginserts % % @item within a multitable starts a normal row. % We use \def instead of \let so that if one of the multitable entries % contains an @itemize, we don't choke on the \item (seen as \crcr aka % \endtemplate) expanding \doitemize. \def\item{\crcr}% % \tolerance=9500 \hbadness=9500 \setmultitablespacing \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% \global\colcount=0 % Reset the column counter. % Check for saved footnotes, etc. \checkinserts % Keeps underfull box messages off when table breaks over pages. %\filbreak % Maybe so, but it also creates really weird page breaks when the % table breaks over pages. Wouldn't \vfil be better? Wait until the % problem manifests itself, so it can be fixed for real --karl. }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 \multistrut \vtop{% % Use the current \colcount to find the correct column width: \hsize=\expandafter\csname col\the\colcount\endcsname % % In order to keep entries from bumping into each other % we will add a \leftskip of \multitablecolspace to all columns after % the first one. % % If a template has been used, we will add \multitablecolspace % to the width of each template entry. % % If the user has set preamble in terms of percent of \hsize we will % use that dimension as the width of the column, and the \leftskip % will keep entries from bumping into each other. Table will start at % left margin and final column will justify at right margin. % % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 % The first column will be indented with the surrounding text. \advance\hsize by\leftskip \else \ifsetpercent \else % If user has not set preamble in terms of percent of \hsize % we will advance \hsize by \multitablecolspace. \advance\hsize by \multitablecolspace \fi % In either case we will make \leftskip=\multitablecolspace: \leftskip=\multitablecolspace \fi % Ignoring space at the beginning and end avoids an occasional spurious % blank line, when TeX decides to break the line at the space before the % box from the multistrut, so the strut ends up on a line by itself. % For example: % @multitable @columnfractions .11 .89 % @item @code{#} % @tab Legal holiday which is valid in major parts of the whole country. % Is automatically provided with highlighting sequences respectively % marking characters. \noindent\ignorespaces##\unskip\multistrut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \def\setmultitablespacing{% \def\multistrut{\strut}% just use the standard line spacing % % Compute \multitablelinespace (if not defined by user) for use in % \multitableparskip calculation. We used define \multistrut based on % this, but (ironically) that caused the spacing to be off. % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. \ifdim\multitablelinespace=0pt \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip \global\advance\multitablelinespace by-\ht0 \fi % Test to see if parskip is larger than space between lines of % table. If not, do nothing. % If so, set to same dimension as multitablelinespace. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi} \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't % attempt to close an environment group. % \def\makecond#1{% \expandafter\let\csname #1\endcsname = \relax \expandafter\let\csname iscond.#1\endcsname = 1 } \makecond{iftex} \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} \makecond{ifnotplaintext} \makecond{ifnotxml} % Ignore @ignore, @ifhtml, @ifinfo, and the like. % \def\direntry{\doignore{direntry}} \def\documentdescription{\doignore{documentdescription}} \def\docbook{\doignore{docbook}} \def\html{\doignore{html}} \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} % Ignore text until a line `@end #1', keeping track of nested conditionals. % % A count to remember the depth of nesting. \newcount\doignorecount \def\doignore#1{\begingroup % Scan in ``verbatim'' mode: \obeylines \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \spaceisspace % % Count number of #1's that we've seen. \doignorecount = 0 % % Swallow text until we reach the matching `@end #1'. \dodoignore{#1}% } { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. \obeylines % % \gdef\dodoignore#1{% % #1 contains the command name as a string, e.g., `ifinfo'. % % Define a command to find the next `@end #1'. \long\def\doignoretext##1^^M@end #1{% \doignoretextyyy##1^^M@#1\_STOP_}% % % And this command to find another #1 command, at the beginning of a % line. (Otherwise, we would consider a line `@c @ifset', for % example, to count as an @ifset for nesting.) \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% % % And now expand that command. \doignoretext ^^M% }% } \def\doignoreyyy#1{% \def\temp{#1}% \ifx\temp\empty % Nothing found. \let\next\doignoretextzzz \else % Found a nested condition, ... \advance\doignorecount by 1 \let\next\doignoretextyyy % ..., look for another. % If we're here, #1 ends with ^^M\ifinfo (for example). \fi \next #1% the token \_STOP_ is present just after this macro. } % We have to swallow the remaining "\_STOP_". % \def\doignoretextzzz#1{% \ifnum\doignorecount = 0 % We have just found the outermost @end. \let\next\enddoignore \else % Still inside a nested condition. \advance\doignorecount by -1 \let\next\doignoretext % Look for the next @end. \fi \next } % Finish off ignored text. { \obeylines% % Ignore anything after the last `@end #1'; this matters in verbatim % environments, where otherwise the newline after an ignored conditional % would result in a blank line in the output. \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \makevalueexpandable \def\temp{#2}% \edef\next{\gdef\makecsname{SET#1}}% \ifx\temp\empty \next{}% \else \setzzz#2\endsetzzz \fi }% } % Remove the trailing space \setxxx inserted. \def\setzzz#1 \endsetzzz{\next{#1}} % @clear VAR clears (i.e., unsets) the variable VAR. % \parseargdef\clear{% {% \makevalueexpandable \global\expandafter\let\csname SET#1\endcsname=\relax }% } % @value{foo} gets the text saved in variable foo. \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { \catcode`\- = \active \catcode`\_ = \active % \gdef\makevalueexpandable{% \let\value = \expandablevalue % We don't want these characters active, ... \catcode`\-=\other \catcode`\_=\other % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. \let-\normaldash \let_\normalunderscore } } % We have this subroutine so that we can handle at least some @value's % properly in indexes (we call \makevalueexpandable in \indexdummies). % The command has to be fully expandable (if the variable is set), since % the result winds up in the index file. This means that if the % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). % \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% \message{Variable `#1', used in @value, is not set.}% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get special treatment of `@end ifset,' call \makeond and the redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} \def\doifset#1#2{% {% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname SET#2\endcsname\relax #1% If not set, redefine \next. \fi \expandafter }\next } \def\ifsetfail{\doignore{ifset}} % @ifclear VAR ... @end executes the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the % above code: if the variable is not set, do nothing, if it is set, % then redefine \next to \ifclearfail. % \makecond{ifclear} \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} % @ifcommandisdefined CMD ... @end executes the `...' if CMD (written % without the @) is in fact defined. We can only feasibly check at the % TeX level, so something like `mathcode' is going to considered % defined even though it is not a Texinfo command. % \makecond{ifcommanddefined} \def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} % \def\doifcmddefined#1#2{{% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname #2\endcsname\relax #1% If not defined, \let\next as above. \fi \expandafter }\next } \def\ifcmddefinedfail{\doignore{ifcommanddefined}} % @ifcommandnotdefined CMD ... handled similar to @ifclear above. \makecond{ifcommandnotdefined} \def\ifcommandnotdefined{% \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} \def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} % Set the `txicommandconditionals' variable, so documents have a way to % test if the @ifcommand...defined conditionals are available. \set txicommandconditionals % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment % @defininfoenclose. \let\definfoenclose=\comment \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \fi \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 \fi \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% % Only do \closeout if we haven't already done it, else we'll end up % closing the target index. \expandafter \ifx\csname donesynindex#2\endcsname \relax % The \closeout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. \expandafter\closeout\csname#2indfile\endcsname \expandafter\let\csname donesynindex#2\endcsname = 1 \fi % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} % Take care of Texinfo commands that can appear in an index entry. % Since there are some commands we want to expand, and others we don't, % we have to laboriously prevent expansion for those that we don't. % \def\indexdummies{% \escapechar = `\\ % use backslash in output files. \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % % Need these unexpandable (because we define \tt as a dummy) % definitions when @{ or @} appear in index entry text. Also, more % complicated, when \tex is in effect and \{ is a \delimiter again. % We can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. Perhaps we % should define @lbrace and @rbrace commands a la @comma. \def\{{{\tt\char123}}% \def\}{{\tt\char125}}% % % I don't entirely understand this, but when an index entry is % generated from a macro call, the \endinput which \scanmacro inserts % causes processing to be prematurely terminated. This is, % apparently, because \indexsorttmp is fully expanded, and \endinput % is an expandable command. The redefinition below makes \endinput % disappear altogether for that purpose -- although logging shows that % processing continues to some further point. On the other hand, it % seems \endinput does not hurt in the printed index arg, since that % is still getting written without apparent harm. % % Sample source (mac-idx3.tex, reported by Graham Percival to % help-texinfo, 22may06): % @macro funindex {WORD} % @findex xyz % @end macro % ... % @funindex commtest % % The above is not enough to reproduce the bug, but it gives the flavor. % % Sample whatsit resulting: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} % % So: \let\endinput = \empty % % Do the redefinitions. \commondummies } % For the aux and toc files, @ is the escape character. So we want to % redefine everything using @ as the escape character (instead of % \realbackslash, still used for index files). When everything uses @, % this will be simpler. % \def\atdummies{% \def\@{@@}% \def\ {@ }% \let\{ = \lbraceatcmd \let\} = \rbraceatcmd % % Do the redefinitions. \commondummies \otherbackslash } % Called from \indexdummies and \atdummies. % \def\commondummies{% % % \definedummyword defines \#1 as \string\#1\space, thus effectively % preventing its expansion. This is used only for control words, % not control letters, because the \space would be incorrect for % control characters, but is needed to separate the control word % from whatever follows. % % For control letters, we have \definedummyletter, which omits the % space. % % These can be used both for control words that take an argument and % those that do not. If it is followed by {arg} in the input, then % that will dutifully get written to the index (or wherever). % \def\definedummyword ##1{\def##1{\string##1\space}}% \def\definedummyletter##1{\def##1{\string##1}}% \let\definedummyaccent\definedummyletter % \commondummiesnofonts % \definedummyletter\_% \definedummyletter\-% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\DH \definedummyword\L \definedummyword\O \definedummyword\OE \definedummyword\TH \definedummyword\aa \definedummyword\ae \definedummyword\dh \definedummyword\exclamdown \definedummyword\l \definedummyword\o \definedummyword\oe \definedummyword\ordf \definedummyword\ordm \definedummyword\questiondown \definedummyword\ss \definedummyword\th % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword\bf \definedummyword\gtr \definedummyword\hat \definedummyword\less \definedummyword\sf \definedummyword\sl \definedummyword\tclose \definedummyword\tt % \definedummyword\LaTeX \definedummyword\TeX % % Assorted special characters. \definedummyword\arrow \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\entrybreak \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\expansion \definedummyword\geq \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright \definedummyword\lbracechar \definedummyword\leq \definedummyword\minus \definedummyword\ogonek \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\quotedblbase \definedummyword\quotedblleft \definedummyword\quotedblright \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase \definedummyword\rbracechar \definedummyword\result \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist % \normalturnoffactive % % Handle some cases of @value -- where it does not contain any % (non-fully-expandable) commands. \makevalueexpandable } % \commondummiesnofonts: common to \commondummies and \indexnofonts. % \def\commondummiesnofonts{% % Control letters and accents. \definedummyletter\!% \definedummyaccent\"% \definedummyaccent\'% \definedummyletter\*% \definedummyaccent\,% \definedummyletter\.% \definedummyletter\/% \definedummyletter\:% \definedummyaccent\=% \definedummyletter\?% \definedummyaccent\^% \definedummyaccent\`% \definedummyaccent\~% \definedummyword\u \definedummyword\v \definedummyword\H \definedummyword\dotaccent \definedummyword\ogonek \definedummyword\ringaccent \definedummyword\tieaccent \definedummyword\ubaraccent \definedummyword\udotaccent \definedummyword\dotless % % Texinfo font commands. \definedummyword\b \definedummyword\i \definedummyword\r \definedummyword\sansserif \definedummyword\sc \definedummyword\slanted \definedummyword\t % % Commands that take arguments. \definedummyword\abbr \definedummyword\acronym \definedummyword\anchor \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn \definedummyword\dmn \definedummyword\email \definedummyword\emph \definedummyword\env \definedummyword\file \definedummyword\image \definedummyword\indicateurl \definedummyword\inforef \definedummyword\kbd \definedummyword\key \definedummyword\math \definedummyword\option \definedummyword\pxref \definedummyword\ref \definedummyword\samp \definedummyword\strong \definedummyword\tie \definedummyword\uref \definedummyword\url \definedummyword\var \definedummyword\verb \definedummyword\w \definedummyword\xref } % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string % would be for a given command (usually its argument). % \def\indexnofonts{% % Accent commands should become @asis. \def\definedummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% % All control words become @asis by default; overrides below. \let\definedummyword\definedummyaccent % \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |, etc. % Likewise with the other plain tex font commands. %\let\tt=\asis % \def\ { }% \def\@{@}% \def\_{\normalunderscore}% \def\-{}% @- shouldn't affect sorting % % Unfortunately, texindex is not prepared to handle braces in the % content at all. So for index sorting, we map @{ and @} to strings % starting with |, since that ASCII character is between ASCII { and }. \def\{{|a}% \def\lbracechar{|a}% % \def\}{|b}% \def\rbracechar{|b}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\DH{DZZ}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\TH{ZZZ}% \def\aa{aa}% \def\ae{ae}% \def\dh{dzz}% \def\exclamdown{!}% \def\l{l}% \def\oe{oe}% \def\ordf{a}% \def\ordm{o}% \def\o{o}% \def\questiondown{?}% \def\ss{ss}% \def\th{zzz}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\arrow{->}% \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% \def\expansion{==>}% \def\geq{>=}% \def\guillemetleft{<<}% \def\guillemetright{>>}% \def\guilsinglleft{<}% \def\guilsinglright{>}% \def\leq{<=}% \def\minus{-}% \def\point{.}% \def\pounds{pounds}% \def\print{-|}% \def\quotedblbase{"}% \def\quotedblleft{"}% \def\quotedblright{"}% \def\quoteleft{`}% \def\quoteright{'}% \def\quotesinglbase{,}% \def\registeredsymbol{R}% \def\result{=>}% \def\textdegree{o}% % \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax \else \indexlquoteignore \fi % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % makeinfo does not expand macros in the argument to @deffn, which ends up % writing an index entry, and texindex isn't prepared for an index sort entry % that starts with \. % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % \macrolist } % Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us % ignore left quotes in the sort term. {\catcode`\`=\active \gdef\indexlquoteignore{\let`=\empty}} \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} % Workhorse for all \fooindexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % empty if called from \doind, as we usually are (the main exception % is with most defuns, which call us directly). % \def\dosubind#1#2#3{% \iflinks {% % Store the main index entry text (including the third arg). \toks0 = {#2}% % If third arg is present, precede it with a space. \def\thirdarg{#3}% \ifx\thirdarg\empty \else \toks0 = \expandafter{\the\toks0 \space #3}% \fi % \edef\writeto{\csname#1indfile\endcsname}% % \safewhatsit\dosubindwrite }% \fi } % Write the entry in \toks0 to the index file: % \def\dosubindwrite{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% \fi % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash. % % Process the index entry with all font commands turned off, to % get the string to sort by. {\indexnofonts \edef\temp{\the\toks0}% need full expansion \xdef\indexsorttmp{\temp}% }% % % Set up the complete index entry, with both the sort key and % the original text, including any font commands. We write % three arguments to \entry to the .?? file (four in the % subentry case), texindex reduces to two when writing the .??s % sorted result. \edef\temp{% \write\writeto{% \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% }% \temp } % Take care of unwanted page breaks/skips around a whatsit: % % If a skip is the last thing on the list now, preserve it % by backing up by \lastskip, doing the \write, then inserting % the skip again. Otherwise, the whatsit generated by the % \write or \pdfdest will make \lastskip zero. The result is that % sequences like this: % @end defun % @tindex whatever % @defun ... % will have extra space inserted, because the \medbreak in the % start of the @defun won't see the skip inserted by the @end of % the previous defun. % % But don't do any of this if we're not in vertical mode. We % don't want to do a \vskip and prematurely end a paragraph. % % Avoid page breaks due to these extra skips, too. % % But wait, there is a catch there: % We'll have to check whether \lastskip is zero skip. \ifdim is not % sufficient for this purpose, as it ignores stretch and shrink parts % of the skip. The only way seems to be to check the textual % representation of the skip. % % The following is almost like \def\zeroskipmacro{0.0pt} except that % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). % \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} % \newskip\whatsitskip \newcount\whatsitpenalty % % ..., ready, GO: % \def\safewhatsit#1{\ifhmode #1% \else % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \whatsitskip = \lastskip \edef\lastskipmacro{\the\lastskip}% \whatsitpenalty = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\whatsitskip glue we're inserting is preceded by a % non-discardable item, therefore it is not a potential % breakpoint, therefore no \nobreak needed. \ifx\lastskipmacro\zeroskipmacro \else \vskip-\whatsitskip \fi % #1% % \ifx\lastskipmacro\zeroskipmacro % If \lastskip was zero, perhaps the last item was a penalty, and % perhaps it was >=10000, e.g., a \nobreak. In that case, we want % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: % @deffn deffn-whatever % @vindex index-whatever % Description. % would allow a break between the index-whatever whatsit % and the "Description." paragraph. \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi \else % On the other hand, if we had a nonzero \lastskip, % this make-up glue would be preceded by a non-discardable item % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\whatsitskip \fi \fi} % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \plainfrenchspacing \everypar = {}% don't want the \kern\-parindent from indentation suppression. % % See if the index file exists and is nonempty. % Change catcode of @ here so that if the index file contains % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 \openin 1 \jobname.#1s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \else % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 \putwordIndexIsEmpty \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. \def\indexbackslash{\backslashcurfont}% \catcode`\\ = 0 \escapechar = `\\ \begindoublecolumns \input \jobname.#1s \enddoublecolumns \fi \fi \closein 1 \endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. \def\initial#1{{% % Some minor font changes for the special characters. \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt % % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. \nobreak \vskip 0pt plus 3\baselineskip \penalty 0 \vskip 0pt plus -3\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus .5\baselineskip \leftline{\secbf #1}% % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip }} % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % % A straightforward implementation would start like this: % \def\entry#1#2{... % But this freezes the catcodes in the argument, and can cause problems to % @code, which sets - active. This problem was fixed by a kludge--- % ``-'' was active throughout whole index, but this isn't really right. % The right solution is to prevent \entry from swallowing the whole text. % --kasal, 21nov03 \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent = 2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % A bit of stretch before each entry for the benefit of balancing % columns. \vskip 0pt plus1pt % % When reading the text of entry, convert explicit line breaks % from @* into spaces. The user might give these in long section % titles, for instance. \def\*{\unskip\space\ignorespaces}% \def\entrybreak{\hfil\break}% % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\entrybreak{\unskip\space\ignorespaces}% \def\doentry{% \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. } \def\finishentry#1{% % #1 is the page number. % % The following is kludged to not output a line of dots in the index if % there are no page numbers. The next person who breaks this will be % cursed by a Unix daemon. \setbox\boxA = \hbox{#1}% \ifdim\wd\boxA = 0pt \ % \else % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ifpdf \pdfgettoks#1.% \ \the\toksA \else \ #1% \fi \fi \par \endgroup } % Like plain.tex's \dotfill, except uses up at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary#1#2{{% \parfillskip=0in \parskip=0in \hangindent=1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else #2 \fi \par }} % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case we just ship out what is in \partialpage with the normal % output routine. Generally, \partialpage will be empty when this % runs and this will be a no-op. See the indexspread.tex test case. \ifvoid\partialpage \else \onepageout{\pagecontents\partialpage}% \fi % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% }% \eject % run that output routine to set \partialpage % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize } % The double-column output routine for all double-column pages except % the last. % \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@ = \vsize \divide\dimen@ by 2 \advance\dimen@ by -\ht\partialpage % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% } % % All done with double columns. \def\enddoublecolumns{% % The following penalty ensures that the page builder is exercised % _before_ we change the output routine. This is necessary in the % following situation: % % The last section of the index consists only of a single entry. % Before this section, \pagetotal is less than \pagegoal, so no % break occurs before the last section starts. However, the last % section, consisting of \initial and the single \entry, does not % fit on the page and has to be broken off. Without the following % penalty the page builder will not be exercised until \eject % below, and by that time we'll already have changed the output % routine to the \balancecolumns version, so the next-to-last % double-column page will be processed with \balancecolumns, which % is wrong: The two columns will go to the main vertical list, with % the broken-off section in the recent contributions. As soon as % the output routine finishes, TeX starts reconsidering the page % break. The two columns and the broken-off section both fit on the % page, because the two columns now take up only half of the page % goal. When TeX sees \eject from below which follows the final % section, it invokes the new output routine that we've set after % \balancecolumns below; \onepageout will try to fit the two columns % and the final section into the vbox of \pageheight (see % \pagebody), causing an overfull box. % % Note that glue won't work here, because glue does not exercise the % page builder, unlike penalties (see The TeXbook, pp. 280-281). \penalty0 % \output = {% % Split the last of the double-column material. Leave it on the % current page, no automatic page break. \balancecolumns % % If we end up splitting too much material for the current page, % though, there will be another page break right after this \output % invocation ends. Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. (We hope \balancecolumns will never be % called on to balance too much material, but if it is, this makes % the output somewhat more palatable.) \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize (after the % \endgroup where \vsize got restored). \pagegoal = \vsize } % % Called at the end of the double column material. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% \splittopskip = \topskip % Loop until we get a decent breakpoint. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by 1pt \repeat }% %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% % \pagesofar } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % Let's start with @part. \outer\parseargdef\part{\partzzz{#1}} \def\partzzz#1{% \chapoddpage \null \vskip.3\vsize % move it down on the page a bit \begingroup \noindent \titlefonts\rmisbold #1\par % the text \let\lastnode=\empty % no node to associate with \writetocentry{part}{#1}{}% but put it in the toc \headingsoff % no headline or footline on the part page \chapoddpage \endgroup } % \unnumberedno is an oxymoron. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 % chapters, we're in trouble anyway, I'm sure.) \newcount\unnumberedno \unnumberedno = 10000 \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ % % \def\appendixletter{\char\the\appendixno} % We do the following ugly conditional instead of the above simple % construct for the sake of pdftex, which needs the actual % letter in the expansion, not just typeset. % \def\appendixletter{% \ifnum\appendixno=`A A% \else\ifnum\appendixno=`B B% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines these (using marks) as the number+name, number % and name of the chapter. Page headings and footings can use % these. @section does likewise. \def\thischapter{} \def\thischapternum{} \def\thischaptername{} \def\thissection{} \def\thissectionnum{} \def\thissectionname{} \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achieve this, remember the "biggest" unnum. sec. we are currently in: \chardef\unnlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. \def\chapheadtype{N} % Choose a heading macro % #1 is heading type % #2 is heading level % #3 is text for heading \def\genhead#1#2#3{% % Compute the abs. sec. level: \absseclevel=#2 \advance\absseclevel by \secbase % Make sure \absseclevel doesn't fall outside the range: \ifnum \absseclevel < 0 \absseclevel = 0 \else \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unnlevel \chardef\unnlevel = \absseclevel \fi \else % Check for appendix sections: \ifnum \absseclevel = 0 \edef\chapheadtype{\headtype}% \else \if \headtype A\if \chapheadtype N% \errmessage{@appendix... within a non-appendix chapter}% \fi\fi \fi % Check for numbered within unnumbered: \ifnum \absseclevel > \unnlevel \def\headtype{U}% \else \chardef\unnlevel = 3 \fi \fi % Now print the heading: \if \headtype U% \ifcase\absseclevel \unnumberedzzz{#3}% \or \unnumberedseczzz{#3}% \or \unnumberedsubseczzz{#3}% \or \unnumberedsubsubseczzz{#3}% \fi \else \if \headtype A% \ifcase\absseclevel \appendixzzz{#3}% \or \appendixsectionzzz{#3}% \or \appendixsubseczzz{#3}% \or \appendixsubsubseczzz{#3}% \fi \else \ifcase\absseclevel \chapterzzz{#3}% \or \seczzz{#3}% \or \numberedsubseczzz{#3}% \or \numberedsubsubseczzz{#3}% \fi \fi \fi \suppressfirstparagraphindent } % an interface: \def\numhead{\genhead N} \def\apphead{\genhead A} \def\unnmhead{\genhead U} % @chapter, @appendix, @unnumbered. Increment top-level counter, reset % all lower-level sectioning counters to zero. % % Also set \chaplevelprefix, which we prepend to @float sequence numbers % (e.g., figures), q.v. By default (before any chapter), that is empty. \let\chaplevelprefix = \empty % \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz#1{% % section resetting is \global in case the chapter is in a group, such % as an @include file. \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\chapno by 1 % % Used for \float. \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % % \putwordChapter can contain complex things in translations. \toks0=\expandafter{\putwordChapter}% \message{\the\toks0 \space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% % % So @section and the like are numbered underneath this chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec } \outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz % \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % % \putwordAppendix can contain complex things in translations. \toks0=\expandafter{\putwordAppendix}% \message{\the\toks0 \space \appendixletter}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } % normally unnmhead0 calls unnumberedzzz: \outer\parseargdef\unnumbered{\unnmhead0{#1}} \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty \resetallfloatnos % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of . (We also do this for % the toc entries.) \toks0 = {#1}% \message{(\the\toks0)}% % \chapmacro{#1}{Ynothing}{\the\unnumberedno}% % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec } % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% % Well, we could do the following in a group, but that would break % an assumption that \chapmacro is called at the outermost level. % Thus we are safer this way: --kasal, 24feb04 \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. % \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } % normally calls appendixsectionzzz: \outer\parseargdef\appendixsection{\apphead1{#1}} \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection % normally calls unnumberedseczzz: \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. % % normally calls numberedsubseczzz: \outer\parseargdef\numberedsubsec{\numhead2{#1}} \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } % normally calls appendixsubseczzz: \outer\parseargdef\appendixsubsec{\apphead2{#1}} \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } % normally calls unnumberedsubseczzz: \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. % % normally numberedsubsubseczzz: \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally appendixsubsubseczzz: \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally unnumberedsubsubseczzz: \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% \vbox{\chapfonts \raggedtitlesettings #1\par}% \nobreak\bigskip \nobreak \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. % Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip % Define plain chapter starts, and page on/off switching for it. \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} % Because \domark is called before \chapoddpage, the filler page will % get the headings for the next chapter, which is wrong. But we don't % care -- we just disable all headings on the filler page. \def\chapoddpage{% \chappager \ifodd\pageno \else \begingroup \headingsoff \null \chappager \endgroup \fi } \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yomitfromtockeyword{Yomitfromtoc} \def\Yappendixkeyword{Yappendix} % \def\chapmacro#1#2#3{% % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% % \noexpand\putwordAppendix avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% % \noexpand\putwordChapter avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordChapter{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert the chapter heading break. \pchapsepmacro % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \domark % {% \chapfonts \rmisbold % % Have to define \lastsection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\lastsection{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \nobreak % Avoid page breaks at the interline glue. \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerparameters{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt } % I don't think this chapter style is supported any more, so I'm not % updating it with the new noderef stuff. We'll see. --karl, 11aug03. % \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} % \def\unnchfopen #1{% \chapoddpage \vbox{\chapfonts \raggedtitlesettings #1\par}% \nobreak\bigskip\nobreak } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% \chapoddpage \vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}% \nobreak\bigskip \nobreak } \def\CHAPFopen{% \global\let\chapmacro=\chfopen \global\let\centerchapmacro=\centerchfopen} % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip{-1000}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Print any size, any type, section title. % % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the % section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% \checkenv{}% should not be in an environment. % % Switch to the right set of fonts. \csname #2fonts\endcsname \rmisbold % \def\sectionlevel{#2}% \def\temptype{#3}% % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\lastsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% \gdef\thissection{\thissectionname}}% \fi \else\ifx\temptype\Yomitfromtockeyword % Don't redefine \thissection. \else\ifx\temptype\Yappendixkeyword \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \fi\fi\fi % % Go into vertical mode. Usually we'll already be there, but we % don't want the following whatsit to end up in a preceding paragraph % if the document didn't happen to have a blank line. \par % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert space above the heading. \csname #2headingbreak\endcsname % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevsectiondefs=\lastsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\lastsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \lastsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\lastsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\lastsection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chapmacro. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chapmacro. \donoderef{#3}% % % Interline glue will be inserted when the vbox is completed. % That glue will be a valid breakpoint for the page, since it'll be % preceded by a whatsit (usually from the \donoderef, or from the % \writetocentry if there was no node). We don't want to allow that % break, since then the whatsits could end up on page n while the % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. \nobreak % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % Add extra space after the heading -- half of whatever came above it. % Don't allow stretch, though. \kern .5 \csname #2headingskip\endcsname % % Do not let the kern be a potential breakpoint, as it would be if it % was followed by glue. \nobreak % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a % discardable item.) However, when a paragraph is not started next % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out % or the negative glue will cause weirdly wrong output, typically % obscuring the section heading with something else. \vskip-\parskip % % This is so the last item on the main vertical list is a known % \penalty > 10000, so \startdefun, etc., can recognize the situation % and do the needful. \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. % % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} % We append the current node name (if any) and page number as additional % arguments for the \{chap,sec,...}entry macros which will eventually % read this. The node name is used in the pdf outlines as the % destination to jump to. % % We open the .toc file for writing here instead of at @setfilename (or % any other fixed time) so that @contents can be anywhere in the document. % But if #1 is `omit', then we don't do anything. This is used for the % table of contents chapter openings themselves. % \newif\iftocfileopened \def\omitkeyword{omit}% % \def\writetocentry#1#2#3{% \edef\writetoctype{#1}% \ifx\writetoctype\omitkeyword \else \iftocfileopened\else \immediate\openout\tocfile = \jobname.toc \global\tocfileopenedtrue \fi % \iflinks {\atdummies \edef\temp{% \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% \temp }% \fi \fi % % Tell \shipout to create a pdf destination on each page, if we're % writing pdf. These are used in the table of contents. We can't % just write one on every page because the title pages are numbered % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. \ifpdf \global\pdfmakepagedesttrue \fi } % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. % \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active \catcode`\<=\active \catcode`\>=\active \catcode`\\=\active \catcode`\^=\active \catcode`\_=\active \catcode`\|=\active \catcode`\~=\active } % Read the toc file, which is essentially Texinfo input. \def\readtocfile{% \setupdatafile \activecatcodes \input \tocreadfilename } \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % Prepare to read what we've written to \tocfile. % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. Thus, we maintain % \contentsalignmacro in parallel with \pagealignmacro. % From: Torbjorn Granlund \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. \advance\hsize by -\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi } % redefined for the two-volume lispref. We always output on % \jobname.toc even if this is redefined. % \def\tocreadfilename{\jobname.toc} % Normal (long) toc. % \def\contents{% \startcontents{\putwordTOC}% \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \let\partentry = \shortpartentry \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \let\tt=\shortconttt \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry \let\numsubsecentry = \numsecentry \let\appsubsecentry = \numsecentry \let\unnsubsecentry = \numsecentry \let\numsubsubsecentry = \numsecentry \let\appsubsubsecentry = \numsecentry \let\unnsubsubsecentry = \numsecentry \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \closein 1 \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } \let\shortcontents = \summarycontents % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. % \def\shortchaplabel#1{% % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % But use \hss just in case. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) % % We'd like to right-justify chapter numbers, but that looks strange % with appendix letters. And right-justifying numbers and % left-justifying letters looks strange when there is less than 10 % chapters. Have to read the whole toc once to know how many chapters % there are before deciding ... \hbox to 1em{#1\hss}% } % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Parts, in the main contents. Replace the part number, which doesn't % exist, with an empty box. Let's hope all the numbers have the same width. % Also ignore the page number, which is conventionally not printed. \def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} \def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} % % Parts, in the short toc. \def\shortpartentry#1#2#3#4{% \penalty-300 \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip \shortchapentry{{\bf #1}}{\numeralbox}{}{}% } % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. % Need the word Appendix, and a fixed-size box. % \def\appendixbox#1{% % We use M since it's probably the widest letter. \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} \let\appsubsubsecentry=\numsubsubsecentry \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} % This parameter controls the indentation of the various levels. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} % We use the same \entry macro as for the index entries. \let\tocentry = \entry % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @tex ... @end tex escapes into raw TeX temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain @ character. \envdef\tex{% \setupmarkupstyle{tex}% \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \catcode`\`=\other \catcode`\'=\other \escapechar=`\\ % % ' is active in math mode (mathcode"8000). So reset it, and all our % other math active characters (just in case), to plain's definitions. \mathactive % \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\*=\ptexstar \let\t=\ptext \expandafter \let\csname top\endcsname=\ptextop % outer \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @lisp environment forms a group so it can rebind things, % including the definition of @end lisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip % it's not a good place to break if the last penalty was \nobreak % or better ... \ifnum\lastpenalty<10000 \penalty-50 \fi \vskip\envskipamount \fi \fi }} \let\afterenvbreak = \aboveenvbreak % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will % also clear it, so that its embedded environments do the narrowing again. \let\nonarrowing=\relax % @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \envdef\cartouche{% \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt % we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing = t% % % If this cartouche directly follows a sectioning command, we need the % \parskip glue (backspaced over by default) or the cartouche can % collide with the section heading. \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi % \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \kern3pt \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \comment % For explanation, see the end of def\group. } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak \hfuzz = 12pt % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt % Turn off paragraph indentation but redefine \indent to emulate % the normal \indent. \nonfillparindent=\parindent \parindent = 0pt \let\indent\nonfillindent % \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } \begingroup \obeyspaces % We want to swallow spaces (but not other tokens) after the fake % @indent in our nonfill-environments, where spaces are normally % active and set to @tie, resulting in them not being ignored after % @indent. \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% \gdef\nonfillindentcheck{% \ifx\temp % \expandafter\nonfillindentgobble% \else% \leavevmode\nonfillindentbox% \fi% }% \endgroup \def\nonfillindentgobble#1{\nonfillindent} \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: % @example, @display, @format, @lisp % \def\smallword{small} \def\nosmallword{nosmall} \let\SETdispenvsize\relax \def\setnormaldispenv{% \ifx\SETdispenvsize\smallword % end paragraph for sake of leading, in case document has no blank % line. This is redundant with what happens in \aboveenvbreak, but % we need to do it before changing the fonts, and it's inconvenient % to change the fonts afterward. \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it in one command. #1 is the env name, #2 the definition. \def\makedispenvdef#1#2{% \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } % Define two environment synonyms (#1 and #2) for an environment. \def\maketwodispenvdef#1#2#3{% \makedispenvdef{#1}{#3}% \makedispenvdef{#2}{#3}% } % % @lisp: indented, narrowed, typewriter font; % @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvdef{lisp}{example}{% \nonfillstart \tt\setupmarkupstyle{example}% \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenvdef{display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenvdef{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill\relax \gobble } \let\Eflushright = \afterenvbreak % @raggedright does more-or-less normal line breaking but no right % justification. From plain.tex. \envdef\raggedright{% \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax } \let\Eraggedright\par \envdef\raggedleft{% \parindent=0pt \leftskip0pt plus2em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedleft\par \envdef\raggedcenter{% \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedcenter\par % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. We keep \parskip nonzero in general, since % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % \makedispenvdef{quotation}{\quotationstart} % \def\quotationstart{% \indentedblockstart % same as \indentedblock, but increase right margin too. \ifx\nonarrowing\relax \advance\rightskip by \lispnarrowing \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\thisisundefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } \def\Esmallquotation{\Equotation} % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% \def\temp{#1}% \ifx\temp\empty \else {\bf #1: }% \fi } % @indentedblock is like @quotation, but indents only on the left and % has no optional argument. % \makedispenvdef{indentedblock}{\indentedblockstart} % \def\indentedblockstart{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi } % Keep a nonzero parskip for the environment, since we're doing normal filling. % \def\Eindentedblock{% \par {\parskip=0pt \afterenvbreak}% } \def\Esmallindentedblock{\Eindentedblock} % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [Knuth] p.344; only we need to do the other characters Texinfo sets % active too. Otherwise, they get lost as the first character on a % verbatim line. \def\dospecials{% \do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% % Don't do the quotes -- if we do, @set txicodequoteundirected and % @set txicodequotebacktick will not have effect on @verb and % @verbatim, and ?` and !` ligatures won't get disabled. %\do\`\do\'% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \setupmarkupstyle{verb}% \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion. \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % % We typeset each line of the verbatim in an \hbox, so we can handle % tabs. The \global is in case the verbatim line starts with an accent, % or some other command that starts with a begin-group. Otherwise, the % entire \verbbox would disappear at the corresponding end-group, before % it is typeset. Meanwhile, we can't have nested verbatim commands % (can we?), so the \global won't be overwriting itself. \newbox\verbbox \def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab \divide\dimen\verbbox by\tabw \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox }% } \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart \tt % easiest (and conventionally used) font for verbatim % The \leavevmode here is for blank lines. Otherwise, we would % never \starttabox and the \egroup would end verbatim mode. \def\par{\leavevmode\egroup\box\verbbox\endgraf}% \tabexpand \setupmarkupstyle{verbatim}% % Respect line breaks, % print special symbols as themselves, and % make each space count. % Must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % For Texinfo it's a lot easier than for LaTeX, % because texinfo's \verbatim doesn't stop at '\end{verbatim}': % we need not redefine '\', '{' and '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \obeylines % % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. \endgroup % \envdef\verbatim{% \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% \input #1 \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % We save the uninterpreted tokens, rather than creating a box. % Saving the text in a box would be much easier, but then all the % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as % possible is very desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} % \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page \scanexp\copyingtext \endgroup } \message{defuns,} % @defun etc. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\defunpenalty % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \defunpenalty=10003 % Will keep this @deffn together with the % following @def command, see below. \else % If there are two @def commands in a row, we'll have a \nobreak, % which is there to keep the function description together with its % header. But if there's nothing but headers, we need to allow a % break somewhere. Check specifically for penalty 10002, inserted % by \printdefunline, instead of 10000, since the sectioning % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % % As a further refinement, we avoid "club" headers by signalling % with penalty of 10003 after the very first @deffn in the % sequence (see above), and penalty of 10002 after any following % @def command. \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi % % Similarly, after a section heading, do not allow a break. % But do insert the glue. \medskip % preceded by discardable penalty, so not a breakpoint \fi % \parindent=0in \advance\leftskip by \defbodyindent \exdentamount=\defbodyindent } \def\dodefunx#1{% % First, check whether we are in the right environment: \checkenv#1% % % As above, allow line break if we have multiple x headers in a row. % It's not a great place, though. \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi % % And now, it's time to reuse the body of the original defun: \expandafter\gobbledefun#1% } \def\gobbledefun#1\startdefun{} % \printdefunline \deffnheader{text} % \def\printdefunline#1#2{% \begingroup % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil\relax \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % signal to \startdefun and \dodefunx % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts \endgroup } \def\Edefun{\endgraf\medbreak} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remaining is to define \deffnheader. % \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } % \domakedefun \deffn \deffnx \deffnheader % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } \newif\ifdoingtypefn % doing typed function? \newif\ifrettypeownline % typeset return type on its own line? % @deftypefnnewline on|off says whether the return type of typed functions % are printed on their own line. This affects @deftypefn, @deftypefun, % @deftypeop, and @deftypemethod. % \parseargdef\deftypefnnewline{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxideftypefnnl\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETtxideftypefnnl\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @txideftypefnnl value `\temp', must be on|off}% \fi\fi } % Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} % @deffn category class name args \makedefun{defop}#1 {\defopon{#1\ \putwordon}} % \defopon {category on}class name args \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deffngeneral {subind}category name args % \def\deffngeneral#1#2 #3 #4\endheader{% % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. \dosubind{fn}{\code{#3}}{#1}% \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } % Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} % \deftypeopon {category on}class type name args \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deftypefngeneral {subind}category type name args % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% \doingtypefntrue \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} % \deftypecvof {category of}class type var args \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } % \deftypecvgeneral {subind}category type var args % \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% \dosubind{vr}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } % Types: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \defname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: \makedefun{defun}{\deffnheader{\putwordDeffunc} } \makedefun{defmac}{\deffnheader{\putwordDefmac} } \makedefun{defspec}{\deffnheader{\putwordDefspec} } \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } \makedefun{defmethod}{\defopon\putwordMethodon} \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} \makedefun{defivar}{\defcvof\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} % \defname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % \def\defname#1#2#3{% \par % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % Determine if we are typesetting the return type of a typed function % on a line by itself. \rettypeownlinefalse \ifdoingtypefn % doing a typed function specifically? % then check user option for putting return type on its own line: \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else \rettypeownlinetrue \fi \fi % % How we'll format the category name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % % Figure out line sizes for the paragraph shape. We'll always have at % least two. \tempnum = 2 % % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip % % If doing a return type on its own line, we'll have another line. \ifrettypeownline \advance\tempnum by 1 \def\maybeshapeline{0in \hsize}% \else \def\maybeshapeline{}% \fi % % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % % The final paragraph shape: \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 % % Put the category name at the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize % \hsize has to be shortened this way: \kern\leftskip % Intentionally do not respect \rightskip, since we need the space. }% % % Allow all lines to be underfull without complaint: \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's % common to leave accents off identifiers. The result looks ok in % tt, but exceedingly strange in rm. % . we don't want -- and --- to be treated as ligatures. % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt \def\temp{#2}% text of the return type \ifx\temp\empty\else \tclose{\temp}% typeset the return type \ifrettypeownline % put return type on its own line; prohibit line break following: \hfil\vadjust{\nobreak}\break \else \space % type on same line, so just followed by a space \fi \fi % no return type #3% output function name }% {\rm\enskip}% hskip 0.5 em of \tenrm % \boldbrax % arguments will be output next, if any. } % Print arguments in slanted roman (not ttsl), inconsistently with using % tt for the name. This is because literal text is sometimes needed in % the argument list (groff manual), and ttsl and tt are not very % distinguishable. Prevent hyphenation at `-' chars. % \def\defunargs#1{% % use sl by default (not ttsl), % tt for the names. \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we % want a way to get ttsl. We used to recommend @var for that, so % leave the code in, but it's strange for @var to lead to typewriter. % Nowadays we recommend @code, since the difference between a ttsl hyphen % and a tt hyphen is pretty tiny. @code also disables ?` !`. \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% #1% \sl\hyphenchar\font=45 } % We want ()&[] to print specially on the defun line. % \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\[=\active \catcode`\]=\active \catcode`\&=\active } % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. { \activeparens \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\bf\ }} \def\parenfont{% \ifampseen % At the first level, print parens in roman, % otherwise use the default font. \ifnum \parencount=1 \rm \fi \else % The \sf parens (in \boldbrax) actually are a little bolder than % the contained text. This is especially needed for [ and ] . \sf \fi } \def\infirstlevel#1{% \ifampseen \ifnum\parencount=1 #1% \fi \fi } \def\bfafterword#1 {#1 \bf} \def\opnr{% \global\advance\parencount by 1 {\parenfont(}% \infirstlevel \bfafterword } \def\clnr{% {\parenfont)}% \infirstlevel \sl \global\advance\parencount by -1 } \newcount\brackcount \def\lbrb{% \global\advance\brackcount by 1 {\bf[}% } \def\rbrb{% {\bf]}% \global\advance\brackcount by -1 } \def\checkparencounts{% \ifnum\parencount=0 \else \badparencount \fi \ifnum\brackcount=0 \else \badbrackcount \fi } % these should not use \errmessage; the glibc manual, at least, actually % has such constructs (when documenting function pointers). \def\badparencount{% \message{Warning: unbalanced parentheses in @def...}% \global\parencount=0 } \def\badbrackcount{% \message{Warning: unbalanced square brackets in @def...}% \global\brackcount=0 } \message{macros,} % @macro. % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. \ifx\eTeXversion\thisisundefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \def\scanmacro#1{\begingroup \newlinechar`\^^M \let\xeatspaces\eatspaces % % Undo catcode changes of \startcontents and \doprintindex % When called from @insertcopying or (short)caption, we need active % backslash to get it printed correctly. Previously, we had % \catcode`\\=\other instead. We'll see whether a problem appears % with macro expansion. --kasal, 19aug04 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ % % ... and for \example: \spaceisspace % % The \empty here causes a following catcode 5 newline to be eaten as % part of reading whitespace after a control sequence. It does not % eat a catcode 13 newline. There's no good way to handle the two % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX % would then have different behavior). See the Macro Details node in % the manual for the workaround we recommend for macros and % line-oriented commands. % \scantokens{#1\empty}% \endgroup} \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% \temp } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \definedummyword\macro1\definedummyword\macro2... % Currently is also contains all @aliases; the list can be split % if there is a need. \def\macrolist{} % Add the macro to \macrolist \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} \def\addtomacrolistxxx#1{% \toks0 = \expandafter{\macrolist\definedummyword#1}% \xdef\macrolist{\the\toks0}% } % Utility routines. % This does \let #1 = #2, with \csnames; that is, % \let \csname#1\endcsname = \csname#2\endcsname % (except of course we have to play expansion games). % \def\cslet#1#2{% \expandafter\let \csname#1\expandafter\endcsname \csname#2\endcsname } % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \ % to recognize macro arguments; this is the job of \mbodybackslash. % % Non-ASCII encodings make 8-bit characters active, so un-activate % them to avoid their expansion. Must do this non-globally, to % confine the change to the current group. % % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. % \def\scanctxt{% used as subroutine \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\@=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi } \def\scanargctxt{% used for copying and captions, not macros. \scanctxt \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% used for @macro definitions \scanctxt \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } \def\macroargctxt{% used when scanning invocations \scanctxt \catcode`\\=0 } % why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" % for the single characters \ { }. Thus, we end up with the "commands" % that would be written @\ @{ @} in a Texinfo document. % % We already have @{ and @}. For @\, we define it here, and only for % this purpose, to produce a typewriter backslash (so, the @\ that we % define for @math can't be used with @macro calls): % \def\\{\normalbackslash}% % % We would like to do this for \, too, since that is what makeinfo does. % But it is not possible, because Texinfo already has a command @, for a % cedilla accent. Documents must use @comma{} instead. % % \anythingelse will almost certainly be an error of some kind. % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. % {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\margbackslash#1{\char`\#1 } \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0\relax \else \expandafter\parsemargdef \argl;% \if\paramno>256\relax \ifx\eTeXversion\thisisundefined \errhelp = \EMsimple \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} \fi \fi \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \else \errmessage{Macro name \the\macname\space already defined}\fi \global\cslet{macsave.\the\macname}{\the\macname}% \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% \addtomacrolist{\the\macname}% \fi \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \parseargdef\unmacro{% \if1\csname ismacro.#1\endcsname \global\cslet{#1}{macsave.#1}% \global\expandafter\let \csname ismacro.#1\endcsname=0% % Remove the macro name from \macrolist: \begingroup \expandafter\let\csname#1\endcsname \relax \let\definedummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \else \errmessage{Macro #1 not defined}% \fi } % Called by \do from \dounmacro on each macro. The idea is to omit any % macro definitions that have been changed to \relax. % \def\unmacrodo#1{% \ifx #1\relax % remove this \else \noexpand\definedummyword \noexpand#1% \fi } % This makes use of the obscure feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname#1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % For macro processing make @ a letter so that we can make Texinfo private macro names. \edef\texiatcatcode{\the\catcode`\@} \catcode `@=11\relax % Parse the optional {params} list. Set up \paramno and \paramlist % so \defmacro knows what to do. Define \macarg.BLAH for each BLAH % in the params list to some hook where the argument si to be expanded. If % there are less than 10 arguments that hook is to be replaced by ##N where N % is the position in that list, that is to say the macro arguments are to be % defined `a la TeX in the macro body. % % That gets used by \mbodybackslash (above). % % We need to get `macro parameter char #' into several definitions. % The technique used is stolen from LaTeX: let \hash be something % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \eatspaces till just before % the macro is used. % % If there are 10 or more arguments, a different technique is used, where the % hook remains in the body, and when macro is to be expanded the body is % processed again to replace the arguments. % % In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the % argument N value and then \edef the body (nothing else will expand because of % the catcode regime underwhich the body was input). % % If you compile with TeX (not eTeX), and you have macros with 10 or more % arguments, you need that no macro has more than 256 arguments, otherwise an % error is produced. \def\parsemargdef#1;{% \paramno=0\def\paramlist{}% \let\hash\relax \let\xeatspaces\relax \parsemargdefxxx#1,;,% % In case that there are 10 or more arguments we parse again the arguments % list to set new definitions for the \macarg.BLAH macros corresponding to % each BLAH argument. It was anyhow needed to parse already once this list % in order to count the arguments, and as macros with at most 9 arguments % are by far more frequent than macro with 10 or more arguments, defining % twice the \macarg.BLAH macros does not cost too much processing power. \ifnum\paramno<10\relax\else \paramno0\relax \parsemmanyargdef@@#1,;,% 10 or more arguments \fi } \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} \def\parsemmanyargdef@@#1,{% \if#1;\let\next=\relax \else \let\next=\parsemmanyargdef@@ \edef\tempb{\eatspaces{#1}}% \expandafter\def\expandafter\tempa \expandafter{\csname macarg.\tempb\endcsname}% % Note that we need some extra \noexpand\noexpand, this is because we % don't want \the to be expanded in the \parsermacbody as it uses an % \xdef . \expandafter\edef\tempa {\noexpand\noexpand\noexpand\the\toks\the\paramno}% \advance\paramno by 1\relax \fi\next} % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) % \catcode `\@\texiatcatcode \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \catcode `\@=11\relax \let\endargs@\relax \let\nil@\relax \def\nilm@{\nil@}% \long\def\nillm@{\nil@}% % This macro is expanded during the Texinfo macro expansion, not during its % definition. It gets all the arguments values and assigns them to macros % macarg.ARGNAME % % #1 is the macro name % #2 is the list of argument names % #3 is the list of argument values \def\getargvals@#1#2#3{% \def\macargdeflist@{}% \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. \def\paramlist{#2,\nil@}% \def\macroname{#1}% \begingroup \macroargctxt \def\argvaluelist{#3,\nil@}% \def\@tempa{#3}% \ifx\@tempa\empty \setemptyargvalues@ \else \getargvals@@ \fi } % \def\getargvals@@{% \ifx\paramlist\nilm@ % Some sanity check needed here that \argvaluelist is also empty. \ifx\argvaluelist\nillm@ \else \errhelp = \EMsimple \errmessage{Too many arguments in macro `\macroname'!}% \fi \let\next\macargexpandinbody@ \else \ifx\argvaluelist\nillm@ % No more arguments values passed to macro. Set remaining named-arg % macros to empty. \let\next\setemptyargvalues@ \else % pop current arg name into \@tempb \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% \expandafter\@tempa\expandafter{\paramlist}% % pop current argument value into \@tempc \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% \expandafter\@tempa\expandafter{\argvaluelist}% % Here \@tempb is the current arg name and \@tempc is the current arg value. % First place the new argument macro definition into \@tempd \expandafter\macname\expandafter{\@tempc}% \expandafter\let\csname macarg.\@tempb\endcsname\relax \expandafter\def\expandafter\@tempe\expandafter{% \csname macarg.\@tempb\endcsname}% \edef\@tempd{\long\def\@tempe{\the\macname}}% \push@\@tempd\macargdeflist@ \let\next\getargvals@@ \fi \fi \next } \def\push@#1#2{% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter#1#2}% } % Replace arguments by their values in the macro body, and place the result % in macro \@tempa \def\macvalstoargs@{% % To do this we use the property that token registers that are \the'ed % within an \edef expand only once. So we are going to place all argument % values into respective token registers. % % First we save the token context, and initialize argument numbering. \begingroup \paramno0\relax % Then, for each argument number #N, we place the corresponding argument % value into a new token list register \toks#N \expandafter\putargsintokens@\saveparamlist@,;,% % Then, we expand the body so that argument are replaced by their % values. The trick for values not to be expanded themselves is that they % are within tokens and that tokens expand only once in an \edef . \edef\@tempc{\csname mac.\macroname .body\endcsname}% % Now we restore the token stack pointer to free the token list registers % which we have used, but we make sure that expanded body is saved after % group. \expandafter \endgroup \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% } \def\macargexpandinbody@{% %% Define the named-macro outside of this group and then close this group. \expandafter \endgroup \macargdeflist@ % First the replace in body the macro arguments by their values, the result % is in \@tempa . \macvalstoargs@ % Then we point at the \norecurse or \gobble (for recursive) macro value % with \@tempb . \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname % Depending on whether it is recursive or not, we need some tailing % \egroup . \ifx\@tempb\gobble \let\@tempc\relax \else \let\@tempc\egroup \fi % And now we do the real job: \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% \@tempd } \def\putargsintokens@#1,{% \if#1;\let\next\relax \else \let\next\putargsintokens@ % First we allocate the new token list register, and give it a temporary % alias \@tempb . \toksdef\@tempb\the\paramno % Then we place the argument value into that token list register. \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname \expandafter\@tempb\expandafter{\@tempa}% \advance\paramno by 1\relax \fi \next } % Save the token stack pointer into macro #1 \def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} % Restore the token stack pointer from number in macro #1 \def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} % newtoks that can be used non \outer . \def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} % Tailing missing arguments are set to empty \def\setemptyargvalues@{% \ifx\paramlist\nilm@ \let\next\macargexpandinbody@ \else \expandafter\setemptyargvaluesparser@\paramlist\endargs@ \let\next\setemptyargvalues@ \fi \next } \def\setemptyargvaluesparser@#1,#2\endargs@{% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter\def\csname macarg.#1\endcsname{}}% \push@\@tempa\macargdeflist@ \def\paramlist{#2}% } % #1 is the element target macro % #2 is the list macro % #3,#4\endargs@ is the list value \def\pop@#1#2#3,#4\endargs@{% \def#1{#3}% \def#2{#4}% } \long\def\longpop@#1#2#3,#4\endargs@{% \long\def#1{#3}% \long\def#2{#4}% } % This defines a Texinfo @macro. There are eight cases: recursive and % nonrecursive macros of zero, one, up to nine, and many arguments. % Much magic with \expandafter here. % \xdef is used so that macro definitions will survive the file % they're defined in; @include reads the file inside a group. % \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifrecursive \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\temp}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup\noexpand\scanmacro{\temp}}% \else \ifnum\paramno<10\relax % at most 9 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{\egroup\noexpand\scanmacro{\temp}}% \else % 10 or more \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble \fi \fi \else \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % at most 9 \ifnum\paramno<10\relax \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \expandafter\noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % 10 or more: \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse \fi \fi \fi} \catcode `\@\texiatcatcode\relax \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} % \braceorline decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence % as an argument (by \parsebrace or \parsearg). % \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else \expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Make them active and then expand them all to nothing. % \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \addtomacrolist{#1}% \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{% \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in % cross-references. The @node line might or might not have commas, and % might or might not have spaces before the first comma, like: % @node foo , bar , ... % We don't want such trailing spaces in the node name. % \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} % % also remove a trailing comma, in case of something like this: % @node Help-Cross, , , Cross-refs \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} \let\nwnode=\node \let\lastnode=\empty % Write a cross-reference definition for the current node. #1 is the % type (Ynumbered, Yappendix, Ynothing). % \def\donoderef#1{% \ifx\lastnode\empty\else \setref{\lastnode}{#1}% \global\let\lastnode=\empty \fi } % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an % anchor), which consists of three parts: % 1) NAME-title - the current sectioning name taken from \lastsection, % or the anchor name. % 2) NAME-snt - section number and type, passed as the SNT arg, or % empty for anchors. % 3) NAME-pg - the page number. % % This is called from \donoderef, \anchor, and \dofloat. In the case of % floats, there is an additional part, which is not written here: % 4) NAME-lof - the text as it should appear in a @listoffloats. % \def\setref#1#2{% \pdfmkdest{#1}% \iflinks {% \atdummies % preserve commands, but don't expand them \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\lastsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout }% \fi } % @xrefautosectiontitle on|off says whether @section(ing) names are used % automatically in xrefs, if the third arg is not explicitly specified. % This was provided as a "secret" @set xref-automatic-section-title % variable, now it's official. % \parseargdef\xrefautomaticsectiontitle{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', must be on|off}% \fi\fi } % % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} % \newbox\toprefbox \newbox\printedrefnamebox \newbox\infofilenamebox \newbox\printedmanualbox % \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces % % Get args without leading/trailing spaces. \def\printedrefname{\ignorespaces #3}% \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% % \def\infofilename{\ignorespaces #4}% \setbox\infofilenamebox = \hbox{\infofilename\unskip}% % \def\printedmanual{\ignorespaces #5}% \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% % % If the printed reference name (arg #3) was not explicitly given in % the @xref, figure out what we want to use. \ifdim \wd\printedrefnamebox = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax % Not auto section-title: use node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Auto section-title: use chapter/section title inside % the square brackets if we have it. \ifdim \wd\printedmanualbox > 0pt % It is in another manual, so we don't have it; use node name. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We (should) know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf {\indexnofonts \turnoffactive \makevalueexpandable % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. This ignores all spaces in % #4, including (wrongly) those in the middle of the filename. \getfilename{#4}% % % This (wrongly) does not take account of leading or trailing % spaces in #1, which should be ignored. \edef\pdfxrefdest{#1}% \ifx\pdfxrefdest\empty \def\pdfxrefdest{Top}% no empty targets \else \txiescapepdf\pdfxrefdest % escape PDF special chars \fi % \leavevmode \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfxrefdest}% \else goto name{\pdfmkpgn{\pdfxrefdest}}% \fi }% \setcolor{\linkcolor}% \fi % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". We distinguish them by the % LABEL-title being set to a magic string. {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd\printedrefnamebox = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % If the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd\printedmanualbox > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox to print the node names, TeX does not insert % empty discretionaries after hyphens, which means that it will not % find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, % this is a loss. Therefore, we give the text of the node name % again, so it is as if TeX is seeing it for the first time. % \ifdim \wd\printedmanualbox > 0pt % Cross-manual reference with a printed manual name. % \crossmanualxref{\cite{\printedmanual\unskip}}% % \else\ifdim \wd\infofilenamebox > 0pt % Cross-manual reference with only an info filename (arg 4), no % printed manual name (arg 5). This is essentially the same as % the case above; we output the filename, since we have nothing else. % \crossmanualxref{\code{\infofilename\unskip}}% % \else % Reference within this manual. % % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of % printing. So we \turnoffactive for the \refx-snt, back on for the % printing, back off for the \refx-pg. {\turnoffactive % Only output a following space if the -snt ref is nonempty; for % @unnumbered and @anchor, it won't be. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi }% % output the `[mynode]' via the macro below so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% \fi\fi \fi \endlink \endgroup} % Output a cross-manual xref to #1. Used just above (twice). % % Only include the text "Section ``foo'' in" if the foo is neither % missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply % "see The Foo Manual", the idea being to refer to the whole manual. % % But, this being TeX, we can't easily compare our node name against the % string "Top" while ignoring the possible spaces before and after in % the input. By adding the arbitrary 7sp below, we make it much less % likely that a real node name would have the same width as "Top" (e.g., % in a monospaced font). Hopefully it will never happen in practice. % % For the same basic reason, we retypeset the "Top" at every % reference, since the current font is indeterminate. % \def\crossmanualxref#1{% \setbox\toprefbox = \hbox{Top\kern7sp}% \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% \ifdim \wd2 > 7sp % nonempty? \ifdim \wd2 = \wd\toprefbox \else % same as Top? \putwordSection{} ``\printedrefname'' \putwordin{}\space \fi \fi #1% } % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly % one that Bob is working on :). % \def\xrefprintnodename#1{[#1]} % Things referred to by \setref. % \def\Ynothing{} \def\Yomitfromtoc{} \def\Ynumbered{% \ifnum\secno=0 \putwordChapter@tie \the\chapno \else \ifnum\subsecno=0 \putwordSection@tie \the\chapno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno \else \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } \def\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno \else \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. % \def\refx#1#2{% {% \indexnofonts \otherbackslash \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% \ifx\thisrefX\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs {\toks0 = {#1}% avoid expansion of possibly-complex value \message{\linenumber Undefined cross reference `\the\toks0'.}}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Usually it's % just a \def (we prepend XR to the control sequence name to avoid % collisions). But if this is a float type, we have more work to do. % \def\xrdef#1#2{% {% The node name might contain 8-bit characters, which in our current % implementation are changed to commands like @'e. Don't let these % mess up the control sequence name. \indexnofonts \turnoffactive \xdef\safexrefname{#1}% }% % \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR\safexrefname\endcsname % it was a float, and we have the (safe) float type in \iffloattype. \expandafter\let\expandafter\floatlist \csname floatlist\iffloattype\endcsname % % Is this the first time we've seen this float type? \expandafter\ifx\floatlist\relax \toks0 = {\do}% yes, so just \do \else % had it before, so preserve previous elements in list. \toks0 = \expandafter{\floatlist\do}% \fi % % Remember this xref in the control sequence \floatlistFLOATTYPE, % for later use in \listoffloats. \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 {\safexrefname}}% \fi } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readdatafile{aux}% \global\havexrefstrue \fi \closein 1 } \def\setupdatafile{% \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. % in xref tags, i.e., node names. But since ^^e4 notation isn't % supported in the main text, it doesn't seem desirable. Furthermore, % that is not enough: for node names that actually contain a ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % % This is to support \ in node names and titles, since the \ % characters end up in a \csname. It's easier than % leaving it active and making its active definition an actual \ % character. What I don't understand is why it works in the *value* % of the xrdef. Seems like it should be a catcode12 \, and that % should not typeset properly. But it works, so I'm moving on for % now. --karl, 15jan04. \catcode`\\=\other % % Make the characters 128-255 be printing characters. {% \count1=128 \def\loop{% \catcode\count1=\other \advance\count1 by 1 \ifnum \count1<256 \loop \fi }% }% % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for Info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \let\indent=\ptexindent \let\noindent=\ptexnoindent \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \dofootnote }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset (and anything else that uses % \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \hsize=\pagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut % % Invoke rest of plain TeX footnote routine. \futurelet\next\fo@t } }%end \catcode `\@=11 % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarly, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. % \def\startsavinginserts{% \ifx \insert\ptexinsert \let\insert\saveinsert \else \let\checkinserts\relax \fi } % This \insert replacement works for both \insert\footins{foo} and % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. % \def\saveinsert#1{% \edef\next{\noexpand\savetobox \makeSAVEname#1}% \afterassignment\next % swallow the left brace \let\temp = } \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} \def\placesaveins#1{% \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname {\box#1}% } % eat @SAVE -- beware, all of them have catcode \other: { \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) \gdef\gobblesave @SAVE{} } % initialization: \def\newsaveins #1{% \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% \next } \def\newsaveinsX #1{% \csname newbox\endcsname #1% \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts \checksaveins #1}% } % initialize: \let\checkinserts\empty \newsaveins\footins \newsaveins\margin % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % Do not bother showing banner with epsf.tex v2.7k (available in % doc/epsf.tex and on ctan). \def\epsfannounce{\toks0 = }% \input epsf.tex \fi \closein 1 % % We will only complain once about lack of epsf.tex. \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from ftp://tug.org/tex/epsf.tex.} % \def\image#1{% \ifx\epsfbox\thisisundefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names % If the image is by itself, center it. \ifvmode \imagevmodetrue \else \ifx\centersub\centerV % for @center @image, we need a vbox so we can have our vertical space \imagevmodetrue \vbox\bgroup % vbox has better behavior than vtop herev \fi\fi % \ifimagevmode \nobreak\medskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \nobreak\vskip\parskip \nobreak \fi % % Leave vertical mode so that indentation from an enclosing % environment such as @quotation is respected. % However, if we're at the top level, we don't want the % normal paragraph indentation. % On the other hand, if we are in the case of @center @image, we don't % want to start a paragraph, which will create a hsize-width box and % eradicate the centering. \ifx\centersub\centerV\else \noindent \fi % % Output the image. \ifpdf \dopdfimage{#1}{#2}{#3}% \else % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \fi % \ifimagevmode \medskip % space after a standalone image \fi \ifx\centersub\centerV \egroup \fi \endgroup} % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, % etc. We don't actually implement floating yet, we always include the % float "here". But it seemed the best name for the future. % \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} % There may be a space before second and/or third parameter; delete it. \def\eatcommaspace#1, {#1,} % #1 is the optional FLOATTYPE, the text label for this float, typically % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, % this float will not be numbered and cannot be referred to. % % #2 is the optional xref label. Also must be present for the float to % be referable. % % #3 is the optional positioning argument; for now, it is ignored. It % will somehow specify the positions allowed to float to (here, top, bottom). % % We keep a separate counter for each FLOATTYPE, which we reset at each % chapter-level command. \let\resetallfloatnos=\empty % \def\dofloat#1,#2,#3,#4\finish{% \let\thiscaption=\empty \let\thisshortcaption=\empty % % don't lose footnotes inside @float. % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \startsavinginserts % % We can't be used inside a paragraph. \par % \vtop\bgroup \def\floattype{#1}% \def\floatlabel{#2}% \def\floatloc{#3}% we do nothing with this yet. % \ifx\floattype\empty \let\safefloattype=\empty \else {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% \fi % % If label is given but no type, we handle that as the empty type. \ifx\floatlabel\empty \else % We want each FLOATTYPE to be numbered separately (Figure 1, % Table 1, Figure 2, ...). (And if no label, no number.) % \expandafter\getfloatno\csname\safefloattype floatno\endcsname \global\advance\floatno by 1 % {% % This magic value for \lastsection is output by \setref as the % XREFLABEL-title value. \xrefX uses it to distinguish float % labels (which have a completely different output format) from % node and anchor labels. And \xrdef uses it to construct the % lists of floats. % \edef\lastsection{\floatmagic=\safefloattype}% \setref{\floatlabel}{Yfloat}% }% \fi % % start with \parskip glue, I guess. \vskip\parskip % % Don't suppress indentation if a float happens to start a section. \restorefirstparagraphindent } % we have these possibilities: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap % @float Foo,lbl & no caption: Foo 1.1 % @float Foo & @caption{Cap}: Foo: Cap % @float Foo & no caption: Foo % @float ,lbl & Caption{Cap}: 1.1: Cap % @float ,lbl & no caption: 1.1 % @float & @caption{Cap}: Cap % @float & no caption: % \def\Efloat{% \let\floatident = \empty % % In all cases, if we have a float type, it comes first. \ifx\floattype\empty \else \def\floatident{\floattype}\fi % % If we have an xref label, the number comes next. \ifx\floatlabel\empty \else \ifx\floattype\empty \else % if also had float type, need tie first. \appendtomacro\floatident{\tie}% \fi % the number. \appendtomacro\floatident{\chaplevelprefix\the\floatno}% \fi % % Start the printed caption with what we've constructed in % \floatident, but keep it separate; we need \floatident again. \let\captionline = \floatident % \ifx\thiscaption\empty \else \ifx\floatident\empty \else \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. \appendtomacro\captionline{\scanexp\thiscaption}% \fi % % If we have anything to print, print it, with space before. % Eventually this needs to become an \insert. \ifx\captionline\empty \else \vskip.5\parskip \captionline % % Space below caption. \vskip\parskip \fi % % If have an xref label, write the list of floats info. Do this % after the caption, to avoid chance of it being a breakpoint. \ifx\floatlabel\empty \else % Write the text that goes in the lof to the aux file as % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% \atdummies % % since we read the caption text in the macro world, where ^^M % is turned into a normal character, we have to scan it back, so % we don't write the literal three characters "^^M" into the aux file. \scanexp{% \xdef\noexpand\gtemp{% \ifx\thisshortcaption\empty \thiscaption \else \thisshortcaption \fi }% }% \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % % place the captured inserts % % BEWARE: when the floats start floating, we have to issue warning % whenever an insert appears inside a float which could possibly % float. --kasal, 26may04 % \checkinserts } % Append the tokens #2 to the definition of macro #1, not expanding either. % \def\appendtomacro#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2}% } % @caption, @shortcaption % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} \def\defcaption#1#2{\egroup \def#1{#2}} % The parameter is the control sequence identifying the counter we are % going to use. Create it if it doesn't exist and assign it to \floatno. \def\getfloatno#1{% \ifx#1\relax % Haven't seen this figure type before. \csname newcount\endcsname #1% % % Remember to reset this floatno at the next chap. \expandafter\gdef\expandafter\resetallfloatnos \expandafter{\resetallfloatnos #1=0 }% \fi \let\floatno#1% } % \setref calls this to get the XREFLABEL-snt value. We want an @xref % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we % first read the @float command. % \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% % Magic string used for the XREFLABEL-title value, so \xrefX can % distinguish floats from other xref types. \def\floatmagic{!!float!!} % #1 is the control sequence we are passed; we expand into a conditional % which is true if #1 represents a float ref. That is, the magic % \lastsection value which we \setref above. % \def\iffloat#1{\expandafter\doiffloat#1==\finish} % % #1 is (maybe) the \floatmagic string. If so, #2 will be the % (safe) float type for this float. We set \iffloattype to #2. % \def\doiffloat#1=#2=#3\finish{% \def\temp{#1}% \def\iffloattype{#2}% \ifx\temp\floatmagic } % @listoffloats FLOATTYPE - print a list of floats like a table of contents. % \parseargdef\listoffloats{% \def\floattype{#1}% floattype {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% % % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax \ifhavexrefs % if the user said @listoffloats foo but never @float foo. \message{\linenumber No `\safefloattype' floats to list.}% \fi \else \begingroup \leftskip=\tocindent % indent these entries like a toc \let\do=\listoffloatsdo \csname floatlist\safefloattype\endcsname \endgroup \fi } % This is called on each entry in a list of floats. We're passed the % xref label, in the form LABEL-title, which is how we save it in the % aux file. We strip off the -title and look up \XRLABEL-lof, which % has the text we're supposed to typeset here. % % Figures without xref labels will not be included in the list (since % they won't appear in the aux file). % \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} \def\listoffloatsdoentry#1-title\finish{{% % Can't fully expand XR#1-lof because it can contain anything. Just % pass the control sequence. On the other hand, XR#1-pg is just the % page number, and we want to fully expand that so we can get a link % in pdf output. \toksA = \expandafter{\csname XR#1-lof\endcsname}% % % use the same \entry macro we use to generate the TOC and index. \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% \writeentry }} \message{localization,} % For single-language documents, @documentlanguage is usually given very % early, just after @documentencoding. Single argument is the language % (de) or locale (de_DE) abbreviation. % { \catcode`\_ = \active \globaldefs=1 \parseargdef\documentlanguage{\begingroup \let_=\normalunderscore % normal _ character for filenames \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \openin 1 txi-#1.tex \ifeof 1 \documentlanguagetrywithoutunderscore{#1_\finish}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 \endgroup % end raw TeX \endgroup} % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. % \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 } }% end of special _ catcode % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? Putting it in the current directory should work if nowhere else does.} % This macro is called from txi-??.tex files; the first argument is the % \language name to set (without the "\lang@" prefix), the second and % third args are \{left,right}hyphenmin. % % The language names to pass are determined when the format is built. % See the etex.log file created at that time, e.g., % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. % % With TeX Live 2008, etex now includes hyphenation patterns for all % available languages. This means we can support hyphenation in % Texinfo, at least to some extent. (This still doesn't solve the % accented characters problem.) % \catcode`@=11 \def\txisetlanguage#1#2#3{% % do not set the language if the name is undefined in the current TeX. \expandafter\ifx\csname lang@#1\endcsname \relax \message{no patterns for #1}% \else \global\language = \csname lang@#1\endcsname \fi % but there is no harm in adjusting the hyphenmin values regardless. \global\lefthyphenmin = #2\relax \global\righthyphenmin = #3\relax } % Helpers for encodings. % Set the catcode of characters 128 through 255 to the specified number. % \def\setnonasciicharscatcode#1{% \count255=128 \loop\ifnum\count255<256 \global\catcode\count255=#1\relax \advance\count255 by 1 \repeat } \def\setnonasciicharscatcodenonglobal#1{% \count255=128 \loop\ifnum\count255<256 \catcode\count255=#1\relax \advance\count255 by 1 \repeat } % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % \parseargdef\documentencoding{% % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % % Supported encodings: names converted to tokens in order to be able % to compare them with \ifx. \def\ascii{\csname US-ASCII.enc\endcsname}% \def\latnine{\csname ISO-8859-15.enc\endcsname}% \def\latone{\csname ISO-8859-1.enc\endcsname}% \def\lattwo{\csname ISO-8859-2.enc\endcsname}% \def\utfeight{\csname UTF-8.enc\endcsname}% % \ifx \declaredencoding \ascii \asciichardefs % \else \ifx \declaredencoding \lattwo \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \setnonasciicharscatcode\active \utfeightchardefs % \else \message{Unknown document encoding #1, ignoring.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii } % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} % First, make active non-ASCII characters in order for them to be % correctly categorized when TeX reads the replacement text of % macros containing the character definitions. \setnonasciicharscatcode\active % % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdef^^a0{\tie} \gdef^^a1{\exclamdown} \gdef^^a2{\missingcharmsg{CENT SIGN}} \gdef^^a3{{\pounds}} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\missingcharmsg{YEN SIGN}} \gdef^^a6{\missingcharmsg{BROKEN BAR}} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\copyright} \gdef^^aa{\ordf} \gdef^^ab{\guillemetleft} \gdef^^ac{$\lnot$} \gdef^^ad{\-} \gdef^^ae{\registeredsymbol} \gdef^^af{\={}} % \gdef^^b0{\textdegree} \gdef^^b1{$\pm$} \gdef^^b2{$^2$} \gdef^^b3{$^3$} \gdef^^b4{\'{}} \gdef^^b5{$\mu$} \gdef^^b6{\P} % \gdef^^b7{$^.$} \gdef^^b8{\cedilla\ } \gdef^^b9{$^1$} \gdef^^ba{\ordm} % \gdef^^bb{\guillemetright} \gdef^^bc{$1\over4$} \gdef^^bd{$1\over2$} \gdef^^be{$3\over4$} \gdef^^bf{\questiondown} % \gdef^^c0{\`A} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\~A} \gdef^^c4{\"A} \gdef^^c5{\ringaccent A} \gdef^^c6{\AE} \gdef^^c7{\cedilla C} \gdef^^c8{\`E} \gdef^^c9{\'E} \gdef^^ca{\^E} \gdef^^cb{\"E} \gdef^^cc{\`I} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\"I} % \gdef^^d0{\DH} \gdef^^d1{\~N} \gdef^^d2{\`O} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\~O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\O} \gdef^^d9{\`U} \gdef^^da{\'U} \gdef^^db{\^U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\TH} \gdef^^df{\ss} % \gdef^^e0{\`a} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\~a} \gdef^^e4{\"a} \gdef^^e5{\ringaccent a} \gdef^^e6{\ae} \gdef^^e7{\cedilla c} \gdef^^e8{\`e} \gdef^^e9{\'e} \gdef^^ea{\^e} \gdef^^eb{\"e} \gdef^^ec{\`{\dotless i}} \gdef^^ed{\'{\dotless i}} \gdef^^ee{\^{\dotless i}} \gdef^^ef{\"{\dotless i}} % \gdef^^f0{\dh} \gdef^^f1{\~n} \gdef^^f2{\`o} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\~o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\o} \gdef^^f9{\`u} \gdef^^fa{\'u} \gdef^^fb{\^u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\th} \gdef^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdef^^a4{\euro} \gdef^^a6{\v S} \gdef^^a8{\v s} \gdef^^b4{\v Z} \gdef^^b8{\v z} \gdef^^bc{\OE} \gdef^^bd{\oe} \gdef^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdef^^a0{\tie} \gdef^^a1{\ogonek{A}} \gdef^^a2{\u{}} \gdef^^a3{\L} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\v L} \gdef^^a6{\'S} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\v S} \gdef^^aa{\cedilla S} \gdef^^ab{\v T} \gdef^^ac{\'Z} \gdef^^ad{\-} \gdef^^ae{\v Z} \gdef^^af{\dotaccent Z} % \gdef^^b0{\textdegree} \gdef^^b1{\ogonek{a}} \gdef^^b2{\ogonek{ }} \gdef^^b3{\l} \gdef^^b4{\'{}} \gdef^^b5{\v l} \gdef^^b6{\'s} \gdef^^b7{\v{}} \gdef^^b8{\cedilla\ } \gdef^^b9{\v s} \gdef^^ba{\cedilla s} \gdef^^bb{\v t} \gdef^^bc{\'z} \gdef^^bd{\H{}} \gdef^^be{\v z} \gdef^^bf{\dotaccent z} % \gdef^^c0{\'R} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\u A} \gdef^^c4{\"A} \gdef^^c5{\'L} \gdef^^c6{\'C} \gdef^^c7{\cedilla C} \gdef^^c8{\v C} \gdef^^c9{\'E} \gdef^^ca{\ogonek{E}} \gdef^^cb{\"E} \gdef^^cc{\v E} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\v D} % \gdef^^d0{\DH} \gdef^^d1{\'N} \gdef^^d2{\v N} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\H O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\v R} \gdef^^d9{\ringaccent U} \gdef^^da{\'U} \gdef^^db{\H U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\cedilla T} \gdef^^df{\ss} % \gdef^^e0{\'r} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\u a} \gdef^^e4{\"a} \gdef^^e5{\'l} \gdef^^e6{\'c} \gdef^^e7{\cedilla c} \gdef^^e8{\v c} \gdef^^e9{\'e} \gdef^^ea{\ogonek{e}} \gdef^^eb{\"e} \gdef^^ec{\v e} \gdef^^ed{\'{\dotless{i}}} \gdef^^ee{\^{\dotless{i}}} \gdef^^ef{\v d} % \gdef^^f0{\dh} \gdef^^f1{\'n} \gdef^^f2{\v n} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\H o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\v r} \gdef^^f9{\ringaccent u} \gdef^^fa{\'u} \gdef^^fb{\H u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\cedilla t} \gdef^^ff{\dotaccent{}} } % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. % \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz \gdef\UTFviiiTwoOctets#1#2{\expandafter \UTFviiiDefined\csname u8:#1\string #2\endcsname} % \gdef\UTFviiiThreeOctets#1#2#3{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} % \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} \gdef\UTFviiiDefined#1{% \ifx #1\relax \message{\linenumber Unicode char \string #1 not defined for Texinfo}% \else \expandafter #1% \fi } \begingroup \catcode`\~13 \catcode`\"12 \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiTwoOctets\string~}} \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiThreeOctets\string~}} \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiFourOctets\string~}} \UTFviiiLoop \endgroup \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacter#1#2{% \countUTFz = "#1\relax %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref \def\UTFviiiTwoOctets##1##2{% \csname u8:##1\string ##2\endcsname}% \def\UTFviiiThreeOctets##1##2##3{% \csname u8:##1\string ##2\string ##3\endcsname}% \def\UTFviiiFourOctets##1##2##3##4{% \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \gdef\UTFviiiTmp{#2}% \endgroup} \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctets.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% \fi\fi\fi } \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz \multiply\countUTFz by 64 \advance\countUTFx by -\countUTFz \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup \def\utfeightchardefs{% \DeclareUnicodeCharacter{00A0}{\tie} \DeclareUnicodeCharacter{00A1}{\exclamdown} \DeclareUnicodeCharacter{00A3}{\pounds} \DeclareUnicodeCharacter{00A8}{\"{ }} \DeclareUnicodeCharacter{00A9}{\copyright} \DeclareUnicodeCharacter{00AA}{\ordf} \DeclareUnicodeCharacter{00AB}{\guillemetleft} \DeclareUnicodeCharacter{00AD}{\-} \DeclareUnicodeCharacter{00AE}{\registeredsymbol} \DeclareUnicodeCharacter{00AF}{\={ }} \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} \DeclareUnicodeCharacter{00B4}{\'{ }} \DeclareUnicodeCharacter{00B8}{\cedilla{ }} \DeclareUnicodeCharacter{00BA}{\ordm} \DeclareUnicodeCharacter{00BB}{\guillemetright} \DeclareUnicodeCharacter{00BF}{\questiondown} \DeclareUnicodeCharacter{00C0}{\`A} \DeclareUnicodeCharacter{00C1}{\'A} \DeclareUnicodeCharacter{00C2}{\^A} \DeclareUnicodeCharacter{00C3}{\~A} \DeclareUnicodeCharacter{00C4}{\"A} \DeclareUnicodeCharacter{00C5}{\AA} \DeclareUnicodeCharacter{00C6}{\AE} \DeclareUnicodeCharacter{00C7}{\cedilla{C}} \DeclareUnicodeCharacter{00C8}{\`E} \DeclareUnicodeCharacter{00C9}{\'E} \DeclareUnicodeCharacter{00CA}{\^E} \DeclareUnicodeCharacter{00CB}{\"E} \DeclareUnicodeCharacter{00CC}{\`I} \DeclareUnicodeCharacter{00CD}{\'I} \DeclareUnicodeCharacter{00CE}{\^I} \DeclareUnicodeCharacter{00CF}{\"I} \DeclareUnicodeCharacter{00D0}{\DH} \DeclareUnicodeCharacter{00D1}{\~N} \DeclareUnicodeCharacter{00D2}{\`O} \DeclareUnicodeCharacter{00D3}{\'O} \DeclareUnicodeCharacter{00D4}{\^O} \DeclareUnicodeCharacter{00D5}{\~O} \DeclareUnicodeCharacter{00D6}{\"O} \DeclareUnicodeCharacter{00D8}{\O} \DeclareUnicodeCharacter{00D9}{\`U} \DeclareUnicodeCharacter{00DA}{\'U} \DeclareUnicodeCharacter{00DB}{\^U} \DeclareUnicodeCharacter{00DC}{\"U} \DeclareUnicodeCharacter{00DD}{\'Y} \DeclareUnicodeCharacter{00DE}{\TH} \DeclareUnicodeCharacter{00DF}{\ss} \DeclareUnicodeCharacter{00E0}{\`a} \DeclareUnicodeCharacter{00E1}{\'a} \DeclareUnicodeCharacter{00E2}{\^a} \DeclareUnicodeCharacter{00E3}{\~a} \DeclareUnicodeCharacter{00E4}{\"a} \DeclareUnicodeCharacter{00E5}{\aa} \DeclareUnicodeCharacter{00E6}{\ae} \DeclareUnicodeCharacter{00E7}{\cedilla{c}} \DeclareUnicodeCharacter{00E8}{\`e} \DeclareUnicodeCharacter{00E9}{\'e} \DeclareUnicodeCharacter{00EA}{\^e} \DeclareUnicodeCharacter{00EB}{\"e} \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} \DeclareUnicodeCharacter{00F0}{\dh} \DeclareUnicodeCharacter{00F1}{\~n} \DeclareUnicodeCharacter{00F2}{\`o} \DeclareUnicodeCharacter{00F3}{\'o} \DeclareUnicodeCharacter{00F4}{\^o} \DeclareUnicodeCharacter{00F5}{\~o} \DeclareUnicodeCharacter{00F6}{\"o} \DeclareUnicodeCharacter{00F8}{\o} \DeclareUnicodeCharacter{00F9}{\`u} \DeclareUnicodeCharacter{00FA}{\'u} \DeclareUnicodeCharacter{00FB}{\^u} \DeclareUnicodeCharacter{00FC}{\"u} \DeclareUnicodeCharacter{00FD}{\'y} \DeclareUnicodeCharacter{00FE}{\th} \DeclareUnicodeCharacter{00FF}{\"y} \DeclareUnicodeCharacter{0100}{\=A} \DeclareUnicodeCharacter{0101}{\=a} \DeclareUnicodeCharacter{0102}{\u{A}} \DeclareUnicodeCharacter{0103}{\u{a}} \DeclareUnicodeCharacter{0104}{\ogonek{A}} \DeclareUnicodeCharacter{0105}{\ogonek{a}} \DeclareUnicodeCharacter{0106}{\'C} \DeclareUnicodeCharacter{0107}{\'c} \DeclareUnicodeCharacter{0108}{\^C} \DeclareUnicodeCharacter{0109}{\^c} \DeclareUnicodeCharacter{0118}{\ogonek{E}} \DeclareUnicodeCharacter{0119}{\ogonek{e}} \DeclareUnicodeCharacter{010A}{\dotaccent{C}} \DeclareUnicodeCharacter{010B}{\dotaccent{c}} \DeclareUnicodeCharacter{010C}{\v{C}} \DeclareUnicodeCharacter{010D}{\v{c}} \DeclareUnicodeCharacter{010E}{\v{D}} \DeclareUnicodeCharacter{0112}{\=E} \DeclareUnicodeCharacter{0113}{\=e} \DeclareUnicodeCharacter{0114}{\u{E}} \DeclareUnicodeCharacter{0115}{\u{e}} \DeclareUnicodeCharacter{0116}{\dotaccent{E}} \DeclareUnicodeCharacter{0117}{\dotaccent{e}} \DeclareUnicodeCharacter{011A}{\v{E}} \DeclareUnicodeCharacter{011B}{\v{e}} \DeclareUnicodeCharacter{011C}{\^G} \DeclareUnicodeCharacter{011D}{\^g} \DeclareUnicodeCharacter{011E}{\u{G}} \DeclareUnicodeCharacter{011F}{\u{g}} \DeclareUnicodeCharacter{0120}{\dotaccent{G}} \DeclareUnicodeCharacter{0121}{\dotaccent{g}} \DeclareUnicodeCharacter{0124}{\^H} \DeclareUnicodeCharacter{0125}{\^h} \DeclareUnicodeCharacter{0128}{\~I} \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} \DeclareUnicodeCharacter{012A}{\=I} \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} \DeclareUnicodeCharacter{012C}{\u{I}} \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} \DeclareUnicodeCharacter{0130}{\dotaccent{I}} \DeclareUnicodeCharacter{0131}{\dotless{i}} \DeclareUnicodeCharacter{0132}{IJ} \DeclareUnicodeCharacter{0133}{ij} \DeclareUnicodeCharacter{0134}{\^J} \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} \DeclareUnicodeCharacter{0139}{\'L} \DeclareUnicodeCharacter{013A}{\'l} \DeclareUnicodeCharacter{0141}{\L} \DeclareUnicodeCharacter{0142}{\l} \DeclareUnicodeCharacter{0143}{\'N} \DeclareUnicodeCharacter{0144}{\'n} \DeclareUnicodeCharacter{0147}{\v{N}} \DeclareUnicodeCharacter{0148}{\v{n}} \DeclareUnicodeCharacter{014C}{\=O} \DeclareUnicodeCharacter{014D}{\=o} \DeclareUnicodeCharacter{014E}{\u{O}} \DeclareUnicodeCharacter{014F}{\u{o}} \DeclareUnicodeCharacter{0150}{\H{O}} \DeclareUnicodeCharacter{0151}{\H{o}} \DeclareUnicodeCharacter{0152}{\OE} \DeclareUnicodeCharacter{0153}{\oe} \DeclareUnicodeCharacter{0154}{\'R} \DeclareUnicodeCharacter{0155}{\'r} \DeclareUnicodeCharacter{0158}{\v{R}} \DeclareUnicodeCharacter{0159}{\v{r}} \DeclareUnicodeCharacter{015A}{\'S} \DeclareUnicodeCharacter{015B}{\'s} \DeclareUnicodeCharacter{015C}{\^S} \DeclareUnicodeCharacter{015D}{\^s} \DeclareUnicodeCharacter{015E}{\cedilla{S}} \DeclareUnicodeCharacter{015F}{\cedilla{s}} \DeclareUnicodeCharacter{0160}{\v{S}} \DeclareUnicodeCharacter{0161}{\v{s}} \DeclareUnicodeCharacter{0162}{\cedilla{t}} \DeclareUnicodeCharacter{0163}{\cedilla{T}} \DeclareUnicodeCharacter{0164}{\v{T}} \DeclareUnicodeCharacter{0168}{\~U} \DeclareUnicodeCharacter{0169}{\~u} \DeclareUnicodeCharacter{016A}{\=U} \DeclareUnicodeCharacter{016B}{\=u} \DeclareUnicodeCharacter{016C}{\u{U}} \DeclareUnicodeCharacter{016D}{\u{u}} \DeclareUnicodeCharacter{016E}{\ringaccent{U}} \DeclareUnicodeCharacter{016F}{\ringaccent{u}} \DeclareUnicodeCharacter{0170}{\H{U}} \DeclareUnicodeCharacter{0171}{\H{u}} \DeclareUnicodeCharacter{0174}{\^W} \DeclareUnicodeCharacter{0175}{\^w} \DeclareUnicodeCharacter{0176}{\^Y} \DeclareUnicodeCharacter{0177}{\^y} \DeclareUnicodeCharacter{0178}{\"Y} \DeclareUnicodeCharacter{0179}{\'Z} \DeclareUnicodeCharacter{017A}{\'z} \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} \DeclareUnicodeCharacter{017C}{\dotaccent{z}} \DeclareUnicodeCharacter{017D}{\v{Z}} \DeclareUnicodeCharacter{017E}{\v{z}} \DeclareUnicodeCharacter{01C4}{D\v{Z}} \DeclareUnicodeCharacter{01C5}{D\v{z}} \DeclareUnicodeCharacter{01C6}{d\v{z}} \DeclareUnicodeCharacter{01C7}{LJ} \DeclareUnicodeCharacter{01C8}{Lj} \DeclareUnicodeCharacter{01C9}{lj} \DeclareUnicodeCharacter{01CA}{NJ} \DeclareUnicodeCharacter{01CB}{Nj} \DeclareUnicodeCharacter{01CC}{nj} \DeclareUnicodeCharacter{01CD}{\v{A}} \DeclareUnicodeCharacter{01CE}{\v{a}} \DeclareUnicodeCharacter{01CF}{\v{I}} \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} \DeclareUnicodeCharacter{01D1}{\v{O}} \DeclareUnicodeCharacter{01D2}{\v{o}} \DeclareUnicodeCharacter{01D3}{\v{U}} \DeclareUnicodeCharacter{01D4}{\v{u}} \DeclareUnicodeCharacter{01E2}{\={\AE}} \DeclareUnicodeCharacter{01E3}{\={\ae}} \DeclareUnicodeCharacter{01E6}{\v{G}} \DeclareUnicodeCharacter{01E7}{\v{g}} \DeclareUnicodeCharacter{01E8}{\v{K}} \DeclareUnicodeCharacter{01E9}{\v{k}} \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} \DeclareUnicodeCharacter{01F1}{DZ} \DeclareUnicodeCharacter{01F2}{Dz} \DeclareUnicodeCharacter{01F3}{dz} \DeclareUnicodeCharacter{01F4}{\'G} \DeclareUnicodeCharacter{01F5}{\'g} \DeclareUnicodeCharacter{01F8}{\`N} \DeclareUnicodeCharacter{01F9}{\`n} \DeclareUnicodeCharacter{01FC}{\'{\AE}} \DeclareUnicodeCharacter{01FD}{\'{\ae}} \DeclareUnicodeCharacter{01FE}{\'{\O}} \DeclareUnicodeCharacter{01FF}{\'{\o}} \DeclareUnicodeCharacter{021E}{\v{H}} \DeclareUnicodeCharacter{021F}{\v{h}} \DeclareUnicodeCharacter{0226}{\dotaccent{A}} \DeclareUnicodeCharacter{0227}{\dotaccent{a}} \DeclareUnicodeCharacter{0228}{\cedilla{E}} \DeclareUnicodeCharacter{0229}{\cedilla{e}} \DeclareUnicodeCharacter{022E}{\dotaccent{O}} \DeclareUnicodeCharacter{022F}{\dotaccent{o}} \DeclareUnicodeCharacter{0232}{\=Y} \DeclareUnicodeCharacter{0233}{\=y} \DeclareUnicodeCharacter{0237}{\dotless{j}} \DeclareUnicodeCharacter{02DB}{\ogonek{ }} \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} \DeclareUnicodeCharacter{1E20}{\=G} \DeclareUnicodeCharacter{1E21}{\=g} \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} \DeclareUnicodeCharacter{1E26}{\"H} \DeclareUnicodeCharacter{1E27}{\"h} \DeclareUnicodeCharacter{1E30}{\'K} \DeclareUnicodeCharacter{1E31}{\'k} \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} \DeclareUnicodeCharacter{1E3E}{\'M} \DeclareUnicodeCharacter{1E3F}{\'m} \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} \DeclareUnicodeCharacter{1E54}{\'P} \DeclareUnicodeCharacter{1E55}{\'p} \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} \DeclareUnicodeCharacter{1E7C}{\~V} \DeclareUnicodeCharacter{1E7D}{\~v} \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} \DeclareUnicodeCharacter{1E80}{\`W} \DeclareUnicodeCharacter{1E81}{\`w} \DeclareUnicodeCharacter{1E82}{\'W} \DeclareUnicodeCharacter{1E83}{\'w} \DeclareUnicodeCharacter{1E84}{\"W} \DeclareUnicodeCharacter{1E85}{\"w} \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} \DeclareUnicodeCharacter{1E8C}{\"X} \DeclareUnicodeCharacter{1E8D}{\"x} \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} \DeclareUnicodeCharacter{1E90}{\^Z} \DeclareUnicodeCharacter{1E91}{\^z} \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} \DeclareUnicodeCharacter{1E97}{\"t} \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} \DeclareUnicodeCharacter{1EBC}{\~E} \DeclareUnicodeCharacter{1EBD}{\~e} \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} \DeclareUnicodeCharacter{1EF2}{\`Y} \DeclareUnicodeCharacter{1EF3}{\`y} \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} \DeclareUnicodeCharacter{1EF8}{\~Y} \DeclareUnicodeCharacter{1EF9}{\~y} \DeclareUnicodeCharacter{2013}{--} \DeclareUnicodeCharacter{2014}{---} \DeclareUnicodeCharacter{2018}{\quoteleft} \DeclareUnicodeCharacter{2019}{\quoteright} \DeclareUnicodeCharacter{201A}{\quotesinglbase} \DeclareUnicodeCharacter{201C}{\quotedblleft} \DeclareUnicodeCharacter{201D}{\quotedblright} \DeclareUnicodeCharacter{201E}{\quotedblbase} \DeclareUnicodeCharacter{2022}{\bullet} \DeclareUnicodeCharacter{2026}{\dots} \DeclareUnicodeCharacter{2039}{\guilsinglleft} \DeclareUnicodeCharacter{203A}{\guilsinglright} \DeclareUnicodeCharacter{20AC}{\euro} \DeclareUnicodeCharacter{2192}{\expansion} \DeclareUnicodeCharacter{21D2}{\result} \DeclareUnicodeCharacter{2212}{\minus} \DeclareUnicodeCharacter{2217}{\point} \DeclareUnicodeCharacter{2261}{\equiv} }% end of \utfeightchardefs % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Make non-ASCII characters printable again for compatibility with % existing Texinfo documents that may use them, even without declaring a % document encoding. % \setnonasciicharscatcode \other \message{formatting,} \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be very finicky about underfull hboxes, either. \hbadness = 6666 % Following George Bush, get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % Parameters in order: 1) textheight; 2) textwidth; % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; % 7) physical page height; 8) physical page width. % % We also call \setleading{\textleading}, so the caller should define % \textleading. The caller should also set \parskip. % \def\internalpagesizes#1#2#3#4#5#6#7#8{% \voffset = #3\relax \topskip = #6\relax \splittopskip = \topskip % \vsize = #1\relax \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \pageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \pagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax % if we don't reset these, they will remain at "1 true in" of % whatever layout pdftex was dumped with. \pdfhorigin = 1 true in \pdfvorigin = 1 true in \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @letterpaper (the default). \def\letterpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % If page is nothing but text, make it come out even. \internalpagesizes{607.2pt}{6in}% that's 46 lines {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {-.2in}{0in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @smallerbook to reset parameters for 6x9 trim size. % (Just testing, parameters still in flux.) \def\smallerbook{{\globaldefs = 1 \parskip = 1.5pt plus 1pt \textleading = 12pt % \internalpagesizes{7.4in}{4.8in}% {-.2in}{-.4in}% {0pt}{14pt}% {9in}{6in}% % \lispnarrowing = 0.25in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .4cm }} % Use @afourpaper to print on European A4 paper. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % Double-side printing via postscript on Laserjet 4050 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. % To change the settings for a different printer or situation, adjust % \normaloffset until the front-side and back-side texts align. Then % do the same for \bindingoffset. You can set these for testing in % your texinfo source file like this: % @tex % \global\normaloffset = -6mm % \global\bindingoffset = 10mm % @end tex \internalpagesizes{673.2pt}{160mm}% that's 51 lines {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \hfuzz = 1.2pt \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \internalpagesizes{237mm}{150mm}% {\voffset}{4.6mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% % % Must explicitly reset to 0 because we call \afourpaper. \globaldefs = 0 }} % Use @afourwide to print on A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \internalpagesizes{241mm}{165mm}% {\voffset}{-2.95mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% \globaldefs = 0 }} % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1\relax \advance\dimen0 by \voffset % \dimen2 = \hsize \advance\dimen2 by \normaloffset % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper \message{and turning on texinfo input format.} \def^^L{\par} % remove \outer, so ^L can appear in an @comment % DEL is a comment character, in case @c does not suffice. \catcode`\^^? = 14 % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \def\normaldoublequote{"} \catcode`\$=\other \def\normaldollar{$}%$ font-lock fix \catcode`\+=\other \def\normalplus{+} \catcode`\<=\other \def\normalless{<} \catcode`\>=\other \def\normalgreater{>} \catcode`\^=\other \def\normalcaret{^} \catcode`\_=\other \def\normalunderscore{_} \catcode`\|=\other \def\normalverticalbar{|} \catcode`\~=\other \def\normaltilde{~} % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def~{{\tt\char126}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \let\realunder=_ % Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have \everyjob (or @setfilename) turn them on. % \otherifyactive is called near the end of this file. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ \global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work % \realbackslash is an actual character `\' with catcode other, and % \doublebackslash is two of them (for the pdf outlines). {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} % In texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active % @ for escape char from now on. % The story here is that in math mode, the \char of \backslashcurfont % ends up printing the roman \ from the math symbol font (because \char % in math mode uses the \mathcode, and plain.tex sets % \mathcode`\\="026E). It seems better for @backslashchar{} to always % print a typewriter backslash, hence we use an explicit \mathchar, % which is the decimal equivalent of "715c (class 7, e.g., use \fam; % ignored family value; char position "5C). We can't use " for the % usual hex value because it has already been made active. @def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} @let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. % On startup, @fixbackslash assigns: % @let \ = @normalbackslash % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. We switch back and forth between these. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. Also revert - to its normal character, in % case the active - from code has slipped in. % {@catcode`- = @active @gdef@normalturnoffactive{% @let-=@normaldash @let"=@normaldoublequote @let$=@normaldollar %$ font-lock fix @let+=@normalplus @let<=@normalless @let>=@normalgreater @let\=@normalbackslash @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let~=@normaltilde @markupsetuplqdefault @markupsetuprqdefault @unsepspaces } } % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @otherifyactive % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\' in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{% @ifx\@eatinput @let\ = @normalbackslash @fi @catcode`+=@active @catcode`@_=@active } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These (along with & and #) are made active for url-breaking, so need % active definitions as the normal characters. @def@normaldot{.} @def@normalquest{?} @def@normalslash{/} % These look ok in all fonts, so just make them not special. % @hashchar{} gets its own user-level command, because of #line. @catcode`@& = @other @def@normalamp{&} @catcode`@# = @other @def@normalhash{#} @catcode`@% = @other @def@normalpercent{%} @let @hashchar = @normalhash @c Finally, make ` and ' active, so that txicodequoteundirected and @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we @c don't make ` and ' active, @code will not get them as active chars. @c Do this last of all since we use ` in the previous @catcode assignments. @catcode`@'=@active @catcode`@`=@active @markupsetuplqdefault @markupsetuprqdefault @c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @ignore arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 @end ignore geomview-1.9.5/doc/README0000644000175000017500000000207512310110175011711 00000000000000This directory contains the Geomview manual and various other pieces of documentation. geomview.pdf Manual in PDF format. geomview.html/ Manual in HTML format. geomview Manual in GNU info format. geomview-* geomview.texi Texinfo source code for manual. example1.c Example external modules; these are mentioned example3.c in the manual; they're included here so you example2.c don't have to type them in if you want to play example4.tcl with them. oogltour A gentle introduction to the OOGL file format (OOGL is the data file format that Geomview understands). newsletter_article.txt An article that appeared in an issue of the Geometry Center newsletter announcing the first release of Geomview, in January of 1992. figs/ This directory contains Postscript versions of all the images in the manual; it's only used in creating the pdf version of the manual. It isn't relevant if all you're doing is reading the manual. *.{1,3,5*} Various man pages, possibly out-of-date. The Geomview manual contains the same information as these, but is more current. geomview-1.9.5/doc/geomview.texi0000644000175000017500000135450212310110176013555 00000000000000%%% -*-texinfo-*- \tolerance=2000 \input texinfo @c @letterpaper @setfilename geomview @settitle Geomview Manual @include version.texi @dircategory Graphics Applications @direntry * Geomview: (geomview). The interactive 3D viewing program. @end direntry @c @titlepage @sp 1 @center @titlefont{Geomview Manual} @sp 4 @center Geomview Version @value{VERSION} @sp 1 @center for Unix @sp 1 @center @value{UPDATED-MONTH} @comment November 19, 2000 @sp 2 @center Mark Phillips et al. @sp 4 @vskip 0pt plus 1filll @center Copyright @copyright{} 1992-1998 The Geometry Center @center Copyright @copyright{} 1998-2006 Stuart Levy, Tamara Munzner, Mark Phillips @center Copyright @copyright{} 2006-2007 Claus-Justus Heine @end titlepage @page @node Top, Intro, (dir), (dir) Geomview, the interactive 3D viewing program. @menu * Intro:: Introduction to Geomview. * Distrib:: How to get the latest Geomview distribution. * Copying:: The GNU Lesser Public License. * History:: History of Geomview's Development. * Platforms:: Supported Platforms. * Pronunciation:: How to Pronounce ``Geomview''. * Overview:: Overview of Geomview. * Tutorial:: Introductory Tutorial. * Interaction:: Interacting with Geomview. * OOGL File Formats:: Formats for Geometry Input. * Customization:: Modifying the behavior of Geomview. * Modules:: Programs that use Geomview for graphics display. * GCL:: GCL: the Geomview Command Language. * Non-Euclidean Geometry:: Non-Euclidean Geometry. * Mathematica:: Mathematica Graphics in Geomview or RenderMan. * Installation:: Installing Geomview on your computer. * Support:: Getting Technical Support for Geomview. * Contributing:: How to contribute to Geomview. * Function Index:: A node for each GCL function. * List of Figures:: List of Figures. @end menu @node Intro, Distrib, Top, Top @unnumbered Introduction to Geomview Geomview is an interactive program for viewing and manipulating geometric objects, originally written by staff members of the Geometry Center at the University of Minnesota, starting in 1991. It can be used as a stand-alone viewer for static objects or as a display engine for other programs which produce dynamically changing geometry. It runs on many kinds of Unix computers, including Linux, SGI, Sun, and HP. It also runs with Cygwin. This manual describes Geomview version 1.9. @refill Geomview is free software, available under the terms of the GNU Lesser Public License; @pxref{Copying} for details. Geomview and this manual are available for download from @uref{http://www.geomview.org}. Permission is granted to make copies of this manual. If you have questions or comments about Geomview or this manual, consider joining in the @file{geomview-users} mailing list, which is a forum in which users of Geomview communicate to answer each others' questions and to share news about what they are doing with Geomview. The Geomview authors participate in this list and sometimes post answers to questions there. To join the list, visit the list web page at @uref{http://lists.sourceforge.net/mailman/listinfo/geomview-users}. @node Distrib, Copying, Intro, Top @unnumbered Distribution Geomview is @dfn{free software}; this means that everyone is free to use it and free to redistribute it on certain conditions. Geomview is not in the public domain; it is copyrighted and there are restrictions on its distribution, but these restrictions are designed to permit everything that a good cooperating citizen would want to do. What is not allowed is to try to prevent others from further sharing any version of Geomview that they might get from you. The precise conditions are found in the GNU Lesser Public License that comes with Geomview and also appears following this section. One way to get a copy of Geomview is from someone else who has it. You need not ask for our permission to do so, or tell any one else; just copy it. If you have access to the Internet, you can get the latest distribution version of Geomview at @uref{http://www.geomview.org}. You may also receive Geomview when you buy a computer. Computer manufacturers are free to distribute copies on the same terms that apply to everyone else. These terms require them to give you the full sources, including whatever changes they may have made, and to permit you to redistribute the Geomview received from them under the usual terms of the General Public License. In other words, the program must be free for you when you get it, not just free for the manufacturer. @node Copying, History, Distrib, Top @unnumbered Copying @c cH: in my opinion the following paragraph is complete nonsense; programs @c which simply communicate with other programs by means of streams @c cannot inherit the restriction imposed by the GPL @smallexample NOTE: Geomview is distributed under the GNU LESSER GENERAL PUBLIC LICENSE. For the purposes of this license we think of Geomview as if it were a "library", and of Geomview external modules as "programs that link with the library". We do this because we specifically want to allow proprietary programs and modules to use Geomview. @end smallexample @unnumbered GNU LESSER PUBLIC LICENSE @center Version 2.1, February 1999 @display Copyright @copyright{} 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] @end display @unnumberedsec Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. @unnumberedsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @enumerate 0 @item This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. @item You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. @item You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: @enumerate a @item The modified work must itself be a software library. @item You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. @item You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. @item If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) @end enumerate These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. @item You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. ^L Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. @item You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. @item A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. @item As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: @enumerate a @item Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) @item Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. @item Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. @item If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. @item Verify that the user has already received a copy of these materials or that you have already sent this user a copy. @end enumerate For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. @item You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: @enumerate a @item Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. @item Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. @end enumerate @item You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. @item You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. @item Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. @item If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. @item If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. @item The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. @item If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. @b{NO WARRANTY} @item BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. @item IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. @end enumerate @b{END OF TERMS AND CONDITIONS} @page @unnumberedsec How to Apply These Terms to Your New Programs If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. @smallexample @var{one line to give the library's name and a brief idea of what it does.} Copyright (C) @var{name of author} This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA @end smallexample Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: @smallexample Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice @end smallexample That's all there is to it! @node History, Platforms, Copying, Top @unnumbered History of Geomview's Development Geomview was originally written at the Geometry Center at the University of Minnesota in Minneapolis. The Geometry Center was a research and education center funded by the National Science Foundation, with a mission to promote research and communication of mathematics. Much of the work there involved the use of computers to help visualize mathematical concepts. The project that eventually led to Geomview began in the summer of 1988 with the work of Pat Hanrahan on a viewing program called MinneView. Shortly thereafter Charlie Gunn begin developing OOGL (Object Oriented Graphics Language) in conjunction with MinneView. Many people contributed to OOGL and MinneView, including Stuart Levy, Mark Meuer, Tamara Munzner, Steve Anderson, Mario Lopez, Todd Kaplan. In 1991 the staff of the Geometry Center began work on a new improved version of OOGL, and a new and improved viewing program, which they called Geomview. At that time essentially the only game in town for interactive 3D graphics was Silicon Graphics (SGI), so Geomview was developed initially on SGI workstations, using IRIS GL. The first version was finished in January of 1992. It immediately became very popular among visitors to the Geometry Center, and through the Center's ftp archive (this was before the web) people at other institutions began using it too. In addition to SGI workstations the Geometry Center had quite a few NeXT stations, so soon after Geomview was running on SGIs the staff developed a version for NeXTStep as well. By this time there were several thousand people using it around the world. A few years later the staff ported Geomview to X windows and OpenGL, and eventually, with the demise of NeXT, the NeXT version fell by the wayside. In its mission to foster communication among researchers and educators, the Geometry Center developed a web site, www.geom.umn.edu, in late 1993. It was one of the first 300 web sites in existence. A part of the web site was of course devoted to Geomview, and helped to spread the word about its existence. The Geometry Center closed its "brick and mortar" facilities in August of 1998 (NSF cut its funding), but the web site continued to exist, and Geomview continued to be very popular around the world. In December of 1999 some of the former Geometry Center staff set up @uref{http://www.geomview.org} as a permanent home on the web for Geomview. Geomview's original authors, as well as a number of other volunteers around the world, are still actively involved in using and developing Geomview. @menu * Authors:: Authors. @end menu @node Authors, , History, History @unnumberedsec Authors Tamara Munzner, Stuart Levy, and Mark Phillips are the original authors of Geomview. Celeste Fowler, Charlie Gunn, and Nathaniel Thurston also made significant contributions. Daniel Krech and Scott Wisdom did the NeXTStep and RenderMan port, and Daeron Meyer and Tim Rowley did the port to X windows. Many other Geometry Center staff members, as well as several people elsewhere, also contributed. Mark Phillips wrote this manual, with substantial help from Stuart Levy and Tamara Munzner. Countless Geomview users have also been of great help by reading it and pointing out mistakes. @node Platforms, Pronunciation, History, Top @unnumbered Supported Platforms Geomview 1.9 should -- in principle -- compile and run on any fairly recent Unix-like operating system. Specifically, it runs on Linux and on Cygwin (Cygwin emulates a SystemV Unix-like environment under Microsoft Windows). Unluckily Geomview compiles with MacOS X (Darwin), but seemingly communicating with Geomview by means of pipes and sockets cause segmentation faults. Feel free to fix that! @xref{Contributing}, for details. @c Geomview runs on a wide variety of Unix systems. It has been tested on @c each of the following systems: Linux, FreeBSD, SGI, Sun either (Sun-OS @c 4.1.x and Solaris), HP RISC, Dec Alpha, RS/6000, and NeXT. Precompiled @c distributions are available for all of these systems. Using either @c OpenGL or the generic X11 renderer it can probably be compiled on other @c Unix systems as well. @c There is not a version of Geomview for Microsoft Windows. The main @c reason for this is that at the time when Geomview was written, personal @c computers were not fast enough to make interactive 3D graphics feasible, @c and by the time fast-enough PCs came around, the Geometry Center, @c where Geomview was developed, was in the process of being closed. The @c staff started work on a port to Windows but was not able to finish it @c before the Center shut down. @c If you would like to see a version of Geomview for Windows, @c you can contribute to its development in several ways. @c @xref{Contributing}, for details. @c There is also no version of Geomview for Macintosh. @node Pronunciation, Overview, Platforms, Top @unnumbered How to Pronounce ``Geomview`` The word 'Geomview' is a combination of the first syllable of the word 'geometry', and the word 'view'. The authors pronounce it with the accent on the first syllable @display GE-om-view @end display Some people put the accent on the second syllable, where it falls in the word 'geometry', but the original authors, who invented the name, prefer the accent-on-first-syllable pronunciation. @comment @comment @node node-name, next, previous, up @comment @comment **************************************************************** @node Overview, Tutorial, Pronunciation, Top @chapter Overview Geomview's main purpose is to display objects whose geometry is given, allowing interactive control over details such as point of view, speed of movement, appearance of surfaces and lines, and so on. Geomview can handle any number of objects and allows both separate and collective control over them. The simplest way to use Geomview is as a stand-alone viewer to see and manipulate objects. It can display objects described in a variety of file formats. It comes with a wide variety of example objects, and you can create your own objects. You can also use Geomview to handle the display of data coming from another program that is running simultaneously. As the other program changes the data, the Geomview image reflects the changes. Programs that generate objects and use Geomview to display them are called @emph{external modules}. External modules can control almost all aspects of Geomview. The idea here is that many aspects of the display and interaction parts of geometry software are independent of the geometric content and can be collected together in a single piece of software that can be used in a wide variety of situations. The author of the external module can then concentrate on implementing the desired algorithms and leave the display aspects to Geomview. Geomview comes with a collection of sample external modules, and this manual describes how to write your own. Geomview is the product of an effort at the Geometry Center to provide interactive geometry software that is particularly appropriate for mathematics research and education. In particular, Geomview can display things in hyperbolic and spherical space as well as Euclidean space. Geomview allows multiple independently controllable objects and cameras. It provides interactive control for motion, appearances (including lighting, shading, and materials), picking on an object, edge or vertex level, snapshots in SGI image file or Renderman RIB format, and adding or deleting objects is provided through direct mouse manipulation, control panels, and keyboard shortcuts. Geomview supports the following simple data types: polyhedra with shared vertices (.off), quadrilaterals, rectangular meshes, vectors, and Bezier surface patches of arbitrary degree including rational patches. Object hierarchies can be constructed with lists of objects and instances of object(s) transformed by one or many 4x4 matrices. Arbitrary portions of changing hierarchies may be transmitted by creating named references. Geomview can display 3-D graphics output from Mathematica and Maple. @comment **************************************************************** @node Tutorial, Interaction, Overview, Top @chapter Tutorial This chapter leads you through some of the basics of using Geomview. Work through this chapter in front of a computer where you can try out the examples given here to get a feel for what you can do with Geomview. To start Geomview, login to the computer and get a shell window. A shell window is a window in which you can type Unix commands; the prompt in the window usually ends with a '%'. In the shell window (the mouse cursor must be in the window) type the following (@kbd{@key{Enter}} here means hit the "Enter" key): @example geomview tetra dodec @key{Enter} @end example This command starts up Geomview and loads two example objects, a tetrahedron and a dodecahedron. After a few seconds three windows should appear; @pxref{figinitial, Figure}. @float Figure,figinitial @image{figs/initial} @caption{Initial Geomview display.} @end float The panel on the left is Geomview's main control panel; it's called the @emph{Main} panel. The skinny panel in the middle is the @emph{Tools} panel and is for selecting different kinds of motions. The window on the right is the camera window and in it you see a large tetrahedron and a dodecahedron which is partially obscured by the tetrahedron. Geomview has lots of panels but by default it displays only these three. We'll describe some aspects of these and a couple of the others in this tutorial. You can read more about these and other panels in the later chapters of this manual. Put the mouse cursor in the camera window and press down and hold the left mouse button. Now, while holding down the button, slowly move the mouse around. You should see the picture rotate in the direction you move the mouse. If you lift up on the mouse button while moving the mouse, the picture continues rotating. To stop it, hold the mouse very still and click down and up on the left mouse button. Geomview uses the @emph{glass sphere} model for mouse-based motion. This means you are supposed to think of the object as being inside an invisible sphere and the mouse cursor is a gripper outside the sphere. When you hold down the left mouse button, the gripper grabs the sphere; when you let go of the button, the gripper releases the sphere. Moving the mouse while holding the button down causes the sphere (and hence the object) to move in the same direction as the mouse. In addition to the two solids you should also see two wire-frame boxes in the camera window. These are the "bounding boxes" of the two objects. By default Geomview puts a bounding box around each object that it displays so that you have an idea of how large it is. Notice that as you move the mouse around the tetrahedron and dodecahedron move as a unit. That is because by default what you are actually moving is the "World". To move an individual object instead of the whole world, move the mouse cursor to the @emph{Targets} browser in the @emph{Main} panel. Click (any button) on the word @emph{tetra}. This makes the tetrahedron be the "target object". Now move the cursor back to the camera window and you can rotate just the tetrahedron. The motion that you have been applying up to now has been rotation, because that is the motion mode that is selected in the @emph{Tools} panel. To translate instead, click on the @emph{Translate} button. Now when you move the mouse in the camera window while holding down the left button, the tetrahedron (which should still be the target object from before) will translate in the direction you move the mouse. Notice that you can translate it beyond the edge of the window as long as you keep holding the left mouse button down. If you lift up on the mouse button while moving the mouse, the tetrahedron will keep going. It moves rather rapidly so it is very easy to lose track of where it is. If you accidentally lose the tetrahedron by translating it too far out of the view of the window, you can get it back by clicking on the @emph{Center} button in the @emph{Tools} panel. This causes it to come back to its initial position. Click on the @emph{Center} button to bring the tetrahedron home, and then translate it off to one side so that you can completely see the dodecahedron. Your world now has two objects in it that are beside each other. You should see the dodecahedron in the middle of the window and maybe part of the tetrahedron off to one side. Go back to the @emph{Targets} browser in the @emph{Main} panel and click on "World" to select the whole world again. Now click on the @emph{Look At} button in the @emph{Tools} panel. You should see the dodecahedron and the tetrahedron in the middle of the window next to each other (@pxref{figlookatworld, Figure}). The @emph{Look At} button positions the camera in such a way that the target object is centered in the window. @float Figure,figlookatworld @image{figs/fig2} @caption{Looking at the world.} @end float Now put the cursor over the middle of the dodecahedron and double-click the right mouse button. This means click it down-and-up two times in rapid succession. Notice that the dodecahedron becomes the target object; you can see this in the @emph{Targets} browser in the @emph{Main} panel. Double-clicking the right mouse button on an object is another way to make it the target object. @float Figure,figappearance @image{figs/ap} @caption{The Appearance Panel.} @end float Go to the @emph{Inspect} menu at the top of the @emph{Main} panel and select @emph{Appearance}. This brings up the @emph{Appearance} panel. When it appears, if it partially obscures another Geomview window you can move it off to one side by dragging its frame with the middle mouse button down. The @emph{Appearance} panel lets you control various things about the way Geomview draws objects. Note the buttons labeled @emph{[af] Faces} and @emph{[ae] Edges}. Click on the @emph{[ae] Edges} one, and notice that Geomview is now drawing the edges of the dodecahedron. Click on it again and the edges go away. Click several times and watch the edges come and go. When you've had enough of this, leave the edges on and click the @emph{[af] Faces} button. This toggles the faces on and off. Click the button again to turn them back on. Now click on the @emph{[Cf] Faces} button under the word @emph{COLOR}. A color chooser panel should appear (@pxref{figcolorchooser, Figure}). @float Figure,figcolorchooser @image{figs/color} @caption{Color Chooser Panel.} @end float @ifset forms Put the cursor in the color hexagon in this panel and hold down the left mouse button. Slowly move the mouse around. This drags the little black point around to choose a new color for the dodecahedron. @end ifset @ifclear forms Note the three sliders, @emph{H}, @emph{S}, and @emph{V}, controlling the color's hue, saturation, and value (lightness). Clicking the @emph{HSV} button gives a different set of sliders, one each for red, green, and blue. Numerical values for both RGB and HSV color systems can be seen or edited at the bottom of the panel. @end ifclear The dodecahedron's previous colors were specified in the file @file{dodec} that you loaded when we started Geomview. The color that you specify with the color panel overrides the old colors. You can adjust the intensity of the color with the @emph{Intensity} slider. When you find a color that you like, click the @emph{Done} button. Now put the cursor somewhere over the gray background and double-click the right mouse button; this picks "World" as the target object. Click the @emph{Look At} button to look at the world again. Notice that in the @emph{Appearance} panel the settings of the buttons have changed from the way you left them with the dodecahedron. That's because the @emph{Appearance} panel always displays the settings for the target object, which is now the world, which still has its default settings. Click on the @emph{[ab] BBox} button under the word @emph{Draw}. The bounding boxes go away. Now put the cursor back in the camera window. At the keyboard, type the keys @kbd{a }b. Notice that the bounding boxes come back. @kbd{a }b is the keyboard shortcut for the bounding box toggle button; the string "[ab]" appears on the button to indicate this. Most of Geomview's buttons have keyboard shortcuts that you can use instead if you want. This is useful once you are familiar with Geomview and don't want to have to move around among lots of panels. Now select the tetrahedron, either by double-clicking the right mouse button on it, or by selecting "tetra" in the @emph{Targets} browser. Then click on the @emph{Delete} button in the @emph{Main} panel. The tetrahedron should disappear. This is how you get rid of an object. You can also load objects from within Geomview. Click on the @emph{File} menu in the @emph{Main} panel and choose @emph{Open}. The @emph{Files} panel will appear. @c Below the middle of this panel is a browser with three lines in it; the second line is a directory with lots of Geomview example files in it. Click on that second line; @pxref{figfilespanel, Figure}. Scroll down in the list of files until you see @file{tref.off}. Click on that line, and then click on the @emph{OK} button. A large trefoil-shaped tube will appear in your window. Click the @emph{Hide} button in the @emph{Files} panel to dismiss the panel. @float Figure,figfilespanel @image{figs/secondlinelist} @caption{The Files Panel.} @end float Now click on the @emph{Reset} button in the @emph{Tools} panel. This causes everything to return to its home position. You should see a dodecahedron and a trefoil knot (@pxref{figtrefdodec, Figure}). Play around with the trefoil knot and the dodecahedron. Experiment with some of the other buttons in the @emph{Tools} panel. Try coloring the trefoil knot with the @emph{Appearance} panel. For a tutorial on how to create your own objects to load into Geomview, see file @file{doc/oogltour} distributed with Geomview. The things in that file will be incorporated into a future version of this manual. @float Figure,figtrefdodec @image{figs/trefdodecinter} @caption{Trefoil and Dodecahedron.} @end float @comment **************************************************************** @node Interaction, OOGL File Formats, Tutorial, Top @chapter Interaction This chapter describes how you interact with Geomview through the mouse and keyboard. @menu * Starting Geomview:: Starting Geomview. * Command Line Options:: Command Line Options. * Basic Interaction:: Basic Interaction: The Main Panel. * Loading:: Loading Objects Into Geomview. * Mouse Motions:: Using the Mouse to Manipulate Objects. * Appearance:: Changing the Way Things Look. * Cameras:: Cameras. * Saving:: Saving your work. * Commands:: The Commands Panel. * Keyboard Shortcuts:: Keyboard Shortcuts. @end menu @comment ================================================================ @node Starting Geomview, Command Line Options, Interaction, Interaction @section Starting Geomview The usual way to start Geomview is to type @kbd{geomview @key{Enter}} in a shell window (@key{Enter} means hit the "Enter" key). It may take Geomview a few seconds to start up; one or more windows will appear and you can begin interacting with Geomview immediately. It is also possible to specify actions for Geomview to perform at startup time by giving arguments in the shell command line. @xref{Command Line Options}. @comment ================================================================ @node Command Line Options, Basic Interaction, Starting Geomview, Interaction @section Command Line Options Here are the command line options that Geomview allows: @table @samp @item -b @var{r} @var{g} @var{}b Set the window background color to the given @var{r} @var{g} @var{}b values. @item -c @var{file} Interpret the GCL commands in @var{file}, which may be the special symbol @file{-} for standard input. For a description of GCL, @xref{GCL}. @item -c @var{command} Commands may also be supplied literally, as in @example -c "(ui-panel main off)" @end example Since @var{command} includes parentheses, which have special meaning to the shell, @var{command} must be quoted. Multiple @var{-c} options are allowed. @item -wins @var{nwins} Causes Geomview to initially display @var{nwins} camera windows. @item -wpos @var{width},@var{height}[@@@var{xmin},@var{ymin}] Specifies the initial location and size of the first camera window. The values for @var{width}, @var{height}, @var{xmin}, and @var{ymin} are in screen (pixel) coordinates. @item -M[cg][ps[un|in|in6]] @var{PIPENAME}|@var{TCPPORT} The @samp{-M} option accepts modifiers: a @samp{g} suffix expects geometry data (the default), while a @samp{c} suffix expects GCL commands. A @samp{p} implies the connection should use a named pipe (the default on everything except on the NeXT), while @samp{s} implies using a UNIX-domain socket (the default on the NeXT). Since version 1.9 of Geomview Internet domain sockets are also supported; use @samp{sin} to make Geomview listen on the IPv4 port given by @var{TCPPORT}, or use @samp{sin6} to make Geomview listen on an IPv6 port (also as specified by @var{TCPPORT}). @samp{sun} is a synonym for @samp{s}, i.e. use the Unix domain socket with the name @var{PIPENAME}. If @var{PIPENAME} starts with a slash ('/'), then it is assumed to be an absolute pathname, otherwise the named pipe or socket is created below @file{$@{TMPDIR@}/geomview/}. @b{Listening to command streams on TCP ports can be a security risk, as Geomview itself does not take any security precautions, it simply executes all commands fed to it through the network socket. This also implies that disk-io can be initiated remotely.} Examples: @table @code @item -M @var{objectname} Display (possibly dynamically changing) geometry sent from the programs @code{geomstuff} or @code{togeomview}. This actually listens to the named pipe @file{/tmp/geomview/objectname}; you can achieve the same effect with the shell commands: @example mkdir /tmp/geomview mknod /tmp/geomview/objectname p @end example (assuming the directory and named pipe don't already exist), then executing the GCL command: @example (geometry objectname < /tmp/geomview/objectname) @end example (@pxref{geometry,@code{(geometry @dots{})}}) @item -Mc @var{pipename} Like @samp{-M} above, but expects GCL commands, rather than OOGL geometry data, on the connection. @item -Mcs fred Read commands from the UNIX-domain socket named. @file{/tmp/geomview/fred} @item -Mcsin 40000 Read commands from the IPv4 port @samp{40000}. Geomview itself does not take any security precautions, so this can be a security risk. @end table @item -noopengl Disable the use of OpenGL for (possibly) hardware accelerated rendering, even if the Geomview binary has support for OpenGL compiled in. This also disables the support for transparency and textures in the camera windows. RenderMan snapshots still will have correct transparency and some limited texture support. @item -nopanels Start up displaying no panels, only graphics windows. Panels may be invoked later as usual with the @kbd{Px} keyboard shortcuts or with the @code{ui-panel} command. @xref{ui-panel, @code{(ui-panel @dots{})}}. @item -noinit Read no initialization files. By default, geomview reads the system-wide @file{.geomview} file, followed by those in @file{$@{HOME@}/.geomview} and @file{./.geomview}. @item -e @var{module} Start an external module; @var{module} is the name associated with the module, appearing in the main panel's Applications browser, as defined by the @code{emodule-define} command. @xref{emodule-define, @code{(emodule-define @dots{})}}. @item -start @var{module} @var{args} @dots{} Like -e but allows you to pass arguments to the external module. "--" signals the end of the argument list; the "--" may be omitted if it would be the last argument on the Geomview command line. @item -run @var{shell-command} @var{args} @dots{} Like -start but takes the pathname of executable of the external module instead of the module's name. The pathnames of all known module directories are appended to the UNIX search path when invoking @var{shell-command}. @end table @comment ================================================================ @node Basic Interaction, Loading, Command Line Options, Interaction @section Basic Interaction: The Main Panel Normally when you invoke Geomview, three windows appear: the @emph{Main} panel, the @emph{Tools} panel, and one camera window. Geomview has many other windows but most things can be done with these three and so by default the others do not appear. This section of the manual introduces some basic concepts that are used throughout the rest of the manual and describes the @emph{Main} panel. @c @float Figure,figmainpanel @image{figs/main} @caption{The Main Panel} @end float @c Geomview can display an arbitrary number of objects simultaneously. The @emph{Targets} browser in the @emph{Main} panel displays a list of all the objects that Geomview currently knows about. This browser has a line for each object that you have loaded, plus some lines for other objects. One of the other objects is called @code{World} and corresponds to the all the currently loaded objects, treated as if they were one object. Most of the operations that you can do to one object, such as applying a motion or changing a color, can also be done to the "World" object. The @emph{Targets} browser also has an entry for each camera. By default there is only one camera; it is possible to add more of them via the @emph{New Camera} entry of the @emph{Main} panel's @emph{File} menu. Geomview treats cameras in much the same way as it does geometric objects. For example, you can move cameras around and add them and delete them just as with geometric objects. Cameras do not usually show up in the display as an object that you see. Each camera has a separate camera window which displays the view as seen by that camera. (It is possible for each camera to display a geometric representation of other cameras. @xref{Cameras}.) Because Geomview treats cameras and geometric objects very similarly, the term @dfn{object} in this documentation is used to refer to either one. When we need to distinguish between the two kinds of objects, we use the term @dfn{geom} to denote a geometric object and the word @dfn{camera} to denote a camera. The object which is selected (highlighted) in the @emph{Targets} browser is called the @dfn{target} object. This is the object that receives any actions that you do with the mouse or keyboard. You can change the target object by selecting a different line in the @emph{Targets} browser. Another way to change the target object is to put the mouse cursor directly over a geometry in a camera window and rapidly double-click the right mouse button. This process is called @dfn{picking}; the picked object becomes the new target. Geomview objects are all known by two names, both of which are shown in the @emph{Targets} browser. The first name given there, which appears in square brackets ([ ]), is a short name assigned by Geomview when you load the object. It consists of the letter `g' for geometries and `c' for cameras, followed by a number. The second name is a longer more descriptive name; by default this is the name of the file that the object was loaded from. The two names are equivalent as far as Geomview is concerned; at any point where you need to specify a name you can give either one. To manipulate an object, make sure you that the object you want to move is the target object, and put the mouse cursor in a camera window. Motions are applied by holding down either the left or middle mouse button and moving the mouse. There are several different motion "modes", each for applying a different kind of motion. The @emph{MOTION MODE} browser in the @emph{Main} panel indicates the current motion mode. The default is "Rotate". You can change the current motion mode by selecting a new one in the @emph{MOTION MODE} browser, or by using the @emph{Tools} panel. For more information about motion modes, @xref{Mouse Motions}. The @emph{Modules} browser lists Geomview external modules. An external module is a separate program that interacts with Geomview to extend its functionality. For information on external modules, @xref{Modules}. @ifset forms The @emph{Load} button on the @emph{Main} panel brings up the @emph{Files} panel for loading a file. The file can contain either a geom, a camera, or GCL commands. For details, @xref{Loading}. The @emph{Delete} button causes the target object to be deleted. Geomview selects another object to be the new target. You can delete cameras as well as geometries in this way. If you hit the @emph{Delete} button while the target object is "World", Geomview deletes all geometries. The three buttons at the bottom of the @emph{Main} panel, labeled @emph{Euclidean}, @emph{Hyperbolic}, and @emph{Spherical}, allow you to change the geometry of the space that Geomview displays. By default @emph{Euclidean} is selected. For details about using @emph{Hyperbolic} and @emph{Spherical} spaces, @xref{Non-Euclidean Geometry}. @end ifset @ifclear forms The menu bar at the top of the main panel offers menus for common operations. To create new windows, load new objects, save objects or other information, or quit from geomview, see the @emph{File} menu. To copy or delete objects, see the @emph{Edit} menu. You can invoke any panel from the @emph{Inspect} menu. The @emph{Space} menu lets you choose whether geomview operates in Euclidean, Hyperbolic, or Spherical mode. Euclidean mode is selected by default. For details about using @emph{Hyperbolic} and @emph{Spherical} spaces, @xref{Non-Euclidean Geometry}. @end ifclear Most actions that you can do through Geomview's panels have equivalent keyboard shortcuts so that you can do the same action by typing a sequence of keys on the keyboard. This is useful for advanced users who are familiar with Geomview's capabilities and want to work quickly without having to have lots of panels cluttering up the screen. Keyboard shortcuts are usually indicated in square brackets ([ ]) near the corresponding item in a panel. For example, the keyboard shortcut for @emph{Rotate} mode is 'r'; this is indicated by "[r]" appearing before the word "Rotate" in the @emph{MOTION MODE} browser. To use this keyboard shortcut, just hit the @kbd{r} key while the mouse cursor is in any Geomview window. Do not hit the @kbd{@key{Enter}} key afterwards. Some keyboard shortcuts consist of more than one key. In these cases just type the keys one after the other, with no @kbd{@key{Enter}} afterwards. Keyboard shortcuts are case sensitive. Many keyboard shortcuts can be preceded by a numeric parameter. For example, typing @code{ae} toggles the state of drawing edges, while @code{1ae} always enables edge drawing. The @emph{keyboard} field in the upper left corner of the @emph{Main} panel echos the current state of keyboard shortcuts. @ifset forms The button labeled @emph{?} near the top right corner of the @emph{Main} panel causes Geomview to print out a list of all keyboard shortcuts to standard output. The @emph{Quit} button on the main panel terminates Geomview. @end ifset @ifclear forms For a list of all keyboard shortcuts, press the @emph{@code{?}} key. @end ifclear @comment ================================================================ @node Loading, Mouse Motions, Basic Interaction, Interaction @section Loading Objects Into Geomview There are several ways to load an object into Geomview. @table @asis @item the @emph{Files} panel If you click the @emph{Load} button in Geomview's @emph{Main} panel, the @emph{Files} panel will appear. @float Figure,figmyfilelist @image{figs/myfilelist} @caption{The Files Panel.} @end float This panel lets you select a file from a variety of directories. The top of the panel is a standard Motif file browser. Below this is a list of directories on Geomview's standard search path; click on one of these to browse files in that directory. To select a file, double-click on its name in the browser at upper right, or click on its name and press the @key{Enter} key, or type the file's name into the text box at the bottom of the browser and press @key{Enter}. @refill If the selected file contains OOGL geometric data, it will be added to the geomview @emph{Targets} browser. If it contains GCL commands instead, the file will be interpreted. @xref{GCL}. When the @emph{Files} panel first appears, the directory selected in the directory browser is the current directory --- the one from which you invoked Geomview. The file browser shows @emph{all} the files in this directory, including ones that are not Geomview files. If you try to load a file that doesn't contain either an OOGL object or Geomview commands, Geomview will print out an error message. The directory browser also lists a second and third directory in addition to the current directory. The second one, which ends in @file{data/geom}, is the Geomview example data directory. This contains a wide variety of sample objects. It also contains several subdirectories. In particular, the @file{hyperbolic} and @file{spherical} subdirectories have sample hyperbolic and spherical objects, respectively. Directory entries in the browser look just like file entries; to view a subdirectory, click on it. The third directory shown in the directory browser, which ends in @file{geom}, contains several subdirectories with other Geomview files in them. These are used less frequently than the ones in the @file{data/geom} directory. You can change the list of directories shown the @emph{Files} panel's directory browser by using the @code{set-load-path} command; @pxref{set-load-path, @code{(set-load-path @dots{})}}. @item the @kbd{<} keyboard shortcut: If you type @kbd{<} in any Geomview window, the @emph{Load} panel will appear. This is a small version of the @emph{Files} panel; it contains a text field in which you can enter the name of a file to load (or a GCL command surrounded by parentheses). After typing the name of the file to load, type @kbd{@key{Enter}}; Geomview will load the file as if you had loaded it with the @emph{Add} button in the @emph{Files} panel. If, after bringing up the small load panel with @kbd{<}, you decide you want to use the larger @emph{Files} panel after all, press the @emph{File Browser} button. @float Figure,figloadpanel @image{figs/load} @caption{The Load Panel.} @end float @item geometry loading commands: The @code{load}, @code{geometry}, @code{new-geometry}, and @code{read} GCL commands allow you to load an object into Geomview; @xref{GCL}. @xref{load, @code{(load @dots{})}}. @xref{new-geometry, @code{(new-geometry @dots{})}}. @xref{read, @code{(read @dots{})}}. @refill @end table @comment ================================================================ @node Mouse Motions, Appearance, Loading, Interaction @section Using the Mouse to Manipulate Objects Geomview lets you manipulate objects with the mouse. There are six different mouse motion modes: @emph{Rotate}, @emph{Translate}, @emph{Cam Fly}, @emph{Cam Zoom}, @emph{Geom Scale}, and @emph{Cam Orbit}. The tools panel has a button for each of these modes; to switch modes, click on the corresponding button. You can also select these through the @emph{Motion Mode} browser on the @emph{Main} panel.@refill This section describes basic mouse interaction. For details, @pxref{Commands}. @float Figure,figtools @image{figs/tools} @caption{The Tools Panel.} @end float Each of the motion modes uses a common paradigm for how the motion is applied. In particular, each depends on the current @emph{target} object and the current @emph{center} object. These are explained in the following paragraphs. The current target object is shown in the @emph{Target} field in the @emph{Tools} panel. This is the same as the selected object in the @emph{Targets} browser in the @emph{Main} panel, and you can change it by either selecting a new object in the browser, by typing a new entry in the field, or by picking an object in a camera window by double-clicking the right mouse button with the cursor over the object. The current center object is shown in the @emph{Center} field in the @emph{Tools} panel. Its default value is the special word "target", which means that the center object is whatever the target object is. You can change the center to any object by typing it in the @emph{Center} field. The origin of the center object is held fixed in @emph{Rotate} and @emph{Orbit} modes. Normally the center object is one of the existing geoms listed in the @emph{Targets} browser, and the actual center of rotations is the origin of that object's coordinate system. It is possible, however, to select an arbitrary point of interest on an object as the center. For details, @pxref{Point of Interest}. It is also possible to toggle the button @emph{BBox Center} to set the center of motion to the center of the current object's bounding box. Once toggled, the active geometry's bounding box center will become the center of motion. If you select another object, then the center of motion will become the center of that object's bounding box. Nothing changes when a camera or the @emph{World} is selected; you have to type in the word @code{target} in the @emph{Center} field to reset to the default. You apply a mouse motion by holding down either the left or middle mouse button with the cursor in a camera window and moving the mouse. Most of the modes have @emph{inertia}, which means that if you let go of the button while moving the mouse, the motion will continue. It may be helpful to imagine the mouse cursor as being a gripper; when you hold a mouse button down, it grips the target object and you can move it. When you let go of the mouse button, the gripper releases the object. Letting go of the mouse button while moving the mouse is like throwing the object --- the object continues moving independent of the mouse. Inertia can be turned off; see the @emph{Main} panel's @emph{Motion} menu, described below. Generally, the left mouse button controls motion in the screen plane, while the middle mouse controls motion along or around the forward direction. Pressing the shift key while dragging with left or middle mouse buttons in most motion modes gives slow-speed motions, useful for fine adjustment. You can pick any point on an object (not just its origin) as the center of motion by holding down the shift key while clicking the right mouse button; this chooses a point of interest. @table @emph @item Rotate In @emph{Rotate} mode, hold the left mouse button down to rotate the target object about the center object. Rotation proceeds in the direction that you move the mouse. Specifically, the axis of rotation passes through the origin of the center object, is parallel to the camera view plane, and is perpendicular to the direction of motion of the mouse. When the center is "target", this means that the target object rotates about its own origin. The middle mouse button in @emph{Rotate} mode rotates the target object about an axis perpendicular to the view plane. @item Translate In @emph{Translate} mode, hold the left mouse button down to translate the target object in the direction of mouse motion. The middle mouse button translates the target along an axis perpendicular to the view plane. In Euclidean space, the center object is essentially irrelevant for translations. In hyperbolic and spherical spaces, where translations have a unique axis, this axis is chosen to go through the origin of the center object. @item Cam Fly @emph{Cam Fly} is a crude flight simulator that lets you fly around the scene. It works by moving the camera. Move the mouse while holding the left mouse button down to point the camera in a different direction. To move forward or backward, hold down the middle button and move the mouse vertically. Both of these motions have inertia; typically the easiest way to fly around a scene is to give the camera a slight forward push by letting go of the middle button while moving the mouse upward, and then using the left button to steer. @emph{Cam Fly} affects the camera window that the mouse is in; it ignores the target object and the center object. @item Cam Orbit @emph{Cam Orbit} mode lets you rotate the current camera around the current center. The left mouse button does this rotation. The middle mouse button in @emph{Cam Orbit} mode acts as in @emph{Cam Fly} mode: it moves the camera forward or backward. In general @emph{Cam Orbit} does not move the target object, although if the current camera is selected as the target and the center is also the target, it will pivot that camera about itself just as in @emph{Cam Fly} mode. @item Cam Zoom @emph{Cam Zoom} mode lets you change the current camera's field of view with the mouse; hold the left mouse button down and move the mouse to change it. The numeric value of the field of view is shown in the @emph{FOV} field in the @emph{Camera} panel. @item Geom Scale @emph{Geom Scale} mode lets you enlarge or shrink a geom. It operates on the target object if that object is a geom. If the target is a camera, @emph{Geom Scale} operates on the geom that was most recently the target object. Moving the mouse while holding down the left mouse button scales the object either up or down, depending on the direction of mouse motion. The center of the applied scaling transformation is the center object. Scaling is meaningful only in Euclidean space; attempts to scale are ignored in other spaces. @emph{Geom Scale} mode does not have inertia. @end table The @emph{Stop}, @emph{Look At}, @emph{Center}, and @emph{Reset} buttons on the @emph{Tools} panel perform actions related to motions but do not change the current motion mode. @table @emph @item Stop The @emph{Stop} button causes all motions to stop. It affects all moving objects, not just the target object. Its keyboard shortcut is @kbd{H}. The keyboard command @kbd{h}, which does not correspond to a panel button, stops the current motion for the target object only. @item Look At The @emph{Look At} button causes the current camera to be moved to a position such that it is looking at the target object, and such that the target object more or less fills the window. The Look At command is unreliable in non-Euclidean spaces. @item Center The @emph{Center} button undoes the target object's transformation, moving it back to its home position, which is where it was when you originally loaded it into Geomview. @item Reset The @emph{Reset} button stops all motion and causes all objects to move back to their home positions. @end table The @emph{Tools} panel also sports a @emph{Main} button, to invoke the main panel in case it was dismissed or buried, and a @emph{Done} button to close the @emph{Tools} panel. The @emph{Main} panel's @emph{Motion} menu has special controls affecting how mouse motions are interpreted; the toggles are also accessible through a GCL command. @xref{ui-motion, @code{(ui-motion @dots{})}}. @table @emph @item [ui] Inertia Normally, moving objects have inertia: if the mouse is still moving when the button is released, the selected object continues to move. When @emph{Inertia} is off, objects cease to move as soon as you release the mouse. @item [uc] Constrain Motion It's sometimes handy to move an object in a direction aligned with a coordinate axis: exactly horizontally or vertically. Selecting @emph{Constrain Motion} changes the interpretation of mouse motions to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical motion. Note that the motion is still along the X or Y axes of the camera in which you move the mouse, not necessarily the object's own coordinate system. @item [uo] Own Coordinates It's sometimes handy to move objects with respect to the coordinate system where they were defined, rather than with respect to some camera's view. While @emph{Own Coordinates} is selected, all motions are interpreted that way: dragging the mouse rightward in translate mode moves the object in its own +X direction, and so on. May be especially useful in conjunction with the @emph{Constrain Motion} button. @end table @comment ================================================================ @menu * Point of Interest:: Point of Interest. @end menu @node Point of Interest, , Mouse Motions, Mouse Motions @subsection Selecting a Point of Interest It is sometimes useful to specify a particular point on some object in a geomview window as the center point for mouse motions. You can do this by shift-clicking the right mouse button (i.e. click it once while holding down the shift key on the keyboard) with the cursor over the desired point. This point then becomes the @emph{point of interest}. The point of interest must be on an existing object. Selecting a point of interest simplifies examining a small portion of a larger object. Shift-right-click on an interesting point, and select @emph{Orbit} mode. Use the middle mouse button to approach, and the left mouse to orbit the point, examining the region from different directions. When you have selected a point of interest, the current center object changes to an object named "CENTER", which is an invisible object located at the point of interest. In addition, mouse motions for the window in which you made the selection are adjusted so that the point of interest follows the mouse. You can change the point of interest at any time by selecting a new one by shift-clicking the right mouse button again. You can cancel the point of interest altogether by shift-clicking the right mouse button with the cursor on the background (i.e. not on any object). This changes the center object back to its default value, "target". The object named "CENTER", which serves as the center object for the point of interest, is a special kind of geom called an "alien". It does not appear in the @emph{Targets} browser. By default it has no geometry associated with it and hence is invisible. You can, however, explicitly give it some geometry using a GCL command, causing it to appear. Use the @code{geometry} command for this: @code{(geometry CENTER @var{geometry})}, where @var{geometry} is any valid geometry. For example, @code{(geometry CENTER @{ < xyz.vect @})} causes the file @file{xyz.vect}, which is one of the standard example files distributed with geomview, to be used at the geometry for CENTER. @xref{geometry, @code{(geometry @dots{})}}. What happens internally when you select a point of interest is that the center is set to the object called CENTER, and that object is positioned at the point of interest. In addition, in order for mouse motions to track the point of interest, the current camera's focal length is set to be the distance from the camera to the point of interest. You can accomplish this via GCL with the following commands: @example (if (real-id CENTER) nil (new-alien CENTER @{@})) (ui-center CENTER) (transform-set CENTER universe universe translate @var{x} @var{y} @var{z}) (merge camera @var{cam-id} @{ focus @var{d} @}) @end example @noindent where @code{(@var{x},@var{y},@var{z})} are the (universe) coordinates of the point of interest, and @var{d} is the distance from that point to the current camera, @var{cam-id}. The first command above creates the "alien" CENTER if it does not yet exist. @comment ================================================================ @node Appearance, Cameras, Mouse Motions, Interaction @section Changing the Way Things Look Geomview uses a hierarchy of appearances to control the way things look. An @dfn{appearance} is a specification of information about how something should be drawn. This can include many things such things as color, lighting, material properties, and more. Appearances work in a hierarchal manner: if a certain appearance property, for example face color, is not specified in a particular object's appearance, that object is drawn using that property from the parent appearance. If both the parent and the child appearance specify a property, the child's setting takes precedence unless the parent appearance is set to override. Every geom in Geomview has an appearance associated with it. There is also an appearance associated with the "World" geom, which serves as the parent of each individual geom's appearance. Finally, there is a global "base" appearance, which is the parent of the World appearance. The base appearance specifies reasonable values for all appearance information, and by default none of the other appearances specify anything, which means they inherit their values from the base appearance. This means that by default all objects are drawn using the base appearance. If you change a certain appearance property for a geom, that property is used in drawing that geom. The parent appearance is used for any properties that you do not explicitly set. Geomview has three panels which let you modify appearances. @menu * Appearance Panel:: Color etc. * Materials Panel:: Surface Material properties. * Lighting Panel:: Lighting Parameters. @end menu @comment ---------------------------------------------------------------- @node Appearance Panel, Materials Panel, Appearance, Appearance @subsection The Appearance Panel The @emph{Appearance} panel lets you change most common appearance properties of the target object. @float Figure,figap @image{figs/ap} @caption{The Appearance Panel.} @end float If the target is an individual geom, then changes you make in the appearance panel apply to that geometry's appearance. If the target is the World, then appearance panel changes apply to the World appearance @emph{and} to all individual geom appearances. (Users have found that this is more desirable than having the changes only apply to the World appearance.) If the target is a camera, then appearance panel changes apply to the geom that was most recently the target. The five buttons near the upper left corner under the word @emph{Show} control what parts of the target geom are drawn. @table @emph @item Faces This button specifies whether faces are drawn. @item Edges This button specifies whether edges are drawn. @item BBox This button specifies whether the bounding box is drawn. @item Vects This button specifies whether VECT objects are drawn. VECTs are a type of OOGL object that represent points and line segments in 3-space; they are distinct from edges of other kinds of objects, and it is sometimes desirable to have separate control over whether they are drawn. @item Normals This button specifies whether surface normal vectors are drawn. @end table The four buttons under @emph{Color} labeled @emph{Faces}, @emph{Edges}, @emph{Normals}, and @emph{BBox} let you specify the color of the corresponding aspect of the target geom. Clicking on one of them brings up a color chooser panel. @float Figure,figcolorchooserpanel @image{figs/color} @caption{Color Chooser Panel.} @end float This panel offers two sets of sliders: H(ue) S(aturation) V(alue), or R(ed) G(reen) B(lue), each in the range 0 through 1. The square shows the current color, which is given numerically in both HSV and RGB systems in the corresponding text boxes. In the HSV color system, hue H runs from red at 0, green at .333, blue at .667, and back to red at 1.0. Saturation gives the fraction of white mixed into the color, from 0 for pure gray to 1 for pure color. Value gives the brightness, from 0 for black to 1 for full brightness. Pressing the @emph{RGB} or @emph{HSV} button at top center switches the sliders to the other color system. You can adjust colors either via the sliders, or by typing in either the RGB or HSV text boxes. Click @emph{OK} to accept the color that you have chosen, or @emph{Cancel} to retain the previous color setting. The @emph{SHADING} browser lets you specify the shading model that Geomview uses to paint the target geom. @table @code @item Constant Every face of the object is drawn with a constant color which does not depend on the location of the face, the camera, or the light sources. If the object does not contain per-face or per-vertex colors, the diffuse color of the object's appearance is used. If the object contains per-face colors, they are used. If the object contains per-vertex colors, each face is painted using the color of its first vertex. @item Flat Each face of the object is drawn with a color that depends on the relative location of the face, the camera, and the light sources. The color is constant across the face but may change as the face, camera, or lights move. @item Smooth Each face of the object is drawn with smoothly interpolated colors based on the normal vectors at each vertex. If the object does not contain per-vertex normals, this has the same effect as flat shading. If the object has reasonable per-vertex normals, the effect is to smooth over the edges between the faces. @item CSmooth Each face of the object is drawn with exactly the specified color(s), independent of lighting, orientation, and material properties. If the object is defined with per-vertex colors, the colors are interpolated smoothly across the face; otherwise the effect is the same as in Constant shading style. @item VCflat A combination of @code{CSmooth} and @code{Flat} shading. So the shading is constant on each face, depending on the relative orientation of the light sources, the camera and the surface normal of the face. @end table The @emph{Facing Normals} button on the @emph{Appearance} panel indicates whether or not Geomview should arrange that normal vectors always face the viewer. If a normal vector points away from the viewer the color of the corresponding face or vertex usually is darker than is desired. Geomview can avoid this by using the opposite normal in shading calculations. This is the default. Using @emph{Facing Normals} can give strange flickering dark or light shading effects, though, near the horizon of a fairly smooth facetted object. Press this button to use the normals given with the object. The three text fields in the lower left corner of the @emph{Appearance} panel are: @table @emph @item Line Width The width, in pixels, for lines drawn by Geomview. @item Normal Length This is actually a scale factor; when normal vectors are drawn, Geomview draws them to have a length that is their natural length times this number. @item Patch Dicing Geomview draws Bezier patches by first converting them to meshes. This parameter specifies the resolution of the mesh: if @emph{Patch Dicing} is @var{n}, then an @var{n} by @var{n} mesh is used to draw each Bezier patch. if @emph{Patch Dicing} is 1, the resolution reverts to a built-in default value. @end table The @emph{Revert} button on the @emph{Appearance} panel undoes all settings in the target appearance. This causes the target geom to inherit all its appearance properties from its parent. The @emph{Appearance} panel's @emph{Override} button determines whether appearance controls should override settings in the objects themselves -- for example, setting the face color will affect all faces of objects with multi-colored facets. Otherwise, appearance controls only provide settings which the objects themselves do not specify. By default, @emph{Override} is enabled. This button applies to all objects, and to all appearance-related panels. Normalization is a kind of scaling; Geomview can scale an object so that it fits within a certain region. The main point of normalization is to allow you to easily view all of an object without having to worry about how big it is. We are gradually replacing Geomview's normalization feature with more robust camera positioning features. In general, the best way to make sure you are seeing all of an object is to use the @emph{Look At} button on the @emph{Tools} panel. Normalization may be completely replaced by this and other features in a future version of Geomview. Normalization is a property that applies to each geom separately. The @emph{NORMALIZE GEOMETRY} browser affects the normalization property of target geom. If the target geom is "World", it affects all geoms. @table @emph @item None Do no normalization. @item Individual Normalize this geom to fit within a unit sphere. @item Sequence This resembles "Individual", except when an object is changing. Then, "Individual" tightly fits the bounding box around the object whenever it changes and normalizes accordingly, while "Sequence" normalizes the union of all variants of the object and normalizes accordingly. @item Keep This leaves the current normalization transform unchanged when the object changes. It may be useful to apply "Individual" or "Sequence" normalization to the first version of a changing object to bring it in view, then switch to "Keep". @end table @comment ---------------------------------------------------------------- @node Materials Panel, Lighting Panel, Appearance Panel, Appearance @subsection The Materials Panel The @emph{Materials} panel controls material properties of surfaces. It works with the target object in the same way that the @emph{Appearance} panel does. @float Figure,figmatpanel @image{figs/mat} @caption{The Materials Panel.} @end float @table @emph @item Translucent This button determines whether translucency is enabled. Geomview supports three different flavours of translucency: @table @emph @item Alpha-blending with BSP-tree depth-sorting This is the most accurate flavour for online viewing, but consumes vast amounts of computation time and memory. In this mode single translucent objects are displayed correctly with respect to themselves; however multiple translucent objects may appear in the wrong order on the screen. The notion @emph{object} means here: top-level geometries as displayed in the geometry target browser. @item Screen Door Translucency If the machine support OpenGL then there is support for kind-of translucency by masking out (completely) transparent pixels by means of a stipple mask. This is currently very experimental, and the result is somewhat ugly, but fast. @item Alphe-blending without depth-sorting This is the old naive way of doing quick and dirty translucency. It is fast, but the results are completely incorrect. @end table When transparency is enabled, a RenderMan snapshot will contain the alpha information, a RenderMan compliant renderer can then generate high-quality pictures, including correct translucency. @item Alpha This slider determines the opacity/transparency when transparency is enabled. 0 means totally transparent, 1 means totally opaque. @item Diffuse Reflectance This slider controls the diffuse reflectance of a surface. This has to do with how much the surface scatters light that it reflects. @item Shininess This slider controls how shiny a surface is. This determines the size of specular highlights on the surface. Lower values give the surface a duller appearance. @item Ambient Reflectance This slider controls how much of the ambient light a surface reflects. @item Specular Reflectance This slider controls the specular reflectance of a surface. This has to do with how directly the surface reflects light rays. Higher values give brighter specular highlights. @item Done This button dismisses the @emph{Materials} panel. @end table @comment ---------------------------------------------------------------- @node Lighting Panel, , Materials Panel, Appearance @subsection The Lighting Panel The @emph{Lights} panel controls the number, position, and color of the light sources used in shading. @float @image{figs/light} @caption{The Lighting Panel.} @end float The @emph{Lighting} panel is different from the @emph{Appearance} and @emph{Material} panels in that it always works with the base appearance. This is because it usually makes sense to use the same set of lights for drawing all objects in your scene. @table @emph @item LIGHTS The @emph{LIGHTS} browser shows the currently selected light. Changes made using the other widgets on this panel apply to this light. There is always at least one light, the ambient light. @item Intensity This slider controls the intensity of the current light. @item Color This button brings up a color chooser which lets you select the color of the current light. @item Add This button adds a light. @item Delete This button deletes the current light. @item Show Lights This button lets you see and change the positions of the light sources in a camera window. Each light is drawn as long cylinder which is supposed to remind you of a light beam. When you click on the @emph{Show Lights} button Geomview goes into "light edit" mode, during which you can rotate current light by holding down the left mouse button and moving the mouse. Lights placed in this way are infinitely distant, so what you are changing is the angular position. Click on the @emph{Show Lights} button again to return to the previous motion mode and to quit drawing the light beams. @item Done This button dismisses the @emph{Lighting} panel. @end table Geomview's @emph{Appearance}, @emph{Materials}, and @emph{Lighting} panels are constructed to allow you to easily do most of the appearance related things that you might want to do. The appearance hierarchy that Geomview supports internally, however, is very complex and there are certain operations that you cannot do with the panels. The Geomview command language (GCL) provides complete support for appearance operations. In particular, the @code{merge-baseap} command can be used to change the base appearance (which, except for lighting, cannot be changed by Geomview's panels). The @code{merge-ap} command can be used to change an individual geom's appearance. Appearances can also be specified in OOGL files; for details, @pxref{Appearances}. @xref{merge-baseap,@code{(merge-baseap @dots{})}}. @xref{merge-ap,@code{(merge-ap @dots{})}}. @comment ================================================================ @node Cameras, Saving, Appearance, Interaction @section Cameras A camera in Geomview is the object that corresponds to a camera window. By default there is only one camera, but it is possible to have as many as you want. You can control certain aspects of the way the world is drawn in each camera window via the @emph{Cameras} panel. @float Figure,figcamerapanel @image{figs/cam} @caption{The Cameras Panel.} @end float If the target object is a camera, the @emph{Cameras} panel affects that camera. If the target object is not a camera, the @emph{Cameras} panel affects the @dfn{current camera}. The current camera is the camera of the window that the mouse cursor is in, or was in most recently if the cursor is not in a camera window. Thus, if you use the keyboard shortcuts for the actions in the @emph{Cameras} panel while the cursor is in a camera window, the actions apply to that camera, unless you have explicitly selected another camera. To create new camera windows, use the @kbd{v+} keyboard shortcut, or see the @emph{File} menu on the @emph{Main} panel. @table @emph @item Single-Buffering Normally, geomview windows are @emph{double-buffered}: geomview draws the next picture into a hidden window, then switches buffers to make it visible all at once. On many systems, the memory for the hidden buffer comes from stealing half the bits in each screen pixel, reducing the color resolution. When single-buffering is enabled, the window flickers as each scene is being drawn, but you may get smoother images with reduced grainy dithering artifacts. Single-buffering is possible if Geomview is compiled with GL or OpenGL, but not with plain-X graphics. @item Dither Many displays offer less than the 24 bits per pixel (8 bits each of red, green, and blue) conventionally needed to show smooth gradations of color. When trying to show a color not accurately available on the display, Geomview normally @emph{dithers}, choosing pixel colors sometimes brighter, sometimes darker than the desired value, so that the average color over an area is a better approximation to the true color than a single pixel could be. Effectively this loses spatial resolution to gain color resolution. This isn't always desirable, though. Turning @emph{Dither} off gives less grainy, but less accurately colored, images. @item Software Shading This button controls whether Geomview does shading calculations in software. The default is to let the hardware handle them, and in Euclidean space this is almost certainly best because it is faster. In hyperbolic and spherical space, however, the shading calculations that the hardware does are incorrect. Click this button to turn on correct but slower software shading. @item Background Color This button brings up a color chooser which you can use to set the background color of the camera's window. @item PROJECTION This browser lets you pick between perspective and orthogonal projection for this camera. @item Near clip This determines the distance in world coordinates of the near clipping plane from the eye point. It must be a positive number. @item Far clip This determines the distance in world coordinates of the far clipping plane from the eye point. It must be a positive number and in general should be larger than the @emph{Near clip} value. @item FOV This is the camera's field of view, measured in its shorter direction. In perspective mode, it is an angle in degrees. In orthographic mode, it is the linear size of the field of view. This number can be modified with the mouse in @emph{Cam Zoom} mode. @item Focal Length The focal length is intended to suggest the distance from the camera to an imaginary plane of interest. Its value is used when switching between orthographic and perspective views (and during stereo viewing), so as to preserve apparent size of objects lying at the focal distance from the camera. Focal length also affects interpretation of mouse-based translational motions. Speed of forward motion (in translate, fly and orbit modes) is proportional to focal length; and objects lying at the focal distance from the camera translate laterally at the same rate as the mouse cursor. Finally, in N-D projection mode, cameras are displaced back by the focal distance from the 3-D projection of the world origin. @item Lines Closer This number has to do with the way lines are drawn. Normally Geomview's z-buffering algorithm can get confused when drawing lines that lie exactly on surfaces (such as the edges of an object); due to machine round-off error, sometimes the lines appear to be in front of the surface and sometimes they appear behind it. The @emph{Lines Closer} value is a fudge factor --- Geomview nudges all the lines that it draws closer to the camera by this amount. The number should be a small integer; try 5 or 10. 0 turns this feature off completely. Choosing too large a value will make lines visible even though they should be hidden. @item SPACE MODEL This determines the model used to draw the world. It is most useful in hyperbolic and spherical spaces. You probably don't need to touch this browser if you stay in Euclidean space. For more information about these models, @pxref{Non-Euclidean Geometry}. @table @emph @item Virtual This is the default model and represents the natural view from inside the space. @item Projective The projective model of hyperbolic and spherical space. Geoms move under isometries of the space, and cameras move by Euclidean motions. By default in the projective model, the Euclidean unit sphere is drawn. In hyperbolic space this is the sphere at infinity. In Euclidean space the projective model is the same as the virtual model except that the sphere is drawn by default. @item Conformal The conformal model of hyperbolic and spherical space. Geoms move under isometries of the space, and cameras move by Euclidean motions. In Euclidean space, the conformal model amounts to inverting everything in the unit sphere. @end table @item Draw Sphere This controls whether Geomview draws the unit sphere. By default the unit sphere appears in the projective and conformal models. In hyperbolic space this is the sphere at infinity. In spherical space it is the equatorial sphere. @item Done This button dismisses the @emph{Cameras} panel. @end table @comment ================================================================ @node Saving, Commands, Cameras, Interaction @section Saving your work Geomview's @emph{Save} panel lets you store Geomview objects and other information in files that you can read back into Geomview or other programs. @float Figure,figsavepanel @image{figs/save} @caption{The Save Panel.} @end float To use the @emph{Save} panel you select the desired format in the browser next to the word @emph{Save}, enter the name of the object you want to save in the text field next to the word @emph{for}, and enter the name of the file you wish to save to in the long text field next to the word @emph{in}. You can then either hit @kbd{@key{Enter}} or click on the @emph{OK} button. When the file has been written, the @emph{Save} panel disappears. If you want to dismiss the @emph{Save} panel without writing a file, click the @emph{Cancel} button. If you specify @file{-} as the file name, Geomview will write the file to standard output, i.e. in the shell window from which you invoked Geomview. The possible formats are given below. The kind of object that can be written with each format is given in parentheses. @table @emph @item Commands @asis{(any object)} This write a file of GCL commands containing all information about the object. Loading this file later will restore the object as well as all other information about it, such as appearance, transformations, etc. @item Geometry alone @asis{(geom)} This writes an OOGL file containing just the geometry of the object. @item Geometry [in world] @asis{(geom)} This writes an OOGL file containing just the geometry of the object, transformed under Geomview's current transformation for this object. Use this if you have moved the object from its initial position and want to save the new position relative to the world. @item Geometry [in universe] @asis{(geom)} This writes an OOGL file containing just the geometry of the geom, transformed under both the object's transformation and the world's transformation. @item RMan [->tiff] @asis{(camera)} Writes a RenderMan file which when rendered creates a tiff image. Transparency and texturing (the latter only to some extent) will be available. @item RMan [->frame] @asis{(camera)} Writes a RenderMan file which when rendered causes an image to appear in a window on the screen. Transparency and texturing (the latter only to some extent) will be available. @item SGI snapshot @asis{(camera)} Write an SGI raster file. A bell rings when the snapshot is complete. Only available on SGI systems. @item PPM GLX-offscreen snapshot @asis{(camera)} Render the complete scene anew into off-screen memory; GLX provides the means to use a Pixmap as rendering area. The advantage of rendering into @emph{off}-screen memory over taking screen snapshot is that the camera windows need not be mapped and even raised at the time the snapshot is taken. So with off-screen snapshot one can safely iconify the camera window (but do not close it!), activate the screen-saver and go to bed while some script advances the scenes and takes snapshots. @item PPM Screen snapshot @asis{(camera)} Take a snapshot of the given window and save it as a PPM image. If you specify a string beginning with a vertical bar (@kbd{|}) as the file name, it's interpreted as a Bourne shell command to which the PPM data should be piped, as in @samp{| pnmtotiff > snap.tiff} or @samp{| convert -geometry 50% ppm:- snap.gif}. PPM screen snapshots are only available with GL and Open GL, not plain X graphics. The window should be entirely on the screen. Geomview will ensure that no other windows cover it while the snapshot is taken. It is probably a better idea to use GLX-@emph{off-screen} snapshots, as explained above. @item PPM software snapshot @asis{(camera)} Writes a snapshot of that window's current view, as a PPM image, to the given file. The file name may be a Bourne shell command preceded by a vertical bar (@kbd{|}), as with the PPM screen snapshot. The software snapshot, though, is produced by using a built-in software renderer (related to the X-windows renderer). It doesn't matter whether the window is visible or not, and doesn't depend on GL or OpenGL. It also doesn't support some features, such as texture mapping. @item Postscript snapshot @asis{(camera)} Writes a Postscript snapshot of the camera's view. It's made by breaking up the scene into lines and polygons, sorting by depth, and generating Postscript lines and polygons for each one. Advantages over pixel-based snapshot images: resolution is very high, so edges look sharp even on high-resolution printers, or comparable-resolution images are typically much more compact. Disadvantages: depth-sorting gives good results on some scenes, but can be wildly wrong as a hidden-surface removal algorithm for other scenes. Also, Postscript doesn't offer smoothly interpolated shading, only flat shading for each facet. @item Camera @asis{(camera)} Writes an OOGL file of a camera. @item Transform [to world] @asis{(any object)} Writes an OOGL transform file giving Geomview's transform for the object. @item Transform [to universe] @asis{(any object)} Writes an OOGL transform file giving a transform which is the composition of Geomview's transform for the object and the transform for the world. @item Window @asis{(camera)} Writes an OOGL window file for a camera. @item Panels Writes a GCL file containing commands which record the state of all the Geomview panels. Loading this file later will restore the positions of all the panels. @end table @comment ================================================================ @node Commands, Keyboard Shortcuts, Saving, Interaction @section The Commands Panel The @emph{Commands} panel lets you type in a GCL command. When you hit @kbd{@key{Enter}}, Geomview interprets the command and prints any resulting output or error messages on standard output. You can edit the text and hit @kbd{@key{Enter}} as many times as you like, in general, whenever you hit @kbd{@key{Enter}} with the cursor in the @emph{Commands} panel, Geomview tries to interpret whatever text you have typed in the text field as a command. @float Figure,figcommandpanel @image{figs/command} @caption{The Commands Panel.} @end float @ifset forms The @emph{Obscure} panel is for relatively obscure things that don't really belong on any of the other panels. In the present version of Geomview, the @emph{Obscure} panel includes the @emph{NORMALIZE GEOMETRY} browser, which controls the kind of geometry normalization that Geomview does, and several buttons affecting motion style. @float Figure,figobscurepanel @image{figs/obscure} @caption{The Obscure Panel.} @end float @end ifset @comment ================================================================ @node Keyboard Shortcuts, , Commands, Interaction @section Keyboard Shortcuts Most actions that you can do through Geomview's panels have equivalent keyboard shortcuts so that you can do the same action by typing a sequence of keys on the keyboard. This is useful for advanced users who are familiar with Geomview's capabilities and want to work quickly without having to have lots of panels cluttering up the screen. Keyboard shortcuts usually are indicated in square brackets ([ ]) near the corresponding item in a panel. For example, the keyboard shortcut for @emph{Rotate} mode is 'r'; this is indicated by "[r]" appearing before the word "Rotate" in the @emph{MOTION MODE} browser. To use this keyboard shortcut just hit the @kbd{r} key while the mouse cursor is in any Geomview window. You don't need to press the @kbd{@key{Enter}} or @kbd{@key{SPACE}} keys. Some keyboard shortcuts consist of more than one key. In these cases just type the keys one after the other, with no @kbd{@key{Enter}} afterwards. Keyboard shortcuts are case sensitive. You can cancel a multi-key keyboard shortcut that you have started by typing any invalid key, for example the space bar. Keyboard commands apply while the cursor is in any camera window and most control panels. Many keyboard shortcuts allow numeric arguments which you type as a prefix to the command key(s). For example, the shortcut for @emph{Near clip} in the camera panel is @kbd{v n}. To set the near clip plane to @samp{0.5}, type @kbd{0.5vn}. Commands that don't take a numeric prefix toggle or reset the current value. Most commands allow one of the following selection prefixes. If none is provided the command applies to the target object. @table @kbd @item g world geom @item g# #'th geom @item g* All geoms @item c current camera @item c# #'th camera @item c* All cameras @end table For example, @kbd{g4af} means toggle the face drawing of object @emph{g4}. Simply typing a selection prefix, like @kbd{g4}, doesn't yet select an object; that only happens when a command, like @kbd{ae}, follows the prefix. To select an object as the target without doing anything else to it, use the @kbd{p} command. So @kbd{g3p} selects object g3. The text field in the upper left corner of the @emph{Main} panel shows the state of the current keyboard shortcut. In addition to the keyboard shortcuts for the panel commands, there is also a shortcut for picking a target object: type the short name of the object followed by @kbd{p}. For example, to select object @emph{g3}, type @kbd{g 3 p}. This only works with the short names --- the ones that appear in square brackets ([ ]) in the @emph{Targets} browser of the @emph{Main} panel. Below is a summary of all keyboard shortcuts. @table @asis @item Draw @table @kbd @item af Faces @item ae Edges @item an Normals @item ab Bounding Boxes @item aV Vectors @end table @item Shading @table @kbd @item 0as Constant @item 1as Flat @item 2as Smooth @item 3as Smooth, non-lighted @item aT allow transparency @item at texture mapping @end table @item Other @table @kbd @item av eVert normals: always face viewer @item #aw Line Width (pixels) @item aC handle concave polygons @item #vc edges Closer than faces (try 5-100) @end table @item Color @table @kbd @item Cf faces @item Ce edges @item Cn normals @item Cb bounding boxes @item CB background @end table @item Motions @table @kbd @item r rotate @item t translate @item z zoom FOV @item f fly @item o orbit @item s scale @item w recenter target @item W recenter all @item h halt @item H halt all @item @@ select center of motion (e.g. @kbd{g 3 @@}) @item L Look At object @end table @item Viewing @table @kbd @item 0vp Orthographic view @item 1vp Perspective view @item vd Draw other views' cameras @item #vv field of View @item #vn near clip distance @item #vf far clip distance @item v+ add new camera @item vx cursor on/off @item vb backfacing poly cull on/off @item #vl focal length @item v~ Software shading on/off @end table @item Panels @table @kbd @item Pm Main @item Pa Appearance @item Pl Lighting @item Po Obscure @item Pt Tools @item Pc Cameras @item PC Commands @item Pf Files @item Ps Save @item P- read commands from tty @item PA Credits ("about") @end table @item Lights @table @kbd @item ls show lights @item le edit lights @end table @item Space @table @kbd @item me Euclidean @item mh Hyperbolic @item ms Spherical @end table @item Model @table @kbd @item mv Virtual @item mp Projective @item mc Conformal @end table @item Other @table @kbd @item 0N normalization: none @item 1N normalization: each @item 2N all normalization: all @item ui motion: Inertia @item uc motion: Constrain to axis @item uo motion: object's Own coordinates @item < @item Pf load geometry/command file @item dd delete target object @item > @item Ps save state to file @item TV NTSC mode toggle @item p pick as target object (e.g. @kbd{g 3 p}) With no prefix, selects the object under the mouse cursor (like double-clicking the right mouse) @end table @end table @comment **************************************************************** @node OOGL File Formats, Customization, Interaction, Top @chapter OOGL File Formats The objects that you can load into Geomview are called OOGL objects. OOGL stands for ``Object Oriented Graphics Library''; it is the library upon which Geomview is built. There are many different kinds of OOGL objects. This chapter gives syntactic descriptions of file formats for OOGL objects. Examples of most file types live in Geomview's @file{data/geom} directory. @menu * Conventions:: Conventions and general remarks. * Object File Formats:: Object File Formats. * Non-geometric objects:: Non-geometric objects. @end menu @comment ================================================================ @node Conventions, Object File Formats, OOGL File Formats, OOGL File Formats @section Conventions @menu * Common syntax:: Syntax Common to All OOGL File Formats. * File names:: File Names. * Vertices:: Vertices. * ND-Vertices:: @var{N}-dimensional Vertices. * Surface normal directions:: Surface normal directions. * Transformation matrices:: Transformation matrices. * ND Transformation matrices:: @var{N}-dimensional transformation matrices. * Binary format:: Binary format. * References:: Embedded objects and external-object references. * Appearances:: Appearances. * Texture Mapping:: Texture mapping. @end menu @comment ---------------------------------------------------------------- @node Common syntax, File names, Conventions, Conventions @subsection Syntax Common to All OOGL File Formats Most OOGL object file formats are free-format ASCII --- any amount of white space (blanks, tabs, newlines) may appear between tokens (numbers, key words, etc.). Line breaks are almost always insignificant, with a couple of exceptions as noted. Comments begin with # and continue to the end of the line; they're allowed anywhere a newline is. Binary formats are also defined for several objects; @xref{Binary format}, and the individual object descriptions. Typical OOGL objects begin with a key word designating object type, possibly with modifiers indicating presence of color information etc. In some formats the key word is optional, for compatibility with file formats defined elsewhere. Object type is then determined by guessing from the file suffix (if any) or from the data itself. Key words are case sensitive. Some have optional prefix letters indicating presence of color or other data; in this case the order of prefixes is significant, e.g. @code{CNMESH} is meaningful but @code{NCMESH} is invalid. @comment ---------------------------------------------------------------- @node File names, Vertices, Common syntax, Conventions @subsection File Names When OOGL objects are read from disk files, the OOGL library uses the file suffix to guess at the file type. If the suffix is unrecognized, or if no suffix is available (e.g. for an object being read from a pipe, or embedded in another OOGL object), all known types of objects are tried in turn until one accepts the data as valid. @comment ---------------------------------------------------------------- @node Vertices, ND-Vertices, File names, Conventions @subsection Vertices Several objects share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an object have the same format, specified by the header key word. All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on). The syntax is @table @samp @item @var{x} @var{y} @var{z} (3-D floating-point vertex coordinates) or @item @var{x} @var{y} @var{z} @var{w} (4-D floating-point vertex coordinates) @end table optionally followed by @table @samp @item @var{nx} @var{ny} @var{nz} (normalized 3-D surface-normal if present) @end table optionally followed by @table @samp @item @var{r} @var{g} @var{}b @var{a} (4-component floating-point color if present, each component in range 0..1. The @var{a} (alpha) component represents opacity: 0 transparent, 1 opaque.) optionally followed by @item @var{s} @var{t} @item or @item @var{s} @var{t} @var{u} @end table (two or three texture-coordinate values). Values are separated by white space, and line breaks are immaterial. Letters in the object's header key word must appear in a specific order; that's the reverse of the order in which the data is given for each vertex. So a @samp{CN4OFF} object's vertices contain first the 4-component space position, then the 3-component normal, finally the 4-component color. You can't change the data order by changing the header key word; an @samp{NCOFF} is just not recognized. @comment ---------------------------------------------------------------- @node ND-Vertices, Surface normal directions, Vertices, Conventions @subsection @var{N}-dimensional Vertices Several objects share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an object have the same format, specified by the header key word. All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on). The syntax for @var{N}-dimensional vertices (@var{N} > 3) is @table @samp @item @var{x[1]} @var{x[2]} @var{x[3]} @var{x[4]} @dots{} (@var{N} floating-point vertex coordinates) or @item @var{x[0]} @var{x[1]} @var{x[2]} @var{x[3]} @var{x[4]} @dots{} (@var{(N+1)} floating-point vertex coordinates, if the @code{4} modifier has been specified in the object's header line) @end table Note, however, that @var{N}-dimensional objects internally always have @var{(N+1)}-dimensional points; the first component @var{x[0]} -- if present in the object file -- is used as homogeneous divisor. This is different from the ordinary 3D case where the @code{4} modifier generates a 4D object where the homogeneous component implicitly is set to 1. Color components usually can be specified like for 3D vertices, @pxref{Vertices}, while specifying normals does not make sense. @comment ---------------------------------------------------------------- @node Surface normal directions, Transformation matrices, ND-Vertices, Conventions @subsection Surface normal directions Geomview uses normal vectors to determine how an object is shaded. The direction of the normal is significant in this calculation. When normals are supplied with an object, the direction of the normal is determined by the data given. When normals are not supplied with the object, Geomview computes normal vectors automatically; in this case normals point toward the side from which the vertices appear in counterclockwise order. On parametric surfaces (Bezier patches), the normal at point P(u,v) is in the direction dP/du cross dP/dv. @comment ---------------------------------------------------------------- @node Transformation matrices, ND Transformation matrices, Surface normal directions, Conventions @subsection Transformation matrices Some objects incorporate 4x4 real matrices for homogeneous object transformations. These matrices act by multiplication on the right of vectors. Thus, if p is a 4-element row vector representing homogeneous coordinates of a point in the OOGL object, and A is the 4x4 matrix, then the transformed point is p' = p A. This matrix convention is common in computer graphics; it's the transpose of that often used in mathematics, where points are column vectors multiplied on the right of matrices. Thus for Euclidean transformations, the translation components appear in the fourth row (last four elements) of A. A's last column (4th, 8th, 12th and 16th elements) are typically 0, 0, 0, and 1 respectively. @comment ---------------------------------------------------------------- @node ND Transformation matrices, Binary format, Transformation matrices, Conventions @subsection ND Transformation matrices In the context of @var{N}-dimensional space (@var{N} > 3) some objects incorporate @var{(N+1)}x@var{(N+1)} real matrices for homogeneous object transformations. These matrices act by multiplication on the right of vectors. Thus, if p is an @var{(N+1)}-element row vector representing homogeneous coordinates of a point in the OOGL object, and A @var{(N+1)}x@var{(N+1)} is the matrix, then the transformed point is p' = p A. Note that (unlike for the 4x4 transformation matrices, @pxref{Transformation matrices}) the homogeneous component is located at index @b{zero}, so the translation components for Euclidean transformations appear in the @b{zero}-th row (first @var{(N+1)} elements). A's first column (at column index zero) is typically 1, 0, @dots{}, 0. @comment ---------------------------------------------------------------- @node Binary format, References, ND Transformation matrices, Conventions @subsection Binary format Many OOGL objects accept binary as well as ASCII file formats. These files begin with the usual ASCII token (e.g. @code{CQUAD}) followed by the word @code{BINARY}. Binary data begins at the byte following the first newline after @code{BINARY}. White space and a single comment may intervene, e.g. @example OFF BINARY # binary-format "OFF" data follows @end example Binary data comprise 32-bit integers and 32-bit IEEE-format floats, both in big-endian format (i.e., with most significant byte first). This is the native format for 'int's and 'float's on Sun-3's, Sun-4's, and Irises, among others. Binary data formats resemble the corresponding ASCII formats, with ints and floats in just the places you'd expect. There are some exceptions though, specifically in the @code{QUAD}, @code{OFF} and @code{COMMENT} file formats. Details are given in the individual file format descriptions. @xref{QUAD}, @xref{OFF}, and @xref{COMMENT}. Binary OOGL objects may be freely mixed in ASCII object streams: @example LIST @{ = MESH BINARY @dots{} binary data for mesh here @dots{} @} @{ = QUAD 1 0 0 0 0 1 0 1 0 0 1 0 @} @end example Note that ASCII data resumes immediately following the last byte of binary data. Naturally, it's impossible to embed comments inside a binary-format OOGL object, though comments may appear in the header before the beginning of binary data. @comment ---------------------------------------------------------------- @node References, Appearances, Binary format, Conventions @subsection Embedded objects and external-object references Some object types (@code{LIST}, @code{INST}) allow references to other OOGL objects, which may appear literally in the data stream, be loaded from named disk files, or be communicated from elsewhere via named objects. GCL commands also accept geometry in these forms. The general syntax is @example ::= [ "@{" ] [ "define" @code{symbolname} ] [ ["="] @code{object-keyword} @dots{} | "<" @code{filename} | ":" @code{symbolname} ] [ "@}" ] @end example where "quoted" items are literal strings (which appear without the quotes), [bracketed] items are optional, and | denotes alternatives. Curly braces, when present, must match; the outermost set of curly braces is generally required when the object is in a larger context, e.g. when it is part of a larger object or embedded in a Geomview command stream. For example, each of the following three lines: @example @{ define fred QUAD 1 0 0 0 0 1 0 1 0 1 0 0 @} @{ define fred = QUAD 1 0 0 0 0 1 0 1 0 1 0 0 @} @{ appearance @{ +edge @} LIST @{ < "file1" @} @{ : fred @} @} VECT 1 2 0 2 0 0 0 0 1 1 2 @end example @noindent is a valid OOGL object. The last example is only valid when it is delimited unambiguously by residing in its own disk file. The ":" construct allows references to symbols, created with @code{define}. A symbol's initial value is a null object. When a symbol is (re)defined, all references to it are automatically changed. The "@code{define} NAME" construct allows to define a global symbol for the given object. If "NAME" already references an object, then the old object is discarded and replaced by the new definition. @xref{read,@code{(read @dots{})}}. @xref{hdefine,@code{(hdefine @dots{})}}. The "<" construct causes a disk file to be read. Note that this isn't a general textual "include" mechanism; a complete OOGL object must appear in the referenced file. Files read using "<" are sought first in the directory of the file which referred to them, if any; failing that, the normal search path (@pxref{load-path, @code{(load-path @dots{})}}) is used. The default search looks first in the current directory, then in the Geomview data directories. Again, white space and line breaks are insignificant, and "#" comments may appear anywhere. @comment ---------------------------------------------------------------- @node Appearances, Texture Mapping, References, Conventions @subsection Appearances Geometric objects can have associated "appearance" information, specifying shading, lighting, color, wire-frame vs. shaded-surface display, and so on. Appearances are inherited through object hierarchies, e.g. attaching an appearance to a @code{LIST} means that the appearance is applied to all the @code{LIST}'s members. Some appearance-related properties are relegated to "material", "lighting" and "texture" substructures. Take care to note which properties belong to which structure. Any geometric object can be preceded by an appearance definition like in the following example: @example @{ appearance @{ +edge @} LIST @{ < "file1" @} @{ QUAD 1 0 0 0 0 1 0 1 0 1 0 0 @} @} @end example Appearances are also OOGL objects in their own right and can be given symbolic names and referenced by them (@pxref{References}). @xref{appearance objects, Appearance objects}. @table @b @item Texture Mapping There is a separate section concerning the definition of textures (@pxref{Texture Mapping}). @item Transparency Rendering translucent objects is not supported by all drawing back ends. The OpenGL renderer has limited support for it: top-level objects (i.e. those which appear in the object browser of the main panel (@pxref{Basic Interaction, The Main Panel}) are rendered correctly by means of alpha-blending). Also, the RenderMan snapshots will include opacity values. @end table Here's an example appearance structure including values for all attributes. Order of attributes is unimportant. As usual, white space is irrelevant. Boolean attributes may be preceded by "+" or "-" to turn them on or off; "+" is assumed if only the attribute name appears. Other attributes expect values. A "*" prefix on any attribute, e.g. "*+edge" or "*linewidth 2" or "material @{ *diffuse 1 1 .25 @}", selects "override" status for that attribute. @example appearance @{ +face # (Do) draw faces of polygons. On by default. -edge # (Don't) draw edges of polygons +vect # (Do) draw VECTs. On by default. transparent screendoor # (Enable) transparency. Enabling transparency # does not (necessarily) result in a correct Geomview # pictures, but alpha values are used in RenderMan # snapshots. # The allowed keywords are ``screendoor'' (masking out # out pixels by means of a stipple pattern), # ``blending'' for alpha-blending with BSP-tree # space paritioning and depth-sorting (slow) and # ``naive'' for alpha-blending without even # depth-sorting, not to talk about space # partioning. Omitting the keyword will default to # alpha-blending with BSP-tree space-partioning # and depth-sorting. -normal # (Do) draw surface-normal vectors normscale 1 # @dots{} with length 1.0 in object coordinates +evert # do evert polygon normals where needed so as # to always face the camera +texturing # (Enable) texture mapping +linear # (Enable) linear average of closest texture elements +mipmap # (Enable) texture mip-mapping +mipinterp # (Enable) linear mip-mapping -backcull # (Don't) discard clockwise-oriented faces -concave # (Don't) expect and handle concave polygons -shadelines # (Don't) shade lines as if they were lighted cylinders # These four are only effective where the graphics system # supports them, namely on GL and Open GL. -keepcolor # Normally, when N-D positional coloring is enabled as # with geomview's (ND-color ...) command, all # objects' colors are affected. But, objects with the # "+keepcolor" attribute are immune to N-D coloring. shading smooth # or ``shading constant'' or ``shading flat'' or # or ``shading csmooth'' or ``shading vcflat''. # smooth = Gouraud shading, flat = faceted, # csmooth = smoothly interpolated but unlighted, # vcflat = flat shading, but smoothly interpolated colors. linewidth 1 # lines, points, and edges are 1 pixel wide. patchdice 10 10 # subdivide Bezier patches this finely in u and v material @{ # Here's a material definition; # it could also be read from a file as in # ``material < file.mat'' ka 1.0 # ambient reflection coefficient. ambient .3 .5 .3 # ambient color (red, green, blue components) # The ambient contribution to the shading is # the product of ka, the ambient color, # and the color of the ambient light. kd 0.8 # diffuse-reflection coefficient. diffuse .9 1 .4 # diffuse color. # (In ``shading constant'' mode, the surface # is colored with the diffuse color.) ks 1.0 # specular reflection coefficient. specular 1 1 1 # specular (highlight) color. shininess 25 # specular exponent; larger values give # sharper highlights. backdiffuse .7 .5 0 # back-face color for two-sided surfaces # If defined, this field determines the diffuse # color for the back side of a surface. # It's implemented by the software shader, and # by hardware shading on GL systems which support # two-sided lighting, and under Open GL. alpha 1.0 # opacity; 0 = transparent (invisible), 1 = opaque. # Ignored when transparency is disabled. edgecolor 1 1 0 # line & edge color normalcolor 0 0 0 # color for surface-normal vectors @} lighting @{ # Lighting model ambient .3 .3 .3 # ambient light replacelights # ``Use only the following lights to # illuminate the objects under this # appearance.'' # Without "replacelights", any lights listed # are added to those already in the scene. # Now a collection of sample lights: light @{ color 1 .7 .6 # light color position 1 0 .5 0 # light position [distant light] # given in homogeneous coordinates. # With fourth component = 0, # this means a light coming from # direction (1,0,.5). @} light @{ # Another light. color 1 1 1 position 0 0 .5 1 # light at finite position @dots{} location camera # specified in camera coordinates. # (Since the camera looks toward -Z, # this example places the light # .5 unit behind the eye.) # Possible "location" keywords: # global light position is in world (well, universe) coordinates # This is the default if no location specified. # camera position is in the camera's coordinate system # local position is in the coordinate system where # the appearance was defined @} @} # end lighting model texture @{ clamp st # or ``s'' or ``t'' or ``none'' file lump.tiff # file supplying texture-map image alphafile mask.pgm.Z # file supplying transparency-mask image apply blend # or ``modulate'' or ``decal'' transform 1 0 0 0 # surface (s,t,0,1) * tfm -> texture coords 0 1 0 0 0 0 1 0 .5 0 0 1 background 1 0 0 1 # relevant for ``apply blend'' @} @} # end appearance @end example There are rules for inheritance of appearance attributes when several are imposed at different levels in the hierarchy. For example, Geomview installs a backstop appearance which provides default values for most parameters; its control panels install other appearances which supply new values for a few attributes; user-supplied geometry may also contain appearances. The general rule is that the child's appearance (the one closest to the geometric primitives) wins. Further, appearance controls with "override" status (e.g. @code{*+face or material @{ *diffuse 1 1 0 @}}) win over those without it. Geomview's appearance controls use the "override" feature so as to be effective even if user-supplied objects contain their own appearance settings. However, if a user-supplied object contains an appearance field with override status set, that property will be immune to Geomview's controls. @comment ---------------------------------------------------------------- @node Texture Mapping, , Appearances, Conventions @subsection Texture Mapping Some rendering back-ends support texture-mapped objects, actually only the OpenGL and the RenderMan interface at the time of this writing. There are also some issues with the RMan interface when using an alpha-channel in the texture image. Those rendering back-ends which don't support texturing silently ignore attempts to use texture mapping. A texture is specified as part of an appearance structure (@pxref{Appearances}). Briefly, one provides a texture image (@pxref{image, Image objects}), which is considered to lie in a square in @code{(s,t)} parameter space in the range 0 <= s <= 1, 0 <= t <= 1. Then one provides a geometric primitive, with each vertex tagged with @code{(s,t)} texture coordinates. If texturing is enabled, the appropriate portion of the texture image is pasted onto each face of the textured object. There is (currently) no provision for inheritance of part of a texture structure; if the @code{texture} keyword is mentioned in an appearance, it supplants any other texture specification. The appearance attribute @code{texturing} controls whether textures are used; there's no performance penalty for having texture @{ @dots{} @} fields defined when texturing is off. The available fields are: @example clamp none -or- s -or- t -or- st Determines the meaning of texture coordinates outside the range 0..1. With @code{clamp none}, the default, coordinates are interpreted modulo 1, so (s,t) = (1.25,0), (.25,0), and (-.75,0) all refer to the same point in texture space. With @code{s} or @code{t} or @code{st}, either or both of s- or t-coordinates less than 0 or greater than 1 are clamped to 1 or 0, respectively. image @{ (@pxref{image, Image objects}) @} Specify the actual texture image. Images can have 1, 2, 3 or 4 channels: 1 channel: luminance 2 channels: luminance and alpha 3 channels: RGB data 4 channels: RGBA data @xref{image, Image objects}, for the actual definition of image objects. The alpha-channel is only interpreted as mask: where the mask is zero, pixels are simply not drawn. An exception is the case where @emph{apply} is equal to @emph{modulate} and translucency is enabled: in this case the resulting alpha value is the result of the multiplication of the surface color with the alpha value of the texture's alpha channel. file filename alphafile filename @emph{This is considered obsolete, and only kept for compatibility, the modern way is to use the new OOGL image object. @xref{image, Image objects}. The stuff documented here should still work, though} Specifies image file(s) containing the texture. The @emph{file} keyword specifies a file with color or lightness information; @emph{alphafile} if present, specifies a transparency ("alpha") mask; where the mask is zero, pixels are simply not drawn. Several image file formats are available; the file type must be indicated by the last few characters of the file name: .ppm or .ppm.Z or .ppm.gz 24-bit 3-color image in PPM format .pgm or .pgm.Z or .pgm.gz 8-bit grayscale image in PGM format .sgi or .sgi.Z or .sgi.gz 8-bit, 24-bit, or 32-bit SGI image .tiff 8-bit or 24-bit TIFF image .gif GIF image For this feature to work, some programs must be available in geomview's search path: zcat for .Z files gzip for .gz files tifftopnm for .tiff files giftoppm for .gif files If an @code{alphafile} image is supplied, it must be the same size as the @code{file} image. @emph{Image objects provide a more flexible way to specify texture data. @xref{image, Image objects}.} apply modulate -or- blend -or- decal Indicates how the texture image is applied to the surface. Here the "surface color" means the color the surface would have in the absence of texture mapping. With @code{modulate}, the default, the texture color (or lightness, if textured by a gray-scale image) is multiplied by the surface color. With @code{blend}, texture blends between the @code{background} color and the surface color. The @code{file} parameter must specify a gray-scale image. Where the texture image is 0, the surface color is unaffected; where it's 1, the surface is painted in the color given by @code{background}; and color is interpolated for intermediate values. With @code{decal}, the @code{file} parameter must specify a 3-color image. If an @code{alphafile} parameter is present, its value interpolates between the surface color (where alpha=0) and the texture color (where alpha=1). Lighting does not affect the texture color in @code{decal} mode; effectively the texture is constant-shaded. background R G B A Specifies a 4-component color, with R, G, B, and A floating-point numbers normally in the range 0..1, used when @code{apply blend} is selected. transform @code{transformation-matrix} Expects a list of 16 numbers, or one of the other ways of representing a transformation (@code{: handlename} or @code{< filename}). The 4x4 transformation matrix is applied to texture coordinates, in the sense of a 4-component row vector (s,t,0,1) multiplied on the left of the matrix, to produce new coordinates (s',t') which actually index the texture. @end example @comment ================================================================ @node Object File Formats, Non-geometric objects, Conventions, OOGL File Formats @section Object File Formats @menu * QUAD:: List of quadrilaterals. * MESH:: Rectangularly-connected mesh. * BBOX:: Simple bounding-boxes. * BBP and BEZ:: List of Bezier surface patches. * OFF:: Polyhedra: polygons with shared vertices. * VECT:: List of points and lines. * SKEL:: List of points and lines, with shared vertices. * SPHERE:: Sphere * INST:: Transformed Instance of another object. * LIST:: List of other objects. * TLIST:: Collection of 4x4 transformation matrices. * GROUP:: Obsolete format for collections of objects. * DISCGRP:: Discrete Group objects. * COMMENT:: Comment object, for caching information. @end menu @comment ---------------------------------------------------------------- @node QUAD, MESH, Object File Formats, Object File Formats @subsection QUAD: collection of quadrilaterals The conventional suffix for a @code{QUAD} file is @file{.quad}. The file syntax is @example [C][N][4]QUAD -or- [C][N][4]POLY # Key word @var{vertex} @var{vertex} @var{vertex} @var{vertex} # 4*N vertices for some N @var{vertex} @var{vertex} @var{vertex} @var{vertex} @dots{} @end example The leading key word is @code{[C][N][4]QUAD} or @code{[C][N][4]POLY}, where the optional @code{C} and @code{N} prefixes indicate that each vertex includes colors and normals respectively. That is, these files begin with one of the words @code{QUAD} @code{CQUAD} @code{NQUAD} @code{CNQUAD} @code{POLY} @code{CPOLY} @code{NPOLY} @code{CNPOLY} (but not @code{NCQUAD} or @code{NCPOLY}). @code{QUAD} and @code{POLY} are synonymous; both forms are allowed just for compatibility with ChapReyes. Following the key word is an arbitrary number of groups of four vertices, each group describing a quadrilateral. See the Vertex syntax above. The object ends at end-of-file, or with a close-brace if incorporated into an object reference (see above). A @code{QUAD BINARY} file format is accepted; @xref{Binary format}. The first word of binary data must be a 32-bit integer giving the number of quads in the object; following that is a series of 32-bit floats, arranged just as in the ASCII format. @comment ---------------------------------------------------------------- @node MESH, BBOX, QUAD, Object File Formats @subsection MESH: rectangularly-connected mesh The conventional suffix for a @code{MESH} file is @file{.mesh}. The file syntax is @example [U][C][N][Z][4][u][v][n]MESH # Key word [@var{Ndim}] # Space dimension, present only if nMESH @var{Nu} @var{Nv} # Mesh grid dimensions # @var{Nu}*@var{Nv} vertices, in format specified # by initial key word @var{vertex}(u=0,v=0) @var{vertex}(1,0) @dots{} @var{vertex}(@var{Nu}-1,0) @var{vertex}(0,1) @dots{} @var{vertex}(@var{Nu}-1,1) @dots{} @var{vertex}(0,@var{Nv}-1) @dots{} @var{vertex}(@var{Nu}-1,@var{Nv}-1) @end example The key word is @code{[U][C][N][Z][4][u][v][n]MESH}. The optional prefix characters mean: @table @samp @item U Each vertex includes a 3-component texture space parameter. The first two components are the usual @code{S} and @code{T} texture parameters for that vertex; the third should be specified as zero. @item C Each vertex (see Vertices above) includes a 4-component color. @item N Each vertex includes a surface normal vector. @item Z Of the 3 vertex position values, only the Z component is present; X and Y are omitted, and assumed to equal the mesh (u,v) coordinate so X ranges from 0 .. (Nu-1), Y from 0 .. (Nv-1) where Nu and Nv are the mesh dimensions -- see below. @item 4 Vertices are 4D, each consists of 4 floating values. @code{Z} and @code{4} cannot both be present. @item u The mesh is wrapped in the u-direction, so the (0,v)'th vertex is connected to the (@var{Nu}-1,v)'th for all v. @item v The mesh is wrapped in the v-direction, so the (u,0)'th vertex is connected to the (u,@var{Nv}-1)'th for all u. Thus a u-wrapped or v-wrapped mesh is topologically a cylinder, while a uv-wrapped mesh is a torus. @item n Specifies a mesh whose vertices live in a higher dimensional space. The dimension follows the "MESH" keyword. Each vertex then has @var{Ndim} components. @end table Note that the order of prefix characters is significant; a colored, u-wrapped mesh is a @code{CuMESH} not a @code{uCMESH}. Following the mesh header are integers @var{Nu} and @var{Nv}, the dimensions of the mesh. Then follow @var{Nu}*@var{Nv} vertices, each in the form given by the header. They appear in v-major order, i.e. if we name each vertex by (u,v) then the vertices appear in the order @example (0,0) (1,0) (2,0) (3,0) @dots{} (@var{Nu}-1,0) (0,1) (1,1) (2,1) (3,1) @dots{} (@var{Nu}-1,1) @dots{} (0,Nv-1) @dots{} (@var{Nu}-1,@var{Nv}-1) @end example A @code{MESH BINARY} format is accepted; @xref{Binary format}. The values of @var{Nu} and @var{Nv} are 32-bit integers; all other values are 32-bit floats. @comment ---------------------------------------------------------------- @node BBOX, BBP and BEZ, MESH, Object File Formats @subsection BBOX: simple bounding boxes This is a very simple toy-object: it takes 2 vertices and draws a (hyper-) cube which is the bounding box of the two vertices. Syntax: @example BBOX @var{x}[0] @var{y}[0] @var{z}[0] @var{x}[1] @var{y}[1] @var{z}[1] @end example or @example 4BBOX @var{x}[0] @var{y}[0] @var{z}[0] @var{w}[0] @var{x}[1] @var{y}[1] @var{z}[1] @var{w}[1] @end example or @example nBBOX @var{Ndim} # > 3 @var{x}[0] @var{y}[0] @var{z}[0] @var{w}[0] @dots{} @var{x}[1] @var{y}[1] @var{z}[1] @var{w}[1] @dots{} @end example or @example 4nBBOX @var{Ndim} # > 3 @var{d}[0] @var{x}[0] @var{y}[0] @var{z}[0] @var{w}[0] @dots{} @var{d}[0] @var{x}[1] @var{y}[1] @var{z}[1] @var{w}[1] @dots{} @end example There is no BBOX binary format. The @code{4} modifyer has different meanings depending on the dimension of the bounding box: @code{4BBOX} means that the 4 components of the vertices make up a 4-dimensional bounding-box. Using @code{4} in conjunction with @code{n} -- @code{4nBBOX @var{NDim}} -- means that the vertices specified in the file have @var{NDim+1} components, but the component at index 0 is the homogeneous divisor (in contrast to the ordinary 3d case where the homogeneous divisor would be the @code{w} -- the third -- component). @comment ---------------------------------------------------------------- @node BBP and BEZ, OFF, BBOX, Object File Formats @subsection Bezier Surfaces The conventional file suffixes for Bezier surface files are @file{.bbp} or @file{.bez}. A file with either suffix may contain either type of patch. Syntax: @example [ST]BBP -or- [C]BEZ<@var{Nu}><@var{Nv}><@var{Nd}>[_ST] # @var{Nu}, @var{Nv} are u- and v-direction # polynomial degrees in range 1..6 # @var{Nd} = dimension: 3->3-D, 4->4-D (rational) # (The '<' and '>' do not appear in the input.) # @var{Nu},@var{Nv},@var{Nd} are each a single decimal digit. # BBP form implies @var{Nu}=@var{Nv}=@var{Nd}=3 so BBP = BEZ333. # Any number of patches follow the header # (@var{Nu}+1)*(@var{Nv}+1) patch control points # each 3 or 4 floats according to header @var{vertex}(u=0,v=0) @var{vertex}(1,0) @dots{} @var{vertex}(@var{Nu},0) @var{vertex}(0,1) @dots{} @var{vertex}(@var{Nu},1) @dots{} @var{vertex}(0,@var{Nv}) @dots{} @var{vertex}(@var{Nu},@var{Nv}) # ST texture coordinates if mentioned in header @code{S}(u=0,v=0) @code{T}(0,0) @code{S}(0,@var{Nv}) @code{T}(0,@var{Nv}) @code{S}(@var{Nu},0) @code{T}(@var{Nu},0) @code{S}(@var{Nu},@var{Nv}) @code{T}(@var{Nu},@var{Nv}) # 4-component float (0..1) R G B A colors # for each patch corner if mentioned in header @code{RGBA}(0,0) @code{RGBA}(0,@var{Nv}) @code{RGBA}(@var{Nu},0) @code{RGBA}(@var{Nu},@var{Nv}) @end example These formats represent collections of Bezier surface patches, of degrees up to 6, and with 3-D or 4-D (rational) vertices. The header keyword has the forms @code{[ST]BBP} or @code{[C]BEZ<@var{Nu}><@var{Nv}><@var{Nd}>[_ST]} (the '<' and '>' are not part of the keyword. The @code{ST} prefix on @code{BBP}, or @code{_ST} suffix on @code{BEZuvn}, indicates that each patch includes four pairs of floating-point texture-space coordinates, one for each corner of the patch. The @code{C} prefix on @code{BEZuvn} indicates a colored patch, including four sets of four-component floating-point colors (red, green, blue, and alpha) in the range 0..1, one color for each corner. @var{Nu} and @var{Nv}, each a single digit in the range 1..6, are the patch's polynomial degree in the u and v direction respectively. @var{Nd} is the number of components in each patch vertex, and must be either @code{3} for 3-D or @code{4} for homogeneous coordinates, that is, rational patches. @code{BBP} patches are bicubic patches with 3-D vertices, so @code{BBP} = @code{BEZ333} and @code{STBBP} = @code{BEZ333_ST}. Any number of patches follow the header. Each patch comprises a series of patch vertices, followed by optional (s,t) texture coordinates, followed by optional (r,g,b,a) colors. Each patch has (@var{Nu}+1)*(@var{Nv}+1) vertices in v-major order, so that if we designate a vertex by its control point indices (u,v) the order is @example (0,0) (1,0) (2,0) @dots{} (@var{Nu},0) (0,1) (1,1) (2,1) @dots{} (@var{Nu},1) @dots{} (0,@var{Nv}) @dots{} (@var{Nu},@var{Nv}) @end example @noindent with each vertex containing either 3 or 4 floating-point numbers as specified by the header. If the header calls for ST coordinates, four pairs of floating-point numbers follow: the texture-space coordinates for the (0,0), (@var{Nu},0), (0,@var{Nv}), and (@var{Nu},@var{Nv}) corners of the patch, respectively. If the header calls for colors, four four-component (red, green, blue, alpha) floating-point colors follow, one for each patch corner. The series of patches ends at end-of-file, or with a closebrace if incorporated in an object reference. @comment ---------------------------------------------------------------- @node OFF, VECT, BBP and BEZ, Object File Formats @subsection OFF Files The conventional suffix for @code{OFF} files is @file{.off}. Syntax: @example [ST][C][N][4][n]OFF # Header keyword [@var{Ndim}] # Space dimension of vertices, present only if nOFF @var{NVertices} @var{NFaces} @var{NEdges} # NEdges not used or checked @var{x}[0] @var{y}[0] @var{z}[0] # Vertices, possibly with normals, # colors, and/or texture coordinates, in that order, # if the prefixes @code{N}, @code{C}, @code{ST} # are present. # If 4OFF, each vertex has 4 components, # including a final homogeneous component. # If nOFF, each vertex has @var{Ndim} components. # If 4nOFF, each vertex has @var{Ndim}+1 components. @dots{} @var{x}[@var{NVertices}-1] @var{y}[@var{NVertices}-1] @var{z}[@var{NVertices}-1] # Faces # @var{Nv} = # vertices on this face # @var{v}[0] @dots{} @var{v}[@var{Nv}-1]: vertex indices # in range 0..@var{NVertices}-1 @var{Nv} @var{v}[0] @var{v}[1] @dots{} @var{v}[@var{Nv}-1] @var{colorspec} @dots{} # @var{colorspec} continues past @var{v}[@var{Nv}-1] # to end-of-line; may be 0 to 4 numbers # nothing: default # integer: colormap index # 3 or 4 integers: RGB[A] values 0..255 # 3 or 4 floats: RGB[A] values 0..1 @end example @code{OFF} files (name for "object file format") represent collections of planar polygons with possibly shared vertices, a convenient way to describe polyhedra. The polygons may be concave but there's no provision for polygons containing holes. An @code{OFF} file may begin with the keyword @code{OFF}; it's recommended but optional, as many existing files lack this keyword. Three ASCII integers follow: @var{NVertices}, @var{NFaces}, and @var{NEdges}. These are the number of vertices, faces, and edges, respectively. Current software does not use nor check @var{NEdges}; it needn't be correct but must be present. The vertex coordinates follow: dimension * @var{Nvertices} floating-point values. They're implicitly numbered 0 through @var{NVertices}-1. dimension is either 3 (default) or 4 (specified by the key character @code{4} directly before @code{OFF} in the keyword). Following these are the face descriptions, typically written with one line per face. Each has the form @example @var{N} @var{Vert1} @var{Vert2} @dots{} @var{VertN} [@var{color}] @end example @noindent Here @var{N} is the number of vertices on this face, and @var{Vert1} through @var{VertN} are indices into the list of vertices (in the range 0..@var{NVertices}-1). The optional @var{color} may take several forms. Line breaks are significant here: the @var{color} description begins after @var{VertN} and ends with the end of the line (or the next # comment). A @var{color} may be: @table @asis @item nothing the default color @item one integer index into "the" colormap; see below @item three or four integers RGB and possibly alpha values in the range 0..255 @item three or four floating-point numbers RGB and possibly alpha values in the range 0..1 @end table For the one-integer case, the colormap is currently read from the file @file{cmap.fmap} in Geomview's @file{data} directory. Some better mechanism for supplying a colormap is likely someday. The meaning of "default color" varies. If no face of the object has a color, all inherit the environment's default material color. If some but not all faces have colors, the default is gray (R,G,B,A=.666). A @code{[ST][C][N][n]OFF BINARY} format is accepted; @xref{Binary format}. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions (and texture coordinates or vertex colors or normals if @code{COFF}/@code{NOFF}/@code{CNOFF}/@code{STCNOFF}/etc. format). Exception: each face's vertex indices are followed by an integer indicating how many color components accompany it. Face color components must be floats, not integer values. Thus a colorless triangular face might be represented as @example int int int int int 3 17 5 9 0 @end example while the same face colored red might be @example int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0 @end example @comment ---------------------------------------------------------------- @node VECT, SKEL, OFF, Object File Formats @subsection VECT Files The conventional suffix for @code{VECT} files is @file{.vect}. Syntax: @example [4]VECT @var{NPolylines} @var{NVertices} @var{NColors} @var{Nv[0]} @dots{} @var{Nv[NPolylines-1]} # number of vertices # in each polyline @var{Nc[0]} @dots{} @var{Nc[NPolylines-1]} # number of colors supplied # in each polyline @var{Vert[0]} @dots{} @var{Vert[NVertices-1]} # All the vertices # (3*NVertices floats) @var{Color[0]} @dots{} @var{Color[NColors-1]} # All the colors # (4*NColors floats, RGBA) @end example @code{VECT} objects represent lists of polylines (strings of connected line segments, possibly closed). A degenerate polyline can be used to represent a point. A @code{VECT} file begins with the key word @code{VECT} or @code{4VECT} and three integers: @var{NLines}, @var{NVertices}, and @var{NColors}. Here @var{NLines} is the number of polylines in the file, @var{NVertices} the total number of vertices, and @var{NColors} the number of colors as explained below. Next come @var{NLines} @b{16-bit} integers @center @var{Nv[0]} @var{Nv[1]} @var{Nv[2]} @dots{} @var{Nv[NLines-1]} giving the number of vertices in each polyline. A negative number indicates a closed polyline; 1 denotes a single-pixel point. The sum (of absolute values) of the @var{Nv[i]} must equal @var{NVertices}. Next come @var{NLines} more @b{16-bit} integers @var{Nc[i]}: the number of colors in each polyline. Normally one of three values: @table @asis @item 0 No color is specified for this polyline. It's drawn in the same color as the previous polyline. @item 1 A single color is specified. The entire polyline is drawn in that color. @item abs(@var{Nv[i]}) Each vertex has a color. Either each segment is drawn in the corresponding color, or the colors are smoothly interpolated along the line segments, depending on the implementation. @end table Next come @var{NVertices} groups of 3 or 4 floating-point numbers: the coordinates of all the vertices. If the keyword is @var{4VECT} then there are 4 values per vertex. The first abs(@var{Nv[0]}) of them form the first polyline, the next abs(@var{Nv[1]}) form the second and so on. Finally @var{NColors} groups of 4 floating-point numbers give red, green, blue and alpha (opacity) values. The first @var{Nc[0]} of them apply to the first polyline, and so on. A @var{VECT BINARY} format is accepted; @pxref{Binary format}. The binary format exactly follows the ASCII format, with 32-bit Big-Endian integers where ordinary integer numbers appear, and with @b{16-bit} Big-Endian integers where 16-bit integers appear; 32-bit Big-Endian floats where real values appear. @b{BIG FAT NOTE:} The vertex counts @var{Nv[i]} and the color counts @var{Nc[i]} are @b{16-bit} Big-Endian integers. @comment ---------------------------------------------------------------- @node SKEL, SPHERE, VECT, Object File Formats @subsection SKEL Files @code{SKEL} files represent collections of points and polylines, with shared vertices. The conventional suffix for @code{SKEL} files is @file{.skel}. Syntax: @example [C][4][n]SKEL [@var{NDim}] # Vertex dimension, present only if nSKEL @var{NVertices} @var{NPolylines} @var{x}[0] @var{y}[0] @var{z}[0] # Vertices # if 4SKEL, each vertex has 4 components # if nSKEL, each vertex has NDim components # if C[4][n]SKEL vertex coordinates are # followed by an RGBA color specification @dots{} @var{x}[@var{NVertices}-1] @var{y}[@var{NVertices}-1] @var{z}[@var{NVertices}-1] # Polylines # @var{Nv} = vertices on this polyline (1 = point) # @var{v}[0] @dots{} @var{v}[@var{Nv}-1]: vertex indices # in range 0..@var{NVertices}-1 @var{Nv} @var{v}[0] @var{v}[1] @dots{} @var{v}[@var{Nv}-1] [@var{colorspec}] @dots{} # @var{colorspec} continues past @var{v}[@var{Nv}-1] # to end-of-line; may be nothing, or 3 or 4 numbers. # nothing: default color # 3 or 4 floats: RGB[A] values 0..1 @end example The syntax resembles that of @code{OFF} files, with a table of vertices followed by a sequence of polyline descriptions, each referring to vertices by index in the table. Each polyline has an optional color. For @code{nSKEL} objects, each vertex has @var{NDim} components. For @code{4nSKEL} objects, each vertex has @var{NDim+1} components; the final component is the homogeneous divisor. A @var{[4][n]SKEL BINARY} format is accepted; @xref{Binary format}. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions. Exception: each polyline's vertex indices are followed by an integer indicating how many color components accompany it. Polyline color components must be floats, not integer values. Thus a colorless polyline with 3 vertices might be represented as @example int int int int int 3 17 5 9 0 @end example while the same polyline colored red might be @example int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0 @end example @comment ---------------------------------------------------------------- @node SPHERE, INST, SKEL, Object File Formats @subsection SPHERE Files The conventional suffix for @code{SPHERE} files is @file{.sph}. @example [ST][E|H|S]SPHERE # Keyword # auto-generated texture co-ordinates, only allowed with @emph{ST}SPHERE objects [SINUSOIDAL|CYLINDRICAL|RECTANGULAR|STEREOGRAPHIC|ONEFACE] # next four fields are required @var{Radius} @var{Xcenter} @var{Ycenter} @var{Zcenter} @end example The key word is @code{[ST][E|H|S]SPHERE}. The optional prefix characters mean: @table @samp @item ST The sphere carries automatically generated texture co-ordinates. See below. @item E The sphere lives in Euclidean space. @item H The sphere lives in Hyperbolic space. @xref{Non-Euclidean Geometry}. @item S The sphere lives in spherical space. @xref{Non-Euclidean Geometry}. @end table Sphere objects are drawn using meshes which are rectangular in a polar co-ordinate system, with the equatorial plane parallel to the @code{x,y}-plane. Their smoothness, and the time taken to draw them, depends on the setting of the dicing level, 10x10 by default. From Geomview, the Appearance panel, the @code{ad} keyboard command, or a @code{dice nu nv} Appearance attribute sets this. Texture co-ordinates are generated for @code{STSPHERE} objects; the keyword following the initial @code{STSPHERE} keyword defines the way this is done. It follows the conventions of the @command{mktxmesh} Perl-script which comes with the @emph{Orrery}. @table @var @item SINUSOIDAL sinusoidal equal-area projection @item CYLINDRICAL cylindrical proj: @var{s} is the longitude, @var{t} is the latitude @item RECTANGULAR rectangular proj: @var{s} is the longitude, @var{t} is @code{sin(latitude)} (i.e. @code{z} co-ordinate in the sphere's co-ordinate system) @item STEREOGRAPHIC stereographic projection from the south (@code{z=-1}) pole @item ONEFACE stretch orthographic view of @code{+y} hemisphere over both, mirroring @end table @comment ---------------------------------------------------------------- @node INST, LIST, SPHERE, Object File Formats @subsection INST Files The conventional suffix for a @code{INST} file is @file{.inst}. There is no INST BINARY format. An @code{INST} applies a 4x4 (or @var{(N+1)}x@var{(N+1)} in the context of ND-viewing) transformation to another OOGL object. It begins with @code{INST} followed by these sections which may appear in any order: @example geom @var{oogl-object} @end example @noindent specifies the OOGL object to be instantiated. @xref{References}, for the syntax of an @var{oogl-object}. The keyword @code{unit} is a synonym for @code{geom}. @example transform ["@{"] @code{4x4 transform} ["@}"] @end example @noindent specifies a single transformation matrix. Either the matrix may appear literally as 16 numbers, or there may be a reference to a "transform" object, i.e. @example "<" file-containing-4x4-matrix @end example or @example ":" symbol-representing-transform-object @end example Another way to specify the transformation is @example transforms @var{oogl-object} @end example The @var{oogl-object} must be a @code{TLIST} object (list of transformations) object, or a @code{LIST} whose members are ultimately @code{TLIST} objects. In effect, the @code{transforms} keyword takes a collection of 4x4 matrices and replicates the @code{geom} object, making one copy for each 4x4 matrix. If no @code{transform} nor @code{transforms} keyword appears, no transformation is applied (actually the identity is applied). You could use this for, e.g., wrapping an appearance around an externally-supplied object, though a single-membered LIST would do this more efficiently. @xref{Transformation matrices}, for the matrix format. When replicating a single geometry by means of a @code{TLIST} object (see @samp{transforms} above) it may be useful to transform texture co-ordinates by another list of transformations; that list can be specified by @example txtransforms @var{TLIST-object} @end example The number of texture transformations must match the number of geometry transformations. The @code{SPHERE} object (@pxref{SPHERE, Sphere Objects}) uses this technique to generate an entire textured sphere out of some fraction of a sphere (usually one octant). A single @var{(N+1)}-dimensional transformation can be specified by @example ntransform ["@{"] @var{N+1} @var{N+1} @code{(N+1)x(N+1) floats} ["@}"] @end example @noindent This gives a single @var{N+1}-dimensional transformation matrix. Either the matrix may appear literally as @var{(N+1)}x@var{(N+1)} numbers, or there may be a reference to an @samp{ntransform} object, i.e. @example "<" file-containing-@var{(N+1)}x@var{(N+1)}-matrix @end example or @example ":" symbol-representing-ntransform-object @end example @xref{ND Transformation matrices}, for the matrix format. Two more INST fields are accepted: @code{location} and @code{origin}. Note that @code{location} as well as @code{origin} are ignored if this @code{INST} object carries an @code{ntransform}. Also, if ND-viewing is active (@code{ND-axes} command, @pxref{GCL}) then @code{INST} objects with @code{origin} unequal to @code{local} will not be drawn, though the @code{location} stuff may work (or not). @example location [global or camera or ndc or screen or local] @end example Normally an INST specifies a position relative to its parent object; the @code{location} field allows putting an object elsewhere. @itemize @bullet @item @code{location global} attaches the object to the global (a.k.a. universe) coordinate system -- the same as that in which geomview's World objects, alien geometry, and cameras are placed. @item @code{location camera} places the object relative to the camera. (Thus if there are multiple views, it may appear in a different spatial position in each view.) The center of the camera's view is along its negative Z axis; positive X is rightward, positive Y upward. Normally the units of camera space are the same as global coordinates. When a camera is reset, the global origin is at (0,0,-3.0). @item @code{location ndc} places the object relative to the normalized unit cube into which the camera's projection (perspective or orthographic) maps the visible world. X, Y, and Z are each in the range from -1 to +1, with Z = -1 the near and Z = +1 the far clipping plane, and X and Y increasing rightward and upward respectively. Thus something like @example INST transform 1 0 0 0 0 1 0 0 0 0 1 0 -.9 -.9 -.999 1 location ndc geom < label.vect @end example pastes @code{label.vect} onto the lower left corner of each window, and in front of nearly everything else, assuming @code{label.vect}'s contents lie in the positive quadrant of the X-Y plane. It's tempting to use -1 rather than -.999 as the Z component of the position, but that may put the object just nearer than the near clipping plane and make it (partially) invisible, due to floating-point error. @item @code{location screen} places the object in screen coordinates. The range of Z is still -1 through +1 as for ndc coordinates; X and Y are measured in pixels, and range from (0,0) at the @emph{lower left} corner of the window, increasing rightward and upward. @end itemize @code{location local} is the default; the object is positioned relative to its parent. @example origin [global or camera or ndc or screen or local] x y z @end example The @code{origin} field translates the contents of the INST to place the origin at the specified point of the given coordinate system. Unlike @code{location}, it doesn't change the orientation, only the choice of origin. Both @code{location} and @code{origin} can be used together. So for example @example @{ INST location screen origin ndc 0 0 -.99 geom @{ < xyz.vect @} transform @{ 100 0 0 0 0 100 0 0 0 0 -.009 0 0 0 0 1 @} @} @end example places xyz.vect's origin in the center of the window, just beyond the near clipping plane. The unit-length X and Y edges are scaled to be just 100 screen units -- pixels -- long, regardless of the size of the window. @menu * INST Examples:: Some example of @code{INST} Files. @end menu @comment ................................................................ @node INST Examples, , INST, INST @subsubsection INST Examples Here are some examples of @code{INST} files @example INST unit < xyz.vect transform @{ 1 0 0 0 0 1 0 0 0 0 1 0 1 3 0 1 @} @end example @example @{ appearance @{ +edge material @{ edgecolor 1 1 0 @} @} INST geom < mysurface.quad @} @end example @example @{INST transform @{: T@} geom @{ @} @} geom @{ # stuff replicated by all the above matrices @dots{} @} @} @end example This one resembles the @code{origin} example in the section above, but makes the X and Y edges be 1/4 the size of the window (1/4, not 1/2, since the range of ndc X and Y coordinates is -1 to +1). @example @{ INST location ndc geom @{ < xyz.vect @} transform @{ .5 0 0 0 0 .5 0 0 0 0 -.009 0 0 0 -.99 1 @} @} @end example @comment ---------------------------------------------------------------- @node LIST, TLIST, INST, Object File Formats @subsection LIST Files The conventional suffix for a @code{LIST} file is @file{.list}. A list of OOGL objects Syntax: @example LIST @var{oogl-object} @var{oogl-object} @dots{} @end example Note that there's no explicit separation between the oogl-objects, so they should be enclosed in curly braces (@{ @}) for sanity. Likewise there's no explicit marker for the end of the list; unless appearing alone in a disk file, the whole construct should also be wrapped in braces, as in: @example @{ LIST @{ QUAD @dots{} @} @{ < xyz.quad @} @} @end example A @code{LIST} with no elements, i.e. @code{@{ LIST @}}, is valid, and is the easiest way to create an empty object. For example, to remove a symbol's definition you might write @example @{ define somesymbol @{ LIST @} @} @end example @comment ---------------------------------------------------------------- @node TLIST, GROUP, LIST, Object File Formats @subsection TLIST Files The conventional suffix for a @code{TLIST} file is @file{.grp} ("group") or @file{.prj} ("projective" matrices). Collection of 4x4 matrices, used in the @code{transforms} section of and @code{INST} object. Syntax: @example TLIST # key word <4x4 matrix (16 floats)> @dots{} # any number of 4x4 matrices transform @{ # reference to a transform object @} tlist @{ # nested TLIST @} @end example @code{TLIST}s are used only within the @code{transforms} clause of an @code{INST} object. They cause the @code{INST}s @code{geom} object to be instantiated once under each of the transforms in the @code{TLIST}. The effect is like that of a @code{LIST} of @code{INST}s each with a single transform, and all referring to the same object, but is more efficient. @code{TLIST}s can be nested: effectively this means that all transformations in each nested @code{TLIST} object are multiplied (from the left) by the transformations in the outer @code{TLIST} object. Be aware that a @code{TLIST} is a kind of geometry object, distinct from a @code{transform} object. Some contexts expect one type of object, some the other. For example in @example INST transform @{ : @var{myT} @} geom @{ @dots{} @} @end example @noindent @var{myT} must be a transform object, which might have been created with the GCL @example (read transform @{ define myT 1 0 0 1 @dots{} @}) @end example @noindent while in @example INST transforms @{ : @var{myTs} @} geom @{ @dots{} @} or INST transforms @{ LIST @{: @var{myTs}@} @{< more.prj@} @} geom @{ @dots{} @} @end example @noindent @var{myTs} must be a geometry object, defined e.g. with @example (read geometry @{ define @var{myTs} @{ TLIST 1 0 0 1 @dots{} @} @}) @end example A @code{TLIST BINARY} format is accepted. Binary data begins with a 32-bit integer giving the number of transformations, followed by that number of 4x4 matrices in 32-bit floating-point format. The order of matrix elements is the same as in the ASCII format. @comment ---------------------------------------------------------------- @node GROUP, DISCGRP, TLIST, Object File Formats @subsection GROUP Files This format is obsolete, but is still accepted. It combined the functions of @code{INST} and @code{TLIST}, taking a series of transformations and a single Geom (@code{unit}) object, and replicating the object under each transformation. @example GROUP @dots{} < matrices > @dots{} unit @{ @var{oogl-object} @} @end example is still accepted and effectively translated into @example INST transforms @{ TLIST @dots{} @dots{} @} unit @{ @var{oogl-object} @} @end example @comment ---------------------------------------------------------------- @node DISCGRP, COMMENT, GROUP, Object File Formats @subsection DISCGRP Files This format is for discrete groups, such as appear in the theory of manifolds or in symmetry patterns. This format has its own man page. See discgrp(5). @comment ---------------------------------------------------------------- @node COMMENT, , DISCGRP, Object File Formats @subsection COMMENT Objects The COMMENT object is a mechanism for encoding arbitrary data within an OOGL object. It can be used to keep track of data or pass data back and forth between external modules. Syntax: @example COMMENT # key word @var{name} @var{type} # individual name and type specifier @{ @dots{} @} # arbitrary data @end example The data, which must be enclosed by curly braces, can include anything except unbalanced curly braces. The @var{type} field can be used to identify data of interest to a particular program through naming conventions. @code{COMMENT} objects are intended to be associated with other objects through inclusion in a @code{LIST} object. (@xref{LIST}.) The "#" OOGL comment syntax does not suffice for data exchange since these comments are stripped when an OOGL object is read in to Geomview. The @code{COMMENT} object is preserved when loaded into Geomview and is written out intact. Here is an example associating a WorldWide Web URL with a piece of geometry: @example @{ LIST @{ < Tetrahedron@} @{COMMENT GCHomepage HREF @{ http://www.geomview.org/ @}@} @} @end example A binary @code{COMMENT} format is accepted. Its format is not consistent with the other OOGL binary formats. @xref{Binary format}. The @code{name} and @code{type} are followed by @example @var{N} @var{Byte1} @var{Byte2} @dots{} @var{ByteN} @end example instead of data enclosed in curly braces. @comment ================================================================ @node Non-geometric objects, , Object File Formats, OOGL File Formats @section Non-geometric objects The syntax of these objects is given in the form used in @xref{References}, where "quoted" items should appear literally but without quotes, square bracketed ([ ]) items are optional, and | separates alternative choices. @menu * appearance objects:: Appearance objects. * image objects:: Image objects. * transform objects:: Transformation matrices. * ntransform objects:: N-dimensional transformation matrices. * camera objects:: Cameras. * window objects:: Windows. @end menu @comment ---------------------------------------------------------------- @node appearance objects, image objects, Non-geometric objects, Non-geometric objects @subsection Appearance Objects Appearances are OOGL objects of their own right, which simply means that it is possible to give them symbolic names (@pxref{References}). There are other sections dealing with appearance details. @xref{Appearances}. @node image objects, transform objects, appearance objects, Non-geometric objects @subsection Image Objects Image objects are used to specify pixmap data for either textures (@pxref{Texture Mapping}), or for background images of cameras (@pxref{camera, Camera objects}). At the time of this writing images are comprised of 1 to 4 channels, a channel provides a single number in the range from 0 to @code{maxval} for each pixel; and @code{maxval} is tied to 255. The interpretation of the image data depending on the number of channels is like follows: @multitable @columnfractions 0.2 0.2 0.6 @headitem #Channels @tab Channel No. @tab Interpretation @item 1 @tab 1 @tab greyscale or luminance data @item 2 @tab 1 @tab greyscale or luminance data @item @code{ } @tab 2 @tab alpha channel (0: transparent, @code{maxval}: opaque) @item 3 @tab 1 @tab red channel @item @code{} @tab 2 @tab green channel @item @code{} @tab 3 @tab blue channel @item 4 @tab 1 @tab red channel @item @code{} @tab 2 @tab green channel @item @code{} @tab 3 @tab blue channel @item @code{} @tab 4 @tab alpha channel (0: transparent, @code{maxval}: opaque) @end multitable Image data can be specified inline (embedded into the current data stream) or via file references; in both cases the data is read in and interpreted at the time the image object is parsed. @emph{This is different from the old (and deprecated) texture image specification, where the the image data on-disk would eventually be re-read by Geomview}. The general syntax of image objects is like follows: @example ::= [ "@{" ] (curly brace, generally needed to make the end of the object unambiguous.) [ "image" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines an image named , setting its value from the stuff which follows) | "<" (meaning: read image from that file) | ":" (meaning: use variable @var{name}, defined elsewhere; if undefined the image carries no data) | (actual stuff defining the image; image data must come last, after defining the width and height and number of channels) "width" (width of the image, auto-detected from image data if possible) "height" (height of the image, auto-detected from image data if possible) "channels" (number of channels, auto-detected from image data and @code{data} specifications, if possible) "maxval" (unsupported, must be @code{255} if specified) "data DESTMASK [FILTER] [@{] < FILENAME [@}]" "data DESTMASK [FILTER] DATASIZE [@{][\n]LITERAL_IMAGE_DATA[@}]" (either external or embedded image data, see below for a detailed description of the meaning of @emph{MASK} and @emph{FILTER}. An image can (and has, in general) multiple data sections.) [ "@}" ] (matching curly brace) @end example @b{Details concerning the image data specification:} @table @samp @item DESTMASK This is a bit-field describing where the specified image data should be placed in the destination pixmap. The bit-field is specified by an integer in one of the known formats (decimal, octal, hexadecimal). The channels of the source data are always enumbered consecutively. If, e.g. @samp{FILENAME} or @samp{LITERAL_IMAGE_DATA} specify a three-channel (probably RGB @dots{}) image and @samp{DESTMASK} equals @code{0xD} (i.e. bit 1 is 0), then the 3rd channel of the source pixmap would be placed in the 4th channel of the destination image object (the alpha channel), the 2nd source channel would determine the @samp{blue} destination value and the 1st source channel the @samp{red} destination value. The number of channels of the source data always has to match the number of bits set in @samp{DESTMASK}. @b{Exception:} if the source pixmap has only one channel, then it can be used to fill any number of destination channels; all channels specified in @samp{DESTMASK} are filled with the data of the single channel source pixmap. Geomview knows the following symbolic constants, which can be used instead of specifying the @samp{DESTMASK} bit-field numerically: @table @code @item LUMINANCE same as @samp{1}, @samp{0x1}, @samp{\01} @item LUMINANCE_ALPHA same as @samp{3}, @samp{0x3}, @samp{\03} @item RGB same as @samp{7}, @samp{0x7}, @samp{\07} @item RGBA same as @samp{15}, @samp{0xf}, @samp{\017} @item ALPHA depends on the context: the absolute number of channels must be known; i.e. @samp{data ALPHA @dots{}} must be prepended by something determining the number of channels of the image, e.g. @example ... data RGB ... data ALPHA ... @end example is valid, but @example data ALPHA ... @end example is not valid, because Geomview has not means to determine the destination channel from the context. @item AUTO PGM image data is interpreted as single grey-scale channel, RGB PNM data as RGB image data. @code{AUTO} cannot work with @samp{raw} image data. @end table @item FILTER The @samp{FILTER} specification is optional. If it is missing, then Geomview tries to determine the image type from the @samp{FILENAME} suffix. If there is no suffix or the suffix is unknown, or for embedded image data, Geomview is able to auto-detectc SGI image file formats (for historical reasons @dots{}) and NetPBM image formats (for practical reasons). The auto-detection of NetPBM formats includes the new @dfn{PAM} image format which allows (among other things) to store an alpha channel together with the luminance or RGB data. Likewise, the final output of any of the specified filters must either be in SGI image file format, or specify a PAM, PNM or PGM image. If the image file format cannot be determined by either the filenmae suffix or the filter specification or by auto-deteciong of SGI or NetPBM data, then Geomview assume that it is raw-data. See below. The decompression filters may be prepended to either one of the know image formats or an explicitly specified filter, e.g. the following is valid: @example data LUMINANCE raw.gzip @{ < gzippedgreymapfile @} @end example The above should be equivalent to @example data LUMINANCE raw @{ < greymapfile @}, @end example provided that the decompressed data carries single channel data, with the first pixel corresponding to the lower-left corner (because of the @samp{raw} image format, see below). Geomview has builtin knowledge for the following filters/suffixes: @table @b @item Data Decompression @table @samp @item z @item gz @item gzip data is piped through @samp{gzip -dc} @item bz2 @item bzip2 data is piped through @samp{bzip2 -dc} @end table @item Image Formats @table @samp @item tiff @item tif @code{TIFF} image file format. Only supported if the @code{tifftopnm} executable can be fond in the current excution path. @item png @code{PNG} image file format. Only supported if the @code{pngtopnm} executable can be fond in the current excution path. @item jpg @item jpeg @code{JPEG} image file format. Only supported if the @code{jpegtopnm} executable can be fond in the current excution path. @item gif @code{GIF} image file format. Only supported if the @code{giftoppm} executable can be fond in the current excution path. @item raw Raw image data; the number of channels must match the number of bits set in @samp{DESTMASK}. Pixels are specified with 1 byte per channel. The pixels are organized in rows as @samp{liminance[-alpha]} or @samp{RGB[A]} samples. The left-most pixel is the first pixel in each data-row, the top-most image row must come first (this is just the same as the NetPBM convention, the image co-ordinate systems has its origin in the left/top corner, as usual). @end table @item Explicitly Specified Filters If none of the suffixes specified above should match, then the suffix/filter is interpreted as an external filter program; the filter program must read from @code{STDIN} and write to @code{STDOUT}. The output must either be in SGI image format, or in PNM or PGM format. Otherwise the output data is interpreted as raw image data (see above). Something like the following should work, provided that the program @file{$@{HOME@}/bin/bububfilter} exists, is executable and does something useful: @example ... data RGB "$@{HOME@}/bin/bububfilter.bzip2" 7 @{ # binary data follows bububub @} ... @end example Note that -- prior to feeding the data to the @samp{bububfilter} -- Geomview will try to decompress the stuff with @samp{bzip2 -dc}. @end table @end table @b{Missing image data:} Normally, the number of image channels is determined automatically from the image @code{data} specifications; if the image specification carries an explicit number of channels via the @code{channels} keyword which exceeds the number of channels found in the image @code{data} specifications, or if the union of all @samp{DESTMASK} specfications has holes, then missing luminance and RGB channels are initialized to 0, and a missing alpha-channel is initialized to @code{maxval}, i.e. omitting the alpha channel data for an RGBA image is just the same as defining an RGB image. @node transform objects, ntransform objects, image objects, Non-geometric objects @subsection Transform Objects Where a single 4x4 matrix is expected -- as in the @code{INST} @code{transform} field, the camera's @code{camtoworld} transform and the Geomview @code{xform*} commands -- use a transform object. Note that a transform is distinct from a @code{TLIST}, which is a type of geometry. @code{TLIST}s can contain one or more 4x4 transformations; "transform" objects must have exactly one. Why have both? In many places -- e.g. camera positioning -- it's only meaningful to have a single transform. Using a separate object type enforces this. Syntax for a transform object is @example ::= [ "@{" ] (curly brace, generally needed to make the end of the object unambiguous.) [ "transform" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines a transform named , setting its value from the stuff which follows) (interpreted as a 4x4 homogeneous transform given row by row, intended to apply to a row vector multiplied on its LEFT, so that e.g. Euclidean translations appear in the bottom row) | "<" (meaning: read transform from that file) | ":" (meaning: use variable , defined elsewhere; if undefined the initial value is the identity transform) [ "@}" ] (matching curly brace) @end example The whole should be enclosed in @{ braces @}. Braces are not essential if exactly one of the above items is present, so e.g. a 4x4 array of floats standing alone may but needn't have braces. Some examples, in contexts where they might be used: @example # Example 1: A GCL command to define a transform # called "fred" (read transform @{ transform define fred 1 0 0 0 0 1 0 0 0 0 1 0 -3 0 1 1 @} ) @end example @example # Example 2: A camera object using transform # "fred" for camera positioning # Given the definition above, this puts the camera at # (-3, 0, 1), looking toward -Z. @{ camera halfyfield 1 aspect 1.33 camtoworld @{ : fred @} @} @end example @comment ---------------------------------------------------------------- @node ntransform objects, camera objects, transform objects, Non-geometric objects @subsection ND-Transform Objects Where -- in the context of ND-viewing -- a single (N+1)x(N+1) matrix is expected -- as in the @code{INST} @code{ntransform} field, or the @code{ND-xform*} (@pxref{GCL}) commands -- use an @code{ntransform} object. @code{ntransform} are @var{NRows} x @var{NCols} transformation matrix where usually @var{NRows} = @var{N+1} in the context of @var{N}-dimensional objects and viewing. The homogeneous component of an @code{ntransform} sits at column zero (in contrast to ordinary @code{transform} objects where it is located at column three). @code{ntransform} objects operate on points of any dimension: if a point is to be transformed by an @code{ntransform} object and the dimension of the point does not match the number of rows of the @code{ntransform} object, then either the point is implicitly padded with zeros to match @var{NRows} or the matrix is implicitly padded with ones down its diagonal (and zeros everywhere else) such that it will operate as identity on the excess dimensions of the input point. Syntax for an @code{ntransform} object is @example ::= [ "@{" ] (curly brace, generally needed to make the end of the object unambiguous.) [ "ntransform" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines a transform named , setting its value from the stuff which follows) @var{NRows} @var{NCols} (number of rows and columns of the matrix, typically @var{N+1} @var{N+1}, but any dimensions are possible) <@var{NRows} x @var{NCols} floating-point numbers> (interpreted as a @var{NRows} x @var{NCols} homogeneous transform given row by row, intended to apply to a row vector multiplied on its LEFT, so that e.g. Euclidean translations appear in the @b{top} row -- in contrast to the ordinary transform objects where the translations appear in the bottom row) | "<" (meaning: read transform from that file) | ":" (meaning: use variable , defined elsewhere; if undefined the initial value is the identity transform) [ "@}" ] (matching curly brace) @end example The whole should be enclosed in @{ braces @}. Braces are not necessarily essential, so e.g. two integers -- @var{NRows} @var{NCols} -- followed by a @var{NRows} x @var{NCols} array of floats standing alone may but needn't have braces. Some examples, in contexts where they might be used: @example # Example 1: A GCL command to define a @code{6x6} transform called # "fred", a mere translation by the vector @code{-3 0 1 1 0}. This # transform is meant for a five dimensional space, with an homogeneous # component a index zero. (read ntransform @{ ntransform define fred 6 6 1 -3 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 @} ) @end example @example # Example 2: Set the ND-xform of an object -- a geometry or a camera # cluster. Given the definition above, this puts the object at (-3 0 1 1 # 0) in the five dimensional space. (ND-xform-set focus : fred) # or (ND-xform-set g1 : fred) @end example @comment ---------------------------------------------------------------- @node camera objects, window objects, ntransform objects, Non-geometric objects @subsection cameras A camera object specifies the following properties of a camera: @table @asis @item position and orientation specified by either a camera-to-world or world-to-camera transformation; this transformation does not include the projection, so it's typically just a combination of translation and rotation. Specified as a transform object, typically a 4x4 matrix. @item "focus" distance Intended to suggest a typical distance from the camera to the object of interest; used for default camera positioning (the camera is placed at (X,Y,Z) = (0,0,focus) when reset) and for adjusting field-of-view when switching between perspective and orthographic views. @item window aspect ratio True aspect ratio in the sense /. This normally should agree with the aspect ratio of the camera's window. Geomview normally adjusts the aspect ratio of its cameras to match their associated windows. @item near and far clipping plane distances Note that both must be strictly greater than zero. Very large / distance ratios cause Z-buffering to behave badly; part of an object may be visible even if somewhat more distant than another. @item field of view Specified in either of two forms. @table @samp @item fov is the field of view -- in degrees if perspective, or linear distance if orthographic -- in the @emph{shorter} direction. @item halfyfield is half the projected Y-axis field, in world coordinates (not angle!), at unit distance from the camera. For a perspective camera, halfyfield is related to angular field: @center halfyfield = tan( Y_axis_angular_field / 2 ) while for an orthographic one it's simply: @center halfyfield = Y_axis_linear_field / 2 @end table This odd-seeming definition is (a) easy to calculate with and (b) well-defined in both orthographic and perspective views. @item background color Arguably not a property of a camera, but of the scene. Nevertheless, as there is no "background" OOGL object, and the background color should not be a property of the drawing device, it can be specified here. At the time of this writing, however, the GUI always overrides the background color with its own settings. @item background image Same reasoning as above, only that the GUI does not override this setting. The image is centered at NDC co-ordinates @code{(0,0,-1)}; it is not resized, just painted behind everything else as is. @xref{image, Image objects}. @end table The syntax for a camera is: @example ::= [ "camera" ] (optional keyword) [ "@{" ] (opening brace, generally required) [ "define" ] "<" | ":" | (or any number of the following, in any order@dots{}) "perspective" @{"0" | "1"@} (default 1) (otherwise orthographic) "stereo" @{"0" | "1"@} (default 0) (otherwise mono) "worldtocam" (see transform syntax above) "camtoworld" (no point in specifying both camtoworld and worldtocam; one is constrained to be the inverse of the other) "halfyfield" (default tan 40/2 degrees) "fov" (angular field-of-view if perspective, linear field-of-view otherwise. Measured in whichever direction is smaller, given the aspect ratio. When aspect ratio changes -- e.g. when a window is reshaped -- "fov" is preserved.) "frameaspect" (X/Y) (default 1.333) "near" (default 0.1) "far" (default 10.0) "focus" (default 3.0) "bgcolor" (default 1/3 1/3 1/3 1) "bgimage" @{ @} (default no background image) [ "@}" ] (matching closebrace) @end example @comment ---------------------------------------------------------------- @node window objects, , camera objects, Non-geometric objects @subsection window A window object specifies size, position, and other window-system related information about a window in a device-independent way. The syntax for a window object is: @example window ::= [ "window" ] (optional keyword) [ "@{" ] (curly brace, often required) (any of the following, in any order) "size" (size of the window) "position" (position & size) "noborder" (specifies the window should have no window border) "pixelaspect" (specifies the true visual aspect ratio of a pixel in this window in the sense xsize/ysize, normally 1.0. For stereo hardware which stretches the display vertically by a factor of 2, ``pixelaspect 0.5'' might do. The value is used when computing the projection of a camera associated with this window.) [ "@}" ] (matching closebrace) @end example Window objects are used in the Geomview @code{window} and @code{ui-panel} commands to set default properties for future windows or to change those of an existing window. @xref{window, @code{(window @dots{})}}. @xref{ui-panel, @code{(ui-panel @dots{})}}. @comment **************************************************************** @node Customization, Modules, OOGL File Formats, Top @chapter Customization: @file{.geomview} files When Geomview is started, it loads and executes commands in a system-wide startup file named @file{.geomview}. This file is in the @file{data} subdirectory of the Geomview distribution directory and contains GCL commands to configure Geomview in a way common to all users on the system. Next, Geomview looks for the file @file{~/.geomview} (@file{~} stands for your home directory). You can use this to configure your own default Geomview behavior to suit your tastes. After reading @file{~/.geomview}, Geomview looks for a file named @file{.geomview} in the current directory. If such a file exists Geomview reads it, unless it is the same as @file{~/.geomview} (which would be the case if you are running Geomview from your home directory). You can use the current directory's @file{.geomview} to create a Geomview customization specific to a certain project. You can use @file{.geomview} files to control all kinds of things about Geomview. They can contain any valid GCL statements. Especially useful is the @code{ui-panel} command which controls the initial placement of Geomview's panels. For an example see the system-wide @file{.geomview} file mentioned above. @xref{GCL}. @xref{ui-panel, @code{(ui-panel @dots{})}}. It is a good idea to enclose all the commands you put in a @file{.geomview} file in a @code{progn} statement in order to cause Geomview to execute them all at once. Otherwise Geomview might execute them sequentially over the first few refresh cycles after starting up. To change, e.g. the focus policy of the camera window such that they pick up the focus policy of the window manager (instead of being activated when the mouse cursor crosses the window), you could put the following in your @file{~/.geomview} file: @example (progn (ui-cam-focus focus-change) @dots{} # other stuff ) @end example You can put any valid @code{GCL} command into your @file{.geomview} files,@pxref{GCL}. @xref{progn,@code{(progn @dots{})}}. @xref{ui-cam-focus,@code{(ui-cam-focus @dots{})}}. @comment **************************************************************** @node Modules, GCL, Customization, Top @chapter External Modules An external module is a program that interacts with Geomview. A module communicates with Geomview through GCL and can control any apsect of Geomview that you can control through Geomview's user interface. In many cases an external module is a specialized program that implements some mathematical algorithm that creates a geometric object that changes shape as the algorithm progresses. The module informs Geomview of the new object shape at each step, so the object appears to evolve with time in the Geomview window. In this way Geomview serves as a @emph{display engine} for the module. An external module may be interactive. It can respond to mouse and keyboard events that take place in a Geomview window, thus extending the capability of Geomview itself. @menu * Interface:: How External Modules Interface with Geomview. * Example1:: Simple External Module. * Example2:: Simple External Module with FORMS Control Panel. * XForms:: The XForms library. * Example3:: External Module with Bi-Directional Communication. * Example4:: Simple Tcl/Tk Module Demonstrating Picking. * Module Installation:: Module Installation. @end menu @node Interface, Example1, Modules, Modules @section How External Modules Interface with Geomview External modules appear in the @emph{Modules} browser in Geomview's @emph{Main} panel. To run a module, click the left mouse button on the module's entry in the browser. While the module is running, an additional line for that module will appear in the browser. This line begins with a number in brackets, which indicates the @emph{instace} number of the module. (For some modules it makes sense to have more than one instance of the module running at the same time.) You can kill an external module by clicking on its instance entry. By default when Geomview starts, it displays all the modules that have been installed on your system. For instructions on installing a module on your system so that it will appear in the @emph{Modules} browser every time Geomview is run by anyone on your system, @xref{Module Installation}. When Geomview invokes an external module, it creates pipes connected to the module's standard input and output. (Pipes are like files except they are used for communication between programs rather than for storing things on a disk.) Geomview interprets anything that the module writes to its standard output as a GCL command. Likewise, if the external module requests any data from Geomview, Geomview writes that data to the module's standard input. Thus all a module has to do in order to communicate with Geomview is write commands to standard output and (optionally) receive data on standard input. Note that this means that the module cannot use standard input and output for communicating with the user. If a module needs to communicate with the user it can do so either through a control panel of its own or else by responding to certain events that it finds out about from Geomview. @node Example1, Example2, Interface, Modules @section Example 1: Simple External Module This section gives a very simple external module which displays an oscillating mesh. To try out this example, make a copy of the file @file{example1.c} (it is distributed with Geomview in the @file{doc} subdirectory) in your directory and compile it with the command @example cc -o example1 example1.c -lm @end example Then put the line @example (emodule-define "Example 1" "./example1") @end example @noindent in a file called @file{.geomview} in your current directory. Then invoke Geomview; it is important that you compile the example program, create the @file{.geomview} file, and invoke Geomview all in the same directory. You should see "Example 1" in the @emph{Modules} browser of Geomview's @emph{Main} panel; click on this entry in the browser to start the module. A surface should appear in your camera window and should begin oscillating. You can stop the module by clicking on the "[1] Example 1" line in the @emph{Modules} browser. @example @comment #include "example1.c" /* * example1.c: oscillating mesh * * This example module is distributed with the Geomview manual. * If you are not reading this in the manual, see the "External * Modules" chapter of the manual for more details. * * This module creates an oscillating mesh. */ #include #include /* F is the function that we plot */ float F(x,y,t) float x,y,t; @{ float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); @} main(argc, argv) char **argv; @{ int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t, dt; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Geomview setup. We begin by sending the command * (geometry example @{ : foo@}) * to Geomview. This tells Geomview to create a geom called * "example" which is an instance of the handle "foo". */ printf("(geometry example @{ : foo @})\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) @{ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); @} @} /* UpdateMesh sends one mesh iteration to Geomview. This consists of * a command of the form * (read geometry @{ define foo * MESH * ... * @}) * where ... is the actual data of the mesh. This command tells * Geomview to make the value of the handle "foo" be the specified * mesh. */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; @{ int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry @{ define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include #include /* for struct timeval below */ #include "forms.h" /* for FORMS library */ FL_FORM *OurForm; FL_OBJECT *VelocitySlider; float dt; /* F is the function that we plot */ float F(x,y,t) float x,y,t; @{ float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); @} /* SetVelocity is the slider callback procedure; FORMS calls this * when the user moves the slider bar. */ void SetVelocity(FL_OBJECT *obj, long val) @{ dt = fl_get_slider_value(VelocitySlider); @} /* Quit is the "Quit" button callback procedure; FORMS calls this * when the user clicks the "Quit" button. */ void Quit(FL_OBJECT *obj, long val) @{ exit(0); @} /* create_form_OurForm() creates the FORMS panel by calling a bunch of * procedures in the FORMS library. This code was generated * automatically by the FORMS designer program; normally this code * would be in a separate file which you would not edit by hand. For * simplicity of this example, however, we include this code here. */ create_form_OurForm() @{ FL_OBJECT *obj; FL_FORM *form; OurForm = form = fl_bgn_form(FL_NO_BOX,380.0,120.0); obj = fl_add_box(FL_UP_BOX,0.0,0.0,380.0,120.0,""); VelocitySlider = obj = fl_add_valslider(FL_HOR_SLIDER,20.0,30.0, 340.0,40.0,"Velocity"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_object_align(obj,FL_ALIGN_TOP); fl_set_call_back(obj,SetVelocity,0); obj = fl_add_button(FL_NORMAL_BUTTON,290.0,75.0,70.0,35.0,"Quit"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_call_back(obj,Quit,0); fl_end_form(); @} main(argc, argv) char **argv; @{ int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t; int fdmask; static struct timeval timeout = @{0, 200000@}; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Forms panel setup. */ foreground(); create_form_OurForm(); fl_set_slider_bounds(VelocitySlider, 0.0, 1.0); fl_set_slider_value(VelocitySlider, dt); fl_show_form(OurForm, FL_PLACE_SIZE, TRUE, "Example 2"); /* Geomview setup. */ printf("(geometry example @{ : foo @})\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) @{ fdmask = (1 << fileno(stdin)) | (1 << qgetfd()); select(qgetfd()+1, &fdmask, NULL, NULL, &timeout); fl_check_forms(); UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); @} @} /* UpdateMesh sends one mesh iteration to Geomview */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; @{ int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry @{ define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include "lisp.h" /* We use the OOGL lisp library */ #include "pickfunc.h" /* for PICKFUNC below */ #include "3d.h" /* for 3d geometry library */ /* boxstring gives the OOGL data to define the little box that * we draw at the pick point. NOTE: It is very important to * have a newline at the end of the OFF object in this string. */ char boxstring[] = "\ INST\n\ transform\n\ .04 0 0 0\n\ 0 .04 0 0\n\ 0 0 .04 0\n\ 0 0 0 1\n\ geom\n\ OFF\n\ 8 6 12\n\ \n\ -.5 -.5 -.5 # 0 \n\ .5 -.5 -.5 # 1 \n\ .5 .5 -.5 # 2 \n\ -.5 .5 -.5 # 3 \n\ -.5 -.5 .5 # 4 \n\ .5 -.5 .5 # 5 \n\ .5 .5 .5 # 6 \n\ -.5 .5 .5 # 7 \n\ \n\ 4 0 1 2 3\n\ 4 4 5 6 7\n\ 4 2 3 7 6\n\ 4 0 1 5 4\n\ 4 0 4 7 3\n\ 4 1 2 6 5\n"; progn() @{ printf("(progn\n"); @} endprogn() @{ printf(")\n"); fflush(stdout); @} Initialize() @{ extern LObject *Lpick(); /* This is defined by PICKFUNC below but must */ /* be used in the following LDefun() call */ LInit(); LDefun("pick", Lpick, NULL); progn(); @{ /* Define handle "littlebox" for use later */ printf("(read geometry @{ define littlebox @{ %s @}@})\n", boxstring); /* Express interest in pick events; see Geomview manual for explanation. */ printf("(interest (pick world * * * * nil nil nil nil nil))\n"); /* Define "pick" object, initially the empty list (= null object). * We replace this later upon receiving a pick event. */ printf("(geometry \"pick\" @{ LIST @} )\n"); /* Make the "pick" object be non-pickable. */ printf("(pickable \"pick\" no)\n"); /* Turn off normalization, so that our pick object will appear in the * right place. */ printf("(normalization \"pick\" none)\n"); /* Don't draw the pick object's bounding box. */ printf("(bbox-draw \"pick\" off)\n"); @} endprogn(); @} /* The following is a macro call that defines a procedure called * Lpick(). The reason for doing this in a macro is that that macro * encapsulates a lot of necessary stuff that would be the same for * this procedure in any program. If you write a Geomview module that * wants to know about user pick events you can just copy this macro * call and change the body to suit your needs; the body is the last * argument to the macro and is delimited by curly braces. * * The first argument to the macro is the name of the procedure to * be defined, "Lpick". * * The next two arguments are numbers which specify the sizes that * certain arrays inside the body of the procedure should have. * These arrays are used for storing the face and path information * of the picked object. In this module we don't care about this * information so we declare them to have length 1, the minimum * allowed. * * The last argument is a block of code to be executed when the module * receives a pick event. In this body you can refer to certain local * variables that hold information about the pick. For details see * Example 3 in the Extenal Modules chapter of the Geomview manual. */ PICKFUNC(Lpick, 1, 1, @{ handle_pick(pn>0, &point, vn>0, &vertex, en>0, edge); @}, /* version for picking Nd-objects (not documented here) */) handle_pick(picked, p, vert, v, edge, e) int picked; /* was something actually picked? */ int vert; /* was the pick near a vertex? */ int edge; /* was the pick near an edge? */ HPoint3 *p; /* coords of pick point */ HPoint3 *v; /* coords of picked vertex */ HPoint3 e[2]; /* coords of endpoints of picked edge */ @{ Normalize(&e[0]); /* Normalize makes 4th coord 1.0 */ Normalize(&e[1]); Normalize(p); progn(); @{ if (!picked) @{ printf("(geometry \"pick\" @{ LIST @} )\n"); @} else @{ /* * Put the box in place, and color it magenta if it's on a vertex, * yellow if not. */ printf("(xform-set pick @{ 1 0 0 0 0 1 0 0 0 0 1 0 %g %g %g 1 @})\n", p->x, p->y, p->z); printf("(geometry \"pick\"\n"); if (vert) printf("@{ appearance @{ material @{ diffuse 1 0 1 @} @}\n"); else printf("@{ appearance @{ material @{ diffuse 1 1 0 @} @}\n"); printf(" @{ LIST @{ :littlebox @}\n"); /* * If it's on an edge and not a vertex, mark the edge * with cyan boxes at the endpoins and a black line * along the edge. */ if (edge && !vert) @{ e[0].x -= p->x; e[0].y -= p->y; e[0].z -= p->z; e[1].x -= p->x; e[1].y -= p->y; e[1].z -= p->z; printf("@{ appearance @{ material @{ diffuse 0 1 1 @} @}\n\ LIST\n\ @{ INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox @}\n\ @{ INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox @}\n\ @{ VECT\n\ 1 2 1\n\ 2\n\ 1\n\ %f %f %f\n\ %f %f %f\n\ 1 1 0 1\n\ @}\n\ @}\n", e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z, e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z); @} printf(" @}\n @}\n)\n"); @} @} endprogn(); @} Normalize(HPoint3 *p) @{ if (p->w != 0) @{ p->x /= p->w; p->y /= p->w; p->z /= p->w; p->w = 1; @} @} main() @{ Lake *lake; LObject *lit, *val; extern char *getenv(); Initialize(); lake = LakeDefine(stdin, stdout, NULL); while (!feof(stdin)) @{ /* Parse next lisp expression from stdin. */ lit = LSexpr(lake); /* Evaluate that expression; this is where Lpick() gets called. */ val = LEval(lit); /* Free the two expressions from above. */ LFree(lit); LFree(val); @} @} @comment #end include @end example The code begins by defining procedures @code{progn()} and @code{endprogn()} which begin and end a Geomview @code{progn} group. The purpose of the Geomview @code{progn} command is to group commands together and cause Geomview to execute them all at once, without refreshing any graphics windows until the end. It is a good idea to group blocks of commands that a module sends to Geomview like this so that the user sees their cumulative effect all at once. Procedure @code{Initialize()} does various things needed at program startup time. It initializes the lisp library by calling @code{LInit()}. Any program that uses the lisp library should call this once before calling any other lisp library functions. It then calls @code{LDefun} to tell the library about our @code{pick} procedure, which is defined further down with a call to the @code{PICKFUNC} macro. Then it sends a bunch of setup commands to Geomview, grouped in a @code{progn} block. This includes defining a handle called @code{littlebox} that stores the geometry of the little box. Next it sends the command @example (interest (pick world * * * * nil nil nil nil nil)) @end example @noindent which tells Geomview to notify us when a pick event happens. The syntax of this @code{interest} statement merits some explanation. In general @code{interest} takes one argument which is a (parenthesized) expression representing a Geomview function call. It specifies a type of call that the module is interested in knowing about. The arguments can be any particular argument values, or the special symbols @code{*} or @code{nil}. For example, the first argument in the @code{pick} expression above is @code{world}. This means that the module is interested in calls to @code{pick} where the first argument, which specifies the coordinate system, is @code{world}. A @code{*} is like a wild-card; it means that the module is interested in calls where the corresponding argument has any value. The word @code{nil} is like @code{*}, except that the argument's value is not reported to the module. This is useful for cutting down on the amount of data that must be transmitted in cases where there are arguments that the module doesn't care about. The second, third, fourth, and fifth arguments to the @code{pick} command give the name, pick point coordinates, vertex coordinates, and edge coordinates of a pick event. We specify these by @code{*}'s above. The remaining five arguments to the @code{pick} command give other information about the pick event that we do not care about in this module, so we specify these with @code{nil}'s. For the details of the arguments to @code{pick}, @xref{GCL}. The @code{geometry} statement defines a geom called @code{pick} that is initially an empty list, specified as @code{ @{ LIST @} }; this is the best way of specifying a null geom. The module will replace this with something useful by sending Geomview another @code{geometry} command when the user picks something. Next we arrange for the @code{pick} object to be non-pickable, and turn normalization off for it so that Geomview will display it in the size and location where we put it, rather than resizing and relocating it to fit into the unit cube. The next function in the file, @code{Lpick}, is defined with a strange looking call to a macro called @code{PICKFUNC}, defined in the header file @file{pickfunc.h}. This is the function for handling pick events. The reason we provide a macro for this is that that macro encapsulates a lot of necessary stuff that would be the same for the pick-handling function in any program. If you write a Geomview module that wants to know about user pick events you can just copy this macro call and change it to suit yours needs. In general the syntax for @code{PICKFUNC} is @example PICKFUNC(@var{name}, @var{block}, @var{NDblock}) @end example @noindent where @var{name} is the name of the procedure to be defined, in this case @code{Lpick}. The next argument, @var{block}, is a block of code to be executed when a pick event occurs. If @var{block} contains a return statement, then the returned value must be a pointer to a Lisp-object, that is of type @code{LObject *}. The last argument has the same functionality as the @var{block} argument, but is only invoked when picking objects in a higher dimensional world. @code{PICKFUNC} declares certain local variables in the body of the procedure. When the module receives a @code{(pick @dots{})} statement from Geomview, the procedure assigns values to these variables based on the information in the @code{pick} call (variables corresponding to @code{nil}'s in the @code{(interest (pick @dots{}))} are not given values). There is also a second variant of the @code{PICKFUNC} macro with a slightly different syntax: @example DEFPICKFUNC(@var{helpstr}, @var{coordsys}, @var{id}, @var{point}, @var{pn}, @var{vertex}, @var{vn}, @var{edge}, @var{en}, @var{face}, @var{fn}, @var{ppath}, @var{ppn}, @var{vi}, @var{ei}, @var{ein}, @var{fi}, @var{body}, @var{NDbody}) @end example @code{DEFPICKFUNC} can be used as well as @code{PICKFUNC}, there is no functional difference with the exception that the name of the C-function is tied to @code{Lpick} when using @code{DEFPICKFUNC} and that the @code{(help pick)} GCL-command (@pxref{help, @code{(help @dots{})}}) would respond with echoing @var{helpstr}. The table below lists all variables defined in @code{PICKFUNC} In the context of ND-viewing @code{float} variants of the arguments apply: the @var{body} execution block sees the @code{HPoint3} variables, and the @var{NDbody} block sees only flat one-dimensional arrays of @code{float}-type. In the ND-viewing context the co-ordinates passed to the pick function are still the 3-dimensional co-ordinates of the camera view-port where the pick occurred, but padded with zeroes on transformed back to the co-ordinate system specified by the second argument of the @code{pick} command. @table @asis @item @code{char *coordsys;} A string specifying the coordinate system in which coordinates are given. In this example, this will always be @code{world} because of the @code{interest} call above. @item @code{char *id;} A string specifying the name of the picked geom. @item @code{HPoint3 point; int pn;} @item @code{float *point; int pn;} @code{point} is an @code{HPoint3} structure giving the coordinates of the picked point. @code{HPoint3} is a homogeneous point coordinate representation equivalent to an array of 4 floats. @code{pn} tells how many coordinates have been written into this array; it will always be either @code{0}, @code{4} or greater than @code{4}. If it is greater than @code{4}, then the @var{NDbody} instruction block is invoked and in this case @code{point} is a flat array of @code{pn} many @code{float}s. A value of zero means no point was picked, i.e. the user clicked the right mouse button while the cursor was not pointing at a geom. In this case the ordinary @var{block} 3d instruction block is executed. @item @code{HPoint3 vertex; int vn;} @item @code{float *vertex; int vn;} @code{vertex} is an @code{HPoint3} structure giving the coordinates of the picked vertex, if the pick point was near a vertex. @code{vn} tells how many coordinates have been written into this array; it will always be either @code{0} or greater equal @code{4}. A value of zero means the pick point was not near a vertex. In the context of ND-viewing @code{vertex} will be an array of @code{vn} @code{float}s and @code{vn} will be equal to @code{pn}. @item @code{HPoint3 edge[2]; int en;} @item @code{float *edge; int en;} @code{edge} is an array of two @code{HPoint3} structures giving the coordinates of the endpoints of the picked edge, if the pick point was near an edge. @code{en} tells how many coordinates have been written into this array; it will always be @code{0} or greater equal @code{8}. A value of zero means the pick point was not near an edge. In the context of ND-viewing @code{edge} will be a flat one-dimensional array of @code{en} many @code{float}s: the first @code{pn} @code{float}s define the first vertex, and the second @code{pn} many @code{float}s define the second vertex; @code{en} will be two times @code{pn}. @end table In this example module, the remaining variables will never be given values because their values in the @code{interest} statement were specified as @code{nil}. @table @asis @item @code{HPoint3 face[]; int fn;} @item @code{float *face; int fn;} @code{face} is a variable length array of @var{fn} @code{HPoint3}'s. @code{face} gives the coordinates of the vertices of the picked face. @code{fn} tells how many coordinates have been written into this array; it will always be either @code{0} or a multiple of @code{pn}. A value of zero means the pick point was not near a face. In the context of ND-viewing @code{face} is a flat one-dimensional array of @code{fn} many floats of which each vertex occupies @code{pn} many components. @item @code{int ppath[]; int ppn;} @code{ppath} is an array of @var{maxpathlen} @code{int}'s. @code{ppath} gives the path through the OOGL heirarchy to the picked primitive. @code{pn} tells how many integers have been written into this array; it will be at most @var{maxpathlen}. A path of @{3,1,2@}, for example, means that the picked primitive is "subobject number 2 of subobject number 1 of object 3 in the world". @item @code{int vi;} @code{vi} gives the index of the picked vertex in the picked primitive, if the pick point was near a vertex. @item @code{int ei[2]; int ein} The @code{ei} array gives the indices of the endpoints of the picked edge, if the pick point was near a vertex. @code{ein} tells how many integers were written into this array. It will always be either 0 or 2; a value of 0 means the pick point was not near an edge. @item @code{int fi;} @code{fi} gives the index of the picked face in the picked primitive, if the pick point was near a face. @end table The @code{handle_pick} procedure actually does the work of dealing with the pick event. It begins by normalizing the homogeneous coordinates passed in as arguments so that we can assume the fourth coordinate is 1. It then sends GCL commands to define the @code{pick} object to be whatever is appropriate for the kind of pick recieved. See @pxref{OOGL File Formats}, and @pxref{GCL}, for an explanation of the format of the data in these commands. The main program, at the bottom of the file, first calls @code{Initialize()}. Next, the call to @code{LakeDefine} defines the @code{Lake} that the lisp library will use. A @code{Lake} is a structure that the lisp library uses internally as a type of communiation vehicle. (It is like a unix stream but more general, hence the name.) This call to @code{LakeDefine} defines a @code{Lake} structure for doing I/O with @code{stdin} and @code{stdout}. The third argument to @code{LakeDefine} should be @code{NULL} for external modules (it is used by Geomview). Finally, the program enters its main loop which parses and evaluates expressions from standard input. @comment **************************************************************** @node Example4, Module Installation, Example3, Modules @section Example 4: Simple Tcl/Tk Module Demonstrating Picking It's not necessary to write a Geomview module in C. The only requirement of an external module is that it send GCL commands to its standard output and expect responses (if any) on its standard input. An external module can be written in C, perl, tcl/tk, or pretty much anything. As an example, assuming you have Tcl/Tk version 4.0 or later, here's an external module with a simple GUI which demonstrates interaction with geomview. This manual doesn't discuss the Tcl/Tk language; see the good book on the subject by its originator John Ousterhout, published by Addison-Wesley, titled @emph{Tcl and the Tk Toolkit}. The @samp{#!} on the script's first line causes the system to interpret the script using the Tcl/Tk @samp{wish} program; you might have to change its first line if that's in some location other than /usr/local/bin/wish4.0. Or, you could define it as a module using @example (emodule-define "Pick Demo" "wish pickdemo.tcl") @end example in which case @samp{wish} could be anywhere on the UNIX search path. @example #! /usr/local/bin/wish4.0 # We use "fileevent" below to have "readsomething" be called whenever # data is available from standard input, i.e. when geomview has sent us # something. It promises to include a trailing newline, so we can use # "gets" to read the geomview response, then parse its nested parentheses # into tcl-friendly @{@} braces. proc readsomething @{@} @{ if @{[gets stdin line] < 0@} @{ puts stderr "EOF on input, exiting..." exit @} regsub -all @{\(@} $line "\@{" line regsub -all @{\)@} $line "\@}" line # Strip outermost set of braces set stuff [lindex $line 0] # Invoke handler for whichever command we got. Could add others here, # if we asked geomview for other kinds of data as well. switch [lindex $stuff 0] @{ pick @{handlepick $stuff@} rawevent @{handlekey $stuff@} @} @} # Fields of a "pick" response, from geomview manual: # (pick COORDSYS GEOMID G V E F P VI EI FI) # The pick command is executed internally in response to pick # events (right mouse double click). # # COORDSYS = coordinate system in which coordinates of the following # arguments are specified. This can be: # world: world coord sys # self: coord sys of the picked geom (GEOMID) # primitive: coord sys of the actual primitive within # the picked geom where the pick occurred. # GEOMID = id of picked geom # G = picked point (actual intersection of pick ray with object) # V = picked vertex, if any # E = picked edge, if any # F = picked face # P = path to picked primitive [0 or more] # VI = index of picked vertex in primitive # EI = list of indices of endpoints of picked edge, if any # FI = index of picked face # Report when user picked something. # proc handlepick @{pick@} @{ global nameof selvert seledge order set obj [lindex $pick 2] set xyzw [lindex $pick 3] set fv [lindex $pick 6] set vi [lindex $pick 8] set ei [lindex $pick 9] set fi [lindex $pick 10] # Report result, converting 4-component homogeneous point into 3-space point. set w [lindex $xyzw 3] set x [expr [lindex $xyzw 0]/$w] set y [expr [lindex $xyzw 1]/$w] set z [expr [lindex $xyzw 2]/$w] set s "$x $y $z " if @{$vi >= 0@} @{ set s "$s vertex #$vi" @} if @{$ei != @{@}@} @{ set s "$s edge [lindex $ei 0]-[lindex $ei 1]" @} if @{$fi != -1@} @{ set s "$s face #$fi ([expr [llength $fv]/3]-gon)" @} msg $s @} # Having asked for notification of these raw events, we report when # the user pressed these keys in the geomview graphics windows. proc handlekey @{event@} @{ global lastincr switch [lindex $event 1] @{ 32 @{msg "Pressed space bar"@} 8 @{msg "Pressed backspace key"@} @} @} # # Display a message on the control panel, and on the terminal where geomview # was started. We use ``puts stderr @dots{}'' rather than simply ``puts @dots{}'', # since Geomview interprets anything we send to standard output # as a GCL command! # proc msg @{str@} @{ global msgtext puts stderr $str set msgtext $str update @} # Load object from file proc loadobject @{fname@} @{ if @{$fname != ""@} @{ puts "(geometry thing < $fname)" # Be sure to flush output to ensure geomview receives this now! flush stdout @} @} # Build simple "user interface" # The message area could be a simple label rather than an entry box, # but we want to be able to use X selection to copy text from it. # The default mouse bindings do that automatically. entry .msg -textvariable msgtext -width 45 pack .msg frame .f label .f.l -text "File to load:" pack .f.l -side left entry .f.ent -textvariable fname pack .f.ent -side left -expand true -fill x bind .f.ent @{ loadobject $fname @} pack .f # End UI definition. # Call "readsomething" when data arrives from geomview. fileevent stdin readable @{readsomething@} # Geomview initialization puts @{ (interest (pick primitive)) (interest (rawevent 32)) # Be notified when user presses space (interest (rawevent 8)) # or backspace keys. (geometry thing < hdodec.off) (normalization world none) @} # Flush to ensure geomview receives this. flush stdout wm title . @{Sample external module@} msg "Click right mouse in graphics window" @end example @comment **************************************************************** @node Module Installation, , Example4, Modules @section Module Installation This section tells how to install an external module so you can invoke it within Geomview. There are two ways to install a module: you can install a @emph{private} module so that the module is available to you whenever you run Geomview, or you can install a @emph{system} module so that the module is available to all users on your system whenever they run Geomview. @menu * Private Module Installation:: Per-user modules. * System Module Installation:: System-wide modules. @end menu @comment ---------------------------------------------------------------- @node Private Module Installation, System Module Installation, Module Installation, Module Installation @subsection Private Module Installation The @code{emodule-define} command arranges for a module to appear in Geomview's @emph{Modules} browser. The command takes two string arguments; the first is the name that will appear in the @emph{Modules} browser. The second is the shell command for running the module; it may include arguments (@pxref{emodule-define,@code{(emodule-define @dots{})}}). Geomview executes this command in a subshell when you click on the module's entry in the browser. For example @example (emodule-define "Foo" "/u/home/modules/foo -x") @end example @noindent adds a line labeled "Foo" to the @emph{Modules} browser which causes the command "/u/home/modules/foo -x" to be executed when selected. You may put @code{emodule-define} commands in your @file{~/.geomview} file to arrange for certain modules to be available every time you run Geomview; @xref{Customization}. You can also execute @code{emodule-define} commands from the @emph{Commands} panel to add a module to an already running copy of Geomview. There are several other GCL commands for controlling the entries in the @emph{Modules} browser; for details, @xref{GCL}. @comment ---------------------------------------------------------------- @node System Module Installation, , Private Module Installation, Module Installation @subsection System Module Installation To install a module so that it is available to all Geomview users do the following @table @asis @item 1. Create a file called @file{.geomview-@var{module}} where @file{@var{module}} is the name of the module. This file should contain a single line which is an @code{emodule-define} command for that module: @example (emodule-define "New Module" "newmodule") @end example The first argument, @code{"New Module"} above, is the string that will appear in the @emph{Modules} browser. The second string, @code{"newmodule"} above, is the Bourne shell command for invoking the module. It may include arguments, and you may assume that the module is on the $PATH searched by the shell. @item 2. Put a copy of the @file{.geomview-@var{module}} and the module executable itself in @file{/usr/local/libexec/geomview} directory. @end table After these steps, the new module should appear, in alphabetical position, in the @emph{Modules} browser of Geomview's @emph{Main} panel next time Geomview is run. The reason this works is that when Geomview is invoked it processes all the @file{.geomview-*} files in its @file{modules} directory. It also remembers the pathname of this directory and prepends that path to the $PATH of the shell in which it invokes such a module. @comment **************************************************************** @node GCL, Non-Euclidean Geometry, Modules, Top @chapter GCL: the Geomview Command Language GCL has the syntax of lisp -- i.e. an expression of the form (f a b @dots{}) means pass the values of a, b, @dots{} to the function f. GCL is very limited and is by no means an implementation of lisp. It is simply a language for expressing commands to be executed in the order given, rather than a programming language. It does not support variable or function definition. GCL is the language that Geomview understands for files that it loads as well as for communication with other programs. To execute a GCL command interactively, you can bring up the @emph{Commands} panel which lets you type in a command; Geomview executes the command when you hit the @key{Enter} key. Output from such commands is printed to standard output. Alternately, you can invoke Geomview as @code{geomview -c -} which causes it to read GCL commands from standard input. GCL functions return a value, and you can nest function calls in ways which use this returned value. For example @example (f (g a b)) @end example evaluates @code{(g a b)} and then evaluates @code{(f x)} where @code{x} is the result returned by @code{(g a b)}. Geomview maintains these return values internally but does not normally print them out. To print out a return value pass it to the @code{echo} function. For example the @code{geomview-version} function returns a string representing the version of Geomview that is running, and @example (echo (geomview-version)) @end example prints out this string. Many functions simply return @code{t} for success or @code{nil} for failure; this is the case if the documentation for the function does not indicate otherwise. These are the lisp symbols for true and false, respectively. (They correspond to the C variables @code{Lt} and @code{Lnil} which you are likely to see if you look at the source code for Geomview or some of the external modules.) In the descriptions of the commands below several references are made to "OOGL" formats. OOGL is the data description language that Geomview uses for describing geometry, cameras, appearances, and other basic objects. For details of the OOGL formats, @xref{OOGL File Formats}. (Or equivalently, see the oogl(5) manual page, distributed with Geomview in the file /share/man/man5/oogl.5gv. The GCL commands and argument types are listed below. Most of the documentation in this section of the manual is available within Geomview via the @code{?} and @code{??} commands. The command @code{(? @var{command})} causes Geomview to print out a one-line summary of the syntax of @var{command}, and @code{(?? @var{command})} prints out an explanation of what @var{command} does. You can include the wild-card character @code{*} in @var{command} to print information for a group of commands matching a pattern. For example, @code{(?? *emodule*)} will print all information about all commands containing the string @code{emodule}. @code{(? *)} will print a short list of all commands. @menu * Argument Conventions:: Conventions used in describing argument types. * GCL Reference:: Documentation for each GCL command. @end menu @node Argument Conventions, GCL Reference, GCL, GCL @section Conventions Used In Describing Argument Types The following symbols are used to describe argument types in the documentation for GCL functions. @table @code @item @var{appearance} is an OOGL appearance specification. @item @var{cam-id} is an @var{id} that refers to a camera. @item @var{camera} is an OOGL camera specification. @item @var{geom-id} is an @var{id} that refers to a geometry. @item @var{geometry} is an OOGL geometry specification. @item @var{id} is a string which names a geometry or camera. Besides those you create, valid ones are: @table @code @item @code{World, world, worldgeom, g0} the collection of all geom's @item target selected target object (cam or geom) @item center selected center-of-motion object @item targetcam last selected target camera @item targetgeom last selected target geom @item focus camera where cursor is (or most recently was) @item allgeoms all geom objects @item allcams all cameras @item @code{default, defaultcam, prototype} future cameras inherit default's settings @end table The following @var{id}s are used to name coordinate systems, e.g. in @code{pick} and @code{write} commands: @table @code @item @code{World, world, worldgeom, g0} the world, within which all other geoms live. @item universe the universe, in which the World, lights and cameras live. Cameras' world2cam transforms might better be called universe2cam, etc. @item self "this Geomview object". Transform from an object to @code{self} is the identity; writing its geometry gives the object itself with no enclosing transform; picked points appear in the object's coordinates. @item primitive (for @code{pick} only) Picked points appear in the coordinate system of the lowest-level OOGL primitive. @end table A name is also an acceptable id. Given names are made unique by appending numbers if necessary (i.e. @code{foo<2>}). Every geom is also named g[n] and every camera is also named c[n] (@code{g0} is always the worldgeom): this name is used as a prefix to keyboard commands and can also be used as a GCL id. Numbers are reused after an object is deleted. Both names are shown in the Object browser. @item @var{statement} represents a function call. Function calls have the form @code{(func arg1 arg2 @dots{} )}, where @code{func} is the name of the function and @code{arg1}, @code{arg2}, @dots{} are the arguments. @item @var{transform} is an OOGL 4x4 transformation matrix. @item @var{ntransform} is an OOGL (N+1)x(N+1) transformation matrix. @item @var{window} is an OOGL window specification. @end table @node GCL Reference, , Argument Conventions, GCL @section GCL Reference Guide @c @table @code @menu * shell-shortcut:: @code{(! SHELLCOMMAND)} * lt:: @code{(< EXPR1 EXPR2)} * eq:: @code{(= EXPR1 EXPR2)} * gt:: @code{(> EXPR1 EXPR2)} * mul:: @code{(* EXPR1 EXPR2)} * div:: @code{(/ EXPR1 EXPR2)} * add:: @code{(+ EXPR1 EXPR2)} * sub:: @code{(- EXPR1 EXOR2)} * help-shortcut:: @code{(? COMMAND)} * morehelp-shortcut:: @code{(?? COMMAND)} * emodule-run-shortcut:: @code{(| NAME)} * all:: @code{(all geometry|camera|emodule)} * and:: @code{(and EXPR1 EXPR2)} * ap-override:: @code{(ap-override [on|off])} * backcolor:: @code{(backcolor CAM-ID R G B)} * background-image:: @code{(background-image CAM-ID [FILENAME])} * bbox-color:: @code{(bbox-color GEOM-ID R G B)} * bbox-draw:: @code{(bbox-draw GEOM-ID [yes|no])} * camera:: @code{(camera CAM-ID [CAMERA])} * camera-draw:: @code{(camera-draw CAM-ID [yes|no])} * camera-prop:: @code{(camera-prop @{ geometry object @} [projective])} * camera-reset:: @code{(camera-reset CAM-ID)} * car:: @code{(car LIST)} * cdr:: @code{(cdr LIST)} * clock:: @code{(clock)} * command:: @code{(command INFILE [OUTFILE])} * cons:: @code{(cons EXPR LIST)} * copy:: @code{(copy [ID] [name])} * cursor-still:: @code{(cursor-still [INT])} * cursor-twitch:: @code{(cursor-twitch [INT])} * defun:: @code{(defun NAME ARGS [DOC] BODY)} * delete:: @code{(delete ID)} * dice:: @code{(dice GEOM-ID N)} * dimension:: @code{(dimension [N])} * dither:: @code{(dither CAM-ID @{on|off|toggle@})} * draw:: @code{(draw CAM-ID)} * dump-handles:: @code{(dump-handles)} * echo:: @code{(echo @dots{})} * emodule-clear:: @code{(emodule-clear)} * emodule-define:: @code{(emodule-define NAME SHELL-COMMAND @dots{})} * emodule-defined:: @code{(emodule-defined @code{modulename})} * emodule-isrunning:: @code{(emodule-isrunning NAME)} * emodule-path:: @code{(emodule-path)} * emodule-run:: @code{(| NAME)} * emodule-sort:: @code{(emodule-sort)} * emodule-start:: @code{(emodule-start NAME)} * emodule-transmit:: @code{(emodule-transmit NAME LIST)} * escale:: @code{(escale GEOM-ID FACTOR)} * eval:: @code{(eval EXPR)} * event-keys:: @code{(event-keys @{on|off@})} * event-mode:: @code{(event-mode MODESTRING)} * event-pick:: @code{(event-pick @{on|off@})} * evert:: @code{(evert GEOM-ID [yes|no])} * exit:: @code{(exit)} * ezoom:: @code{(ezoom GEOM-ID FACTOR)} * freeze:: @code{(freeze CAM-ID)} * geometry:: @code{(geometry GEOM-ID [GEOMETRY])} * geomview-version:: @code{(geomview-version)} * hdefine:: @code{(hdefine geometry|camera|@dots{} NAME VALUE)} * hdelete:: @code{(hdelete [geometry|camera|@dots{}] name)} * help:: @code{(? COMMAND)} * hmodel:: @code{(hmodel CAMID @{virtual|projective|conformal@})} * hsphere-draw:: @code{(hsphere-draw CAMID [yes|no])} * if:: @code{(if TEST EXPR1 [EXPR2])} * inhibit-warning:: @code{(inhibit-warning STRING)} * input-translator:: @code{(input-translator "#pfx" "sh-command")} * interest:: @code{(interest (COMMAND [args]))} * lambda:: @code{(lambda ARGS BODY)} * let:: @code{(let (ARGS) BODY)} * lines-closer:: @code{(lines-closer CAM-ID DIST)} * load:: @code{(load filename [command|geometry|camera])} * load-path:: @code{(load-path)} * look:: @code{(look [objectID] [camID])} * look-encompass:: @code{(look-encompass [objID] [camID])} * look-encompass-size:: @code{(look-encompass-size [view clip near far])} * look-recenter:: @code{(look-recenter [objID] [camID])} * look-toward:: @code{(look-toward [objID] [camID] [origin|center])} * merge:: @code{(merge @{window|camera@} CAM-ID @{ WIN or CAM @dots{} @})} * merge-ap:: @code{(merge-ap GEOM-ID APPEARANCE)} * merge-base-ap:: @code{(merge-base-ap APPEARANCE)} * merge-baseap:: @code{(merge-baseap APPEARANCE)} * mod:: @code{(mod NUMERATOR DENOMINATOR)} * morehelp:: @code{(?? COMMAND)} * name-object:: @code{(name-object ID NAME)} * ND-axes:: @code{(ND-axes CAMID [CLUSTER [Xidx Yidx Zidx [Widx]]])} * ND-color:: @code{(ND-color CAMID @dots{}} * ND-xform:: @code{(ND-xform OBJID [ntransform @{ @dots{} @}])} * ND-xform-get:: @code{(ND-xform-get ID [from-ID])} * ND-xform-set:: @code{(ND-xform-set OBJID [ntransform @{ @dots{} @}])} * new-alien:: @code{(new-alien name [GEOMETRY])} * new-camera:: @code{(new-camera name [CAMERA])} * new-center:: @code{(new-center [id])} * new-geometry:: @code{(new-geometry name [GEOMETRY])} * new-reset:: @code{(new-reset)} * NeXT:: @code{(NeXT)} * normalization:: @code{(normalization GEOM-ID @{each|none|all|keep@})} * not:: @code{(not EXPR)} * or:: @code{(or EXPR1 EXPR2)} * pick:: @code{(pick COORDSYS GEOMID G V E F P VI EI FI)} * pick-invisible:: @code{(pick-invisible [yes|no])} * pickable:: @code{(pickable GEOM-ID @{yes|no@})} * position:: @code{(position objectID otherID)} * position-at:: @code{(position-at objectID otherID [center | origin])} * position-toward:: @code{(position-toward objID othID [center|origin])} * process-events:: @code{(process-events)} * progn:: @code{(progn STATEMENT [ @dots{} ])} * quit:: @code{(quit)} * quote:: @code{(quote EXPR)} * rawevent:: @code{(rawevent dev val x y t)} * rawpick:: @code{(rawpick CAMID X Y)} * read:: @code{(read geometry|camera|@dots{} @{GEOM or CAM or @dots{}@})} * real-id:: @code{(real-id ID)} * redraw:: @code{(redraw CAM-ID)} * regtable:: @code{(regtable)} * rehash-emodule-path:: @code{(rehash-emodule-path)} * replace-geometry:: @code{(replace-geometry GEOM-ID PART GEOMETRY)} * rib-display:: @code{(rib-display [frame|tiff] FILEPREFIX)} * rib-snapshot:: @code{(rib-snapshot CAM-ID [filename])} * scale:: @code{(scale GEOM-ID FACTOR [FACTORY FACTORZ])} * scene:: @code{(scene CAM-ID [GEOMETRY])} * set-clock:: @code{(set-clock TIME)} * set-conformal-refine:: @code{(set-conformal-refine CMX [N [EDGES]])} * set-emodule-path:: @code{(set-emodule-path (PATH1 @dots{} PATHN))} * set-load-path:: @code{(set-load-path (PATH1 @dots{} PATHN))} * set-motionscale:: @code{(set-motionscale X)} * setenv:: @code{(setenv name string)} * setq:: @code{(setq SYM EXPR)} * sgi:: @code{(sgi)} * shell:: @code{(! SHELLCOMMAND)} * sleep-for:: @code{(sleep-for TIME)} * sleep-until:: @code{(sleep-until TIME)} * snapshot:: @code{(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])} * soft-shader:: @code{(soft-shader CAM-ID @{on|off|toggle@})} * space:: @code{(space @{euclidean|hyperbolic|spherical@})} * stereowin:: @code{(stereowin CAM-ID [no|horizontal|@dots{}] [gap])} * time-interests:: @code{(time-interests delta initial prefix [suffix])} * transform:: @code{(transform objectID centerID frameID [rotate|@dots{}] @dots{})} * transform-incr:: @code{(transform-incr objectID centerID frameID @dots{})} * transform-set:: @code{(transform-set objectID centerID frameID @dots{})} * truncate:: @code{(truncate NUMBER)} * ui-cam-focus:: @code{(ui-cam-focus @{focus-change|mouse-cross@})} * ui-center:: @code{(ui-center ID)} * ui-center-origin:: @code{(ui-center-origin @{origin|bbox-center@})} * ui-emotion-program:: @code{(ui-emotion-program PROGRAM)} * ui-emotion-run:: @code{(ui-emotion-run EMODULE)} * ui-freeze:: @code{(ui-freeze @{on|off@})} * ui-html-browser:: @code{(ui-html-browser BROWSER)} * ui-motion:: @code{(ui-motion @{inertia|@dots{}@} @{on|off@})} * ui-panel:: @code{(ui-panel PANELNAME @{on|off@} [WINDOW])} * ui-pdf-viewer:: @code{(ui-pdf-viewer VIEWER)} * ui-target:: @code{(ui-target ID [yes|no])} * uninterest:: @code{(uninterest (COMMAND [args]))} * update:: @code{(update [timestep_in_seconds])} * update-draw:: @code{(update-draw CAM-ID [timestep_in_seconds])} * while:: @code{(while TEST BODY)} * window:: @code{(window CAM-ID WINDOW)} * winenter:: @code{(winenter CAM-ID)} * write:: @code{(write command|geometry|@dots{} FILENAME @dots{})} * write-comments:: @code{(write-comments FILENAME GEOMID PICKPATH)} * write-handle:: @code{(write-handle PREFIX FILENAME HANDLE)} * write-sexpr:: @code{(write-sexpr FILENAME LISPOBJECT)} * xform:: @code{(xform ID TRANSFORM)} * xform-incr:: @code{(xform-incr ID TRANSFORM)} * xform-set:: @code{(xform-set ID TRANSFORM)} * zoom:: @code{(zoom CAM-ID FACTOR)} @end menu @node shell-shortcut, lt, GCL Reference, GCL Reference @subsection ! @findex !, shell @findex shell, ! @table @code @item ! is a synonym for @code{shell}. @xref{shell}. @end table @node lt, eq, shell-shortcut, GCL Reference @subsection < @findex < @table @code @item (< EXPR1 EXPR2) Returns t if EXPR1 is less than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings. @end table @node eq, gt, lt, GCL Reference @subsection = @findex = @table @code @item (= EXPR1 EXPR2) Returns t if EXPR1 is equal to EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings. @end table @node gt, mul, eq, GCL Reference @subsection > @findex > @table @code @item (> EXPR1 EXPR2) Returns t if EXPR1 is greater than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings. @end table @node mul, div, gt, GCL Reference @subsection * @findex * @table @code @item (* EXPR1 EXPR2) Multiplies @var{EXPR1} and @var{EXPR2} and returns the result. @end table @node div, add, mul, GCL Reference @subsection / @findex / @table @code @item (/ EXPR1 EXPR2) Divides @var{EXPR1} by @var{EXPR2} and returns the result. @end table @node add, sub, div, GCL Reference @subsection + @findex + @table @code @item (+ EXPR1 EXPR2) Adds @var{EXPR1} and @var{EXPR2} and returns the result. @end table @node sub, help-shortcut, add, GCL Reference @subsection - @findex - @table @code @item (- EXPR1 EXPR2) Substracts @var{EXPR2} from @var{EXPR1} and returns the result. @end table @node help-shortcut, morehelp-shortcut, sub, GCL Reference @subsection ? @findex ? @table @code @item (? [command]) Gives one-line usage summary for @code{command}. Command may include @code{*}s as wildcards; see also @ref{morehelp, @code{(?? @dots{})}}. One-line command help; lists names only if multiple commands match. @code{?} is a synonym for @ref{help, @code{(help @dots{})}} @end table @node morehelp-shortcut, emodule-run-shortcut, help-shortcut, GCL Reference @subsection ?? @findex ?? @table @code @item (?? command) @code{command} may include @code{*} wildcards. Prints more info than @code{(? command)}. @code{??} is a synonym for @ref{morehelp, @code{morehelp}}. @end table @node emodule-run-shortcut, all, morehelp-shortcut, GCL Reference @subsection | @findex |, emodule-run @findex emodule-run, | @table @code @item | @code{|} is a synonym for @code{emodule-run}. @end table @node all, and, emodule-run-shortcut, GCL Reference @subsection all @findex all @table @code @findex all geometry @item (all geometry) returns a list of names of all geometry objects. Use e.g. @samp{(echo (all geometry))} to print such a list. @findex all camera @item (all camera) returns a list of names of all cameras. @findex all emodule defined @item (all emodule defined) returns a list of all defined external modules. @findex all emodule running @item (all emodule running) returns a list of all running external modules. @end table @node and, ap-override, all, GCL Reference @subsection and @findex and @table @code @item (and EXPR1 EXPR2) Evaluate @code{EXPR1} and @code{EXPR2} and return @code{t} if both return non-@code{nil}, otherwise return @code{nil}. @end table @node ap-override, backcolor, and, GCL Reference @subsection ap-override @findex ap-override @table @code @item (ap-override [on|off]) Selects whether appearance controls should override objects' own settings. On by default. With no arguments, returns current setting. @end table @node backcolor, background-image, ap-override, GCL Reference @subsection backcolor @findex backcolor @table @code @item (backcolor CAM-ID R G B) Set the background color of CAM-ID; R G B are numbers between 0 and 1. @end table @node background-image, bbox-color, backcolor, GCL Reference @subsection background-image @findex background-image @table @code @item (background-image CAM-ID [FILENAME]) Use the given image as the background of camera CAM-ID (which must be a real camera, not @code{default} or @code{allcams}). Centers the image on the window area. Works only with GL and OpenGL graphics. Use "" for filename to remove background. With no filename argument, returns name of that window's current background image, or "". Any file type acceptable as a texture is allowed, e.g. .ppm.gz, .sgi, etc. @end table @node bbox-color, bbox-draw, background-image, GCL Reference @subsection bbox-color @findex bbox-color @table @code @item (bbox-color GEOM-ID R G B) Set the bounding-box color of GEOM-ID; R G B are numbers between 0 and 1. @end table @node bbox-draw, camera, bbox-color, GCL Reference @subsection bbox-draw @findex bbox-draw @table @code @item (bbox-draw GEOM-ID [yes|no]) Say whether GEOM-ID's bounding-box should be drawn; defaults to @code{yes} if second argument is omitted. @end table @node camera, camera-draw, bbox-draw, GCL Reference @subsection camera @findex camera @table @code @item (camera CAM-ID [CAMERA]) Specify data for @var{CAM-ID}; @var{CAMERA} is a string giving an OOGL camera specification. If no camera @var{CAM-ID} exists, it is created; in this case, the second argument is optional, and if omitted, a default camera is used. @xref{new-camera, @code{(new-camera @dots{})}}. @end table @node camera-draw, camera-prop, camera, GCL Reference @subsection camera-draw @findex camera-draw @table @code @item (camera-draw CAM-ID [yes|no]) Say whether or not cameras should be drawn in CAM-ID; @code{yes} if omitted. @end table @node camera-prop, camera-reset, camera-draw, GCL Reference @subsection camera-prop @findex camera-prop @table @code @item (camera-prop @{ geometry object @} [projective]) Specify the object to be shown when drawing other cameras. By default, this object is drawn with its origin at the camera, and with the camera looking toward the object's -Z axis. With the @code{projective} keyword, the camera's viewing projection is also applied to the object; this places the object's Z=-1 and Z=+1 at near and far clipping planes, with the viewing area -1<=@{X,Y@}<=+1. Example: (camera-prop @{ < cube @} projective) @end table @node camera-reset, car, camera-prop, GCL Reference @subsection camera-reset @findex camera-reset @table @code @item (camera-reset CAM-ID) Reset CAM-ID to its default value. @end table @node car, cdr, camera-reset, GCL Reference @subsection car @findex car @table @code @item (car LIST) returns the first element of LIST. @end table @node cdr, clock, car, GCL Reference @subsection cdr @findex cdr @table @code @item (cdr LIST) returns the list obtained by removing the first element of LIST. @end table @node clock, command, cdr, GCL Reference @subsection clock @findex clock @table @code @item (clock) Returns the current time, in seconds, as shown by this stream's clock. @xref{set-clock, @code{(set-clock @dots{})}}. @xref{sleep-until, @code{(sleep-until @dots{})}}. @end table @node command, cons, clock, GCL Reference @subsection command @findex command @table @code @item (command INFILE [OUTFILE]) Read commands from INFILE; send corresponding responses (e.g. anything written to filename @code{-}) to OUTFILE, stdout by default. @end table @node cons, copy, command, GCL Reference @subsection cons @findex cons @table @code @item (cons EXPR LIST) Returns the list obtained by adding @var{EXPR} as first element of @var{LIST}. Note that the second argument has to be a list. @end table @node copy, cursor-still, cons, GCL Reference @subsection copy @findex copy @table @code @item (copy [ID] [name]) Copies an object or camera. If ID is not specified, it is assumed to be targetgeom. If name is not specified, it is assumed to be the same as the name of ID. @end table @node cursor-still, cursor-twitch, copy, GCL Reference @subsection cursor-still @findex cursor-still @table @code @item (cursor-still [INT]) Sets the number of microseconds for which the cursor must not move to register as holding still. If INT is not specified, the value will be reset to the default. @end table @node cursor-twitch, defun, cursor-still, GCL Reference @subsection cursor-twitch @findex cursor-twitch @table @code @item (cursor-twitch [INT]) Sets the distance which the cursor must not move (in x or y) to register as holding still. If INT is not specified, the value will be reset to the default. @end table @node defun, delete, cursor-twitch, GCL Reference @subsection defun @findex defun @table @code @item (defun NAME (ARG1 @dots{}) [DOCSTRING] EXPR1 @dots{}) Define a named lambda-expression, that is: define @var{NAME} to evaluate to the lambda-expression @code{(lambda (ARG1 @dots{}) (EXPR1 @dots{}))} when called as a function. Also, install @var{DOCSTRING} as response to the commands @code{(help NAME)} and @code{(morehelp NAME)}. Note that @var{DOCSTRING} need not contain the command-synopsis, it is generated automatically. @var{EXPR1} cannot be a string if @code{DOCSTRING} is omitted; it would be interpreted as the doc-string. The return value of @code{(defun @dots{})} is the function name. Functions can be recursive and self-modifying. It is possible to redefine builtin-functions, in this case the old definition is still available under the name @code{-builtin-OLDNAME-}. Argument values may be altered by @code{setq}; the new binding is discarded after evaluation of the surrounding @code{defun}-body. The special keywords @code{&optional} and @code{&rest} have the same meaning as for anonymous lambda-expression, see there. @xref{lambda, @code{(lambda @dots{})}}. @xref{setq, @code{(setq @dots{})}}. @xref{let, @code{(let @dots{})}}. @end table @node delete, dice, defun, GCL Reference @subsection delete @findex delete @table @code @item (delete ID) Delete object or camera ID. @end table @node dice, dimension, delete, GCL Reference @subsection dice @findex dice @table @code @item (dice GEOM-ID N) Dice any Bezier patches within @var{GEOM-ID} into NxN meshes; default 10. See also the appearance attribute @ref{Appearances, @code{patchdice}}, which makes this command obsolete. @end table @node dimension, dither, dice, GCL Reference @subsection dimension @findex dimension @table @code @item (dimension [N]) Sets or reads the space dimension for N-dimensional viewing. (Since calculations are done using homogeneous coordinates, this means matrices are (N+1)x(N+1).) With no arguments, returns the current dimension, or 0 if N-dimensional viewing has not been enabled. @end table @node dither, draw, dimension, GCL Reference @subsection dither @findex dither @table @code @item (dither CAM-ID @{on|off|toggle@}) Turn dithering on or off in that camera. @end table @node draw, dump-handles, dither, GCL Reference @subsection draw @findex draw @table @code @item (draw CAM-ID) Draw the view in CAM-ID, if it needs redrawing. @xref{redraw, @code{(redraw @dots{})}}. @end table @node dump-handles, echo, draw, GCL Reference @subsection dump-handles @findex dump-handles @table @code @item (dump-handles) Dump the list of currently active handles to stdout. This function is intended for internal debugging use only. @end table @node echo, emodule-clear, dump-handles, GCL Reference @subsection echo @findex echo @table @code @item (echo @dots{}) Write the given data to the special file @code{-}. Strings are written literally; lisp expressions are evaluated and their values written. If received from an external program, @code{echo} sends to the program's input. Otherwise writes to geomview's own standard output (typically the terminal). @end table @node emodule-clear, emodule-define, echo, GCL Reference @subsection emodule-clear @findex emodule-clear @table @code @item (emodule-clear) Clears the geomview application (external module) browser. @end table @node emodule-define, emodule-defined, emodule-clear, GCL Reference @subsection emodule-define @findex emodule-define @table @code @item (emodule-define NAME SHELL-COMMAND @dots{}) Define an external module called NAME, which then appears in the external-module browser. The SHELL-COMMAND string is a UNIX shell command which invokes the module. See @ref{emodule-run, @code{(emodule-run @dots{})}} for discussion of external modules. @end table @node emodule-defined, emodule-isrunning, emodule-define, GCL Reference @subsection emodule-defined @findex emodule-defined @table @code @item (emodule-defined @code{modulename}) If the given external-module name is known, returns the name of the program invoked when it's run as a quoted string; otherwise returns nil. @code{(echo (emodule-defined @code{name}))} prints the string. @end table @node emodule-isrunning, emodule-path, emodule-defined, GCL Reference @subsection emodule-isrunning @findex emodule-isrunning @table @code @item (emodule-isrunning NAME) Returns Lt if the emodule NAME is running, or Lnil if it is not running. NAME is searched for in the names as they appear in the browser and in the shell commands used to execute the external modules (not including arguments). @end table @node emodule-path, emodule-run, emodule-isrunning, GCL Reference @subsection emodule-path @findex emodule-path @table @code @item (emodule-path) Returns the current search path for external modules. Note: to actually see the value returned by this function you should wrap it in a call to echo: @code{(echo (emodule-path))}. @xref{set-emodule-path, @code{(set-emodule-path @dots{})}}. @end table @node emodule-run, emodule-sort, emodule-path, GCL Reference @subsection emodule-run @findex emodule-run, | @findex |, emodule-run @table @code @item (emodule-run SHELL-COMMAND ARGS@dots{}) Runs the given SHELL-COMMAND (a string containing a UNIX shell command) as an external module. The module's standard output is taken as geomview commands; responses (written to filename @code{-}) are sent to the module's standard input. The shell command is interpreted by /bin/sh, so e.g. I/O redirection may be used; a program which prompts the user for input from the terminal could be run with: @example (emodule-run yourprogram <&2) @end example If not already set, the environment variable $MACHTYPE is set to the name of the machine type. Input and output connections to geomview are dropped when the shell command terminates. Clicking on a running program's module-browser entry sends the signal SIGHUP to the program. For this to work, programs should avoid running in the background; those using FORMS or GL should call foreground() before the first FORMS or winopen() call. @xref{emodule-define, @code{(emodule-define @dots{})}}. @xref{emodule-start, @code{(emodule-start @dots{})}}. @end table @node emodule-sort, emodule-start, emodule-run, GCL Reference @subsection emodule-sort @findex emodule-sort @table @code @item (emodule-sort) Sorts the modules in the application browser alphabetically. @end table @node emodule-start, emodule-transmit, emodule-sort, GCL Reference @subsection emodule-start @findex emodule-start @table @code @item (emodule-start NAME) Starts the external module NAME, defined by emodule-define. Equivalent to clicking on the corresponding module-browser entry. @end table @node emodule-transmit, escale, emodule-start, GCL Reference @subsection emodule-transmit @findex emodule-transmit @table @code @item (emodule-transmit NAME LIST) Places LIST into external module NAME's standard input. NAME is searched for in the names of the modules as they appear in the External Modules browser and then in the shell commands used to execute the external modules. Does nothing if the module NAME is not running. @end table @node escale, eval, emodule-transmit, GCL Reference @subsection escale @findex escale @table @code @item (escale GEOM-ID FACTOR) Same as scale but multiplies by exp(scale). Obsolete. @end table @node eval, event-keys, escale, GCL Reference @subsection eval @findex eval @table @code @item (eval EXPR) Evaluate a lisp expression. If @var{EXPR} is an unevaluated S-expression as returned by the @code{(quote @dots{})} command then the effect will be as if calling the un-quoted expression directly. It is also possible to evaluate S-expression constructed via @code{car}, @code{cdr} and @code{cons}. @xref{car, @code{(car @dots{})}}. @xref{cdr, @code{(cdr @dots{})}}. @xref{cons, @code{(cons @dots{})}}. @end table @node event-keys, event-mode, eval, GCL Reference @subsection event-keys @findex event-keys @table @code @item (event-keys @{on|off@}) Turn keyboard events on or off to enable/disable keyboard shortcuts. @end table @node event-mode, event-pick, event-keys, GCL Reference @subsection event-mode @findex event-mode @table @code @item (event-mode MODESTRING) Set the mouse event (motion) mode; MODESTRING should be one of the following strings: @enumerate @item @code{"[r] Rotate"} @item @code{"[t] Translate"} @item @code{"[z] Cam Zoom"} @item @code{"[s] Geom Scale"} @item @code{"[f] Cam Fly"} @item @code{"[o] Cam Orbit"} @item @code{"[le] Edit Lights"} @end enumerate @end table @node event-pick, evert, event-mode, GCL Reference @subsection event-pick @findex event-pick @table @code @item (event-pick @{on|off@}) Turn picking on or off. @end table @node evert, exit, event-pick, GCL Reference @subsection evert @findex evert @table @code @item (evert GEOM-ID [yes|no]) Set the normal eversion state of GEOM-ID. If the second argument is omitted, toggle the eversion state. @end table @node exit, ezoom, evert, GCL Reference @subsection exit @findex exit @table @code @item (exit) Terminates geomview. @end table @node ezoom, freeze, exit, GCL Reference @subsection ezoom @findex ezoom @table @code @item (ezoom GEOM-ID FACTOR) Same as zoom but multiplies by exp(zoom). Obsolete. @end table @node freeze, geometry, ezoom, GCL Reference @subsection freeze @findex freeze @table @code @item (freeze CAM-ID) Freeze CAM-ID; drawing in this camera's window is turned off until it is explicitly redrawn with @code{(redraw CAM-ID)}, after which time drawing resumes as normal. @end table @node geometry, geomview-version, freeze, GCL Reference @subsection geometry @findex geometry @table @code @item (geometry GEOM-ID [GEOMETRY]) Specify the geometry for GEOM-ID. GEOMETRY is a string giving an OOGL geometry specification. If no object called GEOM-ID exists, it is created; in this case the GEOMETRY argument is optional, and if omitted, the new object GEOM-ID is given an empty geometry. @end table @node geomview-version, hdefine, geometry, GCL Reference @subsection geomview-version @findex geomview-version @table @code @item (geomview-version) Returns a string representing the version of geomview that is running. @end table @node hdefine, hdelete, geomview-version, GCL Reference @subsection hdefine @findex hdefine @table @code @item (hdefine @code{geometry}|@code{camera}|@code{window}|@code{appearance}|@code{image}|@code{transform}|@code{ntransform} name value) Sets the value of a handle of a given type. @example (hdefine ) @end example is generally equivalent to @example (read @{ define @}) @end example except that the assignment is done when hdefine is executed, (possibly not at all if inside a conditional statement), while the @code{read @dots{} define} performs assignment as soon as the text is read. @xref{References}. @xref{read, @code{(read @dots{})}}. @xref{hdelete, @code{(hdelete @dots{})}}. @end table @node hdelete, help, hdefine, GCL Reference @subsection hdelete @findex hdelete @table @code @item (hdelete [@code{geometry}|@code{camera}|@code{window}|@code{appearance}|@code{image}|@code{transform}|@code{ntransform}] name) Deletes the given handle. Note that the handle will not actually be deleted in case there are still other objects referring to the handle, but once those objects are gone, the handle will also automatically go away. The object the handle referes to (if any) will only be deleted if there are no other references to that object. If the optional first argument is omitted, then the first handle matching @var{name} will be deleted, regardless of the type of the object it is attached to. It is not an error to call this function with a non-existent handle, but it is an error to call this funcion with the name of a non-global handle, i.e. one that was not created by @code{(hdefine @dots{})} or @code{(read @dots{} @{ define @dots{}@})}. @xref{References}. @xref{read,@code{(read @dots{})}}. @xref{hdefine,@code{(hdefine @dots{})}}. @end table @node help, hmodel, hdelete, GCL Reference @subsection help @findex help @table @code @item (help [command]) Command may include @code{*}s as wildcards; see also @ref{help, @code{(?? @dots{})}} One-line command help; lists names only if multiple commands match. @end table @node hmodel, hsphere-draw, help, GCL Reference @subsection hmodel @findex hmodel @table @code @item (hmodel CAMID @{virtual|projective|conformal@}) Set the model used to display geometry in this camera. @xref{space, @code{(space @dots{})}}. @end table @node hsphere-draw, if, hmodel, GCL Reference @subsection hsphere-draw @findex hsphere-draw @table @code @item (hsphere-draw CAMID [yes|no]) Say whether to draw a unit sphere: the sphere at infinity in hyperbolic space, and a reference sphere in Euclidean and spherical spaces. If the second argument is omitted, @code{yes} is assumed. @end table @node if, inhibit-warning, hsphere-draw, GCL Reference @subsection if @findex if @table @code @item (if TEST EXPR1 [EXPR2]) Evaluates TEST; if TEST returns a non-nil value, returns the value of EXPR1. If TEST returns nil, returns the value of EXPR2 if EXPR2 is present, otherwise returns nil. @end table @node inhibit-warning, input-translator, if, GCL Reference @subsection inhibit-warning @findex inhibit-warning @table @code @item (inhibit-warning STRING) Inhibit warning inhbits geomview from displaying a particular warning message determined by STRING. At present there are no warning messages that this applies to, so this command is rather useless. @end table @node input-translator, interest, inhibit-warning, GCL Reference @subsection input-translator @findex input-translator @table @code @item (input-translator "#prefix_string" "Bourne-shell-command") Defines an external translation program for special input types. When asked to read a file which begins with the specified string, geomview invokes that program with standard input coming from the given file. The program is expected to emit OOGL geometric data to its standard output. In this implementation, only prefixes beginning with # are recognized. Useful as in @example (input-translator "#VRML" "vrml2oogl") @end example @end table @node interest, lambda, input-translator, GCL Reference @subsection interest @findex interest @table @code @item (interest (COMMAND [args])) Allows you to express interest in a command. When geomview executes that command in the future it will echo it to the communication pool from which the interest command came. @var{COMMAND} can be any command. Args specify restrictions on the values of the arguments; if args are present in the interest command, geomview will only echo calls to the command in which the arguments match those given in the interest command. Two special argument values may appear in the argument list. @code{*} matches any value. @code{nil} matches any value but supresses the reporting of that value; its value is reported as @code{nil}. The purpose of the interest command is to allow external modules to find out about things happening inside geomview. For example, a module interested in knowing when a geom called @code{foo} is deleted could say @code{(interest (delete foo))} and would receive the string @code{(delete foo)} when foo is deleted. Picking is a special case of this. For most modules interested in pick events the command @code{(interest (pick world))} is sufficient. This causes geomview to send a string of the form @code{(pick world @dots{})} every time a pick event (right mouse double click). See the @ref{pick, @code{(pick @dots{})}} command for details. @end table @node lambda, let, interest, GCL Reference @subsection lambda @findex lambda @table @code @item (lambda (ARG1 @dots{}) EXPR1 @dots{} EXPRN) A lambda expression is like a function. To ``call'' a lambda expression, it has to be evoked like a function: @code{((lambda (arg) (+ 1 arg)) 2)}. In this example, the value of the entire expression would be 3. In general, the value of the call will be the value of @var{EXPRN}. The first list serves to define formal parameters. The lambda expression itself is just a list, starting with the key-word lambda, followed by several quoted lists. @xref{defun, @code{(defun @dots{})}}. @xref{setq, @code{(setq @dots{})}}. @xref{let, @code{(let @dots{})}}. Note the argument list may contain the special keywords @table @code @item &optional giving values to the following identifiers is optional, their default value will be @code{nil} @item &rest all excess arguments will be collected in a list, and that list will be assigned to the following argument, like so: @example ((lambda (&rest rest) (echo rest)) a b c d) @end example The output would be @code{(a b c d)}. @end table @end table @node let, lines-closer, lambda, GCL Reference @subsection let @findex let @table @code @item (let ARGUMENTS EXPR1 @dots{} EXPRN) Generate a lambda expression from @var{EXRP1} @dots{} @var{EXPRN}, with the argument bindings described by @var{ARGUMENTS}. @var{ARGUMENTS} is a list of symbols (bound to @code{nil} by default) or lists of the form @code{(ARG VALUE)} where @var{ARG} is a symbol and not evaluated and @var{VALUE} is an S-expression which is first evaluated, then its value is bound to @var{ARG}. The entire expression evaluates to the value of @var{EXPRN}, the last expression in the body of the statement. The argument list must be present, but can be empty; in the latter case the @code{(let () @dots{})} statement is equivalent to a @code{(progn @dots{})}. @xref{lambda, @code{(lambda @dots{})}}. @xref{defun, @code{(defun @dots{})}}. @xref{setq, @code{(setq @dots{})}}. @end table @node lines-closer, load, let, GCL Reference @subsection lines-closer @findex lines-closer @table @code @item (lines-closer CAM-ID DIST) Draw lines (including edges) closer to the camera than polygons by DIST / 10^5 of the Z-buffer range. DIST = 3.0 by default. If DIST is too small, a line lying on a surface may be dotted or invisible, depending on the viewpoint. If DIST is too large, lines may appear in front of surfaces that they actually lie behind. Good values for DIST vary with the scene, viewpoint, and distance between near and far clipping planes. This feature is a kludge, but can be helpful. @end table @node load, load-path, lines-closer, GCL Reference @subsection load @findex load @table @code @item (load filename [command|geometry|camera]) Loads the given file into geomview. The optional second argument specifies the type of data it contains, which may be @code{command} (geomview commands), @code{geometry} (OOGL geometric data), or @code{camera} (OOGL camera definition). If omitted, attempts to guess about the file's contents. Loading geometric data creates a new visible object; loading a camera opens a new window; loading a command file executes those commands. @end table @node load-path, look, load, GCL Reference @subsection load-path @findex load-path @table @code @item (load-path) Returns the current search path for command, geometry, files, etc. Note: to actually see the value returned by this function you should wrap it in a call to echo: @code{(echo (load-path))}. @xref{set-load-path, @code{(set-load-path @dots{})}}. @end table @node look, look-encompass, load-path, GCL Reference @subsection look @findex look @table @code @item (look [objectID] [cameraID]) Rotates the named camera to point toward the center of the bounding box of the named object (or the origin in hyperbolic or spherical space). In Euclidean space, moves the camera forward or backward until the object appears as large as possible while still being entirely visible. Equivalent to @example progn ( (look-toward [objectID] [cameraID] @{center | origin@}) [(look-encompass [objectID] [cameraID])] ) @end example If objectID is not specified, it is assumed to be World. If cameraID is not specified, it is assumed to be targetcam. @end table @node look-encompass, look-encompass-size, look, GCL Reference @subsection look-encompass @findex look-encompass @table @code @item (look-encompass [objectID] [cameraID]) Moves cameraID backwards or forwards until its field of view surrounds objectID. This routine works only in Euclidean space. If objectID is not specified, it is assumed to be the world. If cameraID is not specified, it is assumed to be the targetcam. @xref{look-encompass-size, @code{(look-encompass-size @dots{})}}. @end table @node look-encompass-size, look-recenter, look-encompass, GCL Reference @subsection look-encompass-size @findex look-encompass-size @table @code @item (look-encompass-size [view-fraction clip-ratio near-margin far-margin]) Sets/returns parameters used by (look-encompass). view-fraction is the portion of the camera window filled by the object, clip-ratio is the max allowed ratio of near-to-far clipping planes. The near clipping plane is 1/near-margin times closer than the near edge of the object, and the far clipping plane is far-margin times further away. Returns the list of current values. Defaults: .75 100 0.1 4.0 @end table @node look-recenter, look-toward, look-encompass-size, GCL Reference @subsection look-recenter @findex look-recenter @table @code @item (look-recenter [objectID] [cameraID]) Translates and rotates the camera so that it is looking in the -z direction (in objectID's coordinate system) at the center of objectID's bounding box (or the origin of the coordinate system in non-Eudlidean space). In Euclidean space, the camera is also moved as close as possible to the object while allowing the entire object to be visible. Also makes sure that the y-axes of objectID and cameraID are parallel. @end table @node look-toward, merge, look-recenter, GCL Reference @subsection look-toward @findex look-toward @table @code @item (look-toward [objectID] [cameraID] [origin | center]) Rotates the named camera to point toward the origin of the object's coordinate system, or the center of the object's bounding box (in non-Euclidean space, the origin will be used automatically). Default objectID is the world, default camera is targetcam, default location to point towards is the center of the bounding box. @end table @node merge, merge-ap, look-toward, GCL Reference @subsection merge @findex merge @table @code @item (merge @{window|camera@} CAM-ID @{ WINDOW or CAMERA @dots{} @}) Modify the given window or camera, changing just those properties specified in the last argument. E.g. @example (merge camera @code{Camera} @{ far 20 @}) @end example sets Camera's far clipping plane to 20 while leaving other attributes untouched. @end table @node merge-ap, merge-base-ap, merge, GCL Reference @subsection merge-ap @findex merge-ap @table @code @item (merge-ap GEOM-ID APPEARANCE) Merge in some appearance characteristics to GEOM-ID. Appearance parameters include surface and line color, shading style, line width, and lighting. @end table @node merge-base-ap, merge-baseap, merge-ap, GCL Reference @subsection merge-base-ap @findex merge-base-ap @table @code @item (merge-base-ap APPEARANCE) @code{merge-base-ap} is a synonym for @ref{merge-baseap, @code{merge-baseap}}. @end table @node merge-baseap, mod, merge-base-ap, GCL Reference @subsection merge-baseap @findex merge-baseap @table @code @item (merge-baseap APPEARANCE) Merge in some appearance characteristics to the base default appearance (applied to every geom before its own apperance). Lighting is typically included in the base appearance. @end table @node mod, morehelp, merge-baseap, GCL Reference @subsection mod @findex mod @table @code @item (mod EXPR1 EXPR2) Divides @var{EXPR1} by @var{EXPR2} and returns the remainder. @end table @node morehelp, name-object, mod, GCL Reference @subsection morehelp @findex morehelp @table @code @item (morehelp command) @code{command} may include @code{*} wildcards. Prints more info than @ref{help, @code{(help command)}}. @end table @node name-object, ND-axes, morehelp, GCL Reference @subsection name-object @findex name-object @table @code @item (name-object ID NAME) Assign a new NAME (a string) to ID. A number is appended if that name is in use (for example, @code{foo} -> @code{foo<2>}). The new name, possibly with number appended, may be used as object's id thereafter. @end table @node ND-axes, ND-color, name-object, GCL Reference @subsection ND-axes @findex ND-axes @table @code @item (ND-axes CAMID [CLUSTERNAME [Xindex Yindex Zindex [Windex]]]) In our model for N-D viewing (enabled by (dimension)), objects in N-space are viewed by N-dimensional @emph{camera clusters}. Each real camera window belongs to some cluster, and shows & manipulates a 3-D axis-aligned projected subspace of the N-space seen by its cluster. Moving one camera in a cluster affects its siblings. The ND-axes command configures all this. It specifies a camera's cluster membership, and the set of N-space axes which become the 3-D camera's X, Y, and Z axes. Axes are specified by their indices, from 1 to N for an N-dimensional space. Cluster CLUSTERNAME is implicitly created if not previously known. In principle it is possible to map the homogeneous component of a conformal 4 point to some other index; this would be done by specifying 0 for one of @code{Xindex}, @code{Yindex} or @code{Zindex} and giving @code{Windex} some positive value. This is probably not useful because Geomview does not support non-Euclidean geometries for in higher dimensions. To read a camera's configuration, use @code{(echo (ND-axes CAMID))}. The return value is an array of 4 integers, the last one should 0. @end table @node ND-color, ND-xform, ND-axes, GCL Reference @subsection ND-color @findex ND-color @table @code @item (ND-color CAMID [ (( [ID] (x1 x2 @dots{} xN) v r g b a v r g b a @dots{} ) ((x1 @dots{} xN) v r g b a v r g b a @dots{}) @dots{})] ) Specifies a function, applied to each N-D vertex, which determines the colors of N-dimensional objects as shown in camera CAMID. Each coloring function is defined by a vector (in ID's coordinate system) [x1 @dots{} xN] and by a sequence of value (v)/color(r g b a) tuples, ordered by increasing v. The inner product v = P.[x] is linearly interpolated in this table to give a color. If ID is omitted, the (xi) vector is assumed in universe coordinates. The ND-color command specifies a list of such functions; each vertex is colored by their sum (so e.g. green intensity could indicate projection along one axis while red indicated another. An empty list, as in (ND-color CAMID ()), suppresses coloring. With no second argument, (ND-color CAMID) returns that camera's color-function list. Even when coloring is enabled, objects tagged with the @code{keepcolor} appearance attribute are shown in their natural colors. @end table @node ND-xform, ND-xform-get, ND-color, GCL Reference @subsection ND-xform @findex ND-xform @table @code @item (ND-xform OBJID [ntransform @{ idim odim @dots{} @}]) Concatenate the given ND-transform with the current ND-transform of the object (apply the ND-transform to object ID, as opposed to simply setting its ND-transform). Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3. @end table @node ND-xform-get, ND-xform-set, ND-xform, GCL Reference @subsection ND-xform-get @findex ND-xform-get @table @code @item (ND-xform-get ID [from-ID]) Returns the N-D transform of the given object in the coordinate system of from-ID (default @code{universe}), in the sense * Transform = . Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3. @end table @node ND-xform-set, new-alien, ND-xform-get, GCL Reference @subsection ND-xform-set @findex ND-xform-set @table @code @item (ND-xform-set OBJID [ntransform @{ idim odim @dots{} @}]) Sets the N-D transform of the given object. In dimension N, this is an (N+1)x(N+1) matrix, so in that case idim and odim are expected to be both equal to (N+1). Note that all cameras in a camera-cluster have the same N-D transform. Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3. @end table @node new-alien, new-camera, ND-xform-set, GCL Reference @subsection new-alien @findex new-alien @table @code @item (new-alien name [GEOMETRY]) Create a new alien (geom not in the world) with the given name (a string). @var{GEOMETRY} is a string giving an OOGL geometry specification. If @var{GEOMETRY} is omitted, the new alien is given an empty geometry. If an object with that name already exists, the new alien is given a unique name. The light beams that are used to move around the lights are an example of aliens. They're drawn but are not controllable the way ordinary objects are: they don't appear in the object browser and the user can't move them with the normal motion modes. @end table @node new-camera, new-center, new-alien, GCL Reference @subsection new-camera @findex new-camera @table @code @item (new-camera name [CAMERA]) Create a new camera with the given name (a string). If a camera with that name already exists, the new object is given a unique name. If @var{CAMERA} is omitted a default camera is used. @end table @node new-center, new-geometry, new-camera, GCL Reference @subsection new-center @findex new-center @table @code @item (new-center [id]) Stop id, then set id's transform to the identity. Default id is target. Also, if the id is a camera, calls (look-recenter World id). The main function of the call to (look-recenter) is to place the camera so that it is pointing parallel to the z axis toward the center of the world. @end table @node new-geometry, new-reset, new-center, GCL Reference @subsection new-geometry @findex new-geometry @table @code @item (new-geometry name [GEOMETRY]) Create a new geom with the given name (a string). @var{GEOMETRY} is a string giving an OOGL geometry specification. If @var{GEOMETRY} is omitted, the new object is given an empty geometry. If an object with that name already exists, the new object is given a unique name. @end table @node new-reset, NeXT, new-geometry, GCL Reference @subsection new-reset @findex new-reset @table @code @item (new-reset) Equivalent to @code{(progn (new-center ALLGEOMS)(new-center ALLCAMS))}. @end table @node NeXT, normalization, new-reset, GCL Reference @subsection NeXT @findex NeXT @table @code @item (NeXT) Returns @code{t} if running on a NeXT, @code{nil} if not. A relict from ancient work-station year. @end table @node normalization, not, NeXT, GCL Reference @subsection normalization @findex normalization @table @code @item (normalization GEOM-ID @{each|none|all|keep@}) Set the normalization status of GEOM-ID. @table @code @item none suppresses all normalization. @item each normalizes the object's bounding box to fit into the unit sphere, with the center of its bounding box translated to the origin. The box is scaled such that its long diagonal, sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), is 2. @item all resembles @code{each}, except when an object is changing (e.g. when its geometry is being changed by an external program). Then, @code{each} tightly fits the bounding box around the object whenever it changes and normalizes accordingly, while @code{all} normalizes the union of all variants of the object and normalizes accordingly. @item keep leaves the current normalization transform unchanged when the object changes. It may be useful to apply @code{each} or @code{all} normalization apply to the first version of a changing object to bring it in view, then switch to @code{keep}. @end table @end table @node not, or, normalization, GCL Reference @subsection not @findex not @table @code @item (not EXPR) Evaluates @code{EXPR}; if @code{EXPR} returns a non-@code{nil} value, returns nil, if @code{EXPR} returns @code{nil}, return @code{t}. @end table @node or, pick, not, GCL Reference @subsection or @findex or @table @code @item (or EXPR1 EXPR2) Evaluates @code{EXPR1}; if @code{EXPR1} returns non-@code{nil}, return its value, if @code{EXPR1} returns @code{nil}, evaluate @code{EXPR2} and return its value. @end table @node pick, pick-invisible, or, GCL Reference @subsection pick @findex pick @table @code @item (pick COORDSYS GEOMID G V E F P VI EI FI) The pick command is executed internally in response to pick events (right mouse double click). @table @var @item COORDSYS = coordinate system in which coordinates of the following arguments are specified. This can be: @table @code @item world world coord sys @item self coord sys of the picked geom (@var{GEOMID}) @item primitive coord sys of the actual primitive within the picked geom where the pick occurred. @end table @item GEOMID = id of picked geom @item G = picked point (actual intersection of pick ray with object) @item V = picked vertex, if any @item E = picked edge, if any @item F = picked face @item P = path to picked primitive [0 or more] @item VI = index of picked vertex in primitive @item EI = list of indices of endpoints of picked edge, if any @item FI = index of picked face @end table External modules can find out about pick events by registering interest in calls to @code{pick} via the @code{interest} command. In the ND-viewing context the co-ordinates are actually ND-points. They correspond to the 3D points of the pick relative to the sub-space defined by the viewport of the camera where the pick occurred. The co-ordinates are then padded with zeroes and transformed back to the co-ordinate system defined by @var{COORDSYS}. @end table @node pick-invisible, pickable, pick, GCL Reference @subsection pick-invisible @findex pick-invisible @table @code @item (pick-invisible [yes|no]) Selects whether picks should be sensitive to objects whose appearance makes them invisible; default yes. With no arguments, returns current status. @end table @node pickable, position, pick-invisible, GCL Reference @subsection pickable @findex pickable @table @code @item (pickable GEOM-ID @{yes|no@}) Say whether or not GEOM-ID is included in the pool of objects that could be returned from the pick command. @end table @node position, position-at, pickable, GCL Reference @subsection position @findex position @table @code @item (position objectID otherID) Set the transform of objectID to that of otherID. @end table @node position-at, position-toward, position, GCL Reference @subsection position-at @findex position-at @table @code @item (position-at objectID otherID [center | origin]) Translate objectID to the center of the bounding box or the origin of the coordinate system of otherID (parallel translation). Default is center. @end table @node position-toward, process-events, position-at, GCL Reference @subsection position-toward @findex position-toward @table @code @item (position-toward objectID otherID [center | origin]) Rotate objectID so that the center of the bounding box or the origin of the coordinate system of the otherID lies on the positive z-axis of the first object. Default is the center of the bounding box. @end table @node process-events, progn, position-toward, GCL Reference @subsection process-events @findex process-events @table @code @item (process-events) Pass control back to the event loop of Geomview, then continue evaluating the current command-script. If the current input stream has been put to sleep by one of the @code{(sleep-@dots{})} commands, then the control remains by the main-loop until the current input streams ``sleep'' is over. @xref{sleep-until, @code{(sleep-until @dots{})}}. @xref{sleep-for, @code{(sleep-for @dots{})}}. @end table @node progn, quit, process-events, GCL Reference @subsection progn @findex progn @table @code @item (progn STATEMENT [ @dots{} ]) evaluates each STATEMENT in order and returns the value of the last one. Use progn to group a collection of commands together, forcing them to be treated as a single command. @end table @node quit, quote, progn, GCL Reference @subsection quit @findex quit @table @code @item (quit) @code{quit} is a synonym for @ref{exit, @code{exit}}. @end table @node quote, rawevent, quit, GCL Reference @subsection quote @findex quote @table @code @item (quote EXPR) returns the symbolic lisp expression @var{EXPR} without evaluating it. Note, however, that @code{quote} parses @var{EXPR} as if it should be evaluated. @xref{eval, @code{(eval @dots{})}}. @end table @node rawevent, rawpick, quote, GCL Reference @subsection rawevent @findex rawevent @table @code @item (rawevent dev val x y t) Enter the specified raw event into the event queue. The arguments directly specify the members of the event structure used internally by geomview. This is the lowest level event handler and is not intended for general use. @end table @node rawpick, read, rawevent, GCL Reference @subsection rawpick @findex rawpick @table @code @item (rawpick CAMID X Y) Process a pick event in camera CAMID at location (X,Y) given in integer pixel coordinates. This is a low-level procedure not intended for external use. @end table @node read, real-id, rawpick, GCL Reference @subsection read @findex read @table @code @item (read @{geometry|camera|appearance|image|ntransform|transform|command@} @{GEOMETRY or CAMERA or @dots{}@}) Read and interpret the text in @dots{} as containing the given type of data. Useful for defining objects using OOGL reference syntax, e.g. @example (geometry thing @{ INST transform : T geom : fred @}) (read geometry @{ define fred QUAD 1 0 0 0 1 0 0 0 1 1 0 0 @}) (read transform @{ define T . If no filename specified, see @ref{rib-display, @code{(rib-display @dots{}}} for an explanation of the filename used. @end table @node scale, scene, rib-snapshot, GCL Reference @subsection scale @findex scale @table @code @item (scale GEOM-ID FACTOR [FACTORY FACTORZ]) Scale GEOM-ID, multiplying its size by FACTOR. The factors should be positive numbers. If FACTORY and FACTORZ are present and non-zero, the object is scaled by FACTOR in x, by FACTORY in y, and by FACTORZ in z. If only FACTOR is present, the object is scaled by FACTOR in x, y, and z. Scaling only really makes sense in Euclidean space. Mouse-driven scaling in other spaces is not allowed; the scale command may be issued in other spaces but should be used with caution because it may cause the data to extend beyond the limits of the space. @end table @node scene, set-clock, scale, GCL Reference @subsection scene @findex scene @table @code @item (scene CAM-ID [GEOMETRY]) Make CAM-ID look at GEOMETRY instead of at the universe. @end table @node set-clock, set-conformal-refine, scene, GCL Reference @subsection set-clock @findex set-clock @table @code @item (set-clock TIME) Adjusts the clock for this command stream to read @var{TIME} (in seconds) as of the moment the command is received. @xref{sleep-until, @code{(sleep-until @dots{})}}. @xref{clock, @code{(clock @dots{})}}. @end table @node set-conformal-refine, set-emodule-path, set-clock, GCL Reference @subsection set-conformal-refine @findex set-conformal-refine @table @code @item (set-conformal-refine CMX [N [SHOWEDGES]]) Sets the parameters for the refinement algorithm used in drawing in the conformal model. CMX is the cosine of the maximum angle an edge can bend before it is refined. Its value should be between -1 and 1; the default is 0.95; decreasing its value will cause less refinement. N is the maximum number of iterations of refining; the default is 6. SHOWEDGES, which should be @code{no} or @code{yes}, determines whether interior edges in the refinement are drawn. @end table @node set-emodule-path, set-load-path, set-conformal-refine, GCL Reference @subsection set-emodule-path @findex set-emodule-path @table @code @item (set-emodule-path (PATH1 @dots{} PATHN)) Sets the search path for external modules. The PATHi should be pathnames of directories containing, for each module, the module's executable file and a .geomview- file which contains an (emodule-define @dots{}) command for that module. This command implicitly calls (rehash-emodule-path) to rebuild the application browser from the new path setting. The special directory name @code{+} is replaced by the existing path, so e.g. (set-emodule-path (mydir +)) prepends mydir to the path. @end table @node set-load-path, set-motionscale, set-emodule-path, GCL Reference @subsection set-load-path @findex set-load-path @table @code @item (set-load-path (PATH1 @dots{} PATHN)) Sets search path for command, geometry, files, etc. The PATHi are strings giving the pathnames of directories to be searched. The special directory name @code{+} is replaced by the existing path, so e.g. (set-load-path (mydir +)) prepends mydir to the path. @end table @node set-motionscale, setenv, set-load-path, GCL Reference @subsection set-motionscale @findex set-motionscale @table @code @item (set-motionscale X) Set the motion scale factor to X (default value 0.5). These commands scale their motion by an amount which depends on the distance from the frame to the center and on the size of the frame. Specifically, they scale by dist + scaleof(frame) * motionscale where dist is the distance from the center to the frame and motionscale is the motion scale factor set by this function. Scaleof(frame) measures the size of the frame object. @end table @node setenv, setq, set-motionscale, GCL Reference @subsection setenv @findex setenv @table @code @item (setenv name string) sets the environment variable @code{name} to the value @var{string}; the name is visible to geomview (as in pathnames containing @code{$name}) and to processes it creates, e.g. external modules. @end table @node setq, sgi, setenv, GCL Reference @subsection setq @findex setq @table @code @item (setq SYM EXPR) Bind the symbol @var{SYM} to the value of @var{EXPR}. @var{SYM} must be an unqualified symbol, i.e. not quoted, and literal: @code{(setq "foo" bar)} will not work. Likewise @code{(setq (bar STUFF) foo)} will also not work, even if @code{(bar @dots{})} would evaluate to an unqualified symbol: varible names must be literals. Note that calling @code{(setq SYM @dots{})} will alter the value of @var{SYM} within the current name-space: if @var{SYM}, e.g., is bound as local variable by a lambda, let or defun expression, then @code{(setq SYM @dots{})} will change the value of the local variable, the global binding will remain unchanged. It is NOT possible to un-bind a symbol. However, subsequent @code{(setq SYM @dots{})} invocations will re-bind @var{SYM} to another value and free the lisp-object previously bound to @var{SYM}. @xref{lambda, @code{(lambda @dots{})}}. @xref{defun, @code{(defun @dots{})}}. @xref{let, @code{(let @dots{})}}. @end table @node sgi, shell, setq, GCL Reference @subsection sgi @findex sgi @table @code @item (sgi) Returns @code{t} if running on an sgi machine, @code{nil} if not. A relict from the old work-station years. @end table @node shell, sleep-for, sgi, GCL Reference @subsection shell @findex !, shell @findex shell, ! @table @code @item (shell SHELL-COMMAND) Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview waits for it to complete and will be unresponsive until it does. A synonym is @code{!}. @end table @node sleep-for, sleep-until, shell, GCL Reference @subsection sleep-for @findex sleep-for @table @code @item (sleep-for TIME) Suspend reading commands from this stream for TIME seconds. Commands already read will still be executed; @code{sleep-for} inside @code{progn} won't delay execution of the rest of the progn's contents. @end table @node sleep-until, snapshot, sleep-for, GCL Reference @subsection sleep-until @findex sleep-until @table @code @item (sleep-until TIME) Suspend reading commands from this stream until TIME (in seconds). Commands already read will still be executed; @code{sleep-until} inside @code{progn} won't delay execution of the rest of the progn's contents. Time is measured according to this stream's clock, as set by @code{set-clock}; if never set, the first sleep-until sets it to 0 (so initially (sleep-until TIME) is the same as (sleep-for TIME)). Returns the number of seconds until TIME. @end table @node snapshot, soft-shader, sleep-until, GCL Reference @subsection snapshot @findex snapshot @table @code @item (snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]]) Save a snapshot of @var{CAM-ID} in the @var{FILENAME} (a string). The @var{FORMAT} argument is optional; it may be "ppmscreen" (the default), "ps", "ppm", "sgi" (on SGI machines), "ppmosmesa" (if built with libOSMesa) or "ppmosglx". A "ppmscreen" snapshot is created by reading the image directly from the given window; the window is popped above other windows and redrawn first, then its contents are written as a PPM format image. A "ppmosmesa" snapshot is drawn by Mesa's software renderer into a memory buffer in RAM. A "ppmosglx" snapshot is rendered into a GLX Pixmap buffer, which is also off-screen but may or may not reside in video RAM. Rendering may or may not be accelerated. The problem with on-screen snapshots is that the window must be mapped and not obscured by other windows. So on-screen snapshots will not work in the background, or when a screen saver is active. With "ps", dumps a Postscript picture representing the view from that window; hidden-surface removal might be incorrect. With "ppm", dumps a PPM-format image produced by geomview's internal software renderer; this may be of arbitrary size. If the @var{FILENAME} argument begins with "|", it's interpreted as a @code{/bin/sh} command to which the PPM or PS data should be piped. Optional @var{XSIZE} and @var{YSIZE} values are relevant only for "ppm" formats, and render to a window of that size (or scaled to that size, with aspect fixed, if only @var{XSIZE} is given) @end table @node soft-shader, space, snapshot, GCL Reference @subsection soft-shader @findex soft-shader @table @code @item (soft-shader CAM-ID @{on|off|toggle@}) Select whether to use software or hardware shading in that camera. @end table @node space, stereowin, soft-shader, GCL Reference @subsection space @findex space @table @code @item (space @{euclidean|hyperbolic|spherical@}) Set the space associated with the world. @end table @node stereowin, time-interests, space, GCL Reference @subsection stereowin @findex stereowin @table @code @item (stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize]) Configure CAM-ID as a stereo window. no: entire window is a single pane, stereo disabled@* horizontal: split left/right: left is stereo eye#0, right is #1.@* vertical: split top/bottom: bottom is eye#0, top is #1.@* colored: panes overlap, red is stereo eye#0, cyan is #1. A gap of @code{gapsize} pixels is left between subwindows; if omitted, subwindows are adjacent. If both layout and gapsize are omitted, e.g. (stereowin CAM-ID), returns current settings as a @code{(stereowin @dots{})} command list. This command doesn't set stereo projection; use @code{merge camera} or @code{camera} to set the stereyes transforms, and @code{merge window} or @code{window} to set the pixel aspect ratio & window position if needed. @end table @node time-interests, transform, stereowin, GCL Reference @subsection time-interests @findex time-interests @table @code @item (time-interests deltatime initial prefix [suffix]) Indicates that all interest-related messages, when separated by at least @code{deltatime} seconds of real time, should be preceded by the string @code{prefix} and followed by @code{suffix}; the first message is preceded by @code{initial}. All three are printf format strings, whose argument is the current clock time (in seconds) on that stream. A @code{deltatime} of zero timestamps every message. Typical usage:@* (time-interests .1 @code{(set-clock %g)} @code{(sleep-until %g)}) or@* (time-interests .1 @code{(set-clock %g)} "(sleep-until %g) (progn (set-clock %g)" ")") or@* (time-interests .1 "(set-clock %g)" "(if (> 0 (sleep-until %g)) (" "))". @end table @node transform, transform-incr, time-interests, GCL Reference @subsection transform @findex transform @table @code @item (transform objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [dt [@code{smooth}]]) Apply a motion (rotation, translation, scaling) to object @code{objectID}; that is, construct and concatenate a transformation matrix with objectID's transform The 3 IDs involved are the object that moves, the center of motion, and the frame of reference in which to apply the motion. The center is easiest understood for rotations: if centerID is the same as objectID then it will spin around its own axes; otherwise the moving object will orbit the center object. There is the special keyword @code{bbox-center} which may be used for @code{centerID}. As a result the motion will be relative to the center of the bounding box of @code{objectID}. Normally frameID, in whose coordinate system the (mouse) motions are interpreted, is @code{focus}, the current camera. Translations can be scaled proportional to the distance between the target and the center. Support for spherical and hyperbolic as well as Euclidean space is built-in: use the @code{space} command to change spaces. With type @code{rotate} x, y, and z are floats specifying angles in RADIANS. For types @code{translate} and @code{translate-scaled} x, y, and z are floats specifying distances in the coordinate system of the center object. The optional @code{dt} field allows a simple form of animation; if present, the object moves by just that amount during approximately @code{dt} seconds, then stops. If present and followed by the @code{smooth} keyword, the motion is animated with a 3t^2-2t^3 function, so as to start and stop smoothly. If absent, the motion is applied immediately. @end table @node transform-incr, transform-set, transform, GCL Reference @subsection transform-incr @findex transform-incr @table @code @item (transform-incr objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center] [dt [smooth]]) Apply continuing motion: construct a transformation matrix and concatenate it with the current transform of objectID every refresh (sets objectID's incremental transform). Same syntax as transform. If optional @code{dt} argument is present, the object is moved at each time step such that its average motion equals one instance of the motion per @code{dt} seconds. E.g. (transform-incr World World World rotate 6.28318 0 0 10.0) rotates the World about its X axis at 1 turn (2pi radians) per 10 seconds. @end table @node transform-set, truncate, transform-incr, GCL Reference @subsection transform-set @findex transform-set @table @code @item (transform-set objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center]) Set objectID's transform to the constructed transform. Same syntax as transform. @end table @node truncate, ui-cam-focus, transform-set, GCL Reference @subsection truncate @findex truncate @table @code @item (truncate EXPR) Rounds @var{EXPR} towards zero. @end table @node ui-cam-focus, ui-center, truncate, GCL Reference @subsection ui-cam-focus @findex ui-cam-focus @table @code @item (ui-cam-focus [focus-change|mouse-cross]) Set the focus policy for the camera windows. The default is @code{mouse-cross}: a camera is made the active camera (for interactive mouse events) when the mouse cursor crosses the window. Because this means it can become complicated to activate a specific camera (in the context of multiple camera windows) there is also the option to only change the camera focus when the window-manager decides to give it the focus for input events. So, after specifying @code{focus-change} it depends on the focus-change configuration of your window-manager when a camera becomes the active camera for mouse-interaction. To change this behaviour permanently you could, e.g., place the following line in your @file{$@{HOME@}/.geomview} file (@pxref{Customization}): @example (progn (ui-cam-focus focus-change) @dots{} # other stuff ) @end example @end table @node ui-center, ui-center-origin, ui-cam-focus, GCL Reference @subsection ui-center @findex ui-center @table @code @item (ui-center ID) Set the center for user interface (i.e. mouse) controlled motions to object ID. @end table @node ui-center-origin, ui-emotion-program, ui-center, GCL Reference @subsection ui-center-origin @findex ui-center-origin @table @code @item (ui-center-origin [origin|bbox-center]) Set the origin of the coordinate system of the @code{CENTER} object for user interface (i.e. mouse) controlled motions. The keyword @code{origin} means to use the origin of the coordinate system of the currently selected object, while @code{bbox-center} means to use the center of the bounding box of the current object. The keyword @code{bbox-center} makes no sense if the geometry is non-Euclidean. Using either @code{bbox-center} or @code{origin} does not make a difference if the center object is not a @emph{geometry}, e.g. if it is a camera. Same holds if the World is the currently selected object. @end table @node ui-emotion-program, ui-emotion-run, ui-center-origin, GCL Reference @subsection ui-emotion-program @findex ui-emotion-program @table @code @item (ui-emotion-program PROGRAM) This is an obsolete command. Use its new eqivalent @ref{emodule-define, @code{emodule-define}} instead. @end table @node ui-emotion-run, ui-freeze, ui-emotion-program, GCL Reference @subsection ui-emotion-run @findex ui-emotion-run @table @code @item (ui-emotion-run EMODULE) This is an obsolete command. Use its new eqivalent @ref{emodule-start, @code{emodule_start}} instead. @end table @node ui-freeze, ui-html-browser, ui-emotion-run, GCL Reference @subsection ui-freeze @findex ui-freeze @table @code @item (ui-freeze @{on|off@}) Toggle updating user interface panels. Off by default. @end table @node ui-html-browser, ui-motion, ui-freeze, GCL Reference @subsection ui-html-browser @findex ui-html-browser @table @code @item (ui-html-browser BROWSER) Use @var{BROWSER} for viewing the @var{HTML}-version of the manual when the @samp{Manual (HTML)} menu item is selected in the @samp{Help}-menu. If the @code{(ui-html-browser @dots{})} command was never executed, then the default is to use the browser stored in the @code{WEBBROWSER} environment variable. If the environment variable is unset then the default is compile-time dependent. @end table @node ui-motion, ui-panel, ui-html-browser, GCL Reference @subsection ui-motion @findex ui-motion @table @code @item (ui-motion @{inertia|constrain|own-coordinates@} @{on|off@}) Enable or disable certain properties of mouse-controlled motion. The purpose of this command is to give access to the respective toggles of the @emph{Main} panel's @emph{Motion} menu through GCL commands. @xref{Mouse Motions}. @table @code @item inertia Normally, moving objects have inertia: if the mouse is still moving when the button is released, the selected object continues to move. When @code{inertia} is off, objects cease to move as soon as you release the mouse. @item constrain It's sometimes handy to move an object in a direction aligned with a coordinate axis: exactly horizontally or vertically. Calling @code{(ui-motion constrain on)} changes the interpretation of mouse motions to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical motion. Note that the motion is still along the X or Y axes of the camera in which you move the mouse, not necessarily the object's own coordinate system. @item own-coordinates It's sometimes handy to move objects with respect to the coordinate system where they were defined, rather than with respect to some camera's view. When @code{(ui-motion own-coordinates on)} has been called, all motions are interpreted that way: dragging the mouse rightward in translate mode moves the object in its own @var{+X} direction, and so on. May be especially useful in conjunction with the @code{(ui-motion constrain on)} command. @end table @end table @node ui-panel, ui-pdf-viewer, ui-motion, GCL Reference @subsection ui-panel @findex ui-panel @table @code @item (ui-panel PANELNAME @{on|off@} [WINDOW]) Do or don't display the given user-interface panel. Case is ignored in panel names. Current @var{PANELNAMEs} are: @table @asis @item geomview main panel @item tools motion controls @item appearance appearance controls @item cameras camera controls @item lighting lighting controls @item obscure obscure controls (doesn't seem to exist any more) @item materials material properties controls @item command command entry box @item credits geomview credits @end table By default, the @code{geomview} and @code{tools} panels appear when geomview starts. If the optional Window is supplied, a @code{position} clause (e.g. (ui-panel obscure on @{ position xmin xmax ymin ymax @}) sets the panel's default position. (Only xmin and ymin values are actually used.) A present but empty Window, e.g. @code{(ui-panel obscure on @{})@} causes interactive positioning. @end table @node ui-pdf-viewer, ui-target, ui-panel, GCL Reference @subsection ui-pdf-viewer @findex ui-pdf-viewer @table @code @item (ui-pdf-viewer VIEWER) Use the executable @var{VIEWER} for viewing the @var{PDF}-version of the manual when the @samp{Manual (PDF)} menu-item is selected in the @samp{Help}-menu. If the @code{(ui-pdf-viewer @dots{})} command was never executed, then the default is to use the browser stored in the @code{PDFVIEWER} environment variable. If the environment variable is unset then the default is compile-time dependent. @end table @node ui-target, uninterest, ui-pdf-viewer, GCL Reference @subsection ui-target @findex ui-target @table @code @item (ui-target ID [yes|no]) Set the target of user actions (the selected line of the target object browser) to ID. The second argument specifies whether to make ID the current object regardless of its type. If @code{no}, then ID becomes the current object of its type (geom or camera). The default is @code{yes}. This command may result in a change of motion modes based on target choice. @end table @node uninterest, update, ui-target, GCL Reference @subsection uninterest @findex uninterest @table @code @item (uninterest (COMMAND [args])) Undoes the effect of an @code{interest} command. (COMMAND [args]) must be identical to those used in the @ref{interest, @code{interest}} command. @end table @node update, update-draw, uninterest, GCL Reference @subsection update @findex update @table @code @item (update [timestep_in_seconds]) Apply each incremental motion once. Uses timestep if it's present and nonzero; otherwise motions are proportional to elapsed real time. @end table @node update-draw, while, update, GCL Reference @subsection update-draw @findex update-draw @table @code @item (update-draw CAM-ID [timestep_in_seconds]) Apply each incremental motion once and then draw CAM-ID. Applies @code{timestep} seconds' worth of motion, or uses elapsed real time if @code{timestep} is absent or zero. @end table @node while, window, update-draw, GCL Reference @subsection while @findex while @table @code @item (while TEST BODY) Iterate: @emph{evaluate @var{TEST}, if non nil, evaluate @var{BODY}}. @end table @node window, winenter, while, GCL Reference @subsection window @findex window @table @code @item (window CAM-ID WINDOW) Specify attributes for the window of CAM-ID, e.g. its size or initial position, in the OOGL Window syntax. The special CAM-ID @code{default} specifies properties of future windows (created by @ref{camera, @code{camera}} or @ref{new-camera, @code{new-camera}}). @end table @node winenter, write, window, GCL Reference @subsection winenter @findex winenter @table @code @item (winenter CAM-ID) Tell geomview that the mouse cursor is in the window of CAM-ID. This function is for development purposes and is not intended for general use. @end table @node write, write-comments, winenter, GCL Reference @subsection write @findex write @table @code @item (write @{command|geometry|camera|transform|ntransform|window|bbox@} FILENAME [ID|(ID @dots{})] [self|world|universe|otherID]) write description of ID in given format to FILENAME. Last parameter chooses coordinate system for geometry & transform: self: just the object, no transformation or appearance (geometry only) world: the object as positioned within the World. universe: object's position in universal coordinates; includes Worldtransform other ID: the object transformed to otherID's coordinate system. A filename of @code{-} is a special case: data are written to the stream from which the 'write' command was read. For external modules, the data are sent to the module's standard input. For commands not read from an external program, @code{-} means geomview's standard output (@pxref{command, @code{(command @dots{})}}). The ID can either be a single id or a parenthesized list of ids, like @code{g0} or @code{(g2 g1 dodec.off)}. @end table @node write-comments, write-handle, write, GCL Reference @subsection write-comments @findex write-comments @table @code @item (write-comments FILENAME GEOMID PICKPATH) write OOGL COMMENT objects in the GEOMID hierarchy at the level of the pick path to FILENAME. Specifically, COMMENTS at level (a b c @dots{} f g) will match pick paths of the form (a b c @dots{} f *) where * includes any value of g, and also any values of possible further indices h,i,j, etc. The pick path (returned in the @code{pick} command) is a list of integer counters specifying a subpart of a hierarchical OOGL object. Descent into a complex object (LIST or INST) adds a new integer to the path. Traversal of simple objects increments the counter at the current level. Individual COMMENTS are enclosed by curly braces, and the entire string of zero, one, or more COMMENTS (written in the order in which they are encountered during hierarchy traversal) is enclosed by parentheses. Note that arbitrary data can only be passed through the OOGL libraries as full-fledged OOGL COMMENT objects, which can be attached to other OOGL objects via the LIST type as described above. Ordinary comments in OOGL files (i.e. everything after '#' on a line) are ignored at when the file is loaded and cannot be returned. @end table @node write-handle, write-sexpr, write-comments, GCL Reference @subsection write-handle @findex write-handle @table @code @item (write-handle PREFIX FILENAME HANDLE) Writes the object underlying the given handle to @var{FILENAME}. This function is intended for internal debugging use only. @end table @node write-sexpr, xform, write-handle, GCL Reference @subsection write-sexpr @findex write-sexpr @table @code @item (write-sexpr FILENAME LISPOBJECT) Writes the given LISPOBJECT to FILENAME. This function is intended for internal debugging use only. @end table @node xform, xform-incr, write-sexpr, GCL Reference @subsection xform @findex xform @table @code @item (xform ID TRANSFORM) Concatenate TRANSFORM with the current transform of the object (apply TRANSFORM to object ID). @end table @node xform-incr, xform-set, xform, GCL Reference @subsection xform-incr @findex xform-incr @table @code @item (xform-incr ID TRANSFORM) Apply continual motion: concatenate TRANSFORM with the current transform of the object every refresh (set object ID's incremental transform to TRANSFORM). @end table @node xform-set, zoom, xform-incr, GCL Reference @subsection xform-set @findex xform-set @table @code @item (xform-set ID TRANSFORM) Overwrite the current object transform with TRANSFORM (set object ID's transform to TRANSFORM). @end table @node zoom, , xform-set, GCL Reference @subsection zoom @findex zoom @table @code @item (zoom CAM-ID FACTOR) Zoom CAM-ID, multiplying its field of view by FACTOR. FACTOR should be a positive number. @end table @comment **************************************************************** @node Non-Euclidean Geometry, Mathematica, GCL, Top @chapter Non-Euclidean Geometry Geomview supports hyperbolic and spherical geometry as well as Euclidean geometry. The three buttons at the bottom of the @emph{Main} panel are for setting the current geometry type. In each of the three geometries, three models are supported: @emph{Virtual}, @emph{Projective}, and @emph{Conformal}. You can change the current model with the @emph{Model} browser on the @emph{Camera} panel. Each Geomview camera has its own model setting. The default model is all three spaces is @emph{Virtual}. This corresponds to the camera being in the same space as, and moving under the same set of transformations as, the geometry itself. In Euclidean space @emph{Virtual} is the most useful model. The other models were implemented for hyperbolic and spherical spaces and just happen to work in Eucldiean space as well: @emph{Projective} is the same as @emph{Virtual} but by default displays the unit sphere, and @emph{Conformal} displays everything inverted in the unit sphere. In hyperbolic space, the @emph{Projective} model setting gives a view of the projective ball model of hyperbolic 3-space imbedded in Euclidean space. The camera is initially outside the unit ball. In this model, the camera moves by Euclidean motions and geometry moves by hyperbolic motions. @emph{Conformal} model is similar but shows the conformal ball model instead. In spherical space, the @emph{Projective} model gives a view of half of the 3-sphere imbedded in Euclidean 3-space. Spherical motions give rise to projective transformations in the @emph{Projective} model, and to @tex M\"{o}bius @end tex @ifnottex Moebius @end ifnottex transformations in the @emph{Conformal} model. In both of these models the camera moves by Euclidean motions. In @emph{Projective} and @emph{Conformal} models, the unit sphere is drawn by default. You can turn it off and on at will using the @emph{Draw Sphere} button in the @emph{Camera} panel. In the @emph{Conformal} model, polygons and edges are subdivided as necessary to make them look curved. The parameters which determine this subdivision can be set with the @code{set-conformal-refine} GCL command. @xref{set-conformal-refine,@code{(set-conformal-refine @dots{})}}. There are several sample hyperbolic space objects in the @file{data/geom/hyperbolic} subdirectory of the Geomview directory. Likewise, the subdirectory @file{data/geom/spherical} contains several sample spherical space objects. @comment **************************************************************** @node Mathematica, Installation, Non-Euclidean Geometry, Top @chapter Mathematica Graphics in Geomview or RenderMan Geomview comes with some Mathematica packages that let you use use Geomview to display Mathematica graphics. Mathematica is a commercial mathematical software system available from Wolfram Research, Inc. There are two ways to do this. @enumerate @item Use Mathematica to write a graphics object to a file in OOGL format or in RIB format. @item Use Geomview as the default display for all 3D graphics output in Mathematica. @end enumerate You can also use these packages to save Mathematica graphics in RenderMan (RIB) format. Since the format of Mathematica graphics objects is different from the OOGL formats, both of these methods involve translating Mathematica graphics to OOGL format. Geomview is distributed with a Mathematica package which does this translation. Before doing either of the above you must install this package. @menu * OOGL.m:: Generating OOGL files in Mathematica. * Geomview.m:: Geomview as Mathematica's Default 3D Display. * RenderMan:: Generating RenderMan files in Mathematica. * Remote Display:: Using Geomview and Mathematica on different computers. * Package Details:: Some details about the packages. * Package Installation:: Installing the Mathematica->Geomview package. @end menu @comment ================================================================ @node OOGL.m, Geomview.m, Mathematica, Mathematica @section Using Mathematica to generate OOGL files The package @file{OOGL.m} allows Mathematica to write graphics objects in OOGL format. To use it, give the command @code{<< OOGL.m} to Mathematica to load the package. The @code{WriteOOGL[@var{file},@var{graphics}]} command writes an OOGL description of the 3D graphics object @var{graphics} to the file named @var{file}.@refill This package also provides the @code{Geomview} command which sends a 3D graphics object to Geomview. The first time you use this command it starts up a copy of Geomview. Later calls send the graphics to the same Geomview. There are two ways to use the @code{Geomview} command. @table @code @item Geomview[@var{graphics}] Sends the 3D graphics object @var{graphics} to Geomview as a geom named @code{Mathematica}. Subsequent usage of @code{Geomview[@var{graphics}]} replaces the @code{Mathematica} object in Geomview with the new @var{graphics}. @item @code{Geomview[@var{name},@var{graphics}]} Sends the 3D graphics object @var{graphics} to Geomview as a geom named @var{name}. You can use multiple calls of this form with different names to cause Geomview to display several Mathematica objects at once and allow independent control over them. @end table @example % math Mathematica 2.0 for SGI Iris Copyright 1988-91 Wolfram Research, Inc. -- GL graphics initialized -- In[1] := <"riemann"] @end example @noindent This displays the graphics @code{%3} on the remote host named @code{riemann}.@refill @code{Geomview} recognizes the string @code{"local"} as a value for @code{$DisplayHost}; it forces the graphics to be displayed on the local machine.@refill In addition to knowing the name of the machine you want to run Geomview on, @code{Geomview} needs to know the type of that machine (the setting of the CPU variable that corresponds to the machine; @pxref{Source Code Installation}). By default, @code{Geomview} assumes that it is the same kind of computer as the one you are running Mathematica on. The @code{MachType} option lets you explicitly specify the type of the @code{DisplayHost} computer; it should be one of the strings @code{"sgi"} or @code{"next"} or @code{"x11"}.@refill You can use @code{SetOptions} to change the default @code{DisplayHost} and @code{MachType}. For example, @example In[4] := SetOptions[Geomview, DisplayHost->"riemann", MachType->"sgi"] @end example @noindent arranges for @code{Geomview} to run Geomview on an SGI workstation named @code{riemann}.@refill @comment ---------------------------------------------------------------- @node Chunks, , Networked Geomview, Remote Display @subsection Transporting Mathematica Files to Geomview by Hand The auxilliary function @code{WriteChunk} is for those who can only use Mathematica on a computer that Geomview isn't installed on. @code{WriteChunk[@var{file}, @var{graphics}]} generates a file named @var{file} which contains the graphics object @var{graphics} in the format accepted by @file{math2oogl}.@refill You can transfer that file to a computer that has Geomview installed on it and then use the programs @file{math2oogl}, @file{oogl2ri}b, and @file{geomview} directly from the shell. These programs are distributed in the @file{bin/} subdirectory of the Geomview directory, and may have been installed so that they are on your @code{path}. @example In[1]:= < mma.oogl @end example @noindent to convert it to the OOGL file @file{mma.oogl} which you can then view using Geomview. This is the equivalent of the @code{WriteOOGL} command. For a result equivalent to the @code{Geomview} or @code{Show} commands, type @example math2oogl -togeomview Mathematica geomview < mychunk @end example @noindent The @code{WriteRI}b command can be emulated from the shell as @example math2oogl < mychunk | oogl2rib -n mma.tiff @end example @noindent @comment ================================================================ @node Package Details, Package Installation, Remote Display, Mathematica @section Details of the Mathematica->Geomview Package The @file{OOGL.m} package uses the external program @file{math2oogl} to convert @code{Graphics3D} objects to OOGL format, because a compiled external program is able to do this conversion many times faster than Mathematica. The converter will sometimes handle colored SurfaceGraphics objects correctly that Mathematica does not handle correctly, which means that Geomview[object] sometimes works where Show[object] will give errors. The converter supports the @code{Polygon}, @code{Line}, and @code{Point} graphics primitives, @code{RGBColor Graphics3D} directives, and @code{SurfaceGraphics} objects with or without @code{RGBColor} directives, and lists of any combination of these. It silently ignores all other directives. The Mathematica to RenderMan conversion is actually a two-step process: Mathematica->OOGL (math2oogl), and OOGL->RenderMan (oogl2rib). In the @code{WriteOOGL} and @code{WriteRIB} commands, filename can either be a string containing a filename, an @code{OutputStream} object, or a string starting with a @code{!} to send the output to a command. Object can be a @code{Graphics3D} object, a @code{SurfaceGraphics} object, or a list of these.@refill The packages work best with Mathematica 2.0 or better. With version 1.2, the Geomview display is always on the local host. @comment ================================================================ @node Package Installation, , Package Details, Mathematica @section Installing the Mathematica Packages @quotation @b{BUG} This section is out of date. @code{Geomview} follows the GNU-installation habits, data goes to @file{PREFIX/share/geomview/}, user executables to @file{PREFIX/bin/}, private executables to @file{PREFIX/libexec/geomview/}, libraries to @file{PREFIX/lib/} where @code{PREFIX} denotes the installation prefiex specified for the @file{TOPSRCDIR/configure} script. Please have a look at the files @file{TOPSRCDIR/INSTALL} and @file{TOPSRCDIR/INSTALL.Geomview} for installation instructions. The installed Mathematica data-files can be found in @file{PREFIX/share/geomview/Mathematica/}. @end quotation If Geomview is properly installed on your system according to the instructions in @xref{Installation}, then the Mathematica-to-Geomview packages should work as described here; there should be no need for additional installation procedures. In practice, however, it is sometimes necessary to taylor the installation of the Mathematica packages and/or of Geomview itself to suit the needs of a particular system. This section contains details about how the installation works; if the Mathematica-to-Geomview connection does not seem to work for you after following the Geomview installation procedure, consult this section to see what might need to be fixed. In this section, the phrase @emph{Geomview installation} refers any of the procedures in @xref{Installation}. The way the Mathematica packages work and are installed is the same regardless of whether you have one of the binary distributions or the source distribution. @enumerate @item The relevant mathematica files are @file{OOGL.m}, @file{Geomview.m}, and @file{BezierPlot.m}; Mathematica must be able to find these files. They are distributed in the @file{PREFIX/share/geomview/Mathematica} subdirectory of the binary distributions, and in the @file{TOPSRCDIR/src/bin/geomutil/math2oogl} subdirectory of the source distribution. These files need to be in a directory that is on Mathematica's search path. You can look at the value of the @code{$Path} variable in a Mathematica session on your system to see a list of the directories on Mathematica's search path. The Geomview installation procedure puts copies of the Mathematica packages into a directory that you specify (@code{MMAPACKAGEDIR}). This should ensure that Mathematica can find them. Alternately, you could arrange to append the pathname of the Mathmematica package subdirectory of the Geomview distribution to the @code{$Path} variable each time you run Mathematica. @item The package @file{OOGL.m} needs to be able to invoke the programs @file{geomview}, @file{math2oogl}, and @file{oogl2rib}. The Geomview installation procedure installs these programs into a directory that you specify for executables (@code{BINDIR}). Ideally, this directory should be on your shell's @code{$PATH}. More specifically, it should be on the @code{$PATH} of the shell in which Mathematica runs; the directory @file{/usr/local/bin} is usually a good choice. You can see the list of directories on this path by giving the command @code{!echo $path} in Mathematica. If for some reason you can't arrange for @file{geomview}, @file{math2oogl}, and @file{oogl2rib} to be in a directory on the shell's @code{$path}, you can modify @file{OOGL.m} to cause it to look for them using absolute pathnames. To do this, change the definitions of the variables @code{$GeomviewPath} and @code{$GeomRoot}, which are defined near the top of the file. Change @code{$GeomviewPath} to the absolute pathname of the @file{geomview} shell script on your system. Change @code{$GeomRoot} to the absolute pathname of the @file{$GEOMROOT} directory on your system. If you do this, you should also make sure there are copies of @file{geomview}, @file{math2oogl}, and @file{oogl2ri}b in the @file{$GEOMROOT/bin/}. @item The @file{geomview} shell script, which @file{OOGL.m} uses to invoke Geomview, needs to be able to find the geomview executable file ( called @file{gvx}). The Geomview installation procedure should have been taken care of this, but if your Mathematica session doesn't seem to be able to invoke Geomview, it's worth double-checking that the settings in the @file{geomview} script are correct. @end enumerate @comment **************************************************************** @node Installation, Support, Mathematica, Top @chapter Installation @quotation @b{BUG} This section is out of date. @code{Geomview} follows the GNU-installation habits, data goes to @file{PREFIX/share/geomview/}, user executables to @file{PREFIX/bin/}, private executables to @file{PREFIX/libexec/geomview/}, libraries to @file{PREFIX/lib/} where @code{PREFIX} denotes the installation prefiex specified for the @file{TOPSRCDIR/configure} script. Please have a look at the files @file{TOPSRCDIR/INSTALL} and @file{TOPSRCDIR/INSTALL.Geomview} for installation instructions. @end quotation What you do to install Geomview depends on which kind of computer you have and on whether you have the source distribution or the binary distribution. In general, if you don't care about looking at Geomview's source code, you should get one of the binary distribution. The binary installation is much easier and quicker than compiling and installing the source code. @menu * Unix Binary Installation:: Installing the Unix Binary Distribution * Source Code Installation:: Compiling and Installing the Source Code Distribution. @end menu @comment ================================================================ @node Unix Binary Installation, Source Code Installation, Installation, Installation @section Installing the Unix Binary Distribution @quotation @b{BUG} This section is out of date. @code{Geomview} follows the GNU-installation habits, data goes to @file{PREFIX/share/geomview/}, user executables to @file{PREFIX/bin/}, private executables to @file{PREFIX/libexec/geomview/}, libraries to @file{PREFIX/lib/} where @code{PREFIX} denotes the installation prefiex specified for the @file{TOPSRCDIR/configure} script. Please have a look at the files @file{TOPSRCDIR/INSTALL} and @file{TOPSRCDIR/INSTALL.Geomview} for installation instructions. @end quotation If you have just obtained a copy of the binary distribution for a Unix system (Linux, SGI, Solaris, HP, etc), you should be able to run Geomview and make use of most of its features immediately after unpacking it by @code{cd}'ing to the directory that it is in and typing @code{geomview}. In order to fully install Geomview so that you can run it from any directory and use all of its features, follow the steps in this section. In particular, you must go through this installation procedure in order to use Geomview to display Mathematica graphics. Geomview is distributed in a directory that contains various files and subdirectories that Geomview needs at run-time, such as data files and external modules. It also contains other things distributed with Geomview, such as documentation and (in the soure-code distribution) source-code. We refer to the root directory of this tree as the @file{$GEOMROOT} directory. This is the directory called @file{Geomview} that is created when you unpack the distribution file. To install Geomview on your system, arrange for the @file{$GEOMROOT} directory to be in a permanent place. Then, in a shell window, @code{cd} to that directory and type @code{install}. This runs a shell script which does the installation after asking you several questions about where you want to install the various components of Geomview. After running the @code{install} script you should now be able to run Geomview from any directory on your system. (You may need to give the @code{rehash} command in any shells on your computer that were started up before you did the installation.) The @file{install} script puts copies of the files in @file{$GEOMROOT/bin/} and @file{$GEOMROOT/man} into the directories you specified for executables and man pages, respectively. Once you have done the installation you can cut down one the disk space required by Geomview by removing some files from these directories, since copies have been installed elsewhere. You should first test that your installed Geomview works properly because once you remove these files from their distribution directories you will not be able to do the installation again. In particular, the files you can remove are @table @asis @item @file{$GEOMROOT/bin/}: (where @file{} is the type of system you are on, e.g. @file{linux}, @file{sgi}, @file{hpux}, etc). Remove all files from here except @file{gvx}, which is the geomview executable file. DO NOT REMOVE @file{gvx}. It is not installed elsewhere. @item @file{$GEOMROOT/man}: You can remove all the files in this directory. @end table @comment ================================================================ @menu * Unix Binary Detail:: @end menu @node Unix Binary Detail, , Unix Binary Installation, Unix Binary Installation @subsection Details of the Unix Binary Installation @quotation @b{BUG} This section is out of date. @code{Geomview} follows the GNU-installation habits, data goes to @file{PREFIX/share/geomview/}, user executables to @file{PREFIX/bin/}, private executables to @file{PREFIX/libexec/geomview/}, libraries to @file{PREFIX/lib/} where @code{PREFIX} denotes the installation prefiex specified for the @file{TOPSRCDIR/configure} script. Please have a look at the files @file{TOPSRCDIR/INSTALL} and @file{TOPSRCDIR/INSTALL.Geomview} for installation instructions. @end quotation The @code{install} script should be self-explanatory; just run it and answer the questions. This section gives some details for system administrators and other users who may want to know more about the installation. The installation is actually done by @code{make}; the @code{install} script queries the user for the settings of the following @code{make} variables and then invokes @code{make install}. @table @asis @item @code{GEOMROOT}: the absolute pathname of the Geomview root directory. The @code{geomview} shell script, which is what users invoke to run Geomview, uses this to set various environment variables that Geomview needs. It is very important that this be an @emph{absolute} pathname --- i.e. it should start with a '/'. @item @code{BINDIR}: a directory where executable files are installed. The @code{geomview} shell script goes here, as well as various other auxiliary programs that can be used in conjunction with @code{geomview}. This should be a directory that is on users' @file{$path}. These auxiliary programs are distributed in the @file{$GEOMROOT/bin/} directory; if you specify this directory for @code{BINDIR}, they are left in that directory. @item @code{MANDIR}: a directory where Unix manual pages are installed. These are distributed in the @file{$GEOMROOT/man} subdirectory; if you specify this directory for @code{MANDIR}, they are left in that directory. @item @code{MMAPACKAGEDIR}: a directory where Mathematica packages are installed. This should be a directory that Mathematica searches for packages that it loads; you can see what directories your Mathematica searches by looking at the value of the @code{$Path} variable in a Mathematica session. The installation process will install some packages there which allow you to use Geomview to display Mathematica graphics. These packages are distributed in the @file{$GEOMROOT/mathematica} subdirectory; if you specify this directory for @code{MMAPACKAGEDIR}, or if you specify the empty string for @code{MMAPACKAGEDIR}, the packages are left in that directory. For more details about the way these Mathematica packages connect to Geomview, @pxref{Package Installation}. @end table @comment ================================================================ @node Source Code Installation, , Unix Binary Installation, Installation @section Compiling and Installing the Source Code Distribution @quotation @b{BUG} This section is out of date. @code{Geomview} follows the GNU-installation habits, data goes to @file{PREFIX/share/geomview/}, user executables to @file{PREFIX/bin/}, private executables to @file{PREFIX/libexec/geomview/}, libraries to @file{PREFIX/lib/} where @code{PREFIX} denotes the installation prefiex specified for the @file{TOPSRCDIR/configure} script. Please have a look at the files @file{TOPSRCDIR/INSTALL} and @file{TOPSRCDIR/INSTALL.Geomview} for installation instructions. @end quotation The main reason to get the source code distribution is to look at and/or work with the source code. If you are only concered with @emph{using} Geomview it is better to get the binary distribution. It takes anywhere from a few minutes to an hour or more to compile the entire source distribution, depending on what kind of computer you have. Let @file{$GEOMROOT} denote the full pathname of the Geomview source code directory; this is the directory called @file{Geomview} that is created when you unpack the distribution. This directory contains the Geomview source code as well as various other files and subdirectories that Geomview needs when it runs. Before doing any compilation you should edit the file @file{$GEOMROOT/makefiles/mk.site.default}. This file defines some @code{make} variables which specify your local configuration. This includes the pathnames of the directories into which Geomview will be installed, and possibly some other settings as well. There are comments in the file telling you what to do. This file is included by every Makefile in the source tree, so the settings you specify here are used throughout the source. If you will be compiling for multiple systems, you can do them all in the same directory tree. By default the Makefiles are set up to put the objects files, libraries, and executables in directories which depend on the type of computer, so the two architectures will not interfere with each other. The Makefiles use a variable called @code{CPU} to determine the type of machine. Before doing any compilation you must arrange for this variable to have a value. There are two ways you can do this. @enumerate @item If you will always be compiling Geomview on the same type of computer edit the file @file{$GEOMROOT/makefiles/Makedefs.global} to set the @code{CPU} variable to one of the values @file{linux}, @file{FreeBSD}, @file{sgi}, @file{hpux}, @file{hpux-gcc}, @file{solaris}, @file{sun4os4} (for Suns with SunOS 4, not Solaris), @file{rs6000}, or @file{alpha}. If you're using a type of system not in this list, make up a new value for CPU, and write a @file{mk.} file for it patterned after the other @file{mk.*} in the @file{makefiles} subdirectory. @item If you will be compiling on more than one type of computer you can set a shell environment variable named @code{CPU} to one of the values above and the Makefiles will inherit the value from the environment. @end enumerate @noindent Note that many of the Makefiles refer to a variable called @code{MACHTYPE}; this variable tells which type of graphics system to compile Geomview for. The @file{mk.} files set this variable for you; in most cases its value is @file{x11}, which specifies that Geomview should be compiled for X windows. Once you have configured your source tree by editing the files as described above and setting the @code{CPU} variable, you can compile and install Geomview by typing @code{make install} in the @file{$GEOMROOT} directory. You can also type @code{make all}, or equivalently just @code{make}, to compile without installing, and then type @code{make install} later to install. You can use these same @code{make} comands in any subdirectory in the tree to recompile and/or install a part of Geomview or a module. If you want to modify the complier flags used during compilation, edit the file @file{$GEOMROOT/makefiles/Makedefs.global}; the @code{COPTS} variable specifies the flags passed to the C compiler (cc). @comment ********************************************************* @node Support, Contributing, Installation, Top @unnumbered Getting Technical Support for Geomview There are several ways to get support for Geomview. @enumerate @item Visit the Geomview web site, @uref{http://www.geomview.org}. It contains the latest documentation, news about development, and FAQ (Frequently Asked Questions) list. @item Send email to the geomview-users@@lists.sourceforge.net mailing list. This is a mailing list for discussing any issues related to using Geomview. To join the list, send an empty note with 'subscribe' in the subject line to @uref{mailto:geomview-users-request@@lists.sourceforge.net,geomview-users-request@@lists.sourceforge.net}, or visit the list web page at @uref{http://lists.sourceforge.net/mailman/listinfo/geomview-users}. @item Contract with Geometry Technologies for support. Geometry Technologies is a contract support and programming company that emerged from the Geometry Center, where Geomview was written. For more information visit the Geometry Technologies web site at @uref{http://www.geomtech.com}. @end enumerate @comment ############################################################ @node Contributing, Function Index, Support, Top @unnumbered Contributing to Geomview's Development If you are interested in contributing to the development of Geomview, there are several things you can do: @enumerate @item @strong{Volunteer programming work}. If you are a programmer and make an improvement to Geomview, contact the other geomview authors by sending a note to the @file{geomview-users} mailing list (see @uref{http://lists.sourceforge.net/mailman/listinfo/geomview-users}). @item @strong{Contract with Geometry Technologies}. Geometry Technologies, Inc. is a consulting firm that provides contract technical support and custom programming services in the area of 3D graphics. This includes a wide range of services related to 3D graphics, included but not limited to applications involving Geomview. To the extent that resources allow, Geometry Technologies supports the developement of Geomview; in particular it hosts the @uref{http://www.geomview.org} web site, and its staff make ongoing improvements to Geomview itself. If you are in a position to pay for technical support or custom programming work, contracting with Geometry Technologies indirectly supports Geomview. You can also contract with with Geometry Technologies to have particular features that you want added to Geomview, or to port Geomview to a new platform. For more information see Geometry Technologies web site at @uref{http://www.geomtech.com}. @end enumerate Thank you. @comment **************************************************************** @node Function Index, List of Figures, Contributing, Top @unnumbered Function Index @printindex fn @comment **************************************************************** @contents @node List of Figures, , Function Index, Top @unnumbered List of Figures @listoffloats Figure @bye @c LocalWords: Geomview RenderMan texinfo letterpaper setfilename geomview sp @c LocalWords: settitle texi dircategory direntry titlepage titlefont vskip @c LocalWords: Munzner uref Hanrahan MinneView OOGL Meuer Kaplan SGI NeXT GPL @c LocalWords: SGIs NeXTStep OpenGL Geomview's unnumberedsec Gunn Krech MacOS @c LocalWords: Daeron Cygwin SystemV FreeBSD Solaris Precompiled emph Heine @c LocalWords: Renderman Mathematica pxref smallexample Yoyodyne Thurston GCL @c LocalWords: xref Bezier var emodule iconify PPM NCMESH NCOFF RGBA geomview-1.9.5/doc/geomview-pt_BR.texi0000644000175000017500000155443112310110176014564 00000000000000%%% -*-texinfo-*- \tolerance=2000 \input pt_BR/texinfo @c based on eb87a52110c5040b63162a13c463862b geomview.texi @c @letterpaper @setfilename geomview-pt_BR @settitle Manual do Geomview @include version-pt_BR.texi @dircategory Graphics Applications @direntry * Geomview: (geomview-pt_BR). Programa interativo de visualiza@,{c}@~ao tridimensional. @end direntry @hyphenation{o-ri-gi-nal-men-te} @hyphenation{in-di-vi-dual-men-te} @titlepage @sp 1 @center @titlefont{Manual do Geomview} @sp 4 @c @center Vers@~ao @value{VERSION} do Geomview @center Vers@~ao 1.9.5 do Geomview @sp 1 @center para GNU/Linux/Unix @sp 1 @c @center @value{UPDATED-MONTH} @center Maio de 2008 @comment 19 de Novembro de 2000 @sp 2 @center Mark Phillips et al. @sp 14 @center Tradutor para o Portugu@^es do Brasil @center Jorge Barros de Abreu @center http://sites.google.com/site/ficmatinf @sp 2 @vskip 0pt plus 1filll @center Copyright @copyright{} 1992-1998 The Geometry Center @center Copyright @copyright{} 1998-2006 Stuart Levy, Tamara Munzner, Mark Phillips @center Copyright @copyright{} 2006-2007 Claus-Justus Heine @end titlepage @page @node Top, Intro, (dir), (dir) Programa interativo de visualiza@,{c}@~ao tridimensional. @menu * Intro:: Introdu@,{c}@~ao ao Geomview. * Distrib:: Como acessar a vers@~ao mais recente do Geomview. * Copiando:: A Licen@,{c}a P@'ublica Geral Menor do GNU. * Historia:: Hist@'oria do Desenvolvimento do Geomview. * Plantaformas:: Plantaformas Suportadas. * Pronuncia:: Como Pronunciar ``Geomview''. * Visao Geral:: Vis@~ao Geral do Geomview. * Tutorial:: Tutorial Introdut@'orio. * Interacao:: Interagindo com Geomview. * Formatos dos Arquivos da OOGL:: Formatos para Inser@,{c}@~ao de Dados Geom@'etricos. * Customizacao:: Modificando o comportamento do Geomview. * Modulos:: Programas que usam Geomview para exibi@,{c}@~ao de imagens. * GCL:: GCL: a Linguagem de Comandos do Geomview. * Geometrias Nao-Euclidianas:: Geometrias N@~ao Euclideanas. * Mathematica:: Gr@'aficos do Mathematica no Geomview ou no RenderMan. * Instalacao:: Instalando o Geomview no seu computador. * Suporte:: Acessando o Suporte T@'ecnico para o Geomview. * Contribuindo:: Como contribuir com o Geomview. * Indice de Funcoes:: Acesso r@'apido a cada fun@,{c}@~ao da GCL. * Lista de Figuras:: Lista de Figuras. @end menu @node Intro, Distrib, Top, Top @unnumbered Introdu@,{c}@~{a}o ao Geomview Geomview @'{e} um programa interativo para visualizar e controlar objetos geom@'{e}tricos, originalmente escrito pelos membros do estado maior do Geometry Center na Universidade de Minesota (EUA), come@,{c}ando em 1991. O Geomview pode ser usado como um visualizador independente para objetos est@'{a}ticos ou como um mecanismo de visualiza@,{c}@~{a}o para outros programas que produzem dinamicamente mudan@,{c}as geom@'{e}tricas. Geomview roda sobre muitos tipos de computadores Unix, incluindo Linux, SGI, Sun, e HP. Geomview tamb@'{e}m executa com Cygwin. Esse manual descreve Geomview em sua vers@~{a}o 1.9. @refill Geomview @'{e} um @dfn{software} livre, dispon@'{i}vel sob os termos da Licen@,{c}a P@'{u}blica Geral Menor do GNU ; veja @ref{Copiando} para detalhes. Geomview e esse manual podem ser encontrados em @uref{http://www.geomview.org}. @'{E} permitido fazer c@'{o}pias desse manual. Se voc@^{e} tiver d@'{u}vidas ou coment@'{a}rios sobre o Geomview ou esse manual, considere inscrever-se na lista de correio eletr@^{o}nico @file{geomview-users}, que @'{e} um f@'{o}rum no qual usu@'{a}rios do Geomview comunicam-se para responder outras quest@~{o}es e para compartilhar not@'{i}cias sobre o que eles est@~{a}o fazendo com o Geomview. Os autores do Geomview participam dessa lista e algumas vezes enviam respostas a questionamentos existentes. Para assinar a lista, visite a p@'{a}gina da lista no s@'{i}tio @uref{http://lists.sourceforge.net/mailman/listinfo/geomview-users}. @node Distrib, Copiando, Intro, Top @unnumbered Distribui@,{c}@~{a}o Geomview @'{e} um @dfn{software} livre; isso significa que qualquer um @'{e} livre para us@'{a}-lo e livre para redistribu@'{i}-lo sob certas condi@,{c}@~{o}es. Geomview n@~{a}o @'{e} de dom@'{i}nio p@'{u}blico; @'{e} protegido por direitos autorais e existem restri@,{c}@~{o}es sobre sua distribui@,{c}@~{a}o, mas essas restri@,{c}@~{o}es s@~{a}o montadas de forma a permitir qualquer coisa que um bom cidad@~{a}o colaborador possa querer fazer. O que n@~{a}o @'{e} permitido @'{e} para tentar previnir outros de compartilhamento adicional de qualquer vers@~{a}o do Geomview que eles possam pegar de voc@^{e}. As condi@,{c}@~{o}es precisas podem ser encontradas na Licen@,{c}a Geral Menor do GNU que acompanha o Geomview e tamb@'{e}m aparece acompanhando essa se@,{c}@~{a}o. Uma forma de acessar uma c@'{o}pia do Geomview @'{e} a partir de algu@'{e}m que j@'{a} possua o Geomview. Voc@^{e} n@~{a}o precisa perguntar por nossa permiss@~{a}o para fazer isso, ou informar qualquer coisa; apenas fa@,{c}a a c@'{o}pia. Se voc@^{e} tiver acesso @`{a} internet, voc@^{e} pode pegar a mais recente vers@~{a}o do Geomview em @uref{http://www.geomview.org}. Voc@^{e} tamb@'{e}m pode receber Geomview quando voc@^{e} compra um computador. Fabricantes de computadores est@~{a}o livres para distribuir c@'{o}pias sob os mesmos termos que s@~{a}o aplicados a qualquer pessoa. Esses termos requerem que os fabricantes forne@,{c}am a voc@^{e} o c@'{o}digo completo, incluindo qualquer mudan@,{c}as que eles tenham feito, e permitam a voc@^{e} que redistribua o Geomview recebido deles nos termos usuais da Licen@,{c}a P@'{u}blica Geral Menor do GNU. Em outras palavras, o programa deve ser livre para voc@^{e} quando voc@^{e} o receber, n@~{a}o apenas livre para o fabricante. @node Copiando, Historia, Distrib, Top @unnumbered Copiando @c cH: in my opinion the following paragraph is complete nonsense; programs @c which simply communicate with other programs by means of streams @c cannot inherit the restriction imposed by the GPL @smallexample NOTA: Geomview @'{e} distribu@'{i}do sob a LICEN@,{C}A P@'{U}BLICA GERAL MENOR. Para os prop@'{o}sitos dessa licen@,{c}a n@'{o}s pensamos em Geomview como se ele fosse uma "biblioteca", e dos m@'{o}dulos externos do Geomview como "programas que se comunicam com a biblioteca". Fazemos isso porque queremos especificamente permitir que programas propriet@'{a}rios e m@'{o}dulos usem o Geomview. @end smallexample @unnumbered LICEN@,{C}A P@'{U}BLICA GERAL DO GNU @center Version 2.1, February 1999 @display Licen@,{c}a P@'{u}blica Geral Menor do GNU This is an unofficial translation of the GNU Lesser General Public License into Portuguese. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GNU LGPL--only the original English text of the GNU LGPL does that. However, we hope that this translation will help Portuguese speakers understand the GNU LGPL better. Esta @'{e} uma tradu@,{c}@~{a}o n@~{a}o-oficial da GNU Lesser General Public License para o Portugu@^{e}s. Ela n@~{a}o @'{e} publicada pela Free Software Foundation e n@~{a}o traz os termos de distribui@,{c}@~{a}o legal do software que usa a GNU LGPL -- estes termos est@~{a}o contidos apenas no texto da GNU LGPL original em ingl@^{e}s. No entanto, esperamos que esta tradu@,{c}@~{a}o ajudar@'{a} no melhor entendimento da GNU LGPL em Portugu@^{e}s. Vers@~{a}o 2.1, Fevereiro de 1999 Copyright @copyright{} 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA [Estados Unidos da Am@'{e}rica] @'{E} permitido a qualquer pessoa copiar e distribuir c@'{o}pias sem altera@,{c}@~{o}es deste documento de licen@,{c}a, sendo vedada, entretanto, sua modifica@,{c}@~{a}o. [Esta @'{e} a primeira vers@~{a}o da GPL Menor a ser lan@,{c}ada. Ela tamb@'{e}m constitui a sucessora da Licen@,{c}a P@'{u}blica de Biblioteca do GNU, da@'{i} o n@'{u}mero 2.1. da vers@~{a}o]. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] @end display @unnumberedsec Introdu@,{c}@~{a}o As licen@,{c}as da maioria dos softwares s@~{a}o elaboradas para suprimir sua liberdade de compartilh@'{a}-los e modific@'{a}-los. As Licen@,{c}as P@'{u}blicas do GNU, ao contr@'{a}rio, t@^{e}m o objetivo de assegurar sua liberdade para compartilhar e modificar softwares livres para garantir que o software seja livre para todos os seus usu@'{a}rios. A presente Licen@,{c}a P@'{u}blica Geral Menor se aplica a alguns pacotes de software especialmente designados - normalmente bibliotecas - da Free Software Foundation e de outros autores que decidam utiliz@'{a}-la. Voc@^{e} pode utiliz@'{a}-la tamb@'{e}m, mas recomendamos que antes, voc@^{e} analise cuidadosamente se esta licen@,{c}a, ou a Licen@,{c}a P@'{u}blica Geral comum, @'{e} a melhor estrat@'{e}gia a ser adotada em cada caso espec@'{i}fico, tendo como base as explica@,{c}@~{o}es abaixo. Quando falamos de software livre, estamos nos referindo a liberdade de uso e n@~{a}o de gratuidade de pre@,{c}o. Nossas Licen@,{c}as P@'{u}blicas Gerais s@~{a}o elaboradas para garantir que voc@^{e} tenha liberdade para distribuir c@'{o}pias de software livre (cobrando por esse servi@,{c}o se voc@^{e} assim o desejar); que voc@^{e} receba c@'{o}digo-fonte ou o obtenha, se quiser; que voc@^{e} modifique o software e utilize partes dele em novos programas livres; e que voc@^{e} tenha ci@^{e}ncia de que pode praticar estes atos. A fim de proteger seus direitos, @'{e} necess@'{a}rio que fa@,{c}amos restri@,{c}@~{o}es que pro@'{i}bam distribu@'{i}dores de negar estes direitos a voc@^{e} ou de pedir que voc@^{e} que renuncie a eles. Essas restri@,{c}@~{o}es se traduzem em determinadas responsabilidades que voc@^{e} dever@'{a} assumir, se vier a distribuir c@'{o}pias da biblioteca ou modific@'{a}-la. Por exemplo, se voc@^{e} distribuir c@'{o}pias da biblioteca, seja gratuitamente ou mediante um valor, ter@'{a} de conceder a seus receptores todos os direitos que estamos concedendo a voc@^{e}. Voc@^{e} ter@'{a} de garantir que eles, tamb@'{e}m, recebam ou possam obter o c@'{o}digo fonte. Se voc@^{e} ligar outro c@'{o}digo com a biblioteca, voc@^{e} deve fornecer os arquivos-objeto completos para os receptores, de modo que eles possam lig@'{a}-los novamente com a biblioteca ap@'{o}s terem feito mudan@,{c}as na biblioteca e recompilado a mesma. E voc@^{e} ter@'{a} de exibir a eles esses termos, para que eles conhe@,{c}am seus direitos. Protegemos seus direitos atrav@'{e}s de um m@'{e}todo que envolve dois passos: (1) estabelecemos direitos autorais sobre a biblioteca e (2) oferecemos a voc@^{e} esta licen@,{c}a, que d@'{a} a voc@^{e} permiss@~{a}o para copiar, distribuir e/ou modificar a biblioteca. Para proteger cada distribuidor, queremos deixar bem claro que n@~{a}o h@'{a} nenhuma garantia para a biblioteca livre. Al@'{e}m disso, se a biblioteca for modificada por algu@'{e}m e passada adiante, os receptores devem saber que o que eles t@^{e}m n@~{a}o @'{e} a vers@~{a}o original, de modo que a reputa@,{c}@~{a}o do autor original n@~{a}o ser@'{a} afetada por problemas que possam ser introduzidos por outros. Por fim, as patentes de software representam uma amea@,{c}a constante para a exist@^{e}ncia de qualquer programa livre. Queremos assegurar que uma empresa n@~{a}o possa efetivamente restringir os usu@'{a}rios de um programa livre por ter obtido uma licen@,{c}a restritiva de um titular de direitos de patente. Por isso, insistimos que qualquer licen@,{c}a de patente obtida para alguma vers@~{a}o da biblioteca seja consistente com a plena liberdade de uso, especificada nesta licen@,{c}a. A maior parte dos softwares do GNU, incluindo algumas bibliotecas, est@'{a} coberta pela Licen@,{c}a P@'{u}blica Geral comum do GNU. A presente Licen@,{c}a P@'{u}blica Geral Menor do GNU se aplica a determinadas bibliotecas designadas, sendo bastante diferente da Licen@,{c}a P@'{u}blica Geral comum. Usamos esta licen@,{c}a para determinadas bibliotecas, a fim de permitir a liga@,{c}@~{a}o dessas bibliotecas a programas n@~{a}o-livres. Quando um programa @'{e} ligado a uma biblioteca, seja estaticamente ou usando uma biblioteca compartilhada, essa combina@,{c}@~{a}o das duas @'{e} em termos legais uma obra combinada, uma deriva@,{c}@~{a}o da biblioteca original. Por essa raz@~{a}o, a Licen@,{c}a P@'{u}blica Geral comum somente permite essa liga@,{c}@~{a}o se a combina@,{c}@~{a}o como um todo atender a seus crit@'{e}rios de liberdade. A Licen@,{c}a P@'{u}blica Geral Menor permite crit@'{e}rios mais flex@'{i}veis para a liga@,{c}@~{a}o de outros c@'{o}digos @`{a} biblioteca. Chamamos esta licen@,{c}a de Licen@,{c}a P@'{u}blica Geral "Menor" porque ela faz Menos para proteger a liberdade do usu@'{a}rio do que a Licen@,{c}a P@'{u}blica Geral comum. Ela tamb@'{e}m oferece a outros desenvolvedores de software livre uma Menor vantagem na competi@,{c}@~{a}o com com programas n@~{a}o livres. Essas desvantagens s@~{a}o o motivo pelo qual usamos a Licen@,{c}a P@'{u}blica Geral comum para muitas bibliotecas. Por outro lado, em determinadas circunst@^{a}ncias especiais, a licen@,{c}a Menor oferece vantagens. Por exemplo, em raras ocasi@~{o}es, pode existir uma necessidade especial de se incentivar a mais ampla utiliza@,{c}@~{a}o poss@'{i}vel de uma determinada biblioteca, para que ela se torne um padr@~{a}o de fato. Para conseguir isso, deve-se permitir que programas n@~{a}o-livres utilizem a biblioteca. Um caso mais freq@"{u}ente ocorre quando uma biblioteca livre desempenha a mesma fun@,{c}@~{a}o de bibliotecas n@~{a}o-livres amplamente usadas. Nesse caso, existem poucas vantagens em restringir a biblioteca livre somente para software livre, ent@~{a}o utilizamos a Licen@,{c}a P@'{u}blica Geral Menor. Em outros casos, a permiss@~{a}o para usar uma determinada biblioteca em programas n@~{a}o-livres possibilita que um maior n@'{u}mero de pessoas use um amplo leque de softwares livres. Por exemplo, a permiss@~{a}o para usar a Biblioteca C do GNU permite que muito mais pessoas usem todo o sistema operacional do GNU, bem como sua variante, o sistema operacional do GNU/Linux. Mesmo protegendo a liberdade dos usu@'{a}rios em menor grau, a Licen@,{c}a P@'{u}blica Geral Menor garante ao usu@'{a}rio de um programa que esteja ligado @`{a} Biblioteca a liberdade e os meios para executar o programa, usando uma vers@~{a}o modificada da Biblioteca. Seguem abaixo os termos e condi@,{c}@~{o}es exatos para a c@'{o}pia, distribui@,{c}@~{a}o e modifica@,{c}@~{a}o. Preste muita aten@,{c}@~{a}o @`{a} diferen@,{c}a entre uma "obra baseada na biblioteca" e uma "obra que usa a biblioteca". O primeiro cont@'{e}m c@'{o}digo que @'{e} derivado da biblioteca, enquanto o segundo tem de ser combinado @`{a} biblioteca para que possa ser executado. @unnumberedsec TERMOS E CONDI@,{C}@~{O}ES PARA C@'{O}PIA, DISTRIBUI@,{C}@~{A}O E MODIFICA@,{C}@~{A}O @enumerate 0 @item O presente Contrato de Licen@,{c}a se aplica a qualquer biblioteca de software ou a outro programa que contenha um aviso colocado pelo titular dos direitos autorais ou outra parte autorizada, informando que ela pode ser distribu@'{i}da nos termos desta Licen@,{c}a P@'{u}blica Geral Menor (tamb@'{e}m denominada "esta Licen@,{c}a"). Cada licenciado doravante ser@'{a} denominado "voc@^{e}". Uma "biblioteca" significa uma cole@,{c}@~{a}o de fun@,{c}@~{o}es de software e/ou dados preparados, de forma a serem convenientemente ligados com programas de aplica@,{c}@~{a}o (que usam algumas dessas fun@,{c}@~{o}es e dados) para formar execut@'{a}veis. O termo "Biblioteca", abaixo, refere-se a qualquer biblioteca de software ou obra que tenha sido distribu@'{i}da de acordo com esses termos. Uma "obra baseada na Biblioteca" significa tanto a Biblioteca como qualquer obra derivada, nos termos da legisla@,{c}@~{a}o autoral: isto @'{e}, uma obra contendo a Biblioteca ou parte dela, seja sem altera@,{c}@~{o}es ou com modifica@,{c}@~{o}es e/ou traduzida diretamente para outra linguagem. (Doravante, o termo "modifica@,{c}@~{a}o" inclui, sem reservas, o termo "tradu@,{c}@~{a}o"). O "c@'{o}digo-fonte" de uma obra significa o formato preferencial da obra para que sejam feitas modifica@,{c}@~{o}es na mesma. Para uma biblioteca, o c@'{o}digo-fonte completo significa todo o c@'{o}digo fonte para todos os m@'{o}dulos contidos na mesma, al@'{e}m de quaisquer arquivos de defini@,{c}@~{a}o de interface associados, al@'{e}m dos scripts utilizados para controlar a compila@,{c}@~{a}o e a instala@,{c}@~{a}o da biblioteca. Outras atividades que n@~{a}o a c@'{o}pia, distribui@,{c}@~{a}o e modifica@,{c}@~{a}o n@~{a}o s@~{a}o cobertas por esta Licen@,{c}a; elas est@~{a}o fora de seu escopo. O ato de executar um programa usando a Biblioteca n@~{a}o tem restri@,{c}@~{o}es, e o resultado gerado a partir desse programa encontra-se coberto somente se seu conte@'{u}do constituir uma obra baseada na Biblioteca (independente do uso da Biblioteca em uma ferramenta para escrev@^{e}-lo). Na verdade, isto depender@'{a} daquilo que a Biblioteca faz e o que o programa que usa a biblioteca faz. @item Voc@^{e} pode copiar e distribuir c@'{o}pias sem altera@,{c}@~{o}es do c@'{o}digo-fonte completo da Biblioteca ao receb@^{e}-lo, em qualquer meio ou m@'{i}dia, desde que publique, ostensiva e adequadamente, um aviso de direitos autorais (ou copyright) apropriado e uma notifica@,{c}@~{a}o sobre a exonera@,{c}@~{a}o de garantias; mantenha intactas as informa@,{c}@~{o}es, avisos ou notifica@,{c}@~{o}es referentes a esta Licen@,{c}a e @`{a} aus@^{e}ncia de qualquer garantia; e distribua uma c@'{o}pia desta Licen@,{c}a junto com a Biblioteca. Voc@^{e} poder@'{a} cobrar um valor pelo ato f@'{i}sico de transferir uma c@'{o}pia, e voc@^{e} pode oferecer, se quiser, a prote@,{c}@~{a}o de uma garantia em troca de um valor. @item Voc@^{e} pode modificar sua c@'{o}pia ou c@'{o}pias da Biblioteca ou qualquer parte dela, formando, assim, uma obra baseada na Biblioteca, bem como copiar e distribuir essas modifica@,{c}@~{o}es ou obra, em conformidade com a Cl@'{a}usula 1 acima, desde que atenda, ainda, a todas as seguintes condi@,{c}@~{o}es: @enumerate a @item A obra modificada tem de ser, por si s@'{o}, uma biblioteca de software. @item Voc@^{e} tem de fazer com que os arquivos modificados contenham avisos, em destaque, de que voc@^{e} modificou os arquivos e a data de qualquer modifica@,{c}@~{a}o. @item Voc@^{e} tem de fazer com que a obra como um todo seja licenciada, sem nenhum custo, a todos os terceiros, de acordo com esta Licen@,{c}a. @item Se um dispositivo, na Biblioteca modificada, se referir a uma fun@,{c}@~{a}o ou a uma tabela de dados a ser fornecida por um programa de aplica@,{c}@~{a}o que usa esse dispositivo, outro que n@~{a}o um argumento transmitido quando o dispositivo @'{e} invocado, nesse caso, voc@^{e} ter@'{a} de fazer um esfor@,{c}o de boa-f@'{e} para assegurar que, no caso de uma aplica@,{c}@~{a}o que n@~{a}o forne@,{c}a essa fun@,{c}@~{a}o ou tabela, o dispositivo ainda assim opere, e ir@'{a} realizar qualquer parte de sua finalidade que permanecer significativa. (Por exemplo, uma fun@,{c}@~{a}o de uma biblioteca para computar ra@'{i}zes quadradas tem uma finalidade que @'{e} completamente bem definida independentemente da aplica@,{c}@~{a}o. Por essa raz@~{a}o, a letra d, da Cl@'{a}usula 2, exige que qualquer fun@,{c}@~{a}o ou tabela fornecida pela aplica@,{c}@~{a}o, usada por essa fun@,{c}@~{a}o, tem de ser opcional: se a aplica@,{c}@~{a}o n@~{a}o fornec@^{e}-la, a fun@,{c}@~{a}o de ra@'{i}zes quadradas dever@'{a} ainda assim computar ra@'{i}zes quadradas). @end enumerate Essas exig@^{e}ncias se aplicam @`{a} obra modificada como um todo. Se partes identific@'{a}veis dessa obra n@~{a}o forem derivadas da Biblioteca e puderem ser consideradas razoavelmente, em si, como obras independentes e separadas, nesse caso, esta Licen@,{c}a e seus termos n@~{a}o se aplicar@~{a}o a essas partes quando voc@^{e} distribui-las como obras separadas. Todavia, quando voc@^{e} distribuir essas mesmas partes como partes de um todo, que por si seja uma obra baseada na Biblioteca, a distribui@,{c}@~{a}o desse todo dever@'{a} ser realizada de acordo com esta Licen@,{c}a, cujas respectivas permiss@~{o}es para outros licenciados extendem-se @`{a} integralidade deste todo, dessa forma, a toda e qualquer parte, independentemente de quem a escreveu. Assim, esta cl@'{a}usula n@~{a}o tem a inten@,{c}@~{a}o de afirmar direitos ou contestar os seus direitos sobre uma obra escrita inteiramente por voc@^{e}; a inten@,{c}@~{a}o @'{e}, antes, de exercer o direito de controlar a distribui@,{c}@~{a}o de obras derivadas ou obras coletivas baseadas na Biblioteca. Al@'{e}m disto, a simples agrega@,{c}@~{a}o de outra obra, que n@~{a}o seja baseada na Biblioteca, @`{a} Biblioteca (ou a uma obra baseada na Biblioteca) em um volume de meio ou m@'{i}dia de armazenamento ou distribui@,{c}@~{a}o, n@~{a}o inclui esta outra obra no @^{a}mbito desta Licen@,{c}a. @item Voc@^{e} poder@'{a} optar por aplicar os termos da Licen@,{c}a P@'{u}blica Geral do GNU ao inv@'{e}s desta Licen@,{c}a, para uma determinada c@'{o}pia da Biblioteca. Para tanto, voc@^{e} dever@'{a} alterar todos os avisos ou notifica@,{c}@~{o}es que se refiram a esta Licen@,{c}a, para que eles se refiram @`{a} Licen@,{c}a P@'{u}blica Geral comum do GNU, vers@~{a}o 2, ao inv@'{e}s desta Licen@,{c}a. (Se uma vers@~{a}o mais nova do que a vers@~{a}o 2 da Licen@,{c}a P@'{u}blica Geral comum do GNU tiver sido gerada, ent@~{a}o voc@^{e} poder@'{a} especificar essa vers@~{a}o, se preferir). N@~{a}o fa@,{c}a nenhuma outra altera@,{c}@~{a}o nesses avisos ou notifica@,{c}@~{o}es. Uma vez que essa altera@,{c}@~{a}o tenha sido feita em uma determinada c@'{o}pia, ela @'{e} irrevers@'{i}vel para esta c@'{o}pia, passando a Licen@,{c}a P@'{u}blica Geral comum do GNU a ser aplicada para todas as c@'{o}pias e obras derivadas subseq@"{u}entes, feitas a partir dessa c@'{o}pia. Essa op@,{c}@~{a}o @'{e} @'{u}til quando voc@^{e} desejar copiar parte do c@'{o}digo da Biblioteca em um programa que n@~{a}o seja uma biblioteca. @item Voc@^{e} poder@'{a} copiar e distribuir a Biblioteca (ou uma parte ou obra derivada dela, de acordo com a Cl@'{a}usula 2) em c@'{o}digo-objeto ou formato execut@'{a}vel, sob as Cl@'{a}usulas 1 e 2 acima, desde que inclua todo o c@'{o}digo-fonte correspondente, pass@'{i}vel de leitura pela m@'{a}quina, que deve ser distribu@'{i}do sob os termos das Cl@'{a}usulas 1 e 2 acima, em um meio ou m@'{i}dia costumeiramente utilizado para o interc@^{a}mbio de software. Se a distribui@,{c}@~{a}o do c@'{o}digo-objeto for feita pela oferta de acesso para c@'{o}pia a partir de um local designado, ent@~{a}o a permiss@~{a}o de acesso equivalente para copiar o c@'{o}digo-fonte a partir do mesmo local atende a exig@^{e}ncia de distribui@,{c}@~{a}o do c@'{o}digo-fonte, mesmo que terceiros n@~{a}o sejam levados a copiar a fonte junto com o c@'{o}digo-objeto. @item Um programa que n@~{a}o contenha nenhum derivativo de qualquer parte da Biblioteca, mas que seja desenhado para operar com a Biblioteca ao ser compilado ou ligado a ela, @'{e} chamado de uma "obra que usa a Biblioteca". Essa obra, isoladamente, n@~{a}o @'{e} uma obra derivada da Biblioteca e, portanto, fica de fora do @^{a}mbito desta Licen@,{c}a. Entretanto, a liga@,{c}@~{a}o de uma "obra que usa a Biblioteca" com a Biblioteca constitui um execut@'{a}vel que @'{e} um derivado da Biblioteca (pois cont@'{e}m partes da Biblioteca), e n@~{a}o uma "obra que usa a Biblioteca". O execut@'{a}vel @'{e}, assim, coberto por esta Licen@,{c}a. A Cl@'{a}usula 6 estabelece os termos para a distribui@,{c}@~{a}o desses execut@'{a}veis. Quando uma "obra que usa a Biblioteca" usar material de um arquivo de cabe@,{c}alho que @'{e} parte da Biblioteca, o c@'{o}digo-objeto para a obra poder@'{a} ser uma obra derivada da Biblioteca, mesmo que o c@'{o}digo-fonte n@~{a}o o seja. Para que isto seja verdade, @'{e} especialmente importante se a obra pode ser ligada sem a Biblioteca, ou se a obra @'{e}, em si mesma, uma biblioteca. O limiar para que isto seja verdade n@~{a}o @'{e} definido com precis@~{a}o pela lei. Se um arquivo-objeto usar somente par@^{a}metros num@'{e}ricos, layouts e accessors da estrutura de dados, bem como pequenas macros e pequenas fun@,{c}@~{o}es inline (dez linhas ou menos de extens@~{a}o), ent@~{a}o o uso do arquivo-objeto n@~{a}o @'{e} restrito, independente de ser ele legalmente uma obra derivada. (Execut@'{a}veis contendo este c@'{o}digo-objeto mais partes da Biblioteca continuam submetidos aos termos da Cl@'{a}usula 6). Do contr@'{a}rio, se a obra for um derivado da Biblioteca, voc@^{e} poder@'{a} distribuir o c@'{o}digo objeto da obra sob os termos da Cl@'{a}usula 6. Quaisquer execut@'{a}veis contendo esta obra tamb@'{e}m se submetmem @`{a} Cl@'{a}usula 6, estejam ou n@~{a}o diretamente ligados @`{a} Biblioteca em si. @item Como exce@,{c}@~{a}o @`{a} Cl@'{a}usula acima, voc@^{e} tamb@'{e}m pode combinar ou ligar uma "obra que usa a Biblioteca" @`{a} Biblioteca para produzir uma obra contendo partes da Biblioteca e distribu@'{i}-la de acordo com os termos de sua escolha, desde que estes termos permitam modifica@,{c}@~{o}es na obra para uso pr@'{o}prio por parte do cliente e engenharia reversa para depura@,{c}@~{a}o dessas modifica@,{c}@~{o}es. Em cada c@'{o}pia da obra, voc@^{e} ter@'{a} de colocar um aviso, em destaque, de que a Biblioteca foi usada e que ela e seu uso est@~{a}o cobertos por esta Licen@,{c}a. Voc@^{e} dever@'{a} fornecer uma c@'{o}pia desta Licen@,{c}a. Se, durante a execu@,{c}@~{a}o, a obra exibir avisos ou notifica@,{c}@~{o}es de direitos autorais (ou copyright), voc@^{e} ter@'{a} de incluir, entre eles, o aviso de direitos autorais (ou copyright) referente @`{a} Biblioteca, bem como uma refer@^{e}ncia direcionando o usu@'{a}rio para a c@'{o}pia desta Licen@,{c}a. Al@'{e}m disso, voc@^{e} dever tomar ao menos uma das seguintes provid@^{e}ncias: @enumerate a @item Incluir na obra todo o c@'{o}digo-fonte da Biblioteca, pass@'{i}vel de leitura pela m@'{a}quina, incluindo quaisquer modifica@,{c}@~{o}es que foram usadas na obra (as quais devem ser distribu@'{i}das conforme as Cl@'{a}usulas 1 e 2 acima); e, se a obra for um execut@'{a}vel ligado @`{a} Biblioteca, com toda a "obra que usa a Bilblioteca" pass@'{i}vel de leitura pela m@'{a}quina, como c@'{o}digo-objeto e/ou c@'{o}digo-fonte, de modo que o usu@'{a}rio possa modificar a biblioteca e, depois, religar para produzir um execut@'{a}vel modificado contendo a Biblioteca modificada. (Fica entendido que o usu@'{a}rio que modificar o conte@'{u}do dos arquivos de defini@,{c}@~{o}es da Biblioteca n@~{a}o necessariamente ser@'{a} capaz de recompilar a aplica@,{c}@~{a}o para usar as defini@,{c}@~{o}es modificadas). @item Usar um mecanismo adequado de biblioteca compartilhada para ligar com a Biblioteca. Um mecanismo adequado @'{e} aquele que (a) usa, ao tempo da execu@,{c}@~{a}o, uma c@'{o}pia da biblioteca j@'{a} presente no sistema do computador do usu@'{a}rio, e (2) ir@'{a} operar adequadamente com uma vers@~{a}o modificada da biblioteca, se o usu@'{a}rio instalar uma, desde que a vers@~{a}o modificada seja compat@'{i}vel com a interface da vers@~{a}o com a qual a obra foi feita. @item Incluir na obra uma oferta por escrito, v@'{a}lida por pelo menos 3 anos, oferencendo ao mesmo usu@'{a}rio os materiais especificados na letra "a" da Cl@'{a}usula 6 acima, por um custo n@~{a}o superior ao custo de fazer esta distribui@,{c}@~{a}o. @item Se a distribui@,{c}@~{a}o da obra for feita com a permiss@~{a}o de acesso para copiar, a partir de um local designado, oferecer acesso equivalente para copiar os materiais acima especificados, a partir do mesmo local. @item Certificar-se se o usu@'{a}rio j@'{a} recebeu uma c@'{o}pia desses materiais ou de que voc@^{e} j@'{a} enviou uma c@'{o}pia a esse usu@'{a}rio. @end enumerate Para um execut@'{a}vel, o formato exigido da "obra que usa a Biblioteca" deve incluir quaisquer dados e programas utilit@'{a}rios necess@'{a}rios para reprodu@,{c}@~{a}o do execut@'{a}vel a partir dele. Todavia, como uma exce@,{c}@~{a}o especial, os materiais a serem distribu@'{i}dos n@~{a}o necessitam incluir algo que seja normalmente distribu@'{i}do (tanto no formato fonte quanto bin@'{a}rio) com os componentes mais importantes (compilador, kernel, e assim por diante) do sistema operacional no qual execut@'{a}vel @'{e} executado, a menos que esse componente, em si, acompanhe o execut@'{a}vel. Pode ocorrer que essa exig@^{e}ncia contradiga as restri@,{c}@~{o}es da licen@,{c}a de outras bibliotecas propriet@'{a}rias que normalmente n@~{a}o acompanham o sistema operacional. Essa contradi@,{c}@~{a}o significa que voc@^{e} n@~{a}o pode utilizar ambas e a Biblioteca juntas em um execut@'{a}vel distribu@'{i}do por voc@^{e}. @item Voc@^{e} pode colocar dispositivos da biblioteca que sejam uma obra baseada na Biblioteca lado-a-lado em uma @'{u}nica biblioteca junto com outros dispositivos de bibliotecas, desde que uma distribui@,{c}@~{a}o separada da obra baseada na Biblioteca e dos outros dispositivos de bibliotecas seja, de outro modo, permitida e desde que voc@^{e} tome uma das seguintes provid@^{e}ncias: @enumerate a @item Incluir na biblioteca combinada uma c@'{o}pia dessa obra baseada na Biblioteca sem a combina@,{c}@~{a}o com quaisquer outros dispositivos de biblioteca. Essa c@'{o}pia tem de ser distribu@'{i}da de acordo com as condi@,{c}@~{o}es das cl@'{a}usulas acima. @item Junto com a biblioteca combinada, fornecer um aviso, em destaque, sobre o fato de que parte dela @'{e} uma obra baseada na Biblioteca, e explicando onde encontrar o formato n@~{a}o combinado incluso dessa mesma obra. @end enumerate @item Voc@^{e} n@~{a}o poder@'{a} copiar, modificar, sublicenciar, ligar, ou distribuir a Biblioteca, exceto conforme expressamente disposto nesta Licen@,{c}a. Qualquer tentativa de, de outro modo, copiar, modificar, sublicenciar, ligar ou distribuir a Biblioteca @'{e} inv@'{a}lida, e automaticamente terminar@'{a} seus direitos sob esta Licen@,{c}a. Todavia, terceiros que tiverem recebido c@'{o}pias ou direitos de voc@^{e}, de acordo com esta Licen@,{c}a, n@~{a}o ter@~{a}o seus direitos rescindidos, enquanto estes terceiros mantiverem o seu pleno cumprimento. @item Voc@^{e} n@~{a}o @'{e} obrigado a aceitar esta Licen@,{c}a, uma vez que voc@^{e} n@~{a}o a assinou. Entretanto, nada mais concede a voc@^{e} permiss@~{a}o para modificar ou distribuir a Biblioteca ou suas obras derivadas. Esses atos s@~{a}o proibidos por lei se voc@^{e} n@~{a}o aceitar esta Licen@,{c}a. Portanto, ao modificar ou distribuir a Biblioteca (ou qualquer obra baseada na Biblioteca), voc@^{e} manifesta sua aceita@,{c}@~{a}o desta Licen@,{c}a para faz@^{e}-lo, bem como de todos os seus termos e condi@,{c}@~{o}es para c@'{o}pia, distribui@,{c}@~{a}o ou modifica@,{c}@~{a}o da Biblioteca ou obras nela baseadas. @item A cada vez que voc@^{e} redistribuir a Biblioteca (ou qualquer obra nela baseada), o receptor automaticamente recebe uma licen@,{c}a do licenciante original para copiar, distribuir, ligar ou modificar a Biblioteca, sujeito a estes respectivos termos e condi@,{c}@~{o}es. Voc@^{e} n@~{a}o poder@'{a} impor quaisquer restri@,{c}@~{o}es adicionais ao exerc@'{i}cio, pelos receptores, dos direitos concedidos por este instrumento. Voc@^{e} n@~{a}o tem responsabilidade de promover o cumprimento desta licen@,{c}a por parte de terceiros. @item Se, como resultado de uma senten@,{c}a judicial ou alega@,{c}@~{a}o de viola@,{c}@~{a}o de patente, ou por qualquer outro motivo (n@~{a}o restrito @`{a}s quest@~{o}es de patentes), forem impostas a voc@^{e} condi@,{c}@~{o}es (tanto atrav@'{e}s de mandado judicial, contrato ou qualquer outra forma) que contradigam as condi@,{c}@~{o}es desta Licen@,{c}a, voc@^{e} n@~{a}o estar@'{a} desobrigado quanto @`{a}s condi@,{c}@~{o}es desta Licen@,{c}a. Se voc@^{e} n@~{a}o puder atuar como distribuidor de modo a satisfazer simultaneamente suas obriga@,{c}@~{o}es sob esta Licen@,{c}a e quaisquer outras obriga@,{c}@~{o}es pertinentes, ent@~{a}o, como conseq@"{u}@^{e}ncia, voc@^{e} n@~{a}o poder@'{a} distribuir a Biblioteca de nenhuma forma. Por exemplo, se uma licen@,{c}a sob uma patente n@~{a}o permite a redistribui@,{c}@~{a}o por parte de todos aqueles que tiverem recebido c@'{o}pias, direta ou indiretamente de voc@^{e}, sem o pagamento de royalties, ent@~{a}o, a @'{u}nica forma de cumprir tanto com esta exig@^{e}ncia quanto com esta licen@,{c}a ser@'{a} deixar de distribuir, por completo, a Biblioteca. Se qualquer parte desta Cl@'{a}usula for considerada inv@'{a}lida ou n@~{a}o execut@'{a}vel, sob qualquer circunst@^{a}ncia espec@'{i}fica, o restante da cl@'{a}usula dever@'{a} continuar a ser aplicado e a cl@'{a}usula, como um todo, dever@'{a} ser aplicada em outras circunst@^{a}ncias. Esta cl@'{a}usula n@~{a}o tem a finalidade de induzir voc@^{e} a infringir quaisquer patentes ou direitos de propriedade, nem de contestar a validade de quaisquer reivindica@,{c}@~{o}es deste tipo; a @'{u}nica finalidade desta cl@'{a}usula @'{e} proteger a integridade do sistema de distribui@,{c}@~{a}o do software livre, o qual @'{e} implementado mediante pr@'{a}ticas de licen@,{c}as p@'{u}blicas. Muitas pessoas t@^{e}m feito generosas contribui@,{c}@~{o}es @`{a} ampla gama de software distribu@'{i}do atrav@'{e}s desse sistema, confiando na aplica@,{c}@~{a}o consistente deste sistema; cabe ao autor/doador decidir se deseja distribuir software atrav@'{e}s de qualquer outro sistema e um licenciado n@~{a}o pode impor esta escolha. Esta cl@'{a}usula visa deixar absolutamente claro o que se acredita ser uma conseq@"{u}@^{e}ncia do restante desta Licen@,{c}a. @item Se a distribui@,{c}@~{a}o e/ou uso da Biblioteca for restrito em determinados pa@'{i}ses, tanto por patentes ou por interfaces protegidas por direito autoral, o titular original dos direitos autorais que colocar a Biblioteca sob esta Licen@,{c}a poder@'{a} acrescentar uma limita@,{c}@~{a}o geogr@'{a}fica de distribui@,{c}@~{a}o expl@'{i}cita excluindo esses pa@'{i}ses, de modo que a distribui@,{c}@~{a}o seja permitida somente nos pa@'{i}ses ou entre os pa@'{i}ses que n@~{a}o foram exclu@'{i}dos dessa forma. Nesse caso, esta Licen@,{c}a passa a incorporar a limita@,{c}@~{a}o como se esta tivesse sido escrita no corpo desta Licen@,{c}a @item A Free Software Foundation [Funda@,{c}@~{a}o Software Livre] poder@'{a} de tempos em tempos publicar vers@~{o}es revisadas e/ou novasda Licen@,{c}a P@'{u}blica Geral Menor. Essas novas vers@~{o}es ser@~{a}o semelhantes em esp@'{i}rito @`{a} presente vers@~{a}o, podendo, por@'{e}m, ter diferen@,{c}as nos detalhes, para tratar de novos problemas ou preocupa@,{c}@~{o}es. Cada vers@~{a}o recebe um n@'{u}mero distinto de vers@~{a}o. Se a Biblioteca especificar um n@'{u}mero de vers@~{a}o desta Licen@,{c}a, aplic@'{a}vel @`{a} Biblioteca ou a "qualquer vers@~{a}o posterior", voc@^{e} ter@'{a} a op@,{c}@~{a}o de seguir os termos e condi@,{c}@~{o}es tanto daquela vers@~{a}o como de qualquer vers@~{a}o posterior publicada pela Free Software Foundation. Se a Biblioteca n@~{a}o especificar um n@'{u}mero de licen@,{c}a da vers@~{a}o, voc@^{e} poder@'{a} escolher qualquer vers@~{a}o j@'{a} publicada pela Free Software Foundation. @item Se voc@^{e} desejar incorporar partes da Biblioteca em outros programas livres cujas condi@,{c}@~{o}es de distribui@,{c}@~{a}o sejam incompat@'{i}veis com estas, escreva ao autor para solicitar permiss@~{a}o. Para software cujos direitos autorais pertencerem @`{a} Free Software Foundation, escreva @`{a} Funda@,{c}@~{a}o; algumas vezes, fazemos exce@,{c}@~{o}es nesse sentido. Nossa decis@~{a}o ser@'{a} guiada pelos dois objetivos de preservar a condi@,{c}@~{a}o livre de todos os derivados de nosso software livre e de promover o compartilhamento e reutiliza@,{c}@~{a}o de softwares, de modo geral. @c @heading EXCLUS@~{A}O DE GARANTIA @emph{ EXCLUS@~{A}O DE GARANTIA} @item COMO A BIBLIOTECA @'{E} LICENCIADA SEM CUSTO, N@~{A}O H@'{A} NENHUMA GARANTIA PARA A BIBLIOTECA, NO LIMITE PERMITIDO PELA LEI APLIC@'{A}VEL. EXCETO QUANDO DE OUTRA FORMA ESTABELECIDO POR ESCRITO, OS TITULARES DOS DIREITOS AUTORAIS E/OU OUTRAS PARTES FORNECEM A BIBLIOTECA "NO ESTADO EM QUE SE ENCONTRA", SEM NENHUMA GARANTIA DE QUALQUER TIPO, TANTO EXPRESSA COMO IMPL@'{I}CITA, INCLUINDO, DENTRE OUTRAS, AS GARANTIAS IMPL@'{I}CITAS DE COMERCIABILIDADE E ADEQUA@,{C}@~{A}O PARA UMA FINALIDADE ESPEC@'{I}FICA. O RISCO INTEGRAL QUANTO @`{A} QUALIDADE E DESEMPENHO DA BIBLIOTECA @'{E} ASSUMIDO POR VOC@^{E}. CASO A BIBLIOTECA CONTENHA DEFEITOS, VOC@^{E} ARCAR@'{A} COM OS CUSTOS DE TODOS OS SERVI@,{C}OS, REPAROS OU CORRE@,{C}@~{O}ES NECESS@'{A}RIAS. @item EM NENHUMA CIRCUNST@^{A}NCIA, A MENOS QUE EXIGIDO PELA LEI APLIC@'{A}VEL OU ACORDADO POR ESCRITO, QUALQUER TITULAR DE DIREITOS AUTORAIS OU QUALQUER OUTRA PARTE QUE POSSA MODIFICAR E/OU REDISTRIBUIR A BIBLIOTECA, CONFORME PERMITIDO ACIMA, SER@'{A} RESPONS@'{A}VEL PARA COM VOC@^{E} POR DANOS, INCLUINDO ENTRE OUTROS QUAISQUER DANOS GERAIS, ESPECIAIS, FORTUITOS OU EMERGENTES, ADVINDOS DO USO OU IMPOSSIBILIDADE DE USO DA BIBLIOTECA (INCLUINDO, ENTRE OUTROS, PERDA DE DADOS, DADOS SENDO GERADOS DE FORMA IMPRECISA, PERDAS SOFRIDAS POR VOC@^{E} OU TERCEIROS OU A IMPOSSIBILIDADE DA BIBLIOTECA DE OPERAR COM QUALQUER OUTRO SOFTWARE), MESMO QUE ESSE TITULAR, OU OUTRA PARTE, TENHA SIDO AVISADO SOBRE A POSSIBILIDADE DESSES DANOS. @end enumerate @heading FINAL DOS TERMOS E CONDI@,{C}@~{O}ES @page @unnumberedsec Como Aplicar Estes Termos para Suas Novas Bibliotecas Se voc@^{e} desenvolver uma nova biblioteca e quiser que ela seja da maior utilidade poss@'{i}vel para o p@'{u}blico, n@'{o}s recomendamos fazer dela um software livre que todos possam redistribuir e modificar. Voc@^{e} pode fazer isto permitindo a redistribui@,{c}@~{a}o sob estes termos (ou, alternativamente, sob os termos da Licen@,{c}a P@'{u}blica Geral comum) Para fazer isto, anexe as notifica@,{c}@~{o}es seguintes @`{a} biblioteca. @'{E} mais seguro anex@'{a}-las ao come@,{c}o de cada arquivo-fonte, de modo a transmitir do modo mais eficiente a exclus@~{a}o de garantia; e cada arquivo deve ter ao menos a linha de "direitos autorais reservados" e uma indica@,{c}@~{a}o de onde a notifica@,{c}@~{a}o completa se encontra. @smallexample @var{uma linha para informar o nome da biblioteca e uma breve id@'{e}ia do que ela faz.} Direitos Autorais Reservados (C) @var{nome do autor} Esta biblioteca @'{e} software livre; voc@^{e} pode redistribu@'{i}-la e/ou modific@'{a}-la sob os termos da Licen@,{c}a P@'{u}blica Geral Menor do GNU conforme publicada pela Free Software Foundation; tanto a vers@~{a}o 2.1 da Licen@,{c}a, ou (a seu crit@'{e}rio) qualquer vers@~{a}o posterior. Esta biblioteca @'{e} distribu@'{i}do na expectativa de que seja @'{u}til, por@'{e}m, SEM NENHUMA GARANTIA; nem mesmo a garantia impl@'{i}cita de COMERCIABILIDADE OU ADEQUA@,{C}@~{A}O A UMA FINALIDADE ESPEC@'{I}FICA. Consulte a Licen@,{c}a P@'{u}blica Geral Menor do GNU para mais detalhes. Voc@^{e} deve ter recebido uma c@'{o}pia da Licen@,{c}a P@'{u}blica Geral Menor do GNU junto com esta biblioteca; se n@~{a}o, escreva para a Free Software Foundation, Inc., no endere@,{c}o 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. @end smallexample Inclua tamb@'{e}m informa@,{c}@~{o}es sobre como contatar voc@^{e} por correio eletr@^{o}nico e por meio postal. Voc@^{e} tamb@'{e}m pode solicitar a seu empregador (se voc@^{e} for um programador) ou a sua institui@,{c}@~{a}o acad@^{e}mica, se for o caso, para assinar uma "ren@'{u}ncia de direitos autorais" sobre a biblioteca, se necess@'{a}rio. Segue um exemplo; altere os nomes: @smallexample A Yoyodyne Ltda., neste ato, renuncia a todos eventuais direitos autorais sobre a biblioteca 'Frob' (uma biblioteca para ajustar fechaduras), escrita por James Random Hacker. , 1 de abril de 1990 Ty Coon, Presidente @end smallexample Isso @'{e} tudo! @node Historia, Plantaformas, Copiando, Top @unnumbered Hist@'{o}ria do Desenvolvimento do Geomview Geomview foi originalmente escrito no Geometry Center da the University of Minnesota in Minneapolis. O Geometry Center era um centro de pesquisa e educa@,{c}@~{a}o fundado pela National Science Foundation, com a miss@~{a}o de promover pesquisa e comunica@,{c}@~{a}o de assuntos relacionados @`{a} matem@'{a}tica. A maioria do trabalho era direcionado ao uso de computadores para ajudar a visualiza@,{c}@~{a}o de conceitos matem@'{a}ticos. O projeto que eventualmente levou ao Geomview come@,{c}ou no ver@~{a}o de 1988 com o trabalho de Pat Hanrahan sobre um programa de visualiza@,{c}@~{a}o chamado MinneView. Pouco tempo depois Charlie Gunn come@,{c}ou o desenvolvimento da OOGL (Object Oriented Graphics Language) juntamente com o MinneView. Muitas pessoas comtribuiram para a OOGL e o MinneView, incluindo Stuart Levy, Mark Meuer, Tamara Munzner, Steve Anderson, Mario Lopez, Todd Kaplan. Em 1991 o staff do Geometry Center come@,{c}ou o trabalho sobre uma nova e melhorada vers@~{a}o da OOGL, e um novo e melhorado programa de visualiza@,{c}@~{a}o, o qual eles chamaram Geomview. Naquele tempo essencialmente o @'{u}nico jogo no comercio para gr@'{a}ficos interativos em tr@^{e}s dimens@~{o}es era Silicon Graphics (SGI), de forma que Geomview foi desenvolvido inicialmente em esta@,{c}@~{o}es de trabalho SGI, usando a IRIS GL. A primeira vers@~{a}o foi finalizada em Janeiro de 1992. Essa primeira vers@~{a}o tornou-se muito popular entre visitantes do Geometry Center, e atrav@'{e}s do ftp do Centro (isso ocorreu antes do advento da web) pessoas em outras institui@,{c}@~{o}es come@,{c}aram a usar essa primeira vers@~{a}o tamb@'{e}m. Adicionalmente a esta@,{c}@~{o}es de trabalho SGI o Geometry Center tinha algumas poucas esta@,{c}@~{o}es NeXT completas, de forma que ap@'{o}s Geomview estar sendo executado em m@'{a}quinas SGIs a equipe desenvolveu uma vers@~{a}o para NeXTStep tamb@'{e}m. Nessa @'{e}poca ouveram muitos milhares de pessoas usando Geomview ao redor do mundo. Alguns anos depois a equipe portou Geomview para o X windows e a OpenGL, e eventualmente, com o desaparecimento da NeXT, a vers@~{a}o para NeXT seguiu o mesmo caminho. Nessa miss@~{a}o de incentivar a comunica@,{c}@~{a}o entre pesquisadores e educadores, o Geometry Center desenvolveu um web site, www.geom.umn.edu, mais tarde em 1993. Esse foi um dos primeiros 300 s@'{i}tios na web que existiram no mundo. Uma parte desse s@'{i}tio web era certamente devotado ao Geomview, e ajudou a propagar o trabalho durante sua exist@^{e}ncia. O Geometry Center fechou suas instala@,{c}@~{o}es de "tijolos e cimento" em Agosto de 1998 (NSF cortou suas verbas), mas o s@'{i}tio web continuou a existir, e o Geomview continuou a ser popular ao redor do mundo. Em Dezembro de 1999 algum membro da equipe original do Geometry Center configurou @uref{http://www.geomview.org} como casa permanente na web para o Geomview. Os autores originais do Geomview, bem como v@'{a}rios outros volun@'{a}rios ao redor do mundo, est@~{a}o ainda ativamente envolvidos na utiliza@,{c}@~{a}o e no desenvolvimento do Geomview. @menu * Autores:: Autores. @end menu @node Autores, , Historia, Historia @unnumberedsec Autores Tamara Munzner, Stuart Levy, e Mark Phillips s@~{a}o os autores originais do Geomview. Celeste Fowler, Charlie Gunn, e Nathaniel Thurston tamb@'{e}m fazem contribui@,{c}@~{o}es sgnificativas. Daniel Krech e Scott Wisdom fizeram o NeXTStep e a adapta@,{c}@~{a}o do RenderMan, e Daeron Meyer e Tim Rowley fizeram a adapta@,{c}@~{a}o para o X windows. Muitos outros membros do estado maior do Geometry Center, bem como muitas pessoas em muitos lugares, tamb@'{e}m contribu@'{i}ram. Mark Phillips escreveu esse manual, com ajuda substancial de Stuart Levy e Tamara Munzner. Incont@'{a}veis usu@'{a}rios do Geomview tamb@'{e}m foram de grande ajuda por meio da leitura do manual e indicando nossos enganos. @node Plantaformas, Pronuncia, Historia, Top @unnumbered Plantaformas Suportadas Geomview 1.9 pode -- em princ@'{i}pio -- compilar e executar sobre quaisquer claramente recentes sistemas operacionais semelhantes ao Unix. Especificamente, Geomview executa sobre Linux e sobre Cygwin (Cygwin emula um ambiente semelhante ao SystemV Unix environment sob o Microsoft Windows). Desafortunadamente Geomview compila com MacOS X (Darwin), mas aparentemente comunica@,{c}@~{o}es com Geomview por meio de pipes e sockets causam falha de segmentac@~{a}o. Sinta-se livre para consertar essa falha! Veja @ref{Contribuindo}, para detalhes. @c Geomview runs on a wide variety of Unix systems. It has been tested on @c each of the following systems: Linux, FreeBSD, SGI, Sun either (Sun-OS @c 4.1.x and Solaris), HP RISC, Dec Alpha, RS/6000, and NeXT. Precompiled @c distributions are available for all of these systems. Using either @c OpenGL or the generic X11 renderer it can probably be compiled on other @c Unix systems as well. @c There is not a version of Geomview for Microsoft Windows. The main @c reason for this is that at the time when Geomview was written, personal @c computers were not fast enough to make interactive 3D graphics feasible, @c and by the time fast-enough PCs came around, the Geometry Center, @c where Geomview was developed, was in the process of being closed. The @c staff started work on a port to Windows but was not able to finish it @c before the Center shut down. @c If you would like to see a version of Geomview for Windows, @c you can contribute to its development in several ways. @c @xref{Contribuindo}, for details. @c There is also no version of Geomview for Macintosh. @node Pronuncia, Visao Geral, Plantaformas, Top @unnumbered Como Pronunciar ``Geomview`` A palavra 'Geomview' @'{e} uma combina@,{c}@~{a}o da primeira s@'{i}laba da palavra 'geometry', e da palavra 'view'. Os autores pronunciam Geomview como uma palavra ox@'{i}tona, isto @'{e}, tonicidade na primeira s@'{i}laba. @display GE-om-view @end display Algumas pessoas colocam a tonicidade na segunda s@'{i}laba, onde Geomview cai na palavra 'geometry', mas os autores originais, que criaram o nome, preferem a pron@'{u}ncia com tonicidade na primeira s@'{i}laba. @comment @comment @node node-name, next, previous, up @comment @comment **************************************************************** @node Visao Geral, Tutorial, Pronuncia, Top @chapter Vis@~{a}o Geral O principal objetivo do Geomview @'{e} mostrar objetos cuja geometria @'{e} fornecida, permitindo controle interativo sobre detalhes tais como ponto de vis@~{a}o, velocidade de movimento, apar@^{e}ncia de superf@'{i}cies e linhas, e assim por diante. Geomview pode manusear qualquer n@'{u}mero de objetos e permite controle coletivo ou separado sobre eles. A maneira mais simples de usar Geomview @'{e} como um visualizador independente para ver e controlar objetos. Geomview pode mostrar objetos descritos em uma variedade de formatos de arquivo. Geomview @'{e} acompanhado com uma larga variedade de objetos como exemplo, e voc@^{e} pode criar seus pr@'{o}prios objetos. Voc@^{e} pode tamb@'{e}m usar Geomview para manusear os dados a serem mostrados provenientes de outro programa que est@'{a} sendo executado simult@^{a}neamente. Como o outro programa modifica os dados, a imagem no Geomview reflete as modifica@,{c}@~{o}es. Programas que geram objetos e utilizam o Geomview para mostr@'{a}-los s@~{a}o chamados @emph{m@'{o}dulos externos}. M@'{o}dulos externos podem controlar quase todos os aspectos do Geomview. A id@'{e}ia aqui @'{e} que muitos aspectos de visualiza@,{c}@~{a}o e partes da intera@,{c}@~{a}o de programas geom@'{e}tricos s@~{a}o independentes do conte@'{u}do geom@'{e}trico e podem ser coletados conjuntamente em uma pe@,{c}a simples de programa que pode ser usada em uma larga variedade de situa@,{c}@~{o}es. O autor de um m@'{o}dulo externo pode concentrar-se sobre a implementa@,{c}@~{a}o dos algor@'{i}tmos desejados e deixar os aspectos de visualiza@,{c}@~{a}o ao Geomview. Geomview @'{e} acompanhado por uma cole@,{c}@~{a}o de m@'{o}dulos externos a t@'{i}tulo de exemplo, e esse manual descreve como escrever seu pr@'{o}prio @emph{m@'{o}dulo externo}. Geomview @'{e} o produto de um esfor@,{c}o no @dfn{Geometry Center} para disponibilizar um @dfn{software} de geometria interativa que @'{e} particularmente apropriado para pesquisa matem@'{a}tica e educa@,{c}@~{a}o. Em particular, Geomview pode mostrar coisas no espa@,{c}o hiperb@'{o}lico e no espa@,{c}o esf@'{e}rico bem como no espa@,{c}o Euclidiano. Geomview permite m@'{u}ltiplos objetos e c@^{a}meras que s@~{a}o controlados independentemente. As c@^{a}meras fornecem controle interativo para movimento, apar@^{e}ncias (incluindo ilumina@,{c}@~{a}o, sombreamento, e materiais), selecionando um objeto, aresta ou n@'{i}vel de v@'{e}rtice, instant@^{a}neos em um arquivo de imagem SGI ou no formato Renderman RIB, a adi@,{c}@~{a}o ou apagamento de objetos @'{e} poss@'{i}vel atrav@'{e}s do controle direto do mouse, pain@'{e}is de controle, e teclas de atalho via teclado. Geomview suporta os seguintes tipos de dados simples: poliedros com v@'{e}rtices compartilhados (.off), quadril@'{a}teros, malhas retangulares, vetores, e ajustes em superf@'{i}cies de Bezier de grau arbitr@'{a}rio incluindo ajustes racionais. Hierarqu@'{i}as de objetos podem ser constru@'{i}das com listas de objetos e inst@^{a}ncias de objeto(s) transformado(s) por uma ou mais matrizes 4x4. Por@,{c}@~{o}es arbitr@'{a}rias de modifica@,{c}@~{o}es de hierarqu@'{i}as podem ser transmitidas por meio da cria@,{c}@~{a}o de refer@^{e}ncias nomeadas. Geomview pode mostrar sa@'{i}das gr@'{a}ficas tridimensionais provenientes do Mathematica e do Maple. @comment **************************************************************** @node Tutorial, Interacao, Visao Geral, Top @chapter Tutorial Esse cap@'{i}tulo conduzir@'{a} voc@^{e} atrav@'{e}s de alguns usos elementares do Geomview. Traba-lhando do come@,{c}o ao fim desse cap@'{i}tulo de frente a um computador onde voc@^{e} pode tentar acompanhar os exemplos fornecidos aqui voc@^{e} receber@'{a} um pouco do que pode ser feito com Geomview. Para iniciar o Geomview, coloque seu usu@'{a}rio e sua senha no computador e abra uma janela de shell. Uma janela de shell @'{e} uma janela na qual voc@^{e} pode digitar comandos Unix; o prompt na janela usualmente termina com um '%'. Na janela de shell (o cursor do mouse deve estar posicionado sobre a janela) digite o seguinte (@kbd{@key{Enter}} aqui significa pressione a tecla "Enter"): @example geomview tetra dodec @key{Enter} @end example Esse comando inicia o Geomview e chama dois objetos exemplo, um tetraedro e um dodecaedro. Ap@'{o}s poucos segundos tr@^{e}s janelas ir@~{a}o aparecer; @pxref{figinitial, Figure}. @float Figura,figinitial @image{figs/initial} @caption{Tela Inicial do Geomview.} @end float O painel @`{a} esquerda @'{e} o painel de controle principal do Geomview; Esse painel @'{e} chamado de painel @emph{Main} (principal). O painel menor ao centro @'{e} o painel @emph{Tools} (de ferramentas) e serve para selecionar diferentes tipos de movimentos. A janela do lado direito @'{e} a janela de c@^{a}mera e nessa janela voc@^{e} v@^{e} um tetraedro grande e um dodecaedro que est@'{a} parcialmente obscurecido pelo tetraedro. Geomview tem alguns pain@'{e}is mas por padr@~{a}o ele mostra somente esses tr@^{e}s. iremos descrever alguns aspectos desses tr@^{e}s e alguns dos outros nesse tutorial. Voc@^{e} pode ler mais sobre esses e outros pain@'{e}is nos cap@'{i}tulos adiante neste manual. Coloque o cursor do mouse na janela de c@^{a}mera e pressione e mantenha pressionado o bot@~{a}o esquerdo do mouse. Agora, enquanto mant@'{e}m pressionado o bot@~{a}o, lentamente mova o mouse com movimentos pequenos. Voc@^{e} ver@'{a} a figura rotacionar na dire@,{c}@~{a}o na qual voc@^{e} mover o mouse. Se voc@^{e} liberar o bot@~{a}o do mouse enquanto move o mesmo, a figura continua girando. Para parar o movimento de rota@,{c}@~{a}o, mantenha o mouse sobre a figura e pressione rapidamente o bot@~{a}o esquerdo do mesmo. Geomview utiliza o modelo da @emph{esfera de vidro} para os movimentos iniciados atrav@'{e}s do mouse. Isso significa que voc@^{e} est@'{a} supondo o objeto como estando dentro de uma esfera invis@'{i}vel e o cursor do mouse como sendo uma al@,{c}a fora da esfera provida de uma ventosa. Quando voc@^{e} mant@'{e}m pressionado o bot@~{a}o esquerdo do mouse, a ventosa da al@,{c}a gruda na esfera; quando voc@^{e} libera o bot@~{a}o do mouse, a ventosa da al@,{c}a libera a esfera. Movendo o mouse enquanto mant@'{e}m pressionado o bot@~{a}o faz com que a esfera (e conceq@"{u}@^{e}ntemente o objeto) mova-se na mesma dire@,{c}@~{a}o que o mouse. Adicionalmente para os dois s@'{o}lidos que est@~{a}o atualmente na tela voc@^{e} pode tamb@'{e}m ver duas molduras de fios em forma de caixa na janela de c@^{a}mera. Essas s@~{a}o as "caixas associadas" dos dois objetos. Por padr@~{a}o Geomview coloca uma caixa associada em torno de cada objeto que @'{e} mostrada de forma que voc@^{e} tenha uma id@'{e}ia de o quanto grande o objeto @'{e}. Note que quando voc@^{e} move o mouse em torno do tetraedro e do dodecaedro eles se movem como se fossem uma @'{u}nica figura. Isso ocorre porque por padr@~{a}o o que voc@^{e} est@'{a} movendo atualmente @'{e} o "World" (objeto mundo). Para mover um dos objetos individualmente em lugar de o objeto mundo como um todo, mova o cursor do mouse para o navegador de alvos (@emph{Targets}) no painel principal (@emph{Main}). Clique (qualquer bot@~{a}o) sobre a palavra @emph{tetra}. Isso faz com que o tetraedro seja o "objeto alvo". Agora mova o cursor de volta @`{a} janela de c@^{a}mera e voc@^{e} poder@'{a} rotacionar apenas o tetraedro. O movimento que voc@^{e} aplicou at@'{e} agora foi a rota@,{c}@~{a}o, porque esse @'{e} o modo de modo de movimento selecionado no painel de ferramentas (@emph{Tools}). Para efetuar o movimento de transla@,{c}@~{a}o em lugar do movimento de rota@,{c}@~{a}o, clique sobre o bot@~{a}o transla@,{c}@~{a}o (@emph{Translate}). Agora quando voc@^{e} mover o mouse na janela de c@^{a}mera enquanto mant@'{e}m pressionado o bot@~{a}o esquerdo, o tetraedro (que deve ser ainda o objeto alvo de antes) ir@'{a} ser transladado na dire@,{c}@~{a}o que voc@^{e} move o mouse. Note que voc@^{e} pode transladar o tetraedro na dire@,{c}@~{a}o da borda da janela enquanto voc@^{e} mant@'{e}m pressionado o bot@~{a}o esquerdo do mouse. Se voc@^{e} liberar o bot@~{a}o do mouse enquanto move o mesmo, o tetraedro ir@'{a} continuar o movimento sozinho. O tetraedro mover-se-@'{a} ao contr@'{a}rio do que ocorria antes muito rapidamente de forma que @'{e} muito f@'{a}cil perder o rastro de onde ele se encontra. Se voc@^{e} acidentalmente perder o tetraedro atrav@'{e}s de transla@,{c}@~{a}o para muito longe da janela de vis@~{a}o, voc@^{e} pode peg@'{a}-lo de volta atrav@'{e}s de um clique sobre o bot@~{a}o Centro (@emph{Center}) no painel de ferramentas (@emph{Tools}). Isso far@'{a} com que o tetraedro retorne para a sua posi@,{c}@~{a}o inicial. Clique sobre o bot@~{a}o Centro (@emph{Center}) para trazer o tetraedro ao centro da janela de c@^{a}mera, e ent@~{a}o coloque-o em uma posi@,{c}@~{a}o de forma que voc@^{e} possa ver completamente o dodecaedro. Seu objeto mundo agora tem dois objetos que est@~{a}o um ao lado do outro. Voc@^{e} pode ver o dodecaedro no meio da janela de c@^{a}mera e pode ver parte do tetraedro parcialmente fora da janela de c@^{a}mera. Volte para o navegador de alvos (@emph{Targets}) no painel principal (@emph{Main}) e clique sobre o "World" para selecionar o referido objeto mundo novamente. Agora clique sobre o bot@~{a}o "Olhar Para" (@emph{Look At}) no painel de ferramentas (@emph{Tools}). Voc@^{e} pode ver o dodecaedro e o tetraedro ajustando-se ao meio da janela (figura @pxref{figlookatworld}). O bot@~{a}o "Olhar Para" (@emph{Look At}) posiciona a c@^{a}mera em uma posi@,{c}@~{a}o tal que o objeto alvo fique centrado na janela. @float Figura,figlookatworld @image{figs/fig2} @caption{Olhando para o Objeto Mundo.} @end float Agora coloque o cursor sobre o meio do dodecaedro e d@^{e} sobre ele um duplo clique com o bot@~{a}o direito do mouse. Isso significa clicar no mouse para baixo e para cima duas vezes em uma r@'{a}pida sucess@~{a}o. Note que o dodecaedro torna-se o objeto alvo; voc@^{e} pode ver isso no navegador de alvos (@emph{Targets}) do painel principal (@emph{Main}). Um duplo clique no bot@~{a}o direito do mouse sobre um objeto @'{e} outra forma de fazer esse objeto tornar-se o objeto alvo. @float Figura,figappearance @image{figs/ap} @caption{A Painel Apar@^{e}ncia.} @end float V@'{a} para o menu @emph{Inspect} no topo do painel principal (@emph{Main}) e selecione Apar@^{e}ncia (@emph{Appearance}). Isso faz aparecer o painel "Apar@^{e}ncia" (@emph{Appearance}). Quando ele aparece, se estiver parcialmente obscurecido por outra janela do Geomview voc@^{e} pode mov@^{e}-lo para um lado arrastando sua moldura com o bot@~{a}o do meio do mouse pressionado. O painel Apar@^{e}ncia (@emph{Appearance}) permite a voc@^{e} controlar v@'{a}rias coisas sobre a maneira como o Geomview desenha objetos. Note os bot@~{o}es rotulados com @emph{[af] Faces} e @emph{[ae] Edges} (arestas). Clique sobre o @emph{[ae] Edges} uma vez, e note que Geomview agora ressalta/destaca as arestas do dodecaedro. Clique sobre o @emph{[ae] Edges} novamente e as arestas desaparecem. Clique muitas vezes e assista as arestas indo e voltando. Quando voc@^{e} tiver feito isso o suficiente, deixe as arestas habilitadas e clique sobre o bot@~{a}o @emph{[af] Faces}. Essa a@,{c}@~{a}o alterna entre exibir ou n@~{a}o as faces. Clique sobre o bot@~{a}o novamente para de forma que a exibi@,{c}@~{a}o das face fique habilitada. Agora clique sobre o bot@~{a}o @emph{[Cf] Faces} sob a palavra @emph{COLOR}. Um painel de escolha de cores aparecer@'{a} (@pxref{figcolorchooser, Figure}). @float Figura,figcolorchooser @image{figs/color} @caption{Painel de Escolha de Cores.} @end float @ifset forms Coloque o cursor no hex@'{a}gono de cor nesse painel e pressione o bot@~{a}o esquerdo do mouse. Lentamente mova o mouse em torno desse ponto. Isso arrasta o pequeno ponto negro em volta para escolher uma nova cor para o dodecaedro. @end ifset @ifclear forms Note os tr@^{e}s bot@~{o}es deslizantes, @emph{H}, @emph{S}, e @emph{V}, controlando a matiz (@emph{hue}), satura@,{c}@~{a}o, e valor (ilumina@,{c}@~{a}o). Clicando sobre o bot@~{a}o @emph{HSV} fornece um diferente conjunto de bot@~{o}es deslizantes, um para vermelho (@emph{red}), outro para verde (@emph{green}), e outro para azul (@emph{ blue}). Valores num@'{e}ricos para ambos os sistemas de cores RGB e HSV podem ser vistos ou editados na parte inferior do painel. @end ifclear A cor inicial do dodecaedro foi especificada no arquivo @file{dodec} que voc@^{e} chamou quando iniciamos o Geomview. A cor que voc@^{e} especificou com o painel de cores sobrescreveu as cores antigas. Voc@^{e} pode ajustar a intensidade da cor com o bot@~{a}o deslizante @emph{Intensity}. Quando voc@^{e} encontrar uma cor que voc@^{e} gosta, clique sobre o bot@~{a}o @emph{Done}. Agora coloque o cursor do mouse em algum lugar sobre sobre o fundo cinza da janela de c@^{a}mera e duplo-clique no bot@~{a}o direito; isso seleciona "World" como objeto alvo. Clique no bot@~{a}o @emph{Look At} para para olhar para o objeto mundo novamente. Note que no painel de Apar@^{e}ncia (@emph{Appearance}) as escolhas dos bot@~{o}es se modificavam @`{a} medida que o lado esquerdo tamb@'{e}m mudava com o dodecaedro. Isso ocorre porque o painel @emph{Appearance} sempre mostra as escolhas para o objeto alvo, que agora @'{e} o objeto mundo, o qual ainda tem suas escolhas padr@~{a}o. Clique sobre o bot@~{a}o @emph{[ab] BBox} sob a palavra @emph{Draw}. A caixa associada desaparece. agora ponha o cursor de volta na janela de c@^{a}mera. No teclado, digite as teclas @kbd{a }b. Note que a caixa associada aparece novamente. @kbd{a }b @'{e} o atalho de teclado para o bot@~{a}o que alterna entre a exibi@,{c}@~{a}o ou n@~{a}o da caixa associada; a sequ@^{e}ncia de caracteres "[ab]" aparece sobre o bot@~{a}o para indicar isso. A maioria dos bot@~{o}es do Geomview possuem atalhos de teclado que voc@^{e} pode usar se preferir. Isso ser@'{a} @'{u}ltil quando voc@^{e} estiver familiarizado com o Geomview e n@~{a}o quiser ter de se mover entre uma montanha de pain@'{e}is. Agora selecione o tetraedro, use qualquer das duas formas: duplo-clicando o bot@~{a}o direito do mouse sobre o tetraedro, ou selecionando "tetra" no navegador de alvos (@emph{Targets}). Ent@~{a}o clique sobre o bot@~{a}o @emph{Delete} do menu @emph{Edit} no painel principal (@emph{Main}). O tetraedro deve desaparecer. Essa @'{e} a forma de voc@^{e} se livrar de um objeto. Voc@^{e} pode tamb@'{e}m chamar objetos de dentro do Geomview. Clique sobre o menu @emph{File} no painel principal (@emph{Main}) e escolha abrir (@emph{Open}). O painel de arquivos (@emph{Files}) ir@'{a} aparecer. @c Abaixo do meio desse painel, onde se l@^{e} @emph{Path List}, temos um navegador com tr@^{e}s linhas dentro dele; a segunda linha @'{e} um diret@'{o}rio com montanhas de exemplos do Geomview. Clique sobre aquela segunda linha; @pxref{figfilespanel, Figure}. Role para baixo na lista de arquivos at@'{e} voc@^{e} ver @file{tref.off}. Clique sobre aquela linha, e ent@~{a}o clique sobre o bot@~{a}o @emph{OK}. Um grande tubo em forma de trevo ir@'{a} aparecer em sua janela. Clique sobre o bot@~{a}o @emph{Hide} no painel @emph{Files} para dispensar o painel. @float Figura,figfilespanel @image{figs/secondlinelist} @caption{O Painel de Arquivos.} @end float Agora clique sobre o bot@~{a}o @emph{Reset} no painel de ferramentas (@emph{Tools}). Isso far@'{a} com que todas as figuras retornem ao centro da janela de c@^{a}mera. Voc@^{e} pode ver um dodecaedro e uma protuber@^{a}ncia do trevo (@pxref{figtrefdodec, Figure}). Brinque com a protuber@^{a}ncia do trevo e o dodecaedro. Fa@,{c}a experi@^{e}ncias com alguns outros bot@~{o}es no painel de ferramentas (@emph{Tools}). Tente colorir o trevo com o painel de apar@^{e}ncia (@emph{Appearance}). Para um tutorial sobre criar seus pr@'{o}prios objetos para cham@'{a}-los dentro do Geomview, veja @file{doc/oogltour} distribuido com Geomview. As coisas naquele arquivo ir@~{a}o ser incorporadas em futuras vers@~{o}es desse manual. @float Figura,figtrefdodec @image{figs/trefdodecinter} @caption{Trevo e Dodecaedro.} @end float @comment **************************************************************** @node Interacao, Formatos dos Arquivos da OOGL, Tutorial, Top @chapter Intera@,{c}@~{a}o Esse cap@'{i}tulo descreve como voc@^{e} interage com Geomview atrav@'{e}s do mouse e do teclado. @menu * Iniciando o Geomview:: Iniciando o Geomview. * Opcoes de Linha de Comando:: Op@,{c}@~{o}es de Linha de Comando. * Interacao Basica:: Intera@,{c}@~{o}es B@'{a}sicas: O Painel Principal. * Chamando:: Chamando Objetos Dentro do Geomview. * Movimentos do Mouse:: Usando o Mouse para Controlar Objetos. * Aparencia:: Modificando a Forma de Ver as Coisas. * Cameras:: C@^{a}meras. * Gravando:: Gravando seu Trabalho. * Comandos:: O Painel de Comandos. * Atalhos de Teclado:: Atalhos de Teclado. @end menu @comment ================================================================ @node Iniciando o Geomview, Opcoes de Linha de Comando, Interacao, Interacao @section Iniciando o Geomview A forma usual para iniciar o Geomview @'{e} digitar @kbd{geomview @key{Enter}} em uma janela de shell (@key{Enter} significa pressionar a tecla "Enter"). Esse procedimento carrega o Geomview na mem@'{o}ria do computador em uns poucos segundos; uma ou mais janelas ir@~{a}o aparecer e voc@^{e} pode come@,{c}ar a interagir com o Geomview imediatamente. @'{E} tamb@'{e}m poss@'{i}vel especificar a@,{c}@~{o}es para o Geomview executar no momento de iniciar fornecendo argumentos na linha de comando do shell. Veja @ref{Opcoes de Linha de Comando}. @comment ================================================================ @node Opcoes de Linha de Comando, Interacao Basica, Iniciando o Geomview, Interacao @section Op@,{c}@~{o}es de Linha de Comando Aqui est@~{a}o as op@,{c}@~{o}es de linha de comando que o Geomview permite: @table @samp @item -b @var{r} @var{g} @var{}b Escolhe a cor de fundo da janela de c@^{a}mera para valores fornecidos de @var{r} @var{g} @var{}b. @c added by jorge @c -b 0 0 1 - azul @c -b 0 0 0 - preto @c -b 1 1 1 - branco @c -b 0.5 0.5 0.5 - cinza @item -c @var{arquivo} Interpreta os comandos GCL em @var{arquivo}, que pode ser o s@'{i}mbolo especial @file{-} para a entrada padr@~{a}o. Para uma descri@,{c}@~{a}o de GCL, veja @ref{GCL}. @item -c @var{comando} Comandos podem tamb@'{e}m serem fornecidos literalmente, como em @example -c "(ui-panel main off)" @end example Uma vez que @var{comando} inclui par@^{e}ntesis, que possuem significado especial para o shell, @var{comando} deve receber ap@'{o}strofo. Multiplas op@,{c}@~{o}es @var{-c} s@~{a}o permitidas. @item -wins @var{n} Faz com que Geomview mostre inicialmente @var{n} janelas de c@^{a}mera. @item -wpos @var{largura},@var{altura}[@@@var{xmin},@var{ymin}] Especifica a localiza@,{c}@~{a}o inicial e o tamanho da primeira janela de c@^{a}mera. Os valores para @var{largura}, @var{altura}, @var{xmin}, e @var{ymin} est@~{a}o em coordenadas de tela (pixel). @item -M[cg][ps[un|in|in6]] @var{PIPENOME}|@var{TCPPORT} A op@,{c}@~{a}o @samp{-M} aceita modificadores: um sufixo @samp{g} espera dados geom@'{e}tricos (o padr@~{a}o), enquanto um sufixo @samp{c} espera comandos GCL. Um @samp{p} implica que a conec@,{c}@~{a}o pode usar um pipe nomeado (o padr@~{a}o para tudo exceto para "NeXT"), enquanto @samp{s} implica no uso de um "UNIX-domain socket" (o padr@~{a}o em "NeXT"). Uma vez que na vers@~{a}o 1.9 do Geomview "Internet domain sockets" s@~{a}o tamb@'{e}m suportados; use @samp{sin} para fazer o Geomview escutar uma porta IPv4 fornecida por @var{TCPPORT}, ou use @samp{sin6} para fazer Geomview escute uma porta IPv6 (tamb@'{e}m como especificado em @var{TCPPORT}). @samp{sun} @'{e} um sin@^{o}nimo para @samp{s}, i.e. use o "Unix domain socket" com o nome @var{PIPENOME}. Se @var{PIPENOME} inicia com uma barra ('/'), ent@~{a}o esse nome @'{e} assumido ser um caminho absoluto, de outra forma o pipe nomeado ou socket @'{e} criado sob o diret@'{o}rio @file{$@{TMPDIR@}/geomview/}. @b{Escutando fluxo de comando em portas TCP pode ser um risco de seguran@,{c}a, como Geomview por si mesmo n@~{a}o toma nenhum tipo de precau@,{c}@~{a}o de seguran@,{c}a, Geomview simplesmente executa todos os comandos alimentados a ele atrav@'{e}s do socket de rede. Isso tamb@'{e}m implica entrada e sa@'{i}da para unidades de armazenamento locais devem ser permitidas remotamente.} Exemplos: @table @code @item -M @var{nome_de_objeto} Mostra (possivelmente mudando dinamicamente) geometria enviada de programas @code{geomstuff} ou @code{togeomview}. Essa op@,{c}@~{a}o "-M" escuta o pipe nomeado @file{/tmp/geomview/nome_de_objeto}; voc@^{e} pode conseguir o mesmo efeito com os comandos de shell abaixo: @example mkdir /tmp/geomview mknod /tmp/geomview/nome_de_objeto p @end example (assumindo que o diret@'{o}rio e o pipe nomeado n@~{a}o existam atualmente), ent@~{a}o executando o comando GCL: @example (geometry nome_de_objeto < /tmp/geomview/nome_de_objeto) @end example (veja @ref{geometry,@code{(geometry @dots{})}}) @item -Mc @var{pipenome} Como @samp{-M} acima, mas espera comandos GCL, em lugar de dados geom@'{e}tricos OOGL, na conec@,{c}@~{a}o. @item -Mcs nome L@^{e} comandos a partir do "UNIX-domain socket" nomeado. @file{/tmp/geomview/nome} @item -Mcsin 40000 L@^{e} comandos a partir da porta IPv4 @samp{40000}. Geomview por si mesmo n@~{a}o toma qualquer precau@,{c}@~{a}o de seguran@,{c}a, de forma que "-Mcsin 40000" pode ser um risco de seguran@,{c}a. @end table @item -noopengl Desabilita o uso de OpenGL para (possivelmente) convers@~{a}o acelerada de hardware, mesmo que o bin@'{a}rio do Geomview tenha suporte a OpenGL compilado internamente. "-noopengl" tamb@'{e}m desabilita o suporte a transpar@^{e}ncia e texturas na janelas de c@^{a}mera. Instant@^{a}neos "RenderMan" ainda ter@~{a}o a transpar@^{e}ncia correta e suporte a alguma textura limitada. @item -nopanels Inicia sem mostrar nenhum painel, somente a janelas gr@'{a}ficas. Pain@'{e}is podem ser invocados mais tarde da forma usual com as teclas de atalho @kbd{Px} ou com comando @code{ui-panel}. Veja @ref{ui-panel, @code{(ui-panel @dots{})}}. @item -noinit N@~{a}o l@^{e} nenhum arquivo de inicializa@,{c}@~{a}o. Por padr@~{a}o, Geomview l@^{e} o arquivo @file{.geomview} do sistema, seguido daqueles em @file{$@{HOME@}/.geomview} e em @file{./.geomview}. @item -e @var{modulo} Inicial um m@'{o}dulo externo; @var{modulo} @'{e} o nome associado ao m@'{o}dulo chamado, aparecendo no painel principal no navegador de "Applications", como definido pelo comando @code{emodule-define}. Veja @ref{emodule-define, @code{(emodule-define @dots{})}}. @item -start @var{module} @var{args} @dots{} Como -e mas permite a voc@^{e} enviar argumentos para o m@'{o}dulo externo. "--" sinaliza o fim da lista de argumentos; o "--" pode ser omitido se for o @'{u}ltimo argumento na linha de comando do Geomview. @item -run @var{coamando-shell} @var{args} @dots{} Como "-start" mas toma o caminho de arquivos do execut@'{a}vel do m@'{o}dulo externo em lugar do nome do m@'{o}dulo. Os caminhos de arquivo de todos os diret@'{o}rios de m@'{o}dulos conhecidos s@~{a}o anexados ao final do caminho de busca do UNIX quando for invocado o @var{comando-shell}. @end table @comment ================================================================ @node Interacao Basica, Chamando, Opcoes de Linha de Comando, Interacao @section Interacao Basica: O Painel Principal Normalmente quando voc@^{e} invoca Geomview, tr@^{e}s janelas aparecem: O painel principal (@emph{Main}), o painel de ferramentas (@emph{Tools}), e uma janela de c@^{a}mera. Geomview tem muitas outras janelas mas muitas coisas podem ser realizadas com essas tr@^{e}s de forma que por padr@~{a}o as outras n@~{a}o aparecem. Essa se@,{c}@~{a}o do manual introduz alguns conceitos b@'{a}sicos que s@~{a}o usados nas se@,{c}@~{o}es restantes do manual e descreve o painel principal (@emph{Main}). @c @float Figura,figmainpanel @image{figs/main} @caption{O Painel Principal} @end float @c Geomview pode mostrar um n@'{u}mero arbitr@'{a}rio de objetos simultaneamente. O navegador @emph{Targets} no painel principal (@emph{Main}) mostra uma lista de todos os objetos dos quais Geomview atualmente abertos. Esse navegador tem uma linha para cada objeto que voc@^{e} tiver chamado, adicionalmente algumas linhas para outros objetos. Um desses outros objetos @'{e} chamado @code{World} e corresponde a todos os objetos atualmente chamados, tratados como se eles fossem um objeto. A maioria das opera@,{c}@~{o}es que voc@^{e} pode fazer sobre um objeto, tais como aplicar um movimento ou mudar uma cor, pode tamb@'{e}m ser feita para o objeto "World". O navegador de alvos (@emph{Targets}) tamb@'{e}m possui uma entrada para cada c@^{a}mera. Por padr@~{a}o existe somente uma c@^{a}mera; @'{e} poss@'{i}vel adicionar mais delas atrav@'{e}s da entrada @emph{New Camera} do painel principal (@emph{Main}) via menu @emph{File}. Geomview trata c@^{a}meras na maioria das vezes como trata objetos geom@'{e}tricos. Por exemplo, voc@^{e} pode mover c@^{a}meras pelas pro-ximidades e adicion@'{a}-las e apag@'{a}-las como objetos geom@'{e}tricos. C@^{a}meras n@~{a}o s@~{a}o mostradas na tela como um objeto que voc@^{e} v@^{e}. Cada c@^{a}mera tem uma janela de c@^{a}mera separada que mostra a vis@~{a}o como vista atrav@'{e}s da lente daquela c@^{a}mera. (@'{E} poss@'{i}vel para cada c@^{a}mera mostrar uma representa@,{c}@~{a}o geom@'{e}trica de outras c@^{a}meras. Veja @ref{Cameras}.) Devido ao fato de Geomview tratar c@^{a}meras e objetos geom@'{e}tricos muito similarmente, o termo @dfn{objeto} nessa documenta@,{c}@~{a}o @'{e} usado para referir-se a qualquer dos dois indistintamente. Quando precisamos distinguir entre os dois tipos de objetos, usamos o termo "@dfn{geom}" para denotar um objeto geom@'{e}trico e a palavra @dfn{c@^{a}mera} para denotar uma c@^{a}mera. O objeto que est@'{a} selecionado (luminosidade alta) no navegador "@emph{Targets}" @'{e} chamado objeto alvo. Esse @'{e} o objeto que recebe quaisquer a@,{c}@~{o}es que voc@^{e} faz com o mouse ou com o teclado. Voc@^{e} pode mudar o objeto alvo selecionando uma linha diferente no navegador de alvos (@emph{Targets}). Outro caminho de modificar o objeto alvo @'{e} colocar o cursor do mouse diretamente sobre um geom na janela de c@^{a}mera e rapidamente dar um duplo clique no bot@~{a}o direito do mouse. Esse processo @'{e} chamado @dfn{selecionar}; o objeto selecionado torna-se o novo alvo. Objetos do Geomview s@~{a}o todos conhecidos por dois nomes, ambos dos quais s@~{a}o mostrados no navegador de alvos (@emph{Targets}). O primeiro nome l@'{a} fornecido, que aparece entre colch@^{e}tes ([ ]), @'{e} um nome curto atribuido pelo Geomview quando voc@^{e} chama o objeto. Esse nome consiste da letra `g' para geometria e da letra `c' para c@^{a}meras, seguindo por um n@'{u}mero. O segundo nome @'{e} maior e mais descritivo; por padr@~{a}o esse @'{e} o nome do arquivo do qual o objeto foi chamado. Os dois nomes s@~{a}o equivalentes no que diz respeito ao Geomview; em qualquer ponto onde voc@^{e} precisar especificar um nome voc@^{e} pode fornecer qualquer dos dois. Para controlar um objeto, garanta que aquele objeto que voc@^{e} quer mover seja o objeto alvo, e coloque o cursor do mouse em uma janela de c@^{a}mera. Movimentos s@~{a}o aplicados pressionando ou o bot@~{a}o esquerdo ou o bot@~{a}o do meio do mouse e movendo o mouse. Existem muitos modos de movimento diferentes, cada modo de movimento aplicando um diferente tipo de movimento. O navegador de modos de movimento (@emph{MOTION MODE}) no painel principal indica o modo de movimento atual. O padr@~{a}o @'{e} a rota@,{c}@~{a}o ("Rotate"). Voc@^{e} pode mudar o modo corrente de movimento selecionando um novo modo de movimento no navegador de modos de movimento (@emph{MOTION MODE}), ou usando o painel de ferramentas (@emph{Tools}). Para maiores informa@,{c}@~{o}es sobre modos de movimento, veja @ref{Movimentos do Mouse}. O navegador de m@'{o}dulos (@emph{Modules}) lista m@'{o}dulos externos do Geomview. Um m@'{o}dulo externo @'{e} um programa separado que interage com Geomview para extender suas funciona-lidades. Para informa@,{c}@~{o}es sobre m@'{o}dulos externos, veja @ref{Modulos}. @ifset forms O bot@~{a}o @emph{Load} no painel principal @emph{Main} faz surgir o painel de arquivos (@emph{Files}) para chmar um arquivo. O arquivo pode conter ou um geom, ou uma c@^{a}mera, ou comandos GCL. Para detalhes, veja @ref{Chamando}. O bot@~{a}o @emph{Delete} faz com que o objeto alvo seja apagado. Geomview seleciona outro objeto para ser o novo alvo. Voc@^{e} pode apagar c@^{a}meras da mesma forma que geoms dessa forma. Se voc@^{e} pressionar o bot@~{a}o delete @emph{Delete} enquanto o objeto alvo for "World", Geomview aagar@'{a} todos os geoms. Os tr@^{e}s bot@~{o}es na parte de baixo do painel principal (@emph{Main}), rotulados @emph{Euclidean}, @emph{Hyperbolic}, e @emph{Spherical}, permitem a voc@^{e} modificar a geometria do espa@,{c}o que Geomview mostra. Por padr@~{a}o @emph{Euclidean} @'{e} selecionado. Para detalhes sobre como usar espa@,{c}os @emph{Hyperbolic} e @emph{Spherical}, veja @ref{Non-Euclidean Geometry}. @end ifset @ifclear forms A barra de menu no topo do painel principal oferece menus para opera@,{c}@~{o}es comuns. Para criar novas janelas, chame novos objetos, grave os objetos ou outras informa@,{c}@~{o}es, ou saia do Geomview, veja o menu @emph{File}. Para copiar ou apagar objetos, veja o menu @emph{Edit}. Voc@^{e} pode chamar qualquer painel a partir do menu @emph{Inspect}. O menu @emph{Space} permite a voc@^{e} escolher se Geomview trabalha no modo Euclidiano, Hiperbolico ou Esf@'{e}rico. O modo Euclideano @'{e} usado por padr@~{a}o. Para detalhes sobre a utiliza@,{c}@~{a}o do modo espa@,{c}o @emph{Hyperbolic} e do modo @emph{Spherical}, veja @ref{Geometrias Nao-Euclidianas}. @end ifclear A maioria das a@,{c}@~{o}es que voc@^{e} pode fazer atrav@'{e}s dos pain@'{e}is do Geomview possuem equivalentes atalhos de teclado de forma que voc@^{e} pode fazer a mesma a@,{c}@~{a}o atav@'{e}s de digita@,{c}@~{a}o de uma sequ@^{e}ncia de teclas no teclado. Isso @'{e} @'{u}til para usu@'{a}rios avan@,{c}ados que est@~{a}o familiarizados com as capacidades do Geomview e querem trabalhar rapidamente sem ter montanhas de pain@'{e}is amontoando-se na tela. Atalhos de teclado s@~{a}o usualmente indicados ente colch@^{e}tes ([ ]) pr@'{o}ximo ao item correspondente em um painel. Por exemplo, o atalho de teclado para o modo @emph{Rotate} @'{e} 'r'; isso @'{e} indicado par "[r]" que aparece antes da palavra "Rotate" no navegador @emph{MOTION MODE}. Para usar esse atalaho de teclado, apenas pressione a tecla @kbd{r} enquanto o cursor do mouse estiver em qualquer janela do Geomview. N@~{a}o @'{e} necess@'{a}rio pressionar a tecla @kbd{@key{Enter}} posteriormente. Alguns atalhos de teclado consistem em mais de uma tecla. Nesses caso apenas digite as teclas uma ap@'{o}s a outra, sem pressionar @kbd{@key{Enter}} posteriormente ou entre as teclas pressionadas. Atalhos de teclado s@~{a}o sens@'{i}veis @`{a} caixa alta/baixa. Muitas teclas de atalho podem ser precedidas de um par@^{a}metro num@'{e}rico. Por exemplo, digitando @code{ae} muda o estado do desenho de arestas, enquanto @code{1ae} sempre habilita o desenho de arestas. O campo @emph{keyboard} no canto superior esquerdo do painel principal (@emph{Main}), imediatamente acima da palavra "Targets", ecoa o estado atual das teclas de atalho. @ifset forms O bot@~{a}o rotulado @emph{?} pr@'{o}ximo ao canto superior direito do painel principal (@emph{Main}) faz com que Geomview mostre uma lista de todos os atalhos de teclado na sa@'{i}da padr@~{a}o. O bot@~{a}o @emph{Quit} no painel principal encerra o Geomview. @end ifset @ifclear forms Para uma lista de todas as teclas de atalho, pressione a telca @emph{@code{?}}. @end ifclear @comment ================================================================ @node Chamando, Movimentos do Mouse, Interacao Basica, Interacao @section Disponibilizando Objetos dentro do Geomview Existem muitos caminhos para chamar um objeto dentro do Geomview. @table @asis @item No painel de arquivos (@emph{Files}) Se voc@^{e} clicar no bot@~{a}o @emph{Load} no painel principal do Geomview (@emph{Main}), o painel de arquivos (@emph{Files}) ir@'{a} aparecer. @float Figura,figmyfilelist @image{figs/myfilelist} @caption{O Painel de Arquivos.} @end float Esse painel permite que voc@^{e} selecione um arquivo a partir de uma variedade de diret@'{o}rios. O topo do painel @'{e} um navegador de arquivos padr@~{a}o do Motif. Abaixo deste est@'{a} uma lista de diret@'{o}rios no caminho de busca padr@~{a}o do Geomview; clique sobre um desses para navegar entre os arquivos naquele diret@'{o}rio. Para selecionar um arquivo, duplo-clique sobre o seu nome no navegador no canto superior direito, ou clique sobre o seu nome e pressione a tecla @key{Enter}, ou ainda digite o nome do arquivo dentro da caixa de texto na parte inferior do navegador e pressione a tecla @key{Enter}. @refill Se o arquivo selecionado contiver dados geom@'{e}tricos OOGL, esse arquivo ir@'{a} ser adicionado ao navegador de alvos (@emph{Targets}) do Geomview. Se esse arquivo contiver comandos GCL em lugar de conter dados geom@'{e}tricos OOGL, o arquivo ser@'{a} interpretado. Veja @ref{GCL}. Quando o apinel de arquivos (@emph{Files}) aparecer pela primeira vez, o diret@'{o}rio selecionado no navegador de diret@'{o}rios @'{e} o diret@'{o}rio atual --- que corresponde ao diret@'{o}rio a partir do qual voc@^{e} chamou o Geomview. O navegador de arquivos mostra @emph{todos} os arquivos nesse diret@'{o}rio, incluindo os que n@~{a}o s@~{a}o arquivos do Geomview. Se voc@^{e} tentar chamar um arquivo que n@~{a}o contenha um objeto OOGL e tamb@'{e}m n@~{a}o contenha comandos do Geomview, o Geomview ir@'{a} mostrar uma mensagem de erro. O navegador de diret@'{o}rios tamb@'{e}m lista um segundo e um terceiro diret@'{o}rios adicionalmente al@'{e}m do diret@'{o}rio atual. O segundo, que termina em @file{data/geom}, @'{e} o diret@'{o}rio de exemplos de dados do Geomview. Esse diret@'{o}rio cont@'{e}m uma grande variedade de amostras de objetos. Esse diret@'{o}rio tamb@'{e}m cont@'{e}m muitos subdiret@'{o}rios. Em particular, os subdiret@'{o}rios @file{hyperbolic} e o subdiret@'{o}rio @file{spherical} possuem amostras de objetos hiperb@'{o}licos e esf@'{e}ricos, respectivamente. Entradas no navegador de diret@'{o}rios s@~{a}o vistas apenas como entradas de arquivos; para visualizar um subdiret@'{o}rio, clique sobre o nome do referido diret@'{o}rio. O terceiro diret@'{o}rio mostrado no navegador de diret@'{o}rio, que termina em @file{geom}, cont@'{e}m muitos subdiret@'{o}rios com outros arquivos do Geomview dentro deles. Esses arquivos s@~{a}o usados menos frequ@^{e}ntemente que os outros no diret@'{o}rio @file{data/geom}. Voc@^{e} pode mudar a lista de diret@'{o}rios mostrada no navegador de diret@'{o}rios do painel de arquivos (@emph{Files}) usando o comando @code{set-load-path}; Veja @ref{set-load-path, @code{(set-load-path @dots{})}}. @item A tecla de atalho @kbd{<}: Se voc@^{e} digitar @kbd{<} em qualquer janela do Geomview, o painel @emph{Load} ir@'{a} aparecer. Esse painel @'{e} uma pequena vers@~{a}o do painel de arquivos (@emph{Files}); o painel @emph{Load} cont@'{e}m um campo de texto no qual voc@^{e} o nome de um arquivo a ser chamado (ou um comando GCL entre par@^{e}ntesis). Ap@'{o}s digitar o nome do arquivo a ser chamado, aperte a tecla @kbd{@key{Enter}}; Geomview ir@'{a} chamar o arquivo como se voc@^{e} o tivesse chamado com o bot@~{a}o @emph{Add} no painel de arquivos (@emph{Files}). Se, ap@'{o}s fazer surgir o pequeno painel @emph{Load} com @kbd{<}, voc@^{e} decidir que quer usar o grande painel de arquivos (@emph{Files}) ap@'{o}s tudo, pressione o bot@~{a}o @emph{File Browser}. @float Figura,figloadpanel @image{figs/load} @caption{O Painel de Chamar Arquivos.} @end float @item Comandos para chamar objetos geom@'{e}tricos: Os comandos GCL @code{load}, @code{geometry}, @code{new-geometry}, e @code{read} permitem a voc@^{e} chamar um objeto dentro do Geomview; veja @ref{GCL}. Veja @ref{load, @code{(load @dots{})}}. Veja @ref{new-geometry, @code{(new-geometry @dots{})}}. Veja @ref{read, @code{(read @dots{})}}. @refill @end table @comment ================================================================ @node Movimentos do Mouse, Aparencia, Chamando, Interacao @section Usando o Mouse para Controlar Objetos Geomview permite a voc@^{e} controlar objetos com o mouse. Existem seis diferentes modos de movimento do mouse: rota@,{c}@~{a}o (@emph{Rotate}), transla@,{c}@~{a}o (@emph{Translate}), v@^{o}o da c@^{a}mera (@emph{Cam Fly}), zoom da c@^{a}mera (@emph{Cam Zoom}), homotetia de um objeto geom@'{e}trico (@emph{Geom Scale}), e @'{o}rbita de c@^{a}mera (@emph{Cam Orbit}). O painel de ferramentas tem um bot@~{a}o para cada um desses modos; para trocar os modos, clique sobre o bot@~{a}o correspondente. voc@^{e} pode tamb@'{e}m selecionar um novo modo atrav@'{e}s do navegador de modos de movimento (@emph{Motion Mode}) no painel principal (@emph{Main}).@refill Essa se@,{c}@~{a}o descreve a intera@,{c}@~{a}o b@'{a}sica com o mouse. Para detalhes, veja @ref{Comandos}. @float Figura,figtools @image{figs/tools} @caption{O Painel de Ferramentas.} @end float Cada um dos modos de movimento usa um paradigma comum para como o movimento @'{e} aplicado. Em particular, cada modo de movimento depende do objeto alvo (@emph{target}) atual e do atual objeto do centro (@emph{center}). O objeto alvo atual e o atual objeto do centro s@~{a}o explicados nos par@'{a}grafos seguintes. O objeto alvo atual @'{e} mostrado no campo @emph{Target} no painel de ferramentas (@emph{Tools}). Isso @'{e} o mesmo que o objeto selecionado no navegador de alvos (@emph{Targets}) no painel principal (@emph{Main}), e voc@^{e} pode mudar o alvo ou selecionando um novo objeto no navegador, digitando uma nova entrada no campo, ou selecionando um objeto na janela de c@^{a}mera duplo-clicando no bot@~{a}o direito do mouse com o cursor sobre o objeto. O atual objeto do centro @'{e} mostrado no campo @emph{Center} no painel de ferramentas(@emph{Tools}). Seu valor padr@~{a}o @'{e} a palavra especial "target", que significa que o objeto do centro @'{e} o objeto que estiver designado como objeto alvo. Voc@^{e} pode mudar o objeto atual do centro para qualquer objeto digitando seu nome no campo @emph{Center}. A or@'{i}gem do objeto do centro @'{e} mantida fixa no modo rota@,{c}@~{a}o @emph{Rotate} e no modo @emph{Orbit}. Normalmente o objeto do centro @'{e} um dos objetos geom@'{e}tricos (geoms) existentes listados no navegador de alvos (@emph{Targets}), o centro atual das rota@,{c}@~{o}es @'{e} a or@'{i}gem daquele sistema de coordenadas daquele objeto. @'{E} poss@'{i}vel, todavia, selecionar um ponto arbitr@'{a}rio de interesse sobre um objeto como o centro. Para detalhes, veja @ref{Ponto de Interesse}. Isso tamb@'{e}m @'{e} poss@'{i}vel mudando o bot@~{a}o @emph{BBox Center} para escolher o centro de movimento como sendo o centro do objeto atual da caixa associada. Uma vez modificado o centro da caixa geom@'{e}trica ativa associada ir@'{a} tornar-se o centro do movimento, se voc@^{e} selecionar outro objeto, ent@~{a}o o centro do movimento ir@'{a} tornar-se o centro da caixa associada @`{a} aquele objeto. Nenhuma modifica@,{c}@~{a}o ocorrer@'{a} quando uma c@^{a}mera ou o objeto mundo (@emph{World}) for selecionado; voc@^{e} tem que digitar a palavra @code{target} no campo @emph{Center} para retornar ao valor padr@~{a}o. Voc@^{e} aplica um movimento de mouse pressionando ou o bot@~{a}o esquerdo ou o bot@~{a}o do meio do mouse com o cursor em uma janela de c@^{a}mera e movendo o mouse. A maioria dos modos de movimento possui in@'{e}rcia (@emph{inertia}), que significa que se voc@^{e} soltar o bot@~{a}o enquanto move o mouse, o movimento ir@'{a} continuar. Para imaginar a in@'{e}rcia pode ser @'{u}til imaginar o cursor do mouse como sendo uma al@,{c}a; quando voc@^{e} pressiona um bot@~{a}o do mouse para baixo, o mouse agarra firmemente no objeto alvo e voc@^{e} pode mover esse objeto. Quando voc@^{e} libera o bot@~{a}o do mouse, a al@,{c}a libera o objeto. Liberando o bot@~{a}o do mouse enquanto move o mesmo funciona como abandonar o objeto --- o objeto continua movendo-se independentemente do mouse. In@'{e}rcia pode ser desligada; veja o menu de movimento (@emph{Motion}) no painel principal (@emph{Main}), descrito abaixo. Geralmente, o bot@~{a}o esquerdo do mouse controla movimento no plano da tela, enquanto o bot@~{a}o m@'{e}dio do mouse controla movimento ao longo ou em torno da dire@,{c}@~{a}o de avan@,{c}o. Pressionando o tecla "shift" enquanto arrasta com o bot@~{a}o esquerdo ou m@'{e}dio do mouse na maioria dos modos de movimento fornece movimentos de baixa velocidade , @'{u}til para ajustes finos. Voc@^{e} pode selecionar qualquer ponto sobre um objeto (n@~{a}o apenas sua or@'{i}gem) como centro do movimento pressionando a tecla "shift" enquanto clica no bot@~{a}o direito do mouse; isso escolhe o ponto de interesse. @table @emph @item Rotate No modo rota@,{c}@~{a}o (@emph{Rotate}), pressione o bot@~{a}o esquerdo do mouse para rotacionar o objeto alvo en torno do objeto do centro. A rota@,{c}@~{a}o ocorre na dire@,{c}@~{a}o que voc@^{e} move o mouse. Especificamente, o eixo de rota@,{c}@~{a}o passa atrav@'{e}s da or@'{i}gem do objeto do centro, @'{e} paralelo ao plano de vis@~{a}o da c@^{a}mera, e @'{e} perpendicular @`{a} dire@,{c}@~{a}o do movimento do mouse. Quando o centro for o alvo ("target"), isso significa que o objeto alvo rotaciona em torno de sua pr@'{o}pria or@'{i}gem. O bot@~{a} do meio do mouse no modo de movimento tipo rota@,{c}@~{a}o (@emph{Rotate}) rotaciona o objeto alvo em torno de um eixo perpendicular ao plano de vis@~{a}o. @item Translate No modo transla@,{c}@~{a}o (@emph{Translate}), mantenha pressionado o bot@~{a}o esquerdo do mouse para transladar o objeto alvo na dire@,{c}@~{a}o do movimento do mouse. O bot@~{a}o do meio do mouse translada o alvo ao longo de um eixo perpendicular ao plano de visualiza@,{c}@~{a}o. No espa@,{c}o Euclideano, o objeto do centro @'{e} essencialmente irrelevante para transla@,{c}@~{o}es. Nos espa@,{c}os hiperb@'{o}licos e esf@'{e}ricos, onde transla@,{c}@~{o}es possuem um @'{u}nico eixo, esse eixo @'{e} escolhido para ir atrav@'{e}s da or@'{i}gem do objeto do centro. @item Cam Fly O V@^{o}o de C@^{a}mera (@emph{Cam Fly}) @'{e} um simulador de v@^{o}o muito simples que permite a voc@^{e} voar em torno da cena. @emph{Cam Fly} trabalha atrav@'{e}s do movimento da c@^{a}mera. Movimente o mouse enquanto mant@'{e}m pressionado o bot@~{a}o esquerdo do mouse para posicionar a c@^{a}mera em uma dire@,{c}@~{a}o diferente. Para mover adiante ou para tr@'{a}s, mantenha pressionado o bot@~{a} do meio e mova o mouse verticalmente. Os dois movimentos aqui descritos possuem in@'{e}rcia; tipicamente o caminho mais f@'{a}cil para voar em torno de uma cena @'{e} fornecer a c@^{a}mera um passo adiante pressionando o bot@~{a} do meio enquanto move-se o mouse para cima, e ent@~{a}o usar o bot@~{a}o esquerdo para pilotar. @emph{Cam Fly} afeta a janela de c@^{a}mera onde o mouse est@'{a} correntemente posicionado; @emph{Cam Fly} ignora o objeto alvo e o objeto do centro. @item Cam Orbit O modo @'{o}rbita de C@^{a}mera (@emph{Cam Orbit}) permite a voc@^{e} rotacionar a c@^{a}mera atual em torno do centro atual. O bot@~{a}o esquerdo do mouse faz essa rota@,{c}@~{a}o. O bot@~{a}o do do meio do mouse no modo @emph{Cam Orbit} atua da mesma forma que no modo @emph{Cam Fly}: O bot@~{a}o do do meio do mouse move a c@^{a}mera para adiante e para tr@'{a}s. Em geral @emph{Cam Orbit} n@~{a}o move o objeto alvo, embora se a c@^{a}mera atual for selecionada como o alvo e o centro for tamb@'{e}m o alvo, @emph{Cam Orbit} ir@'{a} apenas pivotar aquela c@^{a}mera sobre s@'{i} mesma como no modo @emph{Cam Fly}. @item Cam Zoom O modo Zoom de C@^{a}mera (@emph{Cam Zoom}) permite a voc@^{e} modificar o campo atual de vis@~{a}o com o mouse; mantenha pressionado o bot@~{a}o esquerdo do mouse e mova o mouse para modificar o campo de vis@~{a}o. O valor num@'{e}rico do campo de vis@~{a}o @'{e} mostrado no campo @emph{FOV} (field of view) no painel de c@^{a}mera (@emph{Camera}). @item Geom Scale O modo @emph{Geom Scale} permite a voc@^{e} ampliar ou diminuir um objeto geom@'{e}trico (geom). @emph{Geom Scale} atua sobre o objeto alvo se aquele objeto for um geom. Se o alvo for uma c@^{a}mera, @emph{Geom Scale} atual sobre o geom que foi o objeto alvo mais recentemente. Movendo o mouse enquanto mantem-se pressionado o bot@~{a}o esquerdo do mouse homotetiza-se o objeto ou ampliando ou reduzindo o mesmo, dependendo da dire@,{c}@~{a}o do movimento do mouse. o centro da transforma@,{c}@~{a}o homot@'{e}tica aplicada @'{e} o objeto do centro. Homotetia possui significado somente no espa@,{c}o Euclideano; tentativas do palicar homotetia s@~{a}o ignoradas em outros espa@,{c}os. O modo @emph{Geom Scale} n@~{a}o possui in@'{e}rcia. @end table Os bot@~{o}es @emph{Stop}, @emph{Look At}, @emph{Center}, e @emph{Reset} no painel de ferramentas (@emph{Tools}) executam a@,{c}@~{o}es relacionadas a movimentos mas n@~{a}o modificam o modo atual de movimento (nota do tradutor: de rota@,{c}@~{a}o para transla@,{c}@~{a}o por exemplo). @table @emph @item Stop O bot@~{a}o @emph{Stop} faz com que cessem todos os movimentos. O bot@~{a}o @emph{Stop} afeta todos os objetos em movimento, n@~{a}o apenas o objeto alvo. Sua tecla de atalho @'{e} @kbd{H}. O comando de teclado @kbd{h}, que n@~{a}o corresponde a um bot@~{a}o do painel, cessa o movimento atual para o objeto alvo somente. @item Look At O bot@~{a}o @emph{Look At} faz com que a c@^{a}mera atual seja movida para uma posi@,{c}@~{a}o tal que a referida c@^{a}mera esteja olhando para o objeto alvo, e de forma que o objeto alvo mais ou menos ajuste-se @`{a} janela. O comando @emph{Look At} n@~{a}o funciona perfeitamente em espa@,{c}os n@~{a}o Euclideanos. @item Center O bot@~{a}o @emph{Center} desfaz transforma@,{c}@~{a}o do objeto alvo, movendo o objeto alvo de volta @`{a} sua posi@,{c}@~{a}o inicial padr@~{a}o, que @'{e} onde ele estava quando voc@^{e} originalmente o chamou a partir do Geomview. @item Reset O bot@~{a}o @emph{Reset} cessa todo movimento e faz com que todos os objetos sejam movidos de vota @`{a}s suas posi@,{c}@~{o}es iniciais padr@~{a}o. @end table O painel de ferramentas (@emph{Tools}) possui um bot@~{a}o @emph{Main}, para invocar o painel principal no caso de esse painel ter sido dispensado ou sepultado, e um bot@~{a}o @emph{Done} para fechar o painel de ferramentas @emph{Tools}. O painel principal do menu de movimento (@emph{Motion}) tem controles especiais que afetam como movimentos do mouse s@~{a}o interpretados; as modifica@,{c}@~{o}es s@~{a}o tamb@'{e}m acess@'{i}veis atrav@'{e}s de comandos GCL. @xref{ui-motion, @code{(ui-motion @dots{})}}. @table @emph @item [ui] Inertia Normalmente, ao mover objetos tem-se in@'{e}rcia: se o mouse estiver ainda se movendo quando o bot@~{a}o for liberado, o objeto selecionado continua a mover-se. Quando a in@'{e}rcia (@emph{Inertia}) for desabilitada, objetos cessam seu movimento no momento em que voc@^{e} libera o mouse. @item [uc] Constrain Motion @'{E} necess@'{a}rio algumas vezes ter ao alcance da m@~{a}o o movimento de um objeto em uma dire@,{c}@~{a}o alinhada com um eixo coordenado: exatamente na horizontal ou na vertical. Selecionando restringir movimento (@emph{Constrain Motion}) a interpreta@,{c}@~{a}o de movimentos do mouse @'{e} modificada para permitir isso; arrastros de mouse aproximadamente horizontais ou aproximadamente verticais transformam-se em movimentos exatamente horizontais ou exatamente verticais. Note que o movimento @'{e} ainda ao longo dos eixos X ou Y da c@^{a}mera na qual voc@^{e} move o mouse, n@~{a}o necess@'{a}riamente no sistema de coordenadas do objeto. @item [uo] Own Coordinates @'{E} necess@'{a}rio algumas vezes ter ao alcance da m@~{a}o o movimento de objetos objetos com rela@,{c}@~{a}o ao sistema de coordenadas onde o referido objeto foi definido, em lugar de com rela@,{c}@~{a}o ao sistema de coordenadas da c@^{a}mera atrav@'{e}s da qual esse objeto est@'{a} sendo visto. Enquanto @emph{Own Coordinates} estiver selecionado, todos os movimentos s@~{a}o interpretados da forma citada nesse item: arrastando o mouse para a direita no modo transla@,{c}@~{a}o corresponde a mover o objeto em sua pr@'{o}pria dire@,{c}@~{a}o +X, e assim por diante. Pode ser especialmente @'{u}til conjuntamente com o bot@~{a}o Restringir Movimento (@emph{Constrain Motion}). @end table @comment ================================================================ @menu * Ponto de Interesse:: Pontos de Interesse. @end menu @node Ponto de Interesse, , Movimentos do Mouse, Movimentos do Mouse @subsection Selecionando um Ponto de Interesse @'{E} algumas vezes @'{u}til especificar um ponto em particular sobre algum objeto em uma janela do Geomview como o ponto de centro para movimentos do mouse. Voc@^{e} pode fazer isso segurando a tecla shift e clicando o bot@~{a}o direito do mouse (i.e. clique no bot@~{a}o direito uma vez enquanto mant@'{e}m pressionada a tecla shift do teclado) com o cursor sobre o ponto desejado. Esse ponto torna-se ent@~{a}o o @emph{ponto de interesse}. O ponto de interesse deve estar sobre um objeto existente. Selecionado um ponto de interesse simplifica o exame de uma pequena por@,{c}@~{a}o de um grande objeto. Mantendo a tecla shift pressionada e clicando sobre o ponto de interesse com o bot@~{a}o direito do mouse, e selecionando o modo @'{o}rbita (@emph{Orbit}). Use o bot@~{a} do meio do mouse para aproximar, e o esquerdo para orbitar o ponto, examinando a regi@~{a}o de diferentes dire@,{c}@~{o}es. Quando voc@^{e} tiver selecionado um ponto de interesse, o atual objeto do centro @'{e} modificado para um objeto chamado "CENTER", que @'{e} um objeto invis@'{i}vel localizado no ponto de interesse. Adicionalmente, movimentos de mouse para a janela na qual voc@^{e} fez a sele@,{c}@~{a}o s@~{a}o ajustados de forma que o ponto de interesse acompanhe o mouse. Voc@^{e} pode mudar o ponto de interesse a qualquer momento selecionando um novo ponto de interesse shift-clicando o bot@~{a}o direito do mouse novamente. Voc@^{e} pode cancelar o ponto de interesse completamente shift-clicando o bot@~{a}o direito do mouse com o cursor no plano de fundo (i.e. n@~{a}o sobre qualquer objeto). Isso modifica o objeto do centro de volta a seu valor padr@~{a}o, "target". O objeto que possui o nome de "CENTER", que serve como um objeto do centro para o ponto de interesse, @'{e} um tipo especial de geom chamado "alien". Esse "Alien" n@~{a}o aparece no navegador de alvos (@emph{Targets}). Por padr@~{a}o esse objeto "Alien" n@~{a}o tem geometria associada e concequ@^{e}ntemente @'{e} invis@'{i}vel. Voc@^{e} pode, Todavia, explicitamente fornecer ao Alien alguma geometria usando um comando GCL, fazendo com que o Alien aparece no navegador de alvos. Use o comando @code{geometry} para fazer isso: @code{(geometry CENTER @var{geometry})}, onde @var{geometry} @'{e} qualquer geometria v@'{a}lida. Por exemplo, @code{(geometry CENTER @{ < xyz.vect @})} faz com que o arquivo @file{xyz.vect}, que @'{e} um dos arquivos de exemplo padronizados distribu@'{i}dos com Geomview, seja usado na geometria para CENTER. Veja @ref{geometry, @code{(geometry @dots{})}}. O que acontece internamente quando voc@^{e} seleciona um ponto de interesse @'{e} que o centro @'{e} ajustado para o objeto chamado CENTER, e aquele objeto @'{e} posicionado no ponto de interesse. Adicionalmente, para que movimentos de mouse acompanhem o ponto de interesse, o atual comprimento focal da c@^{a}mera @'{e} escolhido para ser a dist@^{a}ncia da c@^{a}mera at@'{e} o ponto de interesse. Voc@^{e} pode realizar isso via GCL com os seguintes comandos: @example (if (real-id CENTER) nil (new-alien CENTER @{@})) (ui-center CENTER) (transform-set CENTER universe universe translate @var{x} @var{y} @var{z}) (merge camera @var{cam-id} @{ focus @var{d} @}) @end example @noindent onde @code{(@var{x},@var{y},@var{z})} s@~{a}o as coordenadas (universe) do ponto de interesse, e @var{d} @'{e} a dist@^{a}ncia daquele ponto @`{a} atual c@^{a}mera, @var{cam-id}. O primeiro comando acima cria o "alien" CENTER se esse Alien n@~{a}o existir ainda. @comment ================================================================ @node Aparencia, Cameras, Movimentos do Mouse, Interacao @section Modificando a Forma de Ver as Coisas Geomview utiliza uma hierarquia de apar@^{e}ncias para controlar o caminho atrav@'{e}s do qual olha-se coisas. Uma apar@^{e}ncia (@dfn{appearance}) @'{e} uma especifica@,{c}@~{a}o de informa@,{c}@~{a}o sobre como alguma coisa pode ser desenhada. Isso pode incluir muitas caracter@'{i}sticas como cor, brilho, propriedades do material, etc. Apar@^{e}ncias trabalham de uma maneira hier@'{a}rquica: se uma certa propriedade de apar@^{e}ncia, por exemplo cor de face, n@~{a}o for especificada em uma apar@^{e}ncia particular de algum objeto, esse bojeto @'{e} desenhado usando aquele propriedade de uma hierarquia superior. Se ambas as apar@^{e}ncias de hierarquias, a atual e a superior, especificam uma propriedade, a hierarquia atual tem preced@^{e}ncia a menos que a hierarquia superior n@~{a}o for escolhida para sobrescrev@^{e}-la. Todo geom no Geomview tem uma apa@^{e}ncia associada. Existe tamb@'{e}m uma apar@^{e}ncia associada ao geom do tipo "World", que comporta-se como hierarquia superior a cada apar@^{e}ncia individual de qualquer geom. Finalmente, existe uma apar@^{e}ncia b@'{a}sica global, que @'{e} a hierarquia superior da apar@^{e}ncia "World". A apar@^{e}ncia b@'{a}sica especifica valores razo@'{a}veis para toda informa@,{c}@~{a}o de apar@^{e}ncia, e por padr@~{a}o nenhuma outra apar@^{e}ncia especifica qualquer coisa, o que significa que as apar@^{e}ncias erdam seus valores a a partir da apar@^{e}ncia b@'{a}sica. Isso significa que por padr@~{a}o todos os objetos s@~{a}o desenhados usando a apar@^{e}ncia b@'{a}sica. Se voc@^{e} modificar uma certa propriedade de apar@^{e}ncia de um geom, aquela propriedade @'{e} usada na constru@,{c}@~{a}o daquele geom. A apar@^{e}ncia de hierarquia superior @'{e} usada para quaisquer propriedades que voc@^{e} n@~{a}o explicitamente escolheu. Geomview possui tr@^{e}s pain@'{e}is que levam voc@^{e} a modificar apar@^{e}ncias. @menu * Painel de Aparencia:: Cor etc. * Painel de Materiais:: Propriedades do Material da Superf@'{i}cie. * Painel de Iluminacao:: Par@^{a}metros de Ilumina@,{c}@~{a}o. @end menu @comment ---------------------------------------------------------------- @node Painel de Aparencia, Painel de Materiais, Aparencia, Aparencia @subsection The Appearance Panel O painel de Apar@^{e}ncia (@emph{Appearance}) leva voc@^{e} a modificar as mais comuns propriedades de apar@^{e}ncia do objeto alvo. @float Figura,figap @image{figs/ap} @caption{O Painel de Apar@^{e}ncia.} @end float Se o alvo for um geom individual, ent@~{a}o modifica@,{c}@~{a}oes que voc@^{e} fizer no painel de apar@^{e}ncias aplicam-se a apar@^{e}ncia daquele objeto geom@'{e}trico. Se o alvo for o "World", ent@~{a}o as modifica@,{c}@~{o}es no painel de apar@^{e}ncias aplicam-se @`{a} apar@^{e}nca do objeto atual @emph{e} a apar@^{e}ncia de todos os outros objetos individuais. (Usu@'{a}rios acham que esse comportamento @'{e} mais desej@'{a}vel que ter as modifica@,{c}@~{o}es somente aplicadas a apar@^{e}ncia do "World".) Se o alvo for uma c@^{a}mera, ent@~{a}o as modifica@,{c}@~{o}es do painel de apar@^{e}ncia aplica-se ao geom que ocupou mais recentemente a posi@,{c}@~{a}o de alvo. Os cinco bot@~{o}es pr@'{o}ximos ao canto superior esquerdo sob a palavra @emph{Show} (mostrar) controlam que partes do geom alvo s@~{a}o desenhadas. @table @emph @item Faces Esse bot@~{a}o especifica se faces s@~{a}o desenhadas. @item Edges Esse bot@~{a}o especifica se arestas s@~{a}o desenhadas. @item Normals Esse bot@~{a}o especifica se vetores normais @`{a} superf@'{i}cie s@~{a}o desenhados. @item BBox Esse bot@~{a}o especifica se a caixa associada @'{e} desenhada. @item Vects Esse bot@~{a}o especifica se objetos VECT s@~{a}o desenhados. VECTs s@~{a}o um tipo de objeto OOGL que representa pontos e segmentos de reta em espa@,{c}o tridimencional; os VECTs s@~{a}o distintos de arestas ou de outros tipos de objetos, e @'{e} desej@'{a}vel algumas vezes ter controle separado sobre se eles s@~{a}o desenhados. @end table Os quatro bot@~{o}es sob @emph{Color} rotulados @emph{Faces}, Arestas (@emph{Edges}), Normais (@emph{Normals}), e @emph{BBox} permitem a voc@^{e} especificar a cor do aspecto correspondente de um geom alvo. Clicando sobre um deles faz com que apare@,{c}a um painel de escolha de cores. @float Figura,figcolorchooserpanel @image{figs/color} @caption{Painel de Escolha de Cor.} @end float Esse painel oferece dois conjuntos de bot@~{o}es deslizantes: H(ue) S(Saturation) V(alue), ou R(ed) G(reen) B(lue), cada um no intervalo real fechado de 0 a 1. O quadrado mostra a cor atual, que @'{e} fornecida numericamente em ambos os sitemas HSV e RGB nas caixas de texto correspondentes. No sistema de cores HSV, hue H mostra vermelho em 0, verde em .333, azul em .667, e volta ao vermelho em 1.0. Satura@,{c}@~{a}o fornece a fra@,{c}@~{a}o de branco misturada na cor, de 0 para cinza puro a 1 para a cor pura. Valor fornece o brilho, de 0 para preto a 1 para brilho m@'{a}ximo. Pressionado o bot@~{a}o @emph{RGB} ou o bot@~{a}o @emph{HSV} ao centro do topo do painel alterna os bot@~{o}es deslizantes para outro sistema de cores. Voc@^{e} pode ajustar cores ou atrav@'{e}s dos bot@~{o}es deslizantes, ou atrav@'{e}s de digita@,{c}@~{a}o nas caixas de texto RGB ou HSV. Clique @emph{OK} para aceitar as cores que voc@^{e} tiver escolhido, ou @emph{Cancel} para reter as escolhas anteriores de cor. O navegador @emph{SHADING} permite a voc@^{e} especificar o modelo de sombreamento que Geomview utilizar@'{a} para desenhar o geom alvo. @table @code @item Constant Toda face do objeto @'{e} desenhada com uma cor constante que n@~{a}o depende da localiza@,{c}@~{a}o da face, nem da c@^{a}mera, nem tamb@'{e}m das fontes de luz. Se o objeto n@~{a}o contiver cores por face ou por v@'{e}rtice, a cor difusa de apar@^{e}ncia do objeto @'{e} usada. Se o objeto contiver cores por face, essas cores ser@~{a}o usadas. Se o objeto contiver cores por v@'{e}rtice, cada face @'{e} pintada usando a cor de seu primeiro v@'{e}rtice. @item Flat Cada face do objeto @'{e} desenhada com uma cor que depende da localiza@,{c}@~{a}o relaiva da face, da c@^{a}mera, e das fontes de luz. A cor @'{e} constante ao longo da face mas pode mudar conforme muda a face, a c@^{a}mera, ou o movimento das luzes. @item Smooth Cada face do objeto @'{e} desenhada com cores lisamente interpoladas baseadas nos vetores normais em cada v@'{e}rtice. Se o objeto n@~{a}o contiver normais por v@'{e}rtice, "Smooth" tem o mesmo efeito que o modo de sombreamento "Flat". Se o objeto tiver normais por v@'{e}rtice raso@'{a}veis, o efeito @'{e} alisamento sobre as arestas e entre as faces. @item CSmooth Cada face do objeto @'{e} desenhada com as cores exatamente especificada(s), independente de ilumina@,{c}@~{a}o, orienta@,{c}@~{a}o, e propriedades de material. Se o objeto for definido com cores por v@'{e}rtice, as cores ser@~{a}o interpoladas lisamente ao longo da face; de outra forma o efeito @'{e} o mesmo que ocorre no estilo de sombreamento "Constant". @item VCflat Uma combina@,{c}@~{a}o de @code{CSmooth} e sombreamento @code{Flat}. Dessa forma o sombreamento @'{e} constante em cada face, de acordo com a orienta@,{c}@~{a}o relativa das fontes de luz, a c@^{a}mera e a superf@'{i}cie normal da face. @end table O bot@~{a}o @emph{Facing Normals} no painel de apar@^{e}ncia (@emph{Appearance}) indica se Geomview pode arranjar aqueles vetores normais ou se n@~{a}o pode sempre conforme a visualiza@,{c}@~{a}o. Se um vetor normal direciona-se afastando-se do visualizador a cor da face correspondente ou v@'{e}rtice correspondente usualmente @'{e} mais forte do que @'{e} desejado. Geomview pode evitar isso atrav@'{e}s do uso da normal oposta em c@'{a}lculos de sombreamento. Esse comportamento @'{e} o padr@~{a}o. Usando @emph{Facing Normals} podemos fornecer estranha suavidade pesada ou estranhos efeitos de tonalidade de luz, embora, proximo ao horizonte de um objet distantemente liso facetado. Pressione esse bot@~{a}o para usar as normais fornecidas com o objeto. Os tr@^{e}s campos no canto inferior esquerdo do painel de apar@^{e}ncia (@emph{Appearance}) s@~{a}o: @table @emph @item Line Width A espessura, em pixels, para linhas desenhadas pelo Geomview. @item Normal Length Isso @'{e} atualmente um fator de homotetia; quando vetores normais forem desenhados, Geomview desenha-os de forma que tenham um comprimento que @'{e} seu comprimento natural vezes esse n@'{u}mero. @item Patch Dicing Geomview desenha retalhos de Bezier primeiro convertendo-so em malhas. Esse par@^{a}metro especifica a resolu@,{c}@~{a}o da malha: se @emph{Patch Dicing} for @var{n}, ent@~{a}o uma malha @var{n} por @var{n} @'{e} usada para desenhar cada retalho de Bezier. Se @emph{Patch Dicing} for 1, a resolu@,{c}@~{a}o reverte-se para um valor padr@~{a}o interno. @end table O bot@~{a}o @emph{Revert} no painel de apar@^{e}ncia (@emph{Appearance}) desfaz todas as escolhas na apar@^{e}ncia do alvo. Isso faz com que o geom alvo herde todas as suas propriedades de apar@^{e}ncia de seus pais. O bot@~{a}o do painel de apar@^{e}ncia (@emph{Appearance}) determina se controles de apar@^{e}ncia devem sobrescrever escolhas feitas nos objetos em si mesmos -- por exemplos, escolhendo a cor de face ir@'{a} afetar todas as faces de objetos com faces multicoloridas. De outra forma, controles de apar@^{e}ncia somente fornecem escolhas que n@~{a}o forem especificadas nos objetos em si mesmos n@~{a}o especificarem. Por padr@~{a}o, @emph{Override} est@'{a} habilitado. Esse bot@~{a}o aplica-se a todos os objetos, e a todos os pain@'{e}is relacionados a apar@^{e}ncia. Normaliza@,{c}@~{a}o @'{e} um tipo de homotetia; Geomview pode alterar o tamanho de um objeto proporcionalmente de forma que esse objeto se ajuste dentro de uma certa regi@~{a}o. O objetivo principal da normaliza@,{c}@~{a}o @'{e} permitir a voc@^{e} facilmente visualizar um objeto sem ter que se preocupar com o tamanho do mesmo. Estamos substituindo gradualmente o recurso de normaliza@,{c}@~{a}o do Geomview por recursos mais robustos de posicionamento de c@^{a}mera. Em geral, o melhor caminho de garantir que voc@^{e} est@'{a} vendo tudo de um objeto @'{e} usar o bot@~{a}o @emph{Look At} do painel de ferramentas (@emph{Tools}). A normaliza@,{c}@~{a}o pode ser completamente substitu@'{i}da por esse bot@~{a}o do painel de ferramentas e por outros recursos em uma vers@~{a}o futura do Geomview. Normaliza@,{c}@~{a}o @'{e} uma propriedade que aplica-se a cada geom separadamente. o navegador @emph{NORMALIZE GEOMETRY} afeta a propriedade de normaliza@,{c}@~{a}o do geom alvo. Se o geom alvo for "World", a normaliza@,{c}@~{a}o afetar@'{a} todos os geoms. @table @emph @item None Sem normaliza@,{c}@~{a}o. @item Individual Normaliza o geom atual para ajustar-se dentro de uma esfera unit@'{a}ria. @item Sequence Assemelha-se a "Individual", exceto quando um objeto est@'{a} mudando. Ent@~{a}o, "Individual" com muita precis@~{a}o ajusta a caixa associada em torno do objeto quando esse objeto modifica-se e normaliza-se adequadamente, enquanto "Sequence" normaliza a uni@~{a}o de todas as variantes do objeto e normaliza ade-quadamente. @item Keep Mantem a transforma@,{c}@~{a}o de normaliza@,{c}@~{a}o inalterada quando o objeto modifica-se. @emph{Keep} pode ser @'{u}til para aplicar a normaliza@,{c}@~{a}o "Individual" ou a normaliza@,{c}@~{a}o "Sequence" @`{a} primeira vers@~{a}o de um objeto que se modifica para trazer esse mesmo objeto ao campo de vis@~{a}o. @end table @comment ---------------------------------------------------------------- @node Painel de Materiais, Painel de Iluminacao, Painel de Aparencia, Aparencia @subsection O Painel de Materiais O painel de materiais (@emph{Materials}) controla as propriedades materiais das surperf@'{i}cies. O painel de materiais trabalha com o objeto alvo da mesma forma que o painel de apar@^{e}ncia (@emph{Appearance}) faz. @float Figura,figmatpanel @image{figs/mat} @caption{O Painel de Materiais.} @end float @table @emph @item Translucent Esse bot@~{a}o determina se a capacidade de ser transl@'{u}cido est@'{a} habilitada. Geomview suporta tr@^{e}s diferentes formas da capacidade de ser transl@'{u}cido (transluc@^{e}ncia): @table @emph @item Alpha-blending com BSP-tree depth-sorting Esse @'{e} o n@'{i}vel mais acurado de prefer@^{e}ncia de visualiza@,{c}@~{a}o imediata, mas consome vastos montantes de tempo de computa@,{c}@~{a}o e mem@'{o}ria. No modo simples de transluc@^{e}ncia objetos s@~{a}o mostrados corretamente em rela@,{c}@~{a}o a si mesmos; todavia multiplos objetos transl@'{u}cidos podem aparecer na ordem inadequada na tela. A no@,{c}@~{a}o @emph{objeto} significa aqui: geometria de n@'{i}vel mais alto como mostrado no navegador de alvo de geometria. @item Screen Door Translucency Se a m@'{a}quina suporta OpenGL ent@~{a}o existe suporte para tipo de transluc@^{e}ncia por mascaramento de sa@'{i}da (completamente) de pixels transparentes por meio de uma mascara de ponteamento. Essa forma @'{e} atualmente muito experimental, e o resultado @'{e} de certa forma o ideal, mas funciona e @'{e} r@'{a}pido. @item Alphe-blending sem depth-sorting Esse @'{e} a antiga forma de fazer uma transluc@^{e}ncia r@'{a}pida e com muitas falhas. Essa @'{e} r@'{a}pida, mas os resultados s@~{a}o completamente incorretos. @end table Quando a transpar@^{e}ncia estiver habilitada, um instant@^{a}neo RenderMan ir@'{a} conter a informa@,{c}@~{a}o alfa, um renderizador obediente pode ent@~{a}o gerar figuras de alta qualidade, incluindo a transluc@^{e}ncia correta. @item Alpha O bot@~{a}o deslizante determina a opacidade/transpar@^{e}ncia quando a transpar@^{e}ncia estiver habilitada. 0 (zero) significa totalmente transparente, 1 significa totalmente opaco. @item Diffuse Reflectance Esse bot@~{a}o deslizante controla a reflect@^{a}ncia difusa de uma superf@'{i}cie. Isso tem a ver com o quanto a superf@'{i}cie dispersa a luz que reflete. @item Shininess Esse bot@~{a}o deslizante controla o quanto brilhante a superf@'{i}cie @'{e}. Esse bot@~{a}o determina o tamanho de destaques especulares sobre a superf@'{i}cie. Valores pequenos fornecem @`{a} superf@'{i}cie uma apar@^{e}ncia sombria. @item Ambient Reflectance Esse bot@~{a}o deslizante controla o quanto da luz ambiente uma superf@'{i}cie reflete. @item Specular Reflectance Esse bot@~{a}o deslizante controla a reflect@^{a}ncia especular de uma superf@'{i}cie. Isso tem a ver com como a superf@'{i}cie reflete diretamente os raios luminosos. Valores maiores fornecem destaques de brilho especular. @item Done Esse bot@~{a}o dispensa o painel de materiais (@emph{Materials}). @end table @comment ---------------------------------------------------------------- @node Painel de Iluminacao, , Painel de Materiais, Aparencia @subsection O Painel de Luzes O painel de luzes (@emph{Lights}) controla o n@'{u}mero, a posi@,{c}@~{a}o, e a cor das fontes de luz usadas no sombreamento. @float @image{figs/light} @caption{O Painel de Ilumina@,{c}@~{a}o.} @end float O painel de ilumina@,{c}@~{a}o (@emph{Lighting}) @'{e} diferente do painel de apar@^{e}ncia (@emph{Appearance}) e dos pain@'{e}is de material (@emph{Material}) no sentido de que o painel de ilumina@,{c}@~{a}o sempre trabalha com a apar@^{e}ncia base. Isso ocorre pelo fato de fazer sentido usar o mesmo conjunto de luzes para desenhar todos os objetos na sua cena. @table @emph @item LIGHTS O navegador de luzes (@emph{LIGHTS}) mostra a luz atualmente selecionada. Modifica@,{c}@~{o}es s@~{a}o feitas usando os outros meios de escolha sobre esse painel aplicado a essa luz. Existe sempre pelo menos uma luz, a luz ambiente. @item Intensity Esse bot@~{a}o deslizante controla a intensidade da luz atual. @item Color Esse bot@~{a}o faz surgir um modificador de corres que lhe permite selecionar a cor da luz que atualmente ilumina o objeto. @item Add Esse bot@~{a}o adiciona uma luz. @item Delete Esse bot@~{a}o exclui a luz atual. @item Show Lights Esse bot@~{a}o permite a voc@^{e} ver e modificar a posi@,{c}@~{a}o das fontes de ilumina@,{c}@~{a}o em uma janela de c@^{a}mera. Cada luz @'{e} movida ao longo de um cilindro que @'{e} suposto para lembrar a voc@^{e} um raio de luz. Quando voc@^{e} clica sobre o bot@~{a}o @emph{Show Lights} Geomview entra no modo "light edit", durante o qual voc@^{e} pode rotacionar a ilumina@,{c}@~{a}o atual mantendo pressionado o bot@~{a}o esquerdo do mouse e movendo o mouse. Ilumina@,{c}@~{a}o colocada dessa forma est@~{a}o infinitamente distantes, de forma que o que voc@^{e} est@'{a} modificando @'{e} a posi@,{c}@~{a}o angular. Clique sobre o bot@~{a}o @emph{Show Lights} novamente para retornar ao modo anterior de movimento e para sair movendo os raios de luz. @item Done Esse bot@~{a}o dispensa o painel de ilumina@,{c}@~{a}o (@emph{Lighting}). @end table Os pain@'{e}is do Geomview @emph{Appearance}, @emph{Materials}, e @emph{Lighting} s@~{a}o constru@'{i}dos para permitir a voc@^{e} fazer facilmente a maioria das coisas relacionadas a apar@^{e}ncia que voc@^{e} pode querer fazer. A hierarquia de apar@^{e}ncia que Geomview suporta internamente, todavia, @'{e} muito complexa e existem certas opera@,{c}@~{o}es que voc@^{e} n@~{a}o pode fazer com os pain@'{e}is. A linguagem de comandos do Geomview (GCL) fornece suporte completo a opera@,{c}@~{o}es sobre apar@^{e}ncia. Em particular, o comando @code{merge-baseap} pode ser usado para modificar a apar@^{e}ncia de base (a qual, exceto para ilumina@,{c}@~{a}o, n@~{a}o pode ser modificada atrav@'{e}s de pain@'{e}is do Geomview). O comando @code{merge-ap} pode ser usado para modificar a apar@^{e}ncia de um geom individualmente. Apar@^{e}ncias podem tamb@'{e}m serem especificadas nos arquivos OOGL; para detalhes veja, @ref{Aparencias}. @ref{merge-baseap,@code{(merge-baseap @dots{})}}. @ref{merge-ap,@code{(merge-ap @dots{})}}. @comment ================================================================ @node Cameras, Gravando, Aparencia, Interacao @section Cameras Uma c@^{a}mera no Geomview @'{e} o objeto que corresponde a uma janela de c@^{a}mera. Por padr@~{a}o existe somente uma c@^{a}mera, mas @'{e} poss@'{i}vel ter tantas quantas voc@^{e} quiser. Voc@^{e} pode controlar certos aspectos do objeto vis@'{i}vel atualmente na janela de c@^{a}mera arrastando em cada janela de c@^{a}mera via o painel @emph{Cameras}. @float Figura,figcamerapanel @image{figs/cam} @caption{O Painel de C@^{a}mera.} @end float Se o objeto alvo for uma c@^{a}mera, o painel de c@^{a}meras (@emph{Cameras}) afeta essa c@^{a}mera. Se o objeto alvo n@~{a}o for uma c@^{a}mera, o painel de c@^{a}meras (@emph{Cameras}) afeta a c@^{a}mera atual (@dfn{current camera}). A c@^{a}mera atual @'{e} a c@^{a}mera da janela que o cursor do mouse est@'{a} nela, ou estava mais recentemente se o cursor n@~{a}o estiver em uma janela de c@^{a}mera. Dessa forma, se voc@^{e} usa teclas de atalho para as a@,{c}@~{o}es no painel de c@^{a}meras (@emph{Cameras}) enquanto o cursor estiver em uma janela de c@^{a}mera, as a@,{c}@~{o}es aplicam-se a aquela c@^{a}mera, a menos que voc@^{e} tenha explicitamente selecionado outra c@^{a}mera. Para criar novas janelas de c@^{a}mera, use a tecla de atalho @kbd{v+}, ou veja o menu arquivo (@emph{File}) no painel principal (@emph{Main}). @table @emph @item Single-Buffering Normalmente, janelas do Geomview s@~{a}o armazenadas em @'{a}reas de mem@'{o}ria duplas (@emph{double-buffered}): Geomview desenha a figura seguinte em uma janela escondida, ent@~{a}o alterna as @'{a}reas de mem@'{o}ria para fazer essa janela completamente vis@'{i}vel em algum momento. Sobre muitos sistemas operacionais, a mem@'{o}ria para a @'{a}rea de mem@'{o}ria escondida vem da apropria@,{c}@~{a}o indevida de metade dos bits de cada pixel de tela, reduzindo a resolu@,{c}@~{a}o de cor. Quando a op@,{c}@~{a}o @'{a}rea de mem@'{o}ria simples (single-buffering) for habilitada, as pel@'{i}culas de tela de cada cena est@'{a} sendo desenhada, mas voc@^{e} pode pegar imagens planas com redu@,{c}@~{a}o de granularidade estremecendo artefatos. @'{A}rea de mem@'{o}ria simples @'{e} poss@'{i}vel se Geomview for compilado com GL ou com OpenGL, mas n@~{a}o com gr@'{a}ficos desenhados com recursos @'{u}nicos e exclusivos do X. @item Dither Muitos monitores oferecem menos que 24 bits por pixel (8 bits para cada vermelho, verde, e azul) convencionalmente suficiente para mostrar grada@,{c}@~{o}es de cor simplesmente. Quando tenta mostrar uma cor n@~{a}o acuradamente dispon@'{i}vel no monitor, Geomview normalmente estremece (@emph{dithers}), modificando as cores do pixel para algumas vezes mais brilhante, algumas vezes mais escuro que o valor desejado, de forma que a cor dispon@'{i}vel sobre uma @'{a}rea @'{e} uma melhor aproxima@,{c}@~{a}o para a cor verdadeira que um pixel simples pode ter. Efetivamente perdas de resolu@,{c}@~{a}o espacial s@~{a}o para ganhar resolu@,{c}@~{a}o de cor. Esse compartamento n@~{a}o @'{e} sempre desej@'{a}vel, todavia. Desabilitando @emph{Dither} fornece menor granularidade, mas a precis@~{a}o de cores @'{e} menor, das imagens. @item Software Shading Esse bot@~{a}o controla se Geomview faz c@'{a}lculos de sombreamento via software. O padr@~{a}o @'{e} permitir que o hardware manuseie esses c@'{a}lculos, e no espa@,{c}o Euclideano esse caminho @'{e} o melhor sempre porque @'{e} o caminho mais r@'{a}pido. No espa@,{c}o hiperb@'{o}lico e tamb@'{e}m no espa@,{c}o esf@'{e}rico, todavia, os c@'{a}lculos de sombreamento que o hardware faz s@~{a}o incorretos. Clique sobre esse bot@~{a}o para habilitar a forma correta mas lenta do c@'{a}lculo de sombreamento via software. @item Background Color Esse bot@~{a}o faz surgir um modificador de cores que voc@^{e} pode usar para escolher a cor de fundo da janela da c@^{a}mera. @item PROJECTION Esse navegador permite a voc@^{e} selecionar entre proje@,{c}@~{a}o perspectiva ou proje@,{c}@~{a}o ortogr@'{a}fica para essa c@^{a}mera. @item Near clip Essa caixa de texto determina a dist@^{a}ncia nas coordenadas do objeto mundo do pr@'{o}ximo plano de corte a partir do ponto de vis@~{a}o. Deve ser um n@'{u}mero positivo. @item Far clip Essa caixa de texto determina a dist@^{a}ncia nas coordenadas do objeto mundo do plano de corte mais distante a partir do ponto de vis@~{a}o. Deve ser um n@'{u}mero positivo e em geral deve ser maior que o valor de @emph{Near clip}. @item FOV Essa caixa de texto @'{e} o campo de vis@~{a}o da c@^{a}mera, medido em sua menor dire@,{c}@~{a}o. No modo perspectiva, essa caixa corresponde a um @^{a}ngulo em graus. No modo ortogr@'{a}fico, essa caixa de texto corresponde ao tamanho linear do campo de vis@~{a}o. Esse n@'{u}mero pode ser modificado com o mouse no modo @emph{Cam Zoom}. @item Focal Length A dist@^{a}ncia focal pretende pretende sugerir a dist@^{a}ncia da c@^{a}mera a um plano imagin@'{a}rio de interesse. Seu valor @'{e} usado quando alternamos entre as visualiza@,{c}@~{o}es ortogr@'{a}fica e perspectiva (e durante visualiza@,{c}@~{a}o stereo), de forma a preservar o tamanho aparente de objetos sendo desonesto quanto @`{a} dist@^{a}ncia focal da c@^{a}mera. Dist@^{a}ncia focal tamb@'{e}m afeta a interpola@,{c}@~{a}o de movimentos de transla@,{c}@~{a}o efetuados usando o mouse. A velocidade do movimento para adiante (nos modos transla@,{c}@~{a}o, v@^{o}o e no modo orbital) @'{e} proporcional @`{a} dist@^{a}ncia focal; e objetos desonestos quanto @`{a} dist@^{a}ncia focal da c@^{a}mera translacionam lateralmente na mesma raz@~{a}o que o cursor do mouse. Finalmente, no modo de proje@,{c}@~{a}o N-Dimencional, c@^{a}meras s@~{a}o substitu@'{i}das de volta atrav@'{e}s da dist@^{a}ncia focal a partir da proje@,{c}@~{a}o tridimensional da or@'{i}gem do objeto mundo. @item Lines Closer Esse n@'{u}mero tem a ver com o caminho pelo qual as linhas s@~{a}o desenhadas. Normalmente a @'{a}rea de armazenamento tempor@'{a}rio do algor@'{i}tmo que controla as coordenadas do eixo z podem confundir-se na hora de desenhar linhas que localizam-se exatamente sobre superf@'{i}cies (tais como as arestas de um objeto); devido a erros de arredondamento de m@'{a}quina, algumas vezes as linhas parecem estar em frente @`{a} superf@'{i}cie e algumas vezes elas parecem estar por detr@'{a}s da superf@'{i}cie. O valor @emph{Lines Closer} @'{e} um fator de corre@,{c}@~{a}o --- Geomview modifica sutilmente todas as linhas que o algor@'{i}tmo da @'{a}rea de armazanamento tempor@'{a}ria desenha fechando para a c@^{a}mera atrav@'{e}s desse fator. O n@'{u}mero deve ser um inteiro pequeno; tente 5 ou 10. O valor zero (0) desabilita esse recurso completamente. Escolhendo valores grandes tornar@'{a} as linhas vis@'{i}veis mesmo quando elas devam ser escondidas. @item SPACE MODEL Essa op@,{c}@~{a}o determina o modelo usado para desenhar o objeto mundo. @'{E} mais @'{u}til em espa@,{c}os hiperb@'{o}licos e esf@'{e}ricos. Voc@^{e} provavelmente n@~{a}o necessitar@'{a} tocar esse navegador se voc@^{e} permanecer no espa@,{c}o Euclideano. Para mais informa@,{c}@~{a}o sobre esses modelos, veja @ref{Geometrias Nao-Euclidianas}. @table @emph @item Virtual Esse @'{e} o modelo padr@~{a}o e representa a visualiza@,{c}@~{a}o natural de dentro do espa@,{c}o. @item Projective Corresponde ao modelo projetivo do espa@,{c}o hiperb@'{o}lico e do espa@,{c}o esf@'{e}rico. Geoms movem-se obedecendo as isometrias do espa@,{c}o, e c@^{a}meras movem-se atrav@'{e}s de movimentos Euclideanos. Por padr@~{a}o em modelos projetivos, a esfera unit@'{a}ria Euclidiana @'{e} desenhada. No espa@,{c}o hiperb@'{o}lico essa esfera localiza-se no infinito. No espa@,{c}o Euclideano o modelo projetivo @'{e} o mesmo que o modelo virtual exceto que a esferea @'{e} desenhada por padr@~{a}o. @item Conformal Corresponde ao modelo conformal do espa@,{c}o hiperb@'{o}lico e do espa@,{c}o esf@'{e}rico. Geoms movem-se obedecendo as isometrias do espaco, e c@^{a}meras move-se atrav@'{e}s de movimentos Euclideanos. No espa@,{c}o Euclidiano, o modelo conformal equivale a inverter tudo na esfera unit@'{a}ria. @end table @item Draw Sphere Essa op@,{c}@~{a}o controla se Geomview desenha a esfera unit@'{a}ria ou n@~{a}o. Por padr@~{a}o a esfera unit@'{a}ria aparece no modelo projetivo e no modelo conformal. No espa@,{c}o hiperb@'{o}lico a esfera @'{e} colocada no infinito. No espa@,{c}o esf@'{e}rico corresponde @`{a} esfera equatorial. @item Done Esse bot@~{a}o dispensa o painel de @emph{Cameras}. @end table @comment ================================================================ @node Gravando, Comandos, Cameras, Interacao @section Gravando Seu Trabalho O painel @emph{Save} do Geomview permite a voc@^{e} armazenar objetos do Geomview e outra informa@,{c}@~{a}o em arquivos que voc@^{e} pode recuperar dentro do Geomview ou a partir de outros programas. @float Figura,figsavepanel @image{figs/save} @caption{O Painel Gravar.} @end float Para usar o painel @emph{Save} voc@^{e} seleciona o formato desejado no navegador perto da palavra @emph{Save}, informe o nome do objeto que voc@^{e} quer gravar no campo de texto perto da palavra @emph{for}, e informe o nome do local no qual voc@^{e} deseja gravar o arquivo no campo longo de texto perto da palavra @emph{in}. Voc@^{e} pode ou pressionar @kbd{@key{Enter}} ou clicar sobre o bot@~{a}o @emph{OK}. Quando o arquivo tiver sido gravado no local desejado, o painel @emph{Save} desaparecer@'{a}. Caso voc@^{e} queira dispensar o painel @emph{Save} sem gravar um arquivo, clique no bot@~{a}o @emph{Cancel}. Caso voc@^{e} especifique @file{-} como nome de arquivo, Geomview mostra o arquivo na sa@'{i}da padr@~{a}o, i.e. na janela de shell a partir da qual voc@^{e} invocou o Geomview. Os poss@'{i}veis formatos s@~{a}o fornecidos abaixo. O tipo de objeto que pode ser escrito com cada formato @'{e} fornecido entre par@^{e}ntesis. @table @emph @item Commands @asis{(qualquer objeto)} A op@,{c}@~{a}o "Commands" escreve um arquivo de comandos GCL contendo todas as informa@,{c}@~{o}es sobre o objeto. Chamando o arquivo posteriormente ir@'{a} restaurar o objeto bem como todas as outras informa@,{c}@~{o}es sobre o referido objeto, tais como apar@^{e}ncia, transforma@,{c}@~{o}es, etc. @item Geometry alone @asis{(geom)} A op@,{c}@~{a}o "Geometry alone" escreve um arquivo OOGL contendo apenas a geo-metria do objeto. @item Geometry [in world] @asis{(geom)} A op@,{c}@~{a}o "Geometry [in world]" escreve um arquivo OOGL contendo a geometria do objeto, transformado sob a transforma@,{c}@~{a}o atual do Geomview para esse objeto. Use a op@,{c}@~{a}o "Geometry [in world]" caso voc@^{e} tenha movido o objeto de sua posi@,{c}@~{a}o inicial e queira a nova posi@,{c}@~{a}o em rela@,{c}@~{a}o ao objeto mundo. @item Geometry [in universe] @asis{(geom)} A op@,{c}@~{a}o "Geometry [in universe]" grava um arquivo OOGL contendo apenas a geometria do geom, transformado sob transforma@,{c}@~{o}es sofridas pelo objeto e tamb@'{e}m sob transforma@,{c}@~{o}es sofridas pelo objeto mundo. @item RMan [->tiff] @asis{(camera)} A op@,{c}@~{a}o "RMan [->tiff]" escreve um arquivo que quando for renderizado cria uma imagem tiff. Transpar@^{e}ncia e textura (a mais recente somente at@'{e} certo ponto) estar@'{a} dispon@'{i}vel. @item RMan [->frame] @asis{(camera)} A op@,{c}@~{a}o "RMan [->frame]" escreve um arquivo RenderMan que quando for rede-rizado faz com que uma imagem apare@,{c}a em uma janela na tela. Transpar@^{e}ncia e textura (a mais recente somente at@'{e} certo ponto) estar@'{a} dispon@'{i}vel. @item SGI snapshot @asis{(camera)} A op@,{c}@~{a}o "SGI snapshot" escreve um arquivo de varredura SGI. Uma campainha toca quando o instant@^{a}neo for completado. Somente dispon@'{i}vel em sistemas SGI. @item PPM GLX-offscreen snapshot @asis{(camera)} Renderiza uma cena completa novamente dentro da mem@'{o}ria off-screen; GLX fornece os meios para usar um Pixmap como @'{a}rea de renderiza@,{c}@~{a}o. A vantagem de renderizar dentro da mem@'{o}ria @emph{off}-screen em rela@,{c}@~{a}o a pegar um instant@^{a}neo de tela @'{e} que a janela de c@^{a}mera n@~{a}o precisa ser mapeada e tamb@'{e}m n@~{a}o precisa aparece na hora do intant@^{a}neo @'{e} realizado. De forma que com o intant@^{a}neo off-screen se pode seguramente colocar a janela de c@^{a}mera no formato de @'{i}cone (mas n@~{a}o fech@'{a}-la!), ativar a prote@,{c}@~{a}o de tela e ir dormir enquanto algum script avan@,{c}a as cenas e grava os instant@^{a}neos. @item PPM Screen snapshot @asis{(camera)} Grava os instant@^{a}neos a partir da janela fornecida e grava no formato de imagem PPM. Se voc@^{e} especificar uma sequ@^{e}ncia de caracteres come@,{c}ando com um barra vertical (@kbd{|}) como nome de arquivo, isso @'{e} interpretado com um comando de redirecionamento do shell para o qual os dados do PPM dever@~{a}o ser canalizados, como em @samp{| pnmtotiff > snap.tiff} ou em @samp{| convert -geometry 50% ppm:- snap.gif}. Instant@^{a}neos de tela PPM est@~{a}o somente dispon@'{i}veis com GL e open GL, n@~{a}o com gr@'{a}ficos X somente. A janela pode ocupar inteiramente tela. Geomview ir@'{a} garantir que n@~{a}o haja outras janelas reproduzindo-a enquanto o instant@^{a}neo @'{e} gravado. @'{E} provavelmente melhor usar instant@^{a}neos GLX-@emph{off-screen}, como acima exposto. @item PPM software snapshot @asis{(camera)} Escreve um instant@^{a}neo da janela atualmente visualizada, como uma imagem PPM, apra o arquivo fornecido. O nome do arquivo pode ser um comando do shell Bourne precedido por uma barra vertical (@kbd{|}), da mesma forma que com o inst@^{a}nt@^{a}neo de tela PPM (PPM screen snapshot). O instant@^{a}neo de software, apesar disso, @'{e} produzido atrav@'{e}s do uso de software renderizador interno (relacionado ao renderizador do sistema X-window). N@~{a}o @'{e} importante se a janela est@'{a} vis@'{i}vel ou n@~{a}o, e @'{e} independente do GL ou do OpenGL. Tamb@'{e}m essa op@,{c}@~{a}o n@~{a}o suporta alguns recursos, tais como mapeamento de textura. @item Postscript snapshot @asis{(camera)} Escreve um instant@^{a}neo Postscript da vis@~{a}o da c@^{a}mera. O instant@^{a}neo @'{e} feito atrav@'{e}s da decomposi@,{c}@~{a}o da cena em linhas e pol@'{i}gonos, ordenando por intensidade, e gerando linhas no formato Postscript e pol@'{i}gonos para cada uma. Vantagens desse processo sobre o processo baseado em pixes do instant@^{a}neo de imagens: a resolu@,{c}@~{a}o @'{e} muito alta, de forma que arestas parecem na posi@,{c}@~{a}o correta mesmo em impressoras de alta resolu@,{c}@~{a}o, ou imagens de resolu@,{c}@~{a}o compar@'{a}vel s@~{a}o tipicamente muito mais compactas. Desvantagens: ordena@,{c}@~{a}o por intensidade fornece bons resultados em algumas cenas, mas pode ser grandemente ruim como no algor@'{i}tmo de remo@,{c}@~{a}o de cenas ocultas em outras cenas. Tamb@'{e}m, Postscript n@~{a}o oferece sombreamento interpolado linear, somente sombreamento linear simples para cada faceta. @item Camera @asis{(camera)} Escreve um arquivo OOGL de uma c@^{a}mera. @item Transform [to world] @asis{(qualquerobjeto)} Escreve um arquivo de transforma@,{c}@~{a}o OOGL fornecendo transforma@,{c}@~{a}o do Geomview para o objeto. @item Transform [to universe] @asis{(qualquerobjeto)} Escreve um arquivo de transforma@,{c}@~{a}o OOGL fornecendo uma transforma@,{c}@~{a}o que @'{e} a composi@,{c}@~{a}o de transforma@,{c}@~{a}o do Geomview para o objeto e a transforma@,{c}@~{a}o sofrida pelo objeto mundo. @item Window @asis{(camera)} Escreve um arquivo de janela OOGL para uma c@^{a}mera. @item Panels Escreve um arquivo GCL contendo comandos que gravam o estado de todos os pain@'{e}is do Geomview. Chamando esse arquivo posteriormente ir@'{a} restaurar as posi@,{c}@~{o}es de todos os pain@'{e}is. @end table @comment ================================================================ @node Comandos, Atalhos de Teclado, Gravando, Interacao @section O Painel de Comandos O painel de comandos (@emph{Commands}) permite a voc@^{e} digitar comandos GCL. Quando voc@^{e} pressionar @kbd{@key{Enter}}, Geomview interpreta o comando e imprime qualquer sa@'{i}da resultante ou uma mensagens de erro para a sa@'{i}da padr@~{a}o. Voc@^{e} pode editar o texto e pressionar @kbd{@key{Enter}} tantas vezes quantas voc@^{e} quiser, em geral, mesmo que voc@^{e} pressione (@kbd{@key{Enter}}) com o cursor no painel de comandos ( @emph{Commands}), Geomview tenta interpretar se aquele texto que voc@^{e} tiver digitado no campo de texto como um comando. @float Figura,figcommandpanel @image{figs/command} @caption{O Painel de Comandos.} @end float @ifset forms O painel Obscuro (@emph{Obscure}) @'{e} para coisas relativamente obscuras que n@~{a}o pertencem realmente a qualquer dos outros paine@'{e}is. Na atual vers@~{a}o do Geomview, o painel obscuro (@emph{Obscure}) inclui o navegador @emph{NORMALIZE GEOMETRY}, que controla o tipo de normaliza@,{c}@~{a}o de geometria que Geomview faz, e muitos bot@~{o}es que afetam estilo de movimento. @float Figura,figobscurepanel @image{figs/obscure} @caption{O painel de Comandos.} @end float @end ifset @comment ================================================================ @node Atalhos de Teclado, , Comandos, Interacao @section Atalhos de Teclado A maioria das a@,{c}@~{o}es que voc@^{e} pode fazer atrav@'{e}s dos pain@'{e}is do Geomview possui as equivalentes teclas de atalho de forma que voc@^{e} pode fazer a mesma a@,{c}@~{a}o digitando uma sequ@^{e}ncia de teclas usando o teclado. Isso @'{e} @'{u}til para usu@'{a}rios avan@,{c}ados que forem familiarizados com as capacidades do Geomview e que queiram trabalhar rapidamente sem ter montes de pain@'{e}is confundindo a tela. Teclas de atalho comumente s@~{a}o indicadas entre colch@^{e}tes ([ ]) pr@'{o}ximo ao item correspondente em um painel. Por exemplo, a tecla de atalho para o modo de rota@,{c}@~{a}o (@emph{Rotate}) @'{e} 'r'; isso @'{e} indicado por "[r]" aparecendo antes da palavra "Rotate" no navegador @emph{MOTION MODE}. Para utilizar essa tecla de atalho apenas pressione a tecla @kbd{r} enquanto o cursor do mouse estiver sobre qualquer janela do Geomview. Voc@^{e} n@~{a}o precisa pressionar a tecla @kbd{@key{Enter}} ou teclas de @kbd{@key{SPACE}}. Alguns atalhos consistem de mais que uma tecla. Nesses casos apenas digite as teclas indicadas uma ap@'{o}s a outra e na ordem indicada, sem @kbd{@key{Enter}} ap@'{o}s cada tecla. Atalhos de teclado s@~{a}o sens@'{i}veis @`{a} caixa alta/baixa. Voc@^{e} pode cancelar atalhos compostos por v@'{a}rias teclas que voc@^{e} tiver iniciado a digita@,{c}@~{a}o digitando qualquer tecla inv@'{a}lida como de atalho, por exemplo a barra de espa@,{c}o. Comandos de teclado aplicam-se enquanto o cursor estiver em qualquer janela de c@^{a}mera e na maioria dos pain@'{e}is de controle. Muitas teclas de atalho permitem argumentos num@'{e}ricos que voc@^{e} digitar como um prefixo a tecla(s) de comando. Por exemplo, a tecla de atalho para @emph{Near clip} no painel de c@^{a}mera @'{e} @kbd{v n}. Para escolher o pr@'{o}ximo plano de corte para @samp{0.5}, digite @kbd{0.5vn}. Comandos que n@~{a}o recebem um prefixo num@'{e}rico modificam ou mudam para zero o valor atual. A maioria dos comando permitem um dos seguintes prefixos de sele@,{c}@~{a}o. Se nenhum objeto for fornecido o comando aplica-se ao objeto alvo. @table @kbd @item g objeto geom@'{e}trico mundo ("world") @item g# #'@'{e}simo objeto geom@'{e}trico ("geom") @item g* Todos os objetos geom@'{e}tricos ("geoms") @item c c@^{a}mera atual @item c# #'@'{e}sima c@^{a}mera @item c* Todas as c@^{a}meras @end table Por exemplo, @kbd{g4af} significa modifique a face desenhada do objeto @emph{g4}. Simplesmente digitando um prefixo de sele@,{c}@~{a}o, como @kbd{g4}, n@~{a}o seleciona um objeto ainda; isso somente acontece quando um comando, como @kbd{ae}, segue o prefixo. Para selecionar um objeto como alvo sem fazer nada mais para isso, use o comando @kbd{p}. Ent@~{a}o @kbd{g3p} seleciona o objeto g3. O campo de texto no canto superior esquerdo faz o painel principal (@emph{Main}) mostrar o estado da tecla de atalho atual. Para adi@,{c}@~{a}o de teclas de atalho ao painel de comandos, existe tamb@'{e}m um atalho para selecionar um objeto alvo: digite o nome curto do objeto seguido por @kbd{p}. Por exemplo, para selecionar o objeto @emph{g3}, digite @kbd{g 3 p}. Essa forma funciona somente com nomes curtos --- aqueles que aparecem entre colch@^{e}tes ([ ]) no navegador de alvos (@emph{Targets}) do painel principal @emph{Main}. Abaixo encontra-se um sum@'{a}rio de todas as teclas de atalho. @table @asis @item Desenho @table @kbd @item af Faces @item ae Arestas @item an Normais @item ab Caixas Associadas @item aV Vetores @end table @item Sombreamento @table @kbd @item 0as Constante @item 1as Mon@'{o}tono @item 2as Linear @item 3as Linear, n@~{a}o iluminado @item aT permite transpar@^{e}ncia @item at mapeamento de textura @end table @item Outro @table @kbd @item av vira as normais pelo avesso: sempre visualizador de face @item #aw Espessura da linha (em pixels) @item aC manuseia pol@'{i}gonos c@^{o}ncavos @item #vc fechador de arestas que n@~{a}o pertencem a faces (tente 5-100) @end table @item Cor @table @kbd @item Cf faces @item Ce arestas @item Cn normais @item Cb caixas associadas @item CB fundo @end table @item Movimentos @table @kbd @item r rota@,{c}@~{a}o @item t transla@,{c}@~{a}o @item z modifica@,{c}@~{o}es proporcionais de tamanho (FOV - campo de vis@~{a}o) @item f v@^{o}o @item o orbita @item s homotetia @item w recentralizar o alvo @item W recentralizar tudo @item h pare @item H pare tudo @item @@ selecione o centro do movimento (e.g. @kbd{g 3 @@}) @item L Olhe para objeto @end table @item Visualizando @table @kbd @item 0vp vis@~{a}o Ortogr@'{a}fica @item 1vp vis@~{a}o em perspectiva @item vd Habilite outras c@^{a}meras de vis@~{a}o @item #vv campo de vis@~{a}o @item #vn pr@'{o}xima dist@^{a}ncia de corte @item #vf dist@^{a}ncia de corte afastada @item v+ adicione nova c@^{a}mera @item vx cursor ligado/desligado @item vb face de tr@'{a}s de um pol@'{i}gono separada habilitada/desabilitada @item #vl dist@^{a}ncia focal @item v~ Tonalidade feita via software ligada/desligada @end table @item Pain@'{e}is @table @kbd @item Pm Principal @item Pa Apar@^{e}ncia @item Pl Ilumina@,{c}@~{a}o @item Po Obscuro @item Pt Ferramentas @item Pc C@^{a}meras @item PC Comandos @item Pf arquivos @item Ps Salvar @item P- ler comandos pelo tty @item PA Cr@'{e}ditos ("about") @end table @item Luzes @table @kbd @item ls mostrar luzes @item le editar luzes @end table @item Espa@,{c}o @table @kbd @item me Euclidiano @item mh Hiperb@'{o}lico @item ms Esf@'{e}rico @end table @item Modelo @table @kbd @item mv Virtual @item mp Projetivo @item mc Conformal @end table @item Outro @table @kbd @item 0N normaliza@,{c}@~{a}o: nenhuma @item 1N normaliza@,{c}@~{a}o: individual @item 2N all normaliza@,{c}@~{a}o: todos @item ui movimento: In@'{e}rcial @item uc movimento: Contra@,{c}@~{a}o para o eixo @item uo movimento: coordenadas pr@'{o}prias do objeto @item < @item Pf carregar arquivo geom@'{e}trico ou de comandos @item dd apagar objeto alvo @item > @item Ps grave o estado atual em um arquivo @item TV mudar para o modo NTSC @item p selecionar como objeto alvo (e.g. @kbd{g 3 p}) Sem preixo, seleciona o objeto sob o cursor do mouse (da mesma forma que duplo-clicando o bot@~{a}o direito do mouse) @end table @end table @comment **************************************************************** @node Formatos dos Arquivos da OOGL, Customizacao, Interacao, Top @chapter Formatos dos Arquivos da OOGL Os objetos que voc@^{e} pode carregar dentro do Geomview s@~{a}o chamados objetos OOGL. OOGL significa ``Object Oriented Graphics Library'' (biblioteca gr@'{a}fica orientada a objetos); @'{e} a biblioteca sobre a qual Geomview @'{e} constru@'{i}do. Existem muitos tipos diferentes de objetos OOGL. Esse cap@'{i}tulo fornece descri@,{c}@~{o}es sint@'{a}ticas de formatos de arquivo para objetos OOGL. Exemplos da maioria dos tipos de arquivo podem ser encontrados no diret@'{o}rio @file{data/geom} do Geomview. @menu * Convencoes:: Conventions and general remarks. * Formatos de Arquivo de Objeto:: Formatos de Arquivo de Objeto. * Objetos nao-geometricos:: Non-geometric objetos. @end menu @comment ================================================================ @node Convencoes, Formatos de Arquivo de Objeto, Formatos dos Arquivos da OOGL, Formatos dos Arquivos da OOGL @section Conven@,{c}@~{o}es @menu * Sintaxe comum:: Sintaxe Comum a Todos os formatos de arquivo da OOGL. * Nomes de arquivos:: Nomes de Arquivo. * Vertices:: V@'{e}rtices. * ND-Vertices:: V@'{e}rtices @var{N}-dimensionais. * Direcoes de superficies normais:: Dire@,{c}@~{a}o de superf@'{i}cies normais. * Matrizes de transformacao:: Matrizes de transforma@,{c}@~{a}o. * Matrizes de transformacao ND:: Matrizes de transforma@,{c}@~{a}o @var{N}-dimensional. * Formato binario:: Formato bin@'{a}rio. * Referencias:: Objetos embargados e refer@^{e}ncias externa a objeto. * Aparencias:: Apar@^{e}ncias. * Mapeamento de Textura:: Mapeamento de textura. @end menu @comment ---------------------------------------------------------------- @node Sintaxe comum, Nomes de arquivos, Convencoes, Convencoes @subsection Sintaxe Comum a Todos os Formatos de Arquivo da OOGL A maioria dos formatos de arquivo de objeto OOGL s@~{a}o do formato livre ASCII --- qualquer quantidade de espa@,{c}os em branco (caracteres n@~{a}o imprim@'{i}veis, tabula@,{c}@~{o}es, caractere de nova linha) pode aparecer entre os sinalizadores (n@'{u}meros, palavras chave, etc.). Paradas de linha s@~{a}o na maioria das vezes sempre insignificantes, com algumas excess@~{o}es devidamente ressaltadas. Coment@'{a}rios come@,{c}am com # e continuam at@'{e} o fim da linha; esses coment@'{a}rios s@~{a}o permitidos em qualquer lugar onde um caractere de nova linha for permitido tamb@'{e}m. Formatos bin@'{a}rios s@~{a}o tamb@'{e}m definidos para muitos objetos; Veja @ref{Formato binario}, e as descri@,{c}@~{o}es individuais do objeto. Objetos t@'{i}picos OOGL come@,{c}am com uma palavra chave designando o tipo de objeto, possivelmente com modificadores indicando a presen@,{c}a de informa@,{c}@~{o}es de cor, etc. Em alguns formatos a palavra chave @'{e} opcional, por quest@~{o}es de compatibilidade com formatos de arquivo definidos em outros lugares. O tipos de objeto @'{e} ent@~{a}o determinado por suposi@,{c}@~{a}o sobre o sufixo do arquivo (se houver) ou pelos dados em si mesmos. Palavras chave s@~{a}o sens@'{i}veis @`{a} caixa alta/baixa. Algumas palavras chave possuem letras de prefixo adicionais indicando a presen@,{c}a de cor ou outros dados; nesse caso a ordem dos prefixos @'{e} importante, e.g. @code{CNMESH} @'{e} significativo mas @code{NCMESH} @'{e} inv@'{a}lido. @comment ---------------------------------------------------------------- @node Nomes de arquivos, Vertices, Sintaxe comum, Convencoes @subsection Nomes de Arquivo Quando objetos OOGL s@~{a}o lidos de arquivos localizados em disco, a biblioteca OOGL usa o sufixo do arquivo para supor o tipo de arquivo. Se o sufixo for desconhecido, ou estiver aus@^{e}nte (e.g. para um objeto sendo lido a partir da sa@'{i}da de um outro comando diretamente, ou lido diretamente de dentro de um outro objeto OOGL), todos os tipos conhecidos de objeto s@~{a}o tentados por sua vez at@'{e} que se aceite os dados como v@'{a}lidos. @comment ---------------------------------------------------------------- @node Vertices, ND-Vertices, Nomes de arquivos, Convencoes @subsection V@'{e}rtices Muitos objetos compartilham um estilo comum de representar v@'{e}rtices com op@,{c}@~{o}es de superf@'{i}cie normal de v@'{e}rtice e cor. Todos os v@'{e}rtices dentro de um objeto possuem o mesmo formato, especificado pela palavra chave no cabe@,{c}alho. Todos os dados para um v@'{e}rtice est@~{a}o agrupados juntos (em oposi@,{c}@~{a}o a e.g. fornecimento de coordenadas para todos os v@'{e}rtices, em seguida cores para todos os v@'{e}rtices, e assim por diante). A sintaxe @'{e} @table @samp @item @var{x} @var{y} @var{z} (coordenadas do v@'{e}rtice tridimensionais em ponto flutuante) ou @item @var{x} @var{y} @var{z} @var{w} (coordenadas do v@'{e}rtice tetradimensionais em ponto flutuante) @end table opcionalmente seguida por @table @samp @item @var{nx} @var{ny} @var{nz} (superf@'{i}cie normalizada tridimensional se presente) @end table opcionalmente seguida por @table @samp @item @var{r} @var{g} @var{}b @var{a} (componente qu@'{a}drupla em ponto flutuante se presente, cada componente no intervalo 0..1. A componente @var{a} (alfa) representa a opacidade: 0 transparente, 1 opaco.) opcionalmente seguida por @item @var{s} @var{t} @item ou @item @var{s} @var{t} @var{u} @end table (duas ou tr@^{e}s valores coordenados de textura). Valores s@~{a}o separados por espa@,{c}os em branco, e quebras de linha s@~{a}o imateriais. Letras na palavra chave de cabe@,{c}alho do objeto devem aparecer numa ordem espec@'{i}fica; isto @'{e} a ordem reversa na qual os dados s@~{a}o fornecidos para cada v@'{e}rtice. Ent@~{a}o v@'{e}rtices de objeto do tipo @samp{CN4OFF} possuem primeiramente as componentes quadridimensionais de posicionamento no espa@,{c}o, a seguir as componentes normais tridimensionais, finalmente as componentes quadridimensionais de cor. Voc@^{e} pode modificar a ordem dos dados modificando o cabe@,{c}alho de palavra chave; um @samp{NCOFF} @'{e} apenas n@~{a}o reconhecido. @comment ---------------------------------------------------------------- @node ND-Vertices, Direcoes de superficies normais, Vertices, Convencoes @subsection V@'{e}rtices @var{N}-dimensionais Muitos objetos compartilham um estilo comum de representa@,{c}@~{a}o de v@'{e}rtice com opcionais de superf@'{i}cie normal e cor. Todos os v@'{e}rtices dentro de um objeto possuem o mesmo formato, especificado pela palavra chave do cabe@,{c}alho. Todos os dados para um v@'{e}rtice est@~{a}o agrupados juntos (em oposi@,{c}@~{a}o a e.g. fornecendo coordenadas para todos os v@'{e}rtices, a seguir cores para todos os v@'{e}rtices, e assim por diante). A sintaxe para v@'{e}rtices @var{N}-dimensionais (@var{N} > 3) @'{e} @table @samp @item @var{x[1]} @var{x[2]} @var{x[3]} @var{x[4]} @dots{} (@var{N} coordenadas do v@'{e}rtice em ponto flutuante) ou @item @var{x[0]} @var{x[1]} @var{x[2]} @var{x[3]} @var{x[4]} @dots{} (@var{(N+1)} coordenadas do v@'{e}rtice em ponto flutuante, se o modificador @code{4} tiver sido especificado na linha de cabe@,{c}alho do objeto) @end table Note, todavia, que objetos @var{N}-dimensionais internamente sempre possuem pontos @var{(N+1)}-dimensionais; a primeira componente @var{x[0]} -- se presente no arquivo do objeto file -- @'{e} usada como divisor homog@^{e}neo. Isso @'{e} diferente do caso tridimensional comum onde o modificador @code{4} gera um objeto quadridimensional onde a componente quadridimensional implicitamente @'{e} escolhida para 1. Componentes de cor usualmente podem ser especificadas da mesma forma que para v@'{e}rtices tridimensionais, Veja @ref{Vertices}, enquanto especificando componentes de cor em normais n@~{a}o faz sentido. @comment ---------------------------------------------------------------- @node Direcoes de superficies normais, Matrizes de transformacao, ND-Vertices, Convencoes @subsection Dire@,{c}@~{o}es de superf@'{i}cies normais Geomview utiliza vetores normais para determinar como um objeto @'{e} compartilhado. A dire@,{c}@~{a}o da normal @'{e} importante nesse c@'{a}lculo. Quando normais forem fornecidos com um objeto, a dire@,{c}@~{a}o da normal @'{e} determinada pelos dados fornecidos. Quando normais n@~{a}o forem fornecidos com o objeto, Geomview calcula vetores normais automaticamente; nesse caso normais apontam para adiante do lado do qual os v@'{e}rtices aparecem na ordem anti-hor@'{a}ria. Sobre superf@'{i}cies param@'{e}tricas (retalhos de Bezier), o vetor normal no ponto P(u,v) est@'{a} na dire@,{c}@~{a}o dP/du multiplicado vetorialmente por dP/dv. @comment ---------------------------------------------------------------- @node Matrizes de transformacao, Matrizes de transformacao ND, Direcoes de superficies normais, Convencoes @subsection Matrizes de transforma@,{c}@~{a}o Alguns objetos incorporam matrizes quadradas reais de ordem 4 para transforma@,{c}@~{o}es sobre objetos homog@^{e}neos. Essas matrizes atuam atrav@'{e}s de multiplica@,{c}@~{a}o @`{a} direita de vetores. Dessa forma, se p for um vetor linha de 4 elementos representando coordenadas homog@^{e}neas de um ponto no objeto OOGL, e A for a matrix 4x4, ent@~{a}o o ponto resultante da transforma@,{c}@~{a}o @'{e} p' = p A. Essa conven@,{c}@~{a}o matricial @'{e} comum em computa@,{c}@~{a}o gr@'{a}fica; @'{e} a matriz transposta daquela muitas vezes usada em matem@'{a}tica, onde pontos s@~{a}o vetores coluna multiplicados @`{a} direita pelas matrizes. Dessa forma para transforma@,{c}@~{o}es Euclideanas, as componentes para transla@,{c}@~{a}o aparecem na quarta linha (os @'{u}ltimos quatro elementos) da matriz A. A @'{u}ltima coluna da matriz A (quarto, oitavo, d@'{e}cimo segundo e d@'{e}cimo sexto elementos) s@~{a}o tipicamente 0, 0, 0, e 1 respectivamente. @comment ---------------------------------------------------------------- @node Matrizes de transformacao ND, Formato binario, Matrizes de transformacao, Convencoes @subsection Matrizes de transforma@,{c}@~{a}o ND No contexto do espa@,{c}o @var{N}-dimensional (@var{N} > 3) alguns objetos incorporam @var{(N+1)}x@var{(N+1)} matrizes reais para transforma@,{c}@~{o}es sobre objetos homog@^{e}neos. Essas matrizes atuam atrav@'{e}s de multiplica@,{c}@~{a}o @`{a} direita de vetores. Dessa forma, se p for um vetor linha de @var{(N+1)}-elementos representando coordenadas homog@^{e}neas de um ponto no objeto OOGL, e A @'{e} a matriz quadrada de ordem @var{(N+1)}, ent@~{a}o o ponto resultante da transforma@,{c}@~{a}o @'{e} p' = p A. Note que (a excess@~{a}o de matrizes de transforma@,{c}@~{a}o 4x4, veja @ref{Matrizes de transformacao}) a componente homog@^{e}nea @'{e} localizada nos elementos com @'{i}ndice @b{zero}, de forma que componentes de transforma@,{c}@~{a}o para transforma@,{c}@~{o}es Euclideanas aparecem na @b{zero}-@'{e}sima linha (primeiros @var{(N+1)} elementos). A primeira coluna da matriz A (a coluna com @'{i}ndice zero) @'{e} tipicamente 1, 0, @dots{}, 0. @comment ---------------------------------------------------------------- @node Formato binario, Referencias, Matrizes de transformacao ND, Convencoes @subsection Formato bin@'{a}rio Muitos objetos OOGL aceitam formatos o formato de arquivo bin@'{a}rio bem como o formato de arquivo ASCII. Esses arquivos come@,{c}am com a indica@,{c}@~{a}o usual (e.g. @code{CQUAD}) seguida pela palavra @code{BINARY}. Dados bin@'{a}rios iniciam-se no byte imediatamente seguinte ao primeiro caractere de nova linha ap@'{o}s a palavra @code{BINARY}. Espa@,{c}os em branco e um simples coment@'{a}rio podem atrapalhar, e.g. @example OFF BINARY # binary-format "OFF" data follows @end example Dados bin@'{a}rios compreendem inteiros de 32 bits e os inteiros em ponto flutuante de 32 bits conforme definido pela IEEE (IEEE Standard for Binary Floating-Point Arithmetic (ANSI/IEEE Std 754-1985 - Institute of Electrical and Electronics Engineers), ambos os formatos seguem @`{a} forma de ordena@,{c}@~{a}o "big-endian" (i.e., com o byte mais significativo em primeiro lugar). Esse @'{e} o formato nativo para tipos de dado int e tipos de dado float em sistemas do tipo Sun-3, Sun-4, e Irises, al@'{e}m de muitos outros sistemas. Formatos de dados bin@'{a}rios assemelham-se aos formatos correspondentes em ASCII, com tipos de dado "int" e tipos de dado "float" nos lugares que voc@^{e} est@'{a} acostumado a encontrar. Existe algumas excess@~{o}es todavia, especificamente dos formatos d arquivo @code{QUAD}, @code{OFF} e @code{COMMENT}. Detalhes s@~{a}o fornecidos no arquivo individual das descri@,{c}@~{o}es do formato espec@'{i}fico. Veja em @ref{QUAD}, @ref{OFF}, e em @xref{COMMENT}. Objetos OOGL bin@'{a}rios podem ser livremente misturados em fluxos de objetos ASCII: @example LIST @{ = MESH BINARY @dots{} dados bin@'{a}rios de uma malha aqui @dots{} @} @{ = QUAD 1 0 0 0 0 1 0 1 0 0 1 0 @} @end example Note que dados ASCII continuam seguindo imediatamente o @'{u}ltimo byte dos dados bin@'{a}rios. Naturalmente, @'{e} imposs@'{i}vel incluir coment@'{a}rios dentro de um objeto em formato bin@'{a}rio OOGL, todavia coment@'{a}rios podem aparecer no cabe@,{c}alho antes do in@'{i}cio dos dados bin@'{a}rios. @comment ---------------------------------------------------------------- @node Referencias, Aparencias, Formato binario, Convencoes @subsection Refer@^{e}ncias a Objetos Embutidos e a Objetos Externos Alguns tipos de objeto OOGL (@code{LIST}, @code{INST}) permitem refer@^{e}ncias a outros objetos OOGL, que podem aparecer literalmente no fluxo de dados, serem chamados a partir de arquivos em disco, ou serem comunicados a partir de outro lugar via objetos nomeados. Comandos GCL tamb@'{e}m aceitam objetos geom@'{e}tricos atrav@'{e}s desses meios citados. A sintaxe gen@'{e}rica @'{e} @example ::= [ "@{" ] [ "define" @code{symbolname} ] [ ["="] @code{object-keyword} @dots{} | "<" @code{filename} | ":" @code{symbolname} ] [ "@}" ] @end example onde os itens entre aspas duplas s@~{a}o sequ@^{e}ncias de caracteres literais (que aparecem sem as aspas), os itens entre colch@^{e}tes ([]) s@~{a}o opcionais, e a barra vertical (|) denota alternativas. Chaves, quando estiverem presentes, apenas indicam coincid@^{e}ncia; o par mais externo de chaves @'{e} geralmente requerido quando o objeto estiver em um contexto maior, e.g. quando for parte de um objeto maior ou inclu@'{i}do em um fluxo de comando do Geomview. Por exemplo, cada uma das tr@^{e}s linhas seguintes: @example @{ define fred QUAD 1 0 0 0 0 1 0 1 0 1 0 0 @} @{ define fred = QUAD 1 0 0 0 0 1 0 1 0 1 0 0 @} @{ appearance @{ +edge @} LIST @{ < "file1" @} @{ : fred @} @} VECT 1 2 0 2 0 0 0 0 1 1 2 @end example @noindent @'{e} um bojeto OOGL v@'{a}lido. O @'{u}ltimo exemplo @'{e} v@'{a}lido somente quando estiver delimitado precisamente e residindo precisamente no seu pr@'{o}prio arquivo em disco. A constru@,{c}@~{a}o com ":" permite refer@^{e}ncia a s@'{i}mbolos, criados com @code{define}. Um valor inicial de um s@'{i}mbolo @'{e} um objeto nulo. Quando um s@'{i}mbolo for (re)definido, todas as refer@^{e}ncias a esse s@'{i}mbolo s@~{a}o automaticamente modificadas. A constru@,{c}@~{a}o "@code{define} NOME" permite definir um simbolo global para um objeto especificado. Se "NOME" referir-se a um objeto que j@'{a} existia anteriormente, ent@~{a}o o antigo objeto @'{e} descartado e substitu@'{i}do pela nova defini@,{c}@~{a}o. Veja @ref{read,@code{(read @dots{})}}. @ref{hdefine,@code{(hdefine @dots{})}}. A constru@,{c}@~{a}o "<" faz com que um arquivo em disco seja lido. Note que isso n@~{a}o @'{e} um mecanismo textual gen@'{e}rico de uso da diretiva de programa@,{c}@~{a}o "include"; um objeto OOGL completo deve aparecer no arquivo referenciado na constru@,{c}@~{a}o "<". Arquivos lidos usando "<" s@~{a}o procurados primeiramente no diret@'{o}rio do arquivo que @'{e} refrenciado em "<", se existir; se essa busca falhar, o caminho normal de busca (veja @ref{load-path, @code{(load-path @dots{})}}) @'{e} usado. A busca padr@~{a}o olha primeiro no diret@'{o}rio atual, a seguir nos diret@'{o}rios de dados do Geomview. Ressaltando, espa@,{c}os em branco e caracteres indicadores de final de linha s@~{a}o insignificantes, e coment@'{a}rios de "#" podem aparecer em qualquer lugar. @comment ---------------------------------------------------------------- @node Aparencias, Mapeamento de Textura, Referencias, Convencoes @subsection Apar@^{e}ncias Objetos geom@'{e}tricos podem ter informa@,{c}@~{o}es de apar@^{e}ncia associada, especificando tonalidade, brilho, cor, visualiza@,{c}@~{a}o wire-frame vs. shaded-surface, e assim por diante. Apar@^{e}ncias s@~{a}o erdadas atrav@'{e}s de hierarqu@'{i}as de objetos, e.g. anexando uma apar@^{e}ncia a uma lista (@code{LIST}) significa que a apar@^{e}ncia @'{e} aplicada a todos os membros de @code{LIST}. Algumas propriedades relacionada a apar@^{e}ncia s@~{a}o relegadas a subestruturas tais como "material", "lighting" e "texture". Seja cuidadoso para notar quais propriedade pertencem a qual estrutura. Qualquer objeto geom@'{e}trico pode ser precedido por uma defini@,{c}@~{a}o de apar@^{e}ncia como no sguinte exemplo: @example @{ appearance @{ +edge @} LIST @{ < "arquivo1" @} @{ QUAD 1 0 0 0 0 1 0 1 0 1 0 0 @} @} @end example Apar@^{e}ncias s@~{a}o tamb@'{e}m objetos OOGL no seu pr@'{o}prio direito e pode ser fornecido nomes simb@'{o}licos e refer@^{e}ncia a elas. Veja (@ref{Referencias}) e em @ref{Objetos de aparencia, Objetos de apar@^{e}ncia}. @table @b @item Texture Mapping Existe uma se@,{c}@~{a}o separada com rela@,{c}@~{a}o a defini@,{c}@~{a}o de texturas: (@ref{Mapeamento de Textura}). @item Transparency Objetos de renderiza@,{c}@~{a}o transl@'{u}cida n@~{a}o s@~{a}o suportados por todos os desenhadores que funcionam no Geomview. O renderizador OpenGL tem suporte limitado para isso: objetos de n@'{i}vel mais alto (i.e. aqueles que aparecem no navegador de objetos do painel principal (veja @ref{Interacao Basica, O Painel Principal}) s@~{a}o renderizados corretamente por meio de alpha-blending). Tamb@'{e}m, os instant@^{a}neos do RenderMan ir@~{a}o incluir valores de opacidade. @end table Aqui est@'{a} um exemplo de estrutura de apar@^{e}ncia incluindo valores para todos atributos. A ordem dos atributos n@~{a}o @'{e} importante. Como usual, espa@,{c}os em branco ss@~{a}o irrelevates. Atributos Booleanos podem ser precedidos por "+" ou "-" para torn@'{a}-los habilitados ou desabilitados; "+" @'{e} assumido se somente o nome do atributo aparecer. Outros valores esperados de atributo. Um "*" prefixado a um atributo, e.g. "*+edge" ou "*linewidth 2" ou "material @{ *diffuse 1 1 .25 @}", seleciona a situa@,{c}@~{a}o atual para sobrescrever ("override") para aquele atributo. @example appearance @{ +face # (Faz) desenho de faces dos pol@'{i}gonos. Habili- # tado por padr@~{a}o. -edge # (N@~{a}o faz) desenho de arestas de pol@'{i}gonos. +vect # (Faz) desenho de vetores (VECTs). Habilitado # por padr@~{a}o. transparent screendoor # (Habilita) transpar@^{e}ncia. Habilita@,{c}@~{a}o de # transpar@^{e}ncia. # n@~{a}o (necessariamente) resulta em cores corretas # no Geomview, mas os valores de alfa s@~{a}o usados # em instant@^{a}neos RenderMan. # As palavras chave permitidas s@~{a}o ``screendoor'' # (mascarando pixels de sa@'{i}da por meio de um # modelo de ponteamento), ``blending'' para # alpha-blending ( harmoniza@,{c}@~{a}o de alfa) # com BSP-tree (@'{a}rvore BSP) particionando o # espa@,{c}o e ordenando com precis@~{a}o # (lento) e ``naive'' para harmoniza@,{c}@~{a}o de # alfa sem mesmo ordenar com precis@~{a}o, n@~{a}o # para falar sobre particionamento de espa@,{c}o. # Omitindo a palavra chave o padr@~{a}o ser@'{a} # harmoniza@,{c}@~{a}o de alfa com @'{a}rvore # particionando o espa@,{c}o e ordenando com # precis@~{a}o. -normal # (Faz) desenho de vetores normais a uma # superf@'{i}cie. normscale 1 # @dots{} com comprimento 1.0 em coordenadas do # objeto. +evert # faz a invers@~{a}o de normais de pol@'{i}gono onde # necess@'{a}rio de forma que sempre tenha # c@^{a}mera naquela face +texturing # (Habilita) mapeamento de textura +linear # (Habilita) m@'{e}dia linear de elementos de textura # mais fechados +mipmap # (Habilita) mapeamento mip de textura +mipinterp # (Habilita) mapeamento mip linear -backcull # (N@~{a}o faz) descarte da orienta@,{c}@~{a}o de faces # no sentido anti-hor@'{a}rio -concave # (N@~{a}o faz) presun@,{c}@~{a}o e manuseio de pol@'{i}- # gonos c@^{o}ncavos -shadelines # (N@~{a}o faz) linhas de tonalidade como se elas esti- # vessem iluminando cilindros # Esses quatro (mipinterp, backcull, concave, # shadelines) s@~{a}o somente efetivos onde o # sistema gr@'{a}fico suport@'{a}-los, a saber em GL e # Open GL. -keepcolor # Normalmente, quando informa@,{c}@~{a}o de cor N-D posi- # cional est@'{a} habilitada como # com o comando do geomview (ND-color ...), todas # as cores de objetos s@~{a}o afetadas. Mas, objetos # com o atributo "+keepcolor" s@~{a}o imunes a infor- # ma@,{c}@~{o}es de cor N-D. shading smooth # ou ``shading constant'' ou ``shading flat'' ou # ou ``shading csmooth'' ou ``shading vcflat''. # smooth = tonalidade de Gouraud, flat = facetado, # csmooth = linearmente interpolado mas n@~{a}o # iluminado, vcflat = tonalidade mon@'{o}tona, mas # cores linearmente interpoladas. linewidth 1 # linhas, pontos, e arestas s@~{a}o da largura de # 1 pixel. patchdice 10 10 # subdivide retalhos de Bezier esmiu@,{c}adamente em # u e v material @{ # Aqui est@'{a} uma defini@,{c}@~{a}o material; # pode tamb@'{e}m ser lido de um arquivo como em # ``material < arquivo.mat'' ka 1.0 # coeficiente de reflex@~{a}o ambiente. ambient .3 .5 .3 # cor do ambiente (em componentes de vermelho, # verde, azul). A contribui@,{c}@~{a}o ambiente para a to- # nalidade @'{e} o produto de ka, a cor do ambiente, # pela cor da luz ambiente. kd 0.8 # coeficiente de reflex@~{a}o difusa. diffuse .9 1 .4 # cor difusa. # (No modo ``shading constant'' (tonalidade # constante), a superf@'{i}cie # @'{e} colorida com a cor difusa.) ks 1.0 # coeficiente de reflex@~{a}o especular. specular 1 1 1 # cor especular (destacada). shininess 25 # expoente especular; grandes valores fornecem # destaques falsos. backdiffuse .7 .5 0 # cor da face de tr@'{a}s para superf@'{i}cies com # dois lados. Se definido, esse campo determina # a cor difusa para o lado de tr@'{a}s de uma super- # f@'{i}cie. @'{E} implementada atrav@'{e}s de tonalidade # via software, e por tonalidade via hardware # sob sistemas GL que suportam ilumina@,{c}@~{a}o de # dois lados, e sob Open GL. alpha 1.0 # opacidade; 0 = transparente (invis@'{i}vel), # 1 = opaco. Ignorado quando a transpar@^{e}ncia # estiver desabilitada. edgecolor 1 1 0 # cor de linha & aresta normalcolor 0 0 0 # cor para vetores normais a uma superf@'{i}cie @} lighting @{ # Modelo de ilumina@,{c}@~{a}o ambient .3 .3 .3 # luz ambiente replacelights # ``Use somente as seguintes luzes para # iluminar os objetos sob essa # apar@^{e}ncia.'' # Sem "replacelights" (substitui@,{c}@~{a}o de luzes), # quaisquer luzes listadas s@~{a}o adicionadas # a esses na cena. # Agora uma cole@,{c}@~{a}o exemplo de luzes: light @{ color 1 .7 .6 # cor da luz position 1 0 .5 0 # posi@,{c}@~{a}o da luz [distant light] # fornecida em coordenadas homog@^{e}neas. # Com a quarta componente = 0, # isso significa uma luz vindo da # dire@,{c}@~{a}o (1,0,.5). @} light @{ # Outra luz. color 1 1 1 position 0 0 .5 1 # luz na posi@,{c}@~{a}o finita @dots{} location camera # especificada em coordenadas de c@^{a}mera. # (Uma vez que a c@^{a}mera olha adiante -Z, # esse exemplo coloca a luz # .5 unidade atr@'{a}s do olho.) # Poss@'{i}vel palavra chave de localiza@,{c}@~{a}o ("location"): # global posi@,{c}@~{a}o da luz global em coordenadas de objeto mundo # (bem, universo). Esse @'{e} o padr@~{a}o se nenhuma # localiza@,{c}@~{a}o for especificada. # camera posi@,{c}@~{a}o da c@^{a}mera em coordenadas do sistemade # c@^{a}mera # local posi@,{c}@~{a}o local em coordenadas do sistema onde # a apar@^{e}ncia foi definida @} @} # fim do modelo de ilumina@,{c}@~{a}o texture @{ clamp st # ou ``s'' ou ``t'' ou ``none'' file lump.tiff # arquivo fornecendo imagem de mapa de # textura alphafile mask.pgm.Z # arquivo fornecendo imagem de m@'{a}scara # de transpar@^{e}ncia apply blend # ou ``modulate'' ou ``decal'' transform 1 0 0 0 # superf@'{i}cie (s,t,0,1) * tfm -> coor- 0 1 0 0 # denadas de textura 0 0 1 0 .5 0 0 1 background 1 0 0 1 # relevante para ``apply blend'' @} @} # fim de apar@^{e}ncia @end example Existem regras para heran@,{c}a de atributos de apar@^{e}ncia quando muitas apar@^{e}ncia s@~{a}o impostas em diferentes n@'{i}veis na hierarqu@'{i}a. Por exemplo, Geomview instala uma apar@^{e}ncia de parada de seguran@,{c}a que fornece valores padr@~{a}o para a maioria dos par@^{a}metros; seu painel de controle instala outras apar@^{e}ncias que fornecem novos valores para uns poucos atributos; a geometria fornecida pelo usu@'{a}rio pode tamb@'{e}m conter apar@^{e}ncias. A regra geral @'{e} que a apar@^{e}ncia dos filhos (aquelas fechadas para as primitivas geom@'{e}tricas) vencem. Adicionalmente, controles de apar@^{e}ncia com situa@,{c}@~{a}o atual em sobrescrever ("override") (e.g. @code{*+face ou material @{ *diffuse 1 1 0 @}}) vencem sobre as outras que estiverem sem o atributo de sobrescrever. Os controles de apar@^{e}ncia do Geomview usam o recurso de sobrescrever "override" de forma a ser efetivo mesmo se objetos fornecidos pelo usu@'{a}rio contiverem suas pr@'{o}prias escolhas de apar@^{e}ncia. Todavia, Se um objeto fornecido pelo usu@'{a}rio contiver um campo de apar@^{e}ncia com o recurso de sobrescrever ativado, esse campo de apar@^{e}ncia ser@'{a} imune aos controles do Geomview. @comment ---------------------------------------------------------------- @node Mapeamento de Textura, , Aparencias, Convencoes @subsection Mapeamento de Textura Alguns programas que trabalham sem contato direto com o usu@'{a}rio suportam objetos mapeados em textura, atualmente apenas o OpenGL e a interface RenderMan no momento dessa escrita. Existe tamb@'{e}m alguns recursos com a interface RMan quando em uso um canal alfa na imagem de textura. Aqueles programas que n@~{a}o trabalham diretamente com o usu@'{a}rio cujo suporte a textura n@~{a}o existe silenciosamente ignoram tentativas de uso de mapeamento de textura. Uma textura @'{e} especificada como parte de uma estrutura de apar@^{e}ncia (Veja @ref{Aparencias}). Resumidamente, se fornece uma imagem de textura (Veja tamb@'{e}m @ref{image, Objetos de imagem}), a qual @'{e} considerada contida em um quadrado no espa@,{c}o parametrizado @code{(s,t)} no intervalo 0 <= s <= 1, 0 <= t <= 1. Ent@~{a}o se fornece uma primitiva geom@'{e}trica, com cada v@'{e}rtice acompanhado com as coordenadas de textura @code{(s,t)}. Se a texturiza@,{c}@~{a}o estiver habilitada, a por@,{c}@~{a}o apropriada da imagem de textura @'{e} colada sobre cada face do objeto texturizado. N@~{a}o existe (atualmente) nenhuma provis@~{a}o para heran@,{c}a de parte de uma estrutura de textura; se a palavra chave @code{texture} @'{e} mencionada em uma apar@^{e}ncia, essa mens@~{a}o suplanta qualquer outra especifica@,{c}@~{a}o de textura. O atributo de apar@^{e}ncia @code{texturing} controla se texturas s@~{a}o usadas; n@~{a}o existe perda de performace tendo campos "texture @{ @dots{} @}" definidos quando a utiliza@,{c}@~{a}o de texturas est@'{a} desabilitada. Os campos de textura dispon@'{i}veis s@~{a}o: @example clamp none -ou- s -ou- t -ou- st Determina o significado de coordenadas de textura fora do intervalo 0..1. Com @code{clamp none}, o padr@~{a}o, coordenadas s@~{a}o interpretadas modulo 1, ent@~{a}o (s,t) = (1.25,0), (.25,0), e (-.75,0) referem-se todos ao mesmo ponto no espa@,{c}o das texturas. Com @code{clamp s} ou @code{clamp t} ou @code{clamp st}, individualmente ou ambos de s-coordenadas ou t-coordenadas menor que 0 ou maior que 1 s@~{a}o remapeadas para 1 ou para 0, respectivamente. image @{ (@ref{image, Objetos de imagem}) @} Especifica a atual imagem de textura. Imagens de textura podem ter 1, 2, 3 ou 4 canais: 1 canal: lumin@^{a}ncia 2 canais: lumin@^{a}ncia e alfa (opcidade:0 transparente, 1 opaco) 3 canais: dados RGB 4 canais: dados RGBA Veja @ref{image, Objetos de imagem}, para a defini@,{c}@~{a}o atual de objetos de imagem. O canal usado por alfa @'{e} somente interpretado como m@'{a}scara: onde a m@'{a}cara @'{e} zero, pixels s@~{a}o simplesmente omitidos. Uma exce@,{c}@~{a}o @'{e} o caso onde @emph{apply} @'{e} igual a @emph{modulate} e a transluc@^{e}ncia est@'{a} habilitada: nesse caso o valor de alfa resultante @'{e} o resultado da multiplica@,{c}@~{a}o da cor da superf@'{i}cie pelo valor de alfa do canal alfa da textura. file nomearquivo alphafile nomearquivo @emph{Isso @'{e} considerado obsoleto, e somente mantido por compatibilidade, o moderno caminho @'{e} usar o novo objeto imagem OOGL. Veja @ref{image, Objetos de imagem}. O material documentado aqui pode ainda funcionar apesar disso} Especifica arquivos de imagem contendo a textura. A palavra chave @emph{file} especifica um arquivo com informa@,{c}@~{o}es de cor ou de brilho; @emph{alphafile} se presente, especifica uma m@'{a}scara de transpar@^{e}ncia ("alpha"); onde a m@'{a}scara for zero, pixels simplesmente s@~{a}o omitidos. Muitos formatos de arquivo de imagem est@~{a}o dispon@'{i}veis; o tipo de arquivo deve ser indicado pelos @'{u}ltmos poucos caracteres do nome do arquivo: .ppm ou .ppm.Z ou .ppm.gz 24-bit 3-color imagem no formato PPM .pgm ou .pgm.Z ou .pgm.gz 8-bit tons de cinza imagem no formato PGM .sgi ou .sgi.Z ou .sgi.gz 8-bit, 24-bit, ou 32-bit imagem SGI .tiff 8-bit ou 24-bit imagem TIFF .gif imagem GIF Para esse recurso trabalhar, alguns programas devem estar dispon@'{i}veis no caminho de busca do Geomview: zcat para arquivo .Z gzip para arquivos .gz tifftopnm para arquivos .tiff giftoppm para arquivos .gif Se uma imagem @code{alphafile} for fornecida, essa imagem deve ser do mesmo tamanho que a imagem @code{file}. @emph{Objetos imagem fornecem um caminho mais flex@'{i}vel para especificar dados de textura. Veja @ref{image, Objetos de imagem}.} apply modulate -ou- blend -ou- decal Indica como a imagem de textura @'{e} aplicada @`{a} superf@'{i}cie. Aqui a "surface color" (cor da superf@'{i}cie) significa a cor que a superf@'{i}cie pode ter na aus@^{e}ncia de mapeamento de textura. Com @code{modulate}, o padr@~{a}o, a cor de textura (ou ilumina@,{c}@~{a}o, se texturizado por meio de uma imagem de escala de cinza) @'{e} multiplicada pela cor da superf@'{i}cie. Com @code{blend}, textura harmoniza-se entre cor de fundo (@code{background}) e a cor da superf@'{i}cie. O par@^{a}metro @code{file} deve especificar uma imagem de escala de cinza. Onde a imagem de textura @'{e} 0, a cor da superf@'{i}cie permanece inalterada; onde for 1, a superf@'{i}cie @'{e} colorida na cor dada por @code{background}; e cor @'{e} interpolada para valores imediatos. Com @code{decal}, o par@^{a}metro @code{file} deve especificar uma imagem de tres cores. Se um par@^{a}metro @code{alphafile} estiver presente, seus valores interpolam-se entre a cor da superf@'{i}cie (onde alpha=0) e a cor de textura (onde alpha=1). Ilumina@,{c}@~{a}o n@~{a}o afeta a cor de textura no modo @code{decal}; efetivamente a textura @'{e} tonalidademente constante. background R G B A Especifica uma cor com 4 componentes, com n@'{u}meros R, G, B, e A em ponto flutuante normalmente no intervalo 0..1, usados quando @code{apply blend} for selecionado. transform @code{matriz-de-transforma@,{c}@~{a}o} Espera uma lista de 16 n@'{u}meros, ou um dos outros caminhos de representar uma transforma@,{c}@~{a}o (@code{: nomecabe@,{c}alho} ou @code{< nomearquivo}). A matriz 4x4 de transforma@,{c}@~{a}o @'{e} aplicada a coordenadas de textura, no sentido de um vetor linha de 4 componentes (s,t,0,1) multiplicado @`{a} esquerda pela matriz, para produzir novas coordenadas (s',t') @`{a}s quais atualmente indexam a textura. @end example @comment ================================================================ @node Formatos de Arquivo de Objeto, Objetos nao-geometricos, Convencoes, Formatos dos Arquivos da OOGL @section Formatos de Arquivo de Objeto @menu * QUAD:: Lista de quadril@'{a}teros. * MESH:: Grade retangular associada. * BBOX:: Caixa associada simples. * BBP and BEZ:: Lista retalhos de superf@'{i}cies de belzier. * OFF:: Poliedros: pol@'{i}gonos com v@'{e}rtices compartilhados. * VECT:: Lista de pontos e linhas. * SKEL:: Lista de pontos e linhas, com v@'{e}rtices compartilhados. * SPHERE:: Esfera * INST:: Ins@^{a}ncia transformada de outro objeto. * LIST:: Lista de outros objetos. * TLIST:: Cole@,{c}@~{a}o de matrizes de transforma@,{c}@~{a}o 4x4. * GROUP:: Formato obsoleto para cole@,{c}@~{a}o de objetos. * DISCGRP:: Grupo deiscreto de objetos. * COMMENT:: Objeto coment@'{a}rio, para informa@,{c}@~{o}es n@~{a}o exibidas. @end menu @comment ---------------------------------------------------------------- @node QUAD, MESH, Formatos de Arquivo de Objeto, Formatos de Arquivo de Objeto @subsection QUAD: cole@,{c}@~{a}o de quadril@'{a}teros O sufixo convencional para um arquivo @code{QUAD} @'{e} @file{.quad}. A sintaxe do arquivo @'{e} @example [C][N][4]QUAD -ou- [C][N][4]POLY # Palavra chave @var{v@'{e}rtice} @var{v@'{e}rtice} @var{v@'{e}rtice} @var{v@'{e}rtice} # v@'{e}rtices 4-D para algum N @var{v@'{e}rtice} @var{v@'{e}rtice} @var{v@'{e}rtice} @var{v@'{e}rtice} @dots{} @end example A palavra chave inicial @'{e} @code{[C][N][4]QUAD} ou @code{[C][N][4]POLY}, onde o prefixos opcionais @code{C} e @code{N} indicam que cada v@'{e}rtice inclui cores e retas normais respectivamente. Isto @'{e}, esses arquivos iniciam-se com uma das palavras @code{QUAD} @code{CQUAD} @code{NQUAD} @code{CNQUAD} @code{POLY} @code{CPOLY} @code{NPOLY} @code{CNPOLY} (mas n@~{a}o com @code{NCQUAD} ou @code{NCPOLY}). @code{QUAD} e @code{POLY} s@~{a}o sin@^{o}nimos; ambas as formas s@~{a}o permitidas apenas por compatibilidade com ChapReyes. Seguindo a palavra chave est@'{a} um n@'{u}mero arbitr@'{a}rio de grupos de quatro v@'{e}rtices, cada grupo descrevendo um quadril@'{a}tero. Veja a sintaxe de v@'{e}rtice acima. O objeto termina no caractere de fim de arquivo, ou com uma chave fechada se incorporado dentro de uma refer@^{e}ncia de objeto (veja acima). Um formato de arquivo @code{QUAD BINARY} @'{e} aceito; veja @ref{Formato binario}. A primeira palavra de dados bin@'{a}rios deve ser um inteiro de 32 bits fornecendo o n@'{u}mero de quads no objeto; seguindo esse inteiro encontra-se uma s@'{e}rie de inteiros em ponto flutuante de 32 bits, arranjados apenas como no formato ASCII. @comment ---------------------------------------------------------------- @node MESH, BBOX, QUAD, Formatos de Arquivo de Objeto @subsection MESH: Malha retangularmente conectada O sufixo convencional para um arquivo @code{MESH} @'{e} @file{.mesh}. A sintaxe do arquivo @'{e} @example [U][C][N][Z][4][u][v][n]MESH # Palavra chave [@var{Ndim}] # Dimens@~{a}o do espa@,{c}o, presente # somente se nMESH @var{Nu} @var{Nv} # dimens@~{o}es da grade da malha # @var{Nu}*@var{Nv} v@'{e}rtices, no formato especificado # pela palavra chave inicial @var{v@'{e}rtice}(u=0,v=0) @var{v@'{e}rtice}(1,0) @dots{} @var{v@'{e}rtice}(@var{Nu}-1,0) @var{v@'{e}rtice}(0,1) @dots{} @var{v@'{e}rtice}(@var{Nu}-1,1) @dots{} @var{v@'{e}rtice}(0,@var{Nv}-1) @dots{} @var{v@'{e}rtice}(@var{Nu}-1,@var{Nv}-1) @end example A palavra chave @'{e} @code{[U][C][N][Z][4][u][v][n]MESH}. Os caracteres opcionais prefixados significam: @table @samp @item U Cada v@'{e}rtice inclue uma textura de 3 par@^{a}metros de espa@,{c}o de componente. As primeiras duas componentes s@~{a}o par@^{a}metros usuais de textura @code{S} e @code{T} para quele v@'{e}rtice; o terceiro pode ser especificado como zero. @item C Cada v@'{e}rtice (veja Vertices acima) inclui uma cor de quatro componentes. @item N Cada v@'{e}rtice inclui um vetor normal @`{a} superf@'{i}cie. @item Z Dos valores dos 3 eixos coordenados (x , y e z) de v@'{e}rtice somente a componente Z est@'{a} presente; X e Y s@~{a}o omitidos, e assumidos ambos como sendo iguais @`{a}s coordenadas de malha (u,v) de forma que X varia de 0 .. (Nu-1), Y varia de 0 .. (Nv-1) onde Nu e Nv s@~{a}o as dimenss@~{o}es de malha -- veja acima. @item 4 V@'{e}rtices s@~{a}o quadridimensionais, cada v@'{e}rtice consiste em 4 valores em ponto flutuante. @code{Z} e @code{4} n@~{a}o podem ambos estarem presentes ao mesmo tempo. @item u A malha @'{e} ajustada na dire@,{c}@~{a}o u, de forma que o (0,v)'@'{e}simo v@'{e}rtice est@'{a} conectado ao (@var{Nu}-1,v)'@'{e}simo para todo v. @item v A malha @'{e} ajustada na dire@,{c}@~{a}o v, de forma que o (u,0)'´esimo v@'{e}rtice est@'{a} conectado ao (u,@var{Nv}-1)'@'{e}simo para todo u. Dessa forma uma malha u-ajustada ou v-ajustada @'{e} topologicamente um cilindro, enquanto uma malha uv-ajustada @'{e} um toro. @item n Especifica uma malha cujos v@'{e}rtices existem em um espa@,{c}o de dimens@~{a}o mais alta. A dimens@~{a}o segue a palavra chave "MESH". Cada v@'{e}rtice ent@~{a}o tem @var{Ndim} componentes. @end table Note que a ordem dos caracteres do prefixo @'{e} significativa; uma malha colorida, u-ajustada @'{e} uma @code{CuMESH} n@~{a}o uma @code{uCMESH}. Seguindo o cabe@,{c}alho da malha est@~{a}o os inteiros @var{Nu} e @var{Nv}, as simens@~{o}es da malha. Ent@~{a}o segue-se @var{Nu}*@var{Nv} v@'{e}rtices, cada um desses v@'{e}rtices na forma fornecida atrav@'{e}s do cabe@,{c}alho. Eles aparecem na sequ@^{e}ncia v-crescente, i.e. se chamarmos cada v@'{e}rtice de (u,v) ent@~{a}o os v@'{e}rtices aparecer@~{a}o na ordem @example (0,0) (1,0) (2,0) (3,0) @dots{} (@var{Nu}-1,0) (0,1) (1,1) (2,1) (3,1) @dots{} (@var{Nu}-1,1) @dots{} (0,Nv-1) @dots{} (@var{Nu}-1,@var{Nv}-1) @end example O formato @code{MESH BINARY} @'{e} aceito; Veja @ref{Formato binario}. Os valores de @var{Nu} e @var{Nv} s@~{a}o inteiros de 32-bit; todos os outros valores s@~{a}o n@'{u}meros em ponto flutuante de 32-bit. @comment ---------------------------------------------------------------- @node BBOX, BBP and BEZ, MESH, Formatos de Arquivo de Objeto @subsection BBOX: Caixas associada simples Esse @'{e} um objeto-brinquedo muito simples: Toma 2 v@'{e}rtices e desenha um (hiper-) cubo que @'{e} a caixa associada dos dois v@'{e}rtices. Sintaxe: @example BBOX @var{x}[0] @var{y}[0] @var{z}[0] @var{x}[1] @var{y}[1] @var{z}[1] @end example ou @example 4BBOX @var{x}[0] @var{y}[0] @var{z}[0] @var{w}[0] @var{x}[1] @var{y}[1] @var{z}[1] @var{w}[1] @end example ou @example nBBOX @var{Ndim} # > 3 @var{x}[0] @var{y}[0] @var{z}[0] @var{w}[0] @dots{} @var{x}[1] @var{y}[1] @var{z}[1] @var{w}[1] @dots{} @end example ou @example 4nBBOX @var{Ndim} # > 3 @var{d}[0] @var{x}[0] @var{y}[0] @var{z}[0] @var{w}[0] @dots{} @var{d}[0] @var{x}[1] @var{y}[1] @var{z}[1] @var{w}[1] @dots{} @end example N@~{a}o existe formato bin@'{a}rio BBOX. O modificador @code{4} tem diferentes significados dependendo da dimens@~{a}o da caixa associada: @code{4BBOX} significa que as 4 componentes dos v@'{e}rtices constroem uma caixa associada tetradimensional. Usando @code{4} em conjun@,{c}@~{a}o com @code{n} -- @code{4nBBOX @var{NDim}} -- significa que os v@'{e}rtices especificados no arquivo possuem @var{NDim+1} componentes, mas a componente no @'{i}ndice 0 @'{e} o divisor homog@^{e}neo (em oposi@,{c}@~{a}o ao caso comum tridimensional onde o divisor homog@^{e}neo pode ser @code{w} -- a terceira -- componente). @comment ---------------------------------------------------------------- @node BBP and BEZ, OFF, BBOX, Formatos de Arquivo de Objeto @subsection Superf@'{i}cies de Bezier O sufixo de arquivo convencional para arquivos de superf@'{i}cie de Bezier @'{e} @file{.bbp} ou @file{.bez}. O arquivo com qualquer dos dois sufixos pode conter qualquer dos dois tipos de parte de superf@'{i}cie de Bezier. Sintaxe: @example [ST]BBP -ou- [C]BEZ<@var{Nu}><@var{Nv}><@var{Nd}>[_ST] # @var{Nu}, @var{Nv} s@~{a}o dire@,{c}@~{o}es nos eixos u e v # graus de polin@^{o}mios variam 1..6 # @var{Nd} = dimens@~{a}o: 3->3-D, 4->4-D (racional) # (O sinal '<' e o sinal '>' n@~{a}o aparecem na entrada.) # @var{Nu},@var{Nv},@var{Nd} s@~{a}o cada um d@'{i}gito decimal simples. # a forma BBP implica @var{Nu}=@var{Nv}=@var{Nd}=3 de forma que BBP = BEZ333. # Qualquer n@'{u}mero de partes de superf@'{i}cie de Bezier segue o cabe@,{c}alho # (@var{Nu}+1)*(@var{Nv}+1) pontos de controle do peda@,{c}o da sperf@'{i}cie de Bezier # cada 3 ou 4 n@'{u}meros em ponto flutuante conforme o cabe@,{c}alho @var{vertex}(u=0,v=0) @var{vertex}(1,0) @dots{} @var{vertex}(@var{Nu},0) @var{vertex}(0,1) @dots{} @var{vertex}(@var{Nu},1) @dots{} @var{vertex}(0,@var{Nv}) @dots{} @var{vertex}(@var{Nu},@var{Nv}) # coordenadas de textura ST se mencionado no cabe@,{c}alho @code{S}(u=0,v=0) @code{T}(0,0) @code{S}(0,@var{Nv}) @code{T}(0,@var{Nv}) @code{S}(@var{Nu},0) @code{T}(@var{Nu},0) @code{S}(@var{Nu},@var{Nv}) @code{T}(@var{Nu},@var{Nv}) # n@'{u}mero em ponto flutuante com 4 componentes no intervalo (0..1) de # cores R G B A para cada canto se mencionado no cabe@,{c}alho @code{RGBA}(0,0) @code{RGBA}(0,@var{Nv}) @code{RGBA}(@var{Nu},0) @code{RGBA}(@var{Nu},@var{Nv}) @end example Esses formatos representam cole@,{c}@~{o}es de partes de superf@'{i}cies de Bezier, de graus maiores que 6, e com v@'{e}rtices 3-D ou 4-D (racionais). A palavra chave de cabe@,{c}alho pode assumir as formas @code{[ST]BBP} ou @code{[C]BEZ<@var{Nu}><@var{Nv}><@var{Nd}>[_ST]} (os s@'{i}mbolos '<' e '>' n@~{a}o s@~{a}o parte da palara chave. O prefixo @code{ST} sobre @code{BBP}, ou o sufixo @code{_ST} sobre @code{BEZuvn}, indicam que cada peda@,{c}o de superf@'{i}cie inclui quatro pares de pontos com coordenadas em ponto flutuante no espa@,{c}o de textura, um em cada canto do peda@,{c}o. O prefixo @code{C} sobre @code{BEZuvn} indica um peda@,{c}o colorido, incluindo quatro conjuntos de quatro componentes com os n@'{u}meros que especificam as cores em ponto flutuante (vermelho, verde, azul, e alfa) no intervalo 0..1, uma cor para cada canto. @var{Nu} e @var{Nv}, cada um @'{e} um simples d@'{i}gito no intervalo 1..6, s@~{a}o os graus do polin@^{o}mio do peda@,{c}o nas dire@,{c}@~{o}es u e v respectivamente. @var{Nd} @'{e} o n@'{u}mero de componentes no v@'{e}rtice de cada peda@,{c}o, e deve ser ou @code{3} para 3-D ou @code{4} para coordenadas homog@^{e}neas, isto @'{e}, peda@,{c}os racionais. Peda@,{c}os @code{BBP} s@~{a}o peda@,{c}os bic@'{u}bicos com v@'{e}rtices tridimensionais, de forma que @code{BBP} = @code{BEZ333} e @code{STBBP} = @code{BEZ333_ST}. Qualquer n@'{u}mero de peda@,{c}os segue o cabe@,{c}alho. Cada peda@,{c}o compreende uma s@'{e}rie de v@'{e}rtices do peda@,{c}o, seguido por coordenadas opcionais de textura (s,t), seguidas por cores opcionais no formato (r,g,b,a). Cada peda@,{c}o tem (@var{Nu}+1)*(@var{Nv}+1) v@'{e}rtices na ordem v-crescente, de forma que se designarmos um v@'{e}rtice atrav@'{e}s de seus @'{i}ndices (u, v) de controle de ponto a ordem @'{e} @example (0,0) (1,0) (2,0) @dots{} (@var{Nu},0) (0,1) (1,1) (2,1) @dots{} (@var{Nu},1) @dots{} (0,@var{Nv}) @dots{} (@var{Nu},@var{Nv}) @end example @noindent com cada v@'{e}rtice contendo ou 3 ou 4 n@'{u}meros em ponto flutuantes como especificado pelo cabe@,{c}alho. Se o cabe@,{c}alho chama por coordenadas ST, quatro pares de n@'{u}meros em ponto flutuante seguem: o espa@,{c}o de coordenadas de textura para (0,0), (@var{Nu},0), (0,@var{Nv}), e os cantos (@var{Nu},@var{Nv}) do peda@,{c}o, respectivamente. Se o cabe@,{c}alho chama por cores, segue quatro grupos de quatro componentes (vermelho, verde, azul, alfa) d cores em ponto flutuante, um para cada canto do peda@,{c}o. A s@'{e}rie de peda@,{c}os termina em um caractere de fim de arquivo, ou com uma chave fechada se incorporado em uma refer@^{e}ncia de objeto. @comment ---------------------------------------------------------------- @node OFF, VECT, BBP and BEZ, Formatos de Arquivo de Objeto @subsection Arquivos do Tipo OFF O sufixo convencional para arquivos @code{OFF} @'{e} @file{.off}. Sintaxe: @example [ST][C][N][4][n]OFF # Palavra chave do cabe@,{c}alho [@var{Ndim}] # Dimens@~{a}o do espa@,{c}o dos v@'{e}rtices, presente somente se nOFF # estiver tamb@'{e}m presente @var{NV@'{e}rtices} @var{NFaces} @var{NArestas} # NArestas n@~{a}o @'{e} usado nem checado @var{x}[0] @var{y}[0] @var{z}[0] # V@'{e}rtices, possivelmente com normais, # cores, e/ou coordenadas de textura, nessa ordem, # se os prefixo @code{N}, @code{C}, @code{ST} # estiverem presentes. # Se 4OFF, cada v@'{e}rtice possui 4 componentes, # incluindo uma componente final homog@^{e}nea. # Se nOFF, cada v@'{e}rtice possui @var{Ndim} componentes. # Se 4nOFF, cada v@'{e}rtice possui @var{Ndim}+1 componentes. @dots{} @var{x}[@var{NV@'{e}rtices}-1] @var{y}[@var{NV@'{e}rtices}-1] @var{z}[@var{NV@'{e}rtices}-1] # Faces # @var{Nv} = # v@'{e}rtices na referida face # @var{v}[0] @dots{} @var{v}[@var{Nv}-1]: @'{i}ndices dos v@'{e}rtices # no intervalo 0..@var{NV@'{e}rtices}-1 @var{Nv} @var{v}[0] @var{v}[1] @dots{} @var{v}[@var{Nv}-1] @var{colorspec} @dots{} # @var{colorspec} colar cont@'{i}nuo @var{v}[@var{Nv}-1] # at@'{e} o aparecer um caractere de fim de linha; pode ser de 0 a 4 # n@'{u}meros # nenhum: padr@~{a}o # inteiro: @'{i}ndice do mapa de cores # 3 ou 4 inteiros: valores RGB[A] no intervalo 0..255 # 3 ou 4 n@'{u}meros em ponto flutuante: valores RGB[A] no intervalo 0..1 @end example Arquivos @code{OFF} (nome para "object file format" formato de arquivo de objeto) representa cole@,{c}@~{o}es de pol@'{i}gonos planos com v@'{e}rtices possivelmente compartilhados, um caminho conveniente para descrever poliedros. Os pol@'{i}gonos podem ser c@^{o}ncavos mas n@~{a}o existe suporte para pol@'{i}gonos contendo buracos. Um arquivo @code{OFF} pode come@,{c}ar com a palavra chave @code{OFF}; isso @'{e} recomendado mas tamb@'{e}m @'{e} opcional, muitos arquivos existentes precisam dessa palavra chave. Tr@^{e}s inteiros ASCII seguem a palavra chave @code{OFF}: @var{NV@'{e}rtices}, @var{NFaces}, e @var{NArestas}. Esses s@~{a}o o n@'{u}mero de v@'{e}rtices, faces, e arestas, respectivamente. Atualmente o software n@~{a}o utiliza nem verifica @var{NArestas}; ele n@~{a}o precisa ser correto mas deve estar presente. As coordenadas do v@'{e}rtice seguem: dimens@~{a}o * @var{Nv@'{e}rtices} valores em ponto flutuante. Esses valores em ponto flutuante est@~{a}o implicitamente numerados de 0 a @var{NV@'{e}rtices}-1. A dimens@~{a}o @'{e} ou 3 (o padr@~{a}o) ou 4 (especificado pelo caractere chave @code{4} diretamente antes da palavra chave @code{OFF}). Seguindo esses acima citados est@~{a}o as descri@,{c}@~{o}es das faces, tipicamente escritos com uma linha por face. Cada linha tem a forma @example @var{N} @var{Vert1} @var{Vert2} @dots{} @var{VertN} [@var{cor}] @end example @noindent Aqui @var{N} @'{e} o n@'{u}mero de v@'{e}rtices sobre a considerada face, e @var{Vert1} a @var{VertN} s@~{a}o @'{i}ndices dentro da lista de v@'{e}rtices (no intervalo 0..@var{NV@'{e}rtices}-1). O modificador opcional @var{cor} no final da linha acima pode tomar v@'{a}rias formas. Caracteres de fim de linha s@~{a}o significativos nesse ponto: a descri@,{c}@~{a}o @var{cor} inicia-se ap@'{o}s @var{VertN} e termina com o caractere de fim de linha (ou pr@'{o}ximo caractere cerquilha # representativo de coment@'{a}rio). Uma @var{cor} pode ser: @table @asis @item aus@^{e}ncia de caractere a cor padr@~{a}o @item um inteiro @'{i}ndice dentro "do" mapa de cores; veja abaixo @item tr@^{e}s ou quatro inteiros valores de RGB e possivelmente alfa no intervalo 0..255 @item tr@^{e}s ou quatro n@'{u}meros em ponto flutuante valores RGB e possivelmente alfa no intervalo 0..1 @end table Para o caso de um inteiro, o mapa de cores @'{e} lido diretamente do arquivo @file{cmap.fmap} em sua forma atual no diret@'{o}rio @file{data} do Geomview. Algum melhor mecanismo para fornecer um mapa de cor ser@'{a} fornecido provavelmente algum dia. O significado de "cor padr@~{a}o" varia. Se nenhuma face do objeto tem uma cor, tudo recebe como heran@,{c}a a cor material padr@~{a}o do ambiente. Se alguma mas n@~{a}o todas as faces possuem cores, o padr@~{a}o @'{e} cinza (R,G,B,A=.666). Um formato @code{[ST][C][N][n]OFF BINARY} @'{e} aceito; veja @ref{Formato binario}. Esse formato assemelha-se ao formato ASCII em quase tudo que voc@^{e} poderia esperar, com inteiros de 32-bit para todos os contadores e @'{i}ndices de v@'{e}rtice e n@'{u}meros em ponto flutuante de 32-bit para posi@,{c}@~{o}es de v@'{e}rtice (e coordenadas de textura ou cores de v@'{e}rtice ou retas normais se algum dos formatos @code{COFF}/@code{NOFF}/@code{CNOFF}/@code{STCNOFF}/etc. estiver presente). Exce@,{c}@~{a}o: cada um dos @'{i}ndices de face do v@'{e}rtice s@~{a}o seguidos por um inteiro indicando quantas componentes de cor o acompanham. Componentes de cor de face devem ser n@'{u}meros em ponto flutuante, n@~{a}o valores inteiros. Dessa forma uma face triangular pouco colorida pode ser representada como @example int int int int int 3 17 5 9 0 @end example enquanto a mesma face colorida com vermelho pode ser @example int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0 @end example @comment ---------------------------------------------------------------- @node VECT, SKEL, OFF, Formatos de Arquivo de Objeto @subsection Arquivos do Tipo VECT O sufixo convencional para arquivos @code{VECT} @'{e} @file{.vect}. Sintaxe: @example [4]VECT @var{NLinhaspoligonais} @var{NV@'{e}rtices} @var{NCores} @var{Nv[0]} @dots{} @var{Nv[NLinhaspoligonais-1]} # n@'{u}mero de v@'{e}rtices # em cada linha poligonal @var{Nc[0]} @dots{} @var{Nc[NLinhaspoligonais-1]} # n@'{u}mero de cores fornecido # em cada linha poligonal @var{Vert[0]} @dots{} @var{Vert[NVertices-1]} # Todos os v@'{e}rtices # (3*NVertices n@'{u}meros em # ponto flutuante) @var{Color[0]} @dots{} @var{Color[NCores-1]} # Todas as cores # (4*NCores n@'{u}meros em ponto # flutuante, RGBA) @end example Objetos do tipo @code{VECT} representam listas de linhas poligonais (sequ@^{e}ncia de caracteres que representam segmentos de reta, possivelmente fechados). Uma linha poligonal degenerada pode ser usada para representar um ponto. Um arquivo @code{VECT} inicia-se com a palavra chave @code{VECT} ou com @code{4VECT} e tr@^{e}s inteiros: @var{NLinhas}, @var{NV@'{e}rtices}, e @var{NCores}. Aqui @var{NLinhas} @'{e} o n´umero de linhas poligonais no arquivo, @var{NV@'{e}rtices} o n@'{u}mero total de vertices v@'{e}rtices, e @var{NCores} o n@'{u}mero de cores como explanado abaixo. A seguir vem @var{NLinhas} que s@~{a}o inteiros de @b{16-bit} @center @var{Nv[0]} @var{Nv[1]} @var{Nv[2]} @dots{} @var{Nv[NLinhas-1]} fornecendo o n@'{u}mero de v@'{e}rtices em cada linha poligonal. Um n@'{u}mero negativo indica uma linha poligonal fechada; 1 denota ponto composto por um pixel simples. O somat@'{o}rio (dos valores absolutos) de @var{Nv[i]} deve ser igual a @var{NV@'{e}rtices}. A seguir vem @var{NLinhas} que s@~{a}o formadas por inteiros de @b{16-bit} @var{Nc[i]}: o n@'{u}mero de cores em cada linha poligonal. Normalmente um dos tr@^{e}s valores abaixo: @table @asis @item 0 Nenhuma cor @'{e} especificada para esta linha poligonal. Seu desenho na mesma cor que a linha poligonal anterior. @item 1 Uma cor simples @'{e} especificada. A linha poligonal completa @'{e} desenhada nessa cor. @item abs(@var{Nv[i]}) Cada v@'{e}rtice tem uma cor. Ou cada segmento @'{e} desenhado na correspondente cor, ou as cores s@~{a}o linearmente interpoladas ao longo dos segmentos de reta, dependendo da implementa@,{c}@~{a}o. @end table A seguir vem @var{NV@'{e}rtices} grupos de 3 ou 4 n@'{u}meros em ponto flutuante: as coordenadas de todos os v@'{e}rtices. Se a palavra chave for @var{4VECT} ent@~{a}o existir@~{a}o 4 valores por v@'{e}rtice. O primeiro grupo abs(@var{Nv[0]}) forma a primeira linha poligonal, o grupo seguinte abs(@var{Nv[1]}) forma a segunda e assim por diante. Finalmente @var{NCores} grupos de 4 n@'{u}meros em ponto flutuante fornecendo valores de vermelho, verde, azul e alfa (opacidade). O primeiro grupo @var{Nc[0]} aplica-se @`{a} primeira linha poligonal, e assim por diante. Um formato @var{VECT BINARY} @'{e} aceito; veja @ref{Formato binario}. O formato bin@'{a}rio segue exatamente o formato ASCII, com inteiros de 32-bit Big-Endian onde aparecem os n@'{u}meros inteiros comuns, e com inteiros de @b{16-bit} Big-Endian onde aparecem inteiros de 16-bit; n@'{u}meros em ponto flutuante de 32-bit Big-Endian onde aparecem os valores reais. @b{NOTA REALMENTE GRANDE:} Os contadores de v@'{e}rtice @var{Nv[i]} e os contadores de cor @var{Nc[i]} s@~{a}o inteiros de @b{16-bit} Big-Endian. @comment ---------------------------------------------------------------- @node SKEL, SPHERE, VECT, Formatos de Arquivo de Objeto @subsection Arquivos do Tipo SKEL Arquivos do Tipo @code{SKEL} representam cole@,{c}@~{o}es de pontos e linhas poligonais, com v@'{e}rtices compartilhados. O sufixo convencional para arquivos @code{SKEL} @'{e} @file{.skel}. Sintaxe: @example [C][4][n]SKEL [@var{NDim}] # Dimens@~{a}o dos v@'{e}rtices, presente somente # se nSKEL tamb@'{e}m estiver presente @var{NV@'{e}rtices} @var{NLinhaspoligonais} @var{x}[0] @var{y}[0] @var{z}[0] # V@'{e}rtices # se 4SKEL, cada v@'{e}rtice ter@'{a} 4 componentes # se nSKEL, each v@'{e}rtice ter@'{a} NDim componentes # se C[4][n]SKEL coordenadas de # v@'{e}rtice s@~{a}o seguidas por uma # especifica@,{c}@~{a}o de cor RGBA @dots{} @var{x}[@var{NV@'{e}rtices}-1] @var{y}[@var{NV@'{e}rtices}-1] @var{z}[@var{NV@'{e}rtices}-1] # linhas poligonais # @var{Nv} = v@'{e}rtices sobre essa linha poligonal # (1 = ponto) # @var{v}[0] @dots{} @var{v}[@var{Nv}-1]: @'{i}ndices de v@'{e}rtice # no intervalo 0..@var{NV@'{e}rtices}-1 @var{Nv} @var{v}[0] @var{v}[1] @dots{} @var{v}[@var{Nv}-1] [@var{colorspec}] @dots{} # @var{colorspec} continua adiante de @var{v}[@var{Nv}-1] # at@'{e}m encontrar um fim de linha; pode ser # vazia, ou 3 ou 4 n@'{u}meros. # vazia: cor padr@~{a}o # 3 ou 4 n@'{u}meros em ponto flutuante: valores RGB[A] no intervalo 0..1 @end example A sintaxe @'{e} semelhante @`{a} sintaxe dos arquivos @code{OFF}, com uma tabela de v@'{e}rtices seguidos de uma sequ@^{e}ncia de descri@,{c}@~{o}es de linhas poligonais, cada descri@,{c}@~{a}o referindo-se a v@'{e}rtices atrav@'{e}s de @'{i}ndices na tabela. Cada linha poligonal tem uma cor opcional. Para objetos @code{nSKEL}, cada v@'{e}rtice tem @var{NDim} componentes. Para objetos @code{4nSKEL}, cada v@'{e}rtice tem @var{NDim+1} componentes; a componente final @'{e} o divisor homog@^{e}neo. Um formato @var{[4][n]SKEL BINARY} @'{e} aceito; veja @ref{Formato binario}. Esse formato assemelha-se ao formato ASCII na maioria das formas que voc@^{e} pode esperar, com inteiros de 32-bit para todos os contadores e @'{i}ndices de v@'{e}rtice e n@'{u}meros em ponto flutuante de 32-bit para posi@,{c}@~{o}es de v@'{e}rtice. Exce@,{c}@~{a}o: cada @'{i}ndice do v@'{e}rtice de linhas poligonais @'{e} seguido de um inteiro indicando quantas componentes de cor o acompanham. Componentes de cor de linhas poligonais devem ser inteiros em ponto flutuante, n@~{a}o valores inteiros. Dessa forma uma pouco colorida linha poligonal com 3 v@'{e}rtices pode ser representada como @example int int int int int 3 17 5 9 0 @end example enquanto a mesma linha poligonal colorida em vermelho pode ser @example int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0 @end example @comment ---------------------------------------------------------------- @node SPHERE, INST, SKEL, Formatos de Arquivo de Objeto @subsection SPHERE Files O sufixo convencional para arquivos @code{SPHERE} @'{e} @file{.sph}. @example [ST][E|H|S]SPHERE # Palavra chave # coordenadas de textura geradas automaticamente, somente permitido # com objetos @emph{ST}SPHERE [SINUSOIDAL|CYLINDRICAL|RECTANGULAR| # STEREOGRAPHIC|ONEFACE] # os pr@'{o}ximos quatro campos s@~{a}o requeridos @var{Radius} @var{Xcenter} @var{Ycenter} @var{Zcenter} @end example A palavra chave @'{e} @code{[ST][E|H|S]SPHERE}. Os caracteres prefixados opcionais significam: @table @samp @item ST A esfera @'{e} desenhada com coordenadas de textura geradas automaticamente. Veja abaixo. @item E Assume-se que a esfera encontra-se dentro do espa@,{c}o Euclidiano. @item H Assume-se que a esfera encontra-se dentro de um espa@,{c}o Hiperb@'{o}lico. Veja @ref{Geometrias Nao-Euclidianas}. @item S Assume-se que a esfera encontra-se dentro de um espa@,{c}o esf@'{e}rico. Veja @ref{Geometrias Nao-Euclidianas}. @end table Objetos do tipo esfera s@~{a}o desenhados usando malhas que s@~{a}o retangulares em um sistema de coordenadas polares, com o plano equatorial paralelo ao plano @code{x,y}. Sua suavidade superficial, e o tempo gasto para desenh@'{a}-la, depende da escolha dos cortes quadrados, 10x10 por padr@~{a}o. Para Geomview, o painel de apar@^{e}ncia, o comando de teclado @code{ad}, ou um atributo de apar@^{e}ncia @code{dice nu nv} escolhe isso. Coordenadas de textura s@~{a}o geradas para objetos @code{STSPHERE}; a palavra chave seguindo a palavra chave inicial @code{STSPHERE} define o caminho para fazer isso. A palavra chave que segue a papavra chave inicial segue as conven@,{c}@~{o}es do script perl @command{mktxmesh} que acompanha o diret@'{o}rio @emph{Orrery} na @'{a}rvore de diret@'{o}rios instalados que acompanha o Geomview. @table @var @item SINUSOIDAL proje@,{c}@~{a}o sinusoidal de @'{a}rea equivalente @item CYLINDRICAL proje@,{c}@~{a}o cil@'{i}drica: @var{s} @'{e} a longitude, @var{t} @'{e} a latitude @item RECTANGULAR proje@,{c}@~{a}o retangular: @var{s} @'{e} a longitude, @var{t} @'{e} @code{sin(latitude)} (i.e. a coordenada @code{z} no sistema de coordenadas da esfera) @item STEREOGRAPHIC proje@,{c}@~{a}o estereogr@'{a}fica a partir do p@'{o}lo sul (@code{z=-1}) @item ONEFACE vis@~{a}o ortogr@'{a}fica extendida do hemisf@'{e}rio @code{+y} sobre ambos, espelhando @end table @comment ---------------------------------------------------------------- @node INST, LIST, SPHERE, Formatos de Arquivo de Objeto @subsection Arquivos do Tipo INST O sufixo convencional para um arquivo @code{INST} @'{e} @file{.inst}. N@~{a}o existe formato INST BINARY. Um @code{INST} aplica uma transforma@,{c}@~{a}o 4x4 (ou @var{(N+1)}x@var{(N+1)} no contexto de ND-viewing) a outro objeto OOGL. Um arquivo do tipo @code{INST} inicia-se com @code{INST} seguido de as se@,{c}@~{o}es mostradas adiante que podem vir em qualquer ordem: @example geom @var{oogl-object} @end example @noindent especifica o objeto OOGL a ser instanciado. Veja @ref{Referencias}, para a sintaxe de um @var{oogl-object}. palavra chave @code{unit} @'{e} um sin@^{o}nimo para @code{geom}. @example transform ["@{"] @code{transforma@,{c}@~{a}o 4x4} ["@}"] @end example @noindent especifica uma matriz de transforma@,{c}@~{a}o simples. Ou a matriz pode aparecer literalmente como 16 n@'{u}meros, ou a matriz pode aparecer como uma refer@^{e}ncia a um objeto "transform", i.e. @example "<" arquivo-contendo-matriz-4x4 @end example ou @example ":" s@'{i}mbolo-representando-transforma@,{c}@~{a}o-de-objeto @end example Outra forma de especificar a transforma@,{c}@~{a}o @'{e} @example transforms @var{objeto-oogl} @end example O @var{objeto-oogl} deve ser um objeto @code{TLIST} (lista de transforma@,{c}@~{o}es), ou uma @code{LIST} cujos membros dessa lista s@~{a}o objetos @code{TLIST} mais recentes. Com efeito, a palavra chave @code{transforms} toma uma cole@,{c}@~{a}o de matrizes 4x4 e replica o objeto @code{geom}, fazendo uma c@'{o}pia para cada matriz 4x4. Se nem a palavra chave @code{transform} nem a palavra chave @code{transforms} aparecerem, ne-nhuma transforma@,{c}@~{a}o @'{e} aplicada (atualmente a identidade @'{e} aplicada). Voc@^{e} pode usar isso para, e.g., empacotar uma apar@^{e}ncia em torno de um objeto externo fornecido, atrav@'{e}s de uma LIST de membros simples pode-se fazer isso mais eficientemente. Veja @ref{Matrizes de transformacao}, para o formato de matriz. A c@'{o}pia de um objeto geom@'{e}trico simples por meio de um objeto @code{TLIST} (veja @samp{transforms} acima) pode ser @'{u}til para transformar coordenadas de textura atrav@'{e}s de outra lista de transforma@,{c}@~{o}es; essa lista pode ser especificada por @example txtransforms @var{objeto-TLIST} @end example O n@'{u}mero de transoforma@,{c}@~{o}es de textura deve coincidir com o n@'{u}mero de transforma@,{c}@~{o}es geom@'{e}tricas. O objeto @code{SPHERE} (Veja @ref{SPHERE, Sphere Objects}) utiliza essa t@'{e}cnica para gerar um esfera completamente texturizada fora de alguma fra@,{c}@~{a}o de uma esfera (usualmente um octante). Uma transforma@,{c}@~{a}o @var{(N+1)}-dimensional pode ser especificada por @example ntransform ["@{"] @var{N+1} @var{N+1} @code{(N+1)x(N+1) floats} ["@}"] @end example @noindent A linha acima fornece uma matriz de transforma@,{c}@~{a}o @var{N+1}-dimensional. Ou a matriz pode aparecer literalmente como @var{(N+1)}x@var{(N+1)} n@'{u}meros, ou pode existir uma refer@^{e}ncia a um objeto @samp{ntransform}, i.e. @example "<" arquivo-contendo-matriz-@var{(N+1)}x@var{(N+1)} @end example ou @example ":" s@'{i}mbolo-representando-objeto-ntransform @end example Veja @ref{Matrizes de transformacao ND}, para o formato de matriz. Mais dois campos INST s@~{a}o aceitos: @code{location} e @code{origin}. Note que @code{location} bem como @code{origin} s@~{a}o ignorados se esse objeto @code{INST} realiza uma @code{ntransform}. Tamb@'{e}m, se a visualiza@,{c}@~{a}o ND est@'{a} ativada (comando @code{ND-axes}, veja @ref{GCL}) ent@~{a}o objetos @code{INST} com @code{origin} diferente de @code{local} n@~{a}o ir@~{a}o ser desenhados, embora o material @code{location} possa trabalhar (ou n@~{a}o). @example location [global ou camera ou ndc ou screen ou local] @end example Normalmente um INST especifica uma posi@,{c}@~{a}o relativa a seu objeto pai; o campo @code{location} permite colocar um objeto em qualquer lugar. @itemize @bullet @item @code{location global} anexa o objeto ao ambiente do sistema de coordenadas global (tamb@'{e}m conhecido como "universe") -- o mesmo dos objetos mundo do Geomview, das geometrias alien@'{i}genas, e c@^{a}meras s@~{a}o colocados. @item @code{location camera} coloca o pai do objeto como sendo uma c@^{a}mera. (Dessa forma se houverem multiplas visualiza@,{c}@~{o}es, essas visualiza@,{c}@~{o}es podem aparecer em uma diferente posi@,{c}@~{a}o espacial em cada visualiza@,{c}@~{a}o.) O centro de vis@~{a}o da camera est@'{a} em volta da parte negativa do seu eixo z; X positivo est@'{a} @`{a} direita e adiante, Y positivo est@'{a} acima e adiante. Normalmente as unidades do espa@,{c}o da c@^{a}mera s@~{a}o as mesmas das coordenadas globais. Quando uma c@^{a}mera @'{e} colocada de volta @`{a} sua posi@,{c}@~{a}o inicial, a or@'{i}gem global est@'{a} localizada em (0,0,-3.0). @item @code{location ndc} coloca os parentes do objeto no cubo unit@'{a}rio normalizado no qual a proje@,{c}@~{a}o da c@^{a}mera (perspectiva ou ortogr@'{a}fica) mapeia o objeto mundo vis@'{i}vel. X, Y, e Z est@~{a}o no intervalo de -1 a +1, com Z = -1 estando mais pr@'{o}ximo e Z = +1 adiante do plano de corte, e X e Y nas dire@,{c}@~{o}es @`{a} direita e adiante e acima e adiante respectivamente. Dessa forma alguma coisa como @example INST transform 1 0 0 0 0 1 0 0 0 0 1 0 -.9 -.9 -.999 1 location ndc geom < label.vect @end example cola @code{label.vect} dentro do canto infeiror esquerdo de cada janela, e em frente de tudo mais que estiver pr@'{o}ximo, assumindo o conte@'{u}do @code{label.vect} como localizado no quadrante positivo do plano XY. @'{E} tentado usar -1 em lugar de como a componente Z da posi@,{c}@~{a}o, mas o -1 pode colocar o objeto apenas nas proximidades em lugar de muito perto do plano de corte e tornar o objeto (parcialmente) invis@'{i}vel, devido a algum erro de c@'{a}lculo com n@'{u}meros em ponto flutuante. @item @code{location screen} coloca o objeto objeto em coordenadas de tela. O intervalo de Z @'{e} ainda de -1 a +1 como para coordenadas ndc; X e Y s@~{a}o medidos em pixels, e a posi@,{c}@~{a}o de (0,0) localiza-se no canto @emph{inferior esquerdo} da janela, avan@,{c}ado para a direita e adiante e para cima e adiante. @end itemize @code{location local} @'{e} o padr@~{a}o; o objeto est@'{a} posicionado relativametne a seus genitores. @example origin [global ou camera ou ndc ou screen ou local] x y z @end example O campo @code{origin} reposiciona o conte@'{u}do da INST de forma que o local da or@'{i}gem seja o ponto especificado do sistema de coordenadas fornecido. A menos que @code{location} seja especificado, essa op@,{c}@~{a}o n@~{a}o muda a orienta@,{c}@~{a}o, somente a escolha da or@'{i}gem. Ambas as op@,{c}@~{o}es @code{location} e @code{origin} podem ser usadas juntas. Ent@~{a}o por exemplo @example @{ INST location screen origin ndc 0 0 -.99 geom @{ < xyz.vect @} transform @{ 100 0 0 0 0 100 0 0 0 0 -.009 0 0 0 0 1 @} @} @end example coloca a or@'{i}gem de xyz.vect no centro da janela, apenas transformando o plano de corte mais pr@'{o}ximo. O comprimento da unidade das arestas X e Y s@~{a}o ajustados proporcionalmente para ter o comprimento de apenas 100 unidades de tela -- pixels -- , independentemente do tamanho da janela. @menu * Exemplos INST:: alguns exemplos de arquivos do tipo @code{INST}. @end menu @comment ................................................................ @node Exemplos INST, , INST, INST @subsubsection Exemplos INST Aqui est@~{a}o alguns exemplos de arquivos @code{INST} @example INST unit < xyz.vect transform @{ 1 0 0 0 0 1 0 0 0 0 1 0 1 3 0 1 @} @end example @example @{ appearance @{ +edge material @{ edgecolor 1 1 0 @} @} INST geom < mysurface.quad @} @end example @example @{INST transform @{: T@} geom @{ @} @} geom @{ # material copiado a partir de todas as matrizes acima @dots{} @} @} @end example O exemplo adiante assemelham-se ao exemplo de @code{origin} na se@,{c}@~{a}o acima, mas fazem com que as arestas X e Y sejam 1/4 do tamanho da janela (1/4, n@~{a}o 1/2, uma vez que o intervalo das coordenadas ndc de X e Y estejam de -1 a +1). @example @{ INST location ndc geom @{ < xyz.vect @} transform @{ .5 0 0 0 0 .5 0 0 0 0 -.009 0 0 0 -.99 1 @} @} @end example @comment ---------------------------------------------------------------- @node LIST, TLIST, INST, Formatos de Arquivo de Objeto @subsection Arquivos do Tipo LIST O sufixo convencional para um arquivo @code{LIST} @'{e} @file{.list}. Uma lista de objetos OOGL Sintaxe: @example LIST @var{oogl-object} @var{oogl-object} @dots{} @end example Note que n@~{a}o existe separa@,{c}@~{a}o expl@'{i}cita entre os objetos oogl, de forma que eles podem ser colocados entre chaves (@{ @}) por quest@~{o}es de clareza. Da mesma forma n@~{a}o existe um marcador expl@'{i}cito para o final da lista; a menos que o arquivo apare@,{c}a sozinho em um arquivo de disco, a constru@,{c}@~{a}o completa pode tamb@'{e}m ser empacotada entre chaves, como em: @example @{ LIST @{ QUAD @dots{} @} @{ < xyz.quad @} @} @end example Uma @code{LIST} vazia, i.e. @code{@{ LIST @}}, @'{e} v@'{a}lida, e @'{e} o caminho mais f@'{a}cil para criar um objeto vazio. Por exemplo, para remover uma defini@,{c}@~{a}o de s@'{i}mbolo voc@^{e} pode escrever @example @{ define algums@'{i}mbolo @{ LIST @} @} @end example @comment ---------------------------------------------------------------- @node TLIST, GROUP, LIST, Formatos de Arquivo de Objeto @subsection Arquivos do Tipo TLIST O sufixo convencional para um arquivo @code{TLIST} @'{e} @file{.grp} ("grupo") ou @file{.prj} (matrizes "projetivas"). Cole@,{c}@~{o}es de matrizes 4x4, usadas na se@,{c}@~{a}o @code{transforms} de/e objeto @code{INST}. Sintaxe: @example TLIST # palavra chave @dots{} # qualquer n@'{u}mero de matrizes 4x4 transform @{ # refer@^{e}ncia a um objeto de transforma@,{c}@~{a}o @} tlist @{ # TLIST aninhada @} @end example Objetos @code{TLIST} s@~{a}o usados somente dentro de cl@'{a}usulas @code{transforms} de um objeto @code{INST}. Objetos @code{TLIST} fazem com que os objetos @code{geom} @code{INST}s sejam instanciados uma vez sob cada uma das transforma@,{c}@~{o}es na @code{TLIST}. O efeito @'{e} como aquele de um @code{LIST} de @code{INST}s cada uma com uma transforma@,{c}@~{a}o simples, e todas as transforma@,{c}@~{o}es referindo-se ao mesmo objeto, mas @'{e} mais eficiente. @code{TLIST}s podem ser aninhadas: efetivamente isto significa que todas as transforma@,{c}@~{o}es em cada objeto @code{TLIST} aninhado s@~{a}o multiplicadas (@`{a} esquerda) atrav@'{e}s das transforma@,{c}@~{o}es no objeto @code{TLIST} mais externo. Esteja informado de que uma @code{TLIST} @'{e} um tipo de geom, distinto de um objeto @code{transform}. Alguns contextos esperam um geom, alguns contextos esperam um @code{transform}. Por exemplo em @example INST transform @{ : @var{meuT} @} geom @{ @dots{} @} @end example @noindent @var{meuT} deve ser um objeto transform, que pode ter sido criado com a GCL @example (read transform @{ define meuT 1 0 0 1 @dots{} @}) @end example @noindent enquanto em @example INST transforms @{ : @var{meusTs} @} geom @{ @dots{} @} ou INST transforms @{ LIST @{: @var{meusTs}@} @{< more.prj@} @} geom @{ @dots{} @} @end example @noindent @var{meusTs} deve ser um objeto geom, definido e.g. com @example (read geometry @{ define @var{meusTs} @{ TLIST 1 0 0 1 @dots{} @} @}) @end example O formato @code{TLIST BINARY} @'{e} aceito. Dados bin@'{a}rios iniciam-se com um inteiro de 32-bit fornecendo o n@'{u}meros de transforma@,{c}@~{o}es, seguido por aquele n@'{u}mero de matrizes 4x4 no formato em n@'{u}mero de ponto flutuante de 32-bit. A ordena@,{c}@~{a}o dos elementos da matriz @'{e} a mesma do formato ASCII. @comment ---------------------------------------------------------------- @node GROUP, DISCGRP, TLIST, Formatos de Arquivo de Objeto @subsection Arquivos do Tipo GROUP Esse formato @'{e} obsoleto, mas ainda @'{e} aceito. It combined the functions of @code{INST} and @code{TLIST}, taking a series of transformations and a single Geom (@code{unit}) objeto, and replicating the objeto under each transformation. @example GROUP @dots{} < matrices > @dots{} unit @{ @var{oogl-object} @} @end example is still accepted and effectively translated into @example INST transforms @{ TLIST @dots{} @dots{} @} unit @{ @var{oogl-object} @} @end example @comment ---------------------------------------------------------------- @node DISCGRP, COMMENT, GROUP, Formatos de Arquivo de Objeto @subsection Arquivos do Tipo DISCGRP Esse formato @'{e} para grupos discretos, tais como aparecem na teoria dos coletores (manifolds) ou em modelos de simetria. Esse formato tem sua pr@'{o}pria p@'{a}gina de manual. Veja discgrp(5). @comment ---------------------------------------------------------------- @node COMMENT, , DISCGRP, Formatos de Arquivo de Objeto @subsection Objetos do Tipo COMMENT O objeto COMMENT @'{e} um mecanismo para codificar dados arbitr@'{a}rios dentro de um objeto OOGL. O objeto COMMENT pode ser usado para manter trilhas de dados ou para passagem de dados de retorno e passar dados adiante entre m@'{o}dulos externos. Sintaxe: @example COMMENT # palavra chave @var{nome} @var{tipo} # nome individual e especificador de tipo @{ @dots{} @} # dados arbitr@'{a}rios @end example Os dados, que devem ser contidos dentro de chaves, podem incluir qualquer coisa exceto chaves n@~{a}o balanceadas (aberta mas sem o fechamento correspondente ou fechada mas sem a abertura correspondente). O campo @var{tipo} pode ser usado para identificar dados de interesse de um programa em particular apesar de nomear conven@,{c}@~{o}es. Objetos @code{COMMENT} s@~{a}o intendidos como estando associados com outros objetos apesar da inclus@~{a}o em um objeto @code{LIST}. (Veja @ref{LIST}.) A sintaxe da cerquilha "#" OOGL de coment@'{a}rio n@~{a}o @'{e} suficiente para troca de dados uma vez que esses coment@'{a}rios s@~{a}o removidos quando um objeto OOGL @'{e} lido dentro do Geomview. O objeto @code{COMMENT} @'{e} preservado quando chamado dentro do Geomview e @'{e} mantido intacto na sa@'{i}da. Aqui est@'{a} um exemplo associando uma localiza@,{c}@~{a}o na internet a uma pe@,{c}a de geometria: @example @{ LIST @{ < Tetrahedron@} @{COMMENT GCHomepage HREF @{ http://www.geomview.org/ @}@} @} @end example Um formato de @code{COMMENT} bin@'{a}rio @'{e} aceito. Esse formato bin@'{a}rio de coment@'{a}rio n@~{a}o @'{e} consistente com outros formatos bin@'{a}rios OOGL. Veja @ref{Formato binario}. O @code{nome} e o @code{tipo} s@~{a}o seguidos por @example @var{N} @var{Byte1} @var{Byte2} @dots{} @var{ByteN} @end example Em lugar de dados contidos dentro de chaves. @comment ================================================================ @node Objetos nao-geometricos, , Formatos de Arquivo de Objeto, Formatos dos Arquivos da OOGL @section Objetos nao-geometricos A sintaxe desses objetos @'{e} fornecida na forma usada em @ref{Referencias}, onde itens "entre aspas duplas" devem aparecer literalmente mas sem aspas duplas, itens entre colch@^{e}tes ([ ]) s@~{a}o opcionais, e a barra vertical "|" separa escolhas alternativas. @menu * Objetos de aparencia:: Objetos de apar@^{e}ncia. * image objects:: Objetos de imagem. * transform objects:: Matrizes de transforma@,{c}@~{a}o. * ntransform objects:: Matrizes de Transforma@,{c}@~{a}o N-dimensional. * Objeto camera:: C@^{a}meras. * window objects:: Janelas. @end menu @comment ---------------------------------------------------------------- @node Objetos de aparencia, image objects, Objetos nao-geometricos, Objetos nao-geometricos @subsection Objetos de aparencia Apar@^{e}ncias s@~{a}o objetos OOGL com caracter@'{i}sticas pr@'{o}prias, que simplesmente significam que @'{e} poss@'{i}vel fornecer a eles nomes simb@'{o}licos (Veja @ref{Referencias}). Existem outras se@,{c}@~{o}es manuseado detalhes de apar@^{e}ncia. Veja @ref{Aparencias}. @node image objects, transform objects, Objetos de aparencia, Objetos nao-geometricos @subsection Objetos de imagem Objetos de imagem s@~{a}o usados para especificar dados de pixmap ou para texturas (Veja @ref{Mapeamento de Textura}), ou para imagens de fundo de c@^{a}meras (Veja @ref{camera, Objetos de camera}). Ao mesmo tempo em que imagens s@~{a}o escritas elas s@~{a}o tamb@'{e}m comprimidas de 1 a 4 canais, um canal fornece um n@'{u}mero simples no intervalo que vai de 0 a @code{maxval} para cada ponto de imagem (pixel); e @code{maxval} @'{e} colocado em 255. A interpreta@,{c}@~{a}o dos dados de imagem dependente do n@'{u}mero de canais @'{e} como segue: @multitable @columnfractions 0.2 0.2 0.6 @headitem #Canais @tab No. do Canal @tab Interpreta@,{c}@~{a}o @item 1 @tab 1 @tab escala de cinza ou dados de lumin@^{a}ncia @item 2 @tab 1 @tab escala de cinza ou dados de lumin@^{a}ncia @item @code{ } @tab 2 @tab canal alfa (0: transparente, @code{maxval}: opaco) @item 3 @tab 1 @tab canal vermelho @item @code{} @tab 2 @tab canal verde @item @code{} @tab 3 @tab canal azul @item 4 @tab 1 @tab canal vermelho @item @code{} @tab 2 @tab canal verde @item @code{} @tab 3 @tab canal azul @item @code{} @tab 4 @tab canal alfa (0: transparente, @code{maxval}: opaco) @end multitable Dados de imagem podem ser especificados inline (embutidos dentro do fluxo de dados atual) ou via refer@^{e}ncias de arquivos; em ambos os casos os dados s@~{a}o lidos e interpretados ao mesmo tempo que o objeto de imagem @'{e} passado. @emph{Essa forma @'{e} diferente da antiga (e desatualizada) forma de especifica@,{c}@~{a}o de textura de imagem, onde os dados de imagem em uma m@'{i}dia podem eventualmente serem re-lidos pelo Geomview}. A sintaxe geral de objetos de imagem @'{e} como segue: @example ::= [ "@{" ] (abertura de chave, geralmente precisam informar o fim do objeto de forma clara.) [ "image" ] (palavra chave opcional; desnecess@'{a}ria se o tipo @'{e} determinado pelo contexto, o que usualmente acontece.) [ "define" ] (define uma imagem chamada , escolhendo seus valores a partir do material adiante) | "<" (significando: leia a imagem de contida em nomedearquivo) | ":" (significando: use a vari@'{a}vel @var{nome}, definida em algum lugar; se a vari@'{a}vel n@~{a}o for definida em algum lugar a imagem @'{e} tida como vazia) | (material atual de defini@,{c}@~{a}o de imagem; dados da imagem obrigat@'{o}riamente v@^{e}m por ultimo, ap@'{o}s a defini@,{c}@~{a}o da largura e da altura e do n@'{u}mero de canais) "width" (largura da imagem, detectado automaticamente a partir dos dados da imagem se poss@'{i}vel) "height" (altura da imagem, detectado automaticamente a partir dos dados da imagem se poss@'{i}vel) "channels" (n@'{u}mero de canais, detectado automaticamente a partir dos dados da imagem e a partir das especifica@,{c}@~{o}es @code{data} descrita adiante, se poss@'{i}vel) "maxval" (n@~{a}o suportado, obrigatoriamente deve ser @code{255} se especificado) "data MASCDEST [FILTER] [@{] < NOMEDOARQUIVO [@}]" "data MASCDEST [FILTER] TAMAN_IMAGEM [@{][\n]DADOS_LIT_IMAGEM[@}]" (dados de imagem ou externos ou embutidos, veja abaixo para uma descri@,{c}@~{a}o detalhada do significado de @emph{MASCDEST} e @emph{FILTER}. Uma imagem pode -e tem, em geral- multiplas se@,{c}@~{o}es de dados.) [ "@}" ] (fechamento correspondente da chave) @end example @b{Detalhes relativos @`{a} especifica@,{c}@~{a}o dos dados de uma imagem:} @table @samp @item MASCDEST Esse @'{e} um campo-bit descrevendo onde os dados da imagem especificada devem ser colocados no pixmap de destino. O campo-bit @'{e} especificado por meio de um inteiro em um dos formatos conhecidos (decimal, octal, hexadecimal). Os canais dos dados fonte s@~{a}o sempre enumerados consecutivamente. Se, e.g. @samp{NOMEDOARQUIVO} ou @samp{DADOS_LIT_IMAGEM} especificam um imagem (provavelmente RGB @dots{}) de tr@^{e}s canais e @samp{MASCDEST} for igual a @code{0xD} (i.e. o primeiro bit @'{e} 0), ent@~{a}o o terceiro canal do pixmap fonte pode ser substitu@'{i}do no quarto canal do objeto imagem de destino (o canal alfa), o segundo canal pode determinar o valor de destino @samp{azul} e o primeiro canal da fonte determina o valor de destino correspondente ao @samp{vermelho}. O n@'{u}mero de canais dos dados fontes sempre tem que coincidir com o n@'{u}mero de bits especificado como @samp{MASCDEST}. @b{Exce@,{c}@~{a}o:} se o pixmap fonte possui somente um canal, ent@~{a}o o n@'{u}mero de canais dos dados fonte pode ser usado para preencher qualquer n@'{u}mero de canais de destino; todos os canais especificados em @samp{MASCDEST} s@~{a}o preenchidos com os dados do canal simples do pixmap fonte. Geomview conhece as seguintes constantes simb@'{o}licas, que podem ser usadas em lugar de especificar o campo-bit @samp{MASCDEST} numericamente: @table @code @item LUMINANCE o mesmo que @samp{1}, @samp{0x1}, @samp{\01} @item LUMINANCE_ALPHA o mesmo que @samp{3}, @samp{0x3}, @samp{\03} @item RGB o mesmo que @samp{7}, @samp{0x7}, @samp{\07} @item RGBA o mesmo que @samp{15}, @samp{0xf}, @samp{\017} @item ALPHA dependendo do contexto: o n@'{u}mero absoluto de canais deve obrigatoriamente ser conhecido; i.e. @samp{data ALPHA @dots{}} deve obrigatoriamente ser colocado antes de alguma coisa de forma a determinar o n@'{u}mero de canais da imagem, e.g. @example ... data RGB ... data ALPHA ... @end example @'{e} v@'{a}lido, mas @example data ALPHA ... @end example n@~{a}o @'{e} v@'{a}lido, porque Geomview n@~{a}o tem meios de determinar o canal de destino a partir do contexto. @item AUTO Dados de imagem no formato PGM @'{e} interpretado como canal simples em escala de cinza, dados RGB PNM como dados de imagem RGB. @code{AUTO} n@~{a}o pode trabalhar com dados de imagem no formato @samp{raw}. @end table @item FILTER A especifica@,{c}@~{a}o @samp{FILTER} @'{e} opcional. se for omitida, ent@~{a}o Geomview tenta determinar o tipode imagem usando o sufixo de @samp{NOMEDOARQUIVO}. Se @~{a}o houver sufixo ou o sufixo for desconhecido, ou para dados embutidos de imagem, Geomview est@'{a} apto a auto-detectar o formato do arquivo de imagem SGI (por raz@~{o}es hist@'{o}ricas @dots{}) e formatos de imagem NetPBM (por raz@~{o}es pr@'{a}ticas). A auto-detec@,{c}@~{a}o de formatos NetPBM incluem o novo formato de imagem @dfn{PAM} que permite (em meio a um monte de outras coisas) armazenar um canal alfa juntamente com os dados de lumin@^{a}nica ou de RGB. Da mesma forma, a sa@'{i}da final de qualquer dos filtros especificados devem ou ser no formato de arquivo de imagem SGI, ou especificar uma imagem PAM, PNM ou PGM. Se o formato de arquivo de imagem n@~{a}o puder ser determinado por ou pelo sufixo do nome de arquivo ou pela especifica@,{c}@~{a}o de filtro ou pela auto-detec@,{c}@~{a}o de dados SGI ou NetPBM, ent@~{a}o Geomview assume que os dados sejam "raw". Veja abaixo. Os filtros de descompress@~{a}o podem ser deduzidos ou de um dos formatos de imagem conhecidos ou de um especificador de filtro expl@'{i}cito, e.g. o seguinte @'{e} v@'{a}lido: @example data LUMINANCE raw.gzip @{ < arquivoemtonsdecinzagzipado @} @end example A linha acima deve ser equivalente a @example data LUMINANCE raw @{ < arquivoemtonsdecinza @}, @end example fornece dados descomprimidos realizados atrav@'{e}s de dados de canal simples, com o primeiro pixel correspondendo ao canto inferior esquerdo (devido ao formato @samp{raw} de imagem, veja abaixo). Geomview tem conhecimento interno dos seguintes filtros/sufixos: @table @b @item Descompress@~{a}o de Dados @table @samp @item z @item gz @item gzip os dados s@~{a}o direcionados por @samp{gzip -dc} @item bz2 @item bzip2 os dados s@~{a}o direcionados por @samp{bzip2 -dc} @end table @item Formatos de Imagem @table @samp @item tiff @item tif Formato de imagem @code{TIFF}. Somente suportado se o execut@'{a}vel @code{tifftopnm} puder ser executado no caminho de execu@,{c}@~{a}o atual. @item png Formato de imagem @code{PNG}. Somente suportado se o execut@'{a}vel @code{pngtopnm} puder ser executado no caminho de execu@,{c}@~{a}o atual. @item jpg @item jpeg Formato de imagem @code{JPEG}. Somente suportado se o execut@'{a}vel @code{jpegtopnm} puder ser executado no caminho de execu@,{c}@~{a}o atual. @item gif Formato de imagem @code{GIF} image file format. Somente suportado se o execut@'{a}vel @code{giftoppm} puder ser executado no caminho de execu@,{c}@~{a}o atual. @item raw Dados de imagem em Raw; o n@'{u}mero de canais deve coincidir com o n@'{u}mero de bits informado em @samp{MASCDEST}. Pixels s@~{a}o especificados com 1 byte por canal. Os pixels s@~{a}o organizados em linhas como em @samp{liminance[-alpha]} ou em amostras @samp{RGB[A]}. O pixel mais @`{a} esquerda @'{e} o primeiro pixel em cada linha de dados, a linha de dados mais acima deve vir primeiramente (isso @'{e} apenas o mesmo que a conven@,{c}@~{a}o de NetPBM, os sistemas de coordenadas de imagem t@^{e}m sua or@'{i}gem no canto superior esquerdo, da forma usual). @end table @item Filtros Explicitamente Especificados Se nenhum dos sufixos especificados acima coincidirem, ent@~{a}o o sufixo/filtro @'{e} interpretado como um filtro de programa externo; o programa do filtro externo deve ler de @code{STDIN} (da entrada padr@~{a}o) e escrever para @code{STDOUT} (a sa@'{i}da padr@~{a}o). A sa@'{i}da deve ou ser no formato de imagem SGI, ou no formatos de image PNM ou PGM. De outra forma os dados de sa@'{i}da s@~{a}o interpretados como dados de imagem no formato raw (veja acima). Alguma coisa como o seguinte pode trabalhar, garantindo que o programa @file{$@{HOME@}/bin/bububfilter} exista, seja execut@'{a}vel e fa@,{c}a alguma co@'{i}sa @'{u}til: @example ... data RGB "$@{HOME@}/bin/bububfilter.bzip2" 7 @{ # dados bin@'{a}rios seguem bububub @} ... @end example Note que -- previamente fornecendo os dados para @samp{bububfilter} -- Geomview ir@'{a} tentar descompactar o material com @samp{bzip2 -dc}. @end table @end table @b{Omitindo dados de imagem:} Normalmente, o n@'{u}mero de canais de imagem @'{e} determinado automaticamente a partir das especifica@,{c}@~{o}es dos @code{dados} de imagem; se a especifica@,{c}@~{a}o de imagem carrega um n@'{u}mero expl@'{i}cito de canais via palavra chave @code{channels} que excede o n@'{u}mero de canais encontrado nas especifica@,{c}@~{o}es de @code{dados}, ou se a uni@~{a}o de todas as especifica@,{c}@~{o}es @samp{MASCDEST} possuem buracos, ent@~{a}o omitindo lumin@^{a}ncia e canais RGB s@~{a}o initializados para 0, e um canal alfa omitido @'{e} inicializado para @code{maxval}, i.e. omitindo os dados do canal alfa para uma imagem RGBA @'{e} apenas o mesmo que definir uma imagem RGB. @node transform objects, ntransform objects, image objects, Objetos nao-geometricos @subsection Objetos de Transforma@,{c}@~{a}o Onde uma matriz simples 4x4 @'{e} esperada -- como no campo de @code{transform} @code{INST}, a transforma@,{c}@~{a}o da c@^{a}mera @code{camtoworld} e os comandos do Geomview @code{xform*} -- use um objeto de transforma@,{c}@~{a}o. Note que uma transforma@,{c}@~{a}o @'{e} diferente de uma @code{TLIST}, que @'{e} um tipo de geometria. @code{TLIST}s podem conter uma ou mais transforma@,{c}@~{o}es 4x4; objetos "transform" devem ter exa-tamente uma. Por que temos ambos ("transform" e TLIST)? Em muitos lugares -- e.g. posicionamento de c@^{a}meras -- @'{e} somente significativo ter uma transofrma@,{c}@~{a}o simples. Usando um tipo separado de objeto refor@,{c}a isso. A sintaxe para um objeto de transforma@,{c}@~{a}o "transform" @'{e} @example ::= [ "@{" ] (Abertura de chave, geralmente necess@'{a}rio para tornar o fim do objeto claramente explicitado.) [ "transform" ] (palavra chave opcional; desnecess@'{a}ria se o tipo for determinado pelo contexto, o que comumente ocorre.) [ "define" ] (define uma transforma@,{c}@~{a}o chamada , escolhendo seus valores do material adiante) (interpretado como uma transforma@,{c}@~{a}o homog@^{e}nea 4x4 fornecida linha por linha, intencionalmente aplicada a um vetor linha multiplicado @`{a} ESQUERDA, de forma que e.g. transla@,{c}@~{o}es euclidianas apare@,{c}am na linha inferior) | "<" (significando: leia a transforma@,{c}@~{a}o a partir daquele arquivo) | ":" (significando: use a vari@'{a}vel , definida em algum lugar; se n@~{a}o definido o valor inicial @'{e} a transforma@,{c}@~{a}o identidade) [ "@}" ] (fechamento de chave correspondente) @end example O conjunto pode ser colocado entre @{ chaves @}. As chaves n@~{a}o s@~{a}o essenciais se exatamente um dos itens acima estiver presente, ent@~{a}o e.g. um array 4x4 de n@'{u}meros em ponto flutuante independente n@~{a}o precisa necessariamente ter chaves. Alguns exemplos, em contextos onde eles podem ser usados: @example # Exemplo 1: Um comando GCL para definir uma transforma@,{c}@~{a}o # chamada "fred" (read transform @{ transform define fred 1 0 0 0 0 1 0 0 0 0 1 0 -3 0 1 1 @} ) @end example @example # Exemplo 2: Um objeto c@^{a}mera usando a transforma@,{c}@~{a}o # "fred" para posicionamento de c@^{a}mera # Fornecida a defini@,{c}@~{a}o acima, isso coloca a c@^{a}mera em # (-3, 0, 1), olhando na dire@,{c}@~{a}o -Z. @{ camera halfyfield 1 aspect 1.33 camtoworld @{ : fred @} @} @end example @comment ---------------------------------------------------------------- @node ntransform objects, Objeto camera, transform objects, Objetos nao-geometricos @subsection Objetos ND-Transform Onde -- no contexto de visualiza@,{c}@~{a}o NDimensional -- uma matriz simples (N+1)x(N+1) @'{e} esperada -- como no campo @code{INST} @code{ntransform}, ou a @code{ND-xform*} (veja comandos @ref{GCL}) -- use um objeto @code{ntransform}. @code{ntransform} s@~{a}o matrizes de transforma@,{c}@~{a}o @var{NLinhas} x @var{NColunas} onde usualmente @var{NLinhas} = @var{N+1} no contexto de objetos @var{N}-dimensionais e visualiza@,{c}@~{a}o. A componente homog@^{e}nea de uma @code{ntransform} situa-se na coluna zero (em oposi@,{c}@~{a}o a objetos @code{transform} comuns onde a componente homog@^{e}nea situa-se na coluna tr@^{e}s). Objetos @code{ntransform} trabalham sobre pontos de qualquer dimens@~{a}o: se um ponto @'{e} para ser transformado atrav@'{e}s de um objeto @code{ntransform} e a dimens@~{a}o do ponto n@~{a}o coincide com o n@'{u}mero de linhas do objeto @code{ntransform}, ent@~{a}o ou o ponto est@'{a} implicitamente preenchido com zeros para coincidir com @var{NLinhas} ou a matriz est@'{a} implicitamente preenchida com unidades abaixo de sua diagonal principal (e zeros em todas as outras posi@,{c}@~{o}es) de forma que a matriz ir@'{a} trabalhar como a matriz identidade sobre as dimens@~{o}es excedentes do ponto de entrada. A sintaxe para um objeto @code{ntransform} @'{e} @example ::= [ "@{" ] (abertura de chave, geralmente necess@'{a}ria para tornar o fim do objeto claramente explicitado.) [ "ntransform" ] (palavra chave opcional; desnecess@'{a}ria se o tipo for determinado pelo contexto, o que comumente ocorre.) [ "define" ] (define uma transforma@,{c}@~{a}o chamada , escolhendo seus valores do material adiante) @var{NLinhas} @var{NColunas} (n@'{u}mero de linhas e colunas da matriz, tipicamente @var{N+1} @var{N+1}, mas qualquer dimens@~{a}o @'{e} poss@'{i}vel) <@var{NLinhas} x @var{NColunas} n@'{u}meros em ponto flutuante> (interpretados como uma transforma@,{c}@~{a}o homog@^{e}nea @var{NLinhas} x @var{NColunas} fornecida linha por linha, pretensamente a ser aplicada a um vetor linha multiplicado @`{a} ESQUERDA, de forma que e.g. transla@,{c}@~{o}es Euclideanas aparecem na linha mais @b{acima} -- em oposi@,{c}@~{a}o a objetos de transforma@,{c}@~{a}o comuns onde as transla@,{c}@~{o}es aparecem na linha mais inferior) | "<" (significando: leia a transforma@,{c}@~{a}o daquele arquivo) | ":" (significando: use a vari@'{a}vel , definida em algum lugar; se n@~{a}o for definida o valor inicial @'{e} a transforma@,{c}@~{a}o identidade) [ "@}" ] (correspondente fechamento de chave) @end example O conjunto deve ser delimitado entre @{ chaves @}. Chaves n@~{a}o s@~{a}o necessariamente essenciais, de forma que e.g. dois inteiros -- @var{NLinhas} @var{NColunas} -- seguidos por um array composto de @var{NLinhas} x @var{NColunas} n@'{u}meros em ponto flutuante independentes pode mas n@~{a}o precisa ter chaves. Alguns exemplos, em contextos onde eles possivelmente podem ser usados: @example # Exemplo 1: Um comando GCL para definir uma transforma@,{c}@~{a}o @code{6x6} chamada # "fred", uma mera transla@,{c}@~{a}o por meio do vetor @code{-3 0 1 1 0}. Essa # transforma@,{c}@~{a}o @'{e} significativa para um espa@,{c}o pentadimensional, com uma componente # homog@^{e}nea um @'{i}ndice zero. (read ntransform @{ ntransform define fred 6 6 1 -3 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 @} ) @end example @example # Exemplo 2: Escolhe o ND-xform de um objeto -- um geom@'{e}trico ou um grupo de # cameras. Fornecendo a defini@,{c}@~{a}o acima, o ND-xform escolhido coloca o objeto em (-3 0 1 1 # 0) no espa@,{c}o pentadimensional. (ND-xform-set focus : fred) # ou (ND-xform-set g1 : fred) @end example @comment ---------------------------------------------------------------- @node Objeto camera, window objects, ntransform objects, Objetos nao-geometricos @subsection c@^{a}mera Um objeto c@^{a}mera especifica as seguintes propriedades de uma c@^{a}mera: @table @asis @item posi@,{c}@~{a}o e orienta@,{c}@~{a}o especificada por ou uma transforma@,{c}@~{a}o camera para o objeto mundo ou uma transforma@,{c}@~{a}o de objeto mundo para a c@^{a}mera; essa transforma@,{c}@~{a}o n@~{a}o inclui a proje@,{c}@~{a}o, de forma que essa transforma@,{c}@~{a}o @'{e} tipicamente apenas uma composi@,{c}@~{a}o de transla@,{c}@~{a}o e rota@,{c}@~{a}o. Especificado como um objeto transform, tipicamente uma matriz 4x4. @item "focus" - dist@^{a}ncia focal Ao inv@'{e}s de sugerir uma dist@^{a}ncia t@'{i}pica da c@^{a}mera ao objeto de interesse; usada para o posicionamento padr@~{a}o da c@^{a}mera (a c@^{a}mera @'{e} colocada em (X,Y,Z) = (0,0,focus) quando resetada) e para ajustar o campo de vis@~{a}o quando alternando entre os modos de visualiza@,{c}@~{a}o ortogr@'{a}fico e perspectivo. @item raz@~{a}o de aspecto da janela A verdadeira raz@~{a}o de aspecto no sentido /. Essa raz@~{a}o de aspecto normalmente pode concordar com a raz@~{a}o de aspecto da janela de camera. Geomview normalmente ajusta a raz@~{a}o de aspecto de suas c@^{a}meras para coincidir com suas janelas associadas. @item dist@^{a}ncia de plano de corte pr@'{o}ximo e distante Note que ambas as dist@^{a}ncias devem ser estritamente maiores que zero. Raz@~{o}es de dist@^{a}ncia / muito grandes fazem com que a @'{a}rea de armazenamento tempor@'{a}rio do eixo Z comporte-se de forma p@'{e}ssima; parte de um objeto pode ser vis@'{i}vel mesmo se estiver em algum lugar mais distante que outro. @item campo de vis@~{a}o Especificado em uma das duas formas a seguir. @table @samp @item fov @'{e} o campo de vis@~{a}o -- em graus se perpectivo, ou dist@^{a}ncia linear se ortogr@'{a}fico -- na @emph{menor} dire@,{c}@~{a}o. @item halfyfield @'{e} metade do campo projetado no eixo Y, em coordenadas do objeto mundo (n@~{a}o angulo!), em unidades de dist@^{a}ncia a partir da c@^{a}mera. Para uma c@^{a}mera em perpectiva, halfyfield @'{e} relacionado ao campo angular: @center halfyfield = tan( Y_axis_angular_field / 2 ) enquanto para uma c@^{a}mera em vis@~{a}o ortogr@'{a}fica temos simplesmente: @center halfyfield = Y_axis_linear_field / 2 @end table Essa defini@,{c}@~{a}o singular de visualiza@,{c}@~{a}o @'{e} (a) maneira f@'{a}cil de fazer c@'{a}lculos que a envolvam e (b) @'{e} bem definida em ambas as formas de visualiza@,{c}@~{a}o ortogr@'{a}fica e perspectiva. @item cor de fundo Argumentavelmente (de forma discut@'{i}vel) n@~{a}o @'{e} uma propriedade de uma c@^{a}mera, mas da cena (do cen@'{a}rio). Todavia, como n@~{a}o existe o objeto "cordefundo" no OOGL, e a cor de fundo pode n@~{a}o ser uma propriedade do equipamento de desenho, essa propriedade pode ser especificada aqui. No momento em que esse manual est@'{a} sendo escrito, todavia, a interface gr@'{a}fica de usu@'{a}rio (GUI) sempre sobrescreve a cor de fundo com suas pr@'{o}prias escolhas. @item imagem de fundo Pelas mesmas raz@~{o}es mostradas acima,somente a referida GUI n@~{a}o sobrescreve essa op@,{c}@~{a}o. A imagem @'{e} centralizada em "Normalized-Device-Coordinates"/NDC @code{(0,0,-1)}; a imagem n@~{a}o @'{e} redimensonada, apenas dese-nhada por tr@'{a}s de tudo mais como @'{e}. Veja @ref{image, Objetos de imagem}. @end table A sintaxe para uma c@^{a}mera @'{e}: @example ::= [ "camera" ] (palavra chave opcional) [ "@{" ] (abertura de chave, geralmente requerida) [ "define" ] "<" | ":" | (ou qualquer n@'{u}mero dos seguintes, em qualquer ordem@dots{}) "perspective" @{"0" | "1"@} (padr@~{a}o 1) (de outra forma "ortographic") "stereo" @{"0" | "1"@} (padr@~{a}o 0) (de outra forma mono) "worldtocam" (veja a sintaxe de transfor- ma@,{c}@~{a}o acima) "camtoworld" (nenhum ponto na especifica@,{c}@~{a}o de ambos camtoworld e worldtocam; se @'{e} restingido para ser o inverso de the other) "halfyfield" (o padr@~{a}o @'{e} tan 40/2 graus) Nota de tradu@,{c}@~{a}o:40 @'{e} o valor padr@~{a}o do campo de vis@~{a}o (fov). "fov" (campo de vis@~{a}o angular se "perspective", campo de vis@~{a}o linear em caso contr@'{a}rio. Medido em qualquer dire@,{c}@~{a}o @'{e} menor, dando a raz@~{a}o aspecto. Quando a raz@~{a}o de aspecto muda -- e.g. quando uma janela @'{e} reajustada -- "fov" @'{e} preservado.) "frameaspect" (X/Y) (padr@~{a}o 1.333) "near" (padr@~{a}o 0.1) "far" (padr@~{a}o 10.0) "focus" (padr@~{a}o 3.0) "bgcolor" (padr@~{a}o 1/3 1/3 1/3 1) "bgimage" @{ @} (padr@~{a}o nenhuma imagem de fundo) [ "@}" ] (correspondente fechamento de chave) @end example @comment ---------------------------------------------------------------- @node window objects, , Objeto camera, Objetos nao-geometricos @subsection Janela Um objeto janela especifica tamanho, posi@,{c}@~{a}o, e outras informa@,{c}@~{o}es relacionadas ao sistema de janelas sobre uma janela de forma que essas informa@,{c}@~{o}es sejam independentes do dispositivo. A sintaxe de um objeto janela @'{e}: @example nomejanela ::= [ "window" ] (palavra chave opcional) [ "@{" ] (abertura de chave, requerida na maioria das vezes) (qualquer dos seguintes, em qualquer ordem) "size" (tamanho da janela) "position" (posi@,{c}@~{a}o & tamanho) "noborder" (especifica se a janela pode ter ou n@~{a}o uma borda) "pixelaspect" (especifica a raz@~{a}o de aspecto real visualizada de um pixel nessa janela no sentido tamanhox/tamanhoy, normalmente 1.0. Para hardware stereo o qual corta o display verticalmente por um fator de 2, ``pixelaspect 0.5'' pode funcionar. O valor @'{e} usado no c@'{a}lculo da proje@,{c}@~{a}o de uma c@^{a}mera associada a essa janela.) [ "@}" ] (correspondente fechamento de chave) @end example Objetos janela s@~{a}o usados em @code{janelas} do Geomview e em comandos do painel de intera@,{c}@~{a}o/interface com o usu@'{a}rio (@code{ui-panel}) para escolher propriedades padronizadas para futuras janelas ou mudar as mesmas propriedades padronizadas de uma janela existente. Veeja @ref{window, @code{(window @dots{})}}. Veja tamb@'{e}m @ref{ui-panel, @code{(ui-panel @dots{})}}. @comment **************************************************************** @node Customizacao, Modulos, Formatos dos Arquivos da OOGL, Top @chapter Customiza@,{c}@~{a}o: arquivos @file{.geomview} Quando Geomview @'{e} inciado, ele chama e executa comando em um arquivo de inicializa@,{c}@~{a}o dependente do sistema operacional chamado @file{.geomview}. Esse arquivo est@'{a} no subdiret@'{o}rio @file{data} do diret@'{o}rio de distribui@,{c}@~{a}o do Geomview e cont@'{e}m comandos GCL para configurar Geomview de uma forma comum para todos os usu@'{a}rios no sistema. A seguir, Geomview procura o arquivo @file{~/.geomview} (@file{~} corresponde a seu diret@'{o}rio base). Voc@^{e} pode usar esse arquivo para configurar seu pr@'{o}prio comportamento padr@~{a}o do Geomview de forma que ele se ajuste @`{a}s suas prefer@^{e}ncias. Ap@'{o}s a leitura de @file{~/.geomview}, Geomview procura por um arquivo chamado @file{.geomview} no diret@'{o}rio atual. Se tal arquivo existir Geomview l@^{e} esse arquivo, a menos que esse arquivo seja o mesmo que @file{~/.geomview} (o que pode ser o caso se voc@^{e} estiver executando o Geomview a partir de seu diret@'{o}rio base). Voc@^{e} pode usar o @file{.geomview} do diret@'{o}rio atual para criar uma personaliza@,{c}@~{a}o no Geomview espec@'{i}fica para um certo projeto. Voc@^{e} pode usar arquivos @file{.geomview} para controlar todos os tipos de coisa no Geomview. Eles podem conter quaisquer declara@,{c}@~{o}es GCL v@'{a}lidas. Especialmente @'{u}til @'{e} o comando @code{ui-panel} que controla a localiza@,{c}@~{a}o inicial dos pain@'{e}is do Geomview. Para um exemplo veja o arquivo dependente do sistema @file{.geomview} mencionado acima. Veja @ref{GCL}. Veja @ref{ui-panel, @code{(ui-panel @dots{})}}. Uma boa id@'{e}ia colocar juntos todos os comandos que voc@^{e} coloca em um arquivo @file{.geomview} em uma declara@,{c}@~{a}o @code{progn} com o objetivo de fazer com que Geomview execute todos de uma s@'{o} vez. Caso voc@^{e} n@~{a}o fa@,{c}a isso Geomview possivelmente pode executar esses comando sequ@^{e}ncialmente sobre os primeiros poucos ciclos de atualiza@,{c}@~{a}o ap@'{o}s a incializa@,{c}@~{a}o. Para modificar, e.g. a pol@'{i}tica de focaliza@,{c}@~{a}o da janela de c@^{a}mera de forma que ela selecione a pol@'{i}tica de focaliza@,{c}@~{a}o do gerenciador de janela (em lugar de ser ativada quando o cursor do mouse cruza a janela), voc@^{e} pode colocar o seguinte no seu arquivo @file{~/.geomview}: @example (progn (ui-cam-focus focus-change) @dots{} # other stuff ) @end example Voc@^{e} pode colocar qualquer comando @code{GCL} v@'{a}lido nos seus arquivos @file{.geomview}, Veja @ref{GCL}. Veja @ref{progn,@code{(progn @dots{})}}. Veja @ref{ui-cam-focus,@code{(ui-cam-focus @dots{})}}. @comment **************************************************************** @node Modulos, GCL, Customizacao, Top @chapter M@'{o}dulos Externos Um m@'{o}dulo externo @'{e} um programa que interage com Geomview. Um m@'{o}dulo comunica-se com Geomview atrav@'{e}s de GCL e pode controlar qualquer aspecto do Geomview que voc@^{e} possa controlar atrav@'{e}s da interface de usu@'{a}rio do Geomview. Em muitos casos um m@'{o}dulo externo @'{e} um programa especializado que imprementa algum algor@'{i}tmo matem@'{a}tico que cria um objeto geom@'{e}trico que modifica apar@^{e}ncia @`{a} medida que o algor@'{i}tmo progride. O m@'{o}dulo informa ao Geomview da nova apar@^{e}ncia do objeto a cada passo, de forma que o objeto aparenta evoluir com o tempo na janela do Geomview. Dessa modo Geomview serve como um @emph{ferramenta de exibi@,{c}@~{a}o} para o m@'{o}dulo. Um m@'{o}dulo externo pode ser interativo. Esse m@'{o}dulo pode responder a eventos de mouse e a eventos de teclado que ocorram em uma janela do Geomview, dessa forma extendendo a capacidade do Geomview propriamente dito. @menu * Interface:: Como M@'{o}dulos Externos Interagem com Geomview. * Example1:: M@'{o}dulo Externo Simples. * Example2:: M@'{o}dulo Externo Simples com Painel de Controle FORMS. * XForms:: A Biblioteca XForms. * Example3:: M@'{o}dulo Externo com Comunica@,{c}@~{a}o Bi-Direcional. * Example4:: M@'{o}dulo Simples em Tcl/Tk Demonstrando Selecionar. * Module Installation:: Instala@,{c}@~{a}o de M@'{o}dulo. @end menu @node Interface, Example1, Modulos, Modulos @section Como M@'{o}dulos Externos Interagem com o Geomview M@'{o}dulos externos aparecem no navegador de M@'{o}dulos (@emph{Modules}) no painel principal (@emph{Main}) do Geomview. Para executar um m@'{o}dulo, clique no bot@~{a}o esquerdo do mouse sobre a entrada do m@'{o}dulo no navegador. Enquanto o m@'{o}dulo estiver sendo executado, uma linha adicional para aquele m@'{o}dulo ir@'{a} aparecer no navegador. Essa linha inicia-se com um n@'{u}mero entre colch@^{e}tes, que indica o n@'{u}mero de @emph{inst@^{a}ncia} do m@'{o}dulo. (Para alguns m@'{o}dulos faz sentido ter mais de uma inst@^{a}ncia do m@'{o}dulo sendo executado ao mesmo tempo.) Voc@^{e} pode encerrar um m@'{o}dulo externo atrav@'{e}s de um clique sobre sua entrada vermelha de inst@^{a}ncia. Por padr@~{a}o quando Geomview inicia, mostra todos os m@'{o}dulos que tiverem sido insta-lados no seu sistema. Para instru@,{c}@~{o}es sobre intala@,{c}@~{a}o de algum m@'{o}dulo no seu sistema de forma que esse m@'{o}dulo apare@,{c}a no navegador de m@'{o}dulos (@emph{Modules}) toda vez que Geomview estiver sendo executado por algu@'{e}m no seu sistema, veja @ref{Module Installation}. Quando Geomview chama um m@'{o}dulo externo, cria pipes conectados @`{a}s sa@'{i}das e @`{a}s entradas padr@~{a}o do modulo. (Pipes s@~{a}o como arquivos exceto que eles s@~{a}o usados para comunica@,{c}@~{a}o entre programas em lugar de armazenar coisas em um disco.) Geomview interpreta qualquer coisa que o modulo escreve em sua sa@'{i}da padr@~{a}o como um comando GCL. Da mesma forma, Se um m@'{o}dulo externo requisita qualquer dado do Geomview, Geomview escreve aquele dado para a entrada padr@~{a}o do m@'{o}dulo. Dessa forma tudo que um m@'{o}dulo tem de fazer com o objetivo de comunicar-se com Geomview @'{e} escrever comandos para sua sa@'{i}da padr@~{a}o e (opcionalmente) receber dados de sua entrada padr@~{a}o. Note que isso significa que o m@'{o}dulo n@~{a}o pode usar a entrada padr@~{a}o e a sa@'{i}da padr@~{a}o para comunicar-se com o usu@'{a}rio. Se um m@'{o}dulo precisar comunicar-se com o usu@'{a}rio isso pode ser feito ou atrav@'{e}s de um painel de controle nele pr@'{o}prio ou em caso contr@'{a}rio atrav@'{e}s de respostas a certos eventos que esse m@'{o}dulo encontrar como sa@'{i}da vinda do Geomview. @node Example1, Example2, Interface, Modulos @section Exemplo 1: M@'{o}dulo Externo Simples Essa se@,{c}@~{a}o fornece um m@'{o}dulo externo extremamente simples que mostra uma malha oscilando. Para experimentar esse exemplo, fa@,{c}a uma c@'{o}pia do arquivo @file{example1.c} (esse arquivo @'{e} distribu@'{i}do com Geomview no subdiretio @file{doc}) em seu diret@'{o}rio e compile @file{example1.c} com o comando @example cc -o example1 example1.c -lm @end example A seguir coloque a linha @example (emodule-define "Example 1" "./example1") @end example @noindent em um arquivo chamado @file{.geomview} no seu diret@'{o}rio atual. A seguir chame o Geomview; @'{E} importante que voc@^{e} compile o programa exemplo, crie o arquivo @file{.geomview} e chame o Geomview a partir do mesmo diret@'{o}rio. Voc@^{e} pode ver "Example 1" no navegador de m@'{o}dulos (@emph{Modules}) do painel principal (@emph{Main}) do Geomview; clique sobre essa entrada no navegador para iniciar o m@'{o}dulo. Uma superf@'{i}cie deve aparecer na sua janela de c@^{a}mera e deve estar oscilando. Voc@^{e} pode parar o m@'{o}dulo clicando sobre a linha "[1] Example 1" no navegador de m@'{o}dulos (@emph{Modules}). @example @comment #include "example1.c" /* * example1.c: oscillating mesh * * This example module is distributed with the Geomview manual. * If you are not reading this in the manual, see the "External * Modules" chapter of the manual for more details. * * This module creates an oscillating mesh. */ #include #include /* F is the function that we plot */ float F(x,y,t) float x,y,t; @{ float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); @} main(argc, argv) char **argv; @{ int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t, dt; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Geomview setup. We begin by sending the command * (geometry example @{ : foo@}) * to Geomview. This tells Geomview to create a geom called * "example" which is an instance of the handle "foo". */ printf("(geometry example @{ : foo @})\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) @{ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); @} @} /* UpdateMesh sends one mesh iteration to Geomview. This consists of * a command of the form * (read geometry @{ define foo * MESH * ... * @}) * where ... is the actual data of the mesh. This command tells * Geomview to make the value of the handle "foo" be the specified * mesh. */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; @{ int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry @{ define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include #include /* for struct timeval below */ #include "forms.h" /* for FORMS library */ FL_FORM *OurForm; FL_OBJECT *VelocitySlider; float dt; /* F is the function that we plot */ float F(x,y,t) float x,y,t; @{ float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); @} /* SetVelocity is the slider callback procedure; FORMS calls this * when the user moves the slider bar. */ void SetVelocity(FL_OBJECT *obj, long val) @{ dt = fl_get_slider_value(VelocitySlider); @} /* Quit is the "Quit" bot@~{a}o callback procedure; FORMS calls this * when the user cliques the "Quit" bot@~{a}o. */ void Quit(FL_OBJECT *obj, long val) @{ exit(0); @} /* create_form_OurForm() creates the FORMS panel by calling a bunch of * procedures in the FORMS library. This code was generated * automatically by the FORMS designer program; normally this code * would be in a separate file which you would not edit by hand. For * simplicity of this example, however, we include this code here. */ create_form_OurForm() @{ FL_OBJECT *obj; FL_FORM *form; OurForm = form = fl_bgn_form(FL_NO_BOX,380.0,120.0); obj = fl_add_box(FL_UP_BOX,0.0,0.0,380.0,120.0,""); VelocitySlider = obj = fl_add_valslider(FL_HOR_SLIDER,20.0,30.0, 340.0,40.0,"Velocity"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_object_align(obj,FL_ALIGN_TOP); fl_set_call_back(obj,SetVelocity,0); obj = fl_add_button(FL_NORMAL_BUTTON,290.0,75.0,70.0,35.0,"Quit"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_call_back(obj,Quit,0); fl_end_form(); @} main(argc, argv) char **argv; @{ int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t; int fdmask; static struct timeval timeout = @{0, 200000@}; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Forms panel setup. */ foreground(); create_form_OurForm(); fl_set_slider_bounds(VelocitySlider, 0.0, 1.0); fl_set_slider_value(VelocitySlider, dt); fl_show_form(OurForm, FL_PLACE_SIZE, TRUE, "Example 2"); /* Geomview setup. */ printf("(geometry example @{ : foo @})\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) @{ fdmask = (1 << fileno(stdin)) | (1 << qgetfd()); select(qgetfd()+1, &fdmask, NULL, NULL, &timeout); fl_check_forms(); UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); @} @} /* UpdateMesh sends one mesh iteration to Geomview */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; @{ int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry @{ define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include "lisp.h" /* We use the OOGL lisp library */ #include "pickfunc.h" /* for PICKFUNC below */ #include "3d.h" /* for 3d geometry library */ /* boxstring gives the OOGL data to define the little box that * we draw at the pick point. NOTE: It is very important to * have a newline at the end of the OFF objeto in this string. */ char boxstring[] = "\ INST\n\ transform\n\ .04 0 0 0\n\ 0 .04 0 0\n\ 0 0 .04 0\n\ 0 0 0 1\n\ geom\n\ OFF\n\ 8 6 12\n\ \n\ -.5 -.5 -.5 # 0 \n\ .5 -.5 -.5 # 1 \n\ .5 .5 -.5 # 2 \n\ -.5 .5 -.5 # 3 \n\ -.5 -.5 .5 # 4 \n\ .5 -.5 .5 # 5 \n\ .5 .5 .5 # 6 \n\ -.5 .5 .5 # 7 \n\ \n\ 4 0 1 2 3\n\ 4 4 5 6 7\n\ 4 2 3 7 6\n\ 4 0 1 5 4\n\ 4 0 4 7 3\n\ 4 1 2 6 5\n"; progn() @{ printf("(progn\n"); @} endprogn() @{ printf(")\n"); fflush(stdout); @} Initialize() @{ extern LObject *Lpick(); /* This is defined by PICKFUNC below but must */ /* be used in the following LDefun() call */ LInit(); LDefun("pick", Lpick, NULL); progn(); @{ /* Define handle "littlebox" for use later */ printf("(read geometry @{ define littlebox @{ %s @}@})\n", boxstring); /* Express interest in pick events; see Geomview manual for explanation. */ printf("(interest (pick world * * * * nil nil nil nil nil))\n"); /* Define "pick" objeto, initially the empty list (= null objeto). * We replace this later upon receiving a pick event. */ printf("(geometry \"pick\" @{ LIST @} )\n"); /* Make the "pick" objeto be non-pickable. */ printf("(pickable \"pick\" no)\n"); /* Turn off normalization, so that our pick objeto will appear in the * right place. */ printf("(normalization \"pick\" none)\n"); /* Don't draw the pick objeto's bounding box. */ printf("(bbox-draw \"pick\" off)\n"); @} endprogn(); @} /* The following is a macro call that defines a procedure called * Lpick(). The reason for doing this in a macro is that that macro * encapsulates a lot of necessary stuff that would be the same for * this procedure in any program. If you write a Geomview module that * wants to know about user pick events you can just copy this macro * call and change the body to suit your needs; the body is the last * argument to the macro and is delimited by curly braces. * * The first argument to the macro is the name of the procedure to * be defined, "Lpick". * * The next two arguments are numbers which specify the sizes that * certain arrays inside the body of the procedure should have. * These arrays are used for storing the face and path information * of the picked objeto. In this module we don't care about this * information so we declare them to have length 1, the minimum * allowed. * * The last argument is a block of code to be executed when the module * receives a pick event. In this body you can refer to certain local * variables that hold information about the pick. For details see * Example 3 in the Extenal Modules chapter of the Geomview manual. */ PICKFUNC(Lpick, 1, 1, @{ handle_pick(pn>0, &point, vn>0, &vertex, en>0, edge); @}, /* version for picking Nd-objects (not documented here) */) handle_pick(picked, p, vert, v, edge, e) int picked; /* was something actually picked? */ int vert; /* was the pick near a vertex? */ int edge; /* was the pick near an edge? */ HPoint3 *p; /* coords of pick point */ HPoint3 *v; /* coords of picked v@'{e}rtice */ HPoint3 e[2]; /* coords of endpoints of picked edge */ @{ Normalize(&e[0]); /* Normalize makes 4th coord 1.0 */ Normalize(&e[1]); Normalize(p); progn(); @{ if (!picked) @{ printf("(geometry \"pick\" @{ LIST @} )\n"); @} else @{ /* * Put the box in place, and color it magenta if it's on a v@'{e}rtice, * yellow if not. */ printf("(xform-set pick @{ 1 0 0 0 0 1 0 0 0 0 1 0 %g %g %g 1 @})\n", p->x, p->y, p->z); printf("(geometry \"pick\"\n"); if (vert) printf("@{ appearance @{ material @{ diffuse 1 0 1 @} @}\n"); else printf("@{ appearance @{ material @{ diffuse 1 1 0 @} @}\n"); printf(" @{ LIST @{ :littlebox @}\n"); /* * If it's on an edge and not a vertex, mark the edge * with cyan boxes at the endpoins and a black line * along the edge. */ if (edge && !vert) @{ e[0].x -= p->x; e[0].y -= p->y; e[0].z -= p->z; e[1].x -= p->x; e[1].y -= p->y; e[1].z -= p->z; printf("@{ appearance @{ material @{ diffuse 0 1 1 @} @}\n\ LIST\n\ @{ INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox @}\n\ @{ INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox @}\n\ @{ VECT\n\ 1 2 1\n\ 2\n\ 1\n\ %f %f %f\n\ %f %f %f\n\ 1 1 0 1\n\ @}\n\ @}\n", e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z, e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z); @} printf(" @}\n @}\n)\n"); @} @} endprogn(); @} Normalize(HPoint3 *p) @{ if (p->w != 0) @{ p->x /= p->w; p->y /= p->w; p->z /= p->w; p->w = 1; @} @} main() @{ Lake *lake; LObject *lit, *val; extern char *getenv(); Initialize(); lake = LakeDefine(stdin, stdout, NULL); while (!feof(stdin)) @{ /* Parse next lisp expression from stdin. */ lit = LSexpr(lake); /* Evaluate that expression; this is where Lpick() gets called. */ val = LEval(lit); /* Free the two expressions from above. */ LFree(lit); LFree(val); @} @} @comment #end include @end example The code begins by defining procedures @code{progn()} and @code{endprogn()} which begin and end a Geomview @code{progn} group. The purpose do Geomview @code{progn} command is to group commands together and cause Geomview to execute them all at once, without refreshing any graphics windows until the end. It is a good idea to group blocks of commands that a module sends to Geomview like this so that the user sees their cumulative effect all at once. Procedure @code{Initialize()} does various things needed at program startup time. It initializes the lisp library by calling @code{LInit()}. Any program that uses the lisp library should call this once before calling any other lisp library functions. It then calls @code{LDefun} to tell the library about our @code{pick} procedure, which is defined further down with a call to the @code{PICKFUNC} macro. Then it sends a bunch of setup commands to Geomview, grouped in a @code{progn} block. This includes defining a handle called @code{littlebox} that stores the geometry da little box. Next it sends the command @example (interest (pick world * * * * nil nil nil nil nil)) @end example @noindent which tells Geomview to notify us when a pick event happens. The syntax of this @code{interest} statement merece some explanation. In general @code{interest} takes one argument which is a (parenthesized) expression representing a Geomview function call. It especifica a type of call that the module is interested in knowing about. The arguments can be any particular argument values, ou the special symbols @code{*} or @code{nil}. For example, the first argument in the @code{pick} expression above is @code{world}. This means that the module is interested in calls to @code{pick} where the first argument, which especifica the coordinate system, is @code{world}. A @code{*} is like a wild-card; it means that the module is interested in calls where the corresponding argument has any value. The word @code{nil} is like @code{*}, except that the argument's value is not reported to the module. This is useful for cutting down on the amount of data that must be transmitted in cases where there are arguments that the module doesn't care about. The second, third, fourth, and fifth arguments to the @code{pick} command give the name, pick point coordenadas, coordenadas do v@'{e}rtice, and edge coordenadas of a pick event. We specify these by @code{*}'s above. The remaining five arguments to the @code{pick} command give other information about the pick event that we do not care about in this module, so we specify these with @code{nil}'s. For the details dos arguments to @code{pick}, @xref{GCL}. The @code{geometry} statement defines a geom called @code{pick} that is initially an empty list, specified as @code{ @{ LIST @} }; this is the best way of specifying a null geom. The module will replace this with something useful by sending Geomview another @code{geometry} command when the user picks something. Next we arrange for the @code{pick} objeto to be non-pickable, and turn normalization off for it so that Geomview will display it in the size and location where we put it, rather than resizing and relocating it to fit into the unit cube. The next function in the file, @code{Lpick}, is defined with a strange looking call to a macro called @code{PICKFUNC}, defined in the header file @file{pickfunc.h}. This is the function for handling pick events. The reason we provide a macro for this is that that macro encapsulates a lot of necessary stuff that would be the same for the pick-handling function in any program. If you write a Geomview module that wants to know about user pick events you can just copy this macro call and change it to suit yours needs. In general the syntax for @code{PICKFUNC} is @example PICKFUNC(@var{name}, @var{block}, @var{NDblock}) @end example @noindent where @var{name} is the name do procedure to be defined, in this case @code{Lpick}. The next argument, @var{block}, is a block of code to be executed when a pick event occurs. If @var{block} contains a return statement, then the returned value must be a pointer to a Lisp-objeto, that is of type @code{LObject *}. The last argument has the same functionality as the @var{block} argument, but is only invoked when picking objetos in a higher dimensional world. @code{PICKFUNC} declares certain local variables in the body do procedure. When the module receives a @code{(pick @dots{})} statement from Geomview, the procedure assigns values to these variables based on the information in the @code{pick} call (variables corresponding to @code{nil}'s in the @code{(interest (pick @dots{}))} are not given values). There is also a second variant da @code{PICKFUNC} macro with a slightly different syntax: @example DEFPICKFUNC(@var{helpstr}, @var{coordsys}, @var{id}, @var{point}, @var{pn}, @var{vertex}, @var{vn}, @var{edge}, @var{en}, @var{face}, @var{fn}, @var{ppath}, @var{ppn}, @var{vi}, @var{ei}, @var{ein}, @var{fi}, @var{body}, @var{NDbody}) @end example @code{DEFPICKFUNC} can be used as well as @code{PICKFUNC}, there is no functional differene with the exception that the name da C-function is tied to @code{Lpick} when using @code{DEFPICKFUNC} and that the @code{(help pick)} GCL-command (@pxref{help, @code{(help @dots{})}}) would respond with echoing @var{helpstr}. The table below lists all variables defined in @code{PICKFUNC} In the context of ND-viewing @code{float} variants dos arguments apply: the @var{body} execution block sees the @code{HPoint3} variables, and the @var{NDbody} block sees only flat one-dimensional arrays of @code{float}-type. In the ND-viewing context the co-ordinates passed to the pick function are still the 3-dimensional co-ordinates da c@^{a}mera view-port where the pick occurred, but padded with zeroes on transformed back to the co-ordinate system specified by the second argument do @code{pick} command. @table @asis @item @code{char *coordsys;} A string specifying the coordinate system in which coordenadas are given. In this example, this will always be @code{world} because do @code{interest} call above. @item @code{char *id;} A string specifying the name do picked geom. @item @code{HPoint3 point; int pn;} @item @code{float *point; int pn;} @code{point} is an @code{HPoint3} structure giving the coordenadas of the picked point. @code{HPoint3} is a homogeneous point coordinate representation equivalent to an array of 4 floats. @code{pn} tells how many coordenadas have been written into this array; it will always be either @code{0}, @code{4} ou greater than @code{4}. If it is greater than @code{4}, then the @var{NDbody} instruction block is invoked and in this case @code{point} is a flat array of @code{pn} many @code{float}s. A value of zero means no point was picked, i.e. the user clicado the bot@~{a}o direito do mouse while the cursor was not pointing at a geom. In this case the ordinary @var{block} 3d instruction block is executed. @item @code{HPoint3 vertex; int vn;} @item @code{float *vertex; int vn;} @code{vertex} is an @code{HPoint3} structure giving the coordenadas of the v@'{e}rtice selecionado, if the pick point was near a v@'{e}rtice. @code{vn} tells how many coordenadas have been written into this array; it will always be either @code{0} ou greater equal @code{4}. A value of zero means the pick point was not near a v@'{e}rtice. In the context of ND-viewing @code{vertex} will be an array of @code{vn} @code{float}s and @code{vn} will be equal to @code{pn}. @item @code{HPoint3 edge[2]; int en;} @item @code{float *edge; int en;} @code{edge} is an array of two @code{HPoint3} structures giving the coordenadas do endpoints da picked edge, if the pick point was near an edge. @code{en} tells how many coordenadas have been written into this array; it will always be @code{0} ou greater equal @code{8}. A value of zero means the pick point was not near an edge. In the context of ND-viewing @code{edge} will be a flat one-dimensional array of @code{en} many @code{float}s: the first @code{pn} @code{float}s define the first v@'{e}rtice, and the second @code{pn} many @code{float}s define the second v@'{e}rtice; @code{en} will be two times @code{pn}. @end table In this example module, the remaining variables will never be given values because their values in the @code{interest} statement were specified as @code{nil}. @table @asis @item @code{HPoint3 face[]; int fn;} @item @code{float *face; int fn;} @code{face} is a variable length array of @var{fn} @code{HPoint3}'s. @code{face} gives the coordenadas dos v@'{e}rtices da picked face. @code{fn} tells how many coordenadas have been written into this array; it will always be either @code{0} ou a multiple of @code{pn}. A value of zero means the pick point was not near a face. In the context of ND-viewing @code{face} is a flat one-dimensional array of @code{fn} many floats of which each v@'{e}rtice occupies @code{pn} many componentes. @item @code{int ppath[]; int ppn;} @code{ppath} is an array of @var{maxpathlen} @code{int}'s. @code{ppath} gives the path through the OOGL heirarchy to the picked primitive. @code{pn} tells how many integers have been written into this array; it will be at most @var{maxpathlen}. A path of @{3,1,2@}, for example, means that the picked primitive is "subobjeto number 2 of subobjeto number 1 of objeto 3 in the world". @item @code{int vi;} @code{vi} gives the index do v@'{e}rtice selecionado in the picked primitive, if the pick point was near a v@'{e}rtice. @item @code{int ei[2]; int ein} The @code{ei} array gives the indices dos endpoints da picked edge, if the pick point was near a v@'{e}rtice. @code{ein} tells how many integers were written into this array. It will always be either 0 ou 2; a value of 0 means the pick point was not near an edge. @item @code{int fi;} @code{fi} gives the index da picked face in the picked primitive, if the pick point was near a face. @end table The @code{handle_pick} procedure actually does the work of dealing with the pick event. It begins by normalizing the homogeneous coordenadas passed in as arguments so that we can assume the fourth coordinate is 1. It then sends GCL commands to define the @code{pick} objeto to be whatever is appropriate for the kind of pick recieved. Veja @ref{Formatos dos Arquivos da OOGL}, and veja @ref{GCL}, for an explanation do format dos data in these commands. The main program, at the bottom do file, first calls @code{Initialize()}. Next, the call to @code{LakeDefine} defines the @code{Lake} that the lisp library will use. A @code{Lake} is a structure that the lisp library uses internally as a type of communiation vehicle. (It is like a unix stream but more general, hence the name.) This call to @code{LakeDefine} defines a @code{Lake} structure for doing I/O with @code{stdin} and @code{stdout}. The third argument to @code{LakeDefine} should be @code{NULL} for external modules (it is used by Geomview). Finally, the program enters its main loop which parses and evaluates expressions from standard input. @comment **************************************************************** @node Example4, Module Installation, Example3, Modulos @section Example 4: Simple Tcl/Tk Module Demonstrating Picking It's not necessary to write a Geomview module in C. The only requirement of an external module is that it send GCL commands to its standard output and expect responses (if any) on its standard input. An external module can be written in C, perl, tcl/tk, ou pretty much anything. As an example, assuming you have Tcl/Tk version 4.0 ou later, here's an external module with a simple GUI which demonstrates interaction with geomview. This manual doesn't discuss the Tcl/Tk language; see the good book on the subjeto by its originator John Ousterhout, published by Addison-Wesley, titled @emph{Tcl and the Tk Toolkit}. The @samp{#!} on the script's first line causes the system to interpret the script using the Tcl/Tk @samp{wish} program; you might have to change its first line if that's in some location other than /usr/local/bin/wish4.0. Or, you could define it as a module using @example (emodule-define "Pick Demo" "wish pickdemo.tcl") @end example in which case @samp{wish} could be anywhere on the UNIX search path. @example #! /usr/local/bin/wish4.0 # We use "fileevent" below to have "readsomething" be called whenever # data is available from standard input, i.e. when geomview has sent us # something. It promises to include a trailing newline, so we can use # "gets" to read the geomview response, then parse its nested parentheses # into tcl-friendly @{@} braces. proc readsomething @{@} @{ if @{[gets stdin line] < 0@} @{ puts stderr "EOF on input, exiting..." exit @} regsub -all @{\(@} $line "\@{" line regsub -all @{\)@} $line "\@}" line # Strip outermost set of braces set stuff [lindex $line 0] # Invoke handler for whichever command we got. Could add others here, # if we asked geomview for other kinds of data as well. switch [lindex $stuff 0] @{ pick @{handlepick $stuff@} rawevent @{handlekey $stuff@} @} @} # Fields of a "pick" response, from geomview manual: # (pick COORDSYS GEOMID G V E F P VI EI FI) # The pick command is executed internally in response to pick # events (right mouse double clique). # # COORDSYS = coordinate system in which coordenadas of the following # arguments are specified. This can be: # world: world coord sys # self: coord sys of the picked geom (GEOMID) # primitive: coord sys of the actual primitive within # the picked geom where the pick occurred. # GEOMID = id of picked geom # G = picked point (actual intersection of pick ray with objeto) # V = picked vertex, if any # E = picked edge, if any # F = picked face # P = path to picked primitive [0 ou more] # VI = index of picked v@'{e}rtice in primitive # EI = list of indices of endpoints of picked edge, if any # FI = index of picked face # Report when user picked something. # proc handlepick @{pick@} @{ global nameof selvert seledge order set obj [lindex $pick 2] set xyzw [lindex $pick 3] set fv [lindex $pick 6] set vi [lindex $pick 8] set ei [lindex $pick 9] set fi [lindex $pick 10] # Report result, converting 4-component homogeneous point into 3-space point. set w [lindex $xyzw 3] set x [expr [lindex $xyzw 0]/$w] set y [expr [lindex $xyzw 1]/$w] set z [expr [lindex $xyzw 2]/$w] set s "$x $y $z " if @{$vi >= 0@} @{ set s "$s vertex #$vi" @} if @{$ei != @{@}@} @{ set s "$s edge [lindex $ei 0]-[lindex $ei 1]" @} if @{$fi != -1@} @{ set s "$s face #$fi ([expr [llength $fv]/3]-gon)" @} msg $s @} # Having asked for notification of these raw events, we report when # the user pressed these keys in the geomview graphics windows. proc handlekey @{event@} @{ global lastincr switch [lindex $event 1] @{ 32 @{msg "Pressed space bar"@} 8 @{msg "Pressed backspace key"@} @} @} # # Display a message on the control panel, and on the terminal where geomview # was started. We use ``puts stderr @dots{}'' rather than simply ``puts @dots{}'', # since Geomview interprets anything we send to standard output # as a GCL command! # proc msg @{str@} @{ global msgtext puts stderr $str set msgtext $str update @} # Load objeto from file proc loadobject @{fname@} @{ if @{$fname != ""@} @{ puts "(geometry thing < $fname)" # Be sure to flush output to ensure geomview receives this now! flush stdout @} @} # Build simple "user interface" # The message area could be a simple label rather than an entry box, # but we want to be able to use X selection to copy text from it. # The default mouse bindings do that automatically. entry .msg -textvariable msgtext -width 45 pack .msg frame .f label .f.l -text "File to load:" pack .f.l -side left entry .f.ent -textvariable fname pack .f.ent -side left -expand true -fill x bind .f.ent @{ loadobject $fname @} pack .f # End UI definition. # Call "readsomething" when data arrives from geomview. fileevent stdin readable @{readsomething@} # Geomview initialization puts @{ (interest (pick primitive)) (interest (rawevent 32)) # Be notified when user presses space (interest (rawevent 8)) # ou backspace keys. (geometry thing < hdodec.off) (normalization world none) @} # Flush to ensure geomview receives this. flush stdout wm title . @{Sample external module@} msg "Click right mouse in graphics window" @end example @comment **************************************************************** @node Module Installation, , Example4, Modulos @section Module Installation Essa se@,{c}@~{a}o diz como instalar um m@'{o}dulo externo de forma que voc@^{e} possa invoc@'{a}-lo dentro do Geomview. Existem duas maneiras de instalar um m@'{o}dulo: voc@^{e} pode installar um m@'{o}dulo @emph{privado} de forma que o m@'{o}dulo esteja dispon@'{i}vel somente para voc@^{e} mesmo sempre que executar o Geomview, ou voc@^{e} pode instalar um m@'{o}dulo de @emph{sistema} de forma que o m@'{o}dulo esteja dispon@'{i}vel para todos os usu@'{a}rios do seu sistema sempre que eles executarem o Geomview. @menu * Private Module Installation:: M@'{o}dulos para um @'{U}nico Usu@'{a}rio. * System Module Installation:: M@'{o}dulos para Todos os Usu@'{a}rio do Sistema. @end menu @comment ---------------------------------------------------------------- @node Private Module Installation, System Module Installation, Module Installation, Module Installation @subsection Private Module Installation O comando @code{emodule-define} providencia que um m@'{o}dulo apare@,{c}a no navegador de m@'{o}dulos (@emph{Modules}) do Geomview. O comando recebe dois arumentos que s@~{a}o sequ@^{e}ncias de caractere; o primeiro @'{e} o nome que ir@'{a} aparecer no navegador de m@'{o}dulos (@emph{Modules}). O segundo @'{e} o comando de shell para executar o m@'{o}dulo; esse nome de shell pode incluir argumentos (veja @ref{emodule-define,@code{(emodule-define @dots{})}}). Geomview executa esse comando em um subshell quando voc@^{e} d@'{a} um clique sobre a entrada do m@'{o}dulo no navegador. Por exemplo @example (emodule-define "Foo" "/u/home/modules/foo -x") @end example @noindent adiciona uma linha rotulada "Foo" ao navegador de m@'{o}dulos (@emph{Modules}) o qual faz com que o comando "/u/home/modules/foo -x" seja executado quando selecionado. Voc@^{e} pode colocar comandos @code{emodule-define} no seu arquivo @file{~/.geomview} para providenciar que certos m@'{o}dulos estejam dispon@'{i}veis sempre que voc@^{e} execute Geomview; veja @ref{Customizacao}. voc@^{e} pode tamb@'{e}m executar comandos @code{emodule-define} a partir do painel de comandos (@emph{Commands}) para adicionar um m@'{o}dulo a uma c@'{o}pia do Geomview que j@'{a} esteja sendo executada. Existem muitos outros comandos GCL para controlar as entradas no navegador de m@'{o}dulos (@emph{Modules}); para detalhes, veja @ref{GCL}. @comment ---------------------------------------------------------------- @node System Module Installation, , Private Module Installation, Module Installation @subsection System Module Installation Para instalar um m@'{o}dulo de forma que esse m@'{o}dulo esteja dispon@'{i}vel para todos os usu@'{a}rios do Geomview fa@,{c}a o seguinte @table @asis @item 1. Crie um arquivo chamado @file{.geomview-@var{m@'{o}dulo}} @file{@var{m@'{o}dulo}} @'{e} o nome do m@'{o}dulo. Esse arquivo deve conter uma linha simples que @'{e} um comando @code{emodule-define} para aquele m@'{o}dulo: @example (emodule-define "Novo M@'{o}dulo" "novomodulo") @end example O primeiro argumento, @code{"Novo M@'{o}dulo"} acima, @'{e} a sequ@^{e}ncia de caracteres que ir@'{a} aparecer no navegador de m@'{o}dulo (@emph{Modules}). A segunda sequ@^{e}ncia de caracteres, @code{"novomodulo"} acima, @'{e} o comando de Bourne shell para invocar o m@'{o}dulo. Esse comando de shell pode incluir argumentos, e voc@^{e} pode assumir que o m@'{o}dulo encontra-se localizado em $PATH que representa os locais de busca do shell. @item 2. Coloque uma c@'{o}pia do @file{.geomview-@var{m@'{o}dulo}} e o execut@'{a}vel do m@'{o}dulo propriamente dito no diret@'{o}rio @file{/usr/local/libexec/geomview}. @end table Ap@'{o}s esses passos, o novo m@'{o}dulo deve aparecer, em ordem alfab@'{e}tica, no navegador de m@'{o}dulos (@emph{Modules}) do Geomview do painel principal (@emph{Main}) da pr@'{o}xima vez que o Geomview for inicializado. A raz@~{a}o desse trabalho @'{e} que quando Geomview for invocado processar@'{a} todos os arquivos @file{.geomview-*} em seu diret@'{o}rio de @file{m@'{o}dulos}. Geomview tamb@'{e}m lembra o caminho desse diret@'{o}rio e coloca aquele caminho em $PATH do shell no qual Geomview invoca tal m@'{o}dulo. @comment **************************************************************** @node GCL, Geometrias Nao-Euclidianas, Modulos, Top @chapter GCL: a Linguagem de Comandos do Geomview GCL tem a sintaxe do lisp -- i.e. uma express@~{a}o da forma (f a b @dots{}) significa informar os vallores de a, b, @dots{} para a fun@,{c}@~{a}o f. GCL @'{e} muito limitado e GCL n@~{a}o @'{e} de forma alguma uma implementa@,{c}@~{a}o de lisp. GCL @'{e} simplesmente uma linguagem para expressar comandos que s@~{a}o executados na ordem fornecida, ao contr@'{a}rio de uma linguagem de programa@,{c}@~{a}o. GCL n@~{a}o suporta vari@'{a}vel ou defini@,{c}@~{a}o de fun@,{c}@~{a}o. GCL @'{e} a linguagem que Geomview entende para arquivos que chama bem como para comunica@,{c}@~{a}o com outros programas. Para executar um comando GCL interativamente, voc@^{e} pode trazer o painel de comandos (@emph{Commands}) que tr@'{a}s sua digita@,{c}@~{a}o em um comando; Geomview executa o comando quando voc@^{e} pressiona a tecla @key{Enter}. A sa@'{i}da de tais comandos @'{e} mostrada na sa@'{i}da padr@~{a}o. Alternativamente, voc@^{e} pode invocar Geomview com @code{geomview -c -} que faz com que o Geomview leia comandos GCL a partir da entrada padr@~{a}o. Fun@,{c}@~{o}es GCL retornam um valor, e voc@^{e} pode concaenar chamadas de fun@,{c}@~{a}o de forma que outras fun@,{c}@~{o}es usem esse valor retornado. Por exemplo @example (f (g a b)) @end example avalia @code{(g a b)} e ent@~{a}o avalia @code{(f x)} onde @code{x} @'{e} o resultado retornado por @code{(g a b)}. Geomview mant@'{e}m esses valores de retorno internamente normalmente n@~{a}o fornece sa@'{i}da alguma com os resultados guardados. Para mostrar um valor de retorno esse valor de retorno deve ser fornecido @`{a} fun@,{c}@~{a}o @code{echo}. Por exemplo a fun@,{c}@~{a}o @code{geomview-version} retorna uma sequ@^{e}ncia de caracteres representado a vers@~{a}o do Geomview que est@'{a} sendo executada, e @example (echo (geomview-version)) @end example mostra essa sequ@^{e}ncia de caracteres. Muitas fun@,{c}@~{a}o simplesmente retornam @code{t} ( de "true" - verdadeiro) caso tenham sido executadas como esperado ou @code{nil} ( nenhum ) em caso de falha; esse @'{e} o caso se a documenta@,{c}@~{a}o para a fun@,{c}@~{a}o n@~{a}o fornece o retorno esperado. Esses s@~{a}o os s@'{i}mbolos do lisp para verdadeiro e falso, respectivamente. (Eles correspondem @`{a}s vari@'{a}veis definidas em C @code{Lt} e @code{Lnil} que voc@^{e} ver@'{a} se olhar no c@'{o}digo fonte do Geomview ou em algum dos m@'{o}dulos externos.) Nas descri@,{c}@~{o}es ds comandos acima muitas refer6encias s@~{a}o feitas a formatos "OOGL" formats. OOGL @'{e} a linguagem de descri@,{c}@~{a}o dos dados que Geomview utiliza para descrever objetos geom@'{e}tricos, c@^{a}meras, apar@^{e}ncias, e outos objetos b@'{a}sicos. Para detalhes dos formatos OOGL, veja @ref{Formatos dos Arquivos da OOGL}. (Ou equivalentemente, veja a p@'{a}gina de manual oogl(5), distributed with Geomview in the file /share/man/man5/oogl.5gv. Os comandos GCL e tipos de argumentos s@~{a}o listados abaixo. A maioria da documenta@,{c}@~{a}o nessa se@,{c}@~{a}o do manual est@'{a} dispon@'{i}vel dentro do Geomview via comandos @code{?} e @code{??}. O comando @code{(? @var{comando})} faz com que Geomview mostre na tela um sum@'{a}rio de uma linha da sintaxe de @var{comando}, e @code{(?? @var{comando})} mostra na tela uma explana@,{c}@~{a}o de o que @var{comando} faz. Voc@^{e} pode incluir o caractere coringa @code{*} no @var{comando} para mostrar informa@,{c}@~{o}es para um frupo de comandos coincidindo com um modelo. Por exemplo, @code{(?? *emodule*)} ir@'{a} mostrar todas as informa@,{c}@~{o}es sobre todos os comandos contendo a sequ@^{e}ncia de caracteres @code{emodule}. @code{(? *)} ir@'{a} mostrar um lista curta de todos os comandos. @menu * Argument Conventions:: Conven@,{c}@~{o}es usadas ao se descrever tipos de argumentos. * GCL Reference:: Documenta@,{c}@~{a}o para cada comandoo GCL. @end menu @node Argument Conventions, GCL Reference, GCL, GCL @section Conventions Used In Describing Argument Types Os seguintes s@'{i}mbolos s@~{a}o usados para descrever tipos de argumentos na documenta@,{c}@~{a}o para fun@,{c}@~{o}es GCL. @table @code @item @var{apar@^{e}ncia} @'{e} uma especifica@,{c}@~{a}o de apar@^{e}ncia OOGL. @item @var{cam-id} @'{e} uma @var{id}entifica@,{c}@~{a}o que refre-se a uma c@^{a}mera. @item @var{c@^{a}mera} @'{e} uma especifica@,{c}@~{a}o de c@^{a}mera do OOGL. @item @var{geom-id} @'{e} uma @var{id}entifica@,{c}@~{a}o que se refere a um objeto geom@'{e}trico. @item @var{geometry} @'{e} uma especifica@,{c}@~{a}o de objeto geom@'{e}trico do OOGL. @item @var{id} @'{e} uma sequ@^{e}ncia de caracteres que nomeia um objeto geom@'{e}trico ou c@^{a}mera. Como aqueles que voc@^{e} cria, os valores permitidos s@~{a}o: @table @code @item @code{World, world, worldgeom, g0} a cole@,{c}@~{a}o de todos os objetos geom@'{e}tricos @item target objeto alvo selecionado (c@^{a}mera ou objeto geom@'{e}trico) @item center objeto central do movimento selecionado @item targetcam a @'{u}ltima c@^{a}mera alvo selecionada @item targetgeom o @'{u}ltimo objeto geom@'{e}trico alvo selecionado @item focus c@^{a}mera onde o cursor est@'{a} (ou mais recentemente esteve) @item allgeoms todos os objetos geom@'{e}tricos @item allcams todas as c@^{a}meras @item @code{default, defaultcam, prototype} c@^{a}meras futuras que herdar@~{a}o as escolhas padronizadas @end table As seguintes @var{id}s s@~{a}o usadas para nomear sistemas de coordenadas, e.g. em comandos @code{pick} e @code{write}: @table @code @item @code{World, world, worldgeom, g0} o objeto mundo, dentro do qual todos os objetos geom@'{e}tricos vivem. @item universe o universo, no qual o no qual o objeto mundo, as luzes e as c@^{a}meras vivem. Transforma@,{c}@~{o}es world2cam das c@^{a}meras podem melhor serem chamadas universe2cam, etc. @item self "esse objeto do Geomview". Transforma de um objeto para @code{si mesmo} @'{e} a identidade; escrevendo seu objeto geom@'{e}trico fornece o bojeto em si mesmo sem executar nenhuma transforma@,{c}@~{a}o; pontos selecionados aparecem nas coordenadas do objeto. @item primitive (para objetos selecionados (@code{pick}) somente) Pontos selecionados aparecem no sistema de coordenadas da primitiva de menor n@'{i}vel do OOGL. @end table Um nome tamb@'{e}m @'{e} uma @code{id}entifica@,{c}@~{a}o aceit@'{a}vel. Fornecimento de nomes @'{e} feito @'{u}nico pela anexa@,{c}@~{a}o de n@'{u}meros se necess@'{a}rio (i.e. @code{foo<2>}). Todo objeto geom@'{e}trico @'{e} tamb@'{e}m chamado g[n] e toda c@^{a}mera @'{e} tamb@'{e}m chamada c[n] (@code{g0} @'{e} sempre o objeto geom@'{e}trico mundo - worldgeom): esse nome @'{e} usado como um prefixo a comandos de teclado e pode tamb@'{e}m ser usado como uma identifica@,{c}@~{a}o GCL. N@'{u}meros s@~{a}o usados ap@'{o}s um objeto ser deletado. Ambos os nomes s@~{a}o mostrados no navegador de Objeto. @item @var{declara@,{c}@~{a}o} representa uma chamada de fun@,{c}@~{a}o. Chamadas a fun@,{c}@~{o}es possuem a forma @code{(func arg1 arg2 @dots{} )}, onde @code{func} @'{e} o nome da fun@,{c}@`{a}o e @code{arg1}, @code{arg2}, @dots{} s@~{a}o os argumentos. @item @var{transforma@,{c}@~{a}o} @'{e} uma matriz de transforma@,{c}@~{a}o OOGL 4x4. @item @var{ntransform} @'{e} uma matriz de transforma@,{c}@~{a}o OOGL (N+1)x(N+1). @item @var{janela} @'{e} uma especifica@,{c}@~{a}o de janela do OOGL. @end table @node GCL Reference, , Argument Conventions, GCL @section GCL Reference Guide @c @table @code @menu * shell-shortcut:: @code{(! COMANDOSHELL)} * lt:: @code{(< EXPR1 EXPR2)} * eq:: @code{(= EXPR1 EXPR2)} * gt:: @code{(> EXPR1 EXPR2)} * mul:: @code{(* EXPR1 EXPR2)} * div:: @code{(/ EXPR1 EXPR2)} * add:: @code{(+ EXPR1 EXPR2)} * sub:: @code{(- EXPR1 EXOR2)} * help-shortcut:: @code{(? COMANDO)} * morehelp-shortcut:: @code{(?? COMANDO)} * emodule-run-shortcut:: @code{(| NOME)} * all:: @code{(all objetogeom@'{e}trico|c@^{a}mera|emodule)} * and:: @code{(and EXPR1 EXPR2)} * ap-override:: @code{(ap-override [on|off])} * backcolor:: @code{(backcolor CAM-ID R G B)} * background-image:: @code{(background-image CAM-ID [NOMEDOARQUIVO])} * bbox-color:: @code{(bbox-color GEOM-ID R G B)} * bbox-draw:: @code{(bbox-draw GEOM-ID [yes|no])} * camera:: @code{(camera CAM-ID [CAMERA])} * camera-draw:: @code{(camera-draw CAM-ID [yes|no])} * camera-prop:: @code{(camera-prop @{ geometry object @} [projective])} * camera-reset:: @code{(camera-reset CAM-ID)} * car:: @code{(car LISTA)} * cdr:: @code{(cdr LISTA)} * clock:: @code{(clock)} * command:: @code{(command ARQENTRADA [ARQSAIDA])} * cons:: @code{(cons EXPR LISTA)} * copy:: @code{(copy [ID] [nome])} * cursor-still:: @code{(cursor-still [INT])} * cursor-twitch:: @code{(cursor-twitch [INT])} * defun:: @code{(defun NOME ARGS [DOC] CORPO)} * delete:: @code{(delete ID)} * dice:: @code{(dice GEOM-ID N)} * dimension:: @code{(dimension [N])} * dither:: @code{(dither CAM-ID @{on|off|toggle@})} * draw:: @code{(draw CAM-ID)} * dump-handles:: @code{(dump-handles)} * echo:: @code{(echo @dots{})} * emodule-clear:: @code{(emodule-clear)} * emodule-define:: @code{(emodule-define NOME COMANDOSHELL @dots{})} * emodule-defined:: @code{(emodule-defined @code{NOMEMÓDULO})} * emodule-isrunning:: @code{(emodule-isrunning NOME)} * emodule-path:: @code{(emodule-path)} * emodule-run:: @code{(| NOME)} * emodule-sort:: @code{(emodule-sort)} * emodule-start:: @code{(emodule-start NOME)} * emodule-transmit:: @code{(emodule-transmit NOME LISTA)} * escale:: @code{(escale GEOM-ID FATOR)} * eval:: @code{(eval EXPR)} * event-keys:: @code{(event-keys @{on|off@})} * event-mode:: @code{(event-mode MODESTRING)} * event-pick:: @code{(event-pick @{on|off@})} * evert:: @code{(evert GEOM-ID [yes|no])} * exit:: @code{(exit)} * ezoom:: @code{(ezoom GEOM-ID FATOR)} * freeze:: @code{(freeze CAM-ID)} * geometry:: @code{(geometry GEOM-ID [OBJETOGEOM@'{E}TRICO])} * geomview-version:: @code{(geomview-version)} * hdefine:: @code{(hdefine geometry|camera|@dots{} NOME VALOR)} * hdelete:: @code{(hdelete [geometry|camera|@dots{}] nome)} * help:: @code{(? COMANDO)} * hmodel:: @code{(hmodel CAMID @{virtual|projective|conformal@})} * hsphere-draw:: @code{(hsphere-draw CAMID [yes|no])} * if:: @code{(if TEST EXPR1 [EXPR2])} * inhibit-warning:: @code{(inhibit-warning STRING)} * input-translator:: @code{(input-translator "#pfx" "comando-shell")} * interest:: @code{(interest (COMANDO [args]))} * lambda:: @code{(lambda ARGS CORPO)} * let:: @code{(let (ARGS) CORPO)} * lines-closer:: @code{(lines-closer CAM-ID DIST)} * load:: @code{(load nomearquivo [command|geometry|camera])} * load-path:: @code{(load-path)} * look:: @code{(look [objetoID] [camID])} * look-encompass:: @code{(look-encompass [objID] [camID])} * look-encompass-size:: @code{(look-encompass-size [view clip near far])} * look-recenter:: @code{(look-recenter [objID] [camID])} * look-toward:: @code{(look-toward [objID] [camID] [origin|center])} * merge:: @code{(merge @{janela|camera@} CAM-ID @{ WIN or CAM @dots{} @})} * merge-ap:: @code{(merge-ap GEOM-ID APAR@^{E}NCIA)} * merge-base-ap:: @code{(merge-base-ap APAAR@^{E}NCIA)} * merge-baseap:: @code{(merge-baseap APAR@^{E}NCIA)} * mod:: @code{(mod NUMERADOR DENOMINADOR)} * morehelp:: @code{(?? COMANDO)} * name-object:: @code{(name-object ID NOME)} * ND-axes:: @code{(ND-axes CAMID [CLUSTER [Xidx Yidx Zidx [Widx]]])} * ND-color:: @code{(ND-color CAMID @dots{}} * ND-xform:: @code{(ND-xform OBJID [ntransform @{ @dots{} @}])} * ND-xform-get:: @code{(ND-xform-get ID [from-ID])} * ND-xform-set:: @code{(ND-xform-set OBJID [ntransform @{ @dots{} @}])} * new-alien:: @code{(new-alien nome [GEOMETRY])} * new-camera:: @code{(new-camera nome [CAMERA])} * new-center:: @code{(new-center [id])} * new-geometry:: @code{(new-geometry nome [GEOMETRY])} * new-reset:: @code{(new-reset)} * NeXT:: @code{(NeXT)} * normalization:: @code{(normalization GEOM-ID @{each|none|all|keep@})} * not:: @code{(not EXPR)} * or:: @code{(or EXPR1 EXPR2)} * pick:: @code{(pick COORDSYS GEOMID G V E F P VI EI FI)} * pick-invisible:: @code{(pick-invisible [yes|no])} * pickable:: @code{(pickable GEOM-ID @{yes|no@})} * position:: @code{(position objetoID otherID)} * position-at:: @code{(position-at objetoID otherID [center | origin])} * position-toward:: @code{(position-toward objID othID [center|origin])} * process-events:: @code{(process-events)} * progn:: @code{(progn DECLARA@,{C}@~{A}O [ @dots{} ])} * quit:: @code{(quit)} * quote:: @code{(quote EXPR)} * rawevent:: @code{(rawevent dev val x y t)} * rawpick:: @code{(rawpick CAMID X Y)} * read:: @code{(read geometry|camera|@dots{} @{GEOM ou CAM ou @dots{}@})} * real-id:: @code{(real-id ID)} * redraw:: @code{(redraw CAM-ID)} * regtable:: @code{(regtable)} * rehash-emodule-path:: @code{(rehash-emodule-path)} * replace-geometry:: @code{(replace-geometry GEOM-ID PART GEOMETRY)} * rib-display:: @code{(rib-display [frame|tiff] PREFIXOARQUIVO)} * rib-snapshot:: @code{(rib-snapshot CAM-ID [nomearquivo])} * scale:: @code{(scale GEOM-ID FATOR [FATORY FATORZ])} * scene:: @code{(scene CAM-ID [GEOMETRY])} * set-clock:: @code{(set-clock TEMPO)} * set-conformal-refine:: @code{(set-conformal-refine CMX [N [ARESTAS]])} * set-emodule-path:: @code{(set-emodule-path (PATH1 @dots{} PATHN))} * set-load-path:: @code{(set-load-path (PATH1 @dots{} PATHN))} * set-motionscale:: @code{(set-motionscale X)} * setenv:: @code{(setenv nome string)} * setq:: @code{(setq SYM EXPR)} * sgi:: @code{(sgi)} * shell:: @code{(! COMANDOSHELL)} * sleep-for:: @code{(sleep-for TEMPO)} * sleep-until:: @code{(sleep-until TEMPO)} * snapshot:: @code{(snapshot CAM-ID NOMEDOARQUIVO [FORMATO [TAMANHOX [TAMANHOY]]])} * soft-shader:: @code{(soft-shader CAM-ID @{on|off|toggle@})} * space:: @code{(space @{euclidean|hyperbolic|spherical@})} * stereowin:: @code{(stereowin CAM-ID [no|horizontal|@dots{}] [gap])} * time-interests:: @code{(time-interests delta initial prefix [suffix])} * transform:: @code{(transform objetoID centerID frameID [rotate|@dots{}] @dots{})} * transform-incr:: @code{(transform-incr objetoID centerID frameID @dots{})} * transform-set:: @code{(transform-set objetoID centerID frameID @dots{})} * truncate:: @code{(truncate N@'{U}MERO)} * ui-cam-focus:: @code{(ui-cam-focus @{focus-change|mouse-cross@})} * ui-center:: @code{(ui-center ID)} * ui-center-origin:: @code{(ui-center-origin @{origin|bbox-center@})} * ui-emotion-program:: @code{(ui-emotion-program PROGRAMA)} * ui-emotion-run:: @code{(ui-emotion-run EMODULE)} * ui-freeze:: @code{(ui-freeze @{on|off@})} * ui-html-browser:: @code{(ui-html-browser NAVEGADOR)} * ui-motion:: @code{(ui-motion @{inertia|@dots{}@} @{on|off@})} * ui-panel:: @code{(ui-panel NOMEPAINEL @{on|off@} [JANELA])} * ui-pdf-viewer:: @code{(ui-pdf-viewer VISUALIZADOR)} * ui-target:: @code{(ui-target ID [yes|no])} * uninterest:: @code{(uninterest (COMANDO [args]))} * update:: @code{(update [timestep_in_seconds])} * update-draw:: @code{(update-draw CAM-ID [timestep_in_seconds])} * while:: @code{(while TESTE CORPO)} * window:: @code{(janela CAM-ID JANELA)} * winenter:: @code{(winenter CAM-ID)} * write:: @code{(write command|geometry|@dots{} NOMEDOARQUIVO @dots{})} * write-comments:: @code{(write-comments NOMEDOARQUIVO GEOMID PICKPATH)} * write-handle:: @code{(write-handle PREFIX NOMEDOARQUIVO CABE@,{C}ALHO)} * write-sexpr:: @code{(write-sexpr NOMEDOARQUIVO OBJETOLISP)} * xform:: @code{(xform ID TRANSFORM)} * xform-incr:: @code{(xform-incr ID TRANSFORM)} * xform-set:: @code{(xform-set ID TRANSFORM)} * zoom:: @code{(zoom CAM-ID FATOR)} @end menu Nota do tradutor: os termos ``express@~{a}o lambda" e ``express@~{a}o S" s@~{a}o espec@'{i}ficos da linguagem de programa@,{c}@~{a}o Lisp. @node shell-shortcut, lt, GCL Reference, GCL Reference @subsection ! @findex !, shell @findex shell, ! @table @code @item ! @'{e} um sin@^{o}nimo de @code{shell}. Veja @ref{shell}. @end table @node lt, eq, shell-shortcut, GCL Reference @subsection < @findex < @table @code @item (< EXPR1 EXPR2) Retorna t se EXPR1 for menor que EXPR2. EXPR1 e EXPR2 devem ser ou ambas inteiras ou n@'{u}mero em ponto flutuante, ou ambas sequ@^{e}ncias de caractere. @end table @node eq, gt, lt, GCL Reference @subsection = @findex = @table @code @item (= EXPR1 EXPR2) Retorna t se EXPR1 for igual a EXPR2. EXPR1 e EXPR2 devem ser ou ambas inteiras ou n@'{u}mero em ponto flutuante, ou ambas sequ@^{e}ncias de caractere. @end table @node gt, mul, eq, GCL Reference @subsection > @findex > @table @code @item (> EXPR1 EXPR2) Retorna t se EXPR1 for maior que EXPR2. EXPR1 e EXPR2 devem ser ou ambas inteiras ou n@'{u}mero em ponto flutuante, ou ambas sequ@^{e}ncias de caractere. @end table @node mul, div, gt, GCL Reference @subsection * @findex * @table @code @item (* EXPR1 EXPR2) Multiplica @var{EXPR1} por @var{EXPR2} e retorna o resultado. @end table @node div, add, mul, GCL Reference @subsection / @findex / @table @code @item (/ EXPR1 EXPR2) Divide @var{EXPR1} por @var{EXPR2} e retorna o resultado. @end table @node add, sub, div, GCL Reference @subsection + @findex + @table @code @item (+ EXPR1 EXPR2) Adiciona @var{EXPR1} a @var{EXPR2} e retorna o resultado. @end table @node sub, help-shortcut, add, GCL Reference @subsection - @findex - @table @code @item (- EXPR1 EXPR2) Subtrai @var{EXPR2} da @var{EXPR1} e retorna o resultado. @end table @node help-shortcut, morehelp-shortcut, sub, GCL Reference @subsection ? @findex ? @table @code @item (? [comando]) Fornece sum@'{a}rio de uso em uma linha para @code{comando}. Comando pode incluir @code{*}s como caracteres coringa; veja tamb@'{e}m @ref{morehelp, @code{(?? @dots{})}}. Ajuda de comando em uma linha; lista nomes somente se multiplos comandos coincidirem. @code{?} @'{e} um sin@^{o}nimo para @ref{help, @code{(help @dots{})}} @end table @node morehelp-shortcut, emodule-run-shortcut, help-shortcut, GCL Reference @subsection ?? @findex ?? @table @code @item (?? comando) @code{comando} pode incluir coringas @code{*}. Mostra mais informa@,{c}@~{a}o que @code{(? comando)}. @code{??} @'{e} um sin@^{o}nimo para @ref{morehelp, @code{morehelp}}. @end table @node emodule-run-shortcut, all, morehelp-shortcut, GCL Reference @subsection | @findex |, emodule-run @findex emodule-run, | @table @code @item | @code{|} @'{e}m um sin@^{o}nimo para @code{emodule-run}. @end table @node all, and, emodule-run-shortcut, GCL Reference @subsection all @findex all @table @code @findex all geometry @item (all geometry) retorna uma lista de nomes de todos os objetos geometry. Use e.g. @samp{(echo (all geometry))} para mostrar tal lista. @findex all camera @item (all camera) retorna uma lista de nomes de todas as c@^{a}meras. @findex all emodule defined @item (all emodule defined) retorna uma lista de todos os m@'{o}dulos externos definidos. @findex all emodule running @item (all emodule running) retorna uma lista de todos m@'{o}dulos externos em execu@,{c}@~{a}o. @end table @node and, ap-override, all, GCL Reference @subsection and @findex and @table @code @item (and EXPR1 EXPR2) Avalia @code{EXPR1} e @code{EXPR2} e retorna @code{t} se ambas retornarem n@~{a}o-@code{nil}, de outra forma retorna @code{nil}. @end table @node ap-override, backcolor, and, GCL Reference @subsection ap-override @findex ap-override @table @code @item (ap-override [on|off]) Seleciona se controles de apar@^{e}ncia devem sobrescrever ajustres dos pr@'{o}prios objetos. Habilitado por padr@~{a}o. Sem argumentos, retorna o ajuste atual. @end table @node backcolor, background-image, ap-override, GCL Reference @subsection backcolor @findex backcolor @table @code @item (backcolor CAM-ID R G B) Ajusta a cor de fundo da CAM-ID; R G B s@~{a}o n@'{u}meros entre 0 e 1. @end table @node background-image, bbox-color, backcolor, GCL Reference @subsection background-image @findex background-image @table @code @item (background-image CAM-ID [NOMEDOARQUIVO]) Use a imagem fornecida como fundo da c@^{a}mera CAM-ID (a qual deve ser uma c@^{a}mera real, n@~{a}o pode ser ou @code{default} ou @code{allcams}). A imagem @'{e} centralizada na @'{a}rea da janela. Trabalha somente com gr@'{a}ficos GL e OpenGL. Use "" como nome de arquivo para remover o fundo. Sem argumentos, retorna o nome da imagem que @'{e} usada atualmente como fundo da janela, ou "". Qualquer tipo de arquivo aceit@'{a}vel como textura @'{e} permitido, e.g. .ppm.gz, .sgi, etc. @end table @node bbox-color, bbox-draw, background-image, GCL Reference @subsection bbox-color @findex bbox-color @table @code @item (bbox-color GEOM-ID R G B) Ajusta a cor da caixa associada do GEOM-ID; R G B s@~{a}o n@'{u}meros entre 0 e 1. @end table @node bbox-draw, camera, bbox-color, GCL Reference @subsection bbox-draw @findex bbox-draw @table @code @item (bbox-draw GEOM-ID [yes|no]) Diz se a caixa associada do GEOM-ID deve ser desenhada; a escolha padr@~{a}o @'{e} @code{yes} se o segundo argumento for omitido. @end table @node camera, camera-draw, bbox-draw, GCL Reference @subsection camera @findex camera @table @code @item (camera CAM-ID [CAMERA]) Especifica dados para @var{CAM-ID}; @var{CAMERA} @'{e} uma sequ@^{e}ncia de caracteres fornecendo uma especifica@,{c}@~{a}o de c@^{a}mera OOGL. Se nenhuma @var{CAM-ID} de c@^{a}mera existir, essa @var{CAM-ID} @'{e} criada; nesse caso, o segundo argumento @'{e} opcional,e se omitido, uma c@^{a}mera padr@~{a}o @'{e} usada. @xref{new-camera, @code{(new-camera @dots{})}}. @end table @node camera-draw, camera-prop, camera, GCL Reference @subsection camera-draw @findex camera-draw @table @code @item (camera-draw CAM-ID [yes|no]) Diz se c@^{a}meras devem ou n@~{a}o serem desenhadas em CAM-ID; @code{yes} se omitido. @end table @node camera-prop, camera-reset, camera-draw, GCL Reference @subsection camera-prop @findex camera-prop @table @code @item (camera-prop @{ geometry object @} [projective]) Especifica o objeto a ser mostrado quando desenhando outras c@^{a}meras. Por padr@~{a}o, esse objeto @'{e} desenhado com sua or@'{i}gem na camera, e com a c@^{a}mera olhando adiante do eixo -Z do objeto. Com a palavra chave @code{projective}, a proje@,{c}@~{a}o da vis@~{a}o da c@^{a}mera @'{e} tamb@'{e}m aplicada ao objeto; isso coloca o Z=-1 e o Z=+1 do objeto perto e distante dos planos de corte, com a @'{a}rea de vis@~{a}o -1<=@{X,Y@}<=+1. Exemplo: (camera-prop @{ < cube @} projective) @end table @node camera-reset, car, camera-prop, GCL Reference @subsection camera-reset @findex camera-reset @table @code @item (camera-reset CAM-ID) Ajusta CAM-ID para seu valor padr@~{a}o. @end table @node car, cdr, camera-reset, GCL Reference @subsection car @findex car @table @code @item (car LISTA) retorna o primeiro elemento de LISTA. @end table @node cdr, clock, car, GCL Reference @subsection cdr @findex cdr @table @code @item (cdr LISTA) retorna a lista obtida removendo o primeiro elemento de LISTA. @end table @node clock, command, cdr, GCL Reference @subsection clock @findex clock @table @code @item (clock) Retorna a hora atual, em segundos, como mostrado por esse rel@'{o}gio do fluxo. @xref{set-clock, @code{(set-clock @dots{})}}. @xref{sleep-until, @code{(sleep-until @dots{})}}. @end table @node command, cons, clock, GCL Reference @subsection command @findex command @table @code @item (command ARQUIVOENTRADA [ARQUIVOSAIDA]) L@^{e} comandos de ARQUIVOENTRADA; envia respostas correspondentes (e.g. qualquer coisa escrita para nome de arquivo @code{-}) para ARQUIVOSAIDA, stdout por padr@~{a}o. @end table @node cons, copy, command, GCL Reference @subsection cons @findex cons @table @code @item (cons EXPR LISTA) Retorna a lista obtida adicionando @var{EXPR} como primeiro elemento da @var{LISTA}. Note que o segundo argumento tem de ser uma lista. @end table @node copy, cursor-still, cons, GCL Reference @subsection copy @findex copy @table @code @item (copy [ID] [nome]) Copia um objeto ou c@^{a}mera. Se ID n@~{a}o for especificado, esse ID @'{e} assumido como sendo targetgeom. If nome n@~{a}o for especificado, esse nome @'{e} assumido como sendo o mesmo nome de ID. @end table @node cursor-still, cursor-twitch, copy, GCL Reference @subsection cursor-still @findex cursor-still @table @code @item (cursor-still [INT]) Ajusta o n@'{u}mero de microssegundos para os quais o cursor n@~{a}o deve mover-se para registrar como fixo. Se INT n@~{a}o for especificado, o valor ir@'{a} ser ajustado para o valor padr@~{a}o. @end table @node cursor-twitch, defun, cursor-still, GCL Reference @subsection cursor-twitch @findex cursor-twitch @table @code @item (cursor-twitch [INT]) Ajusta a dist@^{a}ncia na qual o cursos n@~{a}o deve mover-se (em x ou y) para registrar como fixo. Se INT n@~{a}o for especificado, o valor ir@'{a} ser ajustado para o valor padr@~{a}o. @end table @node defun, delete, cursor-twitch, GCL Reference @subsection defun @findex defun @table @code @item (defun NOME (ARG1 @dots{}) [DOCSTRING] EXPR1 @dots{}) Define uma chamada express@~{a}o lambda, isto @'{e}: define @var{NOME} para avaliar para a express@~{a}o lambda @code{(lambda (ARG1 @dots{}) (EXPR1 @dots{}))} quando chamada como uma fun@,{c}@~{a}o. Tamb@'{e}m, instala @var{DOCSTRING} como resposta para os comandos @code{(help NOME)} e @code{(morehelp NOME)}. Note que @var{DOCSTRING} n@~{a}o precisa conter a sinopse do comando, essa sinopse @'{e} gerada automaticamente. @var{EXPR1} n@~{a}o pode ser uma sequ@^{e}ncia de caracteres se @code{DOCSTRING} for omitida; @var{EXPR1} deve ser interpretada como a sequ@^{e}ncia de caracteres documento. O valor de retorno da @code{(defun @dots{})} @'{e} o nome da fun@,{c}@~{a}o. Fun@,{c}@~{o}es podem ser recursivas e podem modificar a si mesmas. @'{e} pos@'{i}vel redefinir fun@,{c}@~{o}es internas, nesse caso a defini@,{c}@~{a}o antiga est@'{a} ainda dispon@'{i}vel so o nome @code{-builtin-OLDNAME-}. Valores de argumento podem ser alterados por @code{setq}; a nova associa@,{c}@~{a}o @'{e} descartada ap@'{o}s avalia@,{c}@~{a}o de surrounding@code{defun}-body. As palavras especiais @code{&optional} e @code{&rest} possuem o mesmo significado que a express@~{a}o lambda anonymous, veja nas refer@^{e}ncia adiante. @xref{lambda, @code{(lambda @dots{})}}. @xref{setq, @code{(setq @dots{})}}. @xref{let, @code{(let @dots{})}}. @end table @node delete, dice, defun, GCL Reference @subsection delete @findex delete @table @code @item (delete ID) Apaga objeto ou c@^{a}mera especificado em ID. @end table @node dice, dimension, delete, GCL Reference @subsection dice @findex dice @table @code @item (dice GEOM-ID N) Divide qualquer ajustes Bezier dentro de @var{GEOM-ID} em malhas de medida NxN; o padr@~{a}o para N @'{e} 10. Veja tamb@'{e}m o atributo de apar@^{e}ncia @ref{Aparencias, @code{patchdice}}, o qual torna esse comando obsoleto. @end table @node dimension, dither, dice, GCL Reference @subsection dimension @findex dimension @table @code @item (dimension [N]) Ajusta ou l@^{e} a dimens@~{a}o do espa@,{c}o para vis@~{a}o N-dimensional. (Uma vez que c@'{a}lculos forem conclu@'{i}dos usando coordenadas homog@^{e}neas, isso significa que matrizes s@~{a}o (N+1)x(N+1).) Sem argumentos, retorna a dimens@~{a}o atual, ou 0 se a visualiza@,{c}@~{a}o N-dimensional n@~{a}o puder ser habilitada. @end table @node dither, draw, dimension, GCL Reference @subsection dither @findex dither @table @code @item (dither CAM-ID @{on|off|toggle@}) Alterna entre estremecimento ligado e desligado em CAM-ID. @end table @node draw, dump-handles, dither, GCL Reference @subsection draw @findex draw @table @code @item (draw CAM-ID) Desenha a vis@~{a}o em CAM-ID, se a vis@~{a}o precisar ser redesenhada. @xref{redraw, @code{(redraw @dots{})}}. @end table @node dump-handles, echo, draw, GCL Reference @subsection dump-handles @findex dump-handles @table @code @item (dump-handles) Descarrega a lista dos manipuladores ativos atualmente para a sa@'{i}da padr@~{a}o. Essa fun@,{c}@~{a}o @'{e} pensada para uso em depura@,{c}@~{a}o interna somente. @end table @node echo, emodule-clear, dump-handles, GCL Reference @subsection echo @findex echo @table @code @item (echo @dots{}) Escreve os dados fornecidos para o arquivo especial @code{-}. Sequ@^{e}ncias de caracteres s@~{a}o escritas literalmente; express@~{o}es em lisp s@~{a}o avaliadas e seus valores escritos. Se recebido de um programa externo, @code{echo} envia para a entrada do programa. De outra forma escreve para a pr@'{o}pria sa@'{i}da padr@~{a}o do Geomview (tipicamente o terminal). @end table @node emodule-clear, emodule-define, echo, GCL Reference @subsection emodule-clear @findex emodule-clear @table @code @item (emodule-clear) Limpa o navegador de aplica@,{c}@~{a}o do Geomview (m@'{o}dulo externo). @end table @node emodule-define, emodule-defined, emodule-clear, GCL Reference @subsection emodule-define @findex emodule-define @table @code @item (emodule-define NOME COMANDO-SHELL @dots{}) Define um m@'{o}dulo externo chamado NOME, o qual ent@~{a}o aparece no navegador de m@'{o}dulos externos. A sequ@^{e}ncia de caracteres COMANDO-SHELL @'{e} um comando shell UNIX que chama o m@'{o}dulo. Veja @ref{emodule-run, @code{(emodule-run @dots{})}} para discurss@~{a}o sobre m@'{o}dulos externos. @end table @node emodule-defined, emodule-isrunning, emodule-define, GCL Reference @subsection emodule-defined @findex emodule-defined @table @code @item (emodule-defined @code{nomemodulo}) Se o nome do m@'{o}dulo externo for conhecido, retorna o nome do programa chamado quando nomemodulo est@'{a} executando como sequ@^{e}ncia de caracteres entre aspas duplas; de outra forma retorna nil. @code{(echo (emodule-defined @code{nome}))} mostra na tela a sequ@^{e}ncia de caracteres. @end table @node emodule-isrunning, emodule-path, emodule-defined, GCL Reference @subsection emodule-isrunning @findex emodule-isrunning @table @code @item (emodule-isrunning NOME) Retorna Lt se o m@'{o}dulo externo NOME estiver rodando, ou Lnil se o m@'{o}dulo externo n@~{a}o estiver rodando. NOME @'{e} pesquisado nos nomes como eles aparecem no navegador de m@'{o}dulos e nos comandos de shell usados para executar o m@'{o}dulo externo (n@~{a}o incluindo os argumentos). @end table @node emodule-path, emodule-run, emodule-isrunning, GCL Reference @subsection emodule-path @findex emodule-path @table @code @item (emodule-path) Retorna o caminho de busca atual para m@'{o}dulos externos. Nota: para ver agora o valor retornado por essa fun@,{c}@~{a}o voc@^{e} deve envolver emodule-path em uma chamada ao comando shell echo: @code{(echo (emodule-path))}. @xref{set-emodule-path, @code{(set-emodule-path @dots{})}}. @end table @node emodule-run, emodule-sort, emodule-path, GCL Reference @subsection emodule-run @findex emodule-run, | @findex |, emodule-run @table @code @item (emodule-run COMANDO-SHELL ARGS@dots{}) Executa o COMANDO-SHELL fornecido (uma sequ@^{e}ncia de caracteres contendo um comando shell UNIX) como um m@'{o}dulo externo. A sa@'{i}da padr@~{a}o do m@'{o}dulo @'{e} interpretado como comandos do geomview; respostas (escrita para nomearquivo @code{-}) s@~{a}o enviadas para a entrada padr@~{a}o do m@'{o}dulo. O comando shell @'{e} interpretado por /bin/sh, de forma que redirecionamento de E/S pode ser usada: um programa que pergunta ao usu@'{a}rio por entradas a partir do terminal poder@'{a} vir a ser executado com: @example (emodule-run seuprograma <&2) @end example Caso j@'{a} n@~{a}o tenha sido ajustada, a vari@'{a}vel de ambiente $MACHTYPE @'{e} ajustada para o nome do tipo da m@'{a}quina. Conec@,{c}@~{o}es de entrada e sa@'{i}da para o geomview s@~{a}o liberadas automaticamente quando o comando shell encerra. Clicando sobre um prorama que est@'{a} sendo executado na entrada do navegador de m@'{o}dulos envia o sinal SIGHUP ao programa. Para que esse recurso funcione, programas devem evitar executar em segundo plano; os programas usando as bibliotecas FORMS ou GL devem chamar a fun@,{c}@~{a}o foreground() antes da primeira chamada a FORMS ou winopen(). @xref{emodule-define, @code{(emodule-define @dots{})}}. @xref{emodule-start, @code{(emodule-start @dots{})}}. @end table @node emodule-sort, emodule-start, emodule-run, GCL Reference @subsection emodule-sort @findex emodule-sort @table @code @item (emodule-sort) Ordena os m@'{o}dulos alfab@'{e}ticamente no navegador de aplica@,{c}@~{a}o. @end table @node emodule-start, emodule-transmit, emodule-sort, GCL Reference @subsection emodule-start @findex emodule-start @table @code @item (emodule-start NOME) Inicia o m@'{o}dulo externo NOME, definido por emodule-define. Equivalente a clicar na entrada correspondente no navegador de m@'{o}dulos. @end table @node emodule-transmit, escale, emodule-start, GCL Reference @subsection emodule-transmit @findex emodule-transmit @table @code @item (emodule-transmit NOME LISTA) Coloca LISTA na entrada padr@~{a}o do m@'{o}dulo externo NOME. NOME @'{e} pesquisado nos nomes dos m@'{o}dulos na forma em que esses nomes aparecem no navegador de M@'{o}dulos Externos e a seguir nos comandos shell usados para executar os m@'{o}dulos externos. N@~{a}o faz nada se o m@'{o}dulo NOME n@~{o} estiver sendo executado. @end table @node escale, eval, emodule-transmit, GCL Reference @subsection escale @findex escale @table @code @item (escale GEOM-ID FACTOR) O mesmo que scale mas multiplicado por exp(scale). Obsoleto. @end table @node eval, event-keys, escale, GCL Reference @subsection eval @findex eval @table @code @item (eval EXPR) Avalia uma express@~{a}o lisp. Se @var{EXPR} @'{e} uma express@~{a}o-S n@~{a}o avaliada como retornado pelo comando @code{(ap@'{o}strofo @dots{})} ent@~{a}o o efeito ir@'{a} ser ser como se tivesse chamado a express@~{a}o sem ap@'{o}strofo diretamente. A eval tamb@'{e}m torna poss@'{i}vel avaliar express@~{o}es-S constru@'{i}das via @code{car}, @code{cdr} e @code{cons}. @xref{car, @code{(car @dots{})}}. @xref{cdr, @code{(cdr @dots{})}}. @xref{cons, @code{(cons @dots{})}}. @end table @node event-keys, event-mode, eval, GCL Reference @subsection event-keys @findex event-keys @table @code @item (event-keys @{on|off@}) Alterna entre eventos de teclado on ou off para habilitar/desabilitar teclas de atalho. @end table @node event-mode, event-pick, event-keys, GCL Reference @subsection event-mode @findex event-mode @table @code @item (event-mode SEQ_CARAC_MODOS) Ajusta o modo de um evento do mouse (movimento); SEQ_CARAC_MODOS deve ser um entre as seguintes sequ@^{e}ncias de caractere: @enumerate @item @code{"[r] Rotate"} @item @code{"[t] Translate"} @item @code{"[z] Cam Zoom"} @item @code{"[s] Geom Scale"} @item @code{"[f] Cam Fly"} @item @code{"[o] Cam Orbit"} @item @code{"[le] Edit Lights"} @end enumerate In@'{i}cio de nota do tradutor: Alguns termos n@~{a}o s@~{a}o de significado t@~{a}o @'{o}bvio. @enumerate @item @code{"[r] Rotate"} Rota@,{c}@~{a}o @item @code{"[t] Translate"} Transla@,{c}@~{a}o @item @code{"[z] Cam Zoom"} Aproxima@,{c}@~{a}o ou afastamento de c@^{a}mera @item @code{"[s] Geom Scale"} Homotetia @item @code{"[f] Cam Fly"} Voo de c@^{a}mera @item @code{"[o] Cam Orbit"} Órbita de c@^{a}mera @item @code{"[le] Edit Lights"} Editar luzes @end enumerate Fim de nota do tradutor. @end table @node event-pick, evert, event-mode, GCL Reference @subsection event-pick @findex event-pick @table @code @item (event-pick @{on|off@}) Alterna entre selecionar on ou off. @end table @node evert, exit, event-pick, GCL Reference @subsection evert @findex evert @table @code @item (evert GEOM-ID [yes|no]) Ajusta o estado normal de evers@~{a}o (nota do tradutor: ver do outro lado de alguma superf@'{i}cie sobre a dire@,{c}@~{a}o do vetor normal @`{a} mesma superf@'{i}cie) de GEOM-ID. Se o segundo argumento for omitido, inverte o estado de evers@~{a}o. @end table @node exit, ezoom, evert, GCL Reference @subsection exit @findex exit @table @code @item (exit) Encerra o geomview. @end table @node ezoom, freeze, exit, GCL Reference @subsection ezoom @findex ezoom @table @code @item (ezoom GEOM-ID FATOR) O mesmo que zoom mas multiplica por exp(zoom). Obsoleto. @end table @node freeze, geometry, ezoom, GCL Reference @subsection freeze @findex freeze @table @code @item (freeze CAM-ID) Congela CAM-ID; desenho nessa janela de camera @'{e} desligado at@'{e} que a imagem dessa c@^{a}mera seja redesenhada com @code{(redraw CAM-ID)}, ap@'{o}s o redesenho da imagem da c@^{a}mera altera@,{c}@~{o}es na imagem voltam a ser permitidas. @end table @node geometry, geomview-version, freeze, GCL Reference @subsection geometry @findex geometry @table @code @item (geometry GEOM-ID [GEOMETRIA]) Especifica a geometria para GEOM-ID. GEOMETRIA @'{e} uma sequ@^{e}ncia de caracteres fornecendo a especifica@,{c}@~{a}o de um objeto geom@'{e}trico OOGL. Se nenhum objeto chamado GEOM-ID existir, esse objeto inesistente ser@'{a} criado; nesse caso o argumento GEOMETRIA @'{e} opcional, e se omitido, o novo objeto chamado GEOM-ID @'{e} retornado sendo um objeto geom@'{e}trico vazio. @end table @node geomview-version, hdefine, geometry, GCL Reference @subsection geomview-version @findex geomview-version @table @code @item (geomview-version) Retorna uma sequ@^{e}ncia de caracteres representado a vers@~{a}o do geomview que est@'{a} executando. @end table @node hdefine, hdelete, geomview-version, GCL Reference @subsection hdefine @findex hdefine @table @code @item (hdefine @code{geometria}|@code{camera}|@code{janela}|@code{apar@^{e}ncia}|@code{imagem}|@code{transforma@,{c}@~{a}o}|@code{ntransform} nome valor) Ajusta o valor de um manipulador de tipo fornecido. @example (hdefine ) @end example is generally equivalent to @example (read @{ define @}) @end example exeto que a atribui@,{c}@~{a}o @'{e} desfeita ao final da execu@,{c}@~{a}o de hdefine, (possivelmente n@~{a}o em todos os lugares se dentro de uma declara@,{c}@~{a}o condicional), enquanto oe @code{read @dots{} define} realiza a atribui@,{c}@~{a}o t@~{a}o rapidamente quanto o texto @'{e} lido. @xref{Referencias}. @xref{read, @code{(read @dots{})}}. @xref{hdelete, @code{(hdelete @dots{})}}. @end table @node hdelete, help, hdefine, GCL Reference @subsection hdelete @findex hdelete @table @code @item (hdelete [@code{geometria}|@code{camera}|@code{janela}|@code{apar@^{e}ncia}|@code{imagem}|@code{transform}|@code{ntransform}] nome) Apaga o manipulador fornecido. Note que o manipulador n@~{a}o ir@'{a} atualmente ser apagado no caso de existir ainda outros objetos fazendo refer@^{e}ncia ao manipulador, mas uma vez que os objetos que fazem refer@^{e}ncia ao maipulador apagado forem fechados, o manipulador ir@'{a} tamb@'{e}m ser automaticamente mandado embora. O objeto que faz refer@^{e}ncia ao manipulador (se existir algum) ir@'{a} somente ser deletado se n@~{a}o existirem outras refer@^{e}ncias para esse objeto. Se o opcional primeiro argumento for omitido, ent@~{a}o o primeiro manipulador que coincidir com @var{nome} ir@'{a} ser apagado, independentemente do tipo de objeto ao qual esse manipulador estiver anexado. N@~{a}o @'{e} um erro chamar essa fun@,{c}@~{a}o com um manipulador inexistente, mas @'{e} uma erro chamar essa fun@,{c}@~{a}o com o nome de um manipulador n@~{a}o global, i.e. um que n@~{a}o tenha sido criado por @code{(hdefine @dots{})} ou @code{(read @dots{} @{ define @dots{}@})}. @xref{Referencias}. @xref{read,@code{(read @dots{})}}. @xref{hdefine,@code{(hdefine @dots{})}}. @end table @node help, hmodel, hdelete, GCL Reference @subsection help @findex help @table @code @item (help [comando]) O comando pode incluir @code{*}s como caracteres coringa; veja tamb@'{e}m @ref{help, @code{(?? @dots{})}} Ajuda de comando em uma linha; lista nomes somente se multiplos comandos coincidirem. @end table @node hmodel, hsphere-draw, help, GCL Reference @subsection hmodel @findex hmodel @table @code @item (hmodel CAMID @{virtual|projective|conformal@}) Ajusta o modelo usado para mostrar o objeto geom@'{e}trico nessa c@^{a}mera. @xref{space, @code{(space @dots{})}}. @end table @node hsphere-draw, if, hmodel, GCL Reference @subsection hsphere-draw @findex hsphere-draw @table @code @item (hsphere-draw CAMID [yes|no]) Informa se @'{e} para desenhar ou n@~{a}o a esfera unit@'{a}ria: a esfera no infinito no espa@,{c}o hiperb@'{o}lico, e uma esfera de refer@^{e}ncia nos espa@,{c}os Euclidiano esf@'{e}rico. Se o segundo argumento for omitido, @code{yes} @'{e} assumido. @end table @node if, inhibit-warning, hsphere-draw, GCL Reference @subsection if @findex if @table @code @item (if TEST EXPR1 [EXPR2]) Avalia TEST; se TEST retornar um valor n@~{a}o-nil (nota do tradutor:n@~{a}o nulo), retorna o valor de EXPR1. Se TEST retornar nil, retorna o value de EXPR2 se EXPR2 estiver presente, de outra forma retorna nil. @end table @node inhibit-warning, input-translator, if, GCL Reference @subsection inhibit-warning @findex inhibit-warning @table @code @item (inhibit-warning STRING) Inibe alertas de inibi@,{c}@~{a}o do geomview de mostrar uma mensagem de alerta determinada por STRING. Atualmente n@~{a}o existe mensgenns de alerta na qual o comando inhibit-warning seja aplicado, de forma que esse comando @'{e} pouco @'{u}til. @end table @node input-translator, interest, inhibit-warning, GCL Reference @subsection input-translator @findex input-translator @table @code @item (input-translator "#prefix_string" "comando-shell") Define um programa externo de tradu@,{c}@~{a}o para tipos especiais de entrada. Quando perguntado se @'{e} para l@^{e} um arquivo especial que come@,{c}a com a sequ@^{e}ncia de caracteres especificada, geomview chama comando-shell com entrada padr@~{a}o obtida a partir do arquivo especificado. @'{E} esperado que comando-shell emita dados geom@'{e}tricos na linguagem OOGL para sua sa@'{i}da padr@~{a}o. Nessa implementa@,{c}@~{a}o, somente prefixos iniciando com # s@~{a}o reconhecidos. Muito @'{u}til em situa@,{c}@~{o}es como @example (input-translator "#VRML" "vrml2oogl") @end example @end table @node interest, lambda, input-translator, GCL Reference @subsection interest @findex interest @table @code @item (interest (COMANDO [args])) Permite a voc@^{e} expressar interesse em um comando. Quando geomview vier a executar o comando de interesse futuramente o comando de interesse ser@'{a} ecoado para o sistema de comunica@,{c}@~{a}o do qual o comando interest for origin@'{a}rio. @var{COMANDO} pode ser qualquer comando. Args especifica restri@,{c}@~{o}es sobre os valores dos argumentos; se args estiver presente no comando interest, geomview ir@'{a} somente ecoar chamadas para o comando no qual os argumentos coincidirem com aquele fornecido no comando interest. Dois valores especiais de argumento podem aparecer na lista de argumentos. @code{*} que coincide com qualquer valor. @code{nil} que coincide com qualquer valor mas suprime o retorno daquele valor; seus valores s@~{a}o reportados como @code{nil}. O prop@'{o}sito do comando interest @'{e} permitir a m@'{o}dulos externos encontrar coisas acontecendo dentro do geomview. Por exemplo, um m@'{o}dulo interessado em saber quando um geom chamado @code{foo} @'{e} apagado pode usar o comando interest da seguinte forma @code{(interest (delete foo))} e iria receber a sequ@^{e}ncia de caracteres @code{(delete foo)} quando foo fosse apagado. Destacando um caso especial do uso do comando interest. Para a maioria dos m@'{o}dulos interessados em selecionar eventos o comando @code{(interest (pick world))} @'{e} suficiente. O comando @code{(interest (pick world))} faz com que geomview envie uma sequ@^{e}ncia de caracteres da forma @code{(pick world @dots{})} toda vez que um evento de sele@,{c}@~{a}o (duplo clique bot@~{a}o direito do mounse). Veja o comando @ref{pick,@code{(pick @dots{})}} para detalhes. @end table @node lambda, let, interest, GCL Reference @subsection lambda @findex lambda @table @code @item (lambda (ARG1 @dots{}) EXPR1 @dots{} EXPRN) Uma express@~{a}o lambda @'{e} como uma fun@,{c}@~{a}o. Para ``chamar'' uma express@~{a}o lambda, a express@~{a}o lambda tem de ser chamada como uma fun@,{c}@~{a}o: @code{((lambda (arg) (+ 1 arg)) 2)}. Nesse exemplo, o valor completo da express@~{a}o deve ser 3. Em geral, o valor da chamada ir@'{a} ser o valor de @var{EXPRN}. A primeira lista serve para definir os par@^{a}metros formais. A express@~{a}o lambda propriamente dita @'{e} apenas uma lista, iniciando-se com a palavra chava lambda, seguida por muitas listas entre aspas duplas. @xref{defun, @code{(defun @dots{})}}. @xref{setq, @code{(setq @dots{})}}. @xref{let, @code{(let @dots{})}}. Note que a lista argumento pode conter as palavras chaves especiais @table @code @item &optional fornecimento de valores aos identificadores seguintes @'{e} opcional, seus valores padr@~{a}o ir@~{a}o ser @code{nil} @item &rest todos os argumentos excedentes ir@~{a}o ser coletados em uma lista, e essa lista ir@'{a} ser atribu@'{i}da ao argumento seginte, da seguinte forma: @example ((lambda (&rest rest) (echo rest)) a b c d) @end example A sa@'{i}da ir@'{a} ser @code{(a b c d)}. @end table @end table @node let, lines-closer, lambda, GCL Reference @subsection let @findex let @table @code @item (let ARGUMENTS EXPR1 @dots{} EXPRN) Gera uma express@~{a}o lambda a partir de @var{EXRP1} @dots{} @var{EXPRN}, com a associa@,{c}@~{a}o de argumento descrita por @var{ARGUMENTS}. @var{ARGUMENTS} corresponde a uma lista de s@'{i}mbolos (associada a @code{nil} por padr@~{a}o) ou a listas da forma @code{(ARG VALUE)} onde @var{ARG} @'{e} um s@'{i}mbolo e n@~{a}o avaliado e @var{VALUE} @'{e} uma express@~{a}o-S que @'{e} primeiramente avaliada, a seguir seu valor @'{e} associa a @var{ARG}. A express@~{a}o completa avalia para o valor de @var{EXPRN}, a @'{u}ltima express@~{a}o no corpo da declara@,{c}@~{a}o. A lista de argumento deve ester presente, mas pode ser vazia; no @'{u}ltimo caso a declara@,{c}@~{a}o @code{(let () @dots{})} @'{e} equivalente a um @code{(progn @dots{})}. @xref{lambda, @code{(lambda @dots{})}}. @xref{defun, @code{(defun @dots{})}}. @xref{setq, @code{(setq @dots{})}}. @end table @node lines-closer, load, let, GCL Reference @subsection lines-closer @findex lines-closer @table @code @item (lines-closer CAM-ID DIST) Desenha linhas (incluindo arestas) pr@'{o}ximo @`{a} c@^{a}mera do pol@'{i}gonos a uma dist@^{a}ncia DIST / 10^5 do intervalo contido na @'{a}rea de armazenamento tempor@'{a}rio de mem@'{o}ria que controla as coordenadas do eixo Z. DIST = 3.0 por padr@~{a}o. Se DIST for muito pequena, uma linha aproxumada sobre uma superf@'{i}cie pode ser pontilhada ou invis@'{i}vel, dependendo do ponto de vista. Se DIST for muito grande, linhas podem aparecer em frente das superf@'{i}cies que elas atualmente aproximam por tr@'{a}s. Bons valores para DIST variam com a cena, ponto de vis@~{a}o, e dist@^{a}ncias entre planos de corte pr@'{o}ximo e distante. Esse recurso @'{e} um remendo, mas pode ser de grande ajuda. @end table @node load, load-path, lines-closer, GCL Reference @subsection load @findex load @table @code @item (load filename [command|geometry|camera]) Chama o arquivo fornecido dentro do geomview. O segundo argumento opcional especifica o tipo de dado que o referido arquivo chamado cont@'{e}m, o qual pode ser ou @code{command} (comandos do geomview), @code{geometry} (dados geom@'{e}trico no formato OOGL), ou @code{camera} (defini@,{c}@~{a}o de c@^{a}mera no formato OOGL). se omitido, @'{e} tentado deduzir o tipo de conte@'{u}do do arquivo. Carregando dados geom@'{e}tricos cria um novo objeto vis@'{i}vel; carregando uma c@^{a}mera abre uma nova janela; chamado um arquivo contendo comando executa o referido comando. @end table @node load-path, look, load, GCL Reference @subsection load-path @findex load-path @table @code @item (load-path) Retorna o atual caminho de busca para arquivos contendo comandos, objetos geom@'{e}tricos, etc. Nota: para ver o atual valor retornado por essa fun@,{c}@~{a}o voc@^{e} deve empacotar esse comando em uma chamada a echo: @code{(echo (load-path))}. @xref{set-load-path, @code{(set-load-path @dots{})}}. @end table @node look, look-encompass, load-path, GCL Reference @subsection look @findex look @table @code @item (look [objetoID] [cameraID]) Rotaciona a referida c@^{a}mera - cameraID - de forma que aponte em dire@,{c}@~{a}o ao centro da caixa associada ao referido objeto - objetoID (ou a origem nos espa@,{c}os hiperbolico ou esf@'{e}rico). No espa@,{c}o Eucidiano, move a c@^{a}mera para al@'{e}m ou para tr@'{a}s at@'{e} que o objeto apare@,{c}a t@~{a}o grande quanto poss@'{i}vel enquanto sendo inteiramente vis@'{i}vel. Equivalente a @example progn ( (look-toward [objetoID] [cameraID] @{center | origin@}) [(look-encompass [objetoID] [cameraID])] ) @end example Se objetoID n@~{a}o for especificado, esse objeto @'{a} assumido como sendo o objeto mundo. Se cameraID n@~{a}o for especificado, essa c@^{a}mera @'{e} assumido como sendo a targetcam. @end table @node look-encompass, look-encompass-size, look, GCL Reference @subsection look-encompass @findex look-encompass @table @code @item (look-encompass [objetoID] [cameraID]) Move cameraID para tr@'{a}s ou para adiante at@'{e} que seu campo de vis@~{a}o alcance objetoID. Essa rotina trabalha somente no espa@,{c}o Euclidiano. Se objetoID n@~{a}o for especificado, esse objeto @'{a} assumido como sendo o objeto mundo. Se cameraID n@~{a}o for especificado, essa c@^{a}mera @'{e} assumido como sendo a targetcam. @xref{look-encompass-size, @code{(look-encompass-size @dots{})}}. @end table @node look-encompass-size, look-recenter, look-encompass, GCL Reference @subsection look-encompass-size @findex look-encompass-size @table @code @item (look-encompass-size [ver-fra@,{c}@~{a}o raz@~{a}o-corte margem-proxima margem-distante]) Ajusta/retorna par@^{a}metros usados por (look-encompass). ver-fra@,{c}@~{a}o @'{e} a por@,{c}@~{a}o da janela de c@^{a}mera preenchida pelo objeto, raz@~{a}o-corte @'{e} a raz@~{a}o m@'{a}xima permitida entre os planos de corte pr@'{o}ximo e afastado. O plano de corte pr@'{o}ximo @'{e} 1/magem-proxima vezes mais perto que a aresta mais pr@'{o}xima do objeto, e o plano de corte distante @'{e} margem-distante vezes mais adiante. Retorna a lista dos valores atuais. Valores padronizados: .75 100 0.1 4.0 @end table @node look-recenter, look-toward, look-encompass-size, GCL Reference @subsection look-recenter @findex look-recenter @table @code @item (look-recenter [objetoID] [cameraID]) Translada e rotaciona a c@^{a}mera de forma que essa c@^{a}mera esteja olhando na dire@,{c}@~{a}o-z (no sistema de coordenadas de objetoID) no centro da caixa associada a objetoID (ou a origem do sistema de coordenadas no espa@,{c}o n@~{a}o Euclidiano). No espa@,{c}o Euclidiano, a c@^{a}mera @'{e} tamb@'{e}m movida para t@~{a}o perto quanto poss@'{i}vel do objeto de forma a permitir que o objeto seja inteiramente vis@'{i}vel. Tamb@'{e}m garante que o eixos y do objetoID e de cameraID sejam paralelos. @end table @node look-toward, merge, look-recenter, GCL Reference @subsection look-toward @findex look-toward @table @code @item (look-toward [objetoID] [cameraID] [origin | center]) Rotaciona a c@^{a}mera especificada de forma a apontar para adiante da or@'{i}gem do sistema de coordenadas do objeto, ou do centro da caixa associada ao objeto (no espa@,{c}o n@~{a}o Euclidiano, a or@'{i}gem ir@'{a} ser usada automaticamente). O objetoID padr@~{a}o @'{e} o objeto mundo, a c@^{a}mera padr@~{a}o @'{e} targetcam, a localiza@,{c}@~{a}o padr@~{a}o @'{e} para a qual @'{e} apontada a c@^{a}mera @'{e} adiante do centro da caixa associada a objetoID. @end table @node merge, merge-ap, look-toward, GCL Reference @subsection merge @findex merge @table @code @item (merge @{window|camera@} CAM-ID @{ WINDOW ou CAMERA @dots{} @}) Modifica a janela ou a c@^{a}mera fornecido, mudando apenas a propriedade especificada no @'{u}ltimo argumento. E.g. @example (merge camera @code{Camera} @{ far 20 @}) @end example ajusta o plano de corte afastado para 20 permanecendo os outros atributos inalterados. @end table @node merge-ap, merge-base-ap, merge, GCL Reference @subsection merge-ap @findex merge-ap @table @code @item (merge-ap GEOM-ID APAR@^{E}NCIA) Mescla em algumas caracter@'{i}sticas de apar@^{e}ncia para GEOM-ID. Par@^{a}metros de apar@^{e}ncia incluem cor de linha e de superf@'{i}cie, estilo de sombreamento, espe@,{c}ura de linha, e ilumina@,{c}@~{a}o. @end table @node merge-base-ap, merge-baseap, merge-ap, GCL Reference @subsection merge-base-ap @findex merge-base-ap @table @code @item (merge-base-ap APAR@^{E}NCIA) @code{merge-base-ap} @'{e} um sin@^{o}nimo para @ref{merge-baseap, @code{merge-baseap}}. @end table @node merge-baseap, mod, merge-base-ap, GCL Reference @subsection merge-baseap @findex merge-baseap @table @code @item (merge-baseap APAR@^{E}NCIA) Mescla em algumas caracter@'{i}sticas de apar@^{e}ncia para a base pad@~{a}o de apar@^{e}ncia (aplicada a todo geom antes de sua pr@'{o}pria apar@^{e}ncia). Ilumina@,{c}@~{a}o est@'{a} tipicamente inclu@'{i}da na base de apar@^{e}ncia. @end table @node mod, morehelp, merge-baseap, GCL Reference @subsection mod @findex mod @table @code @item (mod EXPR1 EXPR2) Divide @var{EXPR1} por @var{EXPR2} e retorna o resto. @end table @node morehelp, name-object, mod, GCL Reference @subsection morehelp @findex morehelp @table @code @item (morehelp comando) @code{comando} pode incluir coringas @code{*}. Mostra na tela mais informa@,{c}@~{a}o que @ref{help, @code{(help command)}}. @end table @node name-object, ND-axes, morehelp, GCL Reference @subsection name-object @findex name-object @table @code @item (name-object ID NOME) Atribui um novo NOME (uma sequ@^{e}ncia de caracteres) a ID. Um n@'{u}mero @'{e} adicionado no final se NOME j@'{a} estiver sendo usado (por exemplo, @code{foo} -> @code{foo<2>}). O novo nome, possivelmente com n@'{u}mero anexado no final, pode ser usado como id de objeto posteriormente. @end table @node ND-axes, ND-color, name-object, GCL Reference @subsection ND-axes @findex ND-axes @table @code @item (ND-axes CAMID [NOMEGRUPO [Xindex Yindex Zindex [Windex]]]) No nosso modelo para visualiza@,{c}@~{a}o N-Dimensional (habilitado por (dimension)), objetos no espa@,{c}o N-dimensional s@~{a}o visualizados por N-dimensional @emph{grupos de c@^{a}mera}. Cada janela real de c@^{a}mera pertence a algum grupo de c@^{a}meras, e mostra & manipula um subspa@,{c}o projetado eixo-alinhado 3-D do espa@,{c}o N-dimensional visto pelo seu grupo. Movendo uma c@^{a}mera em um grupo afeta todos os outros membros do grupo. O comando ND-axes configura tudo isso. O comando ND-axes especifica uma associa@,{c}@~{a}o de c@^{a}mera a um grupo, e o ajuste dos eixos do espa@,{c}o N-dimensional os quais tornam-se os eixos X, Y, e Z da c@^{a}mera. Eixos s@~{a}o especificados por seus @'{i}ndices, de 1 a N para um espa@,{c}o N-dimensional. O grupo NOMEGRUPO @'{e} implicitamente criado se n@~{a}o for previamente conhecido. Em princ@'{i}pio @'{e} poss@'{i}vel mapear a componente homog@^{e}nea de uma conforma@,{c}@~{a}o de 4 pontos para algum outro @'{i}ndice; isso poderia ser realizado especificando 0 para um dos @code{Xindex}, @code{Yindex} ou @code{Zindex} e fornecendo a @code{Windex} algum valor positivo. Isso provavelmente n@~{a}o @'{e} @'{u}til pelo fato de Geomview n@~{a}o suportar geometria n@~{a}o-Euclidianas para dimens@~{o}es mais altas. Para ler uma configura@,{c}@~{a}o de c@^{a}meras, use @code{(echo (ND-axes CAMID))}. O valor de retorno @'{e} uma vetor fixo de 4 inteiros, o @'{u}ltimo dos quais deve ser 0. @end table @node ND-color, ND-xform, ND-axes, GCL Reference @subsection ND-color @findex ND-color @table @code @item (ND-color CAMID [ (( [ID] (x1 x2 @dots{} xN) v r g b a v r g b a @dots{} ) ((x1 @dots{} xN) v r g b a v r g b a @dots{}) @dots{})] ) Especifica uma fun@,{c}@~{a}o, aplicada a cada v@'{e}rtice N-dimencional, o qual determina as cores dos objetos N-dimensionais como mostrado na c@^{a}mera CAMID. Cada fun@,{c}@~{a}o de cor @'{e} definida por um vetor (no sistema de coordenadas do objeto geom@'{e}trico ID) [x1 @dots{} xN] e por uma sequ@^{e}ncia de qu@'{i}ntuplas valor (v)/cor(r g b a), ordenados por ordem crescente de v. O produto interno v = P.[x] @'{e} linearmente interpolado nessa tabela para fornecer uma cor. Se ID for omitido, o vetor (xi) @'{e} assumido em coordenadas de universo. O comando ND-color especifica uma lista de tais fun@,{c}@~{o}es; cada v@'{e}rtice @'{e} colorido por seu somat@'{o}rio (ent@~{a}o e.g. intensidade verde pode indicar proje@,{c}@~{a}o ao longo de um eixoenquanto vermelho indica outro eixo. Uma lista vazia, como em (ND-color CAMID ()), suprime o colorido. Sem segundo argumento, (ND-color CAMID) retorna a lista de cor-fun@,{c}@~{a}o de colora@,{c}@~{a}o. Mesmo quando colora@,{c}@~{a}o est@'{a} habilitada, objetos acompanhados com o atributo de apar@^{e}ncia @code{keepcolor} s@~{a}o mostrados em suas cores naturais. @end table @node ND-xform, ND-xform-get, ND-color, GCL Reference @subsection ND-xform @findex ND-xform @table @code @item (ND-xform OBJID [ntransform @{ idim odim @dots{} @}]) Concatena a fornecida transforma@,{c}@~{a}o-ND com a atual transforma@,{c}@~{a}o-ND do objeto (aplica a transforma@,{c}@~{a}o-ND para objeto ID, como oposi@,{c}a@~{o} a simplesmente ajustar sua transforma@,{c}@~{a}o-ND). Note que ND-transforms possuem suas coordenadas homog@^{e}neas iniciando-se no @'{i}ndice 0, enquanto transforma@,{c}@~{o}es 3D possuem seu in@'{i}cio no @'{i}ndice 3. @end table @node ND-xform-get, ND-xform-set, ND-xform, GCL Reference @subsection ND-xform-get @findex ND-xform-get @table @code @item (ND-xform-get ID [from-ID]) Retorna a transforma@,{c}@~{a}o N-D do objeto fornecido no sistema de coordenadas do from-ID (o padr@~{a}o @'{e} @code{universe}), no sentido * Transform = . Note que ND-transforms possuem suas coordenadas homog@^{e}neas iniciando-se no @'{i}ndice 0, enquanto transforma@,{c}@~{o}es 3D possuem seu in@'{i}cio no @'{i}ndice 3. @end table @node ND-xform-set, new-alien, ND-xform-get, GCL Reference @subsection ND-xform-set @findex ND-xform-set @table @code @item (ND-xform-set OBJID [ntransform @{ idim odim @dots{} @}]) Ajusta a transforma@,{c}@~{a}o N-D do objeto fornecido. Na dimens@~{a}o N, a transforma@,{c}@~{a}o @'{e} uma matriz (N+1)x(N+1), de forma que naquele caso idim e odim s@~{a}o esperados serem ambos iguais a (N+1). Note que todas as c@^{a}meras em um camera-grupo possuem a mesma transforma@,{c}@~{a}o N-D. Note que ND-transforms possuem suas coordenadas homog@^{e}neas iniciando-se no @'{i}ndice 0, enquanto transforma@,{c}@~{o}es 3D possuem seu in@'{i}cio no @'{i}ndice 3. @end table @node new-alien, new-camera, ND-xform-set, GCL Reference @subsection new-alien @findex new-alien @table @code @item (new-alien name [GEOMETRIA]) Cria um novo alien (objeto geom@'{e}trico fora de "objeto mundo") com o nome fornecido (uma sequ@^{e}ncia de caracteres). @var{GEOMETRIA} @'{e} uma sequ@^{e}ncia de caracteres fornecendo um especifica@,{c}@~{a}o de objeto geom@'{e}trico OOGL. Se @var{GEOMETRIA} for omitido, o novo alien @'{e} fornecido como sendo um objeto geom@'{e}trico vazio. Se um objeto como o nome fornecido j@'{a} existir, ao novo alien @'{e} dado um novo nome. Os feixes luminosos que s@~{a}o usados para mover em volta das luzes s@~{a}o um exemplo de aliens. Eles s@~{a}o desenhados mas n@~{a}o control@'{a}veis pelo caminho normal que os objetos comuns s@~{a}o: eles n@~{a}o aparecem no navegador de objetos e o usu@'{a}rio n@~{a}o pode mov@^{e}-lo com o modo de movimento normal. @end table @node new-camera, new-center, new-alien, GCL Reference @subsection new-camera @findex new-camera @table @code @item (new-camera name [CAMERA]) Cria uma nova c@^{a}mera com o nome fornecido (uma sequ@^{e}ncia de caracteres). Se uma c@^{a}mera com o nome fornecido j@'{a} existir, ao novo objeto @'{e} fornecido um nome @'{u}nico. Se @var{CAMERA} for omitido uma c@^{a}mera padr@~{a}o @'{e} usada. @end table @node new-center, new-geometry, new-camera, GCL Reference @subsection new-center @findex new-center @table @code @item (new-center [id]) Cessa o movimento de id, a seguir ajusta a transforma@,{c}@~{a}o de id para a identidade. O id padr@~{a}o @'{e} target. Tamb@'{e}m, se o id for uma c@^{a}mera, chama (look-recenter World id). A fun@,{c}@~{a}o principal da chamada a (look-recenter) @'{e} colocar a c@^{a}mera de forma que esteja apontando paralelamente ao eixo z na dire@,{c}@~{a}o do centro do objeto mundo. @end table @node new-geometry, new-reset, new-center, GCL Reference @subsection new-geometry @findex new-geometry @table @code @item (new-geometry name [GEOMETRY]) Cria um novo geom com o nome fornecido (uma sequ@^{e}ncia de caracteres). @var{GEOMETRY} @'{e} uma sequ@^{e}ncia de caracteres fornecendo a especifica@,{c}@~{a}o de um objeto geom@'{e}trico OOGL. Se @var{GEOMETRY} for omitido, o novo objeto @'{e} fornecido como sendo um objeto geom@'{e}trico vazio. Se um objeto com o nome fornecido j@'{a} existir, ao novo objeto @'{e} fornecido um nome @'{u}nico. @end table @node new-reset, NeXT, new-geometry, GCL Reference @subsection new-reset @findex new-reset @table @code @item (new-reset) Equivalente a @code{(progn (new-center ALLGEOMS)(new-center ALLCAMS))}. @end table @node NeXT, normalization, new-reset, GCL Reference @subsection NeXT @findex NeXT @table @code @item (NeXT) Retorna @code{t} se executando sobre um NeXT, @code{nil} se n@~{a}o estiver rodando sobre um NeXT. Uma rel@'{i}quia de do ano da esta@,{c}@~{a}o de trabalho NeXT. @end table @node normalization, not, NeXT, GCL Reference @subsection normalization @findex normalization @table @code @item (normalization GEOM-ID @{each|none|all|keep@}) Ajusta a situa@,{c}@~{a}o atual da normaliza@,{c}@~{a}o de GEOM-ID. @table @code @item none suprime toda normaliza@,{c}@~{a}o. @item each normaliza a caixa associada ao objeto para ajustar-se dentro da esfera unit@'{a}ria, com o centro de sua caixa associada transladado para a or@'{i}gem. A caixa @'{e} alterada proprocionalmente de forma que sua diagonal maior, sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), seja 2. @item all assemelha-se a @code{each}, exceto quando um objeto est@'{a} mudando (e.g. quando seu objeto geom@'{e}trico est@'{a} sendo modificado por um programa externo). Ent@~{a}o, @code{each} precisamente ajusta a caixa associada em torno do objeto quando esse objeto muda e faz as normaliza@,{c}@~{o}es de acordo com as mudan@,{c}as, enquanto @code{all} normaliza a uni@~{a}o de todas as variantes do objeto e normaliza conforme essa uni@~{a}o. @item keep mant@'{e}m a transforma@,{c}@~{a}o de normaliza@,{c}@~{a}o atual intocada quando o objeto muda. Essa intocabilidade pode ser @'{u}til para aplicar a normaliza@,{c}@~{a}o @code{each} ou @code{all} @`{a} primeira vers@~{a}o de um ojeto que est@'{a} mudando de forma a trazer esse objeto para o campo de vis@~{a}o, a seguir alternar para @code{keep}. @end table @end table @node not, or, normalization, GCL Reference @subsection not @findex not @table @code @item (not EXPR) Avalia @code{EXPR}; se @code{EXPR} retornar um valor n@~{a}o-@code{nil}, o valor de retorno do comando @'{e} nil, se @code{EXPR} retornar @code{nil}, o valor de retorno do comando @'{e} @code{t}. @end table @node or, pick, not, GCL Reference @subsection or @findex or @table @code @item (or EXPR1 EXPR2) Avalia @code{EXPR1}; se @code{EXPR1} retorna n@~{a}o-@code{nil}, o valor de retorno do comando @'{e} o valor de @code{EXPR1}, se @code{EXPR1} retornar @code{nil}, a @code{EXPR2} @'{e} avaliada e o valor de @code{EXPR2} @'{e} retornado. @end table @node pick, pick-invisible, or, GCL Reference @subsection pick @findex pick @table @code @item (pick COORDSYS GEOMID G V E F P VI EI FI) O comando pick @'{e} executado internamente em resposta a eventos de sele@,{c}@~{a}o (clique duplo no bot@~{a}o direito do mouse). @table @var @item COORDSYS = sistema de coordenadas no qual as coordenadas dos seguintes argumentos s@~{a}o especificados. Esse sistema de coordenadas pode ser: @table @code @item world sistema de coordenadas do objeto mundo @item self sistema de coordenadas do geom (@var{GEOMID}) selecionado @item primitive sistema de coordenadas do primitivo atual dentro do geom selecionado onde a sele@,{c}@~{a}o ocorreu. @end table @item GEOMID = id do geom selecionado @item G = ponto selecionado (intersec@,{c}@~{a}o atual do raio selecionado com o objeto) @item V = v@'{e}rtice selecionado, se houver algum @item E = aresta selecionada, se houver alguma @item F = face selecionada @item P = camainho para o primitivo selecionado [0 ou mais] @item VI = @'{i}ndice do v@'{e}rtice selecionado no primitivo @item EI = lista de @'{i}ndices de extremidades da aresta selecionada, se houver alguma @item FI = @'{i}ndice da face selecionada @end table M@'{o}dulos externos podem receber informa@,{c}@~{o}es de eventos de sele@,{c}@~{a}o por meio do registro do interesse em chamadas a @code{pick} por meio do comando @code{interest}. No contexto de visualiza@,{c}@~{o}es de v@'{a}rias dimens@~{o}es as coordenadas s@~{a}o atualmente pontos de v@'{a}rias dimens@~{o}es. Eles correspondem a pontos tridimencionais da sele@,{c}@~{a}o relativa ao subespa@,{c}o definido pela janela de visualiza@,{c}@~{a}o da c@^{a}mera onde a sele@,{c}@~{a}o ocorreu. As coordenadas s@~{a}o ent@~{a}o preenchidas com zeros e transformadas de volta para o sistema de coordenadas definido por @var{COORDSYS}. @end table @node pick-invisible, pickable, pick, GCL Reference @subsection pick-invisible @findex pick-invisible @table @code @item (pick-invisible [yes|no]) Escolhe se sele@,{c}@~{o}es devem ser sens@'{i}veis a objetos cuja apar@^{e}ncia faz com que fiquem invis@'{i}veis; o padr@~{a}o @'{e} yes. Sem argumentos, retorna a situa@,{c}@~{a}o/valor atual. @end table @node pickable, position, pick-invisible, GCL Reference @subsection pickable @findex pickable @table @code @item (pickable GEOM-ID @{yes|no@}) Informa se GEOM-ID est@'{a} inclu@'{i}do ou n@~{a}o no conjunto de objetos que podem ser retornados a partir do comando pick. @end table @node position, position-at, pickable, GCL Reference @subsection position @findex position @table @code @item (position objetoID outroID) Ajusta a transforma@,{c}@~{a}o de objetoID para aquele de outroID. @end table @node position-at, position-toward, position, GCL Reference @subsection position-at @findex position-at @table @code @item (position-at objetoID outroID [center | origin]) Faz a transla@,{c}@~{a}o de objetoID para o centro da caixa associada ou para a or@'{i}gem do sistema de coordenadas de outroID (transla@,{c}@~{a}o paralela). O padr@~{a}o @'{e} center. @end table @node position-toward, process-events, position-at, GCL Reference @subsection position-toward @findex position-toward @table @code @item (position-toward objetoID outroID [center | origin]) Rotaciona objetoID de forma que o centro da caixa associada ou a or@'{i}gem do sistema de coordenadas do outroID localize-se sobre a parte positiva do eixo z do primeiro objeto. O padr@~{a}o @'{e} o centro da caixa associada. @end table @node process-events, progn, position-toward, GCL Reference @subsection process-events @findex process-events @table @code @item (process-events) Devolve o controle ao la@,{c}o do evento do Geomview, ent@~{a}o continua avaliando o comando do script atual. Se o fluxo atual de entrada tiver sido colocado para cochilar por um dos comandos @code{(sleep-@dots{})}, ent@~{a}o o controle permanece no la@,{c}o principal at@'{e} que a ``cochilada'' do fluxo de entrada atual tenha terminado. @xref{sleep-until, @code{(sleep-until @dots{})}}. @xref{sleep-for, @code{(sleep-for @dots{})}}. @end table @node progn, quit, process-events, GCL Reference @subsection progn @findex progn @table @code @item (progn DECLARA@,{C}@~{A}O [ @dots{} ]) evaluates each DECLARA@,{C}@~{A}O in order and retorna o value do last one. Use progn to group a collection of commands together, forcing them to be treated as a single command. @end table @node quit, quote, progn, GCL Reference @subsection quit @findex quit @table @code @item (quit) @code{quit} is a synonym for @ref{exit, @code{exit}}. @end table @node quote, rawevent, quit, GCL Reference @subsection quote @findex quote @table @code @item (quote EXPR) retorna uma express@~{a}o simb@'{o}lica em lisp @var{EXPR} sem avali@'{a}-la. Note, todavia, que @code{quote} analisa @var{EXPR} como se ela pudesse ser avaliada. @xref{eval, @code{(eval @dots{})}}. @end table @node rawevent, rawpick, quote, GCL Reference @subsection rawevent @findex rawevent @table @code @item (rawevent dev val x y t) Coloca o evento de linha especificado em uma fila de eventos. Os argumento especificam diretamente os membros da estrutura do evento usada internamente pelo geomview. Esse @'{e} o manipulador de evento de mais baixo n@'{i}vel e n@~{a}o foi pensado para uso geral. @end table @node rawpick, read, rawevent, GCL Reference @subsection rawpick @findex rawpick @table @code @item (rawpick CAMID X Y) Process a pick event in camera CAMID at location (X,Y) given in integer pixel coordenadas. This is a low-level procedure not intended for external use. @end table @node read, real-id, rawpick, GCL Reference @subsection read @findex read @table @code @item (read @{geometry|camera|apar@^{e}ncia|image|ntransform|transform|command@} @{GEOMETRY ou CAMERA ou @dots{}@}) L@^{e} e interpreta o texto em @dots{} como contendo o tipo de dado fornecido. @'{U}til para definir objetos usando a sintaxe de refer@^{e}ncia OOGL, e.g. @example (geometry thing @{ INST transform : T geom : fred @}) (read geometry @{ define fred QUAD 1 0 0 0 1 0 0 0 1 1 0 0 @}) (read transform @{ define T . Se n@~{a}o for especificado um nomearquivo, veja @ref{rib-display, @code{(rib-display @dots{}}} para uma explana@,{c}@~{a}o do nomearquivo usado. @end table @node scale, scene, rib-snapshot, GCL Reference @subsection scale @findex scale @table @code @item (scale GEOM-ID FATOR [FATORY FATORZ]) Ajusta proporcionalmente GEOM-ID, multiplicando seu tamanho por FATOR. Os fatores devem ser n@'{u}meros positivos. Se FATORY e FATORZ estiverem presentes e forem n@~{a}o nulos, o objeto @'{e} ajustado proporcionalmente por FATOR na dire@,{c}@~{a}o x, por FATORY na dire@,{c}@~{a}o y, e por FATORZ na dire@,{c}@~{a}o z. Se somente FATOR estiver presente, o objeto @'{e} justado proporcionalmente por FACTOR nas tr@^{e}s dire@,{c}@~{o}es x, y, e z. Ajustes proporcionais somente fazem sentido realmente no espa@,{c}o de Euclides. Ajustes proporcionais usando o mouse nos outros espa@,{c}o n@~{a}o @'{e} permitido; o comando scale pode ser emitido em outros espa@,{c}os mas deve ser usado com cuidado pelo fato de poder fazer com que dados extendam-se para al@'{e}m dos limites do espa@,{c}o. @end table @node scene, set-clock, scale, GCL Reference @subsection scene @findex scene @table @code @item (scene CAM-ID [GEOMETRY]) Make CAM-ID look at GEOMETRY instead of at the universe. @end table @node set-clock, set-conformal-refine, scene, GCL Reference @subsection set-clock @findex set-clock @table @code @item (set-clock TIME) Ajusta o rel@'{o}gio para esse fluxo de comando para ler @var{TIME} (em segundos) a partir do momento que o comando @'{e} recebido. @xref{sleep-until, @code{(sleep-until @dots{})}}. @xref{clock, @code{(clock @dots{})}}. @end table @node set-conformal-refine, set-emodule-path, set-clock, GCL Reference @subsection set-conformal-refine @findex set-conformal-refine @table @code @item (set-conformal-refine CMX [N [SHOWEDGES]]) Ajusta os par@^{a}metros para o algor@'{i}tmos de refinamento usado no desenho no modelo conformacional. CMX @'{e} o cosseno do maior @^{a}ngulo e arestas podem entortar antes de serem refinadas. Seus valores devem estar entre -1 e 1; o padr@~{a}o @'{e} 0.95; deminuindo seu valor ir@'{a} fazer causar menos refinamento. N @'{e} o n@'{u}meo m@'{a}ximo de itera@,{c}@~{o}es de refinamento; o padr@~{a}o @'{e} 6. SHOWEDGES, que pode ser @code{no} ou @code{yes}, determina se arestas interiores no refinamento s@~{a}o desenhadas. @end table @node set-emodule-path, set-load-path, set-conformal-refine, GCL Reference @subsection set-emodule-path @findex set-emodule-path @table @code @item (set-emodule-path (PATH1 @dots{} PATHN)) Ajusta o caminho de busca por m@'{o}dulos externos. Os PATHi devem ser nomes de caminho de diret@'{o}rios contendo, para cada m@'{o}dulo, o arquivo execut@'{a}vel do m@'{o}dulo e um arquivo .geomview- que cont@'{e}m um comando (emodule-define @dots{}) para aquele m@'{o}dulo. Esse comando implicitamente chama (rehash-emodule-path) para reconstruir o navegador de aplica@,{c}@~{o}es a partir do novo caminho ajustado. O nome especial de diret@'{o}rio @code{+} @'{e} substitu@'{i}do pelo caminho atual, ent@~{a}o e.g. (set-emodule-path (meudir +)) anexa meudir no in@'{i}cio do caminho. @end table @node set-load-path, set-motionscale, set-emodule-path, GCL Reference @subsection set-load-path @findex set-load-path @table @code @item (set-load-path (PATH1 @dots{} PATHN)) Ajusta o caminho de busca para comando, objeto geom@'{e}trico, arquivos, etc. Os PATHi s@~{a}o sequ@^{e}ncias de caracteres fornecendo os nomesmde caminho de diret@'{o}rios a serem buscados. O nome especial de diret@'{o}rios @code{+} @'{e} substitu@'{i}do pelo caminho atual, ent@~{a}o e.g. (set-load-path (meudir +)) anexa meudir no in@'{i}cio do caminho. @end table @node set-motionscale, setenv, set-load-path, GCL Reference @subsection set-motionscale @findex set-motionscale @table @code @item (set-motionscale X) Ajusta o fator de proporcionalidade do movimento para X (o valor padr@~{a}o @'{e} 0.5). Esses comandos ajustam proporcionalmente seu movimento por uma quantidade que depende da dist@^{a}ncia do quadro ao centro e do tamanho do quadro. Especificamente, ele ajusta de forma proporcional dist + scaleof(frame) * motionscale onde dist @'{e} a dit@^{a}ncia a partir do centro ao quadro e motionscale @'{e} o fator de ajuste proporcional do movimento ajustado por essa fun@,{c}@~{a}o. Scaleof(frame) mede o tamanho do objeto frame. @end table @node setenv, setq, set-motionscale, GCL Reference @subsection setenv @findex setenv @table @code @item (setenv nome string) ajusta a vari@'{a}vel de ambiente @code{nome} para o valor @var{string}; o nome @'{e} vis@'{i}vel para o geomview (como em nomes de caminho contendo @code{$nome}) e para processos cria-se, e.g. m@'{o}dulos externos. @end table @node setq, sgi, setenv, GCL Reference @subsection setq @findex setq @table @code @item (setq SYM EXPR) Bind the symbold @var{SYM} to the value of @var{EXPR}. @var{SYM} must be an unqualified symbol, i.e. not aspas duplas, and literal: @code{(setq "foo" bar)} will not work. Likewise @code{(setq (bar STUFF) foo)} will also not work, even if @code{(bar @dots{})} would evaluate to an unqualified symbol: varible names must be literals. Note that calling @code{(setq SYM @dots{})} will alter the value of @var{SYM} within the current name-space: if @var{SYM}, e.g., is bound as local variable by a lambda, let ou defun expression, then @code{(setq SYM @dots{})} will change the value of the local variable, the global binding will remain unchanged. It is NOT possible to un-bind a symbol. However, subsequent @code{(setq SYM @dots{})} invocations will re-bind @var{SYM} to another value and free the lisp-object previously bound to @var{SYM}. @xref{lambda, @code{(lambda @dots{})}}. @xref{defun, @code{(defun @dots{})}}. @xref{let, @code{(let @dots{})}}. @end table @node sgi, shell, setq, GCL Reference @subsection sgi @findex sgi @table @code @item (sgi) Returns @code{t} if running on an sgi machine, @code{nil} if not. A relict from the old work-station years. @end table @node shell, sleep-for, sgi, GCL Reference @subsection shell @findex !, shell @findex shell, ! @table @code @item (shell SHELL-COMMAND) Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview waits for it to complete and will be unresponsive until it does. A synonym is @code{!}. @end table @node sleep-for, sleep-until, shell, GCL Reference @subsection sleep-for @findex sleep-for @table @code @item (sleep-for TIME) Suspend reading commands from this stream for TIME seconds. Commands already read will still be executed; @code{sleep-for} inside @code{progn} won't delay execution do rest do progn's contents. @end table @node sleep-until, snapshot, sleep-for, GCL Reference @subsection sleep-until @findex sleep-until @table @code @item (sleep-until TIME) Suspend reading commands from this stream until TIME (in seconds). Commands already read will still be executed; @code{sleep-until} inside @code{progn} won't delay execution do rest do progn's contents. Time is measured according to this stream's clock, as set by @code{set-clock}; if never set, the first sleep-until sets it to 0 (so initially (sleep-until TIME) is the same as (sleep-for TIME)). Returns the number of seconds until TIME. @end table @node snapshot, soft-shader, sleep-until, GCL Reference @subsection snapshot @findex snapshot @table @code @item (snapshot CAM-ID NOMEDOARQUIVO [FORMAT [XSIZE [YSIZE]]]) Save a snapshot of @var{CAM-ID} in the @var{NOMEDOARQUIVO} (a sequ@^{e}ncia de caracteres). The @var{FORMAT} argumento is optional; it may be "ppmscreen" (the default), "ps", "ppm", "sgi" (on SGI machines), "ppmosmesa" (if built with libOSMesa) ou "ppmosglx". A "ppmscreen" snapshot is created by reading the image directly from the given janela; the janela is popped above other janelas and redrawn first, then its contents are written as a PPM format image. A "ppmosmesa" snapshot is drawn by Mesa's software renderer into a memory buffer in RAM. A "ppmosglx" snapshot is rendered into a GLX Pixmap buffer, which is also off-screen but may ou may not reside in video RAM. Rendering may ou may not be accelerated. The problem with on-screen snapshots is that the janela must be mapped and not obscured by other janelas. So on-screen snapshots will not work in the background, ou when a screen safer is active. With "ps", dumps a Postscript picture representing the view from that janela; hidden-surface removal might be incorrect. With "ppm", dumps a PPM-format image produced by geomview's internal software renderer; this may be of arbitrary size. If the @var{NOMEDOARQUIVO} argumento begins with "|", it's interpreted as a @code{/bin/sh} command to which the PPM ou PS data should be piped. Optional @var{XSIZE} and @var{YSIZE} values are relevant only for "ppm" formats, and render to a janela of that size (or scaled to that size, with aspect fixed, if only @var{XSIZE} is given) @end table @node soft-shader, space, snapshot, GCL Reference @subsection soft-shader @findex soft-shader @table @code @item (soft-shader CAM-ID @{on|off|toggle@}) Select se to use software ou hardware shading in that camera. @end table @node space, stereowin, soft-shader, GCL Reference @subsection space @findex space @table @code @item (space @{euclidean|hyperbolic|spherical@}) Set the space associated with the world. @end table @node stereowin, time-interests, space, GCL Reference @subsection stereowin @findex stereowin @table @code @item (stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize]) Configure CAM-ID as a stereo janela. no: entire janela is a single pane, stereo disabled@* horizontal: split left/right: left is stereo eye#0, right is #1.@* vertical: split top/bottom: bottom is eye#0, top is #1.@* colored: panes overlap, red is stereo eye#0, cyan is #1. A gap of @code{gapsize} pixels is left between subjanelas; se omitido, subjanelas are adjacent. If both layout and gapsize are omitido, e.g. (stereowin CAM-ID), returns current settings as a @code{(stereowin @dots{})} command list. This command doesn't set stereo projection; use @code{merge camera} or @code{camera} to set the stereyes transforms, and @code{merge window} or @code{window} to set the pixel aspect ratio & janela position if needed. @end table @node time-interests, transform, stereowin, GCL Reference @subsection time-interests @findex time-interests @table @code @item (time-interests deltatime initial prefix [suffix]) Indicates that all interest-related messages, when separated by at least @code{deltatime} seconds of real time, should be preceded by the sequ@^{e}ncia de caracteres @code{prefix} and followed by @code{suffix}; the first message is preceded by @code{initial}. All three are printf format strings, whose argumento is the current clock time (in seconds) on that stream. A @code{deltatime} of zero timestamps every message. Typical usage:@* (time-interests .1 @code{(set-clock %g)} @code{(sleep-until %g)}) or@* (time-interests .1 @code{(set-clock %g)} "(sleep-until %g) (progn (set-clock %g)" ")") or@* (time-interests .1 "(set-clock %g)" "(if (> 0 (sleep-until %g)) (" "))". @end table @node transform, transform-incr, time-interests, GCL Reference @subsection transform @findex transform @table @code @item (transform objetoID centerID frameID [rotate|translate|translate-scaled|scale] x y z [bbox-center|origin] [dt [@code{smooth}]]) Apply a motion (rotation, translation, scaling) to object @code{objetoID}; that is, construct and concatenate a transformation matrix with objetoID's transform The 3 IDs involved are the object that moves, the center of motion, and the frame of reference in which to apply the motion. The center is easiest understood for rotations: if centerID is the same as objetoID then it will spin around its own axes; otherwise the moving object will orbit the center object. There is the special keyword @code{bbox-center} which may be used for @code{centerID}. As a result the motion will be relative to the center of the bounding box of @code{objetoID}. Normally frameID, in whose coordinate system the (mouse) motions are interpreted, is @code{focus}, the current camera. Translations can be scaled proportional to the distance between the target and the center. Support for spherical and hyperbolic as well as Euclidean space is built-in: use the @code{space} command to change spaces. With type @code{rotate} x, y, and z are floats specifying angles in RADIANS. For types @code{translate} and @code{translate-scaled} x, y, and z are floats specifying distances in the coordinate system of the center object. The optional @code{dt} field allows a simple form of animation; if present, the objeto moves by just that amount during approximately @code{dt} seconds, then stops. If present and followed by the @code{smooth} keyword, the movimento is animated with a 3t^2-2t^3 function, so as to start and stop smoothly. If absent, the movimento is applied immediately. @end table @node transform-incr, transform-set, transform, GCL Reference @subsection transform-incr @findex transform-incr @table @code @item (transform-incr objetoID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center] [dt [smooth]]) Apply continuing movimento: construct a matriz de transforma@,{c}@~{a}o and concatenate it with the current transform of objetoID every refresh (sets objetoID's incremental transform). Same syntax as transform. If optional @code{dt} argumento is present, the objeto is moved at each time step such that its average movimento equals one instance do movimento per @code{dt} seconds. E.g. (transform-incr World World World rotate 6.28318 0 0 10.0) rotates the World about its X axis at 1 turn (2pi radians) per 10 seconds. @end table @node transform-set, truncate, transform-incr, GCL Reference @subsection transform-set @findex transform-set @table @code @item (transform-set objetoID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center]) Set objetoID's transform to the constructed transform. Same syntax as transform. @end table @node truncate, ui-cam-focus, transform-set, GCL Reference @subsection truncate @findex truncate @table @code @item (truncate EXPR) Rounds @var{EXPR} towards zero. @end table @node ui-cam-focus, ui-center, truncate, GCL Reference @subsection ui-cam-focus @findex ui-cam-focus @table @code @item (ui-cam-focus [focus-change|mouse-cross]) Set the focus policy for the janelas de c@^{a}mera. The default is @code{mouse-cross}: a c@^{a}mera is made the active c@^{a}mera (for interactive mouse events) when o cursor do mouse crosses the janela. Because this means it can become complicated to activate a specific c@^{a}mera (in the context of multiple janelas de c@^{a}mera) there is also the option to only change the c@^{a}mera focus when the janela-manager decides to give it the focus for input events. So, after specifying @code{focus-change} it depends on the focus-change configuration of your janela-manager when a c@^{a}mera becomes the active c@^{a}mera for mouse-interaction. To change this behaviour permanently you could, e.g., place the following line in your @file{$@{HOME@}/.geomview} file (Veja @ref{Customizacao}): @example (progn (ui-cam-focus focus-change) @dots{} # other stuff ) @end example @end table @node ui-center, ui-center-origin, ui-cam-focus, GCL Reference @subsection ui-center @findex ui-center @table @code @item (ui-center ID) Set the center for user interface (i.e. mouse) controlled movimentos to objeto ID. @end table @node ui-center-origin, ui-emotion-program, ui-center, GCL Reference @subsection ui-center-origin @findex ui-center-origin @table @code @item (ui-center-origin [origin|bbox-center]) Set the origin do coordinate system do @code{CENTER} objeto for user interface (i.e. mouse) controlled movimentos. The keyword @code{origin} means to use the origin do coordinate system do currently selected objeto, while @code{bbox-center} means to use the center da bounding box do current objeto. The keyword @code{bbox-center} makes no sense if the objeto geom@'{e}trico is non-Euclidean. Using either @code{bbox-center} ou @code{origin} does not make a difference if the objeto do centro is not a @emph{geometry}, e.g. if it is a camera. Same holds if the World is the currently selected objeto. @end table @node ui-emotion-program, ui-emotion-run, ui-center-origin, GCL Reference @subsection ui-emotion-program @findex ui-emotion-program @table @code @item (ui-emotion-program PROGRAM) This @'{e} uma obsolete command. Use its new eqivalent @ref{emodule-define, @code{emodule-define}} instead. @end table @node ui-emotion-run, ui-freeze, ui-emotion-program, GCL Reference @subsection ui-emotion-run @findex ui-emotion-run @table @code @item (ui-emotion-run EMODULE) This @'{e} uma obsolete command. Use its new eqivalent @ref{emodule-start, @code{emodule_start}} instead. @end table @node ui-freeze, ui-html-browser, ui-emotion-run, GCL Reference @subsection ui-freeze @findex ui-freeze @table @code @item (ui-freeze @{on|off@}) Toggle updating user interface panels. Off by default. @end table @node ui-html-browser, ui-motion, ui-freeze, GCL Reference @subsection ui-html-browser @findex ui-html-browser @table @code @item (ui-html-browser BROWSER) Use @var{BROWSER} for viewing the @var{HTML}-version do manual when the @samp{Manual (HTML)} menu item is selected in the @samp{Help}-menu. If the @code{(ui-html-browser @dots{})} command was never executed, then the default is to use the browser stored in the @code{WEBBROWSER} environment variable. If the environment variable is unset then the default is compile-time dependent. @end table @node ui-motion, ui-panel, ui-html-browser, GCL Reference @subsection ui-motion @findex ui-motion @table @code @item (ui-motion @{inertia|constrain|own-coordinates@} @{on|off@}) Enable ou disable certain properties of mouse-controlled movimento. The purpose of this command is to give access to the respective toggles of the @emph{Main} panel's @emph{Motion} menu through GCL commands. @xref{Movimentos do Mouse}. @table @code @item inertia Normally, moving objetos have inertia: if o mouse is still moving when the bot@~{a}o is released, the selected objeto continues to move. When @code{inertia} is off, objetos cease to move as soon as you release the mouse. @item constrain It's sometimes handy to move an objeto in a direction aligned with a coordinate axis: exactly horizontally ou vertically. Calling @code{(ui-motion constrain on)} changes the interpretation of mouse movimentos to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical movimento. Note that the movimento is still along the X ou Y axes of the c@^{a}mera in which you move o mouse, not necessarily the objeto's own coordinate system. @item own-coordinates It's sometimes handy to move objetos with respect to the coordinate system where they were defined, rather than with respect to some camera's view. When @code{(ui-motion own-coordinates on)} has been called, all movimentos are interpreted that way: dragging o mouse rightward in translate mode moves the objeto in its own @var{+X} direction, and so on. May be especially useful in conjunction with the @code{(ui-motion constrain on)} command. @end table @end table @node ui-panel, ui-pdf-viewer, ui-motion, GCL Reference @subsection ui-panel @findex ui-panel @table @code @item (ui-panel PANELNAME @{on|off@} [WINDOW]) Do ou don't display the given user-interface panel. Case is ignored in panel names. Current @var{PANELNAMEs} are: @table @asis @item geomview main panel @item tools movimento controls @item appearance controles de apar@^{e}ncia @item cameras c@^{a}mera controls @item lighting lighting controls @item obscure obscure controls (doesn't seem to exist any more) @item materials material properties controls @item command command entry box @item credits geomview credits @end table By default, the @code{geomview} and @code{tools} panels appear when geomview starts. If the optional Window is supplied, a @code{position} clause (e.g. (ui-panel obscure on @{ position xmin xmax ymin ymax @}) sets the panel's default position. (Only xmin and ymin values are actually used.) A present but empty Window, e.g. @code{(ui-panel obscure on @{})@} causes interactive positioning. @end table @node ui-pdf-viewer, ui-target, ui-panel, GCL Reference @subsection ui-pdf-viewer @findex ui-pdf-viewer @table @code @item (ui-pdf-viewer VIEWER) Use the executable @var{VIEWER} for viewing the @var{PDF}-version do manual when the @samp{Manual (PDF)} menu-item is selected in the @samp{Help}-menu. If the @code{(ui-pdf-viewer @dots{})} command was never executed, then the default is to use the browser stored in the @code{PDFVIEWER} environment variable. If the environment variable is unset then the default is compile-time dependent. @end table @node ui-target, uninterest, ui-pdf-viewer, GCL Reference @subsection ui-target @findex ui-target @table @code @item (ui-target ID [yes|no]) Set the target of user actions (the selected line do objeto alvo browser) to ID. The segundo argumento especifica se to make ID the current objeto regardless of its type. If @code{no}, then ID becomes the current objeto of its type (geom ou camera). The default is @code{yes}. This command may result in a change of modos de movimento based on target choice. @end table @node uninterest, update, ui-target, GCL Reference @subsection uninterest @findex uninterest @table @code @item (uninterest (COMMAND [args])) Undoes the effect of an @code{interest} command. (COMMAND [args]) must be identical to those used in the @ref{interest, @code{interest}} command. @end table @node update, update-draw, uninterest, GCL Reference @subsection update @findex update @table @code @item (update [timestep_in_seconds]) Apply each incremental movimento once. Uses timestep if it's present and nonzero; otherwise movimentos are proportional to elapsed real time. @end table @node update-draw, while, update, GCL Reference @subsection update-draw @findex update-draw @table @code @item (update-draw CAM-ID [timestep_in_seconds]) Apply each incremental movimento once and then draw CAM-ID. Applies @code{timestep} seconds' worth of movimento, ou uses elapsed real time if @code{timestep} is absent ou zero. @end table @node while, window, update-draw, GCL Reference @subsection while @findex while @table @code @item (while TEST BODY) Iterate: @emph{evaluate @var{TEST}, if non nil, evaluate @var{BODY}}. @end table @node window, winenter, while, GCL Reference @subsection window @findex window @table @code @item (window CAM-ID WINDOW) Specify attributes for the janela of CAM-ID, e.g. its size ou initial position, in the OOGL Window syntax. The special CAM-ID @code{default} especifica properties of future janelas (created by @ref{camera, @code{camera}} ou @ref{new-camera, @code{new-camera}}). @end table @node winenter, write, window, GCL Reference @subsection winenter @findex winenter @table @code @item (winenter CAM-ID) Tell geomview that o cursor do mouse is in the janela of CAM-ID. This function is for development purposes and is not intended for general use. @end table @node write, write-comments, winenter, GCL Reference @subsection write @findex write @table @code @item (write @{command|geometry|camera|transform|ntransform|window|bbox@} NOMEDOARQUIVO [ID|(ID @dots{})] [self|world|universe|outroID]) write description of ID in given format to NOMEDOARQUIVO. Last parameter chooses coordinate system for geometry & transform: self: just the objeto, no transforma@,{c}@~{a}o ou apar@^{e}ncia (objeto geom@'{e}trico only) world: the objeto as positioned within the World. universe: objeto's position in universal coordenadas; includes Worldtransform other ID: the objeto transformed to o sistema de coordenadas de outroID. A filename of @code{-} is a special case: data are written to the stream from which the 'write' command was read. For external modules, the data are sent to the module's standard input. For commands not read from an external program, @code{-} means geomview's standard output (@pxref{command, @code{(command @dots{})}}). The ID can either be a single id ou a parenthesized list of ids, like @code{g0} ou @code{(g2 g1 dodec.off)}. @end table @node write-comments, write-handle, write, GCL Reference @subsection write-comments @findex write-comments @table @code @c JORGE JORGE JORGE VERIFICAR A TRADU@,{C}@~{A}O DE LIST PARA LISTA ABAIXO @item (write-comments NOMEDOARQUIVO GEOMID PICKPATH) write OOGL COMMENT objetos in the GEOMID hierarchy at the level do pick path to NOMEDOARQUIVO. Specifically, COMMENTS at level (a b c @dots{} f g) will match pick paths da form (a b c @dots{} f *) where * includes any value of g, and also any values of possible further indices h,i,j, etc. The pick path (returned in the @code{pick} command) is a list of integer counters specifying a subpart of a hierarchical OOGL objeto. Descent into a complex objeto (LISTA ou INST) adds a new integer to the path. Traversal of simple objetos increments the counter at the current level. Individual COMMENTS are enclosed by curly braces, and the entire sequ@^{e}ncia de caracteres of zero, one, ou more COMMENTS (written in the order in which they are encountered during hierarchy traversal) is enclosed by parentheses. Note that arbitrary data can only be passed through the OOGL libraries as full-fledged OOGL COMMENT objetos, which can be attached to other objetos OOGL via the LISTA type as described above. Ordinary comments in OOGL files (i.e. everything after '#' on a line) are ignored at when the file is loaded and cannot be returned. @end table @node write-handle, write-sexpr, write-comments, GCL Reference @subsection write-handle @findex write-handle @table @code @item (write-handle PREFIX NOMEDOARQUIVO HANDLE) Writes the objeto underlying the given handle to @var{NOMEDOARQUIVO}. This function is intended for internal debugging use only. @end table @node write-sexpr, xform, write-handle, GCL Reference @subsection write-sexpr @findex write-sexpr @table @code @item (write-sexpr NOMEDOARQUIVO LISPOBJECT) Writes the given LISPOBJECT to NOMEDOARQUIVO. This function is intended for internal debugging use only. @end table @node xform, xform-incr, write-sexpr, GCL Reference @subsection xform @findex xform @table @code @item (xform ID TRANSFORM) Concatenate TRANSFORM with the current transform do objeto (apply TRANSFORM to objeto ID). @end table @node xform-incr, xform-set, xform, GCL Reference @subsection xform-incr @findex xform-incr @table @code @item (xform-incr ID TRANSFORM) Apply continual movimento: concatenate TRANSFORM with the current transform do objeto every refresh (set objeto ID's incremental transform to TRANSFORM). @end table @node xform-set, zoom, xform-incr, GCL Reference @subsection xform-set @findex xform-set @table @code @item (xform-set ID TRANSFORM) Overwrite the current objeto transform with TRANSFORM (set objeto ID's transform to TRANSFORM). @end table @node zoom, , xform-set, GCL Reference @subsection zoom @findex zoom @table @code @item (zoom CAM-ID FACTOR) Zoom CAM-ID, multiplying its field of view by FACTOR. FACTOR should be a positive number. @end table @comment **************************************************************** @node Geometrias Nao-Euclidianas, Mathematica, GCL, Top @chapter Geometrias N@~{a}o-Euclidianas Geomview supports hyperbolic and spherical objeto geom@'{e}trico as well as Euclidean objeto geom@'{e}trico. The three bot@~{o}es at the bottom do @emph{Main} panel are for setting the current objeto geom@'{e}trico type. In each das three geometries, three models are supported: @emph{Virtual}, @emph{Projective}, and @emph{Conformal}. You can change the current model with the @emph{Model} browser on the @emph{Camera} panel. Each Geomview c@^{a}mera has its own model setting. The default model is all three spaces is @emph{Virtual}. This corresponds to the c@^{a}mera being in the same space as, and moving under the same set of transformations as, the objeto geom@'{e}trico itself. In Euclidean space @emph{Virtual} is the most useful model. The other models were implemented for hyperbolic and spherical spaces and just happen to work in Eucldiean space as well: @emph{Projective} is the same as @emph{Virtual} but by default displays the unit sphere, and @emph{Conformal} displays everything inverted in the unit sphere. In hyperbolic space, the @emph{Projective} model setting gives a view do projective ball model of hyperbolic 3-space imbedded in Euclidean space. The c@^{a}mera is initially outside the unit ball. In this model, the c@^{a}mera moves by Euclidean movimentos and objeto geom@'{e}trico moves by hyperbolic movimentos. @emph{Conformal} model is similar but shows the conformal ball model instead. In spherical space, the @emph{Projective} model gives a view of half da 3-sphere imbedded in Euclidean 3-space. Spherical movimentos give rise to projective transformations in the @emph{Projective} model, and to @tex M\"{o}bius @end tex @ifnottex Moebius @end ifnottex transformations in the @emph{Conformal} model. In both of these models the c@^{a}mera moves by Euclidean movimentos. In @emph{Projective} and @emph{Conformal} models, the unit sphere is drawn by default. You can turn it off and on at will using the @emph{Draw Sphere} bot@~{a}o in the @emph{Camera} panel. In the @emph{Conformal} model, pol@'{i}gonos and edges are subdivided as necessary to make them look curved. The parameters which determine this subdivision can be set with the @code{set-conformal-refine} GCL command. @xref{set-conformal-refine,@code{(set-conformal-refine @dots{})}}. There are several sample hyperbolic space objetos in the @file{data/geom/hyperbolic} subdirectory do Geomview directory. Likewise, the subdirectory @file{data/geom/spherical} contains several sample spherical space objetos. @comment **************************************************************** @node Mathematica, Instalacao, Geometrias Nao-Euclidianas, Top @chapter Gr@'{a}ficos Matem@'{a}ticos no Geomview ou no RenderMan Geomview comes with some Mathematica packages that let you use use Geomview to display Mathematica graphics. Mathematica is a commercial mathematical software system available from Wolfram Research, Inc. There are two ways to do this. @enumerate @item Use Mathematica to write a graphics objeto to a file in OOGL format or in RIB format. @item Use Geomview as the default display for all 3D graphics output in Mathematica. @end enumerate You can also use these packages to save Mathematica graphics in RenderMan (RIB) format. Since the format of Mathematica graphics objetos is different from the OOGL formats, both of these methods involve translating Mathematica graphics to OOGL format. Geomview is distributed with a Mathematica package which does this translation. Before doing either dos above you must install this package. @menu * OOGL.m:: Generating OOGL files in Mathematica. * Geomview.m:: Geomview as Mathematica's Default 3D Display. * RenderMan:: Generating RenderMan files in Mathematica. * Remote Display:: Using Geomview and Mathematica on different computers. * Package Details:: Some details about the packages. * Package Installation:: Installing the Mathematica->Geomview package. @end menu @comment ================================================================ @node OOGL.m, Geomview.m, Mathematica, Mathematica @section Using Mathematica to generate OOGL files The package @file{OOGL.m} allows Mathematica to write graphics objetos in OOGL format. To use it, give the command @code{<< OOGL.m} to Mathematica to load the package. The @code{WriteOOGL[@var{file},@var{graphics}]} command writes an OOGL description do 3D graphics objeto @var{graphics} to the file named @var{file}.@refill This package also provides the @code{Geomview} command which sends a 3D graphics objeto to Geomview. The first time you use this command it starts up a copy of Geomview. Later calls send the graphics to the same Geomview. There are two ways to use the @code{Geomview} command. @table @code @item Geomview[@var{graphics}] Sends the 3D graphics objeto @var{graphics} to Geomview as a geom named @code{Mathematica}. Subsequent usage of @code{Geomview[@var{graphics}]} replaces the @code{Mathematica} objeto in Geomview with the new @var{graphics}. @item @code{Geomview[@var{name},@var{graphics}]} Sends the 3D graphics objeto @var{graphics} to Geomview as a geom named @var{name}. You can use multiple calls of this form with different names to cause Geomview to display several Mathematica objetos at once and allow independent control over them. @end table @example % math Mathematica 2.0 for SGI Iris Copyright 1988-91 Wolfram Research, Inc. -- GL graphics initialized -- In[1] := <"riemann"] @end example @noindent This displays the graphics @code{%3} on the remote host named @code{riemann}.@refill @code{Geomview} recognizes the sequ@^{e}ncia de caracteres @code{"local"} as a value for @code{$DisplayHost}; it forces the graphics to be displayed on the local machine.@refill In addition to knowing the name da machine you want to run Geomview on, @code{Geomview} needs to know the type of that machine (the setting da CPU variable that corresponds to the machine; @pxref{Source Code Installation}). By default, @code{Geomview} assumes that it is the same kind of computer as the one you are running Mathematica on. The @code{MachType} option lets you explicitly specify the type do @code{DisplayHost} computer; it should be one das sequ@^{e}ncias de caracteres @code{"sgi"} or @code{"next"} ou @code{"x11"}.@refill You can use @code{SetOptions} to change the default @code{DisplayHost} and @code{MachType}. For exemplo, @example In[4] := SetOptions[Geomview, DisplayHost->"riemann", MachType->"sgi"] @end example @noindent arranges for @code{Geomview} to run Geomview on an SGI workstation named @code{riemann}.@refill @comment ---------------------------------------------------------------- @node Chunks, , Networked Geomview, Remote Display @subsection Transporting Mathematica Files to Geomview by Hand The auxilliary function @code{WriteChunk} is for those who can only use Mathematica on a computer that Geomview isn't installed on. @code{WriteChunk[@var{file}, @var{graphics}]} generates a file named @var{file} which contains the graphics objeto @var{graphics} in the format accepted by @file{math2oogl}.@refill You can transfer that file to a computer that has Geomview installed on it and then use the programs @file{math2oogl}, @file{oogl2ri}b, and @file{geomview} directly from the shell. These programs are distributed in the @file{bin/} subdirectory do Geomview directory, and may have been installed so that they are on your @code{path}. @example In[1]:= < mma.oogl @end example @noindent to convert it to the OOGL file @file{mma.oogl} which you can then view using Geomview. This is the equivalent do @code{WriteOOGL} command. For a result equivalent to the @code{Geomview} ou @code{Show} commands, type @example math2oogl -togeomview Mathematica geomview < mychunk @end example @noindent The @code{WriteRI}b command can be emulated from the shell as @example math2oogl < mychunk | oogl2rib -n mma.tiff @end example @noindent @comment ================================================================ @node Package Details, Package Installation, Remote Display, Mathematica @section Details of the Mathematica->Geomview Package The @file{OOGL.m} package uses the external program @file{math2oogl} to convert @code{Graphics3D} objetos to OOGL format, because a compiled external program is able to do this conversion many times faster than Mathematica. The converter will sometimes handle colored SurfaceGraphics objetos correctly that Mathematica does not handle correctly, which means that Geomview[objeto] sometimes works where Show[objeto] will give errors. The converter supports the @code{Polygon}, @code{Line}, and @code{Point} graphics primitives, @code{RGBColor Graphics3D} directives, and @code{SurfaceGraphics} objetos with ou without @code{RGBColor} directives, and lists of any combination of these. It silently ignores all other directives. The Mathematica to RenderMan conversion is actually a two-step process: Mathematica->OOGL (math2oogl), and OOGL->RenderMan (oogl2rib). In the @code{WriteOOGL} and @code{WriteRI}b commands, filename can either be a sequ@^{e}ncia de caracteres containing a filename, an @code{OutputStream} objeto, or a sequ@^{e}ncia de caracteres starting with a @code{!} to send the output to a command. Objeto can be a @code{Graphics3D} objeto, a @code{SurfaceGraphics} objeto, ou a list of these.@refill The packages work best with Mathematica 2.0 ou better. With version 1.2, the Geomview display is always on the local host. @comment ================================================================ @node Package Installation, , Package Details, Mathematica @section Installing the Mathematica Packages @quotation @b{BUG} This section is out of date. @code{Geomview} follows the GNU-installation habits, data goes to @file{PREFIX/share/geomview/}, user executables to @file{PREFIX/bin/}, private executables to @file{PREFIX/libexec/geomview/}, libraries to @file{PREFIX/lib/} where @code{PREFIX} denotes the installation prefiex specified for the @file{TOPSRCDIR/configure} script. Please have a look at the files @file{TOPSRCDIR/INSTALL} and @file{TOPSRCDIR/INSTALL.Geomview} for installation instructions. The installed Mathematica data-files can be found in @file{PREFIX/share/geomview/Mathematica/}. @end quotation If Geomview is properly installed on your system according to the instructions in @xref{Instalacao}, then the Mathematica-to-Geomview packages should work as described here; there should be no need for additional installation procedures. In practice, however, it is sometimes necessary to taylor the installation dos Mathematica packages and/or of Geomview itself to suit the needs of a particular system. This section contains details about how the installation works; if the Mathematica-to-Geomview connection does not seem to work for you after following the Geomview installation procedure, consult this section to see what might need to be fixed. In this section, the phrase @emph{Geomview installation} refers any of the procedures in @xref{Instalacao}. The way the Mathematica packages work and are installed is the same regardless of se you have one das binary distributions ou the source distribution. @enumerate @item The relevant mathematica files are @file{OOGL.m}, @file{Geomview.m}, and @file{BezierPlot.m}; Mathematica must be able to find these files. They are distributed in the @file{PREFIX/share/geomview/Mathematica} subdirectory das binary distributions, and in the @file{TOPSRCDIR/src/bin/geomutil/math2oogl} subdirectory da source distribution. These files need to be in a directory that is on Mathematica's search path. You can look at the value of the @code{$Path} variable in a Mathematica session on your system to see a list dos directories on Mathematica's search path. The Geomview installation procedure puts copies dos Mathematica packages into a directory that you specify (@code{MMAPACKAGEDIR}). This should ensure that Mathematica can find them. Alternately, you could arrange to append the pathname dos Mathmematica package subdirectory da Geomview distribution to the @code{$Path} variable each time you run Mathematica. @item The package @file{OOGL.m} needs to be able to invoke the programs @file{geomview}, @file{math2oogl}, and @file{oogl2rib}. The Geomview installation procedure installs these programs into a directory that you specify for executables (@code{BINDIR}). Ideally, this directory should be on your shell's @code{$PATH}. More specifically, it should be on the @code{$PATH} do shell in which Mathematica runs; the directory @file{/usr/local/bin} is usually a good choice. You can see the list of directories on this path by giving the command @code{!echo $path} in Mathematica. If for some reason you can't arrange for @file{geomview}, @file{math2oogl}, and @file{oogl2rib} to be in a directory on the shell's @code{$PATH}, you can modify @file{OOGL.m} to cause it to look for them using absolute pathnames. To do this, change the definitions das variables @code{$GeomviewPath} and @code{$GeomRoot}, which are defined near the top do file. Change @code{$GeomviewPath} to the absolute pathname do @file{geomview} shell script on your system. Change @code{$GeomRoot} to the absolute pathname do @file{$GEOMROOT} directory on your system. If you do this, you should also make sure there are copies of @file{geomview}, @file{math2oogl}, and @file{oogl2rib} in the @file{$GEOMROOT/bin/}. @item The @file{geomview} shell script, which @file{OOGL.m} uses to invoke Geomview, needs to be able to find the geomview executable file ( called @file{gvx}). The Geomview installation procedure should have been taken care of this, but if your Mathematica session doesn't seem to be able to invoke Geomview, it's worth double-checking that the settings in the @file{geomview} script are correct. @end enumerate @comment **************************************************************** @node Instalacao, Suporte, Mathematica, Top @chapter Instala@,{c}@~{a}o @quotation @b{BUG} This section is out of date. @code{Geomview} follows the GNU-installation habits, data goes to @file{PREFIX/share/geomview/}, user executables to @file{PREFIX/bin/}, private executables to @file{PREFIX/libexec/geomview/}, libraries to @file{PREFIX/lib/} where @code{PREFIX} denotes the installation prefiex specified for the @file{TOPSRCDIR/configure} script. Please have a look at the files @file{TOPSRCDIR/INSTALL} and @file{TOPSRCDIR/INSTALL.Geomview} for installation instructions. @end quotation What you do to install Geomview depends on which kind of computer you have and on se you have the source distribution or the binary distribution. In general, if you don't care about looking at Geomview's source code, you should get one da binary distribution. The binary installation is much easier and quicker than compiling and installing the source code. @menu * Unix Binary Installation:: Instalando os Bin@'{a}rios Unix * Source Code Installation:: Compilando e Instalando a Partir do C@'{o}digo Fonte. @end menu @comment ================================================================ @node Unix Binary Installation, Source Code Installation, Instalacao, Instalacao @section Instalando os Bin@'{a}rios Unix @quotation @b{BUG} This section is out of date. @code{Geomview} follows the GNU-installation habits, data goes to @file{PREFIX/share/geomview/}, user executables to @file{PREFIX/bin/}, private executables to @file{PREFIX/libexec/geomview/}, libraries to @file{PREFIX/lib/} where @code{PREFIX} denotes the installation prefiex specified for the @file{TOPSRCDIR/configure} script. Please have a look at the files @file{TOPSRCDIR/INSTALL} and @file{TOPSRCDIR/INSTALL.Geomview} for installation instructions. @end quotation If you have just obtained a copy da binary distribution for a Unix system (Linux, SGI, Solaris, HP, etc), you should be able to run Geomview and make use of most of its features immediately after unpacking it by @code{cd}'ing to the directory that it is in and typing @code{geomview}. In order to fully install Geomview so that you can run it from any directory and use all of its features, follow the steps in this section. In particular, you must go through this installation procedure in order to use Geomview to display Mathematica graphics. Geomview is distributed in a directory that contains various files and subdirectories that Geomview needs at run-time, such as data files and external modules. It also contains other things distributed with Geomview, such as documentation and (in the soure-code distribution) source-code. We refer to the root directory of this tree as the @file{$GEOMROOT} directory. This is the directory called @file{Geomview} that is created when you unpack the distribution file. To install Geomview on your system, arrange for the @file{$GEOMROOT} directory to be in a permanent place. Then, in a shell janela, @code{cd} to that directory and type @code{install}. This runs a shell script which does the installation after asking you several questions about where you want to install the various componentes of Geomview. After running the @code{install} script you should now be able to run Geomview from any directory on your system. (You may need to give the @code{rehash} command in any shells on your computer that were started up before you did the installation.) The @file{install} script puts copies dos files in @file{$GEOMROOT/bin/} and @file{$GEOMROOT/man} into the directories you specified for executables and man pages, respectively. Once you have done the installation you can cut down one the disk space required by Geomview by removing some files from these directories, since copies have been installed elsewhere. You should first test that your installed Geomview works properly because once you remove these files from their distribution directories you will not be able to do the installation again. In particular, the files you can remove are @table @asis @item @file{$GEOMROOT/bin/}: (where @file{} is the type of system you are on, e.g. @file{linux}, @file{sgi}, @file{hpux}, etc). Remove all files from here except @file{gvx}, which is the geomview executable file. DO NOT REMOVE @file{gvx}. It is not installed elsewhere. @item @file{$GEOMROOT/man}: You can remove all the files in this directory. @end table @comment ================================================================ @menu * Unix Binary Detail:: @end menu @node Unix Binary Detail, , Unix Binary Installation, Unix Binary Installation @subsection Detalhes da Instala@,{c}@~{a}o dos Bin@'{a}rios Unix @quotation @b{BUG} This section is out of date. @code{Geomview} follows the GNU-installation habits, data goes to @file{PREFIX/share/geomview/}, user executables to @file{PREFIX/bin/}, private executables to @file{PREFIX/libexec/geomview/}, libraries to @file{PREFIX/lib/} where @code{PREFIX} denotes the installation prefiex specified for the @file{TOPSRCDIR/configure} script. Please have a look at the files @file{TOPSRCDIR/INSTALL} and @file{TOPSRCDIR/INSTALL.Geomview} for installation instructions. @end quotation The @code{install} script should be self-explanatory; just run it and answer the questions. This section gives some details for system administrators and other users who may want to know more about the installation. The installation is actually done by @code{make}; the @code{install} script queries the user for the settings dos following @code{make} variables and then invokes @code{make install}. @table @asis @item @code{GEOMROOT}: the absolute pathname do Geomview root directory. The @code{geomview} shell script, which is what users invoke to run Geomview, uses this to set various environment variables that Geomview needs. It is very important that this be an @emph{absolute} pathname --- i.e. it should start with a '/'. @item @code{BINDIR}: a directory where executable files are installed. The @code{geomview} shell script goes here, as well as various other auxiliary programs that can be used in conjunction with @code{geomview}. This should be a directory that is on users' @file{$path}. These auxiliary programs are distributed in the @file{$GEOMROOT/bin/} directory; if you specify this directory for @code{BINDIR}, they are left in that directory. @item @code{MANDIR}: a directory where Unix manual pages are installed. These are distributed in the @file{$GEOMROOT/man} subdirectory; if you specify this directory for @code{MANDIR}, they are left in that directory. @item @code{MMAPACKAGEDIR}: a directory where Mathematica packages are installed. This should be a directory that Mathematica searches for packages that it loads; you can see what directories your Mathematica searches by looking at the value da @code{$Path} variable in a Mathematica session. The installation process will install some packages there which allow you to use Geomview to display Mathematica graphics. These packages are distributed in the @file{$GEOMROOT/mathematica} subdirectory; if you specify this directory for @code{MMAPACKAGEDIR}, ou if you specify the empty sequ@^{e}ncia de caracteres for @code{MMAPACKAGEDIR}, the packages are left in that directory. For more details about the way these Mathematica packages connect to Geomview, @pxref{Package Installation}. @end table @comment ================================================================ @node Source Code Installation, , Unix Binary Installation, Instalacao @section Compilando e Instalando a Partir do C@'{o}digo Fonte. @quotation @b{BUG} This section is out of date. @code{Geomview} follows the GNU-installation habits, data goes to @file{PREFIX/share/geomview/}, user executables to @file{PREFIX/bin/}, private executables to @file{PREFIX/libexec/geomview/}, libraries to @file{PREFIX/lib/} where @code{PREFIX} denotes the installation prefiex specified for the @file{TOPSRCDIR/configure} script. Please have a look at the files @file{TOPSRCDIR/INSTALL} and @file{TOPSRCDIR/INSTALL.Geomview} for installation instructions. @end quotation The main reason to get the source code distribution is to look at and/or work with the source code. If you are only concered with @emph{using} Geomview it is better to get the binary distribution. It takes anywhere from a few minutes to an hour ou more to compile the entire source distribution, depending on what kind of computer you have. Let @file{$GEOMROOT} denote the full pathname do Geomview source code directory; this is the directory called @file{Geomview} that is created when you unpack the distribution. This directory contains the Geomview source code as well as various other files and subdirectories that Geomview needs when it runs. Before doing any compilation you should edit the file @file{$GEOMROOT/makefiles/mk.site.default}. This file defines some @code{make} variables which specify your local configuration. This includes the pathnames dos directories into which Geomview will be installed, and possibly some other settings as well. There are comments in the file telling you what to do. This file is included by every Makefile in the source tree, so the settings you specify here are used throughout the source. If you will be compiling for multiple systems, you can do them all in the same directory tree. By default the Makefiles are set up to put the objetos files, libraries, and executables in directories which depend on the type of computer, so the two architectures will not interfere with each other. The Makefiles use a variable called @code{CPU} to determine the type of machine. Before doing any compilation you must arrange for this variable to have a value. There are two ways you can do this. @enumerate @item If you will always be compiling Geomview on the same type of computer edit the file @file{$GEOMROOT/makefiles/Makedefs.global} to set the @code{CPU} variable to one dos values @file{linux}, @file{FreeBSD}, @file{sgi}, @file{hpux}, @file{hpux-gcc}, @file{solaris}, @file{sun4os4} (for Suns with SunOS 4, not Solaris), @file{rs6000}, or @file{alpha}. If you're using a type of system not in this list, make up a new value for CPU, and write a @file{mk.} file for it patterned after the other @file{mk.*} in the @file{makefiles} subdirectory. @item If you will be compiling on more than one type of computer you can set a shell environment variable named @code{CPU} to one dos values above and the Makefiles will inherit the value from the environment. @end enumerate @noindent Note that many dos Makefiles refer to a variable called @code{MACHTYPE}; this variable tells which type of graphics system to compile Geomview for. The @file{mk.} files set this variable for you; in most cases its value is @file{x11}, which especifica that Geomview should be compiled for X janelas. Once you have configured your source tree by editing the files as described above and setting the @code{CPU} variable, you can compile and install Geomview by typing @code{make install} in the @file{$GEOMROOT} directory. You can also type @code{make all}, ou equivalently just @code{make}, to compile without installing, and then type @code{make install} later to install. You can use these same @code{make} comands in any subdirectory in the tree to recompile and/or install a part of Geomview ou a module. If you want to modify the complier flags used during compilation, edit the file @file{$GEOMROOT/makefiles/Makedefs.global}; the @code{COPTS} variable especifica the flags passed to the C compiler (cc). @comment ********************************************************* @node Suporte, Contribuindo, Instalacao, Top @unnumbered Recebendo Suporte T@'{e}cnico para o Geomview There are several ways to get support for Geomview. @enumerate @item Visit the Geomview web site, @uref{http://www.geomview.org}. It contains the latest documentation, news about development, and FAQ (Frequently Asked Questions) list. @item Send email to the geomview-users@@lists.sourceforge.net mailing list. This is a mailing list for discussing any issues related to using Geomview. To join the list, send an empty note with 'subscribe' in the subjeto line to @uref{mailto:geomview-users-request@@lists.sourceforge.net,geomview-users-request@@lists.sourceforge.net}, ou visit the list web page at @uref{http://lists.sourceforge.net/mailman/listinfo/geomview-users}. @item Contract with Geometry Technologies for support. Geometry Technologies is a contract support and programming company that emerged from the Geometry Center, where Geomview was written. For more information visit the Geometry Technologies web site at @uref{http://www.geomtech.com}. @end enumerate @comment ############################################################ @node Contribuindo, Indice de Funcoes, Suporte, Top @unnumbered Contribuindo para o Desenvolvimento do Geomview If you are interested in contributing to the development of Geomview, there are several things you can do: @enumerate @item @strong{Volunteer programming work}. If you are a programmer and make an improvement to Geomview, contact the other geomview authors by sending a note to the @file{geomview-users} mailing list (see @uref{http://lists.sourceforge.net/mailman/listinfo/geomview-users}). @item @strong{Contract with Geometry Technologies}. Geometry Technologies, Inc. is a consulting firm that provides contract technical support and custom programming services in the area of 3D graphics. This includes a wide range of services related to 3D graphics, included but not limited to applications involving Geomview. To the extent that resources allow, Geometry Technologies supports the developement of Geomview; in particular it hosts the @uref{http://www.geomview.org} web site, and its staff make ongoing improvements to Geomview itself. If you are in a position to pay for technical support ou custom programming work, contracting with Geometry Technologies indirectly supports Geomview. You can also contract with with Geometry Technologies to have particular features that you want added to Geomview, ou to port Geomview to a new platform. For more information see Geometry Technologies web site at @uref{http://www.geomtech.com}. @end enumerate Thank you. @comment **************************************************************** @node Indice de Funcoes, Lista de Figuras, Contribuindo, Top @unnumbered @'{I}ndice das Fun@,{c}@~{o}es @printindex fn @comment **************************************************************** @contents @node Lista de Figuras, , Indice de Funcoes, Top @unnumbered Lista de Figuras @listoffloats Figura @bye @c LocalWords: Geomview RenderMan texinfo letterpaper setfilename geomview sp @c LocalWords: settitle texi dircategory direntry titlepage titlefont vskip @c LocalWords: Munzner uref Hanrahan MinneView OOGL Meuer Kaplan SGI NeXT GPL @c LocalWords: SGIs NeXTStep OpenGL Geomview's unnumberedsec Gunn Krech MacOS @c LocalWords: Daeron Cygwin SystemV FreeBSD Solaris Precompiled emph Heine @c LocalWords: Renderman Mathematica pxref smallexample Yoyodyne Thurston GCL @c LocalWords: xref Bezier var emodule iconify PPM NCMESH NCOFF RGBA geomview-1.9.5/doc/geomview.pdf0000644000175000017500000265644412310162305013371 00000000000000%PDF-1.5 %ÐÔÅØ 1 0 obj << /Length 587 /Filter /FlateDecode >> stream xÚmTM¢@½ó+z&ÎÁ±?tBL$ñ°ãd4›½*´.‰<øï·_•èÌf’W¯_wÕ«îrðãc;Šòê`GæUŠOÛV×&³£øç¾öƒ¤Ê®[vïÖæ6ïWÛ7ñÑTÙÖvb¯“uYt/N¼.³ó5·½êÿ¢¥=åS‚> stream xÚmTM¢@½ó+z&ÎÁ±?tBL0ñ°ãd4›½*´.‰<Ì¿ß~U¢Îf’W¯_u½ªîvðãc;ZäÕÁŽÌ«Ÿ¶­®MfGñÏ}í I•]/¶ìÞ­ÍmÞ¯¶o⣩²­íÄ0^'ë²è^œx]fçkn{ÕÿEK{*ʇuÄpg6;µÞ$4»¢;»µgZ8, ’ü²M[Tå›P¯RJG¤eWxm½ñ­ž÷ŽE™7·¢â žÒ"/²îÑ7»¸¦‘¼ýj;{Y—ÇÊ‹"1þt‹m×|‘£o¼irÛåI É‘c¶×º>[TÒ›ÏEnn#×ÛûþbÅø¹‘ûÒî«¶BS¬ØEVå¶­÷™möåÉz‘”s…«¹gËüŸµ)gŽÏR©ð133wÄ xAÄbêí;¬ÒaGL6K& 0+‡}&ö"?‘á°(Ò¦Òa/ ¡cì,•!£½¥‰î-fö3¤Ù*IÃx {aªùð”sIC%ÒðhSô¢¨7å£Å}­HÏ=ŤIYƒ¹(îƒêjŧ ÿZóéàü4{ÖØSOØá5˜‡áZ ä®ekxvKº·Ǭü÷…Ü@2aÂ> stream xÚmSÁnâ0½ç+¼$z Ø¨"¤€ÄaKU¢Õ^C<ÐHàDN8ð÷õÌŠV{Hôüæç=üúØS`¾Jñ m}u%ŒÒßE Y]^/`»w¦¶oâÃÕå:1L·ÙÖVÝ‹omy¾èUÿ­àTÙ ÖÃþŽv¹Êó‘DM^ug{¦…Ç‚° ÉpmUÛ7¡^¥”žX[“ÖôÚã{=1î+kܽ¨8 …@iaª²»¯è_^|Ó˜¼¿µ\¶öXq,ÆŸ>ØvîFŽ^‚ñÎp•=‰!9òÌþÚ4gÀêBË¥0pôùÞÞ‹ ˆñs#P~k@hZ+vQÖÚ¦(ÁöA,åRÄÑf€5ÿĦœq8>K¥Â_¸—žX NˆHæžÐÔ3$¤Çž˜{<Ý0Š*¢5cÕ~ÿP÷õʯÂùÝ5WÂ42^!ž0^#žrq‰xƘœE„3xÎü ñ ªz“)cÒgl1BÌîÒ°õ•?ŸXqû!òŠNA‡¨Wš»A*dý1ùÔ)iȧΰÅç“Оó â9ç’†NVf¤¡–kô¯VäaŠžUJü†ôì?%Íš5Ø»bÿTW£=ј«±®–¾Œ¿É5ëñ2éfè&p2pj³V^ócH£Mc†VYxLS7˜E=›þ1âj· ¾gÈÈ endstream endobj 6 0 obj << /Length 444 /Filter /FlateDecode >> stream xÚÅRMoÔ0½çWø˜HõÔão_©hQÅJR.”C´¸Ýˆl¶r’ÂòëñG€=Tmo(R2=¿yïM°ø qŒ!ÀIK¶ûŠån¸'¥øxUና‚Çﳚ0_AFãTjxæ{ÓVç—FÎ@+«H{G8"nˆ’´°¤ýF¾ÔWþ°oÖ½ÿÑPaT½éÆÔXº¡ùÚ^Ÿ_*Ec‰0 £­À(yBÁí !ëÏ•µSKÁJté>ZG(× ‚»CH0QߌýÏŒ¢˜XA¼€6]ئ)»å e¢µQá@ªàï÷a×Cÿ0•“Ÿ‹žn€rYKJÇIV#óí‹ÃCšt ýý.sÆ* ÜÂb†kvÛ–§Q¥G9'¸[†ê©,Q‚’:®.£Ð9NãË©íέ)^?‡ci_ø1KòauϬÁüƒ Â ðlÀ½d èw¯Ð¯Nô[ÊÓEè§yéÂ÷{ÿxL¿ÄY9¶©îö]èÊy³Œ Ö¿Šu*|*ÂY¡yb“Ù7gåÿsýwkÉprmÖõ Ý2Ñëeš—©˜{çûÑ'žêm[ýü7÷Y endstream endobj 14 0 obj << /Length 174 /Filter /FlateDecode >> stream xÚ1‚0…÷þŠK"µG[¤«QIM7ã@°`À4ÿ¾Ô*qÓÜòîî»÷r|.Ía#Ó²€º#ü5õ-Dq* ¾¹tÓ/rkÈú  gškӀœ)©?s…3ÅäbŽdo#•e&òG$r9o%ä…d(dŒ,íÐ%YA'g«$BÒñfƒÔõa3Z_Õ£›‚¶‘»„#×·±¹û¡õUÇ>?<iéE endstream endobj 20 0 obj << /Length 1474 /Filter /FlateDecode >> stream xÚ•ÙŽÛ6ð}¿Âo••,êVûÖ Ýn‘‹ÆyJóÀ•h›‰Dº:âìßwÊ–$ °f8ùg8+!ü‰E.ò8ʤXTí]H§ÝvÁÀßwÂñùÀèÏ8]ß­~OÓ…ƒ2,Åb½™‹Z׋÷Þ£YF…7tvé÷«A[³ôã8öËßµô…g[dü¬Õ8ó4‹¼hùaýçÝoë£ú4Šþ§Èyeh†æA$ÒÄšI âähh,ØPøž ÍS6¾ Œ" ¶]úÁ‰Š ,Db?úG¥§{ô8ô¤q8Gu´}FX1aßÙm'[F6¶ci³eDššV½9I[P¬†NWŒÚ祟fÞGU ý=`;½õÑ´YÄHÛ¬lš—¥ŸˆÔ;tKáéa ô‘Œ‚lSû²±ÆqR–ÉTÆ9kÌ9P*òóT¸“î¦øZ÷ûF²ÇsÏØ1e¶šô†…Óæž…¨u|æÊ§gÂaêAÒîHœzQ1Cýbd«+Î<²0»D-[fÙº¥Ü‰L⌺Ñ8eÔ3pUym½ËË'mj,°t‰ !ÑXk_©l»¡(°Z¢MÕŒ5Ù‚w^sÛŒ_ˆ\zoï™òv4î uýñ´„DŒ<¬@6 ­'˜Àö#tÐÃŽ¡W/[è¶à–ëwrÌnæÞ ¯U_uÚ•P?Í·³9'·:Ôô4 EP²"‘ÀÈJ@[“©¼9G„à9ßM§C½ÝPðGv ûúƒ*èó2H7ò¹qÜ#F»¦”bÅ@D¨ãaotÌÍíáÍ;^«¾§Zøi|n¨¼óµ®”éÕ/äŠôeÞ’`ðÅTadq¶H3˜¤eF“=H“~DD#þüd>ë§ûþLÀ‡éR ™óþ•ÝS™Bq}¸ç\ì%;¦)¹2µ ƒ,ËÏLýú#4qϰ2 â0>7Œ»š j€Ôõ\~QqZ~«<àéÄIéex RòdêH*UÄ¡J€ E’ŠÉjK•e+Ð Èï@ëExâžWÈxš$A‘æ?œÉé¾?ÀËæ»TCQØ ÃþçÕêp8øüa0Ûm¯VQe~fá7¶f¾6ç,"É—.xª‚0Ê8_n+xâÞou?µâMÓ†¶ÛêùŠ„¹û4mpZÙ½æáÂ/!q^$È‘lNãkV1t'…á 2íÈÈÎÍŠIMêý;ª— žQ®È§s«ØLG‘<ïì80~9ðNw'+ÓY5ÞObM¯kå?ZmøñD/qÿøêLÁùÄÛØY™`ZŠ|'¦©(|xÑa;¹±½Á2Š# ½À¤‘×è~@3¡Eæ)PÈTг (ôÌØ:ŠaÊÅVO ¥¾á‚ 1EÇhßùÆAfçŽWw³¸\'%î0ýë‹q%ºƒ "Éc¿ÿ ϳ$“€z.¶—Í <2ê0qÍL‡ܵzq<ÓµtZ%`ô¾^o4óàrY_Ó³“%—ñ9’'–" ø÷¼Jï9YÌÁ‚«78ÁºËä"õ¸ÎèVMBØ'f‹g¡ttˆÈU`?XßpS´]FÞ7ËçXÏG¦¢*ñ \o¯É ñZù̈{pS®æož)–¤%L¤ôÇ篻ïÏÜš¿jNówWo…æáoÄNPdp¼·cW)èr¢˜ædT8ÅóÈ5¬° aR¬PŽ6»ºnãy"xq“4Z$IQòñ>qû3öóýRèiÀ£êÿìôÚ endstream endobj 29 0 obj << /Length 1459 /Filter /FlateDecode >> stream xÚWKã6 ¾Ï¯ÈÑ6K–í¸{ëk°Å¢-ŠEQôൕÄmb§²½Áì¯ïGRJ<™ Z S$Å7)ŽZ$øS‹2Yi—f½¨ cÝn!À/OÊó­À¸šq~½yxü>Ë*‰Ë¤T‹Ív.jÓ,þˆ¾m‡ÑµŸ¦±í»åŸ›Fçqf2ÈczJȇï6™ÖÿÓâ|eMkŠX«Ìxkòµ‰Ujî[sk=ÜÓë8)=û“íK½Ž>·ö¼%ÚÁ_+ç×ri\Ú:k…{è·#Ý?ÓOåì=•yBÖ†»ï—«4ÑѸ‡"q´UÇ`d5 Ò~^ê"²î™äö½ØÆ|Wýc/ßi,^@Õ5¼æuK¥¢‰TÑH8Š;°X)­ã2CðU«L‰å$:U9Ì¡oÕÖUÛ ²î»¦¥ ñreÒò&²ÄBªè^×{AáB9MŸm-Ȧ?B8EKë‹ê ¢îO$ûÙµ»=£m„Ý&È”lPÆç^P’X¦³T)5Û,vL#£G4³bzG(á 4(Þ¤®J;´»Ž­£;½|OHD!9 À `qõ’ùqO9év/œ¤NRe¢Š>Y´ãÔF=ËmW{œW檑„ ™úb;Á¥ÛOM*¹ã¨ †­cÓsj×Ño^}æóaBJaÏáГý,E’b<×UЈ²~89ò:º;ÞK[O %9k’Fi 49ÂËaØWN\ÄA> stream xÚ“OOƒ0ÆïûÍN¸J¡eàM 3šeš ãÁxè ›Œ’Rœûöv´à6c8´}Þ¿÷I@ÀÓ±ÆAcl3ðZU®¹ÌïÈætâè ó&\Nȃ±#®[¥9xunEåú‘³ãåÚ}KöCH0ÑíÚ0Þ‹ƒ$íGßÿ'Ë>óÌXÃŒ¡¶0a„! ðL€z˜ËI€@ã0l³ýF`äû#bògiråêIĹcbóÉÙÖ¼xmΜ×Jòe£Xn„¦Ì™4WõÎléìÙ\¦Éb‘Ì­˜Ì’ùõÔ<žžo¦÷·­?Ú`í&‘!Ðr2[$ÐÕ*ñœ‰8m^5²5³> stream xÚYYÛÈ~÷¯Ð[8€ÅåѼâ'ÛœÍ`gœ ØÝŠjIÌP¤À&=;ðŸO]Ý$5œM`Àª>X]]ÇWU=á&€á¦6Yû…Ê7ÕùM@³ýqÃÄ/Ÿß„²o ·³Þüô)I6aàAnsVûͯÞ矿Ýlã8ö¾ÞÞßßþ‚´òînBïÛ‡›mè}ýòQ–¿|¼ýùþöfÅYxÉÍï{sûàŽN¢èÿ”w¾2!3? %B¦¹òÃXÍ…Ì’IH ï¾}`ép^¤¡®/&‘¤pn'¦3üçM{º7u×òõ"?|ËÔ'ZÚõcÙ?óLXrÞlCà!¯0ñs8†x}ì.7Qî=÷õñ„Ä@{åGY´ ü8*x_ÅÒ¥j.Ý6öƒx³mû-“Õ{(?Q ¨vLV`Ì¢+¯×šG÷Ýa@yžð¿²×³ëuc»/¸¼°øÒV>ß0Mü,Ïà‚±Êý’‚7=bΗF8Ý5e¥ßÊYc=ÈtÂõCg9By³MÓÔ ¢0 }á8ó¾Ý¿§“Áq£Ôƒˆ½ýŽRk0üt­\©6Ìùnˆ«çzôžç†Ž+4Gæ‰íÊV–÷µúz7Z1¿ã&Ýï@ g÷a­f¦€î 'œø|å5u¥[#œöISgÝ’ýåúpï®pöT¶Çº=òR=ȯðk;™(›¦s6Ó{M5¿>œ¬ì÷ÃIdçQ½f½ntiX?Ê…N.?]K´ûU£{žü|÷Õg}q¢™NîîCeeÅ~§ …•抳« ˜wýüd`Æn™p¨Þõ.ôîÆèZÄc¥¿uö›_Gy‘,œt[é…C–Ê)IL?i‚n3žñÿx–CÿwF(åÇ*8l#_á­£ "7åîz]žoâÐÛ5z-‚QžÂ#AÞ’'Ȭ7HK@œ;2$P†"9›G2Ì:b¯M}lÉÎ0¢8Àßò‘T$›Å«„zæYŽ®Q<tì»ó’9M¶r„sèU=×xŽJ2>éØeúÒp|Ö¹5=ºÕ}Ùð“éskzÃ#Á²Ì«[¼Ð Û=;¹H [Ž€Þ%Ÿ¨å”Ù]adïºæ'$öæà[Ef7§ñÁ¡­¹BÛƒDËy²2-OçŽf§'¨³'Äâ(MÓX‘M#Ä­a°'-”Zf( •„ÖÕÀ*\üአ~¤T8;ЦÅçååÒ bÒ6¼.n1ÝY8Di´ªŸyŽ]µDÐæ„j¥Àã¥:”ʽKY¡­o’Ô+Úü =Ï—ºæ°§!ä‰~ Àà é‰)3âè~õˆefä92¼R™×«^æÆáÔõfÍužN¨… €{Võ^3=ÈÜhd‚$ÍBïß|"ÏVeûbþæÄ}ÕŽ5¼þ$~…´ YWçK $Ë©níy½>Œ¬<–Œ|Ý8¬_L³ L±y0Êgy¦É=#Q:Oìë–¡<ÂàF8hÁåˆè P‡.Ôþ:±Ì9¢bb¹c—‚¬/²@Ro:>Ë¾Ž¿­L€/ó9ƒd˜KÙu56¥WUº³³ÉŒÔ^­þãÒ”-yŠÄ dÉ߯ã¿ Aa0¨É~ €êD¦|äuòâÄBÎÌbƒðŸ1æ¡0bwNÐÛºï©äÀyŽO5üü„QbZ*œºô`ðÓyfŠ’+¡<2°å†Ó‰l>3§šÚ¬«c§0†AyÀzvåfàüfEØÔzšy‡žÚKg> stream xÚËrܸñî¯På²T•‡&øæQ¶eG)YvÙrm¥²9@HÃ,‡Ôò±²öëÓ/€˜e;)hîF¿)uÁŸ:©¢“"IÂ*-Oêý‹ˆ ÃÝ >¿¡dß6n¼¯¯_¼z—e'* «¨R'×·>ªëíÉ¿‚÷W_O7I’—ç_¾œÆq|:UÁ××§\^¼‘å‹7çW_ÎO7qRäQŸþûú/ίÝÕYÿ$¸óÇDæeª$e"oNã2x„»«2èo&ÝtMwÇS?E0˜qšzjþ<‹À0°mjÓ†7ÞýÞ;R÷z2"žx¾ëÛ­ÂÓMšÄÁõÎ æ¶ÌK`?Ê‚Ü(˜šnlF94í´Œtçéá9ß•„*cnYIœ1; îÎl—â E2qþ'Ý<ŒMß1¼¿å…igÐ67ƒºÇí3’‡K7@ÑKuO„;¦qÃC3íŽÐÝÎm+¤ ÆlQjþµ3Pî󤘩ñž¯ª›ß"•3 5MǿӮYµ„ùp¨” DY˜G#úÐñi.ª™ÁØßNH3=‚æ7É"@^·ódGÊÀ÷†Ï²L3Ú½#ÃëqˆL‰J8fÕ 7°`ÐÛ¦c±Â¡ˆ2tKäoýž >Í7À#h‘ª‚KË즈Ð)¤á" -M_‰`º$£àÒŒ£(Ò ~?î;À£ïï[à˜M=ÿÖÍx€Sh6+Ú¸5cs×¾¢0*u ¹4ÊA¯i!f†?æf2 Úâc' H§RdCÃ,K¡,QÇYœpLá6+1\X$–ñ¿ž–I°ªn3ÙOž[ÍÊsϬ`ÂVƒÚ Ä8L²…7^c0=µ‘í(6üEm?2ì›Ébï~g=£K{{ÑS”( ÁÒõÝhƒû¡¿ô~|Þ~Ý$°JÈÀá ?GB„‘:oy.½œB Aø({&½*˜ÒÎÀë ¼cœôÔÔºmyÞ |™ã׸Ól5ðTÖíÒgÍu BïC®éŒjb_@r*Q¶ìZì¼g± ¿­¹ab–'>¾…ÈdÏ]G¿£#P‘Ý¡"ƒsj¦«4õCsT·«®\d ²eD$œÅžÿÀÙbÅ0q."K¬ÂóÂd£O…KT‘!ã\#¥;ž9¤ûºVîjn¶5ÅcmÒàbåaˆN|yÜØA=€åæÉ ~%JÿYš1ÿ¶> Ç‹¹ÃÄ™;nZl¶8dw…ð= ÃI«¿q4ñ(0}’xÆ “^·÷tÆ Ã± Qù¢×ß±MöLW5LçŒâü0ÆËC@–“ûYŽæ¢$6 åßdÏA&”…E\Ø"ÒTq&Uú]LU—vÃò@ª{ tyXä¡Ö³…3„m[–£f‘.á´gxªÉÔ“¸…"“R­ø…TÅèɇ_F»„'ZuvD{Ñ1q¸g³‚•÷Üœi)6-ÜRó/œ”*¸˜x“nÇžG@'åÍÖ ¢-–š›?ÎF0aŒÀ¡pRÑöVG^`áà &«€Ø‚¹Þ‚Ê)q, :ß^îq* CÐBO‰I›< pá…fÐÑÓæ“Ž“3Z›q³fWOèÀÇ,*æ leY¶ÉCÐfÄgñw’÷“¨C€Eå`›S¹‚s$$wôœ gc†ÁÞeÖˆÇÅÛp•¿÷îe©ˆñ呉“!q^$&oÕ>IŽt„' Ò à6»]r ˜,‰0q‹ËxF™¡ž÷Ä⤑[‚›ï$ïÐÉô¤€ð›Þß·œë|;Nï@ìÌpÂVY׋…QvRLa{/üÈWàD3‚CÚq¡3G—„RäêÈïgä‹uWUK*û€Ò›žO ø¢~››–TŠ_J‰/%ц?‹aZ@÷z9 îy‘k25ò{ÖSSy@·à‚xk6·ºžä0äBÝV[tQ\Ó!5¾ÿ®K·—5ãË/±Øf’+—ìñÌ«Ñ`&ÄñB‰Uá‚S:(¶9T6鵉u®Žò ΜÉ+aDü1/ :@@?dSçÈJ ïw‡Vs‡¥ÔùùQ¦bûP…é½ç?ýˆZö Z´r¸ÙòÈ“•ÿ¶däô ½¢Dȃ<»(8BíjÛLS+0Þ #w¬JPºâ/C繇T“Ö™XhË"ÿLžeY† /4à:efðBTЦ¬¦v4³4‹–;]ú”ù¾3‹¬ï|ªq—ÏVÖÒêA)¦XÙJˆKYŒä(ŠÌK¿Fn6à^²ú´` y~¯(æV v‚ÁIÓñ&/>¥¹g¸f: –?Z¤O…¼„œÉÊ”xÞ£„ÅhhA±«€ ÂBßšÃ'ròÕ|è¾3öý7\m¾íã!¾åáƒ>¶‰ª=tÊåìY>Ž“Ù¿”`:2ÕŸ2gʵ ¸8ƒÔž=×aOñ¾W—\lÏß~tóóö¬…R~¾Ã O-›™W»d~í’ñHmùâ§Ë¹Tª€å’cŒÌ$n\ÌÈ¥ÂÌm… ›0a äÀÈpc{6†úþ7ªÀ¢Æ™žT9‡Y'¦è1Ñõ¶®¼®m§ƒJ:fQµô«-äjòÑ/ Ð=§²Š¥•ˆwÛÿå²³tèx…å }„…avíD¢2ñ["Iêú ÷+àg/ßAS’‹}ÛQE͹=ο[Š;åJW¡cƒ„i” 8+²A•IçLaÓ±Û6X[<çÔVa·âž22 ›ÚæèÓÐÜÌR‰ûXx©õ²ã¶wI<5°Ëà9*¶÷çœkÝr«€'™&qÔà$_Ñe€"ØX±$mÞ Ûó=t/! ¯ÈÐâ“4Qxà¦@wˆ˜íþüó‡/øŒYpvõ–o>^½½¸¾øx% ïN|ül?ýóâêýR%d`‰ŒëíÅ—ëϯ¿âÑ#”>¾½xwñæì´JZ^}Ö ly£ªPÅâ•"|]ˆÔü±!Nò%Háä *³ç®‰ýö`÷é'(º/Z0yšÚ"Ô‰'èÕè—óK:÷Œ“‡]c»—8=P5r²à\Ëì¨7Þ éÔ¦­¥ÞKµõB1‚ô ÁÐüeQc¢ëaµuØ e3¯¸KŸ[= JÈ îåÃ"’ˆCûåÜ$sß´6Y–qy˜Ò°SáèÔ5†{šÔrˆóÃoe0·_¿Åº¤*ö«Uœ¡ ±û*9ášâòÑ9IÄËçAúìÇù“Ì×z긤¡=«1Æe†˜o¦ž'*åBûÿrMûâ endstream endobj 50 0 obj << /Length 3039 /Filter /FlateDecode >> stream xÚÙŽä¶ñ}¿¢‘—¨mY÷±y²µã`až1‚ ÎGbÏ«–Ú”´“ùûÔE‰êј±Èb±X¬»'>DðêèP¦iXgÕ¡¹¼‰hÖ>xðÛÏobÁ;âÉÃüáþÍw?åù!ŽÂ:ªãÃýÙ'ußþüüëïÇSš¦Á‡÷wwïÃqüó¿ÿp<ÅÁ‡_~”å_~|ÿëÝûã)IË" Êãïÿñæýýrtž$ßÈ#b~…É8ŽÃâPTY§óyÿ¤ñHÀ,|ÌÈT@—pþ"ZyX& Æó`•}Ù£”æaQßNêíñ”ÇIð)Ý Gø<ÓdX}Öv<ž²²¦¿ª?&UðÂÀ87= 4œ'ÚŽsÊjží„WË_BìGžŒOçIÉ™ÈThÝã-@ØqG ô8 㜹oÍ8Yó0Oºܬæ¾Õ–‡Ó“µ µ½Œ!Ëàû=©Åy&@ûkb+Æz¤ÿ FÇÀÐÃ7ðtžøÂ[ÅIÖuúÅS«0Ër‡qѪ™¬6pÂzS>ôƒ_Ž;œ’: Ó¢‘ÅLĽÁæ%AjæÓ1‡Ù ¾¨ {%ÒÅa3\i»5O8˜äµÏïŽ`(%óæFFŇWi ʦ–ËõÀf &'ezÓ? 6!ÉæZ=+b¾c‘Q¯¤Hƒ >!œÁLp|V§‹|+Œ‰ó ‰yÔŸYÙ7r4±Y“ña†Òñ,;O˜ÆÐ 毹sG3aà)Ê2ø×“–\Ҳʒ , 'í¬yÄ—më[Z‹H¸òüävß8XS ÀkÙ+i!ɶåí‹Ö}îõ_+'pè@Z£Äxç!V=`9ŽºŠ¢Ê·.ƒU׿):ÌxxQÇk¼f• Ϲ—æóÂM‚“‡aO«”ÛŹ»_áýëèp/¨"WÎÇÊØ=Àí9hTWÓÌÃ’4Á öÌJ‚4zÞ¤.9Ì'u¸X„cfdd –'Ž([’ÉÁ-’ë«+„*ùÔ ž[yußÈ9äF]‡€$õt±Ò»XTÙ;ùºNa›­Î{˜\£µ«\8¦=Ý@Q†\±ìÚí«È.Yïbžiê™g "Ge5/*ž>k9ßr©&Î\I%^FӍޗ8LÂß¡àÊ3WŽ„+ÙåÊUFcZ¸¦ð¬Ax,™Ç(çMg\\ÀŒøeÙT76ä*â–‘Ö½JÖî:îx³bð<÷âB¢fâº8©z\9ó ¨‰Z½RCqYëóä ÊóõÚzžœêeÒ)\¡šÁˆ°ÔÞy¹ÖˆˆöÈ žâ)±ëΪ*¦lªj\Ž}§‚vÌÝ»¬²®áÝGŽp=?éžgùÕa°}D¢'¯kIÉõ©¤Å’™Ë÷J=oYÝ.ìóüBê£Kîk.èÿ‘_Ü 4wV˜wíì¥U±ºg¥Ç/hãÌ}Nù18$’d$±k Çç¡pJ Îæ½pÂ+¤žèé_ÜØ5ZÕ¡a?ð¡öa³¡ŽÖ,»¼•<Î@ÕßI•ìZ&ÜÙ(›9«†E·† ËQŠi\Õ ’²¯¹jÛ0q­ä*® ·ú‚}»…ÂF"xðóÜíö´°‘°¶.Ó²;…-JÊ=bndF”謒Ê"Ék·Îq ^¦GNkêÈI^㟳«>âŸzL°F-+FÙ^’¨¢¾¾!é{Ub5ÆjzëJ~Ê!=‡g‰ƒû%Q}qV=Ù »v uV ¬¸ºÆ/ëdµqè4£ó pnƒ%¹ÜÍP'9yÁŽd·ð±úÏØ¥W] µÒ¯§X;­> WVåEˆÛ2¥s–8ä*5—<‚Ró½"°Øý§kŠƒ?iR-¡ºwÇSžFÔK‰®ù-Ó¼Ç7MÙ4é÷T1MüÅŒ;âV‘Ì¢2°º¨ ƒžåô%ÞÅ*9CtúÁqÕÇÔÓÇå÷’Ã)Áß²OqæÞoÙ£v}z»ËÚú“N„ëN ”.³ÇÖjßæÕÒ¾ðÒM$áHÉ"&% ey‘Ph¦‹ÓO"Ãïó¢rD€’€Ïµ·’jó“HUrŠŠn´V¥ü>ŠoÖò„4TÝûà`[¬$µ”«¸Ô —ÆÁ¢:X­FPê¨"p ·±î ¯§ÙŸv{«e®¥¼¥wÉ™#L»«¼HÎ*£îØeÔ_Š~„Èè.˲‘ ’,FµÂñ,s™VvàyÖjä‹Ô@þÑâÿ.Êø× endstream endobj 54 0 obj << /Length 2974 /Filter /FlateDecode >> stream xÚ]oä¶ñý~…Ñ'¸UERŸèS/½¦WÒ vPM лÜ]õ´’+jÏñ¿ï|‘Ò®e' ü°äpHç{FV7ü©›&»©ŒI›¼¾ÙžÞe7<øáÛwJð6€¸Y`~¸÷û?ÅÊÒ&kÔÍý~yÔýîæŸÉ·ßýx»1Æ$Ÿ?ÞÝ}üÇyòý­J~üp»QÉçOßÈò§o>~w÷ñv£MUfI}û¯û¿¾ûx¯.´þ•4"æ/©”JË›²ÎSer¦sàêªJ¦ãàËÄ»íԽ照£ëyô|«ëd83Ò®õÓØ>œ'ö»¯XÙèÝ£mX¢ÍãŸÞnr]&Σ¯ž_ÁùÀ+¬šFñMÀxëF™TBþÎ7y“x{ÂQ‘-ÈG¸•_ eâõa/+üót:Ùùtl·HÑWZ?#⪼€Ö»Ø3(Òò¹}íø|[›ä=¢˜y‰Ù¶¹x‰â§À [: ´‚h4a •0‰ ìîD˜=<˜D°cÛ®\ª0—Ï„…s¿sã•ôýv@gZ%2_wÂÈœ>„;Çj²QEZÖ…(‹m x–%üC EʲLNV Q— —pÎÄc í€`»ga´ÆaHÓÅÚ0îÚž`Jdhàz7ÚŽ'ߟÀÛ3¾Ä^h{?9»‹Gã[âS–q É@®Àp¢ÞhS$±Áž§ÈWyµ°¡ü„¥Õ™ó ¥’{b¯’Ä ½E'®‹|‘{|ްD@7¡\qÁvÇhi˜¨l‰pí´f?£Û“‚ ¯ùe=€Ñ"WEâãºÂÈ=óhõǃYt&ˆÎ,Eg@\˜„Šô I/ÒO÷¯.Õ³ûÔ&ÑH¦ÎgaÍ~ ‰(˜ËÛ´žD‘4òŒ¼Ç'Á·ŒÔ»'¾†¡WwâqVF_Ñ/—ôÄ n¼tÌpü3k`´Ç‘hœ)Ä8ñ(ölG·C.” ïCBX‹(ìêÖ ”´Z¶mÛý3/‹hatùT¶®ˆ¢Eç¯7áä©õÇ”ÝgY×ÉŸ0qP…DX?Ù/¿l{±\ !àœTÙþ xmÏ(€á]<¸âÉCAmQ.k “5iSW@0úoÁ¹¨?Š´Òã3ÿ·~+§³Â l‹¯cRÈð •ʯXá™ý'»sG:ó$Mµ®»rsÖP¨ 1í¢èŒôQ=2„¢T ï‹òtéIY<纲ÀóG@mª9¾ijP‘GƒQh·Ø–œ'µºøw-¥ÐÒäÂßÙñ5/âÍ5 ©–M“÷Ü«{À¢Eèh}¸•›T{îh­ÔšË2= <Ó¡½ ¹±¡m-XÇ'M€ŒÄØväF“½H–tmÏùµÀƒT2ŽŽ4ðr€íâv»šE›ÆuÈ‘÷‹Yôåã$ÓÁÛyIžó,-MñÂÜ1¥›»@+´Eš5úד‚J¤³äîÛ³¦¨Q‘LàGžUœ©7Øø:+m/‚{†³á„íú•œU/_/1ü•Ç©«F|ž•fˆ+e–ÖªyÁ(®‡QLiÂ’¦Ðpž|»s×VÉݹk¸gì-öÕðñ—!†Š‹RJ>…J…ÉyaJÖV$Ôd©Rê·( gˆdÙeÉʲÌË·ôBiP ]¼ymM*®ågÙcZ$¥e²…Üe XIB© Lë&Í›z-Ý2š[èFsíÓ+…᜖?:ÔgZ-mŸÛòAekÏ^P¨JÔYì²³ÿCÈÒ•yFæ ²`ÎûžûÜ_ý˜E7õ+¾A§y•ÿ&i›&HÛÔAÚ¦m¬´í igiöÿx$j¸¨ù_r‘³îùËåÁÚpº]¤z#9uÆtˆv^XÕF•&mLy©¡!+,¥;±–]|ƒlëQéè¾þ¥ÀÏ^ ðæ7ùUÛþ;·„Êb]’¹JËÌü&'_ÆÎŒX’‹`ñ¶Ý6©ÑoK²I«èOÂéXg¿Zn †”G—¡ôà–d‘`ŠÖ¹kB[9H>Ê•Eh oT]¦¦¬×¢S–_IUÙ¼t™èdù2±Ä)'ùó'Ç˯Å\WãÒü5|v(Öc~6\>Fäó‡ÍÅW’|ÎW3nÉ$U QÍ™2Ž—RÂCn¡‰€–ÉLjØ=["Nãùj+—‘Ô†„Øö,WBբض6æÌ¸gEZ|÷Jˆ[õ‚0Ἠâ¼æ†óÄ>¶¨¯E\ælŒP¬KTùòö…gô(ü¼ëö¼Å†›Ý6¸ãûpÆt„bú8tBjɪlBçÄ<Ÿk` ðÌYi`-z>9äÎ?`†¢sç³}ø<8'—yÒ‘>¥á?>þÄM endstream endobj 58 0 obj << /Length 3023 /Filter /FlateDecode >> stream xÚ¥Z[ܶ~÷¯Xô¥ZÀ3©{ûäNêÂH‹Ø)P4}àHœYÖºl%MÖûï{n”¨Ù ZØ!ÉÃsýHYÝÅðOÝUñ]‘$Ç*-ïêîULÔñrÇŸ~x¥„€óÛ¯¾ù>ËîT|¬âJÝ}<‡K}lîþýðãÏ÷‡$I¢÷o?|xû¶Óè¯÷*úùÛûƒŠÞ¿ûN†ß}÷öÇoï:)ò8ªîÿùñϯÞ~\¶Î´þ2"çR)uÌïò2=ª$e9ßAŽJEÓµ¾×eô€=™ž©ÃéþeÑ¿l=óÀ/±J[˃×ÉNÂÖ·ÏÜêïu]á˜ÅcŽš5¶LË f4í8½¾?¤q5f6¼ö4×z¾Ž²|kP gü3\gÙÉôHXPUpôƒJŽ*ãÓÔvšZ:ÉbaN‹hêLÛr³3õ8LÜ–ñ<w}ëzËíóµ¯g7ôÂþKœÅ³íy r }ù·…Íý"ÂdûËüó”H4?ÀüPlÅrÝA£NÙ/†3d$ya ,¦.71íÚƒ¾GLEómGÊŸ¡Eöh ñšYG{1c#2>=XØs”ue/^_Ã. ©g&¦5vt¿ÞgydføóÛ½>‘ÇOG8E•.ß~¶õu6§–Y&Q=ôÈ5×»þ´ù]HH¹×Í€À)@î>¶Wá|:îçÍWj> ­(ÜïÝi4ã3wž\ û´Ü™fþpë^gvRtÃ:J¢–uŒr=z~D£/+dÇ¢=ü•ûä&û%L#wƈu¡PQèRŸ¸‡ŠÇaÃ?/t]F–éÃvgCOÀãÁyd/‰%æè$¼x]ÁçN×Y¦£Ãø¥6JG™è¸‹âwl}æˆP¢ê4^¬Ïd¯¼2B71 ¿ X4çà8i^Doz‰äÓŸ½s“3¡­,tãO´¡™¹Ê¹¢†ÿËâVAø$œ`°$Ž`È¥9ƒDò‰,Ùð@ãF8·±'7?0ß’V·ÅÀœ'Ûž$9úY^f[C½åPXÞ€NRÜ·ç_û¹¶¬ÞÓÌÀdÚ%å3JìЬÇ Ê~‡Ù;+W—B®Å¥h *”ZõÐ!ýDy5µà/Fžžùñ P°ò°`%…>fEF¡ÃüNx6E «Kϱ•OÆ&Õ$¹>æªÜú©/`^¹ÐðÊÝ‘¥(U¢¿* 4c/²°íö–gêÀ¿ã@Úm®µ°þ <z7ÞŒS_¤9 Qôl÷äJy(áÙ œ‚‘*íëk±ÉI•û¸‘Pªb hún¢ðî! Œ0W“÷¨„NŽå+Ûúmr/¿_ö64ùì0ˆEJÃŒNÔè°2Ö†[‹4š·LX€dJWÚo‰ú:ÍCgÇßOÌAR>ÉjT¢‘JºBÊh9&F?eœr5Ú 9p‹DÙØÓõrak‚» ~sœFafFc÷ŠËßÑ’IHׂƒ`¯Œ.K½À1P|Z›™9ÊÕ2,ž Ó¬YD‚^=<úì \dd ²¥ŠgÙÈÒ Ãêþ0N˜ˆ ÏfO9N0¨›=&m˜à}ă# q0:FU!|dp©8,©Œ€êŠˆñäÏI»¸ÉoSÛ~²˜RUh˜mš~|lŸwœÖ ãç"SÅŠD*o„­`#KïÎÌÇÉY…þ‹½æÊކmK˜ŠÓº¢(~Ä,kÐÐÏÓvóÑ](£0/BGôÔ‚%tž,¼gŸÐ¿b°VÝ^ ‡å•7x¼·’W_‹,„“VcÕt…GAà¹Ã*[uâQK–Jt.T`4ÜíÙŽ¶¯w1 —Ù%ô¤º¦è*R¼)=‡C÷/x9ñÞ‘¤ÑÒ4Þ@ý{ÍK‘Dþ@m0ÔÈ&C¿Áý”¾ýUvè/ÓèÙ±R¾Â‹Gù_C}4¥Z3ÕE€)©GѽaÀ©­-“ëa„;„Ô–¾qèê$@ò8ŒÖ4ˆÞyd‚4/ª^pH ïZ²fHÐçÜTÊ”N³ÕêHeoâô Ý'ˆxŸc™›¥0ý+8±ð¨,F9EVz±OûŒ÷§ç“2,Úñ†Axâ8 Jdé…Ø àSœFЉ”˜°¡¥¿EUàÉxkø#F^‰Ìƒ:¦+®ÂÖ‚yAøÇ|7ÃaBvq")€ s›6h3]ðeêÝL µi$€hÑ/"HÉéˆ]«1Ü|þØ0{ù-ÿLLõ€¶±(yï8¸oã‹ep’*Á( X£Ä‡–[|=DÑ/WY;Mft­°žÈ–™¼ªK1X FÄXt Ùog„8„à ˆ‡¾ü •ì/¦áÑ×÷ƒÊ‚eDOR”~¦–UäAð3]wì=k¸Ý.ªNg}~wSÇ$† ÄØbÇ‚Ž¤¥Ì£h,þ“¢ÿdZGo^ìM%Ê ½šîå¦yÊÞ¿\óÔ;WÎN©H Ô•l-Ï0^{™ã:™mø'À¹Ü×r_ËÓ@8¥Åd*Ç¥Nâ{V$ìWf’DJ*†t“Á6: ¬‘{Óó4¦Êt†.x®éý–&ñ°¼b×±TÃ*ÀŽ|kÂÀÚ¢+,\Œ»a.ªU‹Z ªPŒ zñ×=CGÓÆÓ(Ndƒ-Ã?·Ž D.µãÄa¡%¸µ¿§@£u›ú+@ ¾ v1™ò &× i6m;1üçç¥VµŒfaÌϲH<«­òÂÀVÞ\‰[*¯îås65µ„gÇŒ¤—¯üv‹d©³+üM)=9^UMc×÷ªõ5*.ªm^¨÷Áª.%ka#hØ#“ê’LJ„ÑÍô ô”Øñ5_»ùe´u 2ÆÄ™3Zk¦Ùï6ZÙй5ôÕ€^ ¦¯7fž@±'ð–hr2åïR²W¼†êˆs¦˜Cµ­+#“ëù÷Ãõ4ù‡OäÎ Á@ý…78 sä’ÆÆ‹lßLï†Ñîz±éon:Ó¼½åøHƒ½ºàÒä¯> …7ÒåóøåÊЈðw§rÑìz@dD*r¹yp’gƒªô>WUÁ]}qy ­kþÂQIõ«6¯0ûŒïäCÇ#BÙÉ]z3 BÙ 9Çckè+K„lŠÙ_剾õIšè‹$)¿¶âo Iê_3Ò=K3ýÖqð»3k`'CÞ3Ÿ)\–|t' ÐQö‚VòµXìo˜Aµçgþ À)bóí‚}IfbÒRÀ @ÅJT5Áw (býšA©‘¾dÉêA×øRŽàû† î9×—_ Ûµ¼âóÛú8w²< p§m‘–0*_=ðÃêA•ÇTÉÒßÓëNŒ+þžªâµOùª##ú £¡˜ÐNÇtІ¸òÅôæ:Ç*ÓÿÓuJÅ>ÍÃú`ˆ&"}åæ78hý]¾:ª•#xõPëc?ͧÕ1/_f) E.Ÿˆu‘É“+ _´n^x2D—Ñt÷Ö6ìb™”ï:Á͆ß ÿè |hô6üz- Ç9ÁÍø´£óèOüL®%¯¯÷ÞúP¡™bì«8z Œ^ú”å }Î<†Ýx:v)]d*¸@góú€<³´è>‘…r(«”^“d]ÿyäåË+}1-‚Êç^èm7b5Ìù=w­“_Ðö×]lB;¹^¾¶Ò{x'(zÛJ ƒFgøk·ŸŒpAÞ£–‹™üO‰ÿ%ßìZ endstream endobj 62 0 obj << /Length 2886 /Filter /FlateDecode >> stream xÚYK“Û¸¾ûWÌ-œ*KáS$sÛÝò:N¹¶¶Ö³‡T6Š‚$¬)rÌGÆþ÷鯻Aº’ÒA@£4úÝÍè!¤_ôP†y’ìË´x¨ooB†ö—üöþM¤x;BÜ-0|zóן³ì! ÷eXFOçåQO§‡ïùýq—$IðñݧOï~Ã8 ~}Œ‚ß|ÜEÁÇ?éò‡ŸÞýòéÝã.NâCDá㿟þñæÝÓ|wÇÿ'‘ÀüTFQ´?<Št%©úG˜…uw{¶éß>îÒø|~Œ‹Àô­iU{¢A˜C‡ÿ"èZÚ ¬; l¼]|¦×äÁ;{zq5Úö"K÷a47w†ì¹Úú‘ð¯21_M=Õ±Ñy?µtØ€Sß‚Iôè]”ì£LÞ1µaêx­Fá8^ÆÔt­iqË(vLs–qU«j­d“€OÂ~¾±Ø‡E,W~Àa‡<¸U`Ø7LŠàZ=ëû[YUbà=À2éÍ—Éö沊@Oª;™õÕÉÖãà0²¥±µi#ÐÞ cOH¶k‚àÚÐËð¹ïv+^EBùsoÍXõ 9KèÜc_õòü,uÓ©“ÿ¶e©íú[Õ4ºÏ1ν>s¬£5Vh‘J0‘þþq—…Yðiª±ïªGÉvzÿ&½Ê I¢Cp3¿:Êéb:¥›^W­ÐJã‰9Eƒ#SB\‘)‘x“­¬Ö ’ÁGæÄ7…v£¬$d«WWú¿PÏ×Êè0YGŠu²ÙqUŸvQ¶?™jU"{sbÐ\Á?‹Dv–«XÎL¦ÉsSÕ ¸ŒUtßdr†±Õ0Û@ÓF)­(=4ªzÝYÉY/8·ƒ™~ø±ÌI†ÌmÞM˺íãòÂÁžÌîÈâßa,Pâ7¿Í³w!mk/°jŒýh²à8Í^,‹ŒF®ðÏUm÷Ì"R=¥…ºQÿ?ÆÏ!àÑé)nºZÝóQŒê­°*±¡^p„FÊ;xå S~É<Ú–o$ˆ#¶HœE0H¦Œ˜¥8#ñV¤ƒÉÕ]`ž+2#Ì׋Ð:Ûz˜ú /¬gýç-êU¤iZŠÓÍBõ²˜å‰‰øy šHc–›å¦¥€gÅKÏ[^ì w9—p³ãhNˆ-yñŠãÎA­ø´òé “RňíîëÂçÏIᆿñ5Ù¾Œî ®RƒûaíÎÒBÙ‹ÁZ¶i‘,x@Ë¢ªWÿyq ³³HüqCuÓÑ,7ž9IÁò[OÂwÌÉÉŽ°ÁÌ$£ È„æ¤ëdÿB+ù*%/Êÿ:š8‰½†vèƒhî… æ”aðă]̈iñèb=&ÞL6­hjOlÆIâB,=ÔA£vw¾[ûdæð†0­~Ü[¶s¢‡}LéÍ*4U¦ï­ ÒÖ4VݬO"—ak]6aÄ$`àØ)¼d–;& y…O|¨ÒY2ÒÝê XŠÿJï_,6<¿êµ!ÇeÎê—šu°VvKíIpÌWжå8 Ô»î;Aù#ŒÒVÖ#‹u|Ÿw«Ž9cØó™²„¥H•(>Fî±*Ä$ßÇs$T!÷‘0-ÉVJ²Ãt¶7y~–”Á­cÕ<Ù³‡R:›Ùã­±íg9âW`× hé÷Ó²ðþÆÞs¢ùZ›çñ»q¦“#gx¦´m@þ”æù“‚Z†¡€¦Š˜QäIðC«™*r¤·çQ&Ko›‹h¾gM k eMz—N«WŒŠóBRǨ8çÌAKFa.:Dƒ™K˜°¾Ó?ÛdgOz²(*Ü4‘ELcw£Ô±–l“Dàh7¨Õ˜ÀIåÆöråÎÚ_[¯ø¯ìÞ.jl¯\ÑSyA¬úÓÔ®ïfüAw8•¹ ľРPØ1@4{/Õ˜ïà€Ž¹IHiTÐÀÞÄwî 'ó­´zêµÆ÷í¿P F¬èû’µ°‡¿Ð|5}må¶XÛ®ä±Ë̉æ$íŠ$€Ã´-?0ÅS} ztœÇmOë[ÛÁrW—ógĦ¥a=Û¶ÏÔ>÷¸@´½Úê*ßІQâü=fÿ]KŽÔ’?œßJ Cž—R••ÈShÿ—É0)p'4YŸ¸¾£áŸÓé⺌ÛëYMc.•ôo°WÎ@m8®ðm{î‰fû”ó|ÜBK6,ØõË(èM5ˆf„ì[Tó`@7«RõiÃ’Ì)µ˜Ì ž$ ¹A}š½7!¨ÐÃ¥"Ÿân]%- ÊOOßñµº» lMáõNœŠÇ²Ko–Üáeýwõ|›ÈáÅ]gÝ­rÕž¿6`=ðìð¬B|ÆZhÿ¦¡r”ÌÉÊé@f7©@”†4=G(¤«ÓÌcÊÓ5“smöq`ⳘìPæÊúœñ!®Nè.ú=£Ò0(¤ì[ýv¬(Õ'•ÎúecÎv¹%25”>˜nâjËz{/³ŽªGQøAŽrÍŸƒã'€>É8h÷Qó÷”’ûö‘û˜ÄÛ]â;J+ÇE²;÷ïïçL)ü9œUEZ•³ã¯fR …kEŒD7Œ øº€&¾‘ÇZÐ`Õ1Èc—ºÅËTŸÄôê¦AYˆ‚ŸÙ•n¦BækE¾_D…»ìRšÎåÅ–郒¸¤Ss’©ºUOVÒ“à—VÍ(½}œƒ dz "\$4P)ý,j8)]8ñÝå­¦ôÜO4yä©Bj™,sHM-ãÕzõØè9R`Çœù.áãµï¦ËU&*Dnø³ÑµIÏïZ·™V}ÏCù¯(Ô…€`q\,lË‹oP˜r°p•ôÍ&‰4É&9Ò¢kܺ+ð!ñÜs™‰Êú@hôvñ1­¾$lHåUV$øI^¶w_§ÿ `¨m endstream endobj 66 0 obj << /Length 2921 /Filter /FlateDecode >> stream xÚ•ËrâHòÞ_áØ“ˆ0X/ˆ9a,wk rw;v÷ ƒÅ‰)¡öøï7_%$¬ž™ GX•YYYYù®Âº1áϺ›7žã Æ®³9~2 «ö7²÷žï²Kœo[ ý&ñ ø%³ÅB¿ <4Z7FÇhoŒ3¸1~ycMD¨öT\‡ÖNª`1uÖŒßPéþ@|ÜdqzD–ŽÇ,Gâà\!Z.…¸vδɑNß‹¼”Õ¡Cs—_´Ã‘–œ¦ 8Hj±8ì$·d7:W&@ A3ª8#×|Ï0Y Úcöª¾¹®¦Û©DFe±JÏxCòX v›–g•¾V,8ѽ—çäÈã·C*çî°9¯‘~4†A’Ó)qBÅp6rÝþÈ4§Zç4 *ñŒÓ%˜Þ2H[þÈ8ÄœYИòoe´OòD•HF÷ 8 ,ïwNäì(Ž?åâ-e¾cCÅäLj$Šõé7õ ØZŸ¬´=È>*@|–ÕZ˾ϛ$YÊ)‹öÉ» ;ˆ²y¦ˆt‹¡%¼Þ ÖòŒô,Û–Íãì'L$⊌z&JU‡B¤ÊŸN7]u碮¡Y·]CK2Ít’FŠc,ÇA Þn™$ΑüÉS b÷I±Wñ ªŠŽóW6š,=¦gÎV¾–ü±Éª-×; [pü¢Ä @ÍXNÛd·ˆƒ+Ô¡\U6Kº-Kw·‰9Ø0WäÔfYÒf!F1 -MÛ]:¤§îÊÁ¾‘ìDu >T²LJ&ÝsF_š „6q‰=¬3éhdm Ò|SèFAÑI©8–zK!k(˜àX(QÃ÷Má¹»ª‹î0ë@çdQЖÛ÷fÈ»uÈ;òŽ„¼#!±Œ¶ñØóCZÛXOð¿ëî„È 5­c“?J¿cskQPÉ´$ƒí:uà8OÞxÀQ•Róà “Ž<Ì’²ìˆ¹Õa{AQ9²¥nk`|±;UytN„•¢Ëè Ži¬+®#LÍbŽ>ˆ9âjÉ#Iï ”`j¼@ÖCä)Ŧ°Ã=õ¥¢¶ï ²ä¥—€™ÆÎ·â•L]ôØ-'ýi9™rÑî³M ÃfÍ{Œ‹‰ö‡áƒ:ÔÞÂð(¥£Ð·š ‘Ê»/4A¬ƒÆö[šbUAøîSžtÌÌ %$ª ¼†²L'RIuDÛH½T,>-Û·X…HZgSJI-Ô›”LÜ¥+wè=ëN%Þ$µë‹ŽjoCàÒ£HÝ`"„\ôMjùl¹¶ÂÖwÃQóYÀ¶ÍÁP&Kò¡i= žíiŠºéB¦ä!õêˆ×ûxþ`èýå.¾¦¸E¦ãËÝwh7ÿ¶¾ð“žNuQl 'ò­Ž>®»"Ë j+¹Î˜Â„PJÆè([ƒKÂ-Qâ`éh¬Ùž¥£x^íOD¢xB“^î9f­?¶ßú‰s5vC¯nIp̺€çמÅ×'BŽ0Í^åX!mäXtskÌnÞdxqs¶EÉ U=\Ü'”1ê[ÿP*2/ŽàØãK[‚@ÑhÖyQ²=®=Æ2´v)²bHj _«Ù=`Ш[­/×OŠÓ´úÓFØm4¶GŽî±£ðFe Gľy)ÿø´Aµ±ø>V2!% _G„7nÍë†S˜ÉM 'ø‰€xÃ(ìàŽ%# «,…—n§ú?k¥BÛn;XÍ éGh›Szõé7ˆ#<ÜÿØ#êP„€ê‡nö‰]J›“€+cªži¼`Э ¨“,k³\¹Y—›†“v7&^3é"Èíš÷“n¿¤ŽŽ)GGž4A^—3}ˆÎ[î ´~YÁÒ6™²‡~Ìë·i×—CÃÔQÂ&¿@ob™JhÊâ˜`ÛR2x¬/¨Aw›œÄÜ®ë±p ¸¸ç{Æ¢R<‰/¥<%úÒÖ ^·5VZ-Ï¢þEŽÖ#>¯Õj+xf_ÄYÉsÜ­úÜ騜ð›‹å Ÿï i®ZËÀÔvnI)¿ž¥³¸Ú ¨/i0}w¾:5| [£|Û¾LCWt,äͯ٭•‡XÕØz•JªR4ƒŽ§)˜ÝsóÊïØ©¾^³ú^µZó³ûÖ³,˘¬V“yôÒUµ;³ÛP²Û}0 Ïø+ÇnQÑÌÂûÕd…î÷ˆp­'èG‘†W,X<òwú–ËÏÁ­°ÄX¶–±"ÒaÍ Îð“|Õ>Ä• ¡>´X1@b:#«Ó5^n-äË$¦|‚yÄÈe°zAB)ŠðHqÿ³“årv•ôéä~ðÐl¢ÙÆ·ƒÁw<ë4XF £ƒÎX€ +:É·~FCP§üGû#.úo«0 çŸIò#vºX¾tzê*üü·ùÆ—Åì!X­˜ÌîPQöH‹@è%mLºŠÂ@h—d«êökøð"Þf›NÐÑ2:ž5ðÀ§þvk:‘]Áº:]o`Ü?åÖwMw0òœ+o £/‹ç“ÕøÚu…®‰ßÉ\¿†ó‡[!kˆÆß—+üEðA– :|·`ÁGÇçÓÙóØìV<é9âÁ|É#AøÖŽ-n[þkjÞLÛ,„(<~Ÿ‚U§@¼ÍÙ§îÃYHÑbZè8€[zÍáLŒ}$c¯xf¸–[LŸg™^>¯–‹u0`*ÐJ!Äq§;®EuÙÌc‡Baqe×ø×ó„E$ªù“APŠ`O“ùTHñØ­µHgD¸æ/Z¿Ã4/‹ç¿ ­Á9f<æs@j±CD ¾ñ5`â‡à1˜Fá×à–a`É´“õúóˆð¦ûÞª!B²žÌfœîçÁbuŠÅéµd‹¯áT\ HWÁ¥œ„ò;5™ˆ§‹Õ ¥[ÌúgéÿÀ5 endstream endobj 71 0 obj << /Length 773 /Filter /FlateDecode >> stream xÚUMÏ›0 ¾÷Wp Rá%|½å ”L4°$¼ÚvÚ´vÙÿ?ÌŽC×nÕ6UªDZŸ<¶2øñ¨É¢×¢H›ò}þ~ȼõÇ·ˆs>ðà—€crçÙºÃËPUÏÒ&kxä¾Þ‡r_¢ì¬×8)Š‚MÒZiP/Ùs¶¶qÂÙ¤º°­:©­Œ“¼ÈëŒñ<þäÞ¤»å®òü?A¢ç?Q¦eÕ§2åEI@yÆI ©•Ž“2?1=“”oR;RW· ÝÈ÷«2²§U»‘Ë7í$i=‰˜óœ]i5›àç¯ìl¤B7ã…£œ§¼Œ^¤¼"\§ªKv5Ê)}ÆEÅ®jšÈ,ôFJ7/›QçÑÑrœ§^š#¹cÞçÙ2Ø–øT0aðßmCòspˆ¼>±‹@§  »Ìˆ] a)tÿ‚YÐHQÖÕ®NÒ.d£­Iµ†rmd–<i.Ê9 ó ÑÎ1Pô&ÈUÅZOn Ñv¢+äÏËm^isˆo„W@2²q–6ÄQº›ÖÞ“Š'<;h?K-˜ŽXŠ]d§p+)‹¨»ã§'²ù” »Úùý »jßú …Q– àáÕexF„ç±€~ZmP0J¥E«&ôKdãÁïvò¡hø˜UÙhj*zvû©Kò Š%/|Æ =g´À¼¤[#EηZØ5Ûm%µ:¨‡DC/ï™àªx¦ëVã›,Dü³^Ç3]Ì®BQ¥ýä‚ÕO.Hjœ2 nT&ø,¾À4#jG~9BÆåƒÎ!ð´r@îŸp÷P x³ˆÂÎÁ0#’ WåFÒh€Áw`°ÙypWÿÊ#¡šüHv|·HS²k7>CBoTqÞ%%@õþö™Fœ[TZ‰IP¾’oÊ"±>Â@’Zã@-Ô­KÉãÉ„!HÿIèñ•ü5.):ÃCþzÿ'uZW5hRž7Aêžxòh.–Lb߃ñìáA…!Ý?4?{”0 endstream endobj 76 0 obj << /Length 1872 /Filter /FlateDecode >> stream xÚµXooã6Ÿ¢Û›s€Æó¿Äñn+z× ]¯HÓg(ž=À”DI„s¬@VšåÛ)ÇÉy÷l†µDQäIQ‰¯"ø‹¯Šè*OÓ°ÈFW‹í›ÈQÍúŠÓobæëc¿Åù~ö滃ÁU…ETÄW³U[ÔlyõßàãÃs¯Ÿ¦ipûôt;Åq<öâàù}¯÷“^žÜÜ><ÝöúIš £ N{ÿ›ýôævÖè$É_‰œ_ Ìe¦Ù0a”ÃQÆiF(ït/ƒ@ÉÕôïv呆³¬%{EH³­Ï™_¬÷†f’e=½6˜ÁšKW/ã"ŒöÔdÆçipì%9H¢ÉR¾ö’Q K½CB¢W¨ç¥ša޽Q\e4 DµlXP¶ÁDTøßEYbC p>ÇO i¢ŒÝ0am¤°²æ=d×µš—̰¯å¹<Þ Ìûy©×ègsÆ2ÙB¿ÆQ`äBo·Áãt+>«jMcDŠß•‘Ì\땎d•aªÝæd¯òeáÆ, p«[ªÚ5ß[^^õ÷nDµ–a¯Ÿ¥9œí(sŽôÚ–ÄdÊã ‹}ç(äHcòÄŒ²–ŒbÀí­Ò‘÷ÕRZ:rÀÁð×his“4%¬TÂ*Žˆƒ4àµ=šÝö…(8äKˆRR›¥ª0¶Üì£Ä|eW|QýÑ.'±ZȪ–1hH¹"Ë@þr­ ù3Äè²ðûKkqˆÑ p»°VÐ4l4Xé²Ô.È¥q•¶ fF}±¡É”4€s ³`biEÕ´¿+áíí-ýhP¿±èÜc[ä.x×È+-‚Ú c‰†)…$Ù²gñ²7 fþ5гR²M´­®y¿s;°¤rÑ:o·´€è@'âñ‚ü}Qîk ° Nãk†ë»®x z2bà9Ç™‹ãz£÷%r$ŠzåÌÆULJ\)¥põHŽ*â°]ã|Ž ,äNó·]UsæIî9P¸Që ™Ñ!5ËÂA>üªÐQ8ež£T•G^±Q‚æ\ö¹ SË£‰é°‘FžìsƒÕ¾,i•‚“‚(I‡a”Îj¡ ÂãJ@H óÃa†évd¼C#ÌA2`À8B(ø]«WOÙ4L.üßÖ4­Ä–œ‘n@Ÿ¹QrECµ”LÔL9¸ëÖø»Ô²f¸iÜ‚‹Q…Ù£èFïÜ)ñ.¬b7X'húÃQ óc‡Ñq”†ƒæìN =±·m:Ô÷yg?SNÄl£ê3o°)L¤ûGx¿à^yGÓ#¸ëç×GÛàÎïÑ¥ ¶z©VÇsn.÷g'źmf³æÚ)Ü˺ö;?ÊJºzŒ®Çú¹:3LÖà.çz#9æÇ …Ÿ<±O˜Ža*ðÞbI{:í~•†Ê²%bƒ»æes pG×]¹Õê=E¨u)¬÷ + = ¿§“e§¨êìFïšôºÌ‡ƒ*ù$æÌ”ë.×€âùe2»ûô<£Éøá…©ãétü0{yçEC°ûòU^ÂRÛ]©<胫íöØø»CýÏ·Ó›;P0~?¹ŸÌ^Î}ÿa2{€ž'Ÿ¦Œ£l~zº…‹5†# ž¤ìÜ6ÉÿÅíÐàõð¶Ú‡âRZ¡Êúü¨Rðâ3×_Qîø„¯ŽÐtJ(•ç.•㿞~¥Æ®ÅŸªWs—|îŠaÀÂùq0Ê^”ü¯elšSþ²ÈIµy8(è;“P,ë± ŸOûF{šFL|J#ìg“(‰ãî¬(ÇÀÈŠàùiÜuÿâµ6ÂjÝnÇ¥k¦áNË%=Uµ‚T›­àŽhôM!)éEàˆ–wºÎîj±°Dh^W8išt»öªôííÂ÷l Î6ãǰí„ïæi¾…Ðk"Ñó‹òÅu¹¨'6Á‡cAVEy°––HüP3DF§kæõ+!ÆA‹Ÿ&gùÌÒkb4ÝÑós+ UK¤i–ØÖ ¹·‹±5Ç…ð8 ¼RáZL~h~Ù s' ›³^Aj]á( ]YŽàtyN4ÔéE)ÔVš.EFiòU%0Lâ¦ís•Á»LÂAëÅp/ÁØ9W*¨u}zM ¡±¾sÝ®bãWÎZ`A.gPÝ‹í¤‡9„ÄLÓó¶{úûŽÎæÔf…/rG½> stream xÚÙr¹ñÝ_¡ÊË«$zî#o^;Öjײ·,&qU6$±¸s˜‘¿>}a›”ª4@£Ñh4úfpãÃ_pSø7Y-‹8¿Yï_ùm¶7<ø|ÿ*¼;@¼›`þ¸zõú}’Üþ²ð‹àfµ™’Z•7ÿò~2mg›—Å]EžÝà7öîµÝ/ÂÜûfôñ‡–×Þéo‹0óte{]ãj·¸ Ã̽ ^ü{õó«¿­F’0ü?9FÌ3–3`9[†A Ëi/ƒ(>e9K˜eøËQ0²œÅÄ2€Ë0ìÑS‘€ÌÂ|éB~zy “gÞ§ªå‰mÌÖÔªª<õŽé: N‹ªc`·Ó @bºk÷-@…§†ñ–ÌmI½¿×†%Ý´¦CTÙL7ÄGS׺µÂ» óA´ ’€™7ÀHœ1Ò®Žç©<0^™v¹¸ËAX+<+ÎR`‹y«GöÐpwœ(þ4ºÕªYãÊNê’·ë²_«ÎXac}BmÓ×¥Ôg¼äË¥K°(²ÀûH¤Tų§µÑõZ–Þ/òس@ŽPnQ4¾w4ÝŽ—ö¦m‰œt–¿‡ÆîmGt|¼ Š`rÚŽ÷ÁåµÝï‘Ͼ6r¯)¿Ì.>Lì‡Þ^ãðϬQÎiâ{ý $Xwxt=lmóu7²`Hjßh¹¢½ ÎÆý}«ç”ÛCÂn…¢åïNW}3m¯*ó]_ûÈ?Il~mAÞ‡®ƒèA FÞl±à=¬Ià2@¨‹»$ñ~×ëŽ!ÝNÉHóXz6„W¤ ˆjù;7=„<“êÒí· • ¸"§äì¶ßïIÃ`L¢¤ Ès†°R¸ x‘»á&“Û…>x¿’úw<ùIÕÚ!„R3Tñy6õ–×@ÛìOíy¥Ë""Ùï?”$Ž}ïig›Ž¼ ,’¨ {˜¿Ý©¦2Ÿë¾¯E±EH[#óR~9اO÷X¥óÿlIRy,ZnŒ3UÑü{”9Ýá°f´ªÞöj«FÀ> ¥þ½¯×Ý`m$ösc™Þ>A Nò¤Úè©€q{¨´Óhæª1Ï=±6êµ»BØÿh !ù™z]õ%Iñž@ýšŽQ?èo/‹<òn/ ÷Q‘&€"=ê^7·WètÔ^5Šç=ȧþ^OvæŠ{߀·kZvOˆ®cy僕«~¿eÀ Y±ôeÉ迨C¥êsÛ“8õ€fN&(Š€GlIàµúÍ"†’EŒ«þ©ÓÈÌéÃü™yc‹ƒùŸÈ¢2|å¬,(þÔd®00{ô€ÌR(Ê“†=±°tn‡|+|SI*A%JS²0˜Ó)³9N\¥ó‘¸2Z#à“5ªý-g GPgçêSŒ».N¾ðÖÁVÓlæ@a“8ñÞHꃨäâ.0³'×”xºmE¶Æù½dt\¶v ­r;Ø»%¨ä°í(³ 0i›ƒK¹qªÀä¢wB¬q6‹³1‚ÃäÉTfmÅÞ;¼ W@/ñtÿ€†Žr #¯µü=É2æG0)õø•åԃĢç6N8%W_8gB|0è/:’–NN Ήc¼‡ÏOÂÆ‡%Vò€8­›¶»àwf:¦ÁÈt˜ú´¯6폤ŸÉœÆ / 1áŒ.DÿÞC'{ •Fuº\±¢5=-Rd™€=ô•j¢öï‰CÔ’Ü‹OÃî/uy@®zH4B¡Ž ÁˆƒÄMí·» #þ-C6Ýq\bdܳ"µ£Û™–g£†ù©»õÆ6B[4ýL±ãµf¾]"…]¬J0(²K4uÛ™®'åàÅ©«Â¹ÓÌ:ÞÔ±[µ×³˜ŠYpbYÁ"ÉcQÏì\=³Õèä2õ«8ß©’Iþ*ÛÎAcNV#oCöƒúËŠWFC¸š·Y‚/Â/²W‹Ï”"MO 6MÙŸ“Á¤¬ô!´ïµ00ÑOX™y4$$!îÂ]Z-É^8í%a¸Ìòü&LÒeeÔO^&°o ÿ‚ËsÈ´ÃìößMpc|n'ǰÉwÝᯯ_ÅŸRh›í)‹a/0Ö)‹×[Þûœ¡™u„`¢ Å3~\†$ý©®š½ª'®€QvÖåHÄN]i7@93‹¢“Z—ÃT-C?‡×³H½¸)Ž3Ðý’- JpøÔÊáTñ”ÊþL³AÝ\àz ¶êE¹è我ì`®£îNF ø“ÌF ‰cg*I¥¾F®%³ÙИ-‡•y{C²yÖ¤Òæ_=âe§¡ûU"[æ…ø±7,Ó+¿_h½ü¢C$iRaÏë±wª8ô'°hÒ£%©#i~áÞ_w sh®¸¤‹Æôøî´.<ÒÄõ¤]U4W-ÿ4÷©tK^êÄ÷Ü Ã‡«¸³C#”0¨õÉ9M Í¿*ͪ۩Ú花V;ò¯¢`-[Qµ¨{U ­Ölkƒ©ÌZ æàYãK°‹|¿“ãb¨Ú~iôø“ˆ«¸³Ð{ZÛ®cØ?M[¢3ÅqiJ°0‘3äÀ{ÂÜ@fd"ï³Æfâ#µä²h¬@‰Ÿxï”nN~¦p=MÍeH3}n¬ÌžŸ©uBá9³ºÖaè§ Üò÷ ¤øþ2øÈ2zbÃ8$õGÅà–ExÒƒ„ù¥`!¿SÌÃV+T%éÔÄÏL 'õà… ;V {þA舕¥#ÍzÿˆP£KCnI_MÚ¤… º> stream xÚTÉnÛ0½û+ÔD*)QÛµi hТv É‘i‡ˆ$ ZêýùÎhèDv‚¶0`’o¾™Gð8ü„Wp/‹ã°¹WÖ >¡ÝÖ£Í×Ë…p~83Ïw«ÅÛ‹$ñ ^oµ™§Z­½k¶ÛÖ¢œÙnÐk?ˆã˜}©Ô°±]݃¡©d"ñoWVO7%QôŸ”Ðó§ 8ea$é8¥¹ E,çœbñÄ)Kfœ€ÉiQPu”‡¼pñ—ÚÖ>”ôËèH„nbÖßÛ±ZÓþ7-¦¡µíLSš¶Ò3«d¥­[sÀTãB»ÑÙæ`ñ£Œíé°Q¦«Ü¾Ó¥nÌ@çoy *ó€î.«m, «q(AUèN ¦Ù‚O¼÷ý ëÐrž°%)¦KsÃ…,U—å’+,f àØÓn"™HöÉLLÆG‚©š™ý|¿ÝMÝì†'|~Ö52Aí²*Z–ûþUú@÷;x¤ù¬ä|* jÉ/ÓÙ¦~nÆf­;Ú^™²³½Ý8ËÓ¬-zîzà&°sWc‰èƒ™:ޤ~vP§aD“XîÌpO-bWªü¼ÄmÌ~‚-x¯:h^x†`ÆîƬ½Ö5ȃ·b Ü1½¹±1¥Ó áçüÇmwxtáµV¨:Ú A­ñsJ÷¯uxÒ/N9ƒ@øVÀ3c%VNz²–jì5npÞÚ QvD7j¬†šD)»À—¤5f¬(~Ói>XBðÕ=:è^ o(r n'SBò>rá¥<eœM“"LÀß*ü‰hÇÈ|vâƒY‚WfÚé5Sw®Ï-UÚÐ ¹EÓŒµjëêIüb®‰<,²#Âmäüv')'rg“žŒ(Á\Ur4…×zP¦]Å?ö&‚€ endstream endobj 95 0 obj << /Length 541 /Filter /FlateDecode >> stream xÚT=Û0 Ýó+¼EN®)É_kkŠNEë­wƒã(‰Ç lç‚û÷¥DÙçK—"ƒHù‰|D)þ ªÒ¨2©Tµ—Mêo‡SDÁ¯ÝŽ#¯_ëÍ—oYAšTiQ}\—ªÑöÝÆ¢d÷˜K©ØdÝ)ÙÏÁööÖ·šÒj§íÅ!ߌ¾»<æBåR0Èã×úÇæ¹^HdBü'[‡ü‡nt‹D@¦ݼT 6\èJðt‹Œè⹦‹éBé-t‘äã(pV¢LÒ*”®Ïî=XuÚá@Ù–”¾Ô–îÌHgCGK£Ù›¾™ŒíéÒéœæ²/)¨aœ(ß»®Ùwz-Ó?°8! = ïÛ'¼)kúÃG}çÔ€L R³zŽnù˜Ûbƒ$æJeA/~lnÓÙ#­Àk÷3Áîéùˆ$᧦muïˆ×îöh.ý¡“E³£+ó$-Ð~ÈÑÜŠ8ïž¹½pOÕA¸€DI˜`ÒoœÒ‰r4EÛk7_Ü& |w%`¦W°‰rGï`t#Ñ­u³ôy`øä&¤Øý¬‡€4¡ö±éº‘BÓÓ§PM¬Fî2ï'! pÅU0ˆ„Ì^*¶wÌe•‡¹a`sÂmê\–Íy4¶qKb güôßœÆ`„>Ì¥Â*aÜ7_}Ô•]º}ØÈmσgü“]ÛuÅqpKŒßùdþø ‹3D endstream endobj 100 0 obj << /Length 2346 /Filter /FlateDecode >> stream xÚË’ã¶ñ¾_1·PU#…ð!ß¼ÎfjSåÚÔf.)Û ‰ŒIBÈ}úI”8)F£ßä!†/yØÇe–íöªz¨‡1AÝñ_Ÿ>$‚·ÄíæÇçý{ž?$ñnçÃ5©çæá—è§VŸ&ã6Û,Ë¢ä‡ÍV©<úòm“V‘qß:óºÙ¦{ÇQRn~{þLJOÏçÓò4ý“l!æ_%ðUîÒ$WÂWQ©]’)æ+Ùló"¾l¶Iôm“¥àáöJpç´ÚÅ{Ùùdì€ì#ú_<°ŸçÑ »‘G§Ù`TEÖ†t›$´Éò¿éü©×HäöÙ‰þcêIP_[! ¢#hÏɽ1¤¤cÇ‚a^&‘î{‹€×n<Êá#ÎAºž¯ˆwJ²]’'|§Ú2ž³=hªˆ# SF¢%†4fÒ]ïyâç×Zži‚&^¼Œ,žYF“:ð¥õˆÃ2òŒgLÃÛÊ@¼ó¡ƒa†d‹>±Pvz¬Í’´ŸÝA×FXÓc³vþj*-T‡«¸Š¼Å?p=î6Û¢ÈE½e͉K5àÓ Ú½á±E}8¡ñLVñÂ|:¡zÿB¿¼¿‘AЙ,0;µ<õæwž–Zã+ t«Úö½aý‚XìZ£¸Ñ(@¦Ö ;¢›(ðÄ‹]"VþÜâESùn8õÆO8Ë¢W¤,—Ѥqaö‚í AkÅ¿öŒª…ðØêÞŽ²“vá]‘öFXf0ôØæ>ˆe{æÿ"œ qÐ4ùœÇYô-3ÏX­8Xx#ho´E(Æ×®Ý6 ëd»æß· §]g¦kJþÿ' -Çë}Ï ø¸öÚ¡ò¯H¿vͪ×^YÒ‘™ ó]£âp¢7zdPp¿!ËvË!¹´v%L@ÁpW¶ô:ÊdMÒïXÕ¿7UÆ¿ÊÀu^ˆ ²"-­!“åpBDŸZA_ªPô¤y¦¨ˆ«Ôùè<À'gNïÚÔÔjÐV „pšGnG޵O¡8Ѓa;ûþmS©h‡~¼~ôŒD,ãV9aá\‚×(Û–´s$yÊQ²± +a¼Wå…Ø".D†ÐnÐÇUÃq 2óÞï™&aŽêz<´ÏB¥Ñ?™7Ïë,Ür4£ql0[Æ7„pp‚Ø{£R<Öò i3KÃëÚá‘)˜NÓH¾®®óµªv•Êa#m0ß!û£ *0Çä`ö3D´µT_îwiv¢æT}º€cKA ™ßž<–xe°ˆº)fäÁbìÌÒ#½½d3–V*)0Ég'vˆµÔ2׆HÁ9…¼ˆµEc4OÀž,æY”Á`2èQ„‹³%Ax‡X–(…$,".%šœC­ÕT› +vd\HY·„©ˆá Þ(fQ¼G•¾§i•` ÓáF|:¯PzM”Ø/ä”®æ)©.µØÄYvq^ˆÄõ°‡’©ix:Ù£aOeV„Sðxs¼øxìeû©3õêu˜×põêru‚²¦p´ÆU^ÔðhÁBÁ¹Fw çS»iÖSgGòë}"ùVô<µÖ]cçAžÅÅy#„`,áœlHF ÿZd/±B®•Eª+BwÍÒKL¹£\KEÒÑ:H‹‡8lËBoô¥h¼¥ &Œf¿f_K/T\žãÿ:Ra¨î‚—ÊÏ †’°)…׸ £«*¶Süû’aLþó} YÓaÀç(íB,Uɪ0e«ê½ÒvjÑß1‹—Ï$ñEå"h-œŒ@—à+Èw%Ù«ˆ‘Çûœžíï"ÄWªøàÏvÈpl-ÀÙ\O $kƒ?<ü1)eÖɪ–?J(y:œýdBs#˜ör±Óȶ÷š eŽi^*p“»@EP‰«û”#-@0âu5”¤®—в8{rÙ=èe¸ª?HnàµlvÆCcÉ_6S°…iæšüv·¦ùÏ(¹¬âÓAN‰)3i‡½NqWŽ2˜ì¦hRz¸¡çÅNZZ—Ž-„|éQzг™¸#Rð'•]ƇpÒØ¬Šg j LßóLû•Èòi®{Жú’ˆ¼[QÞ8f‘,*œSB…¢¬c×+È0mÞæÔ.‡¬7GÖ/aßM•SˆžhÀ¼¨¨‡­TÔ KôïV•kÖ ªË.|`1¡Š”-W‹&ÞÒ—¡7öŒòkœÇÝX÷sC¡A}wlC°•½¾Õ I#X“xØ-oïPò¸f|§ŽªÅß9tã#5DÔYðüÒtùÖrK–Kû¥¢=}U»»´[á¤<ú Š>ÛMÂ1V ‘¯Ÿ?®]‘[µGìÔ‚‘—i¤‘i™uü7¦7Óºh ÒÉÿÊ"†L­³ó±2Àd=®¨ø´Ár]f—¶—”ï8w=ÿ ‘þÒðÉsÁï$Ö7qbí ²uS=ÿŸîí&–”gy˜±Žob~ƒðÈKyB¿%0wf´ãb0Eý°Ù–É>²ý[k'ˆœg‰P« 0 oNWLT‰þ°³˜a€~±UC§‘Eÿuã:|Lpš…µW’kèâŽÐP¹ßš°ÊGÖ“u¼æ* ì“Ç)œ¤ ‰;,ÊÄ•Ôý° ÝK%’{[ÑjcŽ_@R…Föhœ:2Éöà0ˆ¥cDÂJõË%t1f RΩpèH©/!ÞªÆÉÍ\§çzG}ç'ÙK…¾Ê—¶¿Vv‘¤€¥nÄ ~·“ZÁWAuFñ‡W@@£G—4Bá%ô‹¸ _‘hà˜Þp~¡C¨ú®Ûjo1-ýx<¡+e¡wX}0 2G?,ª‚@K(d‡L]„Je^fè&*¢¾œ13|y¡è„!QPѨ‡€ëÌz½‘®ñçª2zÏ uùZ€lû7FVÿÔR]B/;ótš'Ë“ àü åK0/ªb4cœãËÏœ|^óÿfP† endstream endobj 105 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/mnt/storage/users/claus/projects/geomview/sourceforge/geomview/build-opt/doc/figs/initial.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 106 0 R /BBox [0 0 492 240] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 107 0 R >>/XObject << /R8 108 0 R >>>> /Length 65 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`bi`ªg62¶4Ð3Q0×32000T0ѳ€¨´PpÉç B0õ endstream endobj 108 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 1022 /Height 498 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 1022 /Colors 3 >> /Length 21550 >> stream xœíÝ¿ª$IzþñXÉ—!§1ú ¦Á04¬c¬±ÍÂÐmè º1æ\\íÎÀ"k¬11Žü1väj¯@ _1ñëÜì̈7߈Œ?oD|?FQ'++3êTå9O>••õ³ÿû¿ÿsf÷3¢?°¢?°¢?°¢? ®Ÿýìg½‡KÛ?ÑP×#úÿû¿ÿ{%ÿîw¿ûöÛo¿þúë €jÿ{,ÿ«¯¾"ú˜sm©ÿ8¶èÿøôË_þ²àåãÿåc±Û¿ÌâËç’K.¹¬}YûïØcù¿ÿýï‰þ¦µrÇ\{„¿û¸=RòÏÈö¨ì¶Ç[|ÉÐF½¿c%ÿíßþ-­?€™­Ü17n2ž‘‚O´çÿe’ûŒ«êß1Z“[¼cnÙ)ž¿.¹ä’K.ë]îÿÞÒú˜ÙâsÕ~[¨õ·ð‘K.¹ärÖË}óõ-­?€¹Ñ1Wú/⯗jýË©óüÀÒ‚o‰þ¦EÇܬ=ºóŒ<–SéÓØ°¬7oÞÿÞýL‹Ž¹ ¹=RŠ=#¥>í×Òý3Ö\rÉ%—y—¿`¿üéOÙý¥ùè¿M¡õ0?:æR.Û#%áùÝíÏ$|kþÓ¦ôm¹s*”ú;¶ÿgû»Mô0›Å;f×°=*õŒÜyº þ÷¥o?œI¹È_žóß1ý;Õû9÷­ ­?€UŒØ1Ú)Õ{Fnþ÷ÝÿË´|H˜ÛW?‰Ýzg±‡Ka¶Æn®ºãȱ‚R·ƒÇbÛûÁ~6¿ZË®c·=R2øŒlô2øv§ èõ–# «úw;{9´þ–3\Çúï÷"ˆþP–þþÝÚm"ÑÀÌbóo~ó›~ƒÒ«W¯äöH)øé Gë¥m­?gø°ŠXÇLôOòüüüOÿôOr{¤üô­?·oý9À%Ä:fýÿë¿þ«ãØFñ/ÿò/Ký]óú;Z(ÖÀrb3Ñ_oý+ןÖŠ£õ°Mëÿúõë~Ôî~t¤­?ŒˆÖÀr4­Çèÿüüüöí[Íœí¹ÖFDë`9úÖ¿ýÁ?>R'EÿfƒÜÖFDë`9úÖŸè¿‹þ´þ0 ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°œ;­ÿÓÓÓËËËy™±éš[÷îDÿÇZö·*רG룣õ°œ;­¿×‡Tœ˜çfôßA¿¿‘16Z­?€åÜlýÝUôßÚ÷ýÝ_v FÿÔب΃9Ïy­?ŒˆÖÀrn¶þ>.Ÿô>Üïo:\q"u°•¯ýc£:&8çyl´þ0"Z˹¬¿ýÏ3¯8Ñ_9ñ<6Z­?€åÜoýÝUÙ¿Í?bôß/ÖfBë`9EÎð‹þ—üØþ±ÓúÀèhý,§Hë»n'úßêy´þ0:ZË)u^ế²½-Ð,úïo ž†È…Î;$Œ?66Z­?€åðm¾yhý`t´þ–s§õ¯mÄèO룠õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°}ëÿüüÜe„IÑ¿ñ iý`\´þ–£lý{å~—ýÛ’ÖÆEë`9šÖ2Z­?€åhZÈhý`D´þ–Cë­?ŒˆÖÀrhýï£õ€ÑúX­ÿ}´þ0"ZË¡õ¿ÖFDë`9í[ÿ§§§óÄ———²«(»@­?ŒˆÖÀr:¶þõzÇèO룠õ°œŽÇúŸúö†À6ÝϳÍégØO9ßë¼Úhý`D´þ–c§õ?¤ùCÖ¿œx˜Ö £õ°S­ÿù¦`²¿œcý—hý,ÇNëï>þ°>úï—Ð=úÓúÀ(hý,ÇNë¯/õc3Ä–\­?ŒˆÖÀrì´þIÇó8ŽõÜCë`9vZ÷ñÉyçöÙÏ ŸáÇ}¼oЭ?ŒˆÖÀrý6߯½¾ŒÖFDë`9[ÿT±ãþ»£õ€ÑúXÎX­û¯ëÒ õ€ÑúXÎ@­¿Y´þ0"ZË«õ·‰ÖFDë`9´þ÷ÑúÀˆhý,‡Öÿ>ZQBëÿøÓÜoœpM™85­¿¶8xûö­¿Bë#Jhý·?ÍÅù}ޝ¿þºÆÂXðþýûÇe½ÍüñgD_6kZ¢ÿÙ»wï¶·Dhý`Di­ÿ¶—àç.uéÛ-_>—\riárÛÃ/¾dÿ§#5ú;Eë¿•ÜxýúµÛ Eë#JnýÿkKÙg‚²K`Á~¿Æfž”8õ­?Ñ#DÿÃo’ÖÌÊlý‹ÃGr?0±z›yjâ¤õÏ@ëÈoý·V†K.¹ä²ËåþoÙ·´þ•ÑúÀnµþþ÷sÉ%—k^ú¿By‰“Ö?­?Lànëÿø_ÛcØVw'qÒúg õ€ Ümýÿk+ñbÞ¼ys'qÒúg õ€ hýKñÓ¯¥ûù¹ä’Ëý¥ûé kÛæþ/Oð/—ìNëÿôôôòò"_—çÔß½Z˜@™Öÿw·OÙñ-gøL*¸m~[è¾û¿ëìÿßlý÷5iÒÅÃ\ö¥}öóìÅæ×;/$ö0•«kÿ»ÕüÞ.¬r`ú[3QÒªrÙú_þ*¶å¸‰ZÿÑúÀÊ·þ©#xÜå~ë¯Icwâév—sÊÔGØýBÎÓóÈ¿ åðô ¬ñ»U.Sž¢_ˆæ^Â#©fÕÃÑ´þÂç¥Ñú‹Ö&På ?Iqç«M^ö~ògÒåáq%­Qžóy-IË-¶ÁïV9ÈØ˜ÏOJÙ‡“wS©§Ø‚Ëmóü Œ-ÇÑúŒÖ&0ê~Ü)pì3D,‹¯ëÓÛå!ÕÈ…Êñh†\òv½öïV^ŽüKÓü2/ŸaØÊå%Œ‹3üý7´þ0QÏ븉¶eœ×?áANÖ&0pëÅ‘û õ'úohý`´þ¹¿™Å[ÿwïÞ%<ÈÐúÀÐhýD5hýõwoßú“ûÏhý3<þÑö€þþïÿ¾÷  õ ©Úú{ʀƭ?d´þz[ô?ç†ÇM‰þ²ù¸ü‰°1 ›ðˆhýDÕný³—Ó õ‡ŒÖ_o çT!Ü ™¥6Ò2­¿¿óÖÓä]>2Áû÷ïï,K.¹¬qYjÛtö"î/‡Ö¿;Z½}b8¤á&m¬¶…¦µþ_ýôÍ»9üÿ¿ö«_Ç{ÓöO€)·ÍR‹¢õïŽÖ_O&¦ÉÀ(Ü<ÓZÿ/¾øbgÿ¿¶Ý`àÿ—ëýû÷Ûã­ÿÓÓÓvýåå%ãî÷ª‡Ö_/é‚iâ`ßšÛfαþžŸÛ}èÉ ™W¯^m¹¶‰oÞ¼1Ûú‚{FŽ·ý­¿(öÁAá3…s$ À²e7ÌäcýýõsOmëDצõ?œÎÛýdñcUck ÎYv »-ë|±)—ߪöÐOÓšhý õ×»&HÿÝ¥f}{mdo8ëDÿF­,fUþÊžÇps03åU?Jh- £Ò øò$‰°ŒÖßZ½›a‚ôß^Ù¸Ãn@%w6™u¢¿kÖúë3YÑ¿Ô`Æþe5ŒþN³Ö߯goß¾u´þ)î‡ Òmâ~ »¥ÜÜXÖ‰þ[ÿ؉ð’\²-ÿ0†ûG¼h;=Ÿ<³<ýæÈ/¿{èÎØä™SÛK‘_E‡ñ_¾äJ½PJ³ÖŸèôîÝ»ýï‡Ö_£H˜ˆôsš8Ò^߬/cO OpsHúJìu¢¿ëÛú¶qgµA6¸Šâü\®H9³þúý‘»Ð/¼ÔØ‚3¤ŽPý«þæÑKãÖß7Üð^¿~í>þýÐúk ÷“Íâ,Çýv4Jí¯ýÛµþ‡)±´}HuÙY6¶Fa5¢lEî”#/G%O.${ü‡á)Ÿ”¤±å 5ö6‘òU$ßK9½4ný‰þ{±èïhýEeÃÿ$1ëËØ8+¸Q¬ýÍÖ¯Òá+òªF?à'¸ÃòkGÿýõD3¶Ã¢?’ÐúwD럧x˜ ýËæ‹û1ì¸Ò›Ã:Ñßܱþ¥–ñè¿MqWñúòWw9±Þ9¼?Ðæ‰Ãê²Ó<Ñ8´þÑúç©&HÿëÄý˜5wŠoëDg°õ_'úkfVFÿsÎvöØäéDÜDëß­žJabñôOÖ—­°'PcX'ú[lýÝDóM  ±Qé¯ßŒþîã ÿþxc Î:H!Žk~™I¿y¢¿)´þÑúç©&V;íq?Ï”»•>ò¾NôwÖZ÷!~y7ƒìÁy/‘o.²×!dÇýö·ž§»ø/$8ýÎȃSŽ-îƒc;/$ixšè/¬+¸›-ÑßZÿŽhýóÔ± 4AL!ë×0Áž@½×ü:Ñ¿QëK–“¥å±aÝ[ÿJÂÛ­žab¦ôOÜoiÄÝ€ª¯öu¢¿kÓúã’åÿ–džutoý‰þ´þ©Ú„‰¡Ó?qß‚!vj¿Î׉þ´þVXþ÷oylXGßÖ?xÞyÊKè«å„ƒý‚ÇÑD럧Y˜(ý“õí3¸'Ðà¾Nôw Zÿàa÷^¥ÿvÂë­ô¼^ãÿË÷zýÆRÉãÜØ0 2Õúk>2®ÿ ¹ýW,­ž–aÂrú'îËÂn@›×ö:ÑŸÖÀÌë/Ÿ¼ër†¡£¿£õ5ÖÒ?‰&½öš½ª×‰þŽcý ÁTëïB'†R¾- ÜË,Zÿ<íÃDð‡÷Ï{˜Ü?ŸÆé¿ñ‹yèOë` ¦Z}©›!¸X³hýóô ê¢ÿ|ZFÿö¯áu¢¿£õ0S­Òñ<Žcýãhý[®ºY‚!÷ϪMúïòê]'úÓúƒ…Öß‰ß <"H>ÃÏy±6Ñúçé&z¥rÿÜj§ÿ^¯Ûu¢¿£õ0„î­¶!z}­žîa¢KŠ"úÏ­jôïønU÷­µb­ÿóós‡áXRÇÖ?Iìè AÑúç±&g)rÿ *¥ÿ¾G©YØZk+Óú“û´4Pë?Ê×uiÐúç1&bgJ)>rÿ:Чÿó ²ñ™©Œl­Uký ™W¯^ ÑúO†Ö?©0ŒVÇ@î_MÁô_ûÅ™7†Žƒ©¤Ø±þÐÆóóó@­ÿLhýóX ¾F­äóÏ?¯·pôÝwßÕ[x—­ÃÔÖZgø0’îgøY­ka¢Þ±ÔTþkº_ü[øŠË•Nýgø0„qÏð3Zÿ<ÖÂDl¥7Cî_Ùô_éYv0½ÆS­?€‘ÐúwDëŸÇZ˜Çãr² ú¯,/ú˯7ƒ[ÇLÑßÑúøÌ×Ñö†Ö¿#Zÿ<ÖÂÄåJ3FEîGjú¯ñ:¼ÏÚÖZ­?€k}£ÿóóóÁiý;¢õÏc-LhVšôQ`>Ú /é#¿š¡©­c²èïhýö™¯±C§õïˆÖ?µ0¡ŒþúQùÃÓÿÅ_„¥XÛZk õpÍfô§õoŒÖ?µ0Q6u‘û±§LÿDÿŽhý\³ý­[´þy¬…‰‚©‹Ü3Mú'úwDëàšÍèOëß­ka‚誈þÆÕmýýÿ†¹‘ °›ÑßÑú·EëŸÇZ˜(•ºÈýˆ¹LÿDÿŽê¶þÓGÿwïÞñvV`3úÓú7FëŸÇZ˜(’ºÈýÉéŸèßQ‹ÖÖÿÃИÍèïê·þÝûòip´þ©¬… ¢? ú›Õ¢õ'ú×ðôôtžøòòÒ~$µmtÊG7ŠØ«ýñ윟—mbðVazPÇÖŸÜDëŸÊZ˜¸ŸºÈýÐÒ?Ñ¿#Zÿ|½¢0ôïM‘mFÿ¼Qž»ŒGÔë·a3ú»š­ÿ¦ï×™mƒ12Œ ­¿žµ0q3u‘û¡KÿDÿŽhýóu‰þ±ìx?Sš5GôvØòv†ˆþ1C´þ›Ž™{ÿ5ÆF†±¡õ׳&ˆþh†èo­¾öÑceª<ŠHý=çÏñŸßû­ÿþñ§»Èƒ2Òú·ïðÀ ã0Ö_ÃZ˜¸“ºÈýHLÿDÿŽhýóuŒþBì³Ù‘Ï!ûó±'EùdYø\ÇÍèï‚þúž‘Ö¿{æ62ŒÃtZ ka";u‘û‘çœþ‰þÑúçküŸ¸Hã«_ˆþ_âf–@"ïù&9 ãL Ü—A­ÿÍÔˆ^Ñ?ï—#G´Œ9/?m,ܽHô¿gñèŸ7sÙWõXÇúk¢ÿá¾´þ›¢¿£õY y©‹Ü;éŸèßQŸÖ_þ_ÒG;(úË­|0”ßœS¾ûýè¯gð9ú§~l—è3ú_>k­ÿ?üÃ?hV‘íÿñý9úùå—U‡ñÍ7߇±¡õ׳&2R¹÷íÓ?Ñ¿£n­?Ñ?U‘èY½O6Q˜r9§,/úß?j‹èß½õ7ý?ùä“ü±Ô0’¢¿£õY DtAô7¢ëï¯>íGô?Ó4å‡:ü²b/XÆ7ôúGÔ1ú¥¾ÔÇþ®ÂÇ|­ÿÜﯔJÿ´þY ©©‹ÜR¶ôOôï¨ëþOô"úß9^èüclºÓÉŽþòaT×[–Í“{Òú{[î÷ФZÿ‚¬…‰¤ÔEîGY>ýý;²ÒúÇnµÌNô—ç”[çàœ ¢¿0ÎËCóõÈ}œéƒÇÞÈ•sL^ô×üZJ­·¬^Ÿ1uCµþûÌ}ˆãz#FZ™µ0¡O]ä~ÔðHÿDÿŽL´þD ¢ÿèïNq_Ø ÐÈ~:òrç.EØŒþ¦ZÿsàÎKÿ©Ñ?¸–ûéŸÖ¿ ka‚辈þ}Ñúç3{^ýa<òå›,Dÿ¤ãò…ƒ|R+ÿ¤1ýo¥õïý«Þë_äó¾´þY ÊÔõù矷ôÝwßý{¡õÏgüÛ|ùèíÍU .?Ú›´´Ô1ýo¢õÃÔÇ|­¿ÈZ˜Ð¬”¾µ¿çëÀÚÖ1Yôw´þ:FI~—7¯P¯118`yžŒw‚kiý/Gűþ2Zÿà0LEZ™µ0Aô‡Dÿ^hýóu CÊ+Üš:1éSªW¿?KóšsÅ$í*hä½Câ²~«E|“Íèoªõwý>æëzGGë/²&.WJîGrú·¶uLýßæ›¡W’?äûЪp¯XVÎÖ%ú ã .§oôF›:¢¿ÙÖÿ&Ù ~ÄèOë/³&ä•’ûÑ’þ­m“E¾Í7GÇ0ät5ÿå6IŸˆÍÐ+úŸï›GXH³èjÒ}ïø&›ÑßZëŸçð^ÁˆÑßÑú‹¬… ¢?ì ú·×­õ÷WJå°.úF %ÿj~~î5€)[ÿàÇFŒþ´þ2kaBX)¹íÅÒ¿µ­c²èߺõŸÑëx¼Ú;æ~7cëÌèƒFGë/²&b+%÷£—`ú7µuôO }Zÿ9ýöfjýÝ)©ýiýeÖÂÑÖý[¢õÏGôÚ›¦õwðãhýEÖÂDp¥ä~ôuNÿv¶ŽŽã©Ö?ÑhošÖÿ|&PÿE¼#FZ™µ0q^)¹Ò¿‘­£ïxj õÏGôÚ›£õ¾`ÄèïhýEÖÂÑ6ýÛ õÏGôÚ³Ðúûz>û!Èßü5bô§õ—Y ‡•’ûaÇ>ý[Ø:”7…Ö?ÑhÏBë¿}ýVÆø/¿ñwÄèïhýEÖÂÄ~¥ä~X³¥ÿî[‡þ¦±Ðúç#úíiý·[õ;ç“ùg1úÓúˬ… ¢?,#ú×FëŸè´g§õ?ö‚gò‰Í{þQy÷" Ô_O^—èoü¼þµõ­¿^ƒ0AîÏf'÷{¤ÿlEÒÿ:ÑßÑúobÿMý•—Ó‰…ÙÎež‹Ÿ?;µð›†©èž«fc™x»×6³&©»”×Xê]èUw^þe+|¹4×D÷Öÿrb3v¢?­¿Œèo“µÐ¿Ç@¢¿­-«•÷ÙìD ¡cëï²¾úªž¾C¢õ×#úd9÷{¤ÿTD%Zÿbbe0dD$éÕúã€Ö_¯A˜øÃþðgög÷—³û¹ß#ýëýÏÿüϧŸ~z9ëDZÿ2bE@@ôG’^­?hýõÚDÿÇ%éÿÒ(¡€KÜÿ¸$ú+Ñú£3¢?΄?í[ÿׯ_ß|8wlƒ12Œ ­¿^›0Aú¿4bî÷Hÿ‚‚¹ß­ýiýÑ ÑgÊèߦõÛÅÛ·oM cCë¯×2ú;Òȸ¡€3ŸûÑ?EõֿŃÀà|ôï= Øb­õo¿_êé!úwÆa:­¿FãèïHÿ›#÷{¤ÿ½-÷;¢Šº­ßw¨ ÍTëß=sÆa:­¿FûèïHÿÌ”û=Ò¿·ÏýŽèŸ¢nëeÑú÷Æa:­¿F³0Añ¿7_èßc FåïVŠþµZ(‹Ö¿ï0Óiý5ºD·vúŸ;÷{+§ÿJ•¿[)ú;ZCèÞúùå—åMÀ7ß|ã¯ÈÑ¿×06´þz½¢¿[2ý¯ú÷Ü8ä~GôODë`$Ý[ÿ¤ÌýÉ'Ÿèg~øñÇõÑ?uáE†±¡õ×ëýÝbéµÜï-•þϹßýÑúÉX­íèÿ˜?iù~±´þµ ˦ÿ5CÿÞ ;µs¿[)úÓúÃ(­¿Ð>ú_ôm¡RôOÚIȈþŽÖ_Ô=ú»ÙÓ?¹ß›;ýs¿#ú§«ØúsRÙÌž×_ý·¨­‰þ‡„âÑ¿_q9³£õ¯€è_¹oâôOô/¥bë￳ÍÃÀ ü—øö̾Ýy”ÖßS¶þû9ËFÿÃGÊ‘Ðú—e!ú»Ó?¡?f¾€XîwDÿtu[¾¥—x‘LlŸSß·õß'r9úç,ýƒŸ4Ðì-Ðú—Õ8L,’þÉý²™Ò³ÜïVŠþ[Rd¼HfuÈîúèï_ƒ¶þ‡8.DÿØœ¥¢¿ð cÍH´þÙ‰þnŠôOè×›`@ÈýŽèŸ¥Qëÿø÷Ðæñ` ?üðƒOxþErÎ×ùû§|RüùϾŸíW¿úÕ¿þ뿦8õ?Îdë¿×ý€DZþ˜ŠþnðôOîO5tú—s¿#úgiÔúýqFôŸ˜&úo)?8qÄÖÿœÅƒÑ?Ù‡ŽþŽÖ_d-ú»1Ó?¡ÿŽw.s¿#úgi×ú¿¼¼øéOOO€¶Ù¶9cw|LϘ"¯:8sÒB Œþû_µðÔ'­h»{ê³=ÖØl]6µ‰þÎRë/zy67xô§õ—µó¥rÿ}c¥ÿ.¹ß­ý[´þš}˜gÿc^Ð'ú[vŽþ‡Ä¼ýxžît9>¸÷Ø ”§Fÿùv.£¿ø‚ÓmýÏ9àÇÑú‹ˆþ7‘ûK(ýýëiÚúWþþGa —ˆþeGÿà” ì;ÞDôoý™Öÿ²Ëæ9Ì9bô§õ—ÙŒþn„ôOè¯Áþ€&÷;¢®n­ÿ¾ˆÝnJŠþÁbw9wÆû»†ʺ<Ö_ˆþ±‰úybϸ‹t¤yEe,¼ýñH ÈÑËý±›Æjý…¾zå‰8þŽÖ_d6ú;ÛéŸÜ_åô¯ÌýŽèŸ«Oë¿O<‡ë5¢¿°:wÚçAA ¢¿‹ä£m\^?$þ› ™C›èïÌ´þ1Ýøió•^´þ².abèôOèoÃà@ßÜïVŠþ­[ÿXįý“Vwç¨!èÅ¢¬D?Ü=).ŸwbÅÖ"ŒäN»ú-,ý¹?xë@­öÉõƒþŽÖ_d<ú;céŸÜß’©ô¯ÏýŽèC·Ö¿HôwñÄguDÿ6Jµþ±Æy¢P´Êûó¢4óÇöUˆþ®Nôw½[ÿ¼ïÓ ýiýeö£¿³‘þ ý½XØHÊýŽèÃØ­¿#ú¬Í?ÊeÆZüËù÷SÜÕ~Ñÿñt»Ÿ’}ìŽÛ £´þå±ø#FGë/"úkûûêžþ‰þÍÐúý»é{†Ÿ›éüò¢¿‹D!÷»ÄèﺶþyÉ>h¿¨‚Ñ?øžƒfoÖ¿¬^ab ôOî· cú7’ûÝJÑ¿CëïJ|Ì7vÓy9I«‹Í²úž×_Óú+¯ëß"Ð,dš¯ô åXÿË#yô{‡?bôw´þ¢Q¢¿ë‘þ ýÖ´ßHÍýŽèO·óúÒÒùhiw: bvô-VÞÓõý6_å±ûû½ÄËêå±þ±èRög† ðsÉ~ë_$ú³ûˆÑŸÖ_6PôwmÓ?¹ß¦–é?#÷;¢ÿ=&¾ÍW“­Éßó¹<Öß”ùŠùªò¢¿=¸qZÿ˯ñÄ‚{©è/ìœ\î0Ðú—5VôwMÒ?¡ß¾;y¹ßýï±u^Ñ>Dÿ‰ÉÑ_Èô£ë'úË‘½Hô¿ó¦­qÄÍôOîEÕôo0÷»•¢£ÖßO?Ø gúØQÑbm¢ÿˆ­ÿåQ:÷£¿òŒ¢òiý 1ú»:éŸÐ?¢;Ù¹ßýokÔúOuèâeŠþHBë¾IyF ›Ñ?é›bã§õ/‹èï‘ûÇU<ýý;jÔú“êpFôŸ­ÿá&ý™@ïDÿÔo;ÓÑúW0hôwEÓ?¹tÓÿÜïˆþ·µkýƒ§F‰‰nåÆ#-,v–Fè]FÿÃ917±_µpHXÞ³ÃA>Ùhý·›ROÿŸý3r¿ÜK¡õ/¨o˜èžþ ý3¹¿`9÷»Þ[kíZýw0ù+š¯pÒ,³Fz žÊ©äè/Ÿƒß]¥yýó"ÌÉ“›Ößß”ñµ_yÑ?;÷oû*´þ ýݽôOîŸÏô3÷;¢ M[}ŠR~{+ÑhBôßN¢Ÿým¾E¢?²-ÒúËò¾ë75úßý{~´þeý]Vú'ôÏ-cà~îwDÿºµþ‡oMº vÁ)ÛSÜ霡û;©h0ÿÉË´y0Ò(bÑÿœø3vübwÙ®k^!ö<3k‘Ö_—û]ѯôÊCë_ÜÑß%¦rÿ ’Ò‘Üïˆþ%ôiý/”Ïhýcˌͣ†f™dÁ<Áèü݉þy¯žñ<Ó·þõ$EÿJc õ/«{˜hYüúW£Ü¢òw¶Öú´þçwŠDÿà2õ¡ír¥Á²ÎÑ_ó ?ßTäÙ<|Θ'ZoúÖ¿}ôï2Œ ­¿^÷0Ѭø'÷¯é2ýRù;[kÝZÿÑÿp«&¦Ë§Ž!úWÕ>úæÑGÿýÝyº5&ný›‘£¯a¦Óúkt¥¢¿Ó?¹eBú/•ûÑ¿i[Í<±£;b+%ú—ŒþçÙ‚Ÿq·[ÿàtÍ+Ó‘þ&ný›(ú;ZQ÷0Q0ú»Pú'ôÃ;ïÌýŽè_ÈT­ÿÍ`Gôo,é¼þÊ/ÌP$úkV wýý3Dë¿(úÓúË,„‰zéŸÜ½}ú.÷;mÝZ×éc¾±Ö?x>æ[Uvô×TïÙóeg¯!ú ¹ßÑúï ý­¿ÈB˜(ýÝOéŸÐ˜Ç@ÙÜïˆþåt;¯ÿþÈéìÖß…òܶØó<Âñß/W§tt‘Cƒ‚ÙŠ›o𾇉Á…Ä^!ëŸ-ýþóŸËwüÕ¯~åhý2Pô§õ—YÅ£ÿßýÝß•] &³* ¢)&¾ÍW“žIØó¹ŒþW›èß²õ—߬¨çý»cCë¯g!LþŽô¸â¹ßýË1z^ÿ3¢ÿ|ˆþ›¬õï¸ÝÇÑßÂ06´þzFÂÅ?š´òwf¶Öªš¶þ~º|pÎZÌŠè?±™ZÑúë ÿhcÜÊß™ÙZ«j×ú·y<Ñb3µþ{±w)óÎúZéÍÌà' „¯ÈÈCë¯g$LýÑÑ߸v­“‡ƒ‘ý'6këó3K÷ï’´XáÊ}´þzFÂÑmýkz¬¿Ÿ®<¼ÇEZ«ÃÌÙ'{)8Ò’]â‡&Vä ?òÙúùˆH/·þÁÏ,or¡I%Ý%Ïöâß(ïäm&´þzvÂéµ û¥­µgøÙȧV=úsJÐ9úÇN½/ß´Ÿ‡èßÑô­¿²YWN,ûÇ!{Ihýõì„ ¢?j#úÛ×í¼þADÿ¥ÑÿÜåïyÐ š™¾õ^u—/¿ù¢?­¿ÌN˜¨ýéÔÈýŽè_Z·Ö?øfô2ú_¾·|W½Ôü.þ™¿ý­‡åÇXôW œ‚OJìЋşšû¦oý]ü€áÚvýü ßÏÙ2úg¿Úiýõì„ ¢?ª"úÁîyý…wöƒËéuýrT„˽`ô¿úßùµþŽÖ_d*LPü£’ *glk­¤[ë/DMÊ—ïXpúaDÿ‚GÿÃÝ‹ÿ€½ZÿóÛM‡›\ä(Á-p_Þ%2úŸLBë¯g*LýQ ÑæZÿØ¿" ­¿<˜¤Q‘/]$úŸg‹“—E¾Ky*‰þeMßú'ÝÔ˜ò]Saº­¿žµ0AúGqsä~gok­ÁVëŸúoÕHôWþHô?H:¯ÿe”¹ýÏ—…âºVhýõ75¦Œþ7Lë¯g-LýQÑ ÝZwõA؃Ôè[~½ëšµý÷²£ÿÓé£Õ‡ùƒKp‘Ofó¼Ô0qëïâ'õ2òâ9¿ÂÝil÷_ê´þzÖÂÄc¥Ÿ}öYñÅýWV#úÿý÷]¶S[k ÝÎë>ìu?q#g2ùÀ¡óò«¸f~IöòC bºBßæœ?8Ex*y^Š›µõdžÖ_ÏZ˜¨ýéU•*¢%&¾ÍW“·Èdó¹Œþ׬­?6´þzÖ„_)gùD)•ÎéÙqëH½i,vÏë@ôŸÑb´þÓ£õ׳&êEGú_O½£ü‰þ•4mýýôó!r¦?ÜÓ úOŒÖz´þzÖÂĶRŠÜWïk¼ˆþ•´kýÛ< „è?1ZÿéÑúëY DDôN»Ö¿ÉÃÁHˆþ›©õ÷¥—m0F†±¡õ׳&ö+%ýãŽz¹ßØ:ô7¥é±þ~ºüeXÛõÃqAš{qDÐX‚Ñ?vr¤ý/ã•ÐÝL­ÇÌýø=l»ÄF†±¡õ׳&+-žþ‰þë(ý÷'ò·°u(o‹‰3üxò™:cßÇä®N_ ³‚ßæ«üÎ5—rŠO´7_ëßþ( ÿHÑ¿û0Óiý5¬…‰ÚÑß­—þ¿ÒÇå¹P¯jåïllÊ›ÆÒí¼þgyÑ¿ø÷Ô ™Ëè¿Iz¢y X0_ëß=sÆa:­¿†µ0q^)Åÿ>÷{sDC¥ª•¿3³uôO ÝZù+±œ"úkö%«Øî%Ÿ]4鎇٠w'ú»Ó+Ä_Ñ|#[ökz·þ_~ù¥fÙ¶ÿ¦rôï5Œ ­¿žµ0Aô/‹è_ Ñ¿ Cçõ/ýcÁN¸®ŸY¾ J±èþð†üÈx®c×/Ÿw(MÜú?2÷'Ÿ|¢YK†üQý» cCë¯g-LWJúϳÏýÞéðRíÜï,mÇSCŸÖ_åï·þÁ™c‹+N¿3xÁèïB‰ÿ2ú+?!pó5½¹[ÿGæ~„cÍŠ’øÅ&EÿöÃØÐúëY DÿRιߛ# ʈþãêÖú7ˆþÁÓÂhbßa9±ô™tÚœeÌW¾5é©$úW2}ëOô§õ׳&b+%ý'‰å~oŽŒÓ ÷;c[G¯ñÔ0më¯é5±O^pùÐký/ŸJ¢%´þJEÿý@ã¤õ/ÎZ˜ úAô/ˆèß’‰Ö;Â;)ú§?Ø#¶.Òá}w¢ÿåË)x/ù¾Dÿ‚hý[4?,¤Hô? u¨´þÅY ÂJ˦ÿ‰£¿œû½9bbPÙèÌýÎÞÖ1YôïÐú»Ûó=,'¶ØóuÍ?ò…Ù Wê¼þÊçÝÝ~ @Ö?è˧‰þŽÖ_d-L4‹þnÒô¯ÉýÞIñ Måïìm“E×þ¼þûã°î0ÑéŽíq§|¶ŸÜÁ®ǦY~l8+øm¾‡çBÿT&½ Gë ‡þmžA£?­¿ÌZ˜WJñ/;çþý«ôüãáÖ9Ââ^›ÊßÙÛ:&‹þ&¾ÍWÀS FÌÖ£ ýÛœƒFGë/²&.WJúì£ìõ¹ß˜#,nšå~goë˜,ú; ßæ+ úO‰è?1Z—ú·ùý˜/­¿ÌZ˜ úgÛr¿æ•¹íÌ‘=¢ãñÔдõ÷Ó“B|Þ½0¢ÿÄoýSCÿv¯Ž'÷ôc~,Ö¿8kaB³Ò‚éšèÿø½å½ ûsDÆ–¹ßÙÛ:&‹þ®Aëßæñ` Dÿ‰-Ûúß9Þ¦FôWγ-­qÖÂDãèï&Jÿ‹#úÏý[´þMFBôŸØ‚­°éߪtͨ ð³M—ÜQ¡õ/ÎZ˜Ð¬ô1ÏgŸ}VjDÿ9Œþßÿ½æEhjë˜,ú;Z´'DÿËOwè¿êÁſַ’Ë/H]ÚaÊ¿-Õú_ž²ó<1¨àÇ|Ñ?8€sîw´þuX í£¿#ý¯låOôïˆÖÝÄ¢¿æ©Ñ_øZ€âŠGÿ–ƒ/eÖÿò3µ-£ÿ9è+‡·Ÿ‡Ö¿8kaBýópÄ?6£ÿ§Ÿ~ª–Z©’µ­µZt#DÿóW¼܉þÂÝ‹(»ðƃ/eÖ_¨Õ÷34ˆþÁ”¯yGâ0­qÖÂD—èïHÿ#+~”?Ñ¿#Zt“ý/¿·+¶Ã §gÍ7¸í‡|S"8†Ãýï ^øªã–lýûFÿXÄ÷óÇpÞUØf¦õ/ËZ˜HJ]ÿp¥+—ø"lÉÚÖZ­?º‰}›¯ðõºçt»¾Ìñ—‹ Fÿ¤1죯Á÷z‹`ÁÖßõ>àçpvÎóœî@ Zÿ⬅ ¢?Rý{§Zt“ýƒ XHÆû‰û…ùåŦŽA?CÙÁÇÜÒ:­¿³ñ1_å›îþAl´—ÃØÐúëY ©©‹ô¿¸â¹ßý»¢õG7çè/Ür3=ËY¹Ø^Ñ?uðÂÒšY§õßt<¹çeî?O˜ŸÖ¿8ka‚è$DÿŽã©ÖÝ£ÿy¶âéYsw³Ñ_÷¢¿‘Ö¯ýWz]q›ðhý˲&2RéY5r¿#úwEënzµþÙ‹(ú/rÀ³Ôúï)Cöù^w¢Rå/ÏLë_–µ0‘—ºJ¥¢ÿXJEÿÃw÷ý;¢õG7‡èÿÈÁœš÷Ûóö?&-j».$øØ/£¥ÁÇ jfÙÖ/uà~ë¯t¹ßBë_–µ0Aô‡Ñ¿ïxj õG7IÑßí>ðú’~rÏÔs˜¦¿ìNë)´ìç1(ëù²ƒ?ìBÄö(j[¼õßÓï´‰þ7÷@6´þzÖÂDvê"ý¯¦RîwDÿ®hýÑMì¼þËê{t~Y´þš€ÚÑ¿ÈqGZ=ka‚è%¢÷ñÔ@ënˆþš~EëtyÐRßæ{4ZZÿ⬅‰;©‹ô¿Žz¹ßý»¢õG7D?Üht´þ‚ØsoFÿRhý‹³&²S×üÇüÕ_ýU‘1ýí+ýÿ÷ÿ÷oþæo‰þÑú£¢ÿÄhý3ŒýiýeÖÂD^êzä~¥Hú'úÛW$ú?r¿¿rHÿDÿŽhýÑ Ñb´þÆþŽÖ_d-LXˆþŽôo[ÁÊß_!úÛAën„è/œÌ>ÕÏΦÞwºžŒuåÝÑ&Zÿ ãFZ™µ0‘‘º¶ÜïQüO¯låïíÓ?Ñ¿#Zt‹þÁm<úß<¥æLçöñ¦oý5kÉýÛcCë¯g-L‰þŽôoUñÊß#úAën„è/ŸD?I›T}óm ¢ÿfˆÖ_³ŠlúèßeZ=ka"5ur¿Gñ?±•¿·¥¢G´þè&;ú_~·—û¸€ß¾ Ø}ü}·çskï+,<8<ù¦ý£;|]×åºbƒ”gæÛ|Ïî´þÍÈÑ¿×0Óiý5¬…‰¤ÔÌýŽè?µzÑß}HÿDÿŽhýÑM0úÒöùzì\øI×…ãs×åî ÓƒÑ߉û$8òóÚ˜¸õof èOë/³&ŠDGúŸTÕÜïˆþÐú£›ìè|7 iºœ†Ï÷Í>è_9Í›Áy„Gí:õýÞ|­¿•¶wˆþ݇±¡õ׳&ô©KÈýÞýôOô·æ~ôr¿÷HÿDÿŽhýÑÍ9ú GÌk"þaùIÑ?xìMFôß/M?€ó—$8§ 4ñ?®Uëß+p»£¿…alhýõ¬… SÑß‘þ-©]ù{Dÿ¾hýÑM0úŸgÓGÿ`ÆU&o:ü&;ú_øò“ —ow]p®GúŸ©õG­¿žµ0¡L]¯^½Ò,â& *ï‡~ ú÷BënŠ·þw¢¿¼ÌËãs4#W à‘K±±50Së Z=ka‚袿µ­µZtsˆþ !d÷âóµþyóÕn86>æëÑú‚Ö_ÏZ˜Ð¬ôòPŸ=Òÿšå~ïðý¾gÖ¶ŽÉ¢¿£õG{yÑß}|{pºÓÜó°–ý2• ?58ÃyÀÊcýƒáþüƒãX­ÿ}´þzÖÂÄåJ“r¿#úÏ¢qôwWéßÚÖ1Yô§õG±óú'éRiãÒ¬­ì³½>S!¬Wª0Q¿AÑúëY Å£¿#ý¯}îwDÿNhýÑM^ô¿<öÌÚú ɸË^¨¼ÒŒ†çEZ™µ0!¯4#÷;¢ÿøºD'¦k[ÇdÑŸÖd·þšcoÐ×Ä­ìà«Ø1iûû&ž?Ç’}")aù‡í“‹“ÑúëY 5¢¿»þ‰þ}ÝŒþy¹ßý{ õG7EøMë´þòù .'ºøÇK4”+Õ|ýÎ?´þ2kaBXivîwÿ#ëUù{±ôomë˜,úÓú£¢ÿĦoýÏ?æEÿìä·ü¤9e´þzÖÂD¥èï(þ‡Õ«ò÷ˆþÑú£!úëóóµi…Ö?¶°`ô§õ—Y ±•ÞÉýþ™úó?ÿóüaý„ôßÞýÊÿ/þâ/—üã³—Lÿ¦¶Ž^ã©ÖÝÄ¢ÒÇ÷£?;5¬Ðúý­¿Žµ0\ivî?LÄNæsžhMl7€è_,ú[‹û_ÌëDGëöòZÿ½ìèXTF¤NZWvô׌38Ow+´þ¥r¿·…rZZÿ«.µöˆþ÷¢¿ñÄÐìU½Nô×¶þü~ ­?î¸ÙúŸ§gð#Üë°ŠóÄÚÑ_3ÎØ<ÝMßú—ÍýžOç#FGë/j&æÈý~7€ô‡ß¢ÇŠûm^ÛëD§lý¿øâ‹ýiýqGê~ FÿË,[Åå½ÊFÿ¤;Ê¡±f­ÿû÷ï·›šµþ5r¿÷èœá‡Ö¿ìЦÉ+@ƒWø:Ñ?íXÏÏíhý‘+õ¼þIó=Ï™ôñÙ=yº¼.åê.[>æ{XÎ>qn7½yó¦Mëï#õ!C'§Ëw/ý«Ø·þ±qÐúÔ&Lû±‚Ú¯óu¢¿Óëï¯s¬?îËø6ßý7š#aÜ.ˆ ·ºS^?¬ôò݆ú\(”dž-_?3¶ðñ̤ŢÿãéÖÜ=éXÿ-ý§Fÿ;­¿Î[­®ÿq»›x?úŸïÑL9 õ/¨A˜ ÷cU_íëDÎðƒ„èÑeDÿ2ð3?Ö è;ÃOÙèïhýEµÃ¹«©÷š_'ú;Îðƒöˆþøñ‡ôþbn5~†ŸC^?/¿Mô8<èH3q¿@Zÿ‚ê…‰Ø)§É(@L,ý»{'ý\'úÓú£¢ÿÄÚDÿŽ­¿¿.—ë-£ÿ~‡+±ëÁ+.+ú;ZQ¥0»ï4ÕØÖ‰þŽÖíý'&Ì÷þÏ7 ÑúoÎõ¿>úo2>æk'úÓúËj„ r?à*lëDZt@ôŸX›èß½õßÜ<Ö¿œÔè_­qÅùؔÝÖ‰þŽÖíý'vyrÏ-ý§ÛoýË~ÌwCëO럽´ir ªàF±Nô§õGDÿ‰µ‰þÓœág3hôw´þ¢‚a¢ÒGÑ•úÈû:ÑßÑú£=¢ÿÄ4_éõHùþ©?Lt#´þ.ò\^ìèÿýœe£ÿ~áœáÇš"a‚“ù—îï¯ýiýÑÑbm¢¿cýKá¼þ´þI³M“E€Rnn,ëDGëöˆþÓDÿ‡ÿüÏÿIßæ»GëïnD÷ñ¡;.ô>€œû­Qw¹Ƚá¬ý]ÕÖŸH‡˜-úó"™Ò!úëŸeã­¿‹|‰ïMòAöIÑß¾iø­AÙa‚ÜdËÛ|Ö‰þµZÿ6À|,·þþJÙô¿%ò‚ÑsyxÏ­Aya‚ÜÜ”±­ý]Ößÿ£€<–[¯Túßçò£?­¿¬`¾Ÿ&|mÜĦÙú*¶þPœÖß»Ÿþ¡¼lôáç­AIaB8á4ÉhIHùî´­­ý]ÖŠ3Õú{wÒÿ9‹Óú¯Üú¯;€öØ÷hýŒÄZëïå¥ÿ`1ú;Z‘2L¬9€^Ø 7´þFb°õ÷RÓ,‹s†Ÿ5[ÿ¤cdÐM·Nô§õ0›­¿§OÿBþ1ú;ZÑe˜àC½@3òæ¶Nôw´þ†`¶õ/¥Æ?‡±¡õדÄãC½@[yo²M³Ikýý²@[ÿfäèßk‡é´þ9cšØ´òVY¦õ'÷h©cëßÌ@ÑŸÖ_L ÂÑÓ$ À²e7Ì­ÿãßm‘X­—a¦ÓúkOÞûLá4ñ°oÍmónëÿ¸ÞeÜàhý›ã0Ö_C8q¸þœâjXpó¼ÕúûûpÉ%—\ö½¤õo6ŒÃtZ e˜˜&XcYm ÍoýËŽã±Ö¯¿þºøbØQu3¯Ýú÷úDÓ!úwƆÖ_OsÁ4©ÑRé­Ö¿ßî<2A…0ÂGWçoHÕÖ¿ã™ öÑßÂ06´þzþœ!.tÚËS‰hCþ€¯¿2ÇvšÓúo}LÙË-TZ>—\rÙ÷Ò}ØÃÿþ}åWjýD믷åC›)ú'´þÿÙ•†²e‚JËÐ]ÕÍ<5ú»ßMþôôô¸|yyy\y\nòÓý Âü­ç%Ü\»¼^y0z´þ0¢´Ö¿Ë@©Yë/we¦¿ý…ûÞY ­?Œ(¡õ€9iý“¢¿/ãݮ߿9à{z}ô.?6˜Øƒhý`D ­?Ì¡qëÈâ­JÊè/¯÷<1i$´þ0"ZË)ÛúŸoMÊåF¢¿K|çÖFDë`9íõßï!Ìýiý`´þ–ÓøXÿéøq´þ0ZËáXÿûƒ¡õ€ÑúXNß3ü*öŒƒmbŸ4МY(81¸? £õ€ÑúXNÁÖÿæmÿ^ðVÎë‹ õ°œEZÿí8Ÿóá^ò06´þ0"ZË™¬õßúÇõ}²ß&êg‡±¡õ€ÑúXÎL­ì#¼{óÐúÀ”hý,gšÖ_“éóf£õ€)ÑúXέ¿2Ð;uôßÏIëS¢õ°œiZÿöÃØÐúÀˆhý,çNëߌý{ ã0ÖÆBë`9wZÿfŠþ´þ0 ZË¡õÏÆa:­?Œ…ÖÀrhý³‡q˜Nëc¡õ°Zÿìa¦ÓúÀXhý,'£õ~~î2ÔCôï>Œ ­?ŒˆÖÀrR[ÿ^Û}ý- cCë#¢õ°œ¤ÖA´þ0"ZËyÍÇŸ9ÿ÷ÎOZ[ÿ-¯Óú€Y´þ–óš_|ñÅ~ ­ªCë—ýiý 6ZËÙ:foK®D½Cë¿÷æÍ›Œè|†èeí[ÿ໵D³ÙGáXÿ§§§ÇåËËKl9—3è=¥YζÆýüçëáùXÿí¦¼è|†èem­ìÝZ¢?€Ù(Ïð£‰ãÊÈ~Iýýlrô/8°Ø+áÇÛþ'ý ¬­õßÛW6D³QžágkÐå~}?Å_ÙGäóÄs1œ'v¯Ôè¾cl°Ï÷ªq†cý žý±þÛD¢?€™%µþÊèY½Âw0 ÇÖââ;y«“ï®yóúÀˆ8Àå$µþ©Wö’ö4-~lßCØKÉ84(5ús^gø°œÔcýïDÿýúè»×ýè^ò6]3€m"­?ŒˆÖÀròZÿ`ÈÖ·þÁ‰—Ýüá^‡›„{é—,ß%öXhý`D´þ–“q†Ÿ¤ÃfJM<ÏP0ús¬?,ˆÖÀrR[ýuåÁ/?Œ+Üëfô—y9lWù ?´þP­?€å<¯¿’~uµFë#¢õ°œŒÖ?†èOë¡õ°}ëï>> æàr†â”kl00Z­?€å([hý`D´þ–£lý! õ€ÑúX­ÿ}´þ0"ZË¡õ¿ÖFDë`9´þ÷ÑúÀˆhý,‡Öÿ>Z­?€åÐúßGë#¢õ°Zÿûhý`D´þ–Cë­?ŒˆÖÀräÖÿùùùqùöíÛ~4͇~ÖÆBë`9Bëïs¿#úÇ£?­?Œ‚ÖÀrbóïÿûžÃ­? „ÖÀr‚óãzïqŠÖFAë`9çŽÙÿäòÎ¥ÿM–mýyŠ£õ°–CÇ\vá¿¡_ýuñÅTo„e[Þ‡€Jhý,äÜ1—â»êG°®±ð"j°Tëoá} .¹ä’˹/ƒ·‰þf³uÌÛ1åe/·`]iùÆGx¿õ/ûtÛd-ß­%ú˜šïß¿¯´|¬ë-ÿ¾ª#,Òú—bÿ}5~·–è`6 Ù{“ËnýG|—ƒK.¹ä²Áe³wk‰þ€ºxdÍÞ­%úêâ}è‹è¬…è,áÿ«æ>¿ endstream endobj 111 0 obj << /Length 1889 /Filter /FlateDecode >> stream xÚkoÛ6ð{~…1`ˆ ,ªD‘z´Ÿº­2`Ã6dŠu‹¶¹È’§GÓüûÝ‹²”ØÝ :÷â½èxÁ_¼*¢U–$a¡óÕæp¶Û­øí‡«Xèn€ðfFùíÝÕ«÷Ƭâ(,¢"^Ýmç¬îªÕŸÁwûò8Øn}“$I ^¯o´6ÁÝ:×Á8´+ëõ* “q¾þëîÇ«ww“4£ÔÿT )_è•^Y¨b£E¯4×aœhÖK­oLª@“"™4ùÏÍ{Uf‰âSw{׃): 6k•“m€¨mYÑ^<­U´#ã‡}׎»=/úö`™¦ÝúmAÜ—½ÛsÞÌ‚±wÍŽQ?Øö€l?9û‚Á¬ó$h»‡3rÔÌAýã$Œ «¿A§ ‰×ðwÛµ î ¼$ùð-ù³iÇq:ó¸·eðd(R•Âlèž„Í(ü†ý:ä |âà3¬ËBG€j¡íªvîºÖ ³“°¡¢x!n­­öÆlð¶•È{Ü—¤‹žëœx“ jy÷Ñ {Æ,޼c ñ¥A€ UšI@РÓÁ€¡ì燿ATÔ펼 »ƒ»ç†UÙT 쬰+EÀÞÖ5ƒ®•ACšo¿@ÂkŽ\d†ÆÜLÖÌÜ5?¢Œ¦ðP½ç8Þy9¹iÈ…ˆâé‹ /÷~oÜgÞÜേØÖ¿T±õ¸wìÀüa)Q6õ •Æ~,ëú‰©lƒ)Çdpog=—gÁõ××à§4ÒÁmÃö=Þcyêeeä1XŒL4ÑÚ±p3v=¢Q·±xuï­Ç…[ŠšóÎ1ãØkkLðŠ?:IݶuÍæc%x™Ñ¨¢Ô­t^·t¨´Z"z×`l©n‰ U–x2ŸjIp°eÓsBìÝÀ8T錠B…yœ{_“bÂLe']¨ÎLú,˜©44:ý"³"LÒIãäeŸÐ›¯Ïñƒ WaœËœÝArbbBPTº’Áª­ì†Á‹.Cçç eY¸-@n8ÆyA6Ò`<2n^3‘×-wT¢â‘ÒŒ÷ìçòpÄ:‰»í=6¯ào»z¬.™¡822fo+,çDŠÌ/¦{yª} l—£XR´Þn¥ækO¹%è-'t[I¤@²?§¤•½~ߎuÅ›åQB½ìÞxnöyïך¹.V&1aZdÔÿC{aTÀ¿XÑ °ÄÌ'þfÆàÌ´ò\ ¹å½Û> |^¨–Ç0U¨…j—GOý_ŠWJƒŠvµê3 ĈÒ0EñYOÈôvÛ¸·çm’ïºrý±ÆþΕ •p*\&Ì‹Üç 2޲àX6™Ei@Qùò@m·C”`Ñ2®w(©Ôƒ Ž1p¾k…#1Ç0‹ÓÀ þÀZˆ­˜âT×òEiLÒ0ЧúŠ8STT…§"i˜=IJöQæ%Y0Œ.R¯p UB•"ƒ'yD‚i1Ü ñ+¾0ÁÁUUÜìwAùØäM“Zwë ε„­ûKV¨¥,‡kbZ*@ô¶†òÃãi„—þ1Šh Ó 4`c%çh¢D#ÚÁQÕèÑÔPjSs:LîóÆÆá¡xŒú©/«ˆÃDùù ƒÁWä*™tTä÷a¾*‹¼ðâ5çÇVâÁ†NfE@öV¸•¼®Ën'˜eÙs,Ï %/ ®ŸQèœG޽„àúˆã± ÛûF+õôžóljÒ œ4º<¼>Ë]càmÐ3P·ƒ@tsÆpTîž{|\Ùm9Ö²A4R ¸x~ ™a(²i¢2†{$މ#|ÖèÀ^ÓPFlûMçîe:ºØËäe‚Ê^fPjQd†’'•Ê&¡*õ—”ñ…bñ¹Å*yž)ÿÈýät¦ŠP=Òq<Ý9ÂG·¨ekȤ® xƒn#–šˆ@å:,àmÃûS©Ã½¥Ò‹c¤4¾¥²4¸Ý2î ýÙÚÑ]„#/~½ˆ%3ñÎþÄf]LW¡&mø6¦²4Äݯ’rò’näg GŸÑJc Ç?J׈Žj¥Ê푹AXsÀ!jj8/-KùD/þÆÞÁÕõ"!Ej®ò2-BkNEÏLÓæYa—‰¶|ø` –qñ_ŠS… endstream endobj 117 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/mnt/storage/users/claus/projects/geomview/sourceforge/geomview/build-opt/doc/figs/fig2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 118 0 R /BBox [0 0 210 210] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 119 0 R >>/XObject << /R8 120 0 R >>>> /Length 54 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`d`a3ÌÌô €À¢ÆBÁ%Ÿ+ÚE Ì endstream endobj 120 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 435 /Height 435 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 435 >> /Length 4414 >> stream xœíMrÛF†©Šsƒ8 ËEm³ò&Îd3«ØÊX¹/¢‹h”‹`2+p¡Ê̬½Ê&É,ÇWñC ÿh4úk¼K–HŠ@«_>x˜ ¸Qˆ¾»ŸO‘Z¯χ*³çSµÏý¸„¿\5ñÜ+D•Yý…‹jAŸF`€Jß”Ÿ>Ôžù¾ã‘EÆ?姇ֳÓ..uh7ÏÖ .c.BTzuž"‰fÐèÕyöÁ»ËRàëV¯Î3×.?võºˆï¨3{0<³ï¬`¿q)œ3ë:¼ª22<£,ÌŨÃTw0žªÛ?Œó¬]€Ê¡Y™ƒx:tC°ÜYtWÆ.rä©aÙæž:̃ü3ÔWfxvòì8x03&¡ x¦dvýfxÖÌÇ„Y©â|œrÇÜ9çͳzã8Õ3y:Úmd½É{:ˆ6Lé6y+ªFÖ_ëÐ]’ïP–Ø>¼{ÞHßx>x„Í3i6úYj¦ó ÌœnéhffÿðÝ(´ÌÚn™…òL?òd<ôÉÐfV‰ByÄmš›åꢨŸ•%ÉkQ¦­’[fÒ̪ûtDÏZ OƳAß4š2Å¡lÎìšÝnPfü¶$y-Öï–VyŸ ä9ŒŒ4³uߌè™)‘Û3ËVMÍÄÅÌL¹ÁÐL_‹-3ùÕ…Kf²gJfTÏôå>9<Ó7ƒÖÌŒi6¯è 123¿³ý)-©‹~/…Af²gÕ?S=3R3<ì©?8nsqάëŽÞ³ëoÃëð±þ•™Íï2=ŸÄÿVäø±z颸ºÎ¬Ú~"³ä9V¯Am3«Š ž¥ÏQÛo„gésÔŽÏàYúÀ3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~Dðì|‰Dök 0<;®=g« 0Q<[yÎòË,‚g+OZ~™-ïÙ~åYË/³(}¶ê´å—Y ÏÖ·ü2‹´ß¸âÄå—YÏÖœ¹ü2‹v|¶ÚÔå—Y,ÏY(bžYkîòË,šg«M^~™Å<߸Îìå—YDÏVš¾ü2‹{^ùË/³¨ž­2ùeûÿÏâÏ`~™Eöl…)Ì/³øÿO{óË,ºgÈl&«¼$ò$æ—Y|ÏbÏb~™­òº«¸¯ŸË.³5<›øÔ/ÿlœY˳i™½Þ…g8yVÞ qhœáäÙùUqAf¬<;_îĤÐòËŒgeqõ¬Ø…gøxV qW}¦‹–_fL<+‹ËëKq™bZ~™1ñ¬Å+qí³ ¢å—ÏΗÎ3ònH~™ñðìÚfM ºhùeÆÂ³²<+vóÀ&ž¯=öúÒôyã˜_f<«Ú¬>:›ÔhùeÆÀ³²þ÷Nº…Z~™1ð¬n3Ù³b7wœáàYÙôXßg×ÝÌp†ƒgu›õ{äFË/³ä=kÚL©3Aj´ü2Kݳsk–êY±›7ΤïYÙvØ]!÷Ù… Z~™%îYYØ=#˜–_f‰{Ö¶™^g‚Ðhùe–¶g·6SŽÎˆûŽùe–¶gå­¿î„Ög¢ØÍg÷¬k3›gÅnú8“¶geÿ¥Ùg£-¿ÌRö¬k3s¯‘Ðhùe–°geß]¯„Ùgc_’_f {Ö·™Ã³b7uœIÙ3©Í¬uV1F´ü2K׳óeгQ–_fÉzv–zëµ¥ËF¿6$¿ÌRõL¶Ìzt6Ú´ü2KÕ3¹Íœu&Æ4Z~™%êYYŒô¬ØMg’õ¬TzËÝg#DË/³4=SÚ̹×8®ÑòË,MÏ”6óÕ™-¿Ì’ôLm³ÏŠ}œIÓ³Rë,ýµ ú‡ß´ü2Kѳó…äÙ@£å—Y‚ž•ÚuUxCË/³=ÓÚÌ{t6¢ÑòË,=ÏJ½¯,¯¡¼6$¿Ì’óL·lŒgÞFË/³ä<ÓÛlLŸy-¿ÌRóLßgç™Ï´ü2KÍ3ýØÌùZÑÇhùe–˜gf›  í;æ—Ybž™m6ªÎ„§ÑòË,-Ï,m6Ö3g£å—YRž-]õÕåŘ>ÅŽ0Î$晥;ªþý|N£å—YJž™eö²ýübÔªì[Çü2KÉ3£Í¾ì¿þbr£å—YBž•zG½T®>ÜiÖÐòË,!Ïô6ûR»>Üj»±àLJžémöÒü–ÁZ³‰–_fÉx6dÙ¸VÛ[gòììë²þã…¿Ó,¢å—Y*žGX6¦ÕÌÐòË,ÏÔ6³tY·Õ¶Y"ž•#-nµÝ˜p&ÏÊ1]6êXÍ-¿ÌÒðìL°l¨ÕôÐòË, Ï”2óvY»Õ´ÐòË, Ïä6c™¿ÕvÃàLž•¤.>V»÷­Œ=ix&µÙhË|­–{f x&µÙÈ.ë±·šZ~™­ïÙdËÜ®í†À™<+'u™ÿXm70Î$àY¿Ï8Å2×äÎ?Î$àY×fä.ë1[Mj´ü2[Û³®Í&[foµ{ï8³¾gå¬.s«åœÙÊžµmöÕÇì­¶ó €3k{Ö–ÙŒ*“P[­-¿ÌÖõìÌ2³Õî=àÌÊž5¯y9§Ç<Çj÷îpfeÏÊ –é­¶s€3ëzV·Y˜.ë‘ZíÞ9άëÙ9¸ej«åšÙŠž•a»Ìr¬vïgÖôl!Ë”V»w €3kzV†ï²ž¶ÕòÌl5ÏÊå,“Zm—cfË{|‰T²ËlqÏšÐÔy»>õÏËZÖµÚ=<›¼"!çvÆr¹.“x!rÌlyÏú•‰[nÇ}¹¼em«íòË,’gÝ «öÇ/9.³~|ñïì2‹èY¿Ö+éÈ,²øžÙ¬ã˜<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ãÇf<‹ù§Yþì›ñ,Ú’¾®Hýçá×°Ï"fV‹å¶Ïbý)iéÉay3ˆ kØŒg+dÖ®8tnðÌÏ_Úõ»áÙÞÒH„ÌmCž%@˜Ü¶ãÙÞº¢{4›¾0;BÛñÌžÙ½ÉÉÝmE¾AùQ¶íY8ÍÄÍ4x gfáÞN(^f[ö,¨f­hð,¶Ì‚Zv3 žÑYXbe¶]Ïþ ÿy¯àY@¬™çžÄÌì¯%Þˆòž…ÃÈlË*îàY0ŒÌžQΆÀ³`è™-¤™¿Á³PX2[¢ÏúóŽöAùQ6êÙbšyÿ‹ ž‘02[Ȳ}A~”mz¶ fÂc<#¡d¶¤eÍÙ× ‚ü(›ôlYÍÜ¢Á3rf‹œc<#¡d¶øÚ¢Á3Rf Q>ì¡Á3RfËk&¡Á3}fË<ÏHt™E±LØEƒg$¤Ì"Xæ0 ž‘¸eK3«hðŒD—Y$Ë„í¼#<#ÑfO3›hðŒD›YŒc3÷ÙxF¢É,¦fÂ4 ž‘¨3‹jÙe¹Ì¶äYdÍŒÐà‰*³8g@<¦Á3mf±Y&³íxömtË íl<#Qg¶rhðŒÄ5³¿Å·L¨gCà‰ã·¿­ã™,<#q|ûϹ}öþ—)ûôF<£püæ_3={'Š_&< }6™«go‹–}_\ªË?¨ûïyðŒÂÕ³oŠbòÃß5‘—_‰ü´Dfòìú´ŸfÙûKÑ_~¡V»FÏæ¡yvùÌý­ã6‹­f‹ žÑÐ=Ÿ¹,ûžYa?V[4³zæ2í=íÄ–ëXÍ<£axf7ÒdòE?V[6³Ízf1ØdîV«"ƒgs±x¦›6Õ±[«©–Y"ƒg4lž©¦½£÷˜ëXmé̶ì™d}oѺ¼ðl>ÇýÑâYgÚŒ&3[Í¥<£qÍÌæYcÚÌ&SZ­9²lf÷¬2mÒ1™óXÍ<£Qý.ÓŸö»ÂYV]~ªºhfÛñlÿ§}’ßÇŠ žÑ¨7×.ZXÏ~®—¹lfòLüaŸæBöYí™=2xF£ù[vÑBn}›FxF£ý›.VÓ~½itDÏh´™-ÝhÞÈàÛß(³î;¾Ögq2Û–gvÑ‚yæÛðŒH÷77m4¿fðŒF—™U´@{Ž‘Á3ýß¶5ÚÃòÇfÍ ‚ü(›óÌnZF«#ûï3 )3[£Ù8֛ƙmÏ3›hÁ<{ƒ÷ó †’™eœslö@ð¾¹ÁPÞKË"Z€c•Ù¼?u8”Ì,6ÿ­ÝчgÁPßr‰F«ÛÌŸ <#¡½«iÚÜsŽ·c3x -³ðÖ´< ˆþžâæ¾ã¼FëN[Á³`™ß1ϳ¶ÍàY@ôÌl6§Ïn›Fx#3S´9{Ž]dð,Gã–·Ïfmo– ÏBaxf1mzh]› o0ðŒ„%3£Ñ¦Ÿsì7— <#aÉÌm²gJdžhà kf¡MÞ46+s "ȲeÏ Ñ&î9ê‘9Ãg$¬™é¦M<ç¨m›ÕÙäGÙ´gaÍ™#xFž™¾ï8霣¹ilVhDeÛžé¦Mõlä/OÃ3®Ì„êÚ„sŽŽÈl Á3žÌ„dÛ„=ÇŸÆÿ¶<£qô7ÛèGgd–ˆà¡ÌDc9´Ÿ ¯õ†g4Fdvåê9G_dFHðŒÆ¸Ì‚¯uï¾6y™ðláÕî]W¦/ž-½Þ½ýëK„g‹¯xoûrÎáÙòkÞ›_ÍZ<‹°ê½þżÅÁ³ëÞ«Ÿg. žEYù^þ4wað,ÊÊÃfÏ¢¬}ßÿ;{Yð,Òê÷žQY9³:/xFcí̪ÀàÕ3øoWÂrà»!lÇ3ËoÆD'̳f;žåÆ<ËxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆÞ³NðŒ•gפ®žýx½öÏpõìtýTo…x„g 8~¬?}]göŒ>ã@Õg¢É ûLÀ~#?p|ÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆók ¢yö¸öxÀTϾ{Æ…ÃEòÌÉéÑw/Xÿ”wžùàç$üSÞzvzp^® xtߋ˗Go"µgÞØ¯™…|a¦üêàÆÿ0©ð endstream endobj 123 0 obj << /Length 2820 /Filter /FlateDecode >> stream xÚ­ËŽã¸ñ>_ÑÈIÆ I½“SvLÝCÐÀb‘ÍmɶvÔ’!ÉÛ3Ÿz‘¢ÜòLhóQ,Vë-ý àO?Tê¡H’¸JˇÃó;E«ãéÿúøN Ü÷äïþüc–=hWªÒÇÕcýðïèÃÙ^æfÜí“$‰Ì_vû4Í¢Ç]™F×y[Ûíö¦ª²<ÒÕî?ÿx÷÷G[fÌÉBÈïÐ¥U »éC^¦±NR&îc3<ïLýÑ6/@Œ®S3ᨊæsƒžrÅ_—iׂSg§‰yš.g`3Ó‘;¶º>7q’äîØó\—QÝt|ëqyð<û';5µ[˜Û¡wûHz<·“,7¶—áWd`¸òÄŽtûÃ^Y¬Mƒ$Öß:]/ºw ôIUDó€¿%0ÛöŸyi8º¥Fžv{xŸß›ÃÌ;vâ'BÖ´ý‰×Û~jë €Áz·Ì"žÚ§NP’¬<˜£å,+$®ã²A–”𢙙–ˆP‘åŸÓØ s¤k°2\g §á‰àÖx3S¨£Ñ @º¹N£_ÎMÏ@^¤xôîéWÑÓuž‡þ=<ŽJ—+b7x;ö Ù+*9S”"²¿"&½0©½~Á¤Â¤kf>uø—Þ²po žž…z ¬ŒM×X2…€ˆJˆye¥Š~ø]áùC˜:b*ã„×sÛÉ…JzƒËÔñx6Ζ sî´Ç¿©L‘&ö¦?47À¬–ÝÁI¬à¿fSÙzö_,ˆ$&ûÜðRÝŽ€²‚l#qo ÄLH5{ dlrFü Ž¥ZG¶®[F’jEdá*!¡É‚´’¦¡k뉡½ àd:WÔWBÚM¼¹‡èÈßGbϳM“8¾'˜¶¿!çà£G#L…âzi{y¾Xüý¹™Drvlœ„v‹¯ÌW®Z›8ó.öO[î4‹ S8¡ùÚ³J¡ÔoØØ¸¤Hã\Uß¼¤Š“Ü»l2¥…l‹4 ”&^(Ù$¬ÿðUô¤9Úk7óÁuÜÁ• x+Ñ –«Q&6‰Y ö–Ó4§%¼þ}á;"{À{Î<#ò2çÉSp¹ÀËÙʤªn§Kq~x5 gÏ' “³*H6HEÏ¿à‚­Ü~XV žtv<É ¸ÿµi§ Ûiü ±‘ì¼TB—)5Y ®xúpòŒ.:4r9Ôðç¤`ÍIoµ?7óh}àÀ7’ŸÂëpíbúÁž›ZöÕÚµ¬Ü2 fìÚ·3ªhÃ#óUUððW¢.yDœB›¥4€v½šáäÅ^K)6A\µ‡ùj»NŽ>/þÜ_ˆàK"´2 Ä”qžåo7Ó_v%XÈÞi›© ]ÑoGæÄC8Wô‹¤‰ÑžEœäØ’¾õéuûG[_9Uë4ÇTèö¦¹±µìyQâ 8Na¬4#ùoïùæ›W_ª% j—ÝðþÀÛwÒÎ$Ëã4ñì?îŠÞÓÍS3O[âJʸ(2ï#G¶ºI2H²Øh³çòò.à’ ï3²m¿u1\ÿl?ÓÊÔ;“OKGÊÄ0Å}C|1Uö*'Ú we\%æíª?£ËŸzô Ô¹†§ø.æ24*(Ì~^tqkU©ËÓaê â˜ÈµŽ8Þ|H4Ü Nh¼$ .`Ô¼“gçûùWëòv ï’º;æ°ðå§Kï)¦Ã†;8Aú˜©H,Jö Å݊ب"NR³rMÚÝÐMwüC¹x2ï "R[@Jxº~êðÉ…rÆR¹È‘°žâ$Š»nkoàµ58®•ˆNörÑ­i>”|Öâà*¼‘àsp=†/·$ã¤P8s¶ÃïæuÍ¿eÛ¯ö2o%÷‚ÖÕÂ;’±xÅ‘R ¡])EÚÀô†N'(Z³]tÍßÜäAIhÊeíÝ 5ÜêÓI€qµç¶ë¡øÁõ…àµv¬¹yÝX€…ãi1A Žã06 6j²ºÐ`§bQÃýø-\Ä-à §KbH½†ÐšWǤr£<çšÔá¬êyªWäpZËŸéë-–DXbjJŠ ç¸â#ÑkÏi8¡DØn ¢ XY\),r$k.<ó8Âù‹;—ãºv†YÚ0]ÁuÖ íu‹J}Zƒ[¨ö¸•×£[¤²¼_¥G«~j&\ç:Aû`ªš%+£Óï—¼•wC]&L-òÙñd ÎN ¥G×ѧÙ!]tdÚz·ÑÎg×âí¥­;)ú¨jsm%4µRã1®Q ;Éhøn˜¤}”{O\…&èpFh¥¦Ü¬”¤Ë€§ò,hÁÄP›Qú5sÕ®»9Ï\ƱY(z‚|'÷eÁˆÎ³Få9S…ƒTâ4;Ú‘·‡«ìÇÕm¹+‰ýVî¼ú÷Z +Ó$l‡j¶É´&\iåwITh&¬Ð[8„VÀÔÜMÍM’Ç:ñIÔ‡¦Ÿ9É~•‘q•§ëh"T}û†BQËú­6Qz¾ °…*¸Ìé?ä§Y’¬…éºl¡ZÍÒÚ8 Ï’V9žWY„—ÎW Å+µõqÕõ›[îbßÑÏA8O%œ§wó l¥›·‰[—·Ò&¼ÿ>ÒEqq/½Íêaá |£CÉ—¡aU¥n¡¿)øËXyï4»©·†^ŒX:ÕØY\kÅi,V‹Ï`{ÿ—®™v5)·ø‚ô7yݸ+ÿ_©Š¾â7U,µ,O{Ÿè¨RVUÜ4a'¨D„”vZ%8d¦p“z8°ÈÀ…¥eEhѳbƒÁ¯”^yÃ7:á·7UñmW±Ñ IJ&Yn%Äý¶®éCE)CÊr ¿0^…_€aµÀƒT|]òؼØqæ]Fåï¹M±B´¦”Ê ïï›à‰Â’˜ûuÉFÉ•5Ì踾kAZ©xél¾¥—PŪ4[½º†DxÿºBÇinÞÐ6À§ ½ceùW‡ } 1‰Ú*yË X+þŸ])ó&±QÞ5;¹sý´ »\å³s¿ #}ÈB»Ã©= °0ª‚b7Â⦬=éÝ·. DßMÿ'Å ú‡±OeÑßvyÏ›ÅO+•¼ò e&6s÷μŒ«¬ü_ ÂJe¯ BàÛ[<^êË 7N¨&KSmåÑ:ó&ï²ÚÀòuê+[à×&©SÑìÂ;- ʲ™:Ï@UÎûæË, ÿýxD i# ±¼¦ÂOà•z¨ Üe)}3Xñ«¨%} _¯Ü~©_Žn¨—}’ÙíéJ)¥N"›[B Á‰5ù5÷?Ç;àopƒ’¨Àb²ï’Ú2[=È46Ù¶6'Iõ-mÖqöJ—õMŠ2ñš¼h²4¬`ÜÊ麼aÉ&¯u±öñ;Dæwzõ¥H"–Iâ²2 ö˜§cÄ©'“$¯¿H¢îí4z‰Ýóýp‡ž? endstream endobj 126 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/mnt/storage/users/claus/projects/geomview/sourceforge/geomview/build-opt/doc/figs/ap.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 127 0 R /BBox [0 0 158 184] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 128 0 R >>/XObject << /R8 129 0 R >>>> /Length 67 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hjf¢g6´0²2ÍõL---LLõÌ !Š-\ò¹`ë¯ endstream endobj 129 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 326 /Height 381 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 326 >> /Length 5936 >> stream xœí];rä8Í9ʸmµ;'ѹ€Ž¡ˆ 92ö­ ´CK†N ·­qç$±Å€ÌDâK€A¾ ©ªH? 3Aþ7 àøÇ·úëóu§i!¾ž'¿þr¾>á±Ïúk¼B,|þzÐøxwý¸žµWŸ…ϧEÞ Ü,YPjü|º_¹¯‰=¥Æ£å¼¯É"5>ïU?:ÃÊžRã/o¿ç†ßVö´]ýž»¿óxÁ_¾Yj”Û¢KµÔÎ~‹…©[jLÚr‡xô²纰@ÛwXÔ£FiËÏóz„K3+ Ïø¼§/Ÿ¯Ægè•Æ   ùj|ü¼[9&©ñAÂ5*çwòa¶è}-‰¿IÅÚÁŽj\ˆy_ëöJÓ»^Lÿxk…Ôȇ2ïö– +L’ï¦ù¡!îßù{!Ji†Õ”45>Ó“z~·Ô¨Oþy­—ïèÀJ)€aÃäêâ Áhæ™Ô”T52§’DJ®œÜîÐ K¾¡bmépV#58‰jä~gj¤Ô¸ù!%Üuº5 5NÿrÕhÉÔ¨ëé\ƒM;,70’[n`ˆ£Æ±lKiôuwÞÜð7Õ·ÙÝ]ûf#ôCØsc¶A>t½ÕØ'»«±S„ÔH—°]"¤FFä­Fj–Ûjü’£¬¯¯‡Ç0w{=Ør¬q±`Ôøþù4ñù°ˆxr,ïΓu­˜Ô8±ùü=»ãÔyøçk"ø×’˜÷øüߣè”øs ï›iœtyÓ˜·ŸÿL‘ü…Æ©­y¨ñ÷Ñu:|ÀOÖR?Ôøû{äòdýŸ¬ßÕh|ûQe³Å‘söo²+çNCcòÙO•ZRãMc\¶ñ¦1 ·mÜj,‚[Ep«±*¨qé/ô’aùÎVûveÓø¿´Â2¡qÕÛúI¿c„Ô(ýÆlyúàÑl Dã˺OûÊ‘EÂjyÒ¡G!“F¯C4†Ž6DãÔÇÿ©}ŠÔç0qè¿tµhäÛLjRãT}Gs6kqý¾|}|šëý¨wU‚ÆÑYÄõ“dxÔ8UsÂ1jVçÏ#¯Ô¦€Z ËùjTǩߩ(†QºfãúÏ}ºiÄgFªD´m\øð)Íÿõ‚AóŒ¿fÒh¯“FZj-ê<Ý ×÷Ñsf‘¶Q×MR¥°õŽ”>t%ß`ññZ4º¯™ït£àQ£Ú.(Fôy„Õhä ÐÈÛ0Þ¤m¨ÔE#°’ÞÓB|“Q¶Ñœ ©Ôk4êÚ§F²3ßéF!“Æ5:›lЍ|.¼V¶ÔbùšÕ¤Ñ×ÄÄØÆQ5ˆž9˵ìúeT»ÚÞÄà~£ëšùNw#ÞOæ(&2/æ ³k#L:<ë|øšñëðÄaÃ(&}WˆÅ¨î÷¨àáñ¸&Òwç{8+ù®‰ú¸ýEЇÇ­Æ"¸ÕX·‹à;¼¥ÿHVcƆÂ8 9'/ª± ‹g¡1²m<ú¨NÙ6}T§Ã­Æ"¸ÕX·‹ ¨FæHó´ ÜYØ+j´’Ráù# F dƒÐ?¾n5bþ@ûêiž‚{Û8`ˆs Ph¬‚ýjÄ9rä–PÖ€E˜:¥1F(d™½Lc~ɵ= Zy4¢&†þ²#%N¨¬FàôuLcLKC£ôãõ}yÕ9¥#Ûo”š˜PÏšöÑ/eì…ÊèQŒÔáxƒ“º¤ñ¢cjßH5Õt_ÖÃã©æÐxI5úGª©ÆæºjtŒTu6ÚÒ£ ‹Ü¸¬]#Uװן&yY5©.‹Ü=ä[Nî/ËÚO¦ñªjª>–µ«1ž‘*ÜjŒ†s¤Š›>ˆuâ²jGª*k¤jŒëðˆjL¼§OÿÌçÙÆ4Ïrçé˜iÍÄ&Hº½TrÕ˜U©™- ÷Ò0â´ÊÂB£'~‹/ o?ÒU¯ì^jäþPr@xbw[¥Ž¢q¹+Z¶›­»˜×¿}…^“›Ffn¥=™[é‚6Õë*ùÚ&ª1»¥–œŸDfÕ°'âÑ۰̳*D¬:¶îN+÷hbx¥FæÖ¦‘]åµ dÕKØF õB¢Ñ—mÄw8)Óá±*52·AqÏÌŽrÙHU#…@cÌ]Lò4±R+{$u\%›£+„岑®F ›F ÐÈ$hµÔŽ‚Ò66«‘×1¶ÀM#›œTý&±M ²ôÌtKML!5¾£¢‘¦ä˜î n¢¿ŠSÕ¢r«.õÂÔ<øit ¸U ©1ÉãtÓèPcšß®-&¸‚q©1 ­Ä©'îºÇ¶1ÍÄ©¤±·–ú§ Öj5ª1>:»L"Bj<1hhɱò¦èC4f2Ú±)Uõh,¤FbMjrlQWÕtL#r_e Z,JM®ÏiTMŽï––4V]¨?gшœpú¸D¢ÕH½@¯¿Ðø›|ge¬ÒuµhTŸF Õ•ÄtV¶Ø…t>Õ¸Ù_©wR#:K<R¼—F‹–üøòs52Æb¥Ö„:+õ^jÄçL|¡ËÁûh´&éØp!ó:3”`ÓÈ$(Ð8@ÓÔh¼F)•šxéqãòŽ*Çu"lbRÕˆÏ~=ø`¥6&^P£EŸ*X R«8€ß6jÿn:¶¨‘|ˆ¨ÔÄw¤Ûá •ZÄöÑCfKN#g'ÆM¶QD=Óúghbœ’Ü¡Šij4–ÊÝáAž^f¥§m˜QLáO£ùEX4byD÷[ÆÆnxÃù‘4Êê‘n@|~cœÔÃW5^ÒmׄxׄXzk¨$61/”Þ¨Š&ÐØ›¿1ŠÆäõ¬hA5F|{4ÎÚ+»·el ü/¦a UþþãÔ¤»5RyéD=³^ìpíuÇqj¦8<@§>ÀôJ×m0è6Nýƒ>=°¶z»\¥iì-NýŸ»#¿qÁP’Æ~[j < åÄEPUÐ(71$‘]ÑèÓ_YóW5PWýâáMŒí  ë2J«±™8u[ùõãÔ# ˆ,¢¤µüÆâÔáãÙŠŒöòëÇ©kÑ]º’ÔˆGvG6*N͈{¦Ä( r‡1ZGûéªTAèiˆƒÜø€BÎ|êmžÇl5Z‹2ãÔºÓËû½dóƒf4éó©·zsÕ˜L£ŠS§Óˆ~™R©£hT¶Þ6ú6¢h¬¬F>óÓ¸´3.i„;JÉþF\a²<™-u:Iq4âå)¶›Ç`Ðlk£ç1³ß˜¥Fé‡Fcb J¯Z9hÄá+ËßH¶µÉó˜ĵB¦Ñ§vÓˆ;6Ü6ª_¦ÚF½ ÙßÈøØàyl3N½b¥&WL6Ãv[‰S—@æ|ê46§.€¼ùÔ[<}ûIGGò7Z£f”c=}{¿](nQúSK¨Gcqê–üIh*N½ëûSïºÇ~[ê]÷ØoK½ëo5Á­Æ"¸ÕXñjÿqܘzw´¬FÁo d<ÐXòÉ®{LP#aRò S1ÎU‚bƒ‹ÖÕˆ<#fÖ§>ø˜¬ F¿–¸Ñz´®Fì`Iå† 4¿i œI@*7$&Ÿ¸i4ÓÈÌ1L¨ò'Rc"’+m} ¾æ¬‰¬«Pyó;±C ±< ÖÕÈ*aj¥›F[„KÒ”Ÿ¡R§ö›ž|â´œF³ýxA6¯F4ŠIëðú¢hD•šAÍ«ÑB‘&÷OÞÄĪ‘Á¦1”|B;<ó2Š9w‡'¬Æ@ÞjZòI¡Ž¶Œ–ÕDRòI¯4Vô7Ú:®›{Ò©wÇDãÞ¾ìÓû½ûãCýjš˜bjô?tœ4òy·hÞîIPR1÷,=3*{x®DcEc0ߢ4šÑ›¿14}Ô‚µ7ïwT¿ÕÄQdØœþÔx—P#ºi›«Ã¥oPe2¬òØ%7®¢Fë6hf]9»îлõ¸q5®dÕÂŽ ðXÕ_Ó}j’Ξ—Ƙéå]#Ù¶« 71#Y>1Ãd*µ“6hFó±ɶߎ{$Ä,ÌjØBcú]¿e8\%‘£FÜyh$} /Pú®ß‡!Ë6šóµˆà´äÓˆ—ר‰‘«ÆU*"v£¡M /+¨1¹‰9~5†bTº±Fo¸o†mâN#Éña¶1ñ®ß‡Á«ÆÈUšNšVU.R=<›hŒlÅIb1ÛæR†‡[‹À“Kùç/<=-ÉÇU¼ß¦U$´&û2j$)¿f1]ÚGBsa¨'lp5 w½±hçŽ/õĈíäeÔ¸~ðÒȆS¸ž›1qhøÔxPça¢b1hq Ô#Ff|j uÈCº¬` ð…GÉQ±ÇQ8hdžñ¨ýj g ]c'-ЈGšŽ–Z¤ù ì›UiøÕO#95jb|ýFî#¡MŒ¦ÑÕÄ$«I˜°xgA{#p7ÁüH,¾Æ@,Æì7Ñës^€Ž™{b@î𤪑ÒÖ#1µÛ÷gÎ _pq“y4Æ>­lȶ?g”ݬ·7x#’9ª1äÞ‰ÆdÛÈb1ú¸ˆïÕ”±º ju Ç¢¸Í²;ÊQ#ŘCc²ú`z#àZÝvÐÅ,ÛˆÎ]l©]ï ^k¶ãÕ«FÖÐ~£Ôv8š^|ksüj ?TÕ49<³ÍdìÏü»Šux‚W‡3J§¶Æbngl‹Åœ´ –GoþƃЛ÷û Üj,‚[Ep«±n5Á­Æ"¸ÕX·‹àVcÜj,§soç~’™®…áTc&/×T²G9ºJz EGð¨ñ¦1·‹àZjxÚ‰»¤#Ék©1i.|*Rc[ \O:¾¥Àœí(‰Þƒ5&\™™Æ@Î Ïåã'ŠþÛ¹SÛ`hŒ¼¥Ân„Õ˜ý[hôgpåÑX$ŸBq(dºáí£"$ÛÆ*jŒ¢Ñ}¢¶ Û‘F“ gŽ!|?£Û˜E£™“#\kPçÀrmõ)™ó]³W†ekãæ"¹hD™pæ˜ÃÔR#š“ã¡QÈ“â4’$©  ‚F³œ˜Çª©ÑáT#;hDeÂ6*€U\BºG1?÷Þã¿]ªñ8ûR£jsõÓBÑý”Ôr„9Ó} IK:UãˆïÖ½äጃ›¡r4v¦F•N±4Ú¸ÕÈhÔ"ñ=Ót =˜lÔu!Û¸nWcB—ë4r#¦Ñ,ÀO÷۪ƌz+!Ç,Jš'EÞ#Š‚@#¦r]Ž^ßMA¾ÿFD55âòúsr,$’Fä½™PœF5ßnÏM£2yy4Ž0ªF+`ä )¹½Š÷.D „ ™4šBœFüÕOcÅ™4]”Ð1O ïÝÂ;“i¥(‹FÔ|ùÖ£›˜Š37/ !Õs°i”œÕ8Î2$ÓÈû6d¡^¹îå Û¨N FüKD#Ð †häpó°UÕˆf"X4B£W™ÛZVe4Ö‰©4âåA£R.†¸° ª«Ñš¥·9O ïÝâ4ö“ߨlãˆ'X4FÌ“Z~1ÿíâÚ6¶Aã.3${£¡üF(O¨«FŽÒ4:ÂÊÁÄ<ÄnÔS£}½KK´M`ç7šÿeÐkdP×^GbžZ xP‰š.k̉ ¹€>#ƒšFÔB4ê - *a°Gƒj(èÌLé[¸6c‘RÿÖ{E}Ž®Õhþ[4*%N°i”›^—€žÕh™¨”ø ‰©‘/ö¶IýeÛi©A¢Q«4…F³X@Ù¶ ÒHýÄ»énKؘ3¦‰é/¿‘X8B£é²îø€5æŒìðô—m+ÀÛãÞÒïXêÓØY¶­TûƒÑzj9RããÛ·™Æ¯¶Ñ*eÙ&Äã ~DåNC#L<~ ä7–¤ÑÁEcƹeϧ.¡Æ²-5¶N&ÔÁi\ (ÒÍíæ©õ€sBÄp]Ãù94zf"°•¦0n, j}D»Úp~cê(Fè^æÿ¬ïÓ§qä›s^Ô†Õ˜´Íˆ™ P>h¬‘më‰0@ú ±†­óµhDÖÏ6¹ÓXKÎ&fþ 41œF­XÓÄ(lbjÎD;<@ ¨¡bP‡Ç,i­ÃsÖ™Ñx™-Vê3ÎDpõb;Rã‘hO'ͶÝ{fÛî½Çþò!ÿêoAoÙ¶ÐÞÓ‹NŠÖž^tR¡ÆGƒÐ›‚¨Æ·£ê„°Õx³˜K¿Ž>¢s‚©ñõèã9-ˆÿúº_¹/£F'>_}k¯‚ J¾ xY¾ü,(5~>9_ð:åI]ýbaRã«÷B¼‚ý5`áAãø?’K¾å endstream endobj 132 0 obj << /Length 870 /Filter /FlateDecode >> stream xÚ•UKÛ6¾ûWèH#Ф)µ§¶i)Ú¢- ôô@K\[]ëQ‰J°ÿ¾3ʳAa@¢ç=¿‰$‡ŸHª<1RòJ•IÝmò  þ|؈h—aveùÃnóæÖ‰Èy•W"Ù=^‡Ú5ÉöãÑŽÞMi&¥dÅ·i¦”f»´TlñÃÔÚSšU¥·¬ÈÓ¿w?o~Ú³é¢x½¬/…)Y$Ya7Ú ñ›÷]‘¼6\L0ÜWй­J”Ô\›Š:x×–ÉÅøÚÂ/nØðÔöÔ)f=Ùøc4þ”¢ÁtjRÁ86u€W:bóÛ%˜ej[±qerð{Gçz™æa"ƒ`üçKË®mš“‹–ô•à¡ÁbKÖ¸Ú]3 =‰m߬úerY}jkŒÿôyø©=QåC™ œ2!¹Ð‚ºé†eÆÎ…fûÅ{ðzÞ²b»c;£F±ÎÙ~&£«l¨i=‰¥Ï ºlIè (x QÐv.†l{MvlÍK]»ync% íÛ:çÖ¯·q]?Ý[.î¡…â}¸pW”$go§ƒótÀèü«ýw˜°`Ï¡î…Ôµáf·:8pjûK\(ØY^³SÀJ±…ºC½»Ôf§T ÉçèqÃgYò²4«Ã~"hç0Ž_Ï—É­â*—& ò«¯;©ŠŠk˜Á˜j´½;ö:ß²·/ÈE£U„OËH.Ã<ý]‰&H¤€?œ×wÌ®€&E€¶ ôDÂ@‹ÑŸIëRtö)Ì:–Cˆöv ÕåšeÌ®1{š‚ëˆãþº¬%X†BI® w’¤ôÊê¢â¥(î­¹nÏuÁ|?Ž©ÎN¶¯£ð÷Ðp€ÿÎÊyÜ6…ð¾õªäHâm¾ïçiæðQû»L3%ÛjõÅMS¬«“î'`úLô’&çæ>/XObject << /R8 139 0 R >>>> /Length 53 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`h`j4406R0R0ÈZ(¸äs!‹ • endstream endobj 139 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 220 /Height 215 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 220 /Colors 3 >> /Length 2968 >> stream xœí=’Ô:…ïÛ èBV@$L2UÄ,ƒd’Þ9 ªf“±žg0ãÑèÏWÖ•tu}¾ªqu«Õú±NI¶¥ùPÆËßïß¿[$ýððpww×"q0„Ömº¤ÿñãÇ'Q.ï_¿~-x\J¿$»U@<}û[·é’þׯ_ÿ‰r •þö«OŒ¢]›.)¿yóÆwJÙ<è±P¤%š¶iÜ)WµâˆcÏ£«½¸Sj(%Žç9ºãÆûŒS.jmaÎxDµwÊE­®°q¹\¢ÚK:¥Ôu¢5³á×2p”:.­¹6k}j«(Ëœ²~†uÙ·îå®ãHµ©Û!;e}êÓ5Ü?^ñi…°Mù3/_¾¸élÞ×Ï)‹h ÝÊ€H¹C´M—&ã4mMg§\E  ÒÁ)™¢$§eçsJˆR%NI-;“Sfévën©pÃÀ)Ÿ•ž ÏEJ”nx‹×æ1蔥7xÜ_çŒ&ÖÍSÕn8Lˆ»îPÔ{hqJf®^äR§döÝ´§°¼²·OO%ͼ;lM¶û£Õå”E¢tóæ;eQß͉| /“pœ’ß“(rÊÝ,=–¼Eœ²´fŠõT¢$†SºoçpÊhÑó”:%¦8íà¸X©Å)Q䔜¥g„¸ÄÇà컦¸÷=\§|Vz’; 8å³:À)‡§|Vz‚Sê µSòS€S‚?´vʦ4á”àMòp:GœrÊY%™9Þýeø:Γ7%‰¤&Õ¦9§\ï¾,ï]µn·d*ÙN ‹`CH%å:¥«Ô?¢¼½½õ²ÄºoЇÕ)]‰?uß[ÐãÇý‹NÅÍÍM¸½Àåry&J×EQ¾|ù²w1Áiøõë×*ÊgòDé΀è¯SB” ×ëõÝ»w›S²fß®S.ŠXz`?~,ÇM”Üë”ä8%D dñDI‡r–®?!…­¶4˜S*¬^È:R] Ehkµµ„R³mU]E¨jµ­„RIõ¢@”!ªZ-%J‚Sž U­§PÕjpJzÎXU­§ ›(Û]4PÕjpJúT¹é¨CU«õvÊ%õõÅ·oßWí)G//ˆ2$U…­½Vú´Z?§\«·ÕÊ{Ûˆ’C¦ÕܳקÕú9e(Ž0¤%U­ÖÉ)wkâv®›.¯£=~*~*‘h³g¦¯ÊÑÊF-'_N/\‰(½@‘†óèä”yQºÂá×™ªD™ÆÌ(J‘† £Å)Suö~d)E.ÊT‡˜ï+uŠ’sÎwÃ=T8%%fy¥¢ôBfe'bC”^Rz2ìÑê2>|L™ê¹ò(lˆ’Óaª˜}‹ôªDV?˜šú(e¦„­EI=¯S2ç(ùñõ,0œb½Dø ¢ä7"¿áÂÂh¹£ã†§&¤aè%• Ô,Êð£”ñë¼£Ã9ç» ç{ßH;ݷJD9<%$€ÈuÊhä¦ÅvQÕjpJDîèd"¯@”pÊ ßûœRˆR8¥¥,pJ JYà”@”²´rÊëõ:¨F\ÄEÙ§ÊME©ªÕ„RUÝRÈŠ²[•Û‰R[«I:%R`J 8¥YÞ¿?ºGøþý;œÒ,‹(?þ<ºżxñb¼S®%‚¬³"3¢à”¥,Ÿ>}Z[ÄŒ(©Ò)Kt¥GQ¾zõ*üèíÛ·•5LñóçÏF)e=cÆDY딣Dy½^‡àGŽfg“¢$…NÉ,‰lÝÖnÌTv0)JN Qò1)J‚SNIQ 8e4'ˆ²&EIpÊ©1)JŒ)çÆ¤( N95&E §œ“¢$8åÔ˜å°{ߥ&EI£ž‚(E0)JNÉ\D²ˆ’¿Ü¢TËNÙhYD©ENÉÆìbL”4Ä)¡HYŒ‰ktì`F”„ÕŒf0#J8¥̈’à”f0#J¬f´€±%¶„uß³co‰­ŒSæ·›÷P~ßo®e¾&/žSýSB´÷9<̈RÃ2_“¢”žr÷ÿòM!ÊY 1)JjñegpGgˆ²3Šî}C”"˜¥®ÕŒ€(;§Üg®e¾&E §ô™k™¯IQÒ(§Ä‚FAŒ‰rŒSB‘²%aŽ̈«í`F”„5:0¶p «§ÇÞÂ1ªqÊÔ³‡wòUŽÂ5e&/ U9%D™¢Ûš2“¢$ñ5:³?º–AáH“¢Äó”@”-Àó”U@”-hµšÑåî#•¥“ Jñë”eDɧá“ç‹™@”^L‚([ÜÑ(= J> ïèð÷o(½˜Q¶Û!¢Ü€(ù(º÷ Qn1 ¢Tò”D¹Å$ˆNy…kÊLŠ’à”|®)3)ÊaN‰e:‚%á3À˜(±FÇfDIX͆§ê0è”X‰65‹ :%D9/ë-³N¹®}±ÉɬSB”Ó‘%Á)Á(à”@pJ 8%Pœ¨ã¤N¹ýƒŠm‘à~êÅÙýbfí‡l¦™øüL3JÃ9£SzÒÙ]E´EÈ|q÷ßXífÊÜ,U‘LwkZzêŽqF§,:³E[*d"L-J~‚"trʰ¯¡½.,Õe¤¾bC”©tDDYš¸)§Œ¶ewÀrCÂsA ]Ö‹23ÓSWŠÒ}»›'~åÏ/¬©5§Ì7a>Â1_i!JJ·PiRE¦[:f-Í”_S槆aNIYÍí~½ƒ(ù#0N©*Ey,¼]M™µ8Æ0§¬«1ÏDÉÉTVÍ"ôsJ/$Sçpºs¬Ë¨屦œè¤º‘Ýp‘×dZj§¬<¥¢äq9•*Í´§(wN:E©bLÙh¢C13&†(S_d–Š“i4ñÒp~¦™¬&ÓJÎ8ûÊQá”ôøû ¦©^ƒ*®SåhqÊ-d}}¼ïÖŒ)rÎxï(çŒO åÀ):à”@pJ 8%Pœ¨N Ôaß)±eõ¤˜uJ(r^l:%˜ƒN fÇ Sb'ß© ·—&N QÎKt{i;N‰KBÓë”@ö¯SB”Ó§ê€SuÀ):ú9%sµüú‚¿OAˆrRÊœòöövuG÷("ÊèÛow£k!ÊÝõÝö(Š@å+°Ëq§„"A#:åÀƒ3Pì”Ëg#Ë ÎASº;ЖS®¯qıç1甂¬¦Û"e0ЦmwJñ<Ö‘ti†vmwJo7Àú#=n¨µí›…ãìÇÖmúä”íf6[¥úÓ´Mÿ‰Uü3èÆ endstream endobj 143 0 obj << /Length 2942 /Filter /FlateDecode >> stream xÚYÝ“œ6÷_±u/fª<!!àî)^'N®ç.ÙºÔU’v`fHØãÍþ÷×_1ËøãÊU^!µZ­VüºGÝDðOÝäÑMªu˜›ìfwzÑl¸áÁo_(¡ÛáÖ£|}÷⋯“äFEaåêænﳺ+o~ nÅÃXõ›­Ö:ˆÿ¾Ù“w›Ìç±ëë¢Ùlãþqû·ƒ ty Éûu}8÷b^`í—¢Åö›…d×q˜DŒ –$(F…îì?'Ž€ÚLœÃÅ-òúâÛ“¹yÓ½ø÷êå"6ipBÈqÉêå~Þòãäíâyqæ_øèøÄá߀aªœ“ ,0J‰AÒ ¯d84€üúáÕºm‚̱ä›5»ÌB…ÏË«\ÒÀ‰£øi‡Œ«g$×5øšM'Úÿ|‚DÄÍp ¥×…:È^üqDÂs…u ¨b¬»–&”Ds cØœ%vª î™¤ËØ‰¾ÓÔb9¶Õ0°Íç)9 ¾Î®E*ŒÆN±ê›ŸVoÃñQ|‘í¡æb`àÏÿl¨1vW}Ŋᵜ|`DJ´—ûÐP(­JáCœ˜R5ìÙ£‘ât_•BySk<)èÏ>’£àt‰‰ ¬ýÝùTõõq‚‰r9%AO©¬ÕEOÀ³­JE§FîûøÈ¹náéa=¬ù¸Šã0°çßV‘n˜Æ©£ø™Ì¹oÊ5f }«2ËÃlÝ…HȱE¨FS—# ~¯v#IÐÊ-ú0a³Á¤W‹(0yè“5‡åRGÿá¾<ä[Öë3?•¤ö2‘ÒYÿm:j£+¶-‡QlV2Â\WL0+¡çuÎ'ÌÆ}“8G‚Eoc>PÒd¹ù?b —g1#m= Õ8J D |æ/Ï&ø8.jdœaP´ÊD{ˆ”W~*«CåKE’Þ&‡R F“”Cª‚§¨ö#Osõˆ#‰Š*q/ùP^Åôú”Ì0q0`Wo9F+ ÇzÙÌ]¥ÏnABTºÐ8V4Þ¥¨Ó(Lͺ,ëá¡qd ²r=XêÑÀ±ø`ض¡ÕØ3ÌyŽ]_<Ž›‚D]ÏØ.¦ž¶sÚc5Ù7mŽ—›A ±n ‘GúÉ*(«}qnÆ•æŒ3º«¿Å”J—+®=è<5ÉÜZ¹ÿ›b¯_w­¾QË<Õp€”ùî,|°ÌàèÉRÞ°u<®&±ê—E¡kF?x†k-·%— óþ|˜£æüuÍ92§tnÎËw„hÙ¾b5^t59'F{À`JˆQî5ip¥n/I €ð“Î?\˜Ë1úRÍáíÈÆOrݳ¤Þ&@þ»×L=$Û$¿¥ÑÂAÓ$´Óûë)IÏ÷"Ÿ„_v½, £h™vxú5äÅÃxSÓÃp©yrDášà ÕŸ!8ó¬‡ ©þ¬‚'îýƒ^¥~Ž]?îÎr.©>ãB²sfùEîãæ"ggT‚½]ñScL׉ÊB£òO‡$äÄkŒRê}ˆOÁ`ÖñÜ÷XHvõIêÔóù þ‚eC: Â.r¯$ø¾C„“TG§vñ+ÀK‰ë " ½¥þ¼Tªž¥Òø™Ÿ”LèÞSö9Ô <øm¤ÖE.ç˼P·P«ޯlåÎ×j:‡<‰æ¦³`_œê¦Æ¦#NK‡ù·d½þï'8ËZã¯íË‘ç|ùx ‰–:Ä·rê.W ‡Óñ”SG¦ÓM‡ŠÅIxΕåïáãj x¨H²‹Ž`ºjìå,ðgÐuø€ì~úÑÐ<+øç¢ÌÌE}ïZN<ÌkÆÃ4ÿÕ†å@×êŒé|«Eü+þk±Ûk>Ý}éÚ«Õ„öúóWŠ ï:‚Æöj©c¸Ê$Öý’I9ø€?ø®·Û;ááûžßo ’8ÑÔ²‘½â ?I«6¾Z˜hã·T߀.ÇUxt&ÍŸ•!Àù#Wµ”“äß˯|—ì± *kV¬XŠþ;W¹x–ɵ‹ÿs`P/rN[)ÀÞZ~9:NöÏý€tj"pŧÑhKÞC¥–HrœL§vûÿàØ‡˜ endstream endobj 146 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/mnt/storage/users/claus/projects/geomview/sourceforge/geomview/build-opt/doc/figs/secondlinelist.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 147 0 R /BBox [0 0 158 270] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 148 0 R >>/XObject << /R8 149 0 R >>>> /Length 68 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hjn©g62³4×3ª2¶´´40R0Ô32Ì!Ê-\ò¹€¶ endstream endobj 149 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 329 /Height 562 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 329 >> /Length 6026 >> stream xœí;–ܶE᡼ԑ:Ô¼–Uò& atÒIžƒ{J*’×ê(”"§o*¯È"€‹ÿï€Y÷´Ý]E²ˆË£ âKÔo‚…Ñoâߨîo;2¹Þî?1ýøº8ùãsðçc9AdÿóüÜ‘Šìbqr}Òrè?îAµ 3âãÛÊdìˆ76rU܈?6&?þàŸúŸÕJÉäè`Žü#Ä‚¢bòëN™ä„z ¨˜ü­ ±Âú}CQ1ª =Y%H|.½Þ¯“þ¢éÙÊîàõ†ªƒ‹s“%'8«‚†‰Õb³8y_¶Ëcr;Ñv®÷¯÷ó,ÿŸKîõª=«Å_é¯oê™”îÓÉ$“†“÷ËobòÝóò,*crÍÞµL:H.¹ý]è¿×~LÚNÚÿ\(&í†Î»ÉÇŽ¯¤Ì9‰‹«ôõš™¬É¯¦_ß#I!Tî>—äz¿šx2i9¹xn2i9ix , “†“¥LÚç}O0IßžÂIÊäò«–IÇK›É“—7Â(Œ%ºì>{hÏúäÙµcçÜb&ab&AJ2ind&ÃJ0iyÉL•bÒ³Ýeò‡¨öímø0è®?¡ë½[ìß®™|_Fl?¾Ý›3^ýØ~V¯7´C3ùßõ0ï®Ö¿ë4¶oY?>Ä_ƒã9¬þóï2”-~_\îýÒ1õýïe¦ÀæärÃìdîNše73Y©•IZŸd&+ÅL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢”bòòøs»ÜÄý?VX)&¥}'Ṵ̀’LÞèKv2¬"&ïYýöÈðËŸû[6V+—I»ÿäÿ,­$“ëïur1sº£&±“¶ÊËn²…ETÁ$;éU“²Äa' •1¹Ù¸Õ‚„;±¸Ý÷¡ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢”`òû°À¡?Éë“ìdL¯†U)&ÿ´?Î’ú$,'ãL²“A9N2“•b&Qb&Qb&Qb&Qb&QªdÒœŒRvGúv`ðøÌ]FvÞW2ÙÝIó£ÙN>~2SŪŽÉ>FO[‚¤5¤ŽI9éBO¸Éiô­ž=$·=¦‘¹Db;ucΑ/ s>ÒE¨hŽÇ$q’Î ºÿ¯.Íݵmw6x$Ç…Nä/]¢*&IØž¹A­t—1}ÈÆšº@Œˆì?5©ŠÉV'×ÉD'}úµ:Vø?;¡“;0©r¬ï@²ÏxmA}'3˜Ô9QÝé©3æáqÒ{¼{`p¿ð99ØÈ*&•‰ª\ö•8¦tú}¼g›b2¸ß*i&t2—ÉGµDè—º†òxk8©kAä£[-èbŸã¦­²¢®Mëdm»ÛºßuÙÛŠ¯}´YQ!ú‚¬yæ¾içÞ©è%ÆÌ?—¤Ìqþ·ám%ÆøN0•¸%îŸD‰™D‰™D‰™D©É×½ã;’J˜d#c*`’•-žÓ‹3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰RÖºjÉ%™cϰi[D4k½ 9Ï'g3ÎI=Ií Nf¬a¹’~IÎ|'sÖ°ºl‹‘Ù÷¿îâžÖô²z,&!çì¨ÌuÕ.j¢¾o.dp2~ø¦!ÓIÌ9;ªI¹Eß»œ‰Ìôo=î"¢íçì¨2&e¦&+yzÜAænÌ9;ª’IcŸÉí¨ú˶œ„œ³£òËn¯“žG!¬J ì> 9gGÕ'}3éÇ3[ÿ™Jœü6ŽšioÌ ×#Åì“Ö‚¸Ý ÷¡ÄL¢ÄL¢ÄL¢e²ïJº)è©ØS.28Æd×ËY—üînÚ!éJ%"Ž3Ùo¾þcºûwñ²¼ùòÏú[ì“t¥RÇ™ÜÇÉ/âúbÇ5·“¾ˆg`ò,N&˜¼têfÄuGþ5“žK©ˆ“L²“›ÒNŽfr G½ I›½£™½ºŠRg²ÙI5¼$ßrr0“[4ú•NšöËGd$÷v2ñp&óœÜƈU%é±´,¼Ü¬/†D)íäX&_ÅUn}M8YöFÈã„”' Ùa”Šx4“¯*,Ÿ“êxß°3jD†–]t£TÄ£™|Ñ[“¹[˜n§ :)“)ñp&éö2'Íábáe¨´“£ï“R×Ô}2”«UÙ=ÚÉ“7¼—†“¿db¹NZ%Ž3]©s‰SÏälN: ®é6Ž\ß­o-Hošì>q2¬“Rwöñ÷ÉR'G-¸–º³ÉA ®¥"Ýg^™»(íäØ>ó39ÉL扙D‰™DéÐLfõ™—?ÆVv¨TºWmb&óœ¤ÓŽsÕâd°WíLFd>d©ÁÉêvw'Õ´»££æ$jã»_ô&ãó•W·»;©ÂÉøèCà ðçj#>&“Û»œÑ³ï÷²Áù\mÄ'`2>ú@r·ääÌLŒ>èÜÍL69é±m:&ãµ¹ZáFŒú¤ûÝ/Á'Øj#®gr6'Z¤£¾?Fh7…ó[ŸZÐÄ÷ɰ:üÛ¦tèû¤W£GNÄäàчó09J'dr˜I”˜I”˜I”@LZ\\\ÈÑs3ºxÇ0©êo3:©Z‹îf¤ LêɈ£œŒH÷`x6…`Rwýá¦wö}0Öo±Þ·×åLZ}*u}‰ÒÔÔ¯ >úéÉÄDÜÔ?9ÌÉòчÈ ˆ˜|¼?ßÒiô!v(âöúäÜNÊnÝàÍ‘ƒÚ83”8éчÁ%Nvgx-ÈŠÃ}] :d»^ïNë|}AóŽ>ŽÉiGŽÆä(ÉAb&Qb&Qb&Q‚0y©/,­ŠŸz‹ë3/«[ÖWDý“êqôŠŸÉÉ$“îý¼ANV¥Ý|°!Pÿ¤ŽB?Ó¯úoìOvßt“WöÇóÜèC0 ó8+øòê=¨ÏÜpRužêg5H§–Ñ-£Ì°»ep£¡$¬ÿiðU‹dtaRþ@u¥ÎnãrÜú 7ú`ÜÂý˜ft]–=˜¤—`=k voYO;íéµ’(sR~éd“ö³Î?7ÉzLF´“(f²LȲۈÂýjœ¨“v–ÜÙI;[wq2¿>IïÝÒIZâÐ[{‡GåêD‰ã?ÎûëdAG®l$¯OnRñêÝ´ã_Ö“V›jABÝš±¡+^¡ãdtýjA‡lwçæÎŠ\Òùú‚r3&z”â„LæfLð(ÅüLFV—JÓ3[]v*ÍÎd(®#:9þ»H|qÑIf2OÈv÷C´¡Ö/®ì>sÙ_Ô}2²/è!Òâð+Ëg˜“nŠÀÚ8U&ãáöp2®IœL3©{óUߘÙx%óïn™‘åLGH ¡C ˜´{òUîö÷¶ôÊÝ‘ù¥²ÓÄì—·ñÏ>'ížB÷mu\£ÆošÐû>û`\”ÏI:ÂÐWÁèéàSé“-“2i\—µÇah« ÏÜ.uhâ6'“q'õ°ÃD¢l¼\Ÿù¤NZ¡t²t£Ž£mG…`òb:xš¾è¸*F.j©cá}¢-`ÈÚ,º(<€Ž«rô!và¥)`lÿ¤·‹°.Ót}Â`[ÀØ>s'¶í:;ÄU3ú@»ÿ„ßÉú€w`²N½úÌ·,c²SÄmLÎédøo_'k˜Râ$GìÜ÷}Kœ &Õ‚‚‰»÷IY!¢h ¸c»»%§ì?úÐí¢.}A€€G@Ã}˜lØsô3\Áý“(qÿ$JÌ$JÌ$JÌ$Jøyæ>YÇd´Ë jæ¾–áãåú;¦´OŸyO'/7ròÑ›ŠÏ:A­F1Ù—JZ¹J5™ØnNf>û Ãv… K ØÃy/×Ií=·ºq.Ì!µéÑ Ÿ¡Cæ™n¾¹Ý1î\ÔTÇK¦“¤Ã3BpõõÙ3SÛ„géýS×­zn¢ÑçŽ>ÐÞ ·M˜¬áØ· ;Ïܾ ÑÙI’»Izî?¢öƒx«pLÚ@È+èë¤/=sÓEeå£0)ܵ–h¼'C—P\ J9ér:/“FábÝö{•8BëlNî Åßö/q²™TäÙ„êøZ*3禷N™˜Q3>1“ZÑì Ž«¶Ý Ï#`_¬Qî×ÌeÒí×äþÉ“¾ˆãL¾Š~J´{&]©Tk1Âd׫ù妰WÒ•ŠGc’U (“¬1“(1“(%ÊVsú&]©xÄñúdG½FÙŸÑÉDÄq&Õ˜ÅñOvŠ_B;þ!g¡•Z_\uI…“¡’ˆãL¾¨`®/3¸ …~}Yöü“W]Ò%ád¨(â &—³]E‰“Þ$×>f!#Ës²4é‚p2Tq’Éå\¿ÌÁÉ„bNþº7_×Èrœ,Oº œ •Eœ`òq1è¤xD–v²&é‚p2TqœÉWÙ²D:¹–̯)'«’.'Ce'˜ü)Õ(¤“K ç%ÍdMÒád¨,âä}òqA8'רòî“åI„“¡²ˆ3ÊîŸëŒ“Wy¦¼²»4é‚p2TqV}ò§(sòêßñòå*t=1¯>Y–tQ8*‰8³ó³ÄÉPä÷¸HË%·S’tQ8*‰8YvwSºìžM Lv}Ç5¡‘ L² Ä}æ(1“(1“(1“(1“(1“(1“(1“(1“(E™ü40°ƒ(s®;™ÒUOË`&[t†“Q&ù¦Ñw!ò™d'#²d&kÅL¢ÄL¢„dÒ¿bÏÍ}ÓçñÖÁB2©ž°¦âNžÈS(“öŠ=!'#Ž+8“äAõËcÍò=aò¢Ž8‰àLÚ+I+;h'­õ,N (“ëoÂ]MEn“» «ÓÎ ü}r}µüŠ:)è^§þ>)„ñe!'Õ:*gQ&åz¼Nò}2(ƒÉK'3˜d'-Ý-©erºUΆê“ð:™Å$;Ip’™,3‰3‰3‰3‰3‰3‰3‰3‰R“'lW“ì$ß'Qâû$JÌ$J-Lþ="àiõ¿&ÙIª€“¹LÞ.jyi+²Ë{`ðøì P#“Ý4?z@'3™ìcdð´3ÙÈä2§o}Àá"ÔW«y|úíE˜_é÷xQÇ©Î9è¼@ß~AÏñ˜`8JÍL'oöõ•ÏÖ.õl‰µÁs 9.t"ûø1jbrîñ –ÂÀS˜o]7zÁ6Ö’=a;Ù7“yL¶:)gìûœ4öé×êXáÿìtNî¤ʱ¾É>ãµõôNfö A<±í2ÿ“Þã݃ûÅœÌ쟲8ú¥]â˜ЂÁ>Þ³–8þýô¸ÌgR>½¤^Úµ ÃI] "ÝjA7ûô‹¬eE)\ šÔÉúv·u)¾+³·_ý8»"jlw²êƾª²·ú\bÌèúwXP&eŽó¿ o+1Æw‚)ÔtŸð´â>s”Çq¬Õ.ʃ<ò¢-Lvwò8¦¶1ÙÇÈS9™É¤|4[>©½6êtG¤|{3+ìÛûí°ò©eóy¢ùŸZnf’8é´ßtûÄ×Äólðh¯ë2­šçmNÒuèÝÎZ¼Á:ÄÝh¯M`.1³šçµ8¹5¤½Nû¯çÖH&UŽöHö©.Œ©Õ4CåÄ‹Ð/oÔ\ýGxœôïhäøiÕÂäßÒDU.ûJÓ R8Ç{¶¿ÄÉgRùÉ—v-ÈpRׂÈG·ZÐÅ>éÖC7Ó Þî¶r¡/SÚۦϸYBΟ´r¡/Sz3ꩬcÒj‹øš&Þmgv’û'‹Åý“(1“(1“(1“(µ0É«/™ªf’´TËäˆX'W“#_L~çTÎ$+$^%f%f%f¥"&¯#"<²™d#Êe’L)“IVøû»Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&QJ3y1§“ú§’žc‚i“RLªGåÔÇ3õðÇs+ÅäöBÊIVšI2)_.GCWœú©ûiÙ'Sò>I–53Y2ŸRò<ûlÊ(»Çë<Ï,z®{.eÕ'õ²=“ê店\”WŸ$_›/åv2¿ì9y¹±“«²ë“ù%Îó:™ÙÆ Õ‚„rSð¤Nr»"î B‰™D‰™D‰™D‰™D‰™D)Á$?}Â8Á$;“ñ@g’I~°;¨OÂr2Î$;”ã$3Y)f%f%f%f%f¥J&£Ó0rvy Ÿy¢¡}ó•LvwÒüè!Ìb²‘ÁÓÁÈJ&í…‰;¯°ïIƒžãF'† S5“t>Kïö'rŽŸËÉ&UØû¬°<Ùgœ{ˆª˜lu²p…}ãDÂÿÙ ÜÉÒö=iÁÉ &uNÜe…}w¿ð99ØÈ*&•‰û¬°ïßo•4:™Ë$]þ¾ï ûÞ4Œ‰Is:YÛî¶.Äw]ö¶âkmVTˆ¾ =VØŸ¾:„É=VØŸþŸ%îŸD‰™D‰™D‰™D©I^>¢&ÙȘ ˜de‹çô¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢äa’¿ì¡N.“£#:¨®|Ÿ‰ï“(qÙ3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰RŠÉÊ¥—žp†[ŠÉïUž|zB®“L²“™b&Qb&QÊbòSÉ—·;Yœd»“Ìb²$ëú]¼bj I¢™¼ŠÝ¼‚ê\Iæ2™iÍws²,Év5&™Ë$;™J’™D%ÉL¢’d&QI2“¨$«˜T+UßF8'«‘5Ü+€;©×î1Ö…I$YÁ¤þZP½„ˆ•ÐI}-3'r²”IM¢ZâÇNï¤.µÔÓI’t2Ér&£”ôeÒXð²­¸Ó›I{±P’åLš×fA²Cî¶¿g´³“¾¯6íÀ¤³xJ§çF´V ëàä¶Ag:cU³>Lî›»enz!¬þLªÕÍÉ“l½OîUâXL’={9éÖõL5—ݻׂ&v²±>Ù¹f.qvr² ÄimãP+;;)׷ݘ,©q»’$÷¡’d&QI&ß?þ`&ë“$LþwyÏLÖ&¹0ùvÿ»Þ'…øÁLÖ&¹2yÿûûê$ß'ë“\7'#ewþ£Ê0'Ë’lWc’™ewÁ3ß(' “lWc’yõÉ’‡çAN–&Ù®Æ$yþ$J<%f%f¥$“uËË>§“üŒDüŒJÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$J¼N/L“ßFGtXYL~Ï‘E™üüƒZ~“a»?Þ";ŸI #“ÁÄ[l÷é#jÄÆä½äÿ¼‰øþgù¹#õÛ¿0ùý·xñýO£„w'YýW«3! endstream endobj 151 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/mnt/storage/users/claus/projects/geomview/sourceforge/geomview/build-opt/doc/figs/trefdodecinter.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 152 0 R /BBox [0 0 224 236] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 153 0 R >>/XObject << /R8 154 0 R >>>> /Length 65 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`ddl¦g6265R0Ô3300T0Ö³3ˆR —|®@ ?ˆ= endstream endobj 10 0 obj << /Type /ObjStm /N 100 /First 820 /Length 1644 /Filter /FlateDecode >> stream xÚíYmoÔ8þž_áoHü2Û¨BzTH *Ú“¸Cý°Ý†6Ç6©²Ù+üû{œ…kI é&ÕöËI«µ¿Ì33ÇãÄ )H)”Š­PZhë„ Â(<´‚H£CXF¿NJ¡Ix§„VBIã~éðç…BEèXz#4cM©„ÁD2V˜¸;¬‹õ$Ä@ ´!Ôiô£íÖCÛ[- ¡ôNæH--Æ”L@L,t„L©ƒ„~Ã^X@$– y”Á ‹~ËR` ÍX?ÍXSµ‹mÌóXÔb=ï‚`ÌhC´‘†¦éT‘FÁQL(!Ì¡ß@y¡k)&$soÑvÏ0¯Ãx&';¨«ùaÞˆÀ²÷JdGù—F_êVŠº(g Ìÿ°¤eßPö¼,+¬ó1†«ˆCñºXO·úv1´s’ìpuÒ´í7Eù9É^Tõi^¯ÅÉãiU° RF°Ö§:n˜ SSÁíT9qÏ[KŠl¿:ªD¶'v^V—_‹òìq4Êm‚o—d¼KuŒA¤SÙ­ò)¶–µmó¸ƒW\ËýãýëõßÎyÓ\>Ͳ«««ô,¯.þ)ò«´ª7â8µ*d][bóÇ(ë› XËf™®Ýú (ò´Ì›ìbV,.feÛ[”Ÿªì;Ð'«e^/7„ÚÆAJqÀ-„ÍJ­­¢ÜGÖ{2ûðç_12;º\-Ç ¹eGýp0™I-t7švã6š^ï0c~±µn÷a/4±F§Ú­‰ÙŽúé óã\KU›º¤ÊÇl€±óî Ü­ý #†† 2©ƒ¾/v˜ÞéeÆ_PËØA͇† iŽŒÀL:tHõ´ ã´%9M•©ç9Ù^Öaî¤ ¹®&4B“kÞÝÐj¤*¶— ©J˜¤ÊXü½ÔÊêqø­yü¾‡ŸGâwŸu?ËqøYmŒ,æ^Øe‰ÙNܾpOÒÅõ‚*ß-¨:ÓÑÅ ªÓñ÷|áh$~{_¹c¾¿¯sÏ÷¶ˆ—›¨xº°qò‡ëêpÿÖÈÐ2miqÕܶï1ùòj0Ù|ˆV&5àøv³vßËÚ½ç1ÏSoÂ$‘©#b)Ó˜¼¯¯§¬TÊ*üä\6uq²j:—áhÝáÙOJG<ôª`ÆE@ƒz •ì%ZÁTqøÞ¦Þ{}|Ñ|G}Ñ{ºšƒ¹;ûoÄþy…«ý¼..ëž| #Ôù¬)ªroÖäbgï©–*¾nÕÚXIú7©IùãÞV§CCŽŠf'‹Ùù‰q¹ü¾~ù—åESµž¯šóød¾˜­–¢ýü£~ÿÒì6—dïÞ õkï©Þ1_¹Þíòb»¯Ìää×c„«¼GÂmI-ŽPò A"^ë ®õæÖ°ð©8+Ê¢)f‹î{%‡_¤ŒcqôXâñ§p‡…Þüµ³__ÄO!v+ Uà U=†–U9»È·ÆOmúo˜ÕX~ªÉ‡¼ïCÊí÷(ŸÆ¯ˆ©5ögÌ\TÕçYsUÕ‹Ó.;µ“—^Sg³|`UŒ¤ÊÍ!CÓKG㇜M¨rÃ9f8£ëŽaOiü†44ÎN »ÍœÝ Þ·¯hl þÿX»þ.Õ4:l|{Á8å«×íq¿úxä=ÚÈ4PûÑÇyý³Ø1¯U=?¯ªe^wƒéa~vÆXò)Ùñ1ææí±OG‚¶Ã@9Ì@¹½X4M3¬‹ÙŽ.ÿ3#p endstream endobj 154 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 466 /Height 490 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 466 >> /Length 6036 >> stream xœí½‹$Iz‡cýEP2e®¹Æ:m-,²úXKpά%DîyÜ:+³áœ“)£1åL;rNÐhÌAc ÁîÉZóÎìÿ`¥ŠüŒï¬ˆ7"~ùþŠîªÊ¬ÊÌzŸz"¿¢ª>°|"~ þðüH´ œ´Äˆ|xH?|é½<‹ëãùB}‰y~{Ez½öC¿¾'c9ô yþz¶48&ÚW"DVKŸ¿æ ÂE’\-m½,|)q‘kÐÝÒªvƒS- ÉÕÒ·Á}Îù|!¹YêÛ—á}˜Î.âK‘Ï-KÝÛQ¼ÅÛ(Þ}ÙÐZ–fM™S5ÏÂçÒLDßöy#f+S,uNùa™HnÄ›‡}ì‘Óßv'u’‰G‹Ï¥…ȃúågqÜÒ¡?#ÁçDŠÀ4j©†T¾Þã–Îå:P´é)Þçi#nE€4ÏÒëë=n©Z­¥žÚÓ7ba­ S›hè~oÂvÿ:B›âòôím¥<ðAù`Jh©R¬½ˆsµ´Â eÈöD©û/4PH—?0¤¥,5!½±¦lÖÊ(¼FJ{ÆJaž®©™~­MI‹61c–`H—Œ­Ñ´¥œœÄ,5 ²¥$b©c¸méwÏÏÇÇæ}Oy¹’óŒñÙ-}óüµdûæÙýnùÚ3œS9ÞÂûFHK%ÙOÄ7Óøïøù郄ývþ0âõöÿµ^ Îyš»b>!•¾2ÒÑóô“ìu=#•ÛIléðy2¶xÙÒáódì—²¥Ã‡-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKáRÏÒ§R:I^•šP=KŸÊ-ä R°Z-}õÄLSS²X-}%˜ibŠÖª¦¥‚™¦¥l©ªZÊL“R¸Ru-e¦ )]¨Ê–2ÓhŠ×©¶¥Ì4’òeªni¦Ûü8ÚQ¡Jõ-%cê™K×\k‰ÀÒÊLS¦Ý+Ö*5¢°´ÓìIöǵN‰H,-Ïôþrìy]a­T!K #½‰Îé…k5¤$––dzý» ©LXkˆÈÒr‹,úˆÞí7?F'ty]dy§R}êž/åädKÍ…¼ý}x¿\o’Þy¨Ä£ë2‰f¦šÅ(z ¼ÞºÔZì›–ú~»uIA©Åäº7ܘڥd]Zé½ãVfv®Úª¸TGa†X—:Îë]î@—|tl[‘Cu•eK 1-tÊÏÖb¦Î¢Œbi ¦…Ê´…ê.É0–ÞÌôÞyóæ4„ê)È8–ÞÆ´PÑ©¯YêÚKÌ¿î7 •±¡þªüLìøÞà#YjíF'.|=C×XP D5ì*=0F²Ô¸¸ðwÛ¾F% ¢Iëë­ÄX–Š ·î>Ö*CõÆ7zÒ,ˆÎÄdvÉX‰Ö*CÜúzë0œ¥™§îæc<õÊBõ–aÎ2¼¥æè QPµÐec15ætkähèø–êãCDIŠ8Sq k윀¥êD©Š$¦2y\£g,ÝoLŸCs>ºÐÀ&’d¬ñóÿ–®;ÞYD«˜¦ôíİt¾C”¨(Î4©{$ˆ¥ÓïŠÔ"JTä0M@šÖ·ÆÒÀ¦‘I”¨p0=®ibßNK%ÒþˆdšÚ·ÇÒD¢Ä@Eò®Œˆ0MîÛ‰cé] Qz "ƒiizßNKïÄ·®³ÙÑ&@…Íôòwžú™fô턱ôŠÔq:» ¢Ó‹>¤^¦9};Q,•Dí. *Ñv@…ÊtþÐU¦¦Y};Q,‘L¢MŠéò¹H¯¥n¦y};A,]ˆêH;":ïʬ ä'êbšÛ·ÄÒ©Ê´›VwÊ{GÐQ©·Ë+¶¥Q•iO’^óg±®NƒHM¦ùä0,UnL;#:1†‰ ñíž—¶¥*Ñ•i_Íîœ?K¦1¢º¦~>Ø–:öHôÊôcœ¨Î´1ÒV–êD'¦}•LªLOj©‰T¼trÐèhúAÚÈR‹hây޳3=§¥a¤#U˜žÒR@IûAÚÆRDIw¦g´“èÆôŒ–2ÒäÙic)*Ñ•éù,½!¤#]˜žÏR\Iû@Joé€%™žÎÒ? ˜žÐR?Òñ‰J¦ç³ZÒ’[Ú8B zez6KïЉ ñ—³YÊHsFd§…¥?èwñˆ>&ƒié[¡wÆÞâÍú˜LdDvè-½J*³Ce¤ÁÙ¡·tAº1…$šõѧðˆì4³T¬PW¤XD}L¡-•y•T~œæ;ÇPpK…dŠ*©‡)¼¥B¼[®ñˆº™"ZªGj3E´Ô‘¨“éi,Å$êbzK‘¾Ö¿Vý,–¢u0´ôNؼ¸Dm¦€–žKÒFH‰-µ‘"µ˜žÂRl¢’ékå”ð),ÅGªjzKщLñ,56xÅ;|¢SÓK‹”ÔRSÒ3Õ˜ZzR¤SxKÿ¦ÔÌ:Ï´HZz¢ S8K­£H¿ÿÓ`®[Ó g©Ž´ Qш)!RRKýb¹nuaŠgi[¤_l·è™.gÃá,><±„œèÚ=r¨³¦p–*HmÅÙRb¤&Pb¨SÓ liD0}ýÏÒuû¨ ¢ ˜~‡gi¤> 2¤P¯Mï_£ZÚ Qr¦FÐ=ƒ[JI4 T†ê{ñž1ƒ[Jˆ4N””é{ñäÑtlK鈦•¡ƒúþI¸™miD)™þ–)mÁ·„HÓ‰2õi:¬¥W¤TDs€ÊPAõh:®¥wÿ\jú‘ä%d féÝïÿªÔ BÉ*Cõ—ß95ØÒ>%`zŒ( Ó_þ˽2ØÒ>Õ™%JÀôA€”ÜÒÚH•© •)½¥u™ÞF´2Ó_„Dêb:²¥¢*Ó[ÊÔƒ*‰^+S)ù'×®H«1-A´Ó+Q¤äߨòé¿‹_×aZ¨L¨’( ¥W¤òÃüU˜–#Z…éDtFê`:²¥wÓU¦%‰V`ºuk:²¥3RñëÂHË•) •)±¥ÛÏO”eZžha¦3QDK÷¹/xd°P™rP¢3RÓq-ÝÞ‹r‡‘j-ÇT'Z)©¥ QQŠi= 2E ®D‰RZª4»B:ŒT—h¦Q@K5IËhZ›h ¦RÓA-5ˆд>P™¡ÚD+#¥³ToveneJCôF¦¢0–š’Š™R•9u'J†”ÌRÑ›ÎÊP=ÎÔIÔÁtHK]H3¥*sª‡h]¤ä–ªD'¤G˜Ò=ÄT!Jˆ”ÊR'Ñ£š¶ z„©OR KHs™¶*“ ÕKÔ>g dé¦íˆf2õ6»•‘Yê#:#Í`Ú¨L:ÔQK½H3™¶&šÎT%J‹´µ¥ Ò4¦íÊ$AÕˆþÎvEª3ÏRçNé’tMû šÆ´!RKý’fhÚ Ñ¦:Ql© éÓ?Ìצý•‰@ÕˆR#%±4Ôî¾¾,HÃLû"aj´4$ék!¾_nú™öTÆU'JŽ”ÔÒR/Ó‰ú™Æ‰Žoi°Ý R7Ó>Ê8¡ÚD‰‘RX‘4¢i¿DÝLZD‡µ4ŽÔÁ´g¢.¦¢ÄH ,µ»"À´o 2Tƒh ¤–F%U‘êLû'j0uŵ4 ©Ât 2;T“h¤õ-MhwÝLG!º3õ…³4AR'ÒqˆnLû@ZÝÒ¤n¤Ó‘€ÊH¨>¢h–&µ»ÓшJ¦ÑFHÉ, Jj _•Z Âü·5d% fiZ»+ ¦Œôpê[z é€L3ˆ‚X#z6¤÷¶u™¯£HGoy-¤Qj¤µ-½^MP3‘Ç4“èÐ–Š‰iœ(#-K¯¹$ ši€(¤¥×Ü_쇜© ÂÒ¹áÕ±šD‡Þ@2‘†$E±t¾c Ši–¤H–®™±"# JŠféš‹MT¼þ_íî8Ló$}'^à,²#ÝÚb¤aIk#me©£Ý} HcDÅ•)¶¥ÛS ¤Ã0Í•ôŠtäo';!R…¨éüOÉ@–®Kš†tL¦ù’ÖEZÙÒ"M‘”-í;ÙGâÄ–Á´„¤À–ލi I-PÓ"’žÈÒáªD[!íÌÒñZ^?Ò ¢È–§iIÏdéÀH36ŽÎeiçL I mé`š’ÚÒ±4Í"ÃR›é„ô³ÿ0ƒ4F” i3KÝH?Âd:"Ò\¢À–^‰ZH;fZLR\K%Q¤ÙDa-ýl¾†iQ:¤ýXú"~žo ‰4‘èy,}™þc õÀ J féË6dA: Ó,¢„H›õœ‘¾hƒÆÒÔ‰4Lô;ßè, !}±ùvÉ4‹(%R"KïìG8>3TË« M%úÎKn$K—W™†t¨–×ÔËå㼆¡AZýÛɼšæ íiQJ¤D–æµ¼c" ¾ó“ÊÒ2-owL3$>ÒDˆ´þ÷ñbjš)©dú.@nDKq‘¦%DJðÝöZÞË¿Y#úbšMT¼ÈýKhzÂbÚ7Òoíã&s¶ÏÓ!%³ôV¤]15ˆ~kÙܲÚ{ꆃbivË;}GךnH%ÑùûiL ¢0–fk:ÅŠÉ´S¤ë»šDÑ,MFº|iNÇšîD¿ÝÚL-¢'µTü¼~R¿šnHÿ¤5™ÚDq,ÍcºU¦[MÝDM¤Ê÷àÐ"%ù•ácH»ÕÔƒTgê"zVKýšö†ôOæ…©“(¥XL}’z*D,ÍDº•¦o¤Q…©›èy-õ"í‚©_R±-¹‡(’¥Hš$]ÜGÉÒ\¤+ÓáN î%zfK;f&ª{²IÊÒ£L‡Cª~Õ®EÊRMcDÅÇm«×&zKÇÒ4‚ôã¾iç Šei¾¦sm.ÿ¢ì©›èÖP¸‰bYz@Ó©8ÑÓ¤[¿1'ÑÓXlzûD Ú)™¥™^DOLý’îÛ¹R7Q0K]BMo—H-¢êo„H¤¢h–ÑtŽÎ´?¤ú¾¼ø‰ÂYÒÔÇô25c½0u5ÅG¼|ãåƒf馗¹ë©ET¼öó³4ŸéԳ쥦¢ !>x–æ®N—¾‚/½"umŽ”ÖÒ¢•€ óu;Ç–™OK•‘9Ls‰zŸàësP‘¨õÂí‘…fÓÄR}\:Ôl¤Îgx¬*Páxåú¸Rsia©9*™i¤þÊU'êzéʨb3i`©£¬iPó‰šO Ô€¨ûµ/cƶÔ10‰éHCE#*@×¥ž7jÊîŒðÿ¢«/;Ò`ɨˆú5×ÒëK wÃBÍÄzQ§íËÐimšÙ4´–·ã“™Ê¤r½ˆ8P*EE £ZÞÛ΄š†õ-¢"PA-ÙLEë2©è&)Q Æ´4väzJ>Ô«k¤”î4?_ †´4z~iΦpa¤´ŠŠ@F´4~xM>Ô· Rr¢þ* hé~7¾ðÙL!¥(Ãx–*÷R>ê¤ï’zV·ÃYšÔINMÓPãê'·§Z b4K,|Ô<¤íxŠ[ßèi³ °Ô8–ºðëÃâPs6jp×­mBoÐüYÔ·ÔÚ¶KŸÆ.ןܨÕF¾S¾ô¤Qï$§¾¥·n­¯?êÇšˆ´iƒ»ÅWŽ,-±ÿµýì«kø`Â:¶qƒ»ÇSq,-¶GíÇš€´ž2î’ ciÑc$ûo4kXcH»â)ã,Ê(––?êec—ÿØOWY±´ÎqLåÕ%V©ñˆþxÊ8 3†¥õŽL«Xé“§Œ]š!,õî‚•‰Fµ_xžØ;ë#XZjB'É–Ö:y’Š'×hΗ2Q+õN®‘XÊD©vrü|)g ÎùRΚqÏ—2Q_ªÔˆÂR&êM"XÊD©r ¼¶¥L4˜§À+[ÊD#©p ¼®¥L4šò§À«ZÊDRüxMK™hRJŸ¯h)MLáSàõ,e¢É){ ¼ÞùR&šž¢§ÀëõjàädK9RÏRN£°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸ì–¾yþš-Eˆ´ôêæÕÒoä]¶tü\-}¾^Ɇ÷zõ-?O?MWŸOHy]й. RÞâ…oñÂ…÷Ká–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ËÒ·­—ˆsk K¿l½<œÛ£Yúå¾ \vKýàŸ#9 &²[ê}„x æ'Fd¶ôº½ë¿<Šðx¾P_"D¤¥ÁwÅ£çP'Bäj),ÿ)è|Ú endstream endobj 157 0 obj << /Length 1515 /Filter /FlateDecode >> stream xÚ•WÉ’Û6½ÏWèHVE0±‘`r²ÛY*±ãè’ŠsàˆÐ1%($äñü}h€CÊ”—R• àõöºIWüèª.Vç¤jµ=Üa¶¿[áàí«åÖ ¸žH>ÛÜå’fzñV&ˆçDIoÀ²Ê6W,ÅH¡ÔÔPÃâ‘©è¨îDƒ{Ó%]N'€¯2ÝôñÊgº³^¯{ð– ƒƒiÛ.ŽíÎ?%,æ43¾LÎÇ)8Ý£3V‘ŠE{R„sÛ[ï¸û!de!–päö½Ö8ì ÜpÔ¾÷ú§ûÁêˆf½µÁ-aÏ6Å·6øhMqlû‡ùâÝEÉ <1žUˆgœÑ›Ã ƒŒ:Óæ]AE‡0«žl*x=˪0`Ý퇣Gø•‡¯½z ´Ê× ˆ¾d¦(u¹*… %ØÕ3‘°FŠþÀåž*æ3SÎHûדxãòšlwç^#RFä%4Îj3h×É+IÈå¡)C¼iÿÜö63ài1¢Žs/ÄQ`Ø!š]\ͽvDâL<ìÁ¿A†f<0 Sn–3¶­H)hJ:×ë±»ÝRz IU“Œ¢œ… *P>b¨ÀŒïpˆDVõ§¶KÛÅ5>dp©¹ôõ¯‹,BI]UIæöìœ=F°Oñú®éït¼ôµ¦[PûXÚhA¥H¨UÓ¬qç[‚Í%M´T²)-áRp&,D¯ôøvoŽÑç¡à¤D«‚ú°ëšÚÃHŒ?™v¹Ð”à>WïE4WÏ/a_Cβ—ä ‡;‹‡·f8˜aˆ“x¤ —¤âõÜŽa7I¹øß˜`Бø¢Jyé3ëÉϹúÑÞüñ¹&)~Éî"S ³S¨[¾ñVQxv”pvÍñœßÑI^•b¢cSpµdCÏRUc:½ õsÐnÉ¢¼€ö¡üÄ__Ñ(`ÈÑ›¼†ðÙnÙsÀ¬šy.„Ë„rã•l΃Ží’þcŒÓ¬‡Âôà[¦;s±Ûêµ;÷ ¤R‹‹Œ1.|o1åN±ÿ0ÎÄÄ”¾»ØÝÀ°·ç.2Å £ï\kmȳ &Ü{Ýö‰uF‚i"Ï`vãÖ÷Gëpú]!‹áÓ2%#BIH·špõÍU*m_?î_ˆÛ‹K¶üW]%ê)®ë%* ÅüÈØHJbÒ* ¢2$d3®¿é¾Àå½=k ‘ºÁcíbby1Z^¤ Ä£ ÷dô©NÎôAQ•Ù‹‘T{»f7¿B£JÄOˆGâ¡È³h´°¿o0Ý д}¶òÐÂ;~KΚ˜pã?dB?(¶¶ƒ/«]<e·|·QïÏÔGPºä#¥<=aÿîÿ 0ùÿãg KE+/ Çpî—<†Cäȗრ¬)¹òù&¡¹q㇢óYé÷‰MƒˆÅç¶×Ó(ðàÉ8Iÿ66Eá ÿ1W¦9¿œÀ>?2q~ÚCß!ëIįaÿ´ÔÍÃ5líö‰µwóÐ VqR–2 ÊŸë „tk!S¯.$ŸA‚(PÇšä×Â÷(Íî|õÌÓ¾òÇDÌa?º $ªÓ¦­í1Wl߸ÔÂD|s>m5!ÕÝÙüƒÜß&µb!±BÏf"•ü„mKøÿÈS~ endstream endobj 164 0 obj << /Length 211 /Filter /FlateDecode >> stream xÚ…ÁnÂ0 †ïy “C‚“8mÃqcLã6”Û´CE­TÈÁû¯¥ zÚä‹e²ÿO¥Á#”Ö*OìŽ ¯Ó|€©Ù¾2}ãäÊùØbíhT½†°ŸŸ |ðç¶þ:Ç,¤µ–›¥DŽQ¿œSîê^Hã½+¸±â3lØK¸sÆüëûŒ¬iUéÊ^¼ X%öþ@Æsÿ„×HÖ€Ð+WúÉ`Ý.9ÞT1WÈqŸº~\¯OÍĬҠTñ&îê669Ô¯ØêdQs endstream endobj 170 0 obj << /Length 3001 /Filter /FlateDecode >> stream xÚ­Zëܶÿî¿â°ðÒ¢Dê‘~izuÜ+lLj/@Ç@t»¼]ÁZI‘´¾Û6ýß;Ã=ç[EŒ,_Î çñãðä…ÿɋԿˆÃP¤*¹Øžùv´Ù]Pãç×Ï$¯[ÃÂõdå߯Ÿ½üQë é‹ÔOåÅõí”Ôõöâ£w¹ÏêÎ4«u†^øýj­”ö®ÊUx0œmº¼*Wë ‰}íjõéú_Ï^]ê 8“3\ù€µX‹E µbÖ¢D *b-\­u 3¡œ0,,…©-dЇ×û¼åmPŽAÂ@{[Ónšü$Š=ÓÒØ¾ÂUwôÅ ÛÕ‘:9ëaµ–^³’^¶ÁVG“wy·§ÖkSpá—Ü0•nßTÇݾïÚèP[CcY¹¥ÆgüМ#Ø7k¶‚DÕ(ª(èŒDJÖŒ¤›]Öty¹Z±&>@W–·šd*dôj2xÜ¡wlYAÍ;d'Ãÿh «è·Å¨IâÆÞÐHnusG9 ´óÏ:\xªIß,™?å)”HS4ËÓh³Á_•xpI’@¤`Pü“Ý,cV÷¦èÅÉËmºØÿÍ×>Ó‹f^¡…Òn»V~(ÂHá4­>˜¬DK’©·Ï;jà‘;¶‰%I¿Íw®-´ˆƒdd„ýÐE B+ýUb©ü´_Á–*µá{WÌí¡?ð0ð½.£…4µ4m•Œ·¶ÖlªrË Àc·ƒd-¸þFQÿ•Œ½*™lÕÐä¡j¬¢@¡À¶ŒY±læãé!ù]-#«kë1&ãÐEÑáƒMVÒ(ù—ÙåÜϧÎúOö>ðhüàp°¦¾E£Ï:SœVIèYgEGM…ZÇÄ»Õmy6…ÚËŠ¶¢b¼jÛü¦04ÙñTËBmòÛfc^KÓ·Vm0ú9Y°8Ra" ,?0fÆ˱¦N‡îz°”hÕMo0¹Ë¿ Zèhzñ&G“5»ãÁùpzÕR¸ ?Ħ›Õá0œR‘—ÆZ¡ò>³L+A •è ­á'ʦ¡aN 9C³9f>2M6ý÷ë G.\nc%û`8çÙ„(îãå”û7yÉ2þTÛóùô‚ºu¶3ô#W‚þpã©P_É—¼ú –D­Î²VS´™¤O$%’Q<È#,´X¼¯%“”(ýÓ4¬’¬a †°Yž<ÍWõ`Ûh5d¤“ô2ø^V¾·‰[Ç"Xˆß]Ñd ûÈ·¾qeðVL<Fv.Z2 ÷+o ÛÊç+ g¾÷ae}‹ÃÔ3¦i 5q“Y òy¨¡×Ó¦**fŠ{¢PðN£{0”ά:L„’éD0Ømçâ“Á,ñ/+áêhZŠnàM),“¬tu®Ò7O+ý6/Œ‹¯ ÀæT’#*­ƒPD²F±ñúò 5ØÖZêåN É8J ðá7_*7à\i8ð>®ððö9ÁJÚbHžØá4³`n ëfáÈÉÆnF}…Óèb%‚4ÔéäÏA8ÈéÁXIßS”¡¿Ü¼ìÓ_}ì8þþˆ‰¬7µŒ,`r=Âê–óòÍ ZâÛa@d‰/Tûòà[ÂvÿýzBÀó–Û<¼ÇÄ´Ûed=é§B³@ôÔ3Æ¿šyõl.‰Ž¡¾”LâÿîR}¬uX‹ò§ Ÿ'¾ˆà¦–r9xj Í;&T fbè6ÑëºÈÍ–´^ä« HÊccÉÚv¹l"’9zIáÆ¨½ï°óu•¦ ¡C†@[Õí-‚Y'ò]?¤ù!/7Æ0¡¥>C,VGã­cS·†±Y iâÓÞ´¦µrÇÓX‹ö6V|YÙËЈø g’ 8ŠW F¥Ñë8úG„«^¸$YÇpÁˆåª=!И¶lH:¶ç$¾³ÙÎǪ3[oE—×…S—À… äÒba ü7¬zð0ä|›è¶}*R‘ˆBù­ùòmër0A<,+Çe‹tZ £…ãD“Ëš¾Ìà~ßö(† ïüÑU½ä]n}„ÂmÞÖç‘GòUª µfö¯¡R¼n²øâ t€Q‰=êÍ团Ð]]¡Í»| ·)··O´ùÂEi†¦ö&ßí;'W€n£aÃsFG 7ûAu÷‡G"Ð p<ÍÓé,:ŸÎ@Š|ùÕ6²LÃð‡4 >A³R))¤ioA4 ®‚k7%l²xmþoþsø@H¸AÇNo*Øñ)¸|.Ýà0"p8 ñ‰0y`¿à´iì2Œ¹›ÅSûq8 Í Ã†\'µT„©z’Zä09,YN `_lp%’X$qê°‘¥˜:,2ë¯Mt}V/cuaö«ó{S`žë¯„›m^f݈ÑÍ(ýæÀøöãf÷écÝ~<–æø/úôÉéE¨¨K½¿zÿêÝo_¹è+-9¬üóIWº¾|ÿþ§Ÿ¯,KW‰`¬dfwÖ<Ã(uKG*ev¦$ jrã@jU€¡mlŠ6µ-wÀÀbKîÙÀÕîì‘Ð1"•Q0ýîÉúóÑaèž:6¯Ü÷°Árû¶njºæDk¶YÇ| u½v¶fÍJLbéEIç6ƒ¼Ž††F®"Ä.¶>E…Õ¢€S¨,ctÍ9—c$9Ê„Í}ì¬<Šïs8Õßç{ÄÊûá+œÈX‹`T^}.+ùÑkK”IY ­,Íðâ€É r<Ñí¾:[< éÙÒ~¨,ì—O·4Rç}Üv‡3Áe[cõNûÔ+ ]ï›S··0çÌýŒæiô*ï¬UüzÍLJCt|Ž ýdThϲËPO¨ôØ2bÕt‰Œ¼_Þ]ýºÞVØq¼å4ek\dæâˆžXj¨G­ Š?ð;C’ '`ogXol扈u2¾%‡VÚ“"¥·W[¥—5ßé3X‰õ\;H£\ÒñjŽéj(ú‡xEâÀ @ËáÚ'“Áuî#ð·ûÖM ÞËDÎ,ÚV‚© !Èpþ\1Ô÷ñ `^lÑ"o;SR»â_B øbðþ‹¢Ö uÇŠ”íÞ<Še…˜sý±áÌZM¯¬X€‰b[«ÀM¬ú°ñû#y(JÉö¢s*M¤¶XŠpña´|=UŸ¯–êóÕ¨>XKX û¨Ú‹hdª=ŸlŸlÅ.oi´#À-Í>®ÚîU ÞóU;+äN\=Ší­ð¼ 1N{<Ï>UØGIû`ÝöTVÖÕN·8ãÜ6MÜ\žŒVc˜G»I•— |rH‚”-'âŠýRæ÷4Ô»¸eì¡‹Ó½Í(`¼wÞÉ%àÀgN¸P3Þ#¿g¸}é]Ý:):P ²9AÚß MgË£i/´2úi‹¬å´Éç/ŸsFá(PÒ\Þñ/ÓÉÚöh³¢7@~6Ší‹õ̎ƺ>%–ü{ÓVűãÑ:ëö¨L„!AèU°ms—·<Ëé>éÛ>ÈÑWcŽ 9<0:O'è/|z™júB= j¦Çå‚nÌ.3\¤Õ¿üçúíû\ýüß—ýöKwÉ6|GLkâ¹Éð¢Yýê,6ɪ  €¿Ãã vÚ®1Ù¡¥Ž ?𠀤¡ŠŽ?ÍxÅX¶,~±¤ÌæØÀAsqFš¼ýü‚J@Sx͈r¡‹i"U:{iMqKím5üñv˪£ÆøîŒ½¬ì7†ûæÀJÜÔÙdG[7BŽ’„L×"(9svýNYQÌxUÇ,ˆñ½[*bú\¨ñ-YÛÿ #íØ é¸F…jýLƒ- ¸ÁA69A}À—kúBª?ÅPþðæcEèó:¯\Ê]¾iO+J]_„µ}¨fïÔ®¼‰}½ºÏ€ColXÿ±–ùW endstream endobj 182 0 obj << /Length 2537 /Filter /FlateDecode >> stream xÚµYmoܸþž_±( X,Z¤H½\ú¥w½Ë¥H.Aâî”^É^ÕZi!j㸇ûïáZiÍuˆïœÎË3³|•À_•É*OSVÊbµÞ¾Hìèp»¢Æ‡W/¸[ÃÂx¶òû«—?)µâ +“’¯®næG]U«_£6z7ÖÃyœ¦i”~wK©¢×ݹ("Öë±é»óXy¢"¡Î?]ýýÅWÓ…JˆgR†+“–ÍIã2gÙ*+$ã©$êâ·xãåOy²X¨¶ZÓ_ÿ»^ÞÖ´vɯL%å*æ)ãŠ6ü­1»V#‡Èný–¨d‡LF½1Íu놫8´YëÖ¬ÏEmÎy¤»Û¦»…m'Êè¶î·õ8¸e¦&ñQïfè·Ô7–B ›¨áDÎnèo½5Žú…HdÁ²\zNñ3îonBŒ*Å Øì…2„Žã’%iî׌=ø¹©ïƒçåLä¯eçq–&ÑÕ¦1 *¥Š@3ö$ìµëÎM½û:~cžmi¹d¬¡§"Ú5$ý:D³ÊX‘O4_ŽÛÝ¥'ûòé§çiΤJýÖ—pG–Á›ã;ïéæµî¨¡×8¼iêÏç–;ˆ ؆q7¥diºP§ú·„§@šŒî›qCÆdwcÃlê¶¥æú<æQ¿Ýê®52Øû.Ä´(X—d,‘)ݲ½«°R%ÔR!ÚÞu}X;——Ý…Ä?¾ D³ß‚Ö#z¥G}AªáÕerqë¾ëHXðiFöãw1´÷fG@S8ûn˜áu×¥ðj›–ÛúÇ/¯ÿWýV71½™õòþí8†h;ÛaLÇc¢º 2pä‚–žÀ3pŠÍÆIK&ðï$§‹ ˆß4Igìb¸Å‰¯ß–Ôrf@5IDX-yžC(ž°ÓI’Àueé$þ3ÿ],°ŒÈ{g3šº½¡6ª‰¹6$‘dLfùQàïG§=ús*¤;‡ÈlȬ­&ïáÄ¡q•›ØA´Ñ{T4ã¼¾,êä¸iHå±cã:Î^O‘¯ I8|oO®sÇ\€pyäB‚‚LIMÖÝõ=8Û6ø¸œ)93r¼6 µ” €R}ÝÚ7Uþqe´7n¤¿¡wÎô»Wohâ¦hæˆ%xŠk6z¨î‘]=¸sõzm  ˆ?Ú8 ƒCÝUõ%Ë“±<Ï2µ #”#¤…Ó ¹n:®Ûm¨aö»™– %‰~œZp† ù»¦µzM‡:È AqH·Öª¡U‘ðL.8YŠ£»qÄÉ€Þ ;³étë!ƒSõ—q?Ô†zÖ”q8tíÜÆ ©ßt•uÝ÷ÆÙÌ+Õ·:ˆeL§wfÓ£ˆgl)"L½w-Þ!Ðܺ 8qzI;ŽXÚqé·5 µÍ¶±ïlwKn I%G©°S^ì9°Ó]ÝšÿÁ>ŽÚ>ŒÊ¢ý޾Õ!S#¼c]O_ºU5@™h²©Ý¦±áEeþErzÅEôÞš‚¥Ö®Øjï` sm…QSž½Í(jT¡Wl5eР¨èøÝÈŽ¨é2žû„èQ: mÁ§çý— V¬“¼‰˜À¼é*P¥ap숰ê ÷z ŠGQA*¦F»<ËXYJˆ1€Íô›Ñ®ßÏ€ÇãkÂh—ËÒÁ]âôˆ<#4>9¸3¾iöø¦ÔtÁÍÀ×­þ íLJºœ‚ªtGX Ížo¡MA/ô¤É¼œr†I,Áo¡†¨\Z«Ã/žÑè¶ù&1â俜/C0•Ñ÷4\Õ7zߎX9PKÎcêg°éÂŽ™3ÖÛø¾©êõ ™/õ‹=YÃPŒgD§ƒ 7}Û’£¶A®òpÁƒˆg,†v¯ßtA¢x ÔL•’?ÿþó»·?þqù$a&ôm™‚œ…’S ¿q6#MÞ“.´núç{)à¢V›Ñ9ç"ù- ÷s}9Q×Z¦µ¶²àªkvºø8izv˜ö]°6™ÍmÌþz/®=eœ€ÛæU›o±Î2ey)â9§Èrï@lÛ(&¶‚ãjiÆ m܆7V±‡ ŠÓT¼§JÇaÜÇB»À(Ï£ºh:_×±DHÆðÄÇ‘š\û™9„{QÈòÊ/óôº%þÝ:>/XObject << /R8 190 0 R >>>> /Length 66 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hi`ªg64±°P0×3´´´4U0Ó3#ˆZ —|®@ P?q endstream endobj 190 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 397 /Height 310 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 397 /Colors 3 >> /Length 6911 >> stream xœí;²å4׆õ ¥ÓŽšPEG$=†ÑI''`ôH:‚*F@)Sùw¡¿.KKW/y?OÕqùȲ.¶üîW²lÿÏØæ¿¿ÿþ{FÒüñÇï¿ÿþéÓ§‰€ü>ï2ÈÈ?þøŸN=þÿöÛo."u®ÀðôY²diayØ‘á){éøO§‚ £8W`lÊ`³™q™?Òÿå—_^ù©y<*€Hܘy—ù#åï¾û.á§ü–,Y²¼jHUÚOY((K–,ŸséUèl›²~ê±a¸…(Û¦¬Ÿzl˜4Y ÇÛ·o“¶)ë§FMVðÙ_~ë”%K–ç¥û·oeíÚ<+—޲Ÿú£{ÿwî÷˜dàµùû éGgåñ²Uá§,TÆ2P\Ü¿ó§Îéè¸?þ|NçqZç§’Ðs®êQ™Åø2,Î=wŽÅU Çv 7«Î:¯Í8µ@ògDs"‚h›ù©£Ùù:\"ç’ØQÉþòÜìØ¯Îµg|%³ý”R§Ü×£½™ŸJ6”çi=g‚ZOº¯:¶3ªƒN)±ã§Üë®ß~JÓJr&?~$¬¸ü/p¼K.ýs„Üz3Å‚iª/'˜‹£L¼xlsûÛd ÉŒ†TGn BQ…Š e0 ~Jª€¾ÜÅúuµK¡©%7%×/Ñ©¸.ÊÜ×[e:.ÒˆsÕr%﬎¾TB A97âž~J?zï9g¬×láÊtyƒ#„kÖ5ûjò]é§ôÕ/¦æ¹ðØÊUÓWG>zÍb¤/ÒvÈ×fÑžŸÓqFü”2× r­f[d,—r“j3ÅßÏ8NÎMÄI¦£9ÅËFNöÂc«OS(X›NUe]´x7)'^›ÇU¬©¯!?U¥SGÞ~Êe. a¯±Ú$äÄ9/sñõ4›)}‚šDš)e²mÓom3Sú¬7¢è§”:eËO³ xäÝï§4M§S§Ü×cÚ 7>»*M}èÔìc«—˜Q:Õ#‘E锳ÞŸ:ÿ»‡ŸJ]¦ÁO¹T‹wê £a=¨WÃϬòG¸ ½HU`ñ±ÕÿH$Ë\ýÎê´mº‡HyŠ×fð3,¤ãŒø©6zæOyŽÎTrSn—s`­Ö$C„v¹NÉÅK¦|Äœ}lå4«¬œ¦:ÅMšÃ(þ6:uÏû}+Pä6r`æOIA¤€Ÿ*T@‘Z~Jª\Î?¥ß?i¦ú)R­ðS`¶ŸjN§ÅOù\5Ÿ²–Ÿþåòí°dÉ2XŽº6ÉëOGòSŸÿ;þÝ×/gù Ÿ¿N(ïä(˜bàµ9*)ÉO}øð!Ȳj `ÞOùޤçÕø”ÇkØcå§Ÿ~Z]@xnÞ¼ysø©#ðíÛ·¯têÜÃD§`%///?ÿüóùË¡>ü•N®ÜW?õ×_]Rbx*~ýõ×ÇÒë”ö~ßá§Ð)XÀY§œrþ”ÃOÀBðS`üX?ÖÁO€uðS`üX?ÖYá§~øá‡8ðË—/ðÇÒGð+cÉ囌9£$“êµ’ãZ®ˆ|œ«Î NÙ-Yá§rç~N)“K2¤H6úþ¬½B‰ÿšB(›¦Øçc…NÙd‘ŸÒ7”4èÔØ"í®S3ŽÉ êØÄœŸ:wÖ†_iÁÖ#— $£:;šdã@Md9|Hù…£×_B9r[QsÂ*·® Ŧ8¶…€’+ýT²·å^7 yWZ2£Iý¾bvÊÈúõQåw©S0ª„ÉmåÔèÔÔ³SYä§‚œ(M­óbËå+d4O§rÙ¹¨¡Ë&‡'é¬EPHåiª*aOsÆ\ٺ佔á0‹~êÌÔž‹\’:åòý¾d"Aúktê\N}u4% BÐ)Èak|jìYßB§ŽWRâa,vRkW:¾ ÓféA§lbÎO=§Ni"+u*¾P; ß\B9=æü”»é8zÕ’+›~}ˆN¹×樿TA “ÚŠ*h‡æÀVtj=¶ü”ûÚ&~üˆ‹„gÀ¦NôSwuþÌ¡Sð ØÔ)7ÐO¡S3H~¨î–Ÿ¥;jzËÚíBN§’š=sŸ¡Õž?ÕËU:Uü”æÍ®g›:ÕVªþÎ^u4lê”ÃO¹D§r }÷¯. ÜC§F} |/ÊŸZÇz:·õÜÏ”†P{œ“ñçÂóÛï§ÎõM†»T¥ðS½\¨SBµé>îAó˜`î¤(O–…±ÈNòUЯà§zY¬SC~Kõ‰è½›ÿy "ËýPáúŒ7ɳPÎZu(ªF›^TUv`¾ct*?Ö©s‹áø©^®Ò©¶*·§†˜Åá|a÷!:U,çpj‹<Öáî5>¥Ñ©`_C~JÿÃe¹ó²‘NÉ~'© 1åÝûuJYÎdWBÖ©ÚqqtªS§äŠ\é§”£ýú›—°£NMÍÍ…bL™6êï¼£SþßE~ ªEãA£Q4/mÎbõÑ×èBJRÛÂ÷Õ)7aÝá§Š Sqdk:å¢Öü› w:šuJîMÌw,6ç%\ã§â¦ƒN4ˆÈ¿çɘ tJ(gq8I_#÷ºQ%»`¹@›Ni˨|ÇòŒÏ÷Å”ïD§Щr‘6 š¥¡ùt´%Ò³ËlêÔ:?%üŽ¡Sgô=}oNÞQÞdA§ªÆ’„¾^­™ª*:Õ~ªãóÑy JÛ™µ@qì¼*µÚ2 S=XñSA¸c|*OÑR/È6«2#0Y`9NƒGKæ²X§Š¥b|JÀ–ŸJ‚NÅ(/9akm`Õ0péߜôhîU隆6ï階êwbS§˜?UÆæû§r£ÂÂ^¹KWíÊ™LçZJ[[tÊÿ‹ŸÒbù}ž¹a}O§Óæ,Щx÷\!‘e:µjßþwrè”ÿêçzðSð~tx|k¿J¤ÜU~ʯXûѨ‚çáÑÚ/)Çû§šA§Ãû§ªA§ƒŸªX ~ªt `1ø©jÐ)€Å৪A§ƒŸªX ~ªt `1ø©jÐ)€Å৪A§3ÑO}üøqaEVƒN,c–Ÿº·H9t `!SüÀ@¦ø)€à§À:ø)°~ ¬ƒŸëLœ?OÈÇ~·h0plBÌŸ‚a¼¼¼4ë \¾ ÍòSmí¶¦ù¼Ó`À“k ýÍîÙ@§ ¥Ná§ t :ÁOÁtÐ)è?• ù tåšÅ²NÉß»¿„ø»ßò—Àk¿>6µ5à§ ,;m6ÛÇŒëÔÀ‹|Irõ6éÓ×o½ üTtªtª t*?U yÚÎ…c«yn7G4~Žì~ŽÄ1ØhjÙQ§‚ë?è §ÒE-áü¯{}B…ÝãBj“ ºLS lKÍ-?U@þqË­+£ëÉ–jó÷­ŠuÊeÎB|Om çÜ‹áéS[ß8ñSŠgBþuÒGË]7À¸N!E‹‘»Jk[B\Y§r¹W5­b¸f/·¼qâ§ û}NüuŠÿÍ]qüóÖ­1®SÊß¡ø_ý©T¦`M§’µsW4NüT¹ßç­AŽ&dçµ)7Ö)Í©TŸr‘š;ŽõSÉjºU?U@n4n²N ᱯNUõûrivÊG2S :¥Œ3üTÙOý ŽJæ¢w×\ ±©Nµ@ߊ~JØ}H‚úõªâYÓ)üTèW¾D·Ÿ…hÉQ YÚÜþ>g^§âÀ/¯ç—¸Òå}ìuDÖÈŠ«iHµ ºTÓŠÓÃkSsKÀO-ⶨË:[€ŸšEîø A§ üÔDr¶ùÙ@§ üL‚NðS0t :Yí§&WŒÂ÷f “u~êÝ»w3*[РS48³ÈO „ï!€uðS`üX?ÖÁO€uÆû)æÂ<3ÌŸ‚NÍŸò3J'Õ,óòòÒ3}F‘`/rMhŠŸâˆç„çf “uÏ÷9a柊÷ïß÷ëmæ&÷¥ƒxÇãeøU!rÖò{þA`’Nå>pÞ±öí©ë?LðTïË_¦SSü”æjâœÿmS%tj3tJÿ):§á»2S©Õ©­u­¨Sg=Ê…_駦êÔùS?¹8U¹·%ò´\¨SÉ$Í;v‚N¹ :µÂOŸ?;ÎìGЩd„Ü.ů›ÅûÆÅãS‚Nåõqr À‰Ÿí+6°†Äwÿ˜£¬S‡ ›¬ø)ù­G"£tªøÅWe|ØB§\¾¯§o*Åõø¤=‰lÇ2šî§rz4O§ª²ëé<>-ót*gO‚Ý«®íX­r}Ì\.BŸÔE:¨h»·N"•ÛjÈO Ñ)——§žìЩìø©\;‰ Ø¢8)Müœ°¢SçøÍ:µŸrè”ìèTµþ¨ÿâJ¢öT:å2yyÉíè#à§´Ù¡S ì~¿¯SJŠzœ\A¤\½N­ðSnÄ8znSœNUv¹ø °ûü)ŸR®ëÍ—&‘íP>7cn|Ê5ݲmÖ©\²²,&‹9vŸ®o:ÿÂÛmq|*WAW#¾Öû}E ù© Æy¶çû¶¶˜Ï2rÃý”ñ6ý­óIt rlì§hs·ÏÞ~*yg$GînKqÇeäî(?- t*¸;òÂ@AÛÉ¢¯§ao?¥Ÿ‰çW4ù4iÎh[É92OÎl’ç:¹’ôèO““s­a{?¥?ÇÊ Ç蔦êÔ1Y©y>ú ·òSÁܹb³K†)!.šîpnß¹ùÉÖ)§i³Oz ót*–§†­Ü.Ǻ¦ÁØްÀ}üTqp§ÁO)Ÿcp‘®ÉÅФIKuÓtJóJ°5Iîw®¶ÁЊÜÇO èCœØ\šT1Sš©À Òÿxk’!'7Èç¼'¹•Ÿš¡SÁV¦ÈwŽÐ)=;êTG¯SçÝ9ûø© ?¥‰“sõ¹LÑ)I:GKhºn?• ×4T‡T½?5^§ªŠN ,ž?¥!ÂÒdýl,{OÞ ?å.GÏù©ä.Œ£ë¹P§4¦¦yªZ–½'Ï-˜?uîÞ7û)—jmG²qaâKéö³Ëôi¦ƒóÑ“ûÉDr †ñ) ËÞ“·z>ºæRGŒÃó}àÙø}žµý¾tÊ8èx¶÷S~“ÜG‹Á`o:ž½ýTmma/Ð)ðìí§:*€Ngo?¥ì¾ÅýAaGå UíØÖ¼±°†¹]0r¿OžÅ(çööS 7õŠ·ÿ÷Ò©{Ïf0òþ)têr¶÷Sè:% èT 2òôº†Ùê0[ù)yžçG£SÉŽa.}yj_C|—é[ã ¥É÷ÅÎû§’Ïl®½!sUÜÇOi†iouL¦sÕz±T7núvÞ?œ‘ä)Hž#tj÷ñSE RZ÷\:‹ÃJu¿¦oê½.ÅõdÊèÔnå§ÒE-У Gt*Çv:ìžëZÞïLÍæ)ü”f¬*¸Ì7¡S1ÖÞ?[$WsfÑ©fîï§„6aY§”ÿ¢S2cß?Õ£Sñ²¶.ÏÌ­ü”+4ÔêT.ýyëšÜÑ)áïŸä,wŽÜÝOÓîã§Üi€ ¾ÂÏÈ-Fî?ÆéYË£‰ï22$Wá~€‘ùèÉøÉáÌÞø4-à>~*@Óh1Æáù>ðÜÇO ®;:et <Ûû)¿)¶î²;‚MÐ)ðìí§jk {Ngo?ÕQqØt <{û)M÷-yM¿à ™÷|ß!y«Î)Æ h+ÙÛO›‹<É 7+Ïež8…Å\øÜŒ|ÞÑ©Ålï§fèTq^2¬aNTwšÄbnå§äy’N¡Sá ²8ö’'FTíD{Z®Õ)5¿¢™µÛÜ$ É}ü”üÜɧG§ÑG–7='ót*”Ûç 4 B’ûø©†‡`üT2r.Yaì#ÞS˜[2ï} Ås$o­ ¯jäV~jN%ï ieNîÚ¨ºët{ì¼JØ+Øš~JŠou¥ŸbM£Š—LÿiÙB§Šgêç¶~ꆨҩdøp“ŸË‹¶p­N[Wr/y_tª[ù)×=ޤ“K6^×ôûä…hO‹ùSÊfປ$¹Ÿr¯ ‚:]ÏE­çžTCa=Y6Mú¹BÞSóуS£?³UM’ÜÇOÕ‚Ó¶Ï÷çV~ª tÊ>èx¶÷S~S•â´íëA§À³·Ÿª­-ì:ž½ýTGÅaÐ)ðà§À.Suª8@©ŸaçòÓ'QœÀU›ZbmH?v™§Sš1ÊZ¦_ g¸N­,|ø)°ËTЧôè”°ûÆ&¾¸ð à§À.ëuª8™3§nÅÇnŽpÍ“^I»—,C°¢ß±§ðÂdýIà§À.óæ£ ÄõÇœ‘ŸÐÊ%•Ô©ª2hžÍš]øæ ?vY¯SÊGÿŠãèB|9ÙÚ2è#Œ-|®À“ÀO]Ö¼wxÔ¥._ÏÊd¯Ò©Ú ©Í?v™÷>πᗺfw³:¥ßý~:åðSP˾~ª9Ùtê–ý>üT3\§m1yQµaÇ)œÿ­JêXä&·cQ§&>×7œ~ ì²X§ÜiDùKý¼„ $¾ò…ð/§ ‚‰Ë 4>c è]Nþ‚Ÿ»ð|ßp–(?vA§úÑôû샟» SCÈõ:7?vA§ÀƒŸ» SàÁO]¿ªyŒ¹gpºvßóÍ»†¼Úv¼üØeñû§ŒëTçl€MïôyðS`—Åïu¹D§zr©ÊÂOÁ.Ô©â„O½I*ðh¹9îÉ}…ēœ7kÌá,æ•+¤™ùè¯RD§žŠ«ÞëÒüÔËy]è¦å|IF8£ð%YMaäŠ\õè ~ ìr¡N垕Ӈ˗nñÁX­4ÐØ±ÜS5Å'gƒŸ»\õ¾ùÊðà§À.èxðS`t <ø)° :üØ~ ì2ûýS~¥êÕ.ò]¹!÷ì¸ñƒŸ»Ì{¾Ïe>„—c™NéÕsªœYÓJüØeÁsÈžâe¹R§”/ÆB§~ ,°æ¹™y¦üˆLîdýK¦ä§rÊšìâ¬ãcO—L|%ø)°Ëz*>Ô¢Ô)y&z®Ê÷Æä4QŸõ}V‚Ÿ»\¢SÊGgŠÚ‘LVŸ{­NU=ÿÜSÎKº„û©ÏŸ?{y:68ü|å*?u¦Y§‚¤®ÿª¼šuJSÎdœ•\ì§>|øpÞ?g.÷SqxC¿OØ+È"œ­Sšræâ¬d¥ŸúôéÓ±õÕø”Çk˜ÃOÁWÖßï¨SEáÈeQÜk¬NUí(Wa9zœ\Íîµ~êØúöíÛW:ÅøĬŸ?U5ŽǬŸ>#‡Ëy)³+ú©ÇÑzyy9"ÔŽORõJ§¸ßI.™~îi:Dî¤ÂV‰KiÑÇy¹”‚äŠ-¯ÇåÌ%þå¢/w ý¾£gwŽoå~Ì‚çûÀ³L§ó§ t <ò8z UÉMø)˜:že:åðSP :žâ¼„³åÂñS0t <ËtÊá§ t <šyžIòs‚@‡Ÿ‚© SàY¦S?µ SàQ>7óçŸ!×û)å”yØ:E›ÙšÏ͸±~Š÷<ŒÒ)ÚÌî:¥?¡×ø©¶J¾ôëÔŒRÁF,õS“êöiÖ©…Yä§üX<- :E›3+üÀXÆû)€±à§À:ø)°~ ¬3ÀOù§ufÓè§)XF‹ŸB¤`%Õ~ê±íš’ÀSá§ÎùXLÙOyÁbÉ’%Ëk—Y?5VÙ|úôix²`‡©—yÖO Ìà±|T`Fâ`¯Snކ„~ê¸Ó7vyT`Rú,Y²¼vé¾Ú‘ÇrFúÿù)ŸÍ Ž LJ.gêeþÿ:`™ÿ‚C„ endstream endobj 194 0 obj << /Length 2462 /Filter /FlateDecode >> stream xÚ•YÝoä¶¿¿ÂèKµ@¬H$õ•>õÒ\p’¦C‘ä^Ñ»êí®¶¢d×ÿ}ç‹ú:í%ÃÖh8g†¿Òé]?é]•ÜZÇ•)ïöç7 q»ÃÿúþM*r÷ x?“|ûðæëwYv—&q•TéÝÃÓ\ÕC}÷KôíÑ^{×íîµÖ‘þfwoL½¿ìTÛîû¦½ìîUY$Y¤òÝoóÝÃ8a¦Ô´ %?1­ÓL¬M®Ä´¼4qª ›¦c½»Ïr½µ¾Ùƒ…Y¦ÓɲoP@GGÇÃ?Øæ‚”‰~B9{q'4yíðRZÅ©üØvg{:½Â—U½ꨊè½ÐÌnÈ'ÏÄú¸SEäXè{מñõ¹Ù¥ÈK£—¯À‹©Žúcçœèl.u‹Ÿ¾xfØë¼ Jl‡k(PÚ‰©åÜT­LœW`1YJëÛXNâ$MƒÔ×MF˜[j3›²<ìŠ"jwYµ'¿¥ÿÞ$Eœ–%øMÇi¶œF—<]³ßÛ‹cboÏ%¦§åǰà4pgã^Xäh=g{Aw¾Š:°¿[+ÉÇ¡—OZ/Tl. WQ°Ñè”­~ÄlŽÄÈZÌÍ@{d fô.Áb\`ù–ŸhÊ+Óuýv8õ£&&h~’—V9JÌrP ݈¼w²IÑSX§ÛZù®Œ{Âà’³}×’özØ;9,âìXä‘÷’ûö²w×Þó[´= ÛNdïê0Øá2†Ã±úÀ©Îyù­] ÍìÛ°ž] 0T;¿ï ”gÞ<.ó8ƒ|üí¡ªX/wGì¿#Dü h”TˆO_¿?wkßüs DÓÄŽ™;¼¼*Xï»æ0 §HãT ”¡ XM@ý„>ЄNPI\–â„åÎ0UEy įñד•´Ã‘0`»Ç¦ïl÷ʯìcÒ">ìXžâ-°³,úd–çß8d.ØÕ°°Ôäb¥+ZÂ2•  {‰!¶C9¸~E/côE;ÙÔ´ÏÓ,"7¥Ù­ˆi¬õ‰x𔋳֙=s,?N H*›  JÂd  ãòà8Â/N¥€P 8û¡ë6ð^¤*#}iQú…|>I’ؽÚAØeŒJšC•¯ †P pE®ˆÀ O­ˆ8»ÇoŽü6ËfðžGjVúPñXúD᩵µ«©Ä¤Ñõ4ÈÄ +$s{6'ߨí‚ì&7‹|„e–:‹þ¦Óæl®Cr3}§WáÀA¬ÁBî!|Wœù"7Lçå˜ÚîToU ›[1B'RÜN1õ\ÅÛK-³öíÊ\J¢À¡8«2¸\nÌ7KJ‰‹™ž„“öŸ@¸:gû ÃÁWQóÄO˜O4½PàšP×ÅÍ”²÷0·TýÀuÇ&%ÂÕY,F>ŒBºl„vJ-ð…DÝò³—'‚Ädv&‰ü°ÇqäqZ>¯WpN qKŸ[)¨«“Y)Ííå°ÆöÔv2Íhš=y1jêÈâËf™åÌkR¾lÙ µËÍŸ¶R+‹ 5"çÄÚYæk ƒÖùsÊ ¸åcšg† ÅàRÚå˜u%YwØ•Ž•Q_€ëºÏlìQ¸d’à]“”ŒPHPåJÊ90RõaX…J¸ÄDÍ«èí+3k÷dX)6\øŽÐàøëFfj/'Á¼/JX_¶ )«ÿ Ä5K¢wÔnBZc"ÎýÖûæñä˜E)"¶®™qniƒ)†z´3sž;²6nt\ä&8ðGªÐ~‹F¡ãí–×ó,®Ôø‘›¼¸2bkÆ"6AÛgЍYõMö[ê ªX¥jiïš“ÛԪᬔžÙîÛ^¥Ö炬bŒÃ8ä‰Éóµ ðäÆe,kY% „·gÌ/y# í2FM=?ëvê8áõ¶¸¾£“'L¾,RŒä´’E½ã½Œg"÷?{¾ž¢µÒ*8JsSĹ×V’Uâ‹íÚ O"GbÖBP÷A{輩ÝÉõ.H¹3Sˆ uç¨E¦ “ÏÊÍÖ¯ µ.ÒFÎOTƒãä=xÒ¡‰ÁcŸ›ó•ßý‘qAF¯üÄ0ª"å ‘žy—‹Œ0½|b3¸kA%¯X5ÐÅøây&^¬—öÝ-*ÏÇ“*Ò„P*§®ß½»Z¨yîSÉé8*ïÇf®tÙg"‡W˜g’ÜȲ>Ì‚WH…S%@ëʳü6¢ôk’%ï ¯´à•þ¯´t€³Øã!h†4³ Èø|?€Xç®S$èc¥ƒ4ðãd”qTÅL÷ø(8†ªjì+0%6«x•©^ì«À¿L`ù1Ï©¥¹"FɇËxÁ]½eݽ‚‰ µÕ¼má ÊšdÙ·VB\,³æ sP†®[e¨yÅÒ~dÌp_©ï„§‡¼§Ã¸‰PúØŽ'øå«õš¶4ráçgºÃ4-¾¬W·úñ™‰rB&§¹«åEW§ùxÛÒÛæ¼±AulÊUW½ué”Üb(håÃSªc90Âe°„ºwÍó¸yòAßvõVCñojûP¿ÒÜÛ¡¨R™ÄD/× Œ±³ˆÇxÂz,ÖͯIª]¸8`&_ú T#VÜúÇÐYñ%Ç<]ƉÙȪ˜OZ½p­§-¤ ”¯tµO—x)-GIŽ*‚£ˆ „8 é%r”‚è3-ס_}.á¤)†ÎST¢ã “ø¢õJ^Ð=)r,?¹DŒª Jðej, endstream endobj 204 0 obj << /Length 3567 /Filter /FlateDecode >> stream xÚ•kÛ¸ñûýŠE¿DjU¤Þ퇢í%izÈpÙ/Eà¸6më"KŽ$ßÞþû΋Ôcål²ÔpHÎ çM«»þ©»2ºËã8,“ânwþ."hw¼ãÁÏo¿S‚·ÄíóŸ÷ßýåMšÞ©(,£RÝݦ[Ýïï>ÿ:™Ë`»Í6Žã þëf›$ið®Ùè"°Ù UÛl¶ºÈ£4ÐùæÓý¾{}ïLµþFÊóeÒ²" Uœ0i;s "û­mÏxÎo•[19‰6Öé,Oó<øÜð½4Žøx’ùÂà¿– Ühÿç)Ñ-PJ·?ž˜ã“ãÎëO³cª†—¡ X¨ÅL¨…ã$wR½ßä9lµIUè×®a—y¨a<½º‡ŽímŠ‘Ày÷›­ D¸ºÌƒÿE*éú?=«ßèÆþ*;‹|G‰0˜#ƒºÌs¹ðí™®gäJõ_®Ä=ŽÀG=zwx}äá'+9¡’i#ûœÚnJ ^¿ÓPÅ|š¾¯Ž é—*Æ+T¹èDît 'ä ñžèf¯ ®[#ËYw4Ñ’^¼e×6}Õ“N!Þa±°¶»$þr|ÅÀC+#d‡®²ý*+èb0á_v¸0+d!@ØŸþå€ëºEÖ½mŽç‘/¼’Pgó€”!MÐKXÆìÁöܹ¬Å{@ˆáϺmŽVH9· ím¿ëªË 3c‰9 Á-$Yæ©K´‚…s­Ñi4òJZ¼“fà Ӄ ”3BdJ“òÖÖͰX9ó3 I9/¥†‡®=£çŒJ– m31þ•{"W€ZQ°'1öËĦà\lã¼4À À„g€¹ÇB±p;ÛJ£äÊ( æð¬Æ‰ØòÚj<«@õväxýFxc‰Y «üôbÆ»ê ÞÏŒ>ñh/Þ™†¡ÎU0ØVè+x/ù°ÏV ÏD|vê<[“w‰ŸMS]®µ,Ó xïã=¢îë0?»35¸Ök'+F IPhˆ0'A¦ÍR|xMî×°†8yÒZGyRÏ*@È<´‹ux Å' OŽ×‰ˆN*ĎζyEÁå:ðÀÅ?KŒÇáîÚõè pLnþ™’dǘlÀzöèºt¼o1BÏš–¬±´ør©++§;ëÄñ©­÷ðécïB×ŠÞø Os‘°XÛÃÀ ò]9Wû}m& áðȤ¼…?Ùù!:ʇ%NT Lv—õèÂT‚æÚ ˜C- öö· ¹9S3`_§ˆQ.ö¹:“t$®fóHfYìñŸÖBoæÚ‡ê3§[{Û¯î…Q¦¾}7PY1.ä&…„¤€k¼€ø.õ‰ˆŒ0å7'ÇPPþ¶çùQÀf¦A¥ŠÈï­$":KÃ2õ¿ÿéþÝO?QhÔOß¿^ÏD0p]Îõd’ŠÀé§ I”ÝÊ€ò$ŒãŸkªf5ùŒB•ëb[»ÝѪ9ôãY4 †Ô.:Ê–¿BM–%i Y€U­^°.¢0/ÓoØsös; kº¢CëoßIãDa™Ï…ÿ_ò²èãÀõ±ç³à<Õ@TŸX:—™£H‡Ç”Dìe‘O8Èðjp«b°)€rþƒ¶‘ý«fïÔ‰Õ ÝÉͰœÛ…'üõ¾V OÂLe7WEéZ1Wê1[ëÜXœ UíçIÅë+r¶X¯ºtM_“»Ê#Hq}Zñ®<Ū/ÅÒp5±ÈôŒo°¢£<,õònF²T{™| s¡Ä Ó×DX†yöì\,%öºzùâ?¸^aŸÖRù ÀÇ“m§Fæ,ìa:u‘ö¤ìIE.ü}}ÝÕÕÞ²Š¬þý„•XºtbëjG³Tt’H²,¯5.@ÔtKé,×OÒh<§çÉnœqÉ«8Ñå~vŠÙdÎ ºAv{CšÔ¹©ÁTµì`„èëÀßœ…Þèç>éø÷ëðLùgµ[φyÑÔ1`i½® ZéQH8¤õjV“‡Eì§¿˜Ýׂ¬FÅl%a^8ȺõÛÉkùÝâ˜çA¶ ûcÛl__7¨ž[ÌÁ6؆t¬·Ü—}Zæ©q ’hÉZ’¨°ç3eívøuØ/0²Üt~AýÀÇsó~ßö’¢ñCWÏcæ6¶‹ˆ]¸9$¨]{=žøcšÊ½’½È£Éød¼ ¤Ò¥ä>Ö”èóÆ',`?ù$ºnºý͸EMþÝ•_À÷·ü—9Ñå¤M‡Ä Îï=ž•…ò„þé¯ÔÞBqÌ)ç…›[ðmd¡ýrµÍNcv‚…¡ªmf§iœÎ…¿œø ×òS~Œ‹sNÈcª9íáŠ($‹ Ù³ˆ=OZ'+Ñ—u¹`p0窮Œ,æ|½¥;™_$bìÌÅ<ÀŠ¡¢G6Àän[®Æ®g¾hŽ ÔÍ2é†wŸñ+ÅŒ„_)ë' ìÐWt…›0éö8ÍR$„Ô-=¤ÀˆrBÀu:‡°]}ÅÇ¿ÏõÂpÎaÐCgzÑPÁÏ”-º¥f‰N¤sƒk55½ÂÂ$Ô8Ú»OþëÞ³püü= ¡òž…CzÏâac©í¯÷2 k×Y鸷 7Zé¨Ážç‡šµûp=|Åõ¶¢íïæ|©­tÉ}cÚ¥+£U0Í:™ðžÏℎÁóû®ÆÏ~&«yžÕC?ëˆNÛæ:xÕ½ÂÇbÉãÏ´¥>¹K»f¥G" µN¾½¡ú±û´º¦b_߮҉|‘NLž?Ù£¤¥{Î>´®ËÎþól@ûU æ*ó?Ð~¡søõžu¦>Œ»—„y*då³°.o7€1§^ë|ÈKÄX}‡ã‚ˆß:@t¬ 8s#tÀ¹P™ªU£¦çã2øõŠA’O &xÍo5¾²wkÌ”a{ !Ê?„Ó‹FäŠX€¹§ €¹·÷¢0ªp£X|í,~¶€;ûò“Þ“àû–'šV:UîI‹‡¦ñ"çVPVáê¥Ó£5ëõG–s€5-º}ï2HHÔ¢îøÐÒ£a¤VîÀÑÔ#–<¨ó…H¹G戚Fæšù¾¨K$¤ôC3À}/H;Ó[9ÁiEä®5ü’Ù®ýÍ<…ÏDzï0¸wÎÁ5A¨–—ìQ2þ~…²­µû@ÉiõmâÍyyôƒ§¦Iˆ”ý Oˆ‚2qº{¸wq‡IºÈ2}‰«}N·LpvšÇ¹”SÊýò€?ð٪㎈¥7xD}˜œaøürJ`ÿòl]'…ìU²±ÔÒÔytqP—Š_ò9ã[¹…µ[6«aM¥a4z¡=kÛ/ºXý`|KC:\ûÎÐCl…Špd4»?ú‰ýÈš~”Y˜æÞM«uªtÊ[µ©Y5ˆei›ÙÆ>/XObject << /R8 212 0 R >>>> /Length 68 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hln¤g62³4×3S0Ö3300T0Ô3´´´4‡(¶PpÉç B_¦ endstream endobj 212 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 286 /Height 562 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 286 >> /Length 5500 >> stream xœí½uܺ…qKy©#)t^KŽ˜ÜT†%ܬœ0’×R íÈõ¼áþ6~’ÀðlÙš’l}Hÿ, Ä_´úóãu§@ŽP¬tŸÏ“=Ÿ_ƒ?âšXß÷O¬t?¯ö\_Ã^ýk{.ÝÇ·™˜À»+¤çãÿØ?“+’ž£ciïgªq4=Ï{ñ܉W$=?aû~:}Y\Qô„Ú÷;nׯûÏ×@é¾8ôøëð»h¹‚íw¨tÓÎäГ•rGºýÊ0—άwßÄLK =nÊKZoÏ×tžoiµ¯Ðßx)Ý3-ÅôáCÓ#-éÈž(=†=S™ÖÐóæyÛ¶²è¹ªœžig{úµAíHmý¿IU¢Ç>t~óÑ3¯x&•sÓÖãol1žGϳYÄç7‡!ÔÎÕ¬Aúoülü!sé±ì™¶4é±ì1˜i JÉy&=vÂozèÇví¡ôL¿Jéq ²éé²b6j³ò©Ürõج‹={zÔžGÍ=ŠéAbz°bô˜K™µf)aÓ#—Jç£çÓ5çõõðk*«®.Ö„J§éyûø6ùt=@öê[`yW "´b¢gréñïm3¾ÎeêïçdÜÏyËõýGÔ”þ7_öûr³gâè¿?GÔ’Þü®ðÍöLu´`{ˆ®ö˜-ÓCu£ç“÷0=TLÓÅô@1=PLÓÅô@1=PLÓ£g˜_Æa×§SŒéÉlÏéŠÒ3Ò·g´'žëž6ÎûÛôrýx÷n¥Ò£w®Éùÿî¥çö{¤öL®œeG+¡gÒyìÉl¹È’ûW='³'—Y5ŸÄž zo–†ý€p÷ŸsAñ;ÓÅô@1=PLÓ¡çý°ÀŽÓwò>BÏ íy1Ê£ç»ýõ;׃°ìÁôœÞ¦‡Šébz ˜(¦Šé*¢G^½IS`Ãa\Vëszƒ »ïiVóåËà7iz=½Ø#P† ËõÊÀEË¥\óÏmI1=ëÝñ­©Ðeíu{~Õq‡óY.Þ-ë‹é!—ÙoÉ-ŸGzÑ]ŒF~Öz¹‰‘Ò¨R“šWñõU‘l$Ë=è«ýƒJϰÇÞÛ¬ȸÖÐ3Èâ ÷¿gÎÖX¯6¬=©ÿGbN‚ZäR°g°²$WÅ×Ñã\_7vkᲫӜÉ÷í}©’uô¯L’ ëÜzÍ©t{ÌÀܾ´î Ûs»ên—N_ K·G¸ ¹öè5A{¬ÀìYKÝ¡H~)h¢=VÉÂôeË³Ç ¬=º¤žÝÀ¹½^M­ìÑ»“Þh©O¥;ž‹G\0 `¹SDÏR’Ý€´(VMJÿld½ ›Úö«dŸ=¤N7ØóP4èêÆÓfÐZØS@m—ÓçAû!»øÜK?t½¡ÿäÁ†Ý2@Ñ-ü »z/G!œ#“ ôxe'lÎÓºo×˲Æ»wlaq©β =’pcYq}©m¬`–ÜßÅý=PLÓÅô@eÒó²w|‡+‡žó¹“CÏÙţà˜(¦Šébz ˜(¦Šébz ˜(¦Šébz ˜(¦*i û>T½Ë L­”tû Æ`±Åí1ƪ¢´Y@tnŽ99D‰³ È‘Bd$å2ð™ñÈj±¢\=uÍSâƒ9éÎã ¼´6–É´§R¢yʤG.ÑՀ㼮û3»Ã+$š§E¦7òÚ³lRu窔hž é1ÖøéY¶ZQËž:‰æ)½åòÚ£ì©X÷ÔI4OYÇ=êC¨j&ÕÃÝTÍéG̓(i Ôm½¢ëžv>ç ‹ÏØ¡˜(¦Šé‚ôl<ÿÊw7 =To¯¹_`˜žmC¼Íóî.Ú#ïÄ bôl8ðrãø.§O¿n¿ÅNy§£g'{žÄåQm'ˆFèiÙž=ÃaFd׈䫙÷抑@ÏÙíÉ£gÜ÷Ëë¨NR½²)ìzCóV×rèyºZVáì4D>=ÚžQŸÏ+{–»F½Ù#KOíQËô-’¥J°'‹ EÏ8Ðw~úO¯"[âÑïtÞ{².Oz "‰YîQÞŸ*qì±÷6ëÏ&ö¬R‚=±ãžÁ´ÇCIÀ¹½êXôÚó".2¿—<{*ô9G‚H9î,k–[²…eQz9o]Kì3ìQùì‘[;U³|_§j‘D)›š =òª ¶çQ“¹sÍŸ*UÍÞ ÒZ®R{„Ú©=4Ü|{êTÍ ÒZ®eºŠA¹ãÙ¹¨q¤å©=ÆAÙ%³î©Ør‚Hª{ŒŠÙ×€“%ªYÓ¸‘k>ª¹3ìù#s˵§ÞqO ˆÄã£íò7ì¤MÒÍ–Õ°¯µGe¶dTï¨سË9—u¤˜jÏÖªCÏ*ÉË\Ö=›Ó#/©š‹z±çàÞÂÖí9¸·°u{˜¦§,¦§2=¾AZôp6|¤fŒ-K³‡ô]ŒÂóvþ¼bÜ|uzho‹é«68Î/±G¦D“ôœ’V°§¸¿Ç-£ýÁ€èÀÿõšöÀ<‘*ô÷¨ròäI†ëØcïmúÌhp¦í\2i2zN…"ô  9¼.ßžý=Õ'ÿ-´‡¤c÷4gÖµ'vεÑ俉U³Uµ j¦J’,M=o'«AÉÝGMОeçªfêQ’-‚=ó’ºöÄ[®R{„9Ú¹ÈaL&kÓ£ó-k¼ÖÓ#æ«Oþ›oió^öDëó€"RÝàÉe9’ Õ·¬ºx§ª9á¸Ç°Èß°«÷BWÈvþÎÕƒ­ì¢í¼¬œª7컜s¹à7uÎµŽžU 0ß‹=›Óãg¾{¸¿çøº'Yëö0=LO$¦Ñ'=úhÉ:g(8€AôIÑ[x=-ÓÓ€=-ÓcôŽäÔKŸa©çÄ­ ¢Sz,{ä)±ïÿª z¥ÇèÎ1û7¬×UAôJÕ#h÷Ϥííi›Ú[èÒC>¯ ¢[zŒÎTÚc¹—=Ócø1ø«å-«æÆéqëâ}ö†éIѪ#ľéIÑÖö0=÷LO• î—ž*A0=0¦ÁôÀ :¥Çl–ÌS £{¬ðÀ°szí)nÜÀñm]ÝÒ3>=NEõêÛé¥üä‘,½Ó#ïB¤G•ŒP¥C è°ÃÔ“øîéªÇ™v8 ç-í÷Iß×z§çx{˜ž3Ò“äQïôÈi&d mUÍÔ·ÆN¢[zT£=zvAúY…©*ê5ì-Ó³µ:§gk1=IA0=0¦ÁôÀ ˜Óƒè”ž:S[¦§ÎÔ~è! öëLm›žÃ;S›¦çøÎÔ¶éÜß#skÒ¦‡é‰Ñ+=Çw¦¶MÏá©-Ó³µ:§gk1=IA0=0¦ÁôÀ ˜Óƒ`z`L ‚éAôJ<‘úqrf;ãÄ3V5#ˆNé1ÏØCý¨9ݧþ :¥gé´±ûuÌ·"±sÑ+=ÇÛÃôôM9]fØžz§Çªš½öduŸúƒè”§aسaÃÞ2=[«wz6Ó“Óƒ`z`L ‚éA0=0¦ÁôÀ ˜D¯ôß™Ú2= t¦¶LOVwØ û{Ž·‡é雞c;S›¦çøÎÔ–éi 3µez¶Vïôl,¦')¦ÁôÀ ˜Óƒ`z`=ÓS::%#ˆžé9Ö¦§mz.r‘ÿœky`ð|;¿y^jv²ŠüS¯èQî„ÏØ…zórÏ¿<µžr’}âÞ>=ÈŒþ² £u®NWgï†ÐCb{¦]GÝ‚,÷-5džXaO ˆèQ‘]½…Ë«ÐÝ_äÞuá¾Ö ¢zšõ;’·iú0ÿìÉñ(Dô`{èÕ,r P˜K”qÅUsØž£é™+CõÆÌ[ßÒ/?º_‘NÖ¢>ÕH-ÐíÙX öNÏ‘|Ý'ïÔ š §m{ާG<]æ—C;4—Ç@ éq]Ó˜VüJЬ8ïX9A$Ñ3%wyöør½uÅ [š=ùyGÂÈ "ž)±?济¢¸TOåÃ[Š=%yGÂÈ "JÏ ¨i˜c‹ÛS–w$Œ¬ bô¼È3ªöÜÚ¥—˜=…yGÂÈ "JÏo1Tµgj´ãô”å #+ˆ„ºg²¢=·¸Òêž’¼#ad‘Ôrý¾}¨dÏE&•Öråç #+ˆÄãžß™!>éA)†Ÿ.BϤ÷äæ ##ˆä£æßyöøÝ™"#Ç©GÍyyGÃÈ"¡åÚNñ–k­¡gûÎÔp`;v¦‚(¸¿‰{ ¡˜(¦Šébz ˜(¦Šébz  =v¤Èi¢ç¤ö\ô•S¦ÇÑEö@zÎW½ ‘NÛÃôbz ˜¨šôÈÛñÌ…£ûaû‰+«&=ú.=²ÛÓºQUéÑ›é>{À‚ÆTr£Ù0ßø:èŽÐ3èGË7¬êôXÓuš·,j{èÍÕ «*=·ß„}›§k°÷Ä&U¿î¹½›~A{–ýª7{Ö×=¸Çç‚â3v(¦ŠéÊ¥g¯;«ZÐËŸlzöÆÖ€.{¢ôDn »#½Ñóç$û×wŸ= ôœÃžk9KéÙcB‹ƒõ ¼ö$Ñs^{˜žYLÓÅô@1=PLÓÅô@1=P«èiýÃz­¢ç´öpÝ3‹ë(¦Šébz VÒc (¹…‹ Yݽ©\IÏæö˜_mÅžDz¶q'˜ìþÇYëè!Ó£QÈ£ÔG20Õót$²ÒIc Ï¯õåáyhýö¤ÓCì± OŸ°á<[ž<IÀ é¨Ö@BööÛÛ“~εØCG€ÑÄ;gmâ.´G‘Ñ‘xÁ„Ⱥ}ìI?çZc¹êØc¬ÓïÕ¶ÂÿÝ;¢‡Ž\u6¤£Z=#\Z¼Mz~¨aú­*®ùâ³Ç»½»apýaö$ÑóC:CÆOºU³Y*ßÓ‘Œ ÃU³½ûÐúìI§G ?•oí†Ý°Çût¤¥aì4F]~¡îX 6ìÍÑã=ç²âó…k/Ë.Re€jž±[f¾ã4ï±[Ni79ø «*=ÖƒÂ|Ï ó.Ë)mîÃÈÖ‰û{ ¸¿ª¯þžÝÕWÏî꪿guÕß³¿ºêïÙ_=õ÷ žú{POý=¨£þž=ì°ÕQϾÆÈÒvÓßs„?]ö÷ì§Þú{vVwý=ûŠû{ ¸¿Šébz ˜¨5ôœâVÿbzNáN1=GÄz„Šè9"ЃT@ÏÃq¥|zN&žý Šébz ˜¨,z½o%ÓsJw’é9§;©ô°øù\PLÓÅô@1=PLÓÅô@1=PLÓÅô@1=Pqz¬çùÇ/5<ªi•bô¨ÿjc„o{‡ŠÑ³ !Ùs¯ŠÒCFW껤¹qZ ĵﹹEë¹c‘±Ùž!ÜžûkîB -—s—€ç~ ï=w ¤ãy»šô¨··µ÷mOÂq¹ÙÊ|+_îØž´–+dÏ0Þ¹=iÇ=éUóÙ“xÔjØ…²HopOöð9WX|ÆÅô@1=PLÓÅô@Eè9Óˆx)zóQ„žÚcÜA¥ç7rz–=˜žÓÛÃôP1=PLÓÅô@1=PkèÉë l¸Lóc­Ïé_ &ì¾§Y…/O’r­¡§{è|Ør•3ZÀþfÀžLzÖ»ã[S¡sÚë¶#àŒð½„5k•¼f“3¯¥°× =C˜Ó¸hO.‚ÈKG‚>¯aPÛÑ‹ºÔ{o³ ¶'ž²y-õöž+AÃMÕ¼„Dì1/"ÑK‘&%{<ŸVÐ#“¥ØWþäVƆb¤ß%ÉRÆR%ëˆÝÆd[¯©¬-{ÌÀHJé‰Úã™×Rí\Yö7!×½ &h²§=¾y-—Åôxrté1Ê–gX5ztI=»r{= cmœ`0¯è/ßÈ숾‹§Â²  –—ÒS4¯%jiýŒ´ {‚U²ÏR§ìy(tuãi3h­_N(ž×RÇ'”kºa'ò”‡šÐ¬ud©{d0:rA °–ž ®ÞÏyZ÷í YV`X›x*=‰å]˘iO^â9Z›x*=絇é 'ÎôÀÄ™˜8Ó/¢‡Þ”iÞ߶žùÎtrojb ’—IÚ7:Ç/ Ç¸¥×Êf=ÎéN¬‡Ø“Kf†Þækd²Æ³ñ$%Nì!™Äϧþ•kѳÜà-È,5é±o &žOY ë\u粟™RÍßY¶ Ç¹sxuÕìLB]eϲ€N.`ԛгÕÎ¥&: OS©HšäbÎ œøÚº§~ÕlÑCÖÔ·Ç=$±´ºåÚ°aoÞ•Ç=Õ ÃUsu{rªæµGÍÔŸjöÈùlĸ=Y ;Ÿs…ç3v˜8Ó'ô¼}|czì¥=Wf®ôü;}fzÌ¥Wz>®¯ÓÎu}ùdzÌ¥?þÞ^¿ÜìáºÇ^:Õ=b±´\éw1Ø“—xŽÖ&žØreÜã•oOfâ9Z›xÚqOÎpÙöä&ž£µ‰óø(ßÅô@1=PQzÊfǺ#{xT|X<*Šébz ˜(¦Šébz ˜(¦Šébz ˜(ž; Ë¡ççѵ%‹ž¯GÇÓš z¾~òý£é ›øñ Vv/\:MOp ñŠVw®Xéfz®íVøçUàõ}ÿDJ7Ñó ~x}ߊ”îJ èÿV.f endstream endobj 216 0 obj << /Length 1569 /Filter /FlateDecode >> stream xÚWKÛ6¾ï¯ð-°bDRÔ£½%M)6Ø> ôæ [´­D–¶gþøÎp¨g´ØÂ€5ŽÈoÞ#¾ áÇ7Y¸I¤dY”nöç›ÐrÛㆈ?în¸“ @0˜H¾ÙÞ¼~¯Ô†‡, 3¾Ù¦Gm‹Í'ïí)4ºõ)¥'òƒ(RÞ‡Ú©ì|oʦö‘&¡òDêÞþzón;\¨„øŸÈPòh @‹˜Œbá ÅiĸŒšd‘¨Xx÷~À½&÷¹W”õ &Ê{ØùA,½/zo:âhÉ=ÓÐêN7g_ ï[©¯ˆzi0ÏÎ Û“n5!'"ò:ý ÍV¨hçê‹ÄË‘÷ÔÇÞ컃 z)¯‰Óì»÷@k„¿7Ä/É´î=‹E” a".!%á2'íЧSôb>y:oYŸNÿ y£„ÅÉ–À'¯?œÓÍ/ÍÍïkÉLÒ"‹X/ïËã¥dÉ„Ëgˆnb‘N–üÍ3€â‚*”¼Ï‡²C­âQAåUÚ8æ$JbÈ“Jcx#ÓãïG•&úiÁ¥Óýo>äFÞ–Ú Š':¾9ÐfQ¶p^»ƒ$‡`ñã–iç²Î“þÌ=æò­£gNÎäu‘·­>´Æ”Z  Þµ ªxí4x)H’È{£+b‘€9õ'/n¨Êm œ‰>ÄhêfgòEÜR‰ \ ÕAÌìQäD»¹9ý dºLM1Sqs ßhjíˆm€½:Dz5žVÕU¥5™¡£EY÷ïåf t¯Û“ŸJoŒ¤„ÉÌEäwð*1FŠ´uÔ²è¶[\¤^Ñ\v•¦Ê€¤UDK[éQçgMf[M¤±1b£>-1rwãÅf^â?ñÚòx²ÅØÝÞ8ù±ê­(lÁD‘Ît`",ý±[ÝuÄ+M>/XObject << /R8 224 0 R >>>> /Length 65 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`dfb¢g630P0×3µ´´´P°ÔR–æ¥ .ù\@CÝh endstream endobj 224 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 551 /Height 125 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 551 /Colors 3 >> /Length 2068 >> stream xœíÝ=rÛ8Pæ:ªÒæ)R¥ñLêÃ#Hã*…O6Uγœ ËPüE©÷f#Ë4Q3øòI´÷]¹¼«ÿûýû÷Sÿüùóíííz½n19i…íz»M»…¯_¿þKúë>$ëÈi?äóF£1íØT…ä3‡ ø—:o¤Ò~ig ­vUØbÓ®çÿþýûM×Ùâ1ê' ra»M»žùãÇ]'|Ãh4Æõc'x†»N 5FãÑÇ)íJ3Úuêo$¯W<”~¥í:õ76ºœ€Gp¹\+Íh×Iu9uxøÝ/4ƳŽÕŸw±JÛiÛ9‚`¾ëü\}ÛkØ6–p§}Kôë.í !´ ë”ð“0*ª?¿¯Óž'þcþoß¾µçi>©É×uŸÀ¬ð ›Õ§²Ñ´ûºo§˜­`õæ³sv;Rב:‹lÝu"S§úÕuDpZåtêöM¶ct‰xh¿·Ø>`öþúN©œ˜®3õâ×=vÿ}·§8ºsv¥ª ýÀë»NçÎÙdê ë'6½Ó޽!48OUH׉|ÔÎÁK8¦èT#=&è‰iN`v§möä˜Í° ®³(uªVâÅw¥Egð¶¢<šÙ®™:euÙ‡ì¨;I×KÈûǦ8‡˜®Óþò]gpéÓ–v×Ügv§üh§ ®sŸE]g0ÒúÞÄ\íšiàqœó¶„O€´ü¾ÎÔ !]gæ –®3õH(C׉ÿq]àü6í:Adöè:'·u×¹{ž{ºNxÔpÏÝãõ53F£qzLµÓ6¶~ž©®þŽ@}hûÍX©YI¸Ó¦šjªë<==uòŽ?m¡ë„·ì‚›Ïu‚Hõ/_¾ä^ gñùóç¦ë4w^.—›Ôi¿—'u¸[HêO²4Ás“:í|*]€Ú]gþ6]€5Ú]'Üó6ñû:•®À k»Îû÷ïwZùñüúõkâ»%œÉÁ–°°Æô9Ê·¶ëµ%•ìåååÓ§Oì~&ÇV¸û³ç(Ÿ®“C½]ÖcÉ©3±ÂB^â˜s”/Y×ñÖǘ?~„‘©“ÿLN¯°„—8òåKÖu¤Î©³žÔÓÐu6'uÖ“:pºÎæ¤ÎzRN#Gש£çëëk}=†ÂÈ÷§ŠüÙ]l”:Íyè<ýþÉœ=½kRgpòÙWvÑ+>»Bà@rtÙ­giê´›oÉÁ“»uzÞôÏf'¯¯¯{/àvë:çHy°ˆ®³ŠÔXdÏ®SoÙ1ÙyØÝÇ/š¹ú?/ãH€Eöì:ÇJö´Ím©°ˆ®sÏ´Rà>ûwfãnGEûÎÎvßžaýñÕÐ'Lýïvæïß ÆÎ]§ºÝÖ÷½L©ë¬´×iîioå9ïïˆù)©pŸ‚>×Ù"]úO¦|‡ÔØÎuþƒ¤ÀvNÞubR'òK©°^¡]§Ê~5AÌ£K€•Jì:ÕWNÏþ”ÔXoU×yzz ý¦=ú;lŒYÔušdùÛuêÔiŽ ß¨üÍiÆÅw)ÁÍ;lÁõz}À®È€Hñ]§ír¹Ü¤NøhÇÿK€i‹>×iîü—:w_ÃÀÚí6Ðn¿¯ÀÒuÈG× Ÿ|]çùù9ùê8¢Í»ŽÈ ±m×€H ºDÒuÈG× ]€|tòÑuÈG× ]€|tòÑuÈG× ]€|tòÑuÈgqשiï5p` ºÎõzÝgœHl× ·F£Ñh\?†í: …Ú´ÅÌ$·Ý¦=Úu’?Lx³Nð.\J¶Ý¦=ÐušK RͨǴ3F£q‹±I-æÿ×u¶»| Iæ ¡M7í¿]òøÚì€ô endstream endobj 230 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/mnt/storage/users/claus/projects/geomview/sourceforge/geomview/build-opt/doc/figs/tools.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 231 0 R /BBox [0 0 54 258] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 232 0 R >>/XObject << /R8 233 0 R >>>> /Length 61 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`jl®g5251 õ ---M¡´D±…‚K>W `¨¶ endstream endobj 233 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 112 /Height 537 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 112 /Colors 3 >> /Length 6633 >> stream xœí ”Åy€»gfïs¤] s!âˆM ¶9mç qˆ vŒ1†ØNHBœ‡<۱͋—Gˆ¯Ä&Ævޝ>x¶yðˆ8b$΀d$:VÇîêZ¤]í½;3»ùg µÝÕÕÕÕwWOÿ߃QoW}SÕU=S]cö÷÷f___Ü1Ôæþýû㎡¦0÷íÛÇMX¶lyÄ¡$ˆþ~×jmîÝ»×¶jùòá†S+ôõq*·¹gÏžê+V¬´fgg÷ÚsàèÈøÔ±‘ñÙÙ¹ˆbÔ˜–¦†Ö¦úe‹ò§,ëjkn´VÎÍÍÙ´š½½½ÖÒÊ•«¬…áщ'^Ü584a´I"›Íœ{úò³O[fýù̶½KZßH5wïÞ ÿ¬ZµÚú{ËÎþç·ï/–f#3a,^Ðvñ¹§u¶5Ãò÷~îÂÓ»¬õæ®]»àŸÕ«{àõ©—z7ïàwK{Nê:}åâÖæÆ¦†Üätq`p¸ÿÈÐþCǰâ»àÌÕp|™-_Ýwøé­{l+cÙ½¡¾î=—cUÿ›nÿá'ÞófX0wîÜÙÓs ,õ¼öà¦mÎCœÔÝÙsòÂå‹òí- S3EøÊoùªj‡ŽŽô >Špq¸ê’u­M¦iÖ×eáø3…Rå$@ù‚”¬? #“1üØfMv_ØÑrÍåçf2™_nÞuç}~þÆË^ »Ýóà3ÐÙÎÔo=ëÔeù¶¦–¦F '›˜š™¶œÎÍ ʼn©Â‹;ú á (ô’óN_”o53fSC]{scå=+7…“b©43Sªœ³œ«áÑÉGž~)WW¯ÉîW¼yí«—ÂÂꮲÐRår¹cÿáŸ?¹Õ™Ïž“»aë¶–8SKc}6“™.'§ c“ÓpFx»Æ'§·ï9ýx{ƒ…küš•‹3¦Y—Ët´ÂÙr•·¬ÜŒBV¦f £ÓpÈ宾#¿|vK{~¡&»Ãeô†+~úåoÞûÐëB±që¶Þƒ¶L65Ö¯Y¾è´åÝõu9è447Öç²8ÓL¡8>9ÅüB“·}ï¡WzfJºV'/êü­³O…âËdt´4Ôÿ™¹r)™ƒ¢o᱑ ÈdøÉ-»µuûÂEK=wo¨ËB„êk÷žeåæeºPªž½¥©\_ÝwÄm÷¼û"Ð::1µþ¦Ï™SÓXu×OŸ<>f¯ïu¹ì¥ç¯éηÁAá}Ÿ Þ7p oÚñQˆ³ïf^Ü1gB2ÊBá=[Ù9cÓuÙl÷‚ÖÆú:(òPd*õlN7xl ®l­Í ÷oxñÐ@ß‚ùYrîÞÖÜPM“ßýŒž%ÖJ¸šÁÙ[›^¯Ý[v¸íþî·ŸeÕú‹¯ù s´rݼã{ÿãÌ$´æP˜Aâ©Ë»ÝDìê„êðÝŸjÈ™u ¾$ÚÎõá?¸ðøø¼‹Ðþ56äÀ&6!WSÓÅ#C#…b©£¥ñ›lšÌw/ì¾´«Ív|ÐÞîÀgnüÃzìx¹=ù—ïopfòÈÐØ­¸. p¬3O±xi÷¸ÜÀÅóöï<ÒZ?ÛÜÚ!%œë–÷_6<YÊ,Ê·56ÔPBá²e”oG -g;[ïøÞ†ºâX¾{‰ÛîÐëæžâ™mûdv·ÎÞÕÑRMí?2,>;ðé½ ^ßqíÇÌÃGG`éK?xÔÁžÇ>û'¿ õê6ô¶ óĦÂiŽMÂe.O·ßóàâöúö|—¼A»Ž~áO¯›„ ÑÕÙAxŸ¬ èW¼6< ítn>õï?[ØPèìZâ¶û¹kùBŸ- õÞÝ:ûâoÜýì?4,>;ðw|¼^ù¡[ÌþÃC°ôå>æŒ`ß¡¡?ºtÝykW@W ê8]¾¸ÓJ:2<™‡‹N.óÜöýß¾ï¡UKv,Xä[ä ¶ì:ðõ¿½zt|:SiUàtf¥ß0W¹_†*5 º2Ð߸éö{WvflYÂÝ}ʼnlVÙ¼c@°;pëuWÀëU¾ÕÜ3ð,}å¿9BŸhoiºùš‹¡‚˜ U‚†þäî(’ÐLMÏà¿ÙÙò¾/oy~uOO[çBçA$y꥽߽íƒ3•þí¯Ÿzw›—{‚©k?{Ï'5u,\öîÂu|q¾Õswà×–…¾÷¦Oš;ö†¥¯Þû87ˆ­;û×_ñï|ËZ«_hÖ¡M,WÃ-Ÿ¸ö3ß^Ý2¾dÕš¦–v¡4žÛùÀBU*Í­]Å¿ ÜÝ?ÅíÊßu~O»-Kè»<:R¹ä”? ±®§‚Ý[Þ9¼~àæ¿7·î>KÿvßÜ Ž¼²ÿè W^ð»þZ¦tîá&6—Æý'm¾ë§K#Ö¬X´pÉŠ\}÷ 2üüÉm~ýf³|o}[3›>®i×5¸RWîÐ ¥·~ôËo{SWûü,Å»;ð7ï»^oüøm拯–?|þÚýÿËÍçÜììáÁ×vì;xæÚÓ.:«gÝšep­<|lî6<ÿêÆM›:³“‹ºt/;¥¥} ú£Ç¶<û·”— Pd¬ •ÿ€a¹ú‡™L¡X„š±öê¸âì%í ë³;ð±÷^¯vëçÍg·í…¥;Ä ”ŠÅ‰Ñ¡Þ}‡‡&F‹ÙÂ\.gšé¶ìtW³ÙšïêèZ 6³óïŽýòüö¾}ƒ2[v7N¿åÌSÚæ7€ñîüåÕÃë_}úŸÌ[ÊŸ‡~ã'Oºcn®T*ÍLŽ MŸ™š˜-2¹ºúÆæÆ–Ž–ö|}Sk6›5‚ÝË£ÃGzáU¼Y3´}'÷À«V»ÿùú·Áë-ŸûgóñÿÛKßz`£ø@pÃR*Š…° ˆòÕ4WV³¹ºJ8þÌäx±8#Þ,—«¯ojójµûGÿð­ðúÉ/|Ñ|ä™í°ôŸ?Û$>!æ†ß¿^o»ý«æƒËŸÚý×/Hh ®û½²Ðüâ×ÌžØK?xèé¸CJ6ï{×ðzÇ¿~üà °ô?wHÉæº«Þ ¯_¹ó[oýëõÄURùÒýO“P46oÞüØ®)W¡ëÖ­‹9ÀDq÷ÝwÃ+ Eƒ„"#+® q…èë=NÝ…Ây¯¿þz_Û‡‹Çy­8ý ¸ú[Á)1NŠ E†„"CB‘!¡ÈPdH(2hBóùüÐÐónëeRÝ•Ä'œŽÝ@òÔ¾Àê ‘»2x ’p…²ÁÈ¿òD*´Z@Ø5Ö²µ xÂj[ãž3*ç–Ü8ª¼->v3ɶP[pÂêž3*î–Ü8Ã*Ά8J#>¡’+¹qâ4Jâ‚YÝ>ÑBÙ#Ä&Ô³Ê'H¨ ) ¥Û¤\,BÆÌ 5:¡ÆüÆQ¦Ér T¿ýPA'DAœt§„ E†„"CB‘!¡ÈPdH(2$ŠŒºÐXº(1NBã6äWh¼qÊ %$!¡ÈPdH(2$Š E†„"CB‘!¡ÈPdH(2$-„ÚÆ"XàŽâ cX(-„V /Û$ô5Ö‚`ªÁŒóáî%EƒŽÖB} ˆu®4\F{…ŠÖB¹IÁ‡Ï…ŠîBãuÝ–¹ÃíH¨ýOµêväð¨¡t å#nåmí;»¸•7潄!²2(&ÙB=•GO²…ÑvÚeH¼PÝ ¡ÈPdH(2$Y¡Öv„ÃI¨˜u ¿B}}Mì8tŠ E†„"CB‘AÊýh2µà”P²Y…ª<2˜%TfÚ1ñ~§†f %¡Fô%T<œÆ¹eâš;äk¨ü„LžÃiœ©‰¹•w·0&›Ò™PJ( Åì‡ \P•~(®Ð´_CËÕ5Ö‚d í­ÊϤɰ,"½†J^XÝöJÈ%Ôà5ÐÜ+¬L+oÌ7žâ¿SJ\Ͻ¼Ûõ´ˆíÓ¦$vÚeˆ¿Ê×$Š E†„"CB‘¡i†B¦B†¦ Š EƇP«-ó$åo²PØ&å]+ßBPÐWe?Zf× Ód7‚Û#¤ò»ûÚ+:¡Ü¯7<ÎøÉið£Õ²Pç±,± Á° ÃeÔ…çH#AB埑wî+ˆÇvƒ7,Cò GVB¤BÙõ’ßԻ凛%®5A’Â{&x#“]BBÙ?%…Šwa%$U(J•ç®T>E‚…Ê´àjog`zUyv½ü5”MòÕÁr뇺5ÙÜxÄ­¼S‚¡ž÷Kb¡nìoêƒ?¡2wŸ$ÔˆàÓ&A[왚,èã;dH(2$Š E†„"CB‘!¡ÈPdH(2$Š E†„"CB‘!¡ÈPdH(2$Š E†„"CB‘Q*ùCØâÑ'‹„ u>¡O$„F|5àFÓ'6‰„"DÂ&šÏw†x…¡¡a6VÐÎÎp#EÂ&Õ¬PÓ4ææÐ"I»P°iå4ÕB«6-PœÆ/”͆-‡òÐ×qæAÍ©‚P;MµP8;{ EiÒ+Ôvºi”H¨QK’Q“Bƒ`Y)$4(¶rMBÕá^vI¨"Ül“РØ2OBAU>¬*o¹°îpH¨ ‚k…²7Î ˆûÿ)j¨Þ yÞM¥W¨-ž8t.iZE`Ö×ç&$Ô7âBF¡Aâö¼DÄ"´Úoc‰§Û$½äÕ6®êÜ]»˜±Ê\hp¬¼$©c/@¡FÅ) E‹J(Ú]C±ˆE¨F­<:4ú™Ô O¡ñFÂ&‘P„HØ$E¡±<0ÀªC$êBãzüÂ)T“H,…nPdH(2$ŠŒ¢Pç4ÔžS{þv â¤Öyæç›l?@6êB}ýTDÀT¿HþðDÊþŠ„ó7O ¹&ÿ©[0 ¦¨ÚæžË­PKs¡#"øj¸ý*/‡å,Ÿ#ÏpJ¨ß•29—‰Þ ±P·Ÿ ñ<—x„:ðDæÇUä‘*ˆ„sU÷wtPZI¡òÁ;ì†ÖBîòƒçŠPÃ¥õ4xí¸³UÅjåÙ“zVy·¾JÔUÞse,(TU,H(2ÑÝzF‰-˜(c£G!¡ÈPd}ë ¶xô‰Ä"aBiî;Lj ƒÙÐ'6)Ðx‡hé ›P¿£Š=bÛ"Áî+6©¦„"ÎXÅ:¬^BÙÉ©<óÌÇI¨/õÚ ­F/#Ô¦> ¡~aÒN¨-'òyC¨Â<ƒz e3)ÊÝW¨Ú<ƒ µåP ÔmKD¡¾vƦ…PgdžÑÛ¶¤k¨=gNœ+Ýž '¡ö ¸9±UmÁü$T*'Tåíx õ,w‚ml[’P‘)v†+™þ •Ê uì툟RÇšËÁ ¡j7*Ò.T&,¿¤W(âg‘ì¡Rz/ïY—ý~øX…„ò‘¯Y6R-Ô³3ï´“”~ÚD¨Ø–Ð u(IB=+)ŠPÉîš8HÝ…Jö ‚ õÕù|ø­µPù>V@¡~o%œ¡š õÛ] "TÁ¦÷í×Q¨Bç_Y¨²Í*¶B W?ÔðÓ·gQ\%KõÃF½„*ß•ÒPdh°2©ÎžBã„M"¡‘°I4÷B$êB5™qNŸH,…nPdH(2$ŠLP¡nÏö«=óÒ¼ ‚ MÐψ Ô- …Xê‘°I4X !6)¨Ðê ›„ 4®a®úDÂ&‘P„HؤÚÊ^ BM˜P·@°„:/¬~£MŒPñ\$Ô_ˆ,Ê’P3TPï°XPûOi£¤0oŠd6BíoTªÔHhê’P¿3çè"”[*%§Ë¨±ÊÛªõUbêÙäǶ%b£ä|JYrª‚˜…z^þ#êÔ'!»BÅu*¡\w2ȶ ‰-ö™zMvÆ-„:Ãe7ˆ²„Îñ¦+õu) Fi^ž ºmnc•ön“§Mg„‚íµêt{ùMÉ[8„úŠ[!b¡¾ŠgÀiؤZûp„[—Åx…Vƒ“ÌIdBQÞZ6©Ö>`–Šxña“jö+Y_'Fh5\ t¡X$Lhlè ›DB"a“H(B$l Cˆ„M¢áŒ‘°I4à!6‰„"DÂ&ÑÜw‘X¨ ÕdÆ9}"±PJ¸AB‘!¡ÈPdH(2Bu›ƒ@p^A¨‚•¾æ&ÀªÕ,â“*LŽ›PÁÄVlªÛÄ8ìÑ‚Là$>©íȶWn$ΰ„RBNÝdœ˜xȘ?ñŸ$òSCóçÀD™k _¨Â´Wâl„'ÔmŠ)„ºÉ%¡$T¡2S… G#ÔÐðŠØÊ+çÇó¤ÝÜVÞ˜¯Ûê‡"CB‘¡[OdèÃdH(2$™@ßzÆ‚-}"±H˜Pšû“Úè C6ô‰„M¢Áb‘°I¡ Åxz€„žéád¡òÏ#úŒ„M A¨ÚÈW^ÆH¨ªM GÞªòþGÇ$4ø¨ìùùL·P¬1îLVñ…ª=ʃPÜ'Nä3­%4Œç/*N¥Ð0ŸfIe+/˜bÆmî î\+¼ÍЄÚÎ✞ÄKk´B¹S}ÈüÉNçÃ[‰#”;-ŽçšùP·™ —2Ë#¦*/¸HE Ôíêá6uçJæ€q4JâR±Pö˜¶·eî‚£P®>çÐ*jRm 5_C™ã¨E'¡¸““´–PÊ$…Ù±?á…¿†Ý]({ü¤¶ò褺é½S ‰”ÞËŽz„Bß nä¼ ˜…xUp'ôˆd50œÎÏgŠ¿Sr‹ØŽì¥¾„VÃU€—CÊDì —ì¥¸•—Œž‹{–H(2©}žBã„M"¡‘°I4÷B$êB5™qNŸH,…nPdH(2$Š ¦PÁÔUÜI=¸GP›gD2ñÙÅ!I‚,Ô×ô8¾Ž<µÃ&I¨Û”5Üùs‚ÇàyvAHnt›Pŧ$c?»s¥|¯tl©êY=#q? e ¡U¨Êó F)ñBk¼ÛêØ#CB‘!¡ÈÐÇwȤûæHýW ØÐ—tȤþkdlÒ=Ð!R<'Ò:X,4R×± O¡ñFÂ&‘P„HØ$šû! u¡šÌ8§O$ŠB 7H(2$Š EƇÐ(çð;õBž7ås9Œ9l¡úÙ  B3Û¸m€BP¡žE@mÚ¶ìضì"9Uwî<<Ühñ;÷ K¨ÚÔ]òÓ;9ó)9å’ø¼âÝeмJ•÷µÀpú)™y¡lo-JY–?¡ìŸ’BÅ»` už¥º^¼šPnÄò%TàBá8¶5n¥O TÐRù F±•÷U_‚¬T¨Œ…Æp •_¶lù±­”i1» G뿤•7„Èlòç ;BŠŒ¦·ž~‘-U ëEgõ¬ÐÇ_Øi”ŸÐ);­¼fbV{¬§™ BQ¥o?çTƒúȳ¯œØÎe’b>•‚÷ÆŸ—œ·Æ`…(”…¾uýMq‡QSü?žYÿ endstream endobj 236 0 obj << /Length 2786 /Filter /FlateDecode >> stream xÚYÝsÛ6Ï_¡·£f,„ø"Èö^Ú´Éä&™Þµ¾‡;7´[l(R%©8þﻋøeÊr:ž±@X,öó·K¾Šá¯²xe¤d™JWÛëØÍ6÷+üúî÷ë6°p3Zùãõ«×oµ^ñ˜eqÆW×wcR×»ÕMôfŸ;Û¬7RÊH~·Þ(¥£÷ÕZ¤LçÛ®¨«õF¤&Ö‘ÈÖŸ®ÿõêçëþ@-Ä 9ÕXãʰd•¤Šq©ˆ»ë½θŠvEc·]Ý<⣌n›z-LôÐ:Îa"/ÛšV–EÛµ4Ìé§µÛºÚùu4PQ·/?7¡­¢¢ò»w»‚n‹º:ì³(¸Ô†KÆ5ñ¹=5%¡¡$Çü¦*b(ÕÄ_FŽ‘ו½¢Ù‡}±E {z´Õ®¥0'‚´’±´„4LhŒ8vy—¿¾·õÁ¯HVs¦•KýyEKt­w¸øRØwGP{ÊLfüU9m·_óñtzIݱ8ÊàÆk50Í£éÅc¸¸; –ýò¢ò3~÷C±ó¿¬uåMa;\ùH¯ë;zÙŽŽ®o×XúȹŃd½ïh¹³†±–<ë³ãawk¿à Xz‰:jO·hî½ ‹Ä5Ñ)Ü–cÞtÅöTæ 2‰ƒI¶{ºsEE6ØÅåND©¨F@l¢àc0øà >žÔ‚%Ê8a‰è#ʹ¸6ÃQÜÁ£&NèÂŒÓò'2šzf’ž±^xñPt{ÕpaTzb¢w¨‡q@s HÇ~Ÿ³X ›h*CQ·–Þæ¨B?>µvG#ØÜ.iô®±ž¼Õ”!°æ)ØÛ¦‹ö>ê£W Â,‰“—EwÍx:$‚!ó cQu™4šÕÿpA}™f2rf‹ìÒZB^Ý[z&3Ê(·Ò2þN”ÎS²Äl|½tj˜XxàùmJY2 „¥²¡Ç¼²å?ÚéÉô82ig šèDM·>§hÈä§¶¨îixF IÊäÀdk»MYç»Í1{[`6Y¬{kßÖ‡ÄFIŒ)ßα“4œA ǤÚá'¦áC—a\8 5#ª°3"°€ªæÇ8æ~³ØáíGmE7ÓkòèÓ•—§ÌÈ™<ù½·l.ãùyš1ÅS@š Ðâó1¬ÞŒ–/ÄQdž7óÌSŠ %èÕ9ÿJCx]ýsI“‰ +(Q<úä—7½µ7ÝöÔ}ç€0¦ ‰O$ô‘‹B£Ã'zèÆu‰=@@¼ÄBj¿ÂE œW4ÁûiøS)«¹ fd-ι'W)Si}>¬5jü—ï½Ô0Èø/ ç•~”ñ¶&²yƒX-Í(T†€(®ñ†¦8Ë„œeƒCîHÉSš– ¹LJsî2YÂ2­/‡pƒ,›\Â¥~Èã—éÑ#ÌäôÓÙ¯±€ùÅ–;š¦o¦À>AK0d H3÷—°D;D/Ž6¬Õ¾¹0¬„ŒªüàFÂ]grz §°àú2Íüë€Éxû7èÙG+šm¡š©OÕÎú!jâ;@¿žUL•-Ðäl)!þpGU¥–hí¬ÄÁ£{œ Q‡«à”Ó¢åLôxLûê ~ñ2Ît³Ë>$„fï“ÇÏ•îÅCN”½­£Î ¾ƒ qâ?p¼·g­¼T¿>á(¦gñ±WH EIK¿Åýöv€{§$ aëÇhxøKGçüÕ@°¢Á誻eW³Êú¨v{ê:ô"wXõìIÆÌPÌœ÷¢r•˜xø{bÂ+´ pó»ÞÊe MÂ'V~Û@Zv™Y Žø›x«€AðÎë@$}È¡“ÕbÀ‡#”|6¤jf„WÉh·}Üâ;»¥:U$Óø÷ d¸öhíìP8Þ÷–8‘1äÀ”¥³rûÙ€•èyÔ…¤”{×t ²º¢ÉcƒÈµ/ø—ŒˆgL9V1Zxýظø Õ“ÒpŸZ PàÏ ¸æŽŒá‚š!·¿~ÈV?Õ¯þs¾$RÌñ½îO’…NÕu@ÖÈ`ôoô«¼"ôΣh$Šè 5j(\l×xÀŽE–¢ó±¥ÔN[Gfz}®ègC®qú‚²hú³—WŽËZJ³”§/§UÙ‡Ísô󑌜@û© ,Tߨ3·…øjúU.ãíåKO`¨Lð1ëk)Ÿºú—6™:]õ‚3®ñ ]ã^ä—~¡"ã¢:{ @ÃOÁ¹Ž™Ù &€úäÛÁ¹ß¿Xç³c¦-Yd×Ðn@nŸ®hŠ@7Žxü¤#«²˜I`fÌøyÐV_`sNÔƒî ‡ºsIzÞ}Røö†voFÛÏG¿fZÔ¨˜»¢Æpß ‘ ô :ˆŽœñ |Î;“,4;æþ¼Ãê ÜΉ&—¬  0úw%ö_àj~̲3é¥8½4G¢ÔO¾@••½T’~ñ–g$ÇÕŸ+tÍ$H/™få@¦V"6hþ†qúý›%óœ3-&WusNÉæƒç§ª‡¢Z¤OLƒC±%Ò ÿç…V_àvNtëë·V*&U"DÂS”šéÄÐRÉ46{Eô_ê©Hú±0øX2¾‰ŠSyUOeÞùù_ dèv½â¥‚µEšð߬¦…­ÀN®Åo>žX†Ów8<…S£ìÐÒ ¡kÚt88 ËX§r‰¾ñÓy㉴ÅWšÙ€ð¥¾ý¸SéÂDÈ)|¡>:PSzg `ÌÁ˜,¦û´þ«`^bA:2^‚r†©¡‘u½†”î0]^µå¢J1žš—}“P^2z[.ãÁbž]¤÷„Üÿ]ßáLãS¾ˆæ€=¬§å(ÿ¶u"(홞j:ôT¯|×ài3;Eâ ç¿4·PÀ-3I_Jaáã vLרk¡o,¡?n@æbÞz#ÀŸañˆÈ>£iðÊ:ßaÅ›÷MˆÌPƒoxÃÔ`‘ßã×4NÞ /ZðñÞa¡Kzò9iû£)À`[7þÓ¼•ƒØ JÀõjhNc܆>ºÿÊ‹7[:|çë™Ö†nzSŸî÷ÏÖ9àwÜãáµÉPè|t¶¶[4ˆ"cÚÛÚ¸Û<ù„sæLtPùǼÿª¢ç†Ägµ³7€”iì, aA† Ä5Îâ¿'ûÏô lP˶)¨Qiý‚Û¼ÅÏuÂ)¢qÜãâð•ß}Cÿu’o±./J÷ý.6KMl+ð0µÊ“Z}s6 Û7Ãþ%ø9=d–Ká&’eÄïÍ_U„®µäþ€å®µJžà‘8UÀ`%zÖ~ñfX½„¦$‡äŠçþ´!D/ endstream endobj 249 0 obj << /Length 2024 /Filter /FlateDecode >> stream xÚ•XKã6¾÷¯0r‰ ´‘Ú½Íl&˜’ì&‚ ÉA–Õ¶6²ä•ä¸çß§ŠEêÕêé>X|Öû«*òM ?¾Iã‘’¥‰Ýä—‡ØÍ¶§ }üðÍ÷ûv°q7ÙùnÿðÕ¥6Lä·¶-È XÂÎ,‘r&ÚÎÑë³v«xt*Âæ™Ù$g ØÝïmÀ¿ŠþWäÛ¨•èfõ‘èzÄ› À·Šr$_ÔèÍk H¦À©Ö`è01:LWF¥ÖÌ ãUJ‡²àbÅóµÊʺ8’+•5M÷Áßžšªjí{YŸhþÔnÑ€çŽ\n0šð~G.›ª™è0¡Q½¨Z·8rïwÀBw&²5 cxö „‹5ŠX3%’ –ýÖ˜èóvTL¥*ìÿ5æIQ§Ô”Sà )e7fF©AB‘k„b‹°ûJºÓ¤¥ÿ©x`·$aBÏÌÖegeý{C¾Š tHvÔ¤VÔ*½D~ÿšÿi°`lו·.T ÌépàÐ’µ:Â_ý=#XÌ ~ ¸FC¤ î˜iîÑ‹_{A?!ÙæFƒ<«IÚ1èœÕ§ Êl=„€G•Ò«¸ù}%0ÜÒ7i”Ü^¤a¶.î4ž{.L8‘ÑË)æí¨ Ì‚°+Er6ëé«§a_ÐðaÓúíD!)x§õ7;)„\0ÒÒáæïDP%‘S˜’  G 7Ð0wŽÇ#ö´€p$ùh<ÈßGØÖÜU±Ë«Ò# ЛÚòt¨ó—Ò¿êÖ÷çìŽdË-f,Zô5ˆæóÖvÏý.ýW‡j`€³‰œo"—~‰\9ŽLDUFª_C/3G/=A¯W¡+!âýëÈo˜Nõ d½I KÄêïAVú³dô±÷Pu,ž²[Õ¬Ò̘9Xý±MgÕ ”)©F(ÂT7Ñù¬—YEKwÌíÑs¤çRƒƒì_¬q­˜f’ÄGàŸ]%,S\½yÓ€†Xnñè~.CÕì_ЬDÊú…py OϧÂèT4¤‚y§Jí3©?µ¦)XÊÿ^­¢G4›Ô*˜8õÕÄ”MèoˆJø=‹ ’‰ôEŒ’éÜÍZ4.´:(•¤1éIÌÑÎÈ•÷D%<‚ ™˜ÜîK8'ã0–5zŽ;Ñ}}]°yŠ€²ÏÚž,!kÓu%ä`R™¡1C¤ñxãW\˜Ãi*xÖêDaÐÛÚ ë^©-))ÒJ$Œë$(S]X —Ô´cVs¸…Žþ Ͱ«¾ïƒë~[Z=}VV¢³…lRË–>€âzÃr!ƒm=tYÈmà ¢ûûùÌô "œßM.Xiã—dœÆ~,Â{p ýãôù‹kÖÊ|+ˆÉ3ЙDØ,gñèíë{¤åkv or)>·PÛ€r-˜áê÷–°{7Ù¾öf±¸Ô1K¥ÔΤ,%uµ”óLMB¸‚¸¡…™«úWƒ&üŸNÃ\xI8Ày*×ÚkYœ àøî]óŒyGFï·®Ÿ¦B| "´a‰<kS§Ï%s0ˆ‡÷”ñcÂHHÂÄ,™G³{¸¦{xÈÅ|Ù5sý`ê@ñw«„¨ãÆÞ3´Ñ÷uîï$…ºv°ƒ3ø4Fˆ@Û• h:¦d\“)ÒQZA¿oA•/* ß˪¢¯ƒ¯û×̆ŠG*õ2+¯X# #àq¼'ZÛ?,( ¿ÜwV7¾“S³nøq°g=£=ãwE>²³šØ9 iµH3êEI¥•¿' €¯ÕòýæKŠñÖѼ~jb^æýÖ©@ÅÒÎßq'Aá+[ëš ­k]?g©{TöÕŽ€RË ?5mu\Mµ xúP9S>²ÃãÄ?1߯h5ã­†…èØ®yÿOÅ$é–¦(o†[ÙÏ· iÊäz?0çÙ21á¹þ¬ öˆÕ_«T…I—­šƒƒòÌ̹œÀ€á+àÈd˜:Wßn±€ò!PÖ2 endstream endobj 257 0 obj << /Length 2789 /Filter /FlateDecode >> stream xÚ¥]ã¶ñý~…Ñ—ÊÀZ•DRÉ[‚$¸¢‡—‚¢éƒÎæÚÊÉ’+É·Y ?¾óEŠòÊwûàápH監M7 ü¥›*ÙJÅ•.7ûó›„°ÃqÃÀûŸÞ¤B·Â]@ùÝ㛿ühÌ&Mâ*©ÒÍãS¸Õãaó¯èûS}™ì°Ý)¥"õÍv§µ‰ÞvÛ¬Œ]罹ﶻ¬,©tûïÇ¿¾ùáÑh²ì+9CÊ/°–&fõ&/uœ*Íüýs[ª¨¿ UÕ—Kû‚`ÕŒ9÷×Ñ2æÜ ¯€þ°ÍŠè…áSßšîȃC3ÏBf›é„wÇå1²µO£úAi‡ÖŸ"Â!×iâËèvBálv)_b—ª85|ÚZ':Ú_‡7Õ‰ŠšŽqµLÕg7ÃÏM‡|®BÒmÓèÀð™&>Ñ…pì÷&Æâí.7&z×cû§WdÀ0ÈÁŽ<>Õ´JÅâ@)e¨U±Ê P"]¥éì05µP.Ô§Ò8×Ê>°4tVÆU!ÒHyêùÔìñÐp`€#[wÈŒQÀe=1Ô<ñï 2†êÇAkeöØóÒþÉ­³ 8• Ç´VŽ…6Ó‹Ð.ƒMœ!!ÁsÓ¶t“dy‡}Ï.ÒÐϯU½UšFg’ê 0Fð. N¶½<][L=“7çú’äÉÊ&ljˆs†ƒp=òôR$¤hKitdtÍTÇ¡¹\øàá[D5lÇ“/ÈJ ,®È7Ä}Lâ™Ð Wé*òö™FxöR訙˜äÛ PGÔ®îw“G¿Ù½,¨»Ïx}ã`_wމÀH ÓÀ¡ ½ÒÑ/|/Þ d-ÄMÏ¿`-+šd+åoZ93B»HÊ™ )cÛÚzDWR•ž éz†®‡™éèovšÈúhŸžéÑzq|Ÿ†ÙWXÍ:Ë]Ë!`¡^@i4"$Øfd²¶ù¸eƒäEërÞÖdv¡)Üä¿‹£Ê𮌸õ 9ô–Wqö P‡ª•nÔjI)æ´Ö¦8Ñ‹Êwìt:{à‰þ×$Uß2~´Žà´ö²4‹*uÑì] ×Y‰yY«$sT—º³íŸÇÕ0šÇ:-ývaÖ‚h›yóe!>0¯´÷C#÷;,nÛ²cŽº*Éã$¯@‚%Ü¢àÍ~² ®º… Áw,2k®%é©Üx#¤7B@;µ};ò¬ “8ÛtŒ“ýLŒZ+ÈK r‘%(#‰?[Òë½ìéB÷l(„šc5ÂuÛ“‹)M™›PC¥Ð¢ÔlBOýðŒw©‡SšÁR¡Ãâó< ðrfâƒGöàÌ5ÆSCr}ê…úxô+©N H$1 ¿®Ì X.¹°;ò€Móãä gK7Ò›ƒZ%|¼ý±ùDœŽ|÷Q,g7Jh³‡P²ã“7œµX~ €?éN„Z~»ŽÓY<ù¾ }=§UÂ>«U]¸"øÈ躓ò ÌVÏádb\/Ëxy²ŒR8ñkbÌK½Œ‘7&m¦‘QýЀZ€0•CÏe{ëª`9ä‰ñ¾H9³Á’úw4F„ȳ æKöRd˜c‘r=ž˜ÌïÀ.¼ÜCòù«z=pf•-ê4ˆ¬¢êg.5&IÛòˆœ¹"E*ï4EÕŒ}æÅð@—å”+gÂoʕΠ’éÍþÚÖÃë3VXEÒ§Ûç7l9WI™¹<^L‡ö„ãÆÕ,ù¢¸1èmþE÷§U—‹ùq(¿¶”5`3_½Ê11¯èBüHä[ÔâCY êl½PôÞ§ô²HEYÇ_ª‘)ƒÞ‡cÊø– Èæb¯¨"Ö¹´RãûD~?”4wÂ[Eñâ[ù*¾…iüRDòo°òæþ8vEEÊ{ªÈyQ îEôÚ´•ÄǹöÒÎepúËjÎØQØei\”¢ÕÇmQDŠÌ ýÒG¡¼~Õ¦§ ­em*É"Z¹X­\%¨Aß—ÀjÓ—´®—ßÁ1±Ünö©Í.×±.nš)NΘI›¹й«Âéñ™Ï…fî*Iˆ&3bÌyP•.‰ç·A2ó>~îå:¤/ÕÉÌøW,J&Xz‹Òó¶kuë™o©æJ£®PFl-ÃñRïI“Ieه㥟‚K(7¤'yêRŠãÉ{Ÿ¶mê¹|J¥fÀÉ këx-ܯªˆ¨ž{q²ßÄ"fKÉ0@6^Nvh ɺ!\‰‚Ú>ôe08z+Q¯œûòd¦Î*îtíšÿ\ t#ûQH^éùxà´(æh»¥âŽ>$HJ_¼Í\J§¨ýt3¦-"û,_H¾¯ÏØíË£Qc©.õµÒ¤ˆ+å# -…¢¾-üì‡+Æ\ o[¨vLãëpÄŒÍG`½µ}éÅMuVAÝLÙj®¸ zT™9B^¯s@À=Y¿sx,ó ;#L+`vÙp¥ý‡x\–øæ¸Î’egÔ½là:6ÇÆÿ»° \Ò¹ 7?zôïž­„F¿jÅú}X1Yø^‚MöØÛ÷ â¤É˜×(”aËP˜kd7`ëRÅtvÞ& û ÇæIž;SàýĤÒF(¤€™zX½QÍï6×r@?}áëŸ \›ºP†íC/ gÁq~@.ªópm>÷mÌSãKq¼ÔÊßõòÑbéËüÍ€¤JªM2× àÁ2d F¾ à+Sô(¾Èqn+l=6–?Ndl—®SNd=ÿ:Ðû@’ñ§ò€nÕx(ô 5fnuö$€/áŠäglÉqÅÔ­n!·øfê‰íÈ9‘âïÒÝ•oøKÑ‹Ž•w¾¡N~Éi…ÑéÊMÜßú0dxË—ËN¨tg.ü0-ŒëÜøê\çõ6òê Š”°p'k‡{/{J±EXѰïDQÇiê+Ûš€Þßsý!'•"Êë‚_hÅkìÕ×x8­j"ƒ(Y“õgÊPç1ë¬ Þ,UÈ }?¹çf*®ò×ÂoøâèxÒ2oP`CF¸? fE#¼è–#}‡‰ ±q ÄZDþ?àP„‹ endstream endobj 262 0 obj << /Length 2669 /Filter /FlateDecode >> stream xÚYÝÛ¸Ï_á·ÈÀšEêëîéš^Ò¹pY´@¯yÐÊ\[‰,’œEþû›á iÑ+ï ¬Ij4Îço(¹ŠáO®Êx•+%J]¬êÛخ» þøðF2Ý73ʿ߿ùÛû4]ÉX”q)W÷sV÷ÛÕŸÑ»}uœÌ°Þ(¥"õÓz£u}ìÖIÁrUOMß­7I‘Çi¤’õ—û½ùõÞo˜&É’!å+¢I‹l•ZH¥I:‹£é@˜·‡·Šù[©²€=è4Õ^HÓè÷á¡™˜<Ø$MEžyúmg‹ÌHÛtý„zTÀwügheÚ¢™ªag˜¬Xo`³¯¦žîh¥j§}Ú퉶y¼x¹> ƒ!å¢p«Œ3«‘TB¦$T]à°ðBVDÍH¿#0Q ™-­Tü„xãÀ †»íÅÓß7ή!óªûEfx¨<æúÔ´-Ž è&z:EÌâK’ÚWù“?‰ÒQºÂWNÍ›i4í#Ñ}=ü†=>í–l-³L¤yvaí"zßþX²µÎD,•£>­·F,±Ùbp¤ŽRˆ"+.vø_¿NÁÞ{Þý48²¥ÓRtÏ\¯@_JüK –ð䥊~XÅžhRãd_uk !@”d"Ì}‰¬¶ßŽ4û,µi·Ä§¤Åïy¢ÑS3íÏ ­/’|Á¹ýi4?],£=Ñ#ä`)pКljF–‡iô¤§i¢Ì¡1ÊàO<³¾™*: Kpöü`­§ßé@;^o&j‡µ{>C’UÎ ”Ò€÷kˆÃïë4o?š¢V4†ôž¼Îp•žJÖ®`¼àʸ·RãpÚtg6 ž•èR€ œá߯“,ú}¤Ñ–œ$)E®¼—5¼ß•}À|A³Ø€0_¬–vË…ÎdhícÕ™v9:Øåg¡ñÁ°§Ûøø\Û½Zs%@fÔ™ ©Ÿ…I)Š4YŠUº8Ñ4˜˜®Å„E“Ó›ŽÁLíó¦=Ý™þ€^“ÉèãÄ/© Õd˜{ßÑ/E›öiŸ…$ hKA}…mª®-ï„K@â“bâ)'9÷ÑÔ ¨uô‘ó#×dV|ž½Fѷ蹆±t*[.Õ¹ô/†z²ª€\-2™a‡ºÓ¦%H†Æx(^µŠÐ$´ &|\>ôãD£ÁÔœÖ «[ÂÉqqÇÇÅ™A[eœG¿Q.iºÛÉ)e’…Jõ´oZvš=¤6û&N¶>¾ \‡Kœ›pøÀ‰Çc zço¡+…ög…ÔKˆ«ŒNÇ™ÏÎv¾[wkØ‹ IÄn …¶ƒÁ¶jéÍü@ç$†¥C­‹%6sÚÕzü‹žqUÇcÛXô«xR”áyÒ†ªûáP±ࢠWõiOáã`?  ìéØb'¶ŸyCØ]?ø=˜ªƒÅÇÂ’xtè2–¢£ß_OuÛlŒ¦ã±ªm=ƒzTM“9'f…%YŒ6x+ë0­à w]?Ðé:¹4Oï̪hŸq1•ò±âòÕ4ºŒj91ªÉ*‡dµ­Ú–ß3˜{šžšJ8 šUœÞY®û+ÅLŠ,ñìó)a©ˆÙ¡£ZÌI ‚ÄÃðOVö$뤌£_°@.x0¹õ;Ó¡‹-1JÄŒà¿ÔB“¥CgBÅÑþršÑLWÊ7`*GJ¹L’d±Tü½R¾sÐlì5{¿ÜMiÇÅ ‘jOn+7±w9CV¨‰c)ÓVØCXË'¥‰Vaüöä#”%8pNÓÙÍfþuF¨;”*uO•f†ŽùKX<]ñš—Y”¿ì®‰ÈµzÕ]S‘¦*4,ª'ê¼FšWÔ͵«Ve°8H«)Tc -ð@pÊØækzÎã\¯ðÁ,޶ó¢†ÔZJ")³ÀP禉u®gð@Í{SÁ]ýÄÉá§ýব¶Ä -‚¦ÉJ|Â÷cì„yª7*öšû碕D~ŽFÎ8‰R"V2HðTˆ¤dé¬d…“LBëÜ>>C1$xKVx˜²U Ô®L±üSGAÏS¨t—°^÷àÉ#ÅUß±8ÖæRZô?GL³6qF.Ä» W0Z’‰:./Ûå["æ±^3ö3ôÉ¥[A}˜ˆUª0gˉÞNuúzªL/çù—Ùk)Š3ôôA Ú±A9Ò˜ÑIî•—[åáBeûKºÀåžÞ ¿24™ßól™#ÓUôÃf©òh¹ÓÒôg twè!ž:(PMõÐz¤âêM·™c¹—1Ö‚g_Ç7–‘8½R䥟¹l 0¿›'—Ôu8p6J˹Þ:ºM£dYX8€¨á÷*›Î¾ù.µ,/îs¨Rá_ýíûƒ¡¥ÀÑmùÉ‚éï ¡qœË÷„t5h{¹œ¯$íóŽŸ›tXî‡f×tPþ~Ð¼í«­»Ít|aL û¶‘öìæéVË¿ˆ×n3¾Tŭ诋–þ&é'ôM—ÝÞKïÜ–’¿K}E,Õ³M7”>õ\`Ò3¢¢o1J—xŸa éÚD™:| ÏGã?–Â,D¿i죔éD°Œ»:ø÷Ø=ƒÜÿEá–Ò‰”"Ñ>O¼`L<©O< oÙcv¸cG…6bÿµ/ ÌkSùTÝ»Ž1ün­ùƒ*$*âÝü;ëük#LX—}¦µ¡pñð]t8 endstream endobj 269 0 obj << /Length 3187 /Filter /FlateDecode >> stream xÚÅ]o¤Èñ}…•—c¡? á’§[í6ºèÎÑ^´·xÀ3ì1`c{.ÊO}5ïnž"K¦»ºº¨®®oF]Eð§®²èÊf6½Ú_EíöW<øù»WJ𶀸`~sóê/߯ñ•ŠÂ,ÊÔÕÍÝ”ÔMqõ>x}ÈÛl1ùz³µ6Þ6ÎwCÕ6›­N]Æl>ÜüýÕ››ñ…±Ö_Èb>g-]°–¤6TÆ2kïO»ÀWœ¯Û¦ºM¬‚¼Ú¨ aè-1,-»0¹Ú*ª˜I½¾êáIôí±ªc)ÓË›â̳¡åç±Åó?à¿’!9 !Iƒöv³“àc¹xAø!~UWz±Á޼®öMYðÚc5Ì€¾ÈvEÕäC‰‡y1ëŠyÏŸªî%IuP>Á…ÔÀ¬Mph»ê–o*¯ª?™ùn¨v´–š ÜlÓH¿”5²×ìEp³+Ð6 #§VމÜá86qŸz¦Â$R~ëßÈ›=Hú—âÌüláDÍs×5î¾+‡œ¥‡ðöŽŸÇöÔj C\îŽ7†@8$ÝÙ#O‡CÕÿ‡p+÷÷-=UGp}ÞÎÇ@lSÑ‹äŸmJ6fñÈ ‹.ßïQ°4»¥‹-w-éBÆÛÃÉ3&†w‡ÏÙ[V4‚%÷;üØø~—À¡óÁĘ<®z~öCU×<Ìë–ØnùŽyé¿ó©”ít#Ó »üŽBÞѬñûx¨XP$qpÆq{âÉÂÔB„y D{ ãÌM;0°)weßç]…‚œ¡“iÆdšdì"•hx²45öç~(áš-lÙ‹hZ—xÔŠGú鑜AóhÉH˜pÿ¤¦.É*¸Í(Œn AöI8D ·Ê-…É{†°{Á]]Ùß‹¼ÆtäÞ@òpy å±~‰e‡B³IœyôÈš*ð¢ü-Rœ^Z]˜ßCžV¶±„ÑœOBD¶¬¥Â3T2tH…®Pªò1D¾mðîPÕåÚ-Î-š®MgÓkÓŸº6GYb¼O«(h€È…ò1Ó}ÃGÏ„“œ¤’°kK½kã@àÄVqD"Ìñߣ¯R?˜¶Â˰÷÷ÞUû½ˆÝ F \ÒÈ¡ ]Þô5Ý5NlÅe:*X/²6 {ð$«AP½©±“©2±—âŸWí#t:õ¿2É1^KQ.TK €¡ ÷VÄcrŽ6¶Á,XŽâ‘å¢wOÄaÞjF¨$íÚæã©Ùù”ˆòRð9¬ªœN³Ð™—‚¨IÔ'‚èÖožjííiðH„ïß„l˜:©$ÔqÆØ&ŒC…×¥!Ö£P|¼mrÔqði?ðÄŽ’?‚U÷ËhQðRŸ¥½øL^à“ §£H…‚5¢Ü“çÑß’3Â}ŽAïT烯•ä€qZ‘aO¾±¼r‚k óîCŸ%Ô$âSpõ’ˆ“ºRª¬êihS)4/ux+Ãõ~Æ6.!Ûøœ±MØ}u¼¯+L2¸~CFòcÕ,©öG‰ÉÆ¿ ó™Éçüg³§$eâIè [«¡Z"“c¡§ºXÒhpÛ©åd"°L–ÍÏ"%‚Y² ¥Ð`•³ŒU}Òä:êÓOÝmµª1& 5¤®‘Ï$Ü£Ò6ø'×->ÊÃàXEíǾ®1Þ] t¬C—Ä‹*®ee¤z)ß¡³>ài˧±F|"Õ%ºÉ+È2¸'< ƒxC¶Bwrï3ê]¹§‹Fà]Ÿ êŒዚ­x1ÙèWTØ1Î;2 YÿXÂØ“uälÌÌãK‚Èë9—ªŽ0ÔEDË_P°«i¦BsN¿Õ´²Æé¨–D2/ÊÖKÎdaJ% Šà÷IˆÕ®ä Ò\0^2ÆN “%c$ä˜¥ïÆ•»Ö·húÃËã’)EJ2%ÐÍ£Žó\õü¾"vù¸¶à ¹`äϳVE©%€o'ÐþÀhCJ&#LíÖöL266 ÷/Û Û<–Å—D§œAž6R ’Oãpœï¡¸tN¡À,;'X  %,Þ®¬y<¾ë™_²,0|zùÒ›½ åõÐîK.ñ‰98ŽûKÜ\8Úyúª3éHà€OM™>NÅÅdyìV4ò»€=roðϸH倹^©¹5a¨é†àg5‡á¢Ú>+ Òósy’~™÷B&¨}9¼Ø´ã/¡¾R‹<>B,Ö¸k^àví%V”žçw ”ñY]O?SãöÂìÝË"šø¹JóöþäíêöI_ÁêŒR«"ü´KrQ’tâÀ7Ýh(=œ°P"üFèkšy™£ý;N)–Ý+]öÍ»W Ÿ |Õ{µÿ/¹ñz‘ endstream endobj 271 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/mnt/storage/users/claus/projects/geomview/sourceforge/geomview/build-opt/doc/figs/ap.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 272 0 R /BBox [0 0 158 184] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 273 0 R >>/XObject << /R8 274 0 R >>>> /Length 67 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hjf¢g6´0²2ÍõL---LLõÌ !Š-\ò¹`ë¯ endstream endobj 274 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 326 /Height 381 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 326 >> /Length 5936 >> stream xœí];rä8Í9ʸmµ;'ѹ€Ž¡ˆ 92ö­ ´CK†N ·­qç$±Å€ÌDâK€A¾ ©ªH? 3Aþ7 àøÇ·úëóu§i!¾ž'¿þr¾>á±Ïúk¼B,|þzÐøxwý¸žµWŸ…ϧEÞ Ü,YPjü|º_¹¯‰=¥Æ£å¼¯É"5>ïU?:ÃÊžRã/o¿ç†ßVö´]ýž»¿óxÁ_¾Yj”Û¢KµÔÎ~‹…©[jLÚr‡xô²纰@ÛwXÔ£FiËÏóz„K3+ Ïø¼§/Ÿ¯Ægè•Æ   ùj|ü¼[9&©ñAÂ5*çwòa¶è}-‰¿IÅÚÁŽj\ˆy_ëöJÓ»^Lÿxk…Ôȇ2ïö– +L’ï¦ù¡!îßù{!Ji†Õ”45>Ó“z~·Ô¨Oþy­—ïèÀJ)€aÃäêâ Áhæ™Ô”T52§’DJ®œÜîÐ K¾¡bmépV#58‰jä~gj¤Ô¸ù!%Üuº5 5NÿrÕhÉÔ¨ëé\ƒM;,70’[n`ˆ£Æ±lKiôuwÞÜð7Õ·ÙÝ]ûf#ôCØsc¶A>t½ÕØ'»«±S„ÔH—°]"¤FFä­Fj–Ûjü’£¬¯¯‡Ç0w{=Ør¬q±`Ôøþù4ñù°ˆxr,ïΓu­˜Ô8±ùü=»ãÔyøçk"ø×’˜÷øüߣè”øs ï›iœtyÓ˜·ŸÿL‘ü…Æ©­y¨ñ÷Ñu:|ÀOÖR?Ôøû{äòdýŸ¬ßÕh|ûQe³Å‘söo²+çNCcòÙO•ZRãMc\¶ñ¦1 ·mÜj,‚[Ep«±*¨qé/ô’aùÎVûveÓø¿´Â2¡qÕÛúI¿c„Ô(ýÆlyúàÑl Dã˺OûÊ‘EÂjyÒ¡G!“F¯C4†Ž6DãÔÇÿ©}ŠÔç0qè¿tµhäÛLjRãT}Gs6kqý¾|}|šëý¨wU‚ÆÑYÄõ“dxÔ8UsÂ1jVçÏ#¯Ô¦€Z ËùjTǩߩ(†QºfãúÏ}ºiÄgFªD´m\øð)Íÿõ‚AóŒ¿fÒh¯“FZj-ê<Ý ×÷Ñsf‘¶Q×MR¥°õŽ”>t%ß`ññZ4º¯™ït£àQ£Ú.(Fôy„Õhä ÐÈÛ0Þ¤m¨ÔE#°’ÞÓB|“Q¶Ñœ ©Ôk4êÚ§F²3ßéF!“Æ5:›lЍ|.¼V¶ÔbùšÕ¤Ñ×ÄÄØÆQ5ˆž9˵ìúeT»ÚÞÄà~£ëšùNw#ÞOæ(&2/æ ³k#L:<ë|øšñëðÄaÃ(&}WˆÅ¨î÷¨àáñ¸&Òwç{8+ù®‰ú¸ýEЇÇ­Æ"¸ÕX·‹à;¼¥ÿHVcƆÂ8 9'/ª± ‹g¡1²m<ú¨NÙ6}T§Ã­Æ"¸ÕX·‹ ¨FæHó´ ÜYØ+j´’Ráù# F dƒÐ?¾n5bþ@ûêiž‚{Û8`ˆs Ph¬‚ýjÄ9rä–PÖ€E˜:¥1F(d™½Lc~ɵ= Zy4¢&†þ²#%N¨¬FàôuLcLKC£ôãõ}yÕ9¥#Ûo”š˜PÏšöÑ/eì…ÊèQŒÔáxƒ“º¤ñ¢cjßH5Õt_ÖÃã©æÐxI5úGª©ÆæºjtŒTu6ÚÒ£ ‹Ü¸¬]#Uװן&yY5©.‹Ü=ä[Nî/ËÚO¦ñªjª>–µ«1ž‘*ÜjŒ†s¤Š›>ˆuâ²jGª*k¤jŒëðˆjL¼§OÿÌçÙÆ4Ïrçé˜iÍÄ&Hº½TrÕ˜U©™- ÷Ò0â´ÊÂB£'~‹/ o?ÒU¯ì^jäþPr@xbw[¥Ž¢q¹+Z¶›­»˜×¿}…^“›Ffn¥=™[é‚6Õë*ùÚ&ª1»¥–œŸDfÕ°'âÑ۰̳*D¬:¶îN+÷hbx¥FæÖ¦‘]åµ dÕKØF õB¢Ñ—mÄw8)Óá±*52·AqÏÌŽrÙHU#…@cÌ]Lò4±R+{$u\%›£+„岑®F ›F ÐÈ$hµÔŽ‚Ò66«‘×1¶ÀM#›œTý&±M ²ôÌtKML!5¾£¢‘¦ä˜î n¢¿ŠSÕ¢r«.õÂÔ<øit ¸U ©1ÉãtÓèPcšß®-&¸‚q©1 ­Ä©'îºÇ¶1ÍÄ©¤±·–ú§ Öj5ª1>:»L"Bj<1hhɱò¦èC4f2Ú±)Uõh,¤FbMjrlQWÕtL#r_e Z,JM®ÏiTMŽï––4V]¨?gшœpú¸D¢ÕH½@¯¿Ðø›|ge¬ÒuµhTŸF Õ•ÄtV¶Ø…t>Õ¸Ù_©wR#:K<R¼—F‹–üøòs52Æb¥Ö„:+õ^jÄçL|¡ËÁûh´&éØp!ó:3”`ÓÈ$(Ð8@ÓÔh¼F)•šxéqãòŽ*Çu"lbRÕˆÏ~=ø`¥6&^P£EŸ*X R«8€ß6jÿn:¶¨‘|ˆ¨ÔÄw¤Ûá •ZÄöÑCfKN#g'ÆM¶QD=Óúghbœ’Ü¡Šij4–ÊÝáAž^f¥§m˜QLáO£ùEX4byD÷[ÆÆnxÃù‘4Êê‘n@|~cœÔÃW5^ÒmׄxׄXzk¨$61/”Þ¨Š&ÐØ›¿1ŠÆäõ¬hA5F|{4ÎÚ+»·el ü/¦a UþþãÔ¤»5RyéD=³^ìpíuÇqj¦8<@§>ÀôJ×m0è6Nýƒ>=°¶z»\¥iì-NýŸ»#¿qÁP’Æ~[j < åÄEPUÐ(71$‘]ÑèÓ_YóW5PWýâáMŒí  ë2J«±™8u[ùõãÔ# ˆ,¢¤µüÆâÔáãÙŠŒöòëÇ©kÑ]º’ÔˆGvG6*N͈{¦Ä( r‡1ZGûéªTAèiˆƒÜø€BÎ|êmžÇl5Z‹2ãÔºÓËû½dóƒf4éó©·zsÕ˜L£ŠS§Óˆ~™R©£hT¶Þ6ú6¢h¬¬F>óÓ¸´3.i„;JÉþF\a²<™-u:Iq4âå)¶›Ç`Ðlk£ç1³ß˜¥Fé‡Fcb J¯Z9hÄá+ËßH¶µÉó˜ĵB¦Ñ§vÓˆ;6Ü6ª_¦ÚF½ ÙßÈøØàyl3N½b¥&WL6Ãv[‰S—@æ|ê46§.€¼ùÔ[<}ûIGGò7Z£f”c=}{¿](nQúSK¨Gcqê–üIh*N½ëûSïºÇ~[ê]÷ØoK½ëo5Á­Æ"¸ÕXñjÿqܘzw´¬FÁo d<ÐXòÉ®{LP#aRò S1ÎU‚bƒ‹ÖÕˆ<#fÖ§>ø˜¬ F¿–¸Ñz´®Fì`Iå† 4¿i œI@*7$&Ÿ¸i4ÓÈÌ1L¨ò'Rc"’+m} ¾æ¬‰¬«Pyó;±C ±< ÖÕÈ*aj¥›F[„KÒ”Ÿ¡R§ö›ž|â´œF³ýxA6¯F4ŠIëðú¢hD•šAÍ«ÑB‘&÷OÞÄĪ‘Á¦1”|B;<ó2Š9w‡'¬Æ@ÞjZòI¡Ž¶Œ–ÕDRòI¯4Vô7Ú:®›{Ò©wÇDãÞ¾ìÓû½ûãCýjš˜bjô?tœ4òy·hÞîIPR1÷,=3*{x®DcEc0ߢ4šÑ›¿14}Ô‚µ7ïwT¿ÕÄQdØœþÔx—P#ºi›«Ã¥oPe2¬òØ%7®¢Fë6hf]9»îлõ¸q5®dÕÂŽ ðXÕ_Ó}j’Ξ—Ƙéå]#Ù¶« 71#Y>1Ãd*µ“6hFó±ɶߎ{$Ä,ÌjØBcú]¿e8\%‘£FÜyh$} /Pú®ß‡!Ë6šóµˆà´äÓˆ—ר‰‘«ÆU*"v£¡M /+¨1¹‰9~5†bTº±Fo¸o†mâN#Éña¶1ñ®ß‡Á«ÆÈUšNšVU.R=<›hŒlÅIb1ÛæR†‡[‹À“Kùç/<=-ÉÇU¼ß¦U$´&û2j$)¿f1]ÚGBsa¨'lp5 w½±hçŽ/õĈíäeÔ¸~ðÒȆS¸ž›1qhøÔxPça¢b1hq Ô#Ff|j uÈCº¬` ð…GÉQ±ÇQ8hdžñ¨ýj g ]c'-ЈGšŽ–Z¤ù ì›UiøÕO#95jb|ýFî#¡MŒ¦ÑÕÄ$«I˜°xgA{#p7ÁüH,¾Æ@,Æì7Ñës^€Ž™{b@î𤪑ÒÖ#1µÛ÷gÎ _pq“y4Æ>­lȶ?g”ݬ·7x#’9ª1äÞ‰ÆdÛÈb1ú¸ˆïÕ”±º ju Ç¢¸Í²;ÊQ#ŘCc²ú`z#àZÝvÐÅ,ÛˆÎ]l©]ï ^k¶ãÕ«FÖÐ~£Ôv8š^|ksüj ?TÕ49<³ÍdìÏü»Šux‚W‡3J§¶Æbngl‹Åœ´ –GoþƃЛ÷û Üj,‚[Ep«±n5Á­Æ"¸ÕX·‹àVcÜj,§soç~’™®…áTc&/×T²G9ºJz EGð¨ñ¦1·‹àZjxÚ‰»¤#Ék©1i.|*Rc[ \O:¾¥Àœí(‰Þƒ5&\™™Æ@Î Ïåã'ŠþÛ¹SÛ`hŒ¼¥Ân„Õ˜ý[hôgpåÑX$ŸBq(dºáí£"$ÛÆ*jŒ¢Ñ}¢¶ Û‘F“ gŽ!|?£Û˜E£™“#\kPçÀrmõ)™ó]³W†ekãæ"¹hD™pæ˜ÃÔR#š“ã¡QÈ“â4’$©  ‚F³œ˜Çª©ÑáT#;hDeÂ6*€U\BºG1?÷Þã¿]ªñ8ûR£jsõÓBÑý”Ôr„9Ó} IK:UãˆïÖ½äጃ›¡r4v¦F•N±4Ú¸ÕÈhÔ"ñ=Ót =˜lÔu!Û¸nWcB—ë4r#¦Ñ,ÀO÷۪ƌz+!Ç,Jš'EÞ#Š‚@#¦r]Ž^ßMA¾ÿFD55âòúsr,$’Fä½™PœF5ßnÏM£2yy4Ž0ªF+`ä )¹½Š÷.D „ ™4šBœFüÕOcÅ™4]”Ð1O ïÝÂ;“i¥(‹FÔ|ùÖ£›˜Š37/ !Õs°i”œÕ8Î2$ÓÈû6d¡^¹îå Û¨N FüKD#Ð †häpó°UÕˆf"X4B£W™ÛZVe4Ö‰©4âåA£R.†¸° ª«Ñš¥·9O ïÝâ4ö“ߨlãˆ'X4FÌ“Z~1ÿíâÚ6¶Aã.3${£¡üF(O¨«FŽÒ4:ÂÊÁÄ<ÄnÔS£}½KK´M`ç7šÿeÐkdP×^GbžZ xP‰š.k̉ ¹€>#ƒšFÔB4ê - *a°Gƒj(èÌLé[¸6c‘RÿÖ{E}Ž®Õhþ[4*%N°i”›^—€žÕh™¨”ø ‰©‘/ö¶IýeÛi©A¢Q«4…F³X@Ù¶ ÒHýÄ»énKؘ3¦‰é/¿‘X8B£é²îø€5æŒìðô—m+ÀÛãÞÒïXêÓØY¶­TûƒÑzj9RããÛ·™Æ¯¶Ñ*eÙ&Äã ~DåNC#L<~ ä7–¤ÑÁEcƹeϧ.¡Æ²-5¶N&ÔÁi\ (ÒÍíæ©õ€sBÄp]Ãù94zf"°•¦0n, j}D»Úp~cê(Fè^æÿ¬ïÓ§qä›s^Ô†Õ˜´Íˆ™ P>h¬‘më‰0@ú ±†­óµhDÖÏ6¹ÓXKÎ&fþ 41œF­XÓÄ(lbjÎD;<@ ¨¡bP‡Ç,i­ÃsÖ™Ñx™-Vê3ÎDpõb;Rã‘hO'ͶÝ{fÛî½Çþò!ÿêoAoÙ¶ÐÞÓ‹NŠÖž^tR¡ÆGƒÐ›‚¨Æ·£ê„°Õx³˜K¿Ž>¢s‚©ñõèã9-ˆÿúº_¹/£F'>_}k¯‚ J¾ xY¾ü,(5~>9_ð:åI]ýbaRã«÷B¼‚ý5`áAãø?’K¾å endstream endobj 277 0 obj << /Length 2224 /Filter /FlateDecode >> stream xÚY[Û¶~ϯXô¥2óˆ"uë[O)Šâ 0Pœö‘i›,’¼›mÑÿ~æBêbk»E`E‡Ã™á7:ò!†ò¡Œr¥D©‹‡êü&&jw|àÁOÞHÏ·ÆíŒóß»7ÿú.Md,ʸ”»Ã\Ônÿð¿èÝÉ\Ûm¶J©H}³ÙjF›MRD@6ÕàÚf³MŠp †t%x äê4©Ìø$%2HK™Â€Ò¹0å©/Z0øySªÈlT‚‰ »0õ<þ´•öóšqX0Î|óÁÂ-á}8û»t]{2Cì™pr€š®B®þyæUŠX6.ëÖtˆãž©ˆFäªZF`×Ö~L€•'¤t8`\ûhþŒƒàÛf µ*/xv¼ó Ç…×dõjÖy„QXæŠì…Oï¥Tá\îãp…L†¯kp/PIgkÜ×ç'î)¼ÈölÉ„Äü!…צ¶}ž/–¥€3'~ïX¿ƒ0¤¥6^RËßPpàÛ[ªAXJ­—íè{ßXa ‰Ëèhé}„Rür¹È}¹@ʉ2 LÛÌjœ{ž¾÷/S eÏD~“áV‡¯¾,+±¡è¬§ñ5n]´å¦)X2Cä­‹t|¶Ò2¼aù¥¾CK‘Aµ~­ñ{ÛŸCmW¯¾¬¼ò/…•B뱿 @<ê^ .äpT¼·Ýãˆ1˜›~2ƒ‹P„.×pf)«Ù»G·¿B"eW©(³t‰yÔ‚“Oq‹>Áá;ü‘ 1u=E™Zø¸ð(ç$WDǺýÄ'Þ9ï²Èÿ¾»?™~õÞ’XdYþЧã"}¡wð&Ì>3ƒ „…“cþ1¿!y@G ÝßÁ&¥(üæÔ ÇÙš¦òÛ\'¹a$»n­,¼–'þ¦rºô$ÜS¾VÓ´Û»$èÁ»©ãöÐmؼ„·á× Ö˜}Ví½,~8çËzt®÷+–Œ?…y}¡öÜé{‡É„÷~¤f Ÿ!ÔüâDú"iš£åEßY'&×:1¹h,½ñ¸Ñ7a2òi1)tx¿¼—›2ìv0çÅk܃إüu\Áèè":¦äšHYOùg/Ðæiç÷¶•\Èðë›…ü¡o'aËæš‰Óù“£aBïÎ’;NØ/—ÚUn¨½°Þ/ç“›·\;snB:ëAq1­ýªó|K5wzR ©g.³{n¸î\?{+C:¦—YÐP'B%j| üÝ^;¼&,xâ¥*9KHðôý>‰Qá—ž¾¹ÈÂä»±â7?”SÁÇWKŠ™2Åž”þ6SÖJS1ßKž½¦à©žG“«`2œŸ[üñDü4=£žß'z`_iÖ 1¸F¥¨¿sãÀtGË“m!EySäC U¢bààYü’¼r- endstream endobj 281 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/mnt/storage/users/claus/projects/geomview/sourceforge/geomview/build-opt/doc/figs/color.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 282 0 R /BBox [0 0 106 104] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 283 0 R >>/XObject << /R8 284 0 R >>>> /Length 53 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`h`j4406R0R0ÈZ(¸äs!‹ • endstream endobj 284 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 220 /Height 215 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 220 /Colors 3 >> /Length 2968 >> stream xœí=’Ô:…ïÛ èBV@$L2UÄ,ƒd’Þ9 ªf“±žg0ãÑèÏWÖ•tu}¾ªqu«Õú±NI¶¥ùPÆËßïß¿[$ýððpww×"q0„Ömº¤ÿñãÇ'Q.ï_¿~-x\J¿$»U@<}û[·é’þׯ_ÿ‰r •þö«OŒ¢]›.)¿yóÆwJÙ<è±P¤%š¶iÜ)WµâˆcÏ£«½¸Sj(%Žç9ºãÆûŒS.jmaÎxDµwÊE­®°q¹\¢ÚK:¥Ôu¢5³á×2p”:.­¹6k}j«(Ëœ²~†uÙ·îå®ãHµ©Û!;e}êÓ5Ü?^ñi…°Mù3/_¾¸élÞ×Ï)‹h ÝÊ€H¹C´M—&ã4mMg§\E  ÒÁ)™¢$§eçsJˆR%NI-;“Sfévën©pÃÀ)Ÿ•ž ÏEJ”nx‹×æ1蔥7xÜ_çŒ&ÖÍSÕn8Lˆ»îPÔ{hqJf®^äR§döÝ´§°¼²·OO%ͼ;lM¶û£Õå”E¢tóæ;eQß͉| /“pœ’ß“(rÊÝ,=–¼Eœ²´fŠõT¢$†SºoçpÊhÑó”:%¦8íà¸X©Å)Q䔜¥g„¸ÄÇà컦¸÷=\§|Vz’; 8å³:À)‡§|Vz‚Sê µSòS€S‚?´vʦ4á”àMòp:GœrÊY%™9Þýeø:Γ7%‰¤&Õ¦9§\ï¾,ï]µn·d*ÙN ‹`CH%å:¥«Ô?¢¼½½õ²ÄºoЇÕ)]‰?uß[ÐãÇý‹NÅÍÍM¸½Àåry&J×EQ¾|ù²w1Áiøõë×*ÊgòDé΀è¯SB” ×ëõÝ»w›S²fß®S.ŠXz`?~,ÇM”Üë”ä8%D dñDI‡r–®?!…­¶4˜S*¬^È:R] Ehkµµ„R³mU]E¨jµ­„RIõ¢@”!ªZ-%J‚Sž U­§PÕjpJzÎXU­§ ›(Û]4PÕjpJúT¹é¨CU«õvÊ%õõÅ·oßWí)G//ˆ2$U…­½Vú´Z?§\«·ÕÊ{Ûˆ’C¦ÕܳקÕú9e(Ž0¤%U­ÖÉ)wkâv®›.¯£=~*~*‘h³g¦¯ÊÑÊF-'_N/\‰(½@‘†óèä”yQºÂá×™ªD™ÆÌ(J‘† £Å)Suö~d)E.ÊT‡˜ï+uŠ’sÎwÃ=T8%%fy¥¢ôBfe'bC”^Rz2ìÑê2>|L™ê¹ò(lˆ’Óaª˜}‹ôªDV?˜šú(e¦„­EI=¯S2ç(ùñõ,0œb½Dø ¢ä7"¿áÂÂh¹£ã†§&¤aè%• Ô,Êð£”ñë¼£Ã9ç» ç{ßH;ݷJD9<%$€ÈuÊhä¦ÅvQÕjpJDîèd"¯@”pÊ ßûœRˆR8¥¥,pJ JYà”@”²´rÊëõ:¨F\ÄEÙ§ÊME©ªÕ„RUÝRÈŠ²[•Û‰R[«I:%R`J 8¥YÞ¿?ºGøþý;œÒ,‹(?þ<ºżxñb¼S®%‚¬³"3¢à”¥,Ÿ>}Z[ÄŒ(©Ò)Kt¥GQ¾zõ*üèíÛ·•5LñóçÏF)e=cÆDY딣Dy½^‡àGŽfg“¢$…NÉ,‰lÝÖnÌTv0)JN Qò1)J‚SNIQ 8e4'ˆ²&EIpÊ©1)JŒ)çÆ¤( N95&E §œ“¢$8åÔ˜å°{ߥ&EI£ž‚(E0)JNÉ\D²ˆ’¿Ü¢TËNÙhYD©ENÉÆìbL”4Ä)¡HYŒ‰ktì`F”„ÕŒf0#J8¥̈’à”f0#J¬f´€±%¶„uß³co‰­ŒSæ·›÷P~ßo®e¾&/žSýSB´÷9<̈RÃ2_“¢”žr÷ÿòM!ÊY 1)JjñegpGgˆ²3Šî}C”"˜¥®ÕŒ€(;§Üg®e¾&E §ô™k™¯IQÒ(§Ä‚FAŒ‰rŒSB‘²%aŽ̈«í`F”„5:0¶p «§ÇÞÂ1ªqÊÔ³‡wòUŽÂ5e&/ U9%D™¢Ûš2“¢$ñ5:³?º–AáH“¢Äó”@”-Àó”U@”-hµšÑåî#•¥“ Jñë”eDɧá“ç‹™@”^L‚([ÜÑ(= J> ïèð÷o(½˜Q¶Û!¢Ü€(ù(º÷ Qn1 ¢Tò”D¹Å$ˆNy…kÊLŠ’à”|®)3)ÊaN‰e:‚%á3À˜(±FÇfDIX͆§ê0è”X‰65‹ :%D9/ë-³N¹®}±ÉɬSB”Ó‘%Á)Á(à”@pJ 8%Pœ¨ã¤N¹ýƒŠm‘à~êÅÙýbfí‡l¦™øüL3JÃ9£SzÒÙ]E´EÈ|q÷ßXífÊÜ,U‘LwkZzêŽqF§,:³E[*d"L-J~‚"trʰ¯¡½.,Õe¤¾bC”©tDDYš¸)§Œ¶ewÀrCÂsA ]Ö‹23ÓSWŠÒ}»›'~åÏ/¬©5§Ì7a>Â1_i!JJ·PiRE¦[:f-Í”_S槆aNIYÍí~½ƒ(ù#0N©*Ey,¼]M™µ8Æ0§¬«1ÏDÉÉTVÍ"ôsJ/$Sçpºs¬Ë¨屦œè¤º‘Ýp‘×dZj§¬<¥¢äq9•*Í´§(wN:E©bLÙh¢C13&†(S_d–Š“i4ñÒp~¦™¬&ÓJÎ8ûÊQá”ôøû ¦©^ƒ*®SåhqÊ-d}}¼ïÖŒ)rÎxï(çŒO åÀ):à”@pJ 8%Pœ¨N Ôaß)±eõ¤˜uJ(r^l:%˜ƒN fÇ Sb'ß© ·—&N QÎKt{i;N‰KBÓë”@ö¯SB”Ó§ê€SuÀ):ú9%sµüú‚¿OAˆrRÊœòöövuG÷("ÊèÛow£k!ÊÝõÝö(Š@å+°Ëq§„"A#:åÀƒ3Pì”Ëg#Ë ÎASº;ЖS®¯qıç1甂¬¦Û"e0ЦmwJñ<Ö‘ti†vmwJo7Àú#=n¨µí›…ãìÇÖmúä”íf6[¥úÓ´Mÿ‰Uü3èÆ endstream endobj 287 0 obj << /Length 1372 /Filter /FlateDecode >> stream xÚµWK“Û6 ¾ï¯ð­òÌJEÒ”ÛSw»É¤ÓIúpÓCÛƒV¦m5²èJònöß @Yö*C3>˜Að¤Ä,…Ÿ˜-Ó™‘2Yª|Vî¯R/m·3üúêJ°^ ŠñHófuõâ¥Ö3‘&Ët)f«ÍØÔj=û3ºÝ‡Þ¶óXJÉoç±R:zÝ̳<qQö•kæq–›TGRÏÿ^ýxu·ê,ûtdÿžbS2›Å™Ê£ *¿x½böƒ»ú夃ö>@¤ VÕL-D¢Í’P¼¬¶ÇÖ2ˆD3ŒÕŽE߈!²E[4% FŒEcëQÿ8[$Æh²øz;4$mdÚD}ÑnmOª£ÿ¢¡µªYWÕúXÔ$ßZ·¿†¡ÉpCÂýíŠfky÷ Ü‘&ûâ=N-;`Ãì<]"ÀÕF?¬×OG,(?±‰`0½Èƒ)zI¡íÛ§o:Z¹°ŸÌcf> ´ÏÒ¶VËh1‹þ˜ç2rm½¾Æ¹aèÖiD?XD5©3Ä%ñ ¡ Œ±† Îß4½tÖ€Gù´Hdš2Þ¬YëŒm™Hr#ƒRp[Ô5 Æ…Ç9¦GXwDIUrý•êô÷ζ)î DýÀÅG#w¤`¾ü@ɳ<„*"9©yþ÷έmWµÅ}mƒjÑPYС‰ªf;”‰TJ”‚¢À5>ßÚ ©GC.ämãÔL5“®8«æé|I)ØŒLOÔ¡Gÿ-•ÅYíèzØÔÐÒsfÁ2Ÿ ¿õ mðHЊ»«çE‡òè»dzw]?ÅÌÖ––Z&ÙVÁf81ÔbÂÉ„>#àßoå…´ê£åùý±ï]ÓѤ|4"Ã*Ž!Ϙ^¬í¦§QéÚÆ²Øä‡°©Þ<,×®§NF–C̆“ñÛÎ=Ne¢DP*áo]@X;8>‘àúP´=£qb7¤4IÍâ’Ýg™£t†ÊȨm~Ýz?6É(T‰œå—s$.çXÔMÑ&Y,+:Uàƒj@!tœî²ÂJTô¸³0_Ÿ›¢ r(— J*Š4ÿX¤±wC6…”ÀÝzû£´ëíÿåÍûðÕ‚Xpï7vDjX'Fû¶'_Ž!£øÞ!/,Ò¢ì¿0ã ü0*€ÉÇ`Ô NÞÝÝ®hä v­£,ºóÏgòO|ŽZøM—:ýõò‰ýNõ#‡Íu™Eoß¾ú‰FÞñÂ;&w8µöÐÚŽû‰È´«HÖ‘oHȨ®øâÆIg·{{¦‡oü—qw€ñÄœù'ÄÛi'c^W]_5><¨É<´þÌc˜±0ôÈÌ"rL½‡K¸c醵FiÆ+#Ï9zЩØCÅ{:|Uûà`|mÿÐx~w]\ÙH í­è™³ÍPWIŸù="» ¹ùòî6q߸v_Ô_¯ktÇÛMVÙ»¶;ÃpÙQà KzÁY¯¿,ÅGzã‹ÄG࿾¦^pB':® [W»v ?Þ2麠þak;yûI“ˆlxñ}öâÈt’åë){‹D«ÁùG;{fuzg~ÞÐ'Ê­Ò$Y‚4f£×m~áu‘.ƒîǺL³TCþü ¥>_°h§.¸áϹ‰ÒÙùwˆ¯¶§¦¯ —|fóñZ ýˆ[PhûaÁGO‚‹K|1]¶þEÄ:øpÀX½­+ÿñž-‚ë† 5ö™Å=©Üc‚ “$Ç3žø@að_2Ž0tá †¯Mü†þDDƒ endstream endobj 292 0 obj << /Length 2152 /Filter /FlateDecode >> stream xÚ•X[oä¶~ß_1o•E$umŸºNÖ»-Ð&k#@ÐôÖÐ3Jf¤‰¨Y¯ÿ}ϺLäfyxHžëwGmøS›*ÙÆÄUZnêÓ›„¨ý~ÃOwo”ðmq;ã|÷ðæ›÷Y¶QI\%•Ú<<ÍzØmþÝìypýÍÖ™¿ÞlÓ4‹>¶7ºŒ€lë¡éÚ›­.‹$‹L~ó߇¼ùîa¼0ÓúÿKöÛ$[jôf«ò2.²™¿ùxRzóm÷應ÏûT’ÂjºÉRgEÅZ¼oö—Þ‰q.jÜvÇN4»=t¨EÔù ë÷¨¢mÝ1F¥àú­Nb]ɇÆÃSEgäáa÷s¢Œëq!M¢xÆ/{@YEÂÑ=ɱÙÁ6ÊTEôáç$K.þ+f»G‚.°±·hïiéGZ:2÷[ ep[ϧ~Â5·f Ü!¡w®Hï4nG=·ŠÍ·U&V™bm­QlÒYÔ Ãu DŽ޶{&ü}wÙ ¿ŠÁÜI6&ÿÛÅöa †G;ù«3ëKß;3! ³PÅ´ˆžÍB Ù¼o>#ÕµL¦Ý—“ë›Ú/Á¤ë…š ¯Ù÷çîÄA îß1åu÷Ž'þÅG’GOžéá4Ò·×èàÏpxuí®i÷LÜ—aq1žþÅyŽ´ÑUœäšýˆ*UJÌ5ǰ®”kp'”ÍTU`4@ØÁŸþÒz=õ݉7önÇ$;ð7L’Dû>èH6ÖÀƒôÂôxä+f‹y^È"Y×1„Šè×׃l€41yÎÒà ,5Ñ=d§¯‡{ž²áað4Î0Íð Q3éùn¯\áòñˆn¦HÅRHMä|‚ œUæq%ºì{‹‚½ îšו‰OŸØašwÓ Ý†ib §oJY1ªžëˆœ:zì›=9xh÷dîɧšqº "íÈ9üë\$Í"™I¤§Ëñ¸vþë¡ù=„¸çÐ&ûQÄ3àr9Çå\Ç¥NÁP´ *Ç„bÆ€ë†&0‚`+‡­ HbáÁdX?Ȥ:0=^†#"#kèÎL¨)ÈCUcšnŠÙÇW6‡¶P—¡“!ޏ~E!䡲ér?œ±äwýtS¦Qw‘´¶-»Áî~¹pÅPÑ0KyIb×ðe8þÜØJè §ÀAðñ㚊‹ÔË™ü‡ó¦½>WO 3¢ NÂibüë øów{l$BW¾,ÊàÊÿsÕÝ`Å`è•TˆÔµ;<&Ep  É4+«/Tª/<9PþræÉ èÚ·è¯ü•ÈÔZÅE5†æ­më› ìy\Ùqš×"÷n°è‡…ÈçÞ}nº‹ç`2:‹Ë+ü¬§nÆ»a—¾nk,Åk«¸Ìó Ïý‡¿ûñ_wk‚gYlŠ)µz©á1¥ŽŽnÀøŠd*…`кyza ‡.,×Gœœ¸ÛQ_E\TY`tçßÀŸ÷Ì”‹'d,Òà{FãQß@¦ªt¬J}œéÛïÝÀUygÇ¢l>W[?g*Äi×úÁ¶Ãª]Šx4ßw==¨j4‹ ƒ#ªG:ô H€ɲèWLÀ†¿;.#Ï-o@:ð‚åOÍ¢H—„,5â„î˜%: Kx«m'÷íœxªõï»$DÍ´XÁÁ‘©¥# uZð º(Y2Ö kØý˜¥…Œ dyp(9Ìì» 6 ¤"Ƕ̊èãõMd½œ­·Ds¡;f³ mGWQª!û4×oÅS#&nëô[q)€[8¡øí¼<û®Á‡ÀÅ»¯ë$¬ÕÜõñkâÛ³\n¡Ë&¹TÅñ_¸b‡Õ^h$ñɪº *% ¤°l¿ÖX'3…´§°ZàêÚçÃb~ñJìˆsÂA5Õ°rn}Ï”U3k biö%–Gô¨ª)ù¹¥…ö×Km+C+§ž¹â'îD ð\ÚûÕHš[…‰-%?¼<â$ìx´ £FiaD#qF™çféP$ Îø¡N%pdùª]”6M)/ÇtíâB uÄÇV›Ü+0%›Ó@·ÏQ41mÄ€4 O¬²š–g €Sš²?W†ßtˆ$U)Ù@¤þ>mÝwÞ_=Ñ$ò±M¹H¿r²¨ñ OØ7ü¾¥áò¤ç^Ð é¡Úxf:uScñµatêðmúõ¤‚b©Ê8€"­ÄU¹A $µ(78•@‚‘—Š RÀ;šH!Íz£BS—BŠãGëbd­O NÛõ'{ä1›§ä~ â×ÍtÌ ¹Í¡¥Ú0ïšæµT ª|é:ÂY5 ~kŽVÄg©½<úUkÁÁú«W·ô4—™£ŸŠjy‡f fü6ÉBGD/_Å(»xdÌ5ù1ƒ´µ¾kíãq ×+™1sEL:…÷LNÈCËô™S\HÔSsÆG_%ŠÛílç›~ s®]ÉKÿµùqûgDçiuÎýR¸>äfi[$PuÉH‹SN<Â}±õ€©±8gêw±ªPEÊŽñw7~´+ H§ » UÀް!BHŠÝT# …Êø ;N }ƒ†³sß…PAל£lßË(c­‚ò*µ¡¬Ëd¯ :ª©´ëÐMTóï„©ñoæp ;ÈqR´[ Çãñèø¿¡Õ5¿ÔŸï^E¦YÈ |ʃY¸Br ³]ü˜†×B(h˜4á©C“ŠÍ‘kþtþ?÷Ã#© endstream endobj 298 0 obj << /Length 2969 /Filter /FlateDecode >> stream xÚZÝoÛ8ï_ÜËÊ@¬õEi÷©ív=tÛE›»Å}=(2mó*K>In’Þ?óEYRä&( ÄäpHg†¿™¡ª®ø§®òàJG‘ŸÇÙUyxµÝ]qãã¯/”ð­q=â|uóâÏ¿$É• ü<ÈÕÕÍv¼ÔÍæêŸÞë}qìM»ZGQäE?®ÖqœxoëU˜y@.ÊÞ6õjf:H¼H¯þ}ó—on† “0|¦dÈùX´t&ZšÅ¾Šbío¯·UÑã–óC$ÚOaYâz "«À+›Ã*ÔÞ­­WÊ+XêX)¯ÙÊ“­²ÌϲØ-ñúÓ¡iúýÒNqì'©vŒE½YZ- ý ‰Ó/„µe‰ãêöÅÆÖ;µNuâ}jXÚ~oø82ÌÛñhÙÔ]_°mxN ;]­UÂrhD¾JxS”ȹ'ëyÛ¢4×Ð̵·1G¤y¦Þ¶vØË<±3Ë€ÖÀIì\D(Mk o_8¿ÈPÃÓy•ÝíEFìvÍ©-M'›\eqÿ"ñ‘[µLîH¼Q{Ý©Eù™Z7í¡¨¸{O8‘ÍgÄ¡Ÿ‚Ö*÷ušóÒ7ÀǦÉ&¦Q~‡ƒWZ{EIêÁ8ïiÃnɦZûy2øÑí©ïI+qä¹ß~yÇ4õõà /ÇU¢@Éð§héo]2eÙùãxð¶cQ›Š·²`ϲèMÇÝ»ÕZõqhôÐØã=ãìÈ,uÓsãWÃ×ç‹5w¬½0Êü$Š&Õí›S%¶)Ú¶¨w¢õ~.?3Nì±ç”}ÓvL(ª;$øç¡ã ήñÙ†$Nm}#±rÁãc8ïÁcìÙe/íÜ<8Úhë%§Û¶ u¬Elœå˜ ”MÕ 0ÖÑx¬mM'bÔr‡u,ç¤)2•Eo{sÏýSw*ªê;tåaÝMÑ~FéÐŒE=0-œdc:Ûš èN©X6ãÃÀ¡éaÀj!)»aR¿§ë–5EílÚ¡YhÐBUÐhŽ@•w¶ª3®jk¦A ˆeQ•§Šp¤ó'çpWE‰BÖE&â @ؘmqªzòåýu,ÚÂUSaâg*_ºÝQ|óvç€ ÃM#½áö;ÄDí‰0]ï.tþ¨Ä–8ú™­ËÛ ÌhHj‘«ÂqF0Iëˆrøö‰ëpjX«Gàë¥,šÓnÍ‘ 6®›;5Acpýq;„”ð‹w(O½-FIÛ¢»a·;4ˆuFAbCwí{BŽ,p»Z'‰÷ƒVx¿ƒ£wnO+-‡Dm–üóÔ™h×b¢î$âÔ¬ì0À©‚ÞeCf«ÌM±.°å“øZËÖ‹ËøAªÞu•£àr”¢^Z6N}¥ô7—‡ †eo‡ll¾˜ šdªü +fzî¨QëdGø…h³á~qª$í‘Zsp6Œxâp0 ’90ÝÈãK– 2¼Æ3CA÷ Ci_ÅñÈP´£B]'.aäEœd‰¯ô41ostw£›ZŸlÕ¯~Kúä’t¥Euú¾ª)†ªé#!óaé°ÔÑIö¨PJJip±P‚ª9Tß])¥Q<¯”`ÏS½á|‡j% @@àFYØKÈv$ú¢Ý™^æ¼F àPuªnÎP‰O¢%8d7K7ܪ”þ Nlhk¨Û¬ “ Œ‡âæ((ÄbHˆn¡öWjµ„ëüä‘‹K¥ogRjæ<ûþ6Ï'†ù¡[Ú$JÆŒÀ»Z»Y\2N°òÇ•xî€}àì$„;1½—J8{¬=$RðÐ^ß6UÇ©|ÙÂ|9˜Y¸E,yS”fœ?¥¹Ø.‘u5zÙ 'F©ÎT¼^dzþÇCœoAß܇c…o:4²Ó0y¤¸N3W²"ñÎ’±‚b!a?øÁ%šÇ/ *‘$Æ(–¸Ø5íÈØ«¸œèAïªÿÎv$;fOÓ‹Ä3$€‹ hÛšªDå¶á¤j³›‡é‘⡾Û[÷†]V4F…D7 M4„ ü¥ÇlœÃþöa•EžÏ!üÕƒð3¼^/ú3´C•>Ó¡Ó\OÂ,nêâ¶¢â·$\!§=ú¹Š¦Zj1†‰j@—^ šLJ*—ØŸ_áæÌ³;³¦wB#Üt™»ËhÂɼý*ˆ‘V|6øÅ`9ógK;kq8øÅì¬ùV•ÁnðM·\~ÉÕC¶eS-V¡µ2=Ç¥XÅ kTõwÄ\Ü) ½½©dý!YÏÓäAZ„§Øh8ûÀ¦óì%üLŠœ2x"}ìÍ’ftìËQ<|yô¸2E`½ˆÀqÀŒ¿ÿŒ³G÷ 8Ä$>LˆÜðïù{ö8ÅVg Ë,HY,ÓX_J*¡ó“|ˆï?|üíå»·ÿx#A.…Ìk†Â¿¾ùðÛ››è_¬²r?ÊÏ_hZ¡Žò¿4R JøÑÛù°= äÅhV Éô ~ÏÕAHç÷ù¥ûíöñâsV> ;6öPÀ§³þœüi1Å?<¦6mµüõ2÷Õ¹Âzz±kWCHZpÖà¨@q… ˜ÿÂ’S&Ó:ó}S›§>÷þܸMã·c±ÒsߪÞÖ Ù#D”§¶s—e@@÷Äæê´h¨Ó(w8?Z»j[JðSíJ8ú\qäÏqæ¹¢Êê¿'óD¹; " åÀ‹!T€¼qÑ— œQçoáOÛÿ‘ò&«Å™Ÿ¿r?Ï›ø÷¥9¢‚ ØâGW”½ßQÅÁw8Fœ¢Þñ§ôâ* K}½èçJùY>)Z6>èÚ¥×ÊOõ,½¾¬„p:‹;š†ˆÙ»/A”߀\Ší5 í2*ù®èHšËÏ{)i[dp“i¦žùP”ì^˜B™°òk~Óê˜ ÿëÿßÇÿ"ñê endstream endobj 160 0 obj << /Type /ObjStm /N 100 /First 886 /Length 2089 /Filter /FlateDecode >> stream xÚÍZ[oÛÆ~ׯط&8ðjgö^’¸1 đ䡧©‰ŽuŽ$…¦ÿ¾ßPrŽ-J–DÚéy°¸$‡;;;ß\×äƒ2ŠþØ*òF1þÈ'ecÀ5+GŒ«WΓ¢`•÷W¯‚Çó@*¤„+«È©G!«d2îƒÊVÞƒÖD ">&¡”f‡Øq¯ˆÎò^[‹AqÍ.FY ÷(Ê—_DyÍ?¸É? Sä$“b#„¸aö˜5[ ’ H±ÙC>’'oz”# ¢fVÁ†#&|À)É£¬!ÌaHY²2ðÊ2„eÃÊZÜ1ÆL:ëõ˜@ä+²ØL™™¢²ÉazÂö&ˆÂ”•Í$Ÿ; À”™•“c¨Ã±ƒLàç8ʯ\à[hÃÉzÙ( ¶I¹(KÅÖ¸l@ ~Þ°L$&Ù å9MVëP ­cdo@(`f¼ŲÁçAXX§|gYŠOkvx•e…  $²1AæÀÖbŲ‹*`§ð$¨àØô°Ç@ŒHê: dÁNÀZ Q˜4E@"…,ú>¢Z؈d„&iØH]Zz¢éh#fØ¢XæÃçXJŒò°k)°1±|ž1­~b^éšÄ±÷=Æ’l?cg“¬pPÉB&Æ’•ýI^A¥cÉËÌ@] ,O›³Á Ë ª„©{/^ôúÿº)Tÿbð¥èõ_—³ª˜U  =Âß÷úï‹E¹œ‹Em{õ£ób4¼*¿ªOÌ2f¾ìaŠ9¾…y­é^Îf%¦úT[5žÔV-×ËÞO?Ýa]Óõú–Ÿ«úþíxöß^ÿU9ós) Vê'Ò.׺Ô@ ÀŸu„€ Õ‚î¥zñBõ?¨þYù±TýSõìjüåj<)7ƒY1y®À»5{¶.‰™`ô€¸®±ÈËá]ì«yq5*GÅð.÷Sõ‰j§÷^õû÷ï ʉ°£Ùr2¹|€ÆgÖ°«{do ¶šïè(­Èß@á8­o•ÕŸô{÷ù?"|òËÆ…oï.æåðCY‰Ó7ªÿ±øZmjl,°—M°À–;ò»O6h€Mpû6¥)»„ê${4MÙÓa²Ç†¡„•$\u5”lk¤zïµõâz­6p > ßµ©¯Ëét0ýaœÁÔ…\ßÝTãr¶èf5:ž!ÂhÇ$ñF€ˆ¤­Ýº”³×o7mQn?.ާ .hãö’yç`áñ»÷};ÄRÃ1F´åÛ1"Tê„ÀÄ &ÓqµvZ¯[òœ®H„o4±õÐ6Iz¡Ë»¬ÙmÕþ—¢œÕü¯n°ƒ5éŒØ‡Ð'9$)ÈA#¯ÚÊy9>y„0H¤³­C ð#euÚÖi!Œ/ÑVÎÅ´-'Åɨ¸‚ím‚?ÑÃÀÞî@î¿Áo?äðv´BÄggoÕÙu¹¨Ãùø¦RY“y΋øˆÓAU¨g§?"7uÆ"µ¶Þ8û/C?óèÎËÑ>’ãj‚Ï“Áõ‰1Fß,nç/Áÿf6­ÊúÑËeu-O†“Ár¡êßç÷•õó×êìCv½þ»‹sEPn†¯Ìm (SWƒÉ¦ŽàÅM«,XÇ”·;íÁ´˜›€ÉDÑ4>Ãh‘øåwd"›@¼™Qq¥ØÅ/²i¨Uª¤¶j]ùA)ÁV×ÇP³ NgIÕCÔ9¹‹P»ÝœÏËå¢Éçå#„d”›Ú"msŒ„%|³A:í¬ÕÖå ÿÔ‘/êËZb+)€0t £v%Ö9nåûk9;ùy9œŒGÅ`&p¶%:ªlly7ïÂéÿœçS;LÚï0©á0gå Nà{¹KÔ> »"×Ò®¤'Ñ5¿@M&m1ÚEé‘öÒ6ñ€xЦ—¼*Dt†mh€œ‡Ùt’’Räÿ_`>a$ï& ï—†Ò¼OF‹áõx>½¹.«Ò7ƒ³Mƒ³­ Ž×Ì®p'ºÕ5¬¯q}½}¿|®sïÆÖåJRöZÚQžQ ÃAYµÕHEu2)#däÕu·°#™ `"éÓfí¨æŽBØ?5g@I˲…ð¸JÇSµ×²éïÔ"º;äÒÝÕRÇqFÌE]‡e ìÞ¾×"mGA¡ÕºS½æêqÍ3žÏÁU¨«b)7w(¶éäBk'·>”¸ìžYË131IÎ¥,’!9Œ ËÈï×Û{€7Ù qÙJPno_»›úß«“jÓÞŠå.É?ÓˆMÿ[ûǸÿht“¹˜vœöÒa¿t¢Gi ï*ÛŸºoUÀ~ïÆ:§& Rk@¤±AÓ*Ø’:€Ü-ëÌÍH›Œ´yó„œ3í߉ š§H¨äŸN:îJjîJ8vWþAio• endstream endobj 301 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/mnt/storage/users/claus/projects/geomview/sourceforge/geomview/build-opt/doc/figs/mat.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 302 0 R /BBox [0 0 129 172] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 303 0 R >>/XObject << /R8 304 0 R >>>> /Length 66 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hda¨gj7474Ö35R0Ô3762²€ÐÆå .ù\@|`ô endstream endobj 304 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 178 /Height 238 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 178 /Colors 3 >> /Length 5538 >> stream xœíyœÅÙÇ{î]vÙƒ½¸åFŽ}W ‚¨ \áˆy#D‚(ÄQ!|"‰/#¯Â‹hIÔD5%‚!‹r/rã"r/°\»°ËžsäÙíµ··»º¦º§gº{æùþ1Ÿêkª~ýTu3¶qÿ‹Óß®cjQÉÝüÛè,Ǧ—,@~`óS%e•—¯•é’f”‘çîØ"­]óÔÄx7gn}dñÑ"õO¼»ZZš¸t‡Ý~Ïž€§Èn³îž.h½,x5øýþ¯¿=zízÅ¥âR–=.çÄ}w>³ÿøö|üzToºÁ[ŸïbOÍŠ@¹8;·uÿq£òïéÒ&«}ËôÆâ¸†â¨“¯‰â’2ÐÄÅ¢ö¤oËíèv»¿Úõƒª =ø³>|àÑG;vl«Z ÁàÍÏvªJЊÜ?"×n·-ýd£Ýn70‡ý¾Qý °ýà‰¯ãOÖËbëþc{ŽœGÈnž~c×6ñçÑ3—Î\(:uþŠ$Ů횼±ÓâO·«ÍÊccû­Y³&33óôéÓiii‡ÃãñÀù¢¢¢!C†@൷júެ<:æ¦?}²x>‰—t'9!nâÐ^ þ²Æo·;ø“7uo×¹MÑ>ÿdá¶õ®E_KÛuÿèqð>£F ‰c—Öl9(Ž0 §}«ÌT·ËQQå­ªöAïa˾ /7p$ƒûvéÒ6ëµUâÌ»ú¯^½º[·nà$àðСCÅÅÅHIIÉÍÍ…À++·Æ3Æõ»VpdÙÖËîØ/wd ÏÂUdÑ€¥Ò%¹¥ÍfßE8ŸŒ‰„νÃrþüÅv¿·Êéªó”cå¤6nÅ^VQíóû}þ4ëPþ@\Ë'y{„¸º[N{ ø­_Î^ê»ÚÁæóùáÔ‚¿®g7»EÆOº·÷¸’ÅUV{/—Bÿ¨¼²êðñs'ÎÕûŒÇ' ‚Ôü7«-ŽY¿¼ò$îÞ½Ûét–•••––.]ºtåÊ•/ýu£põé ¶^«|gÅ–N ®'Ƶw¸šA‚A“ö=¦öM®¬¬,(¸°jûI0ãí_þÛ&øìÔµ}ÿéíÕùߟZw蟎`aÞ¬6‘¤ÊʪåßuÕàmøK``NÛs—Š÷8’Ð8‰?Ó«cË.m›ºœöÌÔÆP…Pì^ŸÊº¦GN]ظcoRjZ˜,S7‡±vÛ¡·V|Y'‹—ßûJÈk|œ»S«Ì²›A—$)!*ºVP·ËyøÄù}ß×74OOªqøâ*d䙉·‰eM ‚«mD.\²xñý¯…«¿½çÖnÓò:¿­ß#G¬ÛÓ@`ð“~í¾?õ­}Cw®šùôò ©.;XÚjûöpÂçòÞ¸wM‡uó¿øÁ7¶Útö.žš3ý0€» ‰ü´sûžwÎ]ý„ga~·—'„«s?øFí7ÒF›¬”îí2>ü|CRJ]¶ÈLŸï´Û›e$ó¨}¸ .^… o?x|ßÃi™Íˆ–—ãzyÝ2»ez%8‰Ú4âÝù'/H,øùÍÐÕ7mŽ­äzÏÿ þ5µ¼Ò ªÖAòŽž¾XRV¹rÝ6—'Ž?3ûþáà-ž_ž§¶8ž»ÿ±,¸Ze ä¹sçB·ã–Õ{¯9÷ÝUèó–”Û’âÛú*OÂ!LÙ·uj£xWMÍáiùû7þÂ[òq!,¤àJȽh¾ä*„ç}qxtï–2mµBqƵòUÖˆ~λQÜ»ý‘“…ûöHI¯+m(ü_ Îu9­›6á__ýôꪽ¾ÿÚ]qíbjF3‰e¯Ž-„÷~_Š%ðì”ïžn»rõ:üŸ¨¹PT:ëWƒ+ª|ÝÛ×[sµò¹äõ“ù3Ï?8ª&¡e  þ8uˆDùùùK–,Ù²eË®]5¯¦³ß®÷^/L Ux¥Ê›ä/l=þ³‚O‚C0€óÏOòÜŠo}U—lvûì·Öñ–|\ç&º¿½^]“„ ®®•\…pA•¯¹ËžÒ(®Ä›È'O\ýÝ;zŽüR¸­W»‹EW·ìØ’V' (ü©wÞ dÁñ£u²ð¿½z³Ë[ššÑTb™Û¹•8ÍíO*YBšéÉ üÉÝù§åi¿»oøÐ‰3lg ‹à`á‡õOüÉóEcoÏéZÓ9ºµ«‰p¡¸´:žUÕ;ŸZ¿igr“LÞò‘»n…;ÍzcÚâ˜?m8ô7,X0lØ08>|øÑ£G322²²² + gž\ò¥`<ïáaP…ÂáðwôÌíØÔQ[vü™'äyêõµp¦©«°_¿}:6={öüè‘· ›¾Tœ~þ³ÃÃ;'÷éT§~8Ë•O!L™ûÞ?w^:_”šÎŸÙ{ôìKÜ BVZß B– /_?:kñê6)ö”ô¦š-s:Õ{‹=G ä–À¬ICÆüz–íxAMwìÕêeqåjYRB>~ÐŽïÎm?Ü`À#(KfަL{媴"ÏN˜‘š0~æË‰)éžø:ßþù¦ƒyKƒ':øðö§Ãîõúà±ðÀ+·vMOú± Ãa üfÂíSžxÎömþi8X¼ªAߚػöwïÒñ‘q·¶m–öï]GÖïÊ?¸}}fz“¶ÝúØD£rý{fßuǽðÞ7Å%åa-ÄècÉoFo;pòÕ?ÿúj“öqÞÞËžälœÛé„–ª:õqW5øÔ»þ0¤WÓ¤&Yá³fŒôð¬l›÷ÖŒ[¿ù©ôMÝçõV•—^>w¢ª¢föË×(­Y[w|¢Ãé”XþvòÐN­³æ¼›¯àa(½(dìÀCût˜ýæ?woÛ˜Þ2ÛátÛDsf§¿Û]VB(ÉFÐx·È†Ï°Z‚#xrÎ<Û†ÿ?Ð#•Ç ü•å×ýޚμÝéGg³Fï“ãsK·ìf›÷Ÿ\¾&ʧ¸BÄåöôÌÎzèΚ)¡!¿z*!9­q“,ÉœHyI1<’ò¸N§ÛŸàpºÂjùàßòÌØÖl>ï}!VKZrâˆ=†õ»!Ät¢žM{=û¿¯yâ7ÉtºÜv‡ÔûˤQ7¿¸`±mõ×{áào_†:9¨<󥦦@ƒ’Ý"Ãàü¿ùŒŠ®•¿RºmÛÖêÊò¸FINOœ;¼¯ÍfŽ%†ß4ÿOoÚV­ß iö«Fç1žWVm›4fØ«¯¿²@êØ³gOÞÑ ‚,rrrŒÎRÔP$oÇ×ûòåËQ¦&’²€{Mž<™CY˜¨ªÈÔH>QÖe Ê"55Uér#”…•P’… q8bKì¥ÔR¯ PEPYˆy/"„! 9ÃÛ¿E¬ËB©v ©õ °ËB,± ”ÎKÒŒ9Yp¢R»ß Åô|X EòçA£,ÈeÄbC,î°ç¸!:Ê‚N,ÊBæ6É”rdtÂa‚½ËÉâ-°©ƒ¥Ó®V‘ôª^På]Nb,ìr&ñ%N¹÷ÀÉÊWÞá€Dp8 !€²@ì©%b·CYX”bP”Be@Y P”Be@Y P”BeP' â‚”×W-Ë ïbÎeº–#$o¡¯,8…JEYDÕ²û‰ ÕF_(«´Qé^\h«´µ-–5"! qDŽ$ > ´fUÛ]ˆ–²¤ƒ„]A—=ÊÊjw âÓe±|¬¡±oJ#B¼J± ñ.( 0ÉBÉÏËK\b#ÅÉZnb—S¾°]r‰SÞWIì=(­Þ¦¤ø…µf€_®Çƒãƒ²@@ˆëÃ($ÛPƒ²@ ,‚,ŒIS' ótˆ¢‰œZø°%½…x_""&Ä^(‹è„²c˜RÓ|yÒ½…!­ ÊBÂ' Έy”…> ,PP( ( ”P~v"JdC[ºcùTÔD8°¶,pƒ²@ ,±( m=êTê/–‹m¢`=¦yzoZdÉjÀ E†£QÄ-=rKú’]îÇ%¸|D¢”RG¡*…层&S°®ü&n¾à”ŸE¥¥áŒ{=øn(2Šö‰p̲ÎkÞ$O˜8=5b6(Lè)G1’…|;KâœBᆢp\”*¡\å”·î„" b#Â)<ýúž×£´-Ž[ŒyVËâö!²@Äâ('”BeXnÅ]eH¸Ao°¤,ÌóúMP–øÇ #0kЕߡlàŒ7&®”…b&ÄðËR4lÁ°je!\âÂÖ'EY6YD,KʰaÊ„”…Ò\qIJġ, " £0‹,(/#pkÊU3bˆD‰,¢àÐlX^¨‰p`mY áÆÂ² n_µ¥Ž:b¬NA×a#чê•ßi÷•|¶Ü^²y ÷r™Ö¾qÐMÃî.Üa Tt9);)TÉB8Ctè-Ì@H}‹P¼EPБˆ Yèå-”…ฅÁ˜gýn2ÎBÂÊ!€²@Xrûy:DQ†à!,é-X–áÄøê~ DÉ2Ͳ ,Î㯚¡D"OPY(ýÞWd²Äé% K/ôШ’Edz( ãAY ,°ËÂ,q( CˆYh~AYDm#ÊØÊ"¨·ˆÌÜ` ¬=n„K~#á½BÀ²Ð׿©ZÎ)„)kûtÌ[ä1OïMãö!½*@ÃK—R”(ØUÊD£¾hßU&œáŒ[€”–õÓ ºNXˆB\r¬”+¥°Ø’qƒS,ÀÚˆ7jþ‡ÊUb.é)+­)—¤/$¥6·Ät¢}¶ 6WÏ1x %”&šå:“\RJx_b“±©mS¡îMDÛ†Aº·%÷”*”îˆÒ}U¥Ýè³}HíyÍÎ9ˆ©´‡ËÉÁ1tTÕ®{ˆ2ôΊÍrŒ2Â" ŽíoYÌCÀÁo„Ê!À$ ¥ÙÄj€Iæù‘@„‚²@e˜¾²Œ‘…V‹ r„'Ö0Yhx«”GQš‰LŒm$—ˆª`eaßÉ#É’Ú!mC«¦˼}@Z&Δ²Œ†‚¾² . P› ËB@¾Bi˜YE]iì™S_+ŒÃÛô”‰®‹ž&å{)¥@LPWž yq™ZògÝ[p²R+ ¥i[Êdñ^’/Å©™`S’{:ªb ÷µ€,('%Wåaz\Ucê¹<¥W мä=5–C«`jYH^Ïä|ò(\×.%3É‹YPK¥K¡˜™¨’£%e°A>L‰²Ð+Md!ï[°ûmÞ‚1.ÊBÀYp¤1;b” ƒÐJy ¦ÀÉz?ô4-yeÊ!`°,p‰¯91~ND¯»":b¼,‚΋Qšn%vÙçÒ4Ìâ†8ñKŸOgO!LóÏ&’…å«Rd!U•c–(òQK]dÁi­à°.H0,$ow\ÃRcWŒÒK#åªüÖ,¹â”_J)i*ÉB[úAc©Åt²PªHzÃ)4%ô»„" U2•d•‡’á é«Åˆ‰d´¿0cMSŒ‰fBXCµÑ¿%( )ªdÁè“•"j,Ø õM„£®úL36"rcÉIù­Å‡’OJ,¹§!ž$æ’mºú‰YbÇD²°"–Î<SÈ‚³ì_ÓÊ"•aˆ‚ñ²Ðë®ˆŽ ,( „€Á²ÀŸd49( „þ#B Ò²@b ²,Ð= RYìÎ?-\s:Æe 1¯Ï'„s;·j PCœÛéŒËb ~ÀëóWU{!Ü»këzYlÙÜa·Å{ÜFç1pUÞ@ psÏìzY|µã;ø´ÙlFg1»­¾æÝØ©^"P#‹v&ÿ«7 endstream endobj 307 0 obj << /Length 1766 /Filter /FlateDecode >> stream xÚ½WKsÜ6 ¾ûWìôDÍDŠ(’’6=%M“qÓNÓÆ·¦Z¢½Šõ %yãþú¥}X©“KggV$‚$ðáÄ71üøfo2!¢­Ì7Es;©½ÝÐàÏ·Üë… i¾ººxþF© £m¼å›«›cSWåæ/öÓN÷£±A(„`âEJ©Øe$9±.ƪkƒ0ɳX1‘_ýrñóÕ²¡J’o<j>q4.³(ݤ¹Œ¸tº¶³®«ÌÌ%ÓEÑÙ²jo뇦Ï@ºMÙ~WÕÓS‹2I 'pÖ~ð:'»ª(K²Yãƒù<™¶X5&E>úO[ÛhË“YãüìãÎà@°©u>ÅawãïU×$¸”bÚVš"0à.›0‰E”lóMÈEÄ™wK!fdVHÖ]!,þdŠ‘`ƒ³’Æ'‡U'Ž,ò·Éo*ŒGÈó(V‚6}gÅ™éW‰ÚþîW»j@(mYm4ÞäÿŒ—¹#ã ˜¬5tSÌÇÔ;§lu;Ü€§98¯’Œít{kJíw¦=3|ðEr0Ž^ŒOÜWà®ÎÊ®ÈØ%º-•¬Ñ¸ÁMÀLÐébÓ`n¦š^Œ=u߃ ×°—%‘’É“ØËg˶¬î«rÒõ*úòHæê ô-8îìê‘ÄAãÈ…ì<(ªÑ"Î!W” '=ô©TÄ‹3IŒ¹´ÂC¥ˆ"† À$@-MÓ%¨lzq’ÎvGª×vÑ©¼õª¥ù=l_ÎFæâÊo8ì«‘Hs0·âžøô^OûúYrêÄP"£DŠo™ÏãLa¬cPqy¼EöÈ€F’(ÿ"J£|“&¬ˆïL±ß4P~¥ë¦ïÁDL½¶-^^ˆ9áÍ…$Ú†’ÆÛY³Âe»‹`c¬ePŽØ@ía²7ºpi.“Ø¥9Š÷h´³wÞ&ÄuG뉠hÔöÖŒÞØŽ€³8â\žÆtBɃn ‰öˆÌ…XœŽÚ+®ã äØVÎyÙ÷ŽzñO[÷Lè$k g&êÌ™¸YÙ‘Ÿ†h.埗 ­P¶©Âýü²ábóº»øcµVÇ*¹Ü‘Âý}µ~SÝNÖ_¨Æ7/à ¦ïKàdëŇÓX~ %ð( ²ŒùËõD÷oǯV£c§’$2ή§qtÆ¥]¦[Qƒƒ ­«’Y‚•¢cIÕ"Ø8ñ$•W3­¾®M‰uDåì­éWò*³§÷ÃÔ÷®ŽtÖWô3‚wÖx'•0ž0®,":!ˆÔ¡Œv“|ÉŸ{€££½Xóf|ZÆ_IÊê~§C8w[:&ptJ½úð>í‚8CÒÒôã.:ôÖˆ«¾Ãñ‰bó“òŽÐtÈì(‚~d²z44;¾o†÷%1t4èÚºj½.ºŽ‚­ èBlI ¬1LYu74Y)Óµ¡âPÅ›nš;.(çY|QtM?¾Ác5#Åø¥mIƒÆ©é¬kM Û<ÇNš–í NJÂÒ¬nÀ¦Ìµ1Ç[z$~LEI´õúe5ôµs܃ë·JC«gAú7¥(K3kÏ›…7Nõì¬W‚x5ƒ©}÷#l/¡v8u¼fè GfTœLõXõîPH_Ôή ýÉÝÝû“iK‚ª]Ï„|›ìmçPCVØÒålŒ@¡ç¢6i-–13SŒÝñÜ™<*`±Šxº]úªëO.ŠUÎ<’ñÒñ5nM»‡dCÕ¥ëCßÔuªŒŸÞ§ö¾¬)ÁoKÌh«¥mf– @g‡@£øQòëçšã ޝm‡Ë÷ƒ±O6ÿ‰o‹#Bh‰^wJ˜ËK˜­ósñðOø»_b37`™B.ijè\®ãO¤9)I~÷(ißþº,n—‘õëÜÇ„õ†g&«àÛ» R™³p gŽi¼Ö}U9î¨a Æ!Êܧƃ§!d\ÒèáŽÖqÙHÒ±Š‘\j(@õÌ8)¸\éõÿ㯾W6a¡7ý8Kg¼AnºÓJ×ãc€\tɈ<â?Ogfáü<ú C¶@‘Ïm?3_æF«j¼¢®‘{]ÌÝ÷æW³P„Ì@ج<–€è~é†&ÿEúÌÃtòÚ7z¿õ+u.of¥¼QŽkÙ÷2³ùéïía]Ò Õ9Œ¦gm_ì+vÌh fŸ§Ê}TÜÑÔ•‘l!ͤ‡Å'à›fȹ£Š#¥Äþv%³³ÑÏÈ£Þµâ<:¾·Ðs'w@éL2¾ž,-ä¿î"ÎÍ endstream endobj 311 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/mnt/storage/users/claus/projects/geomview/sourceforge/geomview/build-opt/doc/figs/light.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 312 0 R /BBox [0 0 146 84] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 313 0 R >>/XObject << /R8 314 0 R >>>> /Length 67 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hbb¢g¶02Õ3S0×3µ´´0Ò†–––¦Å .ù\@a± endstream endobj 314 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 301 /Height 172 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 301 /Colors 3 >> /Length 3115 >> stream xœí=’Ô<†›£n!'  "’½Ç ™dîÀ^€d#¨ÚlJDÊU>úÖhdYjIÝRË~Ÿ*\ƒ­‘-¯¿þŸWÍ«åßïß¿5ª~~~~zzº\.•Ð×õºñ¢ÉçÏŸÿy¸üÿÝ»w‚ÃEB¿âõcˆaŸá'â5;5þyLÂo€lÍôÁn¼Ôÿýû÷›<Ô˜ÇÒH¦F¯/5¿ÿ>’‡n†b¨7 TŒç¡…Åãe~ìíæá2A<‚‹½Ý<\&(]ÌàÌÜÝÝEco7¥.f¸Ù?õŒáÙ†ôwßÏZßóÍrjäóð¹ùÑΗ‚Aö½'¡Ëo¾YNË‚<´ÐJ”‡þ^?ôëáŸ@yxxðëYøúåa´Y\ ץώ¯+ŽM]ßKÔ(½t3N ŠÍ”‡zBÑS¡‡Lé¥Ë$Û¿ σ<¤Û]Ó9ò†ëÞù2ÆŸ´~ö Ðfo~;räaªüåÞ¿ýýotR`rt8ÇÌÃÒÛküËæá¶@Â(æ$pHÒ}¿7d(™s —n“Jðz’_ :G0;Ù¾·öRÎÙPyHÞ6€Ÿ‡ÝÂ3S0;Ù=>>rF˜æé; ýæ÷pdÊz8—ŸÝÙí½©K{ݿժ+aàvÓol¢Âè:q÷¬åaõ·fô0±2׿Öv’ëmkcýÿNäaÑ¢ú…ëæ¸·ÂWuºÐ|yÝ ºÁ–o»!Ll-ÐèaШ`å/ëþ|[¾eÇÃ`‡‚”ûÌyèw)ºÕ,û9ú§²™“²“övY×Ïuklàv3±¨Ñ–V{˜h¾“åávCÅßa«ÖH‹‡´ßÀ¢—¬‡ªÛÍh¢ønk[dz`nïæËÃjéÐû¥+[‹Vš¸‡zÛÍ=£ßô°bãýìs¢<ô§’IE‘ÍàØö¿SxØÿªŒ‘ë@`Eñø0+|PªùçÏŸJ5û¸åßóPý~šÄu‹µžmùÄÕ|xxNøº?¿pŸ?GÚCêyi‹Ú‡FØöã=\·d–¤^Ž~y¸÷Þ~éDÀC#ÛCÒÎÃàH¹vuáØâyü ²ÏÃÃjŽí!áyü4ðÐÇöPåý¥Ùû÷+nð>øÓxh„c{H²ï/mô°åÁs%ࡎí¡âû¼ÀC%;Çö´óп@Ø»vŸu žc{¨{|Xñ¢) šáØ’jîíO2Çoéÿxh„c{¨ž‡‚y <4±=¤YòpÔ»Œà¡\?v-ËÚ-9XðpŽ<%!ÁC3,ý˜¯V<$í<$‰Ÿ.<˜‡ü§rÀÁv?MâºÅZ϶|`Ýöñy¯[@Â3câþÒ±VÒï=Ðïy‹½ýÒ‰€‡@‰®y8êþl)à!PÏxþ°x”Àó‡ÀC ž?,%ðüað(ç €‡@‰¹Ÿ?ä%¦|Þ‚JSx”˜ïy‹ä!8³æá¶|à!Pb¾<ÄùRp<¦þp^]m“²6êV !Úsæ{þЯ':UxèXÖÀzë¢ÍVýìaOüUçƒç Ððpºý[×cMµÂÑÁËzˆç3ÀC‚‡ 0=$<˜_:‹‡Öò£Pq¾4Ãpiçú¡È9&u¦;ñó4üõÙù< áúaË÷Óø{}‰s’‰L4<¤ÛvEûQ⺅_,ººš]‡Ó/: ä¡ <î/­y(<$xØòPxHð°ä¡ ðàaÈCà!ÁÇ2ÀC‚‡ ôÎC›¯R–<¬¢k[B‚‡ð°–NyØ©5€‡ð°‚yhó÷FôòÐíÉOGà¡ÁV8 .˜n‚R–l°—0ñ=´ÙŠõl…5tóP ò€ñ ò€ñ ò€ñ4å¡ÍóÂLJMBBd)ÎÃeÚ˜%àÐä¡ÿ’S€8ù> stream xÚXYœF~ß_1Œd0Gsåͱ{#[Jì‘òä¡zbÆÐxµùõ©êªæ³öØZié®.ªëøê`‚Á.÷wiy¹ÈvÅéÆ7Ôþ¸£Åû×7ó¹Àè.8>Ü<ÿ5Žwïå~ì÷KQ‡r÷—ó²’g­ú½E‘ý´w…ˆÛvfe¡ë®Ý»a–ú±åû¿Ýür˜.ŒÃðJÍóª"õ’]’ /ˆi÷g¥àö( ÝËv8Ë^µÅ#QꞪ•w*ŸÁ.ŽDbà¼Wm©úw’ßZyªNÓî¡nZY*k{M¥h!›s%Ñ\Pß "/ˆI£º½ïú“D·,o ×7N±w§;›z8@ S‡oJ )dèç½%g=xuT-ÄA³ZU}¬ÜO£ljŠ?®4 HÅs]è±WÃ3 jÝÍXÖí‘¶E×÷Êh§‰`<ÛŒ…ñl&eBl²elÜcã¹—% ]ób&ŽõÒe, »OŒ‡ Cæ™34u‰X óÔ)àëT·ŠÏŒçqÑeÁÖ=_G_{0Ž1/|qf¯aDxáóÉæ“‚wq)ÝiÙ4 _™ìÁ€8§—¢õK ð§Q]ë¶Wõß~4Μ÷û ¤Xíc¤ÆÈȶÀzÒ³«x³³xö/¬-´û®áSò0,~³HéIƒBÃÍLêîé)YôØßˬtH¯¬¤•Þ±pódºb–yØˆÆ ÆÿW “àT¾7¯Rb8 ä1ãQIMj¦L ׿CU·Çá:ò endstream endobj 323 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/mnt/storage/users/claus/projects/geomview/sourceforge/geomview/build-opt/doc/figs/cam.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 324 0 R /BBox [0 0 102 288] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 325 0 R >>/XObject << /R8 326 0 R >>>> /Length 61 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`h``4²07Õ3R0S0Ò31002†¨²PpÉç Bõ + endstream endobj 326 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 210 /Height 599 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 210 >> /Length 5585 >> stream xœí];’Ü8Åe]Yru‚6Æ¢£ˆµû±ÑŽŒ½ƒt9´dô äŽ5îœd#¶X$€ÌDÄŸ@U>©ë¢Px|`ÈX¨‡ÃêïÐáßï*‹³ý~Ý(ýþâý÷¡nŽ÷ÿwV£Ÿ7J·g?éÛ9 ½á}¼ì* ŒÑY´J/ñoc¢Uºº.µA•^{µ›†8˜h•~mùøt01*ùlù`6üÖ¶¾xjôÉQ‰·#—Y<¯­öÕhkhŽJI%7Æ­Gõ|ï^#|íÿP»*1*±%¿…4…ï\5z…ØÞ|¨|•^7>¯­9ª„(mµÉWi'ÓœRšJ·Ú䫹 ð–tÿpi¦‰¦7ÕŽ*J¯GÜÈì?`š“’È©ŽJtñÃ)™VŒTúõPäË¡£Ð¹$§©ôJêûÃQ‰¶;"ë²i6ÇaR9™sùŠÎIªJ®~•h«Ò"ÙlP ävTÂ2'ªD þáQ‰¶1–’~°o’8Y•î5!\ã-!å¨dì'1%Ƶx|1µè—”¹P~¼b«L8È‘7Úè×/õBÏÑC/ˆJ N}•©GP‰IwUúÍ{¾Þ߯ñ`Ýjî9â«‘UéÇÇËÆí6P`ñâIoïûl*mÌþP_ïÙ÷‘ý¹cn¯ÿ{u…Šñ¯ÝùéNiÓkzJß¾ÿ½ywJ›¸©ô×Õ•*Â/õX¼G „û%Qi< ¯Òç¤Ü[͇W)‰Ò·?Õ*Å׿—Ò”W)‡’¨Ô¢’•®ÀAiÙÖ“¼s©´lt–R­UZÎÏj ¥ãÑ‹¶*ÝOèÙY¢tÚÚàö´'íx¯Z«uVcàPÚÎ÷§«¸€“ª¿›$[¨KiåŸUc•,%ç„’s Nr&¥û®*š¨R\ö4Jö³TÒ= ¤¤lÒiãX¼(JMUÚ[—«’ΤÇPB-Õ6<Æ<4µxðd²”ìÕ¤´=O)ÔbxÓ~ žTÓðàyŽ3Qè5zØžou”ÐyÖÇ}ÅÈH\Í3‚¨tD%5…JßrÏ¡R £9TJÇð*¥CTšÏ£RZ jìRxTš’Ò=`Pi¾Æ·*ÍMIT¢Ò ÈP xjqz¢/úøPq\A6:¡éj÷£»y3TòE­r)9ñ–vI†œ™9*yâ+Ù”hy~JÈÏiÝÈ~J)*!ÿæþ ¼sëýkAˆå¨ o­ ú¥K¶™QœÆ©~4¥•êD=hàTê¸fÂ[\¼ÆÍÄQò¹œsTR \•Ö·½¬è›¸7î1®¢\8‚P2U¨¬Œ¯(s…w¡T[%s‘‚ø ªqJµ¯%ç{s-%RbËc)‘œ1”Rû%×< +›ÉfjŠ®|&^ƒ A_Ú¦_º?Sl,µ­¯±~Èί e#~™—½RÒÑC-•bÀ|S|ÖQéìËOÂyyȤTI¥“5yàW"[e¾4*D¥pªRRXg„Uš‘QX¥™ñ<‘‹™!*ÍQiˆJ3@Tš¢Ò •f€¨4D¥ *ÍQiˆJ3@Tš¢Ò •f€¨4D¥ *ÍQiˆJ3@TšO¥Ú‡:I¿JÒ±cÕ]S ïjgnÉ­³¿‹[í›·ž9¤Ò_6“¦ä­/^ÎfqÓv…~>%ŸJI”|ûU<©4¿gÓA’U›I`CƒËïé,°Jߥ´èUúLJàž,¦¬HJI*éºèÓj6…ØV[âaJ`÷‰)mìrËŠ¤”v-]#öt[RîÎgKÌžY•Éâˈm™é×’=ŸŽ…Ó’0”ÔNa{O\•ðñLJY*)n×Íâ¥Ä3›ÉiÇ=U:¾2$U€Rb¿„¿_Sý’©Æ©ypöuÑ­žNY‘”|*µâ¨_ÒÍ_Kö½½NFüþh­³½¬ºG!-+’’G%¸úý´«õ"®q(½–"Ë |MÍMZUú%¾`ÿ°•Ï^m“V|YO5_š¢Ò •f€¨4âëw›Ï2J„µÓð³ðZÒ–~Å*ÅqJqN¯p#h„Ìk)¶¨Î”Jú%¾¼À°µN½_O5_š¢Ò •fÀS©ô fûóšÚeÁ¯¤ôvè†ýAè&Ò:þٹ¿,;‰¤„TúÎô?ÝA¹fTŠæ¦áïu¼H¤¤Žq‹(ùT:§Dg/g”˜-ä'rÜL*ä "\Ⱥ#'7\md)e­!‚®B x†¼”ô܈wûÀ –»\9Žè’„²Õ)\mÁüÎ=”¸8Q‰dçr›ó˜©R,%» |»’2™J`5‘þf”[[ZÜðZ¨| ”h{à SIgm_ U´ËŒ·xæÈa+V°B‡±x%›fa)­ŠT! k€÷¦']QJЄóÑËŸæö˜‡¼5DÔˆoô0þ.O€w‘|`Ý‘ùƒ¹áj#-ÀŒkˆ‚˜n Ñ9æ[CtЧš/M QiˆJ3@Tšr·(ä±B#‡(§ž—ÎP$s¨•ï!"Cl;¹€¥dæ?ÔÑU@©Ì‡^žÔÂ¥Þ9%ôS þR³óýKŒÓk±þ.诵S_rÌ·áÎO)Ñ÷àÎ#ImO^xjj©ØÉ¡÷ï,ö¬²¯¥%D Z¿J梠?Á÷|Ò$s|Û«SJ!§——’ò¬F±ßhÞ„)%úñˆЧtz(yÕQ1Jé~³ /N¥©(Eª´(ßB ÷¶Û$OÒ•Ì}OP¤Ò˜ÓÀ$²(ÙYƒR¬J±”°g2›Rj©¤kmWù€³=É÷ÃÜ9½aƒø.òk®¦’¡—0”lÍ"VöÈ%Sʸ–ˆsÇ«<Ì8ƒìÇøƒm°ÚµT•’{§íbJ«%]¨’âwÏNîa/%ÿAŸ=¥”Ó/ñ»çvJ¦_r)¹€1€R®yHPÉZUmû#®ìèA_*Î9kÄuöÅÞJ5n•gÄT"0IÞÿá‚2j¨ä©EbuØU“R¬JÞ(yz@’kPýUúžó…íñOJSQŠTI …UÇóFÁ÷±`ÊA‘J«‰ ësdKªàþƒ9)Ÿ0(Si±Uæê„^¦U0“Άr•àÕ?2¢<”`ŸzÈ»’þVÙ>x]Ì'õÁ|Jé*JJïxgüÓŸòÍŒv¶´Ô|Jé*™‚׆Òýq±áÅ…Ó…O-5ŸRƵ¢¤_jnz¶Žh¢c”’>)ù”*«´æY9êTŠE=‹wŒ›S(1 N¿×E€RË(e¨d¦ópa–lXÞAóà”šO)«_Òç×cÄwNöú q¥iÙ¼…FW¸}ËõeæPªt-Ùec÷e ¢ÚÆ•M©šÅ[lx÷a\ ÆHX€}Î¥T±_Bw\ÅÛ¶À¯¸…))ô±´0â•ÇxÙu©„#ñ(‰J£#N¥²EÜMñÆT6F¥2'[K|ã)E¨ôö­O Ó‘¯Ò ”ÞŠTúÞ§’IøÇ×ðâTšŠR¤Jzº€`æöÖæn&“Ù(¥*y*´z(1ÙûQŠU)D‰0SSJP 8 4JÉÞ3á8v¬Ó]UÉr()}ø˜O¬š= =(%©dþàÛƒ<)éãcª”G ¶Ã.”ꨤ#CI7ÄÑUN)Áô.”òTr(#¬Ió©’Ó#h—©4¥H•øè²IÁx˜uêÕrõ•ªä« ‰‚¯ ¥9¥X•"(ET¶¦3¶†JvÿPJ:‰? 0ô>¦Xmn•¼&‚R‚J‹3Æq4¹q&/Cg¨.¥$•ÌŸó€bNx|–R—RŠJJº^¥ƒ+OIŸˆº”*©ä¥„ƒ¯ŒJÙ¸L¥¥Û"ÊÍym•8ó`«~b ¥6æ!W%Έ›>#®4-œ¯2¥¼Ñ¡àAÍŽÕEåÑÃДbUÂ-ÄvGþZç_%q(U©iåò ó%”Ë;_‚‰¾6Ñü2/¹Fó%Ó“ú–ëÆT·6¥²ùï0™® ”7_"+²@¥ÌÅÄh`Úê/¤¥²ù’C‰[Xß ©F©`$®•ÐüÈŽ¹Ý±.(áJ•jSÒÞóÇQ‰,é­F©l¾äX¼$J¤Z”´J__>^ÒçKN¿„hJ$ÍWH-JZ¥¯·÷/Ñ*¹öWà£Nƒ…ØUõ(©÷Û‹íZº=½g®@@¥Û‹OwJ¿óGW p-}Ù)%Í—v§KÍ!ó%”k6J¢Ò@•P®Ù(Å©4æê÷•ÆdT RŸúå W¥Ï}ª—…L•¦ÂÓî_š ¢Ò •f€¨4X•Ýø W¥Ù¹*ý¼ºFå *½_]Ÿ*@*}ùýÿ¬J^|¼‡Ž^“i•B_€p´J/Þê}‹Œôï¬F›JïÁ“ò®ÂÇûã¤F7J‡ÿ*ðì endstream endobj 329 0 obj << /Length 2044 /Filter /FlateDecode >> stream xÚ¥kã¶ñûý #_"k•/½ÚOÍ%9$¸ @»@Q\òkqmµ²èHò:ûï3J–´ÚÛK Öp8ä<8œåFÀOn ±É´Ž “oö§w‚°íaÃÀ?>¼“n„» å7÷ïþò}’l¤ˆ QÈÍýãt«ûró)z´çÞµÛÖ:ÒÝîŒI¢š­Ê#@Û}_ùf»Sy&’Ȉí¯÷?¾ûî~d˜(õ…’!åKÑò…hinb© ‹ö­«]ïåR‰$‹SØ–¨îUÇÒ?\ú…ÕÚDåVFn»“næû£c`i[Ç*2u]Ž4Œ·™\;b·K‹X¥ÌóŸG…•I}„•}÷ªŒ;©c™LUAùöy«²È_xÐ9Ç€mJö(àÑ6š0¬ Nœñx"ßUtT2êxÞ?òôH7*8øK»w¸ ÒØÀËžàìQ+°2ë Y‰kÕ”w¹Æè**úβ``•NyàN¾%l†kÚ€®}s`hÿ\ÃÆä†0º«é¦Ã.Ýå<èêJFõž¿­;UMÀ=ãR°ãŠôh#rT?iqø›g‘³'P-Móè_Gpš¶¤Á¾féþËChÐÎ+Σ„ˆ x†˜zŽ1_÷œTǺW ΂<>8BÖO•»2æàÉ"Ž6Úì¬Í“¹Ò{º¬Ò™t*΋ñ*}µêÇq¦²bf±$reׯílà"‹ü³;(u1œX“ÒÝ¡}TT^Ú ÝÃ3ud;9¾Ú0ÐúÞB¸ ŠÙ ÇÉ…à?óÔÑ×%r"æ`lvmƒ»£ë&*ÄïícϨ“¿tŽÁ1L)OžŒ|ý¶EX¾–IÞ€÷ƒÎk»''¸yÓM€-¯¸£eVÜܶÈ!Ó°ò!MSõ®~fLYu½eÀuŽq€g®-pœõÊÌÍÊ8;n9†!Ö™tüe½`!L^`ŸÚ¶<>Ó½  õMMô~¼Dk×γ׮”Nb)åâF‰ìs7JÅE’/o²°[ Ü<[×_ÚŽuàܺ§ ÎG'Ïé‘aR³ „xüäQE‹´˜¹í aö·KPÙ¢áÑ®l×iºšU }àoOÝ›Ù*Øó[ßüiñ2:U]7M¤+œ¥JcšaG:Žp±–œŽ1Ržmãê8D0©âD°›‰õo§qïënwRÄ…}âï(,à¼ÿ›=cÖÌEÉáîÖvOAZ5PüQ¦­l½êiö²É^;-óÁ^d†,NäKÅÌXx2 ·RBôM×·—}O1fÈÅ`ÂÖ5Ç/Fßî4Ó°Éà¥Òùt¶«0h¨¬ /ð ž|×3DõE–‡ú²³³-XÛ1UëjKB1)hØñD?„Œb‹I’¡ä oÓÓYJs*½M„ilaµŽ6mH&œ”AiH”D,R,ÎÝÊŽ–J5@UC}Ü€}Ÿ·Eá¨UšB.ac£ Oô߆™*,}Bu\øîýé\»ßyÀ¥Iãð` 7{ªf1Lô±Ö¢fнµ”èª&A1­ÓÉÑ’fãÃDéw­ú#cBäI‚¯¡•áîÜ36]˜1 Æ‰ó,ª1þÛC þE$âÃûð‘kBŸÛK .ª.6 %rMϘGß"½ô7œ]DÏMŽý ÍžmÛWû d¦;N»·H6+^4”Q*ÓciâÚƒÛ=ØÎÙóÚÝ ôSO»Ù¤\¤ ‚7.\ÇD×é&E>á@æ ±ÚÙMmD¢•¹HÊ(‡c %ÒÈý¾wçžIÈnŒé.ã](—ØVÎg”רb"]Ɉ±Œx£ Çþƒg‘iA>´V† u¨šÛ{ÝÖ«Ì­bLâQ%Hb‘xÀFF> stream xÚXYÛ6~ß_áG]+"%êèc’&H‘6= ´@ÓZ¢WJt¸:Öñ¿ï¤,;v,°ކsñ›îŠU?b•«$ ý,JWyó·Z1ñÛÛaå6 ¸YH¾Ü>¼x£ÔJ~dbµÝ/Um‹Õ_Þ«RFÓ¯7azá÷ëM)ï]»–©lU×®72MåEbý÷öLJ¶³A%å{öÏÙ·(”«M¨¤Ÿ¨…_¼k„Z½î~=Ë ¾ÿ @|V¡J|•dÅ›êiê ÂOmÛÒ²^ébxóËZ&žnMíc4`w#b_† kz·©‚§³HèþÉŒLw»õF)ï“É-£xÕ¼äd笒4€ð?½ð?É|™¤`—óGÖJxàK_Dž’‰> ÛÖâÇ@„àÇàÜÕãÒ½‰ƒôn4øFFŸDÄúpd"Œ½OkáÁ áQ Rr 2ôÚÎ24ïçˆC©îF Èï·¬üTD׃¥eÀr™Ýly<SR¹ãùÔ÷†±¼t÷–ÝDøI&ÝA$,€ÀZ޹˜ )¬/ñlÎúÚaà±°é¬óQj8£HÛCDw{\#¾ d«¶ÑÝ7¼ÛÈ&˜XM7 NÛÔ]Ïlg­jƒQâ¹GÂü`¥Z–jºadNorV ¶OVÉÂ5W(‹ÈœÝ0²e+£-¯š1Ò`‡WrÄ$$·%î¦A¤$™E¹r»‰7- d >ãgsÚaoò:ÝÌÊ®ó‰Pñï‡ó9îhÃEDöª0-ArÅД„Œ¾½l“P]¡•˪6g;DÌ74Ý ®ÖmEdP'ˆÇ%*PØÆÆ›Ã¡>YK³¨méCJUvu¡s)C“œÚÚ Ô0£ÅMÀ‡RãîíÛæj¾ê*¯F´†ûÁÔP¦¦àÃ0Qºùâzú ¸o„òã f¶ë4èÃEÅ^Þ=¦[s´LP€¥ØL5_ñO„ (s`I\ÑÑý$ÁEKÊ`Äœûê³½Ãx)£üä,ñÝ­[Î|̈¸ Èx¤õñ˜@’lh÷zfÎCâ ‚æ†RúiÜîÁ¶“b–|ø5eìn×›¿Ë²Œ3Èò6‰10§ÃÌav°‘ÁϤà•Ñ:Ê0!#^¹Ô:0¼ìa*+&?*H¯¥Ïh%Û{^{*™"* B-­ÛâVUÕ“Õ‚§pÞµö>p…"¥ùBß[c c_”cÇ<äTv·1‰Á5Ú>¿hÐï)hسÀ•?pG|Àœîô(êÈQȹ¨a§y±í%Š"† }Êá %zï‘({^ã¬jÍíØø‡<žãIŒÅµº¹ú´É5ež¿öÿ^FL endstream endobj 341 0 obj << /Length 2712 /Filter /FlateDecode >> stream xÚ•ÙŽÜ6òÝ_1oVn­îc÷-Çp8‹¸±»ÙŽÄ–´VK Jr{‚|üÖE3c‚Fd±X,Ö]lÿ΃?ÿ.÷îÒ0tó(»+.o<‚šêŽ¿}xã Þ+ÌNoþöSßùž›{¹w:¯IÊ»ÿ8÷µºŽÚŽa:áßÇ(ŠÝ!È«blúîp ²Ô‹(8ü÷ôó›÷§ùÀ8^Éb>g-[³æG©›Ü%YäúaÄÜ•ÍXk3à±O/n¤ í²í;Å!HºvS§š®pà9׿›nyXômäh<ô=6-Ós𦪑Ü\H>A*•ù‚¢Aá|¬UgG¹¼;_G?týXî ‡Æè%œ9_qâ¨vÒ@?Œ †5œ®F;ÑPU¤;ð°Ç¥¯–!ÚÑÉ×hÅ£f°´èó€Êtô8Î;®WCt¾5EÚÆkxrŸï0›Q2gQ8£™4ƒ„²4¨øƒ:he‡Õm™Ú’¡ÂŽ{8faà¼ÿÝóC]޾36 ¯xÝ>Zòx$Ðöƒ–áp¦U»Ç´ÑCßNbÀIJ—Ào¥ï8\]Thèœè4\j†îíÈCÕÞPT ÿ=Ê2éW=´¨Ò Îë~ªj¢8§C:“éжÀÙŽ7VïmŒåG2ø]{ÝÀ÷­Å÷()vÚªa1 X¡ZùŸ–"‘Îl$/›=Kñµ2û¤Ñ USÚæº+´Ì Óܦ>XäC^Ò.M§e.šaT]!3š>K§7TzÀ´34à=ý„šÅ†V§‰=Üì]ÙÓpmU'UŸç¦ÀáÚMÎ2‰D,,r4©Q̵Ós†ÆØB…·x?å®i™¨˜‰¨Íö¡›¯+ªDmº ~9öb€~.~:¤Á•â—U‘º^lU¤ÉF8§;i¼R‚©ð‚ïJ8Uq@݉6pµ±"—@Î1LW”Q1˜5Á(w2Q7N³§fŠJõÒE‘—9ì+M$õQˆI¢$MàlÖNv4àYs*5²’9 È.áüJwà2-‡ZŠcoÖ cµÊTúçSÝbi;ÊŽ"7ˆB«´Åç0hèÅR»cnZöMÉr7úO¬)H BDü׋qpëÐÐDñ×çnHóx ˈeo¤I>0!_,ò¨_ œ‹VÃDÝÑ“æ¬mÏWC”ãæËZèÌ–vƒjÿÔK¨˜¡ÎQwÜ©¨Y,VEÎ…M¹ä/á¢)âj¿¤*úRgDK*ue4×Ç<ñ£@1,#oPÍ_kª£ž’>;…C Ú†â×ŽÕ Íš‹2΄sÛ™/B¦óÌ@2²–x6ep×È©IE¡Úft¿²™õ†N)™Î Úž'L\z)(¶|S1ª¸«ãòÔêñ°)Ëç³Dc»)yX¯J·´Û0vWT.…bÔœGñ5‰0"Ƽ¤lÇÔ› »ñÓô€Zg<2iXƒ2Z*3³àQ¬åÌ­á,O±<ÿ]®OÇí0Nj‡Úœó$(i”×Ñ>Õö½!ÜhŸž+Ver$1a³ÁÆZ‘Èk†Âçá–Þæžœµ“+ 2s @§ gHlÀO²9àð˜ÌÐê·Áä Êà9`xÔùsá„$>d|nUâU«’dÛ‰E&]FNÅîyG¬ d…ÔDJê´‚£½¥Ñ ‡Íd+SD¢¢‚¢ ˆöàs"´¸u×ÛC¼î{v\¥ò7‰ôu݌릩šîµþ/\žS·ßR÷ýÔï–´µ zë‚o)_Îë‘—,¥·}@MQ”h±ôâÎKå) Ize½uR¢îàBu¾M¶²ý½ô¥vßî=}ýq|˜(üH¸Nñ¬Ñ5†º4—7†+ñ‘Eß%Áºä"€[¦fJ­È°ä‰€šú›*Fz_ƒõý—u¨VÏ`p˜ÕóbÐ0q¶cˆ’6è²²ØdyÀiçsÃŽq#H¾œd'euø^”M§²`ú UPåU™Ž1¦§—69îvüËHØ·5(÷­Dٌ̈́š X£  KAÄòÔJ›$>šRÇ=L8±’Òè[¥,,¿Ñ'öüƒï,,<7 á$QÒo\PG»üqÚï¤ÒÀ’¹q±åÇßq¨$tÓ<{ÖJáyüã ž«øsžÊJVàª#ý6à?ù³¶t†°CŠAdh×-/Ì¿FùaâB٪ͪÈó¬Ñz· lkâ‚P´öΓ—7[à¢äÛèÈlWÕ—Ž0ä"qö[Ï›;`&ʆ"?;þz7› endstream endobj 345 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/mnt/storage/users/claus/projects/geomview/sourceforge/geomview/build-opt/doc/figs/save.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 346 0 R /BBox [0 0 180 264] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 347 0 R >>/XObject << /R8 348 0 R >>>> /Length 68 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hna g6232Õ3S°Ô3300T0×3´´´°€(¶PpÉç B_£¬ endstream endobj 348 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 371 /Height 547 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 371 >> /Length 6057 >> stream xœí;’Ü8E1˜=ŒÛVËì(BcÑ鈱kå”SÆìa´9´Zµ™’Õë™äÀÃÿCðdÞ›Re&Á$ožAüøqëâïXò7¦@n£·Ç#¦/‹ç?þ>>– DÒñpL#©B,ž¯/BZ6ЃÛkÁ4fÙÇ·•óØo°¼PqË>>ïœ|ƃ㱚.9ïÌs<„XðVœ¿0ýðžZÞŠóoÑ"#ÔB¿íx+ÎCEFñG©3/çþ“-Ê-! ¯ÎK6­ë—až ¿.Ë¿åq¾o€êe߯“ËãŒLY¿ŒjÑú¦žó—ÅäÜðüáW=ç›Ûð¼ó5s©åüEç+K&ó•| Ûû§çÚÙÍæ¯Êóõ<…Zqn_Œ~õ~›ê_eþþtù¼vÆürþb:öòÕÿmn¦ïå—õ_ˆgÊ[ˆ3/æ¼sËóåÛñåZ/†×$‹y&Î ÏK9··ûÕâüEeå:+yy¶œ|å|ùS˹ãºÍ9-¤è"‹´ÿ¹|'Îzór‹Îµ«éyóÉJŠœåsHб|mçÎÙ•äÜ\Î[(Á¹å:8o çžå.ç?ü.ÞÞºwQôræñeø—kο.ý.>¾=.9½úX %hÎÿ\WCÿý½vÙý¶õ…þñ!þÓ9ž'Ðô÷ÒuEü¶z¾ä?ðütMK¢Ýó%cççk²Ê-àü|MVùœŸ/pÎ/pÎ/pÎ/pÎ/pÎ/pÎ/pÎ/pÎ/pί8çÓö4O³xüƒÚ(ι4zó¶·Q‚󙾄çmTÀù#£™·ìfyz¼ÅWP§<ÎuÞ²8-ÿCuJp¾þ©ç‹ÕÈg©œóEðüˆJË-d T©bÎáùas.Ï¡ð¼Z%œï†ïeÅÁÞD¨oáêùÎùÎùÎùÎùÎùåü¯naÝNÿ&¯£œÃóVzýEÞ$8ÿ·ýa¨F¿ Óó(çð¼‰lÏÁùùçüçüçüçüªâ<ÜD!;äi_1¸þá¦iÈö”*ÎÏóÜühÏ·ÇÁÍ4V ç‘c(ËÓ‚m|¶ æb¸þN5œËNDÓ¼ÑÖunÚºìÒ®ur™ZA®-äïA}hM3:äyÒ­Îz“¹9!»Úÿ7â|÷\˜ }äû¿ggÅŒ Yë[‹,Ïo’Ÿ“£Ùû)êcóõ©3úÖY W花 ‘47ÉNPœ^è®iÏמvÏ4ýšìÇûY3›žÞ”êçBè.EIÏU~á[‘¤¯­JŠsõòJž§97 ÆaËßv0K°3`žáM™žïçÍQ-¯à\ÓMŠ)æ"_ýCpOv±s¨?®gç-úç24浜«B é:·-2òµ¾Y×Ñý§IYpÖ¦ Yþ —ÏÍ"æ•öb/†5¯RçÖ+zǽ”XxË3's.ïÆ² }¸ºPÎ/ÔŸó œó œó œó«ˆóWîèîª|Îay+es"ô?ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8çWÆüç²_hÞö˜»¦\q†öŒù'î è,f÷Üè} å̯9˜îÇIèK®²æ•êɰ¬íÙÝêQ{º 眻®VÖ<¢“:å?¥ÅÑ;ÙkÁ¹ëjq.—èÌ“Œ’pŸ9PsDZíºZ%œË,…Ìîõ|_¥CÞºëjUqn¤ø9ß×:ýÈ-Ï9w]­Ür‹×s=63à9{~ιëj”ÏÕ›Ð9ÔZ…sh@ס“be ­ÒÅGwhÊŠ^¡¾…_¨Wä8ç8ç8çW„ó!f(^×üå.Ú4D„>E£Žq>­ó)ÿå.Ú4B„>Å£ŽsÞ}×6öé/ñiyóåûúWPÏ»GèS"ê8ç݈FÿE¼oO—òÜõ…8¿“çqÎ'f#úGÔòÙŒp<%¢NrÏË•ö¼!çsÓoÈð| Z½ ꆊ\=EL"ê¶œwòÜlFq^Û:½¢7íy;ÎÛZnx¾Ç¬_éöÜuN¹EM~6{æ'›åôeSoÏi¿}Ê5Ú7Dдs«×Óž§87Û…œøX<ïré«??Ÿes‰9ƒ ͻّQçäç³Aó¼w&ڟ픆¢ž«à=žoÇaÌŽiùª›uÝ´”ˆ:'?x¾}|_tæVYQ*PV$msÆÌ»v7WNÏQä\½<ÙscN“$ç‚ö!3p²sîúçºòúhn¹ßówO~îñ’æ3xþ^˜ŸÏ"·ÐIW%æ-7<ÿ%cJxnŸ'}SÕóyî:§^ÑôUY«:\ôöœ–\R¬ÌÏ­þÂx~…ú–¸ç£é(çð¼\àœ_ ò󎺫çWh'º›ç༵À9¿À9¿X9o~¥‘íyxÏ꺟Ž{¡­¢y]:+çÃzn]zÚ/ÇÍÉyû êFžGŒíãyº^QˆìI6V‘çÖ¨:©VÔ5.ò0Æäܺ–oמnÜ¥n&:ùc@Î…Qå<é ÷g;¥­Š<Ÿ­gÙ *fÏ*:›Ρév¿çkô=Šç{`ž¼ÅŒÙøcÔ9b@ÏI¡Äh½°cîèy-ç*þo$™ã¹“§ÐÂ7ÍDò<ÅyÑ${_äyè*T\ô:0ç“°|uN>½=÷•ͲâzœVë\ßs(ê[Z õŠüçü:Ú_±¯.îyežº¶çµýûꮞƒóÖçübå\]o(ûšH¨-‚ö6×½Ïu,ª®ë´á-¬œËãdö\íÕ¨ÞÒVc­õÎ'ç²jƒ›s³~\î›Ô¤L£yžWß’Ý6'k!…˜‡ñ|¯üTË»{žU¯˜Ý6'kÂèÏùxô9y‹Qƒo`0žçGê϶¹ÆU¤çÐÙ|åzNÂ,­^õü<àù÷4[+ð{îrN+Í·W¦çWæ\ÛómáÌï¹á¥* šµç3=†ótçÊs§m® ç¦ç&çêFñ<«‹/oñµÍÉ#æ?‡Z¿½ýyRås]ZÀó¼~\Žçþ¶¹ýP{•·ÅäÁ¼5ÏE÷¸m.Ô·ð뮞ƒóÖçüçüçüçüçüêÐNÔb¥]wm›ã7×ÞóÝÝ µÍ]~Üœ§ŽKWµ¨:®¡±ÈZA´¹Òö\8˜çì¶9zrm'†öPÚ6G ²¾²­ó=79WG`{~Žõoñå-¾¶9Z¼™=÷zÏ¡'yNy Gàðr’Zõãr<´Í©ahÆ[+?7·ô|[<~Ûê[Z õŠüçüçüçüçüçüçübn'ʹ³։]¶ñüü+OSÌí¡ã{Îà>ó¸¹:σjæyÞî‰yÜÜž*«ó¬•Å^_=©Vz]‡ã/(Ïó=¡*ÕèÁs«Âvß—?oÃó¶ãæ¬Æ wåöž«–ògßÙêÍÑ·…FÍ4nŽxnc/DÒsÇü6 kŸòèLÏ/“Ÿ—Îi©~âúti5ƱžCouÏ›Ž›sþØeE²°¨¬¹Oî£Ü˜SV$†ë.-çª[}‹?³(Tb7Ô·šDKÏÑ_ÖóS8oT¾«çW¨?¿›çW¨?¿›ç༵À9¿À9¿l'*P–çÆ>ÝK+]Û¢®ÿOÖ€í¡*öÜs%6¢çW7w7Ï›Ž›#5'Þ ”¶ÑKÏ÷ö@Y“"ÍöM¡Ôzúé q›3šçW'åyNÛ±œÖ[šëµŠ¯*êÆÍÑŸ0˵?­·÷9QÏzû&ñUEÝ|Ü\wÏõ.' ÊóÖãæúzN-7jχò¼õ¸¹–ÇTì9Ù!‰g8Ï›ßo®×9”šHOöVóßçÐÖ÷›ëWVÂèÔ±5ÙÍÚóqÊŠOZßrN¶² õŠuõœ·8ç8ç8ç8ç8çW‡v¢†Ww5žG $vb¼ôRy­ÊßÚ²Ö×suu](æqs¢mÁ÷®žŸ1n®Õð´<ÏÍ Zå3ÓœaÚg0¢}¥­÷²qOÈ!vUÇÁ=nÎüŽª´mΣ>R{üAà¿ GÛ…s­?µÍµ:–´ûÛõåö©Å Üÿì¬Ù)?x¾¦…Úæ8󖣞ëñ¬9çÆQÒ¡Îƹ¬ž·7çC½jÚæynüéÇyqÛÜ@çPÃó¼s¨õñœ—·Í±çç±²"ÝX^YÑúx§ü¼£P߯»z~sΧý¹ÍC–À9¿žžóçüçüçübn'ªŠ1ÜÖ´Í¢´(r4ñF;æöКU#—{-=/"üÄê¨ãæžÛóÆãæ‚©jjjÉI­ªžiØ67ÑuBýµuÔBOÈIVÊk´ã7N•;ÔUe¤öç¹ms³S·h¯cŽpWʬpä7H¥Ç%DSÏgåi²þ\ º¶ÜX…Ä%ŒA0™ëüãæ©zf=i–ç¯tá¡v"–ïDÊs½R¡ç¨O¹ßœ7•½0~%ž¿Gï •ôœŒ¥ÂÝk˜sAŠ=7£>å~s¾TûØ ó–ý·©_‘­< ê¹›õYq¹™J½ç¨O7çOµ]RGN´Õžg¶Íé=¦Î¡¾'{»‡nΛJö¨§–ÜZÇr<ßNBê…áyfÛœÌÏåm’ÃeE×ÙnŽçþ¨/Sßó|4¥=¿H½â#jù¬’ˆÐ§DÔlœ×5‘5ðE£Žq¤çÐIçüçüŠ–[P´08D„>Å‹°Ñòy½þХޡOñ¨ãœ«½/â{Å®¿T|FˆïdgÆ¥„«ÃZª xUAÔqÎ?©PÞ?>SÕ!¼Z>ö]n!ÏóÚ-Õ{^uçËÆÞEçñ}û´¶©,úž±…ÃZª X’u’óeS¿Ì~Ùªöü—ø]¬ñçx~$BKÇ<Ï:Áùv<‚ßs±ÅŸöüX„–ŽzžuœóWYMÐÁóµTòšòü`„–Ž{žu‚óŸb+kvð|)~Js~,BKÇ=ω:™ŸoÇÄîù{^~~$BKG=Ï‹:£Üòs}Ãêù»Üa^¹¥>BKÇ<Ï:«|þSÔzþž^Éѧ/ïB—»óÊçµZª xUAԙס?ë<¯:‚Gôäê2÷:´.BKu¯*ˆ:Yné­t¹eDÕs>ÂÅ=!BŸª9‡NÚ‰øÎùÎùÎùÎùÎùÎùÎùÎùáü÷ŽaÝPº> Â9äŠ ‰rÏ›Éôœsœó œó œó œó œó œó«9ç×½be£ª9ç—õüm¾€8¿f.Ä8Gà œÃó‚]sþ]sþ]õá<6«râ“­&ÍZôDœo“]Ö¹~Ïù9Ÿô„¿ÅªôÜ,ÍÊhŸ‡s:­ðMi/'T%©öMùJ7˜çË- Ïí·ÏŠ.ç“0óñês¨1 ±»ç=¯C­9ÜÝü|Ö·®9TVôë‰8FOÅù çüçüçüº6çõBôÕ…9¿ªåæJ ý¸øÎùÎùÎùÎùÎùÎùÕóQš ©îœ_ÛóÄÝ*ü€ó!ïÍ—§:[àüÉ=çeçüçüçüçü…óýní¹=}öhß«cé–;šFá¼Ðš§÷¼ çõžOºoœgƒ7õ¼)çt°JØ/ÀÖ1‘v7§Ÿ•ÝÓhœÓζF½žÛŸÕãŠÆÒ0œ¯­®âéLÏ#ÝÍGÒpœ—y® W]ÊŸÄó–ù9< œÑpœ[ÃQ’Âyh(Ëhs:X¥Ôsç³7.+¢¾¥L£p~ €Ë œó œó œó œó œó œó œó œó벜z#ç,]“óK[~MΟPÝ9Bs~s~s~s~s~s~es~Ù©pFTç°¼¥²8‡NR„sè$s~s~s~s~s~s~s~s~s~s~s~s~¥8·îäS5àH«‘çܹ£­ënÍ]±ž\qιUüžCEJp® ¥w)ê¶µb»…­5È€i‡R"?—ùJøöµž™@F½<’’å–ýÖÌz¾5¦?0VFù|CwÑιz¹¦ÂóRå”ÏÉDæKùÏ‹”Yn yœe +³|ž…çIå^‡†ÊŠBù.rfê[zõŠüçüçüçüçüçüŠr~í{7 %:©D”sxÞJƽ»œ_xΑd‡KpÏ›ÈöœŸ/pÎ/pÎ/pÎ/pί*Îíe¤5–^¯1›Kª8?Ïsó£Oâyç‘#)ê¯hõp6}SË«8§ ûúfYêîkò¤ZIçýýìt¨£·LØÒö͉PºÑ)OÝ0j¢Iò[¸·j%çV× Ú!À×wÎí1Z1cCY=®äyçêh6ØÍŧ™&Û=ëÜ…FþOWŒmˆ¤¹IvÊ€ªàÜðÂêRõ|ígðÜHÓ¯É~¼Ÿ5³9¹ Ýø€:ƹVס(žbvjÃtšñÚú¡¤8W/¯äyšsÃ`a¶üm³;æÞt‘éùöÖò Î5ÝÂ잨øê‚{²‹Cýét=;oÑ?—¡1¯å\u~¾/2ª¬¨VX×ѽ§IYpÖ¦ 5>#XVt<7‹˜Wòü„úûØ‹½8bވƟ[¯èÛRbÃÑÁ1Cg:™sù{7–•¸àÛ@ɧç#ߨIºuý¹3 u ݹþ\^%fú­9Twæ|Ts~q~í›Ú ¤|Îay+es"ô?ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç—Ãù?{GtýÏæü¿½#º¿þ…üœ]ÈÏù…r ¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿28ÿ=k¿Ò«ÑM"Éà<ûï'?ºI$YœgBsú¯›D’Åù-ŽtœHÀ9$àœ?pÎ 8礜s5‡ùÞ~Sí‘lsü‰È¬glžïû·çl‹GRʹž …LDÙ~SIÏ9þlîyçšnwÒ1nÏ…ÈsQ*’BΣˆuáܘäXÎ-Û‰s{ʼ@$…œ›‡kÖ/o1&BfŒÄôÜ™’9ÉΩÊxÏ¡Î<¹ä‡Ççùþ^ÿì9TÛs>DÞ¢&·Ô³fvã\ÍoºEŠäP~ÞùjqNR:{ž(?+·ŒRV¼šç‡Êç}®‰ÂçоžgŸC]‡RÓûx.'9soÎóËŠ¨oáŽDsþççϨWäˆdáüáôƒó?ï>ƒs†Hœ<žÖ¼Eˆ7pÎÉô÷úôÛêùäç‘,ù¹ØÏ åô#½E$9œgoþô#½G$è—Ë/ôËå8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç—Ãù·Þ=,ÎßzÇó29ÿãÂyPo±TÈ£¸eŠóØ¢_ äèCÄ-Û9ÿø|<6ðNÅÃ÷x‹:ºrþýÚž·¤à”°ìÁ9Ä­ÿ†—jÇ endstream endobj 351 0 obj << /Length 1628 /Filter /FlateDecode >> stream xÚÍWYoÜ6~÷¯Ø·P@V•DQGûÔ8N¢GPŠ4ô.׫D·:ìî¿ïÔJZ˱ûVð’Ùќ‡á*€¿p•«TJ?³Õ¦ºˆÚÜ­xñûû‹Ðñ­q=á|ssñÝ;¥VaàçA®nvSU7ÛÕ'q¹×‡Î4ÞZJ)ä÷Þ:Ž•øP{Q&€¬7]akoei D,½Ï7?]\Ýœ>¨¢è…–!ç3¦…qê'«$‹ýPÆl»’X´•.K\JQ€i)˜vgš€’‚™Í‘¹ÿ؆9A³·V2Ó»¾©[>êöEËÄÑ@7Nò¯ ”̱±Õ¡4)^&…St¹÷Ba1¶E}çô: Æ|]‡Ò›_êæÎphÑ‹{O%B—½£>äTú+ÆÜÑË¢6­“(Úâ¶ttsOL5udO·¶æÈlíÞöå–×·d“ßÛ­©}4¢ŸM£¿V}H¿Ÿå®6®?zi*~ô"%.¯@ÊÄ/¿½½úىϒÇÒä{ÈÒ7ä„·Ȧb—â(ACù âÐmMÉû¾5[Çbh£Ñã‡3Á$Ú¦ÜBfÒ(:¦î •m»“Ê]ïÔCíÐé¥ëYœÑŽVƒQK…-‹ &RVc8%ÚÃÞ4ÅF—LozcZ¬8b­ØžO›ÆÞêÛòÈ„­­_u¬¤6Æ©C?ñ°³ý­Ú;²+ÐDÜ6–ÐB.Ø[ì-G HÏ›¶£ y‡^ãïU¿)‹­ÑnK–“áJ¼ó²¡oRˆ÷JîlSi†$h.&Ûw¼‡|´f¢ˆA*Ûר—cÎá‚;\¥Ò3I€á+8ñƒþ…!Çœ2…–^OÄŸ‘ç1ÄeÜ+Ÿ~µõš#yBAŽ÷ÆV@åókÞ4÷p,Â88÷H¦±¯À‚©OOƒàÀýŒçJɋ妢ÄÏQ#õmάM×C…>Õ¦Á¬A³P ¿Ü_YiÜé¾ì˜:ëÒ,ä^ÀEc _ç*jVíDî óÀ«]c«¤,êj“N*0Þ®DŸ+çôÇÆS€†_ þÀµuož÷MU±8@­•_ Ê9ƃ™ç z{Çt%¬ÀSŽŠ§XÒCÇep•b‘µ q¨¨Û"•¾ÞbíF2‡4Qeˆ£x„æ † ú”mHMV ×FWp‘·ÌqÒŸ 'së ×#D,@MeZBÜ@¼9ØŽ•=Ô1¶°¬ùÈ¡õ…âä,ij+à5ÎÙˆñ¼" ¯‹nÉ, 2×1þ·Fø|¨™þ8oÙ ãCŽ.ƒþŽ*¹(‰kø^ tç˜j˜b4bIÃãÜ’2›1l‡Ï‰DÚyE¦ÂL+÷džÌFɲÍÊôùÑý s;U sÆ?s膱‚ÜSŽ1€uáæ”Ṡ±ÃÝ@xÄhòÒ±ãÒò½S¾tÎpݺ9ÉQ»Í›7vÍ+¿Qxú|ó& Íþ»÷¼y4/U¢Êg•¨²“<æ™D·ã=Ï{]Ùþt &PVÔ‹§éx|†âp#ms„žcšä‘ezÀ' ËºáZÀê[®¦0T~4/§·t1è6ë…‘`þÓ¤ò³±%Q Ö÷¦CmtŒEAÙá«(ãì ¨Á$7XšÑjðfÀ´G¨Š¢§ûwÊDØúmŒ#HÉá@9⩦ñøëpÀóo>@lþÄŇ*¨ ¢Yöq;™òð!•ž|ãJŒ\i/”¥ÃÙ Œ,bŒv™p–®›§^˜[ýÓ›u”sº”#ºÆ®~†OMªËüÝëÎ6Å(ót=<ÞÚÚ¼lÔ"\ì»Îº÷ŽžH‡«h[31káË!LzðÜ4^".Pa·K•ŸËp`>èڔΟøb_ÆIäÈ\2I`ædvégxYGâZ{‡7êËTA¼%>8Þ=Юùºô}Ls¼ëÁis¼j—ÜS¹Ÿæ'ï®õòø)?Kf^)A$à©Þòj|Á¦íø-K¶ ü˜Sg<ð½=µ€SÁo=<âîÆåü)DþÅ‚,“¤««|)?Qñ¼GGÓ Ë›é“£1zx­kz~êÇŽ“aðܺGÍ`(¾V{×èªõ‡—Ê¿(‹²Ô endstream endobj 356 0 obj << /Length 1544 /Filter /FlateDecode >> stream xÚXßoÜ6 ~Ï_qoóµjY’ìqYt+Ðm½aº>(>%çÖge¶¯×ü÷#EÙ²¯N‹bŠ’)òÓGŠ>¾IàoÊd“ ÁJYlªãUâ´Ýý†„?n®¸_ÃÂx¶ò§ÝÕó—JmxÂʤä›ÝÝÜÔn¿y]ôÃ`ºm,„ˆÄÛXJ½j·iZWCmÛmœy¢")·ïw¿\½ØMª4ýºgÿߤH7±H –«?uäÙæg{õ{Xƒö¾O$ÌÊ(8SyIQ¼¬ïOñA°Ò‡±;xÕ[ñ|ÂN#£ßPÖ­i†›ÇÍOø¸ê ]Ñ{¢AoS $ãvNØ›¾îÌžœ¸³ÝQûu{±ò¶³híÜã±¢¢5ŸGk6áçmšG¶Û¯…—“„ ÆÿFdœåR‘=”¥ŒÌÈ#¦´+ -`ªT!ydï.VØÛm¬TôÁည œéôœqÿ¢¥g¿Å®íñ\@»ª®¨D·8,o?̤j5_ã¯ÊÙ/vt1ÍùHE5>Ò‰ˆ¨Bñysýš„jò—V–j—®[W;œä uKPC3´+98vät»à!eîB{ÊËk«÷Î,™¾rrJZ¸ÝW§”û™;Uªž”;óæbü€hölüáá?KÍPô endstream endobj 361 0 obj << /Length 2530 /Filter /FlateDecode >> stream xÚÅYmÛ¸þž_±ýP¬ ¬TQïJîŠv‘"‡¹.ÀÝåÚ´Í‹,’œþøÎ%Ù«\“â…?ˆ‡äÌ3/¤ÕM ?uSÇ7ešFuVݬ/b¢v»n¼»¡„/ÆpÆùÝË¿ü#ÏoTÕq­n¶sQ››Ÿ‚¿íõq0Ý*LÓ4H_®Â,˃Wí*© ëõ`]» “ªŒó ËW¿<üóÅ߯ó$ùÂ!çó­UW[+ª,RiÆ[»7«\î`†î ûË«à'Ûb£ N­ýhºÞüÂôŸã<Þ 7´nóúày7¡J#•³ø‡½íádi®rpÛèÇÆüp±í— H~P(¶”º…ÊFÿÇ6#¢"D¨Ü#B1" Czk}êG¡ÂA6ç&Z§ëãt\FwÂÓ^`€w »J‹ Ón®ýÄ}òhø²Õ¡Ñ¯;cÀ_!Ôfª& '€=ÐÐ=yíу3œ¬‚èYª`©š°”ý–*ÄRþµXúáþ›½oõ±ß»ákA0Ë×$b¬$ç•Ðéž”D(¸TUð-Óä`xNb•ö<"Ø"iIÓ¶±g{^»Ã±1 ®ƒ7¨ò?Óš÷oþ²n@éýv|è¿T§oß~ÏZ¼ý>t¢G¨DJ§Fòí¢ÂÕÿ¢pv.89ÈaÅ̼ ˜Ü¯M+º5OL´ .ÇtÚhȈçñƒ9¸îüWD¿Â³0߃¤£Øe7䑲삂Ü— ö¸ À‹™ ùóÖ~:è#iáeÏgWBÎÎh°dùýaïgo8rr¬¥0€d,$XfsKíGY=†CRÃb´K¢¤Ù8³„iG%Ø}\¼ Ó:b; £ ƒSÇ”Aà-B»¿Ìu, £zˆo;ìµP8ÄÔ8š‰×Êà©gBk–‹ –'5ù\IÁ:¢àƒ&pŒCÂÇÇ´Lé´íG6Æ{BhÙƒ¹ Õóó‡õŒ¡6ËÀóÓŸ,e‰GçÒ¼º“²˜IOJBÉkíÇõÖ`ôÅQ …§Ýžy€ Hbe5"Ç<=àúèãiàŒSë„°n\/Bìð'ôÞ»¥ÌÕ?#w ÜPød“ËAÂ^êÔGÇ#’c v2Çqÿq2SáÑ6^$À Ríq9ÞiÖè·W‹C€èƒäXÞŠ‘¤¦õºþú°øÃ )MËVA=˜¢ù3æú-ÙòÐØYÖyËÝ ãû&ºû×à©pD7½cÊåùp¬?ÉUÐuóðÍǶFdzzo´œü3²‘ëãÍŽ^Å–àš Fÿâëƒë‡ñ2óÇ>/XObject << /R8 366 0 R >>>> /Length 61 /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`dh–R0403Õ3R æz†–––Æe .ù\@¿k endstream endobj 366 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 450 /Height 222 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 450 /Colors 3 >> /Length 2179 >> stream xœíÝ1rÓL€aqZW´œ€‚Š&ànÒ¸àä4T9AZ*ÎóëGd#˲$ûÛ•%ùyfØIŒYK™ÉÇkÙwïê_þü)±õËËËóóóããc‰ÍF•žBõþ_¿~}£õç?~̸ÖG_o›N ûþV«Õ:¼–žBõþ?~üø7FÓ­yGuú{ ûÎS”›BõΟ>}êÖhÞǨ^OÀ n¥èê¯Ñf¾Z­V«õÜÚž–ý5º„£´Z­Öe®íëŸÏ5ZÏ× °j½Ó²¿FëùZè]P+µÛíz§åÙÍõ.¨æÁnþ¾«ÕzŸk=>þDñÝš1šn™T£/á×¶ž½R\î9ß»”rM¡öÓô—Kk4~ñ}€ûñüúžù,sãt Míçé驽OêËùj4øµhŸjûd–¯9òu3,J®ëBõwè”oÏöÝš}ÖT£i€6ç°º©´º†E™¡F'ŽÑªõ¼¦=AëšJë:ZX¦…Ôhõú½¼¦2ƒzŸì§?ØùàÒûLÜÿÜio>°0@}uá×btŒ¶ïpúqu2é®»Ïðþñ»Ã6X£—þPS{~OÿZ\4C«±YvÝÇçîÜC_‚0:á £vÑ“¼¥ÔèÄGíÜùÒ½zŒfœ¡¿0†gèðou64LaºáKCfth,«F/£íÇÎU£3¤èE£v4E§ŸÐ6¥F§?á[PŽ>dGýØYjôÜÌÊ>"¯HÎ1:Z©À€ÑmºŽí=ôaWÔhÕ7¼ª¬³2øñèÝ¦ì ›R`Ó/.¥F¯yßh£·L;¿UâÂèÓÉ›¢Îueï=`Ø_©œƒŸ©.â}£GG_åûZ÷Cƒ.¢F޾R£ÀåJ×èôÔ(°>¥k´1q˜ªQ`•ŠÖèÕû\S£Í]§ü£ëã_7ÿ?Q­VëŠÖ4û²ì–k ÕhóGõçíùš~ )(}Q¦Ë8:rmÕ®ÑölýŒ><5 4Ö2F Öèu#OµŒÑªPž›¡§“T½¦_6ì½¥w8 ¿TsÎ jtx†vNC½‚ctâý§˜»F›ÑVýn§#/Ig¢F^k4%×éU_Šu¸6 ¬R®1Úþ zy:> stream xÚ­X[Û¸~Ÿ_aô%2°ÖŠ”dÉíS›Ë Ýd'M E:´Äi#‰Ž.ãõ¿ï¹I#Ï*Í´‘‡‡ä¹|çB«Ujµ VIú»(]eõU@Ôö~Ń×WJø6À¸™qþmõó›8^©Àß;µÚßÍÚç«ÏÞËÂ{Û®7azáŸ×›(н·ÍZ§MÖ—®Yotš±m×·û¿_½ÞOÆZ?S2äüŽh*Jüíj›F¾ #–Ρ`qèe®>šÖÖÊ«ìz£¼Mk;W ,]k¯¬Í½í˜Û´–‰=ªq>–™©ª3¯ÕH2ü_Å잌7e½¿ÞÄö^•ÉÖñÖ3Í•e6*ôUÌòõx)Mi/·Ç¾Øt®íËæL¶M½ûòa­墩CKzü?gè1T=1ì<25;W[¦t™ml÷îPÞa虚a<ÐQ–''¿Då¨-2žZ²ÌåV,¸¡A-þežÛfÓ íÉ,ÓZ[;4«_ uïÚ²/jžÞ¡ƒpàúÂÊEFZ{­:‡Ò';ï溾ËÚòØ3oζ°]ó¢_Óý;PáˆÎ®ûõyHeƒö ñÏU¦·9.E^W˜ñ3ºfÜ'Ʀ—™‡7.Hµf‚’Á †a #À6Ãv#l7jç'ÉN‚ÊÔ t¬Ð¼aœÂq­a(J»ˆ9kf‚Oë4ôÀän]ß››ëw,!haTžwÂÅK^h¾'¶¤‚ý:I<¯éÀ5 ÿ¹w<8¹¶ÊoqœF¦9ó‚;üfq[ÖÿHµúöQ öÛ¤%Ä•¸-ô®­«¥=½ÃžlÏ‘Åh&œ8ö~³äØþhhÊÛv{ûèøÿÏL V‚p"+ÁW¬¤/U……ÉJ0ž¬¤@zÂ}*Ê mWð´”[ØLšÓ.‡\WJª…eÀØB¨²Ò™¢oø!ýÍüÐ0ÈŸ¸êÛ¾D;óøD©ÐùLG~*›Ü.bSIlj4•ò~$OxJxú#’'u Ïÿ§€ý`[uß3X0a(Àçúå;Lâ$èp®ü¦l:D«kp íŽ2œa±µ™ks³Ë`Ðõ†yHù/­ª ¦ð²TP1„"öޤ"å½s’®q¥/ÊŽG£zyXZ&ŸÊªâÔØžŠ¥þˆ6‚¶Éd3•kø~¡WöY¤›n›i˜’†”VS€IÙ-ô ¥$²¡³wCÅcyèBvß Aò‰­•§Â W+ ùÎÔeUÙ,ÙF×–k˜»“ûÑ`G_Né´‘{¨Éå¤+9¾w³×~Yr8úµ/ôþÕÉà°\…zB‰<:¿z¸ú¥rÔ'ÀˆZ:=Cœ“UCÉh:g8Êy…l‡G¿µ ÚpúËܲ>£§: Ý ?à$©ü¸“` ÌËLÞû@§Üß ûjÞ0qZ~Ñ3H bãÿ™÷ÜR»OÔÆ¢³(j é«…Š/íb#?à=9±¾¼ßð9GÎ3Ðî¼7T¾Û¨ÙßM}¬,ýH1Þ&,“G#ñìε‹5(Q~šNí#>m5äKÅ/öCExå÷•\¤ ç |_´/þ‚£ôÜóµ¹`zà.i©Ùˆ5dÕ©ýÓbMôŒŸÛÛÅs ÃÿzÌ΂I's”fÜ&¦ñ%Àäg´;þ%PmÅ0ÐÊ—DI—$Ï×èãÜ —­Šöuò=¥ÔcFX1 -zì–ßßìßÞüÊ-óûŒW¯—.H¡ÜMþ9´üb…܆A ¾ßˆùÞN¡8Í…ý4A&’Œ/ê 'ðJð6î⨠endstream endobj 375 0 obj << /Length 2182 /Filter /FlateDecode >> stream xÚ•YQÛ6~ϯ0ЇÈE¬Š"%JwOM.)Ú"Åá²(ph צmueÉ•älè¿ÎP–¼ÜÚE€˜¤†Ãápæ›\±HàŸX”ÉBK—ªX¬¯7ÚíÔøÏw¯Ë­@p5‘|{÷ê›Y¶I\&¥XÜm§ªî6‹_¢w{sl·\I)#ùåJ©,ú¾Y¦EÃf=Tm³\¥…N²Héåow?¼z7.˜¥é–¡äuÓòBÅB*2í÷S?€]™Žö•k€I{‹&|óA'Ó™Y‹ÖqÓ:’¸Ðçiî%pwö‰T>î«ÚÒ2¨Ý5í©·ôy}êú¶£áª§±ª¡¾qnz¢Îw0ADí‡>Wö‘F«fÓâÐc¼\eBGÿ]2jOôuÓ6¯y‹µÞc‹X¬rk•/VBÆ"#Ãí{:ªÑY>ݧÊãôìŠ÷ mÀ2S-½XÛ…TÁº2e>ýûÛwﯫb×ö1íA$e,´†F—¢dUí›/}µ¦C$IÔïÛnXŸ†ž¤ÖmÓW. Óné÷Ðv–¤‡½iø[3׋®·+p×÷,nëYhmzË+p¤¡²eª£§#¤#;N™iíyk BYññv¤3@ªÈlÇœ¢é0ÖB«{CíÇjØÓç¦ û>…’·ã×nÕG´\ÙãÎUýHþÕÞ¿°úÔ¿h¬ó$Ø‚a .ªÏnǬ"WaäÒîó"Vp ³í¯ÝA~@cmkjúqyqª‡jõ€.vÙá€ao!õÀW"2®“Cº¡ä‰¾ìK7§„g¦,«¹÷ù‰Jèd!wE´#Uçü…ïUCª2¯«ÍÌ< ¤7nãÉ,·-²ýbÇšÇ'.£þhÖܼ7¥Ä6)iùñbÿxíá`š çº9ë'j>"È ;ªg«HíŠÖ!jwêŽùÈîÑã“d ­K ôsÕ kë@ä30™ÆÖý‹;ü8®¯DqL£‡'Q©œw]{Ãð«Spë5ïð O»daO¢€èkìï©û„ËaÀ`gpv»- žfè0ö×D¨/´ €1Í#¸ nž ¼¥ 1¿&YÒÃa_—ÑûÉp´ % O‚zÛ•‹iƧRÅEá3þ'»Ìœ+V²,£u]C(¡Š8—ãº8¯;Æ´ÝAR³êC¥V¥tD¦ÏŒb¡e!°Å’ìˆ;‡"äKplœÊt"½uðÀ ƺ BËmÐµŽµiø3‘Ô*ú_HÓ"Ö`‘ÄYÐR‹b¬š¯ÝÁÈ‹X øBfPl‹‰îÏA?¤èþ|ê‡\EïÎîöjxמà yðÀ=ÃÎÀhöyà<áãÕ¹4…‚«aÙ™K‡v·«%!TLÂ9ú\¡‚tÖ-À_ OöyfûbþÑá„fsÆ,ìÍÒWSet-þæ´(l[/Y5;êmm™xb×ïÐbIËK §[úаÖÜቶĿ6vC#áÄ—™Ë([YNTSß@YÙYFÄ +Ë¢ßÁÈ8X$àÌ M«ìBA‘éx W²Û®fCvžIT¯Ü „kôAÔKü ‡¬ÿ–âÛ]Bz™*ª4γ|ç‚p¦oBväY "~2Û Æäq¦F3Ö4þž0æþ„*lG^²Í§šsÏáÖ1Æsã¡2$J«TÍ Â*@b©ÎÀGUfqQê?øTˆá 0ê’A‚ø# O0»ªEÕCe¨biðM–^1UÄ*Me­ÀŒö÷ɂɧ¦&QÛ1_°vâ¶ÂH*<´ƒLÛø=ÂÈ W–¦÷ÐÆe6c{‹(SGN¤ \`Ðh¦‚«ã_n`¯ÈÏ7{ÓæláŒË¸fOëjƒ=Þÿ€ÈZ%¾ª»OÞ-Îl6‚˜ü¡§_V(F|ÅA¼µ§qBû’#lÚ1^™Y{QQÙ âÕÀ×®Óø%üŽ ò$Ö©öž8†_d>úŠ ˆ»!)¸Ø¸œÒ  jM“¸8S raÿ¬Ú0ÜJŸJ ––IA¾£$^i¿ Ô“²T]J¾xÚ Óq¼îЍ£±¢Ëõ·Ð`-{ȺËbåä1bÎUÁ®bŒ½¦ Ó#ð¨ýã (h>ì⯿0®xƒ}n9©ä#8R¡³yü„nx_cþ2ÛqÏÜ6›ŠÁz.βĿ%AýÙü]ºt{œÎ󛇦gS¹™ƒîŽ…è /H=¯kæê_æ;´¢ÒH7¤JEìRMXŽ’“¸Ãƒði0¿$Å4iÏ g5sàAwDS)‘>ÄÖ<C0G#¢[¼ô·ø ϧïÁÌʦ‰ œù\|Õ¼ø.V2Oã$‘—)™@[r­@ê2Nϱ¿“×ë£Ã]uíCÆÙD3¿ÜV„±E¼gh™Là#Ã:U&ÜSчž»î [ Ô‰?dlâ!³àŸRÀÌ{?dƈÔPñŬ™#ïÔø— ~±èÿ8ñ»”Šî;CáJÕ—™ ^±!ßð¦=Ÿÿ$ 8™Œtên©5^Ÿ!v¨8ôÄ©Fxºï“,ߣ<_za=-¦w¿¿‚À92ÂËD9^7%Kom}~±QüÔCŒ~;ntOs㌧¥/ŸUb|Š/ dÂ[ÿÕZ<ô ÿŒ1‡Éê”1»T:zëý!Ì`¦ßov·kk®iû©í€´·ê»¿¦ïm{j6#{yëNòËu{ÙûæçkúF&µ§†ÐIçV~ÚgÂMG˜˜þÚšïÚjò¹êâ_ˆþ^¬… endstream endobj 379 0 obj << /Length 757 /Filter /FlateDecode >> stream xÚ•W]oÛ }ϯ°´‡aiöÀ†ÆÙÓÖl݇:uÚ¢öaݵ‰í• Ӥ鯲&[*¨òb‘ësÎ=\îÅ(‚ú‡¢Œ¦yžÎp•« WeÙ‡ï'ÈÅ%:0Ù‹<]L^Ÿ!˜Îà E‹å>Ô¢Š~‚yC{Ådœäyò7q‚1Ÿ»8+€^¦¥jE'Y1…à"þµø2ù°øKH²,P™‰üOÚîKCxšžD'NQŽ­:DCùoÄBrÆ©²1‡hÉ” B¯8´Ìöc%L¶@¨&4è+kt'º„·ucm®©èÂÇD9sch0P’v1Cœ Ðë*YWnCÙ”M±{u'™MiEû¾íjóŽÆA$Íá.T£Ëìõæµ™]ÆE˜T;;åŠòa¬^¬MØÄÙPcÄv°KZ2ëɺeóÏq1G|xA7>9çmç\¸j+]9#Ñ5$ИÞÞ3>î€^@¡ÞÏ}” í*îHKѕԤ¼³‹½-9¾­E7„¦º.½ÎW5sžÎ¹˜IÌu¥5=ºí‚Œ Jn­%$Aîl8¬âÚ‘à"°JæKŸV+#,õ9 Ë<­ó¡¹’ Å»ñáÝØí¾ë*sGëÝ’©‰ûpå§^&ZÈÛZ¶'ÏûWaFǶ—ÒG*…¢Šæào\º/<ÐUåƒðÁ5ø•uþÌtaNäe do-_CDB;·ð yÓ†MïtJÊCwÆÛI%+Ùîòáf•5 {õ||=2ÁOæ¡B?aÅ.ð­w«g¥ƒ-Mç>ð"béf¹°×¾ÝciÓ€òi OÐÞõܾxTM†SLðcQ?134KuO9<…çÞ1ìNá­ÕñnÌÍŠº~›ôŸêX—úfàn0þŽ×½OÎ…T¨%í›¶´ŠÆ»GØ^"?þ7{ì¤×™µó?‡k]ù¨ÞKºw­4—cöG¿!^ºÂ¢+ýá0ì>þ´> ˜ endstream endobj 384 0 obj << /Length 703 /Filter /FlateDecode >> stream xÚ­V]o›0}ϯ@ë h‚bÀì­«Ú}h]£5ê˺L`36’¶{ØoŸI”4¬×ݦHId]Ÿsï¹¾ÇF–/?ÈšùV†Þ,J¬´šøýj³²ôŸ/ï&hˆse »ùv19½ÄØB¾7ógÈZäûP‹ÌújŸ¤îhã¸aÚáÇ"làNØr™¤])¸ãIìc;š9ß'‹!ÃÌTäQj±¿ŸŠbojM“ÈCa¤³;ÙlåÓ"° ôuÈ"Ê2]€ÈÕodß–ô^o<¤pû.JäÊŽ‚Cœ’A ”•µfÈʶ#<¥Æ,9Ä’ÿ3ÉV«é…ñ–ãõhÈKâpB²AK.%ì³HI%O‚iPéºiÅPªà§B604_BàK’ª£û#'iÉWš¤Vç×ìq(gÍØ_±ŸlØCÑs¥d``”¯ºâ¿µïܾ‘wJ{õEªkn ’íôØ/[f€°&2ï÷rÊڱ̟W.W¤ä x#ØY­;*§òÃ1›÷©\½ï)¥ Az½lå7N²ƒðN";(ëå‰nMaSö¼Ÿqc¼sOTá™1 莗%£Æh-„vCT£7ê˸5.ÚP2Xgº­¾¾¼•^ïúÑ|4„3På†fe×jð;ûcFx»åÕ(¦4™dw,µ_®»1´ öpü4™Œf6õâ艪»™3´¶¶-„ö¿^{ö,þH›…”䃻€ZéMMÆ꘹™/ÖòiQ k© ñýã`¥Ír°”25‡‡¬.hSª»ðOê\éë2£ h˜ˆ | Þ–M·&Ì´†›72EŒíï4u\$¯†yFû®à¹hªg4ºî¤Šf'Èÿ ¾d{®ò'QÏúþ±É5N·ïúßt5õ] endstream endobj 388 0 obj << /Length 552 /Filter /FlateDecode >> stream xÚ•Ao›0ÇïùÜf¤áÚÆ†0M;,Ú¦îMZë®q‰WÀ8[»O?;M#‘V‘˜÷þÿß{ÏŽýá¨@Qž¦° ËH´ 4®öuäO¾}Zà—ØÀdù¾\\|d,¨ÀQy;•*«è'XmøÖÈ>NÒ4é›8¡”Ë.&K`—¹0JwqB–9b€¡øWùyñ¡<2BÎ$s‘OÐr4EÃ4‡Y”-)Ä)õtxík`.ùˆN÷-oÔ?î@G| $1ÉÁÆç>6IÆä“вöÕó¦y‰Û!mÖh§æô[=¾ìdo?W\> stream xÚ¥Y[oã6~Ÿ_ì>Œ Dª.ÔmûÔ¦Óì´Ó ° v:––i›,’œÄEüžeÙ±³ƒ]°ÈCòðÜù‘‰®Bø‹®Êð*O’ TÅUµyµ[]qã·ï"™çÃD2óû‡wßü˜¦WQ”a]=,§¬W¿z7k½L7ó“$ñÔßf¾R©wwwû‰)?ÚÚHkV$^ÛmôÐÏüXe±òÒhöÛÃOï><Œ¤qü•’âÌW¢æ jÄQªDÔ¬PA”(UÍü4‹½»™yw·³ÈCóÔɈ­Y9Ê’êƉ³ +Jæ÷°&Õ"¯çÔûÝTÈõK’ÐÖzàñý,νvÇäJ7L­[½à–mfqá -÷nM»ÁOÖ<3Ew²Q¥ëÚÈ¢»jñi"A† }€>P£"¯t³¡–m‡š¡*QD)kòltw¬;í®³†…ãmï¶ÓÛµ­ˆò>Ùy§»=ˆò—o™be¥íù;°‘”WËT¢î¶…×6Ü}ޏËZö0(Z¡­pà8ßÙzH‹Hû¨’Ezð ™ ÂP»ÆF“{î-ì—0J`kÆÄGË6‚f»ä¯X)£mؼy ÛX™^¡³ À ŽÉXÙ'12­ßóvº@YÄôUg·>éâÊü2ض­I(0#ˆ®\J-]:IG|&ŽW'b_2؇½ÙÖædŸMÛ‹'§;¨Ñ'Š‘cŸP1™aÅ¥·h sðá{—QÙ4£â¸B•A8’( =èoV¸êLö¥iÑ8Õv V e%àù˜þ*H ¶à|?.‹ Ê¡VÄy"I"L•Ä»àKbïi‘¿lí‘S„°õ$ï£bdá˜Üï‰É _¸€Ü´› 5´)Ÿáû]]sCsZqÔÛ Zæ*Ø/ä”8É…WœS'3Áù §‚Jœ±ìŒñyˆG¾»¿ùH ù‘ûò¼1khõ¦Ý5è~Yƒ‚_ÈÝAøö[]ÉÆ_Â4œ×ºyì¯êM$­ç0u*ôó\ÛÆô°Œª¢²U¶ÅŽÞr©0ºcœƒ"ñ™¼G#CûH}Lì£ ¤ÁŽ¢pÎ|:·1O–mˆSÛ-x"b¨”²=ᤠq"péŒ~” Р¯‹©®%wb¨@51Ö”6=ÓlÓÛUƒ5HUlááG2ïÙknižZµ»-EJ,U ¾æ¥2[Wp ù6-Ôhªý1…¡T7åW”žÐw[¥Þ_Ïù Nãªe6–\¿se =)îÆÍçò1-û3<ߌœ@Þ¿ï„ f-2–òyÂDâîY*9Rx¹ÄŠ;ÎÔ4IÑïmCg ‹C¨]FT]÷-“]Ñ€œNYÅÞpïtÍ„iUÅß2æ¹7æÍ$y(À)*ƒ4‰ Ñ)ŒAeŸ(&hsL™b·ÞŸ08ÉN·! ܃xKŠŒ«`m}mšß8E!@d»i$lõJì&§úEP“L]©´ (Ío#67ÛŸL?£Í)S’âÚÆÂÅ»‹G³°Ov±CÿPN "Nc–r&U#Ðô8d(æ¶¶"?Tâ‹­)ºbŠ!J'ìs:aKóç‘bf/£R\¸â@þkH©Õ„½ G§,¤Ty˜úÞÎëýdÓ×ÐAL¶iiUl%Ë‚ÝÀ^•l¤mgzÓ`áÆ%0|«¶&@%Ï6'N8†Å‘kèdž§ôíFÖ0 VäµPÇZ›Lj­HÔ3‹VpÐéI»êúuŒÒ£Tq8ºÝlA¦¹­-Û ÈY)žÀ ã9˜‡“s0]Â#¢Å®©{C¥u‚[ÉÝÑš“; v•)$Ya 6Ž)Ü‚6¹žÑbîà'Äçjg¨nôì„n žiÙœ‚.åõ;èe/n íòP'Aq>9)ô» A+©›CoêååÚù3ù©Ìg"wMC£Ò½´ nz;Îóe€…î9`tMçøKÀ ’É£<b5}á^m†#:v¦<Õ…)ô L/F¾„nœ+oü‚¤‰†€’—а*’†5ûS‰jL3ŽÅÂ-%È_'µ‘Unõ¹s=.20Í*8‡~ár”ÐÞ|þåÃýßÏÀàkš¸yn³Ñ g¹«ÙIV1L›B‘ùn8‹ºCÇìóÍÅM‹é†‚ìÉ)»Î!e‚ð`ð VŽùÞ}½ŸõÆ| ÜýgWY8¸['µ) k¡ÈlÁ-Žl-lÿˆ­R2 ñ]¦âÞ#Îã;»Þ{™É |kéŽYI“Zþbn÷gÕp’'·ªC¹œ˜—;#æQìØž¿».F-âfgGÂ%“¦ƒ¦}c½>xÙÖz^Ë^Xw(Žý,ÏálÂÞñÉ8ùƒ>9çbÊJÁ #BzðÙZ1ù«àÊt3…ò‹½J„ß:qu#™Ž¹o…GÏ#X,…§FlŠ…(Œ½Ç†¡¨ð9òH/L–¯˜ÉWF\ÖÙ‰DçN³]'÷ãàêZ®êÕê á}±zkz;Ã×Y˜pþŸ¸L7Øê«RðÞpý&ô›¾B¿i˜{ýšôÇAÍ”JnÁ4ʯIhÎÚ0 ‰ßÎpM§K¥E¾b6²%ËHSùT§ý·îü@ºx¨óÝóræFÖïº%ÜLýQ¡»’¡$6è´Àk‡®êHÈ/ %`´WrÐÃw L8>ñ¹ H©×!1ÁÔÌR¸2³ôÿ ƈXC>¹g׺‚wj_~ðá‰,wQ•ÉmIÒŸ˜“Èt}Õµ;Á¥î¾£C»2’v_ýµÌo··šq.p-IU†ïd|ȵbÐ Òs¸¨ ¦?°®/>—Mãæz¼p6î& ~>~+SÄMÒédéä²ÑËm·møEà—GžHO}¹¼ ñËå±ÈEf/ú·¤oxtøáxÞ ñîçr6VŠ,xÏë#ÅÄÿaÄ“iKhÊØñõs¢>ù¶ý° ¼Ôü°Ù!M¾Hå*ÒÿS%~>‹B’ ˆŠ‰fþß5S>Jt^»œµËßÔ.gí0ÄH-w/,ùŠSï]ðÞ- äÍB’ô÷s#ViÄ,ÍYW«js61HüÐEµ }f3zž ðœÈ5{ ]£6ZÎwpÕ¢ÂYoûÿy’´ endstream endobj 405 0 obj << /Length 2543 /Filter /FlateDecode >> stream xÚ½Y[oܺ~ϯð[´¨¥#RÔ­ ´9M€â £Eá(­åîêD+m%m·¾3œ!%­e'9E€,5$‡ÃáÌ7‹«þ‰«2¾Ê“$*UqU_Å–Úï¯hð×÷¯¯ aa8[ù§›W?½KÓ+Ge\Š«›ÝœÕÍöê6x{ЧÑô›0I’@ý~*•?¾ÿ…(ïêÆðhS$A×õ8lB©2©‚TnînþòêÏ7^€TÊï”W~CT+˜UWY¡"‘(’·;u×ê¦y$±v]ÓtY™fKÔ{¤<¢tW¡ .¡("Kâò/œúé]ÏÏK¢8áìVÈžÖ¥ÙB®"ÊeîVÞ¯±*£$Sn…f&‹Ë¥s¯7¡@…þ3NcÂGPuǨ9ºÖ´x™¾²Vˆ´ÓcÝîCœ/‚®ž¦3ØÖt=­¬wD:õf`׸#Œ®ðó@ëø¤byR_;ßëvoˆG‘ˆÀB¤ n†oUÎo%ã(OáaE‰T¼pý2Â_¯­›ÓAÃ@âפJï"ƒ :Á ·#w»vv']Õ£}¶æ˜&F¸ÉpÒý¤ ¤ â »þ}6‘ÀZ  x§<û­¦—æQƆ—|§áñ-Æ5¥03­½fó."!Ūy/Ív~ É) \ðW‘*Òt «ÜóÚaR­&£T‰¥ÊÐ:FV3Ø¿;èxè Ôh¾ŽçÞ„UG†ÓoëV<ùe“¦nÎfÀ'Žìiñòyÿ†g—ÐÝóÞÁ€Õ§-Íl§5 0­Ê°Qé–¡©[frßýy ¥žs}85}­›¥D9Iô‹aá6KÙÜØ¡»ß„iüjªñ5¯98ïÐ[7êi×gÚ<Ò2Rd¿¥¯#~‡‘¾ô‰üÎè~y®¦Ï§« HU,J?÷çsS{±¼ÈÞ{¿XqúÁ\@ô 6:Ä/%y³xÆ)¤Y™€ô€¼ðÒu….x *ïÁVš7 4µ¯édÜÇÌJD€¾ wÎf&a£>G’ÿØ€gð#•n_#ÖÄe@†@1 ¿íA¸†ŒIlHHô¾ŒLìëÃN®DqšÃñÁh¿Ë;~8gzƒŸ9¸>‘×!8+¢$ö ÷áí3æ! û¤“y G´aÿWôUzú2¿K%µÝHàÒ›ªÛ·õÌ6b¸†3¤á<t+a[Áy¤X‘¢uwáBÓÂ$Ÿ óaŽ| Lá¶>šv°±DÉS€ÖRy3^¹o¨ÊHA: <‹%údØú‘Ksÿ’ÃÁB)Nj¢€1ÁChÍŠ2Æ A{ãÒ"@*ð$@b³t8\úPƒÐùÿ‰Î8؇R¬ÙìpîwàYa‹©sƒ¶[RxÀ3è<“Ážýb³ 'RP„<ÚK¿3ô'ÂA£ÞbM_©8ô‘I;›ÀƒKª'Pám.¾Kn§XGžáË»'W€ ç Ì<¨Ï"š½dpÀÞÈbñIü=S§%[³ú¾ï΄½·4;v{‚1 ›HòúîäpÌøµ4c¢=è_oå©ýëmâiênUÔ8yÌ‹¢h5£ÎçZä$‚@^&{]i*’êågšTöBi8·2ëWpEkï¹O“§NÅÅTç**TòÃÚŒ½æ„צô´oê5‘Pg¿E¯e%IñãzÅEëæ(Áb}ÿ»5F‹2^¸òñé#Áyâ{JˆåC \Ô3"Djë{œ}%~Ѥ(£då3Õº? ¯Ã#²¥XÐïƒSÜðº¼Ó‘aJÚ¦b»ÌTb–+.prt@uQ¾ i , +'W,LE¹’Q–^TԺˮ4΂C‡ d£Ë®)Xc5²J ZY|ŸÉmT./²¤ðkšžó]¤éÆŠ¥QÀG»N؈»ˆ½ÖL+ϳâÿg¦e”•ùêM)ÝÌET&åÂÁ–<¼Á›åœyÈÒfýبáT hÅZkgíe íLs±€•µLYF‰ôFü_:]g­/žhé×Ë7{¼Ià†'·~Ï6‘À‘fÊ¡;BúÑšîÌH¤eTxhg‹ßB’1Ø4/“1j›Ð”T“â¯u¹Äôœq‡ZÃÂ?Èg`@Ð?ÒWò3ýVzàùȄ̴g­°¥òQ†q¬žÇ`Ž—î9C‚OM?êgW‘â—å<»»sêjtãº!S‚9Óë Ý@쟜šºªGב«¹Á2^0r»è…Ìé-·L9?Ɖé[‹2`g®`q1fâ8¸§,š–<ɩ풦þ¼qk$wz@Ü´,:DpÍ%¹1—ýu…‘DdI=ö(…9(Åà?€sl¶/)ó®»ÛάtÞ/áz¬Âú‡DÇr1!éomãŒÅ¿»f|ÐÜNzÏOMø3¿™€Ü {æ2ÖP.¼ü×·:œ-_û ÂS+ŵoÝ5¾uçÂØî‘ê RÁƸ%/p9®¯±úó†*j¶ƒY-¶¡~`y/Jî½BŸ J´íìÁ$¹;ªçmÝ“êWkçxY5¿7mè}©ÍJ…VKmrúòŒ½ÝU#×&‚ÝêÑëȽKi;lZí´íqÀ ïH¬™Ôæ[l=@š7®QÇý•˜ÑŽÏ'к¬¡'™g.^ï[jAê"´KÜÂJ7Õ¹ÑxØó ðwjo•ùôì²,¨Q‹Ôá|¤±î dj Ýb@¹hM yÅ®ç KfWµ+wDöóîr8iÛ”¸ÇéŸ\ýsÖZRÅe5\Ûu:Ûç‹qº42iÝzÛ,ˆÉÊ‘2Ý¿èöOÃh殯Òä ‘‚ë,`tÖ8Lã¹5>½)ÿ-é> stream xÚ½kÛÆñ»…~8jÒÜåò•ÂÎö]rEl§¹+ŠÂñZÚ“˜H¤@Jö9Eÿ{çµIQ¹‹[ÌÝÙÙÙÙyÏêÔ,„j–‡³4Š‚Üd³ùæIHÐf9ãÁOß=Q‚ç¢ßÃ|qûäÙUÏTäa®f·w}R·‹Ù;ïåªØîlsîGQä™oÏ}cbïíÛï~`ÈU¹¶2:Ï"¯n6Å®=÷µI´ñâèüýíßž\Þv ÄZ?’SÄ|€UX5³$3Š óû¶vâÐÛM±±»¦œó¼Ý7wÅܶ<û9ŒÃö·’.†ØçÊ+vósz+ÛªzŠ ÆÛ­,cTxµ5ŒM˜n—¯3¯.«søìG$½úi0¤”3ËŠww$ec绲®PJ3_ñm|*æË,~|¶Ø³xçMÝ"¡Èøýà¾gW)% B ¬£ M#¦’ ’s?N´w{žG^STíi Ïõ£4ö` Rɵ¡ˆšJƒ$j7õÆâc¯þDcï¸@˲š×H¤)v‚gî ‹ÒÓ™9œGp`†«zS/meë}{tvæÛl»…Y’`(²SÌìáœ(ʼì@‘’`òö™ÇTú~½+ÑÖåÜI&Ê=þf¢14år…èB¦¾ãïG$lÖ 1•„À‚ö-Z‘Õ â–?d@¿à©ñíÚnlgE°ÒÔ8ùÔ‘O™üÔ5»m@¼»¬–À€I󄘂jeÚ(Þ¿¶ŒÓ4ÂÐlñKBÀ;¿Q†5”†à¢&:Õ‚—.ds;ÚŒöpJW÷H$GŸMXT(Ù &ÜY€]ðÊØ‰Îĵ3ž?ïPqvðôvÅxZÎfèT`…ŠHkáÂáÏë͆a…Ó¿ _¶{Ž™qî-›b»*çí_ÐÛ`Çî¬å‰9ßJDß ŒL‹8Ø dg+î[¼?ŽJÀVýbN&—$Þ§•m„VO«`ºrzÑL:ͼ^ï7‡œƒÝµ ØQ£«¬Kâ`ì#.P€}D,99x=­Yë’ Lùdç2Àl”HX€Áå~¾.¶¨pzà²,ï–×â¸uÁ6R‰>å€bËp[4¼µ”B YØ7`Š4vþx¨Enõ×E‹—6)mÅQâõ<»•”ë$ø¢1"Öى䠀"q³[=å´‘u#¥‘?Ä&¿CT•8Pÿdô%wzBª'ä…Á-ļõúó”5„OY‰ü5ÝœƒbxãVÌÓ[Ð…ÿ»™J2UÊ™ê ’z…þbþ§¬%%ÁuÅ÷f%Ù²\ì½ôÁdò>,+²¨•7S'e€¡†¿(Aâ-°È…B‒ƒ‡¨Ã©Cò4w’ êÐH”9”¿Nñ‘q¨FtPuK ›®ØeSʃ-CKPÜ8oO0©¢$0YîÀ»Lsª£c‡öç)RqêÔa(âtò>™én|‚Nœ=Ž!ó CÙƒ ÝišŠŠë‚(7'+­8”á`“ÐËŸ ˜¨pL( èåÂíëês=ƒµ Å鮞Áó¦²{d¦~à†)ŨTõ³@€&”S¤N¥¸É7°aËøTÜÀ´¨&-) ¥ÔÿKq±¤$ï°F…^º+´`r¨ãdñ¨´Bh_d:Lƒx%Rq©‰zËôë­ìT½*—\ñØË® AéŒ7ɾ¦Ì3“?è½é× 'è¤Ð ÚQQz¨>#‚V,L\'G*õ;(E15ƒ+¥cÃRçÏ;T„^œ¬…ÞÔÔ?Q-ŒõŸÎc’Ò¾Z—¿’‘ò*WI¹\!ÜoåãB‰]ô@Ç µ×Z;îÏ£LJ«™QŠ$†=:¤–YYþSššõ!¤ßµ»ý~ÀDç>>†›Ki†ùÜ·âMÞÝb 1¼û].‡MÅÞ÷rÉm±Ñ¿F¨4 ‚Í¢< 4D÷ß‘pØ~}êUbDÔ™¸r v†ý.ŽKU†—²¾æˆM!…èÖ¹Y:ðüª‹°K[¿Ywî¡A™I“uÔ#†ûµ5»…ÑA:.„§ î4[MÓAEÓQÎcd®ÎS.* ÙXº+;yÙ$Gì²>Uø@AЉ'èk?‡Ê4PO$ ŒI¾^<BYÚ7n)ÑFQPíçvî+ â¸ËPÜé÷xÈ|!Ñê'“r5ý=¯¢<¥°ìE¶a Á=A¿iȱø÷µ‰ø£ñ>빆â±oXw/ ™6Ÿ¹`›yDýÿº¨\}”gîí2ÏGoX)æs»Ý1ÞwŒ YÿD±w½B/n^^“É_3…M¯¢y&Lbå”ô*¹©•³¸]R;ç”`–§JµLCíµ§†ƒÃa¾«•Ç š¢~m° &íÓ@ü>”Ù/ÿþ‹W““,û殘ö]½^KùÄ)Iy ^éêQdÈ1MXPM²‚õµ;áÅõ›‹Ÿþ5ÅIy<é<ËÑ\lÎX»Â±àDÚ2€M“yQ+es~‹¡—Á8‡ÒJO—ä0Î7¯he?­ËJÈwøþ3uQè÷LÉUUîýsU:¾\k‰‡Q7ŽYNײ†U‡‚—^ŠX7œA#EÖ@RÁØF^Á¬øê)3óÈÕËÛ«+`WÇîv ò8ôþÄ0v+_œ—@ßÀ†oxÈúÃÉýÓd{ÜfÀŸ)\wV%Î ¢”²QS’Ï<Òþ‡rÇ+î–K˯[©{Ô¢]_‚-\^vü" Ô×àÔOyÊ–VÓ» ì&Fp¹ômµ(‹ÓÏûŽ(2ä¨e`ʾ!GX€~®n¥-—U‰67/õs6.5Û$ðLo>;ÎP׆òà‰(üU.³k”òcWVê_Ê•˜Ú;‰ bœ‰<ÎÚ©'¤ZÍ;ò£³Vlé8€éÝ‹Ò5ª«uïL›šœ@¾¶™z=ë¬èFwî)œ`/GÝñìŽé]D¹G¡L¥y+½ÑÁØIzÙ×¢'zã煮Ƀ\ØK‡tÊ~ÙS$éGÌíZ~±‚ñgd¼ÞŸI„µ÷î¥ôL¡ò ½íe‘<òeÚ=ÑÌn\dñ9õ~¹’,ÝÊsè\,ŒÓy¦Ùž…« ï7aÒ¯§NæÃC‰9A Í òQ`ÆX2EN]U‹¢ž K*ˆó®úzùöõëË7·S´ Ôa¯;–äô“w ì•Ýåºå%/ –òÐYñ´”/ë0É¥*?– NÙI>q¶7åVž~ÈN²ØÔC‘Ü·mÀ?Ô~ô)QénÛÜ~¿G`ò×á1£¶-Ŷ Z2BÛ†¦€]Â¥ p¢ÆÌëÚ¸dŸùÓ]˜Ã~€Õ1Q×Ùè,™ ýAFð¥tûâjtÌX€1 0f™½ÛŸŸóŽM´ Í#åç°àtL´/?ŽüÀË„ Mœq¦¾XnÿCìŽ9a‰FJ¾Ä=„ÛwÞKªa c¦Iß  •‡P¢ük„‡,È~{Ê•†$¥È#nså'«›¨ûã 3n`è:ì—»_·#Wóä®±Öui„‰Ïÿ÷]áŽmdëAÒÃ_ñ/Õhw-6í·'~¯8”gÌÿ×7·SÕÁ¿¹Ø{Οח7ß*ljAô Éã²±áÁƶ+qNÄî=îªþó0c.«¡Qü>¨Äî endstream endobj 431 0 obj << /Length 2583 /Filter /FlateDecode >> stream xÚÅYYsÛÈ~÷¯`éÅ`EÄb€Á¥µSå(¶Ë[o%V’­ bH"Æ¡ÅaYµëÿž¾†HÈònRªæèééééþº{¨ü©Eê-â pS,ÖÕ3FÛí‚ÿxûL Ý W#Ê¿\=ûîM.”ç¦^ªW›1««|qí\î²»Þ´ËU޾X®´Ÿ~zû#¼)J#­e8M[e}·\ù:òµêåÍÕÏ^_í}ÿ%EÊSQ£±¨*Òn¤âE”hWšåUKX:Þþ£ÂxÜÅšŽ–(/ôNFዕݶZ©ÀU!ïôgŽÕ‡ ˆ¹R‘ë‡Bù¾éEIý.ë±¥W.ßžbç÷ó¬Ï˜¦5ÝP™Ž;ER9•É‹¬7ånš²l–~âÜõÖ26̧̺ž‡n‘âÁîÜlxþ¶¨³Vøàž.ÏE‰ï³~h³öƒ;=GE€$ýsI'Èt’'NÓuÅ-^?ö ~CÇTK8Ô-Íä<·nªÊÔ(NoYÔ]‘ËÊŒ?,ØjÓ´K80žU…,ÙÚ¦¾aèüǬûs¾¥Á@´Ü‹béû]3lw|D»uL[ãH•‘^¸“ÝñQLÖ²z ؼ榨4pv&Ë­Ü29HiŽ/3Û¢®‡\Œ½ózÿîM Ö¸˜Z\ƒ¯]Ï»³vS8qä;¯É –ûÀ“ç¨Ý Ö¤”( ¥àÁ®³:ç†ù ®[gåŠh|¢á™Öl£iM½[›±d4‰Ø¬_}h*ƒ'ôÆ—À=)TÙñØÏàIÂuâ³iàjñ˜éï>\ÍííûÐL,Õù£ÈUij)Þ½ÿ> “bé2ë?ÜeXE€Ù¦dËtR¸Ü–›lƒ8IÇXÝà~ê9÷»bìvL»·0Újdab±¡«c55Ù²€‹"‡[i¸Ý¢æ/6°Õõ­É*ØÔhmŽgÊ&#›Àö¦m*nÕYeó¢ûÈ­Ÿ=¥KÓ—@›GÅi¹ƒŽƒn3ÔÅ gÌׯ MÙ™{ЕøÄ§"cã—Í Fjs1Šhçí¥‘5š"ìv+Nš•]#­õÚÜ fn ao½¨¨÷؉‚[V#ÚF8|e=zkjT7/ꚲϷ›³7•ºaLaòEÓlÑ·ðP–èqqñ’ö×xõô’¯9¢œýzÆ"$}„27›¢6BÞ=T·M‰*/Ÿ^„,¼>{yvÃM–nõÑ<Ü7mÎc®Ë:òðïhºõo²õ ÙužöovD{ñU W¡rCÎÉyöe¬Š“X¦nÓ;d3›¹ @¹:õ­¯ŸÍ1 ÝØ-Å/Cƒf=ÇÉwµ¯¿Ê)ue Àu+4[°¡Œ<ÀO­?ó(¸,„ƒŽgGxA«&AˆÂ:†°žp€Q¸C;ç™ëÛ6[£~DfN# MÒi²b…L#2Ӹ닢€R5æ ´Ÿª½b›S4=½WHnj”Tv+1-1šŸPXƒîʹZJh@<ÃÈ7\óð]KžTæ+ì ”å 䛤ƒÝ÷¯>ˆÇÆ®À{iªc·3ÔH(JãÀšeÂ&ËÄí¢c2Á KÒš_†¢E„ÃËd‡í Ç3…eXó7ãO™µ[Š4@²n8]Ø}>çtÆÝ ~Š¢0ké÷ÐEß»¬í§é‡ä–v#šÇq‚h™0¤a‰-’gŒðV°ý-€1Ò}*Ìý!×âÔQ•âÔ  vJ¹À+Í笺+͹ôتwãÄu”hmÀ˜8Ž' pkÝKÀÌîbΖçåWF †ZÁ<ºS*þþÏW=®fŠ…Qa1WBðè ü|±w vxê ™°õ’?ÿWɲ­2H™¸/Ã2ùÖØÕô¡ oLòBãŠ:›Ð ÅÅñ¿ÌÉã³<ÿz}y59’?-üü¯ÕvTq˜‹E1ך&wó4y|>-CÄ»"ç®Éžú.Ø0g"Þ¾\ƒ–øw,ç¦&ˆdæáˆ¹ø¾ÇK?]•›²¨ JÚ°;@D¦¢ I·C3tÀtYnG…QK¸ EÚ¸–±PØZŠ}PF9½Ä§—û>ž~Æ;!0üö>ëâPLO„nÿPØP „€*=Ô÷Ç…Aà{Tà8$:ˆlÊŽ2äÌy¬u Á >{ÊÐsÃ8=KòñAíÑ> !Ì÷œW³<y‹ºè H;(‚*ÿ¨ÐÐÎBlA˜ÇâìP–Ü›šm¨çßluvÁ‰}©Œ jEW}Ï)X¶/µ W´oûö瘓šN‹åÓçîÉÓï5?Må £p½$:ªã §àíѵpkè0gœÑ@ <¨ê1Ëfº'’Às:zÕLJî£hm':ˆ¶¯%0Ca¾îz,„.U‘ðåyŒ,œ¼ßò9@T}Њf¿²²?:¨ 3™ZF±á -£$êîK§P¬fEIù3•˜(¾cØW\Qã¯f%·;¸[ýbÿ.륅ÙT7ƒth+‚¨á…gú÷#¬_Ìâït›)Ò¡|ˆt±Ï½Æ·èÉ®œ9/ƒ’BVzvÀ7ò'§ø Ø1ñ"±ý€2ð+/âžð:Äk€&‚-ušö> stream xÚíZmOGþ¾¿¢¿ÅVäÞ~©ê—ÈŠ„AQBÌ.ÊçŒÍ&0³Ú$ûßç©aagÃ,3œsN2ºëíéêên\ÎÊ(—ƒòøgœ²NZ¯ºý~¾ùåõ‡Y¥~UVÛ¨N?©Ã²ž?ÎgÊå²*˜c纹)Î.‹ë¥jÿþÙ¶ãOóRMß|lö¨6™¾=¼†˪Yb ·‘˜L)—õõâ¬\¶¹­í:(ÏgÅ«ú£:1J &ÁtïàÂb±J–¸ð­¦GX%k>Ö <ÁxMXÅ}|XL:b1Œ€ItoQòÛÛÓß˳›Ñ?\YIkök@Èç^ÝeYAèô²¸xaŒYÃѼºjê¶ë©aa»°°ƒaa·€Å—Û…{Û#[û¿›%ªº*®Ê¯`—;vñQžîTU©NÚºEü*ÛîM{“ßÝW¡åŸL®O›ö÷ŸfÕ“é«zqG·²Ì;Q!;ÁN§¥Hr>i‹ZÃ%Ò¾£¬±õ‚o§ë‘šî×ǵ†žíÌçe±(*ó\bê„Jç‘‹în½·^c›qéC—(b&Ïý>Xã š…ÄÇúà¶ ©»mÈH(kï|â-²]oå­¼%ÅÜš·È )ʾxá¿V}ZõwZån@èq¹“V‰F§QŠçht”b$-'=NÈo7¦“ŸëêÅ›ë³ËÙyYTÿÁFµ_ÖWe³ø´ž_Øô¯­5ëXK™5fS²J¸›S˜†®Þ"§ðÓ䔇r¢I<Ê+¡ Uœ;ÂÈܱníÿ+ðÐ-ÐBž-Š5b«“ã^>Ï^[G½|¨æ4»0xñ÷¬¹8·—Fî8<ú¡4`=l.¹Çþ…q]4Å-Ñ”lǸ4ʸ¡6$êØÜP’² ¶'uí ƒí‰»=ÙwìÉöQöÜ©}òêH™ÓØpÕrÇI!ë$¬B'TDÖo¬€^ͪbñIJŸ÷õâªhFŸæ§8$>ë‚–ën AgŽ–-Qή?àáÄ:Ø~¶`àÉ^6ÙØ„^>Ǭ @³N7mORÈtr>?²rg/ºÈ•ýHÈ’õÚ¡Äs–t@Á,u(žÙnDͯ墙¾õˆ§å%é3Tµ88ø­…"Èò„Ñ¿u ID²Ïf¯“å1;éÝcúPY"3JÝSÚòÆt”V•´ºP“×››Ö¯ZZ}}ц-囼«!8Q´ÙÑf9'n ûñ¢¨–7É õµd*P‹'AŸÏ¬)³²ÇÄ$* |U5,ÜÄCÒòœÊNGyF‚tqóÍß?þ¹³;N¨‹8¥~+¡ˆ¾D>$ôíÞÞ8™ÄA3œ¼’)aHÞë·o~>c,2[–glabôm-Rr ë<³–GÉ>>¶—ïåÃiWË{õã6®;©ç^JŠ*ŒË<¾s'·ÝAž>_­~É<.¬2K\µ£ë/›HËc²„žoþ(A[ÚØScãõùÈ;|¥[©l¸ø Ð‹óòý¬*GÊõFgÔR[iÄ‹ J+¬-ìè!m–{Yç/æEs±ußŶÎP1Xw§FûX‰8 endstream endobj 444 0 obj << /Length 2806 /Filter /FlateDecode >> stream xÚµ]sÛÆñÝ¿‚ã<´+î_i_äÄqÓIFGí‹“™@䑼Ø(Y“ñïîí È”<íð‹ÃÞÞîÞ~“/"øñE-R)Y®²Åjÿ,r«v» àý»gÜã…€0ß\=ûËq¼àË£œ/®6CRWëŇà»]qhµ]†RÊ@}» •ŠƒËËw?ÑʦÔZf2¨í¾h›e(T"TÇË߯þñìíUÏ@,Ä#9EÌ3¬òHÁWµH2ŸTÄïŶ0ÕkbóvgZàN O<8,yP¬ò«Eµ& 4•_º¶ºøØøÏÖ/šª1ÛÊüqµ*ª¥È‚Ö@F`-²&2ÁâT‚(Ž©çgÄ~ÌR‘ußÌQÉ_¢ T¢CYÕû½&ö¼{¶À•;/Òá·“¢àƒEš‹P Á’4[„\2-óîv§­ftt GK`)Êñh°$¡˜Œs‡+`@iÝG¨ø;ã§U ´• çøîB=ãÜ€+õÆ£ƒþˆü“+d’!Kxþd“¢Ýá`ûœ²GGLÌ 'Ø&rºÿ Y5Ьrš…ð‚“µ¨ÞZdg÷|U匫±@_ðU}F€)ѯÎY –©Ž*XLœ¦‹ÑÀ Cä¹{”¥¼×Õ X¼s© DÁýåqåûyZ·Ä¸bü³ª=JsôNZ[WaãZĦV€µ-NEƒÃ*\Çõ‘Þ€,ÛT’¡ Ï¥ùK *7 ŠÈ(›EXvÁa Á¥ÙâІÒ ôÄ„gZ0I¬áa©)¯•„4‘VÐÊ Ó.ˆ&à$u£éU~Ð<α=b€ Y *|RïÀ¨¾Ã…kKõU£ýôºÑ–}ÑQ9•ãÀ¼Pæ)ÔÒh¾‚ÅOwÃn{xÚ?gÆãC&ŽÌI& øð¦h°H@øG26è¾WݬÜ!㲉8ÿÌ{ÿÌD ’{åìI”X`’€zãËîÙ!‡'ì¹Ô?&Ù;'±à*1¼%®émU[(ÅÛòŽ^{o¸kâtwŠDÊî¯Ë%§!6$8Œñù:Îyp…ž—ß7ä‹0vÙš¹ôÏ…}MUš]ÝúNÿÖPWãÅUy\w9óP¬LÛñx7K0û¢<ê®3‡+MâI’ú;ˆ‹ ½Rµ ]˜º¿8í5£ïЇøp¿ÂÁ1LïÎM-dÜ-tE×  c«Ý„GCI\Úµ¶´ Ôz¿èì\Ñm§½2ñ3DÇÊìûáç­¨zÐÎ…G=6Ç¢Ä;H£nÌ‹;!âºÚ£'O‹óRâˆÔ›Ú—ÈÚ] NÄÁ¥}A½¡£Þ•ÝèB’œz=™¨ÎÂfš¯„3yꑟ¿šm¤w*òHµíÇÁòäñ]8;‚`‰üò<4žâ¦Q ŒW˜ï`Í…|Zÿ„BEþu–s°„D%OÒÝ¥Â)ïqßiÙlˆ‰ºržø–Øáu†E¯Øût£S΢(~0#¸”§Tp ¤ü##•X¯ &è.CÒÔG{kvóÚ€ðü„)×ËÙ)4Sg&@P¤È^å`¬XF~ÂI¥ ›ã²øûåvãהƯ³– fùÿ@„~¼ôêì€ÎM 憜 .¯Š‹Ë'üQðÿ>º5ëvG*³f,>3ïû?°6žŠr.fœ¹¿p ‘d²Ÿÿ9ÿïE÷Z¹Æ¿ÀäÑÕY`%Ü7Yʢɑ“_0Ïž |’ôL~~À"NÃöó‚úî²Xâ A -è±ÔDFKÅ•_S„©=éuÝiʵ€ÝiÔ#MSXSÞŽ´ºé6^ô‚¾F¦ü#öÆèÛ® ÿÏéÿ{…“¬þ7$³~>É^8Töz±yö‹/ÜÇY)–æh)ƒâu,ÂÁп¯ýe=®'ðÆ—¡nÙz[‡8´ s*¸g.ПÖWáìa¥bÇëY(ëÛî”úî¶¶ë)üq²„/NW°/šýeÖ Ô}mÆŠEI¶Èr–‹ü+´™æLDrÄzÝiï`>é²Û·ow†~åÜ´æàz·â¶ÎëŽëÿHxsÞ endstream endobj 453 0 obj << /Length 1511 /Filter /FlateDecode >> stream xÚWÉrã6½û+X3Ëe!¸3ËřɤR©qÝ’T"A I0)’ŸH,\LÉž)Áî×î× h9âZ‰cEž?¶ÒòÆéwÙÎ’‹ß>Ü@%g A{$ù°¹ùê‡ ° 'Ö&«ÚdÖ«ï÷¨n0»³=Ï[ù_ßÙ¾¬?ü,w~ V«»Ø[QV¢†ßÙ®ºþ*ïþÚütó~c®ûJ¤äs¨áªëû Jb+Œ}=_â}{'Ž«§§m«ŒT»Û[¹“S&¨¨÷ÈÖÿ–{'Òìåêá÷_ì†aÜ!HlèLTó¥X.kÄHCheô *“‹ ×ÍÞæ”5æ:à z_8HÍÀ™ "Güjü´mä|ÄÕ½hk¹WQu¶¡ê‹Šƒ2·5Š¥ç#¢¡‚äÆcIšÁÿf¯¢vÀçe™F^WŽÚbÀqÙƒWÞà€Ù ]S»xy ?aCèƒÀ÷'~ÛU—ï~‹So‡k~G‡KÎ:)(-Ë;0úT·wÄiC_BÕ‰ñÊ¡Î3€¹ã";½†À‘ RÉ/Ýþ-LÉuJEøI…l »!ðeø^$¢‘8&i¨É-¦´Ô´8ïh¥¨ó‰+H{Ìê ã «°r¥I«ÓˆWƒhÈCTœÐY©ÍMÝ™TJQ‰šÝÐÄ—jZ¦ÓÄßÒû ‰nJŠ*Í%ªë ér_ #öüÚç µ\ïˆÚ)å4Wð Ê1oÌã—¸j¸&Ð õc ÈÎO" /‹ú ‰¡ G‹a+¿ùu‰.¡ç7'ãÄ‘¢Ëû’ÔÂÕ—}™‡ÔöR€¤M£~9æã]ÒªÂnoQzHÛž.¢hVoÕm3*9"êFŒˆqz8Žmʈ©ÎÆ.›ëÎNi•Šë1ñçŠü©6%e¸c/Vºd¢Q¹ð…€Ù|2Ü…‚O‹|Áh/:ÄŽ›’’Õž›9«Z4¥XÝÞxŸžÅé ³¥ ÑVË÷ ˆýè32L7dß…ºSrÝì1Ǻ“µº(46Z /ÎsT¢£6¢Sô;†ê=I•ËüÌ\.¸Aàú‰åÄÉÌt_á‰qvÒþÛºP¥î¡‚‹´š»1i’56ÿWxË>`\§´PMߤáÇžg‹óÚ„G©ûh¿ÓyÆû™Dw˜^‰i“DáÆ}fcBžgœ0¶¼(a ¾,|^ƒÆ“ø ýj‡iy$øtˇlÿøÎ¼îšÜù)-Kǵn Å•V.»¿…€ÏRõ‰†3ÑF¡0¼zh›õäðn——øbRõ¾0L¾ \8M³7÷&Þ(ÀMÃȶmðÌR–m…§ã›É}û`©‘¸ „žåy]½&tÝL<€DóXÇM&ÓxIi:!a²WßëÓÓDTð$oPÕèQ÷‚X^ ±ÈóbšlI\/˜:¦Ò¸’cÚÁnýªiÁl¨Í¦&ìNßD¶ë?"ýÖW,¤ &ä–æÙf©Ð­ky«‡õ¶R„¿¾<±K7§°ÌÆ¿ÑûYlKù…‚KCË Çñ—å›ëEÀ*L]<‘ÌÌ¼ÓæÙ·Çµ&ETÿ0dŒ³žÓ‚"›š|Â…f€ ƒ¥9¹FMºÏˆJ¡3|ÝpÀÁÛmFŽDwíü/ÁL¿˜„lZ‰&ç\ ¬®s†ý¸„H<¾1#šùÿ›ÆãGÑI5Õ"=äŽåÅŒT}ïøæê€ÞÃ2O‰¶Ð]¤ÐþV¹Ê0ÒãåÄrNôdF—KoÖžŸž¦X¿Ô€²§…¾—&„^0 Ê)ý›hTn»‰PƒÍ‹nòЭ;¥b!i'°È“ÃÀSß`ú{ÉШ¿uaÝÒvâÑZér+Z3D–5­º·@ß ;$ÚËç½Ñ3ÒÌb%[‡qÎ<óµü„ý¿BJæHÍhÖêùW¿hh={îûú5oðá‰7„‹æ×t÷tgxç=ÿú endstream endobj 457 0 obj << /Length 1164 /Filter /FlateDecode >> stream xÚV]oÛ6}ϯ:`±‹#õi·èÃ6¬E‡bÁ† }è „–(‹«$ª¢/úß{%’2©Èi¢dòððÞsÏ%ñ0üo‡½4 Ñ.ÚzY}…ǯÝÁSƒ¿Þ^=χ‰¾5ó—Û«ŸÞıG0Úáñn ê6÷>®~-iÛ³ní‡a¸Š^®ý(ŠW77oß«/oxÅôh½ W¢«i/×~%A´ŠÓõ§Û߯~»ÄAðL¦ÃÌÇT›*‰CD’ÐKRø¶ßÏùÚ'8Æ+Œ¶@6 âÕk@‹W9/Š£d~ÇŠŠe=úž V<ã¬éÑÀö÷ ÇD!êuj2Ú©'ѯ‘zº[ÜJt ‘àá «—ü\ßi&ww²¤9o ‘=múëkõ^‹œmÔ°/õ&òØ4coŸK‹ ËÕˉ÷å h:P##°oø q ­ Âã›e˲cE;õöìh+Tw1™?ÆÌ.î3ı䇲‚ÿ~d>OÂ,­²ä o˜”5ˆa§ñ2<û¯ p~¥^áûéŸîiud:~¯r±#( ãÅŒCŽ»Ö,ž(KEÒ7 ÇPë…{š}vU˜êg¬žØQá0ÝUqfП„/ynô U$¿'Öw… + tù$F#²‚³*7SÀ5ê!À„vQ±‹|Íêálš3ÐW#¡YQç0‹I7çè¯5-^·«!±&û‡y…‰¢?ÑŽMÉËY§N›ü‰M ¤;w¦ 7E1¸éøãƒìY­©Jž•æHm+ºÞ¸é—³Ÿ† Ún/ÚF(Š¥F`‡ÐÐà“óŠ«?—ì3ˆÄ¡¥!JƒÈá>ÓǨP`m{›Üù¦eÓaÐe× U[R]h£sÉY¸¢¥ï^9¢~­u´‘-„±éÏÏ›{.ù¾bCÁo³x=A~9*-\ˆ\ÑÚmÝÐüTÜ`E +¢0BA¸Â:4–Ë–&$gòÙƒkË9—øçKÕ¯¡Y~`º&TØœsb×+¨85úQ¬¶ëJëÕ¶—fèÚ•Uvxþ°wX*O]r¾BÒ¶®/:e)~ ásËäë£4…ñ¿ÛÁß;?í°1 º#´zÏG­ŒÜQ¨ ÓzÚ‡šfOj_"×±¶‚c*¿v»ÅÝÝ߯œESÍ=¤U%Ns0Îß뼪Ž`¤´g3T±ÿb,•âèÇí•¶-£ GpH¸X\¶¯pGG’ÎÑ_L>ððø@—ƒ™^ž¬æ“Á@4uaÂH«ŽÑÜ”K3wåŒ5g‹·“¤wùCœœ®²uî!¦iH:tû/ÝR´O ”¡¥i+Ï ³)ÕA]dÖ®¸*»X'8§8í-[!¹bm#âGýß5 ÷¼|xûv3Ü(­iŸTÏ'Š£h1_æqÓPŠZ â8Ý.E—•è²ô>L×ÎB;3ÎD­îVŽqãÍ:ß8jÎê$Ú j=Õ\щú Äœw¶:†æB6xƒâ¡³˜~¦ÐdÃçºØda$H𔛟"î,®Ssú²q! endstream endobj 463 0 obj << /Length 2149 /Filter /FlateDecode >> stream xÚ­Ûnä¶õ}¿b°û`ÍÖRE‰I P -š-ŠÛnü” ZÙa­‘&"eÇöß{©ÛÈÞ<,òç~å°M lSÆ› ÐY±Œ._Z­Œj›mÈâ,bºé>Q6àÛÓw´­Õñdh)Ü÷ e$­G’–FÍØ2â[·•/Uâ,;FÛÁÆqÑY©ƒ’{ÚªÅU»nÛn¯a¤&&Œñ(ã|ÎÊÑû 4ø^5•“Òœä5Áºm´;oŸDçx‡?Ü®˜î'¤ŠüMœ/µ·B-*©¼Èr+æx77xÖ¤Õ½<©f¿ #Ÿeê?Ã×”þw«µº÷2½õVKûùüÔ_­kg}~¬Û{QƒkXO=?÷²7÷­÷£ÝŸd]ߪ=ÊNK+ÿÒ‹>Y~Óe—E˜YQF;ÈS—2<* ™°éäæðæ?¯åF–Q™”ƒV»xÞ NSKíåAôµÓRèÛ´>@¦a;„hô‚O­}€±,ÿ’ÙAy£—r|Ÿµ‘çWœ†bzŸýQŽë<È›'ÙÉT,Ë|BE\.RtbȲ'¡«ªrÙFl’ —æ¤>¯ùbâBZút°Á¨š#íÎí^Ök2ù›é;'ÏïöFÊ£t—ίU5$¯SœŸ#G_MùEßÜ,AæÔ´èµ{ÊgbÝŸ/‘Q/ž5o¼ ûË¥~´sJ„gádTgq\u‰¨/'1Ò9 ý]Žçè€_äÞÓÑɦzûKüÛÕªÚúf—ÆñµéÀ?} Ñum®½„`]µ—•åÕ…5›u§ñ3k}w>ü°öè[sß²±Þ¼wŠ\t‡™Ùx’kõˆ'ÑŽ¥ž&QgVÊkÏË%)Ir@Î71?¯ =6Ýyœ“ç‰â–Ï äË]ëù ÚÞ¸rh(¦ÃZ¯s êiA³Á‰æq´ŒÏŒ“·óÁÛ!½`Á¸bHV‚%Ù^üßž•׃4Ò œ¶ÀW8l2Ê÷Û”Øb0¡då³ÄЦ¡¼‹h\‡çg ï/Jgà0`åï¿@U¤šÖ"Îð áÛ.¶•Ž€Ö(O ¡\·]jið€É»ƒ&õ°²:cÞRZãSÎR¡Ï\ÈëBì%öBU6 Ø ·&ˆ°A¹2 ÌÉe½§›¶@X°wvîmχµCƒ¹¥•«©°‚éXtf(ò0i(Û¨`5ºÒ6ºûfun7®/Päc`¯˜”6W$r2Ltx›A-¨i;æhñæYœwip·-!XÜ$ƒã;° ¾.VbE‚´ô?\}okyCc9j ¾IÒ¸æ‰Àšn çhtê A&O$g¤=a[Of{¶ Cß«LÝý™0ÛÆ¯¨¯ÎGWðû+D³_µâÉiùÉJü…Ü>¯Ñ€Ò½Ed˜óŨ³[á\i!öW \=u £:B›–~tEláÍê:;¬tëé(­i¼È3kîq¾"ú'–ó+aDÃ+®zMnàiàïÛ'fH}]403 dì×5g>>¨ì)> ±Ãæ;ЇŠ5€ÑÓømçÉ#XŸçÁ€Â•ô¤HÀ¼žÌ^¸Ý·Í¡å$F€Š’PV'{ÞÁ¤>Æ€­Ǧ¥ù}fäùb'LüÚÊ?Òr›3Å9¨˜ó2øæÕŸ"xœØ‘‰Çi ]¨UÊÖŠ=A…¦[0¾ZÙÇGL^Àýu5 6]_<ìûWÊåoÐiÁ"xôåe”Ä©}ÂFœ@zÃ?¨æøsô2ý]Úa‡#úÊès”ÞØRZ'½-1iôã7WMWÿ|ë…þul. endstream endobj 470 0 obj << /Length 2436 /Filter /FlateDecode >> stream xÚíYÝã6ß¿"èK`¬Z–äÙö€îÝuÑâ€âÚúÐöAã(ß:¶×v&;Wô?êÓ¶¢Ìî´}< 0–eŠ")òGRÁ›þð¦L69!¨¤Å¦:¾JÔìð°Ñƒ޾†.ÂxAùæîÕß0¶Á *“oîöKVw»ÍÏÑß¼ŸÄ° !½ÝÆ”²èûïßþKÏ|S7ÂŒ¶‰ºáȧq§4KiÄÊí¯wß½ú瀥éJRÄ`%%üéy=³”]®ý¸ðYA&T ßó)]¢0_œf(¡©[ð¼á,u¼ à3URü’0ŒÀp„Eo†Zü’`ö´-ht¢á$êZ#c?tÛ´ˆëõ ×I|˜Nƒ¡ª·8:nc݈䟌BN _IB2Tr¥äKln×_¨Ñ¥Úþ6JíƒÆ7E)%À[QœÚ´mÅNÓ®¹R°e†-qb—#ÆrKñs}›üj̪Î>À5cˆ©]sUÈô ¹rxLQžæŸèe–ú#^æ3u^v#·ßÄ45l0A˜éÏçC]Iï:HŸ)¢zÔϪkGð·”SïS'ŸyÔÔ¶úÉõc|âÃüI/[…@Q¢b>åœ7“”.dj‚QYRKÜ󅆹YÏ«•y4ÌÄÀÛ3L‚bÐ83ËùËÐæ ¬TXŠ¯ÌžAf%„ù(¯Üã…•+’°€1MRT$Ôœ~ o˜â™&ˆÒìe:/‰N,É¢»ÃVb‰´6#šØ41 Mðxؾeèêc=Õ’XHíYëé Ù .˜GæíQŽÅà¦ß'þð 6ßéwµ. $É1¢ùD3D2ÏÌ3¢æbV¹kW·|£´FF£o÷ò³E_ »íƒžQÁ EËﱓzBîÓ® Ÿy´`10°Ós=l‘ÃSݵz¦Ûk&fYˤ LEs² cµ5dÛž“ŠYœZin¹ÄYÇ9|Ûë‚yµ±û—Uvæó½Ô:ú¨&¤öŒ)©4[†(@»Úýî ¤€4ÅJù”æ¯Nà ´Í“:õ©íôSšCúOþ3*ýišDûn0œZàZO¼­ k)©ZLJi9“H§“¯ÎRòeœ†S%__Ã{Æ¢ÚÐJ=Caçôšjù…R”Ìå‚wʯŸÎ[í.ÚçkGi@(ÐPV¨%ƒÅ>û^¹šœuM€Ô“þ:žú¾áÚŽ£[oOú¥•ýÎWä:ôªežªxl²€}í÷ \àx w¼`»ûršÉ âüþ4ÍŠ Œ =&f `B”ÁÐa~eÜwèšQot>­)-S«©ù¤rœF±ƒg¹:èA|>jò|­Óú§_‰øF¯a/+ÕÖÆ†™my3Y{ìòP)®ÁOÅ?!kÁ˜(åXQêT¬±Úý2@‰rê2’Õrª$BW˜ÏÒ®ø=Ì3)ØŒ‰˜Šfg°b®_”6`Þv©‡SËbKä#‚Ÿ0VüDRrÔ[À ^7 õôr{*Ïì6ì2P'dk€©~„ÃÀ,g2û`À—(î†Ø ÇË©)@5i'‡LÁ<ø‡¬/Žu+]Š¥Lã¡o•-ä‹DõÕš|©:—# Õi’Õ“ÇÈ”&r˜ „QÆR9QñÔË¡TøÆãµ{~j¦›+p+ZÝ‚Vý &]¥ºíŒÒÇnwj:MŠ ³Ñ¼/¨šøjžÇ(e7‰.-ݤ?ÇÛÝü1F¹ùj>6±ŠØË˜VÚu!Î#Ô€zÔw —U0p ª@DæÌg›ÚÓ±Û¹×˃­iE­1g¹ð¾³­;Œ±Ç:¾8’FŒÎ³¸: J`ô~ŸœiÜì°r±s\Yq’k뱇D^?пɲ hPIbvÖE†Zñ›~|¹˜’,ê}]q™4þ¶ðqÙf@¥k C‰_Þfšõñ‚A¨Íô¶YupÙ³ܾ¾Ò¿AkÎf0®CÌ ‘ô˜Ê?¯ô˜hX`¿Çüë$\_©0”®MÿLƒ©‰/ì¼–ÍcéÚK­ôïV‚÷³ 4E¼Šâ‘’X! Ä+hÆ›Alö¯þÚNÖ)ø&MriiµÝÊùž<4äPèñ&êT+Ç&+Mþ(Öð—š'Y‡5 ![ÑŒ·ae3ÈÏ4ap0ÙZYHàÔ3ºRŒò¤Ø’¢›¬‡W{ÞT¢Ÿm[ûõoÅG±”R¹Rž,mæá´‰°s芆"2ßÐØÄû¼»û¬X^t©š•‡Û͵O; › ô›S%Úêi­¥¹ª¹5°Ä(Ê[kã*ÌC=ú™k{1B9îÚ¬jøÈ›“¸bZ½Êë,!`?Jî}cª®ËúÈOƒ¾×Ñ=Accêì*àiå¹^“a};öùxÁÄ@¨¦LõÚ½þAC“ÃVÖò—j*–šT¡Â‚ÒwŠPwçŽÈÕâ[ix?v „¢ß¢Ìáú‚Áäª;ö`÷ûº©§§›g{pN1˜ó9sÏÙlu~ºpŸVœõ@ÿ‚6c›Z_¿©—@š¤Ð{•y±Á…rëå¿ Ùõñ‚A MúÛ,“Ðúlþdš\3óÒdÀ{R¢Œß£¬À|ß‘ Jå²§5J}B*ÎRT–¥—ŠÿB+,Ï7…â°HK'ãó¹ØRÇ ò€Ú>SsédÊ™\f¦ÓÞÅ®«NGѺÔ6§±ñК]PÛnÿÜ ïÜ]FwzÖ0‰Wê†ÓÖî‹Àø ZϹ €Ÿx=_ظ3àån]–àtwBLš*×Iúq¥€œán8߉§³º^´ÊîVf–ÚæZÛgS?¦ÖÝÔ­º›”ðÿ:$llœ( §¡\™£4wþY›…Be„½yN•N{¨4\:•‡ð™Úí³ù(dóZ;”ÙkåOWkžfþ™2Ç„Ñÿ}ß29 endstream endobj 479 0 obj << /Length 1365 /Filter /FlateDecode >> stream xÚ­WYÛ6~ß_aä¥6`):}$èC¶¨])ì4´DIl$JÐa¯÷×—"9:)»(ŠV2EÎ|3óÍAsf°?s¶5fkÛÖ·Îfæ%_ÍÙxyÚ?˜rŸÆ6jLJ·;×™†¾5¶æìtEýÙ÷ùoÊJœ/4Û¶çλ…æ8îüóçý'±²#1–o‹=Oó•ÅB³œ•åÌWÆâÇñãÃïÇ€kYÿi½s uÕ…jÚ†n¹ÎlµqtÓvÞg|Æ9ŠL€;' ±x 8Pþ ë(—«èŒHŒN1~/~—Ñè`yÍä[R¥x;áÚDY3mÝtB}â¡ûrÏu 2Fp<ÀñâE(Gs´Ä•“0(Jð;®Õ4u‡Ù/T›B·že‰‘‹g½¢S¬…¯ Í4\cn9Ú‰HD¶æ¥1lëøPñüòåÏ®{Ö7„P!ì@Ø´Â] ¹* ûi B’:¶2‚P¯õ!,Åá‘e»mµ Ÿ÷‡.<•J° š¦Û7¤u~<ìv÷Ä…¤–fkw¾?Œvk=.ˆ#;PUF¤¾¡²Ê—©x^Òü§4µHù1ËSˆ¤P¾Ÿ/Mh Cœ&g‚/¿H1F¹I¨Œ¦iüÊòGÆ%hÂõ­M…Bôð•d£3uxÕ‡¤¦:LešÑ¤¡”<)âwó,‹ ;šŽòXõO6²VºmÈó¹ Ib£8‹P›é]ꃫ,‹ öe¼€@ãø4…£@Ò‚¼*©…ŠÉZÃèõ¡·»µÑ-¾ÆÀ’jzú{P_ÎÄÎH°)00ˆñ i8tA×>1‹ {$€Eü©«0ÀG%Òe^b<ì9æf­»Öjæ8kÝa]¥î;ºË¾éÆ–ý3-Þ€ú+ÝN絎ÞVN¯ Ôpd‘ÊuŽn9“ÍwTÔÇ¡¬Wð}™®©»Ž [‰JØVß®aÃw®KH0Q†B7Ì gþ„]ßÛ[[w¶NÏ÷Ó=v<ÝG7*ê£@ן4kíè«í ëK!F*Ó]×\ô«˜µjY7´4×ä+£%õÇË>f­i²ldç—ìÒË µ€ÅSùDz÷ó Íå*'r˜à|˜úoä~9bÔ}ýLAŒè0ë;}¨úDKd:«ŸÁyt*0…óÍLÓõAÂ,&4lLâ’1ýJÊJ†Ór Ÿ1Uq¹¼ååŽ]±Â{L¨¤¸(–*CúPƒjm8©0f?¤ H:Qƒã(Ýñ§æRa*ÿP@#(/rBÞÏ0O+êw3v‚ 7QŠ”8ŽûFƦÙó{C¿=õJ:RöT•WAÕ×hÌò{)e,ïZÒPà©( Öа/o—)a²1o*("´¹Œ’¥%$gLaî´a|„¯²G*bÈÒ¸½‘4“ ÿ”`ŸðX¯œQ\áây\NN ÿ%úBÅøö‘¿3* T6Ï1+@åRX3 7y䪛i4E¡ºÀtøÁAþjðš ¼FIv«päšµ\ðϧºœ±B*”~šJß ·úÆÎŸRD­ê1\”1—Ëø_o&¦2¹¼”%¢¥VDÈǾ>=*w 7øIÈ݋ǣx|˜ìÌÏœzÜ"K¸Ãø–d)eé˜-™}iøþ$Wöòù¸dݘgSTAËRÆ$•Á´JNÍ%ŸÖ××ü6ª9¢PË ]‡ SÅŒ´® ¤{s‹y5»áë’i.껵?™m)ÕØ#'/0éýã7 endstream endobj 485 0 obj << /Length 2216 /Filter /FlateDecode >> stream xÚÅXݓ۶÷_¡™<„ʈ A‚_vóp¾Ø©ÛXn|çδŠ(Šº£-‘*HÞéþûîb~ä»q¦éhF@p±Ÿ¿Ý›¹ðc³ÄE¾ï$<že‡®\73|üåSûlØhv¾¾~ñãÛ ˜1×I܄ͮwCR×ÛÙʺ¼MM.æ¶ïû9·9¬~ù•VÞû\æ±oUâ6õÜöxèq+dóõõß^¼¹î<âÎǬ†CV™ï:^ÀgaÌæsâ÷Íé˜gÈBàVJ}Q74ªvôd!=Ëö°ÉE½Po…z–ùx{s«`¤6ݧõx—È"¯ó²)ʱ™ï°€8SÌ4"-ëTTQ•´ö»¸/ix›–Û}^¦‡|ÌÓ_è±+è%|ÁœÑ!ŒN¹Ö¬ò? ŒEq¢q¡•u<î‹|«>ªÔ3?5­P$³ªÛ¢L›4f8»('êeÔU*-p;«GPt©,#ª{Üù´Ð¨—zÑ,ÜCïí¾)¬‚L•ݱ°ÏwÍc’c¢Ú¶™ÚQæ÷$pöý¢ù^òeÐÅým‘Ý*‘³¦M÷û¥îr›Ÿ&œ(-Kƒþø6‚€äŽ!„^nsòrÛgãQçŽ_†žõan3k3·aø¡:(q4O¸Ê޶ï¸BHxöB'N’ŽªÃˆîoH÷ÓœY8ø/‰bVí÷pô$œ£VñùŸ6ÝŠbé^6FTPä„:P¥£"pd@Ê‹¬»¹[y‰ÿH=ÝÓÛºýÝeá 'ÜÚU ˆRuÀ@S8té€ß>]ülâ$x wu®!¬¨Md½ö‡z¿ƒ‚ÉÆ [¿Mú„í¹±G`<;¾M$ïÏæVý@¢§§¯ñ>àú‘"§zu¹^-×+¾–Û <Ó²+a«a÷ú~ý× Ö¾#·û{®|ò¼[ù‡;5ÙÀ§ïrÑ ïJºONLŠ}Ç‹: )6øKú¢)2b;u¥ÁpibÒÖT‡ñÿ‡Yˆî8ŽÉèöÈ #û²°'Ýb.“/èä¨pœÜ£­Qérf¶5c¡%ZWc+X‰"'a\oÝ™H‚Dqüˆ¤ô Iîð # @é{.[.¤|1á PUÈÎLb' º3/Mç$C® ÿ£­6-ÆàÚ^ä-9ãì„nåGâo‘LáŒiCëyš¡QniFhDžB_eûv«iV¢& ȯ\,g÷jG(ƒ€`%ƒ’ž$à#úÜ«?FV x0¥‚‰špaCTo0×âü¾hn AdÕ‚K’áIæ7ÚÛÌnơĚ ! Ò¸ÔCn-«ƒ1Á n¸ÔCßZöÃËå9÷rLJbJÝ´¨•8¶JÈ8Ucâ—s'ö:Y^ž‹`»Ogã! žÖ9N}Hǡߧ U{ÈÅIüdþ‰ Zžv÷Øí’Ô9¾&¤d\‚ò —T2›<ª¶~5; ¤ãDXÀÒ,Ñ¥â¨ÿŠ” ?»—PµU)Ì0ðÆ.ù¹ÅŠÍ«R2·°žƒ sS€åöEƒ$Æ.êËfâ#` zp…¥I“ R;¡’(Êi¤OsÀž/’ÈMz8Å´øLKú&›Š`¡6KÍ´üWÁ$èÆ î¿U{¬‡k¨®VÐ[ fd^4 j‘á b›û1¡H„(ÒQ"5v2´x’ ИL\ÖÆPõK)À »ÖUžÓK jØüOTF(˜ ؘ*ƒ÷µ•$ÅTz‚/ª ÖzÖgBÊ#ËGXÏËm­jˆ¬ØÕÎ& B¸â±Š¨GeogëT¹Å¾ªs{#ÒLY Q+AY u«—‘aÔlERtš[ªraAä;ÈDeÖSP‘ç ñR²¬t¾o˜LÞvaNÀNâ¢YôúÝòâ£1Cî„}¥ØUw\FÉ”éI÷ĵ4Ërh­·¯pI Oºe4ëC>óÝÚ.;f'€wPæÂódë<^öÐú{{@ÀÐòO‘Ü_uE>° ýµ÷«×Ða(õb­ä-Çô&§M?…'ãzñH”óÍ¿ÞýãS¢ªò¶9¤UôrxÜU´¦)UHsÝa13™=á a NH¢Ât›6)$r´úc!4Q;|ÏÄI¢ý9¿A”Á…›âŽ6R0ÃÀˆICnêŽâøãAd¼2´Â»1ŠRe ¥¨Ñ ÝV. ª4xWFhiTÇTÐL.T˜ ‘–7:tû¤*ºHitÇsquùNÊ÷®Ëà@ÎùÞÔ½©êyß#X½¹ú«êHÈ \´ûì%°Íf– Me ë’5Øs¡ òWÚRÿOjKßçÿƒ¶$¼ýƶ4þÃm)>°2‚ÔÕ§µj0þ=ƪ]¯îÖ«r-å—Ýܹ.tšSV¦®/p"¯o¶ÅÁ¨#‡z×znÇIîÕ1Õ÷<ðy^Ö`Þ…¾’÷xú~©»ºQ7HeoÃI+ª´=bÙªæõÎØEPZz“Žø=SŽnD±ð(-0 c©€a gb ’Ø ‡^̉n°ç‡sêî*[³$E,îÜ\÷ò }ëÕ5õ2ʾþ˜gŮЅ&œ˜EcÝ)}lº»³¢)0qòå©Û ›… qb¼Ä0]®L«|·ýÉ]Üýäê;¾é!¸W’ %~.a¶ ¢t Ñ].LÈûßBúé`9ïüØšA£“sl³M×-Ïbpt™{FôñÍß%>ˆÏº‹]p#Nag.„žscöL½ãwUg"ob»'Õ+C-þª÷¬¨Þ7ˆjº ò\r’éæÕ x‡“¾þÙ9ÃEÐóŽ·¯æ67äA^Ÿ…eOÙqÓ]ŸÁ “nÈ0ÃøDët=•B'aM_ò´|©kíÿc/í. endstream endobj 492 0 obj << /Length 2325 /Filter /FlateDecode >> stream xÚåÙrÛÈñÝ_ÁÊË‚)a‚9pÙO+Ç»ÙT"W­˜”½^W&!PpPâæçÓ=Ý’h­‡¤T% ==}C¹ðàO.boj-b-Ö»ž…V× Züøý Éx. ºÌóÕ‹?|çû 鉨‹åbu5$µÚ,>8¯³ä¦I«¥«µvÌË¥kŒï¼}ûý_ò]¾MyµŒ´SV»¤©—®22N –W~ñfÕ3à+u"§ˆù4«Ad„Ô†XýžHÁI OE‹ð7FQñE¨ÂãOƱó&Y/Uèd𪕳ÇuZ5é½çÅzÛnÒß´“ÐC»ërw¢‡NY¤niö5m•Z}“¬yy“TÉ.劥å¬2þð³'MU7ôÒ,UäÜâ¿Ù_˜HDF/\©…ô‰k>8âƒ#M =é$xªö€…,%H[·ÉvNOR¡¤ìq9§ªXxp$c$ÅfŽŽòDô_=I¦Wr×k¤&¶¯ÊŠ>4YÒÐjòºtª%Àíêî|“ %@²^â¼² ‚¦P•gXe’έ³²ÝnÈu?Yå±פÊt£RFI#mœ_ÓªDÖE4#¡½øD|ý ÄÓIhr@äâgÏ÷ê”þ;|Ì×iÍÌ’@%°AÒÖ£ïjò]×î}"ôu¹-+8¡~¦Ä_Hâ¼Û®ÑØÛV,€é¨ÛêÊÆÂÑ–^‰ÔºùMrüt²o¯ð؈CáD¢Èau×y“—E‡âûN²mÓúŒpÊb{˜Pû‰Pçí9yMßoª´æ$„Á¡cç!`ØZŒ÷ü±w/­pŒ”»¼iÒ 2Þb,ÔíÎFhœ¦¤gú¯Ö*¾¯Û¥uF tØölÏn¢_÷Õ&/’&%¬ši½£G•×ÖÎðéª*wõ,»Þ˜S!°0öœ‹Ö•xЙÿ==˜€Fö1Ú²§-ôå6K+v¥‹–Ý¬à ­Ïš&l?i¤/ªƒ4æ¼c ˜±˜ u 6“‰îu;0ðXS½.m@a9×RDÂD½™Û×Ò3Cwè¦ ¾#Kàsš¾Ð•Hç̶Cb貺EÍ.“¥É¦»háöRcÔaŸ^£®ç|%Š…ñý'ªfÅ/ºßO˯„ù_?ÓuÜáœÄ™ö½šügˆ€ÖemA]û#u­l`£`ŽÓ@ ªÏi~?GÆ)n^ÞXqpl¨´bãŒ>z£>YÙ‰O+0ÉQíhu͹”1>áËa‚M€—A¡Deð÷>F’ª?†î5d BêaõÚ»;6?p~éZ!Ðlª\¤œ­r¶ÍíòxóQ$;6T:ÍeáqrÕ=ó]3wì(W7Ÿ\ÙäÇ"ƒž>”Ž=~ì5 @—A«¢6ùõ¯ñä+ßä ¦=%@íjèƒJŠH÷Üp|«&ÁÉ]Aæ‹´Pá8‡ërʺœ².§¬Ë¯Ïº|œu<öþxKçëÈxÞWãpž’‘ºæê¦W)ð²@¼íÛYŠ 9n<¬SŸÿpñíïçh>´D}:º²éª¾²•Ð@ûŸ¬×é 4ðPS}©œKºNÞ®kOÛ¤ª 32 4Þ° ¾AŸÿ¤²WícÈðνÛïÌÜ»O¡ c.l‡,æ#®?œçERNb}Ääáý÷uJp_OE11ØDë‘(ÿXÐa?Áø”(—o7òèòFi {¿„”j/58']ÍUcpyB-ŽO©Åê‰Ú ¿o~û~A+÷SÞôw¦ØƒÙÞáÕd..鮼ê®HÇâÍÓÝEOw­úèå l;2O!?.Nñ1k j°ÐX”s~þv à»—x‰çC£¸»±óTh/_àKÙꤜr ÿîÒzNzÌ20Fu?ý¬2Û/*ítÏ„\³ôÖ«p"³eÌ-á0ßw~á‰û%M-VhÄJ¨ÛgªjDµ»rÇãì!,6UÒ.G60ÏÙÉöÀÕ®r¹d*EC^Ô‡€-0qöEx ÏBÓ P¾Ðê•Øÿªa¥¼{ !þ¶4¸+'Á(÷ö1ã]ȱ’»—³õØZŽ6€ñßÍåæq©¸›#6à>xçÈ(5 »Ã—!óësɸОÆq<6Ï ²É/#›ü2²ud&0¢1rhܲ:Í Ìÿ•ŒÉÜ>Û™ bÚÿq¦ß¨¢|Ç Øø3N‰ Å:‹ôù endstream endobj 497 0 obj << /Length 2000 /Filter /FlateDecode >> stream xÚíZ[oÛ6~ï¯0ЇÊkÄ’"©KÑhz 0 éÐx@±´K‰µÙ’!ËNÒýùCR’%ÓÒfíÆ<ðvtxø+é°…?6Šè(àœD"M¨š-¯Fºóþä3t.º[”Ç“GÏÞJ9b”D4b£Éå6«I2:w^Íâe•–c—sîˆçcWé¼{wò‹žy›ÍSÓ‡Ü)ÊE\­Æ®'|O8>šüüèͤ@zÞ@I‘rWT[TÆ)ñ¤ù¡ Œ -o~|üînûìm@·©áäŒ&5Ùi’-4U—§Ÿû@¬¨Aéé†Ûغæ Íœéïnl¬% ¼ æ|N?Ù¸yvk¢Û‡aóùaØ\b£"„X±Š`%ï{¬ØÃ`Å+ÖǪë‡.c>Ø>‚%‰gœ±(­6+ g:q§°Õ ôgÉÃØÝÿÎdw&æAø XW¡ßóÿ¦S IdØu¶É,-1zÔÉVØ2'/ô¼pìÎ=ºÈò¸¼ÕýK•) ¦SŠl¢±|J6^(lEÄóxM±€m½ÐI²ËÛ1´*kÃ^³Øˆ•d)ã mŽË•^]Œ]æ¤qžåcæ\Õ”éR±Jó$˯4a‘£àéÌ#!lÚ±» Žàz\À‹4_e@¬†Å¥n›õ Å·XÆ[S(ÓÍs+~H"8w Dܺ`pFX£íœiUoW=1„n¦ÅB´È (ê¹+÷F#ZeÓÔp]Ä©9ƒ ¥„‰^n[s0'Ɔ:ÂmЉçz¥‡‹£‘œ° )}ç·âd Ѱa(ƒ;¬#XM V[N‹üÏu>­”ŽP¬ë¬šÙvˆF^ýy~ç[™5:ÙŸ—xXÓœ¾nRRg+Ò¡äí^ê,ZÉJ<òH x'ÅžÑ#t6n«G˜YSŸ¢wˆ4ѳˆVçC\œ›þ,F.›Fý kÔ1ØH–#}!Ë>µqê„'¶'D ,{>À18ÙZ!ÁÛíÒêù²,OÒcÜ<$"è¹<ÈHÇÿª ·(]Ý;õéøÍï/lAšÁ¶R4¶}º¶âΈhsõÑF@ÓòÙìå#ðiö:Mð9ÿŽ­µµ\È®òØf}÷6ØØO6ñD)em”ç‰îl ”(SÄÕa dÈ~ùaîmËb~›‹ ÇIzU¦è‡8@SĶŒó+³#Ä·ÎÇ_­¤›CZ‡™þ>T+ímêÆb›1; -„{^”$U7{Gì»}n€çì=¶ë Ù=®ôÀXó|J÷€.¨¾†ÛÊoPG´û ºGlú-¸ ðøñRƒFûK»Fôã°}¼Ðê‡qûÖp}61#½©Öuú.[5•—‰ßPaq“&ÝÊc+hÛãÊY?`€(ðÝDëÕL1‰WÁ/¨ÚÇåWèZ¶[Yßs:Zã·L_ÝM…å´îÃË€£>ƒ/„œöéxPñVkA„Ù+®©ÓŒå¶Z»ûµüG8UHÕíÇæSÂŇ|#©¶2u[¹PB¶Š„÷º91u–©¢jGœåÊ^Å×¥i¿Xèe^—`ßêÂïOŽ_îºk;;¤&¾_ÔêüfÔb@©v/PÎõ%ÖÝjãû[Ûîo;àšœ†ýßvð¥Q0n~±YéA™.KXÑOdz Ìj®/ä†ëslë÷0ì7ïa8hžuR|¤¼ý¤¹¡ãDÀëOl}CŒ7Z­Ôú1h˲Ì{q¼GãSýä)ôß½X«ÙírRÿÿÆ?A ( endstream endobj 502 0 obj << /Length 2571 /Filter /FlateDecode >> stream xÚµkoÜÆñ»Åý`ªÑm¸/.i¤j×J]v[ ùPE0¨;žÄøD*äùõÙÙåKKÝ¥HaÈ·ÙÙÙyÏ/bøÇY¼0R²L¥‹Õí«Ø®6× üû‡WÜÁ-p9€|{þêÛ3­}úáGZ9+·…¤2ª›Û|מ,…J„ŠuryþWïÏ;´GRŠH层]µHRŸTDïù¥'ŽnŠ|MtÇÑבFÅÓþÔÍÚä@¨Y´óG6@~‹$ÃMÉè¦$e&1@™½ãâóùåÛ·ÿt#š”dIšzÀº b“L Ý!{wùöý¾#@Å,Î<ÜÇ}gJw¸¾¢±0ªÃsÿáYÏâé`¾¿ø¬ ñI–%ÜÃý븓Âë^‘°4ÂÁB©™ˆ^®¼²T.–*6ÌdÉb ÌçÚÃ.’,–ùÇ]#£¼±´«¨ªw´r—7nTohkwsÂ#6ÑGfiLO ¨Yª³^™CÌ,åó>Ÿ‡È4ÊtŠx×?Ç\=ÂõIÕU«J˜îE2£ßÜ•NŸIgÔ\à°Ã÷%L¦àLľ´{ 2y™JÅŒé€åìï« ‚)&9!´¬Öå*ßhøI "ÉwtW‘¯P74»ËwÃiY­¶û5ÊÀIìÒ)!S&xêtŠ;NçeÓŽ%oÒu¾+AþÕõò¼#°¬¬ð†Óâq·oŠe{—¯œ;]Õ×¬Ë )>u8+§BÀV74PoO6Uávˆé]œtO3*#©''z¤Þ Ùñþ]ˆíã½tZÇ“9y‚žöNîyÐy6”#`ÎégUoë¦XÓ¤“!2Ž{!–Õ5m[)ÚQ[ìË,··\Õ·NRUáDe…ÎEÆ´ác¡{ Ä+´ Â0*ji]]Cž€Gk}Ôêº)ŠÊ¯`y»/Ü }˜E“oïnr8Ïi WXŒV¶¸ÐäյƌqwÜjLGÙÐ@ 4‡ Ps˜c6²û€–tiì!R¦: pþwŠ ¬~`Ä]DÒ“(™©¡ýféPÑSmÅ?-°Ý&!©ŠÖåu¹£edþ’êÃÀ±Á8c‰CI®{×iÎëÖ-wLToŸªú¶Ì·´¸.PbÝUV7’ âõÄt–·'‹´ÒÄù=ý¬Ë¦Xíʺ¢iS´¤A¸xoÃ*Ê4⠬ㅳžNæK| 2ŽFX¥ÝßâÿWDECÖ4šØÔ* ËmøHfCG SzOÞ™¯cÇ Ø±WîÛÍÜÝc äŒTœIÞ#öGºóVë¥\þÍ=+ˆU„ 1±qF/5ÆB¼©oëë¢*ê}KB·ÎÜLœ¹òñN”Þ¿79ê‚U²¡·.Z¢T3ŽÅ>¶3fxÒùe/t Âç/BŠèª\íá&ÏÀ@´e9ˆƒ{$DZ®ì«Ð‹´u8v–>”^ŒèüËL†‹A¼>ãEÂÒ,})Ê0š!Jrjü Q<Sõ…œ‚Ì8‚•i&g%Ïž%SÙXĵ†÷„üOËh±Bš©SÐÒí¶Æ•šSø©+˜Tx\DïûÀ[;Æ)z¦l=Æœnj‹¦ôKtû³ƒÞ¶P<õ¾kÀ‰¿&k¹r϶iÐÝÐL0¦¶§; ƒ|êÅLjr …c»3w‘²'nN¯O¯Nóþ> ðóùÔ€›:1¦¶ÅÅpïÒÌôPKufñÍÁÂ…#ñž»ÌPf‡*FÅÒ>†y#=t¨´B¹ ì,oA›`ð e( Š­hгŽžÅ®‘ß´ç6ôû`Ý!S/¯QÒ4ÍÇwNï4(\fÆŠ7”|¹ëœ7Eº¦ö^9ÁÃô‡ä5ezïUdÛ¹CÁfƒ6LÉd¬@ˆ.> Ú.ðé‚.0¦Ìau W“zrj¥å †>£ œå¦e¦™0ʧ„ò)¡üÿM(?@(ÞŠ»ñ¨%@äiÀ—ÿž& ½0‘q|Ìãêó»žÂ32¹£© ØîRÉ@<¤‡ S cç/û\/ö¾—±¼ÙÙÑ#my ÊËŠ °8óiÝ—´T»©¢é¤¨2dqÆZ\Œ|-´}=€è2é«PF⬷ñØÅ>\ô±oÎØPáàŠÝø._ûRú*ßn[¢„îío(ÌŒ/FSÙuRWº§ê¥ÚOX–éu^§ó8ðua´×r\¦f‚ñYÆêÔ7Xh?ÜN±xl;¤X»C]ÆW®ÃaãèÃsí¦§øÌ ï³·Ôd_¿Ù"Öø~Ú°ˆµé@Su&?Ë<ûB¤¢ÏŠSjâÚ8'‡…¢Z;›ØÐʲÞ,Ñqm-2aý#î=àÕØM´Õ¢õÕ¶n‹«ÆÚ/ÎmrÛ¶ñd;@‰‰¾ÐBTAEó\ˆÖÑ/ #³¼lŠMÑÕªp©Ñت‰±Äޱ-ʤƒ“`ó9}B¢ÏNðo)Aðøá¨ ™dÃ’É÷IAÄ÷H…%@ß9–¤‘Áï.]üþtvìFÇ„ÓÞüù­¯Ðƒ-ÁRÕ¹Vo6A´†é¸®[òLÀ+ù8Î|~r‘òñÍÌ—£T'#EÃoQï./>^^¨Ë‹ê_¶ äU¢ôêïÎjqüµxzÀï_ÏŸ‹ÃÉĺ¼i g}÷Òe<îòÏMpÇ‹ªµ.œ¢-àï}ß<Àéø©¢Ú9˜ \”•ºê7¦´˜™ŒCÚÇŸºÃæ^ÏòÁäýúº˜ùØ3Ùq/qðDEíÜ·hI–TÇáÕM±úZ¬ƒ4zÄ &cGäc¸¯3`üE|Bç^쀞þ4¿…f)¹îDüÓD€uÛ–W^n”0ÏšÛ|ëª~HF’r¨º‚Êßz®võ> stream xÚÍYKÛ8¾çW›CäEÌ%R öéžY  Ó˜K6µMÛÚ–%C’û±¿~«X¥çÐýÈvÑ@›"KÅb=¾ª¢ä‡?¹HýE†"UÉb}xåÛÙz· Á×ËW’éV@¸Q~¸zõÓ…Ö é‹ÔOåâj;fuµY|ó>î³ckêå* CO½[®”ÒÞ—/—¿ÑÌE^-“ЫêCÖ6ËU ¢@y‘^~¿úç«OW½:ž))RþYÔh,ª”‰HQ¢„ I+„À-ºˆý1%œZ†Bj"º'’)3-â BKñÍÅdBñùS·ùÚ4N^Rh¥;Ò•üîb$" £ŽèáÿP¦ÿü¸LÉ˦òÁ®2^¬‚H„~@«¯—àڻȘ×̦¯]’H)”V½(·.d,dt4ÿ ]x³ÛNvûT•ôÛîsžÙ‚0$2+Ž$’Ïéöi ûßi¯3ž­4¨*y¿§½È­&”{lªwƒŠÌ=órÓYz±J4¼›Ì5²Š“ é…:+w††¾ûx2òEÉò&¿U¨RѪ?0¸œöÝÚ³–˜Ã7=ìSVè)¾ÉgX5~¿¿bUõ"PXWEU7G³vñ[I­€XOÍ·\È0¶Û½4JÝRÇ"ˆƒ´lóòÔ…ì1kZvο5ÉèÎÇàªá À\*ú5åfUmWE^šŸiæ=Ðຠ™éŠ~ÊÓáÚÔSˆ”“-Ê ¬ÜqoÌ6;í#ôyÙš©™Þãû7÷N8¶Ë!#g=‘6Ìñëå‡oï9n³¢7@B õ#‚¹¹o‹ J§yK¶ÀFè§8!ØÄnðåâ‚Í9©)"væü—/U •ÁƒöËì`èi 29Ü!V"H{wø›k‹‰SU× ­öþ ž¿’^Ûí„Ûöû@½åÚ Š"_½`+_ÏÚkÓ˜r$´eŒ6/̺ͫ’O[mé÷XdeVóª¾Ä«Š‡]Ov—·{Î>¤r0ߨGø…¦É¯ pmfiöYm64¾EîßbÙ™x­@ã”ù *¬Ýá8[±Ç,1<”õóf]ç PX24ÕK¼7›:œdê]íç«|‚È_ÛuãòOp "b}¬¼ëSK…r»7µyÓÐCYÑê±®ì y“cKèDv0“§¬ b¯ÍòB™æöx##­‚²Y±Osõ¾t"T"‚Á¥Ïû½Ô3¿‡=#5hX#;LïølÍoGížéo¬B¬•ªzã”HC†–OH4­Ú!Ã8õòÖj¶©Íº:CÑ™¬hVù0¨ŽèÆYñ_ ¼¬éÎQÒAÈ[C_$PxNŒjîó¦í•Ý?¯ÈÖøöMgßœçg§u؆ñæj_n£ÞÿþñW«Ç_ñ9ÀZ ½Û  hÒì"Ò:ÌÝ;VO:QB¤*ß?°7›–Nz^o¨´#ëb‰(êþÙ6{Ùnд%*¸ÙseåÆÅ6ˆE YôÓfw†g4Nóñ@a¬6¬6À>º8²P=§þgÇäpð²VýXø:ž`Ò tB,òiœØCÀÒ3ÊÉ€–¡‘Äð ôƒR†‰÷ñT×=FáËMµm­í,VYÁavS“†!KÓàÔ0A¹”6×áxÑ¿7ìv½† ”qø,ÅÆÁ$’ ‘D*R2•s¥1›ò ƒY‡‚ŒJpÒu;Ã;k‚SÓMwL¨×gšóÀEˆ¥½q°ßÀç5i "+/³Öfb˜‡ zämr@‚U\ÿ»Ó _ḚüÀ0©Ði4BD E€Ãб:ïs’•[Gž->À#à‰ÞÔ}ë¨DÏ:¥üp,òuÞ ­g&h ± $ˆ­«ÓnïD(qü-_ˆ+ Rëôþ—,¡+68ÈÑ'îsÆR“c†£qH2buÄ…&ŠkZTôˆ4} 刯fÃ%Z‰4”S ]w‰gˆùpÙmŒdu¶Æû+W¦ñ%€J#Ê¥ ì{ŠMŽî]»x)_ TO÷å¶:{ïÐ#Ìw—ó¬?ž–¿˜Þ§  ×΢*C*¶ÑœF¬úTw^6ø;ÁLûŠEË£ã†Þ†Å¼”g «¨?x‡UÒ™»0~û{¡J‡$×ñt*!TP}öÛS¼€àx·LÌÇc¯¸œÐ+ƒÙ`_y—­º`f¦®pawG†ÃþŽlï¸ï k½d@÷1¨Ð&Îô‹åuW:;«C`:¤Ï±SëYµ—ƽ¨CóÜÛì¦k–à©1¬ØÎN`àcúÔ‰ïýF³×µÉn“©âÄkò]ióÇ:ë«.XÇ® oBm•ër½4Ê—Ožz[0u_9²©Gð‰5Z_é@;ÔÐD¶ÑÔ‚~Q*ŸçŸ¡PAŸ‘¸ Ux_dw ;L–]×E‹´f}o¼Âh-)ESu9Z.Í}K˯i‚Ú*ÛzŽýF>¤šTÒïݧ»ÇÜdðÐÁK†êñ‡\*‚q?`V®Név â4U˜æ h9wt7]\ªòÞ¶wÇ÷ù '²pÞxYZ‹Y€ÓØø…êÜÝ´ÔÏ¿Ž> stream xÚµY[oÛ:~ï¯0ö<ùÀfEñ"©ûm7‹"]4FEŽ[±µ+KYIÎåßï ‡”%‡NRìY¨yÓp8œï›á„OBøÇ'i8‰…`©L&«Ý»ÐŒ6› 5¾yÇíº9,œV~\¼{ÿY© Y¦|²¸ŠZ¬'×Áù6»ëòf:BòÃt.¥ ¾}ûò•F>en[ÓDu³Ëºv:¤Žd õt¹øû»O‹^EoÔW¾¢*%ÌʉN$ãB’¾‹-ê“ò`—gUQm°õ-jôP@2¡#ØÏ|ù»d´‡bq»ëü6Û—É_ÕeÝø¤jªÄ‹RS–¦nÁýTé kмeÓ¹æqpqKT5é~›­ì‘j;ÓÑáX7Ó9|ý¯|e•ÚNyµÔÎzÎàÞBdeIƒE ·ySt¨ÞdÎcÎD¬¡!W¤í"uWÓ( ®vÔî~miê`èÀՃĬ¤žÙŽ$Á-Ì‘Àoà+8ÅÎʽكöÛª¶ Rxl»Ë6›F1 vÎÂÛvÒƒ¢NXî£#¡F pXñà¢#Uš¼Íwèw7¥qFå¼M%ÁÙÕù0]\Є»'» {ð¡çoò5Í`#µƒ‘U½'<Û50U­iŠÐÖtù#MÆX„ÉáÂ^#ü#ä –Õ&à€Ýò¹8:aÝž¢®Z'@…½dXÜí›ÜçUMß7kð±.·à®m˜ºG£¸Í Ol1\#pà¶J;XxÃC^4wàïVÈèRZg?ðå\pÍÂHóÓ#rðà mI²úø²ä©ax $Øúö‹Êúv2pú¢.ËW>ØX.‰3€OËêfyådoo0}é…fÉ °¿µ²Lg—UI ˆŽÿEü%†æÎ:pebK@Ö0å$™¡¢C“)… ’ (–¯K3̳7ü½"ê Òf3êRøÄ݆gÆH/0îï1½ði±¥=Ù/@xõj³/3 /›Àú]±1ßw41ÐPuÞ!{âYÖ4ù‰l KÆÎST’±z­á9•€]U¬Û†²¿©ý }ÎŽ"¥ÇZÔcòQ˜m÷€ýHÖ¿õ§î\ô\gôð‘«fJö "eéÂOául±Dö´Îî1W•´-©Fð “#¼z¢³e^õûɵ\Î‡ÇÆ\þå?êò©,*<“ñ‚ËÀÊDÅÔ?§`jQæ¡ûöþ:\zM áÕ¿ˆc>EÆádT™s¯X…,Šûû…|»Úïnü°&ü½wg@­uòÜçq¢_ˆS[jÝY|ã+—Waõ'aõgÁeAØn÷wweÔôÿ7úÏ “HÅÿ”IŒ´Þ'OÙ$L†‚íYÎ0ëņáñŸq ÌJÅo$ôÚbôfS蜰$R^yÉýc“ÄY@ž4…`ë´ÄêêWì s 0°ÂŒ:ß¿|YàY K0yù ®{övSÃÄ!Fæ,žg<íá7ˆñÏ´M˜ŠiÊ<xü-or¯Ô”)­ß`¸¹°7)|i¬—ü±m¬½§J ¹VCº:yŽsÃàE‚r õš˜§œÅ¼¯¿jܹH u£ñt.íêŽòNéWÝT"nÇÕ Üjfì¿%Œ:(G¿pM@EúPÙîÕ2,U×6zfáÁ‘JÂIf߆ùã]™q×£·ž}ŽÛ|•' “ò¨p™?vNìÎë'JcßÈOâq’‰¨÷h®MáÉçOKî4@ª\yR>¢mJdçBÇØä‡f´ôm—¤,”r€‰HFô#æw6&D2Lu¿Ž3¼±«E¤ôé‘U7Ž­cÄÖÁyr&°ÂÀ„Êp®¶H`fXš‰Çp¿K¤c—Ù#ßd]áŠñ¸¸ßµw©†–Úz‹Û*£Q Šž2‹Ñhïß1ÚÂcrŠq³ªIœ© šŸÌPæó»â1/q$~øæq”b¡ƒØ?eM3cwÓÖå¾³K\ÙÄe ”èñî´ºô’¼ox»ÅòD¸ u¿¬/õP& ¬ǹDþŸ=PŠgCbÚÛÂBrôÐT)Óiäí¤•·šÅiò&~”wu-â£sâà àjSú­è–@Ñà=uâ."&eN,V*ûW6)´eÍcTÁ„ñWËkiÌà Æxä’ñO” Å¢TEuS–.íß§êÊæ}Ž˜mBaÃö>¸?—üJTj¥ endstream endobj 519 0 obj << /Length 2470 /Filter /FlateDecode >> stream xÚ½YÛnÜ8}ÏW4‡U—I‘J0¶× <;pfÃÀÂã¹[îF-õJòm¾~«X”ZjË·Ì` MQ¼ÔåÔ©*YÌ8ü³„ÏŒ”,Qv¶Ø¼ãn¶^ÍhðíË;á×…°0¬<<{÷ÏÏZÏg OÄììzxÔÙrv­Óm›ÕóPJ¨óP)|ýúåšùœ™Í­ ªz“¶Í<ŒT© 6ó˳ŸßŸõè(z¥¤¸òeQc«˜ŠDå œ±<8­``E°¨Šª¦aÞà/š-Èfƒl‘ÿÎ…Ê–ôöº[Ö®ó¹z ¥UñPäeÆæ¡µ&8iÿáOZÖé<2Á]IyÙÑ I7Ùž>–ÜìÎÊHQ´ ¡’`™yôìäæc‘+†ví!˜o¶EÖ,móªô@V‹5B9b&6ÞÛÙ=BGXÐn“M¡C+ñ¤GÇ9’NV·ùÌ:•Àáq·|UW7Û†.¨®éWúG aEºiËUèÍ–w.Ç×n|³Áÿ¯È uƒÔ(WÜi@k0UÚï¡kºÛÓ¢ AÇ¡–%bdRÓ¬ Nð„ÈúûÀ]¸5wsº”&ófʈ"2,~õfQçÇGg“ÖLØÞØpSÙßYû[SXg8x¾ë´ºA”ã´ÇKݽ%=²{¯ÑNä ®ê¦¥‡çØ2‚Þ‰ôÀ§éA3éAxÔf´‘®savC …„°áX„÷>z‰?t´G>ÆqI8†mÏ©"4ãrÈtâiUö¸î„T;!›l”âo¦VE}äEpb" ÇÔ4D‡;÷3 ´Î˜TZ@örñLáE1«ýhS@©hb•pD >î…—¡ð2ŽQáõTxÑ›U~‹ë2zª³%_ÂUe¥'Á Þ;¸A±]§¤|bgÅ8¼ÐCÕ6]ä-^ù°31 Yš^U—&U‡Éè² 6÷öZ<Q°¾î‘ü„év‹î&«=VÅën#@º, “L¦a@@l'j“êàÂ>’U„*†Ã“ÓƒoH¿ÿ™RÎJf¤ív]»ºö¹ê~ÓÅ"ƒÊrù 5c–í‹}©AóèJº‚‘ixÇ00¹Êq<3,!»ýáà€‰2rÿ'ñ÷l¹ŠD…ÔÌ, /!Nêz µ.ÑØÊÛt•Ѽ–ûª¨D±DË‘*O×¾Ýêß?Ô Ž@5‰*÷g å•PÚö¾Q: ²ûtÑý‹¢¨\ÛÐÕ¶°ìàûщ Ûz¦#>PˆßAõDëe^åþäÃ|—€Îež–4Õ&+Šn˜¹syeªªpI%ŽŒn¤‰ž/Œã C|‹1D©«£:NÀMNNB®ןše:èŠØ)1q Cѯ#I»=!!eMËúx!ñ³ŒY <:2ibQ“OXiÈy9w·cyq öB(.ÏÂLåz2œð2à–:K u,7¨Qpº·Î¥5¼e“öJ8‹£¾J8<ùBÛ?Ï…@)Àg4súõìøã$YXf’ž0Ç’\]µ@v‘&a ÛÂAî^T7d¿ÉBGBBâòå^Â@"î«Äž4{¶´QÏß'¸`œ‹õ?qa \ÕC'­³)Ã3G"z¡¯’S0ôMY.ï>»%&P&ì´YWR‡ ””¾‡*›H§q|ÿ÷1û}£\¿ß©¥Àˆ…Ö´ëÅa×/Oš:Ù3B®T4˜Í·uÁ¾Ã’Ké¢ >öK]²4]uÙÕæþ%ùo÷–ª4ladOOøÚõaX´ý—´u¯ÎÖÐUSÆ7Øo¹[hIúP%u†ˆD11²\Ú½ ãû¾¨œ2œ‰™Ò}~}Òn1ÓJ?¶µãÇʈYÕ'`Öü‘O!ñú}qÀmãÚàûƒoáî?N]°ØÍ ·\]^¨Ë‹ò²Sª§uÿÞã‘J6ÆúÐŽê´\yóiõDÌ™ümá-x›, $JŠ‚[Ÿ5'5wž}1SGNÛ—ÜЯÀ‡/ºÕ¼á¼¿âV5ŒQ²ÄäyØ›Å}ßBÍ€ ð²/|äGøaŠ›Qxý¡81N’·FüóR™h·´lóò¦ ùmÚ} Ÿïû×#ʾÕôDÆ€éäd•†]­S.Ãê:DzúD3›Ôçë+OeTV®|qÔ%l9~ô%\y³¹êšÍéNph?ߘÀ#³ÚÜ$b²û#âû‘pžB–ÙuzS´Ãêb’ýŸÑàºÀ&ûRåâÀ‡×­ÿƧÑ©ø?Jþ«” endstream endobj 527 0 obj << /Length 2661 /Filter /FlateDecode >> stream xÚ¥koܸñ{~Åý-zbE‰Ô£Wp'ñ]`§¶h꨼K{u§•6’6öùñáZIæÆN ^>†Ã™á¼ÅgüñYÌ’(b™Hg‹õ«@¯6÷3\¼Å œ€þòÍÕ«¿¼“rÆ–Ÿ]Ý Q]-g×Þñ*ßtª™ûQyâ¯s_響ÿH+ïŠR™Ñ<¼ºYç];÷C‡Â‹ÓùÍÕ/¯N®zd¾R„|†Tس8ŒG‚è½Z!=Aâµ»j&^7ç^þˆK©×¨V­çaêÝ–ª%¨n•w´Yß!±pG<ºCÀ˜G@“Æ~þîQLèßpÁO€—‡ÞCÑ­è†Ü\™ß–†F¸Sÿ~EJUÓ K×]]–5’ú€ÿÔ’0ÜâdGÀsO}Ù› ‡ z­¿žù<‰YÔú¯[Z^…óžfœä¢ÁÓà«6 jÐÊžïå9@˜w:¾â|eðèÉ:×)ÍÎDtËÒ@‘tÈnbéòb¸£mÃV^r¶è J¤‚{ŸæÃˆ‹ÐÏc”Þ©Ú¢âáìVÃ(šØ'­YæUµ2þTk¾Î!²äåVQô’Õ!¸õ™9)€& ¥={Ÿ.À’QbT#:2IS`c]ܯ(OÔÓžxœ4jƒiH]Íl¡t¬]E(e(Ÿ8Ò –ËDz<1i~3ó¸Ü:¢Hª«>AïƒW›¯ÕA‘i¡ª¥€aš¤”N¥äJ†Dü˜$ô஬ó QjÕŸH.ÁaÉ +ZXY:F¸«yK$2sZ‘`¯ ¡,‰C“/±ãŒ#ïòÓ‡“‹ À¨u=¾uK4¬W´àµq“†’Ê rÙv –?î=ŸSô}¶h(q%qé¤LésFH.SÑ`ífå¬~BöP.D>Ï$Ëd2VÎëË«›ë“o¾]ÞXÑá ÿ‰~~U»‡ºYº Ä@äÛ®ö1›jrmž¸®¹Û¢#ÆÉ¢ö$.Çp©®Ê9 NúÁÓž‚ž<K †t/×+§à9Àˆ‰ìé¶Ûß!¤¶6ãø²Ï9 ³I!‹@.aÙ¤3(ç"nÔìîÕ?Lv1¹½Me¯‰åéÙo—ç§o>~;þüñôìíÅé1Œ/NޝŽÎÞÿöñèâÛåÐuþþâèÓ‡Óãoçg'On¾#ß diŒ®Þ6fT¨rÙ Z97P€è,œ ¾È—Ŷu]úÏ…ªt§1~Nþe&Ï:½‰Iý¡Ëê‰:´5Ëïé{hɇÔÓU8$,Š£½òC¸–1)H!š Ñ™4…’¼Éûäh­rÈF(¼g;fT2¨ðL`üÓJ¡x¢ ò‰‚ö…ÔkLê“•`ת±n(‡ê¾Ï°­ÐÕgº§Œp¯ÜÑæÀðtx±†GÎÌGxðSÜ3ög"9–Ãb%Öç4"•šgž¾eç³`lH Ù‡“á² —kXÖ©4,Ÿle±T¹™¶›|¡ ‘)K$½ O²ùáLj ÅžÈPŒˆÄ-$—?ì(‚«æÖDr7>×$Vw'"º: ΠäüáÎ÷÷ç]Üø’qG9H‰Ö볺ò"Ç­÷ª^«®ÙA g BB4š$¼¦®ƒâ"˜²ÈÓŒ УP¦ NÙ3•…öà®®ãé°¶Ë †QßËCš‘<Ñ 4)ÛKá^‹a<Ôb˜RAÈ  ŠÒž0*gn•Xf³0‚dÿƒNÐy€À©ãk&}f 3%ê§Z[Oµ"d1Þ9ìk¾H)BP'ùr¥ØƒO) ÔP) L‹DŒýø¥y:ÔH“% z%·[ËF×íM·­® q¸VíJpÈñmá::ÝÆ¼ºß–yC …Á“ÓÍþõ¶Ì¨m¬3&ô"è´ší®íÔ«ºX˜2KD)Õ8€„ ïê¦@ÍÃù¦Ì+³µW–Êl`YD‰>骫ÀÈ}Óññ§3¾a«´ï×úú2PspÓèN‹†®j×5qÜ­*¨ ñºÓ`i×ü†qÀ>©,º‹&ˆ¢^—S^Q™iM¿ö­p#2-4ö–Ê8é åÚÒ~mOkÁB«:ªúq¿ Œv—Å¢ß,™ziðóà‘´uKí¢GÝåÛ²cŽòZw¾›z~%Ð¥+B= Ê(0÷rîmL_Þ¬Z˜Å H·@ºž ”=á}lûÛÙßó¥³¢xïèþÐ|íL,Ë1WÃûõz ¯dnÔÝŽJìÊÄ!]’^]°9CŽ ÚRx¯¾:³È(IYÿqÄö]7æÝ,ïºõÐuMq»íÌ^­oòßi5]¡Äm‚$ÒdT™ÐJn·yN{\#Ó}Þw8E•œí¿`9Úö?SõJ7š´yŸ0¶§EŠ˜&Cƒ‚9 Çâ+ª¢Ców—•2ˆ_Dz Ó‡±~<èþ¥N-U]÷ã-K(ÐP~`0j€ÒNa`è0Ôä0x¬{±B—<%fS5^ö0E©‹õt_¬'ºX7PÚz ´«N¡^–#ƒ\ÿÑ=¢Gw‰@dÃâò5°JŸ>Ó‘î=¬(í3]è“„Mh÷=°==éH“ÀÝÁvÿ‰³iæ$Ù8=mÄYòi­?ú4ÉgI0©\l}Šô9?/Ʉœ C]Âm[K[CéþünóÒ›1½ÀMS÷Q¿˜ ÿ_øŽ¸Ž endstream endobj 537 0 obj << /Length 2391 /Filter /FlateDecode >> stream xÚ­YëoÛÈÿž¿Bð—£pá–ûâ#m?ørNêÂp GEø”–(‰=‰4HêlµèÿÞ™}ñá•­Šæîjwvž¿™ÙÐYÿè,‹f ç$él¹©Õf3Óƒ»Ïï¨ÙÂÆp°ó§Å»?|’rF#’E-ÖCR‹Õì>ø¸Í»¢™‡œó@|˜‡BÈàË—Ï7zåS¹+Ìhžò nöy×ÎC&b&‚8›_üõÝÕÂ1 ;“SÜù’ÕlÂjœ B¹0¬~»¹¾ýùîúãå Þ;•L&$ž…”*õþåqWV«¦\æ;-ÂcSÏCÿú`ήK#Ç p§·¾+RÂÓÌî([MµÛ* ‰`WW›²;¬æ4€¼û–Î ¥ñé[ò/)|ÄCÆ%<ƒAD8|‰»« 4Þåíç¿ß\Þ½¡;ª5Ų˫Ía—£oÄ‘Qž<¥¼xÈô åÅéH* ª¥‚Õ]áW%1o(MDÉ€¼Þ·PJXLeõK$#«NSÝmîቒÄGž/GŽÉûˆe$†³cY‡u³*«¼3:(+<3 y”’ˆ¦#_6æçAû¸-šâ‡V;Øþ|l»b?fìÚÎCçøº¸º»úòùîòo¹þxžkÀ MQošüq[.'‘^SÖ•^\7õ~â¼m}è¶z UéµR–F¹ÓãŸC¯]ƒa:° 5œ8¥A½;IBF ~¹½ú4§”—s8úñê\-4E·Ä[-[Ýt[Ð D¿SŒ~+‹'ÍX½öJËÁÖÜù×GßåT’ÈÁÎ¶Ø—Ú Ý9K‚ß‹âZÝö½žï˦©›²ÚhÚ Ðæ@H*•ÀEZ%’Pf„Ô‹eÁõ-bÙ×ÐJ„ÊÞè†ÄCAG«Ö_—à ŽÁ ÿ¢ƒXDn¿D4~ÖºZ×F€Ü«)5\ßK>¿ˆ‰²÷ *lóƒKa¿.RV­^`[Ìûm:Pjš%9—Nð¦¿PÉUÕz®XV£Ÿ®o‡’¿™HQyUSFä.+¯.íÞVEB¢róÇÇ]Y K)x¨þˆg¦‚´ïƒ^Id¸ïÖË#‚9µÿè£$ÁÍBÓSx›‘T8žŸOБéy ‰ÿCT¨š²ÒšÓˆãß]ñÜéˆsõ½ý9Äà‡°3à„§š¼jµ±%µAZJ£=zLfªM UdÃÜÔeQÔo Ôlè]Þ££¿Ø€'ë­O%@®hIhzF@ÑÔ©i]ïv5Fñ“ 蕽&G=nÛBßÜêlÐêž \ÂtŸ»C:§f;oŒVr Ç[šÄ’Wö¨‚ÝUÑ|8Úé(˜6$$Ñéà®ëÍ.¬Pµ>}`<n ÷ËGYb}$aÖl0Rf“ÊlzAY:qVÓ‹B¹ÁJÈì+‚‡²àkQLëmÎc…kn"á7•0ÏUñ=^Váö|8 ài¦×èÊÁåz`ÊtL(Êý]± ¬–Eûý½öûÇ|cD“âEËQ豯´ f÷ O‰*† 3ëÚø˜ †ÖÐÇúBë¨;vùÛ:Ÿ¿Be‰ƒÉZg`åG½Á}ebF²6wŠàWcGjàæ>O8᱃¹CUvo'EÛRä¦&;Vµ¨½ËF¾«RFd⢤%O]–å”PÈa"³qÞtÐÕ†LdpñŸ‹ï ;&u–ÂÁ`Nï/þ [|!ú"ò_¨ÈTÄt,pÜ©úmÒjÆMù öÉh\•‘Õþm1ÜaÇŸÔ% ÚÝæê´;%ÔÐùng÷†hìJ€>(Ûöø× DÓšÊNL¹°EG«°þ`oÆI®746:ÍÑú•š‹E×’Yk^x]xèÁ½…<Ô€H*_%–7÷QÔç8#ï©Ö ’(dišl~ñ§ í'k¨YCÈÓ]^V`êü)4æò9`]ÓžÌíqÿPï¦xl VÞë”óZvñ½¬l *P`#2MoUÛÆÐºøú8éº&eÇ+Õ0¸]*c`¶ÞÔ©Û°„¾•@=""äyP•@÷EÜù¨*‰C 7(êCg}šÅ‰×å@GìN/n®ýU§†lê©öågi®S ¥½3~Çæhuy¨6ôb½GF™ ð“¬btÆ}pŠUèëÒüŸ¶u[˜üq"¤; ^϶”ÊhpØu%°]ìŽþ¥QrŽòDšžV^‹‰EÁu¥¯/´¹QJƒ_«­>"L‡ìy;Ö«!§—i®Uw¹^¶jÐJXB ljó^“…Õ8L¹ [,B…8ËÂæÞjeáÚ²%¨´uPî•,–$âo&ßxØÌöî„jµºÏŧ?*×¥? Å5âE¾ÄåíH’ž&1TÏlÎ×èé°:_ÿCYšœLãHXï_\+?C\gt ýeÿNÙ=ÁP£ÚS¥ÍÙ¹JµLê&Ešb)3>~u‹½ÒŒý|ÙT–7š¢$’™§ÞЕ+û<ÒÙêW[ý5¤+ 8b!ƒo󚟃þyYv+=<´†`·µ‡]B@éR QÃ8xj€¦òE¿r÷ØF,W5‚ZlêCµr_–(ÐüM…’†íÁ*A9Ø‹ÞmëÃf;.@UýN Ç’P bS˜I ŠÓUm)Ú‚v_7&ã!bÄËÒh róh•‰qòñôU” õ>H% xÐïí«ìùp@ÀÓ¦L¯™ôUsÐWÅZ¦ûZÜ“Ê{d¡Áw£fÓqÁHòM#DU*ùH¸Ó—Ýý†(S¢®ãêñDôÍ•­–§_!™ê†öùǶÀ@“Ì¥r[\ÈõÇVð8Fl,ºæ¨gÖp¼/r|‹À¡JÅ꼟ÀG¸<'ñôÚjúma8û§ï2'g‚WM¦Ën?Ìs/zº~eµ/Y`;|â‰ÄäŸÄðF ß`²>ìôX•—‚{/.\Tª~î396øÏˆÖR5IE pØ*~ÐEŽTžÓ§±ö¸ ß6ï> stream xÚ½ÙnÜFòÝ_!ø%"rÙdór²ÙÄ9³ˆÄG ,5ÓÒ0á’cIì¿o]ÍK-É6a‘Ý]]]]wG„ðOáIÇA¡ó“ÍþIH³ÝÕ ¿üøÍ%p>ú3Èœ?ùÛ×Ir¢Â  ur~9Gu¾=yë}¹+ƒéNý8Ž=ýìÔ×:ñ~øá›ïyæëª6òvšÇ^ÛíË¡?õ#FÚËÂÓwçÿ|òü|$ ‰¢¤!!U…VõIšë@Åšé=ß!=yê5§Qî÷ø÷Ê=ºDžxí% æf8v†'‡®lúK"¿j›ž!hó±dTœØÉŽGJå Ä»2íÞ Ý­+'ùÈ›_ñ|*á+ ð:×t!€„˧ó˧yDÈ-Úòò_ß>ÿñ¹À-˜çÒ‰…kÂ$õ~9UP¯¼ ÞM§ÞÏaöƬÅ%*ÈÓô$Ía®IdAkAXÀ‘ì–3s!Úýþ CëcøJfƒl@ú2OQ3©où®ïÎxåP^^Hó5ùΈ£lAþýg¡!v”ˆþ)¦çØ›žévUÏsƒaÅiªßŽF¦ZÉ¡$ÅØ®LcºrÃ*‘±ö )ÚPu2/ú»åQâ<€\w†´×^#EDÐC^ºìJËÝÙzÉ‹ýÁâˆI1Žý±¬ë[m,vÐõ ȃç€èN£F§A”Æ|£/„€ª¹ª­: ®FÊ#«¦xê —Ö«(Б¶`Ÿº0%AüE‚q˜E¤Ååo«½izàGY oî€ç6ÈáRbér­6ÕÏ¡ÒV"(®[×-À•­XÔŒg‚‰F‰÷öéïOßñî,\žq:²Êɦ>u!Yr‰Ots<› æCp¹¨@'ÉBºŸ’hnfïLÄeÝRaüײ`)=_e ŒoÉÀs¶·8ò®ª÷È{2D«ÖÑÊW¨ ÔúAŽæ.<¤w.ª`‚¾Oç"‡ÎE ºê#ÖÞó bŽDâaÇ.ßÈn`­£AyÅ,; 6@WÞ¦® ¾‹Cl({çíÀOáæaûLþ/ö™Cܨ›{ð$ù_ç0€cYÈaêmÏ¥(7•àö™;K­ÈGgT·bÒÅÜhÊfëvnA¤FÕvÕUåDƒüábg¯C9¡2¹¶dè/Z̧“ Cg98YDqü!WH¢ ÌÆ`XöŒ—øJUU}ŠÿaROÑtyp ‚У×Óaªt<¨“TWMK‰? .íµ*çYEd£");ŠŠ@M9å:0þMÙu•‘»–3¯…Ê&Hó¼šý˜À‰NÅÑuß‚Â':âÛ…Ê{ñ•ÿ¾2×à¦xŒ©^†–1ï±1Ðæèñ,å]C íì¦h,'w7E£ÝóÛ³wºœÕ:m=ƒâBÍÝJíDéd×U-x›v`ÒǼÛ®D¥¿n@1uÆß¯v"õb^¾úàn"©üyí~8B”ˆmù¤H{€ƒK÷ëÔ=° .2öî:@¯£e ÉáZðªn/Ù8@œøÜ”{(]–sÍv³œè71ÍrŽÄpOi9P· åFU®²ÓòLÙ 3«@/pü൶¯$-©ÎÔåä·p†R~xVCÏÈàí¹áà V¥!»ù ‰Å}2E¬Šj>¯¡(î³iµJÿáú-’s-yÁá ? ä)O°½$W‡æMÝ›k,‰D ./Êk´ÞϜ잊.råIIðÑÇUs°ÂiW9 %·äPVQ‘q7_¦Ø7ÈJ»‚°ŠÜ7-ƒ_ƒKt àØHë¡ë {8ܱá^YÛm«†Úz8ÙßöƒÙ3·…ºÃ‡+‘e~é˽¼aÂÁKåÀoUÃÏë]µA¥ÚñÏH FÎOdÓOܦÇeË33ÍÂV‡9»2Í„ƒš×°Í®6²“Í¢(pvôǬñP—³uÊÜI’ÔÃèK]¼€[êñäT‰dC” [£t)oœm“‹ôHÊñiO"@<”:3ŠÔà|‡œ?ö ‚y‹ìéMi_ø³B=TnG‘ü‘Î9Qf$ÈHÌù¬PÒÜÉØÊÊŽ!Xrr=³E›™'µþ÷£¦@0ŽÉ9Á”ÅaÊñsÌ"=«tªCïÜÖ°´ôÔ›‚1µ“8¨Q5D±Y\¤qJxñ-ó*™)ë–J*Þ^s5 @¿à›ªÿŒgf~vL½WKìÛwÌ tfø§ì¶gbxÍ«ÇÃ|KàºÚ'¢Tô%Ja'𪡻àÙƒË6xá;Èd#À¤&³í©X>­õ<3º DÓ2Õâ\è³Qy?íЂ ä½“•¬lµ’6)6†3[^š…Ge×ÎyØMå0Eúð,<óã œ…ù?Éâ1Æ;Ì=ƒª1׿®­éjkî«ð„ó¨¹`c³û_ iHÌÕ°Ãñ±Á-‚isœ25Vl‚bæ u”Œâ ås±ÌÌDíÚÑK33ý`Û6™é®Š¹IOH¯ºòÈÇ*…ƒƒàgÃËûª¯.j\ŸRت·Þ2ïÕï{}Æë àåËØáAÙ4ó$XÒ5<ËGÂÔ‡WyÙAÄ¢I_ ”3©†R´cÝÖMîï¼ÑׄóÂÿ†Ñÿ}uš¥©1äRµ½ã|‡“lXë Èž'nïÎ'FÞ¦®L¬ä aFßÀ—E\]6æ %ž0Q¦ÑÓEY<_ó¸j .{ÊÔpÚéyI¶Æ+_'ûÌ«)- ƒªùs9Cã·Æa'‡Æ^]ýÊZéjö@Y(>Aͪ<_z{³¯b4–ÏDáúA‹2T-Þ¡E?(xbþR%!½¦å·“E"niå_) £õÏ¥ø(/L¼¿¯ÁšÂV:gæ$%$‹ÎöÔÉÔJzuª‚Y“gtL³%ÍÌ=ÉòÉýIRQ›KI(ñ¡®i³ödã’yÂþªÙ2"Ia$g´J–>OJMAvWß²æI ²bÁK#Ùõ­U-p‰XY )@ÑTöýq/–s7žDd} §VßKz>i#$K¾C³ ÎÊð2^ '8pÃÄ,Ÿ–Ù‚ ¿K(á-–²‚ùæWþkùh—àë”ÃT¾ˆÀ ¤hö‡Al®àÊžÇÞð z9|¢Kþ–Hp;,Þ€u_K‹r'›ßàêÀ^òÆfÌ,„î0ß³(}É]ÞÅqp .f¢TMYn”Bñ|”YɆ…0¯ü‚éU/J„@¢»Ñ6ºÌ %®§FGKóÄR^`?H´ˆÛ¢Q%PÜ-;Ì¢ë[ûMgU5\yQ4•îýö({²:nµ'mI_„UÕhX3w]Ûý¹™”4G\µSè$º›L%6J–µN èYËßùi¦ þ®KôÇ‚úƒSo›œ×Ü C§¬¤`bâæ ví­ UPdÑGg½e> stream xÚX_Ó8ßOQéH1qâüãÐ=pnéèI à!MÝn¸4é%)° ýî7㙤q×p«SÇã™ñÌoÆ•‹~r‘‹4ŠD®²E¹¿ µÛ-èãÏç’ù|`ôgœOVŸÅñB"r¹Xmç¢V›Å{ï÷«â0ènéGQä©GK_©Ø{ýúùK¢<«jÍ_Ë,òÚn_ ýÒU*/•Ë«OW“qÞQSä¼­j2WU VÕ"É”‘"}ë¶,†ªmH)œÕ¨Ä¹™™i˜ÀQfSÕûpeŒQÞFo‹c=üj‘Á¼õÒï“."Œ`ræµ}…Gë ;Ø%½z)=Ðèó2L=3´¼{èé¸CÑéf ÁÊZ†úI*²táËX$IB*·]µ«ÀÊ8Œ½÷»º]ƒfÒv4–Å^w…Mk6¥MèËNëÆ¦Ÿ}¤ï¯4\ÓðÍåI_F"}-íVà1‡!a(àZˇÈ(i|©t>•±7tEíOž5NF?JÅleKîd¯öDm·gl—¯Þ¬XnKK‡º(y‘¹Ôäj$Ùˆž®^—•Ñsƒö@àBdƹñŒ%ÙÁ1R‘J°; I£D²8 ì0P@\CÓ²¥MݦjŒ©Hì¯ûAïÜIx5uõ·Ùât¸ÌE$GON¹áð¹ŠE&Ó‘óž”C€Ò‰TÂ׸ýJ<ùªhv¬ÚdøŒ}oN|@n “XÈ0e¿p4õõYö‘Ô¶*Ç´Ûòh.B=i‡+—ÉRå,ùlÎ…ŠÕÈY4· E(ï´ÙÈSŒ>k š{ˆv§ÁÖN°ST$’@r¥$ã CĶíh“þZìµó’] ø2Ö8ž"¥1Õ ÈTΠ™û‚fH3H` ¾Èsk'Ÿ°Óíž8XŸÇ +×ßÄg¢8»qmÅDïÁz{¿ ×ù0È Æ©ƒk¾<)ù‰!NR´¹–¾åHRõæ¿a‘oÕ  –Ç\‘Lâ–Ã=¦®Æïq4Yæ‘WbB¥ž)ƆyKtfPÞ—ªD‰_0}ƒÐûtìZâH¼ÆÕâÜ–Üè‚e–uu8TÍŽf n£9J%ÕÚ¹Ýò¾JsïØTƒ_ëfioiÀŒ2ïhЛZo–:ÞÛC±Ñ̆ ¬²ÀhkŠ%Éü2׊ëcÕÏf™ßi8T_um“ê¶Ù=pEY§wE·©ußÏ‘F*~_}Ó?X:¹›‹vc*p”»<á¾D ˜Œ¥$ò.B_!–šò“*ï)N(Ã{W4¡Ú©HÆ&çݱEǘٷ{&éQŽ¡ƒÚNÈDšMˆ5ÂÄù±a"beâ“~v‡"ÃLÄQdƒÐ„>°˜D‰íz¼87(܆ [`` -2“¶PéFÇÍÛÉíä´Ïù"y-:Û@éãP–erÎmø.HÍ¢ÁB8CÁû˜HŒiÐoë®›?fÀõ²­ÇŽNºl½™ÃFjÙêQs„<'ç«Ú_÷Çn X&þ9 'IskN¢Îoò«›ó“¾?Þ´]Šv»½9ˆŸT8WŒM§õ?´’ż¼d1~ »C±k&š^ï =éÅ¡ûô“"fïl±èßqËÊ(D»û¡ªù~÷mÇ¡€pdz¥÷¿Íå±þºQphóÃoùÆRå¶{8nùÌNê zÍW¿æ÷A1ªi0ÒPÖígþ]vÛˬŠbn€#Sb pôkïêÊ<Ö2,€ˆ”Y vôz5u x\O XÜï ƒ@Ý¥q>5cïfN7/ >ÂzÀ> stream xÚÍXÝã4¿¿¢‚RiclÇÎÇqBâëС(OÙÔ݆ËGIÒÛ]ÿ;3;mÚô¶|< •¶Ž=öØãùýfÆbÁáO,2¾H¢ˆe*]õ3n{»»5~øú™pr!†G’Ÿ¯ž}üRë…à,ã™X¬6ÇK­Ö‹Ÿƒ/¶ùn0Ý2Œ¢(PÏ—¡R:øî»¯_SÏ˲2®µL£ íê|è—¡T±TA"—¿¬¾yöÕjÜ€–òÊ¢äùVãã­ ‘²t§Š‰HÑnÿXÂD¼úöǪ¦´Z„"bB“HÕùP¶ I6ë r'#Hèδ5 ¸_ÐÏÃãïì)úúsnêÐåM¿CLæ3M¿üôGpÍýç¹Ðñ¨û çÙA@'úL sãâx›áŒ-ìÈÇ/ð€ˆq°+š5”hV¸B–ò„ä“Làò± àâEð ìF‰²÷ßÓ*S?B«$,ö³Ú:7)Àò2 Þ-e˜ÿãeäöû7\Äø¡0"õæNÁôögØä¤àõ+ºòÓ}Și¥½¬®¼Ã–ýܲpx­b/Ϫ²f—Mál1²°ä`¹DÙ“sµcŸ‘6»=V»¡žˆÚ[4mð+8V?ºÔÑ?>’¡ò‡ç³–ˆX =“)s$|²o Ítê±m{W…í-ªŸsè“áSí|âQŒ±9s…QÌ’Ø[ÆyÕ·íW¡b Û¥òÁ˜Î|ÔÓG-5Íî*‹ÒJñ 7è‡;œ×9<£Xk@{Ý[3͸,Íl­ ì®Ñî¸ÖÐ߀@&ƒ¾%A˜ñHsûm»¯ÖÔë48L)à§)¦LSTmo@:R2(üÕ°‡ÝvÕ#Üvyбí7s2›‘µ›N-…DÐ&ÞÏþ@qîa;51l%–GŽ®­M(‚-ôyÆì=.S.ª„¯Ë·ÖJ÷%åGóãGÓÒÜƒí±·Î;šÕMTH²±•oÜùÁÙÉPà<•'TiÅcmÁñ 4S°Þ8r Ø 7« ßíÈæyW6w4#¯ÚÆM¶&Æ.úY—ý[šG`¿A¢Šºî·måšÀEýÐí‘ÎñÓß2­^€-¼ï$ð“»q3ë9¬Ø½¢éroðyï§™…¯Ò,Kž.jX‡‘ïúìK+hŽÝ/Ä©ßöùz"òç<2…Eä gÍÑŒd)å§ø6azôÂû*Œ³ˆ)¦2µ£} 7•%3lV(LøÄ÷Áˆd4ëìq”8æe«!E¦·Êß-eóª\;Í9z)îÎ G@‡ÉûÒ ac¯å‘ÿ=:±–¤ŠÎä– /o| ÈX¬³©[˜z7¸ù6Œ¼30J¨^"$}¸³Ìö€ÌV{Ž«lß £züíLÝâªï–ÎAm¨¤8úXc'ùn[Y8ƒâµAL X¾DÁG\ ÝÓG]ÞmqÚ@Ÿ÷]9˜¿é±k³)˜ØîÛÚÀFnÛÊ%2g^=uÌ“4Äk9KD%"+4Éëÿ_&²ºH2™ÈœŠÜu»kIN®ŒIy¡æÖÑ,‘#Øîºv¿›ÝSÂ"þ7rq“œnv=mÂvݯÏ_sFyýÖv]KiàË«Jr†ÙÅ“÷®œ1ˆ8^j ®þÇûÔ0Š¢Ì|ÑVpÀFÊ U ”¤[ÈOiHø8ƒ„5ç‘i”÷3–$³øˆmÓËösB¢œQ“€ß·âk®÷ßÝIÊå­£ вõô,ÙðàC"—·˜Äaã¾ífcö kn”°æ~ 6:™ˆ©½©Z¨jñ6?,pHyÃLéQcÞ8;¾Å ÛhJü*+L] §ðëÖïÌR´¦p4‹áÀªuŸÓ¹—óúó’ãé‹ÜÕÈ·f¢` ÞP™KÖ˜¯‰©úqgI³ÃYˆ²Æ¥)#qžítuT5ý×û 'Þ”ãáqÍÛKš¨s¡ªHý¤GÒ³Åâ`kÖö©µ}¬]­A[¦rŠÅÊŸ îai JlðI¡«o(m´5U|ÉZz=Tšƒ«o[¡ü4ÁïóÚœ½å¸¨}»w¾Vº:°n;'ŒW¥±‰è0_ù†³0w 1) ®Ž¼¨´Ä¸)eCƒ‡[Â/Ç÷s$¡"¦Ó E\ΤÕQâ1m•%DÈØ¨Qÿ¾Ê]U"˜±ƦÃG^•Ìa®-ý ]™Í@Y+ÊÝú²ÚƒAñ³#C¿=òA*¯=>Ï¡|(âêI”#›YN_äÎNÌüCû_±{åå endstream endobj 437 0 obj << /Type /ObjStm /N 100 /First 889 /Length 1964 /Filter /FlateDecode >> stream xÚÍZIG¾ûWÔ19¤\o«EB‘ ,‰D"’Î`°‘gF‚Ÿïµ ™q{°§{˜ä`õsûU½}«²r )¨J(9¨ÔÀBx¶ fxwM!“?)§%TÇW ”’Á"JJUP±… *4— 8B ( @ ¤Åß`#ð‘±Ê ([ ”›¿ÁòšêD-P gìS«Ài8…ƒV‘À æoYÌ ¬N=çÀÖÀs.‹³Â\; Ü šfˆßJ ¾@’s!…kr!D ø ˆ +»²¸Ó”äêp agð$Å–æÞT_Õ(HcHZ±W‚‚µaw*€'°êò³ëÛù–€$êznÍ­àû¸²¨K.@8—ľԅ¬xã:ª8½ð•àÅ’úÊ\ûøÔ‰%üìN`ÖÌö2—Ò 53òåX`°^÷%_šƒ•jXŠ/ÀÍ|lÑj›gxØ4æY;:! tl3òŸ4ä ·2p ´n\CnNžš›ùݘäP(ÉÄ„Caö}àÇâ8ðä¢N źŸ ¼À:_w@4€hAûÅmap‚šà]WxÛÄÀJåæ«8T‘N¡ºãÈT_ •p)<,\-ÏÂ;aúÐñ‡O„£ÊF$”üþûÉôÉzuòl~^„é“ûÃôùüÃYx9ÁO¾×óïçøaöf>™þ€}ç˳S÷_>™>Ÿ®Î×'sÅ›W?Ï_-f÷V‹<¼Ùuðdfk¬uÛàÝ].WØêE—œÏÝJÚ<ÓöIÛç†çÖº}&Ógçžuß/–O¦÷VëWóõ†‡ôÒ=„°e¤ì‰¡F‚ Rkè!“)ðîvz{¦VÏWaz?|ótþzÎ!ã·®®Á´•ZDô~¦íÞú%º³÷ïç³õ „ÿ@¯þü »ŒdÁã^56$$Ÿ˜=˜Å–ä¶8@ZŽÈf­Æ 7F¾ƒ*ÀDj±&ÚË„{ãùºãàg0´X¾Ç´9D4³tf@dÇRx/ý{³ÓʼnSÿ ¾¿žœ-VËÑVø¡§R&‰#µ0 bà>\K·ýëo¿l_,—çoß¾üN¶9çÞñ‰¯KÈŸPÈ+˜ÖQ)Ť—RŒ®•R.küe…t° ¥/ƒ –!ÿ'2ä¾2 MíÖÆ¦l©QÛKŽÞ4y´Ö¥ÚÞX¹û9cî†HæÃ!²ƒƒJJ:4D† ¤¾êP”HÞÁvϼ­©Ù¶Ïm­Íe‹§c æÊŠ•7Ö*ÊQ)_Ç\ƒhfø‰¢ý$¤Ö„”Š6)Êצ+’cEÛò‰8:ÙX¸|‘øâì=’,Z öɀо4¯a½›`tWÔò J&hž¤+^ÒMr¨ÞÒÕ.4Ý_‹*æ³Ø07T 5w>EP¯µ¯E±‹ü}R`uGÆ8X¼XG°K$m@êF_Úöä“‹µÙ»«³¥õÒK)Ç¥—J½ô’Ǧ B:÷9ÊSŒaè %v“*Óœ®¡ó­Z†–Ë‹ª½`‹¡Z®ÖÓr•¡Z®<ºŠ¢ÑÔI9ú0ñ>&LÀBö÷7ž‹ålýÑ;Ï׫õ»Ùٮ«®¨;89¡Ñ¶ƒhVP3j;ˆÇŸ| ÜÃŽ¦Æ=;·4ØÎ㻥„èïqA!2õã ¨"+¢)Ë ;7:lç6 ¥âz†A³(¼'GwT­ß–7»–‘.ŠšPÇe„>´O#òÑ%ÕŒT‡¥žÏúIÞ0uøñà!uìâp­‘¬üoÔ‘ûêÐÁê°¬BÿŠ9T6¢¾lí(ÙŒl'=ù ®óâ¸cÓT±è£I$ðÖ6'·~“êµSÔ°iÑ´v7¨‡J`$Çf4$?ú ÷ÁØÁãĦr…ër0ü{(3Øczí¡´ôÊ7ѸPö†¸ßI4…¡Äï0qé0ƒÕ# vGÅ¢c®½¶¸|n¶7؇š‹{¥Í¯1š‹7¬Û–?¿=Ù|×íwmNĆ£œZ´¢~σáÑcV¹…ÐE¤ŠÎ±F׈‹ÌîìŠÃ×_VË¼]¼šÏ–ÎÄ£ùêÝülýqtbËh‘|®…cÃÛ8c†§v›\ˆ¦È˜nFáºU†–HíÖ•Á‹\P†p¬u„2<„ùp£¶‹£Ö¢_´è[¯ÈÑ-:—5éGº Žô-¿~¯y­~GL9’;Q"LøŽ ›®p¤›ºR#Ö(î6h²O³;*ŠeŠÐ×þû¤õlyºI%‹Uç?€Ö‹þ‰±ßôŸSŒ]Y¯[(¾Òpjý[Z;ò–vŸËl‹ÀöVÖ¶·²¦£k<ÅšsÈHÊìÿj@m?EEb¦¼ÿpâÙ“<}p3îã§¶-³ÿ¥"ú¿Nü8µ–+rà}w™ãœhÀa§hô?¶ø½0wÿzð}$däýΣ¿F!"dAò´ põ(z‡®OýCÇgOí·µz½¶ö¢ÌG4;8ZJ””où.ɬŸìÈ `uWl;|˼‹ã]ÉÑÍš|ÆûYpU endstream endobj 563 0 obj << /Length 2371 /Filter /FlateDecode >> stream xÚ¥Y[Û6~ϯ0v_d æŠ"u ’l;˜"MïÃ¢íƒÆæØjlÉäÎEþûžu™(™iŒ¨£ÃÃÃsýHëEz‘‡‹Ô•Ûl±9¾‰Úì<øxõB ß W#Î7ëÿø!Ž:Ty˜ëÅún,j½]ü¼Ý§Î5Ë•1&°¯–+kãàÇ«wLù¡<8-3ÔͱèÚå*²IdƒÔ,]ÿøâûu¯@EÏÔ9ŸPU‡¾ÚE’Y¥e}ß :6 Še”÷ËFÍRBíöE翃j 1KÌBeS ¨õ»ë›µ°M6‘²‘öleë%ÒãSYmyTßñsçê£ëš‹Po—«8~s›î%Pbl˶+«(v×ÔÇo¨éDÙ0õ‹wMQµw`ö9=ãXã9‡u—+t ',V&ÏUœ&‹•6JÇÌyê²O7u…ìÜ:)îáÞÍGê¡®„·CÎ ~MÉÚÆ²—Nú-¥í—èöžFÂø²>–ü’Åñ䣬¬f’© ¶¨(2¼‡ë÷à:¢xd!zýƒ¯XLN äèÞ¶ÇËzv±†™gúÌòÐÇ“”R<ø,2ò± Ð5TðU”ŽdAŒÙËlÈE‰ÊlÞk†Œç¶cËÝŽm^ˆY‡]Ï{à~_nPÊž§ËÝ_Å«{JŸß—^®¡EÀí®’Èh\ѹ­È*;#Þ4ÁÕÛws¶Ó*õÔS¿„q¶ßòÖÖÝ•g8F¯Ð@ó#œ<ôcëƒx=gÐÕ(fÄü`’o‡™ UÛ'­}F¤i«bkG‘Ö~%®“ü¹Põ,är6IiÈ%ü Q?Sw*€L˜ß†Í`œ>¹ ̘üÑ6þø§ø³nœ:5¿}ö{øKùéH"×H:µ³%<„L7ÏϧQ ŸM§­û%Զ⌰S;)e”36É•µzÓLVü2æ\aRecóç"J¤®??/©žÊ-keêŽ×³ACÇͦ— úæúýëÿ“žä*ÚÚA˜F܉áYl¨Ç9.[t8äMY@†à®¢+˜WêÚ®¬d²3ínK¿‚ôÃ!" ìÊßËjÇc,~”€y¢LO°¢£8“Œ²„zd”Ž2°èʺj_"€úp¨qÉ{œ‰Ñ…¼·Ôje!”ôäöÁ2ÖhÊkù öDŸý>‘Á× Iµ[q¿¯ËŠÛÃLa­%Þ×}?o¶6z@ë>H†ÜѱLä½qi  ùTVÐ`‚×7o¯I¿k~÷ªp‚@Øbé°¥#@“¹D£U‘Ò¦q\}\|øÏ¿A1ílÑÀ}§?5×{¸l„™aŽ5B-Æa}` ¨Ëa¹ÐÐMÏî,x8ð¢wˆÜ$¸N éšÝ[r¡*[U8‚ÄÈáW0ùL¶™Ü¨#Õÿy°¥=¾-ÏÎUšìI¬<-8/9A,PótE]ñ‰2Éš3­kJŒRc á³Ã,.*2ì ûŒ‘™¾Ç"@&6u_QOÁVÚÙ=am‰ú¶|®ÊnvO“~FUuœ@{›$ƒ: å†rKväËF”G*ƒÊ61‹o5~¾ÇÝçªO/WŒ‘Ü´¨'಴ž«ý“*ïûs_,ðí»GLd"éPs])·*®®w‡U}‹šÓ+É€ywfa[š*ó¸Ó—RB|aß–,’RÉÛ´åKƶ‡Ë.D+Õ®žmYFeq2µŸÏ¤…é1ìyp5꺃ͽµ¿›…vᤧþ¥* ní«h”r]à gŽÎ1y×Ôç7IÈñ³üT´<¡8ÉY´ ÜçR.™H€AÝ\˜È=2…h¯Jhº[«§ýÜör<´@`ö¥GNE×¹¦jû^è{Zß èlå^'_kº«¨|“¬˜Š•¢ØQÒ‹¼'m±kNXÆb,?ßlxcGYvÔÛ(õ§Ÿ¾¿fg}€*tŒŽçù MhPÁ—Qùc9ÑÂÇÑm0éöTÀËöÈTö0 \µ©©—o©4ÒÄIS“à•Qޤ‘O‰žZ.¥zEž«/qGM‚ Y—øåÜroM1ý‰ò‰°—;ñèCáö‰™ÛÙ#Ê„ï-ày*Úvú- nGs¥;àlÀ ³×¥“ë+䆹îc«80ßQlu†,ãMj¾ ›Æ› ²âáÕsKYïÒ,‡Êòw.0ŸœœCîÖÍ 6@½¡©ºÑÉòrrOY¦¬¶€§·gÜ$¾bÈT½<µ'·)ïJÇGÛ•;úË£#p ›E­ÐK³§™±•Ì(L¢i‚º$›\©À—#;*ám8T&ÒÉ+Èuk4yÄŒ'WoÎÍA†·z®•Õ8zZV›Ãy+’ ò÷³c'k=`#äñ™¾Þ‡•¿)lVTÖ"VŽee4#–õÞÍÁ5 Â$í{=EðEn gQT¬âP(J[wð+óÞâQf‹d&Œ(38lÈÊ» S$Õ€‡3‰}+w#wÌÇâ@˜OEÓ•›ó¡h¼a¥ûkQé㧦Þ5ÅÑA íöüqÊö†²Mw¦twŠóÚOgØ\Êúü›±˜5*~t¡;A†Xn4Æ5L'ýÖ*nùm[+ò·-“M)8ä Ÿéb–‰£ ß2e0ƒŽ9[Øm¿<ËŸÛú*ÎàäŸNbï«gˆD¥±þú¾1.CM¨[ä£ßt +evèÚÄ–~v€À[ :‚:¢ß¦”ñ~új˜?÷[Ät.¾ŽNdxÉqû yü3nô×—ür¢'³ «nऑæÑXõ¯ÿb♿­è#‘¤¨â# ÚpÈíGGe’þÄó·Ù üfC=Ÿ½òáÑY¹Š‡UäG&0Ѧ>%Ñ™Ðömß·¿Œ7ù Û|š½U-©ßž¡Ö$Ço?LÒ_  *&•ñ¢Ú œ"=?$C+C¯–\a…3'Š?õ¿…@—à5î÷ÔÌ‘Sž²IMзևÃÿ†xé÷ endstream endobj 575 0 obj << /Length 2446 /Filter /FlateDecode >> stream xÚÍYKoÜH¾çW4v/20RT/=²{I‚¼“H¼˜ƒ'¹»Ü­µÔ‘ÔvŒÝü÷%‹,µ$ËqŒ½ ú ’ŠÅ"«È«~b•Ç«T©(×Ùj½»¯ívEƒOož¦ 0Q¾8òôµ1+Gyœ‹ÕùÕ˜Õùfu¼Ü‡Þ¶g¡R*ÐÏÎB­Mðñã›ßèËë²²<:ËTдû¢ïÎB©©ƒTŸ}9ÿõÉ«óA#åOJŠ”‹šd:J“¨­-6 ‹Ìƒ²¦gßÐómög2 ®K{¡ *8ßYx&cžBæ‘É´ÿøþý«çL9Ù]«(IsOØ\ž…& þm×=‹ÐÑóp&@°³Pm¯QËBÞì,‹Y5ÅÆžDš%ÁéKQo† @ªU(RÉÔÀ@EÂ47mÙ÷Ž;\LsD‘”ö¬‹u¹¥BÃájX˜D:Éiå[Ûò}:`UÁlì·bð—]tHÜÖeÑ—õ–Iiòw²P¼Úü^n,MÂWØKzù×'¶Ÿ›²ß1Kš9”vÍ›4WôÜÂ!ؾ½}¶xa*ÊàËD‰ÿÀ]Hüöî³»¹•‰R™Nˆ)þIsà^ìì¦mêïnAÌÄ‚©½8ê7/ß‚<‡bkéýí§W¯iÄ\w}xöôéÍÍM„¢;£kÚíSšýN[„c¡xŸïKvN4d¯|‡Ÿ›à²¬‹övéX´‰db~ÎŒ•ОðÊ901GyëµØ ã(¼sþ ó'Ú„iMP7üaÝÔ]Ù¡ ¢ÉÑ7ºk$ëÁùÜ QK³SÈ¢c©¦gê†2U¼s‡Á~¶v3"K"‘¦+“dQ¾P˜‹bðØHH‡9Ó/cðñëÚoãý P65Jª@§(#¡/^ hÖàË/èC& [ÂïFÍUQ ðHåD•ûQÓS? øœ©Ü§Î«v་øð¨Õ`.u±·KF%M”åBÖ+¸€Dx¢þöp?+5°j­?ÀªjжnRå¨ÔD¹Ñ3ËA v’4žð΢lêWÈG_ÜöVœ†rIü ¬&órEQ´¸Ä¡'BV–]dȵ™¢XYƒÿ¸ˆ6`¡6EÏ(këuÕt–ç]ăùõ±­àînéí²-Ö¶ó¢D|‘™ödô‡CPo ÓÆ$žƒš:dè-×ÀN£\¢\”ë–AÜÌÁ™ø41Ɔڨ »åÐóÞQm4â@Ç$.€fí&ËŽf¶%…Íš^K~öž9úŽî8ÜZ8ƒš† ð r0*±Ò`-*}48ðêð´|ÉÃ&[LEE`ÈixñÉ^AÔ­á¦ÈŽcÚblÆ I˜;i•/IÀ~àn#)ò@ÂS‡#ò%t›1uR8Ę»´‹ø ÀÅ`ñ[2 |LñõØôv”ŒÝÈ)sò1EÙÛ=F¡$ º]sD/ØÐkq8¸\Å-`´mQU·ôz‰ b€jè%%É:Ö·ûz$èArpª3™:«ì=ö°|•Ì.íØÄä¡_`,8#Q]ÖãÓ­æ€ÆQT¿ø¬k³œí€aèá|ÿ»t*(Ƙ$*mŠðvh^CÊvðÖkTd×”S¨P`ü`þM€@ZIuŠHZ ½x{u·.±¿t 7"¬V™‹¨Q ítwÁK&"Š¥„ÑQ þXøòëÃïŸo3ƒ0ÏC §¸âsœ¼ W³ˆ|¢ÁýhÅĈ;céO@R“&#QËâ4È8÷$¼U´Çø;Ò•gc‹j¨sFEËÔb=m_”•KOõrü‰¹òt¥ ‡ÀäæÑˆ×‡#K1h¶Íô ]=W(bRꂼ/¼ï CÝ$’sç&³ ² 9ÑäWÉÔÈ=gÊÙé2©œ9ΑI2½Û“ð‹ÔOc¯”*×ö}¡XhG~BÇgDZ.¯n‰æP~Ûš¥ô GµÐÀ–\io¿õÇÖò.÷€†ÌÍ@ŒE£å£Ç/Oë—î`ºÉ¬²áœéûâÜÕöNvv(É›Œ=ê=x øÚ•‰sp5&»[À Û¦ÿɃ S‡#òÅrmÊt HÄØ²q4] Êu 9ÇúmÛ±ó‚ó%šFG$.“…okÀí¶àxq°´Ã°¸p1T‰žèö¨ äõh;ßfà sÉHä$ò)0$ ‚÷õLN8 Ä2U((t¡RBFéÃ(S‡#ò¥ ›1¡º“R&Q–ÎXϹᠴ¤Á ʽ ÊÜ”‹ä0Â^Ô"ØÒ»¿]Sêƒu³?´%U[#.‚™5ôY3±K,Šº¶æJSgl:C+mƒæu]n¬oçù¦ÜÈqpu†IJ½u 8»zê8J!\‹6ãB0ãòHe20ßò¢«¶ÙÓ(f¢f1ÉÌXŸô)ä¾øv]TK©²ÈŒ[GÄÔCfo€~¶úYœa+“ò…-!lCšýÈÝ ¢¥»ÒÇ=¥1l"ØéÈ51dW–rÑ ‡15iûÂGF=ôû–#ɤßXFûzÃɤõd¥¾çªFýM‡0h®é˜Qu㬂zåOÎ!‘ß©õÑùŽh: d % ÚÉ–W  Æy9˜°úÐDØ«“àèpÃ9Ü#Gv 柑à3Õ2¶­½íÖ…o7¬guÜ—µOøøÆ31“ÿ3HÔ¼ó#™UQvŸÖbuüŒRµ|¥ƒz‰»–¿,v­ ‹có¦ªÇuïÐНGë*A6Ϫa9[ÍN¢õMž±ðwtžª §çûÿóUñÝÜŠËêh—„Kg«ÿbBÆwÄû«_½ –ÎúC¾šx”ÑÚý†zé8[_#b”ÄB{øØPÂ[ÖP±01ª •'Ð_Òª ýáS£?œàP 7=¶íнŸÊÓõ­-öÜ΀wçšð¼. ¿›Ð\/Ƴv¨!0(ü«¡¦þ"WîºrIUç"qª½\”ƒœŒ$¡¿(p–ÿùKõÀ‰þ&s§06ËT®ª?qÕ>AHÍé“|n{ú?÷8ïùÄ"+œ endstream endobj 585 0 obj << /Length 1590 /Filter /FlateDecode >> stream xÚµXÝoÛ6Ï_aäe2Pq¢(Jrš ÈÖ4È–®Xë§¥AGKt¬E–<}Ô ºþï;’GY²•6-6øAu¼ûÝ'ïL'üèdæM"ÆÈ,ˆ'ÉúÈÓ»ÕíÄ,Þ\Q¤sÐíQþ4?úþ%çê‘™7£“ù²ÏjžN®ŸWbÓÈjê2Æœàdêw^¿¾¸2;/³\âj3§¬Ö¢©§®„~àD|z3ÿåè|Þà¾ÿD¤ŠòËPÃ8 ”j‚™ï;QÕ2%J6‰ûG‚ ã$èó•>Äæh9iöΣ ÔåÔ‘Ec>.áÕwʵykVÒ,Ê<5‡ÞyÜEjvS¹1§Õ™D­D#Õ#2Š,ä}Ó"•æ­Å-r­7xš:‰$Š‘h²²xÜs¶+ħœ¸¨’K¡Üèe òx·°8¨(a6ËÂM³úμlËVëKùToE>uAJþ`Ž-,\ 0âݪC*R$z0z·\ÈäÝ0ðó‡ÔúM˜7#3ªTá$Š©õÆ×­,d¥@18õC1õA?qo>–Kó´zI¹üÜùK&* ÕŽv2åÙ:ŒtË2ÏKõ¾­OkØÇ vagêTËùøÜ99ùAã§”<@G áµ!9þxl7S7Œá©B&i+e\µ½¨D"Ÿ™5êi?R¦25ë¦4ϵ¸3Χ¾Güˆ:_QÉ)ãèãöK¹PV1ë¶ëEvÛ–mMt„jW ï)£•ß)O+TnT”ê¸/wòa[Vés+¦‰¬kQ¡^Ù>¨æa3¦Ýå¶¢J%£uVX“,öØ$e¡Ò ¹]eÉ 6š»70V[·;SgO¶@*—Mp ´±pó¸ÊBæª" kbV;8¥}®¨F-›&+nGÈäöAä-rYVªV ¬R7íry`úÛú Jÿ£¿ù¾Êˆá—ãSk‚%\hÊ#ßk) }bH*)Ò}ûH¤bµC4ûE<'{.aá(–¶–ÖhU&¹4yyý¼÷ýñâØÖ(Åq¬< ¤z†vä ¢3ÎG#ȼ–ªËçÃth‹Yç@c´Cÿ'¢ª2QÖUâŸäÔGU$x cGcS8îùwõMÓ‡ŒÖmÝØd]#m.j›³b©ûÏÈÛfi³²I”ŽXe%³ÛU³£0Öi× ËØ–Äd% 0彘E„…Ðzø!ažq¥÷J]ÁAuÕ°º´M骚•4Ö¥»˜1•ê•þÞuK,$qNXmPØŽ)€ 18©ädyô;¶Fèä¾2âslålŒmʺÎý,UÚ´"¼±úfý?Õ|R6Û™pæ‹Ú>\Ú^øMjÛ8î•Ï…ÎêiÆ¡è|ƒÆ>4ÂŒc#Ü…¼éõtod’-³D7’óWZf-îá–éD[ÔífSV 2²Üåöö9JC(2íÄy(È–ñìçoç¯ÎÞþjÞ®_^^ÍÏßÜàÛG\œš|<ÿíìÕ9~ýts> stream xÚµY_sÛ8ï§ðÛÉ35WÿHêî쌻Ms¹KÒLë}ÚÞô›Žu+K>In’oAÊ’+·i77™‰!"@„ø$„?>IÃI,Ke2Yn_„v´¾›ñþüw|3`œõ8_/^üôV© Y¦|²X÷—Z¬&¿m²]kêéLÈWÓ™”*x÷îü’FÞæ…qÔ4AUo³¶™Î"©#Äzú¯Å?^œ-:T=QRäü†¨\ÆLOt"’¤­ÖÓ™½™/æc;î,LÒÞÖ"L‚fGˆ,óõ#døüµ134wÏDÄfß¡7T·Ùmá^{\ç¯áA§ˆ`$#úqxZoáÄ ÞpgÜnåŠtç¡f<ú^Õßœ}X\Í?üó$ÔqOßHòÀüwŸ§­³X(Ï>¼1eI¨=‘3úI.Á·x·´ §ŸÜè0Qwp¦H¥è×%ÍÚ£†„¨WÄ7€gð0àDÇêýé]þ°ÍvøX·VìQ¨ö,.dì}ŸvE¶4vByIcv$d»!bhz@yz¬:X™¦ÍˬÍ+·ˆ·-2ÃŽpzþ¸ëH-½ƒ°u{eÅn“ º3~oo‡žˆüÆ‘¢rE„G顼‘Bb<® äm^:ön±QG‹´daäm}[ì͘GD’ýS£ž*ªÒ°ƒfi”άFH,!Þ´4ÒéôUB=¬Åà-1® WSqç¹ÇÜ;†øõ•õ†Ê€X Œ¶Ê0ç{:e±J`R¸ì· l£ ‹¾äq`Sb$È—€a˜p„f¼J0p°±úHÙ`‚=Žm2G´­Y•6pÃ=±â`oSÚA2„³îdqÊÛsŸ€cܘ–{zô‰Ì $ñ“£Õ!10ÇÌÃçΆgK³C«¼[OA8U]8Ë×$,©â{DArGì8áDUÚÈn)÷y@fmõÒ?aZèAà¡'ÁK0âï2s]‡}ƒ!)´þ~ ¹, ¢3ë9ô0’Ãi}^j·ì¹Õψ8Æš¢›³gt±^7béCbD™¬œšŒ-u2nl±˜‹06­m‹$îx¯hÇûƒ2N["A') 0uSM^ÞŽE;I¶wy#aPm u'‡`,½c}n*k„Ϲ¹G¯ÐP'b%€€Þ[×QÞÉÔŒEAE$ˆCC ªô8¾ÛdYÅ@@|´+ö~¿º¸ž_ÿ6Z]*,ë‡nœm]Z°û”~RØî¤æ£k[Y¼^/¿–k¢>køÀŸjž¾ÞG¸²„OYrS ™7'0ý4¿¼ùûüÈþ`Åó+žXñ¬À¾‡ Á)0ÿ€cü¼8ÆÏcüÜ8Îÿ/@r5*'gRɧ«ž \ŸÔ›ÿðYŸRwb'L¨£úõ#îÖ[—#Ê€)¨Kú¥›ØÖÍSæ¡}5Ų7•Ý6U±oÝÓxé’P™kWÀ8b“ãªÿ±ôp“‡&ÍϘýÂÀÝFãxÝÒX§"ÕÑ`Bĺ cl šX±4\r`ï­¯ mNoip Ý®>ÀH—Md ¢é¦Úšvƒ)˜j²$=ºù+Û—‰zWäðyþË›R3dè®L9õµîŒsMÛð»&ìèšã;6’kMÁÍC %Ž9;¿<^ë„Mf=aRWå;ýÜm3_9un÷íÓ´ùÜÉ S45‘K_:Úq7ènùH4hvXRAEƒEø¯_‡ÅùÜi`~¹ßd­ù쥀£a:ö_¿)EPVx ên®‡Þo–ÙWGÖa}‹ïØÑ`•­ÉJ7fï-0Ôk,ØáÑÞåÑEZ]¨È«×50ôNibiF½r抓~û}ñî[1îæü +lÙµl´7¦lܯۻ†ÃÜÚC ƒ™›ô× |õ®6³ÊYCsÃ;zb,º.áˆoÜ\ƒ8‘ÖN†HÇvéz‹8è¤õœl¼ÛÁY";MO¡a­ÞÝ‘áfaMŒ+SߨþÓ=Ù»Rã—ƒ„qÙ¥õ:»Rk—#]\KZ¢¾Ùí5¢gïǤ’ -zÒp«`±¡H ñàDñ YœªX^ŠøèF½ôWu˜±çö¬vmŽ—É2+ ‹Å*.ÖŽ£ísÆÁ6oÐ÷ðƒ«¹~Œ_iëÜЦA@Ň <¿¡œßÐuqÜ9’-ºÄãÎ7ŠÎªô/Œ5iÄÄ¡•ø]ßpÑfˆéÀDƒ¶Ú³öb6$PY ^pž%’/:ëÇ-:Vn4Ž{c€ò¾ìê ‹´èÞ[{ÂôóïÊfy»‚à HôaûvÖÁ4{l!¿[v[¸WÀ*#"Û·Õ µl±]FÁ‡ó "|Ò6O½FgrßÕhN…Vr|ØäM[Ùû7=×&k*×UÿË…ûŽÑû€Ÿ™l«ˆkÓÞ¼¾‰õ]\"VNx8ˆ`ë£lÙ: àÑIྒྷÉX»&*LõtwvézñÒË0Øk¾¼\{HAøÂõh"U”ñá*Ä´©ÃÇ“ü,6¿¡ Ó‡ž¤ζùƒ¢Ð&ÔÃÁ\g3ßr (Ù¶Â ]ñœ¶:lx+vE¿h:ã?‘þ”ÊV2 endstream endobj 593 0 obj << /Length 1872 /Filter /FlateDecode >> stream xÚÍYYsÛF ~ϯÐ[©“áòfÚ;±5NcÇc«OIfJS+‰ E²<â£Óÿ^`R¤L'òÔm3zà.‹>{HLLø‰IhN|Û6B'˜Ä›¦¢–« 5.g/óéÀ¨÷8æ/^ž¸îD˜Fh†b2_öEÍ“ÚëuTÔ²œê¶mkΫ©î8®öþýìQN’TrkØZ^n¢ºšê–ãYŽæûÓOó·/Žç®eí©)r~GUáø†7ñǶCÚF¬„Z”ëš¡©ÅS+ÐÖQ–É”Æê|%ë5š„½›¤^#Ј”6›$‹²˜»yIã—(hvDÄETG€a›Ú»ä ŽÈ›¤’Ȱ(˜óÑN¥˜¥ Û.iš7uÑÔ]hù¿>j‚î†D% UKk2NPª\Ûi=p ­¬hÒ5Ë— Ù‹íkâk,2Éè{5;¥yÉ&ZÉž`n/Ba…¨>X#ØïX‚”ôQÉåQ"ú\LG;<;àÞù6ÌnÞÅŒ J@Ö7}ítI4r±zØDõ@§”»KyÔŽÁÙyMS¯ ³1•âÈ„º­*x©6 ®Ñy¶PA¦6¬œXyã 4ŽBµ±•z*—5Ñã¼ÌÔÖ ÌM×dÆQSñL̯¨ßǽç¡‚ÒJ[ôÐôÂ7D`µL?‘`ÞP4å$mHºmZ†°Ä0k«ñzª‹Ñš´S!ÿÖ'àu“¤u ¯ŠJ!S$1.s>%}+›»ºö’wYµÉì÷-Gµèñ¹æ EÈ|3¨•#˜¹x(Dë¨lôE‹ìý¨ ÃT:ìÆá»ÁPµïK_ŠÂp\gG¾p 'pŸ¾”²‘%, ›ýðÁS)ga¯´ —ëEëÀ2oVkêŒ./HX·¾ˆÇ4qlÓÛ1ÖBēἾ·Í±»„iXÂzú I1ºTBÏöú€šaø<€Ú°îPƒo">ŸÝ‚"ç¾ã Í?å#îΕå™2©N–Ë}B‘¼ãÂíæ©Îötÿ1¾aóÓ““1A¶€Õ:Gp±õáÒ×^°M…N/ƒ£Ôû Ï=H¯š‚<Ÿ—5:ß‡Ã è«Æ°,Žh¥ó‚ƒ²0Öy‘mFý^µ:;ä­Œ›:ºNÕž`áéŸÝM;KØí¨•ð0ïO0¡)Ëî¼y7túÖy©þÆÊ'wŒò¨^Ì¡bЧº²€]á9\yq>9Ó°=oÇ“h`ëI†=‰WYr$’w©S;»xÌ‘"ã„Û3îQBé³Á€½ºïIÄ7¦ÓµÓ»³ªm6ãªÒîżß:COÒ±>Ÿ¿>«¹ò~.äjÏòñ@Ž0<¯ôöâxöÃf7ZùÃe·xöô^=S¥žžüwé ÐÁEa¯ ûÀ‹Å>þÿ&¸»¯Ç¾u éy ‚Ú µKõF×$Ýöíîņ̃3æÏÐ Û»=Д޺]ðe¤¤z‘°ñîçãÝð‡ë_Eƒ½—<ìE5Ý••&ƒÝ‰ rY Ôjð½Nè1ÒZÖÔ ¼ÝGNhpZÛôæøj~vxõëèÙÌ5±½:¨GŽP»À)/•¬æö¡„sRø Çò†I¹}D Ú[0´}èÝ®–Ô+zÆýë4já†íóD@äŠÚ¬¦Ã*Ê’{Xkäˆ^Km.ÿ7õÔõ0°ÆAsáð¸Å,Møaùƒ®¨?‚S=»l¿7=¶ˆ…àÜ—³£‡£’m$;;’«hS¤²2¶W’À·!Eˆy¡†¯ú&W±]~aÀ¦:÷{í›4Úw‰Œ}eÄa¬z˜-:£:úºLÀ.PoXìµÏÁÐäÙÔÙ`"5-Ü—™©ÓŠ:®Y¯Qs%Š¿ŸzMÁ?-þàNWz endstream endobj 597 0 obj << /Length 2488 /Filter /FlateDecode >> stream xÚ•is·õ»ÇíŒW^,°—¦'Žª4’]‹™~H2SˆÅ÷`÷°¨hòßû°Ü¥à8ÎX<àÝÀ!üø"©,—Ùb]= Íj{» Éûó'Üî[ÂÆådçëÕ“ßÅñ‚‡,s¾Xm§¨V›ÅOÁ7;µïu{¶BòåÙRÊ8xûöüZù®(µe"hÚJõÝÙ2’I$ƒ4;ûeõý“7«‘8Šþ$§¸ó3¬FIIJ/’L2.$ñÛfA§*;S#èJ÷ï^_Ò|ÝÔgQ|Ä? Ó4è XâÁó³eÌãã¡¢R·ÚY¢`Àè’ Æc¢Ü´›¢V=ª#O‚î¾ëuÕáGìTG«Eo'M[Ü5AiLˆNJ½í_ôÍžÀ릭uû|F‘Iƒt?tƒ*cÎpè)êiÉyÌ"PÔ’ç,‰:ûæ°/‹uÑ—÷„ãÈ¡ÖÅÏ!—z3Ú¬ßY´3õÇ)Kæì\láP’¨¾¦ÖôјE',tHº³ŸH7Ñ…Uuc¸i޶±»wÍPn#¸ÚA;0•H©jÚÕGrÛ¥OwHíðÿKòožò…hÀ ËûV÷†%* T5}ël¨UI_sDû¶¹mUõ OH+:}´ÉçGxU"ƒ ¹º¿DÐjµ¡õmÛTÖ"ÉÔ"<Œ˜ÈrÀg]¯¾½¸òYNpp·KÕÂ×è¼H o|è“É<™`ûãÊ‹^2‘·AÌDq°ÚM,úfè÷ƒ•ªÂCQË(ÊX–dsKéˆ: e@n¡éÃŒ×ç8‰]ŒâÚÖ¤"ô B´Í¼»º¤ âàÝùåôò, Í9?âA 3¯Ý1nâá|£zE3ã[Âç[‘ó­p›Ç¯›J÷»¢¾ÑÂ((‹6ªd(l’ƒåmS–ÛݸÓEÎïÔ´ž£MCt`C¹Øh»¡ß©ÞÍ,ÊG^Î'nîñ2²0“Î{þúð·—o~qSÔ/nømMBò¹)‹ÅèŸúPt}‡Yê*?,êõЫ,Z1¤7ãüØ4äXù!OR ‘ÃÝQƒ”sõv(_úD@'žkŸ1æÓ™5†ðxþš&O?!1»ù­ØGOiSJà ¡¨öžæGÄÆ¢w+Äÿ+lÂ9Ë!œež²±K–gDY´z±}ò/[uçÂA¥•YÊÂT†ÉáÆ“É~÷ÉlUqj½åc¥]5¦˜šÊn%ÒEÆ…}[`i-¸!àV›X݈ÌäŠ>mM¶[PüÇkÄQŒiì3ÎwÌwÏfŒžë¥Íl™0èfºh*Š/$D]Y’wõ­-ˆYm(}rh*È­ü$Lº˪pxú-R´HECÏ¢íËÍÚ'Ì™ŒÇ˜|æï2D’³<¦ËÈRÛe\]gm!Æ„%­ñÒÅXÃŽQ|…ù¸„‚“yæDt&‘¦€ÜPÑrÓrLé‰`»v ;“Z—í3)€HÄmUÔ&÷úª@aMÇyÊ¢læÙkô¹œŠ±™õ®ÄÁœH{tÑÆtÆ'=Jˆâi&ëfÙZaƒÚ½B‰ÎÖÑž6Sß9„„À~Ûº£mª¦QÛ†¾Fåf®æ¶V‘`Bžt~Fãq8ª¹vÞjT €…¢ 2êS‹`ÙQâ5¢@3ù}1]‘ŠØ½­Kh¾˜w»‚úB¢¨ëc^èh ùý>;&ecÇ@¶ÍPohú‰£P )˜LO”óI_‹ÿ„3@)âÑ:Öã86ùP r ©Ãd¨éqÚX˜ÂLƒo†àYÈD8ÚãÛ7׫˯¯ÿéµG M²"¹œ0Is2“¦ÔÄx2FºÍ–Px:‹¹jL%y”Ä«ª×š>MÇÉ{4ÖRüxô9ÞÚ3E]ôXETYüfý워 cˆÌAK8âV4ÌøPå~§–'±¸;_é3 9ã?ɧúl¸ÎÊÑÅ+uø—ŒÏöÙ˜“((˜ftsmª¢ï‰ÑØ]¿â”8¦µ¹~lË$̶¦¼Â6sá«Û¯éË%WØ`ò(,ýjî*Žš1dž±8LO)s3ÇrC÷W¨ý¤{+CÆ÷È ±¦°ÙÜ–žõ4Š5G’ÉÐö  …0m¬Îr¸8©ºÃ¾žn‰o!Îò«^÷Þü‚6ƒˆsï ÿ†«‡¹ös´¿L¡!6K»$’¡\´Å‹ŽFH¨6 LŸÛ,&»ó.")FpÅæ|ô„‹«ëëG‘<d’¥b¼šKu¹Á>8LÜkt`ƒV=ë|d—Br–Å'½ œè›»¦…»€¯ÿÁé˜ú‰Ê]—vvqŽós=é~|)HF,b‡ò€è¾ð†A }ì(/´GгíÑÑ:çp®»šðý¸¤Ot æî¡ Ë2êG‘ÎúÑPº~4$„¸0AÚÆÆ \AŠzm÷R§€ëÊ+p ¹­½úáâÚ{½†F99–J{ÃÖ¼‘#{ºßOïΦ¾Áx«ñZÝf&æ·”æôÿäÊÊ¿V6ŸCl²ðä>e_ÞzUØh§'#aoå°P5­µ›‰3ãANÑ® ò…MÈÊX1Ÿz¯X¥ÝÕƒM&Lfñ"˧yØ8Sbó ‰1>ã ;5{Ó¸>¨µ}†“¨çƒ2ei&¬f.Sb«’ Âû`âìïxIO‚‹š@“£ûR­MHW\Òì–ÑJv£éŠš®@}›«t²èŸu´ÐÔ¥Å\i…û¶ÀÁPÒVÔGüÚ~‰åPê¦eÞ†¨Ë²3£#R?vÇJA;:½W-½½¢#M`ãýÄÿQé5 4* ÄTt¤ö‘£‰Ò¯ï­§è,UF!½éÄC¾ð¦Y9‹“9¥/GT_ÑõýåË¿[ÜÜÀ¦ŠúÉ><ØG_ ®e0â ÑzhKûpÓ‚¥ŸÓüV×`ØÒj­ÍË ÎÑF8VêÙ†ã%1åó˜5õ·éÚžÃôV£˜ww–`ïëùÌÓ¼SxáUƒÇ¦½¬ ¾-ꯜ:ŒN3žž>hÇ!³¢Ø ‰w£²Í±•¤ÓÔ-Ú‡¢ÿ½”»§ endstream endobj 604 0 obj << /Length 1744 /Filter /FlateDecode >> stream xÚXmoÛ6þÞ_ad&o'’¢^²®@צÁ†"ZÖömÓ±6I4$9qõ¿ïޤdI–×b(PÒäéîáÝñ¹cè,€t–³˜s’†ÉlU< Ìju7³“÷7Ϩ“óAÐïIþºxöÓ!f4 iÒÙbÓWµXÏ>z¯¶rרjîsνðjðÞ½»ykWÞd¹r³yÂ=]²©ç> #zq:ÿ¼øýÙõ¢ ûF¤(y 5êCe" ‚‰Y”„„òÐâÍÐ<¬z÷2ß+;ÝTº°³fë–êf¿ÙØéÃ6[m ÎsýP Eä௘ð€°ˆð€Z ÏëìÐ(UºOr-›¬¼ów:+»Vî‹¥ªêFGJIÄÅ̧œPáT€¤Uµ«T£Öö+é€K;„‡ÐN¶ºÐwªTzïšJ–õ\mô ³Ø©·Úï²û]¥ìdùØ-\ÚÚ/×­ñF;ã»]þ8Z2f‚á :Å÷jÕèÊ΋}Þd»a/ I(Ò1hq´¿Î UÖàu|ý˜†ÓËWå˼ 0ß‘Zcæa1Á½ öJóЈBûÄï’±È ËÎðŒ(Û–ÜÀŒö!ü –ZéD endstream endobj 609 0 obj << /Length 2039 /Filter /FlateDecode >> stream xÚ­XYãÆ~ß_!LB!#šÍæ9Þ,/v6`Ï›ãJlImóx쌲ñOUW5¯¡ì  0lU7«¾ª®“bãÁŸØ¤Þ&–ÒMƒds(ßx†Úœ6´øñÓÁçvpp79ùÝã›o>†áFxnê¥bóxœ²zÌ7?;ïÏÙ¥SÍv'¥t‚‡í.Bç‡>}&ÊG](^méÔM™uívç‘8‰·ýåñŸo><Bß%R<ùj´€%+d@P«®ÉªöPìR±Èw¥ss¶ÕP:Y‡Oáê¢/+¢ý[55Qÿå…žfê¡®¶~—–ßéjÚ©›\WYse¹3”¾/Ü8¬à?ÄFn˜Ø“õ~» CçWuØî@TK"ŸÎªQ$U3 Ý"¯ÍNž%r³Ò!1)!`>dÊá4,¾~:ê‹*¥@Uá®i ¤ïzÀÐ{•™ÜXü:€¸úb@©P1¥"P¸;5XÃñ#mfÆüW"æºTU«ë \2’¡£¬ÙB¤à9‘϶„†Äî 3¸m¢ñ̯Ÿ{‚ÆD«)OÆìÜ8kÆ?QôjcÉ(œ+r~Ý ”ÙYA9Ã93®Ayú‰ší¿T4rr`KΠØ_|_º¡sU5ž÷Rù€¯Ÿé'ñöÇ\M_âÛª¡ ƒNBèõ©¥_–Šï¯™+ŽÝ(–¯4øwpÛZ÷ IH”T‘L¥aÝ,ð¿° lj«ËK¡º+®l!™¸ÀrQ—,ÏM,©ó`z&c´D4IH£I•t¦w ]\²2ßÿh¶¢6€HÒ1¤ƒ ±œF?AÚDC_]WŠ1ç$¾âàI ˆ“dî&aÊP‚óe§ºÊ ü˜ ‘ œœ~³!ð ú²¥PN®œºð”*Z“oè`ÛЩÎô«;cŠÂ•æç“.XZM ‚3R2¦sE7 /qŒâùÊòTŒéù`µÞ\Ç!®ZªiÆyeÀ¯AW—¾£åÜLâ„[…äÏй~þt¥Ù3½v¬⹞>¢Ä _jÍòFªe¼íš€a”0PVþí(í°òCçáá烙pƒ0˜›êg:r÷õŽ¿@Nà‰þpèt<$ï›ì îi}R\\a·*¥ŒOâcŸeö›"‘¾çúñ"7™kÀcªâ÷ð‚Ìûv§Þƒ:Z÷UVîõ©¯ûÖ5ÎFÎ —â%ù4 mFŒjùÂóŒZõ¥Óäø¸ó›º>AÝÿÖʪÔAµ-6† —Ⱥë…U³fÑÕÒ©\A³UêÊf]°&¤SÏ›ôé¬gØÍ<šØöm?\ß6ƒ?7C®ŽMð̨ÞYs¼Ô€^EÑk¬IÆÀ¦KÏJ«ñeEZÕuº:­¥I˜;]Q'Œ!hü¡¨¬á†€÷‡óo«LàÄPm›a½v»"ñÿ^7ð 'Øö}gÍÅ®;IÌÆ{Ó'9·LÖ°õ.uÛê}¡&ξrYoÿ/¹Á fé|ìy§LËé–NñcQg» ”6ùSûŽ-¾HŠ4¡@Ö¸4ª³±• A¸† ­‘þß´ ÿTËø±h(ÎuYcI€ô¼š*Nú 6r@ótöT½Â:ò2ùÙ¢’].6¤ß/P4jŽÚ²/: 퓵e]ÙË8?øø¸›mmã8ãÛSîÉ¥Õ‡þP@’U]‹¬£^ƒQª¬±J ìOí¹L Э žÂ®fPt·›KÀrBóìÔ.ÌÃ3•©.³&Øz›»ùvÞ¨ôÕìØ`v]éNCÓ³rE“‚lû—ñ5èÇ¡¿.Ì71íðÖßWºJœ§ÎØ#ã.ẕÂÏ›äHÝÐ|{òGÓÎû0 kóù ôö\÷ENäñ>ªCQ·Š·4wí¦B”BUÁD&¦™äpûº†$u=9¤Sƒ¹]å%¥+ã¡&ü¾úÈ ‚¡ˆ»8ÂIç;âhPšRˆàišŠíN5 ðËLY“³ôLþ2*cÖâOÂ]6áfRĵqS‡' u‚2…”`P6ñF©Œ¥nxa,‹f¥c¦iì¹bTõ+ñ7MÀa0'êðmÖÙ‚8p#‘¼näŽÝÀ_Ö¾9·¢xµôÍùÐQ Dz¦É&(Íx)p†am¾›¢=ÛºD#õ‰Yƒ:ßG*ap[4>åÀÆÊ}¿åé/0VõWÏæ”ÉÍQã1+“+óý©.yìUÏYy)T{O/bjF²ý óHK;vÄ—fä¾ÒªÔ§³ýØ‚b‡è‚=HhùÃúGG7Ê4lÿ•”ÀÐÁ‰ñôøôþ³­ke94Û¶¬Q‚›uÑs´šà±Å^4b†âîØ¨üî~Ƭ+ÞXènÌqÓŽc'éé±N³‡Ç Ä㙆yüœþ_í‘$$ endstream endobj 613 0 obj << /Length 1665 /Filter /FlateDecode >> stream xÚ­XYÛ6~ß_a4••"Šº¼=€^Y´( YIÚ>Ð2m+EC”÷HÑÿÞÎH–¼rv?âræû†²˜…ð³E8ˤ q>+v¡[m63šüq}!XÏE ùãÍÅËWI2a°bv³ººYÍþò~Úª}«›¹/¥ô⫹lj÷æÍõï´òª¬4Ïæ¹ôL³S­ûQœF±—‹ù?7¿]ürÓDÑ3#EÍÇ¡¦ÃP…ȃ|–æq dLѾ˜ƒa⵪í‚¡ÇÒÒ¸Óªni Bš(~.o5ÍVåN×¶4µªhÁîU¡/i~W¶[¶«iÜšÙèZ›ƒÅÍBð¾HFñf·7µî^Îï,땾§é'ݘ ³Ò@†9ø;LÂF«©Õ'û÷ñ²o¥×eÍûY7zå<'"Hâx^J*é(rA2A2_ÒÒ FC8erbdx:<>«Î.gGŽÐºVÀ­¡A`O“ï ~;4Ì8QÇðpaÁ–N†=GJ)È,ôi=+Øt #Ñ¡æÛs(Í;w¶ü4é)J‚HDÚ÷OÂý唸Ì%ñóƒyÿ¥‚"ÍdèݸÛž\mÃñ ;¾­9`Órç¾i´æ»© ·‡QõÐÇ”¢käbœ*\àTᔚ÷@™Ðç: <Ýu7W:™w‡”KïZS;éJ_ "v¯t`±Gßu~–<†%9,À?ùýˆ®(¦o„1z„÷” i(kí¥j5æ€ó ©µjF8èVŠªÜïÎ)©fHvdl§óÚ ¡ÆØR·D^ &ƒ¹ÂGw˜®e…lc¡Í­+Aö•ûÒgw5-Ó§©Ÿ¥ÒûaªñóU*Õl&KTŠ(O×ú±=ªfÀpƒMŸ,ôü  ®Ä¥h t!Ü‚³ÏÆ=>õ29.Äc/Å£tUhi^(hqtüå8_ê¦ÄÖµá ˜Qƶ Ë«ck'P«êÛå"òöªácyãØ¥opâzP|§–ÆnK[.»?wô-V‘æ›uÉ×r _‹w®î°˜w¦­k÷|TÍè{é¿OAwÕõ¾1TœÔ?G9qAÄ9ÐþÊ>ø–86IÓ·á¡ÿ©úé>ãt endstream endobj 619 0 obj << /Length 1951 /Filter /FlateDecode >> stream xÚ­XÝã¶ß¿ÂÝ—ÈÀš!Eêk{9 M›C‹"A{Û‡àr@i‹¶•È’#É븗üï™áŒdËÖáîÐÃ>˜g†óù㪙„?5Ëä,ÑZd&­vwÒS›ÍŒÿ~u§˜oŒ‹ ο<Ý}ùmÍ”™ÌÔìi})ê)Ÿ½ ¾ÙÚ}çšùBk˜Çù˜(øþûWÿ$Ê·Eéx5OuP7;ÛµóEhâÐi8ûô»¿= Daø‘–"çLU&ñ,NPÚµÿE…À_òi!5õ ëú™YÆ¢¡Ò°gún¤LpEA·u´øQ*ãÊœ>ê5ý>îˆ+¼#BQÑoî6s,£`î=8' \Óâ" ܪ+žç¸x€ýXIVYTÎ6,¨h;[­Ü n0Ó‰Ði:[(-TDv×M·­7Ýo‹-Ò&(æ*¨h‰w!¤#H#2Õ; Ý‚(ú„§t*ÂØôŒyÑà êJx›¡”"I X•‰Ø¨ ÊÖ–ëÓº@ÏNhŒ&úR$8O—g5>Z2ñÒpsÜ`±oêù"ŠƒŸÀX—Û û+ú…Oqh1 *¤ÂÁã‚U7%ðñ±UíãV7yQÙÎGø~”‘¬êŽXlµ)ÝŸ€¤¼±r$Û‘ŠCUðê"¼ðµnê®4˜j­Wvç+ ütÒ—ñ[úátºÍ+Ú¦óþv1ù{1²}xNpHïPH™Æ•–ÜÄ®¦_¸ä¡´ÜøØ£EBgÉX®×8þ‹³úŽýз‹_†> £PDý(KE–DØ Þ¼•³6Áxa’ÙÑsî ¡(KÊÙë»Mµ Å"–™•p¿€h'”&CúY”&™È€4RÊ®»ÑkT,"™|½&”"2z¤wäÿ/ÉåaÀHqa)ŸÁÒŠ!Œœ³ÇíÐæ×>ïभˆpÛtêŠy‹î N¡¶ØíËå8÷c³c*!L&B QŒ3aÂìÿKd‰½(•} # Óè³hM a¸´r·¿ÍhË2 ?‡^#S¡T6Ö;”1dðZùÓÖ7… o3y¾hÛÕ†¨¹C‰ÐÙ`$¥çÇ*·>Íà3 œmO´á ü®l¹:`£¡Ïcíϯl•ŸE,Ï"޾½•å‚•º|¢Ûœ¥KêÚ^ædÒ’¸þ{4mã´oyÚEˆ?FþYÚòþ¼iêCÅn]ÕeÝPg$þ‹ÌÿºÙì²<Ñd§  ËX¡©û¶Þ¡ØÓx0×¹µÇ2Xº1Ó€] *X¹ÊÁ‰d|çèZà W:¿Û²{Æ=›r*î'Ø;5ÙCÀRá€î'GºH¤ç¸òÙ„D˜(èlRb&Ò8ê9ž‚…õr˜ûx·Lqœa‹‹›˜bi& ʼ¿pÇg(,ôa)²D¤Y:ŽïDR>8¦²· ycqûè wr÷\¬­ ȵž‹»ƒz¤‰ZøjÎ‰Š¡ƒHÇ`ß×bXÄ ±+vŽ„‘1¸Eï(çjƒþLŒ˜¤FT~œC¼I>…«ÿüq`KÏçowj‰VãlŠÜ1™Ç·}@`›;‹îRⱚHÕÖuhü§Ul±³÷žŠ}mÑoaªÙ¶®|Ä”ŠÉ–[Íù’àœ2¯®°Î‘¥Û"ÄCþÎHòCJNÕ±4ŸqH÷>¿pZ¾`F¾("D`|ÚNÖ­¿`TÆvð ÁgdKNOá÷»¿~Ã,õâŒv'ªS¥€ZtÜviù ª7“() +æÿ3Ü¢ÆhZƒ›ÛâÛS©ç¬ ~:´¼½·ÐâÁ+·ÿE¨C¨qÔ¸`¶Eâ>qOàA?¼V¶Üä}ôXЃ÷µs×OY-$Â…¦`1öÏY@o0•cJhþ];¦\>pûó‹ ~lÃëê.\©!À4éVšá™¹|9¯¥šXÈ!bÅ”4hfIÖs¼ñ™óö¼²ç긣Ðá ù^ÃO±QŒ¼ô¿wSáÒÿïÿwBÏ}ãí+û®„zÕÜ;ʧ:õí#…"Æºí‰ Éþ:ÂÉÚOiíp˜Ã0©ûÔzœ,&-Ò(öè;ŽBÒñ‚&üKea<>~åíñÿ²PˆÓ„–œæoˆåžÜÓ×Ûù"ÍÂÈf½GdfKÚùÙŽPÚø§±<*œ^⻳0…ÎÒõ?ÜY6Ö,\of4¶Ä~‡ŸûåP@ƒ…!^xÔ›zE¹[fm/*¸ÈË^374avÍý‹žs /âöÁRJ˜¡ ïoä¶Ë ¾äýãXß­5aày&“ë—3ø£!1¶â‹W‡ÝÒ1Ç,þú–‹u]–õÑOÖk矱ëHÄÊ5BˆókM`O¯|²Gðêq+úü»—|ÅߨÏêþw@š# ^·‡²£½¡qCkÇg…Yå/ŠÈðX´®·ëŒ¦/lëŒkqÔÔ÷4“èÓì’Ÿj×®®êÙPæ] Óç@רª…òݽÄYʆÀ+‡Ã×ïÒ'”½/y§eýì}r\šX“]íµM(âÞöó{a" endstream endobj 623 0 obj << /Length 1217 /Filter /FlateDecode >> stream xÚVmoÛ6þž_!äà #ŠÔ[–h‡¥À°¡X`+Ú~ %Êæ*‹.%ÛñŠþ÷ßlɱ»!@LR¼çÞŸ#bøÃA9!¨¤EP­®b³ª¼{s…ݾ6F£¯Ÿ®nÓ4À1*ãOÍê©>„?/ÙzàjBBz7‹(M÷oßüfWEËÝhVPªúY”Ð,¡aAfŸž~½úåé@ M’ÿÉTï|I5S%q‚â<È Š0¡–îÇ8;9ó4\KÑ v(:ûÛ¯y%š½èv>—ÃRs R”'ya‚pj‘*¶äNª¶¶[YçfmðýG» ;î¼ô+v8ØÉ®wƒã7wfÃÒÛw[®z7‘ „1MâøøÈr'Ä>¬_ñ*‚ èA–f¨L¨.Ee-Ò@ñ ¹úã\ qFQ†!’£”$–öõ’µÍ¾¼­¯­û{½µp¦¢÷‘ù±!ÚtbˆjѬ«øƒ &9¢)™Bç¦æ Û´.+``4¾Mì¨æ Åyï©R’!;¤ëFn5©f2,è9šä ž§9_T²•ê€ØJæ¬Þ½y­‘^#kv>˜ñ/ø–\\<Î|!VlÁû¯Ž…Y«·¨tÊ;ë;ü©ÏÎEÎw9«>/”Üxù6xçE4MK”—i@² Å剈âø{ JA¥Hš ”ÔèƒuxýÍè”ÅN² OVËCªZÙó¹bÕÙíc}².´;ãzÊb×í("(„,±·rFp¸³ÖÓ®®¯bŽ2ß%_AÐôVc“`ó$”sÀJÿfè…~ ¿EQÿcª5B›õâOÝœBû]öBgĬaÛ( œVÊSOQ¿ï¾²;oÙÀk»Gty>]Ô lnÑ7Ã99aöÙ1>!ÔH®^wŸk¾Qü»š»#Á¨Ófƒ5Ûé1ÓÿöúcµCæ)5¡+±nŸ–î½ÓïÁ>‡ölç@~âÙË-12 ®aÚß¹TMK‰ V&NÇ’{w÷“!GST@¥M®¯8»TvPpö–ʵŽ/kí§Ï|¯™úp#1†^›Nãì1¿Žàpê.}µQíÞÝ3]½7þí2ø¦¡ø— ´»‘(à²,¦Òc›øþøò™tºF¶­„3-n¦mõh¡êãÃZ†ROOÔEWíAÛŸõÌ)ÈýÞNÌ{ÀYž>[ôŽ äl¬ÿÃùÚ]‘#•ð cö|à2Zß›õïÑò°Öà§’Àu¬oÿŸ% endstream endobj 630 0 obj << /Length 886 /Filter /FlateDecode >> stream xÚU]kÜ8}ϯ0óRĪeɶ¼,û°K(…Âv`²*¶f¬ÅcÌ$…ýï{å+%cÇmÊ20¾–î=÷èH¢^?êe¡—2F2.¼üxN£ÝÁÃàÏÛ+jqƒ äﻫ÷7qìÑdaF½Ýþ2Õ®ðîü?JÙªÛŒ1Ÿÿ² 8ýÏŸo?áÈ®”¶‚ùMw”C¿ "žDÜ|{¿ûxõa÷L Ž¢Ÿdj¯©&—T#ˆ9‹½DpBG¾›ºyhºBuSÛË(IPFhŒˆ¿Ã8ì[•ë½V@5Žb(g]Íã¾lƪ˜²Ä$R›„b–Ržìœºy=)@%:Ͳ”°ŠÂB›aÓêGUICeØl ´ü_ñõ·iV" l2/û#òC7Úè¤ûQVcFŒ;9èæ¹#1OÝìí|Lì0Ôµ«¤û×½¾|µÕ{U÷jª΄ìõ7õþÉü_;éÀ/Uõ„o”„d6Í»i:›Œ¨¬Ú¥ìгìܺ•:/¨SC^^ª³’³Ð}[I[ø¤ºAç/DžfJìe>8 N¤èz¥Á¯_/–q!‰ß½Ãð¨¥-šÕFwNÁ“¬ÜR:ÅÇ^®WeÏ›c;º>ü°Õ¶kþ>º©ç-ØîryTt^é›\ËṔʕ>—> /F§¡ ‚¦Öéâï¼ùwƒÁ=¸Æ`wãf80òò¹‡¼jzõÐÉ\¹œË*H)¡“wØõVøËðØFÂOr=>@ºÄ7}÷82YÅ(¤‰ŒqÍs2® nUs4INZméÅ“&¨1µ›`…#ËH#'ëb5[DD’:ШƒVÖ°ãVÒÅÐq˜9$¬úRÚ¾†Ÿ½pOI–°…ÝÕ^ŽÕä>a ÑÂ-|c{Ü'ÂߣÃ3¿¥þ8Œ¸³2lrRÖnhð=7KY¾%¬ BÐiÀ§zÔ½³ëefbN?ù¢Ôò€ëˆsÇ<›î Ã01Z€¦‹c>²¼ë.æ®ßu0©ôÅmsŸ¥$ýóÂý;C„¾©¾¿FH+öò£,]2b8cc1£ÿýëΡß`¼L:Ñ&æRækêE‚‘ýoíô·8Í‹|GIžY%Ñè %HGýê¢küt)g²l…ÇSÅŸ”Ó¡ß ¾Ljå´¥ÿ®O² endstream endobj 641 0 obj << /Length 2264 /Filter /FlateDecode >> stream xÚYKä¶¾ï¯h «-¾$Ñ·da/1›=È»[ÙîÖDÏNþí©b‘zz§mÌA$UªëñUß%ðÇw&ÙeR2£ò]yy—¸Óö¸£Å?>¼ãž.ÂxFù—Çwßþ õŽ'Ì$†ïsVÕîcôþT<õ¶ÝÇRÊH·•ÒÑû¡ë›Ký¿¢¯›ëwûO6éœ —‚å<©Ž ;ÚæòkmŸ=íB¤ÖŒç"þ;áêl»}ÌMjT”küäÝ÷£Zˆ;­EÊWæf ;c‚kåÍMsŸT$]ïcŠMólþ!×)3ÂÜ0p)$OÁ@µ6pñP’q.a‘³Äxþy²Wð¿ÖѲY乓ºÃgu}Ñö¶z€]Ê£º§·ç¦¨:Z׊(í[½õÇes¹€«áõžG•gV{q…çýÒõö?ו¥s'lx¢·dZÆôלô¾[m‡LYÞ¼+68ÓJ¤û8‡˜x<¡Ù*—A8¬UÎP{|ö'»™‰fFòÀ²*úbK0\À¾ÝðË®$ªêÖ–}Ó¾„æ0Ir‹åýàIUw}[ÿ2`9ÅB¦”\ºjÎX º,\”ðÈí‹úÚÑɇ÷ ¯. sÇ B3~€>9­õôN¥<¨'Î?(„Ïø¶@­_&Ƨ l‹óyqäõÐÙ¶£Ê€H©Èx@AÃÜW\A*øòÀÇôßí—ƒ5A 1çZ ¡ ñØ8§7Ÿ;::4--œ0ÅÞ«[N9Kôc¿}ûÕ(KSÌÕ)Au²ÅS1¡Æ2õÛŸì”cÐôt=3ÕøÝ `œ·åÔ\,­Æù"]Iýka6øÈB©¾¸‚²¸’¿á. ÔþNðò𹈠$yAW7ƒ/ê îžýýUöP èûžöËðArÊ{*è¸i½X/¬\ñÕÂTGR@Ht7CâÏßgDÔÚ¢ª¯Ç­KH¡¬sn—ñ@Œ×æ(‘Sáþ@qWü`* ®o4žj–'æîn—ŽÍÀ•Z`íó†G%&ƒsZ U<ØÓåK£é­²a!“ƒ±( Q¢¥'Úôë%¬í¨M­WUNð üË3Ui Wè[ã¡ú=Õ@”[\üªè¶‹¿aIÂï¼Á8σôùTö%ŠªX3œ+Úú ÅM(ÏpZ_ÕzúL º¢õoÛázÅðs›•kàäЉû‡xK;Je¤X§r }RY…T^5JJb­|ëPFaQ¹KH=cýͦw¹N˜šÂë­HTÉX"]£D¸ùÞK/豆¨Ö ÑQxh\1/k ´ÒÛÒøò7ÏøÒô—(Ûb£:ñÔ‚*3þ†¾®ÒЗ¡4Æ2ãÞƒ™pܪ‚i¡ïõŠ6ù+4ŠÌ‹PšïÊms¦ØÝâs ™ëª>î¸ïN5«£?.(:›¡'vs÷2´Ü±/^–GgÎ…°l’f«è™0bG {‡QDôëb¯8×½#ø èNП}hu¬ò<úÞ]"$NYƒI/D .=@KpkÂXü¶‚vÎ5ÖÁ¡ŽŸŠ«=ßvIšJfˆù”ÚTù4bb½l{Ó 8§æ>c`Q_ë´§ÍÓ¹(G+éˆ.%_äõ7ž‰Ó¡aóƒ 0ìYQ|g¾—§³ÕY»>‡ÊþYåý×ã0e©^MEàŸ4‚=z¶¢£RÎ Œ%‹7ªLô3ÄKI»£Dž°Td;¹a bà(Å4¼cØÈn¦ZžÌ‡«ð}Êrrš®·Š‡Ìp}ÿÏ©L—õcó×V¸8Í2¥ó4z{,;ΙҫëD èVñ¡qq¨]\Â2.]ô¢{6É#Ú?Ñ£Át§eׇƒ m‘|³˜Q®Ó_qC®Lãb¹°™pîÖTÁœdc%F¼õ“g™V¯!)p¯©ž6´›ÿ²±!Íhüò¾Öòl5l> stream xÚËŽÜ6ò›Õ€[+J¢¹%ãõ"^,₠ɣæLs­{%õLf¿~ëEµ¤Ñ¬>ˆ,‹Åb½[Ý$ðS7urSfY\çÕMsz“´¸áÁ/Þ(ÁÛâ~†ùÃ훿ý¤õJâ:©ÕÍíýœÔíáæ÷èÇ£9¶ßí³,‹Šïvû<×Ñû¿Ô™–¡ŸünŸVÑáÒÚFºTyT»?oÿñæýít¶NÓod1_pY—eœ* —E•Ç*Ë™Ëb·×E½ßíUô×NE{¥&ö²TئÖ7‘d*Îë’I}ßz^EözG˜Âxkæþþœ{ÿЛOÆ£«ÛÁF ešQ6<¹ñÈ£ÖŸpùÑÙ§d[UÑ÷«Ãi?ê¥sù*È»Êb¥™u¦›–µÐ-‰.CÆcï/¸\%чf¨éá²½Þ¦öB,­œ‡\Ð lLFœd5w’i畆-„zpù5xŽj݃ëì–g-U\äYØËð=Á€g†ÅF»/ëXUÁj³™Cç>sÈ…ZùGX>Mw‡Õ;~^™{`Ç)ê,‰>ŽŒNž QAKù5=:F\¢ÇDòÜ MXûB´žù0oúƒ0Êgó~Õ’%F D “b±€h;96yZY=),Ot “¤eôô.Șb…<)Š;@<¸î©É;dpý³¹s­ƒ†–¶}¤ÛÞÇüà–ó8Ë‹TBiZÇ:„Ò"V—ÿއûDá'ŽÉ³b¡’£zg*8tF˱ËÄÒv@W G©d0׳ràþ´HV23`ä$ô\ôtÃT‘ĺ¬ƒZóZ½ž]䥤÷®g#¦À5?j.å·Ã橪ˆu1Ó'[7ŽË’8OTÀ:›Î¶ ë%äl·»*<Û_ä\ÃÚ™i°T ¾PÏ™¤@©tª£¦u¾`¦RŠ® HˆîG‰•àðî2޾cþÎvœX!‚õ¿x]l¦æ©“í²­œËnU':úõèZ{Åz{–~"M8kKÊ S@{I3Šü¸j7:Ϫ X-º6Za÷•ª`¶zAûɵ²o¡Ttlv îò.y® *2o Ÿºá¢Å­¿%Þ ƒá ðBº$È=/°'Ác¼!¥qxÇËOG~ÚcÀ>H–IS8£ÞV\(Tœ&“‚c#Ð×Wì¥v–q’OQäU^Ù÷À±p*û¨…¿'qeщN~ÚUàªzÖbH­â4/—"ã¼jõZ2! ï8¹_Î-ai°Ý û(À÷Hæ18j¢ØœcP ô…DÑ‘÷zt%B´[º¢¢†ãý¥Næ$ž›“Å )‡âòì7’Ê%8w‰!_X93QvpvQÆ-9ÀÝò«éKôÈȦ%0ÊìÂr&S^^OÉ € ^ÀÞ›KKálâh;¯¢¬Á=kmYðânÊGˆÝ!†îZH¦ˆÕóe0ä¢Z?-¬‰B2GX8ºm!µ5 ‘HÕÓ³\†gH2O"ü&èð>׬5ý¥A40„|§¬Àù$ÿ\“Á#x™AÏðŸÑÀ‰ œ12öLAÒ}¤-_ö_Dý,É3EÍþQ^ Š›òøZhÌâ"Õ›±1ƒBØ>NF‰A#¾ÅË€•~TR”×B&-®¨¾£ %xB ÞU^8cyae¨è³µënF^ÔqZ¥7™Nâ2áŽF¬a-N 3À­%dÞãû÷3ݘõ1$©Ï–ôƒ-âRbx)ç/ðû§µQd52HáOIÏæARO•”뛦zÕì&ç­uù•ÞMÀÞÏÐ7îµ&JÌJ  ²,†:xi$¿’KHëlÝÚ¨CõÏҵŒl±×¶i3÷ù*ËÉàµÝÈ»¦ ÑÎn*&)F‚ï:x .ö3ŠˆJ3ÒoÿO€^ó@ÅCžP±¢¢óeä•8ð—ñŒ½§+h0C ~ÿr’c ¬¦¦·ŒÜºÏpöG¢rNv,¢{}–cÂNÈÞ¼Hé‚–}'Ô»×* ¨eÏ©¦®…Õ2ê ÚóŠÄL€rj¥Ð¹ûžŒB÷ ü`ž@nø‡—¼(v)yÄ“íϽåx±¢¼ÝyâÆ•„ ìU…G„¹ÿ°§Þ±b ¢g…A\ŸgônÒ 3‚a¤oÆM8îìÁLkÒ"úYïÉ ¨‘i îù~ÁT5ÕsA“¿’öæº TÚóŸK #…}mñáä`FÃ[î{âÑ\ºï8Ûþ@^xÑŸÄ $ÂK1#9zùRFH/m$yÍ:² £H‹÷ ›HS‰ +ð+N„«uG#˜”ÏÁ÷àMþúþÀ¡' ¬u_IÎ]½è°À·y’ ÷kä­W¢Ù%at†ºKÑàý™K“ö™Iô¶±nÊ\‘…Mt¤¯´¤D˜gEôO?nå—’)=µ— b³†Š¥ËVV—٬Ƭ³ó‚ÅÀš3¢™Ê-õìêEð zí¶MW^% m”ûÃRZ}¼gájoU¸åQg-½ n÷ü}ùö §dËSxÄåD.7 HÃw’Ö‰÷#.¹É½ÕˆŒºXvâ@Õ<5—u!É7 8wêdÒ3YyKÒ‡Ù9Žç}.v¸5'.6¶Z×fVña“Ô’€Ãc kuMÈP#1˜¿T2ö.×)‚|K[)ÿÝc°›Î!õ/|vWØF«‰sÒohqEžÂ†sáäÁ=^Ó Íh)zúWt]XÀ•ùß z©|˜ÕÞ8]3HËȹ~h¥nøbDÊG2åtjï >V][lz]«ÆÞ-K3ŸBÏê`\3üiü9(Žæ<“,Î.D–Å"ÇK gÕSk@ŽRq³%øBÅêÚSCgç„ÙÀ*ˆeìÝÝ…ò-ˆ-êõ?P´©“–Э3µŽò›üª*.«jjqûM>Ó$®Ô„4\XÃÜ0ä.Á/Ï:·ËZpB …øAŠt:»V’p']áÐÜ™uÌ%|l±¿‡q•Ë´¹i¸s·÷ü °œÅ«=mÝ…WébY¸ßrŽÕ©õ“9³Àqè`a%ñ?«)ý~ endstream endobj 661 0 obj << /Length 1458 /Filter /FlateDecode >> stream xÚX[oÛ6~ϯ0¼‡Én̈º«ÙlC[t@_6ÃÐö‘h›¨$zÝÄ(úßw/²äÈYZäA‡äá¹|çF‡Î|ø£³ÜŸ¥aHò(›õ•¯wÛí̾¹¢–oŒ«çoë«›×q<£>ÉýœÎÖ›¡¨u9{ïý¾c{ÅÛÅ* C/y¹XEQì½z€­†Uf÷\¬‚Ì+SyYºø¸þãêÕº×Á3DÎÇV&C+)ÍH6K²ˆÐ02†~ðcŸ×­X•|#¾I±7õÀê}eWtnwÉ 7ût7)Z{8JV4'i%¢AWSá'4ZP…ã²`UÅK+jdo’‘ À=-…l¹¬? ~?¥5ŽH’æŽÕ)<.ayh­¢CÛò·”9.EË %Ûã" =A ro½ãö²Ð¬ŸµˆO‹ õ¸Ùfè0åb釞°Eg¿õ^W¶ŠY…`3€$OC BBcc«Ú15²Ö, YïEeUª%¸‹ .ö­Ü¶¬¾†UžxEË™ðOà„9‰Òäù€ÆŽCVq«‰5å󲑯*ƒÄ<§z W$ÆÍät¬æfëQˆ¢ÀûiÄ ºž÷Ï¢ËÖ¼Ó^wöR¸Ç•Æz3©ÎÐÙ:Øœù%WLTùîp #`f®=`ÍÑŸÆúÆt"›ZAB Ÿš£DST‡Òêù©fjGv¿L 9ãìT)ä€u(ôÆ:ózœ?=t›CS(!û2é{{¾¯¤ºX c_°n*齯çæÃõñZ¹×#Ž•$LƲ74ómß°±~ÑG”’(Ž.iµ9ð³ÍÀ[¥ÍX>¼8.hÈí®-W‡¶AÎNè󢃗NX‹«“¨ÕÈ +ðëTHjf„³v[\»JÛ~~ÈkËr‰ÌßhÀ¥¨­â#“P ãQ‹æÚ‘ìÁÝ<íO»eO-¡Ü†º…bu<ßXÅðèH2 \.ÿÅe® m„ ™„¾ïóÌ%4þLÕÙjJÃØ×š ’tú›ŒbÍË>J1Ó Ì±‚ó ú_LÇídu8Uè™f£¸T#->œ„|ôzÖ¢v#¤Vs— ®#À%¸i9P¡ŒÉxªtP1{b/þm5Ü™G&ޝ×Ke]£Ãçý¥oÃ:šX+ø³…ëwä£ñøÅ|^ºö/¿ö•4Ý×ñ9ôÄ™ê÷ŠWU7å®»ê~x鈙Zhû· ˜[ûíl»ß‰b7†›+¢‡pSð soà9æàù|rÄMtikϾ…ž°A|çß ²!4Ôh5ó¾â¿2þúìe¸ endstream endobj 665 0 obj << /Length 1123 /Filter /FlateDecode >> stream xÚµWKoã6¾çW È›H­‡ífsi‘ÝEÑ\Z÷Ôí±(‹Y½ Q±„bÿ{‡R–l) ¢!9œï›’3& þÈbë.ÖžçlýÍbŸ]¹j¶:,PøíóÑz6(ÚÍŸvWwŸ‚`A\gënÉbMí¢ÅŸÖÏ -«–¶çyVøãÒöýÀzla*§)Î>K{µ±¢&e5HÁšøÖf³ük÷ËÕã®ÇV«w’”š—,Ã!Kâ¹Î*ðáÆwˆç#Õ8N›:ùên-¢¢ ‘{IÌÚ«Ðñ\‚Šw–X¿E‰R“ ž¢ø§)‹µ/pÖ«õÂ&žC½÷ÃZ±‡K¾¨Ð‚d Ü{é¸yˆ#þ­¬âøàÅà2¢‚=1ô¤Íx~‹[ÚŒ¶ZìN³Ýi¶xffOâ öÞ÷‰¥áЉÝj»M×,j‹œ¡õ«Î ¼È5§¿ŸY‘½rvt–6g­]µ}‘×¼Æb|‘ \§fS–Ñ<ê÷ V¢Ù@~2ãÑ(£pf‰ëª´UŒêí ÆDÕ™t©OÄbž÷æŠk^¸¬§Çß¿ŒÖÇËŽã¼Åå»:)Ó ü˜°Jó–0Æõ™Ãt/ªO5$‹ÎÄEfi*ƒX –¦õ´7Ã4Ž“›Ñoì ꕦ ›¡‘Zªåkî5ŠÏç6ê’íyÌYôFxÐ¥©õÙÛû¿\;¶Ú8¡ŽyÄiA…±ÿ~(q?åÏÅ$}é§ð'žŸ3[üöelÈü¶ÓhQ{u“OmÔ¢ÆÃéi”^ÚÒk¡;5dm2z®‡QwaCÆÄî†6ºKCežÅRñú?ÜsÄ…B“_ϲ È»ÿ~툦îš>X—¶&êÎ˃k¶Œ‚&c¥+ÑËG<jpsó2Ö¿Ñ¢î=Åj„Í{ìqÒÛ6ÿرùX¿Çn'±ƒùêÇäô•} ‹úûI:8½ê’ž×Ç`ºÎ@Ÿçù;NÛÀ†zíÿåÀÌ77óˆç½ÔØò)X;éšvòa…¦ÍÊNmN<«1;ð¼60îPŽØW—ø9Ï8¦ø‰›|¯ê<›¶mèl×à˜Â'aŠ®×Ê3ú"‘ïŽÄ¨K$¶ç’‚î9 Á3f¿.(U׳«›*¦{æè1tÁÿ³ÆNÅA¶³eS!@QëY«<ÏÇ$'F¡’²jʯ¬}R“æ<ƒr¢'³¬i N!£ù*ÿa{ öù’X”bK3%>ôÀþD¾¼µ õ•ç(•Uq¨h†™µµÉN`Ö¤<Ìš×ðø¡! !dœ>«.^NaÄ•Zñ¸3kr_¸µJ ÈLºJ¬ èë½G.}:ƒX¾—¬Wب£Ò É¸jçpP¦…¦UŸlÏY+´.†9õ ÏÁTšDæç©Æ(ËsÑGYbc¸ÀK`# G³%.ÒT%÷ˆqõT•““'pô;´ŠôYhÀž(a~5ý'Ú¬ endstream endobj 675 0 obj << /Length 3235 /Filter /FlateDecode >> stream xÚ¥ZYÛÈ~÷¯ø%0ê°^ÎS²ð±Á: ¬'ȃ׉1¡H-Iy<0òßSWS$ÅñŒ 0컫«ëøªZú*„?}•…W‰µ*séÕæð"¤ÖöîŠ ¿½}¡eÜ®G#ÿvóâÏo¢èJ‡* 3}u³/u³½úü´Ï}Ñ®ÖÖÚ ~µZ;¯¿@SWÜú¾Y­MlOUÑA)J´ Òlõéæï/^ß {GÆ<“HyIe<¦RëT¥Wqê”¶Ž ý=ŒÂ»¢9}û°‚5¢ ø’ŽUÁ•¯üyÅŸ]Ópá¿0M#©s>¬µU)lºÖ‘J„7ûhÃ,苪’â[ØsÇÿ\÷ÒÙðwÓy_p9ç(yU[Ùyr6£Š]¼ Mý)htV¹Xû÷ûrƒ„ìyOj^K½îú¼Þ=ÍNhÝKÃ>¯·Ã.zÖ&Ñ*Œˆ#:Ò¼2p"(O‘’!éôêTš&~È;ØnB(;KGt*Lc?:oZÅÈNüó¶ÇRDçÁ:~ýõí/\ú=Ô®*xØ®iyÏí#~Ñ’UÕ`õž«XnN²jÃß:?Ì(‹´@? .piÆ­³\šTÃÆMWpñóŠv>Iuƒ—eÒ0¸%’ÖîȵM‰G¡¡!EÕ÷û¢•A(þÄK¬”²LOË+û-O¸ZlA4eôv…õ…º¾<jÅ_ ž¥È2:X(GâÜØÆ1ìÅL-´8 ø‹Du×PK¢àCQÌ-‚‰"e]v›îÛUPô©0ƒÚy˜¶Œí„Ÿ¿-°`ÑæÛÌÌPê˜ð,3Øò¦¬ n|³J]@ì>ÉQŽùœMÇøL.r*3vr¦Ç-ýÄ æ‹Šr­#炟…Û|ÕX‚«^­uP\/*³e˱|~ËÆ8åÒÌ+ îáB+j:–~…Ê˵[‘#2V/È3lpêí4¢¬*.uE1Õ€€¾þ»Øô܃"csû§n48Ûà¶eUF™×A ^³rÊi&‡G­Y4à ,±?ø#ö΄*Õé˜;èÙ¨Z"ÈûJ¶ X" ll½–ÐJMº'¡Åe·œ?-ugM… YºQÌ “ie'¼ø×*µ4Сñ(j.m›%E™ ÃÁ4ïvÕ©Û£êúmsêó«)¸ÕAœÈSÂEÝÚa[::”fžZZ°¶åç˜/D<º”Ò¦9Èb¥<Šm¹æƒê(Q©›˜/0~Õž´ÈÙŒµH'`¨ë¢Í+Tt]Éþ:Ž¥áŽë‡\D+ƒµ¦Ê ¬´»¼•UrY»8ƒ&\à š¸¡Û7§jËå-ܲFƒð@‘Ïí÷xûñÍRá3ÒRLÍ´\hÙó­ß#ÓØÎ÷^Jþž©¡‚{Xi_™]´ìs/t›þóÁËß ,³å…ÐôTßñ¨RÀë¸àØzÙŠ˜Ÿz–O vʹ©xÞ2$.¨òKPSxý„M7ɨCms׿×q#] ÍC¿Z—„Õ ½â«iŽÜ- ›‡ A\nm›ÓÝ^:r†ƒØÞøþB¤ÏŸã,}@ í°)¶(ö ºå2p{ΫÉ?è­ßÝ~I£@7èá}ÙQn„hGì1&F¬Ö踟Ë%²Ž•|Ö/ÌAÞd•D¹Lÿù]Qo…¾©ôaKίélŲTY£§R϶udˆ¢,y #&"† ضåð`PH ±-ve]œ‰µ{ÿúûÔdÏ‚ïÂ$¥ÔRóã!Ê%õ j Ýp#²Ó…7ÓÊj7ñf ‡.ð©Ö³4¨JV>‰"àK*|¢ÛkÒvˆONJ̃Î:I‡*¹   à{Èÿ³Ó”øP #Ð,D$DVÙx‹ôÒ”Ì~#ºph¢§¼¼V.ør¶—™—°Ì1HOÆ [Jï1Üù_;žÑ‰u©¹J†0»°µUrÛbX;¿a)3„Ÿ×yÒ³½IbÐNwLŒý`“·ew¬rtgó [^ßb§½³h 8^$d¤`5{{Ör®ß4ä&‚+&Öí¹FÑ |ïÄÉ×Ò,_ÚÍÄáÆa#Ê ¶å2ˆA<–P w²b£0àÂanƒ‡²<4±Ô=ÏlÚEth3­´Œ ×÷ É1Xœ˜J¡㓉 þÀÞjŒ·Zp©çhe…–´L†²‹Ê"æœHgì¥3¾ð‡Õ†=p} ±^ÝAä&ë>C÷0åâ@GîįÉIL)û<,™®œA§·ANcÕ8Ä]iæ­ƒC£RËXß²k†ˆeaëWÜEËœçRœ™ È‡$ô5Œ0 °Øfömyd—:=|±fHïk¿úÂaizLÌ#¾Än´<´—ò͹ñd#ð‡»8töü ŽíòM¶Ô"·‘C;Á_<žÃq¿‹ã]"ÏV(‘œ/Ir4b˜—än^. s<ÎÜxZ ÕÅ“H¾mŠ6u–¿žZo©. QÑ92xùõå#ñ–‰ÝBÆ öªÍIóØFiT Çg¾°—3&=`й-ÜOÒ-o„Òà[^"²xÆ¡X—qÙéyÄØb‡X~”IðM­$i à”‰–r5hí ЂJL:]àÙ†ÛÁªR§ (2l<7ïók.v—¹À *JbÀ±r6þî\ŽŸ¿-° ™oCçûî¨ô§qÊ(Ãgøøþ5DÞQÞc ÎÛ`{!o“]Ðÿ­¼Möj狎€œŠ­™»ErSÖ'á!ƒ^Š±ïœ„Ê}[ö=9J„:÷°¸@áÔâ§ÉÌq£7¨Ü¦ös lã¨!!õöûøeü"‡ÝB óñg¦óŸƒºõÀîïGÝâÅÒ„ìrKè8M)“ÊÍ3p}£ˆY¦æÜqFÉ)_~ûaâ $»›&‚8uUòxþáÁ/›xˆ<úð>?)ˆÃæ!'æŽ÷’dö0¤^ CåΠèQèH¬'ZÅ@äÃé¶+þ8yS¼dxaj<7•$”ÆA’P"áú»j 8%M­_hwÎâ|}•R‹2!'Õ³6 H†TJ*ˆ%8¥™¬q uL° “y÷¢3OãìyoG(¿“+$²öB "ú…âXãž¼¼XEY6¿<€Ö?K°øbªYzÛ XqÚr¶W£ÝSDIgísX>ÅL½{œ6ÜÇZ€ÕÁDâ°º‘oQlebÃÃ8Q^Ë$N>Óîe_æÕ"ƒ3|á²Ï”­¯ÜöÊûׯç,x‘ç…ù`iôÒœ†ƒGHDð5ÙR5Kg»D+ˆwî¦YNLLböÔ¤€‹ËþDON‚)‡‡0¾ØâŒeP±0y§îeFSW\âGDœJþ1µ~ ð6¿x‚šÃ5¾ŠYy-DKŽ’Ðà’s9'})Ú¯Žl¯$ØDYÄï`(¨eê¢ÔÃAh:%de'¥ƒÏF>ÝÍ—ìÛ¼îe?ŽŸ#²ËÈŠ²•:Œ¬k8A“³³ÈÍP@ޝ‚:8 ‡àVd åüþC+à |~Y›d8—€!²`kµ2iôý€2=Z`ép¶Íô N˜ßþô Fæø0H‡¿g°‰U é~0Êà'ˆœ-éŸùœÎ–žO]Á~s~þDÍ·™Bnd“SZe½ߊhb½)ðµ”-½öÛŒàÜüX|Ä“@Bª´}б~ôz4|áóEÖ‚[`­Ž,€óxBÃ÷°ÖÏŠªÙ6—ÑLÑL”I8³ß÷{ƒøI±37µN/3MO”Ïc§ýáóEŸ`'À …3”~þSTͶYf§ÖZø‰iþš :ª‰žÉC?ú jç‹N‚Ãß©õÒã—ÎfO‡`³éÁ àϱãúùmJgÃÛ”&¿°ôâÑÙó^kâP%çäÉø'G°ï±¥È‘| ïH^ЍhÈWtÑÐI°V{X‹O¥·|òh 709£R3ÿFB.4£Æ\ð®çß˜Ñ $r[.?ØÑã!Mè¸Grq]WÞVâH vŽžqÎFÒ‰œ¸£×4l.ë³v–øºŒiSÂÓ¬®8f|q"bÿlúÉ endstream endobj 680 0 obj << /Length 2311 /Filter /FlateDecode >> stream xÚÛnÛÊñ=_a¸/Tp´&—÷ (ÐIàâ§ MQ¬©•D˜¤Ž# ß¹-EÊTøA»3ùÏìì:¸ñá/¸Éý›4 Ue7EýÆ'h·»áÅ—Oo¡[ázBù·Ç7wãø&ðUîçÁÍãvÊêqsóoïýÞÛ­ÖazÉ»Õ:ŠbïÃ75¦bèçvµÖ™·9V¶‡Uœ‘—û«ÿ<þý͇ÇQv¬õO*‰”?Ö2É"„kùRV¨ŒŸx X]6f°¼}ÙÛF{{2VÏ«Àƒ{Þ•ÿ>­À˜¯‹ª,V:õžËf‡ØkGí>kúÁ4…0¯ÊÆ:øY.¸,Ȧ„Q®¢XƒÅdø0Ä…L=³7Ò* íS×¢Š/`Ç/H|³s­‚ ¼„*ˆ™ª•˜ÙªGÂÈù`Ÿl[#‹?JûÂ8û RÄ-ˆÀñðJTœåÌì¡­íPÖß$N:IÁOàöÈ›‰ï‘jØ—=#ês†0Êù‘Åjx†bâjD´ “«pv5‚A`2t''mÙÏi¦â8ÿI?ƒ'Cû¡x2XpøZçÉ…u–Jê ²j\aFn_’á#~{Fa–àž²u¹Ù 3dÛnßÛfÃŽ aXÑÖµi6 eÜT3ާ?7f®z¤Q=Ò1jÑ0¬³…-ÿ@:˨¶©NŒ2 8”¶° A%$Ô cj°c#5F:a‰wèJŽ 8.`]w: {äÔ6eoº‰…A¢wå<,k‹òûÞì,Ì% ÉÀ=¦¦ÖiäýÎUDòñ4Y°7ýŒàØ{‘%FØnk ùà`[ V†„Dü13ãüK¦ùw«Û¥UªS—Ïÿ<–Ã#¨,ÈÕ"Ÿ\eY0ö”ã0PkËJ¥0ó!@-'ÊÆ2ÂðOÝvØu`óöX1ý R¬á¶丗¤÷Ž…³~=¥¤(¤T ™ý`­t»TA‚Ì=ÅßAkkì·Áµ4SðëkMí_«,¤ÞÆ©(μîØ0„Û‚æsÕ"ÂðO¿·tüÄØšM‹.xqûaÏYtm ä ㌲N°e¬¸hÁœ)çBK©g'€DÅ'5رxð)bJ“R߈#Mó<Ò”ƒûjØsþ¤þ4‚ÜWI>fb1tÕúýR¢…c:!;+¼YF8"ú¡=(cÐÂ(ÑÔ˜µÎHôzåGšù%*„ÜH´÷ÝÇñFiìéwŒx(ϰÉÔ;œZÂÀ5ÙNZ}\â·/ŸÈá$ÏÖü.C” ]+Ìþ± µGU¿t¨Œrh™«9» #ô¶ÊVÚÃNš®à ÿ4”/°`d×ôØzñ—s¿N7‹/À/ºZäýO4Öq€nmÞ”MQ7ZHñzÚó×s-ME+v[U<)í3Âàâvm‘b^q…æ¢d6‡‹¨ûL2û=="eÞ3 Tv*xË©žD*N¿y›]ÇÐ![½Ä1TòްÔÙøÆ4y\A¦4xéµG–D«ôgŸX"|×ËÞ²Ä+í(q~‡ܰÌÞ”pÌ3﯌èkH1i‹a®|?žµÅÙçý8«&éx4 Ø4‡ZÓá4J'÷E÷jEwÆ$•w“<—à.t‰ëkN.Ï ?ô„òŒEyÃØ ú<î2̬ ´–[;ØØ)8ÏhÝWp™ïÔbk|UÅwo‰=§ÚLÄÛËóþF-Q6j‹ÄÚÝ®põ‘gߘ^ŠönîþtiÐÛ…¹V4à[ÔDÛò=׎`v4Í5"Ÿãâ“ë9ÌÅ4GS©e•ˆâ~Ë¿'Ì \˜N85íÀ‹ÎšÍèŽaT j&š…ý›ÞÚ ôíxy½®Íg²º—Ö]¸‡{ ÌvQ¯éF@Ú7Η05r·ZòýuΙƠ/ ¶ŸKùN²P‡Æ=½Åü(x%w®ë"…Ív‰Ge‡þ"hà©fwéðþ`]¢¼rÞ¬ç©d®çê¤ö^)|ÇýJJM'*ôõ§ÙÜýç&CµÿË“ Ê~Ø”­âÿaþqhÇÁ endstream endobj 559 0 obj << /Type /ObjStm /N 100 /First 887 /Length 1953 /Filter /FlateDecode >> stream xÚÅYÝo7×_ÁÇ»‡RÎp†‚IsÎHÐ"ÎÃÝ¥yÐÙJN8G2mÿûûÍjª’N²wíöeÉ]r9ß_œRrH¡h”2Æ2F Ì‚±6_× ”‚äDÞ)HÅhØã£Z0­“¢5ÔVñ½â¼î ˆXñ%ÊÅ¡@\ý?|) àÊXªX²RðEUõs,PK2q Ô™OüwãSös8w 9“Ÿƒ¥ìçÔ2 Ñ@—€ÔR |.-‡Œã'¥áw ¥QÈ–| çXÅï $W YZ ¹¨h“¢ANÀG&Ð¥ ¬ÊæK ÞQž(Ê  ŠCY 6ƒ…\Ä7&¡  N˜€ãÖü ΩL˜àäj>ÁïM H!)NÎU_2ÈÍ9²‚"@J;Q±/AVb>iAJaLpŽ:ª¿èVÀ“æ8犉Ԡ²a³«ÇÊàûÉ‚‰€Ïêr-x¨¨«Œ1Èáê¼ÆÇ;%š¨d§Ög'Ÿ!r¥†7çQ®x”ä€Ágqqäk íÊà˜ZòÍX6ÿÕ0k-8´‚Iꀛo„:ƒ©~`Ä}I‚ø‡Ã‚e°V•1qì Ãycb8šgêÜ€öšqrÈÁ*¨À`M}B¡&— T§fç<Zìv˜8. ¿ŠC‡¨ja "+lbòìÙdz¶ZÞ„gÏÂô $UXá[ŸB÷¸Ÿ»›:ü~{‚@7oß~;™þ¸^]œÏoÂû0ýñåY˜¾›ÿr>L°äPÞýz=ÇÂìÓ|2ýçË›/Vc2};ÿ²º]_Ì¿t&Ý}z3¿\Ì^¬~ ïSH‚ZËf¶Æ¿xÝì{¾\®pÔûÎi8.; »õÉôüöß7ÝûëÅò¿“é‹Õúr¾Þœ>8Àœ¬FŽÕ]99ç p!).Øö¼cÔy˜¾Z½[…éËð—×ߟ¿û«Óß}Þ»ëXôþ+Àâ f²¼½ºúpdÔ?èß©}ð†‚9µ-ã8‚!ünßiAoIËyW†ŠìŠÙx°˜7¸¸ïÆewñ›÷Ô´ëÝ{îßi´šTdU4‹VÁ»G‹ð(õäÅb9[ÿúS’ôqµþ<»ÙÖ™‡cÀ­DÐ!–£;´ân·24ˆ;ÿ8;Áøq`]Q5Å„€„ Ý‹6ØHyR°Y)zˆåF‘»PÓ"”[RŽ9ë“‚æT£6DIxòì£b„÷d¸ˆd‡É~~}=Ÿ­gã I,pÌÐ3(3‹Eä»)Þ®ç®dof×׋å§ÑâæÌp$p•:q»ÿIÿG˵yTL©}¬5zÊ6ÜýoÅ|ÏoÆEùºïþëÃÜÿ©õ{“éuŸ yã mû„Ú`BëB·hûžíp>”¶¶Ÿª5J[ËFÛ`zlŸžr/zPGìÑ£§m~g»¯-ïA÷¶ååY IvYàµâCXð[ZæèÈ´Š ¼¼!ZQ¼ÃwÂ}¶Ã>ÿÕw¯wü¯ÞÙùYìî!-±¥ú@Ü.€~ï1Ç›¦¶/¨œ^ö4¶íZà Ã|”jPiÏÅøåÃ@ªét¶»Ç³jwj ›cÍö…M6Ô IG›a‚14éR\BDCA )¯¤.ó?h†‹Ï i×i´ÞmGm$‚m›ó¾våÁÚ•ï¡];{nŒ8ÿÑÚÅiŸìz?²9ïjWÞh—_ØÔ2Ïf…¢%ÐZJ4ÈZ ªY:\Sý¼X^®~YF¢BNü¬äõ©{»øæz¶œ_íªvn£T{¨,…ödÉm¨,y“Hû}j7J?r/céG¶~¬ý÷ѲÏ5ÅîÎWSÌ8^¨ÄŠ #F(ôô>~@5)¨ØI¾íîLŽ<$újŽ¢­z'!Gsª‹Á¿–'*~_ÀÞ"HQ¬¿7H¹æ§ámwãh…:ªfèæý  ðDàÈRdäw0ý~ÄÛ"Ç€^¯WŸ–##y›¦ël=¼˜}þæãêâvü½[VDaogõ·È4~\w\’NÇ­S{Ò0@ù«"£œ^ÙÛ…†:½²¡Í;#˜_|z³Š½Ê@ª”Ê›ÕåíUw9öýòËÍìêjv³X-ÇßVÁÞ¼ÏÈ€,ìý½hÜbàÒ/÷Èlì)·[ìä>²é>IÒv½uøvg¨Âé~”-‹²[äiz¼$x0A{÷oª<˜ ùSRŸý’õ} IûêUûÖ‘ö­#ï®nFêÇ<:åAŽËÞ™ÎÞ:BR$¶ìmmOûñ~xõÚ­õl±±Ú³®q4¶¡á=ÓîRݺì·mÞáGP±v;ÿûÈÔ9ÁMùÕŽ_z(…Ïô›Q{¢„ÏëÕR¾Ât} à#6É%´$§O#Ã`ˆ0ÒÓvª¨pôÜý6Ó&Q8û?—ó‹å|¤F1kï—ô€¥‚ǹ¼žÏ.wÉŸï)ë~±l÷,–ûŽÆ6Aít”ÜÙSD"•­¨ÿäŽüÜ endstream endobj 687 0 obj << /Length 944 /Filter /FlateDecode >> stream xÚ­V]sâ6}ϯðÐ رüfÓîCvCÛLRÚ„îìÌîŽGØ«k,*Ë žNÿ{%K 6I&#¤ësϽç^IÀ°ùcÛ¹®5ö#ZÙÕ,]rpÿóPv&74÷,¯fgß7€mí10f‹}¨Yl|é~Hàš!Ú3]×íßõLÏó»×>•ÁTÎÞ‘žéݸHQÎGþxÝ1è}›Ýœ]϶¾}Çy!IayÌr¸Ï€À ŒaàYÀõ$Ñp¥EŒzü}¿ûc^æ ¯•¼ç3£‘ß½èË¥¡r3ZDLŽ…é£Hü™£”<ÉaÿBÄÁy™ÎÐrmÐä«ÃW¹•tzœµo;šLïïä0Ås iy |rДɴ ©-kg9½º¹þ0S¶Ÿ8ï³ò!Å1¢¯,RUÈ1»lr¯ÙOäÎU‚í¢È"†I¦§5Ü“Z_§„U¸¾5rFuï*`séˆ×ä«íÛ›A9`|P•‘áÖжFRË`Ì&Óª%,Ï÷Ú¼*©~R¥ñ7eþæ¼ì—‚Hc:)bÍ„eŽ«s®²#^ìk0*þí Ì!øï)IÓ·ˆ“WÊËqÓt£ïJJ"]Õ¤0ÜqÈ6ñ”Πʼ¹ö¹"è§9¤V-íu¡¼>E/²yXüdþ×@õÉ–rÄ;z[Cö³5¡VbV+…E. e!G,p_ïµ6U›Duê¢þQ`Ö¢fG¬uTæ ÆtÓýoʾ\Ø(ÅÑ÷çùYM©~‘ºê-²>§*ÚH|û- Q Å~ªY`Vdö ó´§ÈfHŸ2åN$¬Cƒ:›Y”È!Y<Ó[ý•[œµ»WÇÕ3çÝ%ºæ"¢O³'¨¦–(C”G75¬b[0²‚ ‹ÊzTMÞc”ãe¦KŠó^R¸RU›ñ\îPXXSQ)¶¤Hc}j×ãW©ÌÑŠ0T7ãTÇ™`â’GhQ]‰bÝŸ:´f±Î /ìr¼ZóÆÙî×\˃ðÐr¤J|¸ýõãõý ò劇¼ü8cË‚z®'Ö«GG;ß±÷îÿ¡²!Ñ endstream endobj 691 0 obj << /Length 979 /Filter /FlateDecode >> stream xÚ¥VYoÛ8~ϯ0üPØ©¥:|4ÍCZØAŽÝM”>´]ŒDÛÜH¢W¢Òx³ùï;)[ò·h D£áÌ7÷P¸à‡ÔèÙ¶9pú >A77qsu‚µœ‚FEòƒwr6rÝFæ pÛU¡¼°ñ­õqA–‚¦möíV÷]Ûp·5|VB"ŽæmÃê·Â<¢Pn;­ÕþËûãdè­m»–õ“NJÉ]/»U/±ƒÍê7º}ÇĶ£\E~F…Ïïÿ¦ð£ŒýK¿#Á{g4öÇ—7WC4xÀÄçÒ=0g`ÛÄî>}±yRÑ¿ºšøÞôó®:®é$Šü{<”Ê·T|¡˜XuÐFÛÀØt\§ŽòmH€ÛºPÀ$aèßçBðÂðd2½¹¾ûî°(¢ánŒøpë>TÒqÎÕ›~ˆ·ª¦e˜‡V»Z£µa”€Zïý{Ñ„ëX‹;oÀÿ;¨öÏœŠÙzNf2£ÜÇR¬®ðë6z£¼Ôo“»ñx—|£úk,hðPtröÚ0Þ-C˜Ýkªªû+·ØÖýXÞdG> ^Žh¨Ÿå¸ÀÖP$OtƒÇëS߯d³—ßš8ýíú?täñ endstream endobj 695 0 obj << /Length 2072 /Filter /FlateDecode >> stream xÚXmoÛ6þÞ_a &¯±*JÔÛÚ~éÐtZ k²íÃ:´DÛLeÉ“¨ÔF×ÿ¾;%KŽÜâÓñÈ;>¼7’Í<øc³Ô›ÅAà¦<™eÛ'žáÖëÞ=çÅL_¿í_ßv¯Õªh)75:¯Zý§‰%’SAâÆID’×ptŸûN†9:ß§Ï¥ÉØr­Ê¦cÀ÷ii"+Ú\•kj †ˆÚÌ™$s ¾,UÓ”ã”ýA¬”2—9 B¦î,‘w¨J–ø_« ãª}Š2ÍaÎ% ÿöáý•Å„Ci8Á¤PËZ@¤'Üq¡HʼnóV8ÇUJ¢r™¢F3(bë¢Zš#wó0rD­Ä² aN–£Ü¦*rûE<ð[ÐøÎ@X)Úˆ©¨¬ê•’tS¨¼z:ú8€5VÐϺ™\µ}}F!r˜6P <×OýQ|û¼+ÂrÔjèƒOŽì[—jq—Zˆ_Sä66{¸&,öÝ$î·A'¦åÍN”²˜ ¤ý°w>]¨ð9ÀV™찡ãCð;̤ hœˆò¿ù>&4´!¦ÁæB(Ñîè·Ç‘EžëEÉ8r²Š2|]ÁpÀ‘¶$œÒbvqŒ\“¸‘¹«ÌÉC~¡\ÎØBMƒÛ =åU‰9Fhš ƒ~9œ¡)ÂȺDhÃÜž)þ H_–V3)O#²»Ar°´LãH0˜t€ Öx{ÞíÖÖkc$ì&ëޖݺµVY •[° ŽgÐ?4DZ¼€SÜpÉ×”›ˆ”°Æ/ˆµ.SGX_ñ¢DS`f3¼ê­Ú¡øh ¦ 8ÒÃ$2­ly=Е_ Ö´Ê MÏìmWNí PŸæ]VD#qš>@ÕDÀ„p9f“‡&‚¨ô£cÕ¶"T{Æ,f@?†~k/¶»Bþ`>¡ ,È8`ãž>”nÔVÁISWö×T+ÝÕòNUíxe,› «&!je/¤kAä¹q7®-¹¤·n=ÆT ©µ ü0¡à!aõ z+J±î%úôÖE^‘ ÷éÎD)vlsFadã»Î3cÊЖIŒ¨^òÍ;;ãÁìéû`Žß/$¹®«üpʘëÇ|T”zjˆúz›ÆYéóSI§—i—É郲LÆ6aË$ΫIÀ¥Z´…&)³cÖW–†¸ukW£U»]]¦•/™Øøc]½cÇ&Ý8 YQЦ*›‰ô'TS­} ‚ý¦¯4=~ÐeŽ©VNöèx'4„ÈRö‚°éq9%ld½yGw[¤±ß jÔo%U9º'Œ‘H,¡Sš(Œì…Æ­·M88GÇ.à ̓¡+¡–Œ®wÝO•“î‰=3XÐè=uüV‡w¸ÏZ«â¢ê† æÍ´ˆrú‚ÂÜ$8±ÊäÈU*­Da½òiâ§cìÈoPÏ™>Ô˜âÒÓæuǵ‘LÅvj[Ý{ö³oB/^ا9UȲ²o"ôx|8úïì´×R¯r½ÿàKôÿ$~îô endstream endobj 702 0 obj << /Length 3268 /Filter /FlateDecode >> stream xÚ•ZYÛF~÷¯˜}2°’ݼ²oñÚFöÉd7@6ȶ©–DX$6iÍûã·®¦H‰'10ꮾª««¾:˜ø.‚ñ]ÝåJ…¥.îªæEDÔ~ÇïÞ½ˆeÞ&nf3¿yxñÕÛ4½‹£°ŒÊøîa7ßêa{÷Sðú`Nƒíï7J© ûú~£u¼yRkŽLýÐÝo’"ØŽGë •æ±J}ÿóÃ__¼y˜ÎN“äw2‰3¿ÌeVè0Vš¹¬îƒ…Ÿ<ø\*ØuÈt¡Ón¹±µÄ1ŒëáÀ4ûWÚŽGë–džƒåÆÉ´öÞoÒ2 ˜¨‚Ê2¯Ã»‹ÙœÅ$Ï´HàJÄ¡³G[ 2qqU„@ius"avÎ:aŸÛÚ£A&Ÿ¸Û ÖðÕq㻊S H/VaœòŽ'ãðUè>}7î¾c¹Ñ¼/¶ŽüŽÝ ®ª¡ñp¨e%ß[½ƾ½I ’DíÀ1³`¶O៭'ã ¼R»ÿÆ_¥Üp¶êð­hPv8l{a/Éíb¾^k˜P¦Á»÷ü‹OšÓ“ ñŪjìÝ+[¤x‘ý¡µ5ƒá–9ñXÓ;Y/sÜÊdú-÷êö4²ßùP‹òé²}Õ5VöøOëÞ ([•­(ÍÕ冺±Ý¸ª5´?U^m>ß§Y`úÚ|<¢zæ*pr‡ªÆƒI™òDT¦éFVzîãcÐ8‘7­&ʯeꩤw´Q-[¢nüšå´»òwå mp‹ÌOïg¤QÄã ~¤¼r£¹îò)€(}4ÍéhaYÌ„}Í‚–qVghг Žá‰òiÁêXËP”)Üeƒâ¢…@¼a‰Èzἀ̇vXcvEe‰õ‚YÏ399OŸafë0¡©«€¡BSêзŽL5 ÞÖ-šh ¶àðj"o2ÍîøK€ùéÀÉÆá<»7X«ÃLÇ~ÝióEP‹ –&p|êÅä¬sÖùAÆ/zì¤,Â<Ë–‚y‹{ÿý»ߣÅD3l.›“¢a™G„%<ÅSÈpÑöíU2Òü80&;TÆÙkZcM똈ê\·û5 ª:)¼$¾·Ã¿ì±«êáiMlYË'\ßyþåðÑÁë2hƒ#ËŠt¡øãØ·6 o¹e[4ܱ޲gf¼DÚo°ë2LóÌsôϱ^–Ü–Nç|ÏÕÌ7‘&«c-ŽwÆ%…,äSŠ%3Q˜§Å™IÃ"-ý¬ã0tm(bKò0/5ˆ-“\¢•¶â48=ëBç„ÂöŸzC×sŠ]6ãÙøä™ÎÆMÞžú|[{Z¬JQó÷½ixî®ï&_…ˆö‘ ,£ž´f"“ªÓc ^¨Ý!‹ƒ×ÿø רêG„–O¾_OÖ횬âë¡E—ËùrÐ7ˆ;‚;·~ i´ÿÞ$Η1ÁHî°ùç`þxS€€-áTäC äÉ­zó­ÝWÇø\õcUc؆Db]ï´¯8ø¹LÜH I{àùÍ€À¨©†ÌEzDcgîm¹3h½»¨3Ô]ë¹lìéÕÚ]@[ƒ2Ž'#pY€K=… @”4Bo1Ó@oÁ4RòpæòhíüE˜4½¬ã~í¹ð}aöƒ¹¬ËØßÃø¶ã>Þ ÍX2ݯv¬? :ñŽÝ(AeF'cÜÒDŽ皩âòp¸afñ¶L8×iâœÖÚ-ÈÀáûÐ)f~&YN«ž*’ ? Æ+òÌHe#ĹŪ+OÆÃ–ƒˆ%,à†žÑ„o¦xØ{g;òÕŸk{þ&ZÏ2 ‚K6,œN®}9ðà¶«Ñh÷Üã×x"™3ÆMpp*Ž –¦ [u+4ŠââHÐ žŒž&^Œ»ž,±\ÏÌIÅú²‹¤:qülª£Ì'_÷à biûÁºÃ¤§x™)p¥£\Œ;ÓH˸‰[Æ}…e®¯âDëßÎ~®»Ñ±Då:!³‘§(PXžH¤”a)Þ! 5äw™ùæ:øE÷ö¾DßJÊ!ÌûúcoúUwUB€%Ïôã[ ÄdeQð‹‚³9 ªž„Âéi©Õ …µç(ƒ®Æ p[†ÓÓnì+ 2ÙÛðoon ’Ù8M¬=oÞ~öI’8Ì‹bÉÈ sÕÃõx:èhåÚ{â=q¼A{‘Ç$﫾–‹y«Ï*– YCë›zó—º·ì0ß0)¬Äi :,î®iîa‡±­+ŽíWTg3-œ9ùïë.a¹@ Có [¸Â+O:ùF²­'i[ïØÀnÀ·mýž²ÕÂi¥¼x­L‘ ŠÊúseæñ&ú„ÂGÊY¹8@§{àÔ §I ‹½” á‚­uU_ Üx Ëðgvi&pRƒ-¼'ÊŠÅoedæKo˜E¬Ü`ë—Ê`±ò(”hŸ¼êxz‚^Þ¤Rä˜F‰5ü23ÅL€ùªN0BÚËn’âeÊP.$ƒ³¬–©~éï·A×Ö«LÄ®¢™aÇ8AuÏW.8gÜS[úû«†¨¥kÕª<,/üŠðÐÿñGÛÑÕ«"s6áÖ§“S]‰„®\ÿ‹ €¬òªÜM‚ʃާŒNj8¤â0À¯]ü4HT§b¿–p&ÙG0KçP=dàà×ÏS7¦\ 0Ñ6µìuÆìµöÙN¬[t3~C+«g‚XÑÓNŠh˜R³;å*ªi÷â¶y†Æ ƒÆêö:Õô’9?ïŠ1c•¯T¥b(E˜ôžßGw<´´A~oNZÖ´«H©p÷;T+ב䳄OG æÅ½0aøgQ @B¡›MA@ûu´”õb%µMJÓ°Èã¥Ä—0©sù¨óD[§ÚR4—³ü5}‹À×hÿ}@óg?ƒ8îNÛÞàVelꈫéÜ>Ðá?l¸ª;X#@xŽÒkÀ ¤3ˆY±/B×ø°õîõ{nˆ+ás ‘æ´ÙòîWLñWê;Ø¢ ùäQžVÝ=%üÉ’0QúÇ;øyz¶výïŸ EøÊë« À@pw~:÷õ`ÆC™QÂôXå7±„+I¡lÿF,$³¿Àéõ¦>ÕIKíA½PWZ(öâüq»äÌéãuÇ„Y ¯ÈúIz¶>š¹o‰\ãÔó¼øºØµáô‘j J¾Á¦d7'¥¬ÒKØagI-ágŠ-§T²ÁrJŸ–é„„l¿1¤×T ½­‡ûL‰™ºÈLgüaYÿ3=…Rɨ\L%Ó³< {W1ŠöLÓV‹!Å,¶öûÑÕ6kvÌ’r–K’ …~ ÿT¶¸N_æ~úÊì Ü%¹`Y$åÆþIøƒ@y)âÔG[.¦/iÅåŒÛx„ µ*ºfÁ¥cŠáŸª;ù$ZqEküð+¯úHš}®s~Ͻé©è»\|ÆƆ›=ö&æ. "ï¢ç~„À™2áLqH§2= U2ÿÁ+ÃÿãÁG™Jþ2ó•Q HM.Ó§‘x©œÓˆä#0`˜°| Ê¾q󗼌u©ÿµ;æ endstream endobj 709 0 obj << /Length 2302 /Filter /FlateDecode >> stream xÚ•YYã6~Ÿ_ј—•mµ.[òìÛIc‚I,›}`K´ÍY4tôäǧ.J¢éô‹ÅY¬ã«¢;¾‰à/¾ÙD7yš†›¬¸)ï"â¶»&~¿‹Ü—3É=¼»ûiµº‰£pm⛇í|«‡êæ¿Á{uìu»X¦i¬?.–Y¶ ~|V£jæþbˤª¡ÖP«<΂Íjñ¿‡Ÿßýø0ž½J’oT%ßÖr]daœf¬åA-@ƒWÐg“{š<-’<ÐÈIƒr±Œ{Ù¶µ–Tí÷t9˜¦k0ÃÊÂLž7ø3Š3'ÔïUÏÔ½18óiFã‰Ï,ÞjUuáb¹†Å‡½é˜Ë#hkñ£gwX ¬°ŒÓ0^ÉÝ<½ÀÞ¥j˜@=š iPv虩I|š³e/¢òy¿7Í®s´yð÷‘vÐ"fþŒï†5ú9$=ã \”²«0/bÖ–/˜›@¿¨ÃuÆÉÐald›NÖo¿Ýfª6ÝÑQ­j_yÒ[ªíäº xÜ/CÂn[ýrlu×Ûtn®†ê.G}Ѹ¢ïüVpí< ž[ÓS *Ј»#1sÆ?D¦ëÁqP©¶b†iŽCþÎ’•˜¹p5âÛ‘”ðá&ƒªkáÂ]{¦ì–GOÁóè0}§kM!-ÿÂ.€âšYÏ­í5³éÈŒ\ò.0e4hùŠ%‘—ìVDÑ Xí!txõþ‡Ï!¯ê™cä;Uw–WJÛL)Ù°åï$ÚYïr⟮ ¸¦Œ zB ˜<BŽÄ3®á!C'³¡©t‹«x®x +ÂØ î}\‰¿DFÒ£4˜%ù®Hƒ[XÍ×p°/\¥´‡{’oÎ-À:Ëó½a i²Y5&%ÚN¿wœ7“2fI¹Þn¸o0uÌ 'Š?ótCa ´ºÔÆa-2Àe-ËM‰J~‘“Ÿ *¨wÖZER¡†à)V´{Äì÷HÓfç¹+­å2Sâ,™­Ùí]hÁô`9Œ€|úžá/ ž œäXmG¨´•ˆ…£xØi*@™Æ[ð¡„öSÝ*w\SÑžž'áño¾„xEÎJ 8wÙ²p¯¹ M§!w§8° §JöC…Ò9³r–Y8÷sÈýjhõ$¬+TŠðz^„ÓbFénB7w1¯V' …“ú'v9™œüšEÅ9(«v78 A˜ÌFâ,$Æ„S¬+.îÌ“`J˜fkÛƒê z—ç¥ÑßK ¢2YG€4Ýó¢êXú™R9öY­‚ÿëR„¸ªó7#MªÛ ˜Íµ*ŽÈܶ­L#Ž.OG“˜·£€ 0Yq0(Ÿ¥g}‰½@ѧ-NG3ÌD®ŸÒ°Lpƒ+näÜ>¡F8—¥ÃêR¼l¤Ⱦ)\6N /…—“ì('4ãM{é" ã(~óöó9,ªÄ?¹Id{-ØÑ±h‹ðRË‘aá{ùîmœ$÷Íô+Y¹gX–Ãõf8;Xv3Ò|-¤Ͳ2ðÞÂÒë$ñU94¦ä.÷\û—b[”à"=Sçüp'P¨^¬ØäkEöA}Îþ¦]TQ~åx3_1P­ìÔ Ú#¿œQüòANLïh>ì–'Ö'ËïÇß+/ˆD~¡KwïŪîGOœØíÅÓ˜¦D%ågÊc­šY{tvùoqÈ%ŒçsÃD‡ž.½Ç¦H.¤]«NBõ×]z]¥ÉÏνPŠâhѯ=´ßØÚÈÆ{+! ÎïR:3mM#‘D¯1Dòª‡”ûÞ!Gë&88ò¯tmlùÙOºéOBæÚ- > stream xÚ•VMo›@½ûW ç‘ذÀN?â*ýHª–ª‡$lÀÐâÅ‚u’ªêï”5aY6ã™7ïÍìX1ø+ Cq- -lOYogF½Zla|}?çó@½ùΟ], Q°Æ+~Ü…òCå^½J‚‹ M·,Ku.5ݶ‰zý—h‰ÕϹ¦›žäq±­.íÑÿ0»öÛÚÄ4'’¬"û,.KŒ=ä)Žg#lÙ‚èYJ×Ù>Œ4žOÔ×% Ó%o+VÇÂd(rž¥å%sMw=—¨çbù¸÷%,ãîîý'aU™µ*‚â·øs~!ŃUwéúW¼§ëº2q;•ã¼Æ—›«Ëï·Wâß*Êòç Xa í-Ìh+×M”o#Ö?¢Âte@‘i•¿”¬HépÒ§jöGú,g+QœÒÃÆf)cYÔâ7Þ€ÕDrMWV \ž!',hO‘¡«nƒ•§”!MÇ1ÔÛ;ÿúìÈIAÇSÔt"Ýîò‚”µú{ ¨$ÁTÁ4zÎZ¥=Z…9äñaó–Kð¬~Fë†m¢’bhh;Àüô¾­“ 8ãý£Xx»çŸ«™7·ßüÊE{~€fE@K¾Í¶£QȰEC¾ '‰ˆé¥Ž’ñÿçž<Æ­:F£|œ£~Oq –9<ÆDGD`Ȇép묄 ¿ßŒOhÆÂü  ž SŸ®£0æ(LGT¦+ÊšÂFÓvqì“›ÓÂtU‘ ª¤äAg²¨>NW”;gŒª|äp;¹ºó£¨vÛVhKg›»S2Ív¾ ¤8™,T¶§”4$Îî 2å΀LRgÎ_ =NwE¾¡|fü‹‡€ÿÔ‹#›Ø²gÇoÛ,®rçÕ@ª+UX¢š.%м¿S,òÑq*§1Á‡$Åq¶/“*š¿¢å{6mõù°‡Ï endstream endobj 718 0 obj << /Length 1191 /Filter /FlateDecode >> stream xÚ¥WÛrÛ6}×Wp4Ó‰ä a‚7Qíô¥Ž“q«¤7eúÐô"!™1° iYÍøßXÞDªr;‡+—³gÏ.–ذä?l,-cá8héF¸ŸXÕ¨ØÊøíÝëy¦œh¶fþ°ž\¿õ<[hi-±±Þ¶·ZGÆŸ³›{’æTÌMÇqfþ·sÓu½Ùí“b$Q£ïùÜ´ƒYT$4“–·Àîl¹˜ÿµþqr»®ÏölûBåÌS”~%Æ ?pv\ôŽÅyL’øúÉò,ù‡KrG;{jÒ—j cäz®~ÕZ¹4—‡{³ÕÏ›Ï4ÌÕ«U‡°çwsKsv}¥Þ®ïãLYðŒè6f4R?6Gõüåîæ§·?ÜèQšðƒ6 }̾ÈàÀk îï†<ÏE–/=ö<äZK ÐEËK^ Aíä×!¦ìÅa¾ë"?°•³€~CÕ³Èp¬)Èïõ«-O$ؘí45oè¶`5ÃÕXH’¤ ]ëÀ¢Cýª PCc;6:ÍÞÓ’òék}dùCÛ>®Võ¶K¯Oß±V ÊãÞTñRö=aQ¢íiçyB7üi Lˆš-e$¤ÌŒò-ì »?pÑ~8c–o+?Ëÿ%šüå{š‹#@oéI:3¾ÑÊ{~.ÿ$3‚wrj–Ëãv§¤õ¤pû” š–™tŒ‚ Ae”E)Ë3MqF5ºwþcLµ²÷„$éQGŸÒ„0’Çœ¡q•{¶Ì} ðr•cw\Ç7¼’æ…?<‚®¿åHãë‹DÇçễÅÉ%F¡:J£R§J eóª@½†øT•/9öR—îÓüÂi;÷½†S@ÞªíJ4hTÎjæzoAe C 'BñS¡²$å æ†4~¬KTªçP7sJr+¶*£“+«»ß×:[j>FƒÑK‘÷äö(>I·°2ÎÌr Ù$ô”Ú—Êv÷’ñø³.àÂãÛ-¬ûò­2TË+ãà4ÑÞñBôcØvþƒ®HšR"No–ÓÌw|¾áx¶¼õÿùŽk#/:bñî^cªÔz±Æ†éïs.Œ¾$Å9{¥AF‚zë3ü*ƒÂ^°¨N)YæÑÿ¾‡6r³0äšÔÉg&ܯm•éü¢,êÝË-8Ïgµ:Ò@á!pé„‚÷»’F¸ê.í.‘èB‚6Ëd3dv{˜«VG!ÝÖå}ž>ê‹/â5ä¦ZBJœ‚‡ ôÆRÓ†” Œ‡$ÍŠ²w=M8ä/d»,ÌYF lfyu 9íÀ ¸þ6ýê—‘=müGÔxÜ#»&€ë÷;AöÀé†sä…F#âœvœê5¼ü iùpú  1ˆì`ôDMúƒ®œÈôÊëfO ·?=h!ÑÎ|®;ù§Ç>ÿ½F¶²ÕC²-Ýõ¹ßðèØ…Ÿq^caAŸ6°´‘YÝÑfùpD슽ô½{p½º%à|óY”Ä{¼Þ‡QXè[6B–èl¸FDZ) ±Þ/‡yB«%Í·ýRÜÕn~.Š*úcPߤӪpLëÎ÷+Ÿï ¼ endstream endobj 722 0 obj << /Length 1311 /Filter /FlateDecode >> stream xÚ­Wmo£Fþž_A#õÎŽa øåNºJ’kÚ»(mÝO¹¨Â0¶ið.Ç‹_®Êï.»,7ª*KfX†™gÞž]ˆaó1f¶1qkæN`sf—«éÊÂoψÒ3¹¢ÙÐüq~vuëy±­™=#Æ|Ù45ÇÁõÚOrH‡¦ã8ƒñ»¡éºÞàfÏ—¨ËÕÏlhަƒ°ˆ!ã’7!î`6>Í>»™W¾½Ñè• …æ1Êq%¹–7šã©kÇ•P/„KnÂ$ŽE<\ãæ¼Á| R °Ï¥”ï˜ütUl€æÞ¢j±Y@ªVwë(XK1K ˆ–e gÑ7ÈpÍÏ5(DÃ@šûEo©PïE4‹BhÙ]°P¹bËÖ£$e„âÍÖ¬ˆC)¯ý-X'0ð|dpŒ Š½È@YZ²T™ÏYÑU ÃÒÐUo$~¾Æ€øÛ?í/ÍqXQðŒÞÙâ/rkhÛ³wU#xÃDש©kÈè[Uã  È_°"o¼ÝŸš&h8kÙ‡ ®ìrÔ%±:õRŠ®0ä²å&¢Ñ¦ØœâÇ1ÛAhu¦îdi•{?ËõWb±UƒÅ,xÖK°ª UP u{Š«³[m‡% Ò/…¢-èDÉ•ƒ-ÇÙ_ïz¬ÀS´¼„T‡­“3Voný4ò±6IJ  §ê¨5´®j´/p‹ÃÇ+ÓœJÐÍÞß$ØÓ:n9\ò¯¸ùÌõ–!#_wÎÖG`›m;U,Ÿ~ÜÍWåªéYN³Ít=Ü]ÿrûÇýõà'ì¥ÞáüÚaïïr‘Ëõ\ýÉšG  KÂdB?ØÊÒ›„E4W7ÛÆú–—öêê®€Û ï%vÍ›töÒ î [€Ó}UÛŠø²ŠøîCSr’J·€LYŽÌ”s†ó±†´Ä#ï.®JYù-Çu§ $@SrYa«RÑÅÊôhj±t„“/ ¿šS×¶«¨w>ö%Û5 ÕrÞñ¡ùî|—±tå±r$Àr73×ëp£M îÊ~ª‚¬0÷æŽ8Òñ&òð½ÑÚ‚p69MúúéA´¢šÆ‹¤Â€±4Ìô™«ý•m<4'ÓI_âtóÛךÇ>“Ùšc§7Yšx=qÇ;íhXb?áZdÛ[N]Göÿ½àÓ˜Dß¿GûIί9žr“ˆ­ÒBÚzF¶sq-á+²l ‘}Ú%yª)C/º¦™k)ƒü¶¢BEA®û#Ž–5q|'3YSDã5Oƒ’ð£W¾¿ˆQMÕh~á'àó’<„€–Ê˧»ßçRz©Ü¡FÏÛDéé8•>ÄxNìÀVÓ§xt¼U¨ò=í‘ ¶×7¶$æçÈËÖA2`1rp”céWœ_I`*£ü-v(í`‘Ë›íÄ!K7ÇéüÕ["é,Ï^Ì ò6¨ª¨jÛíKyf°{tštʇß+ân_•ÚK]ûKü8ûZžy®e§™k6uñÍå7„y)˳_;¿ÅfŽ5òƒL¿ªÏÆÄü€4µø­Ñw®mÙ³“™<Õèí6Ö‡·9g¢ê!k¸Põð“„o > @+?é?ÆÚb-—Îé*Ç ¦»ŸŠ´ž¬ÿŽë•€0TC‘ˆZxGyC5Å]–ËóM?Aècx×?É´½ÏTôP»ZÓ®R•>·H§4¡úþà!bÞ endstream endobj 726 0 obj << /Length 768 /Filter /FlateDecode >> stream xÚÝV[OÛ0~ï¯È†Úª1vçBµ= ±‰± Ñ^€Ó:m¶4ÍB€RÄŸ»%NܦíeªTŸø|çâ/çøYÿBËÇ„n`fXíK _ßuÂÙh×o¢ÎÞ[B,ACdEqÝU4¶ÎºSš—¬èÙã®·ß³]—t|+£©Üý8ïÙNÐ_§ìŠKÄGn7 {чÎa´ŽMç™I d;K¯ž%"BË \€°+3í÷¸%éÞ&åTJ£;šIér¾© ‘–r-§L ,çó$[©³±”eJG?¤˜&‡âIÚD´°4g“¦ëñ„Í)›½j×&Àw|]•ÄÒö(ìåÓî®\_ܰ¢ä*$ï+7—¸ZRì ^€…Ù¯äšÛ¯C•˜PßµÔwuõ²¥^Mgagh{(´=z~¨¼H²2ÌìÜ+ÖóœÑ‚f#¶"¤Zf”×g"ê³¶9NâøúJ¡\¶<¨åœ×T&þä[Â.ÀÖø=>:t”áUª¸G'§‘* žéU> stream xÚ•YIsܸ¾ûW(§a»Ü4p+‡‰cOy¢¸\‰¦rÈäu£»Yb“]$[KRùïy¸´(/¥’q+šÂ€Ë抒µèP…EÿJ>E,ºòÆžQ$l²K køëÝæÜ;^ ›™ ("ž‡šzãßã(ÊþhÏã­ÛŸП‡ ­Qmäê(’Euƒ£tLx(ëmƒˆçyìËŠ»=T‚N†‹|ê™RÊ–»{‰;™²u2J¢Ö)0pâÞm%‘†Ü hzœè×x Æ–]JiÇ1¯CtÒ9ZªEÍz0€¸Qªò ²„Ÿ7ž‚‡rK&9[‚ë†ÁRˆ›3q®l_ÞOöFˆ1ÐVÁFv¨WA%m¡¡ŠU E,àfXÆ/3\Z ‚D‡Yšyç~^b,Df¨yËG dq¤‚ûUnËæ,„½LÚµs[‡±E$Ò0îZ{äN×Û¶‡â•åd[§qF„‹Êº\ êÇ€djæ·Â:š?)Ä“\* $U%(ð¶µí÷o½ŸC30àž ö‹X‘j(ÄܼFE}½#P‘ŸbÚŒ‚ŸëÉqƒÔÈ¡x*ÑÓ;´9K‘{)ŠA ”g!:ˆéJÀYG:ÔÚ\`c‚Òâ¬F)r¦ âïšÖñ«aÏ£#à"Á*  /Ôšhú»s½é±fÀÈ7l7>ÛÕã‹ ÒÄY›Ai×P²ž—ñ8—LA0'8–S‘Ê‚ó$Ìõ1hO§ gy‚Eì7çv‰µê5& ¨ã–øÒPñ¤é$LBï ž“Nó-Gà_)'02tª@‰-ëšÆkkî!ˆ ëüaóâ*¬T{ñŸ• Y¦Ñƾ|zÿ׿}~¿X'™< U®gÁu´›¶!«&˜ˆÑš$@´o”xìD’eÊ-x‚/-"ÎÎ<‘ÂI´Žî£yÖ~Ãå¬JŽº•ck^d)SaG¡¡Â"¦Í C*@Zþ¢Ü¹á8€*ëMuÞBL1š×†0É2ù¢b¦AWû‹8“«0‘êä¾r·ÍãÿIæ:â€1„0´i0ÃðÄ=¨Õõ¦@fk¨q˜âÁ[ÉÊðçQô MææY>ÓÝ ¯Èä&¼À_˜¡^ZrÉ<ÌçÅ8BjYÃíÛuýxÛ¤€ãëTÓØQóõW>uY}Oc¸·.ÅÀ„9³P,Ç8"ì¼L Á†Gê¦/wOÜ>Ë쎘e™pâ}ï˜è¸ èýìIüõY²ŸÝdÒ,èžx±}ä>Y¾”ì7“x¼ ú_Jk¸œŸ¹ºwÇ‘Q8áèÚ¯´Ä8·à*YÙÚb^ÀT'PgðÈÞÕ®…²fÉ9À…N¾‡« ¼÷ì-Wj„± „ÚqöûóÈ5Rf¨œ *gŒ°){ mW¹‡!Ú¡ÒØòUgM-pqë°/Ç [f—e%P|Þ\¨Æ,B.á1›j q&Þ°)jHBMÞ¤ñO9[fð:~%YèØ—©Ôr¼Î×Ãx·ª„VÊÖ%ËA ,Å4šsWs†b!‘s/lß„©ê»¥š|cÑ1 €”Û7wÆ2:`оÜ@µÜÊàÌœHá ´:»ódÆF¦J-•²þ`û +zëÃ'²‹ðBAÞH†’ùõ’Gjs?£Y¬)@ìÉ„¥…}T~­¦u$T:Wy<ÈäíñT9‘t,}bšËGt–5Î.Ã)hPü¾P@¨¨•þv”‡J Yitê$¹øË½ Lpb2$Cÿå#S“N´”C©ÅY÷>:[w^4ÛBòèô8²‚fI]¤¼Ë80#5¹°¥& ÿ¢áR'ßT`ÆÉä…†£3”Ŏؙڽ@û*3£Dµˆ³ÝäÝ«i·eMœHìž@Àã¹jK‰™?I.LAõ’Ç?n° öóbˆàDýX« i¥‹ãÉ5{–?e…趦;µm±ýG .``†¸ 6¥žŠ!¡ ޏ°!è`wÁQâ3×`}½kÄf°§ìKúM HâÅåSQ ;ÉW½•+YN澉•õ`à`;™1^Úò ©r/¤F€‡Û|Q馳1Ï¿€M`št¬²K9}Pü"r‚ÙÍW‰Æƒ1ÉAÌÇ;‰”bå/Æ¢?ùØ-Ò0+ÔÅS¹×¯cŽ3,Ѹ)[" $¾\fþ°Z õù﹃›kÅíá44(Õ åú~°åxµÃM}q–=6ç©…©ŒúÖöv¡Nðª)~Oê¤wë+ìô-8øŠ}–°`UøüÑ2@Ó»¨¢7ß´cCô}ç§ù£…ùbT>Y¨DüRi·«êý©ü*uYLKˆ¯–»:ÓpëØ@„à ;§Á´ÜŽAùx‘–½¯êÌzîè kç ‘è½|NT¨GŒûÊc@>>vƸñ~|æËü3!k{t"Ä k‚ð;ïÏ:TÑÅk²xk9”²&¿s¬€t’aª½ƒ_?~u³hðž½G®À½‡™À‘Læª)aªåÏ©~yýôƒ¢LðÏUnHhS^ŽjèœÿŸêÿ$7°Ö endstream endobj 736 0 obj << /Length 3687 /Filter /FlateDecode >> stream xÚ­ZÝsܶ÷_¡·ž2>”H‚LžZ;vݺn¦Q§I¨;JbÌ#oHžm¥Óÿ½û¤x–œz4£@`±X,~ûè‹þôE]8kUg»Ã³ˆZ»Û .üóõ3-ý¶ÐqôüóÕ³?¾J’ ©<ÊõÅÕMHêjñÓæÅ]qÊîrk­Ý¤ß^nã8Ù|ÿ šš¢æÖ¿·—[“mö§ºì¡”ot¤/¹úë³ï¯ÆÉcžÈ%ö|œÍ4‹•¶1³y} Üã”Ð3 {êDÅ@–z}#f¤åŒó=þ+°Iº)®iM-’ý€ÿJu¹M´Ý\ݕܣ+EÕTÍ-WŽṯî6Ew{:” ¶ BshåH¬0jŒSFÏɱڽ_cפÊåãŠvíáP4{&|[M¤›æé˜™ª¹Ô››¶;CÕ6Hõbk\â³[m•N˜š_õi€qyLœR˜AÊï¹Vò4¼8ß³ÒÇKã62lßòoÓÊÇ]ÑɧåTÀ¢ª€W”Xžl¨YŽ4ë9hžŽ6};Î’ùYú#‘*wÕÍýÈw/?VÃÝš´#Y¸æ•7U½&lí”Î̤ õ?Þ¼ºÌ즕CÁB²°Úr(ªºçÖöfñu©ø­]UØ,Q(þcz`°è{=gŠ?–åòØÙØ\¤‰Sì5;•@»Â‘ ” Ïß¼%<ˆ8v ^9ˆ!ù‡€áxí?½~ñöañXÜ–\ÒQ¾d6vZYX{Èðyœð½aqI”ØT| lšª8ŠAà48“«3ð&M¼ÄoËöPÝý*¤h¥ó±g?CyKœ[PÄ‹ñ«ÿ I.튺.÷«Ú‘Z•ºäQíÈ”ÉRß‹O'®dF@®¡‚Iî…ͦ<<¿Ò\Wýð\à"3ÊÀêC¸˜®øÝÆP-ú5¾mJýÖ€·o~¼b ùïÚ"âDgý˜ï€¼Cô¤5˜œ×‚2Å#† )e?p;aDá—ƒ`sÃýBÀ h¼åö‚h£Nu̓pSàØ;«A/ ¯Ìu˜ŒžÌVÕ5‹ Ö©l¦çӕǺؕ8ÈʰDð%@1T§;²'øáÔ—7§šËbܨܗÍ~ìôèé ( Z©ªüÈ­EÃп² 6Êá ÇOÑá8ƒ¢{`gˆé»RŒˆM2E‹¥Ò~˜,Ã5t\òö£çê¸VÅÂ|W~ø‹·&CÚͭкi…Ô9ëise¢ô Ö3O †òWÞU½Ù <ñÐòT¢O\iÚf;šÁ$FFÉäÀ( ž:o]SÐ]à0<. àºú0€+h$ËEZ ªÉÔÅ™7­Pz]†[-¤tTÚW=(˜(JH¦j<™RèV¿I‰(Ԭ̻€3ØãNº‰­Åu-¬æ‘¬7äjxÎç¸YâxXr îÑ•0/{KÖÊÌØ¿¬ÙÆãÜü5fÖÙ>Ò/¢Ë ŸEÛ™q…ÓÒTÒawº&z%¼ŽÁ‰\÷­ÍÒMCj‡¥›S³“µg ‹,K…|ÆÎîöHÙ|¶·ŸäÔ¦¡¹ÎÁ¾7{®2( '7ôƒœ¬ÈfµïY^Ðk‡Ê[&@„ýdì¡Øu­SgÚeó=úÙ 5¸ã+§™\V°DM¹+û¾èî¹Ú'A)²\4Q&x{ª÷\±’{•2¶8H‰—‘!$0ÜbÙ‹q;Jœû§Q"2kÝpd×ÞvÅA­­ãÍ oó=sÈ•]5Ю“·…- 4…–™MgE¡Õâpò%´Nƒ×¢–ß7´Bc×@m –êŒÛñÀ’á!'~=õóíòùèåaEª¤Pñ:`Ù‘”øƒ!špØà a·!ýÉã¯ðÓ Ù¦,÷ýyX}#H[6eWÔž/™¥¿ç¥Ÿ¸Žú°vÜqò³ “«8]™jÕëì‚SOõç(‰x”‹î{”ÔáÕx}€­ÒXÝëºmCú9ÛpŽÒÈÒ»—giÅÉißV¨×d·Õy¬²,ŸË…m>wÏg–À¨Ì¹$ {YlÈ/Þ9  £&òà µÄŸ†2¢!ù åþÔI?ÔHü±;î½·†6Ê``07–"îŠ~}ë ˜Éuú…F€=Óš©“ûÀn°KTœš9 …ÿó5©&"oh €AbتÄV6F_E–бK/©âiH6å¼tãMù©Ü åà9ú!yÂ0Ç„Ã<£Àšdö€Š+ÊW5ʩ̧/~G©Ò™[` €JÕPƈ-\ž€Í%WœÊ³ð›ÒHä„ÈWIq¥2„¼hþp‰æ²>ÉG2ˆÃôq²u9»hÐãH²m+a~.¾˜ï”lÞ‚“¾õQG¹“Ø:Z†O¬§àÂ/m üø¼®éµs*ž¢»·ÿ¸ÆIo¿yBqïß0]]ôÂH¨ÊÜrWoƒïͦKÞ|C¬3ˆ‰""Áˆ08›ÿnX=u´ôë“|n®©ïÅö5’à…­{OÊ,F’5Ѱ²Öá ma‚[ˆ@äÓy•À‚’E¾C¡}lõ$™‚¬kWïÕz\ñÐÂ~Öfj44ûrW%ããµÃ•1Ò«¹ÎzÞUÍJß•Ãx(p@%¾Ñ=·¡JÎ:ÍðÛC4†÷:Ùü›„9ëdvBS«bZïtº;ðC%£Mª^ñš¤ÀZç“£M'8'+¥Î™À4RfBßeŽ&»é(—F3Oñ9'ÊDíõC»ý‹¾¯n›ž+(YH"u‚ÝTKŽšã2m`Ñ E^ìŒÕl„¦S¤YM\ÉGŽäb¡j¦4¿4L=ÖÔ,ÏhçÒ&&½ q**J›ˆ{òºk;Ð@AEIYë9oØÄ,wã‰Ùø'­€×ªtô"ßU0MÉBÎ1Lz{½9§;ZçÊ™Ñ1àK Â÷0ÞßÄ"L:€•OÆÊeæAnÂóÞ|Q÷m,˜¤dUëúQSÆ Þ?¬ Ü¥¡÷út?;ˆ-$M, c5àñàñu™aKKÒ›‰½0øvuÓ ‰$r"ÉÙ¿üþÕc®{š…sWÖÇ~è÷“ŸàsïÚ¶Û÷÷«aÆ2ÿñ(±j=·? VÉl5ØødJŸ‡¿cø*‘űùŒÍÉ|›S~ZM*Åʦñ—:ÏQüÁW¹¿ý¿¢¸q®òëðsƒ—_ƒŸ›¯³cÇc±~Qúå*tF‡f཮Ü6‚(^ÄQª¯£_‹ÌùÕé/ÙÿßËøèPÎfžÒu»¿ÿ*Êôîå9Rtní2¯p±ÍcúÓ¹ pzÕóBg"›œ ²ßFÜÌ’+§ž]vx°…S§ìx˜3—Œ"‚$‹Ÿœ²vaÊ:¢;²¾‘äÒ`¢¦åúÔpûhÙšŒsosÁŠYp=Æ7¢Ïå§]yôYç1‰ëüu4q¦›ÈŠS'ix±EKzÎVºv’Ù†~§ÛÓ3~–I@@O¸­°F¹)&ÁÐ?õ’à„;•O·Ò)–éj“$­bžØÄkѰÏšíµÊ&yèþ£Õ—·°¼³þ¢¢éµÍëo·Ó[—¡þák “;å\za,F_þ¢ÂßVž,,§!,ÇO7N•j.ÿ„+¦÷™óï+ ¼Ôï+b8®Q2cÿ3ï+¤÷#Ì.‰NAl„ó,rýÞú}·‰L š÷-í¦¤Øû®•‹ú•Ì„Žù”8˜û|K­Ît>¥;hö "½vC[Ò0¢ÁbOƒhNøc|#Ñs ‹°m»á·à6 {¬[€O÷ÓŸ;C (™O(æÞ‰ß;áÖgÆè†¿P >¼{¹Å0öÌ1Æ[l•¹bÝÔm1œÉøêx4 aÂ×$ÆpòÊØHB(,BQÓñXß‹92{.=¤ˆ&ýÿ[ˆÙF.þò:ÞvÕ¾˜hg !/jà°’+{B‚,‰“Åk©ÕÄîŒO^PîdÀ]!/&¿ñy†ïÎ_~*GzKÅƾ]Þ6aÞ«žòÉ×ëó· :8IGÿò#æØÏ¸Ák!¸+N}>áÎÚ}‹V‰qkL(>šDó·òvùÎÜ¿[BŸí<£à] endstream endobj 741 0 obj << /Length 2986 /Filter /FlateDecode >> stream xÚZK“㶾ﯘò%׊!@ìá>ìî~Iþx¨{×Ýoò~*¦4sm¾¾©óP+ÊæIÅC{j\ãÚ µ«„íˆV`“ž…‚ Ý‹÷IJ{ìÜÙñb«¾n–wÿ¾ÔO÷Ú$ÕÑ…ãô­Ÿ›NänãW6ÛHÕuŽ÷ D…!­áSáC'ÿÈ„³9G5Si¡Ç“zlbÊ:-ÇSïÝñxæñ-NúÌ•SÕK¸ÞýЇú„tÜò‘Ð5\}îê¾*þL[®õ8R‚ÈTZ(1³ðQ à²,“ºÇ%ˆä¹>±F}|ÆyYêÌo?Ò:W\ †ÖÅÔ$T–j-%dÑh“ZY ïc£˜TNî£bc©-G³k;^ÖCç*ŠÇXéqß´õ«ƒÏ˜‚NA?ìyØA[õù3æY–ŠÌ¼9©´Gƒã9o͹2ii‹¹9£·óHål64Õq²Ÿ¾å£kÉ|vŸV¼8›ÔY7ˆÈåò¼L>ÙJ}HÅd´z6ÞNa†)Î+ŒŒ;î]7Ü@VI-Ûêìbj’°9­Æu¬‡b™æJ„A‡&äÁÑ‹)öcÓèï¬Ä¬L‹| ÄNL¦å›Î®Íx`£WÇÑ@ØÑ%š"Ê"5ùxl…5Á±µ `­Á//Ž«„´Ö$¿ÝoÀ»–k'ªUÍ™…ˆ(-硟۞±\yY ;à˜_^I:¿ Ft»œÙïï6…M¥Õ³È²=†¨ƒ‹AȆîPèꇃÙX=2ø7/}Oö–Ah;ÔG7ë òÒÑϱqZ9¼hZ?Ø|ÌSà}å_Wü@ú+C·ÎuòC£ƒ©ælªsRÃÐÛ}Šº^fa”ñ¬Ž;ô2Uj´´|ÇS,]¤rr'Ú˜.Vè•4©Ñöz4¹Ôz…cô Ë|¸ÚFè¾&w›ÄŠkb«} ¤ý¡ûÐÇ~á"-Aï¡«ÐHh€ãH\[ø)¶ÖŽ•Æ!—Çr,P:3œ5zøÂ (ºzЇ2“вX˜c".P ˆ Ô®Eª üþ µ$ 1¿œìÚÅ-RÕŠá°#á\Dݪœî FÎyègcAét£†wÁ:׆vR°¼º÷É[IbCŠø{pìvè›ý*ô@QÙzpžáæÉjoÐùWW±‚‘V£™·`‘Ñ9b‘Êò‹°JYx2ì¨L&'çI`PÄwLw²<¤;X[Òh›èT}¨À¼GsÃ67Z×Í4 kCš/îyÛˆ0ÝÃÙý A~ 3«ÁȦjbÞ„žB·Š(›Ï3UÃ"·ÙÕ'לëW¾Ó,M¥×n¨Vb"n5#UÜrG…ër‘Âõ9Fõß¾«~ç ä@j%îPuç>6Äw[†y4ê°±*-²<€X”Þ9œ ñ“]ÍJ•WÀì)1“?;°‰8XgPVò Ö|[`¡ÜÏÓ-Ãã´åÙ]Ôoo]ãMàëxFcæôîÿg =Nä1”À€ÏQ8?ò³©òZ™ê¹‡Lí 1tsY*ŒÄÜKuzÄT6Ÿ¦O-xËüI£\çNUÝ$£$'S‡ëê#˜!Ÿÿ„÷óºäê”ú, Úɲî4ÆB?ˆ—ÝV”ØàÕºÚiÀ¸R-Èz8"¯ÓC-Œš²tüÝ9î5e¨Ós8qrcîÑŠ½c°¢G¿êÌy{ª¢G*ò<•SŽ®©ÑCµ©(ÄëüRš\1?ãÁÜW[÷˿ܿÉ/±ßZ¯k~‰Ò+ü²Ìôœ_ºüë­#ûáG×<ô~;#Ÿf àó\Q˜1ç>ž9ÎÓü¦IY踿‹Àˆ%Ë)yÓ¾{?óÎÛ­§l7Ûl¦(,oÈx„9½‰sRên™ñÐa*8ã­>ãiHn@Ä… Ÿë˜'=½Ä5¾´ôaêоÁ2s Ú˜üwÍ57ƒÜlÏœ!ãC‚ÇøÊWô’äÈÄ,E'¹v„xóÌ&ìÞ¯Ò…Ifrœaø5uœ„žÏN?¸ê*:_›8›ïÄ ïí屎󋰰©æ_ðo`6ÁRs¼™Ÿ¼U4Ã'eº¹¬„š•©)Å,12ý°à±ê× õ¸þƒìMm ÚþȼäÛ6>'ˆÁjbŒœÑÿœêè¢@£uš2 «°.ßB ìÓH7n/€Üã¨÷FÒçC8”®½<BxñóÏßÿÅGJdÏÙWÕy+óú*$^þbë¸á:]"’Ç®>Õ}ý4~ÎZAU&¢WÓR_¥7D=P  –ä!Â=¸n&¿agú,O°ƒßðg°cMª²ß p'G8¯ÙÔ±2ƒž¼`èÉGè‰àà?¬ÁóÔŽ$´\êŬ[ß<Û`Ât擵â_"oXŒîäÔYåp¥œr÷ÿ‰g3¯lïÅ{ ˜¨’#&ýwm¤àÇ ¤–=Á$ü}äýš*Òbqëð °r Z9|]ü^ ÛÐì;ô/“:NÎM *÷‹7Üp¾øÀ ÷ŸnÛó¬d%Â{èO,ù=C²œ`Æä4€ÈÉp ‚­ÄÂ*Åüdóå@C>|.GT ß©´Ýq¿ñŠðÆûÅ i.ÿ³¼ÿÝEõÌ endstream endobj 748 0 obj << /Length 3196 /Filter /FlateDecode >> stream xÚ•ksÛ6ò{~…ÎýzÆ¢ |5Ÿri›q'MzWwz3¹Î-AÏ©òaÙýõ·/”LOÒÉx,Àbß»ŠZðO-²`‘„¡Ÿ™t±Ú¿ Úl<øçûWJ𖀸œ`þýöÕõQ´PŸ™ZÜn¦GÝ®Ÿ½w»üÐÙær†¡{¹4&ò¾P•— ý©¾\êÔ[÷¥maie<„—¿ßþøêûÛáòH믤1Ÿ“Ÿ‘§ÆW¡a2‹ªcbŠ7—K•d Œ‚ó÷%ÚM÷жmñp ¤#Ýa ½ngyPTkûÈÃzs¶v(V¸çþR'ž]3ŒOi:·©¨^Ü”›M±/:¡ˆö®žzÅ‹7òŒ¸]Ãðéð‹¥2~¯ZªÐW?íˆË9>,4^esa.l.m.•×Ñèцpz%~ '§¾ Ò3fÛâ³þý _1VsŒ—c@ÅÇÜÂûf.ÔÚObå$dg¥¨"ßèÄáäM“ã{ž€€Øœ5Ž„1R¸.V 5,Vø«¶ZŸrö%D’F2%n^o-J/Ñ,½gø(=’T˜ú*MO$u&Ð¥Ñj”žÑZ¤‡àœ?¤{¨n³"S:öS3aá¬@´ò“$uH-Ë–OßÕxü‘'û¼Öâ iLwk›vB¨m,SzlŠ®³Õˆ ªyÖíŠÖ)kêÇ*;U†Q†ièù°%Œ½Ô(xÇ¢,y”—ÌÂlvGì#SÉà­À÷†þÔ /iTT•’Àôá2Šà¼^6’˜ÇM{›Wr~· ±<žX"ÎÎG´f“ªfû Nß:±ÆŠõç/[ßfpu›yWúA’̹º8sê™ ®.NEÕ'kϼÀ6ùÊ2:9¹/¡Ÿ892qppÀó<›sp`ðð–¯wpH¦Ï{öã茉/ûžÌ ,ÛåÕº´ÿêîçø'@ËJ ‡Á•]÷ha æºêú¼,Ÿx¶f’@ªäõ©æ‡ÔÍ=ƒIˆm󲨶<9‚Z3²ìRSžÁ̲K`–ùDiŠæÃ¼ "?ˆNUPŒf[°–+ˆUàoj {Œ ãÁÿÄa#¢G9*úŠ}½µ•­{9gŬ›uQå½UaÌR$*嵤J±ö(%¶¢ÁζßS(=0`´5»]Þ1îQ¢]˜W'6&î¤mé¨PëÑ€a¼©û†X©Ÿ‘ÊÀ¢eD…>ÈìƒètkˆÑB¤hyøþÝ^]Õ{p”Œ.¡kûï@™JNîæU.Lb_eƒ³~IÙÀ¥xœ`Õ ¿(öþǃ§ˆ¨MºœÅY"ldt”09"Srü’½H‹ÊQf Ô`ÀÌ€mjAbùÃàÜHoÁð†ðH³Æ®Hw,ß±&®ÆÞ/Vö·Öžç‰háѼ>&`®èG°æ`l¾Ò”4žB¦Ù£Û¿œ0“èž_sžíÏðçó§Oï?ðð‡¢$Žs$×rÏ”×?`øª›}Þµ¿£·ƒGò-i@âEêü­*1~g “%à›Ìòb‡½œ Ï¼ìüP"LˆÉI\@Ë ãµ|™bþ ãÝþ/w~Íã¶„?ŸÁ¼˜‰É„‰*ÈÎ ‡„Þõ•\tØ_ óüÐ)Ù€ŠßèxeN¤¨@Ö€© nÅ!½à)¬“éHˆ™ø.1®Ð[ç]î’k†ÀR+‹Îåpƒ 3†âd2 qRHáh{š 9o›|¯Gá-©£ÙAÔ]Wïy…cQ:b ?+-íW4iÚŽWV9æs!*.“yæMÙD¶?Á7Fü©ÙКúɘ߃ӈ¡.úh;¹ZJ¼©RL2Š)$Ÿp³žM‘C?M´»àC~o¿³›¢²³Ä(ߌIsêÅ×¼zùPŸNÏŸuꉌXßäPŠöeÑTwMÞ<ñDb@è[‹Ñ> ½·³ÏŒRj¿FG!OËù ÛFçÒNmB&–™nB? Ïò ~ Ý Œž¼À@wË`Ió¨ŸPÊ*å†)”Žr“þ`…4ÓpàÅpÓcrR84®ÀÝ«d 0C}£h«E먻w©– mUñÈ€¶kl¾ŸKáïúŽË½}MIBÓ &/¯˜k.¬dy¸U¾·>©<o Jd£Ìk«¡ ˆÂ¯V×0ŒçÔ5Á'ÎoÀiÄá•$ö³Ñd€5ƒ:$š<"kCe¥6'&¸®9‘…”èæú(£¡%ÃÉÂñ–õ|ñj_mŒjslS§†£ê¾›=Ë€„gcŒïI‰_Ѭy˜7˜ŸÕž~I\Je¾Ý×ĀǻvW÷¥\çòµ9‰ÁCÊøñ×^Jõ °ABê ,<+¿íÐÑÓIJ}ÒÑOÑñ¸XO¹¼NÒ¡x@è{ Ѧ…=¢®#?u ©Û7¸Ž+<\‚ î¨ÄëÜAËGÜÆQ G¥äížw\ íæìô7ìi¨Ø–T’QHž¡ö—›V‡Æ¶äêÐ…(O²àMC±0Úöç¤ 0+ªCßIÅžD~Ckäz€AFÈÄ~ÌÖþ=µØòý¡$“‰<ó-/üRŒ°ÛUy}{Ï㟨ì!!0à;»¯+°;ðr`NøX‚±hŠú™‘ÿ Ü€m÷‚s®ËaOù›¤ 7Ýk|o¤©cƒ êðƒýu¤¹†ˆ¸Ác#gÈTÞ¼@Ú“8£³@}çó—m ꪔóûG_4vb]‘´^#é’À|PÒAOTkišIT%ˆ|±€ãÕo8ë7ÚR» eŠ näÐËY¹; ˆÍu%+ NÒȨHFV´q;Éh\tV¿bÓY $À@HÍ\Ë kàÒ„÷V°'V ³9 Ke • 2ôìøTþ¾»â¯<ªÁº‡@ÀÐÑîž&)5ׯ±]ç¼Þãž*ÁY»”׃s­¶Ï3Ø$c¬·ô{§Ù::Ø~ðnŒeXãSdÁµ'ê¢ô¼aGB×äÆegY¸*õnKÉ.?àz|Kð ]B$oìëB’)£aû”Ñ®Ïo™¼˜[8&ˆ©‰@&v ÷¿Þð`tf„³LU†t)_q²C»äì’Ñ1mŽCI3pQz¹=ÒÛ††Tõz¶O¹.ÚUNѤRòãÀqÇPôl{(ÍÞ + ¨¨ñøíÞ]WËß.ᵋ—š˜Ï…êôN×™øk|Ï*wí™YmK?Úüzm;e)ûOi J =îè78Ĭ«“mèýúñæ_’ÃÚ¼‘˜Ì^0ïvó?;%ªðဝ ž]÷mJq¦Îé‚ Ñ®oxÃo–¿}+ƒ‹MQZû`«î‚w¶¬ãÊ/Ô<«F¼Ì«‹­íÚ‹Ó«QÙÙ¹—cÖ‹ ïÕ€%wQ!&ôw­#ÀzX^a{³uíÝ?Æÿ:Æ~šÆ‹$& ”þ.$Y©Zd>êlc›Wÿxõ&øÜ’ endstream endobj 754 0 obj << /Length 1184 /Filter /FlateDecode >> stream xÚ•WKoÛ8¾çWél âJÖÃV°{ÙÖ)R H71 ,Rh‰²ÙH¢—¢âxƒü÷%Å¡%9²’ÂŽÉ™áÌ7/ʵùs­È±¦ž‡"fÅù™Sïòµ¥‰ÛÏg.ðÙ’Ñnqþµ8ûý*,×A‘¹Ö"m«Z$ÖýèãoácÛó¼Qx9¶}?ÍŸäV3½û•íÉl”T)%L\ä:þx¹ør6_.&“wZ©8_›¶ÍtÝšYáÌG®çkK?Œ¥`0¢…`šqf§œ’"ÉözçùE¯+ŽcR"e¡¼Ñž„Ès\­eËY¬™8ÁIÉr"6´XwåŸkI×E~à[¶ë!7qšÇýšˆRÓ¥Hh¡ÉŒd©É?ôâtTz>òBT‚AUKá\Óçó›+M±Âø-9/4Mž¨F#„Îm#Õq½owîƒÓ—ŽˆÞãd]V+­ÜÆY6ÿàÿpãÃoÊ=°O=Ÿ7^÷Ù1¬Õ=¡õå ­w‚Ó-@TÉtÍY)GKÛéÐãö³U Ì÷òÞ„<½²ÍYs]<²`Ü`™â˜2 voÈ£ÙYžK>8É5hl»ðÑGVepŠ ˜Ø¹")r1`ÉS£—Ô¬ Ë)ÙXk×äƒD ìB˜`&£9ËP¦;*âM–-åɪ0uJãÙlBŤÕ;¦—Þ”Ã; raɲ-h÷Ô"œôþK§™L:`_Q’h+«ÏMÃ)·¬( qÊYÞ™Î.{ ý€¨’lÐøxssûéîŸ;ýïóüæëõ' õò]/s0V/ßàìa½ºV•y:±œÑb)ÕXÐIfZšEbY—É¡k×ÅtjÓ0 &ÐÑYKõ€ uˆá§ë „r¼¨[ ®óf)LBy®×uîûIçäÀäé¢;Tq±‚j~RIÖä×t]Ô•Ê7M‚Ղߺ‚Ø`Ûn±‡v“÷Þ0pÓR9Yi†ˆI³fæ÷eš†´Û+ †pí^“Ñòè'/¦ñq‹•Ÿu†–§-zGXŽ¢òK·#Õóz¸%[ÆÅ¡î9ÅøkU‡ï•w±æ{çøõ¬È7?xÖ[™r.pNŒƒ²E«@þ( MÚÈϘ>Sšwùêgßû°1m²z¬?íÿÛ Ë{ËÁûÓÇañpiúÎÿ¢Øü endstream endobj 758 0 obj << /Length 958 /Filter /FlateDecode >> stream xÚ¥V[oÛ6~÷¯PµŠEÉ–l½e6`+ ì!3PF¢e!’¨’²7Èß±y¨ø¢ØI ?˜"Ïå;·¤Ž?êÄž3fŒÄAä$eÏÛîªÌ1‹/×=Šr.º;’ï'½«ÏaèPÄ^LÉl×Ô$unæ¼n„ºŒ±Áè—¡áàÓ=lU¼0»É¡ëGƒtQ «Ð§Á€záp:ù£÷iÒ:}ÿ…(7’Ç0G»0)óˆÎ( eÁªE3åp°ÌÍÿM‘W©¸7ý:OîÌ2šnÀ3—2BÃmqF;Þצê³3êÔkõýaê_šÓ/¢– -)¡EóÎ|$²Z ÕäUf¾7‘e-+Q¡ô\–2• m6j™Û3XH³b®®y"v$ˆ-Ô·§R)ñƒØù1¡^[®€Ä4ÙÔ@ gÖûçdihDXt˜UWrî×ßqŸÎ-*܈ûZ6äM¯ú«“e^¿Ø=¶uìû‹ùçaý.úV¡öÑËEGXùÌœ=ômóÿö+fâO¶Z, lÄÎ9†L°7Øtœá,Ïn—‘Ç“ ìL½AP?J¤™èJ²uâMÝî:ýáf¸ô'˜µxÙþöÚ§UÖÌ1‚ÙrzŦn&+£¯Œ¢ÔÈ`«H) `B»Y ‡þ)ýΗ-ïp}'Rd:‰`+Ùä³<áM.+³#1qÍ\h Uqœ±ÎÒHk+{ºÃ{«¹¨ºä²µi -@ T©-¬Ÿwb­-(gB–Ë\ ¦Lñzž'(¼‚æ‘+MºxºV2AÂåUZp°k¯+ºòœòvssn¤ ®ÐÕÉ«¼Iæm¾l9ŸNŸug¬0Ú¸ø{7W;—Á-W¦ B2ö£}4Ñi3·<¹Û19AS.ù]­ævÀ}¦ Ÿï…¹® Žàæ¯`Ü2„<¬;Ü£’X€šW¢ÀN„j>£2¯lÑ ;Õaß a@¼Qäø^DühôÊnÎÈ¡ñ˜„a¼îŠc‡ê†3§ åß§‰0‹¯_ëEÓʦBá BÞ¾µó**Ç u^ÖÅúØÈVñ]G Üò€ áþPœð„ ¼ý85LFr½7§ð^ ¦ÝÂâÕº™·ÜdÉD [Kûì|U)W¶Â‹";ÑV6ÍØQ×þ´ÍS–`èM·ê1ó>‘E;8ºQ¯" Є;¸mwûàáäûÂZì–6‹:å8s]lZáõ(² endstream endobj 762 0 obj << /Length 919 /Filter /FlateDecode >> stream xÚV[Ó8~ï¯]Z‰xãÜÚ"v@Á¨H+í8S/‰]l§í€æ¿ãÄǹ´Qw4õØ9—ÏçòÙØ Ìö6·Š"´‰×^VÍ‚vWÞ{Vøòn†AÏ7Šþ@óõvöûÛ$ñp€6Á{Ûbèj›{/ÞìÉAS¹ô£(Z¤/—~'‹»³Ù⤴»ŸÄÒ׋¼.©2RâxƒtùïöÃìnÛOÂð‰(Ík˜é&Æk´öÒ•ÙYÇéoKc˜,> ’[Iìþ£™¶r!E+iÍ„òq„p‚­ùAŠÌj”ÆÃÐögÁIEaÑÚbŒâ$;`hÙG1ŠÒì!~­èþ$Á=ÕòÁné=ã÷V|el£‰çS§d¼ª– ii(kµ‡<ÕÚ¦¼7i =Ù•¤eGª:` qqz6…dHéÜÄj•ü‰ <Ú/S¹}tž£ùŽÏX³*®Xu(õ¼VMÛ6"ã¦] ’Ñ.UaŠ¢`œªí +ª¹‡‘”X)µ ³s¯£–dGKHÑ{‡@ï îÜw'Î/nÔpçjs‚'Â/ªÕÚ•e6I°Â_€•–¦¯™àcµL\§ÑóÕÈ0nàë—Ó‚Ô%XW¢ ½c<7í }’‹.% Jj-*¢YFÊòM•h,T)¿z$’õ§6ßzüþ‰å:/N&Gždß^'²›dTŒ&¿Õ‚F¨ÀƒV|Ë.ëÒpÌËñä^aê])–»þ¢… ¯3T êd"G–œþ'pïà"´Ý¤çá0 ZÖ àjÄç©t7}páÕªkÉÿtô8IÁCJ½ ‰a¹†g¸ÁwÇ×÷]ç2Κ±@7ÌÞw¼¹a…\5ÝðòÆrOaªr¢‰£Ùse?PŽQÑT)› Š»üÒdÜQ/ÉûBþx¼AmïFÞž””ìiy`¬¿Šìm'hWãb6wTË«TÐfçÀ\’U&α½¢šÿ©Ž˜v"Éipþ(ì<øq—WšŒæ—Eèéÿ`Ü+Wez„º§É÷þq’lÐjc^B8Ea„Ý%6Ï lÞž¤^1û<ùIc”šìà AI?ý`ëÁ¹Vf ç€zgzÙ‚m—ßèƒBcû”·Â>9Í(Š[…àBV}[Øl éî<.8uÖMê~š¾ endstream endobj 769 0 obj << /Length 2746 /Filter /FlateDecode >> stream xÚ½Y[oÛÈ~ϯÒK͹ðÖ}Ú56éõ"hüRdóÀH#‹0E $eÙ-¶¿½ç2Ë<¾d»(‚˜s=sæ›s—XDðO,òh‘*æ:[¬÷o"moÜøÇ‡7®[ÁÂÕdå×o.ÞÇñBDaåbq½’ºÞ,>—»âЛv¹RJÉ_–+­ãà§{ª‹ŠG¯šåJfÁæX™Z±:Qºürý·7?]‡ÇR¾’K\ù˜ÍdʦY˜-’L‡Biæô7<¬„ EÌcZ±8x_»7û†¿¦îŽ­áöiöw¥9q¯5kSÞáUhý®ìÂeÁ¤·#Í®ß4ÇÞ-’I¨"»è´·Tʾ²‡…üù÷§bpcfÀ{û¡ümFO2½}wÃkÞ^VåúÖ2\Þìz·õØYšem/ׇ]¹¶×9•õ¦9½EÚïSxy*H„Þ Åãò,åã’0…m‰ ®–+rJÐ3C#ƒŸë®/ªªè˦f‚sQBÀòPÈœ‰]’°Qª 3kÚô¦ªìø®Y‚¸ƒ…ß’OáÅE̓#`ØÛ£¦Ž3<Àî}@zÍ‘;ëžÈÀðݶ4·Ø´»ÊžçO%<º=舭ñ=v½3(E2ɃÂ5z¾’çøç¡³KìÌp9"ÀŸý¨N¨nBŽ×Àiº†g/?@6}˜…VÀ2ñzhË»¢7¾§RI éN8`êe·ß½k™sn—" Ú‹•Šâ0fú‚/s‹ÃÝ2Žƒ¢„-Uñ•N¾ãu¡sÚ™ÚÜÑ+µžéöXscúPï–ÈBÐø60|Ðá#¦<ð)‡‘Ì*ÝC×›½½8Ì’Ì'ôò”Ñc€’(ÌòdAŠötFHo” K:‹“¦À2Öh€ híÒ25h‚µãÊ¡AÅ'ƒÆž‡çXãðôÀ„hz¤lGTVí%ôœÉ ¶"ñ,ÂeÌöÖŠ\ý³’†‰3û vÕÌA Ù ú†mêjc¶eíÕð$:MÜúu³ßõÊö¶-êt*WÁÅŠ†ù3­Ü.œ?hÆ-OM‰)‚ßu^ÅÍbð}ÚqÅÂúWëH<Œ#5§¯-[Sp9:Ë ©•ÒÙävÐé‹[4Ut=ìZã•‘¹‡®oËúÛhânŽ 3{²¢}÷=Lű•^Xÿk$tÛõ¼¡tTÝl]ì*znJ\hM!{lk ?ÍGùÔU„i*_‰™F²ÃsŸc9¬bôU CÛÛ w…ÉaÖã`MrÀ5¶r Ô@Ë‚8ìN¦n‹@ì`ɾÀ'y`c‘ê0+47¦õº:nŽPô*{SãÔhd"°_£8êŒ9Âd$€œò0N5Eb <‹ôþ€Àl>2ÍÜþÕ„€'ŒLOl!HÐ:x¿Ì9UÚ~Ïñ«ÏôR) Èâ©èÌsû¾iÞÚæÅñb×ìÍ/ë.¶ÔW÷oi¯å›•ðQÅfÌ¢ñÃOE§eQŠ¡)œ©ÌÆÇ·À'‘ƒyë;1S™º Ñl¼ÓPKý,=ˆ¿c9¸)tÈóNƒÆ¼Ö)è,Yæ1p|Âi‡“;î® ˆºñpÂËI¥çf+©Ým&Æ/#6>ò˜2ÂKSÇF1«{/”ÌQ"žÅ2U¢§P’³CqBkÈN£•é͆•Å©æ%X(³á@…gÊèL”ÿIoŽÁd‘Æø’:NÏ9OdX߇È0â,éøÔQü>Pnql}Çe À«ÝÿŸ‹pHn=‡%ø8¹[Œv–bV8‚bqøÚØ;"ØlTC{mÚ¾(kkÔ¡ ¼ÅLö³²€ŽS"ŠßáM°ã jqØÅ¡vk¹·öòÜiñ%kn0삟‹œÎ#¨2°âBCÜAb³tûW>§qv̼ž‚,Çüù|yìúf_þ‹b^ðrªÌí)SP­ëKEÅç׺§I¾Pà¤rñ’çs«W“åžKœ%.°†6è‚J#›^cEEé7 Yè·µ:„ÿߟËÑPŽz'nÛfÏ'>a8É46_ºÍ>k•Bs0W‡¢6•¥ÜXQÏ%ˆz2 LÁçØ Œ-ʼ1ÍÐj—©µ¦Ø ™ʰ¡¿nÖªàÒfëÒ®¹t³1O˜y@[’ˆµä’6:CåÓR @ªåæ‡Ë¿sc{¿ò0GúmSUÄ$’“À† #Jc÷QÝÉ®ðEéiñOþG¥6ß3fÎ2a{cÀ0UÝ;Æí“/†Œ4“ ÈÉ!FMGÌûWÞx~ÌãrjÊ †øbÙµú -åì–i”˜1þLhkW¿Àæ9Q«àžÄœ¾£x–ßKÎï?= Œvä\]Y!ÕœáËÿ!÷a‡©®øŒºu‹e)ÅT¶´3eçvŽE¨¡’¢Î+)ú<®Ÿ×V6ÍYȼ aÉD=q l†Ë .¥ q$ƒKÐÄHj.ûÙ¼¹²Ck`à‰ž ‰S6x÷•}°è̘ÉtRÕ#„|õ«4ŒÒÁŸÈ~xÈ©(LDþJr‹T÷s%¼—pmŽØ©l2Ø BÉÎôŸ+É2×#hÐîvͱÚpÛÙ¬‚B&.ÖÐx·žlq0œa0Œ]G¼¨½Ù äÉ7U– #ñ!ÕÃÐÆÚJfbæUFéU„ŸO¸’®_ܯW4é’¯Úœxõ«R­±ö ü%ɤä¡ð¿óq‹vfLŠ~qŠåòœ‚à9DñÕ¦ \ć ñÛRîÄ&0ØJW4f©°<ÚŠr;+ÒÁåÁÉ“E¦•HÀ%é\ _.6é8ó›âDY S5›Ri™÷"( ‹Æ> stream xÚR»nÜ0ìï+X¤ ˆæS¢Ò%†  0ÔÙ)äm¢D9—ü}H-u–  Tp5îά†#ŽJ† )i© Úw;¶ Ó‚âözÇ/ ÄlÃü\íί´FœÑ’•UÛVUƒîð…«ÇÙN$“Râü#É”Òøòw€úºôÛ@2apóÜZ*-¸Âœò£úº»¬Nõÿ©22ÿ-37Šr©@æÑÙ>¨Ñ _Û¡#Aίƒ=rðé윈?ci›ôa†sœ¢“ï£޽Më¶…bv„c=ùVšFý‹úTDÙYb¿RŸçÔä|%ß3®Zû"2iòïÍÑŒªR®7»–þζ§ÅJl“ÝÏÃô‡‰iä£Lš‚FrÆ%åx_â&¸ Žý+'ÛÙ.®ìaY<0fg¡ÃJêÙõu—€áqe,‹=^¦Có¾|œì¸DÇöM¢Î®NÆÐ45 †7S?|'FáOÑNusš}±dˆƒ#¸Rê]~£L;ÐÑö1^—ÈMNÌšüó–^ØAfâ käÿ×!àÉ endstream endobj 782 0 obj << /Length 3136 /Filter /FlateDecode >> stream xÚ¥ZYÜÆ~ׯXä‰+h(6oÚ†£Ø‚’ÍC`û¡—ӳ˘CNؤV‹üùÔÕÍc9–@X±Y}ÕÕÕ_GÝDðOÝTÑM‘$a•–7õùUDÔáá†{ÿJɸ <,FþùîÕÛ³ìFEaUêæî´\êîxóKðîQ_F3Ü’$ Šonišïß}ø†)ã£áÆ{ÓŸoã"øÔ˜'¦¼ëÏgÝùåƒî&ýƒUšçE ¢êö·»¿¾úáÎ3—ÅñWJ#_ˆQ€E«,1ò2 U’²Åí!ËcÇx‘ ãÐ ÆåÊÌ8¼xÆÛ­®@™q&ªâ=`ñ[ äÁ£¶ØMbŸ»Û¸ Fý™ßûh{aÊøÑ„&ÇY ;b>_cmÓwË©¹[; NýpfÒ¯QI¯æ¾{Ô~À’qšð#ƇŠŽV<øltg¹yÑvËû§Û Ök'cQ(´JB•)ÙI²4ÐoðY÷ðLUõrË×ìy0+§©«GÞ`Xå¬È$K‚ÆrÇ'ô,3<3µmÎÍh޲o' 7öýÌíNöy¼,}¾´æŒþˆiˆkÆ)Ù åq~™D{ÂÓâjÏÜÖøËz‡G"؈ΚÝ¿×ìk–'‘~b”á,7ÅÔË‹[v2ôQºûáhdñ‡æŠbº7+9XŒAÔÁZR´Û$ .Cÿ0èó™ùºcŸNY`wìÑ'R›å‘]?rÃN— ñÝBÏ?}«‚Öð½ð°0=¼ͯ‘J»)!q¯R8Þ)ˆ…U™-NXG¤xô2Òfu3YLç°TÊéFÊÔ¾ìÈJÇÁdìAZc·K4òl{í¦àùFÒ©»mùM/D ^„…7¡ÁqÖÔ5µùË*xjÆGlöÄLЫX0B®¢àî¶õñxq §™ÆÇÞkÀà¥a÷&“ `]ckW¯…EñÌF1œ°m?É"ºÛñ¢ûÁ»Ètaƒ¢ 88–Ëà˜'a”0¯çç;a4+Â,JÜÈ‹îLË;<=65²ô(>iFË[>#ïÄ(:3y¾8ÇÄþfíÝ¢oÝM… XºRE¡v%ˆGaV¼4!©7®JàÑtÜòLáË#z 6fíäK™U‡¹JÐ?txÇîè&QaYænØïd30Ö4‰ƒÓx™d«ÓП¹e§G>òÛcð­‘çepž!’`ð¡Éx6ôpäi˜m"í‰N ±úû8ïôHž”°'E ‰'A£W$ÇëY°>¤8RÛ=¥ÅižN0m6à¡fÓöÔX¤aZù‰ìW¤ܬ֓õ ÙùIÑžƒÑ¢Œ¼AEñêDð©¡Ø`cP\tú¤·¦#Ýýa„KªÂ‡G\Œ‚'—x'h S5å8ÛBÇdèúu×"ôÍ–¨œ%€Ú;®÷á·Z·­ì؉bœ¦3f…²P¼’òrõÆî>¹~Ì8 9.oÀr¿üˆ¾ãnóYãå¼ëeX®&˜'ƒ+›ÜÔü¸GŒC8gÇ'»–çå'‡vôhv}0-Â<öaM¶\ÄšûkÛ¥à:©r}x)~`ë‹[W)ĵÜúÄ[¾¶g…EQÎno†]­B,Riì†}Þ[© çãC¨‡Yç š©]ÛÛÞŒíÀ8³²ü™dØtù(Áý[†Õ&No xÜYK̃§õPÔ eÖyäô2ºÜÜ¢”gzñÇ8;Z>G×Înx:Ç]ž ûŸ¹£wqaƒ?ïèl0œ¾àáÇùÎGdÝSôOImøpB`Û !“ÛC«‘9£, ØÃËž™ª(Œïï¦~ì÷lga–ycº˜r,ò‡·r‡›˜¿v9Æ)øí6Ì>nŒþâ,'p¼’|sQ­!&kÆ®œÌŽ3ž BsÃÆjêTCm†LÌM¡Ô:6žÆ[ s#;S×Áªodÿîø…ø–΃´>‡¸>¾>ÆIÈô(œ‘ ±¬ŽYÖËìŽ †~ÖdXi-¯©4S>Â.ñÄ=ûf*ŒR~Æ=Ρ™û ÑaM6µ±²Y?ì-^àÚnb×´»î‡Qõrõ“nÚi0ßbZ‰6ÞȆΰ]kk¤÷´ê¥pçUXäñÚ%>ÔÓÙ,SÎC¢ I• ªÐ8áuîýËð38¼(¼¨˜J&SúðÔX¾Y!iø]z0«= )? É>“sâÙ·væêe0“”Cã¤[‹Ð#&¸d94õ2Ë`È*> \=ó̺ü„Þ-Gqi®qäÁ»e)ÊvÿŠL¢ îHˆ>컀A‹›xï$îŸ÷‡kŽCU;¸¹TÕ ®‘ä9Érímó»S(¾bè Ok 7ÐÉð9Ã9xi9,M¯q\RL³ûi¨¥]³÷åÕûÛN6ÝÜ‹+œe…ºÙw0%àßòÛY–ŸÀ0¡‹F»÷§kA‘¤î…–l=4E  ÷Â- 5’ï9Õéc„§4 ÎÈÌ ÐNWY“œ;Îú(«Žý® Ig>ýÓnÆ3üøñý‡+¨*I«?\ÎCÆE²:^XÏÓ£dL«CLŽä"Q®ä ŠÓ£–Ö¬B&,ªO4ƒ/£(xÆÞ\V ¼¬ÍnH(74X»‘ÛPÑ]|Ø)f\þ—ÄpªõLaé †Œ4ZÄ‘ CD€H¦®z h×¶©y™L é_I¬”Þ~¤"ˆ =@r­ϸNç+c™S]œ9•ʾ7f[{®¢›¸ŠÃ8Ωôf@d†*¦ôš²-©/æî—ÔÝ€MIÜ1åÇ/Âl6T*¢ÈЬÿ†¼— 0܃tò[ —€Ò!;]Jr½ˆîFùí¢ºÁ,%Eò"‡ù÷ÔHV'·›/$e$¬ˆ]Ý]0ú‡WɸÐù¤éE–‚%~#ie%,/N˱A¬r/R,q%íj¡ÇÕ†ä¥Röcâ[ûâ-ð€Ù[Ïd˜=|ºžµßq=;r•kµ,YŠÔ…üíÏGS—uY5“x… ¸£¥Ø¹º0F¾2xÂQåÁÏ=åòY$µøÈ•×£kˆãZŽŽªIUîk€ ™Â²’[{—¦Â7Ks™ïê¦Å»šÉh·Å¦.«ðÑž—ß §ÌƱO¿»ç¸|íb‡dWy„ðÝþ:`ÛÊ/äl)©fR”T…Z'i„T²Ê÷)F‘|™ñÊæE´Ù[ëÍwKür»@ ‰™ß“*]–}y:JÈ ž‹,5Î#É2®ùÑwæÐ6á^;øu†ºN²’Ó}û*èÛ;^’† ¾øÈÂÌWë*i't_ëâJF¹×ÖÀ’?õÀÕ¸ëGâµ%vM °œ}åÿ5y§—f™…¡ÿ“ŠÑÿuÇóù׸vç¯ðçï ¯ó=mÈEöêÂü+ñòûÄKºUü“òõI¼½Tažl?b%ÓºO•sªŒí§¦=jªzâ8†Åpý×s{–À{éUøzWÞÀM·+&yòuâcræÒÏžy\¸†'/öJj#ä©Ò縹Zz!N%çAð¶“ÚøW¸wEàà’n öþËE²œ+_:7¸ÁÜø{üœî%Û¤Iêr®²Ò jåÈ¡Ëþ ,á6 endstream endobj 787 0 obj << /Length 1883 /Filter /FlateDecode >> stream xÚÍXKÛ6¾çW½D"V¤ÞIQ Y¤ AS ää µi[,º¤¼®ÿ}g8¤,9JVÛZ,°–†ÃáÌ7OŠ/"øã‹2ZäqÌʤX¬öÏ"KÕÛ=ü~ûŒ;¾Ãçë»gßÿœ¦ ±2*ùân3u·^|nvÕ¡“zÆqä/—a’¤ÁíÍÛ—Dév’n¥Ú/E<ÔòD”µßWíš^ÞVíöXm™'Y–œGËOw¿<{s×+— 1Ó äüÂŒ<º2#+Æã„ÌXUû°^ã‘×§9Ë@¬åª i[µŽ³rŠŒqÁ{ÞIifêYJÓ¯Ä0Éâàµ4õÚoëvÊHÚzFÁêèvhYuò®ðàa™¦AÕæ ehçìQ­ô¨iùÒÙ– m‹Æ¼WºYƒäT¤ÁéúõwïÛè«@è ÕJ5\¡/È{jãôjš‹Ÿ›)'üÔUz+»Ç|e$)×.X+½ä­…‹euÖ¤ÁÀE<£4¸U}Ñ 7Á"Ÿ©ßJ¶X½Ÿ¤ìA'þPm½òX953Ró)ø %ßöq7•q€X,@Òu‡ô°†=E‹Ý¬H™«Ä@âc*lÔêhs°0ŸvRKç£6>|åÁè Zì•é ¢÷\s¦µ¾Uæ ñY€v=ªì([\"]bØÌ? ¬žA4WúZnªcÓ¹BáÞ@„#´êTw>Èya±9vG-ÇzX»ëœU;¸SžA]eÙj<¥âV%Q–!`#ŽP',äÍ2ËY.²o7Ë’¥¢Ïj]i{F †1’°]";QVÊö*¥×u z@U'º9›Nî –ø( $Ûb{ÀHl§œ g)/½‡zõyJIìúÙÅ»ízRVÄŠ8öL'@xÒQÐzR–gɍެhô4ÿi£9¡/QàùÂåcÝíêÖ§ø¥IÃRã  ê½ ²¦~@fÉfÆþ±­`:’¥–ÕV¤¥Ý€ ã&ÐV䨴4ÐTdÑeË{¯bÈßÔÛ-?†íðŒ}º õbI˜ˆ(¸¡µçSCƒ-_x€p­z§®0> Vå &Œöíýé„Ý=Í^]wqWTn_ÓÉòÂZ.¨< t­GÁî»'μˆ‚ï¦ðÎb‹Ák«x"®¯L@ñý ³ÓÁt›åQÌàåNž 9q9¡Îyp‡þüÌP£7ÚVïÄ ³^[ÅýxD¨Sz$+øpˆØ|%Û³$­(r'©(Š2bi1vP¼| ®H>¯Y_½UÓóOX^æ£b"«Æ •-vŽFñå—.ˆH Vø.澑85Ç&ШgE{£IÌòb”-ñûÄ_À'2ú’ãÎg; œï)Á*½¦e?YÑAdÓ"õØéÒoáÅéƒ ~+ýÜÞ¼¥ ~h ¿~‘¸MË©ÖÒµ"¨6¶×‹’2 IÃûª]¨ -¬áf—:FH¾VTþûT³âhlÙ)TèädÚ©¨ä¾³ˆàÝ—MÛ2ÜkÚg(œç~ù1T²=\ÛçUj-ÁFö…S¤b+¸S[÷ßpäA{yü¼,’à²;pÑßÎF!Í‚D!KQ Î S-!-Y’ñA>Gx¶ÿÞ³å®çé­ c¬¿ÈòÉ4áž /ñoœs¨å(zé¦<¡TÌY”÷¬>ÓÃÉ€‹Âø%ï/H‘ýL4p{4D×FÜä%†§ b½|‹Å”GÖ^KÊÄÚ@Ž˜#'Œaàfè<1øIxÝ{@æqïãˆùóu‚+ì endstream endobj 794 0 obj << /Length 1067 /Filter /FlateDecode >> stream xÚÍWQoÛ6~ϯPßäfbt$%JE[`Ë:E¶‰ ´}PlÚ`[™$7é¿ß‘GÙ²ÃÔöR C€ˆ¢NßÝ}ß݉† Æ?ò8PB°\fÁxyÛÝzÐâzxÎ.BègùÛèìâ$ fyœC0šö¡F“àsx9/îZ]"!D¨^ ")“pxyõŠvÚ¹¦ÅPWËWá·RßÓÎeµ\« Ý\«Ùº˜¡1È4U! ¾ŽÞŸ½m‚K8?2 cù( 陋f’”F[«fZÕKãu?çD±4ˆ@0HȺl(êbe®2üðaxE;òAºÄ;À¢-«í-1»°hÖå#O»aEäŠÇ,å)ùZŠíKœÄ9´¢$K„aÏœ{ý0ÅUgˆOÂqÅ2•Ÿwµi{Š5PÀd*w‰»/W“êþIÒâCtÙ÷< ]½6&Ž»A„E¬Çå—äØFÙ…„.$2å=!EÌ@rò¤DIÊMw ¢JÂk=5˜ºÖ«±¦­!f¹.'z‹)XŒqLìMž²,Ï7x ñ…OcL(çþÅÑLÍ÷*€é_Ò>Êâs“q–¨ H3׋…ÏÏX*6fÌÌ Þh½ßå> stream xÚµXmoÛ6þÞ_áo•‡‰ßD©ýP´]thעͰY€)6mk•¥@–“èß_dIawè ¦¨ã½ßs'ÒYt–'3Å9ÉE6[lŸ$f·]ÏìâÓéêèb Œ”¯ÎžüôFÊMHžätv¶²:[ÎΣכâªÓí<æœGêÙ<BF§¯ß=³;ÝFÛÅ©n¶s¦¢ëRߨ×Ív[ÔKûð®¨×ûb ÄT¤©Š(eó‹³_žœœõÊIÆŽ´)À N°Ã™‘f‚P.¬Š0’Ïc™²è ³Ó¡Ùàš“L:ò?™¼°šŸ/¬°GÝёǤ")œæ„J{ø´¼ž³,Ò;`äQSë¸*kmŸö;ã\îöÀ¸½µ«9š6¤M9a`qb¹;uBšˆ„àʈOa)Û5s"ËzQí—:(“Áš¥žÕA»‰bÊS8[ ÷{SVËÍbÎr’§ÞCÔQ´ËÝsPPòh§Á‚Ѝ¨vÍ4)£D©t–rEr•›Ä Þ¥ð2“!ãaªøóñ€A ë§bŒ’Ÿõ¢+›•ã&2n=ß6­ÞèêêâGô1®LL‘Œ2>5çœð\ŒL¸?·=õ# O™úˆCÒGú„Ce}¾õPéç6.L@QÐ0.U¹ë „LeQ]lµ[6uu‹+•+»³Å4ÚW]yUi»ãĸÛ¢[ Ɇ„²‹Av%<ó¹ó"”]Q²§(ÛÂjO’˜F5D0çvk÷W¶€†Î2%R@`™ ˾9üùxÀ Ž©˜qþ ê˜?)u%‘d]cÐ8÷ùÄû|â\NæwK‚в(%©z +=u< ã¥Ìr“^ÒÄ&¸ûhÔt°éòÁƒæ]”|Ç8@KîƒÀ,ðǘ•R¨z²ÀÀ´5Ä(ƒCÄ6µmY£$,…Enm)ëUc÷ºMQñR怳´‰¦¥fy€ìoE²Löµ,*!|X-¨lá²M"Dðq¡ïnMíd¦vøÐF¹B(DLBH¨øðëÎÇ!øˆ—™<ü¢ª#ø–K~UF66áøuÔ(Ô_CÉ€4®¹¯¼JÊžzœ])´^1Î Ž(Šnœ¤÷ð9™1"U_5zÛ,÷•ŽÛ}”cV>Íç©G(pä¹óÈp*H£ª:p  4ê¯aÕ]{{ôœÖênßÖà””*t þ`´«f…¿©ïƒ‡- E‘¸ð"ÝëKT?úò1…²\F¿í´}©ÉÚïý²Œƒ]ŒæCÑ‹McMóvÚzv”£zÿ€˜êçȧn€wÈvåÑÏnïö¶{$1›èœ DÅ”BßÞ1UDæ4¸±-Žˆ g±68¸‘À_|é·&wa…Àû´uYn9/õ ¦©å÷ÖÝ þîøa*PS^Úúøòª §Ó"!A½¾ƒQP¿uY¯ÿ7£Z0ÄŠ8Ò– HXî`&·#ÉapxüèÉ?Q« .Ùñ–Ÿ\Ï¡¬‹j_tÁÁCÀwfÖVN€1§À²ÇÑ{,ÀÉ8—C^ì8^1ãÔÅ(ÄWZGº]xâf¢·Â úÀñÒÄ©é6#°NpøŽƒýBÈcϨ.«àÄ¢Àg=Ag’¢ÝÞ”™[³œAGh~” p®)AÐÜíGÂeÛUÜÌA¡kü§Û¶  ¡ìƒ“×Mhê¯Íjuq|ö}Ö6<žF7]¿2w3”¼2±ÒE[Ô m7¶ÃwmS9»M³¯–ömƒïì]E¯bjÛ˜´mì©ÛBš›ÚžÚ鮃²6c3탉1þŒËÁÈÞÃŽ˜|4ºyû÷²Û8wm®h×û­6ŸtÝÎÍv#ØYìÛVÚ”ðº|„HÔËbáü‚ÿMž}|Hå!¤pî‹¥··\/ßÇo¶Ú|rWaöçÕуÈgÝnÓ„Q¬ü²n›½°P‹¶Â n7‡ÒEôÊ»Ô%žñêÞ|·ÛšÖ­sª{ìLŒM2èÚòH¯ý&?§c?[Sâr‹Ãúñ®»ãñó7oßüúòýÉñ·sf"ã*qΆÅïë`B«í£Ks5$½Ø3Á€_œ7l=RÓ=¨ ¯Ñ ›MÙU°eoQL EÞ6Nò¨¨úlúg’»ÙK„ (Ÿ.ˆÃð]Æú+b°öîùÜ}/¹çÃÝó‚& ì ±ÔßBº²¶Yxü2‘ÛþNÔ|ï™×Úß$ÖK ?@ü7Þ¿ÝõŠ] endstream endobj 684 0 obj << /Type /ObjStm /N 100 /First 885 /Length 1718 /Filter /FlateDecode >> stream xÚÅYMo7½ëWð˜J‘óÁ!‹ @›ÂA)’h›æà&[ר-²\§ýõ}³rRG+Gò*©öήfÉyÃÇùà«!…RKÈ)ãZCnW ÄJKšáJñWj B÷¤1®%hõ{È$Öü= •ý÷šùû-äLŒ9àj‚ù ™³ ‚º#D(XÆeðÁ•3…\“d¼nR dÕ•¡S#gÌÕúתŸQ”¯ÃÊìO€ ïOŒ”¸á‰1 `)CGX!P ÅQƒP0)žRa˜_)ÞXª³µªÃXœ0³I œÅ`SòñŸ,0cx(K… e…WM4°oåŠ;l®5O6¯ÃY’|dÕ ÙGV‚à#«a¡ÆQ¬û²hàž/9ˆ`‘ ó‰4’‚(óÄJ…€5³‚õµ^#Wü3ÃÈ­úOXòœà1øH Þ*Z!` ³à'p<¢\ÓÄLƒJ…`ƒªÁ0“ ëixªÍZPkþ¯7òÆ\ÍG®Pnî– ²&v,ÍÒ&æô#øÏÀÙBøÝœŒ\`!ØZ¯ZÃOÅ!;·‹ÀI]œ@[,»e” 'µßpBuFWsÁ)]컹 ·?©ÎEŸÝ‰‚E³– 9T)°®®ÖÃ&÷ïO¦GóÙ2Ü¿¦GX<߃O]ó1ÇõM¯eçã;%¸ÒzñÁƒÉô‡ÅüÕ³n^„éß…éóîí2¼œà'Ÿäùßo:üp|ÒM¦1a7[^8}2}Ú]Ì/¯º‹~¿÷¾ï^Ÿ3^$ ny£—˜æxwݽÞõð߆9z³~úù—ÐCOavyvöÞ„Í8ßC‹Î`hc1´t :ÀÐx4Ù ÃÜ È#ÿ êw4ýz6›c¨} q[<…¬®ýò®›ÐëO¦ß̯»ÅjðôÒ-xÓ©QLÀ… ³G²Â1{ÐÌý=ôž]þ¶ìÇy|:û£õz¦?>ýnõïÞË囯¦Ó«««8›ÏNf—q¾8™¾ý}¾8¿˜~á®ÚÝžÌ%z¢a‘hˆB”+ìAVP‰È4w±ç¤›ŸÿuÚ]Å•§aÎIgÝòV‹>ù6›'Üù–¤DªdKQrÊ{cÍŸÏHwïjqºìnÎ"z ðQ"nБBÑí6=ærÂhbï<-µ!Çmä¦õJçà›6óPÎ;²¬ë€2"’zþ`(£1ØA0Ð0xR‹òa0”!A‚óC‹Óa0 ×ï¶ÿ%boBÜoqnOÀ;¥FTTcF!,–# ŠïRbʺ1¿Ê)æìÐëT«1î5c»ìæÛv”!Ï endstream endobj 825 0 obj << /Length 1878 /Filter /FlateDecode >> stream xÚ]oÛ6ð½¿ÂèKe,âDŠÔG³>4mdèP ÍЭ´LÛZmÉä8Y×ÿ¾;%K®º$…“<ï›wGñI?>IƒI†,•É$Û< ,´ZNhryþˆ;<ýæÙÕ£ŸUj–)Ÿ\-ú¤®æ“Þ‹•Þ6¦šúazñÓ©/¥òÎ_¼~JfehrnÊÍTÄÞunöyQn6º˜Óâµ.–;½d.£(ö8§Ÿ®~{ôêªN qO-ó5¸ŒY4‰Éx(I“wÓ$ôÊês:À¬XßâLxû¼Yìü5Vlœ¼ÙN}‘x¦ á-+½]åYͦ~KïÚ À=êsÀ=Y-ßÇÊPÀˆ‰$jqeE ?\®M¡7†ÖMIce6å$¹Æ?Ësâ‹H²høÐî È(ðö+®¨ht!H}”ðâ%Þ`©Rg¨qá~è+8WîÖs"älK‹9f×k_€Ï¤‰¹Yè@×MM8èF JŒcú©xÚ¥Ò|A,Œ„GÑW›¬l“Œ®0á(VÓ¿ÂP6yÓ˜ùƒn\J~Î ¥‚cÿǧüàT‡LÕòyÏ¡°xuùüue*˘ذ¯np mi!iŸFœ@nlm昰’‚©0nñNÇ(ECB ø¨Ì` Ë×ÖÒ%R¶n*ˆ,-ók7Ç:L°7o°þ"¤3@ëVkߥÔ$`Ry<ÇŸé&/ ,pã.°f¥Šj!Œ—¥Ã"“°0Œîa%ÅbÕá™›¼nê8oˆ jl¹UFClaê //Ú¬º}]wÔfH„µQ‹s]µÚ*¨þ©jë"K-`GŽkä•Û&ÇûYèõ‰³|K0_8 zÇ[Ð^Óu30Ô€ð®6¶Ë9dvsÜÒI±PM$k´vuLÁÃH`\Øöné÷yî¸ß;?Òê1qU&C“Œx?S.tÿò|(ÌÞ'Ý>¹Ê»µ*^E.Ô±RB% ºŠ0ª’ßѪ:d¿‡=¢ÂI×®Œe½ã:#‚~þ¡âÂï[\‡ö#É臫 žÞcY°ÍOÓÍ\?ÑöEéÒo¦7nŸwV½¢š‚û]MÁjˆu» ¼¼èK~:Ú”'ü®B°„'½Brw5UÊ$œùÖ!|àmUnä {ÀòÿB.áešÊ5®åìoqšuŽ‚#̯ ð‡‹GÔ¶fP”Ë*á9V¸SÒ8ëºdX€¨¶Ó!h( Úh}Dù%u8%5ñ¥àì™ãìò ^Ã(¡Éë±WC+YS( ”‰ÍK8ö—í‡QVù2wÛÚ¶Šã„¤1d·¯Á>•#Dš¯KêŒ>£¾#27‡w®lö•mŽ—}SÛ‡€ü÷4j¨'.Ǻ—œ;8ö.‚È¥¨#¡A½Œ»xÿl[à[+_YQ!IÓV6|æ»B$dÀ"xd÷cŠ<žp ÓË&dÚêŸx*Õ¥›mÁ‘Ûunæ´¶q–´‘keÉœâ£6r%÷¶kL™}–Öß?÷Ä¡¿æsÂ:îïŸÞ?µ¬ Ñë§Ñ«OÒ®WBJØÐ ´ j¯nôf»6öÛ—ü&G*É#–Äé±µ¦,8H8ª%X* [Œl×–¿1†ÐäØªê»üèZҽȯ1{›C½8*qBÄ,Ž¿}ò1¨p•©Mó G'zeûþ_.‡Gé¹ê>Ê”î1׸bÞÖˆ¦ ÛÍ"øz wK¯wæ!Ï<¶:W÷UÕu9¯/Þ^Ý_¿î«[ï«´_«ªÚémÖæÐëÛe‹'Ö6­ÿr¼jf endstream endobj 842 0 obj << /Length 2058 /Filter /FlateDecode >> stream xÚ¥XÛnÛF}ÏWè­P²Ü oÉSj'†ŠÔ)l(àäWŠH*Žÿ¾3;CŠ”iWnaÀ"go3gÎ\–bæÃŸ˜%þ,RÊKt<[íÞøVZofôpsõFð<&ºƒ™¿.ßüò1fÂ÷?³åz¸Õ2›Ý9Ûtßšzî*¥œèíÜÕ:p®.>½%I»5ôpeªÝ\FÎ÷Ü<ä¢ÚíÒ2£—Oi¹9¤˜,tFŽzþuùÛ›Ë^¹@Ê3­À™ÖÀ åù`›ÆÚJ“‘'=©çnJg•Õx6X-h¤ïé ¡_üÀÇ™¤þâv ÁëFˆ‘Î\8[‚–Ö¦=Ôe3BH;EÞ´$ªîÛ4/ Cs?—±óHsj³«ðõ{^nNþâ ]ÓÚ1…Ù™gv[®iõHË1 .©)•ÄCLƤ¨`øÃ¿o/ÀÐ)ªÕ·QñiòM‡‡B2V‡ºîm°#ùÎü qää%‰³ªÊ¬±ÒÐIy‹f[!ÕxR ížw“ÚÚ¤»ŸøÍÚkV¸ð›7wc![cNI(4ê$ÊSʲР`P„BZ:Ž%C^Òb÷¸z"¾FXtnͪÍ+°EÆÂúDHA/wi]ÒMê™Y§‡¢v·œ_Mdæ¨ó7dÎóòqÕÕœýqs¬gxø$O+sáQW·@4¨[ ïM„‘4ËØ/pH2Êw‘ò¤Ð†V³ ]øBݬ”u8Ö<8¯«y‘èyÆ€g¿š?uœÔ^˜ôŽÅD¦çºjMg{ÚZ’AIô=ŸB_“©<Òi½9ŒkòÖšCD$²œ×¦ôƒè¾ª`Ç-ös%ÿ3©±¤óî—_9`\¼"ü/ª}Žá©B…i«{ÔÆù’/ jú]ÁÞu ÀpÒbMÂÅ%ýæv픯²ñ¶y%G¯C c¯è`~ÁðŠ@ÞWƒM€g´•…8$ˆ# 1 Á'PAGé‚lÙ@· Ê…¡o•Ó~àØ,aŸlT8=™•UÍdØŽHeÎïÂT{Ÿ[á–šþ°´9:êAü>Mt‹ËWÑ%aºꦪÝê_q&e†+˜:×ËWðåÖ´ zƒ{XIÇFïa‡1¸Ô4€í+ÎÜ嫺â¦$늧ۂHèhBŒI÷¼“®7ûXÖßgi÷eáè=v =õÄsÞÀ^/è{¯‡-¶ãhÊ*- r€Ïõ®w °då²avF'­X„á·õ÷ESáÕ ðÊKH}!·Ú‹U¯CϪ)u#¸zÆzØsJvÑD ÞHPQÅPüùðf…S$F6Ù¢ ð9´“CÜ·¦ØÃâ9 Cåé¸÷×3·=W¡K=â?ž±«jsÞ9±òb1lƒ#ás¬¥èÛàSŒCéE¾8chAüžõ¥±4\›ñ (õ¶¥Om~–‚3½ì/º;àþõÆ2;šÇ²Ú79~ÂªŽ ™¥GC¿SBÚâ™øšÚj—¶9Òñq«î~ra‰C E<¼°Lb§=Q?m•–ÔnØïQœœí¡ôÓ´µ­V½õdŒ†àóä,PáV"!åc0¬ÕXÙvpöÏïêŸ%T±LÕ¡ÈhzßkàKN÷SC6!ܨìÙA¦>äþ"å’U6>•³ì†éó'­´8V·IÓ`é«Q~¢úAW0Òü…’ #ÏzmÉ…NÅ0¶Œ?¡+^RâÐù8µÃƒ Í]¥<íXná¥6؃ä];‰"úÂ)ÖîŽàÉòõ#¡ƒÛ/øBÉê=ñœ–ºË9Æï C"[ $6Ù±²ÁÝãþm^º9ö©éÃ)®£ï obM·×–ª"£1Þ3'@p¨[Õ_ð£Ø?°¢ endstream endobj 859 0 obj << /Length 2059 /Filter /FlateDecode >> stream xÚX[sÛ¶~ϯÐSKMCâÆKó”&i¦Ô™9ñL\?À"$ñ”•—:î忟],(“2SÉÏX °X|{Å.ø*‚?¾Ê¢U"%ËTºÚT/"7ÛîV4øïûÜÓ…@N(¿»~ñŸïµ^ñˆeQÆW×Û)«ë|u¼Ù›CoÛu(¥ ’oסR:xÿæÃ·4Óï- ÞÛ¦Z‹$ø½°÷4ó¦©*SçôñÁÔ»Á쀘«8NÎõúöúÇï®à´J”gÄà*añ*NãR‘$f-Òà÷µÖ)JsW%d0Ô9Ч„"apP›Ê"<àϸ àÊ pû¡(û¢?~x{õú§w¡ß3WhÂd,Ç-l&<^·»¡²5"êéH¦lGß•ƒû@wë><8SºsV¡ŠeI² ¹d\0••‹LÃ&Ç`A %hÐ#êlÿÛn!p8R½3F)iHd !´²;¥¨ó¢ÞÑGÑÑo^tÓæ„oáŠ%”ƒé‹¦¦åfKkž¹º¡m›ø.Àc͸ȼܜæv;Ô‹r¤,–ñ£Éœ*÷?X§ M¢¤ ®'G2è¤íMaJšù5iîñ§iónÑ5dÊ™Œç|ÕP@à°I+–ª#)ÆÈC±49êÿ«Övý/ÉY&Ó‘l±÷G±Ð§Ý¨²¦](Ñ,’É\•dN•¦£ßmƒÖS)@›A?TÍÐÑTi\Ø£Z“ 7¡ý|¨Èþ¦âüË@ÒZT6øÿ'kOÃ_E¥V±R,N…KLÃC/ƒ»\0Ÿ™&…q8a°Nq²3aVh|ãÄK}ææv̓—^u±`Ï›DßÁe8¡£€‹èT@ž¦LèL¦¥8“ãFêpB¾”çN˜ŽIFñdIÉ‚+¦!eL1s¾ÇÇ÷ð—SðKc;>iB…‘ûåÚ \,Zš›>|â’‡ãrô][¢jíÆz]zÛ¶©F®4c?{‡Zð¼CÛìZS½\|ŸÇBçKïˆ1ôCêñÕ´v©8‰(XoJø³¾öëXÖ #­‚xÑÝ'Fqí §{KOÝõðuGêO i8y§k\­)~º•ËÁ¹¿2‡%_FÏî]Ox(6hÝÙã½Â@¬ ,]¹4fÚÿ=/çº endstream endobj 880 0 obj << /Length 2075 /Filter /FlateDecode >> stream xÚ¥ÛnÛ8ö½_á‡ÅV*U”(JêìK7ÓI3HÚA’fÐÅbl!¶ä¡¤ºùû=êæÈm²‹Ñáá!yî‹…b‘ú‹8 ½T&‹Õî•OX³^0p}þJX:Ýå¿o_½ý%ŠÂ÷R?‹ÛûñU·ùâ‹s¶Éö6K7 C'~·t¥Œœó³ËwŒi6šs]í–Aì|-ô1gÕn—•9/.³rÝfk R©ØB-ÿºýõÕ‡Ûž¹(ž)R>#1BÏ9¬*‘ž%‹{¦K7RƒL8» NÞnµ»ÚêÌ ;  5Vh+ð=¢KþãG¾ÞUÃ@{n¢Ä(öÔÂvD$¬‘¼žèL:kÒY2ÒY¶ßo‹UÖUÉ$ôä70@™m™‡3È=OÈ;SáE‡ZšªÃeŽPY‘þ äp·¥þžRÔS¥äú¾(­C|zõe¸ùøáòÒ=û|uõþÓϼéyÞ3tÇüÜñâ†J8YÉß‘R”+…«l»Õ9ÃÈÉç°)–°‰ŽºáM0†½tO—XC¦({šé£.2ŽŠ›xƒ ¢©QÜ8ÎíÆn©QucŠrÍpQãW9/ÿtñ‡%Úèí–÷V6¼f8)Wø2ŠI …®Ô5o°\ŒXN#?vn´>ŽÏ M½@¦‹H)ø†£^{àeðO¬SÌ8j»óîè‚™tü It£W6&€[ò\Éð=âÝ5mùZ:J=%$™I5SCND9n:ê0.“Äó¥š2~_æ"/jö7”>°?õñU[×6æC§ºç¸9÷õ‹b\ü Æóÿ)ÈóŽ+Ä•ÙN??^€|2Uì~¬‹¯ä–%/û(›Fìà; Q„À÷¡ä+ÁìQ¨£›Ö”õÑùêøí½©¦ÑÌ<®M¶Ñ“tÑ“óÆ2‘4¯ñE8à€ŒÊjûeüßmÕtç8ЂE80bE­yo`•ÅÖ›³M(#/V8l³ÚTwñæDã'Í×î”ñÙ º§ö†µÑW2–iÞ-Eê{ ÜñÔ3ƒžYԠdzáËsëÒÉ̺ÝiëÊè"/J¨á ·ÝgÀé˺H<òüÄy=d[¼XµÆXYa}ê?®‰/‚Ø'ÄX¸"5Æ]iqU;Ÿ _A‹¯üˆl‚TÙªi¡«zìÑs†åŒ­Î×%øw¶miéÛÄFf†Í;äî‘áfƒ>Œ4÷mÙUyX=R¿Òò¢ÞTíÖ>˜lÏX ÄöHÆKìýAîÍê¨ÞýŸéô´O1‰Lº»1˜¥œm®”ïʼnX„>$Ë0yyseÏ»£ æš«£gŽš+ñÀÃErœ|©uã9‚DF·ß’S³ʮقã"ôŸ4[qà)5‘ì;½ÿ@Œ£+­nçB8Lø> b5 by"ˆ±‚¿¬êPÍGÙŸÌ9Òy}~ó¼Y§ ñ–ã;êâ;štG°¼ÕM€E†2ûAàUʼn!+J‹“Ž%³C…† ¢ßÍuC˜«í°™ *að(– Öá7`«!kgh ™N *Í@xl´õºfTÝÀC™ÉùlÕ6û¶á¾Ùd2Ƭ¬õìH6¯eBeY̰0äõOØšcÏXsͫʚêP¢>¦hz ”JhCHnxçÜ$ÒSIÔÅ»;kt/âQ¶|qf4uŸÌC™öïrb`PÛÒª´G¹*ˆ`°€¼0QÁ R‰F C$"±Ã( ;ûGI?T2qÍHÛói³‡,Ní »Ž„oïŠòm½d “Ô©+¦ÐÞš^Š‹·Ÿç¬ct^˜>÷nÖÕXÜq ìÐZA@I^PßÎ=:.Æ/ïíöÔ£ ÛéÛ; C<”@ê°883x þ®è•-GâwT;m{Òç‚CÑlf« A„õDy"Odç±jM/%aþõÏàT&qçîÅA+T>·•8g[£³ü‘±ÛéW‘NE€bÏûZ˜ªÜ ^\ÍM‘Ým-é?®ÞãþÙÇÛ?ûÀ(ŠQx¥F§ÔöIò_ØìßèBçH¿4ôƶÍD`—±Iù%ÜÁ†àqÏêÆŸ)”p.¬cÛ…"Ч €!ÿ•ìaµ½¤âïÑOoxÞØwrSu=ð‰_W('ø]L`#Á>‚ˆ€¦¡¶JÂxz¶-¨KàVÔÇœÃߌ?à k}ÊŽþùØËnçÞ´7ÓZ+ŒTanÁ¦[vF'\±æNX\.ÎÑ~ÿ·©ýS]=R6ò°þS*Å—¾óË2 iÐaÒ¢{Ä>ÐølÞÌXÞJYãO¢ïô"û¹~ò.rÞîõƒûØ÷!’XCÄ]ÆÚ]›ª-1aD 6ÊUm÷ÛÚžÀ0\ûùúê†w*3§ÎóKl؆öaî.Â4bS0)ßÄP朎6‡¡f„Œ|*#¦nx1â—¤Æ0…RVÖËé½Èþ¤¨&½äG®ì endstream endobj 893 0 obj << /Length 1720 /Filter /FlateDecode >> stream xÚXKoÛ8¾çW½¬ T¬ø%uOÝÔ-²hš"ña±i²Í$FeÉÕ#möñßw†¤J‘cyQ ¦Èy~3œá„NøG'I0‰8'‰ˆ'ËÍI wË»‰Y\~<¡–ÎBß¡üm~òæCNh@’ ¡“ù­+j¾š\{§÷é¶VåÔçœ{ÑÛ©/Dè}<ýôÖìÔ÷Ê,>ªb3e‘÷°V?ÌÎi±Ù¤ùÊ||Jó»&½b*¤ŒÊ  288\4Nˆ ñDF`M|ä–Úwȇ’¤'Ô‚ ªß|ˆ€’V€Pú‰Èá42”Ú×pꇒyx1¢ÚZPèìº6.!Hômß™ý -‹²TÕV+,ò•%ä®íþƒ;AÔÈõå¸ð¹yí _]¦yµY¿Áðywl» W?]ÍLJóK–.uf‘æ4+Èq¦ÁÕ_Ntƒ~taUÿbE@Zå«´\µb¶M \¶ânK«ÒR‡é²a Š·ÀÎ æxãðWyºA›qYÜöÎó,IZíHíÎv«o5°GÃlç2~?“馆kº±ÜôøDËÓUÜVÄjÀEu¯²Ìœ-ͳ 2M¥ZŸjÙÔª'À‰J":nãa‰÷Þ”.0yܼ¨ïwI¿¾ªzZ”2»×f7„_aŽÊ&ÏAØQ·!vnCZ $ª±5¬ÒÄæ‘5»8÷ÏÞ;>¼;_\QË ly¶ÅÝ‘¼hìÕÒ¸&«×Pæ•u}Ñ´Uáç­²¬M¤˜ôBx‹ªÈT­Ž*ó‰ƒÌÃTbï ̃N°iöÇ—#p˜Ai• ¦I1ËX̼¨—­M‰dè$ÔË zº€œÝZÙI§ÿó„DœqF0˜1dÇÇm©0Ÿ´ÒÜhmrå´2‡Wþ“ †,µl¥ª›2·5ħ'±ä]Ûp1Û´àäŒ$,iMB4¿7Ems²M)HÀw|Ëö…o5åO:õ»‡×ùú±Æ€+û20ƱH_KüÅׂ¾«QMîk ­ß‰$‰Œ;eÈŒ é­Ö%¨n¾ìÎ0Ça|ÑWZ äUaV¦BÀ¾Ð7¶j{¤:é‚;Ýà Àe‘WuÙ,uüäaîÉâNçNË!iDh¼Ëª×C‚$ …Ø…a5(î‹”²%Â8 b”¡мÅpÙRéë LÂ…‡¼‚ˆÁŽ=F´ü¾#`àÝÝWÓ#h¢K ã°fw 0ã ÆÙn JyßzPÂdÔ±~ÿŒÐR°µ/ô‚.ÿ7‚-ÿ!«zjö (ZWå t­vøŠ({½ªêN_bßôÅ",ÿtìôå¿0}µTOÈŠÁܤ’Hàtm8*7-ÿ«újzÈâQÙÈtàk¼q:9áàE¹¤ÐÈÆhhÚøÂèÊ":Թàӹ9¬ò)¼òkÿþ¨ÇjtW90!ƒvþï"ÿ§¸½ýw|GŸOcîAW4üß°ý©GÓd ó<LJ˃Þ7o}«ª IQÚÁ –}–-O¡%¼Y­«Ô´ s4D; 𜺇‘Þ®Õ1OCðqŒíÔ¤ŽÂæ%›DçïgWó˳ÏG ÙæiRš¾+ôt /t³‡FÞn Å-T»)0µµ Ëaþ† ~EÇ\3  Ôd+Ck´ªŠÜ*Â)G<½]žOJYfæ‘Ý“š/¬«·š<$ øãÃ=ä‚J†0¤!‘qØvµW×Pã´´Ë¢†^ÿj1ßòt¤³QÒk+}Ž“l6N-Ì|”‚¿¬‚ÓtcòñϢ،÷BŒRRÝ8îÕZ®pxÕ–«ÿj‹pS endstream endobj 909 0 obj << /Length 1284 /Filter /FlateDecode >> stream xÚ•WÝoÛ6Ï_aôe2Piú–ܺ, :dù¥HóÀÈ”ÍE¢<‰¶ãÌûßwÇ£9ÑZ~0y¼ïûñŽò&.ü¼ÉÌ$AàÌÂt’•g®¦ÖË -n¯Î<Ãg£Ýãüu~öóeM<×™¹3o2Ïûªæ‹Éu¾bkÅë©•|˜ÚaYWç׈¢VœW¼*§~bmßå¼*K&´¹fr¹aK`öÂ8N,ÏK§÷óßÏ.æs‘ïŒ9†NäE“8 /)–ÈA›À³:qfÍóî.¿7þ³¡uYìßÁ#¶‘´½lÌH>e£zmã¦~j¼•d”•‚3 ¡ÈεX®Tc %`(p\׆’™yõ!­ž×šñÈŸÚQì[X:k; `%§g){-2\<¹8ó]'†BiEßÜÈå[.µÐ#9õO%Užÿ gÞPàQâÄuàx‘qg>MkSK’Gó~j= ¹$B%)ÆÊ µúæ‚ô`¨¤ûM¨Á›Pk5>ºZ™«pqó‡ýå7rænÏ›ƒ¬îÇGù'G=žgî–çZ²ªKV‘o1h^7B‡ § z«˜šz'ž*§ãˆC|_òWjžUú~‘ÕËM …ÝÆºhˆ«*…R|ñÇÀû®ªj¹,øQ'_{G xÇXˆ^Â^žÄwKôJ¬ßM³Ûƒ¯K!Á­†\\êö•êöuЧQÏÓç 3 ëïsU•¹ü|>¿¹ƒVš°† #K«üac€©#ÜJ¬ Á ïÒötΟÖèW'Ž.8Øñ¡?=4UÁGT±Ÿœ˜’“crjΟùÈ»”3uÈϘ˜ñ·ç‹ÛÊÏB#ÿ7µ¨Ψµ I\j¥á« ²Y³ŸÌ8fhGû–KAâ Zë6Cê6Õ+QíêXŠ?ÙC·ª‘ U`f.ø®½“’;¡VƒÝÞà¦$-ª1qZv7&qià¤^'ûŠì†ËiÒ£Ñu×m•ЃUëœI!úÛ@çhhÄm/9AᔺØIJ@úÙxäªÞ„ÞgÍ>Бqw1¿ýzJO^ë+Á3‘£J72íέž%ØåzøÀ¢×{Û˜Dl~¥s 8a´mTMEbkÖp,‰vssu=„ë¡›X º™P7Êà2„¡áŽ)ìÆžþÄq¤gAjeE‚Õd:²þâ™"BÆŠŽë.{(M¶Q Æ4À‘ƒÁìæÐR©gÀåê{lF†¾i~< §•Î%.º4…˜&¤Ï%¤´âÕCbÅ{¬ ˆ“LŸçæ¼[p쿘ø<õã”BŽ)äÄö P±:P=ÛÌ\cæ_ç»\«^+íê?ež¤ÇˆÇ7Ž${‹/-3SÇMô€DIl<Øo9¶73EÞá3ÀKoŠÒQ»ùÿfüëçf¯7c[fÞ¥°i’\o¤­§dmFY[-tÚ÷’LÈäBòãªh tûߨzÍYÍdÆ¢„˜ƒ‚MW½<ÈnI$㷨߲bÃOz6o² `E-Ç9e´]ü‹á£W˜U8¡ö¦O ~E„®ãG!}o„‰‚¹ãZ¿¨ýšj7u·Ñ±~ú¿`í¾úösFt¯0 i/ô(Ä—äßaâ~yš]Uí·ã´áƽ endstream endobj 924 0 obj << /Length 2344 /Filter /FlateDecode >> stream xÚY[oã¶~ß_áG¹X³âE¢Ô=8@»M[ô\°ÉÃÒ}ÐÊŒ­B– IN6húßÏ ‡´%™Y'E€hH‡Ãápæš/bøã‹<^h)Y®²E¹{ÛÞn³ âÓ‡7Üñ­€q5âüéæÍ÷¿$É‚Ç,s¾¸¹‹ºY/n£÷Ûb?˜n¹’RFú‡åJ©$úðþ·¨gØ">˜v·:º¯Ìõ¼ow»¢YSã·¢ÙŠ 0s•¦:â<_~¾ùõÍÕÍQ¹Dˆî9Ï·‘Ž·Á3ͲD-ÒL1.íå÷8‰;S€J‰H¢ {óOPz£?©omîªÆ¸ñ¦Øá¸¥ï‹úàŽÚÏm·R1°èŠk&3M‹š¯¥Ù`7€µŠ#eˆ(ú¾Ú4;Ó,E¹Áª§ïºm,—жÀ`û¶kó{ÌUc¦¬æ«)ƒY¿ylwº_®@d ò¿ÔÄÕ´ê V\qÉxÂIETJæiTÔ5 õŽ:ª¦¯ÖÆ ÒP ‹ÚfÉ£u5TmSÔ4ÜÅ`ü6Ð@ ‰â4¯jCSqÏdµÉQ •2Å5(e•¡BŸaŒ!¡ü©,ž¥,VÊO¥›î®ív½Ý(LL¥|¶ß™Í%|Š¿:ê[2[CMêΜŸCÇ`¾º•› 3¼2º6fîÕ2IX*óE ¾WÇz6K`ŒÅ9üãºø´gìë~þj$ pmçËØ}^›ˆÔ„{ÀrÒüö“¹3iJÓ~K]{{7‘JÔÙÅäËõd߸›Ä|AÝ™H«-s'¦9“Ú˜ßÇ™Yyš²<‡û-4ùëÍêç¯FzΗ™™C"ŒsNŽz‹¾`M #Τ@q‘¹†‘MôÞ¨žû‚¶s¡Î¬àš*èšJ±ôo[f_Òh²DØzi쌡­6ƒ Ø/,bÁt&^h?Ï}A۹Г[~ÿ‹N †SØHÏDÁ+v¡Þï&IÆiŒ”¸¡PЃ,8Ë4?e&·}Úòíò©ºÇ§²PW<=Tͺ}x*ö{St\ݧjz ÑcÀ{jŽäçPÇlö\âJ4åèÆýlUÁ¹‘bŸÊ£Mu)S6·Ýkƒþ•«èßíà¸(É&œ˜0j×|¨l¢ ’T”ÃÒÏ#u¡@NCd–5TMhoeÑ#sŒ‹C`r`ѹ¾~ õ€lqœ†[X$I¢?À{ì0*vU³!†¡=Š$‚ö‹ÞÉUôå08‘pn¶õjL„‡2.ê¦â,Ú@ŠÇL)R  Ö!šL…TQcj²ÔŒ9´»b¨J²Ir£˜Ôðœ,õ¸ÌÆ€4Í¢¿‚U/µêQ‡[[ûµÇ*û´Œ)-¥s2άÛZ¬}…ͦÖÅì ;e&² }§ƒÕヅ/Æ tÑB_ã–ó§§ÝYÙ 6ÕÈ:_Àà~Ç`9{/ËÙ¬9´ûµ€hé\^Eímíqt øêúE·9Œ`ôXP€óvÕ@pL*{´ÍD°œÊñ'Ž4k‰·èˆtWóiHÍ„KyðZ±¨ç›˜ÁI:¾bÐp'Ú¦)ØvSt OßÓh{G_Ò ô®GD[ÚK8㙸vTþë¤ÃPÐF­ àÜ–!ÀVÑÇ붺;ÔÐÑÃmÑ+2we¡«$$‹=ÛÊyÈÝ¡ñ‰ZÕ°%ŽÂûX³2_«~8g®|ÎÝ•ÞÊzÑaM‚qŠôʼ^@¡^¤VvRËN ì[ÊÚ8ˬÆi¼©Û/…yÔUÅ"ªæÔÆ'ã%Ú¸œÙè௼0%@{9U&ÁYl$ ä±$Ø)¼3º4F5”ƒðÏå 9GJ?ìΠ/=–¨þ¤ölÙg‹4.r‹gŽè(˃èH%9ÓéBID>âÕðÈM_æÇl‘)@BËj'` ƒOÓôȧʣ¦$ä…Ò,›+¨V‹  És¯Fì-Ì…z³Ä™Uè`ÏD…טÕM¿¤Ót‘îÛœP{¢G¨}b¿jW ¥L^h@Ï}AٹРTXéiù·-èç_Òj¶L؆‰÷Í8c1 ‡Ûã[ÅÒ+€ôgÆŠù ìK– ~É;÷jÄò„™Ðo@z®œÄ3HϤ'D¿)ž7ÀJ`¾¤§°Ï/ÀßNÀéñ ¼`çœmT¥í+L Äa,/8ÈLé£ÜwÁE™ÇØÚ“p›¸Fœ°.ôïðQ@F½1ŽQ輎Ô,d"˜Ìåë+I75ª%gËÌ<’gÇÃÂÜ¢ùéuƒ{¿ãϾ;ŽU¿ðîøm%¹Â£”c„r—æ?YÕÇÔTž^E÷Žï¨¿èщ¿'‡œ¡ÓâcøîÐõPíkw•œD7ùÃNNžvæáÂyø”@<øR'ßµÈL¾?þëãÏ.'ßWtOû®EXÝ›§²m°8-Àkë¿^~® Ö(ÒAK$vôDg×Åö¡·8EþÃïºê÷µ¿4Øá«ijU—hŸO¢"‚®–a0 r¦äB¤šeüõFóC!wºÈ €–6kIåC.…œÂ~_”¡`+ÅY°…¤“¦ðM|/9¾ç^ØCÁv&ô[ÁVz‰sW”Îû=V‚«uW,%ÈúB> stream xÚÅYM7½ëWð˜=˜"‹Ud`p6ð^6@`û°»†ʨK³ ’üû¼jiÆŽFeµœHu¿®"‹õñŠÒœB šs(C 0pÈÙG Y|¬!›-PñQ8 Åq©…"4SâÀœƒ©ŒÑBU¼'ˆNÐB-¨«! Ú$ÞthIÁÄÇÌ|¤S‘™–‚ J˜d‡B|¦ìr°¶Âi˜¹B+#Z0Áò+Ö¦ LuÁ LuÉÜBn.™—̲oT%aâ` ÁxbÅŸ`¿ KÐdÅ JÂÖ ^ñ¸ $."¨B†J…•šƒñ•ºýj %ÁXZ ¬WkÁÄ× sÁ”>LªOj(”|¢˜p™i…¹ÉÁ{Yž0NP>XËÍZ*Ö«Šm¾T¹ø‰øº‹Ž¯ TÍ'øÊJ›©â+kX0œ|;M1_7çQ2^‘A pÌ®6bU®Õ?·À R-åÀjl)HJ8 ã ™†É~^Ö‚»–"äGi†‰ÂðT°yLàI¥ú¤áœ1á4³„¯€†\a:ƒKÃÄýÏ|‚¯Zñ ´·¦£»‰ûoÆ*Å­apnñ%0NZ¬($caæ`­I|;*ÁS,I¨®o©†ÊØœÁXµbƒç®m\Âëáh¬†ƒ5B̤Rû¸ì±?¡\|ˆ™K£DìQ”H»8Jvkt.º‹Ý»êáDt7Ö=®M®*ÉâÈ…p‚Nؽ®T¡özÔ§¯ïZN¯)•4*˜—'GpÈãæ¯§õ+‚->è-‚mƒ4ŸÒ‹´ñÿ‰C‘œ…ïµÞçŒS›¶wj(78H¶³s`ìù*µˆÆë¨Òg77Ãb³XÁ{§)GäXFZÈNÙáMÔ$:ž!7Ãr³øm²7‘ ý ÐãA-Ú·šcÊv¦JÏ+r5?ÀT&7éâ@{Q×¹‹ƒ¬È\»¸Ò8fîë-ÙÏ uqèu£íâr…cÕ/AO.Mµš¥Ú{Âýù©¶íØ—w×S(™Eï$¥¢ÇAëÉŠRoSq$G½px¿^Þ]O6w«‰áŽŠÚÐ0yØgtËÜÈO© ­'ú$ºW³Ø¾= …fýP¸SÑÙIÕ.N˜cª]ƒõ뱨:À•Vb>ƈp„Ô‘š^Ê$.ui+\ÚòÅ.½gmÏ"lÏtÏ"t·e¿ÉÙ½O_†‹W°Iö C”7s£^~Òñ—ÃÏïVÃÄòŠŒiÎý÷úGîr†îÛíb³Naý²ï¾èTôéUý j&d™D‡åØÆû€ɯ# ¥—«¿Zl&Öu˜>~¯t¬ë§.7Ó‹zC]RþPÔ•"[ù:úÈ›y¸Ò½ÒQO«\¯nS§Q?-`*Ø[æ—.V»8!PK¡.Ž E¿¶îáÆôyŽ*EʹóÛ«¬cÃféQÃæ·ÃŸ“r?lÏθÒ=ÄTN‘«tq¢tå>.Ãô}q\šŽÖÇ90õq)!Wëâ8¿½ïá2"È.å——zÃîî/Þ@taö>zW`e?î ²ÿ¡0Ž´³îÇ}A¦ýoJûqW ­L.ÐE¤‹ù?8}}è@\žŽ7ƒ/†Ÿlpr/˜kEuÿeñ;È } êdAŸÓÚ'š³Årê%;#Ùë”D`ÇtRçÛ倦{"añ‹·àu2^·óÅï¦ô«ÚØãm1£kÑÿ.Ddz”¯ªÖ[zmª‘.Àä¤êé'ËîÊ­> stream xÚÙrÜ8î=_áò¼¨wÓZ‘"udž<™×Lå˜r¼GU’Ú’»ÙÝÚ¨¥±½_¿ê²ì8[©JS‚¸‹³þ‰³48‹ÃÐOUr¶9¾ìn½?£ÅÕå Áxk@\0º~ñ·_µ>Ÿ©8»ÞI]oÏ>z¯Ù©5õj†¡¿Z­•ÒÞåë7¯h§=Z\šê¸’±÷57·´óº:³rKo²rße{@*ŠbOÈ`õùú÷¿\÷Ìi)Ÿù Ä|ðŒžú¼ƒŸ%Ê¡¢gľô#½ZëHzyyÈoòv}» …—Õe^î‘D4–ˆJ ®²>:èò!û²×W¿½»°`"qêØÎÖÀ˜Ð‚ýFDVkkïv%ÇlDÈnBC{+ׄåŠ(»v,l›7§"Cè}O #Ð)«Û|ÓYýÈEGÓ4¨à_j9$·ô}ÌKªSAìÝØ pðc}\  ¥õ©6)Ñx £6´ÌÜ¢¬ˆÊ„03;𵄨VÂË› “,Æìt*rø$A TÁ`®Ò *¤ÝЯ¹s¯náÅ RnÑSሱWïß_¾¡ŠÃ€|6ô¹ÍZÔú6²Ñ ÃÃð«êZxò§$Ä9ÚdWÄSÇSaŽÆJ¶µ¶ör‰³ª,îÉ'À#ðÉwäæj¤m~•S8`ÿ@?6Ú ¤¯±v¸©öeþ_³µŒ)ïïÙu#3eP÷‚ïªÀ—Zw‘‡ñS¬¥þÇÕÛ7çüñµ>²ªöÅÈUgÁ%ýÉ?/± /˜ ÀMMÓ>7´0¶}î¼~ÿöíÅ»Ÿé•³zß|F~ž>.Š¢B…ÝZû XEã‡&{€_°6¸–1ÈuzFœ—ô›Ç0PG¼Ÿ––®Ùt-¹ž&×[0˜!ħß•²ûÃÆ®k;k°iM=Å(Q´c(šT|˜áô®¼»2ßp”D8ùXEÿ3Erc{K«F ¢¬Ô\Z°3<?²£áÔ¤Ó±¦§JB KeëyA§‘ö! :Ä &¤|Cñ>²’“üˆt(.Àfh¤»{û¤µ ´ŸDr¿1¶nPJlUéhhãëJC¥RtÆ!ìè׿{Æ[í\°h~^xÄ®‡±M·Ã–+@lEÂf8½t"éÇÍè%^•ÎR‚ $ ®(Báj0üÚdEÑвå-{» a$ršÅ äÏ’2Ú耴ï_Ê/½L@ 긬uÇñÓJ°jð2LP«sˆ"±à6å5wWô/´w}‹>Yh0[(T\ˆšÂ+üt¬YÇ Â>fÎà€8ÔrÙ±ZÅ «;±îcd *ò¦õ—¢¢ˆ¤/Tììý/K.‘ú2IF/AkxYï 2ž±xYªý ì)•y±t› üX…ßy;X AÌBòMǾélØué±ïÅjà zצX³•±­_½w BI} à}Þ&ª1R5\OgÍ’PB!ý0Uߊˆ}‘H‡äÓ{C™ú:ަ)×V:¡Þ©«ùa ïØWiöܘ…S áT z üÚ@pXô´ð[‚ u1~)¶o»ÂÌNÚ¢š©BݳآPˆE(X:‚6Zz›ç.Haêjò­¡õ8‚#Æ‘ò~]A]ŽÅÂÍ]†Õ+è¦3Ú´ÜÆ–[GÑvdV³2X¤ ”z_JJòÜ‘¥• ƒ¶`†ìF9"öÀõ°|è3Í®ª½Aø‘Ò)oˆèš°–:N¸¡ê ^6¾à~Ñ÷R?N{·Z.ˆ,ûRœúB&S“OÕC¡ôeÜßÑO3n©*¶Î36†£ìd*¢¸ËX”U˜øT}#ö™YKùZâ)†ª4î‡EG\52öZ,û—T¾}â_PúBÊ—’”¿¨z)fA› W耈ƒU>Ú)X Ø©";ø±BuÐjìJx†­Ó•él¤d˜5ú2.“Qþ[êjlVK†¶AòQì!{ÙlàÚ/Ü^Tu±}ÊBDø‘ŒÇöŒ÷7ˆh“3³¶N ’Ñ<ƒX̺Æðz6åIBׯEšøAOŸ •ö’¡õ|üa;³kT þ’,`íûqÑ…w˜ {xH'ø¾ÿØëÓò_ïñ¬ŸúžÈfÂ¥ÕfŒÚ”aDJk”:ßF[Ç $5Tœq¨§«ª»)Øo6…»C %áÓÀòƒyælî-ž/£øL‚&‘4Î} 0èÔà?!írº3žFºóë…ÁêüËú³án§«Ðû¥)·jÎò?¿ä^ØOq%d4B­d„“'<>>uØß`ŠTÚÓ ¿›ñLwG³+Œ1m–ŒÐBaÉ<ìrêr‹ìˆm.äJø›=ÕèŠÁPáÔÍ6<öâêRL­Õ‚~ù×W¼„}BÀ½wÏh€¹ÿÅ!’¶\ʘ'öbh¸í%’¹1Ö¦_\2ˆ©ëűmWZ]:¼k›Í ôI„ ³êùèÀ7¯|É]MK؇¬yjÌ3t{2e?­úYîxÆá,m:ž_-g0HÀA<KšÒÝéCÙ¿²»q;¯E>iU ëd¨Á³Ãc¦t(¸‚NýHè…4êhRêjîCµà™rÛeÀƬ»ÓÊf+;ã$åk=© àä p€…¨t!ˆYîMiê¬@FâùÜ ,q<ÍP鸧wà XLÈHvažLô‘ÜúÈbA­ÓÐË Rɺ¢ImMsŒÔvh´jLýµŸ¡"gq²¥Ñ4÷ü°™*ã·œ²:;âŸ"®]ÀIüTφ ýÕÖ[œ[ûSéÔA•[šbG°œ™ùOçØäCçhaKÔ‘qÐéš)@á¡ã d,Q°˜¿_“؉èC®ç»ÊØœ?* ý_] òûj©×¶þ‚?»ŠJ%X£˜±ôJ@˜ææ©!Ô~ƒ 5d0õÝɯGçRÅì’ijC&1à‡‚^öqk ®`^Ó"弆8B¨9ó* }•DîÏkûÌΉ:K¶tÅè9 …™!…gèï—"^§Øš\0“`@Å1}|lLû'JPÉÀI¶E(7Ð%E±3þ¸òÓŒÎH:ñEà%Kö} }þÿ)9wüi–f—,K/JYxÐ-ÈN>Šp!ž';‡ü4£3’cÙ½«Zf…kT|¼·³©Ât³ÈÁj9`Ùœ: ×ì@©ÍÊòrö'ûi_‡;Ä\ kœDþÒd&§ endstream endobj 954 0 obj << /Length 2661 /Filter /FlateDecode >> stream xÚkoÛFò{~…>õh b¹¾R܇\’3R¤ia»EÑÔÐÔJâ•"U’Šk ?þfvfù2å8Ãà>fgç½3#± àO¬Ò`+å§:Yå‡]mv+\]¾ ·Àõò_7/¾ýw®Dà§A*V7Û1ª›Íê“÷fŸ;Ó\¬•R^üêb­uè]¾ùðŠVº½¡Á¥©2ö>æžVÞÔ‡CVmhò!«v§lÀBGQì ).no¾ñî¦'.”ò™\ äc6¢1BÇ~´Ší ¥‰“oêcWÔUVâÅs¶C_ å‹ wÅç¢Ú»ByŸ/ÂÐËÊ“iiÞÕüEæµÐÞ¶.ËúB&Þ}¦Ø˜ Wºâ÷@hÓ´Y0 GËK˜’‹†v6f›Ê‰n‰$A4‘¥eªá²²$éÞ]¬á*ÃŒM)?R1`²ªÂrh¥ð%¬¯á«$ëú›Æ´ÝYé0ŠÌ^*bÏü•›¶¥qÖìNf˜—˜:õÔÙåDeòÎlh¯¨}Ê¢í@$J™€tû¬vÏ!‹‹ mÛbW6@Ô ­7Ø™Îp©ç"ö,°T\0ñ0Ö„W¿Z’³Lü®}Éæö{ø_f‡» °ÊЮ‘íG°$†M“ïëéÞ°Ï8îè“Ógc÷T¶R)QtãX¯OÝñÔ±!{õ©Ü|Ñ’D ýD§Îܬ?„¨rš%I‡¾Œ¥;ïH ʆ¨ŽB°G_°Ù ~”¿‘ôJŒ ^·D_`9†ØÐÓWšŽhz}uùóï>Þ\¥ï~ýéJÐŽïû4ÀµçH…&êÒT¦É:”h¢­ùÂtâ$!nì¢?9‚2[pwÚ6)éŽt"ß8ôã(tòy÷ëÕOËb” R1ˆq-µ¤rB!Ný$I¼Àç^•‚í*†öŸFàÝžÈ&ÇA^G¾NÁDƱ/d2Ð]QmÀ³ÀeBpØió¦@Á@àØÐÚ¢xX¤Éž–×Wé4¸@z,}‘Æ3Ëš¡T „ç#L|÷2.˜ ô@9†p¡ÞÒ·}é½.ÛA,`%´J;a€“:Áд`Î:õU˜Î÷œNTmÚÓɤ©·¹žõ•- ðA¡@‚[uC÷"-/m™T2¶usX `}:‘ã ¾EôËë?¿;çAø‰^÷{Ó˜%5©` ÆzZÂ'c_ïZÑÙ±úX“€._áÌ4YO@vèTuGãÚŒÞ)Z´ªÀ‚ÞP¹Bx(†3Ž;€"Å„˜¾×ëIœ€•û}‘#û{šº˜N4íˆÒÐQú’ŸöïQS–A±€V¦˜X§jœMØu^vÖ fc 4UƒNy—Ê•|Ž®4xÓ(`i%è1Bä.MjÜ|$;)£í顯Ã1c¬y^È<P–œøãWDÃ8æëdV0šh æ{P–§|›ZCwSQ @ä¥8n;`ÐÅURv|3ÚŸ„]"¢h93±Ûˆt²d¦!/AŠ2‚Òm:[¹µG>ÓÔ3‡cgcËwÎY›N™I %YGE,æYË«¸½”*ÅÚd4Ž!ýCÍY“ wç³ñ$ñÕ`TVxÎå1õçÒè%§ù’€¯?O{аë”àƒs.†@Aá!Æä›zWõùÄY’ípä@¥wm̼ ûWZ…~¢¨òCØóñ4<Œ¶*š®ŒË#w~=B°Péͯ±T]CnnmÅ`¯„Dñi–ÛÜb壣-êBÈàQI'Þå1#OTuüªg(‡øŽ¡–‰'î½ ]úR Ñ™ûzéºóë‚:ç×L¥k‹i®bCÿUß©g¿}I $VB?2éè˜óR%Ø/;E؇i­ÍSCþõÿ ÐÿM³k–(dÌlM÷ç-Wm#é©G}*[%Qâè€1ÎJœ8২lâÖ‚9¬ó²n!°>Qî¨Q…“­;B=˜×?¬ß¿% ½}}óŒú†Ð½m2[S>eÓï)ª¼*“q8áv®ö¶n%/‹ã±o Ë 4ÂOÇÍÞ*¡MÖŽÈ´¨¬eÂÞIv†ã6¥¡ˆÖ¦¡°=¤¡0Ù›ò¸Å¤\ެÅæaUpX­³ÍsÛFJMÂCYüÆäÔÒþ{gêƒéš‡¿)œÝ>¿môP·¤Ò¡VØj¶Ò¯h ¼’·Èùl: ;»Q„Ç\F!dßܶ­Ék«tÔþ¨«É»ì½9õ¦Û%¥u È´Žutak7ôÜÚd]F+EG+9ûVVT-_c Ëñú=£¯Æè«8y¢á(1Ñû“…¿XYk?N'IUÂ?Giö¸}¨^.]†vNû5NÓ‹Ú |¨6Ç·þøãåJ†ùTðvŠ’¢‹–cëRaeÖ§Ž_z*—jÓÄæ¾‹»ÖÞjP¿U–·Û’#ÄøKý)™øbÞ(¨Eg{ §hË:¨ýÐeÓ€zèðݨñÃŒ´¶Ž›r`ÂYñ?ÌÙ…û‰)Úzt"2œZãZ0̼1Ô PaHÏ›†uOs~¦hRc«<ôþ 9#Ö­Qhc?XýY'0{Â=k-íñrþ¢;ýfð¡ö²…¸Ÿsž±Äüeòñaÿ©[Þpvú5!N!n}Ìà‘xf¾èàŸ^ä•­žÃ¾{ãüÔ4£:„”5®}…sK–µ)zæð qj I9xZ¢<^"yµ<3]Žf¦ÞǺ3¯€å$âÖÔÜF²¼so4þjc¬håðÛÏä‡4å5–+ú¥HbÊf£pÏ”g}é!aÛ=MÚýðûÉ}“iµà§¬à#™{ÙÜvˤÚÙ™âdâøôƒ‘ëœLzN©"€q:îCœ+ôíGÑ*>D¹¯®òèðº?½Tâ/8Wß顾[÷ü-zÁãB/ò-G > stream xÚ­XKsÛ6¾ûWèh&dø~äÖ&nÆô’x¦ÇJ‚-Ö©’”§éムÝÄiG3"°X»‹Ý»ðüüEî-Ò0tó([¬wgQÛÛ7>¼;ó…ÏFgÀùóåÙ«_âxá{nîåþâòf¸Ôåfq¥Þl‹}¯Û¥†¡J_/(ŠÕ»7ï_3¥ßjn¼ÓÍn¤ê¾ÔLyÓìvE½áÎû¢¾=·ÀìGI’*?–×—¿ž_Záâ øN-óDÔ]ô5’,rý0b5R7pÓpéÄI ªd Ts‡€þÉP0Pà¹Yœó¼O^ìU °’WÍê½î/Þ^c?RWëb§ÛúÀçËr#sÆ©›,Ì}^ñCÓ½î`…Í—„ª^úªØu”Þð/-l ÷K'ÈTSÖKøôv Ìþ€”¢ÝŒ–…E4³ÒÂ6ÍÍ„aÅ+êMYߎH8ï3S`¨†¦*Âkx¹ªAÒ 7›šX¡‘˜€ökZnÛ M[Þ‚Ô6ß-î÷È êVd¨Êµ™Áßn¿Õm¹.*Ó-ÖMï‚_†‰ºÀÅ|Oƒ5ëªÜ袉ΒӴ—Ȫ)zt(^fäLGÄ›¦ØY¤L­Š5Ò™:°ÝËŠ™eÉŒ [ÁŒ=êœ*]´²}!ß ]¢…™±=ñ€CŠCt]¹ª4ûäÃ敦×ó²M5Ÿ3ôÅ5ÊVWÌ|_Ò:hÌ(RçÊû%œfQ!kJ‡!ßÌÅM¹Ș¸aš²Œû¶¹…󈃘¼€Ôˆb7óÓÑa˜súæÌ‡†F}hÜÿ ›œ;_ùÃ^õ·‰Ä©É®ìFº^7»}ÑußÚ —º¦µœ‘ྕ|6æ-f½€¸‹ÏÆB¡Âma$†8èÃWuÓ3k'~±.?y~¤7à¯Q¨R†™ßOè~ØAœÀ¯5w~_fømµsÍ‚ÈÊbÔ¯‡ûÏX¯“ÈHƒ¾PŠO”{•F…ˆ+V„;=ºt{»lº1l;Œ—Aä†Y<@îh‚܃3|Ó‰ƒ Îý?ƒ9/ýÛ<ÀºG«bo ÂDØ„CP‘‘!nh_¡“Õ« S ŃÈܵ@ém‹ nÖ·(ãÌ"÷Å[ð…0óÕå–N.óLïËZ3™„jÚ»Ž» ÞNÐ!À†ïùˆktb*†Z t…õã,!_£ްG¦Áudqrx”àÔÅfD'‡.š0X–âthº†¿6ˆ¸•†(F±E!ˤá©åvq sÞ|Ïæô*²ùÓ .(Åú¨õ4A "ßÓE¤n”ä”#¹1 AôÀŸP²4¦ ³&™î æÏä“MHÈpleSKˆñKÈ`@BlƒË!”_ôµ`ÄžÒ>lÍ$}9ntz:ïæoh0Y’4˜›0åõNà&~nÔìG0‡'2ð`Ü:7ma­ °Q•{§ÅhLª!%pvà¥XþÆöŸ‘n~Ô}÷ªÕý¡­Á;H½÷E Þ·§ôº+¶VxË?r›589]<\“pšh‚KY–<›öã¥%–Ó 0¨àH€†Íº²X=”õFò[êcøU…p®(gœL@ :`ž‹mŰÀÁÈc§ÄŠòîâ3wŠª"TÀmy§Xñì<"é㔫o8#$d´éžs-ÞWE­;E?ÐÕÇIOrs“dÿÕØ`¨/wº›“i]5%ü&úËž©Ô€$»BKo(2=¹QìÏÄN¤#I#W°yJ:¸²1©?{g£?pN./g'W'§³#ÂÚöÜdWÌ1pô·«K½Ú7&Âd+«…!3ÛÊ`SÞõù¢£ 41~Lñ8ãÑÀ¤Tîh ª¶#ÝòjQl2Eºu›v)&†h+òÊì/ê¢n_Ðj·–™v¦žô(ï}¡^¡=" S³~ýâ€ãj©Ûçà“jõ÷&þÜ;GÿvÚiOññ\v[GúvÄ™ûçFü' ܨ©scgi,|_Õ:ºïKZ_n=¨ÂO<E“ ñuðBX×,=ÆuÁØ_Ù­ö¬kÀ]öZÄ÷jÑçue* Ú˜‘°7[UeskœØH[(FJ\F^ðAô—8Kùˆ »Ì´ ãqø†ÓA¨°ÇCåDÊåxSø€Ñ!Àâ8À†ü® %ÊF£L-å¦è-WyŒQ)ÙŒ"CSäXãD"èø**½Öˆ÷¸€-ë’öçtD²¢…ËjR˜\]P›þ¢ŠQe`Kdµ-%Ïnw:"¬¡#ÒEÌ BfÏÿ Ö€‚µÂ†«@Œ„óÌpdÀšcú„VÝ6›ðž:%Nº._i´õu¿ŸJ?V¡§FN´¤ÁŸ†ôÝÕJ_ ç„ø¾C}%œ:1\07%þoÀ¾¥ j ªUFÕ¶–†çZöÄ µŽí‚ö³ÐyƒHˆP Ší‘^U_eÙ`9bQæC†C–.ëzÌ^œy)ÀÒc$¼HÄ–â] Ü~å¯F±!€ŠXrSÐâ v®×Fm}d‚ªCÿD¾CͺCàèò9¤DqOÔw9à&‘Ø[g ‹…i¶çõ=Û›&m TXûìÓVu bKÓ™b¸†‘×çöQíã8~%—ý0yRÑ )5.ðäÙb_q8T³Ñä·Éqq'T7üÀ`sãæôíŸï¯gW&²aóæ#š¯4ùkÎßødÝNo>èÉíííÑ¿L¼Á´òC§Þ`äû‘îÀª™*h®).Ü3àEÔÑÀ6*¢*9/´õawnd6³¼TU°‰"áz’ù»Þéè¤îmàÔ…Û5ôXƒEÙª±>HÿX…±¡¶í8¾p‡;eaŒì¥Çâ5øbB½°þbä;Ðuú-9ö ‚¤dCaÃz&˜3“ÔÔ’UޏþaÃ6˜’6õÏPº´²ë(/êjÕÑ¡¾6Y‘PGؾ궷Nvj4Èj/AóF¡é_€¨[Û» -ié'ú@k7›BêŸ'pAR-´£qþ5ï\ oÚJfM[^³kÝfNþ:D¾ZCeºm›`¼õ.L:¥4¬#`GLcÓf§Ö `â"æ¼ÞþЂ»µ~нýñsÃOîq ‰üä3aâÍ\3Z€]ðÊ_už­ÑÿuAYå endstream endobj 981 0 obj << /Length 2635 /Filter /FlateDecode >> stream xÚµYmsã¶þ~¿ÂßJµCð]I›™‹íÞ8sq:wî4‰ã´Kl$R%HŸ<þ÷<» P”D÷|éx<ËÅb±ûìRgþÔÙ,8ˢȟÅùÙ|ó&`j³<“·wo”囂q:àüîöÍWM’3ø³`¦În‡¢ngwÞŪضº™L£(ò²¯'Ó8N¼wï¿J»ÒÒy§ëÍ$̼§RÊE½ÙÕBï‹jÙK0«8M3O…ñäþöû7W·½rI¾rÄù™m¨8óÓ³4}Ų“[V5½›Ëi±ÓFó^KT¿*^v›.Öké´«ÒøØ}{×­Ìv2ÅŽõ¼¤ú/¬¨b£›ân•ugÄŠlôfJ›Çf¦*òU"ú=@Zî鯬Êí98d‰b™×N”'êgžÑ­têGio¦f[Ìí¬ÛYæ}Z•ó $®dø`•Å xõ†¹S{|˜¦—Òêy?Kûó¹ð“BCÍ•¨þ f3ÅkÃFI’{oE "6Z:l®¼7×B¨ä4ÏÒ‡6e#ݲZ”smhÙ<ð8Ó58Z†7Ò<Öö³¢²ôé¢ÜèÊ”uU¬Ç4f‹ÑyÆpÔþp ÞÅû¿¼½úpóö‡+!”ƶ›íºœ—íúYÆóF-ï‚&¥­êV:ÛF?•ug÷oUMgñ©ò{m?]®Ié`†oÊj^n×|$Ù ™ i6_mLù ,31X7ÅÖVvfUoꥮ4TüÜ ¨tEªXéâD¹¸-±U0æ¦XË0ñS+¦tRÂ4fE¨5ìYÔ«¡JC݈ÎRᄀ¯2#aøDŸ×Ýz!Cëý2X@IGõÙ ß\WÞsY-e.†—w°?lðá!Š2?R쌷ô«hp$Šý(ßù˜,r8?Êýëç—%˜¢^"ô©B6ËÏ/¯”eÑ"ð–åfDpÁAâ>øÇ+‹Aïƒe[>M伈ü4I€ ëŽ# h»§ <×n›ú¡xàhÀˆÂ„kª²ÜÏ¡Ðí:£;8`œ¢VÑáÈ õ4M¦G9‡(‹ZÜÈÈ׎Ô1ÝVœ§nZ7UM¯ºùº\h "-!N·Mé¾fg"©põÓ0X•˕ˋ=ؘƒðì†n'yäA³8Œ= Æ‚z Eö€KÄ}Â^‹"Ï ¤r2ʨ§ä¹ŸÄ½#ÿ$ž¯jQ‹Fûd‡Ìuñö‡ëKPý» •Ÿ«Ì‰Ãqf*—Ì)Ê·]#Æ@~ ÑMz?åøð¡£2µMS8¸Ç¡m,  B/‘Ϫ‹uaZ‘ÉM$³ð ~àËf2l&òì†3¡`†~Y¨ÍüÐÏS¤¨4¤Ü¡¼K˜y:¯×ãqHç8óÓ<Ú[öv©qÈ c†”¥‡^}ÿ›e,ƒþetw}y¿§ï”ôw!¤#‰Âü!ò7!51cwÇnjOÔä^#£¥4Ò–ì€%°DI6¶ÌÌÛ/â4&í^d?Ñ*{µVù ‡Ÿ¦êЂûíúðV«g”E§z¹é{*¦"ljÞÇÃJĵšë±«æ6î"m¶HûœæÁÂù<šá¨¯®0sÃõ¦,*¯¡¢{;–•ÚŠ,“oBo¡QulÊ pD ·,;¶é A.ÇPjôÃG¦ȵ½êyk™ #̈©?dXV2MàúÚÈ»´/ý«ý‰™”°‰å¸žrV#°’À§{ÂB“+2‘]2§©BHO†÷–¡cr´²–ëKFض/y§Y”Š.!šgTm9Ub¿#M‚äÔO’4ƒÞÛ…ÇKX§[D&Žnô¿:]qa "›-0.q‡!)üDJ|Åæ¡a#3KiDXaÝ”¶CÇžtÃþżN‰ŒŽHysw8âq†‰Kax¢©ˆÑù4=•UEÙ)ŽʽœûݼÊ“4‘æo“<öü»Ý½ ùðЮá™EC)›.=¶ÜÓ-ÖRüò•´RÛs[p‰ÊÄZÚe_0Ш†MæÇ5Y;ÍáÒr*A[oÊ “ñ2ª&Å44ÃUZ+c<ô¬¡„˜nÃ'b%mW•$Ÿ4ÆJzgcÍÅ™=¶I‘ØÆvà²â~ÇTÉñ5ÈK!“ë’óœ²î†Öt{˜Iú03ßе@4¡ÔbOÓ¢¦cîÒ¸õ¡Š`ØÀÇTb/\§Î Qå#F5µ”CÚ_bë9¨ËFk[39· µ6µy.¹™DðMN‚ì‹¢.@,Ö5ÕñÄÍéi;v&€šk=fa6û%ì°¨øòÁá›h%á¢7[§! ÉÒ‚±`db!ÉÓ<(’æûIWAÙ喝l´1ÇÇü¨É¥ñ 5w»’ÌRq2É3(ú6Û4K8§Ø”¤Kj¦¾Š“¡eF„µ«¢r_Wž/Ëš ;‹Ùt¼pè+ñ#žH`~mYzüç‘O> vŠÈ„®“ˆøÚb¹d¤ Y¼y¦®ôK×Àv¿i½g‡%Vâ«\õ—Ÿ­«¢)³©àlQÎ?t­6¶0fC©<]¹Éïà@šéN«‘M|f¼ÆT¸«ePã´ÌÌŽËÌõèvýúRsÇì¬Äß}Ï>å4û¹Û}  °U²í!ýù¾tþsÿRÑZ«^Ôœ͵y …uŒW2„ŠUˆbxøÍ¼kšþÍaü+B;÷ÍH 9¯r‰òX„\NV¢íY†R.¡s¸OÕÒüS×—çÒa Ž­»ä2ž ¾5dS…;°òdÅ”ÞâZŽš/Û±`êB'@°!kÔì•iâB@2d52¹*Èný];Mz'ÿá#OšŒd¬1kòr‘}— ì…K°–»‘u¶–ký·ÅÇ:Qqкx;’ 1_t5Ë_Œ™éR·_7ü +Ñ=$Nqçz}(|pè§ö¹”:\î3eàÇ©díÆa¼ÐüÐýˆPVGÌkûNÑ—º J©KýÌ>h9™Ý¥(‰Š…~,ºõ¨ÅrCÞ¿ òyâ’gÄq2| è3ž²™Ò:À( gÊG­îDüyÔæ~ö‹>.NË »šîÝÚŒn(ƒšýkÙ·ckÀC‚^‹?ŠÎü*3@‰„ âÑ÷½ òãÙ‘_ü/[±§ô¹ý(¬“î'¿}i¥|ðL“Da)Q)á)¤D'²Ï{àBŠ¼Ð…‰ßÄOîc£ÁÿX)*÷œGO¹ÿ/tQt™½Œ.æ¿£K<‚.ơ˗ff¬l_–œE‡š*«„3äCê3 %i<$¢ 1ye€Dô Ñ‹‰Bfº¶Sýë‚]áÜI*íúÒÆô¼7’eØV/> stream xÚ­koÛ6ð{…¿UÆ*M|H”ú­K² C–]€mhû‘i[«®$/ÍÖý÷ÝñHYö´4†áñxä½2[ÄðÇy¼PBD¹ÌEý,¶Øn³ àíå3æèB '”ßÝ<ûöû$Y°8Êãœ-nÖÓ§nV‹wÁÙVïÓ-C!D ^.C)“àòìê%a†­!àÒ´õ’«à÷ÒÜ欭kݬhs¥›Í^o€˜É4UãÉòÃÍÏ.nFáΩR~E &U”.ÒLFLHÒÄ|Úë ä“`hi}'ñ5Ê×Óéõ$²³¿qG ’Hqå)<Ä¢e˜¦qpÝÆqÙê ]9Æ…®M§{Ú”;ž…Eµï­Á·ÕKž¿ã¿ñQôºczôuˆB.”E™P‹‰ˆ%$Ü9x aÁÐé¦_·] rÊhØÜé6¦5ákêG+Ó?©°ãFP`'Àæü„N@Ýü­àìÕo_ý‡F ³©Ã|²ÁÞó@˜Œ‚Ç””€š&^Æ<Î pîª:‚Óª¦*³/éNøD¹´)ã>TADž*ˆÈÕ´‚ø2$Táø´!l1Ši1´&¬¯#ö WGÀÐóå\ ïeâË99cÖ"‚Oº5±TEqªN‚ŸÊº próʬõ¾|`"ÁêX¾‘j‘ü$"Á ¬Éó@Hò“4Í8É¿+WOŸ†v‡&†J`û³µ£!ToCjðçÏ{‚¦c[N#·E“Ãaú]ÁXàa|ƒå›*:àóÑ|öE·öî!ÝmÌà(_U}k*Ì<ë™êJ£å†+½‚{M ùgOè1ŒéîMV¹YöcØ™ÂÉŠæÃóŸ±×â<å_w©#£†ØZÛ9  5d˾)¨.!ÂöŒ<ñòIË{¶³¡Ùdü€@4Ñ!µ¬öŽÈƒ]¥ ãP[ŒÁpßúC;9ã Ãä%|–ÎQ8fáñNw ®©&ì¦<þ˜SD¦GÒCâÖÕ­N ¹ÕKcœ¢¡&ò0É>© ‹ãô'¦Ç×óà ùÿ ÷Bå¶bdn¸Ç=MóˆrmN¹1Ëb TTaë¤È•r¼ö•'IÄ%{ìD«âH‰é>‘ÙMáTyåŠ%ŸŸÌE’Ó _Ç4™#fbPÀÛÉ\¹ña2Câ@Z%\üÛ€°Êž MÂø‘: I[m°¬Äš¦Îô)9ÈjÊ3ñœ?bb)±€qpê8ØZkÀ±±œqàçy$>žç¥póüxQÌó€pÁÂRŸÍ€sáׯþËýwvŽöóýˆ#Oº±pe(¦ÝøÐøÆnìräII*“´óÆì—¶¿<>W;Ó›áñéxñiÊ$8¦¸ê3ªž0L~ùA–»®Ý83ü³ÕÊàÕÕÆåO(Ð\+†sDüñ¬Ìðí‰tLÚy«Š<Ò,›1lB†½¶ú—›GZòH4¢“æ­ö]ÓϽ*YÄøH8̽”G±cF®é¥Û7 •ü¦iÜw -(Ö‹9f,΢<Ô”Õ¬)ãHfù)Cøæ²™Þ¢/ÎTeá¾ÃÖ-É(BS”®ñÂu£a?P¹²%‚)ð„<²û%}P=)#R—öë¦ücdñ˜<8ºC?ÑB†¯Ï)*ÿ4ºØ~iÚÆ|^þå£Á$Ûýõ„™Ð '­y†%šeßO[¹D1€JùŸ€ÿÇpƆ endstream endobj 998 0 obj << /Length 1963 /Filter /FlateDecode >> stream xÚµYëoÛ6ÿÞ¿Âß&c'>ôêÐ/ëÒ C‡mPlX7@‘[‹,y’œ8ýëwÇ£^Žgë† !u:ñŽÇß½¾ðà‡/boJÉb-Òí ÏP«õ‚&.^pËç£;àüáêÅwo|Á={1_\Ý —ºZ-~s^o’]£«¥+¥t—KW)ß¹xýö%Qš¦É….·K:w™¾'Êër»MŠ=¼MŠõ>Y3WA:\Ë߯~zq~Õ)ç ñÌ] çãmÃmp²`DŠq©h'EYh”y¼c9=â©÷»]¥ëZפv’ç8QðqµMòìKÒdeÁì2#‰®YÇå‹cI«é$Ýœ’Ø.Œ•PdPœ”×Kל?uÚ|cß,\î‹UV¬{Rä”Køs° ”4~ö¸jhšø¾}ÑIØ™e¨w]é3Ôôr¹dÜ'õî³f#{Òa褺Àƒ&PÀsyC YSÁêÔª‰ï¬æøÝ˜š*)êEÁzj6IcyËœ—Æœ0[eɺ,’ü ÄzžSÿU5Ÿ=ßÃßÃ69¸‡mVÀŸ€ˆ ãî`ÿ˜±ßN­áJΙʱ)PÅTñá Á8øÎ×i3œ<¥aÌd [Tì *öå)Å<&=õÃ…ÎÈG³š\TL»¥ðbC y&úõ Ç„0 ·ˆ¬ë|sbeÛôã–}Î×…ÀiË…*GÜчTïĹpî7àOf–ØÑx¾o<Ÿf‡0¦¨Î"©õ+nŒ«Ù½$ðK!´Ñ_ÜP0Dc¨¬!Të¦zÖ8 Åcßú’¦¥Þ 3 „k$<³Qhúaü…žvU¹®’-ž hHŽ~[œM;‹dQ£9ë¹-ßhM¶Þ˜ˆ–ƒ:ÂëjœÛŒ„Ä£04 Ùx”¤BšÛ/åø€†Õwø=äÍ)² •ê‰èIé/R£(/#°_š–ê;ˆ¤E‚˜,דA! µÆš¯à èT^A‰Í’;&´ÂYb&x£B´&zIÈ|/ün ™(©²„"¿MŽæÛ¾PGÀÅôIéÿhÿøb¼ÿç&Ô[­w§ü6× ”ù(°i&龪4eD"Œr;’lvº:qì‹‘7 ‰|­]x"7 ò7@ÌÖ/Qƒw(/v.í›m‚f} ë‡ô°¯õÍ>§9fH“ݬ6…H@^p2 ùLFQËUV“+AÔèWšÁYðc¼‘ ”„ ®02 iïÊ€6dFƒ˜ WuCÖÝj‚j`ë Ž‚!2Œà7p]u<™}•ÙE±\ª{ ¥ÕJ ¶~0h/§,r…]˜ŸÃé8XÔ‡À"!§Â‹._Á¹B²0 ˆ5dðeˆ€`éfJ?…ÚÁïÓ.rÏyÿazûÎpëçäíùгÉÄç{LÅ]‚kŸÞë÷€x8›ìfn‹zHÎ.2%UŸž›}U os!¡8F™Â¬.b°d³¹ðzSk(Š]%§‚ði¢I³‡Y'Ö2 ³;ó8 úšðÉ­Éã­MÅD© R’ñاfvÄCÆ#1,= ´ød=ã ¢G3W‚EO£—#à ðFÞéx3ݲê¡Ë)‰àTü§0q<<šÉ…EÄ q,b'ÌAYÆÑÉE%X$ða‹€9ûn=~ÄŽ\ñîÈ©Úk¬°Žßœ‹Yü¢‘ä¿ÜÏÿ`Ýjç:W–Çj¨±˜ÑX„ÝÚÝ=Eg+l,ÛYtÁ`ó~À”j#¶?}L ßeéŠáÛ§ ôÐö[{…òî݇?þú‘Ô¸8÷óåöº…†OÖ3èé ï‰øéÒzß\>Ûw®L%,C£9¤Ù[|‚Ê©Üb¤[$`ï€lú Ó½iå µ½(°rর‘”rq„ÆjG×EmÅ˜Òæ‘8o©  rÍJCUm @¬Û*¥©*lUî¡#¤yfùíÒ4N¼­:ã£óVœÝ > stream xÚ­XßoÛ6~Ï_áG¨4Q?­{Y’¶µh C›Z¦m­²dPRwÝÿ¾;ÞQ–%p€!@DžîÈãwïNþÄ$ó'izY4›äÛ ßHõzBƒ7‚õ\Ptš?Ï/~xÇá{™Ÿ‰É|5\j¾œ|v.7r×*=uÃ0tÒ·S7Šbçæò×·$i7Š7ªÞNƒÔ¹/ÔI.ëíVVKšü*«u'× ,¢$I¤Ó»ù/×óÞ¹8Î<j>=F6<†ˆR/™$³ÈaD'y‡ž7F5Ÿ~"WwEŽù: fŽb÷W2Wl~´kì]‘yAÒ*ÎÝF¶EN[6ž 7Žœ.¶E[Ü©}öéYkRÙÖZÝéÜ·gzWTKõHë׫çÝ#¿tKºhƺ½Û©s.p×çúVM{ìx[äªa\VôRUËÝÔjð Ül›Î¼t8Öj¹Vox]V•dæAÞýÏ [ò‚ö—³’%hЍ`¼ìJHrYÑà‹/¢©pÌ}„iݵ4 ÂÈÎ{ÌLQ€øl“=µZC0”.ª5 „ÃP+­^°¨¬'eÙ˜c@¡'bAGú\ÉÑ=ÀÃ^}5H¼8êa½/ä!+¬&^’ôÚEÅnެe^GV3§LæQD{Y–Á ñÈDFå¶:ɇ¿_¹˜ ˜Ž_ÁMiIÐkæµ[ëeQÉÖ2Xj~%ó¶ØödK"¡gB{”Žçµ·»hw c8'›d‚’>7À EãðŠž'»Ð0Ô°ö€)0Óª”ƒè˜(  PrƒÈóSŽUêžð¡RÅ å”P8_]`<X”£7\ |/õy•/~ìãÕCkD%p¯šïU}ïų¹öèŸT©r¢rŠÄH±|fIÏ~×lê®\Ò«…¡‡¢I£ªfX‰A—ž8õÏéümw€àoꆕäŽ8«$;çŶ’2|3BspmÛWSÓQÁ m°@ •êG* Kµ’]Ù’êž–ã„ð'qäUmSʺÛÚ<þ†ЪítÅ9ÇÜzOo›V¶]3rÂ×Ä;Æ[Ç{š`}yU¤eã›ë÷¿¹·WäÌ?ðÏ8Ç[Út‰A¼#ŸÚ&VuKƒ›k@Õîó¢ág•—]g03e,²Ù œ‰èÉk¯HÉ‚R«pˆ Ðn$ïš3Í@hi6š·1D}ªë-·Œ6kc‹xÈæšjÕKq;º§Ç –€Öi^W/-ͪSïµÀK`£V#ê·WçMµGU4:$Èak/íöM4#…¢URq3B)> "ƒ> À"sre6¶Y)̘œu6õx$ÂÚ ÿÙJŸXÕ½fÉœ/Íx«Ò—7€£/oOÃI6$Ö²Tå16_–0D‘SãÕ0k6ù™[j‘xS¢1¦Î0{À,(õòÜüw°~@«×3'dà_Q?Ö­; âS ¨©ññµB µR0RÇX¯¬*+ôÔ0{R4}dC}bhÙƒBZ5~Ò Ûš3—zÚÄâ@›8 ÚÄ6o£ ‡¤eaz2WôlÁY«Ê)þ¨ìƒø›+ sbîŠcÛ̓{0m¾}pÑ ÞH¥áb4ø.^ÍÁèN¯æAdÀ}]éŽ™ÆØªâ‡„j¾þ`¨LÓÖ6ç²X×l ìlÎÎ_ÐgÙ O_Kpvm*+LcLEf&áÓ@ƒ£ïT•ÌŒM) eιêø[ÕÌ|P`/ÔÑmM_?Ýa¤,;È'”³g)yÔIÅ-Én“ëb×bÊfÎí)qž˜ÕÎ|”#¡[­ä–ÆÉŒå¶Áø ò^Ù€ï›R©‰ýÏøƒÛî.{ endstream endobj 1022 0 obj << /Length 2088 /Filter /FlateDecode >> stream xÚkÛ6ì{E°O Pk–-¿Š}¹u·Ã†¾vÍ€í}p%ñêØ9Û¹zýï#Eɱ7I‡‘DQ$Å—H‹‰ ?1IÜIäû<‘ñd¾yæjhµšÐäúê™0x :Ì_gÏ~þ=&Â剛ˆÉlÙ%5[L>²—ëtÛ¨jêø¾Ï¢SGÊ€]½|õ‚ ÍZÑäJ•›©±»LÝäe¹Ù¤Å‚¯ÒbµKW€,dFLxñôföç³ËY+\àygÞ1O\CȈ‡“0–\ø’nR(ª³r‰c¤eàhØ=¸Ü<à¤O}r·Î•Ú:œsXs¤Ç- ¹DÌ‘9]¼~l„VQ±g¨%˜—ÅÔ‹YS•9*µI³¢¦ÅgÜ{Á}'/§ì•[bâòÈ‹aâsóQÎrÄtéC®¾ëûÙÅìòõå›™Q A!yÐäæ{9$À„Õdu7 B–æ»´Qƒ°Pé=x«8McŸ]àpœ ¦™"^VFY-0uãTgbœTªÙUEM J0^ò2KL‘½ý<…BçÜ.º§ˆÙßµvOÔI/†Œ>D‰cÈVU¹ÛÒ4¥y™ç­;Xçe §üIЦ\)£B§ ÿšgÅÊì­Õ¦Ïå³NÊ!­5j1& ^Í‘’•j ™g5ìÇ݆¬tè3ùÌ-*i—5gºÍ- j€ße·û“=×ÀWLöyÉ¢?ôšøÄ‚à@ó‡3†9ïtŒeŒ›ñŒHê!kFr…ˆ•˜ÇÒï‰$Wì‰ÉðþÅC»Ç]»—:fx¿kxÄÕ÷½üðîúŒœ`¸¶ÑëGÂ0©uí…α2ÏæöXžÕ[BPÛJÕ5ÚØ$½÷' ¹tÛ’%“Ƹé>kÖ%š¼Mi©G°ñÏÈA³7p[4t,ØZ×÷Žy€…à8[ïŽÊTx"Àú)m¾S§þ­<·í÷¥†'^¶wÛ¦U ÙtD PNº2>©Éã°­ôt‘ Ë–flh¬A59èaAË}R‚E7­/0‹&bì‘—AÀ£?øáˆ5ÇÎù‘0Ä+‹N.²FˆzOÔG{ cÙ ãè y.}¸šŸ@4'ÂØb;ô±œ3 z$Œ!ÅEÆ^7Œ ã*ú‚ÝãÜ ÿ üoÎŒê*½WwªhH ¡•r—æy á‘ÀÍùQI…+¾åpOŠ{éÇ Ã=kž}r…„—NCáîia‚©@PC Œ¨•bˆ±¶G@ÐíNíð¥B—Í/aiµÚm ZMx‹¬¯ÉÇ^Ú½ŒK¼¸ŒMÚïÚÀëíÅ6<*Lº è¢í¯ ÓÖT»9dBE¨»Z™Pˬ¦Š4Ï ¿¶Ÿ‚ý•nScݦêàËeuOðþ3k:\ÉrÊ\Z–º10#›1ð@ÙZC)‘Ûþ¹m‡‰¸dEiЬÜÅB-öϸÆY©BUÖ…à¦' “®g ·çÙ[x`ür¾CÉ/¦Ÿ¿xýÇo$Ò‚üs¾¿«¨uÃ+„ ­Ðå (À¿Ðjhjeótj ¹É4ÝGlŽ1Àà\iâE><'Y5`•Y.=Ö+m--ÚvÄ¥ç¦ ¯YŹiÕ´#iýôJ4ßzŽƒ¦`=Ù¶zY7¬ç‘v ¸>Û÷ p¸rõó£[½aœC¥‹s=Q5³¯Jª©ŸÈ2Oév«Ò*-æê)ÛÀ;ðT4°ªAÖÍÓ~fªëoczýzuùöõåìúâ`¬}y}Ñ…é~êÛùÞwMR»‘‰@˜´‰ £fð­¥µ¶XÐuDØŒ{Ò§ÁÓ­9Nëþל4+¨3ÙÓŠúΆYsѶ-d?G-Ò&EÊ~ˆ]Õr—$¥Öð …ßðC½|FS²! ×Ö̦doß^½"`¥–ªR`"ZBï =,}0e¸â+>æ À HÈc!öÎ`=<VpgÍ jö•†?Þ@j6­ÐÎ °_®Ki¹»±¬0â¬5ó@{oÔô²j™ág¿–$Ò±è{È__ü6æ’‚Îºí ©›¥…î75tH¾ÜuE N‡÷£(rä¢3~Ù<.³\}7LœŽQméwP†Š2Ô–IÀÝøÇG{ÜÙŸûþÕg2(C¡€þ—'8…®ñÚºp­‹Nè.LÑ xÐZ[G_ðTÜ‘ÿHçhK; i?ÖîèÇ:?H cÿWöø ‘úL¨ûn«Á5v&”?é0éèp¤ÿDÌ“è<Üãòö îKö v“Üú0ê–!O9‰Á/üÿá•tÚi:e—Åø§ŒÐ~û\·/t®5öQ#9p xŽñäþ GÓà¸Op¯Tdú0ã:Í endstream endobj 933 0 obj << /Type /ObjStm /N 100 /First 908 /Length 1804 /Filter /FlateDecode >> stream xÚÅYMo7½Ï¯àq÷ ‹õA0$kh/À°}ØÝÀ‡±ÔŽË3Zi8ùõûªg”È=½êñ´½,³Ä~Íb×Ç«"Õr )´LHBãr®ø]KÆhK …kòùD12i>æ ìóK]4IÁÌ0¯¡&Å93Æ( A¨P¤˜Åê” Tâ„5D à¿& ¡J¨%’,‹Æ ‚ᑬêoakXP𨦆Gû¾›RÈÉ7¯2a7jrN>cð¨ÿÉ5/ÌœýfØ\hxŒÅš–Õ° aAk.SðéÍ‚rM.@W°`­eÑ`¦ìökø N®/01¬a5p†žV`^.˜ÁYªƒ9°b?Ì.¸©‹@€­¶fc¹À9¯TøŽ AiÁÊE]®4ßF \aõVq«·šƒ$×^ž7˜XÈ-_‚`eìnv¥ðsÎþ:Ï oµÁ]£‹0¼ƒì®5¬¬ˆž WŠªÏ¸Ð\Æ„ùÄ\K⡆]Ju³4èªX™R‚ކe!y|9&ÕÔà ‚öÏ ‘‡OÂÞ5KZ@jŠ%D$ùjD`eHˆNÁââ|M•Ú¯¢!…ÀJÈ5ò§øbõÍa8„°ë`É£5‘óÀ‚dÁàwÇ•`Üú@RêµUd÷o´`Eûõ8X- l-ùF´†8^<{¶X¾þõ¦ Ëï×ëÍv±|uÿvÛÿþ«õ‡Åò‡Ííew~òŒMoË—ÝÅ6ü„üŒ’<>Z4„a=š¢æûðìYX¾ Ë¿o^oÂòyøËûîúæ¯á»ïøwšF‘a‡l ¾w…¹häÚFÞݬ.ºy|Y):­ *ñ™ž‘9V‘ã4>Ç0| /ÃòŸÿúwÀzɳ¾¿¾~óƈ#!<¦pøòhà…IÁbÈé)b: (a GÊ1‰}Ž;߬·½EÎÁu‡?wâÛ¿{ú(Ó`‰ÜËxyùâvsñªƒ¹ÃòÅóó°|Ý}Ú†7Ÿ{íÅêçn±üttëíò“üu÷ÓÝæþö¢ÃȺŸú±»¼Zý°ù´s¦! KËð׋Õ-ÞÅ«¶Ãõp­î^ß‹WÝXöãî3Þœ@Y%fð/H?&ð5256$yæ•Ñ(º¹ºø0/l™5ö”c9Û¢“]mg6ôøP¿èT8z§¼?ŠBWøËj¾g…€üj7õ—ð‚â.ž‘B2”Èÿ2 2ƒYQù Òí'ÎQãf}Ù½ëžÈä™×=Úb5zP½¿L{JóûËîÝÕºû:×iûk&F/á1üÄ5Ô^wÛá}Bÿçµéò2™Îu¨°Ž¤GU㿵êOs endstream endobj 1037 0 obj << /Length 2193 /Filter /FlateDecode >> stream xÚYmoã8þ>¿"ßÎ9¬u–%¿í˳vÃÜì àîÐí'Vï%v ;Ó¸¤(ù%uf2ÛµLQù")—Ïøå³,˜%B°L¦³õáM`¨z;£Áýû7ÜòùÀè8]¾ùÛ]ÍxÀ² ã³åf(jY̼›]~l•žûB/ùqîKyïo>üH”v§hð^Õ‡y˜x_JõD”›úpÈ«‚^>äÕö”o™Ë8N<fóÇå?ÞÜ.;å¢0¼Ò ä|eFf€ÖŒ8•Œ If$,dœ‡s?ŠCO«|ï—*æÇCóŸ0` Áe¿Qซw@âvå¸(añÌxDkïU{ÒUëÂÈËñ!½¦Õeµ%Ò:¯êª\çûý M–…ªæaêµåæ¥ã"€a°-çÜû‚—á_¼û¦j=eJ˜pÆ•€Ô©Êý”Ú`mpZ¦r3ÚUzõ !óþPë–E=÷AGÕ 0+ã,Ík8·[ÕÈO=—MË f„ônŸóÃq¯ !dÍnÀ6F­ ƒs7]¨½jÕx¶ç Ùf…”³$uöáÒIbòx„ˆ-‡f44^Z²\ ˲xl¹VGO­ ’ôTZך†F<>[zvViÑ£÷èÜÀ\“ÿÒ{Ä€Ðæz«Ú-B‹J¼fú×<ê}ZŒ¢Yâ zpâx›žï+à2c<í"¬—0凨 G~Ö°{ÙØÝÊß.”¶Ç…ˆ "II—“À^aìe´×8Eøa GöõÃA²& áE¡ó¹àÞÓÕ¹¸ü÷öŸþUéÂÆÎç6G}cZÍ[7R4°‰FeEOÚ€ÆÍ®>í ¯(œè…L€÷'»ª®F‚¥WA^Á¼ì=à%Ú1o:Mt}Úî&"¥ƒùù=FrâÕGz­õY‘¨Ô³s¥qÝüCÑ¿ÎÛÒ¨lõf20ÕÈ.8 ÐSG9†ÐÏ'!Q:åyé<¿móÕ^]íwb¿ÞÛà0ã•æ,fA$ýb‘ëu83$ýÅPÿÈé¿Ë›¯˜~B¯8í•ÌÛÝÕö¸åÝÊëM»W«S¹/LÂŒ­e0ÈÇ}Ù¹¸„‰= ±Wå{œH¼…nír|â­´Ì4#°|…¯/4†4WPÉN¨¨De&Í`œÁÙñÿ:™í¸Üã¡ ³Ôœ+|šõ8(J u¯Ö¥ã¨ GB6!Áà t(™b'¼Oº<ä*.G ­p0©UØíq+HÖO‰ã€l¦´Á)§Fý4RÚœWÎô,ÂÚ¥PhV5ØKŠ…kê`‰˜EýÁ2n±Ž/Ô¦¬ld2Æ.Åç1t‰“°¦ÎϪSŸÚZû²!mAj "ÁÂä,‚ÎK¢ÞW"“”Å2רá•'ˆüTš`Î>+f˜¨L_å]×Иê]€¿N$»GäÙzcâaÂ-& F™å‡ Yü£4ì…Üû¬ÔyçÊ€…’ÏD’²Pd¦ûeÌ1LdŒ‡¦ S†ý°[ïL´öçÛPÕ§ c ‘:D!Ôƒ AáÞ#¶)q ebkMå<9·J† .‘#«.÷ôŽû6œ µIþ²2ŠXÿydÝúoiu¶Íd×9¦,@¡ƒDô0Š_{‚•ÁŽžÅFpÒ^EO"L1qÄ‚ô[8;nÀ>+gB¿RLy*.ÓØ£ã>_+OµII­6‰ñÚZ4XÝUÆ÷·¿Ùîªç§·÷Kÿó§Û›ÅÝâæírÒûHSÈw»¼ÿÏw\ÛÌv´KNB޹n»ÖdØÒHo¬ÕƵÜ~º¿½[üû;ºRÕ¢V àRJC^§W« Õ!$´5=Í®«uèDBõì½èx:­Yk¥¬¬§²*(SR¹GZm׿ôX.îî&ê7à}ÀN9æjô_q[) +p¨,«‰oÈÕµ ªŽ”5”ÐVŸÖV`†X^t»áD·#7¾à˜!zG ôù#ü°æ´áèY Óî;V?N#ºø1eß6¶±à‡§ 'É¥·D$‡Þ<™o0+ÃŒè#Ú‹ e”íC "b~B&õ…ŠÔ ¥(«ÒÈ–5õE©ÁkÂt!Kg†cSåGèsÛ)£¸–÷÷rsßEÑZ5p!^ik"¡Í4zÚöS a<níNÂÔ3f€^wÇlH6Z§ lߘ¢Í]ÓA½ ~K¢QæAúêûLêú˜jòƒ"ÄJ|&:ÝòSÙû.umжÍ™¨ûůD!ňØÇJdJ:j›ÄX±ê©Ji²›4·N¤ã•XçÍ={î')nÁ1ãÔFôÙÐæ§}Kk‡§ ßËé¯1ÐjY÷MêÒg(ò"ŠGÁ2ÛÉm Å~Ö—óBãUtpÀ bëVÑݶq4ì;‰òÇ©éæAÇÄ„TãC~Àã”A¤–k”³#^s*­ ÓûV´Æõ¤¯›6Ù²ÏÔW‘´/"gçïš Ò-| âñ°)÷ SâãõÅÃ|€Ñ¥ùz”ÆPB°øãÅÄU‘B%è·L©V”vÆ{l]ì¾l%T…áÙé—&’R˜Á˜w÷ó¤ÞpwIûÛºíœÌqƒãýû%iÉ0™‘·°úVµí%$È•¯¯¢fc¸ü…^CS­ñJU`+^3q}ˆ$ D4Ëð£†üþÛƒ]î÷ë§Âñ&ãõíZ|yô0Ø"> stream xÚ­X[oܶ~ϯطjÑJEêÖÀMKQÇE²@O’æ–h¯b]¢6¶óë;Ã!%íZNmàÀ€— ‡3Ùo†d«þØ*W)çA.²UÑ< µ¿ZÑàÝ«gÌòùÀèÏ8Ý<ûùe¯XäaÎV›Ë¹¨M¹ú佨ÊÝ úµÏ9÷Ò_Ö¾±÷êÅ¿eØ*¼R]³ŽRïk¥nˆò¢kÙ–4ùC¶W{yÌL$Iê1®?o~vº•‹£è‘V ç=3R0ƒ!ØaÍH20.ÈŒ4ˆÆòµ'‘§ Y+ÜŒOæÆƒw"„œÓ¢¿Ã8$^2ñôüÌóN„÷òäÅæü}øD“4£ÉÇϰšÙM<§A²òAW3Úç½Û#q{ü„³ÔfÞ¾ª]}WµWÄR šºú¦ˆïùîˆúrÍóN‚zDÝl-ë¥,†®w¶Ý¾.i|±öa‰Ucg&öÑtË\Ýj¨¾®‰WÄ™×%ªVF¯a׌¥Þ›KdIuZgÜû@_L€Üc(ñÎ×Ì{‡ƒ–³W4ØõJ«cm8’Ñv­ÿMõxOd¹‰Í¹ú¤}wAà}ñ^RxnEŸä)GIãѯù} ±jé÷·dÑwÑÓªfVr2‰hÙD|—/œÊ7ðyÂãsž3¯kë;¡”¥¤£æ¡5—Þ̼5 c›Ò(={_¹ˆk&…3uÃ%1klH.ñ£Ñ0F£2%ÏL^˜°,³öà¨W²vãF^›PÔ4S´¢!î‹¿§û¢®J%ÍŽÏ|‡/ )»ÕY·×Ê/{Ùv­¶ Ü"c•à^ÞBp€*;Y˜ˆÒ47Þ–¶hZw(ýÆlQ>GjfÝ-*Îb„N˜4ÒL¦,…I¥õÞœîv¬G…ó·@oñ¢u?Ð`Ä$Ž;ÀœbÉ7Õ°¥Q!÷CÕµÜ@ÓvIeeNjÓ÷ì…A)iIþrOÝj9"ì6w(²s5ÅÖáÕUcAì¿<úhŽ% >¬>!q$‚”G³2…®L¨ö»eBÌËòRÝ;™ªÄ'ÄóÓÍ»©$íÌF4 ˜„q¢Ç ò5Må0•%ØÂá PªVJ–$Á9ı{ßb°§×Oô³þQƒ_ Rx ÿ®ë,ZXXC6oÎN_,OÊ/{§¥6ypPXçè»k¤åÞe×;®Êò‰…=’4–¥£5=úôÈçzD ÏXc”@•—ÔåQ³‘ mż4›©W; AjÚÏÇ™‚‘“8`avM×XÆLI]%3¤ªA öªPÈJÀ·8Þ{¥Žû-γ@DñJD (™ž+ˆáü 6_‡”yæÖû3 åñ6Ôñ@M±’PPqF6|ÒµR;OÖVõgl…2¨ú¦yDÆ£{­#Ë‚<=°ä;Ý#1ÿ‹ÚG"ÖOYÀÓ£î¾YK!d ºižì_·ÞŸ XPôx›#ÿb×þb H”()&Jê]ï‹õ.Œ÷…A@¦É!»×qÿ‹ÚÇB'߃¡(²ï#Q4C¢®½Äê IÏ øÔ~¯þ™x<‚[]O‹/«ÐÏþg÷Ööûï_ŸÿuúÛ«Ó÷ŸŸÒå+S£2ÁYnïe£àze?Ä:àpF4cÇ‹TY_u=䆸m•Î8uÀPö¦úÞÐ¥aü0 ¦ú } ™·b'p[™»!\ ]hÚ2 ™Æ©„“»réËØñ|·/­Y!u™moá×ùÏà`{oûáëZ[Yïíº±ÊÂY4M†©qSÆ•Ìóqü€=Ç®vô1Ø£.%ÜÞ5‚‰Ÿ/ÙRªª¦#Ëc{σ¨š8UazSÕ5\WÃZiË}1¡ØàF¹÷Ö µ\¶ÉÝᘜ!,\çèœëB Á+j4™lº)nÁ˜çó[Å¡SìØs<Ðñ¿>Ç)¹~¢o7ÛÊTõ--™NŠ'µá\äAg®·ÝR’%`‰åä[äóDIÊëzè%iÀ²È ´àZb†7š`äf«l“nz5sJª¯:KQå•ã¬Ú£žm:\Ì—±#Àö®·,.õ‰=€©)@)(º©|‚TÕPsWîkåï$\¥°vZfÃ/žl^3²-¢#í-Âè“¡n•ãeU+Ùa‚÷ZÚXTa€×‹¾•518t%µ½:oœ°?×™€{,àåæuE‹Ç°Ë)ìROMµ€âzé­¡c¾‚–lÈ6÷T úš³“¦Ä ´¤(~UÒY‚³†:[TÔ2²~úÁJV·ªØò¢¶,/nüÀu[0W³'<験(àÜ÷*H£1çfÚ¡ƒ%†G‘ÿ]™YO5Yƒú.¤„ áÜ¥Ú3ýbà©Æôã‘û¥ë È`’@&DôÃñ.9õê$»¡b ~Ë‚ˆ…c3–еßž¤Åý™ È 3jÔsÓ½£^ÕŠ¨š]]Õ`^opoY×z2¤W[©·”š(¢9ã«Æ°uit‹æ†“ „\ì+ŒdœÐý)žÜá®’šFürÑÓ[…F BÂeß5Ä ‰eÞÎpÜâk/~¦|ÃdÿA Æ pâÆí w.k ü+ÌBd6™±øJ邈 "=<1´µÉ?.O”äŽÃx= ¹«eaZ¦HLOv‘+R0P·•¨ Ú†XêëŽH*0BÌÌoÒ™¬C FÅøüMy2\žáÝïl¥Ê endstream endobj 1060 0 obj << /Length 2574 /Filter /FlateDecode >> stream xÚYYsÛÈ~÷¯`¶Rµ`bŒ1.ïÓ®c{²½)[[å”× 9¤ ‡då×§{ºq†,*å’Ñs÷ô|}R®ø'Wi°Šµ©IVÛã“ÀõÖ‡^?‘<χ‰þdæ/Ož½ Õ D¤ru±Ÿnu±[}ö^\fW­­×¾ÖÚ‹Ÿ¯}cBïõ‹·Ï©§½´D¼¶Õq­bï&··Ôó¢:³rG·Yyè²L–&ŠbOj¹þrñÏ'//æB¥Î¼ÎüöÑôÒÄ"ZE‰RºÉßñÀo®+›º y¼Æ±WÛ«"ÛÚµ6k•xwDÓm°_ó¦Í˵®²öò)Iâ5O±öÃ8òþ ±­_TÙÎÇ™4»në]^3g'7ÐFÆ=s‹Ü‡"Và ØQâó·Xû°¿-w ®]ùZ&"…ëúR Ò¢‘zNd_›ñY‘aAGÇp´œGÃÝ@À¾’nK·W,”*„kGÊÃ+«6¯Êf›v醀E™Š(Øæ‹ ŸÜ¥–nï8p—‘´ÇGÛ@UDü#A»!zð¼Ò£}±¹Ï¶mUóüоŸèƒ¼ìì>늖æÞ¬ÃÐËŠŽw DˆLÁ ÇJy—¶á-a¾™ˆòN:¡'ÁÀ#Òڀθ/;V]‰ý-µo/ó-6/©¹›>´ëé7£WÄ)€Ö¬Ürk_ƒªò„µô†ÞìÈ$Hcʰ8Fhiok‰g MJ„;7ÖãÌ&ÿ/SÕ~6äŽC‰´÷‘/°Íÿ¤wëD{N¥Ü’;ÞŽA䨕ÚÝnQƒL$t$¿«A©ˆÓAƒ`ŸU%ŒàâÉ© [íŽuÒ4°ø~Œ×ãß<+H®8|{ik&£ŽBSƒßþúQz$lÑ#ÑK'àôFÙcw2)ägüol‰o¦_)™=`OF<=™×ë‹ëFECbƒ6ÿ®ß ßjß•[ÜÞׄ©÷7™ËnaG›5]m›×bziF‘3OŒ[ {ÜâðñäýÇnÛÇÙ¬h°Ym-AÝÏ5W¶¼¡³KæØmkð ç-ØÅ9ždâ^Jr¥uUí ú0@v¨Î³Í²I•\B¨z@—Œ…9*JûYÎèO­­M§k# 'èAeÜeÏH„J“~ÞO€„ `qÁ©9_þ&oòMÁÃl|)‘hu‚䃋4’>Ò0Ú½E†Ûåå%}Ñqá!ܽ­œHÛ,/sÀÎÀò©ô’ÌÁ`0þz¯øéhêwéÒ1 œD±«Õ3Íu® é¹É[檶Yk4tU¹˜®-caÀ³ŸàÄ~­/Á´8¼+g3w]a›Ç=À~}6̯éÐÿ~Gùé_ÎGø/9 ÆH~$š;÷†w‰ªXZ i†ÇÀ£—ž¸4œ"ùä@rÔûmh‚ýX8(ŽD ωW[:IK˜5°#–6Ö£8vRèÐ- $fÝ?~;Äëu—Î;BX:h†ñL5c&T„¬ÏúY£C¯¬wñ®»ªµ;RF-ô9,+ž/ªF¬…Rj‚ù ,~ØWÕŒMV߇‹4q<ð6/ :và꙯ê?™Û·ùŸØaoófÑÖ Hõ)ÖN9ðD¼}¼øýÕ+ÖV¦ïcU*ˆ½U4ã|`V¸(∞k§Äà•nÓ%ûÖý¢0UiG2&3©=!ĽЅ×²:·+vt’í6Ža0P³Æiˆ3Uø•^w‚,×åP;Å€"Hô¢H²&Õd¢q6®¸ÂÍ'Ck14S †ÊQê½ÜÑòö2ãùïåËù4„¹Ç}Gb1²Ô,=#§´CÔ“öN”­ãžek!p±qò°–K5 ¡#b ]RoÛÕõèÞT S¿¹‚ämŒY£nD˜ªYòs'F(3%@©JSçjIþW¥½íLcGíŒû r4[t<ØîàB^I±¸[Å‹² †vŸZ`ÔˆÃFâr,Èli¿BÆÚ44òdx˜rYíéBßÑú3¡‘št p‹”Ye%–*°Møb’bÓ…¢Óñ‚]}VL瓜Ð6Dé8÷PT›~Þœ#Ãå3WSÔkƤ^mY^ öÀè•+UÞ›–Æò†¾ï» ‚Ò«ªizíMÙà>þ†¼342úÌ ïþk…ÞâÛ¸úéRßt›Æ^w=®^0 …ŽÃeWræÓI=8’Üä8ê‘ê¤c–Rµ¥›.©4ðñð}Š”ˆ0Œ§¡n›#¸tÙXOà •$γ’³†#žëë¾¶øg:Hyså»,&tY õ‚bÜäU×@VìÚü0NSÝòjéR*„‰ŒFP™ÔÕø >‚µó✫§ æU)$ÆIê t"„1ˆ7á?°uX©;í™–ìúõþdƒ…êãü®êl¹ˆ—Å6Jˆþ ¦tfi¾áá1Bî×?ÀÕü˜S!£|PÈZýÙé/O©¼0‘¡4sþu!$çɰŸý·óM¡N"A\üÿʰ_ÿW³c–e¥,Cð| TßÖÀ±DŸ)@žü§³-§ÙË,a„`‘öÔ1œ¦Œ §Œ‡ü;c˜N ú!ÿnzÈöæƒm»ºl–65ú¤D±¥©‡@ B%ßĉWCD “+ÎcÛŽ8¡ˆ7ŽÝ%\Ç1#š—öéb”*‘Fc-%/ (hJªæL€S@[ ÇýL§Ö¶È=‡A*홾â‚ÃUÑ{ µ’§ž¢O1ü¦ÍúÒœˆ pV?2ýOù-/mQœ™ÿ»©äž}ùö­ÿâ·wï~~ÿ3 œRµÛÝ—æ5ëC>¦JÐÿûû7Ÿhàäìú±ÈgàÅŸ5—‚ÒˆÙÏN0î„•åm³œì+N³\FþÁCcáþ ”” ‰\,5CʠǬ] ±*GUeÃ÷è‡\Ü“´£½Å&X«¾ ÂÂÕ ïÊÊ-¸;2_Ír%’ýd™þrßoAɬ<1Wpð®‰ósTè€QQX{åï±XUÕg¢ƒ–ô‚½xóîå#~°éšáÇ‹5Ö4@Q2cv?ù9‡¸$ûšp¯ã ä‡í¶‚õ(t%û_$yiVø ur<s™Ø8’¨[Ö ]0‡p,Å•06–¾ûiÙ „" Ê(¸%QA‚7–sÙÎ.ÿJæb˜wUW‡òžâU4¢ƒìIùcKLïl‘q¼šŽ]•ÂYìJ…øIô¡Öè'CŽ©Ax µ·ÿ„A2_èÿçY—9 endstream endobj 1068 0 obj << /Length 2700 /Filter /FlateDecode >> stream xÚ½ÛnÛ8ö½_ìÐm•%C”›f&ûï{%Ë®Ò&Àì"@xÕá¹ßœœÅð—œñ™ä<*D~VnŸÄn·[ŸÑäÛ'‰¿ÂÅpróï×Ož½NÓ³$ŽŠ¸HήWSP×ÕÙÇàåFízÝ-BÎy Ÿ/B!ÒàÍË·Ïi§ßhš¼ÑívÁdðÅèÚyÙn·ª©hñV5ë½ZÃåDd™ Ο®yòêzD.eìTàÍoÈ@b Ã“‘å"J¸ 2dÄ`‘,Â4c­µÞ…ûfÁ“ 75"lȦl>±$J“‚>ÿ=Nãá+üÂÑt}qù ÿýSeg! ”¤ ¸ÚÛÝ"dy OdtZU¦YÓ¢$nYZ­:ছõãöd`{øÀïî‰0%bB3DÔ44·ºvm³H‚Ê"¦Ð/J&D¤‘J‡"aèß’ªFänq‘8‡M^ÊZÝÓdIDÏp:Éâ(|”ŸîCY~ž5°!†«?è,ÌŠž@DW|Á·Ð»8dÝVïðʉ{xù÷8õȦëÕ߉%`ܹ<Ë€-@ÔÎÒ fâáPæ1‰X^<ŠeóÑ7b (ÿ+Q±k3ËÁ8ÿ.˜CüÏ$?6l F`áâêÍM¶Ê´i´½WšEñ`žO˜ØÚ­¶jVïÀF³ì»À ˆHGfŒ±±]îMþ0É ê7´Y›å»«Kx͇Ø‚(1Ç9žEòOŸ*Ck×õ×9`"}FŒ°"Ê^ÌÁ yšƒ1ÇòúßÛw žŒê6 7f^õº¢MŸÝ¸ƒC_a×l]‚{•étÙ×þúªƒPäòrá¸Öæ Ö=DÀY˜¥Qš²#gzcšªÅgo0 ÅÚÄ“ZSÚ–;—R·;_0TtªÈ¯¶G± n·¯;hý7ÿ2ÈNù§’ ¡MŸZSî `š¹4ĸL*åP£笴«:M“›ÎôxF»Ã),xÿþ’ÖýlUOsÇi¬Ib>¯T ¢óGjûw­Vþ@›R™Íh"k}­€~Tæ'µ‚ç­#>9(ÌѪŸZšÛvÕ“ @¼žoX_5•î\+CÌmi¥hØêmÛy€Ë=ˆO®»ñËˈf³œä.‘ädèIæE$Á§J}KIDÄÂ=<.fyœ{‹-â#•ßm]Ž#°RtåÍÛ_iýÞ|ݪÍÖ BÇ"¸ÙŠ ô‰ƒŽjÊû!™ÁëáÁÿ@ ø''Nl¹wè%‡$‡ç,pYüéfÓú«P b¹êæNDpøÅTCÝÓÒ‰ÎÅ䌯»vßTç¸)I‚px³qïÃLÑ0¢ ì¤hñ÷§ñvÙû(ƒ!X$Á¿PTsf§‘x”Ãü‹²VGfµßîŒg Õ#;©ÎÞ;Úˆ7;§AñL µ®¦E§w`?š•+[]À ±&¾Í3ß*s‡ÊCój ]Äå2…ÜM¯Ò u ™•*0ïͶÃ| MšK°@³ÞŒ5ÑÄôpaš²í0]pYR|¯ˆ’”G)ûeóG"Š¡èAҷȯþ¬`¨ŒHÄèpÏŽ"J„p ~ÂÑZíK°@'Ú$‡ú(?í!ð‰`=éSCpÓ]ƒ,Å ‰’ÌʇD1†D_–MP88x[X\,\÷eÕ-Mß)ÌÕniÇš?(ËÁÅŠ.ßS¥Ÿ˜úwËtÉÄXOœÔËÞ×IrökÓx^NvÖäR—V ½›i"çl"SqÅôO=ð‘½`?.ãÅMÌÄXVjþÙ8JÏ>[šæ™Ý̶;xóñiß®¬R^|ÛŒä²8 Âr ¹ÏaÇ9Gß_ÑA¥zE;söuE󑟸ؙ!Z \ó8xç»sBERŒ˜Ssi®C,£XŒ¥„'î`I$þõ·û`A‰DæS‡®$W²×–äæ´å´½Öt8j&M}K³Õ=µ ƒ´Læ+á?ê¢Äc< aϽóh*Â’l–æ}ëI¤aš8ÒVþšóØ8Cõ~+(Æfê~ßæ´¥ª©š¤d®9ª|Ó¡Ïg8#^_J Ÿ¯Ú…gX¹Ò>pŸ:g ßâÇ”E©HÇŽ oÜŽâ¡yÒs…è Y̵]¹o»‚— íF!ƒØy|ñMóõ϶¹kW«»¾]¯kýŸG4VASB2㯉 öÖÿ8ã×±Eí¯cÊ¥ºjRá'›±ç”XM$+‚Rm!‰ýaךOÙ'<ûvëȸåðöŸz_ÖÆ«æns»Óݲ­Mygw@µ%|ßú“.þäe­ÿ]Æ } >*¯8üÄê3Ϻz\ç>õ<€° [üɬñ¡¼pßÜ ²˜ªÐǦ½Û´ù£mzUß}Ñ]o@¨À–»²­[HÔ?ù‹k(À(ѾÙ6h k— zxX0úA÷-о¤ÂõÁÕ`›Ʀ}¾3ÀÞ‡gC@å$I¤µ™ÎÁ‘`Ôó åN5ú|&Kôluü©ŒUËÚ'H'¹„ç•CAÕþwt»«‘i^Ák½êŸuCŠé®Ð&þdú¢¾u®å§Ø{²î :#ò¿þüD¿/á¯íÿŠò endstream endobj 1076 0 obj << /Length 3042 /Filter /FlateDecode >> stream xÚ­ZëoÜÆÿî¿BHІ|î.ŸP@µCEš‰€~°]€ºÛÓÑ&’gIFþøÎ‹¯Ó^¥Eàܾwfv¿J_„ðŸ¾ÈËÔZ•GÙź~Òh{wÁß߿Ҳn W³•¿yõã/q|¡C•‡¹¾¸ÙκÙ\|ÞîŠCïÚË•µ6Hß\®¢(Þ¿ýõ ô;Ç÷®©/M|-Ý=¼mêºØo¸ók±¿;w°XGI’ÚÚËO7ÿxõóÍH\lÌ ¹À•ϰ¡£T%I)m#æäë¥É×ö庨„îP•½0Ò~¼½\Á’¦ï›šDÁl„—•ÿ"#Á#ø}øz•üôè-*ž;´n[>pûCwÜBçÓ9sdºgr½ß@xë1¢$9Fç¢çVQUÜ(Ùï5«ÖU°xÃ3µë:ˆÐ¨[)¨äý]2NtîP´Ó:òÏr¬_¹¢ëÏdaæ#ã>nbMFÕ¹u³ß ÀâCüb0$1Á‚A/†°kŽÕ†‡%°ðjå}˜"_N3lx0Øõ-øMå=ÇDŽ<‹ßÆÍ¸L,òOTfNÔsÛTU3Å< ,Òñ P q®Âx´$V/ ‘²É¸=bœ0xþÇPGm×sG^™;˜áw”ГùéÑI¦t>z–Ao}` TØ’…’,®P ñ†~×:!£& ,Ô* Oí¹-9ÌáûCðGç‡:‡m~:TW«#P×#Níݱ–øÎ#Žà—ŸGÝ@q â´Æ±/²š T‡dÇñZÖK2IGóä±å1\¥­Î+¯»ŽU¾÷9ѳØ$®í›kâ¾®/êÃSN>ò´<¾bèyCzw(!4¯)H‹:âš7âe- “._eæÖH„“k‹¥},Oòt9\¿¡¯¿ð¹Â4]9wX÷}Y-xd¢S WÏ×¼…£xdZžd/ãÁØðFE‘~xÄw^ô””^"/a“H@Vqïü\€çn?uåÖ…ºÎ¶ùÌA0ä»ÿB"› .;0R&2Óq>E%­99Œ°•ŽÓ…©È3…ÿ_{U^Yâ çe™@ȵ³[èåý¢Œç.\ˆØ+¶½ï”¢‘óšÏ}87)RœØÌdçî$5“ËÿÄ“>''d%~ùcøq™Å7µ>d– 2ñKÁظž=Ä-&×ïøÑ!'5ãž ¶- zè<õíÚ<´û“«­U·.*·ù“~>ñA‚åÄd·éˆW7o~z ÆÓ¸:*8ÍÄ)dxð“uÃx‡M"F(M°Á@Þ0ùÐÁSü œ@(v7·(XÊ­ü ]Øñù@ IT:ƒ$&ð(ÞSvBÓ•øM»ä¢ç‘r‚|H»¡{äîáŸÌðÏøº…ˆÆ Ý"œÆö}I‰}ž0›œB^¿û¡;ÙÎÝ›ó<¾…g‹òàú!Ó0`÷Da¶©¾°—P=—0ꀑ٭à ¡˜ªgÅ‚4q‡}k7ø@ÞFqŸ6É“"¤åD<ʧm¤Á>ߊû# I–Û‚[ݯwáDßÜï€+Ùñ jþ¬y4´“]L@ŠÔf$3%@1#›Îïør…Ò…Îq¿qNÙóÿ7>šá]0UNƒA·»7(LÍùŒOB" ÎRF}ð+YvtE-­B¦¦¡bï$è¼—3zþ½/»Ò!‡R抶9rõ#uWÒö©´Zúธe°ÂäÚû+ΰ0¡!j€) õçæHLMµ·e¿Øž,åd;BpH¦áZ¹«ì¼¸ÕIÅ…Si·æÄF¾r>RêÒ´ÞÂCž©<Îímó°b§ê-9¤J'£‡¥£¼ãËêbÈÖ 3%uÐ9vd`ÐÚž)S †‰ÇƒG¯þ¬“ÂêUW_ðOëÿd`u~꟎jˆRJÈDgŒƒ¢6ÚÎxИƢ7fkçMTšŸ²°y˜ ›Ÿ/¸¥‚ j iËl ÷aÜå‘rÇ/wãÙ"J#ŠÓêÔQÿ†n·ª(Ê™!x¾æ͘£As-ßõäÆq°{ìzWs[>,Šgu¯>à#î¸Ãn–oa­v>‰˜ ɨãr"S›Ø“Ä2‰¤6ˆªe1ã‚ 8ãNöP½>™/`”‘·!ÊV‹û8å¾X¬·‘]¾×“Á“`SBBH>{'…÷” ï‹ =äÏ\ L$¨Ìg‡Â¹kÑ£„&øãxiã%âªð!àmðsËt˜ÇGîÈÒÅÝ´R¯À¬lž±§ÎbÉšf£?×U¹q$ÀróCAŒÂL)+neÕCÑ"¬âw›xºßyËÆ& ×#~ås}…£òÌ<­‡ç„¨Ö@¶”/SötÅžê0ŠÑùÅÐ8ø¡î9Açʨ¿ mT6Ÿ—zéÄBÒÈÎ~<€ñˆê(m¢/ý&¡¾Ú>†:nо(ÂÂö‘£ #•“å^ )~9q¿_½»¾úí`ÔÂ!¿\âÇ’–; ^½ö©ÃxÎ숹ÏÕIžåž<²Êì“óÃ{³¯Xmæb´&ňm~~àá³ÅÞ‰>þˆ¹$¦ IÎ2–œÊ–JÅb¾RÐ)åÓÞøÝÕãHíÌ‘Fc‘hÚ1,¸`B¥ËÏ„’pÝp­ÐÄar>OÒâXÙQ”›þLîhí,wÔ‘ãªmŒÕiþ&ÖIŸº²>Tt99•ZÈØò}S*ëÿ„~’¿âðöp‰ï2|tÀ]s NO‘…*Iôò%æhê¶IÆ 2¶? ÁšD@|ä§ß3›cË6m€Î-ú€$»Ê[_5Q¢Â$~FމÒÓç)G’‡\ñ>€Ôò(Æâ×MÖº2¬$?-±Ž²ÂŠl(ž€Š­O«Õá$©§zÝR®l6¢ÎpÏ”Î33~Q:˜ô…7Àm>âªñ‹2ÑJÒ‚9¿ÃV18¡ vé{­7±Íçµ£?[®0+ÓŸ©à¤ãÏŸc>lûõÊe n S”ƒl½—>xб0Ä~†Æè¯°U7Ã×ëŠ\‚Ž˜¿mÓi·Ýì»±\ãX˜š ¸Ž ¢W®r{¢1˜–Nþ°£¬k·)Y£éNù«Žÿ†ÛK endstream endobj 1083 0 obj << /Length 1875 /Filter /FlateDecode >> stream xÚÍÙŽÛ6ð=_a *#’:÷­9š¦HÑ"Y 6ûÀÈ´ÍÂ]ÙÝ4ý÷Îp(Yr”f÷­X¬yÍ çž¡ø*‚?¾*¢U&%+â|UV"·ÛìV4yóò÷p!†ȧ—žü”$+±"*øêr;%u¹Y]ÏöêØéfJ)ƒìbÆq¼|öú‚vº½¦ÉKm«µÈ‚FßÐÎ3[UªÞÐ⵪w½Ú0Ó4 ¸Œ××—¿J¢3$'•ýð§.»WÏq¥®AS´’Á¶Q•†PGrÀO8‘»jl§:ýÙ‘<Ìfa[ªƒÞ|vÃ5Qº¥áŽnùD«+Û˜©?ø`oCºÙƒ_mºÅKÛÊÚn} Âp/óÌòIÆRB?¼4‚ÒÖk‘qCoêîó ²±5zE‘#PÛ5}ÙŽ¢aÔ›BPÚƒycn‰¹ÝQ‚jø_âß ÙL7¦ÛÓŒ|&eß4šô'ô´[?~@û£Í`KD4ÝÜѲÑÛF·ž>Z½Õ]»€üƒßDWÐổgH@9yvb ÕÏÖ‰qð<OÓ ½«1x:uKkÕžayŒW[:·GT&Ð^ð]Q,FÄyù±yʲT 0ªÙõÕ¨A¼Ø´N¨P`’e3¿8‚Š<ðc€F£%b™’§$Ú0-•ExRö†¶”‰­J”}O«ÎTžVÛ食õ%"{5ï–ŒÔÜØrW-iŸCÖIdú í'LŠ|€i5¸þ¦'< ^°΢b9ëÀõ¬spÇæ°!q´wÏE<Á¸ ›-E@ù‡æ)¹ä9-¢ÉÀà8rÙb‚ÔÒ‚ô“3Ê ŒiûŽÖÎD8yçÏoßP‚Ï,DÜw}SS2Cˆ£¡E£6ÔáYW8ºË¨:ÅÀ.útšŸ×…²œÈY³ii(ÎKDþƒ+âü Ã=R¾çà­“ ‰¦‘ìÓ]Íòj\õÛÎ`c¬ã3†%BúŒ‡'.ãå”ñUM¯|‚¨<À¤q4˜´w…åÞÖôàN›/ÞýþæþÚ{c{p<[LaeÁÒhÌ Hu‰¢ŒYZdTçræ þ¨fÓz+ëÆ.«K„¤×D:Õ'Mô&,UBj㚎CålÿK-éI-®Er47Ë=´vúseûV‡ecÛö¡îgCI 0³K®î< \k¦¼š) L€/HûtzcêÅrrƒù4Odp9€môVõ‡ŽàÌ¢Ü2Ê™õ?iIšT€¾Vf±§N‹\ñôÄ!÷ö*µÑ´C‚À–*;CUìK4´‰Ô†AdŸc8– ;Èés&îß õ÷kŽ(<¨O,,51DNæöX-^ïæ¨‡ÞÒ%€|T?x-h?å"xªK5ÒèöÆ#T¢œ¦®¯+Њ5mPqäK[ ×Ûêx0‹+¤Q—DÁ½"¡[sqŒ'ŠZ_ºKó>âqIgƒšÕ Ú%j{M›C÷«o;:ÁîÜ‹|Ê€:}NN >àhðÈ!.ΫÝ^7h´8'ç€ÚK3rHö”¨‰}îÅs[cŽ3ê‘0g˜ùÉ`> /Xßìu}~ ¡åÆVÕÐb¡#1ÄTi6Øà±ãîä’°BûºÓ½ß˜±àÖž˜©½öm¹w^l~Ÿ·ÚÍr Úvíqâ-f *ºÃÇÉrN›Š1M^KÑI&â1Âåõ„iÞí8{p9ñT¼Ð÷µøÆÙùSp%ô¼]ßøç£±¥ñŵ}C«S,‘BÏÒÔuFc` %[Jt_޽áqt¹¿rmÜ`tW~'‰äÕ¡)!Î’­]eçÁå:Aãsâ—îq ¡D‹I°;EÑ'§™‰±Ó9½3¸)œx]Ñ¢´ýaó3…4ôÏ~z<¨RÏÞŠ„9H«ôˆ…­ƒ©ý¡Y|.ŒfYzlÅ,ÏŠÁM¾ÿûçß~}ñ϶Ӷr_B–šÿæÅˆƒîpЧn·ÕúüˈäPŒ¥\‰(f1ô8øu„%pÅ~¸pŸIæ;Óï%~8!°ðéçüš/¿ÿ$Ôƒ\=ëÛÎVæ“óáëÇtxt//œåɹq.X&øL‚¯ß ¿Áï9Ñ¡WáK– e”« ¨òœÅ±8µ6ÇÆîÈðœ³89{I}Ùü$"™¥¯¤uÆÁ~GƒÅ> stream xÚÍY[sœF~÷¯˜·0U¥»¿Å^ÅIÊŠ¶d¥üà¸* ôÌ0 p‘¬¬óß÷\Fè–§-U hNÎùνG¬|ø«Ä_i¥¼$ˆWÙá•O«ÍnÅ7—ï^ Kç¡;¡|sõê_߇áJø^â'buµ²ºÊWŸœ·ûôº3ÍÚUJ9úõÚ ‚Ðy÷öýk^éö†oÞ™ú°–Ú¹)Ì-¯¼­‡´Êùá}ZíútÄ"ˆ"í®?_ýôêìj.”ò™Z å=54¨¡<ô°jDqà °Ú“žÔÚ #éô…›¡$NµVÒíܺ)vE…ÑL$^”DÌçW?ôi{5ÙF~⇯›Mýžÿ ÔÂ2j/¾Ê!³ý`:àÄÏ qFÖ°Xog/c'Cáëµ x×M^Tigwµwmg÷w-(&¥ôd„˜²Ï~¾:»\VÅžˆÔ@WoCç÷µpÂÌ ¾­¾é[cï@|pئ‰°reä{ ¬îâˆiá|+NœC 8Vµ. DS—¥ÉYËCÝuÕÚ W* ¡¹»Å À²¬48 |PfjöûJàLZµÍzT“…rd†zJÏùždd0c¢A70a<5!¼M÷w ä=`ß4†Ñ-ïøMkJ“u„l +…Îï†6tßRB9·û¢\ô%„ø£º^ÂÆȧl!’!C„W‚H†šÅṴ̈̄1ÑCðõ£Á†}º¯‘Ýq (qß—é®)ÛžáF–bT¿C'‘>; núQ{ÜIü¹Ùž@#Ò^(âÑSRöœªÆkÖ© \*¶|%éñf™ÓtÍ}ÝòŽ ü^8.šï nú¬,r€Ô‰bíüÒ>¸¢°`Ø,©ãZ _¨”/Å1L–ø;$Ï %¡`éröyHE1¨‰ù#JFàø)åKŽzýê …:°qfx‚ˆ‘͈ïµ!U™Ì~£˜|”ÂT@ja8säÔêÏtõ©”X Œ…Ùj ©1øBåoÆÓJ°H§³W49žòc–Ȧ èžÒé| 5$Ú×eÞÚ}–{Ü|\Ç QæLZ´'ï'qRÞ1¡ô¢àÄ7&©DóX"eç•ÖåbÕÄõ´Øc±%u8i»×¨V½kÒÃcÕVϪ­÷òFª·ÿ¹¼xwùÝù³KìÕžÌsˆ)@*­ø¹Þ´ui(ÿÂjm Ê›bü倘DoömÑY&µ9°BÊý‰Žz³œÒrÈD'íMà^¨UW%jq¼Þ’ðOHêuæ+Ó¦gØïN,ôo§Ÿ±íE†²ähÀgá?´y_×Ö.€N⇦>‘CIAe>Ëè_S/‡þ!Dtªª”‘—$Á*H„'ôSÝÜ@íNÈ“Ê÷"%F¦$VQA±LóeÇïXðÍpÑ7Ñ5ûtƒ_6½íÏÎ/þýËû³gø¤øÿrÊ@EžÔÁ?wÊ ƒGœr zÀ)£:eÛ¥M·ä‘ú¾G vèÿ„TOz$S»ò%”!tÐzdú T¼cÁ#£Ñ#·”üùË<ß·LO@ü·®¾ÖÛíß/ðBª»]i9ô× ÚQ—AKí0¶È%Šš{Âý:­LI]y8\¶q}ƒîxwn¶i_¾°’è›ýêgw(ÝMSãím»Üó,£´·;oGeÞ\^|üpvù|¨0æ˜0™¹„G<öBo.Qã ü‡Ü9Cã!Æ 4<ÉPÚéY È¡XMæ·Ù'54jäðÃÕùûÅæKz±©Ü걚–â™s/-‡^ZAFöíÓ’Ÿo÷¦:!ùm± C/cËxžVÈ‚bWAö•¾?ô¡ÐA¯ |§Îox¬9pëyä)ìœÄÎ8ÑÄ3Œ§¹%­øj©ø!T"9bjÊë%ÑÀAÑcÑÜA*ìÍ•v~œ m Ñ ÒéˆÓ’gr‹¥§£ykêyÞCpA*ŠŽègÃÑ‹„¹”F´å‡ÊXÀGÍ}gùº>H§2¢ñ¤â-lw¸¡ØÚ²ãçÂò¤y˜ñ¼7ÝQ _ãxÃ…¶«“)DžyÙ) ¼Yúã¬õñìßÅFx2Ç6ÑMÑÔÕañK\›"Ý”x>Ð A7OnÆN}CÙ3Šì”B'Ñ;g$ ŠÛIñb€'ghÁmžmù ¶¼†±ÝíŠÃHvMc²©r{ð²té”û—ç'PKÏe¦¨LÓé׬†’פTÛÊÍêá8£ýûŸÖ£³ŠÑ”` ÊŒpÍ‹ö¸˜Á—Ó¢âž(¸d¡D¦µ;·|¥%÷ô‰ß :ÏÑ|B€ü° l˜_Ýš‘ZÒ?µ!Å@$&È‹ð¼+nìl‹«i–™¶å7L!lÄÀB3Äbkm =Ò Y ,±L[þ¤a$'Ñ2Ze÷::¦äåù\Æ^x<£"þM»Äš—èXqÎkÛš)ÈüÖ§™jâV§©3J‚ã±ÚÎe‚4u¿ÛãƒÄf^µÀR[¡|hÍio§ˆ.­VB'Yõ‹{Øa¿;a°Ðí~fÞâ¨ØYøOç5æÉ–Î$øÝ9Yb³*“Ä6«H+“{çà"³ÍÔyä(œ‰Ÿý„%“ų"¥…G¥R…‡¤Lþ`ìZkþ\7‡´,ﰙĞ\b€qâ¤.RèéYBË+û”(†£¡‡¯á/ *âƒ1nq4[Jˣ튲äÛÉ•{å#;Ž3¼ßô]GIÍ·¹Öh$Ò–Š¡¶õÁ÷ǃŽG`e~È C¢á>¹7–#û£„¤°·$äGrñŒÖ‹ã1t± ø©>61\F§Æ~Õ ÄTfû6Cmñ¥Ï‚ªd&(¿I-qk­+~¤ex}GGª=/Z9ChHz~3þnDö\öE[У¡¯±¥æY'>?vÇ\Èm ñÁpý¤¨Ä¥=$•;¾Eñ:jLÙWpÇëÌȸPØ)_ò¢A(qÜ.v•msN]°×ƒöPÐ'å·{¿À»/EûC%±ZšÙƒ~á çÖMñWÍ¥Ÿ"Ž^Ð0‰°&ïÈ8S;oáÙFæ›ÿ d' endstream endobj 1105 0 obj << /Length 2198 /Filter /FlateDecode >> stream xÚ•XÝsÛ6Ï_¡7Ss%Ž ‚LŸRÇÍ¥“¤™ŽïÜNÛ™Ò$±Ã IYÖõú¿ß~€%Ó©;z¸X,ûñÛä"€Ÿ\¤ÁÂD‘HU²È«WQÛÍ‚?¼{%ŸŒþ„ó›ÛWÿüVë… D¤rq»žŠº]-~ö®·Ù®·íÒ¢È3¯—¾RÚ{wýá5Sú­åÁ;ÛTËÐx…=0庩ª¬^ñLJ¬Þì³ 0KÇÆ“Q¼üõö»W7·£r: _x ä|zŒxzŒ0Ð"\ĉ2R|’_ì ¿jú¢©Y«¼©»¾Í úT^SD½.­"£D˜0…íIT¾ o G²ÝÒ×AÀfÐô@LÁv­í3Þ š5ÿW;³¸ÃÂdÂ@HÍ‚Y9i°mÃÿYY6hÚƒ#o‹îkÆ0³Ûµ nøXTYoË£¿mÚâ¿ +‘•¼ iœ'ܤHà4¬Ârض/rZgbax«6ÛlŠzÃ÷KÔ²yS¡_½Žyìc–÷å‘Y¶Ké *§š£åéËÍÐ@³Z¡YÄÒ7RyŸš¶S!Z"뇑# ÞÅqÑá¿òº¾(K&eeƒÊŸ-ù‘ÿP%üÿÉq>Z·]7,˜jæB!«l›¡ÉùôØ!üyÄq³çŠ<Àçf §vvþ ÇÚ«›ž‰5¬›Û®ËÚ‚ «ƒÓª¼ cïw›÷WÝœéhà ñ¼!Ÿ5íª¨³Þ2±;v½­„ ü³<òµ1ÈKD8Ê;Ô~Þ º¹tq‹&J¼Gå|™ß¹héá`E…#ëf ¡VGbèãE?X )“ãºe‡¢ßò¨µÝ޼9ÆEœŒrØÙ0 óƒ7ZÆ—ƒM”LœMpœ‚?mëÈ è舺–¿Vö—@ªÑY+|…XxmkZæê1²Ú `½Aè™ÞsÁ@+g:qÔ¡Iñ 1’CGÆ»ÛÚzÎR¥BÆz°,¼të_ ¢?H<Ót›„ p‹ÂZÀ0»ÂØÄ3f"ï7 zÀ™µ–'ÏÔ®x–3§ÉüFÇ‹|L±é¹l¡,òÚb³¥(=HZëv¡<†= 4Ô]Éi ¶Ð¡VNÁilv§Min¥ãiXtïX‡¬œñ£HOýÃq¤gù…à ?κ' ŒÐÀtæžUÑ‚F`lô„2—g…‘Åÿ²ÊÄÞG6-SÎã‡ö8Vö p¤ã«®÷%é¨ ¡¦þ}_ç.€@?Þìª'! å1I¾±£zÇ0Eåܘ8¼3À‰xÉn¡ D’z…@Œ"^aD( Þѧ¡Zì²Ú–s:ÃÉÂ@Èä¼å`vÒùó›O7>½ùxÃ:ÿÑÔÿkÖë?yòç»÷ŸÞ~÷ësç˜À*Ë‹ð%\»àÕÔW½Ý®Ì0ÈŽL`ŒRoSpÌÖL×µþ˜lë,·L'¥±äêÔ»Î:G¥šŠÿ›ºi1+é£fɰdÀrÎÑ5 V'¸…¼ÞkÛZî æ‚Ü$"âÁiŸ—Iä Æ›-:&a::päµë³Àli Î‹Ø†ÚÕĵ«2ЉW¹HŠ¼Ñ½t€ÉªÞU“X¦Ò»G2b‹Ó3‹¡ýbPÌVrF§'½dš—fÆŠ­i; Zäë,–\ºW4Ìg‹ÎMfµ‹f¤W}Cš\*‚Ím à„ÆÁ÷snÛ8CÛÉuî¯Ï–wŠ”|z³±n¥SŒ±’JÃã¬$È*a}†¤ fO;öèˆ~V¥opC@ê•]gû²GDOÌsXj ܃Â!7pWÚq&‹ ª§a4fœrF\(EœÈ©oœÕ.eE¡0jÜ•²ªc¥'a΄ÖZc.Ms]Ÿµ=â†6Ê{¿vYH¡Lò´’€¡þî0/ÙåÒ»+ê×[ž-:þïö»]Yp_ŸÙl‚z…jVÅ8Êytt´FÙã¬RÃùNwà?g+”PjZ²%Kï,µ=0bÁ€Nå¨.†ÝÌ™ÆÒ«ÅMhµïkh8ØýF‰âôÌýî`&q DÓq$=,¡!ËÊ=¥<²½n«{×É*‡+Ášk˜|ÃTèA;—èL¸ß÷¼ÚV»~À% ŸB2õÈíóÂTõ§Â$&°·a⬿%FŸ™}ÎJ„*ú¢ûR$c¨ç¿ .ÓPS Ÿ/¯ˆ¦SgA©˜oªdˆXG3M•NMH ½Õڧ̇¬€[ÓË[,·nx©úÏû›»›^ÜHý›2UÆ|Cscûhó}ŸÝ—v®=IC‘c6ð~Ï Ýñ­éåCj‚7.­´ëìã:åóÛoç䇠‡õðÝ‹JÇÙ²ñù7ä̃ݺ¸˜î !vp×Fô€hW•÷Û3Õ 9áÂǬÞµj?ç†8q4Æí•«ìÜb{裦T©VÌP¸¢³%\fèfio¸|YU© êñü/[îž±izòí•_qîï À¬Aã^sÅ6ÁÉã“e Ga"t^¼ºMbWñ%‹Iuq‘ #w…íø£¶hD”ˆŸÉTè´¡·£š'øÝ#k÷pF³ ÿSÓ“'0ßé1M¡{~[> stream xÚX[Û¶~ϯاV"ñ¢[ÎSš¤Á›,кŠmPÈ6m³Ç– ]ânëþ÷Îp(YÚe³ÞƒÖ"9Îõ›!ùUü*®R)Y®²«åþEdgëÍ}üøþwt!†#Êïæ/þó}_ñˆåQίæë1«ùêê.x³-­®g¡”2H_ÍB¥âàý››W4Ón5}¼×Õ~&Òà‹ÑGšySí÷E¹¢ÁMQnºbÄ\%Ip™Î>Ïxñn> q¡HùHÔ,=œI¦—ŠÔH™`<æ³0NDЙ°-ênQ0@26Xˆç,K8mü5Š£3½Õåú-þªàî^7§²ú $Üqš˜2NYÌ$LÌ~B*JÈl*Jƒž/NVkšë´7ÎËÖTeCÓ(‰Û—Þée«W´´3¥žòh·3øÎX  ‚ßa3M,ê Ýv„3{=¬ FR·è› ЛᇠæÖé0Óèee= “pH·×åLdAëV³Fzi~¸Ò Ñ·´¨‰¤g½/þ‡Rèþ ·JçÈ`ÙÕõ„õX±Ä$p­7E½Úé-'EÈÀ´n¢EV÷N<ƈe©ÒR’:RÏZûóK"8Ø‚Š_à–‡j(•³Dò‰ÿ^R{ê'„V±dV'B®õå‡Lh‡'E¤K/)‚UÑê¯å‡åÇÁ[ÍïZpÚêÃo¦üêQsIE&n¯‡Ý=DWA©Ž£âcY뾜aD!I#ø]•ˆ¡’Qðsƒ)…“½,42k÷Û~Û×xo¨c¸d‘?ʪüS×Õ}õ·Âzy4}“½ŠÚÍꊊ@Uãò4 d wÅaþZË ðópM=rZ¸ª‹|Ÿå=ÜÕ7Н?„COås'Àü³=*Ó±Geæñ( …oô(‘’Wdêj8~¡Ž°ñH$1£%<Ñho…”"cq&z ÂãHØÓN\ï,ð-œ-ÅqFþE  G¤ÆiR0A$ÒVvœì((lp=N“ëñ …!ãí|„ÓfòÙUÆTž5¡¡ŠÅ(ÖQ\'Æù¿` Kšù¢.¦¨;nÍîR Z`ów?Í)¼¾»}ûËÅ¡t h ‘úÊgÏæ,ƒÊúK±ëÎø•OŒʤIOiEñð<JŒZH€È8Å®ÚÃÒ ÌÎ-íTA;”½èžøÅ§·½Gû3¯c"ÅÈ}žIœg ¶Ðè\Švƒ>]|{ûéWªá’±¾'-Ú¶6‹®µñŸGÁÚ|´€#Øóà7Éë2Æ6—à—DyIœ4Û8ˆ·í6®7æOÇÁrµ•´Æ&LloY5¦ÏÈ öJ+D-¨wÿ¸7¨ñ•ˆc–BÄ?¿7£ýሷ7›3íÍP^ ~P‰ç4¼£‹6fÜD.p.7fDrªÃ×3¢~Bb¥t“S!B ù¥üÿ6_¿ÿ)aã7_N .9@ŸÆÍ]©áÙ¨ãnWA·? Œª'èÖJ¢§Þq8¢öÁ”e\Ü‘pá&žˆÙ!Ó!5Á8ôJø¢v1Nêrx€£¿ç³ {?[òe°™¼ÑáL»-luvO8µG!+|‹hðËÍ.»º¡®\—ö5Úª¦ ª¤kPÔ¨]‚]ýqyÝ•žž×>€Â¼Ñç+ý9ë]u½2aXtµk|í6¹WG5p)+GlèqEU ðvrÚ¨„˜Û ÷Å'»ã‰¯3çëÚ\|™!Z{Ü_î&uBGé¶¾?QœÚº(q*ÏŸTAO‹EõÇß´ÿûë›w_xç3èÝõÛGuVŒ1 £Ï®ínôn}:VõnuêJóE×>Ù{ÐóàOœN¼Ó¬tcËSm€Å¡¿:Ñ ®£(TAi¼1äbG†.ᎅ».µýöŠ2¢¼)Gp(j°˜M\p7çðx\ˆ—nµ^™’.•\@Ý…VŸÊx0Ù;…FßÐêà|C¢Ýçïöùi©Øs÷œÛç<5N­%q|BŸïö…{H©í)˜äà*0hl/.¸Ø?ò91¬*w÷ôª‚ëî±[½Âg¸Ü †dgÁû†vô©e{D6¦ÝRWƒü†% endstream endobj 1125 0 obj << /Length 2312 /Filter /FlateDecode >> stream xÚ•XYsã6~Ÿ_áª}0•²¸¼ì“ã±'>¦ÆªÚ­Jò‘„ EªxØ£üúí‹%s®Òƒ€F£Ñç‡Ý3~îYêœÅ¾o§Ar–mß9D­×g<øxûξ90ÎGœ¿,Þýû& Ï\ÇNÔ=[¬Æ¢ùÙÖÕFíZ]Ïæ¾ï[ñϳy„ÖíÕýÏLi7š·ºÚμØz1ú•)WÕv«Êœ'÷ª\wj ÌnE±åúÉì¯Åoﮃr¡ç}§Èù 3Ü ¶£³( lרRÕ‹c뿳ķªºÈm°Æ ­®4/3/±tÝ ~éFVµœÍÃÐú[gíyƒ;k‡VÕ˜ÖT% 3ò?¢ æÎ*f¯sSªV7ÿiÁެèrÝœ(3G€}s×·ÝPT®UÙ¬ªzËN¬ÀŠD`ݽ? ©‘º²ÒoÖƒ¶â½$æî=…dR3Ôdb³oZ½µÛORVêÜãøÖŸŽºT[sºBfˆC4ŽC”Úa”‚Ú:–ãP9¶ë ,¦aqŠOiv¤œÎ z)™¢&•«VÉŽZ3ÇkmÚV—LE£‘H~BBÓÖZm™¸ª«-S_7&ÃðmÈâyœÚQšÇ‚Ö9Ê×ç<Ɇ$‡É+€jx§P‚Å‘uÃ1fºþ åT¢58Û²óó®ÐÍ’âÃAlŽÈ44`°c„¡ ) @ÅãäqYã‘lе‚ñ ¬ªQ_2qæZå®kQM?© kb˜ì+«–h3°ï¦J¦Œ,ê®®ÖµÚ^Le…%vû_M‹yÏtl“†¤æ]§Ïå‘}X] ÖqÒÿ鄘Û`êh}Š=~àÚž€g>áší@fB~SƈÔïŸL Òé1dÒ3T,Á !¬íÙ^Ä*ÿ!1øë‚×v„Ÿ8rÝà zº® Nðeæoh{"’”7ºŒ `W°An‹å®ë>ñFÉm¼`¼äšæ‰â¿Æ”ëBH&çÿª>bÙApúotcþÑÂU˜¦þU¿Ÿj 0¼0Ÿ”'“Ð…Ë!€gíL‚S`'pÉ(4!ýã¹=&ÚÚ“uÅU,Éq*çU®3»Z­Ð§Sg‡ ±×˵™%ñ<x¨H\T˜À¡vàH0‰À2¼ ù€>¡o==ÝÞã(°®ž®LÝ /ã‹+Œè0èUÀÅ Ô¸!Ck©:C„Ø`ì™YµÌ8ì.4ßÛÓù;…RæÆäkâ“ÌT»Á‘\3#çØ<}掮/¼.3U{Ù <+é }f^ÒÌ?(„FLÂP(.ù/ƒ¿4€¤˜{ǾeO´+ä÷¬5Å„†¯¦(x´U­\z4Ûæ‘m +"^ð,nIp4hæ±fk6R©W0_‹œŸFÊ(ˆÐŸøïÐáL•»‰˜¼Ì ÝQE‡ ‘ú\üð¿Fç:‰Å·2h¢Š¦â¥^M†íÍñ~n8ª¦1ËBD¯ºº…lbü‚¹)s“õû6æâo9S·Xyža:J˜ 8}ü !7ÖºíêΡÈçÜ `²#ƒ\ño Ç‰›Œ€Ã>MžÙ±3pɵÂA@á¦áÃOPaD>a- ‹[½&!«:Fâ¡ÔÞqè×V{@t&*FA×t ‚£ôlº%À:çEç…)êÓÑ5U0d¨É¨«*ã± :yÇz¯›lèÅð¤â™Èûw…þüF0÷wÏ V…ÿ4pwÏ qBJNmRHM+Jz1T‘“Øo¡´à=ú S‹¦Å ÚÙZáŽt·¼$‹âÿÔ½`×¶ÅÁ”¢[G0ÉggµÞŠ7š/‚š—º£hÖHðŠpáÀÑÕõÁ±©{@M:¸ï¡$^LÞQ”`ým8£þŠ»jðæÆÙRÊ„Šý~-k•Qkì¥)×ôH1Ç¥Lt÷”v8¦tžt]‰€ªÔý¨f¦mÕo«ì ·=$p™z°ð…fžO\‘Ôl4zSÐ6îy$í|„î8¸žú æ]-••@]( Ó$¶ξ–#©åhäiœ-¿ˆ¢GM•nŽ_|ÒO¾ãñZÖùtÿÍ-í›æ;rÆÍ÷N)ôµÜ²…Ûê×7wÿcmÆÍ·oýzùøþþúûÛmúØ„òñãS÷0šœÜ‚@èJ€³b/Xš ‰ãµ|é*yÚ«J+Q$=j?|ßö_¦tNm ojv# ¯ºRËx²a$ÀûÃNLí¯Þ2ï?­*ùvÖ/É· XÊõ²[¯9IaÚ5{¯$°~,öî8ö 6pW×?~ص«§ž[Й|xúå·ë«ÅwDýmÐýØ?€ Œ)”1…Ò½‘ta­øôªÁ)Ç7ât#'œø>fßOTß7"ô‘ð%þ·#‘Ž#áq$(ôfùJ ÜC >>¹òÓ6°/Ÿož>>|±]Ue¦À ôM5ð‘þ9Lz5ü€tú·•sÜjak5úŒëü6¸Çµ‹+ô&ÛíŠÉû¾W"a%Ð6|ÛôŸ†Ç²ø;óðÅ¿6ýèe/© endstream endobj 1031 0 obj << /Type /ObjStm /N 100 /First 969 /Length 1745 /Filter /FlateDecode >> stream xÚÍYËŽ[7Ýë+¸œY˜"ëE0ägAìEr÷¶d´Ô˜d¾~NñJŽ-)¾²dga¸Ä{È"ëqªÈΉ,¤Õ Ùÿo¡æ@"!ùo|4†ÀHÁ¸8(ù'¡`ÒG$”’fj¨M|¤…Æ9Ô¡Yu¬+KÍ%_Lý§ø"ͺÚÌ®WRéŠ!QöÅÓ¨ùúb!KîëA¯ŠÏðÍ™õEñÓšU,P°@íB1ÂJ5—P+fV­8+æÔÖ·„9M\¶@nH(Woê} ¶äcZ`•n(h&c·‚¤q*ê >uõ†åJÓYM*û'HÅgúnZ?–•À)õ -0v†#„n´’ ‡a]¦ì6ÆG2ß[{8eœÁ R7MÑÀÂý+ÖÕ~.ÌgÅn Aƒu]Ø4ž¬X¥tçV(«}•Н£«II¡£¤ñkT‘ÐIäǯS]BJ¨«h ©‡FNÜ¥ ®í¾†uÅš»>Aª¹Îz`Hëaƒšúš…¹\*úàAÍØæf¦ïá ÉMŽÊã0Ä~F7ªŠ@LT=¦p0Õq ¬kãsóS䌩ÅúÔ´åŽkÁ<îñ5Ë]9cTú˜ãgdD‰>gƒ4®W‚©o*Ãç¦}Sp¦) gÈ.3d#–Ëà󨕜…¡âª4{üx6ÿ.¼À‰3òù§0ÿù—_Ì©™"!JWww/g_}õ—@!‹à‚IKŠA9 $«1!„Þ>Y¯¶áñã0‚¼ª#þ‰§ïd„jÙ#.©Ë˜<ÿñ~}ól؆aþãwOÂüùðû6¼]÷ùo|Xük˜Í¿…ŽaµÝxjõµfóŸ†ÍúáþfØŒ|ÒÇž·ËÅ7ëßËÜuJ£—P´¸Çlg)_¯Vk¬öbä>ßOç¾Q·#Ò…ƒõ¹³ù³‡WÛþû‡åê·Ùü›õýíp?*N/}{78(%:qÑ·Á#%zqµ(”ûº›îY˜¿~¾°ú߆×ëÛ‡»áÑf}¿ý»Ûébí¢>÷ÚÕÎÑ|;üs¹®ÓíaeÙ™³pdð ãpçgWM*ÑC¢¶haŠâ‰RTÖ“êï—¯Ý.7o»çÛ{9P@ljr ÈRŽ^w&ŠHr(Åb%2Ldˆ†I µ¹ž±bVpjÂ45¼KoYâb:ÐtLR/§±= ”k“Ÿ¹"ÕPWIbF¥E)‹¨mÂQ3OÆáænÞ Í—Þ»>Štü¥øÓ1¿72Ðný‹*¼¿?O:îä ìø“À\îTö‘þO+½gՌ닌%—›/×~Ǿ”Àý ~G×;&÷øQ «Ûªmämƒo"_œJ¥5Ëél^â¤÷ÃæJ¡:¾‘rôçfÜ}Øÿ‚Á±Éé¢q³x=Ü/®}þ-Ñÿœ´×ë”ý!«áß>…^Otný5À Š{±â~Ü>Biÿ|FGuHávªí:âVYšNQ[mÈ•zÕž"Jk³i ùó6Ÿ̆jÝþ¸—Np/ɽ™óyýÉÿ3O³ endstream endobj 1135 0 obj << /Length 626 /Filter /FlateDecode >> stream xÚ¥TMÚ0½ó+r«#5©O²7 ¢ZŠDsj·‡,HE”8˲¿¾3žIK«]UÅžŒß¼÷fapø #âFèºvä U>à:Zm Z,§ÑæYhu2?&ƒß7·# #Ùt¡’µñÅ»ô deZ®ë²ðδ<ÏgÓøþŽ"j'i1•en:!{Êä‘"q™çi±¦Í}Zl›t É ‚ 72$ŸŸ’ 9ßq^©3ÿ‚ ׿ £• =[¸ÉmÇkZ~à°g`Á6e•[Y±ª¸t]›nPGŸ~à>¾Њfc|z,Y޾|,–sH-VÏQ?´ÃnÂ7:ö'pR Ùª,LgÈTV y)XºÇ7ËK••ØÓV©’üéUÅ3P™BÇLíh¥›¢Ñ›ª’T€@U•µ…,Qb—ªwœˆ•zjxDÛØO¹RO)«m+¹©d½£ ZUKõ—“³ñ»šVh¤Ì[r¨Y—DzW&ªì1%¢gåCÖzn“éýþ[äº3"Dw¼ßGɾe´¸ÿ€Ekà±ÊtC]Þö ýžA g¢N½º„Û¶ï°êYC¡K;.H~I·ãÆ0t*èK^v•¾Åú®ó>9ÿ‚`ƒ¯Å?\w¯®¿”eK#Í­³é“Qœ,–¯pœ€¾AQ ­‘xÄbìþh·ÍÂÕlüžâ9jkö*ƒû™[ Î2UÓÛ.<¹_So >Ûï¼~ÄÃ'ŠNL! F§}3JÁzW6TC Ky«%)yp u¦2š!²CÏK£é·•}þ¾þ©)ƒè endstream endobj 1143 0 obj << /Length 2325 /Filter /FlateDecode >> stream xÚ¥YKÛ8¾çWôQbF|ˆ’æ¸ÙlÅd°Ø4XÌÎAm³ÛLlÉänôiÿúÖƒÔÖ=,ú`Š,Y¯¯ªØò.…?yW¦w¹Ö¢4ÅÝæð.¥ÙöéŽÿüüNº5®'”¹÷áoYv'SQ¦¥¼»œ²ºßÞýž|ÜUÇÞµ«µÖ:)~Y­É’ßšzýé´Ùû­«j^ú욃ëÛ×ÕZÉ2ÍiÒÕ÷÷é~8=Sê×DÊ‹{æpÏ\(™™pO[!µá{«ufUòÛj-“³ÛåYòy%“xA¸Õ¹Ð Uˆ´ ¼P–•*’gï^`¿ÔIw:A²"iÚ¾ã©R¼âlž8<µ…3˜hï7LTÕÛÀà¸s­ßT{üTÉ^7õ¸ë5Î/ÈÙí÷óÙ©DÄ$e‘ “°Œ.’ûCQ"©…Ì$KÔïZçØP§¾ojdªMRõ<Ùïâ* $žh™²gÆ ¹bª9iK‘œGç|­|½¤`U –‘êXÕnÏì«Ö1ÿÇ&øXçúÞ×O³{™dsj[W£bŸ#ºX!CÖÝ#Ó0°à&%ýÔg$¨·Ú ³~å$$ÎÒq< }áZ8È»î=ª¸׊äк¶nß11‰ƒ+S‡qÛ_–T§S0Pª£RþåÛþþ± =„¢Ì#áû%f¹(¤ÿhWøÆw‡?›Þ?»%®ÆŠÂ#WvýÚ¤VØ´˜{ÕǦ³–/¥B+Ùƒ{æEšü]µ91ŠlЗi€ÖÛA T5º5N±%ŒEÃÃBKÞíQõظ¶çéßï"ZZFi%²lÐÖ×Õ6\T=ø5‘ô¡mð /"ÒÔãu—¬ ¢âæÕÁ‘aª¥ƒÖºÌDjå\Ã)ÚÆ$Ÿª §o'…!‚ü+^ÝjÀÀ÷!Òùâ¬G¿ÅŽ4»f6÷‡€¯[÷Xö=ÌØÀ·ïø·"ì²z€˜ëŽÕÆuÝ””J˜¢|k<؉keZÂãñ›°¢ áWoÃlß„_Eú‚I†=‡¸CØ¡Œï-çÆð¨½Ì0èªC¡t<¬'´•ûaæÐ°¡ÔàûTo)¡^aåzò"M[ÕÅY︧§ ž&ùíþÁ Üþñºy•¶Ó£t¤Z0U™Š4rå€Cø oMš®çÑ©s§=_dô,t~Hw䀸ҀÀmÜ:A_\{Áøpm ô‡ãÞBÒpÛŒVEå£Ò?ÏéHDv5²œætœ>£ù~Bñˆw2‚«y (Ý7íþòaM±õdŠyàÝ1E,“Kt€ŸI™…ͦÆÒE@b °\¦ªÅøÍ•ÈUþ§(…PÊfú@ºçñ€ê˜opÚwÇ}EtóËeS¾×D«8ŒŽ²¸–Î’…îz3S)l~†gW ¥û>“MÚ×~7”0ž0, ûú¬ð èP*ºË`5“ ÆÚ‰¯"ãòÙà¤6æô²¼Zº)ÈmRþ\ё̀ÑÓ@§ÆÚÍØ,yòÏVLÂù GTtÙ€88b¢o°ŽO¾;¼éŒ×0§p—঩™ù÷,ee€Îu4–…í¬8‡U½Ž°m!î(›†<°Ý’€†1¿œUß6„#&  iÆ„’rôÐ~ß{¸ûk¸Ø©ï€Ír‰NžPžPЈÀïKÍ‹=g9‘Ì9ÊŒ¾nÒ‘ÁX”1÷&ÃÆ!Ðt+F÷rXÖÆL*BšVÜçŒä‰Ç`5|ÃWåpœXtRY«Õ›"5³"M³Eß„ÒÜw¡2÷¿¯Zþ ôÁÕåǴԠ˼„r~è6ù¼*¤˜œÂÞ™¸o>óN_w½«¶7#z@®Ð#Ò'‡°.ó«!,¡’ýɆèkßYàÀ™O~tø¬ø'Ô˜Xº?òï®Ú?Îg†4Qµ£$Œ_—aÔ á™’gÏ YŒQ*‹äBĨ$M]Õ ˆÃ_­ïˆJ? >ºdº ¤—%ÖÑWk{#%Aå™ö×,_\œEÄŸXFCý/Ü÷}h-©¤HS®à÷ëWü4þÔ…•s1p’ Š4½&†‚,ŽYàv€eÐeêË‚u,4A_ÂIñ m…3’¡žïÐ1ø­5B¡Ï44«èféqCø468¸f&¸6,Ajz+é=ÆwM¡~³^Š4-Ì(ú›C-úëk• Çç“ÛÚ…Yy©}ê"XáKÑ©9)‡Ä‡§°àÃSÒ¶­†nPêQq¸Äý½&娮kj×qiSúþÔÖ!ŒÁ#TaÏ› S€ ÿI¥ÆarÎÕüKïN ÛujaæÔqŤ®?5-”tõWL ȰãæzÑA¹˜”œ}¼ˆ¯oži­(Ç¿ÝÁcË8ÆïعKxuIl&2UþÅè+ U‡ÞwÿúÄ00À ÜöÉ…T^« û8f·þÙSéC;ÂÎÚA[ÓUmÈå?˜ùª±>£³XDxyÏwj~ðçæÔr°n,J{ñPµÖ‚Ž{×¢§æÐãì||§Ó9JØmÅ4Ftí˜6”F0bqr§ódê¼ þ›—ÉCìÚm<Š^Žð”ÑLv†ÏÐ4˜1uÂÆõP¬[÷èk·l²°of²Ï ÀÖ`ÁïHßœ;5—Ðl+è«t )ÓÐùÈ`Ià{ªŠ^Ðç3Ó§ô¸}=î_xõ?;„®ø ³d4 8+FÚßÏe‡H7µûã=Ó«§€ÚR_üPTØBMŹþ€H|ûòg,ãg™´¹..³¸<‰ÏϾ€…«/Ýîqo´Hš„ʇ¡{éx†ð¥Ð×|Jå…PãKʶê«Xgؽá$:dÁ§°*ÎÇü}Rw”ú¢WmáB 0´Üw¥±ïJÏžqfÜW×,!õ?¨bz²ŠK9ÈIÀÅ}Kñ£àNÅ‚¬cÝ»>aÛL$p>zÖ©|¬ÖæÔjª¬#<µ\MDÂ`?=·Ÿˆžû?r7< endstream endobj 1147 0 obj << /Length 2188 /Filter /FlateDecode >> stream xÚÍ]oã6ò}…_ ȸˆ)R”ŠíËvï‚]l±I±(Ò¢ápHÎ÷ i¾Jொd¥Ó”2_m¯‹ív+>\¿âŽ.Â8 |s÷êË)µâ +’‚¯îíû蛽9e·ŽÓ4Нֱ”*zg†}y0Cµ14qÝ™ã¾Úô4ªüÊèºlk‘G?WåÍ´Í|(›mÙ½3@Èœà’¯î¾}õÏ»‘Y%Ä ¥BÊ ±4ˆ¥™àJz±’”%™$±Šu¬2½ƒó#fÍ#'V¡<0²ò åI¹—0 p½âK3½ŠyΊ”8Ks%Ç~P€´b¦-•F›öP" JDOÕ°'dHÂM­ˆ£Ù¬…Žþ³VYdv~é°7-­ËPÏxN{"ì©wûq¢GN`–¾Ûª­ÄàGxörlºÒaŸû–,°jýy­TdªÚ|ªKòÌÇd¶ÐÇuŽZ?vÆ!>”}i:«Ú=œ~E.|Ól_‚ßI8D1¸Cîöeç6&–`ç4O3ı՛ «f Ý:Ša_õtH\°DÓC8ª3K¢Ðn"›…%"p?ü>uÕàhÜÌntpµŸ0¢—›aºÐQÿ”pY» 0ðûþýõw=¶ÝÁ¸…à!Õ‡›7!-È!B9l6)ÑÀóÜa¼’öN¡ÛòÑœê°à™¢A}®1uM˜ô-}wA²’Ãñ„ÁOCÊ]i¨KbÚ gB¹ˆýÑzʉrⓦî[„2 (DÁV¼ŒQKàVôÎ;á_I˜‰M‘ôÌ=Žª†È‚„ŠèŸ•€êáÃÉ}F'ÅH îC‹,ùðmÕlPÓÒ«\¦£©né;f)-‡ P§b@X÷RÖ½zZS¹™-ÐUà]©µx# 4¨wŒ Ì r½3?ýÕ‚N 8#³§L•eZb0:‹êPûÖRm{ÂTÍh…¶Cgš¾Q›!¦ÖI'ÖIYá4b1^é±–øùb2 _*ÊŽøºêÓi(·„ ¢€¡Ï”@XoËÑÛz›[ "Ö­ÅdiïN0ÏùcG¡ÛøÎ…ˆÞ” F¹Äú¶µªÁ*¹Ò… u•sèB,;³„ÞŽ„çÂDV §~ Ì~C#A³xbTn±øK–ÊL`¹&…f w-MÁ8UÿzâVÏ;M¦Ãï®lÊÎ`öÄ‘ó<íSb¿TÝ[ß9d _ Ðýõ…1hi.Í4+°­± ñ0vX:A&L¦…§­XE>õtÎDD ,øueÁ³ŸâÈç6NqÓ‹‚’1aÖ€Þ-%“´rg“"kI j€ª™w•7·ÒŠüç±â›f»¤®2Æuæ…}ýšìþyå(Èa\{úÁ±2U üDÝš­Ãì[gC9ŸŠ9Ï´5䃱àœåÐ÷M"á#꙼w™Lx„ÎT ÏãcU/î,‚žêjq#¦Å(ëhÔ…½¤b9€£|XRœGo’Xj×@ôÛ3Æ‚ÔXˆûMW1CДͲ޾`éÅoÈ!ækÁÀ)fÙï¯EÈ+4ûIú¹§¡’2¥yè “Âw6ˆlÌ¡Ü.–K–ËÑnÉ’árK#«TóþÐæ¯DÎ}ÔBØéŽrdµ-Ý‚aÙ ¹Ô,+F•` o+È’J 9¥âÂθyPpØCWáŽ5ô±=T2é¡9íqôl…ÇÐÐÙ4A„÷†ëJ‘©V·Íø0*{ÓÑË‚¦²º¦à<) ³ 0¨Ür(í7pÍ‘pÆÓ}§#[´Xbì;ƒwß…B·¤k/-Â* !î¼ PvÝÖMÛ* ÷—ƒ·-¬¹ÖåŸì=©o@D·Üdr‹„…Ï·ˆBŒç‘¢_ .“æYsñ—‰=íT ¤v¶´yâZe>Ý|9r¦ Bþš,ƒËͲñ-9r†Å­©ÜºræK!ê~ÓÓDЮ.ežq–$âEÉG3ž¨0ùàÓë5bŒãÍ;$°ˆ0%ÍŠ”^žè©˜a‘[`'KϹ ¬“êèöô©/ÿ{*}í ì¸lB"c)Õ¤9Kòbî7…iõÿ.P’I1žÛ•páÛ`ZDV?ããqÊËóIú3-eP”Æ~c¡o\éÅ—ôO5a»ÛŒQ5ó$É2Á_âIàÔ2W“Òr)ªÀnLLï¨ÿ‡uÐÙþmHœE±Àiîš l-ÊÃ;Žþ,z%$2©_½ꤜ´¹š0Æl;6zúlCÁ¡GÍÎ[ŠŸ0 “JÍú (g,Õ‡ß!DžÓ;„È JÿÐ=ªª£}ñ4¶zá$?DQ1E vø‘'ãì–.éݘ(pÙvkì{‘Ýx> stream xÚ­koÛ6ð{~…Q ˜¼YœHêYdÖv 2¤èdÏ™¶µÉ¢!ÉM¼Àÿ}GiKŠÜdÀ`À<’ÇãÝñž¢#~t”x£ˆs’øñ([ŸyzµZޏ¹<£ÏD·…ùîîìûŸƒ`D=’x Ý-Ú¤îæ£©ó~•nQ]ι“¼»¾8Óf%Öi“g)n\Véf•g5ÎòR¾s)äzÌbçK.pGV¸s#ʹ¨>¦€H=µA}6žÝýröÓÝÙ€±WJ¥0Ÿ‹¶Å¢4&ñ(Œ}B¹’]•S>ÃáÀyûŽ¿Wy#>}º¼ž¾éVDÊeñf‚{çl¦8„]îQ¤òiÛ<#ãZuð®:Ó×±Ë3.2”#™»U®”yÎ<¯7EªÔ¶Ó+Ô)e³ÊË%n—Z•ÜoÓµY©#þÓ£~!Ìýe0æ? A}÷AÔ!^Jß·¨ çq o¹Åû3õŠš59f‘cØ+d:G¨Y¥†SцÁF¹‘Z§.‹º”àU=ã«“%Ž©>ºÃI&×›-(pæG‰ócp™6¢Ø)' 4©i~Õ‰ÔÐÙÖ0æA5ʼn¸]ñ£yP’Ÿ fXZ§åÜЖ8ÖMZ5æÞ ͹ÀŒÔÆžŒCerc…Tn³0nÖs(ßYT°¢÷re%·ü“ KÖ·?p† gÅVàéW,?xÑò#P”O¸²–åÃ? Ì;'„ÁÙ9¿ÕÆÈñê1§VNXIk[’}c–>ˆEº-œðf½ˆ3PáÀƒ(4!”%Öû*n“fJ¿ÁÈÓå U„œxì™UõÐ5¡‹›VUZ.… ’ Y ?*G›ñ~ šr kåq~WMŽÑÂHPÉe•®{w€Z´ÉQA’ÅG[cwäc솱cBð>‘s§w­w~£|,œeþel¸…eä€ "¼cbÈ£?¶*º¸8êä´Zá d!{¦‘£ƒ âï:¼u%Ò„ Ÿ޳¥@ÞA[, ŽáBM:V ÊÄÔxÔ›š)÷Ð÷IÌÌþZÈ£/ †P‹7@Œ2Hq‡¸}»’ƒÑˆ1Z,#e'e#ÃEP-ðm@a%YH» ;^ËP òX#m›/êü=”ñ…!‘k0åÞBù rròJ‡¢Ä‹"‹›¯7EžåM¡sA¢­²º"ŠˆwÌw*Á“ç—ƒ1ê˜d´m…ÒdÀZâr+©$6©Ä6©$§’ 唸^ôʬ#Í r}P·Ïüî› ™Á”$ ÚRú^ a¥ÎªÜ„œ9®¥j9:¯[ïÖë ]*°8ý°Â_Hƒ×½l(ZuFÆÇ:C3(q„r•öÊ6_A©Å&­°0å'qÜË´:† y,'!±@Z [•ÑÐã0ÈnÝD{މRÕ\6©¶bqÇK”EèP®€ÛË+®ª¼î0r½—›]•/W ¢Ñ$ŽÝ„šW ÔäFÔ"­²•)p¯Ê ý7 ‹º4]×Ô×8CšåeÞäi‘ÿ£ìF—.êÝPjW PhÐ^ÑpqÑ5~¡GXï†Ñéãg†óïpØ}fF˜§G¸v…ííÖîùV·Àaǧ±{»­i&lób}Ï:õ=6GhµàWkÛ5KPB®×m€E$Ø0ìÚ àe§ë’÷*O;‰¬iß„q5œk^_ òa?=~»ë¨<4:¼¹|÷^²šz“ÇÉn¶?¾ƒ7¡-Õ«ÙImóÿ]Û•€ä‰ƒòlW‰/¹ÜÖíµûT£KÔ5u¬Jï[•–!æ›–¬û¯W´ªì~:g“s¾?Y{÷>=ÓÖä„÷ÿ©)e!ï5¥ ªuLЙ"‚=Т›#ªéSˆ²Ì„jÎ=†s½_€rk]"¢N¡j§×ÕÊZV‘ ™4X²4KÝÊ&ì9‚ÂVâdj(*ÇX+>4=ªÛLµ1‡õ\3¸HI¯û1…’”ví3Q©2DŸU8)"KØf%#®D÷¬daî=fÙ W”\†¬5ѯU PâRM±φºóC£=5îˆÀ‚¬73ΗbúdPØ~ûÉÀo‹ûÙa<•_jòòux*¨½Yï àèðQ-˜ÙøÅÐ7 endstream endobj 1159 0 obj << /Length 1910 /Filter /FlateDecode >> stream xÚ­XYÛF~Ÿ_!B9";xÙ‡µ½Ì®OƳȃ¬=RKâ†"s¬áÿ¾U]MJÔP ˜®nÖÕ]G-6 áMÒp ¤2™,w¡]­6"n./˜ãóÑ?â|s{ñê¥&, Ò0e“Ûõ±ªÛÕdî½Ýê}cª©/„ðÒ×8JïGÝl§Ì3SŸy;ÝdKMß/+½ßfËšfYáV‘Í”»)O¼ûÌ<ÐjétÞX-¨[™êG 2,”RyLŠéâöŸÿ¸íÝWœå>‘ó÷7%2`BÒFo·øÍ¹òôjeÙl :²Ñ±lŠ%`ÊJ¾ÏŠŽk`«@Dªãª÷ 2ñÌ2û2iVdÎhD¿’ u’WÅ\-Æ  åØšòà³%ÌcV7Y±¡Ù¥@ì"€+«¬Þç£ò4M„L}&ÞUC_— $îÈo·Z(ÐTežÃÀ©‰ÏÀ)úLL‘/Y±2n¿@‘Hþ俦ñÌÙ²Éáp_Œm\1;LFã²pD_Äùÿ«Ká´EÇQÂ~UäýÇ,›9ú);غ´®©–mUlÍ=~Ë3Èç»9Ù4ò?`JZØçeScŽûL…A"" ¢ Ó>âx±xý7¿ÿþò}°Û Hœ¼«ç«5†YBÈчöÛÊÐâjGmGå}¼¼šÑJ^êfÑX¬$Bѧø97xÞçieš¶*jR~Û9õwG«•ÁÔGáñì!¢„÷ÙÆÑðx ¨8àqÏ;^ð:SòYìÓç?°Z}àO/™ÛòaþM²ð³C˜ž œÆiÌû½¤´‚ÐÓ4ÜŸ?…*ä/ñ?fhëô|GCû³·]ÀgfÉ{K¾Bv6äü…;†_8²Ì:OËý`‹Ôºýu¶È¿ÈÖûr3¿ÕÀôŠ/†›"/ÐØW[øB&|ºîç×Î|9“PÈ÷³ dPÊ> TÎÀO¹6—1û£µ& ²JÂËuÝEí©îÛ¿ZS|ë躭Özi  qvz°H¼qx“.UZ)Ì:çý´ƒ öÞ…š¼Ÿ*P-À8Ür,]þýdÊÂ]뤆i]A£°ÿ÷|]!‡Ӱå~Óa$”gÉu”Se!+¶ •xïÖ ÊŠæi2{Àú¥A¾½z¢ Tì½m«{Ä™¸¦‹í© ˆ©G¯R(&.û>ҘdžðYIÿ…£qÍ%AÀ‘2âÔ\T°bÉSÛd¬<\Žˆv¸÷ïÚE«“ë*¦+Ç)L¥C³DvØqŠ 6÷Klò¾¡«ÂÂìÌF f¡WqqRW¬?WYc>|¸|?ÚiÔ³ÎáɎݱaÀ¤ÀºÛ˨mΑœ÷ÍÕèñ„Ço;ÒLˆ9FÄl§(^­É „r8Ýô/FœaoZhÊÔQÎáêÍÕ›å‰A{¤d|=xðèd_oæ®bÂA±@É>åÖY>%{Pýób6¦Ÿ}ªõÑ%ÕñËgôÉd˜ôÊÜÁ_:À&à–gŒ(>|DŠ4u'xF³P=ÿ€oè)>¾xǤô 0b_R0ZèÚ|4Õ[§*O¢@¦'»²*l³’IäÕOucvDÛæ ÷PY®ïrCËÔ둺F,÷¨+‹†%4¢eàÈ£'2Z‰Ä¾*m%¯Ú¥Ó ·2;ƒ/>œn³“ù ž)YCðqd;(óúëñ>{†ù `ŠñçÑÅüÕu™?mͪÒ'¬'ÂT0ÛÞ™ùâ,j4Ê‘¾_,ÁV­ô…{­|#ÎÚ•þQA0 w¯Ù)ïñl˜Û'¿QàÚßÂpYnÁñ³í±ïŽU¤<2Ýš†ÊèÕ“ß”>e9ùƒ]îØKÓï ¬s–{‡‘ŠnOrÀËiÖá ÔB‡AZ¶tïËÈúXÁ[u?ì­ÐmÞÐò€U¥‰“žÁem¯oü• ,ˆ…€° ô¹% jP¶û±éOLÈ=Çlù‚´Õ[ {…£I@Á²éî›Á×7’‡Gó¬{´þK>O) endstream endobj 1164 0 obj << /Length 2990 /Filter /FlateDecode >> stream xÚ­Z[sÛ¸~ϯpóDÏD\oy‹›lÖMÝõºÓɤy $Jb#‘*/Qüïû€ªÝNf"ÜxœËw.°¸ ðO\eÁU†~¦Ò«ÕáU G›í7î?¾fÝ “•7¯~ú9Š®DàgA&®6SRë«/ÞŸwù±+šëE†^ööz¡Tä}Ê»]qÈ»r•óÄÇ&?îÊU˽²¢_å},êõL½ïeq♺á™û¢Zͧ E@B©ë¯yõáa8l$å oE+Ÿ¿Vœ*_„НÕѹ× ü´3>ˆ§ÈÈÒôõòFŸ—ï°ê—…ß”æ£Ù.Iê™ýf‰åièu5ÿn‹ªhò®0£;Ó(ùÖ4ÿµwF„‰Ÿ†ÂR>r¿+7×Tä§b8·½ˆ2åÝmx‡UÝ7mñ,ò‰uÏ3UQ¬§çUÞîZxùµL¼ï×–GWàVì§2¹ZˆÐï1‘¥„ßvù~O䨻!‘+àÆ X¶¦SóìIŸ¡ù†s&ôÞñl»«›nÕw¼Æ®µ2ÐTh–Ý®\üÝL-õdëâf`Ž/øüÿhÊ®¸¿½ùòúO¼Åë7,èM]u±X„‘Ærä±c…¯ ˆ…H|&³­œr ÎT'¹Órw©u–Û¤+MÛqgUWÚÌXP á5`uWV[žf]Ccn¶ØŽf‹^m£ØûW±2tµ*D©ww÷ñW4ñ=ëB 9ÍxÙ·´«Ëœ2?€Þ>hªN€n‡vi^‘^& Ý‚`%I½Ô«åÁÜ ?€QU¾çÑcSãf§%%Ê—Ñ »ºÞî¥Û–µ@ÄT"tˆÚaÊñ¦ãAæÉ2h•±› ÷Ã9³˜™PýX ïA )ƒ4&ñ¹–>ÚFW¦ŸkCãuÃÐËͲ~¿çÖ°ñ h×þ5xјQêÌö‡ü›q0+áܧ¨`½‚V5&BdŒ©ÛÒ¢ÆÛaUí.‡ŠšÑÚ×#]‚7§¨KK¬.W…ñÎÌTÄ)yS­ùÖˆ!´ĹÚÜôà¦Â³«Í‰„HVÏov&’iX½d¡,âTxr[ó&þªÆì§oòjKhOm[Ë‘^ÀqÁGz–ä{VÅ·&zrq:G» ôÝZ§|®§çUâb´Ê©wGsR³(cÆÄ…BüwV@¹“µÐ˜1Ûä©ä˜3<ó'gÂW~9c¦¹· ¦ÎÏÔ•\ô"}²éMt2qÁÊxØúXþ(öíC…²Äé¹Tœ9¥–^0M‘ÂIâ ¶0€·Ó”(X-ÚUS&g×\œ#) L#weSãa‡+Ôö¹£ßõݱïìá8g’5Ëmõ<´÷UCè…§Yþ±Óä¼Ùo=ÇßlvDü=䆕«}y4RŠéb¡Ï·ÛªnŠÖÖKnN»93â(f¨b9=3²waªñ™¯¨ô(€œT&?„Â>`Ĕϟ0  ø}_²!ùP°šêü “”u#£3o@¥¾#µqYåðAæ ôÞ»D¤ë×ôk³Ù¶\jMÄV>ür´%âó×É’uÙ÷º¶þÈ“:,õLgÍÝ¡ì+ÎoŽM¨ÒÛWsMN[j˜WéÖ#w´#wOW#Æ&~PX=uå!ñn7¼h¬F:‹Ö…בsõ(=/4'|,üšòÃÊÀ|nª ³¿UmŠUÑq\Â…p¿¯]¥]‚Ð¥¬Iͽ3!`ÄîXZ!–ž”D¥-‰JÎF¸‰XÙ¨I:sÜ Ùžðnµë«o`1P“è…€ÅTøJ³Ùœ[™0ñ}Â…Aa !ö1qÏoßÁŸ¶ÍÏX±8èWãKlßá0Áæl'ž˜È=¶/þ°2-"¼çŠâ„²©tÇ›†67¬~CmY11VVœJg‚`¹'“pDÈÒ'|ñ) üºÒÕðé ~ŠõKäK~©[§ t9&¶Ï„”¹K+"C¢®)»b-€H:¬¿Ìå óö5GFúy}ÍÆ ã‡2÷3`hJ†ˆòýíïûõÝgç¶!´äIv{^~ Æìöþ织¿Üýþà¢àÉ Å ß˦®#˜àè߯#ªõ—ù’•<0oHV4ö)†œ…=:ãW±·. ‡²¢¼ .¥Üðð`¤ÔArʳûz»Õ©É–èwCè¥Ë ´8B•ݱºNÞ @ykH¥]qz¨t1·- ]}ÛºeO˜2CZ=µªuÙfÛs^Žé¶·p(õÓ¹@ª¬¥èö D™ŒÅ6úH#; ƒÖªh[*á>ºóQ5-;6íκ›eO´xØ=ýˆ âê ¾ÛÕ6Û–ßÒl0zǼmµ»…p.×¥?_ã‚Ú:ñE# ù^—Ïjî?ŽûrUvíѲ¶è¸Ñ¹N($:c ô½FôÇK¨#ÓXf_n4õú¿î¦²èEæúÑXØptºGnnÆ/|\úé¯8Äåg7ÈÀjx¨Æ×ƒuÑ–& ã?„¨¹I¯ô ­þFÀdÅüpÜsÙŒJ¯ÿ…Ïø¯ endstream endobj 1172 0 obj << /Length 2573 /Filter /FlateDecode >> stream xÚYmsÛ¸þž_¡ñ4Sjjñâ…ä]š—\|é4“›XNÇç´Yl(R%©Øêµÿ½»XðÕ­ëd&àb±Ø—g×lÀ?6K‚YĹŸˆx¶Ú½ µºŸÑàËÕ+f÷-`ãb°óÇå«ï>H9cŸ ›-7CVËõìÆ{·M÷®æ ι—|?_!½Oi³Õ»´ÉV)-\Ué~›­jšeþ ïJ—»y{ß2ý@+eE+_t±ÖÕ§6²˜óÛå_^ý´ì„•axæ­pçÓk©áµ‹ýx¦bá3.èf‹v;‡¥÷ýŸé÷Íúýüùê¯þ‚¡òyÀºÂÉG¿äeÃßß\gÅÍ#QþD?H9ÞÞ^Òì·ÇËExþ÷ò·# n]ü?š',Zíò÷‹Ñ7a'Ÿ|‚šG­ß¼æöø÷Y½ÏÓãÏeÝ,Þ^T<_Q\¦&°QW &}r:b¹ÍìÛ® |ÕcMo ¦@K÷­ϱþ'“!ˆnø½æ®ƒáÄ i·”qµì…Wé]ÙØ£¶p éN¯Ý'&>‹»í]ÇŠÀÇ‘Ý軘-Â$òeĬV¬µZv2}É£ît½*ï‹ìßtŠ„.ÊÀ«›*+î]G&±¯„l\äå*Í/œ'…~ÜIŸÚRbÿm.•—æMÔ øŸã(Å}•Ä-‹? LÅužŠý(Tíî€syYC «ñ%a` ƒLÞ,ò¹=r°kô]àhJzê;dêÙwXþ¯mÈûà^Ã:¨‰æ»t5.Û9ƒ€¤Í³Î˜€!ƶý…T¶^gMVÚŠ‚¿_‹O}ÀW¢s+ åѨÜL–Ìѱ·…s‰`$/4yÀ „>®VÌé1XFo=Í9Å¥ëùxÄ|ø¨}‘ç¬rÁce¼b¤ÿBë5¾™´’Ș®y4³æ ËæöFÑ–d.oö¤ QÆ·¯ ,‹Ø«ÍÕš&ƒw1:íxtn{ï~ùQÈ€«,½Ë[ºsVeUézol¥,7°1rxE²Ñ[÷RP =M=, }©ÄL²Ä—AdÒ f‰O> MS† ©ý~1`àȵÓcŒ¤×zEVˆÒÂæG»¹óaxÍß‘µ¯íµ>u“æyŠŸbÆáByûôÞ®2L¯(å«htÃÓ Ön~á:–æ6ðôÌÐ ïÇ#I¾Ö›ô7NSVð) ÿKn£_}ØiL¤5Ε NHɺMƒÚ¸0nùšk¢¡-âïªÜíùHWŸ*08Ë£sm³­²ËèÉ`ß&jà|‚˜à˜ÂwÙér«]z ÁPú ÿ)]m—ǽvfƒÄW½Ë}kK±—ë/!"9"‘a¢÷y¶ÊšühÝÁz÷*Ûi‡õxêýH2Ú!\r#(ërÅK‰EùQÂÛÍ­þÑK¥Ä7¤ü>“ˆI©·å!_SØ¿ëÄC¼YØ$B¯:È”xÝX…K?éR÷E}Ÿ9ó.ý0ê5]¹YA²«B?6n^ñ|:Õ\<2æd Kq5B2]¸¥bã¤÷yÌ)!… R&¦° Œ05†gçcÊÈ¢‘\ëæ³±®Ú%‰LüHtÊ1Y2¡7-0.áœâ=ÐLL€ÃóÆyû"l,Î5#¸f÷ziá‡!Äm¡Îò' è*îU ±0ñ>Ìcaj”]?¦»}®ñ ]ÝgQ2ÆØÅ°÷Ú¼i£Þ³ÀÝ.¶’à šé‹pÞ V>‚E]§Paà )ωÅs„ÃÇF¶Ìœ(-vKíŽë«D0Ш¬¾B2³ VOB|Œ.<àçBü ÂS· `‹Í'Ü”Tð¦`?¶ú…‹a–Š{Ëy5HZ`|ä€Íª†‚{4-‡ð!Ërah´QE6ça« ÜÍÍ‘Æ?÷v:’³C>-úìáòÌá1Ëó,­Ž4߀ï .܈î…þ^e~·=_þÃü€w{MÎÄLé.0–µÅ Û’h&€à ,r+Ñ¡¶¢Ž•cöÐ×v qÞ–,‚ú/ŠÇ¡Ýæ`6¡ãhlQHÉêâv1#(„uNm¢}$D¨ä©Jn¬u#@ÒIºÍxÞY:éÍìÒÅ(æƒç fwº0ætlöIá^ºJ´;¼vJ?¿L°`áÀã€M°ÿÀ¹’QJÂÌݹÏç)ˆm÷<À] ðǸˆ[à¬IáAˆbýè/nÈ%¤lÈðÿàë„Ayñ ¥MKaÞ牬°Ç‚sÐÉÆŒw¦~€qºZé}ƒv‚2ÝQ…éì$€G¨Nø~–å}îÌ{Ì—}Õn3°@÷ Õ‰ ̃Ö`Ð`„ÙÔ¨ÂÝ꟨%ÑRš€j Ÿl f… “ø ”‹àÎÒnp2,§Åºe¦íº39i[AO‹«0J¼}UÂóìœ iYò|%ЉM¸ù,év Ÿ°Ê^ üw5Ã$8 ÐÅ=¾¹¾¹«ݬ³ Lê`S¶Í¨SK½ÕyŽÐÐÂû¦®JC´†€a¬_SUˆ ÄVÀÖ»ƒ1Z$ ‰ãï øÍ‚ ÌþþYñÝ(­ß:• · &õ`4]­Ä4ƒÇ Š£›!L+j±±ý è[°„ì w¶c&[3ù67²-%|‘$£’ÎÂy]´­åÞrÅ—m2m:€´à¢ÒãN‘­ÔÜ;NÍw÷߃y:ö(»[… „)LÇÝömæÌ“ÖrßN>«Ál§¶ÍL³[W㘚Ím—ùúPmÒ•n›Í‹ÒñNºAμØW8¸¸|ž BmOYIï™qÛMVrœqÆQáÇ}æ¶';Ý®r¥'ä?NOHII‚µ®WUÖÎÊv†¢õé É&})“¾ÀÇ%¡–1´“uóØO˜Y· °h·}à7öŒ]KÛ`ïb×!åFVXªu£w;gÍöঈŽß£»÷¶¿êÂ0OÞ©Õd¼ôÓªÝLÞZÚ.õOÅt‡˜»²¶/ñÍtw«†ˆ&©°Ûd•š¿Íé´…0øª÷æçä‚Ú%êwŽl„z;(¦ÉÑ*l HVÁ@;ÔT q¨}c!™:…w(e…Aû§•î/ú_‡Ìvî5éÓ&†å‡~Ç#Hk´åŽö¬o(„€Êimá “¸B9~¬Ʀ«õA…§ëCÞ<'sßÒ?%³à¿¿Â<§×r½-œ š š½x}y¦w,B›ææs²hÊ<Ø*}P!a¼<ñ(—óÀÝb©¨LÔK­Blh_>¾üg¯;Ò€U½Yü´§¦uò´iÿCgÜ^CÈC«©Buâ+™üîPóú±ïÎj¼èP“m6m³ûR`Þ¸ endstream endobj 1180 0 obj << /Length 3076 /Filter /FlateDecode >> stream xÚ­YYÛ8~ϯè}Sm¶x‰Ò °ÀfŽF/2“ ÓƒY 3j›mk#[%O’ùõ[Å¢NÓéÙÅÂ"‹W±XõÕa~•Â_é•‘’*¿Zï_¥žê¶WÔx¸{ÅüL\Mf¾~|uû£ÖW¶©ÌWý´c¹Æ÷úx­µgbwHN­m©Eb†ýÜA‹'Ø>”5MrtÍÖ•û3<+XZ˜þèN4ͶŽ1¤5“bW×Љëæà5éZ˜Äº.vˆ𼃜ƒBÊïcgdœ¥ªèç6O¨ É¿á2þVë®ÅEW+YäL¦ä-׆¤ð%~n\è†È°°i×%H†KX7ûcUÛ õü9 Dw€C½af/@?£ ¶T>Õ–(ýÉ›†FºÍ á´Us ú¾ôô/þ6i¸÷¨ö6ñ\¶ÁÂlZˆ:Q}æ7•.*_æ…7(ßJ§ù„…ß·Cò§ª®©Õ6{ÎÄ.³©‡µuãP2:5Éû“{.×vœÑ¿Å§ kœƒ^ý…VÛ½ÙÀåä®3¸R™I6 õ†^ª%ʡ鰑 Œ!q<$WÉ ž”&Ÿ€+¼äަìmyhi¥çÁ§¸÷aÂûï4qÅô]ˆÕO¸®q[zŽO;낽ß58¶Ü‡HÊØÚVô´Ú:׸ö…×SBÇ^ÉíéxôRjÊ] å! fàÒ0-³Þ¢Þ5õ—-ì1=•ôónb{VŒˆô¦:D±à­˜în)OàébÊÐR޼U‡.Š„’‰¢¶ƒþ¡ Ž®ÚW]måº(˜,<ܽþµ:àHž1>`¦”/ TʤÎûí6êáxþJòÒm gùx¥9EŽÊsVr †dj" ]Ý[ä½ñ‹”æaÎÑ 19œiœ›ÊKW ‚SlÀß 7¼¶×õºj»`&Þo#X¼ó5¡IžªX~P­Ÿ zÜZFÑÌ}G´ðÙoàaÅ2Û S8¤ì¬Å! ¹ä}ÉÒÀuÏ¡HéQ&’×è fVI°ŽSöqN¹îNÀÔ¢öû!+„"+€õ# Ý€xkÛ¶ÆÉ"D7óÇœƒé,ÄYølfF•=ão©NÉ׊lk ð›þ­6$Wœ=žkp¿R-‚«¯œ<‘aüp²p՞΂›Ð ·Å+ÝãB]\9 ˜“6ù««:ëïbT6èöKœ©Ñðü~÷¯£¦R03¢+(6xö â€wò[Ê(n¹·Äýº ×°UPTh‡¸„:%}ÚÎU‡mX„º~´¬0"A2‰É(–‰…;E' >w<áWdh}1<©‰Þžºã©{ß9[FÃQç£Bb„ þ?ðÐ_ImWº.ôL@-l•QÝ2à‡øpÐßb¼@“›Y$ê´¨¸x ‡‘ÔøKQ¦t‰ŒVžINÓ? À†à-^RûK†aÿ€ÐÀG3þÑÌ¥k¨ Ð^üå¨w’‰œG½¨Où…ƒàÁóÿ«(ß<þxŠÏýµüÁ["4 P)¶ÀžÚ_Y©—iLKÔ>´¢^0<Õ’““”òõ2€è‚¥ØPäÇ:—Бp‘ü:l2Çl p&ÐmkŠ <‰¢DC©àÅØuSµÇºœ¸µjpGþB4ÔûÁÃàÝ‚ ˜ß§»¦íX,I…(RYÇô8£ôøþfUׄ2ãiÛ'±’OŠaf¨—³|žÁ¾þåî› ÀJ¯B>ÝÑ" \“C×¼Hz"Æ#ž€ ›²³,n3ÀÁÎø ýœÁ8 t>pðÜÔ5ÅàáL/ <óîç_V¨/æÃ^`røWpÒž=ë®|ª:DpΕD^AŠEž&Û1-)rÐäì Ãt0äw?üxÿ¯ÛvW:{» ·¹šÐêM£f:¤ªŽŽ³ŸíúÔaÊÙ;ñóQÁº‹ù•oEÏÄâì 2T¬ÿ¸`(±ž œs ¸(pü¼Xˆ ®žpý B€TEi¹`–ºÒU¶ÑýÐ"ó:¦µ:g$z68\úDÉ],ЀËeÙ|ÏhX ؈ý 9,JÍôšiĹFzâÑYtÞö3Mn¡hQyê&€Q–ùŒföÆÏ~†ëK!’’àŽi<¾}÷þá»ïïn!¼x®¶'Íå8€x6&híÚUG@)ˆÑ ž¼«m‰¥Ã17ãa¢”ÄM€¹æc v#“ž@¡Jq!ÕRÊÌï9r~ÿóûǼy >ÍÍKQ^β”Ÿ‹$l̾†? VH9Ãz)Ç ÞµEÈé|i†7E×\w+Ðwò°²”4â;yÁ¥Ÿ b=Æ÷g@ï)ˆV«^¤HR²øÁ!Ðô½çætØ ÇÄ“FAdfâ6](Ȇjgˆñ¼Îù"ÆÆ8-{_OAO‚ߣk‚A8Ì­üÐ(좩”ƒGF¥;9¢¶_ ßÚS»\¯· Á(±cÚGŒéì=z M}oí²^¤WŠBSœi û" ¸P_ŸS–õþÉÚx½¿Ÿ0¯÷«¢–¿Yòá~‚!¿ûP\B”µµašÊ—< Ð\Àç)ß—ë÷aò œ.¶ ?ÂÇ;â4Hx^¹ïšÕò¹cA"RÛ]sª$¶"å9̼à•[ún,bVÐü ÑÛ¿ÅÈÈsç‹x÷ÛƒÁÖaÒ˜•AçЄ¯í÷ðöîÚl*½ã²AûºFæ•6d÷@ÙS Hûï±ÒïÑ• ykë#qž„º¢GÕ·†‘ʇäœBNøNj¸Ø=X¬%”SêÓ@î($­)Âç}ÈÈ—\…þo™L™‚MŒó³7“™Aà½%IÚqQ‚% „[¶£žUøzÅñ7ÍBJ‡#øí|Ë’>GÌ2×§º '’Ù£ÀU‚TOAêy‰7[1ÕF¥ãô'ü¥Ðy‘Røxûø-Ì~×å¦!~YåZ†¿g€çI¢O’;°9ÿg F"^-Ìð#õ|å'—c™¯gvb&“ GêàtÕÐhCÅ‘'ÎK¶%Úù†‚Â$Ìöà _Èuúb$ŸØ>tæA½ÔÂ+;_<‰µ|ïn ½©°ø÷t 1”ŸïÆù»o!T[Û¾p?®&Û„¨‚ë¹irxˆ ìÏ?Dpãlm)_=@ê~úHbcì”ñO@[Êâ/üA¯˜ÌäWÿ1ƒK¦c¼O(âÛiÃÄXÔ½/Ðç\øã¬`rÜ÷µý³²î]Ýtñ³|Z‹ÿ–4K¥†I3ó3…¨=ñ˜~ÂJöôÄýûmðdž(([Ô_lûzàH®}ÜÃ3^à‹} ;¸°Áðâ6¬®Ã.ÿÄ$ž—˜i>Üžèrô¯Qƒšœ§T±ÂoGjV jŽmb +húMKÿ’[C{ endstream endobj 1187 0 obj << /Length 2337 /Filter /FlateDecode >> stream xÚ­Y[oã¸~Ÿ_á Œ ¬R$%ª- d§Óìt7Í uŠn›±…±-C”g6ÿ¾çðº8rÖ-Šï<<—ï\,fþĬà³\JV(3[íßq?ÚlfÔx¼{'º,\ Vþ°|wó­g‚³‚b¶|µ\Ïþ•|Ø–ÇÖ6ó…”2)~?_(¥“û²ÝÚ}ÙV«’&îšò¸­VŽzÕ¿*¹³õ~žšäke¿ÑLÝÐÌ£=¬ms_ÂBÁqB¨|þïå_ß}\vÄê4½òU¸ò7ž%„`Ù,3Š ©èeåa=_dJyr3%xÒ[³áÖ,eÆäp“ßµ|øü÷ÇþôxãšÕÍSu¸ÙÀ+Omµ»†lÓºÞìÂ)#R!YÊÓxŒ;=ÍÀšuÕØU[7/DBýL$!)¾áêS³òdÍiž1nŠÙŽšÎYW®mª'¸¿>°ù"7i²ÜÎEÛEâ,‰ë.ÔÎ:ìdÉÁÚ5µÚš¾HIžXê 3ð[Òg@žÔnË6¬ ÇÕaý@%Þ‡)gËf…òßzúy \åGØg¹Nþ97ðôìí,‘áù×”ôYÎ;ë\U‡Eð%É¥ËR5fÀ ²ÄK–áP`/ 9ßh힆QF~ÚZ²œ`p;{0©gšð|Á(²Ês¬ƒ9ž‰ˆŽíDä—P¢´20–"¨½?]‰s›V)r$R]î ¹+[Ï\}lj¯æ+»>5á„ã©uÔZÕG"Úþð¥gÀ±HmTäjp{é þâ%³‰ÛÐÏ-è•S 7På4“A•ÓLEAа;z‚íªz~¡é_¸æ“•æ¬0"ªÊýýíçÛ?ÝÞ}p˜Ò¬\1¥U\§ P• à-^å¶õi·&BìÁy–iéN¡¹Žñ”)©G耆(—æÝöþBÜîÑekw/s£’ïñÅÙ€ ¹Ñ!°±lšò°±á”šæËcàÓàxš9’Üå>  dG+ð {|ÄbJLô²";4 Nà&û; šâÈ)iÄ¿¿¤g"N‹”eÙoc†`&“Ó˜Ø2Ú˜¿®Ú@—©b:•“°@öØe§×æK&ºšeF 5ELÍx0Ø‚ب='ž™¬Ðýw?³ýä; ËDס#qt‡·;ø’lÂÅôþá4)ˆdN¨Þ¯l;Z›zÓ”{7 à€¡&^ŽN×Ëv‚L¥™Ãþ~òÅL©ÎrßôÛ`¥ZéÑa³…â9“ùXnNL©P n¿ãÞ’‚^$»{ :sa’%Â_ÀA4]Òëô:bã7œÀ ÆüFìÅ¥#ìíO õ€õÎvë‰ùá<¨°¯¦iÂÔEfOó‹È*h% G]ÎI—¡3FV\øìÃAhØ_íêÔ¢Â8Z{ sSnXžw’ûáÓß.€­TLö&ÀV›<ù´¶ðúˆ{²@\ª‘1zïЧ¢fÔ*éÃÈ!Ôz®gi÷d¶ àP¶v·{?©ÒÏ©B÷ðr»üq2t³“Ù@1Œ÷ˆ’Aÿ FN 5x œŸT-‘߃íÎRq{¤ýB脞Eôžë":õêñpfÏ«‚Ë’ 6gz¬Lß ˆ ?O5` 9Ü )ÚãX/¸)à0 3}HwsrÍÍ®&aô>õ#™îMÖ+Üqr'ÏWß ´lÈÂèÿšÆˆøºZYô¶²nC xŠñ“)äÕ9EyØ ®Aƒâœ€V¯tÞ‘gfÀÈÌ÷-÷‘ ŒãQ“ÚP®Ò«ýŠyÓ¯À øÿæW@ƒÄE’±Œë«|¨ºê\Ÿp€±#ªÀ´€ç2šµy#TöiŒÿRt•ñ·0Mð‚©Þz.ªÊÔðýAlìƒ}¡ß˜¸Ñ`3½"zÉY:æ ÞqráMU¦vÁ¶¿P7h¢gžZ'‡öDf­Qwó‘Š—O®ÞZô’MbLì| žcGT ¹uø¢{M0ˆ"y²-1µ¢ÐÛÄø–[×Wèê QŒ÷k(9¦ Ô]²îBõ±í]PüK1î"n¸*è,-ÌèìǺn¯²©äÈ@*XÆÔ1¼ Ø=@ö:Ê¡Q‡ùdÚÏP¹ÊÿaëaŠt…a¦ºš/¹a"Ïz ³œŸEö$­†šRŠšAs^’Z_,cH ¯¸. 6L÷`Ü/^ásõUSA¹ZºÍ[¸Vãè'Ü‹k)ooqMäœé>ÞzSâ © 3zœ©úAÇ*ênÇ#îy$ä<ÒèðEOÌLJûLJ‡å¤ú¡ë–@¼ç@÷ *5ȾÈÍwTRj¸~Ý=í™B(&°Ly!ÕÓ}´‰Ež«it_v‰®¡" U{š0XÆFWN‘žE“vY0­ÿo¾n`'ÿ¯ód_€ŽœâÌÕMÈï>Ñ™]`YÀ…ym~“Ëy¥,¾´ûÇŸÿñ§©Ûä!ƒ3æã¤Å8—ƒ|| †s0gu•D ÆeqnÎÞ;4å¹Ê‡È9å) “½ÈÞô”º_Ò…êJ(˜ty¼éóøó¢K ' úÝz:é‹$:E‘3.ÎüL,dÉXÇÆæ¬©y$õ ócRJßÂüÈN+DªBôâøúë¤ðs&Lz^È˳X$UÓY:N`”¨ãàY‘4à…U:ãB_ÔtµK#¯ö@Ý6 Gè®J*&†Z.ÑF^ÀV‘œZš®ÂtzØ;«;jÿÛ‚HB­ÖôëBøK(R ¢ïI•ýb°äåÄCÅ›ËébŒ¿R2i[_Ïæ ØŒD7í–֮뜻 ‹°Tó9¿ˆÊ\Æ< Ý¶-Ì»Ž‚nzÊt3frUæ°ˆkÇâô†K)U}U7èƒXü5ì?eÙâ endstream endobj 1191 0 obj << /Length 2686 /Filter /FlateDecode >> stream xÚíZ[¯Ü¶~÷¯8¬¼´(’ºEØqNOàýFZ4}à‘¸»ªw¥.>ö¿ï ‡¢¤]­í ŠE/9‘3ù|Ã~Âü& o!X&Ó›üø(´ÔfwCƒ7·¸ã[ãzÂùlóèé÷JÝðeaÆo6ÛéV›âæÁó½>u¦Y­…¿Y­¥TÁ]ÕvúpÐ]YW«u”¨0 ¸LWÿÜüðèÅÆŸ§¢è+CÎ É,aWÒI§’q!I2®Ö*Žæ²€ Q2Õ(JYz³ŽKúðÙ»ÛoãLu8]F1Èc¹6û²…¢0hMNz*ž±î;"Ô["º3ÌmO·»°4þ·¦>~(ÍÃ’Š3™z ¶õáP¯¢4xpgv{CgÞþôn½Zó \ñàL{ÐôHÀtk.W´Õ^ß—]û¾áR ¨zµÎÒ0ØÕp{i`Zœò « †Ñ Õë7/¾¿ûÛÓv¯ótç”yº¤ ›gY6|8œÞ·èNxœùhò¾Ó÷:?¼r>Üd!ÏœF|&Ç}Y-GggÇ" NMùa¥â® ™ˆ¹*‰®Z¼‡gg&8”÷øýŒ &•8>mtS©öÊD3žð¹‚WDI˜‚x¸dñð$d©òþô°7YÚS€vq<ßsi;±ÈûAaªºC³%ƒg&Ñ¥GZâ©1¿„\šÄÜžÈéòÒR ²c&²xæ¶Û<%áÊî¿ ¸,¼16¯^¿}óü»»7OóºÚ–»Þk;¿³8ò7ÒæMyê8§Êxðú`t‹ºð‚ƒïþã(š¤9PÔÔïµ…´Të@w{áË<™„7»êQò»ŸÞn¾}ùrQî0e"M¹uU,±‡üÒ$ncö¹ô`™cþëóíVp­-fœgé&‹Y†Ù{ªP >Ðô6m¶ÌÝ/ܕ¬¤Xœ¸þóm'¢,ø„V®{š5þ¦v^’GѰ÷‚J»qU-}ˆŽ‡+û2GÞ=Mß—`3;¤Œ9ìZ@«žªÜ¹,s'@Šö›8 p UKÎ ±îàÊ&l˜Ð†09ÛPHò\jë¾Éݸ(Á‚å}OQ„”º9c‡Ô§›O—ìdp/ÕÄÞw¸U"ƒ©L£ŒD*ƒ‘LÅ„IQW;âÎ!ÓÓHß“ã÷1ù@(«ãpßLoéqK4¯îI_ÆÉ0Ú÷u(èˆé®[¹® âaï­mp0ØÇsÛ¬8a³ÄWΗ¥´ô{DËôƒ+!²D‰×‹cë8øµ'w{ìÃj·×ä'á\vp½Sy à · ^ï˜AÝÚñt Á’dBƆ25%‹Õ€•Ÿ¡%wa.iáà]U~¤Ñ³Á¯`üÝÔ —ÁU’aeβ¯ÀWÉÿ¾Šk|ÅÿÛ+úÏð•øCa«è÷ÁVÉ [%KØ*†ýaßëðJý^ýîðÊ^ìo¯î°*†|,®2ŒÎÌŽËÿêÛŽÖê{8¿Óee "hâÈëò¢™-¶°HžˆÂxŽ[bõÄÛŒ nÐ~j;s$ê/¡ _΄cúO®—ü··w2¼­æ˜te˜}½JE`—¢Àt9ìÇíR:Áð•ÇÀFhÆÐ&*YØ ËM_á rfCµ õûÍ¥oÝ6cÂï±FóŽ”(€R±„¶FwTˆ–T”Ç£)JȦ,Å* ô–*¬õÕIÒ :«eGK÷tQK® Ç>cåÅrôBFõ)ð±Û>!›À1€P” ”íÚâ\'$?¤lݼ¢9™ Y­„'Üz±E€U">ËU»ÏD•T,å>l]4HÎÉ~Õ~e€¢),6ã¶ZÒ¶?>ÑÐ÷¸>¿x¤´î ÒG5ã$×îë;øA騶 ¶HÑ•¥ljF·!Dct¤«a@íXÓú”]ô)K¼C!3\”¡Z¬ÓÔú W ,¥£8dÆIê€zÒMWæ=DŸ;c 0Xµ³g»šNëöMÝïö“¦0fµ±¸!Æ=5T rSôý¥o‡ 3tD5‘(ô,ª6 Z!<¤¨ÓAãµ¹æéG V9¹¹&®Ñ'hÛ…NJ(sÜ=JRëïøë æP»PѯƟYà • GPUqGL¿n+ÂSMY÷Ž0T>Ú¯r´=%²aç’8\P^u¡3çV*¨ŒÁ‡Ö»áüxÝ•GlÓdªà¨í¶wL–Y:¼‹/ ]¶} ÌGÈ\•>Ðìè—Á³Rˆ‚;wš>Øø‚ÑÌ—®RSs-V!È$-g¶GÂCÙíi4ÕÖ*‘2Ôуö@ñ’ ïÖ‰œ®œ!iE«¬! °C3kß›-¥ùi…Ä*…&®µ[Oººu Xçg¬j†X³%¥)Ë!š%dÙÂØÁ¦Ž–¦™lÑöÁmGq“êég HV)ÿtûâÕo^½Ú,%äõÀ|¦õ (Êe‘p- Ì$5ÚÙпgb&=LsÈ fñ v¨¾²û㙯.ƒgž7:­çÀ}E²è Ècå&œ&§…b楗o8×ÓÊ­ƒwËÓi%Ê.*‘}}²lN¼†¨©ÐÁ%T“¦ÑÕÎÐÊ=Äq]yNbɤˆ¿ê–tU|lX¦eŒîð°H"jW¢¡3’Ù°uÝKsÔ•¡ÈÃç!(9cHÄaŒo7•Ev!ÕXÖôÓî-‹0|(+dˆã‡'‹šÂ¡‘H¿€…ðb<^²Õ#õH'C t8©8N÷%Ÿ S²†‹^7! ³Û8ý]õDÜ ûd3Ÿƒ„Ù?m½‰ù`¤Øû1Dù´:y!Å©K~¶€ÀÔ†#~9/͸äШ=¨%Šd,þ> stream xÚ•ÙnÛHò=_ᇡ€Í>È&“ÅNâñxwe±ƒ} %Jâ˜"5<" Øßª®fó0;`UW_ÕuW1ì̃ì,òΔn$óåî§±åæŒ€û«7̬›ÃÂyoåÇÅ›óŸ}ÿŒynäEìl±îµXýÇù´÷uRÎæB‡yïgs)}ç:¯ê8Ëâ:-òÙœ+ß &£Ùÿxs¹°÷ùœ¿’0\ù2eA(]&$Q¶gÎ@ûÌÓ)\õŸæ+$ö'zà Ìe³¹pçsRÇi†§)_[>þÒí|ÍÓ'‚>¦y\ ¾¹là‹Ùr €{Û4çã׫÷S„\Irkõ ý,ŸƒëGéä³Èi‘æ6ˆ@2±Šëiq2 Öé`Öx‚0]Z ÖE–i>˜;5'ðΫ/_çh)ØÆ8bs…«”?ú6~HkÌaƒ8 ¤Æ³yzΦ 4¥Â!ø8i¡ëY7vwùóõ¿Ï«-„¥óyÌù¤‰pߢžß¢Û!‹(éºÎ’+"gúþ9÷¥ë±hèë æ&# Ý NúmaDŒTbH¯øI@”gшYú€û_`Â0ÈB`kë4†|9\¦Ø(Wš&"Fgæ%“—+ÌßêÓé¯ ‚á™SÇIîr««¼²Mµš©øsÔÈ}™ çHžhqµ'¥[¦»j]¸ñhèÆ×hŠbä&— ¹eÆâöî·ûOŸ¯ïÏ—E¾N7}íP"àn%R-Ët_ƒg~Äœ»,‰1CU,•Cˆ‰‰šŒ¬¦x4غ#R#Z79éÛÏ•2Šº£üúËo‹‹_¤Û ]Úœ#ÎWS`êâ±ç,1»ßs?À7êÒ#Í}æ1†®ž9zœ€‘»‰7ÂZ³ÿ Œwe£Ýfåù‚¬|¿Ÿ0/¦… ÁA*û9'ÕQ‚Ÿ“C9BæQW3l 1tåÙzž<í³8!PÁcŽ`F…ΟMe6—MN@jÈi½;Î+]1¡ÿ Ê[ø«Z¬÷ÖXFU¦p"<Õ…%þ&%ýjç¨8…‰• …€Ö’Ðó& Æñj—æX"áKÌBM*ÐVÒ:ô·fú°-Øézõh°H$ð·¦-äzÆÅÛcNш‚ý®(Û5XûCUdMmFû¸ÞæñÎŒtUÊ¢nñ¨·S¥ 5-èåÆËåÉSP€•øÌzÀÍ÷FdÙ)Û6!î/|P>*I±D–|VK$zK$j{Êèèq66´¢×<1áuG~ÉybŠªK¶®O§oex”9‰Ê†þ^ÐlZm+šj¢ “ iYä»Äz-é?SRì‘éÎBWÓå¤tò$YUX¿)Eõ›4õü’oÖ•bw”¸eÝyËÁ%¦ZÚÆÓ„µå[8Œ½°Â&WV÷¦³0ÑÅÇN/Ñ‚þgêO·­}Sã“Ûˆˆ³`d¥AÒzkœ8ý¼;w¢&E¹×Çë/[LÖRÒA¯µÛ|®/aªg zx0MFµ=ʦ)Q‰¯Wtu' âÒ`mQoáÉ|BAµ¼Æš$ø%%†Ö¤oj½8’Ø•L&ý‰ º †"ÆÂóÜ$PÍe@AVȱ c° ²>i:%X8gB7NÇÍSš¥ºÔÅá¾,6e¼3ëHí¯«xl®ƒ0µ­LÍ4¤Å6ùòYsÓP­•aŠàŽÔ«ÜÑСj±6ó ;%ô®3«S“óôô³²+€ÚÚ¬I;¤w“´‚šŠ®/óÍã埥”:ÿHQó47ž¼±ô†uI+ +;¡àH+§Ôo1ÍkÝ}Ç7äô{"¿`!D8¥,á?ÒÇ• `-?´Åeèúá8A_Ot¡»Âl}övÄ@6:Í('_á3ðÖ½Ö?tòc×òÖ¨,Y×ýv“¤Qq}ºã4n@‘è…þÐqÝ\ü°ã’Páõ˜€C㸤ޔdSl€Œ•föñF‡<æå ï¹‚0j·Û5CÒ›´<¡<âã¾ïI‚Z0x®R§:ˆªŸW y“ž:*qÒðƒöËFšÃT«9,{ûšÃ¡*GÐ{•€d_s¨ÿp4Ú.¡Uï6ce’½Þe\õ[çgSšD½Ë^OöææâîâÓ?/®.OÐúÚž¬¾lhcÌÆEÁpcÉj£¥YºuóüQÇ åä¬})†F)[ 3]"Àºp¡÷öh˜O~»#½÷üö{#@ºQ%qIm}*tü¶ªñ{$H2†y³› öÈÔüfE¼ª>PÖØûàãS´£»¸y‚âÁçBflÎ)i4 žûbD<.i¿:#l»>úS2btüõMÉ€…ó¬1C¬Úù©<Ÿ3W6\¾½;«ƒŒK±6<ùü¹:QâÄ)ò N†C5ðÃν)g–°ÖÐ×Vº„Ê6=0 XÐÊ{R™ŒÎr†ÌÑZËùà“×}&ú4ìB×}ZÔŸ¤`ú`³é>³ý@Œ¸Àˆß{¸šº7ø¿-þÿ>Ák endstream endobj 1202 0 obj << /Length 3267 /Filter /FlateDecode >> stream xÚ­ZYÛÈ~÷¯˜‡áVû`“Ül¯mx³^žY Àî>p¤–Ę"’ÚÙù÷©£›‡†Ê8H`Àꮾª«ëøª8ò*†ò*¯R­En²«õáELÔvwÅ/ï_H?oW“™¯ï^ܼK’+‹<ÎåÕÝvºÕÝæê—è;8ö®½^i­#w½2&‰>Ô]_TUÑ—M}½Rig‘Lâëßî~xñön8/QêÙÏp&M*ì•ÍŒÚ0sw{×9àHÊèx-£b}­Òèëub£bç:(ZšG›²ëÛòþÔ» Êšgô{‡ŒÃyvv^– [àÎúÓû·Ÿ>~ùôéîæPÀ ø¯\~ÝœOeD ·ðëºÓ=H(ƒã[·î›öñ¯¸èj¥¥Yb®VR ™ðÜr é$z¼†͉;ݑֻu¹}dJ¿/;n ›rwÛ´‹7IR‘¦&pôñã«Ï¯ÞüãÕû·ßø²tƒÔ“ Ó_ÂÞ6Ž`k:ã›ytÜp‡cSùÚJ+¡Tæ¯-½ŒàaêÎÏ/ÝÁä"Ïÿ§+ <å”XY QÁ hÊh ži¤/ðÛï ¢LÞô:Ó‘¸^¥ §wØfaeÑ¡iߵ˜³{o\_”œ­3`õ$‘öÜ'n±ñ€â+X†a¤ócA«^%GG¼^†×Küõpöº©k`˜§ô ß»æ€s/ÝJç:êœ;7eo}ZŠD+2f‘ÀˆˆsøO*²ê9ejÞ¼z5Y~ÙÀýÐ-pK.½O.,6LôËg’H¸!= LýÒo/yÙÑ‚û2öüZ:Ñ"Kõìb—½T˜ýÌEÎ7¥«VÓf¡U8s¥¬ßQƒà²”§ÂVêz•X½iDz"ÛÐ)¼d½á†¿ç0ÀºÛæÔ®}û >°%ãî÷Áÿ¡@ÙdÒ)×*¨ž9¼]Î|¼þùýwKÆnÚ¨Á1Þ‘7JT jã_+‘`-žHúŒ„fË„MÑ;±è¦ p`uØõur‰ƒD “ l›ªjPü™$<óýO?¯Ð4J°‘iÈò®Hƒ[Lfx_Ü—}š#¥ÑÈ*ØSƲkØÁuØ•h;KÆ*põùËÛwþyÓíÁ©Üìüen–#FÎ-Ÿx+:ýÔaÜÅãÜn}ê‹ûŠÏ/œ¿R‰±ÌçNÆóq_Ö‹‡[uv¶Õ*:¶åïdX= 2Õs’T]”@"R™Ÿ‰ *ïqý3BÐ)¸l}Æ,m‹¶„S9h*+d*ç¼ÀJ*’1Œœ,žÆ‹}zØ»vh¸µó=—¶3ã´«›Å–ÍLÕS$â±u¿ÆÒ¸?xòU‰ºñ‘ÄZ¡s;S[ š«T&—°Œ/£aÜ}ú|ûå DÎÛrwn;i…UËtë¶<öåd’Ëèså B©´`4?ð?O)˜›Š­¦ùê©ýÈ$ðZ¿í]–6~0GÎ?üt{÷êÇùŽ3¡³€¡Ó\8lÕÆò©HüÆâ?¹€ÈµýH_Æ%"ȨCÓ#Ę»›ÜŠaîôB%è@{"·Ù ÿ¾ðV z%Œ†æbK!—5·Z>ÇEËh;×s£ó»  ½n^l|w3DA‡=ÝnòxØ-zqÞ4-Ó™4­ŸñPà»ôæ ì !ÊŽL ö*¶«p‰“”a£©«G½]ƒn˜Nó3e³'†v6â©Ãx¹ðœ*‡œLãNÀC¼Ùó©$!è3 w=çE~à€ÆÁëm€¾&6OÏ àä@W£= ¤X|EˆŠ®»E½Ç‡ïµÜPim[à™Z…' ï¸êPÒ²S¶é?±æß=<4-S´R‹ç¢îð@„ÍeÆö¾áj”V_z¤_xmÀ_Ó»zp¶qÞÇÕ3@c…4à†Yçtôµ$àƒc[þ]#?ŽNϽ4h`Ôè Ž ¤ÈÖ5(ä`\?›-¹À`F=IþÁHê“ÍÝ=âè`ˆÐØžªŠ[Gìuq zÆ×™Nù”ʈª-›“?¤SZ ‘ ¶ÓQcí`úRÅ3 Ðæ2ç)µs›Ž›,b´¯ÒOoO!öL­#öÒzí¶ì¼Ï¦¡·óÝ¢öY)õÖ”¬„šŠíøˆ4Þ«©6~Èmðx¢³¬‘ÈRX† ‘dZ’ùê¶àšº›ÃWÑ•`lܶ8Uý¢»Y$ƒmƒÒ(è>Éã$°Aí !²Úù¡®9¸K%i‡=‘ŸÅÌI‰ÑS}`TÍø6ËçE¡‡}Iº¿çø;/µh®Ä`Ù åžÛ`Æ<Ôo ¯1&‘þ²8^Öëê´¡ A(Û 9ø)?‹ý.6VDl;*ݰE‚f)Lna@Øs?gÈÝJ´ã:ˆãNÉ Ùm°†“ål8päjIו÷ˆ DC›yË""Äi-þ÷bBU82‰oïZ`±Ç@¹>Òám-—u’{‘!¨ ]ÈÎa`ŒI0⣚õ lD?J‡G9ÛªΣ‡Ú0õ>Ôƒ`Ä1ôF‡†C=n˜mRû3÷nÁuLƒtß:÷’D×xÒÞuä‚@žè)wÏšEÜsí„L’ʼnŒã4%¶›°sÛœv{®yÁ”ñ$âè²W" (';¬BØò;ëIº„Ö±A >¢2>Ú©Ì¢×>Hw6NôÒYxifHÌ8­s=SNGþ%8¿ÇÓùF  úÿÎ| ò[¾D+‹Ç4Ü÷‡5« ¡¬ôkæ)àü‰7P©œ¢@&ðW@&4HÝÁ3 ]þâó`ˆfštw²&d*$,L(Zªï!Z¬{H;&³áRÀqLò~͵[·ì|æ#A\Vö=rC‚KÁœÄÉñÑ[”2*u:?u~"–r![ž† ¸ ѯ±ÒÿæóÏËPØ!ó%/$QÃà‚-8>µ쎒÷e8Àœƒ²=,ò¹«ÂBJv¦ÎAhl ÛaœàAÇù€Ç1m´=˜ÍÆÚõ~mÛõÎïÉM°|eŒaÔ ³˜Sü×*ð˜bXb®NdyÌ|HàÓ–œ& &(å+c~É5²÷Àœ§ ήô¸+¹LæNzß—›á¡:L®ÏªÉæÐñ®Ïj¸Â0:ºC«fîºg`($«B`SÁyYÅF4š!ÍÞò¹l†”•áÝl—Ëà.~ÖÑ8ðØUÍ=8ÛE­6Bå3µN;Alxo¼üi)MžµI•Õèæ·÷ç5µ'\’ðƒ‚-×»Tš@Φ碀g:ý±ÈN&¬¶c±taG+ôPÓxåõí÷‹µJþbóu»r± è7“ß¼ËþxáV šÙµÍj·^/^ ’rùìVf¸y×TðžÝÿAB§Ú4YÜH‹±høkœÄä¹$ù·'J<óPDó´O·Ø´‘A4ÙF$ïg-(‰šù£[¾ì+™4J˜±Öv6ŽãÅÅm§ux­’è‡å\dÃŽEuÜÏë*ºW#Ù‹)’—?ûW+íëtÔ,xÒy R¾C²!66á:@©Ê®§«˜ˆð݃qâ#>ͪM„2gjòŽFfÌ]>пå¿Òé¡-{?­XNAqÆÏXºþ vùû¢êä"?P È~d@q:oð{'&kç™(¶ì”MpÅ@ãôh‰#›M¿ßGY|Q+ìøò­L,Ô3,{é+ Φé2ùù 嵉oyòç×™‰<úÈraé/*Æ`©¨$û 9ÈÐ AÓL¤$:ÂÑøÊ(¶ú}Q‡±@:SRë’ß1ÄÆ3ÖaT–aö÷.„tB‡5§Ë«9,Í¿mê â#çç(˜Ï_¨ìå"·ùó°1Ïæ6åûþ¾‹¿^Ëð¨þÀÐF0?“{™¬|’× Ñ¿–ÁdÔ·ìCl%ÙS­#¬5ðÀ]®“OrZãË׿—ù‰ðWÿÁ‰h endstream endobj 1207 0 obj << /Length 1212 /Filter /FlateDecode >> stream xÚ•VÛnã6}ÏWø¡2°fÄ»ÔÚ Mw4Á® tÑíƒ,ɶÙrEy]ÿýÎp(ÅÊ*h æÎåÌð|ÃÏÒxf¥d©Jfùî*ö«ífFÂû»+ô ¸¸Ðüiyuý³Ö3³4Nùl¹¾4µ,fD7ÛìЕí|!¥Œxüí|¡”ŽÞî]—ÕuÖUÍ~¾VÇIÄ5Ÿÿ¹|wu»üi!þc`¨ùï‘™D1.EökÓ•àÛˆ¨ÛfI»l?ItÆ™Œšuÿ=(ÞgOø¹üsU—ŽÛrùyņƌ†Ïs­£¬­²U ätY`š¹ŒN˜”©DC6>¸ûo~Y~|¼ ª£D”f OzÍïÀrb ÆÊ ^ÍØkWÖµ£”NÛ*Ƕhx¶\3ËÙ‚KÆ5ì<4©Ž›6;€G3wvˆ v4Çìq̛ݡªÃÖ»²Ù¡ÁÏUy•4Z7-ƒ.HÒh¹sp1‰†eZ«>ÇÝûþæñ·&ÑH™á¦×*ã,»™ÁÁoN…eÜ(8™;cèÍ0–ÖDôª4oãа¯§óÎ`±ê­‘‹úXÒ•”ˆ^é ÚKB-Tлu¡Py…©÷ÁPG£ûøÃŠÛ6Ǻ ½ÕPe˜„º¤6àÂbRŠ10¿Ó>Uû¢Aó'‡Àü®à*܇-%ý‡}Ž^ÛCJ“mæc›‡ `%oö˜ÈæØú@ž7´4s õ¦º¶ Ò*œZ”Ë¢êªý&¨lƒ…n£Þ€yÆ¢ty[‚ÇŒ¦ÍËØ²} é3¼@š-¸å±w;Qu­XœÚ¾ ÐÑSU1ÓfhýˆÅàúAð”gû §&©*"Zš¼èXYa'CÌtî1‡©i&$NdöTR ô&2±1‹ù.œž5Æœ3O<;ßÜÝ>Ü¿xXNùhM:Ð@QµeÞ5íyžÈÙF¤ÑG”6ÔãaC!«]CÒ3ïÙiRâÒ0ë¯!x%}%™öâøŠêÖ’·òïc˜¢ôwNWŸéË_G`—)÷q̤IGî§Ú‡Ð{íBŽ}“áYÌ'·ñ©ê€ºQm¡%Þ„L}_I…ÛÓÒøº˜ŠÛp¦­ù¿#ìÀ|ðNè_þŽÿa/ÎBÕ¤q œp½åVÆP¹•±ÑÑ•$@½è²ÝtàB²ä¹€¯ž°8b„$G–«àuxUxwÇ•ï±çézÆò‚g7/5”èÞ=“ eäÆ0kÇw8„pÝ´c˜©€ß!kC‰ýÕ#qƒí¹¿´£-»†¢>Öå×40 ÆŒâÏ …“NŽV0½É€XŸqhÓÁ>­+,:΀»u¶q4 $ÇÖ.îÌßÜVBÇZžøÛ xíÓaªâcbÁ:רk€Ý]Ã;°,ʵc›ºYeõ4‹ÇLiqñJ“V¿ÆsÂ0Áž»yx\~˜²)ÅåAzñ”Á·õ†'°Ë÷¼•mx hâ–Cæ\P:M:eBñ1/ÐE ípCí˜$ôȧXÇyÿœõoø/±Qa endstream endobj 1215 0 obj << /Length 1228 /Filter /FlateDecode >> stream xÚVÍŽÛ6¾ïSèˆhQ¤D±§¦AwÑÞÒ¹´=he®­Ô–\‘бoßí•ä ’,r83œß#’ ~"1Y¢¥äFUIs¼ËuØ%´øãáND¾Ó ç/›»õ}Q$"ã&3"Ùµ®ye2æ÷–óÜ %˜eaSæÐÖÛ·Ëdå¥äÚ˜¤”†›.^À „þDò6§Lx‘N¯âTˆå4¦ó+‚'{ïO?I`ð??¦bçó™¶C3m‡‰óµoûî-ÖmÉ:{ÆR‚ÕT3£§ý«òzèOÁ(Sw[b¹_ ø‡gˆòWVd÷ØñƒýwŒR‡g<ËÙ;÷O(ç(üa´ q #ˆãÐ:O%™Š‚—Õ¼(óX”-ÞoŠ’ÙcÝpY„F@Rˆ v¡Lu(Óttvp?£zÇ]?…vØYÞYOܨ(4;ê 3Ò­Üì[,ºôX8IµÎ #Ãçª7¨ƒV¡ñp±m]3:we©CxžiÓ:7Ú¨o°˜Ö-mÐ1üŽ/‚óN…. *Åú`idåç*'­¤¦Øàƒ\š°"‰uà ž<î™È]ï-œCg#¢ìéè]3´T8ö Qon®U &~¶¿ÜßÅ3ß/[ *Š—I¡xPý0Lt:¥éæW„ í&!¥jICÇÞŒŠwœÚ0Ÿ°¡Á%–l…‘ ká˜Ì¯„œ¹öuô¸pÕ¥Òà ¤¶È¿#´ŸĵЏ4*O$CO>ÒæTï"C}c¿Ò†\ýïÔ\äo=šaøòšŠ‹" xø˜¥æ*Vü«}¾Æö<ÖÝOÛî©__0Ÿò}ã.4¼PyRðJgú[`¹Ó ûkp¿PŸ\†ç¹&È“ñ1óÞ÷„¥C=”+xt[lÃ\šÖÏ´›Í[ý¡ßµXÄ(€Yó\¡„ú>5pÒFu5m›©e7@32¹_ƒo\½¥õièwC}<Ò´„¦?ž®èˆ¿¯£œ=ZHh| k#ÎL&Ž]Ø‘Á¤¼·ô€Úá-:*Ø9ŒZS¤¼ |³ÁfƒÐµ‹›¡õÞv--ñéC¼èèØãȆ+,¬áX$T׿ƒ3j¾|š0ÜäÆHëi¤Qö2W½ê ô2-Þ4ªPŠ˜+‹,çJ”?Ž¡Q>(x¥Q—×¼4êz ÓÇöò¶ÙsÈæÍ,¨K®ó™…_ï­È|kάµ*_: ïýò`03 endstream endobj 1224 0 obj << /Length 1522 /Filter /FlateDecode >> stream xÚ•XÝÛ6 ¿¿"os€ZgIVlwo[×C÷8†mª£KŒú#°åËúßeGöù¶*™¤HŠ?1Çw üã»"ÙeR²"Íweó8jÞÑæ·§îåbŒÉŸŽ•Úñ„IÁwÇçPÕñ´û3ú¹k÷"l_}mÕž÷±”2²®iôdºÙ/•¹ý0ïƒyÙ‹,2uwm ÞǼÈxq%÷}øå8»¤„øFßQò•ó8Ÿ1ÁUê?ä)ã2½;/ùÂùL‘ó°:祸;4tNLÎãaôx%£ÈYRx;Ÿž÷q*‹è+Þ¶éC÷†6Áôf°æ4ÓÜZ¾ /RÑC·^öà íO[aEF燹x¤Üôb&'foÔ“G¦×5Þ ¯Â%ãŠÓUì¼ð™œ¯ƒ©.uKÔS÷ÞT¬à  ÞæÌ+ ƒÅ;ä 9™ß÷¹ŒºzôA1=i½öݹ×M3—ØÍï¿l…Ÿ§œå‰œT:«à‰§:—‚ÌÈ<È ~¸X¸ .ùlÛù‚äöD›Fq±šÈ´V p‘vL— ³º\q寳‘È9׺´$é¡M‡‰Zdƒ¼?J@RðHöÒõ}|FÞWÜ'ÖöD±C)ZÚÎâ:¯€‚)ž‡0ž"É!‰‡)žhMÆã`ÀÖFrÉY1É7ºªgÛu5X2úW¢’Á˜uǧ9G=;Ud,=¸¦g XÐNð®û—”¦ãñý<ÁØâF+#ÎÍ‹µ×÷T,2K˜D5añ£ïº±/Ísן k}Äë5º}DnÕ>w¯ã³¸Ô;OÅN¡…ÿFµI:Ä7`y­Ô¹ æ¾ö%/˜Ù¢öÅ7tã ïT”Ðç· PÇu –°±ýWú:bßš¥/mWwçÊl–ÏËò|Ý›žº€‹Ð@‚Rl5-¼#ö§¶dÐG©Œª(šh«a¬=¼‹¢ÂÓ¾!ž½hK»©e«“Hεc6_(¯—åªpt¤a¼Æ[0yÝÇžƒ…GŒ =ëö HC)¨–—ªDûȦ' !pJz£‰DžDòq@ÍõR• ƒ/dTmY§I£Þ€\¯’G½nÏ~‹úq\¸{xdÐ/Ü^ÖÔÚ½UøAà‘;op¼yG!ò>xaxÆhàCüºý *¯,=gF¶žL¼ñb,æV)eU¦ó>_;½ž°X—ƒj ¬ii'ú(ªÆ½åYôSH q:7˜ƒŽY}£}qçÈù§‹çFÔ߈®ôápÍ ØÌ´Óv/B&,ÄK¡…”ߎÓù8P°Žk3[èwa%Äuå¢<ZÉ|áâÛ8I¿vhk¥áìMÀüÔ…ñp]ÿwãE·_?Ùäè¿Âã:+ endstream endobj 1300 0 obj << /Length 2818 /Filter /FlateDecode >> stream xÚí[Û6Çßó)Ü·I[3¢xMŠín³Ø},æ­èƒc+3F|Øž4)òá—¶Ióˆâz2茅i.äùŸœÿO¼èÂÐQaþ£#]ŒcDój4]¾(¿»¹òÛ^PÛnlŽAË_®_¼z+ĈDšŽ®ßÃP׳ÑïWo_Vìê~5ÝÍ׫—cÆØÕW³ú“ù)åJ\QÁ_þqý¿¿^ŸDDYöÌfß²•Ž2é(RšÀ6YqBwéhÒ1Ó19»r¸,÷]Í_•)„>öüîØ†ÑQE´”Ü6¡{uü»MHή¶·õbql^Ö¬"¢R¦Ó¡ñ?^Ž©¢Çÿ•_ÑôŸý½;†–’%èH²’T¦~{S‰0F m~ åÁÝæï@›]ÿ1p°ºÅ E5¦”¶’QŠÅÉà„¹ÖÝÒAȃô-ኑ²ùU°ý»S DŽU`í*hEŠR÷­‚mÝ’n^0ûk­ f$PGÝïÓWÌ÷í«D’‚‰ ¸H¾a„<3ø˜*³|ò@”<×½þ,K0™ä…Òfm’'„&ZXÝÒäý0÷ˆäqS[ƒV>y>Nžm“$$Ó‡¼@º5æ ³ÜÐÚêŽÓäò‘¼‚“¬PóÉópòl›$y ™>äÒ-ò¸â¤RV÷Uš¼WyG—fStÎ:@ÉsmRäÁdzJ·f[n‚º´º?¥Éûi ïÉ£¦ÊJAž€“gÛ$ÉÉô!/nyL4¥Õ}&ïõ@Þã‘ÇÔÞÆ3v Jžk“"&Óƒ¼Pº5æ1®IA-VoÒä½È{Dò˜ ÅCžïswl’ÄÎgÒ‡º¦n{¸+LCyý9ÍÜÏsÇ\©¡TæC Ô¹6»Ã&Óƒ»Pº•ᮬJ"TªhA8“VY0žŽ5ÏÇéÔ§ ØÚ“ϤKMÝÖÄY NÜÁ/é1ì‹}ŠR/׳ûE=Þܯ"£šÑ6žÈ£‘’DV2ÿÑ€>qmP÷ís ˜LG#ÒAÈîG#ÙU8]]©"¶ ½úUátÒ­™¼4C¦Tö6á?Ó—Á$ö‘JRUð۷ÂÕ’(vÆMAå̵Iµ0™œ…ÒáÄM+IJ÷ÌzÏÐa,N–õfÒæ‰žTu©HÒ-$¸Yuºg‘“ÕlXC~£E‚­s>C>Î4³‹!L†éCŒ™e¡[CÞ×ëÍf>«# '”‹a@±ˇÁÀa€®tÁ’éC ÝÚ¸Ò‚éž·ü’Þ¸¾›L?L׋õ&²Ý0}é7£†*}¸=ïd›¤™ôà'Рǥ4ódÜlÖ÷«Ùx¾œÜDÆ% 왂m+’m´ï ‹Þa4Ȥ‡ÑnÃhf† ­èHrI”{#éÝ»õ§16h¢žâýÛ3;„Ÿ:¡JÊöµL¸þc E(b©`±ï.`"‰ï.BÉ8L]QÀÃl3ùs˜úL 'ßl óáðp8 Q ‘dsQq¢£f{k‰ü²²àDhÛ»‹Éö Ãަ7RBS¢Î Ê÷G²MºxY$p ô¢C¨ ¢©‚¤ ƒÍaÓ"/vÓrrÈ,ŸǺ‚qIHÆIPûœyƒ„»Íún #Á,Ÿ'º‚‘I‘HÆIš0wÎ’°©·õ.‚BE¿À3OöØRå3àà @?0@")É8Ü8ËNóÂf¸!ú°ÛÚ“·¶Îùù8@ÐL H  @2S‡½ê ÙзÈÖ9 šIiôð˜H  @2P)‰nZ¬§Ú•û'sz@è«—.¶¶ùÐø84Ð@ H š@2 Ýß uÓÖz¹Œ>Ëcœp]Øô]l=óAñpP i( ‘(d”BæÞé®WÛÈàBIy|›»³®Âùèø8:ÐF H @2Šלw“fº¾û< óÀè¸ g£ è4lDЉ$Ð %ãèTŒ(÷ùçô~³]oÆÛÝ<öÎò¥ï¬]©òðp  ‘dœU]ñ»?ç»émä{ Ó”?ëõ-æ¾-R¾û>î>ts$’r?Œ?½áœVØcÞþ~z3«ßǾäv>y;^VDQvX>–mÓ H$V Vöç锎™E½«‡'~çOBÇ¢æÃrê³|£TDQñY¤HiêÅA)”É×~É5›OëaùúÐËW[á|l|œh#H$EN E‡iIce½ÚîÞKùŠ!ÅÕ0…£aL$G(‡£DpÇÆî¶Þ ÐÙ-j>,§þ8+À7 ŸEŠ”¦^ʼnânоk2L@gM@®ÂùØø87ÐF HŠœ@2ŽŽdþ¸ÒÙýòn|;YÍõv¸ÒbÀ–*Ÿgú1I1HÆwÐŒ•Ľ¦ýkÇÚŽiõôv=Œ0=˜Æþ$›|º|œ.Û¦“.HŠ®@2>Â’Hnérg©Luì ˜‹½;犔ï¾€»ˆœ8rp$’r?Œºov-¤âºéþñËþèa:Ïôˆ0ÄvWlÛAÔö†ˆí0‘„í¡dÜv³j-„ŒÙy{@Q¢Ä3{{sÜ&ßqwVs$’r<Œ;nV›¥ †ùù?Ý¡$²xº_ØaöÚ*äÛëàöÂRcö‚DRö’q{ÍB’Ë`¿›ìn‡}B‹[ª||œèÆH$Å@ g@˜kVƒº¹Àí9y_ÓñÄ“?Â…WÕá(W€¯uÖõƒ-gCì£YQ”æúd:ܵ­;¥ÃñÓñNèeVÁóÝ™JS¤“ï~ˆ>Î7§¤ª‚)l»Þ _i´°¥ÊgÀÀ€~Pª¢ €DR ’q%EÌsÛÝ$ÁÅîV]‘òÝ÷p÷¡˜û ‘”ûdÜý² ¥f¸Ýf²Ú.ç»Ë:%âdƒ-I¾×>î5¬;æ5H$åu ÷ºÐ&{7Úo§“Åð~ÇL ¶ªù¸ø8.Ð: H —@2Š ÕfyæþU¯úãd1Üà;à®ÂÙè€(: t`" tBÉ8:û3Ð_¬W»ñ‡úóv8Œ&Áƒ-[>>Îôã$’â!Œó öo1ȃYjÔ lÙòyðp 7 ‘dœ) +5äánû8sà¡Áƒ-[>>Îô†Ò*ÊH$ÅC çA"˜Ÿ/b{Ïámõ¼ô®¶ùÐø84Ð@ H š@2 ß¿íã&•O±íê°>=o¼±ÎGÇÀÑ6bè€DRè’qt;ÜÈ:¢ó×z½Æ›olmó¡ñph 4 ‘4dü¥1ZpR*KêÛô[cï7uý×p‹åü[,™ôžˆê8 7èâ©ëpÞÿÙÁ® endstream endobj 1132 0 obj << /Type /ObjStm /N 100 /First 979 /Length 2020 /Filter /FlateDecode >> stream xÚÍZ[o[7~÷¯àc÷!9œ!‡EPlÛ E.j$Y`Ûl´ÎIjÔ–º–²éþûý†2}“IÇr6@áŽç|3œ;y#‘ .FÊ.R#Š‹RŒPk#ª£dD ŽŠÚ“äR¬ö„‡¶”1¢8a:¡NJã©.7ä”\Γ+ ƒSÉF°«èèÚCf£ŒA’QX%‰g“š*äD&™ñ'åÎÌ+ (¢¶*øS‚¡˜À¦(5PÚv±PE ÃT­•lµ@³dïæäh¥PGĦ5” ¾DöF&PÙÞ(Ñ—öÌ(Õt)@ £0¨b(»×ØVÁWWTv)pC)0x6dJ¤öLÉ¥Ô ‹Ÿ)5íᔪÙEñ®DsÌ”rl|жN%6˜tµÊ V«ÀS5­´ºT›uk†§£É<Çhû­+d`[l̡蘪áUćö,9–f«>1[QŽ³ÙŠ "*š÷Y©­‚OÍ)°¶ãJéÏ*B¬´gÁ E X¨!IƒQ71w¶%¥¡€E.Q•j¶'lAj2¹™Ch«ˆP¸29!¨A—%4ª l“ñ4—bÈ0I®PÖËÕâÈ(ó Á*%¬¸ÔÁ¹íM<ÓŒ¨"äP©jòStªÙêèj?2Mi%”-¸)‰%I1*;ÍæKGÕÐVÕimê Jž>=š¼ú|;›Í—G“—þµl¿:ý~4ùn~ñv¸p¯ò>¼9š¼N–îuâè͈Ïf¸=Ì™)z¤ؾuOŸºÉK7ùaþjî&ÏÜW'óóóéìí_Ü7ßá?“û̽Fu` ¿p“üò+4r¦œ}8;{ó)&lÐÃ![ùR€šq;|åÎÝÊ9ù ·ßb|>Ÿ-ÛvŸ£lèŠÿ9ê4\шãÒ#E¨Ñxyr|1?y9Àžnrüì¹›¼þ\º+Ü•[Ž§ï‡£É÷1Ì– +Œbï›'ó'ÃbU,Û³¿ oO§ßÍÿ\ù+#¸K%¸ãxz·16Æ›[L»8` Ä{+±[Ñ$0Ëv«Þ´ä•G[’Óº%9îgÉUÚ, ¸5(ÓçŽØ}ò ¥Ö[ I!ûŒâÃ1ùl¥;/Dk1,ŸœÌgïæçÓ³'ûÓÙ°–eL;øoÓV—X?NôOÙàé(½;aºetã1éáJ„ðºá„ƶć6z o‹OSI©¾ ’}ÚÖ?ÿüÃOþ|-%íàž;L"Å×<ºjwCÝà†2>~EwÙûm¦„Ž•0ì·÷[™|#f§yCœæ]ã4ëšò.Áq‡ 3³·)u+#FT_wJòí™}_ÙmÉBë–,a?KÞÌø\ÜÊ yƒ%f °u4ÌÕTÐÐêÆŒÙ4ÿgàðýümûÿ³Årzv6]žÎgk• Äœ}‡‰ Î&?¿84lp›Žw[Yõ¥v| ÿl,–äíàƒ(RÄQ†ñx£ëîsÔ(±Ö#ìb2y;/[)ï%xåüºK„Œ`bÊÞN˜{õ{ÅÉyS±Å‚°膱Ie|UÕÀéu—1ø“•zœRp:>l&PXïŠv•´“Q(ðZy­üà®Èè.“z â ¬–ärª¾ÜSZ§'¿c_ÛÚ¡]¥muØ]¦ÙgÑ/ÈaeƒÃd?‡ÝÚïÿ§tQ\¿£±»Ä±g½¦õu»Ì¼$b'´ô‰à¼çT–“/µ"þŠ·kgÆ,Œ˜DŸj¿ßÜ jwžñãêÏW¿-—|=™|üøÑ¿æçÿ9>úùÅû{§€{ò"Fä…dõ%1Æ*öjw¯¥ýÞIóééÙrþu×áɇÅp±xr1üûðXþõìt±\ø•3ÞA½Áφåž:2ά°Ð•–VêöÑðÒRU™˜úçÓY[=½›OnodOUÛ¡MIí ÓCÓÜ~išFÆ©Ê.ÿkõöý„ Ž Ð6´Ÿc"p9œüæOækWöq`{…ÜÆôø×’Dë§b"_süÓÚŠÒu:Tò\¿8M9 ò"†¸ÐM[ þŒÕ¸]ib4± ;Œ*ÅìVÛïϨ¥€&`So_¾Žƒ’‡¯öû ¥v¸8ÚÊôy'þÖï¨êø2A} ^/R/©—÷íÓã%ÁNô*“zqI9udîÈÜ‘¹#sGæŽÌ™;2wdîÈÜ‘¥#KG–Ž,Y:²tdéÈÒ‘¥#KGÎ9wäÜ‘sGÎ9wäÜ‘sGÎ9wäÒ‘KG.¹täÒ‘KGîw=T:réÈ¥#kGÖŽ¬Y;²vdíÈÚ‘µ#kGÖŽ\ü­« ŸöÑ8E ûð‚mæ¤>‡ÍW„v½„m{;Q\ µ:KõÓBÓ„ŠÚwˆt%TPSKë–¸SáŒîQ¯…JDA/,‰€ìºŠqN?®PÎÁÛ¿KéB9EY(ºS-×d7ÌEäq…¦b®))y ôÈB“}ä¼–ÉhÏüÈÖ%dHŒùJ(œ×z_фšù:ŒPü<¼üH2/‹ z¤¯œ®Š z¯1mú?D‡\ endstream endobj 1387 0 obj << /Length 3576 /Filter /FlateDecode >> stream xÚíM“Û¸†ïþ“›]µÄ_™c*ñfS‰7ÙÌ!U©h g†‰DiEÙãÝ_R‰ˆ&hH>ØBmÕz<&ûmõû¨€ EïÒî?zW¤wŠsRˆünµy•»º;ýðó¯¨>.éLÀ‘¸õý[)ïhJŠ´ w÷0ÔýÃÝ¿_¿}“óךաÞ6oÎù뛇êS÷#J¾¦R¾ùÏý_^ýé~‘Œ-̦?r’ŽêÒ„‹Œét²\ÊÅ)zµïßrz—“"ËDL÷šº3Ò\yª¶›ê°ÿõtdä9É Þ<î÷oªèévö7êÿ·¯þË4–sÂRy—©”¤B#²û7’Ýÿ(;:xþhåp~íd þ¶ÈÑJóI2…")+Î’Á)ŽžHŸAÒƒ$‹îPCÉǺzI>Vû¶g{B‹Ê•ß -˜Ýº$áv›¸Ý°îsvƒd–ØmIOëÞïJ÷±?ûÇóCõX7•£o" ûÆžºzªâžLœ'}Œ—'Ìž,éIûHaBެ¬«CdåVt=ÃY1pV i”(+ ™%¬XÒ6+²à$+ ÍJµÞMAa”°®óDP<' ô ¦@é9³q†˜Ìzlé =|?ô8ѳÙv½ÆÑhN¯/âcÿF5:7 Hf 0–ôÅH–Øv÷\í«äa_¾L±‘9‘âÚ†.U8&ŽôcÌ ,éɈW JŠ\O•ôxëÇ) 4%‚g±±\sV-™"yq t&>Æ Hf t–ô¤÷PE¸Ô£ñºy®ßׇä¥Ü7uóä˜TS¢ä76<ÆL×… 7ÝÀM‡Õ§,EMÉ,1Ý’ž˜žf$Oå`úîÃ!9ì˦]—‡íþ6—R†’„ÛmàvúÏÙ ’Yb·%mÛ-ŠŒ0Y vºáE{ˆë«ŸC%ƒ)PJÎìš¡&³€[z2üY÷Q‘³“î_ýÃu¹yÿPƩͥcZ!9QÅ­À¡ÒÇx¡É,Ê’ž´ÑÉ ÍòºrtÚõ®<X/üøêÎ €3ͤŒ¢ d–0dIO⌨TO‹ÖuSµÉj½m«}œO0Ð¥ ÇÀÀ1€~Ìa’Y‚%=Á€±nª¯­·åC\”½ò¢ìPápzLœhã= ™%ôXÒz(%e†ždWž§õ½¨û<»m„0>t Ãù0p> Qs|€d–ðaIOøH)I³làcû¿Ø]®Ý]t…Ãé1pz ”1”Ìz,i›^t/€x’ªYm7»²m§eýÚÌ7Ib¼.N°ïæ|ÔvXÿ×A& L·t'ž«‚J¸LOÚú7Çæ‚‚‘~MÖc†êWî¨ €[ Ë;ç)Hf‰©–ôÄÕ¬ ‚åÀÕ}µªú53Ç;™‘B|Ó+ºHá˜8Љ9@2K°¤'tsÈ<ç€Ãö¥Ü;fR*nh¨ˆÁ  ƒ €Ã]™ƒ$³Kz²&Êyÿ ôxâoþ5ÑMµrt~&I–Ç5ÑÏg‹fDÐ –µ@œ-}Œf‹£ld–°eIOM*I®8à&)wñªL%º’ᔘ8%Ю9J@2K(±¤mJX! g°»$ïËÖÊÍŽG†" œ91Lf¶ô€\•S—ÿ·¾ú=”*Çú1‡Hf –ô%ãúúÝfû/¤}™ iCÃ2p† ™s d–0dIOÊøqªÚWî­íqÄáï4º’ᔘ8%Ю9J@2K(±¤'sƹYC}çŸó4å¦J¶ïÿ[­q’ŒC»’¨K€1p`ô1^`@2K€±¤'m%͉àzdüîIù©jãUŒfu=ÃY1pV is¬€d–°bI۬Тßc¦FVVÛµkÇiüòv”¡’Á”€(%gvQ&0J`2 (±¥'”äªû@¢#%Ÿ·ûM¤$„]ÉpJLœh×% ™%”XÒJTf¶4”$O®M†·>3JŽ €cý˜Ã$³Kz‚A–™]‰#mÄÀ.U8&ŽôcÌ ,é Rš]‰Mõ’”ëºjâ¯ÏâC×0œçE™DùÉ,áÃ’žð!¤ÙwØó±ê¦­{Çí ¢ Jˆ›CB—- Gz3‡Hf –ô‰nN:n5<"lôˆHœ!¡ËŽ„ €#½™C$³ Kz‚fí«GÙÍ&t©Â10p  s€d–``IO0 |ÜOØS°¯œãÉ8–˜ÁãTÂp:Æóq8€Ksl˜L– q®;!#ef[â»ê_÷qŸøµ?^t…ÃÉ1pt sì€d–ÀcIÛôŒ¦§FM7Míæ(¿•çó ov3‡®Q°ýæ|Ô}hÃŒù “Þ[º¶õ95›m¼ö ]¿×e¦ÇœÒ¤,Ãè™, ÇÒ=¿(Ë»Ÿ EÏŸ¥ûze–fz-Öuiåø€ øét•Uv™æ„*u—eýMŸOÝp~L°³E0îúÇ1ÃD<n¶%âDÏŠ&îï3ÄéaØ®^Å;ç®5"gŠ0Á.ÀËÀñÒÇÌâñáeIžA3ÒÕ}æ “»žœ¤n>Ömý~]Ýðms£!§â„›>ž{êO™rZn²ð9~®ç6<ÍH:<Ó¹w¼tz}¼°+b¿˜£CW2çÚ…ñbI:‘…$¢šÂ¶­ÝÓ£ˆˆ‘¡’Áˆ€("gv!ˆÀD<ˆØ’nDºapAù9"I‰í>Ìnv÷áh’.X8 &Nt#$â#Á’t“ º!+§ Ø ›7ðôÊÑ ]˜pÇMÜqX}ÌqˆÏqKÒíxƉvìöÛUÕ¶Iõ±jm3ŽÕ ·ÝÀm‡`¶ƒD|¶[’nÛ%ï&™j´ý©‰7Ù^íÓA×6‡HYî„$âƒÆ’t¯^t‡v @Ïiÿá_½øåC}ˆ«W^½8þyIKÏÇá:2˖ɇֹž³‰B‘,Íj¶‡xÏÿÕÚÑPÛ``@”˜3d`"flIw;Y¿“Uö·£}ùrÙÄÙoF’‘ì’0€c¤™Å$âÃÈ’t÷ÁH: ¿:DÜKîñv+ßÃÑC]ÏpPLh HÄŠ%é…S"†!×¾ŠL½úÐf¨p8:&Ž´C$âCÇ’t£ÃR’ßDÓ¡³Nê‡Øc.è1ºžá ˜8(Ð4Ê '( (–¤šžã•Êý¥UÇ/ ‘“Å«wCUÃq1p\ u. .–¤^D´<âå¿ÀÑ­.d0 æ|”è‚ÈÂC‡¥ç†#/åãxå¹lŸ“j³}ø°®‡u¨š}½TK­_y¸&î',/f(HÄç¨%é¶TåDJ9Xº[—«jæ–Šoù‹¦FtI½6p¯aÝ1¯A">¯-I·×™2ûÓöõûä¡n;ÃWe1tÁÂI0p +  –¤›©¾á»'¡mÊ]û¼wdOÐ¥ gÀÀ€~` €D| X’îÅNÎ2"•ÞòOÿbg»*×qýzÍ…2"è3NKs‹§N°@">°,IwsI)ÉùMÕDh®®m84& 4ƒ$âƒÆ’tBú™Óá¶:ôßæZ4÷sâlè£aÎGÉ€.!`€,<\Xzn,ò”dÃÒê‘‹móx¼-/ÙWµ«µ’äéW1`Á|Ô¯9ÜHw³$âóÒ’t›©ºÄsð&Ÿ_;¸…¹æP’p¯MÜkXwÌkˆÏkKÒíµ,ºì¹ñzæÝnîFÚÑ]¤p÷MÜ}èæ>HÄç¾%év_t¿cÆüͶßö‹L nhÓ¯®K¸ßãù¸Ý ô”S§Û& ŸÙçzn¯yN8ÏG³«æc¼Àtñ²ÃPÕpTLœh HÄG‹%鯅©îힸü÷<\yÏÃPáptLh#†HćŽ%éF‡ªN[/f´Ou|BÔê:‡dàA31€@">€,I7@iFä°ÌÚ>Wëõwo.øëß9/qË<¿½uo‘çDõµ×µú\†ó`-r‚€N!H‘Bž%3‚>zVÚy”þ}+VÁ¼fS9™}+,«€«ðη-2’¦z»c»®ª]òèzI\pÃûäPÃ`8@Ž3£8`"8lI7¹$bø"­šC½ŽŠ1tÁÂI0p +”3'  –¤›%H.†!z‘8îó#¢+Žˆ €#í‰ø±$݈d‚°ññöñ´Ïåƒë!½±YœLÒ 'ÁÀI€®`$€D|$X’ndÿ½U„]¹Š×}¯ÇÌ©´áÈŒçãÄ÷0`L>^ÎõܸtcË´x9TûjûRÇïø¼!¨®a8&N4 C$âcÃ’tïN¢ÝŸrxè½ÿIЇzS%uÿtøªOšè]KSÂ/ê&ކ>F£Áh€D|hX’ξ‘D W3û²iÝß=ÛΆ.a0æ|” èÈÂÃ…¥çÄB„ —9G,ºŽ°ÚÇf0'Øps>j8¬?åÂe8Èbbøÿ} u endstream endobj 1305 0 obj << /Type /ObjStm /N 100 /First 1006 /Length 2149 /Filter /FlateDecode >> stream xÚµšM·†ïû+xŒ/ÖYvå’‚¥CAE^FŒÝ@ZοÏ[ìáÌì¡Üvg8Ó=ïS¬æGIb-©$b¥DÔ¢À‰E£ IŒ¢ I«GÁ’¹E¡¦V8 -9õ(xêR£€OÅèŽØ K5n*- ?’<“D64 °Jã>¼4÷AÊÃ$6ØÔã6O\j˜h=1y£–ÄÜ!Å•ªTTÀ†QUþƒQ5qÓ`À v F­‰{ [ *ŇŠ'¡>Tz| nåQ‚G†o'©¶4x©ÕPišÄ[¨4KÒ=TZMZzÐZK9;BeÔ²õ¤ªá+/ImÔÒ ÎµtNÚ<”ašú¨¥k²2j‰ç`4j ñ¨¥·ó¢–îÉtÔÒ{2kÁ€Û­B€¤P²Ö-JŒ':~ #ÍQi’ÐëqwJu{ SíCf´ÒÆUMú¸j©m¾‚ëšrXÐ[j¦ñ¸an«Êß5¸%OmÔHJO^µ¼8|%J­%N.x´(Ir¸ã%MnÃz4o4®Öä>´aï:®¢I–ÀMZXÀ%õ0%J]),`NÝx\•Ô«V0XSou\µÔ=ž‚pM½÷°/Œ,Da`0 KØE4ŒÜ_4ھĥbf„ŸKíAH§@E{*=¾Áð»qlDï K´ÑP„8úϸ/dÃmÔ`ëÅÃíñBn㈣U·»W¯îNïÿûŸûtúáááñéîôîÛ¿žÆç¿þúðï»Ó_~¾ÿ’>ÄP>Þ~ºÿü”> ýe.è7â¹C Ï6à0 äN‚û~H¯^¥Ó»túËãûÇtzþƒ¾K߇¿?…ݹÁ1hál»P>ê5Qæ ¥Î¹H[ m–›_ÝKNÙ*-†VÉÑ.ÐF¹¸-†g—÷Ö’ké‹¡ªY즦V2ºÑb¨Pv ˨ô\Í×BŒvõn·¬¶¸í¶–1 N¢káZñL˜L1N熉Ö0|W´'³½G)Å¢VP)·º–gŒ gð+€ÅóaЊ™ì¶¦V¸´ÅPó±u"õÞ]…: ŠhEùÚ$zPß«©-‚š^™D¹­e"5Ë‘u\ èA´·EsÔ1ÞÔ4¤ÍúbhC,x{Z+V¥÷Nk­x†7ÁJ¬LëÞŠæaPª9Îx^ ŒÐÛ7^.˜ÈäæzÓâÖ‹.ùì £!™ÙêQ'ð0‘)ÝœÀC,H}1­×Ëí <~!B: Zë³)V:÷#¤£ fÏ"¤XíÜì¨xö,B¢±ÏRC3]çpÒ²!ÅÄDg¤/Lî/DHGA)Îû\™Ô ­®(ò–~[QŒOûÒAÐ[Ç7Çý…ðè ¤Ó³èÈ_Ø¢ãƒö+&±Þ¶­X¯j¶Ȉ3Ïç)‘í^Í£1·sNFw{åAÛI±NUü\C„}¾wÎé ü¼¶0³ endstream endobj 1416 0 obj << /Length 1387 /Filter /FlateDecode >> stream xÚí›As³6†ïù>&ô!$!ÑcgšN{ì¤ÓN;=¸6N˜‰!ƒ:óýúÊF Eb(ß¡™ì8b÷õ¾Wrè*Ö?t•Å+ÉɸZmö7ñåÕúqÕ<ùåÇjÆEz`F~ÿpóå^ˆIgtõ°ƒ¡¶«?oïï»}-7Ç¢*ï"ÆØíOå6ÓO)—â–ŠôŸo~xè’ˆ$™©æ<Ò“ÃèJ‘,M¹Q“*N(ãšc½.»ªÞG‡üxNüå^ái¢Ce:øeðww•´yHz¿Ñé¿ýG/pj(F’XtE:×›ý7ë2š\ ß:Ð^PU7É¥¸ú‰'&“$N²žÜüv´—Ú@2"dë¿Fq}Ì}ë™"*cŸÙúù`4… g¤»Gx5FˆU2~^©û'Œ§I Z¸áò×Dºéé+h"š!¯E´Yï£]µy=ø E—WF Ó“Aš}çÄŒ™ˆ™CŠ“Úk%ILxÌ-yyÌkŸ®UfâÊ› Ƈ©a86Î4jŒ fNj8#ŠeQUEéc"SBÅg™s0»MIÂí¶p»aÝ)¨Ý@̻ԮÝ"ËH"í¬ï«ó27z©«Çz½÷ W:°Æçg8âmûþƒ½Po{EñŠ™á­›ÚóV)"©g­^?l$aŸ³ÛcÆ7Å ÷½»·ÔÌu«dŽéý¼žçRÊíçyWçù×|™ÞßÕL ÃÙ°p8 Qct1sðpR{|èºP¶)<÷ÏÑßuu: -%%R$Ÿ‹ÌtS˜pÓmÜtXý1Ó˜9¦;©=Ó…HÓÎôf"XšÂ»ø05 çÃÀù€FñÄÌáÃIíñÁSÂ…m /ë2^î/…¬*L%Ã)±pJ ]”¥(%@ÌJœÔ%L¥¤¥d»‹þ)òÓÐÄqµw¡Û"…`à@'Æbæà¤öHaIÒp\×CGË42‡©a86Î4Š2‰òÄÌáÃIíñA¹^.¶ ¢,Î7Žòà ‘œ_ ¦láHØ8Л1$€˜9H8©=$bN¨^34H¼l‡Ï­š÷·,+æöSÔp`lèÜ0@Ì`œÔ.0> stream xÚí›]Sã6†ïù¹«3Ó¨Ö‡m©wXšCÂtvÚ^ðBÚ$Î8É2üûJ–dˉ,³&» lfg6N,Ÿs¬÷ñÑ‘d`Ççÿ`‡ùcÀíÜÎüü×ì¾#®N j×ã {FË£ñÁ/‚ }À|;ãORÀ¢ÂÜø®ó—7éþ3þýàd\Ø z¦CÑrËcÄ=FÁ€<¦1‘ÞÆ]F¼øfšt{8 ¼ô“üì§ó.†Þ*‘K“4E&!¦øÝ|JKÙ4K¹èÝ­oWn$·¶Jåçi’ÎD£Ï“äQZ„¾oš„”ñcq?¹É_»=Fò#¬|{á;5&>6$#¼cJÕ@ÀOŸñÿ Êå«þbê¨.ï×R–µá$ï1´ wb†QhÙàQÀÃé tvÚs³ûŒ¤Uh •q}=U©‰ +3Œ®ÜX$,ÀÒÛéŵjÎNF£“+y|y}t6è«ßý“‹Ñ‰•:ø€¢è[Ž>5*©[j­Ry½C%³ß«JFM*mx¬–9Ð'¼$!¼’a €ªò¸Ì’xÖEÔÅG.GˆÍ‹¸EÚ: ¼ÁöM{Øâ˜ŽD!ø—ƒ,¯ï,\mºq lÒ„²Óe2 u}ru>âùcïðâX¯?¼8Œà uâƒ@}x%¿ô‡—§?Ë¦ÇƒÑøjpt-Z—Vø]tÒNb•Pχǃƒþa—b/¿ÂòìÐDÑòì|›pë÷1ŸZá^p®Zår†VÀ@šwºÔ€Æ#†pù[*è}”¸æ³9éb1}’‡ã‡d™È³ã.%^’Í–ÕÆ®é:“ß.’Gyp™¥÷Y<[Ú F$âÇÑ÷+7»3 BÓ=óÅš«ë{†›ænò›‡ÖêÜŒ¤AôMŸ[e yz.ðŸÙ¥ÙSuMÀœ½ÿ´”¿'ŸÅOÉ4]ÌÄZòVöÒ*ä™, _©´Ú Ââ–¾\(y}Ï0`«£6ÜH¡¬õ®I“P>kžN‘°J‡ëÕCšYŸ!Îcl_D½É"J'¥uû|Sp婌Hš0Þð¹o`Qém´^,òeÃ4[%wjÖ6WŸÒL ›+…|®æôöV Ûp òŒê±öé¬4àJg¦0ÐZM›‘4qàôÉ9Àó‰u‡à±ºjÌk„yºžßª%ê¿!&æP$¾ÛÇìƒ|?BjdÔ7ÜZFÀCÆJ¿BkÍhFÒ £Û§‘?! ”;ÞÞPYíz?C€ÁýBß3–ï´ªª›ÛÃSpÁSQ3²ÂcDÒÓ§€R€ýPoaHxò©5/C'ñÔ¾»ÀK¡ˆ½Ëàë& ÕÛí* ¸2E…ÔÊICNŸœ!DÀÕ{’!µ'™dñmí&U^RûtÏ‘ݹ­‘1 8©hˆ¬%¨I2›>í3)2@˜Âˆ‘Ë÷}o´Š³•ØÊW)òrQcߺ:Ë‚0&ûõ¶ìT©ùˆ¦õ¬§¼Þ1é1Õ¯® £‰7—÷ ¼!Å[?ÍâùÄíl2W‹iÃEž¶ gÜCAx?»öÒîýöP•\T™"×`eDÒÄ•ÓgáÙK¿‚V`ÅËÉ­ÄŠ†(*CÞW|’.–nåéóx2—Ô]Š\Ï“©:†ADÃW[³ïd‰Wwf{NJ.NLÍuŽfFÒĉÓgÁ Ÿû¸à„(NÎÒø®ï†7Ý^zÿ&·«eÉU‹ù¤y<¤>ˆüw˜êÀQ½ÛœÒ€ SDd­­ÍHšÀqú,À! 4Òà œëeÍêA [çéz©²ŠÞÿ9ç“Åz¯ b¶Í^ï‡ô-d™:Twµ'¡4à"ÁT1+ F$M$8}BÈøYÚA>pXPVÍÉ”ëYðÃI:‘DžÉ·”ø)•V’,Y®¬‰„—T¼¬z—‰¤ŽÕ¹í¹) ¸¸©hhÝ]4#iâÆéSgÈxüzU ƒP×¾ñü~;‰ü)6’cÁÇ“ÚY~àÔxtÆÓŠ ê?+5{ÁŒþ-?º‡[ÃcpÀSÒZßš‘4Àãö©“Œ"@p O‘tŠöPì!q(’8‹ånxÁ@Ô¼µµ,á`²÷RËîj¿Q÷t{ˆJ.ˆ*‚Ú!2"i‚Èé³€($QRB„6!:çŠXq^>g*„! $ØÏ¿›G5Ýñí™* ¸˜ªèk­‹ÍHš˜rú,˜ €zß\0…7™:›Ü?äuŽäš°Bð[¿†ü®WëèR´§«4ࢫ¢´µÖ6#i¢Ë鳨™p-èŠtÍÏ’,¶ÎœBñ¾<úQÇ´Wá¡S¥e{LK.LMdˆoÅÔˆ¤ S§ÏSDÅHcJõ„0–ËDº¸ÕXñèc>1Ìì5<ZHöY‚«=‡¥‡&Ä:Å4#iâÐé³àcRým€mÅjŸåyÕ¾­wS^Å›*J}¥D{ÈJ.ÈLÁ‰u ÝŒ¤ 2§O £ ÀcÐWý‘<ÝÈU‰8S;y£‡4[Ý®íKœ¢Î#˜îSÜ˲™R£5gåõÌLÉí”alAö?J endstream endobj 1389 0 obj << /Type /ObjStm /N 100 /First 1003 /Length 2167 /Filter /FlateDecode >> stream xÚµšËŽ·†÷ó\&Ö•$ °#È›,-’Z(ò 0bÌ£༽ÿb7GcD(š& ŒêœCÖ×$‹u!›D5•D¢–ˆ$OÌBM"=„–Ô8„žÌÑN¬$¯-JµSœzÑ £P½‚¤¡1tú°†róý£XM¤>tൡ4ï¡ÅÑ­•hìø¡S<†sâ"ñ.‰I W<ìPŠçbñÑÐ6ÚÕĶék‰ë¦¯'nC_-‰ûÐW)I‰ ÊI(R% W£*æ¡Eßj s0úz“¾˜¥ÊÁÀ„H“ROÒ-FÞJÒâ1r P©F»†éä4üQa¾"%H:´àÁµÖÐÒ$iOß4Y¡Ð×K2âø³n¬ñkçdcš¤K2ë‚n¶¼[²J„qtOÖxüZ~Œ'è-yÙúöä}µ`qJ!Qr-=$Nnñ|Z$¹+…¤0ßYòæXsŒ5yÇ !ÕT˦¥¥ÊhB¡ª ƒ©*¡…`AãPLgõa°ÃZc-1c©¶XK% Kë`ÀÔZáÑ·§ÓDÊ%5íC¢Ô¼DF»JC’%CÒÔÆš+[ìèá©Sؤbb;q`šz,#¤žº†‰+L¹{‰xð^)z@Uo±*’zí¢‚Á”b£‹ÅfðÑT¸ŽNh_¤G0e˜”F_,EtSL`©Ýb¦K =°ˆÛ"~¢GcêˆjLùØÂþó~|þëÏ7ÿ¾º|w{÷Óõ]zSàÊÛ«Ë×ïïÓ+-S ƒ‘l½a½Pæªhómzö,]^¥Ë÷·¯oÓåyú¬óÏé›o®ðï‰Àƹ3  õ’½ób`åo[ɘìÅ@§\á¼Ð{6®‹F9|ÐZËðÀv°x¦ð6$ÉÝÛZ vËŽ9€E2üöb qvÙ¬T1¥zh4gµä²jÍíÐhÎ eõm áº2¯68óÜÚf¥pÎÙ]€ý$ •,HžK[ËCüÍ•÷-–µ¯¶šA!wòÅÀêÙ| È^àV/!Ò¿Œ\fðªÀ«ÒbžY– tÉH[‰sä@Høî(J9 ˆßdÛR*¼êZw䛉2öGᶘ‡ï»[ãæ)Ób · ñVËíÈ­´šm‹LŒíªg1O‘Qìã3E¾v°%„NâIƒcÙö *¡LG^í4 [®»WcA:,ºH–©íKÈH‡×µ5D¤¨¯57”ûV8ÃëÈA~Ag r2ƒÿ?xgM*!¢&Ûxprµ­6ÉQÂË•ƒJø$ ™fÛN¤ps,‹®™}V䧺˜‡:ÆÛæ»ÉzF⽨߽Ù(Á͵ê‹)©ïÀ(¢£“œla ¿(¡Ìu-®vlƒÍ“"=쇡Iãž§7q%ý˜.ûû?R/q²”n>þòËÛÙèÅíÍýPôÂ,µ­í‹j©î"j5™_ÇYžbû‡yEǨº¼¼»}ÿêœ./Ÿ¿H—×׿ݧ·ùËwÿº¾ºüÄë›ûq 5.ûáöãÝûëÛÁÕøî‡ëŸ~~÷ÝíoÛ”Äáa9ÜËwwè ÛÖpÌç€Ça`<Ï8 ÜÝ…^¦@S˜ûlÜÛ| u m }âüoh <™‚NÁ¦àS¨ShS˜šij¦©™¦fÚ4¿ýzÓb¸Y'‘Hàn·,²ãsGÁ#_b`O€¢è°ú‰ ûm‹™Rrãì ÏUëb(ŠóXý( tj¼Šú£é£é¥8å9š^;j€Åaê•z1Y DŒ˜†\¹ÙbfmãtàŠï;ëb¨£8iFŠ $ÖCQEê÷uε¯)JµOÛÔŒóaBæ'1QÄÕÑS‘0¹-†2–P>1…òQX¯'Is}äv ÎÉÄCQ}ò V]êâq*ªx÷¨vä¼eÑ8gŠæ9ÚV¶x$­eÖ­0sT…m1PÃÃo>nÈðn'N"BË~¦æÊ™h1-Ç¥õàÅv< _'Ý;6dÜÙ 6#u_ ,q9Ñö[I¬´µ@3C’5ïì(Ûa < ˆðQw#5ƒó£ 邏æ;ö-“~|ð{Öí Ržxc܆ ß!å/F1¯MüÿÅà—T€JƯ.Mþ»4úêb0ÞvØj%žeÏ2Šgų@ãY ñ,Ðxh< 4žOÍ25ËÔ,S³LÍ25ËÔ,S³LÍ25ËÔ¬S³NÍ:5ëÔ¬S³NÍêO­ Á˨‡=pâÅ›xs)\ýÁÑo&Jdñ/èõó-§À¬Z6åA‹òZ=‡¦–;,{ÐÂxx{*MÇ´qÏÈò6œ ûéKiù탣¸ú|4ybÂŒ]À>ZÍ]7;Q¤v~¼žÊƒGwï'PÛ,EkÁrÄ.=i|1­²Mg¼'qøBž4>âì»mÂï!E>H íž´È7ã”™²?‰‡ðïñÎ`ðòÑ S=‰GˆÌÅ7ó]r·sxÜà[xsÒÜ ì“>É>Ùë8d¼êØ‹º–g ÷²ó\r'[ËCУ=è1l§œêóIþŒ¹Æ«%Oâ•Ï—ÜNâEùï;Qyܨ?õŒŠx¹lðˆ²ÐA\—sxX;Œió/Ôá»Rq9É^™„ìÁ–° -æÅµaÛy•òÁ»zr’¹âÚÂ!Öƒp$'™ ÊøÜÛŽùg=¸ÙÖrYç–N0ÂßçÞež·°;P{ÛÁøNr/Ýóž,уó¯?ÒF•h|\%þ3•Âô endstream endobj 1501 0 obj << /Length 2316 /Filter /FlateDecode >> stream xÚíœßS9ÇßóWøÑ½{EÝ}3{ã ÜùæäÕwRNhEꪦ““󉤒ԼöNÎ&ÿ˜Îç;ÿ:ùË«ý“`I2ö@—Ý÷|jëS.ë|váÛ*®{wbgF)“Ó££wvf\ËéÁü²u¯vj1]­ÍÍuÓw´ª -ª aTZßS»Ö”Òý7µõ¿G^|Rc÷/ÞnaÇÏ(†©r"íÏHUÛ/”mÆ~û Á¿ $„¸ëf3„’Þ‹FV[‘ ‹ßÝyÏç6p´ 1Q5'²®„Ú‘¨ªjº·Zî03ý¹ûÒÚ—zz3_-öŠCKFJ—*ÿÌz~cø•Z“N/ão'´ÿ HÐr× B(Œ$C(î“Òšc&ÊTDø”h ŒÙ0zÓ|¶9ŠsËìba±µ¯ÅôfÕ_{}yÙ¿pIÍþÈ%5{í`Ç𭤶 6Úþ‰ß…ì!YÝï^.k4€É ‡x@VINVÔgUiÂj +s²F}›E›N9†Ðš?ådóÒóÐN¤rþ¢Œ?È ’¨ÏÀŸ´Ð ù㎿Ÿº¬Ð®oæ§iø4#µ¡#|Ïî‘N¶r"£ŒHHÇ‘ ’‘¨Ï@¤°×j‰=~²†wÛZÑæFß¡»eË ÍŽ†ù;fgóE»¼¶Õ[ã¦Âà´âD«úeTt¯°œ:åàExÉ’àHrà¡>xL#xÒWX·ëóæÔÍÆË®RrÍ×íéàŠ€Jõ‡žŸ·ÙÓk92ц ”oIÔg@Æ._U-#2Ê!sÒ%—u³¼>ßÖó¾ çSûz=˜p¤EŽé·„ÂÆm96ц ”Pò$6 ’6¨Ï€Me•"b£6‡o{LŠðÑv¾b²åÀnËÙˆ06 Nl€Hrl >=Ò®êx Ø0Ž7óe³þÒsÐc‘®Z‘FuùSÎ`^“bÜ€·-éÓ¸ÁH2¸á>nZ&xÄ­v¸í/º®Ò¿wf]ëóì¬=ëÉ[Ù+RMÿkëžëþJ³t?j?ß´k[^ÏÀ=ýOÖíy»n—‰‹éÊæLþøyoH=÷+–« `êÁ‘”"©ˆ$§ê3¨§˜õÍ@S°rò½¾ºê¥kì42¸Â¡Xἄ6sI®p’”Ó `´Aå¥LÒ"Éцú ´ Cji£°Üµÿ·k·JúØ\]Í—Iê#Â.ÆÆê·æ17üådEYPei’dHrd¡>ýö›ä’èîRO–ïu‰ì&{aê&“o\t i¦^jç‰?^¢rú¢Œ>H‚Jva$9úPŸ!¯YPT¨¸YØYûÛ¯ßîö¨®./ûVO¿{¶:ï¯ÿï¶9[Ï/[ù4—éêÆäŠêoa’R¾žráÃû1ݲÇ0rªcƒèUM„©£ê>é|Ü?þ~××­§7Íòâö²Y_~™®–K{ÁWÂݦœÍJÿIŠN\þ1E’Ù H¹ÎÑ&4÷¥A$9©QŸ^k[nÎÖ~“ëÍ›£n•ó÷Ýþ¯úz¾¸ò“K¿òYÝ.Ïæ;tjK™Íîj÷¦ÏEµáDHú­Ï:ø‘,†@ ÙL%{¹0’ $¸Ï‰Ž!’ö×y»î©p[Ë)M8=M:òr”“ `¤AÕU²ç#É‘†ú ¤ixÜÐ’æ7šŽb›>òÁ r,iŸÜÃ…ºôÈ£§PcÇïºé)LöŽ`$9 QŸB©ìw@¡ß»úiï$ƒam™¥lÌtϘþœ:åàEx¥’àHrà¡>x‚ÍUÏï~ÿuÿCxÜÆodÏo­ÿðýþ§ý z´²U¤–c·üi0sZ”c `˜AÉU²™ #Éa†ú ˜Q½YüÌü–ÚûÃãÜÄjº·Ž-Ëç?@éE*ç/Àøƒ,¨:Ɉ$Çê“rA gQYè ègÖ¡£ ÜÿÜt½ŽÆyE˜Òcy‡å/7ÈåüD?PKì–ÁHrü >}þâ¶È¢œƒ~¸ßTþð>›Àì{ëJè<_æå)&@ÈÛ¢@'[p0’ y¸Ï@žÖ¤6¼°ÁüôŒÍZãi†çhƒxaÊ™‹0æ þÌHrÌ¡>sªŸ5#s~#èݧ®ÍôãÙ…&Á{¢ôæô(G-ÀPƒ²ëdßF’C õP“”(Cj~êíûã½wŸ² QEtÍÆÕAáæ•ÿr´¢ -(óZ ’Z¨Ï€7Drˆ–ß½Ú;úøqÿÐÍGðôfаîƒ2Œ¾ðòm7ÆåøD>PÊ|@$9|PŸþüg’ð°õé³Òáj9»hW‹¶ûÐAâøo ΈÔb<ÜWš¢z!Ê ïÇjëäf#Çæ0d'Êcáüýˆ;§”·“Ô¶Ý ›AÔlb¤f\j>€*7þåXEWPæ°@$9²PŸ-V[ß å«÷÷‹æ¢}à¬WÉG|áÅv2`óŠÃ °m Ÿ† F’ ÷`3Ò–Gqž 3åÖçõtÎ&NU±º×_~ôËÁŠ0° È:¹e#É…ú `iF´Ö,>:+aKÈGlUþY]๜Ÿhãj©“[>0’?¨ÏÀ¬‰b€¢ì´Y´ë&ý¾Ù óÏWÙôŠ•Ã `0B0LrÿF’ƒõ`Š­"Œþ`Ù/óåÙæèô/¢ÚŒ<~%hå> stream xÚíœ[o»Çßó)Ô7¹…’»ärzAOnç9h¸@¢²´q„£‹±–súáËÕò2’É¡ÃØ±ì, XÒj93àÿÇáUËFTÿ±QMGUQºT£Ùê Ý]mÏGý›·¯ž0sßDß8wþ|úäéK!FŒ’šÖltú~$ïÞ;{§óÑÆ‹Åâä¿§ÿxòâÔ™œßÐgwç5§•vZ’¢”¼sÚůc EÕû“'Ƹ¿ø¼mÚõty2)*1þm£_Ùx~µl.»pž¾d”B3L”„«Z»ÝYùI[‘Uÿ"÷>Ýübn¹Û»xP葉H%™«¯®î‰Ðß-%ŒïDؿհå'À@@‘C7» UòZ4‚îE§ »óšÏ}ô-5#åHÖumP L×¥tüËæ„«ñ'Í@Qj2NØxÛè¯Æ­~×3¢¯wŒè»æúÚ“ÝÅ_×]IÒûé¬é.ãO‹í‡þËWÍfÕ}ýqÑ|ê©’ŒŠ EJù=™º¦xMºXlµ|½â}ù 0¨ýC7ˆâ0’„â¸O§¸¢¤´ÉFnñyººXŘ®Ÿ²ãw  äýÉj¯… Iuf«ÕÃÊ7ÀÂÔ]>Þ†”(‚ˆ$…êÓa!+Âk‡E‚{m¿¿<áÕøŸo{×|¶éE»1EßtßO×Í2ÈS—-Õh ÂË‚ê»òóÀpÿnbíJ&XY}C»ò°veîÚáSÓ`»‘¤ÚêÓµ«R_«¥mW¥iW§Lù÷ËUŒ7íê²ÿüzqÖNÛ/¡FÀ¸n—u‘™T<þc°Eòaó0Ø ðu„ D’‚ õé`ãQ¥ƒM„’xa’ø÷Ï‹ÉóEÛ̶‹ú=Û¬v¹«õb6í¾’ö—´õFÖâÚ‘7€µ#sÖŽ@$©v„útíˆ2"ô«iG2ÔŽÊÀ`èt¶|zú{¤E=oV›õå¶Õíe}Þ7£7‹Y׊~ï.PAk"YtŽ˜­ÊBºàsf«]ù 0ÔeßÍ.4F‹ 0 ””0¨S+ŒPJwN˜Ês­®Õ=].£©‰qJÔЕ~ËÂHÇ€•#5`AmOuF«j0”j¸SÆj¢”‰J^5·6ò¦]|<r<Ý6`¤rô•iú¤"œïì8«\ Sùˆx"P­" ”"¨S‡ˆä:v)ï¾\n›U¤¸ ¬T+7Åè05˜O‡7€Ñ…ŠÑBIÑqàôÚ»Ð~)5CÞÊ,°¿zöú§~q}»›üé7»õЂõë¡»+ÝÀzºž÷^O×çWÓó&¸_èŒÐ5À±©ñq,Âßo€‡dpA* “`¡’}=¨¦üm¸1 ÖAPA()PœFU”ÉMîôýœY¡ûØýkÖÝê\—±Ì2Å¿.›¹Mg}§÷¼¹œµ‹33¶-ÆoϯVM¿ÈgFÇ/»ÎÒî*ÌuꄼÛÔKE¦òS‘7€¥"XÙ1…A()…Q§VáRU¤¬¸UØvS:#õʼmÞ7m³ž™ñË««Å<¸¬Ï FJª~Œaóíì'õª[²á¸ötfŒ…à‚¡$àÂÚQPYé<Æ™ƒË%?ç´ÝØ› ¯cŸÚYUó‰õ0b!<1bA()bQ§ŽXÉ«±¼'U÷<Ô‚èÜhIýsfETñ¸fqÓCŒa£s>ÃÞÆ0Ä)Æ0%Å0êÔ1\*B}î6lÿâ´,ˆ(ùÐm/©½šù ºò§™¦>Ž¥˜G©ž¤*Y{JËt¢ýëh¾Fç|~½ `ˆSŒ`J aÔ©c˜3R1À°ÝUýc0ÓrÝ*ª!ÓÞ¿±ªFÎ|T½ UHM UJ UÔ©C•*"¤ò¨Ú˧ªU#g>ªÞ†*¤&†*%…*êÔ¢ZÔ‚”¬ò¨Ú­Ü? ã×8°rf£ ¨îQA†’@wêPUœp PUÕId}KÖå°¾uìë[VÕ|b½ŒXOŒXJŠXÔ©#VÖ„1鉭 ± [“R°avu4bÄUó‰õ0b!<Œñ ± ”±¨SG¬¤–ì!P‹lY1Œ]O#a>žÞ†'$%†'%…'êÔá©çJŠA½ŒOˆJŒOJŠOÔ©ã“I"Xø´»YÝQ¸ŸŠPU=Ø_—>’ŸbŒxù`z˜‘˜ ”˜¨S&-H!Á.+³¿ß›^L6þt\ÛFLÕ}zVî !mò¹ó0î 1î@()îP§–;^SÂäÎn:Mû_ uÿf›å¦ 2¥Î C÷}Ç V lø€¾="ðÁPðáN|8ƒ¼ƒOÀwÞn®ÖóÉbåΦ_ÿ¡²8âþùˆzO[Ùù UØïC7(HÕÏ•ãNH² 5äÈîñœí~³ë@?O¢i¬f„«r è:O#M>u®<П±àDA)ä0Ž8AIÖ½™ 7o§ýãÂЕ…úλ€®W':Wƒ ƒÎÇ‘‚óè +*")8 ÄìvËlºj4jÊ*Ajņ ì÷š,XòÙó0ø 1ú@()üP§Ž?^’R€S?œîñ‡¦;F™vÁogZ`¤ÈÇÌÀ0ƒŠÇ0¡¤0C:Ì#…˜±}Ì.ÚÍE1JT)†.õv32ä#æ `ˆAµcˆPRˆ¡N-b¬V„ pÒ†ó}ÄÚæ²ÙÆÒ«Ô0W¸ƬÙŒc{rGƒ¡$Ã:Æ” ”‚9/cÁY¨8jµÄŠ—¦7€ ‰ BI‰:u`VŒ(Á´{ ³y ̇öüåGË¥Ñ.ŸKoã"ÂXðYh0”—¨SÇ¥P¤¢àì ·{³eÿh³#@TÃaØ{ö€0Noƒrƒ„’‚uêà,œláv¯bf¤ÞS•ÆŠw·=feÉGÎÀƒêÇ¡¤C:ä NJ ‘«rëàSmº§E‰a7ì¾ÝnX1²å#é `HB:bH‚PRH¢N’ú• p~Š+‡äE×9‰`9ò»÷ÎÙH—¥7€a ‰a BIa‰:uXRI|Fw#Wíå¦\náó§5#‚ñaÜx;!V”|༠8¨} 8J 8Ô©®æ¤ð™(tŸ·índ±ÝMX>„×u©zèªoehäÈ&Í—G@ƒšG8q$0C=ZÊ*ýBÁ±–ÂîƒÌ›÷WÁ'ºÊŠ í‹PhäʦЗG(„LD(q\£ðÿ–  endstream endobj 1594 0 obj << /Length 2355 /Filter /FlateDecode >> stream xÚíÝM7à»…Ž31M6¿z’9sÛ݃¢i[‚5Ò@’í$¿~)M“|Ç&‹ çKX쉢®ª¨°»Iª‡Ï:÷Ÿ ÝÌô=¤-ïÞuçW÷f?üöË;>½oîÞ8‡wþxó•šñŽ ÝÀg7ïgŠ÷LpâÝÜÎþ}µþ|ýß›_ßýt")!þfÊÓ; 99˜µvfÜk]or&X/®ç¼ëº«Ûq3ÇS?ü¬{ÿ°\lÒÛÝÚŽ7\Q÷«Ö`d4b)tҠѺSŸAaÿóµÒW‹MfË›’¢d—0VúÖëŒ(%§J)é$“¦g½€ýª‹:Ý9wÜžþ<Î?^ s5þ™\b:f¥jV_`~Ä·§ž^ @ÑC9zPJ‰™4ÐÓ®l{:OÒóWÉóöà.-Û}Ee°º©1õèb ö?‡J)¡#“tò´œ„èDÝýzyñ>föûm]ý%§R|—êÆ”@ÄÀ¹M „RJɤA Kn lëPýcéÝ3¥L›~Óõ0ß»z—1å‰ä\B)%—dÒàRtÌØ ¢ÂšÅééw"ú¡ƒq2u¯^f @ÉD$9™PJI&™4ÈìÌy‹Q”V9þz¸6ÜÝ¥|š¶3é-¾¬ãÛUO1 (¢ŠE(¥D‘Lê)öƒdRÀÆå×AÞïÇñ¯ÜÔ¢–¶ “oóMZß±j€ÐøFF#–RÐH' -gVL”_1ù0îîÆãþÏäÝ‹b¶o_nü›ºR.OyƒÖç¸Å:JÚ¨Œ›¶§’#6 ØN7.Ÿ×ã—ùçó<á>÷UY.$3ÃÐÎÉå+ºéó®gާASsŒb%FTÆÀHI6hØ¥ürÈŠÚfnž2Ï×®åþñijoS=¿€ò‡r¡”’@2i (9³6³è.Ì=¥|e€S“êÆ@´à€$B)%€dÒPX¦5ô+«qsŸ¼‡àî>¹mlyÛ/Xû¶Õ“Œ(’¨#GJ)‘$“’\1Åá^Bûu‘UXKnT0ú|£Òd¾Ò´oT=€Bˆr¡”B2i@Øž7[e´_YîWã~œS¡àbB·ùè§žx§&Ô‹(`Øë0(¥ŒLê ;0Á˜_ãX¿O‘’ÆÕÚ&K.ða'¾“ÕJ!¡ô˜ŒR,¥ ”N”ºsj§aO–öëëíjýûú8ÿrûìW¹lßë¨R5}òõªbJ6˜‹.© J)©"“UZ°ÃέƒªûOLJõ›Åq—~˜×ì{ ŸUÔô©×‹Š(QØÜœ((¥$ŠLDÉ ;Y´ ¢Î»¨ÜÛᘹi0ºÍ¿ÚdŠïT½Â€Rˆ r ¡”’B2iPØk¦9*ô ›Åy]â÷‡Û×EbÛ"ðš§fÕCŒ(ˆh"J)A$“ˆ¢gRà ™ö+›1½J´}¤öE$ßÃzŸ1å©pÁ“>¡”’O2iðé^ë9ì]1~Ùc³Þއùr³;¤7;Æ;Ñu÷âÔ”zp1{Ÿ¥”À‘I=8>Æ5‚óË›Ýâ¶-s\è2‡o[5I@|¤#CK)¤“’V²E ™}ØmW‰/¼gjêK=¹p<%šŸë(y£2n¦cVÁfÓo—?¶aðR‡Á©wõ&c %áB$UB)%–dÒàRwõ‡.å×.çãv¹»»_ÒOÕæêûYö}ÖnúäëUÅ”*lpN”RRE& ª¤dJÁ¶£òªæ‡uz»<ï-õ½ï(Èñ™>âz>1Å;™ã¥”øIŸž3ÙÁ£¿á³—£Ÿ[Î>Ѭ=íÿ¹«©#õÚbJ6>§ J)i#“mÜ2¡P›ùFÛq÷°Ù伨š¼a=ýZ©¡i{ΧøÆÔ£‹(tØÿ:(¥„ŽLÐuŠñöŸ¿Vq7î?ŒíW=]Ú|°oX=ƀˆ.¸è“¡”F2©Ç8¸S¥‚]&f@‹óÅ}æÛcú‚ëÉÿÁTÈÔ–jqñxö>ã êø†ÛÿÑŠ°b endstream endobj 1457 0 obj << /Type /ObjStm /N 100 /First 1006 /Length 2268 /Filter /FlateDecode >> stream xÚ½ZM· ¾ï¯Ð±¹èIñC€ ©á^Z °}hjøà:‹ h°[øHÿ}IÍЛ¸ïÀAVÓË‚»³zžG$¥G„ÎPZn­ *л& ÊôÆ(ÊñnÅİ2¬…1 ´n‰ÿŠ-þ] Ü¸0ˆ#3°ü_Ä)Ýâº8¸)‡¥†—ó`Ö(è¦[Ú ÆX…‚È9 r±J…c„ö‚*s4›#¤à˜T-óMÕŠÃͱ£aŒõiQŸoêȜðÌ75*¤óM­2›#¸Ðs„”lþ #ÎVüEçˆQzxúh¥s¸ŽŸsp8€ÏÏ}ÅŠ3†ø§ p¢»˜{û˜yþ­–pg\XuŽÂfáqw´6Gøwp_q£"ÈìÓ¢ùì_9ð¸IŽÂÍÇŠÆ»ø ‰úk¸5ŠŒðC+Ú@¢ß—‹" ç*J zѹØ]¬^c¢bs„µÈ`Å)&ò(Öæû¡¯4 ø?ÿ܆±^±Iww¬Ågt«c‹y Ó‰çþÉcÁùµ±áù‚ms¾8Ê€9_òs¾¾ôç|ÝÙÃÝîDeÈœ/õ2Å?ã0 1úDñ×h'Œ#4ˆ%ÌÝéNÈøjb•q,¿Ö±í±Ð† 3EŒA›î‰u 0ýÓhN(Ö ôé!I˜3tÓ@¦ÂÝ ÓIñ,VÅ\$0¦›˜"8G»yòäæòìþîCyò¤\žù[›Çþs7^wæªñgÛ¯sÝ{øÇo_}sùîÝýÛ·Ê«rùîé³ryyûˇòúÆøËÿüûÖ¼ùñöæòg'º½ûð>VOä˜ç7—ç·ïï?¾{{û¾Ì?ÿö·Û~zóíý/åUó?H,¥¯èÍ;íÿ¶ýã7ww÷ŽöjKRñ>3IíÆØ niä#ÎG’ÒÀ4(ž§!i$©$²$²&²&²&²&²&²&²&²&²&²&²%²%²%²%²%²%²%²%²%²%òØ?ûtÓÉ7—ÿùaþþןîþusùöþÝ·ï¶/Ô^Çw|ë+À[5‰$Ðjó@ß+Æóoæ{Q.¹y_.OËŸ¾Šåó®Q›g"T9’%Ï4T÷sùÔjT†àóÌUžÌ'ZÑSöäÓ^Mé\>îÕ—ÛÆ'P¥Á¹|½Õáejòu«¬xñ¡Vë;qíçòA¯âyò!VÔ>ZÄç1%dòµQO¥cŸN:\‡Œsù”|J;Ÿa58àë‹øxT¯öŸ w­^çãE|]ªíÓc©4ä:-¢óŒ-[°û¥’\Ÿ, vßÇÕØÕM>jAÎåkêsÚ’§ï0k>•Ï÷à>§¯Qõåu¾EÉÅK~íaðyý®*׋‘,Š>ß×|*ì¾I©׋‘,Š>ßgÖ8TM>éÕ÷g×ùdŸÇ€ÒVü\é {Š.âó`ÛŠC'« ׋ƒ, ÷î1ÐiçC®µ]Æ"º†>%Úè|ox•NE ¨@ «Ú®×]}~ò¯Ãv>ãÊlçòymÅko|‹¢<ĶÚG^‘õ\>ŸÓVÈë 49—Éç´óÖÁ|‹²ù±Ú–­ FµÆ§òáŸÓ–=©I•ƒ£Ñ2>¯FÖ6>ŒcY;à[”ÍЫ‘ð–­ÑZ%¾^tQ:óµRe?ú¡„?¯Çƒ-Êgè1šÀäócYãëÕÈÛ±ý¨cŸŸ“¨_Ï/ö›½îÓòjŠÅSúû÷ÿ(cúËÝÇŸþ¤%…*÷‡Å§‘JÌH%f¤3R‰©ÄŒTbF*1cWbBŽÝž§!ihŸFíúMè°»i`‰ ‰ ‰ ‰ ‰ ‰ ‰Œ‰Œ‰Œ‰Œ‰Œ‰Œ‰Œ‰Œ‰Œ‰Œ‰L‰L‰L‰L‰L‰L‰L‰L‰LöÿÔ®LÎÑ®@ù\¾ß©]-ãûLK½ž0G[Äç[è¸7ú’–4úÚTE>‰ÏOé¾èÙ7µúIÛQ¼¾aF‹}‘Ðè_Tw é"B劾(ï¬#üLß±“ý¸7g› ±¢TjGßp¬™¡×—:ï§&ágÌa'š2wIÐë^mÛXD¨½Æ5ð$4?f=™pæ²P¬âÁ9zad½ËîQ>™Žü )[]êê8™.Rç® v§Ó5®Ö÷¯Rõdoz­¼ûBégÇyâÄ]Õ%ósûÙñ@ž8d&ü`4ð€rÔ¢­ð’ø&ªÃÉ„m'd?jŽ“ù0JQߥ ­µu|qJ˜|èGM;{‚¾ÝÅ=CdçâˆëÜÅ ­jgzUÚ·Nh¾O$=™Oâ¾aãS¨ý@lX´7DŽû†]œðm"Íça »:ˆ=:N&ô8ˆ¦‘IHè§Â~2a\×î·áR;—з‚v½*:ùɄ曗¶-áÒ³ =l—AGítT(Ñ€ãÞa+ RÑÎ&ìqñ°å`ª7rëø(.v> ö“ ýÀû­`xô춸zØ !îÇí\ÂW;_k•QÏåÓ¸zØ*…ÕHÝ”y;œ)óFŽœ²»É­¿Uvþae7º27}±§ÙSƒì©Afë!gë!gë!gë!sª›œê&§ºÉ‰Ì‰Ì‰Ì‰œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹œ‹¼¦sq†Æ¯Õ_8npà5±(ã¡ÃAÛq‡Ã:B{hqqÜâ°ŽPzB€>êqXGÈM"‡MëøúC—ƒða—Ã:>zhsÅû¨Ía!<ô9÷9È"ÂöÐèà‰ú°Ña!‡NÇëõ¡Õ!Z(Z~Eø_/DÝ endstream endobj 1647 0 obj << /Length 2382 /Filter /FlateDecode >> stream xÚíÝOsã¶ðû~ í$þõØIÒ™zèøÐ™¶®Ìµ•È–#)›¤Ÿ¾ M^¼/lÙn³3»‰V|ï­Þo@e¾jÝ/¾²íJw³½Y­o>´÷¯î¯Vÿñ÷¿|àóû÷ƼóϾûQÊo™m-_]|ZI®˜èEˆwq¹úçÙçó_üõÃ!≧wfRrn™1f¥Ýkm§Rj&˜iÏÞ¶íÙ͸¿›Ãal†»©–ï~TÝ"Dk™•SÒûƒÿäŽSúáµø¿ä‹OxË3_|7õ±wQ ýÔK&Ýֺ߱߸¸oêòØ]|$:ü8Í}“¸è¾(Ç%‚¥à¬¦wf’zVÊ*÷'dÅ¿`…©’L·¦PÕÿµ¯;ÁåPŒ  p-úŒà‚¥dpÑI.Ó1í’G\ÂãÚ7œ]¦`)Á¸®®^©\Œåܺr–1Å ÁX‚Rr,ɤ¥vÿ#Ë.°Ü×ã69ÞÉÔ;fù¿d37÷¥Ü\ @™ƒíÇÌRræÈ¤ÁœÔ¬ï ¹~6w;ÜŒÍîãy#ÕÙOçült¯Ÿ­éSnËÜ? Îã^DÛÜ‘rm1¥ 6ÓJÉi#“m}Ï„é69kûÛ÷ÍðûxHp¼p/›“7w§\^ @Ƀ0y ”œ<2i×qÆ»ÈSQÞz·Ýí“ô:Ö ]¶— †Ñ›ÛSN/ èA\ôIz ”=2i Ç5³ÒÓ‘ÞïŸvû›$=íÞ'ë¨wÂiÝÜ—rs1e¶3JÉ™#“smï®0g™k®Fd.§˜r/Õ1ïy·Oæ”ãŠ(\°Ï.PJ™Ôã’ÖÍÈ ¸ìc\WktÕž‡Ë7 @àZôÁKÉ࢓\Ú0Ù\Ö¯'ÜŽ¿5Ãv3Þ&O—Š e+¬Ó.}cÊÑÅ:Ø.d(%‡ŽLÐ)É:Ìq`n=ÜŒû!…nºÙlë á—¼;QŽ,OíÆˆÅ:r¨Œ˜L „ (ÌiœÇäE¨6«²çðÍ])×PÜ`ó1o ”82i×YÖj8¦u@ÜÕ¸»û?°Išîl½x&®¹å¸b ì3† ”’ÃE& ¸„t#ÄÕ\û™þ»IZÇå·ëÄåbèæÆ”£‹(t°ÿ:PJ™4 ã‚i ¶„ذx0þã"åMsƹ©ÞN•C87ªa @!„0„ ”B2©GØ[Ë”[G¬_G¸ÝíoÜåé†ãfw‹W§…Šzú¬óªï@±.€Ðµh4¢ –’ÑE' ºÜ²×P—º’gT©ëž¤÷2ìùæ•ÃŒ(˜Ð* ”’ƒI& 0uÇ:¶‰X¿ž^8•¼^B¼UŒçÜÂrž1ÅJÁx‚Rr<ɤ§rek°¯Äú‰»ÍzºµòsrC'g½¨ÛÏ_)Ærn]9Ë€b …`,A)9–dÒÀ²×¬€¥#ùÈe³¹¿õ÷ysØ|ÜŽéi£;²îgö´qîE¹³€r[Î…N:¥äœ‘Iƒ3—Üè:ãÇ?)ÏDØ´ƒ¸xÅ¿®=e›TŽ/ ðA>PJ™4à-ÓB@|~mãîþaŠÝaƒ]›®Þ y•ýu¾Iåc ´€¥ä’I@w‚”z°Kl†ä%´u#¬¬{<_t×·¤œ[ @qƒÇ¸RrÜȤž[gûûËÀ­Or;î¦3ïoÓoÃ>ùDŸ|שÝWÌâü‡_  `-zŒÀ‚¥d`ÑI,ÙÐЕ_߸Û?<–¸‡fü<‰šw $˜à¼g¦>ŽóÕ³´¹å¶Âñ-ÐeLV¬#‹Ê\)3• \©èê*9/Ó¢>˜ÿ«·s§Ê†ã)€€& 0Ö‘He eϬ²P _Öøå×MrR¦T½5÷†gÙ¹aåcJ"tQ¥ä,’IÆž3à ÄhÆÝqD†ÃÞð:M{íápnU9ÀbE` A)9†dÒÀP¦Ô‚¡_²Øáºašëi?×CžS½©ãä Î*GP¡ !(%‡LrÉ$‡—¼]"¤–ÏŒ­ª£âÉŸËöm*'P¡Œ (%GL¶‚uJA‚~éb?éïáьۮº{›;ɾaåc #ta¥ä0’I=Fa,|QDŒÛf“ô¨ëS@')è›T  .,paSa)€tÒÐYj•„»ðÒO Sµ»ôQu ÷ÕÎ*GP¡ !(%‡LªéH¸k…÷áÕ‘ÚEP¿¦ç”—"¾1åèb ì?†”’CG& èzË´‚[X¸ 讇Ãu3úïfüu;6wÃñ:¹ôÑ»Iç7¸š‹‰™?Õr11%6Jɉ!“1bŠ/Ĩ æn;¬Gú)G¡X_×8žrýé?érE1¥6SJÉ)"“E¢c½‚«cܯMì7›ËÍÁQš¦] _ êþ¥—½Ûá;R®- ´ÁÆcÚ@)9mdҠͽÖq¸w„ íp;Ü®wGôk­ë#Ï>#Î(×Pº`£1] ”œ.2©×Å­f\-tù5…ÃzHÏÚ§õ[^Þh¡Õw¬X#@h\Àà]›ÒKÉh¤“¦g-Ä(Ú€q¼‘çµµì+ÆW^g;UŽ0O0‚±Žœ@*c¨[f$Üv"üÒÂa<6ëí¼©_àª;ƒO-onQ9½€²%`ø@)9}dÒÀOj¦Û?ùín?Ýc@³ÿÕò>="ò¾®H¾ÕÕŒÍüÑ–³‰(6°ƒPJŽ ™4°é{&%Ü":ÀæiwÁ„}×–ÞÃñŸs¹¡€2Û‰¥ä ‘Iƒ¡Ž³¾…û:D mwÃ%ngú¡\õ‡9ß¾ðŸ}¹«€r[Œ¹¥ä\‘Iƒ+n˜ W¸ºÙMϽ —šS”òEÊoñ+üç]n) ,Á¶: IK ”œ%2i°ÔÊéIhIEK[?#Û-TÛÕ{®¯v¢œUŽ0 BBPJ!™Ô#´œY ·[ þ‚=˜PWÞjóÙܯbŠñxB"D@u|áð¿œrv endstream endobj 1696 0 obj << /Length 2040 /Filter /FlateDecode >> stream xÚíÜÍn7à{žBGû°ÌòŸì±@ ‡ ߊT{e °$C’ã4O_®´$gmrhÓV’6‹M£J3cÍ.—äšÎZ÷Ùv¦9'V˜Ùåê]{xu{=;þÇŸÞÑá}{cÞùëÅ»÷¥œÑ–ØÖÒÙÅb&)'Œ²ïâjöçÙçåù_¿½ûp"IÆž™²g!'¥–cfÚ½Ör}Ì© #”™ó†¶m{¶»>”ðþ£â£j ¬OuøÈ/îÍJÿP£¿%_|Æ[^ùâ,Ã3?÷ˆ‚p½U\…îõˆtÿ´ÖýËYê]Œ_@üç äqšCÇ)§OÊq‰`)y™ý; I½Le•ûs$Óz™7ÝímʦÒDºõ§°ùËÍhô«Ö G02a)xÒ Ñp¢]ò¨‘·^ãm×Ý5‹Í6%Ò("”ªù¿Fôâsê†ÎÔ«‹0u@N(¥¤MÔi÷ ÕÑ‘ºûõ93gûer4´’!§+µ~Ã+®ïH½¶ÓO9Kj¥”´¡Iƒ6©‰à#mÌk[Ïïv7›}rˆs]Á&f'â†ÆÔ£‹0t°ÿ9t ”:4i@'aF@tÜ£Û,öÍîf~Õ%/­Ö…oå{iý±/Þ9iC7ê¥Å˜4Øôœ4PJIš4Hã´Ç¥ /ín~Ù¥ŒiFZ©§±MãohU=ÃcEä‚RJ Ѥ!ÕÄšCéî»m·égtËurÈ£„S9Ýß¾æÅ¹¡-õäbŒì~Ž(¥DMȵ‚Î 95Û/W]³<ÞE8|»ý.åŽRJÚiŽWYP+ÀpÁ>÷ó¨.PJ šÔã’nPR†B\ÚãÚÎ×»Åf»JŽeŒ0n'R'Ë|Kª¹·Qç3Ü`)nxÒÀM"ùˆ›yÌÍ h—Ûô8&Åi9î…2ÿ­×‹Š0Q°¹ýô<% ”R…& ¢”$Ü@Pö ¨]·O{j‰ÓfXíuqøêëU…Ïc¨@s¦b%RXÆ Jºk³€”h©ûõå|ßeö ¤ÑÓ‚Æéî+}cêÁŘ8Øÿ9PJÉš4 ã–´ŽcÂïÜ/›ËùªYlÎ7Ï¿¼OÏñ[E˜µ¿Wν†6Ô‹0b°Û9b ”14i Æ$±lDŒb¿Ììði3꤃ÛÐzy1&"ÈÉ¥”ä¡Iƒ<ʈÖð0ˆà)yÍf»¼N¯õ¡ô4÷ÉP6|éõ b ìm¿šJ)B“zPÂZ¢<Ï!DÕ­6ûåfÝÜm7×ÛyrùÂMé~žmÏgOèý×ZM@ÈŒº—!K)Á“2ýY="#Ÿ’qóûôèócOîØ•ÿ­×‹Š0Q°¹9Q ”’(4i¥9á ¸*ŠZl»îkîFQp5Í¥N7—ò©W`ê €œ:PJIš4¨S®l O\ÕÝfR«Ûæïíq'r—žÏSF]3 hÏžNùï½ÞT €™‚íÍ™¥”L¡Iƒ)¡IËF¦L4u¼4f6Z6¯8Å&oI=·ã;ŸãJ)qC“n.¹Ñð …°‘ÛÝ|Ý%ÄI”{e²NwÝS.ÀÐÁþ÷‡Rè@)%thÒ€ŽµD3xŠB¶ÝamõjÑ|^vý…3sÙl-±?ËãS'8 è›P,À€Á^ç€RJÀФX«‰Ô#``?ß^w¹ØÔòiáþ„ÃÚЙzu1¦èѤÔRJêФ^·âð@'Põ×ðdXfþfø4};ÁôÍ·¥š€u?C–R ‡' ä % .æË°˜?\F3;äÚLgÆN,‡ðبzƒáóA !'0ÖQˆe þ”éKþÄSÍÕv~XÉn–O›I¯䎨÷>ùÝÎùŠu”|aƒ/)ˆUðüô;7ËÛôÐFÝ QLCÛ7Þ°ò­ª'`¡ˆBPJI!š40” kH¿½ð°\_m²£›aÓÒîÛfÈé:T¯/ÀôA9} ”’>4iÐÇ Qj¤OG}¥³BÓÓ&'½¡õÍ©‡`ð wõvT¿ÃÕwhU=ÃcEä‚RJ ѤaËW𸈴as¹Y­†ap—ÛaåTLëzÏ¿¾òzN1Æ v¶ü(Å ”Râ„&õœ˜±„QÈIµ#N7óõUúÖ‚¶’XC§ùÜënV}ªuˆ®Q£3º`)]xÒ K+Ò*xIÑ‘®]÷å.³¡Õþ<¿ðäó2߇zc1f ¶;g ”R2†& Æ#–Â3"Êo4|É=$¬9arZùÖ¿÷ªža €1„"r A)%†hÒÀPX¢<;¢8d˜}xØNÏG½ùˆoF=´ƒ{Þ?ß›‚J)AC“h\EGÐÄZæ¡bK§_y¢MUß’zn1Æ v>Ç ”Râ†& Üwnà®–ò›_~nV™¥£åÄí[_b‡vÕSŒ0ŠPEŽ"(¥DñQR‡ ÂýïD§ÖýUç úe7ÊäÙï›uóáþòvyÕÍ×ç ×òìS·Yuûí?G‘N)ŒÃÜ +Woºòq‚ÛB&‰v_¶ÿ‰_ÜÈáó øN§96R´©FÂRž4ò_ÞÍãÔ endstream endobj 1596 0 obj << /Type /ObjStm /N 100 /First 1003 /Length 1946 /Filter /FlateDecode >> stream xÚŚы]·Æß÷¯Ðcó¢+Íh4#0¤Æ}iÁÄ~hjüà:K »Å^Cúß÷›£3 v8Ý 9rÁ¬çîÕý~’ŽF#}w«HK%UIµ²=u41,5!F’ŽvÒKêjÔ¤£z@i”æ4Jí7ˆð²’ øg¨¹B‡0Ë&¡©¶¾iøÛDиWQtÉŠz„7y•ö.*'‡ÁІΊ3T±:C1€fÎPMxÓåÑYÒº©ŒDF®b%Ñà>á\š«%®ÝUŒ“ Ö0¶uRKñžZOÜ«÷Ô0KJÞS4akΰ‘xˆ3FI­ø eHjU½Ý ÔÈ?Û[Gd Ìa›½šÚì:.³Wó¾õª—’½ò¨&aÀQÁˆÏÇbÇ£À|u$a,ãQOèŦ¢ ¯6K½êÖn¤NæÓÔ[ñvµ¦.ÕÛUJo{Äxô­zÔR7ñq I]Á¨=iÑME“âÁydI¹l*#ᣮ‚ªÂÞg ê›QRÝô0j>kÖצG’¬ Ã2Úô0íÆSÏ’5ÞTFB§\òÖÅgo˜n‹‹)™™÷ ÉÆpniÔâ*,i0ðûZë¬i´©giÈÔ ÃõÞãq5o‡! Þg_è¥ǵ-Èy €B›dÕ9Þ¬iu¦ÎûὌêÃPÐØù‚×HQoëO±’¿×}™UÞ‡Ï]mºµõl–my ŸkÕRnž=»¹¼þÏ¿oÓå»»»û‡›Ë«Oÿ|Ø^ÿõ—»Ý\¾¿ÿðÓí‡ô¦`?(oo.?ܾHosöé@bgÏ´*–VÒÑæ»ôìYº¼J—¿Ü¿¾O—çéOµöoÒ·ßÞàß e¢(#[‘Å@¹¨M`ëóyÔ“€$yÐÄïí‹•²bÚ€T2 ¯¶1²çë,š©Ðb õÜtÛh¹Èj VŒªM •ÌŠ³€[é˜[)«ävX,Î"FßGØ)K[ l5[ÝGØFÆ3=Ž“€Ô1ª¹•2÷L«d©³:1q.c5°ŒJ&°Œ<­â|©Î)¥Ñ3®N‹ÊÕ,dø];R9 ˆê¤cnÞ8áæ6ó Úwžh.ËÈ¿m@”Æj«È„Ög± ®¹ðAu¢z°â`Xg± ªÙL×ëÐŒ»á––•W [©Í½»Žšq›_ D&Ø~wªj¹ñA± : (ØJm Ü3Y[ l„Qͽ»ââVy5©€sÔ²åa¼X ÷߈‹›1-\²mV'\ö1¥G«”Ï¢8ÏZ1|B¯Â=Ooª`Ã/é‡tùûÿH£$¥’î>ýúëÛhôâþîaz!’l¶}áFa“¾½B»ËË÷ï_Ý¢?éòòù‹ty}ûÛCzûù°^¾ûùöæògÈÝÞ=|t§Dýó>’÷Ÿ>¼¿ý8í•íw»ýé—wßßÿ6Çë–f/ß}À§¯6n“õà͇óþl6ÜXcîÁíA€"àZA@#°B¹†r åÊ5”k(×P®¡\C¹†r e e e e e e e e e e eeeeeeeeeeåÊ-”[(·©üö/zÅ]lìG2EµÃD¯Í²Ž»˜ö™ÖŠj‡Ú¾ˆsŸòaGµãºØQáúÜH:ª–áb ªïg²ŽjWVópîCE<©˜][ D±«¼ÅNËÑ¡³D& ¢N Šˆ-¢Øé~èĦ‡Ò¾ˆ>w›@lí^Ú‘ Â;Ðz®å¨¾ÊI@dÛ£_xó“5v=ÉX ÄMlì2·ëkY üÌ®÷o@l1𠻞œò•íúÓ€ŸÙõþ ÈQRô³ìzÎLòh׳Èb X.ÂOÚõ§ñ®µëé¬ïP›Tv3»áRÖVqó£÷“výiÀ"yw Ý­·ÃJ¡g¹õ”ùi¯þ4ܵ^ýiÀ/¼úz”§Yõ”­Ù£UO²ÈØFÇnd7|," pêÞ­zÜ+¶ÑÑŸ¶êOâ|Ƚ?mÕŸ¼Úª§Ó¬úžË~/üßVýøÊVýY¼†Ûu£G«Y²ȸ]ºÂª? H¸]·z…U°àv=®pêÇWv깜åÔ·¼—z7êþ>æ4ܵ>ýi@ä.óOûô§¯õéOöQëOûô§¯õéù¬/wp<ÄeþiŸþ,à•>ýç8÷éýïMÿO>ýè¿÷éG»Î§ïãw>½ÿ±äî‡[,áK¸Ån±„-ñ) Z‡–ð¡%|h åÊ=”{(÷Pî¡ÜC¹‡råÊ=”5”5”5”5”5”5”5”5”5”5”-”-”-”-”-”-”­¯²ÕqH\›Xa^ÿž¶ÕOZÍþÌ“¶úiÀkmu¦¯k«ŸÆûÂV?ÜØÎâ¡4•J®:6“ÅÀ/\u궈D@ý{tÕQ€_Tü­©ûÛ endstream endobj 1711 0 obj << /Length 1385 /Filter /FlateDecode >> stream xÚÕ™KsÛ6Çïþ¼•:Á“zH\;é4M'‘OmŒۜȤ†¢òøöY J h3NœŽgd¤vWûûïâ!`ø#AŠƒ˜1”ò$Xßáf´º ô›·—gÄ<·„—Ö“ÏWgÏ.„F)NI°º¼' íì­6Á?áÇ<_ü·úãì÷UgJPzOŸêɧ18åˆñˆ*§*~ð‹Y¬ý¥‹%!T„¯³úVÞeu¾ÎK‹ð²Êv·ùz¯¯òÂŒÊònÁ„)?鑲RñŒ"§Á’p®M¿•ÅFV¯³B=ðì‚`l’p”&1ÄÝ<û+„Åú_4¸úÆÁG5öƒGl9(9D)G8¾HÀ=¸‚BÐÛxûù¥eÀAýØM“sÂÉI8àÈe\jêɧC} ˆ9¢8F‘HÞT`ŒÃ«}^Ü€†;ãa]ê7²UVK}õæÍåŸúþ¿˜ð­ÜkaEÌöJY„˜à)¬YŸ;Î,TeÄ¢.m>¿´ 8r~ìÆ Ú e ´×i:âð’4=Ý´·íF²ý‰~ÙkÈçò:;lk}Ÿëÿçù~·Í4 ¿8駪§Îj+cÀÌ—š¬7àfçŽpêf…2Ìë´&ÔJ; 6»2ûV?Yž””ŠRžcDÍ·žO´7à#j'—pæ$j…2EÔë´#ÊDqG”ß«‹Íì²h‹ˆ2YÉBž©ÈåÝîPËʉ™Á{Qc‚Ÿ¦7àcçˆpîc…2Æë”%ID0cu`\Ó Éú_²Viþ¤^Êêƒú'7ú–†—Xð^–ûÚYg˜¡Ï]_}ÿµO&UóeÐðÉÀ&2&+”)xv2 ÆD/ƒv’\-VY±ß-–PeUYð¦,$„VK¾:Yx‘«Û¼Õ]Ù¥÷zªlî¾T•î*VŒȉVÆø˜ï0ŸOoÀÇÇNáÂÉÇ eŠ×iÛ?Eš Xt|„¡s.ë,ßšd—×f*¼•'}s©ó :° ˜[1kóû›yf¸D1íªõ#ÿV—ÙZ½~Xf7ÒE2¥ˆÿ’‘F›¾ÙÒ° x¤1 Dx䒆ʄ4üN;i$E˜·ÒˆŒ4^û:Ûn»&nTe 5ÛCÕ-ˆ.×Í[ýœƒè~¬‘C¶~æ>þ …˜,ÎWHoÀ§Ö˜B¬P¦räôäLEˆ ÂŒ?lUŒ6~é>!D ‘Fßýäg;9i³8ûÄ2à9Ââ‰SV(Sâ8r:Ò>8Ä·= wë¿ÑþqU@ÇÈ?ë‹çy‘U_º-p]åェŽ:¬5ÿÇ¥_›¤ùÝ¡7àë#°B™€×i»ô4B)å½: øWW…ˆà´µ‰¼E<~ºc°1Â& ó ÷|„Éæ©“°Êa¯Ó®Ä CqÜMÝÚ^í”ó¾Â»ýö°ô-äïÊCµ–í66I¸‘÷,þT “qCe¾Î|T½ªAÖv¢²B™Buäôdªæ GQÂÚ•vm6Z±€=XÊC¹V¿oܰ˜ßêáw‡lÊ`6ez京?‡¸&xš²æw‘oÁaf­6îÙ“£eÀ39ÒC„ó Òe‡ß©Â!(lŽL¥¾QC:Â[.Íî¶Ë6 ?ªe4d¼9(ŽÕAñGõ)¹-wwR‘¢˜Ü³'ŽQ0áΧÐðQ°³B„óðÐeЂש¢“TJÍŒx¡êàP¬›ÓdþU±‘ŸÝ+X 9¥É“ÿÜòD ç1•˜tÎWIoÀ§›Î#,;”•|P…ŠÆ endstream endobj 1699 0 obj << /Type /ObjStm /N 100 /First 989 /Length 1969 /Filter /FlateDecode >> stream xÚµYioÛHýî_Ñß6,Z}‹`Û²3|–ƒÝl6@›ãhÇŠÊLþý¼ê&cg(î!D)vW׫»Hg=L:˜”šˆÈ”r œ`Z"$3V¡˜u†Íœ÷Dæ#-w–EAË– éŽ@AªHc¢L’€OmI„Ç*C,ÎcÂâ~"ýxˆ Âæ(I o™š¤xÇ”4PB)›¤¦´OR`€ ¤ „*É– ™ò‚t Š© ,*jÒ%¦…!)Á2-I Žiå50¢'?”>£ ÙKøÆÊ$³>á†ÀtIrd:FÒ¾1RöNTJfN¸Q3cŒ?’^€Ï®àKŽð|ª_€  ³B&>ˬ$y^8f•N|žYm_`Ö$y1³d™o]Z‹8[/-Qâ)2ÆXOÎöp6ÂAH¬’äÈC+à:l¢ KðiR¢D<¼‚Q;ƒ”˜tÑÞ#xNXšÕH áÓ˜aNRvy,s2yæ”"]teI#@9 £@Å4):éÕœNR ¤è<˜3ÉCRŒ¦1°8ãh BI~F::+ f9+0RÎZÒuÚ >¸@càRÁx*Ó¤ød/*yIBz#óÈ^˜Ü¢ÌAª +à.&ÛíB|X†¸“ä8âIÑBf{™âç v„†|öø%J1¯­Eª &d²‘G¯_Ín¿nK6;Þlªæh¶ÚjÒ÷ÅzóËÑ줪ïËš½èâÃÑ즼kØ{$'wBÊ©pŒ¥FŽ:Ï1{ýšÍVlö¦º­ØlÎ^I­`?þx„?Ðnu — š‘åèp Ï+íÔxVq… J€–<'Ô‘ ßZhwÖL ¨,ªÄÚôÄ€RÀ*—•àÂé@; ‰ž[4ß(RM ˆJ0>[h¢æè>z͵Êš xS:ÁѤ3 óÜÛ‰ñŒçBµxÖp-âÄ€ZrÚp ‘ܘ!@7  ܉ÜI \Å01 °Ü´)# ƒ[…OGÃioO€ÞSúȥɭ§<Œ›{SŒ¹“jo9Ž ¢蘖âÖL ˆJ²µÐDŽ˜N ˆJ »HÔp¯ÕJË-Χ P)ÄÔ€Bqíò^®†qhs 㪀SŒÌ€*:›S4¹w«€ÊN ˆRÀÝ&zÁ[÷Xx¨ºV$<ë¹ÖC€q$@s¡lá2L ¨47.ï†J“GÕD€8Œ"!éý€Ó. ì÷z ÑñpÎÞãŠn!ò†ÍþñîŸ —y\µØfÿøø¡c:¯6MtŽËcȼçŸÄu¾ý¢;]KJA¯6Ë„„Ù²®îV%te³åüœÍnËßöá{“—ÅCy4;P¹ivt-—´ž¬ÜUûú®¤1\îÓØey¿.Nªß²/nÿ>¹wYÔXMo!3&G0HŸô‚ѱ%¢èÙª#t&èí¢%dG¨ŽøÆc:Âv„ëßý߸Ãé@ÄÜw͇î‘FŽ“Ñû³m/’¸æs¥íÄ€hJ:dn®" e´ ]IéÜç <êÌŒô€¿°ª4khf¤‹¤Ãþu>Â:­065 ögz³I€2rv23Ò-Äbv:7z‡›ë`GºXlÏô›ß46–‰ðÚª·Öá´Õâ¹ti c½®xœ!MûºâqÚ’*CgÈöuÅð¡.Çz[‘t‚lßV$×Cg+Ɖ J€‡¨Û§ÃÝÐĪ‘ÑÖ¬ì^WnàiõH€(ôؽ­¨ÈC( kþx¡ÿsøÿ"C‡?R,ÿ§cÉ÷Š.6M]%U3y¿¿kÖÕæ_ˆ¦¢ß7eõôe]þúCoé|½kêõ§¼¸ýØÓâ>ëiµýºÞ=–}†Ü£^ÝžÝ\®HÒñÕœþ9½¾š/n×Wiðüú&.ß-®Þü•èùbu{³8yKáðØt¼o>Wõ. ê>z\ËÇ¢ù¹‚ª™oµßn«º)ï“’ßæúËêj³ßÜ­‹”}Ð|†äŠ;µ?~싺þRÖ)“”o_=¾Û=\±.ÛXw_‡’¾¬‹»gÅ^ô¸WMQ7HØïª!»âÐÌäz*6É]h1ÉÜë-AíºzœïÉ:)vë;âè™phæomº¥Œ-Ö©ª—Ŧ<à’‹ª¸ÿV¡íGÒäÓ¿Ñw­àÿÒ.«}ÎìËê…}ow­¬¦Õ¤ãÊâ.‹Íz»G•/ð¤SµÞ4ÏYž¬,wMˆò«Z˜"™9ÀÞ¯í¶,êyØFãs±yø^á¿mÝb8y⢪~ùO’žýœ1‹94ßw!ü@I»;,ãÀt?”ë‡Ï/úú³ý„-žA9z¿uÏ‹ endstream endobj 1788 0 obj << /Type /ObjStm /N 100 /First 962 /Length 1368 /Filter /FlateDecode >> stream xÚVÉrÛ8½û+pL¸R©ò"Ù®xK™JMÍ…’h›cŠôP”—|}º› ,H)‰Mt÷ë× @pc ‹7Ö1ŽOÇ™4ø,øT –à©çÐÆd oVÁ/Š˜øq&´ÚA2ac\QL‚„˜Iĵ‘aÒ‘Ê1%Qa•Â.˜2ɹsÍ4µ_Êê1ô9.‹¤˜/¯ÉCЦí"Ê7I‘æ¡ß·ômZ&ÕMÆeUÏVµéV××§h2Êr :*«EÒbô);øÏiQgeá=7:³- \¾uòêkEr›x£¯Kü?Ìs|ü6›Ö €y>íÒ-¥UÍZãõ[`wu2øhz5˜g‹´XB¢ ‘ì÷¯ª»dÖCæd>Ϫt¶Q·]Fê¤JŠåU"kjRõNp‹¾#;ÔïBÜiàeER½¡MãÐà«ßmz—Vi±Ž<\LÓù<¥‘.§ÿBMhoÀÁGúZ§taШp©zÀŸžÒ’X£o.„eôUE}¹LžžÖ¼c=Übk>Ý›¬W ýùýð¤qBémgež7ÃAU¹ÃÿÿVɼÊòê‘ä0—ÃñYƒÒAS©Y÷«<©ò·Á¬, Xh* æ¡£§G×?|A"Œe¶xj˜–«bî¾iùÚ9G7½;þíÁÒŸYJ¥ß ]GÖhä+7µeëÚÓÃã‰ßÏ m1^øÝÒ6Û³áíЛ’¼Åøüjìã´ÃÕÃ×ë·üè´^ ü.ÎÛ(m 0y·œì0=½½þ~Ó˜’¸Åôä|||zëýËóãëËËá•§á_èPoöqÇaTƒû´\¤xªlìxõiœd½­Ãª^&Ù"¹ÏÛÕ^¿º="ßɦ¦×¿è€ïÐïaÌè–øÏú.//Y1/_ûf¹£««e].²Ÿôð½Ý\¢sálÔs–ì]÷x\–óÕzö‡þ$§SÕ+ÂmS€žÏYúÃŵ1]Á²úŸ§žVˆí7oé$íÁÆ)¡ñú  Ãõ‚‰LìÛd;º¾½7·#Œ2ßr+üwÉf ¥‹lZÁw·—§ xʃÝ쎲ÁI{Kilð·*²Y3}ÑTMý¯*“Y¾?yüõ$…ûá¶Gí?27Ùì±óÛûîsIžoLj.À¸©²gø–~¤Âí6 ?(oË:]ìþÙceÊ endstream endobj 1939 0 obj << /Type /ObjStm /N 100 /First 949 /Length 1048 /Filter /FlateDecode >> stream xÚ…UÉnÜF½ë+:7;Á@ì½( 8—عåB‘íÂ\&\¤ÈÇçU‘”†&'¹h^W½zµt±%SD"dj¡-ý*aSúÕB&¬VpBI¦¡&K*T `+…fÌZ¦7FhCk/´#e„öPOR¦ärR˜„tœF€²;' çrÀA†“ú€È%s©Pµ’ÈÞ ËI½Ö29˜“¢?ʤpšÂƒP†˜s,‘ƒ.eK Kš¯I0• ‡˜÷ Œð’¢§ (EêE0 Êi*ŠS º à(‘JZ¤èÀ €Ô?@¤€±%2’sBY dè¦R²á à&äXV¢j©É¦P¶´dSP‘œ‚Ê”))ÓØÑ'!ô åUPQšr(T pM*¡æ•#žF*¥®4TtB*´BZ³ *Ú0è@5k¨hÎaPÝ´¢f¤Ñ 9hšÆR´r†sT`8¤¤åtŸV3‚ŠåiXT`Åbñ¤õkQK(«'LƒVÛ²aù¤ãiЕ»À6¨8ž†CžëÃJo؆ ¼§¢5ö)åõ¨ 𜱄2š-Cëé“àûð¨ ÕžP˜>•ð3«ˆ!.CÓœÙAŸ\Âû¨‚@©»yóñk?ÄúÏÄ$¿µÅXEB¿6ýUU6”móöæîNÜ~·í§VܾoÞ}x+îïoüHôáÄQ±­ŸÊøLø][×YSü5Ç1;Æ­Ð/Ýq¬c3LÍ ö“ø…üô±˜J£¿ïcŸwåcÙét©óéë9ö»5“÷÷ø9v±ÉãK++w1–ÅN­ý)VÕ¡?µÝÃþÝ–VÍ®»­+þ5¹~ÚºŽsÔýÖUÕäû~ë+ʧÉw»õeE1ù~Øée|œ|‡­mž¿ióçªÚ.î1w¨±æµ:tcó ûŸª«¹[[o3÷D`ë=Ú§Øut}ë°a?fù—¼­Únâ¾w™Ç®›âPÖ´Ç/+ë6î±ýûp™âõ¼Ï-ºìù‚ÊÇ 3ÏêØemÆW8z—†kìsמWl6\cw±ÃŠ>YvøÝBÛé;/o±ç­ÚüËìg¸eLÏÌÌ™;¬åQa´ã?]ü@[ÿØõmwè‡rYÏ•åx.‡ü´ ˜MÛ/9~›‰9ÁF‡¸Pï¼ËÃÆhÇW²§7}&-Ç&Þôn¡1Þr^Ök¯Š±>N¸*ÎÓ_Y¶E~j'£«I^Åe§Ö¦«iÙÄuÈlûŸ˜b/¨¸Uöxæü[Zǽš¯Fž³á´bË=§kz··5‹»7¬él¹Î²M›®F ]Öôu9ý X2ð endstream endobj 2090 0 obj << /Type /ObjStm /N 100 /First 942 /Length 997 /Filter /FlateDecode >> stream xÚ…U»rÜ8Ìõí€%âEU.G®ºÌ‰\JíBOÜåI[²¾þº±à>Dì¡gÐ3hÌ ¸ªöAÔBÕA ¸ja®FX˵>í;á× ¤ôBɺRK%d£´ÎÞ0°¡‡ÿ"Œ%€e5€D¨c‰PÏ-i„¦WJ À(鄦¨-3«ZhoàQRèÀ(½š§+#Œe¸j„q WNŸ@¹”Ôµ°*…Û1Jk€€ÌÚ ëy–n„M™µ¢BDc¨ÙHÑ4ä%dzŒ®fB\Î)F'\ª†ñÂy‰Ì¶^¢„ê¼b à 3[#¼e¸E•}ÚB™}ò£šZÍÌÈšäÑ™+B ¢Ð^µñ@šjШÚ0'”ÊÚQ·C«Øa ƒ6ê„,[-ck™A©Ypô%æ'U*°GŸ•K>d96¥Ã4ð\¨Gy“ ´e¾ÀYqô(0œ ¨£Æ¨6 É|6T’ªÏ:rà 5« ,3+ŽœE[€ À6ŽY¬K ŽžÂA²‘(ˆ³„abÑÑX HBÇ©EÙ€Ðy Çi湘ET„ ‘ŽÃ?!½b> *‚R†Û36¤?F@A‰‡,Fi>µ&!d Ž<´ 7å¹ìu´°ìuº%ÕxŸânØþêc5í~Úuóç»/_Äýqÿ×ðs÷ßħ8mÚ>~_¿Þ-xÍùÝö™ATØû¹z‰¦…u²op!+^r“}ƒ{è6/—Üd—¸ã|¢¥›¾u á­X‰÷aØeB‚+Æãã{ÖñŠó‡]œÇ?GÖÉ*ò~wñµ‚Ø©ögþ•w÷¼Ý>‹XŒ«ó™•Œ5+ö‡L!Zï³-¹ó¯9Óá9Ž±ÚŽíkf^zVüîñȺÞÛ?wÝ\½¶ã¾Û?eâg!êðk>NxßÎø„}ðâfȜ慟­¯owÛöÈÊx͉9 Áz=šªM?L1«»ò¬ùC»Í<¢â~uhçç3éh˜ÃËB^ÊûUÜo†Ý¡¦3óÂ÷?1ÕÔ-O¢´QŽã&²Þq'W9bÐÿí?;Vì]Ÿ²ž#,3ªöpA¢uƒ÷ÐNÉ‹ë?"ÖEþoDPØãù…ž¬oßîb5<ü7y/+ö÷oUûs«£ÄÚ ýò–NV‰÷ö8Œ»ïhÝäUOËC¹òÜæO+þTâïñÉlû.æÏèÙ,27(ÐØž©Ù.s/õÂ.r¯¿ýWž"ß›åzgs]‹ø÷Ï\¢u&T—}oçÓÏȵ«q<õ_­²  endstream endobj 2241 0 obj << /Type /ObjStm /N 100 /First 942 /Length 1002 /Filter /FlateDecode >> stream xÚ}UKnãFÝûµœYfõ¿Á¬äÉh©-¡Ø2IÙHNŸªIÉbÛëuÕ{õ—¬”©¡¥ŒÇTäO Úð§+ïŽý¶¬‘b` ‰EÀÚðDÀ±xÀ( ¡9‹£?œB9*ˆESBæ8ʨ5ÚŠ+€öœÔEÐÁPd`j.Ç+0È.oÀPé,QyÆ '€‰l¡SÙð5{ÊͰPÌÆ­jÈ»4ŽUzOý4΢϶’æÐ¯ÔC¡ò·K;—,¨àÏSZ 7Œ¡ùôWÒú*ñn«\[Vjæ*ù»ª½QäQ`í)ÃB\à¦Û ¬¯ïØŒÇ*òþÒ¥êÜLÇE²uÔç®Ù¥êò)Mÿ‹ôÁºÕµ/Õ¾‰¶Hî EöØ7çñ˜§}µløã®Y¿Â#õ+ƒá–‘¦j×åe£·g™™û×<œh_Czm×Ð%OQ¿ÿÆZÔu¹Ù?ˆn¦¢â”ùkx?¡cI•ú÷•̸Äy[oÿ¡Ý¶ÞcêºÙ/pËèR:W¯ËéíùóÒOmwϽ¶ìOWõÍEåשÍ>-ܶì3]ÿ̸eLiHù£½nÏ sjO‰~ë™0.¿‹¶­fhú‘¯n¦¯Ï¯™n7<Я¶o4´ëG › ŠK¿k–Úõµá]Újלh¯»ËÜé'K‘Ÿx 7òõù5³ÊC{Xƾ±–téú卸?ÌМVå£ý;-u¼Ñ±­¤yRú/­ôùYb§SW½ ùcœ'ð?-‡. endstream endobj 2516 0 obj << /Length 1075 /Filter /FlateDecode >> stream xÚíÚOoÓ0ðû>EŽé¡&þosƒÁ&Ðô†8Dk¶E¤Í”ß§v·}qªŒi‹&5«ç¾÷2ÿjÙnq”˜é$’”"ÍTt¹:I¶­Õudùr~‚]¿¹é8÷z¾]œ¼:ã< ҉ÆÑâʵXFßâ‹|s7›SJãòª¾²ø,¿þYeóKÂcÌåìûâãÉûE›†rd=uσ‚¤)H"‚9s Ŧl§ ÉmAæÚdªØ¿ÌLdÍ G8á6€ínï‰ üz6gŒÇÖù]ž¶ù<+W3¢â_yöÛÞô2ßÜ3§3"ã?3Åbdó º“Oj„57·Mebc!íEì<èrÏÆç”aƨþ/ ®QBôâæo¦Õ<`²¶Û²Cͽ~îüï§ÙŽ#Vq¿’âáœ8±LãHI1%ŽéE9›å|}me¦îíywã:ÿ®‰–U±4\a¤"AŠ’‘HÞÕÿò6èìFy<à.@°‰$ `¯’!ÀÁœ-`J$LàEÃôÍí­¡¬â,­Òõ¥kü\Ϻé:+zàj¤É4»þû }TÝxާÚQõÙôPõ*¢ÌÙRÅq ReŽêiY”•m<½)·XËMV%ÕÌ÷ ËIê#M±npÇ»í„Üú†Ýz• ¹ ælÝ&1" ·|Š=Ë‹í:Ýr•®”ßcbVÿ0CŸh7ìãEwB¢}]„€¢½J†Ds6¢¹¦ˆHps&Ñõ†«Ê®Ê¼p‹ÞõÒöygçåev™Þd˪\þÍRP>ù~€5B3|£ez2w” Éô+ÎÙÊTuÕ€LÚ´sí§4_ï­ úfZŽÙ´0x²3m3èã=wBž}[D€ž½J†<s¶ž…@Z2È3™Öÿ¯h7ìãEwB¢}]<1ó+ÌÙŠæ)ƒ}pàpQ¦Ë£önT ñt× /èÓçÙ úxÏ]€gßÑ g¯’!ÏÁœ­g– !AÏlß³YÓØ».’­‘¦jšª1CŸi7ðãMwB¦}_äÕ³Cá][WÆÖPÂ+S %ªö±ž¦«¬J;†àö+>ÕÇ\ƺ±-¶{}@¬ˆŸºye ˆ &lÅJsÅ"«÷É~M·_«²ãödÓðÓ>nhF<ê.@HµŒ1µWÉë`ζÀH ~À‘LÆåj•®—ÇÍÆÒlîä ™uUÛ áx]€N_ Wµ~%:ÿ‰›Û endstream endobj 2392 0 obj << /Type /ObjStm /N 100 /First 950 /Length 1864 /Filter /FlateDecode >> stream xÚíXKoäÆ¾Ï¯è[ìƒ8ý~Æ^+ÚðÚ‹• ÄQtàδ$bGä€Ã±´ùõùª›œaDJñ“KK³X]ý}UÕÕRª gRÅ„§§a:=-³Iï™ô Lp(4L(M‚dÂ$ÆÐ$&‚\@pLJE‚²ú-i„`ÒISœp„fЍµ°Lé¤qL™d˜r`×’3å=¥dÔ A1-i”„ÆFIË´¥QPël3‚º”`F“FIf’ "0!uÄIÈÊ1›âRžYM6š3ëÈg-˜õ…V̉$hæ»¶Ì™d㘣„i˜çdƒÜx¥ŒP¼MÅ‚¤pŒaÁ$EV“‹ÆCÒ†$dZ$‹T $äZrj‘l™b±È¶’ÖAJÙµ@ÑÉÎqH)õNÐ<Ñ#LÂs@±œØ<°:Š ©¸ä(¦U8MAxxàðT)i„‡>eÙÁ’Î)}T6ÜJLŠ4×Â/4LJ¢RÀA“&Œ ] ScR1 ¥EøÒP:B6(Fé‰Ò€Rqê0…%„$ •h’ SŠ&ÃðTd†tTeä‹A•*kITp^Tqä®AÅjNÞAÅG3cUŸLž:†b"^Ô0ŠÈª©¬µCmê P¥”pƒRÖ4’ ‰h©ªmî°Í½ÅKÓfPØ N’ƒ¤Ôâ›}uvß=lÎ>µÍã.¶ß.¾ûŽ-/Ùò]sÕ°å9#ƒ‡¦«šú[öæÍbô:g¹-ë¸9æ·Y»õíÙoU|áÁø¨šÑ•í]ìÖýëÔ²®ê.¶q7˜ß§¶ÛuÙÅÞ.Ë/Øœ­Ûòql˜ëÇûjÓfqjQÕ릇êå9›HN¬òÛÔ®­÷³8oq¶j±™u/Œ¹/ëõf >h^°ßŧm;6ÏŠ‰õÓmÓ>d»,Î[œUõª™å÷lwC]_'–ÿlšž6I“þŸšúìÏûÕ¦ZDzþ×ü]lb×~Ƀ^îž ½/»ûøPvÕªÌcGŠ4²-·÷ÕjGruÀ¢Ê'¹i©ýëulß—3‹ìçŸßýXô¡ü²«ê;²FÑ5ÔÞÅ:¶¨U’i=oQ”3s>x0»VîžQý))Îãm¹ßt$ªó¤¨vÛM9“™cT_éýaà+!|ŒØ–â˜ÿ•Hêõ oSçÑ··Ø/êÐÍÃvµ7Ã÷Sì›ös\ÁŸq&ØYC’ÿÒÌmJ?ÜïëÏýR½jËz·mÚn>Q”‰cÆÆØŸ¾$:eøP®>—w9U±+«MÏÖ¿¤TÜ&ØûøŒõì͘¤z•á¯õ®+7›òx€ôš>¤)Çy&í/â•ógÒ/uõDˆo«ºl¿|…GÓ¨«®­>í/QÎçë¹ýîMX.›}»Š¹4×/$˜Š¶¢éK}6Ä)Øë!^î·TŒ™å]솲¼Š«û3·I Ù(­Ô¼™Ç´Ö›º§«ïßšieÎoqÓléøšB^ìëyŸƒ^ǧŒ;UcäbyõeÙòJm±$j:éŠeñ!óq±üw)EI§³î}\WåÛæ‰]s(,.r.È›@hÓ {¯Ï†ß×u´ë|ó„*_<“@÷Î^ƒ A ‚3vÜ øAÅ€,d1 ‹Œ|³@FŽÑ'?ËËý§.½ÿXÕŸË·M‹-7Éo(«Ž]´à¸ƒ[c‹'èºi­-,×°ùž=Ÿ áSúÿ8ŸV…3=ŸQ>Ófù$?ŸâˆÉf>Í ÅÕ—O¸‚>åŸt…0ržOœˆkÄÔó ]à3kžOž†Ï˜tæã¼ðFÌó©ñ9˜Tâ3ÞnžÍžˆÍjDÔ³9]3Ow¢Å`Œ(¶‹DgE¡B˜ç 'âS!‰Ì§}ïñY>u¢Å€ïÕ‚þ %>e {ÏœˆOÈBæµ€é"èùjQ'ªx†ÌÇ}á‚ç;Q¹hoSæÓÁVÏóéí-ÚIÄä3Ÿ—8çùô‰øL@LùlÐ6JÏŸ úßæïœ]§Ct .ÿöëßYàÌIÎêýfsóUF¸7$² làù8^^8Ã\/ZÅý£7 Y~h›ÕeD¸xœ_°åU|êò™|Ý3]TÝÍâZ:Wøô”Ôb SZ–eÇyþH; â‰ÛMA¿†þßþÏ·˜m\!™t¶Ð,ÉÐŽ•umQŠþkùÜôÌ{6Ì [Å-d¥R/VŸx±õ ÇýˆÄNcœÀ¾Ó·½vÏ‚Ç:±d! õeòS3/ˆßaE‹ƒœø“ÆÎú6#Ž{•!ûí5OOÛcŽÚÌ5¶É§)ŽÓëcƦ`qQ¸·RÄÎ)Ò&;åS>$å€â ›ŸD®GH 5ïd@nò õ Ù2µ!ÎX“gtœ×qVÆ1e ÍYš·Ã[Ÿïƒn<†´yæò õ•3ÊK“â0c}õ¨a´µä“¶”1:©PŸÿ÷>zJ endstream endobj 2537 0 obj << /Length1 2150 /Length2 15068 /Length3 0 /Length 16343 /Filter /FlateDecode >> stream xÚ÷PKÓ† Cà»»»»»ÛÂ]wwîNpÜ5¸»»ÃaïW²ßïÿ«Î©UÅz®îžî¹g¦çY~QP¦4±32³³u¦e¤càË 12˜é˜`HIU€ÎÖ¦ÿ6ê™::íl¹þ ìhjèüa1tþˆ“µ³H¹X™Œl\Œì\ &ÎÿÚ9rD ]&Y:€”­© ©°½‡#ÐÜÂù£ÌÆ”FNNvš¿‡mLƆ¶YCg S›ŠÆ†Öe;c ©³Çÿ¤ à±pv¶ç¢§wss£3´q¢³s4磤¸-J¦N¦Ž®¦&€¿ä mLÿ¥Œ† btú—]ÙÎÌÙÍÐÑða°›Ú:}Œp±51u|(KÊäíMmÿ,ó¯À¿×ÀHÇøßtÿýW" í߃ ílì m=€¶æ3 µ)@^L†ÎÙÝ™`hkòW ¡µ“ÝÇxCWC µ¡ÑGÀß37ˆ * ?þ[ž“±#ÐÞىΠhý—Dú¿Ò|¬²¨­‰°©­³Ì_ó:š,»ý¿vÖÊÖÎÍÖóß`´51ûK„‰‹=½ª-ÐÁÅTRäß!&˜?6sSg+;#ÀÔ`ênlAÿWz{Ó¿›?x{ÚÛÙÌ>D˜zÍL?¾`< ]MÎŽ.¦Þžÿtü/Á02L€ÆÎ#Ss -ÌŸìfS³ñÇæ;ÝÚ gÀð×ç¿OºÇËÄÎÖÚãOøßûK/"%®$*Bý/Åÿõ Ù¹*Èü¡ ²裂Üú¨ ÿ_âø¨ ð‡˜ôJ裂òbЫü¡}ª裺Úú¨®þ‡>êiþ—8?|†ècfFè#Òø¿Äúá3¶³þØÀÿXXXþ²ØØüÿ×ÎÒ›ü?VÈôø!ÇìþEÀx?ä™ÿ?²[ü©õ¡ÏÂÃÞÂÔö¶Žÿbõü˜¯õ?ðCŒÍü¸Mèÿ¤bþÈdëbcôW·›ÿ£ÂǵBo÷g)>^zÿp(°ÿãþXtû>·ûÇ0~ˆpü~Ôqú³¢N§ñû#ƒó?ðCË?ðCë?ðc6nÿXÌAÿHÅô1sàÇL¿þÿÓUÆ.ŽŽ/›¿o½–ûÿýf35u75†Yœ·3æ´¬ l¨Äu£Ýç!ÝUO¥¤õ\tüéò„ð9‰òG†ÿºã`ÒPÒʶ(Å­Àá«çqKýçÖŶg¯ý8¥©Ý6˜ß“ýÇ‚u¿ð¡ñhUö¼^¼Ôü¬ÀZ@;¥Hs\8òPÜúÄÝë~•-Ïï*îý`“†})›¦RÔñ+ž%Í5ÊœÃ"‚t¦Å‡¢B¹pGœ½½›AÉžx'”Š£†ñ>‰b.ôÔÚ`Š~œûºZ¡ÂäÔ…M‚­……v‹2:Eæ)t,…¹àYR¹Î»Å3¸Ø?'­†MôMË1°”–7ÝW¦•¤+ÛÍ8ÝÑZÍxB@FNXåDZ"n–PEåÌ•*/bi@ØßĵQZýÞbÀé^4û@>Zó!ãrvŒTÁäœg¨ºoÝj"ÔÂL޾ ¶d€Ùs®½^Hp©ûgaÊ6¸™óqU¯T­ù,™‘M¥ª:оÐåEkËFu0äf¸£Ù+á8QnÕ‚>쮬ĽžŽäHË÷â)¿\4õ-jÇEÝÎuõ´Íô ¾#5Åæìn~vÛF¥DGoáÆ+Ã"” 7@¤`ó³ØB¼€\Òq©Î#sDã7xJ/‘U4ÝÈ.MØQÖØ†É‚ß»¦Ÿ÷¢ÍžµrtDòiÓÐRŽOÙç.ý°¦•¹ÄlªCâ!8—ÏÃR¢%»Z4?4´æëâÙ$s]Jå/RHUM‹)&Vá–ð.6~˜&DÚJO.SÃ=|µ¶ÅLSî:ÆlÇ}qReá £º¿„›„ã¯fe‹s;ÔŠ¶9“š”4i¹ = 0îh=Û*—1¹½èCAâp3Žá,ìJCÊ,Gg§Ž‡È½9–oi‚¹ÉˇN9ŸERc—yPõjã²@OÞNjÌîÿé`Ov˜Òs®MÁ’*ôy¸¢6/±Ð¬ÞSŸ­–”ÌdúvH¦8³gÈaËÏPÒ^ÛNÄ„xn¤LZ=/Är©ûXŸ1ˆa½ e«¨FÚ7à7¡Kk}.²ØÍ’y”àséÎvì¦ @ “(¾–—íg÷¡v9cŸ´aA›Htß…/•*]r)ï\ö¶´QÖàåók$K“z½¡/ Ív™œo´J éœy.¹–Ò©…ÌꥊIËû‰ÉÀ¨ë|A FŸR0ÿ ‚7Hù¬PÕ#ŸÇòVȜ֗á„蔲WêsˆÌðék@ãÑ_s ó5ì84Ô·ÕêLôgÁ€c¾Îýo¹)W'Âñã9>Œ¨TÊÈ3ÑÜÝ+Úû$¯1•áVôðîÆ#6Ðø [l.(;⇧ùiWbðÜЂ;ü(zZôKÂx„¢£ï\©¿!ÆN-Ša[´Ø&±‚@lhÖ¦,ôÓ½î® 9ƒÉ^C>á„wó“ߨ›Õ©¯TM£ƒ¹„ÅÄ ˆ~ò¶¯ê [h5•¯GŒÑ« ¾É»«/LÁ^Ÿ\äó9½S5|ƒ6Fž¿’ݰA×Ñ:™LÉ{e¥ç¹mÅÅîϪ!r&’ž8GÀ>´{U•:²Îã’üZ‚Ñ£€Ô™ œâ÷ÄK$6Ïbh±ƒêš¡MÒG‡%ãK3sÓ2m~œˆZÊWz‡¢åxTì°Uv0¶.’Æ_^\†S—–‰ÆÍاB|–ÏÓ—ì©=fžŒ†©¼¤—{:óË^ªÊíowaìl§QÙTeX‰»í,þÚ×)³¥`$Jû… AŠx6%‡JUMdã<»ž™#¾XTçfµg¦<Ý+?k¼¤KܤÀšS¦ 9!h–› lî“)*êóè-™aïo^‰VÞ¶áC’-l^šìY ¢Y¥!v‡ˆFÔ3ë×#f”ÕyŒµÅñ_ø³Òƒ†€é}j¹åªþ¾ù.°-sK¸Žuän†;î7j¿ªvŒ©i‡ÞÛk¥c¤ËÊêË)NT%‘åuîî{ ä…â,K ÝÀö± |¦s§gÊ5˜hLy‹m¿ýìAX… ñÕc˜<0àêWÜÉ‘k NÅ~êa“H¾P¯õf&L<££}–•îb‚©?á'GÌ/rfQoÔÂlI­PÆR÷¶Áh0_Ê×ó½" á_E•“м£¡£òÁ.qÑìcDÜÈÅùw2*ì¤uN¢Ït¹˜ãIk¹²ˆaƒ08‘­‹•ÊLðkÕù–¡§T™µ¾½)h~ççÞHÊ%=aÖ$y+è¤'ô@ «ä·ºkÇ%í ó‹Ú]»?Z¬yj?*È’c‚‡Q¯*^ICÃ2Р¢Knü*g¦-ѽZ§—Jclϱžó7hà60Ë/œ™±§‚+€(â§’abÉs¶Çá¿kÝ«ðàû8|W@údæÛÖà -mXð+áüñGÌί~v.VäHIîyÿX äx¼&H•¸°'ì]6ÎaÎK0¤4DhgŠP'Ô«t¦X9‚V¯h>óÅq·DÙÓû${UÄM­ë%kò#FP.¥ˆòÙ—›“³ís XÁ¾$H}TÇk¶u§” BîÁ‚xV/'»µ‘Ï6Ë5ÍYÆŽ"y„óŒ¢Ð#TèǵOÆa­Ë~’(K‚çøÐıÄóM¤ç8ø¼/ƒO"ƒå‰†Tnñª¥¯ÉAÚð8>ÍM»ÁØÎdŠž(Õ‰ïJŸÏî’7›ýöÄU~¬Ã„ìý”œµ…P6ɬ~÷Œ´~€‡¨¶G÷Ý× Eï,öç9$9ܯ¼²*'9ÞON=ÓåÓÿ|›_Z*v ²ðø\Ð<¶ÏƒòË2nVýJy$Z4©ŠVœØõ šÄL ÿ‘éÑaÊû¦±ÿÁ ¬|w³~g|j§¡S'x‹©ž<&½NΩ55Ë´‰6uÀ„?2Sâ €¡êÕÂIÉG ôöë}kg× öùZ(ØXÕMØU­PY˜v«´ÙŠÓÛÊ0χx%ÀêM’†ŽÀ&<ŽO¡BZ ŽÈ­×gÄ“ ®‚)&i6!u‰­ÓÏÿ P¾&A;}Y ú|¡Ä—àôݯtŸ„a"(Å{†xœˆV ZŽvɧs‡`ó^[κð®<¿-ÝúQ†2à«`ðQgÌQÆåýÓí­aÁˆÇ°27dfxíOß°«¤çoŒ!Mûnn'œ²gÚÛßÉkˆ˜S)¯5ùé…ÞÉ¿‚2¯&‹Â..·?Öqp¯4ôðåzÏåO¶öัïÞ;dÑüЬÕ-ˆ0‚"ÿÏlè¥8º>ý@ DqWꞌµÕí«%`Œ¸¬†ž€Å8lirؾpXH]˜ŒW]ÆOüïTjg‰ù¢*1Xd™äÚ³ü.n(ûbûG)Hª/äè©XËtbbÛFgy8J •©Ëh—WÝœ²·S$˜hø÷`~LÀ±Z>þð*8Óbj´3¾)Ë6Ï”$ѧ¯|¨{Âz°ú§EòZ}ÚÜ‚¡­ã® B› Z¼!ù3ìýmÎ]ÏUÜσæb\Ãj<°öoÌu‘ú:ðöÒ±¿sünóÆÞà|á&¶bƒ+p^ù²¹ØûÉÔ°ècJ¨WÒmübÚÜÈñnî¨r…¨¥”òUXæÔ8)>Ù¼`Ãe7_ÍÄÎ÷<›n7‰ŸÆyê,xžeÒ$§æäµñ¯äõrÔ̾ŠWÛí„ãšðŽT½í;ÛyS¾6yF½¨=»•°Ô+v2¨Är³øK/ï¿srÈfÀ¯Ëéˆj„žïNìd³×Ø6©̶K qmÖCwÇófõ¬ ˜Ð#›Ľ4:T!žê"zuÍÓ/AðîíM›Ýèš~5MDúõIñžBkä—–ÅëšìFæE•¤°ìÁæû ©ÕÒà LUuÎ߯òP+2A‚4f¨ˆ— ʽ±Öcû#®²ï8Œáõ€!4ÜÞ±Šþ­¦fxBÇ‹Í&1Ú¦à¤ÍÆl×·_Wd¸> W@x7ß­EÚ Œ4¡úA„p»ÆëéC§eH‘l^Ÿ/¤cÎàvmMÑÈ(ÙÇ€ZhÖ=â†ê»î¥Ì” ^+1>ñšÐµÝ™î6£µ òhmã·dõäÎcTæá¾a8 ÖÚP¯Xu|ŽlØ.1c·÷3ž@H*ƒïÖ] ãêõbdØñ»|2—*êIÂù%»öì<›Y ’˜ûG2Qf™+V!L_ŽXžv! FEŸö°Žøñã&ýTóeØãZXaô²3lùÎÙ¯0銙û9[ ö;hÞ%è© ú}^Ä»ÿìöÎ8"9[‘ˆE^¡ŽÚ×{eã¶ÉVñ™`–B(ÎbH”r“‹_ÃâC¦y¦"ùfÃFPÉ•ØgI–¾’ùpÔ OH‰$•À‡^ {†¶MwÒ2Æ' CÔöö5ÖmüEjšâcÍ©lºÙä]\Ѭ²á‚ÔkÙ¸&ªÞм@¿fvïpÀÖJ[È[YQŸ»áU-ýæšÑ¨©G”šÆ¶5+u”¢lì üÀQ ‰õóaíÒuéÊrÁîT«ÿˆ½ÿö­­¤x²¿0nû'RH‰…é&‡÷ƒZÇ+ Úl±¹6~SP¯s¹‘üÈj´o£íS¶W‹ ¶Þ`­„(m&tOø3½® U#‡5Bµq%TzKç—ÆÏé„Dë×á$)Ì)ÓLhù æ½tƾ¬èAj´ˆ[ýÛ•™¼#¡a ‰ˆßân¦uÀò´&™Exs°ÑòJ®ö†ŸÐï6áÕD—éν<–‚–ð§A2:§Wѳu¾ 4`žçOLN³E¢ràsw†x•FõW #qCgö\?5uçà1]A8XŒNLÃEO}åu‹`뾊 mBÇ`ÿ]‘;+A &»U:ÚV$n Aš˜]Nùe Ò~A°ê049úZl“gû>|y »Ø™¬;ƒ}Œ‹±ÆÔ>þx~è÷¥Ó/0Ãh±2òç„Á*4Z¢J &Nªc_w Ø.›ÎÜó4Y&Ýfˆ ‹ óGÇnóú,꣠:ÈY€¬0˺½t×uá\%c½Í«â^ûæi’‚‡… ëo­^žc0ÐêïÒ' ,„2W"aD(Jï«‚>öý’7 iØÑNºQ†WíÓI>µ©¥6y¥³î´ô8ÓÇÄA\H=Upa³KCMÕ×,á8OU¡›VÑŒúEgLíb†>5;$é©õ¤…KÊ_e )âsêô§]aŠ*³V³¯óôOÆ&ÙÕºƒèJ¾ÑÖ +Ä¿Ýé3ä/¥a!Uľü4eEÍtÇö%Už梴uN ¾éê˜{q×õ™0”&rò˜–b²º‘uÜXÂ媀©ùE!Ç»¿†:øõA*M v÷WHW \Œ´!˜»:›¶ƒmÓhá ½\¦ÆR8ÕO°§>Ç$q_0ê…_L2 ,ªÃSKPøé C÷'¤Šœuài‡ËŠ8 êÏÁÆ7}’{Þ§ŸÀüµ:ÈݘjwDçûÙœ~‘ý ³ÎŽãV‚Z½„œaÎÞ\°‡1Ð,­ §Zš3c2'£6D&]PG2f‹÷ƒ£Çµ=€ê/5È¢¹|Ú¼0#“xe.jó ¬O{O¯<”[2 ß¢&=MKzÖ°ÄŽêJ^„ßÚ§“˜q%ª›É4 Xí|Š ‡¿`½K ßàêá écÎŽEPéFdé(+úí¬1z•Òò5s”—Î|Ò‘f÷t,l,Ô GM‚i„H&‚Ú•ù»JÑ…gs`È4®M*6pS,¥^x‹Ìþ­Áçê+ýOŠê0Ó?ßßqÙD sÖ‚HÓ=lè³E_4Ã?éî/cÏŒIjaèÚ¡³–šÃ¯L¨¶–_Þd*:oÊ -Jšê”èlêׇù ÊÔ9X¥æsCN¢)|ò‚xǦ‚acðW†5çʆ2û Á>sL#óÍ' »ô›ÔSpGUlXÁÓ±Tz/,keïÁmUË8—ø»‹£¤Ã;çÜ~®.«†uÄ€/9oÕ³›Ñõòt_ÀÄÃꃆê)VtEÞžpGÔª† ¥~ãïO>Ðl_pFºAã¼ÆÏÒ9gÕ*ŠCËÞœ*ÍÒ…ÝŒýû8r'’j2HU'”‘™²ði<ÓN8™tpg5„fDuÉ6=}…d£®®«6{ ì‚ J󱆔‡¿ž zoAÐÒÓi²ÆÈln¬ù¼c‹†j2pm~-*ëû?¸,›^}«œJ>xáúú%4– þò§i…ƒç³ìù§ÒwúDãþøÃ®¬ª¼ëNÆ[bØìzt¥:å#xú°WŽõ^93G“š º¢÷éX†‘, Øö=õ/‰ß³‚ "çò™P¾-~ÒPå_íé™,ÈtX"ʪ!Ì}ÙKÜí\cý Pdæð÷¦ ÖÀD” ƒ çèq`4˜H% z[hbË`›`»}®Ã wÇ ³ä¿|ÉD\˜] éyïeL!~mÂhºÉéÏDu§@ÞÁÿجP¸—c¯ðÒþ•k›Z9T„ŸCßăš£+ãÑiÿBù]B¦@î4¬rUŽ…`§pŸüÉÞÆzýµ€†{™"Áb_ŽÐñ¼¿C¾ŒýØ_…I’F×Ü0ÆR•nŠ ò³©ÑdI<‚IùÍb,×ÝYDÇ7)Ðnq‘ÌØöÈ3ë»eúúJÇz€;jó²J!6HžD¼Gý¾i ºÀÈ M‚ÚçðÞpW9u«Dýܰ#X⎋Q*WÚ••üéW?³PþÆó".ñ¯\[?ŽŠkD¢H7Ý{>ƒ )SÜÂqÈ:f4MÃ@!e²œãÞ†\¨¿«Ã«OƒÓ•0Øà9Ì\é’ÓSÊMvÂY7­n=ú 5DX(×ú~Øc¥[:“ï‰*iA×Ü:Yó\ÙìVâ Ó$f¶£ äÌ~£€î0ÅO¼@fkEÖíe×Çm !&Ê“ ôŒå!p= ø©`>¤ …–n¯2­R®>ÁnŽBDœóm{W÷Ù±íãF¡q˜â ·ð©»©C¾ ˆL:µc ?lz°±Þr2LjûIÈ&1eY™S^Ʊn+wFØCfæ[¬N¯÷¨!«˜Uº µwS‹Œž7ï5ú::^oè‘ kÀ®ˆ‹:ïˆvv  yUhDáÿ:!› 'I·}SR濚~vûn—蹆/E'@eIGCÊÆÚvðû&5{wßo„—lJÀ #pjHÉV~7öB»–å×Í¿×Üká6>$CàÙ"©·ÝTã¨T›a›Û”?Ôk×¹17úEðPÂ`TŽ“ùOsm¼JsÅS‚ÖóuüÓ"V¡‰Xbì$XÑ 30H{MH©ÌrãÛXfgºé±5;„{ª#Û¶±êÃåj°‡¾žd§R§õã”ßùxÊ7{²7š„,«ÊØB°ô3öÕÙ×óìg™œT³™¨ˆÏ(w–¥¾´ ÆTiVÈ6©Ì[m{ÔBxd¨©ºaŸ ‚oû¾´V ê¶øœb{îHˆd³yJ5Èwõ‰öL)pöSß×öô_ãµÛ,d`CPñöº„ykµÜû4ŒR‰§¿¼õ•Ì8„/ý>?7R@ÒÕ¼8þMܾM?¤¨iПlþ\Ó¤Œ: Ü.NPáXŠN¥m:lµ|æ-¤ˆ×ÛŠhù…–-ñæ‡zæ„tÍÑŠ Þý8±fò«¿/i"oç¡Ò0,î¼¥ÕYî5zÙ¼²uû™òÞÊщ÷r‰¼ûAìûy”¿’â`E÷HþÑ›ÆúmXÍÊü¢©›Ç;ø7/Z ùP_‡YD%|.8"¼á’PÝ™\_-;B7Cΰߘgè)¦ ý©¹©ù$#ç}óÖŒó•‘ó‚Jì&­Íe^gö¯ÖÓÛ›*[EXpØÇ)§îÎNÂVÌ<’1[ÐÏÐ̬¬çT{]_d‹8è£úÕ3m`¾Ù ÎÃ]O ÓI€z÷~R¦2ò:å6`ùvuˆY½DAgÜ;72Ååð L×B'úÖ±%ËvÜàn𞑈ߟô Ò‘Z‘Æ2¸Å„b߈áGFß L‰&Cfª¢ÿ5Ö®|ÏUzòé6ަÁ&¾:ìÙ›}ä†ÜRÔüïTƒ™fát†”¤‹p¡s*¤Ìêo )Ó´“zÆÍg"uÙkÐ/Eˆìd¿KR¡Ó(¬íÊ‘ý«X¶É·Ê»#GƒôQÎ Úõ@MÎ\í’Éáp¡ DÀzµžÃ¨ÕÃ@_™yÙXÏ µ–2#3&óŸð9LO9ÜÍ…r•8dÑ–Ü%:b)ÆY|ÚéûꜫP»Ö³j½›0ÔH  :ºÜ&^CF}@!*2þ„…Ö‰¨¼²YÖR\·ŠÚôËQ0®I¹8¥€<¬7Žšõ‡êp¼D,·Ð;¨bļ}Xjgñ¤¹7ø•Ý«ô¾vv—@P<݃fcäxºýW‰yÒ¶Ð-k*T®ŽñJaæëË4ää°:ÄZ±$ÕÃøcø»‡±r•žMòýI®Ç®€RnCÞp·W­ZÌÔŸ‹F÷ú©°éû/SèqwRP"WOíã‘®_¬½Òùj”Ë[B¸Iò {4¦bw~Üô÷áÙêpŠ˜ªVšOˆ Š~†“<Êv­Ñ?½ÊÅyß;lðê5y5 ¡æìxNO´õƒvØL´_†oQŸ ‘ð•w;ͨ£MÓVF+\„dÃBÖ‘¥îè ™Á^ù}e*hQœˆËvZï?÷°™ûͱ<|µ’^Gc©=wQ¸UPs6pVL‚X6B-Ö’Œ“G§ÈTŸøºiÑù×íG³Íu¨_}†0&|qý¥±Ù€2„Âf88K­y(·4Ee9/rm}s›Cx‹»#-àéÄA,%IMqyRê\ ã»mc6{š}—Ý·ûV×ßÚã4CÙóuÚ+B ¼+·gPF?|`Þ%¯zì«”BÕ) Ÿ6!t-+fÀÌú»ãvÊ’ª0²Š xQõo}ãC©ÐZ %X²,OÿyÖDÕpº¢°/)¥'kÈ3&(mæ#}½È*9r'™¬¨&½dû‰ì™m!p…ƒ\ÒzS ýfI”fNˆSFô¥Q$:ÖŽSñÕ×O;æÖCnCÄþú®¬µ†¸K§ï—Ù{¡/CjŠ9I• 8c½…¿œè×$b¥Œtæ½ÕvÜòèå;G7Ì”.†‘ãjÎ'$ú,³<öÀ‘Im òWÃå”o?{uø`“cWØ# øÒ…·÷„CØÓ[_˜sÐ¥ßÜ3„É©T¸ ǵ«Ë)jo)‹‹›Ëñ{©Ð!O/G 2ò½Òîzï[¾³`yú,tÊp Õ3¥÷a3îê²­,áÖPÏRYÙL¿w¥ÄHÏÛäZöZ£ù¤ôÕ­)U«üùÁTì‘P±¯²…3ªùÑÉÕÕ]_À >0éYCœ_^=ÂÆ …UqÂö¢ç`óqQd¥ÅËj˸`Åkʾ9H0è2X·„ ¹ìØÞ Üh•™0™¼+6ëëˆI‘·íÓ1Ib”«qÞU0t–š`EB…äÝ£‚O³§LU†›YÅ%k;S©·ÚiÐ×qÅIúÜ´Œæh¶"!þ ¶»cÞ¡Ó‘a‹h5FE Û¨¥ç}“Ÿ`­|`sæ“ÿF'øa®¹81ŽA§bøVL|çÅoð³kÙˆ'éªÈ4ÐhýIžÁ*郬{Ò+¤Â`Ü„ðl7®ø"VYÄÔìaãW¾0ŠY…Ù¾zé$ñ$àÐá²á„¤Òb=Hº¥½DÚ°ûÒSÝÍþ+t_Pôò Ãj¬²·Ût¯'åÏÊ2Cù$—x?¢éî2!Ε zê^³v)på&Ú'x1N¥œ·QÉ*.j‚z†(U'ƒÀdÖw¤ô:¹vp» ¬~ÄG¿‰µ5êîïˆB›Âœ)nSÃî䶯.$¨z6¯ß ù«=k%|ïZ ºq´5w¸ÒÄÜêy‰Å¦KYhSÅÁOóßWöÅ9kŒÁžJÊc]¶J(‰Õ)YÆ×Œygê!kXüzBŠ$ ¢¬fir‘mÝus`ÛØ?¿žÝ’FÌH¡7yÚÃËËkKÍýÁŽ‘ úÉ%g¯ºýY›hWæåÑŸ¬f5L>íΚ³”{úîd2KÔ6.ú^*“‚Ýr‚|¯<9¦Dß­€]vNAg`’æmRrÝÔê—+ ÄP–Ðð…˜¡)’°ñÈ3éqßø8LÍY>Ý0°¾´Ë“³7•çGVÅáåª?×­##EµG.÷‰Ö)ÈL3ôÙ_û—\aM Ã0ÕSF,1`ƒÑ„vÈåÐú»kè\Eþ1àdbV™·&ãHãšbx{ÿJ wø´9ȧ}Í4À¤pÇp@C›K^͇ÅtVîhÓì§]?MŠ:1Ë5òDdIñ““D¥~a©æŒ“PM¡¿`Qžë1ÀÐåA³ õ­óªO ?/Ôd=m0ÛN²ðW¾tj½Ø·Äù»»h3¸"(‚K ´ájérü>£«G ÏBM:´#3* ®û ÖcÜ>_¼¹»È²Æ£E­SÄä76î²ÜGÇ®ÎíѦŽ]Ã"e©’äã%uÙ8ãºÏ× ¾eA®?–¥TÎb8v¸”[ž‰–;Ïß'hHÙ¡=ƒ+› %$ªŸÛ5Ò+´_¢=:xìèm ‹bŽ¡|Âó)õVÒ]â1;\V<:«úÞùò2e•Kº¾ŠX$eÝ£âÎc0zžáJ/‹Æ™…}ù‹‰÷¦;­H6Ò½üÚ;™˜ÖF¿sŠOe…•ž“shÞv Š8—Òײ¥nê7‹Ÿô8áDð2©£>ú¤¾!â¥×ŠÛÌÇàUÚµ®U¦>O#Ž·4BõÖ^%“)š„~ý+£äWõ¶fjÃäÛ\¢ëd3(4›"Û’–u“]Ê!'»vÞE׋¯l3k †¨÷ib[÷L?—§šŒ\ió Cè݊ܳU¬¼‘ýѧÎÚZ%L¬‘iŽ è–v%þø§ÏÀ"Ø¢v eKzfñKVE‹Ó…ă÷YéÒœ†¶xˆÎÚÖø‚ê¤aÿs~tB å«[3˜O,‡WT Sk7¬¼œ ÌLäò*s@ƒÀS\ëØÔ 3Ù[F›˜ZP¥âŽ)z®g´Wôð·æQ°7j×Oô¦7ºeþ°Ÿ­ìãf\²J*²‰fò¨F]Xkù ü¾=ª™÷žÂ›÷¯I|¦'OF]ø>^QJ0HnLoaˆ›{6ë{(‹(©ðßgOJâR8ÊŽ°™  ‰âgpwæ  †ª€)ɉسÏñ$Ã,ø :‡ ¢ð0ñ/;Ï…Óz‰i­0M³kÓbxŒÏp»ä Æön¦jV`kw÷ ä«'žÊEåÓâ±4;zU A¾,£Ü7~0±kèÞ Î/:ÐÒg3â„ûýy³N³*ÖÈ9„¬‚¡OŽwI„ày¦>Ìr ò³höàÚ‡¡ñw(*Û;é7Ûarç}0km!§OUY+r™„ŠáEd)±?æ2æQÞñ”8,ý».˜’ Œûbõì!=Û] ¿_}UÅ”Ù2AÑá±DIÁü":½Û”Ä_ÍEsOo@¥ XúU}€³j hÙÓ¿KݵQ›¹·ÅapbX‘ߊ–ØÅ0”n=/bköÊ NöCºèÒ–Àï\ S?¥uˆ`QÒ”„ön¶ã>ˆƒQÌ5BäðÛ *Ký4/ÑöÅYyBû½cê‹Ü½^ÁUâÚBÅgJ”*ì·+)R M5èýÇqd˜´£d•®IÔž Y}îDè¡´O`»~qwhÏ<> !ãDµ‹z4ŽÉÛ.h„wûÇgÝ™Š¸gÀŒà£Ö8—Pæb,Ç3%8¢l[­*5ZD NõÕJ¸S϶Ío³æJýiÖQ9eyߟyu'ªÉü˜ü*¾ÊÏ=È ›æE¸NKeÊ–™‘¾°†{ͽ°†ç>C‚æ®â@œˆPJàe2*â UÆ1ô{¸'HÔ`:TO|ô¸ÕÞM¬e47‹‘»/Us^¾TRs=8Ї2f5³N»vüf œµ·§ÊãÁÄqB»‰5SéÊN¡ t\-o÷‰f¤V±â’f§.s·;ñc@ï(Üãx6L§c¢æñ”É’¨š Ü*ˆÿ1ã>#©a¦»ü(qXvÂ8&ÉTß²ÿ–¹IÞcŧeäÍ5ÆBÈýsøÁgã–ûæJÞ®àU]ž­,˜~øÎ/Œ»ò2Lv°©ý“ùð¼è`™«f€¦Û¤6®¦UÆ®©ë–·Ü]íhÊá©OíÐ5Áƒ`“ßz6JmŠA%Ÿr! d†õe:¯´N”G´¹Ø‚ýý´ÙjâÓÝ4«á‹Ã5馸1³ƒÒï*q̃×y…VÜ` E©ß¸m70MÊ‚aGÜH˜ŸÈ×Xc®c§xùd=Öwí39ÚÖ}“45³ag”?{²×;RlVˆu,E,Ì¿Iéã5êú‡ûàªuN†’› ÉIë7‚­û³Ñ c^»5S¼»Žîƒ_R{]è}ƒ-©ã= óuø**¼èÙ]d‹¿ƒ!œývß3žœ<ÎÂóeË9•¾ïÙ/J}P6(úG“&IjÙK_5ªÕîËâˆØ6L(a„õÙÈ{øi[ÍjJ³&,«øÆº|Ê6}û¬™ö0§ÑgÙ·{ PuZZäýÜ.›ØUMŠ0º ¨¾Áe”³Iú1¡AÁ½&œ@5ÃzR|Å·¯ßš´%ˆ²º 3—óX šLÃ`rÄé=”œ`ï®ã±\´üÄö+~aÝ× WaÇ·}:ŽgŸ±F««KÁpÞ™©ÈÅâY²„E:ë n˜9²—ŠxG÷dÓ1ÃÐé;ˆëÏÕ½+ú…ï¥Øòö¸ÒŽ;L¢… E¥£Ä总&hõ‹îú±l8•¨Ô˜ØC¡>\F–,ôëɈË>|ý;Io3Zà![%I Ð èÁ‡¤©®õs¥rµ¨§v ±«Ïl…ðP,ÖÅ»…®.èÝW¡Êñ Lû©ÓÀ’i3zÉ›°ž7bIâRäãÞ‰Yfi©€U±ÐÓR5t=÷]A ûHWcBøxuKZ²V¢“špõ3ˆUEäKšQd½ªDO„­%98cüqm”wA Á°6õÆôñx__¹âðÄõ€Ù.— ³¶øè-Ò®S×X"ýÈhæ —íŽ2Ñü„W?)ÉQÞvÅ¥¦ßUtc~¶ÐVü}ùÑ_2ä{'W-­«õ¢5.ÉôjììEe†äXcyb Æ–?=gÏÙÚþ°×ÐPÍîò h;Ò…boyjø€D%މÏ8‰[`_¾gbâѹËyrÞð¥&EŒ>Ùz`§³ÊŽáVtß™_x—e]—þÝŽò‹¨C“…˜±§Þ†õU©3,NâXYΆۢÊ6 t}Œ¥–ö ¬‡÷§‰|…1RÖ½ v‡Ç2¶=Ô`š±õ&ívt$ŠÄÝy¸švÞ§­Ï×f»…â¹vpë' w5>/ÇvR¸(l.­Ù¾ëFRÔEIÌÆU…õúšh£V )¨p<‰VЯÂ0Áœ´]òrš·7ÞíÁrh’ȉŽKÆ”|OTÚ«„@¥µO‡„†l@–³í†‹|ÏB†|*ÒœŒÐ·UX'ü™íðx¹nÕ׺©0bZ!fi[nÀYœ¦*Yû„YѼÃÁtËëã¢LCá72Iøké}(E„_±“®:ð-LÜc(œ <ÄfÝQªôàØ§-Nu™~äÀ†¦³g–9NÊ^Öû ê< %÷tÕ¸‚­JLú‰k2±9ûD#Š%êò}¼Ç#ÁݶØÕ{Q“¢0 ±· ‚ép-„çK®:²'äÀa/TCä3þ0º ÈM3±3ø¾ti5sšØeB‡-ÙDª'ägö« îbšP–HØ™×h#L=ö£ø ¸>w›ùpîŒiúá¥ÏDˬ¸ÑSgœ5Ç’F qè¿ø…1 k… Æu,ÝïŤ Þa?»sçÆ>)9«p ahN0ÛK#9¹y„ÎDšwëôZ*K<) ¤R|óÏ_Šu4ðT½K³_†Ÿ>¿b­Ý¹džz-«Þ8ØéQïSýï ð¹óLüM5Ö¦a7àâÂ#m„žK=Õœþ™Œ©?MròŠ7ÈüÎx|ãêJ¿" *ô­•óã,:mG+)¿pEk¹¯‰þ“\ –›·5Ù›¢šé‘âÏgærè-'s·F»k«Ê[qŸ(?ÚsÑ%8°Uu'­°Ÿ9¿4ÀÞoàï3úÒß¾þmp¿þþ>>¨Llë-œ€Ü¤é·du5iá}w 7Ô]%.i~WÎÅ‚9e*SÂöÄæ'õ¨ê|nøZ |zÙGÅ\Ë«û\†W§\âºcH4[ä=ÀHì'7pùñ£"€+4òÔöÔÄXÑ4š&¬9Ë2h*0VUŽS~ÿiåñ«Õ‹:zQí"Ï/⬉¶røc<Àõ$0±väyÂ=wQ¢­œ¶a·ÿ΂•áFtt+ŠæA¾$¥îM)FÓ>¤¢mÚOÜoüý: È#•"¡…¬°ÆãMJ“Øé/½=KD¥ºÞÛ)$zÏ0N ÚzzŸ %Ê ’ c–2¾Á~øÄÜÖ-~ du²9îÇ)®ÎøÑ™[Q8‚Ëê&eœ*ÐÁ"G°_Âx³§%µf×sAP¦!¹'fóIË s›é "d»<Ò06ƯÏw3£Ð7g˜®X²+ ÈŸ$õlàßîÅ"&©Õ:¶åwˆ^Ÿ—˜XUËOÌùÙ¥±ïáÁ:OGé}“çH‰–¦çŽŸÇØãÙñþ$RüjitË̹üf#[µ—²¼b<„´ü¢£è'V&åŒ`H?~Ý—€òÈ#DRð y8<_{(ôŠÀŽsRóÔ@þUêéå‰àx·äŠíÓìÄέ˜9` F{‚š8’¬Û~`„fÜZˬ[töY"Ÿ®!¢`ÃÂìØöfˆ±çÞGƒx¯ÅAYˆXq*bÊÇïé|j]½ëÝžÂ-M˜Ä[Ùñ¶©uÙN ú)pQ8üý6nºÈÄ>V îwñœï70¤¢Àì%FÖŒ£ïr.éZ» ­Ï ŠS:ß›I¼Å_`°™¿GéÞÈ£ÀØ,H{nÏð÷Ű{•N,§ôÕÀ7R?ÆHè{BÚÝRWÙ&*§ëùú+Ë©¯§é‡ÎVœzH‘š7MtèüRŒ*ø²Óõñ·=7oÎæU“ä(¤F¥4tpr‹Af”öÝlù­3£7•?ÒÞ_¥¿¢9ävèS6}DÖóìh±Y"Ðݘ֗BkEÊü•—ãTWY6•ÿ=åg6{·.‡­kÇÄù‚îÌ"î|Æ'îÊÑïÖˈ ¡òY€E˜jëÊzÙôB¯þ™î°dH8©XwýŸ 4s5‚•O£…ŠøœÂd-ÆhŠÿ˜ø endstream endobj 2539 0 obj << /Length1 2533 /Length2 18926 /Length3 0 /Length 20387 /Filter /FlateDecode >> stream xÚŒ÷P\‰ÚŠÁÝи»‚kpw4и»÷à.ÁÝBp—àî ¸»;áöÌœ3Éùß«º·¨‚^Ÿ¯Oön¨È”T™DLìŒ@’v¶ÎLl̬|1yQ-6v++3++;"•š…³5è¿rD* £“…-ßbŽ  3X&tÊÛÙd\¬l6n>6>VV;++ï íùâ@W €<3@ÆÎä„H%fgïáhafî ÎóßZc://ãß1Ð t6Ù€3­ªvÆ gÿ AËoîìlÏÇÂâææÆ ´qb¶s4¤c¸Y8›T@N GW à/Ê  è?Ô˜©jæNÿ(TíLÝ€Ž X`ma ²u»¸Øš€àìUi9€¢=Èöc¹ ÿi€™íßpÿñþ+…íßÎ@cc;{ ­‡…­ÀÔÂP””cvvwfmMþ2Z;Ùý®@ k ØàïÒIeÌð?üœŒ-ì˜,¬ÿâÈòWp›%lMÄìll@¶ÎNˆÕ'ná2÷݃å?õ²µs³õú/2µ°51ý‹†‰‹=‹º­…ƒ HZü?6`âo™ÈÀÅÊÊÊÃÍ 9@îÆæ,%Pó°ý­dûK æàãeog0ÓùX˜‚À½œ€® €³£ ÈÇëOÅÿ"D66€‰…±3Àdfa‹ø;:X 2ýƒçïháÐe¯€õ¯Ÿ?}o˜‰­µÇoó¿GÌ"§#¢¡úá?”ÿUŠŠÚ¹¼˜¸8Lì\l66^+ÀçãüÛÿ²ÿ[ª´øOu¬¿#JÛšÚxÿ!îÞ‰¸þg3hÿs6t€ÿÍ `Þg€ö÷úë±r±ƒ±ý>‚¿]þÿíþ_Qþ_×ÿÿV$ébmý·žöƒÿ=ÐÆÂÚã?à}vq߆¼øBlÿ¯©&蟃µ³6ù¿:ig øBDlͬÿm£…“¤…;ÈDÉÂÙØüŸ%úïÀÁ­-lAJvN=pLl¬¬ÿG¾9c+ðCÅ <«¿U ðIýoJ [c;“¿n‹ttz ²‚Œ‹ àÅ>Rûß» `a¶µs»Àä|¦vŽˆM”› À"ò—èÄ `ýx,b¿Ñ;‹øoÄ `‘øñ°X$#6‹ÔoÄ`ùðqX¤#pvÙßœ]î7g—ÿÀÙ~#pvÅÑ;pv¥ßœ]ù7gWùÀÙU#N‹Úo®Eý7×¢ñkÑüÀµhýFàZ´ÿE¼àZt~#°ð_Ä ®èÞ, '«ß&à`F¿8˜ñ¿ˆ ¬3¶³ïÆ¿!8ÿ’ØØüú×Ò°˜üÁôA¿#€iü³¯ÿî/½ƒ øÐþ+á7¼!Ö@›?¢€K5ý Á>¦À¿”¿spü]ÿHú—ÞÎÅñp`³? ˜…ùoNàÆ›{Ø›ƒlÿ°Ë,þ€`–@p[­þ€à6YÿÁ=üƒ ¸?¿#s]mÁ—õ‡LÎîw1`g»ÿQƒÉØÿVƒ ±Ð¿°8üîï_Èäô÷Iÿ;Vö¿„vÎ #kkéïi€ŸÐÿ(ÿgHllàýÑ?6p;œ~sø \ÿèØÜ üù·L0K'k “ù!À•ÿN~³8›;‚þ¸MÎnv8€c¸üÁMvý‚ wûc#ÀÞî@px? ˜¾çïâÀ‘Èò[PÛýW"7¦qªÍT:&¯Ží.¨pItÕ™kŽ·"IC=è+[´7ÂK¤/^GÍup¡- Ê­OÞÏq*S;­ˆ‹“¸ýG"µ}$ÄLj»Þ/ÞþVoš!;e¨r\Þ¡*åaÝ»õJ¹×ö•-†Ìï(ïVsË"=—M3}VÒó/ž¥Ê5ÊšÃ'‡uf"§ÇfN-Oñô ›A>¢“rÇÞ ®gdål¦c P¿•ó‰{hÚ÷xë·A7´B°û¡ûÉ Ü‹yý}¼¾Ó4uñ¯Ÿ„ãÙru»½€î('P<÷>R¶ð_t¯Õ´OÕ&!ˆ‡(€ÃlædÙïa O¾höWa¾Z B•~ž‚’µ­Y“éôD}ý®ðåÈ8PhIŸ÷Aj}ÁAmÇ%hѤL4nÉ'Óm ="ûAÁ®š÷U7ñ¨/KÔSh´B2À.èOu XžGCØjv]|§DÂ7^7U:†t`R-jï=%]6yüAß-L­ª|D!.~Æ–UΡ™ßÎ<:yÕ)Ì˽P5KŸªF ?tL^/äˆOKP¡0€ó%y3"C°QDzûÖÍkjÈõUs¹+<ŸW<ªeÉ« {ð'öfPópîÁD¬LwöÁ1 ´0Œ”iHâïrôq|!xgÕ‡d~lskÝŠ³'b »Lß©h¼Uè@™íä;Ï-ÖM£Ë6á›´0Æ™O³|{’gß6år¬’‹¹âËÇß®-|\¯ìó]ÿeœƒ¹ oˆP²ŽEfÊk ¨tXí/YPz[)³¸›Š•Ô ·Ï™ÐFòÎ¥Ï ƒó@`…A€Ì/ÈøÁ·J¿|R]°ÚsÕ—š/Y*› Û ˆab66…ý¾-Ö&Ýb÷a<‹ ±&©ôøºOP§üttUh"zìݦ’¤Í~,,… H\éz*½$Œ»…(.ñ·ÈUÀ\¢Ë@‹¶ß#6Dá>Ž–—°xÏ„kž?oU‹³ ¦• ‹,æYK,ö«Ä[™ÛèòŽFt½ÅÙZ¹Øø-Éoëª2žXÓ7ÍŽñi×3 ÛñÜ&5ɵ<Õ ,ê|ó­°¾y¸©ˆÀl5Ic+ãcñ˜‘1b ¶¯ø|ÎEUg8‡ãåÐðt$)¶ž?’ªªoØDá {O éáÀ°±[~2-S—ôIäa×õÎ’Åqrn)3P‡D Žó«é<ƒ¢½–A˜³/€+Y7FE‡’ߣhJb…kðÓôÞN" )Ǧ²ý וldþ•Ÿ‹Tm ú¶|)>2À ùHò¥^Ï✠çAfÌ"sØa$ÕF [ 0mÏ ó W}€Dõ¹ ·Òàv6BâmPÚ| qåG÷ÔQ&Ò—›ÛcU8TqH¿%[¦çr‘Sl0ú4æ{úlðSáE,@ZˆŸë¢I ÙÓ©¸îÄÇEÎ0Y~ѯ¬ƒœç‹lÇ Ò›Ó»½ÖËíŸï<‘^——±Þ9®†to{˜ÅCˆ‰9rì&ÉR&`çï#¤µ9>}KOžþéô=K¯u}Få5<¡°G ¥ÁoÔ¸®œý8.ÊÿÙC\O¾C•÷Ãâ¹òç¶¹,GÓk©býg=.®Ð$Š­®8ºÁÚut8{¸²Ûª…úÄu¾¶Íi•ò„ZOŒï¨óy€(ý&”¿R~&!é;³hbú/zLt~êìÅ/†¿ªàlR–õ¢û!0¬)Þf"ØjG:\Òɰÿ‘DhÄBVŠ—{5Šñ®¸¥°‡!çî”ýŒ*Gª¤5²æi„Z”­b<}çóêBG…'·(kªÈŽö³Ês@«0[§[ÍTzmwü”u邬RÞì¥fe+ØB³þíÃÉ ò*ïTS"ÝCç“K b— ¶uÉÍ6gýA“g©±œSh ¬.L…ë8ásðn”f¸Â}¤<} ÊW‹³S9Ó+SÉY–b!¤|ˆÑD;ôñQàYΠʦè¡óÇϽv¼ ˜ŠÕD–4G΂£ý#\ùÇ’dÜ9ˆŒI·Oƒg .šè—Ÿêtº”ÆÞÚBF/,49V *Ń†ÐÆåh˜Þõ!Nã`”E®ÜqHùªAìѤ/寨vQ ê BÅLçÌÓä0e4Aû­ú­HÞw¸É+ªÅV‹;ɤŽ(µÔ=vzÁ!<ù·«­v4^³WiÄU)8­MG?]¢}ê  \2º\¦$^`ܸÌÞ %¼²;MY"ÿ5Q:‹–h*gE/Qã¡‘©¡m8k%Șº¬4fS’þ»qÇl£< i9$Ie™]¢T‡ÈvÚêiÄ>TU£é·*Ï`#ÛÔÜ?`ÊH¾ÂÂá›ß[ýþé6™'…§»R`ÄŽiO…Ê/bwÝ6™XF´XØvò•[„õ Ç¼ [E’÷k¶Ú<²W,muê9åZpì'¾‘kóN»כùWË®=¸’läE¢cªXI(< ×¥0©ÍAׯX!CU¾õ#>½JÿhÃÚý§MÞŒrˆ¨œ‘ŸüÚwº¶ƒ) •׫PÑGðØ3ëóï);)ÈAð“˜sV$H$¦«¦A¹É1QÙ#HU˜¥uÈJnDõ¼Å7” ­AKüy/%¯aä–Z0­ZNo^ä %ªë޳æäžÉ÷ÉŽéMñ2È ÕEÂã&†¡…80»¶Üy’/¸)ˆ:_dWa[ƒXO/HCIC.…x‘FyM, kRµ+€Jwz¥z†F”·ŽtcB±,E„w¼ÑüvX¢êè‡G?xª˜s¸J·ðE¶T¤iµ…¼@r| 2¬-jw 6³Ý⣠‡T«$äã(&€[[Èçê¶ŸtϪҷ%oZT]…§ó-Üö¦=(^LÒ_¡zFÎBЩœ†×|3ôÞ€Âïg>ÒFŸ-!òí\Ù[ „¦°VV¼‚sv¶¤²ç¿À ãëϵ®xìsî¾ÛÿÑ!Õ2­aÚz-ƒÑ–»ÒqT8* ÉoØ|Í$tzóñ=ÓÕ.¬”*å[ 7ò݆òBƒ• Í™[úKuЇ?„äajЪý÷:ö·ØÍ ½>Òô«ux¢b‚BéŠC0mœ)˜Ï|›I5F{9ƒØ¦5ÎŒÉCeí$YMŒb„-ǯ£Ù«¦œRú£Vñ´^{ßÇøVáÓê­~dÉ4.&ûÏ áÔd?šÝ91`Žç}Šxì7¨wÊøÒ¯ú /kŸ„è\âaYs15êø«™ªîR’ƒàÙ ½0»p5’:OÞgq¹d#[ÜjÐÜð³^¶£‹‰àÚÅû;‹f"ƒŽÓpD;Iƒ©4c«…ŒÙÈ{R[üGל9:öô¤å´ømJŠî‡)¯_gðÏå{›U z’®7êÇš$H~Ö§ˆTî0ºfu³è'Á–ܾ…˜bH³8+äññúVÖbßÎ<ÐZV¨ˆ‘ÒMRÙ6hÎIf*²@`Ë£§yT~žÝó½Òqh?)]"µÎ ö§,ÊQË w,ëûøT¶—LwMj‘ éÌ©“‘¬1ûÑf'Ü_c"nIñ)Á߯ê¦Î ÂâW3â%”ŒzŽ®éW5-žYfÂ`ãPÜHxuè0Æ;sž³wòyœ‡Äžû¼|[£µ–¿l]o2”®£)PãsàüÜ/[· îZ‹Fä¾7õf#y”‡”%~½žàB›Rfñ2=R»ð)7î‚\¸õ]Ür¬= «~ÃÙú’={Óeª”o×xâ×)?àOØŠzÊmÀ²¬ée¾86t6Ä>•~8j¹W«ê3ýëD&ÔiÊ)$b®a;bcÞ¡dµÖ×3CÎËADBeÚœ’.’ÏSAUFî§±¥þ—ÞÄx’zÈØ~â·tÓj“¾“²:oDp•Xab`e”p}i}y7©¿®ºvoê¿’ÃÂtе‡jqí ˜¿Q˜* /~+¥ú̳9ï ˶bæ*´çÇÉ]Ëãÿá6÷ˆì×U½ÂõK·eÞ¦"'II;ö£Ÿ¯;ÍŸ!s%/=.wkwn.¨Ï¼®Ü”ut"dâóšš7„‘ζll×,åm%L¥‘mJT¤HªÕ¡+ë´Q«ßõ¤ß+ã•ä¿fÉ¢Gð}ì-%+ëÃSò“Á‰8Û£Ya¾µêòâWìIÚ¡d1ÊÛ¢2V©óÙ°m#ƒ¦ܺLÏåÅÆ~Aº¢€æb –u˜ÎÖ€LJ}J*PЧ.v‘ö¾ybxg-­'GâC‚Œ5ÁS…;¯,ïá®Rw»Q$—XxúD2y~y$ ó¿Ÿ4mJ—<Øcë)íFÇË+àó÷ëURæ |ä“w#4 :uÝc@*3ßÖO±F[û²š³åGê9ž!—·y‘à Y!y·ŒÒ€IЩ”µ`Ãó^å†ñV~H ‹µhΔ/öÏà;¦Ý¤˜LM,MãVǘI¬ƒàp¼(¡O=Œ&~z”ï‹*œ‰ÕTº¨°åßu‹jš”ËvÒö ¯£àDº÷–êY¾o¤´-D7Φ“•@N¦±OØAμ½]1ÃÀƒd›7AE}~JH ®p’wñëUøÀðøñP-¶¤íùY±°K7X…ÓT»½1âM¼õx¯½‡TÕiÝ%éµXƈs›¹[È‹ˆEÃ(h}Dœ¯ãà üÕ7[,òë)#*7Á’÷¥:Áþ7]öR¯û¦Ñ]¯kƒZâðr[gµévÑÞ¤®HTlÇfR×É’1³:ÐUÆ¢›žßÌÍ^ñ$ÁF[O٦˻íhñg"y¡tÞç6¯ºá³S´óyL¶q¯æ.p~xøZ8kåxá+!]hs={‘îZ^mÄØ£›î^à¿1ˆ®,ܘºîH,‡×ØEóHÊ1ÂgX(Â#ã«Å`°›Ú¡B!µ-¢Ñëü1B|Õ¥£Ž ažÕo“Þße fÙóÚhïk@êW¢£rGí©“¢o _³¨®¦Ìà!. Õµ¨ÍǸc;ö®×g5ÇÙkô—ðïc!Q=¥ªOž 9Óãå//¦íª¯ä?Ÿ˜Í o E¹¥ö_D“Þ>šhÆÖcßD7kIø@Ôdžï‚41[ ö³­­•K±¸_`-ìJ‚üã%ùkc 9fÓžuÞüú¹©@…»ª «ï6Žÿ30ò»WµDe_ž•-ü€è"X´¤¦QÚ»0 1Ûwn)£ÚT¶ÔÂʽsêÙmSß@šáxüQëksb…¨’ÏTø©q˱õCÍ‘SòRøÒ³NñNE3ôÇ_ÝñòøÉpÌéFß½3Lu?à”Y¯„p,ûë®…zö£ö±`‹Ïµ_Š[“÷M¦Bõ®:¹í>§žTÏ.ví7Jô¼ƒšÓEŸÆB5­+ööãÑÒÍAF„„;0ÁÔ¤án•)y’º‘a9C¢ô#‰&«ÛôÉAÙòƒ–—­EiÔá»Í!èèF‰‹³óÁ­’TÎ]å‹TÂMhT2W…Ãß]rm~IWÏ·¨…|WŽ¿tVÇýQÿ.ñ\zô{[EB  Z0}º ÷Úåfùó›#ßñ´{xêʧõj‰rD ¼µR¾ Àñv`.ËãBH+mâ+bç›á™WGÞ2ó¦‰Á]’Í|Ûöi*$Y_þ•÷ÔM Å…²1Þ»IÛÊd]ƒ¢€žÊ–_n!áêºÝò&{'GÊi¿VMëÂá&ëÝø~þ¤A¥þ¸/ßò>ƒ¾‘;îæyS_¾gÚãIʤùFޏ˜›ìÕ[ÙUûõ8Æô-[ûnÜ·r¾šâ ÞNÃ&šRÜUß<ØàŒÊ±á´8ad¥ ¿QôžòLíqÌ19⢣Çq’Û¢Œ‹$Ë\ýÀ$‚MÚ ÅyÏì #.;9²b S4ù>ßÍÈýªí7ì9¨G“Å&©g¸³Ÿ(Eb½Íù [ Ïõ#"G¤üÜ9ƒ>÷ÝâÄù—¾²:ÕOÒërjMExìLæðXpe³Õ̵Ðaª\ß·op…_×l¶xÆÄµ(ngÖ7Û ·Mqd;Ð2(’°#•\G¥-\Óe|Ä~ wBIŽäJ…†D£“3²öO—××µÆiò‹þÜÆí€&…ÍïõaÙ]Öƒr{°Þb! ¯òA¢MlPuuÞMºìÓ×±)ÛîPU}¬nfbú¨<ˆ=Ö‹¢Ékoöý£\õKEÝ Dáä…­ÓÂþÕÝ¢uØÄ¡´±-vhQM](a V÷j'‡Hãt¢ônS>ŒÔÓ|´+û@ÍLÁú—^B#í,·á#ùî @03ÃèOçß‹Ö/^y¾†Ÿómµ/ †ÎÓ…˜R& T$Ϧ„E¡[Ç-YÂb„dùr,EoÅ:Æ:½áÒ‘#F„|"baÖ–Ž—<„T=p)3Þh®—ä|°¹y1v#•qU|ù^ȱ­(2ÊtD7"¤úr›¦ë„«±âûEÝÚs¯Ó%2SøY¨èÈSí‰Neiº¿®}̽/ijf¯@ð{b%Grc©!„ÁMAÉ7(Îù×*z€KnyÓ$3”«nX“Za©q¹2ä’^ óœí—µ€#ÁŒ;Ÿø@bæo›ðnÖ&Ããηg¸ÊP4mº Úü*²HBX;4` º%'æ•Ç[o·mŽXÛ›ð,%wÐA!tuë|{ª…@^ÍÆóZ‘m£Ì£B±s¿,«H‰µ•ž‰¾Ešˆ±Fö'\„l¢á¼1{µÃò’ñ0ˆªöéA(¼®ºgcEÉõN¯rcÈÛ6ÚzQšKüá“<¼{Ò_røj}'â\¡”M7Ðjžû 6&E ¨ç3´K {"£n÷tοP0üjžs‹•¼5œ‘Å´Tp¼³TZü%­Œ‚¤[2;"™Ãò¥{¯»áËQÆÕ)Á6» s¸GcÌdоâÖ.ÿèÏÄïq;•’1ɈÑä´m5ÎÚ2éźÃ\5Æ˜ÇІ]ô …ë[Þ£åK,¡¢¶øvãUŸýƒ"éX0^”Øc`]v˜ùÝq“¹ˆŸ½ß¡¿Ÿ#<åþ¹?oBZ¿`“ÇÀHŒç5yœèms(©;®ØR<ø«^·Ž‘(;—Ѹ¤¦¿Ê¸”4¾³ÝÁÅbqg½_Nù}¾ç<†Àóñ¦ož„‚6$úmsy ØU2ý®Ù–UaC«p³~Ií®$ª}ãBYÊ´îKMN{NeµK_¢&Ÿ>³Pòžu‚pK ªõå¶ÈM%7ø‚\7 Vnc/:éuÂ"Ym¦&‰_/eÑñ?[ûøŽµ’kk¡2½'w¿†¶±o>>˜D6ÁOCC<õ&T#•Égÿ Ô{j¥öfO°'ÛCy}ôt”×ù<ܺ®âºu¼´®­Xtî››J IDbó[v{”I¤qjf#«ac8´¥§fŽCmä„ÅG Ñ[” ’!{W¼¯°š&VûhíÌð{Sd$RüͽINÑÜâÔaȘÚß…ã½$?'kÀJ=Â56äLŽZ]V¿—þšõEö’ “nÖµ[>Ò~ðú³ïº ÁçHx½¥~‚ôrTÃjcà»l´Ö`™¾™%¥óÈEP]-—ïÞ¸0\ÈJ¬…à/J>6oˆ¬ð)zØ#Îd_.ô·³¹”p Ü-¥å„?· ™|•ñK?”gó ­‡ÃVÑÚïu2iöNò=Ò¨•.M„NÍo=šVqÍî·d×¥RÞmÓEB«¡€…õŸMÍ#5ž…qö¹»‰¨þr>ŕƾ<.3ßÀ§Ø3’š‡J,àžX¨Œ¥i'¶±¸MGvhÛ‹˜ñÞÄàó‘ z.©ý:ã1¶ßÜÌgqºYy=itÊÄ£c\)¥¶,jȽ +˜˜¡f3s²Y«/­,üºðèBÚ¦j¯'r^b“á`ÉíÇDG¾6ñòŸ?À/Ww…±¹@OTR ·ã™|ÖÌËÆŸþ–üù™k¹,À^Q\*ˆµA¤Ÿþa8µS"“ }cºzÙSóbÜ>Ùê; áÍMiФ Õ*s%+>'œXÄDYb‰P.i!L ûqL‹ÕÔ+zº½™‹½x°%LjÉ5âÒ‰ù©’¶?Ó%¾±Q~¶³˜R|Â}fŒ½’Ú§­ÚTˆý¹QbÁ­îŒq7¤^cçÊÀ_®”sšÇi]ªqmõWt' ô¸ÅzõE³µAè›HXTRÁ5ræ!Ÿ#bTÇŠ÷’U*¶Ëu‡æY ö_6;­"© DëÂmiù͘VwØ{€5•ÍZD« rgÎï0X— ´žÈš¾“Q{-6Þ…©¯)¹X‚ðDQLm—oÛÚç»O?KÃ=Œ±}Ž6ÈžƒÒvFh@¡æÕ¸3šø„ÝzZ‹NEãjÊøã–q}=)‹¿R,Ø<› Âx|hý¨#>A0åXZPÁåUY+Uƒ¯‰2Ñ«í¦u¤ëÌsÐî$µucRBF^ƒAÒý"NS>:Í9 :?›ØkO¶ÑLàËp$D}Æù‚\´ÀV 5©Ilœ)Ü“]Œ€vˆ‰ýð•j[Yê'vC-ú›ÒLT|s-Œz¡Ù:æ·ý®7­(k‰NýÎ5¿ÜB¡K|Ÿ®Ÿ‘eÒžý–ï9C#cXÕÆú®`Šª .jÀ}ÐâÞÕ˜9‚š‘þ TðZ\ÐÛ4E±õ/Îl{„¥ž¢BSoÍÜôÉ00DZžùÕÒ,JõWۃ忚x—ù`@¢óíLÔw-Ûk0 vr¬ê¸Œ†[=1W8Äaȉ¤~O ó9çöZ¡¦‚êí-%{¾?Íq nÛUMÒYTr)lCøáá¶¥Áu/)›ÛÞ=ÙÍ[ŠI¸ÔbmsÅåFà.ް^„#`a‘<« Hú:À½~«M³ás£®óâ!õUÚ²7^W; IVOxY ÙàE'b†¶ÿj3k¼¬52: ®NÕ<¿T¿ÅÃV'¦ÐXf*Œ‘ ÈGqvÉ1eHÏ,`yóͪKn{y1¬ô×Å; SµÄ3 ¡žPû9äÑ,Ÿê‡Þ3á/к Ž”|EpÉàjK*ð }±ôèÓ(Ž)®, !~Ò+0 U¸6§³õ(dƒ§3WlØüÔªÿ=Åb"öçilÊc|O}íŒtI+XNíþãØÌ§ÄÚ òÀ·Íè e¿ªƒåˆˆ½q–„yëͳ̗C˜Ÿ#ùíÕ«‘“¿¿7]ß!é{¹!öþŽ,úÕ)èïòƒC d$Ù÷ˆl~þ8>—ïƒ6RvFé¦ü™ä±øè—“ä; ¹DÊ©©CMCžº•b†ûç°kl7ªÑ{ú;ry8ûÂÊ|kE‹ ކ¾+²º½ ²tÛã$e=¨ïFLï™^koééä³Î¦Ûƒµû®%ñ³»u“i0)|^,¯P¾c®/‡¤Ú5 i,¿u"†ƒ^aÕÙJ—C\îÛ{½`Ú8™út>_r#ªwÕ-Õ„& Ê×þ¾õy¦-6õºòvÀ½|¿øWd¦¬¦«–xƒðlÙu¿<Žöé<‹ɤÂÀÏKbR誒C—ÈÛ_ß〿oŸœÀ26Ç_]Ý{}µöÅ-EiD¸,X.9ø^XRY0ÅD@FàH½?¢DÊYé\Àß§ÍJ±ò³šÜ@À=a¯®‚‰ ­ïA2;Šo“ɲøV›÷˜ÁõÑãæêÞ7$TÓQž¢ÒÚ:¤À‰5§Ï®K®Œð6¾TŠÛÔüC˜`Öœ’³u{ˆT²ïŒcê[ÎíI—·ÀŠßÞ¶PfK½WFoØä¬½XrkqȦ®C•Á¡Z›HIB"Ë– g#@IC˜*æ­ý š¹³Nƒë/G5ÌÀžQè!!oi» ´ú3çícuU¢ÉûÜ'ñçú§ÙEhöLnŽÇ $Öþ¹Â‘IŠ{yÉ©Ÿõ¶sñðµù5dаb(¢Œ|×ÑÚ{ÐôXXÆ3 àïËùFõæFÇzž£éø'¦sˆHÙö”?С¸gô)ro'”uÔFÔ°ò%Rö£)î¶a QµˆoÃK+°íÃßɘÙDýrµ95Wscûbk±·ˆêÜETÙM`¬ÐÚ”ñ¾;K¾ Sú³eš=¼Dcûºä¸Mhó‰1¦ø^ÞL¡ pžEZ™½X/ðƒ#¤×’1öúxÿ‰ôí.а·k]; ØêÏ®eÍôhF|íZ_(º€OP]ú –×'FŠ…Yã¹3¦OÏL’6a;?iwBö´‹Èÿùöwoluˆ äWj·ÆÍíX×I²XÛãX"áT, õø0,÷ÀBä…ºvšb ½—XsÙF G*-4Á½¢³’TÝ…e^öCk¨æÇ·Ïímryës¼ÄjËò"íùúe£´ õŸ$y‘~~à « ×MÑW¬Ò’|Ìg/Yño§òÌÙÂó$ZF$'-èí{éÔ¾©pÜs+ˆ¡ t-¼ngg͈ž†œml棇F=1"¡«u}§T-h§ñO†Nspª‚%6Ÿ¡•ü™¢Âv‰2F©úMˆ6lm‚­²îó>Πf:”ôæmugò&a>Ve³˜Ÿ4fÑÒCd:5 »k®ø¹õñ¹”sÛJÐúá±ñ0ßÝãdW™|­»üÈ@©ÝÙr?ýùk™imiFųk(ÄǺP¥‰£[¥v_Eu’U¦ÚfÞ£š*Õ0˵ï\7± o(qÇÛ£.Ÿ¥=2#¸à}¿iP:½á\l×À–nCìOŠæõšdF‰å-ÆòõŽT@ík¿úùFiÎ2Ì­ïs–wF¿Vl$ö›É-?¡oµÐÙDrŒã}®)¡2}ñXÔ·&¼þmÖÆB‚\t_”€§˜¦q㟚åo# ›wo¼85ëÌ„]÷@¾n÷¡PŠŒ X¸oÔÞÛã]qKgÖ2—b¸Î}Oh]ÖçÊkZƒ_&ù`¢WJIF6Dœðv_NŒ*%äGz炵Óh”ƒb×w¶õÑ—'í¶M¢=y|ú/“*jÞq›>mú*1Ûëy±³*}îæU“ sËgÌõ+V7@¤'4âAåPÿ»Ì²¨l¦cÉ9¾ÓÚDNh cz¯MåWZÚÖAý‰B.[%îºùEÅL¢X‰D ü JÏÏù’ÛßÄ’PGdš&5ÝÅÞÄÙ ›Œïº^1ýö~Ù•ÿ'7 q<—Àm ŇŽôöN$[縩}[ç{ŸOýîÚ?vØñøi¤ ª+Í¢x²£}Êîg7 b(Â>´ÔxÕô„|þybr?–É*Û2,ìÔ•¦â3û+Û›hNA6v²¶£‡ŽÖÐ禣–È\Ü´DYp]4]’ˆ7ìÔ’TõÝz CF¸’ŠvÉâ›÷Åm½‰7¡ëHÌß-ûÅeÍW;r¥pøK¸hî|6¬Kãm%ã'±ÝÅ…™ó’‹×lÆ&s·!-™è™çètÄÚMþçbÍ¥®`܇Æ&I´ärü´Kè/Æþh_i'ãÐU‘áa¬ãÖñÕMö:AoÕv9{¸„VH¤z~™ŠØç|rª˜ü•Ðè•W(gÚ¿æVdV)—P!rqÕ•OÚ˜-øÉ {–‹Évƒ-ã¶ôÐùÛœqIoOýŽ+zÊæHÃ#ÊCs£‹ÜËjìÍ+îi¨TÅ*“Úv¿_ÌO#”)Í.zc3s(8¾I³¹(ªú)å]ö×§´ªÚºð÷±ºªìˆÒÆ­–¨ä»¤˜QS¼u1ogû&¶ªO_þ­ºuz%ÛPÉ]SÎJÑ G–àT H)§¨~+}ìßOTæ@‹( w)€ß„i&ig#,Î6Éú$à év`f Õ}Y0ümyÀ­©ßá׿{LF_NL‚-hNŠ-n¹œY¢dlv¤}žéï5&Ù¦32[ ™+„ùí|‡±ƒåx…÷ÔÛÛU' Yù³vî}ŶWæèº{J£¬öy¹—©¼³Dï*à)Õ)ÍÑ[é{EÙé)X Ão`_ü'¬&wûH½è?èÍZEvë2¾š’ÖM)µ„8¼%’˧ qáºùôÆpœÑ° à)F§áX"é¨M,e‘~°Sù-ø!iÚý¹¡)* —ÊËÓ8V·†Ê.Þ2e ?G©<)Èn-. ˆ¹™}¥×Ž?e?AŸÛ±¹Y­<›±OâË’™WÇÁ ”ðBmh<áÌ÷a|Ó[Ù„ˆ•6²LäB½ þ‰»_¹éfs¶mw†—Ô`‹Ã7ÜÊcH?RlJ(ûÅéìu±Ì`ªÛ•• ÜìAš*})²³äv[3R/ºÉ'^©}(«„Å”ˆiÔ­âÇÏ6úU$ý(&|éAéª/ovd6D”žéNºàì‚áM`VÐhݼp_‚ ¦˜¡×­©k„x¦¬è½‚Ð »’sÊCЄԕ…¸é î¬.@ÎøömѼ[kðXáÛr™ÁGæMÊÚ1Õ™>½[²cA|ÔÌoU«(D'~ôð ¼Ï°h”¶|˜>7R ôÓmQΣãÌli:ßI¿QÊju.öÚMÊŸ ÔÃÐ/âmªÇYhNƒ0³…ÄÕòàì˜÷á}˜ÈöÄzñš>^žJíOãÚ ÑAK: ðÎWîíœ4ÃšŠ‚â.´ÐØû>nHK€QÓ.¥Pß:ãr[?[»/+Öq8ª#1Tø Á¿-·qR’û9ËCré=£¢ú([EØ7! r¶L—¿³Ì†±ésMl(¾Ù'Ö‹sS8ƒi›yÖKAµóý¯*©ý^t§óR2ïÜ0uXöÕ*Í Žý€ªÃ‚÷âë:JèN¿ Òò¡åýÎ ia^&4a]ÔWƒcc—by7»º¡«²—-sFÎús†Ï7ƳÇñ¤[£B«hÉ.@ÃN<øöð-ŠÙø!›+Oôf8—ÐV¦ EFÁòúƒ[‘ißü(ýM¥ú–…Ø#Ñ+ÐMÚ‚=Š_fí8¹åhGÉã6¯ Jž%Ì®( ³%ÛH÷€ù,òWì™ÌÝ(ÿÜŒ™o•®èwì”Úq¬C—ø|%14?B¦S9â—,)`\ü:KHOizd<Ä]·Âļù­q4£ßŒ]£Ž´ÚÝa?—¹u²›ÏDLïhí^ªØ/‹Ð?¿“yÄÃt¨áG,Iv·\×›»~žº;!jE®*Ô~¿©ÐÃÞ;Üb#Ñ9!Kª¾+x›¬l—e}ã9ÌÜó&U¯ ¨ü³' Ý›ã¤9údTÒ€oYàÀì7ß¼ ¥`seMð—…#vß´´¨´‚ͥĥü˜,—ßt z=“N¿'ŠÏq6G.'IõÑ­#ãÃÐ ×À#M)nõkæ¨<ôÔ{ ÃU5¾Ñ]&U =;²¡õöÔæI\ú” ñ›p‘ÐLç #ÍåDCßy^/¿îÚ{„Bd–ÔzN¸½gÿx…-1™‰66F¹]Mi·vw·yýA'aü1ùÕ_ä+UNBU Eë¸O¾ðÅ‘œ_!·ZF0|œš«P‰ðWxÚ^»èiÁ‘PÎÅ\Óm*¿åÓ;-zŒõ©¿ˆ({«š¤ËH”©V˯÷$‘ícä[Ê÷‡_³ð1×Ïz«ÎsXØ.œbÁ$|ŸB&5àÝ4:®ÏÖ„›¼ãé"‡wjô<ÖFš5l¨«$®LÓÑ! ƒÚi”5,ÂáÉ Ž)C@ö-i5ÿxh|îÃæ}œ®Ä±ttü¨É`ÈA¾Û´wàXF2~å+’“–qM(?ÂPÞ Çkj¨Ü[«1M™¡¢ÏŸ:ƒ¬,òAÝ,\éˆΆM'Ù Ä<Ô¼M? ¥iδÙx— Gâ³<ü8Ë8^†Mø¼RÙQ–%w(éÙ9 ŸUÛoÑUMtP¸ ‹WýÆfæë9+”ü¼DÃaú(–™°»jÇd˃Ý'ý_ì·Q¯¾šé\nCÆNLOå Åú ©JÞ¬©¶|*æßS{Es\E‚” ÇÞyf'É_b[8ƒî÷÷ jjŠù"45oojfû%$;·,÷v|Ÿ=!FôVecq‚•÷‹²îm&Yá ¢š{æT ¡Iî¹+ô$˜ # ˜°œÛ=á ‘õI—÷9S5÷„ïfî=v.Ö}.‰U_¿ÙêßäÎ’„aÅT Ð*¤i•aªGÃf24œ>%@k?¦»d8guûiˆ¸[Ëjº€tûcîQå5ðW̧_ŠQòæäïƒZe~…É<•ÿZk€‡»øyžP…Âd}%´dk¾H B(ð%Î'¦F3U˜›?ƒþVÐÍ!ã¡ÿK‘q[.࣌ µý¤þ¬X\<Œæ@çG)àVhÛFÜm‘° Dþ1šµçýãwÀóã½WYp“b†¶´µhÎI{b~ƒSÒ'\çmè{Q-6Œí¶Šóc¸”2ÄÅ”@ i[Œ-ûÁ`„Z(ì¨"é{ô‹±w¯…Áaç»ÎÉÂã‡2›­ŽrÓû¬ÙH³~ƒo“ì­ì™×yo튿Š^O¸{÷¬{p¶Kv¤åSDôËO7;ã}G`¶Êò¤ É59å­ž_&ÇP´ /|‹‹:«Ú£ü+¹#¯¤t­ÄO÷¡øb„b¶÷däH›/z¢oê éLÂZž| U=Õ›í÷y%ò¦ìö°j~h¯œùöÆ„…&dÂä²÷øžJf™ÅñxM8wÚX;xwvvR¾iûÈ>ÚîÛÏ*Ê£‚ÄöƦ«¤íмJ's`P¤§¬õ]874ŒÑ7c%àåIÄÇEea»Ñ4¦ôìQáå¨{‹â&@µÿÓ9Æ&&Ó}yáÁøÊTH¼A –~È*Ï~H5íU.MȸeÙÐ;l,Yru3V AY—ÅQÀh‡/ö:üj¢]´ZT=u¼”8+‡¸·®îx*‚¥ñ©ˆ3k=¬ƒ®Ù1¹•ÍÁ˜ ÂQÑ+ ãR·¸Ó_Úw«rÔ_hÞîçsÍÍöÿç:µI! o8 ¨ä:‚0?•›äC2vàB^tlnS•l¢ÿ$rà®vËôP®ªƒ‚㪪`0o^ØÃ®;Žª6Dùö|ç²òH@$Aeô«²þ‚^«vuGM¶h-W?ãõºÜÎW AKiŒ†i 倵²/bl©‹kêwK‰|~ÁlT‘ŸSÝV4§ñÑÇóê·ùS¦ÞC¹Ó }’rw8_}ÞPÍËQ×¢|ìæU™ÙóŸ©gHŒc|”ïËéÌ*öZ|D: %ǴɈû±ìÚ° ™€˜ø,ýžî¥Ä¹®!Iø97 ~´›b±âu–0Sc¹L‚ô¼‚Kß³F|ëÞ…D:ʱýhHu;¿ú«aB’%år±2Û*EDÞ~ƒ©Ÿq 4Ë«Ÿ…µôôb| lÒÌsP¹½áb·÷Í©eæä¤AÞèxekÅԙϢiõú>´Ø6¶êÓ"2Açë¯QuÓöŠRÑ,5‘ƒiÿz\üÕR>[ö#d´…c”¨kmçÉ@Éú‘1¸´ê ;xÚ¯ñ§)êŠ+ Ò¥|ž©gä³õr sp P5•ʸ¿ªOs-•«îÒ”È*Åx‚?Žy7b0#M ÎYÇ GÚÉ}`2W§c#²†à㪱T@|°Á^‡g—Z¯_Ü-KRßuKÐi¸(ÊdZöÓaÉ1F ›íÈ¢v*¬a0½Þ„‡j­ÚÅÀ}Mø¦ÅÈ&—ã±´üòÁ?†Õ›-BcÖ&¼+•O›kÁç\jzÕ4ýºQPJyÄö–/fœ5+ÞQòL´¤‘9š=%Ñläó-Q…À$ôÏìk; ©¬£¡Ÿæ¾k¥¡ì]„b|fx lLUŸMòŠ&¥ä-ß~ÿODò©“çLÛN)RÃÔSä/»†ü²+#–µ©œÍ0° óÄ*7§ìš)\oÑ™émÅŸÀ"Ì.TUIM?×ç£xXœ/—!­²r?ùYWÈhq–? 1½>†‘97¹„èNg¢`2L%Ó°”M”öQ£v©–/T«ÀfºŽDÐvæg1­M¶Kú ¬½ð¯ÇOD=&tŠ® ¶ŠÞ÷päFއMê^ÅTâü"«k¸~Ý‹{]ÎíZ.\Úê’ïÝ¢áp?èz’œˆ§¦£9 úÙ§÷J¿Ëüõdø»Æ‚lábÔ\¯¾ÄAˆN|‰Á]GÈ`šÑ1Ê%:™ÈÃ4¨ÒHtˆ Ë›"ë"º2õО`Š]Õß’ü‹åÄ«*×ËÛf4‘2¬vŸmLÀ$K±Ñt:÷&,Ðû z+á!d¿zÖ$+È6ìw™cAÑ`ïŽðÄÍ.T²7ï ÷'ëÔ­~>d…—Vëß$ö`j°$›x *®ÿßëršý˜’ˆ©i¡Wî²ø±å‰Hc褛!–Ï+ô~ÿÐ×ðx-=b(¯çmǤ1Wû#ï6H0$õ®À9‚ðþ?]Ê_[û³Ÿ¹ñ ¹Ã#dn¸ä‰7d»ª ã3»BÒņõÀü‹Ì=‰ƒé>gçÔ‘‚DË÷ýX¡³-ó™yc°ªL‰SŒÉíSé@þ0+?„(dWø€s·ëøŠ¢Örµtx»ë4ÿÅ•ïfÕfIKƒ¤ºàà ëñoßô¬#È1\`s ¡Ä–ð!jbƒ¼˜n# a%¦®ƒÊŠ!¶À“:Vý¤ŒäUz¤ÁðVpéà·ÍäIò¶RõÂq«Ô³¾¤"HkLÛ¬iÀˆL¿Ðþ–`KÅŸ9ˆîaÇÕU«;F¾Ü*µÐKœŠ3ïJbH"„£’~•õú×ò'ž1a­Ñp^j¯¸~aà rÐú„Þ×·(Ÿþo@W¼?³÷ëŠ |<p½K²}oЦ‹$‘÷ö@3âñÑëŠ=µo#Vò¢x/átR`QÓUoaê ¶-K,íZ¯Í·ƒŸ† + 2³mŸÛ”ô×km ÄŸ×N¢Œ ¢l_›Ï=ˆWŠ‚­ò9ÕLCg|·ÔƵÛsÙÔHôò%ËŒšádCÅçµÓiH[ôøê¦—£j²nL>Îàp ˜Ç¢EÐŽÝZ‹ oLÁèåÜ YØýäì‹™=þ2u]‰ôŸû3—%5}â”)\ºƒ0’ž7ÉX9ÅLÉJzØæqéÏûªONŽºunôð¤¦ñÀ6üþdµ06zõ!ñÅ   „< ¹3%d… óˆað9TKeäªYz7.X±–!ÞáºÂ¡ÚÈ{7¿8Ô!¥‚«Ô-7¶Ê‰ê…pÀ@eàúžQ­³g´»üÕ8³=ÈG¾û%’v&’üvy¥áM,€À$»ë„îaŽª¾ÛW`ôÒk˜¶UÜ”,n€¿¨ÝéXÕ,61SÑDÖ‘Ù·"è•åŽA2™œE™ÒoÔ*a)ö:·xMÕX]*(œŸ*¤@Lºúù@j„óÉI¿4=÷¿ 1fA›—PEºÅ©Q€Tÿ]^À¢¸ y9>ư_õô™‰]/3EÝ£\Óö–oô1YMpÃ.G6ÿù¿@sZ ‚ ÕçñŠ .¾¾Tüm'TJûíŒAâ¸QvÙP…­ðÒJåÚm¯ŸPC¤Ù3—á‘®/ðS’ça»³<©E—õF&E2‹Ã‹R×ãÒd=.à s– ¥,˜ýÔ°Óf{_fxÔ“†¬r”ãœ!„E³Ÿòäd À­Z>ÕšŽ ¬‘Ù¸Žžj©±‘â}+w›·fó6EÍž½m?ÑlŸ¿Žcýíˆp8Á/äöŸ>ÂguËSÏÜ—Î ¼ÚåÃZÚ߬–è­Z‚;+Otq°† {öBÃ6k†å®füƆ/¶žN¸þ…J&IDë$s†óÈÛ¯ŒÆ 8/Ÿ<}¬¹‰Anj©ú¢I8”ÞȸгÁÅ æPÌSàNx'WÁè¢ÅÕÛWüh~܇;wzƒôb„Ú¤p˜"Á?ýó#ÓŒ *VÞ/º@ÆÐ€ F,³f_ïtSHêŸJƒ¼Bíï£wFT2#(—o›gZ±ue‹ÒöÔÿ˜qàE0hȵ9f͈p¨Ç½ÿe“ª» "‘>Ýmt…~ ì;›†¯°™4çÖ¶éOøß3NÕĬp? Õº]ÎËT¤‡)KÕU[Ê‚V?§îp4ã WºŒ‡-sÀ 6˜ûËm-a,Z <Ø S@¼ïÿž‰:£n–È4žN aŠïpòûH UˆGl#ýQÌsÆÕ¡ÿÚþàŠW·¿¢Ðõ­í-[ÔFe3”Á~Ñc±_Ù©!©†AˆT\æªÚõž}L5dYúë˹ælã`-7p> ,…´Þš‚Œ9ˆ=Žf˰”1ïÍq§8î7në˜)sÅA£+ABŒ$eóÔgJÄŸ;У±SΕñØQ¯OAÅ+Q³*OŽB QßbœÌZáŸìå8^_!ý_d»A.ªgJ8TÞ å¿ §€{¶€ H!)ËÑØ– Ì8åa8‹jèA—UŸ»¸ß°<„A]¦ëe=Ú4"œí tCyóf€`Â6'Íó7ó¦ndˆUAeþÍKÊž÷ׯ] ®MW5q²¿oeNá€<2Ž#§ëÊù€—†¿¿#ˆ”»×þ¿È0Í:˜2—@M/GO·¥oß+1§áõ(Êt‚agºâ»´Xú¢Äï¾Æ/p:ÁÆ"Í*¾Ét‚ …»'…9%½2Ü®;¢ôÑYjžú ÷&bíù<öqš€:É‘ ¶ƒT>ñ²5S%”*ÈÿWñÇ^j é*?GªÖv~2B…·-5­V.”lµ@ňŸÎåâ¬äÞêA„`Û ,&ŸâÎsmŒ:ŒÛ“Á"¤Qý˜#ò_Ó„tdËεï%/d¼cÙ¼i—ûJoØÒP{®Œ0ITîDÔØŸoýº‡iNU\R9bùØ„È-]Š}ßÿhâ¶Þ]÷]!M g“6ÑѲ¼Ñ²Z Ä:0vÖkû®ÖŸEÑ8j¯º$Yœ +äqÈ37¬pôë·o š¹Rtwè/V³%R ÓyƒK?*y Þ‚ò‚Þ£Ÿ Q„ÁSÚ™À„ãÿ%½Üô^a¬rë'p^=Ë%fAÁ+&Ÿ=É\¯F_‰m+ ä7"p®Ö0±ŠQ) É„’à Ïd@€“Êï fO\X™ÿ^ÁQ A»æ)èwж9î«Ãk6V¯·¶ø©B¸¤¸Àvµn¬?:JÛ¦˜J‡ò‰wž&™\¯Ý¶5T8~¤Â" ŠÃ¶Ùa±5A WºÃþ{T~+é˜ðÉa’"ó±ˆEá#$òt•§•øœ“2cByÚlܨ‘Þ¸Mž»iLBŸŹúÚy(H–@&ÀN:ꎆ€ÌÈ}É”åð=*– @´z½¼Óá/7LØ!ltTî܇¾ùõÛCÓÇ0èË Í»!rFë }>è M .J㺠ŠIjª‘\¶£¿k_vW²!ÊaÚD¥•[™ÊØ@îŒO˜s8u¶šv¶b/勘,.RÆ TÈBR>ÇGÃ×ùAœï‰^Ú>ƒrk'¾²?ÙnTÌÍ!ìèC[1MtÅ_(£C“çª ÷s—Á®JW²G%A)}œ²Î*"d\ýôÅ&Ž C‡Ò`ë0?¹áM6é&YµàJxˆ#è² ,BÝ<Ÿ;æQËŒÓ%EOÍ1pà#L. SÒKÞrõ¾‘R"Óù†œ æjD1ûqoà&òpÇÂá·êÏf"•KÑ.a-øê'A‹5L²óÛ“Åö"†_âêïɨPáÏ:PÁoêÚ±üŽÏ­jrÔš\ÄÂ}-“•}U¤{¢w¸ÊÁíˆÊç5ÓX”$)HÔ«IkDˆ$´l|¼b+‡—$ªOˆyž¹Ð¶á½öÖœ'æ¶"ô’’ZþG©ðh }<$¤“о&GꬶÐò±îÎóTp˜Õ¤öe ѧրäaé¥yéöU.MÀ¸Ü¶”–H8 ³•i õY\Ûõ¹Ôà º< ËàÕ*ÝlMlÇÝ÷ Xeài¡‰O"áŠ~F0µaåæç0O¤ŒúÄŽã¸CF¦ÚãÕ¯%(,ßö èhtÙ‚‚s)n.ÜèÛu¾”¾ÑÒ² endstream endobj 2541 0 obj << /Length1 1411 /Length2 6020 /Length3 0 /Length 6964 /Filter /FlateDecode >> stream xÚTuX”Ý·DБNéI©º¥¥S:Ça€!f`hF@Z¤»AR@D¤‘.éPº¤[îèW¿ïwï÷™çyç={¯½÷Yç¬õ²1ëèóÊÙ Ô‘w^0H¨ )o¬¯A A>HÀÆöîîû'`3„¡ÜàH„Ä`P0ˆ;&¦qÇ@5‘ š‡,‹H€E%@  $þ‰’*B<á6@M> s°) ]|Pp;{w̤¿^œP. X\\”çw9PΆ‚C! &ÄÝ挙…8õ‘P8ÌÝç_-8¥ìÝÝ]$øù½¼¼ø În|H” Ð înÔƒ¹ÁPž0à/Ú@-ˆ3ìor|6à#{¸Û)}¤­»bNp( á†)ò@ØÀP@Ì| ¾ªPÛ†ø¬ñ€øçñÁ|à¿ÛýYý«ñ»…"] 8Âh w‚µ•5øÜ½Ýy€„Í/ ÄÉ ‰©‡xBàNÇÀïÍC€Êrº@†ãŸ Ý (¸‹»ŸÜéKþ_m0­„°Q@:;Ãîn€_ûS„£`PÌÉûðÿ}ÅŽ¤ýÏÚް±ýEÅÆÃ…ßwõ€©*þ‰Â„ÿÄì`î@a$* Â\0o¨=ÿ¯!|\`¿“à_a ?´ Òh‹¡óƒÛÂ0´ÄtGyÀüÐÿ™ø÷ màPwàc˜ø§;& ³ýcQ î 4aD‚~ýþ~³Àè̉pòùþû¢ùM䌩qÿMúï´¼<Òˆæò ƒ€`Q1 (æÅïßþ>ƒ¿øÿŽê@àîï?:ª"l‘@ñ?h`Îï/*žêƒóOûpÿ=A ‰Ñ5 Èù ÌA (æþ›áwÉÿå_]þ6øï=){89ýFpþù_ˆ3ÜÉçO FÙî—h"1^Aü7Ôö‡¹å‘N6ÿSu‡`¼"‡°ÃèWœOHä0ÜMî ³Ñ»CíÿÓ_·àGÀtnð_ /ú¯ÆPGÌGÆ sg¿S0ŒÁþ=V EÚür¢€°‚BA| `VÂ@4cY˜÷o•ùùHwL CÐh‹D~Ý,F*üZ¿B€µ…z Pþfæ_ëßn‡Á¼aPÀÔ8*âPÒpZ)GçÅ»2 Døyÿùá-£e%Ï5Ý ©³ÁüÈI¹æÑÕȳy²-××ï©@Ž–sOÒ#%¨¦jnÚ>^ây2D&}¾å¦á!°ªÞÔdj-ˆ°±£Ú­Óëò:”á¢æqÝ[ËÚx(Å^WqRn¿‹ÏQûg :ÿ®˜˜ NÈ'¹¬OòUr#£ª¬nû²Û‰ Êg齋Ÿ§Kx°á ét››„.ê‡Y›2ië­"´êÖCÀ¶åV¥»qœA‡ !œÝút‡´C ãp S™èUzÁ†‚WÛè§é=Øãñg²ÒqüÁF¸õÛ̹E²¾]åÑ»½GÕ( iy:6óŸX©|°XÙ×’(%‘ý¼Âqñµ·Wå•2µßAatˆa:â£Íì{_®æèPÿ,}*ö颸ì¿™Ûwgv¤à{zDØ£†E¸j겫ˆd”º£¹¾ñv¯Y™åQ0q•?Ï é"‰l~!=÷ž–؇wª…ÒÛ̲L\t!DÎÛŠÏzAÛô]釶Ó8û:á­BJÀë=G«½è;*âR&Ë×#qþÌýrJ>tlç]Ì?§Vfwºê ³üðE•rŸ¿[ªØ4¨œªôÛmù2›N:"€UoZë;qûn¼g=ðµjþ„Õ©å$ Tõ¦ˆ=Ê8S&%7£Ñ( îÝA;GWPJËŽ®ùü=V©^Pä»Íy2éǾ1v·;EÑÎnnŸØ î[3»ß3ëà1£ƒtg½TNÜ#¹!P5Ç1•–«8ž©²‰O¶Æ˜\OñÒ1iëtÆ ¾“oܨõF±É¹©ettâH[îÜ1|jeâÎdöküÎás±ù5ƒ)õ3ß®ñÅ¢mYSwHHlÓB£øNƒq›î ØIð‡ºŒI­NÅ(æ (æ ­ýИUÙü‘ä~ÝÛW¦"LžÝb8"í·ÃS†¸í’~DÇ2sP ªÔ³ ÷Ö‰_/PÑ—rïa•ݧLÑáÌ äÖ øšê^`Û%–)i:<¾^M$܈ÝèúÁÜä;YTw UvÑ{SÅóºË:Å<Ùo®Ë d›ö„¢’:xݺÔa“ešþŸ’>eÌ…Ñî¾e–®…u¬kz©Uç$ÞŸÂðC®ù-'Ó›E¥[Ðf&ާžj¢©£ô6ºë³È­Ô)Z¿§Qöýð?T.àÓû#Áå»;¦‡:¸³ ˆ‡Ñðþ'UÙ6ÍÜÓX·ƒQ“ÔüQum<º’]ë­µvøú{=æcT43ûT5RÂÐñ»öMÏß}9I a¦#È5É­£ï=ßð§Sz¾‹3Þ8n}'éË4$aâÕG†EOkó!ªçr…*^û"ƒr&G§—Í_¶)A:Q..”k+1’øoF`k4¾Óe‹ƒ"†BýfK,š›'úeí¾$æ£#ßdâ×5†X,´P‰›YBå1Bn:š¶â£¨/¥[OÁ$ôÈX+ì=Ñ9)Õ×1føgå™O«n’Ä´‹I€ãåƒýuBê®U’$Šd%˜Æi¢u"XL\ÌsL´SüØÂ‚o? Z¸*:‡•Ó¢¬£rp.uµås¾Vð寙¶ub^CâŽ{š,K=ÈÙæ‚°¯ qóÝ5ç@ÈŒ|ù>•ïLÐDâÆ[íL/vÔsñ;óÏü8rƒíh³ºOY©üw§LVá³Ý÷c  ¸Av5š÷4߯MÁäy|šëį_ÜéW&wÚI{ûÜ=‰óÛC椮 ‰¨€ˆ{Ù$%X’‚>ëåÁ»7_žÕÉÖ­ ‡äè¼À^Ò¾Î`l+íc—iWéÜÈ Š—CþIª4Ú&÷ç¹sfmá…*^4d7È|9S¬E Î.K®FÄîøPyÙ:§åùDYÖ”µ­ó—ñXÎ|LØ‘†$µ ÕÏáŒÄþ¼[86è!lÊÖ IlõÉ»óзÉíÞa}Ôï]Åv¾‹ ËZs äcl9È(ƒV„Bº¾Øž×slšX¬Ýz¯Ü<­©9ÞY¨ãT:+IE>†C1ÏݹÒ®»œÅkOÚw”É©WTÛŸä(ÁZ t•zÁ‰ª =˜Òù°Åô2>c±9Ûø¡ÙµB_[beLÐ=Xîí<œ^ƒ`:vI_RèÖ»4¤-¢vº—òCàêîþgj¶¦÷„‹žqß‘9‰€ô–’ Š&„¤/ì¹]Š ÏÏí^,‘ã±§5¼jÊ–YF1=íÁB=%‰¼N6V+jw–ÍA>‘…Ít›Ü¨˜vÞYbƒá{)´ }å’8gŠŠ2J§Ù›ØA΄&AoÃÇq ”¶ªéÇ29·ßH‘¥{¦a×]8ÏQjrz¡Chö!õK!\ƒ^©3¼7îù¸7fqÛöGOîÙ›š¥Ñ¿œc»ÏÁÜZV—œ–þs>ûÎ4g ÑR6uCü-󡱎j¯Â†FËC8IÐÞηmg\}&è[-<%6_­ÿó^”Y `b\x)P¢;órËôR #õañæg ’®–Žýž.«¹ûsÛ;Ï7ª`´U\Ä×0[Ùh æÚÜ94H÷Fƒ¨O§RVpøGìµ¾\åÖüzœKì¨êk_¢„ [Ûm+£P®d C†Ï"”O6RÙôØÞ2¹?ª'›Pà¡yŸtYõÇí÷~·„ˆZ›š®Šö^'ûÝO{Zf™¡ËUXv¡9"$ü Z™>psq§pß%c]«öÄ‹‘üØüI®pËÁä‹6Z§Lg¬|CÞ‰AË*Ñ Ýú¢Ò·©¹î½È!fŠÏ"4DÄ^%7æTôðÐLï²U¹3½·2 ÒŸv T4«âXø”rXÙ·iàw ¾áRœ“€kr6±´¯ÙðÚܶsâSÚÐï¾à Ÿg_šÆd¦ª+BãML²pcäÇ®‰1ÞM}õeïUAîzÁ\pTC’ŠtKeøÞì‡PS¾¥²gÌ´Ïh£]jð¡éÖ Ubzï/”n'Fë{fš M%ÉŽv>¶J‹/¶WR[ØÐP;ߌ}nEø–áÑr>yÈW˃…Њ'ôçÚZX Â)Õ-‡¶Xo-‰H8–iÒPsÙ._%¡wzTÏÍ¥x¬£Ê%í„Í—ŠžtõŸ/_Õ M®ˆÜ“,4N6ýhüXÑÓǼ=JÓ¾~…¨%”3« ø[øÑÆÃˆWÞ‚™Å^ñ¢ 5Æúð=ØÑ"óú–:éû]¾³öüÀ²µ9D_÷xAfLŠFA'šÃR^¾ iáΫô¯AŠÇ‰9d/óò-ÔF™'bj³²§hWj*—^W–]TÞ}ê4å¼BÚŒô” %§Êû…¦Â¬|&X>9#0Ùê=¿†øQ²r>³GÛRWñÒt=Ù( å*AïU‚WC§VâÖ³=Å?Vù2/òÜ Œóí®àRæC€¿KåÒænÑù¥»Ý+uuŽþ¹J:z°3ÇÍO3-o.¥_>ÓqgS¹ui–  MZZ†Áý¤ÍŸœ‡‘ªõ_7Nî©ïÇ–’ŽEÇ£»¬p5È7wçÌò› °e¬n¶E­ÁÈÀïÎ2’S¹¤–[G˜ÌnjѺ™qûuð—dÞ›vW5ò±-P´OºõÍcÿ}té¼ ÕÿŽž'õ ã%ÃpaAæÁò•EÄ‘anǦçá™öi¦LƒaÕƒ¤!X¤·n Úé4¥;Ý4½;.æZ˜Þ>Ï `\5Lb©¿pB–Eü ©Fj¶@‚ ä9ÜcmÁö^ôRÕ»ƒa¹ÑB|2ÔÅ/¤ê}Bf_©“6Ü}p›7þ1‡V ý1ú¢¿yƒòªo|ïýäüºñˆƒCØýZû š‡Ÿm{+¡Ð]£äË eMäì1=˜ÿUîpŠ&xÅÿ²“À°Y§5î„,G"’;€fæ’¿4N‹†v¢ÒµV&IÀbßøª“˜{ˆ:§Ûè¬Ç ·sòZL nÜŒ5Û‹3éòºªkÜ”‘Œxç˜ì=`^›&$Õ¸…<úçìÕ—~ubmrSq‹å‡$Ïj3Ñ•ôµŠÐ@ÄžHÜÊe ›Âv½z¢É†÷ìTe˺’Œ¯t óÉÒ³¦zš"&üòbd=€±rš×Ñ’ÿÝܺ”[zKõ̓wÄAR¾tEmÝPe FÛÒ²q;ÓÎ>×Cmø¸¯[À3–K`å²k†rhûá¤ì—›Ë.ëvöCk)WÑÖµg+s/²y.ì­m?ùÕdgN Amhå •ù›ÕRöØöÅD†/~¼}×À–@q;5ÛR Œc“ ×a{ÒGûQbÖ©Tïëk˃8]J¡¯¶é>„Æeèg_˜¼‡zøh}ˆÇ ~D͆ò)nvç=訓Á.êÞ¢Lbðš¥þáp3â±ÏÌ‘˜€ö!wñ’_ç0ñ±—ÄûœÖ7×Û2³í]µêe¡t*!º‚8Š +·iªîÚ2jsR³UÄ_‡|ðÀ yÖÍ®Lʯcóû„¢/ufº-š&jœN´¤w~ºÄVò±nHÝQé[°Œo5²jSÖ4të.×Oí=óÎMÀvÇ„®iqE¥+óî3d˜ ±äæoW}ÐJ”lÓ)ÿ×±õî7ëxÄeÄx}Áñâ›få%®—ˇ¹u1¢Ìy(B½¦9>2é^¦1tno˜kHo¿ü°0PÈ6Õ÷ÂNŠ÷ëLºÓI ¡—aõL¼š×D÷e—ÎéMQ*|ä.®O”M³O¬Y¸ý×w^˜¡ºß'?èOO=*Ÿ—ð¤é\‚ÎIËÒ)Τ|s–ŽÉÒÞ{Y0¸“ÿÝôÕD’#¿«¸´Ø¾hF…®§Ö› Ü/án ëM€Ú¬{òÝßD/§È̶yˆHsR¶)ôŸR›)ÑoQQ¿öU0ü$ Spe$|.2àI—FšöVåµb£{­Mú˜šWÉšžºýh@tAŽ_·jB+LdþÁ™¡’¨FùÜa—1MÖn8@É5M°giÚi°• ‘xìpwVæ"áD jõ6©YdèþöаB°ëµ¿ÕE¥èp©ó!e ¦|+y;\pÞ3;Y#Ê\/ûŸÞvì{ŽÁ©ÂÇç*Ñ“wsJšƒ,tõRž`=.;ìãþ˜â.Aëw®Þ,µ}o+zÜâêäóÈ<,ü©á±5ß™H3­Çø«qPW3P¾Ð±öá~|ˆ¥þ›©…Ø£–ú·ì‹Ôd®$7Ã~/ülÔë\÷¾.Û&VWFy+€•ý]Vð²3ß!>ŸÃUÜç“ôâ •¹·‡GÝôëR„ؼ8yÂt—ÜzöN•ruZo"a ÝÞüêÞ¥¬x¡æ¦ŸÎ 2?¹X6ZWFŽ®92U³²çx! L2Öwãç%šÚGls<(µ‹Î ËbÂŽ4p½I¶ ¸3 žB£p:éG°Ri€ÈLÕ7ˆ|£Ö.ÚJUL׳ÔzãÇ£Tغ¶uû˜qKEøutHémü¨_ÿð‘ú³¸ôJøJê‘W ×+dZèL¸RÑKýì­FË<9uÁ[ÅË„[³×·ï¼ì ®˜Z…ø~ãï}NsçÌo®º…Uby’pŽÎeÖH‡n«åvoF´œ‰Æµ8]\¿5# üº6}zióäá=¯ÍÆ/¡®5ܹ¡?ÍçãŽ.=žlå»êu÷FŠò2ŒOCùL¢Þ¯(àðŒ ÌFã¦ËžW× ¸}ÝjɼÎR^Üæ@–}_÷Vö~b«7àÙ­m)ØÚ¥ã̹ªÂÙÚ7¨œ[^¸]{ª^S\ì~|çƒMÊ#DZâ¼à%¬;fäó—/¡îæ>;çÁnŸ† Å û¾>|åÆÂž¨ìË6] Ù–Уn±¯Ã|] ËNr4L?DHfÕ‚ÒR¼Ìx¢¾ÆOyemxä·Ô'§Œç}“ÅB½è¼³ÛÚÖõþF(鮫§>ò Ö#ù½É'´«—¼„áŸîh3½”Ò-8£>vXP}¨×ÜXÚq®¡¿§Ý¢§ã:¼ËÖµËUV“"¨X›0C¯Ð¨Ã[½ÿ¡K]3åÓ›;#6>SN‘›gž‹ù&§RããGÐGs«‰XƒÓie”Eb÷F Öc"8m.û O¹+ä üà #ØUtkÜ®†Iš¡¯x¥¾w0¬“êei­«òür?5š6ŽZgaÑ+ vc¥µ¨ÌØ]ê= ¦ìø¥N¼: [‡úÄòÔô›T~»øx?ÚN …Ò=éñ4ûï>äzKûŠ‚õ¦ÅH»¢y.Ö¦S[æ&„»¹ógœ¥Y×Þ £à©X}³YYûhÉk5~GVÊ÷ÛËø¡YχèTëé”ù럺F©?¢»Œú9¯ÔOP$qˆëó²$ÞØ1§ò‡ÉeXérCø.ç£s¥š¸ó£DÏaßÓ@éèš«Ëÿ’¨½ endstream endobj 2543 0 obj << /Length1 1420 /Length2 5888 /Length3 0 /Length 6851 /Filter /FlateDecode >> stream xÚwT“ÛÒ6Ò "U¤JDàPšHï½WB ”$$¡…"HoJïMºÒ{¥ ˆR•R¤¨(½|±œ{ï¹ÿ¿Ö÷­¬•ì=óÌÌ~ö<ó®7¼×ŒL…•a(;¸ ‰‹€d€ªúúÚ`ļ¼fœ üo;€×ŽÁ"PH™ÿ@¨bàÁ¦Á€ú($PÇÝ‚¥dÀ7e@  tëo #Tƒx `@}  ÇxUQho ÂÁG¨ó÷È‚oݺyãW8PÙŽA@!H >çw%T„B\€¦((ŽóþG ~9G-#*êéé)qÅŠ 0 7€žœ#ÐŽ…c<à0àOÊ@ˆ+ü5/ÐÌýí0EÙãÂìA ,¡g¿],aq¿Úûs'ŒÚ?Ï¡Ž„¢`?gRLR Á` Þ‚$;I ˜0¼0¸×/ÍEE(!Hàì´Ga?-) Eºƒ‚ý´þ‘êŽÁŠÿ¡ðßû_Ç{Á¡€É T6Ø©&¸õ°J™ÝSxeHŽl+õð¶˜ðPÁ}J\·úˆÍb¼iVæ”î3É.°Æ}§v·Ãì¹÷;>˵\uÞûÂ\k\v±çûÆ|8¸'h›ˆžX&«\•)ÆtqFÑuP)ºMyi}ÿªéüàÉÇT¢qS'¤Õ ­£ª$S™ã–Åç&¸f»>³É]–¿r>º>Zо‘bέ+×vˆ÷¬¤[èíïâ|¨ãñpåO(Ž^]¶CM‚¢Òb&ïÒœbÍt;MF¥MXwé¼@òaÁ¶ãòö¦õ5þÄŽ›Ž¶‰öÑàÏø#Nzô “J*&756ÆEÒØ«p€µèLCh½š+ÿÈ鬢ë=5Ö9¼ðÃ]7EÛêmO0ÿ ýxù³²åÏ~õ¼/b<ìC‰[þªJ¦_VbÎØð³ÊëáqÉšÙç³³’Nul5S(š¹Üp›^\œÆ‘Za~I´þS/Eá}¼ÄYÞN[› ß”[e2†!¿P;ã›^ðäx ,úºšV­Š÷t]Ü÷­ôZ´ÖëuEú•ã[]%¿,¼§’re?Ýh Žai‰à.Ÿ^ê ß»ZF #*1È-=Þ d~Óƒj%x”FoâO7‰Ótžì™ÑeY‹‘v©Þ¼njb…ÉçßZR t$\•Aƒ§&â Í‚L}>mByÌ-Ë ·èCî+oõ— •hý„§ùÑöåbk‰| ¥È­§Ÿ27wÅØÙv2å/qYµÙpÛ£l.Sá°(˜?îy8@ѰmÉÍõ…•x¹!+ãÕd{uWk'œXÀ»ÛnöŒ6x^>ª¥°§æ·÷r:+®ûNÒ¥Ö/uÕ`§»A%—ÈÛÁvmÍ™:Ï ¾¶mŽ1Åv^zÞ Ú‚Zñœ¿ÕÜ&ºé}è`Lud5m Éã#{àÇ€>Ù°Ÿ¸„œLغÙ]$ðë;kH“…vN›¸Re­ 1Þ79.É!ÒxkPàQoZ†J¨é£y¬øÛÇsoܶ‹Oÿ†h¦„P„Hب/m0’1Ìœô ƒ·„†§èG/Ð~¶¬¯ëG£2ÕN2K#HÚ¼úíßkÕ[qY›©ï¿tJ7é‹ô:¡^^fÞ¦§ÒͺH/ãoÏÄ£kvs2²´®YÌ®5ÈÂ$òòÍ i'%en,{0]‡ê>œ™¿½Lq;º’Oã ¼R`<:ïÙ­q뱓ZÇh7éÒñ…(ÂßÄɇoØ77È}sÒýñh”ǹÉeŽ×fוǚ.íÖ’pWPîÊgˆÞÀ¶™£T³·F`ŸwŒlLÈ܈GãÙS>vf/[íÉC?~É-÷‰ÐÙä ïèôßκµÔ_´p|ðµ~^A1qj¹Î,÷C꫉gúè¢ ìj¼y ºMѲÆÉñ’…ÙûäKÓ%¿àÜ0ÜêÔí¼ î›Ûn¸àûc¿†ÕáDªPiRS“ÑÛIÞWä2±ubNI†÷[ƒZèx;.>6Ïj YðQ‹Í-«|ªêŠš_ ñ–ù=AO_}òqd–Pˆdˆ¤¸ï©VôM n¼ »ÔE²AÀî ß_Pj¯W¤D_DˆËrÔªt7+sÂON®öîî]$æ.×…®¯Ú» ?^ÿ0C Ër06½8ö.˜¼Žf$çI3â€ÔdI‹Ý—aÉjdï“»£9ì><‡Zh³V‘HñÛ`ô¹#p!°€€ Ùg›¡bÖPdq_bç\~‹ó &í¹‡÷t¥ã}Á—Zº“Õ¾÷v?܉ðd¬gÓßÌ¿!Xßé!é'ò¬ðVÑ•ªn)Hký%øõt¿X©§b~ºA ¯6UÌCÏ£)¦E‹¥:ü"@ÛÎ*ñá=g._<ãçnoÈ}ÔºSÕCêåÁð‚Ñ/`YC˜'ƒ;ÃŽé=ÞYÍØÄ'[Û{iÝ© ©+Ë™zÙ€u_¢|”\â(mw¾væÜIY0ÃÖa$ÌøYu Ñ'ÙÀ*cs®`U´ÝÚ%ÙÃNU¢[ðu> +þ(@ޣأ"Å!– Qä—Ô֛݊ ú{CJ˹wÄK%9%îG Ùƒ¸gÑø ¾Jɽ‹¯GJŽêÇ?PV Ïëݱ¸ûÌî³Äíl«Aû ³‚ú˜sM@͵ÛÝz±m ‡OzãÌSªö3–€úa.ÇfZ}È‘3ïŒ.¸yOÏùlˆ2éLf$*DœkÈך Xi¶¼ÊŽoœ5¨àKbKÔ7+Õ‡ŠˆÞ"–íÖ¾°ñVŸÈSÔ`þAT—˜Äå½½”—ÛB.'•7 ÆÓ¯ú¡––h­ ïñ´]’sBå;ÕÞ(¯w N_S¼òkL_¤’Üó®@^QlɶX{¨ÓÀzõˆ\ˆ«Ý’kÅŒŸ´O­`Hyo¯-8keÏ*O¬ÏÀ,>*ÀÛúýi]‚Û³ŠC~²ö{Âw¯E³^ÍÞÔéh p`Œ÷cë9%÷ó˜±Øéù‰* I:3|f97öÌ3<»É,ù#ü:»LÒûyæ6ÌzFŠqõ½ýW T+VMõ÷Ç[ã4S I—è{Þ„¯\\ù..øÞéºeg–Ú†ôZÏö¨ïvöµFÈùþÁȦ3¶õ)½Y›˜q²Ž6OCKrç>þ,Ì®&nkŒù:V,ñþöt$·n$—JÕ~¼b>Îõ÷R?ß|ÊazƒLüX1ˆ’zgBy¬{ÞÛ…ÿá’Þ…æ·¸ç¹\$[æ± _?¯Qu°–º*2ŸÄš1ÝŠVo&.´4tžJžxM[¥µŽ^e¹Ñ"¿ÊMy_púŠNtdôj°º“™O8b<dVd¡w:"ém©ë‹ÙYJùæ;Õ€£(pR­‡XÈWà'ŧ:Ì&tü[W­jÚêÏÆÅmO=rÏÐHLùE} Ëgû"ŸïãÖÒR׫ÊkÄðYãßã‚ ‰Âr¦R8p½K׬ís»ôÕH¢œ"íMæaN¬»i;c6p:õK¦8šBs¨äç7ª‹JQQÝ’t½^zjoÚ•S#œvq¾3¡êE}É´ïñZSãO~8ˆÌ­™šÈœFÌÄ<{;ü4KÓ9ÙôñX3GYEruGÝê©0IÙiãç½KkA%øÉ+1d´ #<…*ϨõˆE#c?É4©0ï'æÞóh²g Ý¥@ÖXÛ@@ün’ozK5³DÎ|1ÿú7•šSazçÖçÍÙ=ÉÎ…‹»'Ïu¯V¸FÍ*ÍÙ(ÿµú¾ãnËhå 8•똚IyLG Úà[Å·jòÛ3 Ê§Ò®ÊøÉ½O™¤°6Yîå4òáø’6ô|ë~Êå&VUÍ¢K ïrªuÍûÊu)¾JÑu(ÏŒõÚÚ.·9ɈR_!º[û8àü̼ˆWðXŠýÞ‡•ÕÅ„©8¹þ£h4‰Sy@GϺg'.DQ2‡¨(Ðy6–Ýøc øÂ¼°{àvíNK–Sˆ_àÞ+œ–êÅVÿÑÕ4Q€Úâ ðy?•Þµt1¤LîI%{ÛÆÛSßW">)Ъ0—CУüpþb橪”©B_ßp4qLÞm:Cóù¾ÓAŠiëxÔŸÅkhŸ Ì_™+'+ÃÍ›¬ 2\x@¼^Î×NUÓdn­²~îçì¯7¬ôéKÙ+šMù®û¥Ž6œ+3šTÒv£q‡JØûW½4ÏEâB)i7Y BÓïF}uª\Ò`2›i}Gsƒ²Äf2]uŒµO¬Ë/øpÏ5ê FU ­>  \' x©¾f·uCµÂm§“/ôô6ã¦v~FÏX*)æÅ½é†W_Ÿ<1£l=â[0°+hÅÏoÇ**3íÇU‡.“W?h¶$ÛG‡Ží8“ç õ)çrÑñOZë/³¾§§¥¢cÚŸ‰½X>»”ùqJ)äZrƒÿ²ÕèuiÙ‹žl×ï`I9sîoTÉ;¨~Ë‹« œU½©éð¨9õè5» 푊ü-ž=Šï½›,<‚Rq{Ç}ŽÚ½kAT\ð2ÙµK#–Ý"%0ÿÍ3zêâQÁœx¹¡0Æ QiñÌíbÜ`Seib9Ýú“CÁOoëù‰{™3X17ׯgŠÙ" uŽ÷e}ööÌš%Ò…vä¼z\l·5F·@Þæ¼¹Ð[ðz©í¨.ßT^hošÅwøÑ´|Õ~xò%Cl–µâ:MaiÚÙF·UU `<ê~êÝlnè¼@Kx#©ï`/}ØìÛzÛh,×âE7ÿ:~nxÃÕÇãÅ£Nœ`Îà÷t(‘ZZõ [<µ,ÎylN8#kC‚“·¸¸L£äh+õâáì—¶ $ʆ9ü¡Ø×öÕ¼ü3'è!µi-n1>²Tat$µî–U„ÝÒ®ø5ywõãõÄJþM59ÙZ§ª®þÆãùIí•#1,g^Ãü‰rC¨fÂÓÞHhØØ–÷‘ÐÙ¥›ãªî«ªä.F­U1ÉÏbb‡m“·™2]ÜÊùŬgÛÓ àìYºk‰ ZÎÏŠÅ#hpòÁwêû1©Û—˜.ÓÛù›žsÉëΞ+ª­ê²gdðÕ íDäcîñˆQñX½õš@‹·m~¼cþ¤Ì-ˆ¬^Ø6|z L]ž`.ÝÓÛŠDc/rѨî»8Û)!…veM⢑ÙñbÞoC+™ƒ'ü®>_Ó]ÿ kat½Tšm1:; ­.ÓæÙŸ•=̬e NÈé,ë”×Þ[(Öéµýö:ñ¶€‰×Ö\üz,I—•ä°È”cÉuÊ5-ÖœIP1´Þÿe3³NáťЦ­ÀB7Ræž>GoÝÙº3 Y¹;ç9ïB~øwún—6ÎSÑ3bÚO‹¸*·”»ì6Z{óëN–]Êx]ð» tˆ?öS‚š‘ª„î½†ÙíUEõëßM#IÜ‹Î×gsvã•Ls}u¨Îwµî‘²“3ùÝHñ0WT“HÞ².È8-øšôü[|ÙǹuÍw½ô/ȈÓÍxÖ´õ÷½£ˆÒ¥™%Dõ9}«Û¯çÈÛJ±õ“Åáh‡¤û¯"òÖÈå쎒2sš/–rXÂ…®ÊÊÓdjN?x€—¦»iŠAó…ÖðD8ï-¿QZ¢¬/J‚è„¿J¾Ât½¿î{’ºkWùñjõEœ^˜ôp5(¥?Ü÷íèF›áUy·w+tI8ªdÃâ|y¯šÂ–n²¨)šE6«Ýòç t§B)•#†·VB•ýYžÜ£^ô¾O{CÞË&úe©9ÙóÇóO¤ )ÜT¦–¤Cƒ?­¨‘=!Šã°z´ë­–8ÙNájYds=Þ. ržìë)@¯m»@[Þ‰€@|!=ØÂ":Yfhnñ>e%¾Uo¥_˜?Ž>%'!îHF‰î?Æ ³Q{Q'íì 2 ÞlØÒzksh,·ËöÀ4™]¨v—LÝÆ'k=ª‚9[¢o®¸y›ŒÈõ^]ô¢–ßÎô'ý¡ù–ɯêNóW<4ml·ò­°‚ø»«ÅÄ<™^zò’¥CÔÓ g˜!yÑjÚv>°†™Ÿºõ÷Vñ'óŦ¼|úMÞ1ùwT ©ìŽ–šŠb„¨”=/ëæ^9Êã2©òÕ¥–9],1aräg‡úý6lÖfáiþ¥zTrž({œBÞe,&>xIê+\Õ£# Þ­3#¥ÏùŠ÷'β}C¾‰Ro0Ðìf©´ÿƒ°Øë©# =í.I¯¤¹.7pÕt¿hrÔ9i,z™Ë‘Çïsn·"È,ï‹‹f¿I1tƒ\·ªêÞ`å,Z<‰ÊzÁ#‰O¸¹k°m§—tN×Ñ?À£$ƒú gJkae$têNúù:™~ ï).8| ×,¢ª›_š2µU½Hôð¦Ü,½€¹XήÆÕ4ÎTáÌ, mC9F¾IˆzñxÅ{}¢ÿþèðvknÙ€ƒ´®&“ÍWPíµÀ Ô.¾È2èÛàB¦—ܲUh›4E·¶µýÇ„©ç§§X·0³²6LJR˜©m½>Ë;‘]­iqÀ%‡gõz0…èˆ0b]Š ¥ññ{_M d¤Ÿä3ÿå@º^4Oi®8'°í½í)ùF”{`Ñ×9­„ÎÊ#Ê2§SÚ¦IÝ´pµwïe6HuÝ=l¶ÎÛµ½rAØ$—_¡Ppè˜j¤äsŸ˜d¸cëÚV‹¯¶ˆ¤ûK[c£üƒ‰‡¶ßŸ¦÷6¬óÿ 8HdIª½_4üI¾ÎI)©)h«øÆDC¿„f¡3àl|ÐaéѺÃ~jžIrFÔ&Ù¦…•4Ç}ÑíÚd°Òx7¹QÕ©t4ðt*ýÅÞ/µ~Írs0{¬~¹¡G»yKêðÆ‰¶ÙKž°˜³!ïŒÉ°¯ ´’шæÕs ¨c¶5‹ ßôüÎY™æWt†ë<×û")¯©É”EÑ…ð S0AX–2ô½Nûz¹môRŽ9^ÁeÂ&@[bÖ7½ø?·H ©+Œ¤[9DH=$9³±vr{j­õŒCA[‚‡ º_’Þ 5*)ÀE„§PÏF¯©²V°Ò’&?é pé§Ûê¾çÏj"t™Ç£•¬V˜6å:Oyæx´‘»á ¿øI͉YÜܯÀçV8MZòuó…uœ¯Žýp©ˆê?älŸ}Wv¥k¨p³×%ÑÂK|Ï,ëÙÅ}^=;<¹)~´N%;núé|áék$¢?~uY• RžÁ÷Qÿ~¤&̃ÂÀÇg“wJØ*z)[8U(§™A¥Ä1•®÷¨rÈ_-œcý' œ“¼MáÞPŸ“9¢D,1ŠÚc/ë*Ù`XÌ£¦ 3O{Åõø,x©ÎÈ·<¹Bÿa´ E‹.ì‡WùîÓ6eÉH80öRm×»ç[±}4{y—As8hÕà>©DS*⦑¾ƒ ‡×pöp,2]ÏcãSºYóá²÷øÛâIýZz}­±ŒÒ {ù|ëØ»÷|Ö{™Ük¥(HòY;ÈüBsi&S¼6§¿ÚüCâM– endstream endobj 2545 0 obj << /Length1 1420 /Length2 5888 /Length3 0 /Length 6852 /Filter /FlateDecode >> stream xÚuT“kÓ-("DAŠJ‡Ð”¡7iR¤wAš„$$AH ¤7Þ{•"M8€4AŠ(H‘^Dzïˆáå|ç?ß½kÝ»²VòÎÌž™g?³ç '«ž!¿"mSE£pü !ià}mmu0PHHD@HHÀÉi„ÄÙÃþö8Â0X$%ý¿÷100ïSãð@m4 ¨ál‰AâÒ i!! °Ôß@4F¨ vABÚ@ 4 †pÞG;ºcpßçïG „’’’àû•Tt€a0 ¨ Æ!`øŽ°=Ð AÂpîÿ*Á%‹Àá¥]]]ÀX4.ÇÍtEâ@†qA?)uÀ°?Ôœ@#û;`ˆ¶Å¹‚10 Þa„ÀPX|Š3 Ãñ݆êZ@]Gê7Xë7€øçr€ ÐÊýÉþY‰ú• †@ÐŽ`”;Ú"ía@]U-œŽFAÁöX4>ìFÚƒmð€_GUõ`<Ã?ü° Ò‡À"írüYÍ*(è}´ƒ …Ã~žO‰Að÷î.øg¸OPhW”çß–-µýIêì(hŒB:9ÃÔ•ÿ`ð.À?>8 ’”‘œ€07Bðg#wGد è§ÏÁÛÓí´ÅÓ€y#maø€'ìâ0Î0oÏÿø·€P$´Á‘(À?Õñn˜ío? Ò h.„—(ôóóŸ'K¼Â h”½û?ð_#TÓSÔ12åýCù?A%%´Г_ä‚„„Åøï×ùÏ üÍþ—WŒüs:¡*ª£lÑø:¿Yà¯ïo&.¤Áõgo¸ÿn¡ƒÆ äúGÿBbBüèÿ{ ~¥üßÄÿ³ÊÿSÿÿ}"Ug{û_q®ß€ÿ#v@Ú»ÿAàíŒÃ/‡6¿"¨ÿ†šÀ~o´6 Štvøï¨:Œ_E/t~¨€èo?«ŠtƒAõ8â·˜þž¾‡=ÓCc‘?_<ø,!¡ÿŠáwòÿrÁâgö;Æâ÷k¼?m~Õþ} ý¹“Âbâ@0và%·Ä€ž üòBan¿4@¡qø ž³7Ðü´˜$PÐ?4ô§ð¯Úg ßü—(ðÿ¶-? æƒÆGЙ@»ªÀÆïŠ ®ü‹}²W¶“¾› ó÷åY‘à:T1LO›Ð,VRµ²kÑQrúž13ºï¹PÍòÚ]ô?‹ê œÅæÅÈÅ7ÂϱžGŒl#7ê²M”˜¥ 1zLá­¤òPx‡!ç ¯»Uíc±®wn©Jh5ê4·V¥iÝf”z¸1g€«·é6Z; ½›9ç0ÿÜ",Q'…MS¶ùãZN1ÛÕÓ=EùŽém¸Ÿ†‹ÿâG0ŽRE¦›QYôjùéò³ÌB—õ*O5êû· µ³Y hÝ÷sâê·i-ÎØ¯šÚ¥…!bë´7šrR–óhßÄc±¶ÉÄÌÏl!ðgžPÙiUßæúÑžAš£ñ+³= ö×Zûßp¥±{!J‹ö|ž~P4 ·Kz1ã0É‚Pg¿£âq…];ªW%ʺetäí%5I#Çce8ZÿªhgXY46Uoë·<>[TW_€©ìŸt%àÆ‹ NϤûJ$Þ`¥â®ÆÅÇÑÌmEy ZÕÊÇF!H3Ò®‘ `éB¿/­íI8¹à(®+¹/YX6©Yì'³]¸u-¨Ê£—ø´¹¿½7Ò|ý{²d•Ñ¡b¨¨mù’u}F^ï ]mæÞ¤f¸ù=ŽQR­†‚;k§ÃðäáÅÀÀ;â·îÈíל(s¥zÇH2=‚®tóe›œÅ+asþb›hGKU¨>üXÏz|«ß´Ös‰Õ îUær0òôot‰¡,ûXÙ‘¥HºT3™îJp)¥+3YÐæu„-Ì–Ñü!^båJO"¥Rƒ©Ü0^ï'÷‰(¿Ôd¸‘X ©"Øúåæê6•z¢LÔhf,A6×òüÐKüÕ¢Ê1¨s¾Ë’iœåîÉ7}gä+<†™ 8(ÛdMïǬMìõò0:&Íjà„92º%õbŽþ<®ð¶.¶ô`ª¢ îsúó¢‰Ðä ¢â«Ff/÷cæWæ2O›ÏâïL ¡µr.Ã% %÷èÆt¤Û7Ùwd¾œÝ ½:6JÖú>×–I.E¬éà×Kêª6O·aô™¤¡(…iGeK˜¡‡¾ŒwJ-cThvk0íz 3a‘(.÷zY™ÔÛbyßIuE´ôþ#ÊK—-ìšÃ§‡+=©UÊ×'Øeœô¬’0“íæ¦LI5޵øMä?Ù}óh‡ªŒ÷2 qµñŽËvzjªÊKŠ X‰€òpŠ+NÖ?kEsr—™© Ò¤Î>«¸ûnÝîZ=©÷I –>ÕamÒ÷t˜kÃ&*™ `ªcDü+Yâ׆ÐÔr$qãðO´ð'‚OHtšÅè™/õš8&áK¯ú. ¸^ðŠÛÔm·1vTìúô¾Ïè5/åÏYkyÑ_ØôI“µ¢ ZÞ–døÅ¤¯úÌéB1¸ªO$$–šFy“ä²pq¦ü|GÏoWÌ‘ XZfæ}Xs¿¹öÝ`g\Æ©ö¹~„㙄ËÉðÚ󦦚s=O÷*µºšÛjin½øXl²ïæÆîå;DÕa×<&srëR×£D!uÆy©ûíNt×ÁdºAZÛ†Ž¹‚t¶ð² -½Ï ›—ÄJà²æ-ËÄž)FDÿ…–œÒE§Ò©²8<}ÊôÉ›”UD>OƒR7Ônlx*:ë]ºL¦j®˜Š&ɇàq_Upqì ÷‹Ô­›KGO-©kä®èî,Œ©Š®•pÖïÿBt¥ _PrdQ[dØŽèj†€'”¬½—€ûÿØí|¼±TëBz°Pm´‹H…£².j6rú˜8§Ÿè ùƒžP€Ä÷>[«¬ìOÊ¥•·N¸¿‘¸n„¹|CäÆ-ë ‹Úü¨‘žÎʃ ò ïK=ðNsW¾³IŸ{¦ŽææûZ¡>ŸáyBúHAXŽ¥ÔOÙ5$õšåCåiô!ä‘äã{Ñêwy¦gà1ߦÍê-ê?âVß3ªv²vôÌ'ÑÐMŽ‹kHù TйÇ;бûMjàä=†Ý{'ås`™{kç#µRls߯‡°W™s7ð`1m“øBËpXäÁ'z{±4 ÓDt»BÚî¥^Œ›Yz”㧘c¥¹¿*ZZHïc :½¿˜­†Ah ³Ã(fŒ“vOGnP%¿$Vµÿ*xàpý¦™Ø$IM g{_Aì-ÙƒÙu;µ„ -M­ªc—ƒÉGÞ«}ËTOUèzG=&Ý÷Ï Ùw¾0äße4Êò¥C\J9.t ØvZŠØ´f©Ph7N:] ¢h æŠ1 07sÊ÷š×’.芩/K¯»ëYh§®ù놮[ Y(\ü^ª3)ñrîɸ¾B眂‘&C…}rÃRЇ‘—ñg î‡èj8¡ôN™Ê6Bh¤bV}ãÙ&ߺÄ{ÖÜÇ Ü¯„Æí'\ØŒ…#¯­IÌžÛPJ?Ýçæ×†¶aN–_Þ ÷.XÝÕ.æ)S»ÓhñÞ~†ÚËç!Ë´øBŠËÞbÕŒ=¤ L_ÎË䋿l.ÞA¾Ö`äŽúqΗ­ kRP6t–è6ûTü| “õ–%.Œy»¡}D_¡²1”¿ÒÂÚž0Wz)hžÃ¦àÛkÀ³¡žù[}é ú&ÁyA2Eº®J±¨¢ÀöŒriQU«v•GcÔŸ±ƒH :«…Èaã×Ô:uFñ­°—;ë Ïgxqeùöx ÄD´†P¾NŸnZeÇÇË„œ ‚ÞÇ‘¨æ<9²‹^´Ú¡Ð¡Ù[–0Ûž¸Î#Fâ„Ó¯pˆêA¶*NÕÝæÒˆo#Î"4xP€+kІ–ñˆÀ¦Á‘Ç%³i…k±‘b®ÇTñ÷=Þ”ú,I³8«N •샷0ýÝf录:-ÈBQ½Ÿ‰ãïb «ņÑ!¿“Œ”ê:¹$ÒM,n¹ Ò:DÃSYgëþù¥R~^`‰âê¢ä Es¶¸]\ —nþn"1o¾ÿÐ-"‰"÷¡ÜÈŸ—(±÷ x³s•ø˜‹)øõ1%úÒÕ=Ï¿(¾á  bþÅË/:ö=µa [¢FìÑCo#I#͹hÚ ìW½¨êk·n!ÜXÏÊž¹=•ÿÁ¦§vS7@ÅËÝã…f¿RÆi‘þ&Gb¤áجgÁÆ^‡TðÊâÙ°B9qõº¬#î‹U=»“ÉŒõmbƒ0¥zn%ö1Ɖþ·äè‘Ð{V?¾0¥ï‚AdÛ7 Ô–üÓ’J)ôïn‘O?Ó DB±êµIäp›Wô/{Ül)åvp‚ôßÄeÂÞ„e;ó÷r]°¿Pø|›>8#4(ã­võ#†ÎÜÁ®x@ ÓåáNõ7K‡{†åÌëqæ>\’óOî$5(ó#mÒüÎH9ëLt’ÓêÇË(Î’–ŠˆÐsŠh2Føš$d®”VÙ•øxãÊð}I‹„ c ZabyM›W…pº¬ªÓ³!˜ˆô[d`‘¸ÞIJøºUÙΪºoá2aÑÆÇÊ©Ûû«^$Ç `ìÍ¢kƒO±meâ›LºѶ¶›öû- 1ÍêÚ™n‘í¹¦b²ÖþM@nõK¹6Ù+!nëã&ü£!ë윥š«etå%¤…W‘w]¶ º•<=ßê9~%ÕVzÒNvbܼ+»ã’ómû²ûÉîydƆÇÈË«wø™y“&9o|VGrgmN²å°Ñ&ƒ¥!³ìZ±&Á$Ìþû‘ê{‚凮Û)oîXMˆ§žtÒx‡†KécdÇ-ÔTž‡˜®w<º´×øtM%ývš©W§²,¸l½bô AïªÁÌRC8³(µN›WÃæ CÓºDÿ,|XÎa¸`k|¥¿øõŽ@2ùp3Aʘoè›go›®GÒû——Z«ÔöJó9‡›ø™eDõ׌û¯K6ÎSñëYiï¯Â.ÞV–ù:´—‚ ®t.^Æ üà?bdgµmÚ'¦ˆ˜%ø6Z´Ùxyr»X`þéIˆõ ¿=ås:.K;¢i§|Êö ú ”Ÿ ­Âû Kò¶­1CËQ»ñ”œ¼TéYå³7SbBÆUBaz’;ES˜M ¬‰÷W®IftUó& OÌÖv¯Mò™Öh/\/«ofñ¥/ðæáµ)Où } «bßtù\zA/¶ëù†JÖ`ÜĪa¡‰8öè À•™Ðûö˜1ðy[-,UL%:Tñƒµ^Ê¿é“ Â“à„JÇQî¤%®¹§LîlC‹ùcôi;^Øæ¶Üüb>“×Í &qWÌ"þRC‰°ç@SzÖ¶Gæ.èYU„O˜Zð*ÝÍB¹v²y+ÈòûŽÓ"}øÖŠ_¹¿VLØé‚r+N©å¶fC6†š¼·–LZ´ù'[4VS<Ë-?æ»fæ Èú–$Ω@.SŽWœ (-oˆ‰Ä$X],½ePÍ^˜lÄ›¯¨ú±‡*æ¯*]Ás7&žæaÚm°¿Qä³ò"üL|Ãþ ~‘ª ~i²s¢Ö^×­¬ðœÎ䂤PÞœiï>Ú‘¿7cÑNY’þÒÅûè~á×F†ÒIâZÐYÕ˜ó¨' Ÿf²5Øi·v,ž/zÍ÷ñÖ¼/˾W›>+€¶…$¬¨hgð¥äÑ0ÓrûmJA=\çD'.“À³gÇ€ R¶<Ý?.ÞRW¸èÔ|oë–°5 „Kž—J8ç$8\>ë )]•”©ù’ïd6' ½¢|} FâU³»"ÓA¿µš®¦MÐÖ·Iªýê¡T(&*KÝöÂÊ%fôÉ\ËO¦«ç›d´‘m y ¿@ô’ ÿGðX«¾ô›Dð! û®½ƒàÁµ·Q­÷cÉ>IEËW‹PóÁ¢“LâsŸ®•k®cì-Ò¾äêˆ7×Y[+n>îºuyí™6n '”ö S‘ùuƒÄ,gþ©I§].#u/}eí¾ý•Òí©_¨¡ÿ.èÒd­@$šÑÑäô·Áô¡Z¯?÷ü¤•l8ù’Ãïý¨ÕÅ”È<,%¿Tw[+¼ª²ùÛÌÿÝq endstream endobj 2547 0 obj << /Length1 1412 /Length2 5891 /Length3 0 /Length 6848 /Filter /FlateDecode >> stream xÚTTTk»¦S@eHA†’î ‘†a€!f`f(iéV:D)é”n$•î$¥T:îçœ{þ{׺wÍZ{öÛßó½Ï³Ù™uôxd­à–%8 ÅÃÏ ÈkjªŠ€@A^ P€„]Šr€üq“°BH(&þßä ãS¡0yšp@ÍÅÀ/à Î/"€@±¿áq€ÈjÐä¨Áa$ »<Üɵ±EaÆüõ àsøÅÄDîÿ*È:BP0Сl!Ž˜‰`@†BPÿjÁ)a‹B9‰óñ¹¹¹ñ‚‘¼p„×}€e xAB®+ÀOÀ-#ä72^v€¾-ùÛ¯·F¹ÆáC`HL… Ì ‚`†ôT5ÚNØïdß ÷îÀÏËÿw»?Õ?Aa¿ŠA`0ÜÑ ó€ÂlÖP@[Iƒ厺Á¬~&‚pL=ÈuYb~P’Õ€0ÿÀC‚P'’ uø ‘ïgÌ-+¬äᎎ Iòó| PŒ¹v¾ß›µ‡ÁÝ`ž k(ÌÊú'+'>ÔÙ¢ªð'ã"ùÇgA„¢"‚¢Bˆ3â¶åûÙ^ßà ò+ÈÿÓAàíéwXc@@¼¡Ö̉'ä  .oÏÿø·EÂϰ‚‚QKˆ FòOwŒbýÛÆ,u˜1Üãþþ~3ÃÐË sðø'ý×~ùttU5ôU¸#þ;&'wxòˆx„~ ˆ0@óâýï6_À_àyu@Ð?‡þÓQf Çôù s{qýà Î?šáü{„Cf€óî›…`̃ÿÿ­€_%ÿñvù¿¸ÿŸRrqpøæüÿa#ÔÁãO†Ë.(Œ.4áuÀþ3õ1ä·–5!VPÇÿŒª¢@}ÈÂl0çáâþ¹](R ê±Ò¢À¶¿™ô×.03 0ˆ ýùÉÁTÿÃÈlù¬ 1û!1DýZîO‚QÙ¿Ï¡í~ÊQ@ø„@€º«ÐÄêføy?”d‘“R»Æ26Âm »%–6ápZm8[-VÀæÕ7 Å/˜›QaRz#És€èxM  [ãdÏ·;öZ±38ézi4EÌä#¡i†œOLÈdxIÎySI¥ã’ô^ísÙØT‰“p÷Ht|„QÕŒG~ˆz ΰW‹²E 2ëí»Tï=(îžTk‘I˰k×¥'§Ó0Ì÷›ñ5Mûbõrø¨Þ´V*á{2ª“2"Æå@°›º¦)½NïyÒwwž÷yþfD xÜËIåK /¿ßN£veÞô€lyF¨˜ôÛjù²±è’%ÇŒ²9ÙEÆe¯MtÞÿ1 ³£^PFF}êáD×ðØŠÓ >©8a1wý²“8’wã´îzãVïMê/W)} ›n‡@Η/z¢úu¬Nm?q³,c‡Ü`Ö ]„ÅÏÕ–W•Ðë/;HL”4»_5X¶âÊÔxE À)ñU7¥¹/žy;{µ°S¹øe'[Oÿ,½¾ÒX°â3·6»ôA“‚ÉÓõyÇAù›”ò½¼«Û#gJC¨…&ŸnB÷ŠØ,Ó\óúµUŸ$ˆÛÄKÑî¶êN¥Ö|ði½¸«Së -Zc0bÍþl-ÀÔ]ü>E ‹±hÿ¹Á=“¥ú×QŸ™.åóT …]Úìß"ë<É.Yv“»¯?;Ψy“7™ÜNƒ©¦S·eíöœtÎÅ¡d e)å°ÕÕäñûj$tunâxÎ 0³L[]'Ës HÊ¡ƒ ke oÕÝj·Ø^ã=¶Â¹©OFò¨Õ>7wçÒiåØ1Fin½‘‚­/2ôV‚#"î1s-r4°ä îlAý ;F7œRãx:;¹€D¶ªø|{qæåU£/H/¼Ešva·Ö°c±g“îˆë·÷»Y°®ÇÆoº¸4r$‘K€béxÇÂ.Ü˽·£«[Íç£öÎÒõÇ~|\ð ¡ÇWüÀ©ØYx5ïøÒà´‰{=(-¦¹•]Ø#Èá’ˆµªË„yº¥F¥¤3¢ß°é˹X¾—ÁœÍ'³ªÙ×n¦ÕÅ˰Dž޲’"1çF[ɧ z¬“G9(e˜1ˆš¡ -ËŸ/'3c‹ÞTúØ- P¶~„è+ŒæEó|š%¡3f·¨—nËÒ³¡f‰<ѳué²»c·c3;§Øo?/•‘å"ã"‹m^ô ¾‚ÃÓ¢ÞuYõ6VÂW Ô¡ª—0¨ og"ê½Ñàk‘"ï@óµˆÅåË"{‡tLR!˜c¼áiOç}Ž·1ØÐmå#Jšý'2œB’_ŽÌ®Iá{ðÆJ(×4`ëBW>õÝ«TG¢g¼’æd§ÞÓÞÙꪗï22™¹Z•ý{¬Œ[ïÈ~ÇÏaùrñYÐPªµ{âg¼°OÓ ®œ%5d¶eìs6ˆ¤ÐI*À 5L7{K°ë[²Z¾f·åŸ-s=±MS]ú¡RÒü¥PbcÍH§ßÍá}ìRZ$gŽNåè¸Ö¶Ÿ+w<»M¶ÔÂ9¬³p~9A%Ì3s`Cs_PÌO>¤T=}=p\¦x¨­!¶þB>ðaÁ5Âl[ÏÌc¿Únk\š¾<âÓçVø‚ÒWØÛ‹›R¾[ò°™÷4¨wÝÌm<2¾Š‰zç¬ó.g¾8òÅÕå ¢äeØã ÙwÎ$®‘¦"žÂ ðß°Ig5Y¦Zoسf_QŽ_ÄÆMÈâ‡PÔ»jáߤçXÁsæõMšVÈCOË©Û|â)À)KHG·¶[:ØËòd1Xp€L8ŽD(,$!|$cð›Ðg^ðýóQì7·)6<æ@´Îçk¶éïPæËÔº~ËÖ½mñúôðòÅøóg–ß\àÉÀÁ£bqÞö¨‡ù⪹@?ºM/…@¥iK /ï÷1ó&r>¼W›P#\©|{)RɶÒGÂ×”¸«,ôÖØ·É/3hrÞf¥¼‚b¤à­nÖ3!a¥IÖýÚy#÷·æRÆç—F•c{|lÉ´r<¤xtmhvfÚ]wˆýƒ]Bîïâ8uáÅ®´"Ç„— ¡º*Ú`»Ø•ïÇ %?óH‚Žd>ÜsÇ @€º+’ÄS™(iõýÙ¶4Ͼ>õáHkôÒ9Lªî?>Æ“bÄ£>æ'v@î9lšõ8]û.ƒ^{$ÎmÎÝ~+&“P|É¥.Yp9º^LÜÇa¡c6-!O«°±)PÖhnÍRµ·„E”äÞz-9‹šÇ·,í#5'»Ä·bî’…²ÐÞfÕÆ¹ä®T}oR÷Œ!yŒK€Øw¡GÔUoØK¢žüŽÄüáŽþ­¨\úFÜQI%¿Ô÷ϳi\où‘ÁëIÇ£—þÔ×®b¹—Z/!5Q5ò.1NâdÆ¡_9¸Úë¦hpO|ýöᇅzæ6¹¯µÄkûlá€d\ùó’&¼‚ÀÄüÏ›5s±át%Iæ…"òf?€T+8ßç€uÄœ†‡æyHÉÃGЭ–yVÆK»v¿sû™º8á]cáÝ×v8†Ýk4[Tøqw]´øý”úöãªÑ¼ &ázÑ8=ª¾+Ÿ=¦_ÙÑ7‘wÙdd«d‡“~gbCò5kiHçr¥Æ‰ËôÓÓ”ÌSž8«GžRƒéw­SÉ+RèÁñ÷몆©¾ÊÄØ]Åáïj-g®=Ì07'†¿=9²}>*³"~ê²ÿ=R-Äy0ZœŸ[%þåW¥~öۜڈ *ÆÝt÷̈ì¥Î“𨬕êl„i ï[¨£ŠYXýƒ$Ä'sN5úe?œßœq¡a,•H¨9TE·êniµèœ`ÁD‡ä&cë ÂÏ} Œý/:ì=OyëLUÇÞTðÞEFãµdQbñ2KîE»*Ò̾{áŠÝ¸jvÍ~¶¿eá/cˆog0¬:œ•bÉyPS“£wÐPС¸¦_FÓ¤úðÔ,è§JÔ´¾>ÉRb|òèúÕÚö‚l/v±ùÔËœ² â2¼!ýÜH»Ä²¨6fÆ„¥B)“†üæGÄ>ø¸ÓfŒÕ‚blê†ß…K/Ï8úù™¹Ç¢´U.Jaȳ¥‚ƒD$oYì'?8¤¬vêkCÒl'&rÜlj·#N}—Ü(üÊ,VÉC®Wj‘<>Ònæ@²sö“É÷˜ªFeëã¯Å‚ g æúú÷ÌÙôøF¤ÄXY¯«Nx¡¸±tÃÇ `Šnޤc[jî©=^Y"ùk™âì³öô«Aä§4óžºò5vé¾AºÝ‡{°9Ç*c*¥;DNÇ≣i»µ~81[M—^Wt\FÌóRCŠr$Jdœ^-ÙßàÐñx Ò·r¿ÄÅJ_Õ`h"÷™ZpÊÝ‘NË0k[ôÙgÜÅ2jyÙ!ëdb‡}?MÒ8–‡çfÅoiä ˜„ypg:ÚŽÛ»ø;_%ýÀól1“ªæÌµ|%‚8ŒÝ¯óä³}ÑÊOqµ\$ËuÛ¦TèÙ?>O©§ÔPtü€" ÿŽÜC{‡h=#1Te.PûeÛs+ž×|ñý¡Ðð²:GPÖø8?·Ðª[iG󙟘yÃH‘¿8Suòq+X­*ßà†ñ!:åå+Ï<Ýkõ[x±Ò¨·ý/‚)Ñb&te{ü%ùT_hyž~ƒsÁš“©ñDFÆAk•C·Ë%»(» 0‹K>¸¸Õ™qîKÌòÙFU÷ËÖG„Ç„Zñú—j™ü§4|+²hu5Õìç=Ò_Ð41–Èj ¨¿z¾„îFߎ|:µ¥Q.ËÒû»õ/:‚¨ŸD;ºêF ÁšWÓ³ƒÍšœìæãx,õ/à…¥LŒX[Êc áh=‘ˆž€ÞcÞ?ñ툈}ØëìÍâId9¤£tytÚ98’}"µï©âñméâ«||™)Ø5Ñ4½pFÍ -x‰lÇ×çãa´B6žâé$4ßÊMǵÎÕd_swJÞ}wúíF~åö¸¸ÀJ†|N/‚¥õÍí,ýϧí'&…ݯAááô½Ê~ÙT ñmãÃbé‰%Â2Û»A®ªË‰$÷àÂßñ •È oö‹)ïTÓ%ц¡é'%|IdÊâY+8ó•—›sÉÉül #sjó(òúw‘,Æ€b”u©‡V4Þ` ßÌ"ñ…£~×Üø‚Áq¯/' â¼Êf7ÏQ®SÀv=ùÖj©|¼EÀ÷6û5ÕDïMç®9ÿéÍ"izû‘,kF€ m¼é÷²uá X%91š¹ìÉ ~Æ15Ð(*hà¥ô½çP‰·èãìº5î8!™c˃Ó;8y^½ïý{Ró8§ÆkûFšëTÚ<ñÀdÂ+: úp{ý›¦›.¾G—äR¾âIaym4êìŠ'DÐ9ÕÐë3*û©ï§Ôß  7úpÇŽ_ßë…<ÍŽøŽ×Ò$ÝåÈjÖÌ(Öû‚räC˜@Ï ¤lƒÞ«V|)Âk8-îÖ`š›ÞU²ÅX•á0$rléºMRÅy¾Õa†+âUñÚ%϶ËÅêãÀ‘²e2—š·üðI)¿ò1¿K¼°eì¼Sê Øÿ|áî”÷A{ùý“\¡ñDbÿyÊ~pV’˜ð±*@ÀçàÍÇV^x°kBZM%g´o^N î+{‹'—êœe@©K2²aO¼EøâXGÅêî>€;KAÌÅû-6ÒÃ*¶wÖ>ˆW†mGç~4^$¡–šôQ J»_};ˆìšÌ©ÊÃ) ãÓ“éHº®®¿‚Ã'„ ÖTàz;vÇÓ˜ìŸ9û´ï©ƒN(Þ0º>ªL`Ö‘ll±35EJ}&Š·o—ƒßüyÓçþP g~ñÇeÅ!Žz)ëù»‚½ÓÛs˜I•´kTçÈ¥6¯ÝÖpz±<»¸Íåbágðx:#Àe>Û ¶m;![^Ñ%ÁOf”:tVÔרš;()…ÍN숇âÔå¿í•:’g?kÍì2éplúòཽÒÔà •O&JrÎc¤pc’Çç'èÃñ¨ÒÖ1ÜQ~ï¦;é׊W®$ªó®Þ㪶•ª Qaøf/sirçèØM“ü­2ØúšÓØyÙý]òõ ×é ™ô±û¤O%À*8Ù1—«pÙ Od`ìBÏ[Ž$cýfÊ:.›SicÂÄ)n$¼=Éá 8 ]E†¼1” ªŽ‡û6£gÚ2ÕLÖXtµf[ÅôÉYkÊ^dN™•OÙK~@êmu/<ȫᦀÙ£¼ölýÍxÉ>º‚he0k„›„h¿æWmÎziDo‡:©ƒÜ(Bv56ýt±‚{>ÃH÷Ò Ý.{ª½˜·^öèsœ¦€ïõ+}õj2ØüeÕÕË­VýþPÜŠfÒÝ'¨wÃBßRLGi-jOCa±‹Ÿ˜=wC×ÐTQîrf@ùýpæ:¾Œ^O×êþçATÉ¥,´ù ŠÖŠùGfµ¹•%jk’ŸÓ‘)R.¢êÛC¹ƒW;5æì›\‡¢2Kc…\ ë”S+Ó}®æ‡û¯9 ”ê=*¹szfÏY=®1º=ˆëÒ -r¤nݤ€,<›{¨{8‡`•ÊYþ¼Û^Ù,F¬‹EÞv=:Ú.F´ò™®¹ûºüÂÒÁc s¯i;‡JòiÓFO‘Žö~ð·ºÙéŽ2Űæi¶€Ï†ã•Å—$œ×†¿q-U¹ŸÞuX/÷Ÿ»'õq,¡\Zs‹øÍ˺ú9‰šI1Û÷ÀCFáx±}Iti>ébö÷ŒÊGò!D÷$Q9ج”w@O’nÑ ¯r!˱ϼo9XŠ ì©U¯$ègdFš%+ñ´qEÌà Ï ¯.s.ݱú’ZøÔù§K›”qw±ã†`ôâÖ¸3òèƒIg5B®Úg™ZXï®|¿ubHŸzÇž·#¯;Å·TCUã5ñpìÀÉøªËW;W}²[ÁñÁ3/Fá3øKy…ÏŠ'ŠÙ C‡÷Š¢Âè¼¶ KPÐèú~whÖ‘Á$Af[{íÖ™ÛÌ,µSXñBsãÛÝ"Æ^4I\eUËenÂKWt;ÔUT@Ô(•K«N¢ÉzqKwþ]/å§71Ñb{ý¦¦†V}©g©—7ª†òy$p·…„]¥_4?‹6vôýÊ‹.-]ƒÞi±:h©fÿrJÀÔHq…þºÞðC¸ý5™ÆÔ»À/½q7Ü<+ÓÛ^×køŽQ׺a-¦‰ñ~)—3¬3íú,Á!°˜Ž}›²*X뵑¸\qÇ,´¸åôTÒUÔ¡¨r²“I›õCVoVz¢ª×’œÌ(azÊu}Jýêú¦¶(CÖ†X!Ç–ÜÉçyÔ™vÜÕC/GW o\÷¤Ð¸üþÑÄÞZÍ6›gàFÛ«Ì»b!År¯>Oç» àOnÙ› =ë´×p”+žµG¨ÍƵ+ùš_WÁ*5ÒÀyHxÛÜœ¶ì(Túi‡;W—6•æ¼é§¤9â¹j/ýQ)BD¥µw{"«Í’p”Þ®mÐ.ÕByÙ}Ÿ@¶¬Ó°øQµÅþ¹+PõÖ{7DiZ*zù«ÖÔ-oŠÕ):ïLžº=Ún1/®ŸÜëIá™iû©wg·m!eŠrË?â‡ùÔÂþá½GILc£³^JøWf†’uŸó±^ösæH4&ªPKo\q0¹àªêe¿E<*}ÿ°Íâ¡û¥ï˜“‘(kük2™JJ”Ø)t È€…E¢90ûL!ãÒ‚m3ˆ@“dzÀaÛ-ny8 <ð9OY»q7T–a”éeD@+Uç¶ùPß½A*ï‚ÌͧÕ_øš gºØe¹…ÊsßÈš¬lûsÉëÁ‰¦æËk;\3…æïõMÞ»à760û/&“H endstream endobj 2549 0 obj << /Length1 2914 /Length2 25400 /Length3 0 /Length 27013 /Filter /FlateDecode >> stream xÚŒöP]Y׊âîAîîîî\îî4HpBp‚{®Á‚»;Aƒ;÷¤»¿Nú¯êÞ¢ê°Ç\SÆ´µ7%©Š:£¨¹£)PÊÑÁ‘•‰… ®¨ÆÊ`aagbaaC ¤Ô°v³þ#F Ôº¸Z;:ðý¡ î4qÉ$LÜ@zŠŽ9w;+;€•‹•›…ÀÆÂÂû?EG>€„‰‡µ9@‘ çètE wtòv±¶´r…ùß#€ÆŒÀÊËËÍð—9@ÔèbmfâP4q³Úƒ"š™ØÔͬnÞÿqA#`åææÄÇÌìééÉdbïÊäèb)DËð´v³¨].@sÀ¯„J&öÀ¿3cB hXY»þ-Ww´pó4q@;k3 ƒ+ÈÂÝÁè¨Ë*”€++ü­Àø§6V&ÖÝýcýË‘µÃ_Æ&ffŽöN&ÞÖ– k; @YJÉÍË`â`þKÑÄÎÕdoâabmgb Rø‹¹ @JT`JðŸô\Í\¬Ü\™\­í~¥ÈüË ¨Ê’æâŽöö@7W„_ü$¬]€f ²{3ÿÝY[GO߀…µƒ¹Å¯$Ìݘ5¬Ý²ÿ¨€D¿e–@7' 7/;è z™Y1ÿr¯áíüëõ—”¿¯“£À”ÐßÚú‡àëj⸹¸ý}ÿ<ø/B`e˜[›¹L–Ö¿½ƒÄ@‹¿1¨ù.Ö^=Ðì±X~ýýûd/sG;ïßêõ—YYBGLLžþïŒÿ=sôø2r°Ù8Y¬¿†Œôàÿ_7ÿàÉÿ%U1±þ‡Üe,¼ç*Þÿòðøg,hþYZÀ#(9‚f ù=úú,œ,f ÖÿÏ ð—Éÿ¿¹ÿååÿmôÿ/!)w;»¿Žiþ:ÿÿ96±·¶óþG4Êîn µPt-‡ÃÿUÕþ½ÊŠ@skwûÿ{*ëfZQK»Ëhí*eí4W±v3³ú{†þ×{;k Š£«õ¯ËÀjØÿ9-œ™-èBqõê¯# hŸþRÒÁÌÑü×â±qrL\\L¼@­!N€/+hCÍ^6€™ÉÁÑ d¥ç°ptAøÕQ.N³è/Ñ߈ À,öq˜Å#³ÄoÄ `–üq³˜¥~#V³ôoÄ`–ùØ̲¿€Yî7q‘ÿ@\~#ÅßÄEé7qQþñ€¸¨üF .ª¿ˆ‹Úoâ¢þ¸hüF .š¿ˆ‹Öoâ¢ý¸¼ý@\tþE¼ .º¿ÈÎä_IJ3±w­Ò¯KòRCWÐüY»Úþ.6ˆš‰Ûo? KÓß”¡©‹‰™-ôV³øC‹ý_ùß;øïˆ¢Ù¿ˆäÌÌÑ4ÿRàø%±·ÿMõ×`2ÿæÈÊJÄÜètÝíÿ檑¹£‰Ëv nÀß¡@ÀÿPaeÅÚ››¸Zý!ÍùŸ2®_~œÝA·Ã¿Ñ~)y™Ù™Øÿ T;‹ßdcñäø­ÿ¿!'û/èñ›,ë/Áïxœ¿ÔÝÿÌ ¤`ùùÿM˜4>VÞNV@‡?4@²?â³€ªaóÕÔöj‹ÝÔ³?2ÝúÌ¿=s‚L@·Åïâ€"9¸Û›þº¦-ÿ`ð«$Ž¿9‚|:þaÅú«$N¿A1œ@_ ÿ™*Ö¤ÿ)vÐ(ƒ¾ þPåúKfíøÇtƒjædçîúGLÄùwŸ!w ë_÷á¿óÊöKèè47µûvŽßÿgĹþ9ù¯>ï?Òÿ*³þ?Ë ªÞo†œ #W ½õw„ó—Ðãör‚œ¸‚^äÿ¦ ªˆ«Ý›ÄêwXлÙÍÊøÇ~€*îæéø‡ȇû4@3Ï?ædíõ¹÷þ‚Šèó›È“ÐåïPÿyŸ˜¹»€šëö×´„ÿÃ}Õ^@3„Å9G3þP›¯¡mw_Dßx2îŽ NSîj§Ñ2ú.º´»? À¦ÐVg¾[w¹MêF[Ù–¤¹Y"yö=j®ƒhIRm}ô{2JP›ÜmEX˜Àéÿ^p$ZÛGOȨ!²ç÷ìì§l Ù þMŽ2×ÙEå3æg¯´Wm_ÙòhøÜ®ê^5—<âSÙc¬fŒ~pñ ežiÖ,Œ#ƹêÌõÍ4FÎ÷W¹zÿãXöB_Ý ¶÷³>«l®øøºxD×£“T¾b©r¸ó¾%…+ý ^Í…$9È WјØ2ª­Õ¢{jB—¹Atje±Ð–57ù»È»³²?¦kŠƒA[§ãÔɸU~œö¿ñÆ#ž{ 0#¦Ô_w> ÒoiÙãPæð ÕË0º•mùü嬶ú »Ï,š€e¨üBQî^1G‡¥b4Î×k/yNÿ®á’ã<”NÆŽ/x ™œ¥1¥#Ï´"÷cˆ¶‹WzXÞ×$R\WL:»˜È{™%Jž:¼‡M™eZëc—¬ …ÝãáCEcî†^'ÞÑ pl(ún€_~tžŠÒ2Ù´Ú'âVnÿƒ»c€b[/žÏš{â§Üˆ.ºôVº"ä¾näòÉWÞoã%ë½ùòÉ8f´x#ßo7õÏ-sÜ*©„K·?|ï½zt€Ñ8òlOÚk£È5WÒoÊ(_R¾™û.R¨ÍæErÀãLª`>UµýÆñ(`‡U‹9fPLP¤æêá„”%±K'ÏÑçžâä~âv ˆ²·òÛä¶çæÚ&›cYÏ: ÊèYXÖjÕý OÌþT —¯žn!Õ®tЛëö]çÒ€H ¹$OÁSý“ª”ñhúKu¶´Ï] ï<ÁAêÄšÑç6Ù'+¥‡º9ße J+¤‚‡Ù¬=6´u}Q'Õ ™âñû^‘FíÙðJ¼‚JûSJ–Å4hºãô#ØÞ¼¤õ$f‹ëž,»vJI¶<>b-QZu1æ=2œSNÌ2ñlÑüõÛ,;þ*ß‘NDò–…·ÐR0‰dpÑ`i`¡<¾j މè]½¸4;FÚ禢/ò~ŽŠˆF˜sÓµÑ×_Ú‘½w^¹‚Êsk ÛoMܲIàD”Yò˜³À¤~’$7°{“Ú6CUTœŸîÓ}^Õƒ´¯xmñù#aWv_NÖ-'T„ZЋÓ#ôß×¢‡ZQ\¶ÆgÈ; ^+>SÃÀiÂ)lo•Š€,kWÉb:hW€š òºƒ*Â3Ò«‰Ž;py¥š[¬¡òzí’{fHtzY"q ´JzhJrÇùcLoçKw T½‹7±Àåb'YW1ñ˜ôÁ×Ã6ú’3†Õ¯[ÎJLW¶3‹Q§H?`êÎï»Z6 \©ÊŽs ¥Å¿×69‚ŒQ¥Ì¤œ½aÍÐÆÃS>GrÜf™#¨/¸!B&µñ /u§‘gú˜–СüÁŽÆÎ²ª+kÉtª2v•´é l6uvDóùÞ„C•÷Ëh œwËY«°©x´èjh{òÙÕüC†ŠOBleþ~ß¡B¶¾Áôó2ĨÂÏe!JÑŠÒܼ² Ö/TI¢ –o6츼Á#äà㤔ë/äáwTÆ ”?ˆŠâ {„'®MÙ}¦Ú¯¿ÓÙ¯£^Ó^𨠡êüÌ,xÁÇNg¶†·^œr‡7Í&èGàèõ•)œÍaGðfºÐËõjÞZucu¯,ËBrýΤǑ¯¾Àfê™Lop+-8UàYJŒ~]Eì#ûDJ°SÎOÏí¤_àé…¡³%`¸Ê)Y5¶r„A˜c´Òœ*]»y~DC,Šd׈9yÊj¼ÂãÎtéNº½Höp)ÄÎè3T7I‰àØZ½žë9È’æú}nC›UÊëûéÌÁÇu€å‹}Bl½—–÷uýúd™¹OÞÇb'‹.ä,¢ð„O7 }%L.b¼ï)°štÄ+ÅYzÝÊÌEÈoKxÀ&l•"f¢å¿€çNóçwþ˜I² –z A\ˆQºŒ*çߨ,4©è~<O¬D{Z§k‹è/ÊKÙîà Å,ƒtí,⨗ŽC—4Ó:ülµÑ>ÔK‰­š4.Uè¨ÒÞ»5‰HQßN6ÉÎÞv«Â;Ï{¬ëÊNm¼]IŒ|첤}ϧ”\x<è:}=ÜH"c‚”iH¤½FÅÆá‰Qj烸G1æ}†ùÕs5¬ÿX™×ô5—L¹(sxL»‡N Ã`•¹ÈØ»,Fµ>r(Y_5¥û]ÙŠµÎÏØC%À¹Q¾¢qHA¸:¥F­R‹Ìg [Í!Raôí‚N„Êø¸¦äçãË—˜óiùÎYT™ê¯õBສ"㨲‹n”ù;¯©™z%´Ü½TO¹VãYH5ø‡:Ô3Ë&Ý =?©ßºάbv0rH”SÈÃA„£IAøºŸ;2‘ŽPY¯Dä+/U¿¾|nh›aºÖíð#çÄX¡:ßnÙ¤@3¼¹Ï÷)ÃcëLa}¥eï3GÒkE ¦‹½èë©k Vwÿå…ƒî:$ݧVÁÒÛa×ësÇ ,Sßï9D8Rqq’h_\38&í@݆ã3â=\Ä S§0KW•4s ÆIý›êñ™ *§oPM¨v˜H~Íu<LC½© ôã>Þ%!$›F_Å|ª†#r¯؄=fÚà` ~\¶]ÏGô¼7É'åÁŸ-°GH]ŽÀ³ô\$…E€»ãÞ•‚×ñV7ø–ñ©òÞÎQlî°" ž$5˃”åþ 1J*ùÒêúÃi©äº‰^ä;‹;/Ž ™°\l¿°ÚOuüËÒÄsXh:˜dìbWœ‹—O{w›2údÓåz0w¬©ãŸNÌ8•îxËœ„ظåZÅž/ë]™!O£,i®J½°UPÜ„ôª¶xÆ’¤]ûš‚ùHÔ(x ¸°¨"콫h­ëñ£<†mºo´K¢zÕÄ ‰ÔÄLì¾yÕåÎëdñ}åT,®†Zß;]Æ:‹‚ÅüÐZ‰Zÿ&°ä‘Ù¦ l£o1ÔÍ8ùôH‚J›0h°lgNõm3ŒÌzñ>ꨛlAe|àà,Ó¢áO‘ìr—T4£«c‡•àn8äå§m7Q%hFd‡ÔèÂÐFk8†FaË–X‰õÙ8ýqü±ÆÄ_&NJäÅ"Öι€½ ]+$Õ MBÉvßT Ê?NÓv†7dÝ×^0ÇòêãS#6_óí¸AÉÕØˆüÀò*¯ ‘¤a‘æoÁ^Vu†øP:l«AÝ|žÆŸ-ïüÆaaÇ=ØÍNAœ5ém/€sŒà#‚sÂ|¯óTa°ðNô„«¸:}'a¾ kO1pBm ‘½\.Uqi84ÅŽæçt=q pHu—ÙÞI‰Sž\ûåGÛ³¼°f%“Z¹¡Û<]Íá«éÿ­¯w¿çªK0I:’ª“rüìžt\nFg·d:_žòÀ¬P²ºé˜ø1CPlqTÖàM: ë-€ürºÝ eTO5\ÁªL‡q÷]€ºË‹· '@QEGºtv‚Ÿ˜*–ЪtW ':L„3(qu}’†á.3A1«'¤qHBÆ&â3Ú¶+¶ ö;¯•T„=¦n¡¥‰¹êê¼ï¶«–ìzù©R«Éö—Ò¿\ãi-&w¤|2Œ…?oËš‰¨ËP¥ ¼B·%žB=Àx0ƒ³¤ÞêokÕ”±÷]šTŠ’z{·móýœ¦ÇÊ6#Í÷:‡N}gú]ñeîý&³…?ûzjÆÑHÑÀ6™ti*zå>µ…¢ë$ì É[mÍgÿ§›úÆ&ÞúXCÄ ™yJ›±R™Ž³he™W¸¡±$F÷ Ñü_Ç/¶äš<òP¾¬#P,–¡.S‹[ s~UÇ{&j=ùÒõS$©/ >ݤ¢.ˆë“h YTø¡£6x"ÍEŒ Xc1ù²ñü„ƒŽ¯Í²1»Ÿ„Q•q µ¬]îsàF énÝSÞõ´J÷ð±oògÉê´3Áq'“CÄà«#e[Hã¬ÆÓŒm§»¤Jwï —‹ÔÕËw 3çzÎ.ïÒçUƒÙ¬‡7wÇ(š •àn¹´{Ö|2¹Êa½Ë4UF@åàC")­Žç ¡ ÷ƒ^Fi¾ÈÍŸ½>!Ùa2ºú”qš' `ÄÈ>Û†x#b±Þ”AJ[M ì‚xUo6„Ûì±äïp§ÙCo‰¬·çeDVâƒ-¾‡<Û6©1e\?{P Ø3aP©owK´Ž.Úy?‘àq'á|FÒ¹ž¯­ì³?¬7l¨–vç4’΀½«_d-zDucŽ™A|ÙˆÝ:GØàx_ÃZéiô(!äïC¿gQfÉkEAôPÒn r¦xo¼`8Õ,-ÃÏYSà9pÔ µ#ëâ|&ZÂn!ún]ÝÚ½"¨{u§ç¢}òìx CÇíHâú†/.vÉœV­r$ꆎtÄXÏ€E»ÕbRV0ÔbµõWo¦ØýN}W>?½WC¾Ôä-ÅŽ§åPRƒrˆÞ„Wôç|o(YšÔ×64N…â2ÙN³z?+âNЉ-LÍïÝñž­:±ôíϺ|ãgû½ß ú2Y¿]ÔÛ.;ß €»ß‰@øAU“`Ï­DÔ¥÷.q½9eÎöž|469ÏÃ(DŽÒ«B3žê•ÌÎïö$è‚>6!~ƒ”ç³g}¡`Š‹áo3üeHä1?j׿/Ð uïL»öÓ®C„ë‡4:_”j;aÝRŸËè”aŒh¡¦}ž'F…IªÁüGÈ3yc!€q] e·qêçÓÕoC®eÂ-#­ý†úOïé±çžU‡7K”L-Âè—Û:ÖB³Éàc‹5áÛ|&/-XŽ™ì|ˆw¯“Êü$ЃùöÁ{µ©¬bâ® bÐòæ•Cø-›Awèï<ßÎ$A@"ò‚ïôû¡Ðï}‡,ã>ÃõªÚ÷<‘F¥Ê>hÊïEÞô„ý’D}”¯ÌÆýd™²ÉM.–Yh8Oùõ4“ÈEk-¸ßËàK3L›íÖYNW½A]Ö=$§cšÞ~Þ„?ƒU 5¦ui”~’j—ì…ÌÌØÕI§°߉ȂÔî¾Ò+"¬úÛ®U– ÚV« í9˜àv‹f)‰F«¸e¦…Z ZCuèIFâ0OÿgÄH]¥&Iì qð«ê[DÄX5h`½O÷ÌÍ9{Û”>BÂÛÉË‹Î&§q®T€Q†WWl¤f¶_4õÛÄúˆPiTÍ94.YD}’O¡û+7BO|CZFCB³E¼t²,þ8Óõúd¾ ØpgìšK>ý?‡Üw¤2- G ®UÖK†i%ã#yPß=if>xÒV[bF`;Ïðm˜Û6W¯`GZÁ: f¶¹:"36‹$"ÈCJsÇm“Uú©ND@ì•=ìt/|\ýÂÞùç÷*ÌÖ©cFòY”ÍÚ·w‹²ŸÅÍ«#²õ â'ÌéÕš7.$=Éeê¯ÔâW^à˜/á=Ý£úÁŒ¸uذNögˆî»¼DaWuNV½àÊyt3È“øÃ_Ô…}OÑZ‹ÏDH{ÊP ­Ó[YÐìzËGõniYØŒþ†r£þD©uEL“7ü.¤«<¶,›¬g®7³Öò@ã°muÇдT»f™æ+ Ʀâî€;*&i;ÌK‰Ô¥²GǧP 0œ ×å#¿¨¹¬øcæÈ`F8—þˆÝêèsT¦<ÝX°<#þüªv¡ú®JôX•h™4uH/NïÊníÄÔ¨äÛ„Œ wn5ñ‰ÎŽöãW©! IÅ„yƒôA±÷[9`?Ù(T›÷¶ö ­ 7‰·G¿æ/ øš9yN†Y?Xÿ q„ãuIÓôuðñçR7¸T1Ú>Á ~_¯hSÕpR-TRÓ+ŽºUv,xÖVæ*c2ï߬$!ÝŸÿx jHP…»/Xµ"ÞÈOé¶2:ÖÊ ½§Nߤ݅¬×„™@>B²—#7fA ¾G”äÿPF<ø Jéã”TvçÕŽ¹ãݽUŸÄ‚7¸x£ »ªÃÖ.ÂhÐÃ(Š•Ž82|C_˜uŽßËË%ð°Îm=ä=9c4yUä&quäVÙœX¬Ñi¦\kR°øQj ¡ŒÍÙçóÓúÙÑÉÔ饘Ô7ÑÛ"6MŒÆvª1*<Ú߈`D~9Ŭêß×òBMþx“¥ÛúrE±¨]Oå‰Nó®1X$&¡m E®ñÚ»CDþ³'÷¬\ªŸ€ühKòíÍ}léØÎª˜˜Ó¹k¬ÐQ³!/9Ò{äïYßFSë±õÝÓææÑ±&M6ÙzߨkòC4‚ûx†¦N£!§'ÐÅýðaã(5»½Pà øÉ¶,US~ä)°`¼U²ÁM‹RQnÔ³ˆÄ’‹%;qy¶ ÒjgÑœV½ÊÙq¶¡pâv %ˆ<ÜFµò&.ÿkë+»VÆ+öœDô¶‡ä¯Ù!·×ú#èËölß;m©NÈ?»·ØÓÞ[¹O5·âpþPlgïpC¢"˜9¡8h愽é& »9¹Áç6Éh–š,r¼½ôc¤Ñk|9Ù.¸wúh@]£¾o-!À ¥Rrì'g(h“Y+ÊàvrÓóTŒøTSEø¥5à‚êÎtèxÙÃ~„G—÷‚zºüz.½–ý¡<†äž€ÔÝÃÜÚùÉXÃÏÿ¾ÿ­PM€@8‘ÔäìÐÕ?Ùq¡S¨¼~ã*D ON~~§mñr×þø9€„¿ø  ú»• RPœ6gzu« #Ú4g£õ@7`ÇÏ6qíîº^&èÖJ9À.Ç“ÙÛ„ˆg v9ŸAWÖ‹Kqñú‡¶ªëœÏÏ¢Õã›t‡·9Z€š—õÉ7Ô ñ"LYßHϼ¢ÐÕI$0‡-;$F†Ý´.ŠEŸ9GÄʰ\£Í9lÖ¾ûß}};ìºmöÅ=ÌK°FV},ˆ1—é›ÍM =ž$¬VëÔÏިЈ#FSH±C3.ÕH›ç<Ûô؋۾?ô8RC‰uœ¤‘Äc |ZZ=f,YIKÛŸ‡HýÉò¨ÜÔ‘œ3*õj÷ü&ZÏ@ÝF8ŸbAÙö:Eözü{:‘©’èàù!5®Èñæu¿j¯×Ç솎Ìî;uKºµ51žŽ1‰©¯Ì¼sö­iº§¤jXWÆœ  Ýšn”©üEòfb†‰"íœzܨ§‚JªXÕetÒ‹Œü;ûöƒ“ÐÁª4ê4ïë•ëGìk’û¤Np+Ö>™ Yˆ°Üཧo¤!_#ñ³xþÔG –G³24‹yBu¾c§#°cIÝÈøô/­Œ[¸@«AsÃÑp’á,¼¶âð¤ÞJ>ÚÊÚ5Ì%CïP(ŽjÖuHØ€²…Ä6‚òÂЛ“&] ÷K”ˆ;Cg7Ø"ÔØ Ѓ'ÝÛ钽ʥô|ÍVÖ&cm} ¢º+(Ôð#|CcùÇ{BÆt4¾ìÀ™€¿ñôP¦G ù&‹ÔOí—]rŸÇ(ÕôTè:t³`¨òPÜ=c#¥› ÇÔ*åDt4ÙØxÙl’îîy-oÿ»knGè~e4á<³2ù1Á±þˆëЧ‚)_î0 ]g§}™úø‹1—¬fIÒý¾Ïå­ÚAÖGÖ× ca‰…6‡e2áC r7’ä—¸9®èïËÖ„å$Ùä·)^¤H·™¶¦‚¹\]/Ì…ø?pzøÿd«Ïyž&jÙgù”,èÁ(ïe|ú®4±©º²b[g‡ì’S8ó6~? ¾hšœWã¯Ýì|[Œ`'hÏ[}†××”3§;¯b:<ô3D›âå~’"Ö~å$‡(Îíz*–Ëv€,E™ 6èo‚w¨7{„¢ ÍA¹ºÒƒU8\ÄúÈ^ìòDÚ×â‚ûFaß›‹ç×Fx-ÈK>ÈsBžV‡Õ´–\7s³7S[õ^¦ N³œW:ðÂÛP\hŒB·^òWA\F¨8m56±©æ*X-dÞüö|*$µúVÙ>§Ag2z'K£–?sÐ[ß´_ Þ&ôëH´¯º­(®E†Žïd÷"mQE«÷?bšˆìXéVω”Ê#hÝÝÏTïDNPÍ&½à §Ùqs¥ž·›»°?ÄÙšuÏ›sqì`vùásr㫺í&«‡5®ð””ndù*¯þ“Hú":$YkƒËè䫸7éb)ЉË›Í^½_þèÇ_¼ž.ê6l¥›I³t{DÀ»î[ jìk¥B É%ƒö}üÄÏD½^¤oZNÄÑ—Ðh>ûBŸ•ˆ³&ÁÜ5Íu€k£©YÐíYÜ’±¾E>.?ѱ¢8¼ÄIñûɾÚ5y9<|sCˆ“w¼Ü˜Çt·ÜCž&¼ýXq(ÛЂ Ä­Ø24w I9P³ã-›˜æ|°}·ýéZM“a%›(*ºØlrN ÊÄMÕÚ”NÛ¢Q rIØå-Üìê—zíÃ^er¶ôÔàÓÉ!$5ìe! #p©3T0±QùÁ©Kvu3îͰ¸lSH%ߨ0Ïv$[ Q3jè0ÈT`ØÊž£íÍõ´,È„ÙZûZäß)«¼o3öÙ†¶î±QÎëçj;=÷¡¨Õ>è6øPP[çÖª±ã•ò€÷¼NDÝ?»¢Xö(ĘƒqÑ~W/͹ÖöVJ0ÿ-Þ÷X6—Ts~ÖuaÕ¦qòÅfÚýƒQÒ®õ{tà™,þe®ÎÔtÏ´w+…aÅÃu‘ɼ絫rëðµ¾ÏKÛÐÍÉ.£b‘ܰž%ÙÜ `“òóÇó¾Ò)¾¾šu¾Gsi”ñ ôä¹sØÊõ„­¹Sê C§ëfã¥Ì)?à¿w¨TˆŽq9 ËO-_L7±CΓÈþ’–òè)øÕèGa¯â”qnÖ˜¹º ÁÁô«ZH#:~¡IÂVK¦Ñ®ˆ1üŒ%¦úÛ„'¬ëúFZ›8\M0Æ­éŸiEkòëîl…_c2XuªFäbšûqÔI‘âæÄô^Ξî¥ú—–;o¹nZ±áça±²ÀùàØ 5TMaeìØjñ•ï x!×k©'h%WZÌsÕg>pŸÇ‡tׯ ¬£Â¡˜º–ºæÂGnG7;Õ“Ò百½];öß×h¿kŒ©¼ëé‰ê(sPMRÒLæŽÄr_ZYኲ,„˜Ó/kª©J7™²í©Õ…¾z¼_y5b¡wâT÷³’(0ÓJ ¥#a¦9?!ƒ±Âލ´a†'|d¨mÃsá+#" »Y󟾹µ…]QEu Ø/bæYhÖèÒßìM/ ß…[Ó¸ª0¹¤i?£³ê ™]ÖèŒÑ–ÀþP3QϬR3v[,¶)ñLˆ#Ýj S¾\3hü úú ¢Ï¢˜'µÀšÇvÏ~%˜{UÝ®iEÃÅh‹ÜOÉ#\ý®p<¸eEœüð\â¹ü5Ö¦©ïKcº´Mº€Ç·h»õ°§KÙÌÕÑøê><ƹ°½ N0«$¸õRq£S#Çqen‡ú^Bç!K‡–Í8Î\yfÑØOõùÔÈ"¥ÙV¦^ K÷?|í œÛj¿¨i’¹ !ÝÅë½ÞœKùItÎŽ­H$Ì]Нúí"’÷¬ËÀÀ·PB‰­‚"ìx¤ȶaeÝG›ƒ¬w±4#êb”¬hò팚€¸g1xÂ+êGÂyt…<›W®ç@dîkÏimøÅÌšïgLŸÅ­5…\ê.F}ûÆæçæM ½œ.q)¡‹ÐR ®ƒ %xñÛKjÛq´Q£T>ô´è¥XàCAÞ´j6‚E.ج¬?b0ϑţe7eÄÖû ÕÞç-Øs´]Ç`6å4 xÚu"š œ“o@ñÕ«ßxydî•ÈšãL3«ä@ßxá»T*þ/¹¢mi$O’ ääŽW Œ&&œ6Ë •«X©ìÕ½f÷´$p˜l‹qL¹/ý“¸R&<„„w¯áüñ^×[åþ ØŸ¿S>­s®è2hRÿTöçÄxÐY=yþl†¥mž†“ £¹,dÙÒ~ƒîà¥WcÅÀ7óm¬ý(§€]B ³ÉËûXuÝv½ç[2ûF¤Á@>­‚#†¡d…ÉQ?`×M,pW ÝMlbýs[Ã6Þ¶œ{×{Ô-†y>®Ù¥¬ÛWn|sëšñhæ½îOilØÌdé6F†*’E·º‹I[Vߌ ˜ôܰÚú(l*´þul†éh¾AzaAÅgÞáGˆÕ‹tîó Ö+FH-î3W› Û»9?G¯óâlPä´÷zá®  tÀÑŽÑ›”‹¯zì^´ç(:Âä°X´ò•psuT^¾ï‹(ÒJE«f=2 xï/4G£it|,+¾&J)3óî Ëi#75n¦:wó‘®ãDoóî\,bú`8rjvÓÒâ)áêýæRKšDÿ}a{%O¶$J'áZY¼?ƒ»"®Â×äBUDÖ‹[T¦Ôï3ËÝTZ§lß?ß7µõšõÎIåE‰ÚMY˜ËÃ⌮kc(R7l?{Àø¡í,3Vìùûg"@å³vŸVàŠ¨ÝÒ-~&ƒÊ«×Òú¼<ÂwkëPwôŽ~%oIßôÀgk¥å•ï$ÿŠIß@‘ À¿¼ê´ñ´ã ˜L™¡úï@âHóœgWä§ØÝl–P®i³Éÿý4Їzò …*l!:Ô¸™qC΃ ×4]q}“˜E?øý=;¸ÔÀxw6óÊ·Zð! q9xØŽº\4@6$R3—îÀÝbAP&•úì^¤x¯Ä ŸÎ§Wë‘b×´VŒÌéØÅFô‰åçC1hdBÜ™`¤´e5¤s$RkŽ4!”‡ ÿ=x¯¿K”Î ÿÞp9Y¹Œò%î‘íZi˜‚µËfÄ«Õ^æË“’ÇÔUïHT7<ËV¾(£¯”CÎx¦ø#ÄçõïïNòRŸrξZÄÐuå$ÅÁÑZNMcv(±4^|Ò$4‡öIì1‹®·Ê¢ñ»R‹ø0:tÈu½†ÕQ¬ +¹Ñ¼M•ªût)öé®xæû`i¶}‰FÎ:ã½l=‹rÚ­Ø)ÑÖªg© [$ÚD]ÚpèˆJÁšñâì”[_n4+ì)½ÛrôƑ/õ/¯Ckíw\„ØþÔ©‡Eô›$(•WsÒmn”ÙYçæÂ!x|ÓÚàlkvïlÆU1ÉÆ7;\¯OYP'îjññÑ[îÂù?ÝTô'üùƒ²Dmr“¡¶þ4¬'ú{O"n¤«Œ-г®-\6ëÖÒAò íõ@¨BAÃSi°z»¹™ïð®­¦êl¼8€Ü(±ö™”³J!hw•ɰ‘'<ªù“z4Bó–hÌzg1+„OÈhk´" ºÿ¡%Óç‹MÞb‰Ø^—o¾ð}Zù¯mǪM¢ñ¹Æ™áúÞŽ«M+Çöµemš2›úTZRY,ãËõÛVk±ÙŽ,y!ðû\Wu•o–­M0ývW/‘ÃeAëqçE#ŠÞ·¹:CGBÇv«Ÿ™ôž}?J¬Š:|»°Ñ7{/NÃëÐÊÇÝ£.(þÑsŽÍÄ–Šjj!ìãy[D2MmGl®äüáÕ€ìXGå[b›Ì†lÎì>ôŽtÖ™£/á£ø3oë£÷.÷ž“¡]l<‡¼âœpÏ(s’×nù×u+ &À(ý—4´p³VéRøÁÈ|¨YOµ3Äü–’&tJ„¼Ù¡­—µ)Í8F¢«AôÓnþÅÕök3 Š®A^hä‚ç¥asHlhôkõ“ÄØjŽ!úaô†Î2[yåû0”“}²^¼' ~dã…“î’zPær2ø† CšÍ(CÕ盺q 0á`Ö ðQ¿Ø¡í¢ó-ßu2iü>*KaèÒΠ¢›i+J¸˜lŠ¥â‰¬Fr4A,;âßrD*呌7“¨1ó!H{ô1!l=ºM»ÞûÃð%Ýïcâ,û è§‘0|Ä‘zƒSj˜ý±Ž ®†c'-ê› ³“6~4yßKUçQŠÆ@,&æn„}2}K¯ägÄæ£]Û—¯äWà?tÓ D˜ÞÞ.Œš%Ìè!ØMd0t$5=“{§3ú}©´ë"0Cyc´cæÛ›‹G‘=ÒïÇWb&±× oŠ/Â/=zê†bÞêµ)ì&X’`ÕÑ‚û‚IŠ…¥õX¸½†fWÕyv¬Y áÔäcÑ2®ûvI%äL5(PZ¶”+µvìK ã M™‹ÏÎPm º¶ôTKCkѼ«?«kI®‚^Wâ±Óˆx.¾íqˆšžSòCAô®æ2ìMÛiÊ\Vù†}—Â2vß;´sâ43Z-Û1FŒ¤¹ûf÷D×ÄŽØøJ욦ÌãÈ÷Ú ——çX`“'Qø·}õJ‚t“~#­†=kØŽø‘‹wû‡ß2¾ 1u[ÐnÛ2Ù¬ÌÝõ±~ÅÍOVb@ð»·;(¼çW¸Ëþ -ùv*ü–4rï bž Ô‚¬Â¶–ŽXåJ±¯ÞÛZ´ ÷]¦FUÉç*|Ѫ{ÈʱB•f8‹õ¯o½¼Å>œ”—´I¬î7¦U…P9Qû\¬æ`¢›S­Qm#oœ„Më`ÆŸó4 ÒEX¬£¡ý´ûXeÜKçÆ4,_k~.AƾÅs!v¤Ç³‡Péy…¾¦Ýçú’Ö„uè|_÷Ùñ`ˆÞÛºág{«µ»)Yz?¤K£9Ý{3bôžÇ¦[µù׳1>{//X²¼<ÆÁo@Úo+ú,Órú^Ð*9p»È®&Z‘=Ié^QöšŸH1ƒ=ºÐ%ÁrÁU}ö„öH|Âé“ö±@MÑ0øñþ©LC™`V#¶ô†ôI!hç’W )ŽÉRGMŒC4œ=ý‚pi©9üâÔàûpiÛ²×+&ÉÕMã¨|òn‚7!8ϺyKXo[µ?Å]Ƈ¾ ã¦´!Ò³¦«Á†Ø¿ÆN%Æ]*³‡C¹žQ²Q¤Ì†¾ŸCN¨§’¢]‹1¼@0@ŸQËåàp’ìœ#¾ŠH“R ä²ô7g: ‡¼šõª)¶Òzÿ¾Äm'äšÿâçÖ…Œ!§²Nx-ú®MÍÜ­öLl# ®š±šM& 5o8L3R”Ù+95eª~»ˆ?Çý ôë|g;T¯{Üuè£Üù5uÈï±2<†šò1wSèð¡c„UÑôƒ³^,r3àÝêŽ@¦‡ÑýhîçH[àR'Ý›“¨PüD–ø9Ÿz Í  (ÏÓÕ˜PB§Žó±»XLëmõ„«Q¬ûŒ#è´¾äŠèÒ–™s0ˆ<§Œ0È/É 3ÎIsŽÑ“¦6}ÙÊ}[ž÷…M‚«WCƒÄ¾Æ3¨%Y_)ѼC¶ 7”.'Tß§+Ó;}÷f…Ò¿ÕUÛ¬q˜üÜ7m”)2€eâ—~ÔùäU¦leã, #¥¨´¡l¥»ÊæžÞ95•¡Û¸ã¼œ€Ñ”IÔíwA°OcD }-,-ÛJàÜ=‚ÁÐc2oWuÍêwÊÚìSFNbÜfÄ ãÆ9Âwq¿”¬i\à°L dÆ-—? .V}Þ.¦¥™irPeT6 !:gÔiM–Å|iÉ;ïÅ·ü±<æåÄ*e|boúù*µ…ö”<êZLýÄ%Á¨ˆ¼8wp ÙÉxŸ½¤S™ÜvÖóHðÉûø×´PÍf3xdçd:Ç8ò`Ÿ­—Zi©t[œ.ÚüOØI¨,Wðü9NN32ø\1tÞ»d?Ñ¢ûúv 7/á—ÍŸû²šÆ+’PHæªÕ]Qvð~Tv¬ÎH«¨ÕPà0uÙªaÒxQÄN_½JpbËNæŠèPEäãø“ÉO7­Üq VõˆŽsàñv¡ +Û±i!G·¡ÆÁ_"t? »¸=*U¿Gd ¡ž‹I5¯ÝxM['Y°ž<½új‡ËIYXHyš'“‘Dàt¹ý‹T…J¶Ñ–Ϊlû奣¯®Ã•Ö7´;^Æ=ÄfpÊØqíÓ=G_‘i«¡ä*jjÒ,£Ž¡49A…”Š—é.äÒ`¥Ìíó™²ß¤nk‰~¶/ŠáÅ?zjó¦6§2¿Ün Qoƒ§ômÊÖ™£jŠ„SÛ•³w|™=›³ÛÏ@çR—4ÙIVÑèóZgÒ uWû¬ÔžÞüÁç ‹A~|uæŽ(J‚ Ù} (éŸÊÚb‚ã7_º.½Z'ý¶I¹ÂæH›?&Õ±HŠ`YgÒ€3ü¸ó@G‚ŒVy2Åûù´°·½iÐB2_Œ*ûè6Òp_©J7‹ :¡4!o¿Ÿã˜;æs²“c&1VMÄNLJÄ÷ØÁÈ1O¶=YÑIÙ­SªÖ,×uyZ"p& Ú žj )]qo¸GůïôŽøÛÔT\TÖÓŸ°ïº Œª„S.Ž6ø<295eA´ö“Ôàë–¶Š6•Ê.1¾\­Þ\½ ÁC½y¥)§žúÉηîªPѺ‚BÚ«(C-hËCb +ؘûBëòJT˜À»â?;Á ~ ÷¡'Fd÷Š=ƒÍ‰è’4ðG÷³ßºúw¥·z^¸?[m0žˆš}‰F{"éväÐÎCµý‰cÃNqÑKкoí½Ž¯…6 0Ô¡ßQãjµh†þr¿Ì ½[Þ:øè^ûÖ5‰Êõ`™'Ôý#ÐrUD2Ï2ü†B7>àÓ…7NCK“ŠAæ²hؼêSŒÃú7f.ƪÃlp©)¸ïŸÊ5XÈGSÑ£óuLãq™Û18]ÈÞëÃÔŒHÙj¶UÚ-9ç/yˆ°w_(^sâhOú€š¤[þN|„“¿õNd< ó/¾êâ“oF ó}óç0Û}…LKBÕ†ã¯Mc…“v¶+î4‡‡ÏŽ çJÛl«BÛ;fLIÝ;<¯ "ˆá+åH‘ m½ŸM»¸ò¯3Ëw,¤<•WשhÈÞ@8‡ô3LNa|gþQ=šÍøìQ5¯6B.‚ ^M0Çhe9.ÑcVFFµP E-lEW•¿õýbƒ“ªšQVLçaÏGT5MÓ°oc)rßÍá"õ5ÂÛB2³Ö³ˆ{Ÿ’¬Ô4s™7 ëÔòȺ)"Ÿá\~T‚³Ý·ˆ@.^µäÛdp\£‡öP´c¯,`+XU›9ø  ¿SÙ‘ ói3·4‹¤?±ÀRP¿z<¸{Qò\ Ѩúè#ÌUyþ@1±C¨5ZÞ¿¢nÛTÿ%Œ;uMpbŠ›²Ê$ìSáÀÞK“AûÒW®=)ü3˜ÞÁ„ðµ ‹'"4Îg„þo?øñ9°9Þ+-ª2GQƒŽ~LfS ýôf’ИÑÛZ ëý²°Az…CÙ£ïd•2¢­:²w™Rìúé¬a–dÜO”®y"*&gÿ îIMxéœ*õHŽv´î 84)0@ÿµø-,.ðí.q\q—¾¾vG߸…¡§ËØÛØðþhÊÃ"Ôé]´0úÝÌÔܪTU%Ï»e¼íoí|‚ùÕ47¬bVž¼ôMX*r»}`¥HŸŒÓ:’~T~Ý\c0áB¯·a“Ý< h’”~ Lvm<ÉTé$Öü8"»èݚі(Û3F@_»â–2 ¶ñuVõÜ(ÇæL2ÙɉùElÉÉF…8OÊR—ƒN è­}¢1§¥t—%_Õ–Ñ€_9Ýâ®!l+à &ø®_›ƒ¨0º³Â´ ¦m*ÿ¬óæŽ]5|Åzèœ;VßɃ•®)ç' %å"zâD£§Ñ¦³ãÆ1|ŽÈôÙ%} ïJþp›xÛ¯(LÝðÁ~ç:Ü*„AȶêÇ pÕš¶G«É!ÍåhëÀnZy„û}ûì·AOÑNž8ëÕy·ÿ'…'zØ>Îsóg²v5'üé-â$\_ïSwY v9pPŠÈ èù¢bã¬]{•Ðá7¤ÊÐFþ- ñºlYÓä0†½ÕCeg©ëüW„èKC™ÔÆ-…|3½Kj Ð!nžÐ1óÂ-SØ|“†±nĵ fdešxaÕïN¥kßùá]´4¹ü$Š•ö…èßmDMñÖ9@†ç¸°ù.rŒ“o¡Ä÷€w#\QЍžÞX“çg¦¨ðÀ#)dCOúYaÝ%Ph§m¡D»Ä`~NÁ ñæ¢ì@­óüP--b›Žß%ˆÐ°òtSV¹ò¿n÷‡)WõËD{jÑ䃞lÖLÿùˆ·¥Á®Ä…óGvw©Æ1CË«»Hõq ì'ù :NX‹ \mŸƒO1o© †´ÄCq7C׺èÑÑLÚžRƒYð¯#ÁY,¢"LfÖÜ—*DáçêIªºu®îbº]Ó#õ [€š™ž P ŒÁrCqqÍožt•@ëBD¹Æ#¦=Åâ§Â^!AˆV!ælcû:17Iû†Ð]Þ0ˆ­Fã·xFËêÇÔ¬&fL¨–R}jl·¾Û_áã3Ç-ð §ûõçu“à˜€Ìôäã2HÕðˆJ×xzGg¶4!Æ EëË‚srmEÄù鶪u¹šW-Ë%rO^ÞŒ†%ÌT²ß«±c » h}{OŠ8z¶7N"Ó>ƒ³µÃUø¸øÉÍþù2.ÍQ4Ø©îX½l3cQîòænOY™üù§EiÀóQ¤Äb.p¿».ÛH!Ÿã ‡a®"6¤×4f*:Ö²DŒnÚ8Ó%TƱxŽ×S»³=àex–@¯ù@ºÁ¨¯_^ÛÛ—…Hž©ß¶2ׂۥµ£ôX«Jl[ô/Rüzd(tÿ=ƒ¯]|’+Œy¸ò±§âúÈeXG“ùµ·˜TE}¨õüÓö¾·ë Ç\ß­Ósn#."Þ)_Ä)IÀp"; UÇšHF'ɰe}÷ Ï9ƒ­ê÷Mσ' 1Ã}µRź؎6‰ëÐWõš“É¥‡Žm%äëÓ0xƒ"á‚êŸ]’®ì—÷PcÊ€u‡ƒ#\¬“$ þŒ<Ð[ß6à7”¸U£‡¶¢f|„ÛZW eØ}¤1d¬)s˜ŠÀ³4ÐÊàÔMm Ë^+žN*—ìæö•c\nÁPÚó¤u¦gÎiË("/Ú[©âb'!±Ã?}§Ê[:ëÔ~p"‡žÅD¢·•‚ôÿ GYšØÚW•€ŸàÒgÐN¾§JµÐ~3QdèÅZ¿ ÖèÛº#vBZÓ ®Ó“(^Ô™Í#– ³œ¤þ1KÃVaøI¡×ÓZ£uÔ…¼a˜Ìä±ô©ÓÂ$A1]’'óÀŒÿ¹tñºp—Ÿ‰Q¡b®m L¶ål0I–>d«èM§ åwºf0þæ%ã=8c7XG?-ì¢ëÏõ'X¨m0RúÏìùŒ…c5ÍdX®M<…N .L3@w@‰ðº`}°-y`¯ 3ލ̶Œú1¿qŠNwgÀÎt©V¡Ä÷~O’%Yú+ìr£eyk£v!¶jîœÅ­D¶4±Í +?gøO•`']ëÂñ²go¼¯ÚG7EzÆ0LÖ`8°„ž¼úNÆ¡{~ïªeSéÌZ!ù…Nþ¼õ8-ãå­i‚éˆÛ–HN³òœ#jÍìO;ö ­¦Õ–@Ìæ·¤ûߤâ㓆¸+ôËQæ:7kYèÁOs4½&Ùæ ã¯£븣ÈUjTiY†m`T½€Å­¤G ¦+£åý À ]o9(_ü·9²súpº¯¬† rÏwÎÆ: ·yDVqœ­ÕÚ<µð§¥Î·Ëû®„q}ð(êú³Äne]BÚw8Àü3A`Aÿ”öÌúù`û("®MØ /Ð*»ƹÓTgP:]hœdÃùwû>E&u˜àS÷à¦Ûb·J²§€ÍÒ¸#³[6(j¹ » W•Râ‚ ˆs¨¥°­ ØåöÝæOÔ'ÄøÌçø–†{¿'P3¥òx\(ƒs‘R«\”“!ù@xìébˆôs¥b\+ã¾0ªƒ~„䔤äHqÍdדÞ#Ù~Ó¨»›Ciy-^ñ¥¨n‚©Áýa¤Xzgåy‚[^yõ¡vvÏñÔמ†BþòVÇÿıÈzÿØ0æí~‚­Ê…߉bXàCƒ OŠ…QHÜÅwn'~Ä<ˆ€Â wW)ñ˜oy5?2s—Ývûê¢\;Ê|/v·«?WÁôaùQXGèæ´ÆüDUnêÝ傆,ÏO@/ÒÖ)ú†Þ+HGº‡F°£»PÅ¡áÿð2ûøw\ã¢Ãò˜% Gc™óð‹„­¬Í[Ù[Ȱcù…ôD¤ŽDœøün†€ýåoõ¼6qŸœ¤ì¢!fn¾´cØÃáH5`JñvA³ HqßnæX J°C]£ ³Áè'Ð1 gΫà•cgh€„¨â;GóùÿCÏàüé÷ùIÖ4ÏÙÂÔjt³K'.… ÂÐiŒ3{N&xk“ô'Ÿ„Òš@¯L¶÷C*"Æ„ÑîÕ7'÷2P2²(NýÍa‘Å[úÛ”Æó/EžÚéK°2/2WÑh¬í®â «ÇPž7AµŠ ØŽòÅ v6»š:Ÿ›ªJûÿ7qO¢3û"‹½'”RW Á]´ÞÖt7@[ª¯¡³ZAöí,ErA¸Vø¦»¡‡$½D+ Û¹wë€4pSãÕw*2.F:ƦæÈ\Áã–öõÊŒ@’¥~uAŒºXá‘r‡8ûM{!dÍËK5PCî7›#‹W¸ÇâÝœmOˆ¦3Wá¥>=mujØ¢;Ø­ôñH+‚*ŒGï³óNŽÚéçγc$‚,ñÈ茓 ùl2Z&hþÙ¹òëÕ ¹âwŠ8 YUAfh-û6ž6‰êÜó¶9Z3Ô]ßw²t³yñk¬íÞÑ'WŹñþLÅðpA@¹5ïµåº4¾+y“<¯oñ«æ®äÔ+X¸J–Ë;‰aÉyöêC¾’Û¾ìÁž ï‘Þr$M6¶à$ì å…ˆi¶O0׿™ÑìDßµ ÷—®âëT&ŸM0UËâÿô/ŸÁ­$—)8’úlqÁ¥Oäùx×\`‡[}ÎdD+xÏü{jÂŒV ÓÿYÅ2}­sƹœkO—ƒ5#³±KE!qVò$™ÝL©äwÿóÓLÍ ¯°äçqßÉA¥±”,¼ÄnMTîʼcútPדèwÕ+kÁ.iœ0¬ÒÎo¶üX²È‰mTò§šDM-‚—ó‘;ôPÌ•9Ý">ù­…›f^5*ÿûä{ÐXvEÉûô¤†l9{O“Ä § ,ü ª.Ë“¼Úßr¶[2PO‹A]°C@åüàáP×Q¡ÇÉÉu˜IË$<ÛŸ[A5?Òƒ|÷Ùû¼­!}( ÁuF-¿¹,áwu8R'ëHe1¨á lÔðñr"‚¼oÙêéǾ½”`ýVR@6ÇRûG8n,°>s^Ûó¦¢#c=ÀËœwgâÉÿ‡8¢Ìgïê(€$Z£ÅЏ˜OÑÐR¨ˆ5C¸½WBôQŸ§§µ|u yín6ë‹°He-g„ýˆ@ûoˆó £¦ždšÉ#ãG*‰Æ™å@ݨƒÔï+éß Bê÷YC·ð¼>ç·£“xoäååEGè0ìÐÝJ)©(ØÝ ‡Y:+ÉD'ÅUsŒÎÐñºûh “GÛ©òd{ã&Mbà¥W'âÕœ·ª÷Ì{¾.¹ËÄõhXru¹MÉt `ø'ܸn2&àE>çq“Rrèlvþ†ïž¾MöX´KÙtЀ÷_˜“ ¾’ÛŸ×ÛUå óZÁòÒÿílžx:6`¹îïýÜ´Ì<¶šv‘C©uh¦Ç4å"éÉ6¬ŠX] ü~ꈬ¿Ë¢*ÇA²1p-’,Ä@‚ÛÄ `7· ÓLÀózÕ6ÊÊ}íÛ|2˜b±÷ß§äÿVVqÏ®¬`ñn‚|-ø9Ì\!GÙ ?m‰i¡SˆDÑÚ0†{ö»2EXõËKûoÉøj€,pÜÓWÂ6ús:Ñ»ŒÂHdM¡˜ˆÿ£ÉgÅÆ«È.ANr–D¡è=ÏõLV–Øx†À©vÿ”•%»Ë© …)öïé¶?,ÖMˆIa‹$CåúÖFüo1‡›¸‘ƒ |üö”“vÊ ¸OX¨‰(a'šÞéQôCÿ€‡ôã‡Ç Iôé¸äÍ÷ ðpo;²?™jxýò·¢ÄÀ‚4—«vLM¨çƒ'Øí†|Oê5:=%—?ú˜7åÌÔy1Ì¿÷ô‡æ¥é¨KM&Ÿ6é6-;§ jq9z¨~jAp¿kÔ–Ž[Vo£²>„Ÿš§§¾àG‡dÇYn™†ÊEÅt×ìPß“†³YÐ8V¡:Ñi>%‰—¶ÍúB9ºBÝÑÎæ5ãl0è}Ô*'ÃõÝ '©M‘l&Ïo24Ø3{uá7tš€•ùW™bZ„h#Òä^ÜFXœMö¬º¹—ÐU¶A.rw­~ã]š¦Ây®%­ˆÃžò¨Ãq\™Ÿ‚¡‹Í.@y±-¶m- ½\0º+-‡hÑt ½Ô«Å>ž(ryÉÅH²~ `åë¿T ¶6a95ýÀÔ!ØXr× ×¶‡fFøÛë€zÚä Ÿ[÷ SÒ«HèfäRû\Êý^'s®ì-ÖÙ‡ =¤îzšRcÌ¹Š„±&ˆý×ßÔ¶OYn­Ÿá5÷©ëßR¦¼Å~~ ¬üѰÑzåjpU­À¹VÝQ»þóJýüʧ ¡«?•%St:©‰`è¾7‚Ç/ N)ìšÏÏa!à×ÁXüH~™ð¥eWWޏ‡o*Wt®²”èÿy(mFß'îä¹~šUE£*ÿ•º²ð».ÀcÜdÐuzÌxݘ-ÉøÅçaN[XÈf Èš“ÎÉ?BK|¥¼)·C¡Œ€t4·ÓáÐ0o ¡µê+nÝ]!P䢜uðþAÞ4ìC™"+zfêV}R«æ—mió“y‰šÔÈ9Sé¯/:Ùh´V’Üu´\mŸëô’9 ×y±íýòzyÇ6¹TñVJ ž ~.{’>HjGCOŠÄŷǼúïQ—/q“¼ ð 5j²7£zÜvÑO¥ Ð É!Ã3Ì|·åuyL8e–Gï†f²Ñ¹>VÝÊþèbaåÆù¯+¦Ë…JãkËy·eYñ»tíÞ'A$”#È"ßgRå3ÙS3¿¬.Ž`ÔSônúÕ’ìÊåDÍCš–£ð¼€"¢y›GP–ö™XÚcd¢…s )èZÜu| A( îy„Q}C%OèG%5“ì€öÏpp¢Í$ô5•ˆ¥ž8pàÐTáj§É¾Zº¢‡E‹ú•æ›cÏa¬‹!'nN³yošv@ô‰¼X§5޾P0_+iµ|Æ´7ÙäBsÔ¬ö† ÿÍtд*¶#±YÒvÇLF ˆ`õÍ9¸î¦;úŒvGÊñw7 »o…•´-Ñ.Ñû¡0¯h{¸‹zý~K:²O•ïZZú¢ýßk»Y´n?¤ßͦ¾Wn LæVX¡*¼˜¯Ä«›+.ĉ2‰v¬ºõ~Á ʸ³`ï(82)Òé£'žÑŸ^§(!Õ.fóV5Y~wÌêÑovذ~Nè Ιu0—•S†uðÌ€<Å¡šŽv%ÐPoGá•ÓNó–?e£M:C>•©Õ{Œ!£Ÿ¡´â1ü³8 ÏBAçáZ,Ê)D• ¬^„žÀõœ7t`AŠç¤+ìʈ;öÂÖ2‡×Ws†j”ÀgÜh­šµo?¯ÔÊ *¸E‘Œ_<Ý"‰oƒ¥Íž¾ç …ì_í$Žiâ¹E³($óí­L'(À¹hQk"ë\Êi8¹P2«3©¦X«•ÀvØ‚5DФ¾=Ð7¨ Î.fv2~¡Æ/É ¸-@1”nyQ:´é±ÉÅÅT•X^ïdÆ¿léC8u®Juõ2,Nm™6þÆô¸é¶îkŒÿ_ÑAùÕßÊé˜y9ÿÁ A|šîHÌ’Šˆ†‰±Ä5 ¡8º¦ÑÍ|ŒÊÎÈ­“ʨpÇgÅV(q€²Z5‰[Ìâƒ. í!9ˆ°ÑÉOS³ñå™kíî*j=æƼQYÜûØ®‰[¡êRoûYþFÓ/öxÉ¥$E;Íû~„qÁuÏÒærUøÖõöÔ£sȈŠÔê°²%n­ßH‘TY,+áVo”½|)ßt–&uÃ&Oð;ÈãS!E¥FL÷“]÷ñòZ±abàçLÌò5ìe­ f’à'½>i³Yqfâf7ÑÄC¤g|ûº-|¤ÖAGÆÈõ?´ju ®æì!#>IRæ÷{ÞÆªáážç’9L4 v°X¬p7#S{_Ì«‚ó×ôXæüÝb(¥ÍMðz2Ò£Hù&Š©óßú7Ú›LîPLÍ4°®7a¹¤ô„äZ)mY¼(r'¦ž; Q¤àô…oúóÁJš`Œ¹kK îHòÃgöŽ¥  Øâ5)êÆµÆsºñÃxc $C5Ã`´ÏØ•É&Õ*>’(›z_/mÙÁ/$Þ ÖCµ¦ Èæ8‹¼nù³í“ÙÆ©nniz³·¢ïráyYâAAxvÕê­ÓPLíÜãIwUomÂ à ˜ˆ»Âí.O‘7ž€h‚#n-‹V®?Œ¸¤©šˆPîöRÅ|öx1†e2{!ê”—BYAì:+ékÌ$ fL ^FKîg"©¿<]'T*`3 tÒÞÐ 1CÑ*°ýipO™ù—âdÔ;MÔŠŒ„€Ù]‚Ú v@Ošwzí7=ÈÐøÚ=Ü;Ž\º¤%Ê'ʘVÝòéoÊ…Ÿ¦áRö"ö8ö›\@‘]¥§bKˆÔ>ßïíÔäR¸çêš>¹uZ<­­_4ÙÐ[ƒxb›Ð™^ìeý]׬Ä(ÒýÆ%W1öãj£‘±MÉ,»”ßJ–+L„ŠºUÝsúìù ðBÙ~–LÁðD4¾&º•20¡7Þfâ¶òhÁüáÈ5Nágúålˆ „Ýa´Ó®¿» ô•u—ž˜G˜ÀÇwlŠ'QeÙv½dIa÷¶ ]ÆZÃiø›Ô7š×.M·{‹=öniÚ»¢»Î\=ž¨Ûµ~â ÐóªKÈT 8s±Íû ®t͏ ¢é€•0šÂ˜…r‡‡uÝGËKˆÓ’!-á¬_zÌò£Èö @ëY€‘"BüúÍÇ/¤S¬¦¨ã,öÐýxü“ýß³ïÃU‡Á¥ÃSïXˆ&¡€…˜Í ‚ã¤Ñ+Ïrü•äxÇ87ƒ!ýqËÉpñâÜðE6Ù~=òì×øTàLiãe€j‡s*¡œñ"ki—_bvýËK–†³U½«ï‘¦Í“R¤Vª(E(¿Ÿ”3½Û¦4èÏþã^pvì3ËK-w±OZïÇ`KvPŸ{Ûe~üŽõÊ-RÂîH¢ ]Ž~õíóÉ/é_ Ve‰åñs¹‰Ô˜:ìÔ‚½Ã …p1Lïbá=5(óIo4)˜Ñ9/CùpÌ>ow c•m?ÔÇxS<Vc /¡b88”‚G9ÒµGБc‘¼ö‰z÷3®$ë¿q­±)…À>ìü˜rY® À]I»}3[[<ár‘£;‰Â6¾olS5{¿T…È&K/ë1xk27ÄUâÉêæûБ­öý3cIfXp!ˆHy½Wz!Yc” €^ þÝ0+4dÄíé†Ð ?h`°tÏÂý‰®q‹/ÕìØ±a‰1ã—cÿ ÝÝ n~@jhn¾w$1ÊI¶c)ÊRZÑÍ'†ì@µó&a²‰.:^‚†¯óq¶/3>ZØO„cœI{\;§Ö‘ˆ{¨õAÒ dœba‘ñ7Îò%·«#xïÌw3"q\(Í=Bü•G©1 b¾]R)0o09öþ4aÁ£ ¹Bÿ¼×[ù_Â:‚…#û ól£·¥ä«{h¹¸èP‘£”@žD½…<½rƒ¡Š ²[˜À<-ô¤ŸdZ“tã$§UX»wâ¾5³»¦ØQ6²'õ\qô Å9Ó g¸w v–µêÍZ-¥ÕÊÚÁ/–D{†´+ØÕÍ]œÕóñ•„6{ ä<…µ\¶°®é}r™„æuË GÀš;"ÁR­ 3 vë>í1E'¨'ÐŒ˜¬4opxíD+þÑJÅÇæ/hž4`&¸ë¡-òÂa‡S¸Ö`Ö«Ðq¯ÉîqM·¢Ä†ëèÝ‘·`áÙ,VcnÄu2Î*"G9û[–»Zî¶ØÐ¢ÒË%8‚[2r¦W3Tüv‰ø¶recñ"`us×ÚÜrß²ÿ®¸…Œ³þ=kEt´ìO#•—·9"eƒ0g—ÁÄmcÖø©·1ÑtÞ±¬«CeÊ_SèÝxáor0I)S’Ô¼¤3…ÕyT\7µf` þ\T|-Á/kŸŠÙF¾±3â(¿ô§b£"°7mA @¡Ðí%*8õÉbuz _±ËStÐU3hG‹}hòç8b^^}÷æêþÕ|2bß³;§Ì±ßÁ'‰ñ±K¨òlH?ªÔåF¶Ü"å®Áî\üŽâǯ:Ã+r;Äó×$ô62-?ˆ/žEßíê±kUB?dû›nŸs\±8ŠÄaÐÞXΚçNê¥k9CÖ·­ïOÞ(I2¦ŽcT¨·É»,/µ¯RÁ1u`¦ÎÁ]'0©†4~sÅÇ(¬Zä †’0GdGüŽ(¬ë‚G‡!Y#³Î_ o(˨ƒ0I9sôAEáE¬!P1å™oÒS®×ôMœkàG;è´yêå/™H4º½ºRÏÞÀašN›s?»®~Õb0ûÆ#B ¬±ðª/$É~®“ÜýO=PcÒʤ¦. = ³¶̦<à#9eê*0QÍ£®¾rжî:—Ϊ†>J -â"óFÉw윑NŠEÈÊ¡Ù&°‰Ö aÙÙ sç!ä‘ß%tŠkŠÄ5¹1z—s­¨•çŸ%«íO=ãTqUPØ7Ç &rÊD›üøŠëHž_$u„¹=ð;Ø®†6šS³¼rËžªYA®Âí<4›‚½û‚úÔ­(YÚÙ:°®à–µc¦àw˜¤§}¡Žmêr±¬gFýÏ;÷‘ØoÈûù…tø i¦ ×HkG‚‰û ·U|¤Ò7h/Üú‹8üÛ}‹˜‚¬ü®—Å'¼ŠŠ©f…}å²°¤È ÐÓ^ÜÿFFz÷À_€3G‚Uôsƒ1ZEIx­¯ç¾’  ˜”|cBjìÜý”`Ôè 7fy±íŸ4*_Pv¸4ab<¶æ'Z^VØ`žýj‰¼w(xï'5èèbÌò„I9MØ“Æôî(òZÖj¤ËÎG “mõëFyxzÉ^0`µT&®#TÝKŒV}ÚY×F›-î† —BÊÑ$Œ¨} ÿ†À‹A`ͧJŸZ¯Þ½~.Ô¸}»K@Ä LTR–YÿÈjÍç'Wº¤ å§ñåßû`vo ²E±´FqÒÈ@y8cçÃ^Ñ/Á)vaûšqþM#Ò l^—Y®½‰ü­ìƒÓ®ŠÂ¥ ?üh–œÁ]m™c#t’åÛ´ÃW È­!/RmÌú;äÇu÷ˆWHà ŠÅþöÄ}Å®—ŠúïpY(P‚?{íM¶Úwô’H°£ÂPM ëBc.„ÎXgºF×¼§!Øjöãšú­€-ôïlfÈ—£R…p× H?غ¹ÈŒöÀËÖ0¹ð3…–`~ÓÜáKËmжåšV{Ü·$ÞwÊ©òò<Ëš¬ó :û®&Ê_Âs(§¨Ìô¬rXõáF•ež°éPЩdBå‚9T¬ -ËU¨¨{Ìmጴ¿¥À·M‚{Î/rÛŠC ;£³³Öôñô  K{¯¦ÿ+otŸE{µ$¾³W¡n¿=(÷…y7êȈ@ìe|Š€-fÅú; € ÑÕû¹?vu·=F”åbkþÍOÓá åæÌÐx×î ¼¼Î "#¬X¨ÃndIúþ7†:+ò¸lùöÐcy—Ÿ5ºåa—k¶Àù°x‘‘çiAp8Ö¿½­Åãw!ÉIë‰Sø’"Òù4ÉdªX&SíH-ÑfDÆáû‹¼~”øÓʧ;f3–·fgÈþ»_TÊÏô‘)N?5È•ºgW¢…˜TcѦo§ò=®k‰Š»ÇØôÅoLÓ‡>NL âDM~îNºÉçöÖ-¥Ì¶{‹È?x­ƒáÌó_¤ñíLîá‘ÜZrNS69‰6 ºa€g»7lÜÜ‚LêÜ›œ:,KâþÔ£…ÀÖ"Gñ¥Î†ÊCy—h𨰼´|tU¿Œä36U™BPåä§)B ïc ù.àÒd1Ø>Ÿ·’Ÿ¦üîj.D5Ü`úš¤õ„ö“GXq°ßd±DT}÷Ù·ùêˆq‡¡Ú…ŒJØ(0g 5¥*.ž¶²3yÑ!NÈO…#nvÆc \Nh]×ÇKÔ§1&\ï/ãËWž;h‚ózÁîs¸ó(¬2>UûÖž¾ííeîÃÅ|) :š{?ᣮ©Vü¹+hÿ¦“f­ä ^?þƒ:d¦,G¢ÖB°Ý´õñ‰ø&;MïïB!ž•©Tƒ3‰ðj8ÍI@ ¬ÌwG÷¢SÖ¹1B´Ž¶ çÐ俉ò£RÜÓ¿B)Ç’¯Àé¹›uåÂÝO±ï¯”ÑúªØošÌ”ÀÈòà*e¾ßè¾%X­QžÀ¹ l»«ÞŒNòt#Û& þÃÙeäj ŽvBQ|Ý.Ý‚TɧrÉMü¨ñÖ”éGÃÂ.(»10e‘xÆR% uÀɀɔš‘ä êk–$ÔQM 5Ñ?ؤ¿?FÓZ©Ä½/¯ëmB‡øÒ89ÍÞ,#|Yœ]ÌYQ%‘/Ô­7-Xjþá æ,ð¹Ýâè~t*LÖP/iÈ,z %h„»ú-JÚ—WÍ»µYIsd5"ÓuÊ­çž|›šç=F +ØÒNq'¶Gßp—]jÎQ¥1&ýyžáùjfö’<ƒeÁVÌã¤Ä˜$vÿœÙäjÄ^°´ò9è§æÙJÏá_d‚#ÄGԴʶÄܪ,ˆÙ 4äÇ8ÛV*ŠòÀ°êâÀc0µ B Å›Ë÷7'xØ®>ÂÉ”{¼6• P¯¹+uzT:á)¤oˆbI'TLj)¤¶úû ÿ—d&æ1ÀÓë]Žn8BaPFP endstream endobj 2551 0 obj << /Length1 1551 /Length2 7954 /Length3 0 /Length 8992 /Filter /FlateDecode >> stream xÚ´T”]6,ÒH Ý0twwwÇCÌÀ0tIJ§€t§4HH— HIƒ -H}èó¼Ïÿ¿Ö÷­Yëžs®g_û\û0ÐhérHÛAm@ Pœƒ›(U×¼œ@ &ƒîú Åd0Á<ÀPˆÈØea kø#&g tS‡B*ž.n^·€· à…ÿ光䬽ÀvuN€ òÀd…ºùÂÀŽðÇSþµ0Û²¸……Ùÿ„¤]A0°­5 n w¹>žhkíÐ…Ú‚ApßÿJÁ,懻‰pqy{{sZ»zpBa,ìo0Ü òÁ¼@v€ßtÖ® ?Ä81zŽ`¿`]¨=ÜÛ<.`[Äã1Àb‚Ïè*«4Ý@¿œÕþr`üÝ7'÷?éþŽþ ùlmk uu³†ø‚!{°  © Æ ÷³¬!v¿­]< ñÖ^Ö`k›G‡?…[¤µÖüþfça »Á=8=À.¿rýNóØdyˆ,ÔÕ{`þ®O Ù>vÝ—ëϵ:C Þÿ¿Öö`ˆýo vžn\ú°»'HYîoGóߘà‚Â<;äcëÈõ;¹ž¯è‘û7üX ¿Ô `ÿH¶=þaú{X{p˜'(Ðÿ? ÿ½Ã俨má‚ùïì0Èþ¯ýãÍÃÀ>Sà£ð¸Àß¿VæÚ²ƒB\|ÿíþçr¹”ŒÔô ØþþÇ$#õøsð 8xøn ¯@ðqøßYþáÿ/îP-kðßµÿQbÿEá±wÿ¢áõ·&˜ÿÀŸ }Ô1ÀüoÙ›ù¶îÿgñÿ ùÿÓüï,ÿÙÿo= ž..¬Ì¿Íÿ«µ+ØÅ÷oû£Š=á¡}œ Èÿº‚þbuØÓõ­ÊpëÇɆ8¸üÓD°‡Ød§†Û:þ% ÝÁcz0¤õÿ~fÜ@àÿØgÍÖùñ)ñx¼©?&Ðã(ý÷‘ò[¨Ýï™ãáXÃ`Ö¾˜ÿ¸ãøs?§Èç®\œ(ü1ðH/`…aþ¾O>>×ãàºZÿ†ÿ i¸þ"ù à²?Šý€ç€zÂþ ¸ õþð ¸ ÿ±¬†Ëäõø¶üƒ<ìñ¨úöÜ.¸# ô1ÀGÄúïœB.?ì/࿚`ë ƒ=> DúØ¡íÿ¼B Èsñ3ÔV4Ü©1¼óª^šÜ›c{B|†aÛð5 ‡ÿ"¬ËóZK]Nè:ì§tÚhÞÊWyæ ©%ê;ÿƒöf´—ïRµ;nn-“u¦¶;0>M–H7 RbPpèIíܹ„8#µ#t«0¸{ áh\y(ú4 V-G~ÞÖÞ©Pź­šæˆ×3 )Ÿe(´É#¥E…sP¢³âŸøàÎ^üœÁÏŸ| VIfà <Œç-õ7ù“p=ç·Z­ÇãÑCFOfBJ‰t?>Åè/³›®B2ï_Qº2´àÓ.VJÿ”=c…s—'»¬ iíoð_|ϽUg""ØJm¨l%´„ÑjÕuXÆÀxA”»ïíeV;ôÚ;eP, O7=æiRžæE{\5éÁæ-Ì/Qñþþ±ä(ùµ²*±ÓÆ=™á-ÉòóCNg/Ù±qCËUþ†ør‡eC“‹ ßš·A+æ4ª´>#ýà ÑS0ÏC•ÙÒ8I…K×*¹$îÑO$JNe,Чìq˜ÄxÞ'Û$o¥PèÖ úç"Kpµ;¯ïXwmŽ¾×ª¡u:í IY!… 4Å_¢#Ê0uÛI޶ĵÄB;:-"Ú3F;Z$üI3Ú~ãñéÙµgÐÊ<2W”:ˆZ–‡Í?ù³).=kóa@éÍJ¤3Knk½Ü¯ÃáQl^Ùé˜W1úé]¨rÞc×'{©\IýiS1)ÕÅ‚Hž¯tyν:V'B±ƒ¢v|á?ÇTíh?lÛÓ˜äNFHrî· —_è¹¾-’¹sÙQ:Ï)“×7 7Qm¬´Ò>÷e±Z›"Y¹r°‘)(g”Âô9†T‚Èc}.Žø"UŽkž&ú÷.W7]¦f¥= ßÜ£¿oÞ>}­)¥~SU,i–=†ÊL®F¼Y™…îÇ<÷\UCå6ÕjàMÉtàgC¶¢Riôx-r<½¸lÚA«ŽÎ•TÏ9 ÌbÝc#©¬à™ö{ååVM.Úô¬VL8·(½KèÈøÃÓA@Báç7ºB¶¢Àù¥7WDLC e:º¥Ä3Zco3­_*\ìÕ£1¿Êm$mþ‰C‡ÓÞS¾JX½Ü^µ Ã<¥LÁˆ&Õ÷,çëÇ-êÀhŽ×"þÛ¾ÒOèÛ\E®C£™>–Í”8Y˜í? ¼“øêq÷ ”>â0¸á‡Bþòv•ë•çI+‚p‹g`J)(ù­²/ʤÛL‹=e‚Ý7Ê‘y m®O3ÂÕbù8ÓVß{ŸZZ…gºŠ.ñy&YÛ’"ûÀjhºWÑÕd°e{:“#U•ÛOЃ¦OuÚ^û‰9ë¹tÇK’ål˜ÓܬfÎ/K´¶¯}½¦Š_h wU<á$.AÁÝüJÙUøÕ c¡~á3"]ãí1(èÙöH#Æ|÷.6P±Lp×-)rÈyºS ØÓ°*4O'ê¾ÒOá¯{S%~\"2<ÇQI¾:ëGE-€›œKŠì°‚ϨýµÞDÙô­˜aš•d }4ˆÀ•fKkaâàHN<ìl"'Ãë~e˜vgëbs w‰¸½a¼"„Hc×ÓĤE2WMÇMûèGg±ãUmù'ÑíÛssóÊÛdÛµ7ˆx6«dÖèlrãUêw‹¢ŒKOƒ/«ÅWHâù¬u%fÁEûauy¨gö7ë™é½®£_Ht̼U¼0&uÜ~ÖŸn3E~8‹`FÅëãîÛZë7EÖ>n¤fظ}‘_d;">«A¶µ3ºGÈ}“­F`o©z®Úrt¼p— Â‰àxÜçK»äZÛCcI·Tîc3}鯝azϪãë‘ñŠþ@Ćë¨I `œ)ýAõ2¿}ÅâzÐkÁÚêKŒkô ‰–ÞJæ„qlRBíAŒè ÊvE™ÉYRûœ!—è‡6ñOÅ{Oâîš‚«Kßa»ÑÈD$´¼KL‡2€Á÷i]zBè}^ì Œþ ´Ê´Zžú.ØÓeìÀïy{ù›Ã_«Š÷Ñæ=÷ÑwP W|óp•,,Bó²“$_ÐÆ I7ôG"$Ľ_S½Çw´l®7œ]qßùØ·ÂlX¹ÎBh{Ηâ‘h¹ö>÷ m5×þ¨ ûשâ*Ô¯»~YyÛ;ï BûŠ]Þ^‘- Y¶£(V89MúÈ*èUÒvr{Qä2f¤Hʽ2,//z7 /@¶Gwp¸E½\ûŠæ1±ªJéJ™ˆècz1LÃi"ë°*½\M=~t.&ì5I%ÇÁÒðW[a«—è¿+=cCêÿ˜ž~Ñ&¢Ÿ0öåÀñǘXù*|i!±Ô‰[;¯–ƒ703­˜zE“PדÜ™õßÊŸým0³A˧ŽoÔëeìK^ÍÝýáÔ4l³ŸMÌËΙh /Á} ua¯Ê‡Ï4Äå|Ûy­ÔH܉µSÉ"r–UQeíWwf…¶$Þ¬–ÕºzO—+†‰zˆuŒs°÷”…¢ÃÑŠ$®¹ÇÁT£†uýÊ’CáƒM#e<ä‘}i'Æ¢¾3¡PâëÅòw 7ˆNÑ„àomæ¥5†7Úµ}¾–ÝdªÜC–RDJþV>!ßð}Îê1-Ì•[áÑÇÔÙ ±Qü® ù ŠËàQ2W0¯ØÏû9lëÅ=ðCz©ÆÅÎuùý—¦{„< eiâåSq¦#YD”)œ ¡Š¸hœ¹äÜmpUhÛ;#“Ù•UÂtàJQx·¹þ¸×–ÓFPe11°æ} ¡îfù’¹*AŸä‚qtl"|0¬l ÁoYO¢êÓš0ZŸPf@eXó £p‰hRtÃögË&î×­ Ø’hÂ×µÑåŽþßâ…ežaªq×^ÔøB™µI“é™óõæ¼5tûˆìš*eBAÇ´qß'Ûç†û5¡Ì>»›²ëG¯:Pùµ¨@X¸ŒP—NR`ʇK¦ž§­ ÁÆ¿& :4 ‡!à ±áç.C«8èNyâ¢>ßãîjγ?ôñân³ .Ò(žÁ;ìUÌÉ"˜Ñ/>ðø¯°€aÜñB\év9ƃ#ÆÜÒbú×ó¯Æ÷ôïÏ¿ÂÚZ,8ÔÙb&VŸØ|mr rYNöæçÄén¶ÆÓëBO”úÌRò¦Ÿ ¿€æ=ž¥“0Æ\£ ©õS³`Á:qùèïB/ij$†ÝÛ•Â<=j烙xEû†’’SÆòtv4àÌ$ L\Ú*ì˜Ï5qÞYáKgÄBŸùØŒ~—z>•­É¬’°ÚvÞESL v´¶µáŸ x7ë O¶˜g1KÒµv¡Ð}¬>¹z"øq9’@nΑ.ç9BzÛFõèü¡‘øòR©8ÛÔ8êÚˆ ¬T>Iw‰­XšÃmÁl&YIìF‘H7*3æ3˜¢Aƒ2ò‡·Ž¼ÃÊëp¹Ó,ÃI ¯0_ÎuÏ„ŸhG{Øxu`ÂÉ£¦ú;è%|Å86¾ÅTËuS¯(ɼ¹7NÕ:ÆÅÕ·µºŠâ0åúùYRw€DáZ“O¾"83¸v¨¿ž£Ÿºo¿¸Z4ß)ƒûÉç®Æµ´£ÿ}äÒ¬ef$J¹\‰ŽõÅüÕ:„¬w‚uNü q³Îk=mç.åpx÷ËEÙ<|Ÿòã7ÚN,zçºQ@¢§SH€â5k«jÆ)ܧu׆èsï´ b*£ÁçRÍ vÙ^Ü©_ã± K¦iNñÚ*?ãמ{J3:)ër‡$¤[z|þ zG´°IÑÏÔ®/ô}*Y2·uÊÜì1XÆÒ”z 8îà©DRt…&ÀÛ¸$*#KRÆPò—X²íEÔü)ûþ¥0ißIO0ÝäÙ…ÐcœH«&#B‚˜6·¥ÛKçÁ¦!1™—CŒ_d—’Õ­îßp„··ëÉD­®â]ßbÆ“¾JȰÕq(bNÍâãPømä\L× Ûð:rœö$T¶=O™uV*¾|Ê|Ù¯~sœ#¦¯PÿéhýmåB‡€-|€ù¬gŒª§ UÛu/ÅÕ£ƒ yà]¸…öe’‚HÍ’£÷=8úÙBswOÓÄûo®Wþûg%É·_ˆ¢”yE'ù6Î=Ø>ílG“æöfö.Ùi{`ït:GQFXê²…ùÆ"¤Ô—EœJø/ŸPË•ªò" rPø0ÉF$E±'ÛÐPTâ(Ù«IOݹ‡}ûLñ®YZu?xBžù²´ ‹¹Zj*,8ŽU’^—/kñM›F¹ ¿œ„XÛ %§þ$3f;Τñß6†gi.I/²dNt]&.£GÁæTa®.-Yè<˜b”ÿ6C™2YZ `w‘ÌÚšåÜK7û¥{¼ñóùö"r¢±²ç¡/©‘G$Õ8weO÷Ù§D‘E”Z»ºoîçô*U(¿ j[þ2îÆÌÈÒÞÚßË,ÁbŽÂ/~€ß“Žñ7ºéÆ¡¾é•mj,pÁ EöÙ¢šëÌøûÉ6 ½|'é«ùN÷3çÛ=:«[ÖæPÖŠZMØÇy,nŽÆNEk/md´ìÄê¾–ZL'°ÏÐàözÍm».`©Ð$7°ŠÕ6pé6"Žô!Š« Qš.ëðnü’æaÓ³; Ýôz¢ €!‘bú·pbÆDC#TŽœòkß7jGR¢¸âjüÕoüÓ±œü̪¿ˆf$ØÐ"ÃØø:|ç¤*ˆÖPr>ÉÌ›S·u¾ºÀ¨¦ä°º}—ý*ùôc2Mi9G@å…Ž:LÃŽþ™SüåïZÐóüw5ñGÌ œVœ?<…÷¤bZ‘žŽGåíþlN„po;p!~SË Ü//è ×®[„kšõˆ÷‹‘¤Þ}Þšž¬ÃW8ÎO|lcr3 Šg{…«•úÜ…êyFK&ŸñžMüø1<—}^Æ¢›…Ê6B"ňÛ“l60eÞ“kc¸^HS¤±Vê¶HdÝ L±OìtI\…tÌ`ÊËÅc7»¡íÊÂDNëÏ(ŸmÏjã!‹o=IÞ%ÜÏ5|KŽD,äO•ì*«¿Ð*Úª ¿'ÿškZc²^…ÿÌi(«9ÀI›zdGVŒÈ4¹pLÝÚþ%áNp¿üFGÎogxû×àÝ+«Ã‘ERŠí¤$²mà¦6lâÀ±ïú$ì:éU]WÆ7òQ«4}Ž9±Ov7Xh¬øO£?Z(¼“³¼6Úú€-ò’ççË07ŒÓ¼‡ÄòÕ/»¾7O‹—˜¾•Ý ø# o•6ke«–wKqR}15úY­;öÔª%BŸ´ÐPìÙ _uÒrÃTŸiEvlÖ^æ1•S:;–¶_ ¿ŸQ |>“4žÕç8MIq˹âfE§-?LÙ–ç«Z(Eëß_ô}çw¨ùBœÀ`jוããq¯—N“”ß`†˜Yöƒ ‘VÒ°OÒ%ìð’8ÈyèP¿™}+ҜݵxÐǪó?‡ÛHÛZÚj5ö]No%U8?¡£wèu;V´FÇ1ô«/rŸ¾ÍóòYVô ¬~Q*À/“cÁÖoêÒûé’VaݬŒG‰W½GÍ ·ƒe«!”¿Ø9èMŸ˜±,Cvãjü©z]gü3W+ÿ·",aú¿)ø1ñSôïòû]s'ƒEøvªd¨emŸ¬;/T£Ú•–2ÙÏ"ðå£("í® ºW•kï¸9Ü7%ßOÝ÷4DÓ½ˆW$Ž¿ ;ÜÌc¹ªÂ{ç}'*[è3ÍÚ3Û“ÏœºìôÚ~Á6Ì X¹WPë6^TgÕ1»ì›mÿº¿ÐŒãØm‰°,ù[ðg"ïe÷L‘ê² Àíѹƒ Êëþµ‚AZN£LžWÕq÷ÔI²AòÛ»‡tlÅ Íï/߈‘B[´Ÿ#îìm§Ö¿ÿ˜…g*ý?PXõ„gsAÀÉwýÒ*±ÄoVrOsÛêQ ->àœVÖ õ)ô[f~[ö4Š’µ VzÕ>~W#¢;ÄDR¢¾§Hû4›PŠwÁÛäChÔ9¥ü¦¿UÅäá'¿AŽë%£Ð«,ô1æó¼1öÁ¹&dý°oCl©wÃ]9$ü5U‡õÍй&(õ$ÓImý x`±l." §ßË’5Éëm<â2aûËŠ‘OŽVVd¾'èǃíô™ v±øiY/”(÷ ™ÞY¬ipg´p‹žjž‰£×Ñ +r r†ÿTVrú°ßøÙAáçDeÎy£¤;¡žã¼Þø nê+êuSG)î|¥Êb$¯#V€G(XzO¹š¶È³Iˆ¾¯¨Z"ÑÎ8ijâé$9jÕ£â“ù¯VˆA‚cÖüi4d3äG>&Ûh½ PmÀþfîáÇI]7þ¾/Ëäðe’É<ê·Ø³t‡®­5îçËù&3£Åy"0½®B•HÅŠûGüHx^ÒK¥‰ ó+v•P…Jnq¤L[ìePÚW&– xrøî™Rëá÷c]úa'W¥{Ô(ÕÜUªëÿ7Uç,AÕ$§ {ô§¿â9ª@ydÉú¸¯30¸µ¥—ùBGD©‡òD±[.39n4Û£Ë-ˆ+®YÙÍ–…%”Ôõ xX±¦×š\‘¨ÊwÌ;1±–<}?ñr)îü^l²öà‹ªL¾ò=*êî•Ê9®›´B˜½Ù{ʘQ3ŠÍÓ›’†ÝÀ²2XÓˆ½±¨®'sáîKEùp™½ÈbŸ?”/ÈÙZßy½qrN"÷ÊêÖ‘ÿ~@DYƒiPíÆ÷ìþ ËÊ«‰’úmߘ%Ÿ ùê'g|×H{US@¶L\ ²Ü–Ãa±Ë M°kÎÎqùVtÎÃáÆ™Ž‰Ok­µ«¬áù³ñÑéÙɞ˜1âmç­–ßñÞݽ°kÛ•°Pr"âùQÁ]r*¥¦`„]KÖûZl–»åltF9 Q».¡+ƒ¡ýýQ†–á'®O‡Fj‹mØ)lcØÔäIé7k¼QtzU·IÜ9Ë¿xEæ•V˜±½/IJ ¢É͆ÅMò‡L®CÄ<Èé©äŽÎF6U]’“\Âzu&XË]x„Y²åÏ;Ó.…ÕâNéñw³‰>x)àÁÉ&y&z¿£þdrQ¥¬‹}I‚Êc³Š-ýJ JL¸iÎò!„.’d‡e·€°¹|ã]¹ábfºsîÐè7‘+øʪհ½˜Î0ÇåÔÉÁ2GO…¾…(†„OÅ@D<¢s®½õp™ƒ$éÖÇì]qTŠûóóÁJT–šÃ¼ ¿Ü‘\i¼NQn1Å„‘ }D‡wçÄdOTæPC™l«<öó3žÓ ‚ëª+9JV (PoÀ°&×¹õ/Ý/cèÉ’¸~ÀL¬sŸœºJQ¼£)`Þ‚Ž–!”ZŸØÚ*-¨3ôQlP»˜û”Âð¾viâJ"ý4'5X¶²qR3â¿ÅSlª¾÷Ûûþ’áPíaÕȧ gK+gzïØ/¯)ÉÿFA’·™_x#yµ_ý§€)=ž ^Œ< Èc½yçë™·•[Á„!Už¾|Ò~¤[Ñe‘ ™,IÑ|¢`çÀsô…úÞ™4Õü ö6RŸêš‘7ÓûæÊ/M4//L<²ÓU2ø0>åÞa Vâ ú†ÐI|½\s—$Ûu¨á°G Ÿ©~⌠ŒíâHnmOëôI5†Œ=¹‰É—ÆÙºæaÓsùAº½ep›\ë§É¹ÿyzÐÎýÛ¬sgyž%>P¡éÍB”w"W/UÕaŠ„ó$’D¸¡=µRöá÷¥Ú±äÌõMÌ£Bí–uæWƒ„-¾’gˆ£²¨„²ºˆºƒûyˆï•´‹ÂKÜ|èÊÇø <‹š©Ï©ÞuÔr Zþäb§£±òÿ†c˯3Wy’\ñôò%%[å³1óÿšµU endstream endobj 2553 0 obj << /Length1 2270 /Length2 18260 /Length3 0 /Length 19586 /Filter /FlateDecode >> stream xÚŒ÷P]ÛÒ† ww°€ÜÝÝÝ%8,îÜÝ5www‡à.ÁÝ à²÷‘ìóýÕ½Ȩe¼£Ç잣 'QT¡2ÅA¶NtLôŒÜ9Y&F## =##3<9¹ª…“5ð?vxru ƒ£È–û"@C§w›¨¡Ó{ È íl `b0±s3qp32˜¹þràˆºX˜äèÒ [ #<¹ÈÎÝÁÂÌÜé]ç?Jc*íßé! ƒ…±¡-@ÎÐÉhó®hlh P[Üÿg J^s'';nWWWzCGzƒ?-ÀÕÂÉ  t:¸M• 7´þ»4zxr€ª¹…ã¿* S'WC àÝ`ma ´u|Oq¶5:ÞÕ*R²; í¿‚eÿ@ ø÷á˜è™þ»Ü¿³ÿZÈÂöïdCcc¡­»…­ÀÔÂP—¥wrs¢ÚšühhízÏ7t1´°64zø{ë†q!%€á{…ÿ®ÏÑØÁÂÎÉ‘ÞÑÂú¯þZæý˜ÅlMD@66@['Gø¿ö'já4~?ww†¿\+[«­çÈÔÂÖÄô¯2LœíÔl-ìR¢ÿŽy7Áÿ±™lŒŒŒ\œ =èflÎ𗀪»ðo'Ó_æ÷¼=í@vÓ÷2€Þ¦À÷?𞎆.@€“ƒ3ÐÛóŸŽÿ%x&&€‰…±Àhfa ÿgõw3Ðô_üþþ,Ü_ßÛ Àø×ÏŸtß;Ìdkíþ'üïWÌ ª©® -Fóï’ÿë¹<騙tÌlŒ&&fÇûƒ÷ÿ®óßøOõ[ -þ½»¬(ek pý«ˆ÷ÓûO!.ÿî Ê àäAïý PþiF6Fã÷_LÿŸ‡àï”ÿ½ÿ×*ÿ¯íÿw$îlmý·Ÿò_ÿ?~C k÷G¼÷³³ÓûlÈÞ'Äöÿ†jÿ5Ðr@ g›ÿë•r2|Ÿ![³÷>§ã¢geÿ—ÙÂQÜ h¢hádlþ¯VúÏ»x—°¶°*‚-þúìè˜ÿï}òŒ­Þ?-Žïoìoð}°þWVÌÖdò×2³±  ÝáßàØžLï£jtû»Ã ô¶ §÷À{‰ÞSü_ï• À ô—é_Ä`þC‘?Ä `ýC\±ÿ#€Aü1$þ3€Aò±¤þлºÌzW—ýCïêrè]]þ½«+ü—8ßÕÿлžòz×SùC¬ï#ô‡ÞÕÕþлºúzW×øCïêšè]]ë¿Äõ®®ý‡Þó ÿÐ{žÑz?#Cc+àûUdêôÇÎò_û¿f濎w!ãÿÒ_íÁ`ò|_ø|¯ÛôþEÿE¶¿äìððwQ³àûɘÿYßOÆÜÝÎüýføñn³ø¾—å?ð½n«à{áÖÿÀ÷Blþàû§‹á+¿,@´ßc߯Ó¸ß÷n÷Çýžk÷~£Ùþϲ2ýÛú¿ÈÄô^Ö?Šfz¯Áñø^ßà÷cprýÃý^“ó?ð½&—àû>]ÿqÞïÙnÿÀ÷ ¹ÿÙÞ{ªÐá_kÿÏü;;¼ïÚéïïìûpÿ‡ÿ¾N@7 1üòȘ'в6°ý¡ZˆÀ•no’™ið:üVcW Ïå@É_„÷ñ†%/bI¨{n?âñ'ú sñ[“•&6£•Þ¦WZ7ör};”©Ñ­×:ßÓ‰£¬3ó¾LW—¶‹­‰öE³ò°ë­à,­ýÕÞ|æ‘ïçæÊû ó ŠÆSzDðɨ\NNDðÀ¡ÌŽJá¡Ù¹N©OŽ×‚“g „âGicÌlÛƒ+¥´`[iÇÇHv2·™Çü©‡½ìø2S€YòÝ^1ÜçXJÿÛö@?J#Çq2ž,©Ý©kÉëó,ÍzÔ·é˜GYZT„z. =Û…6MÌn–]¹89«ˆ‹{¬!IÖeƒyHX…;5­ÖHÁunË£Ð'Ý&/–„‹Ö~mµ€*& ÿÆ™ÕrÅÉ™I!¹Šb‹”p†|¤ "¦¥L-ÞŠ‘“Û!Plå; £æç%¡¾.á[u˜¬/’E#~>!RZ‘|cR0 ø'ãHñÁ[S*É ’ž1Õ/ÀùÅ!÷Æ:Ý.DºÍof¨Ài’úVbhÒP7$ôþAŸ6ý¦i‡…Dg½5àP¿E­Qu+XîÏUKå·^”ãâA w½«–³Oïžr“™[´óÃùÕXÑÎØúœÙPè»é^Špoæw…ûÒNN¹YŽðteE\¿Vk–“¥2#_VÁ™V;$6?»?nV+ëÇ™lo_nÞ¡™ |*)’±‡˜RÁ «ÚôtÔø¡Ü-È`’¦ìŽßüàk¿hŸ$L"q aÅL%¼UñïÕ’À²„ή­n ¨J_39¹dxV PÃÜFqÏz¬ŸU¼½˜ÔyV¹`ÏŠGþÖqÈÈü Ð_v»‰CÙâ}œÐÆú²NÕK[EžƒÁ0›rý¢l~|ÐY"Ц 3 r;OŒv ‰=?­9Ô42è+³JŽ9€Ûªf†º|[ æo]'àzŽ)v¥¤´WŠpŠ…µ†~kG‡–îÄßõËÞS~³ñÁÍòÇtElzÓ[N×OZÙo/‘Æ‘Ç¢Û ãcþͪ‡Û¡åÎn”-/=(¯ªÇþ¢’Ùã…£Q6Äïh §QJ—p2Ëy“€záˆ~·(0„Ù/¦ã*ÿb9èØÄðE¤rþ-á~·À¶ BÄ$ÞÍ´®rÒT´°0 –rD>úx1ZA–†Ö 0¼®6 oA“æ0¯šµd2Ÿ4”&žu®‘Z,¾znÛ˜«+?Õc¨$yÔ¾=‹¸ÁöJ)FzšFÜÛÔµ3Ð`ÂZ\ , ÑZ&õH…œ‡¥ïÇ!ää•‚u)°|CØ žYìûñ“ø«)=·ÆO™ŒÎÇ×:aã´‹ ž„Òéõ+¼–hvŽƒí¹™í@/9›å€Ó ëzo”Ží7£H+yU­{, pÂï¦g”ýKRæßüÜN)¦@7–xdÛªÒà C`mç»å%Ö´›b_ú2 fñëä«CàýtQ莟 »žÆpBìómú´’ñLÌ¢“’¶×š^áØH|cO5Ò§À»·|° 7n‚W2”^6‘óÃAõ1åü†Ê0H/øhçŽàr: $&>1¿"øy¨/µ£5_v È´ ³À4uc1¼Q¼"P\ßÇ|ÚT¹d²ùå|ÉÃö¨Ò›F¡—|ø ĉ=‚Å ÑfI&Â)φ½yž \áêé8)™a"À&oB©Ê‘ž³?ž½K’=–0uê8§‰;!Ìkû8[‡qe\‰Ñó»ÀOÉà¯ZŒ‹!SƒÔÝ@]¾4&ákI‰;·-> å2Ôªê%­[ß^§1ˆžÐà6ÎÑ ½ãVUÈEÐBî­4€æÈ.ãZ—òìh)Š÷ ÷Œp)')äF ‚¾€±nMU­[è?T®hüŠ¡¾DÛ/ù–ÀÛ•éhû)] ˈþêêņ)R+Ú@›ø†Š»wÙVÿqæ‡zç Å´om‚×”kúó´Îó4‹VîYÉ’4Ÿò‹“ãÎ/Ü}c•:¶]ôчÿ²áó%„öٺдò wÒÞ9«ër¦ùU%Aæ"Ýô¹‡Æ™~å]LE«±)¢¦5Þ7Ÿlð²(bÑDËÉ‚(¿p×r|RÁV:ÐòJ¹Q …ñýcâ⹫ˆ[¬æåíìÕ€'/ôbéôŒ)P”¸Ûîcf¢â˜9Mžr ZÙ‰l‚$(R·Ý·…éWf¢gžšÔ‹mÂ)ÀN±êñ"õñúýß›Uœß“z¦E‹ÜU3gUAGéÝö›F£Æ¿ñ‹Öq˜ òºÜKõ ‚ƒÔ×).ûŽºÜäÿôÆ+ÃëâìWäöFÿTäs½9Š/s Wj?v*IAsÛ aqŽ/]d?`».†£a Ñ/ºË<½2,!>é,KãÕú÷/“Î"—#®°µ¼¤e0íÝq#v=Ûµ`NÍ×ÝÄe‡ð/©¬ÌÍŽjà³'È Íž™_ORâI¢®nĸh9he%ñóö¬ bå—?žCçjï Ç»ED.êêÜ~ÉYpð¿¿û À'Bã‹É)$M4LÍ»âw€·o íí>GQl6™ê7a4ªaø¸Áš€ôkã^µÓƈçüü@ V]sµ1h¼ƒŒ«‰‡-Ìö7×>lÑÖ`&wÛH/¯;ˆÅôtr@Au’*°©ê¨3y L¥Yþw²ù,»!o–®›x—@5Á),Œ©š¸š¹ž„Øw6¼:Ñ@âlÕŸiŠ›Ÿk»ý+3á&Þ–´LìGa­ñ‰Å8ž…€Êäãü˜pésáô|U¥B-ê5I% N ­»tßf0Zêý!šÏÂÖXæ˜E–³áñ/ûý[n`L€5—šù¨ICçTjnÚ‰qÓNó1þ«æ\ Ù÷Ÿæ./û^EE1© øôµ9k`ýGq‡žÖZ–UÎ@¸‘Z.?Oðh’ÙùÛPCVÌ–Rw̤&™ä'¹{7ƒs4ÎíተÝÅX…dГ–´ÇIâi‘À*&Ï ‘#&»Ð²s*¿¾É‡øc6¥¤*/¯å9Ü8çÆæøöóëôùC_Í?hÚ¯ç=×ïLLR E‰³¹¢Ã‘¥DS¢«•«‚ºÛ=õ,&J¥‚ïUëw0%ZQ¨@q\«CJÂí îp†”¯•§ÇRçOa΃Òï ˜Í!ÒÉ’™|³FØ3Eç‡KÔBÔÚdžó O¨r‰™ªA}¨H£‰¹ÙaD:Ÿˆ&y*cÅ&S:/ðqÍ7á~èâ á\¹)äTÊý¡ÎIÃ<ÜÈu Ë2àc~~Õl¨½ßZÄ€¥ôÔÄ߯+“’Hã’û ²É‘$)ß<ÆM Óroúæ²&±&ÜnñK;ˆ/}È)žì÷©Œ‚Û·ÅdûC¦o“ÑŸ†ù&'%ˆ[ÙœúD¬ð¦[MTµÅõ3Õ¼³ØÇŒV|‡ ­³~¤ÅÕb¥Ý¿¹b?¡‚Óxº—Ò+Ú Uu¹]LµBã-ÚêM-a”€£,iÒ"„*ܳÿ^À};I= Øý,(»p9ZKÓÃ¥àìVlI€í}Sé ²ZÉÞº9åqºréA…áÅK+³õ¯À‰}ÉÍtª/`>œ)üZ½kW›79Q°ðáîZRŒínwƒŒDë†|勣²?&Y,̧IIJîM· x± œÒŸD[æéÐÇœ>ʘ‚åK£Z{b+áé¦Ì®‹ð-N¿csãÃ_.ýÇqŽ'Æxø|u§/úÖl¥´~Od2)çxõd“œ4€·šfÉž¿Ðe>é^/@æÉR×ÇîœI‘áAóÍÜF®ñ]GU-ÛdŽžLT„´aa¨EVl ãkñ¹¹æK¯=úàÞN™¦FS‹X½±®â¤`¶~¤dY[ BùŽÒhOóäB•ZÓ…ö½“mÞRnYüA5y¾0)eXìVnoU«?Ý=Œä.ݱvŒõeÞÚ²!gIé…¾ ª§c»aê$U ­P͘ěS›Ñ®ÚtÚagamëÒ¸Yè¶Ñ>R&’îC4êò#²i·©dþŽè#ER¹LçØ;H…>Y3›Þ;Þ~0/íU Ë$©ÝchNÏ@3ëÍîùÛi#IpÁ*äõÎôBqHgæñ$¾òFØ „c¾pN n…ðe ÒYÅÁûˆ$˜b/§'=Rµæ”X&[/ò˜~·sl}A«Ô°æPçÏøÞ`Õ?éߞßÂù³œ>&¢YÉ_[A7;®BäÎ*NzÏ6Òùý®z>zÖhX ÷Wb0w.6¯`šR›Ð³ ßΗ»Béú>…EĺLpÀy¸ò«Ñx4Êœq²îõí£ê:s-/Úœ ‹ Ï ËAø 6³žªQ»Ö(GÇõbNßM’ÉaÕ½‡Ñ£qìØÍ|4=K1ª~MÌðê’| ˜y0»•KÈ©÷IøšûÄ‚õ2ŒFcÚ%R9,—Ç×ñ¼"Ϙ·ì@>úSõêåõ䥘•"„ItÜF{ö ÞhS:õêkù¥¤¦Â®âe‡›m£Üq Æ:ØòîjÍ8Ó¨òޏtÿËBb†Oø°=:©cÚº4N‚To?w‘SJ n¶ãTœ×4ï`;CZ+¯Ó÷‚‰¦º²U®\ËÚD)ŽHh{žK®äÕ³qF+ÊÃyÚŒÏÇ(±?ÂI§%Z9­åDVÎM“\žõ\}¾œ¼âÍ aBÿÉ‹÷¹Ï >m*L6g®ÏE¯zcÊãwèËçJ–®>:E xÍ©ìV{ þ%~èv¸sò1½¥Y}^¬Kc[Â&Æ´÷`ÜÙZ >F•”̳cÄKäìþõ‚ÑmÀ;ŽcF”§íðm¯¨}Ú«t@CHCÜwÑæ†MýSòz«õV¬Y‘Ÿæ(D×!yvÖÛ¸˜ò:p×Aêe©ð¶}Úyä´É™ÕacÒ|h„c¥7%ûP,ئ¼2Q™D}ÞSæ¹.­à¦›mYRð›èìØ´b÷› ’}‹-+!1 º¥)bÒht\U…ž¼TU)MVÅ6ÒFÁH GŽÜt™¿q¢>'€Ä»±ôù,žq$—ªuÆ=Þ1én ëyo¥2!YîÛìïÃŽð£+7A´àâý¸5Õ8™1°îÚ_!-…r<ô”u®Ï¨Íl–Ç|þ­‡tÛlëSé|`H£= rìõy Ž®ƒRZµex:¬Çz=ÞÄS!Ê®‚6ÔÁÙ{¹MÌ&ôƒ]2‚ØçÃ`u¹60£pŒÎt™õÀnã<¡{ ¡ê½ Ðt)IOæVßè¤ôŠ ¿wâ¸ñ)"¹Zß-EnxÁ½É}5Àº&È=‡ вØõc'ã"8X$eòzy«ª…¯KÞp¢™~ѸäÛùá,gi1ƒ“¤ ž ½d|ÀÑV¯4WXdD -^y~ 8gbá}QZí¢ßmlWð·æüÜÚ-_-"¥ó »¹‘í3ü´pèœVû㺘ߧⱚB)[SŠÑßàr ÚÔ¹ú%·ØÁ*äÜg` ÔNµ’Ä¿V Òˆ?ä²`Ýeèù¦8Ó‰rJ«;§²ZѪgp-ü˜•)ö:ˆŒö‡w3 ñhíý¸¶R#ŸÁ !¡U“¬<¤óÝØpfŒí÷èO ˜:ÝgÇFX%ËSk娲mY<_ 懚íc”ÕŠðÊ»™ûÄû±<=ïóL ;Jé×Ã8È B§ü+“w6?n¾ÚLÈ[€òFSuÛó;ïÚ7=«EÅgq¿[Ð~Ùm+Œuc.™i}ÚQÖÌ}jšB¦£-Št½†;¦¾ŸÞ;Mj=ä²0~#TêkEB^SZ£¯«V‹è9>%-FMdîS[ ¿áÏPšÕAhGÉÆ¢e„BýJzV7¸ñnW©»s*F•‹CV°¬¬¤n_»àç ãgm<ƼöÀüêÏC/sÆé,¼1†Y 2ëö¡ð˜„qçGĸ0*Ïób2Úòë`8-¤L/RqÐÙ„$”þx‘ܽaú‹J+-)9ÉVf¢'눢ÍÂø5ìÖI(~YGòsø¢lW&”žFƦe»pC+f£ƒÉÁ€r{m(­JÇaäm²£{¬ Þ•dՙ߿‹(m /¼JêÃ$‘Ð~"ßMHá´r„\‹+ÑùÈ<:ý4>¤o Ø ªÇ]¸“)„{,î®Óúnµ-ÙTœ•d™æÈƒ‰ôèt ²¥2›TÌgššzàÒíZ‡[*€¤KüV•%fJÙǼ¾xF«ÄÞßòa×%‡b%œ¤“å:ÑÝN§š4œëøè %,•7¥Uïq“‡qæÄZÀ=Iû ¾7Ý™ûº"ëai¸çÆŸO óÛe×NG8žùÓ‘ÇêÍM²i­Ã^;ü}û¼ƒÎäµ,öàÏWN˜‹̲»˜]HÈK“u]P™Ðjö%¿Ç2ØÔÅ¥â.ênP}òŸA<Áecà7Œ‹¿×Ò f$Øñs1 $N©ö1 øDåý}tÎZ…àJ/ Ð%úûœà…Da,‡h¢GG‰›1±ss&1ôÔµ »?sÿ;Ò† ˜ú²îãÇ‘¸XdßK0xz§õ°!÷P>Âôi`áÙŠº)ãÅÈΪ¢·%à\^@ ¿=î©—lKy]²BšmŽI¦ ǽG/Á%?àhw!=‡n£f¥Å〲"4tâ .Äüü{aèGO;Ü­‡p@äÌÍãe˧ã(µD»¶=²Ä—Á|ô·EÂ+•¶úù³ºìýó+¼§5ëÞÙ[²×µå9 Õ~ô¹Ö-6üj˜ºnBr¬‰ïúÍ@žÍ  A£ØïÆ"æ²;eáÒÙzdOwÍêòÝ„(µë¤3n`-<:ANIa1×D¯£oLñ8;ãíÍs:­>¶H);¦¦rô#8 yн†ÅSú¼ªCh5‚­ ÕPܯ?Fkj°¬ ÇÉÁ˜ßŽßb,´º`#£z…v©ˆK³xr©j×Õø`èÙýz”Þú;ópžÛ‰-TLò0‘ i¥ú1"ªë­u»Þ7dµ¬Õ»Iö˜z­â5v Ö¶“Ûô’ö9ÎZ=KßzªbÎk»%‹¸ñ”rð½$t|ÿ2‰ëÔ¦3•#AöY<÷“¢¨—ëjÖ%ù<¸Ò¬ÛåŒÚWžxi7ãQŸÁkl¼Ò<ðøü^ʽm`B×?Éü1ò)r–v%)ŽãZTÛèËrOèãmæg¯Ôí2MîêÏÜ¥'€†y™D"âÉa;;žÃè–éÒÛ ÙÌP£Œ›3Vªñ,Æ.äÑ™ž‹üÍæl¾½ Ãðè¥ÏäôŽÍé€0—(UY«RÍ5:R@Y²™Â.=¨À"\BÚ3•Ü(X¼Š÷ÛÅ|óäZ“¦*òH.ÙGÔýóŒ•«Û 낲q¥3^.oPC ¬7»D(gB$Ø T Ž>mÚéƒt»ƒ%¹ÒÑGFtz~Ѝnö„¥?¾µ ó}T’û…ÞMàÀNpàw_A]Á¨ä:c4œ¼Œñ½ÕEåG)aw¶xC®uúéTÑÕÛ±‡ZÉÞÜ¡Yå´Ã½§ÙK2gtg9DZ¾(b ÷µ±/mð̧/.a)èÅ}3Ý£Œ½6…‹1éÕËs“z’hæmxáȬɆ¢ +Í~Ê~óè(…ÊäˆÇ9›mr(|Èä+{`ñRYðlE‡uGó(>*e63ž[/˜ûL‰¹rÎ!1Ùb©^‰öÄÀÑ]{À—Ü0èÂ$?@ØW%¸œM4}Š”)Wè‡|gµðá¾(øw¬Üò1¨~º9>.ÁPÄ+U‚Í>Na]è¨[aÈÅ›%ouí´Ák2õ¯pÐôÇë)Og6ÃgÓ Œ0HMZ܈2¶þf‚’àeôúQÇ)"`/Kì]Wj2ŽfÕ°ÈJŸ'õÞŠùPc9÷ND,¥ê†^8D»œÅzJ ’¢´ÊйºtÖdØ&ª¼ÂáÂá¨Ü™ZP{/ªx|œÜ<>äˆb9uj|µWZgùÁ\¡2ÿÅ\Ó¶”èßïz«ÔŠÌÎýSÁa&nÊ‹kLǺÍñRñãÍ®–AeqW(‚½nÞågCç/k”Ã1¿äÞÓ­™zJ6¤SÚ},œ.¹Hé`õ‚i$“5)؉lüêçU/•Á—Ttÿ6\²¦8Ûpôíá%fûùÐAN™ôôÜ)GE~èÊvU%)prfTØïÔp”‚E‚7o'µ|y?¿Øˆi—;AlÎC5 0õk½f,lŸàòDåÌÈÖâľ¯¯ºüÄ_ÕG•UþPÓ½•.’a9s3e$¡†k¢Ø‰ÚÁñ迆æåí\)Qò$¦»x}¥CÆ ØË~Œƒ´Êñ2¶Áô}­Øb¯h “î¢2C½öKô³ËÍ÷XY `áo¼$zmÁHuÎékö~\ dí5Õ9%©¼ë^`1'Õ›æÔxíZì3ó4ºFܰ“º‡•/Æð‰Uä7ƼãÚ]`Ô$[n%[h÷%m¦êrqL# &¯btÌIê>8¯âÓ¿iL¦† )÷O,IPEè/L­›·.Р~VéïS«ß)cî"þ±Êë}·l"YŠFj~¶Téñ ´&ÛTOw.®ØÖ0ü›n …ÚV;w’Wy×ÕˆPevW’z÷'Cµâõ7]QäßõµðóÝÛ[Ó\Ýçíq³ˆ[çg±Fí;åǰú§ÞÖ]>âÆRÔ ”Ÿ‰¤X:£ã&¾HÖv5`;´.Ò0JäccjØ!£í Gb|““K_/$*cÝQQĸ33ùÍ$•ëf²S_C»¢g’&‡:³v£îQbRáw/‰B÷Ú¬¥@ér{œ˜-Õ'_,Lñeü‘{jß »U–úººGCž¯Ç5Ñš*y —›~ypåeÐ73óö:Ö–¿D¢xÒ¡£É0OþûN$Ý íÔ³sIh©xϧBGìØß¨Ký=ýÐúT}˜Áéóò}‘IæR‹oûó1^äAÒE˜þ±¼ò>”G<ïðZ^PeÎB©EIà¶}ƒ©Bصǀ…v¬;Y^vv‰;yra·‘Žšž¶¥(Àêø`í·oã3Â)«·oˆHLÄBFA˜õ>¡ÚÙ&)n;y}ÓB­ýM02}jƒ¯Ca ƒc+ÊÞR‹á„ûé‡pþ‘ƒz=¦ ­˜«µÇú{±YX©ç§Ú+Þ>f´äR”¤ §+ìfgêî‚'>f  *‚ž$1½îÍðÚÅ/Š/j'·YåQ›ÂÓ6ÐÙ‚àxú/|š8›?Ô‚¾1Ýc‹Œjïi? ki7õ3ÁÜ×áEïçs37Jpv}Ÿ€Ñ¤Ï’:é‰Ñ›½¨ %ݽ)ÏùŽ‘ïNà /üÑS8¦ ?qÆôŒÕðQnŒÍëhê9P‡+¾›¨öà ¶ÄS‹]ÔÎøÕ½ŠºØ²vw‹+ðð9XèNŸ>øá Ìl„Z:ÈóÊâæ'ŠòÝÅnkZœÊƒ­,] ¯þ›Ú…A/8+§¿Ot~¥ïâ Ù[:Ô¼ÝåÌiËIËÄíVüZLdþ±0J±ý† yˆ‘ ½§Ø‚°ÿhAò¸TJ±›j Wú£xªxô0œc«ü<$ 2âhe]s2üº§‰îw×A•üç‚-95ÄÉo#2_þ½ ¶¨{&;y/¯ª ˜FËý»,ðêÞÆ9Q|ᨚúwkÚëþM›·Ò‹¸‡œÑúíŸIà5—Êk6i+—Ò‰|þèw2öKâ˳$Wð>çµÃÈfº/7O [vnWÞ…ýú6„îz‚}º ³SÒ:¿ÌSh 4Æ2€É’ÆêUö+|Iñ»9‚òñU ìbÇÔ¯Û^õ5ÙlÃo#R ±¡²PÌa›ÎÈõOpe¬¶¿ùJÁsNcôFU¿õiñ«ôýN‘ÞÅ@Ã0YŠ“úÒ7#¤oµþïb‹ b ¢i‹!Là”\Ú[iÌô[åbªX¹ÐFŸãµ`'%†xA¸áaÀ„1ÊÑìWœ;ø‘|§.ÁYâê¹3áÛ²žuŒ€~#uƶ¹î|-\RVè‡kQY²úÕPS¿Ðu}ùǧnŸ¢ ‡øZVÃA’0Åâ´ÁQhzî¤ÑŸ­xU^y,Š¿EÖ‚É*ç©Nyüc^m“/ö ­0!õÙöŸ¬>x6å“Kß¹–±Ý®ª™ M‹N%œ,lÚ¤)}h…7ÍÍ:bJéÌeUà4ѧï±Ô'øf¦u}ô1uÂá`¶üY¡½±PDöW—!cUÖYÏÓbÄ6Ý@÷#íC¬E3tó`àò¡-äió'gñ£Ô!2+’züØ‚éWìÂd8ýۦΪ•“r¶î¹nü ÞˆÞÜg—{†hÏeW;´ õ ó…ê$çÔµ6a—ï¥üu’P|‹žÉ¼ßϹ' Cðdù)&õøfâ$èi‰®9ö§ëúí’º¶t³^Ö²ä*ùOÛ›,û6IÐþʺ2“cÏ>v>d~óušLʼiýTN{?+Ù/m夙ªr‹GÓa»ÈT_{룇µîM¢¯®3Ñ`~<"G™ëÇQõ{5ÔPŠK¦dÅjY— *yýUŠÛU)4Mí>¦ÐV˜˜úk¿¨m‹WÍQL)\c˜Õüo8c $á6&TÍpí¬T%ЦTe0m µG`¢¦bÐ-W-&¿l »{¿Ù¨,s…× ´<Û9S‚Î3vOB-œ s¦$rÚ\jxr‰\õ1aíŒF÷R7Ø8Fb‰´~âü‚*0›4c ŸñÈdXwìÚ¶x¶¢†kQÑþ¤Ô™îÄxJ+ŠG[ÚÕš>çœ[_¶ËHÖ´„ö@€ 1î,õÊy)=C¹ú - "RpÒ$Ùñ<®}õ–‹Otü§½„ÙðØòÛNAƒû×\šeÙW¾Ç×Wû{,v=£ãnÏJaÙ?™’\8÷E¹°Ça`«~ùT#8¹#“íË6)»÷½-áiZ1‡*!¡žØ«ÊÅéi™iO<¼]¯‘øwÝ´_zBDðŒ‰dûøÎ~ó˜ÝãªP€¬Ì_umç´T•0yph—ÒÙU”¸oìè§Ö(}&aqÉîœVSYÓ*œyó7_[yÛœ›ô®L`Ǿdªð`vÞEš«‹g3­›$Ù*Liö}„¼Û~MúrÞ±ÍÝ«GXJ*ýåÎQFÒ ¥'W8»ó—0uíÑA´AÅ#  Ócpíu-‡‡—†Ü±O´L¾HhYTÂ)“1¢8Fxa>ŸÕ&ºo¤?o+’ÚBmŸÛ†(°î*­\ä•S-Ÿµ.“Ëví‡V;K«òª2uïQü¤ÒÚì)( rl%C”ÒSÍæ ùͱ6>¬HÖOùµêPòwf°:êu É0Òòör²¹ãKBâatÄBŠ>…ÏáÔ_ÙT'°¡ä1Jêêo´¥vG£ÀÚtäg,à/Õ2GMt1æµ/bAÌöc…Ÿµ›ˆÖž8<²¥É„A8k¥·ÞÀ1λ^ K>Œ&Û|fÔà‹¬Nµølï²XJCIò)ŸfxbÕ¨uñª3`ezÚš´-˜qêg¿‡9¤® Ž×pzyÐNŠRb{—(´óD¦ÐD¦ÕP³=M|¡ªšD¥}é¼xïÆÖ&³>Ý}»+šóYÒèü±ccd·†DñXöòuqˆ6ß}ôµN„ÏI¾ÜƒÎî(NV°½dZ„`i Zž>žˆNeÏxØ)=Vr›SÊ<¿§{º”غR-ªÉ'5¥ð×^†k-‡z5±Á”åËÍ.°â·;à3³š”t[³CEŽLrowb0ÁWE ¸Pû#,ß>÷:Ê[Õõ3”’m4Ÿ ˜Þ€E=bÐl‚amh¡Ä”P˜+fq‹›˜ã æå±Xÿ0'BOs[¤—Är¿2—ÿ>~7JFâ§ näsÿÈ4w°­¡núì×Dìuf,³7½·ŸÑØîbËaV,±OÀ‹ô#¿sÞä/ò¦HÓ|õ†«fõ´ÀhÜ©#)ëxr*Æ¢•]{üÞ¾ý­¸¡ÛÉ“iå6|'äàÕKDÿÍ]”ókû“/Q·´ÃTÀñçâ‘Û­Î5O_r>x­Ã4¯É:íÀIEÂ-<ŒåtTrª5h¼óÞ¦aÝá/Z5ÏØÐœ8o6lz‚ÃÖJÑ›ðÍ((Ÿvaq'x?⃠ïË$¾jõd£€»ƒ<®ß/§Q)NgsYÕAÍÀ‚éç|žQ…O'Ù«„½i®Þž˜iI×*Ìôy•Ö<+]Cä³_Núõr}g<Ð2xHÊû£@‚¨rɼ™shXÁ¦ qi²ÝZZ—±‰v~SU„ÊÁ?¡)¡–í°8òº6ÇådiuY7¦—}¶=ìv9~1·yùĈ®'1)˜Ù NFq”¥çQ—z8´ëEÖq¬W>º†ƒÚ~³)Ž~C@ë7cps º‡Ón$ûQy×ÜU|€6*_é`v;È'˜Ð©ê•å4’ qÃÎQå @ôŠz ò™õÝåÒÊë=-5S»a•Î gú$^_ºksÌU²¹Zb—ˆ¢x=³”äZH‚›a žŒáF¬xYi'm?fLâº]ùÚÂŽînæ²û‹ÙøÝFÐ4¾èYs‘§Ð äÑ“x5Y<N¨H2Bô¼:íÀæÒî†vt’á4j3üÞ@#ÌeÈüÈïyìNʶ)"D\ðM-É’·8ÞX€ÉV<Ñ_“]›ÁÉ×ð\{Ôå-B\‰Œ\”JvL)É*´ùu ÀÆÉͨg¦iq$úÀ¼6d†Þ Æçm‰yÈ',dKÜõÚ>G íê3ÿÊ_`ÝA¹KŠö×NÒG£%vv‰M˜ ÁP¸{Ošu¯ñÙ„_]Ñ;†¿m|^y¹EmÔÐÝIŽ·@;£¹ §sZ¥í5â@Œ|| !ýMýí±ðié¹z#¥Í»'Ïeö9سMTñ£‹>?ñÁÙÑ ’<Ƴ¾!“0 Ï弋žûÖÖ2<Œºý¯ «ÔÒa"raÆ÷²ß‰)ãv¬ˆ„oÎ.–Öv$A ‘ØnB×ZìÖà.gÃèB9矲ºJŽ#x/êcÓ†žå='Ô4VñŸƒ#„°¥w4œ´½1™qÂÎhG±kùƒ,d92 ¡Eâš ï™6¾3ñž;(¬^“$Nœ­Ky%K‰ ¸Ä^Ñu„™>ƒ 1~\|R’`Àªƒ5vsï­ŸFì&ø’ );ÿsöáuDŒxìÇݤ¡d×kéO^J.¹M0óÐÈÄŽ(UêÂÙx+ž E£’Ç.Xä²J‚ÖHÛó9ÍiVù>fž7ˆñ ÄD'å§Ä®’ò™)OíKåzü¨,M/tž 4ËÝÜ^5×ý‹R~çioÒä~ii cT&dá¾Q_ºÐYÖ6X`Ÿ”dÕfÜdX Õ¯"t9Q˜¢ã®Ioß7"Ç#¾ûƈ•ÿ nj°2pÌH<¯˜iœê¯à| Ý»¯‰L˜¢Ëgò(ÜëâÕE3_ºú­³yÞtñ²dÂ( \B}®3Q¸èuG‚¼éû¥þPHƒn• €Ñ &¹/ÕâÍ“l:Þ:`—M®ÄËFX•¶âãܱnVô×¼Z¶x#R7Ài®våJd7ØRïæiÇ­“w"˜0=ƒ*QSèix¨×‡WÕ!«dJßÄÆR²oåMlôÙÉúhƒÂ‘ì &¢¯ô=h;·í+¸_ó…¸"shº)‚S›XÝT+‚"^Õ…›;Àz’ÿ$Ù#Òf•çw÷i[YDE8ioÞ}<6l×/c}nÄÂ?dŠºª°›U%-óôý–ÜZ„¾œb^˜ôÃ&%dÙ Œø`ÏÁÅí½£1êÖZÀ"tqÓš ÙÒ4aœ¶‘d±Š cAñïpèjô¡öãïh[.†Xç¨,ÓM‰ä"½‹%HzÄÕ­¡‰¯¼© ¸+ªå—r䎾0Á‘z¢™Q Œ.¤ ƒa´Ü[5‹Ì+# ûN ÌɪÃN¹ömêÑW+κ>áæïoª]åÉÓÜbÊYŒé\^o™OÝîû=±n¨œF»Ò“>÷b ìï‹°8=Ô“‚L+¥“A]ló* zô"³ZVnµ‡=#¶a§:"‘cµQŒi÷)bÖE>.Ÿ>c6”¾‘;N…äúiœiÿÄú0Y?|Û)&d^³ûé3‘X{«Hptøë]A8æURÁ°s(G´=D¹ó'2Cþ;ìøÞÂâ1ö”ÀÑtÒêK°<š„©€`ñq$½¦ëIObÙ!Ìhm±Ò¨žVÏ-ö³{cþ¡Ëʱ%O‡°ÇñŒÆ!M|Ë«8úÃô¡ŸU+×M®ÈG–hq»'²_ ²JEêjºxF§49|´.‡øûËSAñÒúÞvÆòÍjñ–XaH‘ë;/{k†}ðÏísj·º¡™°üzK×ÌëÅâMô4¾b£Sµè¡ZùžÂNrÄð“xòìF´äž>$ 1Æ–VêA 5w" l|9Àú ÒwÿpBR7y*ˆÃQ=nF·úQNoÏ^¥²ç‹a˜-ûx/ubcœxÏÀ}1z|¢xü"‰3uw³·;Áij_æR;»ŒcöC÷·­X†Eê=gRƒqûT–WfYÄ3s«ŸýÈ 3†v³ùC(õ*N·GD?Ïææwûg §‹õ,w¶U_ „µ;q¦Ã­EÖ“\0²f4F,õ£ýI¿cŠàzý ©,ììÞZPbX å4 Dn­ÂA8¢ÂmTF̗ͤÉgî ù∱àÐæh8ùà°eqÅçHcR Î|ëòìáå*½n´«È–ûˆ=ïÇ1”°v6D¡¾ö îºÍÙ¶-ý ¡µg d_´9ÜÀüjhg\ §PfãO˜¬å§0 ?yÛKÊÏÎ Å ˜¿›*â´Ch£†)Û8bÊ=ÂÉŒ2Õ¬5£#çÅÃ<¿Õ‰lÞÈTu”I}Ý«÷ ´6´,pÔ’PN‹ø4x±î^_àgÆÁ‹À8¹SÌ¥17Tô"AR¿Yô\GÐrÜ(x£N]ƒÅz? ÿÁûÐòrš+úØ®šÎ‰n¸þ>4“ßèË„ŸaÜØEå3QãŒ7;·ý:F¯dùAôw…œðí/^°‡7²ˆb ³y¢Àâé¥Ó(3³Ml°:Ï@ùT<ž¤çu5ÖÁ}"¯k·u³gl5m'{o¿K žÛð¸xé_܃qe. !Ï3žT@TŠ©.ÒÎ[…€Ÿ‚Ï\Å …ó[Oóæ¬Õ6ƒ¾ê§¬hée ªâ.á@8©§ Mq×{1@ûUê®Äj‡ÍÀ´WLé¬dÂÇÎýE1÷Ñ8Èå´Ð;…ùÖ¶Îîr1 õM`\k\Ð@kO‚1 #˜ê#Ý­‡uu.›’D‡Jkwh†_òSá¶øìŽw­ÐGo«(KÀ JÝsÖ²9¸´b9ŸZúÙ½ºIq]¿­ÃÊë< 婦C¡cÌD6G’Îä²Cð“ÍN“<¦ùþZVî~é ¹ž?Î~ ¿ŠBŸ8ppžÏ“#³ñ¸š§è¦7Šu T¯GäÌɯûÚ5ʇ¼ÕhÐõ c8ŸSÑ.ê»!ßìÝŽÉ¿èia’ð¥è^Lýúîm|E^“Ñ =v€è—C-Gà·ÁôÎßHeÎOˆZ ÈI_¡-cBSmòÝbx~ŠÒúýÜä™àއ;¾¨=ü´ÈÕZÛo­å‹÷-P÷íTì-ËѶ¨Ý®ÅÒ·†‘ø×ªÉ½Ž°˜æ8¯sö(~¹™®`œ]iÖö‡'2jßÛJÉþlOgš¸¡ù£þ%«ÝZ (»ãÙþ&áÛQŒƒ—`'j:YG*OHIQµ2q0$ƒÎtq€óØDH´-y‹4íI‹Nôý'6Ð.`ýT-jå3%ö«Á·Gõ¿`¦r,yN ¬üž*cÑ7/x«ß¦Ç¨–t‹ªdÃ0Ø0>‰“7wL§(ú) ~&BÊþZ'ýuŒª{³›–ÙI;°Ë3ƒ:'³§¾ sžþ„cŒšne£ˆéç%‘eÚ(G³ÇžÎdSygÙc‹fI¸qoX K%€R4"ÁìÆ×:¨ÐAKÑÈÈмL_ ½øÅØC4@ú™(4;KÛí¸±N@£:¿.…3´E£ºŽvh¤T»¯#HµÔìZ°½ð$±e|Ç¥99 ƒë^æpq¡gâáv‹Ûp7˜ØnvWx‹>Hn0wW»ù}A—€l”ÿc~Wy:ãkG%¯S@Ïó°ôH¤ÏF;å«Ë•«•L]g¦Ã§ôU<’¼SNa¯£$ίW>ýñÅhé2œ›Ò;{ “«v‚qÆ~h„ÀÃo<}d0I¶ú :Éï­*ãðwOî0fLIaÄÂã?'ц‹ð¿ØSŠKàib³bœ/¬ST/û*ó?HúDÐ 2$CÝlˆÅ瓌ðo¹-Âø‡…B#\•Ïyú~ÎbúÙ“×õuý˜(˜–Ðaðª´F:Q{͆ûzžùºÌÎÉÏw"ö¶g³ é³ÓË: 5üE7OƒPS€¢Žò´'ã!ï#®5G 'W_†Yr„ôv64kœ]!àÔ3î逼[<Æt ðBÌþe¸rZ‘ ×¬ÏØyåAbíÐz=Ü>•^±j"ÆsŸFð0–9²¦½é¨2Lb¾«=zC|×¼ùX¦Ü“0?ðœž7A'üÖhS[Æ7¾aÍgÿÙ,¶š< lÄ÷-‹Äé?µYý19J{Ú¢]øÐLå1šßÁr{* Oà€oáûð/A©óŸ`|œÌNý,þ¾£w'…U‹³%"fÃî8m\1ûTyEŸé‚›ÞÄ î`ÀÉ <&ŽÀ µDÊ!wŒ<óŪ^q6¶[£adÒ‘Š}ºÓ_;÷íØGcy¦$î÷šúß.„‡v®l ýF>PÔüðUQ#Û0Z–»{«Bc̶ßÚÖÖÚ8'¹å"÷EQ¡q0šýŽÑøÀ©EjÕ¿ ´>íhÒ6Ùk†>WÂk“v>;Q9¸”Àƒj–¾>&Ž|[dN"æö±]VžîíÌ…Îq‡F–ÀR®NG5 PãéEe~Á5׉¢„CÐÞKž1/~ØúQñ¹nŸt3È,æî¹ŠÂW ùO…»¾l‘Vqc<À{",£¹ä;ìGl+¤=½PÞ /t#FÑz̵z3¿+=™¦1aõÇé.·Éc˹ uÔw\uKàßâÚW‚Ø žõr“R("ßP6™ÂëÙõ‡p…‡š˜ …®‚†wc² :Wk"ž½c¡ÒVŽ„c™/±Ÿ·õáP2»bŽ”,½ÕÚÁµ®6Ë iyÐ@[‘AÀHjWEN¡zÓ‚n\„ÇN§@hßUýºF9€‰Qf¥_ë*Ñvm寿+„TÏG-DŸøCŒ?uÈ>V]LС¢Š%’ñ{Aˆ e.„UXî pêháß1üp) ÷è˱ȸ½Ù؆Õ*Añ`Š-¡ÍS’˜îÚ“&iŠdYDƇwÜø‚¦«á =X4Ÿ÷Ó‚®0fùN½ïÃÛdWÄ| QǺ&îHLK×Ás|õߨh÷y.¤ÝìOjzUg©‚–ŠaN*)– •Ü +©’ânÙTÞÕÔ³Ìñ:µ«û·ž ¦n)Sƒ/9çha7á™ãžÈófo¤¶ðþ ÅÏKƒk?–ïÂtðKIó…¡  ÿ‹þ4ò †blóß;+áåK¸ï{PüeXJ†¯“}=èÀ›S‚’7"‚ +aG§VãѺƒ“ÄxuÐÌ…Ó÷S€Î˜®‰äŽÀ“G®±ÒêlÓÿËѵ`-’•.ª˜‘C*XEï8]_¼„›Öàý¡¨3É®ZDóÛJv÷z­-Ôþ8>þ—ÒRœ^üEÔiN¢^v™ïFñNÀ)›%-D3…mJþ«Ëûº§Žôû{ØÍcjœ_‚]­>ÓC_²N ¤Ô9³úÞ®³úS[À,ÛSS÷È„[اÜÊkó‘eBÂ8ªY—¶ÈŒao>É2¤HãØÝ`ãQva¼”Ýn(w¨¥üM˜UIßÿë¡õ?õí{.aÑ,t9µ.Ž®Š1CðlÊ¡0­>$+A빕óª²Äc§m.Û‚¡OV2 ŠýƒWwœnb7Gy£%ísÿÝÓ—+¨Ï£|ûVÑL»—"ºƒw7éIÃ[½™"öã^g±§”¦÷Ó&0xŽIjÒv‡UäµQg’¾Rö¬v÷¿Çdßp³ðÉ¥:ûPYÞuË V dA\”PðÈòReÙ+4à+(ÊÞÔ\\IGŠå  C½qìÝœ‡Â5*Š­+€žjÀ#Á¬=£Î|ŽLn×chÐֵᶤ 0ñ }^뀧Y“Õv ·»¬] Þdœ¥WÑ‚¬ i—wÊôÄQíIßÒ÷!By”8aû±åÎf1oHÙ'´±2›¤—€à-ÈMX(ZX(- ˜É¾»bìÓù¢óO Ί«¨À:³j1…4Åh"ÁLÖE7\ Ù¾í}<þÍ­dÞØ3}R‘¨5þKÀ¼Ø±X'ûÕJçÁ}½ŽÐ}6ýð M"3¥W=eÔ'Cw„Ü&ÁÒ˜á ƒCoaG£ŸÅu¶ÅRG›QÇÓ{6Š•‚7åÿbýAGF«ÒŸÐ¡ùv¦?šŒ‚óÖÃå:ï,ãÝé°€Q!Ï l˜_‡Ÿ¹aº&ƒ×U0ò#&{ÑBu÷µ›¦¨E0zðYœ!…ëh¶`ô’”ÏÈœ®ù7w©ëóh‰k}‘˜Ú´îm¢$ËàF4ÏŸ&±´L¦ÊÿFå©$òbäÛ.Y°Q”+ý¿è¢’ÒMæG\§¨õ?ª³q­¼J–-Í•ÎR²<‰ÒéûQ¼wYiò¸S¥äD§³Éáu0U÷‚< }0þÏÔ^æÐÀX¡Ã›´®%š«Bìºê³œÌ®Ó-(.×½ÅÊÜysô™7ç'¼„tºÒ"_1gónÔløiéù/ÜÊxÔ»wtSÒWé+Ç7 %pû£ÿ)l)|YÓ)WhÊ’ü†Äyøø„*&oZ+-m•ÕZc»ïs×`â¶ÁŒ¥‹ÀñÃúÐ5T®Ï—þ™ØÓÅÂÛ9¢¿æ&÷¹k1™¯‰š…N`¡¯J’¿ÏI‚‡Qcd¿ ¥[YÐàt‘ ÜqšŒ·¹Û4EìÊ_&8FŠŸ‰Í¸µ ˜X‡k\=þŠ8IË,§ãážOüå8µ˜M;Ó -Wª %âù„ŒéÚ|¡uº(°¹¶Þ`×ü~Iü~Ž&¶_Üæˆ»=gŠäf5ù† t³6’Ìå.šII±A:o²½Ï:=ŠeÐ[ºñ C,ó$üÈv14ª$ˆ U‹}…á¤R¢‘Õç@ç YxVßì•-y–Z˜3öðV¡Cp2ßæÒʼ%Zá<ŸöxiÃ+Ú?4Žzµ¼P&.âdº¡£Ž¬QÀ5Gª+E‘tò/…ñ}oŸ£ ‹¶´`p¢ôÿxO¦Fˆÿi)0mØc4~‹¬ø1Œ±4‡oÓl¬«à “ endstream endobj 2555 0 obj << /Length1 2424 /Length2 16015 /Length3 0 /Length 17421 /Filter /FlateDecode >> stream xÚŒ¶UTÚ-Š{p׆@pwîÜÝIpwî®ÁÝ!¸‚»»»»Ëí}dgŸûÞÇŒÑô,›«jUÕj Rez!# ¸µ#=3@䋲¬Š 3€‰‰•‰‰‚BÅÂÑøGƒ@¡´w°°±æù‡ˆ=ÐÐ$5t™~±±H;Y˜YÌ<ÌœDZûvò0ÄeyðòsÔÜØOþgò’–ÞŠ<03ƒ¢L_ýƒ“¥;&)¥µNî1*ÚÑ fçz…?°ûÌI 8Ö^h–pòtŒv²<™·Ëv€wÑ„eSî_Ó Þ/ÊBÆy$ç³çTÄn 8ýJ(Ÿ;ei¹•Š”×µu១ ä™CJù oêâw\`.yåþƒ³äxЗcZ’ê< }ªÓbjÄàã.T–\øgì )ò`‘õ°q³CÉïBÍ'xwï–±»â±zú?ñà5_fú7|U¤ÕÊöÑNtˆÐöò¢ÝÓ2†Úy„§ž´TiÃ2›s˜Þbâ*Ú\mÌ͆® Û”‹y³<ƽSκZÝå{•nAuã_&™icK4ÜO&ú;³êú Uཱུ’óÅ¡ éN,€ïãÍä?]NKS+:I‘Q±,Bê·zT˜OÏ‘~OK‚{5kuƒ½— P¹µAñW"'—#Ð ì=NA™,S~2^ÐÆÔÁ7Y} =DÕHæ2gÒ (YbšE»‹L]t±[?føˆíI{º ^ ^yž3Ž]÷¹žvo ãƒÛ‘Š'iu¹«NrßO’özšÒzJÂåÏŸ»¨Ü¨ÝÈȃ <ø½¡.£˜áLŒai"„acõ©R·Xë‰9<#yB_öu•Eôóí=©œÚ¥ia/îp!„­á0Ly«ºþÆŽ• hµ› äÇJ)Ý#¾DTã.Õ[FÝé™< \e“K‡~Yò”ŽŽ46d¦·sNRâ²aêÛ zôÝ w3 'Vöó6236|[Þ8Õ8û_ã»ÚkŸÝäJ˜"Hv\øÊÆ“0F‰ß‰ÿìJÛ'l¹ÇÜ=KÛÈÖ5ú ãâ½Ý¹…¥kö3B=áòG£áu˹oò!Mã‡dåp¼tÅ’=ŽòGTÜûÀ¼ÅÎäœ+ßèñáÈ  GjëPdn›÷{Àω0á­[¯ó*^ÖüAC£ú‡»Çpçù8¯¨B*}dlô4BÍìý’¾¥êƒŸV_¢*â-ë@A°úÕÙ­Ûgk•ã?ä¼iм´ ›.m×&z„Ìq4 ñ…ÀLÙèý§ÍJò¯5àüšM%h‡¸Øæã—´°H|àÏùïßð¡Â|8ê–â¥Æç{÷Wý”ɧÉ(öH’.Ê RF_µ®ÀÝó,‘M:šM‡s“/KXÔÚ7¼ÎäÝ"•y|ìwK6Š$߯1ƒé1f B¢ÀYŸÑy¾n'¾Bi~=ÝÍËg«9ù‰/˜ÎU&1†¢šŒú ÕlÒÝu›±°Šø±ö‰üîjÃMÁšó"Q[–œ­þ~ß°º9Æ´€oµ¿D]½nÌ‹»þÔhÓòàd±4~PÕˆÉÉš¾Þ^6˦yÖ¾ÇÊ $„îm".‹#Ü0×.Å‚ïaáXmZK“»„Ð4~Œ`¸)£×a1Ù¼œÞ*rIÙ fC€qŠ]  ÁÓVÒkàÄrûq]»¯Ý{ýüc Ã<;·2ˆ+åãÊ;M·.Å ~¬ï›×v‘Ì&?y ‰æ7þ@Šì<5ôYå-gæ§åÛ˜HÉÈ÷.&šÀGçŠáS€µT—ZoßU4ëäj’ºµú.Þ’Ó+ŠH˜Ó-Ùñ6ÉÒ"ÂgªR±bS¤ùuÞ*óõDMàaAÔ ÓÆ®·RTR“ x³âÉå© ç¼ÕuÛ2D䜃 UÜz'¤ßÊ'÷¼y°=ÔílKn»ë`ÚßX.Gí„æ‰t2ÜF±¬ªÞiæÈts޻Յ¡i-üì†î42¢u\äüpxœ˜`?ñìßëêrLífå÷ѱÄbt Ý8ä1:âN6‡„5vjFâÕî½q&=æ‚ ¤7²¶Ÿ~Ÿd$Ë€ªÃAWØéväõ œèñV°u`ÿ1AJÔãhLþ8ø»^©¨æ{XîâÉ!‚™gµNRÛ\‘såê&5¬Jð:–ÅÒñGº‡`e¨NRîÅ8h˜òÌC~¬ÆE¼ó4èâ»Q§¿¦A n5•æ|§á:%1O¥@xèÃCXûíɽãG¬AffÂéòO=c:7©8ÌëOÃ@)[~æ^sº‹í‹9׿—4U¡ir9¹"ßöDÏWü}¥Ûù¥Ÿ0†¥u³V·œLørxd0[m†"b2Vii¡â½Z€Q× gœÀ9g®cÞ×o¨©‘‡qæÔ5ù-ÂôÕF¼’4¥xZ? ÷93ÆÃǹVŠ·Ø^½ß¸Rf§‰º{Ñ®I7ÖÛ¯|çy×Íü¶Ho"‡Eß>æa.$ÅW5œËûEò‚B››žßòRšÈyZ²>«º@@hlJ¡_}V› Öó‡!úkC52‹$eØecwf¬zPŽ÷¢¦¢‰?{7sÚ÷»Q(ââW¸Gï¢ïLDská~Y…£ŸÞ­qX_¶è*›;ØNåšs¤¡¦H›Jã×ð­«'§.ÄvçÀ±k…Ú Ä?E£/›’â×VâàVàª$ Û¯ä4§7VÈý?mXsÄ¿½ ü Á¾~¯!ؼuç­x'xf#“ñ]ç.ƒ .O+ÿu¸tà"¨ÞþfGæ8‘ií!°PR…'ŽÔ 64G6jÃ%…@’BF/OûU˜TꟽtD°‹¨ïp,xô“ûhSø‡ŽŽ7Û…èjøUYPѲ麌 îˆ$eÂE °iõ°|®>ˆæ‘¤cæÂY–Úë¾;.a#å'^3¦G3ǀȶˆ07 ¶¶Š¢j©’(Bê2mƒ+Y»[}Øí¾ö›ësRhD2q°lÅ[”i4§½“a±ÆëcÔ¤—äéV¤ßL2Óè›üØÅž[œl)àÄÇæcÔgzÔ³Ø^(ÆÓKÝÍë**Æ `aôï3Xí4Ä<¥¨Ùõ•á%z OÄíÔl“vÆGäïk&‚Ø™÷rfç“Ý$HKƒÕð°‡åã£56ê©„.v});âáÞúyN¬î½Ÿßî30ýq4 \†c”ó+ Q• BÔ{˜E*}ãD¼±j.ˆeQU0¤¬=:qŒ~Ý¡‰{KÁÜ\âÙ^O¿W¢W9)˜ýÙõCûü¶d ìTG~€~]–(îòeº\(‚û®WÒïwbà†Âv8pÖ{»rQ¿~:ùÈÎŒc‚M,ÐL¦_FD悵!DÙnP%Us³¤¶CÈDüm’VÜ,ùAâ»âaD›ŽWÓ]Oð…‰â¼²º>Ì º$OWs#¾ZQ\}ƒoÄQ.Ò™ÊbV¡~I8ôjY¬¨£m­BlŸú0[⊆ö›2§@ÁÁB‘¤£Õ:Êʞĺ?™|ÓáV­m+ìx ß„åp°ÎÄþåÛvÇþœmˆø÷ööÛ¹·Q\ËY¥r{¢wmc¦ÓkEé×…-JY·Q ¸Í-ª¾)sJ OÅZîöÖ÷oëס4(@÷¥wJìcΊüp»|¾€1ÆÀîcÈ“æ_G$¦6ÂDñÝC:„9;H²‘Ä…**`r‡n î Hw—x­]64˜^W]Åe!¨èMïXè2£g¶sM˜xp¿‰ B•Zîâí"©ÄÝðgª4$Fs7]q}‰ßz{¢Ç6ýå@oñÈá£à£ó•áD'ïƒr·@Äþepš8 ßn[ÿ4Õ‰s–Œ,w\Ü1pYV’5œ¹:cÛ£ÚL·MÉß_ÿŠ6Ša“g´Ô—ôöÊ.“¡_È}°  þ…võõòW\(Ä9-kbÛ(ž™QDt™òÜ%‚CßÄ“<Òs‰È}ùÒÕ$¤Üã²èÏ€¡jÿ½ø ¡ÜRå‹í‘GeBú¨êÓ¹îYè@SU[Dz Û±[ÂÕ/y”·xÛNR¾ÍDíØq36o±’ E›£ªS ljٯÀ u)Å I‹7cƒÒOîN^­:oR¿õÝdè}SÇM¾nm­ûm¹’'Vj™lÏ_ð¶BójB z¯,%›ÜZwÇû_5}S¢_MM )Ý2Ö”JFVoÉœ„½ó_\QÓçš–üþPôÙòCK|VÄDªéÚY¹¾¬zÚ zjzK5„ŽRª8ìji?&óúlO”ƒ¡K¶àâKbu7þå iÅ'®ÙÍœÔXM4z:J“ª—Ûæ*Bö!:ÒžP¿Ð‘Üߣ#O[à`뮕¥• }¼ÃíÜ!ÑÅ3©ü:”')“ç‘RqófŠó=öd2`r”ÿÜþÒׯbB0êÀ)ë)w[åïsZ²âw[S$½Â~ÍQ{/þ è’xú q¿”p*!ñ¥Íèí~Àwò¾ÉSô)ÂcKöçx¼‡òßBÙ!Óz’Ô³¯×¿ w´ m/®æ^›rŽÖ/¯>mrPO¦¨d~ oÇ•C\%¨ªè>7¸@Ù·²Úaög2Rð{¦Î†þHYOÄËÂ,è%è0µìår±–ŸÆsȣʤ#¨ÄñÔÐrÄ»§æÛJÄÏ5ìgÑ`û¦B9ÿ{ºÞÑ@1û`óé>e©6š¥ÎI¶'ˆ<‚Þ2"š°Ú…Ïc cuòÏèíª 9ç%ëANf.hý 1ºÖ2›¬e¾ÜØ7:øukDÄŸ ÈãÁ%¶FMåô k½/lˆBX£¦W4©íþt>¦å™æ¯¿¥´Fõ}†5rß¹óv1š øþ€æàªŠQHF>–%4©{ê×ßÅ2‰X#þ.˜*ë–!ˆúé< 6}S÷7µC>ØpÖš†®³X-#{õÛÏ!±ù”îÃà ¿U]-m—ÔdeéßÅtß—«1¡:ªÊ…©#ðB°ÂŒ”dÑMn>Ë6/‚ÏŽÜnÆótÖ€õ41’Ê£fÄc†¸0Ìnr8íà) ü±É̹G­ûð•ýœ`¼Õúâ—žZM«×¤q¨T™éæ£ûD|¸7³ó¾ï^òÏACõ'Ò×÷ #ïi4 }[¶ßÆ{„IÞ)ó`ûßõýȶ‹9MïsHkôÖ TŸF{ ð[H°é¹£%!Ó‡ âÕ x#–[”¿<úÈ@":’›ÜLj·GgI31‹a9ÅC|KÚ”DŒ;‡…ÑFƒƒÛ7OèÞïãšu„i^±d÷¨ŒŽ !}JÛ`#ƒ3OÅ­B×~™£L¿­«´¹.P9[æ‘õ›«™ðROëÔ#¡™ÃüŒ O„ZZÿ#›}?þi?ªU)¦ó “ ‰zÔq~$Ú$Íš 6ÚÙ¶NFnŸœ9;† þ¸Ce"¤÷tR»;í>íÌ]ûŒ•ÑÝièSo»Ñ%¿V軣šì³yY«þLAà†S(-hò å×zˆ~ùéÙb ñhîh³â}õì/ç¯gŽÔŸK*9$0C.ñ3Ã^ R<­Ø¼z™ Û@x¾Óþ©úaL ÐS‰(úÅúJï1›o;ÆLG÷°:»‡ë¤ ½>Ì7_ï±øþþ¢§ÊZõyg¢–æ*;Þ}©ÿ‡%:kV¼SœÕ´w@‘¶$FÍÍÖqN¹—¡évÇU…^½êžgúMt:+£ª÷¬­òÚæÐpO`H¦ n'‘ox—>×ÝŒ†Q-§ÝEjyhAñNúE©Ì”³:A~Ø{fe„$ž^ÿ0Üîþ²ïÌôs÷Ô“½’O§ïÂ7€…ï¯|‰]©T‰ŽÎ’p¥^è Z×;y*û»½Ü½ÁŽŸtübâìoÍÍb¹è¨º¹°L5&UE‘”‹:\éꌮY‹Ž‰0ûN )AbNïñæ÷j=ããËZNñfy™|‰]¸ˆWŸÎ+C7×?œ2™P9÷o5·L/0oGÒ¾¤8BË[n!½»­àSG²æ˜rÏU7w;K¢ŠÜnÔTpçá;PMô.EZàƒÖ›Ø¨¨†4t¾vÌ„A뻨w R#ø uÑp¬]ÚÔÊ ŽŽvõ{KWÑ\«H­Þ°¼š³—Ø@óZ:q–†PN?€õsrÖÅFŽHˆ•›bÑÐõ‹Ë±Í–Òh á”®ã¡é~ÞýE Žìæ¤,Tq—· #=ëÞmX3ŸÁï–Cp”Êxò•ùúµ3 òtû[Uëì´6¸p¦>Ù©-¹HŒë+uÑŒ4;é²¶×yaù\À‡MË`¹"¤Þg]Ýä(TøŸJ]Ö"”aÉIÂë œ\éˆ÷{½˜­GíÅ. XŠ_õ†ª¥ëð|1óžëÊÚE=ñÈ ÄÙ.0F¢Wž‡æ S~ZÏ:â„qÙáÃ`ÕŸø)vÑáP ›±U~Ù_„Lè!*ç¼€Z?ƒ"žÎ›¢w·’‰?œ+.[L~$–fè³V¡ ¹ˆó6éËq·õŠoDU@¬;ƒþ˜±o·Ñr´’Êmzö«,Iò FýÀ’A;ùÝÁȳÑ%y§à‘ IKNs±¢p7ÖQV,…€ŒOwáŽEeV¾ëÏP€`SXcg#ŸLÆÇ»_Äb aÒ!O!g-Ã(«M‰àdÖïƒkÈN~”5kK™ŽÖ¼Ñf}É~òM¨‰IÀHÍJ'¤D¡ ‘×Þ½ëó•4Sº?™ÄSŸ…o¦ÏØ4ßÑ„1xþx€Blfð÷аºŸò¯|Y]ÆuÄ}ŸÇ—ìY*®†.ªå‚ÙʯôKÉKÌ߈aÌFHîèK®¹Þ»hVtÉÞ2,’QÆU e¿?®‡òe8«g‚“ ?|Ä;žÃ_KQC°±áEæ< Dã/x1@ç‰2É­ÂKr¿}: <B š„,ȇ„#Ä^2æâÿVHcÀñe=…QyPw)FÜškÐluƒÔ ú“&ÿtX&@õ»5Øò³FuIdzh@¢ Ox´.Z`IvT ä(šU÷ƒ à¨¢Ç ÚÍY²K…C¿sé]¦ä@˜NÚ`øq’‡Hd Çyr‡àeÍZJ^'…¼ß9\m»ø¦vð²0&…ràjÔíâ’¢ÝéÐ þ£ê *¥hËFŸ¾(Å;Ôv¶”@žVӯ尡Š8žUå§ETàãUã[ŸHÚí/É0›Š€¸e %&|ü2ĬþÁbßfÊmN¦WŸ^ÓºÛ.|ý8wÿ\þ%)‡ßÐÂí‚ pb2ر"dõªœI0iò…£àSY32ÿb@ëûÓg(?˜Zιs‰×HÄ+O(!qÊRïâ”=ò>éÛr€`vÁ¼\-E Äñd•IÍ€Ú‹¶{±½ÚW…>,ËÔÔecºo)g&ú!þ…²!·ÛçóPޤzŸé?Ohw¤(73õMqd~܃| V½Îö,’¢µà‚íÅo BÉü­u•^òÆíØtÖ ,ŽØ¿Â–÷Tªp!¾º?ð±N Ñvu×P.È.gç!êÖϵ?ŒŸ¯?æ õE7 ãÊIöw"b-“»“ÒÊ{„n²6ƦƬ5ŽÔª.!é§ü>æ”$ps“¤·'v¿Ù¤^(I)4g¬7”[.¬°™¦ÍIäY\3 ÃÙý³¬ ™ñ{¢†+…A×Ú¤2˜e\è'™»å/KFÔmSÑuí]u…Æø–L §?DüO3Þ•$m=°štÎU²ž¬‡ò§åIhêf¡I槇YFRRƒ°Å¶e³ÜB’š¢ú¬ÆS=Êw>â¬Ïå|XZÚû²—Öï Åa]Í+10ˆÀƒ›nCVóGm—LvàÜaŸë–Þ_ލ¨÷¿ñ6¬Kä’`Ð öò‰.nN2!¯ «K®ö—<ä-]`CÞvÄ@-ÄÑØfVNÞÆ¢(Vª weñUÆã}lPM ûâÓE\ã©ccìžA06J21BŒþ´Ý]ßü™>JkkP;)”òˆOÅ/üXž¬€F0Ôœ)+Ó‹nýPS™£S« Q-sýH„fZO¡Í:ܬ½vR(ÊÁI‚¬îÈúéºU)ZøOÑ11§FiÁ]¬ºjá÷¥ÂÔƒ=[W‘f×iDÄh}“f«W­ ¡Kîœòò˜œ0è°e?+Ztñ™<ôÄK|Ãyš^p¬&Ú?kÀ•ôb=óª•+3o2CŒ ¹Íás_^©2B÷¯³QIø²bdcÇ6T±§åaóaûÆò›—»tNÚce²êR‘I®Ça}®¶ÎR«'W=k­†¨ã½~yÏ Õ_íyR[@-Æz ²ÑàÈF8{å$Qȉƒ‹q1Hàþ@¶!&ÁåÍÔV=ݸUtлù•b®ðþˆ}:ú<[ȃ”¨H>Çil1Áô o§âÅòH:ÝRsöcEZ‡ä‰¾„Ô·r›ú ×.éO°S׊¹ø±)œôCYZ<©æ5Ú®G™ØcK½ST”Ф±þŸ;7ÛOÑ6,lŽº‚<˜SãöØñ¬ÙëWI²ÍP?¸X¾¿Ì²`U[3ìu϶&ux÷Õ£×ÄkÚéŸ Ù~¸!Tao§É±ÝC{¸Ô@KŽD ?fãŽB~ºÚ§CRcz°­Ü°9®“Bþ¥®ˆgáéZqXÛæÕQìq¦¨ Õ#@VîW?ˆçO ÀD8löˆ=_ëóú~xb-}cLé6\ÑêŽô/ºkѺnyg‚ÁžoÏ’j“×Åsf‚ª«áÅÒÖj¯˜(^$$(ô‡ÌM~Ú䣞Ù hþ”BzE´'øý“úñ²ö·ÌK#ZlºáÂüñô Ú]Jn[S”I׌bȧ&Ù˜K®…)8”U6{eNÒï°‰§ÈÕWU£vRÔ!Òº“pOEp8¨]öü ÁÁ†‚쮂p›öØ¡wã³5J­!fø¢0îr˜sÕõ<ì€QF‚yM6ŠõK/…{L§ypZº±ÔO`âmm£™"Û%áW ¬¹ p‹ËnÒÄd>Ù¿Rm`öí¶><Ä‘òxµ²0œ÷ðE©..–a>z]nŸUd«c8³”ê_b„6Ë»yœwQÎ}J/œl,æ¸ßGu§eħx½#fãóÆ¿*#rŠ˜,µ“Êäƒ6«„i7wúpÜ!õèC™Ú`8g•À–ZƒHâïæ)M˜)AÆthòŸlyR¥®\xÙ GGô*Ú“eßtóJ[ “R¶ ó]-Ãr¹œðšð¡Ù×à ºŠ•Skšií³²â».D™ÕZx×¾.­ƒ–dRßFyGœe™:!hˆ«1™¬l04ÿ2b¯ô”‡-˲ÊPzR^ä{QõvçN®Ó¯€ì†y¦Ç>5ŠÇvŒ”|‰+ꨞvÆ ð©|=è#>•ãT’2Еt4hœŠó鲇©ï%¿Œ€µ/šI¦E(¤|ÖM‡îZެÀ¸XßZ‡KÃH,Žð¾}­ÈÜèÒð#KÒ–‡¹ÍÍv‹w`ƒ—Õ2;:ÚZ¨1ûŽ©ŠÃZ;¶&„µG‹–ŠdrbÖb‰Ô¼Q_o¦“»¶~íÛé? ãƒwK"Vã!%¿Þ÷Kà§5`wr³ó£xd nA”íTú A;- ›‘…hÌó;™¾‘ýÈÞàÓ‡¿Ø´águø²ì½Ä6c#‰ªÍoÙn,~´ŽÀ_d3ØõÂI’<8¼ƒ¥¼M’GuŒ˜yyÈ%kšÙYßIOK^7}9¦¥fL¯d³ÆNË‹z2 hL03Š»Gy”c¢w²âŸ‹’óUøØà„|‚ûäm~3#|S2# q"§ ý¿SÊdàùdýþ±Õ(øªNʽ||šÑ Ilòöþ{¬ßÄ ÷öao÷qÍÖä¥nǑǒÀ+¢sòe_àEW4ßÊèâø³¼€(YšÄ îÇ4â¼Ö)F@œe·€ÝÍ ù@‚­l”ТŠÇˆbdK–W¾œqH6e¹‰3ähpÜË0‚ … ºQ!þv/ÚɳKPQ †îº-Û„h‰èÒ„AŠ­ŽÖ×ß~†Ò6*GõW`Fª¾®âgý{ðT2À³œ‡›ïŠR©³Ö[’}VßNºmsqC5Î$}ÃãDÙâàò1®!D¥xp{ï»3‚a‘Œo”¾³ˆ®Ì>ù¹ËñLÎ|n “e«VŒŽ5²ýÖ‚–œ®-«Aøz4UýVt¤­>?Ãûª¹œñ)æÒ ^1”1Æ.›‘l¢ÄÔHCKãY³£ö~™ºÜ\ì÷#RéX»ÿ:)ûs½lì:˽4‡@ìÈ>£<‚‰iç˜^lù¥ê¥rÚú šÎýÉŠVFµq£ÍÇh ÑÁ¸ã;7QW¢ÏIrv‹}~¿ix2€Ai<܃Ã;Á‡NQÉq¿C:·ëØV(’å¹Ev JDà’¤Gã{Ô¯ŸÕiÝî0s¤]?éï°¨k1 ªß°5·×7ÈPßåf0–_ý ‘ì”§l¯À ŠàƒŒ¾ãïë$n¯ˆÁS{ùÕî—‚}ŸðåoÈÛ}ŸÇ* æ@Æ9‹ÐØÒâè0Øဿ{:`õzŠ—Îm} ñ7ö}\šãÐ#G̡ÙZ\G±p Z½å"MzqK(ò[ÓJ¼qØäuÒxaB::Ý:†AÕ@"+RÍTϙް¾•ó7Ç`Mš)#šŠ£^\…jøÑEeøú(“Á6~v>ón$XhÔE;æK™B¶ï7ß’Lúi)Ús!'³ /i‘Y)8‹’Ù}õhü‡šï,Ó–ÿŠ\z¹›ÿÁsi+<üQà0ƒôÉÛ)8LÇ:]æ˜oñj^·ÔZˆ¥Ïº“Þ£\u¯²€ó)šAhJŒ_N:üï±v{Éù‚ÖÐÈ¡1úºïEèìùžüìrRà3&¼:Ž\°9y¢×V9›¦Y`3}ú“m/ †¦•í–ëê—¡]¢O,|Œm0ìã„8¯ @®¤¢vü‰ªµ¬?ÃRnŠý‚¥'ê¢>æ½@ÒóøvÎó©T~£ÊŽal•Øî’UA+M«;\qÅ Q‚*µ«~#ì¶fñÚõY1í)´åÀ¬å¹¬6ÊnH¦‹²Íq• »p¸¾±O=nö\„yç eÇuøÕw%(Í4…5ª‰`ÃZèFžÝ:#çè]×ÇO X˜õûÜfšõ.–”•‘F˜"ï—¿Ó 1Îí)àd‡ýVE˜=MDŒŽ ž¢Ûd›ã^‹~êiñC–Õ¤¨Ö;‰§gºÛ{sJô=GŠ«Ø”3É(Ÿµ{_çÛS"ÖM+5H¦@kX9bW‘ö¸¯7Ê~¨òVEꆌ¼ÏÚÍi0¬¢g¹9ߎ¹wžÕモ¦édújHÙàözr.ú»¨;¦&4©Ð‡ÉqnÌ£óòå4˜›Wâcü–¹èýTÃ\­†Þl£<Ùê¯âg󥃺Éð©¯EéEN&ôWX…â •4t® ¥<²ìUnÖX¡56ð=×YF&ij·m$HY8ì§„+\‡`÷éujžyZ •Âì´I‹t%pÑ}úâîvÛ|?qbÎÆ ”3܃ƒ‹°-VË/?Xåk9ú¡õÁê¡À0þsuÉ),¨6×ý• šºÏù00©Œ¼˜}²ÄÞ†Æé‘›çv•°,Y&*aÌýn©Õ3B€Å_—ч'G©ùfª•…u¬Ã·¦âͼܾ™O6oJxƆS‚Zp!ÍNKn—”HðƒÈ*¼­©s M¥+cŠxþ”ç^v¤çŠåK&ý}É{¡»•mÔk!—Uügpbè_¶’ߪ°)À857ŒOËØ}5ÈŠ×h’*¹ïM ‰ep»² Kåð§ÓÌš°”ÍCÚq«‡b¹;jï Ì„g¯ƒäùvï@\‰b¾VHpNP|ÕêÈT`x {/Æ)Ù©’㈳øœI+rñÍ»=`™ôÔ-¦šÿRâñxlEz$]äªå±PöðØJÞ²þ$@®a’1E(Q›®ÍÔ6–H™H[e?–aªº×5~§€°üËçmd(üŒGË9tÕWÁ˜â¹""¨» ùª,ãeò ñ 8"]TbŽÛ¼/¸øû@kþGÖr\³œ°_ĩŒßU4B±hq,Ø'!꽃UF0~榯õ\P4R÷hµk˜*]t–Œ¾%ì€5C»Éu!sV>ø´8äYÁMæÆÓ—6É}¾jF†1³ ¡„µ‡Ëñ×Ú;ÕÃáý©v@®˜AÉsx«]ލ‚?´|Æ“ö2ÈÐbAš,çf‡¢`õlXŠÑJ.¹l>ÆR:j“i°ç ]â^ L¦²ûõUü§—‰TGª™ £GE¥FO1y^žÞS ¯^$&÷µL\xéKVÝb4h‘Qsúžÿºßž²4 ;Õz±ÕúÖ±W¨jPý Ð@ÝÆ#Òå”^¨°ÓÁKMmeIëuHyþðËp¬Ú²¢ ›gØS!Óºôû¥‚{9Œ¹ÿgͽgtˆ‘”;ˆf¶5áŸk®nzןÜÄ Àl‰®¹¡ƒE²Ö бÇ+¬ LÈ?´Jè·EãÕ•Ï$Çë,¥ÐôhrOúvÜŒ[µ$5ù.Síw! —­×ñ›e¸9% GnŠÝÍ}Þí¯š–Y/*†+¥ôW¶ê~5ðpÌ.ÈüU?",Ç `3"_gêE‚ Gô¶ŒÑÕAûë(¤*Á=ë^½ýÊ ŒäB»‘ù!±¼.šêxƒZEܯ-Ç[·)pÆc>©rÈ…š½U1)vˆô®óÍè•?I;»I‡8ºQ‰híF1ZOÛh•!~1kÀC¨Ñ 7 hN$‹4Ÿȵ?Áe°ZzôäVÇõUsôâ³ßE|ü-pN:•oE ½Laì‰æ†Ý¢D¦ç¿†ªî¬ eR:Ì+Jî›aÒ«Ôë²[÷Ù9=Ã!"—©4‚<È–ÀxeÝËl?µL2ã9Ó#<}'z2ÆY²“é’ûÔÝ9]¾mµÖå߲ĸu¨”š5pm/°ÔÖj˜õñ>*0:7g@vó­€R¨1ó½]-!ª{ìâš`«~_ô1l%üBRdÔp¿é=Xê²î5)ôÌOÂ{y.Ò{Q+ ¿‘K+nlFF#Ú;D²B…¾M¸d,l0,êACHö#XRC“®9Õ=!µ×μŸà%ÞçÉóV|„ùjC»nNqŒ¯<ëçAN½FÌŒvbê™ÉǨƥûøUPÙ+¡£U<ëgŒÕN’<ĺùJ¾)!/¿êµônžÒi›Ô‘ó̾¼] ]¥z°‘B£dT&1›DG]í´p/y –»¬¯ð„c¡´]f"ª\;@6ZªÊR×`‘XcG®ÍÑÓÞMt‡CªÉ5à§¡Í£ûÒq¶G#UÝ ®*°Á'É…&äG'8ÉuU|*ó"@rt§ £wÿÚX{âeX·Õðëü“íS:GS¿OÜQŠé*;ü²†Ìóö;o¹ašïÝüî0ZºQ Ž¢Áë^¡g8|ºÿ þwï^[ùqŸ¢”Yà\>ÖZVÆq/òiÐ`„'­_»d ¬2œÜWžW¾gT”OÕŠ£ŸU½ÙÕé2eÜ'*!ø‘Ì$«Ãá0B?Í4 ‰T5n &p+¿ÎչŦl(ª¶ûê¸d²Œg8ϼØ^WÑÏ%l¡=Ë—¦òˆÚ¢¤ÛòmÜ ùµ%Ä:x™•Zf0wPŽŸÊû¡þÔô‘‘w›ZõÃ%1¼¼zá„Q¢‰‹ÚÀÌ—ªÖ(WJW…™´~¡”„EŒ™h_¤=µÍÖO˜hí*”ž6ñu²Ä‰¢DÔQƒðxИÃr“ÈC?&ƒjŽüš`M‘*ßÀ»E¢ï”¾ÂCu-~ª àïøÔ"K£L°Y\•–ªœ˜<¢ø;r:nøTù†’¸É»ÝÀè»&žV3¿NïücÏä†jèì+tÍÆq¢y÷zÝ*Í\¶wæº3ÜDYß×Ëözß»~ûÂo Î%öˆ_QM$•  fa:-ÄÎS‹+øtë{^ÉN?Èë®ÇN«wFÅ3@“B úâ=<&BŽŠ<0…%2>C ÒhÕ!úwïa‚y7WT"G÷ß ?¨#‘à±¥y ]˜IrÞ*pÆûa@^¹6/ÚFrÅufµ\ùÕð½Í‰…ç5EþdŽ]ð æñLP™Ö ²ûÜ€÷™ŸA‹Îy¯¥æWžÝ7Ùõõ.ìÅ[<¤¤½ÚÇgèR<ÉŸâEØ>ÙÖ¾»õ=¶‰&ü§]F ÍDmÇón¿¥‹¦±ãêbpÉVpd3*B›S6wÉ)½3›mÄ¿:ógž¸`hrˆ­Å˜†™EnuMSÏ>ÿ:å¡ O>s®Žny!ôý](&xˆÚf’_ñ™©ÿKÖKЋ ˜S„ûéç(ú-•ÕWj6Ô^}Œ~öÁjŽËê¶@y}Õ“ƒ\S0ëOuT^ÓfÔ¸æõ{Ë›ø%óHx_1ã­ !Øš›oìçñ((5©]ŽnI’›"®8á›,›ŸÙ9ëÚz}L¢ ¼/¸'ÆNòm§ü4 ?vÒâp;»·hðúF}n‰äÚ™sý…Ól›4âcDîi 2,oPêÓ¶ÇN^ë!í¡07žJ¤®‘žëâ˜È´Fì=Iýaéruމ”~éׂÞ<(}ö½ø~çö·õo6Þ_Ù{Iá ᮟmy{»i|QLƒ½°p…~pDï}ÊúÎX »G¥¬Š¯˜£;ϤËÌ^7ÒY_V€¬}ýÂá¾øNr$Ô–MQqZ{γ¹Ý¨G¶ñf¯ë&Ü9©ª˜¿Ê”I?ŒñÙƒÒÉzJûž .¹Sës®zÍÈxa°ìÛåpÕZ,Ÿ±ã’Ètø]¢„H§åÎçXÁÒÐ FîJ[\'מµb".:R÷vƹû„E? >dl³nÜÊOž9ŽNïŒ7–™GlÅZ0x#«ì²ˆµjѰæ9ô/UpÙfðIç?öXП¼¡Å†oÀ±´[œ1êªU®¼”Úˆbòúk>oIlºá*Ð;ˆWØôö9ë' d$(N2OB ¸¾§yÚ÷]¤ÒáñÙ¹ÚûIi½ä vßYIF÷sEÿŸ^¡ý±ç‰©¿zØôv°D5xä„ ÒÂè»Ì/wÊiç=•¿ˆ tž»G ª4„œ¡;SSáL-)7vc½_4Ù·'§X©„l¹öô° ÞÛÂN·©´‡ñ‡õ<¬'~ÔY»½YëÑî¼%Tnž-”㯠in8EàÚ.:ë¹€U‡E´ãüó9”í”Øòg-ëøVÌ¡7>¼®e ÍÖ¨A ®6'/­cS#-|gUÒÁ/IñÛÇ+‡÷a茻N¼ÑR± z)´Ð'Ø›½4Gµ_PPg4ƒÏä©|±Öæ#Ñ¿ú=Ç€Ð'uRj÷RwüËbÖ`ƧÉúz"9¼Î™?*5Ì^£%¯P˜S²â;4š»Ö3B³zXû(õÀïaP&ÒзÂQ|4óé_ü ô ÉûøBîÙ-ÅÕØÓ•KºmƒžVüÙšáyHŠ¡L‰ý;7ëÞ‚r“)4„ÐgK苆A$D{—1TIÿ­¼SU~{nÀ€yå›çMö…“¾›¸é5ÌôßÿæÿúZaôKØOÆé¦»©¯CIP‘ññ©§¢hè!:i‚&£ (ÒdX‡×b@ŒEãû zñ!þ×¹õuB…ïífå1ì¼¹¦ò¹áÖ/ gtÙÓZ,±µC:èðêÒ Ì~ÊNæ“‚£rör³À^h~PÚL‰"µ…ž’q¨Ü ÁÕú.,)ŒußòóV4o]Χuþìöé…G,ùC拃–…ö÷™5“ >î”bå—> stream xÚx4Ûíû¾¢VÍ*j‡Ú31kïU{ï„HTbS{ÖÞ«VkWQ[–¢¨]«”Eí¢¨R¿t¼ï÷}¿ÿÿ9¿ßÉ9É繯{<×s_÷“œ°³èò+8 í¡ªHš$”(išƒ€ PX"bg7‚¡áпìDì&P ‰ü‡‡’ŒÆØ”ÁhŒ£6¸ç €„ 1I¸$%þrDzH”Á^0€¶àE±+!Ý}=`NÎhL¿\nHBBœïW8@Á ꃀm0ÚꆩÆH ŠöýW .ig4Ú]RPÐÛÛ[ì†@z8Éró¼ahg€õð‚:~Rè€Ý ¨ ±Œœa¨ß€!Òí ö€08 E 0!ž¨S`¨¡Ðu‡"~;kývàü9Hôwº?Ñ?Á¿‚ÁÒÍŒð…!œŽ08 «ª%€öAóÀ‡ŸŽ`8 ‰‰{ap°=Æá×ÖÁU}Ãð?ÄæŽF  `ðŸ¦Á³ ÂA éæE QD?÷§ ó€B0çî+ø§¹®¤7Âÿ¯•# áàø“†ƒ§» 1vߪ¡üÇc"úÍ Šˆ%ÄÄDAè}Ôâ,ø³€‘¯;ôøËŒáèïŽt8bh@aŽPÌ‘? ì =<¡þÿþ½"0`u‚!ˆþ“c†:þ^cúïóX1ò€?_?Ycæ€DÀ}ÿãþ«Å‚ZZzšŠê¼(ÿ **"}þüB~ 1 ‰ÄÅEÿÎó÷ üÅþ—U û³»dÔ@8"¿I`Nï/"^”Áõgl¸ÿ® ƒÄè àúü­€¢@æ ô‚_!ÿ?íÿÌò¿Êÿ¿w¤ê ‡ÿ¹~;ü?8Ø ÷ýãѳ'3ÚHÌ„ þÛÕú{ µ¡0O·ÿF5Ð`ÌŒ( œ0:ç‰E~Ûa(U˜ÔA††8ÿÖÒ_ÍÀÔ€ÃP=$ öóÞÁDÿ…aF⊹[P˜–ý‚ ˜Éúw]éðs…DÅ`°/F˜•(À„™U¨Ï/‰H4&€ápDzýl,³OA0ÂÉÞ q…bîHGôO‡?˜è?±ß ýÄ`ö˜Ã…þÃ$ „À< p(ägÿÿÚ-ÄÓÃ3пd…¡ò×ú×í…ú@!DsÓHˆT¸Ëóðö³ZzoþOÃxKË1Iæ½Ñ¢hŽ™Bg-üµ‰ûŠvÕ·‡2õf+"ǧèyöÎF|¬^å…,f¨ ±TzWø‹¾½r‚29 éœFÅ3cV)ö“õÉì,q-9SM§/"Ä»…7ž­?¹ìDmXHlÜ¥'ä,ôèx…üÎmì‡æ,lËèAs+ò„›–YžFÆ£—Øa §Šíq´ß|W-²?|x“××›)|X¬ÙS#VII{ËïKþPJ?-UrÞ½f‡¢è‰REz+m‰[$Ç"Žøâ÷Éâ¾ÉýžN:J!7t¼mò¬GŠNËäw/2Ø®å}$¹Ý’ãÌW›É¦È^ã€u2˜µ_# /èÁ¥fàÕwÎ_iO"ËÊO͵°ß7Åá?¶Y»}fŸ“ ²N—ßíÿøXQLÎä>ähúþB:@IÇN©§£Ãâ²ì9t‡Oàëã^X•s*âx³åMû`wÔ’m‘j"$ɬ#gûõVr³†èÉ; 1tæ ²Ë–;1?q2È  WïE§š”…¼Äìk¢‰0Y‘ÅŒ‘ÖV–¡¹d„Bð$9)¥ë^ã³÷OÅÞÊ„¶È¤ß >˜;¸¦¬¿“H^·zC¿ûÛu›${A!Í‚N g»2Î{h‘$XÓvÒŦ¢ùDÈøôbâã [ÊòVŽñß¾n7î˜)ÔG[ÀcÒº&‚Vm¿eì°èK`Èz9¶ÓÓÁ™¾á£Þx~‚{@i?¨&ÙÏ^¯jJmSúÐGclÙÖj?n!ðè~ëØtüdy*%²ân³Ù¨³ïþ½ò¾¢2à&çl„„ðjµv0‡„?.q´I2É×»7IÀc¡BÓ,gÇ&¢5¸œæ{êâmK¶‡-±õçjî'= (ÛêïõûANqJBUï~÷Ò^ø(h¦+öÆWÙU·÷`{ÃÚô>½r¨v+^´¹ÈRÙQd E±yâÔÛb3=•­K¡U[¡ÖÕ­Hõt"Ïí­-ήvOÚ€H’³“sSfFƒ•´ÃÒÝìÖÄIìãïi«YpfÕ+j« - lgÐ3&Õ|û/¥Õ£¼Qp¥3k@iÉ|7A8ƒ—ã2Œ×qôvžöö.s}à)\޳ͺWmdðtݺÒ-rü¬,\³Rw`"EãFÜóÉçß7n5 øa‹ž4•Êîzû%«ßSžëN%šçmåä ãÂ<ÿ€Õ¯_õÁŸTËá8éGw}pŸÒã?™@§¨›*”wW¯HÕ³¼7YûA¢Ô6x+ÌYŸ9ïÕ–¿“"×]ŸÆ,•–W'3´ ËÞ·ZVÕiÅZõ­)=‡fÜ`÷º—Rúl nž¾²3-餼-_~?õPY‡ëMêx{Gø†‚Æ™ž ve}¶÷\e©ƒÆ€ºŸ+äT8Ìç{Sì@ÈŽá ±žF½£¿æHÅ0Š.‚xoؼ¦½hWpÇëUâ¨eQë÷Y¦-vÝ"ùílõ°ÈÔ›Ò‹zœ ÷Íy%Oñõ±5°:—iË×oË-§ºóL‡‹{‘ÎÐÈÌëP«jd©òOtRDm„ÓcŒ>Õßul‹Ðùê—F…µêr‡7<ŠO®O°“F†«?9O1ð{LytäøÙ?j̆BÙyáXz­Ø?;{E1}hk:ðüeß\>JÈ‘SéÈwq¥Ö¶ÿÙä3ykÓÝÔ:ø}Î0ÚõkšÑ"®º24»?ªä§)å p¾zH•‡‹4ë®Øï²yHÅ îãX¾gÁÛ9=o™Ýœ´B¾µ™akæˆûtthMqžž¸ÖŒjå%˜´²bÃÃbôéu0˜ä{ùéÞÜXý2uH‡!k‘Tâfú…§ –a ‘‚èa¶˜¢ Å|±b>Ûh• :;±n´5bü´‚ÒZo˜?(Ð?z¼o@¾`2ƒ÷!CŒôÚe<⎘_m˜ü8å_I¢SеïÌŽúVùù €Õ:³¬ó„:tíÓS“÷k#ýa]àŠëãM¹)>bìÝC{t<5Ë™\,ùJ7Ú«Û¶ ÏàóÛz‰$C€ ŽÞ.‹¾û)á«$úÓV±ÓöWR%õ›]}k^³L®Ä¾ Ôê)¾îRtÊ3«€TÚ]PÞ˜äA¸õÓ¹ö~jJr¬ì¡Ð%Þ,›uÃbñC%z›lëÍ­’Wï¸:TîÌn–8p>íùÔEÏßÚDüFK¾Àþ%!0j®‹>nv†Øm(¢Æâ‚îu±éÝÑ—Çsñ¡£ÆQä­9ì§±¹Zê%ïÚ4Žšò¹³¾âßÏ癇˜û¦÷¿()ȽFDi«ý6îÒŽ_¾xÓï’žó8o´nì¤mX>ð„ÌAîC.%W˜yXÄëSWÓF󗻪³Ò›ŠõŸ]ëç{ð— v¹ÞOÚͲ“±..wÜÂ_`Å}†¸…!'ßìTˆÐêj£ª/ò}DšøÞ‹ùæ>'L¯ÓT! ïžÏá¤h÷mÏVŸ0Ro£g#p.Ô¡9‘szJ Ÿ½tö6XÕĉKwHöð ò­AE 4I/ãÒx6j¹ÖZM¦¾,Ū•?…‹‡j:Ò›Þò[ô(°Ý•ù®ÆêÏY)2i¦ (åêºÝ“^¹Oë'¸Pß4ç7¡ÕcУ|©O„ŸìÛ2Pe×½)–ÎÂð¼åH¡9ê)Atý›eÚÙ…µ´ÖWhxg݈úe‘%–QˆjD»˜1B/†§¡ ­H,u,íÄòv}u›éLÄ-NPžcëÙe2Îþi¨ê1‘ƒuݼãw´q·¯7 «DÖáÊÅ×('>¤§ÑÄ­=s™ö~Ù['¥AÚä£äýÙ—m9×$ü®¿ød­´$øý -¹7+òz’‘g7S"®ÏctJãaÒ¥ÆxWó„ÒÇ¥¨M€oøŒ×T;ýü qF.\Yk_ßG8ä´I¥ò1ò:¹+óÕò½’ p©¥PÏý:Eœ²ŸQÓ˜9Ë@$ðYPµœž~ uXœ6È[n‹Å`eð†;ÓÑv‘êBצÝÜ÷îE!äkëV2B®l¶&‚„ËVô©>w)2™?`;P)n£Nr‘!zh-¨Ú|äï}½Æ–LTø´DuÏi²«^ä‘böæZîŽByÕÍåŽûÏG†È˜—^.Ž‹4âÇ2E=IÛ=Ós¼ýŽðéß´aoØñjûu†B'e–É^yÙ}$no¬ûOsÜäsªÆvU@^²5*XÔ:rãmZs9ÍÂh§êpv¤¶.'9Tævõ+Gšk̽9—,ëÜ]žÍ‡îå¾ÂgÈ•Ø3¬@ðQŒúj7I¢²÷Jë™õ“`âú$ªm‡B•ªÁ’ž‡Þ!s´ËÙlT&ËÎtè¼?W6WW6k‘í*܈cKÑy ù %\Ó ùá£ïÂN2Ý™áú5…©úëÙ1¸öËåT‚îG× ŒRïwªŽßŵý1¥@‘҅ئÔ‡U즙àÏá'%=Õ•âv¸j ;Jݰ÷ø 'õå}³`£kˆC´4ýTœë¡ \…-wþШãqkÍnúòJñ™ï®Õ;ö÷þ•ôäe,íúLy‚@Ô’Oë±ã†bïÓ)‡û*Kû–èñ÷Nºš ñúÙÎÙžËÜ¢û:“'·å / á&·®¤Ë Ýšb˜ÂbçÑTgè¡Ëþ\’/¥äðx9ëú€‡{m-è–Ëe*yW4$ňNßUã<]Q²ÊhsçÆ­æ>Áû‘gËœCQÌ]7ÅÕzž[ÒxC[»¨±>œä~ŸGSÍà©ÒÒ'a¬&- T½·‘ž§25ª½m´öL/ÿ!/ÿ£êŠ"㇙uª_ÏôX_hŽDFòVµO˜wBÅ)å€U\é'0zú­)'W|‰W7¹Ì5ø“âàvϾîIÙMQm¬+Œ¨K6<+\6Wg´¥6®¼Pï÷oñë7°1Ï¡%å#*dS-—¡®æ]ÐÔŸ Ò²NVËl‡|A}^Ü óAÞ³^ž©dyë}!¦ûA ða~0z{(H”â Øde¨¢ž÷)EIóÓê—Œâ±õƨМgÓ}¾Ÿ_§âÄ)‰^¨y8­ã½&}Ë–•ÇP›ØØKð ýƒZåÚìÝüÌ-’¢aeïÓ °Ó× üXüfõÐS92/5†4ðˆ#øòõ] Ëé²öt^ŠÞ •.^9âÑÒh¸Ä±Y«žìÂé˜PCuCR®6›„gh¬;é#uRr³,ùX¥+.âjzîZR\Ñ=dVÃö|±”:Œª[Ú¸ìùŒÎü]-¤ƒËvöºéXÕTuÕVäRYÚÀZÖ°~¼—4MTÐ?`I5©ë\€`~“ªž{)*îJµô#õ{¾zŠßSŸ‘€cT Êg·D=_ZU“bu-jöúð®sÙV ±±ÛXn|‹ãΆü¦7IqFîÝæl®=”)_[ðÖùô¨ ¯”Œa;Ó]Ò[ ÷QƲh. ÇŒ ±Ú|ÿætÿ‡°ÎQ¥KÊUæÇ #dF ×U µ;¥4´²K¨ûí˶ÝÍA‚2÷”,ÿ–¥r 1¥ ÍK%AïÚGn·ð« ß±=ÓÿÎ4®¤u\|”ÜBí“åMø±³”1Bµe1÷:ÉÖð5•TÙáÈ€&);\²^b¯ïìgÌïkŒ,w!ÓxÖû¡PìXVµLc:—ø¥*¼pߨ´—Ï”¤§ƒ~2µ§…¯í­çF¬©•íy7^éFZÏÂk|>rŠy®Š™=W"ïRÖdÒŧ}å˜Ëå$ïmíXj’=Ôm¹ô`;¤úí3“ ™‚°×SÂþÝ\¯‰†&¡k^ÄD~矌Zχ€snÙß9ɽf™ëç;š2ņ =wÍt0Pرãê÷O’¹îk*Ûu½&{ž\³á+¿Þ{Õj¼|Nðë/…u©~ˆÆ´¯¢½xœ…Ã'±íàº|EÔ»ýt~‡"Üùϵ-+¬îaìuÖ¬ SNϽÁ*ÙyáïÀ†xšžöÇ6SÏÒnsOeóû7ë&¶ÖêNŸ ‘”w7ù¼ÙÜ&`ŽÖï%8öVtK^i¿4¼|‘ŸË:S ϵ?8ñ“j­ËÒð²R™¹þjh+ÆÝ£ÜU›¸YO¾Êñ²P8= Þ3ƒ6<]Íβ˽)ènж8÷²’õ¶P£'Q– 4EôŒ÷õ\-ªÌⓎàV]kÙ׬öÑúÏéŽj á7 \zOI´t~ø^´Xä‹Á+Ø(5ý¬tnņo\¬žR«láó­BM„&(d´i”Ü·øCîAúM>>‘œ 3žo‘EϼIe%ëÒ7m+ Ó½ü:ž,£ë÷½MÒräI«2ç¸XZ˜¥LÜْٿ™f~;»áäìÍÁŸ‚(bPcI56]0Oîâmlö2‰5%Р#xE‘— >› ×9ê´°ªªw—)cNí ãÚcçvoýÌËyãn_j'q¿í¬WPt§ò ß7éK3ß)¸Ôçô› ¢VÙõg‰Á¿a«v1’'‹ZXd¡å%Û]äÁ!~{òåó…̯¤8š¤Á³äÝ‚´TX±ï}o†âvˆÖ"æ®î¯x÷ßñæ?­toȺhvtʦE€8¢0†#ÿƒ³ðñŠÜ-ÈÔ²–ÕCŠ‹—y7X4v6ž?SÕÜùiõÚr­“ÕÁoÞ*Gs†oƒ ÏYnRKÒ=Ë:|ôæqM»îuçM¡ú³Ã¦l —<ÿ‰‘ÑhƒC~ï5°åÔé¡1ö‘Æ ¿¤Ãa‚µñ³V3C-\fMþ'¿J«Âóž-=ý#"¶pcÅ%M»œ²Mg9’„ØçÍgö«ó¦íéÆ*þA§j°Ño÷ o?/˜‰7¤©3§[†Øº·Imµůžµë_5|½ó)p‚Àwá´Ûb£ šEýш_š´L*ª{ì£pvŠ_Ý7ùBæüáTtl”ˆ´Ã£,}ysÙw¼½T…ó"6½«”Ñ ŸåÊKïí¬DÖªÞ|›CTDÝwðnBsuŠ‚`ˆÀ&JåÛ—NŽ˜êŒì³ãdúâÚVy#QW^èØ$> stream xÚŒõP]ÛÒ† #ÁÝ5°pîîîî. wîn‚w'¸wÁ=¸w÷ËÞG²Ï÷ÿU÷U‹ùt÷èîwŒsR(©Ò ›9˜%ìAôÌ L<Qy5if&+ <…šÈø;<…ÐÙÅÊÁžç¢Î@cлMÌô(ï`qµ0³˜9x˜9y˜˜,LLÜÿ tp戻Y™ä2ö@x QGOg+ KÐ{ÿ<¨MiÌÜÜœt/Û­LíòÆ K Ý{ESc[€ªƒ©äù?)¨ù,A GFFwwwc;g :€»È t:»ÍI(Ûÿ-ž fiåò/‡ªƒ9ÈÝØx7ØZ™í]Þ—¸Ú›ïÕªÒrEG ý¿‚åþ@ø÷昘ÿ›îß«ÿJdeÿ÷bcSS;Gc{O+{ €¹•- (!ÇòÑŒíÍþ 4¶uqx_oìfleklòðwëÆ ae€ñ»Âës1u¶r¹0¸XÙþ¥‘ñ¯4ïÛ,no&ê`g´¹ÀÿÕŸ˜•3Ðô}ß=ÿ}¸6öîöÞÿ!s+{3ó¿d˜¹:2ªÛ[9¹¥Åþón‚ÿc³‚ìLLL\,\ èajÉøW5OGàßNæ¿Ìï|½æï2€¾VæÀ÷ðÞ.Æn@ÈÙèëýOÇÿ<33ÀÌÊ0ZXÙÃÿÉþnšÿ‹ßÏßÙÊ Ëô>~̦¿þþû¤ÿ>afö¶žÂÿ>bFuuMaeÚKþ¯SDÄÁàMÏÊ gag03³°8ß|ÿ7Ïwà?êÿ¶*[ý»»d”¶7wpÿKÄûîýGˆÛ¿'ƒúß׆ð¿Þç þ3þzLìL¦ï?ÌÿŸ/ÁßKþÿÍþ_Yþ_Çÿÿv$ájkû·Ÿú_ÿ?~c;+[ÏG¼Ï³+èýnÈ;¼ßûÿª ü×…–šY¹Úý_¯4ÈøýŽÛ[¼Ï9=3Û¿ìV.V@3%+©å¿fé?‡ñ^ÃÖʨäàbõ×{ç}Óÿñ½_=S›÷w‹Ëû‘ýí¾ß¬ÿ­+noê`ö×daç;;{¿OÀ;±¼™ßïªÐãï02Ø;€Þ—Þ5úÌœáÿ:Xv£ð_¦€QäqEÿ€QìqÅÿKœLF‰?Ä `”üC,F©?Ä `”þClF™?ôÞ‹ìzïEî½÷"ÿ‡Þ{QøCï½(þ—¸Þ{QúCï½(ÿ¡÷^TþÐ{/ªè½µ?ô^]ã½W×üCïÕµþÐ{uíÿ÷{u?ô¾Îø½¯3ùCï™8›Úß¿Læ ?vÖÿÚÿu…þëx/dú_b{o÷ýl÷'ý_ãÃhö|/ü¾k7ÿƒïNóà_N«?øÞƒ¹í‘ý/¯ƒ«ó?’½Xüß›±üÓÚû9Zz:Z¾XþD¼Ûþ‘Ÿé}{­ÿïûdó|ß(Ûà»p»tþ.ó™ÿRâð|ïÕñO+ﱎï@ûÿÙb6æ[ÿwƒ™ÿ’íô|WõÍÌï\þïþ¬}Á1‚,ÿØpæwQ®ÿÀwQnÿÀwQîÿØÿ÷F=þïé<ÿÆÿ¹í¦®Îï]ƒþ~-¿¿ þÃ}@ )üÒ¼ƒ)oˆu]Hû}0;ýî8 ÒàeÔ5¬æŽ8žÛžr(ßÃkAô¢p÷ìïè‡ ô#–Ò·f-l&ƒuŸ´h쥆v(s“m:ŸItþÇ#9W–ß²]]:F¬öfØg-*Ãî×B348tN»s™’|”-Uwß,Ï`¨šŽ!Æc¢ap¹¸X!B:„3;ªDj…gf;¥É].…ÆO?J<¤ Œ²°o þ*§·ÚL#8rµ#S j.ÉY3iEt£MJªWÞ ÌS¦p£ÑÁαVt"·ýU‚Á²c`¬l Wƒ&@µê…í}(R$(QODGdA…„>§?%¹­ò°R>1¶S1¶£'0Õžâ õ™=æ:Ì3_ ökŽFJFôÏÃ÷Ff×#ºÉ‘:Cª>¦Ð—–àæ[ì5…û‚.Û6…¼ñ(“Ë&µgn²Œ"¥áƒ}–ó]Ц¬Ìg^Z· GÃõßBêù "p½žk­Þ2Rl³Î5SßB?ª×þ4B¨ðÈsŠ10¥ ªLöލåèõ;[Œ’Qíª+ï¯w»!Oª¿¶ª'%¿¨Sü ŸŸNœ£±¤/x¶ºËvYQÉÊQîZ^::nä‹^çêWP×¶Eôm» …û¦k·¯–lLž¿ÆœÁýrf¸bß¿ I’h±ù¨ìx'0o–T–¸€ý×cNyÀX:MO¡þSçþ¹rîòÉ'HLÞ~I6|hTLt<&jòñƒ9-7üOšŸ]bŽ”>¼.ÙWÁYj½ªóâ1 sj M³CxûÁȧyíI "t©m¢$ßX' àô?}ÜL‡6€Ÿ“³üVUü$ ÂöEýœ‚ÙÆ¤ìÜ£VjºGQ¹9?VðäpËonOî틚£F){šò}Nüµî§`ù-Š‚éÌèW¸Ø·Ý ÚðX§Ó‹_öˆ¼ñŒ·Z¹¥™ò`ßÁÝuÌj¬XÏz5¢Ó~“Ò’S³Ï!û0$©ÜÆ-JêV`yL,Ês»P6 qâ:QÀ~â_hº¦H|ÉAõJ(a•¦8úb“;M¼q5mÆQ¡ŸmqÕÄ2z;Ţ÷I±žh?¡IŒÉî*½N9½fV Wh®YÓªÐO}ЇêÝ|ê÷ô°&vžXAÕTg2–æ0ðP8´XÚ+ý“ÎnØ•auŸ×û{^5øõÕ‘q¸ü~ŽïlÆ`–/ïÙÂI¡Ø÷x?^awµòZ/nË¿ÒÞ/¶:d‘Dï•—Ðx&0ðaÀNæ¼ÍX(Øjð\†H!¬OY“3|yˆÇ]Ƙ¾7sÞAëÖÎóêeMÃ7 %¦~Z-÷L(,¯^~t© s ÁU±±ÂÈÞßÏ>;™å—h}m>ò]êWZ•¦zU·\ù>ùDDØnOâxZàkÕÖõÙÖIŠª0A ‚åñ9¥ ¶î—°â„mbK º,ñQ·`4Ý¥›Ø!ìû“èòéÀxGöcÀ¸*ïj7£ü’¾ùI´Ö’­ùeý£Ä¸Ï" O€ Ì|‰¦<˜ŒRÃÈòÊPÅ:Hßm+;d4H1ÓA„Õ5A+”ñªo‘JbŠsÍÚÁ ¨Tm^vøÌ¨mCeAÃŽù£ü€G¯&È%G;ÉY²ƒ$¹ÕÀ];çÜg nšµß`ÜháU^µî€7ñ•\(BŸ !¿2Ge¯IüZéºáBÓ²¡lq¬ÃK_Kz1¯Ëk¹~ÿ·Ü¸©¨x»¯ÈïÌŽ¢ƒ*¦*VJÇ+·P6e×!Ù¯î×´ö¢³~n]·ó °ìú žTãz:$Ï b=§õ[°ÉCŸ(Úªõ>í÷¹½ºÀãY`þ Å–ê©n5Áx¼à´1L$cf¹ îM?­ŒÃBפ¾U¼Ü‘‰ÆÐYðããÀT™¯ÒÀ«%Ö‰K†ù?…ã3¤]Å1ƒ%,fØÓz\¸ËããI®'%µû‚Èçó~Îr®ävºî1;¸-yެ?ZÁeŠíš†sÙ2ÜŸÚžT÷¢øØú ¡Å#–Õ3Vܯ¤óR¥Q³(éóÁmÚßÍÔÎÞÃÛêõ‹>/lð$o~Τò¡Ÿq ò ÅšgnŠ•$ÑžÄ#'ÆêX¥"ç&ß÷3å³'Û/ pû&÷‰Ä € þìØDËñÓoãl¢Ëy„†W†·5}*bC†¥ñpÚSŸùvŒ ˜ÿ™ŠioL¯ô]¾ÄChѽ>8¸/AktèœÄ:]Wö Ò’%pU”#Î…šG= --™eßýûSÉ5«ß2h»óÚ¥ûÍ„ûGËÚƒ‚J™sH,“,þÆÙÃv{ì± W¿Z~š¨w–ë 7 RøÎÁ fô±þÅïh×A²êhÒË^­¥9K;æ›u.{Ø`]TeiVî’”,?LŠðÄø´âPn&¥Æïº Ýfg‚.´RÙÂ.q f)7IAún꬗#Ny­½_€6: &D,þç­vR֑̾N/m†J,Ø>«Æ\ÇE#~£?mê”6oÙŠ öÂQ ·øùwѰbà®ÒŠÜ2fãïbP¯*F֗ǸîÕÙu[ gz¦h®Ðüv?6ñ¼½´0ÏÆ š4C ‰s¿àøŽJ…CÎw}cº3ÝkÞ±ÏWY î–¾plð´RüéÅîL¬W5sº|^[E½!)gÉhpÄn¦ 8€žÙ)Y..Žò±Û›u4'È_»ä•y”&Úvëv»ß¶1^¹ Y·ð¿mÊ% …Ý•»÷)L·@‡øJ¬˜iñ¶Æÿˆ:uú}6NñÝX¾Ô´/×ÿˆ1ÿ”ðÂÄ„È_–+#ƒÅi­ÂÜM9(6µÇê)¼ý>¦Ê‚cT•{Ìl¥Á'MŒü$ãºÒ¢ÌˆH‡¦‹§¨ÍÈÉI(¶§,x4 ”@ŒG¬`ÚņлN‹×‚Œ„—·ÃN’:‹¤*ó>A§z÷¶HÐB¦l¾ÎÜèî†j "—Ž ì…fKû+×ׇ¯èÉ®(˜ßÅÕÌ$É…`C¹M5õaš¤Ž®Ï€$»kcgæÒõmççç !Ñpjƒ¬f$PÓæ›ŠSqXô˜,ýÌ{® ÅB¤þ‰tn½äîLÌüždcß':¡Lyr›çù"‘º N7ªÏ¯T-ÆÅÈÚ?íG¢M…‚á6ã9n=?ô<ÊÕíC}u0¢Ü¦žd¯CâDDµ3:r²)n4ë±ÓeõÆë¸7Ôoþì[ëÍ% ¹Qe§ŸU'KiÓ’6¦ã·›§Þ…Yp>%*ß ^äÀQöqõ1ÝD…-÷ÉQ¨Ùó<¹¸Ž„¹¸Q˜Gï ‘kʇ##óT(# » F§&å®·ÍAl·ÆkظðÛº™¬M€CpøÔ ÷éuRxŸO—Ö PRzJÃ`eÞÔ k>jt¨>Z© ÇœiЮ‚Í$‹ù& ¶ßHÞ<ïgùÍå|P´'4¨ÑYâF·ÍåÍ+Òn è;§œgæh²íõ´.myb^¹,.P¥¯M‡l´=þ‘»<ÂöþŽjŒóK-”Zo±³#E«yËj±tBjÁ¡¼î¯we³x9§5å^Ãí3%؇^À¹;XÈU›S~¯¡óã)£9#rœ”[¶~´Gø‰è t©%IƒLF*¬æ›æËÔç½qWBöO&0¸ÜÏ [#1 ”³Õ¾¿šÉ²>Á®ÀÏs>†ñï…3ú<6Ši±dÌŽjbw“¸ §Ø P©Éó ©N…ÄTuØ(q™ãU´ Vì_} ý ØUc elÜÜë’íÒCXÿCž:»4µ°xR+§ª€ÄÞ+Á¿F9HB¶ÀôYKœµ¨M†6T¨šW†hÁ¸YáÁÏ+Í*ÊL\ÖS~2ã2ÄùѰZu¿©Â+Ÿ»6Îîz…·;Ki´|í‰XX¬Õ?r·²ëÙï“-É»Ý4-–ožÊµH’þ€,q!4¬®5|:Ô>c,Ä\‘:§š€5LÔ÷7DG$ ÝŸgÿBË->9΢Öó³eø·hÃy¬b«nXýFÕÌ=Òå4˜Å8ß¹ÐF=‹Û Adç\‰=„A ×&kh÷yÅ×­Ûb>Ïf#³Ýgµæðs¤â°IÄõSý,jõÀÒÐûëb½.t&’ÃOÂ8Am$Z¸ÇIfäCõ¯:û;‚Øö‚¼¼rŸ½Á-¬Í>il-ÔÎ u¿Žo7†=P*gTÃF—+â•®RƒùRgrƒfoP¿j À>‡ï§—ÎWþßhtzq¡Á$}Y½Èû&~ÅGצ‹«=®)x½á¦Œ BiGX ¬8à Ý‹„z©6ƒ[®¤†zÞC©+ÂéôçJ fÙANUÊ ¾í-\@Û*ÙU¢5AŸ-—; ÙÓyú÷²Íc¹”€ÿàðPÈhÌÂ9–Õ2f!{„‡…t¹S7=/Ò8Ã0ê¶í/l! ´ þ ø§“X³¿òÔ7—2|1àU@ö”RO€b\%#¥!š{µ@Ÿ1””u“LdX¹Gzd'á}ôö?Dô½^E5ñ‰žìÄý†€ÚÜ–Æ[»Ì‰aÓ“˜T¸“õ&{¤Ê|ÙñuGƘ»ÑkU³Û¥`4iÂL¬ VKê=SÏl9+ÁºÓŸ†Õc…Âþ…ÊÖ‰å/«XòXm§‚©·*Íîh…¥èÇ.0i!¤½Ì¾“L‹?ÕËý²Õ²ÐœÈ4ÒPÿÁ†Kù9²z1ô¶†Ù)Ex¤7qBì(²õ€MA¤Üö²{Û„2é¥ïXÙ:\’DZ›Â Øû3aªz–qÅvE×v•2s=RÅ/NÓ]„¤à:áîÉ^‹VšÝ][_Ê c¥®ƒWtè+ñuðÆg<Üž(ôÖs¶ËŒ°‰ÕO«Ðý7üÞ:YÇêq´rc«ü/5÷€lʶz·‘`4Wß '—š îR:å­‰jA•NI;ãL¨®û« üÝlAODÏç#“`Isu¹/qšhÊw…B(aê+ôUÀ僥Öï´ÒØõƒÉ sMs<÷ÁÓf;a…Ÿír›×Û­/:sÚSrËŠÅ…wž2•ʉ4„ÝJà,`ä|ZCí–T¢pŠD5&ñ3O‰ßê±…íu¡§Âxºãã8g…6Éö¿íˆŽR¡"*à-E8Îê ¬[~z|ž0 ª“®LP es@\»ÞR”)=¿+¼­Ý‹qNƒŒä â"²i}e ÇUKûpJ÷¨\¬½'ÝútR/"~%ÓIéÜ®c‡ý£FQuwÖÏI‚Ût˜ì¾¸ÂÔ4ïû|Z§™ÜP¡ Ó`ÊhZtúšå€ÎÂyJ0¦LÉ@àÓ¬d9‚DÜÞ¶7¯(ÐVÚTË€F—¹Α?ŸF¹•/n—ze÷!†AErûmL8 XW64PxÀ’¦ùÑ^–7µ¦l P…$éñ¥á‰ä+?v A~Lø&m–·únq(ÊÙäm›©3Ÿ‘e9.Â…†Æ£tåíÕmYÊZt&3–ÊÀâ €zw e°jˆ0.¾eŸØ‚xªŽÍ–±g@K’vÒGÚÜ$Ä;ÏrQe½©*¤¿ÏkZ/ "Xµ«ºaÜOÓÒþ¾oxd40R=W¼•<‡g¢vRixM¬bm•ù½v‰oÈÔOP³bÞý¿jñq ¦Àv²ýÑ¥f%:Mû)ˆa‰ž¯ÍCX¸$No‡4%ãÖE@LTë s s$%ÉêÈ[¤Ø‰ßI:jeÏæÞnçò¶áï¸~ÄaRv!´×Uém¥æf d¾uâf$¾š—»˜è ø½=¦ÿ‘pÙ“¼kû5›å½ã5™‹ÝÎç7GÀsîÏŽ3å`j€ïø¹ƒx%úv«ËZñÆÈdËñãÛ‡Aë¨à VÍßÝ*8ž®_Ås‘MBÍ‘Gôh¼ÚÕ̱ÀVýo©m?dÄfOD‚‚E°Në‡Dº¦ùòŠ`žmÚ¿aʧ•-ó¹]ÒÆ·@,Ÿyõ[’¥™õ§ ‡ý6±Q ðè!ªÆõÆ¿ïæ±Å µTºlk¬ßÇsp-§]¥é]%„ä|°ªÛÓÆ¿ š,÷f=•"s¥†åž5H%è¿2ç¢C~E;ìvÔlE‹yæ?k«tðŠ²›Q'»ó~@Z s>Áßî5ɇ–ÿ0Í›Fïï*æ9Æ‘ŠGã†-œ~’+Ns@Ù®¾6'v;A’cårY¸š¾ ´?®ÊEÝQÐ¥¬ê÷H‹p’¤ÕónDw6}+ ‘)š¨ÜÍþ•4ÓFAœC½IGª¬Å åËë"T«‹cï©Ñ™à—H¦•Ž+ä¦0Í8“ý€¿àL‰ÝàþóUQfðñÇMÚô 6‹”3ݯÛ\ó éÂ{íc/ük†ƒÐ›NÉ5í—½Ö®iÝúDŬ|GùzÒ k7|ã :ˆì7«ñĨ›ß÷`úÍPxRîayÁ¨ v3>¾7†Ò«ö¨ƒaJÚ†^óK|â+Wi)*iÔÔ`cGïAsJŸç×;o…6#•D½Ò”­Õ9¹«. 3û@°}êÓt;ÆfÑl=‹%K#‚øRo<=^V"y¬éRÙý01¾ÂÄÇÂÿÇK׉æJëHý ÄÃÁÄ@äŸXNˆC;CŽß¿£¡…å^Å™‘‡0¡=±F®&É­Ÿ¯ÛRû†N(6“m‘E5êj)ͨ £ÚKV’µîÙñø[^"ñÁZë%šHÒòÊ ‘¢Ù+•sJ¾©ÞòËF3š•ó{ôE=Àíñg¬%æ~óŽù%†'%ü–p!ã­R᫱2 ‘óÃks«&"¼ØÕ~!Ý»Éæ5Nç‚ üËÖE·æOqO|6/*^1ÒD§@Ù½×;¢f39ÔÒ\LNâú¼£-Sö_Häå—wkaͳlíH°¨ 0ÂMŽÕÔ¢¤¼-Àv‚!á9š‡Y&]’KÌp‡ E>ê\Õ&ÁÙQ«««™ÎQ¥ý—éSg¡‘vî‹KQ’ɈËDi «ÁÊÑ>º ZF§Ï¢ÖA`…¥z¼åóô3ž¤2už”eˆ¼¿ÜÐÄ€Ùæsþ)v-‚ ÁööS–HóN±ë2õnþ^Н>ýá–¤½L)Xÿ8)RPÞ±.¹ÿ—³ õùã;ò18ÚŽpâÆ9*±´v (÷€µâ™Âôà;'œË0l–¦|,¶{Õéz餌õÑ™Ãq5úáEsSé½ãØëVx`“ðÏ <3*˜NƒS¢Ç v³ùf4œeËŠ »iW¨/pFäÕ¬i¸utíÒå#hI?ízZ³øoÁf‘¶0)– ¯ïe QúmÖjyU®±Óõ ]ó(n™±C5N%4Y¤tQ»&¾E¦†£Œõ›A×u’k±XZ+áÚ_ék·¥J;º<ò Ë"Ï¢»JÈÊïÞ;Vޝô~lv6¬î¡Ót/n/¦ì>aut‹k©„ O×O*èÀL)NÍÕ²Â/¨Uö¢sÜzé<5Ñ­ÓÝ)wi_:h*¿å¯W½yçðªí«56Õר§è¨§:9†Á¦l{š¾™›ôÙå%YÞì%+Fº0çŸ(Ή*ý0A_FL-…‹ÓSI¿·üܦƓ–â9N–CVÂy!iôLVyõõ;ŒPUCu5þð3ݰ3»È‰rÝ=(ÿwšÿ+}ac§Þ›¦¯-¨ÊA^Ö+æ;âæäªÍÖfáà[ë¼äšõ¤ ‡ øefÑYèšÕä#5ìºý é‰y)qJÉ‘[þ®ÛÌnëÈ{ùÎ`°õYD¹éMMèJÕl?²éÓn?½ˆ`oÝ(-«§˜¡-“øŒ:È|De­¬yÖU½SÔ‘¶(fñ>‚œ3üð%SÀèôæi×Ó“tÄΑý·˜çïsz×­ç(²1 šv½E‚+¢Ž¸ß'›qј¶ÓßÉš^;šñ=¢·SèHq¦ƒ»<“˜¶ ƒCY^ À1ö=‡Â¶Ê0 [ðŠGxó;ñ¦(!÷'ƒ‰šz9„’¢¬,7j;~ùµe£»v"š~w»8´ÔV(aLAÖ]Ýß Ò¢’c0¢?g…¿É ±Æ– Wq:Åúc'ÿøœ«ô£‡ÎÿŽä—qÚ˜n܈Î&gš¨šøº+q` (AÊéÇïíà±m$­µ×Ouq]çÓ=ÛHj@È‚/·MY³%z§ ÉÃàôÈ.àÕ>Ū£ÐËö]w¾¹ Ïkb.U÷a…û¯_\2Gy èÃãè›Ô_1ŠÔÝюи¬È¤¾¬³!?xÄUõv’“ƪúuËô]a'£o9GpžÁâ9Â0¸Šöuéb±7èÛ ët´MÀô¯À*K8Èn;¤š,Ä0 ZŠ|àÈ›3…Ês_*ñ­¿·Î ¶†i ± š¦o€Û'±ãÛˆÁqŠómˆè9qa–ÌÏsõ$k-X´O܉}`¿¨¡Þô%C8<÷‰¢Þ`©ørÃ’’‚Ïg§*{«`ª²=ÃHÉ+_1 Ûç*±»1¤"2?ò»@Q8Pr—g”ÛAÔVò ÿÓäº)·ŠÕ_O¡§½FFH}J ‹ˆuaª æÎ—pæú9dVÖ²šw<ªÎ?£Ÿ>ë·l* Ötb®y?í-,<'—©&UñÈO¥—1œùb[éMY‚Ó„[ö”3ÑeÕ7©_ÍmÎËGõ»¸ ¤þ„-!¡Ïmç¹#ÚË)¶zܹÒO·ÏD”ô«(ùÁ´˜$Ó •J˜Â‘ö©Óƒœaæ—ñø x¼ÞÎ\¥2 í¬|´oæÉÞEèÓæ!d¶fÕjØ…vf7w¦Ô7Ì×t¤Üçý”Ò°ò®6â=OXûq»¤q!BÞºý‰U–/H&¬6i79,Žó[`¬ ß[α|½…iRj˜wÛ/ò5Â"„Õ_âD²Íé’1T‹‘wȊ̘]Ù6íjôŒ‚ lÈoƒø”ªW¹—K›¾Y–ä> Í¿·? ‹sÝÊóûÂq°±hÇ}DRêô^¼¬ôÕ(N©±7á舫_Qü_Tc÷~©âÎp¼¥‡›O„T¾h} ýÞ§Íp'jÌj«¨p)«‹Ìè„ÃG`°Dì 3Sü1¦û†wz§/Ô•¹¶`£1i“ÇJO®$7çëÊWÚÏgcñCm–/AƒÂýÉŽ ˜%¨v0ÄA ”kCŸèGü‚y¬~Rͺ1>qbó!wƒyØ.ÇݰóˆÓ¦xq"JO7Çs”`„~áþé6"õàj«É¬ÄÌw·1¥EÕÜ3Öû6å‡<óŠé^†÷r:²ªÐžì‡?f&RîѲ–6¿m%Ô&¿ á]ˆÜq÷}ŒMõ䤥MKÌim›^U*-w&$à½r’â«­†ÃuåDÝ»LØ'æ^=Ýa{zË @cóŸ‚sÓÆizK¸VèÍ´2w—DªÒªG 2¥±à&:2íûò鯷~€Ò·Mhû7}Ç(ãœI“A¨ÍG¯›ût¿;ªyÛ)=R â3#ßïËãJÀïà‰Á꜅7Ö¾5ìoDöþÛ‡eP(‹ÙfZV…P±jn†vHzcÚEưCLÅ7»ó w+8¡™žá W'nA7Ýë £ÊÊIöOg»L¶ÙÞ(;ŒÐ{ØnÂÑâ´Ã0­œ‰óß)Þ­á¼hvsÏw5‡´¡C ò$ÝëF˜–vrÖ%ëˆÍú.¹Ù%räœ6oÍé·O~Ýê7¸['Sü£…Vvg$^´¡*?YiB¡K›°ÂÄú¸£ÍúŸG‰Jˆ z'+ïÚÄRŸ×âÚUBà4z–¡AwÛíQ¸ ¿¢$ù—5=®z¨¤Ö[¯ÍÙÆ"j`µ¿R¡òíé­ÛúújHU%h­­¸7y ;A”¸4âÛíÙþ"(UôûÛ®œ9ôyÖ—|U8‘ûÞëâ2MBìÓÄLK÷hUöÓzƒ‹Q¼P¶j{yé[C³G:áâ>^£[9]”9Í«•ìeÍ¡˜;›%¯¾cöý¥¯‰6r+Øþ7ß q0 Ê¢2 é~¢ ¹ß!fô4›VôðWW?8gžAÉSDd—l¨ »þ¦×ãgì/©hSReCŽö-ì·–AS*w-q6j¯@VâÊ¿»XŽi‡Î£Nµ¡ªÃ(6îê´²x¿™º M, aüè+C„á¦ß úž6T8p,8èsb S]o.º k]4~†½>]Æ[ïÒÇpAÃ8 Y7šñ]ø**‚îÈŸ[Û-k²-\¢mLì9І&JIsYäôk¿€Ë¶Jj.EÉÜÕWTéW:>¡Ñ MÆÈVý¡‘M‚³²%£Ð­oËêF ¿#,•‡F¢h‰šóßN½~Ôã’áod!íáц~d”:$@d“úõÓ—+[¯´)»Ì=³ë©n÷2—ü-2´uq(Ý´kn—2È-®X«aNmZå8½¬£iµç87 }M¸´»@ž‘›¤z&\•0Ȫ5Ëï1E£æ}?øhfnÒ!&$‡É·¹ßçÛ©)J¾ü;D¨ŠX”ß¡8ÂB>ËP³³ lüNtðEYÀJ}©Ê‹'¼.,$YMA¬‘±àuŒô åØ˜Å öØsy,û7× G­Û¢µzôé”¶˜¢ñÀ›Ý%ÅWmÙœ$b¯¦ù ôŠc?º±ß–¤Ž²°£úB¿Ñì)àp¸ü-%[®Ï¾Íxð{Çæöe6¼làù.Á„mn_è§ŽÜßS/#[&¿ e¡m5·‰Ç¥^N•·ÖàÈ€Åk6ºcšÈ5~µ•¸?ð¿VC«bh¶'CO–!,vj;¾‚«ã2OȨ͌È–‰ÓAOˆŸÍ¨ Ótqoâ$ÑGb{± #"—g på i”mý<]¾M«¶¸¤Ýw™Qœë¹J£+!mE—â¥<3³¾ˆ3mÀÜ%ÂuÙBlÎ$Ì|ï Žë(÷pÚí¼ÄLu¼IIOðÃãš%™ÉÉ%°Ik›•çú%•üá%Ä4½˜¶è 9e<¯Üü‰¤ØÑ~#[O@Ž?Ö ¤iFéŒët¡ÁÖýdÝ›.!¯É™™È Z×džZÖ¶«ºŒâ§µ}¬!æ–¹Bñ-ïó çpº÷µ A1ÌQc„eÄlñï§P•áòìkÕÔÌÑ96D£F&%N]ÓÚPÂ=ë¶‚7­„<¸iëë˜A£4ÈÏhêÚ/Ɖ¸4åCU;û'®Âw]Âmkæ"åü—Ñî]#Ê?rX£³7ߘ‹ƒ(ÜËŒ”ÜÒöç ø —àDÓkÅØ²Ô%Ó¥ò±ûJož'b¢¢“/ʃΕ“zÑx$‘ÿ4&ôÍ‘þúŽM´ëø)Íåw¸.X•öP>šV§*ãÓ aäƒ ç5DìžvO…š¶´Éõ¡Ÿg!¯WúOL‹mkŒq¶|#¤2 *á×Ô8²_(nQ¤bo«NW*Ù »2‘.œ•[GäµãDá?š@£¶ý€Þ@à„‰¥%FyÁO ÑJ2 #wOÄd“±9uOµDâ‘Ùî—Qή´bü¡ÅÌÏÊßlܘrèŠ*ç`òÆŒÉïNIˆD”ÀHÌofÜÎîN¹e—á–Çpýè–oÙŸCÃ8"Ov>Ã!YƒÉ‹¢¥±8=ŒËDˆç¹ÅWjì_b„ú€Û1e#F¡(P%Ä[¸Ú#N£?÷+Gy£Âºx#s"gh[ÕLÅÆ‘³¼Ê÷‚KlÑŒ‚ª’[”Øí("OïPàvÑ!¥ÒÞÓ¹s) ™¹Ÿyµ‚Á‚a©¿úc»%ö§Ç6ÆÊÈp &Ítj9xPã*Ãllòè×uiû¢Ý•;&9¨Ã+†Ävå@;åt\¥œÌäs)ˆˆåŠ«óç[>½º„¿ ÔÍ“g=Óøf SÐYiókI¨A;‚½0ÑpÙšëVUDFõãÍ.¯dõ zeee&¾@˜Ö– Zç—ãŸ&ET$9ý"P¯N'Ñ ÑD´ë c#`)ð˜¢ZŸT½ÌR¢ªà‚u™,õY^¹êÉêî’cžsEÕ³õ˜èÌQ(÷šø#vÎÕGTq©bçÌ·}ùågímÔ*µ!Ÿ•póoî 2 î´r×—µ¾viŽ™xAmÑî[­ö=6üúšðÏÙ[7X–& Q˜ JY7qãÕRr Æ•ü¥È Ü¢‡È;ÇêÇötsˆ!¥óJÐǂй!—Ô¶ÒÝìô´‰TôbÆÈ“7Û¾ÄCN«‰Ågˆ=7ó̽®)/WGýÂènÀõÝa1G¾ç«M̱ûj{DWÚ$|5¬˜áî²~-3ÞÇŽƒ1Ÿ¤¹Êêˆm²®\Y¨ÌÕd‡‘ÔV*‹›§ o¼wŒ¿`Ÿ¦æ÷×bb¹­s7;É|¶O_Ì!狎\-Åà<¥!t'«>$ Ä)µ›ó6’S"—éxT‚…îé!²wѯüÓPÃäï±¢cÇŠù‰zɬÏä&Ú¦ÁT%‘ñ¶Ðð »R‘S­qoJä}j9¸ ë¹Tè?@¢`ûŽA®=¶ˆxÅÎq„îñzV‘ŒéÅ`ù~îRGìiÝ ] %{ž•£ÍÞR§qþªõe±„'N`ê\Jkqš¤×t5Cñy(èu õ×~~Ëæ‹×à_2Lt]ëÛ )"Έ{;ÉñcøÚØträ$°::ÀÇ®û_Cñ"©ƒ™ª>-"¿TÏCй‡ L±¶µ(ß 0…ƒÎRúuÊŠŸÈ& 5/‹ì…ÆFä³NÓ«Ñ57j,ÍEÜ.™ ÉŽ£°¾˜ZÏäÂkuˆ«)YÎ÷¨£SЙªiÊÃÜ+·ÛäœaºGb7Ý•]{VÅJo° !.íQ^m†‡`rƒr–Ï>nêÂZäªl Íh¦Äø´•’ÆÃX¤Z§È@}Œâ÷ÁõÈÑ0=R{Õ$äpËj—Wyž×!ì§ñvð¿uqõ   Šö[!>#á©/Š@Nôñìšš3 ÿæ6utÚ‰†XQNNNB}ë{6m‰mgR¹€M#Œ@gì”vÊPvú®AG£vž(…ÑЃdž¾iKøR(J:2*öË™”HSj éóëë‚õF® ?AØc2…¹¾LrÖzWì—M>Ç×Aùj¾êD2ÐLä¸åA¹,­íˆÏµÞ÷‘ã§…5„Mjå$™/`:Í2ø~ÿ…5•½{]Ùaz±Ã…ãh£A_ö´ËùØ£T„*ÒÓk’“Îbþ¹¸1ƒp—ø ›jóÛ´†nÃ7<¢‹î‹¾¹+·±…ÆyÆ-C½hO…‡Wȱé´4lÅK½½Ô/lÎ%ˆ‚:¤oÀãôoºNŒža5©kJÛÏ SB¨þGLd¡[Y·Ãs÷–"=ª[ŒO̵ªý¬Øå(bA`OÇ·ÉûhÚÑß»m*}4=ÀGÇaIw,Ä•œcäQ²7ó*ÔvJ8i*¶Ú´4{ý“k˜¹?Y”‡ 9rª#Ðr w:§Û€nßÑ^y`C‘lÂê`9Û0Y¯&l Ÿ7¥£¶-^ùš6LyÇãóõQ© k&Ùl)Qw%¨VhЧdœ3B„HtŽ#~ñ£i™ÅŠ4E,ÛófèZ<ôhÀa̸W6z>Ä©å–tCÊsû;ÆNuáklF5X³ÐîiRŦߎlô:„ª ‘—³Zî-3›zÚ`@ó’}ž—Þ˜bœQ1Ý”-6ÓÞÑTXÔ‘Å+MË£4±ÎÓVÒo~4.ð"Æ]j »»ýŠ>JpÏr,þs±?t}Mk›TæÂ¶Vl5‰¯ÏýâÑúôÂR%~(‰ݤÃ7÷•Pû‚ØŽ¡r .Pj!lîûáî;.öLïšqK7¿’z2H¦‡‘2)Ìcá¾x¸’ e»†¯ËîõL” ¼üÑŽ×?¡9LÛJT¡AÔ" ~i)‹p.±‘Û)§4RìçÈÉõ.-„OÀ-Œ®Ï9ê¸æê´<²K&:PRºß-c?z/mއoÒU“lzþJœ\Ë}ûy•ÁñEê2cÕ¼ÓÈ\¤¨|Žˆº$\–ÞìiŠ>À)Ø»‰[`‰:h¤7ç“÷VÄ¥œT.ÓçÌ–îýqN ™8øþ¤jØÙ i’ Éîúeÿ'Ù^`0B \g{-xs”Ä× Æ„'r½VÉGqkm æïî•4"~Íp4_dI`3|nFß|¦ ì ôæç°¯›Ÿnp¶ÝS‚ ½XƒzGJädÈx ¯(Üàø^q"ÕŒ˜s5R•3¾!ßàåíiïÍÀÏejy¼âÜ¡UÞè&’/!~8cÝK{¥_Pw¶Bƒ‘Üš©ííj(Ïúœ=B–],µJÁËüÎ*…y깫Žp_­æ³ÓÌ”©mªZ YË3Áж %Û4EÆÞD—·ø[®¯‰ÇÄ<´>xµ·Â¥QE»GË^A#uû}²-`4Þoȶß5`L­:—Ýý“û.”Fׇ fËZ1ç²ö_>?:‘3'§¬›Y0Ú#p_4éãnY£§’š³^¥§ˆ0úd]*{kΘB=¢[þzè*ÙteÅ)ÂdTν#!‡‚K ø!rÚ²½zmw$´âƶºÁùhA Ó<‡8×w q';yTsbæ„ÛÍ\%c",~øsànì,ò˜\Òùïˆ)–Ä+'‹„‰a»;US+6½uày`À­8µÆuø|xº¡nì"jé‹Cï ^lZHBoYS÷ÅÌþ²Nô§„ô*Sz~ÒglkAOGä~Tq™ÛV=)š~A~ÈEÊÔF ª®Cù ¥²‘+AŽÐÆ„–þ׫…qÚàH_¾òK q&‡Ú¦àfÊ‚Æ:X XCŒ¨M8ïœs8¸ œî»g"ÄgsMć|ÚQÃßj?§mé×ù|ûúñ“ÇNûWm@‹0W«vã*7ô¯½˜GpßàÍËZ'—ôIîžm*þˆ†]JúOäͳoç°‰:Þöݼ=`Ñýß9«DB^׬ῠC RJEŒ¡˜„]s Èp)œøE™"êàÓÜ&žWUÃ&Š•? `ÛhJ€ Þm™·¾ÊU;dý¿p4é–3)g#k€ è bÑa]´DkM:ä’8wÖÙE­½ ³­à+ýZ0µüp=t é‰4d’¤sB²Õ+¼bÌR9ðŸÈï 0Ѿ¹tÏ<6Ü’Ý›Šˆˆ0fŽÜa ÙLvMj ì^mCrѶÚh;Q$õ §#užç6¦~Ýâ’<ådÍ[¡Ù|QÃú˽‰‹Ò“ï¿®éÚÙÃð%¿qÓc«:â´aÅ쌵šæ™Pâìs”&cv‘Qrƒñ™Á{ôwž]ªãt£ðËøg‡Â«lÎr?{W9ut’G_ͼAyŠ˜ú€sµãì™™4)–4¤ËWlÂmw¨Ml]<Ú€°|NÆÇþSeEJT· gŒðç­°ü-kÞ b…–‹þÇǹB³}wøùR{¹;8ƒ1žtfVé¥(‚º%r¶èÄÍ’1hî©N*’ëuVEĈ¾*Ðb<ÔC±­ƒŽ³w ˆë–Š”‡­˜ÇòÐ"[yúN“DRõ"ê1b×87 æxª¦¿%ùv§9ðä*Ê!¨Iýð– Š‡Tò‰¼-­ÂNÓ:RÔj:ËצóâZU]é‹%2ÐŒ¬ÝȈ̚‚O 2üRä žý~$y3Ù!ÂÈ+.ysœ‚ÚõQ³K·ø^Á¶»i:|ä"Ä_]%^ª&µa]Ò¤JXõÑQ%ŠH~|±Ó7iôƨÊ8Iæ¶'ÀY‚è3¡Êâ£{i¦]âçþcL_GÚÒ)¸87t1UÈO©8ݹ|7Œ­ñowé¦t3 @í³íüØñbôµ "pÔxsmš”J.¿_¼?{i |2·ï»Ó¦7"T“˜Q(Eħ€Ô­*Ú,lÿ––bùÒKÈ'M%O…H6ZMé Nß$‘-­ŸÖ'§wâÙrH#r5JÆlU>oó‰SD±Û‡n¿v¢úίÄóØ &]k%Ê` Ù ,7O¦× øÝºˆŸÙ>ýÄü._–bÑæ5ó,êŒ-§~îªí3ÕîVêÈLËfëø&Ų~uÁ)0D5•(“'5Aå ”iðI »j‹¿#zþ΢‹|vUu—üàY9y¼’ýt= ZéX åem𠬀1•˜l#jí×ÇG˜¥4ýÍ ßíèKnWoIâ·LS&Ü¢õ¡«J8šKt§½þ˜)&wYÇ0¹Å]–ü—Ëå+•?õ¿”Uüt6ÐC8…§ÉöÕ´.ÉŸöZ^rÝèL3_ÃUKâRxëUþÚ»Â{š Ñ‘}Í)0lÈæmt-®q#„„ dÖøÙØ µç‚|tP(“ ¿s·Aùxxª6í zÇù{JžÀ~eçw¹Ä^D÷¼>4]SdD¼q/‰‘×ë×5Zè}åN5˜hÂ;‰Ù€8ÓGb1³M„ßè†Ë\ƒ±nÂÖDì"åNpD‰Ëñ[»Þš’'†Ö†|ËàW&J†B'½²ü²¨ öÚf >Õé)_ÀTd4)WÁ,Œ!×ô6©(ƒ„©í=Ô@;ÃÔ!Ãd@üúÐ2óð’#›þ@E k@ð I…¼(^ûÿ—hì†Ç ŸNy°çöHf#½óÅö¥cpûÖßp!ÎÖµ1DMü™b 1^õÎ#is6í÷Œ¶t—¢‚ËWk*çKØ1LhÊâÙT%Ynµ„¾=>Þ†;#ÆÈ²k•–Í”quîÈòÃí®åþ.š1‹NÙ£5õ¸uD¼“õnô’éË?rŽ¶Ô„áõމ˜° 3±}}ϘÎKrI»ú~nÚxŒ}Õ±š¬Š÷©Ù,ÁR.õísPŠmz¸¡Ðú©ÕŒp#(†f¿3ǯ0•ôχ՛ wìôxûôyM'žz­1PMù {å'El``»ñ“fn–°óV:]"6+…8ý7­ù6ªïP“8Šßw)Ë!ý˜Ô±ÜԲ·BOž‡!üjËɦ!Çy¬YÀøØlñ„)8õ>Tö*°ÊÄ_nÏé’Ñtéa¨oB€ŠL¹¢hÈRŬÌ@¬ÓËA~ÀœÕ—jÌ~6å¹¾hZú¡5?ý‚ÍÇ*ú•2rßö(û;/iŸÿÊ[Wïz¦ºôeT<âÏiO6ÈvW»œ›$!û¹PHþпí¡3þŸ“Œ]zÈɵǦ6›Õ~ò as³qõÀ·![Rc,d -QcûI°G<§zjþ´ÎÖ—nÞæí`…),Z\]fJ¶êì!€Mœ5‡ ž—º " ¨Ã˜W)éÒ’’ˆž>Ïó—m´FP]mo?68Ç:³ùéuuüz2ÐjÊ,0ÔË“ž,]LàcþˆLúH5â,¤!ðh@êŽÉM Ê[ÿpò÷šÒÖ?­†LŽÊ"‹ »Vóé…ôz9 &ÿŠÞîTä[Ê/ed¸x[МÃÏhœhêÊ'_‘ú+*N—°¼ëÑÑ¿'åwŸ²ÃÍ“ÈMÓ-4a#*'xèžšÇMGÆiaSD0 @œ¿‚Õ*¸xˆ'a*ã»:3 ÍÈÈLL’€§½ÄÈ ßQçùœ×ÚyG¶ÖüÌzK¬=4ä&+éz }[³£çÔYgÀÏGÇø¥š¼ßp`89!69/ÿÊìšoõÕ4Ôp[ Ñ™ Çÿ  Êñ¢  Ñ|9‚;¼®l‚ï¼7dÉ)O’¹áDÐâÕàèÐkWÌ›7²åê7*˜þ9ƒ©^ºÕXÉ|…5—²\˜Ð“0ÙAÔI¿é:dÊáé"“ ¦S´ëBÚé¯ÐW{ajJÂKî‚uÆ–;‹QRŒŠM÷‡T"ÅhôjŠH½¨{q½Ú ÉS²êh¾ôÌÆ/Z¨ÐðêqeëHõ¸ÁOmåú$N‘YçÔ1¦vc㱟ǗÇöèÖÈ.C#!ˆÃƵëE\%û 7 ¤i´»5yþ|õu"{|I–?·uwȸÞNiP4}©’Ñ…ŸoLëµIJ°B(ÕnÜ# ÑØçI_†ýrßzœ0Zï%â[Š«€¸x\gÎf`y7*¼Ò=ŠÞM8¸:Ó©êUÈpgÅpòût²Íƒæ-ÎGY8þ9¡ƒyw©òÝÓ,ç‹ A ”ø3$(õ¢ŸÑ˜šø‹Ñÿ˜Ã!#eÈݽG©ï.¿Ø—ª=¯J?¤¤4¼wìˆsìáíÝ<ðxe Ip’ú'Å"©# Š<þBnûc诪mY×nª‚Gz…/Ñwüˆ>Hl˜~ë–š¯Œ5Lù˜Ÿœ É¥3½Å‘u3}»|3AòE ¼ÕžÞ[#x± èâ^e€ÎðtE0a@zÀQÍ?àÀýò¥w³[£@:ŽM».Í6µ´Ê~¯(HŽLz”@¥GX«ÆïÛ´½×Ô|KÖ°Úꛜ"ÉF£}‡ÑtŠ4¬ÚŒî±Ê…=µö ºB+ËýåÍZ@`ê3£ùë/Ñ4 |̛ڀKLÞç§œS)Œz ì«óÛéDž5šah#:°@ýµE]¼ªBþJ/¬hó“6úŒYoÏ4\“`ãîÞßðÛú×kQu@¶T_m,`B¨–2’œwjm“{ór4z‡ŒfÌrxqÓf=C+ŽY\2ÁRpd‚€³˜—ˆ )¨!ŒÚèÎÉ–é\ÞÈᦨì™ä3–^ûçi Fƒ;‰AV³Ð¼ñ¿u;•ªþ´&H±³ªAB®ê5oÅ;1^³{ž•¼ýø&Ÿþü+¨sÖèžõ’ƒAd (fL\Úìï,þ DlˆÞPɺ"Ç}笅µ,—•%ô÷7Ø××ÞfÖ?‚ˆ†]ç@8¸aB2â¿ålöPÜ`a-¬¨¢ä"µÆäïA*-òÎ6N‘s :in \h—a[Li!$rnð{ø°$ăD#öáª2[‡#{Þ9RØÏ:h‡Èé$Uñ­©èI¨yº<#.qY‡:­C]„—*zWŸ.K‚Öe>¥5Ý\2)\}ÓèhãRhxI½C»†oß ƒS‡SýêÿwëÝ´¾rÀ 9ïHoÏß X`îÌqÓ¸ÇvAs*›Øm¦›ê2’±Üj:ŒêRÏ7‹ÛÕ=¡ºø?±Û¯Pý”a÷T„dP¥õïd¬j¶Ñ¦ïoxå羚ß.Òý”›jOôöëøh¤ÓÙ“è¤ÚÊÛ’•ÜHO~FêD¿–q>†ª%öu‘§dÕõúé>ÝöøP~] óðe pá|f¯ù‰23nF;^jUšCYìTÉ\^IXÔŸÃIbOoy‹&Fà|Á?Òjkyå]sz-ØGd ÍËÝ ;Lvg¦*’ž{\²Ýì£4lA\ˆ;¶µ=^Ñå¹[C#´óPº:ºbâ‚‹,ÓŒäV7†ä‡Îòý8“ºj÷i/ÖÅ–rœ=¯ã[ûî€tÖ¯LfÆÈ8{M©WÀÍ#ÓHº‘[º^tQ¼ Mâ:ê.sq½j=B'ë:¥ž ÈýœçœåZ%„5£O›,ð(ÆiÝàqo¡îŸö!ÀЄ€ìüzŒ# ‹ÉÌâçDA½¼uldRP]mŒÆ Öh› qþô£:šd‡_–DÑþ·|/[yu{1«Õ’‹h†óƒ§êi”ëiHt Ç«žG¥¬~Œ’OÛIpðÚ¥0}à ßç5¼}f¹%ôsš‡Æ½Žà7C©×÷a9ÈépŒ¡õ"ìuô{Q rs ú•8ÒÍ3yF{½»P ˜¬Üø€ïåKý‡~!Aó ŸeU~öýÌQÈ“1 {æ{Ÿ•ò!ÇmvªTFL3¹X'ôzCút¦Æ9T΍ ïw´†—Ú™WårôÕF“þEÔÀwG'SÊå˜Ü/ 2ý™fSlÀö¢ øäFü©ÛÚðJÑÂ&5¢ ¥ls~ÀcAÆNâo,Ôç ‘¹ïñvˆ©Špß•LÒ> O,÷4ËÉK# .Æ aó'êV8ÐóæÌêÄWî+¢ÀåPUýÕ"KÖŠ`¾TïßÃé5XšYK³ÉFBJ7‹•½\Â6%}mhÉJ­rÛïPó>Ã)¨ÿvreÈŠk¹k¨ÔÉ"ÅGÏ´?bõÇ^x~ñÔ2.¡.R×­›2È(o„õÔ®®»MáŠüKý½"!Ièp§©Ä|Š~Lâ>~ÁLhSa3 ß ®i1& ¨¼Š˜²´Uzé\­o_r"wb÷uƒ™9qd…g¦„… /ªRèwôM¸áRßv÷x8þpÐï‡%¤uídF¤HñXà û˜yÀ6p/ãYu²íÉO+ èl™ë4„“ÅY€›šY嚘‡šXu …5{´Jëd+„ä- ã²_ðáÛ7(Þò¹ŸÇèlcl—ÃfxÕ4¶ó¹»c …­mê>ÄNOû¿^\YsÅHl"·Ó6×ü¨lçÑ;¼ŒqB[iù¿çëoƒâ¥Ë`ÀìËjoƒ,zªÇ*Žàôs}ŸzÁL'þ•Ž¢J‰Îãƒbïã¯;%LÍ<¹I¨çóè¦nÙ™Ok¥þRH{×ènbXƒ¼è}$æ€eÚ°û–S#€³ÆX–r9û°xlm«Ù–¶rëezådShË›Îᔦ*¤®;‘ް!9Ø_å ¤´Û?ÿgãhÅ%îmQ˜½í·¨I3äÌD£QŒ@–l3ê¼7ƒßZä6³Oͤ…º/}ïÆÑDðu€t³›¡qÎõ Ÿ„ nÃ^æ¤ý­cZQJ¨Ô|s]àü _‡ûœSc2ƒ²Ln0«Ôƒ`Åæ+ à߇W°ƒXË ÷»®S.{C+ïüâ4=z™³¶w3 ZæŸ:žSÐK°àÛ!Q‚NfƳ»oóè‘:i=ROë “ý[ìæ¾©†ü±ŠæÂu?*úLñWsî©= (KaP|òUÏÕ¹KЊlθEB‘\™]©\î¢Â×Ä1Ìô^rAWødß&ÈÅ¢B±›Ph.ƒóúŽDéƒò¬–Y‹:v…€Ý%è϶ q.é6­·DG*æaÿ½Ïм€ï<¼yãF…×?Ž\³L*)`µQ$ñ°U)ËŠu#¿nÔ–øÉÉûi×]™®ùiÂ0Î;½K!½Ž<ÎjöÒi›¼H¼ÛÃ0‡ç“Çi×ù9ÞÝ‘dñÝÁ©¬ó3Sè'ÞE ÚĘ*ôÌ-UqïOq 8Xϲ`óÞ¼¶BÞ$œ§eÿܪØ`&{Ê«‘ FZ3†êŸT¥°y}¸U b‡8oIÞ>(É…»Â¶³Ðp“´ØÆ_xr¥ÃÞ†’Mõ÷O e¤ñª>è5õ™OŸH¸Q†½ñÃãZŸµË-lô²/Áø¯g)nqV,õ5Sp5Òa$ ƒ…®·ÐG¥®íD¬â¦æ°(ýýº=¼jã2åÜšŠ• WÃmKX¡—oWÃú}™A¢ÛZŽÑÚ% ÷ê£ÿÔ·[M&ÓõhÅmzå1ëL—3UŒ(óc¢ÞÓÁÌq Â:Æle¿~º¿0 àõ»WþIôì¦~3“±“ù™/Øy¶ØéoÐg³1ø¹÷?3¾C' éqéÓÝW*xçUg}3\_Þ鄱ùKÇzÉ>ŽqÄö8–ðVƒ¼ºów¯ö³©ŠCð3Sɘ&âeßÉÑh°ï÷|¶ô‹šêÛÕ<ëhÉ.°°p†í!Ø?Ò%ú·6#8š—÷gSNü»¬W1çð{ÕÃÅÕ±º«£Ÿ[0"°!^C@J }v¯È]»–vnÚúÖKFAu/êÅÿ¯ç}ƒÏJÐq3Yf : ßï4Û[ˆëš–TØxwþùÈÀ©kØË£È±q³"Ÿ΋ûX1+С³ññ¤3ÿ©¤Ö2l7¿”ú½-hí¦@ÍZU3žF¾vGG W¤±"R6³€þ=HØ3¨&º …PDw*’mýÔ^2ü1—î îÆäޏr.oaä±%R(Ø&®¿P{« ”œyš|roö°ë<1¬¶*€#ÅÚ–€b, +ñÊ0¬²ðp•"§€Fˆ‰¶ŽMÝϼ¿¨1³âÍ]¸&ðºíšbEË ofüHgÆ6«þ¬|-ŒX£î~ÈÞ¾’ÜØ”¸Õ1^Ä7fTÇ ÌΞ³?‰k“ç²Ý[䮵;óAD†|¶[讀+µo wB~¥Oº"çG—ã]¼jL&åïj¯°ïNŠW§Ä½ƒWĘÊá¿j›–F è¿ß’+Ó–­Afä$¥ûíí’å5äÐߨ0=äb'ƒUˆêËR=a-i¡o—äÑ}?ÊåYn!÷SŠ5 މ/Èææ#½' Aüâ?d2õEÔ®}Û°—©â3ïÍU1¦d¸_ûÁ¥ ƬÎNk~†á±ñ–¦‚§‚~»ê endstream endobj 2561 0 obj << /Length1 2960 /Length2 21192 /Length3 0 /Length 22852 /Filter /FlateDecode >> stream xÚŒ÷TÕ[÷ Ò¤Ô–îîîn® l`ÓÝ Ò%ÝÝ-ÝÒt Ò-"’w{Îyžÿ÷qï` á™s®9ŸYký¤z­ªÁ$fî` ’v°webcfåH(ij²±XY9˜YYÙ‘©¨4Á®¶ ÿÉ‘©´@Î.`{þ?,$œA@WˆLè 1Tr°È»ÙØ8lÜül<ü¬¬vVV¾ÿ:8ó$î`s€3@ÞÁä‚L%áàèå ¶´r…ÄùߟZ3:ã_Çbv g°Ð tµÙA"šmf`«×\Ð Z¹º:ò³°xxx0í\˜œ-…é`W+€:Èäì2üJ  ´ý“32@Ó ìò·BÃÁÂÕè @¶`3½ 䈛½9ȉÐS¨8‚ìÿ6VüÛ€ðOqlÌlÿºûçô/G`û¿ÍÌìö^`{K€ØP‘VdvõteíÍm] çî@°-Ðbðu @ZL „døO~.fÎ`GWf°í¯Y~¹”YÊÞ\ÂÁÎdïê‚ü‹Ÿ$Ød©»Ë?͵±wð°÷ù²Û›[üJÃÜÍ‘å=ØÉ $'ù D„ü[f rp±²²òr°@N§™˯š^Ž ¿”l¿Äü|4@~` ä² Ðpuvùùü©ø/Bfc˜ƒÍ\¦ K°=òoï1Èâo é¿3Ø Ï ?6믟ÿ2„L˜¹ƒ½­×oó¿ZÌ¢«ª%'®ÍðOÊÿ*ÅÅ<>Lœ&v€›à÷_/ÿæÿ¿Üÿ’ªÁÿpûßœ½…€ïï µû_îÿÌí?KCøoeÈ4ƒ´¿‡ß€•‹Õ òÛÿçøëÈÿ¿Éÿååÿuøÿ/#i7[Û¿ô´üÿèv`[¯, Óìæ Ù %È~Øÿ_SmÐßë¬2»Ùý_­œ+²!bö–¶ÿì" ö™«‚]ͬþš˜ÿµâÝlRupÿºoLl¬¬ÿGY93ÈâiÖ_*d£þQÊÞÌÁü×ê±sq€ÎÎ@/dVÈ|±sq|Ø ;jòük´,Ìö®#Hv~ gä_-åæ°ˆýý¸,â¿€Eâ7â°HþF|©+€Eú7b°ÈüFìÙ߈À"÷qXä#…ßÂEñ7‚pQú \”#•/„‹êoá¢öA¸¨ÿF.¿„‹æoáòæ7‚pÑú \´#ßÂE÷_Äá¢÷AÎÿEs@;GÈ.ýº&ÿµ°º˜Áf`g37»ålìÜÿ(\Á¶æ åœì¿Äq»ØünÎ/'®¿}B"™þF¦@3[ ‹Õþ9‰ÿ@ªcê 4Ù‚,\ÿsý#þ{³ÿõÊö·Øäú{>Žåÿç¤Pfÿ".E3[Èü›ç/‰Ýï‚ýZ–ß•â€ÄÜÁÖöOÎ{“åwm ÁúOPî_z'7È5ó¯?ÈzØÿ(5+¤B¿½@,,Àî¸ý¥vpû3,ÄÄòwˆÞò×·èOH:¿«Í )¢•—£Èþ ˆ ü„·þBfÇæ©×ï$¸!…±ýuKüÖCªûGFG‚åw(.ˆ/{Èíò»Ðönv¦¿îuË?(Až/‡ß¤!>þ8ÅÆIÔñ·ÃòaÿŸþs²ý#ýo÷!O dô!ߘrÿ%;üî1'¤°Ž¶n$ùcqúø/ärùëþü×7ç/¡ƒ+ÈÜôw‰ ïàßÂÿ°ãàûGú_vll4 RŸß¸ ‡\@vàÿÎ+×/ûå‚8q<íÿ&Éùÿ,„Õï°ç‘ÅÕÊôǨAjêêáðLj·ßIAbþõçbæàügc Óáþ„öøcƒ!N=ÿ€¨^@HS½s†xò9ÿÍà?™›3¤«®}@^¥ÿá¿>A OòÊ¢ƒ™@ˆuCHçm‘ÓÞ”ÐÕžv“ÏŠs—Û:Â{ºÚ¬ MçbïGû1×w¤h¯EWÉ}NÚšÂÛ“Ô:î}ŒÔg÷:—gð†¦‹NÄIˆ™4E÷}|µm`Û {ä©òœÜxÑU ^Þz Èx6V¬M„-î©í×r+ Ùï4†£ØGo‹=öç‚÷F•&»K/!%¡ ì5öÄ,µøaŠ<þ’OYIô¦ÐR+3タ ™ïxÏë3~}E9l|V[ç>™ J¿ŽF–@¨HY{&Žô Ž'èK Ò2*­%Fû#áH7Î æJîqÊ^>û_V^\ëž\+œœ5Lë{é[l#!oã®·ˆoH>†;ùá(Á_íóöúYg–SÖû|´ž>uœóÜ÷Ô誔:wCGF(zŸŽù²(£™‡j4áºþ%§R-_‡)’Aþ(áªô›5f§oûOœgùzi¼ ÷Þļl“§Kä¸L±[ȬÍÎôp«`ÐÓ#“xr‹G+êùo)Då×ÌkDg;¤O¡'•ÂnúŒ+òïͱ(,îN„Z…O"_Ìëe‡ß¶¶¤jG*_ãDÊr鲬îê5 å‡&AãIMëOQçÅÈ¡ôs.Üü@‹Þ…OÁ °r´±h‰P֯΢»¬•î±TOW(o4|7/¨1§ÔÚûŒWU,t]±­?Aü1iŰŽÂ?mBo®OoÙkÌs¤6º!¼~8P›ZR?aî*“ûÃ^û‚9qG¨ªßO¿î„Íž³ÀëEkfãÇ©˜¼ÕqY²öû1FÇ·Cq£sJ-sôžv­ xûº5©8§ëhÌÎ{/«â-|X%{}¹E+r² Yj»­|§g˜oKÕÅ^|­S˜‡µË²ýa´N­½€µ1ìCÚRpñh'=ðjãk%IvSjÑêBú(G¼´‚¿^X1(ž&غҽŠ*z$³@ìF|´ì8L§>GÀ¯!ñ6gßzPWçZjÉ­’¬³k¸Ãq-^\®³äK~¤ï¡<ÇQ­+†“Õ Z6}~óÂMÿÍC·ëcJFÎ^6{§¾ȩ̈ѱ”ÕÂè¦,««ôÈVÓ¬/Oô+$0”ÈæCÅ&‘”ÕPÔÐÌwü˜äAyßÊébË}ßÌ~*?‰¶À‡ÿYùRòC‘ë-æ¼yjižPUf×ä÷η DÍEçÖ<}T'`ÑçT¼í—#Xt„гãš,P3N¯Þ¬ÏHÕßÄ·±%»JM}jÙ(E›-Àg#üXØ m¤.’”ý>û²¿Ä /Á(ëõ}4 =›¥ÇÍ{o>'KI^n+Ghå¶A÷Ðûx–øˆî] óVúÅ÷À()Ï ]šö‘Š›c®i³·BöÖÝìÛ] ð‹f8‡ñl¨1·‡¦¹r†áY‘}^­ ü±»h‹ùåëÇQI{ÇßJîË,,O©zóïÁßÈTHii|ÊãÆÑ=*Ÿ4ö5@™4¼’Ï߯g‰¶Ù§§z÷ýHo¤«ÄÊæbÚÎ^½îK=×+É…G9Yy¦y_†­â3+öî#ðK¦öHàýí´×FV‘ªØüCžÖÒ˜÷ÆXab¦Y8 ‡‘&:r®ª;2õ«ºº¾ãªÃuõÌ ‰b‰Fµ\|Wbg_D†ÅO(Ö‡éŽEøKiµiöaážÄe*P ™œ'4óÃÞ/àé‚^`„ˆ3ÚdÖPc¾ª”"ÏtûÖ±¢»uWnòUkÖÈ„ª‰ö}õ ¼]ú Š †Âöp.V–Ô–ª2#¿Ò¡O¤‡ »:º(·Aî–ÓÅ‚žN MÀÚáõ[i%ö ¡%Päg–8O*ðôxÊ2½tß–z˜çô4æ"Ø‹Ë[iˆÌ`¼Ê)5ß¶å¢17ÝpbL‘ýÁ PIª;äü‚¤¬l£7 s ‡àä6IÚ2\¿¨” Ó}Õgy4oÎ ÃŒàpæO?Е‚ý¥½c¬„ãx;þ™í¼ÁÏ#@ê”6嫨«¥j·q?BL_ìË,l(ì2£O«¥´÷«l=î¹JÐ:ËbÖñ¯µ^|¶á:¢ÎÔÍ?“®x|÷Å/#Ès—¨RyïH¿¨ÿsd"¼- òº·òÉ{(øc¡3o¡X–« Cê”ÃñÊq2bM5Z@°7ŽÉþkß§·Õ@úšIóƒ7(ñ/è˜]刭œ–ž"HéYaóœÎÚëj…B”q‡ß r ‘Ämñ` ð©¸6ësøÆ\p9³Â~osZ~º_æEØ|¯Fì$©8ØÕë³~fÒ€“4bî‘L仂&#ÿìÍÒ’u(KÓ­Gòn*}Yiªˆ7¦h+6nHs""ºQgÓ§VÑñ3ÖÇ-:ª—Ø_mÆÖ9‚CNÓ5Š$ìý8…[ôžGê|:œñûÞè=óIUä.ÎËÔ|qKàä[Þ2q têžd *úâ„î¹§ê›eÁG¶T%Ò«óÙmDÜÓBÆTêÙC[à>4ݱ ¿X\ÑÆFჟ¢¥å#´í‘o%u'QÀ't¥ }á<åw$=îëͧx¤ìæ¬A×55Ê÷ݧò5ÝÔÚø7.…¾ù‘|j/£ÝÑŸdeNê©eûL‡b~Lñ}L~R #@Õ»kô÷6F‰“f†Î™ÛÜ5-aÚ®óG>W¹Ê&i®KnÙ‡Ò+ª£6޾ˆ¸‡Pž~ƒgû 0ey²ÇOQÓ—éyÒÕ6U (p—Ý*Ö=©]¯j6W÷š´A¯f\Ê•´R£è*nÓR¾÷m!TÈÓÕú6žÉÛtÚËÖ÷oN!¯È†'òR©iDä%ù`¦ié„Z:ñ×î6 ³–™¹\禮ZAK[ÿ˜¯© \ºµ ÓB{ß OÌ‘E#ŠŒ¸d]¶‚î¯×q‡ŽY.·Û£&l´ˆ7Üö-wß&?æG-žcúÑpÚ¾ŸIÞýYÛc¬"·ÙÆC˜9ÍâoôÂÛ‹ÉÜy’ÀÍ‚(¿k‚ì›G~svñÛmÈÒ\ïM“FvùMî+"o¶ÓÅsf6ª¦ˆþCPËȬùõýoK&½‰väæª_‡ i·F©WPÎ1“•²äŠCnRK¥Áóö5¦?(!y¼¹É:åL]^`ÌÚ—„ëšl¶Ñƒ– ubœ®”Šè[²ýÛ‰z½×Û?{¾Ù—˜ KÕ- #Ê•4lß´sË›â¾÷S9"”bÖ4ý ‡µÐæŸeÌ©UÐtN˜ßDÄ©~DG‚WÔ0óáøâ ::Z¹C˜|j¬vun›¯¶íÏãYE¤QÑýð)s•…ûc!NÚQaÀ„KÂÚõjü~|*wRzr%Á xÒ4¯£¥mk>e9¸´!®«… &ƒ¤ÈŸ»Š¤¦ó¸}Œµ–*ö4¼¸£#Õ5¯ñ_I͇Ñ<…²áÂw²ÆÞÒ~ê lˆËæª~ðü$ÏŸ2 Ðü$šB®F”ìá8e‰›´`¥ÃvÓ(@s]6×dTâ„!8MûõûÛ»>.™^”/¦q;Ø"ºÏfÙí׳ॺ¼„Ê2oUzµñòT%õ=sz²[å3üå8Ó—Ö£áå80]nƃ¥°Ĭ›ÅÆ=v…`Y7ߪ}»jt³¸Ú.@þF#‡¤ü¢ c[dô¥“uÅ·t:䱨“Œ¹†œæ|1ìáY’ç‚íŽrnjÙ™d ¾E;g8ß<Î Øße~Rñ‡_Ê;?5 ~¦­´”1êhjô¯õT=‚7 PØþjbt¯ä]t¶bqÁnÑêØ0š™N\ ¦¾¤þ'w‰‚Gì÷½<„¦b~¡¹é¯ŠuæU¸îY0i`LøÉ¦ç¿uÁ4õ4%”‘¶Cã~㵌–ƒ¦¼–a|ÿ<¡dâå's\’…?&Bg–¸÷ù{JÆ3Ï”×¼âc]±¶Ð£Ìë¨0פÓxÜ"Ü‘ZB4D&Yõ+H:/•Œr¤`¾,~MFÔ‰0‚ÐŒü‡·Z^£wo ÚÉ´¹ÇxY²ò —6‘“²•œTƒ¦ªäšQ5\°FÅå4[¢æÝ/±W@‡òÉÔ;lÜm)}«Á7§¬NŽ]ÈjžP³Î;²wjéîÞß2ƒ/@+ß8ãLʆ'@å¦7ií"•Z4µ@Ï \RÔ~ú/“xHÃùÐþQJ{Wïj’¯Y?‘;g¹dNiHÔìÃõòC½×Ÿ¿Ÿ7|ÍTÂFYÇ¥˜üY KŽIø o!YîŠ-Üœ" [žïœ:].6”¢0=h»ÙlFß!ŽÍPV».­mo¦ä7­®ë–nª ÛTížq`&bl©dÃ¥ç0à°³K\–ÛüÉ"/ ÖóL¦_xþaùÃÉdc.f^UÚŽ¥Í¨!ŒïËØ´Üe`„2‹‰#|)ÆÁÔö;;¶ìÎu‰–E@tÇW@¢dÊè̽³ s¢ÝÊÓ) ¥‚÷ãÚé;]“²ycñÚ-R«Òy§oG/yQ_ Œ2_NõÐô(*ÝT =È4íI.QR Lú˜:(dÊíÛϾ qh%òX°$¹äHì[ˆñMPïv"Áº¨¤¹+ÇØ‡Ö¸[t[Ô2@X3/jZŽDÅèoê}0>µ#®)|Jæ*ª-£QæõÀPŠ B`âwFŽ#m«øZþöK°ÄO`Z5Ö¤Ñõ¦~jsùõk9¹©ËØI˜qà•žýÉDzLŽýþhÐÌmq½åвÃ} n'@ˆòTýgËsõª;¸Ú\Ømy~3ë Ž’ vdåÄüñ*˜cîä‚oñFÅDø„zæÃ‰s#>8wwJã‘Í?¨ý÷íݲKÞs®åjéOl10‡š—Qºþ¨Œg;fnö]žë3›}¨õÙ­Ìt?½YoÝÄ›ð^¼ ¼C™„ú–22S¸Å7á ÿ™àC y–iksúX¥×ÑLÅb¾Ö)ÀP;… ñÓ¼páÆ+lÖõ[2Õ"ñÄmz=‰Ñ¡ÌH•œcÀ¤ÖÆ£€`~{ÐÔbo;üžFH=×Ôû&?žwAˆóCx+L}™ôø­r5q>l#mab‘i›zƒ»5„Î* ´2ˆ(¯ìÓ°¹wÈp:ã øÀ;\›¦X’Ê7 d¤4ŠýhhÐ{ŒØ Öäݽ”¦L-Ü3ÛŠ~S3.„É"Ô„cÎ6wÊèY„ž àR'•«öz¶6QËad¤?ŸÅ…h1ÆSó½ùƒôý”Çw‹/f ›òälÝk¼T¯VÌ£çôIaƒ\±Ú½g=vf­ ÌŠùRjtP5xO±}²Ð²u«ä9mp]Ú.h(2]3Ã÷yèBè6í¨£µ'ÔæÑvy’èª-´†-}O˜Lh&gŽèí|¶D`Je>Òo#cÔá+ýâç!®½¶~e—™‹ZñúMÉ‹Ž6Oœ"A}gÀùnå‹ówy„'öñFé.í£ü¹F©J>ù¤’[pf‰a&xg7Äw\Wµ)Nµ]Ö8ýú1÷ý §•Ågý¿ÆŽÜKwôÚ<ÏÎNp8 FPͱú€>»ˆÜ]b}Øó—T“&lÉkË1OÒê¬Sy ù’áä˜Çm0æ{úb2¦dû©ÞÇ8Fy³òŽ—ðØ"µ2wÊŠÊôúÁ´¨ß©dˆå‘‹QfúÞœ¾n[¡‘JÈ—Ô/éPÀ@›¼Ig]Ìì6¾©Ñ8iqîçµ<Á›ÈsÒœ½¨ÍTž;Ö’ ”Ç×8 ¨kÁh9Ô©íøª^ïÏÁ¨kõº3¤bÍN5ŽWñ6–•[i7ï²ðh¦»ÔwÙ™UJÜ:QuX̸iÀo¸02ì[T€$ãsà'E’!K,…7ü¬Å“¹Iä>³Yüžæt[nÕ„ 7©¾9•[Kë'‹++.®ì£Îu’Ê8³n"gü™ñ9AþÈ:kÛ.'ó TŽ3ó„ŠiwûŽjèÍpC æg¯cKS/OH–éZÌz av¨=¹¤I³ô Ì"5êUËG7vâ…8Ä2«K‘tÞù×ãÊAÜò%ŽšYkøÔæþfÔøFø“báø2_ˆâù76?šâ—zí¼Éý|x'@k£‰ºlÈ’ÕÍÚŒ¼tÿ<¶²:³Nô¤Û#ü‚»coη’ÙÙ`²,L뇢dù ~¬’>ÏÙÈçËc%?Âr—¥)/ªVb£e‡†Kµ–•7~Ö§'Ã/ì4´®,ì~ìSK8]Øð²§Uª3ÒƒkêãS¼AŸú×[ÐÔ¯Ÿ•X3¡6/ÕÖ|AyN âèÓ\¹MÖ¤¹áŸºf­öëw ÉïhebÇ¿ð¿yßåw†LÅ"ª%Üÿ0ÿýªñ¨Ž¢T¬“:ˆ3”4$…¢g§û²y’lB g}Y:¿ø6 SŸr˜_ #Áß›öžég†i€ ‰â=ÇV?(G;X;pVÔŸ‰¹Mæa#ŠÝ÷Àw¦Nk’E9’îÝ«ãºUW *­þ1xVîîgúwA˜WAdèUÙ•ÒîœuSí÷7Œ]‚ûgy(”õû ­´Ñ¥øíÔ¯áÑÚ™®UÜTGð.ÃúQ$ÂäUçü>—41³Õ†‡OnÔg[}Ó ÕÍ(ÛÁRŽÌAvP²ÊÔ}ÌŠCôv;:^½ŸÊ¶î„á|ªVò«Ó^ìþ _AÊ9dK|„íÍ/CûÊí0‰¬TÈÌ<2|NOÅEñÉpÀÑËCò ù+½›`ò7áö×>ˆCšo¾>*ã…?câ(^GÁÁJØ$Jj=g†ù€“·»Ý²ÆºD¡írCpìëºs¦<@¿{c]¢s£^^è'+…ÑÚåò¾DÙ0µ+°Ôºz½-%” Õ„eþFÓÔÎÔ« ŒöáØêEÆR3ot‰}í½õ¿”¥™óóFrÁ¯v“ÔžÑUõ…•GNökê* ܲ6TºoÎ"ãàž` Ù´Îg¿‰£9_™ÄR£¬ÌÍ^‡†—©fÚÒÃõG<"K>ñZžÍÜk Ý›ï‰ E€ãT°ü‚…UIãÂ['ŸP÷ög±èDJWè©ëO.=Oó*ZÞ’)s+A‹\—”í*6D³ïËÑ;÷š¢hBy¹êÕI-áFMóÄ•i‹%8ä·?‡WeÔæ©¡3]`;óðG1»mUewSR lYFÙ+Ù‡î|¨oˆOíû‘9·MX=ˆ9%2fxZ2#[v NÌ„ê±o>Ž•.ì 9ü,Ú!Å“:sÐ5%¨ÁÖÉ7Z°Tä×ÎõÍÃUì|»Ï¢h¶@Úô‚Nçcwe><- îzøÖÔã‰Ä…ÝêË[dÐI~å&ðÝ™n Í\ù“cL‚P†Ÿ óœ'C!fí6—Þ|4×ø'Ü%&#½·tDdeߦg8ZL‡K_%úû´>q¢d=?#Â|Mê"5ý)^Ê™lÂÆ–”b})U4œYªŠàÃ!þuo‰œ ûuÀÝOµ—[{þ'Lmš›–µƒðhTMŒÄå«E‰,áà¶À(« åR‘· £”b¸¾¥^þ];8fW·EFqå’­ó㹋j«¬m ÃW‘xù¢ª*éËrJe ÊSNÜ©¾ƒ¨+qN”dfÈsŒ€ìűp±ˆÒ¡>N1¨ÍvøO=ZŸ=E¦bÝT3›)@Yó´\‰j‚R%«TьΪ¯/ÔÛÝT|c8Y´óâa Oy01ÖúN¿ÐÅ]ÙÒÊ㋜y»n39ª½ƒz|v»jµVM¯kj;Â'¦B³ŒÒÏdZ †´å(Fte µ[‹Ñ?D‰rö¢d°©Ð»\m‹J-Âà [Aï™CæE¢GÂÊçþ•‚Å}t¦w2W­Oö‘øæ öB¥Hƒœ¯É™Ò¶½r´AIÁ˜îV|€ðzf–"3rú9–`kÇ»*"„h…ö,îJ;/}6v ˺‡fm9¦6æÖëªÛUž“{œò‘ýtH½Á?ˆ•\á™FÉ;¤Õ;,± ¨†Ÿ¨Õh¤3KCïú¤0‘°Za®cN„%[¢UÙl7èÀ.8/56H6áO@IÖK· ¸m›ýg¥¬¸~ÀUÞE†˜÷t@"Ó »‰]ìŒ7¨[N*chïvyR1ÝWˆLÏ)lX7—B%ø ° k…ä+º4]ÍÇ„{µcö(ç+Ü*2ùa£Âf÷’¸¼U¿øp!s~"ÒÕáö(kÍÛØ×¸b»ÓöO£faäm“C`<ÂF©X޽ìÛQÝsZII¨=ÒÇRSözÛ àÖbmKJ`ù :¢É%vÒRs‡Kvž>ef4²wœ¼*¬:2~÷Zc `Ñ!ÓÒ5á´¥ Ï aä®fÒ÷ ÊVPm-ïuS{Þ&o|µE†%¢‘¼ªº_š Ê0(À¢j+w©Ó*ÊâÍDçVcÃ5Î^§yøY¯¼³¬þÙ{GX„¤·‘¯ Á±–? ´“¼dÞE`?Ÿ¿÷ðœàmrìÝzÄêpÁåQ:ï—VÆ ÇõÊ}¦‘ÓÄB¸Xê˜åŒ•yb©RQjƒž˜K&Ô¬ 3ú9ç>b^.DåiŸ®(ãÙÒP‚š;·¦‘‡¹ZœÖü¨`KD CƒÒÏ\í9ZsL=IW]~Ö/%¥+Q¸©;BX›‘ˆ®(W•/K×ÁŠÖ .u¹Ðo^!¯ï›A»ySN;Çœ½ -ï‹AF6{ ¼ƒ§üj2žUòq{=8_°-¾--Èa lÂ%⡆1˜0B*MF*ôþ‡Qcð%&»§Ô÷#>ó»¸*@#ôgºDŠŽ¸B¹dV_èˆ=š^0ÊÏJ éx»¼)ßG‚]S\ÈíÔñ†ž·ª'×󑬧ÞÅFy)v¡½“$›æ u,üq]ú5oލ³ë.ÍÛsReÀ킽Áå]˜Y±Øsw)h ‘´œÒfž¸ÞJ]@$õ÷Íë½ù¦´wÛï˜fÒ—y H C%:²DmÛErP‘¦x¿¬¸(¾‰ZN™²DºÞL“ˆÿ¨YâœR4_‚™…z˜ÙFñiWAchË­C†¬]Ö,B©zK&å¯ßQuXE;7׺Cø‘4l=¯söô5T]Åè æ÷$!$™E¼NÌpÊ’X¾ßùóe½»ªÒû=Û‘‘Í "DIV·¹Ir ‹n ‚ûp‘ì9YÁ8 –~Á(MC®(SÉwlŒ!Rj+£t©(ƒÅ:‘ o%V˜ñþ+%Õ}u/“ÞP‘³>Í+»bP0—9sˆäå$:«^ØÃ¬¬¹€ýXeÞ·Äž_<‰Ôßìø4ä&óÞ‹£} ·²@&LJ°(¿ø þò϶ÝÔv£ö[#1••ò|˜`É£³Ý©¦ øŒ¦aRºS¦O-Ôõ}sq"@ß+:Žˆp$Ó6‹‘)ô\ƲW kµŒ[-"Ò :¡:åúP~D‚Y¢­>dëÕÉŽÂL½N¸2¢¸NõwiK 2Í$ðÖ~!ùJ:´ŸË@abïœÇIÖÆçжïúmÝɳ¿Æïa`Î},˜¹š^^5øóùa”`ß5¾d3$R ¯Ç)Ú˜OzžøÊw²`Ê`3è-úÍI”jÛNße„‘¥JB29 2rðÈu‰ &ýsßÑ*x[CÕ›7†eã ÌÒÆÓûkü›»ÅNÃfúIr6&Rÿ˜3` ÕmîòA¤7eÓŒg›ôg¨ïí©"¾ä2,.¦$e.µê 0C(ó’¿œµó„ú·.¸Èß²(vú¹Zök‘¥Îª”Ñx—iâS2È5ÙbhÈ[?ÂJ§>¾v¸ÿ*e ‡Ï7ˆj¦Rù½ä¸¢£öì»#Qã[ Šz5„ÿäòn¡”Áa§ÉÀ·ú@ðÔÁEø3 Ú;h"õ9Ý›ÆeÞ¢÷FÆxŸ‚•ƒmÍJׄGÝ9áÏp³V»;ô;Q$ðbĵ©œØ[š¼OáÑ{€ÑJ™OunK[·ýþëÜîªCƒ@ÝûÏKâ«Â Ô“düõÌeü®röz‰·êé|Û6Ùp}†Y¯Tv€Ãn!MÑ£ _z%ïÄ`G{-ÌáÐG£tñ4]Ã¥ûpn7EÂ>'¦“ûœä¨ˆ&âÖí• }„R}焜ñöÇ!Y"ÊÃÒ§´f$wg@ÐV•P›Ó’ÊlžÚ¤Õ+¿×˜U::AÁ .==ópžÝç9Ðî,^¹':l²-Ñ“;·Ìú;´z vW”LNÕ+’3b}·£ï„f<~ršM-%ÉH»#x¾i-8izlâƒAß&P7õ,Ÿù’©•³ì¶Å|‡B†II_1‹F~£^–9¼Oó³Ë‚ãõþŠ›í·@“Ó»!Ý@¹¨Œƒ“Ðn]ù¡ÊÉÅ·føëpöð¶«Ùtoœ=àT|¸HgpcÞ¦ŽF µ=l[j™›{¬¾ê7d€3g¿ ŒDlÞ¦²Äà±ýÀºa9áO U³gªj|=GÕˆõ€ëX…ÿãÇ—æªJR£ŠÌèõ¦ü÷Q%ì y¸äöžË•ÞŸ_ªrSÔ˜Mp‰ŒèôžÁ4 øœsdɾ hù~¦I¶¥µR2/¼½»ÌÁì°M‰<7võpö2Â2“¦ü\¾ÏéÍMÂ1q>Rö±åW%(¢^&âD/Dõ±ŒûÈrWõB=C®$¬P&YJ·°Ó¶Ùœ¨jêðÔ×î®ÜÞWˆb¤6%HÐÑêáÍDï4$@ô³»BRþüUÙ¬ÐÕÕçƒ.“+k²ÁÂ.ÜÕ.ZqÆ 5'Òî"¥„&Ê‹Óm‡“是.âü>v†fÓ˾/á`÷•ÂJ¬ñõ,\vG?>%þÜy:нÒáÖž:ûÐ[É~jÛç£xHûÀ?‹+îŒG'©ZÂ77¡ýýAåRÆã$ÁƒVS™ŠtæúbG›ôu"zùó(’‰p/Ô¸wDÙa;·yÃOÙRç(FßO5M‚E>p9DTÑ´Qo(5ÃÖÕ~{¥-OΖÚyÌE «B‹Œ@ì×Þ‰²6ÿîûae¯pGÁ ×&þêBü¥é‡á|þ’ß[Þ35t%}_©'1XæôzÊþ\Bä7W§ù‰½Oزo‰¦Òr£Xã–2ayÌûͧŒ—«~£¤Å|÷ìhÜ`gÂ}¢åP_屌âÏÕ7wó|n7ó)0QpõÑ””>Y÷› µ‰—½âÔGíš ª#;ÒÃ8VU9Ö–êŸE3?YsÚ}eß œ»Ù·¦t Ì<åØzܽy¡þâcq6Ên……O‰ —Ú$“˜'‡ßp…/w& Ú–=¯¹] @~¾0Ö¡¡NЧÓ‹‡ ü\MÅ]‚ˆ }ÄØÃm£—sœ+;9iñæ’»`v)¾§¤A¯¯¨5âå°o~¶ÜÛþ=úÒåš!唼 &qDζ1¾‡¸?ÀgLnädÁßýaï¤&ÎÍ.þW[¶ÅÇ›vTO/~I/[¢ïL¶Ñ0HÇ;”µ°/rSZ©,iª=ZR²ÆqÌ3ULÂü&E ñ¨¹+2ägo‡øêáWÙ>)×W¬»èÔ­kû^a˜D r”fa$\ë,NÒ2/ Íš$àyÚ8ÈÿL@3CõóÌ„w¢dåÉ>Ÿ˜¼_d¬98»é~«`„•ÿIÒúb€çðAùå‡&1œ}ͶçsŠØl¢^/ÃfاX¨ÅðÞ5oª”—Š›Ï"xqçŠ)(Û÷ªÒ—*¸ÿ@ƒ=_ˆ¯˜€›CGâ«"ŽD«“&d_¿»šÑ½`ÛÚz Þ¹¼hË3›RÉK›nó[“Vròš„U ¬EMSȲsƒíµ†©<8{Kr=ø6ùsa•pÿÀTˆ8\¹á­ú{]„`LK©üWÖuÛÖ›BÅ[ÂHïI¥°ÄÁé]²cÀ°RÊRïWoðP5á&Nœº}¬¬5‚aj3; Se¶…,+d'Wœ¡zÁIõ ¨ŠJðK¨SÔBÖT‡® 'îZëm0>Üå…Ù¦nÒÙK?ئðzÀÅ«è µw½¶Üý\Ügõ©ö.v€¹\€Ò2ÜRb¸ä’Á·2 Út¥e{ÒNÊÇCx¨[±[æñ^>Ý‚’¤æ¤I¯Œ8& RuÌ™taÖ„5ñ¦9:ŸDÂìƒàGÃù­eñøÜª=´qÜ^•ƒ¸úm:º™åG·ÛfñÆýŸKñ3.ˆòZ2Ô ªÃ7 ¿Z'Íhãr €ùcl&ÛV8‡1G2Áu\™ ²1¸#Fv¶Jæ¡-­¼V¨«X!µ‡ª84%èû𨦭Ö(ÿþ%uö—Âï› \æ™è½’›%n ´ÕZ¹Ú^™ª2_³õvÃ^¸³­9o£{ãâôKúçˆô"x3¥Fgìæ¢rC¬ŒÕR•ê½=’•u%ª¨|Ï\AÜC™ôBL±¢±êlQ¼xkÝ?×™ª9œH»h¿h8[t¨kwpúåìs»T3+!.9V`S+‡Â«]¶9dΩÁx{ò°™¶{£¬:?Nk `:"›€fŠ‰Ù nLjƒŸªŒ:C°nDÆD™÷\ÙDÔ]{ Õ}fÆ!³õ2cí6(\RÒ¥ä­n”Š|o óÝSºÛFÞ¨©5µ›Ä=ýû; E¸S)˜Lk¸ÿ'2Íè Dâú=Ô /žoØOñ…=<„#gÍöKèqdÍÙ—c%ðÞ‹Ubåù7ÜŒ(Å`Á± Ë‚E'|þIÝM½ !Í‘ ³/å/¶MqrÉ¡3Ü€tg¢‘5ÚÒS\9Õ½5+å&+íø} zæ MŽž…šw${šo¾¬“°ÿª8œgê?44 ’ž¼­®2ÂÁXo×I“ÒÒ)Tv$Î,w›ú 7«Ø.̯NË‘3”Ï륫Ò6(K*1iä*¨‘utÉ)mâÓÅl(E¢ØuPc4I¤¦+ I«ëò6´Öô…N­ûÚÉ%ÃíÔ îšçvX wÌ! Á¡’>2á´ciï4é-Ô˜]y~öiE50ÀHéÞbšk.{à·âƒ¾‰A\1ƇšÁ«`ÎâZ`,£CÂô™‚­½vÕÚ†ó3푆¡}Û8›|Îq¹€†ãr+¬zý¹¸¤™ÒœÅñXôySŸ”Á¬™Ì˜‹àpàî·ÆÒl Ñ‘‚çõ8ž¨þsigëðTÕBýE˜s:£!á7×Kö¿{É3S¹#8.uä1!âTz·W@Õ¶E.F‹Ø•W©,¥i#K¬êúÓ%S(]+³s†Þ´î­R7kg•†Pí|7jØÊJ2ˆ+7÷ä¿/UIØLå}Õ-µÈ«3¦¿&ÙñÈWQú®$ZdïyeÙÀ“Ic]EŒÙ­\ê%ÚR5j‚M5ǪJÇ£l¢CÃómnD­'¾G¤¢×9h/#uH§´Š_?Õ ö åK{ GøA„O |´§œg¢ö©0$¹$h“E:>Š1Gªä³FòÏÇ÷t¸>PøÌ{_°½¦ÖSäÎÚEÞŸ© ™ÎÇìÕÛç=¢•»y,õ@T+_kܰŠx¿˜,±çü³—Oô8O5uFÃJiºQôÆ:°óY7íÌT”ànÍ/¥[äØŠå-n|ÂbúÐÒ ÍTÝ®é‚KMJŒ[!ÇÂÿ‚%Ô zÎV7jLþÄ’NþM¨^ùÂ@ëy.³ä )Y°¿Fг)£}J‡OÃ7O²e¬žìÉúDã¡+cZ‘Î #a‘”SaŠÄJïU@ľ ‚¸DD/¶ ZÈØ®§9ð¬eŽýÖÉ‘'ss¯rô´Žïc/LˆFÚ¨§©±a­b£ëÏáû—BÑàôœô$ÇôÆ€ ’äa4gEè!ïÝþ¡&d, Ú¼2KeÎG‚Ü÷6ƒQú_²€= )Ò@8ÂÕg‡!©JsPæøÿlH…ÎÔŒ^§„jËmÄâ_ $¼pœæ¢‚ñŠýÙx⦰TäÉ-Ø%Æ5 ¢8~”7¸‡¢mþwAµÕöÚ c \ÍÀh'Jaþð!Îké%a ”,óº®5O3çÝcª(eLºÓ(Î~YÜä°`äQ"@ÖNrëð Nsõë#^£o&‡ä¿&ŒI…$À‹+Ó¤œù¦äsºiŸ–[‚GÒö­,þ-®AJͤ´d½`\[ c¹[Žæ_¹eÒ?Nd¸ÁØ]"/Y¦Ü)¹¾¹˜C•m,A"Yþ ï EË~¾t¢‹iéåY—ÒSô~‹`þ.>…ó)øìm„yžg„Dï%…S¦Œ%åDönNo›Ê ƒ8û[êÌRñ®qxN˜ :fƒN–PªÊýÀ×®Ãï̓ˆ£0wÇ`kwâǢΩŠO£Û8´ÓÞ<Ô$èlž¬&í#£¨½`|á/¿Š‡­Äœ¢ ^ëïȶ*3âôNd°¾ÑM0£¬–nÁWÁ[A„aÛ |¥R@Q²Ýä$¸£áËS_pñ½J5¦Êòç ¾çGá˜õ÷ÙjÕ‡Rñ("«iþ¿‚Ó+¥øÐs±ÚÚxæÍÍ¢é Ž¸]ÌÐɲٳþ¿’`×c3ð© Tª ‹Ä+q½5!g&sï1–ت$†MäV(¬ÖQp ÛkÇÑ*áyçŒÑ‡kÌB8ë?¼7én˜ž*³ü^Ü“þÀÈDšòn0²#_As–áê~OMe&_ÌUQÒ!õŠëÔe\’ WElühÑÌ–I²5ˆÜi¿dÿ²ö¢]›ë>ê¢ÜCä ¨#/‘÷C=·Ø©Ú5Nçòq…1HÜ7Yk'½ 7{ÙQ¢uóãí [¬Ë›äà¸PCjÂXš/‰ãOôcß=±l¹Ð™Û‘WGÎ嫼”Iq—¥.{0Uãц»Ý}ŸÉÐy—i OË,"ä"bŸÖ[«tˆ‡“*Ï"¥œ¥Z‡{#9ªÌЂ±)ûÕá Í-kÿôU¨¬ CkxY8t^sÔÁ@¬ãDan ¡ÉðÄm !¾= 0<Œ¢‚£÷£‰|–€kg¶ íê9‰Å.™Ì•]Óã¼*%î›íµÖ”ÌÝ)hé—õ&0.Ã~«¾ëÃï{¼²p0ã l±Œ)­®IÓeÿ£òu]t_ wY¥i}ý+¶ÅâÞ[ˆúß¾vtè¿l¿ £éû𖩝e+‚^˜Þ̼£yt,QüÎÛ§ç®¶1§uiM„ü R/µêŒqwLÄÏê©"&È¿$o×äÝ'¯ÿMY[8 †ºæN\DÞåù‡†bï 6¨û¯¡ |ê³X ùõî ™“óÂK¨Â5£K³uŽbëÐa×'bµÇœ~z¬,*È©DÆ;ærK!'ú>sÑ3s¯ïE'ѶÅÙdŒ–Џìã0þ’ùùá$’5m¡£¤…y¬¦Ÿ.ÕÏú{8„¿ã¦5RiùÔx¯¥2£²°¼“iub³4…É>ŽDæÖøÖ›p%½ÎÀ™K¯sMŸ–ó") )õ±Ç¶öï;ˆ¢ÉùÖÁý4ƒnùÔº¤@þ6„Ó~ àýÀUpTm- Ù´^"iÖ¹Œs–7rbÚ󿻄·<Þ=^Åñæ>ÁÏØ•™â¨`ÃwzÓÞSúßrH+ݧe‰È‡1M¬e½]à¼HÃò\óÀ\Ÿ¡/J‡ Ë#ƒ,‚ÒÈ5t¬ýýÛÃô†3àìa›–E;fÕ¸Á•Î{¶WÒhcûBÕ"{E݉K@Á޹pfJIe\ž¼èf^Öb‡ô¥L¹¨OE3³õøÈô¢Ô3c`l‡äõóܶw¼ä»ÐCß!_­üûÊEÎÃÔwó—cºd= n±œÃ¬¿ü¢ Äýø0€LŸŠx,Íí5‚Öô•¦«5†_ÖF)d¸BQïvT~.'Xæ\uÖãœg–Ùô'ŠfQ’gg®¼²ˆ$þ££¥}ᮣlÙáÑ^ïæó¢¬9€9>¾?/c‹½¬Åò#Ú௡‹ñ89ùÞˆË÷mÅjnK$ÿ lf>:tÅEuyÊÁ嶇õŒ/‡Á8¥Q·~¨â`‘ÈÂ:êñ/såFÓ®‡÷¤Ë‡K¡Kñ€>2µ33Ö »ö¤º±`fb²åf ÙZ§m)î-ßñÁ0¾eõª‘˯ÁÕ~‡ß³ æJX~y©Hë¬Þ¤³ÊD£@ 5À¡€TÕ´"ÖB vа—m¿ù!ƒzv¢-EÞE£©Ò-Ý^V˜á›Ð'a@0zî¯bö]V'RÞ_¾š#汃ŸÜàh`ìˇ§.Yšùà­ý™½Ã¾ƒùþáQ{ÀyŸ&ô°+Bqóá‚oŠRbjm±c}h `ÃC²vãÔ¯\”[NŒš6©÷ýÉòQ¸å:œ<¶* MXÐ=ã€D"`"DËùå õz­šóF—C¢ü ÅEj¿$;-¿Î„ă¹ž¨òÄôm]LÂ)ÙÓ¾5å­)°ÞŸSü¬+ö×ÌHW K\þËô>¾ú¾òÇ’Ö–Û5n)êÛž?ÔˆPàgÜ[7†hBݤ«øç% _€£’yÅúmtWñx$|¿‹+úžC{>™:LõÖÔÔå…ÿ%òMØj`÷€’Z‘²¡ÀN¶‚3ýya0©(‘ $T›ªvyÕË=¦.èÂ2%zýa¸kׯK¹œ‹–çN¥¦»v…7CjPmfÍ55}u³îã+·SIé'Îd…Ó±S6ƒ7à «¿4Ó CÇ&î Ó:!µýŰŒO ÞÎÕbÈŸ”cITWKNxN}ok¹V¯›|ädΗó4KÎ(i„WÕÄè²g"ã£)¾\ÑöCË0"û%‡ûŒnó|úHn ذ@H†ÊX¾3û!µú)Øç‚?ý¢Žé;8ÓQOkhØ#ó7®ˆË5†Jù€ͧ‚P»"L+­öû2k ÔÙ×ÑL\r¾Æ‹c&n¾9Ý¥H.Éô!õbâiÞjG"ÜžŽYaVi ¨F!W‡ 3=È?ÓÍTžö?¦Âô¯N þ{¢lX÷è]˜*Õ“rsnkÈ3ÖË00G{'U†š-›PlT>)Reñ¿K?Oc©öl²M¦Põ²âkKÉÓ 3Ì=âËv½×¢j®`  ^Ùù|(öVXeU¸ª°ÎSÃ-¢ü ÏgQ€åñ€Æ<Ð¥þt¼,nÔÓQµÆ}.zhÈjt‡f¡ºW«¸ß´°é-ºñšèOS·.ú÷Rvß|O[ Ÿ7óœ¤<­Õrø¯™„£|Õ¶ÿ£±ÍmÀÚGö./Nþ´|¯¨=×DV—¤QÒ›aV0¹ÈxG;ÛDd`—5j;±-£Ì£“ÌbH8Ímò ³7FPÛf˜`·³å;¹–XKfpøsgч9'_±-ðöÊMo½–Mº¨¹˜eB\»Z®„$ËQM,$^\E?ZË3sQùÍo$™åâ•q#ý¬nFÔÏ$J|ã%&°r,. 3LtëÂ'I¾¤~šÞ‰ùðømÛ*2ctD{ÜkíxÁ¨XûéUÕ$|¨¢N* Wwnt€õµÎRaÏܯø×Ò5qÛ¿"aÜN΢àzÃ<{5ïBTw´áŽý觇(ÂHKgâPŸÖ1"¯q2KS< S·ýÖc?~uKõ5Ò}T×,MhÛ×bfÁ–I¾‰R‚B¦Ü »Öxtਫ਼ŸU4'¥[ÂiSY«a]l€M"' K™è™É|ý­äâӺɤ4›žw!¹+O¯ä;¯†ðE@¨€ÉØ[8þ0Å(`dzYî´ùCv^ÄD¬’ .Âå)ù|Û)"cG¥‰,ô¡Ù— –Ѐj è̸ˆÚHè²`ªæÔÅ€H| Ä{éÁœécÖ–±´‚êY=‡îø¿dÁ†œKxc…K©BZ`³ÊUYŽ x"bŽXÎ¥ü‚5«É•Ä¡\¿ D‰;>¹¼u¦ˆ¶ÝFD:]#àšL kq䇡j­!¬*šeš«ŠcØ® 6‘Bí·ù§‰æ»e­t3?&ìŸê¢* Ê)Ù@ÝKUPâ™[AAÙ<<ѓ˟þ¼›ì¸*jrúãëÎeÁ÷¢“¼w'13ö0„gS× †‰l©E*É’Óá:S”9°Šy@]×é@!ú{yæÚÒ{OJEM_¾ÿy¦ÞæIzUœŽLëS:¬t((ndœésÉú)°ª¡Ë:z(w3v‘„sŒ8ðçÿ¾46õÞæT‹̳\dXÓsú5QñUù °óÍ­eR‡PŒ%1 _p«4}¨Õ ¢NXTè¼d&bÎ5nyçêmÔô®\1ØPBæÊºB Ò%—wuïU×À¢AD[›äàñÖx`  (öù[¦€È3ª¨¬œ¨¢÷¢®.ÔáÚË!PM.AUp÷ãØï×Ńø9õâäßÔ¿÷‹„”r$$y_³ÂSU»N«êåÁH›%bÏc¾ëe©Ä°Î…ýð?Æj¤zmH;“qÏ•"Ú)±.|‹¶Ÿ$õH¾3¬©‹S.0ßõ;Úâí‡Îž>v»öUüâ©¢l¹‚lÑ0$Æ»?[•&Ú‚ûy±GOnMô¸‚Ü Ûäa[Il–f«» Ùbd¿8;aÆÇ¿!ÑÅðáF í1ÇIT0®Z ­ÿcPÓÜ;k^Ji§{¥²-Ø«ìHD,!±$j¬Ž¥# Υk¼¢Cª6wº¤7Ò¾®ºüøyå#Ê Ê8>!ÏšÇàE䆷UfßñtåqYö‰c©°Ÿ4uD§Î½KÓii™ü…F!Ñ †’…¡æ u¥à:â›æ'o„ºHÌJ×ÑÊ“D]€…íùßÒ¬*æ_.sàÙ¸uáØgÜ]í¨"·3úé¢T1Ï~'1iËÉ­DTÓ…óÚõÎŪG¹µ·sú‚è§Ä€~ïu=0uÄ£Ù%ËÙ¿]©¸tKΞ÷–»ù‰‘zW}—à™:á×ìOr ‘^ÈWÁ•PÚõã‘åVê+ð@WôáCø%Ïd¬V“åH.~ˆ‚žëÁøšW]Ë+F¿´4/4ÃÊ×5ºíSŸ´:óòY¡q‰íÛ >ü\=]V¦­Õ­Æµ!«D¤ø¶Cl¼å‹â€üLAÆA²M‚Rìø¢¤Ñ. =”«ÎÚH®  :`à$S®Í+¡–oN££÷@DfO*ÍÛ÷ºÒHs‹û̇þA%l}»ÉSëwŠŽÌ•äÈÊüšŒùär«|Ú{ÙlºÿÐîã^`œ*tTð}%¶³Ó¶yw] £ÖË|ÒEÇÜ ëw9ùy¼¦½]Ïìhܬ7ƒï¼ Åáêå°ÖùèÚ‘ˆÍßÞ%¡lÔëÏ~vW¦Ù ìRþM{¡Óf‰ˆ)r•;¾v·¤7£Á]5\‰×܇&ïI_îãêS‡l¢÷ì¨{šÍ{1•è-PÊ~Â40Ô¯žtïð¸¶ß ë5=7ø½0.Bß Ï<["´·šQLzŠMºæ«i8”0(‚Ñæ‹æFÇX:Œ…ÈDµ´¿[¼F¬d±‚*H€Þ?´‘„vÔð¤*+8^ƒm̼Îk‰I…#Û‚¾ˆD/Þõ endstream endobj 2563 0 obj << /Length1 1571 /Length2 2755 /Length3 0 /Length 3741 /Filter /FlateDecode >> stream xÚT 8”m÷/¦¢l½Ù×Ùì©l‘-{YJÆÌ3<3cK–—5$…¬YJ–l% ¡H´ˆ$‘”"{½Sá{HÛûÿ_×÷]s]3sÎùsî߹疖°²UÖ#PÜ@# ™¡ŒVAivvh €BaUP( BZÚbÀ~„ô!F‡(díß4Ç€}†8 ´ S& @c´º6ZC…0(”Ö …¦ â| `¡˜RÈ !m@¡úÓ wÜçÇ_@/ µ´4”VÓ=/áqdÀÇð½àŽx °¥à!áÿG 9ƒªDúúúªà¼è*šû^y%Àbx6 ¤ù€`…2pç®QSAHvý{À–Bdøâh ;H$Óá&™Ò¸;`kbXRAòw°ùw€°6­‚þYn-{¥D^MÆáñ/*Žì‘Ý"DK#s†C À‘ +@‰Nóq>8ˆ„sƒ«GÇFzÖf¸ÆŽ§AT]…‘V8"WÊÀcÞO&P¼¼@2ƒŽX9Ÿ!DñðÜý‘k—ëI¦ø’~XDˆL ®Ð 0©H{2äÍM ×0° ñËç25 ¥‰Å 7úá=+ ìü©àj½â†9P)T€Óƒ "ÿ è8`И`PÀï?-  <pÝ!2âWuØ ¿ÛðýÓ ?ÀË  V>?ÿ…F Iþ¿à«WŒ47tp´±Q\£ü3¨¯Oñ”Ñ€2« ¨aTu-5 èÏ*?ùÿà¾êµÂAkgCýªgB&R­ïàÙý á³¦ ¹µ¥‘þìp«ä~‰ÿJ …‡¿Ðÿó ¬¦üÊ_©ò_Åÿï1I¤Õ¸ÜwÀÿ‰ã¼ ’ÿV3“o†Þò¿¡‡Áïël ¦×¿£& ¼!zdwÒÏABt#È$XA ¼Çªb~\\‘A+ Zyoe4 õ¯¼rxOøM¡Ã—µáú³ã~2žBXY=Œš:€£Ñpþ¬/Œš€†w”ú­J@ª) 8€ÙD ±r¥hX$H7mÅûÝk þfb¤ûOS[+ïø{†€„~AP’´rä_q-éõË„—IùiªªH*, á— nI%1«€Ö>¿™pAßUóYà™4üL¬ÊÔ{õMA?è{FÁï?^^÷O¹ž¨¯ò›GUžÖÙ˜y®Ã£û…}ÞZŸ4ÐaÍaóbŸë5>‹e½ÚúS¸|ÃÓa;ÊÓe(0-V{{ßµ:¢Ûk¥Àέ{¾| ›31cf·o;¹bÉ÷íS56m¾óºÝò;”¼gÞôdŒëÈÔ\ý\ê1Å)[=¡²™íÑéXN!MMìf¶ðz½Œú«úzÝOL¤è³º&Ïî4g¥µt`ÔFZû‹”ÖCÃi¢ïßóPÍæ3ÞïM}׬.bæÚ tK6ïúš(wr¾.IGºnŽI€ÃíÙ¿=ëµï”“Ç¡C·©yNÚôàÅ£ ¼¤™ù¹åQqó_ž~¹HÕÍ45®ª~ÝÎ7/äì¬dcûpÎ×A¹.¿7ÇTqJ<Áásnî‹‹H'…ò‰K׎t³"tøcü„Œ‰MÈÎe>;émHÛ¥jé»'î˜NL™úî¦ӾͯôÏ¥ZKÕ̽TøJ™ëæ1.ÚÝx!ÓWõÌÀLOPñ<­ãØËšS.%ÝÒ5¥<µ'^œ›g¯b4¶Ç¾ã&DzVÚÓØrHbþ¶Êæ~‘ŠZÓ÷ó[¢¦Ø%Ìù«¿dŽ”§;”‰F>àöŽ<ïqÂÛéxÁ¶ì#UÌ«l–Or_Ç{´yÅOA!ÛXó»‰< GÊw¹é¦ÊŽ}Ly¶ôdo¹¤ž”Új=ãm."œx!Ü{SH/>*×vP럶Ó'ÙôÚËݼOðCÜo,fÇ®/Î_>D[xñ†ÉõLÄ<[Ë9”$Z"Ç-O»bž:Íg÷âp~MN1”ìjg‹X—ûä£<2kàÀ7™Þý׌„—"ÇnÛ²•RsÊvûy·¦,|1Íã?ˆ¾ž·’•GwUë^eEY¦ Y­Ô–‘œÐ#â÷Þ赜û{*E$©£!óQfHÛ\-¿¢el²~?{¹ûõk²ˆ­Æüí¯ƒ…]Ílyã™öRãØí\=’Ð!¬’-“õÒ;?šq›–f<<æ?ft;kw7„Ï>8©ÐOBzã ÁÞÜÇN ì@ÏÌHñV ŠÜÓuœƒ4Ï41Û¬]²+ °!¾Û^G‡©Ö§=n Þ]¬ï«Ú ÚèñpmŸ˜ÎtCOÅ; UïN–3^|m? £uŽ’}Æ¢_),1ûâN g¢F"•£Ÿ:HÃmÜãNN›2ÀÔ¸RÂéE €;öÀBö·ügÔ¾VÏŸ'' ²}žnGô; .w"di¸lÏ}áx“Sw“þ’ZŒð9\Ì*«”¼ÄRËç“úÖ7û +ÁD6ï›n|«ôë-ý{ƒÃëó˜ÇÞžUíñ£éJFgàÛ¼G f»ðÕ zÇ¢7Xs`õ.b¶“IÞÛ—2¹MÿéUª¹If_ =a4´IÒO&PÃÑãÜι)¦w(3¥Yb›Úí]'0Z:zW\Fïgå¶€ ®PÓK˜xÏÞzy[úÆ¥ÒÁÙ)âô†Ò¶1 °ù1qŸ$e—üzÛÄ›êÙ´â¹ÛeXŒ$¤ò¯óBªÄÚˆå>§ÃVD-‘ŸSFy#è.O&ØÈmÝ{Ú9êTŠxsgsÚÝ¢<ªHò­uKR]*Ñõš‹6Ç›cÆÂÙA£Wɇ¯ßÏ×èüv¦Qµç«¬XC3™“”Y¹ñ`ÛVYq~5Ê>÷Vç²–!É>,²Hdc\©R2_@è ÛØó]僕O¥¾Ì‹°ìwoMy±ug}ذô‘{,Ôμs“6"k½¢2êÁI«[ÍŠÑbo*w ^ºð·6ÏL¡xŸ–—Ó:ƒv"‡ÇÓ(òÌXU¾²–‹$[S:FbZN¦p/Ë^[u.e“2U~9¦Þ#Ö‚ÑkR9{߉ÐgY»0ÂâäžhÏ36»²ÅÈà©Ðúó2ü®}Úøã>ò¶Ò⣠FåØ6æ§k»0weaŠ•7K¥+ë¼ó Cc+c›ŒnÚŒÍDrš± Ì…Œ‡ìí¥žQÃÙ%†˜Ö¬È¼©Œ·Ku³=áŸ6Ì휌20o0>ä¯z£åÊs¥´œáìFþ”6œ•ÑŸçŽ0,8ûíŠ]dí›à/Uîêîû|upRö—eÝô£—kÜÕsXÏ—¸áNröá²Aü͞‡‹ÅKÚÄŠã|Ÿ|d/©¾íïS'%ž_Ö%p¾§Úð”‚êÉHæ1ŸŒ°Àí÷C²›Šõq³3ȼU"˯mµù|ÓÃS0⸠‘×¥q¸Ï½\_éЕKÎ7žïû 'm×O¸3ÿÎèN…ãy_Áæ–ÜK+Vö=¾¿ûtnÆá®Øxl¾Yéô |XÚ‹5² ³wÔœt.­þ [J÷GµHÑByV£¿|‘C ÑêèøðAzÑ{ŒN«Š‘u¾R®gë:yÍ?iúþ•®À¢³m™v2¹MÌ2PG¶Þ¼±pÕ¿Î>$Yϯ¬u.¿ÐXÆ><ýNñêÑ`ûû·cíý4Ò4îœ>T?˜Æƒ±/¯ÚpÈÝU£šRžeöz[6Ïs,ܘšjoܓקÁ“Xµ›f’™ ìr‡kxòÉèöäEÛd¬Î¥ÁÚ”(Z…›’›´Ïø(ûG0Iéä“°¿NèŠÏrö¤W<ùÊv¥£zgG”̦e‰ãµÿtŠÄBFß¶ß`” Ñ’ëã·äëçX잦t•„%h}ÈÚ°îtÉh¥µ©VÒþŽîã‹cotõhÓû¸¶§ÉOÞ ^&ÄM¦·$}8ÓRCªš&6ŸÈæSmâÈY6´øÔ6:a¦{‰ä{þÏ|–¼h?sË^aL@³ï%Oä.Uj:·q¸pÛ­ŽéFZMP ÿGª™W^¼„ÿæÂéi[±ÜþfÃGÉ[\Ñ}É»xxT¥š1oór§5 Õ¾å)ÓH´s´”'úñÖS‡fOñ2Aú—Kü–f®ÇT£ÅËMu\Éy^1âK£±ÇoI\IΠR &¾(eõM:Ч¾ù*z»B%¥Ê¹ØÐÊ€º?»+.§Éz°¯í· ýA4^´ endstream endobj 2565 0 obj << /Length1 2571 /Length2 16288 /Length3 0 /Length 17769 /Filter /FlateDecode >> stream xÚŒöpjÛ ǶÑ4+nl'mlÛ^±m›ÍFÙØFcÛhl5ÉY{¿è~¿ÿŸ9g2“¬ëÖuóY¡ QP¦4±3ŠÙÙ:Ó330ñ„eUT¸LL¬ LL,*ÎÖÀ‹(Ô€ŽNv¶<ÿ0v:ƒd"†Î ;Y;[€”‹5€™ÀÌÁÃÌÉÃÄ`abâþ¡#@ÄÐÕ ˲³:!PÛÙ{8Z˜™;ƒhþóðɘÀÌÍÍI÷·;@Ðèhalh 5t6Ú€ ­ÊvÆ@gÿ ñ‰ÏÜÙÙž‡‘ÑÍÍÁÐÆ‰ÁÎÑì35ÀÍÂÙ t:ºM 3´þ«2 €Š¹…Ó¿äÊv¦În†Ž@H`ma ´uy¸Øš r€²¤ @Þhû/c™ÐþÝ3óÃýÛû¯@¶;ÛÙØÚzXØšL-¬y1gwg:€¡­É_††ÖNv CWC kC#ÁߙĆ ÿ]ž“±£…½³ƒ“…õ_%2þÔeQ[a; ­³Â_ù‰X8Am÷`ü×d­líÜl½þ L-lMLÿ*ÂÄÅžQÕÖÂÁ()òoáÌ è `gbbâbe@wcsƿ«xØÿVþ-Uàãeog0ô±0‚þ x9ºÎŽ.@¯*þ!03L,ŒF@3 [„?ÑAb é¿0høŽîm&Ðî1˜þúùï']Ðz™ØÙZ{ü1ÿ{¾ŒªêZ²’´ÿªø¿:!!;w€=€ž…•ÀÎÆààæøüoÿ–ÿŸÒÿ–*Zü;5¦?ñ$mMíÜÿªÔºÿTáúï¥øôü/ƒœh“€O_‡‰Éô‹ùÿóúÿíòÿoëÿŠòÿ¶øÿ7!1kë¿ÕŸþÖÿÿ¨ m,¬=þmZdgÐQÈÚNÃöÿšªÿuȲ@ ›ÿ«•t6‡ ­™õÛhá$fá4Q°p66ÿ{]þ3Ptk [ ‚“Å_/ €ž™‰éÿè@×flzMœ@£ú[Óÿ2ŠÚÛ™üuu,ìCGGC&Ðr±°³¼˜Açitÿ{¯Œ ¶vÎ ¨:€©#Â_å`0 þ%úâ0 ýAœFá?ˆ À(òqEÿ‹8™Œb3€Qüb-ëÄ `”üƒØŒRˆ]æ±ËþA v¹?Ä.ÿ_ÄbWøƒ@|JˆOùñ©üA ÚUÿ »ÚbWÿƒ@ìˆ]ó¿ˆdiø_º8FC'ÐúX8Yý1¹ý1³€²02tü£Å3þ/bÛYƒâ¿1Ùþ’ØØüaùkSMþAþ™Í_ÈÁtJÿ‘€ÞFÐXÚüÔ©éV…©…+ðzÄìOLµÙ__u@ǘ€3ÿ“&¨æöæ@ÛX€dÿ€ [þ‚ZgõªüOΠ­ÿZý?zPŸþQ3Èà;(–-èdþ¡µÁîOv g»ÿQƒ*²ÿ£³}9ÚZMÿH™ÿ-ý×#ö_1¨ {ЈíþŒ€ Ô-{k—d ú_ÑáO5! Óß—þß±°ý%´sšý©››ãßÂÿÉ„•ûßÒÿÍ„™âaõûOì '' Åÿ®û_6@׌‰ Ô;'kC'óeñ‡ôl3:›;ÿ´ô1:»ÙýÃÃå4K×@P&nÿ¸·û? (¼Ç? h2ž’Eò:þ‹êÞ>cGÐhœÿþr=ŒÿÁÿûº–ìŒyƒ-ë‚Ûk Ýè÷'øg)öÕӨ齖;\žQ`“©«³7ï“GzÑÖvE?Ý ¬¿z´4À†µ&*¶½xÿÖWšÞoCXšÂœ,<¬ ‚ÿ@¯"pàýêà­`ÙÞ%E‘çàÂ…¢P€ùèÖ/î^?P¶:º°¯xPÍ!ø»l†>F5Z' dŽ"ß({Æ™žŽãÒuîî~#wòX*žÁç4†µÈKk‹%öiÞs½B…Å©Ÿ_ òc|šÒKè(E wÑ«´8z“1‡‰šlɶ§àRÈDïž±ˆ„…^|‘Ö÷ºØhŒ³ ÷Hiôfæq—¶MaÇÞtÉ*×üòs J¡Ö˜û\•.Ió¤6 Z¦®ëþ°v”V^°Ç„¯E!ÛÌáìW ‰…NŽù¦{!¯íïFʵ\j?»ºt „—ÊNCÉ+ð¢bÁ †1Ìž;ýÀL`¹Ivºîòéw§TH{’¾ÕÅTÞ®§.Úß[çãRÙL?jUMQNÏL|-¾y±jC¨q’(Måo}Hq„ø;ìQX†Š6Õo³Ü“÷+Ediº\$È©Ê>Œ†©%m…8åǤÃ÷Ä3l\¢j|ÈŸÓåx³~ÌÂæ¬íßwhs&’‘ZéG͆’ƒ)MÏáΧM› ÜÀ!¸Äº—ΪɚŸÎɳ*@¤­žaÍ,{´¡°gU`ÑuÙ‘NqR…¶ÒÀœ‰óAÕj¿Ï—·]•ý4âŠq$7ëÞƒÛ(a¬Í~v¼¿=kYìÕõO亻ܗÔ!÷M埋/høå?ÔT›†³<†õ8œ5ÜE²÷+¥®§V±»A™J_fÂcOcÔŒ¦ƒ„LˆWÌËã™ÙUŒ¡Õ½—R}ÍwòpÆ8BZ{渳òÙò¶!hí ¹nS%‹Þܲ9mª;Žg¡î׸‘ñÀl;á“ï”ÙG+<(&¿ ½oZ)º¥ ”Ѭ¬fÑW¬¿ÜlX ºcí…¢³$Çý¡Q"x|ã*ÄP¶Ž#\øÖõðÀ.%Eù'i¦¥¦*µÜBgŒÏ¡XиO5k˜Ñ,¥bx[Š.ûÛb &”ôæ<ˆ…Ùà<ÚÂc7†Qö‘~ Qzá»Ä]*š‰!Lá¹Z×)ä_4¯)ïéFöó‹{X»!¸ëº¶¢GÂ|£|îB·ã6mZ±Pl·oèؘö€µQœs´€Ã±ü:&¹ªó³[CÌ¥ žÇéø(¬2=xȃód¯¶=.[‰j_¥6¢-d bÊË8À1‹ñÒè4ÒÓÔeÜã®yc^_úÕ|Å7à„sÿ­¢y¶ò³á§TÏä”(SO²×â×u-—öM0­Rµ>UÑ‘Üg·ÊÇWú[ð`m~0»€cœË€½CIÚ4D¥_hã]µ )ïżíÂ`Ç Qf7í¹epqT»±›ó ÷ž^Ï2¼`GûkÀ,"¶†; -‚µi©/dWä{AÂSx¼1RmóRúªGµ”0ÿwOè_Ig¸è3ÚÎ×ôô¤ÑïŸÕXKmÒß«¸q{/³ùÕí‹Ãiw­âzlÈYÍòJÉ8yFðz|gèO]fkE.Ôt”¿'ð¾¹ó"IUUL"WQÙÇ¥‚_#´z|‹Ó¹Ã¸~’DþAþUB\3ÏyÖ€9õXgW&Ë’âÕ´"kÒ}èøT&v%Úñt}­³‹é—?Çš·f¯Ï?OvZò³@ø¸‘Þfp£>®í¶L2Yg[޻˅AogZýÐå† ËÍÈàtš»•ýs]á㜉”TRMÿ%ÓÙíÆ×âË"ûû\(í ç›õ-ÌÐ#.GÄzKÅ×DTwL*~ùHP’^ðÄ!–üùøÏãn‘Kð#E]+pmcœ¡øÃi¯0“«§˜O+<^ÏÅXßQïr[þXK4´§S_§rÅÉW™ØhØÒEÖLÛLEVȀ谰x[ÑÕ DI>zq÷"Hc'ª0ý Ú¾QÕ)Bè¼uè¹Àm;æ‘/òq ¹ëL ¿Çõ6ŠJ—g¿H^ àNùêýñ¢¿”M— ã_?á-z÷6»u Sº«ê]mÀŒ`[šÒÀ©e9eà„ƒ€Õ¯»5áÌD³‚“õ³ÞIÍsDPYx¯<ìÄWbàN×1˜Òz—G~÷éã„â!$cBé‘(öz‰˜à˜|¿Ó•Dò¼ >PÚ×½@¬¤òÛã]š uð¯GB±YŠì¿»§TÞ¬1# ž>Â(}±)¹%ôç"€džìyï^`A(”:"vÖõm±Â[s©ïïÏÅ4—’p÷-è†*m=K,NŠÙ›)PÌË9Û†­¡‚Ÿô[ÉšÏc†.§„e"é ¿:zñHЫø2×ÞµþÆnˆ7µnGAÎA—i-{÷†Q‹rs“s”ž•<Ë}kuKkýúVèzœ[[½ûâ<|ä¸Úå—Çâ/Ó„µ%²t‘aàÞä^¦>@2©œcþP “ÛÌC¾õßüÅðs¬'<¯ ¹þ‘y~™µ¬²Ç3ñw]©Eúök1‚éÎvŠs³7DשVÝ'ošëƒrrQQðúuBw®= …8žŽígø]DFój]T†)8Ô³Š–\:Çïcš ë7‘6Ϙ9äk‡É–~+:źxó^Â07ìÁñ%Ù$Bºzµ‰ÙCæü÷¿ñ%`úÄø‘Gº;¼‚¥_WãŒFÉ« S~l.•qwÂi{cò`é´úÚ©ëî¥åùðÛó*HÈs"À"¢«5ƒuh´J+}!;´x]W¾5¯lE¬p„XjPJÇØÁT¦:Ï2CRh¯†[ akÈŽEN¹Xx¸v¸Û÷¸§NDB„ÏêÁ„¡ÒéŒ2½o<íQ\ÊY~¹Ú\DV Š>ðó.•îVxBcd G»ö¯¥WßžÈNÎ>˘9ÇÐK]ÇÒÚ“¤çþ¶0“§P틉Ÿdœ˜ y©¹»ãH\Ž"/[ËþÍñ½œ$Ì2×ìçö”¿;O0ÝÃ*ÎYA†˜„­hÇǦ "¤O³(ºy!à¯Öä”È[‹® šŸ}0òjT_$ñ”½ÒGX8Wø¯ ¿ÏœÂ"‰ eZoP!ú |Iû‡ýn÷œsÏäñ<éY•^P#–›´~j§¦Æ'RÎ쎘‹¼=x×*nŠ Kxt¨"› c¦ƒvYZî½øíò>C»@MQÆ2½¶l¶%ñC«˜˜uÕ&àXŒK ³bë 2òB…û¥˜0s§eªÕßÓ4­Fê #¦à ‰àïú|ŒK¸VÀe„½KkÌ‚(Ú5ˉ¹¢ã¯¿dÞàe€·#ê¦hýçQúfî/$Ùè|Èò<ÀD—ÂÒïu)TÆ?¿]®`øÐõ(Ã’øÑøõ0Ü"Á'¦¹¦9ïOq†>ÜájãË7}ë%®U‚z,×ü†:sz—¢œ¥ŸcMûågl;Xm³5*Gõ¾j•fëÅwªÊÒ'ý{ (Ø þšßºzû!xG½¨Žuù¾ÔHåº|äÉЗÕ,.…„|¯®|׋r ˜Þ‚ÿЬ Ç`4+§g?Êó–¶u)e} ®ünWq¬ö«¦ïRù퀯?0×p@ñ#s´‹'S¸t?‘Òˆ+¸­o¼W•ëUùáùÔžïR„í˜^lD7—ÀF[™æ}Ó|ó§%‚*÷ËåäOÎCÄ”š×ôm•œ4å„×Lî‰Ôã¢çÎÂ]n¼f†¤ÌìýºÚ¦õÖ ð[GZ1…ã’F±f8_çܶTb(Ë¿k7¿R‹„HTâ‡:—‘~Œs4#ûö²?,þø’E°T•×09ý²ÝÓ »i¾GòÁ‘úG²uÃ}~ò°»~îÇ/ንêÓ¬,!°Ÿ¬KwO‰"¦½äèÅR§uR>T)e+ˆ`'ñÍÕÈo‰@7gêŠôVõÊ@óC1î§t£ÜõHŸ£ ÝUÖ,lˆ™)êJ"ì`CÛ¾8(T·µ6•ëJ3['”¦´éounöì=þ]©^f‡¸hÀVâÉVHà Çlua‚ê”üÕ­TÇY+7 ²ùØC'=CéaÁæÌéå¤5ظÀÜGÿÕÌ›µƒÞÆr¨ÒêËŸdQ#„½†TM^s_-ê1}¥­-§÷ՄίÎ=Uü5˜‘”ó÷ø›ßÌ)9]nÊ¡ÄoÕJàõçzXûe?ílûöê…d:@0…ÕA@ˆSò ¿Ì-&ûÌà]>šo4öEí=3/ÏÔœÄ%F ûqoÇÞA½é¥(”T¡¡M¶!Ü/Éjô¼Ig”ó‡ÌmUÕ@§-<Á[0;Š'„FSÐÖyÙ jÝÔh5$ð¶(„JIB’°­$¶j¡#hBœý‚/£ïÁª‡Þ müóÑÇÇÐ¥þw ä/³k‚@þ†ºèLEùð*2RVAc†è)'íBƒÆ9ZÎ^¢9è´‘pÆ‚\ßo, bÀýèÈ&ÉÌvjå*tebW¹È`PVbÈ0¼ÐLU—GoD¿>ó›ó﫳¼‡9ëT&·”wVi•§µÉŒÊñ> ðÙvÏ‹ØëeaºFEPö¯fÙkÄœâp„ÔÎ;5Ú[jÓrùKo¾CòzÅai‡ÑsÈD®‘å¿] ¦ÃlPÂ5òÌ›K_S?;âÔvñq ™•oå„O·È–)"PDZîȉ{‹éTòeaX"'…å׫åsù“‡”!8·]¾$ëÇ£x¹g!'¯Ÿòi][t2†•Yg!z ÷ýÐóV|Éɯ‘™ 7î¢ÄŸ’°M ^ƒƒŸ,}ö6âõá­#wû\¡dJ>¶ÊNÞ %«Ï_Ò ÒÒkUœlÒ™l”y˜æ—Ú¸Îeê:ÿñB¬ Ø5,áë&EªKT`ÔœmiB®ûàR)È´*»™âÓe_Ì'ÏÊÜÏíÝ4ñ?»¡ÚÔ3ÙªÁ¡ÍíçX¤#†«ÈÛ:ããX”%Õ Úýpàо/kÊ4jãÄý…¨?'C?#îÀÆVÂ`W0DpÝf&£aa­2Ñ0ᢠì(úÜÒÔv\ui5=ºO8'³Åð›scôÚaÿAصëêÚâæŠ‚ÃQr9=ýå@“§#×ÚæûRT•\0amÀ[—wiJ±ÛL³7'ÆmªÅìû#Ó@âo¸ê•1¤&ÝÛpа’†3Ù¡(¢ Û|ÊÙYO=©˜óéÔ˜ó´9ˆãSPš¼ðq©‘Uì$aÒv2Êm©róîÍÌ÷D.W~(ŧãÑwWµ(_D¶}¸.ÞŸ/Tæz"Ž$)K¥ÄA .w”ÃýP§ Ù0!‚5Myå\š½Lé-|Ã~…ï/œKó>«mýtjb5¼OÐuʘ?±Ö#á?—é0)EåV!tþ͹ªƒ°Ä?5À/ÇL~Ý@¾6¯hÓxî¶%©J'Kšæ†1í'úKZU3\z»Ù×:n­{>&×=¡ø¦ÛêÒü©~{Šñº†Üh|“Ýj|ô•²@#=ï ÿo„ߺIûõ&Ç)­1ó¼ãœ~™Y¼O+òÿ îÆ@?¾sœ…ÚØhƒáÏð€;Ê|šm¾ 6ÔèÍÊè“´n,F>ξú» vàLC~Ѫ’³ Võ mx^Bþ¿—Ìkíßm Å«Ç_RöÐÎ6*@v²â@®l?OO¨Ò {‰ @bdpý‰øñ€#%õª²xìWŸÁOE\Áɲ)"ªÛb(XùÒWñ™]òm8‘Ÿ ·ÄÚŠm‡\N|r"if<ÕrÉ¥>q\q?;\}¾ÂÁíi6kœ¿‘ä§ _;s?u¡¯¸tP*ôµº „ÛCs íáIÕ`F«ÞÅî—Ûd²f]Û ¦ÏSÓÙi,±nkh¿®þ<žœigÛÜê[I´Íl,×ÝéÛkzUêÈ_ë€Ñ|ólëu—¨åVóšRúÀB:ÍS·JŒbžjÈ g…¸õ `ð«tªUje[ª«­Ïín_ÝmeEßç lè2²Âw2áÔ¿’ž¼dc.žh.ªœÉ–Q„WSBÍJñNfPw;œpfÏ—¶Zw¤ï>i+èUzEbÔćpâ/¿:*ZxfSSæ8¢¿ÈëúÀMiN)VW2±‚³Œvmiìeû: q ºˆæ`˽=[Ÿ©…F¿_ ã¦À+]^ØQö<-9•¬~K ¼ tÞUìÉ6t‹D­eÔO%0JªÕLFæåÕ'ƒ¤ë‰®Öi»(µì«Tø`¢ 7á[×–Wêly6[JöEÖ)§ÿCsHa´Æ7t -£º7 $µBâÌB~IÿÈõë]ŽÄ$Ÿ‡ºAƒâ!÷騸/OÄLÌË&+þ‰Ò&ßV~Í’vq†~Èuù†FÇû6jq+ì¦_—Üy–\qõ¿1(ª‡D•pÆNÎ93ýSP”×$âȃžA ùäx!4±åhàÍEG&j6´·(“%ßÖü;bt¿ô Ñ[2±ùÇòæ1 ܤZÅži~† ±ð™'áÙçÕ?UÃδ+ÔÁH öÒ‚ò1<¢jðÂÝqN{•í ò½/õhXbïãë˜V¾íD°‚vbv¦KLJˆeU#ãªíYp×t³îÔt™qÔ©æâ÷Åï·íu–¼EQÔúˆB­î]£ó3fUe|K<Å}} ÐÆÆô^íĵªlž7Д¥“²ÛÌ›”¾æ:§•k&6°—“/ꎉ&õíœ#¹ÛÓ›8 @iö¡{&Ô~ç8¹9µÛµ£\ÃâÆnûp™½8Ö7tÚ]yr›Q],½Í’e}²E¦Rž ¨„†„iFP¬ŸÛŒµ"WžÓ?¡Yb /í¥_S‰â]ÝоvŠ÷=¿m•Þáüþ©ÂFJƒHFχÿVkD= Iš)~䬌 o9Jˆ?ÃïËù+±øQ¨íŒõ`¸™VgûÁžÔm%Þ þwZ¯ySZȘ1)W®Ð3äšØ¾®.mŽVÉ—`&Åé™ÔršÆÒ½é¾ëa•ù3}ÕëNz…Ï“ÔbÑ`ëŸcž9ƒ¥°Äë.ò Í(·!,è4mwãh)ÜÉB¡ITœñQ1K¨ñù¦ÏF’xÙtt4Ä÷£Ìʒ솸1=×íTŠwÈ‚ŸN{bäHII†LÄÄ·\¿5ýÅ¢„‰@fÇ¥úP táÐ1øoÔÏ–à× N9 ¨XâQÿ"£‹›±7À¾<~þ|xÍòk<‚?C3mÔÑDû‰Âöý ‰RüˆØlåÝÈ9ÈíùØwÊÔµ4W4Õ0Ó[Zšò„1S€ä‚€\ó2jrs&݋džpÙlKÜ<â Å•8Xí÷wØøžGòâjnµÌ®»ïsÒ¥ˆ°¸Ö[y>Ta[߫䛴?_/…bod¹sš‘-qúø-Þß%âSìZÇ;ßœ¬S$òlÿiO=ÔWáqâ…Ý“XªÍf½þ&®1m6Ó œ'‡„ÚþÒÇØJvš*C¼H«¶üDàQúXúU„KßEìëS#Mž!½þ«òú÷ô¡`çC°ŸãxsvKr\–u5_<$²/Aö—AÚ@Ï DŠá¡Ž¼Ë˜jÂê—EÌÓþÀXn0>¢H¨Y¥WbrÀ |rß–/„Ùø(ì{\ѯªƒµñ]­&]/Q 8p.»¥|€àêj´T"é%Úb¼çò1•Á7” ›38‘¨Î3C‚êèÛ¢òF äGE° ¨%ªQØÂižà² OÌ3YQÏÞ#Œ5ŸM‚Þî”=?/¬EÛ³cû¦8.˜Ö1íeZô'úBß)š§ÉtŽHy óô+ÀÑ0ÉXÙ‰³3.»£?4åÎÐTj_µ/^]Ì!<¤ÞÐ3ù'ÌÝ ›?Ž,§Œ.’ÍÖEÕQ'™:râmR˜aã_ݵøˆ»]–ÍòXÎ12Ú¶§Ö„1.ûiàOÑÑFåBV®Ï]'²jØ@ä}µ¾Îç7ckÚ¶ÖÈ ð] _õ$8¹æýîù¹:èþf¹¼‘C_5ƒcéÕóõ¹?¬Bòä;^á“#]:9¥}›‹²Ö,= ÜþáÜ3Š3OgÄ‚í~t»ÍFéò7ꢔô1”&#tãèyˆnª衵¦sR$¶²Æ]¹cØ™ŽCܸñ/â(Ê`:ÉCdv?ÞÜaõËRõuE”ø]r?‡hÌB¦O ¬¦®TpDÒ«uðÅÝ*Ø”¸á£Ð»<Ž¡ñðÍ!õN쌮mzµ‘¢¨½Ì‡U”áÛ~ì 9'€ãCEBP+^Íkdƒù¾ëáidòEÚwœJÔ›Ã*¸QJó»ŸÎpº>mI%èè¡K‚^Ú¹¸•5XªgÌð;îDŸÑ(tGÝ"ן Ö~ÀLþK‰r­Öð·ôØ\QÂ.$è]I#®¯[e£!ÖCÅPë…Ò«é¥!‰RÂØ—†›…!\ÖLß J…Ÿk¯xû  å<‰¿á^t›žý<Ùéw5ŸëÃAªÚ=Áðæ[C5é]m=üz™ÜêÎó5/i¥b®OL1j§Æ>ßQyý„~ dÖe9`ØÿÝÿGÝ*šì²ƒú8ä+ÆÇ•‡;¼U±*qðnVİr¦4IÚκεڼ œ(pÌ•ÆüµpR ”’ðë/Ý»ã¦$ ˬé¥7:æXD%RÐá_ôèÞ¢ö¯ûGF¹y‡…öY¸ŒfQ 28µ¼)£X4v„aô–Ÿ÷dÐIî ÙÎHMS¿Š3̇J×ÙìÂáË¥~IýÅ[¤“@ó|DFH¬>†åèFË"jµÔ!­¢*/J£D £rå \öubʨ¼E ¡Dxdw0‘>D"_0ÑÞfKrø¼v‹¼âˆ1p¨J]S~(u,[YX+¨ÍŒBjPA…[Ǫė²˜ù¾ÄŸÕ–•÷Ý¢ñ:Îï»D’yopÐuW«vÑù-±+z0$pYc++mAA*ø\$ùð”¢ÀtàÒ#¢ª=¡Â*¾¬oiYåZ7o2 íP9åúé|¾BÇY'“&PœC <×bJò~CÆ ©s0<¸Ò}Ã3ï„#„ô\³ýFqÃ|Ÿ†­Ù“«|_$ÝêŸÓ-åŠJÚ“ü«£#ów ¾¦Mh‹ø«"l­Æc!ìÓ“Y3DqåøaFôçq+3³"?w{•Îë˜ÄK‰hÄJûÚY¾_ÈüºýüH/f_ß6‚TàöκÈQR:ŸR¢Ó&T$·­• cî6”xÎÿÉÛŠwðÉì®J‰% cú»nŸŒŠ­ž0’“Ôùu#^e@Ûe ïâä>âÐl/N\ Æ­BÑXÃííEøæ QS}âHVæ7™×EcÁþĉƒ¶…›è &“#ö-k4#„½ÆæçÞZ[´CøUˆ"“Цíä¢+ëÛ>œ¬Xº–J Î\?;Ý”"xeŽ  ²ˆknÃ& Ên}‰I¹à tü­ì^]2Š—p ª©Nph’ÌD\{)TóP_5aœ]\„.u‡‘Y´¤Ïna‰q;««ñ‚?sÈñNh°e±|ÖøAþÚÂÝ•¡ÿ~iØé°)þƒ_„ñDÛ]ÂxaJŸ1ž \¾O¶‹þÀwIvgß7æ„häP¢²§1@¢Š/¶Ñ„ý-7g2Ù¾xdö×-:òÐ ¡·®3Nõ• ••¦\éâ&VNìç‰öáE Ã/:&sØ+gÆQõÁÚ¥‚ªarô~ê”ÖtbPÔd„uÓÙ†ìKKÇÝ͸ÑΤœô^Ë·!Ÿîo¹Lúl‰©š›ÓEPô+Ù¬4´¯Ù9¦¸Ÿ½È“ëhuùwÙIJîÀ.>×§e37™*¯ žˆAs‚yê¯Æônÿë2ž>~ø¶ýòf¬àhe®P#ø:JšÌ„BŠŠ´ãöÉ…èómµ²bH͹ó"uÓŠ>·Ó4–’4†)Nað²dÅÐòÝáO /pëŽzÁ‘³§å3ªv°‚·Ö‚Þ¡QðŽz‡¦[>@¶SUG*§ÜH¾d¡¢õoí:‡d) æÔé(ËUŒLG±m {ÿÖÆV!%k˜C¶À-‚šÝ„aËd•Oç­Í`%ŒÛµçk/Þp(¢›võD•EÞ„þ؈ñFæ—ý§ˆ®ï1¿ÐlÓ°Æa96Žî9SGk‡ZBn¹]É­L–k˜ÑšokI¤¸”pΆ5BâñŠ?ÞfÍ]‡¼ãµß[@aƒŠñ®ð÷2]ˆå¸ãÇÅ'çÛ¸Nhô}ì^Ö{yèE_„jp…%ð.[Ðèâí1Õk€y« û½Ð“ÌaH×ËÆñ 9Le3¢—R¿í»þ EM’‘ÓoØÙ×[–EÔÆ€Ò\ÏÇñÝ–©àvþ—õ"E‡Î$Â^޵fJâ‘”uèÞ>¾1ŠÀÐûb¿xJ Þƒ¢61 %¸ÔçHPíL°X>pùj„õ!¬ssŸ›JHdŸmpËÕ]^Œ^‰†ÊM5j†×ÒV ŸêFRÛè=¦¥)°¶ÙÁÃnU"‘ì>·¶Ž…Cí•7†­vIx¥g…0yÝDfoâåŽÔ³½3™ÊËWÜÁ“ ‚>ÚòpW†¾t5î Æ¢|–‚'’ ù8šNkÖñ§<5JðÃW<á¼ClM6"¿HôdÇõl@Ø?ÕÚ™¢è °!°¾_H¶IŽ©½¬ ׿Ì6)Ÿ#«¹x‹U48aUðÉx$·ôõTlæó´ -Ã,ðkÁ n9¾˜¯qú”†¾‘PØ4á)™‰©y¯_Ù7šj•­¿ð4‘(ÂËH0ÍýÊ5— ËÂÖ£g£lwá‘AcSì-QÌ]ðî;ô,n8´å§dçjñk}ðlà"ËDI ¯±®öÏ7 ô¬‚²·¯ìÃlŒãßBæ3èR­jµ‚+YRŽªÛ+1S7þtì"ï=÷ï¯Bv£ñ¶Zƒ†(c5_z/1Y^ÁrÀBjn«…RZá°Š+2©dðä~#Þ8œf]Ù/…ÕÒÜ ´²ÂùÐmíCEÙžðkYM³ZžGâ‚§hëôÖ0¤kæåÞA¦š1¾IÃ×gÔÅßzU8ÐmR?ø >'Ûy<|ds…&½‚}+·F#_wrPz¸­Ëo·ÛpþªýÌ…ÞE"LÏËË ¢aŽZm‹õå•Q‰çð‚±,@VLèØ…Ryü›8ÕÊÏx¹¯{!ÖuŠhÑQSc&™³)yžÚs”1íç>áÕ(ý<ê{š/Ná#†¤i¿1­wˆ…¶1GµãfgWD=¼HïÚfíOVªd ÂEœóÄï÷õ_ªÓrh{{ש/6ì_òòþÓJ† …ƒM“§œ;Н#û­n2æœü™aŸ7v÷ãàêñK*bŸ‚ks'óZ+ô6MN&í-Ž|%øžß¡ª禫Wk[9#-’…•ø#q ƒ\ šhŸ‹æ/AáûëZ(„b0Ó$Ìxºª†é˜µì(šƒ„ðJ$î‰_›Söþ¨XËàl·‡~úŽ(ž^R‰¼)Í4$Òmt°÷uîáLè‰ìfâlm¨Ì½< Ö, Ç‹ ¡ZÄÿ‹èa1}!ñÁR5©Ã&È·×`þ¦1œp ;¼Q¤o®žp lTÈ›xMvö‚}[Píä+"Vš\¼~,ß;rc¦ýé NY6ÍÇà8_­œÓ ³â¥ËÍžµPY•àz4‚þ®/lföNrhÉi%(ìvöØ[ÖgÄò5.]k±†ãæ?먩± \v>èj> }-½|õHÔ½¯YýÓ캒º¬ò»ÉÍ£GFMùë*:¡S%ƒ íGLŠJ>úêþ÷ÁɩצSÌUïp,D×îý–ò”þ_³éNWP*¢Béñ6ë>À½W-Î+´˜ò±`ÕŸK}Åv`Pa.5¦s«[ª ûÚœ¹Lʯ,&”-#`Õi;•Ï5T.È(OÔ[­{X¤zóXtnâp\^¾4Rþ1¬ˆüõ3Ñrí=Å4gQW•DŠ”õ©ÅbH bÒ êˆK¾H×cæ—¯E=â™™¯\¨Ô O¡aŸ$~БÕgÙØ¡°§ÈFȵR¾béQbíU4ѶÄì¼·›K\òð#| %dÈŒ~E;zÿ=”yLÿÄŠÌæÏH2øÍSË™p rK…fæ˜N:‰´2ºÆûŽøðs;°‚5»˜VCr8zÃ] ˆìûˆ+Ô§EÃ[ÍñîC¼ª&G`šÀºÐÖ9­íMäc¸M¾´"[â?6ê+(˜ay.3Î<”^h¨41¼f})&îÂj‚À†ó©ø”=¤Pܹ*pÕÕQ"ÐÀ‡›Tz §Îì7löB¡ód? =8¸€HU:ÅÙ.ÁŠš>V†#F<¦jbiîù~ä¼ÿI¹øI£²O½@iškWµ—Ð,ú™Ð¦ˆÆxá(ȱXÊo1)…äLß‚}$Uyú° ko–®szyU“dx^•Ê*fZa—îicùu|ðXrÿ£Òü&»é>6[ù)c‹T°çþ43ëNÔj!zÚv¢¿-[!"„pÄú($¨µ{ÒkR1’W»×pÎÀ1í ÏÉû(YèKcóE=ˆ|íà.•`Ùí“Þ¦fWplÅHcxý“ÌÎïBmWTÒþÇéÔÐÕ ÒúÉ5¾ÛDí½ùè›÷VéÚA‘+•m*—ÒAâcöÐãÓÐ[sl žêÙlüœHT˜Æ‘W!]•ìà É•Iÿ­4ƒï¦•ÛëÖBN[5U¡²ýÛ;×hÎr¿wHÆìÝ ñÁãî³¼•…îc'ÕÊHe‡!RÇÂ;Jüh’ ‚$GŸôŒß#ãhŽ\ê¼^c©€å÷ ýl‰ûÓ+ÁÖú´+UdÇåÞ"H~NYÕFB»FÇ€~•;¯Ͷè†ËkÙ)FE°jw‚–œ—† ýÈ–A¹™2G!(J"gzF«õJÎj;ÈÒŽ£Àßy?B?Zš¾d(¯MôÎñjà·{Q5x6/©¹ˆ³˜ÜØKt]'ÕÊî.ÔpnhúÐ÷&ø’S™¨l‡w:%D®+™‡¥‹à¦p*½=e¨iØò¦±y¬{"Å´d½ïWcé—µœ_ësõâñP™Z¸•¥Ê- V®õ¬¿Þ÷ñê[°PçiòV˜^º°5¦;NgbÈœoø‡‰\ÏÜCÛ×°Üá¶Ò»«êmht¾`ÜU÷£Ížž9—ãÁxP}ä0,Ìm>U ÉÀ¬ä^¡µ%6eÂ9ÌÛÖFšd¢PÛ(Jµaœ=gz F®îò´q¡ó•9å’g&&[ûÝ3›}5_ï“RWŒÒqªm²ª½ÿu½`ήæ\öæã•=žŸï|o  7cÇŽb7¯Å]ý=ÞPiŠ©¶?i‘[RضýÂÒàùq4‰wQÆÆCÛFRJÙÝl–›|’âg‚êAÞšÌguÈp `%ëh“°qü1ò)ÞÔúsŠév Òç¾´­Kˆ îù|CJ~ ¹ÖîUª]™1bÅo[R\¦ÄëTÁܶl+€øra'¶gÃ"×o˜öªH¿_êèÚ’ËÇoE„ìlSáÊjj¸a˜OBî´JW~¾„‰Kh°ÕÔ&hiámbÓü ÓIòwöÏêÈùa…”ô.(-ëTÃèÁÝ{Ba<Åaéüq©E[0ÿræӈ¨xÇGmï˜ÄòM³ð¡¾¡{XûóâƒýÂ加lˆ |…ª‰“Ú]°cð—ÒXÛª¬óÈ€$táq„Sl³J¥äö;ýr³¥ Jifœ’ò#ó@'õûõÑf¦Ñùç¤y¿AÎJìsìÞLÔHzÒGú•Í÷Q©U0X+C¶Í1Ð÷É¢Ô¡ÃX‡„ý¥ñæ{%Š5éçåRŸ?…òë:A3Ký.šoí EIàÇòxǾñEvEèo3Üg\–ŸÅ=4¯‘ÂÜ…G=kAþ‰ë~Ôóˆ{ÂSn\ø:£†‘s„07O¬!ñƒ}r: %{ºÜdÆöû ÙëËgƨA’Íý‰žøÁ#’¼{\£[ܯÕåÊ;ú‡1öŒ¼„–ý3Ät£ïn1ѵâ¿"Œ¿í‰ÇJþT|dŠ…µB/Æ#yè·8Ü­ÒÇvêdÔð¶|üÊÚM¨Èúìì´’ Å[#&Lí¾äçÛÒU7üÚRê>×—WÛC[×ù"˜6_ð^ìü]6ÊÙ£¶BÀ“ß^ñ#- Ygî§wQÙóoiÜèa*4”ÖWé>#„sƒ S8an\4húz~›­[b8´rò±·ã9Ï›š¯9(Eß èÑX:ä’4œ¡ø0Dê¯.ù\*óCUQtæ ”‰™vÆÖz;·Õ‡„ÕµP.ŽìØÛ}âžÍ3+º iXON-Žœ´ w‰gìÓÑ C* 7t[ ÷2“ûv”èÐÊW:ðóu¯¯NÅ%5®m˜²´žˆ oøë¼4Þe>›LÎÓ]ÎËYímO'¥ª½á“vb}`»Ì%Á±uŸÖQ·û4hJ¿møê72¿v/_¿TwKAS*é±ÿ¶Nt[Ø ½hôûNM7ŒÐ`5 ]Ûpr™5 áÿŠº‰Ï‡r/Ò(¢¿êr¤¢cÊdÁfŒ¥AsBPê=þˆèfc> ~Í=Y<®Ñû澿kœBØñjzŒs!¤ÜÓ΂/ÄFâÎ’ÊÖ4Wùð ÿøòFþlE5!ÌÑžáÈ”/dr¢»ß!(¡6ƒÚ?péŒä·NÚQ¯X«£”›2ý@xwSŸó%?ÛÔ°N¶ ÍGo$ß.íÙ}¨dX!¹aÎê^fSR”•]çÁÊ&™\çžçÖ° TD<=]Èüù¾+RÛG™$A0¹Ä“™ÏBÆw÷³ë{sg±D:«—N<ñ$¹y÷n< fWa3åñÏDÿxÞCNØO…^ÅÓ_¥[¤ò!<ˆptzUün\‹xÖ…g=Lšp] ·*¬".—4ÎÝ` ‡¤'Y„ *ŠR Ôj·ˆ}®¿Ox B‡N™`bö”•ü¸*øþÝ]&3gz¨Ê.›\†}°§|ç<_h¡¸égÁVA¢ª–{GŠ«]×ù½GS?ÒÓ ßü©]¼z4¿¢‡2}Єjöá5€ìeW|'4“®¯ÅO!wPí²Eœ¿Àg<¥œüm¾.|ÿÑ[b’˜\%BIqÛ$*og‘2ÂÆKù=)KZF:;zS®ZH÷œRWâ•ëã):ኒ¶v€yeÂ{YÖK©qݹN-ò(…@ñòNkc¸M }Ò_XR…5áW2¶Õr·rÔß<~tKí¤æwè’E˜yˆ¾uÝf#­¢Æì„rsÇLÞ/(|çá/I( ƒëœ+Ð_Ù]ÞLÊåÌ$,tpY&+ TãNãÉüNì.!²­oœ . Ÿ2ÛàrîÙ² 8”Ca™V|I'¦¸½U¥Ý ›Ž1fô¸—åî(à'‰>T¸¨?O°=è sñ‡µÃ½BQ/Ýp«£Ìùð7OáÉ//t1È0ç²¾õ®Åi嚉˜m&mÈ‹d5ì!±—e{mÿ¼TÀX¨4˜ÿXÅԩц*TGôÎuZóî"S(ðž#´ÆÒI'·9M5F@P…MÝ¥]§†¾-»ÿ­GÂ6Ä3ê[ºoï'HÝíÑìº'°Xßtáü_Éhö?K—]í†Q¨ç¿L·¿ÿæ–×1“[’¢,ò‹–<·y‚3>ÌKÝŒx½Òã¶H—jxŸ-³Ñã Ps˜Ý`Àv$ n&ƒª<*®ØR¿ø®†ÉÍi–î9#] ~ÊNwøÙGR´£ó¨‘‰¾¾ó‡kC|!PÖþJ )ƒx²‡F¸‚Ja PË¥›…¬YŠªYˆö-&¶ÏEªû.Èøþÿ £\üýÝi¾¦P­v!¨àm“ÝäS˜[!‰zøDb¶eضÈ)ݘàþUÐx‡“]xAMo’ì§Ü¸ú–oûjà%Õ´-”¶›*ž$÷ÿŠyJi©7ÙTþ_øvdþ–ë_#ÊY" ø£…ìÖÜkš"îŽÔÑ2zª 'nvù¸ƒ ï5´³Q§ÑSö~ý Q¬Â)(‘1#Sè¥XòÏ^à a#µ.ÂñÆ€èPgÆ…+œYämÇG>œ·4š>”´¬=µ~ʧBEd{µþ–°CQÕeöï˜fšñù5p©‹»TöÛrˆŽh¹tí æPÏÖw®–޽ ´Çtú•X7›EŒØd¢0I³àïÙ¥UÃcp‡zúR%ißÊþåÌRVÉR~ŠK»Xœ©ç8‚%oó±;Ñ!ÙœþR¾< 1Œ&{ü¨tPÀr %b€ñº°ò è®e ·ÞÀö$3ºAAªŸM4Û`5Ú`Îc‘é»Ò¾jéú<€gk»w€iQq®ÃÅ3J!ÛEü1î(—(ü¢WÓ0Ý0BÀù%BÊ*‚"!Ç"Ó¥ð7@Å~†úš×_åÄó²xsþªf¡"ˆNW¦wåo¯nÝ}uùK? èt[ :I§õv&­<„´!MaÅÀZ[ý t«uÜV£´“µQGPG÷%%üIXldûšœÊéñµ¼Ù©Ñ`§, FisSX>r–SUÉ— Ÿu|UéÑ4i@/j 9ٕ̈,˜&/x,÷¡TIˆð¢7Jä·d´êÀm!æw ™=¯ µŠÂnÓ ¿—ÂElYÎ÷5 Ö®¾wѽ,¨¼Èn9¯~(_–o–6;îj£ÉÅòAâî–—Ct»nžî5wþiŽ™Ø4á ñȘ$XðDpkAákÒwg}‡q /°vnÍU8CIŽž?9Ó“0Eq@‚›ì_ã7„yÑWvήäU+cÙæ¡Ç_Œ[ÓfL‹ÏÎø¸Óf•„==ò&_úlÚó53m-€÷–ÑyÚL\‡£L¨ji2 ê« É¡úd 3.A į˜65:ñUˆÀ¼µ­–j ÉáhöÒüýÛI§0½Roѯ"™--%cDw›ÖÓgJ ˾ƒXº2Všƒ«[x^¾A[Îð±'&˜B!µ¿&½‘aÔ?©|óô*†~’Ƒ¿Ár…)ÖeNKY‡Îò endstream endobj 2567 0 obj << /Length1 721 /Length2 7244 /Length3 0 /Length 7831 /Filter /FlateDecode >> stream xÚmuePX°5îndp‡ÁÝÝ5hfÀ ƒ»  îî‚»;K Lðà—Ý}»¯^ÕW÷O÷éÓuOŸÛU—‘VÑê®ïãæáäáŠôu5x€" #£œänï •¹ƒE†`€ØÀà ày°rÎ.>nö¶vîkÖ¿A€#ÈÆÞÉÞ `àìèìiom÷ôô”ö„yp¹yHrýiÒƒîv`ÄÞ ÓÒ6VÑT°(i¾(¡`7#@ÛÃÊÑÞ no †ÂÀ¬ˆ³ÀñŸ`í µ±ÿKŒëoPO°›ûa7g'€†‚¾Œ¢–¦>@AŽ[_‚ÚÔ•ÿ´CÝa¢Ø`k7§¿¦ã¸ÿ9‚þ‹¬þ‹þ«ºyÿqañðlì­ÝV`[{(÷_¾©@!ÎÁ`—KÁþè°üñ`†üa{8:j‚œÀ9g'w°@ÃÙìè:; ÿ²@NöŽ>ÿ_Þÿ0TÜA|ÚþqødS´÷ÛhÛ»ÿ±rücÑ߸!øŸwÑÛØ{8ýÓþãÇŸµq†:úüÏ•ÆøûBnYM=C]Uöÿàï²ÔÚÙÆj Ðsÿã%ÈÍæ?àï²6ÈþŸíùWÌ¿Ûàùß\äîfï 0rýµÀ¿Î¿‘Ùÿ²de½ý8y„…œ|¼@?¿@„Ÿ7àÿȵöpsCÝÿ6üÏ,ÿæ/ì ¶ÆZ[v¶ wøØò®"P¡h¶•}vÚò5û2âÊTÏ™)¡ý ÅÞ å…>e¾õLˆ•ÄÎñ¶ÊÅ':Pgbò=m”Ù2å] }¥m`íæƒNÁ}C”ù)Š…“µ&ÊYô¹{ÆúZ¨6Û$Vîa­ªk™¡Ï{ËòŽ>T‚­ÄÕ…+¨«3Q¦Éoð7ö‚Y»ˆÂS+©»¯kH‘ùa;8gŒv…!.{‘Æ—,m"Û‹íœ?•R"8‰PE}P>CIÔR£>âÓá°æGYC DžDxnJìwÒ¡í§#¬·SCåÚ£Q‡¶9U?^ h‚ׄ×3»/²S3uÏNÊH­éÍtX I|Ï#….¶Ûȼ' ÕþҶøQMÇö‡fªÉð¶à‘²]Àr²¹ñ"} Œo¯ÕXÙ3ZsɲPе+¢Tv\ßV´}[+H¾æº×W‹ÈÁŒ»CVô˜ÞúŒ·‰e9†Nä×ÄQÊ&€-m°ÖÜø,ªâmɲk¶EÐÅ™IþÌâ©^úȽˆ¬Åúü$ tA‡r†S¿ƒ,ƒó'Û$|Ýd‰ÄõÚ(C™_˜7$ÿüúaÉäó§Ÿ‘ù-£Ý¢ÂÐy²æ| “Ô»ÑÖþï98:I W+ØAÔ¥|"ˇk¥ü«¥9Ø>US4?Ø»ƒ(DûqomP^fáX².)WIǾ_ÅÜŸŸ *y©ËÑîWæ}p¬í«ÜDÕó•wU}L­º‹AA¹ømy„À2>ª4“ýQh#6Íì•ÛËYË"ÑÆSÕѧVnÅA~#„›‚ФSjÙ•ê¢N¹ºžv²›èøƒ;¡`Ø(åVvƒ«ÂÚV¨ÕbïÄì PN¾oj*àwm ”Y¥Ê;Á‹],¡{#mçGëõhœ¹¦'hÌK 3ù}¢¸ŸPXܺÇOí-DF/pêƒ&uD£.·Í'¥é>¾û1V ‘*‰°Gœ0_-Y{ÑM”¶ åÌÄæ£ú°]%ѯ Þ8©>áá@Ôb€LtPˆNðrmôB‹°Ãª1”Uð\zJçú5Àu/"äÂî'î&Ùt7µ¶<ùi¨6°ùQ‹7u¯Å”5¿xšHóÆ®Õwë›Óã@fHLôœø°“sû»›+ÄЛkL²Ñª¦©´:{q/Z™ÄÐâÉOz6œŽœÌÈ®ãbpvÎ;å¯O?(ð?pj.Y¢sw\ÎB¨óæŸ;_K¥#~†å«ÚµòIÄѳ† 5ß²9îíWÌß$[Á®7®%;q:NR àŒÑ×f±ú¦™ÍB>r‹û”_.RËŽHÙ1ÇnY, ½‰Œ J³‡Ú wØÌ/«ö géæë¢¨,Ãè¾nÉÎŽ4²Ãñ°ëÂÓä=oiH¢„¢©ùÓ(F¶˜½#Â?VýàQëoWW~‡›4Pm€‡%F:äR#´æ^K´BðÕåMè'ýô”ü$/*XóöÏeìa&ža¤«ÖWÑhºwgþy{»†ÈKÊ”Ü"SpE¬رÉ¥§Œþ¼¿É8ÁòÓ…ËÎ_[¼aNµÙ6;z6¹ù¾7—\"±Œ_^² É,ÌdÍ"yº‘ïi¶»Ìa³¢ ÇŒ˜ÍùÅ mœO,³@ÔÑ–Ó¼H¶o›b:;ΪÿȪ$ ¥ZÏDö¼QÖK5(ð÷qî³ ±¨¾öåzW…Äg^5Oin°M•&™V @tµÑ„Çk=înÒ4e8$£và>+BbG¦"“pÃæf #Ã2c3JîìÚôAÂúò1 MÐ-¢ºEÔ«w&ˆÊ ³[} bÏc¤AEP6£pRJµUzDC×€9ÆbêwÄù"g.°Kÿr¼±¦8§JB+N´<ÅF²]Èèÿä©ku‡?Kà VV¤ÖUk•ü±nrÍ^ÔW.ăCNGÈÄàbÞÂéj½}‘ÚW/ºªÆ¦¬ËK¿³™”+Q³QáÌŒ>}f¥ ®•v®æ×RHD“&yÈÙCvã•)O¸UoI£´º¯ÃL]  .Ó=ÝÌò¦+ßÈn{Ñ.ö³Ëy¸1¥_5GÞuW&ð„ªF/MY"®H+²Óv¢•Ç #NK"àfì¬;˶~ÚUd¯89"GšmÆÍKùœJѪçUÀË2ZÇß°Jw “‰ü}ùs¥mv½;2´{‡¶¹šÒ¬:†ÀDCš{D‚ñD“°¬[‹ìTØEÉ%W®B  Óƒ> ®Ð«ï:Œëò]•Ž—ˆOsw²Þ[c¾¾Þq¶ºe¯kÑ ï$*¨€`ÇÔÿ0ÔcSaötK©¸·)yðq±«Š?H²PäÓÎ~ò èµXH{ëiÿŠÚ»ºç Goí‘—ýóýÜ$~iWå£XRú„¹^ËÜò‰$Üh¨«‹1è}–çj‹Â¯Onq/4ehp¼‰ûkßûq-ªÜžG†ëí›^hÙ’kåYà#t>•GS8ç#E«ƒ²R¸Æé2]¨Q­‹übî\©ˆJq{³zËÌñ4ÖÒæ¡-ýyïÔ°Ó¬}ÐXݶL_KE"l†Dgz\‡G£ÛÛßg¾»tµÍxô§héôòt=`ç0ž¹Ø`©ï즈‘Q¢Ò[®p+‚>0mÕ¦yç¼Óˆ¨ :Î+ýÃ$É÷^¯¾0€æê˜‡×5“–éßКW£Â̈Q›$nä™ìèª)N‡¡„­ö4\óÅ<ç ÞÓ{U–=/µ÷@~ËZº‚„é.§ßàa oÁ|lŽhæÔëâNzΤ@a=>.1=×¾T}v oB‘\^îïß½NiC5Þ…Hˆ©¹ü±¡á¿ÔqϺ°^¦&m‡îb(WFBaŸg;×"í”%/"7/Fì$òc½£¡‘•—ï´SCxÔÏL±ü˜úp'êœÕ½çG}KÏ̺ÁÆ`±ÝZ½Êh¿¸¯Ì€Ó=|Oü1C5ÀùºMá½Ò§%@ŸÒ ý©ZL$,e–ç1å» ‰é×ëç´K5¿@îËéŠ ´”î´Û1ÌÖ£D¤á& 3RHJñwC=]c™ôÇ 2Ñw»?-vzüÞŸ2«ÂÃÙWуaÔÙè$ü\÷o;B¬ñ¥)æ¿1„p¡– LÜP¾½¾¦~– º5 ½ØÏ07l2ލÙ}«|“ÖàŽß¬J•¡—4][˜'&p#ådL¼‰]†{Ùåð8I 1I×/'.#˜þ®›žÞ,¸ÜjS¼BI[ Wô`^þÕ—ò«Ü-Ò+I®Ð§Û?ÐÏËg{¢¬Ê–ÏÊ…7ÙîJ¶êûÿýŒš¦ ‰šsÔ_%=û±N ÆxxrVÕ›ƒa‚Ž­(<~êØÊPîëJE;ÓÕÅy>Ò‰gžn_›Ó%ˆ„¹Z¶!)û‡îOÞ¾ò®¶&•¢Ò ë½ òáÓZW³r¦e˜eZº¯§»¯“-xÙÑ$¯§ÊÛ·<ño¤¹ž€Uç¥4,f]÷4 oõ?Å1ÍÀ£˜>0‹¥QívwÑ”|¶ãPHQm=9à}Þ¾àxññ¨Â“ß‹@Çã ægË5B§\ù¦r›í¿P ÷ê/WôP;Ÿ·šé(h……ÎIÞM ¥B/’Vl>>¥#Êg-s{Â;{(]âPûÖ×_–Žzéæú|Íx™ÉD,†´SÓv2³¦•ë\’äÚE4Zíé›EêCwP‰dOÅ3Ž'™Í&ÍÕùÕtY¨5zRÓË“. È2E˜êèUè®hÈnwñÛn¾‰§äÂ.K¿Mk¨PUy R¹ÎþyXœ &Ÿ]JÄ÷5«%|ó±i–‰Ÿ§+5V&úñè•<5–ÔS ¦Æ<6›zŽ Z°: %„ÌUù›²W‚ˆiÞLŠ‘”˽rJ †‹°ƒœ"4–É©˜¥u†Ízþîû¢Ä æ6Ñý™ò^ညŽÌñáÜïÛ"ù¾þÅ„ |?Û3Qî„Ä Fß’Ö+ÀÏ1£ñ5.E+<Ø2w°…µ¸âò2§FmI+üSÖÅdïšQâ‘…‚hbOrˆ›:©Ô˜KyQêFH+K-”,Íö>;G<†Ò[©™hÐwXÈl¾oÃðîBiðm-…¾yµÛUctâû€‘t&Ä5^¶¾,c "´ÇlaUpÓ\ƒ‹DQy-†Nmô>xàš£z90)zn'Œ‰9‘·Æ¢Ë—ÏoôJ‘K}tÜt¢yžg8xÂ!!àÍÙfFzz< °R2“œøíÇšÜ2r?˜B¥:Geœ€'òkøƒ¢p®ø8gŽ '~<Ÿ‹ÅyI¤ZrX`ƒäµ¢TowB‚æÛeÒ‰]Ò‘¯¦ã]ø÷Cu¤sôdÜLa7ߨ;¡¹ºº¥¤c#ßzËyá[ðÔwQ^£–I¾SÔ©–!}zAmÔøÂhH±÷Å+ò[Ó/ ýÒS8ñ<I ¤BšF˜Wß ö«Ûè°7é¼ï³‡£ ° Ý©OֱŬ?å¾×|ÈŽ‰3¨ß€¦œä0Љ,ý:Àñ€¡¨ô­È$ÀJNCµfÞ•!|7bØÁÃU‰êÃ(µ”bXÇ}ÞÉ9ÓGpI²ÎâF̽²ÃÚ> #áøhëdíIY–Fg³w+ÎrGÆd2I5ŽH²Vݪ¶°yÒÃÞ¾1ú²ùì8¹‘Q¢ þ‚ ž!û›óÐ~;”çS>%¤<¤ƒqÀQ'êFVÝÈ…^ý}ÿAÌzÜ1މּ …É ¤õ~k¨ÖÔyŽñæ‡upŠÃ9þêNHÕêó”ÓÖÓ0æ&§¬BQì‰Vm Ó%­ñÚÚ3ÁŒ…©¡j½hÚ´>dêçÌ`rù|³Þädµ˜j¸dül‡þílí´™ô±Š€O Eâ·„ÅE#oÜóÐXÕi{5~-9.EÆ>?Âðig¯k~ÝÊ´‰ÇDkÊî+²¨9ü =gq§—”^z­™Ýe_¢…µ¦âພ ùÍÍK&×bƒrfúiž‰Y¤*±ßÈâ×m#cýÓ”Ø X¹½™G8·Oà%Îa«\Gå3BœJļmÕ( Ì¦ü¯e˜Ò8òÑÿˆBå@žEK1ΞšAu*ËØ—C^7–OQ{ãÒ×k'PÅ6„Ì¥›k 3 U´U‚!W´Ü„—äßÙ£Êì°VWu˜P,šî‰¥'óE°tn³-n5ñ•dÓ&° »›³ì»°Ê®GÓÜÎd‘f\F'òà“ǧ]köÅ]»wü˵O·w&¤2¯[`šJ'¬BdåÆƒŠÍÙº£~ cÓXÿMã%~¡D2—KÅúµHz*ˆimCß2œ 5¸FÂû%p6E+RÁ€"’6 b™½BëTƯX¸'ËFÎ)¹¡{>â±nÈ•üœÄß:9â¦?ëäÕ²)&烸X¤sÍÁ÷2œÓã«`_EouóŽ:¡¸£ WÂ¥²X.ãlÒuzc³®¾`B«×»EîíðÜ;HNZ”þ\2vß¾ëhú*ƒ€†ê£IAxÑéÉ>ø·¨êa!,?€€[T_œKôÝÑaÏ]ª›Î”QágζbÕSa$¿kd}¬@^üwjWÈo˜ºÏÈP`®#ûÔ ä·¾< ¡'¡ÌüqŸÑÊ$}l¨}/ —†–Ii”,n_z"ÊÔM4Ú¼95ª”Qßa¸ol÷¯ „ÕZ•ºUQ-ÔÞ¹} Ö>€µF¡}o|Ï[ðQÒ­¯áy¡\(ëÔ©‘²ä‚“Y2øÌ˜ªßè˜^Y Uøaù¢‡ª†¤ƒ‰ g“ÕC1äxÑÚé컨…94çŲðœQL&±+"è©“ ›Úß"Œä=}ß²yÑOÿd¡T‹¯ l5üÊŸ³×ýÞÙ)¯;¾æñ¡{â^G?²Q ý´ëö=6©,¡a³A>$™:5£:ëÏ/{qOzL±ƒ(ÈÝ:ꊳ?£ Þr=v ÏK»Á£hb–ÿ0‘þ¦‘xf[‡mGS²ñÏk>}`I¦á‡ó ¨6ôKàHô=‡ï^£ÃFˆÝ•ooÇtîh|ív„¸šÃOm ÿP³½Ò‘œFtõl•c¿›^™¶Ü„ÝÚÛ‚)IóD×£ÀÏRI•ÕyCð—ë4&=ï›}ø#7ãE~]·¾ïîSÆ9öRyp4SÝÛ+X¤Œàô¢I…F›‡ù~€ëë7HhÜÅ6±h÷§þŒ¨­—©‹SßW&N±ú`yò T"‡âßX=öáj`TÎØï^Ÿ@Îá,ÿ]{,MÞœñih¹AÊéx\° žT‰Þì ÊD6eš5ùå3º²ú9NœÕ×òàíG™æÁÅ•¡Ž.ü¦ÃˆaHÊzÅ œ­ýjaÜ®Öþ–ú¶ïd»ÏÇ ¸–äfy¸(™Øšl >ÑÁöâ0y%ë%íw9ðúGà²ý;ä¡D°]kž{œD˜ûÛ÷äkß®›)ÕÎWÈÖãûx ü_ßÙÇÜ{Õ 6” 7˜YhD\씄ÑÓIä}–ŠÎ¹øUÝÕk㢹¹kIËÒJ%1_R6 —1 ÐÌO½6 tŸOq¥ËeÏÊÓd;U佞›Å~(Ñr¶àê*íœM¿;Ó¿`dÇTÒ+v2j²CÊ%M/g5½2"rZýÒŠK Îóá@oõÙÛEê‘Gòm¯¬Þ×·ý´(CªûõÙðÚÁ–ûmÚ¢*^Ä|fêRG «,ú$‘_Ùúö)©’Öl2‚U^×.TzÊoW>Zw }'5²¯ì,¡mÔâjŽLÑÊõtO‘SÃíª ˆ†MÁòŸîŽÎ_¹ùˤÑ}²ŸÖ þ¹Kœ±©­ºñûB» vÆoìe—Rzvª£öΜP|¥Š÷ª¶mÙƒÍÿ3FspõfiÌB‘sŽ{jÄU§©VàQ¬09Ìt§t\¼™*ó¹_DáOx5¶q©ºô»L©pímùá¾BËÜVzLÿ ;Îö<¤íéýá¥RxOáñœê`"P|Æáâ R$ 3¾JȺWwçEtA\ªX±ÐưVªâ€6F·¹i$ï72AžÀ|JüÁ%þ"Î|W¹v2¾ÑÂ#ú‘º±cR‡í͉ㅂƒÿ³–£î„ç36±‹Ï:¾o´È´îSì•<ÌX€NÓYa_YƨâæºLHA¢;¼“ß•êGçú˜–C%†Y&Êà5/ªVï µù‰ŠûhVìNÌ»&Ôç>9IXÔû‰[é/€Øû"vÎU·mÁBÇË\µÊbf*ß‘nCh¯O uörúY½ý}èW+üý7„«ïzhÄ=òmâ6‹°Påk{ŸGÍb==&=μïCƒÆ×È+‹øÅ8áó#¥/¦n¯”›UœÆ²°;ŸùÎÙËy³ì¡Æ7‹ò£1\ù€5NæÒÖEÉUœÄùˆ^Y¶ ½"ù6LÇ=Å5|¯~ñ‘ëL_ö_˜ NÓ‹—Übx´ZÝÝ pxÑÚqX”ô }´¬ï`î§ ºñb˜âm#ªÅp¨JTÞX“–Oßd/÷ÏØ†}o°W2°~ÿžQÚ¶ºÔXåþr°Bì-U¢"vúkÑ?Xìí©-º ›vã"YÅhkÒOšwxñ€Â}ÿ:¨’š»µÇÚƒ¾‘ºŠBióÏ=€7ãFèxܧGú`>éœ@]6²/8Hé€ÒáÝÁ'¥v.`í5¤‘܈yÍ…_ÞÒ ¼D¹ŒWƒyWødoÍXøÍ«ãΤªò@Ñ=D_‡ŒÐ’%Ñ—ç“VVLö7i¨Å—±ŽVÒZÕÖoÔ¢ÂÞV¥‘*14rȇ…¶VäõŒÆ xIÃ<ЦÚìYGã¨uï;À‘¸´¹ìÒ­¢ ºn¬ÑɱX±ÍZ[¯ˆ}GiÞ£Ÿ)Ïîu»øÉÞ#YcR5¥!2£‹5#šæ-‚ÍŸƒæ)Œ®1O>˜á×—&%O~=Û%×Ú9½·´!] õM/6©~XÀ%Þ6çbw1pÊñ+ŒœìôGïB›Z¡‘Þ»e3Žžz|a&yº^^©;)>VÏÍ@É\½˜W½Î äÝdk `ytq–ãÜîgUÿdl½i¨&ÌéøôâfúAË'«¤ûFwäàrÕ²Ð^öæ—bñ(ÎÖM¾Í½ÔA›g¯ªšd5|k¸ÖÌhßf>:`ÖÀ»S¹ñ©‡;º=Ñœ~›Ï˼ôÌíw·@L“œîGX-™é϶ðÀiøÎÕJ–§Š1?a¶]°ºÆ›ÿè™ø†pÒÅNÿ›tŽ«é×¶w™ÕŽÞ‡p.¶ÿnÑé@ endstream endobj 2529 0 obj << /Type /ObjStm /N 100 /First 1020 /Length 3840 /Filter /FlateDecode >> stream xÚí[YoÛH~÷¯àã.qß0ÀÎ19œcl'v2ȃl3ŽvdÉ‘äL2¿~«º‹T“%Ëòì`6Y$»ëøêèjJ’Fú‚Ò(^(£‘E° Y¥"¥ T|%$R¦e ¥mäá ÍRšZK¿”,´wïéÂp\´-Œ )_Ãñ©á…q"R²°J \ÐLJ3Œ-lÐ)_8ùHA†•…çÇY]x«Q+k ï}ç‹ ,>•ºôÃ;Xº"À<Ю‘»ÐpSp4’H)åŽPìç 4ôpÖ*C¸•²@”¸³¦pø0@¯‚›€S€,ABv0B{ÀF +íŽÖH9'àX¢&’æIïƒ2RPÂ!¥8BOQw„RHÃøïYüa–tBìh+¤è¼„* òSâ)ò·œ%A¬Mž€~Jƒ3\œaD(ÊPVúh²rRìxƒ3<èÀ·B´˜s¸©¹D¤Ð PBKåÐ~˜ê¡~ˆ§ÖŸ ч£ HZ‹‘bPí´w;`£½F"le Ò ×7( LÄ0€èà÷H‚Ô0V‹¤HâXt6À×`8KˆX ­p;@"BFü€9ÖhºñZ ‰|ƒÅ¨ƒåù¢¾I‹$Ƭ†QàuÈ ‰#lŒKm@„ئ!ä…5QIÚ€c1F¬Ã‡QHbò@‚é-ê PZˆ| —¨æ­ƒˆE’#éqšiNZ»ó»‘¦øñÿ·ý„Ù…bP-w¥s»¾P<>…Äkÿ»8Ck½‹)v]á¤Ü•r8G„8W@™À‡ñvƒiœš„áðD5Æy¿èEæÏ2%—©×÷/;z$®»’ŽéN2êÓ®¨L³h‰÷­Œc¼Å§uQÁÁ“¬w°^¨ÉéÊ,ëå"d vH @ÂÙ€G“@K`$Ò ¨ˆ„œ€‹TË Õ1 ÏD:*žù2Þm8C.¸KLst¡ãQE…Uà‹q ŽS¢iKè;4müGiÿQÚ—·i‹\Ï<!‡ù¥"B%…éŽ RÀà–óÌ"Ýwô: <€|œé]õ‚SYÀf›îW¼%ª ÛÚ$1Nôb”Ž×:‘q¨©ÕÞæH3Í¢J #⯓­.tR²fC\* >Çm‚‡XÄÑÝ.B´ÐC¼AÔ9³‹of¬C˜â,^¨ÖG c9Së‡Äw:r7¾QŠãBÄ_6E2­_ø åähäm1cdòS<Dz–ûï6¼ð˜î$¯ÄyõØô\ÔCà O^Z™îÄëWƒ+xòèù¯‡ýôðå¾àp4¸œ: ØßŸ|+~H<1I…Àôü¸ÃöfçåxŽ{®öppý´^~†KowJÁg>|6Œ†ç{ãËQYû£yyõùvJ“ k€ÇçÁô¨œÿb{lŸ=dØcö„ýÊž±ö’½b¯ÙvÈŽØ1{ËÞ±öž Ø;gç“Ñd Ç««»`%ûÄ> Ù%ûÌ>¿þ\ŽÙýÁFìŠÙøæê¬œÎ†—c6a“qÉ®Ùu9N.Ø”ÍØløÍÙ ûÊþdߨwö׿O† ·4ÊÁÚz¸óË/·BôàÃÞ»£§ˆè©Ë!5 !Å~*ܤá–>P_d°þÖö ýàfs@göÇR”£V~¹ŒXùí|4¸Bà#öŸ†_Á “›iÓ ÿYøaØ·<ð…}¹)gó!ùr3™—g£Qùiž.¦QXtRù˜¡«f£Áì38lþyZ–lþç$wû«œNZþ ›øïýÞééñóè¿£ƒ¾¤€•’B:¿„Ú…’÷ºðUÓ-6±çáÛçO_a†¿|ÖgªS\¯³F­´FèÊ'3k”È­Ino™¤61é×7{¯ŽO“I=)¦De’´÷d’5›™d61éÍoÏŽŸF“Âr‹d¨,‚à»''éÍ,Ú¨¾~ô~ÿXtØvšWñ°Eu´¡×žn|~›:x8Ìã‹EEÌ¡(žMç”óX¦ˆN…ª]-/†å´œ gìb2 ¦‹êyu5¬§S·–ÆbJõt´¾¤.[ßÓr5ŒTÒÌA«Ò{=º™­®¿p‘fÆ«åuùj˜Œ¾{…ÖUè§§ÇOÞadõ¤ŠªSEÙ{ ¬‰’<¼ºXþÒ:ÿ LXtí7UôãÓw¯?<ûû×§ºiRmU,êõÉm’[/z·*¯VfPÝÉ­Šú•QŽa9o‡]ôÖœ‡'¿žœFÐû`—XÑlôðSÕ`3Ô…h Ž—5êøñsêv;Ô—ötë+XÞO¯kèn_xb¯×¬·¯f£ÕôààÍ‹}\MÞ÷º jDÀOg~ïÌÂW.w[N5ïuÖ`|™#¾¸LXœÝ@Éì‡ÓóQy>¹þ>·Ìßhé}ûöÃÉÞo`þqËgê¡ï«?ò[¯¾·®MÅb´¦^ôæ—F ÖAØ‚³Ä›wÏöOþÞB¡SÀ­åuâÓøœ‡˜7W‰žGe»š€sÒšMúª¬½Fé~û–©Õ)µz£¬ ]NËhÑuø¨œÍþ¶ÞhûNèf|úœO¦åÊ’g7j ¾?4×±p«Vß4qÞˆê%u­eá’eúñø|r1_‚ôá§O°Ÿ—³âwhÌ ñ‹}Ó]Œ@½›³y¼Ä›{ûƒY‰O:ïpˆ¦ïk¢RìÉp:›£5ˆƒA}W'ËùçYú‚h|Ó /j•ä}¨Ô~/×QH·2¹B&WH„Íå·_¢uäÛÛË—|sù­7^ñ~ñrsñ­×Smñf]ˆºmQ.,D9·0úÒQ oIMÉ®!Yv$ÛL²nY‰ª\%—ÁTÏÈA¬æ@Vº;³”!_0¬^_Ô +Ã¥ñg³”°¦‡é`ÃRYJX¹Æ¨fJ8ÙtHõVˆRmžûb³Ü1aµdúzImÊÒÜ1Y¡n2äKf©dTCâÐúLÅ!Ë,ÃW‡»n&šóMtM3ѪɄ®mKÖY¢é•‰&‚n™²´Hè,t3D¨%)KóGgù£Åjô•øJ%½4t–?ʯah› —j¨²tRf Ãfv©¥Ù¥²ìRr Ãfv©¥ ¯²¤‘a5CÙLµ4id–4Ò®aØLU'ÍÕwîý endstream endobj 2576 0 obj << /Type /ObjStm /N 100 /First 984 /Length 1648 /Filter /FlateDecode >> stream xÚ…–MnG …÷:EßÀÅÇŸª ¹@¹@Z²0Œ Ç){,r@ˆ›QÍhô^»¿Ö\ë‚€®Cþ“ÎE†X¨¿p,p± ²îKV|ºì’c±àKmÇb]&çßûÚ¸_|!ž·â“uÛ“ùìëÞˆ…\´”cE{6o¯ETòV_Ý+\ÄÛãÙî‹D#ßì"å(0ŽFƒ­‹öŠ Ý¾:Ñ¡Þq,:Ô;n‰ŽØàBtˆ¿ÐŠñ/Ó‰¾/À¢ƒß~çç舥è€Yï舡؎¶F‡‡£#sSDùqßÑáäµ£ÃËýÑá3ô¤èð!ò[üË, ±_Ž]¬æ8çb‹#àèåS²XùE:Ë;°½ãøW|å·y|“~åV|¶.!Ž¿n~Ñ£ÃCwt]Â;:|Ø"þ"#â£è¿ìŽñ[aïèð{ÅoŠèðIÊ-ÑᦠÑá“TZÑá“T:Ñá“TXtø$•%:üø*1b¿*—ꊟ¤ê‰ß®ßoÑá“Ô­Ñá“ÔÃÑwãMÑá“ÔÛGòIÚÚq¹ý­‘Z¬è2¿»âŸËÞ.ù$oï Ÿ¤ßÊÞA>IS‰¯ì2{»U|’¶Á±ò[þ¬èðIÚ9Ñá“´Û¢Ãÿl/‰Ÿä&D‡OrûƽÃ'é”D‡OróŽ?þŸäÖ¸õÈo‹m¾Ýmwt8.{ïèð˸F‡ÇÃoï³è~ùüùåÓ}ûû5ÐV'ü÷—O¿Äš¿¯ûóëë?ß‚Œýワ¯ÿ~ ¼½ýõõ¿oñöûo¿|©Hëã@Ÿn ”.î÷@ÚC Ö@j-ʈøcÃÏœéãÀu×@m×{à:C Õ@tk§@¹þØðs ¤@ «ZH?µãÿH ä&ï“m”¸Ú@M<–#?6ü˜Ž|†#Ÿ];RüÉž‡#©í‘O:òŽ|ÊÃá±áç@¤Àñ_¿¶GÞµRh)P†Àòpxlø9SàLJP™¨màûÃí V»‡ÛN:–‡ÃcÃÏ’1VRÌÚÀDФh%ÅÚ‡ƒ&Rt E+)Ö’¢‰HÑJж¤h"ER¤’¢-)’H‘©¤hKŠ$Rd E*)Ò’"‰HáJŠ´¤H"…R¸’"-)œHᮤpK 'Rx …+)ܒ‰ ¤ ’Â-)H¤` •nIIÂɃprNn…““pò œ\…“[áä$œ<'WáäV89 'ÂÉU8¹NNÂɃprNn…““pò œ\…“[áä$œ<'WáäV89 'ÂÉU8¹NN‰A8Q…“[áDN ‰*œÜ '’pbNÜ…´Â‰)ðcRpN ìHÁy'gZ© ´(C`!å±áç@N“‚}×@mßIÁ>C ÕÀŽìu,¤<6ü()CàªÖ&Rl Åv lI±DŠ ¤˜ÔÀ–K¤Ø@ŠUR¬%Å)6¢•kIÑDФh%ÅZR4‘¢)ZIÑ–M¤è@ŠTR´%E)2"•mI‘DŠ ¤H%EZR$‘")U8~LG„U8~ L‰A8Q…­p" 'x:r}8´Â‰$œ„U8Ñ '’pbNTáD+œH‰A8Q…­p" 'áDN´Â‰$œ„U8Ñ '’pbNTáD+œH‰A8Q…­p" 'áDN´Â‰$œ„U8Ñ '’pbNTáD+œHÂIƒpRN´ÂII8iNªÂ‰V8) ' ÂIU8©NJÂIƒpRNj…“’pÒ œT…“Zá¤$œ4'Uá¤V8) ' ÂIU8©NJÂIƒpRNj…“’pÒ œT…“Zá¤$œ4'Uá¤V8) ' ÂIU8©NJÂIƒpRNj…“’pÒ œT…“Zá¤$œ4'Uá¤V8) ' ÂIU8©NJÂIƒpRNj…“’pÒ œT…“Zá¤$œ4'Uá¤V8) ' ÂIU8©NJÂIƒp’TRZá$I¤ð@ WRZá$N¤ð@ WR¤%…)<•nIáD ¤ ’Â-)H¤` •nIA")¨¤à')ÿ&ò endstream endobj 2577 0 obj << /Type /ObjStm /N 100 /First 984 /Length 1787 /Filter /FlateDecode >> stream xÚ…—KŠ$G †÷}м€… 0Æà•1Æø³˜Å€±aÜ6>¾¥êÊj)RS±éVvezdüÊ¿°!p`kóÐæ¿ûÑ:z@2y![ã`ø`í´Cú8¦Õ9Î ÐxÕCgó@Ž9Ð<ˆ¡aÌÃò°G–›xDÍî†ã-Gcq~ç£ y‚Þ¼PÏ`´žBÄ"õb9´{¶“=;=Ç­/ðKöÞÕsýÀî9¼ bÏAÍgà9Ð>ÖÃ&‡}xñ6>Tò>¿é—àc˜ÓsØ †ç°RÏa…Ûx­ÕiC$Âæ‘Ä€¡Ej#™:oÚ詳xD ìÙCR÷i#µ¡[d9fŸ/5ržÃäFž£ËÁØ<‡=nÆé9dLÃsH?˜}œÓ ypožƒí$ô[U6X-[õG1m’ìYćøØ-²“ÒnÙl’‚ÍŠMRü>›¤zUöp÷ûlt"ì9l’Ò‘-‡MRúôÿ°VEo<›¤è­z?ÞBS?Žþh-’£7Ÿ©Ú$í¸ø±°IvôêÕ&ÙɈڥ´¿XGôûl’½ƒßg#é]Ù£vôa£³Ãe9Ô{S»ìjÏ×"<††¦VÆhÞ›Ú$GóÞÔ&iËf¥6ÉAÞ›Ú$£“m’CÀÉ6É!êdÒÃ’y-v¤Æþ)Y¿¥)ZŽy«ÔŽ€Â­R$‹”_¾ÿþåÃï_^ÿølÇÛþÇo/~ð¸½Å¿~úúùÏ×·Gùö‡¯Ÿÿ}[·Ë_>ÿ÷ê·ËíòãÇ „w`Ó °g VÀ6P6@JÀ{Á+7@ÈÀ^Û;æs Œ ¤ €}ä „(H`KÀ{Á+ž}ÿ' @˜ó„96@ÉÀV{òˆx¼)Ÿ+Åßk X)4´¬›–U2K`hY7-knYË–5´¬›–ÇÌÀºå÷å௺çÀžeËc l€i9œ¯@@Ü!{ |_П/·2 X-è€}ä „(H`ZgÁ+p³$+¥—ËA‚Rd£ÉJéår Ù(E²R¤TŠ¥ÈF)œ•"¥R$(…7Já¬)•ÂA)¼Q g¥p©JáR8+…K¥pP m”BY)\*…‚Rh£ÊJáR)”B¥PV •J¡ Ú(³R¨T ¥àF)˜•B¥R0(7JÁ¬,• 'l 'dà ¥á„`8ac8!N( 'à à ÙpBi8!NØNȆJà ÁpÂÆpB6œPN†6†²á„ÒpB0œ°1œ '”†‚á„ç†óö]9 ¥ØM¥´ùÜpÞ¾r'`+=yŒJy¼)Ûs Î ”ï@Õ °g V@( % ÎȈ d`/í8æsàHphö 3J  m€-Ç(€¥tÍÀR)=(¥o”Ò%K¥ô ”¾QJÏJé¥RzPJß(E²Rz©””"¥HVJ/•"A)²QŠd¥H© J‘R$+EJ¥HP K)'¡”iðE-•tšÇŸ¾|ýû5”øó'»D> êýcÿý]ërIdÃôd÷r¹Ô pÖ Êã»ä[¹ù­Ìg§gõg7·êß§u¯×Ìuñ¥”E¥$)t1¢”»§²{ Ý_œçÙî½\Ú¥Ü.mÚŰ?.žtM•÷•ûÃþ¸xÒ˜÷–ûÃþ¸xÒØòþÀr`ØOºóþÀr´°?.žtæýÑÊýÑÂþ¸xÒ–F+F c1¡ý@Þ§>ÏuV|¨–ÔX3CÐÏâV×ÌcæÇÕÊw09­nUO't¶RIrZíéBЙ_º¥=Õ`Ouµ§`MY¡{ª«=½“h´´§ì©®ötf{ª¥=Õ`Ouµ§šý¨–~TƒÕÕ>N½$ÊKíQâý žßrîg°_RqHµèçÁ>»‡²ØwýèjMWB¶¦ZZS ÖTWkzr–kª«5½ÓKGKkªÁšêjMW`v’ZZS ÖTWkª¥µÓ`>u5Ÿ—²F^[zºç·#ó¸> stream xÚ…[[“Û8®~ϯÐãäÁgÅ;Y5µUIç2©Í¥7ÙšÚsöA±•n¸-$w:óëEÈ’éî~˜„I€ œ^–EY/\áþÖ…°QH­hPúBI)4ýGYhG‹]…q[¸2rTá¬{Fƒ²ðÚÇÛ"H¬ñ$¬%FôGé,œ+„0#Ò ¥Âˆä(Mzœ¥ý*`%Òˆƒm&Ò`H¨…(gâ¨70XBž¡‰€?œv…,fµ.¤#'´)_H åN™B* ½Jt d¸4뤥QÀ:2RZ Éä:é<ä‘÷¤·XGþ“Šà¼Ò‘JDQäbò¥ÃHJYÿŒFªPÚC¼×…²%özS(G¶ÐÈ ޤ‘+Tp‘çé B” -GÓÊB+mAd¼ÂˆÎ‰„’‚ªmp##¥g#[˜  -1BCGð…‘&Žè€´eYíÀ»–àá`•”E ã"t¾AÈ#¡'M#S_B2Á ÄÄÈ!žUœ¦È,‚Ê"ÔK# F!Ì­…n„_é¶‘Ÿ±éä­¢€ÑÉVQdQ¬7Å!åD€\EMÁ·!SÂ(—´ÉÒA› Èš(A“6©%N‡ ѧ4$mÒ9óì×_ŸýíK3lk$ˆ ”ÿüìo/æa_V]½Æä]}7Ö…H~¬ï1KÎù÷¿/’“íõR`yV ™ TO ÉàSr&°|\`é—õ9e8 ,ÝÍR 8+ÐÎê& ÉÂS j&A,% TÏ%¨„ñMÓõÃÌÄ÷U$U"/Úí^ ‘é*'].ø….ª|fEy¦:°·&Õr¡ÚÛ…ju¢Ù7ÓlNP²ª¤9œ‹VôL‚|BB9·÷Ü9Ç|r><.á±À³úFÿF§—˳gý)d–Àž—0ÃèÂãÜ¢fàâ?#Ðù™@û€@–pÖ$gfÔã^²~)Ð.bp²xŒA¶øÁtr¦ù¤š°ª“-öX/¨AzÂØE½˜œ1+Æ2ɹši¶3Íú Í‹:ó5(hÂR 9+pVLŒBà2’Á'Í,ÌCù“$$ O%ÌÆÈ'êÛIËãb‹Óq…e}e¦z–i:<®Z/3ÍœÍ4=Ë4mŸ¸L—¹Vó<ÎåZ%á Ó!I2/L.—$,X¶A¾à¦•„/ø‰"ùaìAz!=ΞQl±…ÏS"ÄÊ’ý,=HÉç+Hųˆ$>U>/ï\µ}>NçªÒ¨œ€)I6E!‘Ê£dRéÙ÷ ©TN! Kb|Ä-Ô«xÐÊžS¬BLUL£€U(&Fì ¬BóF-"ésÝ1§h:×­UL'¬ULA§u$§Y`nR±N1©# Ÿ«‡Ž8}F}Ä8ltÄø\DlŠVY²n#"9­ )r·CAœÎu`•S¢`U%£1Àª¦D7Àª!¬ÒL$B7× ˜ËUÇàfMãq'é@ “L‹7B%ð2V}éÃ)Ë3‡,ã½ k§EÒ Ç:€˜c Ù"8ª‘Œrü40W¹˜ËzXžœƒ\•|r•N‰* D2ù'mV*!s™:$¨äjô”Ž%$ÉgˆÔ”!áCJH®6È8Uf ¹˜Ë$%’XÒÇèŠñ!Õ4CWU$™2YQ†TÌeê…ʰ$‚¤,K²PÎ ˆT'÷Êó ìõÙùA.æ2…¤‚mEÚ)Ÿü„¤S|ë åt™Ô!Ô5{™¤U†WŽ9sÑ!Ó´N¡†<›d™æ¨0„H[ž!Dš[²ìƒÔ_Îäž%@šcˆ„ÁLJ .D–.=րȚ%ÈÅ\®Ì3œß–ÉÚ=ÖAˆ ßhX•À9’ktvvйL#H†ÓÊIÉµŽ v $Hì{ó«r1—+„±ØmŽ Ù2iÇÑ0r»âÑ\‰¬˜A*æ2už Yö W ’n¯Ñ‡&·y‚d9ˆ=A²Tž$[›E'äb.Wè±>9Ç» '–2#ß„¸êØru(fáL1 €X:^¼€†—ÝÐïrËÐî 6ݮ̪'äb.Wˆ~X¦êòb¿¯«®Ú­kTÑpÊü¿R——Õ®Þ¢¬–§³= ^òÁ‹îúpK/ì¸hww4lÚ]Þ9ýâ0Ü´qò“¦ùÌà—/?ýäLr^¾¼„’j·Á_/_ÿsÉò—U߬Á~·ê®ZÃÜkɽ/›]ÕýÄü·¶»­´dÿŧ^ü‚B˜¢ö‚ÔwUíÙM1š4-ÉL¾¸9ì¾÷±yJV_´··Éä÷Í.:öÓ>¹èt±$×G°Ú–÷?wCu‚ìxj7tÍ×ÃÐì®ñ˜¸G竼KaÓ síþg;yãÐímóW5ºÔò;óÕ»«‹·Ÿ/Qi’“_5=ÌÂ92^ßW·ûm$áK-±*>K•I÷qYf_šÁC€ NbÅ7cÒü¦ÙFOï° ÞHaòæ°‹¡1Fʦ¾`ràÛ‹÷8;QXõ¹þVÓCiârŸ­É×g¦¿ýüé÷è¯d÷Ûº½½kêÿs;ó¤÷7òbÛýÄrd¼ûxõ7F8’P”T÷¨¶ õ»]?TÛm:)êгb›LX®Ì ]æ?ü"÷[OX.ðÄëZŠ•´äõϯmÕÅ`¿¢œÖ‡îgïßE( õ}s}ƒž%²ï kÎìÉÌOÄtû ¾i®Ü$ ·-ïÛj3Æ8s>¼¾ú “©lªm?·¬ ÓäMM5¤YWñÆìvsƒny ÖdEä‘×RéXù¡?´©HnØ>¾ÿ Õí~¬})üiÔ5±”k¾d?¾Zý«î†ÄeÙÄ­îÁ ÜlgÝnÛß²ëg2î¸,@3÷0ô$3²V×õ¶9a÷#›AÕ|ÁGÞ\?Úî{Ó*>hC»[½>¬·Í¦®v¼¨f2Í{dcŠ–^³ãUÔ~ýÿzø7üIáÓ›7pw²úÓ§·ïÇýM<žX®ÌqEªéˆ>E™gwiÏZîê.9 ÌjìÃV÷eÐ.«õ÷ê:ª{UU³7šÍf(]—Ä‚GE©X]¶Ín–1Ëë~@ž&ÿ\vÍ%âÖç“ËñËà²kwTÛ›ÄÏ?qžƒp²+ƒýÏß_¼Ây%Si‡³ÕļmGéúÛo«Ÿ1ì,OÒÓ}¨¢/ø«ÓÕ?^¿Çs€ÉËß^~ FVùFý¼"3諸‹UL™dËU{èÆÖí¢Ýœ=—ëj¨:®¢³|á>W‡ýžªwüÒâ˜k¼Tq[Œ6MW¯SÁÑܰ^ýì‡úöñS˪cyzwæ†/|«$K¿Ô÷Ô(¢Úï£XÍùóhäÆúËn`*ÿñsÜÈú}×ÜÇ®sj$Ç(Š_±ÂCkNÝ2ÜÉø§öf ÿõú˜ù]0/Û éoÆ|seZSm6Ï Ïo OØ)¨÷•õ7£š8™PíW-UŒŽJ#ö&ïW‹'ÄT\4_“_)Óåáùöïºk»Íª¹¥$Å/ÿÚÞóeãùí™›®ú^V½vÍÖfÖ±‰Çƒ8²‘±°Û²‡Æ9ÖÊŸ~wßµ{pÅ‚Kå —–W“x€PY °qAn廸ÓïzÛ®¿ƒf³Æ‡8–9ÈF¯“ûØK&W¯]ßv«~hâùç¿ÊDuËe¹Iãìð£Ö7xÖ%olêo‡hÁô¶pšükÓ¬#©˜¤‡csÃóçŠMCÝÛì±x¢–—fæmš;:ëOŒKòæp»_ÝËbâmòK½¾iA¦°£¢Žâ³Zoëxh!Ì'¤ô–ÃWÔ,e¢öÓ…™Ëyœ_•<ÓôÝa·‹ÕËs“Äs{jAÁ6Kv½Ï=ÒŒ»êS3ŽÌ:‘ÕÇBïó·Mfâr˃zÜ-è–Š”^’)öúŸxU±ÏûuµExLŒ;”àÀ­Æ£uõ½þ‰&"olNÔÏ—ç¦Æ9ÚPC”šËß7ȯ ÄÄ„´ÀŸõêû&’¼ç¯¶EËNýÖ\W{|2Éòj®2-ËÌŠìãg¡ŽRDZOOþzˆ ÔF Þ¶GÖ® '3i£ 3‰cå`‘ÜHÑÌ7ê,ûÄ&CrbåÉŽs š]3¤ëô¨K06‹ß¶‘Ý~¯ÐÍo7h?Žpn«fÇFqhEöÀ¸÷'LÚ6±Ÿç L6,?g_ÝÕ¬Ä]?´ív|WY]ýmCg¼ÆO/Ìîêú/_%×ÓÛCpb_§lEá6Ä_ÆKKò=™é×È5NŸ®YZ™‰3ÖçÀ?AÞÔÛ=~Ç÷GrQ:¢„1R3oY¡’ç3{nú=ì:]¢¯Ë戔`©ÐÜ©Fúä5•¢¥ÙÝ4_›aõ£êÆ:øÛEÊa 5Pñ¡šÿж´&ß“™ßLO”Ài¶­n¿nèêöüÓÌ6Þøü½cKïé“3ðw„>¾ôÉ#™JºVÙ©µÎf¶!mðÓä$²ý¾¢§J{»¯zÔK¾r—«¾‰‘É—oœ¥–¾†NðÍŒ?´äè ¸ c@õÎú¯ÑÌfVR Ãá~gDz…Š©Ô‚õµêG~à/¤Gþ¸<¥HÃ"ÃTW1œþ™ùÜ®¤ü¸(7/Í,bží: _âÆø®¸#êS9ÚQ2VÛ¦Fúò3> endobj 2644 0 obj << /Type /ObjStm /N 28 /First 272 /Length 1179 /Filter /FlateDecode >> stream xÚWM“Û6 ½ûWè˜=hVà—¤™LÝôÐi›v:I/m\‹k«•DU’×»ùõ)B¶E%Óé À‡÷@”™<ɦ„L ”ÎP ÏÁy"…÷IÎ}N™”\ !³`¶ ž•Îb ˆÂ[<ÅÅ-‘@θó!|ÌY eNæh¹³Š„e…ÇC(Ü …)ŠÉÎRhå>¥û©T‘ð,wuU™p`®þäà bβr÷öíîþƒn͘üñf¨ÓªûF¿Þ% ú-ñî±Óýx´“÷ËÙ?îucœ;¦›<8Ì”î»ÿû.)n|¶{²C«›t0OuXã«}ÞÝÿT·õÑÙ^÷y÷îÝ—eZ[“öz:ba”»n¬®‚Ÿ ¸ø[;Õ¶[)¶„L÷ì=öÿ fNkµÊ5÷˜‡ÏùMÓ `F=u¿Sìô0íOØí¼$ö1}Šê]=Î+ç©›j‡!Ã~]ïUN™öiBX]0ó¿!<¹IŒÙöz rgbFÌ`ì¹î<&5íôè…”©nMZw.qœFŸW„È »Ñm§w–+矙Èìã_fïɲŒøÎT¶DÄ—,¤²÷(äª`Š[抧n¯'?4B§:ÝëwaBVîzXÜÆIô¹Åʙڡ>Ì-*ÕZÆšX¼,Ò‚fž×´ìaоå…"EQ€\X> Æ|qŠ ƒÅyœÚ&}ìyô cKhºs×ÔâëugpP ˆf~‹ØeŖ޾zJŸks…/&=üvP历È{Ã&újÞ"€üÚ“Vƒ>{wØó±næ¼rƒö5ÑÅ)¯,b*®‚Ùq3§ŠÉ%F,´ú<ÔŽjž©«ßx¥µ-¦Ž>3¿ŽuWÍœY±æLdnScÎ>:š—~f&á%œ: {äåúhϯ½ó±ùÅÚyiÔÇ›bsÞBèǺÂ&Ã1g²ÈÈ2œŒèEH‘É8g49T¼ÌÖÀÀ”CV1pIüJâW¿RAÅãó 9âŠr—è•D/œS¦²Œ ƒ­q%ÂÁªŒÓA†$C‘‘“ÍUÁ÷ÁvÏ8’îAÜ(@,X±F‘€hlÿZw¬òá=Î~c‡¸c Æ@ŒÃqFƒh°h/8 ø›O]ýâèwu§‡WgýГníﵨ2#)Œ¤0’¨ŸŒØ±h³ÿþá#V¥w¿Z}£,UH #5ŒÔpj*'&<Úú[ø ŒmÝõ•>›aÜÆI'œdpj2'Z<‹^o:,ž¹Ÿ H€ V â ¢—ÃA;f^×_JTBOA<µOPuIÕåW¿o¶/L*"Ùÿ¸Õ”$e’º+©»’XKb-‹Í[íëÇA’:EêõVQo1PâÇáÛÚãØÿ¢]‘@EÕ¶ÀÛåïÝ×àüדÉûñµ7ÉýƒÆ#j»û_õŸ1|5¼¨Ýý/§©Á‘÷.9»æ—Îÿ±ñ¿Ý’Ÿm…(ŸFCùþ_PA§¶ endstream endobj 2673 0 obj << /Type /XRef /Index [0 2674] /Size 2674 /W [1 3 1] /Root 2671 0 R /Info 2672 0 R /ID [<5077B67454DDB71C18377109FB9D0017> <5077B67454DDB71C18377109FB9D0017>] /Length 6102 /Filter /FlateDecode >> stream xÚ%›}p]i]Çïï¾æ¥IÎM“4é[’¦yi’&mÞš´iÒ—4M›6MÓÛæ¶i›´U<•EÄqXPYP\×ÁËŽ#;Wñv„«Ë«º£ ®ƒ3A\…•8ëz?ßüó™ßï<Ï9÷yžßç<¹99I$‰—-‘hJX"ùÁ*2+‰d"Qg šæž®¦µwƒNÐcv¿UÇÑ%’–¨tZdAÔƒ´%ê>¬ÖZPǹ½D5 4€<Øa ç3êÜ:w5‚VÐl‰¶Ï«ËNZû‰ÚA›%Ú?®†]`è°DÏöõ4…A¢ý`¯%F¿­†}@ŸÑi‰ÙvëÁK,eu¬èÓz-QèÕ±> ‹Xbó“:vˆê : †,ñ ¯UÃ0 CDGÀˆ%^ý5ŒÒp€h L£–xÝ+Õ:&À$˜'À1K¼eU]fÀñd"í^'š³–øÍËj= æÀYpÊoû„Nƒ3|¸¦zÞïšTÃ8g‰Ç¬t,Zâ[ÿ§t \9w˜èŠ%¾ûj½.[âÅŸUz¬˜¥~Qé*¸aÖø¬Ò5pÍÌy«Ò"(˜ ¼Y©&³n› Ó±›à–ÙáHKòtl˜¿©.wÀ]³Å¥[àžÙùꌤÙÖ²îƒf?ÿ¢p·”0{ôªRÌ.¥-ùd¨YK\Êš½íwt ÇK8^Ú¸TgöØöH]BÛ*—¤rÕˆd™*íÈ_BêÆ–šÍÞ#‡JmÉDj²:ótî*ÑŒÙû¶G襳ÒG•âx©ì6{æ:¶ u©*º ·¡w ÃJX\âö+u™}ö :ƒê—ª–$G/ãcöeÝG%ô.õ›=ÿ¥Üñ%¤. ˜½ðECþR—ð 4nöýY5Œ€Q³üT)î–0»t `q©:­—¾¡VnˆÒQ³—KJ‘µ4fÉÝw•b{‰; 4 =We*ØÎ’¦˜êQZO.Í[²÷]ºÀ€ü¥ÓTACÃÄÒypÎ’‡·'³0»¤-Yr&¡î€ÒE>è2Ñ ÀìÒeKžýku¹bÉÕíeBêÒ5K®QŠÔ¥‚%_5§©K7Àº%™×1¤.ݲäk ô.ذä£÷”ÞH]ÂØÒ¦%ßÖ¨Ì.ÝcF£LŸ{¡ôÀ’ïü\‚4a©ßžKXòËJ“ eÉ?©WZªz?ó¥9KþíÇu¬T|æ×”6‚zK~i;Ý@3Ø Z,ù¯Û×kŽ%¿vRé.·ä‹_UZUÞ¢ZŠwhô{@»%Ò¯.`7Å{-•ø‚ö1ß#D,Uÿ—:Ö º,Õð+J{A·¥z¿£´‡@Ÿ¥†ß«†~0†Á ¥Æ¾§†!K< è0±ÔÜC¥`ÔRK3J5Œ10ŽIK­~R­Sà8˜¶ÔÍÇul†Ñ%: NXêöWÔ0 N9Kmþ‡ŽÍƒ3à"8m©û÷Ô°ÎEpœKภ.«`ÙRî¸Î]W†Vü2X×Àup¬ƒ;`ÍR¯{DçÞ·À(€"µd£)v9´ ¶À=tî]K=ú¼¢ûà#cs»‰û-=ñ­žFÜÎNF\/ªÕŸ!ïiQÜÒ ÇUøÜR'£zKýñ†:ãiä€FKïÖ1ìŒÐ6B³H:æ-õô/©•#Ô‹X¡h/À°¨ÍRîUœŒ:j8YdI¢n€pQUÇg~¢Î$‚Dˆ ‚ƒ–ú›’Zû&FØabÄ U%ü»'Ô £ «±Ô—_V"Eø¡^4a©¯w©a ^TUï[oÒ±€fšEUõ^¼¥†9€ŽÑ<#Åñë" ‹ªÖý´Sý0,B½á"\‹3B©hÑÒ™6õú¯"LŒ–†E˜!W„9ÑK7ý½ÎXøa]$¥´œ×-ÝñZuÁºÿ"äŠn[ºo»Z(ÝE¥[–þˆ"©‡k‘\›´ôsÕ^Õ~IféÙOéX ¤AÔ‚:°4€Fà€6PcéÅk:·ìõ 4ІÀ!K¿þ›j£`ØÒŽè_IFGÀQ0ŽXú±„ZÇÀ10aéw~OÇ&>|³`ÚÒ¿·½Ä'ß1~^n’Îypœ ` œ´ô|A§-‚óœ«)œgÀ9öˆû\O—ºVÁK¿ÿtî%°–Á¾iéÜkથË/«ß¸ –þðöp¯ƒ"¸ n pH®-°né}TghZ·ù ¥÷,ýìÓŠî 7m™7°á%ËÈU®ºö|‹Rü+gAÚÒ_mÕ1¬+c]9gé›Ñ±€Re$,#a9ê,ýͧÔ'˸VvXœ{D- ÙÒßÿ˜º fyhµôKYkc|¯¼´[&1®<-ï{,“Ò1<-wý–©{RÇð´Œzeì,w[¦á5¯Œ“僖iD ýTP³ÄÉò!Ëôo_~±àPY_ޱ³ŒuåaËŒ÷©Ë€¢e-ã_yÜ2óßWë˜S–Yø†Žalù˜±ÌÒv?}ßrË8TF®ò90k™K_Sì,cgYË(ZFÑò¢eÖu •e§®Œ„e„+_°ÌÍo«õÊ—ÁUpÅ2?÷F5 kˈTV¡ðª¼f™Woϲ0±Œåu€“eœ,ãd'˲îåÖ?`“‘9›–y Z¤&ãØ}¢$H4È€,È*S]νO§ÕƒVPg™7¿¤c  4@›[3Ø Z¸Êi¢] }€êOm–yìºhØ ö¾ÐOò…~r?è] ›Ÿe¾à0ÇÀ!0z,ó»/ë¢C  u£à|ïœäëG°“‹2È`‘æ6 ¦À) iÍ Ë<±¡:¦ÁqpÌ‚“\E3: À"¸æ-óþÏéçÁ°.€‹`\ìz“—Á ¸ àXµÌŸþ£®§_×À5P×Á P›à@‹€Ó|ŸÜ°ÌŸ÷êªRe `X€/"HÔX¶‰_BÒ9Ö4@š€¥ P%@•@FTúÔ´.Š90'h¦ª'‰˜jÀ/¼æ˜àF€A«e¾ø@@•@¿öuº,óÏjE® `]€ªª‡š¸PÕ ºû|ý5: A 49ÁÀƒ@ƒ  Áœe¾ûOê7Ð' Èú1† U –,ó¿ŸWgªPý`™uÁµ€’9 ‚ÁŠe^~V)XÔ< æ5¨y@̓ €/ª>Ø¢ZT5X·lö=º2úþ€VÓÖb YöuoR¥³ jA3ÈX¶í·ÔZêAh5  èÇS´€V°ì´lç«u6° ´ƒÝ tƒ`ì·ìÀuF8zAèc`Ȳã×ÕoŒ€Qp”%ž'Ò7”qËΫߘS`œÓ–½ø uѳ‡@;’nv]ê X‹`œ¶ìÚv, @,ô8áX—À5pŲOé´U°®ƒ@O…ôU¨`ÙŸy‡úÝ·À¸ TÆ» ¨¾KgWe|`Yï€R*íRi7Ò Ã ²\Ã%uÙr–ýõO)¥ª. ¸ÔÜ¥æ.åv©¯Û`Ù7ÿ†úQx—ªºÍ–}ûwtŒÝÖE\*í²ïº»,ûøçÕ…]Þ¥ú.Õw÷Zö³jÀw? æn—eßÿœÄE·‡Ÿ&ê‡@¯eÿl»n¸€ªºC7Ü#`вuXý|qñÅEwµì³ÛsÃ0wLXö~¤c˜ã¢”;ıìW>«V=žÅWã;iÙo<¢ýÒ…>.ú¸g,ûâcjÀ›\ôqÑÇEWOéÎYöG¿¯~è㢋\îp`“‹4îŠeúu.¼rñÊÅ }\ôqÑÇE}\ôq7ô¹PÏ­îöÝL‡$H4È€,ÈP ê@=Ø@#hȃf°´€VÐvvÐvƒ=`/ØöƒNкÁЂ^ÐúÁ8Á‡ÁGÀQ0Ži0Žƒ`œ2bÝröc­Õ8˜ ÜûA—åz^PاÀipœ àXçÁ¸.‚ep \+à XWÁ¸ à:¸ÖAÜ·À¸ `l{à>À)xxàá‡xxàá‡xxàá‡xxàá‡xxàá‡xxàá‡xxàá‡xxàá‡xxàá‡xxàQxÂ{Þ“S–k}JÓê³Üñça„‡Fxáa„‡FxÔ×›“` `‰‡%–xXâa‰‡%–xTߣúÕ÷¨¾Gõ=ªïQxoÀrÃÏj ˜£<ððÀÃ<<ððÀÃ<<ððÀÃ<<ððÀÃ<<ððÀÃ<<ððÀÃ<<ððÀÃB RøÂ‡>Ôp-7ö¨"ýN¬‡·{-·Å·õLˆ!n„¸âFˆ!n„¸âFˆ!n„¸âFˆ!n„¸âFˆ!n„¸âFˆ!n„¸âFˆ!n„¸âFˆ!n„¸âFÈâFˆ! „(¢@ˆ! „(²„f¹³ŸÖÜ)D‹-B´Ñ"D‹-B´Ñ"D‹-B´Ñ"D‹-B´Ñ"D‹ê‡l !n„l !2„È"Cˆ !2„È"Cˆ !2„È"Cˆ !2„È"CHõCdYîò~MABŒ1"Ĉ#BŒ1"Ĉ#BQ-w–?eg $A ¤AdAÔ€ZPêÁÐAp@4ƒ ´‚6° ´ƒ°ì{Á>°t‚.Ð €p U¿h¹õ7j½–{Ó´¢C` apŒ€Qpc`L€I0Ži0Žƒ`œs`œ§Áp,€s`œKถÁ%p¬€+`\kà(€ëàXà&è·Ü«V4ý"¸ `l{à>@Ÿ3|ðQÀG|ðQÀG|ðQÀG|ðQÀG|ðQÀG|ðQÀG|ðQÀG|ð©¹OÍ}jîSs¿ô~ AnYî‘ÿÖô{ÁrïH(E|<ðñÀÇ|<ðñÀÇüêOû·žÓ¹háW¨kÖ‡£…?Iªá†ŒTƒD†Y},ñO2>Uü“¤Híã‹?OªY"šT3Çÿ,©V}üs¤Z!òÏ“jÕÉ¿@ª•Ä&™T«‹RþeR­8^ùWHUäò¯’ª2æ_#UµÐÌ¿Nª âš¿Nªª"—“T•¾6HU}¬óïÊÔó7Ie þù÷HeúH±)NXîñ ÇÐ,ÆÉ8EŠz1bÆRtŒ±3Α¢h¬cµ¤jÐêIQ9æ#ãR]…ñÅM¤(3™8OªdæñNRn˜eŠ[I5>Ö4®®s]ž[(¦q)3Š©V¼‡”[-¦´ñ>R¦ãAÜIÊ-#MÜMÊZÅ÷rëÆx÷’²°1òÇý¤Üö1ŽÇ‡H©BŒèñ)ûAŒíñaRJ£| 1ÊÇ(ŸgŠQ>Fù<æÄ(£|žý*Fùåóh£|Œòyöµåc”ÏãdŒò1ÊçÙÿb”Q>À1ÊÇ(ŸgŸŒQ>Fù<¶ÇÊçÙOcòyõÓåQ>Ͼk,(Ÿ×E5p”ϳ?Çš%Êç5- ÊçÙÇc­Êç5\-6ÊçÙïcUåóš›Êˆòy~.Ī9ÊçµåóÕʽ»ªü{ÿ+A„òùY¢$@ùü ¢4@ùüq¢,@ùü Q @ùü4Q@ùü1¢åóSDåó“D@ùüQ3@ùü8Q @ùüQòG‰Ú”?B´HùQ¢½@ÊíRþ0QòÃD€”":¤ü Qò‡ˆ€”W¤.R¾ŸHדò:M.å{‰4R)¯Ïд¤|‘Ö@Êk@Z0)ßM¤Õ•ò½J!å;‰T7)¯©Î)¿èòZ—3@Êï!ZR^‹¸¤|ÑòZñ‹@Êï"º¤¼Ê³¤|+Ñ*òªåò;‰ @Ê«ð7€”Ï”—%·€”o"º ¤¼”º ¤|Ñòòï>òU1k«Êÿѯ&ˆ¤|QHùZ¢4ò5DY åsD:&åÕ  Hù Ñ åu•F åSDòúÈf å¨Hy¯  ¼ó€¨ ¼sŸh7@yçÑ^€òÎÑ~€òÎ&Q@yç.Ñ€ò΢ƒåÛD}å ¢€òÎ-¢A€òÎM¢a€òN‘h ¼³Nt ¼sƒh  ¼sh ¼S š(ï\#š(ï¬(ï\%š(ï¬Í”w®(ï¬(ï\&Z(ï\"Z(ï,-”w. (ï\ Ò(﨟.òÎy"å]TGyç‘f‰òŽF %Ayç,‘Öå W‹òÎi"UåÍMeDygžH5GyG !APÞ©®PM¥ª|‰œ5”wXº þUPÞ9A„¬”wXç fWPÞ™!Bù Ê;¥‚ò”wŽ¡|å*XAù Ê;“D(_Ay‡rWP¾‚òÎ8ÊWPÞÁ ÊW¤üQ"”¯HyDª |EÊ¡|EÊc]å+Rþ0ÊW¤<ŠVP¾"凈P¾"åñ¹‚ò)ˆå+R^‘ºHù~"]OÊë4}¸”ï%ÒH¥¼>CÓ’ò=DZ)¯iÁ¤|7‘VWÊkô*…”ï$Rݤ¼¦J¥+R~ZT¤¼Ö‡*R~ÂU¤¼;+R¾ƒ•+R^+Žò)¿‹å+R^åAùŠ”o%BùŠ”W-Q¾"åw¡|EÊ«ð(_‘òy"”¯HyY‚ò)ßD„ò)/¥P¾"åˆP¾"ååÊW¤|=ïZU•ÿà‡x ½(åy§¼˜R¾–( ¤| QHyÞ+ꘔWƒ. åùÓGqòºJ#ò)"Þä-Jy}$É,Jy#jR^ããU‹â.~yäX±tÞ'â¥ôâR^ã,îzF¶EÄïœE½u¿IÔô×ð»D¼TÔ<·‰ú@?éÑЛ鷈xé¢8Dz“ˆ7Ó‹‡I‹D#@/¥¯ú£Ù ¢10NzˆçÙÅIÒÑ8Fzhè¥Ç5¢ã@/]%š'IW‰æ€þÂû‰ÅS@/ì®ñ¢zñ,ée"„Ï‘^"ZKààÍô"K-ªUgè*º²>M#Ш4R^3Ò,5s­Õy˃ª¥G ¦%Ö²«*%{¨úª–ª¯z&¬¾iSÿ2 ‘æ!"=D®‡ú[>ÌY.|¥úÕXîÅO(ªµšÓÿ¢¨Îjî¼UQ½Õ¼þÓŠvXÍ»_RÔ`5šRÔhµ“Šš¬vö9EŽÕ¾ý‹ŠòVûÜUEÍVûŸ?R´ÓêN?¡¨Åêž\WÔjuO{ŠÚ¬î{«Šd±VœÅ~¨7aXñ‡¬øCý/À²ÕïÿRu¾½©âpw‚_iöâæ>À6Ü<Ø››oó0`ßml¹ÍG»móÐC“  ç%S@J¦ž’z@2 ôldè±È) '"g€†,=Yz²ôôã"ЃK@Ï`Ã+TWrž·¨ë ìu…$`›+¤;\! ØÜ 5€}­PØÒ ;»Y¡°‘ÀVhl_…ÀÎUhüœ.´~Dvƒ=V?7]ÐÂ…ÄÿæÓãA endstream endobj startxref 738377 %%EOF geomview-1.9.5/doc/geomview.html/0000755000175000017500000000000012310162311013671 500000000000000geomview-1.9.5/doc/geomview.html/index.html0000644000175000017500000000734512310162311015617 00000000000000 Geomview Manual

Geomview Manual

Geomview, the interactive 3D viewing program.

geomview-1.9.5/doc/geomview.html/Intro.html0000644000175000017500000000537312310162311015602 00000000000000 Intro - Geomview Manual

Next: , Previous: Top, Up: Top


Introduction to Geomview

Geomview is an interactive program for viewing and manipulating geometric objects, originally written by staff members of the Geometry Center at the University of Minnesota, starting in 1991. It can be used as a stand-alone viewer for static objects or as a display engine for other programs which produce dynamically changing geometry. It runs on many kinds of Unix computers, including Linux, SGI, Sun, and HP. It also runs with Cygwin. This manual describes Geomview version 1.9.

Geomview is free software, available under the terms of the GNU Lesser Public License; see Copying for details.

Geomview and this manual are available for download from http://www.geomview.org.

Permission is granted to make copies of this manual.

If you have questions or comments about Geomview or this manual, consider joining in the geomview-users mailing list, which is a forum in which users of Geomview communicate to answer each others' questions and to share news about what they are doing with Geomview. The Geomview authors participate in this list and sometimes post answers to questions there. To join the list, visit the list web page at http://lists.sourceforge.net/mailman/listinfo/geomview-users. geomview-1.9.5/doc/geomview.html/Distrib.html0000644000175000017500000000536112310162311016104 00000000000000 Distrib - Geomview Manual

Next: , Previous: Intro, Up: Top


Distribution

Geomview is free software; this means that everyone is free to use it and free to redistribute it on certain conditions. Geomview is not in the public domain; it is copyrighted and there are restrictions on its distribution, but these restrictions are designed to permit everything that a good cooperating citizen would want to do. What is not allowed is to try to prevent others from further sharing any version of Geomview that they might get from you. The precise conditions are found in the GNU Lesser Public License that comes with Geomview and also appears following this section.

One way to get a copy of Geomview is from someone else who has it. You need not ask for our permission to do so, or tell any one else; just copy it. If you have access to the Internet, you can get the latest distribution version of Geomview at http://www.geomview.org.

You may also receive Geomview when you buy a computer. Computer manufacturers are free to distribute copies on the same terms that apply to everyone else. These terms require them to give you the full sources, including whatever changes they may have made, and to permit you to redistribute the Geomview received from them under the usual terms of the General Public License. In other words, the program must be free for you when you get it, not just free for the manufacturer. geomview-1.9.5/doc/geomview.html/Copying.html0000644000175000017500000007063412310162311016121 00000000000000 Copying - Geomview Manual

Next: , Previous: Distrib, Up: Top


Copying

     NOTE: Geomview is distributed under the GNU LESSER GENERAL PUBLIC
     LICENSE.  For the purposes of this license we think of Geomview as if it
     were a "library", and of Geomview external modules as "programs that
     link with the library".  We do this because we specifically want to
     allow proprietary programs and modules to use Geomview.

GNU LESSER PUBLIC LICENSE

Version 2.1, February 1999
     Copyright © 1991, 1999 Free Software Foundation, Inc.
     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     
     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.
     
     [This is the first released version of the Lesser GPL.  It also counts
      as the successor of the GNU Library Public License, version 2, hence
      the version number 2.1.]

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software–to make sure the software is free for all its users.

This license, the Lesser General Public License, applies to some specially designated software packages–typically libraries–of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.

When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.

To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.

For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.

We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.

To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.

Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.

Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.

When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.

We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.

For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.

In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.

Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.

The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  1. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".

    A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.

    The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)

    "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.

    Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.

  2. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.

    You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

  3. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
    1. The modified work must itself be a software library.
    2. You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
    3. You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
    4. If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.

      (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)

    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

    Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.

    In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

  4. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. ^L Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.

    This option is useful when you wish to copy part of the code of the Library into a program that is not a library.

  5. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.

    If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.

  6. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.

    However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.

    When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.

    If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)

    Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.

  7. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.

    You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:

    1. Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
    2. Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
    3. Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
    4. If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
    5. Verify that the user has already received a copy of these materials or that you have already sent this user a copy.

    For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

    It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.

  8. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
    1. Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
    2. Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
  9. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
  10. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
  11. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
  12. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.

    If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.

    It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

    This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

  13. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
  14. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

    Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.

  15. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

    NO WARRANTY

  16. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
  17. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).

To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.

     one line to give the library's name and a brief idea of what it does.
     Copyright (C) <year>  name of author
     
     This library is free software; you can redistribute it and/or
     modify it under the terms of the GNU Lesser General Public
     License as published by the Free Software Foundation; either
     version 2 of the License, or (at your option) any later version.
     
     This library is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     Lesser General Public License for more details.
     
     You should have received a copy of the GNU Lesser General Public
     License along with this library; if not, write to the Free Software
     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA

Also add information on how to contact you by electronic and paper mail.

You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:

     Yoyodyne, Inc., hereby disclaims all copyright interest in the
     library `Frob' (a library for tweaking knobs) written by James
     Random Hacker.
     
     <signature of Ty Coon>, 1 April 1990
     Ty Coon, President of Vice

That's all there is to it! geomview-1.9.5/doc/geomview.html/History.html0000644000175000017500000001012712310162311016141 00000000000000 History - Geomview Manual

Next: , Previous: Copying, Up: Top


History of Geomview's Development

Geomview was originally written at the Geometry Center at the University of Minnesota in Minneapolis. The Geometry Center was a research and education center funded by the National Science Foundation, with a mission to promote research and communication of mathematics. Much of the work there involved the use of computers to help visualize mathematical concepts.

The project that eventually led to Geomview began in the summer of 1988 with the work of Pat Hanrahan on a viewing program called MinneView. Shortly thereafter Charlie Gunn begin developing OOGL (Object Oriented Graphics Language) in conjunction with MinneView. Many people contributed to OOGL and MinneView, including Stuart Levy, Mark Meuer, Tamara Munzner, Steve Anderson, Mario Lopez, Todd Kaplan.

In 1991 the staff of the Geometry Center began work on a new improved version of OOGL, and a new and improved viewing program, which they called Geomview. At that time essentially the only game in town for interactive 3D graphics was Silicon Graphics (SGI), so Geomview was developed initially on SGI workstations, using IRIS GL. The first version was finished in January of 1992. It immediately became very popular among visitors to the Geometry Center, and through the Center's ftp archive (this was before the web) people at other institutions began using it too.

In addition to SGI workstations the Geometry Center had quite a few NeXT stations, so soon after Geomview was running on SGIs the staff developed a version for NeXTStep as well. By this time there were several thousand people using it around the world.

A few years later the staff ported Geomview to X windows and OpenGL, and eventually, with the demise of NeXT, the NeXT version fell by the wayside.

In its mission to foster communication among researchers and educators, the Geometry Center developed a web site, www.geom.umn.edu, in late 1993. It was one of the first 300 web sites in existence. A part of the web site was of course devoted to Geomview, and helped to spread the word about its existence.

The Geometry Center closed its "brick and mortar" facilities in August of 1998 (NSF cut its funding), but the web site continued to exist, and Geomview continued to be very popular around the world. In December of 1999 some of the former Geometry Center staff set up http://www.geomview.org as a permanent home on the web for Geomview.

Geomview's original authors, as well as a number of other volunteers around the world, are still actively involved in using and developing Geomview.

geomview-1.9.5/doc/geomview.html/Authors.html0000644000175000017500000000361112310162311016125 00000000000000 Authors - Geomview Manual

Previous: History, Up: History


Authors

Tamara Munzner, Stuart Levy, and Mark Phillips are the original authors of Geomview. Celeste Fowler, Charlie Gunn, and Nathaniel Thurston also made significant contributions. Daniel Krech and Scott Wisdom did the NeXTStep and RenderMan port, and Daeron Meyer and Tim Rowley did the port to X windows. Many other Geometry Center staff members, as well as several people elsewhere, also contributed.

Mark Phillips wrote this manual, with substantial help from Stuart Levy and Tamara Munzner. Countless Geomview users have also been of great help by reading it and pointing out mistakes. geomview-1.9.5/doc/geomview.html/Platforms.html0000644000175000017500000000605512310162311016454 00000000000000 Platforms - Geomview Manual

Next: , Previous: History, Up: Top


Supported Platforms

Geomview 1.9 should – in principle – compile and run on any fairly recent Unix-like operating system. Specifically, it runs on Linux and on Cygwin (Cygwin emulates a SystemV Unix-like environment under Microsoft Windows). Unluckily Geomview compiles with MacOS X (Darwin), but seemingly communicating with Geomview by means of pipes and sockets cause segmentation faults. Feel free to fix that! See Contributing, for details. geomview-1.9.5/doc/geomview.html/Pronunciation.html0000644000175000017500000000371212310162311017332 00000000000000 Pronunciation - Geomview Manual

Next: , Previous: Platforms, Up: Top


How to Pronounce “Geomview“

The word 'Geomview' is a combination of the first syllable of the word 'geometry', and the word 'view'. The authors pronounce it with the accent on the first syllable

       GE-om-view

Some people put the accent on the second syllable, where it falls in the word 'geometry', but the original authors, who invented the name, prefer the accent-on-first-syllable pronunciation. geomview-1.9.5/doc/geomview.html/Overview.html0000644000175000017500000001004612310162311016306 00000000000000 Overview - Geomview Manual

Next: , Previous: Pronunciation, Up: Top


1 Overview

Geomview's main purpose is to display objects whose geometry is given, allowing interactive control over details such as point of view, speed of movement, appearance of surfaces and lines, and so on. Geomview can handle any number of objects and allows both separate and collective control over them.

The simplest way to use Geomview is as a stand-alone viewer to see and manipulate objects. It can display objects described in a variety of file formats. It comes with a wide variety of example objects, and you can create your own objects.

You can also use Geomview to handle the display of data coming from another program that is running simultaneously. As the other program changes the data, the Geomview image reflects the changes. Programs that generate objects and use Geomview to display them are called external modules. External modules can control almost all aspects of Geomview. The idea here is that many aspects of the display and interaction parts of geometry software are independent of the geometric content and can be collected together in a single piece of software that can be used in a wide variety of situations. The author of the external module can then concentrate on implementing the desired algorithms and leave the display aspects to Geomview. Geomview comes with a collection of sample external modules, and this manual describes how to write your own.

Geomview is the product of an effort at the Geometry Center to provide interactive geometry software that is particularly appropriate for mathematics research and education. In particular, Geomview can display things in hyperbolic and spherical space as well as Euclidean space.

Geomview allows multiple independently controllable objects and cameras. It provides interactive control for motion, appearances (including lighting, shading, and materials), picking on an object, edge or vertex level, snapshots in SGI image file or Renderman RIB format, and adding or deleting objects is provided through direct mouse manipulation, control panels, and keyboard shortcuts.

Geomview supports the following simple data types: polyhedra with shared vertices (.off), quadrilaterals, rectangular meshes, vectors, and Bezier surface patches of arbitrary degree including rational patches. Object hierarchies can be constructed with lists of objects and instances of object(s) transformed by one or many 4x4 matrices. Arbitrary portions of changing hierarchies may be transmitted by creating named references.

Geomview can display 3-D graphics output from Mathematica and Maple. geomview-1.9.5/doc/geomview.html/Tutorial.html0000644000175000017500000003031212310162311016301 00000000000000 Tutorial - Geomview Manual

Next: , Previous: Overview, Up: Top


2 Tutorial

This chapter leads you through some of the basics of using Geomview. Work through this chapter in front of a computer where you can try out the examples given here to get a feel for what you can do with Geomview.

To start Geomview, login to the computer and get a shell window. A shell window is a window in which you can type Unix commands; the prompt in the window usually ends with a '%'. In the shell window (the mouse cursor must be in the window) type the following (<Enter> here means hit the "Enter" key):

     geomview tetra dodec <Enter>

This command starts up Geomview and loads two example objects, a tetrahedron and a dodecahedron. After a few seconds three windows should appear; see Figure.

figs/initial.png

Figure 2.1: Initial Geomview display.

The panel on the left is Geomview's main control panel; it's called the Main panel. The skinny panel in the middle is the Tools panel and is for selecting different kinds of motions. The window on the right is the camera window and in it you see a large tetrahedron and a dodecahedron which is partially obscured by the tetrahedron.

Geomview has lots of panels but by default it displays only these three. We'll describe some aspects of these and a couple of the others in this tutorial. You can read more about these and other panels in the later chapters of this manual.

Put the mouse cursor in the camera window and press down and hold the left mouse button. Now, while holding down the button, slowly move the mouse around. You should see the picture rotate in the direction you move the mouse. If you lift up on the mouse button while moving the mouse, the picture continues rotating. To stop it, hold the mouse very still and click down and up on the left mouse button.

Geomview uses the glass sphere model for mouse-based motion. This means you are supposed to think of the object as being inside an invisible sphere and the mouse cursor is a gripper outside the sphere. When you hold down the left mouse button, the gripper grabs the sphere; when you let go of the button, the gripper releases the sphere. Moving the mouse while holding the button down causes the sphere (and hence the object) to move in the same direction as the mouse.

In addition to the two solids you should also see two wire-frame boxes in the camera window. These are the "bounding boxes" of the two objects. By default Geomview puts a bounding box around each object that it displays so that you have an idea of how large it is.

Notice that as you move the mouse around the tetrahedron and dodecahedron move as a unit. That is because by default what you are actually moving is the "World". To move an individual object instead of the whole world, move the mouse cursor to the Targets browser in the Main panel. Click (any button) on the word tetra. This makes the tetrahedron be the "target object". Now move the cursor back to the camera window and you can rotate just the tetrahedron.

The motion that you have been applying up to now has been rotation, because that is the motion mode that is selected in the Tools panel. To translate instead, click on the Translate button. Now when you move the mouse in the camera window while holding down the left button, the tetrahedron (which should still be the target object from before) will translate in the direction you move the mouse. Notice that you can translate it beyond the edge of the window as long as you keep holding the left mouse button down. If you lift up on the mouse button while moving the mouse, the tetrahedron will keep going. It moves rather rapidly so it is very easy to lose track of where it is.

If you accidentally lose the tetrahedron by translating it too far out of the view of the window, you can get it back by clicking on the Center button in the Tools panel. This causes it to come back to its initial position.

Click on the Center button to bring the tetrahedron home, and then translate it off to one side so that you can completely see the dodecahedron.

Your world now has two objects in it that are beside each other. You should see the dodecahedron in the middle of the window and maybe part of the tetrahedron off to one side. Go back to the Targets browser in the Main panel and click on "World" to select the whole world again. Now click on the Look At button in the Tools panel. You should see the dodecahedron and the tetrahedron in the middle of the window next to each other (see Figure). The Look At button positions the camera in such a way that the target object is centered in the window.

figs/fig2.png

Figure 2.2: Looking at the world.

Now put the cursor over the middle of the dodecahedron and double-click the right mouse button. This means click it down-and-up two times in rapid succession. Notice that the dodecahedron becomes the target object; you can see this in the Targets browser in the Main panel. Double-clicking the right mouse button on an object is another way to make it the target object.
figs/ap.png

Figure 2.3: The Appearance Panel.

Go to the Inspect menu at the top of the Main panel and select Appearance. This brings up the Appearance panel. When it appears, if it partially obscures another Geomview window you can move it off to one side by dragging its frame with the middle mouse button down.

The Appearance panel lets you control various things about the way Geomview draws objects. Note the buttons labeled [af] Faces and [ae] Edges. Click on the [ae] Edges one, and notice that Geomview is now drawing the edges of the dodecahedron. Click on it again and the edges go away. Click several times and watch the edges come and go. When you've had enough of this, leave the edges on and click the [af] Faces button. This toggles the faces on and off. Click the button again to turn them back on.

Now click on the [Cf] Faces button under the word COLOR. A color chooser panel should appear (see Figure).

figs/color.png

Figure 2.4: Color Chooser Panel.

Note the three sliders, H, S, and V, controlling the color's hue, saturation, and value (lightness). Clicking the HSV button gives a different set of sliders, one each for red, green, and blue. Numerical values for both RGB and HSV color systems can be seen or edited at the bottom of the panel. The dodecahedron's previous colors were specified in the file dodec that you loaded when we started Geomview. The color that you specify with the color panel overrides the old colors. You can adjust the intensity of the color with the Intensity slider. When you find a color that you like, click the Done button.

Now put the cursor somewhere over the gray background and double-click the right mouse button; this picks "World" as the target object. Click the Look At button to look at the world again.

Notice that in the Appearance panel the settings of the buttons have changed from the way you left them with the dodecahedron. That's because the Appearance panel always displays the settings for the target object, which is now the world, which still has its default settings.

Click on the [ab] BBox button under the word Draw. The bounding boxes go away. Now put the cursor back in the camera window. At the keyboard, type the keys a b. Notice that the bounding boxes come back. a b is the keyboard shortcut for the bounding box toggle button; the string "[ab]" appears on the button to indicate this. Most of Geomview's buttons have keyboard shortcuts that you can use instead if you want. This is useful once you are familiar with Geomview and don't want to have to move around among lots of panels.

Now select the tetrahedron, either by double-clicking the right mouse button on it, or by selecting "tetra" in the Targets browser. Then click on the Delete button in the Main panel. The tetrahedron should disappear. This is how you get rid of an object.

You can also load objects from within Geomview. Click on the File menu in the Main panel and choose Open. The Files panel will appear. Below the middle of this panel is a browser with three lines in it; the second line is a directory with lots of Geomview example files in it. Click on that second line; see Figure. Scroll down in the list of files until you see tref.off. Click on that line, and then click on the OK button. A large trefoil-shaped tube will appear in your window. Click the Hide button in the Files panel to dismiss the panel.

figs/secondlinelist.png

Figure 2.5: The Files Panel.

Now click on the Reset button in the Tools panel. This causes everything to return to its home position. You should see a dodecahedron and a trefoil knot (see Figure).

Play around with the trefoil knot and the dodecahedron. Experiment with some of the other buttons in the Tools panel. Try coloring the trefoil knot with the Appearance panel.

For a tutorial on how to create your own objects to load into Geomview, see file doc/oogltour distributed with Geomview. The things in that file will be incorporated into a future version of this manual.

figs/trefdodecinter.png

Figure 2.6: Trefoil and Dodecahedron.

geomview-1.9.5/doc/geomview.html/figinitial.html0000644000175000017500000000010612310162311016613 00000000000000 geomview-1.9.5/doc/geomview.html/figlookatworld.html0000644000175000017500000000011212310162311017520 00000000000000 geomview-1.9.5/doc/geomview.html/figappearance.html0000644000175000017500000000011112310162311017255 00000000000000 geomview-1.9.5/doc/geomview.html/figcolorchooser.html0000644000175000017500000000011312310162311017661 00000000000000 geomview-1.9.5/doc/geomview.html/figfilespanel.html0000644000175000017500000000011112310162311017300 00000000000000 geomview-1.9.5/doc/geomview.html/figtrefdodec.html0000644000175000017500000000011012310162311017114 00000000000000 geomview-1.9.5/doc/geomview.html/Interaction.html0000644000175000017500000000543012310162311016760 00000000000000 Interaction - Geomview Manual

Next: , Previous: Tutorial, Up: Top


3 Interaction

This chapter describes how you interact with Geomview through the mouse and keyboard.

geomview-1.9.5/doc/geomview.html/Starting-Geomview.html0000644000175000017500000000423112310162311020052 00000000000000 Starting Geomview - Geomview Manual

Next: , Previous: Interaction, Up: Interaction


3.1 Starting Geomview

The usual way to start Geomview is to type geomview <Enter> in a shell window (<Enter> means hit the "Enter" key). It may take Geomview a few seconds to start up; one or more windows will appear and you can begin interacting with Geomview immediately.

It is also possible to specify actions for Geomview to perform at startup time by giving arguments in the shell command line. See Command Line Options. geomview-1.9.5/doc/geomview.html/Command-Line-Options.html0000644000175000017500000002056412310162311020402 00000000000000 Command Line Options - Geomview Manual

3.2 Command Line Options

Here are the command line options that Geomview allows:

-b r g b
Set the window background color to the given r g b values.
-c file
Interpret the GCL commands in file, which may be the special symbol - for standard input. For a description of GCL, See GCL.
-c command
Commands may also be supplied literally, as in
          -c "(ui-panel main off)"

Since command includes parentheses, which have special meaning to the shell, command must be quoted. Multiple -c options are allowed.

-wins nwins
Causes Geomview to initially display nwins camera windows.
-wpos width,height[@xmin,ymin]
Specifies the initial location and size of the first camera window. The values for width, height, xmin, and ymin are in screen (pixel) coordinates.
-M[cg][ps[un|in|in6]] PIPENAME|TCPPORT
The ‘-M’ option accepts modifiers: a ‘g’ suffix expects geometry data (the default), while a ‘c’ suffix expects GCL commands. A ‘p’ implies the connection should use a named pipe (the default on everything except on the NeXT), while ‘s’ implies using a UNIX-domain socket (the default on the NeXT). Since version 1.9 of Geomview Internet domain sockets are also supported; use ‘sin’ to make Geomview listen on the IPv4 port given by TCPPORT, or use ‘sin6’ to make Geomview listen on an IPv6 port (also as specified by TCPPORT). ‘sun’ is a synonym for ‘s’, i.e. use the Unix domain socket with the name PIPENAME. If PIPENAME starts with a slash ('/'), then it is assumed to be an absolute pathname, otherwise the named pipe or socket is created below ${TMPDIR}/geomview/.

Listening to command streams on TCP ports can be a security risk, as Geomview itself does not take any security precautions, it simply executes all commands fed to it through the network socket. This also implies that disk-io can be initiated remotely.

Examples:

-M objectname
Display (possibly dynamically changing) geometry sent from the programs geomstuff or togeomview. This actually listens to the named pipe /tmp/geomview/objectname; you can achieve the same effect with the shell commands:
               mkdir /tmp/geomview
               mknod /tmp/geomview/objectname p

(assuming the directory and named pipe don't already exist), then executing the GCL command:

               (geometry objectname  < /tmp/geomview/objectname)

(see (geometry ...))

-Mc pipename
Like ‘-M’ above, but expects GCL commands, rather than OOGL geometry data, on the connection.
-Mcs fred
Read commands from the UNIX-domain socket named. /tmp/geomview/fred
-Mcsin 40000
Read commands from the IPv4 port ‘40000’. Geomview itself does not take any security precautions, so this can be a security risk.

-noopengl
Disable the use of OpenGL for (possibly) hardware accelerated rendering, even if the Geomview binary has support for OpenGL compiled in. This also disables the support for transparency and textures in the camera windows. RenderMan snapshots still will have correct transparency and some limited texture support.
-nopanels
Start up displaying no panels, only graphics windows. Panels may be invoked later as usual with the Px keyboard shortcuts or with the ui-panel command. See (ui-panel ...).
-noinit
Read no initialization files. By default, geomview reads the system-wide .geomview file, followed by those in ${HOME}/.geomview and ./.geomview.
-e module
Start an external module; module is the name associated with the module, appearing in the main panel's Applications browser, as defined by the emodule-define command. See (emodule-define ...).
-start module args ...
Like -e but allows you to pass arguments to the external module. "–" signals the end of the argument list; the "–" may be omitted if it would be the last argument on the Geomview command line.
-run shell-command args ...
Like -start but takes the pathname of executable of the external module instead of the module's name. The pathnames of all known module directories are appended to the UNIX search path when invoking shell-command.
geomview-1.9.5/doc/geomview.html/Basic-Interaction.html0000644000175000017500000001761512310162311020007 00000000000000 Basic Interaction - Geomview Manual

Next: , Previous: Command Line Options, Up: Interaction


3.3 Basic Interaction: The Main Panel

Normally when you invoke Geomview, three windows appear: the Main panel, the Tools panel, and one camera window. Geomview has many other windows but most things can be done with these three and so by default the others do not appear. This section of the manual introduces some basic concepts that are used throughout the rest of the manual and describes the Main panel.

figs/main.png

Figure 3.1: The Main Panel

Geomview can display an arbitrary number of objects simultaneously. The Targets browser in the Main panel displays a list of all the objects that Geomview currently knows about. This browser has a line for each object that you have loaded, plus some lines for other objects. One of the other objects is called World and corresponds to the all the currently loaded objects, treated as if they were one object. Most of the operations that you can do to one object, such as applying a motion or changing a color, can also be done to the "World" object.

The Targets browser also has an entry for each camera. By default there is only one camera; it is possible to add more of them via the New Camera entry of the Main panel's File menu. Geomview treats cameras in much the same way as it does geometric objects. For example, you can move cameras around and add them and delete them just as with geometric objects. Cameras do not usually show up in the display as an object that you see. Each camera has a separate camera window which displays the view as seen by that camera. (It is possible for each camera to display a geometric representation of other cameras. See Cameras.)

Because Geomview treats cameras and geometric objects very similarly, the term object in this documentation is used to refer to either one. When we need to distinguish between the two kinds of objects, we use the term geom to denote a geometric object and the word camera to denote a camera.

The object which is selected (highlighted) in the Targets browser is called the target object. This is the object that receives any actions that you do with the mouse or keyboard. You can change the target object by selecting a different line in the Targets browser. Another way to change the target object is to put the mouse cursor directly over a geometry in a camera window and rapidly double-click the right mouse button. This process is called picking; the picked object becomes the new target.

Geomview objects are all known by two names, both of which are shown in the Targets browser. The first name given there, which appears in square brackets ([ ]), is a short name assigned by Geomview when you load the object. It consists of the letter `g' for geometries and `c' for cameras, followed by a number. The second name is a longer more descriptive name; by default this is the name of the file that the object was loaded from. The two names are equivalent as far as Geomview is concerned; at any point where you need to specify a name you can give either one.

To manipulate an object, make sure you that the object you want to move is the target object, and put the mouse cursor in a camera window. Motions are applied by holding down either the left or middle mouse button and moving the mouse. There are several different motion "modes", each for applying a different kind of motion. The MOTION MODE browser in the Main panel indicates the current motion mode. The default is "Rotate". You can change the current motion mode by selecting a new one in the MOTION MODE browser, or by using the Tools panel. For more information about motion modes, See Mouse Motions.

The Modules browser lists Geomview external modules. An external module is a separate program that interacts with Geomview to extend its functionality. For information on external modules, See Modules.

The menu bar at the top of the main panel offers menus for common operations.

To create new windows, load new objects, save objects or other information, or quit from geomview, see the File menu.

To copy or delete objects, see the Edit menu.

You can invoke any panel from the Inspect menu.

The Space menu lets you choose whether geomview operates in Euclidean, Hyperbolic, or Spherical mode. Euclidean mode is selected by default. For details about using Hyperbolic and Spherical spaces, See Non-Euclidean Geometry.

Most actions that you can do through Geomview's panels have equivalent keyboard shortcuts so that you can do the same action by typing a sequence of keys on the keyboard. This is useful for advanced users who are familiar with Geomview's capabilities and want to work quickly without having to have lots of panels cluttering up the screen. Keyboard shortcuts are usually indicated in square brackets ([ ]) near the corresponding item in a panel. For example, the keyboard shortcut for Rotate mode is 'r'; this is indicated by "[r]" appearing before the word "Rotate" in the MOTION MODE browser. To use this keyboard shortcut, just hit the r key while the mouse cursor is in any Geomview window. Do not hit the <Enter> key afterwards.

Some keyboard shortcuts consist of more than one key. In these cases just type the keys one after the other, with no <Enter> afterwards. Keyboard shortcuts are case sensitive.

Many keyboard shortcuts can be preceded by a numeric parameter. For example, typing ae toggles the state of drawing edges, while 1ae always enables edge drawing.

The keyboard field in the upper left corner of the Main panel echos the current state of keyboard shortcuts.

For a list of all keyboard shortcuts, press the ? key. geomview-1.9.5/doc/geomview.html/figmainpanel.html0000644000175000017500000000012112310162311017123 00000000000000 geomview-1.9.5/doc/geomview.html/Loading.html0000644000175000017500000001314112310162311016054 00000000000000 Loading - Geomview Manual

Next: , Previous: Basic Interaction, Up: Interaction


3.4 Loading Objects Into Geomview

There are several ways to load an object into Geomview.

the Files panel
If you click the Load button in Geomview's Main panel, the Files panel will appear.
figs/myfilelist.png

Figure 3.2: The Files Panel.

This panel lets you select a file from a variety of directories. The top of the panel is a standard Motif file browser. Below this is a list of directories on Geomview's standard search path; click on one of these to browse files in that directory.

To select a file, double-click on its name in the browser at upper right, or click on its name and press the <Enter> key, or type the file's name into the text box at the bottom of the browser and press <Enter>.

If the selected file contains OOGL geometric data, it will be added to the geomview Targets browser. If it contains GCL commands instead, the file will be interpreted. See GCL.

When the Files panel first appears, the directory selected in the directory browser is the current directory — the one from which you invoked Geomview. The file browser shows all the files in this directory, including ones that are not Geomview files. If you try to load a file that doesn't contain either an OOGL object or Geomview commands, Geomview will print out an error message.

The directory browser also lists a second and third directory in addition to the current directory. The second one, which ends in data/geom, is the Geomview example data directory. This contains a wide variety of sample objects. It also contains several subdirectories. In particular, the hyperbolic and spherical subdirectories have sample hyperbolic and spherical objects, respectively. Directory entries in the browser look just like file entries; to view a subdirectory, click on it.

The third directory shown in the directory browser, which ends in geom, contains several subdirectories with other Geomview files in them. These are used less frequently than the ones in the data/geom directory.

You can change the list of directories shown the Files panel's directory browser by using the set-load-path command; see (set-load-path ...).

the < keyboard shortcut:
If you type < in any Geomview window, the Load panel will appear. This is a small version of the Files panel; it contains a text field in which you can enter the name of a file to load (or a GCL command surrounded by parentheses). After typing the name of the file to load, type <Enter>; Geomview will load the file as if you had loaded it with the Add button in the Files panel. If, after bringing up the small load panel with <, you decide you want to use the larger Files panel after all, press the File Browser button.
figs/load.png

Figure 3.3: The Load Panel.


geometry loading commands:
The load, geometry, new-geometry, and read GCL commands allow you to load an object into Geomview; See GCL. See (load ...). See (new-geometry ...). See (read ...).
geomview-1.9.5/doc/geomview.html/figmyfilelist.html0000644000175000017500000000011012310162311017336 00000000000000 geomview-1.9.5/doc/geomview.html/figloadpanel.html0000644000175000017500000000010712310162311017122 00000000000000 geomview-1.9.5/doc/geomview.html/Mouse-Motions.html0000644000175000017500000002710312310162311017220 00000000000000 Mouse Motions - Geomview Manual

Next: , Previous: Loading, Up: Interaction


3.5 Using the Mouse to Manipulate Objects

Geomview lets you manipulate objects with the mouse. There are six different mouse motion modes: Rotate, Translate, Cam Fly, Cam Zoom, Geom Scale, and Cam Orbit. The tools panel has a button for each of these modes; to switch modes, click on the corresponding button. You can also select these through the Motion Mode browser on the Main panel.

This section describes basic mouse interaction. For details, see Commands.

figs/tools.png

Figure 3.4: The Tools Panel.

Each of the motion modes uses a common paradigm for how the motion is applied. In particular, each depends on the current target object and the current center object. These are explained in the following paragraphs.

The current target object is shown in the Target field in the Tools panel. This is the same as the selected object in the Targets browser in the Main panel, and you can change it by either selecting a new object in the browser, by typing a new entry in the field, or by picking an object in a camera window by double-clicking the right mouse button with the cursor over the object.

The current center object is shown in the Center field in the Tools panel. Its default value is the special word "target", which means that the center object is whatever the target object is. You can change the center to any object by typing it in the Center field. The origin of the center object is held fixed in Rotate and Orbit modes. Normally the center object is one of the existing geoms listed in the Targets browser, and the actual center of rotations is the origin of that object's coordinate system. It is possible, however, to select an arbitrary point of interest on an object as the center. For details, see Point of Interest.

It is also possible to toggle the button BBox Center to set the center of motion to the center of the current object's bounding box. Once toggled, the active geometry's bounding box center will become the center of motion. If you select another object, then the center of motion will become the center of that object's bounding box. Nothing changes when a camera or the World is selected; you have to type in the word target in the Center field to reset to the default.

You apply a mouse motion by holding down either the left or middle mouse button with the cursor in a camera window and moving the mouse. Most of the modes have inertia, which means that if you let go of the button while moving the mouse, the motion will continue. It may be helpful to imagine the mouse cursor as being a gripper; when you hold a mouse button down, it grips the target object and you can move it. When you let go of the mouse button, the gripper releases the object. Letting go of the mouse button while moving the mouse is like throwing the object — the object continues moving independent of the mouse. Inertia can be turned off; see the Main panel's Motion menu, described below.

Generally, the left mouse button controls motion in the screen plane, while the middle mouse controls motion along or around the forward direction.

Pressing the shift key while dragging with left or middle mouse buttons in most motion modes gives slow-speed motions, useful for fine adjustment.

You can pick any point on an object (not just its origin) as the center of motion by holding down the shift key while clicking the right mouse button; this chooses a point of interest.

Rotate
In Rotate mode, hold the left mouse button down to rotate the target object about the center object. Rotation proceeds in the direction that you move the mouse. Specifically, the axis of rotation passes through the origin of the center object, is parallel to the camera view plane, and is perpendicular to the direction of motion of the mouse. When the center is "target", this means that the target object rotates about its own origin.

The middle mouse button in Rotate mode rotates the target object about an axis perpendicular to the view plane.

Translate
In Translate mode, hold the left mouse button down to translate the target object in the direction of mouse motion. The middle mouse button translates the target along an axis perpendicular to the view plane.

In Euclidean space, the center object is essentially irrelevant for translations. In hyperbolic and spherical spaces, where translations have a unique axis, this axis is chosen to go through the origin of the center object.

Cam Fly
Cam Fly is a crude flight simulator that lets you fly around the scene. It works by moving the camera. Move the mouse while holding the left mouse button down to point the camera in a different direction. To move forward or backward, hold down the middle button and move the mouse vertically. Both of these motions have inertia; typically the easiest way to fly around a scene is to give the camera a slight forward push by letting go of the middle button while moving the mouse upward, and then using the left button to steer.

Cam Fly affects the camera window that the mouse is in; it ignores the target object and the center object.

Cam Orbit
Cam Orbit mode lets you rotate the current camera around the current center. The left mouse button does this rotation. The middle mouse button in Cam Orbit mode acts as in Cam Fly mode: it moves the camera forward or backward.

In general Cam Orbit does not move the target object, although if the current camera is selected as the target and the center is also the target, it will pivot that camera about itself just as in Cam Fly mode.

Cam Zoom
Cam Zoom mode lets you change the current camera's field of view with the mouse; hold the left mouse button down and move the mouse to change it. The numeric value of the field of view is shown in the FOV field in the Camera panel.
Geom Scale
Geom Scale mode lets you enlarge or shrink a geom. It operates on the target object if that object is a geom. If the target is a camera, Geom Scale operates on the geom that was most recently the target object. Moving the mouse while holding down the left mouse button scales the object either up or down, depending on the direction of mouse motion. The center of the applied scaling transformation is the center object.

Scaling is meaningful only in Euclidean space; attempts to scale are ignored in other spaces.

Geom Scale mode does not have inertia.

The Stop, Look At, Center, and Reset buttons on the Tools panel perform actions related to motions but do not change the current motion mode.

Stop
The Stop button causes all motions to stop. It affects all moving objects, not just the target object. Its keyboard shortcut is H.

The keyboard command h, which does not correspond to a panel button, stops the current motion for the target object only.

Look At
The Look At button causes the current camera to be moved to a position such that it is looking at the target object, and such that the target object more or less fills the window.

The Look At command is unreliable in non-Euclidean spaces.

Center
The Center button undoes the target object's transformation, moving it back to its home position, which is where it was when you originally loaded it into Geomview.
Reset
The Reset button stops all motion and causes all objects to move back to their home positions.

The Tools panel also sports a Main button, to invoke the main panel in case it was dismissed or buried, and a Done button to close the Tools panel.

The Main panel's Motion menu has special controls affecting how mouse motions are interpreted; the toggles are also accessible through a GCL command. See (ui-motion ...).

[ui] Inertia
Normally, moving objects have inertia: if the mouse is still moving when the button is released, the selected object continues to move. When Inertia is off, objects cease to move as soon as you release the mouse.
[uc] Constrain Motion
It's sometimes handy to move an object in a direction aligned with a coordinate axis: exactly horizontally or vertically. Selecting Constrain Motion changes the interpretation of mouse motions to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical motion. Note that the motion is still along the X or Y axes of the camera in which you move the mouse, not necessarily the object's own coordinate system.
[uo] Own Coordinates
It's sometimes handy to move objects with respect to the coordinate system where they were defined, rather than with respect to some camera's view. While Own Coordinates is selected, all motions are interpreted that way: dragging the mouse rightward in translate mode moves the object in its own +X direction, and so on. May be especially useful in conjunction with the Constrain Motion button.
geomview-1.9.5/doc/geomview.html/figtools.html0000644000175000017500000000011112310162311016316 00000000000000 geomview-1.9.5/doc/geomview.html/Point-of-Interest.html0000644000175000017500000001121312310162311017763 00000000000000 Point of Interest - Geomview Manual

Previous: Mouse Motions, Up: Mouse Motions


3.5.1 Selecting a Point of Interest

It is sometimes useful to specify a particular point on some object in a geomview window as the center point for mouse motions. You can do this by shift-clicking the right mouse button (i.e. click it once while holding down the shift key on the keyboard) with the cursor over the desired point. This point then becomes the point of interest. The point of interest must be on an existing object.

Selecting a point of interest simplifies examining a small portion of a larger object. Shift-right-click on an interesting point, and select Orbit mode. Use the middle mouse button to approach, and the left mouse to orbit the point, examining the region from different directions.

When you have selected a point of interest, the current center object changes to an object named "CENTER", which is an invisible object located at the point of interest. In addition, mouse motions for the window in which you made the selection are adjusted so that the point of interest follows the mouse.

You can change the point of interest at any time by selecting a new one by shift-clicking the right mouse button again. You can cancel the point of interest altogether by shift-clicking the right mouse button with the cursor on the background (i.e. not on any object). This changes the center object back to its default value, "target".

The object named "CENTER", which serves as the center object for the point of interest, is a special kind of geom called an "alien". It does not appear in the Targets browser. By default it has no geometry associated with it and hence is invisible. You can, however, explicitly give it some geometry using a GCL command, causing it to appear. Use the geometry command for this: (geometry CENTER geometry), where geometry is any valid geometry. For example, (geometry CENTER { < xyz.vect }) causes the file xyz.vect, which is one of the standard example files distributed with geomview, to be used at the geometry for CENTER. See (geometry ...).

What happens internally when you select a point of interest is that the center is set to the object called CENTER, and that object is positioned at the point of interest. In addition, in order for mouse motions to track the point of interest, the current camera's focal length is set to be the distance from the camera to the point of interest. You can accomplish this via GCL with the following commands:

     (if (real-id CENTER) nil (new-alien CENTER {}))
     (ui-center CENTER)
     (transform-set CENTER universe universe translate x y z)
     (merge camera cam-id { focus d })

where (x,y,z) are the (universe) coordinates of the point of interest, and d is the distance from that point to the current camera, cam-id. The first command above creates the "alien" CENTER if it does not yet exist. geomview-1.9.5/doc/geomview.html/Appearance.html0000644000175000017500000000654512310162311016550 00000000000000 Appearance - Geomview Manual

Next: , Previous: Mouse Motions, Up: Interaction


3.6 Changing the Way Things Look

Geomview uses a hierarchy of appearances to control the way things look. An appearance is a specification of information about how something should be drawn. This can include many things such things as color, lighting, material properties, and more. Appearances work in a hierarchal manner: if a certain appearance property, for example face color, is not specified in a particular object's appearance, that object is drawn using that property from the parent appearance. If both the parent and the child appearance specify a property, the child's setting takes precedence unless the parent appearance is set to override.

Every geom in Geomview has an appearance associated with it. There is also an appearance associated with the "World" geom, which serves as the parent of each individual geom's appearance. Finally, there is a global "base" appearance, which is the parent of the World appearance.

The base appearance specifies reasonable values for all appearance information, and by default none of the other appearances specify anything, which means they inherit their values from the base appearance. This means that by default all objects are drawn using the base appearance.

If you change a certain appearance property for a geom, that property is used in drawing that geom. The parent appearance is used for any properties that you do not explicitly set.

Geomview has three panels which let you modify appearances.

geomview-1.9.5/doc/geomview.html/Appearance-Panel.html0000644000175000017500000002312412310162311017575 00000000000000 Appearance Panel - Geomview Manual

Next: , Previous: Appearance, Up: Appearance


3.6.1 The Appearance Panel

The Appearance panel lets you change most common appearance properties of the target object.

figs/ap.png

Figure 3.5: The Appearance Panel.

If the target is an individual geom, then changes you make in the appearance panel apply to that geometry's appearance. If the target is the World, then appearance panel changes apply to the World appearance and to all individual geom appearances. (Users have found that this is more desirable than having the changes only apply to the World appearance.) If the target is a camera, then appearance panel changes apply to the geom that was most recently the target.

The five buttons near the upper left corner under the word Show control what parts of the target geom are drawn.

Faces
This button specifies whether faces are drawn.
Edges
This button specifies whether edges are drawn.
BBox
This button specifies whether the bounding box is drawn.
Vects
This button specifies whether VECT objects are drawn. VECTs are a type of OOGL object that represent points and line segments in 3-space; they are distinct from edges of other kinds of objects, and it is sometimes desirable to have separate control over whether they are drawn.
Normals
This button specifies whether surface normal vectors are drawn.

The four buttons under Color labeled Faces, Edges, Normals, and BBox let you specify the color of the corresponding aspect of the target geom. Clicking on one of them brings up a color chooser panel.

figs/color.png

Figure 3.6: Color Chooser Panel.

This panel offers two sets of sliders: H(ue) S(aturation) V(alue), or R(ed) G(reen) B(lue), each in the range 0 through 1. The square shows the current color, which is given numerically in both HSV and RGB systems in the corresponding text boxes.

In the HSV color system, hue H runs from red at 0, green at .333, blue at .667, and back to red at 1.0. Saturation gives the fraction of white mixed into the color, from 0 for pure gray to 1 for pure color. Value gives the brightness, from 0 for black to 1 for full brightness.

Pressing the RGB or HSV button at top center switches the sliders to the other color system. You can adjust colors either via the sliders, or by typing in either the RGB or HSV text boxes.

Click OK to accept the color that you have chosen, or Cancel to retain the previous color setting.

The SHADING browser lets you specify the shading model that Geomview uses to paint the target geom.

Constant
Every face of the object is drawn with a constant color which does not depend on the location of the face, the camera, or the light sources. If the object does not contain per-face or per-vertex colors, the diffuse color of the object's appearance is used. If the object contains per-face colors, they are used. If the object contains per-vertex colors, each face is painted using the color of its first vertex.
Flat
Each face of the object is drawn with a color that depends on the relative location of the face, the camera, and the light sources. The color is constant across the face but may change as the face, camera, or lights move.
Smooth
Each face of the object is drawn with smoothly interpolated colors based on the normal vectors at each vertex. If the object does not contain per-vertex normals, this has the same effect as flat shading. If the object has reasonable per-vertex normals, the effect is to smooth over the edges between the faces.
CSmooth
Each face of the object is drawn with exactly the specified color(s), independent of lighting, orientation, and material properties. If the object is defined with per-vertex colors, the colors are interpolated smoothly across the face; otherwise the effect is the same as in Constant shading style.
VCflat
A combination of CSmooth and Flat shading. So the shading is constant on each face, depending on the relative orientation of the light sources, the camera and the surface normal of the face.

The Facing Normals button on the Appearance panel indicates whether or not Geomview should arrange that normal vectors always face the viewer. If a normal vector points away from the viewer the color of the corresponding face or vertex usually is darker than is desired. Geomview can avoid this by using the opposite normal in shading calculations. This is the default. Using Facing Normals can give strange flickering dark or light shading effects, though, near the horizon of a fairly smooth facetted object. Press this button to use the normals given with the object.

The three text fields in the lower left corner of the Appearance panel are:

Line Width
The width, in pixels, for lines drawn by Geomview.
Normal Length
This is actually a scale factor; when normal vectors are drawn, Geomview draws them to have a length that is their natural length times this number.
Patch Dicing
Geomview draws Bezier patches by first converting them to meshes. This parameter specifies the resolution of the mesh: if Patch Dicing is n, then an n by n mesh is used to draw each Bezier patch. if Patch Dicing is 1, the resolution reverts to a built-in default value.

The Revert button on the Appearance panel undoes all settings in the target appearance. This causes the target geom to inherit all its appearance properties from its parent.

The Appearance panel's Override button determines whether appearance controls should override settings in the objects themselves – for example, setting the face color will affect all faces of objects with multi-colored facets. Otherwise, appearance controls only provide settings which the objects themselves do not specify. By default, Override is enabled. This button applies to all objects, and to all appearance-related panels.

Normalization is a kind of scaling; Geomview can scale an object so that it fits within a certain region. The main point of normalization is to allow you to easily view all of an object without having to worry about how big it is. We are gradually replacing Geomview's normalization feature with more robust camera positioning features. In general, the best way to make sure you are seeing all of an object is to use the Look At button on the Tools panel. Normalization may be completely replaced by this and other features in a future version of Geomview.

Normalization is a property that applies to each geom separately. The NORMALIZE GEOMETRY browser affects the normalization property of target geom. If the target geom is "World", it affects all geoms.

None
Do no normalization.
Individual
Normalize this geom to fit within a unit sphere.
Sequence
This resembles "Individual", except when an object is changing. Then, "Individual" tightly fits the bounding box around the object whenever it changes and normalizes accordingly, while "Sequence" normalizes the union of all variants of the object and normalizes accordingly.
Keep
This leaves the current normalization transform unchanged when the object changes. It may be useful to apply "Individual" or "Sequence" normalization to the first version of a changing object to bring it in view, then switch to "Keep".
geomview-1.9.5/doc/geomview.html/figap.html0000644000175000017500000000011112310162311015556 00000000000000 geomview-1.9.5/doc/geomview.html/figcolorchooserpanel.html0000644000175000017500000000013012310162311020700 00000000000000 geomview-1.9.5/doc/geomview.html/Materials-Panel.html0000644000175000017500000001023512310162311017456 00000000000000 Materials Panel - Geomview Manual

Next: , Previous: Appearance Panel, Up: Appearance


3.6.2 The Materials Panel

The Materials panel controls material properties of surfaces. It works with the target object in the same way that the Appearance panel does.

figs/mat.png

Figure 3.7: The Materials Panel.

Translucent
This button determines whether translucency is enabled. Geomview supports three different flavours of translucency:
Alpha-blending with BSP-tree depth-sorting
This is the most accurate flavour for online viewing, but consumes vast amounts of computation time and memory. In this mode single translucent objects are displayed correctly with respect to themselves; however multiple translucent objects may appear in the wrong order on the screen. The notion object means here: top-level geometries as displayed in the geometry target browser.
Screen Door Translucency
If the machine support OpenGL then there is support for kind-of translucency by masking out (completely) transparent pixels by means of a stipple mask. This is currently very experimental, and the result is somewhat ugly, but fast.
Alphe-blending without depth-sorting
This is the old naive way of doing quick and dirty translucency. It is fast, but the results are completely incorrect.

When transparency is enabled, a RenderMan snapshot will contain the alpha information, a RenderMan compliant renderer can then generate high-quality pictures, including correct translucency.

Alpha
This slider determines the opacity/transparency when transparency is enabled. 0 means totally transparent, 1 means totally opaque.
Diffuse Reflectance
This slider controls the diffuse reflectance of a surface. This has to do with how much the surface scatters light that it reflects.
Shininess
This slider controls how shiny a surface is. This determines the size of specular highlights on the surface. Lower values give the surface a duller appearance.
Ambient Reflectance
This slider controls how much of the ambient light a surface reflects.
Specular Reflectance
This slider controls the specular reflectance of a surface. This has to do with how directly the surface reflects light rays. Higher values give brighter specular highlights.
Done
This button dismisses the Materials panel.
geomview-1.9.5/doc/geomview.html/figmatpanel.html0000644000175000017500000000011612310162311016764 00000000000000 geomview-1.9.5/doc/geomview.html/Lighting-Panel.html0000644000175000017500000001031312310162311017277 00000000000000 Lighting Panel - Geomview Manual

Previous: Materials Panel, Up: Appearance


3.6.3 The Lighting Panel

The Lights panel controls the number, position, and color of the light sources used in shading.

figs/light.png

The Lighting Panel.

The Lighting panel is different from the Appearance and Material panels in that it always works with the base appearance. This is because it usually makes sense to use the same set of lights for drawing all objects in your scene.

LIGHTS
The LIGHTS browser shows the currently selected light. Changes made using the other widgets on this panel apply to this light. There is always at least one light, the ambient light.
Intensity
This slider controls the intensity of the current light.
Color
This button brings up a color chooser which lets you select the color of the current light.
Add
This button adds a light.
Delete
This button deletes the current light.
Show Lights
This button lets you see and change the positions of the light sources in a camera window. Each light is drawn as long cylinder which is supposed to remind you of a light beam. When you click on the Show Lights button Geomview goes into "light edit" mode, during which you can rotate current light by holding down the left mouse button and moving the mouse. Lights placed in this way are infinitely distant, so what you are changing is the angular position. Click on the Show Lights button again to return to the previous motion mode and to quit drawing the light beams.
Done
This button dismisses the Lighting panel.

Geomview's Appearance, Materials, and Lighting panels are constructed to allow you to easily do most of the appearance related things that you might want to do. The appearance hierarchy that Geomview supports internally, however, is very complex and there are certain operations that you cannot do with the panels. The Geomview command language (GCL) provides complete support for appearance operations. In particular, the merge-baseap command can be used to change the base appearance (which, except for lighting, cannot be changed by Geomview's panels). The merge-ap command can be used to change an individual geom's appearance. Appearances can also be specified in OOGL files; for details, see Appearances. See (merge-baseap ...). See (merge-ap ...). geomview-1.9.5/doc/geomview.html/Cameras.html0000644000175000017500000002024412310162311016054 00000000000000 Cameras - Geomview Manual

Next: , Previous: Appearance, Up: Interaction


3.7 Cameras

A camera in Geomview is the object that corresponds to a camera window. By default there is only one camera, but it is possible to have as many as you want. You can control certain aspects of the way the world is drawn in each camera window via the Cameras panel.

figs/cam.png

Figure 3.8: The Cameras Panel.

If the target object is a camera, the Cameras panel affects that camera. If the target object is not a camera, the Cameras panel affects the current camera. The current camera is the camera of the window that the mouse cursor is in, or was in most recently if the cursor is not in a camera window. Thus, if you use the keyboard shortcuts for the actions in the Cameras panel while the cursor is in a camera window, the actions apply to that camera, unless you have explicitly selected another camera.

To create new camera windows, use the v+ keyboard shortcut, or see the File menu on the Main panel.

Single-Buffering
Normally, geomview windows are double-buffered: geomview draws the next picture into a hidden window, then switches buffers to make it visible all at once. On many systems, the memory for the hidden buffer comes from stealing half the bits in each screen pixel, reducing the color resolution. When single-buffering is enabled, the window flickers as each scene is being drawn, but you may get smoother images with reduced grainy dithering artifacts. Single-buffering is possible if Geomview is compiled with GL or OpenGL, but not with plain-X graphics.
Dither
Many displays offer less than the 24 bits per pixel (8 bits each of red, green, and blue) conventionally needed to show smooth gradations of color. When trying to show a color not accurately available on the display, Geomview normally dithers, choosing pixel colors sometimes brighter, sometimes darker than the desired value, so that the average color over an area is a better approximation to the true color than a single pixel could be. Effectively this loses spatial resolution to gain color resolution. This isn't always desirable, though. Turning Dither off gives less grainy, but less accurately colored, images.
Software Shading
This button controls whether Geomview does shading calculations in software. The default is to let the hardware handle them, and in Euclidean space this is almost certainly best because it is faster. In hyperbolic and spherical space, however, the shading calculations that the hardware does are incorrect. Click this button to turn on correct but slower software shading.
Background Color
This button brings up a color chooser which you can use to set the background color of the camera's window.
PROJECTION
This browser lets you pick between perspective and orthogonal projection for this camera.
Near clip
This determines the distance in world coordinates of the near clipping plane from the eye point. It must be a positive number.
Far clip
This determines the distance in world coordinates of the far clipping plane from the eye point. It must be a positive number and in general should be larger than the Near clip value.
FOV
This is the camera's field of view, measured in its shorter direction. In perspective mode, it is an angle in degrees. In orthographic mode, it is the linear size of the field of view. This number can be modified with the mouse in Cam Zoom mode.
Focal Length
The focal length is intended to suggest the distance from the camera to an imaginary plane of interest. Its value is used when switching between orthographic and perspective views (and during stereo viewing), so as to preserve apparent size of objects lying at the focal distance from the camera. Focal length also affects interpretation of mouse-based translational motions. Speed of forward motion (in translate, fly and orbit modes) is proportional to focal length; and objects lying at the focal distance from the camera translate laterally at the same rate as the mouse cursor. Finally, in N-D projection mode, cameras are displaced back by the focal distance from the 3-D projection of the world origin.
Lines Closer
This number has to do with the way lines are drawn. Normally Geomview's z-buffering algorithm can get confused when drawing lines that lie exactly on surfaces (such as the edges of an object); due to machine round-off error, sometimes the lines appear to be in front of the surface and sometimes they appear behind it. The Lines Closer value is a fudge factor — Geomview nudges all the lines that it draws closer to the camera by this amount. The number should be a small integer; try 5 or 10. 0 turns this feature off completely. Choosing too large a value will make lines visible even though they should be hidden.
SPACE MODEL
This determines the model used to draw the world. It is most useful in hyperbolic and spherical spaces. You probably don't need to touch this browser if you stay in Euclidean space. For more information about these models, see Non-Euclidean Geometry.
Virtual
This is the default model and represents the natural view from inside the space.
Projective
The projective model of hyperbolic and spherical space. Geoms move under isometries of the space, and cameras move by Euclidean motions. By default in the projective model, the Euclidean unit sphere is drawn. In hyperbolic space this is the sphere at infinity. In Euclidean space the projective model is the same as the virtual model except that the sphere is drawn by default.
Conformal
The conformal model of hyperbolic and spherical space. Geoms move under isometries of the space, and cameras move by Euclidean motions. In Euclidean space, the conformal model amounts to inverting everything in the unit sphere.

Draw Sphere
This controls whether Geomview draws the unit sphere. By default the unit sphere appears in the projective and conformal models. In hyperbolic space this is the sphere at infinity. In spherical space it is the equatorial sphere.
Done
This button dismisses the Cameras panel.
geomview-1.9.5/doc/geomview.html/figcamerapanel.html0000644000175000017500000000011112310162311017426 00000000000000 geomview-1.9.5/doc/geomview.html/Saving.html0000644000175000017500000001654312310162311015737 00000000000000 Saving - Geomview Manual

Next: , Previous: Cameras, Up: Interaction


3.8 Saving your work

Geomview's Save panel lets you store Geomview objects and other information in files that you can read back into Geomview or other programs.

figs/save.png

Figure 3.9: The Save Panel.

To use the Save panel you select the desired format in the browser next to the word Save, enter the name of the object you want to save in the text field next to the word for, and enter the name of the file you wish to save to in the long text field next to the word in. You can then either hit <Enter> or click on the OK button. When the file has been written, the Save panel disappears. If you want to dismiss the Save panel without writing a file, click the Cancel button.

If you specify - as the file name, Geomview will write the file to standard output, i.e. in the shell window from which you invoked Geomview.

The possible formats are given below. The kind of object that can be written with each format is given in parentheses.

Commands (any object)
This write a file of GCL commands containing all information about the object. Loading this file later will restore the object as well as all other information about it, such as appearance, transformations, etc.
Geometry alone (geom)
This writes an OOGL file containing just the geometry of the object.
Geometry [in world] (geom)
This writes an OOGL file containing just the geometry of the object, transformed under Geomview's current transformation for this object. Use this if you have moved the object from its initial position and want to save the new position relative to the world.
Geometry [in universe] (geom)
This writes an OOGL file containing just the geometry of the geom, transformed under both the object's transformation and the world's transformation.
RMan [->tiff] (camera)
Writes a RenderMan file which when rendered creates a tiff image. Transparency and texturing (the latter only to some extent) will be available.
RMan [->frame] (camera)
Writes a RenderMan file which when rendered causes an image to appear in a window on the screen. Transparency and texturing (the latter only to some extent) will be available.
SGI snapshot (camera)
Write an SGI raster file. A bell rings when the snapshot is complete. Only available on SGI systems.
PPM GLX-offscreen snapshot (camera)
Render the complete scene anew into off-screen memory; GLX provides the means to use a Pixmap as rendering area. The advantage of rendering into off-screen memory over taking screen snapshot is that the camera windows need not be mapped and even raised at the time the snapshot is taken. So with off-screen snapshot one can safely iconify the camera window (but do not close it!), activate the screen-saver and go to bed while some script advances the scenes and takes snapshots.
PPM Screen snapshot (camera)
Take a snapshot of the given window and save it as a PPM image. If you specify a string beginning with a vertical bar (|) as the file name, it's interpreted as a Bourne shell command to which the PPM data should be piped, as in ‘| pnmtotiff > snap.tiff’ or ‘| convert -geometry 50% ppm:- snap.gif’.

PPM screen snapshots are only available with GL and Open GL, not plain X graphics. The window should be entirely on the screen. Geomview will ensure that no other windows cover it while the snapshot is taken. It is probably a better idea to use GLX-off-screen snapshots, as explained above.

PPM software snapshot (camera)
Writes a snapshot of that window's current view, as a PPM image, to the given file. The file name may be a Bourne shell command preceded by a vertical bar (|), as with the PPM screen snapshot. The software snapshot, though, is produced by using a built-in software renderer (related to the X-windows renderer). It doesn't matter whether the window is visible or not, and doesn't depend on GL or OpenGL. It also doesn't support some features, such as texture mapping.
Postscript snapshot (camera)
Writes a Postscript snapshot of the camera's view. It's made by breaking up the scene into lines and polygons, sorting by depth, and generating Postscript lines and polygons for each one. Advantages over pixel-based snapshot images: resolution is very high, so edges look sharp even on high-resolution printers, or comparable-resolution images are typically much more compact. Disadvantages: depth-sorting gives good results on some scenes, but can be wildly wrong as a hidden-surface removal algorithm for other scenes. Also, Postscript doesn't offer smoothly interpolated shading, only flat shading for each facet.
Camera (camera)
Writes an OOGL file of a camera.
Transform [to world] (any object)
Writes an OOGL transform file giving Geomview's transform for the object.
Transform [to universe] (any object)
Writes an OOGL transform file giving a transform which is the composition of Geomview's transform for the object and the transform for the world.
Window (camera)
Writes an OOGL window file for a camera.
Panels
Writes a GCL file containing commands which record the state of all the Geomview panels. Loading this file later will restore the positions of all the panels.
geomview-1.9.5/doc/geomview.html/figsavepanel.html0000644000175000017500000000010612310162311017140 00000000000000 geomview-1.9.5/doc/geomview.html/Commands.html0000644000175000017500000000441112310162311016240 00000000000000 Commands - Geomview Manual

Next: , Previous: Saving, Up: Interaction


3.9 The Commands Panel

The Commands panel lets you type in a GCL command. When you hit <Enter>, Geomview interprets the command and prints any resulting output or error messages on standard output. You can edit the text and hit <Enter> as many times as you like, in general, whenever you hit <Enter> with the cursor in the Commands panel, Geomview tries to interpret whatever text you have typed in the text field as a command.

figs/command.png

Figure 3.10: The Commands Panel.

geomview-1.9.5/doc/geomview.html/figcommandpanel.html0000644000175000017500000000011312310162311017616 00000000000000 geomview-1.9.5/doc/geomview.html/Keyboard-Shortcuts.html0000644000175000017500000002061312310162311020235 00000000000000 Keyboard Shortcuts - Geomview Manual

Previous: Commands, Up: Interaction


3.10 Keyboard Shortcuts

Most actions that you can do through Geomview's panels have equivalent keyboard shortcuts so that you can do the same action by typing a sequence of keys on the keyboard. This is useful for advanced users who are familiar with Geomview's capabilities and want to work quickly without having to have lots of panels cluttering up the screen. Keyboard shortcuts usually are indicated in square brackets ([ ]) near the corresponding item in a panel. For example, the keyboard shortcut for Rotate mode is 'r'; this is indicated by "[r]" appearing before the word "Rotate" in the MOTION MODE browser. To use this keyboard shortcut just hit the r key while the mouse cursor is in any Geomview window. You don't need to press the <Enter> or <SPACE> keys.

Some keyboard shortcuts consist of more than one key. In these cases just type the keys one after the other, with no <Enter> afterwards. Keyboard shortcuts are case sensitive. You can cancel a multi-key keyboard shortcut that you have started by typing any invalid key, for example the space bar.

Keyboard commands apply while the cursor is in any camera window and most control panels.

Many keyboard shortcuts allow numeric arguments which you type as a prefix to the command key(s). For example, the shortcut for Near clip in the camera panel is v n. To set the near clip plane to ‘0.5’, type 0.5vn. Commands that don't take a numeric prefix toggle or reset the current value.

Most commands allow one of the following selection prefixes. If none is provided the command applies to the target object.

g
world geom
g#
#'th geom
g*
All geoms
c
current camera
c#
#'th camera
c*
All cameras

For example, g4af means toggle the face drawing of object g4.

Simply typing a selection prefix, like g4, doesn't yet select an object; that only happens when a command, like ae, follows the prefix. To select an object as the target without doing anything else to it, use the p command. So g3p selects object g3.

The text field in the upper left corner of the Main panel shows the state of the current keyboard shortcut.

In addition to the keyboard shortcuts for the panel commands, there is also a shortcut for picking a target object: type the short name of the object followed by p. For example, to select object g3, type g 3 p. This only works with the short names — the ones that appear in square brackets ([ ]) in the Targets browser of the Main panel.

Below is a summary of all keyboard shortcuts.

Draw
af
Faces
ae
Edges
an
Normals
ab
Bounding Boxes
aV
Vectors

Shading
0as
Constant
1as
Flat
2as
Smooth
3as
Smooth, non-lighted
aT
allow transparency
at
texture mapping

Other
av
eVert normals: always face viewer
#aw
Line Width (pixels)
aC
handle concave polygons
#vc
edges Closer than faces (try 5-100)

Color
Cf
faces
Ce
edges
Cn
normals
Cb
bounding boxes
CB
background

Motions
r
rotate
t
translate
z
zoom FOV
f
fly
o
orbit
s
scale
w
recenter target
W
recenter all
h
halt
H
halt all
@
select center of motion (e.g. g 3 @)
L
Look At object

Viewing
0vp
Orthographic view
1vp
Perspective view
vd
Draw other views' cameras
#vv
field of View
#vn
near clip distance
#vf
far clip distance
v+
add new camera
vx
cursor on/off
vb
backfacing poly cull on/off
#vl
focal length
v~
Software shading on/off

Panels
Pm
Main
Pa
Appearance
Pl
Lighting
Po
Obscure
Pt
Tools
Pc
Cameras
PC
Commands
Pf
Files
Ps
Save
P-
read commands from tty
PA
Credits ("about")

Lights
ls
show lights
le
edit lights

Space
me
Euclidean
mh
Hyperbolic
ms
Spherical

Model
mv
Virtual
mp
Projective
mc
Conformal

Other
0N
normalization: none
1N
normalization: each
2N all
normalization: all
ui
motion: Inertia
uc
motion: Constrain to axis
uo
motion: object's Own coordinates
<
Pf
load geometry/command file
dd
delete target object
>
Ps
save state to file
TV
NTSC mode toggle
p
pick as target object (e.g. g 3 p) With no prefix, selects the object under the mouse cursor (like double-clicking the right mouse)
geomview-1.9.5/doc/geomview.html/OOGL-File-Formats.html0000644000175000017500000000456012310162311017532 00000000000000 OOGL File Formats - Geomview Manual

Next: , Previous: Interaction, Up: Top


4 OOGL File Formats

The objects that you can load into Geomview are called OOGL objects. OOGL stands for “Object Oriented Graphics Library”; it is the library upon which Geomview is built.

There are many different kinds of OOGL objects. This chapter gives syntactic descriptions of file formats for OOGL objects.

Examples of most file types live in Geomview's data/geom directory.

geomview-1.9.5/doc/geomview.html/Conventions.html0000644000175000017500000000600712310162311017007 00000000000000 Conventions - Geomview Manual

4.1 Conventions

geomview-1.9.5/doc/geomview.html/Common-syntax.html0000644000175000017500000000521012310162311017251 00000000000000 Common syntax - Geomview Manual

Next: , Previous: Conventions, Up: Conventions


4.1.1 Syntax Common to All OOGL File Formats

Most OOGL object file formats are free-format ASCII — any amount of white space (blanks, tabs, newlines) may appear between tokens (numbers, key words, etc.). Line breaks are almost always insignificant, with a couple of exceptions as noted. Comments begin with # and continue to the end of the line; they're allowed anywhere a newline is.

Binary formats are also defined for several objects; See Binary format, and the individual object descriptions.

Typical OOGL objects begin with a key word designating object type, possibly with modifiers indicating presence of color information etc. In some formats the key word is optional, for compatibility with file formats defined elsewhere. Object type is then determined by guessing from the file suffix (if any) or from the data itself.

Key words are case sensitive. Some have optional prefix letters indicating presence of color or other data; in this case the order of prefixes is significant, e.g. CNMESH is meaningful but NCMESH is invalid. geomview-1.9.5/doc/geomview.html/File-names.html0000644000175000017500000000355712310162311016471 00000000000000 File names - Geomview Manual

Next: , Previous: Common syntax, Up: Conventions


4.1.2 File Names

When OOGL objects are read from disk files, the OOGL library uses the file suffix to guess at the file type.

If the suffix is unrecognized, or if no suffix is available (e.g. for an object being read from a pipe, or embedded in another OOGL object), all known types of objects are tried in turn until one accepts the data as valid. geomview-1.9.5/doc/geomview.html/Vertices.html0000644000175000017500000000672712310162311016277 00000000000000 Vertices - Geomview Manual

Next: , Previous: File names, Up: Conventions


4.1.3 Vertices

Several objects share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an object have the same format, specified by the header key word.

All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on).

The syntax is

x y z
(3-D floating-point vertex coordinates) or
x y z w
(4-D floating-point vertex coordinates)

optionally followed by

nx ny nz
(normalized 3-D surface-normal if present)

optionally followed by

r g b a
(4-component floating-point color if present, each component in range 0..1. The a (alpha) component represents opacity: 0 transparent, 1 opaque.)

optionally followed by

s t
or
s t u

(two or three texture-coordinate values).

Values are separated by white space, and line breaks are immaterial.

Letters in the object's header key word must appear in a specific order; that's the reverse of the order in which the data is given for each vertex. So a ‘CN4OFF’ object's vertices contain first the 4-component space position, then the 3-component normal, finally the 4-component color. You can't change the data order by changing the header key word; an ‘NCOFF’ is just not recognized. geomview-1.9.5/doc/geomview.html/ND_002dVertices.html0000644000175000017500000000613012310162311017232 00000000000000 ND-Vertices - Geomview Manual

4.1.4 N-dimensional Vertices

Several objects share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an object have the same format, specified by the header key word.

All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on).

The syntax for N-dimensional vertices (N > 3) is

x[1] x[2] x[3] x[4] ...
(N floating-point vertex coordinates) or
x[0] x[1] x[2] x[3] x[4] ...
((N+1) floating-point vertex coordinates, if the 4 modifier has been specified in the object's header line)

Note, however, that N-dimensional objects internally always have (N+1)-dimensional points; the first component x[0] – if present in the object file – is used as homogeneous divisor. This is different from the ordinary 3D case where the 4 modifier generates a 4D object where the homogeneous component implicitly is set to 1.

Color components usually can be specified like for 3D vertices, see Vertices, while specifying normals does not make sense. geomview-1.9.5/doc/geomview.html/Surface-normal-directions.html0000644000175000017500000000432612310162311021523 00000000000000 Surface normal directions - Geomview Manual

4.1.5 Surface normal directions

Geomview uses normal vectors to determine how an object is shaded. The direction of the normal is significant in this calculation.

When normals are supplied with an object, the direction of the normal is determined by the data given.

When normals are not supplied with the object, Geomview computes normal vectors automatically; in this case normals point toward the side from which the vertices appear in counterclockwise order.

On parametric surfaces (Bezier patches), the normal at point P(u,v) is in the direction dP/du cross dP/dv. geomview-1.9.5/doc/geomview.html/Transformation-matrices.html0000644000175000017500000000470012310162311021313 00000000000000 Transformation matrices - Geomview Manual

4.1.6 Transformation matrices

Some objects incorporate 4x4 real matrices for homogeneous object transformations. These matrices act by multiplication on the right of vectors. Thus, if p is a 4-element row vector representing homogeneous coordinates of a point in the OOGL object, and A is the 4x4 matrix, then the transformed point is p' = p A. This matrix convention is common in computer graphics; it's the transpose of that often used in mathematics, where points are column vectors multiplied on the right of matrices.

Thus for Euclidean transformations, the translation components appear in the fourth row (last four elements) of A. A's last column (4th, 8th, 12th and 16th elements) are typically 0, 0, 0, and 1 respectively. geomview-1.9.5/doc/geomview.html/ND-Transformation-matrices.html0000644000175000017500000000505612310162311021617 00000000000000 ND Transformation matrices - Geomview Manual

4.1.7 ND Transformation matrices

In the context of N-dimensional space (N > 3) some objects incorporate (N+1)x(N+1) real matrices for homogeneous object transformations. These matrices act by multiplication on the right of vectors. Thus, if p is an (N+1)-element row vector representing homogeneous coordinates of a point in the OOGL object, and A (N+1)x(N+1) is the matrix, then the transformed point is p' = p A.

Note that (unlike for the 4x4 transformation matrices, see Transformation matrices) the homogeneous component is located at index zero, so the translation components for Euclidean transformations appear in the zero-th row (first (N+1) elements). A's first column (at column index zero) is typically 1, 0, ..., 0. geomview-1.9.5/doc/geomview.html/Binary-format.html0000644000175000017500000000625412310162311017220 00000000000000 Binary format - Geomview Manual

4.1.8 Binary format

Many OOGL objects accept binary as well as ASCII file formats. These files begin with the usual ASCII token (e.g. CQUAD) followed by the word BINARY. Binary data begins at the byte following the first newline after BINARY. White space and a single comment may intervene, e.g.

     OFF BINARY      # binary-format "OFF" data follows

Binary data comprise 32-bit integers and 32-bit IEEE-format floats, both in big-endian format (i.e., with most significant byte first). This is the native format for 'int's and 'float's on Sun-3's, Sun-4's, and Irises, among others.

Binary data formats resemble the corresponding ASCII formats, with ints and floats in just the places you'd expect. There are some exceptions though, specifically in the QUAD, OFF and COMMENT file formats. Details are given in the individual file format descriptions. See QUAD, See OFF, and See COMMENT.

Binary OOGL objects may be freely mixed in ASCII object streams:

     LIST
     { = MESH BINARY
     ... binary data for mesh here ...
     }
     { = QUAD
             1 0 0   0 0 1   0 1 0  0 1 0
     }

Note that ASCII data resumes immediately following the last byte of binary data.

Naturally, it's impossible to embed comments inside a binary-format OOGL object, though comments may appear in the header before the beginning of binary data. geomview-1.9.5/doc/geomview.html/References.html0000644000175000017500000001024612310162311016563 00000000000000 References - Geomview Manual

Next: , Previous: Binary format, Up: Conventions


4.1.9 Embedded objects and external-object references

Some object types (LIST, INST) allow references to other OOGL objects, which may appear literally in the data stream, be loaded from named disk files, or be communicated from elsewhere via named objects. GCL commands also accept geometry in these forms.

The general syntax is

      <oogl-object>  ::=
             [ "{" ]
                 [ "define" symbolname ]
                 [ ["="] object-keyword ...
                      | "<" filename
                      | ":" symbolname ]
             [ "}" ]

where "quoted" items are literal strings (which appear without the quotes), [bracketed] items are optional, and | denotes alternatives. Curly braces, when present, must match; the outermost set of curly braces is generally required when the object is in a larger context, e.g. when it is part of a larger object or embedded in a Geomview command stream.

For example, each of the following three lines:

             { define fred   QUAD 1 0 0  0 0 1  0 1 0  1 0 0 }
     
             { define fred = QUAD 1 0 0  0 0 1  0 1 0  1 0 0 }
     
             { appearance { +edge } LIST { < "file1" } { : fred } }
     
             VECT 1 2 0   2 0   0 0 0   1 1 2

is a valid OOGL object. The last example is only valid when it is delimited unambiguously by residing in its own disk file.

The ":" construct allows references to symbols, created with define. A symbol's initial value is a null object. When a symbol is (re)defined, all references to it are automatically changed.

The "define NAME" construct allows to define a global symbol for the given object. If "NAME" already references an object, then the old object is discarded and replaced by the new definition. See (read ...). See (hdefine ...).

The "<" construct causes a disk file to be read. Note that this isn't a general textual "include" mechanism; a complete OOGL object must appear in the referenced file.

Files read using "<" are sought first in the directory of the file which referred to them, if any; failing that, the normal search path (see (load-path ...)) is used. The default search looks first in the current directory, then in the Geomview data directories.

Again, white space and line breaks are insignificant, and "#" comments may appear anywhere. geomview-1.9.5/doc/geomview.html/Appearances.html0000644000175000017500000002673612310162311016737 00000000000000 Appearances - Geomview Manual

Next: , Previous: References, Up: Conventions


4.1.10 Appearances

Geometric objects can have associated "appearance" information, specifying shading, lighting, color, wire-frame vs. shaded-surface display, and so on. Appearances are inherited through object hierarchies, e.g. attaching an appearance to a LIST means that the appearance is applied to all the LIST's members.

Some appearance-related properties are relegated to "material", "lighting" and "texture" substructures. Take care to note which properties belong to which structure. Any geometric object can be preceded by an appearance definition like in the following example:

     {
        appearance { +edge }
        LIST { < "file1" } { QUAD 1 0 0  0 0 1  0 1 0  1 0 0 }
     }

Appearances are also OOGL objects in their own right and can be given symbolic names and referenced by them (see References). See Appearance objects.

Texture Mapping
There is a separate section concerning the definition of textures (see Texture Mapping).
Transparency
Rendering translucent objects is not supported by all drawing back ends. The OpenGL renderer has limited support for it: top-level objects (i.e. those which appear in the object browser of the main panel (see The Main Panel) are rendered correctly by means of alpha-blending). Also, the RenderMan snapshots will include opacity values.

Here's an example appearance structure including values for all attributes. Order of attributes is unimportant. As usual, white space is irrelevant. Boolean attributes may be preceded by "+" or "-" to turn them on or off; "+" is assumed if only the attribute name appears. Other attributes expect values.

A "*" prefix on any attribute, e.g. "*+edge" or "*linewidth 2" or "material { *diffuse 1 1 .25 }", selects "override" status for that attribute.

     appearance {
       +face               # (Do) draw faces of polygons.  On by default.
       -edge               # (Don't) draw edges of polygons
       +vect               # (Do) draw VECTs.  On by default.
       transparent screendoor
                           # (Enable) transparency. Enabling transparency
                           # does not (necessarily) result in a correct Geomview
                           # pictures, but alpha values are used in RenderMan
                           # snapshots.
                           # The allowed keywords are ``screendoor'' (masking out
                           # out pixels by means of a stipple pattern),
                           # ``blending'' for alpha-blending with BSP-tree
                           # space paritioning and depth-sorting (slow) and
                           # ``naive'' for alpha-blending without even
                           # depth-sorting, not to talk about space
                           # partioning. Omitting the keyword will default to
                           # alpha-blending with BSP-tree space-partioning
                           # and depth-sorting.
       -normal             # (Do) draw surface-normal vectors
       normscale 1         # ... with length 1.0 in object coordinates
     
       +evert              # do evert polygon normals where needed so as
                           #   to always face the camera
     
       +texturing          # (Enable) texture mapping
       +linear             # (Enable) linear average of closest texture elements
       +mipmap             # (Enable) texture mip-mapping
       +mipinterp          # (Enable) linear mip-mapping
       -backcull           # (Don't) discard clockwise-oriented faces
       -concave            # (Don't) expect and handle concave polygons
       -shadelines         # (Don't) shade lines as if they were lighted cylinders
                           # These four are only effective where the graphics system
                           # supports them, namely on GL and Open GL.
     
       -keepcolor          # Normally, when N-D positional coloring is enabled as
                           # with geomview's (ND-color ...) command, all
                           # objects' colors are affected.  But, objects with the
                           # "+keepcolor" attribute are immune to N-D coloring.
     
       shading smooth      # or ``shading constant'' or ``shading flat'' or
                           # or ``shading csmooth'' or ``shading vcflat''.
                           # smooth = Gouraud shading, flat = faceted,
                           # csmooth = smoothly interpolated but unlighted,
                           # vcflat = flat shading, but smoothly interpolated colors.
     
       linewidth 1         # lines, points, and edges are 1 pixel wide.
     
       patchdice 10 10     # subdivide Bezier patches this finely in u and v
     
       material {         # Here's a material definition;
                           # it could also be read from a file as in
                           #  ``material < file.mat''
     
           ka  1.0         # ambient reflection coefficient.
           ambient .3 .5 .3 # ambient color (red, green, blue components)
                           # The ambient contribution to the shading is
                           # the product of ka, the ambient color,
                           # and the color of the ambient light.
     
           kd  0.8         # diffuse-reflection coefficient.
           diffuse .9 1 .4 # diffuse color.
                             # (In ``shading constant'' mode, the surface
                             # is colored with the diffuse color.)
     
           ks 1.0          # specular reflection coefficient.
           specular 1 1 1  # specular (highlight) color.
           shininess  25   # specular exponent; larger values give
                           # sharper highlights.
     
           backdiffuse .7 .5 0 # back-face color for two-sided surfaces
                             # If defined, this field determines the diffuse
                             # color for the back side of a surface.
                             # It's implemented by the software shader, and
                             # by hardware shading on GL systems which support
                             # two-sided lighting, and under Open GL.
     
           alpha   1.0     # opacity; 0 = transparent (invisible), 1 = opaque.
                           # Ignored when transparency is disabled.
     
           edgecolor   1 1 0  # line & edge color
     
           normalcolor 0 0 0  # color for surface-normal vectors
       }
     
       lighting {         # Lighting model
     
           ambient  .3 .3 .3  # ambient light
     
           replacelights   # ``Use only the following lights to
                           # illuminate the objects under this
                           # appearance.''
                           # Without "replacelights", any lights listed
                           # are added to those already in the scene.
     
                           # Now a collection of sample lights:
           light {
               color  1 .7 .6      # light color
               position  1 0 .5 0  # light position [distant light]
                                   # given in homogeneous coordinates.
                                   # With fourth component = 0,
                                   # this means a light coming from
                                   # direction (1,0,.5).
           }
     
           light {                        # Another light.
               color 1 1 1
               position  0 0 .5 1  # light at finite position ...
               location camera     # specified in camera coordinates.
                                   # (Since the camera looks toward -Z,
                                   # this example places the light
                                   # .5 unit behind the eye.)
               # Possible "location" keywords:
               #  global    light position is in world (well, universe) coordinates
               #             This is the default if no location specified.
               #  camera   position is in the camera's coordinate system
               #  local    position is in the coordinate system where
               #                   the appearance was defined
           }
       }                   # end lighting model
       texture {
             clamp st               # or ``s'' or ``t'' or ``none''
             file lump.tiff         # file supplying texture-map image
             alphafile mask.pgm.Z   # file supplying transparency-mask image
             apply blend            # or ``modulate'' or ``decal''
             transform  1 0 0 0     # surface (s,t,0,1) * tfm -> texture coords
                        0 1 0 0
                        0 0 1 0
                       .5 0 0 1
     
             background 1 0 0 1     # relevant for ``apply blend''
       }
     }                     # end appearance

There are rules for inheritance of appearance attributes when several are imposed at different levels in the hierarchy.

For example, Geomview installs a backstop appearance which provides default values for most parameters; its control panels install other appearances which supply new values for a few attributes; user-supplied geometry may also contain appearances.

The general rule is that the child's appearance (the one closest to the geometric primitives) wins. Further, appearance controls with "override" status (e.g. *+face or material { *diffuse 1 1 0 }) win over those without it.

Geomview's appearance controls use the "override" feature so as to be effective even if user-supplied objects contain their own appearance settings. However, if a user-supplied object contains an appearance field with override status set, that property will be immune to Geomview's controls. geomview-1.9.5/doc/geomview.html/Texture-Mapping.html0000644000175000017500000001670212310162311017536 00000000000000 Texture Mapping - Geomview Manual

Previous: Appearances, Up: Conventions


4.1.11 Texture Mapping

Some rendering back-ends support texture-mapped objects, actually only the OpenGL and the RenderMan interface at the time of this writing. There are also some issues with the RMan interface when using an alpha-channel in the texture image. Those rendering back-ends which don't support texturing silently ignore attempts to use texture mapping. A texture is specified as part of an appearance structure (see Appearances). Briefly, one provides a texture image (see Image objects), which is considered to lie in a square in (s,t) parameter space in the range 0 <= s <= 1, 0 <= t <= 1. Then one provides a geometric primitive, with each vertex tagged with (s,t) texture coordinates. If texturing is enabled, the appropriate portion of the texture image is pasted onto each face of the textured object.

There is (currently) no provision for inheritance of part of a texture structure; if the texture keyword is mentioned in an appearance, it supplants any other texture specification.

The appearance attribute texturing controls whether textures are used; there's no performance penalty for having texture { ... } fields defined when texturing is off.

The available fields are:

     clamp   none  -or-  s  -or-  t  -or-  st
       Determines the meaning of texture coordinates outside the range 0..1.
       With clamp none, the default, coordinates are interpreted
       modulo 1, so (s,t) = (1.25,0), (.25,0), and (-.75,0) all refer to
       the same point in texture space.  With s or t or
       st, either or both of s- or t-coordinates less than 0 or
       greater than 1 are clamped to 1 or 0, respectively.
     
     image { <image specification> (see Image objects) }
       Specify the actual texture image. Images can have 1, 2, 3 or 4 channels:
         1 channel:  luminance
         2 channels: luminance and alpha
         3 channels: RGB data
         4 channels: RGBA data
     
       See Image objects, for the actual definition of image
       objects. The alpha-channel is only interpreted as mask: where the mask
       is zero, pixels are simply not drawn. An exception is the case where
       apply is equal to modulate and translucency is enabled:
       in this case the resulting alpha value is the result of the
       multiplication of the surface color with the alpha value of the
       texture's alpha channel.
     
     file      filename
     alphafile filename
       This is considered obsolete, and only kept for compatibility,
       the modern way is to use the new OOGL image object. See Image objects.
       The stuff documented here should still work, though
     
       Specifies image file(s) containing the texture.
     
       The file keyword specifies a file with color or lightness information;
       alphafile if present, specifies a transparency ("alpha") mask;
       where the mask is zero, pixels are simply not drawn.
       Several image file formats are available; the file type must be
       indicated by the last few characters of the file name:
         .ppm or .ppm.Z or .ppm.gz  24-bit 3-color image in PPM format
         .pgm or .pgm.Z or .pgm.gz  8-bit grayscale image in PGM format
         .sgi or .sgi.Z or .sgi.gz  8-bit, 24-bit, or 32-bit SGI image
         .tiff                      8-bit or 24-bit TIFF image
         .gif                       GIF image
       For this feature to work, some programs must be available in
       geomview's search path:
         zcat  for .Z files
         gzip  for .gz files
         tifftopnm for .tiff files
         giftoppm for .gif files
     
       If an alphafile image is supplied, it must be the same size
       as the file image.
     
       Image objects provide a more flexible way to specify texture
       data. See Image objects.
     
     apply   modulate  -or-  blend  -or-  decal
       Indicates how the texture image is applied to the surface.
       Here the "surface color" means the color the surface would have
       in the absence of texture mapping.
     
       With modulate, the default, the texture color (or lightness,
       if textured by a gray-scale image) is multiplied by the surface color.
     
       With blend, texture blends between the background color
       and the surface color.  The file parameter must specify a
       gray-scale image.  Where the texture image is 0, the surface color is
       unaffected; where it's 1, the surface is painted in the color given
       by background; and color is interpolated for intermediate values.
     
       With decal, the file parameter must specify a
       3-color image.  If an alphafile parameter is present,
       its value interpolates between the surface color (where alpha=0)
       and the texture color (where alpha=1).  Lighting does not affect the
       texture color in decal mode; effectively the texture is
       constant-shaded.
     
     background  R G B A
       Specifies a 4-component color, with R, G, B, and A floating-point
       numbers normally in the range 0..1, used when apply blend
       is selected.
     
     transform transformation-matrix
       Expects a list of 16 numbers, or one of the other ways of representing
       a transformation (: handlename or < filename).
       The 4x4 transformation matrix is applied to texture coordinates,
       in the sense of a 4-component row vector (s,t,0,1) multiplied on
       the left of the matrix, to produce new coordinates (s',t')
       which actually index the texture.
geomview-1.9.5/doc/geomview.html/Object-File-Formats.html0000644000175000017500000000622612310162311020201 00000000000000 Object File Formats - Geomview Manual

4.2 Object File Formats

geomview-1.9.5/doc/geomview.html/QUAD.html0000644000175000017500000000624512310162311015240 00000000000000 QUAD - Geomview Manual

Next: , Previous: Object File Formats, Up: Object File Formats


4.2.1 QUAD: collection of quadrilaterals

The conventional suffix for a QUAD file is .quad.

The file syntax is

        [C][N][4]QUAD  -or-  [C][N][4]POLY              # Key word
        vertex  vertex  vertex  vertex  # 4*N vertices for some N
        vertex  vertex  vertex  vertex
        ...

The leading key word is [C][N][4]QUAD or [C][N][4]POLY, where the optional C and N prefixes indicate that each vertex includes colors and normals respectively. That is, these files begin with one of the words

QUAD CQUAD NQUAD CNQUAD POLY CPOLY NPOLY CNPOLY

(but not NCQUAD or NCPOLY). QUAD and POLY are synonymous; both forms are allowed just for compatibility with ChapReyes.

Following the key word is an arbitrary number of groups of four vertices, each group describing a quadrilateral. See the Vertex syntax above. The object ends at end-of-file, or with a close-brace if incorporated into an object reference (see above).

A QUAD BINARY file format is accepted; See Binary format. The first word of binary data must be a 32-bit integer giving the number of quads in the object; following that is a series of 32-bit floats, arranged just as in the ASCII format. geomview-1.9.5/doc/geomview.html/MESH.html0000644000175000017500000001164512310162311015242 00000000000000 MESH - Geomview Manual

Next: , Previous: QUAD, Up: Object File Formats


4.2.2 MESH: rectangularly-connected mesh

The conventional suffix for a MESH file is .mesh.

The file syntax is

     [U][C][N][Z][4][u][v][n]MESH # Key word
     [Ndim]                 # Space dimension, present only if nMESH
     Nu Nv            # Mesh grid dimensions
                                  # Nu*Nv vertices, in format specified
                                  # by initial key word
     vertex(u=0,v=0)  vertex(1,0)  ... vertex(Nu-1,0)
     vertex(0,1) ...    vertex(Nu-1,1)
     ...
     vertex(0,Nv-1) ... vertex(Nu-1,Nv-1)

The key word is [U][C][N][Z][4][u][v][n]MESH. The optional prefix characters mean:

U
Each vertex includes a 3-component texture space parameter. The first two components are the usual S and T texture parameters for that vertex; the third should be specified as zero.
C
Each vertex (see Vertices above) includes a 4-component color.
N
Each vertex includes a surface normal vector.
Z
Of the 3 vertex position values, only the Z component is present; X and Y are omitted, and assumed to equal the mesh (u,v) coordinate so X ranges from 0 .. (Nu-1), Y from 0 .. (Nv-1) where Nu and Nv are the mesh dimensions – see below.
4
Vertices are 4D, each consists of 4 floating values. Z and 4 cannot both be present.
u
The mesh is wrapped in the u-direction, so the (0,v)'th vertex is connected to the (Nu-1,v)'th for all v.
v
The mesh is wrapped in the v-direction, so the (u,0)'th vertex is connected to the (u,Nv-1)'th for all u. Thus a u-wrapped or v-wrapped mesh is topologically a cylinder, while a uv-wrapped mesh is a torus.
n
Specifies a mesh whose vertices live in a higher dimensional space. The dimension follows the "MESH" keyword. Each vertex then has Ndim components.

Note that the order of prefix characters is significant; a colored, u-wrapped mesh is a CuMESH not a uCMESH.

Following the mesh header are integers Nu and Nv, the dimensions of the mesh.

Then follow Nu*Nv vertices, each in the form given by the header. They appear in v-major order, i.e. if we name each vertex by (u,v) then the vertices appear in the order

     (0,0) (1,0) (2,0) (3,0) ...  (Nu-1,0)
     (0,1) (1,1) (2,1) (3,1) ...  (Nu-1,1)
     ...
     (0,Nv-1)                ...  (Nu-1,Nv-1)

A MESH BINARY format is accepted; See Binary format. The values of Nu and Nv are 32-bit integers; all other values are 32-bit floats. geomview-1.9.5/doc/geomview.html/BBOX.html0000644000175000017500000000615612310162311015241 00000000000000 BBOX - Geomview Manual

Next: , Previous: MESH, Up: Object File Formats


4.2.3 BBOX: simple bounding boxes

This is a very simple toy-object: it takes 2 vertices and draws a (hyper-) cube which is the bounding box of the two vertices.

Syntax:

       BBOX
       x[0] y[0] z[0]
       x[1] y[1] z[1]

or

       4BBOX
       x[0] y[0] z[0] w[0]
       x[1] y[1] z[1] w[1]

or

       nBBOX
       Ndim # > 3
       x[0] y[0] z[0] w[0] ...
       x[1] y[1] z[1] w[1] ...

or

       4nBBOX
       Ndim # > 3
       d[0] x[0] y[0] z[0] w[0] ...
       d[0] x[1] y[1] z[1] w[1] ...

There is no BBOX binary format. The 4 modifyer has different meanings depending on the dimension of the bounding box: 4BBOX means that the 4 components of the vertices make up a 4-dimensional bounding-box. Using 4 in conjunction with n4nBBOX NDim – means that the vertices specified in the file have NDim+1 components, but the component at index 0 is the homogeneous divisor (in contrast to the ordinary 3d case where the homogeneous divisor would be the w – the third – component). geomview-1.9.5/doc/geomview.html/BBP-and-BEZ.html0000644000175000017500000001377612310162311016276 00000000000000 BBP and BEZ - Geomview Manual

Next: , Previous: BBOX, Up: Object File Formats


4.2.4 Bezier Surfaces

The conventional file suffixes for Bezier surface files are .bbp or .bez. A file with either suffix may contain either type of patch.

Syntax:

       [ST]BBP -or- [C]BEZ<Nu><Nv><Nd>[_ST]
                             # Nu, Nv are u- and v-direction
                             # polynomial degrees in range 1..6
                             # Nd = dimension: 3->3-D, 4->4-D (rational)
                             # (The '<' and '>' do not appear in the input.)
                             # Nu,Nv,Nd are each a single decimal digit.
                             # BBP form implies Nu=Nv=Nd=3 so BBP = BEZ333.
     
                     # Any number of patches follow the header
                             # (Nu+1)*(Nv+1) patch control points
                             # each 3 or 4 floats according to header
       vertex(u=0,v=0)  vertex(1,0) ... vertex(Nu,0)
       vertex(0,1)                        ... vertex(Nu,1)
       ...
       vertex(0,Nv)                 ... vertex(Nu,Nv)
     
                             # ST texture coordinates if mentioned in header
       S(u=0,v=0)     T(0,0)   S(0,Nv) T(0,Nv)
       S(Nu,0)  T(Nu,0)    S(Nu,Nv) T(Nu,Nv)
     
                             # 4-component float (0..1) R G B A colors
                             # for each patch corner if mentioned in header
       RGBA(0,0)   RGBA(0,Nv)
       RGBA(Nu,0)  RGBA(Nu,Nv)

These formats represent collections of Bezier surface patches, of degrees up to 6, and with 3-D or 4-D (rational) vertices.

The header keyword has the forms [ST]BBP or [C]BEZ<Nu><Nv><Nd>[_ST] (the '<' and '>' are not part of the keyword.

The ST prefix on BBP, or _ST suffix on BEZuvn, indicates that each patch includes four pairs of floating-point texture-space coordinates, one for each corner of the patch.

The C prefix on BEZuvn indicates a colored patch, including four sets of four-component floating-point colors (red, green, blue, and alpha) in the range 0..1, one color for each corner.

Nu and Nv, each a single digit in the range 1..6, are the patch's polynomial degree in the u and v direction respectively.

Nd is the number of components in each patch vertex, and must be either 3 for 3-D or 4 for homogeneous coordinates, that is, rational patches.

BBP patches are bicubic patches with 3-D vertices, so BBP = BEZ333 and STBBP = BEZ333_ST.

Any number of patches follow the header. Each patch comprises a series of patch vertices, followed by optional (s,t) texture coordinates, followed by optional (r,g,b,a) colors.

Each patch has (Nu+1)*(Nv+1) vertices in v-major order, so that if we designate a vertex by its control point indices (u,v) the order is

          (0,0) (1,0) (2,0) ...  (Nu,0)
          (0,1) (1,1) (2,1) ...  (Nu,1)
          ...
          (0,Nv)            ...  (Nu,Nv)

with each vertex containing either 3 or 4 floating-point numbers as specified by the header.

If the header calls for ST coordinates, four pairs of floating-point numbers follow: the texture-space coordinates for the (0,0), (Nu,0), (0,Nv), and (Nu,Nv) corners of the patch, respectively.

If the header calls for colors, four four-component (red, green, blue, alpha) floating-point colors follow, one for each patch corner.

The series of patches ends at end-of-file, or with a closebrace if incorporated in an object reference. geomview-1.9.5/doc/geomview.html/OFF.html0000644000175000017500000001531212310162311015113 00000000000000 OFF - Geomview Manual

Next: , Previous: BBP and BEZ, Up: Object File Formats


4.2.5 OFF Files

The conventional suffix for OFF files is .off.

Syntax:

     [ST][C][N][4][n]OFF     # Header keyword
     [Ndim]            # Space dimension of vertices, present only if nOFF
     NVertices  NFaces  NEdges   # NEdges not used or checked
     
     x[0]  y[0]  z[0]      # Vertices, possibly with normals,
                             # colors, and/or texture coordinates, in that order,
                             # if the prefixes N, C, ST
                             # are present.
                             # If 4OFF, each vertex has 4 components,
                             # including a final homogeneous component.
                             # If nOFF, each vertex has Ndim components.
                             # If 4nOFF, each vertex has Ndim+1 components.
     ...
     x[NVertices-1]  y[NVertices-1]  z[NVertices-1]
     
                             # Faces
                             # Nv = # vertices on this face
                             # v[0] ... v[Nv-1]: vertex indices
                             #               in range 0..NVertices-1
     Nv  v[0] v[1] ... v[Nv-1]  colorspec
     ...
                             # colorspec continues past v[Nv-1]
                             # to end-of-line; may be 0 to 4 numbers
                             # nothing: default
                             # integer: colormap index
                             # 3 or 4 integers: RGB[A] values 0..255
                             # 3 or 4 floats: RGB[A] values 0..1

OFF files (name for "object file format") represent collections of planar polygons with possibly shared vertices, a convenient way to describe polyhedra. The polygons may be concave but there's no provision for polygons containing holes.

An OFF file may begin with the keyword OFF; it's recommended but optional, as many existing files lack this keyword.

Three ASCII integers follow: NVertices, NFaces, and NEdges. These are the number of vertices, faces, and edges, respectively. Current software does not use nor check NEdges; it needn't be correct but must be present.

The vertex coordinates follow: dimension * Nvertices floating-point values. They're implicitly numbered 0 through NVertices-1. dimension is either 3 (default) or 4 (specified by the key character 4 directly before OFF in the keyword).

Following these are the face descriptions, typically written with one line per face. Each has the form

     N  Vert1 Vert2 ... VertN  [color]

Here N is the number of vertices on this face, and Vert1 through VertN are indices into the list of vertices (in the range 0..NVertices-1).

The optional color may take several forms. Line breaks are significant here: the color description begins after VertN and ends with the end of the line (or the next # comment). A color may be:

nothing
the default color
one integer
index into "the" colormap; see below
three or four integers
RGB and possibly alpha values in the range 0..255
three or four floating-point numbers
RGB and possibly alpha values in the range 0..1

For the one-integer case, the colormap is currently read from the file cmap.fmap in Geomview's data directory. Some better mechanism for supplying a colormap is likely someday.

The meaning of "default color" varies. If no face of the object has a color, all inherit the environment's default material color. If some but not all faces have colors, the default is gray (R,G,B,A=.666).

A [ST][C][N][n]OFF BINARY format is accepted; See Binary format. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions (and texture coordinates or vertex colors or normals if COFF/NOFF/CNOFF/STCNOFF/etc. format).

Exception: each face's vertex indices are followed by an integer indicating how many color components accompany it. Face color components must be floats, not integer values. Thus a colorless triangular face might be represented as

     int int int int int
     3   17   5   9   0

while the same face colored red might be

     int int int int int float float float float
      3  17   5   9   4   1.0   0.0   0.0   1.0
geomview-1.9.5/doc/geomview.html/VECT.html0000644000175000017500000001144112310162311015241 00000000000000 VECT - Geomview Manual

Next: , Previous: OFF, Up: Object File Formats


4.2.6 VECT Files

The conventional suffix for VECT files is .vect.

Syntax:

     [4]VECT
     NPolylines  NVertices  NColors
     
     Nv[0] ... Nv[NPolylines-1]     # number of vertices
                                                # in each polyline
     
     Nc[0] ... Nc[NPolylines-1]     # number of colors supplied
                                                # in each polyline
     
     Vert[0] ... Vert[NVertices-1]  # All the vertices
                                                # (3*NVertices floats)
     
     Color[0] ... Color[NColors-1]  # All the colors
                                                # (4*NColors floats, RGBA)

VECT objects represent lists of polylines (strings of connected line segments, possibly closed). A degenerate polyline can be used to represent a point.

A VECT file begins with the key word VECT or 4VECT and three integers: NLines, NVertices, and NColors. Here NLines is the number of polylines in the file, NVertices the total number of vertices, and NColors the number of colors as explained below.

Next come NLines 16-bit integers

Nv[0] Nv[1] Nv[2] ... Nv[NLines-1]

giving the number of vertices in each polyline. A negative number indicates a closed polyline; 1 denotes a single-pixel point. The sum (of absolute values) of the Nv[i] must equal NVertices.

Next come NLines more 16-bit integers Nc[i]: the number of colors in each polyline. Normally one of three values:

0
No color is specified for this polyline. It's drawn in the same color as the previous polyline.
1
A single color is specified. The entire polyline is drawn in that color.
abs(Nv[i])
Each vertex has a color. Either each segment is drawn in the corresponding color, or the colors are smoothly interpolated along the line segments, depending on the implementation.

Next come NVertices groups of 3 or 4 floating-point numbers: the coordinates of all the vertices. If the keyword is 4VECT then there are 4 values per vertex. The first abs(Nv[0]) of them form the first polyline, the next abs(Nv[1]) form the second and so on.

Finally NColors groups of 4 floating-point numbers give red, green, blue and alpha (opacity) values. The first Nc[0] of them apply to the first polyline, and so on.

A VECT BINARY format is accepted; see Binary format. The binary format exactly follows the ASCII format, with 32-bit Big-Endian integers where ordinary integer numbers appear, and with 16-bit Big-Endian integers where 16-bit integers appear; 32-bit Big-Endian floats where real values appear. BIG FAT NOTE: The vertex counts Nv[i] and the color counts Nc[i] are 16-bit Big-Endian integers. geomview-1.9.5/doc/geomview.html/SKEL.html0000644000175000017500000001047312310162311015242 00000000000000 SKEL - Geomview Manual

Next: , Previous: VECT, Up: Object File Formats


4.2.7 SKEL Files

SKEL files represent collections of points and polylines, with shared vertices. The conventional suffix for SKEL files is .skel.

Syntax:

     [C][4][n]SKEL
     [NDim]                    # Vertex dimension, present only if nSKEL
     NVertices  NPolylines
     
     x[0]  y[0]  z[0]  # Vertices
                                         # if 4SKEL, each vertex has 4 components
                                         # if nSKEL, each vertex has NDim components
                                         # if C[4][n]SKEL vertex coordinates are
                                         # followed by an RGBA color specification
     ...
     x[NVertices-1]  y[NVertices-1]  z[NVertices-1]
     
                             # Polylines
                             # Nv = vertices on this polyline (1 = point)
                             # v[0] ... v[Nv-1]: vertex indices
                             #               in range 0..NVertices-1
     Nv  v[0] v[1] ... v[Nv-1]  [colorspec]
     ...
                             # colorspec continues past v[Nv-1]
                             # to end-of-line; may be nothing, or 3 or 4 numbers.
                             # nothing: default color
                             # 3 or 4 floats: RGB[A] values 0..1

The syntax resembles that of OFF files, with a table of vertices followed by a sequence of polyline descriptions, each referring to vertices by index in the table. Each polyline has an optional color.

For nSKEL objects, each vertex has NDim components. For 4nSKEL objects, each vertex has NDim+1 components; the final component is the homogeneous divisor.

A [4][n]SKEL BINARY format is accepted; See Binary format. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions.

Exception: each polyline's vertex indices are followed by an integer indicating how many color components accompany it. Polyline color components must be floats, not integer values. Thus a colorless polyline with 3 vertices might be represented as

     int int int int int
     3   17   5   9   0

while the same polyline colored red might be

     int int int int int float float float float
      3  17   5   9   4   1.0   0.0   0.0   1.0
geomview-1.9.5/doc/geomview.html/SPHERE.html0000644000175000017500000000772612310162311015501 00000000000000 SPHERE - Geomview Manual

Next: , Previous: SKEL, Up: Object File Formats


4.2.8 SPHERE Files

The conventional suffix for SPHERE files is .sph.

     [ST][E|H|S]SPHERE # Keyword
     # auto-generated texture co-ordinates, only allowed with STSPHERE objects
     [SINUSOIDAL|CYLINDRICAL|RECTANGULAR|STEREOGRAPHIC|ONEFACE]
     # next four fields are required
     Radius
     Xcenter Ycenter Zcenter

The key word is [ST][E|H|S]SPHERE. The optional prefix characters mean:

ST
The sphere carries automatically generated texture co-ordinates. See below.
E
The sphere lives in Euclidean space.
H
The sphere lives in Hyperbolic space. See Non-Euclidean Geometry.
S
The sphere lives in spherical space. See Non-Euclidean Geometry.

Sphere objects are drawn using meshes which are rectangular in a polar co-ordinate system, with the equatorial plane parallel to the x,y-plane. Their smoothness, and the time taken to draw them, depends on the setting of the dicing level, 10x10 by default. From Geomview, the Appearance panel, the <N>ad keyboard command, or a dice nu nv Appearance attribute sets this.

Texture co-ordinates are generated for STSPHERE objects; the keyword following the initial STSPHERE keyword defines the way this is done. It follows the conventions of the mktxmesh Perl-script which comes with the Orrery.

SINUSOIDAL
sinusoidal equal-area projection
CYLINDRICAL
cylindrical proj: s is the longitude, t is the latitude
RECTANGULAR
rectangular proj: s is the longitude, t is sin(latitude) (i.e. z co-ordinate in the sphere's co-ordinate system)
STEREOGRAPHIC
stereographic projection from the south (z=-1) pole
ONEFACE
stretch orthographic view of +y hemisphere over both, mirroring
geomview-1.9.5/doc/geomview.html/INST.html0000644000175000017500000002107712310162311015263 00000000000000 INST - Geomview Manual

Next: , Previous: SPHERE, Up: Object File Formats


4.2.9 INST Files

The conventional suffix for a INST file is .inst.

There is no INST BINARY format.

An INST applies a 4x4 (or (N+1)x(N+1) in the context of ND-viewing) transformation to another OOGL object. It begins with INST followed by these sections which may appear in any order:

     geom oogl-object

specifies the OOGL object to be instantiated. See References, for the syntax of an oogl-object. The keyword unit is a synonym for geom.

     transform   ["{"] 4x4 transform ["}"]

specifies a single transformation matrix. Either the matrix may appear literally as 16 numbers, or there may be a reference to a "transform" object, i.e.

         "<" file-containing-4x4-matrix

or

         ":" symbol-representing-transform-object

Another way to specify the transformation is

     transforms
         oogl-object

The oogl-object must be a TLIST object (list of transformations) object, or a LIST whose members are ultimately TLIST objects. In effect, the transforms keyword takes a collection of 4x4 matrices and replicates the geom object, making one copy for each 4x4 matrix.

If no transform nor transforms keyword appears, no transformation is applied (actually the identity is applied). You could use this for, e.g., wrapping an appearance around an externally-supplied object, though a single-membered LIST would do this more efficiently.

See Transformation matrices, for the matrix format.

When replicating a single geometry by means of a TLIST object (see ‘transforms’ above) it may be useful to transform texture co-ordinates by another list of transformations; that list can be specified by

     txtransforms
         TLIST-object

The number of texture transformations must match the number of geometry transformations. The SPHERE object (see Sphere Objects) uses this technique to generate an entire textured sphere out of some fraction of a sphere (usually one octant).

A single (N+1)-dimensional transformation can be specified by

     ntransform ["{"] N+1 N+1 (N+1)x(N+1) floats ["}"]

This gives a single N+1-dimensional transformation matrix. Either the matrix may appear literally as (N+1)x(N+1) numbers, or there may be a reference to an ‘ntransform’ object, i.e.

         "<" file-containing-(N+1)x(N+1)-matrix

or

         ":" symbol-representing-ntransform-object

See ND Transformation matrices, for the matrix format.

Two more INST fields are accepted: location and origin.

Note that location as well as origin are ignored if this INST object carries an ntransform. Also, if ND-viewing is active (ND-axes command, see GCL) then INST objects with origin unequal to local will not be drawn, though the location stuff may work (or not).

     location [global or camera or ndc or screen or local]

Normally an INST specifies a position relative to its parent object; the location field allows putting an object elsewhere.

  • location global attaches the object to the global (a.k.a. universe) coordinate system – the same as that in which geomview's World objects, alien geometry, and cameras are placed.
  • location camera places the object relative to the camera. (Thus if there are multiple views, it may appear in a different spatial position in each view.) The center of the camera's view is along its negative Z axis; positive X is rightward, positive Y upward. Normally the units of camera space are the same as global coordinates. When a camera is reset, the global origin is at (0,0,-3.0).
  • location ndc places the object relative to the normalized unit cube into which the camera's projection (perspective or orthographic) maps the visible world. X, Y, and Z are each in the range from -1 to +1, with Z = -1 the near and Z = +1 the far clipping plane, and X and Y increasing rightward and upward respectively. Thus something like
              INST  transform  1 0 0 0  0 1 0 0  0 0 1 0  -.9 -.9 -.999 1
                    location ndc
                    geom < label.vect
    

    pastes label.vect onto the lower left corner of each window, and in front of nearly everything else, assuming label.vect's contents lie in the positive quadrant of the X-Y plane. It's tempting to use -1 rather than -.999 as the Z component of the position, but that may put the object just nearer than the near clipping plane and make it (partially) invisible, due to floating-point error.

  • location screen places the object in screen coordinates. The range of Z is still -1 through +1 as for ndc coordinates; X and Y are measured in pixels, and range from (0,0) at the lower left corner of the window, increasing rightward and upward.

location local is the default; the object is positioned relative to its parent.

     origin [global or camera or ndc or screen or local] x y z

The origin field translates the contents of the INST to place the origin at the specified point of the given coordinate system. Unlike location, it doesn't change the orientation, only the choice of origin. Both location and origin can be used together.

So for example

     { INST
       location screen
       origin ndc 0 0 -.99
       geom { < xyz.vect }
       transform { 100 0 0 0  0 100 0 0  0 0 -.009 0   0 0 0 1 }
     }

places xyz.vect's origin in the center of the window, just beyond the near clipping plane. The unit-length X and Y edges are scaled to be just 100 screen units – pixels – long, regardless of the size of the window.

geomview-1.9.5/doc/geomview.html/INST-Examples.html0000644000175000017500000000470412310162311017035 00000000000000 INST Examples - Geomview Manual

Previous: INST, Up: INST


4.2.9.1 INST Examples

Here are some examples of INST files

     INST
          unit < xyz.vect
          transform {
             1 0 0 0
             0 1 0 0
             0 0 1 0
             1 3 0 1
          }
     { appearance { +edge  material { edgecolor 1 1 0 } }
         INST geom < mysurface.quad }
     {INST transform {: T} geom {<dodec.off}}
     { INST
          transforms
              { LIST
             { < some-matrices.prj }
             { < others.prj }
             { TLIST <still more of them> }
     
              }
          geom
              { # stuff replicated by all the above matrices
             ...
              }
     }

This one resembles the origin example in the section above, but makes the X and Y edges be 1/4 the size of the window (1/4, not 1/2, since the range of ndc X and Y coordinates is -1 to +1).

     { INST
       location ndc
       geom { < xyz.vect }
       transform { .5 0 0 0  0 .5 0 0  0 0 -.009 0   0 0 -.99 1 }
     }
geomview-1.9.5/doc/geomview.html/LIST.html0000644000175000017500000000457612310162311015266 00000000000000 LIST - Geomview Manual

Next: , Previous: INST, Up: Object File Formats


4.2.10 LIST Files

The conventional suffix for a LIST file is .list.

A list of OOGL objects

Syntax:

     LIST
         oogl-object
         oogl-object
         ...

Note that there's no explicit separation between the oogl-objects, so they should be enclosed in curly braces ({ }) for sanity. Likewise there's no explicit marker for the end of the list; unless appearing alone in a disk file, the whole construct should also be wrapped in braces, as in:

        { LIST { QUAD ... } { < xyz.quad } }

A LIST with no elements, i.e. { LIST }, is valid, and is the easiest way to create an empty object. For example, to remove a symbol's definition you might write

        { define somesymbol  { LIST } }
geomview-1.9.5/doc/geomview.html/TLIST.html0000644000175000017500000000762412310162311015407 00000000000000 TLIST - Geomview Manual

Next: , Previous: LIST, Up: Object File Formats


4.2.11 TLIST Files

The conventional suffix for a TLIST file is .grp ("group") or .prj ("projective" matrices).

Collection of 4x4 matrices, used in the transforms section of and INST object.

Syntax:

     TLIST                    # key word
     <4x4 matrix (16 floats)>
     ...                  # any number of 4x4 matrices
     transform {             # reference to a transform object
     <transform object (can be a handle)>
     }
     tlist {                 # nested TLIST
     <TLIST OOGL object (can be a handle)>
     }

TLISTs are used only within the transforms clause of an INST object. They cause the INSTs geom object to be instantiated once under each of the transforms in the TLIST. The effect is like that of a LIST of INSTs each with a single transform, and all referring to the same object, but is more efficient.

TLISTs can be nested: effectively this means that all transformations in each nested TLIST object are multiplied (from the left) by the transformations in the outer TLIST object.

Be aware that a TLIST is a kind of geometry object, distinct from a transform object. Some contexts expect one type of object, some the other. For example in

     INST transform { : myT } geom { ... }

myT must be a transform object, which might have been created with the GCL

     (read transform { define myT 1 0 0 1 ... })

while in

       INST transforms { : myTs } geom { ... }
       or
       INST transforms { LIST {: myTs} {< more.prj} } geom { ... }

myTs must be a geometry object, defined e.g. with

       (read geometry { define myTs { TLIST 1 0 0 1 ... } })

A TLIST BINARY format is accepted. Binary data begins with a 32-bit integer giving the number of transformations, followed by that number of 4x4 matrices in 32-bit floating-point format. The order of matrix elements is the same as in the ASCII format. geomview-1.9.5/doc/geomview.html/GROUP.html0000644000175000017500000000407112310162311015375 00000000000000 GROUP - Geomview Manual

Next: , Previous: TLIST, Up: Object File Formats


4.2.12 GROUP Files

This format is obsolete, but is still accepted. It combined the functions of INST and TLIST, taking a series of transformations and a single Geom (unit) object, and replicating the object under each transformation.

     GROUP ... < matrices > ... unit { oogl-object }

is still accepted and effectively translated into

     INST
             transforms { TLIST ... <matrices> ... }
             unit { oogl-object }
geomview-1.9.5/doc/geomview.html/DISCGRP.html0000644000175000017500000000325712310162311015601 00000000000000 DISCGRP - Geomview Manual

Next: , Previous: GROUP, Up: Object File Formats


4.2.13 DISCGRP Files

This format is for discrete groups, such as appear in the theory of manifolds or in symmetry patterns. This format has its own man page. See discgrp(5). geomview-1.9.5/doc/geomview.html/COMMENT.html0000644000175000017500000000610112310162311015577 00000000000000 COMMENT - Geomview Manual

Previous: DISCGRP, Up: Object File Formats


4.2.14 COMMENT Objects

The COMMENT object is a mechanism for encoding arbitrary data within an OOGL object. It can be used to keep track of data or pass data back and forth between external modules.

Syntax:

     COMMENT                 # key word
     
     name type   # individual name and type specifier
     { ... }             # arbitrary data

The data, which must be enclosed by curly braces, can include anything except unbalanced curly braces. The type field can be used to identify data of interest to a particular program through naming conventions.

COMMENT objects are intended to be associated with other objects through inclusion in a LIST object. (See LIST.) The "#" OOGL comment syntax does not suffice for data exchange since these comments are stripped when an OOGL object is read in to Geomview. The COMMENT object is preserved when loaded into Geomview and is written out intact.

Here is an example associating a WorldWide Web URL with a piece of geometry:

     { LIST
      { < Tetrahedron}
      {COMMENT GCHomepage HREF { http://www.geomview.org/ }}
     }

A binary COMMENT format is accepted. Its format is not consistent with the other OOGL binary formats. See Binary format. The name and type are followed by

     N Byte1 Byte2 ... ByteN

instead of data enclosed in curly braces. geomview-1.9.5/doc/geomview.html/Non_002dgeometric-objects.html0000644000175000017500000000500612310162311021305 00000000000000 Non-geometric objects - Geomview Manual

4.3 Non-geometric objects

The syntax of these objects is given in the form used in See References, where "quoted" items should appear literally but without quotes, square bracketed ([ ]) items are optional, and | separates alternative choices.

geomview-1.9.5/doc/geomview.html/appearance-objects.html0000644000175000017500000000377112310162311020235 00000000000000 appearance objects - Geomview Manual

4.3.1 Appearance Objects

Appearances are OOGL objects of their own right, which simply means that it is possible to give them symbolic names (see References). There are other sections dealing with appearance details. See Appearances. geomview-1.9.5/doc/geomview.html/image-objects.html0000644000175000017500000003657712310162311017232 00000000000000 image objects - Geomview Manual

4.3.2 Image Objects

Image objects are used to specify pixmap data for either textures (see Texture Mapping), or for background images of cameras (see Camera objects).

At the time of this writing images are comprised of 1 to 4 channels, a channel provides a single number in the range from 0 to maxval for each pixel; and maxval is tied to 255. The interpretation of the image data depending on the number of channels is like follows:

#Channels Channel No. Interpretation
1 1 greyscale or luminance data
2 1 greyscale or luminance data
2 alpha channel (0: transparent, maxval: opaque)
3 1 red channel
2 green channel
3 blue channel
4 1 red channel
2 green channel
3 blue channel
4 alpha channel (0: transparent, maxval: opaque)

Image data can be specified inline (embedded into the current data stream) or via file references; in both cases the data is read in and interpreted at the time the image object is parsed. This is different from the old (and deprecated) texture image specification, where the the image data on-disk would eventually be re-read by Geomview.

The general syntax of image objects is like follows:

     <image> ::=
       [ "{" ]             (curly brace, generally needed to make
                            the end of the object unambiguous.)
       [ "image" ]          (optional keyword; unnecessary if the type
                            is determined by the context, which it
                            usually is.)
       [ "define" <name> ]
                            (defines an image named <name>, setting
                            its value from the stuff which follows)
       |
           "<" <filename>   (meaning: read image from that file)
       |
           ":" <name>       (meaning: use variable name,
                            defined elsewhere; if undefined the image
                            carries no data)
       |
                            (actual stuff defining the image; image data
                            must come last, after defining the width and
                            height and number of channels)
     
           "width"          (width of the image, auto-detected from image data
                            if possible)
     
           "height"         (height of the image, auto-detected from image data
                            if possible)
     
           "channels"       (number of channels, auto-detected from image data
                            and data specifications, if possible)
     
           "maxval"         (unsupported, must be 255 if specified)
     
           "data DESTMASK [FILTER] [{] < FILENAME [}]"
           "data DESTMASK [FILTER] DATASIZE [{][\n]LITERAL_IMAGE_DATA[}]"
                            (either external or embedded image data, see below
                            for a detailed description of the meaning of
                            MASK and FILTER. An image can (and
                            has, in general) multiple data sections.)
     
       [ "}" ]             (matching curly brace)

Details concerning the image data specification:

DESTMASK
This is a bit-field describing where the specified image data should be placed in the destination pixmap. The bit-field is specified by an integer in one of the known formats (decimal, octal, hexadecimal). The channels of the source data are always enumbered consecutively. If, e.g. ‘FILENAME’ or ‘LITERAL_IMAGE_DATA’ specify a three-channel (probably RGB ...) image and ‘DESTMASK’ equals 0xD (i.e. bit 1 is 0), then the 3rd channel of the source pixmap would be placed in the 4th channel of the destination image object (the alpha channel), the 2nd source channel would determine the ‘blue’ destination value and the 1st source channel the ‘red’ destination value.

The number of channels of the source data always has to match the number of bits set in ‘DESTMASK’. Exception: if the source pixmap has only one channel, then it can be used to fill any number of destination channels; all channels specified in ‘DESTMASK’ are filled with the data of the single channel source pixmap.

Geomview knows the following symbolic constants, which can be used instead of specifying the ‘DESTMASK’ bit-field numerically:

LUMINANCE
same as ‘1’, ‘0x1’, ‘\01
LUMINANCE_ALPHA
same as ‘3’, ‘0x3’, ‘\03
RGB
same as ‘7’, ‘0x7’, ‘\07
RGBA
same as ‘15’, ‘0xf’, ‘\017
ALPHA
depends on the context: the absolute number of channels must be known; i.e. ‘data ALPHA ...’ must be prepended by something determining the number of channels of the image, e.g.
               ...
               data RGB ...
               data ALPHA
               ...

is valid, but

               <no other channel or image data specification>
               data ALPHA ...
               <whatever else ...>

is not valid, because Geomview has not means to determine the destination channel from the context.

AUTO
PGM image data is interpreted as single grey-scale channel, RGB PNM data as RGB image data. AUTO cannot work with ‘raw’ image data.

FILTER
The ‘FILTER’ specification is optional. If it is missing, then Geomview tries to determine the image type from the ‘FILENAME’ suffix. If there is no suffix or the suffix is unknown, or for embedded image data, Geomview is able to auto-detectc SGI image file formats (for historical reasons ...) and NetPBM image formats (for practical reasons). The auto-detection of NetPBM formats includes the new PAM image format which allows (among other things) to store an alpha channel together with the luminance or RGB data. Likewise, the final output of any of the specified filters must either be in SGI image file format, or specify a PAM, PNM or PGM image. If the image file format cannot be determined by either the filenmae suffix or the filter specification or by auto-deteciong of SGI or NetPBM data, then Geomview assume that it is raw-data. See below.

The decompression filters may be prepended to either one of the know image formats or an explicitly specified filter, e.g. the following is valid:

          data LUMINANCE raw.gzip { < gzippedgreymapfile }

The above should be equivalent to

          data LUMINANCE raw { < greymapfile },

provided that the decompressed data carries single channel data, with the first pixel corresponding to the lower-left corner (because of the ‘raw’ image format, see below).

Geomview has builtin knowledge for the following filters/suffixes:

Data Decompression
z
gz
gzip
data is piped through ‘gzip -dc
bz2
bzip2
data is piped through ‘bzip2 -dc

Image Formats
tiff
tif
TIFF image file format. Only supported if the tifftopnm executable can be fond in the current excution path.
png
PNG image file format. Only supported if the pngtopnm executable can be fond in the current excution path.
jpg
jpeg
JPEG image file format. Only supported if the jpegtopnm executable can be fond in the current excution path.
gif
GIF image file format. Only supported if the giftoppm executable can be fond in the current excution path.
raw
Raw image data; the number of channels must match the number of bits set in ‘DESTMASK’. Pixels are specified with 1 byte per channel. The pixels are organized in rows as ‘liminance[-alpha]’ or ‘RGB[A]’ samples. The left-most pixel is the first pixel in each data-row, the top-most image row must come first (this is just the same as the NetPBM convention, the image co-ordinate systems has its origin in the left/top corner, as usual).

Explicitly Specified Filters
If none of the suffixes specified above should match, then the suffix/filter is interpreted as an external filter program; the filter program must read from STDIN and write to STDOUT. The output must either be in SGI image format, or in PNM or PGM format. Otherwise the output data is interpreted as raw image data (see above).

Something like the following should work, provided that the program ${HOME}/bin/bububfilter exists, is executable and does something useful:

               ...
               data RGB "${HOME}/bin/bububfilter.bzip2" 7 { # binary data follows
               bububub
               }
               ...

Note that – prior to feeding the data to the ‘bububfilter’ – Geomview will try to decompress the stuff with ‘bzip2 -dc’.

Missing image data: Normally, the number of image channels is determined automatically from the image data specifications; if the image specification carries an explicit number of channels via the channels keyword which exceeds the number of channels found in the image data specifications, or if the union of all ‘DESTMASK’ specfications has holes, then missing luminance and RGB channels are initialized to 0, and a missing alpha-channel is initialized to maxval, i.e. omitting the alpha channel data for an RGBA image is just the same as defining an RGB image. geomview-1.9.5/doc/geomview.html/transform-objects.html0000644000175000017500000001057012310162311020144 00000000000000 transform objects - Geomview Manual

4.3.3 Transform Objects

Where a single 4x4 matrix is expected – as in the INST transform field, the camera's camtoworld transform and the Geomview xform* commands – use a transform object.

Note that a transform is distinct from a TLIST, which is a type of geometry. TLISTs can contain one or more 4x4 transformations; "transform" objects must have exactly one.

Why have both? In many places – e.g. camera positioning – it's only meaningful to have a single transform. Using a separate object type enforces this.

Syntax for a transform object is

     <transform> ::=
       [ "{" ]             (curly brace, generally needed to make
                            the end of the object unambiguous.)
     
        [ "transform" ]    (optional keyword; unnecessary if the type
                            is determined by the context, which it
                            usually is.)
        [ "define" <name> ]
                           (defines a transform named <name>, setting
                            its value from the stuff which follows)
     
           <sixteen floating-point numbers>
                           (interpreted as a 4x4 homogeneous transform
                            given row by row, intended to apply to a
                            row vector multiplied on its LEFT, so that e.g.
                            Euclidean translations appear in the bottom row)
        |
           "<" <filename>  (meaning: read transform from that file)
        |
           ":" <name>      (meaning: use variable <name>,
                             defined elsewhere; if undefined the initial
                             value is the identity transform)
     
      [ "}" ]              (matching curly brace)

The whole should be enclosed in { braces }. Braces are not essential if exactly one of the above items is present, so e.g. a 4x4 array of floats standing alone may but needn't have braces.

Some examples, in contexts where they might be used:

     # Example 1: A GCL command to define a transform
     # called "fred"
     
     (read transform { transform  define fred
              1 0 0 0
              0 1 0 0
              0 0 1 0
             -3 0 1 1
         }
     )
     # Example 2:  A camera object using transform
     # "fred" for camera positioning
     # Given the definition above, this puts the camera at
     # (-3, 0, 1), looking toward -Z.
     
     { camera
             halfyfield 1
             aspect 1.33
             camtoworld { : fred }
     }
geomview-1.9.5/doc/geomview.html/ntransform-objects.html0000644000175000017500000001336012310162311020322 00000000000000 ntransform objects - Geomview Manual

4.3.4 ND-Transform Objects

Where – in the context of ND-viewing – a single (N+1)x(N+1) matrix is expected – as in the INST ntransform field, or the ND-xform* (see GCL) commands – use an ntransform object.

ntransform are NRows x NCols transformation matrix where usually NRows = N+1 in the context of N-dimensional objects and viewing. The homogeneous component of an ntransform sits at column zero (in contrast to ordinary transform objects where it is located at column three). ntransform objects operate on points of any dimension: if a point is to be transformed by an ntransform object and the dimension of the point does not match the number of rows of the ntransform object, then either the point is implicitly padded with zeros to match NRows or the matrix is implicitly padded with ones down its diagonal (and zeros everywhere else) such that it will operate as identity on the excess dimensions of the input point.

Syntax for an ntransform object is

     <ntransform> ::=
       [ "{" ]             (curly brace, generally needed to make
                            the end of the object unambiguous.)
     
        [ "ntransform" ]    (optional keyword; unnecessary if the type
                            is determined by the context, which it
                            usually is.)
     
        [ "define" <name> ]
                            (defines a transform named <name>, setting
                            its value from the stuff which follows)
     
          NRows NCols
                            (number of rows and columns of the matrix,
                            typically N+1 N+1, but any dimensions
                            are possible)
          <NRows x NCols floating-point numbers>
                            (interpreted as a NRows x NCols
                            homogeneous transform given row by row, intended
                            to apply to a row vector multiplied on its LEFT,
                            so that e.g. Euclidean translations appear in the
                            top row -- in contrast to the ordinary
                            transform objects where the translations appear
                            in the bottom row)
        |
           "<" <filename>  (meaning: read transform from that file)
        |
           ":" <name>      (meaning: use variable <name>,
                           defined elsewhere; if undefined the initial
                           value is the identity transform)
     
      [ "}" ]             (matching curly brace)

The whole should be enclosed in { braces }. Braces are not necessarily essential, so e.g. two integers – NRows NCols – followed by a NRows x NCols array of floats standing alone may but needn't have braces.

Some examples, in contexts where they might be used:

     # Example 1: A GCL command to define a 6x6 transform called
     # "fred", a mere translation by the vector -3 0 1 1 0. This
     # transform is meant for a five dimensional space, with an homogeneous
     # component a index zero.
     
     (read ntransform { ntransform  define fred
              6 6
              1 -3 0 1 1 0
              0  1 0 0 0 0
              0  0 1 0 0 0
              0  0 0 1 0 0
              0  0 0 0 1 0
              0  0 0 0 0 1
         }
     )
     # Example 2: Set the ND-xform of an object -- a geometry or a camera
     # cluster. Given the definition above, this puts the object at (-3 0 1 1
     # 0) in the five dimensional space.
     
     (ND-xform-set focus : fred)
     
     # or
     
     (ND-xform-set g1 : fred)
geomview-1.9.5/doc/geomview.html/camera-objects.html0000644000175000017500000001505612310162311017365 00000000000000 camera objects - Geomview Manual

4.3.5 cameras

A camera object specifies the following properties of a camera:

position and orientation
specified by either a camera-to-world or world-to-camera transformation; this transformation does not include the projection, so it's typically just a combination of translation and rotation. Specified as a transform object, typically a 4x4 matrix.
"focus" distance
Intended to suggest a typical distance from the camera to the object of interest; used for default camera positioning (the camera is placed at (X,Y,Z) = (0,0,focus) when reset) and for adjusting field-of-view when switching between perspective and orthographic views.
window aspect ratio
True aspect ratio in the sense <Xsize>/<Ysize>. This normally should agree with the aspect ratio of the camera's window. Geomview normally adjusts the aspect ratio of its cameras to match their associated windows.
near and far clipping plane distances
Note that both must be strictly greater than zero. Very large <far>/<near> distance ratios cause Z-buffering to behave badly; part of an object may be visible even if somewhat more distant than another.
field of view
Specified in either of two forms.
fov
is the field of view – in degrees if perspective, or linear distance if orthographic – in the shorter direction.
halfyfield
is half the projected Y-axis field, in world coordinates (not angle!), at unit distance from the camera. For a perspective camera, halfyfield is related to angular field:
halfyfield = tan( Y_axis_angular_field / 2 )

while for an orthographic one it's simply:

halfyfield = Y_axis_linear_field / 2

This odd-seeming definition is (a) easy to calculate with and (b) well-defined in both orthographic and perspective views.

background color
Arguably not a property of a camera, but of the scene. Nevertheless, as there is no "background" OOGL object, and the background color should not be a property of the drawing device, it can be specified here. At the time of this writing, however, the GUI always overrides the background color with its own settings.
background image
Same reasoning as above, only that the GUI does not override this setting. The image is centered at NDC co-ordinates (0,0,-1); it is not resized, just painted behind everything else as is. See Image objects.

The syntax for a camera is:

     <camera> ::=
     
        [ "camera" ]                 (optional keyword)
         [ "{" ]                    (opening brace, generally required)
             [ "define" <name> ]
     
             "<" <filename>
           |
             ":" <name>
           |
                                     (or any number of the following,
                                      in any order...)
     
             "perspective"  {"0" | "1"}            (default 1)
                                             (otherwise orthographic)
     
             "stereo"       {"0" | "1"}            (default 0)
                                             (otherwise mono)
     
             "worldtocam" <transform>        (see transform syntax above)
     
             "camtoworld" <transform>
                                     (no point in specifying both
                                      camtoworld and worldtocam; one is
                                      constrained to be the inverse of                                                the other)
     
             "halfyfield" <half-linear-Y-field-at-unit-distance>
                                     (default tan 40/2 degrees)
     
             "fov"           (angular field-of-view if perspective,
                              linear field-of-view otherwise.
                              Measured in whichever direction is smaller,
                              given the aspect ratio.  When aspect ratio
                              changes -- e.g. when a window is reshaped --
                              "fov" is preserved.)
     
             "frameaspect" <aspect-ratio>    (X/Y) (default 1.333)
     
             "near"  <near-clipping-distance>        (default 0.1)
     
             "far"   <far-clipping-distance>         (default 10.0)
     
             "focus" <focus-distance>                (default 3.0)
     
             "bgcolor" <float RGB(A) color>          (default 1/3 1/3 1/3 1)
     
             "bgimage" { <image specification> }     (default no background image)
     
          [ "}" ]                           (matching closebrace)
geomview-1.9.5/doc/geomview.html/window-objects.html0000644000175000017500000000667412310162311017452 00000000000000 window objects - Geomview Manual

4.3.6 window

A window object specifies size, position, and other window-system related information about a window in a device-independent way.

The syntax for a window object is:

     window ::=
     
             [ "window" ]                    (optional keyword)
               [ "{" ]                      (curly brace, often required)
     
                                     (any of the following, in any order)
     
                     "size"  <xsize> <ysize>
                                     (size of the window)
     
                     "position"  <xmin> <xmax> <ymin> <ymax>
                                     (position & size)
     
     
                     "noborder"
                                     (specifies the window should
                                      have no window border)
     
                     "pixelaspect"  <aspect>
                                 (specifies the true visual aspect ratio
                                  of a pixel in this window in the sense
                                  xsize/ysize, normally 1.0.
                                  For stereo hardware which stretches the
                                  display vertically by a factor of 2,
                                  ``pixelaspect 0.5'' might do.
                                  The value is used when computing the
                                  projection of a camera associated with
                                  this window.)
     
               [ "}" ]                      (matching closebrace)

Window objects are used in the Geomview window and ui-panel commands to set default properties for future windows or to change those of an existing window. See (window ...). See (ui-panel ...). geomview-1.9.5/doc/geomview.html/Customization.html0000644000175000017500000001025712310162311017354 00000000000000 Customization - Geomview Manual

Next: , Previous: OOGL File Formats, Up: Top


5 Customization: .geomview files

When Geomview is started, it loads and executes commands in a system-wide startup file named .geomview. This file is in the data subdirectory of the Geomview distribution directory and contains GCL commands to configure Geomview in a way common to all users on the system.

Next, Geomview looks for the file ~/.geomview (~ stands for your home directory). You can use this to configure your own default Geomview behavior to suit your tastes.

After reading ~/.geomview, Geomview looks for a file named .geomview in the current directory. If such a file exists Geomview reads it, unless it is the same as ~/.geomview (which would be the case if you are running Geomview from your home directory). You can use the current directory's .geomview to create a Geomview customization specific to a certain project.

You can use .geomview files to control all kinds of things about Geomview. They can contain any valid GCL statements. Especially useful is the ui-panel command which controls the initial placement of Geomview's panels. For an example see the system-wide .geomview file mentioned above. See GCL. See (ui-panel ...).

It is a good idea to enclose all the commands you put in a .geomview file in a progn statement in order to cause Geomview to execute them all at once. Otherwise Geomview might execute them sequentially over the first few refresh cycles after starting up.

To change, e.g. the focus policy of the camera window such that they pick up the focus policy of the window manager (instead of being activated when the mouse cursor crosses the window), you could put the following in your ~/.geomview file:

     (progn
       (ui-cam-focus focus-change)
       ... # other stuff
     )

You can put any valid GCL command into your .geomview files,see GCL. See (progn ...). See (ui-cam-focus ...). geomview-1.9.5/doc/geomview.html/Modules.html0000644000175000017500000000604212310162311016111 00000000000000 Modules - Geomview Manual

Next: , Previous: Customization, Up: Top


6 External Modules

An external module is a program that interacts with Geomview. A module communicates with Geomview through GCL and can control any apsect of Geomview that you can control through Geomview's user interface.

In many cases an external module is a specialized program that implements some mathematical algorithm that creates a geometric object that changes shape as the algorithm progresses. The module informs Geomview of the new object shape at each step, so the object appears to evolve with time in the Geomview window. In this way Geomview serves as a display engine for the module.

An external module may be interactive. It can respond to mouse and keyboard events that take place in a Geomview window, thus extending the capability of Geomview itself.

geomview-1.9.5/doc/geomview.html/Interface.html0000644000175000017500000000640412310162311016403 00000000000000 Interface - Geomview Manual

Next: , Previous: Modules, Up: Modules


6.1 How External Modules Interface with Geomview

External modules appear in the Modules browser in Geomview's Main panel. To run a module, click the left mouse button on the module's entry in the browser. While the module is running, an additional line for that module will appear in the browser. This line begins with a number in brackets, which indicates the instace number of the module. (For some modules it makes sense to have more than one instance of the module running at the same time.) You can kill an external module by clicking on its instance entry.

By default when Geomview starts, it displays all the modules that have been installed on your system.

For instructions on installing a module on your system so that it will appear in the Modules browser every time Geomview is run by anyone on your system, See Module Installation.

When Geomview invokes an external module, it creates pipes connected to the module's standard input and output. (Pipes are like files except they are used for communication between programs rather than for storing things on a disk.) Geomview interprets anything that the module writes to its standard output as a GCL command. Likewise, if the external module requests any data from Geomview, Geomview writes that data to the module's standard input. Thus all a module has to do in order to communicate with Geomview is write commands to standard output and (optionally) receive data on standard input. Note that this means that the module cannot use standard input and output for communicating with the user. If a module needs to communicate with the user it can do so either through a control panel of its own or else by responding to certain events that it finds out about from Geomview. geomview-1.9.5/doc/geomview.html/Example1.html0000644000175000017500000002331612310162311016160 00000000000000 Example1 - Geomview Manual

Next: , Previous: Interface, Up: Modules


6.2 Example 1: Simple External Module

This section gives a very simple external module which displays an oscillating mesh. To try out this example, make a copy of the file example1.c (it is distributed with Geomview in the doc subdirectory) in your directory and compile it with the command

     cc -o example1 example1.c -lm

Then put the line

     (emodule-define "Example 1" "./example1")

in a file called .geomview in your current directory. Then invoke Geomview; it is important that you compile the example program, create the .geomview file, and invoke Geomview all in the same directory. You should see "Example 1" in the Modules browser of Geomview's Main panel; click on this entry in the browser to start the module. A surface should appear in your camera window and should begin oscillating. You can stop the module by clicking on the "[1] Example 1" line in the Modules browser.

     
     /*
      * example1.c: oscillating mesh
      *
      * This example module is distributed with the Geomview manual.
      * If you are not reading this in the manual, see the "External
      * Modules" chapter of the manual for more details.
      *
      * This module creates an oscillating mesh.
      */
     
     #include <math.h>
     #include <stdio.h>
     
     /* F is the function that we plot
      */
     float F(x,y,t)
          float x,y,t;
     {
       float r = sqrt(x*x+y*y);
       return(sin(r + t)*sqrt(r));
     }
     
     main(argc, argv)
          char **argv;
     {
       int xdim, ydim;
       float xmin, xmax, ymin, ymax, dx, dy, t, dt;
     
       xmin = ymin = -5;             /* Set x and y            */
       xmax = ymax = 5;              /*    plot ranges         */
       xdim = ydim = 24;             /* Set x and y resolution */
       dt = 0.1;                     /* Time increment is 0.1  */
     
       /* Geomview setup.  We begin by sending the command
        *            (geometry example { : foo})
        * to Geomview.  This tells Geomview to create a geom called
        * "example" which is an instance of the handle "foo".
        */
       printf("(geometry example { : foo })\n");
       fflush(stdout);
     
       /* Loop until killed.
        */
       for (t=0; ; t+=dt) {
         UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t);
       }
     }
     
     /* UpdateMesh sends one mesh iteration to Geomview.  This consists of
      * a command of the form
      *    (read geometry { define foo
      *       MESH
      *       ...
      *    })
      * where ... is the actual data of the mesh.  This command tells
      * Geomview to make the value of the handle "foo" be the specified
      * mesh.
      */
     UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t)
          float xmin, xmax, ymin, ymax, t;
          int xdim, ydim;
     {
       int i,j;
       float x,y, dx,dy;
     
       dx = (xmax-xmin)/(xdim-1);
       dy = (ymax-ymin)/(ydim-1);
     
       printf("(read geometry { define foo \n");
       printf("MESH\n");
       printf("%1d %1d\n", xdim, ydim);
       for (j=0, y = ymin; j<ydim; ++j, y += dy) {
         for (i=0, x = xmin; i<xdim; ++i, x += dx) {
           printf("%f %f %f\t", x, y, F(x,y,t));
         }
         printf("\n");
       }
       printf("})\n");
       fflush(stdout);
     }
     

The module begins by defining a function F(x,y,t) that specifies a time-varying surface. The purpose of the module is to animate this surface over time.

The main program begins by defining some variables that specify the parameters with which the function is to be plotted.

The next bit of code in the main program prints the following line to standard output

     (geometry example { : foo })

This tells Geomview to create a geom called example which is an instance of the handle foo. Handles are a part of the OOGL file format which allow you to name a piece of geometry whose value can be specified elsewhere (and in this case updated many times); for more information on handles, See OOGL File Formats. In this case, example is the title by which the user will see the object in Geomview's object browser, and foo is the internal name of the handle that the object is a reference to.

We then do fflush(stdout) to ensure that Geomview receives this command immediately. In general, since pipes may be buffered, an external module should do this whenever it wants to be sure Geomview has actually received everything it has printed out.

The last thing in the main program is an infinite loop that cycles through calls to the procedure UpdateMesh with increasing values of t. UpdateMesh sends Geomview a command of the form

     (read geometry { define foo
     MESH
     24 24
     ...
     })

where ... is a long list of numbers. This command tells Geomview to make the value of the handle foo be the specified mesh. As soon as Geomview receives this command, the geom being displayed changes to reflect the new geometry.

The mesh is given in the format of an OOGL MESH. This begins with the keyword MESH. Next come two numbers that give the x and y dimensions of the mesh; in this case they are both 24. This line is followed by 24 lines, each containing 24 triples of numbers. Each of these triples is a point on the surface. Then finally there is a line with "})" on it that ends the "{" which began the define statement and the "(" that began the command. For more details on the format of MESH data, see MESH.

This module could be written without the use of handles by having it write out commands of the form

     (geometry example {
     MESH
     24 24
     ...
     })

This first time Geomview receives a command of this form it would create a geom called example with the given MESH data. Subsequent (geometry example ...) commands would cause Geomview to replace the geometry of the geom example with the new MESH data. If done in this way there would be no need to send the initial (geometry example { : foo }) command as above. The handle technique is useful, however, because it can be used in more general situations where a handle represents only part of a complex geom, allowing an external module to replace only that part without having to retransmit the entire geom. For more information on handles, see GCL. See References. See (hdefine ...). See (read ...).

The module loops through calls to UpdateMesh which print out commands of the above form one after the other as fast as possible. The loop continues indefinitely; the module will terminate when the user kills it by clicking on its instance line in the Modules browser, or else when Geomview exits.

Sometimes when you terminate this module by clicking on its instance entry the Modules browser, Geomview will kill it while it is in the middle of sending a command to Geomview. Geomview will then receive only a piece of a command and will print out a cryptic but harmless error message about this. When a module has a user interface panel it can use a "Quit" button to provide a more graceful way for the user to terminate the module. See the next example.

You can run this module in a shell window without Geomview to see the commands it prints out. You will have to kill it with ctrl-C to get it to stop. geomview-1.9.5/doc/geomview.html/Example2.html0000644000175000017500000002476512310162311016172 00000000000000 Example2 - Geomview Manual

Next: , Previous: Example1, Up: Modules


6.3 Example 2: Simple External Module with FORMS Control Panel

This section gives a new version of the above module — one that includes a user interface panel for controlling the velocity of the oscillation. We use the FORMS library by Mark Overmars for the control panel. The FORMS library is a public domain user interface toolkit for IRISes.

To try out this example, make a copy of the file example2.c (distributed with Geomview in the doc subdirectory) in your directory and compile it with the command

     cc -I/u/gcg/ngrap/include -o example2 example2.c \
       -L/u/gcg/ngrap/lib/sgi -lforms -lfm_s -lgl_s -lm

You should replace the string /u/gcg/ngrap above with the pathname of the Geomview distribution directory on your system. (The forms library is distributed with Geomview and the -I and -L options above tell the compiler where to find it.)

Then put the line

     (emodule-define "Example 2" "./example2")

in a file called .geomview in the current directory and invoke Geomview from that directory. Click on the "Example 2" entry in the Modules browser to invoke the module. A small control panel should appear. You can then control the velocity of the mesh oscillation by moving the slider.

     
     /*
      * example2.c: oscillating mesh with FORMS control panel
      *
      * This example module is distributed with the Geomview manual.
      * If you are not reading this in the manual, see the "External
      * Modules" chapter of the manual for an explanation.
      *
      * This module creates an oscillating mesh and has a FORMS control
      * panel that lets you change the speed of the oscillation with a
      * slider.
      */
     
     #include <math.h>
     #include <stdio.h>
     #include <sys/time.h>           /* for struct timeval below */
     
     #include "forms.h"              /* for FORMS library */
     
     FL_FORM *OurForm;
     FL_OBJECT *VelocitySlider;
     float dt;
     
     /* F is the function that we plot
      */
     float F(x,y,t)
          float x,y,t;
     {
       float r = sqrt(x*x+y*y);
       return(sin(r + t)*sqrt(r));
     }
     
     /* SetVelocity is the slider callback procedure; FORMS calls this
      * when the user moves the slider bar.
      */
     void SetVelocity(FL_OBJECT *obj, long val)
     {
       dt = fl_get_slider_value(VelocitySlider);
     }
     
     /* Quit is the "Quit" button callback procedure; FORMS calls this
      * when the user clicks the "Quit" button.
      */
     void Quit(FL_OBJECT *obj, long val)
     {
       exit(0);
     }
     
     /* create_form_OurForm() creates the FORMS panel by calling a bunch of
      * procedures in the FORMS library.  This code was generated
      * automatically by the FORMS designer program; normally this code
      * would be in a separate file which you would not edit by hand.  For
      * simplicity of this example, however, we include this code here.
      */
     create_form_OurForm()
     {
       FL_OBJECT *obj;
       FL_FORM *form;
       OurForm = form = fl_bgn_form(FL_NO_BOX,380.0,120.0);
       obj = fl_add_box(FL_UP_BOX,0.0,0.0,380.0,120.0,"");
       VelocitySlider = obj = fl_add_valslider(FL_HOR_SLIDER,20.0,30.0,
                                               340.0,40.0,"Velocity");
         fl_set_object_lsize(obj,FL_LARGE_FONT);
         fl_set_object_align(obj,FL_ALIGN_TOP);
         fl_set_call_back(obj,SetVelocity,0);
       obj = fl_add_button(FL_NORMAL_BUTTON,290.0,75.0,70.0,35.0,"Quit");
         fl_set_object_lsize(obj,FL_LARGE_FONT);
         fl_set_call_back(obj,Quit,0);
       fl_end_form();
     }
     
     main(argc, argv)
          char **argv;
     {
       int xdim, ydim;
       float xmin, xmax, ymin, ymax, dx, dy, t;
       int fdmask;
       static struct timeval timeout = {0, 200000};
     
       xmin = ymin = -5;             /* Set x and y            */
       xmax = ymax = 5;              /*    plot ranges         */
       xdim = ydim = 24;             /* Set x and y resolution */
       dt = 0.1;                     /* Time increment is 0.1  */
     
       /* Forms panel setup.
        */
       foreground();
       create_form_OurForm();
       fl_set_slider_bounds(VelocitySlider, 0.0, 1.0);
       fl_set_slider_value(VelocitySlider, dt);
       fl_show_form(OurForm, FL_PLACE_SIZE, TRUE, "Example 2");
     
     
       /* Geomview setup.
        */
       printf("(geometry example { : foo })\n");
       fflush(stdout);
     
       /* Loop until killed.
        */
       for (t=0; ; t+=dt) {
         fdmask = (1 << fileno(stdin)) | (1 << qgetfd());
         select(qgetfd()+1, &fdmask, NULL, NULL, &timeout);
         fl_check_forms();
         UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t);
       }
     }
     
     /* UpdateMesh sends one mesh iteration to Geomview
      */
     UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t)
          float xmin, xmax, ymin, ymax, t;
          int xdim, ydim;
     {
       int i,j;
       float x,y, dx,dy;
     
       dx = (xmax-xmin)/(xdim-1);
       dy = (ymax-ymin)/(ydim-1);
     
       printf("(read geometry { define foo \n");
       printf("MESH\n");
       printf("%1d %1d\n", xdim, ydim);
       for (j=0, y = ymin; j<ydim; ++j, y += dy) {
         for (i=0, x = xmin; i<xdim; ++i, x += dx) {
           printf("%f %f %f\t", x, y, F(x,y,t));
         }
         printf("\n");
       }
       printf("})\n");
       fflush(stdout);
     }
     

The code begins by including some header files needed for the event loop and the FORMS library. It then declares global variables for holding a pointer to the slider FORMS object and the velocity dt. These are global because they are needed in the slider callback procedure SetVelocity, which forms calls every time the user moves the slider bar. SetVelocity sets dt to be the new value of the slider.

Quit is the callback procedure for the Quit button; it provides a graceful way for the user to terminate the program.

The procedure create_panel calls a bunch of FORMS library procedures to set up the control panel with slider and button. For more information on using FORMS to create interface panels see the FORMS documentation. In particular, FORMS comes with a graphical panel designer that lets you design your panels interactively and generates code like that in create_panel.

This example's main program is similar to the previous example, but includes extra code to deal with setting up and managing the FORMS panel.

To set up the panel we call the GL procedure foreground to cause the process to run in the foreground. By default GL programs run in the background, and for various reasons external modules that use FORMS (which is based on GL) need to run in the foreground. We then call create_panel to create the panel and fl_set_slider_value to set the initial value of the slider. The call to fl_show_form causes the panel to appear on the screen.

The first three lines of the main loop, starting with

     fdmask = (1 << fileno(stdin)) | (1 << qgetfd());

check for and deal with events in the panel. The call to select imposes a delay on each pass through the main loop. This call returns either after a delay of 1/5 second or when the next GL event occurs, or when data appears on standard input, whichever comes first. The timeout variable specifies the amount of time to wait on this call; the first member (0 in this example) gives the number of seconds, and the second member (200000 in this example) gives the number of microseconds. Finally, fl_check_forms() checks for and processes any FORMS events that have happened; in this case this means calling SetVelocity if the user has moved the slider or calling Quit if the user has clicked on the Quit button.

The purpose of the delay in the loop is to keep the program from using excessive amounts of CPU time running around its main loop when there are no events to be processed. This is not so crucial in this example, and in fact may actually slow down the animation somewhat, but in general with external modules that have event loops it is important to do something like this because otherwise the module will needlessly take CPU cycles away from other running programs (such as Geomview!) even when it isn't doing anything.

The last line of the main loop in this example, the call to UpdateMesh, is the same as in the previous example. geomview-1.9.5/doc/geomview.html/XForms.html0000644000175000017500000000431212310162311015715 00000000000000 XForms - Geomview Manual

Next: , Previous: Example2, Up: Modules


6.4 The XForms Library

XForms is a handy and relatively simple user interface toolkit for X11. Many Geomview external modules, including the examples in this manual, use XForms to create and manage control panels. XForms is available from http://www.nongnu.org/xforms/. XForms is free-ware. If you wish you may use any other interface toolkit instead of XForms in an external module. We chose FORMS because it is free and relatively simple.

There is a complete autoconf'ed package ‘gvemod-xforms-example’ available from Geomview's Sourceforge.NET page. geomview-1.9.5/doc/geomview.html/Example3.html0000644000175000017500000006140412310162311016162 00000000000000 Example3 - Geomview Manual

Next: , Previous: XForms, Up: Modules


6.5 Example 3: External Module with Bi-Directional Communication

The previous two example modules simply send commands to Geomview and do not receive anything from Geomview. This section describes a module that communicates in both directions. There are two types of communication that can go from Geomview to an external module. This example shows asynchronous communication — the module needs to be able to respond at any moment to expressions that Geomview may emit which inform the module of some change of state within Geomview.

(The other type of communication is synchronous, where a module sends a request to Geomview for some piece of information and waits for a response to come back before doing anything else. The main GCL command for requesting information of this type is (write ...). This module does not do any synchronous communication.)

In ansynchronous communication, Geomview sends expressions that are essentially echoes of GCL commands. The external module sends Geomview a command expressing interest in a certain command, and then every time Geomview executes that command, the module receives a copy of it. This happens regardless of who sent the command to Geomview; it can be the result of the user doing something with a Geomview panel, or it may have come from another module or from a file that Geomview reads. This is how a module can find out about and act on things that happen in Geomview.

This example uses the OOGL lisp library to parse and act on the expressions that Geomview writes to the module's standard input. This library is actually part of Geomview itself — we wrote the library in the process of implementing GCL. It is also convenient to use it in external modules that must understand a of subset of GCL — specifically, those commands that the module has expressed interest in.

This example shows how a module can receive user pick events, i.e. when the user clicks the right mouse button with the cursor over a geom in a Geomview camera window. When this happens Geomview generates an internal call to a procedure called pick; the arguments to the procedure give information about the pick, such as what object was picked, the coordinates of the picked point, etc. If an external module has expressed interest in calls to pick, then whenever pick is called Geomview will echo the call to the module's standard input. The module can then do whatever it wants with the pick information.

This module is the same as the Nose module that comes with Geomview. Its purpose is to illustrate picking. Whenever you pick on a geom by clicking the right mouse button on it, the module draws a little box at the spot where you clicked. Usually the box is yellow. If you pick a vertex, the box is colored magenta. If you pick a point on an edge of an object, the module will also highlight the edge by drawing cyan boxes at its endpoints and drawing a yellow line along the edge.

Note that in order for this module to actually do anything you must have a geom loaded into Geomview and you must click the right mouse button with the cursor over a part of the geom.

     
     /*
      * example3.c: external module with bi-directional communication
      *
      * This example module is distributed with the Geomview manual.
      * If you are not reading this in the manual, see the "External
      * Modules" chapter of the manual for an explanation.
      *
      * This module is the same as the "Nose" program that is distributed
      * with Geomview.  It illustrates how a module can find out about
      * and respond to user pick events in Geomview.  It draws a little box
      * at the point where a pick occurrs.  The box is yellow if it is not
      * at a vertex, and magenta if it is on a vertex.  If it is on an edge,
      * the program also marks the edge.
      *
      * To compile:
      *
      *   cc -I/u/gcg/ngrap/include -g -o example3 example3.c \
      *      -L/u/gcg/ngrap/lib/sgi -loogl -lm
      *
      * You should replace "/u/gcg/ngrap" above with the pathname of the
      * Geomview distribution directory on your system.
      */
     
     #include <stdio.h>
     #include "lisp.h"               /* We use the OOGL lisp library */
     #include "pickfunc.h"           /* for PICKFUNC below */
     #include "3d.h"                 /* for 3d geometry library */
     
     /* boxstring gives the OOGL data to define the little box that
      * we draw at the pick point.  NOTE:  It is very important to
      * have a newline at the end of the OFF object in this string.
      */
     char boxstring[] = "\
     INST\n\
     transform\n\
     .04 0 0 0\n\
     0 .04 0 0\n\
     0 0 .04 0\n\
     0 0 0 1\n\
     geom\n\
     OFF\n\
     8 6 12\n\
     \n\
     -.5 -.5 -.5     # 0   \n\
     .5 -.5 -.5      # 1   \n\
     .5  .5 -.5      # 2   \n\
     -.5  .5 -.5     # 3   \n\
     -.5 -.5  .5     # 4   \n\
     .5 -.5  .5      # 5   \n\
     .5  .5  .5      # 6   \n\
     -.5  .5  .5     # 7   \n\
     \n\
     4 0 1 2 3\n\
     4 4 5 6 7\n\
     4 2 3 7 6\n\
     4 0 1 5 4\n\
     4 0 4 7 3\n\
     4 1 2 6 5\n";
     
     progn()
     {
       printf("(progn\n");
     }
     
     endprogn()
     {
       printf(")\n");
       fflush(stdout);
     }
     
     Initialize()
     {
       extern LObject *Lpick();  /* This is defined by PICKFUNC below but must */
                                 /* be used in the following LDefun() call */
       LInit();
       LDefun("pick", Lpick, NULL);
     
       progn(); {
         /* Define handle "littlebox" for use later
          */
         printf("(read geometry { define littlebox { %s }})\n", boxstring);
     
         /* Express interest in pick events; see Geomview manual for explanation.
          */
         printf("(interest (pick world * * * * nil nil nil nil nil))\n");
     
         /* Define "pick" object, initially the empty list (= null object).
          * We replace this later upon receiving a pick event.
          */
         printf("(geometry \"pick\" { LIST } )\n");
     
         /* Make the "pick" object be non-pickable.
          */
         printf("(pickable \"pick\" no)\n");
     
         /* Turn off normalization, so that our pick object will appear in the
          * right place.
          */
         printf("(normalization \"pick\" none)\n");
     
         /* Don't draw the pick object's bounding box.
          */
         printf("(bbox-draw \"pick\" off)\n");
     
       } endprogn();
     }
     
     /* The following is a macro call that defines a procedure called
      * Lpick().  The reason for doing this in a macro is that that macro
      * encapsulates a lot of necessary stuff that would be the same for
      * this procedure in any program.  If you write a Geomview module that
      * wants to know about user pick events you can just copy this macro
      * call and change the body to suit your needs; the body is the last
      * argument to the macro and is delimited by curly braces.
      *
      * The first argument to the macro is the name of the procedure to
      * be defined, "Lpick".
      *
      * The next two arguments are numbers which specify the sizes that
      * certain arrays inside the body of the procedure should have.
      * These arrays are used for storing the face and path information
      * of the picked object.  In this module we don't care about this
      * information so we declare them to have length 1, the minimum
      * allowed.
      *
      * The last argument is a block of code to be executed when the module
      * receives a pick event.  In this body you can refer to certain local
      * variables that hold information about the pick.  For details see
      * Example 3 in the Extenal Modules chapter of the Geomview manual.
      */
     PICKFUNC(Lpick, 1, 1,
     {
       handle_pick(pn>0, &point, vn>0, &vertex, en>0, edge);
     },
     /* version for picking Nd-objects (not documented here) */)
     
     handle_pick(picked, p, vert, v, edge, e)
          int picked;                /* was something actually picked?     */
          int vert;                  /* was the pick near a vertex?        */
          int edge;                  /* was the pick near an edge?         */
          HPoint3 *p;                /* coords of pick point               */
          HPoint3 *v;                /* coords of picked vertex            */
          HPoint3 e[2];              /* coords of endpoints of picked edge */
     {
       Normalize(&e[0]);             /* Normalize makes 4th coord 1.0 */
       Normalize(&e[1]);
       Normalize(p);
       progn(); {
         if (!picked) {
           printf("(geometry \"pick\" { LIST } )\n");
         } else {
           /*
            * Put the box in place, and color it magenta if it's on a vertex,
            * yellow if not.
            */
           printf("(xform-set pick { 1 0 0 0  0 1 0 0  0 0 1 0  %g %g %g 1 })\n",
                  p->x, p->y, p->z);
           printf("(geometry \"pick\"\n");
           if (vert) printf("{ appearance { material { diffuse 1 0 1 } }\n");
           else printf("{ appearance { material { diffuse 1 1 0 } }\n");
           printf("  { LIST { :littlebox }\n");
     
           /*
            * If it's on an edge and not a vertex, mark the edge
            * with cyan boxes at the endpoins and a black line
            * along the edge.
            */
           if (edge && !vert) {
             e[0].x -= p->x; e[0].y -= p->y; e[0].z -= p->z;
             e[1].x -= p->x; e[1].y -= p->y; e[1].z -= p->z;
             printf("{ appearance { material { diffuse 0 1 1 } }\n\
       LIST\n\
        { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\
        { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\
        { VECT\n\
               1 2 1\n\
               2\n\
               1\n\
               %f %f %f\n\
               %f %f %f\n\
               1 1 0 1\n\
        }\n\
       }\n",
                    e[0].x, e[0].y, e[0].z,
                    e[1].x, e[1].y, e[1].z,
                    e[0].x, e[0].y, e[0].z,
                    e[1].x, e[1].y, e[1].z);
           }
           printf("    }\n  }\n)\n");
         }
     
       } endprogn();
     
     }
     
     Normalize(HPoint3 *p)
     {
       if (p->w != 0) {
         p->x /= p->w;
         p->y /= p->w;
         p->z /= p->w;
         p->w = 1;
       }
     }
     
     main()
     {
       Lake *lake;
       LObject *lit, *val;
       extern char *getenv();
     
       Initialize();
     
       lake = LakeDefine(stdin, stdout, NULL);
       while (!feof(stdin)) {
     
         /* Parse next lisp expression from stdin.
          */
         lit = LSexpr(lake);
     
         /* Evaluate that expression; this is where Lpick() gets called.
          */
         val = LEval(lit);
     
         /* Free the two expressions from above.
          */
         LFree(lit);
         LFree(val);
       }
     }
     

The code begins by defining procedures progn() and endprogn() which begin and end a Geomview progn group. The purpose of the Geomview progn command is to group commands together and cause Geomview to execute them all at once, without refreshing any graphics windows until the end. It is a good idea to group blocks of commands that a module sends to Geomview like this so that the user sees their cumulative effect all at once.

Procedure Initialize() does various things needed at program startup time. It initializes the lisp library by calling LInit(). Any program that uses the lisp library should call this once before calling any other lisp library functions. It then calls LDefun to tell the library about our pick procedure, which is defined further down with a call to the PICKFUNC macro. Then it sends a bunch of setup commands to Geomview, grouped in a progn block. This includes defining a handle called littlebox that stores the geometry of the little box. Next it sends the command

     (interest (pick world * * * * nil nil nil nil nil))

which tells Geomview to notify us when a pick event happens.

The syntax of this interest statement merits some explanation. In general interest takes one argument which is a (parenthesized) expression representing a Geomview function call. It specifies a type of call that the module is interested in knowing about. The arguments can be any particular argument values, or the special symbols * or nil. For example, the first argument in the pick expression above is world. This means that the module is interested in calls to pick where the first argument, which specifies the coordinate system, is world. A * is like a wild-card; it means that the module is interested in calls where the corresponding argument has any value. The word nil is like *, except that the argument's value is not reported to the module. This is useful for cutting down on the amount of data that must be transmitted in cases where there are arguments that the module doesn't care about.

The second, third, fourth, and fifth arguments to the pick command give the name, pick point coordinates, vertex coordinates, and edge coordinates of a pick event. We specify these by *'s above. The remaining five arguments to the pick command give other information about the pick event that we do not care about in this module, so we specify these with nil's. For the details of the arguments to pick, See GCL.

The geometry statement defines a geom called pick that is initially an empty list, specified as { LIST } ; this is the best way of specifying a null geom. The module will replace this with something useful by sending Geomview another geometry command when the user picks something. Next we arrange for the pick object to be non-pickable, and turn normalization off for it so that Geomview will display it in the size and location where we put it, rather than resizing and relocating it to fit into the unit cube.

The next function in the file, Lpick, is defined with a strange looking call to a macro called PICKFUNC, defined in the header file pickfunc.h. This is the function for handling pick events. The reason we provide a macro for this is that that macro encapsulates a lot of necessary stuff that would be the same for the pick-handling function in any program. If you write a Geomview module that wants to know about user pick events you can just copy this macro call and change it to suit yours needs.

In general the syntax for PICKFUNC is

     PICKFUNC(name, block, NDblock)

where name is the name of the procedure to be defined, in this case Lpick. The next argument, block, is a block of code to be executed when a pick event occurs. If block contains a return statement, then the returned value must be a pointer to a Lisp-object, that is of type LObject *. The last argument has the same functionality as the block argument, but is only invoked when picking objects in a higher dimensional world.

PICKFUNC declares certain local variables in the body of the procedure. When the module receives a (pick ...) statement from Geomview, the procedure assigns values to these variables based on the information in the pick call (variables corresponding to nil's in the (interest (pick ...)) are not given values).

There is also a second variant of the PICKFUNC macro with a slightly different syntax:

     DEFPICKFUNC(helpstr, coordsys, id,
       point, pn, vertex, vn, edge, en, face, fn, ppath, ppn,
       vi, ei, ein, fi,
       body, NDbody)

DEFPICKFUNC can be used as well as PICKFUNC, there is no functional difference with the exception that the name of the C-function is tied to Lpick when using DEFPICKFUNC and that the (help pick) GCL-command (see (help ...)) would respond with echoing helpstr.

The table below lists all variables defined in PICKFUNC In the context of ND-viewing float variants of the arguments apply: the body execution block sees the HPoint3 variables, and the NDbody block sees only flat one-dimensional arrays of float-type.

In the ND-viewing context the co-ordinates passed to the pick function are still the 3-dimensional co-ordinates of the camera view-port where the pick occurred, but padded with zeroes on transformed back to the co-ordinate system specified by the second argument of the pick command.

char *coordsys;
A string specifying the coordinate system in which coordinates are given. In this example, this will always be world because of the interest call above.
char *id;
A string specifying the name of the picked geom.
HPoint3 point; int pn;
float *point; int pn;
point is an HPoint3 structure giving the coordinates of the picked point. HPoint3 is a homogeneous point coordinate representation equivalent to an array of 4 floats. pn tells how many coordinates have been written into this array; it will always be either 0, 4 or greater than 4. If it is greater than 4, then the NDbody instruction block is invoked and in this case point is a flat array of pn many floats. A value of zero means no point was picked, i.e. the user clicked the right mouse button while the cursor was not pointing at a geom. In this case the ordinary block 3d instruction block is executed.
HPoint3 vertex; int vn;
float *vertex; int vn;
vertex is an HPoint3 structure giving the coordinates of the picked vertex, if the pick point was near a vertex. vn tells how many coordinates have been written into this array; it will always be either 0 or greater equal 4. A value of zero means the pick point was not near a vertex. In the context of ND-viewing vertex will be an array of vn floats and vn will be equal to pn.
HPoint3 edge[2]; int en;
float *edge; int en;
edge is an array of two HPoint3 structures giving the coordinates of the endpoints of the picked edge, if the pick point was near an edge. en tells how many coordinates have been written into this array; it will always be 0 or greater equal 8. A value of zero means the pick point was not near an edge. In the context of ND-viewing edge will be a flat one-dimensional array of en many floats: the first pn floats define the first vertex, and the second pn many floats define the second vertex; en will be two times pn.

In this example module, the remaining variables will never be given values because their values in the interest statement were specified as nil.

HPoint3 face[]; int fn;
float *face; int fn;
face is a variable length array of fn HPoint3's. face gives the coordinates of the vertices of the picked face. fn tells how many coordinates have been written into this array; it will always be either 0 or a multiple of pn. A value of zero means the pick point was not near a face. In the context of ND-viewing face is a flat one-dimensional array of fn many floats of which each vertex occupies pn many components.
int ppath[]; int ppn;
ppath is an array of maxpathlen int's. ppath gives the path through the OOGL heirarchy to the picked primitive. pn tells how many integers have been written into this array; it will be at most maxpathlen. A path of {3,1,2}, for example, means that the picked primitive is "subobject number 2 of subobject number 1 of object 3 in the world".
int vi;
vi gives the index of the picked vertex in the picked primitive, if the pick point was near a vertex.
int ei[2]; int ein
The ei array gives the indices of the endpoints of the picked edge, if the pick point was near a vertex. ein tells how many integers were written into this array. It will always be either 0 or 2; a value of 0 means the pick point was not near an edge.
int fi;
fi gives the index of the picked face in the picked primitive, if the pick point was near a face.

The handle_pick procedure actually does the work of dealing with the pick event. It begins by normalizing the homogeneous coordinates passed in as arguments so that we can assume the fourth coordinate is 1. It then sends GCL commands to define the pick object to be whatever is appropriate for the kind of pick recieved. See see OOGL File Formats, and see GCL, for an explanation of the format of the data in these commands.

The main program, at the bottom of the file, first calls Initialize(). Next, the call to LakeDefine defines the Lake that the lisp library will use. A Lake is a structure that the lisp library uses internally as a type of communiation vehicle. (It is like a unix stream but more general, hence the name.) This call to LakeDefine defines a Lake structure for doing I/O with stdin and stdout. The third argument to LakeDefine should be NULL for external modules (it is used by Geomview). Finally, the program enters its main loop which parses and evaluates expressions from standard input. geomview-1.9.5/doc/geomview.html/Example4.html0000644000175000017500000001764312310162311016171 00000000000000 Example4 - Geomview Manual

Next: , Previous: Example3, Up: Modules


6.6 Example 4: Simple Tcl/Tk Module Demonstrating Picking

It's not necessary to write a Geomview module in C. The only requirement of an external module is that it send GCL commands to its standard output and expect responses (if any) on its standard input. An external module can be written in C, perl, tcl/tk, or pretty much anything.

As an example, assuming you have Tcl/Tk version 4.0 or later, here's an external module with a simple GUI which demonstrates interaction with geomview. This manual doesn't discuss the Tcl/Tk language; see the good book on the subject by its originator John Ousterhout, published by Addison-Wesley, titled Tcl and the Tk Toolkit.

The ‘#!’ on the script's first line causes the system to interpret the script using the Tcl/Tk ‘wish’ program; you might have to change its first line if that's in some location other than /usr/local/bin/wish4.0. Or, you could define it as a module using

       (emodule-define  "Pick Demo"  "wish pickdemo.tcl")

in which case ‘wish’ could be anywhere on the UNIX search path.

     #! /usr/local/bin/wish4.0
     
     # We use "fileevent" below to have "readsomething" be called whenever
     # data is available from standard input, i.e. when geomview has sent us
     # something.  It promises to include a trailing newline, so we can use
     # "gets" to read the geomview response, then parse its nested parentheses
     # into tcl-friendly {} braces.
     
     proc readsomething {} {
       if {[gets stdin line] < 0} {
             puts stderr "EOF on input, exiting..."
             exit
       }
       regsub -all {\(} $line "\{" line
       regsub -all {\)} $line "\}" line
       # Strip outermost set of braces
       set stuff [lindex $line 0]
       # Invoke handler for whichever command we got.  Could add others here,
       # if we asked geomview for other kinds of data as well.
       switch [lindex $stuff 0] {
             pick     {handlepick $stuff}
             rawevent {handlekey $stuff}
       }
     }
     
     # Fields of a "pick" response, from geomview manual:
     #     (pick COORDSYS GEOMID G V E F P VI EI FI)
     #          The pick command is executed internally in response to pick
     #          events (right mouse double click).
     #
     #          COORDSYS = coordinate system in which coordinates of the following
     #              arguments are specified.   This can be:
     #               world: world coord sys
     #               self:  coord sys of the picked geom (GEOMID)
     #               primitive: coord sys of the actual primitive within
     #                   the picked geom where the pick occurred.
     #          GEOMID = id of picked geom
     #          G = picked point (actual intersection of pick ray with object)
     #          V = picked vertex, if any
     #          E = picked edge, if any
     #          F = picked face
     #          P = path to picked primitive [0 or more]
     #          VI = index of picked vertex in primitive
     #          EI = list of indices of endpoints of picked edge, if any
     #          FI = index of picked face
     
     # Report when user picked something.
     #
     proc handlepick {pick} {
       global nameof selvert seledge order
       set obj [lindex $pick 2]
       set xyzw [lindex $pick 3]
       set fv [lindex $pick 6]
       set vi [lindex $pick 8]
       set ei [lindex $pick 9]
       set fi [lindex $pick 10]
     
       # Report result, converting 4-component homogeneous point into 3-space point.
       set w [lindex $xyzw 3]
       set x [expr [lindex $xyzw 0]/$w]
       set y [expr [lindex $xyzw 1]/$w]
       set z [expr [lindex $xyzw 2]/$w]
       set s "$x $y $z "
       if {$vi >= 0} {
             set s "$s  vertex #$vi"
       }
       if {$ei != {}} {
             set s "$s  edge [lindex $ei 0]-[lindex $ei 1]"
       }
       if {$fi != -1} {
             set s "$s  face #$fi ([expr [llength $fv]/3]-gon)"
       }
       msg $s
     }
     
     
     # Having asked for notification of these raw events, we report when
     # the user pressed these keys in the geomview graphics windows.
     
     proc handlekey {event} {
       global lastincr
       switch [lindex $event 1] {
         32 {msg "Pressed space bar"}
          8 {msg "Pressed backspace key"}
       }
     }
     
     
     #
     # Display a message on the control panel, and on the terminal where geomview
     # was started.  We use ``puts stderr ...'' rather than simply ``puts ...'',
     # since Geomview interprets anything we send to standard output
     # as a GCL command!
     #
     proc msg {str} {
       global msgtext
       puts stderr $str
       set msgtext $str
       update
     }
     
     # Load object from file
     proc loadobject {fname} {
       if {$fname != ""} {
             puts "(geometry thing < $fname)"
             # Be sure to flush output to ensure geomview receives this now!
             flush stdout
       }
     }
     
     
     # Build simple "user interface"
     
     # The message area could be a simple label rather than an entry box,
     # but we want to be able to use X selection to copy text from it.
     # The default mouse bindings do that automatically.
     
     entry .msg -textvariable msgtext -width 45
     pack .msg
     
     frame .f
     
       label .f.l -text "File to load:"
       pack .f.l -side left
     
       entry .f.ent -textvariable fname
       pack .f.ent -side left -expand true -fill x
       bind .f.ent <Return> { loadobject $fname }
     
     pack .f
     
     
     # End UI definition.
     
     
     # Call "readsomething" when data arrives from geomview.
     
     fileevent stdin readable {readsomething}
     
     # Geomview initialization
     
     puts {
             (interest (pick primitive))
             (interest (rawevent 32))        # Be notified when user presses space
             (interest (rawevent 8))         # or backspace keys.
             (geometry thing < hdodec.off)
             (normalization world none)
     }
     # Flush to ensure geomview receives this.
     flush stdout
     
     wm title . {Sample external module}
     
     msg "Click right mouse in graphics window"
geomview-1.9.5/doc/geomview.html/Module-Installation.html0000644000175000017500000000402312310162311020362 00000000000000 Module Installation - Geomview Manual

Previous: Example4, Up: Modules


6.7 Module Installation

This section tells how to install an external module so you can invoke it within Geomview. There are two ways to install a module: you can install a private module so that the module is available to you whenever you run Geomview, or you can install a system module so that the module is available to all users on your system whenever they run Geomview.

geomview-1.9.5/doc/geomview.html/Private-Module-Installation.html0000644000175000017500000000607212310162311022000 00000000000000 Private Module Installation - Geomview Manual

6.7.1 Private Module Installation

The emodule-define command arranges for a module to appear in Geomview's Modules browser. The command takes two string arguments; the first is the name that will appear in the Modules browser. The second is the shell command for running the module; it may include arguments (see (emodule-define ...)). Geomview executes this command in a subshell when you click on the module's entry in the browser. For example

     (emodule-define "Foo" "/u/home/modules/foo -x")

adds a line labeled "Foo" to the Modules browser which causes the command "/u/home/modules/foo -x" to be executed when selected.

You may put emodule-define commands in your ~/.geomview file to arrange for certain modules to be available every time you run Geomview; See Customization. You can also execute emodule-define commands from the Commands panel to add a module to an already running copy of Geomview.

There are several other GCL commands for controlling the entries in the Modules browser; for details, See GCL. geomview-1.9.5/doc/geomview.html/System-Module-Installation.html0000644000175000017500000000614612310162311021654 00000000000000 System Module Installation - Geomview Manual

6.7.2 System Module Installation

To install a module so that it is available to all Geomview users do the following

1.
Create a file called .geomview-module where module is the name of the module. This file should contain a single line which is an emodule-define command for that module:
          (emodule-define "New Module" "newmodule")

The first argument, "New Module" above, is the string that will appear in the Modules browser. The second string, "newmodule" above, is the Bourne shell command for invoking the module. It may include arguments, and you may assume that the module is on the $PATH searched by the shell.

2.
Put a copy of the .geomview-module and the module executable itself in /usr/local/libexec/geomview directory.

After these steps, the new module should appear, in alphabetical position, in the Modules browser of Geomview's Main panel next time Geomview is run. The reason this works is that when Geomview is invoked it processes all the .geomview-* files in its modules directory. It also remembers the pathname of this directory and prepends that path to the $PATH of the shell in which it invokes such a module. geomview-1.9.5/doc/geomview.html/GCL.html0000644000175000017500000001201012310162311015076 00000000000000 GCL - Geomview Manual

Next: , Previous: Modules, Up: Top


7 GCL: the Geomview Command Language

GCL has the syntax of lisp – i.e. an expression of the form (f a b ...) means pass the values of a, b, ... to the function f. GCL is very limited and is by no means an implementation of lisp. It is simply a language for expressing commands to be executed in the order given, rather than a programming language. It does not support variable or function definition.

GCL is the language that Geomview understands for files that it loads as well as for communication with other programs. To execute a GCL command interactively, you can bring up the Commands panel which lets you type in a command; Geomview executes the command when you hit the <Enter> key. Output from such commands is printed to standard output. Alternately, you can invoke Geomview as geomview -c - which causes it to read GCL commands from standard input.

GCL functions return a value, and you can nest function calls in ways which use this returned value. For example

     (f (g a b))

evaluates (g a b) and then evaluates (f x) where x is the result returned by (g a b). Geomview maintains these return values internally but does not normally print them out. To print out a return value pass it to the echo function. For example the geomview-version function returns a string representing the version of Geomview that is running, and

     (echo (geomview-version))

prints out this string.

Many functions simply return t for success or nil for failure; this is the case if the documentation for the function does not indicate otherwise. These are the lisp symbols for true and false, respectively. (They correspond to the C variables Lt and Lnil which you are likely to see if you look at the source code for Geomview or some of the external modules.)

In the descriptions of the commands below several references are made to "OOGL" formats. OOGL is the data description language that Geomview uses for describing geometry, cameras, appearances, and other basic objects. For details of the OOGL formats, See OOGL File Formats. (Or equivalently, see the oogl(5) manual page, distributed with Geomview in the file /share/man/man5/oogl.5gv.

The GCL commands and argument types are listed below. Most of the documentation in this section of the manual is available within Geomview via the ? and ?? commands. The command (? command) causes Geomview to print out a one-line summary of the syntax of command, and (?? command) prints out an explanation of what command does. You can include the wild-card character * in command to print information for a group of commands matching a pattern. For example, (?? *emodule*) will print all information about all commands containing the string emodule. (? *) will print a short list of all commands.

geomview-1.9.5/doc/geomview.html/Argument-Conventions.html0000644000175000017500000001101412310162311020561 00000000000000 Argument Conventions - Geomview Manual

Next: , Previous: GCL, Up: GCL


7.1 Conventions Used In Describing Argument Types

The following symbols are used to describe argument types in the documentation for GCL functions.

appearance
is an OOGL appearance specification.
cam-id
is an id that refers to a camera.
camera
is an OOGL camera specification.
geom-id
is an id that refers to a geometry.
geometry
is an OOGL geometry specification.
id
is a string which names a geometry or camera. Besides those you create, valid ones are:
World, world, worldgeom, g0
the collection of all geom's
target
selected target object (cam or geom)
center
selected center-of-motion object
targetcam
last selected target camera
targetgeom
last selected target geom
focus
camera where cursor is (or most recently was)
allgeoms
all geom objects
allcams
all cameras
default, defaultcam, prototype
future cameras inherit default's settings

The following ids are used to name coordinate systems, e.g. in pick and write commands:

World, world, worldgeom, g0
the world, within which all other geoms live.
universe
the universe, in which the World, lights and cameras live. Cameras' world2cam transforms might better be called universe2cam, etc.
self
"this Geomview object". Transform from an object to self is the identity; writing its geometry gives the object itself with no enclosing transform; picked points appear in the object's coordinates.
primitive
(for pick only) Picked points appear in the coordinate system of the lowest-level OOGL primitive.

A name is also an acceptable id. Given names are made unique by appending numbers if necessary (i.e. foo<2>). Every geom is also named g[n] and every camera is also named c[n] (g0 is always the worldgeom): this name is used as a prefix to keyboard commands and can also be used as a GCL id. Numbers are reused after an object is deleted. Both names are shown in the Object browser.

statement
represents a function call. Function calls have the form (func arg1 arg2 ... ), where func is the name of the function and arg1, arg2, ... are the arguments.
transform
is an OOGL 4x4 transformation matrix.
ntransform
is an OOGL (N+1)x(N+1) transformation matrix.
window
is an OOGL window specification.
geomview-1.9.5/doc/geomview.html/GCL-Reference.html0000644000175000017500000005065612310162311017014 00000000000000 GCL Reference - Geomview Manual

Previous: Argument Conventions, Up: GCL


7.2 GCL Reference Guide

geomview-1.9.5/doc/geomview.html/shell_002dshortcut.html0000644000175000017500000000334312310162311020132 00000000000000 shell-shortcut - Geomview Manual

Next: , Previous: GCL Reference, Up: GCL Reference


7.2.1 !

!
is a synonym for shell. See shell.
geomview-1.9.5/doc/geomview.html/lt.html0000644000175000017500000000330512310162311015117 00000000000000 lt - Geomview Manual

Next: , Previous: shell-shortcut, Up: GCL Reference


7.2.2 <

(< EXPR1 EXPR2)
Returns t if EXPR1 is less than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.
geomview-1.9.5/doc/geomview.html/eq.html0000644000175000017500000000314612310162311015110 00000000000000 eq - Geomview Manual

Next: , Previous: lt, Up: GCL Reference


7.2.3 =

(= EXPR1 EXPR2)
Returns t if EXPR1 is equal to EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.
geomview-1.9.5/doc/geomview.html/gt.html0000644000175000017500000000316612310162311015117 00000000000000 gt - Geomview Manual

Next: , Previous: eq, Up: GCL Reference


7.2.4 >

(> EXPR1 EXPR2)
Returns t if EXPR1 is greater than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.
geomview-1.9.5/doc/geomview.html/mul.html0000644000175000017500000000310512310162311015273 00000000000000 mul - Geomview Manual

Next: , Previous: gt, Up: GCL Reference


7.2.5 *

(* EXPR1 EXPR2)
Multiplies EXPR1 and EXPR2 and returns the result.
geomview-1.9.5/doc/geomview.html/div.html0000644000175000017500000000310712310162311015262 00000000000000 div - Geomview Manual

Next: , Previous: mul, Up: GCL Reference


7.2.6 /

(/ EXPR1 EXPR2)
Divides EXPR1 by EXPR2 and returns the result.
geomview-1.9.5/doc/geomview.html/add.html0000644000175000017500000000310512310162311015226 00000000000000 add - Geomview Manual

Next: , Previous: div, Up: GCL Reference


7.2.7 +

(+ EXPR1 EXPR2)
Adds EXPR1 and EXPR2 and returns the result.
geomview-1.9.5/doc/geomview.html/sub.html0000644000175000017500000000323012310162311015266 00000000000000 sub - Geomview Manual

Next: , Previous: add, Up: GCL Reference


7.2.8 -

(- EXPR1 EXPR2)
Substracts EXPR2 from EXPR1 and returns the result.
geomview-1.9.5/doc/geomview.html/help_002dshortcut.html0000644000175000017500000000374412310162311017760 00000000000000 help-shortcut - Geomview Manual

Next: , Previous: sub, Up: GCL Reference


7.2.9 ?

(? [command])
Gives one-line usage summary for command. Command may include *s as wildcards; see also (?? ...). One-line command help; lists names only if multiple commands match. ? is a synonym for (help ...)
geomview-1.9.5/doc/geomview.html/morehelp_002dshortcut.html0000644000175000017500000000374312310162311020642 00000000000000 morehelp-shortcut - Geomview Manual

7.2.10 ??

(?? command)
command may include * wildcards. Prints more info than (? command). ?? is a synonym for morehelp.
geomview-1.9.5/doc/geomview.html/emodule_002drun_002dshortcut.html0000644000175000017500000000345112310162311021727 00000000000000 emodule-run-shortcut - Geomview Manual

Next: , Previous: morehelp-shortcut, Up: GCL Reference


7.2.11 |

|
| is a synonym for emodule-run.
geomview-1.9.5/doc/geomview.html/all.html0000644000175000017500000000431312310162311015250 00000000000000 all - Geomview Manual

Next: , Previous: emodule-run-shortcut, Up: GCL Reference


7.2.12 all

(all geometry)
returns a list of names of all geometry objects. Use e.g. ‘(echo (all geometry))’ to print such a list.
(all camera)
returns a list of names of all cameras.
(all emodule defined)
returns a list of all defined external modules.
(all emodule running)
returns a list of all running external modules.
geomview-1.9.5/doc/geomview.html/and.html0000644000175000017500000000333012310162311015240 00000000000000 and - Geomview Manual

Next: , Previous: all, Up: GCL Reference


7.2.13 and

(and EXPR1 EXPR2)
Evaluate EXPR1 and EXPR2 and return t if both return non-nil, otherwise return nil.
geomview-1.9.5/doc/geomview.html/ap_002doverride.html0000644000175000017500000000336712310162311017375 00000000000000 ap-override - Geomview Manual

Next: , Previous: and, Up: GCL Reference


7.2.14 ap-override

(ap-override [on|off])
Selects whether appearance controls should override objects' own settings. On by default. With no arguments, returns current setting.
geomview-1.9.5/doc/geomview.html/backcolor.html0000644000175000017500000000340712310162311016442 00000000000000 backcolor - Geomview Manual

Next: , Previous: ap-override, Up: GCL Reference


7.2.15 backcolor

(backcolor CAM-ID R G B)
Set the background color of CAM-ID; R G B are numbers between 0 and 1.
geomview-1.9.5/doc/geomview.html/background_002dimage.html0000644000175000017500000000417112310162311020351 00000000000000 background-image - Geomview Manual

Next: , Previous: backcolor, Up: GCL Reference


7.2.16 background-image

(background-image CAM-ID [FILENAME])
Use the given image as the background of camera CAM-ID (which must be a real camera, not default or allcams). Centers the image on the window area. Works only with GL and OpenGL graphics. Use "" for filename to remove background. With no filename argument, returns name of that window's current background image, or "". Any file type acceptable as a texture is allowed, e.g. .ppm.gz, .sgi, etc.
geomview-1.9.5/doc/geomview.html/bbox_002dcolor.html0000644000175000017500000000344612310162311017224 00000000000000 bbox-color - Geomview Manual

Next: , Previous: background-image, Up: GCL Reference


7.2.17 bbox-color

(bbox-color GEOM-ID R G B)
Set the bounding-box color of GEOM-ID; R G B are numbers between 0 and 1.
geomview-1.9.5/doc/geomview.html/bbox_002ddraw.html0000644000175000017500000000340312310162311017034 00000000000000 bbox-draw - Geomview Manual

Next: , Previous: bbox-color, Up: GCL Reference


7.2.18 bbox-draw

(bbox-draw GEOM-ID [yes|no])
Say whether GEOM-ID's bounding-box should be drawn; defaults to yes if second argument is omitted.
geomview-1.9.5/doc/geomview.html/camera.html0000644000175000017500000000372612310162311015737 00000000000000 camera - Geomview Manual

Next: , Previous: bbox-draw, Up: GCL Reference


7.2.19 camera

(camera CAM-ID [CAMERA])
Specify data for CAM-ID; CAMERA is a string giving an OOGL camera specification. If no camera CAM-ID exists, it is created; in this case, the second argument is optional, and if omitted, a default camera is used. See (new-camera ...).
geomview-1.9.5/doc/geomview.html/camera_002ddraw.html0000644000175000017500000000336712310162311017343 00000000000000 camera-draw - Geomview Manual

Next: , Previous: camera, Up: GCL Reference


7.2.20 camera-draw

(camera-draw CAM-ID [yes|no])
Say whether or not cameras should be drawn in CAM-ID; yes if omitted.
geomview-1.9.5/doc/geomview.html/camera_002dprop.html0000644000175000017500000000425412310162311017362 00000000000000 camera-prop - Geomview Manual

Next: , Previous: camera-draw, Up: GCL Reference


7.2.21 camera-prop

(camera-prop { geometry object } [projective])
Specify the object to be shown when drawing other cameras. By default, this object is drawn with its origin at the camera, and with the camera looking toward the object's -Z axis. With the projective keyword, the camera's viewing projection is also applied to the object; this places the object's Z=-1 and Z=+1 at near and far clipping planes, with the viewing area -1<={X,Y}<=+1. Example: (camera-prop { < cube } projective)
geomview-1.9.5/doc/geomview.html/camera_002dreset.html0000644000175000017500000000326212310162311017522 00000000000000 camera-reset - Geomview Manual

Next: , Previous: camera-prop, Up: GCL Reference


7.2.22 camera-reset

(camera-reset CAM-ID)
Reset CAM-ID to its default value.
geomview-1.9.5/doc/geomview.html/car.html0000644000175000017500000000314512310162311015247 00000000000000 car - Geomview Manual

Next: , Previous: camera-reset, Up: GCL Reference


7.2.23 car

(car LIST)
returns the first element of LIST.
geomview-1.9.5/doc/geomview.html/cdr.html0000644000175000017500000000311112310162311015243 00000000000000 cdr - Geomview Manual

Next: , Previous: car, Up: GCL Reference


7.2.24 cdr

(cdr LIST)
returns the list obtained by removing the first element of LIST.
geomview-1.9.5/doc/geomview.html/clock.html0000644000175000017500000000341112310162311015571 00000000000000 clock - Geomview Manual

Next: , Previous: cdr, Up: GCL Reference


7.2.25 clock

(clock)
Returns the current time, in seconds, as shown by this stream's clock. See (set-clock ...). See (sleep-until ...).
geomview-1.9.5/doc/geomview.html/command.html0000644000175000017500000000327012310162311016117 00000000000000 command - Geomview Manual

Next: , Previous: clock, Up: GCL Reference


7.2.26 command

(command INFILE [OUTFILE])
Read commands from INFILE; send corresponding responses (e.g. anything written to filename -) to OUTFILE, stdout by default.
geomview-1.9.5/doc/geomview.html/cons.html0000644000175000017500000000325512310162311015446 00000000000000 cons - Geomview Manual

Next: , Previous: command, Up: GCL Reference


7.2.27 cons

(cons EXPR LIST)
Returns the list obtained by adding EXPR as first element of LIST. Note that the second argument has to be a list.
geomview-1.9.5/doc/geomview.html/copy.html0000644000175000017500000000336412310162311015457 00000000000000 copy - Geomview Manual

Next: , Previous: cons, Up: GCL Reference


7.2.28 copy

(copy [ID] [name])
Copies an object or camera. If ID is not specified, it is assumed to be targetgeom. If name is not specified, it is assumed to be the same as the name of ID.
geomview-1.9.5/doc/geomview.html/cursor_002dstill.html0000644000175000017500000000350312310162311017612 00000000000000 cursor-still - Geomview Manual

Next: , Previous: copy, Up: GCL Reference


7.2.29 cursor-still

(cursor-still [INT])
Sets the number of microseconds for which the cursor must not move to register as holding still. If INT is not specified, the value will be reset to the default.
geomview-1.9.5/doc/geomview.html/cursor_002dtwitch.html0000644000175000017500000000350312310162311017765 00000000000000 cursor-twitch - Geomview Manual

Next: , Previous: cursor-still, Up: GCL Reference


7.2.30 cursor-twitch

(cursor-twitch [INT])
Sets the distance which the cursor must not move (in x or y) to register as holding still. If INT is not specified, the value will be reset to the default.
geomview-1.9.5/doc/geomview.html/defun.html0000644000175000017500000000553612310162311015611 00000000000000 defun - Geomview Manual

Next: , Previous: cursor-twitch, Up: GCL Reference


7.2.31 defun

(defun NAME (ARG1 ...) [DOCSTRING] EXPR1 ...)
Define a named lambda-expression, that is: define NAME to evaluate to the lambda-expression (lambda (ARG1 ...) (EXPR1 ...)) when called as a function. Also, install DOCSTRING as response to the commands (help NAME) and (morehelp NAME). Note that DOCSTRING need not contain the command-synopsis, it is generated automatically. EXPR1 cannot be a string if DOCSTRING is omitted; it would be interpreted as the doc-string. The return value of (defun ...) is the function name. Functions can be recursive and self-modifying. It is possible to redefine builtin-functions, in this case the old definition is still available under the name -builtin-OLDNAME-. Argument values may be altered by setq; the new binding is discarded after evaluation of the surrounding defun-body. The special keywords &optional and &rest have the same meaning as for anonymous lambda-expression, see there. See (lambda ...). See (setq ...). See (let ...).
geomview-1.9.5/doc/geomview.html/delete.html0000644000175000017500000000306712310162311015747 00000000000000 delete - Geomview Manual

Next: , Previous: defun, Up: GCL Reference


7.2.32 delete

(delete ID)
Delete object or camera ID.
geomview-1.9.5/doc/geomview.html/dice.html0000644000175000017500000000342312310162311015405 00000000000000 dice - Geomview Manual

Next: , Previous: delete, Up: GCL Reference


7.2.33 dice

(dice GEOM-ID N)
Dice any Bezier patches within GEOM-ID into NxN meshes; default 10. See also the appearance attribute patchdice, which makes this command obsolete.
geomview-1.9.5/doc/geomview.html/dimension.html0000644000175000017500000000347012310162311016470 00000000000000 dimension - Geomview Manual

Next: , Previous: dice, Up: GCL Reference


7.2.34 dimension

(dimension [N])
Sets or reads the space dimension for N-dimensional viewing. (Since calculations are done using homogeneous coordinates, this means matrices are (N+1)x(N+1).) With no arguments, returns the current dimension, or 0 if N-dimensional viewing has not been enabled.
geomview-1.9.5/doc/geomview.html/dither.html0000644000175000017500000000316012310162311015756 00000000000000 dither - Geomview Manual

Next: , Previous: dimension, Up: GCL Reference


7.2.35 dither

(dither CAM-ID {on|off|toggle})
Turn dithering on or off in that camera.
geomview-1.9.5/doc/geomview.html/draw.html0000644000175000017500000000331312310162311015434 00000000000000 draw - Geomview Manual

Next: , Previous: dither, Up: GCL Reference


7.2.36 draw

(draw CAM-ID)
Draw the view in CAM-ID, if it needs redrawing. See (redraw ...).
geomview-1.9.5/doc/geomview.html/dump_002dhandles.html0000644000175000017500000000330412310162311017530 00000000000000 dump-handles - Geomview Manual

Next: , Previous: draw, Up: GCL Reference


7.2.37 dump-handles

(dump-handles)
Dump the list of currently active handles to stdout. This function is intended for internal debugging use only.
geomview-1.9.5/doc/geomview.html/echo.html0000644000175000017500000000371112310162311015417 00000000000000 echo - Geomview Manual

Next: , Previous: dump-handles, Up: GCL Reference


7.2.38 echo

(echo ...)
Write the given data to the special file -. Strings are written literally; lisp expressions are evaluated and their values written. If received from an external program, echo sends to the program's input. Otherwise writes to geomview's own standard output (typically the terminal).
geomview-1.9.5/doc/geomview.html/emodule_002dclear.html0000644000175000017500000000334112310162311017666 00000000000000 emodule-clear - Geomview Manual

Next: , Previous: echo, Up: GCL Reference


7.2.39 emodule-clear

(emodule-clear)
Clears the geomview application (external module) browser.
geomview-1.9.5/doc/geomview.html/emodule_002ddefine.html0000644000175000017500000000406012310162311020031 00000000000000 emodule-define - Geomview Manual

Next: , Previous: emodule-clear, Up: GCL Reference


7.2.40 emodule-define

(emodule-define NAME SHELL-COMMAND ...)
Define an external module called NAME, which then appears in the external-module browser. The SHELL-COMMAND string is a UNIX shell command which invokes the module. See (emodule-run ...) for discussion of external modules.
geomview-1.9.5/doc/geomview.html/emodule_002ddefined.html0000644000175000017500000000374712310162311020210 00000000000000 emodule-defined - Geomview Manual

7.2.41 emodule-defined

(emodule-defined modulename)
If the given external-module name is known, returns the name of the program invoked when it's run as a quoted string; otherwise returns nil. (echo (emodule-defined name)) prints the string.
geomview-1.9.5/doc/geomview.html/emodule_002disrunning.html0000644000175000017500000000375512310162311020625 00000000000000 emodule-isrunning - Geomview Manual

Next: , Previous: emodule-defined, Up: GCL Reference


7.2.42 emodule-isrunning

(emodule-isrunning NAME)
Returns Lt if the emodule NAME is running, or Lnil if it is not running. NAME is searched for in the names as they appear in the browser and in the shell commands used to execute the external modules (not including arguments).
geomview-1.9.5/doc/geomview.html/emodule_002dpath.html0000644000175000017500000000402612310162311017535 00000000000000 emodule-path - Geomview Manual

Next: , Previous: emodule-isrunning, Up: GCL Reference


7.2.43 emodule-path

(emodule-path)
Returns the current search path for external modules. Note: to actually see the value returned by this function you should wrap it in a call to echo: (echo (emodule-path)). See (set-emodule-path ...).
geomview-1.9.5/doc/geomview.html/emodule_002drun.html0000644000175000017500000000561212310162311017407 00000000000000 emodule-run - Geomview Manual

Next: , Previous: emodule-path, Up: GCL Reference


7.2.44 emodule-run

(emodule-run SHELL-COMMAND ARGS...)
Runs the given SHELL-COMMAND (a string containing a UNIX shell command) as an external module. The module's standard output is taken as geomview commands; responses (written to filename -) are sent to the module's standard input. The shell command is interpreted by /bin/sh, so e.g. I/O redirection may be used; a program which prompts the user for input from the terminal could be run with:
            (emodule-run  yourprogram  <&2)

If not already set, the environment variable $MACHTYPE is set to the name of the machine type. Input and output connections to geomview are dropped when the shell command terminates. Clicking on a running program's module-browser entry sends the signal SIGHUP to the program. For this to work, programs should avoid running in the background; those using FORMS or GL should call foreground() before the first FORMS or winopen() call. See (emodule-define ...). See (emodule-start ...).

geomview-1.9.5/doc/geomview.html/emodule_002dsort.html0000644000175000017500000000342112310162311017566 00000000000000 emodule-sort - Geomview Manual

Next: , Previous: emodule-run, Up: GCL Reference


7.2.45 emodule-sort

(emodule-sort)
Sorts the modules in the application browser alphabetically.
geomview-1.9.5/doc/geomview.html/emodule_002dstart.html0000644000175000017500000000356612310162311017746 00000000000000 emodule-start - Geomview Manual

Next: , Previous: emodule-sort, Up: GCL Reference


7.2.46 emodule-start

(emodule-start NAME)
Starts the external module NAME, defined by emodule-define. Equivalent to clicking on the corresponding module-browser entry.
geomview-1.9.5/doc/geomview.html/emodule_002dtransmit.html0000644000175000017500000000372712310162311020451 00000000000000 emodule-transmit - Geomview Manual

Next: , Previous: emodule-start, Up: GCL Reference


7.2.47 emodule-transmit

(emodule-transmit NAME LIST)
Places LIST into external module NAME's standard input. NAME is searched for in the names of the modules as they appear in the External Modules browser and then in the shell commands used to execute the external modules. Does nothing if the module NAME is not running.
geomview-1.9.5/doc/geomview.html/escale.html0000644000175000017500000000326012310162311015734 00000000000000 escale - Geomview Manual

Next: , Previous: emodule-transmit, Up: GCL Reference


7.2.48 escale

(escale GEOM-ID FACTOR)
Same as scale but multiplies by exp(scale). Obsolete.
geomview-1.9.5/doc/geomview.html/eval.html0000644000175000017500000000407012310162311015427 00000000000000 eval - Geomview Manual

Next: , Previous: escale, Up: GCL Reference


7.2.49 eval

(eval EXPR)
Evaluate a lisp expression. If EXPR is an unevaluated S-expression as returned by the (quote ...) command then the effect will be as if calling the un-quoted expression directly. It is also possible to evaluate S-expression constructed via car, cdr and cons. See (car ...). See (cdr ...). See (cons ...).
geomview-1.9.5/doc/geomview.html/event_002dkeys.html0000644000175000017500000000331212310162311017240 00000000000000 event-keys - Geomview Manual

Next: , Previous: eval, Up: GCL Reference


7.2.50 event-keys

(event-keys {on|off})
Turn keyboard events on or off to enable/disable keyboard shortcuts.
geomview-1.9.5/doc/geomview.html/event_002dmode.html0000644000175000017500000000404312310162311017213 00000000000000 event-mode - Geomview Manual

Next: , Previous: event-keys, Up: GCL Reference


7.2.51 event-mode

(event-mode MODESTRING)
Set the mouse event (motion) mode; MODESTRING should be one of the following strings:
  1. "[r] Rotate"
  2. "[t] Translate"
  3. "[z] Cam Zoom"
  4. "[s] Geom Scale"
  5. "[f] Cam Fly"
  6. "[o] Cam Orbit"
  7. "[le] Edit Lights"
geomview-1.9.5/doc/geomview.html/event_002dpick.html0000644000175000017500000000324312310162311017216 00000000000000 event-pick - Geomview Manual

Next: , Previous: event-mode, Up: GCL Reference


7.2.52 event-pick

(event-pick {on|off})
Turn picking on or off.
geomview-1.9.5/doc/geomview.html/evert.html0000644000175000017500000000327312310162311015631 00000000000000 evert - Geomview Manual

Next: , Previous: event-pick, Up: GCL Reference


7.2.53 evert

(evert GEOM-ID [yes|no])
Set the normal eversion state of GEOM-ID. If the second argument is omitted, toggle the eversion state.
geomview-1.9.5/doc/geomview.html/exit.html0000644000175000017500000000305112310162311015447 00000000000000 exit - Geomview Manual

Next: , Previous: evert, Up: GCL Reference


7.2.54 exit

(exit)
Terminates geomview.
geomview-1.9.5/doc/geomview.html/ezoom.html0000644000175000017500000000313512310162311015632 00000000000000 ezoom - Geomview Manual

Next: , Previous: exit, Up: GCL Reference


7.2.55 ezoom

(ezoom GEOM-ID FACTOR)
Same as zoom but multiplies by exp(zoom). Obsolete.
geomview-1.9.5/doc/geomview.html/freeze.html0000644000175000017500000000334212310162311015761 00000000000000 freeze - Geomview Manual

Next: , Previous: ezoom, Up: GCL Reference


7.2.56 freeze

(freeze CAM-ID)
Freeze CAM-ID; drawing in this camera's window is turned off until it is explicitly redrawn with (redraw CAM-ID), after which time drawing resumes as normal.
geomview-1.9.5/doc/geomview.html/geometry.html0000644000175000017500000000363112310162311016335 00000000000000 geometry - Geomview Manual

Next: , Previous: freeze, Up: GCL Reference


7.2.57 geometry

(geometry GEOM-ID [GEOMETRY])
Specify the geometry for GEOM-ID. GEOMETRY is a string giving an OOGL geometry specification. If no object called GEOM-ID exists, it is created; in this case the GEOMETRY argument is optional, and if omitted, the new object GEOM-ID is given an empty geometry.
geomview-1.9.5/doc/geomview.html/geomview_002dversion.html0000644000175000017500000000333512310162311020460 00000000000000 geomview-version - Geomview Manual

Next: , Previous: geometry, Up: GCL Reference


7.2.58 geomview-version

(geomview-version)
Returns a string representing the version of geomview that is running.
geomview-1.9.5/doc/geomview.html/hdefine.html0000644000175000017500000000455612310162311016113 00000000000000 hdefine - Geomview Manual

Next: , Previous: geomview-version, Up: GCL Reference


7.2.59 hdefine

(hdefine geometry|camera|window|appearance|image|transform|ntransform name value)
Sets the value of a handle of a given type.
            (hdefine  <type>  <name>  <value>)

is generally equivalent to

            (read <type>  { define <name> <value> })

except that the assignment is done when hdefine is executed, (possibly not at all if inside a conditional statement), while the read ... define performs assignment as soon as the text is read. See References. See (read ...). See (hdelete ...).

geomview-1.9.5/doc/geomview.html/hdelete.html0000644000175000017500000000502112310162311016107 00000000000000 hdelete - Geomview Manual

Next: , Previous: hdefine, Up: GCL Reference


7.2.60 hdelete

(hdelete [geometry|camera|window|appearance|image|transform|ntransform] name)
Deletes the given handle. Note that the handle will not actually be deleted in case there are still other objects referring to the handle, but once those objects are gone, the handle will also automatically go away. The object the handle referes to (if any) will only be deleted if there are no other references to that object.

If the optional first argument is omitted, then the first handle matching name will be deleted, regardless of the type of the object it is attached to. It is not an error to call this function with a non-existent handle, but it is an error to call this funcion with the name of a non-global handle, i.e. one that was not created by (hdefine ...) or (read ... { define ...}). See References. See (read ...). See (hdefine ...).

geomview-1.9.5/doc/geomview.html/help.html0000644000175000017500000000334312310162311015432 00000000000000 help - Geomview Manual

Next: , Previous: hdelete, Up: GCL Reference


7.2.61 help

(help [command])
Command may include *s as wildcards; see also (?? ...) One-line command help; lists names only if multiple commands match.
geomview-1.9.5/doc/geomview.html/hmodel.html0000644000175000017500000000335312310162311015753 00000000000000 hmodel - Geomview Manual

Next: , Previous: help, Up: GCL Reference


7.2.62 hmodel

(hmodel CAMID {virtual|projective|conformal})
Set the model used to display geometry in this camera. See (space ...).
geomview-1.9.5/doc/geomview.html/hsphere_002ddraw.html0000644000175000017500000000345512310162311017547 00000000000000 hsphere-draw - Geomview Manual

Next: , Previous: hmodel, Up: GCL Reference


7.2.63 hsphere-draw

(hsphere-draw CAMID [yes|no])
Say whether to draw a unit sphere: the sphere at infinity in hyperbolic space, and a reference sphere in Euclidean and spherical spaces. If the second argument is omitted, yes is assumed.
geomview-1.9.5/doc/geomview.html/if.html0000644000175000017500000000351512310162311015101 00000000000000 if - Geomview Manual

Next: , Previous: hsphere-draw, Up: GCL Reference


7.2.64 if

(if TEST EXPR1 [EXPR2])
Evaluates TEST; if TEST returns a non-nil value, returns the value of EXPR1. If TEST returns nil, returns the value of EXPR2 if EXPR2 is present, otherwise returns nil.
geomview-1.9.5/doc/geomview.html/inhibit_002dwarning.html0000644000175000017500000000360012310162311020237 00000000000000 inhibit-warning - Geomview Manual

Next: , Previous: if, Up: GCL Reference


7.2.65 inhibit-warning

(inhibit-warning STRING)
Inhibit warning inhbits geomview from displaying a particular warning message determined by STRING. At present there are no warning messages that this applies to, so this command is rather useless.
geomview-1.9.5/doc/geomview.html/input_002dtranslator.html0000644000175000017500000000431312310162311020476 00000000000000 input-translator - Geomview Manual

Next: , Previous: inhibit-warning, Up: GCL Reference


7.2.66 input-translator

(input-translator "#prefix_string" "Bourne-shell-command")
Defines an external translation program for special input types. When asked to read a file which begins with the specified string, geomview invokes that program with standard input coming from the given file. The program is expected to emit OOGL geometric data to its standard output. In this implementation, only prefixes beginning with # are recognized. Useful as in
            (input-translator "#VRML" "vrml2oogl")
geomview-1.9.5/doc/geomview.html/interest.html0000644000175000017500000000573612310162311016347 00000000000000 interest - Geomview Manual

Next: , Previous: input-translator, Up: GCL Reference


7.2.67 interest

(interest (COMMAND [args]))
Allows you to express interest in a command. When geomview executes that command in the future it will echo it to the communication pool from which the interest command came. COMMAND can be any command. Args specify restrictions on the values of the arguments; if args are present in the interest command, geomview will only echo calls to the command in which the arguments match those given in the interest command. Two special argument values may appear in the argument list. * matches any value. nil matches any value but supresses the reporting of that value; its value is reported as nil.

The purpose of the interest command is to allow external modules to find out about things happening inside geomview. For example, a module interested in knowing when a geom called foo is deleted could say (interest (delete foo)) and would receive the string (delete foo) when foo is deleted.

Picking is a special case of this. For most modules interested in pick events the command (interest (pick world)) is sufficient. This causes geomview to send a string of the form (pick world ...) every time a pick event (right mouse double click). See the (pick ...) command for details.

geomview-1.9.5/doc/geomview.html/lambda.html0000644000175000017500000000532112310162311015720 00000000000000 lambda - Geomview Manual

Next: , Previous: interest, Up: GCL Reference


7.2.68 lambda

(lambda (ARG1 ...) EXPR1 ... EXPRN)
A lambda expression is like a function. To “call” a lambda expression, it has to be evoked like a function: ((lambda (arg) (+ 1 arg)) 2). In this example, the value of the entire expression would be 3. In general, the value of the call will be the value of EXPRN. The first list serves to define formal parameters. The lambda expression itself is just a list, starting with the key-word lambda, followed by several quoted lists. See (defun ...). See (setq ...). See (let ...). Note the argument list may contain the special keywords
&optional
giving values to the following identifiers is optional, their default value will be nil
&rest
all excess arguments will be collected in a list, and that list will be assigned to the following argument, like so:
               ((lambda (&rest rest) (echo rest)) a b c d)

The output would be (a b c d).

geomview-1.9.5/doc/geomview.html/let.html0000644000175000017500000000476512310162311015277 00000000000000 let - Geomview Manual

Next: , Previous: lambda, Up: GCL Reference


7.2.69 let

(let ARGUMENTS EXPR1 ... EXPRN)
Generate a lambda expression from EXRP1 ... EXPRN, with the argument bindings described by ARGUMENTS. ARGUMENTS is a list of symbols (bound to nil by default) or lists of the form (ARG VALUE) where ARG is a symbol and not evaluated and VALUE is an S-expression which is first evaluated, then its value is bound to ARG. The entire expression evaluates to the value of EXPRN, the last expression in the body of the statement. The argument list must be present, but can be empty; in the latter case the (let () ...) statement is equivalent to a (progn ...). See (lambda ...). See (defun ...). See (setq ...).
geomview-1.9.5/doc/geomview.html/lines_002dcloser.html0000644000175000017500000000406612310162311017554 00000000000000 lines-closer - Geomview Manual

Next: , Previous: let, Up: GCL Reference


7.2.70 lines-closer

(lines-closer CAM-ID DIST)
Draw lines (including edges) closer to the camera than polygons by DIST / 10^5 of the Z-buffer range. DIST = 3.0 by default. If DIST is too small, a line lying on a surface may be dotted or invisible, depending on the viewpoint. If DIST is too large, lines may appear in front of surfaces that they actually lie behind. Good values for DIST vary with the scene, viewpoint, and distance between near and far clipping planes. This feature is a kludge, but can be helpful.
geomview-1.9.5/doc/geomview.html/load.html0000644000175000017500000000413512310162311015421 00000000000000 load - Geomview Manual

Next: , Previous: lines-closer, Up: GCL Reference


7.2.71 load

(load filename [command|geometry|camera])
Loads the given file into geomview. The optional second argument specifies the type of data it contains, which may be command (geomview commands), geometry (OOGL geometric data), or camera (OOGL camera definition). If omitted, attempts to guess about the file's contents. Loading geometric data creates a new visible object; loading a camera opens a new window; loading a command file executes those commands.
geomview-1.9.5/doc/geomview.html/load_002dpath.html0000644000175000017500000000355512310162311017030 00000000000000 load-path - Geomview Manual

Next: , Previous: load, Up: GCL Reference


7.2.72 load-path

(load-path)
Returns the current search path for command, geometry, files, etc. Note: to actually see the value returned by this function you should wrap it in a call to echo: (echo (load-path)). See (set-load-path ...).
geomview-1.9.5/doc/geomview.html/look.html0000644000175000017500000000440212310162311015443 00000000000000 look - Geomview Manual

Next: , Previous: load-path, Up: GCL Reference


7.2.73 look

(look [objectID] [cameraID])
Rotates the named camera to point toward the center of the bounding box of the named object (or the origin in hyperbolic or spherical space). In Euclidean space, moves the camera forward or backward until the object appears as large as possible while still being entirely visible. Equivalent to
          progn (
                  (look-toward [objectID] [cameraID] {center | origin})
                  [(look-encompass [objectID] [cameraID])]
          )

If objectID is not specified, it is assumed to be World. If cameraID is not specified, it is assumed to be targetcam.

geomview-1.9.5/doc/geomview.html/look_002dencompass.html0000644000175000017500000000414512310162311020105 00000000000000 look-encompass - Geomview Manual

Next: , Previous: look, Up: GCL Reference


7.2.74 look-encompass

(look-encompass [objectID] [cameraID])
Moves cameraID backwards or forwards until its field of view surrounds objectID. This routine works only in Euclidean space. If objectID is not specified, it is assumed to be the world. If cameraID is not specified, it is assumed to be the targetcam. See (look-encompass-size ...).
geomview-1.9.5/doc/geomview.html/look_002dencompass_002dsize.html0000644000175000017500000000434312310162311021525 00000000000000 look-encompass-size - Geomview Manual

Next: , Previous: look-encompass, Up: GCL Reference


7.2.75 look-encompass-size

(look-encompass-size [view-fraction clip-ratio near-margin far-margin])
Sets/returns parameters used by (look-encompass). view-fraction is the portion of the camera window filled by the object, clip-ratio is the max allowed ratio of near-to-far clipping planes. The near clipping plane is 1/near-margin times closer than the near edge of the object, and the far clipping plane is far-margin times further away. Returns the list of current values. Defaults: .75 100 0.1 4.0
geomview-1.9.5/doc/geomview.html/look_002drecenter.html0000644000175000017500000000430512310162311017722 00000000000000 look-recenter - Geomview Manual

Next: , Previous: look-encompass-size, Up: GCL Reference


7.2.76 look-recenter

(look-recenter [objectID] [cameraID])
Translates and rotates the camera so that it is looking in the -z direction (in objectID's coordinate system) at the center of objectID's bounding box (or the origin of the coordinate system in non-Eudlidean space). In Euclidean space, the camera is also moved as close as possible to the object while allowing the entire object to be visible. Also makes sure that the y-axes of objectID and cameraID are parallel.
geomview-1.9.5/doc/geomview.html/look_002dtoward.html0000644000175000017500000000400712310162311017412 00000000000000 look-toward - Geomview Manual

Next: , Previous: look-recenter, Up: GCL Reference


7.2.77 look-toward

(look-toward [objectID] [cameraID] [origin | center])
Rotates the named camera to point toward the origin of the object's coordinate system, or the center of the object's bounding box (in non-Euclidean space, the origin will be used automatically). Default objectID is the world, default camera is targetcam, default location to point towards is the center of the bounding box.
geomview-1.9.5/doc/geomview.html/merge.html0000644000175000017500000000370212310162311015600 00000000000000 merge - Geomview Manual

Next: , Previous: look-toward, Up: GCL Reference


7.2.78 merge

(merge {window|camera} CAM-ID { WINDOW or CAMERA ... })
Modify the given window or camera, changing just those properties specified in the last argument. E.g.
                  (merge camera Camera { far 20 })

sets Camera's far clipping plane to 20 while leaving other attributes untouched.

geomview-1.9.5/doc/geomview.html/merge_002dap.html0000644000175000017500000000350012310162311016642 00000000000000 merge-ap - Geomview Manual

Next: , Previous: merge, Up: GCL Reference


7.2.79 merge-ap

(merge-ap GEOM-ID APPEARANCE)
Merge in some appearance characteristics to GEOM-ID. Appearance parameters include surface and line color, shading style, line width, and lighting.
geomview-1.9.5/doc/geomview.html/merge_002dbase_002dap.html0000644000175000017500000000352112310162311020225 00000000000000 merge-base-ap - Geomview Manual

Next: , Previous: merge-ap, Up: GCL Reference


7.2.80 merge-base-ap

(merge-base-ap APPEARANCE)
merge-base-ap is a synonym for merge-baseap.
geomview-1.9.5/doc/geomview.html/merge_002dbaseap.html0000644000175000017500000000354112310162311017502 00000000000000 merge-baseap - Geomview Manual

Next: , Previous: merge-base-ap, Up: GCL Reference


7.2.81 merge-baseap

(merge-baseap APPEARANCE)
Merge in some appearance characteristics to the base default appearance (applied to every geom before its own apperance). Lighting is typically included in the base appearance.
geomview-1.9.5/doc/geomview.html/mod.html0000644000175000017500000000325712310162311015265 00000000000000 mod - Geomview Manual

Next: , Previous: merge-baseap, Up: GCL Reference


7.2.82 mod

(mod EXPR1 EXPR2)
Divides EXPR1 by EXPR2 and returns the remainder.
geomview-1.9.5/doc/geomview.html/morehelp.html0000644000175000017500000000334412310162311016316 00000000000000 morehelp - Geomview Manual

Next: , Previous: mod, Up: GCL Reference


7.2.83 morehelp

(morehelp command)
command may include * wildcards. Prints more info than (help command).
geomview-1.9.5/doc/geomview.html/name_002dobject.html0000644000175000017500000000356712310162311017346 00000000000000 name-object - Geomview Manual

Next: , Previous: morehelp, Up: GCL Reference


7.2.84 name-object

(name-object ID NAME)
Assign a new NAME (a string) to ID. A number is appended if that name is in use (for example, foo -> foo<2>). The new name, possibly with number appended, may be used as object's id thereafter.
geomview-1.9.5/doc/geomview.html/ND_002daxes.html0000644000175000017500000000556412310162311016420 00000000000000 ND-axes - Geomview Manual

Next: , Previous: name-object, Up: GCL Reference


7.2.85 ND-axes

(ND-axes CAMID [CLUSTERNAME [Xindex Yindex Zindex [Windex]]])
In our model for N-D viewing (enabled by (dimension)), objects in N-space are viewed by N-dimensional camera clusters. Each real camera window belongs to some cluster, and shows & manipulates a 3-D axis-aligned projected subspace of the N-space seen by its cluster. Moving one camera in a cluster affects its siblings.

The ND-axes command configures all this. It specifies a camera's cluster membership, and the set of N-space axes which become the 3-D camera's X, Y, and Z axes. Axes are specified by their indices, from 1 to N for an N-dimensional space. Cluster CLUSTERNAME is implicitly created if not previously known.

In principle it is possible to map the homogeneous component of a conformal 4 point to some other index; this would be done by specifying 0 for one of Xindex, Yindex or Zindex and giving Windex some positive value. This is probably not useful because Geomview does not support non-Euclidean geometries for in higher dimensions.

To read a camera's configuration, use (echo (ND-axes CAMID)). The return value is an array of 4 integers, the last one should 0.

geomview-1.9.5/doc/geomview.html/ND_002dcolor.html0000644000175000017500000000551112310162311016566 00000000000000 ND-color - Geomview Manual

Next: , Previous: ND-axes, Up: GCL Reference


7.2.86 ND-color

(ND-color CAMID
[ (( [ID] (x1 x2 ... xN) v r g b a v r g b a ... ) ((x1 ... xN) v r g b a v r g b a ...) ...)] ) Specifies a function, applied to each N-D vertex, which determines the colors of N-dimensional objects as shown in camera CAMID. Each coloring function is defined by a vector (in ID's coordinate system) [x1 ... xN] and by a sequence of value (v)/color(r g b a) tuples, ordered by increasing v. The inner product v = P.[x] is linearly interpolated in this table to give a color. If ID is omitted, the (xi) vector is assumed in universe coordinates. The ND-color command specifies a list of such functions; each vertex is colored by their sum (so e.g. green intensity could indicate projection along one axis while red indicated another. An empty list, as in (ND-color CAMID ()), suppresses coloring. With no second argument, (ND-color CAMID) returns that camera's color-function list. Even when coloring is enabled, objects tagged with the keepcolor appearance attribute are shown in their natural colors.
geomview-1.9.5/doc/geomview.html/ND_002dxform.html0000644000175000017500000000375412310162311016612 00000000000000 ND-xform - Geomview Manual

Next: , Previous: ND-color, Up: GCL Reference


7.2.87 ND-xform

(ND-xform OBJID [ntransform { idim odim ... }])
Concatenate the given ND-transform with the current ND-transform of the object (apply the ND-transform to object ID, as opposed to simply setting its ND-transform). Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.
geomview-1.9.5/doc/geomview.html/ND_002dxform_002dget.html0000644000175000017500000000403312310162311020026 00000000000000 ND-xform-get - Geomview Manual

Next: , Previous: ND-xform, Up: GCL Reference


7.2.88 ND-xform-get

(ND-xform-get ID [from-ID])
Returns the N-D transform of the given object in the coordinate system of from-ID (default universe), in the sense <point-in-ID-coords> * Transform = <point-in-from-ID-coords>. Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.
geomview-1.9.5/doc/geomview.html/ND_002dxform_002dset.html0000644000175000017500000000412712310162311020046 00000000000000 ND-xform-set - Geomview Manual

Next: , Previous: ND-xform-get, Up: GCL Reference


7.2.89 ND-xform-set

(ND-xform-set OBJID [ntransform { idim odim ... }])
Sets the N-D transform of the given object. In dimension N, this is an (N+1)x(N+1) matrix, so in that case idim and odim are expected to be both equal to (N+1). Note that all cameras in a camera-cluster have the same N-D transform. Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.
geomview-1.9.5/doc/geomview.html/new_002dalien.html0000644000175000017500000000440312310162311017027 00000000000000 new-alien - Geomview Manual

Next: , Previous: ND-xform-set, Up: GCL Reference


7.2.90 new-alien

(new-alien name [GEOMETRY])
Create a new alien (geom not in the world) with the given name (a string). GEOMETRY is a string giving an OOGL geometry specification. If GEOMETRY is omitted, the new alien is given an empty geometry. If an object with that name already exists, the new alien is given a unique name. The light beams that are used to move around the lights are an example of aliens. They're drawn but are not controllable the way ordinary objects are: they don't appear in the object browser and the user can't move them with the normal motion modes.
geomview-1.9.5/doc/geomview.html/new_002dcamera.html0000644000175000017500000000357212310162311017175 00000000000000 new-camera - Geomview Manual

Next: , Previous: new-alien, Up: GCL Reference


7.2.91 new-camera

(new-camera name [CAMERA])
Create a new camera with the given name (a string). If a camera with that name already exists, the new object is given a unique name. If CAMERA is omitted a default camera is used.
geomview-1.9.5/doc/geomview.html/new_002dcenter.html0000644000175000017500000000373712310162311017230 00000000000000 new-center - Geomview Manual

Next: , Previous: new-camera, Up: GCL Reference


7.2.92 new-center

(new-center [id])
Stop id, then set id's transform to the identity. Default id is target. Also, if the id is a camera, calls (look-recenter World id). The main function of the call to (look-recenter) is to place the camera so that it is pointing parallel to the z axis toward the center of the world.
geomview-1.9.5/doc/geomview.html/new_002dgeometry.html0000644000175000017500000000374312310162311017600 00000000000000 new-geometry - Geomview Manual

Next: , Previous: new-center, Up: GCL Reference


7.2.93 new-geometry

(new-geometry name [GEOMETRY])
Create a new geom with the given name (a string). GEOMETRY is a string giving an OOGL geometry specification. If GEOMETRY is omitted, the new object is given an empty geometry. If an object with that name already exists, the new object is given a unique name.
geomview-1.9.5/doc/geomview.html/new_002dreset.html0000644000175000017500000000332112310162311017057 00000000000000 new-reset - Geomview Manual

Next: , Previous: new-geometry, Up: GCL Reference


7.2.94 new-reset

(new-reset)
Equivalent to (progn (new-center ALLGEOMS)(new-center ALLCAMS)).
geomview-1.9.5/doc/geomview.html/NeXT.html0000644000175000017500000000333412310162311015320 00000000000000 NeXT - Geomview Manual

Next: , Previous: new-reset, Up: GCL Reference


7.2.95 NeXT

(NeXT)
Returns t if running on a NeXT, nil if not. A relict from ancient work-station year.
geomview-1.9.5/doc/geomview.html/normalization.html0000644000175000017500000000515712310162311017375 00000000000000 normalization - Geomview Manual

Next: , Previous: NeXT, Up: GCL Reference


7.2.96 normalization

(normalization GEOM-ID {each|none|all|keep})
Set the normalization status of GEOM-ID.
none
suppresses all normalization.
each
normalizes the object's bounding box to fit into the unit sphere, with the center of its bounding box translated to the origin. The box is scaled such that its long diagonal, sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), is 2.
all
resembles each, except when an object is changing (e.g. when its geometry is being changed by an external program). Then, each tightly fits the bounding box around the object whenever it changes and normalizes accordingly, while all normalizes the union of all variants of the object and normalizes accordingly.
keep
leaves the current normalization transform unchanged when the object changes. It may be useful to apply each or all normalization apply to the first version of a changing object to bring it in view, then switch to keep.
geomview-1.9.5/doc/geomview.html/not.html0000644000175000017500000000333612310162311015304 00000000000000 not - Geomview Manual

Next: , Previous: normalization, Up: GCL Reference


7.2.97 not

(not EXPR)
Evaluates EXPR; if EXPR returns a non-nil value, returns nil, if EXPR returns nil, return t.
geomview-1.9.5/doc/geomview.html/or.html0000644000175000017500000000331312310162311015117 00000000000000 or - Geomview Manual

Next: , Previous: not, Up: GCL Reference


7.2.98 or

(or EXPR1 EXPR2)
Evaluates EXPR1; if EXPR1 returns non-nil, return its value, if EXPR1 returns nil, evaluate EXPR2 and return its value.
geomview-1.9.5/doc/geomview.html/pick.html0000644000175000017500000000614312310162311015431 00000000000000 pick - Geomview Manual

Next: , Previous: or, Up: GCL Reference


7.2.99 pick

(pick COORDSYS GEOMID G V E F P VI EI FI)
The pick command is executed internally in response to pick events (right mouse double click).
COORDSYS
= coordinate system in which coordinates of the following arguments are specified. This can be:
world
world coord sys
self
coord sys of the picked geom (GEOMID)
primitive
coord sys of the actual primitive within the picked geom where the pick occurred.

GEOMID
= id of picked geom
G
= picked point (actual intersection of pick ray with object)
V
= picked vertex, if any
E
= picked edge, if any
F
= picked face
P
= path to picked primitive [0 or more]
VI
= index of picked vertex in primitive
EI
= list of indices of endpoints of picked edge, if any
FI
= index of picked face

External modules can find out about pick events by registering interest in calls to pick via the interest command.

In the ND-viewing context the co-ordinates are actually ND-points. They correspond to the 3D points of the pick relative to the sub-space defined by the viewport of the camera where the pick occurred. The co-ordinates are then padded with zeroes and transformed back to the co-ordinate system defined by COORDSYS.

geomview-1.9.5/doc/geomview.html/pick_002dinvisible.html0000644000175000017500000000343012310162311020057 00000000000000 pick-invisible - Geomview Manual

Next: , Previous: pick, Up: GCL Reference


7.2.100 pick-invisible

(pick-invisible [yes|no])
Selects whether picks should be sensitive to objects whose appearance makes them invisible; default yes. With no arguments, returns current status.
geomview-1.9.5/doc/geomview.html/pickable.html0000644000175000017500000000337712310162311016263 00000000000000 pickable - Geomview Manual

Next: , Previous: pick-invisible, Up: GCL Reference


7.2.101 pickable

(pickable GEOM-ID {yes|no})
Say whether or not GEOM-ID is included in the pool of objects that could be returned from the pick command.
geomview-1.9.5/doc/geomview.html/position.html0000644000175000017500000000326312310162311016347 00000000000000 position - Geomview Manual

Next: , Previous: pickable, Up: GCL Reference


7.2.102 position

(position objectID otherID)
Set the transform of objectID to that of otherID.
geomview-1.9.5/doc/geomview.html/position_002dat.html0000644000175000017500000000356012310162311017421 00000000000000 position-at - Geomview Manual

Next: , Previous: position, Up: GCL Reference


7.2.103 position-at

(position-at objectID otherID [center | origin])
Translate objectID to the center of the bounding box or the origin of the coordinate system of otherID (parallel translation). Default is center.
geomview-1.9.5/doc/geomview.html/position_002dtoward.html0000644000175000017500000000373312310162311020317 00000000000000 position-toward - Geomview Manual

Next: , Previous: position-at, Up: GCL Reference


7.2.104 position-toward

(position-toward objectID otherID [center | origin])
Rotate objectID so that the center of the bounding box or the origin of the coordinate system of the otherID lies on the positive z-axis of the first object. Default is the center of the bounding box.
geomview-1.9.5/doc/geomview.html/process_002devents.html0000644000175000017500000000422412310162311020131 00000000000000 process-events - Geomview Manual

Next: , Previous: position-toward, Up: GCL Reference


7.2.105 process-events

(process-events)
Pass control back to the event loop of Geomview, then continue evaluating the current command-script. If the current input stream has been put to sleep by one of the (sleep-...) commands, then the control remains by the main-loop until the current input streams “sleep” is over. See (sleep-until ...). See (sleep-for ...).
geomview-1.9.5/doc/geomview.html/progn.html0000644000175000017500000000343512310162311015631 00000000000000 progn - Geomview Manual

Next: , Previous: process-events, Up: GCL Reference


7.2.106 progn

(progn STATEMENT [ ... ])
evaluates each STATEMENT in order and returns the value of the last one. Use progn to group a collection of commands together, forcing them to be treated as a single command.
geomview-1.9.5/doc/geomview.html/quit.html0000644000175000017500000000315112310162311015461 00000000000000 quit - Geomview Manual

Next: , Previous: progn, Up: GCL Reference


7.2.107 quit

(quit)
quit is a synonym for exit.
geomview-1.9.5/doc/geomview.html/quote.html0000644000175000017500000000341612310162311015640 00000000000000 quote - Geomview Manual

Next: , Previous: quit, Up: GCL Reference


7.2.108 quote

(quote EXPR)
returns the symbolic lisp expression EXPR without evaluating it. Note, however, that quote parses EXPR as if it should be evaluated. See (eval ...).
geomview-1.9.5/doc/geomview.html/rawevent.html0000644000175000017500000000344512310162311016340 00000000000000 rawevent - Geomview Manual

Next: , Previous: quote, Up: GCL Reference


7.2.109 rawevent

(rawevent dev val x y t)
Enter the specified raw event into the event queue. The arguments directly specify the members of the event structure used internally by geomview. This is the lowest level event handler and is not intended for general use.
geomview-1.9.5/doc/geomview.html/rawpick.html0000644000175000017500000000332412310162311016141 00000000000000 rawpick - Geomview Manual

Next: , Previous: rawevent, Up: GCL Reference


7.2.110 rawpick

(rawpick CAMID X Y)
Process a pick event in camera CAMID at location (X,Y) given in integer pixel coordinates. This is a low-level procedure not intended for external use.
geomview-1.9.5/doc/geomview.html/read.html0000644000175000017500000000441412310162311015415 00000000000000 read - Geomview Manual

Next: , Previous: rawpick, Up: GCL Reference


7.2.111 read

(read {geometry|camera|appearance|image|ntransform|transform|command} {GEOMETRY or CAMERA or ...})
Read and interpret the text in ... as containing the given type of data. Useful for defining objects using OOGL reference syntax, e.g.
          (geometry  thing { INST  transform : T    geom : fred })
          (read  geometry  { define fred
             QUAD
             1 0 0  0 1 0  0 0 1  1 0 0
          })
          (read  transform { define T <myfile})

See References. See (hdefine ...). See (hdelete ...).

geomview-1.9.5/doc/geomview.html/real_002did.html0000644000175000017500000000366612310162311016477 00000000000000 real-id - Geomview Manual

Next: , Previous: read, Up: GCL Reference


7.2.112 real-id

(real-id ID)
Returns a string canonically identifying the given ID, or nil if the object does not exist. Examples: (if (real-id fred) (delete fred)) deletes fred if it exists but reports no error if it doesn't, and (if (= (real-id targetgeom) (real-id World)) () (delete targetgeom)) deletes targetgeom if it is different from the World.
geomview-1.9.5/doc/geomview.html/redraw.html0000644000175000017500000000333212310162311015764 00000000000000 redraw - Geomview Manual

Next: , Previous: real-id, Up: GCL Reference


7.2.113 redraw

(redraw CAM-ID)
States that the view in CAM-ID should be redrawn on the next pass through the main loop or the next invocation of draw.
geomview-1.9.5/doc/geomview.html/regtable.html0000644000175000017500000000327412310162311016272 00000000000000 regtable - Geomview Manual

Next: , Previous: redraw, Up: GCL Reference


7.2.114 regtable

(regtable)
shows the registry table
geomview-1.9.5/doc/geomview.html/rehash_002demodule_002dpath.html0000644000175000017500000000440512310162311021456 00000000000000 rehash-emodule-path - Geomview Manual

Next: , Previous: regtable, Up: GCL Reference


7.2.115 rehash-emodule-path

(rehash-emodule-path)
Rebuilds the application (external module) browser by reading all .geomview-* files in all directories on the emodule-path. Primarily intended for internal use; any applications defined by (emodule-define ...) commands outside of the .geomview-* files on the emodule-path will be lost. Does not sort the entries in the brower. See (emodule-sort). See (emodule-define ...).
geomview-1.9.5/doc/geomview.html/replace_002dgeometry.html0000644000175000017500000000356212310162311020421 00000000000000 replace-geometry - Geomview Manual

Next: , Previous: rehash-emodule-path, Up: GCL Reference


7.2.116 replace-geometry

(replace-geometry GEOM-ID PART-SPECIFICATION GEOMETRY)
Replace a part of the geometry for GEOM-ID.
geomview-1.9.5/doc/geomview.html/rib_002ddisplay.html0000644000175000017500000000450012310162311017365 00000000000000 rib-display - Geomview Manual

Next: , Previous: replace-geometry, Up: GCL Reference


7.2.117 rib-display

(rib-display [frame|tiff] FILEPREFIX)
Set Renderman display to framebuffer (popup screen window) or a TIFF format disk file. FILEPREFIX is used to construct names of the form prefixNNNN.suffix. (i.e. foo0000.rib) The number is incremented on every call to rib-snapshot and reset to 0000 when rib-display is called. TIFF files are given the same prefix and number as the RIB file (i.e. foo0004.rib generates foo0004.tiff). The default FILEPREFIX is geom and the default format is TIFF. (Note that geomview just generates a RIB file, which must then be rendered.)
geomview-1.9.5/doc/geomview.html/rib_002dsnapshot.html0000644000175000017500000000361112310162311017561 00000000000000 rib-snapshot - Geomview Manual

Next: , Previous: rib-display, Up: GCL Reference


7.2.118 rib-snapshot

(rib-snapshot CAM-ID [filename])
Write Renderman snapshot (in RIB format) of CAM-ID to <filename>. If no filename specified, see (rib-display ... for an explanation of the filename used.
geomview-1.9.5/doc/geomview.html/scale.html0000644000175000017500000000423212310162311015567 00000000000000 scale - Geomview Manual

Next: , Previous: rib-snapshot, Up: GCL Reference


7.2.119 scale

(scale GEOM-ID FACTOR [FACTORY FACTORZ])
Scale GEOM-ID, multiplying its size by FACTOR. The factors should be positive numbers. If FACTORY and FACTORZ are present and non-zero, the object is scaled by FACTOR in x, by FACTORY in y, and by FACTORZ in z. If only FACTOR is present, the object is scaled by FACTOR in x, y, and z. Scaling only really makes sense in Euclidean space. Mouse-driven scaling in other spaces is not allowed; the scale command may be issued in other spaces but should be used with caution because it may cause the data to extend beyond the limits of the space.
geomview-1.9.5/doc/geomview.html/scene.html0000644000175000017500000000321612310162311015576 00000000000000 scene - Geomview Manual

Next: , Previous: scale, Up: GCL Reference


7.2.120 scene

(scene CAM-ID [GEOMETRY])
Make CAM-ID look at GEOMETRY instead of at the universe.
geomview-1.9.5/doc/geomview.html/set_002dclock.html0000644000175000017500000000373412310162311017042 00000000000000 set-clock - Geomview Manual

Next: , Previous: scene, Up: GCL Reference


7.2.121 set-clock

(set-clock TIME)
Adjusts the clock for this command stream to read TIME (in seconds) as of the moment the command is received. See (sleep-until ...). See (clock ...).
geomview-1.9.5/doc/geomview.html/set_002dconformal_002drefine.html0000644000175000017500000000442312310162311021641 00000000000000 set-conformal-refine - Geomview Manual

Next: , Previous: set-clock, Up: GCL Reference


7.2.122 set-conformal-refine

(set-conformal-refine CMX [N [SHOWEDGES]])
Sets the parameters for the refinement algorithm used in drawing in the conformal model. CMX is the cosine of the maximum angle an edge can bend before it is refined. Its value should be between -1 and 1; the default is 0.95; decreasing its value will cause less refinement. N is the maximum number of iterations of refining; the default is 6. SHOWEDGES, which should be no or yes, determines whether interior edges in the refinement are drawn.
geomview-1.9.5/doc/geomview.html/set_002demodule_002dpath.html0000644000175000017500000000456612310162311021007 00000000000000 set-emodule-path - Geomview Manual

7.2.123 set-emodule-path

(set-emodule-path (PATH1 ... PATHN))
Sets the search path for external modules. The PATHi should be pathnames of directories containing, for each module, the module's executable file and a .geomview-<modulename> file which contains an (emodule-define ...) command for that module. This command implicitly calls (rehash-emodule-path) to rebuild the application browser from the new path setting. The special directory name + is replaced by the existing path, so e.g. (set-emodule-path (mydir +)) prepends mydir to the path.
geomview-1.9.5/doc/geomview.html/set_002dload_002dpath.html0000644000175000017500000000407212310162311020264 00000000000000 set-load-path - Geomview Manual

7.2.124 set-load-path

(set-load-path (PATH1 ... PATHN))
Sets search path for command, geometry, files, etc. The PATHi are strings giving the pathnames of directories to be searched. The special directory name + is replaced by the existing path, so e.g. (set-load-path (mydir +)) prepends mydir to the path.
geomview-1.9.5/doc/geomview.html/set_002dmotionscale.html0000644000175000017500000000420412310162311020255 00000000000000 set-motionscale - Geomview Manual

Next: , Previous: set-load-path, Up: GCL Reference


7.2.125 set-motionscale

(set-motionscale X)
Set the motion scale factor to X (default value 0.5). These commands scale their motion by an amount which depends on the distance from the frame to the center and on the size of the frame. Specifically, they scale by dist + scaleof(frame) * motionscale where dist is the distance from the center to the frame and motionscale is the motion scale factor set by this function. Scaleof(frame) measures the size of the frame object.
geomview-1.9.5/doc/geomview.html/setenv.html0000644000175000017500000000350612310162311016007 00000000000000 setenv - Geomview Manual

Next: , Previous: set-motionscale, Up: GCL Reference


7.2.126 setenv

(setenv name string)
sets the environment variable name to the value string; the name is visible to geomview (as in pathnames containing $name) and to processes it creates, e.g. external modules.
geomview-1.9.5/doc/geomview.html/setq.html0000644000175000017500000000511012310162311015450 00000000000000 setq - Geomview Manual

Next: , Previous: setenv, Up: GCL Reference


7.2.127 setq

(setq SYM EXPR)
Bind the symbol SYM to the value of EXPR. SYM must be an unqualified symbol, i.e. not quoted, and literal: (setq "foo" bar) will not work. Likewise (setq (bar STUFF) foo) will also not work, even if (bar ...) would evaluate to an unqualified symbol: varible names must be literals. Note that calling (setq SYM ...) will alter the value of SYM within the current name-space: if SYM, e.g., is bound as local variable by a lambda, let or defun expression, then (setq SYM ...) will change the value of the local variable, the global binding will remain unchanged. It is NOT possible to un-bind a symbol. However, subsequent (setq SYM ...) invocations will re-bind SYM to another value and free the lisp-object previously bound to SYM. See (lambda ...). See (defun ...). See (let ...).
geomview-1.9.5/doc/geomview.html/sgi.html0000644000175000017500000000320312310162311015257 00000000000000 sgi - Geomview Manual

Next: , Previous: setq, Up: GCL Reference


7.2.128 sgi

(sgi)
Returns t if running on an sgi machine, nil if not. A relict from the old work-station years.
geomview-1.9.5/doc/geomview.html/shell.html0000644000175000017500000000343112310162311015607 00000000000000 shell - Geomview Manual

Next: , Previous: sgi, Up: GCL Reference


7.2.129 shell

(shell SHELL-COMMAND)
Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview waits for it to complete and will be unresponsive until it does. A synonym is !.
geomview-1.9.5/doc/geomview.html/sleep_002dfor.html0000644000175000017500000000354012310162311017045 00000000000000 sleep-for - Geomview Manual

Next: , Previous: shell, Up: GCL Reference


7.2.130 sleep-for

(sleep-for TIME)
Suspend reading commands from this stream for TIME seconds. Commands already read will still be executed; sleep-for inside progn won't delay execution of the rest of the progn's contents.
geomview-1.9.5/doc/geomview.html/sleep_002duntil.html0000644000175000017500000000416012310162311017411 00000000000000 sleep-until - Geomview Manual

Next: , Previous: sleep-for, Up: GCL Reference


7.2.131 sleep-until

(sleep-until TIME)
Suspend reading commands from this stream until TIME (in seconds). Commands already read will still be executed; sleep-until inside progn won't delay execution of the rest of the progn's contents. Time is measured according to this stream's clock, as set by set-clock; if never set, the first sleep-until sets it to 0 (so initially (sleep-until TIME) is the same as (sleep-for TIME)). Returns the number of seconds until TIME.
geomview-1.9.5/doc/geomview.html/snapshot.html0000644000175000017500000000622112310162311016337 00000000000000 snapshot - Geomview Manual

Next: , Previous: sleep-until, Up: GCL Reference


7.2.132 snapshot

(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])
Save a snapshot of CAM-ID in the FILENAME (a string). The FORMAT argument is optional; it may be "ppmscreen" (the default), "ps", "ppm", "sgi" (on SGI machines), "ppmosmesa" (if built with libOSMesa) or "ppmosglx". A "ppmscreen" snapshot is created by reading the image directly from the given window; the window is popped above other windows and redrawn first, then its contents are written as a PPM format image. A "ppmosmesa" snapshot is drawn by Mesa's software renderer into a memory buffer in RAM. A "ppmosglx" snapshot is rendered into a GLX Pixmap buffer, which is also off-screen but may or may not reside in video RAM. Rendering may or may not be accelerated. The problem with on-screen snapshots is that the window must be mapped and not obscured by other windows. So on-screen snapshots will not work in the background, or when a screen saver is active. With "ps", dumps a Postscript picture representing the view from that window; hidden-surface removal might be incorrect. With "ppm", dumps a PPM-format image produced by geomview's internal software renderer; this may be of arbitrary size. If the FILENAME argument begins with "|", it's interpreted as a /bin/sh command to which the PPM or PS data should be piped. Optional XSIZE and YSIZE values are relevant only for "ppm" formats, and render to a window of that size (or scaled to that size, with aspect fixed, if only XSIZE is given)
geomview-1.9.5/doc/geomview.html/soft_002dshader.html0000644000175000017500000000331012310162311017363 00000000000000 soft-shader - Geomview Manual

Next: , Previous: snapshot, Up: GCL Reference


7.2.133 soft-shader

(soft-shader CAM-ID {on|off|toggle})
Select whether to use software or hardware shading in that camera.
geomview-1.9.5/doc/geomview.html/space.html0000644000175000017500000000326112310162311015574 00000000000000 space - Geomview Manual

Next: , Previous: soft-shader, Up: GCL Reference


7.2.134 space

(space {euclidean|hyperbolic|spherical})
Set the space associated with the world.
geomview-1.9.5/doc/geomview.html/stereowin.html0000644000175000017500000000465712310162311016532 00000000000000 stereowin - Geomview Manual

Next: , Previous: space, Up: GCL Reference


7.2.135 stereowin

(stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize])
Configure CAM-ID as a stereo window. no: entire window is a single pane, stereo disabled
horizontal: split left/right: left is stereo eye#0, right is #1.
vertical: split top/bottom: bottom is eye#0, top is #1.
colored: panes overlap, red is stereo eye#0, cyan is #1.

A gap of gapsize pixels is left between subwindows; if omitted, subwindows are adjacent. If both layout and gapsize are omitted, e.g. (stereowin CAM-ID), returns current settings as a (stereowin ...) command list. This command doesn't set stereo projection; use merge camera or camera to set the stereyes transforms, and merge window or window to set the pixel aspect ratio & window position if needed.

geomview-1.9.5/doc/geomview.html/time_002dinterests.html0000644000175000017500000000464712310162311020136 00000000000000 time-interests - Geomview Manual

Next: , Previous: stereowin, Up: GCL Reference


7.2.136 time-interests

(time-interests deltatime initial prefix [suffix])
Indicates that all interest-related messages, when separated by at least deltatime seconds of real time, should be preceded by the string prefix and followed by suffix; the first message is preceded by initial. All three are printf format strings, whose argument is the current clock time (in seconds) on that stream. A deltatime of zero timestamps every message. Typical usage:
(time-interests .1 (set-clock %g) (sleep-until %g)) or
(time-interests .1 (set-clock %g) "(sleep-until %g) (progn (set-clock %g)" ")") or
(time-interests .1 "(set-clock %g)" "(if (> 0 (sleep-until %g)) (" "))".
geomview-1.9.5/doc/geomview.html/transform.html0000644000175000017500000000657312310162311016525 00000000000000 transform - Geomview Manual

Next: , Previous: time-interests, Up: GCL Reference


7.2.137 transform

(transform objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [dt [smooth]])
Apply a motion (rotation, translation, scaling) to object objectID; that is, construct and concatenate a transformation matrix with objectID's transform The 3 IDs involved are the object that moves, the center of motion, and the frame of reference in which to apply the motion. The center is easiest understood for rotations: if centerID is the same as objectID then it will spin around its own axes; otherwise the moving object will orbit the center object. There is the special keyword bbox-center which may be used for centerID. As a result the motion will be relative to the center of the bounding box of objectID. Normally frameID, in whose coordinate system the (mouse) motions are interpreted, is focus, the current camera. Translations can be scaled proportional to the distance between the target and the center. Support for spherical and hyperbolic as well as Euclidean space is built-in: use the space command to change spaces. With type rotate x, y, and z are floats specifying angles in RADIANS. For types translate and translate-scaled x, y, and z are floats specifying distances in the coordinate system of the center object.

The optional dt field allows a simple form of animation; if present, the object moves by just that amount during approximately dt seconds, then stops. If present and followed by the smooth keyword, the motion is animated with a 3t^2-2t^3 function, so as to start and stop smoothly. If absent, the motion is applied immediately.

geomview-1.9.5/doc/geomview.html/transform_002dincr.html0000644000175000017500000000450012310162311020112 00000000000000 transform-incr - Geomview Manual

Next: , Previous: transform, Up: GCL Reference


7.2.138 transform-incr

(transform-incr objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center] [dt [smooth]])
Apply continuing motion: construct a transformation matrix and concatenate it with the current transform of objectID every refresh (sets objectID's incremental transform). Same syntax as transform. If optional dt argument is present, the object is moved at each time step such that its average motion equals one instance of the motion per dt seconds. E.g. (transform-incr World World World rotate 6.28318 0 0 10.0) rotates the World about its X axis at 1 turn (2pi radians) per 10 seconds.
geomview-1.9.5/doc/geomview.html/transform_002dset.html0000644000175000017500000000356112310162311017760 00000000000000 transform-set - Geomview Manual

Next: , Previous: transform-incr, Up: GCL Reference


7.2.139 transform-set

(transform-set objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center])
Set objectID's transform to the constructed transform. Same syntax as transform.
geomview-1.9.5/doc/geomview.html/truncate.html0000644000175000017500000000333612310162311016331 00000000000000 truncate - Geomview Manual

Next: , Previous: transform-set, Up: GCL Reference


7.2.140 truncate

(truncate EXPR)
Rounds EXPR towards zero.
geomview-1.9.5/doc/geomview.html/ui_002dcam_002dfocus.html0000644000175000017500000000521412310162311020111 00000000000000 ui-cam-focus - Geomview Manual

Next: , Previous: truncate, Up: GCL Reference


7.2.141 ui-cam-focus

(ui-cam-focus [focus-change|mouse-cross])
Set the focus policy for the camera windows. The default is mouse-cross: a camera is made the active camera (for interactive mouse events) when the mouse cursor crosses the window. Because this means it can become complicated to activate a specific camera (in the context of multiple camera windows) there is also the option to only change the camera focus when the window-manager decides to give it the focus for input events. So, after specifying focus-change it depends on the focus-change configuration of your window-manager when a camera becomes the active camera for mouse-interaction. To change this behaviour permanently you could, e.g., place the following line in your ${HOME}/.geomview file (see Customization):
          (progn
            (ui-cam-focus focus-change)
            ... # other stuff
          )
geomview-1.9.5/doc/geomview.html/ui_002dcenter.html0000644000175000017500000000351712310162311017050 00000000000000 ui-center - Geomview Manual

Next: , Previous: ui-cam-focus, Up: GCL Reference


7.2.142 ui-center

(ui-center ID)
Set the center for user interface (i.e. mouse) controlled motions to object ID.
geomview-1.9.5/doc/geomview.html/ui_002dcenter_002dorigin.html0000644000175000017500000000466312310162311021010 00000000000000 ui-center-origin - Geomview Manual

Next: , Previous: ui-center, Up: GCL Reference


7.2.143 ui-center-origin

(ui-center-origin [origin|bbox-center])
Set the origin of the coordinate system of the CENTER object for user interface (i.e. mouse) controlled motions. The keyword origin means to use the origin of the coordinate system of the currently selected object, while bbox-center means to use the center of the bounding box of the current object. The keyword bbox-center makes no sense if the geometry is non-Euclidean. Using either bbox-center or origin does not make a difference if the center object is not a geometry, e.g. if it is a camera. Same holds if the World is the currently selected object.
geomview-1.9.5/doc/geomview.html/ui_002demotion_002dprogram.html0000644000175000017500000000374012310162311021355 00000000000000 ui-emotion-program - Geomview Manual

Next: , Previous: ui-center-origin, Up: GCL Reference


7.2.144 ui-emotion-program

(ui-emotion-program PROGRAM)
This is an obsolete command. Use its new eqivalent emodule-define instead.
geomview-1.9.5/doc/geomview.html/ui_002demotion_002drun.html0000644000175000017500000000364312310162311020514 00000000000000 ui-emotion-run - Geomview Manual

Next: , Previous: ui-emotion-program, Up: GCL Reference


7.2.145 ui-emotion-run

(ui-emotion-run EMODULE)
This is an obsolete command. Use its new eqivalent emodule_start instead.
geomview-1.9.5/doc/geomview.html/ui_002dfreeze.html0000644000175000017500000000350212310162311017042 00000000000000 ui-freeze - Geomview Manual

Next: , Previous: ui-emotion-run, Up: GCL Reference


7.2.146 ui-freeze

(ui-freeze {on|off})
Toggle updating user interface panels. Off by default.
geomview-1.9.5/doc/geomview.html/ui_002dhtml_002dbrowser.html0000644000175000017500000000430512310162311020661 00000000000000 ui-html-browser - Geomview Manual

Next: , Previous: ui-freeze, Up: GCL Reference


7.2.147 ui-html-browser

(ui-html-browser BROWSER)
Use BROWSER for viewing the HTML-version of the manual when the ‘Manual (HTML)’ menu item is selected in the ‘Help’-menu. If the (ui-html-browser ...) command was never executed, then the default is to use the browser stored in the WEBBROWSER environment variable. If the environment variable is unset then the default is compile-time dependent.
geomview-1.9.5/doc/geomview.html/ui_002dmotion.html0000644000175000017500000000647012310162311017076 00000000000000 ui-motion - Geomview Manual

Next: , Previous: ui-html-browser, Up: GCL Reference


7.2.148 ui-motion

(ui-motion {inertia|constrain|own-coordinates} {on|off})
Enable or disable certain properties of mouse-controlled motion. The purpose of this command is to give access to the respective toggles of the Main panel's Motion menu through GCL commands. See Mouse Motions.
inertia
Normally, moving objects have inertia: if the mouse is still moving when the button is released, the selected object continues to move. When inertia is off, objects cease to move as soon as you release the mouse.
constrain
It's sometimes handy to move an object in a direction aligned with a coordinate axis: exactly horizontally or vertically. Calling (ui-motion constrain on) changes the interpretation of mouse motions to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical motion. Note that the motion is still along the X or Y axes of the camera in which you move the mouse, not necessarily the object's own coordinate system.
own-coordinates
It's sometimes handy to move objects with respect to the coordinate system where they were defined, rather than with respect to some camera's view. When (ui-motion own-coordinates on) has been called, all motions are interpreted that way: dragging the mouse rightward in translate mode moves the object in its own +X direction, and so on. May be especially useful in conjunction with the (ui-motion constrain on) command.
geomview-1.9.5/doc/geomview.html/ui_002dpanel.html0000644000175000017500000000517512310162311016671 00000000000000 ui-panel - Geomview Manual

Next: , Previous: ui-motion, Up: GCL Reference


7.2.149 ui-panel

(ui-panel PANELNAME {on|off} [WINDOW])
Do or don't display the given user-interface panel. Case is ignored in panel names. Current PANELNAMEs are:
geomview
main panel
tools
motion controls
appearance
appearance controls
cameras
camera controls
lighting
lighting controls
obscure
obscure controls (doesn't seem to exist any more)
materials
material properties controls
command
command entry box
credits
geomview credits
By default, the geomview and tools panels appear when geomview starts. If the optional Window is supplied, a position clause (e.g. (ui-panel obscure on { position xmin xmax ymin ymax }) sets the panel's default position. (Only xmin and ymin values are actually used.) A present but empty Window, e.g. (ui-panel obscure on {)} causes interactive positioning.
geomview-1.9.5/doc/geomview.html/ui_002dpdf_002dviewer.html0000644000175000017500000000427312310162311020310 00000000000000 ui-pdf-viewer - Geomview Manual

Next: , Previous: ui-panel, Up: GCL Reference


7.2.150 ui-pdf-viewer

(ui-pdf-viewer VIEWER)
Use the executable VIEWER for viewing the PDF-version of the manual when the ‘Manual (PDF)’ menu-item is selected in the ‘Help’-menu. If the (ui-pdf-viewer ...) command was never executed, then the default is to use the browser stored in the PDFVIEWER environment variable. If the environment variable is unset then the default is compile-time dependent.
geomview-1.9.5/doc/geomview.html/ui_002dtarget.html0000644000175000017500000000410312310162311017046 00000000000000 ui-target - Geomview Manual

Next: , Previous: ui-pdf-viewer, Up: GCL Reference


7.2.151 ui-target

(ui-target ID [yes|no])
Set the target of user actions (the selected line of the target object browser) to ID. The second argument specifies whether to make ID the current object regardless of its type. If no, then ID becomes the current object of its type (geom or camera). The default is yes. This command may result in a change of motion modes based on target choice.
geomview-1.9.5/doc/geomview.html/uninterest.html0000644000175000017500000000344712310162311016707 00000000000000 uninterest - Geomview Manual

Next: , Previous: ui-target, Up: GCL Reference


7.2.152 uninterest

(uninterest (COMMAND [args]))
Undoes the effect of an interest command. (COMMAND [args]) must be identical to those used in the interest command.
geomview-1.9.5/doc/geomview.html/update.html0000644000175000017500000000342112310162311015761 00000000000000 update - Geomview Manual

Next: , Previous: uninterest, Up: GCL Reference


7.2.153 update

(update [timestep_in_seconds])
Apply each incremental motion once. Uses timestep if it's present and nonzero; otherwise motions are proportional to elapsed real time.
geomview-1.9.5/doc/geomview.html/update_002ddraw.html0000644000175000017500000000347012310162311017370 00000000000000 update-draw - Geomview Manual

Next: , Previous: update, Up: GCL Reference


7.2.154 update-draw

(update-draw CAM-ID [timestep_in_seconds])
Apply each incremental motion once and then draw CAM-ID. Applies timestep seconds' worth of motion, or uses elapsed real time if timestep is absent or zero.
geomview-1.9.5/doc/geomview.html/while.html0000644000175000017500000000327212310162311015613 00000000000000 while - Geomview Manual

Next: , Previous: update-draw, Up: GCL Reference


7.2.155 while

(while TEST BODY)
Iterate: evaluate TEST, if non nil, evaluate BODY.
geomview-1.9.5/doc/geomview.html/window.html0000644000175000017500000000361212310162311016010 00000000000000 window - Geomview Manual

Next: , Previous: while, Up: GCL Reference


7.2.156 window

(window CAM-ID WINDOW)
Specify attributes for the window of CAM-ID, e.g. its size or initial position, in the OOGL Window syntax. The special CAM-ID default specifies properties of future windows (created by camera or new-camera).
geomview-1.9.5/doc/geomview.html/winenter.html0000644000175000017500000000330712310162311016335 00000000000000 winenter - Geomview Manual

Next: , Previous: window, Up: GCL Reference


7.2.157 winenter

(winenter CAM-ID)
Tell geomview that the mouse cursor is in the window of CAM-ID. This function is for development purposes and is not intended for general use.
geomview-1.9.5/doc/geomview.html/write.html0000644000175000017500000000513312310162311015633 00000000000000 write - Geomview Manual

Next: , Previous: winenter, Up: GCL Reference


7.2.158 write

(write {command|geometry|camera|transform|ntransform|window|bbox} FILENAME [ID|(ID ...)] [self|world|universe|otherID])
write description of ID in given format to FILENAME. Last parameter chooses coordinate system for geometry & transform: self: just the object, no transformation or appearance (geometry only) world: the object as positioned within the World. universe: object's position in universal coordinates; includes Worldtransform other ID: the object transformed to otherID's coordinate system.

A filename of - is a special case: data are written to the stream from which the 'write' command was read. For external modules, the data are sent to the module's standard input. For commands not read from an external program, - means geomview's standard output (see (command ...)).

The ID can either be a single id or a parenthesized list of ids, like g0 or (g2 g1 dodec.off).

geomview-1.9.5/doc/geomview.html/write_002dcomments.html0000644000175000017500000000553112310162311020130 00000000000000 write-comments - Geomview Manual

Next: , Previous: write, Up: GCL Reference


7.2.159 write-comments

(write-comments FILENAME GEOMID PICKPATH)
write OOGL COMMENT objects in the GEOMID hierarchy at the level of the pick path to FILENAME. Specifically, COMMENTS at level (a b c ... f g) will match pick paths of the form (a b c ... f *) where * includes any value of g, and also any values of possible further indices h,i,j, etc. The pick path (returned in the pick command) is a list of integer counters specifying a subpart of a hierarchical OOGL object. Descent into a complex object (LIST or INST) adds a new integer to the path. Traversal of simple objects increments the counter at the current level. Individual COMMENTS are enclosed by curly braces, and the entire string of zero, one, or more COMMENTS (written in the order in which they are encountered during hierarchy traversal) is enclosed by parentheses.

Note that arbitrary data can only be passed through the OOGL libraries as full-fledged OOGL COMMENT objects, which can be attached to other OOGL objects via the LIST type as described above. Ordinary comments in OOGL files (i.e. everything after '#' on a line) are ignored at when the file is loaded and cannot be returned.

geomview-1.9.5/doc/geomview.html/write_002dhandle.html0000644000175000017500000000356412310162311017542 00000000000000 write-handle - Geomview Manual

Next: , Previous: write-comments, Up: GCL Reference


7.2.160 write-handle

(write-handle PREFIX FILENAME HANDLE)
Writes the object underlying the given handle to FILENAME. This function is intended for internal debugging use only.
geomview-1.9.5/doc/geomview.html/write_002dsexpr.html0000644000175000017500000000341612310162311017444 00000000000000 write-sexpr - Geomview Manual

Next: , Previous: write-handle, Up: GCL Reference


7.2.161 write-sexpr

(write-sexpr FILENAME LISPOBJECT)
Writes the given LISPOBJECT to FILENAME. This function is intended for internal debugging use only.
geomview-1.9.5/doc/geomview.html/xform.html0000644000175000017500000000335112310162311015634 00000000000000 xform - Geomview Manual

Next: , Previous: write-sexpr, Up: GCL Reference


7.2.162 xform

(xform ID TRANSFORM)
Concatenate TRANSFORM with the current transform of the object (apply TRANSFORM to object ID).
geomview-1.9.5/doc/geomview.html/xform_002dincr.html0000644000175000017500000000344612310162311017242 00000000000000 xform-incr - Geomview Manual

Next: , Previous: xform, Up: GCL Reference


7.2.163 xform-incr

(xform-incr ID TRANSFORM)
Apply continual motion: concatenate TRANSFORM with the current transform of the object every refresh (set object ID's incremental transform to TRANSFORM).
geomview-1.9.5/doc/geomview.html/xform_002dset.html0000644000175000017500000000334512310162311017100 00000000000000 xform-set - Geomview Manual

Next: , Previous: xform-incr, Up: GCL Reference


7.2.164 xform-set

(xform-set ID TRANSFORM)
Overwrite the current object transform with TRANSFORM (set object ID's transform to TRANSFORM).
geomview-1.9.5/doc/geomview.html/zoom.html0000644000175000017500000000315712310162311015471 00000000000000 zoom - Geomview Manual

Previous: xform-set, Up: GCL Reference


7.2.165 zoom

(zoom CAM-ID FACTOR)
Zoom CAM-ID, multiplying its field of view by FACTOR. FACTOR should be a positive number.
geomview-1.9.5/doc/geomview.html/Non_002dEuclidean-Geometry.html0000644000175000017500000001007712310162311021366 00000000000000 Non-Euclidean Geometry - Geomview Manual

Next: , Previous: GCL, Up: Top


8 Non-Euclidean Geometry

Geomview supports hyperbolic and spherical geometry as well as Euclidean geometry. The three buttons at the bottom of the Main panel are for setting the current geometry type.

In each of the three geometries, three models are supported: Virtual, Projective, and Conformal. You can change the current model with the Model browser on the Camera panel. Each Geomview camera has its own model setting.

The default model is all three spaces is Virtual. This corresponds to the camera being in the same space as, and moving under the same set of transformations as, the geometry itself.

In Euclidean space Virtual is the most useful model. The other models were implemented for hyperbolic and spherical spaces and just happen to work in Eucldiean space as well: Projective is the same as Virtual but by default displays the unit sphere, and Conformal displays everything inverted in the unit sphere.

In hyperbolic space, the Projective model setting gives a view of the projective ball model of hyperbolic 3-space imbedded in Euclidean space. The camera is initially outside the unit ball. In this model, the camera moves by Euclidean motions and geometry moves by hyperbolic motions. Conformal model is similar but shows the conformal ball model instead.

In spherical space, the Projective model gives a view of half of the 3-sphere imbedded in Euclidean 3-space. Spherical motions give rise to projective transformations in the Projective model, and to Moebius transformations in the Conformal model. In both of these models the camera moves by Euclidean motions.

In Projective and Conformal models, the unit sphere is drawn by default. You can turn it off and on at will using the Draw Sphere button in the Camera panel. In the Conformal model, polygons and edges are subdivided as necessary to make them look curved. The parameters which determine this subdivision can be set with the set-conformal-refine GCL command. See (set-conformal-refine ...).

There are several sample hyperbolic space objects in the data/geom/hyperbolic subdirectory of the Geomview directory. Likewise, the subdirectory data/geom/spherical contains several sample spherical space objects. geomview-1.9.5/doc/geomview.html/Mathematica.html0000644000175000017500000000650012310162311016715 00000000000000 Mathematica - Geomview Manual

Next: , Previous: Non-Euclidean Geometry, Up: Top


9 Mathematica Graphics in Geomview or RenderMan

Geomview comes with some Mathematica packages that let you use use Geomview to display Mathematica graphics. Mathematica is a commercial mathematical software system available from Wolfram Research, Inc.

There are two ways to do this.

  1. Use Mathematica to write a graphics object to a file in OOGL format or in RIB format.
  2. Use Geomview as the default display for all 3D graphics output in Mathematica.
You can also use these packages to save Mathematica graphics in RenderMan (RIB) format.

Since the format of Mathematica graphics objects is different from the OOGL formats, both of these methods involve translating Mathematica graphics to OOGL format. Geomview is distributed with a Mathematica package which does this translation. Before doing either of the above you must install this package.

geomview-1.9.5/doc/geomview.html/OOGL_002em.html0000644000175000017500000000761412310162311016152 00000000000000 OOGL.m - Geomview Manual

Next: , Previous: Mathematica, Up: Mathematica


9.1 Using Mathematica to generate OOGL files

The package OOGL.m allows Mathematica to write graphics objects in OOGL format. To use it, give the command << OOGL.m to Mathematica to load the package. The WriteOOGL[file,graphics] command writes an OOGL description of the 3D graphics object graphics to the file named file.

This package also provides the Geomview command which sends a 3D graphics object to Geomview. The first time you use this command it starts up a copy of Geomview. Later calls send the graphics to the same Geomview. There are two ways to use the Geomview command.

Geomview[graphics]
Sends the 3D graphics object graphics to Geomview as a geom named Mathematica. Subsequent usage of Geomview[graphics] replaces the Mathematica object in Geomview with the new graphics.
Geomview[name,graphics]
Sends the 3D graphics object graphics to Geomview as a geom named name. You can use multiple calls of this form with different names to cause Geomview to display several Mathematica objects at once and allow independent control over them.
     % math
     Mathematica 2.0 for SGI Iris
     Copyright 1988-91 Wolfram Research, Inc.
      -- GL graphics initialized --
     
     In[1] := <<OOGL.m
     
     In[2] := Plot3D[Sin[x + Sin[y]], {x,-2,2},{y,-2,2}]
     
     Out[2] := -Graphics3D-

This displays graphics in the usual Mathematica way here.

     In[3] := WriteOOGL["math.oogl", %2]
     
     Out[3] := -Graphics3D-

This displays nothing new but writes the file math.oogl. You can now load that file into Geomview on any computer. Alternately, you can use the Geomview command to start up a copy of Geomview from within Mathematica.

     In[5] := Geomview[%2]
     
     Out[5] := -Graphics3D-
geomview-1.9.5/doc/geomview.html/Geomview_002em.html0000644000175000017500000001157312310162311017173 00000000000000 Geomview.m - Geomview Manual

Next: , Previous: OOGL.m, Up: Mathematica


9.2 Using Geomview as Mathematica's Default 3D Display

The package Geomview.m arranges for Geomview to be the default display program for 3D graphics in Mathematica. To load it, give the command << Geomview.m to Mathematica. Thereafter, whenever you display 3D graphics with Plot3D or Show, Mathematica will send the graphics to Geomview.

Loading Geomview.m implicitly loads OOGL.m as well, so you can use the Geomview and WriteOOGL as described above after loading Geomview.m. You do not have to separately load OOGL.m.

     % math
     Mathematica 2.0 for SGI Iris
     Copyright 1988-91 Wolfram Research, Inc.
      -- GL graphics initialized --
     
     In[1] := <<Geomview.m
     
     In[2] := Plot3D[x^2 + y^2, {x, -2, 2}, {y, -2, 2}]
     
     Out[2] := -SurfaceGraphics-

This invokes geomivew and loads the graphics object into it.

     In[3] := Plot3D[{x*y + 6, RGBColor[0,x,y]}, {x,0,1}, {y,0,1}]
     
     Out[3] := -SurfaceGraphics-

This replaces the previous Geomview object by the new object.

     In[4] := Geomview[{%2,%3}]
     
     Out[4] := {-SurfaceGraphics-, -SurfaceGraphics-}

This displays both objects at once. You also can have more than one Mathematica object at a time on display in Geomview, and have separate control over them, by using the Geomview command with a name, See OOGL.m.

     In[5] := Graphics3D[ {RGBColor[1,0,0], Line[{ {2,2,2},{1,1,1} }] }]
     
     Out[5] := -Graphics3D-
     
     In[6] := Geomview["myline", %5]

This addes the Line specified in In[5] to the existing Geomview display. It can be controlled independently of the "Mathematica" object, which is currently the list of two plots.

     In[7] := <<GL.m

If you're on an SGI, loading GL.m returns Mathematica to its usual 3D graphics display. The following plot will appear in a normal static Mathematica window.

     In[8] := ParametricPlot3D[{Sin[x],Sin[y],Sin[x]*Cos[y]}, {x,0,Pi},{y,0,Pi}]
     
     Out[8] := -Graphics3D-

We can return to Geomview graphics at any time by reloading Geomview.m.

     In[9] := <<Geomview.m
     
     In[10] := Show[%8]
     
     Out[10] := -Graphics3D-
     
     In[11] := ParametricPlot3D[
                {(2*(Cos[u] + u*Sin[u])*Sin[v])/(1 + u^2*Sin[v]^2),
                (2*(Sin[u] - u*Cos[u])*Sin[v])/(1 + u^2*Sin[v]^2),
                Log[Tan[v/2]] + (2*Cos[v])/(1 + u^2*Sin[v]^2)},
               {u,-4,4},{v,.01,Pi-.01}]
     
     Out[11] := -Graphics3D-

This last plot is Kuen's surface, a surface of constant negative curvature. Parametrization from Alfred Gray's Modern Differential Geometry of Curves and Surfaces textbook. geomview-1.9.5/doc/geomview.html/RenderMan.html0000644000175000017500000001173012310162311016354 00000000000000 RenderMan - Geomview Manual

Next: , Previous: Geomview.m, Up: Mathematica


9.3 Using Mathematica to generate RenderMan files

In addition to the WriteOOGL and Geomview commands described above, the package OOGL.m also defines the command WriteRIb which writes a 3D graphics object to a RenderMan RIB file: WriteRIB[file, graphics] writes graphics to file file. RenderMan is a commercial rendering system available from Pixar, Inc., which can produce extremely high quality images.

     In[1] := <<OOGL.m
     
     In[2] := <<Graphics/Polyhedra.m
     
     In[3] := Graphics3D[Cube[]]
     
     Out[3] := -Graphics3D-
     
     In[4] := WriteRIB["cube.rib", %3]
     
     Out[4] := -Graphics3D-

This generates the file math.rib. This is a ready-to-render RIB file of the given geometry, using a default camera position, lighting, and the “plastic” shader. In a shell window, type render cube.rib to generate the image file mma.tiff. Of course, you need to have RenderMan installed for this to work. A shortcut to render from inside Mathematica is WriteRIB["!render", foo].

WriteRIb works by first converting the Mathematica graphics object to OOGL format using WriteOOGL and then calls an external program oogl2rib to convert OOGL to RIB format. The oogl2rib program takes several options which you can specify in a string as an optional third argument to WriteRIb. The default option string is " -n mma.tiff ", which indicates that the RIB file should generate a rendered TIFF file named mma.tiff. A particularly useful option is -g, which tells oogl2rib to convert only the geometry into a RIB fragment. You can insert that fragment into a full RIB file of your own making with camera positions and shaders of your choice, to harness the full power of RenderMan.

The full usage of oogl2rib is:

     oogl2rib [-n name] [-B r,g,b] [-w width] [-h height] [-fgb] [infile] [outfile]

By default it reads from stdin and writes to stdout. Either infile or outfile may be -, which means use stdin/stdout. The options are:

-n name
Use name for the name of the rendered TIFF file (default "geom.tiff") or framebuffer window (default "geom.rib").
-B r,g,b
Use background color (r,g,b). Each component ranges from 0 to 1. Default: none.
-w width -h height
Rendered frame will be width by height pixels.
-f
RIB file renders to on-screen framebuffer instead of TIFF file.
-g
Output only the geometry in RIB format.
-b
Output only a Quick Renderman clip object. Ignores -nBwhf.
geomview-1.9.5/doc/geomview.html/Remote-Display.html0000644000175000017500000000436412310162311017344 00000000000000 Remote Display - Geomview Manual

Next: , Previous: RenderMan, Up: Mathematica


9.4 Using Geomview and Mathematica on Different Computers

It is possible to use Geomview to display graphics generated by Mathematica running on a different computer. If you want to use Mathematica on a computer that is not networked with your Geomview computer, you can write out chunk files in Mathematica which you transfer to the Geomview computer and then translate to OOGL format for displaying in Geomview.

geomview-1.9.5/doc/geomview.html/Networked-Geomview.html0000644000175000017500000000726312310162311020231 00000000000000 Networked Geomview - Geomview Manual

Next: , Previous: Remote Display, Up: Remote Display


9.4.1 Using a Networked Geomview Host

The Geomview command looks at the DISPLAY or REMOTEHOST environment variables to try to determine if you are logged in from another computer. If either of these indicates that you are, Geomview will attempt to run Geomview on that computer. In order for this to work, your network must be configured such that the Mathematica computer can successfully rsh to the Geomview computer without giving a password.

You can also explicitly set the DisplayHost option to the Geomview command to a string which is the desired hostname, for example:

     In[1] := << OOGL.m
     
     In[2] := Plot3D[Sin[x + Sin[y]], {x,-2,2},{y,-2,2}]
     
     Out[2] := -Graphics3D-
     
     In[3] := Geomview[%3, DisplayHost->"riemann"]

This displays the graphics %3 on the remote host named riemann.

Geomview recognizes the string "local" as a value for $DisplayHost; it forces the graphics to be displayed on the local machine.

In addition to knowing the name of the machine you want to run Geomview on, Geomview needs to know the type of that machine (the setting of the CPU variable that corresponds to the machine; see Source Code Installation). By default, Geomview assumes that it is the same kind of computer as the one you are running Mathematica on. The MachType option lets you explicitly specify the type of the DisplayHost computer; it should be one of the strings "sgi" or "next" or "x11".

You can use SetOptions to change the default DisplayHost and MachType. For example,

     In[4] := SetOptions[Geomview, DisplayHost->"riemann", MachType->"sgi"]

arranges for Geomview to run Geomview on an SGI workstation named riemann. geomview-1.9.5/doc/geomview.html/Chunks.html0000644000175000017500000000667212310162311015745 00000000000000 Chunks - Geomview Manual

9.4.2 Transporting Mathematica Files to Geomview by Hand

The auxilliary function WriteChunk is for those who can only use Mathematica on a computer that Geomview isn't installed on. WriteChunk[file, graphics] generates a file named file which contains the graphics object graphics in the format accepted by math2oogl.

You can transfer that file to a computer that has Geomview installed on it and then use the programs math2oogl, oogl2rib, and geomview directly from the shell. These programs are distributed in the bin/<CPU> subdirectory of the Geomview directory, and may have been installed so that they are on your path.

     In[1]:= <<OOGL.m
     
     In[2]:= Plot3D[ Sin[x + Sin[y]], {x,-2,2}, {y,-2,2} ]
     
     Out[2]= -SurfaceGraphics-
     
     In[3]:= WriteChunk["mychunk",%2]

This writes the file mychunk which contains a description of the graphics object. You can then transfer this file to a system with Geomview and type

     math2oogl < mychunk > mma.oogl

to convert it to the OOGL file mma.oogl which you can then view using Geomview. This is the equivalent of the WriteOOGL command.

For a result equivalent to the Geomview or Show commands, type

     math2oogl -togeomview Mathematica geomview < mychunk

The WriteRIb command can be emulated from the shell as

     math2oogl < mychunk | oogl2rib -n mma.tiff

geomview-1.9.5/doc/geomview.html/Package-Details.html0000644000175000017500000000622612310162311017423 00000000000000 Package Details - Geomview Manual

9.5 Details of the Mathematica->Geomview Package

The OOGL.m package uses the external program math2oogl to convert Graphics3D objects to OOGL format, because a compiled external program is able to do this conversion many times faster than Mathematica.

The converter will sometimes handle colored SurfaceGraphics objects correctly that Mathematica does not handle correctly, which means that Geomview[object] sometimes works where Show[object] will give errors.

The converter supports the Polygon, Line, and Point graphics primitives, RGBColor Graphics3D directives, and SurfaceGraphics objects with or without RGBColor directives, and lists of any combination of these. It silently ignores all other directives.

The Mathematica to RenderMan conversion is actually a two-step process: Mathematica->OOGL (math2oogl), and OOGL->RenderMan (oogl2rib).

In the WriteOOGL and WriteRIB commands, filename can either be a string containing a filename, an OutputStream object, or a string starting with a ! to send the output to a command. Object can be a Graphics3D object, a SurfaceGraphics object, or a list of these.

The packages work best with Mathematica 2.0 or better. With version 1.2, the Geomview display is always on the local host. geomview-1.9.5/doc/geomview.html/Package-Installation.html0000644000175000017500000001560412310162311020477 00000000000000 Package Installation - Geomview Manual

Previous: Package Details, Up: Mathematica


9.6 Installing the Mathematica Packages

BUG: This section is out of date. Geomview follows the GNU-installation habits, data goes to PREFIX/share/geomview/, user executables to PREFIX/bin/, private executables to PREFIX/libexec/geomview/, libraries to PREFIX/lib/ where PREFIX denotes the installation prefiex specified for the TOPSRCDIR/configure script. Please have a look at the files TOPSRCDIR/INSTALL and TOPSRCDIR/INSTALL.Geomview for installation instructions.

The installed Mathematica data-files can be found in PREFIX/share/geomview/Mathematica/.

If Geomview is properly installed on your system according to the instructions in See Installation, then the Mathematica-to-Geomview packages should work as described here; there should be no need for additional installation procedures. In practice, however, it is sometimes necessary to taylor the installation of the Mathematica packages and/or of Geomview itself to suit the needs of a particular system. This section contains details about how the installation works; if the Mathematica-to-Geomview connection does not seem to work for you after following the Geomview installation procedure, consult this section to see what might need to be fixed.

In this section, the phrase Geomview installation refers any of the procedures in See Installation. The way the Mathematica packages work and are installed is the same regardless of whether you have one of the binary distributions or the source distribution.

  1. The relevant mathematica files are OOGL.m, Geomview.m, and BezierPlot.m; Mathematica must be able to find these files. They are distributed in the PREFIX/share/geomview/Mathematica subdirectory of the binary distributions, and in the TOPSRCDIR/src/bin/geomutil/math2oogl subdirectory of the source distribution. These files need to be in a directory that is on Mathematica's search path. You can look at the value of the $Path variable in a Mathematica session on your system to see a list of the directories on Mathematica's search path.

    The Geomview installation procedure puts copies of the Mathematica packages into a directory that you specify (MMAPACKAGEDIR). This should ensure that Mathematica can find them. Alternately, you could arrange to append the pathname of the Mathmematica package subdirectory of the Geomview distribution to the $Path variable each time you run Mathematica.

  2. The package OOGL.m needs to be able to invoke the programs geomview, math2oogl, and oogl2rib. The Geomview installation procedure installs these programs into a directory that you specify for executables (BINDIR). Ideally, this directory should be on your shell's $PATH. More specifically, it should be on the $PATH of the shell in which Mathematica runs; the directory /usr/local/bin is usually a good choice. You can see the list of directories on this path by giving the command !echo $path in Mathematica.

    If for some reason you can't arrange for geomview, math2oogl, and oogl2rib to be in a directory on the shell's $path, you can modify OOGL.m to cause it to look for them using absolute pathnames. To do this, change the definitions of the variables $GeomviewPath and $GeomRoot, which are defined near the top of the file. Change $GeomviewPath to the absolute pathname of the geomview shell script on your system. Change $GeomRoot to the absolute pathname of the $GEOMROOT directory on your system. If you do this, you should also make sure there are copies of geomview, math2oogl, and oogl2rib in the $GEOMROOT/bin/<CPU>.

  3. The geomview shell script, which OOGL.m uses to invoke Geomview, needs to be able to find the geomview executable file ( called gvx). The Geomview installation procedure should have been taken care of this, but if your Mathematica session doesn't seem to be able to invoke Geomview, it's worth double-checking that the settings in the geomview script are correct.
geomview-1.9.5/doc/geomview.html/Installation.html0000644000175000017500000000570412310162311017146 00000000000000 Installation - Geomview Manual

Next: , Previous: Mathematica, Up: Top


10 Installation

BUG: This section is out of date. Geomview follows the GNU-installation habits, data goes to PREFIX/share/geomview/, user executables to PREFIX/bin/, private executables to PREFIX/libexec/geomview/, libraries to PREFIX/lib/ where PREFIX denotes the installation prefiex specified for the TOPSRCDIR/configure script. Please have a look at the files TOPSRCDIR/INSTALL and TOPSRCDIR/INSTALL.Geomview for installation instructions.

What you do to install Geomview depends on which kind of computer you have and on whether you have the source distribution or the binary distribution.

In general, if you don't care about looking at Geomview's source code, you should get one of the binary distribution. The binary installation is much easier and quicker than compiling and installing the source code.

geomview-1.9.5/doc/geomview.html/Unix-Binary-Installation.html0000644000175000017500000001330412310162311021304 00000000000000 Unix Binary Installation - Geomview Manual

10.1 Installing the Unix Binary Distribution

BUG: This section is out of date. Geomview follows the GNU-installation habits, data goes to PREFIX/share/geomview/, user executables to PREFIX/bin/, private executables to PREFIX/libexec/geomview/, libraries to PREFIX/lib/ where PREFIX denotes the installation prefiex specified for the TOPSRCDIR/configure script. Please have a look at the files TOPSRCDIR/INSTALL and TOPSRCDIR/INSTALL.Geomview for installation instructions.

If you have just obtained a copy of the binary distribution for a Unix system (Linux, SGI, Solaris, HP, etc), you should be able to run Geomview and make use of most of its features immediately after unpacking it by cd'ing to the directory that it is in and typing geomview.

In order to fully install Geomview so that you can run it from any directory and use all of its features, follow the steps in this section. In particular, you must go through this installation procedure in order to use Geomview to display Mathematica graphics.

Geomview is distributed in a directory that contains various files and subdirectories that Geomview needs at run-time, such as data files and external modules. It also contains other things distributed with Geomview, such as documentation and (in the soure-code distribution) source-code. We refer to the root directory of this tree as the $GEOMROOT directory. This is the directory called Geomview that is created when you unpack the distribution file.

To install Geomview on your system, arrange for the $GEOMROOT directory to be in a permanent place. Then, in a shell window, cd to that directory and type install. This runs a shell script which does the installation after asking you several questions about where you want to install the various components of Geomview.

After running the install script you should now be able to run Geomview from any directory on your system. (You may need to give the rehash command in any shells on your computer that were started up before you did the installation.)

The install script puts copies of the files in $GEOMROOT/bin/<CPU> and $GEOMROOT/man into the directories you specified for executables and man pages, respectively. Once you have done the installation you can cut down one the disk space required by Geomview by removing some files from these directories, since copies have been installed elsewhere. You should first test that your installed Geomview works properly because once you remove these files from their distribution directories you will not be able to do the installation again.

In particular, the files you can remove are

$GEOMROOT/bin/<MACHTYPE>:
(where <MACHTYPE> is the type of system you are on, e.g. linux, sgi, hpux, etc). Remove all files from here except gvx, which is the geomview executable file. DO NOT REMOVE gvx. It is not installed elsewhere.
$GEOMROOT/man:
You can remove all the files in this directory.
geomview-1.9.5/doc/geomview.html/Unix-Binary-Detail.html0000644000175000017500000001154412310162311020051 00000000000000 Unix Binary Detail - Geomview Manual

10.1.1 Details of the Unix Binary Installation

BUG: This section is out of date. Geomview follows the GNU-installation habits, data goes to PREFIX/share/geomview/, user executables to PREFIX/bin/, private executables to PREFIX/libexec/geomview/, libraries to PREFIX/lib/ where PREFIX denotes the installation prefiex specified for the TOPSRCDIR/configure script. Please have a look at the files TOPSRCDIR/INSTALL and TOPSRCDIR/INSTALL.Geomview for installation instructions.

The install script should be self-explanatory; just run it and answer the questions. This section gives some details for system administrators and other users who may want to know more about the installation.

The installation is actually done by make; the install script queries the user for the settings of the following make variables and then invokes make install.

GEOMROOT:
the absolute pathname of the Geomview root directory. The geomview shell script, which is what users invoke to run Geomview, uses this to set various environment variables that Geomview needs. It is very important that this be an absolute pathname — i.e. it should start with a '/'.
BINDIR:
a directory where executable files are installed. The geomview shell script goes here, as well as various other auxiliary programs that can be used in conjunction with geomview. This should be a directory that is on users' $path. These auxiliary programs are distributed in the $GEOMROOT/bin/<MACHTYPE> directory; if you specify this directory for BINDIR, they are left in that directory.
MANDIR:
a directory where Unix manual pages are installed. These are distributed in the $GEOMROOT/man subdirectory; if you specify this directory for MANDIR, they are left in that directory.
MMAPACKAGEDIR:
a directory where Mathematica packages are installed. This should be a directory that Mathematica searches for packages that it loads; you can see what directories your Mathematica searches by looking at the value of the $Path variable in a Mathematica session. The installation process will install some packages there which allow you to use Geomview to display Mathematica graphics. These packages are distributed in the $GEOMROOT/mathematica subdirectory; if you specify this directory for MMAPACKAGEDIR, or if you specify the empty string for MMAPACKAGEDIR, the packages are left in that directory. For more details about the way these Mathematica packages connect to Geomview, see Package Installation.
geomview-1.9.5/doc/geomview.html/Source-Code-Installation.html0000644000175000017500000001477612310162311021265 00000000000000 Source Code Installation - Geomview Manual

10.2 Compiling and Installing the Source Code Distribution

BUG: This section is out of date. Geomview follows the GNU-installation habits, data goes to PREFIX/share/geomview/, user executables to PREFIX/bin/, private executables to PREFIX/libexec/geomview/, libraries to PREFIX/lib/ where PREFIX denotes the installation prefiex specified for the TOPSRCDIR/configure script. Please have a look at the files TOPSRCDIR/INSTALL and TOPSRCDIR/INSTALL.Geomview for installation instructions.

The main reason to get the source code distribution is to look at and/or work with the source code. If you are only concered with using Geomview it is better to get the binary distribution. It takes anywhere from a few minutes to an hour or more to compile the entire source distribution, depending on what kind of computer you have.

Let $GEOMROOT denote the full pathname of the Geomview source code directory; this is the directory called Geomview that is created when you unpack the distribution. This directory contains the Geomview source code as well as various other files and subdirectories that Geomview needs when it runs.

Before doing any compilation you should edit the file $GEOMROOT/makefiles/mk.site.default. This file defines some make variables which specify your local configuration. This includes the pathnames of the directories into which Geomview will be installed, and possibly some other settings as well. There are comments in the file telling you what to do. This file is included by every Makefile in the source tree, so the settings you specify here are used throughout the source.

If you will be compiling for multiple systems, you can do them all in the same directory tree. By default the Makefiles are set up to put the objects files, libraries, and executables in directories which depend on the type of computer, so the two architectures will not interfere with each other. The Makefiles use a variable called CPU to determine the type of machine. Before doing any compilation you must arrange for this variable to have a value. There are two ways you can do this.

  1. If you will always be compiling Geomview on the same type of computer edit the file $GEOMROOT/makefiles/Makedefs.global to set the CPU variable to one of the values linux, FreeBSD, sgi, hpux, hpux-gcc, solaris, sun4os4 (for Suns with SunOS 4, not Solaris), rs6000, or alpha. If you're using a type of system not in this list, make up a new value for CPU, and write a mk.<CPU> file for it patterned after the other mk.* in the makefiles subdirectory.
  2. If you will be compiling on more than one type of computer you can set a shell environment variable named CPU to one of the values above and the Makefiles will inherit the value from the environment.

Note that many of the Makefiles refer to a variable called MACHTYPE; this variable tells which type of graphics system to compile Geomview for. The mk.<CPU> files set this variable for you; in most cases its value is x11, which specifies that Geomview should be compiled for X windows.

Once you have configured your source tree by editing the files as described above and setting the CPU variable, you can compile and install Geomview by typing make install in the $GEOMROOT directory. You can also type make all, or equivalently just make, to compile without installing, and then type make install later to install.

You can use these same make comands in any subdirectory in the tree to recompile and/or install a part of Geomview or a module.

If you want to modify the complier flags used during compilation, edit the file $GEOMROOT/makefiles/Makedefs.global; the COPTS variable specifies the flags passed to the C compiler (cc). geomview-1.9.5/doc/geomview.html/Support.html0000644000175000017500000000521612310162311016157 00000000000000 Support - Geomview Manual

Next: , Previous: Installation, Up: Top


Getting Technical Support for Geomview

There are several ways to get support for Geomview.

  1. Visit the Geomview web site, http://www.geomview.org. It contains the latest documentation, news about development, and FAQ (Frequently Asked Questions) list.
  2. Send email to the geomview-users@lists.sourceforge.net mailing list. This is a mailing list for discussing any issues related to using Geomview. To join the list, send an empty note with 'subscribe' in the subject line to geomview-users-request@lists.sourceforge.net, or visit the list web page at http://lists.sourceforge.net/mailman/listinfo/geomview-users.
  3. Contract with Geometry Technologies for support. Geometry Technologies is a contract support and programming company that emerged from the Geometry Center, where Geomview was written. For more information visit the Geometry Technologies web site at http://www.geomtech.com.
geomview-1.9.5/doc/geomview.html/Contributing.html0000644000175000017500000000612412310162311017151 00000000000000 Contributing - Geomview Manual

Next: , Previous: Support, Up: Top


Contributing to Geomview's Development

If you are interested in contributing to the development of Geomview, there are several things you can do:

  1. Volunteer programming work.

    If you are a programmer and make an improvement to Geomview, contact the other geomview authors by sending a note to the geomview-users mailing list (see http://lists.sourceforge.net/mailman/listinfo/geomview-users).

  2. Contract with Geometry Technologies.

    Geometry Technologies, Inc. is a consulting firm that provides contract technical support and custom programming services in the area of 3D graphics. This includes a wide range of services related to 3D graphics, included but not limited to applications involving Geomview. To the extent that resources allow, Geometry Technologies supports the developement of Geomview; in particular it hosts the http://www.geomview.org web site, and its staff make ongoing improvements to Geomview itself. If you are in a position to pay for technical support or custom programming work, contracting with Geometry Technologies indirectly supports Geomview. You can also contract with with Geometry Technologies to have particular features that you want added to Geomview, or to port Geomview to a new platform. For more information see Geometry Technologies web site at http://www.geomtech.com.

Thank you. geomview-1.9.5/doc/geomview.html/Function-Index.html0000644000175000017500000013012112310162311017327 00000000000000 Function Index - Geomview Manual

Next: , Previous: Contributing, Up: Top


Function Index

Table of Contents

geomview-1.9.5/doc/geomview.html/List-of-Figures.html0000644000175000017500000000532712310162311017425 00000000000000 List of Figures - Geomview Manual

Previous: Function Index, Up: Top


List of Figures

geomview-1.9.5/doc/geomview-pt_BR.pdf0000644000175000017500000273264412310162310014366 00000000000000%PDF-1.5 %ÐÔÅØ 3 0 obj << /Length 582 /Filter /FlateDecode >> stream xÚÅRËnÛ0¼û+x¤€ˆâS${k‚&…‘ªôÒÀÚŒ-D¶ JJãòí嫎 io…¢¨Ù™Ý!û‡d i®Àb3ÃùöaFò‰3êß'•á_I^—ž½”4âÏ›Yu)) ÕB ÐÜ¢"JÁª™Í|†7f[0'Ó%“.ûô¾²ý¦`>¶öGñµ™W—‚‚‘Æš2ϱoY $O\Ÿ Å uÃs!0†&01 ÒH¤c$g<‘Su Qª@IkÄÔ±ŠhMýäµJv›µ}‰‘Ý>]_Ø‘Ѻ¼oJ’äÏY¼b€Fúo’~ýúÅ‘~åljë$ôã8—vm÷…âð,}6ál69FÞLÛ‚ÀŸ!0á“ãÎ͉즽!­øÿs}ØZ0\˼žÎLC9Ÿ†qÊñ}oÛ­ <³wÍìç<ä endstream endobj 11 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚ…½‚@„{žbË»‚s—ÛChM´°²¸N-.€æ"? ……Ï.$vd‹ÝÌ~™Éà8)ÂVk•rYà¬>š¯pÂ?bgƒÍÁªS{C±2l›ÃY¼Úc°·‹‘‰¢•¤/±EÈã—!NX‘æ)êÔ6÷ÖUN†Zkák%¢/Z×ûAF[ÑLz^L{ðÝÓ•þå.¨Q2³ÈÞÒ 7ƒ}ës_uç›Ú•ê×ãÒFc endstream endobj 17 0 obj << /Length 1686 /Filter /FlateDecode >> stream xÚXKoÜ6¾ûWì­ZÀK‹z«=µë¦hšqNy ´Do˜j%G”ìćþö΃ܕdµ DÒp8ü8óÍc-7!ü“›2Üäq,ʤØT‡³ÐIÿ>“îm »‰Æ/×g¿¦r#CQ†¥Ü\ßNM\×›·ÁóvÁÐwÛ<ëñ]‡Û$IƒêŸm†‚…8NÜ3®twÀ÷F?à™'A´}ýûÙåõGEߊOæÑFæ"’iâfE"dœ‘Æ’‘ÂÓ!EˆÕ¶lš2Èüô$° L`ãÒà­¨aéN˜ß-ÓïÂ(Þ&yhø†•ñÀÏ»¾Û÷ê øËleñA÷j0÷h£sŠª'¥ŒÚQ5æQõ¼â,V@ãWº›í.óIeÉž€åNè¡7UgÏq¹ ºÞìÍ/ˆ7’±pMºQ«šƒæð¼LÚV½]wtÝÐ9°xÐtÿ›Þ j¸Yç7ªvïeºžMxúP}eé3hÏ«­bù›½“º·¦Vµv6ôö¦Õ¶œß…ixùægxÈs﹃vlM‚Jµµs¹v1’e)Åv—$qð’%‹øbxÈŽûpW͵څb´Ê›…ãº9 Ž­ÁÓ 0~ÓÖÚ9ÞŽAHdéX‘Dá"Ö(?S˜)ùŒ2ïéF^g(A(9h¸½±^Œ^EñÞZJ£‚CA¶ ùJ<ÑDVŸG4žÃÞž™A5ã]ŽÒÚ´ Vð%S© õp3ù~¬U;‰š³»Npe!~Eº,:¸Á×+ÅŸ¶»éWIÄgΤ4 ãB‚pxõnD‚÷Ú­U¿ ÓÒ"Y5£a‚Áʆ®5úå×WÏÏÙÊë±u2ͪ¿½Úq xõJ£_fDDŠsnK$÷åæ°B(ýEW#åCL€¹0?ûº0-= .­Õ,>(©Ö¯1ñ5•&§±ÈÐ!|~îð oéí¼HQ ‚((á àÌ„\-£À:…¾s‰ÌåjœN«q¥8NáÒdÅv·ZyÀÿGwY¿“HäIéw4æ¾×ç^¸®±.Ð-ÁLs!£x‰´(Y›0Ñ  ã@3š,q× ƒµ˜£ø‚œÁ'TµƒGâóSé)¯YúŠ p:c0nã—® U¸^èÖ,fñ,ìµï¼¾aßÿ4 Ì'µl¾2ƒ½a¶I“\I†Ý„´8iÀ^k7Q[–ÆÑÛgÝÁ‚ûþœ¡Ü*ÖÞ´Ž8ÉX”IQ@¯œ¸2x­o‹²T¤ñ—k¶ÄöA5µέYÑÍþ‡¥èWí²à?shÖ-´O긯¥^S@¯¨oZgö°tD lšlÒXŠ> stream xÚÙŽ¤6ð}¾¢Ašf9LÉS¢ì®å’2›—l"¹ÁÓCÒà‰™(ùöÔåúØFÓ.—ËuW¹H61ü%›*ÞYUªÜÔÝ],Ø?ï¶@°]P|ýp÷æ]žl’8ªâ*Ù<<.Y<4›_ƒoÚatí~j?ÆY*•õ¿aǶáoßnTº‹r•{"Ïy÷öá$2OÓÏè„Jé&)¢4É•(µ+U”dêšR¨M–è•ç¢×¹Y`wZFq% ÞÛ…i¼´æ5ÜfU|ŒÓ,TE˜p«RL°É—lÊ,ŠóÄ;ØÇ¹¼âvæš`¥"•žnÛg¾ E´Ã`YÖÐz0%QµfÄ_“ñ€>ÂÆá.G@×Ý…®Ä•Ágí„Ç4…j{´Ìau÷MÒ"VdQª“šÌ%Û•3øšÈ‹8JÓÝ&ò²bR‚G D Ø,ŽZ‹\»g 6nÔƒÀ¶o.²Êš! ·¹ªÎCúSâm3¯¼€Ç_-…n“ª4‚ÿÿ«lߊ²Ï!¤ “æLûc[[ˆY–2ŸÍ¡m¸¶Y¢¢²:w&ñ³Ã,hZgÚѼÓÓhn‹a¤ù\n:ƹ0A|`®xK2ÈîÜ&í%­+WÍ•{jtZÔ0à…“3Ÿ´*þX,eC;ÛcÀFÝ ³t—SHp}´®Ó ÊÂN1®kÇÖ1ŠsÝ›KHPÙ¢s¾&…ÄX ¸îÙ¹²«ÛF7s–ʵ9ÝX7‹/ f{ÙÆA•-m’è=ꌃ”TUüˆ‰W±Y¯2MÖÉtK›[4\iÀl4â=''μ@RÊÎN£Ã¤A¸ñµíàúØŸt'—-S覭[Ûëã5‹ðºÊV½v/!é:Ç—°¬ëbäÛÂÆ)7’D§vK„9h‘á%“,K‡5‚¿³GÀËdåWÂnÙÔ:‘·3u‹Y{™‡¢ý6>ŸP¥$²7Ù¦¯%]ç+"{Íëwmmú¹ûÞ8ð(ß›ž 8’‹ðô‡ °gàDS€ú'¹îéÖ®DU®EiÔDµ}/"áÆkˆ»©1 ²lÓS’e\ÎL8˜Ëg;â¨à½U sϪôÀX¤*ÞùzEb«®‘«ãÍäOëÓcŸ[ÃòzÖÀ‹rýn!O^(‰Ý™¸ãaº0Ø»ü1?oÂÆ×4†ûˆà¥7Ÿ ^8y©"dßòì—°Ì(w ÌÍ‚r3c…W[ÉAÙÐãÓ\ÇÏí?«ª ý4oç1 g¼¹1 u FâÈp/Ù4 ª§`]í]s…§05`+ÕøŽÅÐ DÛž:5Œ?z•îH¯ùdbì„YüÌe…ç7Š™yŒ­ôa‰Idù°M}øð¬e·×›ñµTŸf=WyÁïÌ Ç gaB‡/ìeŸÀ¡\-—=«‰«ê¼RuçÓnªvQš—›<.£ †Mšxa„ÃÅÄë©¶ 2ÅÓåèxÎŒ”~Çç/Þ¼y}} e®u‡sE²¢ˆªR­¹½=Õ¥"«öœ)Âm¼#±ô9¹YB©*n÷5<¼ˆ)à0J{)ÄøÆRH ‰NÍéo'ÚÑ“‰u…„4Bnq6ˆ¸´Þ…%´Ø½kk-é1Ün!¤&Ø;sÁ*0H-F ¡©{`˜ËÉNóuÐ$¨uÉÉ š¡°Â¿3Cgåʦóxž‘ðÆZ¼~†A¼V ØÃÔj$P§ç*˾(Šàí0ð,Ê^*ÂÎÐ ÕyFØ1¡™øãÇ32ÒB±Ï/¼–Ëš¯Þ $ÒX^žjÚƒ½Ö10G3bßÌU m¦>N-e‹ªª…ÅÈ„Òjj@MœÔNz |JF!À#B0´=¡Ú?â\/R„p1z*ÍËMã¼ +–Ìßb22Z^Öõ€ªž9a×°¾4±Ò ™'§Ð!r‚O†VàFX/' EObºòi¤½4!oŽ.“ŒôÀ¤1ô¶ã§[ú,T8šÃëxÔd ñ)€b•«ð½up§Ü5†;6ïh´C@>‡‰ž_ÑOeúþñYB¢Ád¯± ¨/á›-\ýúÑ’ ôä"«™ù¯vD ñº\"ßÝÿCÖ˜œ endstream endobj 31 0 obj << /Length 477 /Filter /FlateDecode >> stream xÚ“ÁŽÓ0†ï} «§D¢^ÛqÒ„[·jW ¥»Z…ppYÔq°@<=Nb»V€zˆ=þgþofT ýaP °NXÐTr\ôË»ÓÊ V3Å}¹¸Û§` T`Pžæ%Ê|ˆ¶ª¬©Uü©| (É`JS[k|£Cp±+Cý” Š+‚5x N©#Èr qB¯ îö 9,²l”’æ`E¤8ć§ró:¶6iôÀ•ü&ø÷éö‘$|º×ÂtZû±/lí³ÜRÀ »¾Gýðf'6 Ë1æuœlú<¾ÙîÛx²JÐfŠ>%òÒ$ÿêïïm—ú°{Ù<ŽšAkˆíÜìšh†'é»ÝáéÆ6–¢è™i‡¡ÌômµjCËʈÎ?Ôܧ=‹Š7ì(ª˜+ÖÌò\1Þ&ýËëùÒ¨RÒOÆM˜Ÿyhq~RÆ+zéH–Gq< ÕñŠ-_¹l‡ë]å…ªîÏåGÇuzS·6![¶:Æ‘ú¬™d.åkÒÚܾ“áúÛÒgØ~{ö“‡Q cœu«ô`å=õEÃMË+‹%Nƒoº›@-×RtB_¨ýšçÝ [ׂwaVL‹àó·9öÆoõBÿÿ%ã¼ endstream endobj 36 0 obj << /Length 2368 /Filter /FlateDecode >> stream xÚYYܸ~÷¯èG50­•HJê~;³Žƒ±3Yób;»Å鿮ޱ¯ãòÛSÅ*êj»˜¦Èb©îúJŽ7ü‹7‡h“IF{¹9•/"ÞýåEÌ«ì&/_üðcoâ(÷o^ݽ{µMö2øÉh»‹å!¸ÝÁÃöóãß6©3‘mào’ÑO‘îh‡2•›ÝäìÃKàÈ÷_ßýt{Küåï¼õîÃv'â8IƒY¼¸{¤O„øõâJ¿Llâ,q¢X¿t¯ÂXª™~)¼õƒÊ—%¬_ÇaÆKi¼TP„éf‡' íà¶×–N;ÜíàÚÒæJ†Q¼P,AŒþ¹ƒ›¦µuE†a|C«ÝѱéuóoÚ‰‡Û[ÈP€” E¸?°P÷öd*§œR*8iï¼Ø“& ,úcaýÑkÓè‚üòvŒT°¨ÚÌëÑYøZ*‘†2bÙ/¶%úUf%úªþÅéÉ{t®ÚBwƒšõÝè.f¸¸7m‹‚˜Æ Yy1A'¾&–aœLto™—­¶" ºÚÔ®›®?÷¦5!m¾éèý¿â¡f5ªšwŸû#˜¡°íÅä´sD:vˬÐC*h ?½¯Ÿ:¤"–™x±î«Ü)3£LW9Ñ¢½á®YŠS˜³. ~{ÛéÎ,ÉmÛ5ö؃ÐÞÄ`ZÓ”Ìé©fc¶NÆl!cwÑ;®uAÐŽüWä]õúáþ·º"ÉЗD¸®{¶•wÛ]uFc2Wóõ¢ WA çU› ¨ì¿փ&æ«ûÛܬDÛKý Ü2ÿ8êÝ ¡|©¿Ú‚säbŠçµbӢᘽþEƒ´öéúüüGìêÃÎñëÀ—á,ùÊpÊ(¥W™ôºõ¥Ê{® IpB)ÿ³M¢(М•ÜaÒª1is½ô ¤æJZ*LK—/§5µf©ù¬Íο2%®þ:ð6ûø®`êj"s”xmEàÙRYË™šÝà/ÿù<]Ó…L§’™¡y¿ÓAÝÒoçR¨ƒ”¸ðÛ9ß÷¹jÇJ=å˜R¶ó‹1-Û+©q÷KÏ\ûVÓBÓõWx¦X­ßhô$mv+SÖ·@: ,¯ïlîIô3¥g5ÖP_}¾ù|GCvÏË„)éÜB¹˜Ê;Þ1wCÅ^“dõkô Ž3ò7”5×É1×h’$ø¹ÏuCíÏ8cV¤*MqñÅÖHC[ÍmÉk'éï‡ÌáR$s)<0K2géjb¬Ö+晾Ä\5mXã|,àÖXp~%[!8îâôpD‰ à¯(”bOt'@i4@;@'dPq’5¨«0Q ¼ÜQ0^r'×ÿÝ}©÷W'2Ú.MÂlŸÍ=˜{!DðèLT>†ž }27´~ßÛÎmË@ʈ7_ÖmçÞobnG€qcàeøœÞßÁG,Ý.ðéCe‡5Fr¾-·¸¹4h À}&—„‡½·H°‘Z"U8Bñ;®‘œ¥Åüåô%ã}éuñ|ß›f, ØtÛšÃóT?[íãú tX¾vòÉÛµi1ªfWåG/‹`Mµ ¸Stw‘B& œúÒ D”t^X uým@ÁÒú†¨SVCEMŠþš“p%i<žÖÇ¢×´(I’ܺ~©¯ y¸—?úf½l_*`#?7P!lÃOœí¼( õÂW‰·¦òx†]èé8ëeSí´ ±ã<ÎJïñªíl×Û•á_ÔŸ0D|G÷¢ýé9$g3¼´°YwfØç›á(Èd˜efÑdX$@ # ÀøŽ,÷_º°à$ÓŒå1œå¯ ã¼ >sÝ™‚,Kþ½ž‡`‹SÝúÉ»y1MÐý v=܃Œišñ)\´Cwî)`)ñd˜Êtî¶vÁH\ecA©=6Ã$Ês‰GøîfµÃ"øàbªÓ*ìŒä­=XÂiÓsŒRñ=õ™ÚNý*”*Ô`D¨Pk‘…*âó¦ÚJÈfçfèÂÔïÑ¡§í±04y]¯5!ôÆ‚ãèÍwp8wß¼í‚~KmÖ¸(æ5Ÿ.ñ[KçÓì*€¬¤)$Uî3fF&=–WmÝ“öyó@53, ÿº‚X—k8øv¶¸ŒØfW8i“È9~\¡Ë|¡›Bªƒ"£éýŠQ`ûa‘m~N¡‰:P–)gyÂÖ€_7'ð«±á%¤„X=_«ÜLg]4òv¾}rëÜ7®·ÙW6…=v„“¬d빋 …#‰¸ŽÎϼóÝ;¾ë‘÷V ³ù:W§àZG]A>Úæg.bî-Ëé«c9k®T#·¦ç¾ígfgÉvÐ1ûð„X'N }Á0L=ÔÐÎu'ÀÝÿÑ Tœú/RHÅ} —Ô»i­Ÿ=uð%]œûªeô©vó ä|çú«î#ÂŽ¿©yÍÆ ÁY¸a¼DbZ{®´Ã-mí¸±ÔMyE~´ñ®«Íéóq:•«86½É8XùÕqòHÌté¡È­¢.Ýwµ 5@é<4Â"7'›ë’zˆfû}šãˆ”P8L¸qÁ×$éèÙ‘X9¥¿£ßfñ<&Ü‘]á„Yð¦R³œ4ÈFÜLrNÓ®~PóY-ðú%Œ›¶åWˆ‚ÍŒërŒ_<öd40âjYû±E1º†˜ãšÅ}ââwgµpŒ{<â¸w"Õ%µ=4G¦fv”áA󺪃¬îæ¦=[=Ãûœ¥;íÑŽ¿OÄlíGfþ¦BŸxD´ ?À\1ô£y.KÉØë¨ý"ÍõÇ|s™¾Îkã¿5µýÆHÚ´‚yGÎËÒ?zíÞ¤`¨zÒ…>¸º¿+uv]½¼¡ñ‡ñjåy‚‰là¯ýÝyט¾­o™Ö=Ëé‡$&».CÐgðho™¥¢„G›@Åcl±Ë²}ð®n[4"n®te¼·ìÊ.ù£ÑòzPœA–ʼn÷]gÁ‡yûÂÌZþ/žÿ-ÛÓ endstream endobj 40 0 obj << /Length 3118 /Filter /FlateDecode >> stream xÚ•َܸñÝ_1È“˜nK¢ÎäÉëÌ.xobç%Nv‹ÓæFǬÇðC¾=uQ¢ºÕcŒ¨ªb‘,Ö­ŽîBø‹îÊð.Wñ!,ÔÝ©y ôß/"í`ïQüðþÅËÓè. eXFwï}ï«»oþôúáíë]Z¨àc¨ÂÝ>Reðj·WJïvÿ|ÿç»,>äq~ÿÓœç| cE¨}tP™ºÛ{¸?G™ÿÓÃ__½Áaüñ/zûa·£(Í‚ Y¼xx?ï>ão)¾}¾¬H‘Jx?Ÿwqt°fœpø¯]’ÇÙí“4FÓ~Ò<¬í‘ˆL_éJÐOºle‡±·ÇÉöü~"¤atOVBDÓŠ`èG\ê?øO÷Æ-ðÙ ?†ixꎽn«NV¢µ;án†Á±2ýgK÷’$ipêHêpÇ‘:D)H£h9hŽͽƒFa ‡Á6L×1¤2ƒùU÷°•èIÊà·Iˆ?ãô N*ezs2GÍ„ž*{îö]‹›…´›˜¬“×#‰ûÞârÞöo“…CnlaóÖüãG|þ†É*S”0ƒ,¦5³H®"÷¯"c¡Àcmm¿Ê Üõ.¢­Ã,ž\™ÚMhøÙvȇå3ȼ¾;ãLÝàL-Sé²8U ¤†aóÞnˬ’ç‰bûšg|;§Xìu¢ÂÍrßO\Cô”ÜÔ7pÁÒaÎÔð{³¦=m‹œÿ2ý,ÝÚY­ÝYáü!³~[FuM„…LF-EU º¾¿íåùxž@$5À<´Ü“业ñ‹@|eUì3•¢ÝIJ î Zܼ”ßLÆé*áLVÛ“ñÕøþâÒÑvWj¦o…ïõy’«A¾3 œ%éN²úYÏN”)â²I‡yÉ™„Z—EsÞï‡&î¬î‰{±8ñ²}|;éJà²`9a^‹¾6!—Õ³°‰ÆØ/ZfIØè;ˆO­É·ÇkqÐ.gÇ×O¾` 5¹–F^ Ô·µLÊùˆn~†ïTµkÉŠ,xU£6ˆ(®#:ì€ÉU¢R)aor{¤r>ºLêHnöj~dRŸ§‹àÌY §^{Y½äS”¸Æì¢Ã|ò„ùœ÷6ü:8ëDå]” 9²‡ÎB<€FO…‹Yy¹*ï­™…$ܾVãB½=Cj_˾+™ãG?Ù×­¼ù4z鑸v“3x’+Áa6/ʈvM?\D œúhFö-ï˽Ñ[ßkÓp‚ïd¨.ã3sæåËêE+¦¯¶ÚNü…'AÃwTªH¸^G©–)õ$ö¤G#z"’w¡6VˆÁ‚æÈ:1¿çNO…œÂ¯Îqç’gÐâ½›ÁòØ_Ðqb}ÙܸiÅ´é*Tt8ºF?ÃêÄht *Žf[N’(øeöEˆC2ç©×2o àOEÍÆƒ _?âØ»VFPÈ!I¸_Û(—ÀíÙJ¯¤“NÉ4L«Î‡k HïbjæF‹ ¡®“ˆÒ!ò!ðF©9:ôÆ£­¤“B'Ã¥vœê·‹Å’÷H§É}µ‘ í8ÕܴȤ߭: T”/ç’ …k~·“#Z¼ª*Ð<(¶q¤ƒù¶ólá N%¯—Ô.¶Ò·³¸ü<ºaŠ*¹ôéV> )ÄàÐ÷øø.¥pΧXÖg`#‹ðã ‹”¹ràeš–4¼¡‰„CâëZ æ´•k­koç/ÏvüT–¶t9 ²'«ex.#G—18> stream xÚ•ÙnÜÈñÝ_!ä‰H4n’“7I– l˰å§8 ´†Ô¤c^c6¿žºzHÎptÀ€§êêªêº©ð,€áÙ:8KãȲølS½ dõ¿oB]ÀÅâêþÍÛ÷:< ¬Ã³ûÇ)ŠûüìŸÞ‡Ûë›O×+ÅÞ÷ Va¼ö.Wq{ŸWÿºÿÇYùi”žÁÿ:å3߃(¦­‹Ð“øìb²÷í 0Êùßn¾\~À¡òÞÝÉÒ§o«‹( u⥈âÍÍýžzEϰ‡Ïó—dÊcÅôüV´¦\]¨D{›¦ZE©7T<Ý™Öðˆ—mo:ž?؇Ò6}±1¿ºÈT’ˆ2¯iy»ú¶Áaâ•&oÎa¸Î¼¢â¥|zˆÑë‹¶²5ÌLΈocÛÍPwýï+ž©7vPðla쇚i.º P¾íÎYr†YÚMQÓK),ÉêÇ¢Fê®y,ÚbSðäçJk¸©ïͶ¨¼.TþZ)¸3ó3)]ºg1B‹_Eµ+‘µ8UÄ®¶ ±Ž‡ ²/MÑ 0“ÎûyáÐÙ®·‚{¨ j ³ëlnö`¾K^r[üÚØ'v,ð–x¦EtRÄ[TâU B`I‡Þ–öO#rTÞ†¹0 o#©×tü8aœøa¶ ÐYv`¡…À~ èBJÆDô+Ç4-°^€Rð¨l(@µ½Ä­ƒœ.Ý,ôM[ï1‹âÔWA("™˜ÉÛ‘5ó“(0ñGÓ7 Ü©^ó˳1ÀƦ©»b;àk!¼í:ÒpÐû¼`Ö.º‚÷äµ€ÞɈf×6ÛÖT¤ù°^;*.Jû³-d•Ÿ¡¨f6îŸOESñ µQä}C;‹Põ»†Aø…qôØ?ˆ¦ÿ­4ü?ˆª¼+:Û´­,üLæ*xèæwòœHæ[s$ ¼b)ê ŒY°ãªèeæ=è –ô wÅgàpâ{p!]’>êr5å<‘f™¡!I,ñ>• v¾¦Ù&ÉiÁQ1Úasàä-ØÔjt“ìF@õÐåá%²¾µõ–¬|½&냟©(q.¢Äa×LèÇQ|ÚzìqçÖÌbr©µ'''f bÕUÓ9xù0q J(†:™5iPí¶$‚Œn{äEû ˆ#Z§#:³ÐÉ; łۣåtÝÈïðõZÓ¡ÿFH7q0ó¸0•p$qˆ® §£-8L!Þ)²ºwö„ÚKœaBÁ Š `{.ðÔ"¬ Œ’”Ë!á<Š‘[†îêuÃKe!·X/Ò½^tItûK¯½jQ’N¢Z”ôIrê)œõaä`ÍðÏ =GO6°¸kÞÍžr²“LŸáq‹Xí „ÜCîd_6¡‹…uì[@r(2HÛz‰µ OéGyY·‘5G€Ùئ&m†Õ\@Ìs^y`0A ù’à$o2 fò ½V2 4Êx¼ìê…GÊ›}røöƒ%œÃ¯Ó6öÜ*:΢L_€CÊižQÐÑS'-'¸•£9âæÐ ¬¤øÔ­uËä ®âT —À~ô7*pˆ?e_¸zÂyà;“çò¶$ö¶ m£;„òjItD/ïæE†¿ÎÜù [,ƒW.þcx\Ú­Éå8`Œ#¸šú鄳M:2$‚ æf1RT ”¬Ý9˜/ØÝfèKPe[>wžÀÔN8Y¢ô•îžØ%ùQxû=(åf {â.äøÕ$w8¥L_!ס§@£ŒýÕð˜Ô~ÑÛº1jR€uDwÏCyS8 _YÉXJ DÍ?›ýK6;ôÈ½Š€b‹Ñóa°‹‚»:aÖSa}³¿ú§uí3†hÄ£³±âá©é§ZâœÜ®³™¶à<·XdÌ£(®KT¦d K|G J´hZ¢EQè'I ªCtýM`feœ¦šS š‡V.x0]A‘Ñ×nqÔÝ…ÛÂ8ô•ÖOÞÃÉu"£ÔÇЩg‰ÏfÄÓ£(¼FgóW‘³7Êñ3®[Òg¸Zk¨¼³—‹RA•%Þ_±k-*…g¸ ô™ž u‚ôS¥1hln·r‚‰Ž‚ 8CçE+uY. ¹p5/s0ÿ¬€ ’U t#ê„~°Ö³€‡EÉÞCPâ:Ë ñ.Rä?`†$À3_óYN:sTûôFòá®33ô{W–³¡½}ŸFèU ‹Päà ãÈÏ´”‚÷7_>Þ}ŲX{7üs}÷éÝíõ*‘õ[J?HôYì«Dº(±"?ˆÀ9nÜݾϫµò.¿\ ZFDPŽ&SDc«f×çÛËs>ÿîöëý—Û«oG¤i0ž8Z&M¯gè.ïD̓ÔO(ŠÃÔ×J6…ýwïnßß^_^j_¿â’CU…»½p퇑ˆ?¥O’À»s§è&¬\‹â·¦UqêôÁº¸rÔl‰=—³šÝX$ÐÆ]S‚µËŠÆØ££4VââÀ»ÆM±ËÄà'™>(ìÇpŸ:{LGSæºW(?HÑ«ÀúO‹53–®…“Ë’$j¥L{Û%Åì4å䉶-lïffè›–û+iÊ ¤\û,–^`h\«Æ|jµœ" ×ÖM[q "É`’z8K)w1"±K¸J×B"&I ›õé†lÙ\.¨)lÃÝœÔc¡WáÀ-Cíß èQÉêšd¾Þ;xW€,憑J\a‰CÉqø=ÐAo¨,xX¹£*¸°£RÝH¸\ƒÄWÑ+"3…ˆ—˜:D¯S_½"ø3¡Ïû5W¬*áæÆ’âC C¤“fe!M!ÎEñ\àÑÇ„ØY–ȤY":‹§4=/J;Ån£T™ðõíDº„ ¯ùÓ‰ƒlÉ“ÈÖÓë:»­%ÙÄÆZróûhe±Ø? rtu½ódÜc˜Y¯'g»Å[ò&ˆË°ó 0m)0VçØM!1f‰¿N“™½‘g€‚¼ ·" ¯€ÚP¢Cq“\^Ô¶àÄ5î§m5¦BËTðaÁ2mqÂÔuV9,,&ò* óÞ7I!ç[î}–Û¡2ÓmHC¤_2 TÏŠ©‰€#¥hw‡É ID"§1£±$줇‚z)içkT-j”‚(¼Ü®žÖÏt û<6Ê&]éFíµ–'Ô¦FÊ‘ͱ^RÂ3,€¡Àœi¡’Ás9¶Ð„„URK8 iýj‚ºp‰kìGq:MlP´…"r°²Ì‚ô5ñ ‘±ËÜ4-£U¬œ¸ˆ=ߎ×ðå8Ž¡+M8áh ê2¾¶.Ã+öu^]ËâÓ išdOë ä’ÊOÒCÿ?õI*Ó^?85\ë,ôèp—»Z@ÉÖ ”DÀ‚Ô™™vuŒö8AÑûì ›tNî*‹­íJsh›¦YèÜqÒTþЩg©·ÖóWˆ8Î&%åæ®‚ßYÜô%Ó¥yÜÏÑžlÌÛ8šµ•¿ur[ Y+©ƒˆÖIkH{ÜLD<%°g–6ã[pWâõ¼3³1‹® çìÝq™b>üÉ)˜R”^öü]#¬\EiÉ,iXÚz;˜mQáGŽ4#¿ún)‘Àü2½f‰ð“>-¡ty…O{†q³x‰ÆP>‹ñûº@ØzSöÜ!RcUÓrÍÝI/m_$Ÿà.Œ¯z9{ôJ'DK><ô3õФˆ³DNø¨±¡ТûáÅ/ÏŠúÍ$Ñ\ÈruªŸ{™1"Oebª˜<²©Âhž@q^‰?{™ì8bÕòÝ5é‘ò(sÝ—ŒìW¾þfè'£¹v?ü' h¸/±L„«Å!ЧK0-Ó÷ᔿIÁËŒîhÞÑI¹±‹Î餤ÅwU»²èx*ž%¿m¨TÓ‡Ú49îIáâ䜊ӀC{ï¸ßj‚e(yU\+V¿ôaX@©ÓˆGP*BýåQ¿ Ar¹‚‹í(×XˆíÿL€?j:Å¿(‹z± <…³Âkûh6²dºNJË2Äà˜¨<¬!»¸Û´v×ËD¾Ÿî7åØz 8mSšöÄ×zé¾íl¹üw1w cå€m ¥çiàü¨]绿ú?XŒ endstream endobj 49 0 obj << /Length 3122 /Filter /FlateDecode >> stream xÚ•ZIÜÊ ¾ûWÌQ Lw´//§gÇ öCâ—Kœ5RÍXNKjkqòÛÃdiéÖØ hU±XTwRÜùôÜþ]…'?îÊæ…¯Ð¾tt$„ã ãåû¿ù}Üþ©ð‹àîýãšÄûêîoÞ›?¾zýöÕ!É#ïƒù‡cÞχcEÞ/‡¿¿ÿÓ]ž²0»£ß$“=ü0â¥cpŠÒèî¸Zûõ%QÔýxýçŸß`{¿{§ ·¿Ža$©—ƒÄ‹×ïçÓ'aøƒëã÷ ‚à”Þ¥y| ¢XŽôn{3Žq”yf¬¿Ô•©,Ïsïóde¡ýÏ!ñ}Ït7-ùªXè.µ¹'`{Õ!ðjÚxcáÃT3ëâ8öÊ5™Ì³B­¡i˜{áqi;ÙbçÛ3dÞ°]-»¢Â4¯éÍF/qaê]Ï2! ¢SÈÝí0ÒU¢8ôÞÔ¥m—7›ßœzö *@ Ôå…Qx]¯{++ÏÁN²d‡²Ó·žÀ”Â{'fìÖ[ó«-§Ñôy^èô}÷Ô›Fß0 ¦­t«ÙÜ#‹¼¬Îu7Ú’6„…¿æUX$l#ðž®ÑßÈ£³Ã=Ö phÝŒ=GSéôÉö:<}ÏÅôcݢ´f°²zäù†âÚ¶ìÚ1…ôíH˜;×!æží™Qñ´k¬l² °b*Âl8¢–wŠFÒ`ªºy}ëqÂ11Ÿ˜©4èz=˜ÁšJ'­>×,Å ?ø‰}n++²µíqG¥ªå¸q–x8žÓ ¼Ï—àLM—·Ä)\£øâ=ڞبDF\×iZo¿`í‡8#-=ž;:h@j—g¾÷VÑÃö°ltÀB‰Ã;X.WÙ~6oeAe>Oõ¹“ û8/]¼æ×£ù&ë*°ëm:¿,о¬FÐø õ‡[ê'u²É)Ízf'¿H帚úÞ_9¿˜üBy 0)â¥â2O}à ެ—uU5LæAô'½vzƒÈ sÉJv L‰u7Dªú©;>.JŒW—]s9ÛQ‘Y3éI›¯¼ÜÂ$•ÄdÀ¥}ØjÇ=hù¬gÀü<™31½üÆÖÀ»I!üÂBH…å’¼¸ŠrÁ) 8ÈÍKuÅÁ¯!ŸÀ¬%J"Z"}™H”4S”nm;Ô_ôôøºƒ´UîK!‘‚Zœl N^͆aÙEìAÃN’ _ꥱx®êÞÖc7ÔL#ùðz5Ø7n¸o"ðï¾~úÈôaSJ™öÒ×âsV&€Ù^1oáùÆm([¾›ÈÁ]$lhq‚°Ðµ‹m#!-WŠýD~@îOŠH+ñ ¯$#Ž´£W«û(GЉG"Q·Çš›7uFâ¬X¸©›Á&lné¢Ç½íß^¬€¤Ô[òjVÏ©0ˆ¾ˆ]D¦ÑuDÖuyö…³gÂîiXÙw[ÖŠ^)þJÍ {Í7b[Ît±+YHõÖÅo=€ºF=x´{p‚~šäêöÈŸñž§ù+‡¶çÈBΟòÌ%8êÈ6^;Î93êáÓ€ ûL¬íÜõ2UŸ׎)§)@ /r2îÿÕø‡ºT2¬¦y.y iz­/”ð†Ã]§I˜zÖr¾V¹rbë# K*«¡ (NYmu±ƒ®•¶¿wyƒð"Ù0Í‹F»—¬Š„eãäbÕZ‹ÂFÓÈxìõäf½]<ÈÌøN ÆbJ!¯Á°F§ê†zPë8öo0¶é›µAvVŠ´Žñ˦€˜ «…ñ¡(/´‚SQÍ¥A†”y'€É]d¸ÀKÈß CÝðØi òN×bä.]¸Õ'}/K¡4º_ÊF°Èì:!â"}, @ëHÏàa 츷,ìçbeÒ'ý^={# ÊJáx¹Ør]2òxu^ y¢<\Á”g”u#4Cd±*Ö… ˆFáí\ÂP&kÖú³s‚ÚpVß48›yš4„X]¢óWõÎÅâW%§"¸Òe£º¬Å¯K¾ãk]­ÜYl³5g­±KÜz™ µ®/Š«xPÊFÉ]ç3Õîq„Iý ·3½UkôO©Ÿn/ðð#c £Ô À•°Â)]•ÂÓDd 8Ë ÎIèizrL_@×A®ùãàsÝÓ~4JÍ`Çi¤CH¤ÜI8åbëKOT¤]U-WÙù³¾X[ýçT"UmÙ^AýâJË*3^ aAŒÚ^úÖ'/^ÓÏŠ­ ÊkAÝ„H+â8’JOH¨—5±D‚iû#”~G0» pö#R³3A剂ûI7‘PBR‰¹j­€•9JÕÆ9E¹Ëº ž¨NÛ7ÒN-Ñ1™êŽÒÖ=ËžÙì¸^v}uu¸l%Úd+Ä_ãëtdÅØJûõ—“:Uò›„†z„á«nÕkï¼Îüó•ùë¶ÁÊz/FP.¢î*©‹6î$Jíqj÷ÛG±8ca£ÛòŒ1ŒFƒÆ™súTËzªõå\©à1@g0 gÞÚ²®¾¸(̤*IWµîšª¹Šì• ¼*DݧmPX¿›†“4ÄŽ¡òvÎJ¢Ô: V¢(%=IaÄO“+®tËHéÎÐÍJqÉl¥+•JuŸFWªàœHD.ˆ½ó\}ÇZ’¬ÝŒAüß¹E+ŽBJNÌÀw £ï8(¯z¡/æ@Oµs ù®!Úu$½Emºíхή¿´z“´b0¢¤…Â$gÚ˜jK'm»åð3éÛªBt8¿£XŸDƒv g\.¡}7¬ Qœg¬ƒ–Ø:‚Hu?ó4iC›Lö%ËçE"¡C$n{2Ôv(eâ`JÀ)~D¯«·r"½5çús‘o;GÂF_TKÌX@„Ãi-ð „ÑI«EBWãP±Û¢нõS«ž—Bëd·þBsà—ƒ´‘1š™_msán 7Yv~ŽÃ…¯ÕP±à®S,hWVÐþ‘®0à½8*âÚ)Šž/ÃÂmö“ÐÂç>Io*iˆ³oèfÉUûˆãaâ«+Å\YX™ø±dùVú”k;¶v¬Ìª[ ð’}ƒ@å\¸“ûK¬Ôœ¨®zJ¥Ñ,vE²Ú+ÉŸ³ŠXYæ{‹èâÙhÔ›oñ^úôºpvY$¨€¡RŒ½ìœÀ¡¢Ù¯õ“l¼Öe\4åÝ!)"²µe `râ0kx]50–}¦ÜK÷†Êv/3o|÷º]2¨Pâ¶q,@½¬;ÒŸŸv;^Ì ßqô=GÓµ£#d¹ö¦©É®*‡_%â–@¥/W» ƒâDÅÿgWqììJJdPÕ&û¦ý‚;ª{ÄpvÇ0ôOQ²Í;³Gb¦ÇK²Se|ºüùÓåëÓiJ-§“¯üÎÜ?ÅqnêÉCÙñšk\ùÖE:»b+rV]áðKÌ95Ü´àh®¡Ý¤t‚ 93&%1çÌøJ–œXÎ݃ApëJ…Bmá®°»v¿Áˆ's×€ûZhÔˆ8A¦Ü«ïi¤Û7 éL|™hÛ.zŸ$ü¥‰ŽÛ/dÈÁtFóXîn–¶îaÇä ¹ð%Ç=Ô PÆá»Ü¾ ²X ó)jö˜ºf•†ET¡ó0©ˆs)X–)´h>ÅoÕÆ«SêLpÚm‰PÆÕp%âo>>bÊÚƒù…4’š ‰ß¢yXUHß_ÔÀ÷—\“ÆÏ¦~ø‚97qŽgGGù‡ÎÀCï€3gN; ô~©ñ+-ª]Ë>üù%ú^ën\;­±CãÆî’Ü{ãÊ—+ËØ_­scK.Z›-‡O%}Ÿ©,~=JRé”àÉðÉÈLú™ÉlÀT¡.ßC Üês1þpzŠ<ßs/ñaÍß“t]$cºë3£DC 0 î—6ßä€ÈL%Xc8׺A¨µn8Ín?òk.ZNŸX+8ûÔ,×–£~’–ô1CúXÃús–¤´ÀRè\÷w{.Ê~a´ÍQ>™‡wŠ/Y®ßF£ËÁ€†NŽ×:V¯‡ÍäÜ4RÌýl^ëM:URKj‚+o[>wg7Ÿ»ƒ«ïÝ›ïôñº£´ýÒ±|²¶ÓÉý“Ë»ÉH2 endstream endobj 53 0 obj << /Length 3283 /Filter /FlateDecode >> stream xÚ•ZÝܶ÷_qè“ð*¢D}¡OIê-Çmì¾4  [ñÎt¥ÕYnš‡ö_ï|Q"wµç)r8$‡Ã™ß WÝ%ð§îêä®ÌÒ8©²»Sÿ"‘Ö½PR;ÁÑ£øæí‹¯¾ËÕJâ:©ÕÝÛŸÅÛöîÑþöÕëoy•E?'Yr8ª¬Ž¾>³,‹Þþùö/wE—iyÿó’Çüœ¤uUœÙÝÑë{÷ p”ñß¿úÛ×?`UGúQš^¿;S¥ò"ª‘Å‹Wo×Õçiú™í!Ågö§”Š‹»¢Ò±Ê4/éëi²ýK˜¶J"3Í ÔŠ2:u´¤´žIXZëèä(¢Ö0aós¢ôØ7£4ÛÑØy˜¸sX¸õ4;XÕ(]B2™eºŠ‡óUY¬rÞÙ4Ü[FKßpš¤f¦Óhgùp ·cÓ©sÏJ&Fü*¢O‡x@H«¿t™E@ª¢?"E]0Ü•D–Ô¬%ºL#óRºÍÊwkxJó+± ¦„Š‘¥ <‘ì?ؾâý“°ód•ã8t$G]ÓyAOk§y´÷‹•UæÁy!azÛäšFûéÚ´®‰ Ë{XäJx:3#iQ°¹o&³ ;7Üú½ïì0›S¯Û(ã¤.DA;\ý&/P¹,/iíʪÈHèЊüÔ™‰?šÇÑ<6{£Ñ†Ëa™G{~é>Ɠù ô²!”rÛ‹°‚u§Ì`GC7j N5ç ëÒÄš Ñ\¨m§9­Pª7ࣘ–¤El¸ü„²º¥7üÝJÙ;07OëÍÊ2VÚ·¼ª.웊S•¢y[»lk›•/™À¬¬â¬¬CÅlàæÿfÎëUØ ÒÌ`ŸÑÊ—Lé™!`ϧn±\gÆìøh¡ÑÝú,:Ë_˜A—øÞÎÒÚºÑYôƒ=ù—WTó¨ò¸¨òPA³øp,Š$úûÜÄžqȪœì›¼Úãf]±ûD6«žÅ¯æ©³'×…æ™Ífì¹’— æÖ7ÄŒgƒÊrܸë{36ð¤ ýÍ* hÆJVší²­]%X’Ÿ¾ ^WÑS3AÊŠ­Iè¸{&•ÆžÓ*œáÉ:"éóműÔ)lÖ&L³h+:Ðtåm{ÍÓÆ‚ø¾£MË£(YUñIøðíÊ}²ÓÚ¾pyf‹®îÔ\úÁ)Û¨LRކœcÓ;ÖTˆfBmG²Y€Ú(–CÀÔ°=,kd¿ã#üÉ`Užµ¢ï¥‚Ö[J]N©´ÿt»aM:†¯ß½äšHò£ŠRê-ä;¹¥‚ÌS¤²³Ò˜Ï-êO»;'ýK‹½e`k¾¶± T -ž1y>&i…”„•†)÷¦2H_K[oH»D²X%ÉV$YŒa3.›TÀÂ.²tÐý<[R \1_ï4œÜYéOXý…åÏÏÙ4œ|bSfNrF×>EáÖ8ùæ=•›€üGóh¡z4F¬ß´6Ø «ì=â`\ÖÈ ûÙÑ£ á¢ôìãÀC[Yµ¾ñ/ ö/ýžÑx‡Gp“"ö¯×HT¢wåâÞbTÄ3‘OyIêÏ"É"wøz/­.t;Édë+ ™¤áæ ú(¼èHxùÐ(ÂŪë4Œ½XûZ°¨oeêB€=œØœ†‘Ž*IéÞA…¢üþö:ó€Í)Ç4HH•8±…Ó=Bøy„{ñÁÌÂŒåÀ·†=:÷) «O˼M%¦ q£ª1uÀCñ ùÕªöŠÑ¹ þ ÍÉöŒÑÐIN­ô²A…‚—†ig9Õ?¦¸Üçðe(°{«,®v8·îêË”h'ÙTk°Ä¥úRSMS𢋨²ŒØoÅe•]\öøm¨ŽúMjp;(ÞDËæëd…àüE¶‡9…åÅ•i¬êü÷.œ„‡Ìð‘ylhXƒ&œ— !tîœ+(. S¥ü厷`z¹Æe뤼Ėl$ªöb[U”qAñïÝ‘uFy˜fˆÜ]’ª”$UFÖÔþÖ´b…؉’áÙ]6jdK%ªþQlJ Ø Ùñ¶yƉ¤|öÞ"Á¿Xa(ƒU_±às`èºZ·–ø/a!"g£hÒ[õ“ó}Ìd7H@÷žE8% ”(ÀýÙGJ¿´\ÁZ\Ah¤%„ ,#úš¦P6ÌPˆe8ÂÀ•aëÚm9Ib% )[=ÖeÔmk±³? ž| ¡‚šžwÙËg(@D?Iöì|°Éüj=‡u>ÙÆEjLp©(!¤E ûnnCÂCX[/¤hMvö†êwÅöÀSkòÔrK;#xjðÑÑ&\†ÿŒ¡<Ó Ÿ– E®Ì»vÁ@İ ”§§ï{X@nX.Xàò¬S€À—XÐp[uºåÌ)0À–-âoñÙ°ßÙ:¼ÅíŽsÓ÷‘Ù3®e²VxúYÎ[>¾§4o¹Æ®Œž?¦”„æPxÞ7m;Í.Ó…Y½KîŠõ˽PóÀí+@‡O¶Öòªeg› l(#Â,tIœ%͇°ˆy½‡ƒ M-$…* ˜|õ]žOJ:.j ÊIÜþ $Á«LNOHB±¡+>cäá¸,‚˜¤¸½‹¼ îSy%&{Ó´Š‹"ÀI[:vSÆÖµH€S ‰$ŠqÙQ?Ó—Q¢cðПq-»i_Ôìa }žÏü^?ò¤b‚uÔ‰Kס–í¦JyÙ)«[ £t«²úbñÓ~¬1eí–ó9 £ž×Ñ:®ò•‚ KNÒ Nãp/£iÄhEðÙ±Ìv R‘ÞÂãÜ)áV~¡eé:Ú Dii¸ ƒœ”‚Ñ!;q“³™‡tUcNàû¸FJÙ[ŒK譼ߞòŸL뛇®uœ”é—ž9›WÃVŒÎ|µjŸ=sUC]}‘•À„êb2w Ïžr”—ï› ¾ò;3ÖOèɺÏÎðs*q s?×Énç0Ë<ÖiXyV߉ñ‚ÛóÌÝ™“˳H’e - Ö˜`ß­„!&PèV˜ìKÉîçÿ*‰¬V·´¤(àD¾Ü—ÔÊá…T,CÍw4på·,C]§Ÿ± u½Z+`?2 ·ábÒƒ@­a¨‰4#\‚0P ãNÉ;ûîý †$)b­UxÏÄFÔÞÆ[YnŒBnoqñJ[æ´üÅÁ^dR¸ÈD+øX8oý|2'ÉÞчdW¶áEè ÷ó1’‡Ðë¨+å€0ö‘°Bßê¹ÄRy–i”D÷5Jœ®ok>w|xç xSø »$9Ü6­¡8í[ì넉÷BÐtþ/Ê"²ý¥«—ŽIʆ çý /1æ|l!)¨ìk\c°Õ/ËsSé*°n;‡Eül²\öœÔçx(íi˜$eÓÑÎhæež¶ ¥v(ð×üôNǽ”þ¸Pì¨ÿ’D+´--ÏPZlWÏ Òk’€> stream xÚ¥ÉnÝÈñî¯râ$Éîæ’œl'˜À˜™dä\â È–Üù(s1&>äÛS[s{”ì$ öZ]]{U¿ø*‚¿øªˆ®2•„Q®®ªöE$£ÿ|KëܬV¼º}ñÝ&¾Š£°ˆŠøêö~ â¶¾ú[ðöÇ×o~z}2¹ ÞG*:ÝĪ^žn”RÁ/§¿ßþé*MÂ,É®à¿ÉxÏû(Q4u‡*UW7«¹w¯¢ìÿ㛿¼|‹M|ÿ³ ýôît“D©Iƒ8B/ÞÜÎè›$ùÊýpÅW.Çq˜^¥¹c¥§Áöpz¶±Øˆ‚Æ>”Mkϧ$FË“S[òdw×—®e]†'8=…»›èÍo¶šF¢‚‰¢ üŒ`¬x{4 :}®;µƒ?§š7vµ{ènº;€l‚vìxA[($/03Valøe?ÚÉX—LÖWî®qÝh«’Ç+9×Ñg*[^6Lw­]ÝÉöÒ7FÛ·ÜÖS¯›åfÓ052œÂÍãpÆË„Y3bß#ÞI±¹x¿Àè]w "à/,¹+t†û®ç¡©å!¼ ðZ–¾ÂCÜÝ)øâØ->ñÖÃÿ ›ÿ8é, äÐGçY¿à'ðÝ0öînr‚‰¿Ó–Y¶Èõ‰iðP²ˆ ²1)r¿|ͤ(‚—ÒÐÀžüËòâˆü8‚üi`ß'ŽOJ4ÛKQÌXq¶Úˆ!B1\£u)e#È l¹Ã–HHlI…©ÈSËÃ×% -ÓC ‚áÙ„è*|,eo7ñäùß¼¾ãáÚõP!‚.Z {(YŽI×›cá8âaÔ\(†Ì„in¶r$OAu_w-aJü[eÉJj­ƒjq´Ã%:&´+×’¼&ê9y˜Ù!#"ælf«:ÞàÎeÏ#LÛˆh&ChäàÂ`4“µÑTY&2ÑÍ'k6†Õˆ¼Ð÷r!E&¡JF‘o = ¸,RD•hc°ÐÈ€ Iü,E©Ü¯ØÐÙ˜C8 L¦Ì<öB¬é i8 ±½‡Ur—HíôE °ÑÄèF;£ ãrð8©)6Êä -P&Ìu~ÔäÅÎÆa'èFç)wÓxÃäfÕõÞ"«©Áа’õ†av`ËÜ|8-¶²¶ƒ_ˆ”…d¿ìP8RÇ ´¤h(¢Ìú,ŒÒxËùVîÞG±®JQãÕ¦£SÒ,8—üõ^7ó\ƒÖ4t2´Øë²ôó6v±YPË‚ªqkO ÏùÁž?€g’szË.¼Ö(ØÚ>Nýê.H†•@Ïl‡¡ïzL½"ÁÖŸòo€¸‰#Jr Ø[ÀÉÏÅDºk¤…yÚ¤àúqëöŠp|×È.´ …CôÚFu&ŸQpçªÐŽ€¥Ø„^&!+ä˜NpÄ#rù"pÜ倭«›él¹™Nw7Ëøf<ÕÛ{Û¯Œí\y5è/êƒXš(¸[Œqë ³l錯äõ\‘„ÁbäGåºs‰^î( E·†ª5m‚xõ.5cŸ›^Ê0Œy†æ ke‚— ÒAâÅq À‡I†FÅñ3,Ç…^ïø”±kKi’!†Ý‘ÈáMZWyȸÁ>LNX ÉÆ ¤õŽ„Ãï ‚ ‹ØlÌv)Ñâ,jˆ·&ç†_É 5ŠOèd‚?ûœð¾›%§kÙ¼‘„$Gn |£$-B ©8†ùAt¡8º)ÇÄkºœÒ€dOO¶•dw±Û.¢ð hç“ãOŒ†˜oçùYÙ(„ÒÀˆOKƂݯÆ(Öƒßj¹Öl’—y$/~™¼ØB­ãÙœ> ¬|–3›æÿ#b¬Œ"ßÖrÏ^ä2óGV'² ³4@u‹u^¥ Œæùãïp©x‡5Šæ ^cô9¯bR­ Òj#v:I9þÄ•^šeáaP›,,´ùos æ [vlS&©æ¹T"N²5ÌÃS¡gÚ/™u)ÎqÅ“ª”<¡J,dŒœW%¦v‡i¡·‚¶Ö¯<9Ð/HÒ±ëIs4¸²@˜¹x”JñÙïÐé`ëI›"°Iíñhá!@¿ACú—žG%ú†p÷H‘vjŽÆ¹0ä3 9ê*ƒ‚aoŒ'%DsƒŒôÖ'¯°L|¶zv >ƒ!*!¬'Ÿ&wXíüc¾KªÁ®²î´¸€I.®PdŠ~p•l¶3PçÁrÞ¤àpµÏÎ`ú€¢´÷€øÕÊ}HõÀ`=NVõsÍ®€ÉûÚÁ§†²ÊâIgw”îpú¦"©Æ»J$ÇÒëÌF a¤‹ ¯Ç;TÜÆm°¶*Ë/Ç §VÁtí£kˆ Š#_,l>6î2<õ¹™È´À˜ø¾¢zqÙÍEõ%›‡¥ z§aBnpU>º“€àŸ¥¥º _ÊžRg7pØ(ÖÜU-=º%|7z¢©ÄƒY®k>P¦¤t Zˆ\”Ž×^*ùü¹aæQ]Û~:ðÍ Hz‡¶=, ±»Â„ÛW¤dÄ´‘6{í$fgÌ¡.ŽÑQ«uÂ9Ö¸,‘b®fá&ò%Tk³s£× Ì“ U~PåR¶9TÞ5=aèãFîr,Ùa%œ0rîxém=HD~L#¥ßŽï5#Ú" $’%!²\ÅítROq=‹¬òœ(×ïTû—j?SCI}ÑöÃV .yý¤ V2w-5RË`;¯:;+uiAÝÂRMÍu¶ka-לt¤}d§Ø›ëTq´+¿B‡û±äݤ#GÀY¦qö?¸mí㙟 ô÷e%xÖâÌ“, ó¤Ø2íˆÐÚ3DyFÓšµ’ôZT¡åR“޲bkTª}–Aµs)°û¢¬Ïxp’ÀQÚKù{v¨zÈd© ‰ÎÂÓÆÕ‡|ÄÒq×çWÐTü)a@Àu”ÔVÖg˜óUÖé2É!øO;´Ò< 4äµ–ÀG 6ví U³7xe]°¢±c&& óH}{HzÅ„Ú<ÖæažÍ0jÁêèNyÖ¿àÍ\ßɤÓd£i“HX5 £HÝy«íÃä͇ë¼ýè.6y·z_~±²JŠÁ'Žsp!»¬*=ãkØ_ñ„˜#@¬›= LÈB‘i®¨Iu„›¬b X×Ö Ãž?ƒ“x€à€» òP\̰ÐÓö—>s‰HÜ ä™ë§ ƒ±sgÊkî“JTÖ‡\qdT o)Ãâ[³¶êfåß•GSàù¸¤ç²<+Î’˜æ#¥¹^Y)zñH£Dkï5XKç›fxÓg •õg`|Äz3ØÕCðòÈzøÂäÇý-’Ojº“../žiÙïó Çà£Ô•é s§ÕS‰Š–§kN;„ž2j̼ώNPþ‘ID&‹_I°ÇþUhŒ9$•‡:–£~Á“H4´Ä–ø=~nЧ)ÅX°ËåØùîrìÔÇöS‘=…Ïw)¼öÁ Ž$ç€Ts@úlúž†1øì¯¤ïf9Ò×wº|%7:ŒŒÚrjS–ÂÒ ¹lZþ<¢t}Ù–21AäíÆ wd†s›£¶1Øêíòydõ ù>™ÄâdùÄCPeµÂÚhƒÚ—™,¸]Þ.j)ëS0–*)-h•³ŒâF|Þæ2Ãv°‡Tž+W6Šî ó+-Cp%BzGE7•íªkE*õÍu–ZŠîIÇ¡1;k¼özøTAü Jê»9\ÂW’û +%½öA%¿s€vl~dôu að›+ƒrþ£¼ØxDå{²&JIý9ƒ—ßHýµïÆ  endstream endobj 61 0 obj << /Length 3052 /Filter /FlateDecode >> stream xÚZKܸ¾ûWÌQLwDê›wã»06›d6—8ØÝ/½-iFáÃæ¯§^”ÈnµpS¬"Y,V}UEŽºK៺kÒ»*Óû´ÎîŽí›Tz{£¤µ†]ÀñÝã›?ü¹Pw*Ý7i£îŸÂ)OwÿJÞÿðý»Ÿ¾¿/ê,ùféýNeMòö~—eYòóý¿¼+õ¾ÒÕü_T<æCª3"íÔ>+³»]@ûå;˜QÆÿåÝßß¾Çfžüé¯ÒõÓ/÷;–E™(…s¼y÷¸ˆ_hýý!Ç76¨”Ú—weïU–³L/³éîuLýý.ÏÊäà:ÚB‘¦‰\ÿ!-RŠäûOú–?ú‘Ù}û B×IßYžÇ ¥5NZγ ÷*™p¹jeƒùSè–ÉŸÝ>Ì©€\êä7œÓ=S‡J,3ãèZÒ3œªÊöªàí,+í²J%''›³¼ êëñW'£'ÛîìyœÌÑõ9so'¬/ ÓÌ:±ŸíqžV½’„HÌs>ý¼ÊPÌ•öÒg5ìŒ'nm‡ ÄæËìYÇÑFR¼£ ?°½Ø–ígtÒa×t¿Zþì™|Càý²X¹Ï³šûi=-wÂY M_H1 v๠‘´>»8ô?°yøêŽŽp®=Ë<˜“û(ÌfäßÁŽÓàȳòìëw’¯·B> ûÙm·rIï"Þ s¼ØÁήŸìnSÄ¥‹äyèŸg§ÐÌ™–ËÖ€©ë‡Öœ[¯qéd MÏŸ^ݦåïžç ÃBs&ゎKãÚƒ ç:yÇÚPҦȤ5ÙyîõC«— ,ó±¢ÊI#ÐÁ²Cãu=Äcp(LìâYÄ´èŒI¥UšÌè¦î쾘;`ƒÀt %Á™I–ýN”îÅø4³ÎîvUš`‘» ß½áV`Â'‡–fWeû\»E]_À®Úk¥u’#°¾b-U¤%ð)v û ñ”œ£á‰*8¸²L“Þ×™w‹`$vBÙ…t…ç{–…P£Èz¦ úÑMîõžZÌŒf,‡@¯ØOÇ‹„Ñ~B‹Ã¾¹æþ0œŸ9ÝÜ µ“ßà¨HUž¬‹èÎU;³ÃR– 2·yµFP®™á¨UâH²Š%~²„Š" ~û–ùÐei·Ð)ЍEÔ¬`à ØË™ÇäNAµãi.Ù ÒŠ¥ÍÒZŒç0_! ù0ŒöÙ€§w’a¬RìA•.äNÈ‘ÙC¿•Å×Óu“"ÁÆioOÓ¤á~±CÑ™ãÎ1*袘½s뉅$ZXÌ©aM6^oÔdƒ‚ ´eÏ0nê[a“ã‡9V©>În‰úÁâ«;]ĆñÄ]ìUÄ>fÄÇ~èŽçÙQÀIYç©lbU;t¡Qi4Î<öòÙ#y”þÙIßɇ­ÔŸ1N½œ1®·Î3|¶½å;†S’¨&‰6¡[X¨É—_f6t•àvól5<¿åD²ü» –ªôºÜ>ôM¶]Æo˜àh½ÛðIi8*ÂÛæ6Þ6oÌ`½!Nƒy똫ŒL„Øwº‘ ð3Œ;¯¡aç³ï‡ÚÁì*Ýç*‹šƒØÓó’åf•?hþ ¡ËÓåO†r·ÛäØLlö˜ù±]Ckµkø ?‚V£ö™¤ü|~†dËtþ°àh<¥£D®Â”dØ2ñ„iÓ$‰g˜jÈÑ{J—C/{¿/¶[èoíØŠ¬¸9߬Ú뺈ϷþVLΚ8çCô°“è+T¨bVÉ´¸Žs>PZz\9Ïßúv?óTKèøÛ°<‘þ‘ß~Þ]£ŠÏ[-é3ÇÚ¡~ÉíqÌó€k :Ö<5/BÐðc;4G¦¾òi°tB (Mþ˜ÛÀü“d¾A RÃÝ'²ç¼ð)$ ]C’ê@©ºnV¥ð­zEÊ…^q$é¶&µêªŠÔŠß†B¬Ö€Õ¡{ CÕëzÞgGÎ ‹™§~3«Ïë•!¶3±AÿhgªH8‡qƒuS/€Ì#ç­÷õ œG¡²äqµhð_øÿÕ‘»B ë­ãH=òpnaÛníaô:P6ŒÁ;Ž #‡vÒpƒ…³š¾¾ž( Tiºpy¸§E(çÃôƒ¶‹dØ.l´eÉ[?¥ÔÃqë•R/ßæ6Ç£ƒ ©˜‡·.¼å šxœ¬DP™@i…‘c-©2,¦Aä³í<°Í-”d˜í Z-¾ UóM´ªË­Š:ùšR}ðBКý²ÆRÔAåZ½˜V}íêŒ?TŠfæm~á¶$x3%¼×IÆÑuýŒ;LUòNÊ~{Ø&$\Ut§áåê[yGK†US¬Ö,Ûvy‹<¾ÔnÝ8ÆÃ0ÇgžKLç^2ýºˆÁe]5f¿F½q¦¼D•pJ ãÁA”…„ñ6k0K#ø7 ÀÈŒH z¬P¥ˆøëlsaÁ‡·ë~ß]ïj0~Ø`Ôm8_ áùåZÑÔyšm¨{Q½øª¿ þPJ²¤öT¾2oýÈ—%@Ñ|”â`kIqð£‹æÛ„r9F¼D€¸ò• “Á=‰†ðÚe–kp³¦,Nÿ¸yé„<-›#ÒŸÌ—`Ñݹ©\ŵÌHºLÍ¿“‡~«ô¢ûY]db ƒ•ïÅKTçÞy”{#KH|Q¨ÀãοQVãx:7}•BÝb§Ô±£É4[ùæað%@Çùp–{KµÚ«<`• ¿•øÄ˜ãcâ`P«¯` aECñ V4j±bžÚ[1ñ|o-Þÿ¼ ±OŒ‹½_ïhŸÙ¤ýÖB8%\HKÊa®Ó•´âøÏF]‘”[W¬xÒÔãr•Î=D!Ç7åð%Öœ–k¢—)8ûö'Rj—«Š~7ÀCQ‚‡?qÞœ¡3~òµ3æ’ô†¡jÏ.A›Hd8U4òNKñÍÞ¡H;øsË;Ђšcx¾e×¾@o^dÅ·Ê$¯%ð­ýáo]šãFaNŽ.šéý†ø…ígHuØ|êlŸWÍÿ{ ³¡Âk/»=÷£—L,ÏŽÂàÑcä¾¼*k×\8ÓÜ%¼Áwx?K£å~×Á–ç ¿ÚáÜÒ? ‰JO-w™^í ïFs Ç&¨N2ÊÿBØmùæŠÓ鯼¹Ÿ¿ø`ð‡æùü¯n¢£Úþ")ý ”)²؇å-®çz¶9Ÿ'JñóD-¸9e â˱hHú4£õ _ûBÍÙ~ܼΠ§u=½Þ}‹ïÙLÁKJ.¿j/d*L2ío@‘ÐöÞ­™„ˆº]†è9¢ ¿nZø´f®‘;`öq aÆåÒ¹GAçr:¨ÉmËì»|—¯ø '0[t;éøjdF*în è2Ó`‹]_!åÉë$ÓB.sâÒ>üI#Vë2x©ósÒ-=Š-7Ô; ònE·=ô²z zB1-Œ_QQZÔÍÄ·H?ÂæebJIHv[‰¸HhšKÐm5]¯rEïá:,dóuöæAÑ#¥TùÙÖ­K‘jp^&ß¶†"F3 óÉ?Åši¦$¾È|‚X,)6>Z¸ ù$ µ>käO‘n„|aÜÌ–!;åÅ(¼pœ¥+w˜ÎÆW"ÊW@ø0Kj½ùº+!j¹Ñ[‰r¡¼ø ÞGÂË—ßh±èný‰€&·þÉ]a4‰À¸W·ôŠfSrËѾÿË`2âöi¦ñµhšÅ·‘ëK€J¢[¥4/¹rÊÒüâ!J—±ÛÊ¿¢@ü–“‹ ïùRSê:&@²Ð>S-¢KE%¦Î³uÜuƈ½t¨_€™L ïxò<|ª²Üc˜/H®7â‰üqÌÿ qyÌ endstream endobj 65 0 obj << /Length 3402 /Filter /FlateDecode >> stream xÚ•Ùnã8ò½¿"Ø'HÔ¢.J˜''ížñ"‰³‰³X`@‘™ŒzmË-É=½ý0ûë[mJ‘§³Qd±X¬»JVgü©³<8ÓQèYtVnÞ2ûïwJFpá@\.ß½ÿ˜¨3øy«³å³‹b¹:ûÙ»ž_Ín¯&Iy¿Q0¹PQîM'Qyw“_—?KC_‡ú þ'š÷ü„-](?J£³ gíñ0Êþg÷ÓkÆÞ‡…LÝ>N. MRO…ˆãÝly ? ÃïÜ!¾sA¥”Ÿž¥Yì«(fšvpdæÕ <âÀÛMgx¸¢§òº‰òjZÕ-OŸ÷0 ëÊ[ÛAË»>ïe{W}™ÀÓ˜ ojLižªUÍË%ñ) ¯ÞUE{³Iî­ªÆtCÔ{~V[žÝ˜-"섬•œC§0}%›Ä:ôÌ9É$®"_%|Õ–HIO\ö倵æ ϦÆÙÿLBíë®2D`ª=þ“(/j™EŠuÆ¢O`}¿­Ê‚=×ͦèã.‘]ÈÀ v0hª†)êŠ5e-›–¸ækõâ\s[VE力¯úyÄ„ªE˜P×N­«ÒlI­ã8öJ™mMsLÁ[V¦úZ4¼Œw gÕvMõ´¯šsž8ª‘·[›®>g ‚û²zZWugÊÂ?Мúk{@ÜA‚´¯AUZÄ…•ëõ‘Ê}»_ üLÀzYoÛješb%*bÇ—ã®uµ’M¨h²µRåWóÕ”ûî¸á *ƒYã•T€êfñt¤øb\ tDY5å~Ûv¿12’-˜–YgJB TâGz”$ËEù¡ Ñ¡–ª_—Òjˆ„ƒ5†ˆC»E%Ðd2x]H]Nßk¡keøÂ}u°»kÖ.æê¾KÊÖÖ^º@å=+Ðêé²âAì‰Ê{Æ):R+*%ª¼ßð³³NéܪæÁ¬Ò<(vD‹¨µ<õ¾kŠVN-¥vTWgl‘~M0O;Ê„¯¹ž(ódå¶%\±Å5r°oÿ\¼œðo¼XØ ÏMµ}±[@«–U_wEg]gË3äZñ@8|ë¨êVyû4g²4ƦÞ5•’ ú½,ô¶t+ ϲ…ö4É(5Ñݯ!,9Ît¦ÙTÛ‚j#\Ùñí#¨ ³ {«é·TaD*rKBg†m?¬ÙÀMöÂ{FœÐ†¡›“ìHÍsQ2d(¡ "”ìtw„Tña‰Œ‘2à0ñd¾«:PDÙQ7Õ 0c-ûkA+ˆÚã'´`nUCo½–œ‡Ps\ÅGO>J)‡(Œ®_6yîØ#:ó~’˜³Î·¥€r&k|Ž–¿{Q©E1õ‹ƒž3tkžl@C%íÅy %ýJÙ3kLùyþVe*¶k¾–ë}žÑBhyEÔT©ÀW§T4ª¥I|¸ ¹aªx•ƒ;)¾Y¶îª0és±5Ÿ`ZÁ¡•uT²Åäú¯†[T5‚–{ÅÚ×€óíæÇÛÑtð)Ø1¨ÄØóÀ×Iü#'εGiã+ø˜b#ç~-mWe/Ê}%o•ÐÊRŠ A!N#U~¨žÙQ[=h¦½[ÎbE)–Sñ¡Q«xÄžpvWà´KfªmY7ž¢é-m¨Ÿp ×x8bzbÏ©d—í*!Å#¶×V6Ì€17•®ÛC¤9¸‘ȃgm'Êsïz2þD°—†ÞÇI†±ÍðÛÃHJ!L ¶]Aî É)AþLqn4`Á®ì¿!:ÝCÉáÿÊã~¶Ñ÷n°¼’-ÚdËÇ xe{c7ÎpÞŽBµm7âXcS_'­FˆÆ`^B¡%Ž¡Æ¥˜‹ Ûš“[,[²h˜Q2˜½«xéGÓ`œAÔ7f[7 ¦ÞÌRÓíÈq#HÚ”­[Û ‰iœú '¡H‚4Í©¦a’‹àˆ:9d–Iì!‡þì´{¥Š“ DÐ+Dà}!Éiz¦ñ€Vî?jÝ—¾mÈ¢&¯"#fië`*þ6²ÚQñšb ~6Í „ãŽM’øá@!Èç²uÅúwŽ z†FŒ Rñ®ß9Œ‰¬ú [ˆvOàzP§£Ë‡|JÂ^ÃЬy·«›ˆÂÍÃðŒ;ÀV/üþcºŸÂ<ñs­á&tƒ¿ LïÓDBR‚CûZʳS÷‰­ÒC¹v!q.P¾JÚTœ;IRÚ¢ï”YRíðØŒÓØŒÓÇf\)´¢~ëQÙG½;]g+± ðXæ…k[ÜÑpnìXÀ úZ73hƒÛ÷ܰq-dH´ío;«D‡;üd•õœ¤#P $TŽ@ˆé0Ø Áy›!‚ð•"M|{xå0‡ ‰^ª¢Y<Ž2~¯0OF­ 繯œœ°¯(J­ÍãpØé€‚QŒ¸i\>ÙÊÅ=UŸÀ^n¡Õi_Œ7Æ„Oî¸#™c»BT%v$ƒo ™ ¦aý$Š8ëq„s2[Šj=9ýÕ#Ê])ø~BÑàD/³¤IüTI)&Ea|Å‹àÓuLøŽÑqPG`!Ú¼@Ê]È+µJ[+÷ŸŠ×)ßâ´åáG@îgë¿î@ –6âÅ6PÀsnG~¤ó“yCÔÏXꕜΟ ñ %xyúZ™)J‚ d>)gú@ó4ähMtÕk*¥× òØOòp´' ÅXëÆ»8Æâ¤Ò:iÎÁ,p·¶8Û § à”|Ù–üaÜ„PNÊ o¯³RÐѨµÄ«xÀ+nó;maå u§Žý»óØyÙo¸ý,¡Â|ã/Ç€ÿ¹øfÈ•#.(ó̉~4$n\á°•†DE¹2:Œ½Ûš*/\ÇÖé¸ÙÛ*zàHb ý‘Ïk+…U-}l|ÁÆ pã“‘š«v[¨QÀÙiÃyµôQå×NúåL$ÆÖÇÔ9?/ v¬% KduœõðÀ‘š¿lŒèÌÚCcvà±TDð ®`#GžddœMWAÊïüNÀÁÒ˜=¬VßN÷Ñå— c¤Q¾Ç'î´±LaOû‚åŽ/yJìæ)Ãnñ¿&aâ]¯‘–B#ÿNEüÇŸöG*y’òTdaŠ¿FI2ïÃŒŸ?Nï§·Ëùt,GºH¡,HÕÀÙ'âì¯7 Ô!*’“$÷.ç—×óÅrv5•B)òã4s©:þzÉ’a3ÆÅ?Ê™O? §<‡5òì†ÇWËÅ9oùúYœŽÞ>JãW·Ç?q7ô#¥Ç Ù+‡Înz¼™JRi_ëAËöÀR(Y3pœà`†ßè¡Vóü킟×ó›ùrÆ@w³{x™¥»Ùµì¾žÍG¼Áôx'¦ü4Hßú³¥é?g×è{²„´K{W³å‚ßÿñ8½ý cT˜8K½Åã/ƒSQF‹ûy=,щN/g׳«¹Ýw·¸·Ým¨1¶fW÷s’'~ò]<ðs9_>^Oïgì?€øv<¿ŸÁœ"ËÅýt.3³÷‹GA†tÊìÑuÿ—³ûÛ«ÿx$ÚÌ endstream endobj 71 0 obj << /Length 1520 /Filter /FlateDecode >> stream xÚ•WÍŽã6 ¾ÏS=9@¬Õ¿í£'V¦*b+kÙÓúsiÑKÑWè³—eÉtw –(Ф(ò#%~âÐðC¥$ãµ:üñÏÏÔ¿ŸD•ÀPn8ž§§O#‚³†7â0ýµ1ýyø¥¸ú³ÎGS«âW®ø±ª)Úc©”*nÇߦŸV²JVø7íù•K•–JÁ”U‡r³6?ƒÄ¼ÿÅ퇺èB& ó±”Ü[ˆ$ãÉM«ùFʯœ9¾r@!³[k&”&›.GYaÜÙõÇR7ˆŸgÖ†ÉÁ` H’;I¦fºÑ 9Iù!óì´ðM½p ĺ8ÁŸm·Ì³ÖϳÃ/¢Ë Ã9 ÓøP»ä5ºúªö•ãt, »§»QUÍxcá’&[è†çNoES¼´c;Lg’#êç¹½‚¡#Í& 'b€3é6Zq_n£‹1ï>‡>$µ<ë¤Ð÷·k¢ËŠi©SÕwQÄ­Ü,ù³'‚jYÛÂçëì‡.äyçÀkŽÆaƼÐFú.GKSSxë¢?Š"£¤aV¨ïµ&.Ú³ƒfƨýÁà;ˆ·³oŸýÕw8nѹR›"}4ÎÁÍ›¬Cy¢¶Ì6ÍÖ¨ßeY^h º%» €’ôt³H¾ø¡}§:ÞÜ™5œIˆˆo<ýò™-!e™âÍ.¤ÀS×Åèã9ý0¹—”ù8ƒƒbÌ$Å‘JØ;(‘AI» Hg©è,HÊŸÎA°ß ¤³b:0!µË,Œnî¯i“öHs•îÞ%äZmvþHijbœ{ߥd¨Š[iðŠv†ìge×»˜ÿýC© BT66e¢Y ÝÀT"#hÀ©Û|¾F2ÍÅþ|»8?Ì @óšÌjÐÓõ·YE»[ hø$w&•|ì.­÷‘J" -pÀ‹é{žãDc‘ iSè–åe)B2¢¯³Eojžtjͤ» ]ÎŒtîHµ'Ìô=‡qt÷ɇˆÀw¡¹&Ÿf—ÁeXPbLlÿÖÙŽK9Ÿ$˜\Ã]”ÂÖÓ: á–-OU£ªÅfWµT¡»˜¨1”SŠqõè:ÜÅ t"A- ïÝ€îAJªNHs_üKŠlœÜÜ5«¾:ŸÎ ÔÖ­ÃÛ”}ÂÖwŽü_o¼:À mMºmÓù˜3>5%²¹x!°OD~+V¸6ùi¾¶y‚A…,Ï8  Lô Œ)I SOŠç)Œ­Ï4I¦º½h!ꔆKÁÿä^·¬kª8ëC—€t|T$Ý'ÔT öt>N£žážËЧV Þ àDÀ€Kš±wÄyscï'º8` ?ú¾==R‰y•ʲduÕ|G2kk‹Ë©ƒóÅ[(þ-ñ±œ»ò•oÝn ÎJh[íðJHÀg[}Xú°’TŠ–*W„!á .¬-Sñ–Šjß-áM/¢!ß!|ÌáÓU8M±ÛõI‘’Tmý2WK š"e¦˜Ó’;4 å£{z ±l@)¯h$Jª?.戀‘}Ÿßw iGþæz-šH\‹&\-¡ýiàb ß5d×k?Ölœv"Äå¢Y»Ì—ÍZÙ–|4oikË⑘”ÔI~—Lhi ‡€÷sç«y[ —1w™’ÛÀSFb4[({_)«5ðp{*1Ò ˆb\€ÇH&­¾ëß'‘‹“¤§—x|¸°¸y·}AZË<Œ0ˆã”R8@{x¹Ùäruv87M?§êÛŽn]œˆÞ»ØgB;€]KÌ“ŒÃ§E*QÜÒŠ›> stream xÚkÛ6ò{~…ï¾TÖŠ¨—¥KQÀÙxÛ-’M.»)p¸\®ÄMØZ¢CIÛ¤úÛo†3”d¯“Ë,ŠœÎû!±ˆà'e´X'qÉ¢jE¼ûÛ#Á«¬fOo=¾ÈÄBDa•bqs7'qS/þ<¿<ß^/³" ÞFI´\‰¤ 6ËU’$Á«ån~^äq¸Ž× øÏÖ„ó6Šw´a’'‹ÕììÍS Èø?n_ožã2 ž½ä­«7ËUåYˆi<ÚÞŒìgqü?äCˆ®ã…HÃ$Íc0/ÒP$)1tnw¯³`³ßéJZzÙv½êhy³,Ó@ÙÆðû^ZI«ëAòÞ•Y&"¸_æIà·žêÛ6½ª`9V4XB”¡ˆ bãZV‘‰¸€¡xTKø{·L×qà³ VjàÌÎ+K‡C#‰DktÈ;·#+Êw}tç±?¼©v Ô©_½æFjcikèõNײfÆöÀ0°Ý9I)¨;Sp‰¬(\B„±ˆÑ#Æ#MRìÈcR‘…y’ƒr’PdA OヺÎÑÌ`1€t•9ƒ³,ZÚŽ¢í…ÐVU¦FEÐ.Óøƒ;ùŠËÚ‰«¡¡ggîzdìwTµ´Švwúž–i ÷zãØ©=ÙQ²ñ Ôº[9ù"Ld½Õ·ƒF¦kg•´²~­ßF" H±~YB9FâqøJBä=–)ëyô€ktfÝë¶æMIPŽMâÈ…zš¦Aõ§S¥4Ò™[æµC}RˆÀkïÃÖo£,2ÃÙ)qå[ÙkrΑÏ(ø‰:,)È #YØsNÏçºRíÄŸô©è¡GH"ò£²rGPàhÒ¡¹c–i \æØ!_! Å8 {5ÂÕxFKÙªOŠ—ŽÁ ®÷b«+Ð(©Sïíb˜”ˆÀuLZ&ˆV D‹Z–¡c5.аÈÊÓ‰òJ‘$Ú-ƒ˜ÝlÍÄþ'rµ“ vvä’( QZ£h’ )A¸9oƒg%`%-äJP«;â¢Ú²õÝøazôV¶z¦eÚî8#¿’H œ²µâKfÄ 2>U»¡›¹/1{Â+߃­‰‚–O0¦PŒS/¬¼P.È’R1˜ÈåÊ^Õ;O‰SºžàáÎq‹;Ý~à%qu!ž×…8+Â4ÏIÇÜßOÕŽÌU\†¨µUº¯zcIAðf¡`X 6LO'®qfYöÕëÊ0†ÚÉ,*VJØQFâ _CfÑCÀéYq·µ Ú€:Œžì®ÙïTÏ𣫶b7³*/òõ¢ËißZuÏ{ºæÄPšk&쪈;Ùñ $–"3)Ði#ð vÚg£Õg3Zß^;«;‹»wÌÈç.å¹×ïek~8¡' &.…7ôLdæÕùÖ ÖV:·°Œ™Cè ¾ ªIôŽ¥öwWbÉ(PbŸÐúÞTïæ{Sój*V”3héÊÚ‹\·¨¹i[¯¼¢ÕcCÈ+} áÆÔúNW#³rDtuÊ9+Ø×©¹Lu ß¼è¯Fr¾DášJ”çuÆÃ ÈöЮCv$sT¯¢çoßîtaƒ\¨ù m ¥Ø´¬ë^¶XÀ¼­O±s¯,fT¨îÐçc¢ûËQÒ¬ÇBÔûH‚‘HÝŽ®;Ö¬)Ù™ýX¨þr>›Iv"—<óסíOmì´êDø>ñQÄî3™G© ò>¨ê§³!¤ Lˆ'Ø›Ò#Ó½l«ðÌ7|t0VM:áí¬¤çÂn…oëáâÞî ½+%IÄ›O!•ñeiàý8Š…кDkvðëMxªCÃî¦ÈòÃ98Þ n¶K ¹»Éçvé§$÷U¡¡CîxŽ».šYR7—YEËŠ¾–¸õ\²wŸL`gütQà„ZÌ>]À! žÆzd í SRÐÒÙwte«+¿{ ¯A$J“~p›5ò~ð†Øpq›àМN,͇æ<úŠNàï¥1…:³s)Ï'¥k[që¾#ªDáõº/KçXò:¦ðeþÇÀO¸±·æ½• ’¢’ˆ‡fð·ÏGR@çÌÃÀßv½î¿0Çù¤Á²ö<$4Ë4ÚìdSs ÌÍ=ð^ÉÎ0ƒ3Ùuºujž Ì56àÅ·Ï5ƺá¾­4ËG)æ³Jå»àSsN¥øúõ«4ÎÃxz•÷~˜8¦sÑÙ| Òj羌LÃ5¶&ÚàGˆ¬k˜ÁÖ§—O˜&̾¿¨Ã¯ ؈wÿ8Ñw?l8küË|6õç–SÌó¾–cæ‚„ê‹Xï3&(šU;K”½Ç(m?Lµç`òÈ7>X]{Hbñ¸ ûîšÛï¦æpšŸŽg©üסëý|v§ª²¬ì0Df5€[“{'ÚýY‚Oåúײ­}ÅùIV¿){²®~¿qnÞö¨³»ùì»ÓþÀ,ˆCykõîpK”etŠ›95&ö æx]ƒÔ·'ÿ®ÃˆrŸÚ(íáGµ¡6óŸÖÿ ­¿8` endstream endobj 81 0 obj << /Length 3119 /Filter /FlateDecode >> stream xÚ•ÙŽÛ8ò=_ÑØ'ˆÝǾesÍ‘ éžÝ›]€-±mf,É¡¤ô$óí[eÉ-g°0`’ÅY¬»Èð*€_xUWyûeR\UÍ£@ ¿? ¥·„í ã7ž¼Lë0ðË  ¯nîæKÜÔWÿö~2ýð)ˆâM^gÚlã8öêÛÄ{®{Ýn¢ÂûŠÝá«ix<#ÆÞ+Ý5„gôýf–E˜yaºùÏÍ/^ÜL¦Qô'@ŒGÈ£«0÷£0MäY‘øaœœ!‹Ýò”)ƒ–‡pøsGˆ#> ‘Ž€xx üœuÀÛ8ð“"åm—'N¢Ü»ë w€ˆiÕÁñJ3X÷•5¸+Zj3ZFöCŸ¹/,kÅí°—5~k ‰BÛÞ Ø‘»;^îi[ÝwƒÂ Éaì‡p"Ù´pÒ2e$uÜlI¦¦÷7Û,*½wu´Àcâ),4Xu«ûŽ¡,UׯjÙ‘J0Æ^$_À1ãxV÷kr9*+>š4ó>µ²›¯¦ÕÁ|_å9#;¦ê@¤f Äkgî@“‘„0÷‘™_ÆÓÊ 2>¢~¦©÷Y³˽/£æŽfÁ²Æ…õâô绑‡J>_º„Gôé(¿%üL´5 ­k~Ð\š{à>‹i-îÈ× ®-q;qÆk'ÉÉüRï=n§ü¤Z«öм@âõÝ­ÕK#îì¬jÔrs=°Òj&¾Gå"RhhÝÌÕüx#>æ=¢v“áwk*bß„v 1FËÐô x¶Wö`4^m˽‡ŒGè´È)’å瑌·ïÞ½zͽOA¼»e­ÕÕ ÓÖ8½¨…«ŽûíŠÙš 5hy­Úݨv@\2䳘»""rV2¢ºáNÇÍœ}Iž{oF3(YÕ¹ž¾sq9ƒ5·£±J– „ž4t¾Sˆ pë$,O[ƒ·L’‚Gu@¹™¶îñ¬ÄÜ­¿~Û‰GÈ¡÷FÙßyâµè :bP/«dnl¿·Óìõ qàäÓ¶† ‡Îz…TX߈wxÝ #¾?fíÒ¬®ô«:T{Ù9¼@V˜Ã²D¥loèPú0fX-ÀSÈFè"2ÂìŠù´cä™»ÅÕÅa9ËÆÃS­„pUÑÜ4>·ªV—Ý€KfF –‡ú-Jÿ1wqI Q ÝžŸEnOYiæ%p]AúŠºÑãð,:‰(ðd¡/#ÆkÚè {†Í|‰B^þÜå¢]„ DpãôI¼ô ¹`" ˜…GG<œÎCˆ„jùäs·ë©ŠÕVFFlS8¿³§ª’Tž"²Q ˆL9ÖB»n0L—˜kÊ7IŽô" ´]”H±c`É!g¯ÍÈmJ>ˆü N¡ãº~õ3º›ÇYŽ€úÇÜ{Eû”`…ÞÏPË~¾æÑ«×>Ï>åæhm†Ä£‡¶€P: vPb-éj½šU’xŠÀûEµ°&ú½\˜ @ðì]€»yÑcö‡“§íåáö:Ûvã¶×ü qŸ\ë ¢¾Çñ€¹â¸ìZ¶† @¸Ý3ìL4'[a_¥åÌW!wó„rU€+àþ$fÒg§‡8Kì‡ön8.Ïf9?ŽQï –»àª³VS(†Ï8Ù0ZwWt^ Å“ X åáüb)Ÿ×ÂFuw9/{ Š×Rr JØvÒ[Ô4…M4‰%§¼£4óÔ…àŒDøÔ%Ç\°ÊGÝSš ¨÷²‡,)Èï„-çRn>¤"]Ùª´EmI~¸”«ˆ,%áeXzõ Hƒ|^¥à„âuå1w²é*‰Š|Á½^ïF3.öktßH·Ri÷?Ѝ^åH³¼-É36a˜jA7œÄZž—ÿòrPg!?YÜ´ðu£ñ´®Á#ÙRpò—c²Nu&û»‹2YÞ»'š,`™ÿLv…”6#®D(BXÖTÏÄÞ=^„z÷þ”Î(?dM\|$¤ïezþ<yoèjYŒì= L0dRniÿƒ¦+¢$]lrÃ8¸Ã.2—\ÙâÖ v­ZÐò1ñrV`s9qÀ+®¢Xjv0CEûrª¼ 7oç.3  €÷d·¬HƒiÙ¹"VrÆ86°«Ýì8pÜLjÚÈ¥›>tÒiRb„BºFà“aïë)ù·àhY(]_¢þØ®!*YE4_h¸˜aLÖ Y”*³t¢‚ŒSI—’&ØbqaåÞ&¦#ôL͵PÁ"€vÌ¥§”(¡Ä˜°eÏóºeƒ¯ŸÍ¬tx|¡Ý¹?ñÙ ãólâÇIÉ3)„Ò-JáEfëªa金|²¸@Þªa¯Z£ñùж›=i‹…È%onxòN}w](è `õº±ú]kè²rÒ4y9[^=w$•…÷«•¤‡š-þzzÈžø—ék*fÊ‚n×¾SåIÃŽ›S™;-TP]€M­ŽÃºöÂl-íoo21R·Æs¥-í¹@s¶qÎ Íi¸ó+½ƒþÆãÝ8TÒ\¤ gŵTð‘›Y!‰q0Kð ¸ÆwOûæš°á‰÷ÿLIà, endstream endobj 87 0 obj << /Length 517 /Filter /FlateDecode >> stream xÚ…SMœ0 ½Ï¯à¤’’@¸ö»UWªTnmÈNÓ²JÈTÛ__çƒÝ™JÕ ìçÇ~6¤¨á!E_¥¸g¢—CÑ»ÉV„ê‚ñj8¼|ÇIAjÜ×=)†ÛËÃT|C´Û¾× -y]#cµ,+J)šLø2ôF9µ–@çð2óY/Éß2!)z¯ÌyZý.+Ò Ò"Ò–?†O‡·Ãc¼ižé 0žo¡ ÊR Êm2–Ѷh‘ÚØ`r´C¡2µÙ‡ä½Îå+û€Ž¡cY5RK fÙ3š×›tÉ¿ž€»œI<³3MfÎþ$­r9ÿ&cü^QhÖ5á((W„bÂS£I¥Y}ô1Læl0}¢Ä!DpC@¨‹¶rÁ1V5 w‚BѴweÅ`(_~êyÖ÷.xз­Š³U~GœJÌEB=òr. ‚nAŸ„=á-úå'™|ç0†uÔÀŽy¦œåëæ¥ÝöYª0”‚!¹H+Så„ÁÜÙ•*7~ý³*‹á@ߣkT©COK+Sù:¨Ïä¡X0I4žHV›Lˆ{ßë ÈÿFƒ·&‰­èdåºÛAžõ~Z—¸‹pbQ:ß:ɫɓÔä¬ôæí?ÿ^Ô_Dý#®ÒG¯“áâÌZ ¬¤ËŒõ$ÁÇûo÷v@ endstream endobj 92 0 obj << /Length 779 /Filter /FlateDecode >> stream xÚ…UßoÓ0~ï_Þ© vl7É+Û˜„@ ­ ¤mnê³&.q³BâoçÎvFZ†Ð¤Ùwþ|÷ÝçË•%þXRÓ¤ä<¯E•4íŒFïÝŒÅ]€l‚x³œ½~+YÂh^Óš%ËÍ4Är\‘O[Õ¥EEöjcûV¹4㜓‹a—fàµý^­ÑY”R„•éÍòÝìlùœQÅ(!â/Ne‘°2/˜‘Ó¢9ãb‰³)§RNà9“ãâ ú¢Î%8}œsm[¬íÞè‡4´$,¯q³ ±<ÿ­ƒïgÀè6BzÓ5˜%a’æåB&E.«:„¾¦gP892;c6¶Ý™­êƒSÇ,ºö£J„ÂV)#}<ÿ1(ã~ :¸¯Z°ð\‘s¯3O#cj+KØðœ4:‚!¾¨8qÆíµ-DнjŒí ]éVo¿©Ã›Ê†õsgežfUÍÉ™‹!sM™h€a¼6OááÙñ @€X·'MÙ:»Âê9­È{ãã ÁŒÞ àäéö0~M%ÚÚ§¶*˜CVåÝ+£Ÿô1ªHÖ‹'”ë2¾ò¿Ëèö÷¦·ÝX?¨²X ß°±aù`šÞ:»ñÇ’|1ÝÚ"üŸÕA t Û©h‡íbï‡Þ‡.=G¼|î!Su1Clµ#æUÍÇ‹—ÿŠ_»ôžªdh°yðÇq ‰Ú©~”­èÇCT»3º¦œ¦BÒüJ%¥Äj÷û¡ŒŒÑ3Ι`…Çï­u̱3ˆ‚o&†‹ng½·Á€wHBïÝKU6jp ¥¨)Ù(xì°Åè¸:};Ö¤"qeñ!8%&d.¢·æ¾[%†jlçtï¿f4µsj’îUˆu™bûWÇ#TYB&²ªòª¨qFÂPó‡“1:¢² ì…ñ~Ì pubC½Y Øt7ó04¸ŒA'}¼ó£Í«pk:~X)i3Ár —d)óEYÿcú¨l{öq0Ïdr™C?ìAOíò‘Ëo ¢Ë› endstream endobj 99 0 obj << /Length 613 /Filter /FlateDecode >> stream xÚ½TMÓ0½÷WäVGjŒ¿ÇÇ-+qCo”ƒ7õVM\’– ¿±Çi“]!à‚zHýf<óÞ›IxÆàÇ3Ã2-%5ªÎšnÅúyÅÓ¿ŠYÆëíêÕÛ’gœQà ϶OóÛ}ö‘¼ñÏ )%ù0ø>5¹ôMk‡€)²ãR=8ßükë¾…s^ˆ’©Šð:ÿ´}·ºß^Û—Bü_ÈxAP‹Œk*x©ÁªV-ê J~#Ø• 7‚@ë¹lðEÔ”™Tô./Säd6J,ë¹ØuhQ‘2WZ‡9—.%7˜úØövÇ$Ë•ìg^2F¬)’ìSêih;×N]ÆÀ0•¡Š«Lв6H+¶ 1v€S³P{´éúµè ö`ïÎÃõÁ'Æp!-„f´UVpI9ø /ªHeÈ:j§pÕHò~DÐ^Î~pépŠ›¢qbsã)Y°Çc,:/.zAާï‘TŠV•ø[;ξ·›PD’v<‡FBÌF•BÕ(^ª’ÖZ-Å7íÞîîoqço³ (ÎÊ„»æ_FE±kÅ)ãšV°Ñ)þp_ø®ˆFáX8å¢^æÜàø-@Í)<ˆG?!?‚dð® þ ͉Å@<‰ pŸðÑ.ýÞ"˜öOI ^GQõïEÕ3Q›ÐSßOåqê:M= m±cŸšÍgŽrKCåóA,VW–œDñRÕÄǧžo €C›sr€7¯Ó…/‡±f€¯®¥&±Ч¼ÓàžÜàRÜb> stream xÚ•ˎܸñ£p+âC¯ÜlÃq6€‘EbøgŽšž¡ÓjµEivׇ|{ªXE½Zƒ`¤ŠÅb±Xïq—ÁŸ¸«³»RÉTæâ®i_e ýÏ+Á³# o?½úÓ_`*²´Îjq÷éë’ħÓÝ¿’wæzø÷§¿Ý‰*•¼“i^Õ´ò%“Š–R)äÝq±ä†ñÜŽJ©DüùpÔ:O>;ÿßCže‰á…¶7çÃQVBV”^½ÿ4±šKùwAŒ›Ë”òN”ÀO®ù2E¥S¡4ñ%ǼÉçÃQ$ΪXÊsb©Ì™%`d+š¬Ò¬f2¶ýÚ»Kã®áðÙÝ#õä›ÜÓAVIGàS Þµ~röW€è’¨K™XÂh;?ô¦_PË‘Zçi¹¿Z{Rvè~ê*ÒQ‘Î×®¿ØÆÌko™\œØ¾uƒ»;øfp#¡R_¹é.ÈÛÐwg ’‹,q‰Ì×A¸ïî{F9ÙÁœ­§¯Á8ž5]ËÈx2ì$R]ÜEãÓ¬¯ñª: ÇXT‘ÿÓA$v½ (Ã]ž¬´øŠ–i¿Þ»•¹‚4aù’2<HLU"PS•Lüeó5ì¯eZTùK•¼qxw¤ÇäÎîòh<ÜFÕ*ÂŒ÷®%,–FÏ<8Ã"NájU½QÜKÌ‘<"Ë-í½5LèûhÎßGÛ6µJ«ºd9£—@ Ü$Ç­­íÙQ¥7ʆKÄrP†¬5Q˜Í:‚8ÝH£·øDWx+Ó›SGè¬@¸nÏÖ§$]ÖZ×E*ØÈÞNQâ}­ëMü@SE•€P¯ç ~‡kÀ8ú ˜‘,Ë(KU¯Œ 1HIî–H‚B‚$Ýà”©€µXV˜]àÀÛA³ |b}8)2Ñ"œ‡ÃBn†Wf‡ÑŽE•møF¤­ lr[*9Yßônú´-ckhòt|Ó; fã–=ûGÒR ‘“”a4ý÷‘Ÿ¸Öj«¹èrVÒÆ= î«ëZø¦Ià ' –žƒù‚ÁåáM”D²ëÖìoÔýKP7RÀÉ9ƒ“Yx‡¥Â/LU)cŽ5 Ìì=ê”ðhQp"P.<(BéÝEqÄæ) Ñ"<l§Ì ˆ™Ac0®Ý$ ó©Ê»…ž,]RQk¬ŽÛŒC×ïÝ„B¹¢¼ Ævm–d«Äy”EpÂ…Tèè³K˜‚Üâìª%ba©AlÁ$"•Óñ#ø ™ç“¡b³³©Áñ ãR®pä+¬ë¤ÓØìx”PÞ©ä}‹ê‹hMÙÖ¡¨,»©]pÛT­"BÓ£ž.Ö_ÍJøèbïá~6£³‹Ëv&d$ÐbwÒPÚuVÅîwOµ±Ñ2üÂã |?6g‡=œîÙƦ,®³e'ΤÝôf΃»ß(«zÛtK :-è¯bÁÚ"ý¨‹ÜõÉì66&½KŸml¼ÁýP¦lÏ5QˆaÕ%BˆãS–ýD„“]K*°‚°Ú¹§Ú™;]<>óK–gîÒœÇÐÖ¤cÎcë.;º¼Û ôô@2Lc85/ƒ¤U¬ ŒÏy8Kð’·gÛ¸îbèTUψãâÁüˆ ¯Ž4^(·ÈÔ=/Î-¸9JNÌÝÓF¥Á<-ì.p. rªŠ§t$“i¡ê]JM^ÆE›‡ÔÔsa ó~ø‰&¡åã…‘¹uDÿ@-ë1ÔÒçOo_ó<`»“?,肌n®Æ4¸(zB Z pî?…]TåàoFY_ê EH1B»w?­ ¶ û3NˆUç㳞ì1Öjeð"i÷% Òd”z0t%k,ò1ýéÝyOmOXoA††©À“šËG—IY  š –p õ`€ôè©df"T–“XãïªÎŸÕQµÖQþYBr_ȼµ?\ü}@:UBÝ–d²Øîifú{·lï`þVþV„«€µá=¸×ÓvuñS!¸Á€\ŒÜTä_OðG$ÈTX¿ãGõo»Q/þ|¿Ó{Œb«"Ư#Åw1×ø ¥vXATªUõRÏϾmàÚ40Pxø;èiƒÏë­¥: ÓdùÆLÌüƒÀnÀZü¤ÖÛ¯v'm¡¼²µx¡ŸUªÜùY¢\äÕ 'UæBVi•—ÿjZ‹w¤ÇâГfdžlš ?”ìßÖ~ÅMN?šáѶ\€ ÀFoœ§ÙäX²,½Üÿàe–• endstream endobj 109 0 obj << /Type /XObject /Subtype /Image /Width 1022 /Height 498 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 17 110 0 R] /Length 11803 /Filter /FlateDecode >> stream xÚí‹bª8†‡õhµUZßÿe·õ¹“@.3á÷l­‚"õãK&·¯/@ @ ÄNƒ]¾Ùˆú?Bq¾} ÆÒßå úaÝ'üÒößnß²3nÜnK—èß¡uÓ@_ü¾ÞÁ/—Ü/€þìÖMw…ñ¾~¦ô‡Ÿýìé/`Ýd'<Žâ†[G·¸_†û³[7٠ϣ2=Á÷ qs'¼ŽMd½ÄÜ/Çý­ð: B+Zñþ{‚/îoì„÷ã¾d!üXÞξ¿ Ü/ÊýÔÖ ÓQ ç/©aÏ÷w¹Áý²ÜŸÕºÉNPŽíýìà÷^|Ÿ½t÷¢îåþÖÍç„ðQ8¿~ïoZjüî¥|Oí'ÏÓѯï}©ÎÝÿú»h”ÃýâÜŸjÝŒNH> Ò8Mƒ?°_FúûÁñïl}j¸¿ ÷¿¯în[æsBªûŸ‡²‚¯Ç.Þý´'¶ÒÛü“þÎ÷÷ç~Çw9£ݯÌëªô(Пé}YPSë:üóoóÓïÚÚ+’qR6Tÿuƒ?Ü¿o÷{¾Êùœè~å`fÞhbVyLy$@¿û_èA“þ׿.é‡û÷îþé?©°˜ûÍ.ö×ÏÄÊ`T׸~øJ=Æ’·þS{¥óÙ¦Z}½¨Ñ¯ûêÜ¿÷Ïm«2î7Ѷ/3fÁß´îhŠP¿õñÔWRߏµò–Úu¥7÷ë)S¸¿'÷¬«V‘'øó9A; [ì~÷;ŠçFÎ~¹à¯=`©ßyY0T7|ܺ¢_ý;ëŸ îïÈý~ë*_gåËžÏ ÚQX!ûÍB¾“~ XûóE,úí-_ÚqýPò‚=º_»ÌÃý]¹ßk][ý”Õ zöÁ*‚¸rþäOש·Zð_Òr~g=™@çÀÛuÙÞ¯òàþžÜïµ®“þŒNHoïŸ+õŽl›žœ#£°®TæãÛû¬$ Q Rï~äüw’ó÷X×Îù™9ÿN¨ÕÏ¿"‘Áöþ]çüíö>jÚÞ/ÉŽºùÃý{oï/ì„jcüjAÙüpÿÎÛû ;¡–û%ÜoUá~¸Ÿ£ûùÝoð÷ÃýiN€û»ßñ8Ü¿{÷'8a: Ï£˜"»áíæõÙ÷wûwïþ'ÐïWåïñßMœá{Q%ΩOüýop¿÷¯°n>'Ðó»„yðû™Ïÿq_ÌéßbÝlN ç⟷ODñš"ôs§¿®u=N çeÜôBÿô˨÷?¬ûS%|Nxå@?îGÎ_ýÖ­ÿÅç„÷j‚à¦÷#ç/&çÿKÿP<.—…ö~Ð÷#êçü«Ñlïýp?¢‘ûã‹ðÔÑûÀýp?‚«ûãëï+è¿Àýp?‚³ûcKðý‘ûÀýp?‚¯ûËÓ÷Ãý¸î‡ûp?Ü÷#à~p÷#à~Ü€ûp?îGÀý¸÷#ʸŸý§zÏGÿcô>Ü€û…»ÿ…±—f'ýöEî‡ûòܯÐÿ4:ýý7] ¼ôêÏÍß%¸îGˆpÿ@ïÿOè?`¦úß{úÜ÷#¤Ôû'úg¤iH£pÓ÷ÃýÞîWÄO´‰þw2î‡ûBrþ¤“ûQï‡û’ÜoCC¿sGÔûá~„¬ö~R2øCÿÔÞ?µ(-p?Üá~ôõCÀý{u?úù#à~¸îGÀýp?Ü€ûá~¸÷Ãýp?î‡ûá~Ü÷Ãý¸î‡ûá~ð÷Ãýp?‚¿û/‘aйÜ÷#غÿ²ŽþKýp?ÜàèþÒ÷Ãý®î¯A?Ü÷#à~¸îGÀýp?Ü€ûÁ Ü€ûp?‚‡û‰Vê"¸÷wë~Úð,Ü÷#$×ûõ);Ÿ«õLÓv†Wð„ûá~„|÷Ët9æí‡ûp§î×gé_A?Ü÷#„Öû§…½Œ¥ºà~Üß¹ûÉé~äüpÿ~êýêý¸9ÿ×ÒÞjÎ@Î÷÷ëþÕ­üp?Üî~ù„~þ¸îëá÷ÃýˆîÜ1~¸Ïõ~¸÷Ãýp?î‡ûá~„á~Bð ¯û/%îß­û ÄùöÈ·…“y&¯ûKÂÿ÷ï×ý¿ún/ì·<·[ð\žÏ!÷+ôÿüÀý;vÿã‹ç‹ÛGèYDJÜNæ-äþòôÃýût~P›ÿð©†û-Üíñ îG4s?ðk ÿÜhå~´¶5 zp?¢’û r Éܨå~_cü’oçäsí~ràM™Ã î‡ûîGοxjß×âw‹vIúáþ]»íý¹èÿðµ÷ÿýÐküÇW¹^¾ƒæÙ¼à~D6÷ß\{}i£"rˉßö)ï|—*z‚—í(Íý¯i:É^¾#r?¸îßâþAÑ¥^'ÜÛgyÏÀ‹ä½(,¹ß|ç÷¿Tï^³îGvÿ ”ü}¼bÎØ÷ ½HúÓÜO©î/F?Ü÷/xLåä]~ý|–Ûþ ò4=P¸² ¥ô¸÷œß‡¦GÉ}éPwžöÐ_’«ûgÌá~Dm÷+`˜HÓ‹¦ Ÿ×׿Hú•ëÇ{˸÷Ôß`ΩÙô«;«{Ln£¿¨ûô£ÞØâ~³ší1E²š( úÔÇÔíbܯ¿Àº÷4€¶áwAß*÷ë’¼îŸrþrþˆ î7¾÷d{La‰h.ÑŸúÕ\JS9{º&Yþ³údô{êÏè76T YàŸÏ™ñz9ܾ~ˆBî·uìtÿY£ø|Vkï[´úÓÞSÏè‰~{C ú @ÅýÚëeq?úù# ¹ß*ú»ÝoUÊíj· 2ÑœŸ[AÿÒ{ê˜ûèw]&ôƆ¼î7Šþp?‚qÎߪø»rþP½’½³;Ÿãà76zO«þ>†ÿE<Õÿ|íýýp?B|{ÿ£ïj{3H?«í}iô鲨÷œŸs¶¨Ç¡çµÝsü‹æüá~D³ö~QQ£_oíö~¸ÑÎý€îGÀý€¿¦ûÊÜ÷÷çþVð/¹ßîRµìþŸòô—v?æoÛp?ü?.¥f»Ê²û{XÇoúòÒ'ÁÁ çí}º2Ñ÷·t¿ãñE÷÷°†/}¾¾ÆÓDýÓæq¿gZïL·|ó³›g儸ÿõo¾ƒ¨Ö ÷?f“¿ýuës†ïq„?ΩOìÅýÆ—Qÿ¤î~-‘Pi<Ÿÿã"°ÆýDŽ¡½ÄÔýzAQÿœYõþ¿…ºo?ˆvA©Ó?Ö¸Ÿœ°W÷«I,ÀÝà”™õþ—a­âžƒþ÷“ZxÎüEÓýiÒ_FîÿK]ÿfgÌ™ó¯R»D¤ õ—!cÖrNúËÉýÀ5üÅrþ ¿-ýksþýƒE?¯z¿ÖÞücàÿÌK?Üß¡ûŸÙ?•þùfîwi aœ-²ÏÜ÷ûÝ?¸¦øåèþ¼_èžÅŸýdÁý¹Êùo/ù×t?ðou®àþŽÜ?·÷kSüj9ŽîGî/!ß÷Ãý]ôõÓÓYÀ!ß÷ù ÷Ãý½ôó_ZÆø †ðÃýpîgƒÿh3ø«»ÿÕý|!kôÞjÊ?ÑRfz]КEªÈ÷î÷3q?üGoð¿ºû#ˆ¶8"ÿ攎¬Êþ°f‘ºùªDúëÜÏÅýmñƒüõÝE.9~+@ÿ:c{é—Xï¿vîo†ÿíáoí~r—½õ!&ôcâÙpzjBFƒ•go¥C‹kßÑÑtÙ˜·™»ÃGÁÝýEáÿièþ¹åø_ÿ@ú9iìþymè0—úø'ýó&Ú¯ú? YÜ·ûè4úÞ]€û˽ýÏOK÷{¿òlȯwð]«»î$N¾1äóVj‡3/ýÊUÀ袦ìF¡R<¹3ž£Ó×¶·{Ä…>C÷—§¿‘ûk•þÇ,Q½ÔÏÁý´T&¦0®úX ÕâÕ—P÷!ßô6‚èß³ûËã?fÚð7®÷/6ä¥Ð¯“LúKQ(¨–Ë sîçíþ¢øE¢&ü­ÝŸ—þÁG?…sþäþÙýûv!üÇÂQ þÖîÏ‘õ3ø‹ÏúMíý©Y¿A/.¸²~p?÷çOý•¢h²Ÿ…û½-~sÚoîè¹LXõ~_뿯ŸÖhøjÀ µø Fªàu)ÑZüà~îW~ÆKÅœ™~úùS¥}$D‚û©ÀùááþLøÍ¢üýñý«Ü_’þÖîߌÿØ<ÊÀ÷ÃýJ?Éy¦î¹"3¬î¶ÈÆýðEvøk»Zcf¡'}ÔfCÄ&ÞÅ¿‡Þ¼ÝoÌÝMisxqvÿ:üG†‘~Œïï9VÔûí©ûH~½ þ#ÛÈ?æöéþ”z¿6w÷Ôa² ÷ÏSÙ‘pø#ñú¸p?Üo–üSú=¸?QÿÒé§”3÷Ãýfq¿«z"þã(J:!pÿÞÝ?w­2:/ «Ç*ss<þã(J;pÿÎÝ_¢”û£±N?%žŽ¢î¿ ZÅÚ~þ”“~>îcEãO©g£¤ûÁ`KúWº?GW†î·W± ÿ„¶îG4 ŒñóÒ!þþ”|*ÊÖû­cüÜú† ú>Ägú‘ó—šóß‘ûêÅã(Yþ´æL çœÿ~ÜÚ|%ãOŸ é‡ûá~1îwgÆ$ÓOëÏÜ/ êüpÿâöŽ=ÆQ.þ¡Ï÷ïŠþ ÜAÿ§ÈŒŸ'ó÷Ù˜~¸¿8ýÑ…~¸?Š~¹ê7åßœ~¸Ÿýpýã(¸ôÃýëéGÉøÃý îýÝŸwaxÐ÷g¦EãÏÛýy†ýp^úÇQ6þÜÝ_пìþ’ã D¹ô—u}úóλÝ~ï÷'7V-¬ÑøÑîÿ)O¿ ÷£püá~'ûÙøO{÷Ñľr:ý îOêA”ºñ Èýã(¸ß Z6ü·Óï»­§Øæþ /©‚Üúûr¿Y«UwÌ÷%uŬÀv‰î'}ád÷'¤’6äþq?Üïói ú–ÿª=œR7qÒOÆ¿d÷¦_€ûÇQ>þpÿ²OÉ"O!“Þ«Vš”šÎ¶¶ppmSm¼Üú§ÞUå'ÜúÙºß)À"ôûó€Žß̹‘ô+›è·õâmîßU>ÜŸBÿ8v€¿ ÷“/SUžþÙí¡ßÈ® k¿›ôíè_›óÿýß}!4ú¿BšûDZü…¸¿)ý¹èÍ ´H?ùÊ$…ètÿ úï±ô³w?è¯ë~6¬ ›H¿RGÖTî{ïú«DÓï©ä—Ëúsÿ»À_Žû‰ê¹¿,ýïðçŠwúùÈr-~¥Üÿx´ ÷cøKrå’ÿ\©÷\ ܼë× ÅójÞo*ÒÇÐïíئŸ¿EÿDv>úy»ì$$¹¿'úIû“õ[Ø.'ý‰îÿúrãoÒ¯m.Úý ¿S÷“M¿ŸÅú7ÒKÿ¼èOt4ýzÿ]¾ûÇnîôõ[Gÿ`ôðõÝ÷ 'èÖý)Y?Îî; ¸ßßÏßçsÑoö쉧à_ï/A?g÷ƒþNݯcI¤²!Wo' Fg`ëU‚íb9“lÜõëÃýãØ'þ»ïë§·¯«ž&GÝúÍqºñô;ß‘WÎß¿¨÷éþqìÿÝ÷õ3FÐh%yß(ŸHúWI ßU‘àå~ûéçë~Ð_ßýuFùt??)Óçpÿ+Ð¥ûDZWü1¾¿Kú/©ôotÿWú¹º»Åsû ²Ôûûu?è‡û;§k½¿_÷c¿øÃýˆ îrÞ£ûDZcüá~Äv÷O­ÿý¹ôÃýpÿ‹þ¯ üý¹{ÆîG¤¸ßÕÃOé÷×›ûDZküá~D’û­¾ZÿÞÜúá~¸_£_½¿væþq츑ê~+zã7vp?"1ç‚?’þ×CìÝú¸?çÒЈüíý^ö£Ýÿ|»ûÇû@?ûö~7ûú}}˜»ÜA°s?B`_¿ôß¹»ô7p?B^_¿Ý?ŽÀî‡ûó¯ã' Þ?ŽÀî‡ûóÓ/ ç?ŽÀî‡û÷¹†/è‡ûáþ"îçßׯ ‡‡Sü«¶÷ËŒyGœîþ¨kIêÆüÜ߆ý¿`‰¿ÐöþŠñK¿¸#NwIú¹¿üMðgå~™U€Ë´‡ûùÀP‚þUÝúëÓ÷sŸ!þpô¯ÉùïÂýáo€?Ü¿oúcÜŸ°D@ÒÆÌÜßšýü‹w¿±joú“Õ\Ï”œÏ»žÉæþ”B’6æå~ð3Ã_ˆû)Ë&5èO=ª÷ªfÓÕ#3ýËîŸ^ÙùVä9hŠ;"FîçÀ~}þ{¨÷ƒþrîÁLÃkqe¹qí®vPÏ'Ÿû½7Þ  ._€¸Ÿ üœð—å~R¿g…¹§Ý_Ófô¿†È8lm1q¥ä¯þ$e!á—fÏduÿ³&vý®ËýdÝ%m[6îgÃ~uþ{q?ÑüOû…|_ÓvîWáY:lƒ~ç&ú3›ŠÝn÷›?†8ú½0s?'øëâßU½ÆAÿ…\åæFY?EÖŽ#µ˜1àq}²´G(ºäë~›`¢éBc&2ý[ºJþÜÏ ~.øËª÷Óü=SHPäRòW9'×akŸ%š~¥.1v?²{ [;÷3c¿2ÿ}¸ŸÈç~õÁ~óIß*ýsaaÁýñŸs“û)ºäOÎË+÷óƒ¿&þÔû‡eú¹ÔûÍ’ÿ¨°¬¡¿L½JžN9GOÎ_M¾·ô•üÛ»Ÿ!ûUùïÆýJ!_\ÖÏt¿Vòw<¥ÿ[—õ[ÕÞ[ÒÞÏþöø‹«÷¿8Ì¿a˜Ûýôõ3òûDƒ£Þ¯|+%`|ÂÕ-~‘î/Is÷3e¿"ÿ}öó¯Ðû·û~þƒ«—ÎÒ5.%õ°÷|ñïnŒQ™¾Îèqý P]÷ó…¿þÇþÜ_iàÏÜ_ÿT×ýßßlÙ¯ÂÿñØû«!ÔÿÜ> ë§¥.¶Æ#ç_ÿÃ1þ^ø1¾¿wúcÆ÷ÇΘº1›öþï²ø6GYø+Ñ9}1§¯²1#÷—ÄÿpàŒÿñÈÂý?ˆZ‘èþÂô³p9üÎø<Üà™óßü~åè?d‹úêÇZ>½Ó÷•ÿáÀÿcEúá~©î]œKè:~ßeð?dŽ2ðÃýpØýöJÜZô‡×üûbêþìøÌñ?á~¸?ÙýKô‡Ì縆oüE¢&üp?ÜoÓÿ¥_¿é¿/ÐÏanŸïìøÜñ?V¦?äþ ‚q{¿A³JÿãZ ÿ~¿‹qÿ7{ø3âdä~±Kø <ä õ~ã7?ýÏš÷sg?ÿGVîÿAW¿á*Vmsÿ]£ÿ¾@ÿ;1ÀÜýyñ?øãU÷ƒþB…|ó€7¹ÿ®¹ÿ¾àþ9/ÈÛý3ýßìÙÏÂÿ±>ýKî'qñówØ|óz?/úÿû‹Ÿçÿ¶ÖûÓJþ2êý ýßàߌÿñÈÏý ¿ ý¿Ø;èOuÿ]¥ÿž…~fî߆ÿ¡Zd‚Ÿ‘ûeIÞyv¨÷TxÆÿç ŸõéW–ä²'·šd„ÑŸèþ»êþ{GîÏ„ÿá ÿHøk»0™œÜs£_Ÿ[[ŸÚ>r !*r5Pèÿ½ûúY7ç/Äýyè?Dà߆þe÷/Ð?̲¥ßZØ"ŠåVô§¹_±½–ÚëÌýߨ_Ïÿ‘³û‡÷r¶ý4-¡.sûZ%zÚ©a½Ÿœ3Y+ø›‹ój³oOgš“p¦ÿqïyg½ûï ï÷ŽÝ¿ÿÃAþÇ#c÷ÏËSè×&Ã×&ÆgFÿTê'ß:Ãà]˜·ýÅsþ˽}x¸+þ‡FQþîS¦ŸÜ?[ѯ¬Ça‘KþÅyçYÇÝ+xe£ÿu–÷V»ÿ¾f”Œ¾~ýßBàOÆÿØŒþ8÷{èŸÐwmÔš~ÓýJ³Å`¬Óe®Ø«/äS›þ÷ß¿ÊÐÏÒýiøšÆøÅ¸_ývϹ8/Y‡2ôÿÌ=säüï ³{ôàþo1ð'á„û[äü=+ïŸÎGÿÅG¼ûïþû_òûùoÁÿpƒüMÜïÉúéMÆFm³~1íýÞxí¢A‰¬ßkݯ–óí‚Àú™¸ß¢ÿ[ ûñü[Ò×Þoµ9èŸ[üæ@Þ}ýìÅy¿a°–ÎXò÷ðv¿‡þûBÉ_°ûãð?äà<²w¿Õq§Ôúù×XcÐAÿe½û]­}÷…z¿˜1~Nú¿Å°ÅÿñÈßýV!ôg ~½ûmúïKY?W­ûWà8Â?þêîŸ×~WÆú€þrôoqÿ})篷 rw¿‹þo9ì/ñlMÿ’ûåMŒ)d„o ÷ß[üÌNÝÿ- þ þGîîýrÜ_lï·'òèþoQðð?òw¿‘2§aÍx¢Ló4úÉÈùkó4(õuÿ}¹·kÞîOÁÿÀ6òÁ_Ûýäš#4rÎS¡¦úî'W{?¹¡'éî¿/÷õó¬ãÃÙýnú¿eÁïÆÿÈ€þe÷»)‚~röõ£6Ê/ã~_wýu¼¤¹ßÿyDÂÏÒý¯aûýsúÿuŸ¦–A¥¨=¨ãÿ+ÒOî~þdÙkæ‚a¨sŒYÝ€ÓJ^ÜÝoá8Ãÿxã~2†½ªLiÝcÍõ®³Ué§!D¿}ÔµŽ2£ûSÖðM[Å“û£ä9ÔßÂýdYß(Ñ[ìØ#ä+ÓOC˜~óȪ¥%3º¿Ü Þ|Ü#ÿÃAþGôǹ?D¿28žæÌ:wúÍ£fTòtDÌôÇn,Æý þ‡ƒ8üǞܯ•ˆ…û§!È~÷¥—¡Šþ³¹¿$ýÜÿÆÿ *à—ç~'GÍé4÷ÓGÕzÿÆñý;qÿþ‡ƒ<ü7ÀßÄý±Y?#¡Ö2ë§Òo·÷ÛG]=ëwÙ8·ÏNÜ ÿ[ûþ|èkïw·ø Zß¼ ©mh4´¥Ÿû¨«×ûý³{Àý±ôDÆQ˜û“ºö ŸÿFúcÜŸ°ZxÒÆ²ÜÿÝü<ÝouÓýmÝI¡ÿ’N?'÷î‡þO~î7ºïÕ*!Ãý~÷ nîïLþGNôc|¿@÷«™LǬ…¡·Wú7è—â~Ðñý»t¿tb˜~cÜ÷ÇŽï7Ö³¤Ð—.\;(7âß“óŸ[ø©÷««¬¹ˆ½•3šZõ4ŰsWøo„¿åø~2ºø¬§¿` g|¿ú£Ý¯y\ûá?½ŽÝ¸»ôóß/‹~c|?ñh­Èè~}Q"ƒîMôËqÿw?ð³u¿Òc^§_]ÄCëCcýn«/Õrà߯±¢ñ!™î× T?•gú2›~„»ôWmï×zÅSÚ¿*}}ãûÕ¼Þkޱ¤?¾Þï˜Âd!¥gŠŸäü{*úo…ŸÛ¿Ðr˜öú—úÔ{GøÒ`.Ñ'Üý[ëý~úy¹¿ù™ÑŸ8ÆO¯ð/R¯Œ¢çEÿ|`T9P:çOK9õCÓ Þý ¿šûi’Ý?´¡ß1¾Ÿ\Æþ­íýÃRºÕõ‡aíþ^ðßK÷›ß¸$ú©*ýV®ÏC?ÕnÌ[ïßF? 2Üú9Œï÷Ò÷jfý´ ™™2R‹Í2Ûû½=}{Yés5Hp?õO?±uÿÔ?Œ”ûƒ1#Þr‹_ÿ¡µ|”3ÑÀ”þ8÷ Žî§.ädG?Æ÷ íëW”~vîÿìþO¾îÇø~¸¿­û{¨ùùÑñýp¿÷öMÿ'S÷‹ ¸¿G÷ƒ~Œï‡û_¯©óu¿xüZû˜Öû•b¾1¼Ÿg%àÝÏ^c”8%,òÌé—Ôùº_üü~ MýÌsþ®.4ÔZþnSO_"Iôc>ÿdú³ã:Õßø½ßG?Ç€í°iKÇ8¾î/L?K÷W”ÿé”ÿ¥^~ŒÝ¯ ÖqOî1uâQójU+"¸èwuIr«(÷ïd _ÐϤ½ßO¿Õ­××OT¯†ð¦ßì•èí‚\ùðr¹ÿë ƒþÈY»¿þ§Svü;øóu?¹Kþ/äBo­ž[‹~{vÇOãXe¹ÿ’¹EÜÆ¬Ý_‹þÓ)?þ<éã·Xò'ßú!4ÕT¬ŸwÒ–ôG»¿ýLÝ_ÿÓ)?þËcû»ŸÈíÓAMºs¡_9°ý¹ÿQΗê~Ðßp|¿?çï+MŽyZÐ O÷¿áöÐÿªæKuÿgúO§ø/ëgì~wÖOÏèY%sBývôÛÇé>VñîŸÙÞF?W÷WÿéTÿ#Sú£Ç÷›£âõ¾~Ï)ºõéóÔ¤ûëù¦}ý¬?ëX…»_%»S÷—ÿú¿‘ÿˆ}Ø÷õcÔ_vïýüôë\wêþâø¿Ùó_ ~þ}ý@?_÷›ToËúñuaúö_üwMÜø~}ýÌÜo=¾ÅïwGIîÿ,I¿†þëP~ŒïýëÜï*·è¿eQîÿ”7Ò/ýß/Ýý/ô#ÝÿR7}]7D¹Ÿú¡Ÿàþbô;†õ+K‰.V_üË|Жž‹™Ý¯´ñÝ#è¿ß•>ïÎÿ²ÜOÒääK¿î×&!1èŸ:¬£?f÷:îWÛø"è¿ß­ä¹ÿ³ú?áþrôaú‡eúƒÏ÷ßÕRü"ý÷™þ{°äÏÚýÂjþGÆôwì~µ£‘òsp¬ê1ueÖW#¡Ázȵ{ÒGÙÝOÿ›úû—ÿãWYîÿìƒþO¸¿\_¿a\|µazwä¥i ‚»S+÷ßSÜï®s?è‡ûcéì‘<¤uY&÷¿äœÀ¹{ÊJ ™sþ)Y?­ pW®ÒÜ/ ÿØy|áþÜ£|¼øîKC,ýæî)I€ìíýÑ-~ZGà»{P€ ÷ƒ~¸?L¿6»ˆ _Û)ôëæ¤?¹¯_\o}mqî—ƒô<¾pU÷ç¤?kÉE?ÿ˜ž¾¶úEöó_˜áS ýŸŸp1úç&>ÚÎÎéÍ“ÍY?ã!÷îY³~«Æø-ò±§òü’ë~Ð÷ÇÐïlñ›óvZ{ž’Ì'Ãý¡Ý3·ø­ß¿4Â׿D÷ Á?~&O¸Ÿ{?ÿc ÎížÝÃ˾H÷ƒ~¸¿ýÙ&ÿ*:¯ßÂÌ^nöeº_þ 3yÂýœÝŸkò¯Âsú.Ìë'{>õþI2ý'¸_^ÉàîþÞçóŸïŸN'¹ôÿ<Üú±–O~ú¿¨Ÿ ýÝ笠ä]Ìôeüëý»qÿc¾]©ô?î/J¿5ûxýÎ6<âæþr«x²wˆþoêgB÷ãû#éwmшþX÷\Á›»û_kmȤÿuðp%ú­u<^#ˆôµ=ˆÌ Õÿú‚&Ö¯µÝ3ý±Ëpÿ©úOp9ú]‹Šýz!úZg^}8yf XÑÕ7›ûKÒÏÜý'ø/À‚ûëÐ? Þ1=Ãü˜£êo­_:¨/¡¨êþKd¤n,ÂýÊ:{òèWî/E?™XÓÜ?_£~Œ\ÝûLúÕ—Pzüç,ùG¸ÿ’Bÿ%~Þî_¤ÿ[‚ú9п‡ñý®µ»'¤ÉãþÁ5ôWÝÜH֜ׯh°w¿¶È®4úµƒ‡ûkºßE¿½Ù`àN”Ö$ÃýÅégí~Ð÷‡éWÆ÷û³~ƒ7ëGF†ÏžÇ³`ÖîÒ:‰À?þW?¸¿(ýÞ¿w[þ´Ö×ÏøÿÞ¼d‹Ü¢ÿÔý'¸¿N?.ëçr¿Ù6¹Ø‰Gc¦#áÁÜý'øÇÁ‚û‹ÓŸml>—¾~v‡¤úÍ{ä¹0òvÿ©/úOpq÷ç›ÏÊýÓ¼bsÅcªØ¸0¦çŸ½µ$Åý§HüYÒâF?Æ÷‹vÿÜZAj×F²'Ö6Ó§-äþÓI†ücÕ?ã÷ƒþ$÷[Ø«—ƒ0ýƒù›÷ŸN2ä ÿ î/C? ÍúÅ»Ÿ†Bôsu¿ ŸÿøÉß­þÿøÃýYé7ª³´ “èþbô3u¿“ýüÙÑÿ8T/þp^úcÐ&Éî§aýòêýnö=øs£ÿ}¬œèßÁø~5Ó=µý½×á0:õ‘ó÷Я=¯Œ[–’ó÷±ÏNþÇý6ÿpvú­ù¾»Ö:_;iï—××ÏÇ>;ù‡á·ø‡ûËÑ?¸j»FaØ=Æοý,ÝïEŸ›ü‹ô¸?3ý®ezUú•qúÜètÿÖž¾âÜïgŸ™ücà×ø‡ûsÓoLåafºIºû‹W÷‡ØI¿Â?Ü_Õýĸä1~®íƒì³Â?~…¸?'ýú_·û­¬Ÿ÷ÿDGêÆ|Ýf_*ýoþáþšô+ãôµI½e¸?šçKêÆlÝFŸþið¿/pæž¾Lóù¯£ÿê~zò÷ƒ~ÌçïÙþôo ~'þLèöóCà~Ð÷»· òw©?êðá~Ð÷{7_Ü–+ý™>Ü÷O¯QrOVî§h:à¿þ ‚ûóÑoñ]ìíJ‚Ü?=yÕ¢»5|)þÛ.•þ„Ï÷GÑ?MÉŸ@¿~½X¸÷_¯nü½ô›— Þî§”/;GúSNÁý™è7¡à@šû¯Wþ[èçãþ$øÛËÿ¸’þèÏ ÷Ç÷ô}Ýön­íaõ 2—ëX˜ û¯Wþ¡’ÿUJ½ŸÒ¿êœèO?%÷g¥ß1­µ¾×ls¥ã¿cå._'áfî¿^½øo¡Ÿ‹ûiå7½þ+ÉOø¬p"ýZW_cùM«:`Ò¯lä˜`E «û¯W?þ~úí‚?O÷SB.ÜhAÿº“óqáþT÷«Ky%›bZ¤_:œ\ôÏéþë5€¿x÷Óæ¯yú7Ÿjãþß»ºp—üu‡Sxèצ –î¿^CøK¯÷SžoyMü·ù™ ºÿö½åü½ô»KðËôe§ÿãï¯áþk0¤çü)Û—\RPäi)Sïÿ½ôÖÞodý^K]ÙÃú•Äÿ´žâêdýΆ÷¿~süü9?è¡ÿ±ÁUÙ§û÷ ÿòç.Yïÿ豯éYÍõ~uÁ;µŒ ^ˆ†àÔ‰ø¿éׇÖëõ~ý.÷?4®ÿïëkúá¦ÿjýŸ¥û÷ ÿâ'Gο‹~þ3ù—•õþÕô¿ þW¶îß/üKŸ9ÿ>Fù¼ÎòãÞªœÿ úkýWM÷Ú5EÈÂý´gøgü îß!ýÑî¿*"¡úïýoÞœ“ûés×ð‡OÜßýOüŸwVºÿͽA¿+ë—FK÷ïþà)€û;§?Áý¾zÿÕATç€öîüÁ“÷wBÿþ¯ŸëÜïÏú]źð‡OÜß9ýrþ[éoæþ`ÆkWøSðÁýâéÿïçõc}ÎÿK©÷O½}|ô³Ïùï<Ùs!„û;§?­ÞŸØÓ—s{?JýË¥¸¿úÿ»ü·Éý+égÚ×ðGà_×ý?ò‚ûa/õô-ê~¾ýü þUÝÿ#“þöôÿ„úùGŽï_9—ç?À…E÷#jź¹}ŠÍîQßý€?ÿzîÿAT- Éóú­›Ù‹áÜ>€?ÿzîGTÔ9}WÍêÉn^?üËøSe÷#šÐŸ4Ÿ™½ëº?ç7º_üóŸ+¸_¸û׬æÁ­Þø,¸_ºûˬäUÓýFÑaŸ-²ÏÜ÷¯ZÅ“×:~¨ò'åþà~¸¿ô ÞõÜø×äþʺ ðÍ"ÚýQ×’Ô+»ð·€FúƒçzÁý—ú/éôw?‘Õ€ˆÁŸŒ˜Õý·ÐícáyÜâo¿'3ø|Ðý-:åu?bsäwÿ- Ï#bádÝÿŠi Rm%Qr¬)>oi?Ùá(«û,Jºû|"ÂýçðNú§Çâè/í~úÝg¯ð¸ß ÿ½Ø8Y†×é=¯-l÷ïÝý¾ôG¸Ÿ´{~úÉøAp?Üèþgp'ÑO¨÷Ãýéî¦ëÀfúá~¸!ªÞŸ±ä÷Ãýˆ]ÔûY?¸îGÈËù“³4ÿθsþ:þp?Üá~³½§QŸXôõCÀýˆÍî/D?Ü÷#˜»Ÿ\wôSÜvp?Ü`îþ¤ÂRWƒûá~c÷Ç/gœº1Ü÷#¸»_øÜ>¸±ÚýÂçõCÀý¸÷#à~܈uÿÒ>[Vò‚ûá~g÷]¯ ôë[¿Áýp?B”ûÃøî×6¶~ûá~„$÷/ào–üÕ­ûp?ÜVïÿ#÷[ïo|µîÂýp?BšûÿؽFÓÿÞø÷Ïÿ”Ýá~¸!.çŸBÿ{ãëõ:ßCÎîGìÇý®;p?ÜWïO _ÙxþyE½îGÈtBÎ?jc¸îGˆ©÷—¡î‡ûp?Ü÷#x»ÿz½Z)g{¿½1êýp?B´û£èÿRýJÖî‡û²Ý¯Ê=ÐÞïþ?Ü÷#»‰~EøÊÆÓ£p?ÜèÖýiôÃýp?¢÷§•üá~¸ÑUÎ?!ë÷Ãýˆ®rþ -~p?Üâ~W ¯î߃ûsÓ÷Ãý¸î‡û¸?a„/Ü÷#úrüìp?Üè¬Þ=³Ü÷#ºtĬžp?Üè¬Þ=£7Ü÷#zrÊjp?ÜèÈýI+yÁýp?¢÷§­â ÷ÃýˆÎrþËÃýp?B€û#b¦?vc¸îGpIúá~¸÷Ãýp?î‡ûá~Ünà~DC÷_"#uc¸îG0wÿ%…þK:ýp?Ü`êþ¢÷ÃýVôÿþ‘÷§ÿ9Ü÷#8Ðû‹Šîÿ{;¸îGð¨÷ÿù¸žûÿ‚|%pÓûop¿ú§z?ÑDªrWíñß­èõùwyïõ¬÷;é•@ÀM7îw–ñŒsþä£ÜKÿ Ð?ÄÐïÍù?J à¦÷;¯òÆ9ÍäµÓ0ýxÊýuŸ¦túŸ½w›v~>Êù ÞßY½ô‹s¿F?iv'²\O*öêFóƒj±íýÈù#»ßüo¬‹€úÈûBAÎgÑÞœ?‚u½ßE?ô¿qÓOïê¾3Ü÷#˜»Ÿ¦b?iy>ÃîSEa~Dv°^î‡û¬sþä+ëûJþNúQï‡ûá~qî×ÿé9ÿ)¯§æümú9ÿa1ç÷ÃýöíýþÆÿÅ]à~¸ÁÚý…é‡ûá~O÷GôôŒž¾Cü.p?Ü`ë~ŒïGÀý{u•ñýp?Ü€ûá~¸÷Ãýp?îGÀý¸÷#à~Ü€ûp?îGÀýˆ|SŽ}¸îG°tÿ¥ýp?Üàæ~ªp?ÜàæþZ÷Ãý^îÿ¨x ¹Ÿ}Ü/Çýþ¸…ž\¹—ßýˆ^î—ã~/¨·ø/íåsÿnÝà~î¿…n ϯڋª”@¥#¹Œ‡àFÿ- ϯڋj”@ÅáO.ã!˜Ñß$ê”@p+}K-ã!µJ ˆÒ‘ZÆC ¸”@µËx@ ºÿêWìy endstream endobj 110 0 obj << /Length 65 /Filter /FlateDecode >> stream xÚ6Éÿ¯¯¯•••uuu333%%%!!!ÆÆÆ€€€dddTTTÿÿÿLLLBBB888666ßßßF`s endstream endobj 113 0 obj << /Length 1142 /Filter /FlateDecode >> stream xÚ…VYoÜ6~÷¯ ‘€J%)RGòÔN>E±yª[€–è5Si‡þöÎ G{Øk ¬Èáœß¤ŒüdT‹¨ÌU¦ŒŒšþF0õŸÉ«Ò3ŽŸw7?¾‡¥Y-jíÎUìÚèÏø{HþÚýÉ*“•ŠTfª:œÜ •‡£LI¥gG~Y»1Ió<ÕÛ$ÕÚÄ»¤ÒñºŒ“·]’ªºÌ‹X ”¿¹Ý4J½r< ¡T‘,Á £9„¢Ò™ÌuðF%©)xPçGÀîÓÈ•×Y)8òÛyvà;H6Œ–™(Š1ȯa@òãÐ&2^¿ù‰Œ± G_UÅÀÿ .ÿNt©b¶k—É"‘˜H’çpÚ—Œm·_¦­óÈ+×¹Þ (¸Øé(2‘_ÝØ'ªÅ2ö FÆÿfIZ©ӔǓ½·)…•jº¬£Tæ™4!°îÑ-eWÆÛ·{Rs'r‘`º>°ôUp uÏ2Ž€%1”Ù ¬0™Ö¡Âª—Ñ­žT˜$ðû0a¼e¼ðÞ†ÏÚÀÅà ñ.¶§@‚´0ï‹iÀÃÑÃé&°± 8É¢È c(® ‹6íðL [ĘU•±ûêúCvEü0Nƒk|»ííçÕ‡Õ í–èUI^åè*™\ãîÉ'wQU(ˆ1ã—=_›1ìÛ1È~^Ý™hYñìØÝç„@(Nq`¨#(Pï €(S:«µŽÒ à(¹`~G;a>@½°è(óɘð9–%¨ûHu †»<¹œ“{kà^çõ÷äYÇÆµÚ°Ÿàh³P%lep±÷ˬ½å¬r4gÕÿÉ®#˜+F¬ŠçG×uÐ@ècχÏÁ+Œúâ§fépbëlÎlE柩øûy¥ùY•W«CmÕñ´fÉ ¿÷K¨Å AÀ6æŠü8ø¯ï®e!Ð`¶àZ‘'HÛ¼CäÂvÛ¼qá|qSïfÀ"*µ#Þ|ÿƒâ³œôqO ¤;aÄÈÊÖi¦ä ž@ðíǦʕZGÍ 5?¹D³oü8XÒ óx?¹À`%øæeØã(G$Yã&çö«?ů9|ûawûG`mM¬~O=€3±a#˜Ñ3øÁJíE$!Å5å‹K_\ª€k /HbûîÚÝf²R•Ç-»9½ Ìhóª²jã@\Þ^S”æ&SàÖÅ(ØC‡cwì ¸€-Û±uMXÌ®ØE0*S\jä[Úˆ­¢ÃÆV¼cu3é|XÊ&ˆÔG‹]‡ÛvôsX0_‰?¹ed OnNº¬©–‘Jq¸vƒ=V»öW†ÈV”[g6$‡ uüÓá8ÐÐ`žk*Ò’&8°ÎBßâëj™În+¦…zev?ý$?ÇìÁâÅ1½ Û­5 Ê®ºóç˜ôñmWÖ™9>· !tvö"Û˜ÒוwåU„Â{¿_iæâ;1“Ϭ›šÞœ'½WÞƒÓ+Ö/U‘õl³÷?]ʲ endstream endobj 119 0 obj << /Length 583 /Filter /FlateDecode >> stream xÚ…TMÓ0¼÷Wøèbül'NàÄÇ.Z$„rc9X‰ †$î&éò÷ñ‹’¢"ÔCŸýægÆnððRs¢¥`¢Òžv Uyä;Ä›æðâ>”ÀYÍk ÍqOÑtä }kNÙ׿ŠA%ˆ`EUÇÎ#2¶˜Aò]Ë-çÞg¹”’Š—Y®TA›¬Rô¼øÉ™>ËE­eIàü᮹,„¸íàé<ôp©êŠäJ†‹R1®jD¾x€¼ó‡ÏˆÜÈÐí³³º‚•b²äà—hðèÿd<Œ+E@V¬½Þ»oçÉ$³ övm¿î+ú0ºvõ .%óÞú!š>;û‹­A¹R2à)ÅO!§RÑ“q£ÅÌÊ3YÁ95±gç§³:\IoDiAmìú8ô‡@Ñ.µÚ,êÇLTt™|ŸvO“28D¥ÕªôUت*z7Ïö/y7´8õÝ &0¡Áb€9›Et‰Šd©Wž phè¾Ú§¯4“5>uì#Â#êêŽDÍJ}A=ò‚_L…°,/”ÂheY^´ãùƒýKãc»µ[@xcõ•=Äù+–’C& `ÓdgŠ|?ÿC»æz¯} ç¸%3M¡2–Iœ™ÑWTbcÊRIV…gcN?äÙNÏ8€Œ€¢×GªÙö+uë<^€Á@Ó.Ôîh'~÷f«:7Y·øø¶®bMsƒÁnÿ¿h3½ endstream endobj 123 0 obj << /Length 3316 /Filter /FlateDecode >> stream xÚÉŽäHõÞ_Qâä”&opZ¤A]‚ÍHÑiW§]e;{Pà×y[„#œÎì•T¶_loß"Ó‡þÒ‡:y(3«<}8ß$ýç›TÞŽ0áèÍøÝã›_ÿ^Ó$®“:}x|ò·xlþ½5/‡<þñ!­â´R*ΫšGÞ'*ã¡X¥êáè uË¥Ç,Ë"õ›ÃQëš¡íåýÓA• ÿOøúÓA—™]ƒAC’èræçÒ.“i›iä‰Ï“šÖ;ÏÎL£†7oÚ“7ÿõb'Ï ±–pfЋ™NÀ·s; >KKlQ¦YœæLäøa>]¦öÔ5Âø8£ŠZ+‡]Ì2Óq­5ìPÅeUòhÇ3R÷©k¡€–öÌ/¦¾ ‡4šùóÅtÎ$<‰Œœ ½ärü8ÙÍËÿÍD lûVó‚¢Áuó¸RIQ+›/“Çü9>Ë<º©…õDÔÑQ…|nÚù4µ$¶°É’œ©™ñ]GfF–qæáFŽÄ÷ðH^Ò^ïÒØµãe™ì;ªWËã‹h~Ì4ýõPeû–8ÎÑÿFÖ÷õ³éæéÏ㇩eAó¡$*úä‡Ã+Ó[éÑàãAÖèheñÉQÆe^ý/Ö/;˜¦3tØÒÊÞ Þ‚Ó™G.È_®ãD¡V¾{æˆÖ)²FkºÏ¤_š- Ÿçñ2·<<YËFX#;„Gdàeöuã Ÿ²ÕÙ’0ülÖyÄd˜ |3pþM$m¯£,ÖÅ·¤dMŒ~Âd”È@ý.Tôíó8™o^€Å ¯ÁÅÎ4l,¡5žyÐRcì¾rÌÒ¼Ù½oyksn­È®5í<’‹8ä99§„ôÂz|=g Cä>uvC¶ 盀tP5² ½ÚD…6áûXX æøEËã}’êçË$_Ó¸˜R=ñ÷ ð<Åû$KZëè´ŠÁŸìí¢E†tþ.r !Ëëa„ÛNÓhÌU½“w¶K£¾cUÝ w»Ö l³ªÉÅCögÔ¬¨ˆ£0ê8ºÃ‹ÓÈ[wb½hÌuôÜa¼Q˜yýˆr7$‘¬ÂðE¤dDtF ÎÆ)ƒÉÝÁ,ᵨEÐÞЃM™qþ°Ždާ#2áZ³=ÛGï4™—®ñL¼—ÓIçµ¶ŒSm>·Àݯ ºYYÂÒõÝgÃ#?Î6ôhH4ùh?óIu§…Âhïv~…„‰›Ÿ'öÂóS×x”=‚ì©ÔZUv‹"b2;TBÑ ¼:ÈQûi0¢³Î•^¤‘Që/UVÅYQ„ f½_^çÑ÷óŒƒk˜»ç¡C)ž 8a‚¬ò¶5UÙU6…;]$Äì=òF#ÈüÚÇvø c‰gßð»ñ’¬tœØR;î8§…sdÿ—F^‡]/ÊŒü-óé5¤þFõ‘•~l`ÀÈ}]Ib P2¨–,™pE“=¼\—“Bž?~àÏÛ[ÆÝD‚uSãÄW`æER\£Ë;‚†¡ 5óàÛ̆¡Oæ3ÏâÄDK.‰#XµÖè¬òDFÙþ1ã·ö•¶ÿÏ!‡ÿO5%FøÁBWªm6ˆ>¦ˆ>RN»—ÎK%Tx¹Õq–8D©‰Ä#¡eÍdò “1¦,Ël¨gz+ü|Ût”+õî2öû•jfH3vò6;‡:ö]Ãã6=W˜Òú9.Ìr¹ÚÝÎÍU}Ûê W•œÄ òTœ÷a« 7q—¡éxx¡J5Eõ $³À[†b¤Fù4<Á¢p˜§¡mtÿ‘ WpøÓ¼‚ ¥¨òè»y¶gοR,I%.+?.gukåbû¯öbw—ª´35)ŒuÂ|ð ÐPhEvCØÞ?SWq]Þ=±†à”Úü3Ñ•,B*&ú9Ô²?¤1€ãØðÖn"…{ñ‰†rŒÁQ–¾†1Œ<̇ú{¤#¯âÜñÂu $âóÂJí*ÃÙÀ€¦Uçx€»±ùCEg¼„EÝOXl^ ó\.Ñ5›n‹L°X;Ô¼¬À®…ä|3â.ÃzÒŽç(xíŸÆEÚ7lùfmÓ÷‚87|ürDs Ö6øJß:ó; fØý½n›ÌöG¯:lÒo’FÒÜÞö!n„BVA*XD1[~gþ¤™hET4gö–X*A†lxŽ­FÐ$k–[ZŽ•/°}4Q”l?øÚï€7ÿ޲•›ìxGC¶ÜÀXHL.Šk¿žUQè"w%FàVRŽ ²þ¯ve£ÞÀÔ7{»)¨y”º»¼VIn§`€R}$†|ÎÔÃ1ˆ¥Ò){*„E±-ó‘:lèâA$W ª],¤šîSw}+Sðán¶±1áp£Ò¨¿où ê} ×zz™ºáÔ½ù¼…JšäqU9\~ÀvÕ.ÊÌGäoûNB“‹­¦×‹Åeâ÷yüJ€íh 奈*¡M2˜ñÓnƒ «¡¦t†€>”Û{„@•V¹©HDÓï¹ëIÍ£Zòê2‘¼^˜Â‚:øí߉ÀçÜ~4v|Ï/Tiœ—ù×û…ÝøUÔN»öÉ30Áò‹gTÊ© ËTlZ %wiàXW‚—d±$¥,)!Û(›gäúEÒyð™Êõ' ewwQ™¤؉· $EšÉÍý;³¶ñBúGa 5ÛtKaºáùí`æ åõ÷GF.ì4},ªq¯]³ÌK߯‹|,aóˆ×‘Lx;™ÉC^ß0û†eº‰¤Ý”Ø0žmÒ¹‚s*ØÒvÞ„Š¦uD øÎÅ—AÃÌÖ·Ø‚éÛÓZÂV좰¶ÏB-]¹= :\/’$£ë›žJå:ÎtxÍ‘ú}ý|Ãe•IµqYºª½øG5òS ²µ­£m+kF›]T•Äɦì5æÞìvâ•dQJÙà‡ bR»Mc7lýøz»o¬¤Œèa²øa˜oªâÆ@v)0øœo "+kð$Øßâf|»²•…Îã$)CYp§4y¾@ŬSªõÚBªó;Vë5)ù¶¢f‡e¶#Avu®¨ÎYk½½N‡‘Í}rëZ ÃæMï'{’«JîÛ$Y´ÜæS:ˆ6JK”myaÓ2Éü5é0l*6¥í&a§Ø`B_Ä„JÊ6KˆP‡WÜ ;It¨±w…a7l²öfk'·­|ëAýa®­IÚ«žœ £i«'…ow6õ•&ß©¨-ASpŒ/„\‰°Á£¢S'cŸVÄO]¿æmHxã—k_w23ß=¹$Qã…–ýH//k†ƒÆâengqï¨ÄS÷ú± ÑtxIRV±J\àOŲR\Yª qƒ;-]¤XŸµrjæ r-½†ùDW”*ŸÃøÙóìÒ˜Û9›ëÝRsø‹/Hˆþï%ê{‚ÕWë"µ,y^¥}´9ÉÈ3YíU¾Ï$‡«Ôù°à$Å&Â$ÉÁב;?E5o×Ík¥¾•âèXi—áÀ H{¯,Ïâ¬Ü”åΦœ·®]΋0¢žW9/oVçY'kéøÿå¼è”´âj¬nLJ§S‹/âMø5IPçâçÔbDzµ´M²ÜîIÃÀÆ!^Œÿ»½qîv³M˜Àíü›)üíäœÖ£™ endstream endobj 126 0 obj << /Type /XObject /Subtype /Image /Width 435 /Height 435 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 17 127 0 R] /Length 3242 /Filter /FlateDecode >> stream xÚíÝv¢:†á(CU˜2rÿ7{ÿ$„ì@ïf¹fÕóõa'”V¥¨Üê2W§êB¥­jaÈO]d'ûÖïbK¹U³#~ê"ëÿµU·?•²ª…!¯ze³‘1ˆ©3›䥬bËb*c4òHì2PÆÌ9‹ÉýP™bv½ûúèzýk›Y2ÇÚNÞ#;QÆŒq'CÛ$¿2(c]–6²‹m]vêÌÃêïwSV™¾^á]½¾ÿÃ'OŸO8?¾õ¡rX1Ïf©½µN™Ò×/±™ý"F–If ÊÆ/(\Ùs8¥ßźŸö‰µCžCd~ÊÔ eÃÑxâúãÝI½³Ü7<„ê‰}?úîðùXû„öˆjôm3øÂá-ÌR) ÆwÔg ÷ Ì|›»sÙë–[d‘”WÛÓï…ñXŒV3Üã+æÃh¸ƒö¯öH§Ó4ŠáÓ訳T¦OÈü”ó˜~/Œ‹S ºå€l½öHÃg1~õà)µo†Œ”¦e~ʦ„ìÊ G¯ÑŒoù¸¨Ý1AfÌrtçð û-—Ȇʴÿ°§²É‘Ñ¢l| 4F6åéã™D6ýÊ׋4„>˜ d¦ltdô›1Nš™iƨìó†!­ÉJkôßäã¤7Èñ7Œö ¹­Ë´È$ÖeßFehûú,AŽeƒå>ÅŸÌF´Å¡ÊÊ(²të²–·Y Kxöcÿã˜IbûW–l$óH,e”§²éY ~^¶oe£ÐP¶e†û'Ê,WÆ]¸Mh³le¹®ô«¬¿>®êNtËv?µ¶N¾Ÿø({~ fqcŸœzþNRUS{/Õ_£xé#뎔ŒH‘õ™½gŒD–‡²áo¾0"Y(¬Ëˆ eÊ(”¡ŒB…2”Q(£P†2 eÊPF¡ŒBÊ(”Q(CÊPF¡ŒBÊ(”Q(C…2 e(£PF¡ eÊ(”¡ e(£PF¡ eÊ(”¡ŒB…2”Q(£P†2 eÊPF^Ùæï€2ïgØü%¢Ì[‘e§LYfʶ4”…Œ˜"²Ì”m;l( 1Ed™)ÛràP:bŠÈ2SFdžýPD–™²ÍÆe+FLYfÊ6=”­1Ed™)ÛdüP¶rÄ‘e¦lƒDÙêSD–™2"ËOYê1DY„SD–™²ÔÊ¡,FdAÔ¢lCea‘5D–—²¶,K"ËJÙµlˆ,+eׇ² ÌP¶Udm§¬!²|”µm×ËBºʶ‰¬½¶MÙ9CÙF‘=Ž‹]/ `†²M"»~••D–…²öÝʘ¡l‹ÈÚ¡²e(»>5¯^æ}dDÙ‘uÆ®åGY‰²½+kÛa+óng(Û ²±²eûVö¦÷²Ò/3”%ìªÏ½»ÊRGÖN[™_7CYâÈžÆÆÊ”íWYßÇ·Rëe>ÌP–6²Ö¢ÌÃÊGfne>Ý eI#{»–e%Êv©ìµ&{^÷1º¡lÊÚ9e Êö§¬ýVYw3”%ŒìjŸ/zt3”¥‹ìÝǾ×}Œo(Û™²vIYƒ²})kZ™k;CY²È®ËÊJ”íIÙ§V¦ÝP¶ŸÈ†Æ®eS†;CY¢ÈZ—VæÔÍP–&²ÖUYƒ²½DÖºõ2f(K™f¬m攕(ÛEd­k+s`†²‘µ>Ê”m™ÖÇ ×}ø]‚²‘]ý”•(Û:²¶õie‹í e "»º¯ÊºÊÄ#Óû˜ùºŸë@P&ÙØ˜‹²e›FÖú÷²Ùn†2áÈ®AÊæœ¡L8²ñšÌz݇óÚ e²‘Mµ“²e[EÖÊæºÊD#»†++Q¶Ed“>ö¸ýûqêeö##Ê$#3û÷óØVu3” F6íc?¯ZÓÎP&ÙÄØÏ¿ÏÞÍP&Ù¤=’úùÞúÊRGf7æØÑP–62[TP7C™TdKÆÜ:ÊF6ÛǾ·…~†²t‘¹séh(KÙbsìh(K™«±åކ²T‘¹ô1§5ÊÒDæcl©£¡,Edî}Ì¥£¡,EdžÆæ;Êä#óëcËk4”‰Gbl®£¡L:2ÿ>¶ÔÑP&Y°1»4”ÉFÖÇæ×h(“Œl1ÛÜe’‘÷±¹Ž†2¹ÈÖ3w4”‰E¶®Ù×h(“ŠlxµâÊÍÖÍP5²õmÌÚÑP&Y;Ò-adGVVÄ,”%Š,ž3”%ˆ¬(â3C™ddQ½¡L8²øÌP&Ylcʤ#“`†2¹Èâë3C™Xd…L¡L.2 cEvLe…T¡L02)g(‰¬+”IEöWÌÊ$"+D eñ#“4ö<‚²è‘mà e¡‘É›q†²àÈŠ˜¡,02qcÖÌPY‘¢P1²Æþ Gv0eE¢BYÄÈþnæ e!‘ņÌPY"cÆs( ˆ¬(¶d†²€ÈÒ3A™dEÚBÙêÈ’Œì@ÊŠb[f(ó,±±©3”D¶-3”yF–ÞØøʼ#+6v†2ÏÈ606:‚2¯×Yl¤¬@Yèëü]ÝËÎAûÝQú:ÿ¬Uv»ée‰•ý®1v;÷›÷~wzÙ e~W;¿6ßï([£ì7ÔÙù6ؼö½³.[§,ÌÙ#§ÛðæcL&²#) qv;O6ç}ïœc\­ÌÛÙùv6f‚ eAÊ<™ë:šÓš e1”ù8Ó{˜~ @†²@eÎάÂ×hw±È§ÌÑÙRb‹펲hÊ\œÝÎ.ÛìyIb( W¶ìÌÞÜ×h‚‘QÙ‚³óÍ}³ž÷@Y\e\Î'ºff1v¯QSÙïÒ9{ÍxÞC2²c*³9sìaKk4cb([§Ììì| Û k2ÁÈŽªÌàìvÞ¦ÈP_ÙØÙù¶j»×(‹¯LwÐÃlk4éȬlàìvް}Ï{ ,Âë¬MÊ>΢$öîh¶ÄPæÙï¯ÍÙùm{÷ìØÊ:g+{ØhfO e¾‘Õff¿u[‚ÈŽóûefe¿ÉC™wdu e)";ÐïJ[ºYÔ^6“Êü#³0Ku\DY@dµEYäãb²x‘Iw³ÙÄP™yÖ¯—¥‰ìX)NVÙ|b( ŠL¶›%Šì`õTrθÊÂ"3v³k2”…GV‹u³>1Þ%P 2±óŒÉ";Þ{¾H*ã½8e"“9ÏxOÙß¿LfÎøœ{ L$2‘•Ù=]dG|/N‰nöšà£L&²:þyÆ{ÂÈùŽ·ñ»Ù{2¡ÈêØÝìž2²c¾{{leŸSU(“Ь6ž ïeI#;¦²:îœñ{>eÑ"›TÔóŒýÙÅg¡LJ™ÁY„N6Ÿ ÊVFñ<£ös2…2©ÈêhÊF?ÙT(‹,V7ÿ0Z¡L(²:Òœqzù€B™PduœóŒw׿ ‡²‘ÅèfîHeë#«cœgtÿ(‹YG™#)”ňl$-lMæ:Ù@Y¤È†Ö‚Ž‹uêÈŽ¡¬V ãº2óùE”EìeÍ¿“ÕîçQ;²Îš÷šlápŒ2éÈâ·P”e™žÊrˆL‹ eYD6Ì eyD6 e™DöM e¹Dö‰ eÙDöÎ e‡ eÉ2CYF‘=ÓBYN‘õq¡,«Èº¼P–Wd ?eEÙ#‹õ_8Œ2Ãï¾$¯eǬã(ûE†2”Q(£P†2 eÊPF¡ŒBÊ(”Q(C…2 e(SÕ©BY6ʪNYõ(”e¢¬ «;0^.(ËDYW}dô²lzÙ32fŒÌ)ÖeÊPF¡ŒBÊ(”Q(C…2 e(£PF¡ eŒÊ(”ÊPF¡ŒšW¦¨Ý—®ìBePš² [ÛW™µªÙÏR5?äoesû“YâĆü©¬²oUÿ;l)·ùD:eÕl]>OE¯…!gæœ_ý Ÿœ endstream endobj 127 0 obj << /Length 60 /Filter /FlateDecode >> stream xÚÁA0P)¬€+¶ âICµ–gÿÀÌt÷½wï­ªÌüÞ[kUUfF„»ŸsÌLDˆ?Êy endstream endobj 130 0 obj << /Length 1208 /Filter /FlateDecode >> stream xÚWKoã6¾çW=Q@Åò©Goí¢{(Zlí¡é\™I••-W’sè¡¿½3œ‘#y¸RÃáÌ7OŽõFÁŸÞÔjSZ#×›f§˜úùNó.†|Áñýöî›÷°ÕJÖªÖ›íÃRÄv·ùC¼ ÇìÏí]I]™‘¾ªéä^KGÒh³ÉGítêú,·Ö óm–;çÅ6«œ8MýІ.ËM]ÚBÐý»¶g€Þ˜ Ç ´r²vnSTNjëØŽ®ýû‹©ÅØxÛÓò •¢ŸþͼR"0õ]ákUY p‰-`Á¥X¸‰M…àÄ<Ñ*÷´žö6ÇÄÑí½²*è7K)JëC?ÌwRPpóœ‘Í »A3WšÓ,y ft~4ýþØÅ L!—°À>¯ØjNçY±‹Mò©¤¦|É]UH_²ƒ~'ÌS'zH_ˆ§8õDØ£–ÓaÇŸá±ÇðávB—àf×·#î<ÝöéöHgÉb<ŠãÂÉxrâÛówfóÚŸ&;kÄoXQdNƒˆÎCFvK´Ùi”lóÒ9%£.}DįûØÎlÖ9ã-ÒºÌ.¢ðÁ ®òÌL¸²\ ¨Nõ0Å,¸.ª ‰ CdϹÊ̈eÐ9æAW/@5g"¨ZM~­Ñ¯Vô] œTœ¸ëéÊ! ^ýÖCG™<ùµža laåÜ ¶`2¯ÅcœÆ«ÝÃËBùu÷@ ÆuÌ´-˜ÈŸC{hÚcèÞÆÍÒ@Oe±?ƒ„kÊ (¿h])œ)eé«u¥p8Ñp˵ÆÎ-É=Ë7Kùeé¨gù_]ƒàeiÎþú=ièvׄ™Zjó¶°œ_ÍbÀ6Æ.6mÁî‰<ć8´;þZ”4 /A@ )Ÿ3h/= “Ëñ5 dc÷P5-•+×nœ}V¨„–/ž©+Æ`¼­nzòÌñ¡û+Y âA¨jèR¬·ÒÛ[>-¼Y¤ÈÕ|ƒlsg¦Ÿ0ßûôï3@¨À?™)Ät5ý+éýeúܘ<6 Îý‚Û¬µá‚0ñÕJ°NVõº" [7¾R¥*—€ ÆÒaݘé%³‚!]6f„þŒ\é5ó5?[¹uZ:ÿæã…½Ú¶üµì“ðèé:S€ôÌGf|ÌÍv©GZè‘ØD¸MZê÷J»ÇÐ&Rë{ —Ûƒ$.ÐE^zåp8ƒt¶˜ß˜)_p]á.D%ëß·'‚P è_h/•,ÌJý•ñq溥ÿBØ2Ä<ú`|¢`¾Yֳʗ'évƒã²tºx»,aĽÑ7a Íÿ©K{½.ŒñP—þ•º„~£‹‹¡P©Wmê§Dãe= ç&§=’óí‹Q„Å|Ü>nÈM“=lø`5²%Åäo*3æÀ¤~龿]VÅv°Óf­¬ ÚÒ(!çü•¤B> endstream endobj 133 0 obj << /Type /XObject /Subtype /Image /Width 326 /Height 381 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 7 134 0 R] /Length 4628 /Filter /FlateDecode >> stream xÚí]KOc¹®Bhî¶¼@ljåÜÅÝŽPÔëi]!¶µ²gøûsü~ûØ'çØMŒ˜0¡C¾|v•ëå2ÀôãþìÓyø!<Ý¿xãr~=Bï÷?žÝq:?„Ó¢ÿÄËxˆ„…ÅÓÔã‡`ñcæñ"X|šYáHßÏóŽ{Åâù‡îÏcƳ A³ø2\¢g œ ‹£õâé·¯•tÜ-c/ægÅâáIþt÷|)±ø#YÔ,Y„§»á,B™E*Ÿî–%ñ¤¾—'åÃB1¨ïa,.X(wÒ³ówâ?¯¾º±¨•¹añI¢ BÅ+àY=,Ï«ïYTs’aQ½Ó“a$ŸWgòA¢…½&Z²¨æ$â†x§XäŠIC0ŸÕ´ª!Lû ”dQA̰¨'úN±¨À8A?a î)ó‚E>W‰Ö‹ÀQ‚`W^ÔÃÞÒ"Y|‚»‰–}#Ø”œÃuÎF½¨¶À> |Ûî¢ÐÁÄ»KWˆ[Yiéèä2­½¨1NÌ¢ýY³øâø­?‡xË¿OÞÝÇóûéb‡ûs¿ñqÉ@¸ùxÿãr™Ú>]ÞïÏ/—ïyÇýùüçýùtšá×ýâËóå›Í:^•DŸ¾>Ø@ o¯ôâ¥âWWˆ_–ÅÏzê€ø™ŸhÃâ¼o,ÞX¼±¸Eõ¼øaÙ± ñUŒ_ûA\ÞøæX$ó ’ÿ ‚¿„)ˆü•æÃÈOI©âFˆ>‹!DZøßeüïÓû“ü%„á‡kÈVXXþ:¡HÀ&þ<@%ÄøÃ5±ˆ ÃânDšEÎð7Ïc‰Åå³ÈoÍ9ayµÿ¶+I}e×"ò¿NR\Ä{ógˆÉï‹lĈEO\H®%ý| ":å4 n…è‹K´B¥#•¸ñ²uq‘zå“ b•¸$•NawYߣ_…é®×"¡V:rwá ÔÚ®T:{t#Ä7bÍ+w°t|3¢ÅÒ9âNöb`Fܬî›Õ}cñ@ˆ_¯¹aYÌÿ›h1ÿn–ÅסKÁ;Íâ? ¾81Ä‹ÿJ•5±VÊÎpAšÕˆÂ–ÆÁ,¢b)Q»[Y$ån+—BˆÜ{GD¡Nx}¥Û!|=ë*¹v«øDé1bQz“˜`(¤Ù1, *—¥?Ž£Öb"€It"yq”^´â‚ÁjSzQQ±-w«tB %.2èÐ âÀ=<rA©‘–ŽŽn­BÇ"ú°pB{QWA,~7#µ¹Ò<,r£ŠÐù2!Êy¬nB­ˆ¿XXH©Ÿ4o³ùè5£±Äb¢ß× €(™žèt>zÍhÜ¢ß×€|ˆÊɆz{qÍh|,úÑXð£3ÑÍ '!†ùè5£±  ,z ,Ày¢,.¨*/½f4>æýhbàG{õa¹e?•ÒDûùè5£qG?ºÖw óÑkFã^~ôuùhjfq‹}M>ºl4Î^1oùè[>z?z{ñP?z?{ñ0qÙÏêžâÅ)‹Ö,NìÑs°ˆ¶kî0Ù‘E´]rÔ€,À¢„˜F ±ìA’ÞE‡† ˆU>÷dQW:f&DÝùR‰Z'sºfÒN«6–µI=˜E§®™¤Œ¦!"*´›DS1`ⱨ^Êí¤sâ^ÐlèB{„X”» ”&DD7pz0‹‘©—‹Ä0`¢”ŽÙ]V:!‹a(50iëÑÑ^±É^4ô,n7ÆÞvo=ïöxcñÆ¢ùG»Iöa,áEÆTuñîЀªŽEÿ”¹Jêúi0‹ÑAx§¨ÄFeÊϨ*úWH÷dÑÞÀ¬fšN²É6jC[èMU±.,€ÀøZ8‹ .(ÐW081(s°ˆiˆD‡IõÁ92„¬‡¸Ô°„÷ šC×bêB…~ýi-1›ìÅ0TÑè»Ìl/>š{uÌGX©éÔÉê–íý_b"+n«fH/¯‚ØŸEQ»æ*-2ý ÅiÐñ,ºW¡©ô–û>$Ž÷ŒY‹.DÏ×Ö&šÝz,>w׃?Ñ‹úþ/ Ä¢„øÆ —º¾¬;˜è€EæA,KôÃÿ¹½ðÍ7Ú¥¯¾fÚ‡È"ˆþD—$º"ÛbN\PTF&Ä%Ç¢4¦1è(æ¶·­/ëÖW£0}³–Î;Y¥#,%D–R:åg²YhÛÛÖ—uë«QÜù©ÞãKkÑ\tæuó %+˺Yb17@Ì­E÷.6ÓQ¬1[ÖíB„VK)Ë"!ó BŠÅÚ²îýìE¢éží(V€˜-ëÞÏêÅÅ…hÄŶ·­/ëÞ‘Å7m+Õ@,ì(æ¶·­/ëÞ‘ÅobÙŽësDÉÒY­"q€ï²réµNfÒw©ì9Èw1ñ¿¨Oä4¾‹‰¢VTK ò]ÌÕÁAŸHp¯î»8ÝÞÎÁÃ}–è©tzWçz,^£š}— D²W§X Uƒ:§ÜÎaiãD—XÃbr-Æ1õ"Ü¢æ¸O¤ö^ÈÛç}“3·sà5ââëEÓ'RŠ‹¾"x•EˆnçPú@ºÓÓʆù.Lçý>‘òŒ7ó\˜,‹¶ùLt;‡ü€æZä|¥XÑw©žˆÒZDs„6¸Ã&2´A[oUl˜[‹ÊwQªÕ½ÃôhSð²…•%ߥÞ}ɲ¨}fÂDöv+ѦV”Ž }ç×¢™èøvŽDv$Ä,‹Z\¢Û9qÁbaå,ªÁöhwoçPú€·¹òú[÷a1R ]”­¾ËK¾Ë‘ów-‹3[ÍØÅ‹7o,ÞX<–Åi®©Ï³X@ø6 ‹ùö= ‹³B¼±˜v¦SáãÜeÏcX$j‚8„Å4Ä™Ö"éî4DhÚc‘¸x!ueaÀ"e †±?*“…¦Zk ª meƒmE3>ßwÑ*@Ä ˆäDÙPGÝÐënc1†è¯#]o² "è$mÜŸ Z‹ˆ Û2ÙŽ Òꓽ"ß»LÂjzI1¤”Q‹²æÄƒèT›(ˆ .‡‚Fˆr¢“븅EÆBˆ^)‡SÍ+‘bNÞˆŽ(/ß“º>Ñê“FAZYReË#ª 𠼬?‚¼Ò©fQ­—8ÔÍš!^·G òõB4b‹„Vè¼ -3Å’:d;†E¥5½ ­…ÈkOe‘Uªî¶±×ÉÞ!>~ïs>º ±9¥ÓÅëÆvˆ ,^ që ƒŽÓBìÃ"‰Ê|áVÉ«š*…®#‹zsÒç0©b'¯Ø•EÛÙ×øWP¼5¤?‹Ä 5;–Å·W›àVÉOrײX؇…X8°øÖ¢ê¯ä9/T/ÑÇ+!öˆu;M g¿Èi •7å@t‹œj%ú°p¼€¸ÉÜ %ú¸püÃU;í.-⎻ À.·ÍN ±‹òšB¾‘ˆ“;æ²=R·~:÷¼â QFkPÝKÙ±‹V"DȲ¨.óTцãAöù¿1©Dý%!Ê‹>QVü–ẎãA€¬{”înD4Í7Éÿ ¾Cu3‹Îõ˜XÈíP° ¢ºÇ·¸†È£õˆH×±¨½!̦Ÿlß'urUgJÁBLNtSÆ@_A”I?é†0à|‹`!¢ Q‡€¨ÿyR\š2ÆN§ŸtzœoMC“ Ö¨láª3[×¢>ÀŽÙô3§lS[ošmgÑ`Çlú‰…çC÷Ø–1ÈBd+Yûe¸[X$b*ýdÅ%Èt‰/êJo–pLúI¶Ó5ÇTmö K|‘¶ø”‹/V×:7²Ø ÑI8FÁ;¬<ò¸)cPí9 ÇbmU{×ø"óƒwL÷yÐùX÷<å ø¢Ò÷Áe¸Júƒó”ÃXD’©{Íȶ°ªÕK öe‘˜ ‘óg7JÒ‡¦XP¿Ñ—E½)9—á:Ì™J_at‹Ò*‰fn|1qH”Ö7—žUpžrP”V.7uΓ+­tø·wžEis»µì.ÓBì¥ÍÆ›X<.Jû¶ù#vÌ^õ°¯Ÿh/=¥cò.®ï3[¬;‚H“­Å„½è4:-dv¶]ˆa`e ¬1FVZX¤d·œÝX$g¢¹a¨mÆ Xê%»A4Ƙ-ƒÜÂâ1£|t=Ä…Å?N^LçPˆ6Ù[/. ‹\>Žg1ÌG3¬V:?/ï÷矫,SÍ={±".£´ñRLöâêîrþóþ¼¾É °“îl‡D¦î²ßâËñÇúZŒ R"å'º^g±N¢Év‚q® Ù/Š@G?)lu© îi/æ!ú7# KDÄ Õå+w— c ïÝ3¦é]8±¯u‹Òºf:E±:Jd L§¨‰X 2ÌfÈÞ¦µºìÌ¢'.Ì{')…­.;¯EÕ Æ®EY7eV»KÐê²+‹íƒþÝñ0½¸_ÆÀU¯ÿ¦êøC ;±ø6+Ä.}#®:’Ó§‹åN§†Ždq§SCS²ø»UñuÚ¡Yüš¢bæŠÅß片dñÇÔC°èŽ“ÿ¿#FaaÑÿýyï0ÿøœkG endstream endobj 134 0 obj << /Length 35 /Filter /FlateDecode >> stream xÚçÿ¯¯¯âââÖÖÖdddVVVßßßœ± Ø endstream endobj 137 0 obj << /Length 733 /Filter /FlateDecode >> stream xÚ…TIoÔ0¾Ï¯ÈÑ9$õ–I'¶JE*Òpb@ò$žÁÄS;A¨~;^^Ò ­@9äù-ßÛI°ûHRã¤d4§Iš~ƒûcC€ÊœBv¡ñz·¹ºv$Áyk’쎗»6ùŒÞˆsúe÷>!UN*šÐ¼¨ê(ÙcÊ¢(§„&Ù…HS§ÓŒ1†è‹4ã¼@»´âhµQ¢K3Z—l‹(÷ö›w»%À‚Òç3¸ßpV„—ÿgœ9‡&9æµW¼ºéiòVo>:Å‹­4‚i^W$™òRï÷?…!Ø™sžP‡¹%,&z­N“i>çz×}CJPjÀÑYÌ:P”»Cš[ô]ŽÀ¸†V硚®CÛ:¯p=¼:ioL+‚í‹J+t?ÉÈÑ ˜ŒÕ&ÒVLÒYÚKT»ú£V6B¶˜Ù¦´D_S^20 ¢Ó逘zОÎÝD§–¸ÝÏ!ø”2K—–“y°!=þN Œ‘(µÊH5Îø÷z²2wµu7ÖתӠö˜ðFD†‹ &ÒÃ¥i$c> stream xÚíœÍjã:Ç%CèVÚ”™]?@W³¿p1˜®Ã€!»(~…»-¾íµ>­o[Ф¶ŸÔÄ3qôÏO:ú8É‘¨i»^³¶Ïifiû]§ÙØwÍ,í²;TkûCF3Jk'6ý?º¬jFi[[ËŽ”íZÉ:ʶ¯äýŒíÒW±g볩çwÛA-M°u9}òÍSZ+Ù2ö·öMïoÜ)šIÍfÅ9½â^¶©´=;kcˆ äbÅ…Ùr´ÛÌ‚lû†Ö¦~c#jûFdcý}f£N²o?Öjq6^6^Ö^²¦HŸ­É&¦Ýø§ó° µF°Q•`ã6Œ«yØDM6 ÛôÀzÃÆ;«Ï'…gKwƶM„O²0ùGlHëoùÆÉUcÉ¡æXò]ÙĸQ…MÈÕa›Ï[§,ú^ï]5¾µžÒˆRs=\Úq6õ<É®£§´]w½ ççè§äEä÷I‡šÝßȃ¨-x ¯äïoüݪ—Øc šDˆÚR`Nc {7Tz@Ê89û¤O-ã0÷7æCÙ9@Ž%Ñj)lé3ÎgÎo[¶Ûà5]ÍzÙPó¤± +ÕnKjƒ_í¯ˆß2÷ã¿ efûñOÐÜlC¢–Õl©jï1lbŽÄÃËËË/=°øó²l¿ÞcØ\j7®ö;“šÕì3ú]˜­ŒÚ§±±Uâc²=r»=0ÛùÅØBë¾ül¡u_*[Õ5×¹êzò‘×\ø=TcÓ€¾‘Øß"Õ¸çÞÒ×%K3SãýÄ ²Ïow«EÍoÙ¦FƒõØj¨©s7ÂÙ*¨©c ¬ÉVA-jîÎʆ¿"ñÏ|ä/ÌfüÚ·}Ïõí¿ ún¿›>Ùl[>µó¶S®ŠüXÖUmcÛØ2±ñÌ3@ó×ØŠšžÏÆ~q¥—!žè‰LcC"׳Œ9–ˈd"ÏëC<ÃqNLbjPˆ.«a·šÆÆ~ƒfõÀ+bQ j8¤¦±AžI3©Fžd»15–=Ù³ò¡H¢î"äI–"ƒÐR’He;—Y Ò.6$kËRƒjýÍjò0.[Ã6· LSC8 ¦¯LèiW‘õ0«!l©é9ÂÂ'±¿¸Ù Å†jÐVCa5w»é^ÂX‘Ad~8=€Ìí¦—‰!gy,ñød¡q’©MYïo…æVMS‚ÚX²ÍoÛÆölçl[2×°}äTû¾9½÷ÇÝy#ázq÷yK6¶¯Îfl,ÂöÔª9ÊA=ÖC\4Ǿr…æ˜m¶§ñª²Í[õ8@qe@÷±©1Ž0j¯ä¯­®†×«a¶O awk²‘;èí&·®SS÷.©u“Úœ;£o\VC€±;`^öI¹EÐVû5…Ñ”®\›i?\yAÊA[ Û^‚dœê aÙP¤`ÛW©ÙlóÁ•=@Õ ‡]3–ØjÈ¡m5V[5N²HØKÄÞNñƒ«#`N˜`Í9À±}¾àü¬ÇæÚ¬_Ž `œn[—lñÛ¿ ¶ÛPÞf¶¡ŠgÃUL°U½ßë[û½öŒíXËê߃¸îý•µû}뛥]vÆ æú1§¥]ªÞòüj.Ü1 endstream endobj 142 0 obj << /Length 41 /Filter /FlateDecode >> stream xÚáÿ¯¯¯•••‘‘‘ÖÖÖdddVVVÿÿÿßßßëË¡ endstream endobj 145 0 obj << /Length 1337 /Filter /FlateDecode >> stream xÚ­WYoÜ6~÷¯Xô‰"š§Ž¾¹©¸@‹¾Ä)@K´£T»ÜèH?ô·w†¤´Z[¶Q 0°"‡Ã9¾ù8¤ù†Áß”l“KA…æ›jwÆ¢ôï3G)(¤ Ÿ¶gçW0䌖¬ä›íÝÒĶÞ| oÍ!ù¸ýeÃ Ê ±TeX¹aB†%*¸Ø¤‹¥f[—¤RJ"~LR¥4Ù&…"ãàºÆ´I*Ê\fDhÜv¹ÔB¬gðåLŠÌÏdy( •Ê)S%*ž_ïäægwöþ˜*šz%WÎ-•Ú­iÆeˆýª¹;ƒ§2†$¢ ¦ÙÛ6Ì/¦KDNþJT.‰ÝW¡ÀYHÊò`óO•fŒxÃ%mq„0)Fvv¦GÜ aªe˜£E)Á¤·u½ï‰æÄâO5Ä 'yÉœf:Ÿ6ì]ð4¸_8­ÝÊ”Œ»R8˜8½aš­ÄÑP“ƒ_ÁÂZPÍç¸ÁfmH¹·­­··A ,<”"@ùJ£à“ý‹Cê‘OWT!!¹¤|¢ñ2ð‚¿û*HVâVœ3–qÓ$ÍTI®û@SŒ“;ó¢¶•íp&H\Óâ$f°]äsi~Xs¯i.ŠcVOQY±« _2 CβEV« **”8:ÿ/°iEshOa{?&¸³v$(û vo`ÆK C(Ÿdeº8-Ÿí‡æ+â€H‹Bâ(Zlr2Ø u·}5‚Í}yµÀø¸É;~6P¡8ž”ß%)¤ævèçkc¿©wë5Hµ¨Ä‰}ÿ[GÙÎy‹¶¶^CaÔE˜Œ»©SøLC¢­©cã4]gú!À†ó£Ãv)¸ië¹QUµ¸°xâþ M'š˜Lílõj°ç&{coÃú¡³}'b ÝŒ‡>™ `¯Œ}òwìâjn8^=¸ðÛʸú¿èò©Ûn×xV€$ñ|!a±r¾ÿkMõM.­~ÒkúiÜ»ÛîÔÅXÕ„{.ó¬ 9÷.C­òÌ· ü¼óœË#çPRÛÞî?™¨ÅÔš|¶ƒó€S¥%#¿9ÌÏ+ôø•¾èù\tg£¸spcLõ¤ˆlY©†‚fÙ\ŽæÜ1E>Â.àëU’gÄ„‚ô«áð˜;—]½Êh^–G6š¾¬ï×MÂ*Ü¢ [ždt8}ì2JIò¶m¾Œˆˆ(§ÊH€É­^@dÆÄ£@ô h¹ìžãÎG¡'=¼A_œDïûPÍÍ%†:4«ø-,˜{×E[xèL;˜óS«& å q†è/~¦è©pä¼v¡¥øDcð> stream xÚ•YYsÜ6~ׯPíËrª< <6O>âÄ[©d“(ɃíÔB$%Ã!Åë‡ýíÛn`È1ul©J›@£Ñýõ…ç ü‰ó*9/RK%Îëþ,aêŸg‚G{˜°_ÌxqqöÕkŠ$®’Jœ_\-Y\4ço£—úf÷þâŸç¢ŒE)Ïe¬Êо¼KdJŸb)äù~ñÉLsgwû4M#ùÝ>ËTt±+³hžì`t·Û˪HóHæ¸þ웋  ’ò‘àŒGŽ ’,®²ì;eÏ~zÇi¥âTˆÍ“±wý 5í- _œEáùM°(˜Ä_¢õœp Ñ^ >öÛìs²²ŒìHÏi@Îì2€uË´µ‡XOnÚ±3Ÿõ Ï6'qžô·]6Ip¯M.eœ*égü²Å#wÎx8ÛMÊ£ Ïüí ò8^µ¥£¶Ó‡ÆQӣדùŒÃÂ9Âæ®"‹"lûan·6ëÈ<쌨‚Ý!vD£žï’4ÙeYÕ>\ñgJŠKQ¬œ÷n§òHwv4äÒÉgº¹7‡ nã½J“èegj:'®òq†LAT”ÄM)(2D®ï~ÙT¶Û&!n]Ùá†6™{z6æªÚ5$9>ÎDa‰švK2K!Üâc–”¬v¯5ˆG4uRѶUAÓ¹Œ(´ }Û}°D¹×Î*‹Ë$ØypYÿ5›öV±<úÛE°3 wJ¿”Âô!'Eð…ë£  Â-¨X‰ x›MQôç¹{LŠ2ÎÓÂó½ìîAzì8ÈîÐCs0·1Ü[?S@Œ9!ž­¦I¸ÄÔ®ør¹ŽÄ‹/e­Ûf`â•54hG:J[›w‰ÈjÝpò9ðL=ÜÎÆ‘ ÿf«Ê¥U³$b$@°±°Ý=¾Ÿ§ÿ÷–/ãêÄðTÁ©*ò[Ãÿz‘«èchø€eT uäÛ<\Úò4/¦Ææ8w¤¹–ß¶ÖáåδaD”Ò)÷p v\Ÿ"Ò©B½LµíIÞ ´%BŒ‚Iª0ºp<ÖC{‡ng¢êñ‹‰Ù̵&©Bʶ……ék3 8½Š>Î㤇@Á‡q¾7µ‡Ñ4ÚÏntÁzXzlåüŸT±E%ÐxÔ¼98¦ÿl,q™ÉEQœUyôÓÌ™ BâÆÃx²¾;uw=󰛯~þ°@] ™ËÕ|ð ksøÌ‚4üü¨ÁK4ËNõò¶³üAjëÛé:ßtvTŸpdÛB&Í7Ck&û5¼ Àü82}l;pi{Ð[áOæe\V!§þm³)tÙgüŽyÍ]³É­Š…|˜Y'ÇÖ\Ž…ÄNª¿íÄÝ:]0ȰȻ}í(¤+PW꿹 ešv›>ЕÂ&x 6*W}IáRfjG–ÑòàËÒØÍù =G~Ný ù£HÉM?—Ôi\‰l¼{(lÐYe‘âp€|ó*ê´+>€ÐŽðmðo“¯ÍVU\OÉ”—FaàEf.crÁftRÛ Êe½qNëåÀNnX°êm‡•¤HÙøÔl'Éùÿ4[yúØö7ÔUaì'ê<##maÄ<€>§@ „5èq;7¦À ÁéÏÓb¡]æÁ/)É3+uôŸgtÅEizÏòŸTfšo!@g¾Z$ïêéeœ5ß-Näܸ|@!G }ᇣö@ðÙBR–DÊSSå¤ Ññ­¾|‹ÒèÅ ûiÓJIœ/Üun¥iããuÝö]]çUXüŠ ñ×=m—H–÷u™(°ÈĽjm>iÞ–Ñ ÙÐãHƒ ‰/âx™˜œbƒ8qJ®ëîjHQ¯ÒcW|…Ÿ\Ei»‰gº^>sÞu4šºÎ±X#C~ùÁÒ”©­ÑÙŸQäo̵™˜¿3¾Jiß–æÅêSA?zÌwz;ߥÇRæÒm.}ÄVú*õ  —åI©àuœ^ÇeÐ1ÒHÁøR~™@ ð¥.‘sÈé!D9­zü¡Eº¤Vqé (…¥ýõ¤ÝÍ’þÄ:¦îssª<ób£šA*yž®›ÚáÀGåŒ8p%Y)NÕ‰›»b}2—†/ŽÔñâˆ>ºÞ¶ÑaM¦t ‚ y¢ð¯ñé·ÛÛyQ7S&Åõîà:Ç k?\¶ŸTKÔ¹ÅÓk/6‰"VEþ è^C>â¥8ª‚U±¨˜PÛUùZÓèE VcjWôà ¨Ì•m•ëDÞ:ü}…^(Ç‹r3Ç»ïô\6¶Dáà0޳«Ú…G›_ØÒ3À _ÈÁDÉá‚âÓ¢üÙèêV½%ùN ™{Ýa42r"^v èÕ<){Ó„õÏÐÉÑ;^u“Á4”—®ÛoxÉý½XŽ­ùdøJWº7Ñ4Ÿž·ét/W§êC.[=ûÂ0ïÝÎÆ]aÖ›Úa}i?òOÏ1Æ ”¦_‚s:ÒÜsŠí-…!}pë;¬_ÖÕ”Ãïÿê>á endstream endobj 7 0 obj << /Type /ObjStm /N 100 /First 816 /Length 1519 /Filter /FlateDecode >> stream xÚÅYÛn7}߯àcúP.‡äðRrAŠ-8)6ðƒbo5²6ä:ýûžYå"ï*–Äâq©Ï™ /³VE*eEhƒWYYöxRÎDEVyGŠœbvм RI¥€&cWÄ*;ƒAP€7bdÑÊàÉR:­PƒŽ³Šc­´ŒñÀ‰+=!rÙ*‡q1Eåð>Àš €z3P{¯¬Aßc*Âwh)–c%ª‡\D›¼‚Jë¡C,cR4mÆø }n |ÑâOµ }Lm3¹ŠaŸ åâ x¡” N9á ¨VÐmŽ0˜rd#ä½Á{ȳ1*BžW ò¤ceàO—€3á}cœðГ1OE¥)Á°Sb´9¨ ÊÖçJLâBTÿ{t0ĸ6‹‰<|eÐbÒŒñÆ#`ñI¬mÄh€ Ð>‹ï †äH™ Ø€(á_&‰  l­¼JŠ8AÂ>H02ÜFbMñ+ƒzdâhBE3Ž š#¸âSèÉ`Kb|#aï# kÎF@áU7) \fDXúJÀL,`%‚$LÁ:D‰+˜;$ <GHA^9‰pyÈð¤ðòpÉ”h£©NNªúÕU¿˜\6Uý¤¯šùj©é´ªO›e{½8o–Ȫîß›‹éäqûI½1ø#Àb1Û³ çR'õða§ø”©“U?ƒ#¼¼Á#fæÏˆÆÐ=B¾~±hÏ_6+õPž>Sõ«æÓJ}Qµ#Qdò+²R8q`3>Oýh>o¡æ¬SƒÜºY[®7w'\Õ/¯ß®ºþoÓù‡ª~Ü..šÅzs&PÎA‚Ó]Ø{Ö¶6NH!æ {ÔY४m_µª~ª“\ÀdtÔyîã÷® ¿÷£ðox¥”JP‰…TÒÁT 1óàÆT†™í}„NDÌ…øÃ}àƒE—sþ`~TÌ„AʆýR6ôÏ06eY®&c¸ÄýC.ãÍ=/?qà–Xè–èGK6XÁ=1k×NoѼõíäSÁÉÑi‹ÍÕš¨CêÊ81zPíúG<9¦Ý¨ÃEp!×ÁØRO–zl°>'. Ê~Ôú–íàÒoÊ¢,­T™ÇÞ¯½ÏwkÅ)h)(±”}rÔ†è;wëùj1}{=½ë~½×ÌYJON36Zò¤¥É ‰Àþ ‰áÀL;Cv—ÈÝáZêîÁ±-ïwlGÜŽÑœvSL÷@‘Ì`o’dI©sî,7˜±[È×}ó–[\ÅÖ‰¢¿Q:3it6“ÑVfBK‹³&´ÈíóÖ´z7½œÎ§«édÖ/ýÝí ²ÇÚÏ‹‡(M2©/î¦|[&$¯ 7ü=Nd·N”¯ÿxû¸L¤ž_Ðä»í)Pò¹}¾Ë.v˜–Jíb‹n`›‰6ÚÏÎ ù¤ÒD³ã·M‹3xÍ"³"®ãF+ß\Nlá{™6kÛ“ÕM»˜]ô³Íæû7ñð€ÛïHEë Ï&·Gå¸'sœT’ÏSᨩ4,$Ñž•¤-vñ{lq=™»ôãá¶œ|>ªx˜ž>d£ô\WG}5ÊNû$Ÿ”QYoµÇn"6ÄðÝü> stream xÚíKoÛ¼†9F𭇋 Û (ò‚"ÛÃèú…àmQ^Ÿ 0ü÷?‰âM)ñ&™9¦I-ŦÞ</3 k¿N“òrºùþ>Ý>Ž“r9ï_Þ§›Ï‡‡¯Ïvy9=ß½¼¼§Û=ÉéŽãýE>¿O7÷$_Ú.’äï¦ËóQ|jºÿ9$.ÿ9J’§¯¦Ø¯w,Ï¡ã>)’Çû·îÉqí.è—&yÿ~Ò>îKßÉ òùå—‡äE½†LöÌöyqHÄ‹§’L|³{‘”"+$Ç7Ý™äa‘ä ïéÐÿì¯ ñÝ"I%R}µ@’éÖ¤HöíæI´œ=$J’Oì°DRÊxÒ‘j7LœîÃ>×ä“l¨’JäA‘”"%Ä®I)2DR[ÉñÒÜAäH’-’T*ɽÛl Œ¥´î½{ ¼~òÞcw܈³s!’[‘T ¹i’Ϫ·i™ä|f~´ÌÜïw2¯íã¾[¯ÉÃïç_/Sì×{û¸¿­×‚ä?—Kãv÷årx8/·†ËÿާS/òå僷[þ{úzZ÷¥i‘²u7Nrì'‰$‘$’D’HI"9#ÙOÞ°q’0|£ø¯]’B]s"½$‘qdÀµKRœn&¾Ú$Ù7œQ$4tÒÃ$µ­·nP­¨e’M‰ ‘šMã$DDc7Í‚ˆ$‘$’ÉÇ®­â%٘ȳŸä¦ÎóÍO²M‘D’HÉ¿ˆ$_†*^ï8û=yä¸Éd‘Ù—mHÂ\–ÏÚAçïAïßÁ`’ƒëo0Æ ÝCÃ+”&<òÒsd>!ýHL¸•¶"9нA¬W5ˆÔ_j?×ï°Ù6ûa«kR\ì ½A«Ö.]ƒ¨%Œ>#ã?2¿-öƆI®‰Dá%R¢äSܘõÛj"ÓI² Éq‹qÛ·Iq™:ŽŠ-‘Ö~[®Þ¶DÂf$A8Y¸Ýp¤ÈáËìçÓ†cm«FSM¤dß×0nwA£H>Þ˜è÷Cß¡z‡ÐÎÐúÄèGÚ”ä|œY§:zå›+ë³ é3}#Ÿ¾ ˆ¬îe_'‰rDcúÈæ•_$2Ø›$Í'‰$‘Œ%yn+ÞÏOòÖ¤Hòô’ÏœHI"I$‰$‘$’D²"I6˜Î>ë9Æ¢FÆØnó¸ œÄa’H¾Mì¥'Âjý¶_ôíAr`!Ý÷ý÷àUcï®ý’ëï,&9ˆã…”î|éÄ‘ï¬B’g´íãEXk8€Qï¬B’« OK$cwº#ÞY$Ÿ‘ä|Ù©D®¿³Bë6"щÑ"që~ÒvßKwþ]ŽwÄA®ôLtAœßµ ¢Y‘$’¥$ƒþ~舺êEû9OI&ŠüP8WéTìü‘r¾ôuý|}ýóú:º»Z§×­Ø!™!òíº‘HSq9É=Dº$ãS*ȺnÃ÷"MÅ3’MŠ,%ùöÁ;#<梜j@¢H«âb’«"M‰‘¥$ûjÄKäÌ«%Òª¸˜¤G¤l“SÑ1¶HZÇY" Iž¯ÃÀàŠ´¿”Hö)Ò®¸”ä¹›ˆdò¹ÇÉ·$)ã›bEZ—÷“CqIZVðD$c0,¾¾VjÝgë–ï\¤2 Iž%²ôš$^Dri؉tIB¢ÈásO¤‰ _$6œE’µDª.hq†x·Ä.¨æ59™ì·nëb/¾&C"±À±æ^ìÛ‘d¬hdW\:3_:ÝõDÎÌ÷I$‰d¶ÈùÌ|“8T!zªV—¤Gä=Ÿ.²[˜OVézCó È»ktÍ@ëéqƒMþ>wì®"Ò1Àz*ÆþÝHúÍP˜þî¾$óP? “'r“kÒ1õ³0 ’T­{ú°S9É„;ÿQæƒì'õÓ/ö ¶l’µDê.hqÄó1B¦¾Á÷º&ë™^“õ̇}Hš»¬p÷a—k’HÉZ$cÅ›‰gI¬+Ò ¾z$¡TdÐ|¨G—ÇÕ,óAÆ·ÈÿY9IXž¡ä™ÎW)ɵ¹^®ù0õQ’,4œÛ¥$E\n%‘Æ|pnGTè'+‹œåET3â”7œ™ùPØp¼#Ni䚥]Іcwû3óªæÃf$kš4Ÿ$’D² ÉÅ;ÉHÔÌ<”2£Œ¤ 6òæ>"g$çO6¥Šä›“œ 3À!-Ï?!ÑᜫL[Qæƒißq`²:Î’33WÁF0†ÉœE*›–I e>ˆ]Î$HT‡Ì7“@R¦—›&VR_ ¯£Ì“aÊ2'¬|Ne$GI:ƒ–|D¹É´e>,ˆd¬I6!ÉåéÆH‘²áIµnY…N 6 …"!Y¤·Ÿ¯î¡7V\ñƒ—TñöÉ8¦ø†ãqDr-.³j‰T‹UÛÔ|¨«–*r.Ûè|²ÛCdùS$¯[=EòZï)’=D~J’¨g¥!r>3æEP›¤%r- n”È¥,¾Hò\‘¼ºÈI”F\E ‹ÁVäöŒ%91ľÑa‘½ù:IíüäÖ´%åtOý¥Àõ\*Á;u÷­œ²väé1Æj] •®Iй´Ÿ›¥‘´ÍAR!<®¥Ç’ä‘,–¤gf® y˜%)¾3 PKdæéö’,m8¶ù`d7IÙòËù¾§úE‘nÄ…ÕÄ¢V¢ÛsìnæîCPdKwÂ$ºû@óI"I$Õ¤³EÍLéA£fæ5EF/È‘cãˆ\xŠI¢2TÆüt’3óê{ÈT¶ž’bd¯;!rn>L«\ ĈœOÚ v¤ˆ\0¸½ÈòÄ2rf®jc,‹¤k>XëH‘ŒÕ$ÉKDš™9Z«ƒàZ,X"ÉŠ"¡@d˜dAÃqÍÐO?`Và “,è‚\óôÓ˜Õ-ݸù€Åc·5ê®eÂË3"ÖI ¹ºhGžù±Í'ifN$·¼û0ïÖfc™¿3+®oQ)μH$ÚÙzÑ“uÒ、Œ'3PôZåý$âzµ?u“Ü¡Ü'rŒØfr]A)RÅ.w!°|Ä}¦cÔ’\ PyQÑÒ|"Å Ã<#ÍíØ%ãL­ã3w “@X5€Û‚~bH[XëšÔ"ÕŠñ"ÇÓ=1tÄé.é#iææd‰\Ì?™#²[1²EvuHÎ2c%‘‹Q®@Â#Î,-sÀ|(9')t@ytµ®ynùÀ2úÉ¥,Ü}Ã×'²âؽ”ÏkŒ$›TË;íLd¨”7ríe“­%ží¿#I‘“q»á€µt—ÞÏwk8^’ãRZVz…^¹ê/0ùʬ ûö“³qfú7q³ y MFj+7õ¾"HªQÄô.æU3$i>I$‰dÉV‚—–HžÛù9#¬Z ¨sI¶ôÖE¢ÖI$ÿf’]cÅGòÚ¦È)Éîl´Ð“òD’HI"I$‰$‘Üž$sžˆßôFl&I&Ÿ?E#›# îòêØà5)2µæ—ó2‹˜·BõÚ!ú–RÄÒÎ{·n„ÉêØcÖDß½Ÿ±? Ö1lC伟s»Q’àˆÄI2n/;h5œ¦®ISjuAœ©›º&iD$‰$‘¼ÉÇ}¨.ÉÆDžý$4užo~’mŠ$’D’HþE$sö=ÞÜŒdnÀþv"=$3öÑÿwlD23`ß|b|Gäzê¹$óöÑ}þ“Ãv$söÁŠè·7kݹû26Þúm5‘é$CûÖš´Û“Ì Ø×Û–HØŒdfÀ¾µ­M5‘>’YûÖ'FßѦ$çãE|À~e§Öú,(=`¿º_}dzÀ~õÅh>I$‰d=’çWù˜‘¼5)’<½ä3'’D’HI"ù9I6÷h†U4É[Ã…®IjÝD’HI"I$‰äæ$&L?š!¹ ä£’mŠ$’›‘ürg®Š $³XñeɃê%ù%´²r¦È¹"¯É$»\‘×l‘Ý"IO5Q"}ïè¢D¹@²=‘D’H~’"¨B,D‹r3O"m¢E‚õÌW,I”Ù9!M¤8нÖj‘!’ãRÎ*ò#I$ÏÉÓHN‘$’”q€CàN*I6.0GRóÌÓ­žM©c H²T‘"žÎŽ[‹ÉäGe¨YÉÌÓ-î³4‘’¤@Ã’Hf5I’g‹LmÝÙ]PU‘ký$4¨ÕpÖFœeªHžÌ+uA4 úëfA‡ßŸ€ä?—Kã$/—ÃÃéØ8ÉÓ©Ùú5ùõä¶îÀ³˜ë"¯™nÍà!íûš-2×÷> stream xÚçÿ¯¯¯•••ÖÖÖdddVVVßßß ñ endstream endobj 159 0 obj << /Length 1358 /Filter /FlateDecode >> stream xÚ•VKä4¾Ï¯hqÁ-ÑÆÏ$†Ó²Ì‚XÐ ÔpaA¸;ž™,Iܓǰ'~;åW’îÍÌ,j©c—ízUE7~t£È&ç 3I7ÇæŠDêßW4®vpa·¸ñÍþêË7°¤+¢èf»d±/7¿£×ú´ýcÿƘlð,T8yGG˜Q¶Ù-Žªa¬ívÇ9Gì«íN‰öÛB q°]¥ë펩œgˆåîýÕõ~RP2ö‚îÆ &P"°b“S.‚J¯îl§A0W¨7µ9V¶5a Š2AÐ`†N›²ÛRd¿’,ÐØ›pö0êúa„ØSÔ…w¥îãbL«[Û5º‹¹Ê|ªíîXWGÝ–v–Ÿ| d‡·’¤#µ¬:S ÖûtGƒ ;Ê1•ÁÏD樱A1™¡Þ:¨ñ0™ámȲc¼öº€p[:Î{QŸÅ+g~•8gyºáå¬2â˜dôYF–3£6*Þê-øäÑý™;]Ú.Ëh©®ý‘íù‘$²ç±W8Ïeb¾ßæ9ÒÝVRtg†~M.qFDz|)†Œ¥ ]·Nà#®(.XŠKÄÄøa4îKqK>{Um†-’ßB°ó„¶d¾WFñºŽk¬E†YÆÒ‹ë²Öø2‰Åì¶6ò=éª5u\wU{¬N:nŸ €RXÎŒ~OˆËr~áô¬ è&pŸ²8lKÁÏ‘‰1à€ FÏcPš^Ÿtgަsñ]÷½C+€žª•@˜P—™‹€Ø@)ãIÈ3´£[þ9?¨—ê걃¼Z<„êÖ„½…ˆK‰Þ›ÁâP #–Eα`± ý¶-¸“;1¹ÃQó)äŒÿ/#mÐSçàþfkšpè5½×ްñ:d^‡~ $÷ yÝEÜ¥ªò±žÿceþ‰xóÚ\ižK:^pœ‰,øMU¯f30©eÖùø F°(äy|S*òŒ.SÑmŸJÅ‚a!‹ÿŸŠ« jצ]Õ½ 4ƒ>©»›“+=æ)Á<¿€€‡ÞD#'ƒYÈ0'¿{«©>§æ¤X`µúAµÎ˜úØúªó)æ+V”Ð E8b1˜@1_ö©W]}ðÈ-b…rÉR%Šé{–ÁDhTµƶ4án:®—è[³jM¡&þ¬‡{ÇJ¢«~µÈ ‰©š|å¦qÎt€®åç­È‘¶ ÷†n¡Y|[Wí½îƒS"J^¨wNÉjü×°,2çaGéÍÝØ–qãùÁ’äg¥Ëy5˜†)L0YEÎAO˜¯Dj¯Z”¾æƒi`8E}"\ܲüÖqY&/±?¥YPg!=œ÷^ùLOË ½µ ›¿Öf:¹RS:s‹ííí+æùäsWÒx1§ ¨’ÒdMi“Å|HòYis1€yâqb%fVÅÓƒï§ÏÏZ¬ னlܼ]³ƒf8—Ó‹÷_›Ø HŽsªÎŠÞ]§ÛT¦‡ñú·ï$Mø¦Y–ÓÍ.L6ö…ªÛsêGÃ{.¨¡:öŽÙÑaÝN},Jø”a² Zâä ï«r½yg¸˜;̧4ï5Y SF_nS9 ±Ó ¡ãF¯ª£’iû4ŽÙ0™8!ý?Ã̶£ endstream endobj 164 0 obj << /Length 234 /Filter /FlateDecode >> stream xÚ…OMO! ½ó+z„,-0ÞüÚD/jÂÍõ0qWCœuÜqÇß/Ȩs01$¥í{mßCÐù! ­!EáqÏôÜ}a8g2ä‚qÙjSÔ*耟–+âîùy÷&â5 Wè H9*²Ñd*¤ äJÇ©„4Æp:ÒZÇ£ð–OÇaL]/$…Ö4œ|™g—ñG #úÛÁ _•kò-krhÈ+mC!®®ö.v÷kµ¬úÇ+j«‚µÐZÕ ©Ò×éy»Y»r³ú›Ú¸äy—^w}­·»ò[~:¦ôQÀá]}{úïXª endstream endobj 167 0 obj << /Type /XObject /Subtype /Image /Width 466 /Height 490 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 19 168 0 R] /Length 4823 /Filter /FlateDecode >> stream xÚíÝ {¢<†áTÛ"Ò*ÿÿ¿®g9$!A’ÌLÞéõ¶¶]ÍÝ©U #l¾]óõ÷!5K"_WÑ/ûÛßõó¿ðFçmIäï"zù}.Ÿÿ…¡4n‘¿{£ÎÏÇRu_|oôo"Þ¾ßb1d€Å>¿€G-£FpŸ§äSÖ¶KŒ/ÄÞ¾l"³F±¯ËãAŠMäÏÐ(µ¦t߃>D}5~áç×Ëg ®Áü¯×Þ_ßú¥Ä6úÝDu{ÿêFÕhíÃ@Ÿ·¡¨ÒÅFg·wu£÷ÕZ±f·O±~Þè‚OE$DÔ¨ú Ñáb=¶Ÿ·é—zRÞ7Ü>AßzÂëÏ£ F_QM¾«8üGiºFkõ^Cõr¼oð‡¨ù×;§¢„‰nÔèô Äü O—j²îã܆ŸñîíáðFÿ}¥¯¯¹Ôð¯o$6:Ù• jtÊ5otºÑ‡4nIy$:ýÎ}¥áßbüèÁ_9ú^‘Óèx‡2°Ñy€öF ›ÆÉ¾êòFwôŽY¢FêÉ;‡x{":lt|{Âmv-N7°FÑÂüÓ/2äãF¾'ûN²mvC÷ugw¤¦}]eߥ†9{„9ùCØ~Ñ×øÎyúý4ú„=ß‘Fx<ú¾“4쑌w`ÔdC9¸sôì2ÛQ=(VÃ.刦{<ÊáQ¿ÐtÇŒè/³ˆÃº M¶ÐB@é7ŠÙ¶ÑÙ.,žåÝèIJoÔðþY£–S<¿qÒd–·?ëYÔ6‘W£—]e/_Ã8¶÷c"ÏWè×F¯°êþQ8ÛUÂùº7Xuÿ¶?a>S®o¢×X±"üE¿ž¢·=%¬ˆ€F‡ûºÑèàñ(DÑ(bÐ(¢Q4ŠF1hƒF1hƒFÑ(bÐ(bÐ(Å Q Å Q E£4ŠA£4ŠA£hƒF1hƒF1hbÐ(bÐ(¢Q4ŠF1hƒF1h¢hbÐ(bÐ(¢Q Å Q Å Q4ŠA£4ŠA£4ŠF1hƒF1hƒFÑ(bJh¿!=lè7ºáu,!,Å Q Ò,‹¯Q Ò,k±QfYª˜‚4ÇJEm¤*n£ M¿N‘iòeŠÝhÒãsrj4éÑ<<@Y5™ôè1ôAy5‡ô:¤A™5º=éî¸nÈ‚rktcÑÝZPZ¬ÑDS4º%én÷¡(ÕX ”¦Ñí®ñÎz~ϲiO ”E£˜\ÏxG;‡Aoý]¸{Œ)JÛØ ½•B5‹sô¶¤»Ýô8Ï|¤jq±hÞnHúö<¯h&Sµ¼VD÷u·"ÝÀóÍÚO‡(›}ÝMH·ó¼MŸ›Tù¬ÙÇ£Ÿ“nì™ßTy-ÝÇ£’î"€æ5U~ëDø˜Ñ'¤‘ÿâ zŽ>‰I•DZh4ð©î.zN2IMÕòú0i4h¯îǯi²nzÕâò°i4à‘Ww‚ùž\™ª¥ÕaÔ¨÷Ñ‘+èêçVlm7†q™FUZ hÔóf8èð™OÃCžÆ9‰I•{m˜5êõ,C¨áÜ„Ýntd¢ñ£iDQ¥µF=ž ôuœ6ðl‚fnMTi-¦ÑÛq/õ!èe±—D›3#$j9£ˆk£Ú}Ž”èm±]¢ÍÚ9Ÿë::©õÖ³mÔyÝ}Am¤ÍGsOºbUÈ7jÿ6]}­õÖš·©ã“ª$¢éUë@K½¹fR%´QóeK ãÑ­1m¤×÷n¹$B5]¸:=°½¦ƒt#U%ö~Ôt©t~,½áù íM¤Ÿ³ªd{Fyöu•?¨Á³ob-ÒU•à}Ýùå.Фž¤+U•ÖÂ~€4µ§i8«ÒZ|£ïÿ鬢<{G¨*­ hôùx;´I0›“úœÄ)¢Ñûÿ‡€6ifcRº*¬ë*íÚ$ÒÐ…ߨömRÎŒt}¤Jë¢Õ$A7$UZ—Õ¨'h“|6º+UZÖ¨h“c6¹+UZÖh×Õ‹ M¦™’þ„“*­Kkô"Zþüüow•Ö¥5z“Òð‘þÜ&PTi]\£wÑÚ ÚdžéÔBª´.®ÑhMôþægÔDz§ŒFŸ¢5ÅMîƒôtòm¼o½ìF_ CRR Ms:=I›R¥sŠfkt Z½‘z€6çK«Šntú$íɉ^M=@OÑD)‚^H=@Ǥe6:½‘Ò½’6a¤e6:­©*Z;¥7:­™ƒI‹lÔ-Ú4¬IKlT`¢tD³4*1Ñ7iÊ}‘Ø(D…5*ôIZ\£S´iØ“רÜDiˆ&oTr¢wÒÒ z#-¯Q»hÓH -®QщMݨôD/¤…5*´iJk¢Ò=„ƒ:~Fd£×&¢M#ŸTb£Ýé46…(óF¢'Ñ A?Ý$¤Ñ—©LP©äF¦½TѺ.¯Ñ©TP ©ôFO'¹ fRŽA…‹Ö%4jmšBHKi´iJ!-¥QÁ¢]‘6M1¤òíº’@ç¤ò-+ÑL¢i‹6MA¤%4Ú4ÒI»®¬Få‹Ö]Q6MQ¤âí¦¢MSi'·ÑAG¤ò-TôE*½Ñ¦)-Rá6Mq¤Òíò‹VUÖí®´FÇ¢y@s‘v2Í Z=&©¸FóŠVU>ÒÇ“ßâöus‚V£É©¸}]2 ¹H7šÙ3ƒém»+·Q H;¹ÇŒH€f •{̈„grÓËvWj£d@““v2¥ã™Úô|–Ù()Ф¤çs'±QZžiMÏ]'¯Qz )ISˆ&=0¥hU$µEÊö\Àt UàdŽ”ïùºTA’Êj´k‰z&3=˜#e|N}K4 éá_4ñ9õmK4é!…hêF[²ž L"m ƒF&=ÜD;YÆ%­6˜¸ çstÑÔ?›ÖF$­*ʤ‡D¢©_+¥íûH¤Õf T^£ÑëOêG!­*Ò¤‡·h'ªÑû+E ­*Ò¤/Ps¤Œ}¼n\KÚ3‚iBÑ´¾^O·%º1éAj£ï_±åáÀ*Òlz5‘²mô ºáÁ£ª¢N:-š²Ñèf¤UÔÙ4‘hÂFû‰hKtÒÃAl£#Ðm"­*ú¤3Q)ÏF' DZ%™ÍA#‹&k´ŸŠ~LZU H  R~HZ%œ-@“‰¦jÔúÑó0UÅÔj 娍It=i•|¶+šºÑÓT´eºŠôE4Q£Fе‘VR¨ˆF¢- ϦVÐùs¤r]AZULH™DÓ4j½‹¶<<ÃL µŠ’VÒC6ÑÌ>D[&žÞ¦#ÐÎ Úñn´·‹DZU|H3Š&iÔêiUñ!ƒ nÔ$zô#­HMhjѺ6º»§hËtt *¯QW¢»Ýn™´"8¾ ÉES6º Úrµ“.ƒ²oÔ¹ÑжŒ<­¦sÐÄ¢ ]Ht!ÒªâEê!Úq?fä/Úò5‘@‹Æoti£ë"­È4‡hüFжÌ@'¤FP±ú‰¶¼<Ǧ ¢ÑõØèšI«Š©TZ£‰E«Š) ÑØöÁ¢-7ϧ© TX£^ÝiUñ#=MÕè)@´­ŽTV£½§è¢L]'ÚŠ•Ñèhi¢šm£G_Ñ4Ñ.—häFÇãÑV8(çFï¤Ë åÓèÕÔC”5©Tb£—©Ë=‹lôX_Ç Êzß($Q!>Ç[´›¨ FǪ’E»œ¢‰}©ÎAwÿ¸’†%ºÛ‰kô6ï-O´Ë*š©ÑèsþI]½’ŠnÔ&ÚJMô"ª‹l´åŸ¨Mt§Ù6z åIžh\Ѹ(ÚåE£É÷‹ n´-%Q¹þ%꟨ÜFFºI¢å4ÊN´# J«Ñ‚D@7Ê.Òm-¨ÑV`¢…7Ú‘¨äFÿI JTr£¼" u$*¢ÑÚ,ªùŠ.¦ÍÕ¨Yôò)DCAå6ª ¢m‰ŠmT  •ÚèãSÙ¦%Óè~ÏYÔ´˜F÷·‘!z^‘¨¬F÷¯Ñ¼Hƒ@Šæ:°žpò‹Ôï'ôG Š£.Ñýll¢-{Д¢i5ÜÆ½UTsõÕÕ!¢{æ¢VÐã1¡hì׳F"Úr=Šk4l³ËSÔz¼ïèŠht›ÍnË8ÑcbÑ误+3ÒÀD¯¤ZV£rEý@ŠÆú›Ý_ê¤Á ÇÓèŠH™‰ÖK  ES5ú©hK´®ë%УÔhðf÷÷—z¤#ÐûAMP)Gúk$%*ú=eµž}$å˜Q0釢§ÜžBïGUøOÌuò ÑP{¤lUjádûEÓ@UÎ ¨N5*ø´Oâ:wà½ICX}<ÓÚ€i£jẙú©.q¦ Ôµ<U‹×=Ô¥úøñZ ö%`Ù¨ò¹îá¦oUÓKÒÚâ:×€c£Êﺯ!=[_¤¯¦¨k6ª¼¯{¸i½R49¨}ø5ª®{0é:ÑôžŽe`ר »î¦+DýN ŽyÌH±nT…^÷ Ò:T´ÏäéXf®¹î¦a¢ù8?þ>§Ò¨Z·}9z›†ˆæäœojËFg{uþóü‘¾õ õ”SežÕè4úénú²ª§hŸ9O÷rðit‹Ç]½Sµö%ÁéX6nö@Ú®ê!J†Ó¾$\ÝôÈHoV]%Åi]&n¨k®ê­©qÚHy4çØe?Vu¾5AN )‹FãŒÖ½×h²£‹b£Ag¨šÛ¨¥Õ¢Ø(æ“CÄën_(ÿ‰ølZ’çGšlÒ4 Ðt+”þùQLlÑÔÏbâ.QŠFšr4 Ф‹¿Q€¦]¥è4ñ2Ån ©×)r£M¾Pqhú•ŠÚ(@3,UÌFšc­"6 Ð,‹ñùQ@eY­ˆç0`2=ã©QL®Üc5ŠÉ&ŠFÑ(bÐ(bÐ(Å Q Å Q E£4ŠA£4ŠA£hƒF1hƒF1hbÐ(bÐ(¢Q4ŠF1hƒF1h¢Q4ŠA£4ŠA£4ŠF1hƒF15zù•Òèߵѿë Q^)¯÷£W[ˆJhô:7QÜJ¹}ˆâ~ûº<Å Q E£hbÐ(bÐ(¢Q Å Q Å Q4ŠA£4ŠA£4ŠF1ůHg?ãF¿1ügØè7ÞD¼½µÏŸëBL†q‹¼µ~Àß7Hi.ˆÜýs½}/\Ž·Ôo "Ñ?ç|/\ŽI= "Øç7ÿ†¦ñÌ endstream endobj 168 0 obj << /Length 71 /Filter /FlateDecode >> stream xÚ<Ãÿ™™™wwwUUUGGGîîî333ÖÖÖÌÌÌ ªªªˆˆˆfffVVVÿÿÿÝÝÝ»»»'le endstream endobj 171 0 obj << /Length 965 /Filter /FlateDecode >> stream xÚ¥VKoÜ6¾ûWèV ¨>õÈÍ)ê¢=Å"—ºAi‰v”jE…’ÜžúÛ;CRkíf  Krf4üæõÑ9oRÕvè¿®ö5#³{ð6Š]\]MÜòo®#Æ!D¸AÝ U׿åš;Û%™ž‘Œ–ÍÉtL—L¦í!téþGë½9Ú1‡ë3Gå=Óì*QAºÕæ÷W8Ü0_ƒ!4­X½™ƒWNóBׂü qHCÂ`|(k=eË#Ì–ËJe µà’r=..¤­ ¸µ&ÛzϸzZývô:`´ÇdäâÚ¦ }:w&®_ $)íC–ÐöSwDØÖ ƒ5äc^K1´èëS®*AÒ7È«¤Ýü<ç ²>Ö¨sÁ²³­±Ý†&FÍR¸i,Ö£‰ý=y·¬±g¬OØÆ¶OÚ.L‚Ðì3ÂJCU gûÅ\Ž€ÐŠ‚MVêŠÖ°BC%ƒr7›U±3»2 —Îö»+’Æ“–—$ƒò²3Wæp³zÀ¥³]û…^âMM¥n  RRè•hðÁ÷cQÅtl@ÅJlH<¿žqÔbÆqÝe¿M¾Ü‹Qè…Xg衲ää)ÊÜ3Ér¥i“GûÏ”.ëw…7Η‡§uœS`‘ƒö3âVèpü¦’,ãl#?àºñî±cU¥¾åT¾Æ‚ `¨úÿñC]*ämIÒ¥6ÞÙºhÜÇCÓ]mǘ’õE> stream xÚ…PËNÃ0¼û+öhìzר¡T‚’oÀ!jÜ*¢U jø~œG« !!¼ë™õ ‚.!j¨ )rû3ÓËëÃ¥’ WˆûÄ6»R¢VQG„tXK¤^ùCý)ÞÓ3`PH¹çÉ›&3!\ÚËpê„4ÆpºÒZÇ“–—®oë“+ã¹Ñ#Ÿ=¦ÛÑß¾˜õ~êìèÁš²Ð9¯´#pótö°íØK^µŒý™¸*œú ‡‚¾3.þ'Ô…n- õÊ£™îÚãÐ׋Uå×fûü-¨âKy¾¶¥¥À›¼¯sÓwêÀ•§aU endstream endobj 183 0 obj << /Length 3161 /Filter /FlateDecode >> stream xÚ½ZëoÜÆÿî¿B ˜èÖÜî—¦®8ˆm!•‹²ƒP€²¼«Êw¡4yF û¦hÛ²®œlð²³Ë©¦rÊ8Fš^Я|{±"VÃþ/z—óqS‘°Æ>Ê,é)`7R@†HUMn èîI›rWÐãjÚMž5MqÇ{ªé°4nTéNƒâÞHœÑvÅξnÊ ¥œ«Ä…Ͼ;€—7´Ž†ÃcWµD°w‘XwyÍ mq×g·Æ4ÆÆ;ꎮﲲ¥°y±ÍøGÙLÒüÎÀƒ‹¼h覂]¤²2ðô'ŠX·»p¾­½£"Ú ¹†0ì§àŒkP{œ è0Ée3ÐÓ5Žùo‹.3 ˜eSf‡¬·N!(ÇY‘B´¢\‘ p .XÌ€±MØ•ÈÛr¹™§%ŽÞWÛ:&1ì8JŽ&X=O°N}gˆ¢%VEÎñÒÐú½‚T»Œ8Ë)³42(™~*òîгª˜nWOÝv×›À49ª´¤ds¶NR¡•r\Î@ :kîºe;8¹;nËꟺÇ`”Ô»l¸·?ºœÂ±öUÙý—lYou e,h!åÅØ¡ B캋“šÛS­'d(±dævÖN¼q ”O E'×oÈP9=ç€ídƒpü~¶gŠõ„…šäʤ‡÷çäµû!îÁß+Žû C¦T«­²"’êðè©Ö2–Ìœ\þ *Ã#` Múª¨„¾A5ìG¨Ê‹4û*ÔR§8öš™,±ª°ü°¯ëJÒJÑ&Ö¼1J¨÷KûÕ€`¸Ð;$ܵA ;$üø­ãÜ4¤˜yz1œc‹fWŠçC²K¡´p|üì«=Z„C½]ßø*9ä'ãÄ¥ Or‹¬PirŠÖ¡§ËEYå[‡€3üd"Qáù¡hËöœ¤ Ü§Ò¾g y©ëûÞ1™t°®,ªª¹K1'{K°¸]Xœë©Ã¸çÞšOÜðáÍFaÚn Ò$™û³†&ŒŠÆ ¬ÛCSßbVÃ|õªÛÊýöaÔä«8)d‘xôñ²K¨Jɰ™v ÔzowØ©Üd-‡«¶JH&_®¿—Uë‹Xœ·ÅYå2i:AGR‚;³‚Ö6û¼T1ôÁjµè›UœëŒ‘çSŸBèl,Q:@š¡%‘—™ ¯&}weÒè/Öß¾>A[lïïtÆ„bôÆs«Ùl&ÛŽ0p©!ˆ¯ÿâÍÃR;˜O»²ò¦2…§§ËôÏc| xäõß?:wêÓ½‚£ýòŲ·ÇvÛÐT ž dÛòsæ…Ñà^tcA‡šP+²êÓm˜÷¾)wEÙð¯ÀGìFÑÒ YŽ‚7­ot3ƒñ*Æ|)ƒl°ãÌÃm*eýž3G£fa¢Eö°b¼n#uËJû('ŸÓÌùhL§{¤7„¡·£Èãͤ96©ÅÆJÐúÛÝC·ZèDîO}z¹ÛoËœÖàz¡8±r9<– ÀpoîÆ—co k]릲p+*ÓQ•¼eZ®ê]Aˆ®±p}j'¾‘ÚS8; ©ú{ŠOyq˜’x΢êñ—+¯‹¯¼Å2¶HóaS 9X6L£vøMÒïoO±$òê-é~Tü€®åÊ´Màóž:mOßÕÛ×/\ojêo;y7ò«Cê߃RÌàêÁç$"íD{!ï`æ üB.i”ÌÝÕßõAåPclþ­ᛆ1µ„&IÆ–Ð$1E®V-Ðø¤™ô¸*EJd^˜½jó ªC@ñé’㺠,Çr楔šZ7œ©ÚcóÖ[•õÍ~u¤É8ñ4Rx<úV /¶çœßâ»?› ßtÙŸ,¡=ðã ½›™(0òbÃYƒò”7: ÍYƒ÷>‘ mEúÒh–µ:]"ãù$žL‡¿Aqaò8ê;H@³"SÇ9Ç8A’Â;ŽVþSœ®gü cž¹ß9¡ýaÛ÷M9­&ì¯WçIcåÂñÀfÔÕUé&fvxÍj€Êظi÷c…iP£KE6(E]—’ìT6Æö3þ62ŠOÿdámU~"v}%Âóvò…ÎC•ÈÂÃþØ“„šLªzÑÝA‹· S"SË¢™‹:¯ÇvEL¦ùÑbàüwfE¤ã“ž”Ñdnˆý5$±~ôc´¡p•›¬iøãçé³§Œ` lš'>“ÚäÞP¢U‘‰ÓÉÚ„Ñì£ã^Z¶Ý®ÜðmÑ¿q—NÓwQâ;÷r`uüÒÙM[o»C~%`iÝœßEÿI’¤‘¬Ö¤¯¹àçˆ5Ý´ès|=ÿ6 ó¦nnëZ¬}“„MÙ‡é×-<üùH[ ×zûüé_W¯.ÿöò‡?ë?pzæMˆÙÆW‚OEÿúῺ`Øz endstream endobj 196 0 obj << /Length 2460 /Filter /FlateDecode >> stream xÚYkݶýî_±( Xðå’"õJû©®ën`ÇF±- ÄIʽâîÊÖãFg›"ùí™áº’–»ë|%rDçqæ Wœqø'Î ~–ɘʼn8;4ϸýôL¸§=ì¹|vþ7xœ¼g—×Ë%.˳o£—ú¸ûîòë3‘3‘Çg1Kò‚f>ðXÒ‹E|¶_LUãTw»½”2’_íöJ%ÑE»‹óh4½þÀ%ßáÐá×]Ây¤A2.b^D2Æõž½ºœNâø‰¡Äý#Éå‘„ÊXz–æŠ ©HÁWÃau[¢’JÀQD2ݹ—ÒÐï¡kN¦¡ß#èšG]?ê._¾?ÍdQgçýƒééarŸ÷ÕpØl3˜›©×­³ŠŠú…µ*xJH&R”Áïò$zmºMù¹2?ш׉ކŠ~3øOÚ]ýºS…´¶Æ‘ÎææL{‹ËY q¦rËÑ«Õ÷èÍAO'×Ý[Ñ âqö«¸@Úžq/áëíaÀUs¬Auãâ…FÍA‡ÑËèŒÜ ôîÃì[éºò‹èYÔ­`jRQ½¶ÚìDJá­rü6†vô;Ðö”ü„ÿ™Ñ úíÍÝË0ðãèb܇£¶g½Ú‰Ì¯.)°`]4½8½{]úüQÑ ­Úqž3Å$cç%ã[k4ôJ±‚”¦oª¶h°7M7ÎK‚­@-¡w2V©ËÙ;6ꆯœl¼‘c–+çÉý[J³$ Ÿ8É´]c~(ÍÝÕG‡ ( Òx±2ÊÛnÀ Ù+‰¨‘p—,ÃPÑák{¤Ì.ÊXO% ”X=ËÁ*‚¦n ÌØWny€XŒª`BÙàPŠ[G)Y@Žv7½nô2P3žKvÜj§ëëб“”N:Én ­&@DÌ–;\Ïæph¹ŒÅYìe!+²TNûî(-Ó‚e|>À‚;AÐg^‡ÀFqÉR™=ºÊNÆx&×Ö6PÂÄÆ„§Ñ±r¡M¯OºìHä?ÁÍcɸÈýîçcs<÷–;:EÊ™LgK>ÿlUˆÈÞ“¾ß©,ŽŒOlÉd¾ áß}¡‚d=t-wÕÓ«Kq_B`Ä\›jì¼pCóÝ0xà…Ñ"ÖÐãpkêÚ¡È•®îº`îÆ9ËשÞ|*Q• je¤P4ŸÚ® Èn j%ŽA‡/H<œ&\ÃÔT”¸P~œ0Í„õ>¾ƒ†f´°‹1Ûõ•_K]9u£sŒà\{â?öûjÀaõ8é:˜ö3f"p¼ ;»¡ÓzÖeT3‰Âœœz¢50öúå›/t ZÄÔÉ–[û ˆþà.¹Å¢ß>Yh@ ûQoyb PdØ)K“y ¬fçTÑ íR¼YÊn=˜uY°%=ëíósËq}°ORBæ[íçL)¹T?Àt½Ôúoó¶!?ï㫦ÜVÏC¨|Æœå'ô‚È6èË÷dÊ2h–Aðr&°Ah” \ÝÃî5þ ¦’d†?\MEú‘U;,µð@Ä2‹K4{3q¤wÉ&Á ·ÜFêéF÷K^ ¨fI¤ÅT•²$)ÖYyãˆ,ñ:Ä_(ä‰ï@½w¯ß &/( |4ðšÃýàbAg%ØÇl=å0ø!WØoœÉÞ,ËÃ>+Ò…!ðMãå‰#Â/•ÁZ,À w=]ŒÿùÍÅ¿÷%lVµ´nˆD‡6âé£ d8_²:pså/Àe’U$†ãq).ÌÁ}9|ï!—‰T‚î; í€nƒlåüA¿­Blí=•ñ…÷TZ ÷pÐ{Ÿ-C„©S×Jãï! ?+z ShŠd6üƒjL§r{ì.O|[—¹¶n©m =*¹Gä,)Ö@1÷­Å²@Ê‚ÏMkµX×P{z[õ¦k„†YJà"²8€½6}ÛŠ*.Iv¹îúÓ6æ^cé—£??ÁYØák~ -[þ83-€þÍI·¢q Êe‡›IóWRÎlïþ•ƒKQ@HgÅ:\Ì—ùxm×A-¸©ƒ†,QÉ*Iðãx“5ƒ¾ªê º[:VMƒ{@ÍqücS-‚)PO‹"¾Ë,-Å‹„eG–ÏÊêRŸý°¸‡‚I}0µ¡Öw ­‹èV÷eý„«èÞ@%ØñQü*`æDáÁ¾óèªjOŒ€#L–îw}‚#£io5=ÓœÃnM7±²n p 7ŒµežXÔ*מúÐ`É)RËâw4]-d絚ƒbµ,”4}*Ö‹ Ï7'« k‹5”(;;w¿“úË«µÑpÄÍC ß‚´£ðY6@lÚÜ*íÒ!x‚Œ[FªƒÞÑÜC½µW?êÖÔ~°ô(ý=9¼ ²ø¨¢‹˜>ùÀM¶¦ ¶í1P)¡Ä—{à¦-MÿV¬–$Ov¿ðîE ^—ÚŸ¸_ô+0àŒ$yÎd’¯C <Ѭsɲfuœ§‡ÖI»ÖÅAÒÚUØ0ºŸúfjœ¬3:MÔUpQzèºÏ¾·Žè°áÿÇ­‹¶¢c¥@il@¦À=íQO£«ûUx?‚IM,0ëÄå=gjþÌq„ËÝô'ÐøÀ…:èÂ(Q2zo‘‡’ù”ö>wZõùMl±PúÕ ýµñŠ©tåžF€@C6*à×UK|œ¨ÊôhoðAû/¥é5æš"\µ"£®owˆ‘–CÆx‘é½ðþ.|-„ˆ÷U³ Ÿ:I¯î›à06ñtN¸©ÚÛ ^&Ðe‹‹-¬¥ÿÚá¥n C&Z@ì `LÈHhQÔ~!êQ7‹}A“*TáºT¤¹K݉è~£ª"@¿{ª, ¿âå!Bª“zâÛÅœÉiÊ-ñ{ºj«1è+¾¼ú}Ž·ªˆ¾9Ù)I1<— GZ"Vôp‹Eó8I±~ÿ8U>aP´44QYH¨«Ÿu¨­ÛC¨¦”¸H†ñC[€Ê\Á+©È7l ¤÷;ëžÊ=6BÙúºz¡#þ±&lAÅ K™ÃøÑ«Ü (ÚE‰¿Ä@¸†Ñ4ÚÒ â˜UéöE~ª ÕØãBåƒ ‰,:7üßßß½}õËù£špc¹ÑÌÝÊT@øg›û\÷gŠ 1gé©ëdo½Ø–ù„ù ŸôSù endstream endobj 201 0 obj << /Type /XObject /Subtype /Image /Width 397 /Height 310 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 7 202 0 R] /Length 3866 /Filter /FlateDecode >> stream xÚí]MÛºƒÎ]S‹¢Û (ò.º}‚®[ƒÙÅ ë7‹Áüýg‰”DÙ’ã9±R+&qbGÇG¤HQ¢”z„òôé•㹆òý5~zútŠÊå|ª¡¼ÆoOŸ¾d9ž”ãë)~ß°8Õãð¿ýÓ°q¬½0*/‡“ec_¹¶=¿ÏU—ÿž˜ó×PäëU•C®f{ÇÆ©MÕL*Üßžú Y³c£pY0Çß 6.þõ^íÛ'š«Éãé3[§Œ†qi±A¿±¿ÂÆ^Ô@æ 8>àLµ“ßßMbƒaìúÙPƒ¯o¿(*ž93®øx6v½lеMó0M›±7°y2ï÷öU\í7•Ä™öÓðš/˜•kXö²Í3½\€ ªŒræçÃP¦j];ÅgòkÓÍö"ü}©æ³¡¼ÜŸCÍLÅíß+ïþOÁ ¦v=gøÉµ @†Èk|½Çl­¹C»Pm~ØcÊ6÷Î7uÓ4TæL~wˆ`(_z9D6öü½ ÆN°A­•)÷jþ;Ù’ßÏęʫå›ýÏ}åp¸ƒØ ïåØpj'Ø ;*sØ9Aܛߣ}¦r‡ åa¨Ã0ĆêeÃáØMµW‡øqP;ÿ*úUÝÖÄ™®ýÛ>…äßÝ%O ©”Ùo¨}К®òVÝì20\×Ü=Ó¾jŒ®Á2O'^‡1©ßX¨¨é§NëÅ)ƒí‚u³1ƒŒ5±1§´ÙpJ©rãàtkÝlt½¿“ôù¾Úá(Y³WñÚ²±ûsø}¼„"_¯«Èšý¯-ÿ\.ÕS].OŸÎ§ËGÕå§ó¹q<Ö ãÇùëÙhªË‡®¸|þÁšêX9 î7666666666666¦°™…¢/™cæ)> W.*ÿˆ àl`·¾î‡šÃx†øAçq(ú‚=a#QECÑwŸ% ½$Jµ*‡¦­)Qw@Ólš#æ(ÒŸøÜž$>Š®`ÿšCªaù"…Ù0­°U£æ[Ê|Ç´ غãò#yE‚Ѿ@I6”¹?¦¾ E¼¹]Ù@ EÓ'$PØj9d-º¢­=]ÀŸŒK°¡:í# C3@£ËÚ0 }F„ù#yÅò0Ò²ÁÍÀàºÉ<¶Þ"L¦YÝ‚Á0PÀÀ¶¦ í †‘acˆˆs-Ò"nû¬ˆkléˆe؈®iùVáJudCjÕ¸§šÊ¶.I¼9¤Xá–ecBI­ÎÂ]ŒÇdà $¶ÜŽ.vÌ¢+ÖCò¤èC«bcóþ66666666Ʊñ\sñl¼× óQyìÏÉF屿G`ã=hª·Š5•ºaÔÅÆ—d›ªŽ$Œ÷Ç`ã¹B6–Ès…ld`< ŸÙ/?×ÎÆ0o«gcÈþò¶z6&ÃÀžA)ëΆ<€ìF}˱½ƒk`ø0\&õå,Œ"l(;bóa ¸½0ôl E f´w®@´ŽeØ@)”cƒ~yzÃ’eªE¬¦¥MÀðñÛblˆDW ˘ȷ«òFwÀ×ÙWÙ~~†¢h± µc#HÒ@9?¹¹¾ ú,‚ᙌ½"â.œfƒNî×^öîÇO1 0è3t0ôÕT,þSa€æ)Wžì?%4?¡dvŒaP‹¥¶íšx¦þü•$ ½Á1"^Š‘0LÔ”vAæCë7Ú 7ŤFeê¯QÆFŒ= ;ô6ÒL§åa=º"Þ:6ÍÂE"&ô\ÿP›4 ®$P³*£®ïJö€,¨ŠÁ(!Φò½ZG¶ ÷•$ ]R6Fk*¶pibÏQ1 jxÜýa«üù °1é{ºÇJc$ÃÙâIáÄ{°Á“|À»=Î4LÀp_IÂÐbFjt ·óÅß30:lL0 oãy ëߨÆÆÆÆÆÆÆÆÆÆÆÆÆd6^†ÌlX?ÕÂØæŒllllllÔÅÆç%&eú۳Фϗ‰ýÆÈi€ÆË2ó _ºl,аÂ5_–iP 6ê…±±Q#8lVÈÙé2g)ˆßÌfS¿7Fîº —÷„1\6V cfÜÜ,qEŽ-]Ÿ'ÒA»°‚[\ 2KV`WßB|Ìfié² Iƒ†«Œ\aî·î\Vf)°Ë˜EÊ‚2²A “Ý$5OÄí:r¤U×Qʹ¼_3 ÎyPB6ìÜ‘v`n£Ò.O»,§,HÁp±Åùl 6hñ>”€¡9e„OY —÷6´NÐ?E6tÆ\ÙpJGm5˰aåmwlP£ Y øqEÄGʘ| nÖ Â,Ù0Y‹X?)íeâ,F×Â5…;ͦžø`Åî˜L3+¶pqÄÂûÍßøÛýÇù²ÄÈ…‡±ÔÌmÔpÃÝØØØ¨çÇè7^cD} sá6ÕËÖˆ€Qòê¾þL°QÆË20^<Œ·?Joað!aü,Ö’Cêùß¿5ÿÞRlÔãã—‡ÑbíˡÁU÷Ïä¿00Z­™À©0Zl ׆‚0x$ŠÉ%ÆNq  ãÛÛsŽ6 Äò0xl+•¿x2Œ&û%ÃhžÑ¬a£ÑyÀ¹²!²±Fù‹p¹•0Ƈþü+ˆÍ3Á ;z.£¿ØŽ †PÀ86 „ þf  úñ. 0ŸZŒÚ^…ñíÍþ—aCÂ0 ûª ǯR”ù‹Ñ6ª©0zÙX †—ä  ‘î0슔—{°ÑÕTe'ã]Âè°!EÜTÛÄ*`Ìñn¿"½±‹h qS²²áÓ {аP¸Ý^ÜXáúpÀ€FEÃ`Ù^œú;¸©Mãm*ršúú:`§,#¦Å²uXŒ˜ŸºpYÐPïa£Z-6\¦‰ž-€0²¦Šç5Ai6B¾ Ÿ#¦õ#0êGÛ0”ï70 +fd(¿< ½8ŽéŽc:v¦‘‰}ƒrKsü©0 ØT<¯©¹"è‘Ùȯ³¡Ø`&6ÈHP,njÂT¨#<ñ€f*f4 d¹ùeâÝ$ЂÁSuô(­1ŒÍ7Îb_†€ävŽX– æJ°amÿˆ ž¦Gî°3– £H£Ò:ÒTÆÙÈû–ƹ"®…¿D\Oñ÷¼÷+\Mû˜Ø©Av ÍËœCyCA»íP¦ÉFä6%zqœÑ/ÝЦêñþ\£ªF‹ Jî¥ dR¼+ê}lÔ #éo¸äFÐ7Ì=ÈñHk*«qA6œiŽÂPÏÀ¤yÓþFyIc1Î߀™›!]gÃvmæÅ9ÕÐïù5ÜñÈø< ,C\‚ ê7¨ýªÌc¸U’ñ7¬C›¹•qÅÂÅÄŸa#f uz„uåÙar¶!ð&‹¥`ØËá)ƆËý›bbŒào€¿\I6 N†üÃÌ¢_€ ^zàa$D§Šxð7Pó¥§mÛ{ £X­Dpч¶ÂáxdG idJÁØüÍߨü¿Ïßð“OfïW™Äâ¢l¸Ÿ mª4BI".Ž k* fï‘چ᯹4ÈëSý€$/®vóžÆí%„úT ³_•gCñ8ž2öSœÈ™û7)šF…£ãƒ,\³ÁC¬‘·1uD]£ÜÌ›ÌËxkùr®n7*îÖ£¶ÛÍøÁy)ã*.¦åÍtÐe`¸˜ÃRl`¤©P·`èÙ0 <Œ”¿õ.áweŸ#â®ßˆ–j—ñ„¿A3š|/N‘ íœ ó~v/Ž"X%nrÔp¤:Z£¿Q'ŒŽ¿Á_TU³±ùèÅÎoŸÒK÷'“ÔÙP atç&D0 ïíÜ™ hÁh{Ðzëdƒ& ØÄ!bÈÍØ?n•ˆ©0 ¥R>è}Ù°¶û/l²…Óöj\Œ%“ëå¾lDYœh pqg„†‰÷ìݬ¾/ x Üô\™l(ND…AÄ{aˆì[«fcŒê–lü0Îd$â"dân¸˜Šv³¸‰ø-Ù°0„ÂUŸ6+ÁhRà …«Üf{îJm*| W YM³~6pÐ*ÌÍߨü ö70aÎv=çuˆ‚>bSÉu³i×-Qp&,óˆ‡o8¹¬ÛT¯^¿MÛâpNˆnIzZÇü ˆ,B͹VyôÞÍîqŽ9/$_¡…+òÐÒ"Ž0’À)|­Õhmzš¾¢Ö%r/jÍ0”`Ãe[Õn©[$+e#À—À78 |]H*µøñÌ,)â.œãEüæþF¬p5§Ž•ûc²lPìz Â½‹M5{’Ó,\¥Uqw`çÇN6có7ZñDüñ kd£;þ‡5²az6›ÅO¤òÛVTĆoÄo[Q!¾áæ†û5±5Ɉqsr]KÁ¸S|ƒ§î<X®QÝÁßl`ض¢6Ú0ȧàm+6›j³p7666Öâo¨0ª[·P>n¦×…­s>ÊÑb8ÆMÙpxÔ¯áÐnÔ{´\„d­Ñ¦r£ÃMâ^±µ\2ƒZ+`ƒÇž9ºá—„8~f¿kŒ±±ûsS6”ʯ#Æ6 N“«³ñÏårS6´hT|Ç}Ø&ÀP¼1â06.—§OçÓ 5•„!§wØp‹†r0â ¬çsã–ý‹¸XwÎ Q†ˆÖr‘¼ˆÛm1|~ª¯ç÷â¬pí$*Þ"\ÊåZP.cxFO®èšlªžÌÝU™†ù<êÕ¨˜üÕ¨Ùû{ÿõÞßû¯‡`ã?9 ·üQÆKɽ cc$fãcQE·\|Égµ×åËvѪxk6ÉÆG½[zn»/® ÆÆÆÆÆrl¼?W\ÏUÃpl¼??ªîÂl|=W^ˆSõŰqåx:ÔP^ã·– Y.ç:`ĵnØ8Æå|¬¡¼~ß?}ºÄå|©¡¼~ß?©‡(OÿZn¥! endstream endobj 202 0 obj << /Length 35 /Filter /FlateDecode >> stream xÚçÿ¯¯¯•••ÖÖÖdddVVVßßß ñ endstream endobj 205 0 obj << /Length 1659 /Filter /FlateDecode >> stream xÚµXKÜ6 ¾çW z©¨UëåGrj‚´H&9l‹ÙUlí®S?&ö8 R ¿½¤(?fÖ›M {°†¤(’"?R+v1ü‰]ïR%¹4bW4â@ý󫢕Äã‹ßÿKó<ÎÅîâj­â¢Ü½bOìaÿúâçȸÈäNr“åĹŒ¥"—B:Žu·”RL=ÜGZö¬ÝËŒ]o/cï‘Tü³7qÌ,HÊ\Æ9S^߃§³ÁFÊ{§\rÓú•[rót¯!¶2ÙaÎF{]AvÀÄ2·àP,O×Îl! ÝãË™ªKŸZ’!4Ïañ… 3mÜ•€V§Î™í¯‡;Ò!žss¾•"õUyQæÑy©>¡¤ÍsÄDøf¬±0ASæú¦::¢X’ðu€ëô €ŒbAÆù6ð¡²= ƒcƒÄ”»hAU8ûØ /À"ߌ«I¹^°úþý{³Ð¹´ýœŽH%ß)²uõÉ»@À–K†ùÚ¥´Dª+¸ñ@rD‚¨†ÙG‚QÃì†Gpß\ß2Qä —qò¿;šûDŽ×ÐÊ Æ®.CJTe7Q‰xåQØ+DNÝÇ€†±>VM@B ‰©²3$œS£C…öÃÒ²®ÚK£†"|'¬ôü2Ì!?¹®¡Ôs…:…$I¾ºJû±ÝªQ@6£çõ&DëëÏ׫’gYö_*VÄ’Çç×ì–Ðd’ôË3eGgzº‘÷äK*æhd$ \_ƒW•_@(l××Í_mÿ~¬D†À âî£+Æã‚õ4ÔÄ,ƒšÛ`áwF²TqˆÓˆyKÊ¥pË!«ÆkD($•æ¢\Ï”³“ “æÐÝ_ Ä ¾…_eØ»r XÒ¾£Áñ ´”Uïÿ»¾Bi™Qìð{fRà]{㊪œ~«> ?më>Ú™9Q}‡ÅÉËëÄùÂÖ‡¾‡ÂÎrk«C€}þìwªÂ÷ãR™W8öõ´®¨-¬:‡ ·Ûœ{5ŽLùRoërÛÈGèmj™C…¥Õš+Hå2éÄ7ÀTð$OÅÕ>2‰ÄŒþS`ˆTjØc;À øùн@šf/QjšbAæå<Ân˜…qʹ€‘ÈŸõ¼ëX‡‰a’9dÑ ”Q¢Ì­•æw`Î1œE,iXC L:ƒ^Û#!lhÿ;ȃÚ´'Ìè 8—d9:‡Ôi…ƒêë± 6¢®ò+²Þ.= á ºÃÅù  ­Ð¡o{‘ÕÚ°¸mtç’Ÿ/ úsаiBLïOJþào7GCÑ;n‚Vÿ™ë ´PýòèÊ]E„£/þßç«‹™O¯²¢9œ¹ endstream endobj 212 0 obj << /Length 1689 /Filter /FlateDecode >> stream xÚ•ÉŽÜTð>_ÑâdKcÇoñ'$H²HoÚž‰ƒÝîxF9ðíÔæ¶ÝqCÐHÓåªzõj¯²Õ.‚?µË£]jt¨cµÛ7W‘`ÿ¼RÀ,8¾»½zö@…y”«ÝíýRÄm±{íݸ£ÿööÇÊB•éã,gÊ›H&…Zé]° UÃX·~`ŒñÌ×~`mì½<ø:ó†²so"ùˆÚÿíÇQä9àÔ¹ŽrÏX”wõüö¤p¬õ¶E¯LžÒ“Q`“5 €I“0²92>{Ù¤»ïÛ«_gÓQÔØ®"æÖîŒNÂD¶åEõ0vNŒ •˜óŠ¿ Q®:”µdP ØAOL⊶C*xÓ.½ ¦g6'×­Ÿ¦ ›+ï¡z9°r¿BeÓXa58IÜKðɽôø&Š£­›ó@5 ú l]ú%©¸@–b©†ÇF€ºêÑ­ø;´•ŠÏ§ß•»éÄ|]Õ‹'s&:_»ò,E’ØsÃèj P ÜeLÙÁ2yÏû^ˆ«¨Qh=” duux/àÑuí]!РF|å’Ͷï|çÛT{å”ñd›3T¬ê  s¿w hu¨œ2·Úûü¨=¬m…3®~{~ •jÇ¡k»ô=¸ÆšÌû­aRQ‚ú G8¬,ˆP µµ\_65`(8_/‘äÒËäJrHþS.ÿÑvu±•ƒF…qOl$Zyû¶ëÊ^šÃ¡¬ã{i¤WÊY‡äuÖ!eNŒÜI¢Ñ·ïÁÕ®A§“ÿ‘_y×xñ óWLB÷mÓJºF*´Ö¬C9—æ^Y“cºoÁÉ ÃÔ¼ÒlvðÐRƒQÞ·Lh\Õv•cöÈÙJ}>,Úé&NG.¥#Y–ªàîÝ'ÊHûö®+Y™Q´^h{½™XÁ‰Å9¹c]í©gà ‚_ R%OÞv2Fb,æSn’Úaq@(?›@»ó§q@¶Ê})ÂîËjqR&x±ü,êz#o×üÕVÎÆaªÓSfû4‹ì^ Óy¨ô©_v*“s 3ÎsmÃ4–áù ‹Ùlu7DSK6Ø-8z~¼4Œ1kþÏh2 Rt>+àŠG¶$Jû~¬ÁÓI‰Žº-±R˜ÚŸpûw<ÏaØ;(œÔʺÁÓâ”À0ÎΆñÑݼV™ÈzåŒ.LŸÈ@¾/Ûk$!×ò²oPïdÕñåd/}8d3ó¥ !‡¬fI®¨ö4ûŽ•h¸¤€P”µÐá žb=»vbt|téÈ­` CVâö3LUrU8|Ï\wƒÆc¸ ËInõ$© 5:-'ÏË >^\Nbhù_´›˜u¾¡ÐGl—4ÔÉúqë–Ø„é¬î‹ª.·®¥&Å\~wÑÙ¢sÅCï]æIϨäÒÔÎñ¶s.fc!òU[ádøDÁ„ö!4³m²t>ï­Ê“U›óaèª=oA¹=•ñ–Oes¬iÓÈiiI¥—Ò |wÊìÌ~>%ิoŸ-Ñsm;¢¸&$kñ¹k7׈§ª© W”4We‡0SÌ«{@‚ô¼e¸£{Ø"³ËZÌ+¡ý‹“¬¶ÞÍYáÄañ"ýú‘÷á) g†aðm„ûeMP"ª!'!bV«$hv#åâìF®ÇEœ@÷$QP¢…Ü·ŒË¢ —¯Ìx¹©…¿(/ëKl¾Ü?ÎÆëiÓù•`ùy¬nB„ØÍ¤ab¦.–nt1¤ÂUÏK£áâZhçS€3w–õ1Êôà4NÏzpñpXО³ÄuÇ TqÏ.·ñ켓 7ùd?ù^t˜á›ö2IÖN×´ÑÒÉõÞ!N޵ؕGØÅ'ÓhWŸ hT·´ Íc Óܱ,ZšiÛ8Ëq³:iÁ«%„J½ß}håwþíÁ꺣Ýå:4Ð\÷ P˜¶ø 213ׯ‡…3Q²<_² Z7¯o¸Jß^‹s\¶šøsx¨ò¡"6çÖ(“„Q¢vi/ÙæÂ硉)˜¹¶>“¬Eñì %wþqìŸ endstream endobj 222 0 obj << /Length 3627 /Filter /FlateDecode >> stream xÚ¥ÛrݶñÝ_¡éK¨– xmŸÚFIÜG½¨}±“ DR2ÝsH™—4õC¿½{ R ÜNG3:Àb,{ÕUꪌ®r‡qª®ªË«H ÿx¥¤u„“ƒñû»W¿þš* ˨TWwîwõÕ»àæéú‡»?^©"TE|‡iQòÈû(Ö<Æ*¾:9Cí4Ÿûë“Ö:п¹>%I¼é®ã"˜šÁ¼tt êß×i0ã2ŽÊ@§¸Þ«›»…à4Ž¿p"ÄøÂ‘T”„e’\eE*0‰_7?·5Ò˜$Dþ>˜IZuÿß6ýéþ¹mþÉi0“¸]ýȸÀ©FѼ4èï¯Oi|l¦^e%âZ’ÇA3 meGa(ækœ `z—ö @3\°× _×OŠOuR:T) æ&Џ|é 8‘ºœHâ0)‘uŒDfD¤ oئÓPÁ½ r׌£áå‘m@H5_„"{¥‰{¥ºTö°Ù’¨2˜GS Of冿¡Úá4 ’€?Íæüin»çÈ£uߎ j»º§¶;1;ò<Ì"-ìáŒ%± ¯OE”žMG$¤:xšªÍ…–†>/÷8·÷eêÐpwAc  5µOĉeÄb:·ÿ@…Æ“/ûÈöî-Å.ã£í!~å»É4ÌãÜÞ É–g¡8 ‹¤´X¿ò]rjµ¬Ãw¢càrÓõ,æÐ™/üë u;:’iÆnøG|2gCŠ;xŽÇE˜êÌâ*–W4ó0MË/’-Pwµ…%.U‘ò# ^æe6Ú „Ð(àDãD'¥ÅxllÎ C}Gb€÷QçKÛõc[›”·ásF5I÷ºž—ì *þÏÈ™æ|רAÓÓõ¶í=&‡òpwç`4®SW4Þ5SÐ–ä ¢‘å©ÅX¯˜ ¯îæ‚'Žê" “<ߊ®µ0̰qCfБ{PÊ$Ë‚›u_+½Ý _íî|'€*ÜÜ“6v fKæó4É‚àÀ3#Õ7#¯!‹)¾1nØüÑ%åÁ|f¬ª¿lˆ»ôóhÉWäÊN“qB–‚âWgà>Õeð÷ëBû7T±/ð?gŸ0ö5‰9teÑ-‹`y̽EPÉú!„Õç¶û ͺSl-&ƒ:AïX}qïUR—òùêf{½Â_Ô ŸÌ&YgÉËB«Ž…µ‰( nçiѪ (ßéX‚.ÂÁö}¤’ŠÝ·Ü_´qƒ`ÖJ&?§ao|mПå¶vëTó0öª{»1Ê)H¡Â"+¶Q·Cãø(8 ì;ö÷ärâŒ,/þ’¡¥ÁÎ0ä£éš³a˜Xln '!ÊÀ`žÀmvÊ’!µûÔó›Õ¹%½ M{Ÿ4³Úõ“ãòuBGâ ;ô›2ð®’Ü*;Œ> ÂH-1Ê·ú(¤«™yæ6’(ÔKˆ²Èøà¶R/Âó[&Lè܉@²³ë˜ú¡3'{—q‘C¼ù,öÂxxe-º@VcGÁ²ÚÐñ'o7Ñbœ–bÁï6þDÈèÍИ…5O^öÝ ¼¶ ‰ì²­àuý¥ÁØ$Î!ü¥-î—P†1¥a˜³Ûâ†Ož`ÔJ7<%Ùú}æíÌaSéš$;6J—a’Äÿ¯Ý(â]>nü4´—¦,•À¦àìº{z) îbTgCÄ„$ Ãô¦¢8‘×ð‘9”§rd[1aw,ÿ„~)‰1à7@¢qS•ntÇXy•¥Z`‰¦ž›"²û™2ì>‘lÎÒeñÊE¼ò ãc8‹ XCˆ¦›?.Ñlºq\¢þ¤Ô”¡$eH÷y ‡ÐfD¦þOS,2øÑžÑˆp¢d¿#Ë=ü¯„Ù1Š=²{ó º”±¢H]ç–«kE¹ø¶oïb‘Š•¼Â&Õ!'ÅÒ£¡ l\%ØÝ÷„×î[3fo¸O°¢b-"q\ xC6Z´™±Þòðótl?{ ±ÏðœVÍw´GÅa¨¥ã’í4 ×åþĪTa Ä=#-ÿ‹šÅ:9h¾WµÝbD ”׋,Ìt¼+rU`S}ê`ºDø½,‡éëùLWœÇÇZ…þi±‰oI(aZ㯔¡.ãg‚ÅÏW˜—vo~™š¡³=ºƒ|›;cÚ—EÁß.Þe$Фà.ÿ—¥Ñ4gÛd ü"Z=ô¥ÙØLdYñ‰‘Ü.ï«2ëÔ0´{Ä„!y11$˜AÖžéMÆÜ‘>y¢Ê3¾l4#%q *u.J­õËzŒ…5Ñc@õ0[kv¿€OÔBOÒÑ+Î>Reæ`¡ôUœ¥ÍëU¶X'Í#ØûÅž?ƒ«Ãgp}ô žñÞ½½VÖ­â™Y‡õN‡EUôü=\e!’éœÀ÷&.X_8è~1Wƒ!³U’oUøwLì½!±¶wÉÖk^j R4•„Ù­;^ ÛîUí“‘ná±-¢¹ vªÝY–f!9–·ŠEîÆ5©ð'µ -¿ªè%Ö€\‘T@œ¶‘(ækñ«ÙâãißɃí$PãÕúñž>lÌ‚1Oƒ¥a«^îSÖëãt¶—kMk¶7áZ†½Šñ}Ø[X‚¹Ùk‡3ˆ%ÖÐó›öÜø,0(†¶. “f›§XçZ´æ\ Ç\€¯o_ŽdžÌ£‘rÆžßr“¬‡9>H b_¨%v¹©ÛÉ{¸œíkæÙ®jrz³çÞ¿î¹/rªmÉfU$0‹JLíRÑᡘ¢h,~ðM7>¡Ûlð_å=-de¬ö§åú™OÊòÅí“4Të“Í_ioS1þ½![^ú¹h6\Z*—ü±HYWˆp°¡ÊVÕŸ?Ð×$%æü»õŒ¨I j÷”tâ“(èí¢Ü¤ؽ™+pƒ­ézQ¼¤8Ù=ï}×Z‚ïÙžéë¬4PQ%RÁÍø€b±º~ü€ @IIÜÔËšáb—wn Ù|›­â¸ýÆ&RN˜zN¢+;¬z†3ëf‚sÓë ÛgH0ž `žÚsûÙ›ÓKbÏ©§Ë¶˜êžŽ­îýÏ;(n‹-ùî_,žÀBÊ8ÚÊ›ù&a-b"Ï–¨ëûpBÕ2[åñÞ åÙûЍAê—°l”FÇ„ÆXëG AA~”aÖÉAóe»Å޾Î+Ž¿Î+6a ²¦àÛz÷-xyQ±ˆFs]nEú{ÓŸÙ7/Å/:PY¼ç~ç“•9\r&:;ˆ_,ÖÉAópd¿ØÆ«Ä:ÌSý,~ÁÇ:J<éá:µ‘çFÿ÷!8²¼ò[Ü×âö`>“ÉÁå§a-Ù­êN[(®ÀKmüö«ªV!†ß­Ùr6ǹ¹»7”œßPðó4ƒšßK‡¨/ûŠ ÔÅ<Î|)ô |Ág|ÁE„/¸3¯uiF^V~›ÂD.ïÇn®¤‚•pÏG)íc{ô…¢|!RJqž¿èú4;Ž‚SÓ¸2:ŸqY=keÓ¿áϲmVËcaNÖ“—ˆIçU‹†¶—=äÌxkÝz SÛq¼OY«Ý }¡€ç°Ø°ðgž›§ˆ8HJ¿T§w àëö/Å¿Šô%ÖÐÈ*è<ÑsŒ±ÿæDlÁL6U endstream endobj 229 0 obj << /Type /XObject /Subtype /Image /Width 286 /Height 562 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 7 230 0 R] /Length 4021 /Filter /FlateDecode >> stream xÚíËn㸆Y1ëâ"èm4üÁAoqöA x ï†á×ñ*R")R7*é¢'Û‘Ä¿?o¥"ÉØ®Òáä¥ãiÓÔÏîéðê¥ËéuËÔÏîãðóÙMÇÓ󖩗ݱ¥ãñº­œ^v-ãnÒOIçs/éUÒyÚK!Wt>NûHMçô³KîûõÓ³›¡óºiÉúÉîhélYïûõ޶܇VÎÎżG°g¶26»'õîáù’¢ÃäÛ€ŽÉ/MGüzzØŒKÒBžÚߌ=ËŸºtŒóÚ–Ž©;:­%?I[^XŒ¦£Gèè Ÿ,cÉLÞ¬‡ÅmGÿ#tŒœCGËÑ`–·-'BÇܬ‡eBË–wI‡±£ÇÐYÑ’'öPP²Ö+çÓê Û¬¬Zy›èŒÑ15ð>è=;¡Ó½7t^±ÎÿWMý>F²R>Ÿ?Ž—.¹ï×IŸ—Hv‡×Ï.—ÝŒ³Ž—ÃéõrßG:œNÿNÇã•ï!=~¶r^Ÿ/{‘£JÖ~èÈz‡è¢CtˆÑ¥Óv9p7t@ü üßèH5å„è ãÈ€Ûy³˜|Õ¦Óš²’UnYœŽÐµŸ’Æ®÷A§–œaÈ»¡ƒ :µYÔ¢¢³:ǦVz Ñ©'ç¤óVé.ý¸éT—CtˆÑÙ„†;ÉîÀÀ~÷¡êŸv¼Äü‹ªNgœÎr„©ÜÑ¤È ÄÕRtp4‰ä ešª_Þ¿RÊLÑi³c‚ªø;þãbÌ.`>‹¿ëƒäa(Wùƒ6ÊÛ ¿Cèä蓸¢tÝ ¡#²cöÕŽ)äKŽ/Ìgñu{¨z”#Ór,WŽø^^I›FŠŽ¡ë›"ÜOr°#-‘+ëCs@w(vÙËSô'kiÖnAü›9ºž¤”íxrÓräÍ ËQzOŽ<Í#ãÉ.› œ:†ç,N‡éð”qÓ3é ÷î€n>K»Vr졎y—dö(rnò®d)98Z+3‡*%Æ”A•89\æÊ”•ÏŒ;9Òú5ðÉxrÄȦ'çE¤ØÍâY¦,/³”Ø—ã<þ ÉÉ0eý-R²Dð“´{³€u%KÉæË9Ï)YRÎ-f;ºh9„ÄQï€5eP5£”#N;Ï©wäÉM´ÞQrœ‚¦FìÜ#rô­Í«•}9åmºm–/gJ›5Bg¤á ÆŠrJépÎ6¤SÚýZ™Nm9DçËÓë Êw“nø\:£a½a9Ì6â]:*'ÕßñâDXo¾>&'ÕßÉ ëÜ,Œ28P4½Ú;7­¿“Ö›£Ž1³'µï2SNNIXo@í]8ªvÃO¤SÖ•#[Zã¹×nøitJÂzC]Å¿:ÜЙÚW. ëÊñ&—ÉéÛNfX¯È3$ÇuÐO1åA½“Ö›’#»Õò!)¤ù½¼Í‚eÛ¬:éä†õ®!§”ŽSfw@gùÆ\Û!:Dg:vŠÏ ~X™3Íìd9‹Ò™/gQ:º7èLjƒ¤OemÛÑrÀ› TŽšœÕŸRUêxoR[=:ª7Ø›EV±Þð—ªLGÏ’œlÊ Ó颦ô•Û,¨Y+Ï—ówÑ¡þÑù’tÌ#G7T8õHke:!9Pw×x«ØTs³¥¿JzXAúN•?%ä[›Žš¹ŽÆå¤N²UÇPxñú¶cäpã2ÕSÔ±ŽíÌ”ó÷ÒÙÞvDT„\vÁ<°2MyY:²X;]´¤5¯ S‹NtˆÑùÒtæwNWï+Cu:3:§‹·Yó:§‹·èó:§ßº¿3[ÑÙtœ5¯sºø(t^ç”Zt¢CtˆÑ!:Ña¬[u«ÉXµ¾²jÑ»6#½ÒíFÞú«Èk>)ž/ç›Ó€œj¶£MÙ‘e¦¼l½c º#§¬ S­LtˆÑ!:Dgã6krçt•}zçt‹ÞàÎúÊDg¡Îé*ã¬éÓuF¡“;§T+¢Ct¾:Ø :Žo±$5ÅWÌÞE3__nܛŻ8ÞÚMªýV+’Ú¹$ñ½w§3X»I‚ iÎ1¹ôò¶Ó_»I-’Êü»Sr’k7M‘s;÷ä05ç¿›å?*g©5T«¢ÙÕ\9¿Y©UÑfÊQC+µg~c¶Ë“3w5FoE=õ0ŸË°¸^i8¦ zjE½™r¦´Y©õ‹å¬»cm9³Wò¼Í_ɳY°V^VÎl:ÿ›¿ ì{„Ná~U½Fâýeé”/†í]kò¦ñ:å‹aÏ•sMÒ‘ýÖûK0¹åóן®Û]+u¶êSwWøsï:ÙQ:â‚÷Û¨œÛ¯ûŸˆœØÙ}9ï÷{PNŸNÛoÈéÎjÚëþ ʉžýâÃh»BÏ(¶zÌ‘sýÑêʉŸ=”Ã[=ctîvì4"‡·zrgä´zFèœEyrÚ‚Ô—“:;$‡ëákœŽ\X?KÎcó> “8;$§iFm§½b–œVMÀvâgä4MFÉjë¦ 9·æ=X²¢gåˆ#3ꨧ2ýÕ¼Gê´œ›½Âû­ÉªwÚ+†¯uså¼Gk夜Ƒ“Q+wN{%k⮥1:÷Yrî È¡Þ õ•‰Ñ!:{¥óã~¯»ç¶O§¦œ·]ѹ½…èT³š&H§º¢ó]è¨ÝhdêVz‡jtÐì }9P…Ž]“Û‘Ã×”3FÇ.^/o›¢#¿¨C‡¹sÜ•³–üöt˜f¢§Mk9PÏvôSqWgPÍv¸YÑÝ‘ÃYE:0”ƒUéônÖš¦œc;z= mÛÒv*СèäÓ™òh~:Çè f~‘XØ!U2tΰ3ä—m³pP ÂH{€ëµèºëÖ"pV%Ëɯù&Ð1s¼ºµºwa9È`=:ÔßY´¿³©ý•èLìï¬Egbg5:Óú;«Ñ§õwV£OëïT¢ëï¬Dgbg-:û;ëÑ™ÔßÕÛ¬òþΊŒòþΪtÊû;äß!ïщө: s®*gçQ•CBzt*Å—StS–¢óeé4ÕRˆÎ­ºN³+:ÕÍ^#:D‡è¢Ct–¡ÃñX‘Ó³U°ƒ阉`XƒÍh }-W»Õh¶§#nU·k­^ë–Ùµn7/Yhüýö‰DtR£Þtq‡ôò¶[ËÔ;Ð=£ªNzr°.¦Wl˜r%ÛåÙ-è\?¶©f;Ô¢¢óÍé<Öõ6õéÔ“s Òy«t—~\ƒtªË!:D‡èlF¢q‹vÀÑ­Äî&âà<;àÞR敦³†Ùí•r˜·l…/'BÆrÀHžRÆÐ_RtX2Œ’›Ïâïê w)b{˜ÞYÕV-v7ûhå˜àP96Ð;–$è$Â(å÷ÝŠÐ?T¿”»› vD9Ý)I'FÉÌ6|:¶pp¨ÝŽÐ MTŸ²`䀎ôÃtÉJ„Q"‹Ê‘{O3»Ùtd\9\Þ|9tº0JާÃtxRŽÛæÐ‰„QÚÏÐÉ€4kâˆÝl»7 \›Úðf„N<Œ4-¹â Z9®wrÌn6È]B `MFjåT¥ÞFÀb\Ëñ ºÉÍ2ñr :èlA‡‚6+3nq²ã ZôÌ0ÊÔž—éd=Žyt2Ã('ÇNÛyêïPoð{Ó9W]“v@ç^[y¿È7HtˆÑ!:_ŒNÅàW7:÷]¤Ù•,¢CtˆÑ!:KÐÉßit:‰<¯èT—CtJèüˆmÑ–“µ_çsÙÿoH'|Æ­LÎ[‘œ[1¦HέLN“¤º§q9¡¯›¸œÈÅtªÊ!:Dgi:Èœ-ÒrSÏL3倻žKõŠC!Ç>0_@N„Ž’@ž)‡Êáetüq½ú—XH(‹ŽyÚEGgÁyÉÍ2“Mr䨸—:,KŽû¡x¦å0}¼ ( Sr³5ó$Žk)²,’cŠK¶œÒ’UVÐ3Rï`©)Ã?þ¹\vCçxù8œ^wCçtú÷pÚ‘í´rü’ôîDåÜJ|AÑ‹ÇKÖ­LN‘k*zñx½Óɹ•ÉiJ釼_ÓèœÇ¡È뾯;Ñ!:D‡è¢3¤³³Ø/¶¤éü<í$):¯»I‚γ›Ž¯Ï[¦^v’Ž›.§Måô³û8ýt:nšzÙ=.~:]6M½ì>ؾÒ°x) endstream endobj 230 0 obj << /Length 35 /Filter /FlateDecode >> stream xÚçÿ¯¯¯•••ÖÖÖdddVVVßßß ñ endstream endobj 233 0 obj << /Length 1736 /Filter /FlateDecode >> stream xÚ•XYoÜ6~÷¯Xô%ZÀˈ—Žö¡H§hÑØEºo9ZRm%Òj­#uûÐßÞ©c#Ç ¬(r8ü4Ç7CóM|“†›X &4ßdõYèf?q7ÚÀn&ñÓþìù+ò¥aÊ7û¿æ*öùæmð³9nßïÛð„ñDlÓIJ+ïB!i‰ .6»ÙRÙU³ÝI)ùýv§”~=lEôEkÞ…2ÜâTößV‡a`@R¤"L¡¾³‹ýX ñÈ¡ÄãŸ%Šq©]WÔ€-ÖˆQP7„ÎnMGkyAÏ£)íšýZ‹ („ñ»sÈ›]W®ƒñÊ+ö;‡Á R^Ý6'Êû"«LÞÐÆn2® Ý`ªºpf³†çqɸvF>äe»Q§ÔJÆA¿å*—Q5U†›oñçaß…:|KߨÓðØÚÏDÍ}Y7$kÁjÙ[ÃÁ(kÚ¶èŽà·$hùÒŠ{¡¡¦÷#@#XCiüÂMëPow<¸/êcÕœ/¾Ñ…ÍÁ(Öz4¶Æã|f<˜<šÖÐÈM x8ÖA+D„šG׋5œeÏx³TMoÈʧÑ#‹yâe§0 cžµÏ~ÀQ”]g_ÈxGlkŽÖ$¨xÄ")üQß­¡Ñ,±—xÛ¾_Õ2ȼ¯ªIçãAwƒjÀŠEæ_(žlÀ Õuæ4±Xzéh*ƒ^ýÜš5@2f©JŸþ]oæÎXj‚<¿þi Sé(q@—h…I‰ðð§¸W´kQi&"î·¾¾Úÿzu‰U0~y±z–dš+¿ƒÑY6¾m8 -!ÁÙv¾è"p„ÑlnÈݤ çsx‹Rp… ßâ|dí.Ðî<^0À’°+›ƒe“80ô°ŠmŸ •éõíz\$rtTq¸Œ£8RíÙÐv6aœ»¹º:‡£èú’Lídˆoc4SÝ ÄPqç*m ¼bÆ Ú„ƒFúÃñŒþà5w"sóÓ̃Œ›}/¦i@ÿwAHPžÑ"Wú¤|?à]õ 6€&¦+æ·8×TNÿ‰paí.§-óÿ#ú²¹Æ8 endstream endobj 239 0 obj << /Length 244 /Filter /FlateDecode >> stream xÚ…?OÃ0ÅwŠí!îÝÙNl6þU* e£ VPDÛÐÐ0òÙ±I€ HÈ’}wïé˜A@¨ kv›½Àiú"hªŠd(fŽ‹Z,–©$ÔAý4¨·ð /ã«z¬o€¼&ÏÀÚù0*kd3Jš‰¡˜IíiØuª0ÆHs¦ k\{yjú¸Fƒ*6Ê!ʘœƒ4UÎ×õχóßDGÁ¾üê\™v[“®’½F²q±Ú{¸êÄý/zŽú‡l¥K¨¬.ÉŒ ËöyèãD¢yb¹w™(¶‡f7öÛ&¿Vž÷Ç¡}Ïb÷¦¿‰> Ó[Æ endstream endobj 244 0 obj << /Type /XObject /Subtype /Image /Width 551 /Height 125 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 6 245 0 R] /Length 1055 /Filter /FlateDecode >> stream xÚíËn£0† Ý›M׈ˆý”ˆ„ºŽ‚x€‘PÞÿÆW°Ó$j52þ¡Á!Aò—Ï>Ü!‘ŸZ/ê6¹¸ô~¹ÉOCÛ$½_¬òÓ¹r£n«Ô¢î¿,<ñ_h’cRõ~ñ.<©NOîˆ9ªFyR"ýÎÑjOn-ÂÆŸÆxÒžçp—U¨š¥õ¤I.ïxÕtsñmò$¹ý·šµÈŦ3©êÛ†'ƒ]&oev,&ÃÂ]½òOŽÍdé‰a’½â UIx’íz¢Ä LÏUðD1)³iJÑš:^Ç2dèxmGU³¤lÏÓ…–@ª4±ßoØÏ“Ò|ÕO,“ÌzBê’‰çÃ1Ñžh&!OlÛÉO$3ÔÚõÄB±ž¼‹5Ý&Ñ+yGž>˜ÒðñRñ{û'‰ï<·{ì€'ðäOlŠ'³'•M»ðdòdŠÉ“ƹ¾qIã2Ž[ÍÞYVžd÷êVs¸Ë·šwgYyò1 ¸¾ã^߆üÔ6C°Á›¶Lê(f&í¹•yž¸žè¼O\Oôþ <Ùôäóñjü•[ø ®ÚûT$ž¼Îäfr 3¹Ù“1Ìd 3¯Qyòâg;Ã$´j»•tqy&ðž¼ï Ç@¼`f-{– '1«‡Ç„É—˜^ˆÕ^ØJè=É„3ñVn«7“•'êå™ –‰|pûö“âžÙŠ2’¦&Ñ”¸˜­˜(&ÁVž3›ŒÕQ .¦B·Ñ$DA1‘šLx±Í„›)ROD·*+¡k#¿Z¦Ðh&LYˆ ­˜ÈóVzs¦³‰Ø•qT54͉d  0“PÛQ[ÐI,Þþ„ϧˤ '‡l1á;L¢Î;›L8ŸÓ4 æ@.Ž‹IÈÛÇJ1TA7"ÝDzðþ ?@ðÄäbÙ°¢Ð]-+¦\ÞÕëâÎÅ8ÞÁq1<'ðžü/OºÃ0 ­zŒáOÅâÉø“1Ȥ‹”‰ãI÷“઱‹ÞÄÚ<'ðžü¢'¢[z"Ý×Ê4›ÇÊ0yÀxO~Ìþíÿ,°ä<ái#yÏ–^Â5f ,€ÈÛPÒód— 'Oe²ôÄܯƼgu-ÝÜ[ž'ævµÕ¤þ¤ê‰h/ëYµ–nâó/§Çä[Ožl2aÉ{²ÑDz¤úØ O6r±^HÉ“Ç;ž'u w»ž¨ßp¸àü‰ë‰ú œgó<‘Lp>v'ï€Ióöðžüˆ'ÄÒ“/ Yy‚Ðû”6˜ÀxOà <'ðžÀxOà > stream xÚc``X¿~ýܹs¯]»–’’vÿþ}kî 2 endstream endobj 248 0 obj << /Length 3031 /Filter /FlateDecode >> stream xÚ­Zݓ۶÷_¡·R3'†ø A&}q2O;nÝ67}±Ó)âÝÑ•Ä3I9®'“¿½ûФ ;ÇÓ¹BÀ»öã·‹S«þÔªHVÎèX§jUí_$ÒûŸJZ ØL(¾¿yñÍÐTI\$…ZÝÜM—¸Ù®ÞF?”ëŸoþ¼Ry¬r½Òqš<ò.ц‡b­ôj3j†ã®]oŒ1‘ùv½±6þtXë<ê®|—˜d]Õoë4I¢(u¡“"29®÷âúf8Õú™!Å3[RÖÅÙ*Ëm¬Œe¯û¾ùœ‹ËæPï¤ ‚äQÝí›AF?¥ñ¥oi¼Zkýkm‰d°_oTTïêªiÒuÜó·ì>?™:<Ûnh:noÇ9¥g–¦0³©·%Œáõ)«”¥Ç V›hÛtõ@×€çØvMÛÇëSiô† †–·Ô =}-îy­"Þv‘ñEZ§#YeG²C‰r“ðõ}¹m;Y¥æáÉÖzy,·ÝéN§ÿÒnfûåš;8·6zy[6Ÿ8Ãóèñü± ­q%wÑ)Ù,‹vM?”~†|Ï„i²tUî›ÃC;•E·Ç¾’…f;Œû1y½ªÛ=NSÿòL…#¯v k ÷ím'MRøÂ¦úºç6\~É­ùwÜY³©øZ™5?ož wA 9;ˆx¤ÊbkÄNÿ†«‘0Öè¨F9ð7é|'Œ¯ '…“õ9>îÚß4MçMc³õ ¹qh÷µoÉ7 [<|¾™ªä!RDýÑÛiƒÓŒÉi»Í€Ò Û=2! ’Ö2O.š-O#ùð7ˇ­šG;¸.±fè-ù3ÔÕ®d‚ë¿Þ\ÿã*¤"Ä=‡9Ía[rsÛܳGÉ™5| ¨Ð†¥Cý¹ÃÀɨÔATÏ/ZÁøõeí¡þ4øõeýŒŒ6‡;>²Kz Þz¼7^ v×ü™ŠåS1§S1|*sMË™ÁOâ[Ä/Ìv‰£îm¥£jùÒ™ªö¾ÆÅÙÜ“ :ï½@È¡k*?úæÍ«×WܬÉ׳ǂSgÆÎ3nº‰ƒ œL¬M V°mFé·|šŒÝt'H¶;™,ü|—¤ ²eg1*OccRàN\oÖ;Ö©‚}½Ì˜E5“ÆYbýXW c‘kê¢ÀÉâ™øDHºÉ=àæ7Zp3û;» Pµûò@·¡‹^ýðšõž¿»#ù3lâQà—Öqˆ¤¿§ß‹°§Pä/Gå2±Ù2ó¥Üç—6 ¨šçýرKPÑP¢ÏHåŸëtå}¹„ :Sq’§«T±cŒ÷@ƒâ©6²Y.öXŽÍñ-ÜÁÏWb©§íß79¥Ïð•M`I=Û\cyªg6·\ŒäŒE¯R¸ÄÔ)üýˆ„Â%äí4¸¿GcÐE&¤O.ѱAÏE+²VwÞ(~lvuÐv´‰3/l8–à.ëŠ,¸H˜aç–€÷köuC‘ÙG~¾:IŸ…]&îk†?°û]¡'·àͪݱ!ãA:¿&c1h&0Vî§?¬I/A-µvç˜ÀªbHœºx[Va®Ç.—à¤ÊÇÛãßÃK•OÍ›;x@1Ý. ñÞ×C9] àÕm0Ñx_0ÊŠ%ØbàCIÊs; ?†×ß3ÁD ü9F±òæ ñé4,?=6ô[âb„ç\!S-,ÆY"øû}}èË{Œ·Ø½PVwµÜƒÁ3 YÅ)LgaÇ‚tRù줴Äû1ÃæQ @_ßIE±³žŽeˆ+p¦í3,tmBúËÝ^%ïvg‚¢h‹<à\ž g¢ãCÏ‘&ä9 Kd¿šùÁÅÞK<ÍFÿ£×3£‡ƒwň϶åP~C('à R§vÄ~à´#3«çŠ<ÍÕÓ\UÐaŸë…"õ§zùª¨3c¯0jÊ„%juõµ’K\NXýüü&}¥ŒMb曹ïJŠ%|çÇušjÔå¿%ë?ïmoQ<²l¬zXåDR" HŠýè;Îí]´Æ/îé`ŽgöAÌy¼%Gx¡((àšê*9GÀê¸+;J§µÔOò§–`‚ ¦i£c“êóðßǺ»mwMT5±ÈŒªÆËÖü¡Œ¨)BC \^ÄYšÏ 2lq2rê ù¬ÀFŸ×LWSB_•û#iôœôqÒkgzÀ=/ÜžÄßq:3ebÝßÍóGÊ8Ðâ‹<ÑN]aÞƒº)€lênôDh2˜Œ¤ì¨m[Ø0®Ëà c.¦š› ¸&A~D‡+C¥Èzð’Z^ΓHŽZC¶Å,ì±¢¥µ/SÄ ¸›‰“+Ão(¿ú‚Õ¶ÁãóO1Z ÕË¢·&Îý‹$γü«R\tˆ±ªž-ãúÐ¥`³#¶ëëa³kËíæ±BÈŸUü!¡-FƒzIUذ ‚¬G= oõØæÿkPgÿ×ðÄ£lÓ¨¯yn :j1ó$ º0Ó-q‚XüÛß•Ÿk)öÇîžÊèüÜNa˜õ]žïíy\¿ ?˜¨83öwøq­”§®F»¨G€³·_3D\ö!Tݬš­ß®Tã(ÛòEѾœŸ…”– .N‹, 6§µÓå{ ^Ä›1Œýʧ¦åûá(ÇÅK;» àdûƒ°.vù ãSo}O¯Éí/âo–rfŸý¤Ø·ÿk!² endstream endobj 257 0 obj << /Type /XObject /Subtype /Image /Width 112 /Height 537 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 6034 /Filter/FlateDecode /DecodeParms<> >> stream xœí[UÕ™ÇÏãÌÃLÕ<ÍÃLÞ¦¦j’ræ%SSZ•8ú’Xf¢˜ ^f%D( ^a0ˆ‚x„ƒ ŠA 8 ˆ­F¬€¢\š¦o4}ïÓwºiòÞzÜìuÙßZûÛ{­Ýçû×Ç©Ýëú_¿³ÖÚûôÙ½)œa‘ªÐÂ"U¡™EªB“B/þ?‡*TÐ@…FAÎíæ%Dt BCH•¢ããêÏt½·¿vkÍç/nß»æws¼úûO·xøÀñæ¾Á‘ ¨ .6\®Âé¯U)ÔÓ7_ØúGiÀ ;XÛ\ÁõɧÃ*ÔO¨’ EáÝxþÍ8ôñÖû‡`æÐ6îØWÿµ §&d|üù©U›?ÆŽÔ·tuô  ƒ×ƒµ-oô…ª°E|v¬ipxPÒ“êk·í­,ÿ»—¼,ÔÕÕIuÍ+6Õˆ±eÏ¡µÍ½ƒ£cç¡~{ÏÀ™Î¾æöRsGiÿ±¦M»?“Ö2–ŽØ;?~ad::×Ó?ÜÕ7ÔY‚['zljë…€’þTÿíÎýp¾z8ùÓù«æW@!¶†g_Û‰;÷®kmnïíéŠçÆÆ¡§³]ýÐAc[/¼‡O¶®çObEÓ8tâ ø>ÛÝ_šxÏÇÎ_87zÆ682)°&`$ÐcÃÙ(¹ô•þTÿòTk0#¿üp¼¡mÙÆÝb¼õþçÇ:`JÇѱñññ‹ð6v•† éú3Ýðz¤þì–÷,ݰKZ»þtÃûÔÖÝ#K0Y``Ð)ôØÝWî±ñlÏéÖ(ùØÊMþT‡…0ܱ÷Èg=óPØ—¬ÿC$žÛT³cïQ˜†0Õ»û†GFÇÏ—'iÿÐ9˜¤µuÍ]ÐÇ»{.߸K¬nv샦N6wž>Ó +z¿8:VÒð¹óÐûÉæ®M§[»¡äƒK×cª&dZ=¨î=HÑTÎN°^sÛ¼ÔXùFÍëvFâ©Wví?ÚoΩ3Ý]}Ã0ÿÁ(`…Ø_Nµt=Ý}¼÷é‰Ekþï×¾+¶€§7ì®oí†íåØévhº:‹n^ƒî r¡ ”œ³ä¥Øê…ŒªWj½W~ÔT¯¬ú«¦Ì('¯kÞcÞ¯¶Á4pµ ¶•Š[þÕ›ÒF}ÁRøìx3ønë, žëƒW8†H‡\(%ï_¼V_]ô™juˆo€ööC<ò›·Å˜þäk§Z:aª©o“Òü²þ,,“º–Îé‹_³l£´d@_'š:öm:x¢¶ìîþáî‘Þx…cHtÈ…2PrÆ¢5šêª÷Y=è=\1¶w8‰A”vô @Ì_µMŒŸ>üÒ±Óm€ ÞØb"þ Xòð¦í;ÒxãÜçg<ñ¢´dÜôк“MûaHµ-Íí}½åKØgàŽ!Ò!Ê@É{®ÖTWEVzWŒí6Pˆ2Ð3%ˆWl*oÚ} ®¥«¼¹4´·tôUúèìjéìƒ >òC™k¶xú‚ÕÒFqí}«`¦ƒïÏO¶6wôµõ ¶÷–QÂ+C ¤C.”’w=ö|ªÕÅ7C_¢«4QÚÐÚ 1ûÙ-bÜ¾à•™K7ÃÛr¼¡ý‹ºV ÛÚÕ­ÃJ„¹3h‰~æ²ÍWß:ïÎÇWKAÆwïX“¦ü—§Îª¦Ø±‰%ïxdUÕÛz;JC˜êp Qz²©bæ²7¤ñ½Ÿ-_µå#h¨¶±°Â>9P¸Î‡Ë`øñàñ–oß´ð‡ÿ5÷Î…kU`âŸ~òË`;†Y¯"ïìéPò¶ù+Ó®ÞÖ3ÐÞ3ØÑ;XÙO5Õ!'.TË@áÊâž§^—ÆMó_¸bÚ“Å×ßèpB‡´µ|‘?20< ³uÕæÿyÚ“ß¹næg,ºkÑzU#˜øûë-©¹>/4¶õÀöíŸí€ «ÎõmÝà”œ6÷9¯ªCó² ôЉˆ»¿*;ŸØxÝýÅüѼþgíòW÷ìùôtùÉ k·}2õÑ—¿uõô+®½õßo¾êÜPRÕ&þæšyuC‚i×¶MåÏ-å.°±À``šÀÅSg©þ²>nylÝÔ‡VOypå ³—ÿÇýËàŽ!Òcë"ãæ‡×Ü8§ø£ûžÖ”’¾Uÿã¡Se »÷‡˜öè:Ž$ñÞþZˆ2Ð{@uŽ$±ó“£e Û?< 1õ¡8’D€± ôÍ=!®¿w G’0^´†e+J©b±¨Zb™¨8!J&J,,Ðìw¢ŠŒÆãܧï@Á\.€V|š5[r挪8÷É@ Ä@‰Å@‰Å@‰Å@‰Å@‰Å@‰E´P(H;P¥crUF‘}Fnn0j )J ¢EBßT@5?’(S âÔ¨š7  ‘•=Ñ•fŽ/y©©uñ@ZRj)# *{R«š³ª†ÞeÉPd¢Ô'ÍII?1#‹%§@5g¶ì€Æ.yͰKžÕtšÊe“…9'@z–ZÍhéò“#攥2Š”éu¨˜ŽˆÆg" i‹hb Äb Äb Äb Äb Äb Äb Äb Ä²Zt!£±9÷£€:qY4êÖgpÌ·3’‰‹‹‹‹‹‹‹‹‹‹‹Ë  ™È» mP%/€V”Þ°è7)Ò[e"÷Å•´·Í¤4ë¥ò¨ê¾-é}gInŸ#”×@¥YÉoŸKU¾OS úZ©Êk ø ¨* j9=M ¼‡Ê¥?Ë‹góR¥æ,_ºœxªò he6õÊ7PÕ~êPùZÊö¢£ÜõM ”X ”X ”X ”XX EVœ(¥" °@³\;9’Š&%%%Pé¯&«V43”iVÄKžX”34ö+³X¹ýND”3”–²Ÿ¡Ò¯ÌT-äñtG¼‡Š_Õ"ïEÐT¯F šI§ª‚IÌ…R™¡ 48¦¹Õ°` 6ס´@«}ÕWR¤gyé1ŸåYüYžZüÛ&bñ’'%%%%%–=ЖZÆ@ÝÚõ_f@YH1Pb1Pb1Pb1Pb1Pb1Pb1Pby´’]urKò¨æ»R»\É  zš[£"ß<«~,eøï@ínÒWIUyªIŒ­’ªrT¨0PË%߳ª^ v¼4D Tµ0~2ŠY¼4h" ÒbU T3¤iQ„@­ßïœÕçRM²†ò4vvÅ_¥å(rcMIS?ßâÏû ÑÔ¿÷žÅ£LÔ‚¦æí÷¨)Í$@­iŠXµÛòÉ&G±í#PkY%— éÉhJQ¥@:!š™bºuÎb NÂYüì;'I:ƒ8 œ$ÊR‰‹‹‹+)PÕßöÛýÍJ Ð<Є¼G Y„UŒšµxÊ©(ЦˆdižHƒ¬b§ðƒwTÉQÙ0Pä,@&R /¡I ÑÅdÅ–d _ÇNÆH]Õ)¢p¹¬‡§r’Þ®JRBZÄ/ùä2š˜¾ÍûZò h)ÙY^ Õz/¡Š?ZȯëД¤Ù—éx1ИDSùõÑ3%‰{~ΚŠ9B,J,J,K 5îä­“\¿kôÇ PiVz’~yë“p%pÎâ›ÅœPux¡?Nˆ¦!; ®œ0Pb'Õ4áÍé9ª*Ðä7üç¨~œ ÔÌbì(Örl 4ޖѨø¤¤3d1$ç—M·M²ÜRŠ,6ìP)GW34œ®÷ ŽÆ^ á÷\ ‘5kE¤é(æb(K ¢¤Cï€j0eTʳ€¨Î‰TeCºéûÔ‡%™bRvç|R’#Ó0ÕÏÇ@5Xñ4¥):Ô¯*÷@U¦ñ²ŠïéÍ# F¾Éâ-Åö ¨t ÅGr'€šbÍ (Ƴ¿@ñX3Šwë;P Vk ªöíÎy¶Å0hhÆ:ñh’aøã„;a ÄNˆ¦@]9¡šªŒ€:tB43Åuë$œÅ@ œ„³øÙwN’u2qþ8I”¥%%%%PßžA éWcU“h4  YéIß©ÅÃ1œ-„$Z‰}0N¸ŠÝìÀti9ò*ub´ÔR™¡ú§ùÄ&F†gÊÙiä×xv¼äØi­'©iûF%cE T—2P€b6S|bÆ@}ÜC !©L‹S8’HÙ~åXSï¯C‰Å@‰Å=‰Å¿!%%–%ÐwòÖI.Šß5úㄨ4+=I¿¼õÇI8‹8 gñÍbN2Jñ× ôkYÜi> c  þ‚Á)Pë»Z(MÅØˆ†MÊP’»¯(M)=P«õî(ÍËÇI´âÖPÙ¥¥bZ•@Ó ù5Sb ˆ]Û Rëª!Å–$é%rŒÀš-а3£#Ãi€Jß°ØŠªZï~©‰¦3ªÚ=ôˆ5‰èÓc @cgAÆ@5ªc­@UST˜ ”b •´J€â ft2ÌPJ Tµ JF «Ê$*egšèh:›—P•"óQúÖJ‡Ä@ã¦^l aªšÒÂ%Д˜"†aTã§l’3Å ÃhØ­¡2JÈ=ŒÉ”„©É0l€Z­ww@25FÌÐ$L͇Q5@/™3µƤ>Ë'aj;Œ*J!b ©9!š™bºuÎb NÂYüì;'I:ƒ8 œ$ÊR‰‹‹‹‹håÏûUOs‰ýûëçŒ =X4kZ…¨Ê’ PM “¨ê‘5Òçç$÷ۻƒªAQ΀Ò>Zãß»˜˜éc†¤&DÓ+ Ff¼Xò Ôx0¼ä¨¥%/–|I˜¦ MÚ‘~d©UÇ*¥4a™$Ò·Ÿvï%J®T>zZH.Mô^â_Ž‹‹Ëh;yë$—@ÅïýqBTš•ž¤_Þúã$œÅ@ œ„³øf1'¤@ ï­&†½ó’5òg(3 x'æÅ²Š·h(c H'æe2q@רÆI8_á$ —.¿çšB–@UN*?Šqþ {¢=P•ý=öjóŽ€z>Cd¹jõ×zYu¢O—Ut4YÍÜ %vÂ@‰d ÔüèÃ@]‡Ú9ñzͨŠ)Ò‰/gy=ÐØÑÊdÙ/Ú[U€±NÔ-0Pš¨E¿9^ò|RÊ1PýÅƉîвš¹Jì„;™ì@Í·ÈØŠÕ 4‚†"«ê†éHõ¹†Nª¨þ“’x ©…p2Ù†‰DxY@8™Ô@1ŸÌËT+Päg0óbU ý‰Ö¢dUuç„ hfŠêÖI8‹8 gñ³ïœ$êd â0üq’(K%J,J,J,J, Y>_À´È³KÄF*¹äÏ ˆ4hÔ´u*—øò±Ï_ñhì§à;yvæG½<ÐH#·ÿb­´€âGñgZÓ¾_}uÌ”·YòFøa[AZL|Å´lÚ‹X,k aa\ÆVQ5b T쥒Ž÷_JTê?C5,,Ú‰¤¨fŸªei/ú*ªº–gy£õ’$Ñb1jìŶ¬÷Ö’ÇG–Œ4QåR\õÒ*ÒS z·±þÃ?zzj*|¿i;d Äòô£§©]gà9B,J,J,J,J,J,J,J,J,J,J¬x E–¹”@]Ë«$@~~»¿ð‡4DVQ KÖÿâé »àõ—/í|b‡.®}wÁš2ÙG~ó¶heJÍ'_þ=¼rècÑ‹;×C¿Þ>Õ6ˆ(Ð9Å7ñÜ[sWnå•n´ðpzQ 3—½qß3›g?»²\±•C€XÍZ¾¸EÞ½äµ îyêuLÌxzÓ½K¿‰(P’(…„ñgOŸé› endstream endobj 260 0 obj << /Length 1665 /Filter /FlateDecode >> stream xÚ¥XKsÛ6¾ûWðHÍ„^$€ôÔºq&fœ¶nu’XB¦¢èTÒöÐßÞ]¤HвÒéè@ø°Ø]ìãƒXBáÇC%8á9KÖÕ£\°ø– !¾»¹xz¯ŒC KnÞEÜl’ÛôÒ>¬ÞÞü0M˜æ '¹6aæ å"LÎx’¦Ên¿­W™"ÏV™”yúr·â:í\cßPAW8´þg•SšZ@réI…AyÏo…sΗ-út‘çÄó$“`†* Ÿ¾¬Lò}}ñ{YŒ™ G%1šyKÞ|ðî|ÆUL*R$9c¤`"~UÞï-'½í×aà5zÀ–;· ߇O™^~°•mÂØ·Í§}ùuK¼w³wÉ”&üΤ®ìnS·aɃ ;ÊtëFÂê»U–éG×õØ{WWòg'O]×”ëº}æ· ;1AXú×°NÂɬ‡%Õé‹Ëþà“Ð)“à=¿r[ÛMMœÆ9¾ö¨'Kr@ Ãzj Jþµ$KæD3ýõ²vîKö˜¼BÅÕA^&¹JÝ’XVcòÙ¸¶*"Šõa®S×TeçªàH¼ÎÛOû#|Ž&?7Hbv.ã“–œ¥û* ï~¥//÷åΆAÆõQ=Û¶P5#èŒi3Q^ɘÂB1"T<Â0óÛJ‹%o3•©‹DÀ±kuÊÛ=*Á–*ÔL˜ß¹u±Ëq.„IáD1x—4½ÅFo*V{ÑLò£P ª+¿àÎuFù¹°èPpb!NºO(C”gÜ×£Îi0öî3"ºo\kÞ>‰© í„á¶ãT>ò-Öi&‹£À0†0ˆ¡)T)}·=*Á–c&¬÷-Zuʵ\0’Ëñþ ž 3ÛÏD=âWtú•1>n±Øb\bÛønÅÒ]l„,§G¡Ž<ã¾uFÿ¹°C®?½RÐ($²àˆ„ò%‚»I¡‚äX§yúk‹m”Vy¯ê}ëÂkììðvYïV‚aßúæC×PêABhî ͇b0Ök7.ø À°I? #6*çÃ= Nê°êdX¤4CX½pQQ¯ö/kÈÛÅÎ "¥^Ð;F8T¢ŠY— eÝÜ•Eo3o>§nÆ‘SZë‚h®§n{Bu…|80`Ô•V}öyˆ×!®é  ÔÆV±Ø6 úŠ/ûø¼ Óî^^°€¦k»±Ó×¶.Tp&ÒÌ|t(7ÀˆQj†éêù3ÖCO¸aÀ_…àjwXƒYg¿Þ–Ÿö.€Úú®qW‡‘c­}1¨›Æµ¡×»ž²cÁTJŸ.Ç(©8»‰cõáx7ÉjRCûž»uë²ÞùJNEqxîj¬¤ýÆ82Ø>-Ô3_u§{`ݦr@íwo7uÜÅ'•A¦JÃE—¹a¯CA×¾ ãð©˜Òª‡‹ç«º‹PxÇ<Ú,¦Qœn™ƒé1‹xìÛc®6º½?4ån]>Øøy2cÑr(š¯@ÀâM¸ÃIžx5 Üx”†ë¿„DŠ×ÿçm‹a , ‰&ëñ*R£?Ûuã‚ûÞ†‰rá¿4^.Ò»¹jËuÜÑwv”A}g×&ÿo4¹qÝ~p˜9g'o—R)àÖ:Cxn™Uö ì€Z`e3Q°JÔ.ñr¦£ðñIßöÿ±ª)–hºL vÌÒ50Û"›§â$I ì€ZäèQމûý Hn¬: endstream endobj 271 0 obj << /Length 249 /Filter /FlateDecode >> stream xÚ…?OÃ0ÅwŠíÁîÝÙnlFþD* e£ VPDÓBHW>;¶ òà»{OïîG€ùD„ʲaO°ëÎÓWAs¥³A/—XÕ¹$4#Aó¼Œhöð(¯Ò›zjn‚¡ÀÀƇ8)[d;I†‰A/¤n<NJ[k¥½PÚ9/7GÅAŽí¶hQ•ÑîSyD™²“#c”Kž¸i~ö̽ Ê;KçmÚÙ|À­A‹qµé áú$~ÙKÖ?ð„ÎDç F³&;±ÔÝËyH3Œq3ÎÝ4¸/P©;¶‡©ß·åw²VÁÉvRßfîJŽéÃ|³}‡Ç^ endstream endobj 277 0 obj << /Length 3592 /Filter /FlateDecode >> stream xÚZKä¶¾ï¯ä¤¶’¢^ñÉœÀAb;É&9xm€Ó­ÕF-M¤ncùí©)Q-ÍŒƒ¦Å"E‹U_=(}§àOßÕê®ÌLjr}w<¿QBýç-OpXŒøêÝ›_ÿµJkUë»w–S¼;ÝýüÖ=ÝÿøîwºJueîLšW5÷¼W&ã®ÔhswXtµ—k7ܲ,K²ßܬ͓oú{S%—ftïU¦î‘tüï}®Tâ`¤©ª«q¾7_¿ çÆ¼°#ñ–´²imí]QÙTgÖïëäÃ"¹žñ·LNÃÄhë™ 4xh¤o¸òÏí¹áý 2ÇäxOV$Ont§öñ,äãpÆáËÞÐ!S LÀªhñA穱%üf©Îò·¥I5]$î©kî4¤ ð¬N¾Æµt‰k]Úãµsã[ •yçš6s€5N<5|³G Ÿš'Þô<°”õ‡ûC^$Ÿ?Ôu?ãÒz¯r…»€s±ËsÉJ“ZSÀ9Ò~.n¼ÏuòØ\dptˆ¦Lë¬òcaJÍ<¸ËÕu,#«Tª -BýEVë‚Y­ýp"y®ï5ÒÉåžNGñè"9ŠF¡ïíD[–™öÜqMʾµ“ ¸4õr'pb˜Êw¼ñ•{i"Ï(Í*ž;h䅛޸@Û7T$S0AÖ²öQ¬øYôjbƒîùÁ¢b‘ Ò£ûàGLÍãµsŸR†¶Àƒ.RUf<ñw|€ñvu´Ýp¾ wõJáÑT¦ X™ ìå÷èά§ÃÖI¥Ó¢ zô%žÓ»Ì¦¥õÃýO®í›ni5eò¡GçMÆMLÜUcÓ*¯#6äbè¦MíÏÓRU+A+ÿfš¯ý€ÖìB„ÕÊΤïÓYšÿºÆÝ‘ö ajºæØ=ÉÚjKrÀŽÞXá¿æzGî>É|þ$'nî ÃÔeª*½}&›âÈò´Py Äð÷¦,GDͱíí“lj ¼EVe±šï1gI¨²ÒŸ`Òã)f-A~kÁ.tm:ñ ÿøø“?ð{Éyb¡±·8è}ö Ë â•©átú“ô ›Áßž|ùÎòheÿº0”OR6>¬E`¤ÉIz¦Nk½Âˆ+ú9SaEXƒ(eâ‡œŽ ¡±SØù[ܺâý@Çj?{h쉠 ½ÌùÉÁYË‚$B bd:7£ï¹>uÃáˆhæw£"sé%fy`ü¸Ìñ ROíØ´ìð-*ÏÃujø}<õI×ñ:Nh‰ÃÃØD½‹“x"u@v­×h©ÅëÙM•­ÀRG`©ÈôK`iŠ‚'¯×¿Ýwi¸"FI½@I-(©×(¹Tªâ—ácã#£"miÊX]ÿÚ\=µ(jG¸M‚Ó8»U± qÛëüFÇôf’ðèØ2Ð&ÚS…!t@­_mí#'fç€hvJÑT¦Js]¼~&°0 ZÃ@ÌOícß¾WÚ…yé!¤Á± !«Ù­tTâA8Ôy‹ý&àB=±ŠLJfº´ A#N rÊZ M –íŠ?$xhD·XäÉßï+;nI€›%²Œ×x¸H[.Í¿·ŒX¢e‰S³DnE}Ú¤ë`£„õíÄ„³ŒxØ?‘€®Ü至pÙû5Ÿ7Û\Ë_a¶1øQ$8›|)§ñ¨g¶Î)é«ö“>éj›s,š¬öeÈóÔùÚ#/ÌHZæøÅ–Rƒ¹…¶ŸéY"@³Ê߸k.‹¼û—ï úäyZçÁzþBÀsq—f' ÒmV¬„ kc™U&°GÖ9²¦ã©Àõ¬Fï-ôн«)2ðC¸)ó5>@–€A‡Eß׳óe NòâÓÄ;©i+¯Ü$+G‡Q$ØE,Žsë„‚JŒ¨-×iðWBÐPè@šCK\ä¶c+ZÚ"iƒÕédôÞlš¤Wb½å*qàj}Ù‡ºø¥ :"ÚƒQ ±6V³ïqY)¡ \\÷±™Þr\ÉbøäÖ%4U¯ÊÜٷ©sQFó£‹a[¥´ÕdÄÖÔ¬µÙ‡Ì ©æÇˆùwé#j‰œ¿aj36 Äß2ñiQ\h{Ù³µëí£EÛÛ¨úQ/lo=™ .H¥è«8@§ô8Ã`– ð!ÆAªÁ©Ø¨a°h¨{­ÁùU¿PÝy"¶HàPù*âM³ååT™Ú"ó÷ÕWÃg4zóLÀPi]‡ª…¯b;ÓqUyqa%ª5ej!ÏRá´ôª’±•qãbΩ©É¼‚ˆ[ç§j€Å3^†à„déV}SôÅœü‘}¯„±Ü¬öx0c­Õ{^ g Äù3ã닜 ‡ñOÄ«6«٨‘y-‰à™iet8 ˆ+¦ÃæÎ"±g%—ñ+b{ö—eì/àò’o›þ#ßÈp’ΑòmÞЄ¼ú0ŽM´Uìƒü‚A ,çéãMq S­XÜP[F™¶Ú/‘©´œKªÿÆî´S÷Îg¸‘`¦ý@A]É…Ü?êÙßð&™¤{eâ­3ÊæJtÃg~à4²¬$—’IÓ–éúVBU€lÅfæ½ò©­âz0Ìþ|>éX]Ô/§c‡¬®ÓU4þÜýذ6sË Þë‡ Õäã Æ~e äl[¤…¿Iâg ÿ‹|óRºOþà£/…ÁãzòPÂÃ×Iï ¾å‚Ÿv€Ë P› 3ä“´ø•|ùʪ(¾*ö9‘–@.gà0E$Qµ¤ËWëÔHÙvúú"Íå'ˆl GI‡ ¹ TgÔeÏÀà‡è\ŒÆŒ›H®ÆÖmX!çDE5'“ÒæÐ½Ú‚CŒÝCqmy\ÛÇfãžÝ2\‘x°Ù¶oÆKëvJ ¶¬×pÂ%á2ª9!aî‘ßÝ*9 :¶é‚ƒœ¢Ú r žÈtZÔfu‰Õ#>g‘'§„”ÐgƒÎ‰ëî~lp¦Xù›“()OÐÏÕpÆ•1‹ÀÝàªÏÑŽüŽ¼Ê¯Ì"ö¬ËUH›AîTš©l#ÏqùK‹Q¢ª bkàŸPž†ç“м ëPkSµ¹ð‘ <¸nùÝ|×<ôï%ttð“òï†3k’NÎ;óff±ÖÏ(‰5þðát¡PÒF‘´çÝ8ʪâxnü™6ËÛ‰Õ *½:ß½à­÷ïu©Õ¹™¢˜±¡¤§!ÐóÜÝ\ ¬¢?{\ì :»–ñ•½>cþlHXÀ1ó ô–ëVò^tÌÏÏ1O‘ã[^F¶Œ”Ï3²%€ØŠM]¬°)Ôs4t½‰”×þÈÚ†’yã}ùòÅ:O„§ê@øÏóÝk“—åè‹l“rKÚöË/+¤´°¨ìᘓ¿¹ÇQTV¾¨¹A 5k^îb'©Vðt¡hѵ[hÄ6ÏD5?¹Õ}1oN^nÙÁ¼ ý1_–yZe«B`ôYCÉpˆ¿ ä8ñ4%EæØ±k¢MÔ¼|—^½ÊDç4ÇF‹ù;§•“GN»ñ±öoñ–¤à?EÁ!³HÀê¾ðI~±‚ðVŠÕÖkI!º’¾Ïߥ¬µg‰˜þÞƒêôé–wEËÀJJþš›Ó¼LƒÜ¿ÅMdjùIª1ÛWeN†îyøªË^yy ¹bV®Ü¼ÉUP¤†×’%7N˜\à¤|)Á;á´¿Á‹òhà–Äx!A`yuëlk»þÔ.¿«…¨>ý‚¼g_‹Ï­íúйc6) $Á¿dúž¬i²¹4N‹ÑÇL@§ç…Ü{ó|¹´ù°C·ú endstream endobj 282 0 obj << /Length 3028 /Filter /FlateDecode >> stream xÚ]ã¶ñý~Å¢O2«"EITï­Á¥hvÛæ‡ô@gk÷˜Ê–#É×öòÛ;_”H[ÚMŠÃ4gHç{F«2ø§êì¡Êuª õp8½Édõ_o”Ìö€°0~ÿþÍo¿©ÊÒ:«ÕÃû§ðˆ÷LJ$_7—Ý?ßÿéAÙTYý ÓÂÖ ùéœA©Vúa€ÜtíúÝ>Ïó$ÿÝnoL‘üñ¼Ó6™Ú¡ùåÙ—?ïŠ,KÀÔµÎêÄh<ïÍ»÷3Á…Ö¯¼1^y’2UZ>”Ö¤*7Làg$ïµÉ§?ìL¥“ª"9õ;]1ЬôpÛÞ£‹äÝx¡ííÁ}È”94§öŒÛ¦ö+\/yO™´î?²û(‡ ýäy`"ìÒŒcÃÓf$á3žJ¼6Už´#{¬~ äE–V¥ù¥âynOÚç…Jëª|Ø«ºÃµk˜?™¼PͼÑ|,lä£Ú5‘LFÔ †#9ƒ&GàzÑ £“¿]›³ß&ÃÂ3þý‚ áMçU}ÈŠ éMÖ¡&çY™WÆÏøàDÚ^¤•®<ÆÔ Ïí´v”¶ií$ë1€$õ?Õc/êc€SÆÌÝóYl‚óÓ•$d’uÅ2áãŒöqpý¹a ¨*-Oý+IÆ«ÜpHPlýep²êm#ËSø¿iùm¤òºÌðuEZ—–ápvQ&IÉúéçY`‘dã©u4«–Ôžžç%:ÂcЛ`Çššxr¬Öòsˇ ,P)RiQå^ ß`˜S3µk²ÏUZæ‘ð—‹÷^ø9pOÅŸ—'"Ü;7BÒ®¼´ïÄkfŸp»P„ ª¼‹yÅ»¤k¬Ù!öã*[ñCÞïª*GÍyì6¸DÛ„Gé10d¡\ñ'xqÜ¿&,o K¥ålÇ¿ˆS¤Yvk°èNß󧆯½ í8¢¨<™2ܨµ¬¶#˜ðàQbü sЧ"Š¢çFY x™ª< Ž((„ô2„Š ‹À_gٽ囇HR•Ø¡ÑÐVA󾹬-ØïJ<¸¶® ÚŽ#›³®Ëe…Ÿ‰ÓùqüS—§à¢?°ëÏÏþ$ˆŠ-OQÍ*™̶"™?låwJoPé¯Mçà¢/‡Wò®t>)pp¤Ç…~ ¶Èâ»ë¡sÇîÕߘÈ:ɲô²¬jf="Œ{¦ÐQÐæ[Æö|pMçE'ënÚ®ý¼ƒC›@jµÂ€ ;ëÛƒr^»FÌlø0@ãÕ:ù|ržñ—pÒ¹¥õûŸv£ýKDÁبÀÛ‚¶MÃÅŸã•\ œå¤,£hu›¯9€~=»åœXR@®ˆ‰Ë"ª‰³#„Œ‡¾ûä8-)Ä:àƒ|3Ü=2õU6HXÕ”rê_“ròIBA¤2!`I•Ö}5°*µU%îºôe 1±J¾éþ»á©Ázßøˆq¤N¾ãܲ§äÛJ‚^'_)'¯lyéZ¥ÖÎIÔk4ÀÖ71ª–HTH9¸ut'”˜þ³E\: ÊçrH> ÏMý¼ñÒq¥`9ûÂU¯Ü'ÇáU t ª†H×(BHÙAça…TQ…D©· ùsø…’5äv)„ãôØ0dÙ¬JQXOƬCG³Å: ¡mÆMýØtŸ„ÒíB )8 Ek!‚ %Vhˆ·ª¾Ée='R˜2ùs˜Uä”ò’s™²š³<˜¶çŸ®Í’Á•v±y=ŠÇó‰–S&:ý9Çd*®VÜ!=»´s@.瀌·‰ëq”­ nx8DÊØ$ÞÕRP6#r‰Ñú©*ËÓûa¡:“ÿ8|tÓf•)Þ£øÌ°T•<„Ò <©áÅcËcœ1úFéšÛÔØ*íùKôåi¶ô%8/ ¢„…V俏{å&:XÙIg°ø‘§µß©#çAÇq´™ vÂh›s´=ñÜ;´ÒpºZæQ…ƒë´Ó…¼ fQ¹j¯€Øk)ÍÕÒ,9Dž<5_<&6…qô}Vë¸XÆè%Wî6ìÜ–Ñ;¹âé€éÙ#q:ÈõÿÔkÐÍ2sá²|AêhV‹'™®âÖ2žÚñDuë|äÀŒ–“6S§eeãwµêjÁ T™Š‰G³åtªf}Æï`«|ËJ‚¦D˜ó¨={ˆg/£Ï lpòÔìÔ%nÄ [BQ¤"no#A”7ÅÅ¿xÿwd«Yò Wv«Œ³i]è›´½|Ñ÷X3×<ç Y̳(|òŠâÖ,ø~ &{õ„µõªMþpF9×±ÃBÛ4NŸ¤ˆÝcŸíFƶk9„ Û,È¡G]Ê-ûiXúÕ–Ú8¸(°È”ý˜!ú.ÿ÷›UðÌÖëJ¦âƯfúE ³K× aX¥Û|©¥£«MZ×qt¼8&išÛ¬`~(Ô†tì?¢w|¨‚ªWiEm»Ý}ã­hûþ f>,úþÖµÖÜ*Ãï¯Æv•5«óF¿JUŒOëQ÷ûžúè§_x5×@â›èç÷ü¢þÄ?)7‚ñ¦QVÛ!¿æT&zµ®«—‰¶×ê¦QZßcG׋¡ôäãè$T5œ#£?¿Ø¸6Ïï™e2û2³Ê Ô¾™Õñ½>‡°3m$nšñß¹.@¹Q‘èu̇ ¬¿I„+©·¥M†Ö§mKS©æŽ/µ+ÏXˆÆ.±ÀÞô†è#Ðiï‘nBKŽ»«ÑVʹ0Õ‰ >A¢4µ“ûÒÈ}u"HÑ—ºöʶ³?Ì/h8â\¿¸A.…ìŒSTüS­ÿq§u endstream endobj 288 0 obj << /Length 2951 /Filter /FlateDecode >> stream xÚ¥ZYܸ~÷¯˜G5àVD‘Ô±û”8Îî› A‚µ »9y»¥¶Ç؇üöÔE]­ž™ °a±‹W±XõÕA«»þ¨»2¹Ëu§VÝÎ/¡þúBIkö³xûâw‚¦Jâ2)ÕÝÛûùow?G¯Üe÷þíŸïT«"½Kc[”Üó.I5wÅ©Jïö³®ªNÍn¯µŽô7»½16ú¡Þ¥EÔûÖ½Kt²CÒá?;›$‘ƒ‘i™&edh½¯ßŽ Û4}âD8â‰#)“ÇÙ]V˜Xià ý6-"_á/0`Ò<::üѱjý“Ô'ßsƒÇùR=ŸkÑC÷Ðùx·Ï¡-]Ù†¡Ž‡ö­«»û¦=Á˜Ùž(^¸2¥ce™ó‡æÜô¸‰ßäiäûêàXØîr‚6®¬“l6‚{åFš»½Í¢O¾ÂQ¾‡Ý^E#—ñ¸¹3›ñîßãî°¡Ã%lÄBlºn¨`¢®úXWïe€‹†ÇtM‘gB-¾»Ìt÷nx‘×ÃáT½«›owû¬P0“p}õe¬»ŽW8n èâP-éaâWk`oºLìf›ÄÕñOæQÍÇ´‰I¸—¦Û”Ê_yì¹!q0W „f®„&UŠZK3¾ó; çÅ m½9à/wò2q¡½¶ŒA½ÃÄzy‚ÅБ@Ry¸y`¿=TŽyÞ+cb›”ÐSœw¨„Iô×éyõÆw[G°iœ¥YàäMß\¶øM©F½ÜZ( «ÃˆIôϯÀŒ.¢ßïÒ,ê·ÖÖÀyš?íW¾ÄÙ\ cZ ­dc9•Çi1îøwdÓw~›9+3Þpݰd/®ªý Û P‡i÷¾m]° ×qç»Ä&›¤e¬óñHowy.â:u›ò·qžŒêŠ7õ_ýaèÝ™•AçEœ¤b8õW„z°×*Zr‡ª©ÅVT9þ\Á tŸÃ¸¹¾òø="­`Ä™©óNÆPÜÔõƒ;q ns;&£èꦞV¨ ‡˜=}Ó’;2¼"Øz Ó¶°û.;0ÊV ƒ`úôÈX Eˆtl~p£ëH“”Þd¼`s¢ÈÍdK„ßt B6þίL}…Á€ª® ß9ñì‹;¶¡mÎ qÄ8Kabƒ—~”þ$ì±;ä“NîüLü° v±Ía‚Í_¦U3«Õ~#G­Ýi¥°c ´wFTݵ}Õ.³õï<`+2Wù?éBÔ3ò—u¸ x–¢Z°uýÜ ÉŒº*®·é§ÀnÕV &~Ø·@ƒ} 4Ø·Ì×éø÷ø]DyHA#™PžÅÙ_-Ý=‡‹:d Zn»wkÈ”aÝJ 7§T”¨£ªVaüLW%3)÷GÈ[Œ9¥Ö‡í*§Dâíœ"³Ìü_9%1²,?H¦Ÿ‡pegfTœ¿À™6·†l@Ï#Dm’yfVRÉ£X"WÄ–3qÇm>äABN! .J»4ÎFbC×I‹òöDS„-3eõ@Ed¦FWĪ IAçmš†ùËw$lÅÄœÉÙ¿ÏØ/¦ÈúM½Y:Ò ˜æ˜#q„‚[Ü{Áa\Bޏ,W©Æ$<=&Ík]ÛÒ°$›‡Ok˜™(¤$*‹{Uk3vVVÁöx§ô“ä _apªê¸ù–¥¤`~ɤ¤MñǦ¨ÿ©H#UX·§´Ùb$ «'„$…\Æ ˜à¡°í^t®¥0ùBG{*0Š'Ú,Řœý¡êЉƒ›—A¡§ ¥ùKëQ/»oÑ[j†5Æc‚U)ÚlC‚êÒ#0íòX-|;„:Ÿ)beŸŠÛ/ ÒU‘ûªT*Í\Õ± ô!aÚy…å¾ ÷êǘûÿ±+ ~üäÖO©ÉãÄdwi‘ÅÞá ]Ü9{Ž£ö³aOëňïÎoEjÈ]§±2ÿøy¨ögRÄ÷/§B“æ|¬B„ ‘êú¿äŸ±·ñ¨F=qŠõb“í^Å"ZËŠsw'yÏ Áµo±J+,™ëþOÓNñ¢h¡8¨|#UÐ’–I³µc X%%>ØfíŸÔ+æßà»桲@XzO¡ir¯8(–­•(U…fç·²·9{¸Åx˶Œ>C{ÐÒ²÷²Åµ? ê=•¡qªxd¨äQtfÂÌe`„"[.ã !€Ë€êQ–k»–‹­yä~ë0ôÄelý-°­9NÖvó!‚Ü JÀe”Sáò•ÐŒ¾\‡#™¹Õ òBÌq™I¾.öÁ8ŠAÏÜîüÀæè!¤>–Äiv)ðÃÏ4vö’¤%ßK¼&À¨Ù.êäñy¡ýÏÃAléUSw}»ƒkq¨aÕµŒzn»/HØmž6‰u©W(¼‡qØ 1£Í¹ï5W*ê4£ 'j«±äñqà§€,(ýo^~RØDƒ&¸ÓÁÕ‡P‘ZÈy¦öSmåúеŠBW%˜ õ%׬S)%a|sëá—Ê+Uý@O«8…sšËݾúÚ„.6ØöèÑÐJðqé«“"EN9ެe±ÈkêM£B²CÑ#|i|Å.ñí÷„Íy½ æÍ/Ú0¨… ‚£˜;âïÍÌÊÞ~r§vªBˆbÌÁÌ,yD£À%ØrÁ^c•¾Œ‹eܽ C6‹¹¼¡åêZ:éoB?ƒ5¬0v¥ëG(ºS C|Ì¥ú!Å¥sE‰7’ª®ÃikPÃ7/«u¼V äfŒ»€ä.-qýµ:îó tŠpL]É"T(ÌÖÌ\fš¹*H\týö%¥ q{ª`å¿ñ‚GýhÖ_Q kŽÿ1@¦_q‹DÒQœ;*û4adrSrÈ9h±kø©¡seádÞz» o—µ->˜š2óÔÔ&qÄ ´ØŽ»ÿ)Û üýSÃ"ë"°F¼®é|æòµJnƒ=vν*SšÐz‚ÁŒNæJìªý_—ÒM8g…oWq`â Ò”¤=*Y¡½9«äÆSéu…9aäÎ^(£ endstream endobj 294 0 obj << /Length 3489 /Filter /FlateDecode >> stream xÚ½ÙnäÆñ}¿BÈK(Dð/F^œÅÆp`g[ø@¨aKËÍ 9KåõÉ·§®æ5ÔZ‚@€Ø¬®®®®®›£®øSWEr•k§®ölj@ÿùBÉh»Æo_üþO0TI\$…ºº½Ÿ“¸­®¾‹^–§ënÿ|¥òXåúJÇ./xæûDžŠµÒW»ÙT}íõΙO®wÖºèóæZçÑÙwå÷‰I®´ÿϵK’¨L]褈¬Ez/^ÝŽ ;­áDˆqy$»:RšÛXËÜ}7´?s.^ÿÔà ‹^¶×NEm‡ÿ«º)ϾGVÖÂq9œÑ]íd ³ÃðpRÇ™ËxîÊ ‹¿÷}Oˆtà®&áäQyx®Ut¼Þ©¨ìùåä?xy‰ nË€ò°/›½ç—ªäçq%â ê±EZõѳð\yÁº»Þ9½õçV6kïvtÐebt@0tžFûöˆuþnÒ.næø™F}ÝŸý±d îÊà [u•oʪºmÃó.’µ¿÷]] Eb5%FpßÖì÷‰² `Þl±î]£UtÊŽ‡t|xÒQpðÔQp.<Ç£,) ¨6“Ó‚ îdbGP{¡w†‘–[&°™ŽüjÝ»¡<,N#‡é{ØÙ&j) [ ‘I͵÷MÕòðÑÆ×»ÔfÑ«6 jÁª¾0UØ878 ­ÉR¬Nžk)ygYXìûsÍjÝž~_· 1¹5£ŽÓÄ,//;ªH=aïð¼Ðk÷ó»K¢:¸œSçÏåH……œ€ uGîk˜—qÃR&påè¾Ðúº®ìÏ%ŠrCËpCÐÅc;ÐRPßSI7ŽÆÀªî<ìÂ/MËXG¶…J^A7šþ°é YN×ùþÄæCö‚Ð2ìM2 RÆá*è è†'%8˜Æ¥ŠõÒ+àݨHí©«ЧØ0V½pºYl\4àw›Þ4Ît0þ~Ã;x~”}_…“`dÂh­GE†ó¾‰¢ÈâÞ 2K $²¯ËCÐ4!mÅN0œë£ïÛ†ý8x'¹]¹Á ”3JÆXq$ÀŠ„¼;fø<÷É6ú¬ «›‡î¡cЗ[þ9sÉ–Ijˆr¦°Ab/Û(¢–uÃñìËö Vµi.¶ÙhͰƒŠ-ƒ[ƒ³¢íLˆi©ãœ‘Mìb…*¤£oHÄváäY`I4ùùÕµçÐàÿ³LÑ¥d” Ôƒ ÷¤Š\JUàz²ô#á5ŸÂkb(ŠÉõ&v>ÕÅ-ÆL)0tì).:bnNȤ(Ž¢áp3]z@Ã'¼l. t6…‹¾„£ˆHÚª(ÃAìÑ?d£P+“Á9¡=sjÔzÚ”“ÖAfQàk)ÅKÿÅö•±e醳ÀIp!åªÏì†,OrG7¸’T éŒiqdƒcH„:efÝ唈ódÖ ¬cÖð—lŽÃɳe†.ÑEßRi!, w,½pâÕÉ|-|K¶¼3 ÞÚª¥&ˆ?Öi"Ñ Gå©£øô¾>–J2Ajùá{ÐÊ®j×+YÝwéÚˆœ%½¯ƒŒSæ¨g˜r,¥g ¥h0Û~ÓAn¤Å­ï7L\ZxAòqJ`—'g…¾ös×€ò5¹€‘\Ÿ uÆ4[Q•Så+MHIŠeIi$!0«TÊ´YÔâù œäcvO[þž™váÒpDìÃs¹9HoÊcYmVʱÓÙß­jR´©lBó)VùcÆù# ƒYÃPŒ3£Oç Õ œùÒk#³Ôî Ñ“¶€“÷”UMÔÐ6jå ûœ7 @—¬lCº«¤˜»§nwäx†¯z*ï.L VU‚²Î"`ª„hq*›7K"$¥§S€1éÎPÉTLOñ˜tkœGÄ*ò7ÑŠËla’-àpÎmðñ…‹$ÓÄ[AW+yk;«R‹WŒK\AÑŸžÍÔ‘ØfçÒSÌT3¿&‚(ðï¦ØŽþ¨å© “c1€(aEPQ&ÁT§²žL ÇK°Ûʘ›Ù%d#ÃÔ˜¥ÚP‡šIoú"½°Ù…òØ”“,Пƒ_vlz! ¤ÐòÔFÂf“(%¬-«i/~‘éP9 ¨ØéP6OŸ ë~`†\:+´œaÏË€lL™Ý\×ðm $ÁÕŸc1I󋈳/eÑÅZVöâ¯:ÖTd 0Ì:z8 ¥RØóÃFVZ8§²ê©n¶âKš‚ëµÏ/Â<øó%ǸxvÌcï²+TlÝÒ»¼–;^ˆÊ¦âéìh¨}?Ô3u@8Š®V~3,;Úýãr6˶GÀÛëÆêͦÒ<Á‰á8;ý ñH¢¨ö³”‡äŒK?ÆÊ.C)VErYQÒŽ).S0—¨Eeó‚CÜs-”øuÑÃdÌ@õ{D4ú…tIE\¿"_‚ÔÂ7›”4¨ó¯RBP@Ã-ƒ r¦ \çÙä>}’/G~èc„”Š“tÔ¨f‘/`ù¯??”píž¾´9#ù•Åœeì³?€¸;žfW‚]@v&=ƒŸ*Ê”3qjÆcÝ^CÙTR/ŒóƒŠqqšØUyæ‹ýï, lÌÝCB;cَز]ÔìÄþ¯îâã— Éo®/¯‚8>S·FõöRPçâòåå÷!þ.{I±uÍrIÀF@ AùÝ0Ë¢¤¿0‹§P#¯Êšl¯ ÿ,û•ù:&¦xº…j¦F„ds7üåévZQ±ÂÕ¥Lù÷'ˆùõ2:¸âwfiQ©ü'°3÷S¡MÃÇ­j3˜ÄMˆ0DÖÒ úÐEá.?ÂÀ™NÀÏ^~qÃ`lüŽ`ê‘ ”[«\râû¸» l#— s£Í-›Ì-“È6Ì !K£o{™ åùÈé–¾&v¶JH§?w?oi+›…™:“\½Â&ÒéÆ!vº?ÙÚ&ËáPéÌn“q'*æ0Í6âÈÕÄß.x*K‘qùrλ^û =ß_='”ÚÔñ'FÆu+Š`^Ï”›™·”fñÎ’ó…YÇßY…iàUòɯcÿÞC~¼|i•Ʀ(ž#}p1b›s “ù£ý“½÷?ˆýþÌÀ?%ÌÜÆ ‹aSP`ü[„“‚hNƒã7Ô¡NBø?6õŠx“ŽÒyÙ’;øJ5bþï3Ûj·¼Ø¾¨ÆÁŒ!T±[r!›ÇÙÊ%cjêKôüµªñ»çÝ mHÁ-=ÓŽDXv0˜ÃsQ¦÷¶äIðUü…ˆÂ4=çú¤mø #¾ù˜_¨ÒC2«ŸðÏf BøË"1W?§š¶M%óòáków& LY çÎxü]ÐÑn¤È˜¬à¡n¤-¡L¾fW»<Ö™™ñ¼ñƒ©€ôqÆW¤ææ.FˆækÌC%ýÆA¹—D˜(„Œ)p3\¼H¢Iñ‘NŽÝO~å„ùò³ªõ®òA$[åÝsžÛô.ç=ÐtI“‡’S+î(1Hš_¹§Xÿ†)çÎ%íÒ<$VË~ Ä'/yðBrAkbÈ„5¡‚«Çn1BÙùy= ëò¹üpìYírUl·© *1{ÀrA´@fó£³|}ãyþ6 Ã’l]Ø+|ãŒÙòìÅ]»\jÑU~Ñô¶ü³8ëÆ¦·¥,åÔ-~añ·e¡¿Êï”P"òò×\*_6ƒ…´oo걚t!a€QB±!Ôñ!üë-¡ß€š15K’ú5ÓpÁÆÆÕ•«o˳¾£]ìµ>Íæ]£«ÚjFŽt×}0ܤóÔšî„,÷m`ôHé: @ÎÈùéŒBPŸZÂÏkÐ?ôŸw÷_ÄëÛÒ endstream endobj 296 0 obj << /Type /XObject /Subtype /Image /Width 326 /Height 381 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 7 297 0 R] /Length 4628 /Filter /FlateDecode >> stream xÚí]KOc¹®Bhî¶¼@ljåÜÅÝŽPÔëi]!¶µ²gøûsü~ûØ'çØMŒ˜0¡C¾|v•ëå2ÀôãþìÓyø!<Ý¿xãr~=Bï÷?žÝq:?„Ó¢ÿÄËxˆ„…ÅÓÔã‡`ñcæñ"X|šYáHßÏóŽ{Åâù‡îÏcƳ A³ø2\¢g œ ‹£õâé·¯•tÜ-c/ægÅâáIþt÷|)±ø#YÔ,Y„§»á,B™E*Ÿî–%ñ¤¾—'åÃB1¨ïa,.X(wÒ³ówâ?¯¾º±¨•¹añI¢ BÅ+àY=,Ï«ïYTs’aQ½Ó“a$ŸWgòA¢…½&Z²¨æ$â†x§XäŠIC0ŸÕ´ª!Lû ”dQA̰¨'úN±¨À8A?a î)ó‚E>W‰Ö‹ÀQ‚`W^ÔÃÞÒ"Y|‚»‰–}#Ø”œÃuÎF½¨¶À> |Ûî¢ÐÁÄ»KWˆ[Yiéèä2­½¨1NÌ¢ýY³øâø­?‡xË¿OÞÝÇóûéb‡ûs¿ñqÉ@¸ùxÿãr™Ú>]ÞïÏ/—ïyÇýùüçýùtšá×ýâËóå›Í:^•DŸ¾>Ø@ o¯ôâ¥âWWˆ_–ÅÏzê€ø™ŸhÃâ¼o,ÞX¼±¸Eõ¼øaÙ± ñUŒ_ûA\ÞøæX$ó ’ÿ ‚¿„)ˆü•æÃÈOI©âFˆ>‹!DZøßeüïÓû“ü%„á‡kÈVXXþ:¡HÀ&þ<@%ÄøÃ5±ˆ ÃânDšEÎð7Ïc‰Åå³ÈoÍ9ayµÿ¶+I}e×"ò¿NR\Ä{ógˆÉï‹lĈEO\H®%ý| ":å4 n…è‹K´B¥#•¸ñ²uq‘zå“ b•¸$•NawYߣ_…é®×"¡V:rwá ÔÚ®T:{t#Ä7bÍ+w°t|3¢ÅÒ9âNöb`Fܬî›Õ}cñ@ˆ_¯¹aYÌÿ›h1ÿn–ÅסKÁ;Íâ? ¾81Ä‹ÿJ•5±VÊÎpAšÕˆÂ–ÆÁ,¢b)Q»[Y$ån+—BˆÜ{GD¡Nx}¥Û!|=ë*¹v«øDé1bQz“˜`(¤Ù1, *—¥?Ž£Öb"€It"yq”^´â‚ÁjSzQQ±-w«tB %.2èÐ âÀ=<rA©‘–ŽŽn­BÇ"ú°pB{QWA,~7#µ¹Ò<,r£ŠÐù2!Êy¬nB­ˆ¿XXH©Ÿ4o³ùè5£±Äb¢ß× €(™žèt>zÍhÜ¢ß×€|ˆÊɆz{qÍh|,úÑXð£3ÑÍ '!†ùè5£±  ,z ,Ày¢,.¨*/½f4>æýhbàG{õa¹e?•ÒDûùè5£qG?ºÖw óÑkFã^~ôuùhjfq‹}M>ºl4Î^1oùè[>z?z{ñP?z?{ñ0qÙÏêžâÅ)‹Ö,NìÑs°ˆ¶kî0Ù‘E´]rÔ€,À¢„˜F ±ìA’ÞE‡† ˆU>÷dQW:f&DÝùR‰Z'sºfÒN«6–µI=˜E§®™¤Œ¦!"*´›DS1`ⱨ^Êí¤sâ^ÐlèB{„X”» ”&DD7pz0‹‘©—‹Ä0`¢”ŽÙ]V:!‹a(50iëÑÑ^±É^4ô,n7ÆÞvo=ïöxcñÆ¢ùG»Iöa,áEÆTuñîЀªŽEÿ”¹Jêúi0‹ÑAx§¨ÄFeÊϨ*úWH÷dÑÞÀ¬fšN²É6jC[èMU±.,€ÀøZ8‹ .(ÐW081(s°ˆiˆD‡IõÁ92„¬‡¸Ô°„÷ šC×bêB…~ýi-1›ìÅ0TÑè»Ìl/>š{uÌGX©éÔÉê–íý_b"+n«fH/¯‚ØŸEQ»æ*-2ý ÅiÐñ,ºW¡©ô–û>$Ž÷ŒY‹.DÏ×Ö&šÝz,>w׃?Ñ‹úþ/ Ä¢„øÆ —º¾¬;˜è€EæA,KôÃÿ¹½ðÍ7Ú¥¯¾fÚ‡È"ˆþD—$º"ÛbN\PTF&Ä%Ç¢4¦1è(æ¶·­/ëÖW£0}³–Î;Y¥#,%D–R:åg²YhÛÛÖ—uë«QÜù©ÞãKkÑ\tæuó %+˺Yb17@Ì­E÷.6ÓQ¬1[ÖíB„VK)Ë"!ó BŠÅÚ²îýìE¢éží(V€˜-ëÞÏêÅÅ…hÄŶ·­/ëÞ‘Å7m+Õ@,ì(æ¶·­/ëÞ‘ÅobÙŽësDÉÒY­"q€ï²réµNfÒw©ì9Èw1ñ¿¨Oä4¾‹‰¢VTK ò]ÌÕÁAŸHp¯î»8ÝÞÎÁÃ}–è©tzWçz,^£š}— D²W§X Uƒ:§ÜÎaiãD—XÃbr-Æ1õ"Ü¢æ¸O¤ö^ÈÛç}“3·sà5ââëEÓ'RŠ‹¾"x•EˆnçPú@ºÓÓʆù.Lçý>‘òŒ7ó\˜,‹¶ùLt;‡ü€æZä|¥XÑw©žˆÒZDs„6¸Ã&2´A[oUl˜[‹ÊwQªÕ½ÃôhSð²…•%ߥÞ}ɲ¨}fÂDöv+ѦV”Ž }ç×¢™èøvŽDv$Ä,‹Z\¢Û9qÁbaå,ªÁöhwoçPú€·¹òú[÷a1R ]”­¾ËK¾Ë‘ów-‹3[ÍØÅ‹7o,ÞX<–Åi®©Ï³X@ø6 ‹ùö= ‹³B¼±˜v¦SáãÜeÏcX$j‚8„Å4Ä™Ö"éî4DhÚc‘¸x!ueaÀ"e †±?*“…¦Zk ª meƒmE3>ßwÑ*@Ä ˆäDÙPGÝÐënc1†è¯#]o² "è$mÜŸ Z‹ˆ Û2ÙŽ Òꓽ"ß»LÂjzI1¤”Q‹²æÄƒèT›(ˆ .‡‚Fˆr¢“븅EÆBˆ^)‡SÍ+‘bNÞˆŽ(/ß“º>Ñê“FAZYReË#ª 𠼬?‚¼Ò©fQ­—8ÔÍš!^·G òõB4b‹„Vè¼ -3Å’:d;†E¥5½ ­…ÈkOe‘Uªî¶±×ÉÞ!>~ïs>º ±9¥ÓÅëÆvˆ ,^ që ƒŽÓBìÃ"‰Ê|áVÉ«š*…®#‹zsÒç0©b'¯Ø•EÛÙ×øWP¼5¤?‹Ä 5;–Å·W›àVÉOrײX؇…X8°øÖ¢ê¯ä9/T/ÑÇ+!öˆu;M g¿Èi •7å@t‹œj%ú°p¼€¸ÉÜ %ú¸püÃU;í.-⎻ À.·ÍN ±‹òšB¾‘ˆ“;æ²=R·~:÷¼â QFkPÝKÙ±‹V"DȲ¨.óTцãAöù¿1©Dý%!Ê‹>QVü–ẎãA€¬{”înD4Í7Éÿ ¾Cu3‹Îõ˜XÈíP° ¢ºÇ·¸†È£õˆH×±¨½!̦Ÿlß'urUgJÁBLNtSÆ@_A”I?é†0à|‹`!¢ Q‡€¨ÿyR\š2ÆN§ŸtzœoMC“ Ö¨láª3[×¢>ÀŽÙô3§lS[ošmgÑ`Çlú‰…çC÷Ø–1ÈBd+Yûe¸[X$b*ýdÅ%Èt‰/êJo–pLúI¶Ó5ÇTmö K|‘¶ø”‹/V×:7²Ø ÑI8FÁ;¬<ò¸)cPí9 ÇbmU{×ø"óƒwL÷yÐùX÷<å ø¢Ò÷Áe¸Júƒó”ÃXD’©{Íȶ°ªÕK öe‘˜ ‘óg7JÒ‡¦XP¿Ñ—E½)9—á:Ì™J_at‹Ò*‰fn|1qH”Ö7—žUpžrP”V.7uΓ+­tø·wžEis»µì.ÓBì¥ÍÆ›X<.Jû¶ù#vÌ^õ°¯Ÿh/=¥cò.®ï3[¬;‚H“­Å„½è4:-dv¶]ˆa`e ¬1FVZX¤d·œÝX$g¢¹a¨mÆ Xê%»A4Ƙ-ƒÜÂâ1£|t=Ä…Å?N^LçPˆ6Ù[/. ‹\>Žg1ÌG3¬V:?/ï÷矫,SÍ={±".£´ñRLöâêîrþóþ¼¾É °“îl‡D¦î²ßâËñÇúZŒ R"å'º^g±N¢Év‚q® Ù/Š@G?)lu© îi/æ!ú7# KDÄ Õå+w— c ïÝ3¦é]8±¯u‹Òºf:E±:Jd L§¨‰X 2ÌfÈÞ¦µºìÌ¢'.Ì{')…­.;¯EÕ Æ®EY7eV»KÐê²+‹íƒþÝñ0½¸_ÆÀU¯ÿ¦êøC ;±ø6+Ä.}#®:’Ó§‹åN§†Ždq§SCS²ø»UñuÚ¡Yüš¢bæŠÅß片dñÇÔC°èŽ“ÿ¿#FaaÑÿýyï0ÿøœkG endstream endobj 297 0 obj << /Length 35 /Filter /FlateDecode >> stream xÚçÿ¯¯¯âââÖÖÖdddVVVßßßœ± Ø endstream endobj 300 0 obj << /Length 2326 /Filter /FlateDecode >> stream xÚÅYÝoä¶¿¿ÂÈ“ð*¢¨Ï¾¹‡»"Ú­“>ô€–è3[­´'jËéßÞÎP_K7~(P°(rHÎ ó›WÜ$ð'nê䦔iœæâ¦9½I¸÷_o·Ž p\IüþþÍ×ï¡)’¸Njqsÿ¸^â¾½ù{ôVÿ¸ÿã¨bQ¥7iœW5|HRICq*Ò›ãjÈL—n8¥”‘üÝá˜eyôMH«hÒ£úÈä€]Í¿y’D $Ó:Mê(Ëq½7ïîg…ó4ý ‹PâÚ¤tm’Ý«›¢Êb!3¯{ž˜ÇÌÎ]{Ôª;š–:Þ¾ûóý»¿@· ÷Þt‹d¯:ªÎè~-Kí_~Å9nº\-d,òeÇ‹96º\í³–Ë„iT½}ÆÓÑêézÃKožõhuèÍMíÔ¤qí¯ßåÚ#iUIJ€ÝNŸÇ"ÑÏøH¢/4aëBðo–f~¬òQ‚kË*»Öü¤Ç¬I£àE…Ô¨À”_Äð›g"–ù¼ù/´êãÐ\lhÑ,+Qzéà‚"ËEäWoÎ>ŽiÀ)*03‹\’øÐ·:´hšÇ2[»( i—ÇeZ-ެƒ³n·/­1Küü?X#xäE\×ûß{¨Š‹l¶Æ®Â¹¨"eñYF ¾WÑ0¶ºW-õVX$-EŽ´Í;Ó4¢ ^<ïžÆ“‰¶Vߢ ˆü¡äÛCS)ä [Æ‹ER.–©eeñNŠ”i~$óúÆ(ÖF}ºèNs$È,Nªjó{¤,qƒ”¢w5]T‡Í*jx —Û5ðXÔe0bÄ.\ð"ËÅÀÀy}KžGsÒfxÏá¤ú–uS9±ZÍh¸5#¨y‡¯BJl F” › ³|> l9 Ϩr(àSÈ8ïzËGwDטú£p`‘þ çjFS¦oUL ” cñ\¤¨0s^Æ¢(h=ÀAEýép.% ‘5ìË2wÇ ÷‡:ìŸøŒÏ°ó€µô|;«lȘ¦ÀN?èᄘz6ú'˜ZÔÑe2ù¢øå ¢ªæÞ«èÉ ÆOÃãN ÄöY¸Ìx¶% ๠¢·„l2tj¤®d}¦x)H7(çây‰!K£-Où„P¿NC÷¤Žî,E ¢²p°ß;¿Ao@U+žÝ… ¡˜3œ:S(j°«ot­Yœ–Õ†ð`Fî‘‘¦ /^%my͆~©kÐ÷+ pËÖ™³¹ÍÖ%ÛáaœýpÓi’ŵ¬¶˜VÝGÒ$)ÉeÔdÆÿ%í™`”ŒÔhµÕý“Bƒw‹èk‡eZQûi¦oº‹á©n39€à–àÈ Ô‹€¤¯­ !âšy´’[ã-Yþ0šîi¸õF§µÜ`1ݪÖ! ˜ e:;AÁÌÕáR²ŽôÔ8ò+£»0Öa ÷AO¼sÊÅ3!ð#Ð¥¢^ %g›;5Œ©Fa›Ë™Œpâ5Æ=N°FˆZiOþù-;ÒŸÏHrú³>±¾Æ—Æ÷úUU£yÚŠíÜȼÀº-«¦OôÜÛàAŒBâ‹Éë8ä#ý0Yx®© ¯ÌÈžÑ?õ4à1•%ñ·{ðøÍs'½P™®“2-J@fò¹X¦]܇R²ë_;:`S­ªù¤¡±áÉªŠ¬·†½5ša8BDå¹ÊƃþúgmU=oºìeÁ Y"#VBM°!•ðæ·¡‡½¬4¹ Ùtu²èsQxÖڀυ­ ãAÐ×%04i^å<êF·."žuÒý`©b3´Úà:<6–Rµ$ðºœmH¦UÔÏ© ZŽ@Î;ÐïF ÇÑnz¾Ã¢CóR  mÚ ,w޽Q› Ýì‰ñœ1dl¶Z× Ÿ2BUž,¡8Ë__åýÍ9tì‚_])V0â7«–ï 1A8B•!W°®@¥®^à^6n`|ßa ­åGxäÀRW"^As  DólZ™`ÊuPW¨9Ò:i¢N£÷¦WÄ}­` CBÑ|þ™Kl¼°g=,éÆB²á-ºá“Üu QÔ%Ŷn°á Ù„9ÍuàQdÁŒ30jU:­ä¼+œÔOòÿ„“˜Ë¤>I’|áwxµ 7ðpàìBFÂwNNë@GSž¼T7ŒX{`Ǩ¾ ËÏè/m,­Aì„RWWüº-wwa’>tÊ#m'"b¹2x‘ΪW‹Cºí!yºzÁ‡Ãe¹ö”ËÑ×Þ€îúøæ*Q÷=ÎEhI€„Ê:²æcÞ^Í®`ð@–”|_ÖÀSÝØºìVPz],µ6‡ƒjõÈ©N©«õCÁ¢v‘‡! ~ç¢wƒfk°ƒbž¦ü¦ëÀq—*Ab°¡¯".“ÈC&YÙmbœ‹!Ka;WCRú ›W&¾”)]½“æô}ÇéeE 8XD'N¥ì”‘z)‹á= •ÀØÜ”ÀØÑòaMg¬LIIö–ç`ɧ¨½,|à!ði§Y¹¿¢\*J¼§¹\ eg¯¨ ¾|í4^BŸj(æ/œ,S~_/w4L†l™Ó‰¶[m ‚+%¯8ÌÄ2Ù}AHK1é ¤ÝÇ’dœT¶§9{=XéÏçÎ4ðèÒYM,F嘾¼Œ]û2iÙ¹À6Ô?­ÏÞúúŽ.ûg˜½¦°?½Â*þ‰#pÕ9N6‡fWB2N ¹›aog&¡@’óµPŒ¿@Ávÿäîy2D|>œÝ‘¿|pw=ßdÁ—e÷ÒuOþÇŠoéæ=¡;jÓ}Bú¬½ºɶ¿…dPðÌww [Ž‘’»Tÿû†zÂw$eµ½v›¹ +/!ÿ‹ÿ…ô2ÿã %«NÊ1ô4KÏï;0ƒl룼¨â²~M%çH“/ÉΟšÎ%ð!ö¿Dý!”ü% endstream endobj 153 0 obj << /Type /ObjStm /N 100 /First 885 /Length 2016 /Filter /FlateDecode >> stream xÚÅZKo7¾ëWðØL‘C‡‚‰Û’6hrhkä X›D­­ $¹ßoVr*kW–¼«4c)îð13ß<מÉ8ãc6ÎÆKÀ3Ê'g¢güÙãw0L:Ï&è’7‰ ždR)#/ÎHIøLñ 2ÞÁˆœî,ØÍ3ŽÌRäõy”•8ƒŒUÑëU°ŠYF>7[€0;}W¯JTb\Õ±¾b t:'Cž°38 ½ªÇî"¬Mh˜‰”G¾!÷¾ˆ¡„ûcWCâ°‡ÓrƒƒIÙ!̰« DO&x^"]UL±Œr §“ ƒ]H^gŒ¸ "z_lX Q¢E@'þ£²K¾˜œrÀ&Æ #]dˆ<™˜îå `¹(OÄ*( ƒ¤lXtE³ƒ& âcWp1hˆ}À#’ÊÆpHØ0BãQe qr:S Ǫ˜0PÎQ 8§3Á$æ Z vÆy ÌcЉªNŠ•:hÄc¹¢)“Î`Ÿ¬7„@SŒ ÀLw!E˜ˆü ð6"àGT3Œ‰^Š P Ê4$Š[’l„+ÂJI­N’Â!c¹È²–¬Ø0FDeדH @.Y™.L8™°WŽ =h:3á,¨!sÒfî¢ZÌ8uôèÑhü½¹ð¥3?›ñ/¿þfp…Äbsf~suõvôÝw ÝÓz¾2™ñS0Âkú§*V¹+X6cLÊz«Ç¿üôî÷êr½úùuT£úüîÕ¢¾|]­Ì…¿úþ©¿©þ^)ÕäCu¾y>7Ÿ/ñæŸO19ŸãBÕ|µ„i6×®–õÍâ²Z6Ž¢™zYMg“'õßæÂaX€Hé-Ž,°v¾Yúx>¯±ÕEãrôn;G6ïGã×7ïVÍï³ù£ñ“z1­ë½Ý[½¸¼€v¬W{õÉ2 !¶Y½% 3ÝãF¯ÍøYý¦6PÁ7ïgÞÏ®ªå§É¼ºúV%³9^ÕÐm«(;F5[êøOM{E~@Ä)¶DœèA"Þâu/?4)Gë!ËC|·á¦QƒO 7ñmY”¾pC„ 7Ž6ÀZáÈ­_G‹?“R²Îó>¸­Õûi=­.wÑ&®Ú:A_´IjIXâq–¼‹6áÃhÛ¡é6Í9ä¤hË¡%‹ì$‹-´ÉÚÑk³~ºÍ³ E!ÒKˆÆˆÖÖ!èkäá˜l‰±?}º¬ÁË´2ØõãDçõõd>­·ñøð{@{8Úf¤ H®,0\)X)ÿï5bP£DîãÕNÅ)XWº òÙù‹Á|‡"¶É‚K±Èm‘¿‰ œŽ9Om Óa;éA“¢³‚dêCRìå_ƒŒ+¶òŒ€§9ø TÚ.¨Ä¾fWÖ÷Ò$¨³d!$…RÑŒÚ9‹\Ü(Ür7Â?TõuµZü3 ^$ÞjŒzÆjÞC±šj{˜;“tž|3;ëLg ÷ 08»äƒ©fUkA¶£j-§úª: ö¤HSŠ9€Ì>[”'‰áÕR·Ž«ëzzsUM«÷³yµ#ou?‡Œv—ùžL3ïXãg ¼c°ƒ3Què»Úò®§¶´HÖ»höDU¼÷‡Á±Cslvt_Vx7kB!ëNZµQB½Qâ×BùD•n6ZîÒgÇÜ’EL’Å–ÏŽkµ«Oižì§ÞÉ[—5ëšö8!õÕJ·Øâ¿PYq(5ùh™×A!S·O\V«³«z2Eæ½ú8Ø#!*Û¨½vA5«M|Oaáa'+ê¢|íž%×Bç¾èâ ºø]›Ì ÝþæÍ3mæãðþJ@p€»qPž›ª Œ~Ooc0ø¼h™2Å„€ª3Kƒ|d›‡*¦R¬Hø|jÓ:¹çÄyõ×ÙiŠ\M‚$[‡\ô¶‡2Äü¥ÏE´@ÐíÙ!£ðÓïûÏ^TC¥ElFª[œÕ˜¬BË%t×ë–ØéÊ•’Ápº·\é8R= —Ã1n‡¦3ÆuÐä¯ßþVôî-nï†KýNO.ÛŸ!èÈϩá¦MÿÔõ:ñ‘]òCB–„ûzu쥽Ê$LSfø0ý(NûLùx©µïü<-ªå²Õ¿Y ùªÁ3·Ëé|\9M9îb-û¯ý9Sÿ§¤ÅOz?[°ÉƒËäGÖé dyä ‘š^Ÿ¡mJ¼¯»z]¯fõ|.yh®5¼£ZZ_‹©P_ñnšço‡ÕÖQ%Ùü‡¥æ?‹Ø²ÐÑsl9üÙz—†S¶Ší_mîûØ1ôGpí|¸ä¾&]î‰Êÿ©4CÞ endstream endobj 307 0 obj << /Length 1149 /Filter /FlateDecode >> stream xÚ½WKÜ6 ¾Ï¯0z²XÑ˯ÞúH€ôдÈ=t@±µ§ãѬÛ¢‡þö’¢4ãÙ8ÙZ ¬e‰¤ÈIH8ü‰¤áI¥$“…HÚaÇÃî;V9ä+‰o¯vÏ_ÂRpÖðF$W7kW]ò[ú9f¿_ýˆš‰Z&’uC'×\*:bRÈ$_õó²wY®”JÕ×Y®u‘¾:d²Ng;šk®x†[í?YÁyj@R6’7©.ÑÞîÅÕÉáBÊíˆîvJ–þMÕ—Và€ÖãºAÁç¯!’ïÝîçsìhë‘à׬Ñ:‘EÁJ¡(˜—ýí2š +B<¯iã'ŒÊô»§÷ÎâS§ß͈Go3]ÉÔÚÞ0$@”ŒËšŒ¿ù‚W©ÃG™šý=j9Ú¼q#m/mÜZVý¡ëïûnÉè<ƒ½‚Ã-™¬ÒùŒ*ªˆnvý5ºàë ð«ÔNdön þD7໊ƒl¢©¿íH’‡pÑ1 €{€Æš ‚3ЉH(ó12p¹.$œìûÖ ùdÃ;>Ô–wÜÝa÷AH?ØÙ‘šÇ ÔIGŠ*YÖ:©B:7Ñ;=!¡Ë<žÖè{é};±>M?ã´çaÁ™OGËØGaãKì½è_„¸o§)¬Ú,©ŽÞ7ÎfÅî(2ÎW—l8ó:’®Ó\ÁVçd?œý¸GC¾éÐP|ÆúÆ…™‚~ÀásB¹É ˆÁ£‹v ]D¸WwqÇón»è ä{õô:ù?Šîtƒä Hc]ûÆþàUÓÀ> stream xÚíœÍjã:Ç%CèVÚ”™]?@W³¿p1˜®Ã€!»(~…»-¾íµ>­o[Ф¶ŸÔÄ3qôÏO:ú8É‘¨i»^³¶Ïifiû]§ÙØwÍ,í²;TkûCF3Jk'6ý?º¬jFi[[ËŽ”íZÉ:ʶ¯äýŒíÒW±g볩çwÛA-M°u9}òÍSZ+Ù2ö·öMïoÜ)šIÍfÅ9½â^¶©´=;kcˆ äbÅ…Ùr´ÛÌ‚lû†Ö¦~c#jûFdcý}f£N²o?Öjq6^6^Ö^²¦HŸ­É&¦Ýø§ó° µF°Q•`ã6Œ«yØDM6 ÛôÀzÃÆ;«Ï'…gKwƶM„O²0ùGlHëoùÆÉUcÉ¡æXò]ÙĸQ…MÈÕa›Ï[§,ú^ï]5¾µžÒˆRs=\Úq6õ<É®£§´]w½ ççè§äEä÷I‡šÝßȃ¨-x ¯äïoüݪ—Øc šDˆÚR`Nc {7Tz@Ê89û¤O-ã0÷7æCÙ9@Ž%Ñj)lé3ÎgÎo[¶Ûà5]ÍzÙPó¤± +ÕnKjƒ_í¯ˆß2÷ã¿ efûñOÐÜlC¢–Õl©jï1lbŽÄÃËËË/=°øó²l¿ÞcØ\j7®ö;“šÕì3ú]˜­ŒÚ§±±Uâc²=r»=0ÛùÅØBë¾ül¡u_*[Õ5×¹êzò‘×\ø=TcÓ€¾‘Øß"Õ¸çÞÒ×%K3SãýÄ ²Ïow«EÍoÙ¦FƒõØj¨©s7ÂÙ*¨©c ¬ÉVA-jîÎʆ¿"ñÏ|ä/ÌfüÚ·}Ïõí¿ ún¿›>Ùl[>µó¶S®ŠüXÖUmcÛØ2±ñÌ3@ó×ØŠšžÏÆ~q¥—!žè‰LcC"׳Œ9–ˈd"ÏëC<ÃqNLbjPˆ.«a·šÆÆ~ƒfõÀ+bQ j8¤¦±AžI3©Fžd»15–=Ù³ò¡H¢î"äI–"ƒÐR’He;—Y Ò.6$kËRƒjýÍjò0.[Ã6· LSC8 ¦¯LèiW‘õ0«!l©é9ÂÂ'±¿¸Ù Å†jÐVCa5w»é^ÂX‘Ad~8=€Ìí¦—‰!gy,ñød¡q’©MYïo…æVMS‚ÚX²ÍoÛÆölçl[2×°}äTû¾9½÷ÇÝy#ázq÷yK6¶¯Îfl,ÂöÔª9ÊA=ÖC\4Ǿr…æ˜m¶§ñª²Í[õ8@qe@÷±©1Ž0j¯ä¯­®†×«a¶O awk²‘;èí&·®SS÷.©u“Úœ;£o\VC€±;`^öI¹EÐVû5…Ñ”®\›i?\yAÊA[ Û^‚dœê aÙP¤`ÛW©ÙlóÁ•=@Õ ‡]3–ØjÈ¡m5V[5N²HØKÄÞNñƒ«#`N˜`Í9À±}¾àü¬ÇæÚ¬_Ž `œn[—lñÛ¿ ¶ÛPÞf¶¡ŠgÃUL°U½ßë[û½öŒíXËê߃¸îý•µû}뛥]vÆ æú1§¥]ªÞòüj.Ü1 endstream endobj 311 0 obj << /Length 41 /Filter /FlateDecode >> stream xÚáÿ¯¯¯•••‘‘‘ÖÖÖdddVVVÿÿÿßßßëË¡ endstream endobj 314 0 obj << /Length 1917 /Filter /FlateDecode >> stream xÚ•XKsä6¾ûWôQ]åVøÒ+9ÅŽcÏn*ÎÆ._2IG¢mͪ›I¸|Èo_€Õj[®ÉVH À°åJÀO®*±*´JU&WõöD0õ¿'’gØÌ$ÎnO¾ù¦R¤•¨äêö~®â¶Yý–œÛ§õï·ÿZÉ2•¥Z©4++â|J+UR­63V;î;¿Þh­ýízcL–|Ø­U™Œ®·…k$Õ¯3! ’ªR¢JLúN.n'ƒ3¥¾âJ¼uɼr)/M*µ!ëÎÎü3nôÚõ¬HsPd.†Á‘ŸÀº2ñãÁX¤S&ÃðŠÄÕíG!Mm‘e’¸ÐÒP£¤m×2yf; >(­[Û Mdt˜¦P /nÜàvÀNÙÒ#6ÁÔi!|·.À’u&“zþ¡wU¼+޽ª ž•GžUEyX•eÉg7ú(wç·,s¬)úá‡t½Éu$‡EÑý–ÈcK›û\°R§2†cãHhf®¯/¢Ù8ê=‹õî©G B챬hžm òy2àe¹‡­;æ6Ìî]TâØX8©Y@³-cß6ífÉ|P\·~g»ï@2IØî,ž Lç§’©¤i‡±YÁ-¸6Z&úýœ©à{ìá hâC-¦ï¨c~•§HÊá(ÐðHµÐlý,á_Åèç@ ÿ‰FºŽc¼{Øoƒm Hœ7@€Sƒ/¡÷‹¹ód{ˆâþSÏ{ ,à:ÇJççŒy ûJu(™†¥kXj ¿ì-ìIóãôöŽE`ë¥Ä“¢”ËbûÎ÷KɆxTQ¬÷€‡hÚ’JS¥RÈ(ú#¦±­1Ýb«,-£0\˜Éuò}Œ4ü£ÈÄÒ6™Jój²è¢yxG}™ê|Ú”IÞägßomû•Mr™J5ù–t‹Û˜ªla·wFš´Tåq.½ãZ¦"Ÿt3õÛv 9kLfÈÖ• Ä8ýcŠmyƒ€ýÑÚÚówU Ø©Œ~飿kQX}H?Ú³IÎoYQGv\…óŽdÃnͲ¶»7©bHgHÏ)Wîí ñjÏÌ/ûX¥ á#ð¹h‘“<ÙvG)­Éf,}Cí»GÓ.¦28›ÆòýåD)ªÕ l…ú«µ€(ϰ@óa ÝÂþä?Kí‡&­ŒYi!ÒLæœíþgËtšsGñ žÓ‚}Köû>¹L«D\ Ëâà*Ìý½ë]ÍŒÆcØë2G¼ú¼ŸaqÉ•¡\„b]ûbùî‡olUr…ù³t]F?é¿AúÁÙªDd@ÑD†íöŽ2%ă¤ƒšÇC¨ÐLüŠâ®áõ@¸DBï\T)òä IÝ‘ˆÿR@ Ħ$DÈî<}·±‡ûs u†O`U´ Ü»I„à@Ç£ ÁÒ‰Á­³äš¨ÇM?-Ùúaìm”_¨¡œ{p÷ãÞv§TÇ(ž•ˆEJS"—ɽïwÄÁ%ø ì·®ok»çdI%ÝúnתˆÑ@¼8ˆ"–?®nàôîx1 ¿¢ÂË3Þ‹ 8Ñö9.jÜ’O£{ý”IK¸Áemºõ"-¤‰8‹QÅZ°Ž>(0 %&M¯nîNiöN%®h˜ÎæT°û­ëYw8Å)µ8,w‰ì<` û²ï^1ó¼x?xQS!•»ÐgÁg(ï‘|°(A+Œ‹)¦U‘Pæ°lÖ €ïÂÚï—_#ÈjXòSow5Ó¶pÀ°Cëw<‡sÓ"±tÇØÙ`†)èûw/<}Úc#‚3&`zJ e û;KqY|ZdSªÄwëRc&2çà$|°âO} ‡’;' (x›É&è“ÇKÔL„-¶µ‡.ð¹Ýú…PÕ$ø 〠0f»)Bý5Eõö²Ø{™´0ÓR-ÇT[ê ØhÿÏ­2èò*@Þ,¶J TLÍŽe‡jLX|ðwttôñU3#W¡êD îˆe;@XŒ­`ô@ £4-è(Ž}©w5jVt "Ò5£ÃËÀqB ¤chàÈ¥|S@7¡«QÝZQprH•¼8Ä”†Ï{hH{¢0ÑÎ,„@£D¯Šh>û,¾ê,?Bæö”Ê~¨„ØÝ„Ê…æÍAÓ>´ã ð2ŽŸû»ø”™ |¶|ÞüŸñó>xCƒ‡µk!µN•š‚ðúß‹1Ól’¡;Vì®]n | 4òMà4”Kœ¼Û#slvé?<h® bÛ!Eeº¹`½Rघ^瀢áQÓ-&l–fªxë`’{åwŸœZã+¯8*$1ú–Kßq›úþU`;¢Â:E tóTýâKGÃt‚˜›«ïøðóåâß.ð^«ò¥×ífiÛ-%šÖ’#¡=Hà襞Ö{¶1;&4¼Íà©«é#ØLÝ òƒ@$—ŽR#Þªã,D5p8­û‹cÛá[/dÌ¡Ðysñ8ü¡Å/~´ó³uzöðâö®;h endstream endobj 319 0 obj << /Length 2866 /Filter /FlateDecode >> stream xÚ­ZKÜÆ¾ëW,râ†ýàK9ɲ80l’“C­!WKe†\³9² ƒ{êÕds†«]€%Y]]]]]ýÕc¤n2ø§nêì¦4:Õ¹º9œžeBýï3%o{`ØGß¼yö×ïáUeiÕêæÍm,âMsóïä•»ßýçÍ?nT•ªJßè4¯jy›iÃC©Vúf uÓù8ìöƘļØí­Í“ú®’©ÝÛÌd;$þØåY–8àÔµÎêÄV(ïÙwof…s­Ùr\oI_l©¨lªŒ•- ½Ÿ\?áb—ÛÏË´ÁÄ÷fW™•+“ÆÁnŠ*¹u‡–ßÜ_Q&ÃûÝ>/’íD®Ù,¶ÔI`l}Ûß9–P&‡áÄôóId†1 ‘^l'ûíÜòX¿ØŠ…Þƒ^UÒö0€|< 8_eR•óð€ëàŽÝ—m»W–ö†OÜÛs< ›ôíi=vxÇSNp~—<“;¡Êïw`'Ù¼I^¤²1úΓf§ÐB8t<IÁI`ôµPD³Ø¶ñæÄ5ûØšVè>á£u¤%á•M6È%¾ ç­q’²æ8u ña·µÉuâæø¥énÏ^ˆÈv÷nDAïXJèƒhM{ÌÅtabÿÙØ3,Ð8²V)ÖÊØZÙÚ‘¤dƒ• ¯Ñ†+0ìÏEÌð|Tâ½óW3= 0#ö%ÅêùÇõ»vÕëÓ³ºK¢o,Êâ×õéóÚ\ÎÈ¡9Â'mAÍøn’ÌŽ¥Û‰пǓÁw!Â’MËâ|{–Ùcwj»qÓ7·ôKpVà´'ÄÙ«:5YÅs¿?ºG±é«\–aw%CRVŽ`í’!‚$œG„t‚$|á=—‚?<%¢Èì##ä cl„1×G=¶GÇ *"æ5£k^2…R} <8Ô†I^fEÈ‚ß00¬äªN^ò­Qkˆ¦5ð‰€… ý‡A亭ƒó+“œP!«,yjÉ^ÏNƒƒxÏà“™ ½ÆÓ2ÞG6…/yˆ=¬±ra Ñ ‡4àJŸÀ3y?BFkmh6jý£~Y2óëÓ0LwOôLSÓ˜’=(kÏ̪µgšµg?{¦)gÚ±ó.lNfu!·Œ8:rä~ï|ëØ|?xÎMr&Y=ŒëèÃR(£°Éjþ«Ë½/KŽ`È2È#Fw’¼à%]ĪkäcÀ[N„eyD³Ÿˆ9Ï·ÎÖÔ)„×p`Ù<Ñ´Ôeà€ƒçeçÓ_‹+Ò¢(¿*®Në² ZÔÔLU''4»BÏ¥Ïö¶í(™Î"V¹U2LWÈ~ ûõ~lÝâ÷šj[¥V©§ï<‚â• ¸•­•3sлٛR¥¦\!:Œ) .LÀîà0HˆÜ?gÏÄÚ:~h€\åuá´ªxá‚cý-'e*A# .¢Jsñ -ý¶—áÍ»æànM„ØYÈ ˜&"h"Py”óPÿÔXùêÏ€’.³öÁe`åeÞdõjÃĸ€~(á åEH K̹|¶ŸÝ#Ѽ„ÏC÷6S¡äm–gþ(L¶ Ðè ²î7¢åw‰•æ§ϧ®ßHî)‡ƒ°0v2q#8 ˆ¼HiÚÆ5œæ-‹œ€k玫Ďk#àºH<5DäM|jZÜ{ß‘á‹`È|Îò¥¤ðõH^Z>ƒ"‹EøvŒ’Rÿ@x@Þ‹`‚$'ÚAä‡Å>È×ÃÁÿo|KŠÀ¶Ãy1w±Í@5ž¥‚3´©"*•V,†'yeð³bgÜâ(¼}ç§Ž m` V –`áÚˇÂWQ’´%ÏšÔÔöOBâÕ WJ§²®/ù?_Ý>!%þ•Œ =ˆ–kç£ÀB޽…ê™Ju=oøah± 7/Üò²—†(U*Íó­³ZBk|]Œ7Ì$ß¶Þ;ÞAp®Ò0‚¯Ög0ƒ¸‹­™Øg#äFdZ]}• #‰jyb¬—D=³RèB îÉ5­DäÇ5]4*ª 0ÔAì£I¥têU~ŽHdŸsøpLˆ3åUÔ‘/`o¹‰¥Kòß'6¸,LùÈ¢‘摈¯ âëB³?×’HÿŒ¦ÓÉ{ßS\*Ø•§é43óù~‡öÐõ@”¢?Ñâ~ËÊ:Uó< XñÞu}‹ÊfÜ¡@Úf‡0@m©¤ÀüU–Ù/ïïw9¦ ð$áßþÀ”­ kÓ²šÝÃ/ѯ;8ÖÌ‹fo9­ûÔµ¿óˆx¨¬8§Ê@d^\¦£ë?b©e°QHz¤Ü>ËÖÉ>Ž.É>Œb5…D/ƒ¸ïä „õt? ûRÔnÑŠ??Ѓ{]v¿– çÓƒy=j âªrö8|oºRŠ¡w{RÒ9GmJ¨ñc£iO_­Ìø9+չއðÝAÊ8C&3Ä ‚åžX“`Ÿ?, Ϩ\_tÓÊ‹ÆjžH o`ò0‘Û²EòìœÂ§©®&b>÷ö j3q³*¸Y‘_Ÿ2ÐÚOÝäÆ ê¼GNPÐaä×W‰¸çÑF¸ÎÀÔ ç‰´A–fa/ÀKþ~<œƒç¹„¾¦ÜŒ=)Wþßy/LË!½šâ^«‹0€Šlæ½kÆÈs­.’_±a¶Þ¯²Jëb¼²â«àUAEæ­N#('²¶¿¨Nî[Î G&B^÷ÿŽ[€H p¦oÌqy„k¨ÖKz_r7x‘1xrL5 {Y„ó9ôB+€j±nêábñ 1]B”¥æ85Ìù,¨¯e)ýFòçŽó?Å Ï;ˆŸ_†å~D2Ï'~.)¸ŒwKò[R£ó[M9¼å_ Ì—~»éXB©FN„±M´ž"\*ÄÇœgO¨;×s&*Y±¸Æ>œá¡kÿ*b8—16.ƒ9*›ÖÖ‚ÆEj”áŸeò4⡾ãdZÖ9¸àë³²’[ Wàëú[¨lQ¹õ)(Á¯Fxî©ÃÓØ9åØœÆ<8Aq~Õÿ1pbâÅÖ’ØIs­ÖùÇ]/mÎuÍWŠç•¯¿ &’¼Éû3»®á¹A÷¹=RcaåG0_´”zZŽF†_ ç°³ÈQ~O7÷vÝ ø)$c°µÉ”ý‡G÷ÇS`/×å¿AÓN!É%Ý;xR°¥ÈŒ_ŒÞ §aj§Îam¨rü«‚¹J?0Ã×R‚ëÑž‚0°Ò~ †Átð÷"xéÙº{r|üæë†¯¡fС¶„— ™qImxWÚR ãò0€¿‡lhy-޾c‚>cȘÙ_Ú¥1„?8…Ôšü‚vÇ!•õqñ_Üt¸cGø¶£˜ó$'_›÷`Nþ"wz éŽÀó›öKG‘§ÐËoBô%?jILɘŒQd‡'8ìüd¦8XoFÞq®g¦‘ >+W"Õ!´ì¸·Ä£ò?Žç­² GáB%Е_ìê<ñí–™µÎãš4˜¸Î¿bâLlæ)Ò¦|UQ”©2s¼ï7å¤Y1÷m©s9÷ãú ‹ë¥ÍW—œl½¥Ñi¥¿ª@w}‘‘lï¥~\¤Ë G— ’€3'"¨?íìƒ#„cvÇÀÄOöFô'¨î_o¤ÍRÙ˃„´ùáƒ{êTQ$‰`!rªuõ½òºu÷…Fç±÷m²¡N?K0áfÀ1¬'ŸL™ûz=ÃþÇ‘ÿÜ$î& endstream endobj 322 0 obj << /Type /XObject /Subtype /Image /Width 267 /Height 357 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 19238 /Filter /FlateDecode >> stream xÚí}xǹvnŠïÍ“[’{Ÿäþ·$qª;¶“߸`c܃Mµ1`zï HH€DUEBHõ†ºPA  ꨠ.Ôê zñÿJMÆ»g÷¬¤#霣yŸyôìÎù¾ùffç›÷›ÕîΗ‚yëF3•Ww?}öŒ'ÝJgJGyœhCº–Ûêx¾xÝžÔÑI¥wî>zôø)o:—î?|‚kgçQ4j£ERvA›sþè8ciUúùÉÓ§-½¹åM‰¹7CSJ¯y\ÌåIkSxZIBvåõŠæú[=Ÿümf³v¾>N$=§UÊAJ+»žBÑà»tïÞc x¯ jC¬ðøZ8T0E4·÷dÞ¨‰»Vx)×'6Ë54u)0!§®¥=YÝÜšRì™=Ìôî‡Sÿa0˜¿fûðòÄ&DÅu­Ý=®mî»’ï}1shcclSpâõ K¹9%µ·:ï<ê1ò=zbít]ŠA@÷ôIöÞ{[ZVä—í{1 =à3Ä”WVçÞƒ¶î»É׫} ¼ãó‡™f}±ðçx÷Ýw \]]sss êêê|}}g̘ñskwì¾Qž)>«òfæ½'©×«‚/åbò³t1Óçb&FxDJA~yCgýlò´øf«•s®˜AJ*»ÝÜlh KÊ÷ŒÎp JfòÍné¼ 2ºœWí‘íp!cøé÷?ùN?–,Yâáá‘””VÖÐй|ù²ÏôéÓŸþy"6o…¡Fìò$HqY•w<ªllóÏr¸:üÑ2†É)(9<¹ÏMÀ pËÙå;­Ó‹ô¾[LOŸU5´$äØ\§èÔ¢¬5Ím=]·ïµuõ–T·$f•Á U “ŸQÜuç^cûíध‚¯j$½Ýï ööö™™™999 qqqõõõ………ׯ_GæÕ«WSSSgÏžýË_þ’s–hÊ´FRSûígÏža-¦D,òj©VUžM.Ù·ºz1ã2Î\H¶ó¿Ì^úˆä„.·{ï«M¥5-u#ĤP½²¾-P4b•«Ã:UwI©iê@¸…X ^óõÎpb]/nÇ’e^Ê,Ålp6ü[)"¥(«¸¶¾µ«ûÎ=ÄK·ïÞ꺃J]K×›Í Y¥þ 9’rJëzï?¸QÝ 9•£‘ôù¼“&Mò÷÷/--½yófgggooosssyy9­ŠŠ ¸ q–ùóç#ÄZa°WPBmK÷ý‡;[£ÒŠhæÅòö–;‘1³B¾D]­˜Tjé¸óÍ7ß¶´²v R+¶y‹¼ØØ&DY?Á*õ|ÔU× )ì¥Oͯê¹sÿîýG=~ðð1˜žÞû˜-áP=w[;o·vÞii¿ÝØÖƒ”Y*9Å7›õG¬z[w/ægªÞp«;:톔úý‡Xë0ĪÃ:£ž•ZÔÖuLQXÙxÜ;a‡e2 ±@„â3Jì¯ó¹Ä&iðŽÚæÎö÷>xô¶àJ(™ð8PIdj‘[xº@©²¾õÑ“'àb¬ìlýR5’ÞšôñÂ… A}~þìÙ7ýhkkKOOwàïµk×òòòà#k×®ýío;séA ˜œ¡òìÉ›}ÛMý‘ãu£¾ý.)lî¼y&ÇÎÉT€¨Clæ²­C¨ÿQÿ´w?œúÝï~wÏQµVæÌ™#/6¶)³¤QVbv…sÐÏ‹§/¤ÐK‘Rˆµ¥ã6†%æd$ T W !Œ QŒLŒíºÖ®’šV¿Ø¬Ó!ÉìÈI/¸IÕ1±êݽ÷Û»ÿ®^\ÝâsMJÞô-ëýžBÕ«1zkZêEÕ{òô™{xêÓx0È^øéÓ–Ž„a`AŠJ-¼QÕÜÔÖÓyûaëþƒGÝwîÃVn6¶'çUøÆf9' të[;ÒÅeUxÄä9…fj$}6wÁÖ­[ÛÛÛ¿a€µؤ¤¤¤¸¸Þ‘••…¿GŽ™è¾Ý[VQ”˜ïØŸù{ÑyätuwG§äÛ§+õ÷ï=ø»Ϙ\ZIZíLéEuwî=Ì-«÷ŒH=å›ày•^ú —óo6v4·ßÆ„Œ>ì¿-ü>ŽîõŒÞ¦¶îÆ[Ýye ^‘igÃRÙ‘ƒèªcH÷ßRP¿ÿ9TýzyÃùð)uˆÁ:U‡›À:UGëõàÄ<Ìÿ¸ÊÅUMO‡gÞ|úìYfq XÀÒ#–M¶^ ˆC@Xõ-]`Û˜/àŒžôݘêºs³¡ n’–ó\äU›s±uxñÓgÏ‚’nöJÒTzó½–-[&pB"•••iii`ÄZð ‹W^yeú×›%4¶õ=×Âë•Í®öQÖnéµmwkCÍï5•I{§ÍYˆ],ªö8öÑ{>Z°¯¨¼¹½$Æ;4ødÈ52t¿øâ‹ïÿûßûÞ÷wq÷Ìhj¹ó¸»ìáO0D»îܯméªjh¯iVlå~Â;ž9>±YT±T >o^_Ÿ±=Öͨ#·õˆRÇ å󙳡•~5ãဃÌ;9¡QñøÖÅêe5-ð&x–é1¤ŒB@‘)…vW,ÜbØtØ=6)·¢¿&X‘¡b÷û¨êIïýGwîÕµtVÔÝB2‹k‚îw<î›Èªñ¿\xàÜeM¥¿J8pëÖ­‚‚DYX¼§¤¤˜ššÂA¦-Ú((¡¡­§/FúrUlzvMæÙ ‚¢ÆÞîµógçef1¹ÝÊ bžWV¬·Xoîfá‘P×ÚýøAã.KŸ]v‰:Ħ.X¿ïlÂs‰¹M]÷Ÿ>sÞ³ã­O7l·‹®»ÕóðNþ¾Ó&®‰DØpá—¿zùCƒ¡ÖÞWê[»ûÜÓÀ€ZY¿nïÜ•¨•Å†î³ ÎS+DL;SLF9†zZAõ±sQ{N÷¹ô÷‘ã›WV_ZÛZV{«¥óF&×{}ãó1<½Î1ÏûÅå˜ØÚžeGŽ}`UÇ<ûÞCÄ´ÿðÿðï|ç{ßû^•dªrùú!—)õ¢ªæiÓ?ƒ<"5í*V%´ÿÐhÀºXýjÁMr××ÄÆårz.¼ã¡I×Å‹kϸÌþȆM[^ûðg ¾öÚŸ^}íOq‰©åµ­é‡Ý¢ƒ¾µ„©méÄ:!"­t|Ì?M#iúìù]bAfUUUÞ>üþûï/\¿[P{«W¯9|¥¸¹­çáýætçå_ÎE\F¢š½Ç=ÝJ2ªÚjZ»:o÷‚.ûAz²ÏâÄÞ“ê«iɵ­=»îõÞéìº}çn¿ðÓ‡,O›Ù] ÂëÖ¬þlåŽAW©õ}ûöQ+ˆ:ºÿneí†Ý‹6[R+ÓT×i<]É»Ùs÷~jþM{Ÿ‹]Bƒ’Ø‘“SRWÖ7Â[êtöÜC0Ö{«€Gíí=÷nþm„·û\ÌÚï öùÖÀ;å…ª×6wmÙjø›ßü†þoëå—_ŽŒ»BÔq—R‡ƒ”ÝløjÁ¢~­?b“r<|óËû`]¬npWÃÚÉ;-»×$èuÍÄ)\¶ Äz§ª±½øfÓ'S?ýŽ>Ááåu­¨'fMV^–î1¬zmK.¹wüu“3ñšJoLüPŠAÏœ9³cÇŽ ,Z´ô¹âã¯Ö J¨»ÕM&g+ÏK v,˜õs÷ç”6“ü-‡\ò;<}ëåüÉÛ~ÿû×2³rÉ´Ÿ¨:-9»±ëÁ³gG^þͯ0€ï~ïûßž¿žµNŠ"VOY|ôçßS+sæÎýø« Tbì=Í&,©À I×+-Ï„n³õ¶:ËŽœÔüª‚ʦ‚ÊFP@kçÎ;÷»zû裹ã6fïëå˜Zù$®;è~È-Š9{éúâåk¾ûÝï Á;8êX5ì>á+¥ž]RëX_OŸñÕ ‹ŠÅx†uÀºX©ª¡ kí=Ö§Ósnc]ßÕë—må+H;íBS®W"ˆª¨o+*¯Ù¸Å€ý'õCVå5MˆK«[ŽyÅm;â}Ü;žU¯jlì–Z|2øª¥w²FÒ´Yó1økjj°0g½ãñãÇóçÏŸ4iÖækÖ¬} ’_®5”Pß?ö09ÛzØøÄ._±bâÛ“7>WÕÔEó‹š»={vÁåØF“ãNQ×›»î’i?•µt?yöÍAƒõ·šÏg6Þê}\w5ÔÁÝ÷GŒCpjLVÙé°ôCž‰Ô­É!E+îw­Xm@­a¶’šê:§¤ëÕX–^Ê.?æeæ|Â7‘^z£S°2-®nABTÙÒq§óö½®;÷:ûnóÞÃi߈ªjÆ8<éwÅðˆ7Æ;rö:GRõMF?WÿЋP?š¾ß)XJ=¿¢Ö±|^¾b%U¼˜p…XÁºX Ó>–÷–^`ð{Ck—ë…Ô'Ci¥…—GÔµ¢ª¦Òš¾h;íÓéÄ £.Æ7ÜêwT7µ_Ê*Ûbí9Ç óÓá¬zvqíý‡"¯–Z{'ïp¼¨‘4á0ŸLœ8ÑËË«»»›zÇÁƒ?êÇo¼Aéõœ¿¼ê–çâ¶XzH©ç•5Àú¬ÙsYúþ÷vÖoÜl‚u±:Raec[×]–N`ÖŽÛÕíNÁÉÇiõ!ïÝaW ª+ëÚJkZJjúª ‰‰»u%ÖéX.9&-5>ñÅVkS§PV="¥“FnYÓ±€4ûh¤×ßùmÄàõÕWwïÞ][[ûàÁ,7À&L˜:u*‚•_ÿú×Ä;€Is×JØîóÖä¾ÿD¬5wäÿßÇóH¾¡CÌË#ïMžøâ‹/ ´çúå!ùÉ`û¶wþúú~øOßÿÁÖíw†®¡}ô²íû?øhòKxáw/üñÏï~þúLC#Ç¿Û¢Õ 9´(X™2åßüä_©",UIíI¨aec;"„cî¶Ùœ[øœÙézégNÈ(-¯»…©õ³™³ŸáÏ= Øz4h¦Á SÇ ìÈY`r–ª/]¹NFÝütÔz 7)ux¬ï‰«kéøtú â#Pdžu±:Rni=–!;÷9HKÇmÁÙˆ«{#ÉÁ¤mX $¦¨¨»U««²¦¡µ£»ûNß¿{šÚz*êÚvÛ_X»÷Ôú}Ž‡Ý£YuÈ«Í=íXàÄæ™½dîž8ü4åó/ Qþò—¿„/,^¼‹Ž-[¶Ìš5ëÓO?}ë­·žþyüDùtÎ*#q!ÆŽF§‚÷ž‰äïvФùfn±˜^vÙ]Øiw™$ýí'טÝ¡;N³…˜º^¤òÆÆN1¤ÉÄÖçh•Öa3NY+DXª’Z’ì/\ké¼s³©Ãölˆ©ß®S–}±Íß.ý¢½ ™eµ˜?›:¾^²LeŒ{ ì.»°…»ºE±#gÙþóTÝ`ûNuK8Ã#^Rê b=0$¬ñVg[woMCó‚…‹ˆ:†4¬‹Õ‘rKëVYØCˆ+ÿÇ}×YùŠÓkßÏ·;[yÆARÛÜ §@‰à\ž\¸dŸçG+,Ún³hש]v!¬îzk?¬•îÞx)·j¿Çå Ç#†ŸþòÖìbí»ýÀ„L(qPLœµZ#vyb“‰k<––3ó ­=¶Z{®²8glJ/ý»kŽG¥aâŶª¡µ¢¶¥ºáVMã­Ú¦6DJÍmÝõÍíuÍ{?“VZdGÎG›ì¨zE]kUÝßÕÁ-m]TÝðxð')u8¬C˸ssÇL×í]wˆ:'X«#¥çWaA±ý VŒ9…¤ììŸýÉÜ%ÒÀÖ÷k“ÓF'ƒœOÀšvA|Xwó¹¼ÔÄñ‹M–m?lhå¶ÕÚ{¿k”@Ý7>»­û¼)<­äðù¤Ý§ã†™¶¼°Å6@yÚn>|£< RHòÊÆЇµKàSû mÇ÷Ÿ‰¦×}º¡SÌÕbÌÿ]˜Šë[»šÛ{ZÚûÁBàUsOïýÎÛwÛ»{7 ølëI3ç0vØ B£ê5ÍMýMu,ð·Sus×èµÏJ©ƒ#`ª7µ÷À:U¿ÕuÖÅêHiùUeµ­ûOz€AÀ ™7j¬ÎÅ.?à)N+xnµõ_{àÌÌ–/|ºåµù{_þrÿ¿4ÿË—Æ¿š¼|Ú¢­óÖ™,ß}k´¥æî+Dê+-ÎÇ^-¾}÷><×14ÃØ9vÍ‘Pžt:¹Ff7uÜÆêÃ!(eµ™ãÚ®[l|–í?·Ââï×ýà '_]xøß&ïP>ø{úËW¦ï,Þ»õˆ/;l>ßî¤PýgnY¸óÄÕ'÷Y«#%d– d2<`ÁÒþrÈýâ’}çT&,C6Ûø®=pö³ ‡¿Üt`ÖêÝŸ-ß>sÅÎ÷¾Ü´p›õ*3ç –^[lý—˜{¨T7¶ïóÇöž^pÜÙèÜݧcWYó¤‹ÉÈ1&àrQ[÷Ý'ÏžE¦¯1sXajåùæ#~Kö}ëê/6÷XcáþåæCÓ—ncú2™4{Éôµ0ÀÃF¡ú;³×-7uRkÖµÖUª_L¿‘QTmÐï XË_-¼yÂ÷ÒÖ£)w;\Xøüv[/Ck÷­‡Ý ,Ï®4s6:îklŒ+ϨT78xä||Tjaïý½÷æU4‰Ê6qÝáÅ“®¤ý‰GüR¯W4u÷ÞüôiTzñö#ž›-Nc<`ìq _}äo?r~ëá3Ë÷œ’IVîk-ÎîéBCPÇðÞyÂ_J}¹‰½Zë*Õö ¬Ú{ì,B¬üò†øŒ’}.‘ MÝdÒ¢½ª2ûóUþômݳ_ïu NÌEÔ÷èñ“‡Ÿ`™­¸>1·*ðrÑ™Èlž´3…¤ÜHÈ©Ì*Å·÷Þƒ¾×íJjZ-=..Ýu|Ú*ó•æ§×:·ÁÊ{£¯Ê±ñ·c“3rIbt)V?³HNýŒZë*ÕC.ç%d–n6? )¬h¼œ]f{>v“µÏH&ï½N¡Ç½ã/e–Ô4auÕ×ß÷>¾û ï!ž´3áêà=xÜ÷QƒºÖÎÐä½'=7ïwÜlá²|¯#â‡]'1Wo¶ñáÁ3Ú),)ÿrN¹‰­$óF5N1z¿Ú}zDÓ‚=§×[žßpØsÃ!•ûÏ:^q OH)¼xµä•ü˜«7‚/_çI«R`b®ó…´Ãçâ6Z¸ÌXc¶ØÈvÉ®ãˆjVï?ó…‘úÞ¸ ¸¬#=rF?ù\Ì„SlÜ{ ’^p3èR®‘íùÏ7Ytš¹ÉjÙ»e»OÍXp©ñ‰%;.1:²x»õÔå»ZNYfÌ“V¥…†–$-08üɲ݋¶Û,6:¶ÄøÄ²=§>ßh9³ÿ‚~®É#<N±~ïq8HvImtZ‘…sP@x\|bÒH§„þwéJÿ镾téJlBbü¥ËøË“V%\”þD®Ñåþëõ·‹8põ0°÷ñ»x NalãŠ+½ Š0HpDÜeŽñ Ÿ­Žá)} bú-‰ˆ½|õêÕ†††6Žq‰¸¸¸³gÏî=æ.à MMM]B~~~’Ö£¹¹™ÔöÂ… ÇßrÀeî #‡ëׯkLUYY)ã ‚«¥¥¥‡ƒCC¸qãUyy¹6ÇT7oÞ$µ½xñâ™3gxˆÅ1Ê ÑÎêÊà Â1¶ B§hm¡ Î œA†Ì ÜA8ÆÐA¾úê«a””ÄC,bQ¬X±ÂÂÂâÆ6oÞüÖ[o]»v‡XúL€2“žü¯Cƒ|™#atääóÏ??|ø0=Åð[¹rå¥K—8ƒè0^¹reh¿FFFƒ-÷ìÙ#_¦Z£ÚÆ §NbsjkkÁ#´[lllÞÍ$ý†¿‚|ò•wwwç 2¶Àø£ýH匙ü?øüdõÁΖÍÍÍíííš-S{DÐôásÏ=¯™:u*ºÚÖÖ–v{LL Í'—ôŠ>§òÿôOÿ$O¦|‘> ‚Ë1oÞèI¾+xˆ5:!–8N v'üþ÷¿÷÷÷/,,œ?þ+¯¼‚¨ ªª Ç$óÖ­[;wîde^ýu9 (GFF1bùäu=Äb› ø•ž ÚHOI_½=€?üáò]ÁC¬Q`ÌQ˜¬6lØÀNìÄedd¸H&Ä¢2'N$ÇR!‘÷ðð ò:b¡Ó Ю£€¿ˆ…+Éž²ÖÕÕñK{D~f›2e f¶Ÿüä'˜$ɬöÇ ùå—_"“S™çž{³™ýèª\°H'ò˜~I™D÷èÑ£ºÅ c Î #ŠŠ v*“9Åq~?ƒY‘Ð|ö˜ŠÑ)”-“=eË$ǘ3uà»sáÐZðÇÝ98Ô:ˆŸŸŸ£VâäÉ“<ÄâÛ+<<üìÙ³g´<Äâ+ttt`AÔ¢Ýèììä ÂÁ¡pÍ΄ƒCfÍÎéÊ„‡X<Äâàà ÂÁÁ„ƒƒ/Ò98xˆÅÁÁC,Î œA88ø";wbqpð‹ƒƒ3g­]¤/]ºôÿ1HIIüJsˆ$N鯛 ¨ pòäIåZJ„9¸ƒ *ÄZ±bŹsç2°}ûö>ú(33“þJ>SvâÄ ”OÈAss³ÆIæLMMieæÎû—¿ü…VF%öîÝKêañ‡Ä•%È›àÏ!–àCd7oÞüøãiNoݺÕÅ|ÐlD?\&ø”+¬/Y²Dá&5*?$®Ð¨ö|ŠC Dð)ËââbЄ——]ñ÷ÕW_8q"|祗^Â~L¼ì)èæãdT法Q¹‡”: ‘úà”Õ•2ÄæÓ’¨¤J]"ýÀê*·ÅJoD0““_1“/^¼ØÏÏïÆÀpÐÐÐ õÎeË–±›.\¸, ÿÃþòÓŸþT¼Š°)ŠPQ766fÕkjjH} Cu¥ íÚµ‹Íÿ×ýWä£i¤d¢)](ŽÃÂÂX]©Z ꀮSÙXX¤+q.U_,—rÁ ¯ªª‚7‘|2’I&†“J»ÿöoÿößÀ€$ºTœ²êb»R†Ð6Ÿx„ !l¾Œ.Æ<5ÊÖŠ-“Ê/æQœÞ„X=ª¶2a¿:®ò3ãôƒÄÌÌì“deeQD24Ÿ~]`×ÄÄäÚh¤'£.ÞÏKJRjûACØÊKéŠ{C\¦ÚÆrèMˆ¥r‘.óåsÌ™Eý QÆ-ðõõ-b@&X™ sò¦M›Hp"¥®’ATJ ¾£®²æË—/GhDÕéÌ/õ v©¾’Ærè(ƒ` !lƒ°›Ð»¯J6¶Y¤ËÌÕbQ))`¬Œ» vñpww§w°¥6ÿ’ªºN\&‡>1™BÅû"©dŸýìg©©©8Æ*•j¡Bb2¢òùŸÿùr,à »P'%³ê*D¥!Åæÿó?ÿ³Ê} XÚ(akE売±º²HÇ¥üß`]\XXØÚÚ*pñ"½²²ѵ°° Ñò±Ö×× ä1|||¨¡v‰úücºØA¤ UWW³ù;wî$ù_´h21†Y]Ôœ#_j£4©Z±åÀU6VÛã¢_@4ü áq:ÁÿÇñ+É)++#4‡ÕÅb͇°ÊY[*ÿÅæP»RêÔ.«+eˆÍg ‘|ZU¤ùl5”ÔJIcµ3Ñ`™:à+rh6AüРû¸víZBB‚`´óÇÝ9†Ï Z»ŸÚ @ö†ŒvÎ Ãgº“Nƒl}¥„A¸ƒppá!±xˆÅ1š ²råÊÔÔTòw|2HVVVÇøF]]ƒ n–ŽüqŽqŒ¨¨¨ÆÆF™5Hyy¹öÿsäé±±±ÇDQÇ¡­ËÇŽãAì «V­ÒÑ'd4b]¹rEoeúв²²«Ê3Xav<ˆé˜<ÙøjÿþýÙÙÙã'Ä" ¢·õôEEE¸jµµµ­ê€E@@€ɰ°°S§NAX9ƒìÙ³çùçŸÿÑ~¤+¯}qW ¢äæ<¦Gð‚BI\w«eüü| ÅÅÅÉÉɳgÏÖ•gø5¸Hç ¢Í(,,TxsÓ#HA¡$®»Y½zuZZ=Õ¡Ï¿hp‘ÎDûC¬±rð&aývbñkÈ!–……»*ס×$ù"3gÎ œAø"Cí"SŸ›:ØÛÛƒJ*dÒÒR½gbézˆåïïêÔ)%ŽØÙÙ)”Tè kÖ¬Ñû»XjC¬k×®]çÐVdee%%%%Œ’““Õ†XyyyR§ã!ÄŠŠŠºÌ1Ž!Ï k×®ed¼=‹ÕØ&Žq )9xð Â0ccc]yþŠ¿0Å1¢0HII ù«Ç „ch¢Óàï¤sðwÒyˆÅÁD{ÄÉÉ)''g°®zèÐ!•ZRùC œým()Ÿji¶2zÌ úqÛ?33Sã "µ}†;W£¬ ºôW†Jš››SIA%UÆ]%![+6ðSY[-dµ3ª±··ß·oß¼yó^{í5“9– gggãxêÔ©T@¼þeO P8„•ßæ… ŒFÖ©ƒ˜AXÉ7ÞxƒJJUù¤2 V÷È‘#ä˜ÜCVÉ RµBÙ|,ð)+qhƒ-bžFvŒ°Ç?ä˜dâ”nçªR˜ÝïU¥i!VRªª´’TE`BPII©JRyÚ쮾t'\Z %µ䳺c‹øøxwýBuuµ¦þ“ÎÁAÆÞÀÛÛÔ¬Á‡9x‚‘a¹î#---))‰?îΡqá»ó©’ƒ¿0Å„ƒ3'ƒ;±8Æ$IJ¶¶ÎÍÍ%yˆÅÁ!`‚‚‚+Vøûûëâ˜á Â1 ‹ôŒŒ ý/?gŽQXƒlÞ¼ÃlÜ.ÒSRRÎqŒo°cˆ„l≃¼2•.W¢...úb‘¯»sŒ[DGG³_k‡X666X¡Ûô#j¦¦¦AAAlèâêêêããCöïß?æëz n “““S5F…E Ð?U²ÀøILL”ÿº;a©çù)ï¸I½ò¦£ 2†ÿ9%n®˜—È~ …kkkù¢[âÍÝÄ räÈ‘¼¼<©çù) S__OOµá0ýØÄ“¸9Ú¢ö+ýÁÁÁñññ¸vj%ÃÃÃíììø¶Yj!ÞTÌ ¸@J„`Ë–-¯öcß¾}c~/H?¶`#­(//Wrƒ¢| Wî qŒyÌà W3©D‹‡XšâA%9ŠŸ^Öû'îÆ<ĺvíb'µ!–<Äâ 2~>¢–A,,, FO‡ö‘gÎ œAtŽA à ¶¶¶Xž‹)ƒ3gq [·n5À @%€¯¯/¹dô“/(jÕªUT‹ôÆÆF¾Hç¢÷Bö}¦ÂtðÓ_É1PrAyˆ¥œ¢ÔÁËË !š¬D’‡Xš ±Ž=J‚¨ñù°¢60H@@€’T8;;ÛÛÛ+ü¢gá3ˆ¢)ÄNì\ÿVTË ™™™…c„¬¬,´"v››[È!‹ììlyIOOÇ ü· ž˜˜x™c¼B~ ¢»ÐÈ"½¡ããÜAø…C~£Pw¡Ù7 ÿÒv9vèÐ!•«3Ë¯Ú €jðU°ÎL°ÉÉɺ””0ȱcÇ–,Yrþüù ý077Ç)è©g0ûtˆäŸÕáÐZ‰ŠŠJKK»ª/>ƒ|þùçöööôß=999'N”ßé 2òÿ'…@YYŸuuuuz¶&eWX]CúpœxW:þÉ#gˆ—^›› Ä"T€Æ]È!ÂRä§×@KäKÉëâmyí‰!b¥¦¦"¬Zºt) «-Ïš5ËÓÓ3$$äÓO?ÇH‡XYYY±±±k×®ý¿~xyyá”<#Ç „^~ùeXü÷ÿwD\Ä"*CkB*#ŸÏ¡Y$&&zëjjj4²HOII êG]]ÍÌÌÌTy aÁ-„æÈ°",ÎèªÌçÐø«7 |šžÝcø!:fÂ2ÝGRRR\\ß‚CãÂwç±܇XœA8ƒppá Â1& ²cÇŽŒŒ òWDÆAÒÒÒ|8Æ7Øÿ~±nݺóçÏëâølÃGdd$ûŸqˆ•””¤£[iðÃq˜(J>92ÈÏÏ/åE¤¤¤¨Ý‚ÍÈÈ(33sÜ.Ò‡ðéQ囦EGG+ß4 Â|Ó´Q†’Ob„°×ÅÎÎó{ºúÛ`ÕÔm=â˜P©W²išɸ¸8þ±ÐQ†’Wïܹ“0ˆµµõÛo¿ýÿñ‚‡ë Ï~WSŸéd—Û!8ˆÂ¯¬+üûªÁ1|ªu²Ãrss1þá#*Ÿ>å!–Ƚ’]nÕî"˜NÈm=L˜˜67õ#**ŠK7 €TUæ#S KNYÓ¬"&36ª!°¢²ÚR¥Eäüõ¯:u*NÕÚUYªÀSl™òuVÒ9¤d•ù#tbP ‚¹×åý÷߇åëׯýõ×ÝÝÝáw˜ŸûÛß™={öüô§?Å0#ùaó­­­‘?cÆ šO§n©™üèÑ£T‘5bff†|Êq*'s˜F=‰ŒÊjŠA!£Ö®Ê8&Â(DI•tòÿ÷ÿ—–ƒ|OOO¾ÑEÖ`édûN¸ÉäÉ“Y7ƒà‘Q\Vº?ò ± É'ò(e’cµ KG;&L˜<êâj°ÕØUØ@¶!Ô+•ÔYaç·¥òl_qŒ‚ƒ(ü?H||ü¹sç°Hß¼y3!z™-Ø-Z´yø€NÝTþرc´äÿîw¿£å _<“KRÈ ‚¹š­[=y»‚†Ð² ¡FÖYªVRƒ:»Z²HGpŒè÷ƒ~`µ‹Si„ü„ ŠH€ä“0 —•äC†ÍÇ0@> ›?}út’ò!#¨™™™TDcfh"U ±ƒ°v6ôꦰÎjkÅv±5†!VRRR€~¡¶¶V#‹ô¸¸8÷~И† ô§ììl±¼@E*ÀfB†…*ÃV€I¶A…?©,­†¼ÝA5ä(©³ÚZ±#È«Doàïï?¢»Ü éã$IOO/Ò}`èÆÆÆŽèãî˜ÙÆvBãà»óÇÝ9´Aøãî|$ppáorð‹‡X#Ç {÷îÍÎÎ&Ç'ƒÅ>ÇxFcc£ƒÄÆÆZZZº¸¸è"§hðÓ£ã!!!ìÇBÅk²Ëí¸]¤IKK+#$$$„ rÈâÊ•+jw¹533ÓÅøªkì¾î><¨111)))Ê…ëêêø¢[J¾îŽrêïï¿m‚§[ \]]©ú_?B¬1ߘƒ¸yAAA­:ÅÇÇ———«•ŒŒŒtttäߊW %ûƒÁ_,Õý°uëVooo¶¨'N¸¹¹QCCÃ1ç}b%P¾¡›>Ý«sàTê…ñ«*Ou}‘>æ ^PrRá~Uúôß®…’ýAÌÍÍÁR¯¼Q`(²kymxŠOƒ‹tî ÜA¤ºùj„zÓ”~ ó{_<Äâ!Ö(„X8…© ±h<æÒƒB‹‡XœAƃÔÔÔ(d ±8ƒp ™AÜÜÜ”0H`` K|‘®Y7ŒŒ R‡Ó§OƒAPa%’œA4Å dSB)Ù·o_NNN—ôpø"}ø­V¸.f3GGG¾gîh:q¸É¶mÛ¦ ÀÕÕ5//¯‹yã>==ÝÀÀ€ `‘·Ò› =P:F€iôpä ??¿”C¹¹¹jC¬èèhrŠÁvzT€þJŽ©@FF†Þ<¬ˆ œïrËw¹•gqû,º¢ªªªšc£££CŠAΞ=ëììlcc3æ÷lù SÚƒ°»Üê1ƒpᚃè4ø;éütbqpÑ!qww‡c*ÉÄÅÅñùYWd oûkö?£Ï *¿&­vkKµîphƒèÙmÿÑ\¤ÛÛÛ»¸¸ææærÑKTTTTWW×èÚÛÛG-Ä"O Éì\ãááX ûAã.òl›8Ÿ¨@>NãàÐT 9!–………©©)¦—øøømÛ¶±$Âîóî»ï‚e<==§L™‚c"†ü—_~™äO˜0ù~~~¤Ìÿú¯ÿ277§ùnâà‰»#Á ìÎ2»ŒíÚµ«ªª Çp™>ø€æ/]º”äGDD Ÿ…c6ÌŸ‘æà 2ÁTúôiúL!Â]ÒûT²ùR¯Û äÏðßÿýß|;ŽÑgá;Fï{ï½÷9 f:ȇì ð”cffF¶r~ýõ×¹ƒpèbˆ…içÎö h˜Ô#½‘+›/µË-Š%!Vìž¶ZbùäWVVÊ0Hxxøäɓ׬YyGGGrÌoöŽ!òóó“ô  ƒ‘f²O«8?99™äSB%8õèÕ"Û˲ÒSV˜«´Å1š¬Þ [öÛõ]cý4/_DèGˆŽY4S÷ù611QɳXÜA8å üq÷"èØØX éAˆÅwçS%gþÂgÎ #Ç çÏŸ/..&õ˜A¸ƒp ÍABCC=jooOþŸ5C¬¬¬¬PŽñºº:™‹ìQ8nC,òéQŽq ˜úúz™EºŽÆW=ýº{RRRîHVBFè\Ž¡"!!Aí6ДAœœœæ€|¹Z€Ã‡S€€•ù*µŸAFú¶žò½žáJÊ÷z†0ßëy8P²?ˆ——1Îé#ÇŽ»té[TXX–*TàСC„w ÈæCqÔøH#‹ôÑt’’’*uˆˆˆ¨•ÄÔçííÍwÉiÁ” Bò.·Ro@èVˆ5Ò÷½U’Ô}x²ú¸ºc?VP²?ˆ¥¥%â"µ[°aØÓµ((((ç*pÝ2ˆ~?‹%ï !!! Ë«ã2ï@PtâÄ ]ô„XÉNÐãì‚ ÑÈ_þF!'¿“ÎÁßIç ÂÁ„¿“Î1B’——W¡ûÈÍÍÕxˆ•““¡‚ïrèSˆ8Þv¹UÎ J^Qfßb¦ˆŒŒ<Ô©[‚~~~‡ÔA +£2r7aTGïük$,)//¯Ô#ttthAÈ?ÖÓÒܸñ*Sl¬“à-fŠõë×9::JÝõ8`òäÉD˜Åk¯½&xP‡UÁ¯¬ÊÈÝxµç…Ž9‚…$§­Ñ¿ 1Linþü›o~®2•–ž—*AðÒ¥ ŽIÖÝ2ŽÃ„/ÒÙ%-‚‡ & åèÑ£âKS‹tA섇,´‰Qù 2ì­qäƒJ¢@ÚŠ_|‘(eˆÊã*|ýõ×䘇Xzb®¯7T™òò¢•0&d„X†††VVV¨&篾úн: BX†¨QT„"Š侫ÕÈG¼YÈÈHRù-¢ŠÔ‚:ÐáJ’Oäg̘Aó¥ò8€0e=íg jÅQË @||ü©~TVV†……‘öWñ3Õò3* ¨¨ÌMOOˆ±§´’lõX¶@¶Î4_Ð.•ùÈD5XzJ+Éçv`LòeeejŸ“<ß2„ÿ¤óÿ,sèâ"}8€ƒlÛ¶ÍÚÚZüsµˆŽŽ†"Âî Úb qqq'û1„÷ц£ËÁ1j!gþN:gÎ šZ¤ß¸qãǨ£¬¬¬½½]ûC,ðŽ¿¿Ç(5>>~”þ¡…XdWŽú|.‡Jøøø`ÔrÀ?d/{{{çàÝ+t‹ABBBPgðH*ÇHã 1Þ´„Aå |KŽ‘Ù¸G{dP!Veeå‰'–÷#,,lø¤FK+((ú‰B £R×ÝÝ]^KªpyyFU6S¾'Ñ¢!WI¦7ÔÚl£T¶n(,,Ä8ÄxÓÅ ²bÅŠµk×îÛ·­èéßçôèàû ]566–£PÔ´iÓT>ßN ¼óÎ;FFFD‹%?988Pë{öìaµP2ÕbAìÒ’Yå­,T>o)³«8}ŒmÈ¡Éô†Z»ƒm”¦ž&Õua;?yò$æ ê &&& ç©O‚È<ßüÊ+¯Ð—¶lÙRQQ!þIPšLRþ²ÕH€ô•¸‹¤v—ï…é µv‚ö®½"ãœAØ—gU¾mDö¥ÂßcÇŽ‘ù ”A‘^ݹs'ÍQø†”Ìd…þ”*JíÌ&@ Qš ÎÇÀRŒT¾”•"391J ¤¥‘Ñ|²?¦Bë2½Á2ˆÊrËËÛ…{Ñi_Ñ«/Õ]¤d•uÖ6 ÁÁ×_ N177Güƒ9xð 9Fó1˜ÁõkÖ¬Ayú}°‚H±â…«üÁ ÖAÿ%uF Ñv2wî\œ"ÃOt$ Ÿ4-¢ù*CJôŠ"5gû:J ÆZA‹Ø|t,k]\«Á:ÛŠÁÚE[h÷ª¼ú¤@Ò^Ö«¨Ç!–Ô Ý8˜9s&!\¡‹º|uMÀÝ(d%T€ «lmmMMM‘Ï-(ŠÕzùå—Ù`Lùûì´Î‚SØýãÿ(Žôbbbh¾ÚWò¥^B§¥±V Ëæ¿ûî»4¤Aˆk%°+Õ‡C¶+Óâ«Oä Ë¥o•òRŸÌu«W¯6g@ˆ•ñòò"ùh÷Z„¤HÛ …(ù" ¦AªÎΙ*ó€i}S u¶´´¤uúŒ‰’¾b¥Òº¸7h ˜K\ŽÂ϶ˆã^…ßi‘ }Ç ƒÐIR¥üé2«é   vÞ“’92¡(ù"ÊæÍ›0 “°Ê|qCÞ|óÍU ØÉSê3&jû £îW¿úĈi)‘jkWe+¤ìÊ\ôA} OêjrQÎ R;B?«%_òÐî¾*œëÞØ„Øœ9sÌL:•í“¡1aØÄÄD™Ê(YƒHµ‚3Ȉ.ÒGÔAp°k×.ê#ð—?üpDæÒÒÒˆ­'NÐ/öÐjÄÅÅÑ|A|…•¦J6344ÔÑÑQðÙ¶4™±•­•‚ƒ°vi+kW‰ƒ¨l ‡Xˆ[öîÝ»zâ TˆMÉúZ*Äš5kÖj´|ص±±¡¦‘S•Á îäKåal!ªÙ´i­òI%q@ó•„…*C”@ÅZ‘ uØZ¡HMÂÃÃ!–TR»l+†fWaˆÅbõ8ÄΟ?¿wtŠL:gâ˜Íg©ŠÊiŸ-YP¾@€ÍÇä<ا°µ’ÉQY ©|™¢ù´¯HÇŠ%h{Ê “c1UIõ¡à‰”Û¥ ´HÆ$ÇÃ"]SÎ?‹õzÿ­Q;;;p‚ƒ­ô•AŒOžlÐÒ@¾CeÐúhU­ô {öìÑiÁÂÊÞÞ~íÚµ¯¼ò õú 6Lœ8Qù,1cÆŒ—_~sæÌAQp= Ê´²²233[Û£Gâ”h!hóµªVœA´‡AÈ3ÛÔßqŒ‰«-8¾òYâÔ©Sl!‚S ûè£èÄR^^.eš¯%µâ ¢%‹t±ƒ 9vvv$¬ƒ@à“O>Á_d‚t3kÖ,zŒü„„„sçÎÑ)dBžú )œ€"cW &¥aÓŸP”Z!µ²±±¡Â*Kä³Âa;‡CB,q8„ÌuëÖ±§QQQˆŽ‰ ÄÒÒÒÈȈ#™;wndd¤ƒƒr~ýë_CþðáÃâ2!Ftßyçqô—$% (ä°vQ2ÄÐÉD¬°°b¤(VäuTÇDù(J;É7_ªd„”l>-Š!Cº‚CÏB,:¯² ‚Sp™íq>{ölvúUb‘É¿………`‚%e’ò—.] j‹Úœ’XˆT’Ugc$TƒÍOOOWÂkló[2Û9ãŠAè)+O”¡’A(0í¯_¿l±—^zIjWY ð »í2ù•ÌÛl¾òZÉ7_ð«ÚöJ5„3ˆÞ3=eåË ,LLL***èÄ«R^\ rÓ‰‚YDD›Oæv…·ä„ýUm{¥ÂDoé#ç Ë—/¬[©º TR¦jùÖ1$wbtˆa???S(ÆBìOÓ§OgóÅ!Cþ¡C‡Þ~ûm:É'ÇC±ØZ‰Kfƒ76—ž‡X<Ä’aeË–Y[[ËÜæ555upp bfiœ~üñÇä'„[ÈG7"^"ù‚j@ -"b%%%#ó<«Nò‰ºB!ŠâZÉ”Œö²ùð ZaÎ ãA¾øâ‹W_}Uå)Žó›ß¨<Þ°a9•Y¤1*)ÎgT˜8q¢XLJ¬ŒàT¬(®•TÉ‚|•Ã¡Ç 2L(Y¤spÑ•Eº»»û®]»h\1,]ºEa®à¡!¦ú²²2’ûà°AKóõõ=ÈÁqð FšN¿QØÃÁ1’ÐõwÒœœ6õ#**jø>KK+**R.€L)yåv‡V‚JEdÊ÷zoȆî¦oƒ¥Öî`5üŽå_wÇbaÉ’%;w‹Ã¯¸@Ψ¨¨Pèªè"|öìYõÑG‰_Ç&%[YYí쇋‹ 51ü×·‡\˜ìñA:œ}effFûA;÷øÐ'Îg0†1€€1¬ÐG~8£¸¸˜œÂ•Þ|óM"†cš?šBÚ+næH;«HûAã2üŽå!–’oóbªŽŽÆßÍ›7Êöññ¡ÇÈÿÓŸþ4þ|š£ðÛ¼(„,êQ-JÆ9Å1 ,.œþÊ*Ê|™Gå‡æÈ·ÑHÅh´4Ò@q5”XWò}]©r¤šÏÊC€½pâŽTŒÍ¤ò<ÄRÉ ì„ƒFav%§+úAÈóíéÓ§8@)Zˆ/^Œ"¯r‚…ÑÍÈÈ d ‘’¿þõ¯i …O>ù„T†^T†…¤¤bl­Ø¯k²æhiRÕ Ö?ûì3¼<ûˆ?òɶb°vÑ‹?J;–HÚËb9ƒÈ83‰±±1½g ™iÓ¦‘S¯^½%öëîdÜ¿?ï-[¶°3;…ª5„L"€ÒÈ“‚¨@XXØþð‡aîñÁš£¥IUƒ4Ô™•ØÛna`ccC›<4»l_±ò*;–Èâ "õéQ\lii«2&òǫ٨{ÇŽ.ý€‡öhâ+Ùl æææ.šÑFp¥K777kkkR™žáíñ’å­C3öl?P»*[1V_hç‹twVvšu:&Áõ2×qÈ"~*W©$äpa0wîÜáoa€ÞÃ`ž1c1M8ØKªÜAÆ6ÄBÌOé^jçÖ!o ƒÂ @ù½ZeH\”ÚçN:uƒ7ß|sø›à@`ÕªU‰‰‰2ŸçU¸ ŽÊVŒÕ&8<Ä’Ÿ@4µ?Æ! cbbbT®%Õ¢… „yóæ‰K Èquu¥) (ˆ!€€*ÌN°¬9%¡äÉú—•ƒ°viÅkW ƒ¨l g©Û¼ ,ØÊàÆJ&öÐÐP„ôT^%ƒxyyáZ1T…ÓÒÒÒÁ2¦hRÈï~÷;°€ XyñÅI+þüç?“/*gÖ-Mj&'Öß{ï=Ò@R < :’´Ä.ÛŠ¡ÙUÈ ¬!V‘3ˆJAζoƒ„¾È‡•¡Q½à˜ÊˬA¨ vi@ËQkˆ”L ‘Ô_\ù|Z Ò9â:ƒnØØSV˜ÓJRa•,n¾X@¹]ÚqÇJ‚$_¤+¹‹5| çÍcU²fŸ`Ñ€Ý0 hˆ5eÊb‰C¬… "¡ÁÅÅE!¶¡½cFyk½ß‡„Xd –[¹r¥8"ç!€†ýDC-m„ò÷÷͇‹Ðœ1–iÚh8€‘h¬®3HÜ]šAz88ÆÓÓ¼ÜA8¸ƒð‹CWPTT¤»!âÃŽ‘D~~¾Ž2ˆ››[bbâeŽ‘‡n1HDD„ŸŸ_@@@4ǨãMWé)))A£ŽÔÔT±–rpŒÚÚÚ´-Ä*((¸ÎÁ1.,Ï aaa...Ç98Æ1T2ÈQÏhïðDÿp‡³¾lrt÷ã‰'ýNNî~옷p LÈ,Ò="¯õN@:î{é˜O_²õê;=æ“ÈOúƒ’0Ôm<ãŽxÅ#Y{Æ…%å B,§ ä}®QÎDŸò¿ŒtÒ/ñàÙžx F0w‰´>gé»Û!Ô?>Gb¹†¦ZõýzÑ18ùtHŠSpòqßDžx'É1(ùÈùø“þ—q  ½r]À øu—݃cÜ¢¹_ÜçµÛ!Œ'žÆIBødlŠÁ³Ó‘¾qY± ¸bâ†då{Øã"œÈÜ%Š'žÆIAìs´:‹ ê°ûÅËyâEúqŸKHÎÁ)œpyoÉ9$å„oâI¿Ë$…'PñIØau†'žx¤¹ë÷"Äò ‹7µuá‰'žÄ©¨ìæÿVd9 endstream endobj 325 0 obj << /Length 2630 /Filter /FlateDecode >> stream xÚ­koܸñ{~Å¢Ÿ´€Wz]?¥­¤½\‰âÚôZ¢cõV«=Ië;ä€þöÎp†µ–×FS0©áp8œ÷pÅ&?±)“M®d,S±©ÚW Cz%x¶„]€ñÇ›W¿ÿ LE—I)67w!‰›zóÏèOæ¸ý×Í_7¢ˆE!72N‹’V>%RÑR,…Üì‚¥f<í»íN)©o¶;­Óèía+‹h´½ù”¨d‹ ê?Û4I"˜²”Ié齺¾™N¥|æFˆñÌ•D¢ãRëMVèX(M,¾ßîÒ"‰náì"êÆ‰`öëp¿†«‹Žs?lSÙÛŒ»8Kq¢'ÜCG§Ms°{œ‹¨¶3GÓ£H~Üê\FöP5†>%i²Æ†i\fÚÓ~}<:NðPÂÿ‡Š +|¥:ÎA;‰W]*è°Úwæ q6vNµ˜C-Œ"ªºýýV0PDãtD\¤ùf'T BräW¯¦sÕŽ:2û\ïâí®ÈÀ6†/ˆYu-A~>Y‚0ÆgëW<Z¾·}miÁ߃¹u¸<'š©èØwǾ±µ©-¯ÕNp "ºŠ¸p4l˜ðhZs¸?;Å3H–ô⯪“©¶wòÚÞ%§›sb¹|‰ë¬gAÐ €_0? 3=Bú˜fê”=†ÎìíçÆËË.Å-Œ¦á ýØù ÷‚vf;A:?„_¾ Sž<m`?…Ì46=ÑbR¾8€ÿU†h‚e Ómh :À³™j ᡦÜÂ`ye´=MPè+áå¬!Ñ{ËŒœŽŽz*¸ÀI¥«_à{2ü¨yl©ôjQÀ9èëÐ\pƒÅát;ŒPi7þ¹7õia$Á½­NýÐ=ÖErYúZ0_»F"³¿ÐŠ7SZç³ZkM30¼»cóðšü*Ø>4ÎÌýø´š‘ª‰™<-^±©kt­<ƒ±7û+²4(9Z»¿wA–+eÌ=/8·Ä=¦7thÓÓŠs$\zÒë©Ôw„ûÙk…(Ï ¸–eô‘ N¸]ë‹âmÙO7sTáóÅä"ê”q.'§ýÝj· …Çøû¶é÷ûz˜,c!ųĦ㮂ÂR_–”+g]?¶åOV·Ê ˆZýGQ$ä$*‹E¦½Ö{í<žBàGç„J] eë':*;ñÐé­·‡ºyh°xîÔÉù~$ ò'¾‰ðëFo¦ÒŸËFÓSw¥¢/’ç r~%QZ\Y ‹;š {ö\ì_º`ê……¹|þÒCFpÍ×c±àfHs3tncy—…|¹Á>’³<{6Ôsê|™Å¦øôPq)P ¿9”Ô8@²ZTó¸p^‚=Ô¸ÙåIèI-çͪ\3g ïyÆ¿Z B@äN•1ðL·h0â'TÑU3i)œ)fdŠ„d^™æWq‹X¼5. Ìð%¾xö‡Ž@5ÝíŽB_–‚#ŸE>î5iF'38¾¥¯e»¨­{Û‹j~Jp&ˆp&Ÿ Îù 1]a”N ¦ÄS¹2^‘ô²~^o­ó »ª5ƒ·^ÔZ'IðÒ=¶ÃD ƒa6¡RÂ'/‡?üa ¢ÃHÀ7gpÍÛ—µ2˜Üùéµe%¦EœdÙR‰KÙ¾4¦þÍ…{|.Ô¼ó¬·ARB@4‡Áµé«¹0j®X.'u@lôØ@M1™"ÎýÊ -ËÛÛàz·º* üáGO6sI 0ÕôtÌU.Ù>ê Ø Š»ä§™Ý{lö´Æùe*ázþ Õ© Ï5=ËŠ!‘±(^¿:ŒA¹£&;èN+ü³U*!c-ôÂ]׫൪JƹÎ^~­g½\=s)5§DP›œë£_qZÛôüõ¨kpPªRÊ_*=óaåm˜ <¶óï7l¯|šñ'7}±= ³ åbiÊÜSA¹áy—o™¾Pnx¬L;ÙløÏÜtØAr¢‚”•”a°Hcð4:_ÅY,ñ4÷&†­û÷[åD©}óï)„ påHVd ´ƒŸ,Ý““ÁyÍoWíDÆ}>ÙvÛåì|øzË­Ó8ËÒåAH;ø‘€_ÚÜC¼@kÀV üU €gœÑ«½À_âzÿvwç)Á°…Ê_ÚLWÅ_52hWÞ³W•2.•\>3z‘kÎ=Z„!léÖ@iH_®ø@¬Ž¾Ï^g’°ùÑô„e˜,XáçX„’q#!f†øåD¯ÿ¼ŸŸRªŽåü Ã×ÿ؇¦g¾Äþ§øÿ5˜=ã endstream endobj 330 0 obj << /Length 942 /Filter /FlateDecode >> stream xÚ•UYä4~ï_‘GG"^ŸIgyÚ…]´HÀ"úÉ“xf IœÉ1HûÀo§Êvw§Q–C‘bW¹®¯›g >žÕ,«¤ Bó¬é,q?ð´+@ ØH¼=^½‡-g´f5ÏN[§6û™|eÆü—Ó·?R~™ úXÇ“;&d<¢‚‹¬Ø¹eí|^H)‰|JiòaÈÅ‘,v2wL²YÍŸ¹fŒµ`5Ñ íÞ.k!ö=DYJê*+”„””©_}è¹Ì¾ö‡¯ØÑÖ¿€çLÑZ©LT5-Á@óÞ=®“Ihh•ðü•qƒí"ÝZ\ùÎTgÜLøQ[?~ YѪLI;åUE¦\sb†¹[ÜÙaIú7qꊖ`DR®£î»yǺ.É=$óHürÍ-r[ áôn0Hj2çØŽ{%3𯵦µg¸ÎvŠ›e°‚õPy ›4’;/‘^#ëÉÜ»Î-¦5! P…rê¬o¬ï1{/Îþ JycôÓ‚&§(ñk®*¢TëìdS;%ÞƒŸz3GÖDÞ "äÛä% Æ?‡h'Ú;¦YT€Ê\c ­ùë½2ƒ É)—*šx“‹’tã“)î;;´nx„^ÑG* ¹ÄÛŸ>KèÀ­ öqy*fH jýsGðmK(­#¸-ÐGI|\†Ssz„ÿã\¿ tìu4ÐC{Çi`BÚd·MnÆÉB¡þ–«­ˆ€ÒÏ«éܧó ¶w ºÞ!–Bãlß6}ëÌb¾AÎH¨¾„vnü0ûÞFâ%×%1óâÓaïcÛ˜k÷ »Mâ‹íS"­.üÆ÷ãºì‰bv¯_zÛ_æÁÃM@ó¢,kò=cGˆ$8j9»~ì0$Bv`½¶[R(/)„»ÒàCm³\°±Iô~Å^l-ªÍØ4ÙÅôçiŠ\ÛÇu²Ýþe­Ãˆã2»¸öv_Q”©páÿ‚ ñ µv‹»à^% e°çgõEMÆà'e2D L˜úÉ68ãHᇫŸ..çÀníójZs+µbÓ÷&øªïú¦3ý=bÚ›Sx~ªºñ 7»ÇÁÝ1®|_JAÌóêàÑL’G¸í2¹tzÖ8µ\q*+þ¿ÇV–ç± Þ:,î Ã}: m“îÀ‚WšJxöoÊ2¤§²†×7ÖÕ>‚Ê´}áRè‘¿å^`Ñó[ÿ 9B endstream endobj 333 0 obj << /Type /XObject /Subtype /Image /Width 301 /Height 172 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 7 334 0 R] /Length 1695 /Filter /FlateDecode >> stream xÚíÏ›:ÇgЪgû°ê5B«üïð®B{r]E箞¢þûÅ?±›`°õ”IQ! áëãñ`› J{é-;ö%ìýjowðÒY6ô] »Ú›-¼¼µ¦û¶€¯½=Ò²ßèJÈj¯öæe¤u¬Í$­KeÖvœÖ¡²àÐ ZŸ}Uö£“´ú·ÉÌõM­ é hu%j¢u&3@|jZ%â–y¦ã ¤cµÇO­A­ƒ\ÚöÐl"kph‰³"´Y°9-)«‰Ó2Ö`/ZÍ]Z Ѹ@-Æš4åi Yã ˜´†)ÌL,…èz`Ñ‚–«9Yø–¼!Zòút„ÇkEÀ>aß:ÈÒh)Y¢ÅeûL²r AKÈ ÑR±±hiY\ZfY‚Ü¥¥t)Z¦Ç›Ä²×D€%5‘å:*>´‚UæøðXÜjgQµŽ(/4mÔ®£¥²2Z›šKKUºÊò­VÅ‚ºhͳÓθI{ßívÐ<ÓÕXç´šKûy&3×·5óLcÓú6 ÕÝ'¼ôÝð§*ûÝõý(ëx¬KÖÏþ­g5qøC+²×Ÿ²&+“%ãÖ“–a!×*L+ êVš–ÿíSiZAYOZÿWZd\P­Üµï¢îìCË’Eâ²n|_EŠˆrïGhÑ4Y_üsØnHá®,õ98½ÅN €ËhÅ"c¡€­%Èbÿ<²hD²-ð-¢^”„‰Y²ÆƒÆЇx‹‡ü-CÅ%´ˆ^&\D |á/K–[<¤zUÊ"¬(ªHQZÓ’r¹.ä’زœâ1YHmY`¼’i QYÜå‰X„›y‹7¿ˆd:Ž¿J+Å·¨õñ~Y¼xÜåÁ/k¼¹ˆÒâþ@¸¼! CÅCéN~Zwk"°˜Çj¯IiåEŽ‚‹7wyœËºÛ&b´ùø~;1›¢¼¨UJ–¯x3ßâšŠÉ ’Y'-뎡gÊò<@È"ÅhdIÜâ9²Šå[Nñ„£Fšêgvú`¾uJ³óδÎiÝçi+¥•¦jZI•SV è­½eÝ‚²´0˜Ì䔕Կ”…ûË Ó¢%eÙ´Ææ‹ð¦ùí‹Hü ¦5ݤðÛ•ôcyß’™#¿}±sÆ‚¾`Êb !Y-‚-“å‰"$¿oÑÇd¡ýf§¥îɵË/—EsÈr| eÿÁ ¨ÓáÊdêD1Yy)W·‰ éKØ 5Áµ²Vf*‚è»u*7±0-!HÅvsȲh¥Œ‹†h‰JËî çÕd%­ ²Dg !9kâXÙ™Qk ©²¦X"ú gÜ2dqi4QÖxåt'‚(˜—X²â´’:CrÐb »(d,’™–θÖÑš™Ö(G-k."ÍM«Yëh¶°Õ´6‘õå£%Ü=UÖ?Ëí_»è¿Ùß¿|Qž¦‡n,ë&eýòÊò´‰$½M|HÖ—pkù߯8-ÝYCR^ÖŒ¥P­Åià>´ê‘åÜ'Úãð¾qŒ´ˆ=O| JZ´Y3ZÓ8¼?+ã[SW ›£ -s×›û¢eÊ"´JZ¸‰,Ù/ÿ[N‹lNíì*‘–‡O’µÅÌao”ŸÆáùÀü}Yç­dyÚDÜmÌ'½+:͠ИOlšAÑ1ŸêhÕ!k]¾µÓ(ÆÒ|k/Z´Yëò­Ý|Ëηª¡e'6PKM´ÓÀ:iUä[v¾U -;ߊȊ¦(ä5þ(oä[ñ(9ÃGx‡`¦v µ‰ ›ûsä^?‚;¼ž¿9eÈ·6“µ.ßÚÖ²Äf?ZuÈzÒzÒÒé5z:ž YSjYDUz²-›AY€YjÜÑê´ÊI ½Ïœ²Ð/‹„de¡EÔ}’š¸ç•%Ÿ40eñ‰â(9QÇ Õ\VÒ©¬š½§‡„'YD ÿ£nÚ´¬é(1kÁ õm2Ð"jj†nëY2“sdGñù’–zfSYhâ$i©gö7•ŇÞB´¨šW‡FMœžÙ_Y¡¥5›ÉÊ·Lçudñsû\hÀå3Fù)@xeÍ€VÄDgñÌ ž´j¥µøñ£]h둵î²=h-èRѲb3±‚;œCÏøÌh=`·˜¬àá'Ãèó{lVô>i=imCëT“iZ·ºd)Z•}圤õÖWf‚VW]f¿]PÅÌ~»`èËÈêÜß.p¾)²/òsWç«0áÅù¦È~(a×w{*µ¿æré4 endstream endobj 334 0 obj << /Length 35 /Filter /FlateDecode >> stream xÚçÿ¯¯¯•••ÖÖÖdddVVVßßß ñ endstream endobj 337 0 obj << /Length 1877 /Filter /FlateDecode >> stream xÚ­XKä6¾Ï¯¨£ ˜rô°üÈ-»É &˜MÒÈ%³Ô¶º[X—]cÙÁìö·/)ÒÕv•k§hÛEñù‘*¹ð'w•ØZ¥ÊÈ]}|#˜úï7’ßÀpXpüíîÍWÿ€W)ÒJTrw÷°q×ì~OþnOûÝý¸“e*KµS©)+Zù ”¦¥TIµ;,–ü8µýþ µNô×ûC–™ä‡n¯Êdtƒý ´Ø#©þïÞ‘XàT•Ub$Ê{óÝÝYa£Ô,BŽk“²¥I2+Ò|——Y*uF þZ{#ÿu ©)“oû½QI?Ð×ݾ(’Èd»ÐN5qÖÿA /}fPþAêTï@H[éqŒ®Š¶~œ|ÇÔ0ÀðN™òž®ûþ9íÙO‘øÉ‡Ñ]É`ÊÉ,mô¼FŸ‹Á¬(‡wØ<`ücŸ ô(¸¿ À×ц„Y©ž¨ ž \Áršˆ4WùK󤱴ûƒ0¢ÞdÒOíïãù,ë’8é<ÐÍ:D©YÊ´ÔåÚ.×Ì¿Š §Ì’œ‰¥iðut¾'ö(žÓÑÒ XºÔäÖ;—Å>»%…|ÏUò]`ˆUf<ôC”\Vä—èqØ!‹ÄŽ“mÏ툓Ggã§ûÄ2ø™Ñ¶oaM—³æ\˜ÚÑ6ýê,=s5ü¬&ßF^ÌzBGÏd+ÏBRt ¾ùÎw.„/•87Zµ•Y„½u#ç:2]qaé4$ßúáj/o ?g?*ú3Ðò5~Ì@Íå¼$ȃ m¶©Œ6K›bR¨Ò€Çô:)¸¥sJ˜¡»Úî©'ZÌÜÚ„'ÙÍ¡¬§€!SèïG –)¹£*Ç篰ì3Z%¿íKÚöç³X.ÏÙªÊS—«:m»~žû¡suÎ ßàH5÷ÝÍ —UjŠüÕHrx0‡¶ ÕxRÇ'H’KeªAòuó:ÞC§7@.c@ùE\Mš€9[(¯›rÆ”Á.O Œ=­­€÷[¢S]Ë=âÞûå¨Tr—”W•¡ÜšªÛz½…0 𠨡áþWs§óe;æ2:¸ø‹l6[Œ)®l®ZŒ¡cŠ[-VÖU8‹¦'9×l´ ^(ŠW– 4ÐjoŠÖ2­€kYqØ‚à¨<γðxž˜KºMD*¼ô+¶ë“¥¹È^U~(ç~úlü°º)D-â½y­Ÿ_Û °}¼Ãëjè¯MZÊ‹AѼ,±R3„ùKšwÛuð^< õ{Yã7²oÕˆ»À€Å+' ´]ª ÷é8`A£ðÖƒa†P#¶TV"OMvVå'ÚØnöä [’™Yq(e/ r ÀGu+*ð?vû2-û_§€ø˜Ð `d×…Iþ¹× (ßÑx¾›>»Íóqt·Í¿»½§_Î>Ïm,F3þ€°mxY¦Fζ¼óOãæ™ªJ‹\-m&±—¦‰!º)º)âÅûóû[‚MKücOð|Ìžïƒo Ù ;5ÐKok ᡾Ï$áÊtza–7P ±ŸŠC–©‚€­os›ãßžŠøÛÿ~ú?úB¥ endstream endobj 345 0 obj << /Length 1960 /Filter /FlateDecode >> stream xÚ¥]“ܶíý~ÅNŸ´3^E")Qê[ê¸éušI3¹·ºžá­xwtõ±%'õC{ÒJk­ïbÏάH€ŸLw üÒ]™ì´±ÈÒݱ¹IúŸ›”GXpX¬øËÝÍw…ašÄeR¦»»‡%‰»j÷¯èµ9íÿ}÷÷]ZÄi!v"Ί’0o! ‹Tì ”ƺÛ¤”‘üóþ Tݶ{QDƒíÍÛD&{ÿ·Ï’$2°R”")£L ½›7w3ÙÛ}¸‘ /Òp¶’È€,âD•¸ð»Û&U»º›_β#­g„O—JíT®â<•$ÌÏ$È?‘ãZ[ã\E•%øm=6®¤Rg©â Pxªã¬,ÎÄ&B‰$Bs×úm’%HxV+žÓ<.$Jø‡{|\ûÈKWâÉ2.òbZ SмÎè&•–‘eŽÜƒí-_^u„:3.fÆÍÉô{¡£wD£=:C‹¯²¬Uœä3ËߟNû,…Ãá(á{$Ȇ™Š5ØÙJäbâ½óAï•$±*%¨_ÆiF«‘{”ІMÎöR“,e5LÔ™š WÚò¬ÉŸ¦Mìª4V2¿`H·èYÏ.hxÁɇqŸFaN_u÷ûC–Gïí0AZÞïGCK¶5ñ–™àÑàr™f×¼ýñow¿nÚ´ŽgÁ‘—x ¨î#þÙGSu=õ×ä Ãë!©æÀpõt%âBÉ ÂM燠,‡OÇò|MÝ𕱡ØÛÚ†»qárLŠ9dàÊ?‘mTîÀ֗ɸÐz}7o“T? €]T¨È/L¦Ö & ‚­´Ã;†uè@C?Më:&” ëúQïÀÐz2ðlö:›SíŽp[–Åf›Ù.@Yè" ɛߑ ³GÂÚ…àô9ÙØœ‰¼"Ó§+ŒiÐ8îݨ7MðL Í0‡„ø¼mÛz7ü÷9K|ã=óyøì†Å¡šjzþ„#sN€>v4í»šea /&*3¥Ñê,/‹‹öR™^w5xÈ‹äe¶!(!¡Å~¢±ûG×Ó걡o3Ù0ÙiðI„‡˜{Bàóû0òQõcù®ûÆ Œ ÎŽb˜Ž™Él™WuyÿáˆYS])ŸÓDzÏBÙKõú=¦áªúVK1• ‚;lÛ’äF8sÿºì·òaÑJ?ÖÜÊ&¿Îì~}ê~ƒmYAe—¿Êßê&™K½É¥––"51 ˆ 8ÉâðÕ03RG˜L%rð¹°XF"z ¯ón³âÔè’žV>°'‡@¬¹b¸ ŠlB¼á~ƒÒ†%Û£bBv€ƒ÷,Ž%%8„ß…:ˆ¢:WЊT¼!Ü–JÅ¢£Ý 0ÈôÑUL E ºö‘‡ÓèÕ¸„ÒÕãX[õ¼}+ä)¨ó’u ¹:²H RLŠDB˜ ;BP¥£ÚR¨îñÀð«÷‰ÈÀ|{ã˜`ÅÊ+E¡¢_FJ{Ï;bÚ‚¡†J§{à³g$_ÒBR¾¨ÏÌsÃ+dî &|‰CäPwª¹,ùÑvA9ý<’YÏÑ"ÊðlyâB¬j‘C{:wÚtÄX =­¨½p ŸY¹a‹®’±”€ì+î Ç~™ 9cÈ…do¥’ó¸(°Éè„–Ð4…+])+®Ì£Ì”Dpnèó¥¶W Ä ›‰S* å‰÷H’š¾2bøF´¨õà,ý´ô¢4"Ö›nôÁë×øA?ª[²`E~pcè-t®±¹~6„MPȱíÏA‚ËÏÓ‡®§xLøa½Ûµ [¨'[k‘[E ùŠ9³¬|áWˆ*¹H§ÃpÈ•@o5_;ìÙX &pÞGÈỗÚD.W ·ò¹l/Ûá=¬kÇÚôñ–įkGåEQÌ…qA}hQCÐÏÄ…ð”’”ëÀ ’/—Å܇´l"Y†IàìMÀ÷p0ê¡–éÉöaf˜¿ISƒé® EçÊêæ:.J±2Ò©RÈtæ¹t@>¡N¡Éן7œ‚ɰÞâZ#¸_?ý‘ʧk¿¹î‹å¢¢õëšpnn$§u@…dxý-J^Ø©‚x©¾î-*æàWæÐ2ëÖùg,«óôò‡+:°ID‘®sÊfg ºÅW¾?ɸÌËsÀß ŸCß-.‡6M^©X/‰…ç8»É³„<#_¢Yhçõü¶¶è™Q3ГAO?Mg"NŠì¥/ºáa„®ÍÕ½¨S;–T:N´ø¼1ž¢ýfõ ~’à@Ïæ§K0&Ñ€'õŽ'Tž†'ç§q…dH‡Œ·ÒKÖ|*?RŠ‚Û¨/ó§×Ù×Î;{ÛOOÖÿg¡äb endstream endobj 347 0 obj << /Type /XObject /Subtype /Image /Width 210 /Height 599 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 7 348 0 R] /Length 4218 /Filter /FlateDecode >> stream xÚíÁnä8†É ˜½R‡A_ƒ ‘Ø…>ï`ä4¹÷!è×ß²DJ”-ɲ,ÕlwËÁÌT*5þë³i‰¢( àFÇý%:ž.Žõ‰ãýòÜçXŸèíþó£>ž.}ŽÕ‰ž®DñϽ„V'º=Ýàøl‰¾Ž?ž-ÑÃxÓvDo—ÑÇ=]>‡C¿>s<ê Ñs'«û–9Ñ“'êó=}‹Ÿ#¾÷wW¡-Ñ»ýpýÄ ¢ë‰Ü«»Ç÷Ñ<ÂY"÷ ÊDðxX(CE¢‡;¹|ðpwý7¿zà—ýˆœÐrùàªî•ÑN$°'íÏU—Ï_¸uŽ DÄãÁ¹O_Ü}eßX̤Dtç.F†H„î"¢‘¹w5ìYŠ÷ˆ…2DréîÑrú•ð›%"€‘(Ý«{~Ë¶àˆØ(럣…i1m{fkÝîB‹Ñòui몈ζ޿&‘´£‰Di8Qx-DÏÊûrÂ{ûö”9Ñ"r÷õñíé=úõÑãë{æD÷Ï_ßþx¿_÷ôþvy~ÿ1ú¸Žþº¿<=Öù¸ÿ|z~|ÿaÆ/luOã…Üs4‰rGÆúeLnQúº Ê M¢ßˆnCDÆÀ9"‚Z!:EDh RÈ\? †–of¯ã1¢Ä7Í ‘ú9J„îò¡A0î«Òõ4€i!õÏQ"{Fàù²°ºœ!€6¢å<¸üð™Ö—3Adšˆ–‡Ä ]¿*m±º„Ð1"PDäsd¯,E“ÕáJBÀý9˜÷±çÈ‚r_9a çÛºåù# ´Bü•—ßg4‰þa¢—äÑŸè#/4G“hK4pH ú¯ˆÆ]¶Ñ`¡IôSò ±è塉U;~@c½KØ'B\›’ðçHû~ÖyŒ=Ë,ªó—„äs‘:G˜6BI"v1ÙÑD¡\YÝðêêÜñ™¬Ç£9}R(IDFFQ(/ÙI¥0¼rç´+°Ë„°†ÜM¶þ5¢8×; ¯ü9Å%B¦–ȸa‰Ó"TIdï'ž!ª¾GaȆ”RŸ B­. ©ãÊõ' ¯d¼Åƀǟ#Û2À2ø¶vfÍÛ È¯£7¼Bß2óæ'Š[†¢ì@¹fT˜x]Ûzó…:+TAPÛN«–tÓ¨Îög"zvÄDƒ…æøhM¢I4‰&Ñ$šD“hM¢I4‰&Ñ$šD“èw$úä'M}ò“¦>j')–ß|ôVOJñÍ2En+ñï%¡<Ñbor;""Ý#þ°i#2èf¢Äê:ež#6ÿÉüTd $Hí¹G$ư2o™+ò ‚z«@ô¢„2ÏzÝDÖ¶Þ¡º«ýçH}6jTÃQ7c•üÔìa'Ñ$áýO”p·Ü iÒíB4Ñ/©ä‡½ — "é?©“pþ¾PÙ¯s‹ LAã“ãA¿Nç!·”‹_r½e)ƒí±d)†í°ÐõSõ~Ù Û…’Ê^—¥ þ¯‘?¶Îl/{A(I1’ICÒ½ûl—ðW³Êt©$²'¹+â»)ι’¤5âÊBy"$ÿñXˆs†P[š$%2ˆ‘Õy!"•(dLœDÔ@¤…Bú8§z)˜°ÃýÁfølA­Ü-ï¦øô^4±:' ù–]"²P¼QÂÝ¢æÆª¼ ÓBÅç(án´ò¬µÙÃN¢ß…èOß2 &rB¯Áù±]²C®‡<áq´‘'ŒšÜ%ú￯Çß𠑉ž?«ëˆö…ÑFÈd„Tú´ðБ{¤„\,(ʤ½¾ÖÝᨊd_Š#” =划B`BZ´ômh¤{÷§dè)Gä<ž5‘ IÄÒ[{¡MnªˆÚ„ ¡§ÞDæ(‘‹)«ÓBî/ó*¡Ìs„?G.SšÔò¢ T=ED¯2sö¡÷ÏÑÕ\½OË-ÈšÔ\è)"ú¡„λAù{”<{«Pé9JxAínÐ:ô4{ØI4cA£cA®çÀThã†ÖmB4è„„±jžã£(´vƒVBØ4Çç¦ÞHu¢ +Ƥ‹½^Võ‘åaÜÂÙÅ]¾ð%-Å‚€×ö óyx‘îËAÅ}Š1òQƒräÄh"{uVBh¢5NF!õ¶áî¢ Z YG/JÈ~†ÂÛ‹Åò¥«&r¾ÁFÈÇì8Òå‰ÄŸp!ÒòŒ˜²:ޤ-¡ muA(‰wÏJ± ` $ 1iÿ…åaQÈHÞÖÆ‰yËh öȳc$Dµ<ŒCF.Èçßv¢¡± º±BcbA³‡D“è&^Ð?éDÜ.lÝ-?«D‘£EµD+/ˆtð)'”^šܯKûQœÇôÒüDn)²œ+ánÙÐ’»º2û¦O‰{Ægð]cÎÝòS+‰Ù7Ü™m‰/],´q·tòá6שvþˆý&“u·¢,!ŠŠ¡Q\K¢<LJ¢•»§#EÅÐR)Hy¿.Z¹[+!¬Êicظ[è¿K¼4?[a,Ÿéar4ánø©YäÙ7 ÅÐhgþhënð¨©õ"TÈt:âlÑìa'Qw" zSĵšH/%Å;z%¾>¸GúsâJ$(uu°+Q…@ÈPM¦Ìœ"ð’ ûC„„º/Äa‘cBõ÷È("s"‹ %Jâȼ­”ØÈ€¶ŽnÕzÓZïêš>³?šDµDö-¬óš%ú³o±É×<ÑÇ­ˆº ½–ˆþîh?JDƒ„D ã>‹M*šäjj$Ú4ª³?šD“hÍßñÍçhõ'¢UµÃd1Rî ÆÉ–ÕD‰ Z¶å3I}t•VO4PhK\q“‹B£áœnÑ:WhP ¿$¿ã>‘¬·—9–Í6x²KÌA¡˜(ì¼"_š‡Æª°ùZXä/Ù7†-‘Ô§„@íü’j¸G"‘9-”#BÜ’ª§­V—3_ˆ³Qhûyóvnn§hãw}R›~ëd˾mÝfãò!ã#]ºâ°Ð!"ÕäJuä9â›D“hæ@žˆ1‘9At(r˜ÐkG¢CVgneu“h­ˆ(1ðR%±òQbªö½³B¶¢îŽë=U“s É×ý?)´%R¥ðŒßrH&-ýŽTn«ã£ -„jKj¿ÿ©epz«££ -öëBü{Èé »)UÄD¼÷¾tìâ«©VB'ˆŒ‘]Lý~˜ v¤:,”!Òã2_/Úú ¥–\»Õé!?GÚ‚P0†ÃϸòwÌ›[mÞ&ìbu` ÖÖֵψj$:>õ6{ØIôëÍßÿÿˆoVn™D¿)Qr¤¨ ÈîlUDÖ³ÛÆqÚ¨¡FhŸˆ’ç8,TAdOå+Yr=etÓG\s™cý'ï‘]‡~\˜Ý ÅSX§­Œ®B²Åu±©Ãsä’PyêÊm…´âɳÏñæ¶rTÑŽ[V[¼u°:U0¼Q¨ò9ÚC\R|ß*[®JŒÁ¼.)^aÞ•mÞªõÆ[µÞ7#êßõ­§ú=OÔu—“ï¢[õ*õ+öþ¯"Ñ ¡tUy©€l\dĦúÇ{D•r÷BxN¨T;Zªb«ŠØ‰È•òv…ÈÝ—^i)°Íµ·;Y2àÒ(\sþ ½ˆ\YuWñ¹Î:—Jçªè}ˆ Bh†-1™þDN`-D­By"/„R±^öÈëM$[2°ÝœÑn<¦eØÖ*U•vÒèOôw7äS™hPr×­0^Á3;¶îaì8¶ïغG´jܱuŸÝà Ah»c«}àQØC ³;¶ú"š§ˆôUù[‘ÊÞÿ>Q,dLfÇV$€žDZ(Ú±é¬Õí Ù'´kãµDÁ’;¶Ê¶\牂y'wlå÷η ‰z¢Ô·­#”ßuk[øèŽ­Ÿ~ãþÈ…muðv{õ°KDëà-šV¡r”X¯Þ•ÈöG±â»Ó#ñêp=„$œï¼P¨ç «Þ {´Þ*ÆG ÑožÊ=Ÿn½÷„d%Âp"èEª$¤…ð€Ð•è§lD:xË0JÜ3†+Ñï_SD> »´ äwz”Wîqé¯ ¡/ïo÷—/¥–¡W[wùëþRlzµÞW¡Ü.é¹°ÙM¢Ÿ˜èuL€}è^oE¢[ÍMôÝëíûÌg˜D“è§&z|ÑÇp!&‚Ñ}» ?Ñç–HOñ¯íÇúDW¢øï—^Bñ‰¢¯úx¿|ís¬Oôvÿ—÷NÇêDop«ãóIˆ endstream endobj 348 0 obj << /Length 35 /Filter /FlateDecode >> stream xÚçÿ¯¯¯âââÖÖÖdddVVVßßßœ± Ø endstream endobj 351 0 obj << /Length 1366 /Filter /FlateDecode >> stream xÚ•WKoÛF¾ûWè¸,†ûàcÛS$F‹éÁíÅN€5µvèJ¤Ì‡kôÐßÞ™¡LJ´Â€µšÇ7OÉUre“U®U¬R¹*wg Sÿ:“|ZÃzÂñËåÙ»Op”Il+W—·S—›Õ•øàöÑ×ËßV²ˆe¡V*N K7׉Òt+©VëÉUÕÛ&Zk­…þ)Z“Š_ëH¢÷­»Nt!©ü7J“D8àTV%V¤AÞÙÇ˃Á©Rox„o»”&–Úu·î߯Ñ:W™xÖ©\|¯À°ö!’b¨‘6? áö®EÓ¿E&׈RÔÀWâ¡‚ƒ#¶‡ÎüäÂ7;|òXù¿IX7ìÁÉB4mÏâ«Úí<ŸÏá*•¢G@ÀÁÿÇÊ!Y)ÂÛ䊴ä"¨*àÆ @`¥ŽeJ.–Ín¿õO Ké`Hñ„6wxêýŽè¥«::7dç,LÈL¡j<³= ,óh›rDI ëI€á+Cþo˜%Ä‚Íh‚=J4¬dï¤gÇ«Âfd‚aCŽmUß îÎóÃMÁ y€ÃÕ”«%‹©)3SÎaBÊu’&>Ç$ÖÛ¦­}éé 1Ç 2…`îúæHÈ „fÌô_ÔÜ´ž¸§éÖeåÐGmÅÇÝ’+ÀÞWå°uí9 Ј§†Úañ 俚æ¿Lò8· (Øùöίo\穲«%WqbõÈ=‹e8jë0hx:àL ´ÌqÇüÕu"MéZºçˇé~òÑ4:a8\a-s…ž%ùÃà¶BbžÊÝ¡t¬a[”MEµvU} ×ðËiŽû³¿ÔœÅÑ_Váú6ôL¥y¾vÄ@‚ÌbB3«ŸvÌ J|y%©—"nÒXfù<âËÑ6Eœf§ÁfçSÅÎCWâH#Ñâi¤‘Ê—é|ìœi|O²A䎾ßùPú@©êMõXm °‡¦SXç*Ÿ#ðþ4•:ª…´cé®wâ›y$øÜ¾ãB.ñféuÃCE-)_¾\|þ™m(áiã{·ýî™%ðû{hëGÃæTj¡ú œc¥@>ÞÏ ËƒŽïÇì ¶ðÝ<·ƒ„Ê£;Kàä¡LP°²hy´á„ [ÃAt„ hG €òX1 ÿöÄ} ̧‚4³ªÏ`ïÌ“ñG.‰peY,_(w3²ì¶ÁÀ endstream endobj 359 0 obj << /Length 240 /Filter /FlateDecode >> stream xÚ…±N1D{Å–vagwm_lJ‘BHב YÉN䈒–oÇ–¸ ¹ðîÌh´ó#ˆsˆ=Áv8ªo‚ÆI瀞$®[1[æ‘ÐDŒíË´¢ÝÁ“\¤wµi¡ÀÀƇX5²­–abЫ?_öG¥­µÒ^)휗«ƒâ ÏÝ)­Ñ¢*ÒöSyD™r’#c”Þ•>qÛþì™ÿ&úLuó1‚v6Ð4Þ ‹%8[ äáæ(ÙK×?ð„ÎDçÀÎMC¶²,û×Ë)0&Œ8÷Ux(P©?tûºïºò;¹x®hCæ5ßP_I[Ò endstream endobj 365 0 obj << /Length 3067 /Filter /FlateDecode >> stream xÚ¥ZIÛF¾ûWèHaZV×¹Åv'H±3ã> 0žl²ZM‡‹LŠmÇüöy[‘”DÙmÌZ^moùÞ¢V›þ©Ml£}©MѼdôJZ; Ø-(^Þ½øûÐTŸ™ÚÜ=,·¸+7ÿõ^å‡íÿî~Ù¨ÔW©Þh?J3žyhÃS¾Vz³[LUDZî¶;cŒgþ±Ý…aäýÜnuêmŸ¿L°Å¡âÏm^”:ÓAæEî÷âönºp¤õ7^„ßx’ B? ÃMœ†¾2!_ñÅû¥]3ñºûí.нöØñx^?á…eú¡ëyxlrn¿óåxÑ eŽöW­­™ª´—Ô“½¢Ÿ · —·ÕqèÂë„ÿ°f)Ö1õÉÛBxx9bØSÉõì1çƒì0¬ÜÙ±D)²E¸3ZùQl6;e|ñnðžP¥ÌšHXƒ3k°×ÎRÄ.q Ä)lœq*dNáŒã¶‘SçÔ]åTøZ'Sôæ5/¯ Ç1¯£@ÏQçˆQjÚÍÝ0:9ÓסvGcß[¶TøØ+ø„•»& Œ@/ïŠâ2ÚûAVžÜGø†;§l—a¢=+S×Ö”òýƒ¤ýq”U¬û%Jô2Ötã Tv8Òq´3á^hñº‘y–D~öwÂ2X™#/ž¶ [´4𚼸ÕÛBXe×à™A¾æûKMÄ.œP‘¢Z™· I3±1?< ýÓi6³i»SžØ‰Î¼×ûdIHý°U^×7øPex)|hpb>ÎHàÿ›¿;¡Øo$›¤w5A ZhT·¼~ìxì÷B騀†@;;0E;­Ò‚@:»@ ºjWYì‡AüWv·íÇ1gÑu|¹ˆŒ­É¤~¨ Õ˜gâ˜gâDÀ7ž5ÛôÀ8¾ä$dŽÁÔŽáÌ¡®À wƒådÏÌÀí¿¶/Ï€fv¯û8‚BÈ×ä¾ÔyéѶ9ûIû¯R󅾂jÕ¶¨º6/Å¡vã±—5êä ¦“;fo·SÉ|Ðo¸%iRú*ï¹ *ÃF·pˆ™+‚e\râZ “‰à¼ñdgÒæÓ•¢Ì¤9qrŠßÆÂԩΓh—^ÒrÌÿ·5ý;¡«ðÐÙ¬ExÍ ¹XÇá³PæýDZɱf™†ñ‰E_3˜˜ÿ±ªíÚ=Uæ™9÷Ô†FËJ¤¼š§}ÕÕ!—îµã1¾I“ÌmýOÜhå:òãÄœ:••Ýv*2~š&Ð~ àp©j÷µÝ½ßÊX¸×~U‰ŸjøDÉzÒiO¤‚…Š%¹üþd»†”±²ŸxdX„hv°Õ –àV".àwvA½vµ¼¨±Í4ÝÞ¯u9‚Óè* hƒRŽye7Þ7î…Žÿ+¯9s­–|‡8 yp"ÆÓK;"¤äMÂîÇ^»« Rf~¡!àHZ¬ðFŸãkѵeU’!G¡'ÂY0ÛÀ·†X½ÍÙûSað‚ц'Ò\0šfÙ}aëd×3)D¤¨å²¹s$*ºæŒ]ÅÊ%2¢„Ÿ*òG›(ò#“=73aH¨— šUïGi6“€×ןž¿ëî{§L81VÇnàþP  8•ëú  ØÕ Ú.²ˆb?‰Ô‰æ­ðL‘Ë´‚NîbàçyÆEÌ¥Xe±¬v{M²fÚ'|½CnwÄ¡‡«+.pî(9ªÏ<‚¦’°é w/ç;¬ˆªˆš3¦BùŽöî«ã C–GмGv¨>sƤ=·î(a$ õ¶¿T­s€¹ºz\»ðr›¢ë1‚‚A42o±rëî°ºYpÁ|¢ýƒtE‚8:T¨ÆøÜ€Ã¬áó~‚O`â^|pz óûª† €lÓ(Ã! L(ž°œ„À}õl/ÆÚíRºlψðô‰.%âQQ)'lÙVZg?d_i%áßR‘†#0ÅzבyØÄ˜ÈpÀ¤=6Ž˜ÜÙòÞ}Þs¿jò½me7€ë–ƒÑs~`ˆÆ:³VhÀ9:¾ûžãSàOí†á‰=d…< Fòþhr°z° Éòcˆ94ØsrÆÿòM¢¦¹Xi¯(M¢Piø ‹K|=%ãò4Q(5%xÌ¿0^us$Ìü4ün4Ä}(£…_rñÈ'ž`5E†LW5‡¤°¹Ž+匿„ŽÞ 4¶?ýzÃ#¬@3gmŒ’Ê"½&U°Û}?+úÅ‚Á%œ¯œÙ7<Ñ»'PÖ!úÛ äÛªpK$Þ¶Ÿ‹z$t€%!ÚÖ&Žz ZRFøúº:>Úþj„ä5ñ$&JÀí´Ðé­t»‹)p#“’hD ççØÐ!~c«0"jÐKO 5âJSÊÍ{é´€SKh‰¥G’¼Ø~·ëÈ£ø ºÒJŸ4RŒ/c-°=p=¤GDÛ’S¬—éM™3"b—¢\fR¸Mêî ÔM¶IÃ`¾å¢˜ˆË–Ù]’^ñNÕ À±O(­¼éV”îëÉY Ùqq£œ‡¦{h—•báeÚxYˆ€ñt®º,dQY "±–AâƒT·å2žG©˜Ód…óŠÀiÖ ÷ÎbNi)^  i-sÐ`FDî^­å§ñT (ÉVkà~‚Óš]gQVdÝÎaì)>D„<÷,Û T"Μò‡±S¤ b5è0û¾Xérå éïûª~Ìé &·ÏZÉ"uÇ}4Õµ01ÈHÝ«&s ØÀ/ª0âCD\®y±ü˜ãŸØ°¶ÑÒ3EÒ¹s¾ßÀ^Ǻxôè>~LtRbD’‰– Bj;&gÂXü }-ÜÒÀ™Ž¸tEbXÐàðµG_]õ2ÉË ^$ÂÇ¡ÉÂiü,ÌÀ1Èq|†o,VðP—¬õ$.é)5YÂ’‚ïWÂÑ kðH (‘‡Þ0c•#ŒƒÖ>GÖ?gSw4Ǹ±I¼[°_Ú|˜¦ØùùnÉëµ @à‰Œ#ܲ9nDk묢B¨»Àô£°˜Ë»UP³Ø{m nѪ×àå$¼ãuj"ÞæèÀDZ†&¸X#XÕYWÇI|•žÅR‘ß ;zJ Wø¨c‹jXf.{ Š`ÿ3s0TZÀò\‚‰`ŸB¼ëŽŸr)- À{ï ¾yvÝåv`ˆ¼{ƆãRw"vÍ û¾£¨?“è/;/ÃàdîLRÌ"¯!« ˜$‹DÁÚx! ÈdBrÚŸDòpDšO\´þšf¾e <ä%z¦Å½Ã3­D"±Ç¦:V„‡™e0ÒfSõå'¼MÎІ˜ÍÒl%¤Ø5póâ‘7{ÈZr«´â°09êv\5µ¢®J›³CŽé,nySµË$ÓEõ&ö„Z•Ú“ š Íz~mž)á´~>p›½|Å(³‹xúP•ý(¨½7Ý ò]<8 ”÷X9ÜÏM]¹iË€R ÂüL¬BšJ´kûÛáWÎoëaïFìsœ‘aªÍÀ¾+ÊŠ;–r'PÖUYMÚË„a6÷±MC©Ó©”u 'ÈHpjY´„nÕPô–’Ç]‘ò«º"™­”– )51é]-Ž’“X¹³«ô‹‰™bƪ^~^€\m§ vÎrÌã\†Å³WŒfØÈ‰d2òd2òg@Þ˼øcOˆ×mÉ ÷ª«»þ{ O§z…{8JÒ)Üoì÷8HA|Q& <ËNæùgAãЇ8à€ÆÕøpÁE´‡ ”3à,‡8©¦]-Žî\®ùTÃ:•ÁÃ8U²\múE Éܺ󟆾"ù«ˆßþ½Õ°ò~¹}u÷óÛ7ß`ý çCH&ò9áÛ Ã”B|}¨¾ÂÂ0˜ú’]DÝz™ÆH’ÿ0a5\+ñ±-\„LJc•â›­Eðý±»¨D¸ˆã8,$ÈŸ]¬ÈÿÂåÿ«1$Ü endstream endobj 370 0 obj << /Length 2980 /Filter /FlateDecode >> stream xÚ•ËnÜÈñî¯Ð‘x²›ÍG|ÚØrÀ±XǬwÖ°%qÇLrCòí©WsHGV ‡UÕÕÝõ®¢â«þâ«"ºÊ´ •‰¯Í«H ÿz˯=ìgùüêOïág…ETÄWŸoç,>—W¿oíÃî·Ï¿Šó0ÎÕ• M^0æk¤4£B««ý UǺÛíµÖþónŸ$&ø[»Sy0ºÞ~t´CÐá¿;EJU¨¨LŠü^]žl”úÁâüJÉêJiž„±NøtÝÎÄíá`qêŠn¸„ÉC•%° ­¹ ôQlõ~FAé4ºïcçApŦj…BÖ”Õ0þΗm•àZ;G@t}éZ[28uŒínv{c‚?Ü(€ylÂßGa ÇÜÇ:Œ Ÿ•VÆqðГŠpÛî{ÕTµm…€Î C׎AVˆl?V½Pù…pÊ,èX+eÙc5xe†»}šÁ;÷¸rÁ®çdž-]™Ï‡×i\Ï÷‰ä*b~,š¡«GÜس®Þ›,Laaf*å…ïwYF:ÖqzYÇY'z©c•ç^Çøo¨òÌë˜A“ŽñÕ®uŒÀv"„陚i™0]¨'5{:O˜˜l%"V¨6Ÿ¢PüÙØjd‡ß`¯Vœ‘–xVV;‘wL§žÔ>ßg©v£bV{žÔŽ?Píøü¡Ú/hc rÕIà~½ƒ`RóÏr²6|ãmá\¾ëyÑ·£ …×ã¤më®÷ ¶ìJé,4p¨h8´É/U¢C¥~Ͷ½j‡ ü^™¬JƒO;e‚/Œ5]…£\Má(wGF³¤“L‚ê˜ò`1ƒyåÂ!¬bÙ /û4 q³qeU ?Ô’G¡o\ ’Ýðç²ê$€ä”Ðxt|Dݤ&hØSJy壺~àädÃ`­+¤3°’ .™è4AOèÝàm˜ì„ެžÞmïŽÀ´–] ïz{­»àq15xžŽÎFIRpò±»;…_Èyqrèà ÉtP$óÊ&¤yåa~<;;B­l1ÚÆ¶÷BZW­£„ˆrË£æ×úõYàN@ ×>J B²é³„™8ª|bȾ?¼+º»-eÍ¡C¹ÆÊ¤éŽÓFcüÊJuÃ{´QaTdÞÞÚ†3¡‡/”ôÏ}¶k¶0z–Eið‹;2Ü7õ1¸X+àqÈjòÛѶ¥°¶5°kmÓ Œs¼E/;Rýd`ÙÇý–ÛÚºz²ëÔ9Ì’!·<¥‘sþÉÕ2Áf)¼ £¿F&r¼ <ö³T 8<ÔæþèÕHÀ*quÀ&ÆÈV$ì[Àî¶ëÙÄnK e×óY0@IM5c> ðb¡ºsÓ±RÊ“Š”Š!ƒc¹ÑеnåU2•‚ÅWò•YŸÏÂÆ3±Fxέ3XÄ»3ºõz¸$èfçÃÙRÃH{ëFY'É4%ŒÕ› ÌñÄøÇªé¶RRG†A÷C½­éŒ t´ä†€½“°q±Qt¤ÀœP¸ˆ°pA›«åî2°¼¥ü곃2ôn™Ð–Õ¶oœ¬UgdÉ­? ¼Oy™ÞÓË7|Íô¬²®crÇ óž§L|íú›j´5š=ž1_„\÷Ðw¢©þPu-—~éÂîðý9»‹×†÷SfL'2ó|`ˆØ<9¥‡- ߬ ßl5{ËxND_F^„ˆPéŠÍ†×Ô›èºq3UAî´ülÜÐÈÏÞ>Í,NǾŽy?ûëßX’-³ð6}]Îi+R«F‹2MÇRBŸÇ¤N„ºå*‹ƒûwh¨¬Ó×È2Yˆe`²a¾ KÍ›©©Æ#m­â4„üÿÂEé9S‹—a:Âþ¶Æ0¯4÷~\Æ¿H¨¶Ìm¯dZrÁê¸å°üð­66)¥‡=+4¤ûªD© “'œVKå­TDÍË%qè¥8î|[ÅúL–)uS(ìH·+%•¡Vù²TúP‘û`yô¶î°8|¾4šÚtÉ4ºP|&)&ɆI,?¸ìù…ªLüÑÉ;Ú‰…žýžíH7˜ZÈÀµka:ð ë{þ½°@DAlp€3ºÐ@²^¸iB³Á¬`r–1¥§€UO\ºaÜVæ/ýªÚB¬÷^øië;¯ÿ< ø¥#»¦ãp˜Hp`Ñ¢LÇR£Øu^@5¬W9ƒ*'Ãól>ß@(Yx´«¾w ybÀ²yh<ö›°úÄ=õ¤Ø+î;J_¹‘‚ # ŽÔJ}yn&•!Þe#„Nž•XÃû@\sßíÈrÏ$®B˜énzÿóè ¿[–afÂ4Õ$ßü²|U*rÍâÈcð*0ÕŽáVð`Ãh‡i0A@ªÄá9+Ñ0U¾aÅÄYæ™Y"Ô¡+žñàÃõ½äs%cBBŸYB‡97º9¾9™Ü·#d ÒÐÇ‚©+¼¸,y"w"Px”WþÆÒóàš-‡ÁK“ ÓÀ›Ãí¬NEø"×çæ\%q¦/¶xЈlÇܦû ÌßG^]í Ú߀ÁþÌ~JÑÉ Ð#I# ü$?aWŠCű s¥Ö¹¾”Ê|R{™•…\Ó|‚Ô|ε³S&§FÚÇêä¹X&¡J¦±ø¢FƒÝÈJáykG’„Vš§›é ÿáÇ_]G%ücåþd*eŠ R3&,Ô* DZš‡ÛÄÄlÈ^(‚‰êŸ¢º‰8Ü!°š)€ÆyF:ý¿(2¢Ú8­¢<¡œl‚QÞ.¢<×5{¹"o•ä›ÃðE@O(2ŸŒð%nݹÞK;h©ü Î@Xuüˆ¸XîµüJúÅI?îŸtaLTä<œÅ™ðy$æiQ’³á@úòMYÕK6_-µÝžZŒËœjxewäW°Ufѹ’|1d²'ç9cŽ¤Ý <Ø›ª®FÉÑŽjÄ€¿c¥¼³ x?ÔnœôˆÎ—By=ºúÞ÷ÎÑéN¾îÜA•_úekgZ•oG‚Œ5¢¡CCÜÐiñRÓdùWÂ{ùx¤¡b6y¼¼”¶ÐÈãV—Ž/Ñ,fìØáª®}ô‚O3¿üŒó³ŸpÐýöškÃ|zwýáeS3}kp¢îa³a7‹¯pDÈõý 5Ï—âÄAÌTÖ‰¹¥ÏºST÷,ýG.u¢B•b°ÎÌ:XïáRy‚z™p×Ìœ>Ѱ:$ZxÈÉ¡ ¼á @¦íø$¤Ï6§¸J]* ï+ŸEnN_ëjÂ;Ïãvéï=’à NçÁ—]®¥B£€òû4Ó1õ(Ê»x01ÁؘΊf|…Ü9 àdssñèue9ú: «z0vIüÕžB•»% GûF礗Kcñ0²’>‰Ò³1¯‡º*mqFeVð32%‹Aô¤¿Up¨ZØm€â©´Œ]l`èÌH‡×<ákþa×Ç!?†Y®¯beB¥éë7ø!gÈ=Õ~F¶ñÝÍìÒÇÿÔ òñ.“óõ~żî e¥X€¶Û³PiÝÚá·×’÷ HÙú çÉVîØ©!Å©Z $.Š**(UåþaÀíOTâX±z扩Ë^D¸/U?b+ùã¯x4zÈ–uN¢ø±ŒX‘ag/û¹!¿¦w4ÿeï³ “Çócç[¬ñÈSq6ÅQŽ~ºvsN8öÝrX°ò›Ð«æÏäЯ endstream endobj 373 0 obj << /Type /XObject /Subtype /Image /Width 371 /Height 547 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 7 374 0 R] /Length 4488 /Filter /FlateDecode >> stream xÚíMoÛº†9AsÖÃEq¶Ap?PÙ^F×·(Œl‹"ðúÿþÉ!EQ¤LI¤$¶Ã ©eÇôÛ'Ç_#D£åþÓiPžN-ßÞ†×/÷Ÿ^årz9hy^>ÞúçÑ/O§Çc–§·—áuÇ|øÄËA•?¾ /uÌŸ,ÄüW{åñE3hÏ%ž óŸ§ÖÊ^ˆù韾ø÷.)1–ùËA}Ë@Œï:æõ羘§Î+’‘?>ýŒ0¿ØÇ]³Ý]ù%`~g”Ý`.îŽÆœ”ßM2ïdï¯<Áün’ùƒ¶•Îb„¿“å,b®Å>Ü=Ü)åêߣ2®Ùºÿ¦¸Ó¿%è{7æZH’9 {ðþ›½Ðß¹Rùs]?ÀŒµcåƒ ½Toå!sô­EOHÏ9ø/¡Üo¡´ E”fŽV«›v^©¼÷ˆä¥nöV·Pî+r_qñ¸âÁ•OŒ+[ùÔ¸bCÊ™ùQ™ƒÌ;5z'Ò'›as=|N'{˜çj3³do‰r0ý,=;$i4Wºçj3G}Ë^¬Ü.v¤ÁóBÊ#ý–h4æXœÊõé9óOé¸É<Í!u)wS[PRùtÿÜEsàVŽ.h¡ôÃ)7v!ÊÚy<š[®Ü1§3aœòºÌ]4§\¬k¡hfõßey;OFs+˜ã€9Ro‰EsrM E·l´?—ÞâêbÌSÑœ”«¼¢1¶î‚î¡°Ù=”ûŠÜWdæÌœ™ÿÌ!lìÍ-›ËV^-š«>7W-šËœ›Ca§IôëÂίð-£¹Ì¹9sˆ"¢;2±?ót¯h.snŽV»¹C9½M£«¢91kz;;&ò¢9Z)IÛFQä+ŸŒæP¯J«¡;”쑦&þÈWžŽæfló‡šhÎê‡è–(/ÍeÎ͙󒥛ðvË%ó•—Žæ2çæÐÝ¥µs»qt¯hŽûŠÜWdæÌœ™ÿQss “†÷ åKOÐY‡WÛ0q‚X —¥\–Qž97GǵÛ$¨p7½]P|‡R¢F·äOo¢+Í|"šÍÙÔæ7ý¼´±˜È,˜s§‰PÆ(oç9ÑuTÍ#‰WÔZ¨?NA?š+ØùÔÜœ—¤"[9šÔ÷c¬¥:sé+G?IE¶ráòLHzÏmY>7Þß<¢¦" ûN?Š®À<µÒ’rk&—¶P(ÖB3çæl f½¢”i¯8Ü“«öhz^ÈÎgŸ2µªßr{*7º'wÿ¾"æ)íÉÝ¿¯(ä¡”×8Käp̦œ™3ó b¢\å”JOø1,8÷¯\:O¹»”S^~nn+å™ss¦rsØ8¦\€Î»§¤R?Ç<'F3{UææÜÑ(³•›8Ðp6}K×Ïœ•kñÜf÷¸FÖâ/é²t©ìªÄD~4·V¹¶ sm!å¹ss+•#u67bîGsyŸ”Tî¶×cžÜ7·¦…ÒÄœþÊ´ÐÜ}s«¼¢¤9l} `¯¸g¿êßC©œ™sÿœ™3óý˜ësÐW)Ǹ[p0JCQn |êåûæ§<n.çÌøˆr´£Õ”…^ØSèûRÔ1Ñ“Y:7y‡¡¤¢¹¾FÓOÉ[©ÏÍaÖX}<öGo­]ßO|Ë>Çz‰˜(ˆæ–YË-å”òc¾òܹ9”9™41—å™ÑÜ2;ïçð¦”ÃzæéSPJ´PH¶P˜ÝBsçæÛùÐ+Ê”W´¿Äýî+z}ª™ÛŸ™9Û93ÿ­çæÒ52 dF"çc‚ÅöÍÉ>ó ̉0ëc‚µ^%çævVž;7ç_ê7ªØ )÷âÌhN¸ÞŠ×6ÛòìêÍh ƒûæúK"‚.#ÝÜhnF+ô+ó»ÑëöÍa¯\P¤~Sy<²Ã™'°yù0y(ýâ¹9ÿ’¬%¡<8ç?®œb8Û‰ñ”§RÜ:çj¥¥»´NkBùyZ9ºÙ>9f.§•Ÿçî›ë/í§¥¬%Ì!‰æúÙ>«s”Oå™Zii/½ª3/N+EsÑj.“) nåm™Zii/­ëÔ åÃ\9‘hNG†"ðŠº®áOäÊ)ѹ*/Úo™ÈOT¤[´KN¨œ‚éý‘·•¢9ÌÜmy+W0Ïçz¹ÏÎuóÍm¢¼JLô£^dñ#Áüº¶„wÿk¹ÞýÌ_KTõª-«üšì·´T8g+3_ʼDJØA)›mv‚y‰”°Õ”¿O2WaÞó¿_Rå9í³þ½ê_•ߨЖIw¯:`®ÕýX¢üÇõšP>Ua–òxÕ#æÏ× åï©öÒE*ªþˆòÉ ò‰¦˜¨:dþ|}ÿ¼P¹ìê+Ÿ®0Sy¬ê€ùóÕjÌWÞÕ?R~£Â\呪æÝç¬P.ϯ¡òf+W0ÿªrt/V~>˜ß¨0[ù¸êÐλOZ¬ü|ŽØùt…¹Ê#U|Ë×óy¡òó9ê[&+ÌT«zìÏ¿N)ÿHÞá~|œþükŽò©›g¼êÈ=ôë„ò©ê“÷Я·•L+ϸ‡\ßR2&š`þZºú׊Ê9&☈™3sfÎÌ™yæ×6Êû˜y#Ê¿G˜7a'Ÿ¿G˜·¤œ™3sfÎÌ™ù<æUo‡U™×þQ—yÅ?ü¹.óƒ*gæ-1Ÿ<8Ì'7uã™OïžRî¹ò]˜Sâ½Þ.··IhTN½´1y®|ææÈ$ú.·-«UxÞ—¹]³ì¶1ô©EÒ òuÌå(„S>a-d>H¡ƒpPæØ››3hûDR¹™rÛןۦýx£…~”Q¾îjW¸;;GÊ4šu6;÷[¸¯ÈÌÿ`æçŠ¥*óƒ*ç1.WdæÌœ™ÿéÌÏuË÷zÌ++¯È¼ªIüý^‘ùÎÊ™93gæm3ÇÄ©eg;úÞH#‰9¦™ïª<ƒù¤rï°þc2§,¡ƒ9ž*àpÌédØ„rûjp‚ÖþÌ)"F| )÷óDyB9ú9 7VžgçGTþÛ37Y G-”Î΢W·m¡™þœ²@Æ•»W7õŠÜWä¾"3gæÌœ™3óÍ™o°Ý©óוóœÅöÊ™93gæÌ¼>ós%Âü£%å¼ß{åÌœ™3sfÎÌ™93gæ2·»€¼™*h‚¹Ûh ½nh‚9ö9ªŽM|ÌÜX ­ü0©ªhˆ8¸ëôÆn“­I…ãÒÛ·Úô‰.ßTñ)ýZþ\PÖ*Ê7u\å#î²VIÙs •C+Ìû¶a =¼÷mm>€Øî·p_‘™3sf~hæí ü‡Ì›PþeÞ€™Ðú‘yCÊ™93gæ1²G÷A°ÏèVØ›0Ÿ¥vS>fŽDHñ•ß[0§Ã×ÌQx:‚Ö”Ô©xöH<:þ PØdË‚Ò.÷gè™@–Ú†9¥f²ßšEãsö8<ôÆ^‹ÈàAåcæ:É9RÚt›#ÜmËéÏ=C7¬ä%£÷OE³ Âa¼£§spÖ2VÞ‰ýyd”Œ~ \ñJ”›1—t[ \ ˜›+á1—#沚òsJrnϽnÑB›Þÿ?øÉèGÊ»Rt”)ÉMæw# Ð*7#tÔþP[¨wí¡'íÖL¨¢<Æ\y8“^ç’·Û³Ì+*!<ýšœö éy^Ñ*×C|µ”ç÷[àÆM7º‰Îì+z³-qåBNO$ Ø‹y¿s>.§¥!ˆ˜¯-B›!Û¶®d‹6™sLô;2o&±RÈüµ!å<~¾÷ø93gæÌœ™3sfÎÌç2?·Vþk™_[+ÿc;gßÂÌ™93gæÌœ™3sfÎÌ™93÷˜Ï<Ö+^6¨dÌ<úûßK|hÙJ"Ì#u|žý¡õ+‰0oE93gæ2s½ÂÉ.Zò¡*™Ä`éÙ"åà6¬æ2G³šÞ°H¹¤µ”'˜kÜnáR岌r9‡9í(¹–¹°9#V1fms£¥\o-ö°€Êûr™‹5ʽ5¹Úf)f ¿ÛCžË¼€µ Í‡±Š9­NžaçXB¹ið«•Ïó-%¼b-å7ü9j¡²| ½q5ÐW(×çd¬eõŠm÷[þzj²¯øôtÿ×åW‹Ì/—ûO§o-2?:åMÚ¹RÎ1ÑÎ1Ѽª‰­_ɘùG‰Ý ËÝA93gæÌœ™3sfÎÌ™93gæÌüxÌEs…˜¿š+ÄüŸ‹aî—§áåÊÛðR1*?TøÓ[€¸cþË/—Ó¯ƒ–·¡ÐŽùeXN—ƒ–·oÃë{Ñj¹ÿ?(>Ùþ endstream endobj 374 0 obj << /Length 35 /Filter /FlateDecode >> stream xÚçÿ¯¯¯•••ÖÖÖdddVVVßßß ñ endstream endobj 377 0 obj << /Length 1299 /Filter /FlateDecode >> stream xÚÍWKs¤6¾ûW̪2½xä˜ìf+9$®Ú¹­³Uò ÇlØ©=ä·§[-c{sKÍ©[­~­a»~lW¦»\ð„+¶;¶Wi þuÅÂjö‹?®¾ÿ–,MÊ´d»ÃÝòŠCµûý¤Oñ‡_w¬HXÁwâcÛ’U*tÞJÓî{CT{ë3•9šuŠRF:ˆÔ½mÍàêi?ñ/lúª€¥‘YÙJìø™ê …â€[¸Ú2©zpz¦Ÿ} 2>'JzÙŒ†ha¿Hk7ŒºÙLôßG3ó÷!1“¸÷ñ1¸I³•ÈœsDÛ.ìå•ÌYÕރξH“,WôtwÖµdæ&F­ ß@*P–—ë ã8ßîùU ?‡% ¾K(CŸ+Ôÿ –þIÎWú½z$¾ F’3F Ѻ] Ò©ö§q¡;œ=.Áû<-|á¹on#À tK€ èj&×™™ò™F=”l¤˜‡: †“n Q4ÉÖÝÙcC›˜ÃX…»»p.ÅóÌ>÷íbgL%;œ«ÇÏ:m:?Ça\ÙièÔi¦é´eS2)åüÖEðó]Øo%Y"Êr:\Ì9¼³!3î]äJ$¥(!D<…¿¡·ERà[˜G T‚ÀÀZxç*úhFZb€j§ouso·,ÀЗ ãáïÆïX;å俆{RA¨ùdñG½ýÜçYR²9Ü41Ê PðzBM·õ`ˆ¢é3?ï¡\qùy~àh¡¯¦Ó޶8½¨mO”—†ì8¸ ©îö¾÷9þë*V•è›u ü´>_ñ«‡~´ÕË,¼q€õ²pŠæÿ$Ø3N1ñîI|Œw1ƒ z«ð%çÂóÜ÷Þ12½a“¨>7ÔŽ¶“* í· ÐíO§[Ý'ÓÈMÕÚÝ endstream endobj 382 0 obj << /Length 239 /Filter /FlateDecode >> stream xÚ…»N1E{Å”vagflïÚ”‚BHî…Zå«„’oÇ+/°r3¾st5‡Ë#ˆ­eÞ`½8¦[A㤠 'Äe³E MÄH^¦éå<¿©§t  6>ĺY!Ûº2L z²êNçÝQik­´J;çåò 8ÈÓ¦Ï+´¨†hý©<¢Ì…äÈ¥CŸ¸N?{æ¿Þ…m+ä] ÚÙr@CÖ ‹8[î©«£xøuºþ‘'t&:!šRV]Ýë¹Ï£Œ‰£Î] î©Ü6»ú¿)$·òCùFæÞ|ë|ä¶ZD endstream endobj 387 0 obj << /Length 2787 /Filter /FlateDecode >> stream xÚ½Zëoܸÿž¿Âè—Ê@VER8  RãÚ\“K|EËJïÒŽÒ]É‘´Izú·ß¼¨ÇZëµÝ¢0`Q#j83œß<¨Ug ü©³29Ëu§V­wÏ¡þë™’Ñ &¬&3þtùìw†¡Jâ2)ÕÙåõ”ÅåæìÇè…»=ÿéò/gªˆU‘ž¥±-J~ò>I5?ŠS•ž­&ª~¿mÎWZëHÿþ|eŒ¾­ÏÓ"ê}ëÞ':9GÒú?ç6I"3Ó2MÊÈ–ÈïÙËËA`›¦'4Â'TR‰‰KcβÂÄJñ ŠãZkgY´ï\Ë£†/·®ªýÅnfÊ­È™…ʼnÍ;÷Ùˬٚ©MV„YŸq1ä\Dkþ|nò4ò¼Tç·~]5µ›G×ç*jÚëå~ã;ÿÑmD¼:\²#öþžŠ·´”o{™¶qA«-¿z/¨¶Rik›Ã@ÇÊžÐPÅùh‡ç°Û¦Œªú„öxcQmPV&€Bi®ÎWÖF}/„O{y4ÉÉ9*'CéȳZÝ´¢7pq-¿Z ¯µÛ±ú Ó7òvï¿†å¦æ¡)Nè'Ì#*³u ï’u`ŠMÕÄ:èð ‰IÓÑH&Õ(%ÒØHHØe+þâ¶L¯…þi(ƒWMŒ•†EØ_xâh®ŒÌ5Y×µŸöU`4]fjF¤o›ú¦ ¬ ö+ÑqfŽ`åBÍ­ ÷då"ºŠÈÐù1C+à˜di°^U/Y¸ŒM>,‡*Šèïç…^ÄÙ(?Ý­Ù˳Öwb°åû—»|ù–Å SÖÛjwÍU8ð¬+Ú†¦BÚ‚ZiQÆÙ(óë¿.:Nç6õ"KÀe9‡å÷{WžrZnç{‰„žï5pÛUá…™Cb-שãá}ˆ<ñbXìx€Ô ‚q‘ŸŒYœÙ!~À"îÖµ~í[Ê+dEÜÕ¬„Ô5l­Á&»ÜÑàŠébF…A^kmªî–¶É×î‘&Yê¸6Êä°TúmÒdÀ{çwÌ— ÈCÚ~ÇKO¶ë9?ãH¨‡8ë!Ž¥JMÉ9 )»^Ÿ[ ©ùöÄyqè`ºÐ±Î56‹¸ Ÿ…Èì=&†‡¾¤¯«÷‰2¬Ðÿ)«§ó\\†Z-Ihã<Üç·ÌlÝìDI'™Döl4dΆÉ.|³#»Wþ Ï›V»ž|!ã}Ï!ƒÜ_; LYgúhÕ£çUÏÆ \U{(nݦ ›(û]Å>æÌ@Ëå£7”1©Ð}ðÛ-“\ðÖ¶¯Ä›6âÜœr/ªZ †!ÍR|‘À¦+Èt슫§™k¼îp¶ 1µëh¦cAõðÀ‘cS%œ®¹Ø¡;¨‰ÆÒPÖà^›F&»+W}mÐv6‰^3­¯Æ´¯Å9àJµFj ÂìÝ|´Žb¥F§^·¿’¡óñÆZ¸é“8¼vÙ•ëP®é$cÅ'v4à[ÏÕp+[ :Ù)©”»ª‹—Ð%<ãe™ J›ÝRZư®MФV²°ÍW¨;ÐÕ"Öò8›ûéÁ øÚ­ÔéfR§/Ú(HÕžs ÏCÖÄ]àe!•æ^^Elu˜€{äÙ‹XfŒ¬x&l ä 9î%&ÎŽ\¼xŃu#V§¤Š”žñ±q2ÕuRõ$Eœ8WtîÐbï¸À õ‚ÉBU:qKtc($^|p;Iécí ~¡¢‰2ø(`z© ëHœ_¨&é“§CeÓ»}ë¨L%ç™l6Utf^#áŠ#úŽk?¾Hï.h|ÂW`°‡È*c1*:nœ"öêPR^ƒ:›»òPé Õ»«º%$/`l$ -C½®ÜsFˆVwSìD ™ãûõ"ØVœlö…Çä Y¨oÿÍ sP{FâïF&< s:ÍFÌÙ˜ƒ0šé“˜r(Æt‘VaiØæÐ³æå½lK¨ìÔ"þ3U6¸Â,«áõë‹W<šãŒ&‡š ý‡|¹ñÍ*ôÐØàP*äI©”&Nsr+³c[ù#x/mä—¦Ýn~ƒê“65ÕÉÃ75‰MV>eSq’_Èì$ûÂ"P(f:?aSm–C,°§ ×Ù#·G¡TS$ÂË K\I•¤L©cÞÕPÀ¦k¬*' s:œ„‘Óñý˜O3ÍpýžzO¾ |¦Sné\GÐúŸ)á›óŠŠ(Šg*‹~è %GßR=8ª0]OÂ4,Ãn[žÜ~èeŒ9ð²ÄXs /*aQØê¢/Dc2åFÞkxÆ´ £ÍO›á¤I…&Ýí¥¨åÐÐtÕÒŽr9[AœßJ ?lù¤`6ØL íî9{éÒZ¨Ç—N,©ƒ“¹w½éäV{€ÁÓSËöuõÙ·ÿoCÒcœÒhíI>™‚è`šÇ(=E GúÂÌä§\sDÈìÕ¢ô×Yù‡I?0¢Ø”é'KóZõ]VÆú ,áy9 `p[pâòsAÂ,JᤎÏ+¾9¢¸TÄùÍ5ÔA” µ·fófž/§Þ‘ã]῱¦¨‰Î¹T¡¬Sy‹£<ØyNä™8¾¼ÇK~û«ÅÓWG²b¶ü›%ž3ìñBƒ‰‰&@¡Ó·ƒŽ¯ÇࢠGÍçu=â¥(…—Ô</¢|qòfÄÄ7'ùõÁS–A–ÇVÙS^ç^Q2Šâ À7Õ4Æx4NƒàÕý/.T/ Lê½ã&Á8å"WIÖŒç|JBImzl‚•ÜŒÓy¼|¼ß!¢Í¢u@t­Øl£w0zÒPš@3lç~wñ-£¯«Ým÷¡é‹Å#Ç€ú1H,󇟒ÀÈxg¦ãÔžjVMqDVËy >‘å£u¼ÊwÀ9’@²˜G?ì„„ŸB]…-Ã,OçáÓ’+|3ÃÓªdÈ‚ÆP„¤ªOa÷ù™íX{™AXÅ9€»Û­ï–O«<Ë¢w³\3=+ņ¾,éY¼,%VàÙU]ïw¡üMK—êà«.åa-Ì›7ß±ó]¼úǪÁ” »B_£èŸt3‹~ªžâ§oCm±æ@¥sÈϾR°*ß ­ ÅÕÆ £Wph¹—Wv~7 ¼‘êßD¤Û ]Î×Àê_£Ê³85üB †„Û–Etð\äÀ³âa&§ 8’_¡r’ ”7Õ×w(™uâÓ1Þ´^^Ýÿ¡Ôº[±bMK6Ld×g…)¤/XêÇ•™¶|?3”’ßOÀõŽ¡–¾UÚrú˲âbuÆi6€_ìÌËP+£²ã­¹â6_…³r$§®Ëh”ý °ÍTª endstream endobj 391 0 obj << /Length 2792 /Filter /FlateDecode >> stream xÚ­YmoÜÆþî_¡~ÊD–ä.ßò¡@“ºB§2¡0'èên%Ñ=’'¾X®Qô·ç™™%<ñj¥- ˜{3³»³»óòÌ(ºñ/º(‹LÅAœDÛêUè¨ÿx¹‘&ñÍÍ«?üÃ( аˆ.nîæKÜì.~ò¾5‡ÍÏ7ß_DyåñE$y!œ÷a¬„ÄQ|áÏXe?웯”òÔ×_ëÄû®ÞĹ×ÛÖ¼U¸!Òöß›$ =ɸˆÃÂKCZïÕë›Iá$Ž¿p"’øÂ‘"éEšë RZÜYì™§Ðgo0J 9ΔǜÌ{ÜDÞàÆF„?˜ZÄ1Øþ"g¨p0¡Ô³Sá硵۲3²Pg[¡V¸U?Îh³È3;ìå$F½LE×uKÿ9ÍbÏVÿqz LÂÊtäjñ¼øyg·÷—g†¿7¿ÃŒè…°œ¾ü¸IRΚ- ómÓÛu_Ób¾rö_ˆÙãS¶òÝáÌ¥[ÐÖƒ{2§“Ùß• ñ@å¡_3>šÅ¼ðQ ºZ;‰[[C+œûvœ˜zN¸qeÝ=7. ½áòzîò~B.ïÇqú¼}û–IrïÇm»I"ìGÿ‘i%pÌÚº‡¦ zŽ-±ÉøK×íöY„Ùfþ”Wíìà¸"xé³õ¯é/2FDà°=_;H;7} ;âd5¼}dY¡žÜ‘ÈvIb²]"ò«ƒXVæÁäù›áŽM½­|?ÒÂΉhøË ˆi»s œU³—}¨Œ :û8ÌfÕÛÒ1vnL1[$Û¹ßM5Ú¬³Þ5}\Z¾·¦mÍZØ`…-nqkö„¿¦{»xþvùʼ­>oÅÙ(Á6À+B hŠBDe…¶s_Ó>¥ÜüSöʎ‚|G3B½ §lÔ./"Œ÷†C²ì ƒ©¡šhr!n;'ºò,^^Akw%儦ž"]c"Ÿ¾ÝƒÝïe‹32r<øºc±mÒ,¨Õ-`gb‚u>‹/pItàã ]ºè.W NnRÑ •|ÿ¾úT¶™:>‡ƒC]õM_ÞÝI”ø£PÉ“¦®¼g'F¤p ý^¶l†—¨„¡³Ö?ÂÖDÿÞÂúöŸÂK¯œž‡êk_^+ŽÒ Íôò¹XãûrUay”OúîÑ…êGYP(%¼ïΕ‰ßÓW¢=$b`»þørDèšy¥É¥óò¦æÝcIV¼ Šy”N¶k\½qû˧q¤¹—28æB¹?nfq²f‘" s$Ç#>?ïä3;¢\Чù“0a7‘`1¾ "ñÜ‘b. F Œ¾[.‘G!¸’÷ˆ½+^·a<÷±´O+^PΧ=ᕲ gPŒ&Kô§½Ì@ªù`„ÛPÀè[ÆyârG'¢­& ŸËšPgã3þIžÅ}V—¼H¨P‚™y„£gax # Š#ÍMŠ ‚#E-íËyB†4ñ^Ëbt‚cªãÁèýìþI¬²{à\'ÞЙV¨ç0ñ®Þ¼ó×D¬ò@%éè‚*CˆuÇ¥‹q³(¤‘D;A: 4|dqqf[VÆ¡Oλ¾ù"ÀÑ'§kîú'ã4ü?Û×Èŧ±X®8!«<>c#Ì"´B¢êÍôH3s§ÿcÙXÂZ>Ë¢KñG—(0“Á‰¯ ˜hº Î½ØæÀÅF#Ó³FDEåLµ¯…ì;F»s3OCÑ8ïÑ€®…¾cÒ^ÑRÊ/=&c‚Çß4´2•uHä"5¤V˜ƒ”ZÚá –8A> œC>q5âß}èF3yLZ»²Ý¨ÃTù%¥$R'y'ñi²'?P|©˜Ìh+ÏKÏÔa*JÞ"ÊÛ·°‰dL§c›'‘±N$Y;Äv=PëIz_„ãk‘9c®´”ƒV'¯ENEâOôÊj\Gî¹Ä%1&-(]vŒü²tÑSÐÈfŠ„ÇÌO‹)¦o¡ì8§“I£ÔйÜJñL#¡¶¶ÞÙ–W»vŽ oJu[ð5¶Sú#—ÛÒè‘Æ;'eL[,Ïœœ‰†]Ùõ–Ý’ïü§’,gzr÷¯uìýu7P¼Î“Í*«ÑÐÇç±+ “:q*™tÖ˜ €f‘LÁF\á5ò€?cà’Ÿ.ù¸ìeU‚ˆ´Ô”|/IK†/TPÍOAb8¸Íîäh%FÐiÊh¾²Ð3ïzœwõ&ÎÍÁîL?ˆ}-O‘¡Nr‰í:—JšÃ± šÝ½Z4¿vƒk¬àê]•Ž2¿vÅ7¢ÑÐv„âùgoÒAÈEfЪÑæe‰ìļhØÛOýКíH€®Ã ©m-‘Å¿)‘­å±L K•eä.tôdÿ5Ùï2£AøíFró¤hœå2¶¶9¢>2æ &7'YÈuá´{ëP‹ÓÔã“8ÑÙ"¼º|;’ÿ¬¬VÝJ ZYv›…p}Í5%â!Ê0ö–øãe‡¸Ùsˆ¶uGVÎò'L žšv¿ûYš t@j#øòŒæöƒí›ÿ‘ÅE!­þ"_ž‘;‡<`µ¢Ôj`!Éëk„ü+2Ž72Å…Œ e|y WÞÐðÊ®&¸YkïÄtÜ›4ˆM ªëz9ôî_“Á' endstream endobj 394 0 obj << /Type /XObject /Subtype /Image /Width 450 /Height 222 /BitsPerComponent 4 /ColorSpace [/Indexed /DeviceRGB 6 395 0 R] /Length 998 /Filter /FlateDecode >> stream xÚíÝ᪛0àOåü·Ð Kþ »€‚ô·´ä Òû¿„%&Ú$­®Ûø}{_¡3ÛçÝ“ÖÃ&‘ðT:‰ÒÌ“hª.‰Ñïä†êÔÆQºå¬€²‚éOtÜ f¬ œÓ$x•›nlän^pÐRSA}z&>ç˜6.0 vÌWÑÛJµòÞÕ-ÝÚRÚ‚¯‚f9oìïØHSîSÐhüYÙš-Á†ZbRðEПѶ µÛ©Ý» m z 7M©)—W?vÝKúÕÞ¹ /覩íR.¯Ó¸q‡°œ·þEBKJ_Ùb¶;ª‰¶ÃdkÁ¥`S>û‡”¡tãæë®®ÁÒOºÁ¹`™º¯‡+=MáfW×`(¸"8OÑ2t31­æÇ¡ íg§˜‰¶ç†åsm¨}ìnñ‚aQÿ|¤°KÄÕ(Àíj—ø³}õ{ѹ~š€ Áù]‹TÁ¹¡XÁçù,ØEw0¼ûyS+\¹òÚÊ<ŸsÉÕ¬¨ºëðeŒàû¢Ê •îÌCj*­¿+­”Ô~cu²»V¬`VQõ¸$æØ‡}ÐÈ-ø öòrO/ò–Ð{"x‘7A3Á£´zÌ¥¼¼žeÍÐÇ‹ È‚„ !AB‚„ !AB‚„ !AB‚„ !AB‚„ !AB‚„ !AB‚„ !AB‚„ !AB‚„ !AB‚„ !AB‚„ !ABðï¥ý_é/‚‰#Áƒ´d‚âŸV ð(©`òKÙˆí$]³ã‚ïûl´÷ocŠF‚÷¨x6bZ𜠊+8žßÖqÁ†EÁ÷Ïêß ºFKÁº®ÙÌm%Ù‚K%¡‚u=ò´_jQûW‹)L‹Ð­X¬ÉV"b-XÛ/™ ‘× /XÔ®åÖ*Zp½‰È<¤7kn‚öÅ^e N+1,øé>8¯AÂ*Êî½hTðàe½uKmT°.™~àýσâ F‚ctË4í½àøþÆo&Ø'{Nûõ‚OÁäo!í> stream xÚc``X¿~ýܹs¯]»–’’vÿþ}kî 2 endstream endobj 398 0 obj << /Length 1561 /Filter /FlateDecode >> stream xÚWKÛ6¾ï¯ðQjE¤D=zK·› EÐM £=ä02wÃÔ²¼¢”9ô·w†3´%¯6›,r8ÎããÌP¬Rø‰U®ÊL&R‰UÓ^¤LýûBðh ë Ç/›‹'Ï`(Ò¤Nk±ÚÜLEl¶«7Ñ¥>Äï6¿­D•ˆJ®d¢ªšVÞ¦2£¥D ¹ZO–ì0îºxeY”ý¯ó\E/ö±¬¢Áôúmš¥1’šb•¦‘NYË´Ž ò.®6G…•”X„÷MÊÏL*ª<YNÚmⲌúX‰HïÝM×· ©ª¢7CGƒqo?›ÞÅ"2ïˆò6Uéݨww£ñûºŸÌÐÕ+|îBU&Åj-²D(:ðÊ5½ùŒöp†,£±¥¯îïFë:"l™aèYµà­|ê-举~þ’FÀ¶7Ùo» \? dêr \ÊZr¨Á:0·*)²y)½ºBEš>M× T ¬³‹jÏ–·‘YºñZúœs½üYë%‹T‘麛Þn5MÈ0P;; ^Å|œpÄg[SÈešÈ”cþ—æ/'ø4o-âG¢â"úðɲÜÕšÁ [fø¤÷fÇ–P¼Þ¯$€›÷äÐK?jYAê¼BáîAÍÓ%¥a¿AéÒ+ „ç—/iÐtœ#<”‰Òj˜8š>ap v bb`±¼Ã¸A‡Ý[fÇûQNçfX!}ÚúÓOطȞר™Jg@Myu]~Ô^Ab4Îb–½üg“† %nÛûC} ˆ½G3Æ^÷4Õn Üçwñx»;ã(̇lîD7¯/ÙÌ((åJäI–rŠ‚:Q‚OÏ’¯ˆŒ®AV©¢Wqø¶ šû³á{B¸€4¨N„¬H¤—DZ‘°“0 'X€^©%¼ ¡Qˆ€B8w-£5KªBNé|J}k}€ÊÌGB@á¿Aü¾ŸeA½­½µƒØ=]à ^zyÀ|G {-Š:Ieqs@†³ÝžRÑÕ?~¬}žHq£[bÍ…mÑÑkH•m½myr,w~æ´W*+T’Ö?Üøä »Aéq7èzo^VI–æsóº›ÎOˆh¸)NßÂÑ}u¯éûŽF\+r*@`ME%@ôÑ”ÄmûP% f%4 ÆUv RåƒD•1Xáë”ÛpÌZ"DôuàiØ| &E¼’ 4*óÜ&jGsŸCÍ7ÃÓ»ñþzµ¨8q[gz@\KÄ[¯fÕ;^j‘b\Û…mæ„ÃxŠwÕÛ*Þy&0R¡ô™ÒþØ»®§ñž›²cVPœØ6¹fª|8%T¥ïý~4%äÓ”€n(2¸[è‡ÙýRx³Øã¤Ž -®¿n¬¿c]5¸nÇØ—9YWs' ækh6ÈËYþ/cV§ ã¯hF "Çå{–ÖèöÓi“09É#j-Ž, ùÝE®¨û–ÐpCG-êÊCŽ-÷“­(W¿v¯íعç3$æI] ¿¿7«à^x~ˆ¸`‹(ʤT| žÙÛ±çŽ<–ò“âš(¯Ð ûBåY®h‚ÎÁšVÃ×4‘RQ{ŠÕlл”ÃOål×p›zùñŠö_6iÔj(úVc Àû‰Ô{©¯Û¸r7RÙÃñƒÀÅYú9í¹Ñßþ!ôJ³:Ïù»ã-v?^ÝŽ8æÕer¸s£å³x‹ñÍöf‹Mù.t?È^Ö0wòÝŒ_í}?§ùfž†þ‚ȲŠB ÿó’Œ\çÉÙ a×àôi!»ñpùiŠ*øâîë%NǰÁ©“ ì«ZKzåGCq<:‡ãn²ŒWn]Àì…sx%«bþË%Í>G»£­áÅ„rÇS3 ½&7é—÷'#õ–ÖÕq8?cAÀm7ºµ; r¾émçNÝRùàã·ÑÝ@=Ý&øt$ïµ'’Ú©8ÛÑÀöšån?øBôÑgR ôúr§½3 ü†ÙÚî/¾ 9ì_f¥[2 endstream endobj 404 0 obj << /Length 2859 /Filter /FlateDecode >> stream xÚ­Z[oÝ6~ϯ0¶ÑYĬ$R·ö)›º‹.¤HŒ¾ä‚eŽ”ceuquq`±¿½3œ¡DóØÎ¢à#ñ2‡ß|3Jt¿è¬Ï2‹8‰Îöí“[ÿó$â§spîŒøÇå“ï†Ç(EXDg—Ÿ]—åÙ»à…¾Þ}¸ü×Y”‹(Ïb‘äõ¼cI]"Žâ³s§«žæ¦ßK)ùÃî\©$ø¥ÛÅy0Uƒ~Êp‡Mûÿí’0 4ŒŒ‹8,‚4FyO..…“8~`G8âá-¥¹‘T¤Ýµ®2f*‹ƒªAYÔ¨ï>Ï]YweO RP»Ñö‘‡Áå.—Aµo4O)+¢'Ý\õVL‹òç¶‚u2˜MÍãº_|…Uê½.IPTd ¡²2š=N¾ÂÖ¤æTñ¢ïÃ$|Gà92ÇGI%¼ÉÁlìoëm Škþ­§ª¥§}? Õx/Aß•¬EEvÐÌ¿h¹ªAKÀ _qd?ðÈÛª½núgx”͆Ú‰K–hÍDÒîåÒ2ã»ûaG4Š(úɺ:r!cœ  \HR‘$IovI€Ø%Ýx‹ŒD*3;ÖX÷д§õŸpùÍïsÅ2¾h@Mc­¼V¢7uõ‡Þ<øm—+‚ŠÀ@ãG{q|ç‚kަÚ×£ö‰µ¢9iÀ ®Œ+l¹xuyñ†ûÙé©Íü¾ýcÁsÔòÅ… P¨D¡¬—ˆ"å`ø¼9ÌN…-Ð)›—£ÍX‰±Ïˆ…ßV×<,DMs«éÁ¨æH£0xÛ¨Xî^VªužNsCYê‰éÑ‘3ÒµYt^À M‘äå#²× Â}ÜÓÏ“qüˆZ:~í‡Ò욬Øgø naÛ­½QÜÝŒÓérÙµ¬”ÌÉú‹Q¡ÇU¾c7³Œw%rŠ“4éÈY""•=–å“›Ó™02&©$t¯ë[M]º™ô÷ŸðÔNÂ]™¢^¶º²‰8‘ƒ1ÅÂÊ ëöpG–·ì»ú–gŒSϺpÃ@#n›ê¡¶Çž¥B&…ÇF("–ì|ð`v¹\»ÜÑ:ÍMÏè¦ÃkÝÕûš¬“oÀq@/í[{;;ÇA†xa$ÚÀÁº•¦.¹ ,`fÛÓ7d£g>j´G.ÌeƒŸô0èíeŽäÐŽþôuÑ·¸  )_œ«÷a£¾nà´ç+jÛb.NáÁû™À›6ÈjfµÔ±Z [-žbOÉò÷ÉjmEñûèÞ³ðf;¶@QÖèÿNðgoÈFd¶o*¥r´3<ÌT…\3¨ -1WÓ=ˆa£ÉXLG¼{«ÝPïm¿qj\ÃxíÑ4Ð…£È%z!çÂ9 ÷¤á ¨¼#ukÂOAyŸ:’Ò‘x$¶Q€èoüq¬ˆV2]+™6—Ý‘Å"ØËq¡%í(ˆO{ØŒ¡€b1xU!ÿ%bèÑÔ×>b r®œ¨[–À`Ùˆ1‡Ì¤PY¾µÇÆÝ˜C—{¸ŠJE´ªvCŸbàAø´R/•.õ’H@ {º2"‰»ÈÜ“™ÖFwüHΛcF4ñãõ"òß>¢w*V]B‘xÎ s^=ÅS•KTö™"Q”:Bo¼vˆsÈSÒ#;,àÃ'£äÕð#XGã:0 W³€OtÉZj™[¾îŽk›C1¾+FÝ6‡«q€œK£ ×L.m³µ¯ ¾V+Ârnv $Õ ¡4¢9 Ü= ·¯x…/¯HŠ/*‰ïIbîõvÂXæzM„Ì4k~ç+hFoª»%£à-ìhqú+6ãID¾|&øb'Ml˜Ï6pÁC$·äv6ß²YÎL 9ùÈíYÑI𥚸A7ä…Ï1xæ"Ë3ÒëàÍì2±¸â)ÅÌèW¯™·1æ@Ô¬““ËeÊ…€lùñ‰æ­Mé½ÂÀ‚ õxa¶Úrl¤ó8V"ÉØT)›ê»‡lõÝÓ­EF&¹X±Úš/sê‹ùî1–LD¢ÒÇïϬⳓ¹*þ;B©âȧþþ¡.WÂÌînw´¥ ‘&G‹¬KJB¦[ QĶ<º¦)xÄr¥?{Cqê^²±>týú‰xuBéG"JÙ®¿Ú\–y(Ò|ýO2#yšÙ¾Æ‚ÖZþ|@ïT,ŒÁÿn”<¢Í ]K·ð:ÎTïŽnÀ/Çb4Ö JGE,gÉñr¤½u·¯±úoºN}_‘pr5ÈK,øÌ–ˆtõsN‰a•¶§A³rÖ|Y*òãb~5NÚrÛònÝÖ––¤øžÄ!w‚ß,Јў2UÂЖdk‰lis¾ý¡þ]¬ýv.;ôˆþžÆk ªÍ=žXÚ¤ wù´%{-‰˜ù×]qXßWÕq¯üšðD[DÄ{™اp¶rlÆr@ÈYÕÒGm󈨦¨$¹|ÇÃÛr0_̹óÍ7«³;"½x¥jd+¹Ì2,ˆ‡ªiô~è Õº³4%í—q ]À¬¢èès¼R:Hò×O§'ÑR0·àcÖJ!³ì¨‚_%«n©Åê¥ÞŒ¶º3έûu€QÓV_™½Z¶m×/bêxÅ9ü'Ãq½q÷n"â'ÛnVð3f@ ÇGæ~jåJ|>`ŒíÿCù-ÖÈ endstream endobj 408 0 obj << /Length 900 /Filter /FlateDecode >> stream xÚW[oÓ0}߯ˆÄK"‘`;I“òT @\¨Æc’—z«EbÇ)üv|]S(³‡*µ‘ížó]ÏçÀ¨L– iJT &ÝpÜê·3èžru Ÿx±>{òJ=BP,Á&ëë9Äz“|IWx—}]¿M`[À%¨¨Û¥Ý¹¨´[‚(Ég[TN=Ïò²,Óòi–WU¾ajSI¾%ÈôR÷+«H±:‰–,Ó…Á;{¹¾3¸F(à‘>ñ—K‹fb‘,Úª€ee ÄL3ýé{­Ï{⦣=vŒ—›s9\À;Œ¯Bx+Loñhcò|µÏmÚQ¼Á!Oq¢8ÏÚ2%’ b Õ¿a] #O|Ði¸Äf„Ÿ¢wì‹B%Öüx3ïñ³Qb—æ8Ÿ`õ=g¦Ðt¥pÉÌ C¿£Œ`gi ÷ئ˜j»,«”öSÓ!ËaJ™z™õuˆvg*‰ˆª¨n)0wÊ3µ~™U J S•[Ê2Ä8`Ç9«!C¼!Ö[Inå$ð¿Šðã$Å}U7ó~²eO!·ÍU¥Ì5®Yt†z1ÂÚÚ½þ":ª :UéH†páÛÓqÂ=ý©r$,äÆí\ãŽDFñþ2ýåè¬ÇÉ;±q¿=e[lÉ/@ ÈàÜ¡·¤Õ Œ¬žU8—&ƒÓH¨ãÓF5)ïMöJÛ›2VõoT{ºÀw—¶cY§bÞØ˜óÓJPq« ´ïB–_“Nƒn}š凕J¯µß'·zÔ‘w•!¤ê ^|Hóx¾$^ÓÌnC| N•÷Š‹û‹ÛÇkuôÑX•ê ù°ÄÁ${Ѐ\d7øäêE0œ³º{*mï¹z§icÔ`!RÁ¥¿òT³+O”KA)6Rß?ß§ågPl6ôÀªûëîÆ}£ìwÂ!:3åÔãÌéðAA%V‚³u-¨›ë•V‡:àçv1wú¡Aðà0A”@{7ã¥0Øk{§X‘©á!<.®¨ŒºÁËÅ–\œâ/8|é\ 3ëܤós²·‚Göù?Éä´ÑUG² Þƒ”¾EFûu–-ØÉßÔjt¿ÏB #éIG9sÈ®¨ï"ãïPn}øSŽ=CŠ›â”§°-‹µžïƽ€2_½Í5¨ñ'O›>?áûL¿›ý=0{Û endstream endobj 412 0 obj << /Length 906 /Filter /FlateDecode >> stream xÚW]OÛ0}çWDÛK¢)Áv¾÷ÆPј˜¨´j/ëÜÄoIÜ9IÇxà·ÏŽšB-„„"ǹçܯso¡Ätrà¤! P ¢>úô÷ ÔO¾¸àOn|Zœ^ˆG‚äÐYm§&V¥óÃ=Ç;ïçꋳfÈAAœåêÍ P½ DŽ?yE»¾bž†¡~ôü(ŠÝËÆC™ÛŽ× ž<*½‹›(G w“HÚ;Y¬žÇ<’7^¸”¤S—`”‰“dQÃH¼’@Ï]å5 .\WwD9°Ã˧ÈeÏc÷éØà·atš<ÕwßiÛãŠ>à¦d ã˜Ë€áÃ$i¨¾û‰Ìž¶‡PIN×¼c·|HÀp¼0*ðž¯'áI­B°©Ê\Â[ùº¤èèÞ11b'Úpi‚þŒ7´¢>ë;Ž[…]Ü(J5ÑG¡[êkS¾vAx¿ß›˜¸Vî²)Xäî=èRAº¶˜ÉˆÙ˜0w‡¤²{ZcLÛN;ßTWãè{Á¸ˆ–­×[ƒ¬ƒë k8Â[Üv¸´N¼ÆEG¸AŠÒøÃ,3d¢Qô\Ò‚²F3h˜T]~*“ ±ŒÈþÞX=oW½Å%;-I«žlA6&-.Èq¨»I{?«ö~ÒŒ©Ë*% â(:{] õ+zË]Ö-‘ WꪺÃYޢőtTµãk‰†I„qö¼Î«7UÙ– íVàÊ6®Æ¢z4ÕÊË„Î4B´K> stream xÚ­VÏ”0¾Ï_Á±$RÛR0ƃMô°n²d/އ.íŽU l‰ñàßnK ;è$ÕL2ôÇã}ß{ß{-8@懃iL IpPÖ;äW¿ï°EÆ :³x[ì^¾7CŒ`Žrç. |W¬ ¿œAœ‘€À$ËÝΑØmA‚ImÉ~¨TÅq âWaDi>4!É@/4; …v©ü&f,INPö‰õ·{WÌ„BV"²…´OÏCÂ4…û`ŸQˆcêÖ'‹ôg쉵CÎâNê~`•3[ú‹F»ç“Ìûk×üÝhf²ßB DaÐK3:…$j+H¹r¥š¥kGÛ¼ŒH–>> ½¾ˆwçED×kp͈%N’Ò'IGÕ)hDóÕê>Ôlcø? Ê†Ë“äÛå#×®XYUý;zoë9\uѹZ+›Ä“¬…ë"µhª±iJ€Ð¥\ÙË;”ÏE5U6Îõ…¸<¶L37(òÇÖ*Ôsy•.ñJsÑ0Î:ÏEù±ôT«å´Ì=UuïÚRô.Y!øúR hisó°DÉ´G¦}áéÇAžl4>aG¡ê¥¶½–åÄyð1g\ªš5êÍ+Ïù9Ö²™Úy‚|“x¢ÛÒõfKºº5FGSPVtûç£ötD׳IL6Ù®âj·4ÔË o?n‹»ÕB6>ejªú™Z=nz]Ü^m”hõ:éD%J©‹M)±% ìÈë•x½ì¬×hx@ ð/Áû ¦8sîopÓEJ„BšÐéã;”[›~ ÞjÛú/ÌdŸ?‘öLý-•ǧæ*Çæ™8OSÑÍ—¥M!ŠAg7bä2lå ;¥Ý÷kµ:á†6XÎÜvmýˆ®öÓñžtVƒ7çC[©¨¬diÛid‡<-ÿ5䕼wM¿<õ¸4Áö¾ù\†Í˜ÿió™}[Ç endstream endobj 421 0 obj << /Length 2851 /Filter /FlateDecode >> stream xÚYÝoܸÏ_a´ÕYE”¨mžÒ I¯¸‹[ĸ—ËJki[éJÚÓ‡›EÿöÎ%JÖöŒÂ€I ‡äp8󛮺ŠàO]¢«<‰Ã8UWeý"ê?^(éíaïqüéæÅ«÷ÐUQxˆêêæÎ_âæxõSðÖœw?ßüåJ¡*â«8L‹|Žâ„‡ÂXÅW{o¨ÆS»Û'Iè?îöZ§Áû]¡ƒ¶«ÍÐö8¢ƒ#w’àM÷ëX=îâ"p”£a–ëëßïöªÐEdnöâÝÍtš4Žã¸Èñä¼y|¥r9ÕrެСJ4‹®wû4‹AÜC≛§".tDÜ$¦!Ã-‰ B®u J3Pïp ³tí-l•_,m”_G ü€2òÿKìþ²ÓyXæ:½ Ñ"8Ê„Òt½7smƒÚºV¾[æú`Û—{¬ì?™Òÿg—FQ`„±Äi¦6Çö¢xÈ’P9KáËŠaý¾ºoªÏ‘Ò¥AB|õ^»•ʉ×]%rÚ#S>t`l*x¨Êž ßW·éþõ;^ös”F·Õí©jëV¾ïÈ éóŽ ¼iqsV7‚rd|"XQ½¦³ì£0‰’åheǨx´JÃ/ißÞvKŽ_Gsâ1Öx!O¢Ì-šð¢:(Û¦º‘„ˆc¦Ïu±cË·°ÁÒt–‚ìi˜§¿ûZõƒ­á¨qcEW˜‚ †êL¶å¾ÕíÜ]ô<- [_]La î»¾¶R`"‰â0Êè Åå3 ˜Àùwm×ØÒº½û²J¢Ö "6ÒD£'€E±Ê–—ÕW,ÿlCU5r?w%BÕ‡³«œ×áØÙtr™K eö¥ÃƒÖ¢ùÜiÞÖçòf‡œ !;Am*0I#D-ß(2˜y`öy˜×ŠÄÞvÌn°"öx3­Ý´²YÕÙY+ DËZœdG%²èðŠ}ðJBð‹ˆŽf0¯îѦ7P.UaªSÇúÑqûÔBž8¬ÃDg1ÎÞ§`û9Xqœ ‡ŠÑø-/Q‹ðÏ6dx4 ÃàA\hFÝTåÓbn¹O-7˜¯–û-„±æOó›ÝA“=¨ü]ûžÆñÁ.â©Ï‹²Dý.9ËfƒÁÚ;³Ùr»0À³]&FCÏC~Þa±œªÇNVzóéíwd}ßñ÷¿¹A¤ƒ¨ÕmÅc£¬Ž†Š×Úþlfÿæóµæ@,šûúÝL9D _ãËU}î*pàšA4ËÂ"VÏ…QR›­ú—xºlâv<9ÑRzd|eyp64î]ŠÆÃ¨œà8«ˆrªšƒAs¢|åÕL3€<„¹@.ƒƒ5ØÆœªoàì¤$¡žZ}¿¶]‹‚külN†bghFƙŃaÁQ Âi‡r® $9¡Ýíó" þŠ,pø£‘ AàK§‚½ëØ·°D« òdØøA«á(a¯ýf{™ JA†ªÆË'æ ¥‚—8ž€ùÔ<ÉœîÇÚÈ ökiû~޼}c¬]¨[€å}öæ„ICת@l°ëÐ Ц˜¢íÖv6dSOTîüžëÈâÔŒŽÛ ;wm’m µå-|”È@K:~wŽÔ[O”Õ¸tãšü»ÁhG†c»ºgua½¡{òq¢žFJ3)26.‚pÅó?ÀNÞ‘’3áÀ¶ä @gK¦ †ÇíŽ2@—<Õ—0T~ê®dlÍúîì+A)o#ÿ2ðd ,¤µhtxÐoDO0+G?ÕÂE»é0ðGŠàGÓ~1ëªFC˜e´*ŒtŽe „ ô*ǵ÷Ø6ª¹õb|ùvZ9`Œ,¸û“§FI»ÙÒsÐ,*ôç—r³šï«F¨¬XQå‡PDë(‹C~¡xs\{mãˆëÅH.‘Ç%xSÂw)¯¤áª9V€£©úeòâA’sç ©<_ÚÝõ¢TJ ÜˆYCb“^ŽGÉ2«ÒMç`=eRF¡rP; ò‚¼°pAGÀOÏdP@ªiè€xÍ"o5E$æâÖ;þK>~…yT,!E¦ö½„ÔÓ ³{å,-vj)]Ñ] ƒ¼€’¥ÒaR!ô’ô1È2ùhÝ$ÊY6Bö’¯l;° ‚Ø^@|7e Ë(€‘¤Á[ˆc¿f€/ÃÍRÑ@ØPt|ÐËØZÖRYµÀÑHcí×1 m?ø†Ç|¸I[Ÿ¡¬¹­N’R q%èÞSž¢×™¢Æ¬oAÐ 9(ƒ¶„5G&Ø·!•eâd/½[LæÎµŠm¸ [†—Æq‚Ø@ƒ˜z”¡YE¸M?ºm« ÛŠvs….Ýx쯭ïçÉR;ȆIU/3Ú‘o¶ãŽ€a\Ä­Óü~õ$Šö×¶¯Û~#zIáÎyÖd]F’§¹“ >Q{¶a P€‘Ivxn)îò`^ 8c^¿Ñ骯†‡0;zu‹ßh I¼™Ò.•xi&Þ_/³s,¥Ÿcä( É…ðÈ\Ÿbñ§Oí8ÑÀ„U<¦«„‚ÎEo²£ Uˆ›‚P…Õå+sð&"蚀>ÑÊÂtÅÊ!º7–ÞA\š¾efY¬í¨^GÊqÛ7A6Æ~û…Ê~$èÃùuá-¼·Jv îJñ·x÷éÏ[¥gu'„Ìhû½ËK»‡…[Ô¦ßÚö B˜æVûøöÿÛ•“ãÇ9“8¹§®u›…±FCuêt®óc®ó?âCè¤ ]oVè¿]ÿmt¶£V¯¡H‘­ÕºÜ9I‚Ý£2fùÎLòÆ+ÅœPÙ^Ðlû²•"Ç0iñö¸Ø~ìÍ–q ²ùx§/áÝüê¥csK‰v ~†0%ø‹….çåŸÈíS~QI}‘T&%€J)Gk›[‚þðìJ܆ 0 L ¯{üü…ÍgÊ6p=Dnr€¨Â ¦P¥‚Bø/#$Žå[†î‰kÅÕŠÂÚ¹ªîâ³Öeåð`õ™¸ë&Sš"bKXÃ]ˆð’!>çÍ%,ÖìIF*ÒJ‹è+¾œs0o“Å7çwŒ4\%zOK.”Ñ14¢Hpkƒ¤yôf·Ø3›Ÿ4 }ºmùfYË$ þo¸þô¾ïfÎKì£á›Ì7þxZk#•xÁI›¦´Õà÷¤<‡x¸q¬Ç –ÀÕ‡—ž&W•0dý¸‹%kL4ô¡*Ýëæ6JÉÏV?¸šµB©³SBüqMùô@% ŒÒ¢kÑ/v9'” G7ĨåDœ•Þ1ñq©MwZ†Å9oW\ÞÚý¸ßÈÂÝkÀûœV~YxƳ^YáÒ)ꘟ¸Ú–Ô<" D~DŽCÜì¸> stream xÚ­Ymoܸþž_±ßªE³Œø¢·Pàœ‹Wç‹q_’UV²­ë®dK+×½úÛ;ÃJ”̽ØñÁ€©RCrøÌ33”ÜÄð'7E¼É´*‘›ýñMÌÒ¿‘ü´ƒ;oÄ_®Þ¼»€G‹".äæêÚWqUm>FïË»íç«¿od.d®6J$yA=Ÿb¥©K(©6;¯«9‡n»ÓZGæOÛ1It±ÍMÔõÇòÔ Øc¢Štô}?6[•GNR•4äÇ¿þ¸ÝÉÜäY”f8Ù›®¦Ý$J}e»8â+û•±…1›47BjCëÿž–14íVeÑ©|ÜʨYœÒ®M¦à7î}'éuX¤(Ò„^ÿv½»H3"-b «²Ñ&Eô_j~¡áËu©\(3½ð‡íNI³'ñ, «êúªn˪œ¬Ik¶vœÙŸš}M=§¾©šcÝM×– ¿V©ót‚ý[|ûĪ>Å2OcIÂæ–ôR7ÒÞ5œ|¦_¹wÛü'd‹<-<H™J2µ§$¨“é’v*© ϲļ? ÑÿýR8½¥~ð=“'/ô½i¶Ÿi²ThU,7ƒ€¨Æ’ó X9ÓžÁ?)6 .b$)B¶¯9"Ø8›c€¡è/£©šò—) <žÆÞBN„Žÿ§m®=Åpæÿ#/îl³Ú –‰Ÿbo1‡Úw«`õ ºïÞ²d÷c b—HÕÔw€•7í-ãlµ€’²ºo ×ÿ#LÔ'³¨-©½+~À8= öøë–dø¯&qÅí¾üBq…÷Ö-·8?PŽÙ0¨ƒ1p?×'L†'•G’–è›ûºça×xäe`6p$­öŬYï)š"ás£§Ù—ß¶L\ˆ$K—l7œ˜à8ÑÐvÛEj ¦H¦Õ€¤¯iýÀ}Ö’Ðq?Úxˆ£’TŒù?¯»¾­²ÜHÄ õ8ÖNƒ‰poªãèb_gxü0ÁÀ£:{”ppö”wJ†S.~Ð0¥“8H#9XQOqïý¥ùpqLý P/e±Ù3†a´VEIIEÓ—>©‚Ø¢1FQ&ã(ƒño µ‚Õ«'é°±>MT¢€ìc½´ooh,“»9­%׋ xK½%5–íÙ³ÉE“P(œJÈ¢\~ºÊÞY/btTT8À3åIØ ·Gžã{„ æ'[ÅQ8ó(”†MÇÿÝ«GÊÒ+ö¦ž¤%5Î?òÔºº…unÀûµÐ°[lŒ÷U¶.ëç3 ¶ÉlãQâ’ c¢°Œùæ;’L¶A@Ë";8¤^¾?hX©N}@ϵ$ÑB‚ÙªuÕL»$j ½®½µ h’ ¡fÁIvJeö¼wßÌ0C]+ 2«‚ãS†fMtî;û» KT%cRU$BS€½ Í?+¤²[À'`Œ3Hé1‚LDkzícc/”‘>ÿ³![Â*·å‘$#·õÒn…‡æºð€±]f~3f›ú£PÅ| \0*£¬zZŸ—Ç5ÃôzÀÕÖeK‘½¬ŠR)WQôlE{¢U]aVÁ®a]ÅR# sºíªØ}G¯T<—9´Ë GzLº8„šc=Y Ä%pØ#ÜòÔq¾¬ {a´°K=°]öÌÎqY|`W\ù¦ ¦^µ¿N/rxJg¦úÏËižXÏÄ‘k]ü…G°ð4Òñ1ŒìPz ‚ò µYÝÏ#‡ þÉ)¥r…D—R­2X‹„@j8¨‘ý–…®ÇSë.I‡¶…O'fëŽ{\DÄ$b_M§X¦lbj“Û€îÌéNŸ¥»¦!¸PHÞš#ëœRbüU5¥w[pþŒŸ\â¹û†Ò1þÙÜçI &õY>Äot?dC¾DJâîLù¥Ìe0ÈLÝWÀÞeƒæÒw^È#ñ¾Îd/¬Æ?ÊÏT‰=~TÓ“žžÌçà’!:(=ÙCq¦&•¹\•q™¹Ñ Ÿ³ ™N†M÷Ôl60߆œúµ7¤™á½¼ÌâñdÝo²½.Dl¾Åôˆó‡—Ú…¡«ü»Ç?†%"S™!Ý%Ê“õ*°dqþ0U–ØÃÄ6|ù‹=x˜Ø®e«ÃDFÊS{U†½<è8ßø.S8óUþsdÇ­š‡fèØ·nA|ãÕ¯mÝaN¥’èoÃ` ƒÌÿÐÇ ®ë~Þ‘Ï7ûrà§õwÛ‹åINå I[­(…s°ß¦“U…a°Qjr¢›Ú¾’œÛË•}A°®û<®¥ª@F¬ ü%༂æxw€2æä9¢=!¼üQëN³•‘}êaßnùF|ÎÕLD‰~þý?_ôÀÉ endstream endobj 441 0 obj << /Length 3058 /Filter /FlateDecode >> stream xÚ½YܶùÝ¿bÞªA= ÅCGƒØÄv"±“Æ-PÄ)ÀH²W錴‘4[×ýíý.ê˜ÑÆ‹"XRäGò»r’‚¿dW¨]ft¬]²+OO”ŒþëI"½Ÿ¿~òÉ è&*.T‘ì^¿]nñºÚý}áïö?¾þË.Éã$×;»¼à™7JžŠu¢w‡ÅT3žÝþ`Œ‰ìŸök]ôbŸÛ¨ëO~윱QÅÝô¿œ›û½Î£0Ryyõê˯÷‡$·y¥9öäù뉧õGÈEˆÐ›(ÖîÒÜÆ‰±BtwºÛ¡¶n±±Ìl®£ªÆ6‰Ê®çópöÇS€âIYKÿ«úă°AÕ=ÔÃÔeóF%¶ô•xIÇ}Oõp’î[dÏþr®yìÎ÷ž˜HÿCbâÄ1úÄKÍ4œ96%â¯s}S5€îÐt­o†§0ZØèï(œúgÉam’8³Ù.Í€a¹EóhrÁåuX€mpúr3Bu¨ß(£öÖÚ¨üïÞ)ùŽ1qĆ»?~&Ðñ£à|GÒŠwM»O"À6JÓK*L®âÌäK*6t%@}„ŠË͈ B 0l9{Ö„Ž‘¹’s[ yew:°u!“Åì6Ô £fà õÃÔ.l[Ô‘F,«9‰soýî ¸[MÕÅxö'/2½ƒS‡´sÐ:6 #Â%àö—êèYÓ³ p_Œu„Tæ)h‡3`mPÉß²_p.Vy¶3±ÎÌ•ÏHM LŸ§š² bÅ5û‰KãLèd°…ðÿ˺;!Ÿî›úß`ÚFç±96<=ÔcדÃÀÄ-ü S¢^UujZVªIFlwâ¶û ùý\£€M‘+A0,ýàð[L>dIÝÅje¢U`è…æÏÞOdz„¾ZŸƒ"n‚ƒêG?ùZTCP’ÙBŽ%8ä˜9ü…‹Ë›ïά˜&Ïš”èzHÃ`º-¨1{møJæ, Þ€=X¥Ñ"qâAZqÎó&­©Zx. b©¶\ÞÊ`êãB¦ø2cþ€}Ì€—¶s!ú‚!0Å aÇßk~àÄ—–ªJëH:žAVªJç϶°éëýyì ¨6¥Ÿ‚Ч"²  Ö¤pÄÐqoÖ|øðÁËÐ:âÑ;ô¥dR5³~á@%}èqë 6¡q¤“ý·ãÐÒDxl¦.'_&Ñ¿ë«0$84‡Û®ŸµºoüÃý¾û©¯9TcB¾ŠcrYœgÅcsöKºpè)7't¢3YRa´DÙú|£œêëÑo;©jÞâóúCS .Aéx|’;ƒsÀ©¶“€·–Œ}‹'ŸÞㆠ]ãÌ ÖšÌÆÊ¸•Ö´âb~Õ }ûIuæ.Q|>Ž êÆtLÅ,ÔøA!ÂN1gì};P‚4‡§}%Î!%!D­cÇÍñݹ%)‰ sd²2Ò´jƒ«E ÁA°·ÐÐûªç?ûšì »,ô<(2v-7s°wA¦Ê"‡.@™# –ÀÞ[Ö ‹8Ã.’èâ×;”É?YSÛ]à!Mòèù0xš©1øìñŒdâŒû}ðI³¾Ë2’, oFºŠqI)@Ár-:É«AñšÑ/·JÖÎ/‰â-bŸWCÖ¥)çŘzå*BO‡c(ª”Ü4cpÂvi_0¤ŒñÖóW%‹-7õ±>I¦DjC}}H‰‚KÃe'šQÕ­hŒ Û3b;f…µ¶R€šSŠŸEzeߦXJw¡› ÅÑSž“n¸!â±ã¹!¿gHûÞbpN@U˜Â¥˜Ò¨{dÁR^$°[%'¶ÄµÔìuŠŸšU × ÿ»?`«£Ïä“››˜Ûç,x˜/3–i»¹{Ðë²!7šÚUÅ›°æž𠔆ïÎã¦ãô»EøáŒþSôsÙ-‚*×gˆgÂè-Á:L‡ Â;ÒG!–V2ð7ÓK–ŠŸçÁWI5&®ðc}šĬ¥]€3i©r˜µl>—ìm¦‡îQ=¦¤ÙaÂw<·~C‘×`J»V&!`2y˜ éšàà„ŽçÁðA&RcW©uu¤ðýü\›ªö­§Â4ÐËLÉ&WÆ×òË·•§æÁ•‚nJ£'>°#º•a åì¹%ÝwÂÖò±ïxáÊIqøÇáJ6½£>µ¸·»Ø[àE¸Ô¿Þ#»¨a’59EÄPŸV¡|µèN¬Öá£l¨¨²ølˆ¼”=:EõŒm;tðïGYHÏgÒ b¡¿ê¸LŠF Në¶§'ÚÝÏ5üØÜCåùÀøú±ÙLöe3ôòÙ#²š—&®rî¡8dÈZX ¥²¯[Ýá®@˜’}·Îæ«A8Ì÷KG> Õdkë´ˆ¶—;ëÕéñië?oŽ]›#úÇzHì€Ó˜Ûáçf–„ ¹Lñ¶˜`U;1 ÚFWÇv¦è[[¹8ÓY€HÛ ¢Š8Ÿ{ÿÀ>.{Bî7@è`Q§•Y;€E"læÌ×Lù­É®Ý²]»e¤R3W 8Œ<ÃÚÄ„¡–ˆd!‡Å‰E›-R€‡ò1 öµ™Ð®Ü=B-£›ÍÑÍʶ‹„pÎÓ‚¢y^RX Ù ‹î¦)þ¦»§lU"â§D9nC°V©Ø%î·RÚüJ›“&Éå¦ÕylÒ‹@¸rààÔœ^$ØYH°q˜ìl™`ãèf‚M3äH¡¥œÚ™P„Ή,̵Үïò` $ÔŽož Áˆ©íúBÊéÈoÃ)ZB6JÂõ¥-—[îŨ%ë~gI=•›dfÒòÀFÝ2[[°Ææz ›.Å=m¬Üš¥xÂøÀϦée(Ù” ¤× áËŽ¢º²ò*¢øÞÅs·~_‚©-lVq˜ÅvöËÑ­ò"-V&PZ‹=^?šX•ÆNe;­mlòâG“uX€m<7\nö+&Hƒ\`÷‡oB¦A·Ž3±ÄQ“Èñ 83 ôÝt?¥.žY<7×oqtoôu’ÄÚ¼±¨Ãlë¥èb³` ×T‚DyýHÇó×!ïJÀ©F;rù^z|*¨¤bkùêG_z©P3"ût®èáâ‘7ˆmÕ”ÁE›uTU 1¬=ɇºß¼¸Ò*Vi²4[-O«Pa—ÌÁ$…du«Ê†¹Ä‰'@„Õ1X€äˆ¾ »²~‚‹b‹×QÞ¼˜”Ù|ÿ bá"ó’W&óÙù=ŽG‡‹›+.wPòRvŠ|Æ]9kÓwÃv N'Ï?ï Io2gÜWÕÝàÉeO êBÌTƉ\Ψ90á] 7ì'EàÌúMaÚŘIå]JqÕ:Xãó•ÆÓ()©Oçw¬Éï_Ui IŠ®·l„@Vsc°“ aKmÖ`—Å.K¯+±œ+±ûÂȯ¸¨ú©i÷¢*TkõÍc97œÁ@D[§®Hë«Wà~éÍçkñ%¦ˆ'þx;ÿW¯ùƒŒ—Í¿à@vùFÉÌkÙž^£’°bÞP:qÚme1 M±>n¾ÿâ+ò–_Å<ð|/¿i(¶ð£e™¼azªg?ÁoLcGk¸!…ÙεMÁ¿±À._’Ôñ»xË+È™Šá|ñÝßn6KeHIS³Ì¶>ï#šðÆhò *¬|û‘‘â‰ã—2ørï{¿…R ‰KÃQŸõòæ¯ÿØBÉ@tOM€‹9ÁxÆwi¹.%>0M‹œ§ß~ËSQŠªhþg”QpUãÇ¥•á0‘»ñÝL—xDfFáb•kñ ë^–V3Tm¡ ñˆ¸ZÚN&“ÄÆü!6&9¤5ÿ'Ÿ¯î9¹tÝ‹œ‚`V ÙBÂY¦ ZÜks®­ý(D‰"5›¿âà…‹‡ð¤ qȾõ}HÀE­1­ú˜zÔ endstream endobj 304 0 obj << /Type /ObjStm /N 100 /First 881 /Length 1590 /Filter /FlateDecode >> stream xÚÅYMÛ6½ëWðØ"“œ’À"@>ºA€¦ ’ H»ÈÁ»Qƒm³vàõi}ßÈ›À+9+[2š“hz83ïqf8”ÈGçyrì],Ù¥‚_êB xf³â‰¹ñGŠg€tf<ʼnÉu¤¢ dÔ(žÑ»¬Ð’Ëz"»’mú}Æ1¹‚ýCˆ Š ‘¡›‚ D¥"Š$[•]`˜$ÂrN"Ì(ŒBΨI¡‡!œN2Lä‚å >¤Š qk”ƒ‹ÑLpt‘= ¹(«3 ƒ^FM°ÅÅÅdFÅØñ@ˆ±Õ¬ÐS(T$ ƒ=æWèQ5šðKÉx±U˜%³¥É ã/Ó.ÆW»²U$ LPÂòT´¢„™l{c¼ð×RSLGØC ¤Œí d‚ŒA‚fpÍ1Ø@Û68bö¶J0`ª¨@F°cÐêXç\0Ø*ÉqýT0“±Wޱ±Ê@ÂÙ¦„ ™S0Q’Í“à}Åp ;ˆ5‰dn&'ŒÈÛSFÈ Ã‡àD` œh4(³Õ†ö˜œdðÌ€$غ¤°ÁÍN};c1 ¢«A†.µÍ7®µe"ŠSdð¨¬6Àrñ ͆c„U¡¡¥)МŒÈÔdl!´ø–Z—<Á:ØOÁ|Fø¥X`¡• ¾:9©fOÝYgÞ½r³·¿ÿá@=X¨Œ-n>~|W=|ø-¹c¾#vº\¬Ýɉ›‚@ÙˆŸZà†Û1øHé˼ úoÇ8þ2 N6"P:{¹Z^¼nÖîÌÍ^>=u³7ÍçµûjïÍ?Ÿü1ÿÐT³'°Ý,Ö×óvy5{Õ\/oVÍu[/Ú©ÍûËùãågwf–-cAÛ;˜™¯°ÉÓz±…Ú*Ð6ê—»Ìte4sˆ¤æ.î·¿žÿÕ\lV<¿ –Îz?)OnŸÏ‡H Ü#)ı$!CIêȈRíœ{t1vøãSúĤ½ˆ¡Í^Þï'怨ØN˜±™¥‡-ÒXl‘‡7½#Hê¢á M¿ËÇ×B1–ò} òh Ê”±ÅᾸ§¶Ú+î‡éWK’±„ÐÕ²#cçHô|`LLŽî§Næ1i¾3Äwìµõ tÔ'¡¾~öh±XBÕ™³æÕ|³ÞuóÜÄ¥u®öì¸Ò®«f¯oÎ×íïŸ/W³ÇËÕûfµ±éß™c€fÇD.õ¦õ 5Z[´T¾Žj=jéyífÏ–o–ÛðãOæãÅåüúGcj´Ù¨¥F7ÿÕ6Kª“õl÷ؾjVšçóëfþišu4ºµ Gýb]¬m´<ÕªQ‰ˆ;NIu±v8§w¢½Z"ˆÎÿŽL_47‡‹Gm¥äËžG¾Æn-¼yÔ™°£6ØU1µ6h¿0*%C'Æ­KÂËÂ9fÓS¿Ð|έxë¯]œ'Ö<´Lu½َE»†Yú[ÛDEvfâ³fyÕ¬W(zî—ùòÁO7/áýbj´Ìô¥.ÈPPi!”ZE'¸Ñ†D™£·»ßæ$Öi6§#(׌¨ýŸÛœ{°³ ;‡aØ™ ¥Í^4·íÉýÈ£c ëQ{¾1›[úm\Þ³+ÔÅSü÷Ç“{x6o=FáIÃÁÚ‘F¡‹yPŽ)ÕeH.@ŸO“®6œH@ÊÇÌ ö½÷@ìãHÎíEë±bhû¸Oìs›ŽÆ–F`;jË¡WÌ9ø±xBøþx´‡Gã‘ïŽ'†>žýê1ÇÒi)ùöÕ¡}˜ØR2ZJµo !×´¹PÂ^cÙÙÊ.WWóõÒ_.æ«Ëåä6’½Ô(\!Yqµï*Š¢x°iÛâ8|»##ŠÛuäa9е} ’‹vq–4(²¯Ã>§ÃöewrR¿àS<(H·Ñð‹ÿ® P§<:9¿ùá(؇?švbp?ƒitÓÆaû×>yr&G uÂ}_5×Q웩¯Ô«å–î¾™ýÖ¬Ö—@2ñ­”W\G“‹1 –lŠHD>HÚý‚èÅ—ÁÁßûÆ­WóÅõŸ–Úóéå$ú\‹} ÈFûÐxŒ÷Âb”ï©ÿƒ]Þ endstream endobj 453 0 obj << /Length 2807 /Filter /FlateDecode >> stream xÚ]oܸñ=¿b‘¾h/#RÒJJ/Çι¸8íÙ-P8@KôZ¹•´‘´Žƒ»ëoï g¨•ÖŠmLj8‡ó½ræÃŸœ¥þ,”P‘œeå Ÿ¡¿½<[Âb€ñöâÅ«˜J_¤~*g7CùìÒ;Ò›ùÕÅßg22Q3%¢$¥•O¾ hI(©f‹ÁRÑm×õ|¾ž/Â0òNæIèÕM©»ºÅ•ÐËix‡Í×mq7W‰ç ¹&”ßÿ2_È$Lbo™âa/Ž/úÛDJ=q]Äxx_5¼¯„‹%³e „ÄýÇ““9l¼·§g‡¿þ‡æ¡áº¨tó}qcoB —€ÿ’¦¹î4ÍnêõºþÖ"Ëû^È@$ÑÆH$)ŸùN“8¢°¢|ßÓMAàÄËêrÓSå¦$¼¢š«ØëLѸ¹!Ô@9Jo6p´pk2Ú Òc›ùß‚pj‚}òe´í¶š7™Áy¨ Š4 í¥Óâ! \ B±ü’°H†U‘×´J‡šµ¦åÓããcZøäG¾û’Þy§«\79­=¿µÏBÀ“u­»¢Z-þaUŠïJk‡MÑÝ–¦+2˱?æ:<;?}ÅçIÎã¤ôâ(\È4‰èkA«§UÛ®£<Zßøxm²®)2½&8°L“ã¹ô` eÝ50¯«"ky©Z•1M LÈä^¿DÖ¯é9¯nGœã7;ÃòS¯5«­U˜ƒ&)Ò$úF‰Ù‡–áG„•ºÉM¥?ù?ÃÐËþKÛjVá±Ñ$‰ü¸°Ç¿œRóHÄ*v×Åjª[€þL S±LãG©¥ÂO—ß©F€˜¢eðèF×hß­’ÂW© '—bU¨uèùZaYýU‘‰ÚSàMS”h(€šÞz»Ò >‘;O•wܶÖ"r‡a¬¬­&oà§ÁåUÃaq£M³®ØôÏŒ˜9SÉuθ½ã‡!¬ñ®àÁ.eí¶ÖnW9¥õmÑv¦ÔÎ+£ZÒ´§NNù|[-‚ƒÝ<ä¹!ìÓ¦hMË0Ð|ظIÉ~q­^o‹ÎùûzÛ5.,8vÅçRÐW²¶C( v¡$diÙ‘¼hë^14¼WiÖ·º\´†0µ[»ÑÌê¦1­ó…`äù˜<Þ±ÏN-ÊéÁ„$~I?Ó½ç‚o”µá)¾Ø„i¤+Ôòù†æ´dÊháR‚©ï+‡b¦˜–ô†p§B%O2œìl™t‚’¢ÄâùWN°ÖJ |Ýâüý(3üÏpút3p×4m·Óé¬n»mI¶„ßì%ÈüxlD¦Ê8`6ºè¾—Þñ=ª2º˜ bµ%—dî3Ó¶ä`kÃÀŽ8ƒÔþßÚ:7ä‹#cÆ®«4»Œî›¼~<Šæcw©Õ¤ãõ—Â_J'¿þëðÝ””•©Ã:˜¢´U"Ò=¡`"5ENŠeìÔlJíEÐG—£>Ÿ]LQ áù{¾@êËÄ÷Þ™N¯o ‡Ë¶cðiM¼I’—€ïªæ=“]( XÝù–B8j;ÌM›5Å~˜¬ Ì™ sûVcb)$˜ÞXaúwµ8už™Z[-¨å3ÿFWh¾€ÂªtÉþ}˜"Ë$Ëe<‹‚@¤I‚90íâ MvX‹ÚDi°OŒ¢‡™H,7¡PBâ4ö.Q³®¾ÙÙ¤<Ìzï³€B-A ×u@f[Ò8°3^¸Á:¬¡B½ãšÌèXŒ*‘WèB@¤Dû lBjIP`ž™P„“È”@Œ,´Á]jV“¡£AÌŸ,-}m‘m‰]uÐõ-#ìG“(ç¥ÂöfA^SR”üøQx©ÈŠÚ‘qôvjD©-›ž¡W¯NbeK#ÌpÁœ|LðE¨xS(¤HþRy¿Ú§¾«ƒ}~žGA‚Ya“z°jMúr@vŽ Çå<[Øv”v"ÈLn±ôy[Õƒm™¦ª'Ûˆèb›ÔXF¡À¨¬«Ž¹dãv_À}AÇÊfbÛR™të‘AÔWXΣÿÂRIJOúOÏžCû,ÄÞf§]}ÿ #z×÷-¡ÞjèqúÂÎ=ì×,€¾Ï?ˆp1[ Õx~(’d/e§B2ž ¾Ü¾Þº€—x&ÂAsÁUйlÕðóºUaL^’ƒ¹#![]rð† šÑMg}QÌ‘—†Ýô‰ b‰†K//ڬƳÂäB0w&Lѵ¡;¯ŠŒ ¦¡?É­hqQõMPëlì2J{ÙK ^ŸÜ' ¨ŸrT—ºÊ'›œï8%ê°/StyÐbÒ™)úJãS²2µÝÌû@K°Qër" Õ»õ‘cÒ}nÔ¶†1KÓ§bœ—?¥9;ㆽ¾ç¶Y‘~ìŽÂ®1zúQ?qÊ.Sð…{iäOu½Z/êë/&ëþÆYÅë×oH£©K4Ò„KþýâwþõâŠ*Q4Ád$y‡˜››¢2ŒÝ~/¯ëu¥K3ÜíOqùòÍË+š{‹ßÌ÷o5¶ñ‡Ù:4™È1‰?øðŸøÜ›bmì©5Ä¡¾~”ÅÇDñçPÏÊ´°5ˆæ“·õÁ/uÆ:b±õ7†Vt»Ñ¼’o7kÍ= \jÍ×-nûL¯ï¼nb:™ntþÅ0œœMÁäЕ“«òûp]òI®Ó=•wá)*`.ùW){/(w/DÜKÙ_vÖä¢lÛN)â";—WäÊyp[\®É™B8¯àöHkˆª åZ7 Om Ï€÷±¿­8òS¨¥PIß9ýãÉΩã[àpØyd „€’Æ-¶8Áß9ïݸNÝ`äR©gÄ #G¨Üa7²¿Ú¢â;Þœ«âíÃHÁå2â~ =6õçññ(Ÿ[@äL“bTØÊ¥÷¸òÎ(2Ç÷¶î ŠÒû&\ã|Oì> endstream endobj 467 0 obj << /Length 3009 /Filter /FlateDecode >> stream xÚ½ZÝÛÆ÷_qp_(ÔbÉå·›>¸i´Hã6¾äÅv€=qO·.Eʤt1R¸{çkERÚ“” œ–»ÃÙÙÙ™ùÍ ßDð/¾©¢›"Q¡Êâ›ÕæY$³ÿzËh Ë ÅŸoŸýákÆQXEU|s{?eq[ß¼ ¾ÔÛÅûÛ¿ÝÄe—êF…YYñÊ»H%¼ªXÝ,'Kv·oºÅ2I’ }¹X¦i|½(Ó ë7z× ¸’5’àUÿqoª ÜL­™äõëo¾],ã2-‹ ˆp³g_ÝN“)uá¸Hqá¼q”†UšÞäeÆIÊòÿƒ„éYŸ16Û¦{Á +Ír&Á~£àr¸],~Z¤… Œœª±íƒ–ñ@ÌÖ{`kÛ…*‚^âA>5“/ Ë,¿%„Q,âý{'Ë‚ÚÜÛÖðø¾75pÌŠ,øç¯þ“1ÿD‡Ÿ8ʢɣÐLgã9í üùL·–¤ò0‰â 2áèOüóK¦f’éíÖè^·+‘N¦oêµqoÓÏ·}s;#ù‚žßÛÆÄÏg´BñòøÀŸÏhêǯ¾¼I'Ãû;zŒNT…³ñ¶œ™e/UÆQ27rZ2J°Ã´Ëå߻Ō|6˃f×ñ,ûŽéÅ,ŠÝغ Á©Ë,x ‹ ¯½ï›ÝÈ»æ“A_‡¸:ÙöˆOÝÆ´è6;¡ú¸×­[4ÃŽc„éy¢6ÝØR2(Ïš„± ]Ûެ젧LÁ3 ;`o[[fSÚBh“ íœ·îùåm¼Û‚ïö¶ã=Æ0‰‰rvXº(Nr¤™ÝÇ+ŒŽQ°êÚa×ïßEI´Àh¹ú+§sË_l¨TX رzî3‚,,Tá(¼& £ó,`˜<¶`(x  zÃÂõæÞL£]»²šWägàÓGY˜fÕµ²AŽw´Y×t„Ü4/‚Uou zG  Å`õ+'Žò°Êc'·&Ïù’4LòÔÑeyü°á „ްåDk㪘ۙm-¹Áà¾I+ 9>óá äOŸ=9wvàç3šòïî&>‹ dÀ¿xDñ!¤ËWeX”ñÿv!Ìè17}!¹7ð7®áoœ¶àÔxe /Ê2â;šw‡¹ôž‰*yŸ) `JF`†A|“Ù”EX¬Øòé3”OœøŒ®F޼ßu¤ØÕñžtô´U?bIa>è㺠)±Àõ0ÂTaÞwHk“ÒÀ-G*OupÄŠN0˜S‰Xâ"„0Ç| ·½Ñõ{¸0UåÁv¼ñµmå€qvZÒÀeA eò5Ls^ð9#A¶£Í ÔK³œ¯zBGX-N(üÕ¢#8£ Ÿ¨›¬âñÛ¹[óþ…äU`ˆÇ*Âù8)¥Viª4™ŠîQ’£º ÿ1³QQà/iv]äk`G=½ØÕ˜`<ÿÂY¸Š:$b÷ú·F“"–à3{™˜gœ°`d2NžÐ;hR’ö œþ»n'¬<í0tL×NnpâÁ¸¼ßˆn¢$L“xT6f¥[;PæD°O»=">¬9dñ¥·+¡ÃŒ ÷ƒ›cÐ2´½Á¼_¢Â3ñnÝë¾î TU€œåõaÛU³¯½p“$Æ_Ïéèì%]Ê?Bœ ‹“Ë\öš"!Üÿ¶aÁö‚yD8ŒDÌš•é§µŠT" A¢ì\±HEÙ”«wœƒýª %‰"ò–󖃪Ëx̧ùl‘ Óò(Išõ}Ò8%+¥!ä·å­¾Ä>ŽÃD]áOyuu’äá>`<„>«}¯k·ù¶·cûiÞ‡ÓmÇ‘)ŽÕU~¸^ËúÌq½KII`z¯Çé|ïø«Jµ0¢úoS×’Þo±Sæat1ÄÐÅ(GDéyD(âK)HÖšVÅ8; šGw{Èxˆ"êæA÷ÂB$ƒŒÙ¶® ÁV•DêPMX`½ÀÕü)|¦@]æIy–&~Xrç` »ŠK…âñÛ¦Óõr«wK)PÀ6’Å©:Á¤\cTS¹}˜$T„?f&ö’A^‘dG­…B{å„N0%ŠÆáV×ýüÄÜœ¬±ÁË|+¿;—<]¤Ÿ†|þŬBÌzo1É5tO˜ºéÊÔúÐv!êÓQñhÍÏO7P¾Gmv,Pj·n'¨@\!Ì:nÜa °“9þ W¯ ߦ>-ض¶XtÈc.PÎB5Îd’ºº<5-%áÑ¢äÁkR5ãªw”‰2W.ó^ÌZU«C_l4G§Aj8xƒdfi~=LýÎÛ`º¢ Jòd^AJ|h˜ûÀÊuÇ>‚ù@œ”Ùf¿Ö}ÈÛ [ßìC½LLÆPZ¨R¢” …wcc4O‚WÀåÏO‹,)]çÀ#p„– ~%æóz„c„ð¡5™Ý4UÙa®B«Ùüˆx œÜáð]ÛÞcÜ;FÓÎoŠ„QFÊ8혦D ‘‰Ì†z]ƒ‘ÂÖÇQYÌ}Ü¿«´K×lžÀ ¸•Á$C÷ÍCGؘèeúÑpö—‰Ð¸õ¤°kúÜwyЈÏYð8` ƒu?ÀõrØ÷÷ze„¹á—à,tˆ ?ŠæzæP¨I³U˜½:ÕÊ0;S| æv,jÍÝ%xл^s!9»BYeý—Áƒ5=à5ˆ %l¦ÀËk[aúˆÝ$§£F%¦hácrµæ\6-™š>‘¬~+(}DØ4k‰P¨ÄGÅ<‚©Ï{¡¤IpO_5|y’¡£˜Á¶Ä,±3çªfç¿ôI4ïT2acÇOeÂÍu]sÁc¸GןoªBØ.Ýá\*ªŠ°<éÃ7kP7î uö;€Gƒþ#“½iôÊ‚§ÑI¸ Áy¿²9ðûf͆:y{Øs;Ò`¾ƒtT–wÚʾý½i°B.ÇùÆÎ€˜/¿¯ÂTe×cÆ oµ Esq‘Çáê»~à†U»öÊ„™íYv%Œäµ¸g•\/®½y¢E¨ u=+ŒlI¼¡:\UÐï-¥:?r£Gm·Ó=ñòi}4C™&í ͸b<‡Z'.gŸòìŠðFY4~¨~äÅÕYUŠ/®%ùš¡ +H„fÄ‚Ca†åD/‹ˆö5uûpž»}lÇ‘ ¨žîñ¹uø]Ž3%©‚_î þãÏ’ÞOaª Ëã/í\ÑÉpùs²Gô'?.sùØù¿/ÿFΗ³ƒ²ÀŸ½Ÿ–gÿ+Á•ó>ø¦^Í$RcHËw˜Do˜vÒ5—·ù#4¾ØvÂ?ÇâêÉY*Ê]ßÈî„ÜuŒf©›ãÔó ·µXÕòJ )÷àÉÔ%‘IãÎ gˆØ"“–šÿ«(®ÈÀÉ ¹C#›88Ÿ˜y˜V~ñM²ô‰ºØ-G*oy9cu®>)1Å®xøöûCi ¾mé+0¯ŽÅO“ »?£\žêXhÎ ?g4MYP£r›“í‹(̶ÎjÏ]`Îê¢öÀh$ë(…ý4¼—’ïŒõêú½”×[_¼:mE¤HåMQ… `ñ©î8-G*os|Æjþá¿Ã‡QŸ endstream endobj 476 0 obj << /Length 2275 /Filter /FlateDecode >> stream xÚ­YÝsܶ÷_q“<„g‹,ÁïkŸl¶ÓDVí‹¡#$!%‰3H^”dÚ¿½»X€_â®IG‹Å~þv±Ml³ 7yQÊ6ûúEhgÿõ‚Ù‘þ„âÍ߽͋‡! ƒ]¸c››»)‹›róÁ{ËÛïoþ¼aEÀŠhi±£•ïÂ(¦¥ bÑÆŸ,É®¯ÔÖãØK~¿õ“$õÞo‹ÄSºæjq%ñJÄÞký¹—ÇmTxn¦äDr}ýõ_¶>+’"÷r†‡½xw3h“FÑ3ê"ÅS}ã…¾Y‘,NHô›m{â±ëµ Y¾á‡ƒlîñð¥­Ò<È6>‹–Òæw²íp_¾óúšÓ ß…q¸M’ÄÛÿg›†¡Ç•[9pÍKK·W5 ´¨¸Ý’.·XÚx²¤‘§8—VˆÎhÂ[pB§à²4\Z1ÉÒ Ì‹M–ƒbE‚f%ÍâÄ’ŽÊŸ­DÏ’™±Êi€Ýfüºñc– ž`ìi£ïXëCd^‹C¤³qe4„¹Á¸"-¿¿¢©ƒ‰Lsνl¶Ì³Ñ”§KÝã(2<Oq|"Š•?![Ñ}ÉÌ&IÊ;³¸ó£Ør½ÓYôiÞ´¢ÙÿôLÔY+]ß‚{3ïP¬Â<“bI#% pM)´ü™¯9 :<³Kç”Ö) ú½ÄÐD>Íœº]|öä#¥;^Òѱw0Ì”¶ü•¡VÝoéDnEã›8g õ µâ(J½Ï½ Á]ßì¥jxMŸ¢ß¯dœr”âÇø‡;ïšVýKg®I>Ñ ÀàD' ·Ìjƒ¢wö¸JÖsÙ˜C9à$»ÌÃ<ÆQîɶUyÀI­¹©Ñ-HÛ|B Dir)´ q¨¹´ƒ(½=œcˆíÖ(ŠU¤áÆ‚æ ”ùž4½“ ÉqgÍ™2Ò~Ê‚tÅE¿.#5޵¸ýDáDðÆüI†ÆED€õDý.;NŽÊŸ­eè‚ÙtB¹â ¦Á‡?ôÍ÷´yox+÷r¢,_@·ûã' r=O‹©6kUËR=£Í’Ù€7O‚YºÀÓiæ²xš˜ L ´ݶ‚è\~M-¤Ý_Úu^¸[;(•„y~V¤„ΧàÜ[dhÌ”ä‘'ê+ŒO‹ÀB®æÛqä#É݈±{ :ð7£Â7@f>¥žTünöU/5í9nSLB”iQŽ`WŠ€l—DA–fsh~ M P¨ˆ¶Ý S,„bo—E}0­LîD¯{,PóiL@Ôí#2ÂHÈR#vSZNsÁa‚ð¹L‘Õpí´¼í!ý¬*, vI2‚×@š„èOÌÜš¾ˆ ŠÎÍLà?f‘sbŒ˲ñ߆ ‚O{oU­ˆ¦†- x…•ꊀ:7v:î8#Q¼ón¡(ííþ¶úu~†.I€]RWXeÃ¥š(‹5F[è½!k©JðÆÍYáÉŒx6N¶BÛUÉR– jm+s4ÍH,éˆ×!ÿÅ«/ÖêwÄ‚"O‘ê×8±,ˆÂ|`´Úy4PøkL ¿ˆ³³<`˜ âRL¡ŽÒÍá~åtà·²’®Èà õiÇ í[T‡R´#ýÖ„ cv‰¹͈ @ E¬mûZbš$iN£ÙVüÊ ¿`®70Onï )BìUE \°Ü»î;m”…=llPšzRtß…l[×Ôµj>ÜrÖLޤ¨24 âĶÿ¨W£bìÒìò¨x¹Æ$ ’4=ËŠäà¼im~™:ˆÜ«’CåÆPû ¢‰óêÂQˆò^¬¦)›eés&8‘¡pwÙÏ*4P¼¬ ÿùQ–Ý.ZUoɳ’ýDl wrh ²WxA%d#ýò¬D/K¸“²¸o…íBv)¤ïn–Œ‚Q>@ï» ^©in,ۯÛım¡.˜ÛM7;+»~õöƒ‹Ö*Ú  åv¯5ÚÖÝ úILE‘y¹Øèjì³µ–åj Æ9 Ãå,Mï·Ð‚Ú§æv–g\ºÅ‡øá 8–a`‘ÂUèB,²ûÔ§¯î8ÒäEžz_-šê=ÿ™¤Â (¢yPîƒ~q_k§””‰Å \L‚N€Í–7#¬õã´¼W ¶<>ƒC½?šºãn.åœÍk“‘.pt¤¶^b #®\  •.{(ß Ë…¿u{vÏéåšÜv>é GXš¡òUýó¹ú”rvÓLÜWG±ï~Žp•ÓÎC¸åŸïÞÞ´¶ÅŸXÛ˜’‚cj­™¹/22H‡í놧Ž6b>Bï¨ÿ:wŠê$Ut ?šÃMÏÐÊH û¹')C—-æ—gØž&oæ¬QÔšŽ¶åÃкtb”lßW§ìNl£Kì…­]¹<¹Óì1ø<‚O#WôY» sYwtŒYxVwöìv.tßšÖæ´’NVÙà%®#ÓØ ‡‹Û9K½vˆÀ+~ÔNâý?ºLº–ÜÝÚU)?}#櫯NÛ]Ù#Ö Eµ0GËmËVp—SɱO·ç)Ó¾vW5âºfˆZ•¢RK”€H1ñ¢0^®œÊî [ãi~ÆÆóËûh=p]«Æ=®'Æ)Ãëê‘Í7Þüý¯~nϲއGÓ][²1@‰Nšº>8H‹>w³¤ƒí¤Ý§K1a3ˆ…W=9Ðiæ(qåÌ>cýéSÃåQÌ,±On’„.«jÑÖjªŽ>«ÌÕxN+7Ê|IgÙšfhéyó X˜ý\j_cÞNà³<’æêiÝpÑcìœ9í ã…)—ÁyÒO«1úkÂñŒwfn=Û 4øß¶ ßá¢ßRó ÙÎÜ„ÿÛz¦þ¶=@ó¡Jà À.˽¤8|3ý/RÚ=š endstream endobj 482 0 obj << /Length 1203 /Filter /FlateDecode >> stream xÚWK“Û6 ¾ï¯Ð¤‡È³’*êáGgzhš×tšÝ‹oI;¡%zÍ®D:¢ädrèo/(>ôˆ${:>ˆ¢@ð„‘Â9»ÐÙÄQ¥ÈÉÊ»Pï>ß!½òAÀïI¼Úßýü–( vá9ûc_Å>w>º¿ãóê¯ýÚh9Qnwê˧0ŠÕ§ B‘ã÷>Ѻ)øÊãØM~YùI’ºoWÛÄåU‰k.ä—ÄÍÕ"v«¾4ô²Š¶®Ùɱy||÷çÊGÛd»q7‘4v÷foѤQt®”øoÔÇ‹â¾&Îz›(N”ÿ .È T¤.xþ¤^ƒ P‹Œ—vq®hIXÍõ‰ T b%x•†s,ÔFÎUìP¤Iâø(Pª¬k3üð©yЊùV.Zq)Á{r!U½„ihNñwµÀêAȈWí–ö.׸$LLÅpóÌ‹Ödî‚h½ƒìî6£„‰º]úÄ™ÖË(Qîî’"6‹‘ŒÑêj}ªèÈ«£ôJ-¿4zO°^ׄ°õCêGÙßJqI*­†aPT` ŒLÅT+¹¯É·º©({jÅm\?…iøhAk k¤vK|&¸—÷Üú(•Lzy_PFpµò×ÛŽR3Úm”HNµûætß)H냘wbȳaÀ:Iv².âSÒ3 ¾ÉýQpàäíQaÊjRÿO¬%-m Ã?àì9kŠ7›’‡aµ@Eu–r}¡ª5€\'…WŒƒCqØͦëMRO\M‡©&*i®_0¬ý¯†u3Ÿ&?ã,Ã0¼ŽÃðVtPc¢as0ˆ 6kW­mñzkz½møÊû(Šƒx&#!;‹u j‘Ÿ¾™wy—¬oÏ,9áqq† šcó}Þ&Ç”ž9CD­1-%÷½ÏÜ ´hJÊ039΀Õ,¯4¼éæöŽ Óq]ñœ­Oí‚{Æ÷–Þ@ù@w¹.*£›CpYeû‘Ôôb2Ô6µZð_PQÓÞŸzt>ÒÌØh쪻/~Á…7¸Ó>jx¿Ê9AqtÞöã™0#,Qè™sÆ ^ ô /¦¢ €gS`³GY{q]ëמ?ø¯M刈“QÉEKµ.ø¦L?U™tÄ$á0pLM0q!ðÀý€ Ì©…A`„Ê…sG¼¸·i~1iš– 3®â^Žýù¸þ˜~>ÛÏÿÒl'‹Ñ !®(9¯OÀFÔÝ„¼QÏÏŸ¢P梆ÛâåËE±cû"×FÑ[ʯ+¦.™2,µ P®î½æùŽÃÈÐä^‡cpLÞ±Àî-cœšzÝMõR^`S¥¡0³<™%‚níÒ^ ñ•œÙ¢æò£×™]â¸-§²~æ©&~¥¹ Èèߎº=Ó«ä˜é æ Ôxº|M;*põÔ˜q\ÿIXà›Gè7R,y~ÆuvÊifþ§…Ý3ZwDsÈé…šHW@â4ž–_‘ïÔÞ*¢¤MWÊÀþµW^s¿Äçbþ·þQé endstream endobj 487 0 obj << /Length 1299 /Filter /FlateDecode >> stream xÚ¥W[“Û4~ß_‘)34™ÙÉ—Øaá¡0m؇.O,LKIÄÚ–W¶C§òÛ9²$ÛòÚÙ“K9’Îí;ß‘ðÁ/¶h¾çGx‘æWÈüûp…Íh ÖƒßÝ]}õ†y[´Å‹»Ãðˆ;ºømù=)W¿ßý¸À‰‡á{Q²Õ’{äZäùØ_¬"^7™X­ƒ X†_¯Öa-߬’p)dNjQ)I¸¤z,_ÉdžŸW~²´ÿP¢—ÜÞ¾ýiµÆI˜Ä˸Uvõú®ó&òýgÜU+žúëýÅi¸Ø$¡‡ƒPÛV2ÉI¶‚¢åGð †ïzú ¬Õ#VÕmÔ˜è¿šÜ (;ð‚ߣµâôo½Jh©Up£ˆC/ ÃÅŽ´ FY)(Ó£šäûNËõŸ“zq*¬bk‰þ’6ºF˜ŠÜŒà¥¥¸ÓŠQ„–»‚oœ³<¾|Ùî_o±· "ÈþÆ 9å˜c°‡Üإ’rVÔ̵V²CÆÞ»A‡Û•Þ”¥F¨WzùFî¼Ój¢DG'ëÙ=˜j *E¡d•kà™Éœe'qÝc½ÅÎ,¤ìÚèùÐdp:ö r¬Ž¢–|ßÌ¢Ã5¯$Ò`Ê|j±v"â¨/@ÐÎ5 =7 J)hSó@®5³Q»žAN{2Ëžl7d͇©¼N#ˆ!/ù¢üÐTd? ™Ùëmõ›i8ŸÁqÚNÆ@áé[èÂFo·«N„òâØ ªI¡ê¨ÛT‹.{³ùµû˜Â•›°ª)™ƒ0eªÑa¢æäÚTZK0@ÿ)Õ¬*YÚdDNfÛ 4÷Ÿjãl3w“JÆ')¡Dõ”¢°~ÁªÊê#á(î°ÄÞ—¢w¨Sq£çGI j™çL Ævr²`©!m‡}œ<µ>6Ý.’U¢šª3_oÛ“ôÁ­„ØeR4S Ä*HG¹©eß«1 ¢ÐW'÷ø¬z˜µžøä(žD*Ü,ÏU¾·ãwlØ•©¸¶ñ·~§x߮Ηó‚Ìá4ÎÇÞŠÞŽgcÔwía¨Ö˜ÖzÜ^Ë>'ŠAè›àÙ ¯µž—˰ÄfœÔ’œ{:™?b°5TIÎôIn=‡ú/"mÏ´]ÏÆvp¤»ïD$UûæÓT‰½ðªf¹µºSª/ÔIk!á~e|Εý¹æ<"ç‹ès]ê̹-YaM¹ÐIVžˆ¡–ýM_Š¢$i•§P¿µ#EHt/9¼8ƒyJŸ¿½¢õýáÌ2Ýjté¡ nÒwìX ì¦ú~8BvUðØÉ ÷FcÌýCƒªH9¹dà8°JvŒGö<ã ¡bÉ葵MËÆÓ±Í´‹¹Œ'cê—ö&¬˜Ö9ÔT¨GNft 2ƒ.«êiãÌêž÷ÛÓ,¦ÈG:…GŽÿ]âÈCɈF?Mù”ñã©î®.£÷ÐÏðDÉF 7_C-ú|õür;QwŸo£Ó]èßaØžÜ%§¬–¬Ì ?µÆWnÞí~­ºªÌû*±Q±cÃûG¨cÃföÌÀxo2+ÌN±ÿ“ÕvÒq´ KX'nUxæÙ5Iwïì#æ…ãù‹žªfµSÏ¿<:À+‡û²Ÿ¶ ™W@¢òI2à[¨GëëèuC‚@êJn^ôÿ@vJt endstream endobj 491 0 obj << /Length 1407 /Filter /FlateDecode >> stream xÚXÛŽÛ6}߯²‘‹+JÔÅZ 6‚iíKnX®DÛìJ¢¢‹‘¦H¿½Ã›,zeï¦ðƒ(j8<3s834öBøaozY¡(Á^Q_„föþ›QÁLâ—›‹_Çh®±w³™«¸)½÷þ+Ú®>Þ¼ñpŽpyJòµþò!Œbý E8ò‚Ù'>Œ•XqûäÅ* $ñ_¯râ‹®¦ƒèåâ—zû/»Ï#߯¢Ü·3%Õ"oßþúÛ*À9É3?#r³‹ë›Éš$Š1WJ<´7šÛ‚²uî¥9A8&ÿå –&>ÕÖ÷¬×ÃÆL¬¡HR‡ØYùr+:#:Öv¨Ø‡0Wêå_õ Âlñ…Õme^J¦ŸÕø•õ/Ô.Á£4N¼ÇÛÐT|»´è?J*ФYFHËÀ¦¢†Ièc-‹2óLÁÉæ/-¾ÎìO§ý­‰óm[Ñó‹ÆÕ¥Éôª¾ÝrÍ)ÛçÛ©Áû’÷mŒiÊÊšh˜ „ŽÙa#º†Ü*cµ5Jt%«¤&‚;Q‹í'€5ŒöÈ1ÑQùJÔ>´¦`Ö­hX3˜Xýd̾Zò˜ÑÇûÞ˜ÜómÃ7¼8¦Èä‚=oʃ{N«,yw’SÀÿø*¼B Œ°¶tdˆ$±cî7‡Èѹ¥áÌ·ãУG¨'ÅðÑãqV…‹¬Â.«&wÙcyŽfÞp=„ІJTcPëiͤQ /—6´@2¹G‰fOq¡É¦”¡;ñ”1ûÓ²aϾZâ1‡ˆs•zFT;3¢%§+ƒwçø(óÚBú‘q³Ì<Ÿ .ÝèŒ ?k6:U ÔØºDLh’¤4œÏ,#žI´&$GÑS¼ÜVâŽÂþ8ɾ3çÙ•O¢”¸û‹ FS=ÊLa*ãçCm$Jqì¨Û)8ÇÔG‚Ö9´ H¿Žy›‹?–j"ÎRf‘GÂlr,˜˜æÆ-w¬¾šB¾g]/t†QS׫¦ø[Ø60eçzÃ.€|º“¹p™jjûÇ¢¶±)g~ROäx2{ÊŸ²‡‡ït¼¦t߬–GãŒeŽÞe9Xy²†„|¯‘û€&LÍÐiÿõ:›RmigËhÁ©õ>·L•éÖ”®À)x^tN|Ò;ÙÊÎkm-JvÜ+ñj¬y³D‹‡– ìË0vlÞ99gÚÀ(*Z·Æ?P ³üIŒúy{Û?~<5<œj U€Ù…¨nx5u{u‹¾Ù@¿œ*Uͱ˜79lê xM·6¸Ö5DfšQå&Æ(‹Ò¥r£=Amk0—3øhÕîèdMû{ÔnkôΜ˜ÿrV j ,"¸tBëÑôGÜ[€oзmõ·^wW 8jñ¡9Ä5Vt`#W28EË¡SHÀÖz±><æýC?¶¬Ûhc³LU½G+ZÁÙ¡"õW´tXO5ùƒqËÆ88øùpÖƒ3õ5tZ²e´‹ÅgÎ÷\¹–Oš†b“»fWg™–ÏP”EîÝêŽ÷ÛNŒ2Ž‹ØÍäÜ„ŽUlhˆZj“öíí19L”ƒ¥\ðÍzšgò [aF éŠ-gJÐt|é– ó$uͽþ¢²²¼>g`Ƕ“‘cm!¹¿[aY\±ßÁ€6*ûBü‚jI A>¡ãw£ºyËe¥^&‡œ¼yZAÒ±©\.ËŽ:Àr\K‰ºgà䢲.œ/“uàÝú˜w\æTuÕWêäm_Ú¨þà›¹=jÐÈ}f$Ó?Ã&Ožú_„úgqó¯CCµª‡: YK­Êò§*Ó½„ìµþ¿õ\- endstream endobj 498 0 obj << /Length 3175 /Filter /FlateDecode >> stream xÚ½ZYÜÆ~ׯä‰ãì0lÞô@qd!A%ö&/>€ÞaÏ.•!¹ËC1d8¿=u5¯éñJ@Éêîêêºú«šU»þ©]ì²(ôÃDíŽõ‹@¨ÿz¡ä틸}ñ»¯àU~jw{Z²¸-wßy_êÇý·Þ©ÜWy¸ ý$/xäû ŒxÈU¸;,†ªa<·ûCE^üéþlj÷Õ>½¶«õÐö8{%¿DÞËîi¬ÞíÃܳ”Ró”7o^ÿePyœg^–àf/^ÝN§IÂð™ãâŒgΫ‚Ø/âx—汯¢˜åÿ Óa䙟Lýxnoð+ñ^›¶Þ‡™÷®2ÿæñªé}Öü1Öò¢u‡\~ÜÇYè™æXÉ@iø ãºÜÐzs?vºù>ˆ‚=*íHã±÷´WÞhøýïmט#(Æ“uïöIêéóÌqP|¢ƒŠ|•ðÚ΀jÃ"mK`ÐýgŸ§[Kì4¾ÅžfB­«¶«„F†’i?òºÚ ]Û»H=Úñª1gYd˜vlTL? eÒNkÇ¡ÓÂ9rKiÀúãÑ®ÕCWÝŸ7K=Ypžj »Â¬‰Q•2Š\2ÏP ÷~¤x!íuUë:”lLÿ—,'Á k<ÎþG<È¡jŽ:·¨ØtLs¸^ïs¤ZÏÈü Jy×—ûCe^GZ¹Gýh¤äp¾Nƒ1S,¶å!R?¾ÈÔKË!³ˆ$_53%_—ïŸæ¯$ÐÀõ¬…p‹Â D„–BQ'JWÕÕP±iû«¾O»Ôí¨{ØS¡® rèÉÔ>$«(ð^–Õ±j}®¨ö]4_ysÏ‹ÉÑáé x8ÂöôÒCZÔÛ±w\„ .0ÆQáøeì’ö®3—³ôÇΰÜ`õ0 H…8\¸LpQáaËiÙodÊ*&~fv†äÜUp:ÏÌ/¢à)ª)ï;¹BžN'®Ÿüö¤†=º9àö0pg¦þÌOÊêt{‰ÅDyLüÅ%¡*¸Ò.Eœ½¿Ù€£¿(YÁ,I\ät‘Jý,S®2˜}“Ag£¶·/-Ëg3ŒÜ~²Œ/vÆÕ×cø f*Ȧ÷Œ$ãÓ}áÌ üº¹Û€2î)S±Qà"²3;s»¾]o±”—üÒeã$ôã$û¿»#¼al§0›Ý!•V†;!JHð¼pZ¢jºVàª/ ÷Á¥oú^V¬¤š8e"Ç »Èf¶”*º‘ÆFXêÖ‰r¶áL ™sÃk¹Ô0T%™f¸sP Ã«0öó cVn}¥Ðb‘÷5\׳<£ñz‹B,˜%|xÞî „½`QW,”|Ò(q¾gìà“í}§k-ŸO£Àx‡ty§ÁkþäÏ. I ”Ugì;›^èØ…Ë‹×(éË~…H©õá:è2š£üœ-À;Ÿæök¸º d0Â3µ¬m´,my国‘¦Áúiv ?*A˜Y;„°Ú¢yýÆ4¥é¾Ö 6¶n-q¢Ç<Ù«£¾«Œé4WÞ«ŸªžDVÑu,‰Ë´ß%Vz^Ff )ü°òw|Eã”oX^|uƒnJ’Ⱥ±„öe–:ê†(â|ÒüÖÐ3€PÑ÷ ‡”`-emƒI ìñ#Ã1µô@ü¤[˜Ø-áÖʉ1úœžÐ¸áõèз+¡A¹3¾•·…S¦h~ˆðü± ?ØŠTgL"­Ü¿³l8XÝ7mGÎNmM`˜è¥L&í/ ÏÄÂìgCáÂs¡u•zÿ¨I®Õ|„jU-à é…ñ±BÔ¤²@Á²¤ÎÁ¬w£Jš—Ý(Üã®´ï8Îâ­fÞêmA©ÂOã r懊:@¤ÁEÁÎ:,¦¹ fŒÒ ïÇJqB8(¾{ gá:íÌ7›gߺ¯ »,ØžJhØT-OàhƒØYÏœ`ËlÂÅ”HÈKýXC»,ŠPVB> cÝæ ‰_<´Å]a --5ÇE¢¬Ùb2Q®¥®­M ¨w 0CûAzͤ2é0Ï"}¤Áº@X±"!\bì‡`xÁ–#$ot󯔯S˜Q´„𡾦f;’†ïÔºw¶zx`1ÝŽ¼‡q^r¡ŸáìÖ H {Õ„¬F¢XÝ×LgЉr^óØÎ3lXàËŒjF àþ³æ:Ñú#$å,WñŠ÷Ô&ío¶ÝBä.Í ˜] rîÆ32¿Ú Dß¶}FÐ=÷lÄÀA| L_&‹xoÔ_5÷Δûy2åñE+Có–½l-²Sɶ¬‡ ãö˜Ìðw¯k¥hQ+Ŷré(&ƒhvÌ<õ³D9ËœŽ}»XR6¾Ë¶SïvAH¿€&>¸…¹öÒmç2ϧäû³‹bÐl‘qÃ8äGä9»èP†Djbù‹»šÄŠæn(ÀJ~U\ÁK[8"WÇÇ8@v~Å¥¹©¥=±ÇÔ‹Þ£1°E–ÅÝ‹)û?Óç¦ä;[èJ&Ç訤ðß#ŽÜ^ Ëü ›‚•ì09æ§N(°Í’h-îñLrªÒBÓb³OA"÷íx×þ’48f ,£òãd£·?À…5UˆI˜ ÅðÑW÷MuøQ õƒÏc»@ËIqø!ov}Õ üDèyÙ½ |Ÿ Lû íÃ'ÇW<øÍJºG€× M쪵7WäêíWMOÒFØÕßA¡šÂ%5ëÐõçE2i«éµLV‹_›ñ´¿ØŸæ½“ SºË ?!{Ãu˜ÛK|×™ÝéÅß]»©³V¼ËÀ¼üBójò@‰Ry ÔL™=Ïy%HjÿÎh~íÖxlKËbàñXÿxÇw endstream endobj 506 0 obj << /Length 1721 /Filter /FlateDecode >> stream xÚ­XKsÛ6¾ûWhr’gL”¢œSÒ‰=î4ã´q{h’ÎÀ$$#% †Õõ¡¿½ â!€„êL›Ñ°X,v¿ÝoÁhÂ/ZmÃÕ&ƧѪ¨ÏB5úÇY¤Þ,‰×wgß]Ák¢m¸Vw;[Å]¹ú°þž´çŸî~XE9Šr¼Â(Í·ræcˆc9…p„W5ņ±âçAÇëäòo‡0›¬²JÎŽé|O¶7P ¾­Ò “¶5/ÇŠ Ô·[ŠQ£Ü@L•² Yg©Ugûá#9ô@îYÅäRW´…¹ëî†ö=]¸K>¤ÒÈ+u¼£ýX Ä€îD ”˜†r饓DX[±‚œŠp©v-ŒAj [Úí$¿m"”Gp=”4—þÅ~f”LÙØÒêkŽª²(ÐØ0°2ÖZ £E‡±#è4¡ìXÛÅðn)L¦6ƒ{h‹Tí‘ÒBóLx6‡ê•“oúþDº¼éYI;%~ßó *Ö…ÃáN©!òlQ  ²´d`w‚ß/¼ ®pر1™ ½Ãà ó v¦~0†ŠÂj×SUN¡)SÄKÙª¡JâdJʤ­¤KÌGÛ3e6ºQùŸÄí*ûöĽ4öÛw²AÙ&³ícn%µt¶cÕ\Ù´%Rë­†&Ð3¼Ì‹QàÖ€›@ÖhØJVÖ~9¶ì \#p[ˆs%ÚÞms} Yutµ;ûÉg AŽ@‹‚ÐÆ8ÀSœôÊàWºªÈAÓ}ñ@^uÁ4Õ(Ï!ðšÛ­aµÙÆÚ9‹©&º¡Ù‰kÙœ8Y°ƒ,µàý4ž@}5ÒÒ÷«øKß‘òè>2}©½>¶Îa'szÍ¥Ð}õÖmfy\âoÀÜ^2Šs´™޾+-:q±z1™úB\˜^>ßÊY;ît?ÕÄ=ӵ͚<«‰›2óíÈLÿ»37l‡míÀû0 ŽÙÃc$OË›iJCœÅÏ·Êú—±@ÂÿÕ¬ƒ¦BÚid–TÃÐOô3ƒÖ¦Öƒ- xŸb«¬t{‰ŽP» ¬ù‘ìÝe–ç^¯ÜÚ¶v?ˆô›glÿ¤‚„“àž êkBPpÓÙaÐŒ­¢(ÿ¼{÷ÖÔîFì=Fì-#ò£ ´%³üfÍùZ›®ßzÚ(ÔïÙl{Y˜$Æ\“ô×–Äú£Åc|4Ú¶ëýõ×-Ûí@w”ºçÕêì8Øêîn®®¼úöL¨ÃáÆ•¿¾¹rOËïLæûÿŽc§{D(3÷¤z Ý…nn÷£GÛñ}GjÒÓ☤›™„Ì2`ÒHdd¶õ¦¤žrRå‡ZäÞV|ý¢©çc_7O®)¯Œþy:Qž 2¨8[w;ëKíŸX{j™r‹'Z"øo›zñÁÁ]=ij‚ ËÛç– L,oJÇ{:£!6³›†axi¨øng8­÷¬öÔHŒøÃ[»À’‰æ—Ñå+[¹° ùøzÖ¾ÜÚß[Óô?Ýt8hª ÓDUÑÇÉ\ 7òg^ü!Lmç ®æÑ96æþ¨ïEY šá¼´èQ5¨ÿRðZ endstream endobj 510 0 obj << /Length 1783 /Filter /FlateDecode >> stream xÚ¥XÛnÜ6}÷W,Ò‡hKê®´}p’&HÄIê(e$®­D׺,Ü<ôÛ;I‰Òr»Á>¬$’Ù3g/d…áGV)^ž‡¼¬²ê«¯_Nˆzr¡ƒkôxz~òã x$¥8%«ó­iâ<_]8Ïèn}yþÛŠ$ˆ$ÞÊCa’Ê–Øóeòˆ·r¦¢ëK¾v}ßw‚'k7BçÅ: ÞT´ã­h œ\>øÎisÓûµ—8úKNe—³³—¯×.I‚$vâXLvòëùMèyßWô8ˆ7ŠÍx‰¡5XEI€ˆHÿ;vÛõ Ek°:°Ït9·&?‡q€qh4æ×½\£›ô›>, >\‹)—ÞÈ <°=ôèëœm‹šåªçÌfHP„ºka3–¢4Ö.ŠŠ^±ËŒx7äV<Ñ«¢¦6û)A‘?Ú?ê¬ÿ5Á¼%al‚mI¶îuöÜ«…±aJ$½ =³§ëãaaÑ‹UAÐÝ®üHÆ¡Sñ¼/iÇà‡ØqyïªÇO%«óÃÏ9Ëh)‹† hç]k¯ê¼È¨LAÆ+.ŸÔ‡!A•|ΙüW<•/cÎT#Ý•`-ŸZ½µa®íw¬Ù®x©‡p’@æ¥ r1}-²‚ @ jˆt_6ŸBÏ<~ÔöÍ–fLTòæ‘v&ÄoT0Ç£(µº¤? ŸÀQ&Š«ºØŽŽPª™nz ŠBM3K‚ᆠ?òï…‹ª>e¦Q©µ3}û—LOtžÇŠî­XÝqk~èÊŸqE MEUÁÊÐŽæÍ¿2í|cå—BÌ{E¼²¯@>b–²É †Â„of®øJs튞°bÅ"̾ºƒã¬…’Yà•õW:¥}Éüª/»B³_iÉÍ´lŠˆ¿ ã…8Ôj 4+áªa«íÉ;µ6z¶µ"ŒBlj xÇÊHM°púS#ìÙäecIÜ5m*^ì®N°ªaGr¾UæSÆ?ÑìËUÃá〭%»ì‡Nã{×Râx¦9ÛÈBŠèåÞ¶(™ö}?2cDz¡Ü›‰GvjrSD­Ñ£:gß'Âxs1[ñ|ö0Ø\ÕLË-Tl "ð“R„1–­v‚Ì38J‰ÓLo.Å è •6oX Í–úÝ4ŠÅDIÆ’ÊKÀ‹¢Þñr2E›9ÖÒ•=WX«ÓÊòBìL‘î9T·¨ºaõ^ ì÷’“¦Ýèg&\Öäü}TÏ;\¡åîšNþ°¶+öLy°c 숎÷jÒ9RÞÊ&0÷Ð/¡Åу˜kÑTˆ" _ð(P®6x/:ºÖ-ìa_ýêØ¨h<¥[ÖQs›1OðݾÔ|\͹Á9Í}0]ì‡Â<ÀcdÉkÇA sf˜ÉxÝv^õÚ£6§fL•¨`y/Ǿ”OåßéáæVÿuäÿbÍÉt™ãûŽ×ÂÉv³èQ1ök¸âæ{Õí¥úº™IÆ©z«l°ÀLzóµ-û®§#6µ8´–X:GC)ˆâPJÖÓ¾¥¹vêLA.-SªƒÄ¸œ/Ĺe%Ùʹ-+: ­[£w´ƒ=—›3wl°ñöØD$©Y&¨,Ún±H’Èž­ý\™F0xßÙÊ(Õµ~Ë™¥V¦$ÊÔL%‰wD7Võ° Šè›ºÒòš®ZRóó4—\éÁ# µbìm°”ìoûwW•ÎÏnc¥ð&g@ÚZ%d3秮ȶÚJÔY§‰VBèY8,Ç ávÓmð†L[qcëÍíOÖÂ1¬Wçq÷,ñÜY´u™6pÌùZ4:Ò=m`3x÷xÓ=ž”'Smê‘BÉ›E^À‚pK+›Ž“ÅÑpsÃAvlAä 7<(¸^‚VGÕy`.òëÔ¼ ‹evÄ¿º ó=±½0Î>­]ù²6Í'ÎÂøVmX’tš 9×»k"KœçððDZƒm˜*Œl;@ÍPRÓœàÉ›¢\'Ь¢K7È­¼,™Ý tbé •3y‘×ö1 n¹¼ÎƒeFÜò W}â,–"ÙoÈ÷ÐGT|¡Ó¥ ín†¤è+£wNŸÛ¼TŒ;¨!Œ öÄŠ æøÛj™ „$z X-'l¤»=Ö÷"ŒŽ…ªÂĉbʩ¢€èc§£·júœ† ûæÈôÓâ Oöc5…Zœ/ž]^¼¹¼. ®Ææ·g¯ÿ\‹kIìü ¹ýN@{­ùÙ5Ý3ÛUÞ‚ûûI½š®GB¢Èþ9¼woK¬â†Æó§\^T%¸Ï ñP›¹+-xoôEÀcVïÙ endstream endobj 516 0 obj << /Length 2810 /Filter /FlateDecode >> stream xÚÍZëoÜ6ÿž¿ÂÀ}¨öà剽RôCê´w94v¯qŠ&Ž‹S´Š£t%¹’ÖH{Àýí7Ãê±æfÝC>¼9$g†Ãß<yÂ?y’…'‰VBEò¤¨…ÜûË#É­5¬g__>ú۷Д¡ÈÂLž\¾›/q¹9¹ ÎòÛÕõå?Od*dªN”ˆÒŒFÞ„JÓPR¬gCÕ°Û¶«µÖ:0Wkc¢àÛUj‚¶«ó¡íqÄjèàI÷뮺[©4p=›œH..þþÝj-S“&A’âf¾¹¥‰”:".RÜ“7NæòJ‰,•'qj„Ô†ø¿³²E* Ên¨ŠxqìïŽL 샶Õ|w8©…Œh[!-Žd­¥u¤Àj´O@C‘ nómŽš»ëPe‘ üzO}ø§¤îª©Š*߇Òtr&Q—'©¤ÈêÐntuv}u~}e®ÿõòÉS{I*Tš8òvç]3Ú$÷–üþâ»WÞ%0‘qä§(B´Í¦$¡[–½+ß„Ò|´V2¶·«µJ@kT+ kòª÷q³Ö¡Y¤YùÎÒ}œd"M#LjW]™ÃQ²ó£kTͦ*ò8Neð뮤F‘[“‡ZâH¥S<Âb»«˜¾íÊžš¼BW9÷4xͪÞõ£:zRMY pÑ¢(Èë²AëJ±ZGi<ë«Õ¹q Þ3à¡ïK«F¸â©H’d©¶üÞí%[«×=î\R_ÑÖÔØÕ|·79“ÏLØ{ZÎʘ¥õ[[´³Ï\Óç³ÞYÛ™%8sMœOͳóCf.7}Fa\™ÍWQy‹Ÿ©•ÏÃ{BŠrÖqvèé®\väÅ"L§¥1­Ð±vtÀ³‡´Ž;âK%Â$æˆý9Rbj¹N?×]ôUó³íh¼¶5šMÛ ƒ±KEÛxKjO§þwhãÜ7-GFÅ"ÑéÒJÑþ »ºªÑòrîmFS´ßm7Úìm>To«-LÙ, Œé}~ûCù›ÅØ^#ôXê‹òfw/—2Ú>8„%jCÿˆÚÉ„ÚÐ]ö9¦îjj,«ìbRè.;·G÷¶ºi^Wµ4uëÞt;´§ˆŽò¡[¾Â§åd‚ E=‚‚Š °¬ºG¡'?6mÄ›²/º’³ª0 ' ‚ƒ°é¦«¶¿H¨”c?bÐP~ÈiFNÀ\,tåKêß”4àã—Fò¢ªs^ó‚ºÚ·|qð¡˜É£!¡Â¥ñ4¨8¡»¼:TW’Ú P½ìš"*,ÉðNÓÖ~ A@s|ºß•<`=Lèyü@Û9KÍ7|^vsRLÇìnxî䑪+ß•Nø™ôÕhsøU’‰[E¬#ì@\±²Çbo*wÄï%x 2GID·‹’Øî‚3]ùÃÀ½$Z •Ý÷ëgçO~ð¢MƒÇUŽÑíW”ÕмÄY<‰²[j@nBŒ)!x °…œÅ—Žj=#óÄÔû‹Bð¢Ã•1pû'WìµÑ%¹@•¦ èì«›¦Bº"¯Á@*RöÆH`Ž6úÒÇ<žøC}aëOYpfórØÿ@ÅV¥™-BcѶ$B¶cÿP~v0Öñ ¦×ô ñ# RI,·Õ°r°üD›N>®ír+WÒÏ꼨ò'¤<ðg©Qˬ‘34 Õ%Dú;×ò,fG¢y oÇ43Œ½»~GÅhÉéüZt¹7æÊ 2qÊ~á/§ËèÓ%ùT¨©`pyt Ž×%¦qå–¢3,€ÁýÜ i|¦/)î嬬¸pÉçXO´]êÄ)+ÖÕ9=*Øb7cfᲤßm)ÌòA>ò‡Lùìš2î쯠Q6…˜–jsLqºç Aî€ß+æUÿÂW:lÍqœÞ)ÈÒ0såÊê:I”Zù“,{ Î?«–ą̂!Áï\R AäÖ)L©±n ¤ýΕ ßY‰T¬!}P-ªÒeeXL²¯·…×ÖÄS‹3q¢Eqoé ;6nQ*Aª®‡à'h» ¤úL—Z“ùH§8®‚ßx&uþN¦‚=›ÒmêÓ>ŽØŒÈU"°#§™p:p¯éq¿¦%œ—Ñl¼Î°îOLL¯èkŽwø iZ[‰•£Íû~WWTAÒûÅTo¾à¸"ÕñYÝ0NFÉÌxz_F»Ô7W¸Ü ¿5W?LHyÁ黓Mw¨Io@ü}ÓÁw/áf„ô#ÐÄ„çèÃ((A@²ùŠæÌ—p›Bwè“Å.h¨´|~çâ:[}nF`.k“ßùîIgÇ•÷ÿ l˃mÙ/kÚN;ÐõúYÂ?,1÷á˜c|Ó~ô„ öÍ6YŸôBBbQHtŠÅ¼p|5NÁVж“z[õJcª,ÖÔ6n*¾ÃE_Iî™´¦ñ½Úà½Ë%x-Ê…Þ7Ç(q”2Íçn¦×tshñ@š¥‘,=²+ÏíßQmŸÞòÎÌÂ9;^°.{ç­Ò.»0áêíÿY—ÁJ endstream endobj 524 0 obj << /Length 2036 /Filter /FlateDecode >> stream xÚåXëoÜÆÿî¿âÐ~/·Ü÷álWé­$BÂvQŠG[t¥£ÌÇEɇüíÙYòHŠÒIŽÒ.ˆ{»ÃÙyüæE¾Jà¯\²2R0‘òU~õ, »ÿyÆÃ*‚xDñòìÙ¾†%O˜K_½³8Û¬^G¯²ëõÛ³¿­¸eÜŠ•`©utò&’Ž˜àbŽÊ¶»¬Ö±”2RÏ×±RiôõÚª¨ª¯²¶jðDEZÈèEý±+wka£~g“ÉééŸÿ¾Ž¹UÖDÆáeÏŽÏmR!¨‹‡õÕV1.‰þo¼ˆÄ˜H²DGOЂ —”azŠ/@cî\ôb +£«ìòô©"“)#¢DÛ©Ž>tM›¡Ê¸µ ÏMYo™¬•RQþó:M’(«è¬;‚§š‚nx‡v¥£]`Hß$ðâÑü ´ð^‚¦¼ªèõÝô nË5r°{/fÑ´þØË@[yµ-òØ»_Yf•\Å\2ž’@àþ¬"O¢ÁpéØpJ2-Ë,—+&”èib~:xåuVø´¨ ‰6A†óòÆœ§L ü^ßýö^ß=ÎëÝQâÍô?p4èí¥Ä']½äêT±Ô =Y´(°vjïé;ýŒ7‘Ÿq5ò3þìØ:6 þT4M ¶ò§ý"xÈïÅè“tïܬ:‚‹¶,•½Ú!+îâÞ‰`Á-ïÁ—¸‰Ç¥Ô à5Z3ª.«÷ež][Tªõ§$"ª¼¼,·›º:¢íbû±Ëˆ°ê 3¢ ¢ã²Û‹d—ÉØ^^‡d*=](o]…˜H Ó> Œs ‰íƒCâ¸!õ‹¼|“p•£Úu´Ô½¼ûà‹ìÞFk^4DUÜ”M[\=-i…¿›ëlCmbРѦã7ûÀ¢ëËæ6Àƒ­²Ë6C<9‹‘­R~‹î5Å{ A\fô¸Î.³5€rW‡Õ5á¿×¬X²¯H ©ÁÄ¿;hâû—EGq¦µ>ÈÇöAÅW„~wÉútÀ;6€ˆÐ 1 e˜ÐjjÓ0á’D2éÅÉ««1Û>Vš€T#˜NgX=©0–”“” •SÞ ð»ª7ˆ\ú~rHy[ÔEÓÐós/W7øSë^yŽMù~ðÛB»!—}‘”R€¤O)À,‡X¯ËMÁ Ù2L¨= ÜÌ·R &Šd=K%tׂ¿apÚ›ïU7ÂÅÔăǷ£ ¸›¯Rnè}^ÝÉW1©åM¤¬qL'ЇAÁu&”Œo!T Í…kCiγsŸÂGÅLYM»Á!ëI,TSñû¦² h)ëªY¤’¥Jh8 ³f0T±ÄÇ2eÓGÔ²£Ð1›Q©ŠI× ­‚ »\dÁ’ÂH%ç(SCÂl7‹‚Å”Ti¸¾\,æL¥‡ô‡5bß@-ds´Š†X!´§!‡§˜®›Æ›%µwÖ Û†×Þ­¨Âû_U =KIÏE翾èü~ÑñÚÛ` …Nvñ£´àÍÄ>R¾eMý‡y޹—Q¯æ<ZŽÙT°i¢?ÅBÏi8h«%þi oM›-è—=yñÍ?—nÒ)ÓŠ÷oŒ«7^•åEÙVØ6}·†™¬øÍ¿kç˜àf¥ÍpU~Gt8ú¶ÑSÅ#²…ïsf^¬fqÈD¡ýd—"z=údC;çå6«ËêíQè—ö³âûci´«£8RNÔYøTÓSPgάo^­pÑ)uñÀ!°a™ú5hÉ|Ær ¦Ä¥²Æ™ã‡>G`íw÷vŽ%îPutŒà$ÖM›˜^Z"E|^¶_á\ehìµá;Ï®^œê ‡ã«à|ëÛ.r¤À ³¨{6~®‚g߈‡IÔ›ØY¦Ÿç?žvm?²†vÕ ¥€gd è àÅL–€¤# )³ ôLbG,¢—/O×Pg¿‘K¬53Ö> stream xÚÅZmܶþî_±@?œ®¹eÅ7‰2l¾Ä1¾6w‚ØN*ïʶÚ]é,­®Wèoï ‡ÔÛq}»¶“b?ˆ"©á¼>3$—/bøñE/R)˜Ð|±Ú>ˆ]ï?p×Z„åhÆùÕƒ?}M³,Îøâêí˜ÄÕzñ2ú6¿>}}õÂÆX¦MF#¯b!iˆ .ËÑP¹ë6õéRJ©‡§K¥tôý©QQÝló]Ý∊ÖÔÑÓæCWÞœ ùžuNS..žÿùtÉ2idb\ìÁ³«^-Ä=ââŒ;ò&éX^.cU‹Ä(Æ¥"þ׸hFŒg&,Ë€¬ð2~MS¦Ä„À¦Ÿt{/¾ŸŠñ“þý%TúI¿ •B´®#Ƙ›;ñ®%ל™LC#aF¦ôÕ‹ÿžê8Žrt™4‹ŠÛ²ÝÐ6qô–\†Þ”•u:;¹)]ïùùúÎOŒ^/èÃ-ŒŠ4Z—¯b®VùºnB¼ ¥O¥g_…xΘI´Ÿ±+¶´Ìº|[4E…+ÖlËwU¿^ëæ×Àˆ‰Šjiƒe)’ŒeIK.×ÎߊjÒè„\Ÿå¶¨Ú‘bFc«¼¼uͼmIÐÄITæëSåC¢òL0Ã{·R ¶ŸBâB´À‡nÖH"ZïCWø…é©Kõ–䬫±RéÚ5l„[û©TDE³+W0‡t"4“Ò88äYÕU»kjÒjgQ·Í©áUM§­@|×·+vMN*,ë*ß0¡8ú[›£¢CŽ–I~#ˆ!,=GÀå?:pKŸ*¥¢ÕÈbvtZ-ãLêÞëª}‹õaõŸd8é®{N#x)³”%jå¾ø®Ü†–†%êK'SÀëØ@Ëâ3lY;T´ÎýWãÀÀ‘ª¦g> ?u8?jÛ®ð,ê ‹™„êM5’DÌ%©Ý¬oB”4KE?ƒ‡ÔÍtˆ†“Ÿ‘Ë”œ¥“¨ÞÚ1:B§„ìøœªšòhlÀ-¸Í±&c%åX7TVkP3ˆ1ÂÒ‘ ¨»¦å×åMÙþÙ¾÷õ¶~‡‹ÿB3«ÂÍzëØ:5~èmP:ÇÖÇF‘j'SÞºtuø¦ÛÒë®)×%€‘C=gL'jê„}xRÖ¯«uAyßÕãðf&_[ü# 2j‹0Ü ö4ót6 <™ÈQ 9WŽìŠfU”MNn,`UP%wé/…õ%‹1‡b, ɳ€‹[&@¨NDtÙ‰ñóÖê,ÅŠ+[H&€ÈÜl@†ÊUi7Õ¤xžË^ Ó,œBN–‘ÁÕ<äCm‡qzë3NA½“ Å€=|³]EµòV„‘ëÜ*húQK=k—<ÚΡ‚U¤’¬Øëùbêù ë˜^êEíe>däÆþrP@bz?`oÞ\ÁpRüœ½º#‚t1%Ùâã^²ýâ'Œ"DÁ·™Ì¦b‹>S?t`°ÙƇ.ß7ôF¹Ö6J×"{B Þú1ç­C¼XzÎu›ÉîJv~Äë ‹§Ý5=Øöó£PŠå°²VªÏH]°þ,å}¶y²‡Sº¯5_Ü|Ÿõt^þ b;=š”ÅzVýá€uÂrOæœ}¶Ø†©AÅX ÊBø\—Ma3¾¬h¬F<ÄFU»FQÞúfçzèqCrk(ãt.¶ñ®É;÷éÚ}t]oÊêZj[zÂ7°/É·ÔæŒ%“8\“ëûUðØ‹îö V©S.ŸÈåwgô¢–OÔò;jc’or‚kÌR®ü†t™ àøÁ5ÛÒb<6OLXßñÄͨ¦–Ê ŠUá4TåŽL…åzÎz–âßÏù°4÷øÞaTÒ̧÷xðÊn]¬k:ݬ©P°´,ÌÒ<¢ŠúÞò]¹ó±¥öÖ›¡-·×›¢õ) ļžy#Ù…v»MÍ‘D µÈ˜³2s ð=¾_{ûaÏAåÐ{,§!=’Þîq&jpñ9WhªY+,瘌ÅD£íS¨õt:¸°ö-šz%˜4gðy²O‘àYœÜï6=މøºÈ,ÞuÓp]åoF¨™oÞ×Üz7A8:B µ*?ƾáìÜGÐîÞ’c2!ôØ\íê™B¡ÄÙ5õÆkÈéàºX烼]œ´ƒ ¤b†[$YÐIvh›',NÂ9f€ç–µËR*èB>©mG";7Þt».¯vƒàèØ‡Ø~ÄN¸½ý}<Ú” ¢·Z¶{ŸÝ<Ž=¬ÏÉ'Pg‡Çægñ`íþ¬q©Ý}õûÁe²éþl¯ØK¡“¶ììþâ3çë‚Ö|ø6s¨ß[ü!Kò¡¾à`hcf^¿‡íøó½->Û Mâ$¹_·°½×C*¿‡G}ˆnÍW©cÒ£Å$ûdKSíÒØ •êºY`Ó OAä]×8ĺ¼òI†ž[w&àa¶útÊ áÌå@,+2ô¨çò¦·åIv¼íG+…èB2©k†Ê¦ÉõroZ=´Ä£Î ÁüIöò‹ÉþŽüi‰§'9IüÕc Ò‘VŠÁÚð¼¾Ôx‰g»aãë xèjnòM=Ôp1c£r)|RÓ@ã þHç®®¡ÇÓ¾†ÍçuÌ*ïyÿÀ@lýøüüé¸Nõ¨7G±òís-'íå üzÔ®‡Ä(~’´­iäÿ/WîsÓéìíYۢ˓ùû[|Ëâ¨)®Á™Ü19“à”åóû³ÚÙ¿÷:åö„Gã!xÞ9QL$SFq¦8[‹ ö3|1ý*î›Û¼´1A›%Eîl?Þû6Ä#)u°Œ J_¹ØÎ¼m»mÙôo®a=  WGœ%Y¸þÜ5àfZ2£úˆªƒn¿T"»ë©)>qj«bvoJ˜:tÖúÛŸÙš»g¶s})ÍL2©1]TDn ¥³ƒCÄ^ì‘?Ô›žÒIˆC Íá‚íQИcð9qÄ ûÔa¢R²Œ÷â<9˜h5ÜYZâíä]ùË ;†9Ëun0•¹à&WçŸ;ÑAÓßÞ(D×x8mïÔö(,îON ŽÝB'LÉáä°~ÓÁ»ŒŒe¢'µ'”¦Û!À'üobÒ6¢Õø0ôoŸ”™¬×ô¯a†¡ÜâC%x(ÃÏ~în‚ÿ…˜–Žg{ÿ99¦¿$ཤ->¬Ö ¿ÜñŽE°šF\¹ÃÒzÍØºû¯§¾—”x[mºÛö*Íþ‹ûñð»¥îµ›êïŽmJ¤ÿ¿ Ÿ(¸e‡‡-ntú-å´-û?@gÈîÆ‹özªÇŒ¿àý_“¸ÿÇ“ÝçQ²×û˜Ñ\&#}S«ÂpØù»{÷œ›AÓ?•jæÿÍ÷??ɲ endstream endobj 534 0 obj << /Length 2572 /Filter /FlateDecode >> stream xÚµÙnÜÈñÝ_1€ÂIfzÙ¯ò`{×ì@Â>D–j†’¹’Zr(8û°ßžª®j3MIFè}T×Õuuä*„?¹ÊÂU¢•P‘\íªW!¯þë•äѶˆ·W¯¾{CŠ,ÌäêênŠâj¿ºÞå뛫ŸV22U+%¢4£O¡Ò´%”T«íd«<ö‡f½ÕZæûõÖ˜(x¿NMдU~l:Ü1Áž:xÓþÚ—k•neŸȇùëz+S“&A*‘Ø«¯i"¥ž!ž‘W†FdƬâÔ© ñÿxNLðПBi¾6HªéÁÄN CjbÜ0T¤knÛ‡I‡BÊȽýñïýcíC§3éÔÁ•õ¾ÜåÄh_á7 Ö[•Å>ÿêpmŒ v AìšCÓ–ûf³ÞF2„ûCx÷×>?¶dýK_ãmØ›B´{Ëöj+M,’4†À°eÃUpÇ»¦Bàë‚0îĸC /Ô–SkB úµ BEK .hPt„´Ø•x»¼"y稶 Þr\´g£þØçÌ~ £ÐZ^ÑVÅá ¨ YBvزÊü·þ°!C-è“î@呤YÝ\ɤÚÇuìx9Bòñ¾Êi2ÐæCÞº¥|?ŒXÁVÍŒŒìw+c°r¶ß‹ÞkŽ©PÉ`?…Y*Òt°Ä‹G/-29$ɳIhMQEWkeUäÖáÛ•ÕÃï '{ŠJ‹TSlI—c o•÷%^)¯ùëS4,K!bæ¯CÛú}…aãnœQ¬Idpß‚íå½ãˆÏ²Êú³=ÕTe3@3¤R„ÙÜRØPÿ‹¬ÿá½Ö¹ m%çÄRSðf?±*vggíèÇ’$¬Ð½øå±÷Þe"²tP³+Ó2hèS[âìª)\dÑÚ…qÁBøýÞžekçí&ùÚc¹+Np°¹Ë3%bHÚЖ;³¶CÉžI{]Ñ2Û½7ÈBÐÊ8YµO™ÐF:ç‰2Ð۞ VaDã™)˜±9% ­‘ ö ÄÔ 6†/MÕÜ£Þ>“Òê"ï8•u0šÜ‡Ÿöa›ïʦÎËÎZÍ*Ÿb#áXþqí9ê‘Ø€;ƃ¢Þ¾ýè“UIGP7:Ÿ‘¡KTx‡x™'Ì"Äm¹;±;Xq›6˜0óÚÃ!Ý•à(É ê1*³æ†»wXŠL4>ƒQJ$aúMRþÙkâ[ùrš6!ËÕx³üY„VómÆ}yµÀ–<‰z’-©„TrRu?ÿ¸¼òaƒR'2QÁñO%Â$ÙÜ‚þÖçÐ'zb˜,Eر^__ÀDk Sðçûž¡øÐ.¿%ð8‡œ-àu …ª Hª¶(jGžò/ º‰/µe1ðÉ•‡Ôñmì™aÓÓ‘¢$_#è¦Qb¥+çp¶€Ù \˜«ÑE(.À~CàìËL± ï±øzìmX‰”-nºÍ “U‡è”,–QžòçŒÞPâhr£#ç8¤×nî7·ri0Êáž|Ä·¥’§B±ªÓö~¢Ð—ï2fC%~á ÒÀƒ2ƒCüÉkå"Q‰ìÿq‰¢„@ž™³:é”bš˜o¤H‚.™lÕVk±Í¬–Çínnç2/^5 ¬EÀ.:ÚŠ]AHö…­‹Êû-[yoÑüúë¼­\±Eœ­LÎäJøÖ›'îÉÇP]Ñ“©É81ÜÝ Ÿ•øäqµÞMÏùðq,¾‰Wÿms(æÄO–mqZ%VoL—0”3~ÈR¸ ‰™HEvAž.¨é‚¾$¬N¬;Næõ6ÄÙH?cÞ`cc¹R€Jf¡‹ø”§|ÊS>åÿ›O¹Ä'ÛRõD$âßËD" .Æ1!¯Ëd,zQÄXCqòCx Éä2FãɃgæø/æÒA¶JÅÂzì$¶ÚêH›áUf²%‡Ev„Â6p¥ÁWˆI¡DžL3(híçôá^Ñ‹Ø^ÑøÌÉàèÉ ¼s T¼öÐwqŠ84>cX¬ –RÏ%¾ýÓ,hèCç9Íq0²û%Ç(ŠÓ1kÚÍÆž”î¸zyµ¡ÁÐÁƒ9õ)RªBñ;S¦- |6 i;#Õ±£‘žéÓS©°Šl)Ua#ŽŠ)¥¨ìyªÅEË|Ï$ãn6¸H¯M¢JŸèÅ„­bÒœ¹‘\ÎØgxÿÏ1kð½8~¦1KÌ´,^Ãâm—n”ÏG„‰ÇöÝ‹„ñ².B-¿•sºs¥xbscŒß7ËïÁÍ  s÷‰&î“ikG™>s?c]g-iß̼'ÓSïÉ4ÕœÈM(]½Ëƒ×Àø¾íÉýí5d”Æ  êA$܃H¸÷˜é…Ÿ×QžèôÍ[|û¡mçJ[7,Tg­Gl¦•ö´ýÌhL’«l_w9ؽ§±ÿ5ÿø¾ÁuûŽÓ¥®‚Am%–8A)Þ6œc žm¾ˆ:™L5_ÊÇ&?ö Ce‹ÅÑ0¨}Ù²®#“à‰ÐvW0°ÓZÇU^YÃå8kË7¸[âÆ«¸ƒ×*}&ÍÔ»2Ÿ’ Ø7¸Æ/ÅÐ…‡5°‚W¢SB:RF„ŠÝ]DxB¡î!˜[±µâ~cÄÆ(¸*;î²ÁôÃû÷>—ÇdñeòÄ­Ÿ{þ]‚ …¬Œ·¶ï´ÃܬŒU?8KiõéïêÈ$BCɱÀ m/ÃÛ2ÔÁ? ¢T] ÑÜÝy+:¨?p—AIx’è“ç’¾ù×â{/A-Ò(ž‡­ëË«›ëw7×7×ææº¾Añleûš>óCþˆÚÂÉîKþXЯË.å·âh‚ÕÁ´a"Ï{û²ò± &$“!üßÌXûÁ¶±~·”ófÎÖÆ-[ÃfGƒG.-"÷ˆÜÐú„­¢>²ˆ]SM&ü­ùþá 2‘féÜí^;ê8°Ûƒ“c^ÝŽôªJÅœr?Ÿr þÄàâ}î&Qpñ0óe ‡ÉL'H®¹G’4ï»Ü©¶v2ì¾¶õˆ°u$·P‡C#Â_}ÌÅ"Kó¾o|èT:õÀÿWh†*è·43,S{ûyÉjš®ƒë>L¬ÅÆn«,l3`—ÕšL’B¹#½&ãR¾EÿæZÔšÖ„™×šw%]Ç.jŸêÞŸë^Ï ÙùXâ]ù•ïö‚¾ã/õ=O¼ynä§݉'ˆ_2q^´qdŸû½rÔn_ò±A»X΋î)I'?æZ®òÓã4¿+mbÀ¡ýmá3ñP¹X–þr¾Mïó<‘ÑÏCŒ8ƒyN´à’Bï(§ŸÔüÿ†áT‹ï±¹(ÏnO¸]ø=òCR endstream endobj 538 0 obj << /Length 2660 /Filter /FlateDecode >> stream xÚÍ]oÜÆñÝ¿B¨_xEnÃýà—ƒ>ØFd¤($ Qüb;ÀšGÙLä…ä©núÛ;³3$—§•Ov‹´p\.‡3³ó=CÉ‹þäE_dZ •È‹²yóîߟH^m`ëA¼¸yòí%,e,Џ7·>Š›ÝÅ›è¥=lÞÝüõBæBæêB‰$/èÉÛXiz$”T[ïQ=÷Ýf«µŽÌ³ÍÖ˜$ºÜä&êúÆŽÝ€OL´£…Žž÷¿ë»Ê£igg äúúÕß6[™›<‹r…Äž|3Ÿ&QêÌqâþy•^ Ë/ÒÜ© q/„@Rß^¦™ ¢“ZÈ„€>ÈY* ALoBH‘©|‚¸zíd˜¨$ªú±.«!„4‘"1ÉôÎV¾ áU¹Hu:ýóÿ™¹ßÿ·Ì¡*) Z†J…Ž=}ºÙ"¶K˸NÔý4Ä’<‰™yº ñæeÌ ó¢ÂÄîîÂm·–®}u[õõŽïn3æ¿y‘3{òÑüÝ= ÷Eìñ;"õ€˜Dä2<º‡´˜‘ØŠkÐÚ3wl6")Šì$þ ¦æÝºÝ-’t!&,i'I)3§Å©(I ]ëv¬ú;»çÛ8,k/üuöB ÑO ™oŒ 7`=MÃ:ÐRÈTúJ ¹¤Âåãu)aÙc_mÊnßõá*Cø¶2)Dš'kà3Nˆ¾ÔÏ>K1ÉE¢Ôö$زkGG5É@Ýêv~ìΟþÕkì9Ôʟ츸í°GÙƒí«²b9–‡ím žÇ°;¾ÞÖÍzc_·íw´>tÓî0¡›6b¦E³Šð'~?³ylª¾>ZµÍ3&nwý¿Ü{¶ &9šÔ}G!-'U€RÓ"¨ëi›‚ÚÓèÚ€ÜÖg,»~ lŒ9Ä´fá'Qø| |ŒwýE|õâÍów碢JNOA·ù í{w»U3)µ™Êíþ8-Pþz.9Æ®k^d5OeH+lU•<À¤"^BÞõåe³Š!¼Ì‘ámœÄm×€º´’`0½ †ˆLKÅð§Ú•ƒvïátiôëF¢cɨ ÿÛXš=Óºu•wˆZ® ®O?K­JO„¨#¬;ÆnQ­L¬Ucg—´ÙWPZÕ"ühÙft* N_ DÇêm¬ã PQ ¾ÇQWM-BE×Ãf‹t÷äP…‹JlR>tíÔpö¶ú’²khÓÈ!0™ZJ4ê0б«}ƒçÉ¢‘¹ Þ±Þ´Pƒ|C›Ç† Ø‚V7A¶[’A¶’®=!okV…Ts2Xe „¡ì+‚êik’G]íÀ•4_ªˆ®‡õC’H¡E’NZy@Z𤕝¥å¡q¿;ôSÜ&Ê_HSmiQ$sc‡ÏË‹–Ôi;:Rõ©èx€èÈøû‘ ^Y‘'ÖAR¸g¬üEÛ«æýRÊLxÈõ:FüŒg7jåá¤ë3‘B~µ–0‘hSž;`Ý€¤µâcK÷»·ÈÈ]Ï%Þ}¤=g(Átžj‘%é937` HºP¨Dõ0 ŸÒx®B”!«Ëí΢@‘EÒ><mƒ¬¼_;XÂΠˆëDÛ>nÔMG*뮵{ö/‡óXÏ{o®@fÆÎÄPŒÊz°ÍV†‡+I: ™$ÉF]‘eÈD(“­ ãf“ë¨G _ˆkG Ñ®ûŽwžÿôòw”ð>7úp¬zférÂHú8•‚­Cw¡¾H¥Ï$ñA )¹46Á À ù1Kænñ›æT¤ÅìW—(3û6 Ú 6'‡*„Ô!—úöê9äšÑ†9›Ïg1T&qôý0LE”.r‘g'•̰.ôC¾´N…\ÇäTÇÐô^¼ÞO&¯KÌ׿“I×áÓÚ™9¾e‰{€2ûªÁ°!³¢Ù¶*8B–¥Ñsww´””(ox¼ÝíˆÛÿÀÛóÃ% ߯]ÈêßÙ ÚŠÓ§ëŒÒ†Ta;ÉÒG©Â@‘y‘Åy««^´ÏÅ{òXºqi‡ÒvßW#ƒ¸Hㆌœ#ÐgðÃÆÉs->Ê6 lÍõ0~5&†€ÓqnÚU­ÝYÞÝ²Ž–wXÏšýƒžgcéZ_5(Ç·%øsH†J¯]»º{´ûaÕ¦—>…«e¤…JÄ+'’ó M\¡½‹* !çú„½¼ÞR§$“ꔿ0Œ¾@dT7‡}]Ö-ª »A³nÀƒ[ÎÍà•˜nƒæ¨¡²Î“ì? eИm¶©)ÀÏœ`LlD*Of§úÕqr?‡ñª°+Â[ì& §^ҽ˅³oø% °Nµ ngàAS•¹tÓÁLœ#)H é܈˜pk îjp@_WHÊúÙÖMö)¶jéÒŠfB 7;›çR*ø¾$Í¡HÅ\tgÉIU÷8jíª@•cxv&ŽK[Ö¥%Z厪Úxm¸_põyìaÜcË\äÇP^2ëC]ú’$Fרñ»T÷ÁâØ°H¥q}ãÊ ÝtdU%÷t‡}™yiw âAS”ç{×÷=0oÊ×â»âáäkð(‰ž»¥ vŸ”s†x`¸¸žU"®«`C.Áõã[0Îìßç*NÁzOST›ÁžBÜ\²`Ð<¡ _ݪ£¡!â©u.Í5F6ÕÔÒ5œ{dÄ=×нïÒJèy†z‡q”J4 gƒY¸¸‚$ Þ6súK6§æPÉ‹¸˜3‘Áu‹S\W”r›«Z}[§¶±jÝÆNŸHnÔòõ¥4±9)øç€âa**ÎhÔCàSÑßO)’¶ç/ 'õ+´â¿¤¼ §bˆr¹Y›ë5p‘QÃMæœ?zÚï(ƒ¸ š,(pì>È®„*>Ëï;ÕiwkŠÙ©œ`€’„önœœá:!Xr¼ÅåiCŒ{c×Xæ–¿ï Qôµ«ý`ÓÅ,$¹‚('- [|¯õŒÙ_L˜@’9þšõÖÄ,ýìCý¡e!Ž^× OZL!ôκÂOã…Ž_8YØ.XÊÄ”ºZ¬n¡–²[b*¬€g±Í3Îuƒ– ½äÖs:Sâ±Qà™‰ZåxrSãNmž´÷%ÀÝ{UŠ¡¹¶6鬆y+™Õ`*›Ž´>ôË>ÕMmYá\`?½ÿ”.ë©äèMsN‡ÿ»eÆÇñÃ7¾ŽüÎõT?7Á¨'ãD˜<9§<Kø\Ù?Mz1†@÷ólêZ E_‰æoÚö8x#ˆ´ïÏN'þðtâSÖM=“W–UzGáGͽ"Rê¹vø½½‘¤BC,þ’`=ñLûà„-MüVþüÌ|×=ðQËKnÌÂu:×ô f%Ql¾ó²Cõ+ç ûÞÖŸº©R+@·†Çÿu2ÞM¿‰~;Z<øJ°õômê¾ÞV­˜Ÿ°~ÄW_½ Íês£ì©€Æ÷·Sçïqæ3í}ÂÒù7³ûÄ endstream endobj 543 0 obj << /Length 2215 /Filter /FlateDecode >> stream xÚ½X_oܸϧX4§=xyEJÔ}°]ÇÈáàñÖ@á¸(-ÉŽ®»’#iÝ ÷Ùo†3ÔJkm’®…s– g~ó—Š!üE‹,\¤±RG‹|û*äÝ¿Š˜ZÃjÄq¶~õà £Pda-ÖcëbqœÛ§åÝú§EdDdäB m2zò!”1=2’‹ÕèQÕï6ÍrÇq ~\®”ÒÁ›¥QAÓnmßtøDqpÚ~ÚUÏKi¿SXby÷îòçå*2ʤq‡½ºXÖh)¿b.r|ÝÞÄ(ÅŠTï[TäŸK•Ê duš©óigû–íª—+àsh vÛ²õÚ—[b–4hê%üïùµa¤wýÎÖxJ_:üt*’Å*ŠE¤I‡ç¥N»iÚ’¡zÜ—g,~/ëºr³-½PÇf7ŒbÍgWü¼ùåÓv(DäôX)) ªH)”uù¾c[%“(hhÉmÇTQÒºÛÒêÏ¨ÚæÍ×þ•­}²ÓWr²O:TF‡8=ÚT…{- Šª-{ëLKin“eÚ}àÐÆ¿Ðð°{8VZ$™†ˆpå ‰xØRXFƒŽ„Vëw$üIðDr@M\ÕídÛHÊÀ‚7´ë ‡µX4` ÅKB&TühVçH…B¥™W¤°½SäH]wVCj\–ÍQ{®ÊÿLÂ08Ý<¢£k[n>6­§s[WÝ–5zrîF`T]æeKöGI,bcØ~®N¸üëòš0wâèÊv°›yH°ó2r* æB¤¼¨²ÏqBÈð®ÒóEqç‰-N2‘Åê >‚{ý\õåuñ9Ÿ©Òx¡K!L¬»¥išýq-Èk .œªËUsü®hsUÓÝWkH(­G²žt£þ ‘Ô¡ýåã®rÃËå¬j§ *—ß]l=ÌD2Qtß'ŸÑÚR*,„þ¦çÇ÷$¦›¬nøÄÃñGC‹Å×lýÑnqÖ MpNb ‹1^ŒÚ‹ñ"hC1J´óŒ'ã ƒ?aâ&bþ–:“ÓnJ×…, ©-qX´l¶€ÔL&0àó×J*ÝIæðM¹3`3Ôqð×Òù§³ÄáoMðöÎì{ zèIõãnc[âfåv9˜7pXU؉A“‚Lm†ªkœšÚr”Öopãí\á1Âpj(µP¼µÔ_#f Ž ã(eBóšñÎ%>Š0x9'hYÑÈó*²-»-¥ §³Žáâa—§^ŠœÖ]yèÀK¹{rsÕ±V¿Gl®~® ðvOͦz,q,‰àþ\Ýp¥ÔÜ`è®Î]Qãd€âP²¨çÛðnö«`½U„sj¹ cÀ d½ÐlÍJ’Ī^SªÔƒú®ÐÓ&&0®Ï/lss5v¸h‚ ÃŽ€+õy¤6¨‘^ÁÍœU+ W—7c ò?¨ü Ï¿®ö Ÿ©þ¯XÝ€‡Ž ¥R±ÇáK` s«vuÃN?Ð{¹lÕºqS9’~¢L£i—cx‰¿ŽŸ…¿@|ÙÇ_{ ë¾ñýÀ]ªhvýfHϱ÷ÁTKaÂôwJâ¨,433Z6ׯùPZÒHdÃÇŒ(ªï¹ }Â\3³Çë Oè÷û˳S'~#ù […B endstream endobj 550 0 obj << /Length 2939 /Filter /FlateDecode >> stream xÚ­ZÝoܸÏ_a ÕYVü%åž|9çp½Ô.¾ ÇE•]ÆÑÝ®äH»†Ñ‡þíá õenì…ERäÌð7Ÿ´‡Áå{ÒØÎ%6ÃÖ¯ckZQ¨á|.C ¼õóÖê‹®l@Ÿ²b\y­Í(øl.xaô0óòmÛÅWÔ2=Ð úbò29pÅÕ™H¡'}VFaÞÈÒ›¡êà£9î]Çí-{„í'öÈÄLð•ïZ)%r“-ÎìłؚR€„MS™4^çýç4ý0rhÞ†¤dñI:Á;Œ=ËÍñ ÓSg˜ç"“/8ÃBØ\½˜Ø@áÆ¯ÇÍ=ºÇû]Õ€ý$ ®¬…µõ\ŒÕ§ª~ü†‘:'ÛVýXwdßHû¨*Xa^ ª²&¢“¡mþ½ÊÒ4©ZÚiªÎìûƒpõ,,> MÚõ§úER™ŠÌ¨nÒ[ôJ96åØT·1Ê‹R¤FO”LEˆèÉ— ÍA+a]ËZF×´‘VÍásÛ5nãŒ4´õ.KÛÒ#ÀÈ`Xö¹0# Tšâö4eC>ÎŽ.Õ.]*úÞ,õ OàGÜ]u@eÎî©›m½©8†›ˆÿ¸gŸ6× s±£>शÕwÔ#9Rt hììC‚MK} !Ú8´£‡†wÆ3ùmø¸~t;êýýÎõhBÁ(_qg ñ)1 m»º…e Áëà ÅjÇÊ Õ§¾ÝÑ, =GeÕù6u.*©¼ÏÖ±ûž‡1õÝ‘ÄÄ6Ûdmþ?º°|Ô63( ýÔŒ(;šhÛŒ(Y¼ÐŒH;7#¸ÍÄŒÀëgÌ,¶ÞÁÛäð•]š艛™>ƒyÖÆhˆh&†~sêÜÔÔ)ù4H&Lï õ"ÚüsÜ4"”½jÃio†ðuÐ.ýTµ1É%Êh…š¡Çd c®!yèƒ;ÈìãèRÞ ÊQ #s¢+ؤH“K×|YyÖ|ïBΊy€®'ö¡ü¦þ˜JÃLeÇvU˜vàÖØ…ñùƒJ>¸#n1€ÿÒÒKÃ+îý>ýž V¢eîœß“Õ K‰a¤Á¾÷=Jè´|N²¦mcLgÀã¥V>oë´0c Šö³Lóä-ÃAE}Ž@Lç¦0à$Qº6e™\i(À Ž9ä4–ýˆ2aaMÈTƒdZú¨a"`á.IÛl…âKêr)1 ‹ÒgJ:/o§àB:hNíYžãºª Y¶£ÎšßºpÆlñpÅ–ž»¶¹ã&it>¦ë§ë9‡yH×#.nëqÈÞ¶VeÀ× šmÕÇT§+¬ðl Œ£„ÍìÜ: ^Í$Ö4ú'‘[óß;-HÊ1Ÿ¾ëŽ!:À§/:Ñôð§OCeÀµ’ÉÞ£¥ ß{¤™Á Œ‚>ÐÏìx8k€Vßj:pÝ´ì™@ªþð(fÒ()3 òëªá0Už>þšâU&PJúøFSh%˜Bš^ÑcVÀާUß î4ªÄ>º{6•‡ŒßÚAü ½)¾A„u¨»i'€gmêmrLZå¼ ,‡Ø$ƒ¨*µs8cxŽá¾«÷ÐÛ ì8Ô‡°ëL¦ÖÃ8¦ñê^¡6 —ö áÎ`Â¥š¹,IíÐ|H ·á»Ï4Ý+ÓèԿ͆²¥°¥š°!O³‘ÍØ`¥Î}Mc&ÞÀ›>9.½;6Á^°«zpr3'žo[u9¤¾«›iìá ÜQj‹¥ßåX¤ŦQ•Œ*žõ4ÛU<5þƒÁ °ý†ÎY†ç5nš:LöæbÄ:”eøbQٻݗpaTÈÖÁ¦øwXò_Gpü\½£Gµû\Q aÑÞW›z[m—\­U¨ 8<*¾M€CR^B¦]LÂà ‚TÝï W¤²%Å"ŠlÀŒ~# 8-DQêhm—c×ÿ?´ù,8¤‡(ûŒ\1¯õûO¾ÿéòü—U¡“¿GK Z¤£™Ebðmµqõ¡ý. Oõ÷jy롱VX¿eVâµlá'7aÖz2-rû±\Ì“Õ;öéfôéD 7,RAo7ïO‘ïùZŠVµno_³r ÙtuWû j‹'W9i>cÆTì:‡g=ÃÔr±¡VjèdÆ$¯ôÄŒy‡ ŽXI'žhM›£¦{¬Õ$¡Â>ž5YK%çÞþä¡úÓkõÕz !妨³åu´òé§o_ß­/\?ƒÎXÔVA¶Ƈ')‡;2ZAêiÊ"5†¤ '5¾Ôi¸ LýÑOä‰l…Ÿ«"šM/ èý5Ï›²ê™h¶LÁÀÛ ê:™¤I®Â“vGÅ’§M:Ìó¢“éS“c‹Èn¾A8-üxÆŒ1 Кœäó‘2¸uìDÉ7¨¢;WÕ½ˆIŒx6–+/¯®Q+Ïé«_.Îßÿíâòú‚^üåüò‡‹7±cÖˆÔ ¦éŠ·Ý° Hñ-ä7cÐX% ‘¥Åó9 Z“ð‘öjãô,–SÍ2ƒáúH<”…{r5sº†c…TƒPfµk½PÞÓµk4Cù‹a¼AÄgž«3`/Å›*,!K«„Æ @MNGä¸ÂÀ¸S×!cÈü 6>¯ñ[S% ^?ü|ñ>F üp#>¿£7*õëáÓ¯wêf«ñãM᩽ ¦4åÉ qÜdÓîž8¥ÖJ=çZ˃<®ªÂ¼ÉUÕkò tƒ çÒL ÅrQ–‹Û¬®T0k‡•‚ž‹m¡ |Ä‚Íc°ØŒ™V³©Ç —¹0n™ :"QÌoÐð='R+”‰ßéÁ&ÿŒ^þJQŒ%YÑÿáv'.íXŽþ³ã³´°ó0ê[äêѽ‰î¨E‘…oÃ7oooÌíMs8[šÄZÉæ3¾fÌÍ~¨£7Ѩ*ùPƒº{•"ŽþA |äÔpŒ [êói76Ø]d“‹@|#¨¢7À·¾Ýû/ H™¹'Þ§çÉgÐ7æŸÆ öÔé A~ÀòþlŸïk¥ ],ïN—¯ðÿ;l(µß7µŠýáëi endstream endobj 557 0 obj << /Length 2268 /Filter /FlateDecode >> stream xÚÅYßoܸ~Ï_±@N‹Z¬øC•àŸ}—ö±[ p\TÙ•m]w¥¤]¸Á¡ûÍC­$síuÑâàq©Ñpf8üæšÏ"øã³,š¥R0óÙbý*¢Ù½â4 A H¼½zõ§ òˆeQÆgW·CWËÙup–oæ7Wžq͸3ÁbÙ7Ÿ#!í+&¸˜…ƒWe·]ÕóPJ¨×óP©8¸˜kÔÍ:ïêߨ`i28m¾nËÝ\èÀÍ,s+òáÃ?ÏC®•Nãb¯Î¯zob!žq%ù›¤C98¦gI 3ZYëp!ˆ‹Ê%ð>­Fâ:º±2c]B³D&NèßÔ¼LË·c´„<Š£àsp8þf6GEÓ•‹¢5›Æ1ƒÐÎB.w›K_´…}ªË¿œÿ|bÇ‹7G»‰>;ÛM?O‚о¬×›º*ªŽVŽž\³¬Yä‹û®ùþ‡rí_–kÉDÊiqïÚg×êæººA œŽºY¸ÞÚ‰eñ„ ~#ÛÿXûj·ÖݶìõmêÆ¶ëü ÍE»)åm¹È?G22úcµËÂYL ?ýøöÔn´ˆ8ª#¿c¾L›,þðlªù”Ä,ÚI¼÷&ßTgÌY¬”û&äÿ“ÃôûÙöíwµ ö –D v>a2gÒª¬î÷É·*ïê*/œK‘œ3÷+¾ßù¬U{«¾÷Ÿ 2¡­¿4…Ëñ6Ø86qE©œ1iïù ˆÇíð{÷mÕÕ0ÍGÞíÜî( Å…œ&3ÍõsêôK²Âï‘ٯÔ“œeÉ´@c,öÓeµÜoˆÃ‘GXF™•²¾›n@ªS@n‚¢ ·Ùå+úù£cáø¿È÷xï©Oo(S(ïS!r`|’ø·ArÆñ\8<>;øÙ‘¯îPr¤G$G<„Ë ¼ú¤b2‘NxQ¯ê w+ÓQŸ˜<޾ÜWjf\¦&M_Š1O[¡Y,ã½hÕ•Õ– #_–9dâ°n?^I ôÿ» qZDš¥‘òÂYÞ횢B›¼g öyë;º>ß8 t³mÑxqОöü[™骷ö)Ç?‰ÌU½YÛuÑÔ-{Š¡Ö×^²É—MO],¨ø3ãFP|Öܧج¶Ý³àµ³’ÉA0¤ëS:¤‡±‹@fÜ¡©ŽUÈZ¥Òš| = çA[VغtùD^hiaW¥"(H X«ûÜJÑȈyEHc%¬’””à„mŽ@26Gž\"bJ÷ÉöáâÂçà8vo$t‚ª c¶k 5ƒ.ÿ‚>ÅŠìZ’½Æ€½c®¤[÷àÖÔeŠdŒFGÓ*1¦æ×-êû‡UV-Jzá$—sŽÁÝ‹¦4 ;HdÀ±Ú,óGÁs r8¶(;ùÀ5¾¶º‚ð‘Ý´+ØØWÔÛ­Jq«˜í°Ï¬{ C„ ‡Ã€«2sžÔawfÌiÅAmå%JÛ³ê«çþGt,oðs̓LðüRtþMË8wÙg:>_’ŽY5nZ&ܦiÚ7èÕ®28¤âª±Sô¬*K÷¤ »H2h%í‰Ì c Ï©ó9²>'‡}æ2ƃ@jÕA§Ç5xè´ ¾Š ð¦£ót ´±ž8Ä)´Òq8úô*’S/Pf,‹ŸŒåk)%±G¾ÿqeó5Jœ¯Ò*|E7KËrW¶.qïëu}7•¢¦ôÕ KúFéûW8"QÁ­½òùšDLÊ~ÿ†"‘Á[„•wïO?á­Öß½ˆ —Š—‡EWÎEÙÕoÐùÔîhñK>½à’›ì‰Þ^~óbpÁå$Bñ\è •SÚ‚€O ½RŒ3mí»¾˜C)£ð˜™/eT„e}s‚È£ƒ-˨à®D\B±D?º¦–˜¥Î ß-x‡ K2épûázÏ[m‘¥ýæšyKe8t¯ÓY2;½<{gòým¼‚ç:/ë¦ÄŠb› ~Ý’j[®-’rÒ¾Üضo—4W´öÀöN<´ÍTj&®Q”†á ªÀ§á—²CøÈ€s!JálGë8i÷fiIËÒò#œ³UI(Éb ¸XôáÒ¤'¥ihŠ ìƾÊE¤N÷¤ÎH£Œ•D…R,•“N"6¤oKBŠ>(X -tïkb[NÏAíŠì’ôìò÷ðc<¡öJšRcT9XxŽRÑHí!=åàÄËJ?Ò0ª¶ÏøŸÙ‰Ü3¢dBJã_<¦¨ Dn¬|rÎM€Q9ð#Ø”éI‰úêö­PIæ-öI#ÑàÀœüã'9ø±†ò«cœ«"sü‡.8ž†ÂCÜ–…Åb¬±0M”ŒÏsœÈ$QÍæ$˜@i ´¾@Äß“ Dws ®K™®„ÄŽ§Á– ãu®l Ç o×4GVl¤ÖtÑåÒ{Çü ;´]žþ x©ÿþóÊp΄ ?oŠ 8U8œé™æº>À>Å.õ»¾G{jàñ,çq<¥ALÏŒžÑá&/Ÿé¢ês¹Q—uÑ®£Ûý^˜ï,÷¦° Ö¤Ú¾™œ£.þ1¹XúÂxQ£\çG M›bî;Å/•ÆW¹ `‘‹¸g„osà¨ðºÍÜè)SB! ÆZÍR“àçòãOçŸÎ!> â¢\õW‡|ú¯-}þ’s‹Äò¡vì³ê›4ìB÷[æj…2í7’S 0ý˜¾ìû 2ÏGõÁ ,ñ1B\óŸn’wʬÝÜ{§ÑUåw̧)<ƒ>nœ3×—W7×ç¿þôëå‹*n>]Æ|ÌWù®¡ëµÅ}¾{êŸa¾Ñ?íº­Ór §—È·] Ô jÉÿmwâþE`~ÑÝœ²+m©ARù§s”• endstream endobj 565 0 obj << /Length 2588 /Filter /FlateDecode >> stream xÚÕYëoÛ8ÿÞ¿"À}XsEŠzõ€7M›, §HÒÃõÚ–±ÔD»²äJrÏW÷·ß ‡Ôá›tÑ/‡ŸCÎÌó2?òá¥þQ&B~´Z?ñÍèïO¸iÍaÁ|´âçë'?=‡&÷Yê§üèúØÄuvôÖ;Q›Ùûë_ŽxÂx"Ž “”fÞù" )&¸8š¦Šn[Ö³yž|:›KzÏg‰ôêf­ººÅéeÔ¼Eóq[|š‰Ä³#™¢%/^Îæ<‘Iì%öäôºç&âvqÅ}~Ř_Œ%GQ"$ÝþO3Øz«zMúæ·o Çÿô<ŠÇ»¤gé}W×´dïÁâÑšWg§—§D÷íÕùòõÕÅù³ÅË/'o^ž/Ÿ]žŸ@ûòôäz±|ñúåâò‹ð<,I“£9'—¼ºr/.¯ÎÎO¾\,OŸ/NNßë]¾YÏ'PÄøÝ4ZzhW¬íðÇ­êšÚ@­7v¼ý¯^ªÌT“ÜæM‘¹¥²wò¥ÊŠm;¹Müc•W]ÞÌæ‘äÞ›¡ã{ÿ4’ç H #øÆLHCiA¸Ù¨R!Ž>5@+ìÝÑþËaغ2Ðwh,D {{uýþíé—³/Wïò—JcDÝÂò€^ô•jÔ ¸É º7MþÎçr§úPofs¸Ýª¨+U˜]mq[¸nÆ9÷Ôú)¡AøœqbƒÅ‰‘À¯.Næ÷Ðɧðg2 íšàè(–(NÉA:í‡\Kž®Y€"Ĺ,oóêNáK•œÓcÁñU­Y©›,¯`¶¥éÌìêò]·mÌž[ nVOmÏ©§]10W¨¸.gšy èøLðõ÷Y×úM‘,Õ*v5­ž‡1‹´œDÍ&6},›º½Ï&ŽÙ¤>}·kK`3åÏ zysC¶Ê÷½º,VÀö<‰üAï{~KÔz("ƒI³CzjähÍ|´Èá §„¾‹;LHío_äõ:ïšB °Tõ¼×«jßSÑ3®n‹Ê‰GbŸe &ÁçcžÞÐ,z€é=RÆ iœœ|Юþ(Ð"a€† E 4ÝÞŽF}ú"ЈÀÐ UÜ4x…†@ÆaD™<Œ2™,¿²aÍAŒ™%ÿ˜ù ¾Êñ”Ð_"˜EƱE4wq!GèQ6"Ö6RˆÈë´}ˆ=ÓµØÀ6†+È‘™Bg…¸ªÀžÞ‘ÛÅám«*Kl­Ê;eÆ5ê4Ü4%ÕäªnÑY•J{t¼Q¾6Í·-Ú._+âŠK–J9 |´ùãåp–0JV¯Öô1Þ²îæj³¤ëOÍC¶Ô\š)ˆ6ʼԳR_{ØàzªË0µoqwüg˜k,ñM’Jïj«ˆx»¥«ÈT–S!SQÝÔQ·[kÐ1®YÁ•= ”P×ÌE$¬¨«ÚÎ49t‰Ô¡d€ï¼T†^–›ƒ*-i\«èˆ¼ÕaE]j$˜9Ä6VuÓå¦ RÍ„ʱ+˜æþŽûK¦V[éÁ.  ƒÈ{5„(À|•$¬üßø¹D6ikQå%ù^×Ë©©gØð¯™ñ®…šîlŒ±“åôíòU ·wj< YöÊüËòo*sé\$, b»Ìž¹%ýJ@µ/Ò ªý:ö£s³ílDc"îtIbÛ›+QU[¢S}r:ðV¢¿,h¹.ïÌÆ¢ÕÏØK<ŠXìOò‡“{1HÌÕáÛG­Ø™ìöAl`Þµê±Õr°) ¡‚óù… ÇéÈŸT~â){à8áA‹bžxHxðÒùí¶¨ð8}P—SHãcK3¡ˆ+¤5M¡p¸¨ |ÀNÙ0âá-ôÿ½²u^T™js¾ZÕî ˆéfÂû >c¾¨oÓ¶øÜbÌâÛø@[op°4&ˆF±i‘Àá³2ÌÄ™a°îŒÉ´f….´¥"W›e”ÄY-´}Ŧ371¦Ô©‚ÀO˜ð#+ØõïÝn·wNx¥,¢µýEÁ¬ldx2IÅ~:…Œ}á8Å!Bo kväDÕàîSiϹhšY6®qº› bXº1kmP2Xú†ªEMŸDºˆ }ŠªíTióm9JÓz.)§é±fæ~ᤑ¤,å{Š­æàÎÅK'Úu88Â×F—ZÐLì#@ÙjÓ…Ùp…ðݶ5øØrlX'bÉmÚ© jaäA$`Òg'÷ÓãQêøcYXY4RQ?6¬Í WO]—$ ãá­ë¶ ó“~Ũæ3dèWÖÕ-ÏY~ì:$‚Ô:émoç:$ëÒ~è,g(>i¹Ø‹Î' ˆ‚z>>;ë•€(ê‹QUeß·É&vì~Z0ÅuŽ{:×ñöлžÔ‰¿×˦›`e³¾m3¤ƒ{5yuE3.qÉQâYÛԵݖ֦…¾3lâ ð´->ÿuîT®ãò ˜¨oONXAŸqHûh6ON'ªOE;• $DÆy×A^RXuÚŠß]¾.î×!œûGwÊŽ%ÕÖ7µIkt%7”:·Ç¶Piâ È‚1K¶©C @¤©%s–‚Ÿ  n½˜d n€ dM ¦hïú9'‰Eø^cÂèÈ»çKwMÚ×±yd‹OºhnÀ3Ÿtá¼ì¡fÝç#ÃïKniúŒ‹^R‡n%"Hú_Ýð8rg…L´zûõƒ-†HØK“§Y,÷àÍqû~\£ Í„ný|¾÷žä ëÙQâózí~f`Qå#$2ÔÔ¦,4ÂÃÔÃêò±¯ tU«ïç´$°Bî$mŇO9æ=ßf”Grl±—~o“¢_ö£‹T8Îù!‘²Du‘tÂøq ¿Ã…à!Oe$Gå äí:3ª= ˆsùlŽAlQÝZ¢Te‹> DQQ)˜­-ý‘ÊqKø[,£e¯×4 4­ß–®Âá\f¾]ak8N|aš<0ª]C ýn’J]s†Ü^<â)èêÌØ^:3ÔµËM1mvef”Aü{ Ѻn»fðØ +­&üžæ}}K ®Œúd=$ àrUâï¬Ö§Àʧ¶,û?ʨÜ endstream endobj 574 0 obj << /Length 2705 /Filter /FlateDecode >> stream xÚ½Zߓ۶~÷_¡¹—Rc!@€ݾ¤©Ý¤“ø2ñµ/g{BK´Í«$\I)sãLû·g äNÚñÌ —ø±ØýöÛ…ù"ƒ|Qe‹2L(¾XmŸd®÷ŸO¸k¥ ¾yòÕKhòŒUYÅ7Â!nÖ‹Ûä›ú~ùöæo ®×b!˜Ò½y“‰œ^1ÁÅ" ^µûÃÆ,Ó<Ïù|™J©’—K-Ómë½éñLÖÔÈ“¯»Ú_–B'¾g]“Èõõ_¿_¦\K]&ºÄÉž¼¸v£„8³]”8Þ¯÷ËaczQhÉx.iõ³Å¹¾zY”¡¨Ð¬È ÙJóq“š÷wÍjOÂS=¦ªd¤S^°2/雦¿_¦°Ïfվɸ\á6¹HPU,sƒñœqEB5Yhßî–¢LöõCãLÖýœé(ÎWVLB7kd?îÈãF¤+Eé?ÓíÞ×›çþ¥skY¡ë|ªñ¯õ¢Æ 5±ó²€J?Ôa×F'Rx){0²ɸ7Ú<š(€'ïì¹™]»5ä±^yóé+ÍT9øÎèa³é6ÇýF²6ª²Ü9–&Ñ}Wïú/°2Uªäöê׫· Z¡ÆWµµOìBû„´Oü•’·Wÿ†¯bÎ,$κ2 Ôaët]û™ÚÖ6àw¶„ÅÐU@¢o·÷›¦‡“.²"¹>PodHœ¼t†ä‡¯AùÍÊBsP8"EËš¨+ÎÊlfMWº"¬m,4éÊìöÍnmRÒrŠ63Ì)äÔàœbZ %ý´ÏÝ´½Ý… pœyDB<ÚÍÐÛnß›I»æ¾kúfÖù˜›¥ëÆFÊáø¦{(›­ëú°÷àf‡t„§¡æ‘÷u$í>:r´iLÊTm]Á)j5‹ÝØ}” ré©wÑ–S$ çÏÎï<=`Ð<P9ð†ØïÅ'Q€»šûO× H± l ŸIÉiä⤟UË¿ùþ»×7±óBCˆÊ6-šiÝÐL§È4=|ÃrdQYÈAyÄŒØ9•¬ó“ZDŒÀcW‡Ôù,/mTžÚrP !dÛl›Þw¾cÝô=n£,¿#èíG»ÂÇ@…}tÅšC —hQ‹Ó¶u눊gîA#….³ä³¥•¤¶{ÚSY ý†ƒ&€B†Tp”a¦ž¹LW]d`Ñ#Îë¹"sQQpˆ›8M!Æ@†¯é©×gìnèPgӮܸ†^‰BåLâËÈ’AðSFžoc ¬æ¾ud1w®òj,"ŽVûœfˆâ˜=HF)”d•œÁøkÜqU%»iW¥-¸Áóä8±ã¢ãä¼b¹¬NÅÀ)h(¦«ÁøÜüͯÏÍ_ž˜¸46³‹ìˆ³B ²žH4[D®`E΃s»R=ÑùîÓÒ\\–Ÿá\¢TS– _ÔÖÀìqeÂX½?8"U"‘²ýnøví\±]×–øD„ÀEc"´Ù„MQÂFŒÉ*ð]ø E7Böµë;ô6Êá¤}obtÍ íV °Ì7·÷õÊìíÇ †Y¢‹Q5{DÀð…=røÝ›ng¨i—¡\ æÙ*~ó„ÓKƒÆwœ×Æ-¢Æ€î tTP?ŒÙ!¸‰I¢.±à¬8ã Gœéí¨=d£iï>B_v<Ájйcë¾j,“h=´nm2í"^ê6#|zw”ps)Ÿ®€vAæúDÂí¥Ò@,’®Î{,áFX„» æí#šú½bU›ˆ£ÚŽqø¢ÐG¥„¢”áÎ"‰¸—:³³ù`öâzzZ7¸àÞ„ ·ÇS: T’i>#×_C6U¶íÃAŠ’>‡ ÈvØ`11Y˜må^F‡C8£ëèÕ¶iÍù)b4]Y)òóA±ªYAÿÝPº._”S‡ú9:a;=ŽÊ°21R—?¹¨WíÖšã³DÐR$ô:e±Ô¦•%ïÛ ¾sõ+5šdG+Gl;€X€Î…9q€›ƒÿLÀ½°*r0ö+›:XÍGA2† 3¦ŽÙÅ}eAŒ…ˆþ?,=œ r”§#Vy:ÊbÖõÀº(›K¾øñð¹É$59i]ѼòVUäѽ±°p3§èýLÖŸ#u:aŸV¦…ˆ´n;ÿ¸¥†¹lÒ®Þ–«`5ø°9GÊÓàGMÅ Fâ-!®]ãésNÍ3@¹|HŠ^ÿøí‹Ÿ^D½Z³l$ièÖ§â‹( Ë‘dÏe&OÄ/•bžöh|Ñ_ÓØ,“[Ú … !:Ñꨖ+$˜W¸öX)—„Î,}6”×§©hÚÏnÞA! OOtµÃŒÂ±xštN«À dÆÐ!:‰¼¢Út5ý‡Æ¿ …x°¯Çš›í&‡e¬ØbM£¬H½ùHe1|ÛÅ©ªÌñAv˜ÆBk9ôÀTÓ™ Ö„äK¹Ž€îk÷–ê)²ó÷í%–H£*YQ•¡]¿Šú‰`pž^ìil¤IñÛ“ŽøQN—®[Ø}ßš]½‰DWÔ&Töµ¥rŽÊ–GQ9å82¹P_» .Mæ_}y Ñ Ÿ|ÌP£º™lüil©j€mHŠkÆõ%cÅϪäÓ#}jÏã!hÓ¶?lL½ïÏÕØy)™ÊÔwË5dOK¼pøTÓ“åÔ$Xß¹ªöù4]ó `îª š?žFìM¨"TETŸt5z¹ÕÆ‹ÊÁQh±h”öwœî²`k|Î1ˆ—…M·'0Vä¥âǶ×*kõÑ:dÁòÿ«ë1>œG]¸ õ;,ˆcpVtê®D™ØÂ¥âÇ|úšà‡­;k¬Øˆß†HeK $éŽ6Ê.jÍD@¨DfŸO\`nÔyÒïR³Sw´™Èù^nĈ#O/Äù³å¡ã\€eÁÙ>‚ggúŸ¬hvë(+Vå³ü;ÜîUôzÇwGïw\Æð¸±„W9ú²úHy¬> stream xÚÍYK7¾ëWð¸{0Ūbñì8XÇYÛ $køÐžél´±%C3$ÿ>_µ4Y-4MÇÎE¤º«Y¯UÅbŒâ‚‹1ºhƒº‚A‚#¶±:J•'Âëâ¤2Æê”ìyp‰Æèr¤YTu9gü'WcJ®TÁ¬ðqÄbDI1!p(X2±#©öJ)ÛcŠ•c*ްÜL°<Â:ø’ „‰“ÊöUt°|ÌÅ1U|•ű˜ð„M˜A Ä?V| h’ÖY„²œ*äÁkΦjÁ:Eí‰bR!åªøšK€j±TL ô«Ù ™f—) ¸Ì1à³ÌÙ^—¦U˜.ÇA'`²ÌTñ*%ûªÕfÕÞfUh’Ë0 .z%C¼ÑäYÌ$“l¯Ä1Ó™%rš=|8›?q¯àDì¼çnþãOÿu3ÅâM”åõÛ·¯g_}õ1:@ËXî0{C×1:JäÔÿ€îlµ¼rºùl¦ú³ œm§0‡›9¢Ý̱‹±›íVšÿ°^¿è¯Ü+7ÿáÉ™›¿ì»r·L^þþ¾Ç‹îýlþ5öË«K ÃÒóÙüy¹º^Ÿ÷—C<=í/ÝãÕoî•ñNÀ}®ülº5¾µý±¡{´\®°Ô«!b™,±†Q7Bï‰0ÐÏæ/®ß\ ÿÿµXþ:›?^­/úõ†WxmC*â“íL!oAûÞ'ÃTŒžT@÷h0Ü 7ÿvõrå`òüû?žüÓ 2™«Hô5—[®ˆ’Þ¢ðLŸµñ´­CÅ[Œà%«mÿêd÷õ³§O¿ùþå.KÀ± 6‹{#@îÑ`ïûÈz w‘w Ω¸ƒO÷q—t*ît‹·¶#mGÞŽ²k+%?d€ý†á2x éÏk‰]µî»‹fh`Sz ÌH­ž£%göxvá/ýÏ‹eßÌSÀ£pdðD>ÍâËa8¾]uÞwW¿´1唼åòR}B6‹¢!…l.é ãçýÏ=Pq¾è.ÛXG8ÖxnY[½‹ï³7ÿï¯V—î¢wÝûn#A³Á3´Ï(bõ–ÙKöRt{ÛçÈGcÁ ê,/és‡‚œF¡ Ç©¡ md± u3Jë–G\òË%DeÖ 4R®žÒah<íÞ÷Ý;ˆ·2÷˜®×íØHªžP‡ #!¢PNØ*ôsI R%¬ÒDfLVÂfŸQ³©•G¹ã;8xÝw+÷¸»\œšõn€FÞŸ%Ï. §b¯ð{%œ†½²ÁèŽB…¦(Ô®Ã8•¬Cú":TëP§êP×ѡŒt¨é^:ìıº-Yê6žUm.¥ © ¥ƒÔè‡39F;µÆ ^êá¼þè&¹4fWªÕW;¶ò"6¢²µC{µÒâ0ïÅ;Ø·1jAe†co’º$ŸZîJì#® òñTºG£ÁjxžšKçg¨eS 5ŒÒªµ7¦ÁÑz&&‹µLZa¨j—{k®Š¡¡+á#ýeH œrX#JJ«£­m”…„£ªÕÑr2¬‹Ô[vüŠiv97ù˜ÂØÇe²›K%&œ%­é„m­©ÆÙë=a› ¥{X¹Ýpû4T,ŒÑq:>‡SŠÜ?Ýó×>eí«4Þ¤tÚ&Uû¤­éØ|ÌÏCk³zkíýG8vâÙjý®C¹ùf±ìÖ‹Uûq·&_ÅšÕ¨r­A‹ÀÍõ¾¬Íû¤Ç‘´G Éê~ù¤°à8‚óTXlÅjÙ×HßlW A¼µÝ³'±–yH&y…å¸Wöh$ Pîmw;§»Þj÷P{(ßËC»ª–Ìñ!¢¦±Ëé Ý5M³9d Xá©æбGc­9ÿ]Ð!elŽ4Ù¹µäØEÀ­ÊSu‹£»š›¶·#vÃÔœ²’g»ZÊ^2o2–ul }–Œew{Ô2V»¶‹^Y§Çx¼‰¿O#QqŽ* §æRTÇ¥h<­Õ›;¨Xäf8õŽ£]8{F(Báî“Ý_—à)Ò$¿œP”îÑÎØÂ Qéƒv×§õרkd7®ý¥±Ù_Â>`ßeÏùöbÅîûè#—GÜ¥Çûßû4†'’ÿ&IõæBlÇEI¦ºh{7¦©¹$;;[êƒñê2z+¥nÛ¯ÞõWëEwé¾ïV¾¹>»€øËæ®Ò H¬vs#·‚ FÕ4ÆOÄ€±½F¸<{4”-²ä–Ü]Êò¸:Ë<H¼RÙŽ›§yç²ÿÃÕöâ endstream endobj 579 0 obj << /Length 3227 /Filter /FlateDecode >> stream xÚµZÝܶ÷_q蓽eE‘¥¦yH“4h8(zvâWòYî®t‘v]7ú·w¾(Q»Zß¹ApÀ‘~ ‡3¿Wߤð§oÊôÆ›LeNßìÏR¡þë™–Ú:l£¾{ö‡¿@U§ªLK}s÷&žâ®¾ù!ù²zØüx÷·](]d7™rEÉ-¯ÒÌp“Êtv³šÚãißo¶Æ˜Äþq³µÖ%Ù6é‡CuìGl±IÍ“|1ütjßo²" ”ºâ.ß}÷Í·›­.lá“¢ÀÅž}}7íÆeÙ#ÛÅìW§V•ÖÞä…UÚXæÿyl6Û\›ä§SƒË¨,å2å}‹P÷}¿«ŽmßIO}ÖÓ¥>ô|½ÙÂ6›O¾ëýêì…r& é‡ö¾]Új•º‰‰ñ¿—¦IÕóÜí}×É?GÚMšq”õÀ‹sÉ»æ¸ÊƒvZ害ÿõù?îÖxÈJåÊ©×ÐTûö犴bkSà/‡SÐFiÇN‡jm±Ì)“—a–î8TÝø”eU ^e~’ŽÚl½³Éݦ0Iu@zÿH7­Ï@Ô· 9 Àš<©°ðÉûv<¯¯R“n¬µÉn–ö{þwlÆ#MFmL‚³~¿q0U-„W©Ká,«®^eVdJ§:°üü«mõ¡WO4UX“ŽÄy–€eïªsõKÍA…1¨Ú0ÑÏŒ=ê±nì¡Ã¯7víEžüðÍ—ßþxˤ‡Yz ÆuvaÌ™IAßòxK+z=²¯óÉd NóòM‡"=ÎŽÄÈƵSôVå™{Ôreì¤É « ‘Wîq7À}:©zݾid½HPÐõ:8•*5&§ýêì™Jý„LÝRí0}“1›Ò(ã 1fñ c3^7cÓ½E´¹eànÄ톸—xpÍÐN<-Q'ÍsOV[*ëlèùÀK£¬òºÚ¿­„A´ÐþļM;E…Pk\€Ç)@ò fÚ©2/Θ·â’î÷=¬À85–»êÐàncZWï–„q74M·¤Ñ!ý¸¶Mxá+eðOàH÷‡Yœq€­XZVMª5#‹¥Ùµ¯RmwUèXq{Z+ èbÄžC³ŸÀŽ)2rlNü{"jiÜõb«uÓ_™:s‰Þ„øZœšÕqÝí¢gÔ0m÷60ºkkf•ÖCð ÊdÓö·(ŸM¸uê8tl†q X²/Ÿ>{ kÒä.„áC3z¦PPEMrä2ˆB¢8a =yð7MO-ïÛæß·,Ní öd±ç<:öØÆåJÛl¡á6ÑNØ'Újȼ°ápàœÞ¦·[£Ò(^>÷Œð‹õÿñ+¯¸¯•¹â<åŒ,|#ꉦ …ÁÞŸ»„"é¤aw’ ‚JGÂÚ©7šÊFúuÒ€A#S$ãA|.AñŒ"ÎÕg \ÎÔö5OtaFaºÓHI Œñ)t®S¦‡› ³4l<£›²ƒ®Yìë{¹Íƒ ó²<¿Í£àŠ‹80Š0 /}¡nÁ!|Q«ÑH¹ß1m™ÝšË0 Áéwav©”–@ h[[K/ꎥ;†E9.hù©èüÒ$1 åÔ Ž­¥ gФ†Kr1\•âØÔ¥ó2I „ªCå ÏC2?“ D*Y©àE*ÅõH¥XF*·!þ¾ ÜWR k˜8@(ÝÏJÐ?ãÏ=$!çhl¿“×PË.…"Ý3û…°/<~†œ¤þkŽkw:žæËÚoK¢z-7ãU9¿…,BrŒYïÏr@[õž/v>Î>"•D Ó˜Á;o)[àýZ€èÊØ2ÊF N3׋ø¶b$U‡’l¯ôë1dn•->%2£©R°j\Úy©àŽ?Ë\I© SzáW|YFØhê–’‘Ôó K´š=åüR†Ëš¯\Fø“ª,]QhëŠp ™›bé¶ô¾êJ‰Ô‘—…dZg*ì”ÂGg ×-tÖx'g f‘LNí\ùÌüöNþÛEþÛ–p"$ntó^ùç 9¬I1¥]p¢-™A¼È¯&JIUž‘ì¾ Q¥ôXäVÖž?rÉÊùš^}Á+´²s®ú»Œ^'W1‹Àj«Òü,'w±Kı´Lä¶Š¯~«IDh‰îËÁ¡“×@.@å$pZIÆßrÆwì£÷äi,fÕÁ¿¿•‰êiBIRj•[û YJx||Á/”!“€o—cHZfòÞ«ÈÃZ’a퀬ÊÓüÓ>°zÚhûÓ~¥·î³"ÌO2Œƒá!z”ð°ðÝI®* †°c–³‡þ¯¹Küö1!ñ0y ð àa¿þ®c—D¿¿0Ø…Ÿ²Ühp'Î]y‡QT~ºó?3` endstream endobj 583 0 obj << /Length 1291 /Filter /FlateDecode >> stream xÚËnÜ6ðî¯X -R1$E½‚ @Z$…‹ 9t1ê‰kË]‰²¤ î·wÈ¡´â®â¸†|ÌûÁ™[QøØ*§«4â„ÇlUÔgÔÝþsÆÜ.„p†ñëæìõØ2Jrš³Õf;g±)W¿Évý÷æËËøŠ“8ËrIy„ Â_…3P5ìwzFQˆ7ëPˆ8ø°ÎD »Zº7”¸‰‚wÝí¾úºæY0Þ”Q>þýã:d™ÈÒ Ë°³÷›Éš˜ó˜k0Níås{YD*VI&‹꯻êªjÖ@MYà†zKHr« YDXŒ”WJ׈ð€Ë[\î¾Ý“¯ªðôèQ:Olú-¸È£g”.‰‡…јŽÇ¬9xÒ™Òü€§ \-·¹–!cD€ƒ<]-è8u F'°æ$‹2Ä,´ÉˆmabʲÀ-º³ÜcJ"úì´ºR5R— WëV“9Öµæ¦Ñ¸ªYóœêÎ嚢od£vòg8p¸k­vª‘=B§0Ȧt´niwrä>Ê/t7(tS’€›2/jY¦) ÚΚS軪Ö<C~4É ˜Å‚TìªZ™}cŒ4Âís.û¦*¥ ‡R:Þ²Sý0¾ …ùÀ¥ÿ×J–Ú€ð$¸i{ ÄghuÔè Ý•nä.\ÊÒZ¡j GòÚ óÙrÁ;-¶~¹ZDdæ1Á¦ƒEG蟹²³B0úÆ8Îe‚+à²m<’¦P^]¥Ê+åª44EÕUrç!¸)ž§³oëã¼PsH<ê ;‹rèK.Rõ·~ßme¡Èí^–^ÁŸͲàáÀê8ŽopÝ<Kzx[êRDo·‡Ž7gŠxËvœ5ý©‘Ìcóñ|ÊãÓ8ùݸ׵ Áë]U¨ž´ÝÍmÙ§ÔõêžI²±!u?T;ßZw.ôÖyôZÕ¿Ìùðº#ó3mÁÖå?ðÎON¸—j…n+i ŸMT\ ¢•KºÒ):hÛm,V?1êª{5ÞU-¿ë|BÈw»3+f$/2  ÓK°šCȲ2-ß•~D}M`w-ë°WMŸÐÚö¾P7¹ˆIÄ¢±nº!qAÇ('4šêk#‘i¯.iD×Bˆ 8”t«–ñ4.«66Šm彪]Ìóœð<ò|jgÓUn÷ 78Äóy@Øy…  <õêF:jöZàÆ¶?XíðÇ¡ ¶ØçŠš †úf>]ŽÜâ`_;|œÐî‘Ѥ¯^z:•ëÐÝ×u ¦Œ8ìÀ¦ÐnD¦.§[;£Û~­ðâ‹ëx{1µRgø¬Y† Ïr1âINr1òÕR¬c’òtÄ`àF–8…\$$KÒ§ àÒ¨½Ó…`;ü,¸í%¿Oýuø?§H/ùç°?Rÿç·ÃüþàÔ£h endstream endobj 588 0 obj << /Length 2333 /Filter /FlateDecode >> stream xÚ­YY·~ׯ$î4tóèË1(¾àÀ°lxýÅw†»j¥Q‹ÍòoO‹ìc†ã 5‡G±Ž¯..ßÄðoŠx“IÁDÂ7ûúEìfÿý‚»Ñ6ì;þvóâóoaÈcVÄßÜÜ-IÜ6ÿˆ¾ÒÇí?oþ¾á9ã¹Ø–ä­¼‰…¤%&¸ØìKå0Vív'¥ŒÔÛRIôí6WQÛÕzh{\QÑ2zÕ½ˇ­È#?sдåõëï~Øîx®ò,*b¼ìÅ77“4‰ψ‹;ÎäÍĆKƒÀNÞ4WŒKE¬+&·»$Ñ+¸;"æ¤ æ²ø¦ïMy„ÜϾÿå93k'ÍV2æ°W2î¡mï«]{ûÎì‡éz\®ž^¯i1ÆBªÛÉ”e鉒~lT‰âÑûÑ šß·IGº¥ŸæÔç–z«¬#h €ó&–ñV)À×écEž›¦ÖXWzõ¾´VB ¤ëÎÝjm£-‰Þ²–²ÎH½¯^âoIæ…ù; 'b™Ê¸SG:eÿ?˜š á‡e…X©½7zŸªhû^S\9d2& B2= ×oõìk=Í¿‰“8ŒÉT‘y0ÿ—è~ÙŽ',éìP §ÍNÇ&ÈÚdŒÖ86ž¹JwæI3ĽоִZ›¾vC¯3.G'ÀÒèÕ¥ ¶\¯Ö*¸QàJRî ÒK0g0h‰E'…Á‘&0¨ÙØ¥\WÞ»ÿã\Dnª6 Z ‡Öü8h‰Ò2¾Ùy ·˜ÊŽBß>•Í[wÆ‚¾¦±—?-˜'>¼¢-!+ÓèPöûÖB44-ALî‡n û.×ÇÊ?¤ÖÊÙXšt7Ýâs€­é8v™ú¨÷í îÚ•g%ˆØlXËe÷·«8äD4u0ú©„9w‘…OpN„K\vä&~þõÕ×4Â8eV¾¤ÏãžØûQV[>„g±ÌΣ€SÈL)/®È_S*zØB¢ÐO¥FÕ¤2*™a!ÊIÌT–/pDÒcæ rik‘Íð™¬Ó%Üý`',:ªòàÙÀEQœmFü$à¸&üâZ—=­ÞͤöeE«®ÀC]©;Úh˘òyB®óûÅÌÖ¨ð*jUc?m}P²a@XYøƒ|Å!£ÎÄ&àu¾ q«c½ :ˆ”S"ï-[P€±\×fç96túJÒû-yôŠß@«¤eäúÔaÎôûÎxæx؉8c6Í/Pé ~0wech¬«û±&1òÄœARX n8Í–õ­e›C^9w³µ§¬ËQ°( ôSB,ŠRþ EéÍsU©š«Ò8_V¥qq©*…}#°ÇÂfž«Jóœ©<ñ~t‘->óíÊuà’Kei¢&Êì¾;ãVtSTùŒè]Lû1hfââO!z ËÄ´ã¾}Å h ç8½žš«€¿v$%åPpð‰,;vï.Êä†F¬+ŸL ”Šáè9Ž'²Ç®ÝQðQ¼8K×ÁbSI(x›Œ™„¢÷£ô㻠θ:I+_µ•9ITk-‚Ò$½ êQ½¤ù±‡Dìf,¢iØ{Š˜Áý¦H²K¬ Ó™ 6tºé±rëC‚¥ñÒ<óùI÷ã¢ú™VÞôýrä óNeReÐÈóOè’õ™›9 ý™>G]é øcÿV?˜@£ô%©ž6âi€ˆä)J0kÓa€Ã1Nö’¶Áê‡wÕ8Œº "⯡bhª_‡P­TPovÁ‹|à§ïŒÏh€þdÜ©¸»1;AÜIŒœƒ+òO8õ4ž/Àâ¼¶kë–<æiåUu?6è*ó  uS¦'©L‡ÉgF÷õ‚¥Ê>ΜÑ@x> stream xÚYYÜ6~÷¯h`_Ô€›%ê2ÇÌÂñ,ì΋8‰Ó¦Ó’Ú: '†÷·§ŠEêèák 0âY«¾*²ù&„?¾)ÂMG,Jø¦¬Ÿ„vô'ܶv°`·XñÓþɯ ÉCV„ßìo–$öÕæ·à…m‘\–ê4˜€ c~c-½¸ã…)¤úsQ§å´^; ô Ç“'©§2½]ñÝQç-2ÿllgæ½eæ:>`u¨¶f·ü›¯QXƒÃd…S±Óýsºƒ> ¤?_¾{qñöñ0*Âhø™Xa"Nžd'©uèF›åz¨t_v‚”°C€ a&Ímª¥eH@•PS¯±ÔÕÂÝËrKƒØ²]DZ6zç9ú›öXõ„(6\Ì×dì ‹ps¬Ôq2˜¢½ÆTK<þ4sÙ&fÌ#B°|”Ô8uSqÕžŒèft®¸º±ƒŽUBé”GËð?øÒ >JŸÛ¡EÝ õNP·{sîÒM¹ÉÀ¤^ÄÅûÝäÅÕ/¿¼|³¿ÏMâ¹¾ÅÒdF\pÎK ˜Ì©²ÄrD•p|}m÷/a«´7smo¥±TG»+9•:²ƒ"©»UÕš:Š d*ı鸷×;Ÿ‘­EbÞo˜mÒg­f‘,Ô„ŽuëY4Ö›¼’"{zMÀµ¤køn ÀŽúà|Ǧ)’‰ŒÓe<òŸdß˃²w9÷¸áLCq€±Ù5îöFcfsçž±*÷Ø%+½(SÇ­u-õzöýj<:Fê (Õ´=£w6Á qö¢ðνü¢ž=ë'“çàï?†Oò(?£E±S~Ÿ½F ¨£Bk©n›òº>ysMÆÍÛ›gË‹¶a JEýYW¼Ô·Ãª?©Rß@™Qá„.±öåÁ2Úì,éÕÑݾúïÒ|VÒ6—Žoºèø¾tí³àžœ•¡‡õo˜ÒËXTô6 Ä.=„XçÒQir ܾ1ÚiWšzHâ"åx¬ã£¦Õº)£îˆÄ'0%H2±Ô½¤¦úRªÁZnr¤…ånó‚" šùŽ ¨ÒÁMšRÉJö4€P*¯Dª$ Ön¶7VôPýeùL÷+š.Û’’»ã9»(Ú„ñŠ‹Ìæ 6›ë œ³ÉéIdFº¥ b€gvÙš§«N¨mSƒZ¸^Öî½Óó”Ä3Á †“ÚÓw6]æóÌ'|vÖeÒ îðè¥^;y ¶—Ò®u`ƒMK«2³u{[¦ó"cñYÜ8Dí í©k¬åôÀi±­t9 ßÔÈ(ªwŽ ¸AãöY@ïeç5ânp»š“…ÿU îbzŹ'劄EáTÃ÷³K‹Åë @ÕIô„cgU?HzÁ‡¡¾§à3éTK<³Åj´ãйÁÅC ÉÉf9ÙŒŽ#ŒXr~qDyL±½”7§ÓÀïh¿Ë”êÍ ãùôæzçvud˜bÜPNÅ®œZþú÷{AÝ`Û]zfnñŒ[´›Wy~s:#E‡¤¬«ˆå3 êkê±ÛQðªóûSš¸U*â`ž .ð13]ÈíùáÈ®¹_ì5!²Ìh»çÄ¿Ÿ4 T“%ÿìH endstream endobj 608 0 obj << /Length 2602 /Filter /FlateDecode >> stream xÚµYÝÛÈ Ï_aô^d žh¾ô‘ö%$¹;\²ÀuÛ—M˜Ø“]]%Ë‘ìd›kîo/9¤dI–½iÑbõh†âCòGr$1üÉE/R­„²r±®Å<ûG’G+ X (¾¿~ôä% e,ò8—‹ëC×›ÅMôÜí–ï®ZÈLÈL-”°YN+oc¥iI(©«ÁR±?”õr¥µŽÌÓåʽ\f&ª›ÊíëWL´¡Žž5ŧ¥Ê¢nfãˆäêêÕÏË•ÌL–F¹Âͽ¸îµ±J= .R<¬o’!µ!Ñ×¥)ïîÄjHlaU¼韘dÄÏŠôHñÝ“\ÄùE™ÈrÕQШ<Ž6ž~×uå·xZû`Ç‘kŠš·Ð>&šldRñ»íám,ͺ`<»s£Ñ¾Á³híÆ{n\°¯‹ù/ø £K<}Ûú6xÆ*…ÒÙb%µ–x^|´|l¢ö(¿ŽuÔøªFÚOŦ£øxpÛ /*ú­ß/W6‰~ó{^àSK“Ñ àJYt/oXŒ¦&ÆÝü+_W´§ÿ,Àyµ®N·™1lÌzv‘sõúõ‹7×s6Ze:Dïß5¾õͧ¥µ‘ÛpõZÃxÒݹŠÍX þ%MÒ  Í„Cè…žAåˆAѽYг[ïy‹­£…6ÄÅB'¹H¾6N?è<:5pP‰H3öˆgpè9píÀ)È™ÐÄaéÞW»²¦×¶8J£uAÇ‚“ì˜**yÍ•Å÷6ÖñÒ­‘D[æÏšúfë÷Ì|ÄNF»þȈç)6Tt §ì÷MážÎ9xDfV˜1æwp#e£ŸükðŽ€éØy˜ä/ôs üÝß4õökxcâj¿w¾¨_=ÿ$Ú¹[OÏ?üòâ%˜ëÝ~¿{úäÉçÏŸ ½nnŸÐêWÚb5”жù:çË«‘†Lù7´Z–Gññ!Û9 Ôˆ\÷±p9hŽ1ó¾ØNÑ/‘c¸ƒÝÚû:q½Xš‘j†l˜ô<ØÂâlå(ªèÝ튎Rj8D™Öí~€Ã€U° êÄrKã}Òħ©´Lyíýýþ@þ,“‹ ’Ç •'"ËÔ‡ÃËãÅüejGp 8’”Ü sw’E7¯ëë:(¯i%¨¯ƒÈA‘-ОúЧö$” @3Pä äžñ¹Žêõ¦Ìzha™ðôQ Îü0 ¦ß¶¤i“Et•‡ ‚ùxvý+iSùÆq©¤4‹5 ¶K&”P©¦Y¶PÐ’¥Zž±cGµÍEØ„Ù%‹b¼ ès߬ƒÁVØ|ÎáƒÔ'ú*MC¤äš1VGõ€øSfÓ< SW¦ã›¹g5UUèBÚŠ!7pU@Ï!š¢'z;ãì0Æ‘¸]7ÅÞñ¢/i$Çd ¿pëüÿK’ŠhCy%C´7E]sÛðþ’«ÆmëÐm BzåÄÆäánµ›,iÈ5 =tëÛ ;Sض¦®À˜Œ'û+UºÂ.yúãœÝàt(} ZØðv1ýÌ~yÑP§¦oˆ*wÿ©¯Õ'éNIJ¿‰ ‘HihR;¹‚[‡ŽX›¾è;¢®6ºÇoœÃèÛ÷¾DOú3Î\ÏÞàX(?ŽN‡]ب…ý qè¾ÈlX¬Ne-Þl¦o‚œÝ¹ï(D8Ní(NæÏn¨ž;=;6:ÃÚ¨×>ÜŸ0Po7ƒNP›þ‹Ã¼§Œ®^‚âg{òἜ?7àå•ïîÓõ$ëª\äš;¢ïž3?«’8zîzAçNžçäÙ2ϳèÇ3dzL£?–&×xBgÒüñ4 Ð2 ‰~S,‘ ¸]é†*‚Åö À a|KÕDy¨Š-c~שMïõÕÿw7¨ õ´–S¼còpåwì½cþ  Eò¶ õ!ëãÙÎYæ"³ú¢ ²¤§ [€>;·®COµ'”zv\¸ëÉ ¤æ¦¾òå]ýŸhËïqHL ¢gNçË¡$ùæ60ÿ­€ÿsù0ÑþÌ\ endstream endobj 616 0 obj << /Length 1652 /Filter /FlateDecode >> stream xÚåX[oÛ6~ϯ0ò$¶&Q÷4à-i‘¡i°ÖÛK’ŒÄ8Ü$ÑÕÅ Ú­¿}‡ä¡,¹òìeC€ˆâ9<—ïÜ({3þ¼YêÎbŸ8$ôfYyäâîG®À°pü¸:úî%,=×IÝÔ›­î‡"VùìÚú‰nìÛÕÏ3/q¼„̈&©¦Ü¸Ä×$‡xd¶xÛÂ^ø¾o'ö"B륖¨KÚŠFR+× ßZÖ;¾µIb™œj–««W¯í…—Il¥JÙÑùª÷&$ä w%ÇþzIâøa0‹’Àñü@ÛØ‹8 ®•ÑŠÚ$ZÜS½ºqC×E¯ÚšV͆֬’æ·l.md¨‚x©“„>˜¤„—ôq R5ãÈ?pü¨çS*³ ÍèôÖ`AìD$š-¼Ø ½gTƒ 0åL>‹—tÍJ½·±\õ?7›ÀïY¬Ö/¬Ñ<,ã7®d;y¼*x…2¥çpøîº–T‚÷1`a{R‰äÌ…&°°{4› ù•tå8iÀÓw¼PûBÛŽÊß…RE'Ÿ‰µåToÔ쬆÷v‹U§æQ €…ê… šk)¯%I›¯ÁcúC´›ý­€­æ« q·¨Ð”‚÷ÔÊ1êMÍÚÞEÃrRÇ£Ø*YSâ²e¥?¶ðýcÇôßX†Öï¬Åé}ˆýTcûÒ6´iÀÓ,åcä:‘˜<;N˜Ôº2„¥|‹|™„F?çø’¦j™> êH´jù…¨$ÑÑ5ŠFä¬Q!æŸiN1ÎQ ukÅ!ú¨¤”êä?ÌK¹„C¾k”'„Ä#•™,ôs¶em§¬¥CBˆ ÍåKd‰Êð«XJÝð¨f ÃsTíQ§ K¡ÝD±2€60î”®º¾ì”=‰ç+_…,QØb[€ *qØj0ÈQK~¶0ÉhÄ0Õ}áí•O”[Î>MuÅà1©à`Ü’Ðñ“{ z¹ÔÝ¯áºØé£í©Ì€6½fµi“9n ’¶Sz8ÝÐd-1‚2QâØhغc'SÝ€O½þwª„þ*Ihœ|¯Ç’0ï%ßµf9þr¬·ö"JH¨’–Þ±r†jŠ4W>³º…¶®ÖÊO †|‡BÏx-E½ñJåp­•×!±7Ê¡ùî9ÈqCÜéÚªÅrP´¦ÎnŒEï9¦€Ø9W9·¡Ýß”O¨{“qCî…QßT,cM£"#whÍñTcŽèGË7bÂUoò’ÁÐK^QãôF娲FT²ZÅ|$^vÁ‰RkºQ¨:œ±ç“³{˜fˆÏi%J“4·ÿäJèêsšµ31™Œ–4§CÁèk2Q<°*þ4¬k4\ DÍðåÀÅ¢åõ8YàÅ $2BûžðþOE#DÖИr|:Ä"gzr Å c] _WüžÃU('š¹`&'&è "é:ábCFžö‘ÞïÇÉ^La4¿3™L ô5ßåû–áÝ,ŠÇ2u¼85Rª™¼ëiãkŽÎ¤«;ÛhBJq“2Z¬;\ÝšÖ/ƵwÐbåW½1•ir¶c|ž£w*¼×™ý2o{Áº•kc?sú¬ÈN5Mýœ—#qœkÚ'u/Pº{F\Ú ÓéÝÐò‰œw5ÜoÚÞ[Ö ºÐö½=Ärc îŠ–—b>yÜì„‹þ _ fºŸUlL£…cßæ·’ª7¡+Y½–üôáÍ.l¦„Iäø.^^Ž?ñ¼}8Œ™‘Yc$ç»Aµý ]+ ¼PŸÏÝb²!6ÃHNh—ÎF4:ÞÄàS¾ZÓhÿKVÂµÛæPXƒ/×wÂ`Æ×-@·¼Fíÿ ˜|UÅŠæxÐtŸ‘Yÿìð„¥“ý¾Bà–''È~M Öëiûâm²š·t²äõ¬žJê9‘É Ä“1‰§B"½HÓCb†¡þ…a˜”Õ¸‹4ô(‰ú|ÔßöÚZÎÌ-Q~u¨ ÃÞüobó `¹8Ð?Œ¡;à.—ï~:;·Òo×//^¯ÎßÞâÛ\œêÇ›«Ëó³«åÛ_~½øí Yþº=žÂü™VËËå›—ËWç—½ÎëϪ۳åÙÕ»¯/VH7ªä/Qzú ; endstream endobj 620 0 obj << /Length 2330 /Filter /FlateDecode >> stream xÚ½Y[o·~÷¯ò’YÀË /ssŠŠ%»*$«µå¾Ä©KíRÒ¤3Ëõ\T¡@òÛs9;³šuC-öòððð;WrùQ ?~TÄG™L$ühU?‹ý迟qß[ÁrDñÃÕ³ï^A—Ǭˆ ~tu3fqµ>ú1z©·‹Ÿ®þzÄsÆsq$X’4ó!’¦˜àâh9š*»¾²‹¥”2R/K¥’èÕ"W‘mjÝÙgT´¦ŽŒŽ›O}y¿yFÖšH./_Ÿ/–Ẇ朱âéë…xS–\±B¡úrVÏÍš‹å+œpT Ëy(¿uÉYÌ&&rÚ¶(fžR°R™‹]*.AljW:º&µû£Ê8Ÿ@ƒ4,c=lä@jè«6ålÄqÅŠ†¶Üà‰:S6–L=% ¡s3¤üZÙ͈0̺˜ µ®ÀÉ•‘G¤î ùt4c '±9a/Ël^otéû0v<Ö9Š§È¢ÎÐg #ŽÉ?r %õ¶1Ô7î¸}íähœœ¨5«30^ F¾¢ˆÞ8†,xv;+ìAáÁÞ\^œž\¿ýûû³\ÎùM¦ 4Ëß,1³bÒRà#³üä}pY¿âäøäòÝÇó³«gǯO/æö(8Ke²·‡ ^€°êi_g@3xNž9moÁb @+…¨‹É7ª¥ÀEaPM¼gÀmFDoqÕëà#˜`„’Ô¸/.xäb¬£]û5]ƒþIÑÒX0ì{²Y°xZ°Œ§_Á²1JÀô ;åm¯+êê¹RÁ äò‹ã‡“¹gI:쀀– m-Mxd‰÷¶)ÁB]tþépEÁÄ^ uÁBb,¿D»÷3ä##ßqä(’VpâYÑÄÚlCƒ¾ó6Ò"Rû¸ã¼ÝE7 iÌÿè¯!Öu½“BË‹ìK+Õ°ÿÆ·ŸzÝt hr(‹&PÙeB²CÄ´×àÁIô³éü@°dG4Ç4ˆÚ°!$ütu£žÈ–šÖÜö›µ_8¢ö|‹Û¬Ï\v©ËFÐ2gØP,ª¬uŒ\¤ÍÙº€¤¾ËÁú¿}5k…b\Y~KÜ ñõ"€ÖÞ6²m šÚqôu²5áI„¢ƒÊX.²Ç¹‰Š—A*ÔaddXŒ {ÉPÉ€¢ï=Heª;ûîÎB‹\n¦¥¦jUD'3ÝdšQ,¸Ã@;ä.•ûÜ…“>íÀØàM~jÈVÐѧ>p³å²nÙÐøÊÖ4né{ãÌm,Us° E‚·-Ò]˜”Ö6µ%âv1µP_Q²¹â™ƒ=Ê!BŸ>¬Œ/|Õ¤ð­cÁ¤Ò|Èl­?¢?ÆÀ`hÀŠÁSÛ¶/i µ>‡ ™2!å¡&|v¾DÁBG¡ÈEZ$´D7«!G°6;Nh0n̶4è ÇFÒãÌ~œ®âi¼t­Ó££Ã ìŒ)€±™Í 9Þ¹€ é‚lç¿æ%ÆgEкBNo°šr–žˆaÊ»ò÷ð•Bš±ÎÆÈöŠZ¾óèÏÔ·íœÜÆ(‹b‹ôk®*Žg;V]<@”¹¶ôšàä}H@ñNK”8±õñÒq-ëmeüÚ5E ìÓDšA¹>¥ ž»š"ÐkûbåUšÿà]%ñŸ¡ÝR‹‰©L…Gþ"ä”eQY.Iwz~ܪÒñ¾&}¶*WºÅ˜‹CH6µº:ìØPÍN·3 ޲®ŒªþÖ%:¼½š7Þ†ÆC «Ñp ıù€”¥LíÂÀÒ=î·A(ɺ·1·éR@"•±ôwè”8ž¿¿8{süæåéÜæ D«©Eû\V›Ö•|þ“Bÿ¡—B5¥†üÍg7b™Ø¥¶çŸK˜bL?̲ã™{iüãü>p©â/a9 0‡{KQì=R <>ÿÛ_Žÿ_0˧…Y>=ÌòIa~ w´CÐÆOjö´ fOjö4 ¦¨Çÿ{Ty2+ôä ø÷qÈw¸ÞuLȾäf2ucÉ”+ÐGÖúùP‡Øg¼Q¸R7Ïé˜c‘ícýC•&ÜUägÔB°V_·¶ê;Oç’Zž®0MÞ/艿ìuS.çêš[ÝÙ¦Ô£2SBñKOJîÞݾ§ŠŸ Tv(&9Ëâ!®uç߃ %—Fc³Q `:¹*I‡È#/‚ä fÛM}&GI«)t&¯¦8”bénw-Q¬éÅ»ºº¥·l·°l}wí§Ýã¤çfü5´™CÙ†d?«ÏQY2hpô¿½x+Ï3/s{7Gó£»˜Ó þ­€qÖuö)÷ ßçu@•p+aÜU'#q¦Ë2ºJ>]}ùãÕTÇ=:Ý Ã?mÌæ®¯mß5Ö•½¶‡¢Œÿàzü7ÙÚ¸rymÎ?o¯#tð¿ÆßÜ < endstream endobj 624 0 obj << /Length 2353 /Filter /FlateDecode >> stream xÚ¥]oÜ6ò=¿bq/ÕYV"õY8M¸ˆí\âôår‡c$9Vn%¹úH ®¿½3œ¡D­åz‹bH ‡Ãá|s6Øøð 6™¿I”2 6yýÌgèŸ<ÛÂÎÁxqõìûS˜¾Èü,Ø\]»$®ŠÍ?½Ÿôíö_W?o‚T©ÜH¥­|ô¥¢%!¹Ù9KÕ0îÛíN)å…?lway§Û4ôÚ®ÖCÛãJè4QÞI÷ëX}ÝÊÔ³BÊååë7Û]†iâeöìÕÕt›HÊ'®‹ï+ÝûJnâ4Œ†÷‡¶Þ#y Wù,!ŸlH% ×µàæê:ô1¬ sÂBPèé[ ²fF8zÚæ›|0ùÅ7úÂa ɈVØ]sÚ'€IY€`õ°÷¯ÏhòÑ|›×â_§ïI+­‰Ê«o*‡ç¶«r )$q Vn…C Ñ’¢÷…Æo`ûõ\¬H6.9ó†°‹rxûâœà öÌêC†n»Y„²ƒg¢G‚w¬Ýi(‡p>8Ë+Èò³ƒyÕäû‘¼IY÷ŒÊeÑ#dRK´2õ‚M8à!Ñ2ød"™åÛm •ÜùjqdQ]3#JˆCP–ıo*šiF»ÐRð)—¦ÝŽ–ØÜó¶êIÈLîx_r š)Ùz1ö×zM_FŠˆºæÐˆ§1ç<˜ÉÃè¸ ~1Ú~„Ð÷oR\ŠGhD>ì`MÜ|½d¬š@ÍŸFQè¹Af$˜=± ¹UÄáÑz¡9XE™H!Ò-î‹Ñˆ…¢¦°üë¨÷ 5ŽàTBƒ»:k{2_aWŠò+jl²Å‘ö÷–bÃáô%8™ã×m¼HV«VS&NQsÏi†‡áø€»Žà#Ê÷p;›4“0šK JKÁçðÙ- nes`HÖL±ÏÄîEh¦¹[ƒa¬§|ÀÌ¢óM‘oÒkѺNÕvn¶ ¸Š+÷Lp™uìÖ¦“{Œõä l«„í˜:òg `W ¾N­=—8б„ŸˆŒI8±k«Ñ„rÉJ¦ÃdÆAó9}<¬€xPD÷ýX—4§€Js Ó¾ü¢ëÕ²$É„?•[}‰D&sÅ‹ |[#U¯šÃñÓ¤LâQÞ/häÀ_è“®îÐÿ„-e 0Ï’åËöŸ˜ jÇóCIq,4e”+5<«úÞy¦Â²֫ hl˜¶ã=Õ*H ÕrQˆãXó)-Ÿ>§ßcŽ_ÿ£áG(´e=´M_”æ}‹¸ÚvNþd“ä„z ûª¹á–ΫZÛî•Õ´@ÁÀ¥‰?Q ×t²1nýë7>ö²|ËçG^lµ)ș¹E œ:>xLUW¼$½®-ÞϨz ß7"™­ÁZ¡]!ÛÈP_ÕØ´À„)S¼¬øŒ v±‡Ü”Ug¿ª»rOÓ¼í:ò0צ(›‚q4p Ñ VÍuÙUTÇÀ0–v Vz åо£‰ÄZ=òÁþG=é>•öÖü ÙÜkŽ[*ÔÉñ|reW½‰¶™ŽRã¨cëFn’MÍ'ÛS›z¡æeëx?ƒ§Pû½MÚ½õoå^Ó_6Ö^Ρx›À«5ÌÉØ¹<5Öë¾-îùtGæþÉ´ó‰1I”Ù‹™¨^%‹§:÷ àýžFKis@u»Ú“0Më‘1¶‡§nõ¬>§bÀ¾hÞÇþ >Ö ÛþvJ4õHÓ"H}„É‚;ƒ½+ò56C’Ž$!áñ•Ý÷šDñé^Ñ[;ð‰?%ìOpÕ3 ~Æ*v¥íg\V©ðQiƒª®4m®…Œ–qøˆŒ±ÓdK¦þPÈÙs;ôBÌØ ¸¥ÈO±Ðrþ±¨¼³Úycÿeªëëcl˜4‰LeVspÄ1¶b3÷Þø׉™ÛË~ “0q2ÙýÕÙéé£7Êœz6ƒt÷¾uÞèxL?ZO£6¿ñwŸ œ›*wN4å]™NÏ‹ÒÂ~ÝH ¨Ý\ùím³®ÐPij±Á‹‹™Jªndà¹&\ŒE ZnxÌ5¼òn,ÛPœûi¼òLÃ* ù_}™bbÄ^0ÿŸö;ºl endstream endobj 628 0 obj << /Length 2419 /Filter /FlateDecode >> stream xÚ½Yësܶÿî¿â&íLy3:˜x‘ óÉŽeÕ™ê1‘úÉN§’èÞ‘>5žôoï.à‘g^¤d¦ûÝÅâ·/_Äðã‹,^¤R0¡ù"ß¾ˆýè¿^pß[Á‚ÕhÅ››/ßA—Ç,‹3¾¸¹“¸Y/>DßÙÝòÇ›ïÜ0nÄB0m2šù ISLp±X¦Ê®ßÔË•”2R¯–+¥tôniTT7[ÛÕ-ΨhM½n~êËÏKa¢0²¶´äòòìoË7ʤQ– ³§7Ãi´OWíž…ÇAÄd ¿—C1ËBìŽ@&¡¦ SYâ@†íoL³L ”¾¿:={šà,“bŠ3dC83ÎܘŸ«=¼Dê 2×㳦SI:ÖÎQ„iÅž LD˜ëpä‹XÞK9qºòm‰§,6É]΄Hÿc”Ý—wÐÏ%œBñß„€dRË@éìý»Yv3< ‹5bð1æjã™Ü9ÎÅÕ¸²í£Yj¦Êœ"GrN Úzì ž…Î3&)P²;ꇸúÊqBÉÔ‘ì ‰xê+×{¿„‘íÿƒŽÆþü|t¼µ.Þ&™s›ÐŠ€ 7F­ˆ~°¨ÛŸ¿]®L*Pÿ8X¹ "ýC§ßM=%•ÛÊ–­; „. p`.te¤ åhzuYé¹n uÙउòzK«jjæycwíÉÝ–]K½²r(\û­„yPÄD–£z ;}ýÝÛÓë›YÌh03èàn ]ÁÊÇbb(Fíþ¢•N¢¢¥\ÐaÑhÂÉízµßæNŽ85·¨²; _ÁH0Ê0HŠ&HÄ+<­ÒXG—HRÄÑ.Hý±TðY7÷¶*!Tà€sˆ[êoËÖƒX~ËÔç¦Ó°U^|XÙÍîÁþ8§Ø P“Èhµ‚ÓöÔ"81»±Ûºí Ggg†Å|H~8{óáõ,?©&ü@o<6Yté#6¤ŒiÊÜ*Xg&Ú"Ø¡—"0é•fŠö§¾h0ÕiL°U`HÍÖ´i×”Û¢t8†Á]wPX[ 0£kw/`Ð9w×â žÀÅiä§6δfR—Ä—`¿6'ÖůÏe3À«€·cïžh8¦ŽË¶Å°#ÍäÐ8k=ü+¼8‘`>àÆ·E»õ]Й_KM^;ú îóT<èŒn\“Êè¢è®ÞœŸÐ‡wª¢¶l»bë Êai^{£Zƒpë鬅ÍCV ÷:#ܘ„„¢íQ;x Õ13R?·\ºd\8q)¸ÔÉü‹¦¬ò@«Oð¾ULƇaT‹Õ4ÝêAÌ ÜgÞ&äØ&\p‡qè]¹éšP˜>î6e^vc`Ä;|œóo¹ÃÚ\fnªËkÔ6X^UTxÝý’¼PSˆsmDÝ'ŒsÌÜŒ‡3îÉ!Àä%„•b{‚á ‹¼Ä#7h²hJßK—àtKC’ °¥’nHÍ®)|î‚aÞùKìõ[Z7¢¢|rí®©ïÁ’,­)NU‹_‡RÛÖ'`­®xãcÚ‰Tü’½AÃׯ%5nx6o2)Séä]ß¼}1ë7¶CÕ‰†¿öyõ66 ììº ÊFÌy× ÕP¬2@çt0RæTrŠF$C“;ÛØ9ÉÓ„¥: ~ù÷ÙÐ- KL2–Üá–ìê$ϵص RM $Á' œMi“0"þNÒc‡œºXè¤ ú¨ê P¬Úªß»á½A¦>M‡|O‚“¾>{B£Ž0´•_}7z¤ {MÈúqèêâ|ºóêìœÍö-®Ì=€‚ºäh´¥6„%ìú ^k\A¡œÖÌq­™±Öpó(ˆÏCõ¬¼‘~ÅŸò|¥˜ÐbªÑ½òücx½‘–%dã.s¦„ÝÞ'ëÓ}tMƒëuªÂJÈS½¹ïçr¤l]W†Ü }Ó÷}¹/¼ÑÐóŽ k?ú¾µ›Û¸(È£{0ÚTVkOÉ…\ä1ë÷ÎFk>ŸiA‘­õPÿùË_/ÏO}y[V/o{øÝAØ(šÙúDr–Šdœëi¬È!D[8ü•^‚>am޳Ç+@Úê¯ ÌL˜iyvg÷åW¸¯jWµÑáÓø¨mÊ©m¶6¸ÝPtåæÕœz c†*§×Ì›M]l‡çVê|sD¡ìö—r'¾¡EéŒÕ}¡©?QãÑ] 䥆4 ò?ŒˆšÏr×þvnêׯþl‡· ¸dfª…‹Ú¥ ± bç 5`¤ŸËInƒ`eU‘¹øMæºOhqŸ%#æ¡*à. Oˆ{Ÿ‰`Y6~`#Æd¬ÒAapV@å†éjYxó/›=T i?“müAˆq-ØøÎæ~BFÞ›€_dÏnhµ+ qøÈñ ]2@hõjyøPZjŸ¹\PB%W;I/·¥÷ BØr]: vÉO¾š7|ív`Þs3\6˜¾Ð:òÄ+çÖ<`ÓPö ÿ¸‚+ü“ñŸ0‡~œNË·4Š•èðœ9º–nÞö] º/ó1 •PxØÒ:|ªPÿ¥hiR³OHß|ê¯ܧÅÓ„äDî¯p},}–Ó͵N ©£Âÿ©¼_åÊsÏQN2ïEEÊYrðÈÔª´µ7Mqoé£÷ƒó·…3 äL8†yn4‡Ãp‡t|麱>‚žLvvc±høÜø¿¬/M4Ÿë& ã{w?تÂg’¹zÊ8>¬¤˜éN•Aa2Í€ÚAUSÓeÌ?^áŒ;´Ã±,P|Ý‹It `Ãäó0–dG|(«™2O" ¼u"‡ØŒ•S,]¢7` ZKM_•# Õùt$ÈnÛð×Ý€n4 endstream endobj 633 0 obj << /Length 2281 /Filter /FlateDecode >> stream xÚ½Y[sݶ~÷¯Ðø¥<” Á›ìº£$Š'™4jcå)N¦$#åå„Eµ›üöìb<äe5NG3"€{ùðíb#OBø“'Ex’Å‘ˆyRÖÏBîýç3É­-LØÎf|rõìOŸCS†¢ yru3qµ;ù.øTï7ß_}y"s!óè$I^ÐÈÛ0ŠiHD2:ÙΆì0VífÇq Î6[¥’àóM®‚¶«õÐö8¢‚5âà¼ûi´w›(|ÏNÓ”ËË×_m¶2Wy*{vq5y“DÑî⌧ýMs%d¬ÈtÓï7[0Å”öm(U©ß†q¸AJ°$øu“„aÐ44/‚ M 2š‹Ì¤ˆã,pÿzþæÓÏ.Þ\ñÌ…r•ˆ\N3ÿ@2IÛ÷£©©çzìtÙö§€d¨Ó TY¢[šÒÖv°ÍŽßª±¶Í4¡)-¢Y„¡ÁR7Ú²ýß ¨×ŸÐx?‰ÄUÝJ™ ™¤ÐˆáÉ Û€]Ù÷šV¯Èƒ½î4µB4P&N¼Žh}Aú*êÒÕ Ïuö:s3ILRYL_¨¥ôZfJV Že$Ryk}ºVŽ•ˆÓØÏcC­0b³Mã|…£¡C V™Äà€Ø±ëi¸ùðô¦‰÷:h57l­oÝšB›‘?G¢çÈ!£IÁRkVÅšjÓ×Üüiä¹;ƒDml·Ð–xmèI¸tu *DcRL"! ž °‰x³MÒ(¸Dþ_^Qð£¡(ÎÐNÏ«M¡‚N7ý ¹ $S¹É1fÅ´:^´,©¾ËÆÉËCv#—°¦CgßSgoë}E±ê^A#‰—àÁÀÂv‰º>ÐÃ…pë„·†Ÿ¥®9æèLX£Z˜‹D¦žBƒ÷•¾ùâëõÏr‘†sÞÅE°QNÄ–©–C°Éb¹N(•RA9‹xHGÎ5äã8¯ÍzˆÈ0‰™7œÚŸÛ®Ú­™›JÂÉ·Ô˜ÛZ7D~Åä‡Þצ­7ÀÕ;k~^Õ¯B‘BïúãjˆÂOó>ô±g#\6Ac€IâÈv¬àgq¬Ã’‘ m^JJÁW‰ˆrúèëv0˜ 8Æ0S86bÏÉb]òe(ã§;{c:ÌÙY0ø.RW‹”I&=W_}±Î­¸§óœû´°bè<°”[Zzõ¶ÜÂ2ˆ4-ÖL‚èHªóÍà?4 ø¢ M!ÿw‰fApÓXÙÒžf:z'¸¡ÑŽô¬ÝŽ…­ÇÀmÊ8à I,‰,)§«5¤ )R9qîùš3‰È¢ìaÔ¯HS©PyòQaМ¶ûq5a ÐyN±ˆR¹$²¹×Ûbœq¢ò`z”ÄsõT‡pçD l ¦Æø žÒ.j¯‰ = ¿ “p=‡ÀŠÊäÿ‡S)#¥!4ÎÑ ,”!.jê¯ÑÓÑÞ‰j¼Õá—ô0âvzQuE˪ žD(à±õÕ…iœíý, nžs{êE*)–QÝ};[3×ao®,.zi€ÈqãâBâ6…¯Ã²½yd+ÀäŒÿlÊEW>a|ÛkWÛ8é5Kµ> W „Þ`õ²ã~Çt[¦^è ,ñÁ(M½¶ïÏ­ç4§·”õ=eÏŒº\ÏYø.-ùh^‹s(çÃ<ÿ_Ñ·áÄÞ#VkR¥²H/'ý¯€( ÎÎþL€J¡µ\«ïhÊóÏ©ñ=Th9<1–ϯM7Œ+Ž zø,ßé;sJí[`px¬1¥é{g3¾êζ4à+ð…"Ê–;ÁÐvîh"Ï¿±5kåŽöšÖÑYP´™Vs¿¯  œÀ÷%äO”Š8Œ–îNÜŽ Ôqnïu¥ï¼×Î[6a¯«þ¡»üUoÞ@´´¼lÓQæ%BÃÑK{§÷¦ò.·àíýО.äºÄLÃõH€ÌÑķeÛuf ˜5ìÌm £ò²üóÊ#ä€TžË£¼† Ñw4Õí¿Î>¢@C¨Ú ÞÚ•Ùu§+>˜¾l«w¦ñÀôfì©¶Ö¥ë9Y è7°½éÕÍܶãdIŒ—;óÖÒXÕL« Àv-÷få–Ã3µ‡å¿r½ì™ñ… ݾ3ô¶¥;HüN¸ÞÁG·?¸.Óþ O2Î/(²Š0@.`©õW¶y§½ݬ‰…v6DóY€iŒ¯i™´7û¡Ã¬ôBµ{ °+'‰ÝŒ£ÍLäÅ›¿{ñÍgç§ËŒã 90~…nž ¬à×z†˜±¬,òA÷Þ5ØíÓ5/p³Àke³ Ôå÷¯†Õ¿)j2wû57ùùËyŒíŒv·X-›º8θ½þàÚŸ±9Æ.áiÊè)–JÄ"q_K²•_n²å¿víì(}ÄòqFŸ*µçÎꩦâ}Ãqiégb¹S]ÝŽÜteÝ‹evn–H±Œv‘b]~Y'€»ešˆL›ß¹:vQvïféIƪ‰”óÓQ~þå°ae1Ãzc0š)%-vjŸm`è!m¡¾I×q᱕…HòxQM\âMˆУ/q]ÏâDf¨¯Ç*”¦W4BÁŽ]\Èv«…ŒÌ@c2;¾¯–EYª¦‹¡ ÿï°4«'´X NGá_žó?Küí‹ endstream endobj 639 0 obj << /Length 2098 /Filter /FlateDecode >> stream xÚ¥ÙrÜ6òÝ_1•¼pvE„8x)G•׉S»å’Vû²ŽSE !‹ÉóPfíJ¾=Ý@ƒÇˆ£•+Åâh4úîFóMßäÑ&•‚‰˜ovõ‹ˆV}Ái@8ƒøÇÍ‹¯^ÃG,r¾¹¹›£¸)7oƒWÅaûîæ_ž1ž‰`q–»Ÿ"!Ý\lÂÙVÕ{³ ¥”ºÜ†JÅÁëm¦ÓÖEo:ÜQAé2xÙ~ª‡­È¿RäúúÇ7Ûg*Kƒ<ÃË^üp3r ñØEˆÇüŠ9¿Ë6I¦—ÊQÿåÆÁG] œðK÷ÿOíþ;SMI›?¾z㇢-ܨÔwUSµn2Ô´Ú·EÓÝ¡~Šd´µˆþ°¿ÂXQ‚z¸d<^²»/ê¢$_ܵºü‹„ÉHx}ÄQ«‹òä*7ýôh•¸#S»=DlñÆœÅJ-(á$:ùÍI&{¡=þlÈÓÆ,é‚‚P®s.ês‰þ÷ÙV¶ÜIñ‘¢˜åùy½‹K’”W¼¹ýE÷´¹ûÙé®Ö^íC7YÅ_Ò9©ùΦ«v•iàÆÆQêbVÄMˆ_›¶Ñ»Ê›ÓÂ\Wt@»ª..ܸê:ϽٛÝÍcèú ZÐbCIˆ#úsÔÍþ~’gãi­Z}ŽÒð¿látYÿnŽŠYÆÓ%U÷Åþîw•Þ—sãZª§èz×Ó>“r;¸¦7¿™Öã¡Û/gnfGd¡k¤Ø­¯^§ª$‹Ð¶!T…CU($K8Á)&™l‰®ÁPƒÛmC´PŒ¤i\}ÞlsŒ~oñ.C>’Ÿ²Ä‡¿ëMJIŽ„+)‚ƸéÎ4[‘½>ö´âEð°å`HÀ£b_}tÆ®”²Š"«!½ú¾ãíЈ÷‹[ð$†%´%\†LÑVÝØ¢®À+Fã¸sëh@WÄÒ"ªËä°fYúûÛ.Æ„µºãY|"eYš&: 1R.MªTáNÝ\°Tè[w‡-¨7ó´¹äö 6Ñ7jŒÛØY!Õx ̵\÷2ñÄüóêß7„¢Ê2ÉrÅý© < îh±*fp>ž[;"î¿­Š'wŒ=( Úf|ýK1ò‰®Þ&y•B6J%h4eðYðÚÍY¢÷Pá l¥¸9Eö×+ <%½FpO²LZo¡2xwájšƒÅf]á}ÕPÃÅ£ª†mñF&’eYr¦®q0á h…Ù%¢)ñYj>¹û‡N»ùP»¿¹Åhb#Ț³Œ %½Ÿ6§8eÁ²5t¡¡G)§4ÌŸƒ6‰OGÛî¦è"’„‚†îÜ Ã“HÒ1†‚S< Nî¦x!@ˆÌ±¹½zS5÷E·F“’L$#àq YÆ’dò”Wf?4gpå,MÇ@bÇDªŠ=„Nôš^¯^ÁY.ò9¹¡7Mª Ó<à ÏYqóÛU±€7ˆQ¯«áÒyÒI´ŒÏGË5J€QËú „w(óW¬tàoí6¦Ì·Ft–›ÍÏ–cšÂĆWÐM*bÊp3#bñy¼ôÄÖ.¨›fԚݸ‡þ~vy¡Ñ®& y’³$>I £þëõœBŽŸç‘ÖuF;ˆaEØzŒHøßYËÄq|´¹Ý†Ü Ã6Ttvlˆ¹®ZKõxœ0ÎBJ·š[ÁæÄd·OÇÅ@â$Œbòwë,V’=OøR’sóÈë%%½¤V/2ËWõbOL’ÂY³å*',÷íìh‡‘Ì!á2¸~lšKþs´¦ÏT!$°Éùô¶€¹v Ø2 Ä :órˆ¡XÌò…ç{£´&‰u¢²A|¦çÁ°íƒniÕ:×*°IšbÊ@ %>Xb^ôXX÷„AèÎ↥é]„>nAì.‰- & s áOu"Ím¸VŸK^ð”Iòl9§ñh“x5w•)'Rq[%ý Öš9¨£©x€N´a; ÝÆš¦«`0À‹Å_A'ö. Í®óð·šg±½!⥘>'{C #ÀÆ)ŽÍÜ<Ím…(Ò, é©pMwýTý8h¬æá-Ûõ䄸~hµnv¸r_•yƒ>‚<:ºÉ²%±©%‹mf%„ÄÚÜ'žÊíŠESkËaicÖOþ‘‚K'LâÒ’I—pÝ3™!“k9ÄÁÐÀZ©©K^Û)é8$ Z¨Š÷ÆÆ£=ezGìBχíí€Ï-i]b¸’,¥øN·KVcYP›û¿ÀZh|6ð÷TI—XwC,î6šÒƒqÕ.„‡¤PpkÝ”BöôŠÓOš8—³)|–¢,(;sÛR¹[øF#¸2ÚÊÐFÏ‘·¯;]zÝ}K*èO Ýâ#ü„wðEçš\ÁûJ-ZN/xW9z‹#w¦ý…9 ÈB<»Hæo±ùõQ耊&|Aö7þ塀qù­ã‘3/{‡o©£õ‰ÚYï dÔý)nuÛSÓtlx>hj½‡'1–½=í5z§»Žâ#øa[³.™%ADàß'NЛ¶)¨K½¢»ŠZz¾Á´hííÝìZ}$O. Û‡!•ÚVé¼Ùäùd41.8X2îX> stream xÚ•XiOÜFþίXÑ/»*žÌá“F‘RB"U(QZò)¤ÒÔž…I},>Mšþö¾s1, Ûs¼ÇóÞKVþÈ*ë„QD#²Ê«lWÿ> ö-€Áäįç/ÞÂ+Á(ÃYo§$΋Õçõ ßm¾œÿ¶")")]Q¥™Ù¹À”™-D ]“-Ùe³ cëðx„a´~»IÃuÓV¼o:µ® óÂÖ¯ÛëAÞlhºv+7G>|xw¶ H¦É:˳ƒÓóQ›ˆÒ=êª÷õ¥S}i„QD£Uœ†ˆ°ÐÈ/º¼)¯D]€°¹îÄЙ·^6­°n”­ä¥ùâ…äu/.pD”Ä/ÞÆÉ”a@0C hŒ¶0¿?“õºqHÖïOšr¨áK_÷åo†ˆ3𵶇`¨Dk%+„y––ºz·K¹åaÎñQ“V~;ÒfÅ–‡aÑËÌy%@³%­â%4;F›%ɣ鉟—ˆx'ˆÅb„O=‡Ö>yŽœþë—׃h-<ïþÓèòF£ …Ó¹¬ ,Æ»¦ÓF\±±8„HÉ’Yð(”ÇUy#Jç7Šr‚ˆù,^îUÖ¹Ò‚Êa¢D¶çn—(,GdsĈ¢LgÞç\­r8Ô½õÈm9ôƒŠWNI”¥ž§)g–p Ýµ¢ç…£•7•%1TÖ[û–×ÝV%• ̰æžFÒ'®àÒåŸÆ$µàKcß}è‘ýð…O†o´(Q‹\º0Ôáê k'kGÎ÷báÌ3\à¥6FM*réËÒໂØqáN›ÚDïñZHÕPBÐ4,À`vº™;ýãã§Óßß¼>òó6’‹,»&Ð%òxX=´UË{&m\Ö=òR‚É‹ïx+rçkõ} +. Ø#¦ç¹¬ø’­ƒDÍœ­‚Àwî¢\>ä€V‚毯¢wž\cEKÖ˲{=Â`¨-¡¦vø{.’ON¿Éz %®i'Ù‰„( CŸã¿¦!Ht¯0Uìðå¡!ô²n*ÖÓ5¿yÕÂ]Ç|'/k¹ß‚²{lEÒ÷Õýø¬4g d]:3²aü|=ìÎáñTŸ‘‡å:?ox+ÇDÉ!ÙOI™ØÎŠYäaWˆ­¬ÇÜàÌÅËK¹åpÉÛ_\¬[kú°l]hûÄš%·Ñ=Ž3»ÌÇÆf^ÝžlˆÖºž…˜ÀN1¢ ñ» Ïæüá‹ñèRÍ9ÂyÓBãµS>?淭ȯt¾›µ;°z3iÀü7 tªL?Î6Íbˆ®úëP«VT‘¤Y$ug*̾Τf¹”•ìuTÂ\jÅb»’¤ã±,|_’*EYìäŠÄ üæ ´£d¥( ð%¢^_€ gt}âÖÒ+gÁXÛKk9ýLÖP™D×ë*¨µš xu׉:06¥!Œl0à?²ƒr@ªíC£Ä•õz=lÈÚ.늄$ƒÎZ%µ&-G©› µâà‹æ§4÷@ f:/Ãþ¸e˜M,£9târ…ã·S²¯UD¨/sêÉÛVãøù„´lÏu½mÁ»Q„“Ñrç‰ÂBÂY âÓç&u ¾s`Óllà@úÔ…x:vq, uÆa0ÂYkå9*<ÔÞ&‘nèœ_¨E 1ºÓô„ŠV³e‰™õFÿ/ìyÝu+?Ôg¡:ÉŽ»< !BýªÒ«pTc®døv¦µ`3Û'¡þgmMq+ª]Ù(ÿTó¦ÖT‘k¬Ð·ã´jj­¾S {ÛêÒufze¥#â‹»3V_K¿srjp“Ciù¢ÿd; #µù ¶Ö|ªÆƒë»“3ÛFò–O @ûìV:¾ÇäZ©r¡rXù·­(f,À£¦ÌÊ9-o%dãOÚ“5`æ‰- Þ#‹T×=&è~­ç5o,ò½¼ásh]=†25!è´‚2ÅÍ )›š—G£¹f8©TÒÔnÐV?x\ßýä‘AˆÒ` $Ìýì^ƒI†”ë´bµ=ø¸ôS‡Š ¸BÝH‡ù˜ä´QÈ¥HÕèg‹³«[†¨—¹…éd½oê<½ñZÁ ÛªŒf0ßßï/ë&Q{®«üàaš~D&Ý›¡ný4^2> stream xÚ­XYä¶~Ÿ_ÑI¢¦¹$u¯ã›Äk ìÀk¯ƒp%ÎXŽŽ^©µžL€üöT±ŠÝb·æ`ôÅb±ªXÇÇb«„ŸÚ”r“ÇZèTmªîJ2õ_WŠ¿vÀ°[püîæêÕ[øTR”²T››Û¥ˆ›zó]ô{³ß~óÇ*„*ôF‹´(iå½Ô1- ­ôf·Xjs;lwqGÉëí.IÒèí¶H¢aìÌa˜p%‰júˆ£7ãǹù´ÕEä)µ!–¯¿þòOÛÊË"””¨íê‹›ãqR­Ÿ9/r\X/¬àdÅ&+¡â„ÌÿÕ6¦Qe:;šIÐìí0ö¶²}=ÐÜÐPÛÛ¦oÞËXnÝžÿºÁx¦ªéÌ5}3é«?ìîoÁ4³S5´?4^(L†ÊüÇ?÷ÇÓÉ-2ƒÙZHùô‰( µ)D^›Ñnn¯þòĉs |âíÕY6ì½Lå.¦oIƒòIÅBù4a—IØÆl½8íÍÉ=LÜÛþ`꦳ýÔ ½i…—©3Kå,•Þ[»ÉhëíPÍ}¾fÊhk§w)Cv óËÜ©G¥¿z›ƒ'c!Á•èÉFOît,â”D&")lÌtTmóèÛ4…,À<¢ýa±¡s‘ù¼û{Gé?|@ $T GJ–ã*¼ºÝé<²ÔGù§’­ŠÜÄÐõ4Ù»¹é±º–+o?û±±µ©­/8Kãܱü¥Æ×Ç€"Í ²ÕcÁRêc…cêã–-ä³€"Òn˜3Yp¢à<ÀÉD¢élœÍ«2ÊØëi1…Q³Í@8Œ¦Ÿ0–kšGå=ˆÂŒÿâEçõÔ{Ý<÷58vXª$7­ÁÓ$…r~N F¼.ž’qÈÉÃ2Ÿ¡¸iâÅ ½i¨WG}8múÝšýU;7ˆÖ±ÓšhL¶óò@€jI.éDÀêÔÓæ³¥¶0‰Ÿ³P¥t›$¹Žxï¡Ù7.Î\6‹£ÇäF¼E×¹¤_ž‡3tOgi^RâçØ®',3×8¬e1^ ê‹‹´e`‹™;Ã÷êÑ?׫yuî ¬/.UHSs›¾mïÁ@@þŽ‹lQÀ¿\¤Tä:õŽãvpçA¸]©êdìyW¥•"Îϱc¤i¦çr_5Œ6NSåÙú^CË,ôÁdI1uÑ ®[8¥ÌDkL§ùÎŽÍHç'·z®‰R˜&ùâî£Á2y )†í B½4ÒcòUb?Ãó—ÑŒ+]Hθè¾Îz¢Ç^ÿ,wý[-CéâÑnjﻎë‚Ëÿv˜Åÿ £Xû/㟫Õ"N¯›ÛáÓjµäî?Qfú5èQZ‡í²$È"tˆäœEØŽâˆîN #”x¢ÙÄ»|[x¼Á0æpƒ_;#è `»¼6@AÛôÖ…Ÿä¡C²b(ü0¾6§±³\Û{þͲ endstream endobj 655 0 obj << /Length 2007 /Filter /FlateDecode >> stream xÚ­XYoä6~÷¯hô“°8$u;ɳ“Y,&¬`13 ÐÛV¶%¶u8ÙÉñÛ·ŠEª¥¶œqÀb“ź뫢ņߨ|“E’ÉDlÊæ‚»Ýÿ^· œQüíúâÅ—°œ¼›ëýœÅuµy¼VÇÝûë¿oDÎD.7’%yA'︌èˆI!7áì¨ƃمQñÕ.Œã$ør—Çé5˜Oâ ¢E¼êîÇúa'óÀïTŠH¾ùæ«ìB‘y.PÚÅד9‰”±)>b°ä “›4™ˆbR_·÷£jQ¡¬ˆAñ£ê®¢`lÜ¢üÏ.á

³Û︈KwiÐ ZŽ÷úº9tZÇB°DÄDBZ5šTÒWö0KXæÎ]¨îÔaÿ?ä«ùñ3úüÛ;î~òLLFÅ&MrÆÓ}óö=ßTprYœm~´”Í&b2‹`uØüëâÛ5F ’¤À*cy‘.ꧺ_‘ša’$‰Ô,e)Dw!õP·ZuåÆÂ½ w‹r¨ÉPF y’.£_šÎÁœ¦TÙme,µ#žIyÕÝŽ¾òÕäL}˜Ð`&9ù±rkk7-«º/ÇÁx (˜<Á-ë…Yµ'?%‰\d^ä±3Ǯ֕òêT3 ë‘',N³¸Mh Hz ^Ie`c'm7€o©[»ÊÈÚ ý„ƒSÀºÚ Ò „Š(¸¶mÇF¦"÷ÕžiCŒg¦áO Ø…~EÖnËÜ ÕÁz°qP 0Š N ±ÆlÍ8®eæ) *M F14 ¬X†}J‰sQ2eEö»‚ –f“*­!c±“Z»…Í[ØQÞ mWnŸ$Û-Êhç=M{s_uoá6þöÒ<þxâ¹il”÷#„­>*o;€x,—¦ûÌÆkyJ‚í·×íA#Š"Є °¿”‡çZé =•iM•]96 fÈ™”Ëà“ܘ“*kõèe‰E@X ï^ÓVƒÓCÒÐoݧ¥-0Æ:ÆÞ+»z°–ÔÁ‘ÍÖÌgkžÐµ4¨]Õw{U:akS’Vî|ìÇEu¬ŒXO_}÷µk€L½nŽC§ÞÜt¨¢&H 7 AY4e=k³Q¹¹îxRƒ¦Ü$ÜÍáNõ3uhÔ¨[Ý<4‰üŸ„]È>‹9$TßÐZú@ l´?5ýÐA¸ŸÐuÙ›¾Úmútz¯;Û𸌳¢ÀŸ½ ×æÌ©È\§Ð…Íq‡mû¼)AJ Y¤Á+¤J'G$_ôJäP:;Ûß*å$4«(’!‹çÖì)ÀWWáçú¡.=xÉ\À» _úšŠ0®nÕ û5 hQ?_o>½ ½1;/æ1¿ä—¡°©¼Â°6¹§ÿ†n¨ÃA_ïÜXóˆÆœ/º’vºª!CzÓ‚£¡BcèˆÊ!K‹©[ðé½›D1`»ÈÒöŽÀ'É=da-%DðT¯=ؤǣÑVì4ªîiÏõ±h®%v?Ƀïwø$ùA?œ ¥Á,obP‹Ã+æað’=œ=ž£Y4@øpb—.¸D²¥ [úõ~æ…LlÑÕA= :xPÞ©MKs,k¨Ñƒ‡‡)‹Àyæ?Ÿø Äz4Ýèn=çJÏ$\Òú4Âi|pg†{Ä$SJtÅ¢ö½ÌJïáÉê[Ÿ¼ôJ¸2wÃöÓ9¥²ÿ61/Â'ñBÈ/äÏù3y{µù˜ƒX°ˆ!axöhd0#q¹‡A¦_n‡<\:ã<‡ïE\ôúv¬ÁYýåSñ°ýíW˜ÆØäU‹©åä!oØbö †^Å8?o¹³öçu±ýšcäB|TU÷›ÕW9e§î&ü‡€8¯t÷ÖBµÆÁ'‡v¡zEªã]]ng{n •á­Ñi³Eà‚iíkËÿ¬¶iÍÇ”üÑt‡j0P€>s€SÛ[.vj±eá{‰ Ð)ü€ýÇ^q€€½¬(Ï-|Ú5AŽ1Îl³TŒ5ãyX=¢ j"zìО"£ËÓ£i§HëLÔ˜ƒõ¾.ŸTÙÛ­šÓ?U '•[úœbñ‰¯)úN…§}‹ù?öë{ç endstream endobj 660 0 obj << /Length 1330 /Filter /FlateDecode >> stream xÚWmoÛ6þž_!ø“ D I½]€tX ÛŠ°¢éF¢f’èP’›¦è~ûŽ")˶¼ ¾ïî¹wÃñrì¥!E4&^QŸa{úϱ«‚ Å뛳‹7°$å8'ÞÍjÊâ¦ô>ù?³ÍòóÍ;dˆdÔ£(Îrss‹ih®%Ô &W¢ë+¹ Â0ô£ËeE±ÿf™E¾T5ëd«o"¿4‹Ð¿V½Ø.i滓’’÷ïßþº Hšg©O0ÕÒÎ~¹áÄ”¾€WS¦SÀ!NQš§^’Eˆ„‘ xÛ‰f-J@ÓØß0Å̪åÊ,ìh¶\µvSòe@cбßÝsK+u‹c┵Ëhˆh”€d‚ÒA„òL{ÄSÜ[}˜S™$J¨§( C£òâžU«¯+Á«raD¿ª¹AÁê *Ñp¦‚¯ƒ¾%+y ÿEÛý½ÔĬ)»2þ SÅ¡Æ(Õ¿æ‘=BA/,èŽ5fá jVkÅúÖÙ`æ†÷ï²c; +û[âká¤]Fx^ ÕcË*©f”œŠ´xœgóì ߊö^ŒWr«µG¯`4MPˆ-ËÐhÓ§©yò#¬Y³î+¦\l™ïb!µáE'¶|q>HÌS&.ùþÆïfÍkÙÅk!›N¶dJH4g«ßx9f‚còسê±wÉP ÅÝ5﫚7RÏ„AÉ'ņƒbÏæÌZ ìè_~¦™dYúÒ¾‹­ÑˆsÑ×–ì5¼bGðfä(Îú¶c‡\¬ÌØgŇ«-+%ó%pþß7Åjn¸”ŸÀ×ùma^AY"P•tTþuñq`;Föq:Exš«{Ru@-¬^-³ªãÁfWòIÔPZ‚ˆZŽ%bDŽäQ‡Òˆ‹!«N‹c+6XY#MNßĵ’Eß:; ‚KVó,?É<œáí0Ü­ ¥Éq/\•úãíkÍìzç—_HMËxUõDaÇ•©Ï”æC«æÎ ¼áÉÅ.¶F~*ƒ×ÖܪüÍjÎu@‰•(Ø©tw¥hx]_™Íw;C@ÃN÷²â oîÇl3œö¹¯zÈÊ Œ¡C¯óá;°þdSí»Åð¢ˆbWœ¥‚<+—,k™òâ2j4¼§[î„]¼I¡ƒ³¡ëf õEa:Ä(Áv~ˆPˆxœPÿH…âDü¡d ö'.]1R”¸ÑãÏZL0+Ýé÷þ×ÚèWtô4‡@Ï|ðÅ-&Qa;V³æ^žÃ.¥¾!‘­\¥‡0í*ÈAæ(¸™ÍdêAËmÍV4+=¨¾’ÜÞ+ æUÅ !ØAâÙ;f•mEÌÕÃŽk¯†q67Œs «5‡­¼SÜ,{C˜¸w2PÐ\C2g¼m›}Ñ‚A `µy. ´¡RI£ˆX¾sÔ¥œkV¢íÛÙéÕ4O\ NÍœS¯Í\Û Ã™=q;èÚo_›wpzl®/Fð81bpÛ¥£ý©0DYœX¹v(ldͧÍêòò§¹Úç2å XC~٥ˮETlë&à!ìØµÑÀª1 ô‹ö]î˜;æËî¸êzÅfÒíܶs®‡ áÚgc¿5R ÷N»}˜~ø3ß͘`ý‹e¨z0¹ÈÖ _ë^@)hÏÿoБªäõ¤îd¸ÉAålÅ3¤MÉ'[ÝþëÕLLiíì½C67¦¿"þÁ˜( endstream endobj 668 0 obj << /Length 1063 /Filter /FlateDecode >> stream xÚV[kä6~ϯ0yèÚ°V$YË¥ÚÒ](…ô!ô%›²Š­i”Ž-¯<Îe¡ýí=ºÍØ7)èX::ç;ß¹hH‚á$5Nª‚"Z’¤éÎpØýëŒ)…|¦ñãÕÙÅ F5®Irµ›¸j“ëô'1d7W¿$„#ÂiBQÉkò ÓÂ!Jh’ÏŽÔ~Úé,/Š"eßf9ceú!ã,Õ¦{=Ú–¶^(ÒÌ—I=d”§q§^åòòã¯YNªšW)ÁÎÛÙÏW‡pJJ߈×j¼ ˜Î&O6œ!R0ÿ|УÚ+ÝŸƒs\âô»§Nõßg`®´²xŠòólÿÙí[B€dR RFžJl ~Âάfó[„ö¿ñË^t¢¿Ó M¢‘¢F ÀzL½¾Õ¦•æ|á‚}ÈqÚªFxƒ£ôkø¼½ÜyЭtfJTÑjij/WÒ“_û%Ü© F,q€›Stƒ L"ê |Z\û•þS{¦(…<ð·c ‹_—`Ú£7´¤ØyéA“Ø©¯ *†Ëɉ¦.0c‡¸å8®p×ëHo¿W­^ËFHåÓEžßÇ«Pÿ».¯a´fà7a‚·;aÚGa‚þÉ‘ÁX¾L1ØF›½ˆg/˰Uã°Ïiö@îË Í’Š-´ªYÒL߯¡ýüy–g¯ˆQùîݬּÁ©o ©„Yù2 »èÕ +Ä¢ÕË$4±kÜÌqpÅJüƒÑ÷ò¿zðXÁæÞɘ 1ŽºQ¶’BE®ÄpZ1èØ¤rósÑ×^÷üïs/ÜĸK É4кoÚÊæNØŒ€†Ý=Î󜖨€IH6ˆ„ñvy ÷¢ô£¸®õ]Ô<Œ3öÓ‘Ôd<,(ãC[aoÝÛ×°0†XQFÅ6xø(u—Ñ šU>ú–λm4tQÁסzÛªnOzMÕçžmŠ+ÄðËÉ&\0Æ\¸0/ToŸ8ÜŠÆÚaÜzô‚õÅ* aò…fo¥ý¡ÍÓ*!eʪˆqN*,'«Œ”ˆ“*jº:ÓƒV’c£wwv&»}“‘TFÉV´rŒÊ­Ñ½›rãìz Ò_/a;í'c5æ‡l¹;ñµÔ¥cO­0þ$jtrì¢ 5âv@ìN F¤]k]zY>)˜i!«cá÷Œ©”÷âôñ·ïvYo’¢âhÃíã{îlöþG¥ü¨µò›çÄ”ó;Ê—¥’A÷â´BàmüÇõ£‚Ò´øo`ÊÓ Þ±TþT½ðzP§PNPÁÉ,€•0QéõNL¹0Lqàï>À€Éb½µÿLVÑÐÖshEÉÞ¯s•^‡vbêÿpËêÀmìœ7˜å/~B>ëêubƒÎëà—†­ÁÙ¿äçÞT endstream endobj 678 0 obj << /Length 2671 /Filter /FlateDecode >> stream xÚµ]oܸñ=¿Â@N xyâ—(Ý[¤Š>´¸´/I•µ´#wweK«4ÈÃýöÎpFÔj³> &9œç{(y“Ÿ¼)Ò§•PVÞT‡7)CÿóFòl ÛÆŸÞ¿ùñÏ0•©(ÒBÞ¼¿Ÿ“x¿»ù¼-Ÿ6ŸÞÿõFæBæêF ›´ó1Uš¶„’êf;ÛªOý¾ÙlµÖ‰ýi³5Æ&oûîÔêoåÇT§„T¿nlš&eÃeûÜ×_6*OšŽ~ûo$ ª9ƒÒB ÷ G‰ß¾Ôþ¿Œ]ÆJaPØleæ”JdjûÍ»÷£d¬RWD‡g²sÀšƒë[òËr#¤6t Ýlm¦WÇ;W—Àí­¥Û#ß^Kº½³Ãís3?Bi-ò4¿pû˜W§Šéö+Új©…Õ´—‹´`¾ÿÑ—Çê/Í“¿À¨“p`¥¤wãTâ £>Vu¹kn7H,ñûvpGå’Ïå¡$,†ú¯¾5$ýF&'ÞªšÃtž?ÐØó8³ ìÆck8w¿jQÁ,ÁÔárr0äBþÜù#Ò;!•¥ žŒcWw'ìâ¢a䶬êæXî ZáïðNô¹n¡J¡ÍË ÔŽ*à *MÞuóݾCé@zA áºÄÊq¸F—ìêÖŸF¤¦­I*€cEžÛX8«÷Ð"ÝlW‚¶V. Ng¦AA—8ž³@pT¡1°ßÚú®¯Yƒf¦ÁˆPl„ñ4T ©ÿMvy6ƒ]uLãíßhòT¶åøë©4}[¶,+ ]°lèN‹³µ!ö!<õÁ¶arß´45x&"ë…> 6N i…b›c\ßõ“&AB >6„ÆF)(ÐQ@8ƒ(&$»ê­pIçúº4à‚ Ž‹Æà€°ü `1cUÙW Șç—ñ‘<(! ø!U™X7±Ô°¼êOTMCB2K›FHIûŒ‚nq…­„`Å~áRI:æhéòâr´ ç,0Š–H™]wÐQöUÞäd ²-\äs$ôÂSršR´ÆYÕÖÄoJ‰ßÉIÀ·–ˆS%Õ1øƒ#¤7êë9.4«À­Ö™(TþÒ6 ÓGU.9Åx8öí‰Ö9ÙÈVBXƒäÑŸšóˆ¬ùŒQ­\Ñ®®´™©Õµ"ŒÔª0QD î­û ´–9€^ïÔXd©P}QBl›ýÀĉŽXÐ#+§š™g8±¯DL»¤e¨ªµŽ4'†`n¡Ì—±Pßí1^)W,Lþ@ÀAŒ¸~î˺ƒ°Á˯€ñYCƒœ)5ÝPÇâäËT7îëfU°õ š‡Á¢ ;:L­v_ô ¬OO5¶4VFÝRmF©'[Ñ—3É娂öõ–᱑•G¿_Ó$4ÒNŽJ§jÃÅDH(7pcÏ¡åRǸ'¤Ån3ôÒ`¨e}Œ{„šwB‹á– † Ç&Ç_Pµˆ¡¤GÓÿêO{>"òcÉ^Fwš‡ÄË¥¨uC7êHE™&~23u£¸X÷› Ò¦ye™DXŒAà¢AÐÁÚjl6¶V[ò|¾Ûü©Äh+R“؉ ê§ê[´9{.°¶3´•ç¦%±ó7'‚a¾ 5Ã<~s‚›9ºÐp•O·¬–1jaœ“=ÔG.|¥Ê—7–ä5 {uáhÀÚÎÐVn¼$FÚÈm.Š\:úÒå‘X×X `ã³Òƒƒ<œP: Z|o.ýé–JýX„›7.í™!VŠÜW¤8`]¹Ä’K‘*#L¢ÚFÅ?Ñ•¬M“; ˸‚Ê£Þ-¢cUÍoZ‚<â‹y*üñ<µ Ê0Nï¸zÆzšÇÞ,™.Î$& ‘Oçq„’вÿo…Q&pE>Êœ'ªùËÛZG–˱#ƒºãḚ´PS-Ž/)ᬆÎnî†jeªÿõ‚¸}_~ ¶2Ó/©WË÷£p£¯žÓ–,´ÈlG(¢1«Xɸޑ6qJï?0馒”¾¯Öκ9|õE63¿ƒåý¬š çäIÝ „âB!üÑuô–ã£Ô?íOïãn¡]{$ÀŒ"³Ùû,,:÷óÑQˆÒܵžÞ°&ñÔÖ_·ã’˜é«PÕÕ~˜ï˜L¨Â/&{Ø ˆN­ÛèJ¬ÓúB~ñ9b*Œ-’ «îðÚV€—ŠÐs®Bè3vìuöDU"sæÅßMêŠO v ã=×Þ—û Dæ=b†è¼ QýBØßžQ>È69 Àðç[Àoã׊Îï= X,š o¢g6|u¸”´Õ"i‡ #‘Ó¼¿Vèd|ëéóCSyd1à;ôP€Ã|ß?” ÔИ+|ªÃÈ‚ßdvüÃgþ‚sŽ·¤–eÍ_õÐ" ËŒCÓ‡7|Umÿ­¤iI›Äöη¨\™ ϯçM–ÍâF‚¢O ¥(„ðÑá-xúÂaéAÇÐÙ#JüYvÖs¾w˜×½ü´FdCg9w2ÔΘ ÆÆù  ì¨ÊÃö¾©zL«ïqº­>—LJð ±Ä„üšÓgÔ5N»SÏf>?RŽgÊÕïe€”‡dñ’Û±³—eªC,°´=µ´±ù’y&ôôý›Áµ¯2PMo&q£ØÐ‰øø£è÷ëYï;”…’ëUÕÄ-½÷€ÀÌZ™[¤7J9¨ÓÝ… ?_Ï0Ö?_¿ÿóuV„VÂ¥C+@ç]WºüT›ÊùVÊ]Fºr«©¡e°V]lTæDšÚ+°®¿ ö½–…†-CšÑâCpî <—¯¤‹íŲÉ#sÚ\‘Þ€u…ý%±—È2!å±ïÊoÀºÆÀ‚ØKägäйòóøôa ˆüe¢£†L_èimvfø‘zU‘]2OÆÚÎÐÖìcAlêÆðÈÿZ”{< endstream endobj 689 0 obj << /Length 3183 /Filter /FlateDecode >> stream xÚZY“ܶ~ׯطpª4 ðôcdÅ唕8e%/–]Á’Ø•!9âaoéÁ¿=}Ç g%¥öap4@£¯›«î"øSwEt—êDݕ͋HFÿûBIëÇÅ_Þ¾øó_¡©¢°ˆ u÷öaÍâmu÷sðÊž¿¼ýÛÊC•ë;&yÁ3ï"mx*ÔJßWSõ8ºÃѤߎqœoˆ<‰¢ «`ràÙ×O£ë[ìé8O¢@E ²|ñúí|æDëÏ\ )®n•é;•ÁÁ’Xn•æq¨LÌLÇ$ÕÁ›ÃQñ=’Ô,Ë’å`pšK uªH3¯5°D¥A³½!&c>p¿<çâLŽ''Yyî»ÇÞ6–G?Nއëö óÖÛG)»†i¾sÐÒYð[í~AÀ&þ¸xMm]ÚãàèÙàÊ„*á[0kxfk‰‹À޽¥Ípx¹ÃÀ³•“u¯~àéŸáÎY@7ŸiÊŽ¯Ôw'Û3õÇÉžàÆÒ³Ã™¸rìxIÕñÌêXøh¿ûÕŽ¿d³,(±ù+œÑÛ‹ŠFóÝ0XÖÁËC™XnœïÝT²ß'Ã÷y°¥“)ù†i~Û׳­Ä&Ö"Ù„â°ˆc8gf±œó5=ˆ øåê‘Tú¥|sò$Woƒ³êm¶ª‡+Șš+íÃUó ÔöT²•pcIC£nνkËLÙÓ‘®qœï±’÷#žRçHõØõDƒùhõÅΤé˜AcG·\ÕŽuI)ʾ¶<ä7íîÁÔ“àƒ…É£‘ÈØ #åEA#Š[¿‹T\ O{Y”«-y3r!šÏ$«QE]UƒAYH2qÂÓoLNDÿ,òIÀ—É'¿-Ÿ|-d@/YW¹rá æð{að/)mÊSÍq[Ëá÷ž½Àø‡euBMÿËVNÍ¡»ï¥ie‰€C+üÂfÈ8¢=WTtœl0ÉÊA²ŸЯ8 ¦|ޛĒ­õ<81Ó"YEá3ò>&NuûÞ2¹­ê²îZxü=`̾â‡1$–ìÀ‡,¨û†É¶Œž{­ÐíÝNËÃ0%' '+Ô±§FñÅ9c8¤D;k¸y¥4H×vÂÏL >3w˜ËŒÍpˆD† @nîvþ|­¡Ï“»]îgyÔgûWn—‡I±´Ù{A*Ü€" µ(ÿ(b¶P¹{mâ#”—¹OØÑ¢>Ú¬íAs©Gkþ`IÏÂh;qbàOãHmÅ·q6Æû‰^lÞyŠYà xÞø· ˆ6d+ƈx?ØË‚%dîT*5€tŽIÍ­j–žè¸Píc/XÑ}·§¨Tj 3nüüF„=Ä•|–w:A:Õµ¿¼ô¾„ðGv+Iéôª©PÇfu¥½2¬=¥ Vt%É(M‘†R¶výOq^h'[ç…#Ù­·(¶ÏtÏ>g$·Ot"•"?ãå¥è%þ¡ìZWŽìް¿Ôw¼a0h2fÙÍ:–ÙÖ±*¿Z\Áš+ ÏÂBgÛ$s‰¸:Î.|,Y!þ6ó³#ZÈrA õêr@5¬gRvÀ Ûœ$Ý–­ÜSI•lDâdüä„bØždDhtNÆó;Áw]ŽÞw»f…é¨ë«”$BÍž¡áöizÄD©*¡¶àd?¹Ö—]=ðJ¶p\ź‚yêPz”‘iîÎÙçªü¹wXw‰uº*bcvóx M))öW/Än({çQ= 4üK€,Aë0Îò/­™V²úBYètôÞš??ȈmgšH<7*øÝ«|fYð­å_DjÒ¤x†6¥tð“ã1bœí…É,[°vz*7Ô£0c9zÇâÌ@»Éwã´ÿ]?Ñ˽7º@9…ÚÊÙÑ’âX£Å°ÔqG² ‚3›"º@lD±AX…ßâ ø‚ÔR•Ì5AXê+3@;N~*É „ªÍŽqp¤„at‚€ñ©²e$q†Ð.ER±nö+ׯØSöµa²•¥†d}ý-)V²]N€5ì¤c,^  …4\dz†'$Rõ¥EïJ¸lÙ9ž@××±çã”׳pRÈX©œxOI>f…˜€d§þ¬ÉV.÷§- þÞ²Œ³K ª‡Aì+Ñ¡ÊÌö¥‡ú±?4•ùO€\’V{98 ¶+„î&b2*§=T3¥o[Šêø³ÕjuVˆd³Àû¡" uª¾Æís;S; ÈŽ¨PàðÌuà€T¢à_~õ Ë yDŽˆ¦þ½–°ÿ]‚£î™äÚ FöËY³ó]&éu™çåGϬàª6’=¸zºnÚ-ÀÞÎ4S5™ÿ©„‹zë¹Õ·LÇ3-{9¤_j6ݙώA&ùL"•¸Ø¡[ñoÓ_Þ?µ<ZQÁt®¾#¬í ‹÷*5®}È_mÖÕt”Ä:æ„éVúN_æü¹mï?òú+^ d5_©ÇúëÖ7÷>ìì¼Á%æ¡FU¦ºwáëÞëÞø?®9Ÿ¤ô­¾‘ÿLØ–À7pîüTÃ*7D"÷$ж¯ç/Òˆ"F»ŠrD걌_"àC´›Ì9Ѳ\I-“„;à2~îðÿl€ôÿ‘Л$8ŽD%> vO¢Ârïµ’ ”c.Þÿ‰·Âèµ” ©…ظM VhTƤ›°œ¤1Û±¯ïÙÓäy?óï;—™JÇ,Èýac p¤íX{‡é^¾”®eÝ®PT–‚ÅKµsWŠ3^/ ŽÕÈÓÉQ(#ÇiÇåµz¿¹›Ï~®O>˜z.ât«YûOFæÿ|7ñ3캹ï±5&Ôÿª­®` endstream endobj 576 0 obj << /Type /ObjStm /N 100 /First 887 /Length 1869 /Filter /FlateDecode >> stream xÚ½Zßo7~×_ÁÇëC)r8œ! @ÚÔ½ÉÁˆópmÕÞB­!Ëh¯}¿YÉ=E«XÒ®\ÀÀŽvIç÷7¤³ .Kq‘ÏêH¢Ë\*x¯Ùe²ßärV<‹<£S‡1E~««¡Nr!W+Æv1TL*ÙÅHD!F¨±¯R]L©º\ãT1†£-+ 2ˆŠé9aáš\”ŒYX=ªØ,l¹›…u gÇÙÞ{“ ŽBGGø":JQ@#ÆÊ’£,É “|¬N5Q] D„^Öa($™\[Y\¢`o²K ʨ.1“È 8€À:™ªè4 Ù§Bð‰’ƒŒÀtG+¨MëT5¢:"!qm‡ØC Ø1A‡’ ˆQ$EÙlß@`V6ŒYb"cO¬jÛsRŒÂB\ñ«3w0%0ìLR†#Ø~”`zF$”l0>EN“/&Ówÿ»kÜôåbÑ®&Ó«‡_VÝï×óÅo“é·íò¦Yº÷Á>L¦o›ë•{ŸH}±õ„=ôÁ•=™õ4û¬Ã^º/ÜôÊMhßµnúÊýëmó±Y6‹ëùìþ+÷Í7ü ã©zFÈ&É^«¹oõ 3%¯{Y¿™­–ó?›{wÓ¸Õr¶¸ÿØ.?Í®gí¸ˆ·ø!!_a&ÆFáK‘½;¹ºü÷÷o¿?ü5yŠˆÕR}–åØG¢Óàþój{3¯Üû 3÷ÖMÿûÓÏΉ‚[<ÜÞ~xsÑ.Vƒ ‹µõØ Ä±¦áðúÍ{ä­Ðј=½\¶×W DpÓËWnú®ùcå>|®‰ËÙ¯Ídú˜4‹Õ=â³Út“ý¾}X^7÷]Šï^½inæ³oÛ?Ö ²ü§Õ俜ÁÏVö´×)÷\­XØ^> W¾ÅkÎ>"ÇR ÞR‚¯µìUüß½îé·ŒÕ/¶ðøᯣÔ[RO½%ž¤Þ-Ñ =-Úž1¨ïÞ Öi*@êäqb—¾ØrœØ•zbëbŸ>†ù‚ÂuX5«ãK8TMUzjª|’𶂝¦±ÁG5zBæC¢gË·=DQŸJÞ~¯¼z·5¶ÄΘ‚7|xh\Êês”ƒã¨OÀIçÈ«ãƒAB/,"‡YÙð­íÅàíúI›çÚú†m׿yóÌc½"%¸4 lç#cŽÅò—äCÞŸ–/¬ü­Z÷Ë|1[ÎG€”Qï ô«çTÙ³ŸXŸ % ¸$0@ £—â Ÿ™w-žQ€Ð=øš[—茽—ñË»ÙYøvqPÑ¢%ñÉSüB>#[ʈ¼DyØó×]3û„i sY>,g#qKQ¸¨D¬3Tí¤·¬XcÚ»kìás¾HGÖŒJ»cÐyëQŽ£è3ÇCãÐÝt vx Ü.zhÉk•c¯ÒY¯< Xß=âýסŠËºR|.[,[=g{0ÞpÄ=ሆ Gc{Ÿíº|áú•™Ž«Ì’BO8+ÜxR¯Ý°Ó¡¥ÃíÆîIV¤ó?ÜnHª}±õ$±·VZwvv69±"Y«÷±O¡®K8à4…xL7;¬vKD-.¢z¡”*¡†é‘½³ ¶x餒7˜g8ÂÎ=ësêôÌÏ“Ï"hßÍY z„­wÆd`îPë[=O‘Ü·uNC#=oz§¬£{¤,ž²¿£“µ{ D:gtÓûÏ çŸ ÖèPgRP#Ò‹ÝÍ ;òAchÖÍ|®“²¡Ö”>rÊÇ!'»ÔØqè\;ôÎ*Ü?]­¤:DN’zˇeÓçËè>ßú;‘²n·"¨¬JÝ__d¿#ÿ>_Ü´¿íïÙÛÝÉ#ßMƒÿÛ‡ù×w³Es»ëÑ2‚ 5¨ö ªƒ º9C—ÍA®]c­Ÿ›Ý\ófÜèc?6ê9%_S^'/†öIŸ ¦04ÛÙn}ŽÝM¦—ÊÏÃ/ª VÿfšÀ´h}’é>vªa·Vp1(·»’V/x9IÔ»Ê^³dÊ^?ÉónÙþºÇ•ítˆê#Wóž§8B±×³O_l¯Îpdá>ö¯ Ñ6r‘g-'1¶Ä¡GœØèØþn »W—tJ štÖ—3ãîF³,`WW9ý†'ø=!¿ion÷ãâ~5»½­æíb×0å”:`L€J"ÇE`8;b?íŽhëtéØâòi’ endstream endobj 696 0 obj << /Length 1580 /Filter /FlateDecode >> stream xÚXKsÛ6¾ûWhÜC)Å¢ ɤíLÛq2íŒOuÛCS˜„$´|($˜X“Éï P$ 9iÇ,‹}|ûd²à,²`‘„Ô§1YäÕE`¸ÿ\C­A`=’øéîâú%$ð³ #‹»íXÅ]±xíýÌË·w¿.Hê“”.¨§î¼ hˆ[>%t±m Ù—Ír†¡·y¾\GQìÝjñ8¼¦€Íwo$okõE£4<l”Ê‹›»Áç˜Ò/¥$GEÇQp?]lÒÈ'a„>æùNÆÞºÁ•?°êPr2ýò­TY)Çæh­Iè§ñÖ…)jþcëø®­¢#/o4ñÞ÷9 …JQï™Ñ<õØ¡øM¼RøñuÁ·¢æèÜå z‹_äÒpýkÅ%œ$Nÿ©Â˜ÜñJy–z½YYû¾–4õdäŠÞ³Š†ñ—ÓùQ¢r¤µú;ÞTÿèò"&~ÅVô[ÔZíï‘(LâAÄ“§bR†Y8+÷58žÆªÞ“8Á½P•†ž¨:ÉM+Y­tJŽ˜u ,ŽÔxón%ÔÓ›Ф:ˆÒH6¸T|Í®¸‘Á8¤´¹‚¯,öòVŒåé,[Àw& Ч4ûŸÉQ^D50aûIé® v€€É&0#‡ár`­TRt¡…S¯â]¥òl>!ó|œrÑ@’“€x,1òGpjŘ ½[žF†·.L( ‡˜ {éÄÂOhj%†¦SЉK%@·ÉžT$Í6V¤6XÕL#¥}ÝA›Yt,Ì1Œ:Oa®ÏW˜§jb»ÑØn”@¬ƒÝÛfO•Îåd˜AP+¬G‰V®ûÖƒITºu.¬|Ú> b3`} \†)%áyÃÓÖVæå¥Àfƒí®¹o É»Ž ³e…aèUªn¸ŒTMB'nÍaQ‹\0ÃV^E™§+w” h`HˆKYäý^™“]ЕÉÛ­¶OI¢ÇŠºEÓó¬Ù«&²‚£{øÅÀ5žsãP=ØbèÚß ÅìA\ówÚOhb·€dH2-³‘9ºX¥^õY—‹’Õ…4¢ª5#÷¤ƒsú©55@m‘lp™•42!Á¹2ƒ_6ÅàCÎÙ 5„2NèÛ;±¯É[Ô8ô¹úpöùÆá“ª3Ÿ¦ñ¨Ï5 ü(5²«æà½ a‚Cå|Gí3Ð<Šék}Òo¾+ܵºÛC:}›\¯tLá$ ÕüEõºbJ&E½CLý½VLšp5áM•ÞíE7Qo4é7ÒV lÅ}/yŒBî‘’{#ûÊÞƒ¨…Õú=qÞü/[\Mk¦º‘H´œC„rpÞÔ4»ÂŽóÙö%¾”a®ºÒ"·:èμþò=;H54Ô[§5¤·MkQ³Þ\2QvgBÿštŒ3’› V?‘}·ÁkìSZtã‡Ùú.›²/Œï*&÷þþ—’™d' xDœDÇJ¯M0/§õ3`·íë\ŠfH 3™þhöáu&ÏöÂ4–Q·ec½TÝüpu¼’öÙn¦ºF'´°y¼ºD?á5Bü(ŽÎY5Eð½©À÷­Ôn¬žWGåÈ ®ð0ëÛZIvB/FÍ3ƒŽ:¸²ÊZõuRµž8d~v¥¤b¨œµ»üÊvÚîÓð@_V+%ì‚ç,:F‡¨-À…¨Œá#N(Æù¨D}eIö`Ož¸Ç·ˆ£!¤eÈ.0”òI®ŽsÆ:†×Ð&ÊÖòoÜzf»Ð Á#†p™˜Âœ…¤œŸ™š1”¥D=”%J@“.¬(VïTÛÃÅŸ3`N Ì4ú/±àÄíš²?uè̲yÇȉ•À‡š„z FvîDe¯FXÅm1؉‡à ”åÈ„N’é­ÒAÇ|sðOcážïlïV®_v–6U¥žÏ—a ëlª^Q¿é¸lŽëñ.Ïíüo>äžë²™FbÝ?Í{É˲s…kâ%`2†‹òÐl²²ä…ýÏÏ¿26¯ endstream endobj 701 0 obj << /Length 831 /Filter /FlateDecode >> stream xÚµV[oÚ0~﯈&Á &v—¶¼lj7MëÓØÓº›aš "¦M4õ¿ÏŽOHe>ö9>ß¹;ØñÔ;3Ï™ø‘;Ëèʃӧ+ ”«ܚćÅÕð^‘ØC3o†Åª®bÁœÝtÛû¹øâà)ÂSâLg†óèß°ÁÄqk,!÷aÒs}ß{îht ñÀóº SÌÔpï2Éw±Þ‘Ñ4ðºØ›h•Ww‹ƒÍ!o8¥%N½"u¯° Ù;ãéad¬|ßSWƒn‡g4Ú†¼c¶/k±\R¤f¥1ìãTÒxÉÍ.Y™U®á`McÝY%IáQ!Ç>€‹C7@2„z»±\=z×Ñ¿yq¹ËB0Òlþ˜åÚ, ʯê~TþÅZ¾iÀÈjîÓµÖŸJ–ìeCŒ‘ïàÂó5I¶†ÚÇR„†|aÈ™ñÏâ‰ÍI€OvFƒ¶@ν³ƒEö笰¨t³(/ŒFÁ¨ ð}˨äÜx’E"˜+YD3 óê4¯N3&¢ò´"kapmx¯VSÆŽ4cW™iö)ÔTC.£W¨^ R$Pm²úIÕÁ³à/¨çbålw±.ër™Ä©Hez¨Çãt4꜖—¢HjK «üD¶²Q:Vͫýã®7Kª’ñ•ˆyUšvmþx¢†Âݷ϶6Bèœ-E¹·˜Næ;°Ckj´ôÁaº”{ U­’E[⢳dK@-–’‡azÆœ2ÍìFô‰a=ÓpñŒ1ä¯cé–/ÅJpfoå’ÍÞöõ_ú®@#S4öÇÍY&T–ê/G’Ö¹§F«Õhú<\±ŒŸ#]b°±ÙšåƒÐX6`¹uÔ²ÌH̫Ѩ½tµ×:@ÃâDëâÖ¹Îò:&n^בŸê¨ÛqôýcŸÜó¯O A÷þåÒï0˜¢sË^W§º,ïÎfî•WAÓ±‚—hskŠ£Øôû›¦|.°ü’Ǫ-ØÍ¤g¶¸ÍêØ¢)ÀάØA{a–T«¤<²tÖû¢èTõ=zü>öG°ísæ(ÏgÞØv%g¿nÞú¸iGÔßš-ŠÎÓ endstream endobj 711 0 obj << /Length 2816 /Filter /FlateDecode >> stream xÚ¥َܸñÝ_Ñð“˜fDŠÔ±ûä,Æ›ñ:@&Oö.@·83rZR¯¤vÆ^$ßž*VQG·æØL“Åb±X¬[rßÜñ&K”PFnöõ«˜¡ÿ|%y´„Ý ã7¯þð†2E\ÈÍÍíœÄM¹ùý`ÛŸoþ²‘¹¹Ú(aò‚V>Æ*¡%¡¤ÚìfKÕp:´Û]’$QúÝv§µ‰ÞytÇQ[ÂbO«×ƒëœ)›8’qŽ$_]ߌ<¥ž¹b)ÓD§ ÓIwªºe(éDi'qòJéèw?S¹êŽ›°}|(š¯„S× „¿T¼Ê?½»;U~eàUs(ÐgØÖßKÇ ’EþRe-iXG&´9Óã-»']R.ò¥Ñ)ݹßúë<­‰Üƒ­G“ßèç;ú¹m[üû1†Üä&]žñç¾÷æ ‚¯¾á óZ€€áh’¤û­˜pmþ¦£á©¦Eä”q×=U¡éª@'Ø¡6#Ì{ݶ]mF,yÑv¿ž0”‚ïÉ"F|ÿþÇ¿Ò*ù $Çžº®Ǿ%•˜3¡áṚˆeøâYôKx•'`©µC ADb7'úàá&·Ãð’"ÛO Å&úìܱN>ièª}K”÷§ÏŒ~Œ÷Ðò‘ìñý/€yß…¸A»dr®&„Þp8ÝY¯ðóh‹–ée–E „:îmßÒÈ'{¨¾a˜ûœªÁG˜S ø†®Þõh¯ß£ã-ØÀü[µcôªWÕ¸aæ2I+Ú€Ö·Ÿ:¶:æú+$®é½Üg{žäAÖi¤àæ %ôà³¼uBXO[yýÿÏZÓ,Òôóáí6×isO 2 Þ >{!ŽK–~Q«¾¢ñq ºwUÃiz~ÿ$MEž§3!¬ä¹éiIœ‘b‡°3ðX?‘ž ¨'W«î&©‘/qŒ‰ÈŠq®So“ø3xQ+)Rýû^cXìŸoiùó}HXZ¤O, ï‚ðrpêOÓStC«)3°!³è{½CHÙ!   ¿'îÎ;SbÂ=²/p7k¨(®»µÇðY¶ÌŸqþ*&ËV_ÂßaÌÒÂ,\:HJ¥0+ׂZŒÜ f\%WpóøäS*ÖŽ‰ÝaHÎ/ù;CJ~žÈØ~ZTIj8•fÙaª£[ûÍÕm¿&³B‰"õòööpêïÑWöCÙž­­°.4£ ù†pø^K²©:‚P Œ-s„ ¤ÜÙ}âýÁâ0¹¬}yD1 ¸ŒÓd©ÙUíÊÊXsŽf«•Œ®1$¤ÂPgW¿RŽg©šÜ8N(ЦT7Taú á<•2iˆG)–ŠT‰z:/ gÍ ÈYÂ)ùÀÚÍê3HÌë¢ êæ¦ˆ’Š32š8H ÛŒRhÑ@¤ò9®_Ô¸ÙQ0JGB¡%T•Ž*Ÿh"°V:>‰Ð[­œ±r™éD£áf”Æ›„©™QsrÖœùÒ™æ, ø¸í/ŸQ™°ÎFUe8íD£ÅÙþ¾*Û•t‹%¶G‰Àr¹ÆÈÀA§ÙKt¨¸v&Eb–üƒ?;fƒÇa¨¨šAɪÞRÙ´š—»ñ¼ŠRZ-\.Ÿj¦Sí\èV¯|Q݇vQÎ"Z·¿E“Çîz5†½SÙ`Ÿ¨lÉ džRO°Ûðb«åF›“ÑCÿãXÚÁ½sýýš'‚lWé"àR g`:7ÚÁ|ÎÊn’ŠüC;ú žP¹X¤q6ú»aµÝ$2•—ËkÁHý/·š—ÇÀ{ðê?ºÐ]Êý,ð/l&Ñä’dt¬~R²bϓ՗WºàÖJª`—5/—¹¥»­7Õº+náÝõßÿ´b}JÓ.ø]Ù$„X?^E_rß6ë­ ‹§Wb5ŒÖS9¨D¼ûO >´Í%Ø¡êz¿ «wí“Ý×®k{L< ]o½>R7Mo†°êG–ä³ðÖ N<çnR®§j˱¥jHpÒ|)Â’Û¹ÏÔØ¹23Ï¥YO£(}äDÒÜc¬íáž;¯—µÅ¦gZD7SƒˆP*…H…SH£‚ñó³æâãÀxJ änœ©…±€¯yµG¨‡6ZÌ<0h®K{žéuØa4Žbà…8ÒŽ>• ,ŠçñÐËây%ÌÇ¢“thœ/4—À¸.r©“ÌÇSÛ'%ãRcÔkÀÚ¨ áµùHd±yÖd¥i`W"CÈd| å1ÅR¶žåCÉe `‹—äBý'ìûßoèßXìh<øÄØ˶âQããgÆÆIK.µa— ‚õ-š€6Â[ûÀÒcž—þ€ò€?:bj_y ¿æ÷$¸¼º8ëL†vÙ­§ÞÒ̈…dÑ€ÂV¿wŸÂªÒ^$ŸÔ'Ü\UrÙMö´P`Ä[h9ù¶'4Û} Lsцi9õŸ8I£¶û¸7‰@ù3~æÒK®·s–¨o?Ø`~á´>ÅôÞqN`Ó„T¶çÌ`±s¼Ú”5 íS‹Æ/>Œ@Ð/Ôïø4Ä<__iÀvÈÌ0%Å¡Î7…x•‰8^š{€°âHâ\tÈQàø `kÉL¬æñëµ›¯Wm®7}q :”§ŽeH ؆l¸øYMìdbDœLGÿöú‘=N-d¤^5 ÀöD“±œÚÀç¾ì¢”ME+g'kùöRH– Ö ñ#÷ÂÌ~t6¯17Z¿™\vÆÞx-"î8¡²:úêEX«é£‘“š^iîÃQai gL¿´†GÃyÉÇ—T¿â=é C˜•Ñç-g„gíG™¡žj?NëíG^çä`õ³XœJ(~@þ|Ÿ?oÍ?‚†V!À³‹ïá U´}âg¥UžæúŒÔ”裢ÄBÊl™d^³½¨Ë"•÷¢á=5ü'lŒtU°²>´Zî2ô<`5ðÇÌ[Èrý>dMäv}ó«c”vfÓëF{ù êÙï\/Éõå“ÉþËr}|êÿA=v" endstream endobj 716 0 obj << /Length 3354 /Filter /FlateDecode >> stream xÚ¥ْܶñ]_±•sª<\ ÒyRT’£”e;–œÙN°ìˆ6[QŽoO7ºÁ!9\ͦ\[µ`}qÁŸ¸É£­d(qSÔO"†þòDðhö³zóäö EæQ.nÞÜÏQ¼9ܼ ž™ÓîÇ7¹Y(2y#Ã$Ëiå‡H*Z ¥7ûÙR9ŒU»Û+¥‚ô‹Ý>Ž“à•ÛžDQÐ`±§ÕçÛ58“q–DˆrDùäù›éΉ”WˆÂשJ³8*¦ ~mûÞîö©Œ‚SWÖ¶ìZœ‰`°õ .£žiÛz'³à×ÒþFû;[Ø;Ø’Œ`¬ikÑÖ¦9´äµœchù~'‚¶«y6x–t%ì1Í-2&T(º÷¯³s±ƒ÷ß™ÚÀ‰°–s‚uŠXÂÛî5ûÁÔ§ÊòÆgâ8Luê7=Š$†[O û¶klQ¦%¼ìÖÙBea’O8_=ýç­“¥Ä¡ßîö:Jƒ×€t¼CÙˆà=Žmƒ„‚XpÁ€É'f÷[çOe¨¤bÎ ¯®I„ì³C÷OR>ϘÄA†°Cl]TÈèÑþ¦''4/:à—ŠÓàÞ|´5ñaïGK¥!¤°C; Aùz%CQ—ð^~Œý8¯ Pú¸€Ê(b˜}ôu„Ãß÷üZQAz:áâ<Ä G>¹*›wf#3s: ]ÙôÃOt,†#&ËØ`±9…=RÒéŠ@~·¾ìŸÀËXk°¦Ç ËΣPÍʲv—@æ?V¶ß² ˆø*Ÿ×/Â9úô‹ŽñUnaz¾­—l·¬°¸îe6Á›Túj*}©Ü_Ä«¢õÞ‘‹¥RSØ®òÉ ‰8Ìãxé…žVDZ&§ ˜_-O§£ý•š XäshÂ/\êgR‡™—:GãQ±Ë;0àÀ;Öâ¦òÓS4/¶{oª@Ê.1M–÷=%-H?¡* ¥ü]J[u/àB+›Kcf纯Z¿°p:i"†à¶ÖÈ_¹§y˜¢š™VmÖ æ<×ê\¼#ÐðsN‹Ëi³5yâ‚<1Eµ™‹à¬ØÑ‘\Vi*«zpF@žv–+Ú0»ôFUt&<¬¥Çêr©Û”¯£ ƒ¢cR¡z|ì¨G¬ÎÂðÀ¦½·Mþ>I§#`ŽÎ+Hæ<Þ°ëø®ÞLðuðŸÈéXh›ìlåD2v¥òU=xaЏÊ1IÕT#ødÊÆV4vWgɤ»7.ªëŒÛr𢀾ˆíÕÅì¢E;ëqTÓ®;ÚuÖ–´EåY¨åÔŠûÖAB4†œŒwüu,‡ÍüG„™È>‰Çå·R«e¾iœóOm]ÇÔ$bý!°&‘oŸÐVà—Î3ž–\r_$wˇ0p%dÔȦ\~ŽÕ~°õiÕõ>?Ž^Ü ‡µu’q™%…6…-±u·IÆËWéSÂ.´Ò-×üBÍ ¶ŸMãz)<ð ý;[UêéAMÆh!„xŠ[&}G0}%9w% '.±•:&zÕÆµµ÷4枢ž^ìàÇ"}|Æ‹²›ž¸¼¹ˆ{é¹ðb®«„KÓ7ã_‘t;Õ‹§E¨Ósstèªý³Íè¦CP§©…o<é|²BÕ&¬‘ݾÐu RéìHÅ`´*ÃŽ)Ï_’ÒPí pÄOY¤¢à’@~@é¿zÁhòc‰ÿèE“×%6Éоàìï{ö÷°ÀowJäáû2 ÓC`rŸe—°ó¤d°*‚Š!/vJß|÷êõ¦[˜PåPA±(¿nW{&„ž˜×Œ—5®ûª—Ïû÷Ù‰ühªêµ‹!yué¿ëWã^NÊ#ÏyW3/ ×>,+¾Nã‘šç æ=ؽ›a/…jÞâ©CFµ¾ÈVß´žš¡¨k ¥ÜîYËÁlöÜ®~ÀÓqìÿ~ùöœqÉúeÒ¶D Äù’¦V-ÖncïŠ7!…þ3 Î9¥/îÛ;„•sôÍ÷a–ƒA– 1Ý¿n®ºÎçô9FdçfÇ‚\¹÷õ3Nœ'„êwú ”$c`‡ÖÏßÖî“®^8*rAŒûþ½ÂOÍÞ56gÒ¸¯lŠjœÝéÒaúÒs™,Î#Äf ´zBŸË ¶rÁ @¼Âå1;Cp‘%}6uö/@Á/Ìe¦9zƒÚ¥øg¬wå]U¶ƒ-xþOñ~‘>v%Õ$`^höÊt¿Ðè–Hm:<)Á`(¢/>üN)VB! Ÿ3Ò­ Ý ~{•Å%aþÅä. ‰Ÿ\~KšR‡±Úê¦mPFÎI÷˜TøœÛðo X:NÍ—‚Uñôæ†`§ã¸‹¢Í Öªù£“çÆ£!fŸ¿‘;Švy¹8xùÝË×¶çn›ƒ“Zæ†7}0g޽ɖÞ_Qæ©0Cq- ¿Ñyb¬Þ ßÏ>¥Š2Xn¹c.Îfw*FQHÁñàe}%€lf¡yf*^ýÜ@†Åf^«]6Ê{?#´XÂJHIʻѱ$Ö¡€ý±^­2vÞsKæM‰?ð~™i!¤a©ô#r‡²³çò³ôb“h‘$aOíÄC»I-\HdS‚ò™ûÊ;;R.;²ò=p8ë$…C»gèDU;-û¬ðòwPÆR/µ«( E‘I°y;Þ‹ãmsìÌéÖ9M´·ÖÒÓ t9 ÃBÅ$qÙðܵ@_•w·ý±dôVý4©ÿ>Õy\o§/I¨Ä#“ü8Š.‹·<Ÿ~†á>aÂÜ0ؾgé+÷ê`Á¿W€UàW¨í”?`JQLú1gÃfszQ~ÆòÝàœžSIÒ¾+?„0‰VµÂÔM´dùÿÜR5ÍÞÑ­“%–[ñ~ŽhÕ<ÑÜñ‡Ü“ÔK ÀeÝÏ’4uvþ”aæ¬ ØAœ…ˆnêÜM¨$Ì ¯G_=졳skÞ}ÀâŸèˆ‹_æ…‡ &X¤Ö©µý¶7˜Œ|ÿrûw¡Ðg¹…‡1Õòû¯®cñêá~ òÑ2QNHD%&ÐÜJôƒ"²ÙèßúŸƒ`w^¯´¨2ýôó¨í$ñ¢Cæ|ç?ô©¼æ©QŽŸ¶þRç4} endstream endobj 723 0 obj << /Length 1305 /Filter /FlateDecode >> stream xÚ­WQs›F~÷¯Ð¨EN8s·}HÆÎ$SO¦š—¦uOp²h€Sà°­vÚßÞ½Û „”#,¤“¤8óìé§3j% Ü=‹—˳‹k©GÞ‚N–ë}Ëtò«óŠog¿-ßNhLhÌ&Œ„ñ5=棊0Ê&îž*SM.g®ïûÎüÅÌ ‚й1æ¡ç92eÚ«G%ªRß± =‡RO»<»Zv˜Cƾ”¶8ÌŠígE~<™Ç¡~ÐÂ=Qh0ÂMÅ:+Å <…Îôê‘ÛÜÞ±©=%ÏÙž¤å°t.ÓA\º ›cQè<™Ó˜/¯>7ÙýŒÅŽDE¢å /xjëõ‡õ܇ÏÂXé¯äNÈâ>c(BJ lM¿Å0¥õžf3êTB=‘QeV%ú€ž¾†HúÄD3-ÐBÔ…M"͆.‰i —F!‰"`‡ú„†¶¡òìsÞ0­åª2"u8žˆrÆ"Gi”<壵  ç]‚ÓÑ]µ:>µ6æJ,N:Ñ[t1u5µ³’k°†Nq VxœÚ”Šƒ–×ZÝw6DÐ áS{ê9 ©£»³ä/ˆ¿`­±éHã}Ë+ŽÑ»Î²¨$Râ‡>ñ¢¹¥Äù)™¹Q;¿ztcg Ó k&q}Âa\r”SàJ ˜Hd¯’¹è)©-RÕÅá¨ç€W$¢²?Ìb_O8I´§ßgAä·Þ†4ÿS{¦Û%vÔ¿èSîÁˆ “¼Žc’÷úY#¦=&YÊSÛôÐxp Y'YÎ?z¾7Ó+,y £µhƒÀóM+J3+º(ÛA±—ÂWûN ”¨óì/Žud¬;·ÊŹI»|¶ÎqYµ›Š$/ðÀ$’s••wxûAé!SVº~÷óÍ{¡‚ºzx³åšë‘úš‡–›¬î±q;E¹5H³ZUÙªQ"BRkûº]xè…— ÏI/|/ú›5^w²AWÖQ) •àiWÕ¡ÍÊAdŒõoj!ê)¾Áx~¢7&éÚ¾I’ ßÂ#–˜õh8”×ÒZñ²-å6ç%Ð(KòeBŽð±OAUP¢îG9Ñ,¼´mxûÐÑÞ9^l(›7·|äBÕÒ RåݰàõV´}rP¼¹,‡ÄOà Lõ )Þ.M;ilN|¡ê›¬Lò&µ‘¿+¸ÚÍcQ–µJáý80·ÜÕ*+„6vÃ( õà÷;&§Ilµé}Û;+ØkvZlÞ)üSðXÔd=ùðvhà<[U¼Ú:·)_ÿx«°&ïšêÜ_Ž,ß½|{õjim?î$S»÷†“Ë‘"­sÙöLª.ÇRkÁ_÷÷L×&ë¦Lžz䩬~›Ã’8²`û ±ŸÉ®kýŽ|¾{®ÚOE½ÄçþüèÆ“q{¦hù7~gÃg |3óa™úÞvÆçJçÏvç; d”ørkªR[Ö™¹X7Ïluôƒç­³Jß=¹r{ˆÐß?§y/TKðnpíüó<_ñä“e¥’‰H›J\®0¬÷6ùÉ—ãÃF w|S·! y/NAZñj|óï‹{™¥Ùëb[_®þ´¯™\¶«æ¹k¡AÈ‘ž@Eªz°ÎoÅ,nÁa#tôþ 㔎‘Jû¤þÔdê›S­³ï½•ùôÑ«XþÏôÒ¯ç71?>¾&iŠþZ]ð endstream endobj 727 0 obj << /Length 1102 /Filter /FlateDecode >> stream xÚ­Vmoâ8þÞ_ú ¤±“ðrè>´{íÞ®hÙ£ÙÓI·§È$|Mb”8-ÜjÿûcE']«¦c{<ϼQˆ_ÔÛ­¡ƒ-ì¡V˜\Ùz÷å iª ý Çuó$²­±=F-YáG­?ÛȦó—ÿ¹…Fá¶¼ÑX|³±£Ž,Œp«_9b¢ˆy§ï8N{ðS§ïº^û±d÷l»Í#8ÌÕéýVÐ,•+ìŽ<»’"¯îý½ÎÆŒ’§VáªU»–‡‡­Áȵã*-»7¥ú}ÏÂQ9òÔÉ+gQäzíß &¾Ùžý0 fwŸï?øj»Ë÷ót¥¨Wki(¦äi/~WŽB–ë¹õºU¶¼:Q ÕøÛ#,ÇÆj󦫀ÌAƒ%Ï’`Vdð_Š,•©0äj!ÖT³ùã³"7$¥±";}‡Ä13¦}V¤áZ‘|Yjtê;­Ó&ã!ŠÌ ²ô;B:Ú@C†–Âmb3å2’®ä ÂÊØß4ùR†³p¼ÝÿbJ Ks‚qí“fä¨îxÛ‚Z€:°+@>h?.3šPx3.á’ÙŒjµArþä'o5¨ãbc<Ä.ÏY(`ºÊx‘Fõ2®Çîiü^gQ†ˆÏå…úêËM¢¢Ê`”/ÿ‘YOa endstream endobj 731 0 obj << /Length 1148 /Filter /FlateDecode >> stream xÚµWíOã6ÿÎ_Q!í”$ÄNÒ¦wðaCímŒé(û°1U&qÁĽÄå’mìoŸíÇI“6ånš&$üØÏÛïyñ \ù‡w0ö°ƒ4ˆÒל> CÙRÀnI|7?8™I¹ÎÄ Á|Ù61¿Yçd5ü}þã… ñ;A8έ‹=`9áÝb1±NøÐö<ϽھX—Zì8ñ&Ž/ÃÐ^NÞ‚ÈÊÓgF?ÃNÂ_¯-8c<6ÀLéÞžhŽÝÃZå,KW¹tï¥U*ò ¬Ò6¦?ayË’s ^Ò[™Êìpob–ɺxPæ óu7xäxîVlœ¯€Zg‚%@>±$¡ñnŒ_ QÖ,(âÌ};³ˆ£3(i¥nd$îo™‰SR<ÔÙÆ Ñ;=5ya ͸‰•e:9ñ¿öª}º§b+F­Ñ—È‚&4R`Ý®ü2]ô@šÝO7»äÁRº]…N É"z Ñ“nä¢öÑ+z³Š‰ —ª[¦,3NÊ””†¬6§Õæ´ŒY}3ª Ùewjî^z8¨Íªû uûi³¾-Y\É3ÓÞiÃerÁxf0ñ­ ÷ï/Ùÿ’&í ‡ÎÈm×QÛÿzW¢¯ãäpèbjÔç~ÿ jŒ±ãÇþº~\Õó¶<Ž«Þi—;—Qi« U‚Nô‰kï½PqµcBeÄ®Ú&ª]m[4§$kÝYjÆgL—¬n¹f†¾>>[.§×ßïÞèß ƒD ÕßUû'A{r>ž¹µN'i*Wf–>žBoèÍÑÑcWþÈ(ÄÕ«ã¶Ç5k\wK^n\³Ó²íšuå×e¯ë` —&ƒÍª)šDÖÖyÝr²wEwŒÛ}n^^¯õv_{{ðÿ§¯ó~ÛoE%£îŸ’ï½1²Î[ï=vÏáe,bÄ.¨ÚbK~íñØ¢ -Ë"‰éo­DŒFLa%Éý:+ Z³ç!-^€f-‘;i2´ä;Îs‡êÙ m¥ü0DÙŒF¤(t$gÜØ]‘œÅM"|gâw”j¿4SÿÕ'ÂGʇ’öBg<úÚ÷q”°Hkû…Å8—”YîØ]¸ha?Ê\]}¼¼v`K´“geðµR)c%“ça¨Ø7y€ÀXüû„ß‘z£±éŒÈ'édŒ»­‘ðFåÕÅÁÈZ§j›êÊï©ü/(Ë9°!PE™.k&—G*ÌÁL™S‘Â66Ç‚­tqÍ*Í[Aja*ŸóÔˆàŒãâT?Oä±˜ÈæÞîübð± q"o |2Dß0÷ÛÈèÂL¬iQ¢þóM¹n= endstream endobj 736 0 obj << /Length 3288 /Filter /FlateDecode >> stream xÚ•Z[ݶ~÷¯Ø¾i¯¢ %ÕéC8A‹I§P·W➥­Ë±.kgQô·wn¤¤s´µk?Š’Ãá\¾n|ÁÿøªŒ®Š4 “,¾ªÚg‘ô¾KënVß¾~öÕ÷ÐŒ£°ŒÊøêõÝz‰×õÕ?‚ïôéúŸ¯ÿrÂø\%av(yäM”¤<&qru³²ÓÜô×7išù¯o”Ê‚WDžEQÐ×08òèËO“:üJÔ!‹‚8¦%Ÿ½|íyÎ’ä3‡BŠÏŸ*?¨0N3XÏ9(óàá:Ë=\Çõê‡ë¤Œ’ñ?ÜÛóg-¿“=Û‡@>M«nËÀða6Üa½¿Xg*3ÂP,»¸aú"è„ð4@¸ªÖÔ¶5Ý5ì19¦d£ÁL=”îî:NÃ8“#¥Š²à–y›>°·6cc5¯i°/‡­àã^·º¦õ@¦ÉZ¦±Ra«G¼þ/fú»iúÊN¿ õæò$,ËÒ?‡’4 ùàöwú‘÷ÄóÀ®µH»ø7[±ãGdz¸õ€$F–ò‹³4n’¨~•EÔ{çµài÷"h{T^{4þ‚[= š{ê^ºDžÀñ"RØŠ4ÜaÅaVÆ_*Â8wÄzš5®ÏÜÈž Í –¦„%ßj8œ­Ù½×4 a²Û§žöx‰ÕšñªoYÆ*NÂ<Ê·2OÐ-B•ž·iªØ° ûRC±÷ Ä L• /8ó8åÍÿ:ÛÝ$YX”…; F ]w™8ËTŒîT[ƒCŠÚ0ÉJ+¹£–%œ%òBäa„BúnÉžWÇd.Õ–Ë2Œ¢Ä±ùäaÀ÷%©£zý¿b–¶Eï€=ð>L2˦I–ùÙVºµÝ½ÜƒiÌo¡ ?=p8Í­ž/r†³’OÃÆ™yá¸é*v4¬&‘¬È1䘲¾JqÚ?]ƒ«Ï.œqƒ&u+#0Ê‘Ç`Ÿf¶<¹lfIQžÒôïºWŠb>M.F¸h¡‚ÆÖb”øÅZœ²wËÉ»É SÀõBä°z }WñÃi5P®Ìê©`â=ÑäÌ£bââ$ö«b—-ê“'Jà:àgN¿ þp‰~Ü…~y¦‰GÏ ëæ8ôsWï"¿8<œ<Ûw(¿G ~oFRÄ!4`VÌ27_@2„ÈK¨Gê*P3ªÙeèa°ô­5vp³Ýõà°ò\±À²SëÌ¢ðš+˜¤±ÚG·ÛFsì¥/´)¦ y†ú TDYVÁ›§eð°´tú‘¹éQ—pR»ÉCñÞdÀøT'ròy$¡µ .øù&Ê"¦Š·F‡ƒ·z4š2.ø0²ÀxQ?¼xÏ—žSÙQ‘ΰ–N¶¹†lu qðÝ¢–8›íã Xž©ß!Ìõû,$FÕáL1õQ “Ž+6V=‡y‘ž¹‚=vʰXâ]óv4Ó[ÀµÞ>èf6»)¬ZDÙSêpnÌŠBþpDù~Ú΂7iø£šôX]ær7dWßðØ&àýwNx'i¨Ô6BàIïûo1ÒíŠ= ÓÜ#QJ’ÑÕ‰«T¥÷} ñј#so'^x2 훬U\n½ã7£å¤q `ö4¬¢¼4hi×ð+[5ÖK¨zÎß,ôöf4‹ÛßMBÃC–o™º«Á‹¼gý'þA#Œ¹ùõ×ü{gÓõ80NµíÐÜÈähðßONûp4Ó]nÆ‹½å[¶Ú¾³ê¡`KÂÞøC°é‘ÛTì‚„Ë0j[2äúN¾o-:&åÂîr!½Þ·æ2<(o #ähÕn¢˜"òð ºó޼øÜºSŒ\Â2ƒß–ÙA>ض£C¨Š³Dñ¤ÇQÑ]%E"þÙ4=ŠRwJb°RˆsPÇÈéÓièà4Z>ú™—Ò§Å‹’ T$½\±Ž#Œé“ þ*[w@ŠJ ùˆèv?æàviZ€™éŽU»äg{—܇¡ 1ˆÙ%aJ"CÂÚƒ!„…];k×2Fn’õB–L¾Ùn ·ãÀú§UÀ}¾WpíÜú³Ëqysq“5“êåÙÿY4:D¡*½«š`Á~ÞUA¥Â¨ð¾ÞßV%¨’÷ÖÌ+ ‡xµ ÃCîw2”õ ³ñÐJ©ý%*Ìòr+™ÎÚ¥e¹6³¬®ê–«‹_-Ëd}nG$D\xQQä`6ûó5üX-Z¸E‹õ¢µ *þÄYà§_j¬ÃOz“§¸…ä6‰ðŸP2ËØÜ²¬¨L„b¸Ü‚}„uÿ÷µ¬ÖÚjèûh오ÛN7Ûç{Út¦Â&«{S½§89:½§\e¨Æû7og 9øÄÓ ÄâP4;‚‰2X¬»`O­¶)8O1LaêB÷ÆVšje=YFâÐí±óFäâBœ#Žè‰ €Ååü‹‹ËExX Ž·ž7¼¬’«,¥A€5—wmݯ¦F—xŠí"›ÍÅy¥ Ð{ÉTSzVn%˜óÔÓD¥Ÿ-›ÂŬ£æ¶ˆyqfÂMË¡ ½4¶ÒõRàÞ¯_ïvcw‘>ËaÆK)>t°Z8º¨ª ý:4ZÎA ª;âø&8bG'œÑimr\S;bÊsÉrÄ>ìÀ³Ù¸$lHµ¿fÒ&„Ÿ*š=ŽRÄñ^ÀÍ~²€ÞÞ¿¶!)¨¾ûùW9gLäüð{437ÜÉ€øä«&8à"/‰a÷€¬Þ(Óçð ;µÛÍ“ÁÙoöâ0æØš½`qȃ?‹Û½ÏÄÛL.j˜]ÒR,^„\šÄÃ8h(Q.r·D-¿wz’|ÆGM¥ÛqÖÀm—Ét¾º®—TbËÕo/#Qã ¢òT7]» § ªè`ºdrE¾]‘.½f¯©`…¯‘¹½ôµ/Ë4ãÓ$ÙüòX¸sþu®ôpy½¸ LEI˜(~ü>ì<~§üø-CB?ʃXY_–¥À„;W¶À("«m1!E˜.ïÉÓêÖ—Ò>q ›cßšéÞvG¦iì{yÆÄA¹ÿV`—fëD¿7Ý›á£=);¶[Ñ”¹Ú¶iö”¼3¦nàxÍïà 1xj·{Jg¸›P.ySãÚäÐEcâ†UlêÚ®žœÐ’¹ˆˆKÍÓà–pn‡«—Î/aÃŒ“y§Û]ÄDNßÀÄ…Ç2¿N””t ÝTŽó`ÍÇ?0PR)˜‰ÅxZ˜K™Øì¶op0bù HéYN?.,uçž®a~ã°§` àn*Ç”–ó“#~QˆÂôJóuÆŸ¦“Zsì &*‡È­° ¼Å‰h ˜C-/‘¿žj=™Wf¼ß nY&KUó9¿mË×þ(\—yâ[Yz†å}%¤soŒ¾Â%åU…[^ŽaciªòD'壂WËC…Eè„$\dÁ·Ës}ÿöý5¾ãÝ;*XƉø >1\W¶u‚‰`lœ=:aW-6ˆd— zûYjÓ›çHš*óîð©Õ?OÜIú; <[V®l³o:ÿt(ÙTt^У„i0œYÇõÔ¿²™8§•¿Å1ô ^!+2Þnþ¦G ˆWO“M‘6ášLY$Fެ0nÑÓ‡xLèF÷—Eÿã›| endstream endobj 743 0 obj << /Length 3165 /Filter /FlateDecode >> stream xÚ•ÙnÜ8ò=_á·•´¢ƒº2o“u,fÆØM˜Ì`i5í(i‰=:#æÛ·.ª)µ'RÅb±Èº«_Dð/¾¨¢‹"MÂ$‹/êöY$ÐOÏb™íaçaüüîÙ‹×0£°ŠªøâÝ­OâÝþâ÷à•>^þñî_qÆer‘„YYñÊû(Iy)Lâäbç-5ãt°—»4MƒüååN©,ø•г( ì^½zMßáW¢Ê, âX!ÉgWïfž³$yâRˆñô­òR…qª˜Aó`Ú#sQÄAg†Áà4 ZÝ]&e0éÃs”Q0 ºe¬ÿ¾¾,ÓÀö­ì:ê^ó¬îÝóTÈÜ™Þtõ =ê†ÈÒ(X7Ù!a aìíÁ„—»,+ýóð•ArqÆ™\`çE.ª*Ø7ÃÞ± €nÈÒ0Éóï•Ø=o , ØY&É'§U˜—éw‹¾±k&Qª²¼È H©XŒ XôÄè°v‹2ñE¹&F§~ÇãË/>þv¶»ë¦Ðöw/nñõ^¬Ù÷³¢X²s¦U뜅f­‰; Á\¥$A5kL≟Ÿ÷¶7f÷^÷Fö¼•5’‡%yÖ8ýS6â«Px#Kýkj —äi Š@ÿ£Š! 4™V`êÃ_“õh/€~¼Œƒ t±FËë¼_·—¤ÞqÐä×-ÍYkõÀ¨µm…ë;÷­®å|½Xº_ÚÃÀkŽ×Gt_njÐ"£$˜hŒƒvé[xѰkgU© ®†Ú>˜–L¶¼Æã¯ÿóë[Fæ÷2¼7nõ(TÈ>b[3´£WÆÉ¡¹ïeÝ0¤7=‚-ey$o°a¾CîÇ !‘ +¥`½ ‹H®šaD¢à:éšJ©­ƒÁKâ¾nô`ô^>:ÍãI^(0ôbð-òb‚zEÃlwË›þ‡™\•†E¦àÄÛÝ=¼ã~ÇÖµ3Y‘} Ûˆ“(LŠÄíû+¯JʰZéîÚw¥Qåñû®$ÝÁe-OÅ}•a¢’q_šöBä±-)lc>Ÿ96U†Q‘_d¸Hql‚µóÐ6<ÉšñóÖN}mà¥ïLøÛÕ»3W–Ta¶<þܑ·/ ‰#‘‚ü@AS•'ˆ·KR¢è‰Sæ<Ì båIp…*Æ‘^¤/yA‚?̜¢Ä~þ}æÉ+˜¤`Ú]Së÷Q‘Y×—eð÷e–)r"ˆös³# ‚.åˆ0ÎÀ†˜6½©ÛéÖNîæU'"õkð €Ì™µgé B»œ¿®ÙKš¾±½±ë“éó6öx Ú ~Ãeu·wDµåq¡hL ݹï€Û™öWè‡*×z¯yFî Æ{dÍF4|„Ĭΰ⟂!'A £l =¹ßPÿ͹…u„‡º7DVŽ ¯ã¹ó DG‘¯ùÔ ¤Ê ««‰Єuƒñ$Í’€G`D*œeŽ3K¾m@ÿ^•'‰Ø$Eœx¡·g—ˆSÇЬgëKÃv¾L–á´e`Ó»ã˜âR~´3DX›ààÍ Ÿ¿^Vx¡+#ñÐ#ÜÙ|@(™|Á—)è”GîÖ þ&‹Ã2sÎy kó5]Ý_÷¶k0ämØdÒ²ó+óàØÚºÐ-rÐìÿÓ4£Li•ÎR®œƒ¾)ª¯Ð ãr±aocœ¶ÖÙÝ’€y€ó‡Á©Íàö^¶<¼!}Zˆ0Ÿ%? Ž…Ñ ‹äŸ“’nXk¤Èi:Œ”TF¤âÁzþP)çZ8êÃÝÔjÞЊÞ5ï#¨ŽÀ”½6-áÊ©8LñQ÷3aW_šÀ—îà±lä}”E×À8^—-Ât¶.þ¤ÜM\ù·,+Q…Ÿ oh&È6›|È›W¿;Y˜‰ŒØ“À÷ãϵa¯{î(?jÀg¢œ®¦¬«~öC‰A~¤âJÒS+NþéŸÃÚyhØš˜xå-a#“E˜ó%üþ¹oFóÇsLÀg:w VˆgÕYòCâ[Ä>û[é£`=Áþš˜«ƒ Îò´É¹Í!k§¬ >ºå5A‡x'ç8BÿÂF—g¾ŸŒëàôȇ€ÿø4Cðmñ£Žï74ÿ,m=¢ Ç›@fJquðNè{Šh• ²ïf`Ëy„B$ŠPDqyj*6—^šIðÚr(ÚÍW9Ù(G–ÈË=Ó”¬(dø5Q)vùcx¬ã§œUö“J‚˜ÆžÙân¾é ÐÌWàÆÂn³àç(¸ôÏ…xV±`LO?ù,ìÝ圩Ðp¢î;Ë*Ê—ç<¯÷…?$5X ŽÎ0õĈXö檀½|ÍjÁ©µ•bB{å9ý:ôTW_¦¬R…t>–. È‚æàç§ÐuûþæðÄÿ endstream endobj 750 0 obj << /Length 1767 /Filter /FlateDecode >> stream xÚ•XYÛ6~ϯ0¶/Ú`-ë´ì íCÓM±mŽqQI Ðm³‘DE¤öÈC{‡œ¡lÉö&A€ˆÇp曃ßÐNøN–Á$‹#?JÃI^= hõã“FS˜Hü´z2{Ã0ð—Á2œ¬6‡*VÅä÷œ5—V¿NÂ….¢Iä§‹%î¼¢·ü(Œ&Óƒ-¡»R^Nã8öæÏ.§I’z¯¬xž,`Sáîõ½æmmfQ²H/ S£òÉõªÇœFÑœ2_ð* ™$“ù"ñÃ8A”×Jq€E^5h–1ú—d‘GBÆ¡(ô*®*‰+Ÿ:Žkò´ð€$ IçÜBx-Š ðF™Ÿ,™‰¼ÛËháñ mæ²:Ày¿pX€ý[Áï|óÀ{Ë;ÜkZÙì±)¡­‹‰s1ö,Ha4÷!‡Ó0öÔRYvJ·¬EéÜ(‚“ /çJÙÂZÁñ«xÉßqp™$‰—ÿgm1 PÒ0öþèXù©» M0C´åR(†CôÖG2b†ÿô) ¹µƒ£äº¥­®Âï–Û¸¤™×€’Ì“$ZYÃÂ&‹.R#y)z<…Äïµiç튖ÛhŠV²Sü WnÑ@¼‚ásgN©t¹âõŽ9t4hlt8@¬Ù)wr&î­hàÕô-)¢¬ŸÙq’PHÖˆà±$žX‡-Ns×Rj;bŒLÖ“eêýl„ÞÆ¬µˆ?ÿ[Vâa‚çC©n‘¨XËKF Ÿ3%{ˆ™…˜ˆ™…èê8T°+P˜„‘Mr†¨`Z-rYIâР2’Õ" 2‡ 'bÊË,TÖ÷-¯Mh´;Ï–pQ¬çØ^×aQÄ4KÔ(qêÉŠ]:«§j‚¦4€Œæ‰-ïh[Åf.¡–ÓÔû—kye0!48¦AXm¿Jú4³D³6ÿíCÊÁ®b¥6ΘÓtd'vE]÷l˜푼«YÈ«OÞYKƒÐATÇl/I<~¯[^‰‚Üã¸A[\ÄkƒRàÕ‚!Š3ê\¥¬74,Ü–uÃÇ®‡e.ý,š;:×&;\ËIšx k.!˜ÑQœÍâ†}6WÊœaåÖ¢4ËÄ‘fxöVšÍ‚ã­Ä™vªl1ÁÒ¢UÈÚ–oYAf)ºÓÞýÅ9ì(à?ÝÉ,z„à³bf¹ÈmàÍÐs†¤—…–QCF5Ç{F5“Kì­0t¤z¤æ]«$q„ ú1Ѱ)Ðü$ïSzMp|jÃÑ  /üÅ0ó§VQ +ÙPÙS¸TdùžUMÉc?æÌÇž™U&ãÇwBïp´Sãw® $xYu5„Ï,ž µ§§<"«P8ÇÆ@! ½‹u§y1F¥w$k ‹Àja54sÿó7ü>Ȭ%MµÔ8h9+D½u†QL£±+œ(ÎGÛ×.º§dE^Y§ÕEuÇ{9ÌDnNZÃñF’«](›’Õ6gœÿš„œÊAo_±ŠFl¼uažŠä¼Â¶-0I0}>¥ç!íóìÒ M+  µÞ8}%¾ý4'Å;I%ÀŽ}É]˜6¢¦J’)bk3<›!æ»6ÒM ˜/\{JD#ò”Š[^ëQÉœó¢hÙÀ.…ÖöZÞ?#Ù> 5­Ýí¸«j6Æ'sà¤V9(«ÝµAªxYº  ªF1J§¹3_†Hná!Ãï¯F­ÌËD³ÇíÈú„¦>š_:ä.I±…WÔÙTïyX¬TÒm?Ž+ߨüö '{mDÉŸ}†içr> stream xÚVÛr›0}÷W0îtgŠ" Ä¥ykwÒºI;ã<5}ÀFØ4\.©ÓNþ½IŘ’ŒÇfÅjÏž=»Š‚4È>Hó æ˜`‚´åfÅÛû–Á6­æ£Ó)3ô6Ûó@û®ŸûÛÉù' ¹¹XÀ¸÷ÜAlrÀkFËeœN Ó4uûýİ,¢©·õ4`Μ{/wÍ’j…-—@!»‚]ÎÎãÿUí8¬ ·«BŒ¾«Ù®iqŽp‰ Å ±†wlGRýÔµ1½ QbB»cPWx ÞM7}> stream xÚ¥WËrÛ6Ýû+8ÞD΄4AŠ’ÜL7mœN2õ¢ÍdÑt’—b`Ò²ÒÉ¿$|‰²LÆH¼Î=÷Ü9¾ü‡œßY‡DÈIŠ _¿½¿@ºåÊnoÄoÛ‹ë÷²‰|ïÆ¿AÎ6ë/±M¿¿ãòêŸíGm<´ œÀ‹67ªç‹„ªË P฽.RÕ9»rÃ0\¬~¹r—Ëhq×|ÁRÙ)Tïícœ6OÁrù „ÖÍ’·[‹9 ‚'‚jFL£ úQ¡åÚ[†+gµYz(\*”¯¯[ønä­ƒã¢ÐC‘ê)9¡UöÅüËæ?ùDu%·ŠÍ›’$÷êéÀxžªæë3?”äÏiȵQû'AÒfoô¶Å(Ó¬¼Ð¾k½ê;ÈÕ¾l0]ª6‹¿BÅÞ¨BIEpžÕcµ× (+ý.'ýà~Õpê<ï/× ñZ4SÂ4žÏzieŽ0¡·Á’GÕ¬KFÍØÈ¡;õˆÕOG0<­<ÃB»'šÏ:™À°*®£mÈmÙjêÝêçÏŸ¶ªõÝò1› 4Lƾ‡ÅÓœ¨v¬û)£n3Ç9L©E/”©Yi>JÊ^ ®mÍuŠX–™ù¼À9ù†+¨–—`&h¬5Äj>Nb?ø1ºÂe ˜•vÜiø·ó€påm6+é¡,éÀøÀÒ»Ù4æåpp²‹¿Î~Ôж^ ÔÊÉn¯!·rýI‘ È9— /PÕ;F_i)LJ‘ÀÆ ¿Ò•³š¦¶¦böøóêŠå*náThR'§"sò–Ñr¨2]_@Ó’³mv81£ôû9𶆑Œå9;ØÐõh[)pµ ldØ)7mýt8EÂK ­9tÓ µl®Glji‰Ñ!yW.’Í",ŒB2¦õŸ2‹¹3LSSôfD‡½k©a}-ÀMp)êÆŒ‡‘æÌ°)wiÍB`㛢ªt›XmοxlÐ…yª¸ÆȶñÓ£íßq\J?h8GVk4œT0êiý´j‹æò½æA0­ Éšô{Êô:X˜& ÀOžYb„-Á:š¯µ9mVÇ<‘½N¶˜jÞ“=¦»1÷1KCô¢&•…ÄM†!og§v*s‚‹sœa¾« úpc;»§_ Þl‘BN ™<£% ©¹¹¸Ä\z´8mÒó|uÆ@¸¡ýù0'P+i–½x¨ÝŠ!Ê”Š2œT¥—­o\þpˆML6 ÕTºAGë"®ßö$Ùk‘”l|UäˆgUM¼Â¶l9ÇGke‚¤ó"}ŠM±ï|ffÎjˇ€)»¬Øtä¾¢b¼ç¿F2ökåZâjoÊš¿=ìgS3 K&Øì®Žlëetâ=³:Át×ÄÔs£vö<5}Ѓۛ]’Ü®+QÃi¨×Ntg¨@oÆ$¿9Šº8çÍ) éK½5¢Å<:ïãœÙ Rf<7…aP¦á’Ú:Ðat–JÈ|Tê[f|ÊÌ廫†é™Á!3ÇŒ=(5'ÎÏ {Àœ4ß“kÞ™²šhc «ž~MïíÝ$\/-æówûˆ‹Òh:œÞüõ  (Ö§Ü]˹°']i?!'µ5:ê1­q~æNß|bü½9 endstream endobj 762 0 obj << /Length 1229 /Filter /FlateDecode >> stream xÚÝW[OãF~çWx‘–&+<ÌÕ±u+±*íQ5í  ÊÄpql×qØ„ÿ}g<3¶Çq ¬ö©BÂ3žãs¾sûÎ9Pü!'€Î„`€rf‹=¨ßÞï!½r…€Û’øyºwôQ, 3·UL#çrtæãëé¯òò±ƒóur1QG#츭£¸\%ÙØ%„Œ¼÷c—R6ú½g޲H.ÕééºäE*w˜ú Žò¥Ê½Ói™aüŒSRbÛ+ÜöJè¾ãù BÆ‹³“ß>þu~rü”dzûñÐÄF¨yJçDÀˆ©¾(‡ Œê§»0þT$5æé¨äYœ–zóÐzÿÀ‹’¯õŽ7<ºåB:®Œ¹}ÖžúÀ½Ó6x±Œ³TmæY¡YœÞªÍyäf7ÿòY¹T{ 9ÍJµ‰²ÙjÁÓ’GjÇ‹ Ú½;ªÖÚ<ö¸?âÉ#íS~Xc«CÑr×,kÕØñ,÷DOxtµØSSU}f@Ïwà  ¯b²€ˆq74Ñq?˜…Xnšåc«¢)™ŒäP uîna9ÿšþmÙÐ ó\ ±0q+O‹PÜ ã0±^Fñ|¾2í†úòñdâ½ Â×ôì÷ÇcÃzÏvèuAmÑ“~ñ>‰Ë2á5=ôi®.d/¥ž³Ý‘v'XÍ;õ=ѺäšP÷6«Tôõµ¾âÄõ”Ú«ÂC3ÃÂ.9ê±»ì Ò`nSjIœòžük³a’™¢…ôµÔ.÷&XêùÆî€žÁ§‹RÌv ³êþX7íúØ\IÄñfëxÓ>~Ü:~ì-79ÓM¡aSè妾cƒÁ¾>³LþSY"Xñ•­dKõ¤RÛ=;7mW ¤K9S†ÇGïdx¡ÈÛyÿSKIê}ãNg¦PˆŸ¹€ˆßì¯)„)!ñsÙcìäLз„2À µÂò÷éI§²ªéЬòÓ°±v–ï4 Þòà+-ÅP– endstream endobj 766 0 obj << /Length 678 /Filter /FlateDecode >> stream xÚU]oÚ0}çW¤•&jŒ¯ó±j}ØÆ´M¬«4öTúS‰0á8ÓЦ˜.œëö‡ íÜL¿:0D0$At8Ò™&žN!Äq­/6QÒq=Ïk÷ßv\ß§ío N1n' ‘Ìuv¼+XËñ‡·F’²5ž–š)!O4%‡]»+ô§?ôx¾V 3ÆòŸjCXª“oÂŽ ¦Ö³ ¯‚ƒF™6«j‰ëc$åÛªþÖ  È J­!§g 0ð‘Oý*€]ã´;ÓgªÅ½½x8kpƒ]ƒ]v Ô¼ê xÞI3LáÜ4ˆú´êOešñ¸E!>sbµGÄÞÞSÁ«³NöÑš¿VJ8KúÈÃeJ i–ÜJJ\';¨0zÕ&Ñ›—I¶"þÀ$Áç«D¨÷4s7•| ÷óG¿ˆpxÛÜ ¤äJÝ‹­^¼3“§øTxœB”í4¦gÊ$Ñy£ÕîÅýSÐùð|R#Û ëŽþçzšfÃözðòž^äë$X1s)‘…O¾ÿúÍæÅÆ 3ÉÝ» jò„©¯¡ÆÌ—Afз¬`ñ]ušjm|‰yÁË™9„AQ)Ú8)»øÈB«º¼XðØhq²Ù ¾ü9™THí.·K±Ç!; Y–lêµ:2c¶²^W#®‚,7d±°CGÏSójíÒŒå9OŒKa–¬K½> stream xÚ•]sÛ¸ñ=¿Âo‘3Aì=]Óæ&mzs3uÛ‡»›),Á2Ï©!©ØN§ÿ½û~H”ޏÀbw±_ºŠá§®Šø*Ot¤SuµÙ¿‰¥÷áh ë ÆoÞ|÷@GE\¨«›»é7Û«_VÜáú·›¿\))«¯t”Ú‚G~uÂC‘Vúj=*ûcÕ\¯“$Ye¸^“®þFèi¯š- v<úç§Þ·5¶´±i¼R:Æ%ßüùf 9Õú•C!Æù©ôôTʨ(íUfM¤ÃT~÷î榫­÷ õ÷xlðO‡Öw]ÙÔwܵ͞!wÛ|ñq rm¯Ö*‰TÊk¿ûŽÖÓáègÜï×8«²‡úž0ã H_\5"­•ŠLjf;ýwaDM†NŒ6Íà›E&±Œyƒ×™]màÜÚ®¶Ò¼…O¾ò»ÏÐ~F8¤_ceê²ÞñØ¡åÉ¿=Ódó¹¬Âii[˜±«ñ”xÄ%bMÅ* è®Þ.-ªãÈE@òõöÕe³8R… 3ïËÍ5Ð}?žÙÒ™¹»àÈWŽYžè,*òtÎó=èÌÿRúÇ%bS©,Ÿ1`‰ÂDEY’´]Û\$P;Už®Çö@âÁë£VÒ»møû*5ˆ“ÿ“M³ß3?`‹²ão/[• ^ÇŒÒyi£çŒê›‡ûÖ‚!Њ™ŒÀÆ;Ï !‡#\ÓñÔê‘pCüú'¿9ö‚ kíe­ª çoSoü{Íê±ìï›#¬GCzÕú»6¬Þ݃ÈÕjÇ#®Fö=ó »Ö@KºÙUí)kà9 >¢MSfu¤‰}‰D¨„m öƒú “|õ©çž²cÇÍ]Ãâä(([ïd†¿Âe¼­xƹô ‹5w<8ˆ@¨ fŒ›íe›c广óA^ñ© ØVâðÜS•xT\ 1°0ŽN&ɾIà |[îê¼ïÂ\_JçæHz{¬\_~™,Æ&ñYeŒ@ÏÃ(c6ÆÊD…1sûöóÌ4]¸—ùx/?Õe_ºªüê_2#9X§Ñðly <’‰ÕêËuš­\[6GéèA½v×Þoýá˜N€}x[·çF×»¶G9ÓÌrg[g†U'•u¹ÃoâȪ‘1íÈÜ´ΧäÕ¸«Â+uÛºö™Û·A×Þoå",Ú 0`É`7>#§^´à1ð(`Gè9ãÕõd»áØH¡¨ tãe»Ö…!hçSày†#X¸½Í±ÚŠÁ‰!ÐÉœ)Ö¥Qt-Ø2pŸXý»¦õ<ÄlØñèh p’˜-èZšpÚwÇzÓcØ0»ó¸·¯Ç dbrÐÜiŸÿäa±EÛœƒÎ¢`;x>'™DñT6€'3»50Ogp>vôͱçvsl—(³à3”|F¹yX"KCГeÏ2¹zïqŸlîr5{øJDáÉÏ*àaˬ¦16²5·ÐŽ éüaéâ,rG™§?‹ò,Êâ!ùùÓ‡¿~üÇOC¥ÄfõÎôhï6mCR%gŒÒŒ3yñ›Š¥.Ç=·  rVì%ûLˆt¿±kbªcv§Ø;õàïY Á¢neÛš'¹EEÊUdMñ->¾È4ö*vED?°M›ƒ¢?‰doè ¬¬7ÕqK¦Oé10doŠ]Žñîá˜èpŒè¿ß^Šu:cˆ“ûÊß6OK´§Y'z¸d?põ®oÚ@™ìÜK}J­­ãa^ŸûØ ª=Éѵ1‘†Ìfzy~òOâˆJñ?AK†hiI mdÅE éT—5¤C¾ë9ÁÀºcÔzlZ0o¾{áScÜñ:€æú’É^Oˆ³g!2¹k¦kØ!*0C¼P7}y÷ÌðQ°ù¾–㎯û >ž>PŒpï¢ñhJÏü{1É_“­ºgžìž¸M· ¾dòäP¨(ÍÕø¿äÈŠ(-EÿÜûýH)l±‡©›@èC@V®vè ÐfX ±ì|í[W-jG^sŒF^"ëÄFÉ5p˜uœ¯4µ—Ä¥ÝG¢±gfˆs1Ä9ÕŒ5е8#çøŽeˆ-¶¤=„5æÈ<¹õØ–m$;”%ó}Ážà)—bO´ȶ,fšp(чM‰VfCŠdYŸ Ö!?-ÜE*âÿI‚ÒT@×<†d 4°x â?]î#œ‡š}‡ 0àÄ|{!ú&¬œö­—$B¼‡ÜÉMI¸wˆ@pdÒ—‘[<‘«Á身£ïÈã"MŒÚs¦k`£«x¨{&ÉÈ.Ä&àÜc5hæ»%•´Q6æìÍb ¡ô ÓÂ:*'ÅcG™ØÇk›à¢D±rûCAG9ÒB†<¿ $Ð2Ô•-k‚)ýŒ_8L"ÍòKAƒÒ°tñjà“E…ŸéµÀ¥ÝÄ·|Á %”]0Li”Ž€ÿÒ–všžc| –…ý2tï]Ý…“¹~<#†TS­Xï3+Ô`În L*æšzz4˜3*“X-á,à–NNý[bÇÂN*3ÃqZó^€Aؘ ½Ð3‹ æb¶œ¼šv[‚•f ‡ýÝ3e}°y{Q2¥ ÕŽæ|Y.v©(¶É·‰0Ÿª9È?\(t©T¿x÷ŠÈä£ß@Ñ3ÍÓ {^ƒ•jKi¡X‹ð÷8RpHAyŒ ÊC-“¬ö8‘ëb5v<³šÜG_Q\CäÖ%gEDÌ.ñ¦iÛ Ç¦ÞJVfƒQ%JÆÛ ÷®Œ1o³’‘ƒM¤à½ã ׬Ë®¸ˆòÑ ]0U ™l´¥ì>ð}ÉÂŒ1^”%ÖŽY¾%¯?È)CM'¸157loÃM.²(/N*/xSœcÌÆøp¹,?èâü2˜&>sàhX(|$¯ÃwMËÀFE¸~å˜Þ!FSŸìåöÍq*a®rê¹Þ-­„7àÙ©šÔIkð©Øè[Pð=Dÿ|Dqì K • *ª¨Ž@7Âðœü7£…­…úItg¦«¢c)Ô‚}ªßöaW.M§AÅ‹ñ¯¬Îoà†€²˜”êm€ïL¦¥AÕVDG“x‡™46¦Êƒ™“.Hæ8t)—θþšQÏ£Ôª³2.¼j|´]8FíöƒW!ðž1d’3À=-íÀ"²TRÛ­¯ÝÖuRü=ífä­T“‰z¥29ø Œ°¸jœŒÕi¿Ýùå-¤Ò|'•g¡mFé,»ÁcâÕ¿0œñK<ú-J¢øuŠKãi¨×-ˆ$·Q1ÖŽ.Ú0Þv¼âIt…Z¬$`´~ïJ~íI(;Uf¨ÏêôT{ˆàf |Q{À•ÆÙ7U&Mϔו[\–cIÒóºMYƒÚS&†¡Žž\,nK\¤§bƒÖiRJ˜N Ç!Ó¬Hðe#J5©ÖŸl%/Y"§ž”Í¡s?:TT½¬àh3lfÃf3õ87¢+èS©l©â­"=ÞÊ—bp5*ËynBJ‘®¶¾w° n©M»€q¢”‡\ã± Ì(ûªZh'Þ“œÒmúݾ!'6ŽR“‚›Æç߉a1œ¼#¬õmá…üt±KÏäöò3¹=“#‡rþüòã‡Ï¿½g†s·£Ršã~¥íÙ9l[äÓã-=“3Ò+§;YJbR®‚ç‰uvîy–î6Lφ[;ÔÝ–¬‘‚x:½PW1E2…;n:þà’ ½PG„„0û÷‰‰ÍNJˆ°p);–üT= 5~Á.ì!ã×pì®Ê®—ùC’š]ÈyâÅý¹ÅÄÈVñpþÃ…°ÏŸþ~ÃU²Åg}“F:âÉï9‹à‡ô¬üµÁÃÆEØO¦Å…ãh°ojg†‚.ô;þÔüVW‰7¡€…ÈzÁ™"ÍŠ+´[YU’NÅ6JNŸ¯ ø¬Ü†±D΀Ôü­¡ò=§ñ@2/YcMv@ú‘Ò¸YñÉ¢0·q¡Q<þKà%6pgâüü‘ÜJÅ“Rj£8>}©ã<4¼Š"¼OwrÖˆyÇ¥g î@[ô¾Àngw²ÅÚ\ò½‰= \v¾ñx°”&MW¿{zb±\êÅïX©‚FÝÔëÁƒbê–œ™.Œü•'‘^a >ùGÊx]jtÕUù5¸k‰À r&§ª–Ÿ›ÍtR—6¢tmË,d†“eÊ:,ãeÝò«@t^G&” i¬ 2YˆçÇáÅà=ßcd“·Dzw5c@²[~•¢b>߇÷~'yt–áy]ªîh]äIBBâæäUâX‡7‹ÍQþßsùᜣ?›­j~ñh¨×â³"³Ìf²¼Íˆ)Éÿ +’b0lŸ_0È“¢r«` †ëOÞ±ÉF)qÜÑõr °!Âj˜_€E¹'W‚­D¨6 séiO “E?hÏËÑË®ÒùBÓ£"ðÀŽá ©B:;T"LMÒñ?÷ÞmYORa0Ãÿ^d3þgÇÌÜÊ,º_t¿9ø¡¼ñ–‚þ!‘OÒáBJ:?¶¡ •r)z2—[FYvrÆÀ:Íç5F–©JDáR¬@¸ŽvI³1ð…~|O¦{½õ<èøCU ’5™°4ø@„ø;TBi,@û0Ȫ7îÐáÿO|7Û¡júxýn‡ endstream endobj 777 0 obj << /Length 3373 /Filter /FlateDecode >> stream xÚ­ZKsä¸ ¾Ï¯ð-íÔH)RS2³»Ùd2ÙƒS9ìlªh5Ý­±ZêHê±C~{Ô£-í«-> |(."ø‰‹<ºHcJ-.ŠÃ›ˆ{oß~ `B0™ñ§«7øEæQ..®n¦$®¶¿lÞ›ãå¯W¹Y(2y!Cå4ò9’1 …RÈ‹`2Tö§ª¹ â8Þ$ß]JéÍßÜtE›f ƒ~ßÛ¶Æ–T™Ž6B $ùæû«g-å‹ÂO¯*ÉT(bE 67ðýLmj[Ø®3í5»þô916âM¿7=uß]ÊlÓœª-5¯Ûlcý,Ëïš?Ý4-=ôûK±áÎcY •Û`oêmUÖ;ž{ª‹¾ljj•555Îe¦Žm³kÍ!t²†ýq(4-ã'\F*a¦cwmÙãGS C=?Úæ€3¾–öŽz[ì„¥^,¾Ž3‘tÓw<ØÐÿmÝà Ó0$‡æÄ/ž:ÛÒ“_+µìW¤eÝ’<ÅÃ…©éáË©ëg«d,š£—GÌR-;jLѲ¦¦ª¨$Ì]ø|g©]öL‚_éNÔ{†Z&[[»íHâB…¹RÀÓŒú©¦·v¶¶­©<_ü•îÖjî©ú”@'åT'A×Ã$N`±ŽæÏ?½ÿëÿøôž§ÎÔWå¡ÒÊÏ„µ/ÓPÆgœzªŸ#Ñ[I:}K‹P«r:¼@[J|ô³Þ.XÔ~ÊuÕ·‹”²éš×) ,}ú°JK‰0Ö±Ÿ+K² Dž8U"¹Ð份mýJõtvÁœdAâl¹Š'ûÈ„@&1½æº¶ ý[:p…ÝžZžÕóØ`NÜ  ªíö-´ÓÔY¢í¿R˜ny” c5°þáí ï“Á:K±¹Úó÷k{ßÓ“iw§ŸÚ·K¢Ýa 1?«×¯”,ÀfËQ™k’a– Å’™>§â†ÐfãXÁ¶ËRÓ‰†G1B§½·Å©·[‚Ý®©ßPÇh °…*óŠ¿…Òß'¡Mí‚ dž†±L&jÿÔâAsdæç [вž¯¿µý©­ý b8£*JæbîzÓÛq{¡ Çeª$%MTIÆtPØúz©á Õ‰O@“ëZƒü€¡¾#Yø’>ƒæ{Qâ“IËî4ð:ÿbûÆq#Ø£àÜ[œèÞwÆüÈß[P幓ûø÷ë/¶`;ýû§Í#lX’ä¤Ò*Ê6•qK„§©JSÏÞtôÐûÙäÆñÉ»fS•=»GdòÆ’F¤‡’h"8n~þüÔæ¥›ë3KvÞÎÔ\!šºz`'çÞvN·¹ušÍÞŽ>9ýO7·C ÃmŸvÛǰ䩆þöånïÜ; mKà°s’aÂÎy¶Õ6\ôs ô g—& dk‹Ê´¹J*Ø 6ÄÆ‹Ö±mPo8ámi®+š/h‰dß ŒYÈ‚SùËñò$F¸+!z ΘŸ ›û´7ŸÛC@X …@çþ»eì S©t.ßÿðüN²é^ìmuìúÅ`AE!>=7MÓn»‡ÅPAé0Ù ˆ•ÛÅ ™AþE2HS`L­ÃEÿ*ÁÁ±þ|ÍÉ|¯bï—HÅ*ŒGçüRë©ÄOv»û¿±á[öuø¹1Åëðsó:;v<8ȯ¢B+:43×˺G1è¶œ[ç¯åë(Àk‘Y_xÉþÿVv‚LÃó™»nz½†6}ú°F*Öa2Vï /‚\‡2ÏWíô"ÖJÂÑP®*¦¨=uÉ=hœ:ÂØÊAüwØ ©E3,"PÖçù³3ƒíóMçî¶nè ]Î}3<úAFŒp1rf©í}aŒÇÐR’Pr€‰”êÀ§­¡ÿ÷Á$§ mǾR:áÓ"Œ’°e"×Oæ/0Ï ûÁ1 P=uˆÓ– vfùp”ŸÞl=Fo”Hô+§à+2À]Ö 5€ û›é)¸G?„`·«è^˜åï?Es803Š+ê×sž-—)ˆ ã,µÎ1¤Ýà$cîg“i YósblØÏQ]*¥6Å]Bß4ÄWÊ0ôü‹[©ØüŠÊ*“ÍqHÿ›]Yš$âüœ%£0γ)ÿ ?ë þω¶À}~šÖ‡&CþŒÁ©äSB»ó§‡ƒ²ËͨvóLb>Elshw®Ð“ÃÍ”6Oô#| ÑW ÑÆ*ø(G3äÂaJÎ㔪ì0׎S\Àƒ}gQŽ éFš±ì-$Øeéç*…Z‡ÓäŽß=sëó].Ɉ#.%Ÿ>Ÿ®œ`Ø”4ÌÒx~ènªÆô+ÀkDg±èXÒ˜˜uz–pá1s« þÇrË2Î Ü‘lúÖÔ&”<ì¸6ƒžaÏÎ{€ùþq¹ÔñsoüÌP –RD«\˜œ‚¢ÎGóœ3¾²m¾•óO&³´Òcï`A¸l4ijªª|!uoZΣûüÀ»E3ž†gõ†?¢öD Q-«s4ÈÍ8±á~VµÈj&"Å·¼HáÙe¿àÿnO:±?ÏÖfë5ô’V'9å§° ŒZ­ðÜ-èÌp©öÞŽ•P³ï¿£Ã¹©ŠŠÞHÖ›ëõò„Ð` Fs‡™ï5¤šÊ¹°…`Qù¢"hj1XŸ!Ñ÷d–Ë—¿ã¡0Ïe€ŒàÁ²’ÄBÖøüÎW1Ømëw ÷'ÈÐJ¿ùÚã1Mb‰³”Q‹imXåx%aÑ#åàiÒçøo Ž^ùþöTô”±Ï]ÂÖ YåšÍ,t>>D8ìðV®ü4 ’‡ƒË®„…ãóÂßò6ˆ(qœ²o¯AêYÑ\ÑüÛ7‡oS4'×O¤ÄËÂ*ç#Gƒ‚å´)8·µG8#ld¹~€óí¿O%×<픎«b¤1o „ÄÙúxHq‰!]‚EˆH@uºEÉ’ 9ÊypC4ì|o«ª#Êûአ4ãE |Ñ.â fzα‡- Œ¡y×â÷½³î‚QÎ5Bçóˆl"çõ!IÄì ’x‡õÈŒ.Ñ䉷Ÿy:±Ÿ Á oÌ@Ö˜¬X.f û!ú‰M˜Êô,+4§’ºì‘Z”wFã¥wó–°k­qemdbüÅCšÂ!ÍóoRŸqˆõg°!în|Ë«dÁL¾™¬~Ó¥†ÆÃ²úÑyÌy*ÂøqrÂU0Õ*ŠWaür»VÖd‘â•–Š/PxŒšpŽ*Qcy:såé” ~s°‘péy¸óëÎ £dÌR®Ûd&côå©úó쬉õÓ0Ùº5Ðb%¾p÷‘²'ϽÌ&•)>ß˾!óÏ VÜm•Y‹é…fþ%cfì9Xƒ¥^|¬¹knú©Ž7OBç/Vi½)CËŸŠÖ*’|fKøŽ ¢* ãý?Cªé'‰%wá  ÒÌ1áa ¥?VöŒ^ÝiÚ!›™Y®sÆg `Šé}pU(qZýÀP:-C¾íÃb¡—Ð/¸;„xÏO·þ¶Çôì!p}T«Í…éZTèÓnÿ#ãóq endstream endobj 784 0 obj << /Length 2882 /Filter /FlateDecode >> stream xÚ¥ZKs㸾ϯpí%rjÄo0sÚ$›W%Ùæ¶»•âH°ÅŒD*”d{6•ÿžn4@‚hykÊ@ãÕèîïCÃ쮄?vW•wFð‚+v·9¼+Cíçw,|­A`Hüîã»ßü>YYTeÅî>>¤C|ÜÞý°ú}}¼ÿéã_ï˜-˜åw¼P¶¢–K.¨©àŒß­“¦æ|Ùw÷k!ÄJÿö~-¥ZýÝ‹«²\u[hì»:üúõ~Ê:t ª$ylœ+]T…á ¦"í:dÅVud'[áU¡ ‹²q#™A¥*$t ‚§sÙœ/½£±›§¦}Äo¾:ïBåÎŒÛU×o][oë°Œîa&ötÏ ¾4b›j6ŽDNnïÖ~÷kÆda¤j`Ót0p÷4Ò ,lI ËVÇfsó¦ê#-¦i±îLuÏ85. ­«{úª©ÿJ†…ñ°°"«C‹Ò:êæ©Íé©B—2ÊœÝ~æÝu¸Šg*j¿¾/TÚܯAa°p“hÑëƒ [3±¥]=ý¢QðóÉ÷t®Å"LÑ7ç3ì*è¡£¦ó­¿ê¾÷ã|ACäø^èÜì÷AbOjóR¡×'¯\G×ÀôYE^uPæÔT¼4Ù]hÄÇÞÕàÙaøÿ\ê}nt[f<™]c ó¤JaX!ÌÔ²¾…©$e*û½8*¢éâïÏ®G½I±:¸º=Q%™|x³3Þì°47;¨{Æoov0DÛ…Ú`ðUSKj•ËVýùž­o`ŠkiØê/íd~nGs¹—ó°ì4ò„-þãë§Æ=£Ûft©ªÂÊj°èåPcŠªä‚‘@Ø  uKAm°-ª¦u]ÅV)õ%/K2–©ÂRœp»ëØÂÝ´¼µ²@¿%p ÌDƤ{8æ'bOÕÄçì%—EÉ%\UhÁ2`ã¶îþÓ5Ü mØ5Ü`Ï¥n×`ƒÒ¹]p•ú®¹?pÿ;8Ѹfà>à¡_dýŽ´²o$^TÒ\ARXDÄ$üöÎS_c6o;úuívê¯!Ú‚ÕбI¸Ýz/Õ£»£}l©µ…¨Ä£T÷4)*aï«ð`Ò𠇨`È‹Âày’¶r0)·dß\ˆ9 Á°# A!!˜y3BP€c®Xø ŽƒB1Fϱh@ˆ ™¯Å"›Ç¢Eü©nø Š]í×âÖˆ?:â=þhñj"þèh`К˜ÎHŒ´ „?z°4øò–Mdik%ÊŒ³èÊ€ð eÞ2ºôÑ­¼b4(ÍB²¬’ …š¼íÇ’)á ªkÝzÛ\{Bš¸'‚P& AÌê‚Uæ¶#‘op˜<ìX3ÀÎ"’q 1~ð„c¼ÂÉL$èÍÂ2ìWö§sž”V%‡$_QÍRé­Ãñ[G¥pôr˜Ôr$CŸá…AFŒ=OžÄ€édáT^p)oÀ&\CÆ»Íkj`]‚ýRµÏvNª²ÍåÌEiSš'ç7ä‘4§Y–ƒ€r;Tã×ë\$ÅRª“?e£“òë_JJ ؃åU¼ò,ÄZAmx%C´æD‹—úpÜ;ª>ÎÂÝÜ[C!äzw¨›– ¹’c÷ÈkëO{£Ýb{ëüƒ/‡Íc ÞCLK†p ²›úrrqµ®é¦K rv¥N btºË‰lŠâ‘w­ t*G–@A)†c˜ÅŸžë£9ê4AÏ(Ñf” †9 UÛ쳇j fÙëLÝz@OÎxÂ4êûáŠh>Ü&šØq©[B4CGÎz©Iýŧ4¸¿(I.±õÞ~¨aïÚÇó.ùo0äcqùj¢#É 6Æ•‡l®„É·Ò2õÚ_Š<ÂÀl#$¼¶é!4Ec{§ü  ¥ò¶…$U êjz@[Ÿ2“rž}ñ—LèNI¶ RDv[ÐõsÊw¥ß@~Ÿ‚޼Vë’²kJªV»{Ì~DV*'¬Te¨<Ê̘§Tæ ‘yb_‚sÎxlBGµtTÏè¨UDGA"Df¡£Ú&ÑZ¿–aUYˆ1ô.PS#Ì„šâœ4Íç¼ìÏÁX“ç6ÀQ­5o@9 `€†(©RR(©!JJæÐ&á†1Qiä©ÊÜT“‹T銺7>0ªô"ÄS¡6ðTe‰ô™`}kÅ ÑÔt’¦¢1¿ a“€_7´¿NP…MŒÎ¼ä§ë(—F2o5%1Sø˜i™c¦(—0Ór‘™*[Øñz²àO²°üš™Ë€Ð|&ñ¿Ï;:‹]í]<”rœ&t÷gæ³Q›‹ !f䆸ֳY:¾ø$Ùt‡`*­ ¶¢^>Ò® /´?L¡ð® ‡ŽÇú¼»Fµãq Ÿ|‡l"Œ¥Îs"QQ"DL‹y Ò¼Ó‡ú§Ú»,h]%ìc÷ù-$cGzãö(Âíµƒßø"&ááXúîò¸KE áûïÿô·(Þ²¦ö€ô¬îƒ-}Yîc1·,Œbù;aã±o͹‰¡Ÿå™Ó ˆNu#ÊBd Î1$I°0&.) †{t}ö´#®k(Â⊌.d)¡“¨Ôæ4K¦~ ›m"›\ÈÁÓ>ø'…©ª¹nÄxï½2Ái*C§7FLF¸~Kk ;XÎñ*ã³G¡ï—2%ÃJÄ{öž/\rå˜AøßÍÞúÙõ´Ðpgyîy¥-*&'?dX„4;¯ÇñN›š¢!>„uSSDù&OàuU”£¥}s3gtºÐ©vð÷¦;¢)bå åâY@8÷žÖ©€šÿ²‚aʨ ³áx½§£Aƒ¸¾@ùŸzêú}>Ç™$迹yœùˆÏà¦+MµòŸpf*ðÌ&7ÂYÒm#éÆç³­{¡OLËÈ9¯p[ð3¼UÆÞ³á2¼ÚW§v¶+=sJn’¾Ñé´ ¨r1Ŭy Î!P+!#£Â(tôú¥ ¯ö€•9»&÷FÑäãÊÕÛÃÇüíŒ%¡Ã®YÊ®)Å¢‚x¶"¾àœ-l48=^ªºðíZ,Í_|AÒüú5_Âk€®è5 +MÖ^=RP‚«¢œRËñðØðlÍèÙ~Þül]‰‚o] ÇÁËBi>¿œ1z¶¶þfÆ&ÏÖPšB!ÖÞÅNr#Ô%' ÕW¾Çer|PÀ»zÂQrþWcžUY|ùI}Í|ïaˆwùxn¤rÌNDÚ&dãÖySG²7ã`(ö€™zž&!€8м nCý,ÔùIè÷º3•®âZ5è6ÜîAwjöH5uIîŸ[ ­ô4¶|’§Ç]Ýn÷î_°¼Ï9k âj¤œ=%.6nëÿÿÕ¤Þœ/õ~ÿ…J[ð‡Y¯°áÿºþ3U{[DiWï}6 Ïg^–çÿ Î…²©¤3¼5[;ºU ¯™¾‚ß<6í)rØ‘ó¶]€É¦dîHБ(ºG׺îr"ÑÌÃ+®­>"oZ’Œmuÿx‰‰Ò0Èi¸ ãQ%aÎ y þ·×ÿ•R”ë endstream endobj 788 0 obj << /Length 2849 /Filter /FlateDecode >> stream xÚ­YmoÛFþž_áó °Ö|'ÕÞ—\š.Ò¸‡:×ÒG‹+‰5Eª|ñKƒü÷{fg–¢ºnp‡ àjwvvÞçÙµwââŸw²pO’ÀW~ä,·Ï\™½yæÉh‚ùˆâWÏÎ_cè¹já.¼“«Õ˜ÅU~òÁy™íf¯¾?ñRå¥þ‰¯¢tÁ+¿¸~ÀKÊ÷ü“ùh©èú²žÍƒ pâofó0Œœ yäºNc±åÕW÷n*úå‡iä:³|öêj9òý'”"ЧµŠÓPyAÈfmÛo5dðR§Û˜Aâ¬ê¾é6<¹„ø~âÔM^TY'”EË„ž"\ç¢ãßàP1E««\ˆÞ¼|kYm·Ù0ÝÕ<›ë_\/¬ôÀô†ØþXì ‰Tì'PÓH½+–7Bv « ,U}=›G±óëÌsÀÝs: jã¨yèÂR^ ¼ˆI0Aä`‡Ÿu„ÎÝ ßΠ½nxÆè ²l·kê]S°A0±ª° AzST9OÕ+þBè˜ßð¯F/ bŽÓrcÅ…ó¯Y8ú×ìØñ¡ë)7 N⚦!yZ›Å‘ó-Õ|D6ÇÌþ±9!ëüá5iP7Û¬«ÅR9ÆâAàª0HÄê’S/šßúÂÁÐ{®“gôõœËË7o?žñÜnȘl äÉ8>6“¤ŠüG‰Jƒà‘±TóÙ„™Ž™q<ð¾ñ,d`÷}é0?MUàcI&f©ž’äˆÙÿî0Hžðçr“­ìM[ÙóÓ/¢ÑOUDO˜ÙR=¡Ü1³±™9§ DVñWßïÊ E¨¨+SrÈ8¦r©·+‡˜¹-³yÖe<**þ"a[IY[ŸÛ/T‹0ïXyn̼¯(»C7p¶íG€8(ë&ÛBæÐ‡¨¯wLèKA©»®Þò ‰G TôJ-ÛèGÓÊÞeV–íTôa¤"Iy»¨Š®ÈÊâwÐÈÅoª$Æ0‘Û=¨4qä;ïô}'GwV%:V„¯§NŸ!…Txhí·ÙþN¯ŠJOî)o/°­ôä‹(z¬ÔG‘r“Ôî!þTú$õ,U·1žŽlýÅ ,Ú]7Yó@?PÓ Ò’¦ûVÃâêÅ”䈃äëä(DµŒ?m×ôË®o´•m,%G°©Ð÷mÊ¢‡a¸€ny±‡ "ÀŸÉj&kÿìˆâagÛ­P¢ï’BÑs¶DÑWç“Yáz¶)–%™&IR‡"‹š»9µeÖeq3³\#>/$F÷<‚Ò:Ûõ܃{Ý“ö‰ïlkc‘$pÖºÒMVR§¾ð°”v#h«l«•‰m´r hLœØp%’épõƒDÅQ0ö߯iÄSq þÙû0RIü‰èX$¾¥‡øR}ã H<ähx\ÆŠj Bßw.Î/ypW•MCàhìT›’À¾*jbSf:@¿Ø³ªáµ)^¡ öúãqy$A»MÑä<Ìš5&¬,NúËóÊ÷“?é/Y7¨Ònê¾”ã,€›r2õÝû·oñXè\¢Ñ.‚Å¡‹ô=§ äQmަ§À¡Jž¢ãq!sHâœF)$¥ åÙ7º6éx[è; v²§;¯ Np€ª3b.vHÛáÚÖƒ–YœÆmŠF%KWïøç݆Áèf"OwYc* uG†:耪€ÒYÙòÊÚq£Û–j UÏi™tÕP!жÃþÌD‚鸻¾Slt$úkÆ>çÃîîBpJ¬bÎöWÄû>ÛîJ“2À™ßðÂOÅ~îjYž_ÝðøoŒxâ;½­+䊲‰tàˆþ#´wqä0¶ÝÍqL̇= @$Ý·{nŠ=JTmªzàTz {H«ñùNï]S˜k(2ž»›¶|ËÁ#' }©øË©……º*…£ž=J.LšË$û‡ûYÔE, ¤ør£23ò¥ëÌmŽûÛœÙRÛ 2±÷=Å-ªÈ®^™e…âl]Ê Â‰gà3-|L­ìN“3êÅmmBÝŠˆ@IÁágë…Ž3xqdL,³ÊæªôQš%vÚ&ß—gL)5ÔÓüࢳ»‘u/Dîº!ýÔŠQAKl¦|%ª£°Vë |šÈ}ʼDÆû~C?“ vµTq1‘™»MÕÂÈh2ÞØöò¢)QyÇMÆ0uSÐݯ£›-|_oª)U.û6CÛ¥[Õö] ÔºÑRê¯)txü"‡âu5ÿy–¢˜,í‹ÌÍ ‹®èJm1Ixå¶üáJ‹QmK¥9E‰ý©cú}gèqõ,‚FåM1 `3jt”…ã¨ôÉQRñ¥/\8ÿ™L¸x¬øë_&ÏòT × çÄ-e… ñ&Ú¥M†bgš ­îo† ( ™éefo©e€z÷¯l…kÍ‹C€SÍùâÀ'ñd߸iùkDð¸»8H»¡Ù.âis„À˜‹ÁUwˆ‰I”åc˜Ž BüÒ|K%:Ù$ZÚëmrø9Ô'~ªÃŒéµør¶#dÞD6 ;Ò¶£Y_É~t¼çBjÊ"Ûz+„‚Ÿ–£×‡82‰QÃx}X0=€è¼gpÄÎ=X•ç×EuN6BU|ºl$öúãÇR.=eìŸK Su‚Ó{ÉãÆA'£ v\åGGO-•’vÏsÆàssÎéôî:|V§vÚ¸ÙLÓÃ,UY…¾wúؓėÞÀ;<Ó>ÇŒ*¶y’ÉZÑ`2ÚW¹±÷õÑvhÒkƒ½äHíõ-¦¬Åò´8ïß]ü[®ÎéÙ\³n£&O@G/8|MB±0F;ïÛQq¶îÒ›¶ëËÞð³æoßÊàtU”Zßêª;å‰k]Öw<¤Ô ï&»µÔ¸ çÚM ;øK÷j*ã4†*pm&À–HÂïi4¢®Hßì6+Êìºv| ÑrBcg2Væ%Fäu^†Ç,»pí¬îSIÄ”S¢² 5f[˜Ê96MQ-Ë>‰E „¢45‘~UúŽŠÆ™e/â6«öy\ªÓµîÚÓãÉ2³ÑSª&&8|6PÉYæš&òw­ Öa,zÝlíîoû¿%±JÓ­5TQšØG\à¬Ô;Y(ŠÚFŸ¬žýSm®ê©J‘UJãC ‹Êê…üŸ¯š×º®Ð̧ÏhÀZZÞXÂÞYîÍ28ñpÿ'F¿ÜRÇ!IµÜ| ;Û £·3$ÿ}äáßùãp”Ç!F÷ŒtÓˆ_]¾æQ]}Íú¾ Ë¦Rêt*hYÀÆø@^ü<µ£Ñk†o`>7¯^Fè_¼ ¤J-Jü›š‘–>îÕþz®Þ#\??ÁUâà§ÈBLÔ|lë¶³ ,ƒz5‡‰ 3P¶]¿â87×÷_Èæ~üa.ªÛúFÛB‚€ÔâGó.;Årc §3ßls|]w¶˜¼äÖaŠE.Óø%V¨uœÙœû/¢sÃZ endstream endobj 794 0 obj << /Length 1189 /Filter /FlateDecode >> stream xÚ•WKoÛ8¾çWI«¢¶`÷°mRd"ÝÖ(°H}`¤±Í$ºåGƒü÷¥Ì¡%Ù²œÀ’&ç›™o†Ã±õ#Öȱ†žk»±¢ôÌÁŸÏÎúê@¿vâ¯ñÙ‡;5%Ž=rFÄOëãØzì}¤‹«Éøo‹„6 ]˵ƒp¤w~:®§·l—¸V¿¶Åd‘ð«¾çy½ÁÍUß÷ƒÞ—íñÀqzó˜($XëÅe.‹)Â9=¾l<ßö¢`ˆ,zVÊCsšÅ è*¤×†rtKÈ$ÂkÉgØ öZµ4îbûŠ×ðN›;°=‡4Ⱦcì†l—VŸë¹€|Á³®‘yÁÓ¶ˆ¤4+hrÓæÝ2òÓ œŠŽß>}ÿ÷»^}¾}ørÿ çzø¡‡[´V_qï7q¼»WàäˆruÀéç˜S•O•Õ˜_ ™€5D…4YDzòRÐ$Ù˜u“½’¼}˜[Æ„mˆQMÉ…`³9†<å…‹yñ”àƒ T«uð¨ Ö¯Ÿ/¨¹ÜÛvK1ª-d‘*Íêæ}­ ~‘@}Ç9Ã=vZó¢Ê¯3°xþÖ ÑãL>\®ºã´y39 öûÍ`îi0Œßù¥‘6J¨å¼…#S_.Möÿ‰µÏy=õUw¨8ÇO?³úß …|nråz? endstream endobj 798 0 obj << /Length 954 /Filter /FlateDecode >> stream xÚ¥VÛnÛ8}÷W(j€:@ÅŠº8òb÷%½bÑ]ÀÀ>¤ÊH”ÍF"U’¶ù÷¥Ì¡,%Š³Ù…Li.œ3sfFØ Í{óÐ;#¥ØËëIo¯'NQz‹ÉÛæˆC4çØ[”}‹Â»œ¾#ÍÙrñ§‡3„³È‹PšÍ­ä{ÅV„"yAOÄô¦gAÇÓÙogA’¤Ó¯{õ4 §¢0Be¥n4•¼}Š’, §8J[—“‹.æ4ŠžÕjt—„Ë`\€—þþº`ì¾ãÊü?”$¯:Çßà’Þ4Ò!«(_é5 (·Ë·ñ2X nôð QÔjn”5Ä%¦~ã†ñÜ#ûò•µûL¶Œƒ¢®ia¥€`¹Ð¬d9ÑLpûF@âôš*€*ÉÎè–r­Þ؇“ÒFHÈ×nMùDc|ÚÃFQ ‘T)VïÎkz ÉgüñŠŠzË(Ä´’¤Y³”w†ÀÝ`¨ÒDjZ (:Â~üh6ºÓ-¨„FA½~íúÑ”*ЊÕMuûØÉÞðÍÐ$CfÄi„æIüŸp&f×à!Neº|ô)㦦Û]X„ßêu7›Ü0QÔÕR‹._¼ ÒUx£ ²#´riF}z÷Å‘§®£“qÓÇ]|]ãÜ)-_4$Œ¥¦7£ÑŽ×øÔÜ06QÜ:rÇ•Áõ¦)ˆ¦ÿb]ôg#dï‹ .ÑW?©+A)E 'VÑQ8]¶*㡵Í!Ê»’“š>¶GÛºU.lßvaÒé·Û¸ínªå­k‘Žf¿»¥ÜÞrØÇãTºpœÜ¸©Ñ%¤Ú¨õ€1å“á²’4§lKU˜rkxw2RøÞ=†&ˆäëáÅßV½ùQû‡½ïÛö³Çw#ä"㇠endstream endobj 802 0 obj << /Length 1085 /Filter /FlateDecode >> stream xÚÛnÛ6ô=_ad{‰)É’‹a œ¡úÒ¹@uh‰²¹H¢GQ¶Ó"ûö^tsÔd0,žûM/øáÅ:X$!A$Æ‹¬º öá;ÈDñn{óæ@ u°Æ‹m1±Íxwô¸üsûÛ§§dAPœ®íÍ—€„ö Lþ芫¶K? CoõvéGQì}0äqx"‡ËÆÞn.ŠÉZŸH”ƇÉJ‹¼Ùl{›cB^qJS<÷ŠŒ½Â`~ºX%€I#kãK`Œ½íY bMC÷î@%£ÊD[æÜu—öÕðêX:TIw¬´ ¤êÀ¤…Õ֎ǽY­ä£'.?™øANpˆpqgØ®U8;gZ;ŒWí:;º›¶qˆÏÎVV²LqQOÉ2qtÆ(vq )* q…^°¯\Î Ú–Ž»½ê¯s^ïG%ú8RÚ*QQÅ3Z–½&²Baà4‚…ªfo!_›z¢’^ÃÝ`¿æ¹:X8Šç8Òìa$uFq!iåd£ÂÖ8FQM©FIG*GæYðöž_ç¥4{ûŠQƒ¬†ç]±B½¢±®Bf‚TÔÚ§×4®t[$»iíÚAÉÖø/É—9 ºžkøù#S­¬±§oC€Äîo(V{þÑšmà'#ÛŸKÅØ‡Î‚p tdR³›ÎŽOïûÚå5×^`»£{·0òFTL ´o]c˜ë«œ*Ú ÉO¬¹n©=Õ‰³ó´Ü6ˆ"c§>>‚öq3´™ü61âi®,œá¿:u®Ÿµ§´ä_©™3lÇV5]:ôu£'Ód~ â€×0¶Yã Õ˜#ïp”¼='h¬ÿs1/DÒóÈÿôÌÙùôÎE¡Šœå×9€ù#;K`¤w9h D¦åÿÿ-Ig ­›sP{Vº9>°Ç}ÏgÖw¬ÉŸkû:ä"gEñRäj!«!Ö!»ÏT-jÖsû“ZO/Lõû²mÓ™ÅꦕlZ¿]Yfl¨rðfÞñb 5-ÚÙAvv¢¸êê¹RüZfZv_Ø%Ølôߋۻ²¯MÉ÷‡çª®Ëö’öôîƒ=mI콯3¤ï»ë¥Kl0I­° l"ÀHRO›ˆ!ça°ÔKTö¯Ù ¨–OÖ^¾ÄÿjáLTÂòp£ŒJ‹o+‹­¦û—EÚhvÒ˜Eºº,øOËìÝi ' ƒg¦Á¿–QB<Çp4xÑ ñ„'°$†%ñ²^7õµ?åÒ†È(5ÄJйÊÑKÄÜÌ1#ÓŒN?…àn.¼Q¬²÷yK UZ>,[Ø3‘ãH{5Í }jŒ«ÁÚšäûŽkç¸yN…¥»}ö?ןi endstream endobj 810 0 obj << /Length 3151 /Filter /FlateDecode >> stream xÚµZIÛȾûWF€°‹ÍÚ¸ŒOÞ$ˆ3ÒÈÅv¶È¶éH¢LJNLJùíy[qSÉk‚šÅWû[¾·Pj•ÀŸZÉ*3:ÖN­6»‰Pÿõ@Ik Ö“?ß<¸~M•ÄER¨ÕÍÝt‰›jõ*zZ®ÞÜüy¥òXåz¥c—Üó:ц»b­ôj=éjާm{µ6ÆDéOWkk]ô‚†»$‰Ú :{î}v¬»=¾i›»$R:Ã%<»Îì´þÂ¥pÄ—o•æ6VÆòwóÓàž0ÅN§˜ ?tÍDzòÃf+›"6‰ñ«î•dÑ]ÛíJn~8 ­åÇrk"Öý±~/ª¦??`žٛé¸È¾–ó¯tÕ[^ªowõ G9áìd»ÃÿÍlö+›™H†íê~''ëëÝ¡«i·5ð7.r·Z++ÇÒõ¬²Q}_oNDz㷖¿Ôí7úØÔÿ~$='îš §èH;{+¡5û+¦¨èXn¡é·:íøyÆX$VuP¶*‹—{©õ °ä¯MâÌSñâª"^l÷o™GÆeq®2á‘ «pÖLdn½Ìs/ó"óÔ|‡Ìí b…dlðÎO`XÎLTQã{*9Z_Ÿ˜à9#TRê­†[lk™ì Þ1'T’ÄIææœT`½ÈH/bæ{¦W00Æ#ß§´‰]ƳÒ8‹ÕÕÚ¥:z‰ æx•š¨$µÎ\pYo…ð§}J²- 3t)VXT õpð+Ú›6í®Üf®§\çyæõ Þ¡ëuUß5û:´AwÎFøhÙªz¿iJÞŒ8ˆ Ô_|ž) Kgý:1É•µp@™»—^´ˆ’øHð0ªãžª.Ú‹h@­·PÒ׉KBÆbcmµ¿ pÚ1£ûKhX h+‚Ô´q¤XøœËìFï¡x’-ñJ<:ºzSßÖL¨Ú¦çáewòÐÖ ‰ þ7VmY¥¯?œ&ƒ•LØ€ÉlÀÕ™=Ö€jÌaá´Á®nº–µŒxëQ Œ{@]n18@£éF‹c vSw~Š<ƒÅžJV:(Q/É.·ê»¥2JAY€·§}u~ùø4ÔÒÜ-8oXð’ÊMÀ³¼«·[&1fa«F%= Pd‰Ù½KÛö1;}_óHÏ÷L¶HÇ-²‰GɆ4ûÍöÔÈ>e÷vªRx§äÜ@X.ïËe”¢€Ñ:·+ç’8Ѓ0ˆÔ9‰Tü¨õdX ZY.ÆNj£‚€DÛ„Û¯ê >ãÓëDÙ}ýæöÑaÔ·;ä)ʸåmŒÂX)Þ&wùQ_¸Ír±©r9@íiŒÀ'O‚/Fä‹äA‹hÌŽŸ'ñ6ZËa&FÛŸnEÐç|8ÉlhDceXD?¡TS[ÅÑˆÐøÜ rnÐ>v0¶ooÉ%B¯ & f5êÊJˆ~ßó@À°ñãZ dÃhù1‡Î/)Rêdù{ðÂÛ Ò4ÀýF‹ƒÂ.\Ë.zø¼mJóútýìæš‡õ×wmË=ëû‡„ßœX;¥ƒ”U³_K‘‚†Q#fíß ­k!)@†N‚‹‹bp2C›º8ÓƒG}~•‘_`@VÛÏ®W€;2%8äþ|‘Ìa½ €/^òøB2{üˆëÄ=[Þ´wË„»ò7ÈerŸÇ`ãâÔfÁësÁƒÑßÀýQg¨AÅñ‹»­ïƒbÑw¤ê r«"sŽYïÉüûe%&3µéBQÒÁª%ÌÉ\l@ÈS›øû¨9˼'=K;˜Ë[ÉRÊnÂ÷!Téà ]Ä6·ß/:5Œß‹:ö5_™^ÊîéñYžöŸ¡áÊztø¿]Ço^ Z»¦Yƒü^˜@9°]×¢`YJe€)ÊJTÛ±‹ad„Ä6š™, Ù ŒàhÇ/Ë H'yœ(N{óË)P>KY™²DŸ­Lu1é¤óÛ©ùÈS¯‘†É=,œûþ"YYðm&µÜ>V]&#Âõ ?àÇ«.¹Š>’èÕÓSlwͧrS¶&À•Øåµ4ÈÚ%jz·@àG}á‚ËÅèÀäÙg„W83ÉíŸDs‹ÿÆ0tÇc§ ê…´(â4WK#Mϧš®|þÉ~ÁÞµêEÌÚ-éHá¥-(`¬°å6Å¡Ð7’¨ÝIjÁ"R¿ÇÓv‡³‚¾Ä™8OÝÜ—ÈJÞÒûëŽ;¨†Ïó ŽõcJ_ÊÎB­Í8ñÐÌ‚» ðŒç÷ËPk(Š ïý"Ôªdd‡ˆ²°v†ëÏî©T¥Òˆ¶;5„?øÞžŽ·qÄp@9?à—§ás[›V‚¸v‹\©¥Œ®ÇðN(Øô\†pL®jŸw˹/׆¤0z1Ïbèþîâ1¯.5"Œu õXS{Wt>¢ä àé«b)¬÷ÑPÏZO†…a±Øÿ¤êœñí^\ßÈeÎaˆJçËËY­cU¸éå°çG}árËÅö/8ެ¸¨{i®{ýí?(˜£’¢]f¹ò¥¿¿òE¹iƒ.$Ä8Õ]š S@=/L‘j'ð”R(ŽÿpbeÂ6gmg³š±©Ój‹š7Ä;qá¾½èkä:š  @ñŸjQm|UÌ$€ki±€ü@Å’)wå¬.‡¤!}{j|ÝÝò8óÑ f¾àuô´kPl:åS/ƒ<è ø®ÜqÈ«/D}*™êÁÔ‡ o̓Ólæ@©²!ÜùÀÞÓO!s¬B§Ó0q<Ç|ip¨ê‡VÖE>+«!Oäâ\ÞA‚gÅBµ$ê×)€†[ˆñë#È 9Œ5ï¡`±¸ÆÄ#<òcqß)›Åa’Íb³o(8`%ªîy Uê/`ü‚dHÖ,\O0…œÐªøú¼aígL±‡w•p¦­øÚ·~ú±Â_ÛR(x1³/,ìaÀŽ)ßPGøÎ .mRguz^š{Ô¸}6I,ùtȳÓÎIM1ha¹iv%: ½PEÇY(PRæ~ŠPaÀPQî™>dè*/ØfÊ9¯g'Õa|£tÐÙPtdÞ4ð‰£IˆoõM‘„^T†ä‡Ox® —þ%Èñ Àµ¯Ú¹Ø&‹oD¹  ­Šm6D¶S% Ö³ÝR°6Ÿ ÖfU™³bR¨†Ü¡’¾ŸÛS·—¶¯(CS‚iÈX?Mc(®¦eYê âÖÌlô »€V`Šx4;Æ¿;6Ïò"  õl|Œ&Ãz6ê³Ë#x9ãrüí5[¬\öýi+ªâüÃñ'_ç)ôøpº\S½Fn¥ Sn!A­d:†ð8ãw/±Póä*·Ñ͹kØ©«!³ïJî¤ì ú†bM#„ªúöÔoi 1W|¸Ètî³õà³}=ˆ“­©$Å!|W繌a—¥.xï,‰íˆúÿï-®U±kõ÷„ÆÊZÉÑu^4u X]zs†°-;ûø=ù fÍqV÷4]=nÞB@Æô0¯f@v,EöÝõ¶ºÞ6·xëϼ”³ûzfˆ¸ñEªí\âOÆŒ”ËÕJó&AfeSþF´=¹u=V4xn@|óhO«‰ ¹í*ß,·wå¢Üql6¥l¿÷ûŸù‡‹Y'a[ž‡>'æÙE§‘bq1ýnŸÁ[2¼f‹ˆ)Ü3©‘`»£ß}Pè„_^åÖ#ø%Ǧã µê°VètàxÒÌNWòY£OnïúµGîyû‰_òløé0XÛ|ÎèyñÃÂrwä·‹àº×Èà‡Z­!w =]ùiò‰¯@}‘¯œ "èm¹}G_aÕât" TceÚ‹Ü(“3Lõ•€“¿ €9þ„ºá åücv‘Î~i‚ïüٌ̦ô„mÚBÞ`ô9þýָ᫊.J‘ñ/W@Šñ jV8[€káBØe],K^¬i ë/2m ywR,o dŒÅ+ì i™&zAÍŠÂxéž|Æ`ú`çtMÞߨFR%C|ͽOeÎã‚r{)uLÜqä96˜Úa•æ¿Á€.… endstream endobj 817 0 obj << /Length 3465 /Filter /FlateDecode >> stream xÚ­ÙŽÜÆñ]_±È×ÐP샗ý`8‚b P¬ òbÙwÈ¥3®xÈ È·§®nÛ#ËA ¬úduUuÝ=ê&ê¦Lnr£cª›c÷"‘Ù½PÒ;À†ÃjÇŸß¿xõèª$.“Rݼ¿_ƒx_ßü½®ozÿ×UĪÐ7:N‹’W>$ÚðR¬•¾9¬–Úi>÷·cL”}{°6¾ýökž©¸yÛ^Nsuj:Ú¨nxúußU—ºyT÷¼ú}Ów·ºˆ>µÍ¯·¥J«#¥ <þÅ›÷ž¾TëßaîxÆ\ߨˆH­p +l¬ŒebòÛCšiG@žЬ €!튜í¹%Œbë=Ûá^ŒÀ„΄Ãà»TG‡šªhl/·:¦[UO /ÑОÛñ‘{ÿæÍmÜÄ€|’DsWñJóô84ãøŸ[œ­äÃZ€ß÷ƒÛ÷!I“ûÍÉwpÊDPó—FiÚ­~§Kû!Qö(€Ú AxlA‰j•‰UÊÄ~ºM³¨:Ÿ{À ¶é2ª¼†»ÕKnï°-J>x†µeôX xˆ4÷óåCb’[kmt\‹KôÃɱÍ5ŸXD$hs;ÉþsÛµSUËHöðÇ鬈'ÊÁ2n_-TÜAÂ\¤é|ša†kfˆÂÑUé2ÚîñÜtÍÑ™*!'ŽÀòh9U—‚_  uF3‚:+7ÔáÞ‘ÀŽäHfý¡çE¨qøˆr6ÈšÈÞ%NÐD|œ‘ðÒFkI+-OÍqFn޼|©¸í‡š¶€¸\šc[ãÅÛ¤”Oá{æÄ@С°µœÆb"q?5È®n»íqèOCÕ­xê°ŒâÉw Æh}×`“Æ´ xØSÅ3,ÈC»`ø QnμÜÏbÔTT“ýñ[SbÆPÙ¸´Ð«l66£Ø ´MrÔ ›ë«Å!].³mÍŶâŒÈ±î\¬þ„Õ {Õðqn‰8¼IÇ:‹ý#.†À!5OÎJ„ŽlñçK{¬Bº¬ ‰ wúyì»ÛQ”ŽþŽÄ±›ÜIàÀ£¹ó€P–yÀºVø0T›‚åwêØ€pj¸lfÑGDÿ,|¨Ä#íâ½b߬JAž«ßšûqê±j/(38UË6F­ÈÈh Å‘ص#Q¹‰Keàtvß}‡Ž!Ÿ“š¸ÈR·“m8žÉ’A¸-’<òÚ8W¼V·§vªB"Œ«tÙʱ%£åIø†o]ë<Îób˦­§·Yân iI,‚Æß>ÎKÿÚ…Ð"™¯¶G£ƒ€äÔÏÒ}óÃû7ÿ±)À§}ÇS#‹¨É‹Xé—Æ?µ¬åä©jÙNB0PƶÌ7Æ[RP‹l«¾`º~!!ˆ†-&¶‚D)pŸöá_?Võ°X”Cn³è»3ú…%=ÛJº06'ÆæÈØœkŠÙ–9Vžõ} ÒÙ}0Çúo²X©ì¹`©Õk©Õ&Ö¥uR{X,*h1G¶ ‡¸çÓå^1ØC¥¹æê7î“=ÁެÅ8ÞJ%Μ›¶â-ËíÑNŽÜr›ÈfNíÀSµÌ kéR‰þ2m–ïìſЮý¿Ü&ò~ÂëaO‘”ÉœóÊ¢¡™À±Vm§¤—8ËV "¯—VÍ…Â<“²„< c;Tü µ¾ŒÜ'÷ϱf¸ÚB!Ós±¾A¸u4þ Ý"Ô[ öþBØöGD‰Óàq(ž<~Õ=…‹–½ˆ[“QTÏ".¶W$¡tªÙhŸ¸[qs‡f—Lo@b‘Ú"Ͷà*V+B¶­‚(”`VÕÊ®ã™>ó²|fèiæ/ϰa Hb ÝÜÇoÍñ¡ª•ÞK-˜Klͬ·ftzåí蕌3¤ .®x瓟šíVe á”WvQ?±Ñ0bl ©X¼ÏåØŠ30`ô.ntIDÕ$ÛYü¡Á¨ÏeÑu¿QU¾«a¤^-:ኸŠi y ÎpÐ]–Kµ Üý厂nqñ;NþagÁòï]9c‡îsæJvÊH/Œ\’âä¿ÍþcÆU–ת-¸´.7ˆAUŒ„„©°q ± ˆÆ¢µˆËÒ¬-0vÅc¨8+¼pþ)˜ ŹÎý‰Ã„£ p×égá ^þ¤#Esƒ6ÊÙ—ÍK/53àÆ±…[Ssy  fG28 âtŒ)ÁÏË]œL¢†W‘iÉ®uG¨AöJ€`±ŸÃ- åã…K{š‘¼^¶ã9À¼Ê”§w|,“…+TCB”˜¼Œë8s_ªo»”9B&Vƒðm¼5b¼1ÊBÅM-ÉìÜX6@•v›w=Ji‹tXŸädíi§ó¸&[¼#À )tT˜K¢7ì«qÿ¸=¡wÓ„°.tœKÁ½¸îPe©%CÅ…–þì Õ‚ †qf¡XLˆeÓÂ#]à]ä霦;û—\˼l7é"†˜M*ƒäÍ)µŒr?øoú‹W„ŽA/pä v´Ïëh­¬»Z] üF ½É·É4dŒ^½ß-ŠÊâ$3Kèr·±M½¼½¦&9¯|dg­Â˜nÒ|&Ë2Îl<÷2’ó€‰û¾ˆ×9ú½}Ýždò¾_ /–ezïÚ–â¤KŒ(2sÉkL·:a>»Ùæ IÀœg &ª?Ð]%øN2‡6˜¡Ñ2µûŠ‘,VÇ–‹ŠiD%KñA¸hî›!#?&›Wê…ÃûÆmN#AùåÔA©ÉM¬SóånãÝ»ïß騨ò³p@v3°ëf%rÖeÎÐ6Í7O ¶`Z »©îR7¤6ÄmâI!7‹@êJº®úWìÃÜ5Oí¹ýM”b0q<á` †±î£áŽÁ>bÿÒLtÌœäˆÅìOC{ìG²3*:þÌØv`@Ý\çîâ·DUËË\$-ùÄÌŸ3w«Š&ž„æ*1«¬7Õͪ ¾løÄÃ=éLn¯è%w™ì_ªýû¤Vyœ§9´iœ•ô ‚@‹«7J·ë°Úx©Ý{þ\{=3ÁçZÈX,ð#Õ•(â Îäò/Oÿw•ü[. ºÕjáÅO/yîqaù©½È†,ÛóÆ–%]ó&ð~ëvýoöÀ\ßÍb—·R¼†ž6(vNm] 5¹^îhá” š ˜@Ê<物KáçêÌ,`ËߟΈPŠÆS ×-ííÝ<55ùk;=ð7Ë[ó¡¿òdô´uzl=ä9øñj×Ѽtð/}åñˆÓÓ§ë•Æwd̺XFë‹8Ýp3µâåew-óÕpšÝ·k [ J™œ‚îªö©'ëg©s]ÕöC[ dg}\x¸þ–´EÝ> 'D±ãXq—˃ÁÒ$¬’MòíeÂü>!Ä­­x8¢ùDOð…%’åéa‰$4²½OP2äøõóìó«µð®ëÛ`†QñÙ€MŒwlß(ASºXé õݽ€¼ÃPBïœ~èÌÍ6eE97Ë7ç¦1ö’ÍûJžUTjZ¿yaRè=½#¯€¶¯DïÃ*ÍÖ“ð†Ç‰ã¦æ\ñÌ,×8wû—m£}YCŠ"ø#HEÒ5„ë™Þù'ܧä‡"(òô+¥—ä8Ý”i!îMÒ0£¶UCöëy€–Jea±ÌÕ¦>úmðŽ £,–}ÿ‡;RKÕ××=”Øa¥Ëa†™ æéñ\]ÂVAq¾Š­ ?ÎAª2+ù%<İÄi¾{çyÂÜ.ëŸät .ž¿±á\{9žg|]ÂLºç9_·áYH½ 2¬Â àYîSš¯ÂÂøŠÆ¥ÒoãL•_"B k¹7:’ŠT¤¥²ë@?6a´ågCÁ4AûèwΫqžì ÿý0¯øæW¬œ€‘mÝò/ yÄÎ,mçø~¦<^—Ë{.Kõeø5_¹Ó>RÕt˜H5_]“éü‚ñBÝn²AF‹ËÛþe9IŠ]o®ÔéȵÄ^Ü_qÛØß‘A×Aêeɵ+NÒH%feÉ…„*7â‚èc–\DÉ×âù¸¯"÷"'\ Š\²öqØÖ©µcáKºúœ“Ð/"ƒ—CÙ²{0Ö[y rÄ}Ìþ‡Cî÷nÐ]ó™ýÑ;âsìâæÿÒ¶‡T endstream endobj 821 0 obj << /Length 1852 /Filter /FlateDecode >> stream xÚÕYKÛ6¾ï¯0z’X)ꕜҴ ZH[ôÐmF¢½j$ÑÑc·É¡¿½3R–l9öhb•Äç|3çA³Ul•«$ä>Ø*¯oÛúá†Ù· ØLF|w{óíðÊ? 2¶ºÝN—¸-V¿{¯ä~ýÇíÏ+–ú,å+îGiF=w©Ë猯6“®²*½Þ„aè%Ï×!"ïõ«7Ï©EÒãMÙì¹S5~ ¯PÔüJײ)tG_…¦Þ×J×kžz¥z\oË÷Ïpû›nG|ç€#N4ð~(bn5§Âg¡ 0‰ÏÖ›(æ Z³™÷€ÿ”yíKÝ ¤IäýÚ©‚Þ~jèù½êÖÌËÛò= ¥¦—ín¨íTj¹Å÷O{ø€5;Äsl°Ë|ÆS’æ-ìÇ£ÌëÔn(ÔI¯\“±F H’ìZC­¾‡ù©§+íú{'5},\×^¶’Þ Õå­zÀùª¥¦¾ÜÓJBOia£°®¯qËh3%È» ÖB/Ÿ‹a¶F›8ò#PΆ…>‹Èvhì¼ÈË!ÍÕÊ èç“vãäX»ÀlÒ26y·ŽxÎK¹d(ñy–Ì67  ÷,‡‡Úr\¡$*%ñT^ÞL䋸 ×qe@M¼£%fÀÛ·¯—AlF™ '¡rYoÊâ ‚óÂÓ¤h:) ý ts–×Íüˆ37ÄZóæƒÝµUÛVm:Ô—š¹ «K˜ùŽfÖª•ËZÈ2?é‘ÈšfÖ×éâë 9•xêΞjÉ8¿ÿ‘)§F³ªvjPBѧ¯EÞŸª·>~g}üEß–¹¾ÞÖ¸Ìùô_ÛùZ$_ÅðKf:J0‹J0±âãpâQpD¡h@®5ïÁRµGuƒÑpø4pc nâö·Zì!øj\H4öä¯?6NÝ)¤VG©È…‹ÁḺac‹:óoKØ\>³æéÜ40’¬tëb+ÕÖe_ŽÇûž[…ó¥pa÷›n«¶AóxüŽj±ß»àŒõb Ü&[–…¹®Ô%Òõ¤€€êntb Ûr†ÝÄk³‡®ú³,ýf¼0Ö«œ¥ŒbÁ’Æ83¡u\jwDÁ©§D¾a™B™’Í@UØ•hrÕÕŸŒ&·n°•Õ<7²šÌtÌp¦n0^ûUC쾞01#eD°ùPõåRÀ<5ˆ ƒáä“„3¸J:½$^tšhXTØç1pxµfäm†+±lu>t—H°ÀËfôú–CÛéÖF®'¬8çÀnÇåZ– ‹æ$XÂ(Ç5.c0Qnýf˪Bã\„å|Çè0º›tçNÛÔµw×ËŒ¾Z,i7—Ý)‘¯Ý²P[ t³þ×~¶aßê^÷Ÿöê:"Ï%0Âm‡~håqhºWm!Û¹Çvƒ ^ÒÕ½›¿—E«›ò³,Óˆ—ŽãÀr}7€Ú±äKLÉ·ØA]&éåÌÎpËê%”›°ä“¶›J>³¨MhR ,­i 3aHÑkNVÔm¡Ðµt q‘ÁIöwþz“beUÞDøi–Î"îŠÿ#G(ĉ¾/óKðxìG"3×¥…R_¤ãˆÇ¶ìIÀS?Gj.&Æ„or—1%@m 6GØ`üäÊzæjmžlaŸŒWø6=õfÉîdiÛr6]0½%9¦Ú¿ò,Mù ÚN] ¹(3ÃéV¡3à2$uY0iàÆží˜ë Ú}aˆ0«rs0±«>›+”ÔpÒ~žx“N¬3Ñņ ón×)¸wÙt[ÝÖòp%1¹ŽˆDè=šHŒàꡉ“Û×#gƒMöZ…ì§ì„ZU÷º]’ªƒL¾vé0À¾—µ½êD½Š“G4ީϯµ'$[¼°Õ}³dÓ8ôC>V%ªëŒgHæ!_ıá(vÌn÷d`\ø\dnÅÅM#?9쉞Rg0†8ƒö2%ìmªxΫhp×L'BÄ™‹ƒï,É‹…8]ð8S7V«®ÖKB†xõ.V¡ifR†,¿í îBêÖM©7¹lkLâ™aXh⹯Áþ`gu endstream endobj 698 0 obj << /Type /ObjStm /N 100 /First 885 /Length 1715 /Filter /FlateDecode >> stream xÚÅYKo7¾ëWð˜Ê%‡ΰäQ§R$°S mƒko£¶”Êrœö×÷›•»^9–w“è`/—ÎûÉ-•]p¥ŠÃ¢ÔìbŠNBpOr)$ìW—RuƒË!c?9&Á3»RûäDt"¡:ø=²ÓjxØÅ ÅÅX~QI …¸˜G@'28V;Ÿ$=,4M8£€‰\¬Ý"ƒC œ¤À8EÅQÇ<©#›cQÀZ‚8ÉøMä(‡PÅ‚Áq Â$ŽŠ!L8^ !X!Óˆdœ5<ÉQ }‰\"hKr†† dÆ‚y"9šÎ œ à¬8ÅØa‰¬.Ó',LQŒS¢@Èи‡,X(xf¯Fô2DžH‰XB(4GCX`2„0F&E\Nb;Ùå »‰& ø)ê2WÛ!—Í2R*™&" ¡°Œàd®ÔYÕqÈÌXàwØÃq4£+v”M5LÕ~ÇIÀ˜ÇlŽ2\2,¨Ñ±ý­Žµ‚gˆÍÕÌ ±¹«žÌ^æŠ JX`[àŸ…ØNUWÛNÁBëDCt%Ã^jŽÊPv1< î†)8†v€ ‡, /Pˆ]*˜ï¤ `Lc炊…ùGÊ5K“fs ¨W£™¼[˜ñȼݴ/敊í8›úC¦­3g…ñ;®*“û÷'ÍËÞµ®y±ÔNšÇ³é¢.ÎŒ%Dãî¤ÙmÏfçóƒö¬‹Énë—öðxÿÑìƒ{,bËJ¯'@1ÇYš:¸:ôOܫ҅ö®k~ûýgì¡éùÉÉë0; ëîßw͘[ÁîÀR«5Â[º5N4/泃½vá^í';®yÙ~X¸OÈÖÊc:ïÉSÊcYiŒyËù W«åë’5·FCò‘tª )Ÿ£üö°}sâÜ“‡i¨<œ¶’SYû2”Á2ÈVd(Ô“¡„¡2”¸úµ­äÁ2ðVd~Q6ì1¤7ÿ=×)ñÌvËé3ÆFŽj3Åì©ÖMÆ:Ó¥l§×‘~Ï)CÔýÛ;³³ö­=h?Tª"eçö13;ßÌš/Bøã‹,\$R0ñEQŸ„vön©lX9;~¸<ùîo–"!C¨DxųqBšŽ uŽš‚ 1$9 EŠ‘ÑJ»i® g*šöè¥îª««"¿ ÁJ© øk…a·¤\^èjg”0³PI½aËU’ªàÙþµ]£‹ /Ãbi–zÓ~v¸žñöŠ+ÁT £d<"µ®Az*¶Æˆ€ãÐT…ñ^l—+˜Ð›œ~æ¾ñꎋh…göÜjÝQPdA?nÑ…îûý=»Êò¸ £°bšùŒ.âŒ%édÐë¶}$žø /“±÷KT±.z¥ؾY®¢8x§Á ÆF2„虌dSimƒx»ÎØH¤é,f$ÿL€áb³oó:7 ÀÄúeóЍñ8²M‚2·^“‰jt¸îòÛdºk{™)ÉyN2ÑÞ>[ËX°LÅ£ סÏÎ5’ •Ímåª&b>¯·¥[; Ñ#2º™8n_X4+CSÚŸ+>âlÛmJ<‹>F´ ³âÊ £”€E‡* }>r+ÚÚRCm d2”³í1iop_¤q(&´Ã_û8ît±!ÞðÃÎQY¯ŽûÐ_‰Ç_¸ØëŽˆQOg)„$CT¥S"'/Í…æî4‡lóGò4J‚ÞÉlØiôè‰Î·SÚŽ»‡š–fn5lð"¸RêÞq|oƒÕØÅ2ù[øB²ÿÜ=ê¶ßuùTn[nšÜü§×°ÜÙj¤iùù^E‹1q2 é+ÈŠg,V *Ñ¥Y7d]H«Ã”°Ç÷ÁÓiŸÞ: §¢Œ<ˆÄ,1qÂ`8Œ×Có©7Áx©àÁ)èig~ô@kJ„Ù–Ž1Ø÷ƒ©tÎÁ¶ó—¸ð0«£„¶èÖœ ” 9ƘŒþzÈNGLy@U§mJíE ÉdÊ'°GÑž"f‘t ÞAÅ8 Z2ãÌ\pJìÃV½úð0a<›´7ð)$ÜßÑÃ)a¡t؈£l\S)@ °¯P’ƒJùA’€8K!¦gΓ¤A–7ˆ<»¶¿k@š5½‰“;ç€È’ãE51)€„)kù®[ò úsÞOÈý¤ãÁóçgçD©uô:¤Œs¡fâü_Q³ëÂÛó„àÎLð­Wa–ˆ)T8fßÍq~ K“ô Ùù-+²”AÌMû:ÄMþ³†·”@kkŠ%ô¹Ç»eÕ­TçÝAƵŠ'`h ¡œ…„HYœHÒ¦°Xá|/ô5u\º)4M—‡j‚+~—ãÂ>£.Zö"4ú`/ŽÅjص´)1§r‡Ë;ÝÕ#}¯}³)™Á)ÃÈb“;u³ô¢¶SrŸo¼8Œ-ÎÔÚé™l¨UBñBXÈRxŽÝ*ejÖ]¦ M÷öaa@}¡$K²»>PMHŒ&3…MS5+ € dL¢fExÿZÝÇ̶k×]^ûº&³~^õ['~$ ×ÉÓB‘§ÀaœBçÞ‘2*ÀXðþ6Ûï}MjÐØcHT D½Ú¦ªÛ r<¢Óšó©Òôoõfã-5r ¬*h¿-SÈÅwùá3]d1”) …¯p`e–œ‡:íY9›> stream xÚ½X[oÝD~ϯð6Å[Ï^ìuy¨ ´•ª"!RZ„k»©Ë±| EBüvfo>>>›ä¤(R²ÞÌÎ|3óÍØ$øAž£„ Êö,±»¿Ÿ]Å(¯$¾=?{ü—<É!8¿Vq^á³â*z{þ*I@Ò€!ssò&¡Ì 4ˆWGÍ4ïú(fŒ…Ù“(æ\„/Ÿ½~bv óçuÓ]ÎÅeݪGVµÙ~Ö·EWõ£yªzsú²îÛˆÊðº©ÿŒb€œÓ¨ëÏžŸ/þ Jï@I!ÑI‹@*9Æ3¡$b‘Ò𱺣kÄRš,g‘<6Ö?ÿå‡Á8 –Àj8À\d$ b4êß5× "bdÅZ–q’æ^ªåÌ •HBÔU#výàÓ9ɨ\ë£w곡ꩺÂ8Ø»½qÞMEÕ£åÚG’T b#@÷gF\òµ8C\Xên}ä?¶2G!xôÐ|S5eÓ£{и ™÷ ‚WQNÔâŸc‰/MvÇ'fwüPhšßMCÑxÓ[ '¦ã\åÅ„¾ñ^Az¸Œ¤pŒmn°}z"¶OÍe¥¡Á·§ƒú"’ k¼«Kt‚CŽs«)Z$IX Mov+{:vC°Þh ³Ø5Ý»¼*†Âg8…/f5k¬Ýdá$ŠÓL8Ž·w 9e d¤(g\Ó•»¹¼OEJ(çÖy£÷K/DHl Qª~’æÊRÎT†%ºVN5FÕ ØŠ¯ñI¦áµj6õÇœM…n>ïÔ/ )ϨÂmÓ}Ï ªxJ G«±½ AúpÕœT¼óôá­2ãEý&aIÄ9ËL`­;ºŒ™1÷¢í‡úC½»zûndYxµÏƒËF§5þp~Ô>±ÉcoYæë Fèó7ªlôÕ´€aÙ†l?Ε²K03¾$•ÞÔSnê$U:IU°Rµ§Âœw}«Š#.»Skªí†U¬c‰¥Ü\íz+[º¡C˜šVö˜MÕ uK| ©=.Ïžú2Y~ébûü1•>ÛùglºÂ_u”ú®iíàã*ð Ï‹5s¦ªð¦4³Bñ^Ê—e‡ªnK25Ë©I,C- ¦¬+!QSõ°7œ\Q+§"ü¾±µýmÑŒfÕtïû¡-l\Å:®Êª?fm¡Ï Î tŸ¼K‡Ú`µµ-UË•qÝnÊ—ºñŽ*o$ûü0þbŠã!<½Œ(Nq2cK9‘ »¡ŽœT¼óÒVÙ •¤éZUÒ]U“}]òÐ5GP$?pÀWKVê¶ÊÖqÛŒ:ŒZzÖUñoŠç 9þímè\ØŠäN*晋ôa^¥˜5pL¦í½Sá¸âTB.CÝöÕ¼«ãaî¼vàd—ç›üÞàDñÝ„ár4U$¥Þ„!ÜíN$©%µo—ø.\OÃ_§†Ë8K3iZ(Ír×6Õ^U›-Û>×[“æˆP¿‘«çÞž÷ï”áGTmwœ]jÕl”†?VKM.íÖo>w¾…RÈ×4S—l­8çÍð`%ü[#r *4[ˆì £Zç‚ΊVóæ`¶§ÂB­!ò’W €u‚ qð'<Í=q*‹¶ŠÏˆ’Idk˜n[>‘¸!gõÕd²¦°ßMÜßRÕ)mÍèwƃždGl)¸ß7]]ýn9Ü·ŸÞú¸‹Qf¸ÓúïÝò™x×à??ØC¬øûò >ÐAŸc|ã˜#¶úS­BYÎÇ=ÜO>ÆÌ#æaf<ÂÖ}íðF(ù¹¯ûv¶¿Ž(Š]ã¥]Æð5çîïY ÈžšýÓD¾—nünp¨£Kø<:±§ ¹pÆäS(­¥V¥}]TE¸ºaP±TÏ‹œ÷ƒ PiéÂ…]³óÝ‹s;ì§Mh†³ñ‚~63 .õÜg¨“æßC˜¿:}‘‘8z±{ÙA܈ò/»\ endstream endobj 856 0 obj << /Length 2102 /Filter /FlateDecode >> stream xÚ­]oÛ6ð½¿ÂØ“ TœH‘úXŸÒ6Ë6´ËÖf{Xڌ̸JmÑ¥¤$ë>~ûŽË#¯ ãM<gôArΦr^ 7ˆë-„ψ:›Jz²ëŽÀÏ<}yüüôèÕÏ¿|ÿëé¼ñ—ÖQKPÚIäè[«det 殺òK•Þj ΰø;Êw«Œ‡ìÙK0tà†`¥ .‹³Vô[9q=äó€¾ÈÁ=äÆzJÚ)V¼ï¹g4Cò0ÐýœÌ)5& u§­Ô¥ì7Ýœ±„á?AMNÓ€#7›JnÛYb ±£dP5V,hYf‹‰6œ±òœ9ÁZ,Tnêr…B‹g„—bªdD(‹†'Mˆ`n…¢ÃF6Ù¨´Q*-¢³eÁ##/äæÇhuT `Hc½ òMByå\ 0N^ ‚ßpŠúQÍÉ ‚ ÖgĆM²rõW_͉rRˆAqÎF R^¨SAhëèi!Ð.à+͇¾;Ì]„ä‰#£€–ÍÖ!…¤E°œ÷\öµÓ£uÅËbÅ÷»GlÌÙú õܺ‹S7ªúV:¥ÁÐEþ±VæFÁYsï¬ð½r*v &Ÿ0aVd$Í‹/ÈžBFàÇšnA£ŸàÚàQ]¼ͳÌI‘²©VB`º("¥e¥ênoT¨ˆ "‡hÄáÊ·]ï”–ˆ©˜†<¬Ì¶îê•ö™U‘5ÁzŽìv[²þèá¤]×¥såŃâ|îãü…uX¸üÝZ"ñ—²ê8Ô_èÛx”UOŽOÿÏ´J9z|ŠÕ“;…ú< k•¬oZÛb­j44êëXXóL=ÁÙ+\<ÁÙSüŒó-=È·¹Í·£ÃPÏ É–b²¥˜láó°d[|J +0˜Ü<@°åfF ç¨ö¯Fß'Ë"ÁçõGØ Å¾K¶K˜qÃðŽ¸¹7¬í‡É(k ¦5nUó¶Z¥ð<œ5°ÆÐÍ] áÝŒ53q˜yÁŒí.>wa]A‡XÑz×óîÙªõ¾`›„H\¿ ¦®ÑGçµR‹}—¨ï +ƒ{鶪”ƒ" &ǯŽP=·>¾TµËx®Á€.Pº¶Â]:AZb:SR@žö2ólÌ•ЦYÀ{2G«$Iž(ÁfÙ‡ª$Í÷ÅÆ>PZFmÙå­úЇn V›ª·r˜Ð©Á•ªN´.ˆ·ä|bñX:*§w!X Þ~(±7Iš,m(®öviñ4¶/ü¬;µYèé©+ìðµÂ ØÿÒÕò³‡HBÊôò.ˆÈè¾ôÕD–BYuPMLkR‘À­në¶«ÍcËpÛ¶óºO F+Š{ð’“|^apVejtwQ ×»@Ú¶n9-¹Q{^4nœÑ¢ Θ;gäEI#o*ÂDqÐï|¤‚&~óØ5é%öñ< ^ Çò,C½[ðTV2î‰B§%ŽÅp%h9ÏÒè×eL]É÷5"ÍÄ‚¥,À«-,áâè½$`Å#´™W£Cb>œyåcµW¶ñ§¤Èëy£nbïP:‰LLÛwñ·¾¸Øíkšu:|ʳÃËÙb>·ÏU´„`Á?ñ°âÚÌå‰ùšm.ØR(Úh+öÑ–%ãh‹)•~6¥Ž ö»nf‚ïý“*gUÛÛû±…—·ý³{Eé> stream xÚ­XmoÛ6þž_á2Vi¢(YR»~ð’¬Èu[ê]“P$ÆSc™®^²ÃöÛwÇ;*²«ÖÎ0ˆÈãñx÷ðÞh1ñáOLRËÀ "1É«#Ÿ©wG‚G.0¸ŽïGßþCá{©ŸŠÉâv(bQL.ãl3½^ü8‰'’`xQ’ÒÊ•HZòLÜÁRÙv+=u¥”Nütê†aä¼8>J”Œ>çåzÙeKUá4t Eäc]eëB74+4­¾Pºš‰s_ª?§®i8BšãN½}Qì9ö ÂØ›MfIè ’=›ôˆ"罺ò¥? ÃÐÉÿ™F¾ïd¨`Š¢UQ 6c ÒÉß¹R5R‚áÆ£ˆ£ÍŒ‰7Ó ¶kÒ1ð€Ül³*óÌ ³Âõ ¨5µZý (3é”M£iG®ñ @VΪñž·Ï]a® \AHODd"*û† >oŸ#  ‘‘Ò‹$ì3¾aŽ-ì"/bË!HVÁ2Êaê%ŽªíœU(ʦÍÖEk)ÆpÇ*[ÛqÁ‹¹®[õÆ Ž+"fô10Øk•mo^¢áÊ|"fLØù ©]Rläw{a…2ñÂ$²í•ñæÉïcRDêÉ4´Lê"„FÑáÊp¯†tèœ~TÕf¥9À¯üÈÏ{».›Qu¥oREo¶‰ñq­“á‰ywC¾2&5墤aLÀ4ë—‚q*Ðå„“·å=ºwÄà ®ÙOq»+žé#½X’˜Øƒ$ ¤Àa»kÕ¨vLEµ@x¾ læì¡¢-”ùæ?¹g':ìÜ&¥-眿ï P†{)Wn²š©êhp?…ä•­tMÓMVÔÖù½Qƒé´]k¥µ¶>ØH>ñüìÕb~¸i5äˆzÍVp ØÔe¥ÊšËŠZ©JQ’àõ‚®‡xÚ4‘Îü1Æ…l\q°qÅÿ`\F¯Êþ*õM[<®U¥MÙÚ Ö… "wAWÞAEöeõ?A1$¦–Ãw ÿîEg¥ó»¯‚ÂáxÑÃÇ”·gκ¶„¶ËV&»ÇdaEZvØ&˜¥¿¦ •nÚ:£š3ãcüÖTÓ(ÕjÕ×½,™»`W¾ˆº}™äÛ{(ª÷Ùnë!âÐä¶0 Q2½Íâ ý°\î€m¬ÙfNnF›(€ËßÎ@ÐürŠkn ŒÏÑ+èCI\–ˆ:ò º¥¡9Ð)@Þ2g¤›²\{ÌÙfÌ""|!Ðp P(l^¸P˵Oƒa{ R!{@WJmÜŽB«\š¦g™—àéƒFê3„1üDôY¯*ÒÔ°)ô¡Ÿ_BØr¹¶1‡ÙÆ…ºðYân´Ï8Úu…ø¡aÎÜÆÊùů¿½þùôåâb~2§ÌvÉÄWó³“ùõáYò¡~×÷DZ@ÅìËfSç˜ñÜÀgãpþŒ(Þ—M¡àrR€ŒÛXÉõy]pU¼ŠfšÔã-G3ÂÈP:…9F |eƒGg«&¯Ë–'\•c­+E4cP²úCG-ˆmpÜNÚ·MîÞÍ lO?fªä*¼Änþ„´hÚBw-;6ô_¾H· $ÓG6A:ð³ØúÙºùš“É¡“­ù=xúæ—‹‡HÑÝ-2ø–¢­¹Ðõ5W‹2/õ]EGÛ©Ù÷àaf¡6 h C/ úžšËS´ÕÅÀ »ô¬AÍj‘ "}¿÷‚¾ ž.¼´÷ß7±ðäÎûæ¥n¹?&\µmM}å&¥^v¦¯ˆ܉®–žî¶Ça»FWqÚ3?¦ãH¬ol¦R8ŸNB›OtàåÙÉ5ç ³Gä›c½Á Ôǯ kÄVCèˆaø–‡26ƒÖá•¢%l‘uýPP|‹QƒL*ÂD´#y FÏz !JŸÜošù$Øú‘÷gMÓU%¹æn""/ƒ7aî‡-\žj—JWFÓÀ9»¥JCf4Ц¤+ lJÜÑ)¤g/E&b[SXÕt+Œ›!kp*ûK/Tª©˜ÂG šÙ³“ÇøTÊ>ÕÕ®ÝÊ÷êм3ÜÂþõrq}pÖé_hQjìšù`*"J- ¬j^±ïVe^ëÆ¶¸Dãú’˜u§l¶„“¾D\ª‘®è‰ËØWþüâ6jÌ›ìø Y–ØT×üKVŸÌÐ+°Mv#?4€Ë€ ÖÛ?„ÝjÞÿåQâ°hx±Îì‹ö”õCWE#DñrFŠh‡ÆÃ›˜j(¬˜a§ö/¸É+ endstream endobj 892 0 obj << /Length 2640 /Filter /FlateDecode >> stream xÚ•koܸñ{~Å~:hшI‰’î>ùâ\"Ù9·(óôJ^+]I=|Izíoï ‡ÔJ²Ö^À%‘Ãá¼_ËWüñU¬b)˜ˆøj[¾ìê¿_pûæ€?‚øùêÅ_W°4HùêêvŒâ*[}ò^éÃúúêo+ž0žˆ•`Q’ÒÎo´Å+´Utý¾^ûRJ/þqí‡aä½yõîGZÑôxWT»^ïò?C/ËiùU]ê*«[úÊjÚ}“×åZ$Þ}‘ÿ±ö9OCáqâõ/^_ üEBï £‹ä,ð‹;YE;‹çOo7W×°Ç-Љ&¢˜©•„ñˆ\|îÛ¤'¢È³¬h»ß×QxºÚv±²Ï/½ÞÓ[MCAkþGÇìV–ߣ|sú*뵈=ZiüÖ®"¨.|ÿj÷ôüf˜0¯ÝØû›|ä5º1VX^¬D¶u‰ºM åáš{_k¶öÈóלÖA6ø2!?oë†òöÅH4÷¶âÙê¬~ ÇÏb¿_GÊÓ{w¦hŒÙ|„®ÍzѨbÏÈ8³W/xÎ.¶ˆ°-°tÐYãHe¤Ñ©eù¤R²PÅ#ãâd\™a䶯Î4¨,GXcH›ï_“§àÆÅÇ7œÖc¤cm—^ýzõñíæÍ5Á¾þ×ß?ÎϱÃËE]¡U¤ÜëKTw ¾ær§KiÚÉ¿š¼mG†P{mù¾/½kЗ0Q!–0^ޱC@puј:)ÆA¼Ñf±À„Œá5rPÖFFm¢ iµK5‹f _!ƒ«§zÆ£*^`O%3öô’&¥ŠRP_pè&³aq¬¿pª?Üz¨²Sjã±ÃSîUVåSMÕÆ‰a¥X ˆ& K©Ð6 †aèm¦î‡‘ô®Ö ÄvË=ü;j±D ËØ+*p­½^Ò"SÒÑ:Øé_1¤›xŸ #@[Cá ñj$ñBë¾°IùD!8e—½ø‚“‘LxG¡ßåûÃÑÏN \©$‰#,_º"aˆÇš/ë&?{"YÂì(sx›ºËÉ­¾ô‹ÞIÆÉyr Xœ r§ôˆ&ß­sôºBwyã|ˆL' O§¡¢-ªú`ò‚1¿X8%¼Dm…Å[ {šöŽÂq  Í]ÞÉ»î;@Ó[]æ–¶Rjql‘û,pL‚®¸‡»¬] !+'†¥ä,”bj/-I%vqQÁÊ— üX±y ²œ¶`¦[fÞÒz»h;\a ;O—QÈŽZ7ùñÖeÑ@~¦Z´•”QzޤÀFuƒ¡¼!–ŠÊ·2‚¤)5•ð Õ]ÊX:'F­Ò¢ÈpÃT‰xb$2éL âXR¤¤÷öy›Ð%šW £nªÚ®ë©wdÒ³ÌûHâTà²JÝ}dÌijÌ)M¼ª.í¥Íôt…Û~YƒÇ<ܯÉtR "k©¦VƒE«•xÅ ° ’ȞȓéÁË@ómuiù™¨ÒV](×$5êKpbú,ó¶Ô-j"þÈkj!xÊÒPžÛ^Ííé–&·õAÑæÛ½…®J·X(Ò« Yš¶ÚÄ¢š¾4áwØÁfê…$ÑÌ2‡¦«ŠÆêƒ»ן¸¬‹*³¯PÍ[©TƒT‚@<[*ˆË1‚ïöaLmÁ¾cÅ¢pþM_ì;pàï.7ï_ûK¦ÆL*1ÊFq¢¼š œ 95üäøA6 ;ÿXQqN\jwt[TÉ‚5â¢1c|Ñûæt <6ËARú±ZhóîË;BૃúÉ*†ÐCl Q¹ݶ6ÜzÁ"ÀhøÄÚñL–·à%ò ŽÃ`Ö|ž,IÔšãúÔÞoÃŒL™âf’nê¾Ê »^Ô8aÃ÷±Ý˜J$zLmb¬o„L@âÞEK°°CRmW\9…ƒ. ..K£¡ú¡>tE]AÏz"£IñTq%MÿFØ-!òe±XÍÄì‚QÛ›yÅP KÂjZi‹]54™´‹U—ÙÓôý %À½yK` uEEÔ·²î1I£flf?k:V¡ q¹ÉýI·i³:xÃê 6æÈ\p{LŠ!°.õ„ÔSÌ!H.b[iqÎT0KÏŸ0â]¿¤RåL±Ãä‘x`(JÃÄ1À$OÈÔAù#°%Ó˜!Ú`ç¤eB¥B³3¼dšê)fÈ‘©™W¢q¦v`²Ï;^¸$<¹d2MY•ÌãÂsPOÐ>Gf…·4Z’Åø`º$ÆÓ%à(?{¼d€ £o/ϘÙ³½³ò©oh¦–wVº8/ÄçÖ-K¤)o,ø(eŒâ,n”ŽŒgÍդ弨žÍ3‚š«Þ¼þðÞ{IÊßœÏýeq_˜ºb`!E`Ù2™/šúöο´«@=µ›Ú}/v³ å@r—å‘K”)hh‡‰Š©¡k©÷wºn µ<+2×ëˆÉdZm¾n "’Ü´,’'“9'mØA ìmh$0)öaC—ÐåCØ~^›¦wËc£É¥ºkŠ›¾³f¯†›1kb”6 Î4°ËrGE§´…òG`Kz†ì±`äA© =»‹Ï ãxÃ$>ƒ³4†ìöÑ(³wTAÇ$c–ðS‰ÏAù#°Åü=Efh³ôØ_`èÇ\À~ypXÓ9Á¶é8·okˆ'†à\9šæþ:-…T-˜HQŸ=‡cU‹ð¼7×ψYö§•0P&F…AäíGõíhÚ ‹F©¶²šö áíaT©[r¹/fg7þ@ºÞc¹¡¸a襥ˆ»ïôñ„BþYE¸=Î~ÛïM{$$ŽŒ÷ TRµÝ÷Ô> o¨½±LN·–v«È¶¾%5ãûÖ¶˜¦û‚øÍMKݵ‰íõn\¥æÔtƒX ÓC!쨬&´v” ¼’E*jªÄ@ðæ>ÐŽü >Qj›Å7‚"dhþ²h,>ÎfÍTýëItÜ$NŸ‰ÎNò£â*‰`ÝŒz_Ó@𤑔¶øHŽ>’5­ý˜qŒŽàžö¸É±pÒÆÎ!¤‹d>¥ý¢IÂùâûbƒiàØDéh5­›}f~H`úE ÖîôM±/°é}VÚŽ\èî ÏÍÙØ«_]³÷êêÏúööÏ®ÞíöùŸöfPdc]…‰¦ÃþÚÆ<è0Áµ XM/p}_쎕‹ý;o«áPÏ•ÌÅöÿ9͉ endstream endobj 909 0 obj << /Length 1836 /Filter /FlateDecode >> stream xÚXQsœ6~ϯ¸GnÆP$ÄéSê¸i;N2Ó¸Î$録MÊF‡§þöîjîp|îÜÒj%­Vß~»:± á'VY¸J"ÈX¬òí‹¥ÿ¼ÜòAÁŸhütõ⇟¡) 3±ººž.qU¬>zçº]¾úm%Ò@¤r%ƒ8ÍhäS(# ¤+2TîúªYûQyÉ˵¯Tì½9¿|IMŸË²¾éõÙbWy…!ñy³ÕuÑXê ¾1Ív-Sï¾4k_ˆLIOD1nÿââj<_,å@#$r%¢ °6© D¤è0I ƒh³öãôŠN¯#á=àÆà99õ¸VŠ,܇ þÀÇzõÖÿõ5ÈO9=N‚ÍÊDL“_kê[ðTœ„îKûï:¡ß]‡_ZûŒ:Ö|R»^grp¢WZÝá±27 ÄÔéLaHPƒî­.t€.cïÏuª<óUº](´ÅAš9¯‚È MO:þDi|ó…œ'¬ùFáZ)ååû“8dÁ½Qç#X w#ïáó‰ZP7㦬u"­Â,HU4µ8ƒÖ'8\Ì! ;ŸÃ ÀÂ+ÊM«l¶„ÁÖo[ÿ¢¡2öTÀM¦œ61¢-×]gnÀI*TžûD^UÚK\@b‚³lûJMg,©é]y±9¨è]¯«­©Q¶3$ku7_Û:­" fœH+…–+:Àæ€ç_¸"pèfÍéÂZ¾ùë¾^DRÓ–*‘ž!¶i×>ÉÔVš%Î~\¦· ¿=qµ}§yéxRå•ì†n mF×,®1O ‘$\XæëHz·Í‰0ù-[ÁÉtaóθk…-e&Üíâ·Ð5Cïºéj“—Å0DN‘†º»ë$0] k楮–ì—*ÂHÂ9œþ¢­A"“A¨IE¡÷ÁÜõ¸Ïßt5¬?ØËöÀu÷@¡nŠÃ ‰³y L¸RÆ`¦uîîÊ[ $U KLÐý#8ñÑ*ª[^¤1<"ã æ‚Ž[±¥ƒÝ{ݯ㧫7L§ÙÖô,•T(ÉL4±±áüH¦ç›/%åS 0ÅP³ß’BÛ57Þjê™oˆÙælé’ â/ÉlážÂr¯USþæõ‡€’Þ°!y´ãÞ`ªó,™Æq.Ã4Ø@vž'L eðz¿#fOwš)šQÀÛ‡.O¢rÛÙ¢i»’™¥D&%3ÇRéKEÄRé„¥hts7嚎ßyEƒ Ö]Ù–¹Þ“§;¯È¢`!=»WŽi¸¥-$· û)>™å˜lB([\ <ÞWÆÏ+UÁ‰Ô²mösNO7—å¶e6d–rDW¸ ºÁÜÂÕó±n+ðÊc[°+< #hãv¯`+ÜÏb€?×o*|ÄoÔ)BÕæ™®+ÌuYséûîýÛ 2îüýÛWï^¿÷?ürqyùò:ö§.Âñ;w²T{ìÒÈÑ·i Ф3j²þ$w0H'$B ‘LCšç_Èd¼k•l´$e+âüþJcàDdýı~D¬OêÃbÒwý¿*•Îr?® ÎZ`Ñœ^% "€ŠoMUQów¿þE­»ÞPcô!uyÎÁ±àI(¹ F(}dÕÕQ&Ü;Ef½MöHe=hùµ¥Êô`±ïT×h°»¢öGƒH‡c9Èv=¾ >Ÿ1+ 'Ü}ê®åÒQ‡‡,ƒL¯$¾·DúHé=hùµ…ÊPBF—ãbdÉX¸¥ÍûÎÚ9yØæKÇáwŒ¦é;×HÌØÈ›úÖU~øè/vf׸ waƒ˜7Pû ã8úgÄ£BG3õЦӺšœ ¡±»=ÈXôÍäýn?‚ÖµR~ßÞlø4_àŒy‘x@C‰‚/lüöX£áù‹–n+m¡ÜpâB9V#.°] œ;: ;uY‹Å0”¨*+¨y1¿„±°ÅY3ÓÑ…•Çà¥Ã.ÛÆî†©ùõ³3•žýw³H¼ÓqöŽ\Ž›,^L®ò‘ )-N]Ö7Ï šý¼1Áž0¿wA*»ÜÑ‘Q6Œ–R* ǘ‰8ƒ²ØòCÙt$è˜T±X—àßI˜á'íyM{ ~®§„'È·3K@§ãèÂØÁ¤¶;T¯c9¼Ž-¼í¬ªôšøR:¤q“â[¦"™ úÀ_L±ÃƒºÞi‹uáe06ÏúùüEæ$NOzÍÃÓ‡>³I7ª &ßþ>aì+Ðzþ·UYçU_ÖCÕ:Ø¥»›ÞÕý‰O¹±,Ålùê~m endstream endobj 924 0 obj << /Length 2252 /Filter /FlateDecode >> stream xÚ•XKoÜ8¾çWôa°P‘"RïÌ^¼^“AìYì"3 ÐÝV¦%uD)3˜Ãþö­b•ÔR·ÚqБÅbu±«(V>üÄ*óWI =‰U^½ò™úû+Á#Ü Ç?î_½ù †Â÷2?«ûÇ©ˆûbõÉ9W»õo÷?¯Dê‰T®¤¥­üêË€–<)äÊ,•]¿mÖnNòví†aä\ž_½%Š¢ÏUYozµÑNC§ÐD>o*U¡YÑÐê¥nªµL¯¥þcí ‘…ÒAŒÿêâ~<_$å7 €GHäJž&` Äiè‰ ¤Ã$žôÂ`íF±t@IáT¨”pŠ~«ÝêžP 0£œšì,…—&É`«È×U3n¹àm3ëG‰¯\PF öÿ¨»¦­Áf2І>¹ªÊú‰'h8ü>ô&g6ÕõjKÃj×Âaze]ù¾ƒš ‘ªÿìt[7ÆG‰Ì¹i:…>óífÞù¯[¿i€Žž÷纂Fa€ÌÈ´mZš¶t‚‚Ww $u†EmŒ¢Ñc_ÿêþƒ%ÿŸÕRq‡Ý—ãð¿ë0±¾ÀÅB“r,¯¶a²–‰ÓlG­íJEŠ n@OîÐ6à@f o_-Îþó“ªTfV;üæ±41Oz»Å!üqŽZ<5o—âCÄÂó“þdùçÌR´œŠaS ‚Љ™pþµNCGV‡ F™—&±”^ꇘ Í.N’dàr'l Pq(Ì*`4{1œzMƒy$2 ¤à_XÓÖOFwîÞM|øß^“QvcðªMY3ˆˆHQf¡çËhû™Gá ¸Ü ÛÂ…±­æ¨áJŸ%ÊØ ¥˜`Gx;Ú¾~:ÒcèÀ„’·×g7ÿ¼uïÞ]\]Dž}¼¼ó<ïåÈrñ§Îû³/ÊlêÆþ¡\\y„äÕyiÓ¦¨fˆe7úK?IÈ:/Y‚2ä€ 9À‹6DÏÑM içÎrŒ4ê4åQAÒwŸ\Á>¹`øËÍûÛ£BhùÈu°ïêˆÈH‡9þ8c¡”í{Y"ì—ž¾àx©´ »wªh'aP–"ÜÇÄ æ6?R+‚þgD´Ô)-†ª;€NÆÍŒÏîmbˆ{XßL®È$ ¯A´(42ÄfÃÉämi=oO° æuSiÕ~éKFß…H#/ˆÃzÜŰó™NPNÐÍb&ïGj—€­fzõàHMYºÖÂ/qL-,ÖþÑ5îŽcáÜÒâPÖG €p6¡ÀƒÁ/ú%HÄ‚_‚ÄŸÜgÈóæaŒoÌÂVêS]lF˜5Èó¥gZ«‹²…ÜjjUñùbv]¼¹#û‘ Q/ùËØ‹¢¨7`#¸Á)l: m×6›VÙ´…™UÀ’­TÝnW``CþÌÔJê÷ Û–Í~_à6éG¿¢°ð`W2Ûû@c°$Ô1jËøNbù„íþiù+ÊËÇŽ‹sM0VðÝ þEŒY¼tCʾ”H¼ ‹NÀ«Hï÷&³”¿ÿMž‚Vw&7êfc¡>v>ÏŽ„z0Ô{âcaG@ˆ"çs‰[( %9n§òª-÷b©ÎÙÒ² ”`Ñà¡d1õ‡ë3ôôù»ûÿ|¸@[§3ø™ýµ»è4JÀ(R”/ø b0ü[ ük9zÕ’™Ÿ  ð¥V¡)ëyÍaõÐ WGÁ²ç@€ú 8µ=:á…Êì0„ÛAàÅ~|\ÙŠ9Æ"%u Û†€´-ì¡õ@S}¸Ó•9%zbý _zºÞP:ï¯<¤1!®WݶÊ[¸8Ï· ™ö„Â1ÍC‹âáb´ù$fNÿñWµé¦±i÷êQÌ$±pZ+Þ4³?,L¨ôU7‹±²8Hñ{Ü‘ u¼hÚÐÇVàðîýå»_>ÐXñò¯÷p÷}@+S„Â"YØ~ƒG¼}k Zeýá1%c¿ûcÃQÑT…«´å1™l˜!F¦|E+!q·Uuó#Hè4,ñà3Ge4ô}(¶eÓé| ü„zÝ~¼¾£iÓÓ÷+D)IñĪ…䱡iY,}Nôav©iõ¦mà0ˆš\~áN†³dLÊ0¼‚ÊJ—¡ÞÛ/ ת .ù39 nÀà ù²nTt=h.O² ›ž`±é^#HB(Æ£øTÓÃ\î„m©é9öLÓƒjÛÀ'Õ?ÍzB‰5þëÌd N„µ~¾õ ¢£Ö'ˆ½Ô dæ~tªõa.w¶ÔúÛK8ä)KË8óìDò‚¥®o)p ì¹öšÐÒ1ç–†;´íž±e¸ô”„Í­Œ“oØràúÆQ…=ÓF1K†& ^ð#7͘Ã7TÃCVÂ9YØÈ¹kÁÙð8Q—=žPHá}5ˆ)Kï5rÉd@<Â'PdßLÀ¥ó¨þ¢AMU7Œl‹bO¢‰d÷Û}ÜLñŸ™®ÞÆ_ê¡›{o¸ÿR½¡d endstream endobj 938 0 obj << /Length 1746 /Filter /FlateDecode >> stream xÚµXéoÔFÿž¿Ââ“WÂÜ>ÒOéh+P YUUC@“µ“lÏb{ÃÑãoï›Ã»¶ã#!ÏÌ›wüÞ9K< ÿˆ—`/bQA¼uy€Ýî‡â¾ z?¯ž<ƒO‚Q‚â­.û,V©wæ/åfq¾úÍ#1"1õ(qbOÞ`Ê좄zAï(o·…ZŒ1?:\œ ÿùòšݑöÏ‹¼ºÚÊ«¬ÔKî§™Ý^ªRV©jì*Uöôy¦Êý›<û´I8õ ‹´øƒãÕÎ>Aé=hŠ[DÔ# a€À!ÆÆ­1¢ˆÇ‹@„Ô%‰ß,ˆ¿–E¦¥|´àK x‡‘ÀYcˆ=ÏO^¿>µF=;Z®N^ qœŽ ½ô"Âò:±,ʬ)*·ŽíN÷Ké 3xm‹6ßùZ¦Î›EÛª¶«ìóFkè®­.AÚ_Ü?¹hT‘µ Y݆V9*P³JI¥›E¾.æ‚t¤F§ã?Ÿƒ‰ Ï£›…ALQÅYèoKó!´iuÖ4Z“ÿc_*{PäÍlŒñO;о"Š"Z ZŸ)]˜ ¢ŽÊ$ŒíZŠÓ#ìôètNíyÕW 0Á½B#Fü\¦îúZ³u’$NÉÐüè?Ù—fö“UpI_0Æÿ­ªÔåå¿ß1îmVì"Ñ5Ü:sKÛ ì¦ a3u‡m¶.lW„…ªô_î«­[¿Á„ÙϬ÷ky‘y+ë')4.;øÂ|›ÝÛ½¨‰æ&[Y\× XÜ·™{‰4ïRuo‹ÓãWï–G¯–ï^ž<=9=y½ß6­†ÒPÙ?ZÀ9uK#!L`ì³ë¡/ìYº»º5óJ%“yØt3†Òjýç±Ð wÙñ±—ð% 1ƒ0ŠL_9;Ç^ ‡€>â‘÷ÉP–ƒäÔm¸ðN^M§;4Ÿ86¬w>Ði•–¢#(î?DpŒQÈ¡`ã×Û„ êPµ3+j¯ÌõcÆâWÛhÕ$ÝS¨É®¶¹õEÖt·?nõÆ[;¥Uë¼#NÝeh¤r Ù–•(]`jÁ4´ú49YëpÞÎêsË÷µje›=š ¸ÀÝp§³¸·Žûª–USÌ࢚ÍðÕ XJ÷PÿK©r¾|–Æ 1Ï|#åT?I狳Ä\ŽmyV|™/#œ%CeœÔy;_J4KJ‘91ÇiÞZ9/ò«ë¶™…QZ½ãré×ÊDuŒ"Hÿ™ou®†)R©Vö§a}2ÝÂ[çнYñ0䎊«måò R«T.«þË òu¸ìÄ5ùU•C«âûŸ3Ú!åþ wa‹ªm<š¼†b·{Çh‰iÉ ƒ"z¸,#ÄÅîw‹•ž-½SHŒ"ª+K†ýè²%¦Ò»›G›Úô»Ïy)'§JàiÆýCá¥löoïA00ýÖÞ)³Ú>ªƒD FÉC—Ÿ„ ý3ñUª6ksÙáBc•Ù\š"Ö§šGE"_ G½nµ àš1ÎöOM&Gmõ–^¤<~ø2H0T3¾»®ïH7CÛ¯YãÔ¡.†åòY^Î-}¨›þf—k endstream endobj 824 0 obj << /Type /ObjStm /N 100 /First 884 /Length 1832 /Filter /FlateDecode >> stream xÚ½YM7½ëWð¸9˜"YdF'†sÙAìÃî>(3½›AdiV£A’¿¯º5Þ‰FΨ㜺Ä~bñ£^Õ#»e )´RCNþ”P²ài(‡F)VÞý~=àÅê?Ãbù-ü ›ý ¨Ýüï‹åÃÍövw1x“NMß—W«o¶¿…÷îN±bÕʸYíðßÐO¸W›Í]½ó…åÈåø~±|{ûÓ~üý÷«Í/‹å7ÛÝå°›úN|y1ˆQÉq 6®[GZbK Ыq‘Þ†åwÛwÛ°|þvóó°^åÓ?ø|Þ{þ×çÿü"ËœÂæv½þð†YbÅÖöpÔZ$ìlÇ%2–¬‡CVˆ ôpÙ,V[WZÿ;]ÿ?†×½¨kÞ–„ݹ¡R‡§sC¦ñz)™ž67ôˆ-zrcÁJ$Ü¢Ç`MˆA:|·»ñw}?þÎpœåHÚL Y3š'_æHTNzžïµ à½9¹r(r[ô:LµDäæ'Ï×csŸog`”Z¬š»8i%*j\W8²ua XÎÒÅ‘ ¯õqé3)ã— x<^e¸Oãû•áwÏå«è¾ ?¯ªÇ|EÁyª4—§LØžQs¥H®P‡ çXÊé ±~}q±ú8ìVóãÉL…š„;ì|sEØœ;ÏpëÛ.ÒgÂ(˜¨§*ÎJ•©vqÌY­‹£f±TéãO1Æ.:/Êp"AIþ ºœËú°¢Õt.CôPÉtªd~R˜É”\9xæŒuI• ¿9zº¤Ý ûëíÅ/3kšñ(î\KÏíz®_ÜnöWëÙ,å¤åÔ“§qœ ¢¦ú·mõ õêƒc}&­Æ”©s)×E¢|µ‹#Céâ2ÔG².® ZùἇÃ1‘1þ;›³T´¯ŽEݵ¯"ùB‹Biã”tç•Ì&íûˆ×õ°Ÿ¹®ê'Ì ñÐFg£nÔ:>éïÕµ‡àÅÕêf¾l!‰ ñéÞ,Qpéo¦Ïpë¼¶'$Ä30à\ô{§G³qð]\öêÂJ‘(Ê]Üxž>îï/UžŒÒ—ßw›¾¦´äwqã3Ͼ²É~Iã·eÆ nš¨¤8¼¦zºØï†ËÝê׹Ы_ 4„ËÈ&J±‘Oú>n/o×ËÝíf>ŸšÐë'…Q05~Žß×ÞQë’åŒäm±.N°o8ìwqL%úêöpTSl­ +€‘õ»ËÐ5~{&ñÎ%[ád+åL²ù%ôH²ÃM—®ãôÜÃ0еaÖZ°ªmdºÌnŸ÷wy½Úÿ<› êR³sú§Å¹‘þÎq¸˜„ùmMü¿ªkòðrø÷Õf˜¯WpØÿ–C:ÞÝU¤úÅ]RÎÿQ¬i}’ÿ›ýj·?NB…ú æ Œ˜§â.Œ²ÄœrW'Y©]\®õ÷å“=øˆb¤ç& š¦dÓuùø iz*6Ï¿Aƒ5Wö¨^)œ;x¢nŸ–¾«ÝlÂôAK~eæ·Tþ•ŽcÍùËøó“5þäÔõ}ñôø˜ÓË™N½N&ÿFyp:®êc·›ùÒ^ŠË öIŠˆŸŸ>s¢8vèü¡G¾”ý¸@¨Ð endstream endobj 952 0 obj << /Length 1566 /Filter /FlateDecode >> stream xÚ•XÛnÜ6}÷W죈T‘ºnZpÇH‘Â@ºo¹ŒÄÝÈ‘È.Nânûíá²o~X‘’s9sfh¶ á­6á*‹xÀ¶*š³ÐÎ~:cöË"ñûöì—ðÉÂ`nØj»›±-Wo¼ qX¿Ûþ±byÀr¾âA’ohåmÈ#Z 8ã+²TõC­×~E^ötíÇqâ]]¼zJ3‚~^Uj?ˆ½lp{¥¤é ÝUêŽF¥¦Õ+©›5ϽÛJ~YûŒmbî±(ÇëÏ.·£} ç?qJ<ð@ÆW, Bpõ@šÇ‹b2& À2¾ö“”{ $ón×|©uļÞ?T~|BUÀ—|êKp6gAÄ¿’PÞJeö|"ûþÖê¨w»`ÙfÑH² ]ù Kèóº—­².xæõkæµ’üÔÉZ•V¢% ­h^vü6„Ã覹Õ>]Å“ “‰áÑÃÛ~±­ j®½º¼þÓùœtyóMvG¥ß-°Ùbðüfèz´9f‚/a€¦”nQÓ·®ß"\dÛý»NÂÐVõRÚUÚÃúV”C¯[„jzv+­¹Kôзö³ov·‰Ú7™ÎõÞ ÜÄ“ÄëÐ}êc<|gä“4ÈY¾4©ŠJâi©×é-œeGöвjåÛ0 ×q{ŽÙ(Rj’!ËÀRšvŽÃ%¸˜ÓZkd7*?̵æq$éÕŽ¨mBMZZ¥ "ÌŸo6à6ƒùËç!ç/ lË&ܪ´Ñ‚ƒ1r¯·<±ÓøMÕW¥~B£ÊÝb¶&-ÓØSF$MHèz~š2é$eâIÊ|­–f HþoF„${© Ù¶bbBìí'ìø¨äN&šÞáa€óf¡¾wZ7'²ûÅùöúõb:»¦l֖σê6¹KÑ‘€±t¨ûêPW…õáÓÅ^~= †ã¨M€U(ö®?tº†xTÚtV²ë¬ÐPãÊ1 TX4ÑÂú&Iã,"â0gÕÕ^8r=zÖ q'dâa–é§jLÍ>Áv%iç‰W¼§¼¡»q¦“7æ+6¥ ˜“ø‹yhŽÀ‘Ûz€,‡ï> stream xÚY[¯ã¶~ß_áG¹ˆñ¢Û¶n“ AšÍ¢/{x$Ú«SKrtÙÝnNúÛ;Ã!eI¦íƒóp¨áp8œù8šm"øc›<Ú¤‚‡V> <ºöQP¡ê§¢mð¹Caùúç3îää„~0=:•Óð¯v—ñh coßr×®¨n±rÑE"á`–9_œ¡« ;Ù@Mi:Fú,Þ*ñ™ ØíêsÄc0¨² Â_{¬“tÔ3“/.=㡎 i£_RÅwºX^d؈‡Y*æªûR¬åº£üZØ­w:f%^ SXdö§w%¸Ú˜OÏ…çyÙ§ ¾ù¯îŸšgå’ø£ðNbsÐÐîaÖ¯ ¹ ¥)Œ{¬ð;¢C¡m¨ó&@˜ßGŠ?qÑ:ˆ'M5œ}ýÀK(NdìcmZ¢U) ª¡èžG.Î2=ôQ¶_ÕÝôi{„‹€ðIbj3 rÔÒö8.í¤ÿù9€E› ÌUè‰ë»±8BäRMë˜÷Ë›‰3ôé7÷ìážW㔽WOH2Oæ…Å=]ørxšC‡4ýHñ¾&DÀ$Ï-Ò¬·Æ½û~¬ÝÏOxËþ~p‹§ endstream endobj 980 0 obj << /Length 2505 /Filter /FlateDecode >> stream xÚYYܸ~÷¯hx_Ô¥HÔí}rlÇØÀWìA°€½Ð-N›Ù–ØÖaòßž:H‰ê‘ǃÅ#²X$‹U_d'»þ’]ïÊTD"Ov‡öAl©Ì èkÜt&|RE‰¸rŠÉc`¤\=ÅGxþëÛw ?`[ü|‰]ne‚¼ŒŠ]%ÎO¾îó"'º¼êÏØÁ Sz5š¾“=Ó§–©°B+˜ž»ÝÿöyÒ„>1'ŠÝ™Q2i¨c/›iÜ'éÏ“x¨C‹€¡ñ ñZl+ pU€“Š:°'!9€Jf2i'%guð^ñ˜=ŒzG:HüZe¹±Aå:©[À!Þx±’•E,üÈ2l05Œú+QõMÙwà5wA°ö èfÚY$Åû«w¿¼~qäýÒéOû•n\¢åT?Ê;%j`Òã4Þ£§”}Ëà¸razkÐ^Ï •GTÕ |^ÞÀUßêN6¨oØÿ b—á z|îˆ;OPŽq’§V†GÅtߢ®u£7„ÒU× ÜEqŊó%Ó¾ÀÂ[Þ@ø,ƒ8î,Ö1f;lõÉ,ò|ÒÙ‚|nñ\Í0Ž/Œõ;¨ËM²˜uVŠÀZÍLtâFiœ®Å¥Y9zøxrkœFØv ‡Ýó4†`Ûn8Ip…{÷b!÷áOà×úæßPÓCv±‡|RŒOáðYNïígêcœd¨SR Ì³¼Ü{‰ºEªºXu†;bЉï™wd:Ë^Z6}&×ÁdFk ÜW-õÀ<ÝݖѺÿ9±9ó* ì"ýq‚Ss8’n íŸCüóMžW 'œð;Œ¥<Æ¿²ÿ2qÀ³‹ùòž˜DPè]-3Ñ.µ…ÿA}™põßY°î@Ù¬b¤òêVÓ½ýÑPà ®l,)m,¡¹ØýLf£.ãŸ!Á«‘p8¦öè.Ü’’L€ÛB‘ˆ«Þ @4ŸFíðSÖ¨ÜQ÷LBC m¥L¸}ÆyAdƒÊªÌ«‹Ê*øV9–VóØs9ÀMO¶GÙîð¼„ÈÓ(XÛ‚õ’Õ`åVcÃf#©ð¦‹Ö Àën´³NK ‡Ý7o^¼äã [Ãä Š4)íq· Ét]H6Ò-ØÌ†`½…)”¤0ú~òB y_èö|R.ÀË%;¡õÝJ§¼Î‚Á´.¯ã\™tÞ k!\4–0sPÖŸ¸?øAk0®8ï3·5©›Ñð^Mz¤¬¬C/G?mËíÊëÍeËfÎlÛ "mžÁ¾yTŠâ®ˆ›‹"î¿Þ½zùÐv¾öíIsô#ìE>¨Ë¨ÂåoåƒÒå,bÈÃÇ{çËNçBÊÓ7¯ž¼~ö†ÃÿÙ*¤ïößrM°Çšó.~ ˜ È}9šÌAyÔ VU)ÐÕ¶nè9åGËËL-÷­BÉQÕp¹¨„8ŽõQ0©u˜FÚz†?s†ÇUG™¸%®§q‚t¶:bÐ×3,å[øUás(¹¿ÈXŸ@°’j%w¨xʨH¡DõÍV6%^û¥¢Ê_q–;žÌ#s]#ˆqÈôú¨»Eô^[ÌäùöüÓ8”m ªÈ¢²Ä %1ÚOÿÑÃ-Õ³iQpˆÌ¶çƒ¢žx™~+;0ÏÓëKÝ›ãð`>õŠ›X((Zá|Í7.œ†¹‰‚<')ø8µ6#¢ Íð3V±`1¤¡¡J,LvÆêN„Cþˆ)Í€‹Ê•¿ŒpƒxíxÒ>ÞBQ¤.L3ŒE‘äz; óƒ—¤X BË0÷"Ð:ûµ¸B.;;¹}˜†S5”+îÁÉ7D¥d *PXúDY˜Ø99;[µT^eŽD_-²ž, qpm7 \Ö¸ùRU­¥Þ’q§”P2‘ÁCBÂbŒæœÜzŸ•L¢Øßµn¢­.â4*ÒÔ¹Ç_¶<ši^;ª[pu«eÅÛ“R‘ì{P¶¼clîBÕµX9¾plH©ë"_ ¸yR¤±•É‹Øó_S ÛÊÙ‡éÜëÖ®døÃ¯†» [ßr˜­&ëÆV¶•WxÀäçÕ˜{emÜr~@û^%¤«³ÙßQÔjI5«ÈÖ]IžGtYôŠHÇ"Ç›%¤ sž× TÓàPc¿ þó[qàï_\xEªr)ÿì °PIásÜÀ ùÓ.{6Ó‰üÖ···yàÊaÜ5«wÒèA[©×±‚_pŠ,ðÖo§»¾ýI¾%œ+WÕ·{û<Ä¡ ÅŠ ËEP/Äf¢žƒšP{¸í¶ƒÐ íC n˜, mÚ.±U=Q–x¹ Ì#±p–¿6fÓƒ’(-KÇä›·€¨r”N‚Uø± —S ×#IêÕ#‰W‡Ø{LRQ\ÖEU†h ÉßA§EHᇒ­3ÆäÊt«ÚlÀYi%ð7ÐÂ]•f’&p³™uf·×½¶¢aˆ]L„”Yæ­‹1áÍFƒ´ŠD–¯ê]–7Ζ'è¢ÞÉ–s¤î[g(¡ü^Žà Ä“œ¹ÇOMiæÌì‚b"ëèð T*Ö´pß"8Öøn0XÊÅS’ffÇã J ³ò΢5TVoù=M2“ý´R´Æ†óð½7ÞŠ#Y¼.÷åÌKŒµÞ ä6ô>Mt®ü¢Š øjèž­6“hÃøÐ<ëÖÝÇÇ7ÓŸš»àšeQ[΋¯%Tþá•£u]$²ºMÐð"æ•5[~&D”f÷8 Áé‡r£›•Åšäg XtÎä¾8»'ºŠ’¸ºxŽõï`il_à Ï]~‡N¿ãX©5–Ó¶Â~c'^Ó&Û±GqTf+;¤¬ÖFEßÓC-¢$›Õ0ÚÐ*ÝObÿ/…Jó endstream endobj 994 0 obj << /Length 3094 /Filter /FlateDecode >> stream xÚ]Û6ò=¿bq«â—(õpÛ6 zhƒ"Ù‡KZ@±™®¶äJv.èÃýö›á õeÚ»)¬èáp8œÎ#n2ø'nÊìÆ*™J#n6û'C{"x´„õã›»'_}C‘¥eVŠ›»SwÛ›·É·ÕaõËÝ?oD‘ŠBÞÈÔ%ͼˤ¢©T y³žLÕÇÓ®]­•R‰ýzµÖÚ$Ï¿ýñk‚Tôù±nîOÕ½ÛãOl¿m÷U³m{úµmiö¹k÷+Y$Ÿj÷ßÕZˆRËDhÛ?yv7œÏHù€ã mÓü&/t*”¦ó|½ÝÀ‹-’ßOާ=}M7ø÷ØlË8½Û¹w™ÊVZëdó¿•ɲ¤ò8h²íé°ã%›]=~¿Z±ö8_°­;W;ðwßžšö0"]­ Þ¬ ¸ÿT4ÝzÚ…J…¡ãlHÆKé‰R¥y.nr Â(4Š€~r"Á€µž Å¤¸ æ7îã²@3IeZ–4~{¨7+i“ß~Y‰ä)ÀÁ[›_q_7lB ©å”²©2Åô +XœAi—z~†CÕñö[w¬v]Ÿ"_}oå È8ƒÅ¸v- -^KZmi13/@O¹LvÕ~¥ªþn+"bä”P›i¦E¸q&ƒUï·Ìþ¾}ù\ˆÒ4E+ ©gÿúù%N{áQh«ÙY = ïöz_áÕ-÷ùй¾¦uṡ¡Zä~­¥ — ­L­CcôS öáÔœÛ0hË,ùo/b¾ƒë·AÈÇj_u! Ó)ΘšZ9À³îÒ¶BK’¹w?RŸ ‹»…ÛúˆRì”W7Þôƒ¿g®©0ÚY¾4–Dàï+è©©75†«µ·A˜ûbôûPí*Ÿx €uía^‡ŽùŒÐ÷§zË(¼¶‹M¿ö‡A f‚xä1Ÿ¿sô³êaâ;ÈyW¡ˆsm18+œ#q ³(£`G-.ÄÞ€µž Åâւؕ؋¶ÌuGb êÛ×?={q÷j¬açu­úÒºö¹Ãž`çR}Óv]ˆ¦m3œ>h(, *£¢__#ú¯Ũ ‘ãÒµVók=±¶v‡¾ ùË:Ñ’·CS$ÑvQ :7Å"‚剙O­iЧ: žäì‡öD_>c(|üy™ï£QÕ¨TeÅÔ÷À¦{ûæöÇ×Ï.úL"†:`.j¯™XnÓ¬ ÕGOF7áfÒ®òõ'~ó = ÚËÿœöˆ“m&å–o@ù,Î÷@¡nôŽdi1jôÍJ@’ŒR‹z`gt çg«x#ðuZ½7]Þú1G™nYNדåƒ"M6o=…¾ÅXÿƒ^Ñ6©ð6t@Ÿ‚¨’î×Û]Ÿh0mÚˆE§—Ò °xÂÑ^ ø\)c:ÕvÚŒ’·ô9ïSç:x•ÚRÎÍÛ]þ&ØdÒuØÕ £XK€Éqz!‚@ÖÛòOxzÏú*¤ÁÆÅîXï™óhÀ¦%^Àޥб|ÑÇÍŽëÝRšœÛ´”‹ëzKo¡2²vxY†ÿd2ö-Û'•Fð9vc‚¨Š2ÙûâÈ祕wéh@ªø£®þN­‹Æ7=ÌB2á ¦ê£dŸW‹… ‘réù°®³¤kÈi8]ôí#ªE™æ±ܸßO5Úäþi¸o‹¦™rÊÖ¡kï›!¥ºÈ ‹É•Ñùån–Î ønHh5x]\è,¬õ-Z¡Ï‰]ë-hžX¸N·iQ.zÈo‰5bOLà‰"Í©!W7Re>!¹Ð³!¤õ+Ö³™“›—Û\Ò‚Wbº}D´ë¡ýÄ®¶mJ/Zì¢`Æ.áeÙEº„àÓdY< ¼€õ÷KbŸ;VàT¯‹/`=ÄÀ‚Ø#ćíB6MH/p‹™i=Dìdœ?yêhQÑC£cÏt~É UxŽÑb± v¥âú§͸â«òân¬7ÒÆ«ÓXõ+û°„þ[ÀíOë¾#|÷ë»Ç—{ßaàøˆ»ÁHÔ|ľBO?q¯ºÙìN5>‡'û•ožp¹|¬´ÛÏ>ZÐj)CõX›á¥ãíQŽPÔQR”Ó?²Ú¿o›–Ùå}†jDePÂ;¯Í Ö2Ï–à–x‰á¨L¾"€È.Ô™|ü¯Qù¦VAÍ1Jañ¥†»™ááŒÀ¡ËY^‘4ÌÕhß«wëhª‚râ×T“§.¤a"Ói‘-:°¡˜™®q¥(}7ÉÑpïö£6;/"€úÄÝ®Ýñ”Ëñ3L œmÔŸJ@ÞRæ½þÒ—¥£Ð.?ªLêâe®1­Áü»\‘¼òo}:„>ßùux•j ÎÝ`8Lƒi78(NüamŸ‡Ä|¬B>Ÿ†G@n·!;}ßñ޼`§u”YÚ¯û@Ö —ïJÅ´0ìMíÿ—@Ý(3Ì_üÉ$uÿjìl~ôE0ÎaaŠ_2¼OÔ‡’ââÑ÷‹’Η¦¹áQ”ìU ôýÊÐLRgß0ÇE}å õEFj±df÷“uá€tƒ©áç}WÁæOé"LΩ.ŠjOÀ ê ·qL-@?tcVˆ¿·FškM)~¼üµ1!¼2䇔¼EîïvtC€ùã©ÚMjD ¹Y`‘€7­ö„6¶"á8¹ÅþñÔæÉ7mÃ$‡§yÇ~‡…áÖ$|Ÿ¦™ zË?†Ìàÿ"Mg€ endstream endobj 1004 0 obj << /Length 2154 /Filter /FlateDecode >> stream xÚ­XKÜ6¾ûWôQ L+"Eµ$çÇ1²ð®d‹38jNœ–4ÖÃqgûÖKÕ-{<À¢Éb±ž_[m"ø©MmÒX‡:Q›¢zÉêïÏ”|í€`çQ|wýì›àSEaåjs}糸>lÞ/ìÃöæú_•…*Ó&YÎ;¿F:æ­P+½Ùy[e?œší.Žã }¾Ý“¯^¼~Î+–‡×e}ìÑU85ÁÁñò‹¦²õ¡éxvhx÷•kª­Î‚¥ûc»S*7:PFãõÏ^^Oú%Z?b¤xÄʤá~³ÏL¨bÃú®¶WÛNãà‡ ©Qš¤ÓIF²ë$éºÿn“( lCÔ:pBPvýo¼S¥í˜Ü1“VN?œlÝtKŽEÓöãvKG&ÍDzj„Ç|ev.ƒ«ôåì8É4íAVÞnq uw®}h«V9) -3²($#fŽª Ó ™ø¾@|úšÊ&y0’Vtk†µP&L“h9?ÙËk5qël$ÄX)&„ѹxÆ£‡0W«·ê$Ü+5rƒjõÞ<Œ’Ä¿íÝ-/KNômYˆ$5{ «ÊB MÀ@&]šæÍ›W¯YÖÙ'Ÿ±Ôà9ÝO–¢ð_8ÎCÇ S !G[cÀÉ#ºá}Hxo!ÐFœi¥nxU òQÚ÷:9ÝTe_Ö˜4ò‰ôVQ¦€~Jö’|±Fè9 •ˆCšb ×¼ gÇ8u´Éˆ ³2ÁÈÒKr”×((„m뎶ž.ewâç˜Ù³ðäÎn-œ‹¶$#)[ÁXw(¸ÒÜ"ï\/ JHAf§Ô>ÌÒ¯­ÃÄÕ¾~å©Àˆ(çT½mÝ‚("9½¶ ™½³µ;ÙoÅSÐ!DÐ!,µõq¯0 ÅrLо=€®B-©Êî#”®ÞòN3ª©˜‘?Zkö^­Ñs­Ù=Øþþ ‡è¿¢ˆ-~w¶5ÊŸ²ü0Ø”%TÄ$gYßËE,Œ·CWÐ!è=l+Ç=óurv l¶W:¯Ã*žª„‚j50?ƒIt²×õ$B¢öÁšÞbS—OaëC†)˜°KaÍö¬Y’IÔœš–wZ6I »ÒSÉi×uÂôn¨×°gºëÅØo,òJÃsp,¦j%éÁ ÞM’Ã&‰6æPÃåŠGŠ}ÚâØòެ;Þhž¯…N£0N•©®¸—X½¢Ï"`žç#—³ øï¥Ùf%ïìyW¬R*^£U˜hj{a‘6½Îx¤ÚydkÝñ3º¹s«~ÂörLiÓ·ëw“Ò7WÒUN}­=–5䃤¸J.ú{Ä0Î2_“•¤zD“sf³y/°C§Âñ¢UGøÀxšß¿‰@Ê6in1%üþfìX …aþd€¦æS•íƒ`£Ì–+;Ùû‹>0RçÏ÷¸F–­ÔÖ©–â"% ž-ÛõpÀƒÍjM_B˜ÐPiPf [~”OÛu’í¥·-½r¿]…ÕEñÄ…Syë¨,î ' ibfBÕ–ô$ÕTð:þ€öÚέÃç½ô®½e4;QCg$ð ]w·XÄWéˆÒȰòËíì:>ür€F /Ä+nGª¹kpLay8«å°Â(œŽ—ýù$à%n ¶ÃUýüò¤— ,AÝZh«ôŽÀF19Ž¢÷ ~ 7­‰¢ØœÈm^ÄÀtzN;½‹p.QرCt -·~bgÄŒ\}κ£:Ê­w…Ð~/Ý]Jè—­kòäüP²8¹y¢4!ÿWò’r ¡^Û“Ïÿ=YAhÃ8A³0ÝÇâÀ¶9ÖÜøa ¯¸xD¢]ßüaÛÓú€Dó xþ7dk•'ŸxÀ¬)ëFÄ:Ï·ÓE®†:ûÉüØ]Èêf×çPÜfbͤ?0éóÌÇ¥Ú‡%0Çiþd?u ûØo¤øÐœ<Ç$*nLa”–¯Nú3ëBº5}©'¨«…؈X)•ù° 3_Èó;l¡§gU%­ÆF ™-0Cçj™Ú@.õAzÖ¸Ïyr&·üËÖZG[=©)7gUÕ‹›¯mÏ—Áöÿª´ÿ^ nl´ï˜ ©/ASSXYDô)»qaWõˆ«=Ãtëü¼5R¯aÝûRž [nõ• tþñ{ ²4Ãÿ±b¤P[›¾¬-¯ö­½µ§{Ùéøp¡æw~^V0d:'.apK–q(#µ—P`ÇK˜òƒ;7’¬ð±ÙFEc²ææ,Yód™¬@àvnÆÀÎÍ”¨9¿Õàä+Л‘š³s³ŸW-=Lj{xê@OÈêàúº:šP ÝÄg‰ªö‹XAŠYmF}ð«#£r±åe†ž‹þØ›"Sa?ö¢˜ˆ¾ðž`š¯xM¤‰¤ó‰B?Ñw]ù—[W)_<*rªÔSeíI!4_TeÉh~NàeÿÔw{´ endstream endobj 1012 0 obj << /Length 2278 /Filter /FlateDecode >> stream xÚ•YYoÛH~ϯÐ#„ ûà5o^Çd1I±óh“´CEjxÄgfûÖE‰”äĆȮó«jJ­Bø©U®£©U¾y õgJÞ|XàÏVüëòÙ‹ë ƒ,ÌÔêòzÎâ²X}ðÎÝvýéò?+•*Õ+DiÆ3Cmx*ÐJ¯üÙT5Œu»ö1^òËÚ·6ò^ÿú S?~­š›ÑÝ”Z¯(™|Þn\S´=Š–g_•íf­SïkUÞ­}¥2«=eéøg—;ý"­b\qdD¯” B0X Nm Œee’@I´ö£X{¤•öÚ?ü²ÉÛÍÖõ½ßW÷% –ÔsK‚©U$‰™Ì…u{¼“ôüðµìüëÎ} M¸Žtäåÿ£‡ý;w?ü¼íÖÊJžÙ¸lèo»ö[µqä<Øjò ¬(ª~pÍP~A”È»ð|”ñrçÙí{^tåÐv ¸Mg¡·uÝçu†žÛ”C‡~BêØ;ò™N3o‹„¤V›I3ÝQˆ"ÄÞWtìL}k-©gàF0;…šMŒW2ÓI9I¶E³ms;°2l²™òn]SÖô®)è–ïTêdfÛ• +Jö¥švòq%jƒÃö c»ë<‡7£ÄK$z ]dc3I¯½’y »Ùj&@&(^LÔoàåŠh'Ý*Òt›j 5Ž”xèJ’G4x¤v 0›†…L‹ˆøºívçbµÂŽ×»kØìz”dp2BÏ©Ð{'›½ìx kÔÅš¥Bs3ùýbã$´Q+ o˜00÷eÏëØDÈÕóüd™¡åŽÂQö;ÌŸwAt W ·qe iͯäöhr»QÉ$¯ÝL1q›ÇX6±Éd"QZ’ۢå`Å"w abnZG:{WT¸2•è©4ñÞO)Œ ¯ª‘á©ÈÚ¡ï×5(êê¶+…à† Ñÿ»NílÖ4 ™º¶©î ø ;q³ C~ Ål2-Øg$ÒÒÊÌ08>Äà®Ì!â ‚a÷¦}¸‡±·½Bg¾~ù‰¥úÀøñHy¹N $tÓ׎Ђ£];¸¼j¡ÊãpTJVòëuÛmd….qëû·–ýPÞÊl[ÁòɃæ´{«®<Zÿ´O¯)\SHˆ’R»° 0eûåì _¿$ûyâ˜O%ã SW}“s 8ð y埀q²¯ É’&Œ—2 UhÇÙ*0KWq§ÓÔSm¯ H~˜Ìðüd¡!¬hd[Ùoݾà±Ù#9/À™c^WÅ âÀƒ]ýÓÞ[<.Kë 81Ø`F\ú£@ÇÙ6pÅà6Whïý܆'7-wS…°ƒª.oìò‚P[2c)Nÿ9 ²´פ¶ï¹/̨1|dËÈhVƒ–PÙÉGÐK̼+%OHŽnÌ®íàzØñ ?²áñ º™ÐSÞà[%ÈZu`Ò=ÊÂÌ׊µ¨LòDm®v&Š‚0ŒLᨫ=öâÒ ød/ «3ÒZS «¾IeÇÍ»fs”¼gÞmOPÇ£ž8ÞbµßLÞ¹:ž>x P'‡@ ö”¾[ÃÈuÅ Ú@õÐÞ᎟õ4YޤÁߢ ýcœ~¿‡kI¶Ù}¶¡}8〠Ë1—WCesWÈ.ê‚à‰}ÇéŽ<$Iص®cêÞMK¸~³ç‰¡L´„b„ÆP,¦Ç¢L1òi¾Œ7Ùh™»;8Ô–áPÛ”ah…HÅøÂUËVHÇ à(ûeÅï‰î„/ã=’fxÏDÚü€)ý‘ ÕéôÌÐÓ2,ÇvË0\‚i !ÐŬÊ(Èpõ`Š›eŠsAíÕ¾e†=õ`¼ Í\m‡*ߌÈ$ØJ“$‹Œ%g)ƒ‡ÚeKéŠn¦šU˦1fÄ‹³ÄáÍY€{A /Ë R~~Ä€}éê,YÕ2¹«¡ ÝHÐï?ÅZ=ÃÚ”±T¹) ¬¼–àñû]±p÷7#é?Œ«çgoü©$|çÇï¯ß¾|÷;OSk…_jÎÞ\¼?ã÷ øåŸÇ÷ÌoØJ…€'J[O»KºæófSý/P hƒ)¦­%Æ éƒq§àtƒ6c7ËmW•…£ïÝÿÁU{ó¨+u„ñteÇ3ëîÎh%HŽqJtº/C\7Á)é4HáÄ(ÐÙ‘—èc(‹ïç³÷ïü¸Æ"‚/:äçƒNðg'M½(ÇßÈ×g¼áãG‹ryÅW2R¼»¼Ú8=ñe€é’©°E">SwŽ…*„'6.ôù[1ðY]^ö'.Uãj(éxÃ|RS’ÍöÝ?éþ83E9U2°ƒ:@>'¥sôþ~Îë‘5ÖsLeñŒWWÍÇsår¦§;˵ÜBleéc÷¼*Ÿó… ®Õ³ÈL·sâßʽ ‚´”ŽPÒ|·Q$ØW¿±sbƒ,‚ 9¸ “NÏ9ª„TÕãþøçSjDÎBß¿r=EòSÚC2í>ŒƒDÇOø•o³@éƒ8%×"/’ê\|¿‚<£Ü—†*üÐÉ1Ø6;0¦˜=ø¯Àhd±Y¥ «Á¿àHššý[0­ñw‹Nüc²dĽty²ñÁ¿CÐJî+{Å)“ñðIü¿Ý·”p¥‘‚£¬=úÇCipùN¼SÿxЊj0gBòÓ1ÿó¨Þ endstream endobj 1021 0 obj << /Length 2433 /Filter /FlateDecode >> stream xÚ•ÙnÜÈñÝ_1O'0öÁk,àHŠáÅZ6 -ÖÇÊÅiKtxŒy8Bòí©êªæ3T< ±»ºººë®j‰M?b“…›DÉ@FbSÔÏB†þó™à‘þ ãï7ÏþòŠ0ÈÂLln¾ÌIÜì6Ÿ¼‹|¿½½ùe#Ò@¤r#ƒ(ÍhåP*Z ¤¶TcÕn}¥”—ü´õµŽ¼—¿þDœ>¿–Íý˜ß›§ÚÛ_´uÞìÚžf»–V_š¶ÞÊÔû^šm}!2-=¡5ÿìêfâ/’ò@Œ $r#T‚Xqª¡41“2HÅÖbéÕpKáu[áÝÛ‘—ø7$$¥œË„-e Bé…µéî ì²[,‹/Þ¾xGb ag–8³„6|¶p r]]_¼z„Ÿ·Ð¯U €‚܈ˆ6¼6}QÈey(k™Ä^^ÝuÞ°È»¼LGwP"PB«æ~( Gh‰ïóUõy«陦(ùt€óˆ?(Ú³ÏwÿÙFaèåíœX´J ïÂ=dÄ¬Šƒ€ó}wÚ¡‘ áñg°dÉšê®­y½Aêƒéij¾ýÈ÷e¯ÖîAÓ]éŸ^ µ€±«Ä{UuÙD…[­µW¸S"ôð8¸ÔD:'ðPîáêþ¤ôgµá‹’;”MQ/ÒÔgëkǾ×äDçXÊíeØûœ®°Å-}\&èA‚›ÄÙÌc${ ò,½Ý¹þÑîèWïß¾tKʧl>J‚xað—å÷Ø ÔhŽªtƒ…ìIö€ŠZp#Æ'1´Ý=‘‰Lçôäé±|;3´ÓBë`ýÐ>!åLaÌRNfBVNÈy°©:;Ù-¡‚¢®ò©Ta•?¸É±¼ìßÝÖÚU±Á–Nð°b?ØÝÊMÑžbå¨ýyUãs©ƒÃ FÞë¶0¼ ý&§CS1¤ÎËÞ]äKÛÕ«ž‰ˆßFsœS„FYèTIcÊ]šeÂñgH+™uIÈÞ¾7«!Ó&h74þ„zº}NƲ?Dû²ÙRˆ¸PÙñÍey#Tó»¯dD‡õƒÛcé¯Y« ™âILÐd®M^¿½‘+ï«)†3M–·ÙV0¯.‰÷ë7¯¯ÎˆK_ØHÚ•wcIÑz¬éÛ´¶ÄØ’# ÓχœI“Þ|ORœV± Ÿˆàrªéíµ,Œ÷¾ºäñ›;Õú i#Txz˜Ìž°H ÄE¾+‹²mrÌi:‹ðòöûG(t“W8‰=̯d>`ôužtA§–* èMãhŽýDùŸb!m|4õ¾jŸ¯)Oièh _ÚÕÀ!15i‡ä¯‚`0EìŸ)õ«8 âD-• GüMþ¼v D}uˆ(.IÇ‘÷ŒG‡GZWZ¤6èmPcîmÝÐö=˨š'bØ\ØB©¬jWòÆLcí},áÔÃôÓïvíöööüp’Vè5½-xZ;T àš\û{ EaUþÛ¥Žh±áÚ¿,A =:eE»‘Û‡ü®¬ÊÁ* ÑØ¢:š!ÆÎmÃëãïówwš¤”Š- PJ²(øš~?Ëj ¼öwó;!¨Ÿå˜NlQË%Õì‚8[R Ùê…{É,Ðéä£÷ݸßF P¤¦*10aF[h¡ø ¨àà,¸'Â}ÿî“$õ.Pù޲êâ+xYÅãÎØð§©§´šúL<Ã9ŒC~`º‚·!d^±½ -/V4_#׃ÿB´Ï·]Öî\šèXx¢ÔRå~¬hÏêÇ»ƒ#«D\Þc$!/¦p 0S>¶>è­y˜@Ê¿¤Á„sl¼öWŒka$˜yÀ*0bhhJXRç¤ÞŒ4`á@0@8† lŠ£œA`7¥L@?R6A5­Xîa¾6Ìó/ÀïZ/4°“º7‚é;5ôKö¹à®;~H8œL´hï9Àa艒©Ú…Iêâ•]i0vßÈ®#á%Ð ÷(‹H$?&º!¹%’+˜Šk…ã([tÛežŒ2¥ß¥ b?Úʧ €éÊL{¼±°ÑÖÆ~`¸•3Ðæz¢µcdsl¯¸x2ŽCÊzûo£­Êqh›¡ÚÇr§ƒOT‰öÞ?'Ðþ2æGúؾ6Yz&ª"μ+G#Z„>$Ñ“&ìâ¼é;Ö8€Mt)‚H'çvÞ ”kƒ…‚f…#™¥žÀ-qvM3Î:•¦ø=ñe.m«J…–‡KïdT›ZÑ%0½ÚP%!ÓÇòøeª8­×”5¾¦@ö:z(ºrª>zÆmæ Œ†‚¬ã’£3ßËmóàRYQîœ3B¡ –yU“döÐ2IãÛBz®Ü÷¥}ú ¬Y‚\ ‘2u-Î%JA®"Buήœw`]‚óóÍw\x€rí«IlÀ‡cwdäÂE&±èVç%‡Ua†Ï}jÊ1G…ÊÓøÑŽK:Í×ȼpÙ%»£'1 ÂÈ"ùYö_ÑúRÓ³›±Ïfîm—*›¤mÕAðÉÉ ÈôfUDa b½4ׂ)ñƒ#dã(zòJ1š¨@FS©ÂååS-ÃÔ˜¬v8qeSSñáiJ)ÏSõÒŽ«OQ ÅDëãÿ¦5G†Á<S˜)ÉäO±­2·ó÷3/˶§|ßFXµ®iêt© çOå@î©0‘Â{E&!c[ÇØ òKŽöÏn4 ˆ6#Y²ð[éY‹5”X­ÈhQ¢/¹­]$lYþ÷àèDì]´ì†¼[IYø`lzü‡:ÿj,ªrWæMÎ…Û"V66fëÚzˆBļò~µy‹W%2:ó*ô¥9*à ° v®Y}DÒ®‘ÌN VIèÍš­È0 ¢xÖ-‡¦xàHÔ¼ijÞ\ײfQ’d*’Yõ®³ïôĪ„ÿä¨CØ-ÞKña|’¥H20 }p™ÅóØ.;bíÐÉäJ(ŸsùŸX8û‚XR eív»2ÒÕ,ø+—¿ÈŒ]2ä³ÃÀ½Æý£êæv endstream endobj 1029 0 obj << /Length 2304 /Filter /FlateDecode >> stream xÚÝYmã¶þ~¿ÂåöĈ¤^Ó¦@rNƒ ’½¢Ý~Ú»\™çScI>ÉÚ.R´¿½3œ¡-Ùò®/Z Xì’9/>3ÔÊE?rQD‹L+¡¹(ëWS~%¹C8âøæîÕ„®ŒDrq÷a¼ÅÝzq¼1»åû»ï22W %’¼ ™w‘Ò4%”T‹p4Uí‡m» µÖAöå2Œã$øîÍ_ÅPóCÕl³±5ã`m‰ü¦­M³n{­[šýζõRåÁceÿ¾ ¥,bÈ8Añ¯¾½;Ø—(õ‚ãÌ™ZH-"p{ Íc!uLÆdB‰<]†Iª‚[¬–2ËvÛv(¨Æ«Xd2ö^J¢Û³“…_ÿx³â•×'™H!h"½óïa…ŠÝø‹#Ü߬ÞéO’úO Ú<ÄÄ+j46èü§[`•´ü‘ø;j6Ô<М¡Ñ˜EOXbÇâÅè‘4ã…5vÚýJ­ôX¤×JŸ)ޱÛÈkNÅô\E©¤Wñ¹içÜô`L|Ûï€)lY½‹d\"µ!ÎCó.ÒÑm*ÿµL¢(0íkœË³ÛV¥Y3'¯<1¨ÝEŠ3Øn_•–xnÃuUÛ¦¬ÚÆly³vb,ÇȧÁlÉk»·]]5ì/Ó³´¶³=s´Üi0žƒ¿Ù½§°¼åUL+Ûº¥^l2ØCäwÆ]JØØ *"›kÛ™9 ]À£Ÿ1øéØ›õM!`[â•QQ2ògÀƒh*¿ã†ÑPSëœ 2ã±a }ÕïmmNÅA ^îÖ¶5û™Ð"Ósò_âüG„ ÔQÓ}W•-ÛÍÊSÜÓ•ÈçnPWâ=-±Ä}4 ‰qyÐÛOJû‰DA”ðĈ—ꯣ\h)pç—›§ª·Ý»-E îâÄ0Ö-B"QzzÀèÙG4ñ 81€¾±vw›j r@$ÇIá}ŒQ…SG3q„“5uKº2(-)f‰¼æöÜ–ÅYð–·éè× RО –u çô+˜‹Tð§%"ÕýAO‚§·UcMW4";ÌvlÂÖÝœilßêî̓ÓËn™°3÷>´]cKÛÑÈ0vÀ`Z ñD)ã$?¸ÈHuÐÖÕ¾Z;ÐÉdÐqÿ8tx\q$êÔÛ§]À¤ˆýPWk^ìòrÊ—"] GuÙÚ¡©HJ×· p~K»•”ÇçÜ=J‡EØt2Å:t¶pUW"ÝØÝHÁü Ž´¶ÿ7øƒÇà:Þâàfrrܸ¯S‘Ü£ÑE„Qo‡9Ãz°yïöqZt†BáòbÄas:œ°b^+`ÂÇðÚ¸ð†iv­²î/Ñ0À×_:fÀøw°Ä‰ÇÈŠÔÆÁ¶m6L‚Î !T'q`«'ºR¶ –I«ð°¾§9N)ù]ä“‹üYˆ=«@êGðÃf|o­Ÿ©š î0OØ£øH "¼ÝE®åµ_0¿YÚ2r¨s–‹°¸è–Ö²>šê§P©ˆâ“öÄ á݂Čë²HdP$_©tY1¼°ÍZ …Ï´–ëy¨‘)`Ç9ÚäÑ&ÜØýg"Ž[âô8@·®­Ã›Õg€ÈŸY/§{ÍsQL·áŠ:k&Œ2 < ñ°áöð°s‹Ñ¹ºúa9 $sÑLß™u7R¢pT/θUÊDHûD…u2ÔÈvÎgq"r™yN.VPfò{†‡Š`ðTTª`™_ÿûÙc™:Hà`ç Z´7<^ï~NF‘ìñ˜“Qžã7¤ù¾¨ð°C~=êX$E6J`_͉Ž#¡•|Ѽü²y|¦/Ù(Ué:Öȉ$||f)#-êï6>GZ$ù4áž³ƒOYÎp}ÝPfJ¤§5Ëÿ'öþ è½âÆeè½æëǽÅeè퟇Þdz{½ÿ•‚øÚ•ô†›ç‘9RcÙL›€5` Jå à·§OŽ'¾>×`öÑw9ÄÓ7:ã/+:ƒ‚ß¿Ñy| rëèüöE(po̧‹û©lŒ,Wn÷š’ך-pæ’ TÑ­1ÐÝò€ÞÝ}K# ï𧱪滘f"KŸyÅÑñÓŒ!­·•ŠøÁqà/0†[T›¾ÌÄîÕˆÍe/ç©ÐQú¢[²‰[ðKiz¬o#_ßF‘ÐDãås;þ>Í$oÂà½QÀuÖSd*Ý‚pÓ ‡/øÙìä XôUšžÜÜ}¡À¸6‚r$42''éc&ô§ ©´ä«Òê$Yàc†'æó.žæ äeðT€±RŸ™/pKÌ*Q'ù·]hàÈEªã+îuëázEíiÞˆ}ÞÐ>o@ù…aô¿©Ùñ¿’ÿÂsœ endstream endobj 1037 0 obj << /Length 2091 /Filter /FlateDecode >> stream xÚ•YYoÜ8~ϯh쓈´"%êÈ[6ð»ðŒÄ‹™A’˜–â(Ó’™Læ·o]l‰Ù±aÀ"‹WÕW'Ùjßڕñ.Ot¤ÚÚ'±Pÿx¢¤„p5ã_×Oþùohª8*ãRí®?¬·¸®vo‚övÿîú¿;UDªÐ;™¢ä‘·±Nx(ÒJïÂÕP3ÍÇ~&IäÏöaššàå‹ËgL±ü¹lº›ÙÞÔ-vÓ ª™ü¢omWõ#÷ªžG_Ö}»×Eð¥©ÿ܇J•©TšáñO.®Oò­Îø\ïTÅ i¤’”…É# èìC“é .Uðgh÷*86u‡ ‚z @¬‹4u0™¸«a Í'©:ÛÖ,×›—W?]\¿úÏów0OÉvžBLe»øS'• bX˜`nùÛõ{_¡ž)î4h"ý{ä?øTO2~#€’Ó\õ44üÐrheCB­ËHeHJüüc“í(×¹›áŽÔ@DZ0ƒº·Nɲ([¶øñ! m{è —ÌÑõ-ɱ “´™æ>ž nW´5c Âkn-wÆúóŒLþÎ u‡FÐ^ñ{°ƒ=LõPx~$\.e" ›'o ”ƒDq¶Hä”ÃgÝËɧKpFãì…w!N•YqŠýLÄ®;’[±1áÇUp»Á¤–·±JömœÄû4MƒÃß{Ç•E¼yÆ6b`8pCоÃÈpÂÕÕËˈ›¯ë-Øb_K?Â-Î ‡HAÎëÛf½>…cbr $¢³è,¹£ˆ³`˜ZCŽŸ•m¤y‚–%kF‰¶r2Ò†på‰q§ã鲦Cû­é˜Ct<¿ÊH`~hˆ?dêÔZqŽÝOt ©Ž õ×fœš°IâŒôÉë×à ź8· ã(‰϶<¸LT–@I™e¤œ¡”=ÙXG bæe\¼æCÝ|EëÃYǹmº~ì¥ûy–ÆÅþ°;¶rsn-†-܈vwA=ðÈ5(ÇZ Ñ ‡ÎãDa¯10ÿ”ÈÅ7di«ƒ±K¡fÔ_ëöö(DJb…`6‚t™J‚‹ã[T5ÑGæ·j­Ìëüy‡¾ ™qŸéiè‹VYÒ¶ÐYFî ]dLgàûˆDû=Oéú¡µGn¼ØèG^°²eÙñÐK´–þILð € 1iã…}ìZРęֺ%JgeÝ" °DIQ_Ÿ¤¸þÌã¼14DM<aCÒÓ·q»‰ÄÒð(Ó9‰,g´²²÷Y“šœ“/žHGHKnð‹Ó»Î£Ü˜U½¡üzã€G[ö¾‚ÃøÇÁÒ‚óŠãÅóŸ.^=¾ÜHcÌÈYö߯ Å”Ãï 9ŸŒkFlôn r‚„uh…SÚűʹ‹³*Y¼‘vÏ@M Rœ4±áóFV±b+á [+Þ°ëO$¬‚§ÊÄÂÔë ·£Wwé"ñæÆAs»éÌW¦x¹!7„¤qÎÚNŸy•§Úˆ•¾©ï$ñ2'ŒdN¶†¨gåÖVÃÊÍ “x ŒÐvÛöU‘Ɇùë3óçJtú~Œý×. &Þ4ÕC,^ÀªÇÅK)«&~>Y9: Q€oS¡1¾Þ@$ÖoÐedÂí`òžÇIæÈgl7~À±Ueù‡ð—3Û¶n*áªÙÌ–1×f:®0×(Þ©ÔçúËR_0c²ÃM=Q.+ƒë=ذ¥DðÞ¯bÚ§è˜9ÉËzÿ6,h°-Á¥¤•=ÑzH3¸íG˳4)óÈ‘·ÿcS6Ì-,;);ƒ_öDíáXqXPG‰0Í’à9šs· 7 Ý Dœ[LŽØ­,otb‰è/^xÌ‘Gá'G~äJ¢Ô™W`N© m/ 3ú»¥%íPÜh…D¹õ8ÕŸ„h%Û12¶s-çXmëxd2G0Ø¢ù*­oüéܹÍP \ƃ Ç6SºÓÊ A¤’¯†ÅÓ%ðQ 2ñ#–ÕPIÿõˆøpZrÇü·GD ¾‘C* ²Pege/R¨ð§ÖÁ5z7—ÓNægƒlI‰Øá”˜SJL\JÄ6‰ü!7ÑĤQž—ËU4”k±Ð=èï¿Ý‘72½ySMb—1b³Èq ’™ë[)Ò×·R—éõ(í}RœÏûÊÓHŒ¥£È( {"º¼¬î¹–Á \Uu¡ïȵ ̳,ôÙÿNì²2ÊŒ[Åc–ÛªæŠD¿¦ i^Maüš',VD‚«Ì5õ앯 CNSx-¨$þpY⃄»ŸŒ`p}s5àDT}án\2bÓwüÌUØx\™“žIpXüb \wUŒÁÉVâÌY1–œ3°”*I ž¿v¿„ïõ¼ó¥¿+¿¯R?^ î)lÄÆôˆ°žROŽLŸçt5êqñévëÉ­€b0]=¨Å·C#¯–ß×Uiðüòý5òãÆA ³)P}º›\ë<’S,Ù†ŠÿH—鲆‘ý™^~½~ ”?ÃÔ{Qn^µ Ý&Z©ŠÌL§­ Pü),Œô2cðÉà0KN‘‚±?È?ô˜¹{ºu&xAç§ÇÄ®9nGI™Ÿ»¾—ñüÎ75§'$rËuÜ™…»ÔÝNK•¥öÝYŽØRþÇ÷Ø­&öv9(2SýñLV<»ªýÚÁvÒ¨œë³ v³4Ym%ö{{ü(TfU~;ø?~ Uü endstream endobj 946 0 obj << /Type /ObjStm /N 100 /First 915 /Length 1734 /Filter /FlateDecode >> stream xÚÅXÏo[7¾ë¯àq÷`Šœ_äAv‹ìe(’Ú9(ökkı¼–´ýë÷J.ÛñS¥¸=oõ‘CÎ g¾y.%•äR’Z<4ÕŠ'†ªâ©5þråÄìxJâ¦xj’Zñ´$Z®-‰Ç{OÊ5U÷¤-Þ=pÒJ2w<g êôág„gOµôØ€§J…nX…‰“c™*±à°§8Uë˜Õ0Ò Ê1Z½b_ŠMTóD„m8¶@äºh #ÌqüHbº`T ½ÃÆAÀ ïPÑ*,×1½i˜Þ¼,¼õD1âÀxŬÖÇ!q6¦PÑ1ÂëôÄ2¦{b c80†åÝ ¬Œ7‡©Ø«,KH¡À„áá9/!\V$ …ϼC§9þ"L¯¥pÆ>!•pT îˆAÂZÍ|A0–ôWÂÖÒeÌÄ[Ç^!…kià±nس,¤%b¥8º†CJå¤ÔÇXQŒ $õ$M*Ø$ƒQ§!ôkI•Æ"Rx³$“1Ë5 µXS;œÅp‘z©˜¥šEWü†Ã$+„…RF†œÄhHp”ñ0 ÀÆ#™ C0'ƒ9CÂzb†CÀ¦%Œ‚ûaÚÇ*XÏúX:6ÛáKkS± G ž™8¹õº¸ q.£áª,ž=[,¿M¯À’^¤å÷?üÿ¦[\~¸¸x³øê«ÏaŒ-‡3æpZKVlr'ì¹">Á=__Þ¤gÏÒò9î²nñÏa_Ù‰ðÕ[—¢ “—ß]¯O_N7éuZ~÷íó´|5ýz“þX÷ÕoWþXý<-–ÿ‚Žéòfƒ\A1}±|1mÖ®O§ÍHcè¿ÓÙùê›õ¯éu "¡9½šÕ5æâoqOë¼IÀÌĸes8Õšáñy\‘,ÍgqHˆ9òÊ޵g#›Å‘X&鳸Ú4 ÷À°84¬ß ܨ? ˯//×Xêõ¨9±—¨9Û§oŸ¶Ýcœí;íž¼¿}—ÝûnܶG¾s„¡o±|ùáíÍxÿÏùå»Åò›õõÙt½Ýky:…%j«¹# Q&¤ æ–‘µw°öõ0ïË´ü÷úÕ:Á1ÿx1ý4ဧç«Í?ìëfóÜ#Qît#9dÖcº¯§ÕÙqJk£‘]¬x.HžÌ%3 ¢UÏî*ýålº˜n¦ãôJáõÂÝ¢`ÁؽåÚøi­WÑ`Ñ(<.™áln¸ÂDO«Œ'³ÙʹSFÑ}Tùñî1ÉŠ ºÕ:ÌüˆFøö§óËéx+Šrè'ô‚'X›õétŠi#ëC<ÇåÁAAüp¡>ÄÓÅÕѧ$ë9h+1,¶y¦.O¤°JË „sF.”;_í‚8jêÜ\­N?±kÔÛƒÒÜÁ¨Sv±YØtæY¡V›Ï¯WÑ{·¦?Xã>æ;×»£©O/÷ê]ë‡RŸæó¦?cU2Z¬YœRÉÁ÷çpHS9úÏ¿‘qºÜ3»Ó¡4£íhF·Ýóö}G;úŽvøî/»çŽ~x;šV8.-X ú“LÚ­!Œ–$W³/ïÕùé»# ´죨é‚ä/ȇÑjªÔŒ†þA­ÈÅ.¿DžRTž(ìhô‘#[t¤(îWÍtó¿#J- Xý­V1B†ÑGµ‚Ä_s‘JR²Ó¶¸’ùa…«÷oÏVÇW8k‚¾5ÈŸL!5ô-èÍwZ%ïªý1$à Ÿ~¶Z‡eÑx|…]kÐÁø$†[I3QßKadQçùÌ}ch EyÇùƒ|GhZµþß j)÷R÷ø^uXîŸËb;ãkÙÑÍݶ×4V f“Ñë¨y+ü9GŸ\¬Wg'W«›_¾L«$¤†‘·Ÿ Á?“¡Öëw'h>Öï¯V›ÍÉæü÷»ln|Xœ‹º{ Sɦó¸øDUæq×ë<°"›þÕ_-j©t?(k9<(ýØXDýÍñ=c ZQ¯ …÷ÓõÏÓÉÛÕfZ]Ý‹Z÷ˆC@Š2êÕæ"„žr ¢žuHµfâ6¬(Öú_RÛùwBÊ÷ ©¦ºSµßñ’–§>º_/[ÖçÖ÷jJ‡}wàñ@9d¥eg™ªè ®³@Ÿnû¬ÈÖ‚h‰ÂYÒ®Q=î8$pE©ó8Fo >¬Þr;Ü[œÛ}‹³nq¶=Œyh´0æ~Êîó@.žYlm*9ïcRyzšùe=Zz endstream endobj 1045 0 obj << /Length 2222 /Filter /FlateDecode >> stream xÚµkoã¸ñûþ ”Ñ•*R¤[ôÃu/»Øâ9܇ÝàÊLNËr$k/—Ûö·w†3’%›Ž E"‡Ãy?h±ˆáO,Šx‘%2’Z,ÊúUÌ«÷¯ÏB'¹yõÇw0qTÄ…XÜÜNQܬÿÞšíòŸ7]ˆ<¹\ÈHçí|ŒeB[‘rN¶ª]¿n–a’$Aöf*¥ƒ÷o¿{C+††ïªÍ]oîlŸ*XYZ~ÛÔf³j:úZ5´ûÞ6õRæÁ—Êþº …(” „ÊðúWW7#ZÊ3@ˆ# dr!’(°Ò\E"QÄLɨH—¡Ne°iÚÚ¬«'³«š Þâ“Sñ|e ©éx~Ʊõþêúûð÷ÄÛïÖ”¿|Ý4ûÕ¬×_ï­Ý.Eðo8*ø†™‚t¥‹èƒŠ¾ùÜw;3® :Ѐù'ñe_þg©ã80,L{k–/iä3j~&ÕÔG'xG+I$‘…d &˜®ß¶U͸wpèøš¼×‡,™ (Ùs$Œ×€j¸DfªÇa¥ëˆ°²2+ÞF±à^ó í"ø &„c×·¦ÝãCÔPv–Wv³”Y°ká\C3úR̪eú»[ë%iÐoªs9'+Î*GOU¸mmYuf`¤Î\€×§`^@Â8‚áô À:ዤ€(¤çáØ–)ß8ÂiæB7OgJÇ…Øcuá§íÐñüL_¸à”ÕcÈÄ/Kð·hO47m̹í|ŠpÑUÈÀ”M‹t(‘p6ÂÅŽÆ©%îñšÃi¶³A£s"m¼º* SìµpÂA¥€|Sø’:RB”õ˜Òª}aƒk+Kúh£>˜½±"ár”F|Y¢VۊɶÕêÜ=aÁT4ôY6ÌJ–aºŽ×!Ó¿´ÐqEã™°U3µsÇE]Iá$$c—ö;—*}… B8Ãølň\e"òjЮóJÝÁ±ÆcV õ 39âÂ`Çà鄇+'2¼»¢zªqQ¤4Ÿªu‹¥S[H•¼ÖÙë®.4¢ÝUk†§’Кíº*MK˾í9)øÒY—:P1ŒY¹é½>¡#Èç\¦E²¯¤c²Â ï 9Mt  "°m7©úO¸ÛƒßÔ4m¦¦­c*œvö)ÆÉÒ÷O :¤ŒPºFªÐÜ”°Æ'ÔÎ)ºálž`ôå¶h(M½uÚ>¸áKÕí³B¨âC2…½ë«–=‹ÍiÉGÝMuY”é1‰ŸrF—êÇÅ®=ï=C™è(O3˜°˜v ÙÐî.î;wÄÃÕß~øñÝ$·uåå4IÀðôÀb>ÏéŸ@´ÖkÉy¤’³øtT$b€j-&HÔ‰Ì2W+àÈd7¼¼4ú‹Ö,Š÷ž¸©¼$2÷汯ÍdîlНӓëÐÄp$ÚfHÞ0-±‘rOnR°…¥óLüûÈÌ9£Zõ¬rªÎ 0´ÒGôáƒd+ôKƒô5ÓÜè³8P{Áì¥+8Äé”sŸÆRI5Þ¹;Û øý+Ñ*ʱ9ò¯œü«i/t¯A¹ q*ÿgž¦€@9U¬­Ì¡‡I'®¦ œó› ”HXqžÃ..l3¶<ãT*Z)^j:.Ñú‰Oá'•ro:J’éàâÞt =sÜdØáäb.õ©}R=ãó2x¡ì]ï&O…¹bÚoœ–=t䢸ÐO“T¾ØO¥ô7«PP¨|fmÒK˜È&%Å>V |Â'ZR"=%á*o6$ï©øEqBü"."%ôeä¤rœú“´-泂Eºjüáœô(6¶U¹LDpÿ\„˜¼nø=?j__ÿøíOÿ‰³¯®¿§Çß$xOÃÏ@èë ?ÐâÏ8ÐðøîÃå!æ[¬IœÅäôtP:]Ã6äÑ–ýÎ À\ºc 4}Xƒ×9¸ÀÞqí:`\2 AE%ÿ-®øxçÞK×ÖóH}\f£4ËuEµ&"é·Ãï N;Ÿ¨àÛ<[W­­vY§núÎÒƒ Q?óŠ=ªî"yÿ_¡Ô©º­ù­ØqŒÔ@£lÁ]s¬SG?B=P·ä^ &ðÙ!¼ûiÄÝUêØzÊXÓÞõõTúBݼù%ÕŽÊñ9¦ƒÞ*Í5öV–€öÌÅ âcVǪ›:­cEBÛõ悟~mÚõê”Äã1ÅŒ”M 9eøèÀMû þyÿ€öà:nE½Ív|ðHØÙõí ÈKñ ÞÒx,¸4ÑŽ6Üukn†&ï3O‘ÇQ¬Æ̱ÄC‹Ê ÷*&ïÁ‚í6 P€Ñ&ì^ÑIøÓÚ“m endstream endobj 1053 0 obj << /Length 1852 /Filter /FlateDecode >> stream xÚµXÝoœFÏ_qœÔ#ì²À‘ªibG®š¦j¬HU“JØØëàç¦éÇßÞ™Yî°‚*K^Ø™Ïß 'Vü‰U­²X†2«¢zñîÇG‚Ÿ6À°q|ùèñ9<Š(Ì£\¬.?ŒE\–«ß‚gúvýîò‡•؆b+W2L¶9QÞF2&R(…\mF$ÛïwÍzÇq=Yo”J‚Ï~|B;š–m}µ×W¦ÂW”†¶Ÿ5•®Ë¦£·²!ê ÓTk¹ î¬ùc½"W2j‹×?:»ìK¤üŠãÔrì%¡\¥[ŠX‘=·­­loï ^xì±$ ÓD‹8 ñw¶ëM†ª8r–©XØ&4mij]ꎩ ­þ ´²¡ºßë—Q#¡o™§ÐóßʱºB/9¿ufg pT`›z ’¼›ÚûYßFq´VJÅ¿ë$ŠÍ¡#}‹¦mÍ>dË“±åp•³}fÿÅÙ«—Ïïóè츾£;lÉáç;Lõ5Ùzr·æ.fë_,¸Ry·rhC{ãËÜÆÛ(‰,±˜¶COš‚ý”Œý„¼>NGÖV[÷$N%h >LCH*6ï×›$ nL߀b™áoúr+£ªUY˜¶·…!ï”üÆ{Ÿ(×=ÍÞ4-gÎîj_}E3Ÿ g UÓ­éz}¬Œ^¨Œ^¨ÍùBm>èSÇèe±øyá…®´­¯¹,ou«‡šÃå ŽbD<¿E|dO °{·Ðo.¾®§ƒvG\ŠúuÉungçœå\|jOí1±}Ξ43)&~?»Xâøhì,%Z”!0£!jÆB<ÈÆŽd9,Aæsߚʖº(šÖ!¯ë(¯ç5p]»¤ÞbRã­•‡‰Œ'À°(ÏÙçÿ{p¹R}ÄÇu2 ‘Oº—N<"gSÂ|Ð ‚óL[û7g÷¿4Œ”­) #–="qK»;Û‡¦­ôqk Ks­ï Ì`È?"Þ×½:´lz«ÜõQh®ýúDnÍ$YÛL;ÛÐMLçñÌp«+r ˆà¦¤øHO‘GaA¼µÅǹ@Ë4LÔ‹‡º©2¶™hAóÖì}Qæ¥ØÚ)ÞÏݧ’p+ÎâCäyJÂ<&ÒOèÔ;`áè!ò¼ãBëí •Ú/÷DtàÁÝKºÅ€¸q öK[™º;:ä‰nË&ìv£§ÜÍ73½¹âü1(DùÔ S0§$4ÕÒÐ:QOwtâH·î“*8Û¦»I«óãI V¹|«H¤¦e:½ðɾµN¸+AÛÍ&'Ö¬÷|@kÍN#ðÂÂÜžÒíGõ×ÝêÃ(Ä %ª¶%¿“š ^o0Dõðê€Ö{ãíïõZ¿ÓveZ=g͵4D7É4 ‘m0u2³!Ût¶…ê΃§usóI¦à¡n*ƒóaºyÛˆƒ+h;t3>|1mÃ×°¾}«ën3g“ƒ6F„˜¿¸¡6»žç…£ÉA>=ƇNŸ>¹8fШ÷z´˜i42ÏC[\èÏ^½úåùë__ÏAB*ÂD$Hx|ž¸Äa„-Û–‚ÖdÐcâPålrÊPDÎÀñm Ÿ:7€œ°B®Ø÷;3Tà8…Jľ‹%‚#ô‡h`úÓt×Í»Ñd}Ú!'!8ëŠfw#”ëÖJ$³DP#ЧÔÉ+ÏÛúÃ5•¥HÓPª¥M—„ÙŽ¤i’5úHà[‹ý Ó4$žùæ-@Mg?è/ÌÛ°nŸöa\‹4ƒØÊ©õ˜ŸöÎHê_wŒ.à+¡lÆ· àª!‰·ºlGåžç£A‘8þtç\-C‘f2 ^{ut ÑÐÑa R Là’¶ÖÌAKgÐ0€²ü¥ êv Ï] L‚I:»°Ì'0¥‹K_9N_1Mß5<ë‡%®R¿¥7ð1íŠó/Êß–çïEí@Ž«-C"=äªÜÚÑm]ìöÍL‹øqøÜG È®G†m7ãÃ6Œ7ûá wJÖlšÜ¸)H,Üq‡Ù27Q¡„‚šüüâ¿9øç$@³·íxŠõq¡¡u@þñañ—!ƒÒƒY|ÏNˆþ½à£ßìa¤¼x¾<øOoöo<°»f3™“éo>€_4u¸ 1I0ÖáÐm4DÅ'©ï2¬áW½5ûxÆ[Ý?Ðaxâ~Ÿ1ü§Xzù›ÀÜÖ^ÙúMá|½û¿`ºŒ’Û„»›õ*’Ýpë‘Kq ñZx1Ì^Œ~íÃKJ&Ú~Ö|¯«æŽú:€¼gÁºC:E wøc\œDa–Æ÷–s<-ç+_fq"Â> stream xÚ•Ë’ÛÈíî¯PåDU™ ûÁ×Þœ±³•”o9“”S¶=R¦×ÉáÃ3ÞJí·h€©‘f´¥C‹h4€Æ-V1üĪˆW™’‘LÄj³3ôÛ+ÁÿB@g¹~õç¿Â_GE\ˆÕõíœÄõvõ9¸2ÍúëõßW"D.W2Jò‚v¾ÄRÑV$…\…³-×e½•RAöÓ:Ô: ~¾zÿA -ï]µÌÎîñS[Kà«zoªmÝÑ×¶¦ÝŸm½_Ë<øîìÃ:¢Ð2º@ö¯Þ]O÷K¤|AˆñD™\ Å Ö@šëH(M—É"‰X¯Ã$•AòÈ î\ïê*ìë5|=¬•L»Ei@r®NзT‘JòQgIÜN?à)ÑúæWÛ×{K×­‡¾å|ÞØª·-}üÑ[·sÕW '˜ëˆI¥«î$âû±îÍx¢î3Üð6ÁÄ@^ÿ™ nëvÏX÷ƒetÚ9Ð 1 7®ƒM@Ú83n×ï1±Ö;RI$ŠÌ;T~Þ¡xË‘Ÿ ÓÚ£€ÒHƒÁè–ì¬ëzëÅ×ìQZ’¨n·¶¡:Þ­i÷ j¢ÓÊ .Tºßl˜"`"]}ÓZB2iLÛ3¤ñ§j¦]‹àû:IFDâ¤ëùßoþ ñRö-LÓº½u-;¾·Tâ-a éàm4fÛþ¾Nâ80ˆ'¤> çHb «aH†³Õ0"V‹È£–A’KÉ"R¹˜ÇEÂqáÉ£t]h¿cX_ˆ‹¾{.,ŠYX´5wï.öì·À ­[ú¯.2u‘‚åÇ«—– †wJó%Vñõ¹aЖW¢ÇJ;Ú£4”ù4ôAň83ÅÈ8 zç7ÃÌ}[Càa’#p}Ê6”#)ˆ}’Ý=¬ÿrMO[¦L ž‘HüËŸú‹dx¬gx´íã"™$o)PÐ;ºzKŸùoê’ýÃŒ¢€÷›Ór"ºs¥Z4Ñpâ(n°§¿>Ó#ÆfÌû'¼EhàP(à5yKWZÛ„Qs”TFEQŒGÀXRŸ0r®I’¥³„¶+»±„Uñ¡¥ùŒ$㤔 ï„`®6®AÕKК鑞¹Z' )è C:WQ.2hG€¥?õû”ò&ЛÜ¥QU…ŒDßg{³P¦ÐÞd‹4a¹* ¦·ØŸ¤à?†b¿äL>p­I>=,R衲d!!ȧRÔ´áåJ®¢Û¡–þBÞ¥?-t­ïêdJß Âç–Á¥ézÆ«,Ö(õÿî,sW:*”\V†QÛ@ΗU¸ð®­‡†þÚJSÚ vÇ®oGøËCGоÞÙþζX‚S-ë† Þ»óâŒË ¥q¶t¼=UºL7›O4”¿jWr+ÅìÿXg”‘GÞû¤åú §ƒ{@õ®JÙàþpráE8 èd,oîHô³{‚ßRÓ=_™¤Q&1)eQq&8á„t"x—„žÉD~Í$š#Æ>º³Žog³b•?É¡$€XÄ>•ÀçY±—„žI9*fjÞÂrná|nặ›¸îÙ±Þ}úåã­.ûÕ!>3h¢öüÇ>6-4Î3E°s~^¾™ÔZ—n3ð£T”®k˜q²¨ÖE¥RÎ…2ž’¸|rÁލæS—‹Yì–Ó ünV/b¢PÉ¡[Á¦ûZóš›)H!ù4Þ ì“NhXÆQ®§Nï~fˆ£‚ É<ÑLÒuæÔõ!©™¸àöRË *’s‡–Åvª4h†-X‡¡Ï¹¹ZjÉ]aRè³­ƒN“|Pfy”'ç•‘ÂÖ Ç?"õ\Àæ°ôβÂÉ*Òjé’ŸÇÒõB gOòŠ#%ó•q²8?Ê#V8C;•ƒŽˆ=ÎBŸ„sAá ƒ 3ÿ¨ƒƒ¬Ù £»5~„åiHx½|÷ã@iùAàþòè¿:La=T¡ õt`-Íx€R:ßô{´Žž)|ï·ÈšÇ9ÀóÁ H”T€Û%ÿ'bÇŒ:pÙTÊàCG»¦Ý ûIŠy}å§ãyjä †àwÖÌxÒÐO…°î-¥±vøÁVÛõíÐ-ú©Á“ˆ%€ C:ÅæGúñ§š1<Ñ °¤þ 3̓ÝlìÇ@Mâà…´Ëg—”¦ï´ _p̓[ÝÜk6ž˜ `ãÞÞøJØ7†^‹XÑ{™‘€¤|á,1)™%Ѭf¡ ÐÛÚq-#¥Ò“*¨:3=LáÈïÿ ¿-íl‹¯ +ñ"È·ÁõÛå±'¾ñKñ›Œï¥Ÿòß˃闖c r3>ŸÑó$,(À¿Ñ×ÂXò 4¬àÀ¶åC£(H†ÑƧDŒ6€Á¹šâE>½&Y=`çF. Žtçk†í,zþÑezáä—Âë;ê õ²?T( ?„%^/#7ñ/£N¶CË JUs"CfA9d{è-ýûè«}ÄFcÎÿ?eàý7 endstream endobj 1082 0 obj << /Length 2153 /Filter /FlateDecode >> stream xÚ•YësÛ¸ÿž¿B©›%>Óöƒëø2¾É«Ž®Nîna‰©D* uq_ÿöîb¾DÙÎxÆÄc±Àþv±ˆ/øã‹Òxœ²Äòµ:…Pÿ¶ŒÒÐC­¤ }R¯¬p¦Uú U+iª¦O«îÚº#æ¨5‰Ç–~ ú„ø‰òÌ™,麶«¢°K½¶<À’Ôu {ŽB::§R벨™AF€ašƒ}¦q6±OŸ3‘Dh ÝÜÏm¹£9Ç,DG€z¬•ê—€GU©-žÑ ¼Oªuzldå¬Ô®i,LòN9&4¯Õ­ÒlQ÷DñöíËW¢¦b6gaaÆ28e‚8êÌY@=¯Ý­‚#‚e}£Ïõ›÷+7錊fžÓfCrMÜjUP«3ÎùÔÌÍ“ÃØ궬Ԁ§ñ)¸>æöŸ/^̘9§¥A÷1Ìm—ÏŽö“ftÊŒbæOt‚䌠+úüuÿõ¶Ü©³wÏhÕŠûÏeFðIN}O9 Â|\ÂÂÌ8/4“ÿæ¨üÙŒ—Ÿ23;7`ë"XFQä­ÿ·ŒÁ&$v(¼!˱ɽ7hÄÆt›_ÁdÁzsÕÌ‚MYI"Lò©pX$˜ñÐŽê ¦ÌŒè_xpBð,'ñ0„Žê±L˜=!7QdɽØÁ¸µžE="ÙIŒƒHœ?¢%zD„ + !¹E0‘ŽîáyÄø%À hÅyÃ$*@6k˜cf j² @5 ¨îTkEo{(q1c–Y6<ÿ¬YÕ#çŸ2ë1¦-ÇP°4âÃd#ì’_~G¾a¨œ×/žîo ši(uÜÛF£>ObUjÜ}×$× ¨Æö1ìË Œ¼®JHt°«lx'в°ýMM'ìçúÅœïí"=è5‚ÕÓÌ’¤,€Œ- 5…÷©ì!gIÄQÇŠ‚w7Œí±‰í4Põ¶†]uW6­“¤wu§Œ€wW72óĨ¡¼Eò¬W ’•@V F7¦‡Td¶tﲌ%i<ºwn-‚Dǃôq#gA€Û.)è΢°l‚ˆ3O5Ôîúó±üõTÛ)Üd@0»— jg58Ú¸œ;Jk»Ò±t̳s8g” #€£nô“IŒÙe¥ÔH€í¿õÍî" ]+õFµ˜™~3D™÷¯eyµÞ pvtãžU•é9ŸËÎêJpƒŠ­zfsKLs¤2Ì›ÆÜ1[VÔpoli8qÊʵkt÷²¯² ó .H¢9‡%œÃ* q†¸õåÉ> |±•ßÅkÿ{ÜÖ µÞQžž¤Þg쨨Ò$ ÔŠÍQîhÈT™0F{ÐX¡ ZvQ£4‘À‘T£ª-U0PÙ-º (õ]¹—4{McªØÓÄUBšhŠVügÖOÚX­XÐ×åÚÕÊ]‚›=˜C ºBºé“À( ñ_"ý|T³µƒˆ™„3 ƒù¼cˆ!ößµ'Ķr/ 9o‚Ã%Žò9ÈœalZùq§žlDþtch¶5žò‹·ÝZÓNà<°$ÁÞà ˆãéùcwþ­l¶¾2ukèÇò²Ý>Y·¼[ù=áªd¡W~ ±ªŒK8V½‘© X­¦Y Ó8ûïûµ…y™A(Ø•®j‹`@v·çR-3Û[sê¬YkÆ]ÐF‘j§Êö¨ew„ˆáøÐdëî;p`v„mÏ>þ4ØEhV锆Z¹ z±uéæ:ák‰èu«æ\ÊÜFè®é%jæb3@œ2!)ˆ!Ö¼Óp+u)÷}Ú#’Ì£— ëv¹gœ¶Ä#ÖvÞz±Ì;65ùšî¡¥ªÿ#Y 7[– \oM”Ò$3êªA#3 »wŒÂ„ï<³Âš+N/2ôê6cÏ*å4ìÜÚ“3dWñÚ'¦s6Í¡¾Mó¡c‘´-AŸgSÝÈÕ}Jº§\!„šÏ<à %û³BðßõG­¨YSžèôgÆz•!nF¨9èl‰ºÔsm<À†µ ]@Ú0LTï͘¶ÖØJj#¾fCÒ –ˆø© U6C^^<Ô† C£EñülÍFxª€ ÇgJ.Kä¨f*– «‡ .8/zÅ(¦ö‡Ñ=hjÝšÒ+™+½€œ‹d*FIPšçC9fJ/Gõˆ SfîEÀâÀŸÞ8£ãcüžŽê±sL˜=Qû&%ðª“ÇÈ1ÌÃg“ÌW¹ñ‰Åd¼1q‘±4ŽÎ@í¨üÙœÍL˜=PåòÜr<­‰‹­‡\+߼nj~ùë“Cë`uèñeœ=HÞ]ܬü÷ï®.¯¼¾¼X]÷·oìï öýéÑøýñ##í±´Ï¿. 'Þªqfç¢WŸúµº\Û·â[sÍûSÀi™ÓÙÿ§J` endstream endobj 1095 0 obj << /Length 2481 /Filter /FlateDecode >> stream xÚkoܸñ{~Å~Ô‘*RÔJº+ ørvê""1ÚK|>€Ñr7JVÒFÔ ŠþöÎp†«‡åÄ9°øçý Å*„_±ÊÂUÉ@Æb•—B^ýøHðÈñËÕ£¿\ÀP„Afbuµ£¸Ú®®½'ú¸¾¹úÇJ¤HåJqšÑÎh+B®üÑVÑõ‡zíGQä%?­}¥bïé“g?ÑŠ¦Ï³¢Ú÷zoJœ*okhùI]êj[·4ÛÖ´ûÔÔåZ¦ÞçÂügí ‘)é‰XàõίNüÅR~GqG‰\‰(A,Mª)b& d D²öãôšâ¿-ÚãA¯#á}A@‚r,A± A$‰)‡S_ˆ¯ë]£Kóß®ØínˆÃ‹Ëgçÿ|u~qùŒw¢™8 6+N7gú¶qÊXy5}˜6™mvá•©¶¦™Òô¨>`)x×ÿŠÈ4´„¤~Е90ȧÞà öÚ¾Y oÏ³Š·;´Äýè4‹pJlŠÎ2O7Ÿúâ3*³¦«ù,EÒs^ªø»«òŽ'W— QX@É –AÖ¨éé[½åƒÄ3^‘×UÛ5}ÑL$úªº4huRx[M_{ý’Š“,ˆÒØ“ÇÆìŠÛð´ý†KÚË’ ÚHw$@§­À‹ÀØ^L¼:„ŸL†d‹„¼¤ê0%Ncô¥iðH¦¦ÜdQå)Må[F}‘l‚$žê£#ù$±uÈdãåÚò 9jç½.O ‹BbÄщ%´ñ¶ÒÇö}Ý- ‘A*…ƒ6„¸1]ÝTL_†ìÓèS¡`ñn)ƒP¥ã»-\íGBI¨¦˜È,JG\ר8õÎSm mFíÿÖqzº¦)˜Jeòbëóº¤ïƒm•<s§S·<åÛ—u‹;è…Ö\ƒ(Œ&& JÎ…ÆG˜ö]¡í~Êû]a"ű°($Z)Bõ¶9 g! ‘m7szˆe +¸Fy-òÚÌ{“šœ&µÓÊÝgÏýË_‰ÂkŒ§Ä`}ó€”FxÏ[ˆ[ŽQ™ÆVT2UÐ Ó‘ùþAú«LM[ã —R«j:½ƒ$áÔs/'¬”*ü:ªq¼·©óó:¥b豋¦¼G"cíþu‘¿ ‘'³B_À¹¡rðû.Fô;0¿×Ö¡¯,[‘áãDi#@âA|ÂÀ“ÛÀ¯láƒSÊcô©áƒžY*ÎÀ¬’•J3°Ÿ VQ@¢ÝZÊ-”›sd–¯d®•R^>åÉÕbÖË0ª+¼b¬‡ëQ…ô¹a‡:RhE\ûÂf0Ò…Rn 6Œ€ $2páå2ÒAù#°îäâ@Q¹ ‡8Àt˜[ ·ÒÌu<æz\Ï-ˆX¿_ôy‘Ðõ nŸ‘Û·¹>˜ú;ÁÚ;Ÿž¿<ýâìêå+.kíø MìøíÍŸ(gSL’5§­&/êJÊ!yá>Sð˜f¶7è]q<¹s\ÈѦ§AY½zÏ«ä è8»X !¼³uy@n°P¾l1B„0ÒžØpœ`h°Sq°”ÆùóÓ«)ÐA Ö`J ~ÞÐÆ|_áþ[*!MËèLCqj˜ ÜhìZ,Ñ ~ŽB‡„ØW‘<ëå ¹±&¨úZ÷ÁØx*'©ÛhÚG5nÕ7 GÜ&AÏD°Àº®Ú`·Ð,G Ø»²ãPŒpãê\¼ÊŠ6‚ò c´†–¾…ýí½˜ã9æ¯`©ÊÐ îÚ^[Ä¥@\3&ìÚÈhÁ©@¶òaYxŒsn}£›Êvúë²û8ß)¬Ac¥dPxÇ`ǰ\ñ6$[=pÁ‹[:ïóC±5èø º4ð¬SÂÞ©¸ñ½rwÛOä•ußšÅÏ€iÔ}×Ðx‰ ˜ø{<õcØæz¶) äûgª”ùhN44áœàÎ$Ä¥UDa†01Eå„Ê¡Ïh¶a ¢¼æÁP ãŒ.·ü8´í—ôÅö´Êlxº£º®aËfl4ò«ž0óã@éí=\ÜvPšêÒo9mºÌ•ÿaíÒ„uÒ%z~÷: 0ûOcœégR ~¤Î—¡Kø¦zxÂGØ»•=æÞó«Wo~ µ?×GÝË€ 8å¾ò#?vC…wpÄìŒÞ†z7ïÞ3¡}UPbnZóc, Óù¹}¼”^¾†?*-:˜3#W—ÏÏÜö¸Ê'ʽŠÅ^C&)¼Ã©p­÷ö3´ïµ xl­}ÙW ÷· °åÅ“¿âd8u0 “O+Vˆ¡A.–8ˆT ’ÌA!ûÖ„3ìL÷=¾ßòãUÆG ¯,¢$š'ºé leÁ¢·Ì ËSxæj¾IG‚P$6Ó`“›w½â@^øÑBeiI` ªdÞ×Ç8(¶PéÏ‘}£Aú­ÉE‚è½nÆýžÍZ’XB·'f»ÛÇDÐÇDsîD† èšÅ÷õ1Ê-p7G6¼aª{Å+#Äj|ÿ‚tè;×ÏP}K¶ÉVÆÜä_ìãÞGjÕ=BŒî1J² Iåw„è ¾ÃÅ q)FÉ”1Þ Sr¦êj‡¢ÆXQêƒO‹ïŒ_Hðð®8…ûç¿q¬Ár|ý÷—ÿ>ÿõéùë›?ÑÐ)(šm„5¹nø§4T¤ðªƒ£>ì¹®ØCƒíÝ÷Ÿ§höŸ§ÒáĈ_–Š…\æj‡UíN@µ÷~X¤·¼M„2ÄëÒÕû.zVôÖ”£Jl †‚;¼P±<39 UJdÞé8ÄðŠ'[þ–º°Í€¹'¯}ï.4ôÑPéw¶¨§“I[¬fšN7ôÊ£‡Ö§Vhðmm;i‡N~[mÖ,V¥oÝTúÀ}±=O¥ŸEêø"¾ºá |ÁËô?cMÒ³ºàÿèÿ* endstream endobj 1109 0 obj << /Length 2506 /Filter /FlateDecode >> stream xÚ­Ymoܸþž_aúAÛ˲")ŠR®(K‡ôÔ.š¢éôжÕèÅ–VI®úÛ;/”VZËg(‚XÒ _f†3ÏÌpåI ÿäIŸX­„2òdW?‹õó3Þ¶0`;ñãù³?¼†W‹<ÎåÉùå|‰óâäŸÑ+w³ù×ùO'22S'J˜,gΧXif %ÕÉvÆ*÷CÕn¶ZëȾØl“ÄDo^½{ÁÇwes5¸+_ãgžÉ¯ÚÚ5EÛóWÑ2÷oëÊ¢/¥ÿºÙJ™'*’FáöÏNÏ'ýŒRG<`™X‘ž¤Y"¤NXŸWtÿݘ8Ž dV>±*B±3Átóh§ I]6(ìP6$?°{?à‹Œ¾lŒ‰\ÕvL/;ZˆVæ—î?>0wnè]x¯}C6×ΊeÒ8 á.ûVl¶&£ŸïH†‡.µ†iQD5›-Ìä­QÐÚF}ç[YQÒÑ ³ÜûÎ}Šu¼I’$Ú±AZß3—GÉ¥xÄC³è4 ‹™Ò.M‰ ¥ Ojâèìí{Ôïï§~szö|¡LðÍÛ§¤&º!}Zú[Zf„9pºj~ºi&´Aw š6ŒYz@*ŒžÆ´ÃÚ:8&Wã˜_Á k Yši¡ç XŽ‚ÁEÊ™‚œ,¯ë|¿w=Ù`\Ùvd`дü¼cà ïdU´ÄH&Rc–+|ï›kW¸^°¸tÒ"yQÜ­AÏߪDÄ*D²JH8Ÿ­IÑ‹÷[^¡á¸‡ÊooÜþzÍ8pN*i¦G¤0q˜{˜Fñœ/ÏßJs!Ó‘ö30%þ_³,K:×íå¿°L— =;f¾0ð¼ú]ܦ㯃m@õßà öz±Þò‡M¦£—øçüm9nðM*ò?ziÚš½ã(ÉQ &)ñƒ‰‡eç÷Àú0º ®Ø‚•÷»ÎKáíH™02lâºÛ¡$aÁó»á°cEªµ˜+(Žãã ˜èù1Ôü\îqE8n Ç·«aeSaÇ€ùãêÉ «²qDb¼ b5àc¡c=NøÓj˜Æßâ9ª€´£©7#VHÕKw ÐVF®ÙH´ Åž2Jd˜hæ†CW÷3y·Ç1º¥Ó’=4>¤’y?,—‡3V)ä«öý=nh'G]dEئ.ú=ÔU¤!T(&Éî-Æô²+‚¦A…*x)®ÈÌ‘—L“ç‘Û®è0‰ŒB±qHÝøôâ -~;ƒø¥{ðJÈ®ý¶Z7ŽúL¿0ì§ÌÀb6þ›cÂDnÆh´…ÕŸ!½"ËŠÌædÅìþ’6° dÚeMLµžIÓT¤ 8åR=O¥É!•V­+žšBsþoùs™>Ía¢ó™/èPVÁ3¤O| yG2À`–I“¨½àòû0÷*TïŸÞw厇c6làDÐЇEü~'Ö¢ù=•› &àd–€‘t¨€àSƒ‰o\òØRƒÿB膹\ªâ vnéÝúeÛ!byD¬oаPØ”ÈëÃäÑ:0¤ð«¹r-‰ëØvÅT¢RµM™µe†A @øv@H*km—µ ËÀ©óߌ±LX“¬ » #Œ}t7H›»”BšÌn8YUå)âA‹ß •›A‰Vk!‚‹<=‚iò0ôØ»ÐC2ô  #ô ¹ œ‘±V¦OB\óùh«DÃéÙU°~¨–_à9àOÝî˶¿«üo!Z"Ð|aÍǧ×èIžÈÀãÒí[ìPûé¦kÇÊLÑ ”…c¶á †Õœ×Ë©fv@%ð‘(x˜ºo4k7Žžµ£di.J·Y.Vš}ƒ:ƒßY(Ҹ΢B™»é#Q\]®.j¦ílÐÎU³: çÓU\ÓO¥³¦Gc½6“z,cÏM@Ì¥-¡9Ë 7R¨e¿ÿ… ‚ˆˆäˆa °Xxwá¹ ŽtϽR>AuwÈ#íz'« Öé´Â—X%ÃþTQN—þ9š!¸¶fnh& ^éŽc!ÒHPyòLäòAÈTSÍFAÑ^¢Ã]v ê¾±%˜Y(ý{„5-*†îµah×,É\PGãÆËÃÂé5Æx7Ó2m~P´JËüñP‘æçRõûˆ†‡6Ü}9F6RŠÀkí©-ð> stream xÚ½ZYoÜ8~ϯèÝ—¨‘"RÔ5yò&žŒqœM<ƒÌ&Y€ÝMÛš¨¥ŽŽ$~Ùß¾U¬ÒÑúB-^*‹«¾¢,!ü‰E.ÒH2‹õöQÈ­Ÿ .ù0ÀŸøÇù£'¿@Q„Aæbq~1q¾Y¼÷žéÝòãù?" D&2ˆ³œz>„2¢®@ ¹ðg]E×—õÒ¢ÈK^úJÅÞ‹g/¦M—EuÙëK³Åªò6†šŸÕ[]mê–j›šz_˜z»”™÷¥0_—¾¹’žˆíôŽÏÇõÅRÞaq‡„Jƒd‘d*‘¢õ˜/Ë8ñtÙëÕÌ2¯«é©+zöÕç^—ŇP(³¡¦öÚª¼Zúð[—°ú8VIjŠUÉ’*½5-íø¾í¨F/ò¨²èL£Ë6XúI˜y¯êQ‘+ÝÙ]€Q bÒx­Ë Œ=°>9__aÁxÞÅ8lM÷™ìýöS2xÐ#øý=ûda R5¼ÿµ(KÔöµ±(A)CmƒÝ¸Z_°ÀxÏàa6—ˆ:8¦•yçÙ4mwUT$µ[ o˜pÝ7©ÐŽ5 y}k _ÆQÊœíÄønwzmpo’Ì+œê©8P2ºK;H%‡A?ÁÜyì™à2€¢Â+Zjb4ôÕ†êÚ¶'™zk7Ø‹ú¨hŠ}Æ\ó›ô(õWöõæéJÓQwÝ“ü¹è+ÖêÛ#Ƀ$‰÷ͱkLÛu…+ÈbÜÈÊ…¡4 ²Dý†Â,=ÀPÃúÁ:Wºº4Tï®`o¹ æˆ,¥ ±ÄC¸0¡.çã`-8­ˆV/bP´šŸšË²^‘õoUT¸@!3$*Òk/ —C‡P!p@Ó'‡~YÜä½c¤¹ìiÞ˜®oÀW;„*"Mƒ»uIÂb4º6`Q¾J3¯±ø­l Åz]ÑSÛgja¶šÂhQAvÅ©X‚9FrU¥ÓuÂáÉå¡UÝd3˜îˆfmLY 'Ç΋² [².»ërÃdøf$ˆ³uóÉo;Ü9×6îê¦u例ó÷[™óV^™²¼ïfÚ±ž=~ùÒvvzzôêù­;¼·€ãofÝÛÔA&Ìœ€2]D*jÿíÕÉ;êØ›…:û–HŸ@Ò^¡K€tŒR´”S4ì·ÖÒE׺xÌEÝÐJŠŽ¬Øq¸®·;8«œÚðŒÝÌÀ iÊ‹ ÒW@X™ZU-¯cè²Ì§(IÍC)%j­Þ qÝíuUÛ®·¬—ó4DJ*‹˜ýÍiö •ÙÃ]˜Pg3} ðn‹Ò˜éêžð wÞŸœßo{6£±<&A¢¦‰ËÄî æå-uÑÁÁvȸ­íànµ:`uàn³®á}4º˜åÏÄéÒw¤°8¿¥XÊ©„Ù¿W€_±tX~Û³„¾X1„ôÍS·G‰ƒ8ÃM†s™Jq”N,·-6ƉŒüÅèPwM}Y¹ÄE"H&tC©w¤ôÆ”šS¼i ègÈ%¥ aÒ½}Ûð±cÀih±*pØ4c¥±EGžug=œÔÙ-˜Áµs´·DðäðCÇ“œû¤¹DÉ.±Ò»öªînó…ÑÌÃéªûèÔ?yN*½:;=~~vôæ_¿ü~FÝï9{sztΕwoOþ}Ìå?°üñãÇ{xQv¢z¼›A»©ÜÞ2Ác¦Ên¸ž…ü+#¬YiǬxï¢f·Av¾n;” Qp"Q´vTîè þ¢ pwÎܹF ¯ÆóK«a-æs¯ÿgijµ.4-kÃk^ëf¸ Æ,>8zÝpKŒ¿DA|p+Ÿ†ÌÇ•þ‚sâNaJ|îÜðÞj$º¹ì·ì×Ðõ…t9¬à|×;t”º|Šw{ÄX±{;úS3—J˜fTìï7qÓ‘ÌìvÛvÝ÷o |&¿]Ã<™oÅx»à ÃX¾1º/;´°3ÑS ÿä@ï¡¿“¢C1J`§*)¾Ò·í—±»ÄdÿGMn¸¢xvçfî_Ûü6‡,ðÅ ÝIÏõöÆMÌ~DÙƒlW·[Ój'U$éõÆ8Šz¯z›(tTÃ/FÃýD_ÀÙ6ËbuööÔ 8&ñ¢wî‡ôë»,¿9ß éìBiΑs‹³ ˶=üYŽG #h7K¯à Òug6TaÞdËSfÉW/ä”a;0Óš®b«í§ xbјug©Ô˜éÇÃ÷Ÿ8Ù»ÅÀ {]Ej• Wc+•-O'_ì8ÏØP«æ{ý½È íü)aæ¼Þ°÷Dt7Íé¾VÔÀÜ ?ÔÅ!}`#FÛ Ü—³9ÿezÛXö ²š¢ë†uKšª¯_ŸR˜ÕVwÔgíhI´r£ç@ý¿äØÊYJ3H "JDžµ\F–Ñ!‚'õ1k닎¿‚¥ôÁÏPG9#„ô†jÅsA€¦Æ­ÙÖÍ5âz"åþV=lWDL\XRƒÏ7G§•œ¶Ì’ “ñ_æ!€Ê„Êqs"ødClÆe°!ì‡3j|ñò^ß¶zGåaù?qú/IhÓ׫‚¢¥ÛCÚ­K›Dà•*ÊðÙר–UßQad6v\ïh¬j ̬°Dç`9_ …'¡-±%»Vþß¼Íÿt™w endstream endobj 1123 0 obj << /Length 2764 /Filter /FlateDecode >> stream xÚ­Y{oܸÿ?ŸÂ¸C{ZÀˈÔ; ¤IîàâÒ¤ûLR€+qwkEUÔÆqÎýîáP/Ÿ6±C€,EÉyó7c~æÃ?~–ùgI ˜ˆøY~xä»Ù«GÜÖ@°žPüñòÑãaÈ}–ù?»ÜN¸,ÎÞyÏe³úpù§3ž2žŠ3Á¢4£•÷¾h‰ .ÎÖ“¥²;Vzµ‚ÀKž¬Öay?=ÿù ÍHúù¹¬wG¹Sü ½BÑôs}u¡ }šVRú°©÷©T׫5çY(<…xý£——ƒ|‘ßPR|CX”ŒGÄi‡ç‡~è}”µª$ŽϪîh:Z8´K²iè» UP>­X‰pFoL~l•›Þ8¡q¬á¶vz)ã(òÞj·µ)×À1÷H¢)ÃÎÁ&ò…œƒª G¾c§}Ý^ÑWYÓ/I t™#OW»Vñ¾âæní„ë×{å¶Hú鵋‹–7¹…m G-Í–Ž™wå'¼]±%Öÿ6ƒyð 1õ ‘2?@m©¾s$3'‹X"’ž¢1K§À0ˆÃûŸrŽŽt<4ÖG(ÒÀUÞXý™ä.›Ž–š2ïÀ¨DЪ¦UTt„eïaŠh)èpjÛêÃÄýì*X¾×^ùÔjjf,Mg®¹/‹BoÛ­Ì^D‰×Ú}mc{Åž¬p!õånoÙ!ºÁgq­¬sݶ*ï0¦xvÚ æIø 6ÍañLpÁƒ !’ 7²/‰ñ7o^­·º=¸È]‹8bàfs§*Qµ±×´ÚÊ]s ?œÚ ‰(öv“¤øƒ5y‚ÑZSmšD*£·ÎÙ(’­;ºUu¡ZÕ>ÅÏ ÌIy%ž¦ºxšÌbOoéW¶›r½]+[Üs «ò „ dÜÌ»ØÒ4ºi/šjR­ŸõÚûóëW/_¼F&žýÿÿËß.þŽñýzIïÜOX–Åý^ÙîŽçÇørÄ”rÏ]‰žjhþú„Óp( Çà½]´7Oìk8‰¼8ƒWÏZ!æ£HO'Ìç³h€ˆë¬Q¹ð¤q¿K Eà[ .wÕãMY?6û%žÂ€…Ùহ>l.ǃ­2à÷z_æÈÙÞMÛ‡8& ìÛ†oé·&Lš{}¬Üq£[ÀGSöåÈu–1¦s×xÝt¥F—\°~±,tùÏ·ÿ~¹$^0_ d(ÚÂYªñàIÿºßQ.ïZ!éc$ÁäT)Z¬]*ÂY]W74‚P^ô  dYü6içë¯äØ÷”Y :cšö ß;„^3{Pø#¶JÈ9‚”pY2Û‡%—íaÆ@PÓÜ{?òµ;Â䲲θÀÃcg{« ëQLJãÜ&wTï}~V…#,·ŽÔö‚¡ç¨ç´ÓÄ, ‡ôP:T¹s:&…äà´5õCœÂ^ܺÎÂÞ5Ø!)0¨0€¬)3ëÚì%jrÁ~ÈbÆâ€÷p9ò§;í>{µ¾xA÷]ßêíö¶Ó»]¥þ7òuÇuÎŒùü”´xFÑaƒßÇ~bá€eï°º—m±²H+‘QBð°ËìÌx¹<´e‹º#&­æ’©æB§¹À=ufií¿¨c^•…’õíþ¦QíFWe~k@¡%xàƒTæ„ ˆú¯‘ÆÐ»›—’r4Löžö[‚—VÅÃt9Àó ô*@È[ßWvÏ5Ùbî=ïj}»×mùE׬n?©¶€M«Û\WðûG¸¼ ùáþÚz®kŒÎÆÀŸ\ìÓã…¿ôãIJcJ%¶òÁzâ zœÙ6&ßE¨; p¿ŠÐ%~6#Ô<ŸÝ¶FŠÒÈ &¥…5§'ˆ¬\jšª„Ó;ÒR¥¶Ýã¶¡–„&i¹Ï$£´ × FúÞ?§ïv„°6€ mýž³…º’µÙ”¡ÞKuó˜]ÝuúàØ™ÌL¯HC7öÄ8âë|ð7XgqW€Æ•£wݲYɦ’âcI#¡ÕÈ”‡Ü~Ëz¾cÊH)×¥Úg° м~. €‡xÄæÎµO £,Þʦü¬*C7X>àgݱÚó%ã°bŽŒÞYÑ# ‚è8¥Ü DúPve¡Ï hN¶`…Lwa޵¯sš±( ç&ÅGÈEäž< ¤ Ã¡» 1ágåÀ:Î;š£½2h¶%~q<ò‡&Vlç.3 :²Í2HÁŽU<Êzñ“Æù‚ÿš=¶5J—ú^~lÛ^=#tÊ@A–—ŽJö¿‹ *ôY/÷BòcŒÊ`)Qök$ —U¥AFià]RÍ|!…íØö«Í ˆODt'©Ð» LýŠ” ksJ©}N·µ[yáièû"©}Ž—¤&FÈïêNMÙ%!Ÿþ| ‰Âp@§ RiO×9 Œrbу—ºØ¦˜6NK),ˆ¿»u`m×’ÁúŒ½$ea, 6.ôõ ¡ùXÑŸ”Zƒçœ> ª€43©…pR Þ·?å ×Ï›VìœH0.­ýžfÜkfµÃ¡ŠÓl^÷Q›½Âeä-ýÖJêÛ`bEc]y°Ž¸†èVžÊt枨7ÃÆ~5^UÕI:Õæêøµ…][mËÏ4~gŽ[øx˜¸¨ xä:|Vâ,pxG8Àê9q2¬¡#†+eŒÜ)ô«ü‘:{¸`T#Û‘®oRÚcÝñ•’¦;¥‘Ñ>£àKÒ@e bT®ëÂÖî•JD«&á!<™ÏÁØÀPeŽFï—\ë…÷À”£hÿ=âüVa"<(¥…Âä yî ŽÁy8¢" ÌÂ~|ɪË2f›IEC¹YUôP¬\ûgKѳX ¡Kn³x[È‚1BÞYDÚ U‰-v²ñ2t›·wŠ&0¡#U3fû¶Æ¾{ÕлW®—gãÛ®Ù¬e{yØíí\¿¯¿?Øn_ ÈmQÇKÆNÝ×Ã,ba2xœ,¸ø ò¡ZM_¸×t’zÝÀrÐô†–)Úlá¬$üŒ‰äÔº´>Ñ ê¦Dwì†O–ðñ$aº_Ÿ4Cñ%ÉÓÅY2C2ª[ƒeò+Ê¡¿Û9íÂv¹RªY뮬f‹}HBñÉáÜö­“t™Åé¯,½$‚€‚ê„‚…!¿‡xÄb§ pB æpÎIIÅ`E{§ç  ¨]=~º[©8ÇW³mKn—$,Söw_aÑÒ˜xN2>àO;ý1˜%»DwÒ„3Óoìc÷bkQ™xÃieÆð˜“[¬é—uM:ú6³8ŒƒãE;L‡.÷–›“?‡ùãq£#%ÞãáÔ½Y> stream xÚÅYYÜ6~÷¯è·enE¤Dñ“×v/‚<Ä$ÀØ hZìi9:zuxz cûÖ%µÔ£¬ã‚Å`Fd‘,‹U_UqôƇ½IýMÏX½ÙWÏ|¡þþLKkv³¿yöÝÐÔ¾—ú©ÞÜæ,nòÍ­z•¶nþ±Ñ‰§³1žMRy‡<£Íf7*ú¡l¶» Tüýv†Výøê§ï™’ñç§¢¾²{Wa7T¹cò«¦Êê¼é¸—7<ú£kª­IÔ§Â=lwZ§¡QÚZÜþÙ››é|Ö˜¯(g<Ñ@l6:ð|Ph JBO!&ö tâíÎFFõmVw‡¦­pkЙë”k"ÏDᨠë_æÓyš»®oÞ¾æSí]Ý»–{:´Yå ƒ*N ‘¶Ìè¶mú¬w_ˆY¹híº}Vºü }>0£3y“ÏÜ»½»kÎ;ÞñKÓ÷E-Óoó~±§\ümW5MüðŽ¡å´ K±±-—¼¸¬³ÂA0-fÜÆ…rµ8›ÔÄŒeYüÚYp}hÕºƒk]½wÜ…#Áר‡c±Õj¿5±:òZ ~3¶@"e ámÁíRQé¤3±‰Ç_—u…ëzî uîÚŽÌ4Ió…ûC)&ÞÜÙ0TÅ餣XÜ.HF5B£CuP+£¡ðr1<»–õ=Oz(ÊRœ ËÚf }Ó¼nUÉxöT©oUvvÝ Dj£Àé]ûPtŽGXÐ+ïäþÜ#‰ÀrÐP{Wô‹åÑÂF®–ÃÝD‘wÓÊ^ŪĢ(@‰݃ÛYÉ”ßÉ8ÈÜÛ| "ÒÄKm4:þ ×P"Š=M(·GÎGެʰóÈ;…;CGN-´‡!4œ'µã)üP%ãLБM}õ²cöZ7b”Ùi²Ä¨¡D Ñ£…épÂc$ŠÙ@ërè´ùÚªPÐö\îäîó È ,¬eFB¶çiÕŠ‚ð Öþy$Ÿ)ˆkoÂj±›ŸzË’¢ãìsî‘æ4ãæ^|½é Ê‘Ø=v=ç*FÎ iU—Îñ I¬áŽ;Œ´¼ +l·f×§Öõ.Gb-¦­–0ñb2›C³º5•˜Ä‹‚ÉÆ…#‹ m+W‡¸HÐD›¡iA¢p³Eôšr'k²šç^Œ¨œupûÔ6'Q®¤‹ˆc/ƒ…A’!%ÑèǑʋ®ÏÞ±';ô„KdŒt³}ÖÞ»žÛO棈EDñz7œ&ÑxŠÀthSì?˜ÙÊÍÉÑmZ°) vAš0J§£°äM3ê›a_¹#ý¥)l˜ÑAa¤wCQö»¢ÆH[¦÷áŸä8 ˜6èRn—®d·i2yо©*VUJÙ”¤4¡gÒ+7aˆËê{ ‘>o@ñž‚g¨~¥<‡z<1éQb ç@ˆÄLBp»*lêùv:ÓL6´!`+Ø¢´IxÜô³ÄøVä{ïkÛd}7J;Æ„Ã#Ç( ÂaJ'Àéì"‰—éÜ//_¿}ùó;8g<~ÀÝÉPКæG]õMíÛùY§Ü|5i¶ž¾L«{rÑ žð“\mj©›i10é¤El³ À>óš 1i‘”cÐm¡ZÆÕRi&¾+•ãh8bc°†¢Á ECŽA0[1+Á,ùÁ AœT'"årÕª9]€çZ—h&œ4“÷kÚÓ0'™Àº2gÖ68OB7è„ÆŸ®¨N%I@ѾY2©.8Ý(és3ë;9'åÅ#|áÒKòÏ—‘øž5Ww1ÏÅE¦Ð vrF‚íå®&’>„[Ï LÈ#ùв“@’æ–¸žQdqrÍ&ÃÈó#ûEFžöà  DyGnìKÞŠûA2}êRL ÞÄî"¨±¢tá”3U¡AX±a°ŒCC׫‡©® 0B¡§^Ìp–,@èäZ\â®ÂRâù—yWÙåsG ÷’W"mÃd‚y›ô*RR±'@@ÍzUCSá¬U°ZåêØK’I¿ÿ\/6SNdvfdIòU>“K(”¯C½kõ(V]òbÀÃá^ú€ mÏ$.‰FI@ç ý±$€KuŒ–ÀKîfþÛš‘ÇS5“!5Òæ*”‚JX£æ‹ªryÁe“ÇÇ^>þìøUÌD§Áüý'¹zÿ°½o¿õˆý¿_‚øõçˬúË^‚Lˆ"””q <ê ½"þ„•|5«Å|%„B–Mo,0ÝÂX~5ùÌíV:n^XÞû¿ ¡ìÞÿ{k}°¦FÖ“!ÂTy£Ù­(—ÃTÅ ¯T"Q£%¬ac‘CÓˆqy A ½^è'Å;’wûÈÝÖ㎼Z e[ŽR¬®^ƒVî Êɬ‰gFxa€wô¶€£Ý£Ì>sŸÜ7ñ/«<†irHÿoÑÕ@Q=C¤?ˆ ¡7Å È߇L"©õ±&ôàu]ÍÃåø ¹ë\½L@§!2ç!z݃¯ËÆW#ìõE%¼ +9Ik+}šqWâ# qÏ.ÌÛì^Ö/ )¡éê®Ü¿†¬$`ákÇ ´ÿzª‚€ÀOÞñzP‰ÕX‹¬Ã:Äß øj²£/Bb4^9èòwïqÒ½[±ú•Sã2—°ík€:½p£ËH|ô²kÆJ€Ú“I îø³V °/Eõ´¨ãŽ”³æz£Lʳ¡çaº1lüÆŸì\!“zõ‘ihk†CÔ9Üi3u7ú¡’Š@rUíK‚;êó[bKz[:×shé¨.þ"‹þkCËŸ,À;:@h—¸‰àHœÿ#»|ù-Ù^â¿rÛ%œÌ0âȱŸÍ·X} a6òϦÿ¨•1& endstream endobj 1140 0 obj << /Length 2142 /Filter /FlateDecode >> stream xÚ­Xëܶÿî¿b¨°ñ¥‡¿5ÎÕM4}i Ø.ª“¸{r$q«‡Ï—¦ýÛ;á´Òž.9Å·äÌœg~ßEðÇwY´K¤`Bó]Ñ<‹<õ§gÜB_^?ûâO0äË¢Œï®Ë-®ËÝÛàe~Ú¿¿þfÇSÆS±L§qÞEB‹ .vá‚U cm÷¡”2H^ìC¥tðêå·/ˆ’ÓÏ·U{ó£ipª‚Òù¥mò¶´=ÍJKÜWÆ6{‘+s·9Ï”¸ŽñøgW׳}ZˆßpJ<ð@"v\²\à=§Šq©È˜„ ÆU´u,‚¡Û" ž ®K×o…di¬&ÿèhwÖ\ýý‡×@å~ñÊï:añ.5øäù×vlËÞËꥬÌXÅpž“Ã]·v”ŠÅY2I ýw‡ÿò®ìÉ­?›Î2Z»ö(Âa#¹ eÄd¦—žà䉱 ‹¼ Ž£ÄƒbìÍ-úì–i­Å%Î5oÝ8,nóöh~iìØ›°èlß¿ºÃÞ˜rÇÁpkpPL$N17?¹©­«â~èVKâàCÞš:÷ò¥'ÿØë( òÆt9Û‡q&ƒëéŒÒò±ö'W›QÊ䉅q[vÅr|ánW(Ž«ÉTâÀRY´R (i†ç;N“;ÕaD†+/†ê#†ßl. F†‚;µ{pÕÌå:`4.àãž=Ž<Õ-ê]Ìýîhnw묉Ö!+Æ®§$î®ã¯ó “ŒÆU ‘‹ƒ¾4E>Ë·•nLÞúa5øÍò–‚tYº¶™Ž±M¸¥Ý .o RqŠ7~ïH­w¯…ú“߸zqUov³s–s5PÑÕUë÷½õÛÖûüÓ@{ Wú ǪSmˆrÎÒØeéRyïÙEx}8t†gu¸…N)U€”×½% )${*ÛúžiÛúž(jãîéŲ‹ŒÊêþé9H‘-“]!´è DKS ïªrï²ÍåôšÉ8 Ž0>¢ç 10àÈpŠÉI”Ô yGU{¢­’K ¼±ÏQ0òœ1¸Ó½Vç`î7“ÚÛV-à ËÔ|Å—Uo«$Pp…š¤aœƒGüá­+ä\-äÉ08›hœ ‰C¦aŠÇ.§HãÌ6dÞ£#ìØÕG„JQ±(NÖvžc¥¦K•º.¯.s)7.%(¦p{'ÅÕºLmo@у5TH±P¥S¡²-ÃjÃë}ª.JŽ¿‹ì•‰ p‹«8ñº¡j·@ÏÑs+òE"ïõL6t*Þ äxŸÑ¤°c]bâ¤"0ìÈüðTçÅt¨³D¶®©1cº8R]µž –mäÕ"<Ð7ÿ¹•c"Áá”5¿ÿ÷Ÿ¿ÿîê?_°#€( 6-K˜ÇÏÓ2‚í4ù忯~òüÏìBy wÚ‰­ð/ Dî] 7ÔÁ.èïûŸ^x«ÙfšéxîŸ/¯þr}µýVJY–êIÎ ¦8Ã1”Hšñ1%’æDp—CÀûK«l•rËäH%GºH =LL,ÀÏîÁ?¹îx·'‡l6!X”Îæ,ã|i¶ž‹¾‡Ìx„ËDøuÀÚ¦ÃÏ{…qÄb¾)M(,œ†Ä)`QÝ$8vÝ¢™:1S›ÂÁn\܆ç˜2¸›úsUo¾ÃE3€.“]‹ÜÜ|oi–òä ¨†¿}çÂÒµä9™PñH|ñ€y™“½6ð-».¦¢ÝŸˆBŸ:’¥Cˆ±ÈF7:ñ©¬s*¤¥‚Ä"=Õá$¾ÊÚœÎé 4·w÷¦í'Ä}X"n,KtÿÇõZàÆ ]UxfåqykÛðj,ꪄ(xþ£{e"Äw®iS¹f´e«Ò,9_wg«¡ç¬ŸºAfŒŸ?°®Ûª-1ƒ,yÂ[íUÒ½poZ©Áb¬€€LœôÄYNÜ’^l­+1@AGã/L\—*\c‰1Õzª/D«§žWL]ÀùÜÛ V¶FŒË¹PtÖ»Ýý–Å 0Ÿ‹ésÌYé€ð>L$'=ÓÜ/j%Ü‹§Åô•%6õ&wot„ì¶.{¿Àoà»FümŸbë¨K­ú þºÆ8˵`±JWi~.;ØÙV·îsÚ­šÛ­‹@cñUž:È`{ìòæéýÖÌki¡Óë‡×ß¿zýÇïžÞd¯ýë&YÜ=pK¤ƒ±Éi`oz[›Á“ Ûà'Xü¾wòÇÞ“«¡§A‹Ÿ`q`þ心ÔS½º@ÌŠ+ ¼ƒ.¥ü‘gÁ$ž¥6ðòÅV>`ï"í•‚lÿ/xKša$ð‹-Žß‚x(ÇÚ„Sç0Šg®Z—Á÷Nk~ý] õ¥•BÆ,-SÎ2ùÈ«`’ g¡ …‚d‚FC2þ#t̼dÓ™ÿe& endstream endobj 1050 0 obj << /Type /ObjStm /N 100 /First 969 /Length 1762 /Filter /FlateDecode >> stream xÚÅYMÉ ½ëWÔ19¸T$‹¬*ÀX`?0¹$ÀÂöaÃy¦+KÆŒ&ðæ×ç±$ÎŒìn«íØÕz]d‘¬G²D)ç¥l¡Uÿ[‰º€O…]hIBkø«ÙHàæå U\È!WrAƒR]@° ÚüI ÚºPƒeפ¬ƒ-‡bý«ûÊv´dÅ%ØÀÕÕ<“æ« JvˆæŽƒ½Z3ÖÆJÆþ‚/nŽMØ’æ[*¾·T`y©®ß UñåÜ®Ö7P4pª¾ÿbùðn ,Ü¥8Vq¯øR©â[kþ-|•>âQÕþ(Cj9`q8O°'nÅ­«$Q‡UH‡¤¾Þêž »VxTrvÛQß(%DÚï¢y\(AGÃÊíðFdî„9'€ñF‚„hB"H°±ÂôLî],_üñnË_WÿËŸwÛý°ÝßùRœðg‹å³ánw{=ÜÎpö·áf½úi÷>¼LxàÎ*_-°È-ÞÛwà?t ¿„—t`ŒgaùÛßÿȆçnï7›W³AHÐØp´Æ\bƒ[FœKTùÿ^Á5áéÓ°¼BÎêÐñÕ+ä|”ºŒ——¿Þûð^þå*,_ ï÷áúŸp¿Êc÷+]î~˜7îÙ QŽN3£@.)"¹FqÔjTdñ80SÌV'Dà¼Û?ŠÌŰ3À¾ð,ÜnwXíå¡^¹=½^: |ÊáÉÓú"‹åóû×ûþù¯ëíï‹åO»Û›áö`Azåv^c‡„Ü÷¤ …9‚l”(&€~ì|–Ù½ØøþOw›ax÷ä~»_oþìκX³¨DÖI5*:ŽåÕov·ó³Z,ìM£7¨öÑk‡˜!}é¬êáýz?Ok6PÂÅböm£0píòy…ÿ^Íô¯Ÿ3ãØPAXRô’ÎEbm“ôõSfSèõ*\,¦ãÀ\5zs5 ”–=x€9Å"Tsùd¢:ÆŠŽã{ÒåÇäSÓDò©íù=1Œ„rêI8T-³Y¨àÔ£óÙGEŸ/‚h¢áF#^?Ïφ76p½^ÝÍ$"Ë`žöAù‰‰>£û_7Ûõv˜§Ü½C³óŸRôæÊ…øSŠ7Ã~¦b í+åþC³-‹wˆ–p„Êyzx»»¹ß Oîv·_1}|ÐîD8Eó×ð¸V±ži\%ú ‰Ä&ö…ª; Tš@|—€4Q´dã@i}¤"¥|@2ÎMXcJ|ؘM§¼‹i®é±š\NsíÔZµ—µcåƒîñ Ïe7 ¥ÑGãŒzß°OùŒ)ÄÚùC~»~ýäf}÷n³úcv¾g”|–Ú[·ÎåÛêõŽ )çW;Q:³²ß}D®õÛö”ž™p6ûeD¿úL$)ßV/ƒBýÖê¨{ŽÅçðÏè¾Þì®Ä)mJ3u HÑç×lãÀÞ§6rÃ7 ÊU›$EPó÷l¤`Ó#†ñÛ¤/b˜¶è—Y£±z2Q°uöq ~½: d¨.4aE¬Oö…÷Ça›*z\ üâíÒbàCèú©œj€ž;}UgL™ÔüjO¢g›s#ìÃq¾ Ù¬Þ¾¾YͦE­-ŠÇ<ýNc7jÂ7SÉ5Eó‹ú£Þ,ž/üY½è³î·_¡»ô®ò¨¶{÷s[öó]‹‘žÑ.0æ‡f~Ë[Pyhо~²h?©¹›L-VmãÀ,BÇ¢9Ú¹Iû!^í{^Ê?¾%¦Ëéœ'\‹>iæØÎ5Õ¹"”'1š:99+j4}×H:‚:#mJ.‰Ìÿ:$ÅáûO?”ÏxR&z=ÿ£‚'§ò&§ò–mnyÖØ’ÿ"W£ÿ>ê—ŒTÍ2o…¾¿ÛïÞ®ÿ³º^ífÒ?e¿= s‡.Y u–?qó•ïÐõ³_ñŠv„LEó7 þ›Ýxö^2Ì)fu(UI?þ°”…& endstream endobj 1152 0 obj << /Length 2429 /Filter /FlateDecode >> stream xÚY[“Û¶~÷¯Ð›©©ÉÞÜ7»Û$o<ãnêtìtŠ• ‰.E($åÝM“þöž H‘ZÊÞtÀ'󓧦×ç¶RÖ¶éJóëÊA‹kL ]æ®WÎ5kh¹mûûÏUí½)ÓÀa±cû/Û“p;Êx84Žûšc[Vw~¹w•`G­qUe׬±wÔ>¢Ž•Îå79æñÔ:ÞÌ·ŠvÒBB1b(ªz! þnK.@~2«•mÏ4(pÅÆ¶þ`«n2«£ÞÜŽ÷W£’ÑS-¢(Æ€Ëe=„°×ã 5ðçíì²i$äP]×ã<šÂx×…—Fø§`qãŽÛ?ÀÞ{ÄTü¹ˆýdñÓ6IrØ ’L\â§^+©ÍñӳžÀOÑD@p|¸†ÊwX‚£Ã%=ÂË&èãÛ¢âÐΧ§ï£äºÑÓZÍwÝsd1š½·Øcýã0è‡9 }ûS£Ä K‚ ›_”þ…áÇuÙ Œ»ÚO«Êm‰‚we·›‹5B4ê•w¨ï«,4÷e‹•CqÜ›UW=°|çšòŸgT}$%¿Ãï)¹ÏÈøïC•å¼Ý Qä!‡Ô²GþÉYó ¡ÍÚé:º,û œ º÷K&ƒö¡å린7^ =ðèŽÛË×@æ„®¹eCÚ74›~‚8Íñ¦ªÞÔ¬7•èùLh±k€^Ñì!Õ¨›$Š>Ü ƒùÅŽ-TAž!é/ÏCø5ÔÌàÆÖ/·3­ÿú‚ܶ™˜}ËaàO;Ðß Þ‹¤ lK•0ñ*ÀPÌU .¬‰PjbVøëjL­,…Ûºø¥¾àCœÒ·ô,4À³›cÅc:+^m\ýéX{f‚‚KdäÂ'€œ,Ï¿ÄOoúp§,N_w†?eøkÐÿ &ו endstream endobj 1162 0 obj << /Length 2153 /Filter /FlateDecode >> stream xÚ•ÛrÛ¶ò=_¡·P3!J€yKm·u'—NOó¦sh –y*’‚LìéåÛ»‹]B”L§ÎèAÄb±ØûrÁO®Šh¥c%T*WUó,bèïÏ$…€Î0¾½zöÍwð)#QD…\]ÝÌI\mV‚³r¿þxõãJæBæj¥Dš´ók¤bÚJªU8Ûª‡q×­Ã8Žýr&I|öú%AJú{]·Û±Üš—I°1>ëš²Ýt–V›Žv¿7]³Vyð©6Ÿ×¡”E¢™æxý³‹+/_ªÔ¿(1h@«•ŒE*` dy"dœ0Z(!“b¦™ Æ:Ü—­ÙáÍ :5WèVE"O'õ¤‘ÇvÂüôêíÅë·¯Þ\LtíŸÝÍÍ_´ùáýåÛówï?Â1ÉÄì’j‘­B`SN–9Ý$* ºÿ5èª}>hSÛý®D…ÝÓÞpkhg[B°i >ZÓ‡u‹ Áô7eÅhŽk±µJÀ¬!ìÚÒn½m»ÞlxÁ¤¼ZPŽOb³-c9ÁÙ¸–AßÃíÈ‹™ÎÅԹȢ H¸³?­ó8˜´f—Ô¢ ¡Š|Â/{óÒ±JÐW%ðQ€[²%·Ç^¥yДÈ?à˜<Å  g8ÔíÐ'e!ƒ¦#"!űV-{ÄœÓáÛËýÞ2e_¶ hD™Y•fDŒ=ŽŒr_ö¸÷Û:Ñ ,XÕ%ÉÊDfWU ó¾„óRjõÛ:¢ÀÁˆÔ¿±º«··bˆ:˜¡š¡O¡Ó]Ûjì ’(’ÃÊE'‡ Õ‚¨3R·±Î›ÕJ±Wµ¹«-o–-»9ÂpË)€NÍØ”àáu‰WIZ™Ölý¾cëôCmìÓÄ«º“»’_áQvž»Ú:èPâ»EJNõת<þØO'pG€8 ®a‘—oñ& ¡onÊq7¼€UNq¿©´†ô¦¦¨ÁëÜU ñ•¢P±/oœ’"Ëå„4t¬®SZuuâouñf‰éYhàó-f¨XëS]ÀžÊ~ÀŒ’ê$¸¼áxÏ¥Ht~K.éű ºýPw-™Zïk¨/Hò3íÖ–þí¸ßïj³yAËrIR©#«ÄËÐÙI?¢¹$Öfµ+GËì —±u91yP'äõU!Äc˵HòC59´P+Qk¥¥EkØò¸Ôì»\Ó\;Ðׯl–ncÍ¥0ã>+ ¸dù>b2Gb\÷”å,Þšä*4ðíÆƒ\>¦2)¥E:sî/„P&táÛ ²Ì§ºïÚÆ§c¼ ’{ ½Æˆ»åСݒ<☜ÓÃ<€\Ì ùIN rA) ל ÇÊ÷¦¬ÛdÒm<×mÌGpLhöõ΄Ìw?í†YΔ¬\âÌæ‰SúÄ ÑÖ OΕŒî˜¸<'ö>ÜûgÛ}ÅúG"ê9~LtÓ(èn6:ïÀ/,]kiœøs‡ÀÆÕ®n¾LÐÑgwÂÿ7Êsx^Í\‘;d‡7/ÏÅÑ|Êü_Mm¢5Û±¥hÿúíx4àAOo©1Uýk$“ªœÆ:1ðɦüÝ—EÅzU‡f*¹€©ÃC‘ÒI$ôf[ö˜ÿìÂ8úL$ÃÁÒuìA8²C½¤®øAzŠ!=ùÒvË „HRßßBÚHÒɵñ2”ÿ¯é:ðe3±A/ …—âGò%qÄ"ä,"hT‚Ð/pàtù&¢4rJ÷ØŠ4ò¢Ñq2ˆ›5Gaê¢p1 AZ“¾ A,ꦦØã¯qƳ¤ ‹fz}Á4ŒÌ€rùa%-+t„Û²ÝZS¸ÄøÆ€Ƈ0ÊKqâŒw$óô2иÁòäA"®Kkxí¦Ô4‹ø qo»º2_—n§hò°7ƒVÐØ§æ8Ãø¾M8{÷æÍ«·Söþ¬Ë=_ѱµþÉÝ5gWL¡ß†0!£Ðʹ]ŠóÀ¢ «±÷|Ïç €©äI-ÆJ£¢c‰ðÖƒDt{ãz;Њãhšc`ކÖïHºzª u55WÓ+ÈpÛYö€‘-¸®iV‡NHU^ˆz<˜–‹ß?A0·5{"pB´ðL|LÈqjAÝq´Æ™¶ú›^œ¦7`ð›Ló;çôÚè^4€Y÷a‡/xŒpÏÊîô¶n9ÅÊ$:•$ù:^<“ ½Î%#}>—Ä›”ïü>Nè— endstream endobj 1172 0 obj << /Length 2202 /Filter /FlateDecode >> stream xÚ­X[sÛ6~ϯÐÓšš Qoé“§ï¤õlën¦ã¤Z„$¦©á%Ž»Úýí{. EʬíÌtô àààÜðáÊ…?¹H¼Eä+¡¹Xí^xvöÒR.0¸#Žï®_|ó=Ò‰—ÈÅõz,â:[Ü8¯Óýòãõ?22V %‚8ᕞòyI(©îh)o»¢Zº¾ï;Ñ«¥«uà¼}ýîϤü÷./7]º1;j'3<ýºÚ¥eV5<Ê*^}kªÝRÅÎçÜÜ-])­$xü‹7׃}RO89x R é \`=ÆZH_³1‘PBþÒ Båt{PH9YÚ<¼§ÆÞ÷*)p”uQàu{b&snÚ|gšÖìÏËß³ªÊ¬ùLÒÊšD"ˆD¸pA1ÙÇâ|¿/îÁ±rLºBlqä;y¹ªÍΔ8Õ¦³ì*öÍGN»”NÅìU¹2b鯉t~iLÃì½j<Ê×Vr{f×÷µiì <a¢ð{VIÖ±¬Ê?M]}ËWíÖÔwyc8Œ•@‡Y;i ÊYž}]°Zád›W%„+­M)S¤ûÆd<¨Í° b;rP—=©Búãê!u³:]}÷U±Å]w6{Ïp//XŸ¿'ØŽ‚£ÁÆÉžåiŒ4S-" "%Sh,ðÞñˆU<ÀÃsÈŒy7ŒÕÒfÆ(ˆ „ Äh=pÎÑ>Jn·<¬Öü4n¹cMy‰kSuÌÓQÊ"uL=$P-mG ²xÆ%Âðž¶#XS“Ï-8¥·Mµ8Ù;þÇüÿªD 8ï¶yñ(ªøÇÌc^:îúÍÏלqß]]üúŒc)—­©!y_Yf=fö©¨wùœÝð‚Iˆ•ð£!Ƥʌ<•¥‡c<ƒ˜ Æ"@ Ž5òÂ.?vªô¤ÐQÜ »1S~³Û÷E¢{Æù¨øž>Däa`B˜^¤¥/Ÿ ´aÞ_þxqõþùð3#¡Yåë{”8iÛÖùm×Ò€ñP’¸ÖL|JK¸LÓµîöKž4b·\€»•ÒäÚݜÀLÞæŒ¬cñ¸É_²È¼œ€¨…Š<çêêí;¦Þ“ógpÜÜ[äú‚Z(Èß~O3X‹ãŒõÝÜöC!墙Y§]Ñ΂DÚ†\>òÁ“z•òAöщÂßÊœH‚@0@† ¦0@Î ¤³îðêjÃCöÃL@kHcD)pù-Ú~Z·¨8R'pï"‘„X—€ ´6*]z&÷È5S¿ˆ²ÐûÁó½¥ÖÚYýoxž“V¬¥yºެÒ@ÂGºtªïˆy“—)óK_ê®u( éQ«™²«gz\wÈIáéh¢;$äéa ü8zÜY=ÓNE=ÃY‰ä„ðe$"”?Îþ›Òܹ#/ÂíèE€©ÃÆBù  Tž1àÒ¼{.wÄ6—'Âz\’óø'#+õþEþÙ÷j#x6ž‚¦Dö>û®—1¾ðˆaèl& δ۴eªâ¿UW7ˆ†Hg\ì"¹«:,?‘ć›þË^„]è1“¤­ù¨‡pp½í÷Òm/Wˆ„sØ×—±¯ùŒz›¢Úï†ò™2£«{\5}AQf¼©—RV–9ç:ÔÊÒÉ&çøà Ò®àXüT¢’q cè:oŸ]/÷ŸUµÃ®í€Q2m}àKphë´l@ÅÝ¡<’ü8no«/ÿi ~¼úáÍÅÕùOÿúåòßW¶mº¼8à‘ý3*„À<úhWS¬wU]d‡®Ì?›º1‡ªkëêòâ+êíÞx‘2Ó¬ê|O1¦ ‚z¥R@Q8è“spíÍäDššøGs fWÀóŸ-Ãÿ+Á,ïÒÆnÚ§58Î}Yéiép+PSgíDÊŸÚ¦¥dÙñ˜“¸û8ñèü7D;ö qЭH†žó©# ‘ikeW·˜2Î'ƒõù\lp¡©EÕ`‚ª±­šá?ãÑ´ß–:‚þ¶„*€0òtZ@§ñ$ãAÄ!tHuѪY÷xÙV£ÈÀ˜PM@¶S¡i3çùIõƒï¸ö@hÞn1 &H¼_ÆšN‚À†v0)? #ñp\=žI5ìšÈç©^òHuõ0u ô|ž”i–6Ø}k…bÑeŒ. jç“vCLxžzt&//^1a«Édf»ÒoæÆ }YW˜†Zìèx›†™†Äñã6ãu{™fB=’iî{Ðc´ lZ£¾<ÁøŠî»Õ„ã¨&¬YÃì>~@«˜}‡siÉ3#Ë`ªù é˹¬ð¡6 #ÿÑ´p{¦©M2GôÁjäÌÎ쓈j-XÇ4_ãOéiݾ„> stream xÚ¥ksÛ¸ñ{~…fú!P'd ð%å›ÏvrºÚVj«™^;‘„ E¨|Øq}w±€DÉJ.NÇ3&°»Ø]ìâ£þøhòX„"å£bû&rÐÏo¸[@ (~Z¼ùÓXò(œFS>Z¬†,åèŸìRîÆÿZü2â“OÄH„édJ˜_#*\Œ‚Jw}eÆAÇ,?’$e/oÞDÒçF×ë^®Õ· +/ÍVÖ¥iiWÂ~Tf;ö¨ÕÓ8à|šƳÅ¿¹^ìï— ñ;@ŠÈňÇa&pÈ&IÈã„.“‡"äét¤™`OîTP˜íôå¬Ç‚u-ê†CC‚¥Efyì­•FƒÃuçnx7¿½¾š_Üÿ寳¿ÍÝe¯ç·³+Bš]þùÓÅâg8Δ#w¥y˜О§$ÇÊ“‹ŒÍçop•²ËùííõÝ‚6f‰Wa¿©­Œ„º&L·q'½ÜhÕȦ@ëoðß3‘ÈŽ¾îLÊ*õˆhU<‡±9å\4í´eôh¢˜íd·Á˜Ð­1æìj>9»¸GZ4 ~ç!‘<ìÆ U¡xRȪzOböÅFþ¦ÄÖ* ßÊ:렀В8. RÂa–ñc¥A°€x³Ÿ?)8f‡¸`kë»|ÒUE«­ìœ½ìvpiÜÁ¥[Z–’¾+ÓÀ¥·´ñŠÁrIŸ>yüM5þèÕàìi£å ôÑuQõ¥rBeM^ÄËÃÛÒeDzê1§13+ú®Ñ¾ÑN—6UkåÚÍþx{|6a¦mõ²r¬W}ÓÁµA]ÚëºÔ…?·y§ßýædª®€ÛfB°ÅÆÝ›ô\ŒÙ¨Š“‰5e£º¾©AŽ T>ÉmÀ#ï™ÔåQòDc´ŸÏåžÈÂ<ÚSaZƒuÈÈ\·$LÒ¶ÒmG+kÒ¹Skk¦·¶ì¬®-hÉ|ó«g(›”äBÅl’$Ç6hûåN‚y1ͬ<üJúl€¯ÏéÒRˆó9`>¢èU L>(uWª-éHg4mÌ‘0Å®R_œtd’Z&@¯Ü̘µG$ÝMnÏØìîaáÂv²,[·¢O ‰r¯™1TL|i‚FFP3+µ‘¶—Ørд²"*4~[ÚïòN:$S£‚sq·u†B‘&$]¤ñÀ« °*SôMs°*l-…W¡ÙyÎfºì­§¨r–_£ˆ¡‚D7­* ¼<äù‰¦ Šf ²)[6r äÙÄih§•nܾUÿéQ³±"<- Q:‚BC¸)æ1îmìÁ÷¿ª1NŠ©•]qëiDnç;k[wÛ.éi§jh÷µJãÂ4¥Í¨îi£}Ev¤Ï´²¶‹ÁÅp—ƒŸÐ„ˆ-û†Ò Ö/ûàËÐíN#ËUhêÚõûƒºô¥3Ænèƒ`£ZÕ†{þPŒÜ\ug:å[5ä*õà.±Ô º±­´–$D!k™ºrÈ%UÂïdkUAD·iL¿Þ Ø;"?F$P \m; ŠmϹjÕWU­9UåšB1r,`ä:L"N"Y>tRØ à¹½Ú•]'‰Šp*@ȱÛP–ñãÔ=£'éC+}Ô’AI¨<%PžŽ!ÿìæ¢-¡ ­vÚ•“´5‡PÀ4Î6oJ][7!;d SjK1©ö2ºpÞ©lƒÌ¸M"ç¦-7{5Ï݆(äÊVœ8‹ØÛ?¼%˜©Žà•®• QÚ\€…^׆r ‹l!抚 d&«*äÎ´Ž¥‘%=cp ÐÁ©µé|x£Â†zµ*Cê¶Çcy@£®HˆóÁd¯€Ád¾)•úÖ<žœÎãîÛ÷×fÿ m^Læ1ûùâîêæú»gñ¿Ûf2ÜPÓùñeøèk(Y•ëíCʵ&ÏÒcƒF#¯/Ò§Hz4˜$"ŒÅ~2¡‹ ›áD³ù¹Kð(“Iêφ$g±Ñ”DŸi8‰òÓœ¯‹NÛà+Q©Kö¹.•ó<ºDâ+m-ÞË~½&Aß:ØÊ5Áy÷51Á‡1Ñâ(ÂÙ®yUXÀ©]óÕ7TˆOóŸ~¹¾\üX4@$ÃÂû¸¦íµ£Ã™X- (_ím„¤ÖMv5ðìjÍÎÙÙ{ÆKÉ /Å_ñ’í/Àù%ÈQÖA wû.úbi­ôRNØâþâîáÃüþö»riêBÂÅ%6Õ ÄÂôþ@| :|L Ò·D\ lÙȺ%ðþlà£Ùöq·ÛUgDzñx)| ¹Ÿ@Žx!`v…7}¹ãs8Î¾Æætàÿ4ü…µ( o[ã&Lû².‚·Ô<µoæý8˜ ì™—!á‰ÍD.Kóxï2\]v.þLÀ@èÀ$ãÇ…ûFKÛÆ?,W°°C/·¯~× [ÕçãÉ_5»zÛÒÊ>-üí«€'Šuæw#çõQ‘œFêý}?i}ÙÓÿpLøyÌYÖÿ€ÅÝ3àÏ{›ü™† endstream endobj 1191 0 obj << /Length 379 /Filter /FlateDecode >> stream xÚ…RËNÃ0¼÷+|´%l¼›wo%PTBB9ñ8’–ˆ¦®èÁ׳ö¦¨H(‡Ø3›Ý™Ù€°ô€(¬È"4˜€xé¶GßП4胊³jp:¦#XSØD5;lQÕâA–Ó•zª®ärh’¼`æÑbÄ”A@¡¨v³]8¥£(’ÙPé8Näey=ddʯëv9ßNçM篱¬†K×M—µ[ó­vÌ^6®S˜Ë]Û|( PÄ(!?~pQýøKÿ ÀWüJ C‘±AŸ@šÇ¢˜Íd ¤‰ÒIŠòË BIjh4e‡‡ÙQ¸hMJ#ú€ûå\×ÝèÉ9ÛÊêöŽxèÛ­ ÉL*4)‚ýîi*¹­l!KŠ@ŽnHíO“óÆCDÛŦ]->)]ÁÒ.ÖÌ>Zˆ›Eͨ›ñ›õô³ÿø“ѱ  ñBÍŸ(ƒëW· MC ¯² ?…=vÐ/}Å>Öí¦Ý©PòXáA~ßãÝìwû uU¨ endstream endobj 1197 0 obj << /Length 2412 /Filter /FlateDecode >> stream xÚYKÛ8¾çWôme VÄ—DÍq³ÙA“ÁÛ`0™Áª-v›‰-’œF.³}ëAÊ’Zît>ˆ"Kd=¿*–ÅM?qSf7…’©4âfw|•…ÙϯDm`;¡øûí«7ÿ„¡ÈÒ2+ÅÍíýt‹Ûúæ·ämuÚü~û¯aSaåL-yåc&/¥RÈ›ídÉçC»Ù*¥ûÃf«µI~tíÑ ¯zžÿùÏɲ¤j·ïλƒ¯}Õà’ÌT!‘KÜùÕ»Û‘u#å7dCŠ'ÂòFÀŸÑA¸ÜêT(Í|ÚÍÖärÎ[a’Ÿ7Eì³dxZê *mš•aGÜj#mòÅ»GØ,“I>@.›´Ý€ûg"Ù#ÅWžuݯüŽ?¨ššÉúÓÞu~Wx¾B`é“Zžxg‘!t!”a«pÖãF‰;øgeÂB¹ªáiÚ:ç­Ñ¢ ”P©ˆ>på t³-¬Mn÷M\$þs4´Ii`#·®çéjˆ” º •º JÖS%K V- ðEü|¨|³f •¥Æ‘êT5îÎí‹÷mÇ3½ß<ðË%Ø»Î5¨±ô°•…L­‘suDmmD߉d®~ݰ8LmžrÜè´ÔöÎÁ#Cä¼G‹ظÚá{~«Én0*ÆáCpZ׿Ɖ|ºvléœÚÂw¤L½ÑÕ?¬*»°ii£ñÝp\S·Jm9ªûõÚ^y zˆÿî6|í“ÃÇnð_ÜÚ®:O­¶—]mC1±Êjªµˆ´oÛfËfÓ™0Z˜ l¼"H–Ú,Û€[PЯ«“ö ççÀ-E È*Uóàø\G†€ë€?tä  LMåÀÓ~ØÇhiM:)A}#_ZÔØôŠ-äEkw]‹,<ö®ãCÚæÂîÊI…IåhÈ·ÕÑ‘¥ªUóˆ´fciTºJ ,±ÒyýÝÅ•^‚#DÅîÎpbÅ4û˜ ü-ÆãcÃ/Ïæ÷ÇO*àñm´Oíî«óaà—Ù.ðî{~V„“¹c æúSµsýH·¢=Q‚ õ½0bfަ°ßµ?}ˆÏ¦³/ødQž( –FÃXIÉrîÿ€™[­"Ú©2éa‡0ByµB8Ñ9‡-[¶¡%Pœ›Ý —ÂVvº•xª½4]Õô{ƒo›~qÊÈÌ4»MSгhôw¸¿ê©RåÓœ'Ud^1g™¥Y¡^bÍ"Í3 ш¸oˆgÛ~àѹw÷ç3rñ>ð-$;)®´ Ž.~:p\ãDÞJ<ÜÑ1Ò¸šÍ. MæRÌ4ÇOf“¢£`$B¼šÖHÄFå´öÀù3šOg”Žö®BVq /¡ÏâÂã†RÍg~óa-Q{²Ä¸yØ»g úª–Õµ¨N^–VŒHmn¦ÆR6¸Ÿ gÆ©j5Æ¡(.ùœS”©3ÞÝyàMïHù<SÁ= &á´ïO‡ŠèæÌˆ8?6Ñ,“bi¯&E(xm^L²âõÌ›Š4/H±`BŒøýBFé¾{ =rÀ°€~HîX³0 ^“ߨŒš{ë¼D6Š=µ`Šk)MÀ…ÅæßY{€“1Fô,Ky©‘…ÏR÷üZ1IÈl0Q·ü€;w^ñÙ8¸HõU÷•_ váy¬>G ÍHG˜ÿö3¿îÎG9dÌm® ªÓÈñ ´¤\$ÛSÕU×Q_nU{?¶c TÊ0^ °êhÓr5†£©8½'…Yöý¢Œi,ÐâퟎâþVa'†•³{ÜR´Ý>ÜŽ•Ķs÷¾qëFßÍýñíOÛãl“ò¿` DÄ^mµüKA”Pdƒ¿ÈÀΖøŸLÒâäo…Hµ­üo²Ü,Hõ1SÙFkì&±Œ©L…”üòÛRzÀ ݸß_3”ŸÈ)éëßÈÙ—òh¼ò@Á3atåo’Hõ y–›…Žç,Ð=v“$q@UÊÐl–xa 7Cú '*l[ðø™?A¤Œ=NÊñžg˜dìˆÁà¿k& ƒãèau5To°’³ÿz‚é¬ËÆ¿~Îwco ]ËsÅRÛQµ|ùƒç²ái'„GÐMM™üä9ö¡#“—1ßÛ|vyÀºÀ`*ë§_jç5y30´(¦ò»I/3Ú¼©4T¾éc–ëI¶1NDÇÛ~øKéѨØÔ½üãÄ•:òÿ–Tæ endstream endobj 1202 0 obj << /Length 2260 /Filter /FlateDecode >> stream xÚÅÛnãÆõ}¿B/E%Ôœrn¼ۗͶÆ ¶ˆ,¯Òm±¡H•¤â¸Aÿ½ç2Cq(:Ù æÌ™33ç~ÉU r•Ç«T+¡¬\mobýñt£¢ Æ»Û7ü e,ò8—«ÛÇé·»ÕÝúë⸹¿ýëJfBfj¥„Ír^ù+ÍKBIµŠ&KÕpªÛM¤µ^ç_m"cìúº#|Çëâs,ͶíáÛb(絡W:¬¯Ëö°QÙú§ª|æ•öÄ+»ä»²Ù•Ý·E³‰² æ2!ÊÞüùvdÝ*õ²AŒ á¤j%SàÏ/œX‹81Ìg¾‰l¢€·MÊâ°ÖNÙK-³·É&ËžCX$úáKjé9qÈ$â\è$]E …\óÝgža®ÅÈoP`ŠwÌähõzÛJ$Ūõs5ìØa@û¾< ÁŽÅv£Òõ›¬‹'¿uØo­ËA/xñÐSïÎLI:Rg´üÝU}Dƒ¡J-¤7Ãc]à‘/€•Ç3²|ýÔÇ}µíÅ&J¤¹\¯zÞXðø>”ݶ*j^>þ&’¨\oièûöqÀ»Ÿ‘â¢+ô¥GÅ.J„þ´AUWuñP—l£ðL£O› L¸~슃7ß¾,:ín¿bãþÐl+߈ܸĊ4v—ÜîËÎÌ$ÁO%HžW˜b’›s©Á¹ÔÎa ûªçK¢\Ä*/‘(Î$^zSÉÌ T"é<\xdPÁ¯žµà)výÒoàïˆ.S»ª†a?^ÃǶ; ‰ÑI]ˆõ݇w<$S¢3aGMÙAî¯KÄž—ÂËjïäº+‹S=0 tb‹¨W¤ÑŠºfˆ~Ïß³p¹= ÇP8ðéwáÏ‹”‰özÈ 9Çý æÄt‹QEÝ·8JدGùᥫ‚ÛÑ;#…%CÕ"ê™zœU £M"-‚?Ç6 ÀG²¶ŠÁÔ³ö^7囪ْ¤3/ò|Ô8ÛG†…N SùæSsrzÀÛU`^ü¥A‰¸S½;æþÒÌœ»þlKýÕkŽv¸Ý C§Ñ–H5è‰N:”þ%¬]Ï¥—}[*€…¡+š¾›'„:ÑN´S&ÜÆt#Ä‹:JMÖ½I§æn,K ¿`ØCW=œ†rÇÎ8*ø’²± mÌ¢¹m@ BÝ^Œ4 uò4wÓ€AÎ_;2Ý6@w¦Ôú] l”éLù®%É ×”@[éün§µÎÉ §©u#þ jž«½&œzçÐUÓÎu ÅCÏxœe±0B›Da–òT*b骞\H®¾ï™Ðt¦B .å?•MÙ4qæL/µ.öKI=¦´.U6¦¸.–sWG ZÿÝ ¦'$¹Ha{Ìà¥â°t“íñ~Ï×€Z¼ç¹çyÀ5¼Ú% BE†Äcþq4‘Œ@’¾¥hØ©áȇƒj€¬™€Ÿ*¯w›Zöm\ÇŒ_4»%¡H›™&žÛ·oÙ^—Ž…à%S?8RBqÀ/Ôm±s½#ël\ W$e’’FŒ””"ƒº/Ã'”2yÇ{ Ú›ÒE+«£ñ±ªOV ‡ëjñ °˜‘×Q gð„Ñ´î—äC“Xâ5B!ŒLÆ…5Ê-“°† ¸ßvÕc„¸È‡™¿a\l"±µ0VA„J&΢ÂJû £p¨MåTýAµàKê`ŠC¹[º-3"3£´Ü–%‘iÈ9Í;…¡&€s¨ò±€â4PGˆ†óx€p®TQ»ãðXíJ·gX¶; *5£_`ÍNYcI$P´d—šÅ³'é/ï¡~p· ¡j ¦“‚1wÙ· ¹ïcA9º,Fg ½|ÉD7‹],»¢X†‡/‡?ðfcÿ7a+2JrzÃvœX§ %ã÷¬«ºßië³ d"…Öê‹j§q'¹h¥R8º Gorh6H³$gBÏõ1Mj %?òüŸ"™æf}szèËžJªsÁuÒ ß(¥™AçX 6:¯ç¦óºvÍkWþzV2)G”®„în‹©~ÅÌ# 2Šu¡ßU"=Ó ž¶ƒó·.ãfÎ)ÒÊèR3S²B½š¬Ã/‡ jƒÄrɤ‚jà¬jª¡*êê_ø €Èóî$•íùÿÐÜÉ{ÆúêOü}ûöÜ·Q¢«úßêvÐïïnªæîg†üÁI /÷÷Ž_~¾ŠÔ•ú÷Õ//<¸Îw±ñãi¸¸ ºvÜé÷ÑbxºÔêíø1yktïÓ'/=&±÷8õ§¢¾xW¼x f–‚ÂÿLòh¼·n endstream endobj 1209 0 obj << /Length 1838 /Filter /FlateDecode >> stream xÚ­XmoÛ6þÞ_a*o–&’z-²k»Rth³ ƒëbŒMÛjeÉä$^ýöÝñ(YRä%+æÛ‘¼{î•b#~l»£Pp‡ûl4ß]Ö³ 0Ç<£.䡵§Á<ßlw•*µ0¶~H¡Ÿy¦{dr‚D€'¤ÆÒœ³+u»! "× E-<ò£y€É‹ÁxM ,md¶0gçÔ–•,*s/y'àà‚p#µ±*IÞ1Ï·µè;Kjû^åYËfôÚM‚¶ÒøçZmÐ/¥3,Yß Á%üž-×OÿÅþýGí?„‹=GxoÙ?ü3ßè9v8ì ¸õkI¦ÒÕcÁj9aF–Ô¶${a¦Þ¨¥Ü¥ Ä3I¾$8@8 0…Åãqíƒ` œSç¼€R´}DýžÈ·û"Y­+"cqÙ13…sž.uzÁÁ{U*YÌצp>Ïæ|'äa÷LÛ6UƵ‡X‚£$KªD¦É_hRº°°Iæ¤v¥ ë•!§§]sé—.°…÷¶PžÞ~â4þ–šý'n„¹»5»žá÷õÒþáR·d⇒©±ýaW,å\Õ•Ó£ïÞ}7SKkGË¿h[6 +!!40*KEuÜFGPÔoGtp+LôÖgU‡ö¦j§QõôâR Ã}wû;ƒw`|öêužæÅÔÜNö³ûƒÜ kᎣ£P‹ÿêBA꟫9“·…ºNòÝ1ØMf¤Ú§û0¾2¥DçĬy6{:ÚÞ±Rþî„ONÄýÑz¾¿ñîd“#PÞÿ§ç.÷ýÞsgLÚƒ„¡×ÝàKÛ<›+|ð±èãq‡Lu–õÍ#;kiœC‡xœÙä…éÁÓ4«4SݪW ß(Óð0"%åó ë jY§s¦ß¬¸°€yœrJ*ÍãICÒ®›tÍ»"M#EX\ª­ÎL¦ŽÈÉ3‹<5÷[A3(—9¶¶8ܹ+MÆŽ•" ôg¤'”vMÛÎ@‡ç°y¥’©›‡n&7jBÝßP•ê³ìâøNv”‘ðld1~ç[õbëSPMe·È¾•õÓ,–ê£+ܱçÁóäoú¦U su¦”¸gâ~{øúµJ2# DŸwx9L„mÞ>cÕTðÞ?Ló>\'ð|NŸøÈ#¿y¯OÇ7‘—ApugÆß/’LMï ŸÀï~rÇ&ð»§ÉûYÓ‰Æ}+HÒÁ±8ö|³O£æ ?«ÿjT endstream endobj 1214 0 obj << /Length 1973 /Filter /FlateDecode >> stream xÚ­XmÛ¸þ¾¿ÂpX9g1"Eê%¸~è%½EÚÙ^¶¸ŽƒreÚÖE–ö$y_.Èï ‡’%¯IÑbåˆr†óúÐ|ÀŸ¥Á,ŠÏ²ýYàf?ŸqGùÀà8~¾:{ñ <`iòÙÕfxÄÕz¶ô^é›ùêêï3ž0žˆ™`*Iiåc BZb‚‹™?XÊÛCQÍý0 ½ô%ŽÒ»¨-¿ O ¸œs/›ûÜ«â{§[³?²´yÖ­”•;ÁTû¹H¼ÛÜÜÑJu •ÒÉúÕ”kS¿ÓåÜOR)=)TðìoW½”ß0r|ÛFQ"%]÷j—ƒ®B(O¯×Æ‘íΠpØ+†{ã€)ž€(»óm^v\# B±0RWsG&žÉr´œY“€¼œ:_IØu;ß”Kµšr†”ck«£Î–0÷yÓæå–¾Èò±³<άóæ¦Ðè‡yzlîË ñÞ´´š¡¸&½ÝlU↶®Šãó„3°¢ÏCÆ•‹ð¡»/P´¥x ¯«©+'ŠÅª7鳩뇈;µÙcˆé©ã"1dž<.ËŽ£‚[*åýnÚjAñx·Ë3Ô{GZç Mg‡º>¹58Ø›¸ª[BÆ;4»‹î›¢j6¥1˜O²8Ž€ˆX§½ï㨦ùúéâ-ÛOÝìÍ·?qû7èU F絡op£µ•÷áâÍ‚fŠJ¯1h&TäR° ì#ú)5DÌBчemÚC]6tøÐkV.-.ämC‡æ  š _ÓÔ¶Ö7»¼«5î¤GÁK¡WUäb‘w™íü³ ­È#pžˆÉþB·Ï]^DéÁºv!P³îJZ½×Ž·iñN´<º#.þ®KSèI§O8¬\&'¿ÔµÞ›¶Î³KP3|½üò!/—÷«4ܯž¿ªøúº M_îÁâ2ÿºøò@Ī«¢ë¨L0q£@2Ë®”J–&èÏYmf›³ºÚ9Žz«Ê`‘Þïí#Åý 빬 _û߯¿¡3»lB‚Bˆ¬ÛºD:m$’Â| òœŸœKuIaBûó½;þz0[ {ÜÜEÄ¿§ÜPƒ Mv : üé4P1qÏ{>ô Z²|é㤠ƒc}±0ýœìù°«î–?$«??ºëцSM áß NB1ÜŠZ— Äsü‘zpçüHÃá9FñaËÜ’·–|ì|ÌùI8†OY¦Ã”?Ê¢cÝý:Y¤ÀÿIÖÛj»¼ÒÀôB¬Æ—"-PØwKøJ"|êu#û¾\HHèÛ 8¤´¥50r&•»Ëú˜ÿ·9 "²ÃFÐâtÓE%©níSž;º9Ô(FB*¬˜ƒIúÀ‰# ¨žÔQi¦4[¨ž·óuئ ¹y;‡­¡U.‘¥‹¿?aOU:k@ “rì¦M Ã&þ_‹Mø‹-õЛŒ!GlqÄ調â€S,E*ñ^#’ M=W`N›Ûfóù*Ôêf,P±÷êPß"´Ä9]®‰ø`­‚[L3ÙNËÙ’ÖÜ·É*úÿL㊠”¸z(#AÅEEŒàK‘‚Î… ‘ ï_ »X´¬˜Ú2Ž[Sš@=}  9~"Ž-¦uÆ™¢/h Rˆ¬së%û…B”䀟à“8;YÂ{÷[·æýû‹·OT[¦+wªÝ†LFéiùž<Ž }Ví÷pdCzÃë «s‹×îfK°%¹Èåöâ”@Ä›Þh )?ÏUäé­¡`aªÇãhn?€¾:•ÐÓ}'”C`{Žq{ºhlãL@{ô[iMNp ׆»«N¿8>h¬;~}óó”2e2í7‚Ò€¾0™óv(^Ó€ˆÇ­«QÄ?Àæ4Ac¿ ÂÒw¦„ K{øGÂûˆ•À Ú¹Ð}9ù‰XŸÞqIœQ|#Jö†ÞäÅd dǵ˜:hôéï>q–ŒYп‘VÓÕ#ï;T¾;GBDJNž8vdyŸ˜hG2ßäÉœ‰ Ï›ÇKéŠõ<×p’}rIt³u.,JÃqž`¸š:£ÚËrx6{ÍCÓš=-iÊMì!y¡¯ Ê\q­¨Ëü^×ø­ŒY’¸˜Âñ75Õàõ!sGAq®ÍÞØ§!0ìòín 3üœ¼í(ôÐ=Ôƒ3âûß üF<…S¼ìâ1¤tŽqY;³®õ“à2<Ù|DËW‡k³\=‰2Ãï™GMåÉ–> Ÿe ‹Aí}æ^9?„«)…Q®üß#{$Tð®ºO[-‘pnéɒͱ ö%ZìÔŸL´`ø[Îù5¤D tT¡5 µÑë¿­|Šxš´õíT¯µÝx[„T1 šVUM*œÁǺuÏ,û£žŒè Ô·¿‘Ä <Ö)Ó¢ÔÖbÖf£EKÙ'úpoK=V} /Ö±W5 ¸³ Lp¤›"ˆü!Xú#å ÂÐ<{Fbš 0¼Ž°Pc O³3ðžw/ßÿÜÝc. endstream endobj 1219 0 obj << /Length 3107 /Filter /FlateDecode >> stream xÚµZY“ã¶~ß_¡ì‹9U#šÁkß¼ÙõzRv&^O*åòQ¡$H¢G"e+Ï¿OHj Ï&U©yˆ£Ñèn|}`Ä"‚?±(¢EËP&b±>¾ŠLïã+aZK˜°œÌxûðê˯¡)¢°ˆ ±xØNIóH3ðHm6ù¨ën¿+ë›ežÃ·HSäìÕûwôDÊdƒ3^Nš«PÄŠÏù[YëCy{³”yôÈãÓ ?ÛÃj9]ä¡L،ֶÄ3ó¿V:l+³h¶e–‡Qa׬€x–}ÿ;]ëÄgz÷ÔH‚êXîLJú`Úÿöñ$â8Ì•²eØWÛ­•„¹ÈìÌ/BЫL‚û-S_7CÛi#Ч™‘’Zëãíe‹4ŒDºXŠ8 ÓÛ—¤âÞ¥RãXUÝõåဴptÛ´Üßï«Î´Œ5œ‘HÓ>"‡J_ñ(LÁþFÀH¿zžÊKäLÛÌÍnYm4·ÁL÷úˆæYÒ!"ý¹&ÀƒOºÐtûW[õúãÝÛŸ^ÿ…·{}kÒü⸈“0N¥]úv&Dç94’0ƒ±éV^-Fs{ŠåÖñçŠ ™Ûh@m×óǺ©G%µ}U︟,S!QÇ®-Oûjm7°_’¿i;.4¿÷÷¾å¨Ö³™$IÁM›ÉyèpW d&©˜Éš¨zDtE‘Ú©eM•à)j†•5ØYÇl}I ÿèu[—žpj8Ù‘‡ü÷*S¡ÊÝeošÝAú/8)Ä1þÅÊ0c°Dž9‘óàý=˜ñ´çoyÏN°.,òLkvÃX´tm³àÀ"—AIÀì­¸ËNæ"èËGÚ»ã±NVP´þ¼ôUS› gP7ÎØóç™ÖÀ´Ö(M¢r¢]õºÚ>qOUó”Ònóû€+½Q™ t½®Jßhßí[—m¹!—q$ƒÒþÖüÛœCÒ|Áĵ®ÚÆÌiwÃQ“a÷¦‹qê™…É4LGü~éŽ9•®Pä $9’ßèm9ú)kÜöžšWµ¦)\òôúáe‘\¢TÀŠØòôš‘gi ÞÁ>õ¾öú¡"Lcwø[ækªlܹÞÀÍ¸É4À® ºÐ@©Ç9&èìöÍpØpÿÄ¥ÁHÉ —€ü$âÍñ&Bx¸ûúk†{KÛuyDMï-Í‹0Êäg;¿|êü2ph_1íS `¸e{xâž¡ÓÛáÀmwCøóЧH³0s&³ÜyýU2UZÉ]j!C-à½&ô¢­ç—›FVaÔ¦qï¨ã4hj<¶æ± q<µ8a Â…qd»} qV“»•%ÿ!`cÛ–;º~@ÑEI‚orâÁøšï0’éOlY³å°ÃÅvœ€ÍUT š·ˆ %"¶¤æÏfËã¾ZþjËsÍÇò‘ ¶ÏU¿çÖúWc`ÅÜÃaÓU$±|îÓíË ï*‚Ö ú÷f 7Õc,uõ„û²­ughVÜo>0vnô™Õl"ê-ÏtAWÈ¡½ ¥æÁãÆ-†*š;Eœ#¡˜L/M»ªî? s´É[˜@Œùà-L³$‹! ﺶ!^ïø/–â[ÅXAÀå(¶Þ >Ìd6ÞA‘ÙŒÝ5KnWާ³Ü<ì>W05ß1‹0/ŠgÇÜ¿|̽®vûÞGâÏT¦ÏhnwŽeïù³PޝêmuПOÝGQd”{ÚXjè—6»û}ÌïTÞY-’H‚Éf6ÇûÍD­^l_}ÏIÝuHmó…* ñ3Öwc2%1rìÁh8„übnÍoÑ+ȉãÇÊü¶ºÜtÜäÌ[]¿Áˆ›ŒÐ8cÀaf"ššy ôF&ï…´5ÚdnD£é¨ã$=€8Zª1n|ä }¢˜èã:90µBŒ¶4©ò¾2™2}xݳŠÃ‘•¥7”ŸÞµ/nÙµAZq1ÆI¨B.kƒ’ૹABÿÒ‰«ë8L3+ÊV{‘ ±ânÀ$æØ‹Z`“àp‚ZóxC†É˜§ý³Ó^µBê7Þ k¤bˆF7œ7§Ö›CƒÖQkÓ𯋷è‹C+lÙЊÛIdíÙwUà˜išñæå9¾0„€è ¶ˆ½¦ ÂD$/’s{‚¥@"¥Hᨗ&ø‘ )æ²psë¹´ÃÆâÎ ®Ú\Å“Lÿeöè´èßüG•*þïŽê¯ Hpß”ÀVijV~Ï7·Êÿ«çi¬¼”€QçSˇH Т¤èq×6¨ bYhÐ8µäE+PrüìhóÛ+¾8ÚœHFñåÉ.T2ÍW¬”e )ëûÒ3|ää·©MÔËÜ·e½#tÎ@+âE÷ðiI¾ã‹÷Æ$D˜FéEBT}¿U€N/€êü²I\ <â8LÆÄÐpÌIÍ޹÷DÇ’Íòq#*Î1ZÁ­Ùç¸9ÑÅS½+ÈÚ4˜ã±ª±fN¥Úr÷øò¢¾=4»=Ǫ”ß\fFø*z43H°Š@ÖØÑ_RÞÒº²S °z:mèR|î^”­×N¹òg[}ëO%ÁUçŸi8‰JÇXâC%ÁJz}<õüAÂU€ÙCÍx=1(«äLiÜ™ M˯ÆÐä›L‹ðüÝt3éÐØT(2äYÍ<͈Á2WÏ@œ:‰Ëce>½4´n¨¤³(PÆán°xˆ_F¹²7…Ú3e2Üp‘y®SHk­»ë½OþŒUM_GÚÎb/í´gV< ýžÿ·Çr)ìï÷ ÆvÕ'†4ŽÅÁ©ì:ò· œëEl÷Æ ÒŒªÒ<(]Ã]úÓ¡ZW==èÀH§{èýè&H]2g{ïΟ®!fŠÿÔ1ÐÌ ‘ox¿+Û€á¨1ýø³»@sT‰Q¢mÎXšbUrùžæŠñn´}#Ÿ<¹â?]ÌëkÕü ×u•ÉâT°¹`Ùévö¿1Hîé¡ycË»ÿ» F¬ endstream endobj 1226 0 obj << /Length 2593 /Filter /FlateDecode >> stream xÚYëoÜÆÿî¿Bj˜‡êîrùJ\ˆ];.j8ˆT…¬"o¥cÌ#/|XºíßÞ™áÓ{’÷9;;;3¿™9qâÁŸ8I¼“È—® ÄI¶{æñèçg‚[kX°ž¬øþâÙ7o¡)<7ñqrq3%q±9¹t^§ûÕÕÅßNDìŠXžH7ˆšùäIŸ¦\)äÉz2•·]Q­Ö¾ï;É·«µRó®6ëÏsÒOžPYÕЂi«wã\›3¥!¡œwºÚ­dì|ÉõÍTÍ”|ÈOºÜèúCZ®Öq }FÈÙ³¿^ W¤|D6¸âkáÈ©pH!> cå _ÑUß——âj›çÛ¿Ð÷åKú~üøîïîΈÄ.C×÷İI.6ýXT­ÿæòÿ&oöEzø¡jÚõ«Ó:×»´,O KEZK”ÕZnD\ls~Ø¡‚Ozhè!Û­¦©[f’)Î¥ yDï¹o;Îó’~IUU&¯œZ殺ÚÂ%XÑÒÞØOLŒÖ39¾¯íXå¹Øâ…®ØZ&‘Db*“^ÂV’‰«T<œ­³ê¶Ìÿ£›Ù•|§Ñ¿v(ʯT$]fyÊR6 ¤“¥ušµº†®pì‚…Ž¡U–§V–|7’Ã-Sf…Ïû² B'-:æë¦ªmg…‘ ¦Ãþ4Ñ'Ûya çEýêïŒÚ®¨A}ІÞß gfú¨J‘ÜØ©\¯Ö2rX-& ‰ÿ@ÈÍ” RèÔ`ÄCý]šáúm^j—\¡r¥¦/üÞÐHœt³ÉÛ|%˜hÂŒ$Îgpb@ã./oyb «4µQ3©µIé;9 Ç;D ‚pƒ°¢¥‘þ˜ºãs—Þ4ŽÎl/åGàØýARÕµ‡ÆPèQØ •ZoPê$.àÛ_–G\±aD¿7Â5C ¦›~MÚRk~søäÞ@¢ÑmK"„Ž|_ÿø¢º8i§×…žÓNVÕµnèðªœpÌNr¢gtš7{øï`D ö#¦KÜøØ8> :B024“ìéW­'Ë,à¼$f˜jô'Ï÷VJ)'ûhE\ÂNI­Ëóª«A­2ô|‡×•1 wß—M›pU"Úø^âìG\¾ÍË”©FryIåEnLïhÁW^ôȤ8Ò„ a˜â÷bb£oÒ®h­Š ^CúòëmÚ4Ý݈Rë‰R¡q28‚F/Š<­؇'ìÊÌÌš$A˜!Eÿg·úõ¶+?[ %2<:&„xjˆ9§…¤ŒY¸ÛVÔ0žUY0;]¿h&Zà ¿$PèRÌ‚¸ ‡aïa´P#œË›òOæaf€3ˆ²6…·M‚økQ\Òê0šÉBNò ¼©&6ûUg6BÉÊ UäzwVS†f,†÷¹Õ¥®ÓÖÄBpë´ÐÈ2˜(Öt0¶¼hfPÁÌc>‹Ážx‹ cÀœÆ„ô®c¢m¢žU”ߤð&4b\<6ÆT{9„ý¿è¶²1.Óõı-ý³ ¶órq*hï•(ð@DYfòì=MkZš¸FX:°=ázáB€?[s0wt?pÆVVÕmaÅBájx·=,'`Û³‚ÀÉJÄdYJ@ʉ~çÆ˜öÈ$ e^ˆ²Q3QÑ7¥ÏÄ&»àL|+–©&ŽLÍH$ÆZÍ0ïLËMOL—lÁ}F=°±~?Œ9œ„ƾ®àýv õ¬’Œ!XHâ?"KÌ…¢ÈN¹šÄU@PÖù£ñâši‚ü‚å¶Å*ÍñŒœÅ/ˆæ&¯uFñ8ônjxŽ¹àš­. 8£óo4 ]Æú'‹y"dORr‚MÞ´u~ а¡´ür²,H.€‡õ†èí:/¿y éú«'<Qm:ŠÓéŽU}`v*ú.‚Ãh¿LÀ$¸¬p8¹ãê]ß ]È»æ×ßš”æ/JH` pLôÛ¤ U_@‚w6õª&8<©õ¼ÐÄéTmÏ„”«äàæ÷ ÁV×9ƒ‹#…H/†<É_Œâj,`?Rº^­ÇBõ“J×Üå6õ(c÷õëó®¾I3Ý—±±{î&ð{º;dØ8={.OµîÜ!nSÆî°ýó±|B™ Ÿÿ¸kà3GÈî¼È@àz)Ímt“Õ9gçŠióÁ{0{D4IAû[Ï lÊ^}!}ŠA­s®·ö‹¬\VNshZ½ã<‡]GÂv²FÜoÀrÏöe3†Åkþœ˜>½ÐMçíR÷˜ãÿJ Ì=dÒ‡_-]·4˜ó·_ÄUbÏüîCCƒL }Ä òðú1÷µƒ¢=Á“'嘄Ð+ižE c]CÙ…œ£´©ù¤ü¤Iè&ÑÂæÍâgýk—sù_Åçc5 9©ê+5"³yþ`úû €m8¸>°f4ux¯·F¥ëÙϵnº¢}ˆÏñGÖ^3ÊÿýiêSŠ,çÛÊJ \ÚðøÚÍÙc-1#K‚ dÝVC0Áiþ4‘‚ùô l¶ XŠMumÈ'í)ÍÉŒüôþñ_Õ®éþ,޾ÔVZŠvÚ(tW¤”`†I±Ïì‡3Œ}h6múŠöÿ=ûâ endstream endobj 1234 0 obj << /Length 3059 /Filter /FlateDecode >> stream xÚ¥YmÜ6þž_±÷©`Çk½ø­w8àš4‹=´M‘l¯4=TkkfœõØSÛÓdûñGŠ’ßV»É¡˜#K4ERäCRfüØE]¤‚‡àíõ7/Ñ­-˜d‰) 'ýº² “¶H¡Es½þýŒóŸL¡>iŠJÑz9rê¶Ön Tœ<]"8¢¶a2¦(»›ªÙÛС¥IÀK;ßøÏª´x4ô›óp:ï†N+om›r8ÁøÙšî’öo;úW´»_mX/múµªõƒêkŽÐÚFaÉdJ–Â^¾’œ/û/>­`ȳQ+D äÛkŒäkªsœjyhìÈÑäsIžo&`'*ã8}‚Þõ¹j Ðò/+²6žt‚IZäþ é1 eK{~IòÊçÝÃr7“γRœ’Æ2gØL`5•a1_$Rj—Rl—l—°2ÙX¯µ$îÖ €lY‚Â#ZAg¯àop`)lòóøö" 1 9Z3ÁzŒ<É®õÖS[Ë,î$d®þT«Yº›Žú#ªIKv޲ç´Žk›N\shû!ô5ÈѺ5O0BEp¼©º&œx¢1Ÿ·Ñ®‡täbá¨æ*À4Ðö’囟®¿~¢Ú“|Dß[ÓPÅ<‚+¨\ˆY¸I,vÌz N”jС¼ ªÉ¦V[ctã+§o×Ö5øvOc Üóú‡Ÿ¶eÕh0*h,‰0ø›ŸõAÝUfE#æQìñÈÒÀõay”ÄÀ%Ï¡fSQÿöÛ×7ÿ¾êªÓW{«Ø•¼x íÿ_9Q 1îh?ýIçÜž&@Ò'°g¼Ä¯t+Ã¥hPëyåIøZ‘EXÔƒEÿ0׃q¼h)`uÞiô”x(§^ÅJQWwÈæ3&‚†IÆb-S"Ýuª«´»ˆ[fÐX,;x*‰Ÿº|ôÉ“ÇBùM3¿B–ÔqzØÊ8dÓ]±õV+àÖ×RCkÆDÞÆ¥qP‘ãNž:‚þDýÉÞ§Tf¶tH>+@\è€W%InùÃà·'À’ÏEü›ß½}ùêæíT,»jî´?C<³tn$àß]u¸¤€ j­zŒ++ÀAM¥;Ì€)Z°°ÙÞÓ#^,$§©ŸªÔ$aÿg0LšÝüðîößy+ÔR\Âgj¥®&Ç€îb®w ŸÃ:„Å<ÊVû™ƒÃAõ× Èy²®¯ú¡;|¶ÍVäIÖ,g#G¼V2Ï‹Œbf·ÎÜ8%©"2‹cIdžví¹)Gƾk›/E¨xΤò£D.¡*š.GmÂ\*7XÐ$¾$Ô0âÿ©kmLu¦ÃÅ¥ÉLøh=ü?˜ªæÜÑSÿ䑯ª(Ú®¤ŒåGkÿMæ¶ ímL–¡Iúÿ×&þ Ö_òš!¨Y~P˜éÕ÷˜‰Àÿ9Æ®ÿù¯1Ðï°ˆþ¹1æQ…jE€Fš¾Áì«Æ6P,Ö*qÈ913½<ßRÑóÊ­X¹ /A€Út0˜7õC»]yƒÌf×þ®ŽÅÙþОk‡±©k†±S+н§ÿR#Ú`)ióÇ_1išÚÚÜ^â¥'ðG˜´DS æûþkÇÃ٨,+ô%SeÂó(Ì 8µ½×( x’ØÊ{¢ô„ý\U`û‰·ÆöBÕ€´ƒjàU‰%¨Ì…nfÿ{jºíí­™j4^¨¨îMo…ÿT?ãÍ=›.ð½²aAé¤ •mODs°ò©±üpcÎ"Eð¾"³¥ÔÜÀÿ RP©×µ]¥àMI<ÔW8iqO¤_²Tôw‚V¸*ε²;F õeb«i3m«é¹¤Äìž §vµtßê$Ï$i©µMÌYáÅ–y°Íoºr\ïÏÁe G·[ôËÉ£ø0I{n%$á¶>Ë7®9¥-§{z4ŸpÐk–‘ýŠ•çé¨Zt¬{Z ÿ†ZzP;sóŽoLÝAmdû¬5ZG¾¿ŒŠKŸ. c®‡å%9õ?fÚ~o•Ü÷eß8Vûƒ9@û™bwöÎâæ.ŽÉOº|úS„¹{Ës'HŽwx4.“\ÎNWO‡Nõ®b“ËÊš…±ˆ§lcкÃͬµ°· ¦ŠãQæ…;&ïNï û&§;æœÚA”ÆŠµ¶»}Ť? z&ýA{Æ‘|&ÿÍ(ü Ðüé (¡Éfæv"Zg@ 9ãQD:oLBÐz®š7Õgô[33òâ=‰HÝ £Øww81¸•ÕõKä½Ìa‹ËFÕ°Pk€ë„pl^Ae1ÕZ™sT˜èé>¦:½W]iz…Þ¶àH`| -Ù 09ö¦m7ä”Ên…_80ÿ˜É ʯêîlJdû‚ee%J‚ »Bû aþvèÎó.Gq endstream endobj 1242 0 obj << /Length 2568 /Filter /FlateDecode >> stream xÚµY[oܺ~ϯØ¢²4IQö’4'Çm]® ´h TÞe¼Bv¥….Îq}g8$%m¥Ä PøayÓp®ßÌÐbÅáO¬4_e±d2«íñw«Ÿ_7ÚÀÍèÄÛ»?ÃPp¦¹«»Ocw»Õ?£wÅiý¯»?®DÎD.W’%¹¦\ƴŤ«Íh«ìúC½ÞÄqéß®7J%чƞO8Š\¨mÝÒ«¢3Ça¯+ÃNeI¨èƒ©k™G¥ùB;uO;•»äÖT;Ó\Õz“ç0©FÎ^¼¿ ¢'R~C7xâ[ÊI˜É*ͱ"Y[oÒ”Gw{®¢ÆÌã:I#`¸îhõXt{sDñ Z@%L‹“8*÷ñ¿‘o¸Vޝ•\²4SÀ¦½ñúúßÙÑœð+§±?÷ê5ÐÌÄYÖpl™Æí ÊáΩ°|}^'«ÆuKrTœsn2Æ„4v*Så5NË퉜|[~z¢í<᳎"3¦óàWWonÞ¼ûÓ›ï!Òç<&SL%Á±€*æK%¨c¯j÷uØ#¦j­Ž¦¼NÔ[>&6˜UœLBÛƒ¼ÌSt÷£½PGoi*¨6Oë\E¯ïÒ‘à´uÓ±ÑòÁW4MQ=G¬¦ßâäÔ5º…è0Uqt3kN颈‘üÝÏmufdðA` o 5°ŒÐ‡¿gÅîŒVlét)ö%d_®“o¿d:I‚Èd?³±£!1–G·îUl ¡Ìx2•»é«P z;;è Kód|r\qA±ö¿zÃÅÙ•i¦•~f!¥Æi(bjhih=~CnÀ ib¼]Ú ðqM8=œìçMýÐÇö+, ²8°â …9¦UÂòQæDORµ€äÎÃѯæcØD%#ª3¥™aŒ‡8ËÊŲA¼N‚›>C0w’;s#õ3—Ïôæâ™sÌÅ5wª¥olDŒÈÖ„oœ1è´ÇVœQ¼n2¨jAª%„sjŽ~Ÿ¹,ÎÏ~ª˜_ͶïÐ{Z:»„½’C™œì}{ù—Ðöt¢Ë xü‹5‚,•*b*¨Œ[ÞÍ rUl»Ÿ1äR™#ÇifíÞ[ç1fy: Λ»_fkÁœ¥q8†2h]ÕÖ H?èÔv”É4¡ž /ˆŒJÝçžé¥’H“‘¿Å$ÀbÎCw´«G²ÓjF}Ù— A:HÛSgš&~€QÀÆö'–ÕÃým}<"f͵jqýq€½ß˜íÞ½5¼<-¤ÇPK…û>JA¾‹ùb;©.Ý‹Â%›@Of"»­1•âRcŠEÆq¨\ðhñUGë¡d™Ð˜‡dçòÙÉ%'—D-%—„ñ!y~_r±TmAîç»è4õ#yÄ$cqvÖ×b­Gð€ [üµî.¦AGà¿.(Å×ÀNd)SR}'Ü¡2b1˜o£`ÁчŸK³ÚÒ Ä¹£5ýâØõØzuÏuôŽ;ÃøF€|ùYæzŽN†lJu•ô?£> g;wxm× ‘ôi‡Û¦/j‚ÿXÓ…Œ/5]™þ?5]P˜,5]P¯?;YNÂh–î­ŒÂtéEÿ:÷*ûèû»w7ûýìS643ã ½¿@á•Yuüñ¸ãWÙ‚~•d©Ì ¦ƒ•‚Ù‡ “ë©{M¡­}\ä@ð„%iúÝÿ¨!’d[uÇ8 OÙð„€ëã&ØqèÞ'P€Î}=mÜÀÓsØöÏ7®ÕÕYx>³k{·ù`3Ãô©)u®Ã§ÃšX;¢ÇßCÈ/Žö‚¿&L…ÈÃ㯳¾“ÙFzõ¹j'÷HÔÏßÅlCØ„  zÃs©&•¨ôì9îì AæÉðV ã}^wÜ®S·©hÚ9lrÓmá© øØu7Ñ}ßÑZéöF˜ ³é (2b¬(ô’ ká/k±W6$ tWX|iíì¬G½0L¼ ýv>ëx¸æxÐ$AQhÐaó‹eºéöDcW÷@wCUŠ¡G:ªü`Ó=”hí½ âÎtì·ƒ™ íëP5ÕŽ¿¸Ý?| ˜çÒF i£Á¬Çü¿”ÿ Þ_÷g endstream endobj 1246 0 obj << /Length 2739 /Filter /FlateDecode >> stream xÚíZ[Û¸~ϯ˜‡‘XáE×EQ`“f§Sd7Aâ`[4–cÑcíØ’W—ÌÌK{Ï…”%œdûØ ŒÈCòððð\¾CG^ø'/rq‘jªX^¬÷O„£Þ>‘®µ„ ËÑŒ«'Ï€¦a.ry±ÚŒY¬Š‹/ÍañïÕß/dÊL]¨0Îrù(”æ¡PIu± •]¿«K­u Åw‹eÅÁUÕvfg> -Ø_ÿg ˜§Ò 2ÈîÉ«Õ o¬Ô„3(U2¡âÈ(É¢Pꈅ“b±Œ5%Y/ÒdŠc” Íè±fTfpÊ<ŒÓ”9½øpù›9Ñ¡Öa¤f­¶e ;*´vÝ•u™žX÷ê  ÓÙбUc¶2 íù^Úzÿ©´wsÄ2Œ²A‚M½ƒëPYpçöì¶–÷¼üéÃr±”A¹©cgHB¼Ö¥‚s¤i|±”:”1³Úšë²kŸÁ“¨fF•7tEf-’’ «yè—Ù³¨4Lä áÛw¯~¸úÇóvkûüÆìùÜɤŠÃ<Ïý§^”¾µ ïgïíºïÌõζLèjwžXÞþ<ξg¥Ó¡Ð'¢]—Õ¬<‰:Gg"84¨ÑO 4¦”¢S1•K§’„g¤ÂHF'RìÊkdóé4Œb}*ÓEºnLS‚¤ ºÌòdª”*‰å©ò0SÉc¡æUsYÞmmcçØF1¸g6e;Ç1³>r-lUw¨LäM&’íÎʦLÄCc? Ù{î¶°Ö,°ë’¨«C&9øm:±÷M V•$¹ã_Î ‹†ËZ½yûþÝË¿^½{¾®«MyÓ§žÞ“–éXIÀ¿]7å¡ Á¬áƒ·pŽ5-ú•`kЕ?ᤀÀ Äú–»¦;‘ϺówÁ1Lù;áx²«ŸÞ¯¾ýzî\yêDŽ•B0UÁù=ò0EÌÓ]ÂÏÅ: ‹¹ÈNö£‹ÃFù8®e°@˜=NkzŠÏmèT¤Ã,ÆiI˜hÍÓ~Þ¢ZµÊƒ¼€ºçN® }riè{#¤ OW†àéÖ`U´¼ Gî¶åçn¹{[¢Ú°…Ù'®ØÂì¢ï0ä=’ejH1§…9˜ëD­å„ ¼Ræ^:bk¡¶î›µk%(¯¼îÙá‚ÚŸL‡øiš‡ÇÓY׃@¨j—§¯€•вàÆV¶1;ˆb*‰ƒrÃÔáÈØ)êêiÇÍ5dn™kv‡Þì8EÕ Ó7ÃŒ/èiË4ò8à/:%±&1)¬gЖŠR^³]àº]á…w{ԕѽ dàÀà1G%òDGµó`åÙÛÓéjjåÄñŽÐÉú5ʹå'%YŒ²i@ã·ÓM»¥ëvº­q Áò啇çSëa>Gw#cß@4±—5GªÂãlQ¨#ˆàÐ]ì õx-”ˆØtpåQ ìF¹3ê–¿/Êj‘1$ã(€$çG>Tåýy8 Mªìçäÿžûç¾Á¹ÏÀ9ù‡ÂsßàÜàœÇˆª¢x  3\Å?¤üÚ··êëΔ•-¸gø³®¸â{…£éiS€:Ј¥)jµmg÷Üþ¡ð5¤6Lá÷èø€$Þ_^=; %Þ×;ˆеŒ‚¿½]dQ€‘¶[;醎'†¡vˈE‹,`Ôdy÷(ºÁ·é+žÇ )õ¨Vx˜ C{s땽¾u,ÂÂw_“6GHAÜØ0ºAgG€Û8ë>å~o‹"ñî…M³!(ŒÍ¾:F1 6 ÒË2Ø€G¯ùžæBa¢Ã8lv]ÌÚ&¬x OHf”‘ø‹®‰ûeà n<Ý8¼ è[ñƒÂÜîHȃCZ§‚*ˆ2M¼7Ÿq%Œbrð$ç…B¡’ÇX; i Td$ I›~‡jÆæPÕàø´ªAJëVði±5 cì¬Û„L”nÚ¦Á¢)¦rŽ„ä‘y¬`:Ô9ûç¢+NÙ´âÄ™6ÖthPhÿ‰(fœ ÚÎúË­Ä;â)¥£8䇸\éÊLÓ•ëÐíqô1eN–3¾ÂݺmS÷7ÛÑsö>÷ 熵-09äÍ@ ˜’õ˜{‡í}}wI©gR‘"L¯‡Òì°3xm®VûÑ€fö°õÚ0á¦1(RÛó…ÛÔ2Tš±µ§Ù1 b¥Š¿?éÄm€êÜ&Ū— c¯c`,!˜ß;‚φ̯r´=Ç3Ϲô30¾ ûs†tbÞ€ü*k±Zò,yÙ•{,£ "÷PfÑ$š9P”AD&s††½‡àU™÷ö®4êa"ØWö~åv3;ò°8žªcÆ`j¸3tãë7ˆ#-·'êGÂ]Ùm¹5>.Fñi²ÀM0žT cu¼'oqâ°Òt>¤ VV^Ë ¬ír¨çŽ0Θ˜¶`!–\TD.Gõã2qð3¦9ä­ \·:»r!Ì×GØp^SwÜ,Ý6~:Ú+òêëVÒñǬæqO P]Å>âþéò՛߽y³:SÓÅQ|„9œ¡*ͧ/G!3 EHåjÐÃ}S¯Údr&è®!nðm'çJ€8ŒÅWU¡Ótò”™º`?ˆ[6iýžP#T,á ‘ì²tÜz..¤+¨ ´’çmƒ{Òù´BeQ=6~‹ËN³RˆezÌU`A<À8 Cyx¤iLucy„±[ê 8RfU«Rhý?Yq-°ÄƒëDã+¥Mk½ö:v(øgX:p)¨$y51$W$5{SYöW äqp âŠ6AŠ´û²¡FÅ:'˜ŠŸvkQ•*‚_ÏÎ<›7ª4T™ü˜Â‚e0'‚P°‹ùÀœ r/‘îà‘ƒ©gÞ"„Šxÿs ZÊå ¹ÃSºÊ)¼ûÒ:ÍC‘æ'o^(ÂQ%ؤZÛ£—\ìz(ýd±GŠÑInÇ¡Ìb q•Ù¨D¡,׋q;ÿÖÛ–Š·püöIÂXzñ™‰¹w8d¼mŒÑÃчÆOz“Ìïz{¾—Ú›=Ž (Ù8ô1ò¿÷u¯ìß³ "!ð*ÒA$¤§ž‹Pêôkî;ü>†¿-Üf„TÅPa»ªqäŽ;Cm„®H¬z• 'à†Ä…1qðÈÁïO£Ý1‚‹ˆâS$†wù†{œB|ÿH(Çþ“"^Ï£ô ´F삤‚{,oÜ”þÕ{g”«’$¹½Ò»5ívö™4 Ó£?ƒ)ìb(ˆàwï5ûM;’ýLÄ¡LNüÌYlãlŒ^á÷£@ègúY†ïØ/ü£s˜Üº§éþà~Šà[„(>÷“GQ3Ÿ>9„„EÎÙí —H¡¢3ð¿6,rqôÖJCe 5×õ@-uŠÚ·¬I=¼€ór)¡C©G‰Š^Iÿüò퇿|Ýs퀗ÎXFˆP)ý;a> stream xÚ­ZYoÛH~ϯðC€P@D³/™ÅNâÉxwe°ƒÍCK´Ä1EjH*¶€Åþö©êên¦XøAÝÕWuõW'ÍNøc'Ip îsÅN–Û¡Þ¿`¦5‡ óÞŒ·‹§?B“~$ìdq×ßb±:ù·÷.ÝÍþ³øÇ ‹}óî«8¡‘Ï4äsÆO潡¼ÝÕl.„ðXðf6—RyeÓ¦Eú9Á ûËÿÍTx)ÌãQ 1ÜîÅùÂñ«8ÿÆ…pÆ·oÆÒgBsuÖìàÌØË–mþe†â0‹…çÏæQxWå2–Eâp°ÚSg“bæeU•¦Õnt#ör}É"móªœØc™êrßÒ‚U…ã†<ÞÎÈgÌkfsæÝÓ‚f—{(vxJ&|¦ì­þÜçu¶Â›%Þ-îz ö‡¬ÚjÖóìáéhm…FË5Rb:­Úf4þ9`²ÈêÜÕ3¢ðؘI+8yÙVužéůšD^“kIâ„eµËí&(ÈÈ ’ø`‡yY9¸›¡+ÞN†Þ«É6YÁ‹Å “ßðõ´Œa°ÙTûBOTšyà¸Ö\µ4ÞfmmÒ–æ™Gª‰>8Mä‡ðU}ßPwWWP5i‚ý[·tC­¨´d„>L¡Q¦å4#flº·À…w5>„™‘×Ô\åM[ç·{ÂQzOóäÀ‡¼(¨UV-»ÇÀNz[L­5ʽªhš†+†øGJºNóÒ';!ýDJØ(ôCÒNfÚ.­Û|¹/Òúµ»íÝ»´è3/I›Fb‹ç51>w§&`ú;à};!|hÂËçW—7WW‹ÓÛ¼<ýÛåÙ»Ÿ¿]ŸÿݬØ&"_*·ôÕ:7æ~‹Ø>*иÜDñ42ðEÙ;~²Š|qw0íš7ôK&ZÛ B‰TÝÑoshÚlKíÎPA'µ¹%<œ“C³Î'ESb½Ý´äEûB$C<úänùfw„e͸ϲ” v ÏÉÐg‰wc­¨uœ{)ª–ä¬C0RIm±e€²Çe¶k‰zTºR9±­¿<>KšÑ‡M¾D®6´¿†œIðºoÞ´ü¸¾ŠÂ¡ü²Ç œ–¶=[ä“oEÄW jÜœ_^¡<~=§þôÇÁsnÔܧ]K•7Ó%ú†Ç{nÂÜ Û¡)¥ünS°MË)&# o#ÇêgıÊÐù)dvd½¢žõ„ãf0/íhn¬º5óÈHÏ'6Á4Àéð‰lÎÁZÀ›rà–ã‹:ë3PÁ{ï3ÝF)o•Òo?hÃhm9‹=ˆÛ”Ôq›žY™%oÁÑ_Å…J)0"¹üTæöÅÈÄ #àÌFgo?}x3%e!4ßFÊ }qůÁ(b‰g‰†WH@C‡„UÚfþ´‘B÷Øèë­"<±¶Ì—±ãà®* ŠÝÌ™ú¥ðÌ?Í1ÞÀÈ­ï ƒp(RC\lÒÛ¼m@_8䤟‘·®ºÀ¨AR¨=/M+A2ÇâõÍùÿ:m6`ÍO׿f§“zÆ•Ÿ$IßthV ^©é¼Ný"#ÎX„L=ÓØŽXCç:ÅOÈÇìˆ8€8 Eúe†ÐjQ-¢`È—ˆ…&0pD@Ü—Lޏ(ò[Üæ"yyÃS,Ý֩ޝÈû€,ã$|/…Ša ,Ÿò4-Ñs÷¸%ÅS„‚”'n;µ£Xw»®2°¦(KÜ[CưÂUMd‡Ä]¡Qʩ뒪\SWÆ † èm4„Ç]¨ C“æ`ã÷#7ˆ¥{¬ÅÕõ/7ïÞ_Üœ.«ò._ïݵ‡ï€B³¨/%Ø¿YÖù®ÿÁà ½k¸H‘¥:+0 ³»”Òæ±ÝS3†çÖ.ÓmÁÄ!ûNeènvññ—ÅÙÏ?OÝ+‰|öc½ÝD¹¢Æôàæz&s|Šÿ5c‡v±õÐ1úá¢qœOv †|{œUïµ}nŒ†ÑX…Ã`±™0‹¹pÆBp ÁàÖ#‡zjŒm’.ä‰MÂ0‹F¯QÜͳÇ]‘–)xMÀÃá xÿØ7fq½/©‘‚–6®NËæA#¥¦K%ÞŸṳ̂š 3Ý¥cI<ŠGɃ °¤Îƒ‰ öÖ¦"aÇtŽ+ðÏyaÈúô8ðxâ–úéj›—˜â­ÌdÍ66*೦Ýа›á‡ME­ÎˆŠ\@„Â1ÐKŒÁ&‚÷%ù@ B¶Umã’¶öý0fœãYáB 4àãzJ`â×NX¶{9Õ”b ejSv6ï:œlÓûìh¸ï|¢BDšÿ)ˆ‚R õ<ˆ¸ž@øÈPnŽ—jí½ÉñbK?56 ¨ixêMMÖ¶y¹nlZnk.HÁêΔLÕÏÇŽÊ$ô•t³À‡ÜY¯‹Ù¶Æ=tébT[ÉãI˜žtɉÏ%pÐGʤ ûLOÆuà†c?‡i¿ä'_œ s/ôR]#sˆÀ°ÒTž5½]ÚnÊtkz«Š~Gu6ˆzuµŒ¡5s»0]×%WGÍX ˆ%\†ôc1lÐåÊ› ³<Ž€fÓbøB Ô·— Eá3þ>趬ÀÁÒ%)æ=‰®.eÌ%6úrÀ() q³‹ÉXzëºÔ Àr†½™‘‚òº*çSeµmfí“aP‰$SàsoƒUΣxúÊ,[5XØcWâ2ª H 0¯>%ßRSÕmÚí*‰úH»ºó7@v™£ì¿Ûè>dSOÌ}Ñ9À¨)ÿ5é°Ÿ™97V׺?eª[[ôk7ÆLÓØ+Êé«i=J@"6Ì™ß^|„8b2K“¥ˆž±Xq} ‹zà×]S ,ÔQ<ÊyŒØ‹z9/tÒÚP]–ïSEü˜þD ÀsÔ,P$Fêƒ'Y;,®I‘m¤ÇA.A2ª‘à…°ö‚ÁÀb· É’>ÊÈQ;¨SuÇŒwÆátÿ˜yŠ‚Âî®®Öuº5ókH×l8¨atmE3s3 ñòûrébµ¡ ×h˜’ŸôÅŸ%¿éÔV-0ñ ‡B²®¸Œ”Æ{°À®¹´h0¡%õµ1zEí#e2á«.H~‰jòŒ"¤ã˜¾gÀîðsc4Å£Ïæq„|;mäÍû pÊ“®¯ëQ<¦ª ±q¤*&}Åþ/•hˇ‘ïÖ0? GÐÍï& ì]JwwœÄ@™Mf0uÅ|Hº-GÏ5Ý7€CWÍפ"»kû50´½:-=^4.Á.ÄjhÑ.Ͼۢ¡ƒïCºÆ¢q[ðÒ>«†€yVmð°Ö_ÂÐ+ØÙ“F!A“æ¬0§pÙ…-§_"BæÄEô½õïç:ûèBC×ìI§{(ÃU Ç x(F€âúi¹šy P¿Cw!÷sßíµþȬ%§1¥M´ýBJâ'º.Ü“×ÐÒvŒý£(£bëb—g×gïþyöáüÇÃ:²-#‡/ÊÈÚk³¡2çN÷.Áîe[Hš–fê.ÕaÞ½v;k Ú™U*6„Ä&7…‘.‚`—Ñk{¹ë³2jèèö©|(E÷yЩ zhí–ã!û8cÈ>Nq_ÖaÔUŽèË:ºÿÖºðŒ¦SÌZì3¢¯ÒI%…-ê üòúˆW ÒB9•¤˜ƒw’hüeë˜ ˜‡È:îNÕç*¡TE“GßyAоîÐ^æÛr7ÛìH%XŽŸ¸±ÿýñ þá endstream endobj 1257 0 obj << /Length 3456 /Filter /FlateDecode >> stream xÚ­Z[oÜÆ~÷¯ÐCP…EñÎaZ°Ûpdž­’¡v¹»ŒwÉ /VôÒßÞï\†KRÜÈ =ìÌ™™3gæÜ¾3”ááϿȼ‹4 Ü ö/V‡'žR?=ñµu… W£Ïož\¿BÓ÷ÜÌËü‹›Í˜ÅÍúâçE~¼üéæŸ¾q}\nl2ùÑ Br?¸¸ •]¿¯/¯Â0t|ïëË«(Š7UÛåûüG/ô.©¿úïeìyNŽyAj@ðÓ€Ø=yy3ÈÁ#¢œÈR7¹HLäúa$òu»¢)°oä9w»rug'Ý|Áѽ“îýe:uN˜9]-ľյ¯‹ú@>—…ηSÖe{ÜçÄè^osìyÈ»r• aÛäGlݺ¸?tnv¸ÒmBC~èú±HzÌYºO—qìäۢťF““ôÔÀ>]S^úÎmßk¡••übCiüL|q+ÁäVâÐÍLˆíxŸ¿¼~ùîí‡wïn®#IeÝô6Ï Rß®ûJ¶hû[Ë@ž¦Xuusÿ7¢'N¹‘ñ{:î‘uGPW¤çT;kÌ X•›{¶È_¶ÔÊN\¥»ÁyëfñPd¥Aj…{ûöÙûg/þõìõËoÞ|X: ‰ ˆN ö™'êÆþ$;mgegâ\ÌL®™†ŠÃ±#kPñÛâמVþç2J§¨Ve.Ç÷3òzü5éÊg•7ùªƒu’¦ κ|P³—þœ‘gí{²¥dc‰µ1PÅÆ ¾ØtBbË2¤™\)'͘Ð)'^æ¼¢¶ˆ3ÆÆƒdbÓ‡š/ qê./÷¤å,rr2!ò¶Nåb1pG×88“Œ´:6õ+Œ=t¢®êª‚ º¼–ß×àK:Ð|rá§ÿSÅ|¦Ñâ—|šüÔsC˜Z“ Çypžì¬«Ñ´¥5c&Qh¬ŒÆ±’bjæ&Òøá=)n81«F"¶{\L]ýôTf9b3£mYåŸ3?Z˜&n’øã£-D^;둣͙ñÑ\1RX°¹ˆÍ„_)Ç u#ÏÈT° .¯â$p^Ô‡c¹Ï«5ÝB;…üh^ȹü¼¿ }ØpW6Ò·Ã/ä˜èºÜ*ñÕ%Ì¡®.CxE¡ÂÅáøq ¹.‹æ¸çß¿þzÉ×ÂÐ`ðêk7ÄâÀƒ:W¤ tü̱D6v"Ô!¬ó“ÓÐA‚dˆ×”z8í,Hûnd 6µMiº'ûíùú»ï¯È(ŒÌEƒ4Α¦ñÄqwùmÙµ°&ß‹YTÜuæ¥Î–s¸ÃîÔ)a£¡åÜ'þ áû/_½ù÷u»CȹÞêÁ®—“OìfY6$+ 2r#û¿«¾Ëo÷E+"çA¾Küxê܋҅®ÎD»-«Ey’`.Nh<çÈù3G Ž­Ô›Ê¦>_ œ¹ Àüh&ž¼%6\Qç‰Ã¹L{ MÞ”€/$Ä]š,™^I•Äþ©2×ÉC¡–¯&Abyǘkm˜™)Û%ŽÌúÄu]TuG—I¼Ù¤©QŠã¬bÊL<6ˆ¤~Tü&ÝS gêZU’ÁoÓ‰½Sò½JÍñÔøùÌL4(ëæÝû^ _#élÊm?œzª'þì§ãKÿvՔljԇÃ|dß¼%¿Rvœ%)Êe€ð6á”OÒ¥=‘œÎº·º÷ãH"ír†ÓÉÞ|÷ñæÙ·ß.+KÝ0 FÇJ‘d¥±¼òÙ(bÎwq/ÖQXÌ<3ÛGòa\3XÌÌž¦5=ÇçÖÕ+ ]Ó4ñ æœ]Sç3B«zjnKÌ#Ú¶è¤ÑÙùmÝ7+m¯$X®µ+𽬕%å†1»‘f©›+ó¼‚u¬¯é¤ÔeT7:é®ìv'ä@‘›EÑľ±Òä$Œ/`}³‘Ô8 _š$˜ºÚßË8Œ|Ç^ ÷5E“ô‰¶ ³èÛ²Ú.©3@ˆAÒ%9 ΄ÙÉ®|GèKÕQt]¡i^Âj¢:@Ct€Äð8UŒ òÜ$Kg|¤ ªÊ\!Æ—˜bk¥‹«'œ§U$(›’ʘ¸"DãKÁÒ¾³‹} þÝA Ò⃖Ԗ­»bèc‰;m̧X®'› 'GS0¸.4 VkÒÓĸ߃ò©$Ï屌‘(-¾dûFOF‚…¨TC”8Ó`z#_ú–„¤¼ßM½‡Åé´Gñ(SÉÔŽô¾@ÜôÈ Ü:¢j¨òƒN hHÔ©¹Ñˆ½C]‰®µ;®tãÙj‹ä7ÎfVÅ%ûÆnm=GÅPÅšÞL¦¾‚£¼×´myKh€H¬ff=ˆÈÏÈ1­ äú{G’Âcq G¹‘dJóófé%æ~ÐŒG®•xòë5Áš ÁZ[âòF4»%òZK”uM 'UsVå°+g-Ô[õE)$ÛQ8§¡·p¸ “J÷Ü=𭻦(žJ¬hõÅG‘dè´ì¸O²•m+³&éwj•œùfi¢à7P0¯-ç¦î·;~ˆ )§X¢óŠ¢? :Ô¢–"3éH¨u Ëðœl€ˆåq¯3Ûû¶+ìèt~6å¿"ÔD ~Îá˜L³CÁ‘ª¾½´ËÊŽJØ ZËùž×ÎÒÓ8òÙ:*à´–:Ï)ÞÒs‡4t|‹)¼™ª[!ò5Ó´V@ŽçôG]WKÿØÏÕ·ôÊåüRtu+CÌr{Oó¡Ü¦"~NfŸ$6“w†€+â_šÄhü$õÇàPœbÒÀ>v£ÁÖ´q‚HõF~g‘$4![òˆƒïð[¹T-BÈ;dU×7"š¯&EKé„$˜S,c_-üÈ)Áhƒé54ZÌù‘¨Ðˆ´tç\tkª¡qþÜC zYP1d Pø¶„ccúZ2¼ ¼xÿýrBt“á‹ %0]8 ª‡Bví¬¸§›W÷Š›cÎA^‚wXäÚO-¨»Ì̸-Ä=Ãc+Í]„^6€ ‚A\xcOÄlqݶӵM“W[å)îíÙ/8Ô²@LïŒÆjù>hÐ6ù°×¼ïÙÃÄ&Ùm)AtòÝN ŠË˜Ówƒ¥@)±„J¡Ú†¾RYìfüT8 w¾FÂØMLü0FãEêM¦ çû© 4:DGš0ŠŽÔ%fÌ&DöS5$–ÑÐÌh°ÞœØö\ÓD€–Ë‚Ï É*:óÌ+MÓô÷°<©@˜lÝí¾¾E<>‹ý‚ÉçCù²J¿/™°[DwqâÆûRf²%d7ݪ®”À`Šb£û+õœÌ¸©o¦wÔóëíÙ¢ ò=¡Ðþ·E ›„Éä6>ûPŽÃ _!)=ÿøÍbÕç¹Ôúã<Ûm¹ø¬–ò×þ?Îow F³]ü“ŠüÓ‚„W˜Y‰Ð4 fãR'Ãt´ÔAëTê$ÑÌåÙ†( Ÿð+ϺÔêvyeÇ,i†êEuI4ÊãdXY>’8Á¨Ôß"](º®P\M1Ì)®4ue‹k‚XáÀ:ôþ°>÷O7£sçórdÒ ÈõB=¿j–ŧ´ŸËíÖŠSGˆgy¶4FÃâø¡#¢jÉ#ƒù–Ýi‘~æ1nÏÿåãäÖ0JyÛŸTáE%”¸6è™ËU½=×þ3ÅÿF[  endstream endobj 1148 0 obj << /Type /ObjStm /N 100 /First 978 /Length 1684 /Filter /FlateDecode >> stream xÚÍYMo7 ½ï¯Ð±=D+‘%A| E šÚ9líIaÄÞ)v×ýø÷}ÔÖ†ítÇ3[´—„Ö¼!Eò‘âhcqÁÅ(ÉIÄÿ\\!üŸðG8;¦b+@Øj”êRf[).‡fWØ´$qEó‚ºÄV²«ÐM5¸ZÔ€ ”!©)kRª.’ØS…^Vu“`VjDL»&H%B=1‘™VuËWØmÚã_aò·˜@ùx#ƒàáF6?š EË7›þìm·sïÝòÍËWnù®ûcçnm¼ûó×V¿t‹å ØëÖ»­5²÷Ëï»m½9ë¶û&ÒÖ^wç«çýî½-(Ø”+}€¡Õo[¯Ê{à³õº‡¶÷û†fûi m/H½Y)Mx°£öîbùöúç]ûûÛ‹õ§Åòy¿9ï6{Ãáƒmï ŽI-¤Ûgô+kRšŠ×œ€yÖBøÖ-¿îßõÑÿ¢»êϯ/»'ÛÝj³ûÒ‚4Ù4R§,^£u°è­i«$ŸHþmË‚¯ˆöEZ-¢_ˆG4ýºÿíâ ùé·î¼w¯ûëm7ÛuÎÁ+š"!Kô¨×)ö[Q¤x¯(PZ•3¤”P^ñ80iõÖÅŽ%UÏ`õÿ¥`u `uFÁ¦:·*©ÔFÌŒˆ;*¸;d"ðfÓmw¼Ð1)ŸbeoÅQ %òcÊQ`”èkH§àÅd.ä.ä\Лæ­åo!ß®œ€&ÙÛa€±ÁÛy/¢¾M8:ÌA¢œ­®ºÍjfÿÔä#àÝtÄæºûýÉ)ìë ù`óªoÃWò˜®þU³ŒS)VLW¡úd3N j§G+ŽruµZŸTcShS@Jˆ F´£@Œ“>†x(™¼ ¯Gv’qÕã@ªŠÜ•õ}ÛëORë%Ôz}\­ßu·„y›Âפ¯ƒÉ}ÄÇ”/¬Ç–Š’FàpøÛÌ~h½3ýÚ»ë@>ËŒ|Ö1©:ƒé~çC¿kéw­gV•¹Ì{F)Qeg'±øbßøA°>Ü­·ÝîÉY¿þØo®V—O6ÝÇ‹õᔋ63"%:3%wÛÌìôP8)ì‚âQé¹ãž]‚Á$”äCžQÈZ>]¦P—'óÚn€æ\Œ£Înp0ØU#bö}“úáOÇï¾ûú[õÇv-5"=÷A)e_UG¤çnNnS59 QÓi:#ðýˆ…½Ý>Î÷»…|‡²'¦i iÌ3â3†@0‹J<ŒèÈølxd ‡#ö™¦99¤‡$™^ïijϱŒºÆÄšbò±‘€´K2LO:XïoÛÎÝ‹þ¼s߬·»Õååjwѯ:¥Y~Âr,S;ÀÉ™ÏGvâr0Þï§ÝqÏ̜ͮ‘Úí )ùDÜfÙP‡¯5÷©Z­úÙ_¨1Ïöë‚;µýåUë#̶Ôó˜.ù¤ÿkÈÇøx÷…t:‘ŠØ%ÿ b-§ë200Ix­î:/qÂHñ=i¿Jßÿ|¦—„ endstream endobj 1262 0 obj << /Length 1236 /Filter /FlateDecode >> stream xÚ•VmoãDþÞ_‘H8R³Ý{׿Tå8¤’ ‚ĉ"±µ7‰¯NlçJ¾ðÛ™ÙY;IëR¡Hñìx»bÂá'&Ÿ%™LÄ$ß\ð }¼AšÁìÄâ»ÅÅÕ÷ Î2ž‰ÉbyêbQL~®ínúÇâljH™HåD²$ÍèÍ=—Š^1)ädvòªìöU=)¥"Á¿šÎâ8‰>lÛÎVöž+>ÅuþÏ4á<²`'M a¼»‹›Åo"å¡ÅÛé4fBÅ”ÜOuç07ukÛ¡”D»Ê4:¾¨[ní#ªÝ=q傲qK×Ðg]M*KËÏÓ$‰lSڇʑ&·Uå , ²’§YI­Y"c¨Â'uûíõ‹w7Áô¬€8a©H{ËwèÙ@îeûZÔÎUUHöi]æXÂÚwj¦„d*È„b"!‡¯|m€Já+žEõž‚G«ÆîÀAKÚöÐvnCo|å ËëÍ®ôqAùÞÕtö¹tO¤YÖ ƒöC"‹u0úó54´Jú7ìëë»_¿y/)cƒ Bë:ÒŒ@éŒ(³#$q¢$aêXF½¬c)£r ßd2ÚÔmGRn[ IJó‚ 1ª½ úð~´^‘H¦³¡û 1Vª0~Ïõ¥^B6Üœ´Ôûwmh]^" ¹%u˜m¨+¦ï hÚu½¯ ’†¾cYÔÍ‚:c©ÑçÈ n~cÿ†8úd·®²-#&ˆYÇø%l·ÀómŽÞSÓƒJ‹µõ“2 ÁA“×[,`µo\qöAC«¤ÞU׸ =ôûdW”]¹]“u°@§SÑxÀÚ†gáÚ¼)Cý!¢¥eý<7»í1é+<æÂÆ<öaGž"ÉÐJ˜í±~KÁ’LôF§3{Iƒ8 sä–-…ö .0S/”žo+ZœÏjzÜ|ÎÄXÃØÞL ÓrHkcM@a¤’™Ò S:>#ÜF± ˆ¼0º5”fŠLðÅû›ùíÏóùb,JxÅÉ  Ó¢l\ÞÕÍašªÈG§:úˆ²Ç 7lÕÖ!£aˆ^Û¯@/1x¥þX1#uoŽÝƒ­Ò'àþÚ—,À‹ˆüÑÓUzûi$3–7ÌÄgŒDñY` k?¼àž%ÊœOï‘Á¡œ§²nèhk‡þBÛD´º$/´„&nƒ„ƒu›þ›!­2úÍáLšòÊv.0ºC~D=3 [,ã|ÂQì»Ö¡ïÚDûÖ‘5ôbk7ã—Š¥Ò¼ {Ê8rH§–<—!êpÃðáö~ØŽÃzfK;D÷<祚ª{ØÊ3D[DØ·@Õš£Î¶¤pÕ“õ@~f ¾m:RøãžÏN EØ|²©)ë}å^~Àü8Ó±8r.žpAt¤Ázðé]¦Äò€ Nµã̪Ħã X<±«–ÐÁ‚¤bßxêÅ/s„ÅO3@c»²ÞÂБús!DíÓ…a„Ó©ˆqfb\½à¥+‰%4¢½‚Û¢+ܲe«ª~°£3-9÷—ž²Þýç¡!3fôpÕ¹žß-~s ·_“ê±c/1zCHy@ò#´h¼³mÛ_ðVÆŸóEW@CqMëÀ#aàîyÂóþë/õÿ.+— endstream endobj 1270 0 obj << /Length 1196 /Filter /FlateDecode >> stream xÚ¥VK“Û6 ¾ï¯Ð-ÒÌŠ+’¢(å”4Óí´·4ž^š´2×VbI®(­gÿ}‚¶õðÎ:>ÏäA?I ¥dEšUs—xîÏ;î©â‰Ä/›»‡GÅž°")x°yžšØlƒ¿Ã?Mež¢Xä¡i·]K)ÃoãÑqº~0ÄÙDpüž¥Z„¦jëÊɦá±ìK’ñÊ¿™®Aé—Úœ¢˜ë"“!×iôÏæ»_7W•ïÄ‚«`´¸f‚«Ô“å)ã2#ù9­()ÎÁèƒI)%ók0 ëƒÊ3\0`î%âa ê<— êáŒ7Æ[ꮽ§J¶PTê+ß% c7úúo}ߺãYß«–í–D#Îyøï¾ç{¢’Ç(—aoþ½Öá•î>ÛŸØyÆ+E,èpbj;P3Å\±,Ÿ·“ðíôÍà÷‹< MSÖ$©…‘åÒ„ÄnÒ`ñhMoýüÌ;!Q,TÎ}âÓ­SL }–@-³ÝØW†agXkú":S·;ò‡B‰…,2˜ÊÚú¨ øœæ³âÀ]¬uéþ.Vð€Vˆrƒ‡Ä¶¶ÕhíE¤tI~¥Cmíh¼½Þ`§lé€éÁÿñª8Ÿ`ÀK¥  ŽÎùšx'9yù£«Û(Î,0Ã9à:Q¨0K‚·eK—¦9XíW:¶Ý`HàT{¢>ØñÉV}}§©?ôâSˆE þý0HîZ¥õwC·RhJ–Jsp?'H&žÝÓ¹!—‡u[Å®ÕýDÞh14’*õ[l DB°¬Î¢\c‘—z'Î¥1ç”– ] ‘ä„ì`œ'EB•qµ¨#/îNÇÒ­Ô,‡7J¤`w%ú]…n@ùÜÐÊo¦ñÇ«)[w[·ÏÝÃí¯1õ Ç„”sOWi>K­}¥yiÌ¿C© &yN€'ýRñ¾ømЗäZ¤‰Ÿ"@7Æfè_é´Aì5JïÛîÐíjìLÔp‚"‹½Ž‹ÇïãwÍÀMíÍ•t¬¦ža Üž`Ç䋸[KÜ>[¢}·ë˦qÀ„ŒªkŽTCư/½ži Ò+>÷0Š^wcá_M0ˆ r¾àÒá`ú{ Ö{"MŽœœ?H`'P;—ÖúzL ÙÒð*{t8ÙÓUÓáS )l¨¾q[ùydðÎùˆÄ5Óxrˆ‹™ÖÓL£®{¦Á4Ýc|ù¥½ž¬4e¼U"Xʳ·fËKű[Óµ0vë©4˜jÏ f«×šÎÕæ~¬&Ç ­Ý˜ ÎÂÔunð{ÿEé"l endstream endobj 1279 0 obj << /Length 1517 /Filter /FlateDecode >> stream xÚWYã6 ~Ÿ_‘·:ÀZcI>·oívÛç @ѨÆÑÄÆølgÓý÷å!9vâA‹ÆI‰‡ÈŒÜEð'wE´Ë´EœïÊö)rÔ·'éV!„ ‰ŸOÏŸ¹“‘(¢Bî¯Ë+ÇÝÁÏ}·Wy0 õË¥îŽý>ÔZg3\Å#|²£%Áoø¯o¾Õ-î³`rþäÛ·$WÛ}(ƒ+üKTª™%û¿¿>ýr˜­M”úwPâÁŸLíd&”LbïO¤E”Æ7´\ù“%ÞX9û£øÒÞ<èà$˜ f„2…æËÉ9ç®È¾.H«\D…³åëë>Œu|§˜]xcË‹šo;Nö8Óè[.^eª»SÑ6úV{¸[Žö>ƒmúsË/41£wÊrý¤4óÖ1[3ZzY;˜fv\ þ‘+SVŒüij;˜¥é||¤ƒ‰(d‡S!uÁ‡¥pÁÒË`ÉD¤yŠHæ·}®á..(vp‰8ô§Á´-Å WR>¼m…_ÆRä‘öW’V°ÄQɤÅˤQvs7‹4JÃ{¯m!~wd~kÞ(æNºcvݹD(ûo/‚¼ZÏK~”Ì?J çŸÜ”^¼²«—`Ë{|<E!ƒÓâe‘æ2Uý02ûyßy É~ä¢Óº~²L œ j$Âß.ºj]§"Ž2]ÔŽšÃËhAåÆs䑹ôò?°ŽÖÔM `cdÐÔãÄ«?£$­½G )¥HwI Œ@Ö'X&\1ò­ì__D6UÓtþøüŒ6Œbì/Ci_ûádEg§g´´5qëîµ~ôxigœ$Bi½¶ôѼԣ­«ÐÝ_FÖB€¤ËiBË|•ÓêTÙŒö”eX¿×ÐdFn; ßywÀz´%JW]ßô§Ún>²Ì•Èòü¾æuK*ˆ¹JÖJ>0ûkW @¦XõÈè“ñÒ0(jU@Td<´Ì›*3ñÊ—b}´#ËQ}e³ë@™Ð½ 4×%€‘ÆË9Ü‚¿ó>$Ø“*M Tšåeœ i½‚*”É»aý¢¤õÈ Dy7渚gdJíçŠ ûðfø¹θÉ!I¡™Q¢ö̦€Æ€Éí 0­æ¾H2@6n½—ª~ä­iJj”*]d,r9c]ÎP¶r¦wE­=s¢ŒÛ]6I¹kçԵ逽u dãÛàwÙ&~¿;±`¢™êòÒ˜÷µ;Zõ€e¼t d RîBeñ.. «ì8õRáBlPï/[Bêõz/@êÖì·2b{ö{0@>"zœ§`FÊêi<°/€8 FH?„“XrÅjœ°(:Èœ @‡æ utjڸ뱶N=C ìï:»Ÿ|G¾‘º'H}Y·c<7¶yÅÒM5š‡ÁÌMOnü"ÑÎ6ŠÖåxEƒY YgŠsºoòi@ër\ÛØ€´LM¦ ðõ†7¬§­ô6ma3yKCo2ØA6’}QÏâàw,Fš©O8ˆsnL3ö޼êv¨ë=[],âe“*Þé‚$Ç3“*3£—eʪ2AòÕšé2ð9í[ÐoctAÆÓcPÌ‘ u©ë‹ ·&Âåx¯GE+7Ö)¹l^¸½ËSå~ó(î°°í<ý ½’ª¥FŸ iæµ=¥®ÂÔEã’Sá°ioš(–'²Ú…‚J6X¼‚°ÝaˆÒ‘È%àˆŠD¢ô;`æ¥Â…ؘÝ_¶fPW•(!z÷¨š*‘è|mÈ y©GCV vÙr¬RI&øuÊBHå~Á*Ó½­~™ oà¿Îã'‚ endstream endobj 1353 0 obj << /Length 2816 /Filter /FlateDecode >> stream xÚíK“Û6€ïþÊm&‰âIp+‰k³Wížç¶ÉA–hÊ#iJÒ8qʕ߾ ¨Av<ŠG¬ÆÉ´º¥þ>ã%’á“ÊýÃ'M5©¥`••“ùêEåÿë»Üÿiê¦QÄOW/¾{¥ù„W¬©>¹z3± J¸4ŠY5¹ZLþwñK%äå¯WÿT¬Öv2îG}üÕÖ‹å¼½œJ)/³]÷uñêÒª‹»õ/•¬.•Ró?/uU]lZ÷{ÑXË/xmº„/~¾:½5-ñÞ»ˆÁ›¯Å„×Lp­oÞ²Úè‰q?E£“wÏ™z2UŒ›äÍ×Ú¿y÷‡W—ÍéÍwïº{óFÞ¼Kr,¨˜TFt];UÅ„mŽ¿:ÆH>±¬1Fù÷Î}ǾúÖÕQòbwÝÞÜÃm--Ó¶v/:ÿãrÊk~ü!zÿÆéßý½_àF:«øÄˆ†ÕÂv|–‡_F „¨ivÐ@D-LS:Éδd]3]«¸dƺU.™¤:”üvPÐJ&*M}FU.˜¤:~F-%›šU¢¡>£”ìËîÝX& ?Öûš¶ýë¡á†Uî¯áóü_€x¥­rc·¢¼ŠÂP¯B úwÇå*y•–t3Kâ•Ö¬n¼WßÐ^}3zõ„^)ÎLM{a¸W>Æ{ÅQ¯ WÑ«¤äp¼â®®8–›ÒZMG­žN+Õ4ŒW’Ò* Cµ 1”VQ®’ViÉVÊ4LùY÷»‚VýQ«'ÑÊM%Ò‘¢´‚0\+Cj¹ŠZ%%³ ¦Û‡ë}OWß^=¡WÜí{Ú+ýò1Ôê*ÊUô*)9®¤[~Ié½úöê‡Ñ«§óJÖ•[¢^Ea¨W!†ò*ÊUò*-9¯¤[~ÕÆOr?Ò^ý8zõ„^‰šÍI¯ ÷ÊÇ^A®¢WIÉÁx%ºõWã½zI{õrôêé¼V³Ê’^Ea¨W!†Z_E¹J^¥%{ÊtZÕŠiá˽ÌHÃ+¦¤­ù¬`ºø¦Sº@®K̯¤ ä*ê’”LoB¹QÄø1æ#= }ôGûíj³¸»i§Û»uf`rÕ•úòCÎë…ä¬ÑÔq=D¡§õ>eëOØ!S鬾T¯Ÿ¨|R_þt'w Õú‰ü§3¨¹ÅOw·_o8}Vœ©Æ/÷ÿI{;Ë}Å ³v ?õˆ@ÜÖLZrq…¡ …jô‹r•$JK¦“%¯a/ÑrÚæ³U» mq#¥­í¹Ú‚Á÷-¤àC?¦Q‚¹Šð“’øÆ0aRø~^ëþE\,Ú7Ëu»ªà¼ª]ê/~‚ ÷­  B1îj "ä*BLJ vß©U¼Ñ­PÖËõÛçÑ·‚‚a8ĸ«%ˆ«1)9€¨4ã*…ø¶Ý¬ÚýöÜKg,?ŸîÛF‡0xL r'%À¥Û•ø£Ùz1.Ìin>¶™òã…ëñ*ÙqÊT”£_oà†P.λq;ݼo·Ûå¢ÍŒnu¯ô8 ûEA>Eá£Æs)PȧLEÈýzƒí[#™ôµ~¢7o¯gówóÍÍf›Y”ËÃUç=R jÔûA^{Q¨>„R2•ÔHêõ¸KG½©ùÄ8¬V ÿv»¹[/¦ËÕìmf(p+}®å3‘ ½f¸²Œ×õ©%yš!j… p¦©0žÝEÈQì2å´Tž¤”Œ7þb¨×¯7¿O±¿È «¿Ä3Ã{¾£íÛFц0œvL£ yPÚI©)ÕŸÍ{íætÃý¤þ/tR—•W;f“ënÓ×þŸ*Œv3ª¬,%L† bJÂDy0aÒRÙ±BËŒ6± ÈhqX雳]éŸàø†Qœ! ç÷ã yPÎI©Sz@®GŒ Óò z$¥òzêpÝ|1êñXzø>Sz@®GŒ Óò z$¥òzpÍd¸bc~³™¿ "ºovšQ¿¼dð½¥”€0\‰¦äA•HJ啨«Ã=FóÍj•ý2H*¦1Jñ #ƒï'¥„áÄh0 ªAR*«j”Ûò×Aƒõ.30p&Îâ‘sœ:Lˆ…¡bô`!bDy01ÒRy1¬dJ…­ãæöÃ(ÆC‹á;L‰a¸1,L ÈƒŠ‘”Ê‹Qwwƒ…½æÝv·ÙNwûeîÏsßk†VQ„! 'w# yPÂI©Ûãí½ÙÇW<Óçê`P}w(¨†CA…<(Ô¤Tj÷˜ #sP3_#לÕú™}Œñô¡xBÎ3î1Æò <“RyžÆmòÂäçr‡ßÀ-˜©¾ÜÛ~0x¾ <ÃáÅ ÅàA^R*Owwê÷ÙÝÎö×ãÚzøØ)Šï) ǵ<óÀÝSn¿Nž­r›«ðÌÖèÉOþYP‘'@é/þÙ ªûŸmtmô È3 QÓ(l-M…ÝL­«îf—Ì¡óQÅ’iªüs N6?#xY,ØOU4³üùríÌ»)ÝÏpszps·ÙŽ— ûVQ„! 'w# yPÂI©‚ íÛFц0œvL£ yPÚI©<íš»m`ÓvS|;Ò&hû¶Q´! §ÀhC”vR*OÛTL†'Úiß.swy´{´}Û(Ú†ÓŽ pi³´!J;)•§} hN´s»±ñÝÏ;½¥”€0\‰¦äA•HJå•[Þ‡ÍÜï¹ Ü¸ê»ßXá;L‰a¸1,L ÈƒŠ‘”Ê‹!,Sá9Dí›Íj+l¬ð½¥”€0\‰¦äA•HJå¯Ôiº+2ü¦ã}¡Î›mÛþ1ž(ÜÿDÁj&èS~ˆBmñ!%Y ¸òÄ+¸ endstream endobj 1439 0 obj << /Length 3513 /Filter /FlateDecode >> stream xÚíKsä¶€ïû+&7©Ê„ñ$ÈS‰§òŽ©ŠsàŽ(‰ñhFήlòÛÎl ˆìÝñawP>h½êí–úûàcØŠšÿت¥+-8¡X­ŸßPû·ß¾aöO• ¨¼ˆßܽùò+ÅVŒ’–¶lu÷°jZÂ%7i$iäêî~õï›o(·ÿ¹û㊭šUÅÍ}úÖ×ÛûaÝßVBˆ›ûnœþ o¾ºmäÍ»í7TÐ[)åÍú·ŠÒ›]o¾ÏÛ¦a7Lë)á›ßÝÍ?šâ<ó³O‹^ó“DÈšO?¼ùõêF&ìOþû©Ê—_ ¶jH[×rŠ10ÿ‚6ö7xìwÏýaÿÃ)²ñECšV˜øcܯo+¦Ùé ?û?–ÿÞ'ÿX¼„Sµª5%Tꉆ‘èøM˜‹ª¼°#4îu9Lul6Í¢d« å­_2∋Z”) WR‡ äBÍIMÝôa|yê÷}u¿ï^—R¨†(y CÙ¶*ÂpÈ~×S!WrPr1T’‘Ö-{¿ÎÏ#‡‡%~³––¢.ƒÂ%×™Šk³Ï+a¸R6椔¤¨R+©TPr1n0M„²sÛaû4¼Õk·ßÛÇÈ2“­>³I'†Ô6&‡Âp¤~SH!WiPr”Ö¤¡Ê!}yw¨ûn;nºÃn[®%9˜†Ãô»›‚ ¹’0ƒ’!LÙÖ„«ÖÁ<˜Óúx({0F»NfðÂPΠ$ðr¥K.Nû²6ƒxÃOõþ”?íoºç·÷]Y|ìLQ*At›6¼0\c•a¨2+©LPr1lHSVZC7}dÄ`fÜiÊ4ð#O,®Ï9C 7ÄG–2r% J. œhj—›aÛÕz³û}Y0. ÛVå CÙïz 2äJBJ. sn&wöºÃf×Ý— Ä o ºçÜ€0Ü “ur%ÝJ.Ü`ŒÔŒƒÕKwxZ 2#æLsÝ‚`ômsô! §ïãHч\IúAÉ}Ê­kG÷m.=2ØçÜ€0Ü VÊ È•t#(º!ZJ5ª~»Þ=¿t㸔¤žö">KG¬¶9ª…Bõ»œ` ™RHƒz ¢º%­–1¤Õ8ü¹¼Ü2"é§Ãeó/ÃùMdR Ä WYPrÁ¬n‰ä­Çl߯ûi(rrÒÊÏzeáµMÊá…0¯ßï^ȕĔ\à5«ª¦ÞÃîµÛGfèJ&¯h†¡¶ Ë¡†0µßûjÈ•D”\ìß aFgjÏßÎïß=÷ûÇȘÌ©›²÷óÍa5‘,?H@nŽÉš¹’æ%ƒU¤Ñ³¢ê^Êîÿ‡8`;™sÂp|() WÒ dè€Y|Áý‘¡zÛq®vàš”Áë…¡xÏúÀëåJá K.ð6’膅xct¯}Öµ*ÂpÈ~×™”(dÈ•„”\@Ö’pa¯þ<ïîËå˜_ærŒësÎà ñ‘¥ \IC‚’ CjqœÜYCö}üvßr¦Ï¶“9 wÀ‡’rr%J.Ö \ØçûK~°ížûj÷ö¿ýúP–˜Ì´Dçu€0\“Õr%uJ.†Ú)ì<ó/¿­ºïû±<òsDÛÏœ †›à£I™¹’&%CX;Ýÿ£gÖ»MìN¾rrÈŽ®“¼0Ô3(f¤Åðr¥K.h´9U°ÙïvûçâÀ‡8`;™sÂp|() WÒ äÂ]ÃMdÎê1v{×µ¯]«r! ‡ìw=r%!%ëénЀñXGŸ:•CWþ¶­ÊA†0²ßõdÈ•„”\@fb¾wkb¼ï£´rOÀ?µ0Ç~ŽÂÑ{,RäçLIðçõÜ)'­v“óþ_wå®ÙKü¶Ã9/ Ç•2r%ÕJ†n´nÛš5›™×ÿØ¢oëºÚËô¶G¸…²õ›Í¤ÆÐB¦Ù ^¶ap³ØvW¥û…®ÝÚ6gÜ€(Ô ŸW Ȕr#¨w~ÉN˜?·š¿Óñ¯èu;VÛÂØæýñµå¼q‘^E´^Õõt‹5攋ª¼°…Ta*̪éåŸ^ìõ a)Ä'9Ý}o}ú[Þ§—a]žß¹ÔLd&Î5á2/„áòؘ¤<•'(u¦ÄìŽ9¹…ÐäE5lßãðvÓ_ñÃ;3ˆSsrHç(œ¨×e&›(Ð9 Êó¼N'­ uoxvQ’ÇË~²ë)ö¶“9ø†Ó÷¡`ø!Ê?(@µŠÈÖлqˆ/)ŠY\'3xa¨gP¼<˜a©¸frÙ2q.@Õaw|ÕW{Ç× Ç6,ÇÂpÎ~ï1Î唊sÖf"(XÀ{(ì ÞÄ6C°Éñ„0œ§ßc&Û(Oȃò JÅyÖ‚h÷>——ýnÝcÕ¿ï·‡±ÌÄæîä BÕo4ò PƒRq¨J˜e—ž¡>nËcz·mosJ@®„ Sò J¥â«uj^{âï‰Õº ùîÝp(«õ ¯Ö_óÃÉ…«s Iš3gAÅ9¯Jd«IMçÄîPžø½ØPâz›ÑÁ C}8ÄáåÁŒKŇYO÷Úùæ?òCɾ{=Î(ÊzðC$QœÔùy¥†Kbc’’@T’ T|ÜœP7Ý1Ä7Ëc!¹ëN3;ÛÏœ†kà£Á4€<¨A©¸‚é¦8û¾¼ÚïâS ×ᜆ‹áÃbŠFÅ€<¨A©¸œ’Æ}F€cS ÷e|øˆñÁö3§„áøh0 ªAP*®£DP7Oèãr|!4+üä½(×Õœ †ËàÂd€<¨ A©¨ ¢m‰ž]x<”‹H8g´Ìà‡(”¾OY0öA8ú¦%L4ŽýS7>UýóîþݦG^øz|õ_ýé¾úon±ýÍs° §å7ÃyP^A©80Ý¥”ö²éÖ}â&òÏùã;æöÛ–äHBNÒï.Fò $ƒRq’µ†{†öÃÛê~ ÎÊ•;Œ³mXŽ3„áœýÞ3Å¢œ!Ê9(ç¬4îóA'Îã¶{Ÿvå‘Í%aÛªaà û]ÇC”pP*¾1'xM”¶üÿ™ß˜×ݦìç^n``œH–]ƒya¸66&© äAµ JÅÊH#f%úmQârJØÞ攀0\ ¦äA•JE•àfví5ûÃô™+±íÛòäNÞ¶0¢Pî> ;dÁ¨uâÐJj·ýw¤¾Û>ªöȽ·Š4ô“˜(`”ìïœÃa8'¿}(ȃ’ JÅQiJhã éµò5¬¾\Kr$! 'éw—)% yP’A©8IÕEL|ÆÍÕ=7±Mʱ…0œ­ßoŒ-äAÙ¥âl¥ù;hŸwÓ͒ȤûŠn•´}ÉÑœ£p˜^ƒ1–såy8IÑávÖ Ê~û¾\¦øèe¶ëjNÃMða*@Ô… T\®Í¡ZÏ2|W®i_øš¶ëpN ÃÅðaab@TŒ T\ ¦MM»h‡ò ö/4Õ³}Îéa¸>23GŽêyP=‚Rq=hM”Û ŸúÍæ‹ÛJHqó«èENÕ4×·+›†è©ç¶WqÄ.ªòˆÃT'Äby-…r¢¤òKÆ0Û¨dÉ0ձ䍯Éß4N6núþ¥zˆ½* lá#˜ëa½†¢?à÷ò`èÃRqô"Ò}èÈ ý»íaØ”K…gÛ°gÃ9û½Ç8C”sP*ÎYKÒH·½„^&,wâä°Ì a¸>Lȃ ”Š PKÂç«„»‡C5>u÷ÑO]/úŽmXŽ3„áœýÞ3%£œ!Ê9(符Ïú°˜_ºu¹òw9#N­Í 1Gá>xŒ0æ,¨ çuâ2˜m ‡~ßï^‡òÎçŸ7±³=Ìa‡0œ»yPòA©ø#Ì|UvWü.ãÈaxî«azEp?–Å'X”ñwùۘ$wȃrJEù¦%Ú]è:ì»íÿ¸ŽrÄãäm 3à! åî³`JŰCŒzP' ]·„»+`3ts4¯÷å@vÍÉà„(§ße'dœÿYªÏd endstream endobj 1259 0 obj << /Type /ObjStm /N 100 /First 1001 /Length 2494 /Filter /FlateDecode >> stream xÚÍZ][·}ß_ÁÇô!çƒ_´ià¢@ ¶ ´5üà:JbÔ^¥»rüûžá½³’kË»^‹E_¤‘.ïr83ä‡8çq¡@‰L@½›K1¡YiP­&䛚PBÕfB ­M5=¹]@bH=ÛC´ a{jm“}T¼.jO+>2ÿ€V²µkèRí)tüÓØ +>Z±—¬AÏ„FݵÞ7ÐhíšíäÞ¬O-cÝZ Âd¨­‘ѧւèDÃ@³‚-¥V`t R»éë¤Óx*AÛx 4F*Ó‡>«Xw¹WØ !µ %™UaZ­ŒaIJA›ò™qµçnÿqÈi˜&I€QªI²5†³+‰I%ä¼h©!ï¶«cÅô`ŽH(…Ü+fCÐqt€ì?…“a@U2 ÒPÔ,)0NÉjTB)Ù0ФÔb˜¦ÒšaP¥Ûì §P) ²y0‡ óš$ðí4Ôœ›I9ÔRG;øO5OLrmÝúöDÖÖX20„B.`“×tŒ@-›k‰hheŒRrhmŒ>Üú¥ÀIÛ8¤…N:´t8n6- w“bãP ]ÍsM01ÃU%ôšLKÖ·24¼ÖÛx7ã!…fJi4T¼—Ÿ5¤¾¨„E!WÃA+b FˆÈh€ÒpHɰå1F3•azóD‡£XƒN6IÃoÓ°ùpC²—Å¢™\lî.÷áÁƒ°yˆþZØ?2¡C«ŒUÿÛÒ@óp:䯿¾Ø|wµ{ñx»OÃæ»o†Í“í/ûðì äɯ?oñàùÛ‹Í︽Ü_[`{ÿbóh{½{sõb{½d˜ñߟ·ß¿|þÍî—ðÔþ(pÐÚù€ž_ám4”ÑGø6<ùjôí¯û;&~—Âå›W¯nºqËXï=Žš>0ŽvÇqTYþîòrmO—œjý9uŠ ‹Éÿ«GãÝ‹Í7»«ï·W Rzfýy‘p–h^_¤FE:•–#f²èø‰fßüc?Ôüéåå?¡l˜èqØüåÑ—/~Úïþj³yûömüq»{ýï—Û·qwõãoÌdwïEä¨ÒcBÔ!Ä„@AÆ*z§~¼~þòÕ~÷•÷áË7×Û«ë/¯¶ÿz³½ÞÿöÕËëýu\¦àto/·ûûõ1ÃDX5ߌðA¸ÙïO±Õ;³±¼~~9ž¾¼üa·yw(ŸÚYÕØm¹éß¶Ü•Xmµ?ï3³û틟â‹ÝëãŽ,¡Õ?ZwjôÁø;Î/gÅþ~(ÖzÿP¬ŠÕC±–OŽÀÕ©Á‰øàT£vús*é)Ú°µ×˜lÇÁcÿaòÿ0W°¤ˆu;©–5¬_HZØ1ñø}Vß®í¾}[£[}ûµó³]²¼çè¶ã¸·£7Zý»± â‚Ç@óh¾µêBs¡¯BO.¸æîš»k»æîš»k¯šmß» ä» .¨ Ù…âBu¡¹àšÉ5“k&×L®™\3¹frÍäšÉ5“kf×Ì®™]3»fvÍìšÙ5³kf×Ì®Y\³¸fqÍâšÅ5‹k×,®Y\³¸fuÍêšÕ5«|$ ¾™'¼H¬pØÂ5bÃŒµ«Æ\m—‚¥6U´»‰è?ìžì¢ð ÌÔÉ4r7Ð&‘á7 –ã`É‚f9(ªãȪ7 ‰61Ï)jÃXê¨íúò)P:¨íG¡xš4¢Bœ š5:Ì©[nûdPâXmçå X®òd畊š˜26ñ3-¡z(Uæbb­‰©0±œÄ–'Ï&¶=1óhƒ¥û,Ð5ÚN‡±&yDa©ÖÉ#uPéGAËy@©Õ(íà¸Ô%R¡¹#%ÔDí(Z¨q,“!K‰v¶qYQéêdLù5õ&²Ÿ¶É˜ŠùÓvÀÌ)vš£Ø{ ­05E™ÈŽ*ø-Ø‹"럲.Ÿ´v|ÖPlz£99è›…–—’¯h…u2 VB0‘‚zåÉ€˜I;É€(%±Ÿ ˜1ãު豦•É€¥E;¡€XÏTòdÀ\b¢õœÀÖ´&“±…µ÷ˆ´Å'åL€R[yTF^¥É€ “Ú1‚ b’ûd@ÊQP_@&ü×&¢"°KÂH »®2P»ÆÔë´ò¤Õ<°a^s©6är–É€ÕJ‘%,´Z29,´p´û²XPPŸÌ¥z&@W=­sȨöNæÒsâ›×\ª (Xì‹U혻e™ ØJì«—J‡Ì¥çÄv\Ö\ŠZëád¼’cY *y2“æ3áaAJiq))Ö“EÕ¹SÆ”€HãÜË\@î-¶²Ži¼¨NlˆBZæQ2ö.“­/KPØn\”'µÂiD/“”³F» xÈâIúœÊ_1uÕ@P)ŸI¶ýÎè652© ¿¥ƒZ> XΈҴçÕ¬¨Kët@,‚²&;ÑI-O$A6]C‘:Š ™ ˜äæ’ñ_=yŠ\ÏHXJd€„LG2õa]ëC;ÓÚgRLºäšål¬NÌ-꺧±“1:y\ÝΨ0©.QAFäà<Pz4RãTEm!“&]O1ì<ŒOÞ" °a_‘Ÿé)öVïg׿J·Þ­ßÚè¶»u¡°^unŠ\Y f\õ'Jû¼[w•÷é%*÷§—p½Põ‹Yõ‹Yõ‹Yõ‹Yõ‹Ùì³ÙeTüQñ;Ûâw¶Åoƒ^&N/§—IqÐâš‹k®®¹ºæêš«kv¶Œ8[Fªk®®¹ºæêš›kv‚8Aœƒ ÎAç ˆsÄ9âq‚8Aœƒ ÎAç ˆsÄ9âq‚8Aœƒ ÎAPç ¨sÔ9êu‚:Aƒ ÎAPç ¨sÔ9êu‚:Aƒ ÎAPç ¨sÔ9êu‚:Aƒ ÎAPç ¨sÔ9êu‚:Aƒ ÎAPù|¦€_Ú—6ƒ7—ö5cõš´˜Ü€fÔG÷*õ$·É˜¤±öÃ5dá„z¤OMÆN8².;áÔBÖÏÄNèëÑ5dîØSž¬˜ÏŠoÊGì)ýä¹Ç¹@kz‡`¬W9y~u.P®Ñøó7 ‚íû©ƒO=ãÄÎ’nè2ÃܧŽ]Îj :šSâ•°;T{‰œûÍÅJé6Ô.zûÍ%w£ œ=Í¥4ëa¤Š-v:• ÿ½{ô endstream endobj 1468 0 obj << /Length 1387 /Filter /FlateDecode >> stream xÚí›Ínã6…÷y -í…8üÉ. 4@»NÑ¢.\[NŒÆR ;õ`}öÒ6%R¤.™Ì¢…,ìÄÇ÷Êç;"%Ò!6?¤Ð¸Œ"¬X±Þßaû׿îˆ}VAé)¾¸ûp/HA0ÒX“âa[((§¦ GŠ›â÷ÅGLÙò‡Ÿ Œ¤PEI̓¼¾ôc³Ù­ëeÉ[lV‡ó¾¸_*¾xm>b†—œóÅúŸ¥ÀxÑÖæuª•" "Õ¹àÝá J3Ç~VDÏH¡®*~>vóé*ÅaöÀݪ9lÛn_êã¹á‡{åÉ+Š4צøEüݲ$’\èè7’í?ú†Àcª¢X & ûË‹žÏ½ªôd¯©ç]Xêb!"j©%ÂTû-'Ðöª¨e„W2ÔgïØ½6ëÕ±ŽÁ2…”fïìÛßEàjd.ƒ €G„ˆ ä?TJâ÷“´ 1^Ñ?k›¶Ÿ¯àG1Ûy¡â*yÝ•ëվܶë×C¡àòbe€™a¿ÒÙ8œ«ÉÆÀÕJæ h #޹ƒ\7Ǻ‹ sstZÜø@Ñ·æè;LßÇ‘¢ïj%é-#úX#Åt@¿l»Ý㮉C +DÄ{™ ˜Ö’L'ƒaúî¦`ºZI˜AË¦Ðæ‚SºñºÞ·Ç]Û”/]ûØ­ö1Ne ›püïpäúÏŸ!çÉ@r#+ä¼Z)raˈœRH’œ¹*›¸Ô–ˆ½ÏqÂz5'GuPÁP=—‰ Ó¡Ré¸_DT*D¸;·]]®çiõ‹Îgëa޼“Áè})ö®V~Ð2¢oNR¡Ü ýtÜ?—víé0ui% ’‚¾¯ @H­19¤N#õ=N!uµ’Hƒ–Ra„¤^‡èù„þ"úÖÃ}'ƒéû8Rô]­$ý eDŸWˆ wB¿¬šúy^-ùšÙÜ:™Ë€“Áð¡¡À ¸ZÉ -£ 0”’.›mù÷®>M é7»Ú›”Ãëd0^ßï^W+‰7há¥1J¼ÇU÷8µÔ=ð úÖÃ}'ƒéû8Rô]­$ý eDŸp·óÚìÎË õa ¿F’ó›Ã·¶å€; Ü'îj%-#à˜#bæê+ð—ÍôîFXÏÓùÛÏkj.NÇÁçC„ãàj%ã´ ãÀ5CU~ÊM·:MluðË­ßÍ„@Ý–AíÉ@Ô#悔Z)ÔaËñÖ3ϵ$ãÝÖ_Àý¯>§§ÝóÄaf•JÍ#Ä›Ó#°BDÊ¢ª´Aí˜ôªÒ“Eé KAé9×Á«}"l5Ê¡åö®ó´k6í ˜4Èœ‰ì¬1´®æÂàdp|@P\0 A«é0p‰¨ÒC€ÓËšŸã €u2'ƒàCàê€ZM€Uˆ1{‹rêvÇy‚øv„õ6 'ƒ#ác‚"áꀑZMGâ|›Ùï^"Q®ÛýÞ ‡ÞÉHXwrP †êM*< ÕÕ¡­¦¡šGN¤õiÕl¦®oõ{PkUް“Á„}×!®H8h5M34\Ö]êO/póWÝìÍßÀæêWŽò ‚!{ÆCŒ‡* âqŸéû=!1ª¤Ó¯‰û=»Ÿðéüeçy>ÿV‰B ™Œ'3ÓkR¡ñê@© [M ‚s$ûËÉK$Ê]³îæeá mk[޶“Á´}mW¤´š¦ÍR£`ú¿æ- zëa½“Áè}zWD´æ|†j—‘~Ë®~nÛ©Ù˜»F9Ï_9lp¥«²«‚ž ÌN¯±Ù!SÙñê¸ìü xÏ3 endstream endobj 1441 0 obj << /Type /ObjStm /N 100 /First 1003 /Length 2050 /Filter /FlateDecode >> stream xÚµ›K‹\¹Ç÷ý)´L6*§$031Î&3ö"ã…ãi¡;´Û0ùöùݺUÕ yã+0ô©û8?½ÎKº&qM%‘¸%¢‚' ¡&±q«%õq«'kq«–T …@©Q S Aã;Hx’|ÜÄ nã®'ÒÂ!A¡Q ¸xHøY ¤ÛjÀ0½½qb*ã®$f.` 5,ã]¨gÝÞEl{·&ö6î¶Äm{·'îƒÛK’2Þí” ‰“°k’ £kíã®%ñÐ=¡ïѪŽQj´Þž FïI‹®–¤„aƒDI]Ý×PI’ZiwCÌ%®YÒ*’'m:´Ô¤Ý†––¬`Ð!a.(&C©$c4%‹Ÿ8™qÐH’¹¤Éª¶¸f˜GÏy²^Çs5y‰9ŖcÈCêÉeèCÓ\‡>¦ä3?݇>–äÕ Öä-¦VÙ’÷mfO•Êx·¦Ê4Þm© w{ªªÑ# b5‹ ¥ê±âT8Õ‹A1$µõ`hI­ }R!I0ðp£M‹¦¦}h±ÔœÆ5O­rèSN­iÜÅDµîq?{‰E¨j K#Æ ÃÞe¼«5u-EW»i´^{êîÑØG¯ã],t7în”R¢Y± qÌat¬ðh¢á©"ó‹¤è˜P«a8cF ‹)Y/m(‹ +}LB´;T„ˆßDc4ÀB™‡í ÔaØÚüîÕ«»Óûÿý÷>~|xx|¾;½ûú¯çñûo¿=üçîôÓãÓ¯÷OéC?(ïN?ß~N¸IæX”¹b™b¥å‚ISiYã¹Ó«Wéô.þúøþ1^§?a&þœ~øáÿ¾Êœ £qrÍ]|僠¥gÀJ5K_ͤ\ÂóîÌâët-^1_G^-s_ÜS8þÜÕïÐf>•ƒ Þsxš ´®×ÅPk¹E¨Ú¡®ÙCIsxÜ 4,¨¯îi‘ÜnÖQv[ÜQî’E®þH`A🋡 N°]×÷’Íf£A«f»B[É…t1Ô1‡ˆ@hX·ÅPrø†ëâeVø†ºZÈäj¦ b¢µP˜$,æfxaAî³ÕkA2J0!âÅL,ÞH¼/LX²ÐÅPG » UÆß¶˜iö"?"ÐMcj7ÈÍ,°Z³4_ 4Î.Û*U ©Òb"~9¯Ud²«×Œ ’)ߦP¥fž­+¹ >m‹å4ܪ,’¨ÂePiky‚À[¢ƒW,k_ DˆGº:€Ò5wòÅÀêÙ|‹Ò46 ÝP½n¼*óôÂè *ÙŽRÎûb !§ Í(„pm "Ä7ÙŒB RÄÅ#Êö„mKLÛb¼ŸÝ7Ϫ¾è-—¾Ù#nS·Æ­fÛÃ<¸Ñbž"¡Ø ²áY¹vOËfƒ¬š‰êb jŠzöjŒ¢Â¦^í( Y¦vžBÝfFÿ{¬ÚPéEEÓ8çäÇm ¯#“Q•ƒ\÷…üoð¾·; N®¶Õ@”Ýq4:΄ÃËÍvÊ¢Ži¶Y"…›cY tÍìg`E~:K‚M¢Žñ¶Í!YÏH¼U༷EŠz3·ê‹9éy?¢ˆÒÅÀÖa [üE e>smv ®vØÁæJ‘öilz{>`"þœNÿøåŸ©—T¹¤‡¯¿ÿþqèÍãÃóPô&‚ßö웊Lû,¢V9Ëñ j©íG|cuü€ªÓÛ§ÇÏïîÑätzûúM:½¿ÿã9}|Ùó·Ÿþ}wú ˆ÷Ï_âÀ4.:ûåñëÓçûqÍ·k¿ÿõ·O?=þ± Iìâ֑Ľýô„·q•íÁ1ž__TD{ÆgÁÏ‚ò.È.ìëþ°^®»Ðv¡Ÿ+»@»°k¶]³íšm×l»fÛ5Û®Ùv;kö]³ïš}×ì»fß4üþíMÇ‚¢›ÓIÇÒî$kÖóŠªÃ®gJŽõ-:sJm»”Üýºwìâ¹j] Eu®7g-Ž fg-‡AQ€4½^Š]žÅÃk€ñÍ׎R½ÌŽƒF&v=&4$+HÎ&̃ά¶±=pâzg] uT'í¦§0 ™çEITèzÈmιöÕ=EmNñ5ÎÓŒ¬ÄDyÒúÕJMi~Æ}”ã³+S(Ób"®H8'›ÁEqtõ VâdkÖÏ~Ð'j(â3ÝË'j9oñ5ÐÛ3;gç3»HÒx1ÐZfݶ¶%Ea[ ÔððÛ2üÙéÄa@Dh9oª¹r&ZÌcËñøv sœ…//ǃ깸ŽLº/–88Ÿ»ÂYÚZ Å·&ºŸÙQ¶Y < ˆðQÏ‹Ô þÍëb`ÄŽó‰–IŸîüŋͧøŸã8ùéÄÏøe'öÿ„܆ endstream endobj 1504 0 obj << /Length 2199 /Filter /FlateDecode >> stream xÚí›MsÛ8†ïù:RU+,ñMîMþˆÇSq䊕¹læ@Kœ w$Ñ%Y™ª9ä·oƒ ˆ@g2žØeWª"‰juKxŸn4Rø‡Gy:’”¢œe£ÅúMj®þþ›g0˜8'ó7ÿ~Ëñ§(Os<šÿ6â8C¹ìÜÌ—£ÿ&Õø×ùÏoÎçNÈ@ eqI’–ˆ`ÎT¤,CRð‘€G’séSJ¨ 6ˆP>š0„…~çr³¬¥zOûaˆ2A”øI £”ÉÖpLqr¿­Çx\î?¥4ó4Mã,ù:æœ'…zOÚÇ‹²^«}©Ê?t'ÎÀ?Í!Rá?ã R?ˆƒWßyñouæ\ì©Ç`¸r:Œ¢4kÔš÷Ñıê4´#ÓsÕ 9ŠÇS7˜‡e1 È€©Ä:ÈYµ»ßV·ûÊ/¯GDÀŒ§ôïÔð±äú±<`Ñc?ÀJgAÅ‘zIéœA‰…N¸Ì¥&Æi}W›¥ ‘#Nå³Më§ÈI;öqP«0)22*Ž›+ñH Ö¼ÔQÞ]žž¿? .’¦®L0<›êI⺙—r‚røn1!{SÖ„Àd%Gç½'àÑ|þâüÃô~z63—ÞôaIÒ¿ŸË€DæHd­"¹ƒÇ½Y7A‰z‘ûœ2è!´®Ù9ždzއG3Ç3Æ“Å×f.hgž´6 züdg€'šçÿX„#ZâŒw‡pÕVÇÌCQßYXë'l4T,¤‹ä&7æç®f7õ”&çê%§³÷g—§cž1]kš®7…žZ Ÿ4ÝÔW][0☫Ó½1;7þ®ÇM¦¦úÕic¯f6ø¹Ž¹-SW×—ÓéŸ]ÞÌ?\ž|l¾u¿VËߣ‚x›ÎÚß©«"¤š ¦›6ÿjvvù*c/ˆÜ‘GA¨"» ž Ç9bù_íÓŸYþý3_7””€ƒHÅ`RZ³XR«F4éMJë'˜”ÑPmR2X0ÎÛÖp]kT§w«jQlubžïî˾>W©Un×µy}Wl ýìf_ì´ùûZÍE_ÆÐ)´—NªÛUUß— ¸à¡”HÒÔÇ™ˆúÃGó&ýÚ_PÌXM3Ÿb=gÍ÷ÇÞÞÌq’¬ë¨7c¥G!¥â±”R R\šþÃÄ„'¿T»£õ‹r[¬¼ù¦ Î^ø^[ 3¼CHX³Zå^$¬£ ÑX ,€µ–Ùò×HÌÇ9KTËPù)È Åùë†ëƒwìZMÍ`bÍb€(—z±Ž‚€Dc Ħ¤Ûé×€˜Ã9¨>·É ’¿2óàV øX³,‡*b,Ž£,ýXþ•e1±šgRärS-ôN³ò®õ»éÔ»[Âõ¶‚(A€Üënï77”º›oÅX8f‘¥Á¡²~Ь£ EÑXEœ!I;Šˆ¡hvg X{HP·»<ËR?¾«6Ÿ M×rŒ“ÒìÓÖk{~ØcL¦ßq¢ð ÷C¬˜!bÅšÅX9ÐÏÏŠud%«c…aij¶º!ÚUœæx f©EaÊÍI±« „hÖn¼™ÕF³‚“•¹¼­`år×v@½½¿ y¶Ä„0ã8€5‹p Š÷ÇQ€h¬’!F[ý™Ñÿ¬ÚÝ5'‹õ¦º­VÕŸvö™ÝŽ'Ъü¯¼¯Ífï²´‡‘M51 ñIа Iù,Bzêa’³³Š©éްðŠÙ¹ j ÔI‰9"Y+%7R~ÜuWõ~Wö÷óOëVÅU{p µOíþ1¤®©!y­YL_wØ™÷¨ÇqT8«Maœ©{O»Fà+s›Gõ)Ålae6©ûVÒ©ÝßC…g,)M.»6Í«]àP.ÍQžgÏo½€ Ë³Â0ïÖ¾ã(A> stream xÚíœKsÛFÇïþ¼-yàóžñÍÖÃqÖ’‹I¥j³©…)ØÁ®H:$å¨|ÈgϘÉéä•HT¹Ê¤Èf7Øÿ= ót1”"ÍÔ`:{RØWÿ÷Ûgcc0Ž,žOž|sÌñH&ïs¤©ö~&ƒ ëzôïÉwOŽ&Þ'¤'Tc±K’fˆ2AšXÍášÐ•]6cLøðx¤Ùp±œ•ëÅj4¦’/Ü“gËß®ê#Їþ­²{<;{ñª9Êo޵ŒƒA%ÔT㩉!d÷ 6þú¬·ÒÂÌ÷Uû¯e¾·Énûf”g5ŽÌéÙvÖ¿;1yÇKHÑXìÄÚ”ÌÅBSĵ¶z l¾gQÃÅ|DÔðcó_5ÿ¹ Åˆ16œþ1âæÝEµê2ÏuìSÄ õ™‰¿mV„>“5jtp‚B$vVãÈ,AǶ³ ‰‘#ˆÄ|,Œ5RJ „*sÈèY<¯[×åueÎ|J œ³‘ëY÷gÙ=LFŠ£±1íª‡y­{d¦À¨¸À˜W.FxXuOm‰1Ÿ[tŸj+Œy#T˜MΉ9:s cLæwWeöö/:W„DD«Þs%˜åÎk•;W‚#ð\ÉÆòç o”á\!ö\9]Ì*ËþEï̘ĉܪ}§ðX úà f9xbAx‚#žl,3¯i࡞H~.1I†Õr]OÓzI£âñBÿ…AàYýúÀ f9ðbð‚#¼l,‘H±j'ÐS“YÚ¦y ÀRÃ~©>5‚YN8CB'ÕŽ@5²±¼L!Í"5paåxö¡ÜU#‘0Mz<›¿à¬œ“¨­`–c+Ö[I¶‚#­l,ÏåH6/y¶°ïì£4ÃÑv2{±Ù@Lš êêz}µ,“×®û@Ä„MmÁ,ÇD¬“äI&‚#‰l,·¾Æ AÂ÷‘d·‘Ø‹n-F0ÿF[ØE[Ø“„H3fUô¾·’ŸÓtî#Ã[åÀˆÄ’É‹àÄ"ÈWŠ¢Q˯º¿ÖõýÏŸv‚O—;SåVÙøíª¼XšK{}ÚPsµO_é±2A)¿·£QH›Ë>‚YŽ€Xàd ËAÀ´@”F¸êprtþ­…़üÕ®o.«u9uY.Ûkˆ®Ãæt1¯¦ëò"yñ T ­ð_pñs_¼G±È,£ØFe²•AŠåcyÅÌp+s+'ÏŸŸ5%û§§e}í[ùÕª[”6ýä…•rUÏ>\¦—V°¦ˆPuÿNRHk›²>­ƒYNë8ÿ29PˆZgcy­e¼QÉhí+ηf‹E…À·Ÿ,v5üyõ©6ãÀÔ2[¤ÐC\)‘ù}W/™Û µí¬M·JŽ"G ^ÙX/.Ìc„—[±ˆ@Ší'užtáÙñq²€0Ó–jï–´z8±éîã$˜å8‰µS8ÉIpr’å9aI*'â¶œüxt0I)R’ïOyаîC#˜åЈåR4‰Fp¢‘åÑ …¹°ð€†¼-çÿB‚YŽX5Å’„G !ÙXž,ÛŸ'Ä-dœ¿þöèÍQÇÆq µ¢…é‰%ÈS _q)ÔiÑQ0ËA «’3X‘#¢l,QaÈQa ˯_ܸ̼<=O_˜FRë½ "Ä&º`–#$VM%÷uEŽ@B²±05%ªq»ÂñóYGוê:>@Hˆx܃š«.É=tDf:6SÉtä¢#ËÕ*%Ò*¢#¬¸Ý´€¼zy¶°dŸFÈ6Å}l³±^:9 Žldcy6DWAø¶lL@8DÝã53—Ü>*‚YŽŠX)€Šà¤"ËSa†Bሠr[*^¼iŒÎ~x&C#ú@×ð!lJûXf9b}trþ#r²åY  q³@oËÂáËóƒo^C«¦˜?”!¤½MaŸöÁ,§}¬ }pjŸåµ'Üœ§‘ôn ~w“Ó…]í¤÷¿ä;8;99:@[/ÀàÒ¼K]ŸäÞ*§x¤ ¸wê ä¶JPL!~=”‚bÏËÅø}µ˜Uëe=ÖºGxo'ÁoEŠÍz*Á,ÇJ,¡&IX‚#–l,Wš‹… ¸ø1g¢:¸=’Êe»±/‰ {9éy›–Òå¼–È,ˆ€iX"G,ùXÅ‘&*ÀBza©gåûj–ž®¨àò‘”· .ý}ܳ7±–7ÁÈM6–çF$¥ ÜÐ^nÚûÜú‡B’œíïXÕå¹`–$M'7qEŽ@@²±< \#A"@àõôpܱ1ÂC‹Ôº¹··Q±yî$˜å‰EÓÉ=c‘#l,ˆIq=¦¿taV¥÷| …X!çÄ¿ö‹"A…— ¾¡Sc5ŽÌ’¼m:k•4â' ž@à²ÁæBX.LºßInßÑí?“ŠmÜÆ­ ¨À¾%BÍ€ÿc]ýÞÙná—1¿Áù©»Â Søïà>ÛÙ$Ýo@\6 ­Õ82KÝþmË™•0¹E$ò$ü™J endstream endobj 1594 0 obj << /Length 2572 /Filter /FlateDecode >> stream xÚí[o[¹Çßó)Ô7¹…Þɳè›+v±‹(Ðíƒ,¸Bt1$9›E?{ytx“ÍnZ{#; DÖÑxFæÿ7Cž!¥e#êþc£†ŽŒ¤‘v4[=¡þêû'Ìÿ4q“ÌâÙù“§¯1JÚ°Ñù»‘b¼û9ú9Ÿþ1^,gÿ<ÿþÉËóèJq^‰ÕYÜ føˆI"¤æ]°îýºØT˜>Ž>›0ÆÕøÇŸ)gJóñf~½ÜìÎ&ÂÈñK÷êøã¾Ý®Ý÷vž¾jLî)I”å.úÁÙ7Î\›þA=»‹wáÆxK®ˆq…ñrêt;¼˜y°šdf…q¿éì0^Œª[AÍDî,n;&ŠQé#Ý¢šÆ+M˜ûC)¥ãç›ÕÆé+DPÝ]‹ª §zPü`óÝúŒÛ±»2½lWý¥Y‡ÅÆ?ñ®^·î7ã‹ö—Õäï‰[F8³ÿ#*VÉá®…Ž+ ’·šdf…»é S)ó©„‹*YJdÈ{M¸WéåÇvuµô£ËÜŸ/¥º)Xÿ¢×«òvá~«Ý% ‚H+î2[›„†$÷W“<™a’ç*@’'O äh°(¹6„7QrQ’œ¶ä‡'ÛM×óMŸÈþõ7]OëvÙ_žŸ±qÛÿø|Óg÷v³l»¿xı.K'LæÞûá ¾êLþúÓoKPIF3©GJ793iªé‘̰ôðV>=šbz$O`z ÁbzHw­Ñ!=¤Oo{œŸ-.–‹Í¾M{†ÿþêÌ:Ö·«bÑc\;¢Íÿ?ï[tÌ–i·¸ès@úléýµóÙòéù{;áðw©á2È¿ø¢]mÖ»ývº_¬/ûÔx³˜uéó¾»PH A¢Y•khØý›¯ {2Æ= ÆËE*y‡ †]YKD‡Ýøa¿5’ß¹aœ.—n ÝŠ­8ÍQbñuLswà )ÈQ)3C@:ÒÖ­CJ ež ð`Œ5ÄZ;RF.E)Þí¿Ù.>œ)=žîýšÿÀ–‰lÉ:[ÚNíãZãCøa¬Ì0rM7E’'4X@sBž„·Ÿvûйùüºâ´gÒ>®ºiïG°¦}2ôÏ倴Ož@ío»ÕÍU.¥~ i|7÷õó¾é:¸j<í~pÓíµo๧ó¶tkÙ®[°óW7ýã¡•'XÖÊ;îú ·žPn ˜"¡º=ŒõÛi¿A ý¬˜!T³Zû93CÚÏÁÊSi‹T&O •7‚kJ‰æ¾ü™¬ý|è9}èþi×]ϸ+>±}ÕÎcßù0;½hw³íâÂ/ ÅøÛíåõªíÛV~ Úùøtu˜Õ€Î§Ë"ã½×*U? µª’̰ª’)ãÅ6Læ Ô ô“ÖixÐ/Ì'®¸ôãþSû®Ý¶ë™_F¼¾^ÌÛâ"‘Ô-˜Ï‚t23#5™ %t2O:x°°‘ÆÕÎ":1ùW¼éë¸l¸w9õ»£ jÇd†ñ˜#ñ˜<<¢Á"šf2¹çq(ˆ«kÃ?–Pµä!n }5Ýê sÐd†šCš<„¢Á"¡ÒšæÚ¸'ø§â¦› JòaB=]{5kF+ŒÂ Âèd‹t7vV7‰AY/’ŠäÃÓë\£3™axæÐ@|&O  h°H(gİŒÐ°©÷ûb•äŽùaç÷œA z9k &3 Äœ Ää  A¤–(mˆa¿ìéâCÑËY1™a æl0ÁŠ &O ˆh°¢h‘Ì$Ãâ†u㜚ƒœ33Ä#63Oˆx°¢u7Õ:Ñz'@ÇG7rèøœzÇ'¨Zã1™a<æˆ@<&O h°È£nc:ñØxÿRä±!R±ážåd"@4X„ÏÝX–ÃÇŠ­KŒûtÿ.·vÔ@å)^ ×àLfœ9/œÉ',ÂÉ¢µÌà ;ÍÓå(ZˆÂS*^Ã}É £/¢/yéCƒEú˜&ЉŒ¾°ó2]Ï‹ôYBíé~àéq.F!ì¼x5ì’†]N„]òb‡‹ØQA„ÎöûXø”Óôj²I磶[àPMÓ—ÖáúЙצFU2èʅf‚©Jž@ªÐ`*ÞPÂYNUØ ¹˜ö»èþ™m–›mqq§]õ&Öû8ÌéiUÐÊÌ´ŽÔÐʉ©ìðQá_1¯…Á®ab°c¸7¡˜˜ê™_[öߘá»çµŽ2~ñOJkè%3 ½œ½ä D Ñ“Š(•~࡯>Û¬VÀ´uEϨav5A–PÉ *×*yBƒE '’æ@™ÔºøíÝW̨a_æË~s`­\2ÀË€€Kž@àÐ`8÷ÈUv‚†ÛÜU7m~ q}ñiÓKWƒ.™aÐå@Ð%O th°Մ埗籉½Ým¶“Ý~Q>=Ø0¢Ök÷е¢ÔpJfN¹ÂNɈ,àÔpÒ¨üÛè1MûCË~±?Üü«Ü7s¿Õ “謾¼Ž’‚Q®,ÅïÐM~ ˆÐH!ãhvôA„žý¼}w]ürEmÈ0~©ÿ{„—«ÂX²BË•K~cÿ²¾Ï2 endstream endobj 1470 0 obj << /Type /ObjStm /N 100 /First 1006 /Length 2330 /Filter /FlateDecode >> stream xÚµZM]· ÝϯвÝhDФ$À4p7-Ä^45¼H“A4˜)Hÿ}uE£¨ïmÜŒÞ,føÞHµŒÄÇóŽ’Ø¨ºD‰ûÜÁ‰»¯OFM<Äg IµØœ¡©R›3° ìàþµÆè©j™{ƒqFÝ%†äO¥Z°o25$pü·$á1ÇQ¡ù]O¢Ì.aœU`(þ½†b±RŸAœ€í3°Ì"—$)áÁ!iÒZ—,©?~©òœÛ“šF'mês¹$íV-ÖÑ|.ÃJ÷¹\q¶Ãg°$«4gh2aGcK¦uÎhÉLÌ¥ž¬éœ;’uó¹µ$€«he>)ޱqñUV˜M%Ÿ‹E7™O ¥MÅWY-5sËQOk6gôÔz›3Fj£û îT×™|¦Á\üYp ½Î¹ïÓ¸Tðß1W)52\Lj°[ L·ÎóÀ²†ÌUâ‡JwŒž†¹m¨bFk 3úÔ§níøqŸ ¹µ©_avB©ó$ £ŠÌº¾¢æH†ÏÅÜ„q`[ŸcSÆÔë£\±‹ÐH4Ä­’CШʜ†_p`‡pÃÁo‡€ÿÂçóƒ‰Úw/^ÜÝ™Þ`pƒÓîÿòÍ_±5~Réñç|{÷ÙgsÐ˧Ç÷éÅ‹tÿF¤ÇØ—8\œå!½bŽì–Æ—“)BÕýWïž¾{õð>½I÷_}ù2Ý¿~øå}ú€òú_ÿ|À?¾ýûÃÝý€øðøþ'w9ÿîþ뇟ž~~÷ÝÃO‡ÃÍïþüðýß~ñôKzSð…Á[Úà·úöf{À©ÇÀÏŸ íÍÉüyf$[B ABÐ,„Ba,¡—BsÍ=4÷ÐÜCsÍ=4÷ÐÜCóÍ#4н~J0©ßñïý¼ŸVzf˜óDc 7>E«[Ðà'Ù£„£iòS4Ùƒæº'š¶Üšž¢ésÑ${pCðöÃ:àªfXæ-áýr[‹#‚ÉŒS´öL´:rž+-Wd‡ƒõçRÏ­’ž{tµæn¾‰#{z™x™Û9žnZŸpÈ$OK®ýFpky8±"Çé!óg¤Üs¼¶¯vÊ¢Çòê€LçÖB}ž`[ÛÄ*޲œû9MpdÙÆÅ*ÜÐì<ŠqÙƒÇØÎ~¬!,ó…§WÚcœl pGØd„PÑ~[<ålG cã\K»-þÊa› »AõtW7ÁÁ@j9Œ•].ÅÎñlU¬iY sîzž†êØ„W8¯õ$‰rŽ'²ÈÇòuBj@Ž·)T£oÄš{Aóš¥ÔÛâÁ µéÄk%³^àm:?Ô’YW*‚/d´8çuÄ&÷#ø@m Oà.Ê–Mî‡n*3©jɽœWº©rAS‡TtTèɲ{ƒmÚM8Àà…V$£Jû8ïúÿ;ĽßýË1 “è½!våY}¡ÒÇ}¡ŒOë U?î Ç꺜¯Y…ÐCˆ1c(ƇPC4 ¡…š)4shæÐÌ¡™C3‡fÍš94shæÐ\Cs Í54×Ð\Cs Í54×Ð\Cs Íš…žÝh®*¦•–yuš°¶s;Ý” Eg“z`¿IbJ&'g_ÛýC¿-J¦²‚¶ÖÊõ¶xRò OzÖ‹¾}£]EšysËçQÛ6EmĬI/!(š.âh߃§è¦m•ô†¢‰ø¶ph§ÝÉg÷>4»ñòÐ5ðr?í¨AéÆxèùF[\Úw³ ÷ÛT3©X^ ’*¶–Î[ˆV6Á!‚ÚQ**¦jp›*P$¬ìÙë`–PÒyÇÒ69ê¬iY'J¦rQ3íÂï¡iᕚ]àõ]dÐ:?%7;OFm“u ’Ñ E.uœßEEß7™§¨`M ÏP„^Ð!v‘g”›¥”ëEôì›ZáŽ5-r°öLvžŒú¦Wàþ¾ê`ë4_t,}é ¼ÁÚ‰Â~îí}Sj¯‰7ØÑ[Ÿç†¾É*rQ_ôRíšõ‚Í›¼¡¢o´ðg)7ÆóþÝ>PŸ|AgMÎWѾˢ³*Ò ]ÐYÛð¼×…W9½1úw*‹J¦‘û5x}æ¼É¡ËvÑ©lÃëèÆJ[drÍZnŒ× Ö´èV$£zAg¶‹LnY×[8'²¯’ߨðêÁÐI3|@ÅH„EÏñ¨”M€ø[¡ÅÞ–]¤*Ï=A¤ž6 ^y´VH’i\¼+òɤåV$>ùÅ¡¸­ ÉÖ»úßÌ>“[ ƒ3ûä/ž…TŒ#AÅHP1TŒ£1Xc°Æ`Áúapð6¼#dña¡ÙB³…f Íš-4·Ð·-4n[hܶиm¡qÛBã¶…Æm Û·-4n[hܶиm¡qÛBã¶…Æm Û·-4n[hܶÐuÛâíó 9­[Ûÿ$¯¨èwöJÖ+g¯èâ&Á>ÀÖý•÷AGôž Ë)IÚþÊ.ƒØØø‰Q݈HiC£ä ÝÅî¸Âà€ŠZºSû@)5>/”ˆ7­ÐoÔÔ!¿J*Û&ÀOd•ˆÛ&ÀO¤•ž¸¢ÌÁ~,ÀùÞøê 7U/£ñ«w‚ÖöêboòCéèm/.½­\ÖMå’L6ž‚îöªzÙh° u tc@ñ€½Øì¨Þ®Jîë ß¼ùvc8‹Œ7‡+š»¬Ó#ËW™÷ù—Q<Ь«Ýt"F.ýa '/2Ò©¾ô‡]€œ´ØÈÚüâßP=™·:\¡þÇÅÏê—ùÆñØS‘,JÄ_ªÞüG]×ÝÐâö_]à¿øé endstream endobj 1647 0 obj << /Length 2304 /Filter /FlateDecode >> stream xÚíÝKs7à»ÒX¼{LUö°gÝv÷ÀHc“e>T$moòëwH Ð-ÝHôd­Q©Š¥Õ­b…{0´šÉñ5KrŒÉÆÙíæƒœ¾ûùƒš¾šsñË͇¿ýé™’"ɤf7gN¡•.ynîfÿºZ}½þÏÍ??üzS29­¥NZJ%cœ…ñ{Ò„‡ZAhaôõ\I)¯î†õpNÅÇŸMøg}2†±Ôù‡þ>Æûðð‡ô_þ›Oý¹wªð6¿îwm·c?½ñ¥cc_ÇŽžÿ'j}Žš£°Jû¿Ovî¤2ö‡¢Nâ‚k§ˆF±lÍ'?þ‰­™lmu[•æ¢ðÉ>QZGõ´ „»Ü½†;Ƹ{Dp‡2QîøbÅ]4"ŒEÁ-î6Ãö°ÚmkøbQ¹Žï¾I‘šÓ"a)ÜeŠd"I±Å © …‹‘r…Ôq9ì‰Ë¦•¾{zå ”µ©c-kÆYÃí§¬A&Ò[¬XsAXƒ­ùlm¿¸Öñê[U›éÚÞ®…nj] „qè°5.85t‰DÇ+è¬:Z„.dt_6÷óåb{·5xJúñk×ß„ç­WSZt Œ£ƒ»IÑL$¶X¡c”PÆ :q¢3Üž–«å®º^i¡BìjÞæ×¥ÐM­k¡ƒ0v@¡ƒL$:¶XA§‚H£KÝfw=ÙÝ}YóÛõ°ØS«–5?ÉõòW­© -@ÆÂ=¥A&[¬’VD£•5@wÿ¥²Ûê´B)%\л†]ü„ajA „qxp?)<‰ÄÃËx\RÂG…ð(Ï]]OR‡¾cÿ«›ìüâ7Ø 0†Í£NlP&Š _¬° Q8ƒÙè›Õaÿe»]m?UÙè$lò}Ñá„L¯sK„qBpÓ(!‰Â+B¼·Ïˆ©¹_—Ô¦F©Ø—”çmj¦&´ô”(ê§2¾j§ä!ép•Ч…Ö Ñ±5:ãÊR—3~U_U^æ 5õ¢%Â8B¸±”!ÈD"b‹E& ðäjŠ»ý±ÎH‰¤U_€^†ÑÔŒ#ãáÎRŒ Ɉ-Vi7:ÀŒ|•ÑqA9ßûþîü¹²© -@ÆÂ=¥A&[¬RZ„€ŽØPtÜ/¶‡Íªnh,¤í†ÚoÄó«ÝraœÜ:Ê d"°Å²›’ðÝê·eö|¸]¬ëÇ™ú}þw¼/›;Ö°†ÂkÚ¯L¨YC™(k|±b-Ž¥€­•‘ó×kç¯kâH“³º¯B—°Îå¶ìAgs ìA&Ò[¬Ø FÎ8 öÆ«á°=ýû8ÿ|­ÃÕð{õFm’"Z×%¾ÂÄ ·§ Â8X¸×,ÈDÂb‹X^ Ð}§ª°ò®«zEMã–®ïÖŸ˜Œ"55¦E Â8R¸Ë)ÈD’b‹Rötc“ÒUR÷«ÛÓjõ™8‹™úÝÙ×.ä.µ|Aç ·\™Xõ™H_l±âk,ºõïÌc_õ™‚7¹Ð'œïzg&÷®¥Â8u¥2‘êØbE–"ht^À•ùúëˆqç¯MêkØEìü§îµÜAçS ÜA&Ò[¬¸“á|ÈÜ•‰ü{²Ý¦¦/ô³)ïñˆCnW „qÐpï)h‰„ÆËÐL²Âjt8Áå™ýÇý0üAÒ¼}‰{Ÿ'sÇÖPcíQû k(e/V¬E%4šî»<Ýÿ4ì6Ãqÿ{õ=Ñtk¯·vM]iq*Qœ&Ô` SÉCZâ*J> …/Q:½øº¾Í¿žçb{êÑ?¥­)õ«e{'5½Þ-$%ŠC‚ZG!)yH$\¥‚ÄY‘<:ãòè~Éð Ï™kõ=Ô_£æ6µpA§ ÷œâ™H_l±Ì*:ðà%£>W¡ózc^S“Z¼ Œã…;®Lªò‚L$/¶XᥣðóÊSúå°¾¯îÌÕøÞ²~xßÇAsÛZà Œ‡ Pà  Ž-VÀ)'œB;tŸgøËr'¨z»;øóö¿»{£jnT‹„qÄp×)b‰$Æ+ÄäéÉvtœÂç1þòp¿öÜ{Ü]I'´ïÓÕç^§&´ø@Çw”â™H>l±ÌGÇ$´Â|ò<~õ±ƆñwìムüЄÜɆAÆ|ÄBYY3ˆ2QùbÅàxµ“Êñy6¿Ú.W¿­Žóo§l±'æR¶Ÿ—’™é•o™0Î n#e2‘fØbÅŒ×")t:ÂûbæþËñáHózqÜÕ[W^ü,«Ø‹z™^õ–ã¼àR^ é…-V¼Ø$‚G§|(^ÎçhÆÒáHlŃï3Í7/äNµŒAg ·2™Hcl±bÌxá6–‡èëÅy†þÛÃ[¾Á¬ßh~KfS³ZÌ Œc†;¯¬ª2ƒL$3¶Xa¦°Ý«ñy ¿ê'ht?xaoä¶ôA§ƒ ôA&R[¬è¿g:ßòˆ~½Ú‡ùízw¨cÒBIÝ?ªê5³©)-NÆq¦8A&’[,sR)å1§<’_ïw}$¡#ùܶ8Æ€{d@Y]‡2Qàøb\´Bboy#?$öÝÙ+Ÿš™úÒU¢8O¨Å§’‡ÔÄU*˜‚Ñ¡ÁM‡J?÷%ìR—°©w-qÆ‘Ã(s‰DÇ+ê\w]Xý^Ý|ØÞî6÷‹Cý³f•ûyn/¾è"5½ò-3Æ™Ám¤Ì@&Ò [¬˜±V8‡Ž>G›™VõƒÊÊŒpÜÏ~_šÂ1½Ä-ÆáÀýRÖTq@&[¬à0JX‰Ž)ÿŽýp;äI)ù™Eýó«_j¡™:Ò²aœ%Ü^Êd"-±ÅŠ%…vØRøÁÒq÷p á|S¯ú&ïô”¤né%Ÿ„Îi‘‚0Žî2E 2‘¤Øb…”tBItF!ä¹úfØú_riÓÍܰ5ã¨áîSÔ I-–©¥ñ"æÐI„°´ùâžx¢Æ_ðgðÿ ¦¶4> stream xÚíÝMs#·àûþ ¥Ã Ÿ>ºbrÈI‡T%9ÌR³mI”Izmç×gF;@7etcw%JJå*¯-·ºU|Ÿ‚Œ¬VrúK­¢\ù¾Ñ„Õúö\¾úó;µüS7t¨âû‹wùѪ•’"ʨVVV9¡Î}..Wÿ<ûxþï‹¿½ûá"7²ZW&Í•QJEBXùék²÷ŸFy¡Eç’RžÝŽ»«±{?ìÇn¸Ÿ†©E Q ‰Z·ãn(‘š·NcÛÞ|ÎÏmK5B¹Š„B¥å>¤nRæcµÐ:"?û™®G:œÆâ·é’× =­EiI¥f Ê8L8bJt"9±Ã²§> éñõ¨Gž®ÆííxØýA-Ž|Ûºú‰t–jt Œ£ƒÓ¤è@'’;,ÓÑvºú`:ÑÙÄ¢zZõÊ~lNüãR¤–`j¤ Œ#…S¦HA'’;,“RZxŽ Ä¼Ñ=þ㢤É+¡ThšN5"¶U#e1œ:E :‘ÄØa‰˜‰Q8ŽÄ´ç}·ÝÝNéþ36Û;êoÞToŸëžôŽ—¨ØAeŒ£8•ñ%;¨e‡–íLï]Æc;>Û)¾×YßN¥¼•KV ¯ÆÊ8vXÅ:‘ìØa™ïE¯ÑQ‚˜ö¾Ë7è¬j óך@á["¬áƒ2ö@áƒN$>vXÆçät CgbÚ=¿ß¬ç͆Ÿ‹Çñ”0ºü}¡fº%º:(ãÐa:èD¢c‡etÆ ©º Ü#uÝæa«ëãf¿y3–—kÓw¶“ÄO^®-YÔA§«L(*‚N¤"vXV4 ¾ÇŠÔãk—µgág>ÝùÕ÷Û]œÏ¹@-ÕhAG §MÑ‚N$-vX¦¥¥ðZcZiþþáúv¿¡>F†¾mY¼Èù©R”q¼pâ/èDòb‡e^Ó[—õG¼ú¯n(~ìŒÓÕѶzÏz·0ERÃe&œ/… :‘˜Øa SÍÃba2EL‡íüžøÛü·aW|ÊFÍzÛ’ê VOéů°Ae ›£$•‰%6¨ņ–Ù%´ÇjÒ^üýîÓƒXëq¿ïƳ—å¾sñ ºRF„öÃ¯Ž–jrreI¹É}H6ܤ¬Æ¡ŽÞ¸¨¹*®‡¼n ¿Â]Â%©¯\ÅñB¡S¼r’7)ó²FD±¯´ÿ˯›âbȹ¶õŠïK`5fPÆ9ÃéSР)–©%‚ ˜ZÈÔ¶‡‘¸”™ Úòè¥/eKT5dPÆ!ùSÈ ‰Œ–‘é œ;B–¶×wC^Ïk,ŸÖXÄ“3΄v;!±%¨1(ãˆáÔ)bЉ$ÆËÄ”Vá…¼’Çĸ9aº¢E×®h'Š4ÅTe0œ9 :‘ÀØa˜Ô¢wKÛì»q(ÿ¶/T웪×ÙMÕ¨AG §¯¬,RƒN$5vX¢¦CZQÓ@í¦ÛµùöìÄI~\‚W ©Â •1¼Ž'x¡N/~Xæ5I‘Îb^}æu™d%a~ú@áÚ­Â#¶U#e1œ:E :‘ÄØa™˜›ùÂ'”ÉÄ®ܽèöË> stream xÚ½šM‹]¹†÷ý+´L6º*Õ‡$031Î&3ö"‰ñÂñ4aÈÐì6Lþ}ÞÒQ™xàº'“£Ó®¾}Îûè«T¥Ò%mœJ"m’ˆØ Mµš–˜»-‰ÎgzR«nŒdxŽ´—Ôº?Ó)Bnàï…äÔ¨6ÿ ÚU\¡ã%VÇt ĦF;¤aᇩ2õ‚×tàµAÞž†•©7*,ÃÄR%ówñZmäŒÑRíÕ£§:x¾;¨•’˜¼†ærõn[©ÞSs‹˘ÏIb£ FÑÄ­ª†é>$VZâ¡äVO‚¶¸5’ÆŠ Íê 7¢$QXƒèý0Œ²XuI’&Î MÒÕxD†M•–´ô©‚q§1UFR.®RKR!W©”TÙ{T+æG\ÝÇDzK«$Œ0.`D¼¥˜^´ÖN¼ïŒÚ“±š7ÍÄG͸$Ó9jLÉ̼¿Y›£Æœ¬ûäKj¥0XS›ËÈ Ðæ:2n©1O•žš¨·¿6õÙ7,‹f>û&”ZóÙ7©© Ÿ}´#õBΞ:Õîs®°æ»˜_L´ë‰¤~´ ÍíG«°dZåçÑ*ÀÇÑ*,Â1—7z˜†Ì¹Ä ëJ-a¦JK£Í¹ÄpŽ1çRÑ™RædZñåî«rO™ËÜ|}•¹ÎÍð£ˆÍgѾâ¾Í/6|êýO˜fïO{äò5 ‰)†ˆÄÅZq—Rkäþê³I÷4÷9÷˜îÐm꺫R§vóìÙÍåõ¿ÿu›.ßÞÝÝ?Ü\^}úûÃüýO?ÞýóæòÝý‡n?¤7[By{sùþöýCz#ÌÙç“ åŠYòÍ€©äÁÏ|›ž=K—WéòÇû×÷éò<ýޏþ>}óÍ þý@øP®Óq ì–±Õl6ÉC^|Ô6óŒó8›W–n›yZ2¶õÉÓž™wó¸å¹/:P|@Çf`•,pÔ äš Ëf`™ú +ùn^¢4zF¸<€E~È'»æRŽECÇt7žÐuÛÈ´WðrÍrí»¢YUVVÅ™x3ž eñØGT6©¡SÇÆMÕGtw‹eßHø¬õ½@8ÂÐÅ+%k½ær~€DhòzËÜ~îyzƒdÀóûïÓå/ýò!$e%Ý}úé§·ñЋû»‡)ô9Ͼ@J!Ëôàm4DùxpŽèG€ç9ÀÛ3ËèaŒÃð3À2(Œ‡!ahF £‡ÊÊÊÊÊÊÊÊÊÊÊ5”k(×P®¡\C¹†r åÊ5”k(s(s(s(s(s(s(s(s(s(s(K(K(K(Ë¡üöÏ@&Š˜4]£aß±«»éI®hÃr_!¿äV7;çÆG@Äñ83í6ìhýˆØI3–áf 6¥4ä×xzO*:ÅO‘nØfâáâ±gc3Ž0úVÏ6úf ¡¯ˆ=éÆf 6úlýˆˆØÙsÕ¶Ø ½:Î2Ú=ÝØ¼h‡Ãª Ø<߸´“€Zs­ ¨žpèf rÑÒŽÓšŠeSÙ „+Œº€øLËn \¡­ú©Ö’Yy/Pà õ'°´\˵XÑNÂdÕdH.ºˆãa]‡é%«Áâ, •Lm­å¦›y"Ù댓§’±»]ö“€ø¿·QÞ „'´z ©=—«Áâ, ü6Ñ endstream endobj 1749 0 obj << /Length 1999 /Filter /FlateDecode >> stream xÚíÜKs7à»Òa¼{ܪ$U{Ø“n[{`¤‘ÅŠHªHÊråßž!5@÷Èè†l™Žw=åƒmºÕmO0ÀŒÔB?Ô"ÉE0F$×ëwrüô÷wjüU7t(âŸWï~úÅ©…’"ɤW· §ŒÐJ—<ÿä'¿«~øŠ7~ø?Vá•_÷‚€zë/Ýz)ê$.XqwŒhËî|òÃÏw)»»ëïïkò|nøïñCÈûÿº„µÜ±†5ÆX›´Ÿ°†2QÖøbÅZ4" EÁš‘ÙÚ}ß?t·Û]Í[ôÂzÿ…Þþ¯‰|ö‡”©±3-SÆ™Âm¦LA&Ò[¬˜ R¸è°)51õ¸¹Ôñâ°ªŽdɉhÝ<‡†¯8掴,Ag ·—²™HKl±bÉaÍĒΖ6ˇýÝöPž†éÐêч§±1-RÆ‘Â]¦HA&’[¬²Vèh1)“ImoÝþnyÓW'½4¤—î»ô¾ïi•r4v£åÂ8G¸µÊÙª#ÈD:b‹GFé`G6;zX^÷5AA éÂ<.…o1¬šë#Ç÷½dþnïÅóUoy0Î n¡r¡ê2‘^ØbÅK0Âh|(o=x¹ÝõýÔÍ•5~^Üo “;Ó2aœ)ÜfÊd"M±ÅŠ)/… øTÞ0uwZÁ¬ï»ßvÏ'^ûú*Yi5d‰ó`ôêeL¾î-1ƉÁM¤Ä@&R [¬ˆ±AH=AÌó¤EGH=ŸÁŸã8"·¤… Â8L¸¿&ÈDbb‹LCÑð9»M€éa¹é«+F'¼7ópsÆmlL‹„q¤p—•‹UR‰$Å+¤´Aã“v'©ÓNáÍm÷aÕ?§4bB“I¤å•’3<^–›ÐâaÜQŠd"ù°Å „ >h·ù°Ü½ï©G_U2ó&󇤱3-SÆ™Âm¦LA&Ò[,›2Éž^PC¦Êô?ùC¬›¢™—MgX6å¶4@¡0Ô¤Ç(”‰Å+ ¢o<»²ñÖxóõ܈–žÅéA=¥ô”<¤®RÑã¬H?âò®öÓÝê¾>,©aefçaéäVµ€A' ÷"™Hcl±‚Ì*>Òwy+üiµ¹Ù’#SÔóFå×­@Ù;Ô²aœ-ÜnÊd"m±ÅŠ-…÷[lµž™ŸÑ?ëM`nN‹„q¬p§)V‰dÅ+¬”NMíyßüi·:Póâ|r÷7Ì‹c«ZÈ ŒC†ûN!ƒL$2¶XA&µ0?RàFÖ]o×ëqÛS'yFÙyëõ‹ôñ’·°@‡÷OyYÅ™H,l±ŒEÇ$´ÂX¼œ`¹[nnê v%HQÍ먷Ýàå4ì 0ÆÎ¤„”‰²Ã+v‚ÒãgQ¼šØÙ÷ˆ£ùã|·®³¯‡rZ‚ Œ„›J ‚L¤ ¶XäµH ?Gàó¦øGê•Æ`„vó>Á·~?·ª… Â8d¸ï2ÈD"c‹d6‰àñóÞ`d䫎i~gä«o äf´AÇw–b™HFl±ÂÈxáÕ„‘0"^Ljþvmg:¼Ë-ia‚0î/… 2‘˜Øb“6ƒ |¾âóùÏ/²m×Äf@ nÆô­'¿±]-hÆAý?.™kÐ  íE± Ê sÊ|{ü¾¿* ¿ ãiôq›Iiwñk¿]÷‡Ýj¹¿ìLpÿ¾Œ^:ç.–ÛîçÇëûÕÍj¹YŽû)àœZÇãëM_Sß¶E;†‹šÿ…D[ƨ…U®ÔËdc[t­-(´å/e{Ì÷ endstream endobj 1762 0 obj << /Length 1481 /Filter /FlateDecode >> stream xÚåYMsÛ6½ûWðVò ß {è!q¤Ó4V9Õ=Ðms"“INšK~{H@¦®k7íxÆ’ÀÕ.ùÞÛÅ.D2 $«p¦C/³ÅÍ ¶«ïOˆ}7ƒ™gñ|~òìLŒ`TáŠdóËLÀ{RÒÑÏ|™ý–hÛâ÷ù'ßÏGW‚Ò‰XÚâ(˜¢áˆqIu0}¿3eâTÅŒ*ò—ë¢ÌÏ1e…"¯Ï1á‹~S̘ù›zÛÜÊ»¼mÇ‹]o^_6ýMÁÜxóѬôw£óéíÛ—?šëZ«fcT®½¨”IÄHÙÜë{‡ˆBRJ&G0"4Z«™g@öÐY’Fç)Jc2ØH£äHàr ‘Ó¸«T VêÍÁßl …§Íe}·ÚšëìÔ¼ž¶›ÛU]Ð2ÿä¶Ò…ò^%!F‡}¨):œYŠ!"yç)JG2ØH‡  ó¡ˆ#vï¬r5x2µè¤’Z1¾ìSOñåÌR|ù)‚|9OQ¾’ÁF¾X‰(ùâ_”>Ý2Beß |±fÝt:il6½èonï¶Í:H"ƒ÷\Æ8ŒÁno~ vg–‚ÝGÂawž¢°'ƒR¡²,3 ;r„=´ýXLj¶Äú_¿~¯_š¥¹d¨)=j^õ›m0G0C%¾o×òÏw)’-TS$;³É>î1’§(ÉÉ`#É„Àšp$›Ó¼(Y¾®»Ím1ƒÌê×[K:ߥTAr(‚$w™Åò³VW¿Ý[S/Cì_˜-jwõ•ÎÒP¢aŒ¨$GJˆ¡oŸa }g–BßÂÑwž¢è'ƒ •MT%RbD_XìO›mÝ®,”ý¥Ý‚®›£Š6³èÑ=çö4Ìô¾³6ûsRtÌ´C’xþ³þX/ôÿ÷…Z®šOEüQÒ5BüßñžY‚ø=.ˆ,CÄ{žbħƒÄ—IÌâ¥%þu·ÙÖ«ÕX^-çro;ÚuÎõðq±{kì|mb%–Ðu…ýKü[§øwf)þ}Jbü;OQþ‚!!‘ ÌÆÁö Á0_Ÿc† JXeþÙô¡ _ IA§ûñÓ£‰Ñˆ'~Ï,1ðïó¥pPÎSTÁ"uc„ÕP„ðØrYytK;‡ôv|Þvæd lêµ. Õw]ûG¨@³Ž__ x¨C¡!Ý-ÒSµÃ™¥jÇm8OQ$ƒ -› U”;Œ*Ñ}ÃêzèÁ–¶9÷K ç"_|6r±-Ú²·öZ–cB¢ FZò¨ízŒJ È•Î,E床©tž¢T&ƒéNRjÜ Ææ[¡­—îÍ“Ð4Cž›¥½zôõ@ªgGFûe{eÏtkß›±·AAn•Bœ=ÜrŒ8ûøSÄ9³q{X*$ÎyŠwìhÿæ%G²dÃ)ü¢¹Ta2d)‘ÿz#£zdjÌʼ€Þ0Á`2^tíÂÚÞÖëÚžø~ ìû ‚ÃPg~ O|PûUï _ÔIp Ý<§S„g–è$+«Ðà!§ç)¦Ðt0­P}Ž/m {‰zÚ®Û‹»vÔè‘îN›M†4ÿ ­ûÕ‡ö¦1_´Ëè/QS’U:Uùä¿*<‘Xc¢q:Ù¢zf)aY++¬ài¬ç)*¬d°²D•"«ô±VÄ»š¦eA¦  †¸´§“¯»e»°õoYÛ<ÏŠŠçw›r ‘P)‡iõ`ÆaЪJþ_žq"ê`6æbJžYBƒ•UGð<ÑóäÔñ'Œ–«© endstream endobj 1701 0 obj << /Type /ObjStm /N 100 /First 990 /Length 2104 /Filter /FlateDecode >> stream xÚ½ZÛn¹}×WðÑ ’u!  Ⱥ8lKd ‰áÙƒØcFr6¿§ØMkmgƒUwI¨é!Ïa/U<­¨Y]pQsv1’Å¥¤fTGTa”àX’щŠÉY;ärµî…] Ö½àûõ@bjÀNÍB'6 _p³þÒÐj|øº¬]hÙ,v)‘Uq)2ÄÛðj†e}3Ã’†§.•¢’K•’Yä(°˜ÅŽ¢µËA¥l}ƒÂg8+;â*ÆQih표¬] ÍØ¬è¨r6+9Ì"Ç1ÇÉB’£8¦j(QÎØP²cM ŽXgj(ÕqCI{U (%dCIÉI´ æDN(Jb'm,IœˆÍ]ÆQ›¼œ²“, ©8)ÚPª“jϧ†5ŠN“E<#LJñLä”-⮪°…Ä©ŠqbhCÉ3ÁAÅi­ ¥:DÉPà Æm(ÆhÏ4:`Úøߪ­œŒ’-L°’Ë%2Ûúâ6«ìJ‹&¯`uÚ3uhfÈ]![*pÕ!|†"äŠ6?°@Jn~ú–æ\(ÕVNÆ€jhxX ËR]M P1­fX­¯b±K›sUX¹=Š´ùUôÕ6 =´‹¡j¶ qÕ+LhÍÍslÁšÛj¤ÔÜ¢‹ÝW *f캚ÛaÛÕ"ÍÂJ¶X\µ6ß°Ë*†`†BˆÏŸ¬®ÿóuíV‡··Û»ƒÕÕý‡»öùÕæö_«Ûݧõν 8ÂûƒÕåúã{ÇD^ÉvBõ¶¯3H\|áŠ6‡îùs·ºr«—Ûë­[»g‘ëOîçŸðóDÂT¼bE5B—… #yª:&ò¡Ò„!yÒ‘0T_9ý>¡„yS©>Å0UõXH fõ§L#,xÆKj€W4æà§él|œáTø${ì’… ‰áÔHÈìcYš0EO8¶!EhbJœ‰0oyÏøbö¥äeùbÍ>êè``¶0aa>3>ðÂtØE†€"x&Y˜ûÀª£F¨âSYÚCNðjHMQ’4E˜f"L8GËpŽF*¾Z˜0oµR#Lâ ¥… ƒøF£…T—%Df²Úøªô¢;vïP×^ºÕßþþ”nÎ*åÛûÏŸß÷F§ÛÛ»tŠbI†¶§V¡ŠnŸÐnu±Û~¼Zc‰~ò`ã™øšBêC% (/Lˆ€ü7"5%- b# ÿ „–šâ„‚`j—J­–ˆ'e&Bl¡‘°¨%â… ±h¸iKN¾ÊÒ|(ÒR*D‹èÔ%Fg"$ìŠaO¡.LHÑ›&Û9zž”gÊL„¸7éx׿„;Ô”†8!îM<.™ˆ<5™*f⣊ª0D7,M˜«<ÝTLžÊs‰¤ÈMµŽ2p6X&ÄN¨:z¨É /MˆPâè!W9]˜ðe½ -LÅKߤäKXšðe]e"9éÿ[YŸÉ©2?(ë$Kb+ÔȨ¬ÏƇ`ïÛþPYŸPŽ7Ãÿª¬ÏF˜Ènô£²nZ¤OÕIQŒ¶w†H”¿+Ý4¥“ê#•ÍÞ£?Me[f¸:š5Ûú4ùMÓcùMß–ßìåó qWž¸+OÜ•'îÊw剻ò$½—ô^Ò{Iï%½—<ôêz•t½Jž®Wó­˜ïP¿ËGS×HKë@z–ñ©E|šzÓ0!Î$õ1ÅÅ5L½iй´J‰tTsН4‘Èt¦›2~áÕHȘÖ2uFè\úŽy@Jx¶4!ÒsîY¬žËT"ËsÉ98çi¬pqœÂ™*fAvæQ Ü[§äª'ó»^P¿†<¤Ñvgþ} Æ÷t{Üôhûussûi$xøô¨Ý09Ï^¼9:to_À»>¹|}~åNÜÑù›ã³£ó“+wqxyˆg‡qÇgW×—g/Þ‚ò^ŸŸÂƧLj‘»/_¶îðëgø½s'û;Ôp×ëÝ—íÞ}½Ùݸ«û›½{³ý†¿/6>o¶wë7ûÇpEø¶»ÍÍÚ?¹O[w¼Þ¯o¿m?Û|AÝ·µGÓSrx~ë}Cùò^Á endstream endobj 1791 0 obj << /Type /ObjStm /N 100 /First 961 /Length 1401 /Filter /FlateDecode >> stream xÚV[oÚH~ϯ8íCT{l=QU)B£ !hµÚ§L`ÒÌ <ÔÆÙ(¿~¿3¶ © ] Áñ¹_¾sL˜ª€ S%(ô¿1Åÿ&$ÿ¦¤üoFa…,À—L„`K&"AÂDL"”' $‰Ø‹RIÆ„"Á~2‰›‡‚"é9Eì= „f?¡¤8™È(wŠ’XÁ³)ÉØ >¤ðDLR²¹H(õiˆ”RïGd”z?H< =R¥LD”¥žˆI!¦O3ú4vsGŸ.èÃíJç[ý芵.?Ò—/'ï84«6®Øê¥î3-\^å «k»¡[;Úñ º¿·~¶æßûû®ñw[jGcSèUm¾ÏèhÏ9}Ûªîž:zWùÚÕŠo=šYæKG´Î³5ê‘tì§›…3%- ]ÛüI3°YíåˆüpÖ4Ð¥]è_’o¸g4¥[ms³B—-z¼éëÀðIïeqaËËíƒ]ÙW_Òôá³uœW¾--•8qÏv =Vw4qUij¯ßʦ=žG]hÇW˜{¢/PqÜ_™)[w3³2 ërï´ZS^Ç×9‚š7ìMÜÒ>¢GìAÓ%c—|7ÄClõ%TwŠ¿¸›?1kcPX¾0è:ÔŽ™O4µÚ6´›Ó;Ñû«Uµ¶ùn÷\W¯}{;Ôk £ Ø>t´Æ…~~CCûD3SѼÐzõÔǧ=Åì$ÝylÙ—ÇûÜ,Vº ÙÃïØúqÕ(+é¼øYÙg~Ð4ޝk7ÇUz*ÈŸ1N,`{švÏݙŵ{1´pëjݲa ™<͇Åç- Ófq8‰·®€nò­ï؃žÓhŠ­]´¹ïžº.NûUéætÉ›[òRõ!ï¦=Oeµ1vÇâ1çúZÿN©{/ô¶°¯µÁ›SúwÈÔ‡ÅÿßÝ\üÆkB=`É ëÞajÇìXÝ™GS_…¦#{  ¢=¥£õCµµŒ³Ï}ÁÞ罫ÒÞšÆëÞsO#p„ü ®7èe[íÉëY®=Èš&Í_—«O¥ãñÏoç͘:Ãâà|koò³ÒË®øäõU>;6Ƀ:Ãm\áÍX˜­ÎTxup5¼ˆ¹Yð_Ž®ƒÁ`úW퀩3jû³(K‡þaK»Þ¬úve0¸%œ.Œþnv|ÑÈ|`^­)z^ó——Í”vGÇÑÜnð&…¤»º£áü€¾u¯Ï£ë^Ô5¸ý:º55xš.moÉW7³C¹xQÇ`ôbÐ=¨½Y¾gu,®¯†ð¢îÿ¸#ó~“ñÝôÛí“ZÖ=oW³áøîQ+í¾5¦“Éè¦Io÷G©±j…]„4йv§?ð_Êà0-v/σ^øuñî¿ÈRœ@? endstream endobj 1942 0 obj << /Type /ObjStm /N 100 /First 964 /Length 1207 /Filter /FlateDecode >> stream xÚUÛRäF }ç+”·Ý¤&¸ÛíEHm€¥’ÚÍR ©Ê«ñ4à`»g}á’ÊÇçHöÀ í!yÁjéèè´¤Tf¤2’ùQ”ð7¦D¾))±‘‘2F¤H¥Š M:0lä¦lD¤M²#! 8%18(Ô Ž…QÆFHaÊ%bC&ˆÙˆÉ„b$dR.g)ÎJŠ¢Ì‰†>NOBŠÅ gáOœ±Œ$¥D33€‰ð@o*<•&|ßÔP¦Äˆ( 5˜¡%KÅŽ@bþÒ¾Cr• ]RcÔpk¸iŠY°–6eЦ!IÀ:K÷`!†!ûB¶¶ /Dw`Ål¶ €{ ,!Šë@AQUš­”-”4†ÇÀ#2&F &a>@`q††“q†KpO;ҬDžœ£ŠD·/Š% â€q€¨X)Ô¡ –ñã2°$ qÊ,<Â8$J|[ìþ©Ä03·)‰e‰  ÉÄKÔ0P¾9¯`*Š  •nðf+•„b™qoaÅã‚èqx)3cç¤a:*ÍóârŒ,½Š±Ã*àÞcµÒ\%ÌXH­äæ d(™/VR+©Á:à»a)µV<¼"­ 3c-µæ·p›t‚°˜ZK¯R~€Šï–òs’ùr ŒÄ–0ÒLÀš±Ú Æ»/WÙÞu´´”¯òÖ6E™¿ß;<¤ý Ú?s—ŽöOè]Yç7–°Eß½§££­D‰Ö~VßæMwíÚzgæå‘¹ó šÿ`øýdñÌàg(*òÚ¶ù˜8Ùô¡l–îa»Èoyc«ìñÐõ®.ÿÉ‚ÜôPÞ~Ê{¨ûñƺú¾´>Çg·*7štúØÛ¶×ƒÿÚ rvªçjG¯³H@<*úEg;«Ÿ>æõª²jd;}´89Rçš’.J†u; ô6ÞE@t9ú Mçy‰¦òä†ë*K¿|ý|á—øó#f:5èýR^U¥ëm‘ÓØ¥)ÜÖzš¸9hàДÏ Ô‹“²µEéš¼ÚIkÖ´r"s0Ý.‹jÿòn,béÄ֮鰵}ÙÜÐyYÜá»cüëú¼ªvÍÆ*¼ xÙçmyŸ÷–v²¼ðØ.žº;³“ì¸ÇuvüiL‚‡@ŸpûAVR&^óàÝ¿µ›Ú›¡¶MÏ r/êtë­v`¡ìZÐï®hË+nösâåÓjng!‰¾ÚkË?qöY勋Άriý¼îÖVÕ¢»um_ ý˜ø«¦Ð¡²ßÆÐO~èfÊ:òCõP±ïýز¼cû~,_.ÇØ3w®ÆØÂáš«W×üyF•kírЧÀ+³h‡æúŸÕÕt[6üh3݉ ?ºZ¸{Û¶<¾µáðÐWyqW¸Êµ#öå8‹¼iÝÐ,òî%aËëç]¹ÇÅf‰—ó> stream xÚ…TËŽÛ8¼ÏWð¸9#¾) È)À~ÀîhlÎH[2$9“äë·Š–ly(m.R±YÕÝìnR¥…PEiDàÏ mù÷ÂþKáJ¡dQïøWB h!e °BKà„´æ 铨2,%>´H%”6øØdÔ%ŽQ½jI‹* •J í<+-LA¹2Â(Eà„qT)$(…•@Â*f¨•°‰£µ°žrÑžÀ §<ë œeP{z6Rø‚%|òƒ‚xË“â¸ÞÑñÂ‡Ä Â—”ÛBEÏH<˜ž­ÁóT!NÉcKëE™<£¥åÒ,£ãSúqZ”eÚB Åc \@¬‡C¥‹”š„‡X(< €cH™Ê…CK^d*†÷l £{x‘% (•â9¼(í# ÑÊQ‹ä¨’q‘# ͨ Ì”KxÑ–§ÀlIíÉCB¨1ã–œ—Ô_L͉ApÔ2 ¼8Pª@–C£8sV'2°¨¼XÎBQ¿´ˆh“ÈÀ)j1yÒÄ@g\²Á‹ó‰‡ |‘¼xÎ3çõBýàÈÒ3F U²Dð2&!Ç1g 4u —%‡\idPÆÀâÌô‡+€3'¼¤þ*–®PŒ«yyK”áÍdÅ›Wóô×!¾^Ú/O_¿ŠçÄóßÝ¿xþ.`>Æ1~ß¾=Í8ç4û™A´²ŠíÐtíLš—+̱ŽýLK8çôÕÇÄ Ê÷/§ó®®ÚÃ1oiÉøq_wW^Bùþ©;\Žq·?ÆjJíÑ´©@I›6>J&Û4‡5Ña[Õ ý¥m›öíQw7o*ÏÕX?Š’e“‡ô~mjæÍ¡ëÇGz²lóÇ*$Ó¦bì«v85ŸD7k®öÕqîÉçœÕqb­ìÇvܽÇ_Ã̺­7¸H+.¹i½Á=7û÷%7­×¸·J%˜3~Þªòsµ¿»î4̯}Œ¿§¼'œqÞbwŠcÿëʺ­Vy?šø±C²÷§ ³fºzy‰ê­ÛS/Ÿ©zëªãñ> stream xÚu•=sã8 †ûü –»…&â79³³ÕÎ\wÍmq­b3¶ödÉ‘”dï~ý½€,ɶè*/À BŽRF‹R(e¬–þz¡#ý ÂmKá ý•"°­…”ž„RK‘b½.>AD!c€Ç!sIGN ¥Ù£…2ìA² H8¡"%tAhM¥¸(4ßí¥Ðž…:xdF)FR¸ ßî½0”]yÌp(…-‰ RX¥Iha- #¬cÆ é®à!(sˆÂqB¸¡z¢γGC°Ç _RTt”]z®9F0º”Â{ê¶TÂLC—FªY#"¨HÂc–ì "8òÈRDDBHé´Ô"Zö's.‘ ƒ.•Dn‰I—T­V%”¥H¥ 0(MŠOñº)¡E*J¬”eY¤#& e Û4²ÈHõk<4ö|È¢4s¨€ž Y×gPM Y¨[(T@  h] ûP¬Å”˜¾ÆJHcˆCAÒЖh‹ L$ŽvÎÒiK[jh¼¼u–zÃ$¥ i©>4ƒ†è»!²¸Ã¡Ç HçøxZ퓞{ó¨À;òáõ¥çùyTxjØ@ø¥=*žîÅr`hôž6Ÿ £"[.£å@“¢>Ð>¾ŠÅ&B±a%¿=™%m®¦fJË JgŸ¾œRHÅK5¤êüõéÛ7ñü—xþ£ûÙ‰çâË©Ûß¿?±Èœö阚óŒ\¬ ×V§Tt/¿ÒnœÐkdžþóGQýNÃDÎFŽÚuM×/Ødå¸ß¯]Z¸Ézȇ4Þ²ìyÌ~Èñmú,ª¦Níe‹™%wP_­èÅγ©SÅNv–=¤î”Æþß•^> stream xÚUMsÛ6½ûWì­É1ñE37Ngš¤ã8?&! cŠÐT-ç×w„(Z¤Ü^¤ÝÅۇ݇È…–:&é¿)è_ƒB_¦ ŠŒþ9°4%Cã!¢€‰ÉeÁ(€åÙ— Œa„~xArª` 0'–@ 4rœ“¡A(bæ)ˆœ"¦Ð Gf®@JÊÂdFÑ)(œD.$eˆp§hß V8Pb±-æV…šiP²”VIöL„ºY®®Þuµµ»dßô®~õñ#\ÿ€ë;ÿàáúÞuÙuß¿‡››«“7ÇùUŸtSÙ6B'9zgJqÁœ#zÛZÿ욈ݲw[›¸†]ß ð³Ø<§5M·òí6ÂG÷2éÊö >ÄÞÈélžB¡…Œ}SšÞÁÑ›áö.)Í6Yùr;}YÄ[’áÜËÈÄ·n}”}]ʳ[ß;ß$»Ö¯[³3Ïãoåbdz<Š-å¬ZkÙÝ%ä¦ßÖÉc럻‰¯‚KYÃö#>ºKÈil=oW­’œ}žT1 -eô¦]gçäΑÍqÈ#ôäϱ»jœ°h_À$Ukž§À!0C?o\ sŽpMå#U´—0“½9®uÇòs‘”~»EŠn=Å.älLSÕSòcä¾³‡];…úpzcËïËáìm9¼ñ®^¿)‡ËïÉ/ïã¶Áš­ßY¿µ}ëLߌOþØ—µ«œiLTíõ×WÓoìÖô®41¹5+WúpeX@»ñ@¤4òà÷äÞÛ¿ _ÍÂÕúþýŸkÖ0ÙzkÛØÙ°ÂÙë–›¤ý^3U˜nÊú[·veöuân]·«ÍËœóTôÿ(n_ªðžž:;î¶XeS½â÷ ÂW+¼ãMŸüv·Ç˲@ýÍöϾ}²ÕH5¥70_‡/~éÙø´Ù7Oq,è+¶ómÞõgêzÉ_à Ö>çûÛ”OfMÛÞ¸:Gü tJÜŒ”1ó2åŸM×›º6§ç;F¨Ü3Þ#Û‚tC’)Ÿ’†ýÙ¸üîÓ¾\Üeð€W À”ô6Õ ÇI›zƒòVN¥@õߌ?ü¾--NIµ¤ Š;.‡¤ÁnqJukŸ=>É6ØÓ0ÄwóÞ–öÑC Ã-¼ü°3-îiç3†ü­{ÜÓ"ý ¾Ÿî› endstream endobj 2568 0 obj << /Length 1104 /Filter /FlateDecode >> stream xÚíÚKsÔFà»…ŽÒa›y?rs¦  à°7 ª¯”xw‰üàï3Z4c§g´q0àBÅA¬ÜtKôWóZÓ‚¸?´°¤Ðœƒ¦8ßž÷ïêÿ¶r«(â×õÉ“3I JÀK‹õqŠõ¦xW¾j/¯êjÅ9/7MåYûçuW_ºÄjYRm«÷ë—'ÏÖSÉØÌƒôÿzÍ ªQ)ü“(#€rqûI\ÉÓ¸ëø$®üÝ÷ Â¥ÅŠI D†ðáeÐ_ª•²\WF”ÍE=¼Ü‹]{ÞÖþ÷Ãõy³ßVL—7mó|5{«šá ¤qïv(ä2S¥‡‹ºõ ½yDÈÿ¼ù(*ÜED)ôÿ½JZ ÌöJ\‡?Œ!ù¨U†°¾›ìÐ&F1¸Q¢Ü|-J{JH0Ú`ö˜·÷æâc½«¨‡&ÊOõãå½ù½ZIUþÕ\ù¯¯w›=j ÜòŸÃà½þ] ˜ïÓ°–7 XH”–­5ã 4Ó0î7ÞVÌ”u»küÀvê õÚ‡Jh^6;7äáãš”@´\L}› ) ¾Ïs@CXhŒ†IhH”š­5¥¤F ô®Ìa‘ÁËg—ç{78Ãâxóé¾k.q¨–q·îõg°•»™rçÛ7ç.„åÜŘBÝ…DIwÙZ“;¢@0…¹“ãÌ‹Œã÷´û纽é¸O€S„µËŠï¡’¥LúÖΙ a9“±fP“!QÒd¶ÖhRZL£;ïDºæ¦Ÿ™ýrÏ|¿¹Îâ¦9¯›M·OÎÕvùçê±Í3>£°ŒÏ[f8Á|F‰R>óµ&Ÿ†eˆO>í”cæÛ®u ÈOnÓŒ© ¸Zv%ߥBʨoõœÑ–3»áè†'J”4š­5U ¬˜Q¶Ìëz^[;g2„åLÆN¸FM†DI“ÙZ“IÉÁ0Ž™äÇ™|ú±Þºíø°1ŸóɈ&èâó?O̾OsÀBXXÜtŽžG‰’À²µ&`‚€Ò(0q°³Ã w×ÕÛfׯ-¯êÄØ§-˜åñ«ÜL)ôÍœSÂr c_†DI…ÙZ“B¦¡G»¥>œ9šÃ™#Ë9* Z³EáW¯2é[;g2„åLÆNzÌ%JšÌÖšLR\S̤ºçñbòÛ½ùpñQ0Máó=œÃÂrøb_÷…DI|ÙZ>BõqãáëúªéÚºMíC$ÈÅÜ·Ÿ ‡¶Îqœ¢r#!Ÿ§4I‹¹B#Ea Q4Gî@>T’Ò­»Ô÷€8ÕË®ã+$PúÏ  Q”±‰žÖ„4)”ÙBJí®Ôb*m^åsÙÿ²M%UY'fd·fezùºïÜg}ŸÃÂrZcDý‚&J”ôš­5U´2è89rÝoëÝ&u²¨ P¶ ¡7wœ£Ârôb ýM±(Q ÷li$ endstream endobj 2587 0 obj << /Length1 2183 /Length2 14780 /Length3 0 /Length 16077 /Filter /FlateDecode >> stream xÚ÷Pœ[Ó ã®Á- ÜÝÝÝÝÝÝwww×à\ƒ{pww Ü9畜÷ûÿª{‹ªáYݽ{íÕ»{?3¤D Ê´‚&öF¦böv.´Œt \aY!F3)©Š¥‹é¿Íp¤j¦NΖöv\ÿv25tÚD ]€q²öv)W#3€‘‹‘‹ÀÄÀÀùŸ@{'.€ˆ¡›¥ @– eogê G*lïàédiná¤ùÏ#€Â˜ÀÈÉÉNó÷r€ ­©“¥±¡@ÖÐÅÂÔÈhlhP¶7¶4uñüŸ<..\ôôîîît†¶ÎtöNæ|”4wK €’©³©“›© à/Á9C[Ó)£ƒ#¨XX:ÿË®loæânèd l,Míœ+\íLL@r€²¤ @ÞÁÔî_Á2ÿ  ü»6F:Æÿ¦û÷ê¿YÚý½ØÐØØÞÖÁÐÎÓÒÎ`fic “¡sñp¡Ú™ühhãl\oèfhich ø{ç†1AE€!Pà¿å9;Y:¸8Ó9[Úü%‘þ¯4À*‹Ú™ÛÛÚšÚ¹8Ãýµ?K'Sc`Ù=éÿu²Övöîv^ÿf–v&f‰0qu Wµ³tt5•ùwÐ÷Çfnê`e```gc˜:L=Œ-èÿJ¯âé`ú·óo3P—ƒ½À (ÂÔÇÒÌøÎËÙÐÍàâäjêãõOÇÿ"8FF€‰¥± ÀÈÔÜÒîOv ÙÔì_xøN–m`ï1þúûï“.°½Lìíl<ÿ„ÿ}¾ô’bÊÂÊ*ÔÿRü_Ÿ½À‹– @ËÄÊ`dÒ³|þ7Í ðñ[ -ÿ½¹d”´3³pþK°xÿÑáöï¶ ø÷ÈPþ—AÎØË¦Š?­¯ÃÀÊ` ü`üÿ</ùÿ×÷eùkýÿ»!1W›¿Ýûÿ܆¶–6žÿ¶²« p,díÃa÷CÕMÿ5ÊBö6&ÿ×'ébA;s›ÿÑÒYÌÒÃÔDÁÒÅØâ_ôŸ3&·±´3U°w¶üëªÐ220üpÜŒ­×‰3ð¤þv™§é)EíŒíMþ;&V6€¡““¡'ðàˆàÅœOS¿@Oggï\Šó˜Ù;Áýužl¬zÁ¿LÿBlz¡?ˆ@/üqèEþ N½è;€^ìbЋÿAÌÀnýƒ€ 2Aö2ÈýA@ùÿ" ƒÂÄ WúƒXô*P‘êäSû/âòþ1 GýÇÜÑôÿ1YŒMM,mlþd`ÆÛÛï?–¿¢€WÕ?X€§Joò¬ÎFF 3Ë?X,3›±ù¤3wúëÞùä³øÃÔnáé`aj÷ í ÀXÿSþ“(ÙöÞ-ôR13Ù¹Úý5ûæÿ`^2ôööL|þà ”èðÇ <àÔÛÿ£$Œ@Nÿ€@ç?5:÷ã70ƒË? ø´´1ù'#P£ë? P£Û? pƒîÿXÔøìL@1žÿ€ÀÍýþÏØ»:9ßF_‹À™üþûÕgjêaj ·¼hoÌdUÔùT+ˆçN»?É;Gº¯žFIëµìôÃõ :™ò{VÀ¦Óƒ`òhÊÚ®(ŽÀ áo¯Ó¶FèÐöDÅŽWï7ýx¥™ý¸_Ó˜CSE§‚ ƒ°ø´*Þ¿½Õü­ÁÛ@»¥Hó]9 ОÜÄ=+VÇC÷¾³IÿUÌÒF«Féø—Î“æe/`C¹ÐÀP}ºò@ž¿˜û”;õA(O çsÍ\쥵Åó¼ðu½J…ɹç Ž6øý§ñ2/¡£)¬%¯²’¨MÞ¥öðØ‘• „i5âo ØNAå´¼™~2Ýh_zrÝ3lÔŒ§ädä„ 0^Á¤eâf‰5$£eúÙø–¾Ï¿I”4@M¨ô~î9»Pí¦¦G~œV¾Eh&CIž×Rñë)^ãÉÉ1{YÇ}åø½ JÎ=1ã•‹&/be@8Ô³U^ûÑfÀéQ2ÿD>^÷˜%ãzqŠRÅä’…`¨zhÓn"ÔÆLN±¾l€Õw¡½YüùZ÷;ÏÒŒ]H+*çóº^¹ZëE #›JMm4}±Í§7­[ՑлŸ]­nØHw–S•Öm?=”•øa73QœhYÞü£äWKf¾E﹪ۻ­Ÿw˜¾ vp¤®Ù^<Ñ-ÎïÚª”éè-ÝygY„‘áŠmC‹m %È%Ÿ–ë<3G6oñø@¤ö[ÇÐ=¼àÑ„ŸäLl™,ùhúûo÷mT:b “Ïš†•s€å^ºzÁ›Vç“X°©ŽŠ‡â^¿þ”- Ü×¢ù®¡ µØÀ&šïÆP.•Š|DªjZzL1µŽ°‚¿tµõÝ41ÊNzz•‘øé«VºrÏ)V'Þ›³* ÅÕã5Â4-([¼ø±VÌOÛ ÙèY@Y‹&‚ûèúãžÖ«y“û›> n 7ãîÒ¾ ”ìçÕ˜ÜÓLèÈü»Sù¶¸»‚BØÔËy5v™'Uï. ŒÌ˜ÝäæÜþůQŽT €Ç)!=—Ƹ$l©bß§jó2 ÍÚõùZI‰ \A¦oáÇdŠs†vü eeð]ÄLÈ—Fʤµ‹B,× ùÏY#¨‘6ë0vŠj¤ÃþSº´6—"˽¼¡Ù'‰¾×l§îº$2‰Ò[yÙ!v_j× öiA[ô©$}Är©ò×Ê‘U+[e}.P>ÿ‰f’ðt©8Ñ;ú"Ò\×éÅfëÔÐî¹×²[)z¨œ~ªØô‚xQì°Œº.W¤àô©E‹O"ø#$Q¯ 5}ò,ïÅÌéY®(ÈΩå¾Ç¨ `_³Ïš;X¯há§aa~íÖ¢?І tÉ͸9‰Ÿ.ðaF§QFÍ}1Íß¿ñ¥}LöžPùÙŽÑ›Èxš0e‡Ã%cOòô²8ëF‘6÷ùA šžãš0©ä$ƒ+íäĹE)|›Û4v0ˆ-ÍÆŒ…~¦÷Ã-!gÒïP0܈^~ò;u³õµšY p×ðØøañÞÎugÈ©œÕaš¸\W ÇW$¥Úq6on]©°S›-•Â`ÙfÆçø{NéigPXæ%Œ#0½ÖŠ"ýiG6™vÙ¶ðAžXãöÌ?Ñ:Â>ÕRILJŸ4cøq^}Ær\‡.cnÄÒR¡7Õ#®¬]w¼Ä9k Z¦)Âq„ÖÓøúĽëa[¯Èo$­0 H]È (f$]£°‰x•ŠíÕÖn“>;®_›™›VhCòãFÖSþit,YM@Ã)oRegëùÒ<èÍe8sm•dÜŠóù\ˆÏêuöš= ²ÏÌ‹Ñ0—ôú@gquË[U¹óý2œí<:—ª;Éb¿“%@ûI"u¾Üà‹Òa±'C°"¾mÙ±RM Ù$ϾWö˜6Õ¥Yý…)OïÚ:#érgw)ðÖÔ(NHÚ¥Õ–"ÛÇŠªÆz+føÇ{7Aâµç]ÄÐ Ûß'­O,1¬ÒûA£ÄcêÙN›‘sÊê< ÆÚ€Òž֌ġü¨G›Væ>l¥ŽýçÜiÚÞO6«Y« ÕÒƒ1$P­‰ÅÃQØ(!Ễ/TK+;ã$<º(Zêìp>®Žj6sÓ4šãuÝ;WD¿æô ~Õ(m 7±ñÑÜm#Q9y³³¿”Ú<ÒÁ€ÏRå–IÄ7&}ù°Æ«÷*Ó÷»Ÿ‡A™guó`b»;4'7Zñí IˆSy š\K.†ÿ*$#…: 6  2´1 ¾¨¹œ‰iY)àùį&±<¹Çïºn,PûqžvŸ9wG/ Øþ !d M3tÑW¾'cüÓÞHÓ™I¨_¨Å¶Í—ËŽ[+=pí5ÓøZ›a¯â»{©íÑÙCËÔ7wœÞTI<„ã;[¾¾F…ƒ$è߸J˜!’f2ÑÚíÃ=ÍH²›©É´‘×¥%" 6zj´l¾}G­(¸0AñmsÚîè)%Y=зp¬ô ¡àzDBm÷\µÛ»2÷„›Ø'>yfx“þãëj§Xšöýý†Ñ:Fº¬¬~ŒPâÄ59Þ—~§–¼ˆÁœéa[8¾ÖA¯t´ Lù3ÃÍ©ïq÷О„5x°˜_=’Þ ÆŸ¸µáV¦·ˆ õÛlgÃ%0:9äXë.'@Ö}À,î(3gë>7N2Õ.ChxS¿|ÁWQíü­~¯–ÿ˜²þÛÜR„o ŠdQ; {£Ê9'-ƒö·Ïrèe—b”¢ÎNŸMžiGíDæ+œÊÁmÿ¹Ž(Eîx³Aó³;}¯jç÷B5ŒÆ K]H8v7Š…åcÁµ‚ŸÙ’}ðü<¹D&ð¼ÈQ(zgùd·ëê_¬»Óýžœ>÷:õÈmWô!d7åÅдÊ9AzòŽÉ;GÄÏæ«1—˜éÝ+òA ª¿¹Ô¿Nô,V—6Ñ&¾iˆ°ÅÈ '"°9§«f‹Œ«Òv ?ŽLþdÄ-R ƒ4bòè·þÅ ¦r&‡’¬¹>)’ø××É·é¥eL-/ܵ^6½Ïgâ±ùNƺ_›™iÁ ö¿)f\¥Ò ¿|NbÐv¿†ÞΪü@bÔÃé!¢ö?tŸfÆL"Î3‚Õªe°—qÞ>l–˜©M°ÏYŽ[j³‘ìŽÏY}®Å!±"/)RUèÇ(zöÐ{d¶°£#ydSuw8=5Å×÷ìÒ´D?ZÕ •H"zòð-sAA]XôÓWÖâb£8UŒ©“yx9nØýRP¯ŽZ»ÜRXy‚LÃýjA´¹"¯Ä|B8]—ÔåsO ÈÄ]Oð˜-”/nôÀ^Óg›ɳ$c´›ºlßãæé,kzÙ¡  IgŽîúà*/Â8Ké îÁá•ü Á~Å= U#Z ¿ç¦úìïÖa-€—A…Xs4;ͧáÎ1Ü^Ê™O€d@æ„E$gýN}%Ì–Üc,õh‚GT¹Yxê ‹ø[Té8¹Ä'f9ºüjÝ!VÄüTÜ…/«Ê^Zç,æB—‹9´ž+‡>“Õ¦T©Â„ ^ovF•YëÛ»‚Æq?÷Vr>鳿—÷¢nzBOäP„j~ë‡N<Ò¾pÿèýǓ店Nñ3˜¢<Kr,ˆpêuÅÛiXxÆ@4 É­ÁJfÚ2Ý›Mz©tÆÎ<›…ƒ&n³ñâ¹9*„"È2K‚42,lyÎËIdÄ ­GÜÒR_Ç 0³p¿Ž&7XiâÁÄËçï±{ƒCìž=¬¨Q’Üsòq¨ ø-P*ñ}à/8û*lœ?9ˬÀQÒ‘`](Â@^Ðn2™âä>Ÿ±zÇð™/O¸'Èž?&«8¨"okÝ®˜ØŸ0‚êp)EVη¹Þ]ì^b žñ%Cé£9ݲm:§s%°z;«ØoŒAÛ®Öµç;‰v/2ŠÂŽQaœÖ¿?…·¯úK~âX¼$€%‰#é^l!½Ä%xâ}y©L2¤rOP-ÿ¬¡ˆëÛÚ²‚ãB¦èõ  :•¡}ñ²Ýê ®ò}Á 04ðà‡ä¼ÃoHe“ìÚ¯¨›'DÈZ ¿CÝPQŒ‘Òžã/LJÕ×£Á%“_.„SRA/tùô¡ï“ÊËÅnAÖŸ_‹Z'y> CÅÏÁ«ß(¯‚Ĉ&×Њ“¸Å0|1'ø`dzvœq¹kzr¯ÜßnœÂ݇˜ÙkêÖ Ùaj$‚ËlsnO+Ķm¡M0a#ŽÍ•9*`ª:´qRò‘Xúø÷¿w²kPû~-ì¬ë&î«V©,ͺWÛîÄkLF†ïd™Bþ&ÀëM“†FO|™œAƒ²øL8&·Ù˜•ðy\1Y³¥Gl“~ñ]€òw2dˆ3Ñr0ô•_¢s†ùá†9DÈàTŸ9’IbZ9ÚßîeÜÏÛÚÊ6Å•…™6Ï2”_CNy¼JàN²®˜îï ‹Æ<*s3AeGDÓþð ¿I~ýÅXuÚrèÞí~Æ){¡½ÛœA^GÌœFy«É·L/ôANʼž" ¿¼ÚùÔÀÁ½iÐ4dÀ—ï³P8ÝQ<ô×}ÿÑ1‡æ»æE«SbÇ0 üþ}¹÷Mì¯I,/ö£>•Ük«ÔÜðûÓ÷¬È‘;ÊþþÞ›s± h—óOKÝI®¶eu~x06‡„?Ø£°J8ó”üÀù›J[Ýá’yÆÐBæØznÿ|¿¯ÀO44Qåyùº–£®Üé>øõéÙfúÕ[pLuÄ~Ѻ4O'rª­ám‰¨ Ü"`áãBÉÖ^‘`¡‘Ê5KÙ8Gg‰Cô-/’¨ðÒq~ÍP3ª_Äê vA¢í~7©¹ØîzéÇÊyÐ_ËÚˆœeærðyŒÎSX9鯖8c³¢€ïxj%3¶ÚѸ™ùç³ã ©Ý)üB†G³Ì+WÌqŠhaÕo¸a ³š"ÇÚ­šknxNmÇʲm¢­É]‘6óôœËjQ“¹á˜èÂaRê—a2ÆŸ^çCe„ž¿ÅÐ^1T> .ÂñKÝ?tB]oh† ‚Úÿ„i+~Sã(~’‘þÅ=®o@l1wpñ³ëûNž:’«˜VH«Æ%ØçLD9¢‡ì Öxæy‰¼Ö€6·`Xû¤[¢Ðv“€oháÑûÑP‡KÏk $÷눹×O5x‡wæ†(}Dé¸_yþ÷Ÿ'Þü¦vâBªpóår±‘©aÓÇ–Q¯eÚúÇv&º“ã7Ý= Qå QK)ª°,¨ p S€Ù¾á ä¶Þ,Â…/ö½šî¶ˆžžÇûŒë,y]”dÓ¤¤åtð¯ôsÔÍÿ¯µß‹À3á«y?t)5¶÷¡üÝâý¦öên©„­^µ—E%–ŸsÄ_.xý˜ÁÉ!›…`y[IG\'ô²üpf/›»Á¶M½d°[YŠï¶}8]4‹ldUÀ‚Ûž"é§Ñ¡ õRÑkhõœ} FôèlÙÆìÅÐôªk!ÖoLÞJðÚ ¿¶*ÝÔd72/©&…g1?M«•†eªipùþ|S€V• ¬1GE²bØT都7y“ûÀaŒ¨gJÃí§Ðnj†%tº¬Ñj«m AÚjÌv{ÿuM† ìgÌ‘OÓéÃF”ÀäQ š?d(·[‚ž>Ìiz–Ô—íÛÓË¥L¬9¼ž%‡XðB ͆g¼0}·ƒ‹Ô¹2´c%ÆçQ^ºŽ³óýVôNAíà]‚¶œ¾üÅlÐáê¼wLÁz»ÏÔkÖ]‘‚M»¥ fìþÆSHÉ⽺+¡á\ýÞŒ {þWA/ær–Šz’þ)n}{¯fV‚¤Ãæ¾§QL”9æŠ5H³×cVç=HÈÑ1çCìÅcþüãÉ?Ôü¸–Ö½í Û28‡´§°ò¡sâ2@ ®qA_HmiÔ "?æw÷&‰‘É!ÙJ„D, ŠuÔ¾>*wI¶CŠÏ…ø²Ãp–B} %ÿbr5øS|Ô´ÀtK¤Ðì§LJ5ÎE²•Ÿd!uâ JÒ—j˧~Kö,mÛÞ¡äUÌ=ÎO Ñ»»·Ø÷ W}ªéŠÏuç²™fÓñ]ÄóʆKRD6²ñ-Tý‰Aþ­ì>€µŽÐ÷Š’Ãªzúí £qSÏh5tï*ÖêŸJrq²‚Æø_¾Ø¼ׯܖ¯­íÏ´Œ9ìÞ(ÑJŠ7¡ãu‚‘BI,Ͷ8~Õ;ÝX¢Ï—Z“k´÷»ÉŠ¬Çøå1Ú½ôi{·¹âèÔKˆÒfÃö5@¼Òë Z7sxS#Õ‘TÃd¶u5CgoÞF }‰LežJeB/5ï§3öcÅÀ Vƒ¢uDÞÑÚ­Îæ WHBþß4«ÞT 5Í<"›‡ƒ^€TvsðóãaQMt•îÒÇÈ«i%x…`$«ûyv#÷Y‡Í  ë²Àxjz–- ƒ€»;Ô»¤6WwWZ1QQˆ˜Á¤ó’Cb‘]Â8ž”ߊogêZ% ®^ƒ¾¶ºÃVÌ¿õVl̬6ƒ$ê/Ò§Ðßt½ж¨{²]dª’‰¶òúÁÓÖ·Œ¬¦¿”æ}- ž·M¦"òqâ¾)ãÑ«IÃÿ‰-¨ÎÏmN%.ËEcÿ L^A²’¥9qœM6:õJHB,h”Sºœ±›ÑàƒTÓˆta¼  tFB2ŠEåTÔÑŠ M½ø:Ï'ˆåÊ…–ÉBþ}žØ³CT›×C_ŒjçxíV!ôÚ!šH­¹4Y×¹Ó{¡ö“«ÇO@‡åuáO…ɹ)Ö;”? ©È]ЕôÈÓØò¡¹" W™ur˜tÄHI0F÷icyÝ«Ò+o7¸ŒAÎz&÷õ7 êæž kÁì)ž3Sí©l»#äÔÞÃar$å7y3jæÌk¼?1*@‡'Ã$ü¡F`Œ« ÷îv ¿+ p„®5°àCáÆoLu°î¢Øù´[ÚMRRóýë-žvOÒêYþ5”EÙøxvýÔ›ÖaâáòÍúqG¾2ÛÛ Wp`*]&<¥A‘ôjÍ‚³JaGþˆ%YHR„fòCk…-†“e:¤(ÎÚZÞBá(¨³¡æ² §áʼn´uaúYnÍØ¢]'*èN~NÎ:Še7„Y-üÅ$’„Æn¢–°}ì e;â+I›;¬¡»œ¯¦TŽ8?Ü\ ,Co²µX*¤[ðb€­œƒdD-4Äv:2¨C‹Ç×_ÁÌmø×6 »Pçüú¡O‚¿<¼uXQÊL,â~›_ Y.ŒóúÕ›\^(p{úËù ÖrÝ`Ohq‘‰º<°…žëÃ5'5E×èϸ󨠳ÅëÈ1¤°tñÜùÑ"ÌA ˆpyP^:jC·8°ã¥#éÐHsþÔ]³Ëq†D._¸ì‹~2º/ô~[ι{„w)3ìQå®,Ô&«WXv‡ #›ô¤\ÕEàΓ_—£…Á©‹#šÈ\ám×å Á·ýޏÍv]Fû|yçì4ÎfŸ–r€jêr¼+Á1ádŒ5Kk«…-_bƒc[¯‚XQº¡GL ×À“jµhæ¯ù8W!Hbæh3Ñg,imÈiŽGš¬è©ù*´Æ³G{±»ŸI ÝžqYç8=¸bõÉ‚)amÖ¤3ocË:-Ë_¿lkPL9ú˜ ­'CÏ]§d‰ED:í¬÷ÒnͪL±Nè師€8›RX*]š¬&wcGˆ·O1Ù˜dˆiŸžçÌ£é q*Roµ²eKÖ£èêÌ̶Î;/ã2¼Øq!(*Àˆþê«WTjTÁz<öhÚÀÉ]Rw{åÝ!ìëDdsj˼³à+owÎþ¼ù=ÞêŽë e¿'á²Ïà îÂ8)§ àå;”`áS,+€¸-õŠø|yª#—î©Ð2!ˆ3½‹û'ëDôUݘÆKÊ`$òåå ã~̪ƒô&] ´½Qv4d䯸²ËáIvYM_¹=BSs½óÝ'Hû˜-ͯɖª§é”xá‰×Šrx„笷þŒ²¤—C"œYŠÛOOî†\©‘<3ÂÅï÷ŸØº†ü°É„îtµÅŽf;W4Z~$˜­ª-lbx+mc/×z’ªÅšŽÙ* .tÛi ÷9»-Ö¾aÁ,\oGÅgŠªqóXÑ#®«Ê‹Mò]ʈ…™h+!ð0‡4œ6ÉõÒ~å(Èbu¼RøÚði¨æŽ=ƒV—cµÓ аsxÊW¥E¾»z¾`zBßEÄq0ÙÑ¢|i²±rH›CñÔk±Á(ÎsèyÓ¿I ˜3xq>6¬ka±X(T¸ŒŠhX}_wú<Vð‰õ ò½@‡v%Ÿƒþ¢’D½ª€ o=A–¿Ên阶ÚÕ£J‚<’õ0I¦.³Ü“˜#ÁÚ»nÙÂô‰>¿é•h½I û£« ×§ƒ'íÜLn¿9X˜Ê&Ä5ª¯3Û;•Œ$èÇúY±Œd¹î ºahM¸î¿´5·ìùG(Ák=ÉOCQÈÙ”°'eÕ3hÅ{,’µ…Ó_tE{žÙç;qZoÁàõEÚ74¨ô#R˜%Æ–¬WÊd#CÍCS´РSîØª’Þ‡±=M¥)RŸr‚"œôhl¦N÷uŠt\ ¹@‡.Ø©ë Kž”‹¯J<}*nÁ]…ƒg5 ßœÈq‚] ½wä Ÿ£VrHrÎ;Bà=ÕZËwß""y™ne¯¸÷ÅZª¡Žñr~[ðöH…1¦Þ?­ÀÕ ôÖ9H7¡œiºz/»{ëroL×»mÖõS7f´ªHØ%)lYò¿°³j6{Ó.KÚvZ£·›µÄ¾Ä¶ÐôÙp#öÝZ&A——ª£¨ÔÃ`oKíŽê ž€•“G§+ ì«#1‹çÒhR7 œ¿¦C–0Ò|Óóó}Ÿ"ˆ=u³ ×ÿá?Äzä—Õ{~NÎtUt Ócy›´•Ðv ‰ÙhÈÌ‹PD&Uz"F˜¨›o¢…%Çp1€æš)PuÝΆI“Ì,¦³cÓ1¬õîRo¨Y–ÖZ°ž¡³fÕÝ’ˉ•"[ݲ‘ϹÀ©þ¿©Zm‚†+ÍUÀ3ŸáŎCvò2--ƒ7Ç]_˜öí{Î70$y÷@"†3£k–H^´d4¡! ëÛâ6Ø,Q)VŽêæ©xg§w7îäà#"ÞIŃŒÌسCSÞ/ òwý?ê袛?FÀ“° `ÞÎñ ©&F~‰¶½ç°3bç¼,eæWâY5$J([–6I—sçN VÞ»äx0oÙ¥Lô²&ƒ‚x‡Ÿ×„WKì”EµÓ銲Úx ¸nž`×fΔWrŽCiÔ×’C ó×qIA­òs÷³©Gš?ˆ¯Ï☆ø±UæRÚŽ´˜'|7fàŠCz f33ú¬Xû¢yMø+%ù‰Ä&”dÏ“4šïÁi^] *¬ç,\2°`#ËÔ•›Uò£cbãMž{ _’RŽÏE#Jy$©gÄÆAZºƒÿ›Á¢ó\ds×2ÂRºuŠÌzZ3Þ‚$±Vª‘­rþÂël®²4t¥fŠãj—ºûuA˜ ¸GNë±.eyN4kõ”î²eO©BM L \ðÅ ó¸ü>&ÿþ{Êô¦êê };ÇÎ7OrÔð^´˜7ÜÜÅ0²oK=e~ðEÆCµXA­«:êµ ˜ ̆PR`¢õCX~'Ñ)sÆ"IÕäèEƅתÑuó©CNdq]>†môßY¯1À”b[‰ Q”f÷ò;¯8§¸úòΛùtÐÊ-͆ªqƦ%±Æ¾I h?(çï¾AÎnw 3´–hp®b'Ù½Œ z•XúPÇÀ¦£²ûIŸÈ  U*4Uš?vÔ®(y7Âo³1’f¥RY&÷3Žœ°$ûUÙ‡Ic–¸ÞáÛçñi½/kŃ( ©Ìi C2ªÛø‘sÑK$Ÿd>à ï+…ºemÕ¥k?Ðcqœë³–³ Åfš{XÌ®2mh!ÏùìĶê+üìqÖ«¶vkq}V"1ß±‡xsÅÄt1ÄjHê¨E¸á¢_ƒ¾\(ûI_? ¡õ°ß“BÁMn VZR÷J¶¶«Ï8}§xð ʱޑ/Ð#AÙ­ôзú[~Ya ðKww·ŒÃ£Ô GZö±ÇÏf.÷øé§ñÑZÈ I·ŸŒuåBáïÏÓã úS…ZìábàµÔmæmþ aL "UÈ&y¸ÝàÏÇûËŸ ùDæÖ“älÙdEÜ&¯ð4—¤‰ÁƒÁDžæÞC6È£dÛ¡åÃHq‡Ýi˜Éí÷…õô•ÃݵI®)‚^Éæ¯\1¬ÆUt_ŠUêùÁu3åÖn¹Uß͆Uö>T®ÜDmAÂ}òaJw Ó£åEéBqÆ…¤·&Rç?³8;ô±]b€km'fïã‚Û§Ø>bØî&Üß #Wm™ž ßÔ Ÿ?ªð /¦=xÿóëq1Sø“˜ôü àðí(ÓÁ^–PÔ  œ°ÅdRCü«U¸$ª÷=‰%¢ýwDk0˜Ù>-O.JÉä5=Úžòp{öÛ¶N§j*øñüŒDœqË»Ñ!#–¼ÙÝ|øˆÄô#'¯&7ÙåKDc«Á’/6éO° ¤î6¾@èÊ}i&Gšà!þ+-¦¬š˜ ”{ SžÒy¼yBØ ¸CzøòãÍòÔæ{ÿµü‘ó~Š ȶ}Qˆy¥9¸´s¡ØyØ*”ÖCOü1ù¡+¦I·žÿ™©v31d‰úìÜTžj׆ÏÖ4}d“sÌPðNL"ÂtX£åþš?mq=SO5¨ÊU§c•[ËhϨsüÉU¼¶z¾`³-×[,‡ëYù³óÍ6 &¶Œó8jëóÐõðã1×ø»¤$¶ŸŸ nᲟö|· ?Üárcaê:(¦J²«wƒ9+2çÑž®¹¢z»OœäŒµéHÛ®w!¶rãûØÀ”GŒ;ž°‘cjR_/dô§,CN;†TÇŽœ?fà}¤x9ú~dhmÉ¿ì€ f×Ýßi™e¯¬ÅRw~xslñCç ‡ÞG 1 ÞãxWŒR¬äkæ©“qI® õW¹òЂú='SìȈ¶ó}µÙ‚«¶†ª¯¨›,¼QTËXÕ¨pr¯ïÈAlrÓUûfµÎ÷‡ÓŠ·,Áž$âæ–ê•B9R°^Ç_º3ÄÆ+iä<Šúaœ¿[¶ÈpBE)MŽa`ЧÌ"ÁoÃc”ÁœJÃ^Ưߧn³Ã^ABU» &¤êg?Ïõ˜¶—\gÄ;4ÆÇÜd’z‹ú"Š6ÏWžp̃ʅ;BQ.?Í¥œHsdïö˜º¯w·Å_Ȥ%æ6ö¯×ß8›6ÂõwÅyC‚¸k‚s6ˆõ®£ñÕ៉Ôt…¦„®Ä”ëëÁÈÙ=ñPûÚèð×nã§Û{aà–è URxîÚ´IýáØ´²cˆ–5KÂÃ5(õec°óY-ÁÎlÞ™ûÉÞÛØbü~®OjÏ…4DW4—·š¼¬t6¯÷øø"aWrk¦ùZ¹_Î 3©V1ID«~åH‡Ù¡ïc6)ô)°­d1ƒõñ,> :¸‹‡ Qõø}4÷Žá(œ<Ójº9Û;b q_4 W0ÊlQJÖƒ*¤ÒÅ€vˆGµo̺ˆé—é9*éq *æN™ðæ»Ò§€¶¯ú"ÑÉKNbIµEY¹Jt´B€0ñ>QŠCpüfã—œ+“‹ÍO‘Ÿi¹<ÑÒݹ—íy{ñµNúÊZñÔFuÎÕiAúäQB Ÿ±<]Z2NS ê}•c€¿®èâR+T‘ÔºæŸâöq:<$¬{Äu¾OÇ.@ë3èV6ÙíQ÷oÂ¥5#Õ‘U?›äÏÎ ÷æîfœ/Å—üØÑú±Á 9U„À^¯H+âØG¸Ã²b±a»‹Q$é×¾‘£íìé<ÁÜHÍU‰Lxñ„T\ñaeynù.Ò—3þK;¿@þ5EŸ+üçWÄ^¦p»æ +®½ÚX'E†{~Ñù| Ý4z)w|ÞL5O6˜¢ˆ‘‚®ö»!¸†±Jl•Ú¶8 v‹›3ù«U3[Sb¯k^›u}ƒ2 Üxƒ-('p<Çg]¸þsPâÆ½Ä?¿AãÄ+§ž@ÁãT¤ºÏƒ4tƒÑ(kÆ2`NqøÜÐ_•1 GÂÖÞoÅiýÞ›9y­#{[".¤Ö‡áÂà'Z­ÅÁÆ,qšäG8z b_ŸŽ}OD~zwÆÚ&/]Ý*ÿêî™Z‚ò”wÞ/‰ÑRÔ°ì,>¢ËÂ8FAà%ŠqkBõ «½ ¬N8=°YnºiAÛ5„ ›èh¦í{¬)”&#e͘°Ùå.IG6#"V"’4Ë’døAÄŸ÷¯ EZPÝRåÒz“N°t¹Wü-ùÂó´ÝY1Gudí…9ÉOÏ/JÈ–ð2ð$¿¿ÁñJAæ ž‰ 6`v¶ó#R"ÒC ‡ZQØòK×§fR~]w…kЂÇÂðÁl‹oÐ+ɵýRØŠRÜ«y죌÷J èPUCZã ;® àÁo¸ÎÁÍú•ìøªøIGû-²³ ƒÀ´’gpMcZM“=͆ ¿š©"c´@Úl«õÁW‹d¢C-¨‰*)f~sÓ±•àCÀè°½ŸÌXÕv[í6Ì0 õ˜d¦~ç£>$6µevvž®åoÀÙ»hÚjŽ ãß ³ÜN +E“®Ÿê>ÂW‰6ÁF iŸS„Â4ÐcöÈkûú­¶õ Š‚#_þ1Q²l O$zÇœ@oï§Ê,¥;9̡޺¶"; ê©q#6¦§ÎŒ`Gþ}óÈ“\Gj†ï·P•&FnÝpš_}q~ܱgf´ÏΊZ®¿-E•œo¯$â‘ÁÊK(-Šžý]«¬·DMÏõÎ³ŠŽ\,Žv>M²õƒ<íKú®«§  _ñðqÿº¥>´ÍcܳN¥‚ú<~ÉË!µzÂ'OÖ]-+p¤»†[KØŠ5úÜ4S®9åGླLs2 â†~“l  …ÚEy"Ôq²D=&²Òê#¦ô*Y vÕÄ_ûµ)Q‡p jÜ_Kœ‹L(Φ#¸|g@¸¤MÙ¶H-ÛéhÓ"…qç:çó!KùüƒËl e¹ï…YÂ},mFÔZ LÒatzÖ€êvÏv÷÷N8´øì4ã nÖpaLKeœ ,°`<¿Ûô”9äÍñÏÞ^,Í]z¹:Zh™ùàÉOo³–™Bº'¬¢‹œyô½%ßS†¿d|A¿r¿¨;·ê Ö‰6ëWË~SÎÖN™¼ýHC+8ä­°håç24°^°Ç7}ÍþÚr#s%‰å¿G߯i\b9å,Ðà<jÑ-Â\djíƒOC–V„≇‹»·\MÚUÀû­É¯0|÷®…Jˆ`VŠl1’_„Hö²b[‹dB"Ù²—OY2Îì|AäAý&›^‡"ŒÚÚ±l#4K¨{ŽPæx6‡¼eÔ-ÎÛ2|äTï2˜·?£¥ 2%- U½fC²{úv7jDÀËX{ÙóÌ–¿œ3‘,©=‘!ÆÕ>›=B¬Âçhö3œºßºÛ|ãfö\{F~/‡¶<]åO§‚¬ãÈ´ç´_Ùs{•$Á˜S>$]߬°Y DÔã+¾¦ ´ßgn> €¥!T4n Z:¥!K(I…'ô6»3¡r@L| =ÌW#cL é3ËxªîuªÀ¢ðPüº5³´q Ïe‰N­DgP•¼æ˜’pÿAñ« Aü°#Òìäá£ù©¡]‡Ùyœ‡‚×6M–h+pÂá9)Þ0Áºo cf[;iI11™S(Æ*͔Ǵ¿f'Ƭœ“À2g™Ö“ˆ­Ð%b¿ ô7?E:"Ý6nÙ¦°roNTl«Î¶aéjÅ…ÇrìXâr'Õ¼n¸QQu²ßfçoˇ\kÖÄâgSö·s‚x3̺æ"V´_ã¯×2f”QÐì¡'ÍÕ¾­^—榛ÊÏ)~ã'{a4ªÄu¢6Æ)ZòOƒ ·Ö­ÚY<Ð<½† (6[ٞ߇¯¾‰çÔ;óL¥Evñ«MÁ¥F+^!%o¦º§NÛ.÷€ó0Ä!-¬>0b¡ºÕb•ƒÒºŸêÃ×ÚmBÃÇû´”ÿAn’ÇíQɦ‹ssWK8†4rÃdýÙ½H`Þkw:xkkÓլë±ÓGÞTóä’zÏZØßÙÝÛâ/<¦ M{> ¿D£Lè»joàîEɱø>ÐÁG¤{7©Qî€+eú`ãÄ%@åiõ´¬Í%¬Tà+ò¾6૸C³¿®¦n@JÉ1‰Œòï¼`Æ«`†ÂÄK°·R¿2«-½àŽ¥qá’†Ö$ZƒŸïzu'±:˜s„0’À*g”Þ{BÎi)šd˜`Ë|ÞøÆV£R­ëßA"Œ(y?¯ªVh™±Ìû”Ô> —¦>(—##ÈÀ7(løÞNäL³eÏ8¹-Ëñžòè!MæRV =S£Ô(ÖyÞpˆçíBðÛ1cQ7ž-Ä<=:ðs¢¯ýyuÑÍlÍ &ƒ~uò¹á§óê†Æ¬©! µ°’]JTîÝÝo&X\´ö¿ÎвÚg1)špPßV¾“RF‰<£5-Ä ÈÛMÉJƒt„fôô3‘*¹?¡cÓù`ÃE†ð™3”ÔÞº¾ôs³) ¼.º°¸Ý Îƒzãþ(3ézîLú  d-ÐTO­@n~êµa€õ@ÐPß ¦@ó ×5-Iü@!½FG—g0 ûγý˜a;N}Ý–ŸÍ­–\iŸ_ÌgžñõY4¿ÛE÷7ù:§gvS°[ìs¡îbñ¦¨Îù(3ufÈ3Olz#VÎÌÔÃßWdò™¸eÁDL¿PYÈ¢ÊD5¥Ò”,¾ßî¶%MŸ!{ sêi ^ÀY\W}˜¥CS@ŠhK§=¸Àvå´¬Fã èzچơ“¹º3=:¯¹Æ·e0'oF*Åæ¢J 'î±èÇ£Ê\:Ù™\ÃV>&\[„…æœ ÖÅùüÙšÅÓ—Ä -‹§)KÓœR¡ ¦ 'ú+¼x|Á,Z<ÁÀQk1LòêŒì"†WÓmƒÇš)"4È0B%Æï,3»øÌèý;% UGŠrîøÖ¾å­¹“ãþðöÔÕ®zð^ÏA%iJ펳a甞ÊC–Æ—A Ã"Yãfk¯”¿ø½rIV•¾îîFMó½í Jrà Õ½(ˆã¼ÇgPp¤†ÝV\¢–5DH<"ê;Öp‹lP>ÅyyE›½7J$’þff8íÄwtö ·œ=)Ë€sà-ôÂØ»oî½;]HÀcg´DvfVÐÆCA5G|èâá>þòÃ솮æ;€y³†vpb|Ù¶Ï{§"¸M9ƒ³Ãz4¶8 væ™—0v‹¸»HËÁsd‹¼JS,êóñæg‚…27¨Ÿf¤%bú±lŸ…4C%³Ñ!(¢ŒW uNÁz±'±‹Â ?¯]ü*°[¿úðÔ¹}Ô Ó‘Pj•çe¯½éžª*§:ËQÌßóȽéŸv»H•±¶Ñ[k£àcÌøJ™÷å÷ç…E3–8¿>å ‡ˆÌêo#倚9ÄÓ|d ä}Mk·9Ÿ³%]õT43[àg)¢W}‡úwôÖà ^43{ñYÂíºl#ñéÎI˰Ÿô+7û®»ÉtK¼²¹B6Î@Dx‚åþ…iÐâã½f1ÕªEЪdvÕW¸ 'gEÈ‹FIÅ9g¯¸ý 0Ã,R9éã˥є%íQŽØ°ÆmgT;&wÏ0HðÙp¦éwQ²’YPˆ¼oŸ)þó{K5û*÷±0hG7 ¾¾=&á֤ϗårù­Øúy¦áĆ*H?ÀJHö.ŠÐMâ±Ôüæ÷Üs½üGò ¸ßдŸ©:Q0±ë@U¡)ç¹¶y0ÄŸU¾„.· 6:¦Š#%„¼|Ó“P,w\»7r˵'\?‚Ì4设Jˆn¥ø¥y¡¿à…Ê’¿¥°·‰ðÒÂá 2NNocêvë«…4C¦DÓøÎ ×#vvà¬ß8¸F .hYFûìLºÑ9—ÆMIø¹3Ÿdz·YH¶R9þ—CSKîÀô‡3»“:l«QX|Þcø¼9=ƒ‘Öƒxp¢µûËh=Ó£I*\+ezéÂé³è%F^–ˆæ‡µp½^'Ò½¦l›=õç4÷% øÐ6É¢1Ÿv¨ƒö ßïÖN €€²pͬ+ºùˆÆWWnÁmSiG—ÆÍ‹0¬?8‡!s¿<~îýü༆8[?S]üz!óÑwk1¯î²½MœEôþ‚àí43¶òç¢æÆß¸Ìeô`Í›¦N²OcPô0µ¡tqmçK¢GoTz♞Ê=èçš(ݺÁq ù¦w"Ÿ.!¼ö. !´cYžA–Û:m´)æ`#m¿Fë=b¿CÊäú Æûõbü\Ò6Ó3lÁOܺÒ*Æj»6˜hÌ ¥«šR雳 3e«ÿ>¹}lì“»¡žC\Ô Æyç¨s_s5sˆ„$þ7l¦D¢ôVLëHµýª!l¨DÉ;ë –¡ ¼l^VÿÚôî4hRbx^wE?o³ßM»øÒòANðNÏæ>©˜¿s¸  ÜX1Êסºä6‡Þ¿?ÈøWá'æì»°½r|ó`¦ÊIêÒíš † ³¼HÉð÷Ê^èÝêÚÃÙfu>꿥銅õ®¶¥ÙÙJp[©’Ï žíRsOp³¦£ÉXû,>ê€dÏC¯Ò̦þPÂtVˆrÆ”ó°Ó}<í;¯‡2c“—qmñÒÿh£ÛâÂÉ æöŽ›B{L!‘ª9ÎRC¶¸bKfn5&Ø K/3ÍëK—`“ýÚ CÖ¤ÆÀüƒÖÃeþx®Ý ¿b‹«”–ð3}“u³6¶ƒûØ^TN2ßLZhó(“ä cšoòÏqoYÇŸù»™1Ð5©:kô™[`üBžwWÇÑì,:œ2⇾ b£ºK[o†ØÆ-€ù´aê ýB;ßÎRfR!ˆ_ŽI¨"ù9ïÿ¹¬qq¥Õ|Ò;¥>è4ßôÁÙä3A¡ªù…ŒÆ•Ÿ‘ªœ|°…``GV‰œZDWª èþúÇú7ûÂC¶°þ>B›öÒà©Õ’oË‘âSÜ76 âWÆ,MN줾æ‹TÞáž»ˆ©¤…u#vHi‰¼<ÐF_+£“ÀÉaÕu —ÆN¢B3HÒ‰[ÙVYd %Æó&ê±ðª©?Y,ÖÎÛ{/äQH-Ð-þ¸ YNƒ^ý"´K(ëŽ0~ã:[&Òéú‰Åèéw[ŠÕ< ¾I-Ïø;XÛlÿܶd³MðP~Çó€sË7jüÅÞÈ8'Ê¥xRﺣrTVUëV±TV‘†ƒÏŽù¡äœQ5¦áu°C‘.5ä¡&ËÙúúÅ[vZ‡¹^F|—h¤‹XÃCÍR¾¡ÔæçûÖ¸¥ÝfJűð±éQo&΃à D¸ßéF–Ñ87,¤¸Ö«óÔŸo¤\ÿ À& endstream endobj 2589 0 obj << /Length1 2635 /Length2 19229 /Length3 0 /Length 20735 /Filter /FlateDecode >> stream xÚŒöPèÖŠânÁÆ‚»{pwwhÜÝ]‚[ Hpww‡à.Á$8 îÁoÏÌ9“œÿ½ª{‹*èµumûhjru&QsGS”£ƒ3+?@\QL‡ÀÊÊÁÌÊÊŽDM­aífú¯‰Z äâjíèÀÿ‡…¸ è–IÝÀ†ŠŽ9w;€›Ÿ‡Ÿ•ÀÎÊÊ÷_CG~€ÐÃÚ È st¹"Q‹;:y»X[Z¹óü÷#€ÖŒÀÆÇÇÃø·;@Ôäbmt(ݬ@öàŒf@;€º£™5ÈÍûBÐ Z¹¹9ñ³°xzz2í]™],…éžÖnV5+ÈÅdø«d€ÐôŸÒ˜‘¨VÖ®ÿ(Ô-Ü<. X`gmrp»¸;˜ƒ\àìuY€²Èác… ÿi€™íßpÿñþ+µÃßÎ@33G{' ƒ·µƒ%ÀÂÚP–R`vórcÌÿ2Ú¹:‚ý@k; )Øàoê@€”¨*®ð?õ¹š¹X;¹¹2»ZÛýU#Ë_aÀm–t0w´·9¸¹"ýÅOÂÚdî»7ˆkëàèéàû_daí`nñWæîN,šÖÎî Y‰ÿØ€EH¿e– 7+++7ä y™Y±ü•@ÃÛ ô·’í/1¸_'G'€¸ ¿µüÉ×踹¸ƒü}ÿTü/Bbc˜[›¹LA–ÖH¿£ƒÅ ‹0xþ.Ö^}Vðú±Xÿúù÷“!xÃÌì¼›ÿ=b% uQ†ÿ”ü¯RLÌÑ àËÄÅ`bçb°±qðx¸Xþÿçßü·ú¿¥*@ëÿ°cýQÖÁÂÀ÷Oàîý·ÿlíΆð¿”Áû Ðþ^V.V3ð/¶ÿÏGð·Ëÿ¿Ýÿ+Êÿëúÿ_FRîvvëiÿ1øÿÑí­í¼ÿcÞgw7ðm(:‚/Äáÿšjƒþ9h1G;óÿ«“u‚/DÔÁÒîß6Z»JY{ÌU¬Ý̬þY¢ÿNÜÎÚ¤âèjý׃`bceý?:ð͙قWð¬þVÀ'õ¿)%ÌÍÿº=v.nÐÅèÄ ^0v..€/øHÍA^ï6€…ÙÁÑ ìç°ptAúk¢Ü\Ñ¿Dÿ n‹ØoÄ`ÿx,¿€Eò_Äà `‘úØ,Ò¿;€Eæ7â°ÈþFœ¹ßÌEþ7sQøÀ\#0¥ßÌEù_Ä æ¢ò¹¨þF`.j¿˜‹úoæ¢ñ¹hþF`.Z¿˜‹öoæ¢ó/âg×ûÀ–À˜'Ð ¼ZÿJ8Á|€®à]³vµýíhúÌþEì`’f sk;»ßaùþ’Y»˜¹Û[؇ý_18Œ™£x±þÍö—!ø-ýƒxãXÌÿ€ànýf^(––ýß©ÿ¥wv_é%à‚×ËhÿGpU¿!ØÇâø—ÒúwŽ¿ ÇIÿÒ;º»ülbùWaõ»&𜬼¬@X€eÖ@p6@ðLlÿ€à6ÙýÁíþ£6p~Gæ»:€Ïò=¸8ÇßdÀÎŽÿ£ãô[ &âžµã±`qþÝß¿;Èõï÷àßù²ÿ%tt™›ÚÙ,~Oƒû?Šÿ‘‚ý¤.ÿ3:66pßþè*¸I®¿+û <þè"ØÜÕú÷:q‚kwµºZýœÿwðÛÎâfåú£|ö¿ ¬íÌÿ˜.¸ŸnžŽćuÿ‚§áñ×âùG<°·×œÑûî“Ïo¾àH> —RýÏ“iæîâþ:ñ÷?5ð{ú_ü÷wÈ d†´ºäh&fÓÖõ«N”È“ioZhzO;ŽÉwÕ¥Ûý >•®öSÈ7—[ÑÔ±ŒõIÚ›wkdϾGíMð‘)ª~OÆIjs{H+³¸Ã3EG¢C$ˆÄLïöýžý´‚m¡Û!{å¨óœÝyÑT °~y~–öjªø:±´§º_Ë-üT1ϧk\ºHošýŸΉóÜ }ñæv3wæ•L.‰Éÿ8Ž£ØWï;{üýŸ* v×>*=|èÌɹ·¾b‡irx˾e% r1%$FK­ÂÝè@gÎzòÞUÁЉ™­ üÆÁâè;s fªÛÔbc?ìÔs{ð1óyJçŸÙŒ ‘\U{žq}bª?¹„Š Ûº¨°Gf &Û‘†ÝЊÀõF¦-s¯ ñÌÓ4%¿¾KZa7ÍwÓï÷z¡žô@ñüºðŸ™‘v@ÈÑ¿ÖÐ=Ö˜… £޳Y‘ç À™œäh×`¾Ú C•ÇÍAÉÛLÖ“ëõA{TÊ92 Y3Ü¿‡õ}ÙYcÏ=lżB4ŸiÃ/×ï3!ÿMÉ®^P§ÿáh([ÌSd²J2Ä1¬§¶ ,J‹* !l‹´¼.½S!áŸnš+ŸüüVÌ<ÙoN¶bö4\ÆÈó½"zMå ˆRBâŒ-»’C;¥°/ŠyröªWŽ—{¹f‘D0]ƒ@q옢Y8ÌŸ– J)d'' e;”2K¸UϦÿÖª`¬™!]óųöõb驉*qwpvÛ`K[‰Y¼˜VkÞàLiŸ8¯{ ã 좨ȥ1†k¹b„Jë]rO¼·…ºwÙÖR¯é÷7Sƒ&|î$Nñ÷*Û£‰uJî.Kt BîVåñ_BæG%¦Wó;úUcŒJýñ[ÛÈ`ûú‘v™Ê¦}4é§¾’rTÜîÈ{â…úì©òC}ƒï$C[Úšbþ0‡cæÕQ[èÿ±‚63SPO0š{%“Kþëbf#äƒÏÓéî|VHº¾@ݪ”hþåZì1³H\1Ôò|Y­/ÁϰK{yÚ¯íYj†¨ÍŸø>Ãêée‘Øû™á9†EÖ'…ÈØG(AD8d|ø¹w‚r›GÀj@ðl¡€’å³²“Ú¬üù5amcê$>«ºZ2ŒvœfmŸ,øc¿E}(êK±™öÇP‰ô‘g‚2^ÈÐñµaZô²°Ži¬˜Ï«ó½™OTNçX)ä³$ëW|±j!½KÿòO뉆 G> p|-xýŒqDB8ûf¦úo;}ß9K°©V?hIè1Õ¦õ×d,j¯É§95×¢œ´µäh¸ßŸ/)5²á$U‘ß³Þòp…ÀÆþXŸï‚gê`˜¨Ð’Â3Ûç⨛ áµB¶:6†=³ëÄ9u@HüÌÜki½UêA]ìå?Ï/ÕÏ šÊ5矵6ÃYʰyTdß5™är©QH¸â/Äßm,}ø^Ý3ðýÅ,sYѱì{¹Ÿ±°ÊÏZ©¢òÛjaØ•ýt¬Ô–tø=Δ.^”&ƒþ ì=íAaF™€£ÊQHMáÚ€7˜›t0|xiÒ¹LØÆa 3‹‘pÙu%ÚgZïßOg³A¸Ô§–_ ëUžNnŠÌÄOñn«èAÚ&ÂQÚƒ$T®ç2ËÞsw%}¸ç+ñ²’ì3Ö¡öNŒPú•OËGXz€gε$X°©ÃYÛÉ…EžpŽ¢#žW'I*w_ÙÓŠa°²h¨“ß‘FÚT“õ´jGß¶8IįKÜÌ$Lì4Æs›Ú¦ÐñØ4²¢—3"Ð8bwsSÙižÁV4ÅÏü°$gÄAê^÷ËGSf8‡çãÐòô¤ªÆÙ-I×4·l£ò@ AAz;3líW^ ÎË5¥ŠÁÂ!î{ÜÙ°¸Ì~YûªG¢‚AÇYg±Ä ì¤cüÞ-À•¦Ÿ ¦G%h•'¾é™ÞMvñÈ©"ŠõÁÓÊ´7PæžÃZÒ?,¤Y½ØþØç.U çÉ´¾d§/Vøg'5íûhLˆÁe@cYØýæ{«” Å%MW[оsVk)sö’8«;±fÁÉq÷ÛŠ½¯Œ¢sˆžL œT›ÅÂóíEéB”5 wòôÚP]’Qµn0ÆcLrÝFMI¦ # ¯ôÌÎË­"Ób> {)”l:í$¸B—d·K+­*[ _å.8Æ]/å•eöA¬É œË1Ø#M“Ë'ǹ—›²þ4î<‘n/oXtç½÷¦W¿‡Dó¿²–Öâö¶BâmQÙ7Dxbøè©)|9`Uú©æœyKþ•žgÌ]A¹kZÈ4p*àôÉxCñYÐÝ÷>º×#õ¹3`Û5™ßìr6ÿhó)7SpLÁý¥!§Ï[å1Mø¾+¢¥ô+F‡¾µN ÖúìTÁâÊBj‘¥T¹bòƒ#Æô¤1pŠ•)R§QÈøåå–—Z‘Q•D`Øú´B 4ÑÒŒÎ›Š˜õ;iÿb H‚šÌµü‡>ÊQ#a¨„ù¼%š<¦¬6˜ Í u©_=žŠÊ‰µ®réªDMý¡¾ðˆÁÝ›=­×ì5ZI5J®ßæã/Ñ{¨ÅB׬b/¿R/3n] çîG^9þÿ¸F!“=S‹¶ˆžh«dŸÃ(Ӝ⡑«§m9ë$Éš»¬6cS‘ÝHܺc¶ËS]„´“¢¶É-SiBb;íô1e«©×ÚTd°—o k±`¤Xgá(ü\+ðx›ÆSÀÂÓ_-4áÈt F½ÿÝ!XN¬…øÃ>ä+·(ë«>l5)¾º\%ßDÚ‚·éçTßÂù'®­z ï^o_múàËrQVˆŽ©¥ ð´Â^×ÞKoz´†À‰˜¨ó?â—9© O¶Œ¡ÿ ÜæËª„ˆÍ›ØÔ½ÓwýØR}=² „€½ð½gk)”÷'ÕC/%aVó‹- 2ɅŦEX~ZBlîr fyHŠŠ'‘d3_éÍ •RgØš`ÁsÙë{ ØNWègE•Ÿ’µMÇÙ_ž(Éé-ð²È!5E£’fÆ¡PE80ûv¼xÒ.¸)‰z_äWÑBïw(G±Ÿ‘ÇRÇÜ‹ñbL ÚXR¾I÷6®SdTî Ê LL·v¾PݺõÐM‰$²”ÞñÅ f9b‰ibüþÉÆ-›{›,•ëxJTáä<Ó ¯ËÎã»Î’ …Á¶Ï¹ÈÞ•)¡u×3\èsjïX|-ŽTÅ/ü+ÍÇûF—oVv\×Bsv>çÎ%ÞtÆZ¨:¶žõ*.0Ñ0¦£r³|ÕöµZ™;c‰šËü9isШî?ÿr"éƒ<çý¥e7zkɱl³1À'KÁ×YÔBmÞŠŠ.†ßGI]NaÃ›ØÆ(çó‡‘d’fÈÄabRºyÙ€Yy=hQœVØ„89ÜZá¾í·ƒÅ›ýÛF¯¡°=tÝ‘:\DBVÐJó!@%Œ•†rê86Øí%8¶uK‘ƒ NîFž`™Û$Ü#ò—«f¥ëç~›‚meN’²nìÕÓ×½¢ö8H·|©KïËýƽ›‹·g¾Wžªú zÑrÉÎmH í[ïÏvì¿Ù(:HZÈ¢Ø#—©I“ÔjÂT7é¢ÕòdþR Ç++|͖Ljæ'2ü\$F^1„§$$‡}v@³,Ê|kÛç+¨2:ðQdŠÅ´`‡ÚL­)8bË¡‹†>tç23Ÿ›7šl] ÝÝX#ûg&[ ÙÛSzXP‘’ÑÛRwY¿›û0†×%Öòf d~dÈDsjlEÞ~‰ãÀ¶Y…\W]ß(‰&JNä_¡¾ÀrV*‡b óñ\š©)yI”4§”=àéíº±ø)ß• FœÛOûÅ|HX4ŒÂ¡vGÄ…zÎÎïêLp£ð±ÅcêNѸ Öü.5 ôÙGÊ}µMîíû^7Gƒ—Û.»K¿ö&}]²j'<ñÓÛ&yrfV·tUʼnç7_¯xRáâíæ2=÷t?!û¡öþÊo;ßôÄg§ìç÷›˜íâÞÌ_改¯+^´u¹ ƒŒ/¶¿^¼Èô¨Žª5eÐÏôª ÞÅÐ ךþÝ…X¯µæŒc‚ߤX”Gצ»xu!éuDG•.ºs'% JÑu¹-ÔWs–—£„š:o­¦Þs'®(÷\=|_Ôžf¯7ZÃÿ•‰æ#]{ò°VÊ›Ÿ®|~ö¶è6V¥X~d¶4¹%ã–>@z=K%}5×9Mlƾ‰oבô‡¨ÿt¾ÒÆì4>̵³S-Çâ~†³v, N–lL$äXÌxÒƒ~ÙØV¢ÆÝT…3òœÆßôÍz+YË_`+@úAt‘I,VVß*ëWœŠ”ðe-«ÖB¾ÜÚÖ«pêÓoßÜ@^àxXm °?±ER+d*lÝq锩?rM[‹Z{Ò+Ý«ª`†1|é7Ä+$oÁ±¢› úeYèËàTØ­Gp| ×ÿé3Œ6Ä€+= Õ}.íLc<4Ÿ‹4¸êåvŒK?©]\é;l'”à…þ¢1…fÑTêý.ˆGG?#þ‡9¦6 w§œhÙ£ôË2U€8Iå™;àøÂä‚‹‘ÄIá€:-š&wµŠI—ºE†#À™ !ÿrbÝ1D¯dV ÐÓÔëªë7”ü)l@›Å>u`¼w˜è£ä÷.6·3\lq<C$ŽÅ/ç FÜw+3wV9C=äMê²ß4ÚJðBؽC˜¬°à+k™aÞšÖx¸toqE]×owø$$uüPÞýÔÜnÑ5{Ä‘ëLË LÂŽ\v–±|Mw”eˆý劚Õ‰N§`jœ©h¤o‡Ó4•>ÜÅí!ƒ+üìϲÿU~ÌóÞn‡…B,ªÆ™öC‹º‡Û~êå‘–¨}Å!pºæÌ°¶‰ÉP)|{é¬%U›ÏÉrÐÐ^!ïísUÓ Dñì…ƒëòáÕÝŠÝû™Ÿ²fØ‘%õM‘„¡:ý›½¢­ód÷Û a¥ïj`lYÙGêÞ|ÏYç#4ÕÍö?RìÏ„33Ln¸ýÜX±»7~î-ò-0‰+tн,;Ï@aú8câª&u6÷N ¦sÚ†å}‚ˆ<ž5’è‡[ñž©^?øLe”èÉÿ¡DØo_GŽ×¼EÔ}Zp©² uN¿—åÉØß<›y’ÉyhŒ>sì*‹Nr]0ŒÃ©sn3ô]qµÖr4í|zÝc>½{)9ò1`{¤S[›/Áž€ïžòŠð©?(üPÍ‘ÖZna|STÖŹôZCpϯŒeše†reÕ_…ŤQ\nV© ™CòùÕVÞîó·#á¬GÿäPbæ†í"ÏvæãÓn·g¸ªP4]ú ÆÂòB¸`Gtgcc`(† '?ö•ÇÏ`& ë ±®á-ùÇüQg¥ÈÍóYì4¨E {Ÿke¶­ ï*e¤ÞÊìÖNz&úY"ÆzùSœ(QòÙ–3öZç¯k–Äã‚꺧?"ô5}ZS¹)Ë®÷>«¶Fv‘Ð6‹Ñ\âŸDàáý"{QÀ×:‘ࢼ7ޤÒj»Ñð9¬b°7/IA;¿xÈZ ]c8@ôüEçö‚ú&¨þ)¿TÅOË å%¡£Šƒ×ZXeåEVY¿lqB*%§ÿ ¿%ç¨èÍÕ)Á.»°[”wkÂlØ¡òήàäÆG¤Á¤½Þj©„4¤x Ú®z7]¹LÈRýq®z³-Ìãe“>z¥âï;~“•k,‘b[ø!ŽÓ5qÁa1t,ožUØàÜ÷R˜\½pÓ¸ˆýxѾžro.™“u¬e“æhûQÚÎ7g˜† Â?££u ñL¬ôz瑜}‘Çœ<Îà°Ñ‡¨\™ôƒˆÅ5a€JPçI`T°Z=¯¹MKyû ×—RF{æØn)%~€i V쬶UŒ\‘Ý/2Mîì% Ô¿„ GÉñLMûØ).• Gv­^™§ïŸþE•û¿ËUô.}K5£a}˜T®AÊñ'i˜)+uçlj2¢¾¢!®`d¾¢gÑEÕá÷’gšÃwçn1uú7>:Ú8%o‚ÈKó^†áTwŠ; Bå u¨¸ÑW-üC:-S±š»­lÅM?ö@ú_ÏëuôG¿Î[5Y®Ùk“ÕúĆŽÏÞåÔ±àW {|sº&gô°,A¾Ù’cA+oˆþ²~…ܹ°ˆI§#·Ã²ÆoØBªMT‘,G”o#;è©/ZUôs±ìþù˱¥v•?j‰ýñ^ŒçuîÖÍ;ÏJ’„þ‘ Ïm˜)æË_²ñ3JƒƒbÂxU’ƒ5á%úĆK âÌ+$qûŠ•€ZD…xãÕá„8Ö&G“Rº–÷j¹5G®áQ²&|w–üB¤L<$^3Òm–|fË$LF©ÒÐü³³á›5 ͈ ë‡î?soÐ>ÎOSG¹Ý¨:Á”¦@Ñ þ±†È¼Eº"ׇêQ0(tJWR\&¾NÝq*ÂcµâæpÈá tìôÑ+3Ç*Œ¡ùmNóå3©³‚¢l÷ü=ŠÙ¤ºöXGì¤*üZel[1¿ås>èOÝѰCÁ«3ó?PÃùsVa?2¦êÒÖºj®z ¦¢¥ÐŒˆG UŠžnî5Zš¨ÆôyÎSà±1 ¸–’–ò2áÍG6ë0*pJ^®­d]¤ñE …™Ðsbš?ÛçZÓgo Ä}x„Ê÷i_`ªuÕ´æ´©¶t–OŒÏ:!ÕÞ\”g§ìù8ŸíTJCßOOÎÎ3gš[_Ø&¾í‰Ìà!7júŽ«Û§Ë»yІÙ#¥îõm9^‚§‘2U¤!¼Â’(êæ| a]T+JeÊ{â°³®Š–ú§ñ"¾×`W¶è/ E‰¸±?s}6±îIÐkžM°f7ñ‰ÆÖ4+›'óó¬Ýx׸ä€?¸šÐENéJô/²O¸*ðÚÜæÁ*¼ì³¶Ýñj_ÄŠ}Ï+þï÷í.9ÉHN_•7†…Ï@X=Ä›Æý†myŸ•ϬDNeåæåpÿ#  bÆç R:Ì…m¯=ñË^OÏ…Õ M"XÑPºSm>IÜ-ÝËÕíc¤ªBN¤ÊOÞÔ~æi7IÁÌ'öòPgdDŒ³érÒÉì§»#±Å1Ï{2‰Ï¢’?8¯/óÉ_ÈhêÍO;Wθ!4Ñý!åúûérûʉ‹½³ƒ=T‹Þ¤ Ú{ý T;[Ã%Cºc®¦…Tæ¨w‘Ê›@ÜÓ#˜~Uö[¯œc_ÏV𸠕#]~æÆ4ó Ê‚ž}Œ&Ø$ €“ŸF?J‡£L<ê‚æÒvî»ÙšäÑoÍVDCžñ)QÃ8gÂJ¶?¼ðð¸Í®±ÛTˆÆWäàï0u8ͪÚf„¢”WIÃýYF]U7Knñ*?NÁçý ’’v,䜪fŠî5OÃÄ,ؼGCù*žhôy+É/Ý/·ÎÙŽ·Wž:@dBÜlº†I»ïF`LÇW”6$’׆Qî½j65ŽPïÕ…§"4ž$ÞÄ9#î{Y.¶Ð\îuLY\+j¶nb›|b.ÿñÊÖ2Ç«®ó¶„êÑ•§þ¬˜p/>®¢ÔÏAŠ^ÑãóO¼(zše P?Ÿy@ŠpÉ5eÚ±dq¤£37P™Âwê=–bÃÈD„ýÄ!÷š·=L>2eõ”¸Õ¾8ǬDÌf£¸†°Y_nýÓy"0ÛÓÚ¾Î(ÛÇØ­4(Ãö©ÿ­ýqÃàû4EרèºP­û滾œ†0“ŸqÛjq¦§žŸÒDC­Ý¥7~ï¡h1â%µÞËv ~­|œ/±çS—¡ê”LÐÚôçb†¦h‚ØJÅ1‚ÁÕ$ÎÍÜ}~A]s- =¸ù¥kDÇ÷MbSÊÚGÅ%·òœˆ{1Xå)ÚDjÚ]Ò3Îùh˜\{WŠ6-L]ÕŸeW7íºÊ_ö„j¿{±¹†³Н$ƒ5Š›Í¢H†€he @AÉy7·{Äó¶„2«£}'M[ùÖÃr¿õÅ?­•»®7„"rˆ…&ˆD…‘UÚXxs9×°êÅyß"Þt¶ÏB/Ý —ëNC¥¬!˜Å¡wå9{¦/—ç厉œÍzQ[ûaLêÙÑ]:ÿÛGØmwtÚÒDöÑn÷} iî„8æ“ózÍHo&”Î [äÎpÑ•ç0£Kéb¯OälE¶½QùRÄ[ p†'5_½CÖºëÒŠ;±'úÐB° טUåzvÒmÌ·ž8oi7÷ü•ek²HiXLÏS6‰’—¤¾QÓ-â£äú•:MŽÆS„a°ðº·éûd¦ŒŠzl9ºc`ãþ ­dx¥-‘aåü±Ô­‡&é-–S`~¨Åß}ØÓäŠqF<L@Ɖ… ¾›Pÿ /]ˆäA#öKp¨ìóÔÂ%iUjÚÛÐ4n >µ)±÷¬ÍóR~vOlÄÌ߯ËXÖµ†Û ž|V!ñÞH*£[G7U9ú,-nz¹1†‘*O§Ä4òÒ²D*°m1Ï§Ó Ô ¸«Çê©ñÃSUÑ¡Š wù/HžVŸä^Ó­Ã) 6ˆ~õÃYÓ_a" þâš‹2þ™}S0ÂY"o¹m}ØP:éÐK+Q\e¡Ó/]æAq½KêËøT‰Vü|'¨àûšúfêEÀ'ßàá®~³¾EᄦEµ©Ø7›"ÖÆxj‹á!ܤôÀ;ÞF? ³Õk±¸Ê©ÌL' ´Èð]ÌÉ*£f¨o)|É1„ôo‡œdÇë>Á³öÿ´Œ‰Fý X? ‹‘ y:RïV½€œáä€ùÍ/ü7¿S¡.O¯æüÿ¡Dþuºñ}*UåùG‹a‘4¡Â7 URÍL•U\‰‡—þ„• ñÒGôÁ7:ÔÑS~O>'GˆßêÚµ`Õ¼‘UŸ4 Q¿²/ο×Qžˆ˜ñSµ3Ê$ÛZ1Ӡψúå7Él HJ©¡¥ùJ˜}ƸË`ËüK@ïÎ~J}þÓåó©*W‡oó¸æ3B´J”«1'yЛ·ïézÐI‚lxY!¦î.I“* è¿®ˬH„uΞ™`ð%¯Þ Ø0T`ÀÌÄ«.T[fžË®gˆ.è©YÛm3>äL  J©+÷öÙФš=è¥o=«»{üø„ú¨V¹¦©@¨Ûc“3æHÛÜ #ÉØI}<¬* Q.ŽIjŠdÊ4ÓQ~MFºå<Úè8~ðÞÐ~&ž"ÂlÕiä¦ÃÖE•—cÇ)º(#¾Á=íi"ßtj¡qò.¬Dá]ƒ¹oÍî´M\ñõH\ñœ¢1#1ÁôrMÔT™µÓû‰…`ÃöñÅ!×Pç7Š‘Ô¢”k‘|ÕB.ø]ŠÅt¡í²Px:·¼=œ,•D¢yoÉ-wŠ(ä¿Ã“E“~ ¸ü8—¾gõA!6æµ@sí«Œü¦Î[2í9}…:º×¤á÷¯„ò~W53_G‰lSòSå T²-œ_Ë…¹Ä]ôê7Z^ÉÝšüLk’¼Ýå ~¦Ïžë øv%¤“ýÀlnÞ>¼ì€dE¡…ùùYƒn¤)Daw¾Á¯Ú×(2<{1=—Ýi~¡Õ°›í£Á^aÁ°vì³–Ëc¦‘Ý,‹—b OX,Ê}åΗùšG¯i¾Œëü–Åx–x%±Ž…Þß^S »2f¸“¸\1ˆ¢<ÚTä'÷O Yï4`c•ù§[rü°ªè­<¼&_ÐBñ*e¢ëoDOoï3oN ,O¾R–4âÖ_S1èšÕ\ã¢I.~0ƒ_DÕãz¡Qb¬ˆ˜¡Ø'€£Wv“ÞWäñáj„r8»X8Êæô[¨Ó€œÏ°‹úŒôƒ a­&ˆñ¤þf¥o•ZxãùO2ä§’¾: Æ%TßC´£#®z“—’¥åN†Íæ “µ£ÆòêŒúÇüŠ ˜qÑ!:ÿ…T¢Ýa H\ ýÙ¢î‚}üWÅ€¯ÖÀ±#P e±ËoýÑl³‡"á§‚Žº|"~W«B† *µôÜGµvXý!"È×*ª(ùK¥:ß:u3ÈŽß xq©­nÛËLŒÇ!Ö ªwÝ×HÍL9ÅíRz‰K^òúEY“PETHF®z«/¡!M:(˺ûŒêUÙ­ïh¡b)yü$—ùq¨‹Õßž}a4ó“1¾[Œg¤Ç”Ñ ýÚ1 ±k¬]s%ooû͈K¨üË¥ì¤Ñ›Äîr^ξá“ߣ÷@Ùdxúë>g²HN´0Öï¥ØoÛ«ˆ"æ;/ Êä·#‚ßšoÚã°f$àÞuUˆÑb'X®¶!„MêCfâQ½¬1Bc¶Ÿ6%öCέµ¿³6Øg2¥ºÓ‘…×@bŸ$^µ»ï£U-UÏD½U^{ýIrR7sŒ ”½ßÅ%.sOó¼Û‰Vˆé(-¼Z­{Kz“º}íiýsj9è¶“o ÛQ(«ë`G²‰ Ét¼k¦ úCÓ­KçTqý«æ|eG8þ*pLjY .RÛ¯c{%ùô^Zn3¡¾Çs”w’‹j«°„ñBü)ªœQš•`«EÍd=1n6 )ù)hrë0#ÀQYe<÷ ºhsq¹Úk¾Ù}`ç®ËhȺ·—ÉñË ÞgsúgY Ÿ¢„A5—§ìšl„¿Ù˜HDõxs$2‹‰}¦ïcq¶ÚÛ TØ]X>8Ln»P¢Î»íeïË ¥dÃyE7hl'ÇÊзC;Ô{}%ö¾*¬ÒæÃMœm/¥4©¾u!ýÇœè_ftÏ6Ó^¯Û_<Í9°Dõº×!k™¨Ù÷UWqé†i…E£Ü¦‚3%)÷]c,4_ÑMÁâBÜ#æÄAQÆ©ˆÍx˜±©Ì%¬Pȯ?\±éÌdMŸ1㌞ýÉæÛŽJÃý|ÇÆbB3ùf¸èÐѯ=˹[VËMDy~`"~W0¦j"é÷½¸e)~¬ºØ5eü¾ÑÞ¼’Þ):ÑW“¶ÃûWÎ=DBÆIËF©÷S—½ƒfÆfDšBŽï<‘0¢ *‹Ê£ýå:¥äÈ4Ï·<^á†9JúRk7•¹œD¹Â‰¨*Õ°[Úb>!Ce÷G»;}ëá‚Hžµ¾hqÐGÊuò3Á ´¡ÕÓžÛø…yWí4ßÃ7×¶!Ò{’@¼Æ$»<<ÄL÷Cèhú&_&53/³S§ÖökZFvyN[>Ÿ÷éÐ q‚;öÍ÷F“¨ÔgiO¶´àp¬µÍ šrfë<ëjÓÏ鎗Œ¸“z?:ãUœÆ@kǘ 6=Â>æ_ï‡Gücju!{n;`­é¸$ã`‰¥]3±:;pFœ®õ¡ñq+£“@q;«žé¸d¯« þ¤‹aÔí›ÑNûu Þ"Ì«‰†Ìk¼N´Ã1¸ÍŸEÖÇC+ãÄ©—î_ôÙž¡»³ô§[2Žn„TÈ/Ž6`³À-S~{‹Å‡tL#MX§#‹Ü%%0O4¼ºìêô ¹ÞÌÆ¡¾Þ{mã”þî@$vJ‰þ}§²=ìãÜ築Â9½tÖ˜¥›2ZÕá´Úô°æºhSÉý‚ã®ÐäÊ! Grg·¬*bÉÛ(§zËç¿äqA͘‡,OD\5¸ckšO½ÔoD `´ßhqÓZ&e‹ÌØ+Ëj!Ú­|e|áW‰»N­ Æ®MøÁ UmEKòÂ:µ ãmøXЉ#t¯ä¬8c1r¾ÊÅ–3×þP\½áåÌ/a­¡¹‹Kû}ûö´B êŽ:αíñÜÜ2(KhHº$Máß ³zry2ÒUE†$|£õãÝüþÒL¯{ó§p•ýá]Çu¹‡¹“°{È9ÑÝSGYÐ’Ï$¹ç&{Y¡-{éÎW¿vý%'+ÁÞG|\…ë½÷¢kÛ70Þ<ïy¸‚º²ÄâGý:µ_ï~Y!š›ˆœžS—_AÖm̉ŽAEÅ–æR®¼^¤{<§l±„›øð0|údlK8ü\«öC×é~<æàý2–»C|W™Øhçwrr|¦7úƒÂZ6úkÊÜrcÒ-å³T3{ðï4AWõ^}«íQx)±¯.N¸Wj¢äîCk±û½F_šüí@&úoa~ôä;d` ã륷@e?¯´Öýœ1YXš •E¨Âƒ¢Sð­}’ ?š¦ÇèQŸ¶êë¾ Ý$ë¾ >ñ+/6È­¤0¯êÂd31ç…cwî.eƒwcxwµÜÄ™¸waruDúbÁ;u²Å4C!ôÔß8¸û^EÐè©¿§òÈzÇ [~¥‹ÞF@&q1Ê^Âû);Rp7lg_Ò²¢-'Å,4œê öSdGË=ïBuãŸAD÷eÊIPrמèìÆ| |‰&#‹6LT¤ùo/ò´¨ÕWÊtSwxö÷mbXWÆŸ¼Ã¦aв%‚E¼,.QY žÚËb¥wš®CFTfß“üiie䙆“×r߬:qtkic$È$ySQQ2¦"‚ÂÃ=’¢:´èËC¬´]Ò"kü²‹àr:€¸¡~@÷o’F¦Cfð—?ªá‹«‹ ÇÙW³Ýq–I% òýjfB‚:•íå¢Ô«œešæLV‚Fxª¸™ïÒ§2çŽAUS´ÜPÎvÜß“F;‡(ÆŠóqC~1¶QН÷á.JEAX½~ج”²K}£Žýlž$„cšm÷µs~/B‰2¸1ÇÌá.#£Ã—=f>SDSêèÔÏqÊöà 1 G9Jó½t‚ùT¿ÀñÁc={DD³yPLd!@Ç^í¹Ä(§|P<9eÃ(5­ªDŽ÷­¶|×]ÉŒ3ÛÆ« §ý·†ž¨óJ“@å\çÙÆ0`¤Äýéý÷Ù¹š­™¯½‡4 ÄZGþI Ö`ïLã«8T¶˜a ;¤g¾!­½v‰m½ âv¯Ðw)CÒh^¹ŽŒ’1ß·÷^lÍû׈¶ûlwPů‡ÈQ…ê¢_¢ ôÜ Ûjò\‚ïX¬T+KÝ›{î‡}§«q£ÛÖƒKü‘‚jšà%Wåï¦4lßä‡HbãOç¸ÿøVk'Ï~2ñbr^wOF¿}C¡ ªHãøj'åÙ ‘Xñ 7CošÁ̱ÀÒ_7c&ÝeÕÛ3»ÆåííäÎ3-ýäÇ+ñUpÕ…Ó+ã¸Ø¼øçpýÑ1ó›d¡/®3‡@µoØÍÂèðìSeý]¢ý馜؎$AÏÌå–NˆW—†•æ9‚cs‘?6̉^TL¡|œ”n;kjè¨xâ?TØn* ͹1›|ÁùɈóyƒ2HwÕãÌ8ÅßÓÒŒk9üª€1Ãea#½V2¥"3Nî×{„‚Q@Ü {„úì' ¼Ý)T«ÏóÔóK‰#G ?1sk Tú ²H¼òcßJ¨Í²Ù(c÷•PC^ô„¼xËÙ Ïu®ý¤œ*ݧ¼c–•ôK‚ÇkÑÛ;L¢¥øÐ¤tL½‹ö|ܾ†"3ËÎm3üœ÷@f‹DµþÜ¿þk½©óÓ†Bqô*²=Õá†dG6gaÁ/$ôÙ`hl˜ÓNØX#ñ”ŠÞüå}§]›¾9±Úµh)¦iíÀ’”õ‹V¤’é ¨A£a¯ÙVuW#ó°Ž®Ø/¬¯X¸ëN•€R)ÍÃ_–†0‹sL‡$&ùâߨ<Þ$éo¤&˜¤¶›YL W¸ú]ìz¥­‡Éucµ>àWœjt¯8Γ”Ý°È•™,”Jß“EïX—ȨŸV™pla L Oåìk–?zÚRâeîúenF±M (@c ”îË!'íDsÁa(Bª&mSŠñã¦ìc°És„ÝkøxZ׫¥NTAݦԽÉW/Ü¢ûŸ”}΂{ÓMOG¡·èLÉ{¥™ÇÌø<(«K„ð]êW†ƒˆ±ÈµNÊ0÷ÕJö=ÏküµôEX;­Ú °ö¿,œ|Ø+6F”w*-ð¸o>¢—JçÔ»k ÷o;ñèHJ~¨Dì¸St595žB× GC<9x¿§{Å©LMç¼uéÖún SâL6XŒ§R¯sLmX´ëcÉ®$D„&ƒ¯` ¡¼›Èç»Hvƒ_0G|¼áóá.=Š‘qŒðíS$sÁÝ} µÐ,6Q’ùdRuÒüÊÉÔ³+gmœÏŒe9^«»4Æ02øªº!EGA„–9W˜9ØÚŠöÚz’6Ên.°M3ÔEùø9åK”_\å=¾’I=¹–ÌêÆ'ïqzëWÑy×L"““ŠRö‰Ë˜*HÅð=Óîö#Õº‘Ý–ÏQÅ%ÏŒ­šcÖ»û5‘ë»`bZ¾y¥cZ© [y–<²»rk×\ÕV•$èÇ㓉[MÍýû á.zt¾1áˆÛìwiŒâ›šÛ_ð¥‰êÜoÄ.‡t„†ôôìûj2 g ÷à+9€½Œ4«‹íÐrs÷6–:´ ¯?Ÿ˜»¶‰Ú%$K˜1Ê›‰~êöÏJ˜°£Ë<Ù„wŠ i9ÁU?Wú.êØy (y—¡à>W¬ÊÂ1¡'Ð=ü`Lä+båJÜ|Þ¶§áµE‘Tô/þñi¦¤~rÊÁm×d.]i8í°ÝÝ2´Oyák¥P²ã½We«K§¯Ú‰à&¸¦”mhá¾ì‚nn£¾ÁL>— aáë?Y«»¾_Pyo“‚Y´å’e•"&¢ç%Cr(2ç4!cÔþÚ ù !ž·(ö×õMïQß”tÚbúO¶´@ÊxkÔ!-ôûFrý]-_wÛ%£í~·Ò{6w7<{æÏ­µ‰Ý2[‚B|è¸{¿|’ôí³v‰6óâ %èpŸŸÍlïÂÊZ„>d?ÄU~׿ê=<ø8`£sœî÷‰ÏÓG}Ö`Õ”ï&‰8Õ{vý©"åÕú…ù;÷9TãvLþ¥&®ëEË_wí‰âK¡}&ë töQߎtÌË,’fü8Ø6 Þ­õaªe¿ã-/¿=Ãe¹ü0ô ËÃ÷ ÊÔò[d¤ÕL<ÃÓÏ?³Ù>»NÀ­Wz¢d!L§‘Èf’5õuÅÕóê¹]ã4Ùdͱæ_ ‚¶ã€Ë%Ív9?×$id¹‡7Ñv£°:QrŠV×ñS\a!´TÖ.›6_¥íâcNSáŸN%‡x$ ™K¡om6Γ¨*¾Pö³2‘ÊÎCg¨(C˿ԽY©b *ˆ}‹ëÖ'Èr•¶¬ÎÀ4[sSjCUY»KUYö ¿Ëw‡Ê}KÌP«4øÍòvìDœÆ5T‘‰¬Ï¼ðSÜ ^´Ýœ 4qÜPàØ¥.C•Öˆ]µüBd´%Î1þ³cÕ×þ„Bí‹'ÌSÛv š8ÜÄŒ1hO¢2ªáKì&Ó–Qôç°ñ~#{¢ãÈçø‡¼£08Œô 8‹ †Ž^(ú³¼xãÄ|³B/Ú°Oq¼ñ>žŸ/2IÉl?²6)M•Ez ñGÆåpŒ?ü,ÚÚˆe¹ØL$•‡bžUš ^k{+øöÔò«ÁK8Æ¥9wùWh¤xûº¨"§¢ªd¸{׋&¯Aë4—O(VA»ïÌúJkC†U(Ú$¡Þcøå¸$(‰­êya|ZÜ€e„ÈVuÛÄDòI>ñ”¨"ßKJ’þL$Q+OàdrþÊ~­³'á"·ôí»Î›¼…¸8Þ™ûï“5íŠD“>GªèNt@v Œd‡Ü!p ‰Ö??º&Õ“vìƒÊƒuÕ2»&GL+üŠ>µœx$Š/“7ý¹ßP¯¤ÉÔ­Eô™µÛ²8s–`eÏ-æc:–ó¸þ¼†ì“¡Å7Ü#¼I6oAæ(Cμ …Ö9¡òŘ'ÛlH3ô‘ÓpoyxO×¾Ðc½:W)‚à†P´I¶ïl¦mºzxÜŸ<,2øT;ï@òz™J÷tŸô­Õ6TD6ûª8 Ù?ñûרPgÿ« @e ÝLwɬ£Š‘<ŽŒC–nCHvÑ"YiÖ®ivÀCDëùã,Ü.Ò«šèL•Gñ…ÁœµÇZúAh(tÂø¡·¿Êÿ3ÌðiÞ;õP£aÈ¡j'8xìý¬5ôO<¾w»ž ºü¯­‹U–/î¸i‰¿•ÑudmZJpEa=<¾[®Ðã—ßp/Ćxäùïz”+ƒ¨{©ü(ˆåðPƀǬz‚ÅZ²EÍ"ì—Zh™•ͱ²Ëz}ú(Uõ‘¹›Ô·™SÖx¤$— †¯[ÂÿÎ%nZ¢'‹ìG»æƒc;ê!å°1D1F»äÈ'hÒ„XS6ž” ôp7PçO7Ä?–r²\ªÄMÍɈ;¾<Æe+£1ñ&šl¸ ÎÞçg¿ ã†wÍûÙ[•ò_²4Z›°ø+¶¯sºÌ2Ê6ÜCûJSjäˆ_BÝÏnÿYÇ\õ•㓉gª2« ÝøÒl7Îèõ«Œ¹'ÚpnÖ9£®'ü‡ÆÙu•ÕÐÔÔ ÑÎêSgbGµaØÙ mùÖ]c „!(R–~¥}’–íª— ÕÕÈùêw¿i²nH°Í0xƒy­§þº5ȺM/=9‹¸rÇìE®ö´¼ªšÛ÷ ÈÍ{±~Ôµ¯å‹Ï·ÿ´´|+<,r˜öõ$9JudœÆºëÙYtûi—±nâH)ëÆyçXtËÆÕ›×R$õ]ܹ¿%EîöͦDaÒý´;b«o¾¡g-GÓì1XÝe“öDwÑÝZ±Ò‚¯Ëæ‚‚¼XÜ7¶Ó©¤h¢FnRòsPÆ×–æZz(êe!ȇú ›F_¦£*×¼TŬÁBìÿ˜%DG„ëvÆŸ“ÙŸŸ¦3æ£iêà®öóem>SË~ÍP°õÇjp·sSžÃ:¹”@Ò¯oKØ…ÅC óyæWÿbïÿ)§¥‡!ÊfºLp_3ÀÅö“ÆË˜êÕP1Ñæ&“$—ˆ4“™¬ëǽ%,,Ì¿êH(>­‹vÔÌ47¡¿7“=,#Ø+øªè$é–®¡(“›V?×úmš©Ešþƒ+2HäM–¿SÄ•KªÕÚd>%¸‡ñÏJa€èî ¾qß%Frm;Ö©d:” K/§:ë=fC€9æÌî6KŽp¢&ñ«göòÓvゲ`K‹O Ù)³¥Ø"ù:}'§z¬3Ζ ¯­à²0t°–õÙÃëéG\†T½n”,—òlF©ã1¤á[Ô¥»EØ`ú…42Tiœ†9$ò‡åŠS:zõɧ£t‚™²Öð†È׈«tκ2 O-QÙäxò™|LH?`ïÏrŠK§=íÇ–lãå6tâ‘ÏHËþN„«³ÝòÁkÕug£aî0ä¤É̼Ó}¸Þ¶O2 !]'¡ôÊ·~$Ü \s1™Z %ˆ§ä¤ÂfÜ]ÓvFMÅÁ˜º aj¶"Ŷ)”¯gÿ¹Ê¶AùØ”TÇø}î1ç\›8›©àæå{W]AÙr™U÷MÈ8®ž…!œ’§€6ÙüÓ6Ä[À.„bÊœÛ|Õ5¸QŒA#ýB¥‰&L¶‡ŠcÛR‡5Ë欬ŠCœ€Ï} `bÑâÌÀÅßâ§LCWºo:ÆmÞºé¢÷‚¬4Þ.O4ÖÛ:ŒeÚo£ˆuŠt"–ñøF]5½á…° \¦À~˜^³'ÊØ½Ü½Âý¾x~0ØÜË–¥Tjqù[Aì?,öÐÉdËžëG}”HhâiÅdtsÖ‚“N(jÅéÂâ±Ny6¶IÒ啼-nDÌiÇ:ÞEö‰è·¾2÷ˆˆ?—¬#º·´ºgLj{¡ ÍSÏtÆŒpmn“Wžœß–³îO“`8~%\$õzËà¸ñŒÃ†y}*?7Vª¿@áà/qIZ.B×éFCÑ»œdýÛŠ7¯°–L«ævd÷ -ŸÀ)L„:þ¢`«òÔ(ËT²/<Èñ½17Þ,‘c9QxŸvEAéEgÓóˆñ¯ßà!êÍ&È €%f,ü~Ù¾3µ­È@KÝ-vºö` Ǽæì°‹1×áª2‡]»[3:æq3íà y'a$ܤéé@WÓ2k!¨ïàÑоÔ.¾{/ÿL3¹´Ãº¹DÆu9”híƒe€Î> h¾™ÓŠà©Hß!¥ýx 'ÇÀt~$;U{²õW†z|Z\çPá­°¾$sVL ÙùU !øsu®¼äðClßTƒ¥q„ÁËQ2Áü Œ”ÞêÙ¤tÕÁ%m\œöPö*Qùú“Ök¹%ˆÁï Åß\YÁ’+é€ò(ŽTÄë9CßãòI]Ñô{–*²83„èŠØonóM¹ûlM‰pz: 5ùÒþør¹FØpè½4Åvdeý%ø'½Ô CD‚Í#`ñ™·4kà 0v+£éíí¡ëGŽ¥v3i‰å­Å-–uÒOxqí¤ÖS ¢ÆR  w©°€Ô¢7[ý>ܳü^b)HR06câÖT0Ùa8o< ë ´¬üA“ ªÇKY#Þ“Åù¨P™ƒð†U} /àß®eKòWãI)dXG¦çƒz’D¶rjƇþ,L“üuô!Á /y¥°. ;!Æ\ÈjŠ@©å/–£53€4¿|)§IÙ;×å­Ëƒþ¥~NÔÜ1*žeóÌÊð“$»q Jq]xÇ“€ŠWá€Ó–±÷} P«Û™ï¦çô °õÏ D‘݉ïRõB^Z¢ÆÛÝÓöw‹J¢dó~’ɯý1øa·Ä1«2ûÚ[Ù…~÷BFÑWr!¥K}7ÏW¼yDßÚo§Ú>S@È=¢øÔù<’ø;Ä׉!>iÄk‡›³Õy’E/&€&aR"8*úö½Ÿ˜ª‰Múã”ÀÐûV:}¼¹™dxQ@ºÒj«aÔF ÞÀ‹/1Dc°2x¼4;g[Ä}VR8ovóüq"Y™{”m5˜•¸âü‚9¸S+ˆw¿?TRˆ'nüÙ¢÷¦ä ü”ã5ß»HMGÕ ñ&ùF”¥"¹÷§gÊ.VP¯Ü2îA©ÙõƸhaöÐ` râ»0 Ÿ\êoô(ÚÇ'0·,ù7$݆LùÒ9òPFźâÂÑzæé6ò&`÷`‡^BÙMÂ)eM·= Îå+î¶ö¹#—U  $’,øýp wJ…~— 6*èS(Ÿ^ŒXÊäåútéêÐdÔÁ]ÖÑ™ …Mó‹ôWJ¬âå;š¾H.weƒ·¾ž|E/—}>Ö {B•w|í¡U_3 A,VjÔfí¿Å@Uu¹z<‘@{ͨ —HoÄ7 Qå¦S“—<Ͱ·1îéúpßo³¿Éwuž%ÎÕ_^Ë÷µ7wH8ÞÁuŸ¶^Þçÿ¬…P ¢ëmЈM¯.#ª5Tù“aüîÿ#;J@ Y*(î{Wî{*5Üz‚0W¨}•Ïvå• C‘rQsÙ} AU¢bV¬}Ÿ| ž(Â_OÎʺ0JWÁâPqЭ-|Çó4”d&a'1gÄ(—ö¸a÷åB!È䜰}îGZKn”à‰ ø™™Ü Íð’àµIÛO\=…iJç/Æ_Ç" øH¢lϤ~\ijÒÓÞ<\c{«ÂfœIW®¬aƒ:-©›roûÈÈà‡ùËžl9ÉQÕ}ÆšÆqXÆÚ`B¼šS4†–ÛŠ?™ÛÝ+òjª%£s Þñã÷Æ-¾öîÀŒC;ÉɘV¹Ãâ>Ê|C¥H¤ä«T2´Î¸VîÔ“(¸Dæi!–n)£äE"9k‚a%^üK…#Åo@ö‰PßN’ï™–kúyâñ…èyâ â •Å÷…jáÏD ¬b,%0RÃZçB†…Øå¶û¬Åñ4×¹;džùªZÖ`{JsxrŒ’[™èµ©·¤n¦LH"¡Õø±` ×”úGƒñ›voßæW¶8L3Çäen:]o $l§ÿVSüzULi2Fú#߈e¯‘ ƒÔ·rþ7®xEËlI*3%}mê µ—°6¿³uõÜÏ1ÜJnàζ…¡{žî޲ ¦iÙ¥àO5#/¾ ¸›Özµ}!püÎuàw¾;cØ—"„ÉfKš>‹¢£i]'ÜéÀ¼¾íú‹ÐXΓÚsC¯iÍ] ³r0 ±Ô§= P¡T’(UG‰õ5„É0_Y¢ùµŠã€U2”•ÜĽ`€ñ”«D×h)ß<ÆÐÚ#d$J^ñN³­GÅÅâ´qO—*;„{@@H|ð7ÉÌv°O +ƒlKi)W¿«·eðå(kæ?þñÉ4¥•[»û£í endstream endobj 2591 0 obj << /Length1 1411 /Length2 6020 /Length3 0 /Length 6964 /Filter /FlateDecode >> stream xÚTuX”Ý·DБNéI©º¥¥S:Ça€!f`hF@Z¤»AR@D¤‘.éPº¤[îèW¿ïwï÷™çyç={¯½÷Yç¬õ²1ëèóÊÙ Ô‘w^0H¨ )o¬¯A A>HÀÆöîîû'`3„¡ÜàH„Ä`P0ˆ;&¦qÇ@5‘ š‡,‹H€E%@  $þ‰’*B<á6@M> s°) ]|Pp;{w̤¿^œP. X\\”çw9PΆ‚C! &ÄÝ挙…8õ‘P8ÌÝç_-8¥ìÝÝ]$øù½¼¼ø În|H” Ð înÔƒ¹ÁPž0à/Ú@-ˆ3ìor|6à#{¸Û)}¤­»bNp( á†)ò@ØÀP@Ì| ¾ªPÛ†ø¬ñ€øçñÁ|à¿ÛýYý«ñ»…"] 8Âh w‚µ•5øÜ½Ýy€„Í/ ÄÉ ‰©‡xBàNÇÀïÍC€Êrº@†ãŸ Ý (¸‹»ŸÜéKþ_m0­„°Q@:;Ãîn€_ûS„£`PÌÉûðÿ}ÅŽ¤ýÏÚް±ýEÅÆÃ…ßwõ€©*þ‰Â„ÿÄì`î@a$* Â\0o¨=ÿ¯!|\`¿“à_a ?´ Òh‹¡óƒÛÂ0´ÄtGyÀüÐÿ™ø÷ màPwàc˜ø§;& ³ýcQ î 4aD‚~ýþ~³Àè̉pòùþû¢ùM䌩qÿMúï´¼<Òˆæò ƒ€`Q1 (æÅïßþ>ƒ¿øÿŽê@àîï?:ª"l‘@ñ?h`Îï/*žêƒóOûpÿ=A ‰Ñ5 Èù ÌA (æþ›áwÉÿå_]þ6øï=){89ýFpþù_ˆ3ÜÉçO FÙî—h"1^Aü7Ôö‡¹å‘N6ÿSu‡`¼"‡°ÃèWœOHä0ÜMî ³Ñ»CíÿÓ_·àGÀtnð_ /ú¯ÆPGÌGÆ sg¿S0ŒÁþ=V EÚür¢€°‚BA| `VÂ@4cY˜÷o•ùùHwL CÐh‹D~Ý,F*üZ¿B€µ…z Pþfæ_ëßn‡Á¼aPÀÔ8*âPÒpZ)GçÅ»2 Døyÿùá-£e%Ï5Ý ©³ÁüÈI¹æÑÕȳy²-××ï©@Ž–sOÒ#%¨¦jnÚ>^ây2D&}¾å¦á!°ªÞÔdj-ˆ°±£Ú­Óëò:”á¢æqÝ[ËÚx(Å^WqRn¿‹ÏQûg :ÿ®˜˜ NÈ'¹¬OòUr#£ª¬nû²Û‰ Êg齋Ÿ§Kx°á ét››„.ê‡Y›2ië­"´êÖCÀ¶åV¥»qœA‡ !œÝút‡´C ãp S™èUzÁ†‚WÛè§é=Øãñg²ÒqüÁF¸õÛ̹E²¾]åÑ»½GÕ( iy:6óŸX©|°XÙ×’(%‘ý¼Âqñµ·Wå•2µßAatˆa:â£Íì{_®æèPÿ,}*ö颸ì¿™Ûwgv¤à{zDØ£†E¸j겫ˆd”º£¹¾ñv¯Y™åQ0q•?Ï é"‰l~!=÷ž–؇wª…ÒÛ̲L\t!DÎÛŠÏzAÛô]釶Ó8û:á­BJÀë=G«½è;*âR&Ë×#qþÌýrJ>tlç]Ì?§Vfwºê ³üðE•rŸ¿[ªØ4¨œªôÛmù2›N:"€UoZë;qûn¼g=ðµjþ„Õ©å$ Tõ¦ˆ=Ê8S&%7£Ñ( îÝA;GWPJËŽ®ùü=V©^Pä»Íy2éǾ1v·;EÑÎnnŸØ î[3»ß3ëà1£ƒtg½TNÜ#¹!P5Ç1•–«8ž©²‰O¶Æ˜\OñÒ1iëtÆ ¾“oܨõF±É¹©ettâH[îÜ1|jeâÎdöküÎás±ù5ƒ)õ3ß®ñÅ¢mYSwHHlÓB£øNƒq›î ØIð‡ºŒI­NÅ(æ (æ ­ýИUÙü‘ä~ÝÛW¦"LžÝb8"í·ÃS†¸í’~DÇ2sP ªÔ³ ÷Ö‰_/PÑ—rïa•ݧLÑáÌ äÖ øšê^`Û%–)i:<¾^M$܈ÝèúÁÜä;YTw UvÑ{SÅóºË:Å<Ùo®Ë d›ö„¢’:xݺÔa“ešþŸ’>eÌ…Ñî¾e–®…u¬kz©Uç$ÞŸÂðC®ù-'Ó›E¥[Ðf&ާžj¢©£ô6ºë³È­Ô)Z¿§Qöýð?T.àÓû#Áå»;¦‡:¸³ ˆ‡Ñðþ'UÙ6ÍÜÓX·ƒQ“ÔüQum<º’]ë­µvøú{=æcT43ûT5RÂÐñ»öMÏß}9I a¦#È5É­£ï=ßð§Sz¾‹3Þ8n}'éË4$aâÕG†EOkó!ªçr…*^û"ƒr&G§—Í_¶)A:Q..”k+1’øoF`k4¾Óe‹ƒ"†BýfK,š›'úeí¾$æ£#ßdâ×5†X,´P‰›YBå1Bn:š¶â£¨/¥[OÁ$ôÈX+ì=Ñ9)Õ×1føgå™O«n’Ä´‹I€ãåƒýuBê®U’$Šd%˜Æi¢u"XL\ÌsL´SüØÂ‚o? Z¸*:‡•Ó¢¬£rp.uµås¾Vð寙¶ub^CâŽ{š,K=ÈÙæ‚°¯ qóÝ5ç@ÈŒ|ù>•ïLÐDâÆ[íL/vÔsñ;óÏü8rƒíh³ºOY©üw§LVá³Ý÷c  ¸Av5š÷4߯MÁäy|šëį_ÜéW&wÚI{ûÜ=‰óÛC椮 ‰¨€ˆ{Ù$%X’‚>ëåÁ»7_žÕÉÖ­ ‡äè¼À^Ò¾Î`l+íc—iWéÜÈ Š—CþIª4Ú&÷ç¹sfmá…*^4d7È|9S¬E Î.K®FÄîøPyÙ:§åùDYÖ”µ­ó—ñXÎ|LØ‘†$µ ÕÏáŒÄþ¼[86è!lÊÖ IlõÉ»óзÉíÞa}Ôï]Åv¾‹ ËZs äcl9È(ƒV„Bº¾Øž×slšX¬Ýz¯Ü<­©9ÞY¨ãT:+IE>†C1ÏݹÒ®»œÅkOÚw”É©WTÛŸä(ÁZ t•zÁ‰ª =˜Òù°Åô2>c±9Ûø¡ÙµB_[beLÐ=Xîí<œ^ƒ`:vI_RèÖ»4¤-¢vº—òCàêîþgj¶¦÷„‹žqß‘9‰€ô–’ Š&„¤/ì¹]Š ÏÏí^,‘ã±§5¼jÊ–YF1=íÁB=%‰¼N6V+jw–ÍA>‘…Ít›Ü¨˜vÞYbƒá{)´ }å’8gŠŠ2J§Ù›ØA΄&AoÃÇq ”¶ªéÇ29·ßH‘¥{¦a×]8ÏQjrz¡Chö!õK!\ƒ^©3¼7îù¸7fqÛöGOîÙ›š¥Ñ¿œc»ÏÁÜZV—œ–þs>ûÎ4g ÑR6uCü-󡱎j¯Â†FËC8IÐÞηmg\}&è[-<%6_­ÿó^”Y `b\x)P¢;órËôR #õañæg ’®–Žýž.«¹ûsÛ;Ï7ª`´U\Ä×0[Ùh æÚÜ94H÷Fƒ¨O§RVpøGìµ¾\åÖüzœKì¨êk_¢„ [Ûm+£P®d C†Ï"”O6RÙôØÞ2¹?ª'›Pà¡yŸtYõÇí÷~·„ˆZ›š®Šö^'ûÝO{Zf™¡ËUXv¡9"$ü Z™>psq§pß%c]«öÄ‹‘üØüI®pËÁä‹6Z§Lg¬|CÞ‰AË*Ñ Ýú¢Ò·©¹î½È!fŠÏ"4DÄ^%7æTôðÐLï²U¹3½·2 ÒŸv T4«âXø”rXÙ·iàw ¾áRœ“€kr6±´¯ÙðÚܶsâSÚÐï¾à Ÿg_šÆd¦ª+BãML²pcäÇ®‰1ÞM}õeïUAîzÁ\pTC’ŠtKeøÞì‡PS¾¥²gÌ´Ïh£]jð¡éÖ Ubzï/”n'Fë{fš M%ÉŽv>¶J‹/¶WR[ØÐP;ߌ}nEø–áÑr>yÈW˃…Њ'ôçÚZX Â)Õ-‡¶Xo-‰H8–iÒPsÙ._%¡wzTÏÍ¥x¬£Ê%í„Í—ŠžtõŸ/_Õ M®ˆÜ“,4N6ýhüXÑÓǼ=JÓ¾~…¨%”3« ø[øÑÆÃˆWÞ‚™Å^ñ¢ 5Æúð=ØÑ"óú–:éû]¾³öüÀ²µ9D_÷xAfLŠFA'šÃR^¾ iáΫô¯AŠÇ‰9d/óò-ÔF™'bj³²§hWj*—^W–]TÞ}ê4å¼BÚŒô” %§Êû…¦Â¬|&X>9#0Ùê=¿†øQ²r>³GÛRWñÒt=Ù( å*AïU‚WC§VâÖ³=Å?Vù2/òÜ Œóí®àRæC€¿KåÒænÑù¥»Ý+uuŽþ¹J:z°3ÇÍO3-o.¥_>ÓqgS¹ui–  MZZ†Áý¤ÍŸœ‡‘ªõ_7Nî©ïÇ–’ŽEÇ£»¬p5È7wçÌò› °e¬n¶E­ÁÈÀïÎ2’S¹¤–[G˜ÌnjѺ™qûuð—dÞ›vW5ò±-P´OºõÍcÿ}té¼ ÕÿŽž'õ ã%ÃpaAæÁò•EÄ‘anǦçá™öi¦LƒaÕƒ¤!X¤·n Úé4¥;Ý4½;.æZ˜Þ>Ï `\5Lb©¿pB–Eü ©Fj¶@‚ ä9ÜcmÁö^ôRÕ»ƒa¹ÑB|2ÔÅ/¤ê}Bf_©“6Ü}p›7þ1‡V ý1ú¢¿yƒòªo|ïýäüºñˆƒCØýZû š‡Ÿm{+¡Ð]£äË eMäì1=˜ÿUîpŠ&xÅÿ²“À°Y§5î„,G"’;€fæ’¿4N‹†v¢ÒµV&IÀbßøª“˜{ˆ:§Ûè¬Ç ·sòZL nÜŒ5Û‹3éòºªkÜ”‘Œxç˜ì=`^›&$Õ¸…<úçìÕ—~ubmrSq‹å‡$Ïj3Ñ•ôµŠÐ@ÄžHÜÊe ›Âv½z¢É†÷ìTe˺’Œ¯t óÉÒ³¦zš"&üòbd=€±rš×Ñ’ÿÝܺ”[zKõ̓wÄAR¾tEmÝPe FÛÒ²q;ÓÎ>×Cmø¸¯[À3–K`å²k†rhûá¤ì—›Ë.ëvöCk)WÑÖµg+s/²y.ì­m?ùÕdgN Amhå •ù›ÕRöØöÅD†/~¼}×À–@q;5ÛR Œc“ ×a{ÒGûQbÖ©Tïëk˃8]J¡¯¶é>„Æeèg_˜¼‡zøh}ˆÇ ~D͆ò)nvç=訓Á.êÞ¢Lbðš¥þáp3â±ÏÌ‘˜€ö!wñ’_ç0ñ±—ÄûœÖ7×Û2³í]µêe¡t*!º‚8Š +·iªîÚ2jsR³UÄ_‡|ðÀ yÖÍ®Lʯcóû„¢/ufº-š&jœN´¤w~ºÄVò±nHÝQé[°Œo5²jSÖ4të.×Oí=óÎMÀvÇ„®iqE¥+óî3d˜ ±äæoW}ÐJ”lÓ)ÿ×±õî7ëxÄeÄx}Áñâ›få%®—ˇ¹u1¢Ìy(B½¦9>2é^¦1tno˜kHo¿ü°0PÈ6Õ÷ÂNŠ÷ëLºÓI ¡—aõL¼š×D÷e—ÎéMQ*|ä.®O”M³O¬Y¸ý×w^˜¡ºß'?èOO=*Ÿ—ð¤é\‚ÎIËÒ)Τ|s–ŽÉÒÞ{Y0¸“ÿÝôÕD’#¿«¸´Ø¾hF…®§Ö› Ü/án ëM€Ú¬{òÝßD/§È̶yˆHsR¶)ôŸR›)ÑoQQ¿öU0ü$ Spe$|.2àI—FšöVåµb£{­Mú˜šWÉšžºýh@tAŽ_·jB+LdþÁ™¡’¨FùÜa—1MÖn8@É5M°giÚi°• ‘xìpwVæ"áD jõ6©YdèþöаB°ëµ¿ÕE¥èp©ó!e ¦|+y;\pÞ3;Y#Ê\/ûŸÞvì{ŽÁ©ÂÇç*Ñ“wsJšƒ,tõRž`=.;ìãþ˜â.Aëw®Þ,µ}o+zÜâêäóÈ<,ü©á±5ß™H3­Çø«qPW3P¾Ð±öá~|ˆ¥þ›©…Ø£–ú·ì‹Ôd®$7Ã~/ülÔë\÷¾.Û&VWFy+€•ý]Vð²3ß!>ŸÃUÜç“ôâ •¹·‡GÝôëR„ؼ8yÂt—ÜzöN•ruZo"a ÝÞüêÞ¥¬x¡æ¦ŸÎ 2?¹X6ZWFŽ®92U³²çx! L2Öwãç%šÚGls<(µ‹Î ËbÂŽ4p½I¶ ¸3 žB£p:éG°Ri€ÈLÕ7ˆ|£Ö.ÚJUL׳ÔzãÇ£Tغ¶uû˜qKEøutHémü¨_ÿð‘ú³¸ôJøJê‘W ×+dZèL¸RÑKýì­FË<9uÁ[ÅË„[³×·ï¼ì ®˜Z…ø~ãï}NsçÌo®º…Uby’pŽÎeÖH‡n«åvoF´œ‰Æµ8]\¿5# üº6}zióäá=¯ÍÆ/¡®5ܹ¡?ÍçãŽ.=žlå»êu÷FŠò2ŒOCùL¢Þ¯(àðŒ ÌFã¦ËžW× ¸}ÝjɼÎR^Üæ@–}_÷Vö~b«7àÙ­m)ØÚ¥ã̹ªÂÙÚ7¨œ[^¸]{ª^S\ì~|çƒMÊ#DZâ¼à%¬;fäó—/¡îæ>;çÁnŸ† Å û¾>|åÆÂž¨ìË6] Ù–Уn±¯Ã|] ËNr4L?DHfÕ‚ÒR¼Ìx¢¾ÆOyemxä·Ô'§Œç}“ÅB½è¼³ÛÚÖõþF(鮫§>ò Ö#ù½É'´«—¼„áŸîh3½”Ò-8£>vXP}¨×ÜXÚq®¡¿§Ý¢§ã:¼ËÖµËUV“"¨X›0C¯Ð¨Ã[½ÿ¡K]3åÓ›;#6>SN‘›gž‹ù&§RããGÐGs«‰XƒÓie”Eb÷F Öc"8m.û O¹+ä üà #ØUtkÜ®†Iš¡¯x¥¾w0¬“êei­«òür?5š6ŽZgaÑ+ vc¥µ¨ÌØ]ê= ¦ìø¥N¼: [‡úÄòÔô›T~»øx?ÚN …Ò=éñ4ûï>äzKûŠ‚õ¦ÅH»¢y.Ö¦S[æ&„»¹ógœ¥Y×Þ £à©X}³YYûhÉk5~GVÊ÷ÛËø¡YχèTëé”ù럺F©?¢»Œú9¯ÔOP$qˆëó²$ÞØ1§ò‡ÉeXérCø.ç£s¥š¸ó£DÏaßÓ@éèš«Ëÿ’¨½ endstream endobj 2593 0 obj << /Length1 1420 /Length2 5888 /Length3 0 /Length 6851 /Filter /FlateDecode >> stream xÚwT“ÛÒ6Ò "U¤JDàPšHï½WB ”$$¡…"HoJïMºÒ{¥ ˆR•R¤¨(½|±œ{ï¹ÿ¿Ö÷­¬•ì=óÌÌ~ö<ó®7¼×ŒL…•a(;¸ ‰‹€d€ªúúÚ`ļ¼fœ üo;€×ŽÁ"PH™ÿ@¨bàÁ¦Á€ú($PÇÝ‚¥dÀ7e@  tëo #Tƒx `@}  ÇxUQho ÂÁG¨ó÷È‚oݺyãW8PÙŽA@!H >çw%T„B\€¦((ŽóþG ~9G-#*êéé)qÅŠ 0 7€žœ#ÐŽ…c<à0àOÊ@ˆ+ü5/ÐÌýí0EÙãÂìA ,¡g¿],aq¿Úûs'ŒÚ?Ï¡Ž„¢`?gRLR Á` Þ‚$;I ˜0¼0¸×/ÍEE(!Hàì´Ga?-) Eºƒ‚ý´þ‘êŽÁŠÿ¡ðßû_Ç{Á¡€É T6Ø©&¸õ°J™ÝSxeHŽl+õð¶˜ðPÁ}J\·úˆÍb¼iVæ”î3É.°Æ}§v·Ãì¹÷;>˵\uÞûÂ\k\v±çûÆ|8¸'h›ˆžX&«\•)ÆtqFÑuP)ºMyi}ÿªéüàÉÇT¢qS'¤Õ ­£ª$S™ã–Åç&¸f»>³É]–¿r>º>Zо‘bέ+×vˆ÷¬¤[èíïâ|¨ãñpåO(Ž^]¶CM‚¢Òb&ïÒœbÍt;MF¥MXwé¼@òaÁ¶ãòö¦õ5þÄŽ›Ž¶‰öÑàÏø#Nzô “J*&756ÆEÒØ«p€µèLCh½š+ÿÈ鬢ë=5Ö9¼ðÃ]7EÛêmO0ÿ ýxù³²åÏ~õ¼/b<ìC‰[þªJ¦_VbÎØð³ÊëáqÉšÙç³³’Nul5S(š¹Üp›^\œÆ‘Za~I´þS/Eá}¼ÄYÞN[› ß”[e2†!¿P;ã›^ðäx ,úºšV­Š÷t]Ü÷­ôZ´ÖëuEú•ã[]%¿,¼§’re?Ýh Žai‰à.Ÿ^ê ß»ZF #*1È-=Þ d~Óƒj%x”FoâO7‰Ótžì™ÑeY‹‘v©Þ¼njb…ÉçßZR t$\•Aƒ§&â Í‚L}>mByÌ-Ë ·èCî+oõ— •hý„§ùÑöåbk‰| ¥È­§Ÿ27wÅØÙv2å/qYµÙpÛ£l.Sá°(˜?îy8@ѰmÉÍõ…•x¹!+ãÕd{uWk'œXÀ»ÛnöŒ6x^>ª¥°§æ·÷r:+®ûNÒ¥Ö/uÕ`§»A%—ÈÛÁvmÍ™:Ï ¾¶mŽ1Åv^zÞ Ú‚Zñœ¿ÕÜ&ºé}è`Lud5m Éã#{àÇ€>Ù°Ÿ¸„œLغÙ]$ðë;kH“…vN›¸Re­ 1Þ79.É!ÒxkPàQoZ†J¨é£y¬øÛÇsoܶ‹Oÿ†h¦„P„Hب/m0’1Ìœô ƒ·„†§èG/Ð~¶¬¯ëG£2ÕN2K#HÚ¼úíßkÕ[qY›©ï¿tJ7é‹ô:¡^^fÞ¦§ÒͺH/ãoÏÄ£kvs2²´®YÌ®5ÈÂ$òòÍ i'%en,{0]‡ê>œ™¿½Lq;º’Oã ¼R`<:ïÙ­q뱓ZÇh7éÒñ…(ÂßÄɇoØ77È}sÒýñh”ǹÉeŽ×fוǚ.íÖ’pWPîÊgˆÞÀ¶™£T³·F`ŸwŒlLÈ܈GãÙS>vf/[íÉC?~É-÷‰ÐÙä ïèôßκµÔ_´p|ðµ~^A1qj¹Î,÷C꫉gúè¢ ìj¼y ºMѲÆÉñ’…ÙûäKÓ%¿àÜ0ÜêÔí¼ î›Ûn¸àûc¿†ÕáDªPiRS“ÑÛIÞWä2±ubNI†÷[ƒZèx;.>6Ïj YðQ‹Í-«|ªêŠš_ ñ–ù=AO_}òqd–Pˆdˆ¤¸ï©VôM n¼ »ÔE²AÀî ß_Pj¯W¤D_DˆËrÔªt7+sÂON®öîî]$æ.×…®¯Ú» ?^ÿ0C Ër06½8ö.˜¼Žf$çI3â€ÔdI‹Ý—aÉjdï“»£9ì><‡Zh³V‘HñÛ`ô¹#p!°€€ Ùg›¡bÖPdq_bç\~‹ó &í¹‡÷t¥ã}Á—Zº“Õ¾÷v?܉ðd¬gÓßÌ¿!Xßé!é'ò¬ðVÑ•ªn)Hký%øõt¿X©§b~ºA ¯6UÌCÏ£)¦E‹¥:ü"@ÛÎ*ñá=g._<ãçnoÈ}ÔºSÕCêåÁð‚Ñ/`YC˜'ƒ;ÃŽé=ÞYÍØÄ'[Û{iÝ© ©+Ë™zÙ€u_¢|”\â(mw¾væÜIY0ÃÖa$ÌøYu Ñ'ÙÀ*cs®`U´ÝÚ%ÙÃNU¢[ðu> +þ(@ޣأ"Å!– Qä—Ô֛݊ ú{CJ˹wÄK%9%îG Ùƒ¸gÑø ¾Jɽ‹¯GJŽêÇ?PV Ïëݱ¸ûÌî³Äíl«Aû ³‚ú˜sM@͵ÛÝz±m ‡OzãÌSªö3–€úa.ÇfZ}È‘3ïŒ.¸yOÏùlˆ2éLf$*DœkÈך Xi¶¼ÊŽoœ5¨àKbKÔ7+Õ‡ŠˆÞ"–íÖ¾°ñVŸÈSÔ`þAT—˜Äå½½”—ÛB.'•7 ÆÓ¯ú¡––h­ ïñ´]’sBå;ÕÞ(¯w N_S¼òkL_¤’Üó®@^QlɶX{¨ÓÀzõˆ\ˆ«Ý’kÅŒŸ´O­`Hyo¯-8keÏ*O¬ÏÀ,>*ÀÛúýi]‚Û³ŠC~²ö{Âw¯E³^ÍÞÔéh p`Œ÷cë9%÷ó˜±Øéù‰* I:3|f97öÌ3<»É,ù#ü:»LÒûyæ6ÌzFŠqõ½ýW T+VMõ÷Ç[ã4S I—è{Þ„¯\\ù..øÞéºeg–Ú†ôZÏö¨ïvöµFÈùþÁȦ3¶õ)½Y›˜q²Ž6OCKrç>þ,Ì®&nkŒù:V,ñþöt$·n$—JÕ~¼b>Îõ÷R?ß|ÊazƒLüX1ˆ’zgBy¬{ÞÛ…ÿá’Þ…æ·¸ç¹\$[æ± _?¯Qu°–º*2ŸÄš1ÝŠVo&.´4tžJžxM[¥µŽ^e¹Ñ"¿ÊMy_púŠNtdôj°º“™O8b<dVd¡w:"ém©ë‹ÙYJùæ;Õ€£(pR­‡XÈWà'ŧ:Ì&tü[W­jÚêÏÆÅmO=rÏÐHLùE} Ëgû"ŸïãÖÒR׫ÊkÄðYãßã‚ ‰Âr¦R8p½K׬ís»ôÕH¢œ"íMæaN¬»i;c6p:õK¦8šBs¨äç7ª‹JQQÝ’t½^zjoÚ•S#œvq¾3¡êE}É´ïñZSãO~8ˆÌ­™šÈœFÌÄ<{;ü4KÓ9ÙôñX3GYEruGÝê©0IÙiãç½KkA%øÉ+1d´ #<…*ϨõˆE#c?É4©0ï'æÞóh²g Ý¥@ÖXÛ@@ün’ozK5³DÎ|1ÿú7•šSazçÖçÍÙ=ÉÎ…‹»'Ïu¯V¸FÍ*ÍÙ(ÿµú¾ãnËhå 8•똚IyLG Úà[Å·jòÛ3 Ê§Ò®ÊøÉ½O™¤°6Yîå4òáø’6ô|ë~Êå&VUÍ¢K ïrªuÍûÊu)¾JÑu(ÏŒõÚÚ.·9ɈR_!º[û8àü̼ˆWðXŠýÞ‡•ÕÅ„©8¹þ£h4‰Sy@GϺg'.DQ2‡¨(Ðy6–Ýøc øÂ¼°{àvíNK–Sˆ_àÞ+œ–êÅVÿÑÕ4Q€Úâ ðy?•Þµt1¤LîI%{ÛÆÛSßW">)Ъ0—CУüpþb橪”©B_ßp4qLÞm:Cóù¾ÓAŠiëxÔŸÅkhŸ Ì_™+'+ÃÍ›¬ 2\x@¼^Î×NUÓdn­²~îçì¯7¬ôéKÙ+šMù®û¥Ž6œ+3šTÒv£q‡JØûW½4ÏEâB)i7Y BÓïF}uª\Ò`2›i}Gsƒ²Äf2]uŒµO¬Ë/øpÏ5ê FU ­>  \' x©¾f·uCµÂm§“/ôô6ã¦v~FÏX*)æÅ½é†W_Ÿ<1£l=â[0°+hÅÏoÇ**3íÇU‡.“W?h¶$ÛG‡Ží8“ç õ)çrÑñOZë/³¾§§¥¢cÚŸ‰½X>»”ùqJ)äZrƒÿ²ÕèuiÙ‹žl×ï`I9sîoTÉ;¨~Ë‹« œU½©éð¨9õè5» 푊ü-ž=Šï½›,<‚Rq{Ç}ŽÚ½kAT\ð2ÙµK#–Ý"%0ÿÍ3zêâQÁœx¹¡0Æ QiñÌíbÜ`Seib9Ýú“CÁOoëù‰{™3X17ׯgŠÙ" uŽ÷e}ööÌš%Ò…vä¼z\l·5F·@Þæ¼¹Ð[ðz©í¨.ßT^hošÅwøÑ´|Õ~xò%Cl–µâ:MaiÚÙF·UU `<ê~êÝlnè¼@Kx#©ï`/}ØìÛzÛh,×âE7ÿ:~nxÃÕÇãÅ£Nœ`Îà÷t(‘ZZõ [<µ,ÎylN8#kC‚“·¸¸L£äh+õâáì—¶ $ʆ9ü¡Ø×öÕ¼ü3'è!µi-n1>²Tat$µî–U„ÝÒ®ø5ywõãõÄJþM59ÙZ§ª®þÆãùIí•#1,g^Ãü‰rC¨fÂÓÞHhØØ–÷‘ÐÙ¥›ãªî«ªä.F­U1ÉÏbb‡m“·™2]ÜÊùŬgÛÓ àìYºk‰ ZÎÏŠÅ#hpòÁwêû1©Û—˜.ÓÛù›žsÉëΞ+ª­ê²gdðÕ íDäcîñˆQñX½õš@‹·m~¼cþ¤Ì-ˆ¬^Ø6|z L]ž`.ÝÓÛŠDc/rѨî»8Û)!…veM⢑ÙñbÞoC+™ƒ'ü®>_Ó]ÿ kat½Tšm1:; ­.ÓæÙŸ•=̬e NÈé,ë”×Þ[(Öéµýö:ñ¶€‰×Ö\üz,I—•ä°È”cÉuÊ5-ÖœIP1´Þÿe3³NáťЦ­ÀB7Ræž>GoÝÙº3 Y¹;ç9ïB~øwún—6ÎSÑ3bÚO‹¸*·”»ì6Z{óëN–]Êx]ð» tˆ?öS‚š‘ª„î½†ÙíUEõëßM#IÜ‹Î×gsvã•Ls}u¨Îwµî‘²“3ùÝHñ0WT“HÞ².È8-øšôü[|ÙǹuÍw½ô/ȈÓÍxÖ´õ÷½£ˆÒ¥™%Dõ9}«Û¯çÈÛJ±õ“Åáh‡¤û¯"òÖÈå쎒2sš/–rXÂ…®ÊÊÓdjN?x€—¦»iŠAó…ÖðD8ï-¿QZ¢¬/J‚è„¿J¾Ât½¿î{’ºkWùñjõEœ^˜ôp5(¥?Ü÷íèF›áUy·w+tI8ªdÃâ|y¯šÂ–n²¨)šE6«Ýòç t§B)•#†·VB•ýYžÜ£^ô¾O{CÞË&úe©9ÙóÇóO¤ )ÜT¦–¤Cƒ?­¨‘=!Šã°z´ë­–8ÙNájYds=Þ. ržìë)@¯m»@[Þ‰€@|!=ØÂ":Yfhnñ>e%¾Uo¥_˜?Ž>%'!îHF‰î?Æ ³Q{Q'íì 2 ÞlØÒzksh,·ËöÀ4™]¨v—LÝÆ'k=ª‚9[¢o®¸y›ŒÈõ^]ô¢–ßÎô'ý¡ù–ɯêNóW<4ml·ò­°‚ø»«ÅÄ<™^zò’¥CÔÓ g˜!yÑjÚv>°†™Ÿºõ÷Vñ'óŦ¼|úMÞ1ùwT ©ìŽ–šŠb„¨”=/ëæ^9Êã2©òÕ¥–9],1aräg‡úý6lÖfáiþ¥zTrž({œBÞe,&>xIê+\Õ£# Þ­3#¥ÏùŠ÷'β}C¾‰Ro0Ðìf©´ÿƒ°Øë©# =í.I¯¤¹.7pÕt¿hrÔ9i,z™Ë‘Çïsn·"È,ï‹‹f¿I1tƒ\·ªêÞ`å,Z<‰ÊzÁ#‰O¸¹k°m§—tN×Ñ?À£$ƒú gJkae$têNúù:™~ ï).8| ×,¢ª›_š2µU½Hôð¦Ü,½€¹XήÆÕ4ÎTáÌ, mC9F¾IˆzñxÅ{}¢ÿþèðvknÙ€ƒ´®&“ÍWPíµÀ Ô.¾È2èÛàB¦—ܲUh›4E·¶µýÇ„©ç§§X·0³²6LJR˜©m½>Ë;‘]­iqÀ%‡gõz0…èˆ0b]Š ¥ññ{_M d¤Ÿä3ÿå@º^4Oi®8'°í½í)ùF”{`Ñ×9­„ÎÊ#Ê2§SÚ¦IÝ´pµwïe6HuÝ=l¶ÎÛµ½rAØ$—_¡Ppè˜j¤äsŸ˜d¸cëÚV‹¯¶ˆ¤ûK[c£üƒ‰‡¶ßŸ¦÷6¬óÿ 8HdIª½_4üI¾ÎI)©)h«øÆDC¿„f¡3àl|ÐaéѺÃ~jžIrFÔ&Ù¦…•4Ç}ÑíÚd°Òx7¹QÕ©t4ðt*ýÅÞ/µ~Írs0{¬~¹¡G»yKêðÆ‰¶ÙKž°˜³!ïŒÉ°¯ ´’шæÕs ¨c¶5‹ ßôüÎY™æWt†ë<×û")¯©É”EÑ…ð S0AX–2ô½Nûz¹môRŽ9^ÁeÂ&@[bÖ7½ø?·H ©+Œ¤[9DH=$9³±vr{j­õŒCA[‚‡ º_’Þ 5*)ÀE„§PÏF¯©²V°Ò’&?é pé§Ûê¾çÏj"t™Ç£•¬V˜6å:Oyæx´‘»á ¿øI͉YÜܯÀçV8MZòuó…uœ¯Žýp©ˆê?älŸ}Wv¥k¨p³×%ÑÂK|Ï,ëÙÅ}^=;<¹)~´N%;núé|áék$¢?~uY• RžÁ÷Qÿ~¤&̃ÂÀÇg“wJØ*z)[8U(§™A¥Ä1•®÷¨rÈ_-œcý' œ“¼MáÞPŸ“9¢D,1ŠÚc/ë*Ù`XÌ£¦ 3O{Åõø,x©ÎÈ·<¹Bÿa´ E‹.ì‡WùîÓ6eÉH80öRm×»ç[±}4{y—As8hÕà>©DS*⦑¾ƒ ‡×pöp,2]ÏcãSºYóá²÷øÛâIýZz}­±ŒÒ {ù|ëØ»÷|Ö{™Ük¥(HòY;ÈüBsi&S¼6§¿ÚüCâM– endstream endobj 2595 0 obj << /Length1 1420 /Length2 5888 /Length3 0 /Length 6852 /Filter /FlateDecode >> stream xÚuT“kÓ-("DAŠJ‡Ð”¡7iR¤wAš„$$AH ¤7Þ{•"M8€4AŠ(H‘^Dzïˆáå|ç?ß½kÝ»²VòÎÌž™g?³ç '«ž!¿"mSE£pü !ià}mmu0PHHD@HHÀÉi„ÄÙÃþö8Â0X$%ý¿÷100ïSãð@m4 ¨ál‰AâÒ i!! °Ôß@4F¨ vABÚ@ 4 †pÞG;ºcpßçïG „’’’àû•Tt€a0 ¨ Æ!`øŽ°=Ð AÂpîÿ*Á%‹Àá¥]]]ÀX4.ÇÍtEâ@†qA?)uÀ°?Ôœ@#û;`ˆ¶Å¹‚10 Þa„ÀPX|Š3 Ãñ݆êZ@]Gê7Xë7€øçr€ ÐÊýÉþY‰ú• †@ÐŽ`”;Ú"ía@]U-œŽFAÁöX4>ìFÚƒmð€_GUõ`<Ã?ü° Ò‡À"írüYÍ*(è}´ƒ …Ã~žO‰Að÷î.øg¸OPhW”çß–-µýIêì(hŒB:9ÃÔ•ÿ`ð.À?>8 ’”‘œ€07Bðg#wGد è§ÏÁÛÓí´ÅÓ€y#maø€'ìâ0Î0oÏÿø·€P$´Á‘(À?Õñn˜ío? Ò h.„—(ôóóŸ'K¼Â h”½û?ð_#TÓSÔ12åýCù?A%%´Г_ä‚„„Åøï×ùÏ üÍþ—WŒüs:¡*ª£lÑø:¿Yà¯ïo&.¤Áõgo¸ÿn¡ƒÆ äúGÿBbBüèÿ{ ~¥üßÄÿ³ÊÿSÿÿ}"Ug{û_q®ß€ÿ#v@Ú»ÿAàíŒÃ/‡6¿"¨ÿ†šÀ~o´6 Štvøï¨:Œ_E/t~¨€èo?«ŠtƒAõ8â·˜þž¾‡=ÓCc‘?_<ø,!¡ÿŠáwòÿrÁâgö;Æâ÷k¼?m~Õþ} ý¹“Âbâ@0và%·Ä€ž üòBan¿4@¡qø ž³7Ðü´˜$PÐ?4ô§ð¯Úg ßü—(ðÿ¶-? æƒÆGЙ@»ªÀÆïŠ ®ü‹}²W¶“¾› ó÷åY‘à:T1LO›Ð,VRµ²kÑQrúž13ºï¹PÍòÚ]ô?‹ê œÅæÅÈÅ7ÂϱžGŒl#7ê²M”˜¥ 1zLá­¤òPx‡!ç ¯»Uíc±®wn©Jh5ê4·V¥iÝf”z¸1g€«·é6Z; ½›9ç0ÿÜ",Q'…MS¶ùãZN1ÛÕÓ=EùŽém¸Ÿ†‹ÿâG0ŽRE¦›QYôjùéò³ÌB—õ*O5êû· µ³Y hÝ÷sâê·i-ÎØ¯šÚ¥…!bë´7šrR–óhßÄc±¶ÉÄÌÏl!ðgžPÙiUßæúÑžAš£ñ+³= ö×Zûßp¥±{!J‹ö|ž~P4 ·Kz1ã0É‚Pg¿£âq…];ªW%ʺetäí%5I#Çce8ZÿªhgXY46Uoë·<>[TW_€©ìŸt%àÆ‹ NϤûJ$Þ`¥â®ÆÅÇÑÌmEy ZÕÊÇF!H3Ò®‘ `éB¿/­íI8¹à(®+¹/YX6©Yì'³]¸u-¨Ê£—ø´¹¿½7Ò|ý{²d•Ñ¡b¨¨mù’u}F^ï ]mæÞ¤f¸ù=ŽQR­†‚;k§ÃðäáÅÀÀ;â·îÈíל(s¥zÇH2=‚®tóe›œÅ+asþb›hGKU¨>üXÏz|«ß´Ös‰Õ îUær0òôot‰¡,ûXÙ‘¥HºT3™îJp)¥+3YÐæu„-Ì–Ñü!^båJO"¥Rƒ©Ü0^ï'÷‰(¿Ôd¸‘X ©"Øúåæê6•z¢LÔhf,A6×òüÐKüÕ¢Ê1¨s¾Ë’iœåîÉ7}gä+<†™ 8(ÛdMïǬMìõò0:&Íjà„92º%õbŽþ<®ð¶.¶ô`ª¢ îsúó¢‰Ðä ¢â«Ff/÷cæWæ2O›ÏâïL ¡µr.Ã% %÷èÆt¤Û7Ùwd¾œÝ ½:6JÖú>×–I.E¬éà×Kêª6O·aô™¤¡(…iGeK˜¡‡¾ŒwJ-cThvk0íz 3a‘(.÷zY™ÔÛbyßIuE´ôþ#ÊK—-ìšÃ§‡+=©UÊ×'Øeœô¬’0“íæ¦LI5޵øMä?Ù}óh‡ªŒ÷2 qµñŽËvzjªÊKŠ X‰€òpŠ+NÖ?kEsr—™© Ò¤Î>«¸ûnÝîZ=©÷I –>ÕamÒ÷t˜kÃ&*™ `ªcDü+Yâ׆ÐÔr$qãðO´ð'‚OHtšÅè™/õš8&áK¯ú. ¸^ðŠÛÔm·1vTìúô¾Ïè5/åÏYkyÑ_ØôI“µ¢ ZÞ–døÅ¤¯úÌéB1¸ªO$$–šFy“ä²pq¦ü|GÏoWÌ‘ XZfæ}Xs¿¹öÝ`g\Æ©ö¹~„㙄ËÉðÚ󦦚s=O÷*µºšÛjin½øXl²ïæÆîå;DÕa×<&srëR×£D!uÆy©ûíNt×ÁdºAZÛ†Ž¹‚t¶ð² -½Ï ›—ÄJà²æ-ËÄž)FDÿ…–œÒE§Ò©²8<}ÊôÉ›”UD>OƒR7Ônlx*:ë]ºL¦j®˜Š&ɇàq_Upqì ÷‹Ô­›KGO-©kä®èî,Œ©Š®•pÖïÿBt¥ _PrdQ[dØŽèj†€'”¬½—€ûÿØí|¼±TëBz°Pm´‹H…£².j6rú˜8§Ÿè ùƒžP€Ä÷>[«¬ìOÊ¥•·N¸¿‘¸n„¹|CäÆ-ë ‹Úü¨‘žÎʃ ò ïK=ðNsW¾³IŸ{¦ŽææûZ¡>ŸáyBúHAXŽ¥ÔOÙ5$õšåCåiô!ä‘äã{Ñêwy¦gà1ߦÍê-ê?âVß3ªv²vôÌ'ÑÐMŽ‹kHù TйÇ;бûMjàä=†Ý{'ås`™{kç#µRls߯‡°W™s7ð`1m“øBËpXäÁ'z{±4 ÓDt»BÚî¥^Œ›Yz”㧘c¥¹¿*ZZHïc :½¿˜­†Ah ³Ã(fŒ“vOGnP%¿$Vµÿ*xàpý¦™Ø$IM g{_Aì-ÙƒÙu;µ„ -M­ªc—ƒÉGÞ«}ËTOUèzG=&Ý÷Ï Ùw¾0äße4Êò¥C\J9.t ØvZŠØ´f©Ph7N:] ¢h æŠ1 07sÊ÷š×’.芩/K¯»ëYh§®ù놮[ Y(\ü^ª3)ñrîɸ¾B眂‘&C…}rÃRЇ‘—ñg î‡èj8¡ôN™Ê6Bh¤bV}ãÙ&ߺÄ{ÖÜÇ Ü¯„Æí'\ØŒ…#¯­IÌžÛPJ?Ýçæ×†¶aN–_Þ ÷.XÝÕ.æ)S»ÓhñÞ~†ÚËç!Ë´øBŠËÞbÕŒ=¤ L_ÎË䋿l.ÞA¾Ö`äŽúqΗ­ kRP6t–è6ûTü| “õ–%.Œy»¡}D_¡²1”¿ÒÂÚž0Wz)hžÃ¦àÛkÀ³¡žù[}é ú&ÁyA2Eº®J±¨¢ÀöŒriQU«v•GcÔŸ±ƒH :«…Èaã×Ô:uFñ­°—;ë Ïgxqeùöx ÄD´†P¾NŸnZeÇÇË„œ ‚ÞÇ‘¨æ<9²‹^´Ú¡Ð¡Ù[–0Ûž¸Î#Fâ„Ó¯pˆêA¶*NÕÝæÒˆo#Î"4xP€+kІ–ñˆÀ¦Á‘Ç%³i…k±‘b®ÇTñ÷=Þ”ú,I³8«N •샷0ýÝf录:-ÈBQ½Ÿ‰ãïb «ņÑ!¿“Œ”ê:¹$ÒM,n¹ Ò:DÃSYgëþù¥R~^`‰âê¢ä Es¶¸]\ —nþn"1o¾ÿÐ-"‰"÷¡ÜÈŸ—(±÷ x³s•ø˜‹)øõ1%úÒÕ=Ï¿(¾á  bþÅË/:ö=µa [¢FìÑCo#I#͹hÚ ìW½¨êk·n!ÜXÏÊž¹=•ÿÁ¦§vS7@ÅËÝã…f¿RÆi‘þ&Gb¤áجgÁÆ^‡TðÊâÙ°B9qõº¬#î‹U=»“ÉŒõmbƒ0¥zn%ö1Ɖþ·äè‘Ð{V?¾0¥ï‚AdÛ7 Ô–üÓ’J)ôïn‘O?Ó DB±êµIäp›Wô/{Ül)åvp‚ôßÄeÂÞ„e;ó÷r]°¿Pø|›>8#4(ã­võ#†ÎÜÁ®x@ ÓåáNõ7K‡{†åÌëqæ>\’óOî$5(ó#mÒüÎH9ëLt’ÓêÇË(Î’–ŠˆÐsŠh2Føš$d®”VÙ•øxãÊð}I‹„ c ZabyM›W…pº¬ªÓ³!˜ˆô[d`‘¸ÞIJøºUÙΪºoá2aÑÆÇÊ©Ûû«^$Ç `ìÍ¢kƒO±meâ›LºѶ¶›öû- 1ÍêÚ™n‘í¹¦b²ÖþM@nõK¹6Ù+!nëã&ü£!ë윥š«etå%¤…W‘w]¶ º•<=ßê9~%ÕVzÒNvbܼ+»ã’ómû²ûÉîydƆÇÈË«wø™y“&9o|VGrgmN²å°Ñ&ƒ¥!³ìZ±&Á$Ìþû‘ê{‚凮Û)oîXMˆ§žtÒx‡†KécdÇ-ÔTž‡˜®w<º´×øtM%ývš©W§²,¸l½bô AïªÁÌRC8³(µN›WÃæ CÓºDÿ,|XÎa¸`k|¥¿øõŽ@2ùp3Aʘoè›go›®GÒû——Z«ÔöJó9‡›ø™eDõ׌û¯K6ÎSñëYiï¯Â.ÞV–ù:´—‚ ®t.^Æ üà?bdgµmÚ'¦ˆ˜%ø6Z´Ùxyr»X`þéIˆõ ¿=ås:.K;¢i§|Êö ú ”Ÿ ­Âû Kò¶­1CËQ»ñ”œ¼TéYå³7SbBÆUBaz’;ES˜M ¬‰÷W®IftUó& OÌÖv¯Mò™Öh/\/«ofñ¥/ðæáµ)Où } «bßtù\zA/¶ëù†JÖ`ÜĪa¡‰8öè À•™Ðûö˜1ðy[-,UL%:Tñƒµ^Ê¿é“ Â“à„JÇQî¤%®¹§LîlC‹ùcôi;^Øæ¶Üüb>“×Í &qWÌ"þRC‰°ç@SzÖ¶Gæ.èYU„O˜Zð*ÝÍB¹v²y+ÈòûŽÓ"}øÖŠ_¹¿VLØé‚r+N©å¶fC6†š¼·–LZ´ù'[4VS<Ë-?æ»fæ Èú–$Ω@.SŽWœ (-oˆ‰Ä$X],½ePÍ^˜lÄ›¯¨ú±‡*æ¯*]Ás7&žæaÚm°¿Qä³ò"üL|Ãþ ~‘ª ~i²s¢Ö^×­¬ðœÎ䂤PÞœiï>Ú‘¿7cÑNY’þÒÅûè~á×F†ÒIâZÐYÕ˜ó¨' Ÿf²5Øi·v,ž/zÍ÷ñÖ¼/˾W›>+€¶…$¬¨hgð¥äÑ0ÓrûmJA=\çD'.“À³gÇ€ R¶<Ý?.ÞRW¸èÔ|oë–°5 „Kž—J8ç$8\>ë )]•”©ù’ïd6' ½¢|} FâU³»"ÓA¿µš®¦MÐÖ·Iªýê¡T(&*KÝöÂÊ%fôÉ\ËO¦«ç›d´‘m y ¿@ô’ ÿGðX«¾ô›Dð! û®½ƒàÁµ·Q­÷cÉ>IEËW‹PóÁ¢“LâsŸ®•k®cì-Ò¾äêˆ7×Y[+n>îºuyí™6n '”ö S‘ùuƒÄ,gþ©I§].#u/}eí¾ý•Òí©_¨¡ÿ.èÒd­@$šÑÑäô·Áô¡Z¯?÷ü¤•l8ù’Ãïý¨ÕÅ”È<,%¿Tw[+¼ª²ùÛÌÿÝq endstream endobj 2597 0 obj << /Length1 1412 /Length2 5891 /Length3 0 /Length 6848 /Filter /FlateDecode >> stream xÚTTTk»¦S@eHA†’î ‘†a€!f`f(iéV:D)é”n$•î$¥T:îçœ{þ{׺wÍZ{öÛßó½Ï³Ù™uôxd­à–%8 ÅÃÏ ÈkjªŠ€@A^ P€„]Šr€üq“°BH(&þßä ãS¡0yšp@ÍÅÀ/à Î/"€@±¿áq€ÈjÐä¨Áa$ »<Üɵ±EaÆüõ àsøÅÄDîÿ*È:BP0Сl!Ž˜‰`@†BPÿjÁ)a‹B9‰óñ¹¹¹ñ‚‘¼p„×}€e xAB®+ÀOÀ-#ä72^v€¾-ùÛ¯·F¹ÆáC`HL… Ì ‚`†ôT5ÚNØïdß ÷îÀÏËÿw»?Õ?Aa¿ŠA`0ÜÑ ó€ÂlÖP@[Iƒ厺Á¬~&‚pL=ÈuYb~P’Õ€0ÿÀC‚P'’ uø ‘ïgÌ-+¬äᎎ Iòó| PŒ¹v¾ß›µ‡ÁÝ`ž k(ÌÊú'+'>ÔÙ¢ªð'ã"ùÇgA„¢"‚¢Bˆ3â¶åûÙ^ßà ò+ÈÿÓAàíéwXc@@¼¡Ö̉'ä  .oÏÿø·EÂϰ‚‚QKˆ FòOwŒbýÛÆ,u˜1Üãþþ~3ÃÐË sðø'ý×~ùttU5ôU¸#þ;&'wxòˆx„~ ˆ0@óâýï6_À_àyu@Ð?‡þÓQf Çôù s{qýà Î?šáü{„Cf€óî›…`̃ÿÿ­€_%ÿñvù¿¸ÿŸRrqpøæüÿa#ÔÁãO†Ë.(Œ.4áuÀþ3õ1ä·–5!VPÇÿŒª¢@}ÈÂl0çáâþ¹](R ê±Ò¢À¶¿™ô×.03 0ˆ ýùÉÁTÿÃÈlù¬ 1û!1DýZîO‚QÙ¿Ï¡í~ÊQ@ø„@€º«ÐÄêføy?”d‘“R»Æ26Âm »%–6ápZm8[-VÀæÕ7 Å/˜›QaRz#És€èxM  [ãdÏ·;öZ±38ézi4EÌä#¡i†œOLÈdxIÎySI¥ã’ô^ísÙØT‰“p÷Ht|„QÕŒG~ˆz ΰW‹²E 2ëí»Tï=(îžTk‘I˰k×¥'§Ó0Ì÷›ñ5Mûbõrø¨Þ´V*á{2ª“2"Æå@°›º¦)½NïyÒwwž÷yþfD xÜËIåK /¿ßN£veÞô€lyF¨˜ôÛjù²±è’%ÇŒ²9ÙEÆe¯MtÞÿ1 ³£^PFF}êáD×ðØŠÓ >©8a1wý²“8’wã´îzãVïMê/W)} ›n‡@Η/z¢úu¬Nm?q³,c‡Ü`Ö ]„ÅÏÕ–W•Ðë/;HL”4»_5X¶âÊÔxE À)ñU7¥¹/žy;{µ°S¹øe'[Oÿ,½¾ÒX°â3·6»ôA“‚ÉÓõyÇAù›”ò½¼«Û#gJC¨…&ŸnB÷ŠØ,Ó\óúµUŸ$ˆÛÄKÑî¶êN¥Ö|ði½¸«Së -Zc0bÍþl-ÀÔ]ü>E ‹±hÿ¹Á=“¥ú×QŸ™.åóT …]Úìß"ë<É.Yv“»¯?;Ψy“7™ÜNƒ©¦S·eíöœtÎÅ¡d e)å°ÕÕäñûj$tunâxÎ 0³L[]'Ës HÊ¡ƒ ke oÕÝj·Ø^ã=¶Â¹©OFò¨Õ>7wçÒiåØ1Fin½‘‚­/2ôV‚#"î1s-r4°ä îlAý ;F7œRãx:;¹€D¶ªø|{qæåU£/H/¼Ešva·Ö°c±g“îˆë·÷»Y°®ÇÆoº¸4r$‘K€béxÇÂ.Ü˽·£«[Íç£öÎÒõÇ~|\ð ¡ÇWüÀ©ØYx5ïøÒà´‰{=(-¦¹•]Ø#Èá’ˆµªË„yº¥F¥¤3¢ß°é˹X¾—ÁœÍ'³ªÙ×n¦ÕÅ˰Dž޲’"1çF[ɧ z¬“G9(e˜1ˆš¡ -ËŸ/'3c‹ÞTúØ- P¶~„è+ŒæEó|š%¡3f·¨—nËÒ³¡f‰<ѳué²»c·c3;§Øo?/•‘å"ã"‹m^ô ¾‚ÃÓ¢ÞuYõ6VÂW Ô¡ª—0¨ og"ê½Ñàk‘"ï@óµˆÅåË"{‡tLR!˜c¼áiOç}Ž·1ØÐmå#Jšý'2œB’_ŽÌ®Iá{ðÆJ(×4`ëBW>õÝ«TG¢g¼’æd§ÞÓÞÙꪗï22™¹Z•ý{¬Œ[ïÈ~ÇÏaùrñYÐPªµ{âg¼°OÓ ®œ%5d¶eìs6ˆ¤ÐI*À 5L7{K°ë[²Z¾f·åŸ-s=±MS]ú¡RÒü¥PbcÍH§ßÍá}ìRZ$gŽNåè¸Ö¶Ÿ+w<»M¶ÔÂ9¬³p~9A%Ì3s`Cs_PÌO>¤T=}=p\¦x¨­!¶þB>ðaÁ5Âl[ÏÌc¿Únk\š¾<âÓçVø‚ÒWØÛ‹›R¾[ò°™÷4¨wÝÌm<2¾Š‰zç¬ó.g¾8òÅÕå ¢äeØã ÙwÎ$®‘¦"žÂ ðß°Ig5Y¦Zoسf_QŽ_ÄÆMÈâ‡PÔ»jáߤçXÁsæõMšVÈCOË©Û|â)À)KHG·¶[:ØËòd1Xp€L8ŽD(,$!|$cð›Ðg^ðýóQì7·)6<æ@´Îçk¶éïPæËÔº~ËÖ½mñúôðòÅøóg–ß\àÉÀÁ£bqÞö¨‡ù⪹@?ºM/…@¥iK /ï÷1ó&r>¼W›P#\©|{)RɶÒGÂ×”¸«,ôÖØ·É/3hrÞf¥¼‚b¤à­nÖ3!a¥IÖýÚy#÷·æRÆç—F•c{|lÉ´r<¤xtmhvfÚ]wˆýƒ]Bîïâ8uáÅ®´"Ç„— ¡º*Ú`»Ø•ïÇ %?óH‚Žd>ÜsÇ @€º+’ÄS™(iõýÙ¶4Ͼ>õáHkôÒ9Lªî?>Æ“bÄ£>æ'v@î9lšõ8]û.ƒ^{$ÎmÎÝ~+&“P|É¥.Yp9º^LÜÇa¡c6-!O«°±)PÖhnÍRµ·„E”äÞz-9‹šÇ·,í#5'»Ä·bî’…²ÐÞfÕÆ¹ä®T}oR÷Œ!yŒK€Øw¡GÔUoØK¢žüŽÄüáŽþ­¨\úFÜQI%¿Ô÷ϳi\où‘ÁëIÇ£—þÔ×®b¹—Z/!5Q5ò.1NâdÆ¡_9¸Úë¦hpO|ýöᇅzæ6¹¯µÄkûlá€d\ùó’&¼‚ÀÄüÏ›5s±át%Iæ…"òf?€T+8ßç€uÄœ†‡æyHÉÃGЭ–yVÆK»v¿sû™º8á]cáÝ×v8†Ýk4[Tøqw]´øý”úöãªÑ¼ &ázÑ8=ª¾+Ÿ=¦_ÙÑ7‘wÙdd«d‡“~gbCò5kiHçr¥Æ‰ËôÓÓ”ÌSž8«GžRƒéw­SÉ+RèÁñ÷몆©¾ÊÄØ]Åáïj-g®=Ì07'†¿=9²}>*³"~ê²ÿ=R-Äy0ZœŸ[%þåW¥~öۜڈ *ÆÝt÷̈ì¥Î“𨬕êl„i ï[¨£ŠYXýƒ$Ä'sN5úe?œßœq¡a,•H¨9TE·êniµèœ`ÁD‡ä&cë ÂÏ} Œý/:ì=OyëLUÇÞTðÞEFãµdQbñ2KîE»*Ò̾{áŠÝ¸jvÍ~¶¿eá/cˆog0¬:œ•bÉyPS“£wÐPС¸¦_FÓ¤úðÔ,è§JÔ´¾>ÉRb|òèúÕÚö‚l/v±ùÔËœ² â2¼!ýÜH»Ä²¨6fÆ„¥B)“†üæGÄ>ø¸ÓfŒÕ‚blê†ß…K/Ï8úù™¹Ç¢´U.Jaȳ¥‚ƒD$oYì'?8¤¬vêkCÒl'&rÜlj·#N}—Ü(üÊ,VÉC®Wj‘<>Ònæ@²sö“É÷˜ªFeëã¯Å‚ g æúú÷ÌÙôøF¤ÄXY¯«Nx¡¸±tÃÇ `Šnޤc[jî©=^Y"ùk™âì³öô«Aä§4óžºò5vé¾AºÝ‡{°9Ç*c*¥;DNÇ≣i»µ~81[M—^Wt\FÌóRCŠr$Jdœ^-ÙßàÐñx Ò·r¿ÄÅJ_Õ`h"÷™ZpÊÝ‘NË0k[ôÙgÜÅ2jyÙ!ëdb‡}?MÒ8–‡çfÅoiä ˜„ypg:ÚŽÛ»ø;_%ýÀól1“ªæÌµ|%‚8ŒÝ¯óä³}ÑÊOqµ\$ËuÛ¦TèÙ?>O©§ÔPtü€" ÿŽÜC{‡h=#1Te.PûeÛs+ž×|ñý¡Ðð²:GPÖø8?·Ðª[iG󙟘yÃH‘¿8Suòq+X­*ßà†ñ!:åå+Ï<Ýkõ[x±Ò¨·ý/‚)Ñb&te{ü%ùT_hyž~ƒsÁš“©ñDFÆAk•C·Ë%»(» 0‹K>¸¸Õ™qîKÌòÙFU÷ËÖG„Ç„Zñú—j™ü§4|+²hu5Õìç=Ò_Ð41–Èj ¨¿z¾„îFߎ|:µ¥Q.ËÒû»õ/:‚¨ŸD;ºêF ÁšWÓ³ƒÍšœìæãx,õ/à…¥LŒX[Êc áh=‘ˆž€ÞcÞ?ñ툈}ØëìÍâId9¤£tytÚ98’}"µï©âñméâ«||™)Ø5Ñ4½pFÍ -x‰lÇ×çãa´B6žâé$4ßÊMǵÎÕd_swJÞ}wúíF~åö¸¸ÀJ†|N/‚¥õÍí,ýϧí'&…ݯAááô½Ê~ÙT ñmãÃbé‰%Â2Û»A®ªË‰$÷àÂßñ •È oö‹)ïTÓ%ц¡é'%|IdÊâY+8ó•—›sÉÉül #sjó(òúw‘,Æ€b”u©‡V4Þ` ßÌ"ñ…£~×Üø‚Áq¯/' â¼Êf7ÏQ®SÀv=ùÖj©|¼EÀ÷6û5ÕDïMç®9ÿéÍ"izû‘,kF€ m¼é÷²uá X%91š¹ìÉ ~Æ15Ð(*hà¥ô½çP‰·èãìº5î8!™c˃Ó;8y^½ïý{Ró8§ÆkûFšëTÚ<ñÀdÂ+: úp{ý›¦›.¾G—äR¾âIaym4êìŠ'DÐ9ÕÐë3*û©ï§Ôß  7úpÇŽ_ßë…<ÍŽøŽ×Ò$ÝåÈjÖÌ(Öû‚räC˜@Ï ¤lƒÞ«V|)Âk8-îÖ`š›ÞU²ÅX•á0$rléºMRÅy¾Õa†+âUñÚ%϶ËÅêãÀ‘²e2—š·üðI)¿ò1¿K¼°eì¼Sê Øÿ|áî”÷A{ùý“\¡ñDbÿyÊ~pV’˜ð±*@ÀçàÍÇV^x°kBZM%g´o^N î+{‹'—êœe@©K2²aO¼EøâXGÅêî>€;KAÌÅû-6ÒÃ*¶wÖ>ˆW†mGç~4^$¡–šôQ J»_};ˆìšÌ©ÊÃ) ãÓ“éHº®®¿‚Ã'„ ÖTàz;vÇÓ˜ìŸ9û´ï©ƒN(Þ0º>ªL`Ö‘ll±35EJ}&Š·o—ƒßüyÓçþP g~ñÇeÅ!Žz)ëù»‚½ÓÛs˜I•´kTçÈ¥6¯ÝÖpz±<»¸Íåbágðx:#Àe>Û ¶m;![^Ñ%ÁOf”:tVÔרš;()…ÍN숇âÔå¿í•:’g?kÍì2éplúòཽÒÔà •O&JrÎc¤pc’Çç'èÃñ¨ÒÖ1ÜQ~ï¦;é׊W®$ªó®Þ㪶•ª Qaøf/sirçèØM“ü­2ØúšÓØyÙý]òõ ×é ™ô±û¤O%À*8Ù1—«pÙ Od`ìBÏ[Ž$cýfÊ:.›SicÂÄ)n$¼=Éá 8 ]E†¼1” ªŽ‡û6£gÚ2ÕLÖXtµf[ÅôÉYkÊ^dN™•OÙK~@êmu/<ȫᦀÙ£¼ölýÍxÉ>º‚he0k„›„h¿æWmÎziDo‡:©ƒÜ(Bv56ýt±‚{>ÃH÷Ò Ý.{ª½˜·^öèsœ¦€ïõ+}õj2ØüeÕÕË­VýþPÜŠfÒÝ'¨wÃBßRLGi-jOCa±‹Ÿ˜=wC×ÐTQîrf@ùýpæ:¾Œ^O×êþçATÉ¥,´ù ŠÖŠùGfµ¹•%jk’ŸÓ‘)R.¢êÛC¹ƒW;5æì›\‡¢2Kc…\ ë”S+Ó}®æ‡û¯9 ”ê=*¹szfÏY=®1º=ˆëÒ -r¤nݤ€,<›{¨{8‡`•ÊYþ¼Û^Ù,F¬‹EÞv=:Ú.F´ò™®¹ûºüÂÒÁc s¯i;‡JòiÓFO‘Žö~ð·ºÙéŽ2Űæi¶€Ï†ã•Å—$œ×†¿q-U¹ŸÞuX/÷Ÿ»'õq,¡\Zs‹øÍ˺ú9‰šI1Û÷ÀCFáx±}Iti>ébö÷ŒÊGò!D÷$Q9ج”w@O’nÑ ¯r!˱ϼo9XŠ ì©U¯$ègdFš%+ñ´qEÌà Ï ¯.s.ݱú’ZøÔù§K›”qw±ã†`ôâÖ¸3òèƒIg5B®Úg™ZXï®|¿ubHŸzÇž·#¯;Å·TCUã5ñpìÀÉøªËW;W}²[ÁñÁ3/Fá3øKy…ÏŠ'ŠÙ C‡÷Š¢Âè¼¶ KPÐèú~whÖ‘Á$Af[{íÖ™ÛÌ,µSXñBsãÛÝ"Æ^4I\eUËenÂKWt;ÔUT@Ô(•K«N¢ÉzqKwþ]/å§71Ñb{ý¦¦†V}©g©—7ª†òy$p·…„]¥_4?‹6vôýÊ‹.-]ƒÞi±:h©fÿrJÀÔHq…þºÞðC¸ý5™ÆÔ»À/½q7Ü<+ÓÛ^×køŽQ׺a-¦‰ñ~)—3¬3íú,Á!°˜Ž}›²*X뵑¸\qÇ,´¸åôTÒUÔ¡¨r²“I›õCVoVz¢ª×’œÌ(azÊu}Jýêú¦¶(CÖ†X!Ç–ÜÉçyÔ™vÜÕC/GW o\÷¤Ð¸üþÑÄÞZÍ6›gàFÛ«Ì»b!År¯>Oç» àOnÙ› =ë´×p”+žµG¨ÍƵ+ùš_WÁ*5ÒÀyHxÛÜœ¶ì(Túi‡;W—6•æ¼é§¤9â¹j/ýQ)BD¥µw{"«Í’p”Þ®mÐ.ÕByÙ}Ÿ@¶¬Ó°øQµÅþ¹+PõÖ{7DiZ*zù«ÖÔ-oŠÕ):ïLžº=Ún1/®ŸÜëIá™iû©wg·m!eŠrË?â‡ùÔÂþá½GILc£³^JøWf†’uŸó±^ösæH4&ªPKo\q0¹àªêe¿E<*}ÿ°Íâ¡û¥ï˜“‘(kük2™JJ”Ø)t È€…E¢90ûL!ãÒ‚m3ˆ@“dzÀaÛ-ny8 <ð9OY»q7T–a”éeD@+Uç¶ùPß½A*ï‚ÌͧÕ_øš gºØe¹…ÊsßÈš¬lûsÉëÁ‰¦æËk;\3…æïõMÞ»à760û/&“H endstream endobj 2599 0 obj << /Length1 2997 /Length2 25543 /Length3 0 /Length 27203 /Filter /FlateDecode >> stream xÚŒöTÕ[÷ ƒHw7lº»»»[:7°i6 " !’Ò RÒ ÒÝHw7HI7w{Îyžÿ÷qïp ÜÏ\3žYë·h(ÔµX$¬œ-€²ÎNî,¬ì‚)Mv;;+;;' 6ÈÝø‰Fv9; þ¡ š»CdÒæî=g'€¢‡€ƒ ÀÁ+ÈÁ'ÈÎàdgøŸ¢3X mî ²¨°€nH4RÎ.>`­;$Ìÿ~è-|Ì™$`¥¹@ÅÜÝè‰hiîÐr¶Ý}þã‚^ØÖÝÝEÍËË‹ÕÜÑÕl#ÊÀ ð¹Û4n@°'Ð ð+a€ª¹#ðïÌX‘hÚ¶ ·¿åZÎÖî^æ` "pYÜ NV@0 ¥  Ps:ý­¬ü·3àŸÚ8X9þu÷õ/G §¿ŒÍ--]Ì|@N6k &«ÌêîíÎ 0w²ú¥hîàæ ±7÷49˜[@þbn•ИCü'=7K0ÈÅÝÕ äð+E¶_n U–q²’rvt:¹»!ýâ' -!e÷aû»³öNÎ^N~ÿk“•õ¯$¬<\Øtœ@®@éT "¤ß2 ;€‡O€ t½-mÙ~¹×öqþuÈñK ÉÀßÏÅÙ` Iè²BþCòs3÷ÜÁ@¿?þ‹88V Kw€Ðä„ôÛ;D ´þCšy Ù!³Ç`ÿõïß_Æñ²rvrðù­þWÙ5äe˜þÎøß3IIgo€ 7;€…“‡ÀñkÈø ?üÿëæßü/ù¿¤êæ ÈýáQÁÉÚ ðwâý/ÏÆ‚þŸ•aü7‚ª3d–úߣoÄÎÃn ùÃñÿyþ2ùÿ7÷¿¼ü¿þÿ%$ëáàð×1ý_çÿ?ÇæŽ Ÿ £ìáY gÈr8ý_U=àß«¬´y8þßSwsÈzH8Ù8ü[F›,Èh¥r·´ý{†þ׈{PÝÙ ôë²°@öÎ gi¹PÜ ½úëÙ§ÿ†”q²t¶úµxœ<¼s0ØÜ Òzâøq@6Ô èý×hØXœÝ!&Hzþkg0Ò¯ŽòòØ$~‰þF¼6É߈À&õñؤ#›Ì¿ˆÀ&ûqØä~#N›üoÄ`Sø¸!³üA¸(ýF.Ê¿„‹Êoá¢úA¸¨ý‹ø!\Ô#ßÂEó7‚pÑú \´#ßÂE÷7‚pÑû \^ýF.úÿ"ƒßbgþ/â€hš[BFí_ Ä“¹£ d¹~]›ÿ“rC8›»A&äfÿÛDÕâ7‚$i6·´B>lÖî¿å\ÿÊÿ^à ±-ÿEœÌ-!óìàð›À/léáhí™ ÿ‰y q- Óú/½_ŠÛùÄ cÌö›?'$m+ tƒ| þÍRQ+gHDðv4~W2ÎlÀÿ°æøEèheîfû‡ ’#d+þ”ñþòãê¹KþöKÉÛÒÁÜñhºZÿ†ë? ÷/ú# ÿ†<\¿ ço²¿¿ãñüRwöø37ˆ‚Ío)£ ØüO숿Sà†ŒŸ­‹-Ðé ˆìFìúØý!U¶ÿB"8ü! ÿ#wÈWƒí·gˆ©ä¶ù].H$'G‹_×¼Í ~Éù7GˆOç?¬8~Éå÷1$† äÅáôŸ‘äæøGúßä‚P€ >äeñ‡*ï_2ó»©¢‹ƒ‡Û1!×ßÿ…<€nݧÿŽ2ç/¡³;ÐÊÂá?\¸¸üŸýàýçä¿úÿHÿ«ÌñkXþh5¤z¿ò@ŒÜ€Ž ÿn Ï/ çíå8qýÞ4nHEÜþ3êV¿ÃB¾¥lî¶`à àü¥r°úc‰ Mp÷rþÃÄ­Ç2&ž@Y¯?üA¬½ÿ€ˆ>@H]}ó…xò‚ÿõŸO”¥Òo÷¿Mýþë¡z-‘ægœ-…BìªBšo¾J{±lŠLÒlë¥2°øÍƒ[<îÐà“*>½]_I$ tb,mÊÐ_Š/?úýh¬÷-A£éþõƒiœæøvÒÜ^ï÷¼Õ=¤ˆ$,Úâ;¯]_ëÙÃ4B·)Òd»zð£©ƾñê–ó®î)^›ÙÖØ©àUB~(ž`‰Ö‰2 *˜¢É±È˜& „sg!E`Ä:õFŸº¼šÄÊúþL®Ç„äÍ•ïg°Æs;í»\ªÍéÖNHMh@@ s‰5ê|n¹®íÙò£·>v·¹¬Çºe:Mxr5(¶#YFöjƒú%ƒC»®¬ö6®JJ$Mp÷uoO˼Â%bÖµùBrÞ·jfµ»©¥ÉID¾ør½9Ý…hAu¤-éIáX‹®§-r·9ÒþåÁ‹¹XAš†.^¥Gi_øÝëyã9éü.¯âxï/ë9«ZÔnè¡P>a,ÇÐ|ÚY„¡2m¨×ýùD$I¬¥}ó™Êw ªkvbd“bh|“Úϡ̨€»» Ä•ãGK1»øñ|U„>*âÉ:¢aEÇK¢f¤2}ª¸zØ?üR’ ¾…‹GtôPWD÷iE9Ÿ çy&!ÓnÃ7CüŽ<¶A¤ÜͨjçR8´DĨ]šzUZ,\çqlç7)kÂ[.G鯄øcᨂf&1“bvI™ ¿Ò0ó#æÅf~E”uè«·–{˜‘P›ÂÓt8ýU±É?5±Õ¹dr(BX+1é0מÆ$ÐÑ+Xa绫¤G¡Ý‹¡h»üøà>ðV"QéŽuµÿ˜ž‘Ÿ&N8d+D“µñ¢”åIŒõú©Nýºâ9ÈYCxtw4yÜìMp{Ñk„´gá¦}Ç“šúÛ¹O+¶§+Ù!«eûµµ_¿¦‹ š‰ó%ÿÀC6Ά5Lj=ç÷Vææ˜&=qÿ~#µ€Ž*ě֨àVòàØçºÿ¨# úˆW#ï^V5>éåC@6óôÆ’ŒÆhÕõ$ÐèÛ·n5nO ÃtÓk…oŸ¿žTW<àöîXF±¯’–œ©(Þªdé³—Çzúñ®$ÎÝt^€³\>RrŠ\Ã$fhOè+±.) 0t0ãË *ù™‡KHÊe¶ ‘‘ú,Ò£E(Ñ…uqª±Oꦔó*¨SS;Üïß•6°$௶ü˜Ž DÞô!* ÏÒrÒØ$ZTø¾»V&Lcöp~£RÊÙMà»âŸ–ýnŠ—ñcãÔžNÔ’ñg¶ÑÂU±î\¥D–ñÎìãøîœ„Õ6ëË® ‡uÎA2] -Ie¶áb¼cìb©L‰ÜÕë ¡r¿¡vdzªos¯`dáâ)"¡R¡Bøý4çœã1;ºµñé·LõN_XH<(½vVA6Åž™LÑÃ\}"‰kAõÙRÙ{æ ,É®4i¹6wÏ$GWãø‘Ã–%û“<±ŽË‡Œ*mÓ]EevL®ÇàqÙƱôù›ï÷(Ù8D,‡âÛÊNEÑràË9]ÉX=Iÿ]]†/—´úA„Ì9'A+'šXx xù-M²Ñ}0Å-ê¬{-Ê/ǽo^~!05}¥މßw~¡‘]ª­þ|éœ}‹dŽwyZ Ø&Ü5$xàýüeÆäàG„p Ô¸žù`*nÏËE$¿ªnî9îK¨3‚kú5k§× „ƒŒ±x«/«"V…©ÏÂ%0LÈo¹x1¨Lƒ oOWWh.§y$| «\U-s ÄÜÌÏ_2C|Øj“%b$²&N)»v§${£cqŸתã@ï`SÞ‘±`1Q½LѰW<<=d´þxkέÁÿuø  D`ÃU7¿¡`8ïfbôÙÍ*&Ý Í7®¾,w7Op†D9Ó—Ð8󴌑ÿ¹8ØSUº5REŽO€ZAôD› 1gC¼îäÀëýN1VV­öLX qû‡úHžZŒ„Á gXBÀÊ„ÃgÚÝÚýíÙºùQ(½…±í`ÚöÏìAJ€'BÜl DÐü„¢E&Q§_·¯„|þt4’ë™a¶wãÆ²;‡„GYqŠ‹ÄwVCî\­9N ¯D&K€{QÞ±*ˆÀ–Dz¸j¹‡2‚ìÍV‰Ÿ‹Qž—7!–þ†’É2LùÈÒ^.I–éRc²\íõúé~ =™ŠC=öø1‡Ù¿ë¹Óñæ<åݹ¨Ð)s€ï@Í8 ’sSÅj¶7L?{ªÛ[Ì™~B,=YïïÇS{)«›'ǸèZo]ŸËÚÌñ Jc*ß7).žg¨¤aqiWs=…¬`I÷Ô¸N úReRwÝîÅVâT×…üPcöªï¦"•¾BgO å¶L%8ÉÞÑÃ!ÏE©žG|Z[Ï·z*í¼?‚Ž/ÃxXelŽîý’“´Ùƒ‚] ãÖþE@¸V.UJÆ,Twÿ³íZË@7 ®F¨l¾³zK÷Æ8fpuñ‡Êq.®ækuYCƒh7wÐtf›ed¨‡à½[AÕÄüÃ~·É˾Äzrq8ë`”O&¤zË¡´œÜ^XE¾È;ÔSœz'ØU^Ë¡½‡jϹ۔j_²°Gôºe±Œ—Ù¾˜ùGiT"†$i$uË2/´ñ~F®¬LsUÌ‚ó´h´«U¿)ñÅV 0i¦Í‚óÓúõ/{°ô]þÍ•s$(ù‘×súïÔï.Fe¡ud>ž?EN*·O£ËGÑUÕŠBhˆ¢+̯¹Óän='j7,dàë¦m}ȶuÊ@©$Ü×§›Z4ï¬ÓîúI÷ 0µšÆædꔣ¨œƒ‡Œ@Ÿ,ŽTµ›=4ö©¬V•ÔOI¶vuñÔÄ>Ýb¥Óéà Þ‘™rE®1¢yžNtcßC8–çÆ‰òêÒ·ÏÜ ©ÔØ`G‰çc·$œÎÞó3'ƒUÆ´&‘¢ëA·ËSçt q¿8Ÿd ))òH?|KV½ƒºÃ²v|'ä5 —P7õT+j–q£«ŠÑ©tZea—¶—X èØ(¯ߤ×ðïݱt'×1Yöùúz“¯›VIú–¾Ë »àóœjF€{qpÞ|9û®ë´y.?átž#Ròâ;¯y x$„¾mYD}q-ã7?C³^¤•Ý:8KÎì—& ’'gxR°ßîÕGÈ&¾EY^½;.’Y57 k}£îÍ(šûú^ï¡FhQŽlC›’Kò‚gþüaçf]Þˆr²Äî†#y4íÈ’GõF ØE”“O±Iòñ¼Ö æ8¢Î†þ¢ÈWƒÍ]Ô°|ƒ$Aέ§!H\“ZÀ˜‡6üÎѧœTKá9°o×y¥W©Ü­)iBª)iîÐöûÚ4{V?C°ŠG¥ âåêÎñ"ÎI…M~kñ]åiæý:›µ?×jrú¡/}›”rEɘe»tÖ*nãðSä¯ôtý®jëô»k£M§fiìFú(ä[O"ÕäŸFbÈMoë"…öÞUžÄm(6xæ U/Q!QÏã/ÒIÙŠñ¤ ‡h<’6 }íø)žPFøÑ¼´&'M"À2"lßÁYºF…þ, U_@µh6;æ¤ïg·hÆõÚá…'i¹Ù7:‡ìÇ€µJŠíš‡œËIõÎÁC¿ÄÏp2©'"£.æ{&ÈAs¶?ÔìaÌ2êÓ7]nîPÊø=|–¨ÁgÉËçIHÖþ–®]L<>o(—§3îˆoÚÑt˜Ë [ݳv@‚ògÙ­j¡Ý‹ôå¦@µ }RYÝÖ'×18<ÑR½µn9ÁðõŸÝ¾Á™¡éòF4±:GžsíPd¨c¾›&kC’Ñ>4ªÚ u\"å¯~¬‰5;â(Æßà±Lr…\“‚6gåÅ—>Y~´oÐdý‘~ùèIØçÈŠE7¢µÙ)Ý4<ïàó@NÀ—€÷EÿrFªº¬Çq¿Ö¤®B΃ÇT.þ¦vžãË=º;[ÔòÓZôðÆ)Ò÷ûJŽ2§pÓ{iQ8¦ëb[jÒ»Âhcñ•[³9“‰F9¥+!ž¸<¯¾M/·À®'…\ÖoWõ1A¥Ë[]g-ã'‡Xú`Œ}RéË+ÁØè+2xÍ|˜e@‚„;&Ê–âÌ8 ßÌ‹ó¾Ùn|0œ*ðxFÐÚ%PŠ' ÁìÖV*2E½åe3P§l¸ñÂ;’ص/8×ç¥}òs³rA±B»e­ÿk[²vê8_é l:ô£™ZK GOv»¿çõ|âh;«u˜¶÷A›y܈¿ zý²ôwf)|¯æc¯É/ñ1[¦Ïø½™ùiÖ—~ÔÊÑ ³‰Öa™ÌÜN/¢ØCs2b”ßЙ²y>–¿Ýà×Ýñû܈mÿžoô½:Xø´m§wn1©ìNŒh~hbE¾ç‘IƒX‘¢ »üGä.,Êã´ý¹÷0'Jf¢³šBšN³äÏÇËmnÅbß<‡šzMŒÞ3ÆãΧϞ}4ésU:W}JÕ9:ƒr?Æ'zÈЛwž&ïô!óÅ·Â2 >Ê}?é0Ma6N÷G•ž¾‹[·í/÷ö ¯.â­s‹>Ãl<¼gžÿòJæ° £Ÿõ`¢}¬‹’QqQ‹­}AŸ¬döÄn•”vb^bO…©d'¼­± kKä2Y5g›š×³J‹H[ó=Õ"A¹rÊ3÷hÁñ®X:Ôwº«Ãë®ÛY|+]9åf¦]<7ÜR¹§¼5¶†"ך®—WжQ=襷·d¥¾!ÒEîâ(\×@¬éY{*sâ¢v Âz¶f[*Íá¢Ï³Ÿžß¬׎t¥§_§|ûö ݼ@ Ñß«Ý/Ñ¿‡lMðø"57>QÝ_6‚r²Yéj’j4N;»MöúÎh—èñÚd*†”Y( ±ýõ&@Ú¨û-ª¼Çï³FÏãX*]†W¿…7UC 9×9¹Ö°`±æÑ"Mƒ»b<›è`ŽÚóñ'R°îJP'¡·ñ×F¸fQ†“¬ŽZã@‡Œ[çV ÃÝœ1Y! fUÚB:lPQ„Q¥ªF‡Â™üÔÈÅy»˜¶à‘øœì þ®ê32¼Ö«ŽeöJáR†&Û5½¸ nëFYézÛØEÖ¹jí &Z°ã,d¡N^þÌÈ᪠2¸cRÐ×ÈúÈÑš°ÀZßΩ«S®æ #¤º9÷£§'ýu³X|Ù7¦éÞÑÁ0:™¯#é^Å×ö½ ‘G×™ÁàU@6"O Ù]º}Ð5½1 :ýE€QÝo²ÖˆÒoá„KgÁ·÷ç€Ç–ì'k˜áù¼ÐKõÕÂA™áüèotò?Ýy1”ŸÚ`G áºN ®YÙQå7V,á†Û»ö!çjvsFeiGR‚‘ã‹Ý¤,{­1öîÅNñÝ6ÀàÌ×íuè[ÿÜnåé-ìˆ|Á@ëâiÇæ‚N ®“Ø™S-dÎn¸Ãj«ú¹„ÅOFKÕxde$gx–‡ ·è¯á†Ü[í8Æ{Ó%vÁO¸åíãåO„ÊžÌJ䯡ÏjB¿'é®|øð )õ!]#¤ÆpiEX§ã• ÉË· ‹b–LW4k•ˆGªMK’Z<a7ÁÕÐÑÅ™”]3ÝŸªmö´÷›—·L,Šôzàé«©Q^p¥7{ ¸Q ›¡&8ªà².}ß|áü0Z|pŠ„•‚±[x?‹š××hÈá }ø1â“7ãH áì²^¾Ö¶zäH¹D±]p7^÷Ò~õØÄ°Ì çܘ¼:_~Ù‘þ–ÞK•ì–ŒJܬñÇ~É÷YÔXPÆ?9i„5w6ÞìÀØš¬“mî~ Èí£Zèó³úââ5B º;#€Ftüœ|‡üyµŒÏEÔM7ð‚Þ×jš5´]4òU5 "®ÕœóõÔx‹Y­z×ˈÄ)vgSö$LˆÊñw•Ë—¤ê…hÜ—†gB›Ø`w´˜ô:P °s¨?PìGå%©,&Ù‘ÈßÈÝ"ËÅ“õ§½TM™mÆm¿Ø²r¾¹µí‘žó–ª—çÒpÚØFÜbF³5Ä“¢EE¬ëÉ‚e½~z:î׸¯¿§âf‰¤*_'«ß(ž‘Œ6=þ¤Ø”$µGšEM"owòùô¸vzxü }r¡ .™8R{SÜ®!ÅÌA#J_¯N¢Ï3ª>õ…A5ãpKKíΔ¯ÇØå½»Rú@—ãÄMOÔózµ´^˜ôoëƒÄ£âš¡Ðë/}ZÅ•>;ñ0·edÓ.ùN”†¿e¡^_ÝFl-KJºœºE‹þh4 Byš¤ý=£m8¹×È#ufgÜ|³›XKGèE=´ŸWHòxêÇ8cÆØ_Nî"Ëë«>enꟜ‹²•p%?¼„çÌ6 ×øÐJKL»æQسqÆÎOæ ‚›¬S+–yZOÖŒöŽÜß芠6Ó.Çæ>álTqé¦?ãÎ迈Üô”Ù°Üçó^½‡¼lOv}â1VQjDý3»ë-Q-Ýe»´3KN§wµÀ®VwZ¢©#ê½–GžÃWDСWGçC„|VCé²ã_œ¯Ï½¡Xè 럎6ónƒ]Rè+tWRM%CDØ!Ó´ªÎ½TÌyÍòK’_DÓù\Ü ½TÞ¥U–“|mzsF{c1p¸èé8Dg@ƒÆ;™}9ó±šë®$Šü–ˆÂÃÓäú`&ÂýÚ÷¶÷Ž3_C˜H,žÂüdßÍ?Ñy®]´¤vmÿe°*‚ÒìVóüù¶âáãr¡‚½Øï¶`Z$”ÀX=žMv,“<õ ¾NÀÖkûø•;|„ËZùÀk[-¶7ñ¼Ø|ÌIùûªs™ ¼ÙpTæ/ô4Üfü»~~Y>L²kÅtz•¥ ¨|Z'¦cþP/ΚÑFqâ©E.…®}oÞQw»@ƒ¼5pr…+N‡;ÛÔ™Ò˜è]"7gèg¹´2mÑYJýF“ð¯sH´Püè~Wðˆ¾ö×-shb/O­A&$ò6”^º×™‘…·9,² ùn'Qs&êßI¤<Ò×’:yñ,l“Ž$†ãQÍÌ-ÇoW8Ó v¿»e·†ì–Eâ‘̲©Q ¹ ¤åMøñ…b¸ºìÊ×¶"ž€ëpêÀl2»=ŸKÖÞÁ4éõ‚~€.ãFBãóíÚµ÷‹å­Ãꄯd¨Îð³Ü0߯ˆ)Êp*mÖS?ÉRl²nLñº¹Yˆ ÅðxúRýä, ûõ8IZ¼Ëž–(âÉ(éfyø®:¶®±´d_ã€êœ•?õêÃnb Ð"1§Ò_¯Ñ-èºÉAÄQ $ò4” §!kÆ`VÝbpàg°õÓí0 -I²åÂEY šÏíX2^ æS„6FfÜÛ€èÐjô AØy鿯Uêtí«p¶½ÏîXMí°„o%•UPýÎ{NIæN‰ïK ÌqÙYAÈʦÂËF>®F:ÐH÷yfÿ$ûi™“\Á¡õ™Ñh>lÓ¹Pù‹ówê.õ œZŸyó–óÙÖÛEe—_©ù"†EOÄy§ì«ˆ sžÏfã„Ö¼²`^ñn¬‚ÂÃÑ+”C·1Ï“æýpÂÀ.¶z«ì/ÑÕ(òQ:÷¢ut1sdäv˜^Ë•‰ÔšËsDÌh7àkxÒîÌKm°y g&ìj+¼a ÉpI#@‰PçaƯ¢¯’LÐ2W\@¬»eÖ*å1ö‹O¢zÉ#7èªåBä:®ÇL_ºeÙ}Ie%‹‹ŸÊθK°p;J´@&kXÅnÉi—¿T-cÄuèR'«vÑæ°OM[0=zôs™rórf½Û@¥±Ÿñ†Ý(mº1GR˜ ôwŸý`O ¥8ànfZ¡õ04­w¬¯)9ÞJ£îÉ•éÛ2öíŸã%½þ õÜ1~>8xuE‚—s¸ØÃz³ØE•*¶y_z (^Ó}Aƒ_ºab圴§ê P<6Ésgÿv 6íRS‡y)“4"²Àr|Fö¥¹»È‚QϺ^fA ü azy‹W«úî [Šócr ¿å*'Üjq¶›µê¸Š·çá˜U\I;TJ,*¼ u¦Ùi“ MŽ6A@†ÖÇ÷éòy~Ib—ÎãèÇå-ÞÛŸAÙ µ¶—¶!žžQ)KááD-qtšÍÍ*Dˆö ÂEXPNé-¡%äþx~5­8ë|"ÞðÎ$E¦¬‹QûÈ[“³OÉïƒ]1åÜøŽŒ€&È.ÇOé&’"îÛ{Ôri»î—BFE”£8ѺŒ”A$^u2æRVNÚ×Z2,;SìàMjÙÄ+u¶éÖDk:m}¶<ùR,{¥üSŒéÀ®osò¡v& ?ëÜ5õ÷Íf¾›°  .;õÁœ^ÞæãS_F ±fõAŸ15](»šD“‹ ˆú»×e<úîÉõr¤g>Ö Xgðm­ÏJó+Y‘ÜW߯à9ÁÉVB«Êb £Tó »{ë·˜ÀÂób|w¼½—“(ü“>MÔ&¥[œÌ—_Ìg½.ÝÔš/|ŸêˆCÖÇ;L ijC׺¶²cê Æ•fgýä’übª,Ûßb¸5Š„»rÜ ¸í»BWªì¦«78¢ ÆM;NC?ž=’Íwnk‹/aBÂ>lÅ´¨£©e"÷Ý|¾«ÚöâþvéٔɅGëµ­tž¥nRH#9ýé%œ-2;6D’{æêfì£;ÌëÉ؈`ܰ`1)ièÕŠÿ¬ØÕµ=ü’Ö3:øÍîæAþ¹F¾£õîEaÛ+Ú¥æçôÍÐ'Œ¶=ÁÓ‹F}í£QzÒ¸1•cµlê•#×’ëÒ$xr]oB@p%‹•ýfwÂ!ÏwêFì*9²s™œ{¹\"Ù§^˜8-:¶ô¼,ö¨½´áüboóGß7lÉï ½«¢íz¾¦³|”³û(ìÙ–ëp%¬úpgVø´<üá@Ë—ß,¾[Ùn™¿V6vxbˆè0¶Ø}ßÈ[ô4xaߦÏ•7Ç2Wû¡6—NU¼(sÏÖÂ;&¿hç5¦ª=`f£å  ©KB FA¹ù`H »>“”NzÊ…«B*ÆY„K¨Òv.pÒalì—/­ÊYJz8Ôä\³õ0d¡ž-LI€MUÌÛNa‰Èš™ùçƒÆ¼#âN#K•8½³í¼ú³Ÿ»Ž«ÃΦVü>cûÎo¬(gÓu°Ø9Ö7>6®ócfuHÉŠž…IKóî©"J]ŸÓÙb ›& b¦F.Dƒwy9“™HÖÙPÓ þÈAÂ\fUæîê•uäß.Õu Ù/çQË=:L¸¯aÍŸ¨"ƒ‡ à[’šn‚}VlÑ‹™Ëö{%:;}˜yÝ: ™ç6Šˆó»A Ý‘3IŸ¹cHÙå^Ys†`yøkv Ã”z½53´¸ªšÌÞSû¡3Êa©»Ýü ïƒGø*NŠRŠáøéÛÙmâÄó£+S çÓзBD'ŒÕ?{¸ÃeÇz4Æ´áé&m¶.V¹\3¦J {¤¬q’BÃ!fê2JxÙ[ ¯,8D¾ûJ&‘£­‚8㩊M| ­§2ýM¯‡¡VV”>oðpÔݲ”K${Ó>Š'Ýòð×C_À°ò‰äÔýd’×Þ¸Ÿù ñü"Ž &>µíj›iñ¬p¼É•¨«XÙ±%Ôt,Þœã^;üb ì%L:O_²¢œŒ¹Ùò¹UœÙHªé î…󤫯ö(:ôe«&a<ò«#Ø K¦f‘@-’„ÓÛ–''¨¶Ÿ©“jü˜ÓËöúœ(íÈËvŸs•Ì=‹›Ëg[”*¾+'ЫK7ª·æYÙ?î6ÝlìepSdu±Ã­†’CJ¿ÁMÜ´S Ñâ’ ‘©”’ëG¼’,~8yû¾QóSe²“)j틲â+Aªo>e”å¯My" ¼¿#7Äâpý’Î"YáÓ’4WË¢ú¨”ñ½IÿGàû×µníþ/˜Zn}€ÌYŽTó·ã!†¶X97”§8e_iîPß½i#x4Ôt!z¾ôòvËr(_tAs²ï–õCîzÄ?7v¶«ìCm†“áV,U,r²Ù¿¡z’c{½³?å¦k±ÓÆÑoïîëØVêÇØè6Qô^8OðšÁèðâG­p¿\~(ÇW9 "Âg®*ŽÚD©šÍx7XŽbõ#³T›ì-j¢(Íú½-’"7æ6Õƒ^‚x0…p VʘÓäÞ zΆ„؈¿a¸q¥¨}å‹ÈÌD CæÊxЃ8Õ ø¦ô¨]8ö1ÇOÇmEžàT²ï+ $Ó-»"ì4+OX2¾*õYÄT,Te¦ÆX\jK3¡$}`ÚÜçhd’ÐþÑ ¹Ÿ:Gì«{û¸Ñ#Êç…„¾° õÛ%Ü·ü£„Oïkm\¦üH¤¨<¹8¡§ ¾ô+rÀÌút¤žër{ÓðhÔž_Qm˾gÎÛ.ÍÚú"æ§¡8×;þdJèL—°þÓý3 Z§ñÌYiYd³v»ò\Ul é¡òå¢.ÕÙûÛ_?\ ʸì*•*d—éÉß?q§@ÜdL´Âð”Ê`Ðíõ´ÇhZ‘a£ˆÔULÄݫ"Hîgöbúí‰7Æ7ÌtØè)f ˜©ˆ^ÍÌšz,Ûžg‡Ø³‚ÔF\†ló›ãØ¦àž¶mM6s¤(ÂÅ©¡!U é 8n†ï~cwŸ1»ÏùjŒWz­)nJ/ ßFD&î?¡'…î8 ÉGk$¦dÓu: k «Éý´©` •QG%2¦Îo··ø¼Ì,C´ ˆÁ:/ ý¬nˆ¿RÃ%CÀ³Æ†]{Ê? {"wÙùrÂjoõ±ZÐàÂláçE}§ò³Bñ},ÍV Ê Æ±æ¢ñmN½ËÐ$a]›nk2E«ÙáM³îåUÙúÅšàJL ™ßR§GŸ>ÙQG½¦F›N~q]L t®'í’MÈ%®«¼è¦´árlµ’Ÿô "¡+µêý´ª®€ o "Æd4Ëaa%÷HÓL}±N·ÆŒ1‹Xr˜Ç½ÁîoÜtˆ#V†‡$­aåqQÒ;ƒ_r€ÆØ7„¾¬k’.´uÓoSæ6ü$iOZjoö¼˜NÃ{FÐ@šÈ¦”žÉ&ÓP ÀøêÇÆRntÜ¥Ð\>ÞTÅŠu\÷º<ÿ”cÜ\õ€à#ƨo+{µ$ô©°-¹,€h;|2Œ¢i˜ÔéQˆùjÓÐÕ[[ðµ‰n5 á7«>:ß Ú——ÒpW¿ öæÊ/kÌ­âG  Ñ­GÄÒýˆ[î l­ˆ |8H,Mvj–&QýxRÉ[ªýM3çRÃý^&·j6ÕÀkÿwÎa\¨™7?ýE-/Ê>¦1ãÌê•ä¥åW6Æ[R8§àA Š×°ý6>w‰3ìñù¤]Á)$ø¢Óžu.#¬¦ˆ‹›Ýª­|ê"âõç ¡ í<¿]Âz’¸cu½^°¨š…^Îv_l$æ(nâGÁÍ;^îeNEư£"lÎ\Ó«# Qþ­Še­<ÿ¹kf=Uj_-Sªàæii—ÐGƒÛÁÈåñö²Mû¥ÔNš‘+äèõÚZ«A¨ƒ§)˜„Çæy'Œa£ ê¦wŸ9UË2“0X/’µ’¾‹«êqÃ2k¸tùXùÜñ$Ýœv·+­²¹×ÎòѤ&¥¢ŠÉ¾Š-S.‡ë ’ýw­©íêè ¨Â³~^£¤Ž”¬Œ!.]ZÙr5j¦³St=œÄ÷oŒPóqôÅô.œHhHqhÏËÑN\ˆÖ²ù©õª=Ç›ÚmëQª¿„3tã/Ýï®2íUQ.~Xëú²`Y27Cäó#á0ƒ¢{‡ívÂÊg⼕÷­ ÎYŽw_èsBPD°þµö}Ýbƒ‘ÍnÖ^BxUa:–Äᨘˆ]ö”ôrqÅêzŽó}“àxbvµ93ÓÁ4ÑaD|ˆóíVÕ&ÆT ¢I ŽŠš˜f6›®À_­BUÆéÉDWÇçðÝ]æ¥'ñî’`—vXµòš5úäd}¯f¼š«ió¹&y/欴ܪÀ·ÇP3ÃIO«u|8¡Zå$ä?ÈH•9pÞ»eVì]ˆ?û¸‹ƒ%?åÜŸ˜$÷wrÁ oŒYÜ8³¡#Z›Ú¾2\9ÆP¼ÑF|[76ºûn¯xÑø2_”Î:M~xT|N3&(X þ ò« MêƒÖl¤("Î<#Q"ñ!Y€åÔË3¶Ód—~›]oâ牫µ“kÐ%Áã!¼½Ê8 ©ÛdžJÏR¾K[ËOÝJ¢í˜º5~Ì3}ULJ7—±AÚÕ½&°þ)ãs+W¨Ÿ¥©mS¡ÃTÆþÇx˜ ÁYs4JãÐv+Õð¢þtAûSÃt7ÊcH›f¡ùø ¦M(Œ*¬ œôïÞt7ô BçcãMáâ^÷6‰ÙÖY®(KJBÂ_€ãB­.d°›BƒÜcç/}3ë¬Í~öù‡œsn02¢,@5b,ñª4ðÊå\ÓƒÔd•èßè^#âþó”T€Æ®,A5´û`4É!𜌦í(ü:Јà(¼^³[[Wc˜¢è;Ž<å˜^§›èØW†ÓZWõ “Ü€MÑäǽýá U‚Á‚¾A~5HFÚ>Ä’ õ~¶S~‘rF:?Ð÷béÒ¿Z>Mm¿öhÿJtÌñfœ©Nð#¡2tY{šš›IRIjïvv«ÂÏ«¡Þb.:Xj0ê#¬¤ÐxÒˆ–%/¥­h[*´Ñèwè¨ÔôÛµYìõ¼Òž(4š|”÷y>~@_žôehé§KFEÚlÊÌk–#¬yûoRcs¶Ë_4ŸÔÅüg~.s;]·9å =2—FtáÒóUïc$òöv2†93Ï:Ä ÕYc8ºc?³:Í>7ûÐÎsi[(È‚Âú#¢K³ZÊ*Î\*R“xòK§YlÕ …Æ×àÓ™É\ݼÊO™ä99äs1Ðô¼¢øªmLDzŸR€6ÚåëG}C8Æ(÷$ª¥Ý:yÎ$ê5zª–ªRNÔr7xýÜÿë$V`Sk]ªKGzÊa­XâékÓMõqR°ƒ,’OQô]@F"¼TúÇÇR]Út“öA?÷’N3d9F3)ÚÏ<©^Yî!âåñ*…6]ÚÖ™¹~É'ŠŒâqy$uUhdz))@4!º `u—BàtÑα5¼!£ùÕogK—-{v”:OY£oH¸²ä+Os_“ æÒÉxñ 0øÃ1$s0÷;v0 ¿8W ¢}²t°ŒÉƒÿðY½7šSžqPÞjý’çîõÆ*Ug+µêãྪ;È)ZùÙ@g¡5òF>=qyýé@^7¶¾L•©Ÿ+Q nø¨yõcÄ,“’ OdQþÆ[·NÍ\Ñ«\­kâ{¡_Õð9c§«½Ÿ#9Bº^çŠCíèH½¶@Ëļú¢˜ßv÷&ËEÑbdÃ7w©9ëáí䉗Õ\ï«»Öë£BâüñS2bNA*OáÐÂWD\…ï˜kYïÖìݧb7­ èœZS…ëKç*› o­[áß; ‹à9¯ÏõR}ÛÐ$ÿɬpä5Y¢Mý¢u)2 ¦”Wõm鱯y¨+ò·©] ð.æÊ³ V:Æ ö]—¯Ýʪ:Çr$­xý«ã6 ÓŸ-:ê7N/èÞ‰~Q2—¦n#€õ‹Ç~G¸ù4d0QzK(ç`žxû¹íqQòÓâKÕïV·˜{ÞíïÇË‹6§j`S7öë% @ɧÔ'&°^€Óؘ†б]KFÉH×È%‡®X¹<ø°¬Â¬Á…þµó–î%ïô<ã'(1€U ^ý§QÃÊš§r9-é #¢Îs µ”öV ¤½9fãÞ9=dÏ㛚Ü<}Jqh”Ûrcm€HÈln‘<âJouW…rÖðñÚIá¢ÈR¨ñ·òÊc]Œ4|%hMŒ¬uÙV£Ô¾6~¢@ÓÎpT(eíþÎ-&«Ÿ+±~ocØr¾-“ëLp>Œ¢ç?£ ³bfVBvÞ9úלG»òW¸vó.sÛ‰ô®<õh¾‰êÀ-<+‡ ¢³³Åí®d‚Àã\#Ÿ,—âäY• IVÁª¬ŒçSÈœªTÎxxó«tGv1ªu*"Ñ÷ç´!¶Y5-¡ËB2(sçù‰×¡ŠèI’Ù.0ËæáoÞT¡z4‡‘ÖÕ&¢bz‰ú¢$ßsrà,7¿"¤H×Ò‚kDù«ÙÈWè8}p˜ ÔcjR_ÚPöÖ÷e≃ë×yHm,bkzRÕ‰–DÆœãhVq¾7,Ñ%êo‹-ñÜ(ˆ;sWŽûµýÌ[qrxûO¢€§K—ë°^ºMO…±öÞn}Ò‚ mù¸=Ìim:&’Æ‹'érבK»|7»s²Â0•p“UOê¿ÊÙê`t|ùàb+Á ×’P_gÔ¨VW²aTÓh«óãJ”Á9Ѧ½þ9̶¡~ú$’(Øf‰Ža]f†ḵ‰~t®Ÿ®2c[d÷›w:´ó­ºGÿôžÐC ¯Ö¹p²_àÌ/Ñ¡"†ç Ñ%Ø­6†øõcg*ì#FuÃDý­ k2_hÉ n~mùDÿ¸|ùÞ^8¥¾öãƒnfØõ¯úg9 õ\Ï*§<œ²Ç{ÍÓã—zñãвW,fõþƒ FeȲà¤ÐÎá|$OCQX·ð,ZËfÂþÛC]ÿÈb·ì+yOn‘È´ªâzç«£”·iLy_ØwlYs»ß‹#@ÄåÒ!”¬„cž×gOSm‡Ü|:"ëÅîRŸZñ™jˆ‚… ²ä¼V*ÔE:.Z+~`ØùÞÏt \×P¤Šš[Ë °µ×à´ú8­C%P=¿Ú9Ið„ïÜa”»®ógoìÑeí2Sð)VO>œuÚDÍŽìçª9¢·õãM”èpôs¼¹VU\k°9蹃 /W¿éãP‰€jØs.E¬Šs¸ÐŸsEC7¹{Çæó9ÊK k¦e.G¿ÑUã`§ú6ßüõ‰$Ûå“jܹu‚j|E ŸVbL%ÿ—‹$4”OhOlr÷dÄŒ•Æý«øHïDÒtT&ž»t¤ÛH)ìõ“„œ3vŠ jøç÷¹0ñ#¬kJ<øñáâðáæmf×T¾b‰Bw5³¸DÙ¶ÆN}Ò7ØÏ{¹¸£ÛªÑÀI„HnD„®cF3<÷>m'mÜÙÿ¢€Pà°Ûc(jȸ†cÛ)Üá~†fÉ{¡l;`gxÜ¿û4q¿öˆx`MvÑ/Úõ&BkÅ¥ƒÓµß•…ãÉ›Úð²; à-V°æ¹èî!Ý$Š$¡8Õ}3+ ß g»“ÆM›º 4-‰ÕU#SÐfž ØŸ4Qޝ’Ñ$£¢Âv¼A†F%XJš•œ/ZÁ#püœv•c+ÄN©@çhrפ$íWjW/ôTm\#`ÍŠÇIƒwð–Ú/gûP£Éaé†FÕWï¦X‰ÿÕZ_޵²|F¦(©@F” ±gKŒ ?†ÍnZMØ%¶©N«ªjKv“:e!g*­x¾£¼^ g¼»jÉÛ„¡n¹ôýˆÚËò«SQ'.$‹ S€Š­üØ¥¾’+ïËà¢tB6ò»¶»Ø0@ˆ´êcâ6MZáûœÎä1¨HØ**sÓíQr1µ%îùአq`œ{ƒ*u¹=¢–×uù©T©³õÄUgnöRô*µ‡•®ýP䑌¤©–xbö‰î›»U£ý]u:b9xÖãy4¨Æ¾Ñ5øk×™²fuékyî ­@ÊÂPZ߲ܼ¥™÷2Ê0qˆa$ë„­åŸkn¥lɉˆ2¼éÔžýJ-š–Ðm©îK¹ïÓgšZ®Ò‚h„™øXÜ“)Â8OU=Bwß }Ìé”ÛVEl)œMp2eJãWâXì¯,|¨Ï¼†6(ö;½-M;5Ìâ´]˜I{3©Š©Êv5=±2Õ.Ꜩ6&ðw¸”ž©s3Á5|¢·E{©-ð–~apÿâí̵Ö;'PÊØ…ÙÀ …IÅÎCk/¢X¬ñï,+ôwWrQ‡¯Câ¾¼ÏÔÏÆQ?CöÓ®&évTVÇ&¸\–"åçßM׺p£¹ÂÏu˜ui=}kw©iÁò¨Àìtt½ŒXæ;Ùö{ùö§n¸y—áS@1î‘|`×4#fÅÁ;*”DB¿Ÿ½Ën}4¥Nç¹äLÏý¡ðS.XŸÙ-ŸCeµÒ5.ö|¥ÉdHŒK‹´Á> ÃZì…¨kP}õí•—\o^¦ŠÝË{rÂÓª;ãT¸^(ÇëÐ/O rŒ§ rå@ ˜Ò˜ð§¯÷tÁ§¡¼ ¹¾/;g¨~ߘ¶Úoâܘo‚ ‡ ’æ%¿òÁ@™bÿÞÞ“¯î¥²‰AÉ5Ÿâ1¯TuÁùŒñe§É¥ ^&ýÕ"M)ë}$NÿðïÚžvj(ÃÌ©°ð¨n>Çä0`…µ)æEe6²¯¾ñ‰TŠ+±j&}`îõ`Øp›åª?ôØ–1齓¨VXŽˆtÔçúEÄÁ”ië†ÜÇcÆ [R e1Õ4 oLw Ä•Óh’ÌFOW¸ 0¶dzѹ¾Ã“^y2Òíê†ñã”l檥Y|Èû7iå²ùïßÎìA¸ŠØ¶7dNÈjk’]l¹à N>‹×ÿ4 «ƒSNó¦çæ=²á`¿žMÝÄEPü«Èê@¶“qñý qo‡m&"k—sè”àc9s«Å›…ÙÏkÃMGHy&­I×6„ö¾Aõ_·9kd½‰}¦×^5) ùE=~Â$ËI+Ø·’ q‰ñÁì@ÛcÙ-›èžu³õÀÉ|'NN¢¦"e%ÐèçŒÞ¨ÙÁ"ÏÒX1·Å2o{8€q@ M\í‰ßãÀÚ±Eóc%`ÃLo¾‹ÑÓ²¥Èåb1á«ëú$2;›ìõ>$!1ÙF)Z9pغ ^=¼S"ý‰oÞt¿¿)}ÙÆ4­Žô¸KfÊ#ËâRyÕ.þÚˆ›I,^Ï%AfJð.U ÿ–¸˜Ù4dtÿ…ÁKc’‚Ìd‡Bì·ÅÈV±š2*׋)™Û¡d…óñ.ŽðÙu2í‘{Ý/ v¬–—ù椡ž)ÌD°ú ©56îK”§0qˆI™Tdy n)¡cÂ8{ÜEQkZª„vË» ˆmƒ[>ºtÓ•=ˆÅ½/j¦,z!’K¯U¡ÖßöRÝëíè°©Þ¿þí$)帼{,ÆÐ§ÌfLî¦ ÂÅÊ ¶•Ò0%X{v×+Ž|ª‘“”“•”Ó‚Õ1‡Ï$®õêñm È4Sˆ’óÛ±x?·Ém)¥È$߬,1çâì…ÆêèmÐA]³A£ü+(Ô× #¹ÆÛ™0Å!Fð`àþàŸí[OÂÌÔºcU59 #™uPäÌóXËrÝ]3.×srðŠg Ó˜öÉ>éíÂu ÿö™0ÞYƒKýšÙDÐF¾þN>ƒƒ}C€çBË(YãÒ@ÿqGÝÞôûòHîÁúâ«™«¦­L§ëzÕü‰· ¨’Õ`ÿ>Á9BÓ$Ç äÓ`<•¦6¿b¡|“´¹¢YoK–‡-¡}NîÓ†÷øiSf¯k¿£ (7ŸU Àš©(`3y@5Ä v<'J=aÄã¼·›.ÇE¬•iZ{w$¡k{ÂFÛ$d¿ø{°¬ÈFùÖQ‡°ßçX[¨oÆ¡q‰­kAË—KuU0*˜ÅK?ô>Œ½*öÒx“µŠÁq¼=J”¯„)%z³¾UqNÏëÜ .EùScÛÖݳ‘O’Iý 5?â ?ôW’xÐ|¥ÿ×nžÊG&Ç?,@º]|T ¢`¸³ÓÐÅþG_ÙUbÂȘE,¿&—ÅùÓUüPíèÑŠVØéPN/ÊG4l2å5ž¾Ï6ùË>§>Ík†ž4ÇA£ºDõ×#;ÖgÑHöÊ…±æ4b7ûk£ckÕUõ]: –ïe³o¡°œ‰q•[ŒÒ¾I—ÚëÇ&Ž„…›'Ÿ ’CsëCòìÃ}£5Ž-O€”)\@’,šÕ ¡ß†ÞöÓ“$Øp€9ÖçÊ}äÅ;?l¾s³CòÂFŒ¸'9&%ŽÌáÌTƒ×õ# †Œ¨pŸN8În¥ÑCû+ÙWÿG±µ=84ϧ“ }ü9Õ»»í®Z8ƒ €³‡ÚÅ”½ÏR¬5„îL¸ÕN´h[ÐÇr°LÔ4Ý]ýó@$Ðt{~žÚ=–‰ Åhލaìæ'£àd; ¸æ”KÈQåÛ5c©zÝúà´LWñ•þÊiQµCØö.V¦žÔLFþ±­Ç:ÌNnÚÜâÍùÛý}î&1:â8ä ø;.D3Lõ¯‚÷‰©Ü&çñ`¾›aoé¼ùA µTw86¸CtT¥\½Ëq5f4\7džº?÷ó¢ƒÂ\I¿úÂ-í¢00¼0™ì…ïE®ˆ“±KôãëOu˜§ $ýy¦¡‹ZùvpàPg âWÓ@±\®é¿¢Ú1{Òâ½ßðs˜_2âü0=ã’nÈz›³e£¸e6p|Hõo»»—ö³äMÏ'¯)ƒa>J"ÍùâÁg^Ѩ»7h–ûªì .|&Œ‚Ë“ûÞ Àâ?—Ôý®SKÖ'_ÐέÀ’µ`;'a(³&ÚžšŽå|`+c ÍÉ5îÂ|Ýr=ýë5| Yo•¯ÊD¥”Œòüy±CJåJ.–x¡©nžc åhäe^j“â,Û©FÃ:W8ùõßÜǧWŸ€OVÕÅÌÒGå-/KǪ›á?•§ÇYŠ'iu?ÏÂ4ù5ÇcúF^AªŠ ÿì[¶\\e•× ö®KtKJM ªCOQ#h§µæý\Ý,wzÐSèd x QIþZ¬6’¡Š«ŽI¦A+7ÇptQS0ËÞN_Ò3ý[`B‹‰HSÛ’V³=^²S¸l,CæÊ²Ç‹¤•ó3ìí« ÐT4]ñDsmJ"ÉÜ6cæ ƒxj]·öm㦴ڬõ1 Cƒ!>Os»j‡¸À™^¨hÓÀûþÎß•£€ Q ¿Ÿ|ÌIa a¨Ï$û³Â/g0ÇMÆÿëk´qUä ñ÷;¡™´4riß[@Ž2Wék‰Áä8ZN›µn%‹zV³c !aú²‘“/ÿ¡)á6ùpM<Ò†xô]UuiØÇoúvÖêëF FÒ£†ŠÍ¶×ZÆ7 PœHÞ/xüûòC4¢²¶ÐœYÉÔnMèßzá,RËíÈnê~w^»×´‘ µIÀüåé”Sy¬ü‹¿.¯÷›Ðüü ¦#pÐIuᨼ¨)ó)Ã4Ö<í†XÉ£R=k§Ä!×å}Nck¾—ÎF¯5ä>jr>öÛ›®¸ÆÔRÄ£g¸9X&þÏx`È}#±JÜ9Å­C–1Ùüf³íÇ‘`ÏÀS¥‡ˆäîê‹Ìûä¿ÜR1°gÆ;"ü±ù×õžÎ5†®sq£˜‹Ã6ö%— €›bÃàaVuÆzéAÌ G~ùgΘ45~Á–ß"¤Ž¦S$Ýzä£UewËÎ sQæƒÝm+^•r€qƒ ¼t¸Œ€hÆÝt³ù2uâ¡éÂÆkkÿvËŠèNìFྶ“˜ ú/," SÁ ÏåúáuõUdÑaÑA80´šUàƒb‚Õáé£àÌM&&í÷Wš²õ×ø*”Ž´ò"øjd]«ÕÃ<É ¡‹dzHÒðHH«–Ù'A ñ"<Eh$ð"~%¯ï°p¢k-î’'Œ:¯÷9”:"Yáíõ¿J,`&«·ngݬÆ(®ŽDpÔXæy:\*‡Wj&Ž–Ä9à7áú‹ÄÚGkLñyVÅ€Œû±ÚCÑ!Ð|"ŽZþPVÚ¦¼<ñ'Ek’5¼ÈÝ<÷ù³n–è$[Þ@‚êrgzLôÛú‹ ­Žÿ=ÃÈ–/IØ—ìÀRº©aQ ÿ+`m÷»‚Œ2•ði2°J"Ž ¿c1ÆBGòPNHV_ŽvÍ=;=…¨­Ç¡¯ ×^-GÛåzƒ‡jËW=ím’!~ OQSÑý]tä%§8Ù‘bäÆÈ3ârµƒb DEÌ+ï,wú.¿kÓûlÌÕdE3#§<œ0š’ "*ë3Ù…k`lÁ’‡G‹èÊ×bÉüÄ5G "Ý÷ꑲnEµ ð0 >µþä–ù Q$¿ ‡-ŠhG†÷¬Ó«zˆÄÍ@´’;m/ µ0IF÷]“1QaÈBrk.b8nQ]!]ùÄêæjØW’dùQ‘½ÛJŠÔ¯‘2ͧè‰:[æHHˆƒË6‘ý-_xªSŒ!ÅÑY1¦¦;0*ºŒ`JÛn& d¨”ªVìHùØâŽÉ_mö,–2(tCÛ“à„f ‘Ë“ÃdrLL§€B¢°ð2P׃«GœªÍã©ãS¾ÙçûΟ›”þÍö!ô½FÓzÙÎ݃ŠÔ¡öt–sÐNõÖYos‡9Ë´ÈJc m5:÷uìʘø|OÚ§'€îd¢¾*ÛCàúéÌîžè¨\tgs`‹ý”„¦XÓ"6qV€ÞÐs¨~lÆ“ad6×Ë áí&4[ÔyñiõùÑàviübÐÑ ›j\ÒçËó¿CýÑ"¬›À]rD{ÿB彎uSõe©ªÌ*×tµðÐ]å……4R·Õ]lp4Ýè üªBãáÎTI4ò„Ú˜š:írŠ”ˆJ S´³¶;þŽê;ÕûaiïPOx³÷ëg*—ZáÀ‹I”É ¨ð¼Ã#%b, ·íW_˜ëð¹.¤Fõ6Øí&—ï–‚°Ib­º ä üçµ lõëGµ´CYk'—/¾Öcç¹Ouï NåPD.ƒ °ËšýÎ%мE0•¦5QîjB!,£D[>Ïl¨ý9]ã,é"u¤'ZPônæ[ÝDë4Ž«NC7w’Ì~ºb(iëäo[§óâ¬M šm9uº×:}ŠºÔ¯™gß/0@xzàJ¦•æÝúBýæ¢iÁ.’-uM†sëÊ8~oP§3ü›¨~¹ø ¿†9%SC·±¯X-«{†/gˆŒ¶ÜSYÂh[’çèü­¬+Ý_éCDW»e—ˆ¿t]Ÿ›¨0i®ò>(ŸÀÕv[ ÁÇï™;¬¢^¥ ©:À›\À˜î)p˜í^a¹˜è >¨þÐÏ -Ek„m£óôå|»v¯j(Ù [f~j67yÁâ`nÒÆœN”㯂¯9ÌžÿmüÑxç§$»v9xìIÁ*H,ø°TEÕ@Ó(åöXÁqÒoU ­è`™–„ÍØèp£3t½‰Q:NÂà[z*ø‚ÑåÕ)2‡®à¼ LT„æG Æ@[VÐp˜Ì¼d÷"tý÷vyøó³„ùÅÒa¤î~öº·ý(Û$BZH½lz2G Rn²àà7±Ûc³äð‚£žPeL—?Txâƒ)Ùu€„'rÂâÐB‘I¿¯Ôäœ4"eÛóÒ™¯BàÔ­‘ÿç¡Û§M⎡w9o°>/äo79U)½‰r~ú¡W"·'W‘=<ýt¸¤Žº¤Zæàf¼E‘GâO°pëì­€@ºt¥Lw/žýpEøË®Aà ìEÎ8ÃaV¹Ãr|¦Žjþ¬“ÓI°šo&yÏ^E>ùTpØ|Áª‹¹ |ÆKžv"Évc?Yîmwx—¬SöR;áÈR†u»ßSþsž‘"Ÿßëêb`ã•.þ80CvÈÚãC©ìí<2ßpÎ7"»œh×G"+P[£ñM‹sÚE²áÒ`z‘g:=ö)tp ›TŠ®Ø3Ñ–Z 4I…m n²hþ7¼ 'Më‰åf˃I+ÊÀ‰úÿÒ7„ô”ÕÞK­wÏ‹!ÁÑÝCî²RüØ%Ul/šÀ PÌ òsEð[diRŸ+¥¾`l_.‘}+[âëgßÌÆÛ»¤ó³!ÑU ÀäSaË©åú¨îsÔ'Ÿýø•ÆÅQn¶“él¡72Ù¶ï7cP”¤/”ÇêûUµà5›)øz˶XQ&õ0+c”cñ2ÿ•w¡ÇfSXuº”âý­€ïæ’»Ø fX]àp ÊÈ “(ÐmW·æ.ß¶6ý©$å†;]"šA¢"µ]{GAqIy’VÑ‚éhmsïXVhV‹£}èåOqú{ÞØ×³“þ¯à×­6Ê¥[8Œ*bsVÉG‡vÞ];c€õ›:G<­-Ýé¿Ð|¿R².i†E¨¾8°#?”ËÖC5nŒ R\Ëu'šîf’ÇT* =Kq¸ÃFfq€q’ﬗúOì,ÍÔ · 29lÔ·Çq]¼Õ—2*¾®ëî¹Wv‡ÑiÚ·EÕªEƵխdS? o‡Ãuü\JË²Š¡gý42£©¥JÝ’°YÇÕúcì¾ÙÛL‚S5¾ÓõDÙí?S°ù\2J‚ OðÑ>]w´FE<»b5šî¼›¸^˜‡¾“-mR'k ÂXšt2­Y+’”*ð·wí¹ß;òûÔN³ùlqO¿ <Ïp‚Ä*uŽ=ªóK?,§ë±üsª:ÿ ÔÃ%Fr(Pb3¡ÙVˆ¬Æ‡9Õ¹ù0™KÒ'a;+Ew{º/r°0·R²£®ù¶2°-¿'jß*/ñS|­º*«}ª§›ÿŠ)tÜcH:ôèÃÜúÓ¾ú]eX˜ö~à<´ALÛkÛTGšíü€Ÿ`f$1ûûsô`ûüÀ<(5¸ár€ŸÄ< vŒ½ bƒ‰EmNbæÉk>b¥œ%b‘(ˆ ‚–š$ÞÝ܈¸÷¦‰û;ÿÂ|R6ÿ@†×ï…Œ¯Ö4±NÔ‡sBÀž—ü2ñ’ÂO‘X¢³d¬x*sŠAoCÞÊýE@ >Ü zñþ.X·\tV®ùái‘¦úå>ã´ø­`××ož£vÍ÷Cn¥ÅŠÉçR}êDøæ¤R1(~!ˆÅôõÏå–öæÁe[ÚûÆ_(ñ±÷ͧœXˆÊ,)˜ °3gN&²œl$ðÉlxž@²Qôƒô(Γgë%aÔ¿Hc¹Q·'óË!›  0j¯a]½Áñ¡Ô´ðËe|ª-yÆà\ÈÁÕ¤ž¿*ÁZx7“vͦª¶ð8Ô'œo,´æñÆ7=á„æƒÒ®¡ y‹¾Oë@5î~¹>±Tø¯ôJ¯)†„éý¿øÈÙZ§nE‰‹jnÔ2œ¸ÑfJ:Ãä¢Õ´÷õã`XŠÞÉ$8Úhi”ÌÖF ><@´%¸~ŸÃÈéGLÁ`q¹6?NÌ ^—{”êo- R«ê§+ìe;í" C*V–HÕJÅmŽÇ›º¾4+—‡»„oÇåIóýnðtìøÏ/»z—y jçÜÞ|X52½°ÇxáÑ›¯SÐV4& »Do1kf‚mûÎFŽAD¿éTlx:~¾m}5šà9¡:R¸©óüÚrLLšÏßAfôT¨e)Z€¼sj!>£ÿÇŽz¶¡`™/26M”."öŸ'ÀÁ…åµ™¢EßÅÝ !´œ…hûÕ¬Ï1‹¸2C;¤Þ·lá·È§ÊÜCÜúm.OÈcTÏÄi%€ŒqP’÷@\Åj4 *yiÄÁâN'†11Ñ#ïtéÙX£ÿ¸sŒáæžà">¼ÒV„_ÒÄù¤Ççò’U_{” ɬH!lÒ•a$ÝèM],›vâþ…óÆ‘­±1ò £0àtœ3Žâ§N&Ÿ³¬l‘À¼›TCQ_ÓfÄõÖt‹õóoÁŸ¨PÀˆ€Eþ>ïÒqíQäüÎ+4‡Kó¦./9–Q@Xd¹v_óy¹ðõ`—ؼ¶ïv߯ŀÎ* 0ùe²ð¬ †Ôª‘þ§]`1‰Ö3éÓ#ë;.éÐÑÍ‘I·;?{ït¾˜&#³k¸8:’Þ  ]Æý?ƒI†_‹¢5 E«ÈîÛ=?Ýw: …U†Ñ0m=—Ÿ¢¾{PC8‘%:l2¨×ƒjñ³Goúcõ]­ÙO Ä trS;#žÜµÛyúôI¬‘…éT®öû±©^¾?Ôp|½„ A“vÖd¿çeŠÔ>YD¶ç†¡¾ÆBemwòç õ,¾`™ïàÙ( .ËŸèîéÌŸ·©Ìü^'«ïŽì„öªN¸èã*Ï6zÞÚhÓ‰»Û#E’Å‹I÷Þƒ›h¤­¯"ˆ­nà¶'ß3”Z¿]Ð,(L åûKFâËãÙyõ½bÝí³·uê"92¥\—±2¨Åf*MN©sÔ÷¹j 6ŒFÙàb>ÆÊÚÁí‚Fû…Õ&üE2çê±ÛÓ³×¹sMTðJû[VV!‡ÄžT0eaÄïTû>z;ÈÕrl]è5|Cækg¸&©ýd¢5”ÍkÕÈ@q üúMç¡]nàVƒW'ô0ÄríÞ¸ÛÄUnr³Ö&îÌÁÔl7/íåº@…9Ý õVøžwÁˆw ›æèp붸$Øß…\ï=¡æÌFþl=eW*q,Öë”ì7Øù={­'}Í*ƒt´à¥hlÿàæ«»‘·,ø5B Ø#Q¢›©üž\K5lÐSÍYZ^èf¼ ñ϶ ›æœ³3Ûoºj%X¦—¯C£^;gë›$ìÁ9ƒ§¬%ÛÏA*𺹯¶«Q¬â žY ¬¾‡?ø;!ó¬3‘˜LÒ#µ#ÒÞ'ŸÄž÷j ˆ”AÄ $CsžA]É©1÷Ä«3Ó+L;ãÅEá8-•)’U 6Ž$C íXï6ìÎÐí,n m+µÐcÞ¡l|YF>£!ƒÈün±C8ë}Ð4¤³ÿœmÜVDÑDUІ¢½é¥ÕÐñ[wY>±ƒ£6h˜!]Às}Ž‹lauÔ‡z·aÄ+§£Q¼3â É¥úÿrvõÌ×@sÿ„Cjz^N…9úkƨ4A‰ˆ¬œdìŠ#¬Àƒk0iTž_Pl,>øÝ#}:°2Ø'DSÙí÷ ŠŽü*ë9,µ?¢š¹Ý:^A“ÄçÙvôùi–Ekþñ½çDìçqÿVx_ß©ì°c|“b)²$M&ç™2Îô&ø´Óz¯%½=ó÷n’F7´Ü1ãðjyÕ¹[ÄBæÍ hÄ6Ÿ–ß»Æ_lå¡yÔ<0¢)á{L`šØ/zäpÁ=ûFwê»] ÷^G–x®BØK¸PÔ¶aÀÃ÷ÒûÀÞÞ‹&àjz…u‡ëBMŸÅ´ÓVÇ$¾¦ò|«—À¶'êÚ$*MåŽOb¶Ë½‰=”¶iLå ë|±Ê‰ZÁkt³É©#xôR*fû‰d²šûÂÜI!ÆiB®íHxæv¿¦Í;ÈU<××hØm‚¸^ÆÐ+£ß‘ ÒÇ»ÍNZPMåÉ?Ýè¯Èж³aTlN•gBð³§yí½ü&ýqODŒ&˜aª.§k LxœÈ×ýªX%P¦êÏ¿d¥–ûŒ÷cî ±MÃêN3xIÚ‰È>¢±qfkŒ›³TÔEuø ý`I¢yhX8™Ë%ÐjmiP0JWŒ’©¥+ Ÿçµéáur_•­6‰ÇbB7âòÿTÐ$ild„&Þb6B¢]I8‘Ü­¿ý‰þooÎÑüæFHýéH–»aIrÝ ¼pLõoû¾¸aT¸3Í¡g¶ÔŽä,ÿ»}¤%$Á03q7_¤ú‹©gÉvÁr>^Ž «i+Ü ‰x§öÓKÞ_$qx3²Q+õ‰‹ó ë^(a ‚Ç %Ž€•ÞËQää]EÙk ‹Ô’®|J!k/ò4Áp~_Œ R+6ÖA‹²H©:AñY}DSÒ%íªw_ûôFvæßÊ`È‚IÌ ó•Îð Ðoû,ΉŕÐU»iÐYÛ×óÚ/¹d»|×$ÖžÉX»Ü²‡óÜ ‰Úô"O[’ “•qÆ”/B(xaybÀ¼N>·huIÍ`¦vý˜ÓjVa=:d=ÆbU¶o]i©Ä}~kÍla(# ÅÀØ`›<шÌŒRy… šMfäÄž"i›éà£ü+ºòd­»°TJ_2€ ݒ뷜و‰…ú>çd‹Áx¼’Šh࣭º™Ý‹z–LÈV—n8¤ÜGq?Çýq6/Žý>.íñÔ.ÍŽXÒ09eZauÃéd– ûK“ôÏ?#ïHa³RÑF07²°qöÌÛÁq¹e' å¾'ù‰oŽƒ/}-iÖ -ÆÌ0BS v “ë“ÖÈ(4e!(ºYUƒò4ÄQ¼ArL~Ú÷þ-¿­@¿?Z`ž‡”ÍÚÓËÅñêi¾¥&c¯ãøØÙ:ŠõJ¯X“¶Cu€xèÕÙ™ÈvÝ4\òs„Á0º¨¬‘ ó¸èùV°kî¿Êå4ˆŽúÊQ²ìî.a<áRG•tÿ{æ[u 7֤ȡf¶EAJ×(G%ªAŸjŠo†ŸðwòMŒOŸ¶öºy:0ºd²»>\tP¡y¢Q¿Û ¶°´:cÈ…/Ÿ¸yü ý_+ó—6­sÞ4ޝ¶¤ CÙd|÷Vnfô“z™s”í6;R…Ñ ká½Aì)YøjœTœNŒ4³Ãv1†<àj×5¡WÌQªæÙñ•ݽC+¶\ZwVPz­Ÿ™DÁÛ54ÜÑ!®%«÷8Á<åž³ƒ—H©÷µÝ6)=Õ_±ÃKL «:ŽBO·Ä|rS‚"=X5æjÒçE¯2÷Zž…§ÒÃ%ác*>@ÆôEúîTǰ~ƒvÝ݃r?O„ÕÐ2H£w9Ø@*À({/ÜÙ‡†B´H!í²=ÖnI>éÁŒÍ̦\;F¹”Q i·ÐZпÊÌb妬Ý—v¦±%¯)ä„»wU‘Œîà¤A~v{'ÌÉ»¨á™Z’¹H܉„¯3²Vg©ég%þ¼ùTäb0ÙUXYEŠPˆ'B¦lòU5§r´—´CPMM¢IÉ=/Uª,ØhfútiðòÞ¥ ¨hGÙUây¯Oõ®/>$pá6A-Ëʼn­n´¥Žä3AÒÜJ•ü@Iêœ]ðK’‘f:^\ø2pZ¢9&{£¢èù1×Í1Ùwiﳉò0óÓ¾ê¶ùˆ¨¢Óuu; ¯ ˜Ø¨?¹}¸ã ?¢,QuL):ØÔj°gÔ·ìC¯Å}WvÖX”º6PŪnjÕðâGþ—Ã.mþ·¿£™Q(G2Ù–}l–çB©D%HìÝ–ªdx³Ý`«o*1…WŸdLiü2íÁê–}jÎÏbr±€rB­3”ád'[³EúƽÁè­SϪ…b¢ endstream endobj 2601 0 obj << /Length1 1551 /Length2 7954 /Length3 0 /Length 8992 /Filter /FlateDecode >> stream xÚ´T”]6,ÒH Ý0twwwÇCÌÀ0tIJ§€t§4HH— HIƒ -H}èó¼Ïÿ¿Ö÷­Yëžs®g_û\û0ÐhérHÛAm@ Pœƒ›(U×¼œ@ &ƒîú Åd0Á<ÀPˆÈØea kø#&g tS‡B*ž.n^·€· à…ÿ光䬽ÀvuN€ òÀd…ºùÂÀŽðÇSþµ0Û²¸……Ùÿ„¤]A0°­5 n w¹>žhkíÐ…Ú‚ApßÿJÁ,懻‰pqy{{sZ»zpBa,ìo0Ü òÁ¼@v€ßtÖ® ?Ä81zŽ`¿`]¨=ÜÛ<.`[Äã1Àb‚Ïè*«4Ý@¿œÕþr`üÝ7'÷?éþŽþ ùlmk uu³†ø‚!{°  © Æ ÷³¬!v¿­]< ñÖ^Ö`k›G‡?…[¤µÖüþfça »Á=8=À.¿rýNóØdyˆ,ÔÕ{`þ®O Ù>vÝ—ëϵ:C Þÿ¿Öö`ˆýo vžn\ú°»'HYîoGóߘà‚Â<;äcëÈõ;¹ž¯è‘û7üX ¿Ô `ÿH¶=þaú{X{p˜'(Ðÿ? ÿ½Ã俨má‚ùïì0Èþ¯ýãÍÃÀ>Sà£ð¸Àß¿VæÚ²ƒB\|ÿíþçr¹”ŒÔô ØþþÇ$#õøsð 8xøn ¯@ðqøßYþáÿ/îP-kðßµÿQbÿEá±wÿ¢áõ·&˜ÿÀŸ }Ô1ÀüoÙ›ù¶îÿgñÿ ùÿÓüï,ÿÙÿo= ž..¬Ì¿Íÿ«µ+ØÅ÷oû£Š=á¡}œ Èÿº‚þbuØÓõ­ÊpëÇɆ8¸üÓD°‡Ød§†Û:þ% ÝÁcz0¤õÿ~fÜ@àÿØgÍÖùñ)ñx¼©?&Ðã(ý÷‘ò[¨Ýï™ãáXÃ`Ö¾˜ÿ¸ãøs?§Èç®\œ(ü1ðH/`…aþ¾O>>×ãàºZÿ†ÿ i¸þ"ù à²?Šý€ç€zÂþ ¸ õþð ¸ ÿ±¬†Ëäõø¶üƒ<ìñ¨úöÜ.¸# ô1ÀGÄúïœB.?ì/࿚`ë ƒ=> DúØ¡íÿ¼B Èsñ3ÔV4Ü©1¼óª^šÜ›c{B|†aÛð5 ‡ÿ"¬ËóZK]Nè:ì§tÚhÞÊWyæ ©%ê;ÿƒöf´—ïRµ;nn-“u¦¶;0>M–H7 RbPpèIíܹ„8#µ#t«0¸{ áh\y(ú4 V-G~ÞÖÞ©Pź­šæˆ×3 )Ÿe(´É#¥E…sP¢³âŸøàÎ^üœÁÏŸ| VIfà <Œç-õ7ù“p=ç·Z­ÇãÑCFOfBJ‰t?>Åè/³›®B2ï_Qº2´àÓ.VJÿ”=c…s—'»¬ iíoð_|ϽUg""ØJm¨l%´„ÑjÕuXÆÀxA”»ïíeV;ôÚ;eP, O7=æiRžæE{\5éÁæ-Ì/Qñþþ±ä(ùµ²*±ÓÆ=™á-ÉòóCNg/Ù±qCËUþ†ør‡eC“‹ ßš·A+æ4ª´>#ýà ÑS0ÏC•ÙÒ8I…K×*¹$îÑO$JNe,Чìq˜ÄxÞ'Û$o¥PèÖ úç"Kpµ;¯ïXwmŽ¾×ª¡u:í IY!… 4Å_¢#Ê0uÛI޶ĵÄB;:-"Ú3F;Z$üI3Ú~ãñéÙµgÐÊ<2W”:ˆZ–‡Í?ù³).=kóa@éÍJ¤3Knk½Ü¯ÃáQl^Ùé˜W1úé]¨rÞc×'{©\IýiS1)ÕÅ‚Hž¯tyν:V'B±ƒ¢v|á?ÇTíh?lÛÓ˜äNFHrî· —_è¹¾-’¹sÙQ:Ï)“×7 7Qm¬´Ò>÷e±Z›"Y¹r°‘)(g”Âô9†T‚Èc}.Žø"UŽkž&ú÷.W7]¦f¥= ßÜ£¿oÞ>}­)¥~SU,i–=†ÊL®F¼Y™…îÇ<÷\UCå6ÕjàMÉtàgC¶¢Riôx-r<½¸lÚA«ŽÎ•TÏ9 ÌbÝc#©¬à™ö{ååVM.Úô¬VL8·(½KèÈøÃÓA@Báç7ºB¶¢Àù¥7WDLC e:º¥Ä3Zco3­_*\ìÕ£1¿Êm$mþ‰C‡ÓÞS¾JX½Ü^µ Ã<¥LÁˆ&Õ÷,çëÇ-êÀhŽ×"þÛ¾ÒOèÛ\E®C£™>–Í”8Y˜í? ¼“øêq÷ ”>â0¸á‡Bþòv•ë•çI+‚p‹g`J)(ù­²/ʤÛL‹=e‚Ý7Ê‘y m®O3ÂÕbù8ÓVß{ŸZZ…gºŠ.ñy&YÛ’"ûÀjhºWÑÕd°e{:“#U•ÛOЃ¦OuÚ^û‰9ë¹tÇK’ål˜ÓܬfÎ/K´¶¯}½¦Š_h wU<á$.AÁÝüJÙUøÕ c¡~á3"]ãí1(èÙöH#Æ|÷.6P±Lp×-)rÈyºS ØÓ°*4O'ê¾ÒOá¯{S%~\"2<ÇQI¾:ëGE-€›œKŠì°‚ϨýµÞDÙô­˜aš•d }4ˆÀ•fKkaâàHN<ìl"'Ãë~e˜vgëbs w‰¸½a¼"„Hc×ÓĤE2WMÇMûèGg±ãUmù'ÑíÛssóÊÛdÛµ7ˆx6«dÖèlrãUêw‹¢ŒKOƒ/«ÅWHâù¬u%fÁEûauy¨gö7ë™é½®£_Ht̼U¼0&uÜ~ÖŸn3E~8‹`FÅëãîÛZë7EÖ>n¤fظ}‘_d;">«A¶µ3ºGÈ}“­F`o©z®Úrt¼p— Â‰àxÜçK»äZÛCcI·Tîc3}鯝azϪãë‘ñŠþ@Ćë¨I `œ)ýAõ2¿}ÅâzÐkÁÚêKŒkô ‰–ÞJæ„qlRBíAŒè ÊvE™ÉYRûœ!—è‡6ñOÅ{Oâîš‚«Kßa»ÑÈD$´¼KL‡2€Á÷i]zBè}^ì Œþ ´Ê´Zžú.ØÓeìÀïy{ù›Ã_«Š÷Ñæ=÷ÑwP W|óp•,,Bó²“$_ÐÆ I7ôG"$Ľ_S½Çw´l®7œ]qßùØ·ÂlX¹ÎBh{Ηâ‘h¹ö>÷ m5×þ¨ ûשâ*Ô¯»~YyÛ;ï BûŠ]Þ^‘- Y¶£(V89MúÈ*èUÒvr{Qä2f¤Hʽ2,//z7 /@¶Gwp¸E½\ûŠæ1±ªJéJ™ˆècz1LÃi"ë°*½\M=~t.&ì5I%ÇÁÒðW[a«—è¿+=cCêÿ˜ž~Ñ&¢Ÿ0öåÀñǘXù*|i!±Ô‰[;¯–ƒ703­˜zE“PדÜ™õßÊŸým0³A˧ŽoÔëeìK^ÍÝýáÔ4l³ŸMÌËΙh /Á} ua¯Ê‡Ï4Äå|Ûy­ÔH܉µSÉ"r–UQeíWwf…¶$Þ¬–ÕºzO—+†‰zˆuŒs°÷”…¢ÃÑŠ$®¹ÇÁT£†uýÊ’CáƒM#e<ä‘}i'Æ¢¾3¡PâëÅòw 7ˆNÑ„àomæ¥5†7Úµ}¾–ÝdªÜC–RDJþV>!ßð}Îê1-Ì•[áÑÇÔÙ ±Qü® ù ŠËàQ2W0¯ØÏû9lëÅ=ðCz©ÆÅÎuùý—¦{„< eiâåSq¦#YD”)œ ¡Š¸hœ¹äÜmpUhÛ;#“Ù•UÂtàJQx·¹þ¸×–ÓFPe11°æ} ¡îfù’¹*AŸä‚qtl"|0¬l ÁoYO¢êÓš0ZŸPf@eXó £p‰hRtÃögË&î×­ Ø’hÂ×µÑåŽþßâ…ežaªq×^ÔøB™µI“é™óõæ¼5tûˆìš*eBAÇ´qß'Ûç†û5¡Ì>»›²ëG¯:Pùµ¨@X¸ŒP—NR`ʇK¦ž§­ ÁÆ¿& :4 ‡!à ±áç.C«8èNyâ¢>ßãîjγ?ôñân³ .Ò(žÁ;ìUÌÉ"˜Ñ/>ðø¯°€aÜñB\év9ƃ#ÆÜÒbú×ó¯Æ÷ôïÏ¿ÂÚZ,8ÔÙb&VŸØ|mr rYNöæçÄén¶ÆÓëBO”úÌRò¦Ÿ ¿€æ=ž¥“0Æ\£ ©õS³`Á:qùèïB/ij$†ÝÛ•Â<=j烙xEû†’’SÆòtv4àÌ$ L\Ú*ì˜Ï5qÞYáKgÄBŸùØŒ~—z>•­É¬’°ÚvÞESL v´¶µáŸ x7ë O¶˜g1KÒµv¡Ð}¬>¹z"øq9’@nΑ.ç9BzÛFõèü¡‘øòR©8ÛÔ8êÚˆ ¬T>Iw‰­XšÃmÁl&YIìF‘H7*3æ3˜¢Aƒ2ò‡·Ž¼ÃÊëp¹Ó,ÃI ¯0_ÎuÏ„ŸhG{Øxu`ÂÉ£¦ú;è%|Å86¾ÅTËuS¯(ɼ¹7NÕ:ÆÅÕ·µºŠâ0åúùYRw€DáZ“O¾"83¸v¨¿ž£Ÿºo¿¸Z4ß)ƒûÉç®Æµ´£ÿ}äÒ¬ef$J¹\‰ŽõÅüÕ:„¬w‚uNü q³Îk=mç.åpx÷ËEÙ<|Ÿòã7ÚN,zçºQ@¢§SH€â5k«jÆ)ܧu׆èsï´ b*£ÁçRÍ vÙ^Ü©_ã± K¦iNñÚ*?ãמ{J3:)ër‡$¤[z|þ zG´°IÑÏÔ®/ô}*Y2·uÊÜì1XÆÒ”z 8îà©DRt…&ÀÛ¸$*#KRÆPò—X²íEÔü)ûþ¥0ißIO0ÝäÙ…ÐcœH«&#B‚˜6·¥ÛKçÁ¦!1™—CŒ_d—’Õ­îßp„··ëÉD­®â]ßbÆ“¾JȰÕq(bNÍâãPømä\L× Ûð:rœö$T¶=O™uV*¾|Ê|Ù¯~sœ#¦¯PÿéhýmåB‡€-|€ù¬gŒª§ UÛu/ÅÕ£ƒ yà]¸…öe’‚HÍ’£÷=8úÙBswOÓÄûo®Wþûg%É·_ˆ¢”yE'ù6Î=Ø>ílG“æöfö.Ùi{`ït:GQFXê²…ùÆ"¤Ô—EœJø/ŸPË•ªò" rPø0ÉF$E±'ÛÐPTâ(Ù«IOݹ‡}ûLñ®YZu?xBžù²´ ‹¹Zj*,8ŽU’^—/kñM›F¹ ¿œ„XÛ %§þ$3f;Τñß6†gi.I/²dNt]&.£GÁæTa®.-Yè<˜b”ÿ6C™2YZ `w‘ÌÚšåÜK7û¥{¼ñóùö"r¢±²ç¡/©‘G$Õ8weO÷Ù§D‘E”Z»ºoîçô*U(¿ j[þ2îÆÌÈÒÞÚßË,ÁbŽÂ/~€ß“Žñ7ºéÆ¡¾é•mj,pÁ EöÙ¢šëÌøûÉ6 ½|'é«ùN÷3çÛ=:«[ÖæPÖŠZMØÇy,nŽÆNEk/md´ìÄê¾–ZL'°ÏÐàözÍm».`©Ð$7°ŠÕ6pé6"Žô!Š« Qš.ëðnü’æaÓ³; Ýôz¢ €!‘bú·pbÆDC#TŽœòkß7jGR¢¸âjüÕoüÓ±œü̪¿ˆf$ØÐ"ÃØø:|ç¤*ˆÖPr>ÉÌ›S·u¾ºÀ¨¦ä°º}—ý*ùôc2Mi9G@å…Ž:LÃŽþ™SüåïZÐóüw5ñGÌ œVœ?<…÷¤bZ‘žŽGåíþlN„po;p!~SË Ü//è ×®[„kšõˆ÷‹‘¤Þ}Þšž¬ÃW8ÎO|lcr3 Šg{…«•úÜ…êyFK&ŸñžMüø1<—}^Æ¢›…Ê6B"ňÛ“l60eÞ“kc¸^HS¤±Vê¶HdÝ L±OìtI\…tÌ`ÊËÅc7»¡íÊÂDNëÏ(ŸmÏjã!‹o=IÞ%ÜÏ5|KŽD,äO•ì*«¿Ð*Úª ¿'ÿškZc²^…ÿÌi(«9ÀI›zdGVŒÈ4¹pLÝÚþ%áNp¿üFGÎogxû×àÝ+«Ã‘ERŠí¤$²mà¦6lâÀ±ïú$ì:éU]WÆ7òQ«4}Ž9±Ov7Xh¬øO£?Z(¼“³¼6Úú€-ò’ççË07ŒÓ¼‡ÄòÕ/»¾7O‹—˜¾•Ý ø# o•6ke«–wKqR}15úY­;öÔª%BŸ´ÐPìÙ _uÒrÃTŸiEvlÖ^æ1•S:;–¶_ ¿ŸQ |>“4žÕç8MIq˹âfE§-?LÙ–ç«Z(Eëß_ô}çw¨ùBœÀ`jוããq¯—N“”ß`†˜Yöƒ ‘VÒ°OÒ%ìð’8ÈyèP¿™}+ҜݵxÐǪó?‡ÛHÛZÚj5ö]No%U8?¡£wèu;V´FÇ1ô«/rŸ¾ÍóòYVô ¬~Q*À/“cÁÖoêÒûé’VaݬŒG‰W½GÍ ·ƒe«!”¿Ø9èMŸ˜±,Cvãjü©z]gü3W+ÿ·",aú¿)ø1ñSôïòû]s'ƒEøvªd¨emŸ¬;/T£Ú•–2ÙÏ"ðå£("í® ºW•kï¸9Ü7%ßOÝ÷4DÓ½ˆW$Ž¿ ;ÜÌc¹ªÂ{ç}'*[è3ÍÚ3Û“ÏœºìôÚ~Á6Ì X¹WPë6^TgÕ1»ì›mÿº¿ÐŒãØm‰°,ù[ðg"ïe÷L‘ê² Àíѹƒ Êëþµ‚AZN£LžWÕq÷ÔI²AòÛ»‡tlÅ Íï/߈‘B[´Ÿ#îìm§Ö¿ÿ˜…g*ý?PXõ„gsAÀÉwýÒ*±ÄoVrOsÛêQ ->àœVÖ õ)ô[f~[ö4Š’µ VzÕ>~W#¢;ÄDR¢¾§Hû4›PŠwÁÛäChÔ9¥ü¦¿UÅäá'¿AŽë%£Ð«,ô1æó¼1öÁ¹&dý°oCl©wÃ]9$ü5U‡õÍй&(õ$ÓImý x`±l." §ßË’5Éëm<â2aûËŠ‘OŽVVd¾'èǃíô™ v±øiY/”(÷ ™ÞY¬ipg´p‹žjž‰£×Ñ +r r†ÿTVrú°ßøÙAáçDeÎy£¤;¡žã¼Þø nê+êuSG)î|¥Êb$¯#V€G(XzO¹š¶È³Iˆ¾¯¨Z"ÑÎ8ijâé$9jÕ£â“ù¯VˆA‚cÖüi4d3äG>&Ûh½ PmÀþfîáÇI]7þ¾/Ëäðe’É<ê·Ø³t‡®­5îçËù&3£Åy"0½®B•HÅŠûGüHx^ÒK¥‰ ó+v•P…Jnq¤L[ìePÚW&– xrøî™Rëá÷c]úa'W¥{Ô(ÕÜUªëÿ7Uç,AÕ$§ {ô§¿â9ª@ydÉú¸¯30¸µ¥—ùBGD©‡òD±[.39n4Û£Ë-ˆ+®YÙÍ–…%”Ôõ xX±¦×š\‘¨ÊwÌ;1±–<}?ñr)îü^l²öà‹ªL¾ò=*êî•Ê9®›´B˜½Ù{ʘQ3ŠÍÓ›’†ÝÀ²2XÓˆ½±¨®'sáîKEùp™½ÈbŸ?”/ÈÙZßy½qrN"÷ÊêÖ‘ÿ~@DYƒiPíÆ÷ìþ ËÊ«‰’úmߘ%Ÿ ùê'g|×H{US@¶L\ ²Ü–Ãa±Ë M°kÎÎqùVtÎÃáÆ™Ž‰Ok­µ«¬áù³ñÑéÙɞ˜1âmç­–ßñÞݽ°kÛ•°Pr"âùQÁ]r*¥¦`„]KÖûZl–»åltF9 Q».¡+ƒ¡ýýQ†–á'®O‡Fj‹mØ)lcØÔäIé7k¼QtzU·IÜ9Ë¿xEæ•V˜±½/IJ ¢É͆ÅMò‡L®CÄ<Èé©äŽÎF6U]’“\Âzu&XË]x„Y²åÏ;Ó.…ÕâNéñw³‰>x)àÁÉ&y&z¿£þdrQ¥¬‹}I‚Êc³Š-ýJ JL¸iÎò!„.’d‡e·€°¹|ã]¹ábfºsîÐè7‘+øʪհ½˜Î0ÇåÔÉÁ2GO…¾…(†„OÅ@D<¢s®½õp™ƒ$éÖÇì]qTŠûóóÁJT–šÃ¼ ¿Ü‘\i¼NQn1Å„‘ }D‡wçÄdOTæPC™l«<öó3žÓ ‚ëª+9JV (PoÀ°&×¹õ/Ý/cèÉ’¸~ÀL¬sŸœºJQ¼£)`Þ‚Ž–!”ZŸØÚ*-¨3ôQlP»˜û”Âð¾viâJ"ý4'5X¶²qR3â¿ÅSlª¾÷Ûûþ’áPíaÕȧ gK+gzïØ/¯)ÉÿFA’·™_x#yµ_ý§€)=ž ^Œ< Èc½yçë™·•[Á„!Už¾|Ò~¤[Ñe‘ ™,IÑ|¢`çÀsô…úÞ™4Õü ö6RŸêš‘7ÓûæÊ/M4//L<²ÓU2ø0>åÞa Vâ ú†ÐI|½\s—$Ûu¨á°G Ÿ©~⌠ŒíâHnmOëôI5†Œ=¹‰É—ÆÙºæaÓsùAº½ep›\ë§É¹ÿyzÐÎýÛ¬sgyž%>P¡éÍB”w"W/UÕaŠ„ó$’D¸¡=µRöá÷¥Ú±äÌõMÌ£Bí–uæWƒ„-¾’gˆ£²¨„²ºˆºƒûyˆï•´‹ÂKÜ|èÊÇø <‹š©Ï©ÞuÔr Zþäb§£±òÿ†c˯3Wy’\ñôò%%[å³1óÿšµU endstream endobj 2603 0 obj << /Length1 2340 /Length2 18844 /Length3 0 /Length 20208 /Filter /FlateDecode >> stream xÚŒ÷PJÓ€ ÷@pH€Bpwww—à°¸»»»×àîîîînÁ î~÷œWrÞïÿ«î-ª`Ÿîži™î–„PN‘šßÐZ(bmå@MOCÇ”V”¢§ÐÑ1ÒÐÑ1À“(™:Xÿ#‡'QÚÙ›Z[qüÃBÐ¨ç’ é9€ ¥­­ŽzF= =+€ŽŽý?†Öv!='SC€4 @ÂÚ hO"hmãjgjlâòóŸ2r=;;+ÕßËü–@;S=+€´žƒ ÐäÑ@Ï hm` tpýŸ-ȸLl8hiiô,íi¬íŒyȩΦ& =ÐÎ hø+e€Œž%ðß©ÑÀ“”LLíÿ¥P´6rpÖ³@ S •=h‰£•!ÐòP—ÈÚ­þe,õ/*À¿‹ §¡ÿïvÿ^ý×F¦V/Ö30°¶´Ñ³r5µ2™Z²"R4.T=+ÿ õ,ì­AëõœôL-ôôA‡®á—è2üw~öv¦6ö4ö¦åHû×6 2 [ Z[Z­ìáÿŠOÈÔhª»+í¿×ÜÊÚÙÊý?ddjehôW†Ž6´ÊV¦¶Ž@q¡Û€DðdÆ@3+;h º˜Ðþå@ÉÕø·’þ/1(Owk€(  §©ôÞÝ^Ï p°szºÿSñ¿OO045pèM­àÿìþÅ ó·3u|§µ=€î¯Ÿÿ~Òu˜¡µ•…ëó¿˜VBZRUY”òß)ÿW) `íp§faP30Óè鬠žÿ»Ï+ðŸìÿ–Êé™þ;ºì(ned `ÿW êý'§wٿdžð¿d¬Aý ýiM:f:Ð/úÿÏCð÷’ÿ½ÿ×.ÿ¯íÿ#q´°ø[Oö/ƒÿ½ž¥©…ë¿-@ýìèš ikЄXý_SUà¿Zhhêhùµâz á·2õ95; ˿Ħö"¦.@C9S“µÒÎäÂÂÔ (gmoú×µ ¦§£û?:Ð䘃®{Љý­‚ëÝ [Xþ5 Ì,=;;=WxP€ˆàNUC Ëß ¥±²v-€RôYÛÁÿu®,ÌZþ¿Dÿ"­ÀbÐ þ!6­ÐbÐ ÿ—Xé´"ˆ@+ú‡´bˆ@+þ‡@Þ%ÿÈ»Ôy—þC ï2ä]ö¿Äò.÷‡@ÞåÿÈ»ÂyWüCLZ¥?ŠEùbQùC XTÿ(µ?ŠEý¿ÄŠEãÖéý—èA–z û£í¤ÿ‡@‘ëÛé˜AO•‘Ã9ãåÿš©ÿ*@ü!P:¦vŽ–F Cÿ¯WPWÑþA^€ÿ@PŒþà_dú_dþ ­íþaŠÅøòiò_d•ÐÄÕÆô ü±ÉLÿ ºšýA2ÿ‚êañågùA7í?vݱ´Ö|ƒlA¯ð?Ô Ømþ¨Akm@¡ÕÿT–‰þßÒÿ­+=èѧµý‚²üG èA)ÙÿA)ýY TZgë¨A):þA):ýAa;ÿ£ü Õÿ8:P|®¢-uÚýkïÿ¹ í@I8ü}[ƒ®ˆÿðß2è4€_^°6à 0« h{¨âÿìL½7ÁÀ„4pv«º+Œãt ï'Èõx͘¾Äß5·þ¸…zÂPôÞh®†Ig®½é‘ι\×e¤ÿ‹Êc •ûéÄ^Ê‘a_²³SC—ÑÊÐó¼IaÈù†o–‹Êöro>ýH”ë[SÅ}¹É9 iÃoDð‰Èpl66FDð€vþôö jþÙ¹ñ¯öW|§ñx"G)ý£ Ì;+%T`¦Û)Ÿ‘l$oÒy’{Xp%u§³$»=ÂØÏ1d~7m¾dúöcŠ¼Äœâ»SWbWgju(ïÓÑÁRT(uì¤ÚV ­j²’è]Œ»Òý±Òæáç÷ƒbLÍ– ºó°²wÊê-|ëfG!×ZŒÃç-}¼XÊþ•ô¤ª~ 3«er3üÒåE¦Ia´ ´¸H…ôKéê\åÃÅš'ÍVƒÖ1w®€öê¯lx:ZxïÝ¡²Ÿ`½‘LpóðR e‚>1‚5ˆ¸1" $ìµSúœ_tm¨ÕêD¤ÞÌ2FNk×µ@…¸ ¡ö xµúé4NÛ-üp´¶µ àï3­Ñ¯jËÙZ5SxïA>.ú5T¥Ôä¨sVwôê¹ÃQh4v‰r|8[#-ü5z­2g| äÿi´ç,ГþSö¾¤ƒMú@Š5,UAÛ·Å‚ñ$\¾Tß›‰o¦Å‰Ù—Õ&ßЗƒIÑÜ¢Þ~&ÓÓ›ƒëÕŽæ—\œpô!º‚¯Ü¼&5Å~0gr#ˆ°1³ý…|í–êIÔ0KVØHÔSé–g¯öæ1d~dmuñ@IâŠÞÁ)ͽü Ÿæš/’cÖmý´üÿÕ°Ö½ÒµsV$âEÓŽ7-ý诳ìr‹¼Íõ8®ñ}¼‡ª’$-!v6é0êUÁäø £X Aªèrö#Ê9"8æìw•࡚¾noñ˜ybôÜv]ÔÅûZOËúgöçè"g22Sùp‡x! ˆ ÷6Th‰Ü]ßÌ=…wK/ì 7tg¾úÁwíåTxþ•ý¶b Üð`l~êíPn†&mìvuWýL‰>x¥m–WÅl¶lßHÌh¥ðÒ)ø@{›8Õêø“©¶ëL”s{̰»EÞA¬ˆ>a­hg™W³ûFÚï‚Íóïð»ùV•‚†q.FµÃFB°d³Ö$#ç#!å„l¡)Ÿêy‡Ö5RfáM)Sìæ•2– çSD2Îä òNBŠDVϬ2±µ„âæ"»õäÅŽÚvÆ`7˜ßÈ„‰ŽCRz;ÍEø×2åW ‚Õ—‰­»ÅƒÏBS÷c²sKÀñ;e™x³6ü)f{'·|Œ8i8T·ü$Ó:ßj RÎÓ8‹J¦×/qš£XXvæfv¸Èþ&²¾6ÃA ÞQ’ —k={€Ø-+¶ Úþ¾Ð›–?‹[+CW ï«…L}ü¤{Øù4Š…l›gÙ«žˆch•°°³ÖøÇLèó[5u ¼k'Þ £`ã:h%Mþuóc^˜u]tžÌ¢snÊù#¸ìŽ|Ññ¯ o¾n*KmŸšÎ;y%[a»0hßIßH¯î£¿n*^Ð[Þ:‡sqCÝJ4Fø¨ÅYýøÙ"0‡1hU[͈E¬±Ê2!B®Ÿ'VØÛƒÛOŠgè‰Ñ I‘+³%ælg癩EìÛÏ(cOðr[¿ÌÖ¢]T u¿”üYqÉXüýBаÑ$«‘ºê)Ê–FE½ÍȰçvD¦¡œ[”<$´êÚjUg™Qãë]ÆXë5~¹ÔB°n&ñ”ïÿdÏ"é\›ôl¯!„ó ÷Œp!-ÁïBf }cÑ’¬T»Ð~¨PÞàƒ¦²DÕ'öÏÕ™ioµ…”*¡OsyùjI©¥«ApM΂ٳl¥ó83©ÒñJM:í]ïÆ>eΔú<­ù<èžsZŠ@8…$Á­úñÕÁþÀÎ'Ìuc•"¦M›èÑ‹ç¢þÛ„Æé:ÿ´®Â GÂÞ“órºÉeµnú"õô™›ê©NÅw-t9óÑ)üÆ5®w¯jLðÒH½jÁfù‘¾aÎe¸D|-ÔÖçôWÊô«I î,ž9 ºÄ¨]ÜQÍ^ö»sA/–LÏ…ºl¾¤w"Êú•Qæ**=‘øÁA§æ ¡^İ~›ý¦mÊO1Ï?é…ùfŸîðY¤½}{ÿ$I‘zèÀX2¥­©Œ[€+‰扸BüqƒÇ–ë˜'c‡½Bêü€FåNýõ £ Åôò˜ ¾ÙL@[RÑ^cH²þÖÂö+x2úç%®Ù:›ÉåH¤ùÔPý_…Gö‹äo«i‰ô0œðâJƒ4…b,{âáÖ´~Œ»÷ •âhRF†0Úʧç \D¤YÀ¶î ‘G%£‡v@zôйœ,!X¯WPŒ7o’õãQ#r)$³ä8¥jØÒ%g›2ö(j†èäzò–ç ¶°÷h¯ä´pùZù”¾D¹@¢ìˆùî,$Úì~š°º;p‘[¸Ø²òuoz/7*Æto1/G= ozð'¿­å‹¢GÈô²’$áP¯Þq¾m…Wá=]i'æbÖ>Ú%¨æYáEâ©7• 8ºú÷¿^åîé±÷Éh¨bØ™Æ3}€-Å¥±l4)}lÒ†¡'Ÿê2ÿˆ  õã8÷P;AÓpPÍ–šoѻؚ Tñ‘ÿ¼¥íNTÖªu¥˜•½™ºÒ5±p™jÐØpÞ#ß°ÛnœÊ BYlVI;zä"k àó`ÿ‘;½™B²o×… ”8RëÆÁ²d7˜Y@¯ØÃinƒSï£Ðý½1ÙÙ”ôõahбrÙdv¾™¤ù ±Su'ë€æéï»Ìß²,”fm5K„‹BÅ#¯‰ã—^5üÓÛ_¢Ô¼÷ü¡ä~¬ÈÆ ¾U·µe^©u­] ͦ2ÔmyÈõZ]"÷|_Kc°9¥dbgø¹ËÕñôsȉO°v§wÝ·ÔPÛ$9¡Ó—…tÕí'DòãèKÒ*ÖË„¶Qá¢?GåÌieàQj—í¦þˆÁKNCáZÃçÜN×ÃÏA*/µrËÞ#N×y[ž8¥8l}r¼Àž¨-9nç룸ÒQ—0ù¶ƒ ‡"Á¤O.»ÁŒŽq%‹,ÌWEp”LÁ:…wé¿/õŠ N:JS¸´^ú…Àý‹„Óð°åðKLu GDItD[Wìð]G÷6u˜ß&€« ."Rƒ¸俯öÆGÕðH‡ã$xÆÏ o'Iq„‘—×ÂìT¬TRb¸¹{º12Ë_Πs4öâ\Â#µ4óo¾g/ØùÝß½p‰ù?qGgý0„Lν䱃·méé:C–k2œê3¤Ó¯¦ý²Át»q¯Ôa©ÏyvvÀ£¢¶Ú8ÖŒFÌÞÈÉjõ¾[¸=¯‰ÎÑ:ÜÃåjÍhô{¢_Vi‚ * ©ê¨#q wT±Iæ¥ó£É,‹W†¶‹9x'oÕçß°0FÊ"~)&Ú¢Â?™qò©…2•¶Rä6¿ÕtùU¤ñÁ¿/©ÚŽÀ[àâ³.<óûHÆxÐÓàRçÂhò¹+Kø›UªL‹eZv©³fКëü šNC×î|‚ͲM|>ŠYrú•¾¼HÏ >cÌ%§?ªQR;”˜u ]·Q~‰óQ›Ã¡…+&þ¹åoâôºïQXKS“½Öw{èn¡nVé„®¡d÷µæ,M08Þ`ê©J [‘)sV'n‘¸V{ÒŠ3DaÝö Øœ–‹>©K¸ü؆ êÆç]Eç<`Ä·Ggá_vLæÑ1üwÌ,ŸPéá±<‡ëØpàÇ×vv•:_¬ç­¶â MåsÖ}õ÷ðØHF'Tc?šš;šÈÙ⛉6þp6w–Ud¾§˜EG®ð‹÷¾ldú &O% b ×b—3 5”&îm.Ïæ¶ä϶% ©ËvPò3½)X"Q,{VÓt¦0íìóá?…±û¼µ¨¬;T²èL倎jd„~¶¤¢èÜì"µWx?½Œ[¥\£µø˜Ú»@tѸ@ŽôÔÇd,²ýÁŽ ½p·\ìˆu·/ ˒ࣾ¾UíÌ(=YÍÂ@Ý ‚Ÿ— D±‰½Ðñ™$HbdïncFz)9Ž×½sã.7¸%í^v$¤O¶ûäúAm;ÂR}Á¡Ó7‰¨OCÜþ㈢-̽‚æv8Ó-†J":éÊž´,£ú«²Þ|ƒ“Iı5)÷ïΘO(à”î®%4²z–Ÿ*;]ΧZ q­´§–ЊÁ‘—Ô¨BdïY^°ßO’Hw¿ñImú_ŒÔPv³Ë:ºäç™Ñ`z^W¸[›¯dn_ÿæt¼têFáÂI)µò+ÇŠyMIw¨Ëg8œ)ð©Ú€µ©ÉÏ_øpw%&Ì|·»‰FL¨~M2ÀøÝ^vÙ8æë„˜-'Ç/5—4xZá$R¬’_^õ´ˆV Ó!Ù½¼ªÑùËÑfú5¶æÓŒœá›^brãÂ^/üF`rr{kMŸî]³äWO§WÈöèÎ$<©oæ0 È:{¥NÒºZ€Ì•¢¨‹ùuz*NŒuÍ=s±Æ}Y¹ l•4€©‰#lBÏÖg-w†P÷m <ð‡†Ç8³Â¹9ó(Sº5Hžâ³ë‘2îul£jÛsLñÎ[  õNõŽË¬qã-gÝ•U#w-Žë„~&>’ÀªxÑ¡FaÙÒ²4Ëz©¹—"à¡UéߎÏpiú øÏ<ß¿IÇg×yÅûä<1b¼}"Ž6ꬒNˆån^‘¡Ë]¶#ÙRº|};¹A.b" ¦Ӄј½„·Z–Lý$÷‰%¹S“Ý•»hw±j>P][Þ]­£QxÇñ€î{]ø‘æU-2d‹Jdÿi]+^<л“£ß!©;Ó~*Öcš§g 6¥…Ëágþxcmé*{ŽYÍqÖɤO{îKΜÒæhcïÁ{T;Ò¥ùî##+FSبÇDä$W¯=28Û¬ù1ýµmÊx}ïÉAHU )6]®ˆï¹ˆôSºL$,Õ&KªŒx„6ý;xÞ™;ÕqãçG諺ÓX+‰¨²Ó{ÊÕK**Zn{)Œ±زז)åºènרJ×êAaxÆÙÚ»V Œ¬|-ƒÑã{®„Ÿ>Åå,Y\à|È„B±³—Æ%ÃE. |îÀŒž`=ÛÚ ˜f WCÁ×½VüÂ1hh¯éàº"%zŽò[G€@k0&Û?+˜š3¥ãS—‚Éñòô„=qéáÙOHafýŸ ­ÈlÇœ‰Ä½Ûþ>ËôKjä¢*Óæ§q‘ñÍŠ™ƒÂ=•9…fB­¢Ü NÂ)þ)\º˼ ž\ÒtŇ¾ßáØÞ7žn7ÜÚɽcì S<O™í‚Ý{JèÊáÜh¸eŒ™H|8ÓVæÍ¡%ãÐr:#@î«§cš æd‡óT辜’a~“Hùaî°–Q17MxqÚ}ùíbâ’+=˜u‹ ç[¯n]æ§©P5Øì¹^'íªq(·¯!¯ßÈ;{©åÐàÕ¦V0[lÑx–x 7Ú(±àÎHFµÃ åg­ircœZã‡ÑѦ=bO׊qÑ*Å%ŸíÃ_#f÷¯FŒÙñoüÇY°,ík}Ñ"Ýy©®ù]€ï{…mÓ%ýªüª"Þ‹–×tŸT¾æ~\o1§ØŽ1.ôµAè<$ÉÌxãÖUXîÚ‰¿. <¢êF݃vþÝèH‚b·1a28̺RŒ”Êq(dY@RñCPeÞ]ò¹6%ÿº‹yYLgð‚zlT¾€Å‡dÈhÅ„G€L‹jf„˜0Ò [Y®-#^YB™Q¾ƒ´‘?à–í;]êgðC— @kͳ±ôí4Žn8‡ ªeÆ5Î>á®?ãyo¥">Q:köå°=ìèRÑ…ïSPÑ~?ÜšÒ/8ÉQ°®šÛàæiÎsšs²Zçg”¦pf³‡cn¿–Cêæõ©Tî0D Q€îé¶:œùGWI-’œí£=nï"É¥—*à,=†Æãv:ANé,ó¡°Zìè‘Xú§Z Ú`7±îÐ=‹PuЇ´Ÿ´ÈˆNæVߩŵ ¡v`¹pË!9[Ü-ElxÀ½JÿÕÃ:ÇK># 1Úô a&b#Ú™&¤sy¸+)‡­‹]³}2ú®zÁýkÒQÚÌt+A <zÉø€¥¡Ra"»H‡R´òüèFÏÈõ*¿ÚI¾[/Ö&ëgÁö­/¤ S¦JP\ó+fSó7øi9õ¶ÇïÔÑ/¿EbÔø“¶§ä¢²àrt[U8¶üÆ›m`e³ïÓ0xk¦ZãÞÊQ(Er1îÒ´½S¬ñˆ©ø9 %US ²-¨²U3¼Ø¦~ ¤{íøúûC»iŸ!q¨l}Ù·“#žÁ ¡í•ÌÝ$ò\˜±f l÷¨ñNté;\gG‡™ÄÊ’k¤É3­eÝ_óæšl䢔 qʺzEú0ÜÝïsô:üK¨ÖCXëùó¬LÜYN^ûXŽ–1µÎIÖjËë¸kÛt¯™Åö10¥ú¾ÛZãÂT<ÓòôKA-ç©qê#5…Pa„óÜ1ÅýôÞï„–CvSƒÇQ<ùÞ¤kŠ@ ÔuE¾ò‚,þÑðîãßDE(?z•W®yÒäg5Ú31¨è P|ˆNk6>ÀíÊwuLE+±³Jñõ‚õ€×îkäoÍÐ}ÓÀ¡Ëm È«Êv?ô0¡›ÎÀ¥Mbå”B#¶h ‹Žs|DŒ %w?ûE@LUväe-B)ÙƒTx:.¥3V(}¯×ˆúªØBEDÊ GB¸þÃiÚ ¢Õ Âà-ôÆ?nYKì[Ø¢Tg:”¶ZÚ¦Y›@} zƒ­0áA¿B[M•bûaĤñу-F-×J¢ÒÌËK!©œ%ä¹Gq]¨Ø-!ÕW¢ùÝø$6s{ȵØbÍ/ #ÓOcý :º²?Z¬ë°î$ à‹ºjÕ_ÂÌwÄ‹2ÌRì9Ñ‘~C'm+Î&q%'8u9×b—ð"éÜ~|¯Ìtt$ÈGZLõ@œ°áäHÑòˆpâ™×¼43º§d’#ÔÁ|„%ÐÖñˆJ$l•Ê#ÙjCdƒ»Øù5¨E˜—”Ó¬Û%LÅð;ÇèuÍ=£Í-lû ;žé°}£ûQ"’bAR û >¬ïF#BÉÍ.âKà Ý@ÉÇA°Mb ½‚lCØ $íF¸VѹÀšÀÂ[ˆLYžóÔþ€æ¼o;…ÐÅÏ£¶‘¨]m#½õà–Þš©e?um`ăORùŽ‘5O† ‘°gî‚«‹ñ¬Ã'_òîŽÁe¯LÓ̦nÊ}½®®Ð¯{ÅΉÇ÷³ü4=Õ-%”-7”ÉY]'ÕÛEü];ö¤ºE†ªó¼)Ö[+®ËÑ»µX6{IEÜ¡N©W;.xþj!4w¼‡ÆÐX=eçrŠXpÞîõö©–Šé­"Š|eÄ.̉©A€~Kà þ!ªê×ÑVÀ¼¯Q_¡BÀ”öítS©`æ•›_Y#ø„/ž׺! _ÉðAmXnøµ%Bc*ó\¬w]#ìä:G™ëhxÚz60 õ&-¶N!„ƒKÖ‹"rVÌðÈm}jµg¬[¦hj9Ðä¼Ç[ApÌÀ@`ûH;5EM²tÓRÆ<•=+®^Î|ÿPn|ÜþŠ\õxÈ! ~Ðs®ô©b0=^KzC¥sü+?ôâóQ˜~«bï;×u-E2zËUæ·F ­¬bxüòþïaœ§þ~ã0wÕDÁ“x…sé{-[+V7;\ÝŠì"ÉMp Gn¢îcÖ³°Ç—ÖíÑšð? ^ùf$“ø>m|/ˆä`ÝE@”[ œó·IwŠ+IÜ89W“¿>*‘Z.ÝŠzòÎÚ š™ôF`Iî$çòçIœÐ·Vñqö²!‘í›ú2òY…D–oPOŒÁÇ­ó¸¢_0¸V‡øz.ñ¬`p „„›¬¤S8¼¸É@bCÛ€ð÷FpèK?üîÿ†àæÜ:„"Ι0ç¬Q«Êm²/TcÑïMzÀ=a„Awƒ‡ƒì&9Sì±ê89»³Yo鉟~ÉB “.\å©fã®&xLM`¼º¥q †ÏéÐ éô³ ]··»l§;Î6€9T1?è7À¼ÌËјG¸WiÀ¸"%ªi”]}®óšj^¨²ðªJd÷;Ãl69¥¢V¬Ã,NÙ…Í{ýîÛLŒc kø–qoyhgæJ ï$¯oÞd*Òv1?bãKº¬Ê)-=ÝV*SîSòMh¥ÊýV¬Ù“ ~ÍK\»‡—¿ ”÷»1ÛÚ·ËjOÓú§Â}ú®Ò/¡¶TYj‚)‹¶iïRŽá$»XU60©2´–”w1BúÊ5êŸi¯3™bòB&VìL£º‰^8V¢~/´¶CâÞÏ·â¼£‰Ä{rpëT‰{:%Ìã׺Pæxï›5µ¯b"j ÐKøñ4éT¢”uQg?ºòÖ*nx“,#|Œ®ý` ^ãb­@~Ÿ»ÄôS0öŒ°ºæ Ž:ïøT¥ã{&FFå.ƒ]u™âD¥¼ Bù%@Â%~ Kç+ÙŒUÎWþ(­Ò¬_}}°Ë$´¼¿’1„ë1ß+±:‡îªsµf¸—3®©ñ½Ý åüOY¶š‰ºG{™ñƒTR2¯?¢gΛ)Xd¥`éè'`T Šå„‘~p~%ïIÞ2l§lÐDóÈùf¶Ç †)ø´~©—ˆŽºæÐ=Ü.ƒŽ\vË?Ó±æú¶Î¹ùÓ Êƒ€Cà¾1™p­v©/5Ð$=•– [A‹Äƒ¹D¹ç]¯[uÛfóÍ{ª¾1©ä Ëg¦”0Oêd/U9¯fwÌI•Á€ ɸ4qŽ!÷ õ<ª˜‘ù‘UÊø3Á¡@W\FR j„ÞÈw(’–OþŠ|õ‡7ž`Aý°ða0à§ôs‰Iè?»te§Ý)hŸNÁð,,Ѥ¼+”©ZððC}¤+~n@¥;ý'=Y7;=+sGZIЩ¸®w©@[ŒþqR)ç»Ô(-}2r nëð9ü{¨I§¿Ä2M‰O®gw”8Æê9üœè) hÙ€–m$dˆ)!ky7'íÎs }ÕÐl3*ÁÛðö»’H˜D‹ÂmÏGF¥Âë¥<ËŠ]N=âºuø'ôU¬(ÚR2Ÿ@ ÑÒQ?ÊÃÀD3Œg±=…Êšœ…ÇâÓyÞ¯­åÍ)E—†ªÔ'RÁ¤ŽÈÎÃ_‰‘+”ÛœåtiIq™?¿(ÞzØ*0Ü6™qü&ÉxO`@.hÿäy"˜ïE£øeË)¯B!Ðýp'.|‡M¡~»i <9ºLÀ‡©ÿËyS³:FÈæL|ì\—þ>àùÛsï%ŒÇçïzÐq̱ëRäX8‡„ìÔk„gSÈ¿c”tá°9•bj¥¯k•ÇéqÐl:îÉž é-&#ÙªÙVê‹MárŽ]/Þ ÉŸm>#•ñïQxÔ¯žÝ­¨rŸ×Y$Ï4¥ÅŽ˜xep#I öÏKÁfC虿°#ûínÆÆ¾M[†~ú±[å[€Áõ=ª¿PWéÝÏÎ,sµtÏ †¢¼~s^ÂôjUB笥JÄ(TYï,¿ ×€‚ TîCd“ö{¤:jvdÚ'_ÙåO(øÔ}Åå0th¬"° œ”„ÚÌð“IGSÜÃiÚU|©>Æî!g±X|År,?¾ðm4!šþS9â¹k(wšÙ0hwƒß˜ñƒ<7*<ås½Çs¼M5{ËxvŒÇ_kÕ­{½öô Þhž2ܺ^!¹)Çê‚ÁðBçôÑ#X…OMœV*x"Z£X¼òñýló6P<â$*FzPaùÍš²££fÁ†w0Ku™˜ÑÞ]‚bXhs=æÀ1hn4lˆ®½q: (hšËã‰u8Èlhmôt%@YdiÐÍì #>5I{™žç·iŽƒ¹ÍÔa±™ð/÷› l™s®È{ÁÙ <#’²,HkÜèÝ”+ Y>„ÊÐN(ÀZ3Ëð SNñ"qg§<°”bM ±QßNw‘exfÚ.Ñ«ápûÄL ½L*,$  Ì÷¦NSiJ°?4yUâ•zÝ-|*-†r¿ù0+r $«u²}Óy¿uõWý–ÞL¯¬¬EUe¥Ï*9/Õàæ¡ß[9FĨ=”=⼑ÑäÉ"/ô¨g¨ib£€4‚®ùØ‘û`©£@Ìè³I¯q½_úc”¶Œƒ—‰à»= )Eƒ­*_dÅJ6AŠÇh úE–y ÃP;“ù>0ë Úøé‹õª§X³³˜¹Vêðÿá´}y ŒQ3ÔÄ ‰»Ÿ¾ÕìBž¢¤ÕbCëé[‹_=0§¥4=kù;Y¾'Þ‡ÿȑœ_ÜîE_ØgìÚæ3¦2vì¹é~±¦M–e{‚‘õ%ìMkÙTÌs”3e×d~9-ÙC])ùEïlÁOÓve;'‡÷koc›|Äž@¤ø VW³!?J…$…ÙžŸÖ«˜ã-Â^„Æ8Á7bgur]-܃4ª Èc£ç´°ªŽêØð ‹§Ax!Ï»!19 jÿ‡™ÄÜ 2`P!0e+å>:/©‹Ñãæ}Ï0%Y¼ç ×Î0€¥?V«ò=ö.‡ÆüZœ¼l¨zmÝS¢ŸûÍ»ÓÑ¢ƒ§hmõÝ(¡gª(]™°ÌÓpôµR·Ë/úÕú›¨‰g_æ'jL(G¨É"’Ì[ùÏÛgleô˜Æëóv4œË±Ú‘¾ÞJÏÙÓ}ÂâŸ/X‹áðìÉGäl [8ÅàÖ»•ÏÏqbjà µ}©Ín¯^ë'Àù”›,?DÜ$Œ½ À¦iG’R/’Ç*=úŽxTí»äkÙLëeÏB6C_]"X«Or XÖ)1J«‡Åæ½LX+ ›ên(øûwýjáEq> ›q3gîó4 ê­·ûoÞk‡²+£×Ž®©Ÿt<‡ŠA±7œdx7N|È%oîÝŽ¯-´hŸÑœ2eF¿Ãr=¤\tDõ"ÅÚ¼&I×(.opÍ~©Šê’â&+Ô7m±Ûx `ôYA5xîã}(OÍGk ‡px°¡ ýÍÜ·ªÌà`ÒúÑÛHbl+¯q&ˆ‡ï|f‘”ï|›E¶J±æè/cÇå)ü%ºªo£oªªÈ3#‡Lck5¿'ruŒCª›¶$QŠz&?SýܲÑ[5ð›©ë¡MúHæ—Pƒ'W¹68.#¼[ƒ×HIU¦mÀ4‡|ßgýfMßâέ(\x9ÅéÁ{¯nþVl+'Ñ6ãÌ-›ý^HÚÅŠ|ˆô2óÞp„W†"ÃBŸ°$ú©ÁÀ™Fêİ* ác02¹Ý˜ÓÀÇÜ®#öìŒÁ•”Žôl<"ß~¤ãr#Yd/Z4"No¨Ökަ{Ì‹¡Mã çÍÃt“=š\ÌU«Úm¹óé8y`p–×I>Rñ²è•¡ïiüèW‡À ÐfYFøì„>&ž$âQöó†Èí†ËðtP ú¼Ë¹—Û’¨Ë>f€yjíÅ@Eu|7:þžÇIr|ó´?Ž 9þ‰r©Ž3.J8„Ë®r's'û¢Åqi&+·WQgu•ƒCÛQ 1 *Ì}3údq‡m±±>Ó¹wf»mLAƒJÄØ‰ðއŽ"'Ýêr-6” .P)þâÅ/DôéØ'Ë/>N¸MÅ1f ÑÌi©OMÆû‹°Ø(»·ÅfúÊÒÑlQÑGä’§õí™Çz¡ÖÐŒ‘‡‘;Á1Üo°ÇÁÅbP½IüÓ !ÿÂßvú<v·x*¾É½ä«p‡ÝËãÒμyÎ$}çK€ð¯°}!,XwÕŽ’åý¹4WÔša`4fÞ@IxY “ðgп£ß5ILÊ:vÌ`´ Ͻá¤Û×…\ê¶W ‰¢´½x?3 s¨ÆK¯…;Ž‘Æïϳšð«Ð+ðEW˜¶Ò¥ 0¾iœST_¹"R´Ü˜²¿°´ç¤Ù_›Èú|áèåS"‹¶ß{à–ÙÏ®q@Ú¤¯4ýº™&‡ÿhN"_Ž•±LçÙ_¶Pí÷Ar"s¨1Sýàðp |Ã:d­ßJDÌŸ[žx/%?L=_’eíóL+Ê=WÑ"haóÉ"cÓ§só%ý‡¦p›e±NE“{¼å›¢ÁåЙq9j+¹ ('^ïÝ>ÞÏ@Sî4€4 é뼃¡´Ýð'ÒUœ…<Ÿu¥{í-kÍ, Ë´»õ×…éSfÔ"6Ôª]ă ›o¢×Ä5›Kpf?WYþýíŒøL/Ñ ú5â÷–­@âåüýP¬þœàôEBꜺe^ií†fù$ÕÀ þÀ¬KŽ—!•¦Ê.-2ó‘Q@ð,.§¡Âuv_•Éììà öÈ1—øú nmëÕ‡š÷¥l¯”ŽZ•osÄä>s?¦Ä¤38hÔ…gù²¶- n¾|€ùN ÆUÁ­œ4ˆšž…Ö¡6È‹h`ǹæ% ¹”Ñù;ÒX‰ÜwÂÒ„ W¥V¥«_^hPäJ-> ŠÔ7¦x³„ÌnŸê°÷Õàhg=â,@T•Íl.ÍâÈ\î Ögnqùðˆ5·¤4ñöOþÚá²½ëšï?ò».öbÈêKWPä jù9‰Ø¸ا•}Àð´É Ýõœg¿LAßaWMhIÖgî1/êP!J©;Û;j¤ü 1 §¾Ùï—}¤™b.𫬻åà[ m˜¾n5‹™ÖDòˆ ¥U¢®ùî*·ó…X—{žíL0 îC¼± yR@'S¶=4.Y ­~­ì!c|„‰‘ËÑcBBãMéê(µØ:Vò ôU8Ÿå-9 ,uÑÁT%dZ<¬"]’„F‘%¾ñßÏ^c}[WÁØ„ÜÊÐe›÷I´ý†‡ÝÚ¿ÈÃD¸«IžƒN«¯*ØSó?’Tap}ÁîÜÓÃ6××ЄPg•cÕáÕ¦Ôº¸O‹Ö?Ñ¥K8xJF7™‹“æ¯kÙ-<Þ’_­oÜS<¢‹Kqù-|aÝþõ‘)O/h†ž¼2âz‰9+4ÎψÀ§µŸñÃ^ñAq4uî¿w¹ºšc\_ÃýÔуÒ+U£ÍPÈîjç w0öi#b¿/k6xêÃÀßX)Ä÷öZuzÖ‹¹õŸ•QóR.Öæ Rÿ⸤½X®mDšji>á=ÇSæ¬(té%`œë©ŸÍúŠÄn?Þ´e/µ$±_Ò)þºíW4 QžŽÄ¡²Î$Âïg”/“ ,P’ž•W5ä5âR _ݰú'bP’µ\~ ýö!»u9æZ1t»›ÉÁ/ãø˜‘ª`¡UšÌGU^!9öIzZîG. †hF Näývœ£ æåíƒ:7UÙê…¶<_6Å®žúÑæ"2Ôá¬É¶`ýˆoX­òÇI™9Ó{óKd¹- l\JÕk»Bì3?]cÉ[¬ÑÄ©¬,S›¸òÂ÷™üSë¼Lžqu\ìª#'Ë´¥;uéB­ÀìÞuvB=¸:á2,dT5•ž×z:ò'­Q¤ƒ&ö+Õ䵺¢Zºô®íj" —n‹ÎÒá•]M[íÄjÁý·•Š`öŠ-'Ÿ€~hè“ q-ØÔÇŒÆÕ©‡Ù¼›¾Òfßx Þê¬Dü¹µ˜H¦añÔ×Tt£¡P¬wèí†t ŒIÑÕP¹˜3VÙJ/õ@êoʃ_¹-d}ZSrœ“X ½Fiå:îßxìéí†vêW5¢¹^4óTJ‡„‡½øá©~³-÷E§Ø ¿‘š>õ·,¦Ù‡ið 4 ˜Ãrû´D䄨)† ßZðdžúq2¨d{«·}†ä/ï-ã5 º|÷dAÿrÛ¸cüÉý°.ÏEõ å¤]ªŸ=«!“Ak7ËW2œqÒ9&çNv¾¥5 ±¡s4Ó"þŽF›)lô.Ê„­’FúÂ+wÊ¡!¼³ø¦V󇿃ÄÏÎms $F­Ïr{+ÀË(\µ7”ÛVúg6cš˜3ãÑc#R®ûâ Ý°ÕáÀ5”Uz¤JŸï¡ßÊÔÜúƪÂ{|æB ͦ„—\ªÇ“…ç Œ5°sÀaBÉUÐ¥ç(Èc…5k³Pã ZÙ.BËEW;DÇHföïGÊ2šÔsÜ´uCõ_¨Áô+PdÉvÄk/á½<Ö>FÊ7ž(USŽÃ©£f…~¡ÿ•ü¦¡wÌ` -˜mã‘ ÚæØ¢¥FS¨8X7sÈ oûvÓC2ì+ìÖÊļçF“3Ú®rÐ÷”LX‡w% Ûý-âoÍ9®ô¦–»ï6OæÛúäáöäø1òœO87Ú.'·65Iƒ¼’L5Id©·'cQ„ß$=Ø.¸ÕË ¯G£:‰]_XJõ‡dÊ”¥ïÐçS¡´Ù!ª Á·Y–ÍF{[±…c\K ܯ i箣³jtB¼05zû8Çk.4º£=±’9&߃>|“©vK⨫6ðrë·õ8÷ ômÝ…¶Š^[²ÚfDñäžÀ›BêÀaÆi÷² À šÜo"YÙ”Ž¥ZÌ™·s…eÊbø`¹Ê=¾Gü•ê[:j7ïfý—SÅÕýÄæª²_É&%*ÐëòN&/8Z=óÖØêHW<žV¿EùÔ?ë§ôûÿæúô«9ÛøkÕºçz¬¸Œk*Åú¥62.©ª~†ðºÀÕàê¥rKAÂ7ñÍÉ­[S†ž„Îí·¢ëU(N“TÖ¥A ãîÛŸ;*ÓêÙ¤>†ì‘4ÒëXŽe ”¡;¼Ô–ÇÌ`RC1¥N9©6V|(($¬ÀSE#¢ëàêÚ %»?IŸŠÎVWÕ¦r4Er®0‘A¼wŠ ÁЇÖÿR}ž‹³6Ž/ëã¬~ÔÏÆõáÛøR5À\Ÿ°Ÿî¨S€¹0â|a:hYu~Û¡(íÏ2ií'}¦Ò(øÂVv [½•ñâ¤aú(eL‹CªSÝâTK¹€*%7û¡¥º€´%éÉM Ce¬¤=Qgï’¥Ò(`Ð;ÐY´ÆA…2Aƒ‘ÂýVUb¿OãúÏ ÜóQíæ¥3·ˆ;)݈—|wo' 4ìuŽÒšb‘tž¹úoþØÁ—ì3ð“ðKóÖaÁ_…ÚúõÏj0")N«±“ÛàF£=xg¸ ƒ ©÷‘´_ò?”W…M°PЉýYO^þéနÝñ[Éñ›¦wõöf’”& V€¯àäˆd:JŠ&ÿ~±'™ýTWÖ¡5SiÕµpÙ1W7„/ï"1¦¿ÚÕ%Æ]á5RWÂm76íŠÔ«+ê<4Ý Ѫ3~Qûd«‹ 0c4Ö¦ á²›Pôd4Ʊ` äOå|dV¨ lÿ^‡Ìº¸^þúDÉ;™íÞ?a1rXE¸+™lw‘èò²œŠ7½Ô†øˆèyWg Ž"ú3›0¦~*ÛÒŽCȹì$t bƒ»À~ͯÍó_Ö›Iƒ ÷ôKä³\غ eTÆ¢7ç_«îðm<Ê™ì`•‘¸”•^Ñ¡ôñ‰Á–~ºŠ®¢“)uöó'‚Ç÷D9ý("½&;×W´($‡pâs•e•6@õVÌæÅûuº¦5-Ýî÷Ý÷Ýs.çï·ïm8JÓy… ŸËÀ\ƒí,ÍSâ"ä(~nçŸ`ç‡mT óo,—îy–÷6÷éP5¶nëʺo ½ºüãóÓÓ‰w¼ídäìÊÑ:Íe3G:ו“º&ƒŠ$i*;¥£MAI9I4“»ãâSSáðý¢‰K‹cþ\CÌ5=‹<*R—µ¾„Ó¬Î2 . ¥›öÁà¸[/(õíûªÕɸrÉþ»9Úi™Õ·ÆÓ)Ø„õ*Oœ÷½ mûÍMŠÛgÉ8µAÒ¹=,!:o³³RøÖؼCˆ:¥¯ wßø„86®Ú}0x„Š\Κ µÐšPª”s؆ È&&ä¬r_¼Œi ýóIŸq²!Lê–÷m„9¿Q""’±`Ôh›·Hr©~ j/õ<Ä2+¬c‚•e’X¯ÃAÞè¾îÈxXà“[N JÔÍÓ bàå¾Ú5/æ·ÊKª³Ê¤üFûyIA¬”ýÑ'(_ùçtÜÂdö¡Åc£FT‹õ#RéÇçÙú¯øDÑ„K¹ý4êÊh;‡šß^[hŠzVGŒ¦I#μÆ2 7X+ø.g?Rž¥~õÛ»7Æ7·Ñ×2ÝQo*jm'®’4k> )(U#M­ÂJKPŒ[ÕJ¾ÑS:6AHvo„´·j.×™ãLq›n¼ª˜}‹¿Õ‚#Äç®ÁËIH ×ÖÐÒÆžubDj8ÄI ½(¢î"ËckÞÌöî­âIDè,ÖnWjÙ öAW«àQìþ ù¨ÆÇÛ¬ oðB…À3QÙ®H†m ´QÔ‡ÈÖÌùܦ'xË  ¶¡õy[ŽeðiXÚ¼óSÊ&Öt=º¤.¬ô3Á‡‰Ë›¼ßFÂe­î9ó›ÄŸw½?Ë6oà¾=’ðÔmR—ìRµ¬å¡åjG@qÚÛÐ[áÍÿJ‹î³÷i¦BqoªøT5i›?Îå-6„·š%@ü‹0]F¡ ÔŸÊR¹±zVº_ð±ÈÉzò/Ã:%V/–?¶?’ÄØ;óòŽ;R>%\žêĽæ²Òl,”ãaÛëÛ݇µ¾ Ü®¿=Kz ®;!«:¿]; fF?vyá«]ßiƵÚddjðãyÔ‹¬^ïk¢¤e’3m-Î8ȼÉ;qŒ¦¤c˜ï»9»íôKˆrB]`d=¢þBŠ¨Øœ5 F“ñ%¥À16ÈSh÷Ò,ÈüôUnµgœeë¶]8«¦möºa÷(WÄ ûŠq-|ƒ@å& L*ùÊÝóåkÙ€Ïê=²æ Nn „ª¥ƒô=±l’>\عœÑCG}ºœÑ ͤ¦—€Á%E óaz)°cÈž£!è¥ËœCÙëüq¸d W8õïi®‘Ëâç[³îËYÝ}b×¶1ÊïòŽŽ¿`°?׊¾D=H(ª·}Éõ"“\^Ð2YIlÕòô&*;“…À Õfš¤Hþ‰ëA¡}·@xè/[¤ˆw>;h¢58A] %—R›ä8§Kd ÈúŠ} ƒàz`EyE]BZÐ廸hc@™bNF\=åëË?é^…x_@¿¯ž¬øÖŸ‰è/«&ÚÞJ~Xþ ú>kq8’½]Ë“âT¢‡Ÿü#uú÷Ù' {¯öáðƒª…ÑZj°ÁºxŠIþ¦ uõô„¦8 -—<ƒfþh¡%‚ÜÔ2Ü7¡lý°Þ@ îëÖþAxÖ»´©O²èýJ!P«Ù§G~ºY²}&©XÀö!Ì´Cõ{• N,K¤–NàUŸzð•WaÍîðñýá%Øà Ab5Ô}A2VCKp% ܔն%Ö,¼.^÷—ã“qÓƒ¹eœƒLЛɻÅ<|C(}¹m]"•‡»¥ñõ˜žWY¢Ø~hèm ›Ô¹eê²­Â:èà xc¨WZß¾iYÿjýÝÉu¥|vïX%9pèQɬ*lÕW««E’º˜†ÞSǸe'úºíœšËïošÒ…7ª´ZPYlµu };…'õ=LßEéw>6׺V9¼NjmˆßC}¹VÀbÃ)©í†[KŒT€ÕBÿÉ"yéù!}àA±¨NÎY/qø“F¿ßÉû†)üûª&º3D¯K³+i<‰;ËwŽ)ÊQüú ÿ•oyÜ·2%œjàYx£‡¾7]‡bÃÁ)û-7ê4P ÜÊ]Æq¯fÜs¢õøn†ÝÉÑi %Ññ»|¤ÔýH ·òx)îñeÞ*aæ? <Ý?‹\AM#^q vÝ*½)÷È`ïÚ»Y}³úT~÷B4ÊZö«„¤Äòkµ@e/ñÀ?¦×%˜i÷¯J$8êé_è‘@»„ükÍ€–x8":‡P* ûáhQ¦jGV’ZcK¹ÁMø2‚Bηù†‚’¦™ _¥ûH\¥RøŸw`†„OÓÌ Býƒ ÕïB×Ó±]º%vŽ~ððÑÞRéçŠN#D Çè¦Ðµë»Ù„G1´¦°K*"*ìÅÝ›Ô3Ñ)o¨hFEººPuWÏ_ô¦?ÖaIòá”-eJ2EËg5U&Š8ç¦Â½¯=gB87_„³ ûlÞ‹¢œ8Æ%]½Æ¼d¤¼¯‘5Þúx ÇO,®–~ }fWã.öÕS˜X ¢R*ÄÏò·q{…p>íÆbõqÈ*ò‘EäMÑ*G0¶Žò¬q_¬û”ÝœÝ?jw½!µ[»øÃÕ4 `uR»o ¿Íè›ëÓè.[‹Ã%ˆË"å¶P@qÄ=æ±³œÚÑó겦mŒÎõ!^]ÄÞpP«Nò(øYb‚÷ܯÌÄ’- €ñ—,ûyM¼þÇTœ¦á¢È´¬¥ï}Ù\óIGéôƬ”ÅÞ£98šïó@µÁ- ÀÌæ¹û‰ ž‚”s&ä,Dô\níz´ÅŒE&TlûÃ-Å£¾Af ¶?8‹iV:||î„qUäÞ ¶ªé–Eô8|Ðä’$ŠX¤s Âp—§{à¤ééJ)ä ß ¨š9cô.3%ÖÇÆÅÖÁ—ÒHד¬Z+0K]¦xsa5,T`Š4ÃÈ_ë$‘9Å¥\?Í#²€NVÆçuh¸ ¬ì‚ZÀØ€ÇX’ßqr2a ˜ëD—kO”ÅÝÖJKÔÚÏŒÖ8žG§^:+·nKW™2ò¦Ê:5iÎÁËæë¡Q„Ù1.HœËN¬³Ðg¨~i&ïn)DÕ%¹Ä$# k&ã%‘pLÝ„”ŽÕÇœÊ;b=%^§’äw~bfŽ~&ijjaȇî²ö\·þ£;™k)6 »%>ž¸Ý›eñv¢ñZîåÐrî+éVª™¶—M$ŸéµW‘û #ëaåæÊE¡ Ê#`ÏÚY¼§w›‰çò¬¨Ú6%LÙ!η6ÇÚ*>“yEo³ ±§©ÈC2ìÅ%º÷Ç6%rJâ€M€¶¤¼ÀÎ"ň™¯uün-«.V*‚pÀV[&•uìN°M­“1`yç #õEñ ޱºä«Ã,õ|kÏ®ÿ³¢°§.¯~·øãEk|ÓÌœà¿Èïf8Ž÷23@élë€:uøÝ Ŧ†®3p¥[ùŽ1€Ð°|ð¸˜CÉhéKWw’ÛÍ#Çä×Á‘¡”'¬vè41‘­V±êõGü;Y~_¥. YUÌ2 ަ;dUó'††„e9T`6óýZ˜/¯óàGÕß›§ÂM_°Rýj­>¹/yÔùO6Äya°Û¹SŸÝoY·oñ’rcÅôˆí—MAÝjž\ƒ²Òõ*ãˆî‹; çh$Œ,w¦ýe,Kì S8|keâæH—F!êÿûÿèKm>·Póö=îSÞ ½˜B‡I#AEsœEVá“À1ÍÕöÎùÄÍ9³œîGERŠ)ý-D}8½œ´$Ÿ¤*¦…ÈJG‚Âÿ,ÏŸ.pgFÚàõr³4CÃtï4N]þQcÀ%wV÷qâd*2KY5ø*­Îø!€ó^zP=”ÆXíh¶ŸÀb·Ÿyo4VVÀ ´¬icûúÝÔmØ»u4$$g èÄÁ…3V·aÞu»=òèPCV£ûrÃñ³!÷t`,õúŸ¹.´AO&a3À ë!HMRâ¢b·ú¿ˆ5½[­W){AºúÕ& ývöÛ°jä†pw2¬ Ù{?Y4šMíÊÜÆ¾¢pšƒ•7ž!UaGv‹ñb“qï˜I+'÷.¾¢˜­‡v›…*‚Fº$€Q æ™»“°@¦øº;Á¨«æRåÕHeÊm¡|'²RjçƒäæZÁ¾1N^·ôªw¬¡åÔS“!ü_3ÙiåC4<°¼`1Å"o2ÆÙåÝm\xáò†Ë“^Ò?㓪Û6˜I0…—D–cÖU^THÈÈzU ©¸}k ·žÞˆRÙ&‹UÕî_,#U³ˆÛ„¬!ã`5lHj=í@”ÓøÞ=è|¨ßv-±ñ„åSLC÷¢`ã׃û¿»%8nÉŽëÄ»¼µ‹lÕÎÝd©±À·iÙ· ø.E/Jöqxù”Xy¦òÔ­jñZ)€J»“¢j·ßò|÷´ÃqÙhJ¶H:sÇ@ù%Ø(ƒi\¨›:rW¨vû©uŸ~:ß¡^¼»¹þbaOâäÄÃ+/6¨ 9ÉíÖ}vT%‡~©¦ ”õSd—™Áå $ãÊð3†RðÐ릦´a½+e¬Ö¹€OÜ:§´æóÖïÕ¡k`møz|S­”Èÿ–½SOoÒµeZ2ˆÔj²K"ºsc«9 A¼lE@ò±ôl;Õ4aXJI)^éaøÀä±\H&çÌ8AÒ¸‚/ñ\ÈŒŒÍؽäC'j´¤ÜÙ2B×ôÉõÇFiÞÂ¥ªI`ù fšºÒ°k êÉT‰Š“I AÌ/J¤?C–k#¢dº`…ºÃH¨q¡‹Û@º¬.xM ‹®Õ­°ý£ /Ç`7ùæfÈ9ç¶6ü 2µôÍ*¹·¤ù^M:ü ôÊ$ª cYOŸ<ÑI³u“+Ë)ëëðø³dh"˜V1J“k§>çÝ´B•~\¤"s‚œ*‹‡€=÷Ëè4¯î¦2¯2ç•2 žu@V…F#;F»-ú­úJ#‹ª®“ËÀ›w©CBÝÆ[ÛUÎÆ,_õÀð]sjg 3®û‚=8èÃÔ’ïä’q÷hïœéÐIaF†È&]|x~W×5B€Ùú2½™l2}`a\ÏâZÄÙîo.õ££¡Ñ”Ò8ÐmM&o[¦X)Ù¹íF5Xoß=!K†fZÍÍޔݡîXõà :Ófb+YXEüM•{vùÏkô}],Ò¡(DØ žQT]úîï€V^§·ÇO3°€ùÒyÞût>\ ×#庄¦Ã-µ0{tûNÝÛqü°žõo-Ù†"‘ :L°ÌFUbfµ)·4üíìµ½úç=Ú÷Ö‘]3ÃB/¸ºGQïI’š3yY28–ÉJ ¯€áK$kl2†¼.ÿ¯oy¾Ñ ¹”ùÙû›±t‘=ç±ñ¶T|Á‚8& Å?ûƒÔêq-ptbNˈ¼Ã‚ÈQE­=x“zLd†Ù1L­‚$KdÙÚnÎgsû…¯oøLCvÒåžØ^u—PƒÆh¿92¸=p¾Öû>—nnZZv8#zc¦P+¦ðô™¤à÷3_Z_ýÔäbKlr&ûò†"¥ù>ÅPºîN'á»'Øñ”üJ6÷ÆÍ06È'«öîxPþ´áý#º—Ò ï‹J;ì¶¢0=…å$O°.U•&Ùx:h“ÀÀ<Ҳ %ñð¥YŒ·3>-"Oø¥­¿l ÝMvü›™o?•CÔüÓ»äêúmˆ¦’WéRc)뵚†HÁÁ ¶E])‰Þ½$;·ly u쎂»»_ß+0˜Š3ýÀ¢+b½ Ær I/edñ¸3Àd“RäŠOýŽC*ç[E ÊíݼU‚(¸?-L”â «Œõ¸äuQKmçBsÌÂýv @Ô†¶[çó|f*D+ŽÂé ‡ÃΑšýk]*ÆW¯*X+©ÏYzü†Ú%•a3Ÿ ´8Àa†h—™XÏ‹Ô4#[ªÕƒdF§{è»2#é=u'Ù;&*O{þe€vó8yw›Ã5B“Í¥΀¡ endstream endobj 2605 0 obj << /Length1 2496 /Length2 16228 /Length3 0 /Length 17677 /Filter /FlateDecode >> stream xÚŒ·eTÊ.Š;wÜÝÝÝÝÁÝÝ=¸‚» Ü`Á]‚k;{ïsvrî{?îb­a¾ªêúªª«º{(IUÔE-œÌ€RNŽîŒ¬L,|qEu V ; %¥†»=ð·R èêfãäÈ÷‡¸+ÐÔ$“0u™*:9ä<ì¬ìV.>Vn> ï \ù¦ž6E&€œ“#Ð RÜÉÙÇÕÆÊÚÄô߯sZ+//7ÃßË¢@WsSG€¢©»5ÐÄhnjPw2·ºûü kwwg>ff///&S7&'W+!Z€—»5@ ètõZþJ dêü79&J€†µÛ?*u'Kw/SW $°·1:ºy8Z] ~€º¬@Ùèø±Â? €ÿ”ÀÊÄú¯»ÿ¬þË‘ãß‹MÍÍœM}l­–6ö@€²”“»·;ÀÔÑâ/CS{7'ÐzSOS{S3ÁßÁ›¤DU¦ ÿ“¡›¹«³»“›ý_Y2ÿåThIG q' £»Â_ñIظÍA•÷aþw‹í¼ý~cKG Ë¿R±ðpfÖt´qñÊJüÇ $Bø-³º8YXXx@ t½Í­™ÿ"Ñðqþ­dýK Ê#ÀÏÙÉ` J`c ýCðs3õÜ]=€~*þ!°²,lÌÝf@+G„ßÞAb å?Ô®6Þ}P²Xþúû÷›!¨Ï,œí}~›ÿ½ÑÌjš*ªzôÿ&ý¯ZLÌÉàÇÈÆ`dcgp±r¸x¹ÿëèßü7ý¿¥*¦6ÿ ï‡²Ž–NÞ²•ï¿™xþ§=hþ3=´€ÿePrµ5@ó{ X8YÌA¬ÿϳð÷’ÿ¿øËËÿÃüß1IyØÛÿmAó_“ÿ…©ƒ½Ïl@íáE'Ш8þߦÚÀf[haãáðkeÝMAÃ"êhjxF^&®Ä6nR6Þ@ wsë¿›ç¿Ûb°·qª8¹ÙüuYÿ»)ÿê@hn:dÜ@›ö· °ÿe•t4w²økÙ8¹¦®®¦>, Vcãäø±‚FÖèýw—˜™ÜAK  –N®m-'€Yô/Ñ?ˆ À,öq˜Å#³ÄoÄ `–üq³˜¥~#V³ôoÄ`–ùØ̲¿ˆOá7ñ)þF >¥ßħü/âñ©üF µßÄ þq˜5~#ŸÖoâÓþ@|:¿ˆO÷_Ä âÓû@ëLÿE¬ KSsP×üÖƒ8MÝÌmlÌm\Í=~[²qýGáncoñÛžƒí/1¨ílÜì~;…cöJjæjjnÝh–î¿åìÿÊÿ™¸ ¨ÌÿEl ˆÌAMkoÿ;nŽ¿d söL@ýÇlñ‘ÿ€ 0-ÿ…œ fKÏßzοÔN®,™XýA„Ö¿éAgíãl º„~[€d6@P¹lÿ€ ²ÛýA²ÿ‚þ£Ô ó‘ù·gvcG³¿0«?AG5³Óï@.@WújPJÎ¿Õ —Π;Õñv€ƒõ?Òÿ­?hú™A;êôG=A f—? ¨T‹£Ûäà·;Ð Êìní ü£Ü hܽœþX*Çïýyûû¾w3wrý3%PÕ<ÿ€ ”½þhPSï? ˆÕç*‡ïï Až|®ÿDð?g’¹‡+¨î_ ë¿øï§è 4GX^t2ç·mïx¨%ðbÜ›dïãÒ¼{ó á@ˆ·ßa‚ø¦„kWNÀQpË“ž+¡2f-T£© ™D ÏíeÇ+ÖÉ‹Ž!ƒÊÔ( Ä‡tG3}ÉÒ‡Ÿ‡›™$î3(sNZy§K)$>®é„Dô wpè¢ C@\YX ¯|¸HË‹ýúSYÆ>P•f~¤K‚Å64*Q®»yæ‘ZN±ùô£ºÝda±_ ™3h>RÁ½áÂŒ@·œ›¯k¢›íɺS^¤ ¼‡¡8öõÁ5CñÈý²dJ 9… +·*ö×X€Ç·´ ©Å³ ¶ö[ÙxeCg/¡©yºp¾E¤¶ð–^!'ÅÖ2?|ó¸ËOF‚¹ædhÎóÑg»mfÇMÈ÷ ò•Þ `GÈRD‰/iÇNYÉDˆ¶µœâݽÙ'ïIq%Áƒ×}^HrßDAÖÓª<@;2 B»B*KôΙțêžùÓOÓdÊo-bJJièót°¶™z§íP/.ð™÷Ïzê]ôVí×øD6N)ΰÒ'—ëøžÎ| "öœb7 ­Æ{ýJ!˜‚*j8½~€7ÿ™øérNŽXÝMŠ‚ŠesݴݧÁzrvŽ40'Ð¦× öV!:NãÓ%TƒhžY…@/¼ÿ8 e±JMe¾¤i€oñã%æU',“ÇdrŠE‡ |…eí.>kÙËeㄉÛŸ:ùl¼Xªò¼` » ¥‰ vÙçXß´®ÊÛ sð Ig#]1i5áj´ÿ—=T^Ô^”>üéþ¯ ÌX&Ƙœ8‘˜¹öl…¸O²ãô"ž™°2a0ç†Æ2úùξlAÃÊœ˜Wï{ƒQ„í±XLe‡Æ¡–®µih­›*(5²†ÇN‚鍿=š·Ì†sóÃLx”¸êLóönC ºº²9PX^ϹI‰+Çh£oK"Ñ÷6}­0<Ø9Ï;Ȭ8ðùS4S\û‚Íﮃö2k`Jý 9qákZNŸÁ˜¥Òùôô¨5žT ÅÙP>ùÁ|Ì,†RÎùÈílSTá6GÓŽc×*ŠOL«È„bøÐÛ¨¦k4Ge»á]ƒ~o˜ñk^IüËs§£OT_Ì­´?ô{_ mÇÈ>ùó7z÷L¬'Áé\}¡6Ïôƒ._&Ѱ…d™2‹zðømÜNÏ"¼H ¸ñ©¹2P«ò® °8ç‹ÍCä¡\@eƒ‰Ó«”E¿Î1Œïs-uµZ\¬+¿Ƹnhü¢ÁÎË@wAB §bê|,˜¹òÂR‡Æò(5øäN5üjæ¼ß©%´›éòÀnK ?Ö7±—-ë˜5ðLlB÷f·!ö‹’ê»4fR´ªç„ëC YÖw ‡qV^zÆË*¢ªm†ˆ¢YBZì–GYÕC©äRÜñ¥¦²šâ>‚Qïz›¡®ôÒPxÍ¥XµoÈŒ>—âÁÀÞ±’¼FʼnÓt9¯w^­è àñ¾n< ~Ùú ¼ö5«Ô/ë#cá -ÜØŒîý “¯(þ&DDPÒàÓ’§¹Îa⣠º–f±§†~ÏþyEü¦¬ÊçË šÂx+á•—²íÖrR§ _´ \N2UoÑr•ÄZør¾ÿò&ž!~ýÕ´çËórÏ«(öÙÅ]H`fsbÌW<ãe‹ÞðŽƒ3×›GŸú¬ö[åú]Ð/¨z7¤ëo?ýí»£Sp}”BW3{³}ÑÒ;=%P^ÇÌm¥Hè˜ÇײञõõC© B]Œš“hXÑ)ÍJ^&Œ%2êÅÉPÊ’²8™ðíÃ^R5Áª¡©úˆWÉìy¥o1ãTh虃u Z$k˜ÇY†&Gçû2Uæ}–‘…2šiè2þZæÞ„ÏQ/ÝÉæFÒñ¼¦ð*þ®Š7õø„ƒé¬´úç¡y‘h/ïL¾Z²glòÉÎ^ ¸aô°ìü–ë9.¢Ñ@Óm— [ã¼&¡ÇgˆlgQ¶XJ|Ç,ÕH)êmŽ$ί*æÔX¸7`ùÄOøb&ö±Ž˜VkýøÀª—uK¯¢±‡#ˆº/Wû ¸C‡ÎC)Xˆ–^CjžÏ”ÄchæŠæÇÁÀ¾e׳ø^…œÍ8dÄÎôê‹ÙÔ?#h15´~åÃ2.>Œ÷Êy”é"9’TüÈ×zGùå|aPÌ~Ÿ)³w¾…£ j‚ ãâ­Ó³­gA¡‰p•ÜlìYÛôbÑN9ºuê¨YaD 'ÀP2Ó?í¸hÜÿC¶äs›†Ê˜Û"]Öô©ñþêgñgJ¬:³¢)ÓWÜA êFOïµGväZLhcMÔ–]G‘z– è…gGI$ÒÈ«ŸçMï^YN2Æ3ß^Á#º"gÃ5³„%yÈ4_Ee3 “èú°5fwSñ6õùQŠÙÚë¨ìÆtÈŸ.ù ºBSA÷ÇNìú`~Ùxç¯[øŸž¶,niÎêú³à^¨k>OãÊ7ðiÆ\õZ‡i·F\çe–#-jS8­Å(_•°5ÁY“>6£QùÓ¿÷~ ‘¼›ê­ŽEèÁj”+ý|ËRÃR´°ÒÔïz©j¸¯Óä;ãû±|Iy÷É]ÞD×ÇÜ„k!²´  Á¶îC3^M†%ÉÒ­åJµK#B޵Ì–ŽÚá’ +R·véOþú,ÏôÌ‘n‚õ1ËÇ’[Íï PuÐʂLj?§Zþˆi„ø{D¾”'§Í•Ã>gT_p¦Ød+‡rœŒˆÇEa0ÄU'Ã;L©@톙bbÿB qM°³õî\Ä¿íÍdc”¿Ù¿ELh.ËâŠYÿfê\#ª1àÅ ñô¥ ô¦‘jßzvE4‘ƒ$S}«’óÔÎl‰ñYÜŒçnÌªÚæ_Xcvok D®ûqêÄ8tˆ·ºk¨îÎ`ѵ”´æ¹#ž”C6ì)ge5z³a½§½#—wDTį>ÅþØ×l@Ûl‘0We ¶‹>‘xà‡jâȳ;Eiá}ÂæÏI,}ÚK»ÝŽ-³"ä]~ ‰ØÃÁÔä¯ÇI¡obÃûB"lÏ„…¸=뇃‘+³Ð®†òˆx>F8͘{‹àäÖ¾{ŒBŸ"cÌ1QÙ 9ÔÀ`½„K0æ-iŠýö^ßÚÈØÀ…Ú¬²¨;£M*íæAÒîÈGš¬4)òŠkùn¥J–Y¹Ûm(ÿIneok.=<IÞrAìÂ}4ÖHf\ÛûJÇwô…ÛO³Kª:æŠîˆ™Ÿ …“­ظٹ´Ù“!>°X픞"?\ÅXÌ JWf‰qĤÍMr…è ˜Á\ t­Áҗ鯧÷Ê? H#J4ãi?¸™}gâ\—& ýª;wÄE«É¸y?ÝŜѢצDW¨|*g¯q+ÝóŠmHÅb>òjvWêNÔ‹ˆÔßf!¿NŸÄW-u|ºF˜¾Ëk"¢'`ðÞ,›Š«i£$r&ícºV/¾qž¸+±<{ºê7à훇¬LëdY«¤Åz$¡=œ¹ÉláhÂÃ8D=â‘ éZmVæç€y™!‰¯•2ÄQ©'øï1ÓwÂùË܇˜7Ö|Ñ~Æ»Éx’Á+ 9Ð8ëzq†™/û™®Óí[tp_n²7ÒÃáµßXK¾¡îJD‚“{`n…CM‡š•Á ÿ̺wú»?ċ⠤ Ï\¥~NëÞt€õ¤œÿ¶ ÖÖ°îJ­üó[•¤Ó”èUiê㯣C¿Í¹îög‚°³´„è…ªf’ ²HPL‘ìþÎ8v„5ªž"ÇF8NÞFâ– ý~hÝÖ¸Êh[¤z¿¤Nœ¡ ¥ê£|Ç÷‘‡Ns@VË ù˜3Méƒê•Àݤò½-‹ O¡Ýwö Ò(ß«{òªû³qV¯w§ìbOêppIp2¢:Îu˜Ww‡Çný±ðhDÈ'*Ùµ]ÙO~§”sô«æG¹<)¯RRîœñ1É/#n±ˆN   Äl&*Xýh¤FËúX·9Y6IDÑÝ>_Üá{à;5-½öu_¥*X?èè´@çùúw–V«CåŒONœÅiY½] Á·×"@ ê v z "Þ²Giçi.œêÝþr„Ñ8!ÏS ¤C Ð/!l½t^ŸîµÆÑ.µ¤–s…ž¶j(lëÁ…t[ËÑŽp±­§.éa‘Á½ÙáC Çq5®,¥ÊN}ï?ø¢>B1—NF¹O’¡r™VEðaâEï ùÐé\òº\G©Ð`y“»ˆ~'2ø¸ä3åPûF·HfXpÒ«Å,Ml"à4õ¥“—hä¡‚ÃãÆû‚çúÖØX`é² |€Ž%™díÃ¥ŒéÖ•rº¹<êgàr1?™â*ΨWï™Çsˆr™JO xá)ÿà |-jï‘U±‘RI\ßïêB£¨Ú6|ØÌãƒÚvŸýEÇ(› ¤[†’eUlµGþÃøj¨¯í­–—pá{ØF‰¥™9eéqÁ,Mr¨¥I¨è3t ÞÖÆD>w½­<䨖nݸ#¼†ýWîŒÇÏ`Ã9-ìg3Ì$b±¡qÐUv{ÝùƒÃ§ûUœÝ8ó¦I‰úÜÍ)ß?ކ4©•ÖGÄ~^>=B°ò¯3ÈhôY,õ¬ù±E «µe³rBîÇð¥ÕMÊ»¼ S•{$äå'ŽÕ²Œwž ]vhà2aáñ×47þÈ¢;ßÄi¾þž„§Q,6ŠüÛy{zïNŽ5ÂÊJ8WEÕ7ipC…ú¡ó4Dubí·f¸Ø¹˜W~f}Î֤퓣PR* î¼AôÁ?P[sþ¾òÆ´¢qÁá–›_ a»¸ÃT\RÞ![:;¦Kª_0áù '|ѓ焿ÞÛ5Ë/þ(eÓz𶾍] ‚±ÎŒ_†®OïKÉWËÇ©÷“ˆëè'¼T^‹'ŽÔ’ 6ºÈ;áÄ%œ@òŒQ2•ÞVŒTöŸ³b\¤‡hðh²xü…÷xKì‡ÿ“ÐÛ4ÜV]DÕ¾õºƒŒ î˜äô›`Ëáaõ\{Í/ÃÀÊ‹»2«ßwoJÚI6Dª~Òˆn*… ‘caqXk}?榽Fº8©×|¢6®LÃ^ÝQ¯ïúOkFLD&q”Bõk”i"·«‡i™‰ÎË{ÂŒ“ÌÙv|È|&ËÄ1GüäžOŠBà4ȉ< ¬%þà¦Db å4‰ñ ÙV0qÑϽ.+ÃT÷'s ½.TÁƒ7jº1pc`»ÜM¸›½yh_¨NÉ9¹P¢p,°‰…ÛÈŒ+‰È¼°6E ;MjeëoV´v Yˆíf ‰`¥¬2¤#Tź^,÷„©àKÒ¥ø ¥ƒªYU Iž®Ç‘m(¯ìà[)ÔË ¦ „˜µh„ŠiGíËÕõ’ô_k;g‘J£½ÑÐ8¨ ”\l”:8z_'Ø93ØWRg>DÝtùÔé;‹¹*·¢%¸n°p*Úít,:G‹ƒGtvÞ.¾NàÚ/¨U¹½é›³œ•;ªÊ½, ëQ,øLPÂmmÓÄ ÎZsQSú«6ðv~}+t|MBcƒ õ橽…RcŸpGW½w) ›dï=Ì›±¶—žÝŒ•À÷îãî"ù„$%Z] óyÌã⾘to…ßÑkS‡åå‡Wº” £…êCnâüÎg >\; ¨ û=¼=¤c”›0¡\m‚æLÛ14_Ë5ß©—çÔí×'FlKò7F›G¡«¸ • Ã$[¦SƒBdõ^ḃ˨l):Á½Ž¡9šSÏ|yÞ”Z¸ં !ê{Öº;~u.`†ÒH¡¡ÆWô L[|Á¤/°W–pE˜œœðC¢¾#Å=ðÏï„~ _«ï"ð¤Ä@œÓ³7ª¦pLàY™ÕûA$Vª/^2ˆ"¸ N?iÁ#ý*¿¯Z¹š†„Tz\•Øç6Õº—Z#TZ©yv>vàªIË™Ð|:7ü3ÜZÛ—“Äqâ“¶Âç0ÍO‘èÞ±†Tä4Ý0yÒÅŠÍ_¦&bÓ!ͬéQÏujõ-|Z[V5RÆæÕܤ‚Ê×# ú«Ák˜ì€±|ºÃcpÖÔ‘…íööFȶ7EzžÅÎ÷kö¯Ðüºˆk+™·Ž½©¡W­¶‹ª£ôà«1Yi$Ûæº²™(ÚÍѹ3°w¡ËkZÆ< cÒ`˜×È¥öÈí©zqÓš–ë›dUÆ ÚÙ§èY9íu>8jYR°?*†0Y7R8 øÜLõØ °E–ŸÓëzñ/çI‹)©xv¶ òh±[éŒ Õf4/w¬5D]£ äü¡¾¡#ù¾%ÆŸµÃÁ6^«Ë©—¾w]ò…D—Ê¥ éRŸ¡ ($¥áåÏ•|ì#g1aqWè|ì`¶ ˜pãVðWº­ º)_ ¹­¯Ž”‡^ã¼æj¸—zPõJ?³C<¨ œMKnD3{½ž¹oõ— "Exlÿ$Š÷Pµ\¢0jÙDB’U`e{=P"²«é|qµøÒZp¼qyEµÅ%L;óA#ÿ(b˜rªW ñAmuoԹɥð»Q‡]ÖP3•_´Ÿ É‰ ›ˆøÙXED|ÂfW¼.Ö‹²Yc’Žø4Y D €ò¡":zîx÷´ü“ÛéøŸ­Ã‡Øt8ì4r¿Ì5¹›¨~:Üzºÿ°R›ÈÖè¡PIÇh—È XÊêÁçs†q8EÆFE4{½ªD)xÎP’_ŒÜx‚¢“I6êGÖý3\~=`·Í;®ƒÕâ‘bW½5Á¸„{ñ",BÎGß" ÞbæÖƒ•—à >­"µ.[ªû¸)DEü´3‰Q|Èʉ]5̘SO#}¯!C^¯Ù>Ã6>™ÌིÍ)èÐޜۿà‰¡Up%Ï¢UË^ÜS©2™0M Ñ*ž[.‘%ñZϨÀ#Šm@ðìR [Ï?öíÞm“g E¸_¯evâ1FëóAzPgÉ¢Á»,,-£€AúœÛ_Š7b4X|<Îé@§­ Ù½™³I&h• ¶Öá„Þ_ášúü—$…Í~]ÎŒÔ6*Ž<éTƒ–:÷ÎÔ°æ)†âõP«¼ÌÖå¨O=•7è}xá¥í9——¦þ³GV=\ý€7\´KMßDªÊh`&Ê>¨}‹±OÿÐÔ^"¤T¸Ê@&ì=ÊG*ŠÇA7ø®26ª½‰¦!|vóA侉6 '=G Æ¡<º¬Sqá\ǽ·ª÷~ÑjT’RMù ò»ZÒ¡ªSŠ€‘óÜºß¹Š‰|ѯàåÛ4TvcôÔ¾*Þ¾ñµÛÇ ¯µv˜ˆ+[æèËe+jvZ²ŽòJa¼Á³!x¾(ËqÌïÞooÚ ¦ÇèYErj¿÷¡Ôå¶Sw;,¼j§HÐO8"¢üaë0õXÃýˆ2íÐP4ZiL9IÛ_bÉõëÃèˆlq[\íŠ{ˆcãS«;6{TïnN²šSI̶~Ófö ç–žGø±×—þM0ä^ a™é‰Á­UÊ ÝQ Ñaô“ñKé}_Ϙ5¬h©ÙLÒûš§yË4ÛáÛ_"•ýCzíf$õ?­WyS:\;¬JÖTZÝ”Ë'Ÿi â›c=Ñ p¯œ¹GšY¯É;ö:6¶è°Ð’‘ÕǶ 8ï&}…P)ê.d¾]d=^À‚ûß}9JÄÔôm1^™"Þ„&Üd›í® XP§ûœá~è@ŒYWlÐøBÆ}€%ݾ$M)$WvkzHøA¿vŠý§Åd»c3*ÒøÛg›ØÇMwtïzütãì{Ç[˜,²Zñ§i®ýž¥–5Òè C4oe¨*Õá÷»QÕc#ûƒû<:j¯äôà±Nk»€²•?«Õ²ˆN›N`ð¤C±Ú‡[íx8+áÄ‹ÝÊÅÀøºÁÉúm> !À™Ï¸+¯=äærøñ_ä2SÙ1è›ÙÏ2óüÜsÌ[øcØ›JàYªð›W¹Nà×~¯Îx¿z“Ù¦`v ô•æ.°-èŠ^%õn6ݘO>5ËV}*éìª&³`½¼e”ÊÔ)j4S’…Vu0’}4̯<qWYWí»n]9H"sö‡¬K3p3ß±O€ÝŒ€)Y‡ œ¦Fu˜—éåõô>V?•×rëì5þäCùY𲸦yùm®Ð fIø>æ G1tó+M"@ìµÎ"ædùÎcMžÑÇögÂh~²üÙ V¼ üCVÎá‘‚7÷ŽįJ”å{â_m8TAEõÈÌ×B ¾É°[+ȫ̘8…±1}±½÷ß);^)íû-6ÜKΤG¥¯aÈÃ9ßbX&õýÈB1‘ýxµ¾PúÆUäè¥2,à6¼ÃØ4Oß¹ß:´Uc ‡?*•Hü(áúóÚ>[…¼% /¥\Ÿ¾YÞFÆ®BŽcù-ä”[鈭´Ä§S¸ s„›mGbSöXt™TާA¶µý£Ï˜wß.n›Š]r'Fk²®BûSF¶;IT¼ E[Æ«x™W³8O'¦ŠÀÛóÞ8Û>ÉQ§ËŠQY™2怜jÎG5Œ°Wjäq›š$ù #Êw3Å3Û è²¼pbó¶³(`0d ò÷ K:`+© ]“àkëã¶çßZ==BÄzœK§ÖäÇut{¬x²yFçc–ú´Zª|(sדjm'3ƒ:€à¾jÚxðÅ#´ ‰ãZáT eé ÷r÷Ci¡ è`új¡úºð­xܨy¶ž—è†ãS«îrlЌ͚‚×Â+·ô˜_a|f,^â4Ø‹×@‹*Ò–Ó¶7£Â>Ûdµ-×ýPTøbWµ¼)µ7‹+艧.׉3ëÎÁ—××&^×Óbé×’¯5{c~+Õm/ß× t”‚=&gî¦z}³‰\»•r4Âtr3ý¢÷ºV\ð”4¶žR.ª3éÚÈPN½c–[©zFsQ”ÅF›ø‰»9ýh¥ÂoGÉL?ÝGí~2Zÿã¬ÔþÒŸ†ì°µ=÷Ýù5 Cd›ÖpæStçÄæ•4»Q)õÎ{?LŽ-%‚°öS0zO×AÂVþâdl]Õ-‹;:Ñ£ò¥õŸJY}ë+Ù²½ü×µª’÷›˜.r=-0‘õèjŽ-ñVn™cÚO÷ŽjÊñ%JtSÃýÕíH÷VḫgAc&ȵ†0±2jaû3»ª‰…tl´‡bÒÓeùØ4å¦rÖ˜pîƒ#Öû.-ߢà«,©œØáÊoïgðÓàs&s£Äµu|³F;9 ƒ^ ¯’¡os%kkákj†óºÆ7ÄêÍ‹­÷k`M·Ô!ô  ðŠÒÜÂùU¾Çõ_B¡³Ö¹Eá¸ñïÖ õ±ªzmTœ™ïïm¶|x6‹íÜF8ÐèÞ)ëÚ®HB±­ãßÀ¥E"†Ì‰!ç&_•ÚRMÚwrO ¬õël9w¦ã‚Ä£jB£Æp¦”Åõ㑂ʦʼ—0*._O2¦ ²ÃùO7!‰à»Žôò“åŒÃFVàJ$ØV8”a\ã%äMõù:ÙZEûÇ Wâ:hǰoÎÇ«† _äUÞ’yýÊ´A° Côdß)Ú:åDÎôFVæ ˜¿N…Œ´Tb| \ê‰dYHˆÌ_ý´†W«¬ê_p¿ˆo$¥à{d ƒ†¡S(î«! 8a¸6 O6\)Ùb)ÀÂV¿\.œZ*n(P~×wëµ^~XÛ"pc?×O%0"~·™ÄÔ¾7·N¿…–[1ﱦÌv@¾;‡0 ]Ï=) ch|K ™ìÈ.ý¢³ »Äšå´†½ñu.t%ÅñEÖs†›¤O´0„7ÿ—íz*^_òîF%r¼ŸJcqÅèb^†oÔ¹*~‚®Ø ‹Þ&;4a ÁμElzÂeV,(!è3uƒû¬8-»edå‡[)N'š/¯Ñ}‡`^5´ó¦÷•µÐ7ÅÂTåŒaj‚,;e7E#éì£2â&Vt…¯AصÉOœ¸aq%Çd½âï¡úÔ¬—ÐrnÕâwàWû)„nKÀS^ì AG÷GyÖæ³F‡¨|àuà/‹å‡oµPê;ˆ$‡ÔS†^¤JT€E9 µZ„Ç@^±¦ñëwû©H ÞÔoëòšJPêI³^6Ëý „\5¸URBφØ÷–`S·k“Éгõ5â* ßU³ªGÞR EóÞ ~iª€d ÒÐéËOåú1uÌûðå¶Á…»åû»¿Œh¶æog->²: ,Œ–@·eä_‰T ŽMe‡ìïs+ß…]ò†Gj 5]@?èÈæ! 3,üpJª$”GÅ6<ÄÛ^'­—2ã­†ó‹”ÞêÓ>L—DÛp}ß‘åyë1g♣LSÓî .X±ø zgsÆi.C;<¿n ¨Áùô]bq‚{î‚—¿9&-6^jA¨O‰éô…ñ¬ÅcëòÕJƒ}œ„g9åÒëãž'º/sþ-„€Ûé@ñÏJz÷Wƒ.e;+Á”ŒŽO:óøM)¿6,Ù­ó-ϸ37©È¤E.÷!4cäNwíÞ¦ 8Ý䨾¼'`5žhµÒîZžE¬sx•þiaN͆¹•*òJ,Îï/Ù‚Ÿ¯_y,^BŒÏÕ®.”â#Õ(öþŠ °/ä¾%B‘?$•˃ûñ,õ¬¡Ìtè/vXþá®ë"bÝä- \¿Gö¨•…ØFx lU.ã ZãOºJ&–-ÿg_K„™÷÷E+”‚eÐèØCùÀ"gH‰Y§ƒ¦‘à9EžÀwýÊåEô%ݽ'6õü´ì&f¾ä–#Ð~fDq£E£(«Ìé¼IôÜååIˆØÆAÏðè6ñ?Q½¤ ¯P`PjÖŸ¨wÚ¥×|Oòù¬£¬`?œ|k€Iª‚2?õ™˜>a52Œè= á€ã;›´üaAFU ŒÈ:¡¹„Ks{Šò¾ÉáÑOßä’ú;4^±Ôï< LÄšiß´h”¤[LßÍ’àûRa'¯†ÝªÞÊ ¡$b)h((Ûzz/ì´´q´ÔËM|ÙÁ“‹¾È"¡ÃÅÂÏÒù¹õÞ/Ðí $Š“á’ŠãÓsÏ\ŽéàÞ˜ÚáoPú)+¯}õ¯N²TUZíMåÚómÅê\Å©r>Û1?S˯fçS1Wi[¢Oì—ýÙUøÆW¬ÑòÒ¾…±à«-Ìã«[·O–¯ì/mm$èÂÅžß’¿%/_+Zv)nO0"¯L¥[;­÷Qä8øo0H°dl?Ñ p b>(9I"wîc Š?ßvx¥7d$tüt/B­Q$„Dz»0Ÿ/8_iQ°¥±Q¶¡{Ù–ÑùðVú58g´(o7 ¶áÊ$ÏcU÷D[«Ì]Nê#0\°ø¢¸A¾q 3ºvI‹g0È6ø}ðÄ4ÎŽ ßzqà@c¥B¾øÁËÞ*ÿ/¡ †ˆ¾ƒK†^b†p³øÐºÎÌXkõ”µ¨ˆ@×§2à5Íñª{Ìé áä•Ñ'Äwí ºü|E)#¡9þ7eTtM+"•ͼÈÏt'HP- kÄ¿äkÞºjN_Ôqú\d!nõõ5ÄJÄÕCïéÜ¡.Í ­Þ±Ù\ͦäèµå7gÛ䵦kE41–ÍÁE8¨>X¤¼ŸƒœæÛFj÷ŠÄ–öÙ‡»7i6Ášm"!A%Ýä¬\Ά*8F¦T¬àîËeȬ å<þDA*‘‰7A Äi&¸© &¿Í"TŸÔýõï5%Ý"Ù`·œë(Wu/ønEi û¨¢Ç” +­ŒîÌœN4o¨’<;¤â›Åï£XTÓQ–ä}ÝmÌ| gyæçÊÓa­Õõl0¡bËz~©ìœj´4ë^Ö7 ñ3›ƒzŠ‡È¥ªè_dU* Ÿúáé·8‚tã¹ÓòæÚog?E¬âÚjgFo­ 6¾wí´frÛ=ãžiM¡Å”¥vÕYHwƒ×L_Ïþ¸@møÀˆÝ¥Å1áì¯v/OÞ ¯è!Ó‰ |âr%‚ u‘_ëâÐ!Ò5/5Ûf£ô•uïQû\5 ú!ÓlA¯”²L rÿÆøÂÕkwð([å«?òûË”‹*¦òÁo rÝü<¢<ƒá6—Žˆ0ožéüšÞdÒ.2üéFgOïp.9Lä ¹ì>Çáî<ÊHÎu(<_OÑ¢·Z!=¹ò˜#'¨4ÆM º—½ïG 6ôÄ]\Ý)xK@Äïç:Éê²ûÈJê‹g<óάÕOŲÕmH4>†Ão"]Ǧ:j0†Cõd&ðYh“/]Ùmõë!àÙD÷§|öðà0_D¬3_ƒÐ¥p€7,?+ŽŠReU¼gÜpü„†Øð6×qÿQà*S@úOIa«Z1ä>FIòÃå;K$¯{ÔL`,C•É7æc¶€µ¸]é h$¼¶²ùÑ‚ÖÒ@¾îFŽˆøv9©ü4fƽ¨æ—wǦ…Ì?x?±–ˆj½øTàÇZÕ˜+¶¸£tqe×oU¼ ß^Ýú<Ùw3à Í<ÕÄþ‘þs³Ðg'!Yñ À=1øê^ ö4êgðèQêÑˤf´¢Ï/£k{ÇJ+·eÍW2[²¤ ÔÔG2fiYý] ùã?unHJ7|ñÀŒ¶ø‚£Þ}úå?«éÌàD‡vH´ø)ÙÖTN&‘B«øÜB§çþ#;é0® òá÷ï„ÊÙRI Épz£0¿§Õ¡`Ÿ9 æ—MWxKà݆L}5Ç Íú0ö¨‹r‘AãóG,.ö«²À7Újè-AÙÅ5&&½EΧ,ÞÖÕƒr>Ä:ÒÞ&žéu0 «¾Ü€ *ZÝ®Ôz休à ºfŸ-½ê\™]V}\Zûü“ý>ê°8K3ASî‹M_ÄÉ ]?¹´2ø„ä!¤¦Ïßä¯]º—NØ"E©m?RUÆFk¶÷~>kj!ÍA¹¿rðy¾ŒõbÕŠ'%:Œ4•¨„r=àn¸§(Â}ŠˆkæÄ|ƒÅöSº´¨ †g¢Ðºfè–Áõ?!á¨ÎÛ úÒ*âÕ+dYºéûZI{T:¶©^Ðrghvî-%E³Ì„6É^L!¡½F¯ŠH2«Ä¡¡V™Èá¼¾vgn !ÒVòÉ ajî~${OÄ×2;\êrkåáÐs'!Ldy|Ðf“9¨ùë…w'‡äx¿9º –#¡S¯ãi¤†b£´Gïu<Š»–u:©Â/é=ž2˜¿›ÿ!i »ŠcHÚ%Fw}žÑ©°B‚ÜöIØûOq³óÐÔ˜à'£vSø]–zTLØvKqÖÄŠm6“Û§c²Ú\JȬ¬ZÚÌ…ç_Ðàˆ2>.ÿ,°Ü¥—×cÕ²¹Ò Ió*¹.8¤²äÕ2†ÅtˆY¸ š Žò±{YežS]#þz£Š1§Ç]j™Ûñ]/ÿ„6ErÅ-ÜDèH˜@DÎ8É0¢ó½fY „{pÖ¿g7…„ï5a¾q,ß”¢g»NÚÌŒ]̲ÄÏŠ¼JƒŒºiâ/íŸn‹aú®«X‚^ŸœUÓwvb¤\ “˜jUî7òo*xÖŸ‰_|òô’<Þ‘Ö€ÁH4ü®$ÁJ¸©-v\fL¸¯ ÐÇíûR~±ÈÙþK°ZFþ©®Yщ?á×§$î<œù 5åÜqžú"ÇsäKþÑ#ÌNéIûôqš~Yè(ŠñâŰv/Ã}V’o2D¯Aï ›ÏŒ9Ò±Ò¡Á¯ê×=$Y¨VPöQN ÞʼnS\ÀÖ:ΫþØ/L “["ã³B ƈ<ðÁw%_V ~ ³Ý€~y åÌú4˜{úlgL~ßõ%Uþjk)«Þaº÷éî<ÿãwˆ,—Yâ&7kÑYñ¨:}qvúüµjRÓί,Â$ö¥—{Û[!2¿ZC&™pšg­w“½[Ò3¥óô9ÍE†ñè•´Ÿ1X3ÛꙨ¤;w¬<*ðÁçBò~¼Ô¨¹Àâß|¼:ÊÖH¸¾: ®tÐoÄ¥25-m) £3Ká°IN—u—:PVˆç ñ@¿óp¨…¬›žß5È]==&/fð"Ûf+,c¿—’âE=ݽ ëîUeÇWÞXÕÉôMϹíJ­‡ƒ&·¶Â—ºq­I4a¡z¨´óƒ¢öž|ùî:•;Óº–GŽúžüó Ögvá'Ľ%%ù4XXýÊÔ³m™Mmæ^Ò—e‹I‡°Ç¸p$ÿ} Ì ÀV¥W5|iÐå QJ‰x¶âu¸ùdX6>ªÔ²)ˉèÈ€øfÙó ¯f ìÂÄ'IŒú']/bÁ)&*µ>RŠ:ù˜—°¯/X-/Å÷ÍkîdÄØúýØù¾ìÐß.ª‘R :´Ð9J¾ö…ϯZõå¨]'*˜}!HXÒwºÁ×JdáœÑúæe[áx þÝ­×ë;šœ”Ü!9m±Ô Nºtºþu÷d£Ölc¬8Ǽr,xÅ/8¹(58î›!’•³£,¹å°4òî¾ÛnX³¶Qý Û µD©Ä]£k^ýÙ¬Æ^Ïv‰ªÌ-wáóOî1iåRsêä.Q‡ëðžV~#Àww03Äò~‡ëujß®-Š5]8Zý°[ÈmïÈ3c'ÒËl3ž(Íãån¸ë˼eG€–ª‘ÜBÔDWZ% {­FçÃÇÃ;‡»,¹äú~–A­Žis|é¸0`§7.¸|­NÓÏVÓwz²¢ÄVL–Ñ¢Ðr4Ç7ä ÞÓ%°7ÅÐÁ„S$ H_ ÌtžÏç àðÝèm3¤öÓ#nú‘¿ÂÒá É庶êÏüðNl…î’ÃúÎêQÚ‚šžŒ¶cÃgîŒÃЈøLÅï±[ZÞÔKÒ(?Þor@Yp"±WJä+ê*¡u†qÞG.å{¿™,®V‹K|_&¥Þ‡‡A3µ?¥)ߥ# "^¸»²É£ë$ÍÎÁ I@w-üÉv~!)RÍš)~Ñ;Yž³äÜA÷©ÇbÖ›()Æ4~[×ĸ! ]"®©m2‚ŽbÛt2’Œú…Ø«ìcKŠ›øÄÍö°Ï4£X½ðèX9xÐ\E­\²×î³ '~SÇJ6¢Þpm{†ŠbžÝUº“·Ìl#ß” _1#Õw1¬¬géäóbÓoâ¼Æ8ØÏ5•'ázÚåJâÛ®U¦×Ò7{C·B}WKØqyÛ”Íç!Y¼õŸ´o˜Ús\Œ\‚ûÚ".e’HÙùoÈyí&œè£ãÚÕUêµTT¢‡xׯKÄÚ)ßî-® ·Óíµ7 »£/ñÖ¬×!‰‡›q÷Äkåã¬ñ‡Ù+ÞQuK¦€íòsU²åW‰þjË`„…Wƒ—XpWgý$¸E|hì£ñ´6ÌÓ˜=GJæ‰[ŒW.ûµÜ­Ó“~ ¨H‡¯“OÍù‡ú¡cªj#ŠrÁ)?[kŒ?çHò|$}rï¢FmïÏ-*%'ý‹)±4y-›¯‡.ÀüÂs¥‹¢ ˆŸ|Ý,97Çá FH»”[Z3ÎÈ݆ÙBã / ÜE ’7fZñ{¶n'ü¦‹p$ˆpûÍÒKåõ'Ý(zè`/9Ê5ûù&û:jûÝ&“ž‰ûöÞwî•À@C9¤,œVJ­Ec³<øàayÁ_eýk˜qò,ràŸðæš!Ð+ѬŸ‘è#¬Ñg 1´ì8æ_”Äb-7¡}¨Øñ Ÿ<‚xòŠ1)9²»Z”1²8;Ç๿¸çt¤ï¥\Ñô°ö½8¿' {ÜàgM …4ã’0Ùzv|…+ à>Æ6V´ÒDdV¬0©¶ÁÖÑã;©yÐM6ÐØo™¼ a½{s¡OP4Váõ }p2Sìÿú^­µ¤Î¶×ø²qÞýÙ<3Š’\Z°­Ô´ýÐÕ·bn·&Vñ×5c>wV¤–'>ÇÑ)—9~$ž#ÛéÇ¥µPîrdÅnØê ûw€SO³gRÒhÈézÔ8Ì«déc)ÖiUù4Š¥ý#Fp^Z"£Nbï’à4îª#½|&xAC…­@œŒ5ç…ä•êFìá†9Xµ¥‘Rñ4Ûñr"š>D! x×ïÀªÄ8¡x„m€Šæ7°óJm&‚»gì·ë;zkr.¯YŃ®ñ]Æe=H'‚ ö`¸Ù©Ýuã]–F:‚îU=Ë>¤¸« w). ­š"­¼ÖÒŽ¯{±idá4gɰCWN»%ÖWPú=$jŸÌ™Ït{ZãÔßAäÀŒiYc°¡iZ.õø§¸´¶!ÎÅmîcÿ'H·ü¼F/Ͱ¸ðÝ…Ï^ƒxa#Ô<Ú8—Yñã‹Eu­ìê ‘çÁ3Ç]úÊ«s®k¯j° €çPâ÷àlóþ·‹$Ô”?J8ÎE“ó¯#Ô5K '!«‹¡DÉÇ•n‰•ë€ni¼P~ã±ô0”â‘÷ÈÑJƒíåºÂ@á©1bí¥”k@ìÍÑÂñA×±­@Ä'4¡µ62Ã}|ÑëaBà4/%„ q¯çHìÿ H«ÀFasÝ*Dz+áVÊN—ëíôœ.°VÍ(s¥°ôTM3s©}Ž¢Ô7aRX'²‚Çò·öÍÞÆ"¥ƒ<î>´½–ÉHjH ñ|º aEìYð—4úçŒå΋*Ý"+g#iÑÏ#‰“S}SÁ±2Èñu…öŸÂÖ-„ÎÛ=OZ$1–n$ˆëØ0̰5e9zŒ2<¶×`ý`õ)ÍR9qÆøú¼ÞÄ Ö_—W²¡› ®I»ã{ X3Wv´·'ûec‚¸PL¡â Yù ;EN·e³B¤˜°LØZ•Š>G`vÒmN!hì¿/ê5&Òj0¹ Ï迹ðüÊЯ<@miiX?>‚a‡Rní¶zÉvˆ$ä뿘Cñnç.¹oK`pâ,¥Q\Bt˜ÄÅÄt ŠaDœÿfË:ì­B6y >› Õˆ÷~„Á¡ŒŒØÃƒMñûˆ‚y2›Il/ȼÉH*Úògë§Vù´7€%Œjö–‡cЂëݤ„“HÏ`ñû|XÏÌÎŒûÃücmŠpæ,ÓÀ)éTnÙ<@Žt+÷Ê>íS«C0âðNE9™cã´B«²yM åï(M3T‚ÿᬃòjªiÿ© U2ü«^ïP"÷:Ka»5 ¸œ8´¼UL‹W˜ೞ` X£zàÿ¬oî¸Usd 2{‘8êÛÉ„Ë\=(Þøç5]ÚHþ·Á¬w‰Ò¾ÊåÕZÿ.¢?úVÐ*GaOsa_ ±ESç¢È ‹ÀñsË`už6äãN Szƒ×IŽ´8Xt{kð>¸L4¦)œö y—2K®ènÔ Á×—’ëªU~IÏFÒ°ªïúOå²0¾ ¼â8;ýh&l~VfgÜ endstream endobj 2607 0 obj << /Length1 1485 /Length2 6466 /Length3 0 /Length 7468 /Filter /FlateDecode >> stream xÚx4Ûíû¾¢VÍ*j‡Ú31kïU{ï„HTbS{ÖÞ«VkWQ[–¢¨]«”Eí¢¨R¿t¼ï÷}¿ÿÿ9¿ßÉ9É繯{<×s_÷“œ°³èò+8 í¡ªHš$”(išƒ€ PX"bg7‚¡áпìDì&P ‰ü‡‡’ŒÆØ”ÁhŒ£6¸ç €„ 1I¸$%þrDzH”Á^0€¶àE±+!Ý}=`NÎhL¿\nHBBœïW8@Á ꃀm0ÚꆩÆH ŠöýW .ig4Ú]RPÐÛÛ[ì†@z8Éró¼ahg€õð‚:~Rè€Ý ¨ ±Œœa¨ß€!Òí ö€08 E 0!ž¨S`¨¡Ðu‡"~;kývàü9Hôwº?Ñ?Á¿‚ÁÒÍŒð…!œŽ08 «ª%€öAóÀ‡ŸŽ`8 ‰‰{ap°=Æá×ÖÁU}Ãð?ÄæŽF  `ðŸ¦Á³ ÂA éæE QD?÷§ ó€B0çî+ø§¹®¤7Âÿ¯•# áàø“†ƒ§» 1vߪ¡üÇc"úÍ Šˆ%ÄÄDAè}Ôâ,ø³€‘¯;ôøËŒáèïŽt8bh@aŽPÌ‘? ì =<¡þÿþ½"0`u‚!ˆþ“c†:þ^cúïóX1ò€?_?Ycæ€DÀ}ÿãþ«Å‚ZZzšŠê¼(ÿ **"}þüB~ 1 ‰ÄÅEÿÎó÷ üÅþ—U û³»dÔ@8"¿I`Nï/"^”Áõgl¸ÿ® ƒÄè àúü­€¢@æ ô‚_!ÿ?íÿÌò¿Êÿ¿w¤ê ‡ÿ¹~;ü?8Ø ÷ýãѳ'3ÚHÌ„ þÛÕú{ µ¡0O·ÿF5Ð`ÌŒ( œ0:ç‰E~Ûa(U˜ÔA††8ÿÖÒ_ÍÀÔ€ÃP=$ öóÞÁDÿ…aF⊹[P˜–ý‚ ˜Éúw]éðs…DÅ`°/F˜•(À„™U¨Ï/‰H4&€ápDzýl,³OA0ÂÉÞ q…bîHGôO‡?˜è?±ß ýÄ`ö˜Ã…þÃ$ „À< p(ägÿÿÚ-ÄÓÃ3пd…¡ò×ú×í…ú@!DsÓHˆT¸Ëóðö³ZzoþOÃxKË1Iæ½Ñ¢hŽ™Bg-üµ‰ûŠvÕ·‡2õf+"ǧèyöÎF|¬^å…,f¨ ±TzWø‹¾½r‚29 éœFÅ3cV)ö“õÉì,q-9SM§/"Ä»…7ž­?¹ìDmXHlÜ¥'ä,ôèx…üÎmì‡æ,lËèAs+ò„›–YžFÆ£—Øa §Šíq´ß|W-²?|x“××›)|X¬ÙS#VII{ËïKþPJ?-UrÞ½f‡¢è‰REz+m‰[$Ç"Žøâ÷Éâ¾ÉýžN:J!7t¼mò¬GŠNËäw/2Ø®å}$¹Ý’ãÌW›É¦È^ã€u2˜µ_# /èÁ¥fàÕwÎ_iO"ËÊO͵°ß7Åá?¶Y»}fŸ“ ²N—ßíÿøXQLÎä>ähúþB:@IÇN©§£Ãâ²ì9t‡Oàëã^X•s*âx³åMû`wÔ’m‘j"$ɬ#gûõVr³†èÉ; 1tæ ²Ë–;1?q2È  WïE§š”…¼Äìk¢‰0Y‘ÅŒ‘ÖV–¡¹d„Bð$9)¥ë^ã³÷OÅÞÊ„¶È¤ß >˜;¸¦¬¿“H^·zC¿ûÛu›${A!Í‚N g»2Î{h‘$XÓvÒŦ¢ùDÈøôbâã [ÊòVŽñß¾n7î˜)ÔG[ÀcÒº&‚Vm¿eì°èK`Èz9¶ÓÓÁ™¾á£Þx~‚{@i?¨&ÙÏ^¯jJmSúÐGclÙÖj?n!ðè~ëØtüdy*%²ân³Ù¨³ïþ½ò¾¢2à&çl„„ðjµv0‡„?.q´I2É×»7IÀc¡BÓ,gÇ&¢5¸œæ{êâmK¶‡-±õçjî'= (ÛêïõûANqJBUï~÷Ò^ø(h¦+öÆWÙU·÷`{ÃÚô>½r¨v+^´¹ÈRÙQd E±yâÔÛb3=•­K¡U[¡ÖÕ­Hõt"Ïí­-ήvOÚ€H’³“sSfFƒ•´ÃÒÝìÖÄIìãïi«YpfÕ+j« - lgÐ3&Õ|û/¥Õ£¼Qp¥3k@iÉ|7A8ƒ—ã2Œ×qôvžöö.s}à)\޳ͺWmdðtݺÒ-rü¬,\³Rw`"EãFÜóÉçß7n5 øa‹ž4•Êîzû%«ßSžëN%šçmåä ãÂ<ÿ€Õ¯_õÁŸTËá8éGw}pŸÒã?™@§¨›*”wW¯HÕ³¼7YûA¢Ô6x+ÌYŸ9ïÕ–¿“"×]ŸÆ,•–W'3´ ËÞ·ZVÕiÅZõ­)=‡fÜ`÷º—Rúl nž¾²3-餼-_~?õPY‡ëMêx{Gø†‚Æ™ž ve}¶÷\e©ƒÆ€ºŸ+äT8Ìç{Sì@ÈŽá ±žF½£¿æHÅ0Š.‚xoؼ¦½hWpÇëUâ¨eQë÷Y¦-vÝ"ùílõ°ÈÔ›Ò‹zœ ÷Íy%Oñõ±5°:—iË×oË-§ºóL‡‹{‘ÎÐÈÌëP«jd©òOtRDm„ÓcŒ>Õßul‹Ðùê—F…µêr‡7<ŠO®O°“F†«?9O1ð{LytäøÙ?j̆BÙyáXz­Ø?;{E1}hk:ðüeß\>JÈ‘SéÈwq¥Ö¶ÿÙä3ykÓÝÔ:ø}Î0ÚõkšÑ"®º24»?ªä§)å p¾zH•‡‹4ë®Øï²yHÅ îãX¾gÁÛ9=o™Ýœ´B¾µ™akæˆûtthMqžž¸ÖŒjå%˜´²bÃÃbôéu0˜ä{ùéÞÜXý2uH‡!k‘Tâfú…§ –a ‘‚èa¶˜¢ Å|±b>Ûh• :;±n´5bü´‚ÒZo˜?(Ð?z¼o@¾`2ƒ÷!CŒôÚe<⎘_m˜ü8å_I¢SеïÌŽúVùù €Õ:³¬ó„:tíÓS“÷k#ýa]àŠëãM¹)>bìÝC{t<5Ë™\,ùJ7Ú«Û¶ ÏàóÛz‰$C€ ŽÞ.‹¾û)á«$úÓV±ÓöWR%õ›]}k^³L®Ä¾ Ôê)¾îRtÊ3«€TÚ]PÞ˜äA¸õÓ¹ö~jJr¬ì¡Ð%Þ,›uÃbñC%z›lëÍ­’Wï¸:TîÌn–8p>íùÔEÏßÚDüFK¾Àþ%!0j®‹>nv†Øm(¢Æâ‚îu±éÝÑ—Çsñ¡£ÆQä­9ì§±¹Zê%ïÚ4Žšò¹³¾âßÏ癇˜û¦÷¿()ȽFDi«ý6îÒŽ_¾xÓï’žó8o´nì¤mX>ð„ÌAîC.%W˜yXÄëSWÓF󗻪³Ò›ŠõŸ]ëç{ð— v¹ÞOÚͲ“±..wÜÂ_`Å}†¸…!'ßìTˆÐêj£ª/ò}DšøÞ‹ùæ>'L¯ÓT! ïžÏá¤h÷mÏVŸ0Ro£g#p.Ô¡9‘szJ Ÿ½tö6XÕĉKwHöð ò­AE 4I/ãÒx6j¹ÖZM¦¾,Ū•?…‹‡j:Ò›Þò[ô(°Ý•ù®ÆêÏY)2i¦ (åêºÝ“^¹Oë'¸Pß4ç7¡ÕcУ|©O„ŸìÛ2Pe×½)–ÎÂð¼åH¡9ê)Atý›eÚÙ…µ´ÖWhxg݈úe‘%–QˆjD»˜1B/†§¡ ­H,u,íÄòv}u›éLÄ-NPžcëÙe2Îþi¨ê1‘ƒuݼãw´q·¯7 «DÖáÊÅ×('>¤§ÑÄ­=s™ö~Ù['¥AÚä£äýÙ—m9×$ü®¿ød­´$øý -¹7+òz’‘g7S"®ÏctJãaÒ¥ÆxWó„ÒÇ¥¨M€oøŒ×T;ýü qF.\Yk_ßG8ä´I¥ò1ò:¹+óÕò½’ p©¥PÏý:Eœ²ŸQÓ˜9Ë@$ðYPµœž~ uXœ6È[n‹Å`eð†;ÓÑv‘êBצÝÜ÷îE!äkëV2B®l¶&‚„ËVô©>w)2™?`;P)n£Nr‘!zh-¨Ú|äï}½Æ–LTø´DuÏi²«^ä‘böæZîŽByÕÍåŽûÏG†È˜—^.Ž‹4âÇ2E=IÛ=Ós¼ýŽðéß´aoØñjûu†B'e–É^yÙ}$no¬ûOsÜäsªÆvU@^²5*XÔ:rãmZs9ÍÂh§êpv¤¶.'9Tævõ+Gšk̽9—,ëÜ]žÍ‡îå¾ÂgÈ•Ø3¬@ðQŒúj7I¢²÷Jë™õ“`âú$ªm‡B•ªÁ’ž‡Þ!s´ËÙlT&ËÎtè¼?W6WW6k‘í*܈cKÑy ù %\Ó ùá£ïÂN2Ý™áú5…©úëÙ1¸öËåT‚îG× ŒRïwªŽßŵý1¥@‘҅ئÔ‡U즙àÏá'%=Õ•âv¸j ;Jݰ÷ø 'õå}³`£kˆC´4ýTœë¡ \…-wþШãqkÍnúòJñ™ï®Õ;ö÷þ•ôäe,íúLy‚@Ô’Oë±ã†bïÓ)‡û*Kû–èñ÷Nºš ñúÙÎÙžËÜ¢û:“'·å / á&·®¤Ë Ýšb˜ÂbçÑTgè¡Ëþ\’/¥äðx9ëú€‡{m-è–Ëe*yW4$ňNßUã<]Q²ÊhsçÆ­æ>Áû‘gËœCQÌ]7ÅÕzž[ÒxC[»¨±>œä~ŸGSÍà©ÒÒ'a¬&- T½·‘ž§25ª½m´öL/ÿ!/ÿ£êŠ"㇙uª_ÏôX_hŽDFòVµO˜wBÅ)å€U\é'0zú­)'W|‰W7¹Ì5ø“âàvϾîIÙMQm¬+Œ¨K6<+\6Wg´¥6®¼Pï÷oñë7°1Ï¡%å#*dS-—¡®æ]ÐÔŸ Ò²NVËl‡|A}^Ü óAÞ³^ž©dyë}!¦ûA ða~0z{(H”â Øde¨¢ž÷)EIóÓê—Œâ±õƨМgÓ}¾Ÿ_§âÄ)‰^¨y8­ã½&}Ë–•ÇP›ØØKð ýƒZåÚìÝüÌ-’¢aeïÓ °Ó× üXüfõÐS92/5†4ðˆ#øòõ] Ëé²öt^ŠÞ •.^9âÑÒh¸Ä±Y«žìÂé˜PCuCR®6›„gh¬;é#uRr³,ùX¥+.âjzîZR\Ñ=dVÃö|±”:Œª[Ú¸ìùŒÎü]-¤ƒËvöºéXÕTuÕVäRYÚÀZÖ°~¼—4MTÐ?`I5©ë\€`~“ªž{)*îJµô#õ{¾zŠßSŸ‘€cT Êg·D=_ZU“bu-jöúð®sÙV ±±ÛXn|‹ãΆü¦7IqFîÝæl®=”)_[ðÖùô¨ ¯”Œa;Ó]Ò[ ÷QƲh. ÇŒ ±Ú|ÿætÿ‡°ÎQ¥KÊUæÇ #dF ×U µ;¥4´²K¨ûí˶ÝÍA‚2÷”,ÿ–¥r 1¥ ÍK%AïÚGn·ð« ß±=ÓÿÎ4®¤u\|”ÜBí“åMø±³”1Bµe1÷:ÉÖð5•TÙáÈ€&);\²^b¯ïìgÌïkŒ,w!ÓxÖû¡PìXVµLc:—ø¥*¼pߨ´—Ï”¤§ƒ~2µ§…¯í­çF¬©•íy7^éFZÏÂk|>rŠy®Š™=W"ïRÖdÒŧ}å˜Ëå$ïmíXj’=Ôm¹ô`;¤úí3“ ™‚°×SÂþÝ\¯‰†&¡k^ÄD~矌Zχ€snÙß9ɽf™ëç;š2ņ =wÍt0Pرãê÷O’¹îk*Ûu½&{ž\³á+¿Þ{Õj¼|Nðë/…u©~ˆÆ´¯¢½xœ…Ã'±íàº|EÔ»ýt~‡"Üùϵ-+¬îaìuÖ¬ SNϽÁ*ÙyáïÀ†xšžöÇ6SÏÒnsOeóû7ë&¶ÖêNŸ ‘”w7ù¼ÙÜ&`ŽÖï%8öVtK^i¿4¼|‘ŸË:S ϵ?8ñ“j­ËÒð²R™¹þjh+ÆÝ£ÜU›¸YO¾Êñ²P8= Þ3ƒ6<]Íβ˽)ènж8÷²’õ¶P£'Q– 4EôŒ÷õ\-ªÌⓎàV]kÙ׬öÑúÏéŽj á7 \zOI´t~ø^´Xä‹Á+Ø(5ý¬tnņo\¬žR«láó­BM„&(d´i”Ü·øCîAúM>>‘œ 3žo‘EϼIe%ëÒ7m+ Ó½ü:ž,£ë÷½MÒräI«2ç¸XZ˜¥LÜْٿ™f~;»áäìÍÁŸ‚(bPcI56]0Oîâmlö2‰5%Р#xE‘— >› ×9ê´°ªªw—)cNí ãÚcçvoýÌËyãn_j'q¿í¬WPt§ò ß7éK3ß)¸Ôçô› ¢VÙõg‰Á¿a«v1’'‹ZXd¡å%Û]äÁ!~{òåó…̯¤8š¤Á³äÝ‚´TX±ï}o†âvˆÖ"æ®î¯x÷ßñæ?­toȺhvtʦE€8¢0†#ÿƒ³ðñŠÜ-ÈÔ²–ÕCŠ‹—y7X4v6ž?SÕÜùiõÚr­“ÕÁoÞ*Gs†oƒ ÏYnRKÒ=Ë:|ôæqM»îuçM¡ú³Ã¦l —<ÿ‰‘ÑhƒC~ï5°åÔé¡1ö‘Æ ¿¤Ãa‚µñ³V3C-\fMþ'¿J«Âóž-=ý#"¶pcÅ%M»œ²Mg9’„ØçÍgö«ó¦íéÆ*þA§j°Ño÷ o?/˜‰7¤©3§[†Øº·Imµůžµë_5|½ó)p‚Àwá´Ûb£ šEýш_š´L*ª{ì£pvŠ_Ý7ùBæüáTtl”ˆ´Ã£,}ysÙw¼½T…ó"6½«”Ñ ŸåÊKïí¬DÖªÞ|›CTDÝwðnBsuŠ‚`ˆÀ&JåÛ—NŽ˜êŒì³ãdúâÚVy#QW^èØ$> stream xÚŒ÷PœËöÆ ã4¸Ã àÜÝÝ]ÜÝ‚‡ ÁÝ5¸[p îNp÷;{Ÿ}vrþßWuoQó[ku÷ót¯~ߊLI•AØÌÞ(aoçÂÀÂÈÌ•W“fa03³123³"RQ©\l€ÿ#RiœAöv<Tˆ:]À11cp¡¼½@ÆÕÀÂ`ùÀÃÂÉÃÌ `efæþo¡½@ÌØ dgÈØÛ©Dí<@–.àuþû@cJ `áææ¤ÿ{8@Øè25¶È»XmÁ+šÛTíMA@Ïÿ™‚†ÏÒÅ҉ÉÝÝÑØÖ™ÑÞÉB€–àr±¨Nn@3À_– ƶÀ¬1"RÔ,AÎÿI¨Ú›»¸;à€ Èhç âjgt€W¨JË€vÿ)–ûO=àŸÍ°0²ü;Ý?£ÿšd÷÷`cSS{[c;OÀd(JÈ1ºx¸ÐŒíÌþ*4¶q¶7v3Ù›€ þ–n VƒþãÏÙÔ äàâÌè ²ùË#Ó_Ó€·YÜÎLÔÞÖhçâŒø—>1мïžLÿ®µ½»÷Édgfþ— 3W&u;£+PZìŸpñwÌèà`ffæbå@SK¦¿Pótþdù+ öàëí`ï0Ûú‚Ìà?ˆÞÎÆn@€‹“+Ð×ûÏÄÿ" À dê0Z€ìÏÍÿÃàówyt™ÁíÇ`þëçßOúà3³·³ñü]þ÷3‰ kÈ ‹Óýcùߤˆˆ½À›ÀÀÊÁ `aaep‚?øþï<ÿîÀÝÿU2ý£î¥íÌíÜÿ1Þ½ÿqû§3hþ¹6´€ÿ]AÁÜÏ@Íïö×cæ`6ÿbùÿ| þòÿ¯÷ÿšåÿµýÿ¯" W›¿ó4ÿ)øÿÉÛ‚l<ÿ©÷³« ønÈÛƒoˆÝÿ-ÕþçBËÍ@®¶ÿ7+íb ¾#Âvà>g`agdfÿOä,òš)\L-ÿÓKÿ= ð6 ; ’½3è¯çx3óÿɯž©5øÙâ >²¿S@ðÍúßuÅíLíÍþº‚¬ÆNNÆžˆàÀ›|WÍ€·8€‰ÑÎÞ<öè 0·wBüë`?p˜„ÿ ý‡>˜D~'€Iô7qûï7q˜Äÿ%Nf“Äob0Iþ&V“Ôob0Iÿ&v“Ìok‘ýM`-r¿ ¬Eþ7µ(ü&°Å‰ ¬Eé7µ(ÿ&°•ßÖ¢ú›ÀZÔ~X‹úokÑøM`-š¿ ¬Eë7µhÿKÜ`-:¿ <Îø_bW›‚ûíw<“Éo+7q26µ‚ß\æ.¿ãlÿÆÿsÅþM€'4ý—À&Sp§ÚØü^’û¯ÈÉÔÕÖÜÜÿ ³ÿ?jÿÐîD&³?¬ø‚·Ñü7‚“æà_IÐoË5·ù9þÊÚ»:ý1¸À⋱ü- | –ž–àwÔï pìù™Ágcõ‚7Ùúï©ÍÞ#Û?”ƒmþ1ó_Nìÿ@°V‡ßRÀµàw©Ýÿœ;Ë?Ñÿ= –¿l;þ`Wxf[pþÁ~?+™\,€l8ë_ ³?B,`Ÿ® اÛöéþÇx°v?¼‚çöéõ7þÏ£ÅÔÕ ìËåïwø¹ó_þûUzMæìMyƒ­j‚[彩 ÝvÆXÙQú/>]!hn‹ã»í)ŠòÝ_²åFÎ wÎìFÞ¯c±½6Zká0[¬ù¤Fòà,Եš›lÑûL`ð?9˹²îÊvtè±Ù™Yàœ~Wt¿š¦Å¥w<ß™M?ä£þ^q[ny ÿ®á#2ÔXT$<2Tp›pz[…HµðôL»4¥ó…ÐØq<±ÄÁ}jß0+Çfÿb =$h#•ððÅAö*ýP e¿û¬Ñ`šj»[ïñ MàUkðGçUA Þ éí‰ ©‹í(i‹ïRëÐ}ÉТë_ÈÏÖßó0y·iÀû¾C¬¨ùÓB¢Z¾Ç»’îÒRIL~‰7H½óo$&×0~C—õ‘«šŒ3PsN̘NͧNÃlPR½ôþÉ2iúf82È)D/ÒF¼å¯‘oõÓÆp%pÜ¥Z=¯µM ‰Š íÓù#ÉE F‘χñ“InP6vòÈ#Së;¦¦AŒ8¦#ˆêü³‡,û9–Ëþ^ÍáHCÉðÞ9ÄîˆÌjcd79rchÕ‡$†¢B¼‹½†0_—‹– !o|êÄâ íéë £iÄ Ÿ¥gôIùôsÓÑp˜þkp-T8ž×Sõ/ÐkZ’MÆ™fòk±zõˆyì'¤RßñlÇ(Sú¡²DïðÚáÝ~§k‚ŸdT;jJzkÝ®)j¯@µä”ç5ŠŸs¾’~ÓXPŽ<‚XÙG`…¸(-cûPâšY4Œ *·'ÑF󒺥ØãóDòÜÎÔ œxŽTïù6\QÅ?CCðŠË•a“¦:úb=Eº~9eÆUªŸiqÙû1uøf €Oï1‚j-Þn\“&‹ÃUgzjÕ,WúMž¹fU«K©~ò½>lû!+é5”ÉÅAq&¬*Tý¤ª_€âuqE=Ê>u‚Ñó庖³¤0yíÕZlÿh2ù¤åI ßk}´''F…%EV"a*¼Úøø§ld9QH‹Œ™f•g¶œ%_yS_£î‹¤Ø¼ç©’Å•zL–“vNúsµÜ \+ߨ‰>ÊûoÛ½H(7fÅú ŹÚEgï ?DZ¥A [ñX*[|ÍÛ3†wQXOä&o¢È‡{N9PÒšŽ±éé©— (âV„ÈëíIþ%CYØýŠé|²”E@?—Üü5¢áÞhAÕ€·N¬×!oУé.õÛû~¸á”…Ö|^;šïízÑà×GVGÅåòÛÞˆÂ,]ܱ‡‘Ãpìñ_ât4ñZÍoɽÐÝÍ7ÙgEî•ÒzÆ1ða"L~{1°P°Ñà9? –BZ~ ÉÃz ´¢dür‹)º„;$0ugæ´Þ©íÕÍ–0*F`@NJó¸RâW,XR¹ôà\ ê,ŒçRÁNÂA/Ktw7óähšŸS¨‘ŸÒxä»:Ы´4,ýîEEÜr¹yú‘„¨%ÒŽÌá$×ÔÒñÙÆQê]^œÀ'(Ö‡kÔ¤„šEaÅq›ø`ÖR@eEü²n áðWçNRûä7Íb.ÆÛ²ÄcþÉ<¾ oÛ¸™äôÍ[à´lÌ/r$Æ|æ=Ú$a– ¼PåþD´*&Ö.€*öÁ×–âC&ƒäi3 d]ã!ô<¯ÚïR Ì1®ÛØÕªKöŸ™´àßYÐr`ý(9àÑ« ´Dû¦à$ÙF–Øä ஞu걄4ÍØ¯3®·ð*©X³ÇO¡ ×çBÊ)û¦²× ~¥tUw®iY× 1?Úæ¥/ñ[z>»Ãk©vWṅ\T¼ÊÝWd7½¯-ÿ ‚¹‚ÚáÒ-„]™Çu@6ŽíŠÎNtÆÏ­ãfÎÅ"³6'Ù¸–Å3T_ë¤Mà¼SÓu6>^‰ã‡k6܉ÔÛíPÀo÷CNŒæ9v›_ Óÿ`Ò6"rÁ+[ã)ü A2êÔ%ý0%+ù1Ö¥¹á·Ù¤T´*T?LV¸¬Š³‚>ÀǑڞb§Õ;" ‹+3ˆ’¢Œ:'É6μŠ},¿¨×+ äWaÃÂ~0 Ó^‹>ân‘W®KdÒ˜5«Ý¨€DXé¦{Ù[†Â®¼×ħ’>? \&’¾vȾ.Ä´|ßT è¡×„­êÙG'¼¸1DË«BW·.Òd“¤Þ‰r±. ³Ôà£,6T³(”;šop}†¹2õâ<5¨›ö|ª¦á-Ëf­^>>¼a˜¿óã,ÇíÓ{ýqôЩ¼Z9ñ'³n{Ú¤°¼~¦ù¬Ö®`ƒ‡>I$¨é.u÷ÌN]àáôcÎ2ÕïÏ4“j‚±øA©£ŒX(Æ,r0Œuî # ãÐU©òÒ—ƒ[ Ñ(# ~\ø óZDµøqÉPÿÇ0\`š´«8V½ ¡Ò4Gj—3wIlL*YÀÕ„¤¶SO å\ö.àôÛ¥ÜvgßVW¼%Ï‘1èMºØŽ)Q—5ã݉Íqe7š:z,rq-SéÝòWÞw©4¬Jú|o6ìn§«gîmôzEŸæÖyr7>§¿óa˜vô Ážã€n ‹&ÑÅ#ÆGkØ“Qó rˆïz™s8íH›‹ÜÊbÞ“™Pà ŸèX¡FüÖOÇ;œ†hyex›¾N†¯Ë°ÖNyê3²Ü#lA¼æ|~Ǽ·¡Wtˆ!ßæÂCóÑ¢s­¿_‚Î6ðÐ)m§¦ø=–‹‹–,¡« ´iìÜÛ£Àá¢ü>‘vȘè%Û·½–@›í—ÝrîßWïTŠ‚[¨˜e ÖO·Z£™põªå¤Šz¢WÂv=æF‚¡"GlïOcÁíoF¿2”UG—^òj*ú¶°m~¿Q㼇Ññ®8Uä.IÍúÃ$_ŒO+ízBjì¶Úmf:ðI@+™=ô°o†zƒÜEß­]íbÈ1»©û Ðz]'΄„õÞÿ¬ÉVÊ*‚Å×ñ¹¥ÔP‰ÇgŘëWþ_øðˆuÒÆ »ý}áÑ^ØÛ_D›üü;èØQo.SóÝÒfbÃ.£Þ^–­-rÝ©sè6N£"uMÒ\áøml<üäy}þÎ2õÖ¤ E¬€û×wXÂ( z®£œùÖt¯qÛ.Ge9¨Sú&ܡΤ*8âÅጯU5s¼x^>½¢(gÈh|ˆÞÈK°wyâ f=??ÊÁimÔѧ|éWæQoéÔ;és/¸iaºt²úÎ?öºn(—(š[âÞ£0õ.ØWbÙL‹¡)öǧ÷ÈÝÓ1ªfcù"Óž,ÿ#¦œ¢sY:ì´4VÇÕRsståÀèà·]F°0äˆvûXrh?í™>…¾sÚCB(3x¯‰™“`\S”Ÿaßpþøiƒ51Íæ„Ÿ¶Žˆù€D7_rÛnñ’›Žôü|ØNVcQ‡ðμGбֽ%ÂågºlŽÎì£Ëí55ì$T=Ä3í¦v ½WÊ}ŸWäDG,ünA% YbÄ@VCUm¨&¹ƒëø ÁöÊXʼn¥hmËéé© SH4ŒÉ £Å¥aãUÅ€¹ 4rTÖãÔ{¶ÍB¤ö‘|v­ðöTÌüŽl}ß'2®Xù'"ôÏÓya³hZ™?[SGŠ]?“Úù%¶ÖÉÒæ9U^ò! üÖ^àOZÊÊrœG§˜ -"‡%ˆlý‰|´Ø¸¹ö;©ž_þÂT¿¾³»|f7EïÔܨr³ÿ•Úcó~:k¬?êHÅ~?‚„ë>ªòIú-èžµ®{ñ|­&d:⃟„qœÚYœp—£ÌLåâ6½Ý-atknö1~‰ÏÞvÿ&öµf4ŽÖÛiÎqu¿¶òkÃ.X•ÓwƒFPËâe®Rý9R§rýãf¯°‹µ¶8{`}óÉ…Ó¥³ݽŽ}7„¤/›eÏøbldõWqµ‡U¯W¼TƒÑAAXíp Je'ø·ÂGw"!^ª ÃåäÏë XuÅ7:½Y’‚¶Ð“er'¯{?Ïál”l+?¢7À.•8ÙÑ{úw±ÏáŒ:BþàéóPH«ÏÀ=’Õ2f¥x@Dˆ†vuq§ixš¤r†õaÖÔmäïÿÜDhé_ ż£—Xµ»ôÔ7—2|6àU@õ”RƒeZ¡ §%™}uùwÊX<PÜI6žrðÈLÀ'öö?Dö½ZA5ñ‰œhÇ+GzÛØ’Ê[½•ȉiÝŸ·ñ*{¤ÊrÑ–²-cÌ]ïµ¢Ùéœ;œ0n&V‹ %õ€‘®g¶”gÕîOËæ±Le÷üÎÑŽí/«XøPi«‚¥·"ÍáÂVô㘰Ò^âØN¤#˜ìæ~Þüþ³1žy¨®ÆšKõ)¢r9䦊Õ1Ix¨;~Jì(¢é€]A¤Äá¢sËÓmÂKß¡¬i°0^×2,FÓûEZèøÊû¸Þk~oŒ_êbìéä¨FWøŸ«î™Ô-µnCA设¥ŽÎUEôÊ›U•‚*í’¶Æé°wË u‚LAOdϧ#“ su\¹/1šèÊ·yBh¡êË *€K MÍtÒ8µý‰.gdšæøîý'¶Â #­rW[MÐÏ:³Ú“rKŠçy·ž2eÊñ´DJЬ”|Z­–ïDß(’TÁLࣦŸ¾ÖâÛéÂM†òtÆÆpNó¬-0ívíIŽ’aÃK-E>œÖX5,y|ž0 ¬‘.‹S a·G^½ÚT”):»Í»©}Ù‹rJž™ƒŽà à"±nza ÃSK…9¡P.ÐÞ{#Ýôx\+"~+ÓNíÔªcòçG•¢j?£·é Å]A©©i2~ó\j»™Ü@ž sÒpzä×UË>Ÿg5*AX2…÷3’%H1 ø[Þ¼¢ï€6Ò¦Z¶túôù°9s©Ô›9â¶É—vø0QŒ*’[¯£Â¡Àš’`ˆ¾¼ÖTMbDYÞäjøâI@Š´Ç—ºG²{ìœèd$ùQáëÔÞÊÛùO¾¨&¯[l(í9L¬K1áδ´˜EË07 ›â¤ÕÈtl•¾ùkÍ8^_RÅQLì÷}R vÒÉv¦®>-hº is“`ïlË1dñìð@}Ž ];ú4.}’JÑ,zÜV‘YH!ò÷ ù:3CÉ •«ïꟖ¾Àgä+…~E nɼ¸¤•›[|Û½/©¾¬È•®ê†1#¦E½=åøT´ðR]—¼e<‡§¢¶R©ø õlb-e9„ݶñ¯¨ã4°3bÞ½‹Õøñ &!¶3ýÑP¥¦%ÚM{İEÏVç @¤Îñ“g[Á ‰x5áPã•:\Âduä- “lÅo%´2g²n¶² y[¶]‰q™\ ©;Zk*ô¶“³2Ò_ÛñÒâ_ÌKÜ Mô|Œ^Ÿˆ¾Ž I8ïIÞ6ˆ-Îdxo{Mdá´ò9ÄÌòœùsàNÚ›8|n#]Ž¼Ù¬Ç¶R@¾62Ùt ~…é·útΦ¹Û©‚ ó(põ"ž…jbŽ:¤GëmÔR¯fŽ Ù·âó‘Æ&>$s<Â%HûD°öp@¤cŠ/;þɺåáá –|j!ÉŸ3@Ð9ulÓ…õ3¯þ÷DiýIÃA¿ ´\|¨ºŠQA½±/”;ÙìQßË܆¶4×îb?pÍ¥ž¥\%„ä|° +[SÇRòL–º3‹P¹’C³Në¤?Åé¿°da@§ v:h6¡G=ñ¶”Ù{}²V£¸õ¾G™u:&Øê6É“ß ˜âMeðwóýŒOë†#üõ8Kœö€ºî« ä:ú¬ØMÙ77ÚEÞÊןBûcª<°4˜¹Ÿ”Uý¢‘.]$éô¼ë‘ !L_ ƒeòÇËv2¦[¨HÓpi6èÉu€ÕX!|ÙDj51±]U:ãü‰tÒ1yÜT¦i§²0?¨qêÜG^eú~\‡¢O=ãPÐ:K °Ð/vÙd™—JçÝ hÿò"¸b<¹n—\Õ~Þ+dë˜Ò­gTŒÃÎq¯õ'_·r#0>§‡Ê|°»ù5G¿^„%dÖPæ jw±xc*½hÿ¶7¬@K]×k|Žá**zKþir°¾­w¯‰5©GMÀs„ç½L—…™³B¦^fÊÞ䔨‘÷&+ó@°µÿÝûkéVÌü™ZVKÖz$ñ>”ÞXvüŒxÊhÓ…â»AR…qâp¢Ÿþ®ãeVú¥È‡ýñQG°û‘¶úš›ÑÑC³.cÌȃ™ÑÙ"VdHÖN­YÑøç…|Wl¤Ø¤øT¯«¥4C¨6:øÖN²Œ¢ p[ÏÏÿý9‚¢©V¢,5»$%’£ŒIù[a¹ê ¿ìÇH&³~žðÀû7{üik$ñYåÞÑÓ"C‹bh1ò—¯ßnÂe¼5ÐJý£5–' ¾ýðÚØ¬ +pµûùÕ»Áú%Fçœ0ì˵Öy§æˆ¸'»×;^1ò¾x¢(Dz{/ÛŒ¶$fro ɳ°8Is²6M9Q(K.n% VCgØ[QÞÆÁK78TÒØ‹’ó~¶ÏÒöu¡ÙÏè4è’]ð`…Ù*zððÑd©6ðÎ ƒ./§Û‡¡”öœ§–eL„†Z¹Ï/Dɦ%Ã,㥮ËGÛ@šÜH‹j?$eÖʱÑ:qˆÌ’)×ܹä즡û¿0äÕ·ë½júÚ¸TØËËzE5#oL¬XonäÍ2Ê›æ$WÞÐL¨|„¼HÏŸ¥YM<Ð ¬Ù=Ó“‘˜“§–ºáÿáºÅⶆº—ã‘‹P›A’õµ¡C©’ýG&Cê ñѳÎæµÒ’z’ú™Ï°S® ñ[¶²ª']Õ[Ei[ß$o+^K}»ù*ÝÞÊ:á«ÐÁ`#èyÕœŠC*„­®8Ì<Åâ|n¨œÒ:òãg¯¬'©á”ŽƒøJ3>‚&}¡ë ¥¹)Éáþ.EN ijƒl¡£ ^±n\FÓ!\Eÿñ‹%Ö«ø¢ëýÉ'Þ>ìñö ›ÞR©µu=f…÷TrZhÚ0ÍŸdœ.OggnûòŽTÍ;QNz§%[Ȫê°ÏñåŸy¬è}qÓ~8>»üŒðZØ¿¢œ9<4ǯÿ`‡§÷Œ"œ[â>«4cð%"“µ }›õ™º!ŽAÜö­rÜ[ª‹+ޤ«Ã€c«áû×¼âc“6(g—¡þkÞcUL<ü¡˜†ÒÄ£ëe‡ƒž+ÚJWîÓ'4?#1³¥£ão¢CæÍn 3ã»e\ö C"Aðñr1^ÊÎ*ŠaU‡ãy9³{iÆÅ)=ÉtQ˜ÚÏl¨”ùí†cƒ»ÒRËAá­L.”Ì=ÒëýÉnØvDQ‘šµ9ßûñ ˼©,Hî?*2\Y´­öþ$‘S:•µI1» »ƒ “ZXÇ­åPعQÇ&••ãrã‚ÉÅ‹^­køjRV ,R¦n€ÕŸØ¨‚TWýÂñF{“fòHCaÖ‚ /É$ŸÍ±ú5á­Û¿íŒÚ-|¤'¾VAQrýyƉÕÿ#þÍd\»q˜w¨»9›­ãZ çÊd·©/ÍÖ÷¼'†R*õ<ê(»Æ/Ïb¹Ï&r•sxO=?gM»µúÈ 7l.pçӯŧXöøß¹n¥'ç¡Í~¾™’*Z—lñÍ4ÃD(þÝïÏøÚšB6ØŽ†ïåÄ•ïÈ8·tyо7r4Œ½Ò_ª)W°°z-vL‹ô Z‘a€Y˲<Ã<øI•:Vt|²(Õ›]+{夵ãañ‚¢PXS»lK+ ©Û“S³)ñÿrÛÌ‚„\R¸†ÃÁ·mUêL$\a2¤‚ˆœØè^¥Qý¥Wâ”+É PJÞlâ—ÛÔ…±¼ ”°†ÝÊWµ4Z¨æ_’Ê›¯tÚùþ)7Á÷¤)yù¶·¨zÐ;BŸÛ†ÅùÌXb‚y„\ <ÝäRur—ò#Ô°6-úDÖ'1ÜadM/!Kô·Áß…Ìóã‰u[Y}É=5Ž}›4¬öPBŒ&ï÷¢±˜æ D1Þiö.äXË éÑl[²ÔbaY<Í·™\EY3HègÖÿµ£+x ÌRåç¶BÒ+‡ÂË (²óy¥ëÖ¶û5ijB­¦"ÑÉ1É ù>æ¸C¢Ùó®@© ð:è”ióšá]¨üÛnþÅCf=GU´ÜÎÆèNþ´²I¼îη 3 ¬*è”iH;ô¨Éó|£œ}ÄÈ]Ì{?»-n7"‘Þ@÷¨WÌhåwû©ÚÞÒOäöd϶«÷ c/lu¯qí¡ZðtDO…® Ø^u½dþNêk îÿ™±£¸ÛB¢òJ½ÒáFV·–—GÒzkäÚ}Ùµ€|ÝmAW¦…&|Ÿ~MWíÁÖÿ“êÒ!ÚdËÚ`‹ ²NÓ—zM¿Vù¥ª÷UÑ¢Þ¦Tåm1+ÓŽ¼ƒR¬²ï’ÒìÁƒÄ9ÓÓóu¯àž|ÒœQΖÀ¯êY†d6üCõÌíÛœj&Ñ—Ý_Ì$[ S‹ˆéŸÕC#,rÆ·®ø¾x”b%,²hªÝîgæÇÝcH] ¾b+9¶?ÕÏË ä÷4lCÂ8Ñs¯Ì (ã’åáËÓÎ_ÔF¹¦À3#vÔ‡ˆþZ­‡lFm@ø„>cä'w¯Æ§YÇOæ&ÞÊq¤:åºÓèå\o³ša÷þaœ`¼Úˆ¼§,C,:©´µÚãçü²ñòE®îLEzÅ¥>>C5!ÕÝ àß'‡ú‰Bk ÛZ$ü'v×µeHm€±àĩٯꆖmŽêÍqj%ølÿ¼ë`šåÍ. cD­žÞÏQrðí(9RÜOз1Ê$³†Bþ\Äé*-;›5˜»Ëë0y®µÄ“‰–]qî~™Œ5ü$}uw)ÛO8Ntõ?Q°D†þriO’Áœ£—ô‰aôôûná…“ׯTÙúTGŸ;b|"¬¼!PÆ2‘Öî(}?ÑÇ4d _3öN!OÇ?(?‡®s—Ó1£és6S–å  @Ò)+jêCª÷{›f 5œ¤ÅlD¦eû~È^…¿]DTíÕ_¯{qcNSh k‡ë²ìôJÙøx¿Áòcîkå˜Qþ=ù¤ ’ôêZquŠßp7:lk+oœô­æ±ÉÍ òæ°C6 Oó€<€Rrxw*4yäMË+ç ̃Ž$äêB½K•)îß‹ü}GÏ€Â#…Q¹,^Ú¯èS=î׸àέn‰D[áZi„KÓ50ч<Þ)øÎ(ÄÕß½R ,~ &ò€BÀ¢ß'µ§@£9þ£ášÂäOXä^Ƽè™Frr3³àt1JÒ·.CÚÀãßpŠvÆÓ3ªM‹ñ³ âNÕD^½ìO0ø 0¹š>ãÁŽÆ=ÄÀøž™ùG¼Ãí }4|7×M[µGvÏ·Äe„¼%‘®£Ø¦U· ðJÃùínÈšrØ‚ygû|1Z"òis´Yþ]’†6©óx5m;³lð7E5Bnfy˜å§­»Qtžñ¨~9ÆsÔ®0jQF•»_.™’S÷Ÿ©•‹ÁÀ ˜ZýŒu¬#£É{_sb9d#îï{1çüªpk7 ÐÄœù·²þ,'úbn©¥]_€­é{9Ø´óÁù'× ›ÈjMÒÎ’hsÑš—ÛËܼ‚=0©‘]ðy•"Ç‘pøÆ0³C;{r?iI6’VÒ@{J-Çós}ÖÎVÜCP›ÞEìÕ…]lîu  gÏÚýúWÿ‰ O“¥ípØè»rl€CÐŰÜ.—ÇÓ´xö§BÔC˜hnT8›ä;ŠIޤXÏ“*¬}d6"•† ª'ÔªÓW«Xܾ€i¤o2¦2[Lú¡·ü™jËÍ»(ø´É˜ú¤Óø)¾ðbÄê•4qG¼$9ãNã~¶IPTV%i™Ž“/JiÍi=6¥:܃b-<Áäµ—OIÕÒ‹ ¯ºêBƒt•ˆáõy‡§.Ë}ÉÞ©k9¥QÍd"+zËtõø¹ñJ ‘`þ<¾YÀL”&ßÁ÷gŠ·—Yc=)¾}6Æ>¹ÀT2'?Uê2Gã<,Qù½s%âi%£*WÞԡܚЋãHfv­€]˜kå|$ZVjœÅ¤#ãW´Ûª 6È^®_¢^ä^¥ Grca¶å?Œê 0©3^Ê­åb}A>Œ½¦*Ç„ÉCØwÜ ?ggßÿ ¡Ww|Ÿ[5¶Ë¥Ú}‚1m­Í"÷…|[¨ºõ>B»ƒ GD«hX¡Î©n‹}JŽ# l­‹QŒt×hˆ}Ç·W|àÊF'Ž­‰>ÈZX:™,ú6´””‘ã¨Æ8ït¥, GË$nðV};Û/ÒN˜«—R!ãL•‡Ž–Î÷åa6ºK¬RôñK~ÊÌÉït™a¥¨ï}eh.ïhÈÒÓã«R˜nõ€§± Ç£næö+¤‡éèêFd¯‹Í÷v¥–û®–Eb'Y6é[4¬w1¼¾Kªß¯£€ÂN¨­4˜9z;ª’Ìk7p(%ùLÐk™-˜Y_Kn‰-ñ(1ýnpçZ­=7év¸;l…MªôHæ%,9”h¨lZoø¬LꔼZ³ÅÏd“Ù¯«çöV\U  |‚B„,»äW´>}ø%HEÝ'š\=Îï7]:¤sn¶O¹Æ´ÎÇ$ã°•0µöŽ˜D ì§THÈ¡ØO¦ÙH ©RdʲÈQ’F&\(Ò<¼?áêªúöyæ^ejà+G¾ç`¿'¥Êf» ¡k€ÿ6¶š‰†DjÕ¾7ѧi7Ó™lŸ›Õ¸&0gγat¬cÓqÝÜlëÆ+[•ïM¸Ç\ýÆæu‡¡}ÆÚô§³6 `7—#ŠÊŽG/#Êßâîyª¿O8"Æ‹o¦iè[jq.G²ò[oó»Úß3âe¾rƒÄÑ)Õ—‡X8µ9+Â"ê@ÈOÆøl¡‘{…,N‡cs¯+cíÉQO–Š[m7¬ÍšªK¸¿[?Š·œÜ„wê£ÚG…3e’IÑ 'éÔ)%™Ú˜Œj)©ÿœ½¤´;Ú hÊÃâªÜ|´)R>Oæ3c'²bë/ȰÎBt$"0ûÄní. iM–†Ò‘ÙDÂà>ÅZ%¹—DŠÈ^™ªn'~ÚÒC#‚¹Þ¨:*´€±¸ ÀlèîäFôã‚³Š•nâZNš üUv"ÀïÜV¼ÇGîÉöÌcä‡6ßü|m“sf$%’)’ˆ˜Ò=ˆ²W™1À"^°ŒfGävr§Úäo rœn1â»5 `G—#_{ÔÒt(É]?×H@Í4&Ï8¡õ™IÆùéâ@“Svâñ Þ h_`ݸÑv‹5ªúxÈ÷C¦ò™ù¿i<ÿáç ¼ÒŠ­¯÷%c0LÑp­œË«(4©=\F3=ؼŠhÒ~ßèË(†Í÷¥ë ek?Éãu¥ ¶ÆmˬÁ8Ûwì‡#¦mSÅ‘›µsh§ˆX Y}êŸj³¯’52¤_ql²®xˆ¨®$¨ +ïi!ÓÜ9©å±3J «Oòípá5·tݓ֚¡Öë'¨.FmÁÆz/¸–(uäkµÀ‘u'X<·¿²ªM¶‘á1tœ4‡jögI>zœçáJ/J›ê;Í`rÖZϵ-¼ˆEZÝ\™ bêÒ–¥<މ÷èox3§¹Ž ^¾u‹£¾tÛ8O2¯ÙWÛ¦‹}´ÒO‹‹":Z|7 õæä[ñ™’ùƒM…YD~»~üÔMüm±ú—þŒ#¼í±é¤¨_©¯”̃%‚‚}õ¦¼ãS¥ºÏÓë?.,\Çv ¸ç¿‰ËÑOˆgª³Ÿ M•ÍjiDœQŸåä´!~ÖÞ»){p,¥Æûà)-À¦[ ­p~õÃ>]ˆèâQžø —ôB—œSý®YúCT6Â¥Û° ´â(¬t;céòûå+¶ðIþÀΘ){HãÔÇÏ]bù(¡fè,ŠbóŽõl!f6»tÐqã9;l.MY˜ðûX8È­uë›ö½íŠ-® ”Z³TaF™èƣг»gbÛ¼ç뾕ŒcÂx>™°QÙˆ$öü“º•_«Ì-—dŠ©~ïÜûè–uEÊ‹ÈÜuuG“]žïÜ54i XV5=Ôî¶$MzœÉ~|ïlǸˆ$¡TLÈŸ†ÍAÄ¥_%ì—$05B‡‡Á'•­Ÿà]öŽˆ^ÌéFç?ä‡á%ÂÂÓ³!4”¶;/}â£,>ö±õ À–¯DÀ,‘=š¤es{M•z0pýR^Û?e|C?¯®YdtLð­è”P“^ø?˜®¦Æ‡l®=ÇÕ&ÿ–¯Ë0Tì¾|oâW,ÖŽ ØT…þu9þÅbXÁ²Y, ¯Ýè[ržbñ†-*z{×àá¾ÂlÅÆ¦þÓ:/n Ðü;¦IqwùÃ’ 9ƒ‹=‚ÔÛíS±»åÕETóì$Ìå¤3f1lÑP³%‹0¿Áq7jiçâé§@ŽÉ/&èÖ ²Ç{EÆÝ*ذî»!?”nwô//†4,/UIGÙìö‹}ȺuÓs–nÚ|hó1ŸÖË.ØëˆqåÈâ!Æg,‡¢ž¤ô†=ªËFd%ˆ‰Ü:Ž_¨Zèòv®oÑšÐÊ¿$Xpe´zóðÉ‘íå¾Iç—ýÒk|ñÄŸ<ŸÉ²Ì¸ HYž+ƘÀI~':‰>›ï‘1°¯PC¹ð¨9 ¼Â£±Uɺßô£žæyÎÉGªÿ|*rͨ þÊLûê‡Ó¢ö‰ÕøîÜTù(öXŠÜ𮽄*ŒëŠ`ž4 iŒnËû±ÏƒIr¤oâ4ÌMýwž3¬*&ÜzÑ–ÙŸél¥}×Ð ?â=¾7‰³ŸŽ7ñ¬Dú™úaý€m«ÂÎú2„÷Ehømô×Ûòw!æß’Þy¾·øõs?æ“Ô¹¯V©óÉyÛ[Tjž??²Óc¸“öØpö†¯rĸšÑsôrô{ùUJ¹9ܱsbªè1½æøÉCÖš“Õ‡rÏÂÅ'OtšÁ¹U²/1H–>/7ÎéþšÙR>ÎNœÈŽGÏí‘Ùþ¶1¿„_ÔqÊ=jçb©h*zÎç†ò1tRÎvZù3 r rA£wÂêæ÷£†ù›?5ë¸t;{Œ†Þt¡Éó êvwË­b\é,Ò2žŽeKiM²âÆt:¨ÅG½UÒt8B´¤ ÚJéÈ„0¹~ðs ßià”}›ì $Èú<”h±ÔêEǯÀ6®kÖ+šßé*b “ Xâ眛qÐ×$ài¸³i¢½zÐR¾±K‰ºŠb¬ë|S§vëô)b?îÒùz7I|€Ö€U$¤§×«NNV’ÊŽL5ÉRsÉQ£>­24³Ï\ÈíŒkÖ,8% R¹7;Ò1 d”¯ÏIy­u“Víº9}g­bÒgýÕ±xßëñWñèWøä¸¡˜§ç7Áˆc¸ ÇÝ Íì)P”Š&²—oœß "¤›œá'ãÈPüôÒ–½}¼6þ§z>¢ï˜ ®V±s9Yõ¬™¿ôqCà¸Ù:´%¤ÐøZ‚ua²³vˆÉUŽäo¢}Pé—ê‚s·ˆ=Û§C(Ú¶žt µÓ0Dìg>†ºÑø4¹ëAW…ùnà­<Œª#Ãó^øðSLÊCyZ®7û²É!Inþ©hžÐE¤”(J÷LglÛÇý‹‚ö:„­Þ‰¯Q÷¤B%ŒºD‡ºÝÆ{¬™Á —³$yZ_X—}ë½51›¯ïàÝ ¶ðOÚf+EÓ wù³ý[FmÓ_§µLÐñßJÏJE£QP‹Uwq»ÔôÎbðÊøV ƒÑ¤¦àgïï–çí'º¹¬êÍQµ­µ¡+,eµ˜A?VîÚ ?HzýĉW¤qÈ,3þBÔÞ±ƒNŒ¥Rƒ&QW=+'nîÆÁ¡ýXC¯ê.cäÏ*Töû ïÐL`£\(ˆáùü%k‘{GÛù+Aof¢!z@&Áááñ„SDû8^JdÌSÁÀŽÈà’ZvNà]NÄ[œYŸ«”'Ô4ÉRÕ{ünƒu Q¾%+úg]Zót¾Øê Š¡…°GÞ3ËY3®J__œ]Ú{C3 þÃ܇e¹b¯Ü¶3Ä{qïf泤Q5R¸Y*_ˆh™‹yax„J¿*R2l ²_•×DÚNøÌ/pµiù«cS·nÇžVEÛMWºiêúÃkfLdòkziâ§5ÖQýñóÝüyªâ¦·Â¾2X3¤ ‘xù=2 ±Õ™üù‹uEÅVUeÞ´£¯ÃÄû¸‡ ¦Jäà GLê²gæ~Öd³öÝvš£d_éð‘Š)«zBÐmÛg¥DÞ 2ùcܳS¢è$Z!Ô 6ÁV„‡ay§šò-Ö}±žG£DhKý#ôP/°åü)£Š6"{¥º]F2°[ÞZ#¶7Y86´EBÿõó;/^srŒ^ýÖ<ꮑ^SOW¤óÈ£¼Uû¾£ÑÞyö=râÙs)¶Ç’C£²­ëšIH5ÄKVÁi¶Ö­D*Žƒ§ÊÅ žr—'Î`ÍÌ‹ 7é¦5ÞÍ èA²¾ò0€–©Ø{“oÄ1y–Û²ÅÐc&úš+¾'a;’zê´c6WÈD¡ß—&_ÒÓ#ÝO o/.õOߟʶé¤| :óƒøÔf“ž\iÁ ßA •áÃD·¹™ð2<0m(±²t¿ i°W¦gÁ¥÷š¨˜}¦º¸zòKU ¢œÐ*3žÎ¾•Ž­H¾üLðaS•uAdŸ ¨QA¶Ù—/:õéc Êä¨X<Ñ«ŒîU \xüsìHÏÉ€Xu\ÊÂۆ$ ” Œ-nó ®q /ðÔOHÊ‹‡p%öQ©\$Æn*>a½‹²8„xÝfœ!MˆÏ ú©²â³VCžáåE.ž›‰œêõ>캫W´ŒþS2L¥ëªõ¾g]Œ³FÚ©m& KÑÄN-Úë ;ã[CºÈˆFѹ¹‡OÏ‘pÕ±ñ™XP"§Ò‹™NƒU³?E]L¯"©d!ý%ú/QTø*ò5嬂M!zဋ>yfû”Ò¼ä‡ü:€ÇœG‚nî%“¨þ÷O°!©µÕè-"¹‘»0Ü‘DŠ’H¥½xÅ‘Õ"¼k°Ä9}¸“8‹É«)%9ÅšIÖ¦"¢: ÿŸ[¤èLl¯&±ÄÊ@1Uö¢Ò¦œbÆxlKü;9za~™£¹6»àKðÑã~YV%ršó ͦ¤¨î7—@-.†l®%m=ÎZ‹ØzUIúጒ+VÂrš0IÌ(!X@&ò‡:°Ûwé׺‰VÜ&Å®t{^:s25È%m`ã2^µ>[ž6¬y&ýnëÏàßž%1‡5Ç…ttu\+É6î§îe–Æù ù²à>[õ@ÈíÏV­~Ò¤š-"¡°Þ~›CØ2‚÷;ªWé2íˆé»iIp^Vü[Òø_ãÊ9ìŠ0R†xŠ9hë“Ow#­ÊÓ!þnZƒßÜñÈBnܳúbl±‡†Ì]ïôˆ=Õ3¶ËŸ/øNÑæƒtš¤@R5÷ö‹55Þµæh¥%Yج˜Zè¦u~vÀÊñ¡ñšíŠ‚` (’RBçÒ¨îÉ.ßîRM3“}‹cC'ø¿â>g£‚¥3«2dµŽì/q¯íá”W%07ùÓŠC˜É0ÆIz\fÐ#Ú>Þ"y0 (½Cåb¼£ €áؽÀ•Aä+ö˦“ÜzÂæ…àÑÊçGD&âz±ÐrÙuÒ"xns[,K¼E唆BW©BÄ|åªC}ÿ? W„uùKÌIÓ^O%Þ8v$I’Öª¢ñb` Ó¶÷Ò t×íÖ˜Fv´Ä…s/óË&¨'' 3rŠß?9ÿ¡j5<´èè¼B³<|^â¨×føíÎýó ŽîÇ-ΗçG:÷öúÞtK¸c#àxsçHË5B„íÞ+Éþí‘mÀvÒiZ”}{Ù»Ïa•ŠâW4ëˆngàÄÛÔ!ŸË` „yøvÎ…6ѧd`ä]üõÕ?n¾x½J_Ú›¨OtãäB n(s¤”W9²_ »˜J€®I£É ¹†âáÑÎ!MÇn º‡”úGþ¹Ñ»„ >Û–~àLç¥ûÀרÕÀ>ä^d¤ì‘¹0{ Oµ£r'¸ßᬊ»9R¦[›õÿ¦; úëÝ0Á…Ë%¯.kè’¦Êc@s*/†~¤=äÞMÌ®H/¬‘º•h/ª Yæ‘ÿu‰þï‰ãdJ¬"VÔ5D]Ù§`­-3åÓ`!­ð®{l Ñf÷‘9p; |í•Wå~ˆ»TGþÌû炟6FS”Êx ¥ãåjè^«ÔX/ß.¡ºÑy©Ä»[Eï4`á‹=SÒÐÝ6…9 ÁøÂ»ÅÖN›üe“­;£Äb¯f§:ÃãÌŽ(꺙¾6Àޏ!n%©Àb5"Ñ`Üu(·|E™t¢æäƒ¹?ö•†üCÅZ÷q,@§ì!ªúùv3ª ŠöÅžèA<ù¤QEjÿ£:aï1ĪCÖÊ¿]‡Œêås Aþ¸êÒ Ïo+…ÚH\dû²]˜^íá•Ä<4wàõø¨x#…%©“Øß-»’ÜÅqRh.ÛÜZT>:—¡x¬dÀhKîþÒb­lß5¯º'ÄÞÛ_á"´5´×Ù±êZæ…ii­z÷ §b2¤ûó¨È$v·Ëš'\Æøï:DŠY‹îÌTU¿ ëCà3p”¯½¤åsª»þ ð}Ê!R×}r`t†£.}£ÉÓ.Qô¤½`YGUØgŸµ/-òÆ>¬í‡;TÒ/Ã5!½ç„PŠRÞ®{03‚—ð¢úÜ2T7ÞhÊ—¨j“îaìÕŠïü!bEÊh–åù-®àdM+“ÑY‡6æß—]×>Âl²å§¯-Ì­ˆºNÞóœs0Åíä3Íù¾/Í l:g-'9]™6(ž¬1î²3 1™oÖ_Ð9m¥¶ßdú‚&T ¡ö³2KwšÏz•9Jë‘^Zé. #m=H¶‚‰=F°©G‡Qªþ3©.®%ø?™n¸z°‚W'<ÎÛÏÓžã%tÖûmõÛPžÿyÜÀWÅ1*§fAhÊß©• ³Õôi"LŸ4#'_‘³ç¡¾<ö„Þ»/|6Ž{°\ r{i"ɾpþúŒö:æò•ÒpëÖÂ'àà¼ñM„-ñÈ9u®ßPBК÷ÐÓT‘&f0à˜ØÕ¡~Òõ‰z€ÍÝ|·èG£¦€kVIÛïiòçÀmß[t§R"áÚ^kçI `QGL³ò?Ìs“t zy®Æ}ÏúÒaNêÊ`§&§êàSi&*.|Ï8¼t°aäÂ0’çë]‹spÒ*'üËùëøħ?5Õ{dÚ²df|E} 9¹æ÷éÌ—€3@ 4._ïÍÝö„Næ˜OxØ@H]rN$6fœ Œ¿ Oq™~£ské9Ê5_·°òWð;üadËÇüã0žì(DœڛÙd9XÌýbý¶ŽO_¾:÷\€ZnsoìzçVûÛgñö©°è¿%‚säƒ}W€Š²Ðl²>ÑàöFîZ©³Ó»Í|,½p¦Fö ÁUÃŽ`ê©Õ«W<&œù‡â…¾¨"ƒä‚Æþ³/,E–ø> ÿ¨tIJñ ÁbPޱÔçÏ3Ð sk㌜í'šK½dÃw”ÄØÄÞÞ6ëч³ÙO!ýb«ct£—fB)EQ«®O±Û©,/]ꖺߞó Q7+œ›Ãû%^(MôNý"6´\äʰ²2éu½˜°öþÖ*qµ˜ßCÞGpÕl噎lä{Õ³¯Ê†ÞW›X]©¡Ï÷íúÒtãžLú<*î®››%5¡–kª¥;ÅÛ†lôadÕ¤:d¢$ $ÔþÒD{ÌwÍì|DS¢†D7´"OÅçä7|nÊÔ~r놟%ë``ÙQ/†G Ap@{í#ð(â­Ѭԭ褠ž“±¯§Æ±¸9¾nºÐXL:Úcnekø“Äw«Þ6Èk<ê–22"§‰æ{/ð-fgÁ;X·¹fa3üÛ¥Ú_ö?ó`~#2ØVIŸÜ&{?žµ˜Ée.Å ·‰O1Ñ´ Õx6r£Q3¼ÁÚ å³¿’+ëE¤,ðèR›€¹­¯oÊPäåÖQ„ p~KÈ’ØâÅ›†XÔü ¡‹¥éö*g1º²hîçñ…4O£Â̧Á<øª[\· 8$ŒJýehÃréãy¥•æW ¶csì÷nð‹&Ÿün[Ü'&"ö›HP–OEÁGEÝ÷YhU” ˆ´å>ÇK¹U­³ª$‹TJEm!®›wFSCsÈ*?8˜\{”^cĵ÷Lڪђðø’TC!#Ù<•¾Èò ±¸—+–ˆŸ°ªÿj=qbCUdVÃ.í±c¡5L†ç•·f/÷´ò²äŸ]í½r—묈)ò»ÔÞÌê¹ÐD=Tõóßè “{¾ƒÿÔï#â7Ó(D+ôlܱn°=lÁªTªbÜ÷©7%ÝÕñU}ãQϼȫ·ˆáâÐÞißÎØÆè?ΰó9éÏB»G¹gOŠ¿“ýˆ®S`=ûåj–ÉxðöeÓz†jA1R¢êâJ¾ÒzƵ–~Á9(–š0<½…Þ(ÓØ|#jýUt–º(Ž1¾¯ W¬¹ÒA ;ì†~aý@äuIý{guo¶íÏÅŽx4«isUäkF#»/¦5‘÷¯¢È*Xcêzñ4.­+kÙZ¾nUDèʬtý\•Dû}’í ‰6£7Pz_îô*{º’¢8–öW>lu `…€j’øËVc«“fO`¸pÍ™á$2U1BMô|Ñ!mo{×¶7¡JEš¿¢lF”ŸTÞs[ÁE‘Šz²ׯþº¶JûÌ 1½‹mƒlè”Þø¯Ê)m3øpÃ^‘?Aø-²!Š›Ümþ0c8ƒaGö]ዀυN–uÊj8<W˜D‚#õâ^3&î7Žz¹|ÕèÕbhB˜¯¦ó;ÙSѬu½7_ðK®!H ²)I;5ö:¼dTЮÿ«¨7f®Þ>I­R#s4êC¨å¹Ì0„'/A9`ØÊíf–6c棟¡}#¬/éëØ¾Ç¾X° Âv¿zré@/"ýý2ð{˜vuŠÀ$«XG¢3ÇìÔ‡žÁg{ï'"-íüñá§ó;ÖM§#åaº}™™&ý¿.;-®4e4&ñÌl}ÙÃUœ‹í”;•wœÒ‘ÔÖº):‰AÛÑÑ"vÖpЧ ®I.žã¬}îªÝA ñÔ¿þ¸!ÅÖñ<  N®•Öw“éH‰¯Æ¾ŠµÄÌš¼îÁJ z* ·îŒèæ­Üà!§ÈEAÝ*üᢶëŒüŽŽ4IÖÕ#&ÿ)í{…½¡áLûpíl4~€œŸÊMkqÿ„ÿÛ’´d:þaÓI©§¼‡E¥–Å>VOÆg Ë/b²ßi† ©ˆ¤ÊíÄ·ˆy¹6ù}P+¦u,ÏHÆ&°ï@Þ3®>YX ré)BùÝ\®Å`ÏP€´À (˜]Ä6c ëCV‹”z±äð¢ß±žÑ$7AU6ãB­¹MKû!“0UðW–2N¶PÉî’këýms2 Ë®ôìY}¦˜KkŠÿPT®¿d†HîGÆ8àq*Ònöbá›»YûÊõä9×m0Ž{1Ð[líÑ .7 TÁ:L5ê-ÕÊ å™Gª4¨é9®T§üíÂI¿”–⛼½Ñä¤Çã«`Ò§9O‹ú*ØÜ§àÏÙol1c*ª 3z›ÝS3Ó"ñf•‚Œ>Ëó›PD•_ý³œe9‡T|ÎfyJ¦R⛹-ÎöØåãÖ?´Š©ÄÈ2¶­TáFN™'Àƒ‡üÓò_¸”7ÄÞý‡«r’!ì#Oc¸×K¿â¨Š‡¸Ê“åë endstream endobj 2611 0 obj << /Length1 3016 /Length2 21459 /Length3 0 /Length 23144 /Filter /FlateDecode >> stream xÚŒ÷TÕ[÷ Ó]"›îîîNi¤6ÝÝ]ÒHw—Hwˆt#ÝÝ%HçÝžsÞƒçÿ}cÜ;CxæšñÌZë'‰’*ƒ°‰PÂÎÖ™…‘™ *¯¦ÆÂ `ffcdffE  P³p¶þOŽ@ñèèdagËû‡†¨#ÐÐ$3t)ÊÛÙd\¬,lN^.^ff+33Ïÿíyb†®&yF€Œ-Ð BÔÎÞÃÑÂÌÜç¨i,<<\ô™„m€ŽƆ¶yCgs  (¢±¡5@ÕÎØèìñÔüæÎÎö¼LLnnnŒ†6NŒvŽf4ô7 gs€ Ð èè 4üN `hü'5F €š¹…Óߪv¦În†Ž@H`ma ´u™¸Øš èUi9€¢=Ðöoe¹¿èÿÀÂÈò¯»¬;²°ýËØÐØØÎÆÞÐÖÃÂÖ `ja (JÈ1:»;Ó mM~+Z;Ùì ] -¬ @ Q7H+ Aþ“Ÿ“±£…½³£“…õï™~»•YÜÖDÔÎÆhëì„𛟘…#ÐTw¦škekçfëõ?djakbú; {&u[  ´Ø?: Â«Ì è à`ffæfc@wcs¦ßÔ<ì²üƒrðñ²·³˜‚ÒúX˜A¿¼œ ]gG ×ŸÿE,, cg€ÐÌÂáÕ;H 4ýƒúïháÐa €ù÷Ï¿é&ÌÄÎÖÚãUý¯3I‹K©ŠjÓý“ò¿‡""vî/v+€ƒ ÀÉà ðù¯—óÿ_îI• -þáö‡?i[S;Ïß)€j÷¿4\ÿ™ ê–†ðß v i¨_‡_—™ƒÙôËÿçøËäÿßäÿöòÿ:üÿ—‘„‹µõ_çÔ+üÿœÚXX{ü£šfgÐfÈÛöÃöÿªjÿ^gy ‰…‹Íÿ=•v6mˆ°­™õ¿…´p’°pš(Y8›ÿ51ÿkÈ»µ…-PÉÎÉâ÷}``afþ?g •3¶Ý)N fýumÔ#ŠÛÛ™ü^=VN€¡££¡3h¾X98^, 5ºÿ5Ú&F[;g ”ÀÔÎáwK99L¿E#N“È+â0‰¾"n“Ø+â0‰ÿ‹¸˜L¯ˆÀ$ùŠXLR¯ˆ 4½¯ˆÀ$óŠ@\d_ˆ‹Ü+q‘E . ¯ÄEñ_Ä â¢ôŠ@\”_ˆ‹Ê+qQ}E .j¯ÄEý¸¼E .¯ÄEó¸hý‹x@\´_ÈÎð_ÄÒ44MÚ¿6'C{Ðvý¾8ÿµñ2t2¶°0¶p4v±yµgåüçÀÙÂÚäÕ ;ëo1h€-œ¬^ÛõÛ‰ó«OP$£W²024¶r²6t2ÿÃ?ûo±ãP½Œ Ö@Sç?ÄÿˆÿÞõ½²ü-¶:ÿGŸ‡í_ùÿ1Äø_ô;º1hǬ­_KÆ¢mlg Ú•“ý­zþ(+h‰˜^«Ç*’‰ÈÉy€nW¦×zÖ† ø"œ¿Ï\@—Ñ¿^@œAKdmøGù™AU3}õÒ0µpýÃíïc;—?ÂTÌ^!(3GÃ?,8YK@ßÀ?@ ¾ö„Tjs{s í ™Å”Žå4sV@PÔ×´8A¥²þ}»¼žƒzðGŽ Ç…é5È—-èVz- (´­‹Ñï÷ÀìJ gÉî•4ȧÝV,, Dí_A1ìAß&¶ÿ™v–¤ÿГÆZÐ7ȪœÉ,ì^»Î*µ½µË‰¾ß˜^ÿ\€NÝ»ÿúfÿ-´sš½–ô~þ-ü;6ž¤ÿeÇÂrñGóX@õyåÀ2rÚXüw‚9~ë]ÿè(ȉè“àßd@9ÿŸÕd±z zV™œÍ ¨¦Înv€|¸¼&Šù×ן“±ãŸM‡ëDØí=9uÿ‚¢züAMõ|å òä tü›Á,cGPWÿú¦½fÿÃ}8î@c„…Y;c¾`Ëšà¶Û¯Âøn ;cï¦(v4Rh¼Û]îQ`“hª2ׯ…“»Ñ–·Ä©¯„‰Ÿ¼Žšë`ÃZ”[¼?Ä«Lî´"ÌO`õ ×öÂ0¨ íz?9x¿°‚lÈqpáFQÊ{{ëÖ#é^Û[¶4:»£¼[Å)‹øXöƒ!Z=J7 xš"×(s‡Æ™Žý§;êôÕõzöø ±L<‚Ïq4[¡—ö:kÌÝŒçJ…«S.9®6!äúÈ$¥—Èþgì9¯’¢¨µwsYÌ4Œ`k#½ÄÞÃ$'¼:rÒèØÌÖŽ <’#ä>­µLšß‘à3vT ìikìPæpèLÝÜ$$ó›ŠzôwÂàoÂéLä]ca<¼v7 ®´Ž®dNjÆu<‡tL7á61—EVÄžÂ|0äa.w¹»¼ ,ÓKÉ«½¾[ŽÛO¹ïº«¶÷•‹Ÿº  À$¥¢¢½-Hkࢌ¿ª~Ë® _ÅÓj¯ûFgwQB}‰Ñá|÷™ý$wD;…[öÁÓÍ ÞÃ:q¼HšÃ½‘ØÒ8þD³%5‚>+»`v°L¶š÷–LHfÉä‹Ðd«Ä1ø¨|ØÞÍ·e¹&oÈÌèjîÞ5î E@Mkg†ú55&kD(\aDHqh1-nñk×ôìä†õ&€cá‹ê QæDK#v³ïÏÜ\#GmÃ|FÅ1··2m WЩ̠Àyº¨’è4SI•-­Õû8ǯ:¥ØÔõ‚[QøîªlSg„à{‚ÞW2ß”í©oÚóCîUQ5aÕý”b:ñS`é”èõ;-3|¤<­!J>w>ñkß' ¯f-?Áx[¬" µ:øUvÒ&ÃúZ™RcÙ;r¥ß‹¨1ïç“DÞÊY9af]r'þâLê [œ„¬¯4Vh!—–—ð²üƒ¢J#_ÌJ\”ÔE¨fuŸOͧÛ,Œ]Ë^-Í+ñ9—râ¶|ŽþVû¥8é¶¢ÜUÖci—½r{4;³1¸Têô ûOcd7­öïŸÓ²v2YÛtœ'~ }^̪Ë4¿Lh2ÊØx¦] „ ÷G0é+4ˆ (… …¤ä @# Ì9/¥‰)õVŸ<ë+=Š2ņ¹++V_à|‹6m’Ü]œó®"=ƒcôW›~CÁ©%×7Š# ¡—d¬Í·ohpÁ'Ç՘À&ÂñÔ—'$ªoâšYÅÇ4®ä !Oæùc³à~ϯ‘ÐWüÌ™”yÑ]ä€ «ŸAòAËbæv³ÇÚ•ËÎT”“ÝÄÖ)T¾©û•ËsÉÐóp’…à€æc#ãzêÏ_‘âîZT-e7‡áÆ~ïl-;X7Ûg`f1öãÜX¢oGöÙü²¥õÂ2"¾y4ÕðÆŒl#›Îæ–.F&ìž=”˜šStÚç>ð[œ+QSy•ÆÎÔ £¸•?«îªÓ©¸Å^·'ñ7kYÇǺv}ˆn$*ýEfJ즢[âOÞêC}K>Õ.ʆAm´‘ðð8~®5¯*9ûÕ7ßoÞÓP¼Eߨ·Zf >NU³+xµõahÔ~qøêÕêˆýM]û…G¼,{vZòˆK<;Ï¢Àº®CÇ(S`Á†ïŠûæçXÕï Sâ¹ Á.ÍsF—wSI#ñGF7 ¾‡T;ú.xìB9++Ùz/XS83³GzpëïrÊ6|ÿ8(ò†´ùÓä× ;]É–޹ÔüF¿7À–ƒQ5B`„Ù6) N¤Ž±D¥íi¬ö•?Ö,¼¼_F*MQp¡ãyYDeçzé!‰J=Ùý¼¶†\€ÜÝAZé9´‰b§Øý!Ñ»ÂXû™ÀS¤`7H¨QÛ_˜x¥ãn]È0èþyßH0nO€t 3 üeV«+äì4cûãZ‘™H5ÔÛ…hõ'‰C™*ARt{½nÄEè!û1ó¨ùo9c]ŸJÎCÕ!¸ýÇgq}ñ%ÅA3Û·ðØÇ®nÝGÛÀPâúÃçÈñ‹Ô§‰J«ŠÄZè‹EËÎäv¼/k‹»tu°@¼™ §Rù™÷É‘4e·)Ÿ}[‡-“9×z>œÎ]wÜÅòí Æ„LFŽKð­|Ý€à[ÒÞt£âåo(gͦÆSÙŽuíUˆüfÖ¾ÑgÉñZU²ãïTwÎõŽL„ ü?ÀrÌH9­>\-cö2]l¶DŽX½'XqÙ5ÛöK|Êœ=Eó¡b·NšHܺ«êü (½ÖÌ…›>Îä§åéÁ`â8ŠãŽlŠŸÛ>B|Î%³69{~<7ÕuS§šYºE•‡ïé…Û|dT_8el¥dçÛ6Àœ[Ýýý¶hÔKzª’$Y-¨)R¥Œ|о(°ä˜)g_¬àx3€R<†û[mjÿ£<¼›úMÆ1{òüb}ƺEQ˜–ÁZ3-p^O‹.ÚáR>¾€¶1Ó·¿Ës¹…Õ#@}WtB(4Y+??[L¯exÍÆ%3tŒóÁGñWœQͨ^ûÍL³oÚ›lïóêNqs`êðÙUHc ± j&ên   —Ú…Ê$Çh|£ìÄlöÖЦ¾ >œ’ƒÚ ã2Qüž¿;ì j[µ\‰Åë„MëJDK*Ï?C”âq0·iÉ£ ­ ÒÇm>³‚Ê ›q·-Gd4ù¾ÊLÑ–Šsðq ¬ò 6žøt(ás  l+4cÈ ÷—¡vÀz dªâšëŽ4wÌÈ_í‡ÐgReüD7û1ËtÌ„sM–›Z>ª«’ è:ý"Tþqê³_~÷ß8$»ƒÜhâ Çôñ‰?À›$ÓY—«‘zYp~ýàêø^q +/<Îæó^v`™yКSª{kîW…É“¾)uVÁ 3ÑS å€r 2{-iXYÀ»ÞpúŽ©á”3¥bX%+ þ 5ð„‚8äõ#ƒpç1ÅðOJ}iÖ#±×j^´ºÌjˆ£D"‹;9 9H5‚Ð̉Éö¸/'Ïr?ë5몑WïÄ `v ÐÛØçf„pïL:Ê’¿%î¹Vq`ÔB¶dp1{ÄLUèß)Y@¼8•/iÆs>§MOØØDú§-ñ‰WVÉöèeHyWª&t­k] tÂvÿ¼&¬+ÞÙûÚÕÚ‡Zf½‡rUƒ—º¸)¹VåDÁº‹Øý ,8ýÖIÂî'¢¥f†–³S탥–«f˜2ž]>aŠ™>m–]Ô:ýüS³ès"K.+ð,Š×ZÉíÙ–qÐÜלøòO%ZåáÒdÕ9•Zâ=k…ìùX£·–ƒa¥ní.z‹!q˜×pØ ?tÚ|É´¿æ§|~Yëbz¹™‡pN% ¯•׺)8øÖÁ²ì<•a(æ(mª†.«!W½’pÂ1o³µ”“Rj"Q”gÖÆÚû;—c ú/É; Þ° ÇçþUêr3IýZß*w¥}ÙÍÕi\ìoëZ÷Z!bà ¤·M‰ä‚¦\DÉ‹ik>oš?ioÛí‡ï±=fPmÒ©…½¹®|³Ýoy$:>Í %’0\FÎR-¶àÌÁxœßà~ á lu±0ÞuÝ–ñwC0Öönø†M.: 3Id1ü„øƒôì¡f½£Í[8ÞSbC‹ýZv^•@j(Ef£8ë€Æ÷ƒ"£ØH§ó¢à÷ó^>Ìl·°µæ~ñJŽ|AÒ,o¾™/Òœ§Ñ‰šTº&û²w—N>¬Q¸^ÊÂ4nx2‡Î°šë1˜l.Q*èljéñFÞD¾G÷ŸøXº¸p„}B²Sñ å4§9÷˜Ð¨ x‰Ç§ÏÛ!ê:ëâKˆZÀ1Ϲ͢¤Áɯ$é“^Fä <|$‹2°‡iŒ?-C¯þúœöµ!‹HÂ-2Ôc >ȸŒawE4ŽU?ãîŠ Û¬*8ʬÍ_FØv!¯Ÿe'±1{–ˆÌ¯nb”EÖ÷í_oô§ƒ'AéXç·‘lvö0cæ(®#%b9(:Ñ­ŽUH7 ©:½‘VkŒš™v½@_î×çë´Z¹Z“{WZÜ3;ØÿlGPv›t´Û’ºW¯Muõ<ßKï ú _8g5(é–ݤ´–¿§ª2tÿ‰I„ÔM»1Šߟ Þê)¿#*z™÷ñKâóRÇ4|§ô1UÑ/»ïºx !=èL?Lëó“0±åK\•óFšAàk&QúŒ%Ì„,]†ç”2U:2„¬0Þk³Ö`LÛ*òœ®¤sYBÃÖ$TÞg\EË%ÕH ²1°Ò5mÏXðƒ™¼‡¶]Ý Æ6AIvmÐÓœPH_ìµÉnéÇùú£Ñpúl´œŠ”-3«A=qî·‚)Ùó†á Lö0Ũ{c›¬¬%÷ÎÃðÔL:=B[Þ|¢Ek`z†Žœ[3šWÈÁMôm¢‘``ŠXו?j”ìÈ|©Z'2/žv8?xËDÂ7Èx1ÞßIÛÓ)'SѶ—nÔ™X$/‹›lèed'›.½k;©lׄï6cFxÁöéÛL´w¼J‡¡à›ŸåT÷¥¨»àª÷³vÒ³ïu{`—ô,fÕÌ"£u>¬i×8¶ %ø’ÿœÈQPUB¥Àí†*NK'Îë…1D Ù4UvVê·‘`XäŽÅ7®…cPkƒtS=ÖŒ¾8;+%5rZ·p ïÁÓ¶"ü^’ζÛœ¡.¬6ë›·{(Âl¼#?V¹k|É®^®¸‡®Ê¦‚Ü”á5¶,c+ 4eEPøTÏË&*ǧˆ6äJÊï‡5P+,Èó®s:ÌðÓ΀Æý½üpkDÃ5¥Ü®­Kf‘N!ûRö{‘u:Ƽ!F‡%äÎ×åq,‡Œ >ƒ³ýSߌ'«¼¶ËùùÓ]o–›Ö°F¬†oé´ØMÒ¢_b½XšC…#RÖ´{k·a¿à:*ÆSKÂ!âÙ¦ snc´ÅæñXlq¬½{R¸©!&¢r“ëFFß¡G¯±$M:Óp­õ32uMo.¸# ¤Ÿ •‚ý„6ÙÐ&©hrÒƒI™PªÔåÞTG)Ž“–úrTkñŽu89gß“7PÇF~x/0 5©W—»'míúÅCéráÑ$jJ‡2ÐùM‹ç¤Û6ߤ9˜q!ÏçªM$Uîct¯Ìx”™L­ v+L§æŸTäŽtéÎiOa»\4Á4k6”‘r#ÊÓÈ[r\ 4•µf×þ¡s¿âGãHûÚ^LáhâéO´›¨_±å‡®y¹ª®,ñlÒS ‘ÊHꩊ :1ØšÝ1zðùu§ÛåP§splãVôSZy³õ“å½¾óˆ'ô6bL@ŒpO®ˆl9ó/jÕj8-Á³}òéF ØõÕW~šô=‹xhí²z™œasè §˜bö®: Þ_¼©ßñS–ÀmÌiÎ2IxßöU‘ô%½Ñ!·Û ´$ÚBb†DÛ±®§XzMãÒÖ·0è‚U’÷ r ´:AÔ¦H¿($ñ÷e '¾Ñ©“4/P‰'óåŠiˆu…Ë¢"Þ¤2Ϧw€ß|Q=j„pìæ6;šäËqP›üY•®0uø^:@[õØ¿üÀÑ@êì¹Ìx…#Òô²Ýò°¢RöGe„:k53×a‚0Ÿs·M9<†âlA¦Q]Y“ªÅ°7•OÊû®¡³ý§+?G¨šw0nøÁSeò¢lbsUBy®kÂéƒÆW~pþ2<°´ ú>Ñüžeyï™–ûÅ•ÊÍðeèÌŽ¿¸ƒLÉÞyÆåeï˜;6½…ý/÷[aêè…}´èàÛ ®—wŸÅ­àÁg²ö=WÂBNÔÖ¶¶69^ýãÞ&<‡Ue¿á Ã/r60ö˜C-gm¾$'ù1¤6”?°@ª~æ½:iDmÜ׬j] Q©öe£×2'iA .[²QŠ% Ö@*²e{ÿ¼–òë2ç P¢tÁ¨›ÉAÊD’…@Œ–ÜI:>œùÂ=KdÝÄÇX˜õc]™’ òöÝÖ|¦­GQÒ…4Nª"óE$j´æÏ]a»»ù/cðПw1$WîTµî+J8/ÐŒ#HMÃ1q .ãÞï¨r…*J©RU^š0ž•ë‡JC¶äW+¸kKJÍ5¶õ˜¸ÔRªÛOlŒËEo(ZÍý'ü]UaVœèévMË€bqY0£B†bÁsLù7n¼Ì…£Ù ¤^“¼î&4ië.•º¸ñ7ÉÞYåësË|G³ NάƒŽ_Å0&]MOxÓã²}4—6ަg(ì'¦q帞%ѵ“Â;r—álùˆM·…ÇñºÝ™©Ó³Š#N›-¾¶q Θ:MÓFò‡‚Ÿ‰k9í—M!‘·}¥2ž=Žw§Q¾Ó‘¼H›£ ’–^p‚8”àËÑà‹„Ïv<œ1¿à÷ÛqµŽf z»1Ò¸‚×ì÷;‰ˆ½Ÿ¯îvÑ gU˜ëòG¯Ï t.’C²8HÖoãBˆjR%ty/ékqÑ(š»tþ3ò:/wyËŒ7†˜§†?+¯ áÅ aÔxUG°ØeU;ñÃß^þÌKãyÈiUi4Õ}›Õ¶Í‚8|Ë''÷FíÖuxdEšìŠuºÿÜé]Š©]XÇôp+ÔÛoû­0’ýW¬ ‹ÉS€¸øyùÚ©e÷úÆ©Ö}v) ªëÕ³‰…£%!PAꆵâL*ã.Ný‹–‹sÔèS Ëbâ#®GhþâO!•,"“Q›Ë˜}êý5i€/w]öu]\@)†+aË%ØÉ¾–Ä¢:µbuˆ8Jd¤ËÆï.¬3±p%„æ‚©ÜÓ$à º­œ2Eöj{KØ”{&¾Æ”ØúØ£°ÂOaØ’øq¼+kß°‹=¶Ô³W÷ïù¨­Ôæõ˜2:˜æN ã^†G –ñŸb: 8[w¦¼ËÝtGKBß_ˉ•ÑaÇÈëp ¬^Êûà–:ÍyP4èÏÛÕ\(7.¨ûX³õCÙ¨R;3=±â„û°ŽÍa´£ÃŒHW(MHô.© Ù™rþè^nDV¹z‘gNŸu[»P^òÖ#pãÄÒ¦8s~0Xçç„y†mŸ4ß­ÞÒ#½§–Œ Ûàõ‹Nj÷9A `z/н ˜þuY{ð•¬X¸2=„(ø3YçVúEÃ(ñˆ<Æ0ʼ,xnámì45lò~^¾*ÔXW^Oꆻ4#BQ¸¶õn`–FFÀ¤/c³äãJ$«÷>Ž÷Ä×÷£L 4ñ¿.:“Q­u-&¥ï?º§þ¢âëՄغ¾ $F©È,—u}dÿ:ÖòpCßο{’ƒH^½;ÓDU ‹ÝòHIƒÜÂp¥è¢4€uÚ+*£4å³ZTÈÈR6‚»Ri~®¢•V²õF!" ÁNÎYòë÷ŒX8O' {ûˤ±´ Û—6öçJyŸ¯³«0eD¬}Öèž¼’ÔP`.û \òùŒlý§dqd?ôzì=ÜÄ6Hñ´³­‚HÕÃl¯¼àúÔÔÏžd±Â^Ð0ä®"¡!Emq>‰¿Iõ²HÜìpÏrTÍi¢Ü¶ß‡D#ËrʦR5Æ,‰ëÌïÆU–;ÈkmË¡P¿?)J"j}Š=íÙEmߦiÂ_^t½J Œ©¥ _¯1ˆ·®2ÌÕuÏh*¢°jNú*°Ÿ˜"ó%·ö‰¾”Æ*s\Þ@щ,iÂÖBîGÜsd7¿³®'-!~AO¶0ÍÄ/•EuÇcÌ¡Ì GB«àø:áki Ýž5>…÷omÞÏ)–̼{`b~ž<¾1=e˜ÞÔnÕ$ø=õ× –ð›s™T/ÛìC‡Óñìû^1דºçq܈Âîhøî.Òcócˆq̬…š£Ä'”†Í9ï–’ÙN‰¥yF©«H’­F¢fÃ;bô¶\ xwgVKQ\ŽŽ†Š]Ó¹\ns|)œËÍ9Ôhpc G>š6›ßî?N(!\|†¿‡IÄ DY;ðJ&ëG`íü`›ÎÝÊ1ɹ§…RðËÊ *÷¥æk'_ø A(ºÔ‘t2ï!G¹?h½ÞÚD¿ gN\ŒZL?ç™–XºÀàXÝ…i‹™\ÿý‹ÌusH÷B°jN•õWp¢Œü°l¹³øš.¦{$R9ª&Ç‘û ut oÃžÐøÈY¼×o¦Rìñdw>tê=µÜ2ßîV¡‹â‰°7oÒö6M4yšF6GñD–_LRUîé÷G ¾ñ†œ§6 %k|Wá°ÝCÖ ëýÑЮÄßut_h²Åw©ë]L9µí6rÙÆÊ´Žå”àø\aT«^úÒ8 òˆ+ŸP¥â?£§™ÿÆ©ÿ²†šìwoIäædHègÜ3pñØ(áž%ß»À!áÄ#ýÓ|ê9Ô ´‚#¿Ì÷_¹ìüS1oßoQèZ¥k&e¡1z·Â+gÖ$Â$©Mlpw;ÌPð:Ð!"L\;Ò¯µ/ÇHtF§û MÒÖ½e¿íe âFvñ¯ËÄ–­I Ô\<ëÓ†¥Mìæ"Ê¾Ž¾…'y·*PÉŽ‘'¤ú24¦û˾Y’ ÝŒN¼Ÿ¯ä+´^°¢¬%›»ÚtRîjÀ#Ó;â˜Làg"VáÒ"å4 ƒ§·¸|y…µ¾L•ú—3—QgTÔ£‘IˆtÙï nù—c¤°òê˦jN2¡™_ ãïÅ“ Z=£Cëò`GëjGp!cÇ´Õ©²ºè^öE;w•¸¬˜nõ”η¹Ž x ޤÀ˘ß+É¿$·'ù·xŠñ‰ §T&îC°V[.iy­Ò–¼OË+Ñ|¡žõÑðªŸ'Á1Ó5 M dÈ)Zþ’œ’…ŸÐ)¤%aÖŽ@ã.c»r¾a¤é=•ë›”žR“Û]™£neÇ)%¨ï‹Mv2LmýyÈ4¿MÑËÙ®/tsCÁHn/¢zÛT»3t‰Ôjs2wþÁ†}øŽM6LÆÌM´R†Ñ•ú©8±X•ÇîÛ (¹n¸ÚhÉ€y£ùš¶*q`|Ö¹.)8Ö5 Á¦X`{ZõÀýÜ,AÓNÇ¿¶1DÛl„*ÕЩéíEÖ ß– mÖ$.ÿw8–ËË!ù"Ó}éî±Z£-xD.º< y³LsúÉ{S¢´IQTQ4Û“X#[`n÷}žÜ<ü&ØH1ª2/J&·aÍ•JâÀX#R –Áš†–¡žº ¾Ÿ¸›æ}x}Èá›Óˆh#Ïc^fÊjÅà’VÄ‘r6ëTgìç‘gQ)muÖ§÷Þ(²ñVguE ¡7‚xy±­N|•úu­û«¶{Hìj:éJšò™±J?u”—Ê0RfíD!VÒKGÒ½î÷j3Ä©m³+|0¡¤ä8ƒi÷«ÖFÑò||KœíŸÕZ*?¼RÂ|NwÖ‘ÑG輺Âÿ¥I3< iþXé›â…ðxQô• Sͽ`¿CL¤¡§fZ¡%;ÍóÄv´†¦2÷ÄéxðFHá…NÖØ!,oÎØóÎeižSïsžAŽ©òÎ ?ŸÌÄ 'ýé¶2Éõâ¯1‡~Ľ»‘üÛ›}ðinær²Ù`쪌„_jÕˆŽ´nòü°xó8;(ŒRDl7TT)Çš¾)„ACx¡µ#ߟç(füj ÞÙµ×Ú+tÒjl›ˆö´ë@`ü ëÒ’ «$ÖÀ¥ï“ï›ñ84ô´àâwЦdç´‚çMª:mä_s=ÿ‰Y%•nñƒÑ(Ÿ LÊä¯zY¥Nví«±‰ Çá›MšGU¾HÑ«ª³¥M('ÑŠª¦Ú ÊÉH¦Èí1½9=«Ç²a©¿©|®A 7†è€ Hy” \Øw>_Qñ¬ù”ðyL‘æóÝ^ ÜXÔ•0“ît׬æÃ].Po鹺ᒺ;`Ôˆß:núý$L¤³¬ÒáR§ªÀ öY2x VW¥¦œ¤8¶´>u¢‘mmÎ/9j¸ØÛ]:‰_œ*)5­"'CŸ±š«s»ŒA†›DÔ‘õT•óq#²ÿ¢¸DB\$ׇ2Ä¿ú7­0J¥ÇdW­hÈâÙ «NÔ’´<­tþ˜ZÅÝpÖŽx™ÉþÙ_·ëI'ÔÕñÑ:òª•4­SŽ¿W Û܇m¡}þeMM|!‰±³^€«C?Çç>.Hé0P´!]Äê’(vôƒ]ȱY¼o#ÿ;mNwÔ¸—ˆY­gšûÈE4å /8Åâ kÄ©+6§þYEÃt1Rá³¼¸¸™â©Æ Ip®ƒJ¦Žî‡fdç’Ra€Ùþ%„.™—˜­+ÞêM5Ñ5»y)ªÚÊÐÁûúˆS©•ð’_œ~*›ô¸¸Ý·]”ä‹î9Ÿ*?Îm™C³U»ÇI!Ý<ÍÍ –ܸBè áV…ðû7k} k€E'óáÕ‘3„B‚ôyîÆ«©„ýA‘náS9÷„FÞ´ÛPˆETÀ¹0¾°A¯ô—e,¾çŠÄw*/P¾CñÃÊ“Âyë†Ãð]­uš&‚çRþ¸‘O©ªTÙ»€[FJ誩şÔѼßN陾ë‚ÓKãmÄE(¤Cï‡ñú’‘°·ª$²+cÒ`ñÒÒTqñR¸>ù}Ü ,î1ëÁ‚ÅöƳaû¡ê«Ò5b9ÎרjèWˆœé©¥s"ô'?=Eæ˜}‡»ˆhtK0÷pùòÕŠZß›šç0HIêËÛÖÐ[e¯{Öû6Nÿ…yÂ2áub ¯`ã½VŠÑ~,ÿ-¿2aƒÐ¦Wßf«¿'ék“ï»RV\«zþ"³xðHà냨»:èÅå2]W±ii/”W‹S•¢‚æ_­y³Í-#U-¸š³oë†i‚&›£¥W\¬r| q°_AÀ03g{JF HíßN– ¦½î¯ˆ.4‹137w!² “©AS…¶ýš˜ßÜðÕ7í܃Ѐ6\¶{ü„|g ûÝÑ€ßÉY±-9¼mIM†c ß#n3Lä°J’ˆyL$AÕÈP>-†´•ì±_SBüˆu´“*ü×:ùVXÈŽç¥!ˆç«cHˆOè2… Ú%±¼Ž‚Ç)­ñ&ØæmESe /:;jÄŸïbj,Q7)Á’ÕŒD×ãƒ-ÅÏh¼¾SÏ ïø1” äaËwßÈ72 ty`q‚ æµ4#¤ò¶k´x£¢–@}õð¯ûb0k§˜1@e±MïAåü ¾Ÿœï‡t®Þ1ÔR€ΛNyi]Ô½LÙ¢Ùóü’^OMËùÉrqboÚ„O¦>C øïª=“JÅ[ô"¾?ý $||TNô…TyÀ-üë 栲Ĵo—¢'Gd.÷œ¬¯ÙÕ]|ÅÒx½–ppOÂêI;|lí•BZøœ”«[gzZ˜dkp §l—ñSNš{¢Ì:À? ºGrà&uoåèt~HÉ÷su8Q¤0#×ì"i‡®*ðwÂ,`Ñ‹™!º™}D;8‚àïô{-îñšèÄ&†¡EÕ?jƶçùø"aKjë2“hµj;È ,Nëâ§mÞ¶›Áàlæ¡våPîµçÿ2¡¶SÔ;)OJâ™P·ß˜9l"M!WÙΛBn>3¦u墸ÅÜ&ŒCþ®ŽXÒðz ¦ Ð[ç$¹èKô¬ùíE ¦Êf6Ë*Ÿë„òû{÷¦>æfRŒ˜XËœiæv:’ÜÐ'¾È«ú›M›—÷´K7‚7ë…²2ô¿ðûŠq]Òï¿R\I:g²ÜÌùµ‘Œ6£ÚÈ×W±V#16òèý>OŽ¥A·Ñ“­kók¥÷.þ°0²¦Vÿy9ŒÅ6OœÕÎì Ë6²Q¦:•Ý+¤åMc›¢lLdm3{¥€]%8rüÈ/„º#ÐlˆÜPÔsùxRÆkVwÔi¥O0nñ4‡whÁÍSY;-z ˜¶4¾ª;ô6e>wadþÒ¦‹ £1>µ5²#‰¢PÛ)ÏZÙ°¦µUVe|0—Ôçà”ã\á“$€¨š(u!ÃJΦ ì7QÄ? fv7ndck'&Ë…>س]H7PÃ1†ŒÚlÿ4×dòîK¸‡<‚9ÉÚÙê‘‹·%Axˆ—e"Wá.ùÕ3?htÕŠçSE¾_ão›ÓzTžã{4½ýA,B}]{ÄRýKd#"Öd)ÏÄPÁoüS$UJ‘Ÿýä;ޚ௵xVYRÍ'YÕà1uÇæï3²ŠoecÌK\Êm^ø$°¤Ì™¦9CŽv"6$`ûZàDV’ÆÌ$Q(@³$–€ó66Úc×:ÉÕÊõ­&¢z˜h¥:¤Oª{\R×RªHÅ= •5Œ×bnÚKC=¦F~ÀùÂÖìð.@iøÑ„í %~8ÿÛâ¢cxC.|Qåšãªêp§ DaÐh¯¢êWÔòiÌ#…ÅÒ@Z¢T­mnƒ,“'ª\9v!¯vk$*÷ç¦ØwbÙ kàNèéçßë¡NGêÀa ÎŽMçwž‹?Ê®€ÅáBÂÎÃ:~[ µjDoyÖaÅëãk ~ƒæ2Ë„Ž…‰Ža'H±÷ÑÚc+Y•ÅÕ"ÞyZÛùíŽ Ÿ÷'¹M™HÀÅ~"w…IØ@´RD=9èïÎTQ+kËã×í’ j.½ ÜiþÖ¼7$„è¿“ÖÄEâð‰wIä¹Bså’ŸH™W’ÔÅy!VN;.´_ê[õ}ÀÔjúR­I#¶?­Y=·ÒÌÇQ:TžÿÅ$ÈÁœµ<ÚG5Eâw5j!Ї´úôv¸„¡)ÖÌNë˜×§$'ÕßÇë÷Gµg÷!'ù‹·Wל&´púetÜp4}©²9:Æo÷Å®ã}GrŒï9åü)ž a‹¢¢ )?”;KZ8<Û4­é¯0Ï y¾|"Òá@Úco‚Öå•ös[ß*ÿ1úóÖSðºj|‡Ö÷Ü×ïêÌ[üÛ“€ArªÅwY7«ÚtBÝ&Ym™zÍpiwmAOhóÍX¶aÐt´eˆäÜïÕLØ?4Ê6¡¸Ž¨ç+j’èŸbvF2%ÿ왳L‹ÓqlO‚ÊŸîEË›3å»!ªTð´Q>H(«àÿ¡òSç:¹°/r|/©ßWÑ%Š<'¾XGC|òýþ!O®KI<^«·.·VV‚Cw`|vnIW[9¬«èVÆ=ÃîcÁÙ# 3Eœ}AÁô5W󙉮åÒ¼²ÅƇ|k§mï®NL‚°_2#F‹Ú•®€a~zÔ°žëýCÃg*k&DbÔÓCßÍ‘mßû"6v߆uà§CJõqÉ-ÚZ §Ì.¨‚ÒJKð·—EB—FòÅÇxx›2Ö•([ü&îc·ææõM©vNàG‰LÌ'Gz›ÎÀ·ßõ öðrÙ¶‘ý¶¿ÑŒ¼Í ÝpA^µ/óÅÇó&(±£<çÒu@³ËÊÙÎ@·‘bÙ¸Ll€ƒIjiž<3áÊt"¢ùñ|Ã;Ðùƒ£¦7ZÆ“Oô²/NÐâöƒíº2’ÙŽÕõuJ®À‡µ¯ëÆôqh´ç§ÀÙƒôGÿ.äòrQ›Ÿ^¥ˆd‹6QyœO#kÝW11AÇxBS§ÍCè…lÊðz¬Ñ\Ž+Yó! –³ ]×ýHc¶ýÝÞ ëÕ~ÉaÕhöQ^M—F…ì—XrÌ™öÙ"cÛ$—¬CwWôNßÙÒ\ÄqÝ-Û /‡V‘E¯È£æ†Ò>®LV=¤}Ú,éQéÑÚðöKÔ)²½²dàÂ{Ûj)ô?TÅ"]Á (¯ÙfhxõúXVìþt®DÙ‡ë"Æ×ÞvyJƒ—d’•$Eß_ÿ¨Nú•VïŒÂRK ’¸Ÿá@ pAÿzF¾Š­®HäNØÎ-ÓY© Ò2œj‚ør[LÒus¿Ÿù(Ül¨EŠGÜ…Ì–¶Æ!ÌYpuHf”w÷o”ƒÊý4ÕHcë€XTÇËŒœ?²"ÿ/ù–GöáA´éµœ¦Ò“U‘ëCl÷MT\Ʊ¡éù£I_è…„ÚäÛäõ/Á~½CD(%+ý¿ë³BX54Š_¾™…mBý¡]H…„]ÇO+mÏ1'»óè3–Ì­‚ç©>ÛØt$3y†ñ.OmŒF7¥ün:‘é©’J† utD+Oqþ½.%s:ÁS÷ä¢&Q‹Ä¢=×[†m¨ò¹.­³ÔüºÁï‘‚“.ax‹Ü/!7é·”Œ“Nðï1I ú?|ô[P¯Áj6KõìUI5µ±#MÔ:<}jTá1 ±¶+$j*#6OÆ~ÃÓKã}XâP*7Uì ¦ìÀåM`G+<Â.É5 ØŽ"E8É‹ó0<½æKT]œƒ%¦¼ûäÅÊé‡Ê„1gŠI=:WäÀSÖG:ÄÄé´ÃÜÊmJòiUŽÉ wñØ 0>”ãÞ“ÎüÅѶ‰3dïÊ?Ð2—b c]^êÌÈ”ƒ=œ6„çWâKC¤Þ4„—þÛä¥-Æj/ç=7p·%ÞRž—nÿ‡-Ý@ ¬·,E¾¹å>¢;¼¹›fO\¾øeñ)‡ ÜIè¥Ñ8SaFG­òàf¹¿:0b«Ïu’mѦetòÈ4gâЈÑ`q5‘Ã1¢-¾Ñ©* è­ pØ+‰Œ@· aåìÚpl‰«9æv¢¸A9´Ad÷DžÔŸRèMƒK[†¨B‡c0 wá …*8.s­ $]LZÊkqU(»'‰œ= ÒœpF¬]p?caK^à}€1}×÷ãœ);é—R• ¯  þϹ$!°œ´¡7q½-KÊ”|iï†Þ"w|l« ÞpÇÎÝÞí”üX=0|ì ¤ÀhS§"~v¿P°Wô;`¤ä±þU¤Æ$’c‡'fù3ÏhK6ŒHyjeoš0?C©ÅˆÇå±ñÍ[‡õ¾¯ü²t=LIi?%÷ï?©Ú?KLLü*#)÷ë—>í|6:±§¼M§ø>íA!¬é^¡;N£æŸËw©×‡%&+ûkFgzª/ :¹xùAܶ [,ÆjtÉ;è†~€rÍ šgEpÿ3 ü‰]æ×èÕ§ÜÝvÃåðüh…­kÏä\Ç)-F4Äòš™ˆâ«QÓP]5Ÿ¹0ùüã m­¤¤úNïR–9\U” Õ(QKL¯ÍR{ŸÓcÜ/auß.È•—›že²ääW×Ì:QzÄ~€Uøª…0º‘e‘Ýã[÷#ïvÙæ¢¡&§ÆpÀ÷ƒ„køÕÄFdJܦoÇ`W º ÂÇ…6‹›¹éXkôV?𣢋‰³|ßQDêBh`q©¯«ßä”—´›Ý3g;‡|>ív£ ñ s”ò¾wš’ŽÍ—w-r¼E#|Ôr¬‘¾kGEÙHúÁ]ƒQjùà›†3’uÆßŸ©Î*óžÇ@È䪓%ôÓ´3I l1¯ôÀŽá\¼›ZÛ“ è·\|Êr[$‹íÎN±'a›E@ʶ¹¬˜l-2 Ô&‹vxAèm¼Gj,.a+K “"s@-äèŒCÅ8ð#Yâ5~ùÔ1ñ¼r˜@ÇîhÊúƒ÷ ; I›ü;zæRMPŽU¿ÍG‘»–£éd´Ö:Ö#ÖœšX„ØtÇoZh|bU”¯SU¨z­ X(êxçñ•.Úƒ4 Þ `mÄeY0¹®ˆä¢oëÂ|lƒo|BAûî¶Š0?ŒÓZDXÀž±zÓ‘EÊÚ¨ݛԜ§«¬Nï yÈ"½BΛ%­ðÒL¹ ï °Ž‡K¸"L}fB‘t–]ùKûîç“8OîgqPܮ鼈3Is]_{Ó1rgzU”ÿ¼rsž®ç(éj=ÀÑøìÓÙ®œŠ¿Ò¦¾ÁÌÖß@À"2÷c62Í[ÝŒ¸çЍõc>Jœ{ØO÷dÜg&ÄŸñÄ?׉XxØ-в²—À$ÍàÈ´p‚˨ßÎh8û6µ1c‰£ê6Í®ŸNöbu±yÜqZ‹äú#ÉF©0ªÛvOÌéZ½Ñ赬„«‚*+¿yÿicljsÅô ‡ZË•MM\ Zý{Ø£:¿ñœ,aK'Næˆ*TÒË5¢¥Ok¸‹¡òµ«SôV½ÒD´¾|¥:¥ÒŠN$¡¾Ê僊©$N)n+CÀeà"ø±þ9E¡95"O†…­ÏUIò8#ÑäÜ{;.ËŠæ$·}þØœíÝa«ÍòÔ”Ü,óAL¾L‰ KÕ/$\!FFŸŸ˜æÚ޽F:œX9žä¡*düÓvЪ;ûñ˜TR³&¸àå/Žu‹—%٣ʛ(Xö6–¢Wщ«dQùzPh i4ÞÒàV©ÁX \Ê8Yc$‹M=7Ù°™¬C„3s¢šFõ㢉%Øþ,Ù&¯*¿Jkkõ(q¢:°²ÀDdZŠPZóáß’QKµ§”>ô@«†‚²§Æ¯¹›ÏÍ®+QŠ_è"s9&K õ´_ÀŸ]–KÒæk*ú;[ ¨ÍVoÚX]Фäó©6˜¥ Ôõf¿ËëCÚF4ÑÏà ˆŒ•QÆ]¶Þ^b¿¡c8wàѱçÐÞÂîoܨ$핊ính†Uíóº:aÎipÛ¨Ÿ¬›€Y+˜¶MÜðù‚çœl×M…_x¯Q¿¢¤Ç™ÅýÈËÉÊVVeR¢;ãÑìqF=yqðYØÂb£½hç¶ï fÅůî]šk÷å[¼Ü—¦*0oYáGk˜ç&qˆt‘’ÅïÜbS”¤~ؾ_Þ½lZ&Nn¡Ôý@6öÿL³çäñrÁ5hÖÄß_–v\],üà©Å|Àš~îÄóŒk€Øî‚€¢‹Hüí˜I^ì¯I‰ÑN‹ìh¢V»© Ÿö+š@<„µ ÷iö9@㌠âω…Vré6‡ò….³¤×£‹‡\öOÑ„ [vZ5\L…ÇÀ‰×Ü7ƒ HØqxþ@3Ž?oÁÜܽ¦ÃŽ`Ñò¥GúÙOù€ɧ°¥Õ™·ñ˜¢9Q ÔÔ²×æ~¼pb–©ýßýúp)Ù=ʘn­ü˜4sYPä¨F0½i”Y’oÙe_Õ h')Qpö"S‹”Ö&…ˆ·,ÎÇXéAí[!ÎøÑr€‘; ÓsLàÝ,ÝĈy°bF¤ðí¶Š:ÙÏMù¢EB:žX¸^\Ë  /s .¸Íú²Æx[—U Û€#°­õ¯ì”Qâ,iêõj‚ {ÐßðœL´`û’ˆú_F¥’¸xÞÛMêÅ¢JÉÛ’š„·ŒíH8ÁI˜Q¢cñ‘f¢Îßæ&<¹©(ðÜ­üì•Þ; 9-©¶ÊHO“±e¤Á Êêv¨p$’ê=wãe€2R›Ï§ˆ–}®ö–±7¤›ÕŽã±×èø:Ã,dºDóOÂJN¤L€}’’þÄ< x‰ì,Ä$¹Fwê.5R‚½Sr%c_"Vl¥-‹7U§û¶¢¤ŠKõˆ\æéLý´³_,„@zŸ^jh¤Ïƒg­ø½Y¶ß–’Z4NÖá Ú‡Yb%‚Fm†&Ä=dÊ|b„´Ÿò¥z~T¢~iVçCïFv¥27/$èýµÚt§(U¿H4ÁéCèi¹„ë`2žÂ×&UO„~M':ŠçHî̧íÞ 9cU ÓŒ$×V-¸à&žØEéÖ,¤Ã~q†”ýDFd-,Ý÷¤ÀÛÐsq&EÂ<a_Áäq5õÕò)D¾€©W¥«Æ7ïúb… „3uíŒ nJк“İ}xÉ) ‚#ªI…SUìÚ²;"ìë6 kÁ41ÙâfKúP]1‹aç¯u%€‹\Ü•­·£NÛ:Õ@ÃIûÀâþS/\ôWX!À×]wË"wxã(¿Ü𣦄Où'/Õóè÷KdAlJü¢(Æ(zÉ6ð„t¶4ñ ßFÄ󯤒¯•î¯Wméf0™¾a¼»§Ò3bñ©$Jg¿¿;°(ëù1ëýu’%¸(èæ†ÃYðJ"‡Í(¯„7R$¹FÒNr:°D²b¡ûr'­Oƒó®¬\ôyüôº†Ük\ÅD>.tBÛ{K2lx?—Z>læ4åèAx­˜ÁÞšÝêòxV%ze®9SÑÕkÚÆqc!ÉŒ€EúT¿¯8·[“=l"J!¼m=â߉€cЭÈKƒ··úö¾íŸuª¯Ñß«"ý¢èÚµPñ«ÛjPT‡¸:Ÿéø´>rºb‰8Òi30ç¼Ö,lòÊÿo‘†™Ž#¯x¤%òÓ…7^÷<28Á1¿ƒjÈÞ6&ÒGµU‡µÍ›±‚ƒTÆcÂÕÊ@RÇfŽÃr?û¥4½…‹•ð! Î/§×$ôïï‚DÕ$Û„„ëÑÍçaú`çŽ÷AlQ5Ѭ¢ñ _jLI–=„¯|°÷ï ;¹èÿqPš±Ê Œ‘á fï…ž‡—am„')ER=4ήi/So/J´ zuÛn` @~Ï\´íð;ÉeôÎR±iydÖÅns%ý¨Ä2ÀuÞ•Ò‡ÉðÙOÉnƒ±Ê¸¥(IìÌE`«}:kA‡k—a€9Ùuú±£ÕÂΦ²j‰ˆ,ÄAž]þ+¶=ÙDA93;ad#ú¦Ë»/§Žn¹PjÓ†{êGÅÌe™ þ\‡ÅF ž…¬ÿ“‰Ûx¬eto:…҈˹GÇ,ln‹í?c¥:u?ù+£Hñ-qhI}ï³y뉔1PrO¿rwYöÍý…Î4–#̳fD÷Ì”pàc{&ëÑ¥2B=é™oíÓ)ì¥5TÙ€4û“-,1Îg}«cd [ý²\Ô¦ÕL ã4BXªÑ)lýÀRdVaÔä.O´~u$c ºh8[¯;jQïð4ÿ/då(k™xk¶9qNgÆ©FÒãš÷­Ð2-å¾²7I’š(LÙДaö!9rÿé”39šx÷ý+R\åþ‰HK£¨:ÞÜøìŽ!YNŠãêËU0wµ{‹m†{>a) ÃÆ)ˆ¬ò¿g1JÁØòºàwÛ͘¹^žæáGy4Ä{gQyIy홈½a \hž‰em7»Z$m”°žYú,C¿H/×gÚÆ‘fšJ¬ÐôGà J’Ü­æ©ezq稰v:5œÊˆ‚‹2ææÊqosëJ'W>÷Z=úêdÌ‘³l^½šÝKwý/ìF¤‚ê«hÉþa1«ÞÓô9no/vhl–ÞQZÚ0Zòâg‹‡ïÊ;ê³¹»P“ik]J_üÚcÄO…2?t&‹=û•ž…wš°LÓÖ‡¼¾ü˜kò0fÿcHvÃâÁ»y?¤,jâ™ùµHÊè|¡ÖÉÒ:ºÅ±ô ByƒÚ®‰àa…o“ŽÂéL–*˜sA\· =¦ù9 Æz"•¯¬ÌGö•Sn¢iO©D´/ß+l ³´ÄIYF¾s•teŽ®zSd|EæÄáf%˜tš¢,㩃PcSȵâ[ó/•ÍèÕ%ωæ/À0/µ_=PÕý‘LjW¾{/ª+¬gÖ¥{òõk+·L »u°þøÄ¡z§úsÅê4ÇUeí…ü¨EÎ8úiFl^ÌEÜ÷¤£XßLuí“uÛE¢aÃKJ5ôÂ*fÉÛˆ¶‡ð™Çµ²5i§ÿGyœS.qh­»½¬sÿ¸Ö²_¥º¹÷'LéÖ¥6º¶ŽöâFãp–äB5F'Ýœcd›û29Sr5Xt{¢˜yÈò •-Þ_ê ÔD5ýYÉgƒ?òÍéQvXBÇ—qÒ»çŠÑЊg{(½ìé&úEÒr4¿D¥Þ¡§M$<žŒ™ì‹[%)á•J\;®ÄÁù£éóYví9?í†ÛpG7ä£ÕÆÎxR!ÄÆ–ã^nâI†·Îä¶v aÑÒŽóÑÔ^{8Òê¢pÔX§Ä k±/símwµ)dÝ7F¦¬ø´0¢¦®öW×6™9ܳýfhZvðª¢Ï ð§È< ÌïŽwyï¿\Vóø<™•B»ô"š 4h³=z¼ß N¹ÆÌ$|ê)•gzX´l(lªvb·Ä=ö°Š(J)/ÆmßÇ3\Rž™Ñ-13s«ŠîÚ0¡Fæ¿jw_ç|4·«îJùH]rk˜2¸ku®ùL 4e³Dþ?ÕÞ¿Ïs©%dÎa±­NYa- ëX#€H}„õ`ù‚XëTrê Ö5ï Xïp#îP©„àÃ8‰­ ϲ'‚Áñðs]Ñã°Ìˆ¯¤Z“Oß|Ëê /ĽG°^Ø|óbäQí\ÞP´ALÌÌ’ͽXÏHÔŠQ—ù54‚Òü¶‘W@n•C;8#MN7îb¿#oÂÑå°§Gz0JZv^èñ]Ï1ë×,œ˜4’>ª‰™;9¥bÌ3΃ßNzI.˜ zy™”(E<^终„ȇ/:ø·‘2ÞiבöF›Ù º±ÄŸêC2„³ØwÊ?Xü¶!dR_¹:3G‹¿’ŒÊ¼8ÈJv8†í û*½±ËT€ý¥¡¹m¥Ffä áõ¹®CÜDZ»Æo_<ð˜è-jÉ—Gp3ÀÊ*Χú@øÓz;Æižs9 _¥i9nÒÝ™˜[ÞPw]y&°põ¥ d;½*gÁ·B®\ ·Äö<…žf侑q0Hqdê4Œ²ÁLÆfóÄÙ]h¨¢>‹uã>Ø‹Óåìl«Ú#éPc~f,=?àŒ<… ãTnmYV$eø(U§Ì&of¤n’ôÏ4S£s"Ä"›m¼Ü:Ö+Ié/„°•5Û3e¶0!Ë”N#xPÚ5è%„P5aµÜxï|¯½¦Ð<ðcKËì³é1§³UlwößåqKÆ=h¡Îõ ‹19ÍÕÖzJH.üÜ3ø|ÃÂÎ4©‹Ñ°3oܧO‹åäSÖhÑIuF‹÷-‘((ÎÃ|®N)hÿ¹¾Š;cå>4Fã[ÕSÀj7î.Ø’œV›0”V4Mïy'"kA‹x·êI€êb‚[I:BTÝïe0hºþ|É4ø«›ØìúT9\¡¾œgw’¦Î3F{ ‰z§…qìÑ“¿ãÐFì‰ÒBiai+ "mö_ð†µþ¾ÐM—‡:»Øo>l|<†~<½j'Ö ’uÁBÍÞ„§zÀ­¾i_˜@B¾˜mì׉`# Oè2œ!§Âha<Ð/žN/<š×3²wÖô‘£×ùŠÊ±@8—âq¡ŸôÒ-0üjL¡8kr–q¿ÖJFfö„ d1±¹ƒíÇ–÷W,<*PÏÀŸbAÊ!HþSÜ2„´å¶OwªNhŒÉ’ÒÍãsî¾” L¼ÏVfFÑ!o·6z˜tÆnŸŸ/±Ÿ_ËÌ«n^Õ«'Ìk›[ã³èÞHdNÞ&ñSn ä­òË´U„šÙ^ipS*çþ×ED\8Å—“ïzÍÄ0,F>Ü{žºdmuu¿øÅkà£J¹­¿ßàtRiL›q÷rï@åöІåÖ§¬4ÉóÏ‘e½aH2ÑsÝ^öª@Û«HEeܯœ…™vl|T=Á™‡«ž`Q6)XóM ãj¶×íË퉀Ac² (©eÒª '­œ O¥ 6$ŠÂŽ­„sUÁK—žç)`@´ÊO[0÷8 oö޾~© WÖ•d+ÐÅ+.=Q5åŽxä5c®œæ£„·ˆÄa¾¾Ë¤ñ&í*>d(ÖÕm¦° wØ gmÏèž*zFDÓåí…ÿ+ÓøH[N@òç“ íÇOŽSË»"H¸ÐKz—ÓfD%”à]"nëÁþÀÖú¡˜/JÅÛ’Óƒ·tO‰²¥ì©:ýnõÌ,Î3”út!iŸ)Œc¬&î÷ 1†*°ý;ÕÉ   ôõ‹¦P䇘¶Y!“IÃÏ.ü6‰,@‘«?¥+m•!SF©étÞ›™B—&¡éèðäLè )%kº‘–ýž]ŸÍ>’Õ¢¥´ôy^§µÐlfFU¨X,T×GÆ­¤{Eƒòà"ýˆÐ3¡‹Æ;½èú©@—Vö1]ÚrÆ“{ï`Й!aˆí3ÚÖÊùCÌô¦_ê`¡†Ô‘z3~¨iéexKÝ‰Ú 2ƒ"BòEwr`Eë2¯Zq×ßïÅÚI<¬ /\VhÇ€Äu_Ô¥z…²DOÓx½²=5™¶®‘C‰Ë.$Ui¬B0ÊÔIêi¼"8Š&¥¹ ˜^HQ4/ð°z" ú É7ÐÀO^ÍRXŠVÚJ‹odÖ%±dù!Åj¤™¾ØÏ:[C¸b¨­WûQÍ‚r hê8È×/hû'šXLFÆ3$º7dwN^¼v°¹ÇRà}ùpb endstream endobj 2613 0 obj << /Length1 1571 /Length2 2755 /Length3 0 /Length 3741 /Filter /FlateDecode >> stream xÚT 8”m÷/¦¢l½Ù×Ùì©l‘-{YJÆÌ3<3cK–—5$…¬YJ–l% ¡H´ˆ$‘”"{½Sá{HÛûÿ_×÷]s]3sÎùsî߹疖°²UÖ#PÜ@# ™¡ŒVAivvh €BaUP( BZÚbÀ~„ô!F‡(díß4Ç€}†8 ´ S& @c´º6ZC…0(”Ö …¦ â| `¡˜RÈ !m@¡úÓ wÜçÇ_@/ µ´4”VÓ=/áqdÀÇð½àŽx °¥à!áÿG 9ƒªDúúúªà¼è*šû^y%Àbx6 ¤ù€`…2pç®QSAHvý{À–Bdøâh ;H$Óá&™Ò¸;`kbXRAòw°ùw€°6­‚þYn-{¥D^MÆáñ/*Žì‘Ý"DK#s†C À‘ +@‰Nóq>8ˆ„sƒ«GÇFzÖf¸ÆŽ§AT]…‘V8"WÊÀcÞO&P¼¼@2ƒŽX9Ÿ!DñðÜý‘k—ëI¦ø’~XDˆL ®Ð 0©H{2äÍM ×0° ñËç25 ¥‰Å 7úá=+ ìü©àj½â†9P)T€Óƒ "ÿ è8`И`PÀï?-  <pÝ!2âWuØ ¿ÛðýÓ ?ÀË  V>?ÿ…F Iþ¿à«WŒ47tp´±Q\£ü3¨¯Oñ”Ñ€2« ¨aTu-5 èÏ*?ùÿà¾êµÂAkgCýªgB&R­ïàÙý á³¦ ¹µ¥‘þìp«ä~‰ÿJ …‡¿Ðÿó ¬¦üÊ_©ò_Åÿï1I¤Õ¸ÜwÀÿ‰ã¼ ’ÿV3“o†Þò¿¡‡Áïël ¦×¿£& ¼!zdwÒÏABt#È$XA ¼Çªb~\\‘A+ Zyoe4 õ¯¼rxOøM¡Ã—µáú³ã~2žBXY=Œš:€£Ñpþ¬/Œš€†w”ú­J@ª) 8€ÙD ±r¥hX$H7mÅûÝk þfb¤ûOS[+ïø{†€„~AP’´rä_q-éõË„—IùiªªH*, á— nI%1«€Ö>¿™pAßUóYà™4üL¬ÊÔ{õMA?è{FÁï?^^÷O¹ž¨¯ò›GUžÖÙ˜y®Ã£û…}ÞZŸ4ÐaÍaóbŸë5>‹e½ÚúS¸|ÃÓa;ÊÓe(0-V{{ßµ:¢Ûk¥Àέ{¾| ›31cf·o;¹bÉ÷íS56m¾óºÝò;”¼gÞôdŒëÈÔ\ý\ê1Å)[=¡²™íÑéXN!MMìf¶ðz½Œú«úzÝOL¤è³º&Ïî4g¥µt`ÔFZû‹”ÖCÃi¢ïßóPÍæ3ÞïM}׬.bæÚ tK6ïúš(wr¾.IGºnŽI€ÃíÙ¿=ëµï”“Ç¡C·©yNÚôàÅ£ ¼¤™ù¹åQqó_ž~¹HÕÍ45®ª~ÝÎ7/äì¬dcûpÎ×A¹.¿7ÇTqJ<Áásnî‹‹H'…ò‰K׎t³"tøcü„Œ‰MÈÎe>;émHÛ¥jé»'î˜NL™úî¦ӾͯôÏ¥ZKÕ̽TøJ™ëæ1.ÚÝx!ÓWõÌÀLOPñ<­ãØËšS.%ÝÒ5¥<µ'^œ›g¯b4¶Ç¾ã&DzVÚÓØrHbþ¶Êæ~‘ŠZÓ÷ó[¢¦Ø%Ìù«¿dŽ”§;”‰F>àöŽ<ïqÂÛéxÁ¶ì#UÌ«l–Or_Ç{´yÅOA!ÛXó»‰< GÊw¹é¦ÊŽ}Ly¶ôdo¹¤ž”Új=ãm."œx!Ü{SH/>*×vP럶Ó'ÙôÚËݼOðCÜo,fÇ®/Î_>D[xñ†ÉõLÄ<[Ë9”$Z"Ç-O»bž:Íg÷âp~MN1”ìjg‹X—ûä£<2kàÀ7™Þý׌„—"ÇnÛ²•RsÊvûy·¦,|1Íã?ˆ¾ž·’•GwUë^eEY¦ Y­Ô–‘œÐ#â÷Þ赜û{*E$©£!óQfHÛ\-¿¢el²~?{¹ûõk²ˆ­Æüí¯ƒ…]Ílyã™öRãØí\=’Ð!¬’-“õÒ;?šq›–f<<æ?ft;kw7„Ï>8©ÐOBzã ÁÞÜÇN ì@ÏÌHñV ŠÜÓuœƒ4Ï41Û¬]²+ °!¾Û^G‡©Ö§=n Þ]¬ï«Ú ÚèñpmŸ˜ÎtCOÅ; UïN–3^|m? £uŽ’}Æ¢_),1ûâN g¢F"•£Ÿ:HÃmÜãNN›2ÀÔ¸RÂéE €;öÀBö·ügÔ¾VÏŸ'' ²}žnGô; .w"di¸lÏ}áx“Sw“þ’ZŒð9\Ì*«”¼ÄRËç“úÖ7û +ÁD6ï›n|«ôë-ý{ƒÃëó˜ÇÞžUíñ£éJFgàÛ¼G f»ðÕ zÇ¢7Xs`õ.b¶“IÞÛ—2¹MÿéUª¹If_ =a4´IÒO&PÃÑãÜι)¦w(3¥Yb›Úí]'0Z:zW\Fïgå¶€ ®PÓK˜xÏÞzy[úÆ¥ÒÁÙ)âô†Ò¶1 °ù1qŸ$e—üzÛÄ›êÙ´â¹ÛeXŒ$¤ò¯óBªÄÚˆå>§ÃVD-‘ŸSFy#è.O&ØÈmÝ{Ú9êTŠxsgsÚÝ¢<ªHò­uKR]*Ñõš‹6Ç›cÆÂÙA£Wɇ¯ßÏ×èüv¦Qµç«¬XC3™“”Y¹ñ`ÛVYq~5Ê>÷Vç²–!É>,²Hdc\©R2_@è ÛØó]僕O¥¾Ì‹°ìwoMy±ug}ذô‘{,Ôμs“6"k½¢2êÁI«[ÍŠÑbo*w ^ºð·6ÏL¡xŸ–—Ó:ƒv"‡ÇÓ(òÌXU¾²–‹$[S:FbZN¦p/Ë^[u.e“2U~9¦Þ#Ö‚ÑkR9{߉ÐgY»0ÂâäžhÏ36»²ÅÈà©Ðúó2ü®}Úøã>ò¶Ò⣠FåØ6æ§k»0weaŠ•7K¥+ë¼ó Cc+c›ŒnÚŒÍDrš± Ì…Œ‡ìí¥žQÃÙ%†˜Ö¬È¼©Œ·Ku³=áŸ6Ì휌20o0>ä¯z£åÊs¥´œáìFþ”6œ•ÑŸçŽ0,8ûíŠ]dí›à/Uîêîû|upRö—eÝô£—kÜÕsXÏ—¸áNröá²Aü͞‡‹ÅKÚÄŠã|Ÿ|d/©¾íïS'%ž_Ö%p¾§Úð”‚êÉHæ1ŸŒ°Àí÷C²›Šõq³3ȼU"˯mµù|ÓÃS0⸠‘×¥q¸Ï½\_éЕKÎ7žïû 'm×O¸3ÿÎèN…ãy_Áæ–ÜK+Vö=¾¿ûtnÆá®Øxl¾Yéô |XÚ‹5² ³wÔœt.­þ [J÷GµHÑByV£¿|‘C ÑêèøðAzÑ{ŒN«Š‘u¾R®gë:yÍ?iúþ•®À¢³m™v2¹MÌ2PG¶Þ¼±pÕ¿Î>$Yϯ¬u.¿ÐXÆ><ýNñêÑ`ûû·cíý4Ò4îœ>T?˜Æƒ±/¯ÚpÈÝU£šRžeöz[6Ïs,ܘšjoܓקÁ“Xµ›f’™ ìr‡kxòÉèöäEÛd¬Î¥ÁÚ”(Z…›’›´Ïø(ûG0Iéä“°¿NèŠÏrö¤W<ùÊv¥£zgG”̦e‰ãµÿtŠÄBFß¶ß`” Ñ’ëã·äëçX잦t•„%h}ÈÚ°îtÉh¥µ©VÒþŽîã‹cotõhÓû¸¶§ÉOÞ ^&ÄM¦·$}8ÓRCªš&6ŸÈæSmâÈY6´øÔ6:a¦{‰ä{þÏ|–¼h?sË^aL@³ï%Oä.Uj:·q¸pÛ­ŽéFZMP ÿGª™W^¼„ÿæÂéi[±ÜþfÃGÉ[\Ñ}É»xxT¥š1oór§5 Õ¾å)ÓH´s´”'úñÖS‡fOñ2Aú—Kü–f®ÇT£ÅËMu\Éy^1âK£±ÇoI\IΠR &¾(eõM:Ч¾ù*z»B%¥Ê¹ØÐÊ€º?»+.§Éz°¯í· ýA4^´ endstream endobj 2615 0 obj << /Length1 2635 /Length2 16626 /Length3 0 /Length 18139 /Filter /FlateDecode >> stream xÚŒöPèÖŠâî\ î.ÁÝ!¸KãîÜÝÝ-8‚ww÷à®áöÌ™3Éùß«º·¨‚^ÛÖÖ¯¡$URe6µ7JØÛ¹0°02óDå?~ä03³123³"PR~´t±þ#F T:9[ÚÛñþa ê4rÉÄŒ\@vòövW €…“—…‹—™ÀÊÌÌó_C{'^€˜‘›¥)@ž cotF µwðt²4·pÑü÷#€Ú„ÀÂÃÃEÿ·;@Øèdibd7r±Ú‚MŒlªö&–@Ïÿ AÍoáââÀËÄäîîÎhdëÌhïdþ†ànébP:Ü€¦€¿ (ÙÿS#%ࣅ¥óäªöf.îFN@H`ci´sy¸Ú™ r€ª´@Ñh÷c¹ÿÐþé €…‘åßpÿxÿÈÒîog#{[#;OK;s€™¥  (!ÇèâáB0²3ýËÐÈÆÙäoäfdicd 2ø;s#€„°2ÀTà?å9›8Y:¸83:[ÚüU"Ó_a@]·3µ·µÚ¹8#ü•Ÿ˜¥ÐÔvO¦ÿLÖÚÎÞÝÎû`figjöW¦®Ljv–Ž®@i±L@"„ß2s  €ƒ™™™›t=L,˜þ ÿÑÓø·òo1¨_o{€¨ ¯¥ôÁÛÙÈ pqrúzÿ©ø_„ÀÂ0µ4qÍ-í~G‰fÿÁ á;Yzt˜A»Ç`þëçßOz õ2µ·³ñümþ÷|™T¤…µ%¥éþSñ¿:{€7'€• ÀÁÎ àäáøþoËÿoéK•Œ,ÿIùw.xmT}duîÆ£ÀÓÆ%‚¼ÅŸ¡ò9J•ÁYò./ÞXÊe¦a[¶ë)¼1Õ¿c*!ee\¢ó»*5žãúPx ² úe æ q›¾CiÏÑ|ɦÐò<1 ¥ToÂóC>Yë´>ù´\C×Ýaý(¢p)«R޹ãùI ©¥n®Å–G1ŸÝK“f+ÕzÍ'û† „çêN#韆à%¥ÂŒc˜=!ö€ÙÀJÓœ ½•³ÏBÎi¤}kKi|]]t/Û?&åòYŸhÔ´¶%¹=³ …ìtxö…$jAâ&Éâ´Õ/’ ·ïFaM«ÚÕŠæx¦îVKÈÓõ¸I‘ÓT}™ŒÒÊÚ‹±+ɆïHfÙ¹ÅÕù‘?d(ðeãƒÍ]ß¿ëÐá#H"-!+¶6ˆš ¥S™™3ÆYHŸ1¸†Cqõ(ŸS—·8›—£`S‚H_;Çš]ñlGáȮ¢ï²'›æz~ØF s.^ÌU¯ þ6w\fÒþ³b˜;ƉÂP¢{n³Œ©>çÉéîæü[ÈÆC¯ž¯Èí5ä¾´.…_šÀ|Baã‰ÿTxPsal:öÊÖÃpöpéÞIjCO½rw£*-”Ü¤çžæ¨9m)¹Ÿ„)–ç²›c›G/•ƺ?ÎÔá¬I„¬Îìqgõ“ÕM5BÐúO䆭٠V-éóP݉p¼‹ 'ãÆ&s…~ÓæÄÖ¸PÌŸ2õ‹´Sõ&Ë©¢ÙØÌ£²œ¸Û²ÞCuÇ:ˆDgKûC£DðúÅ9VI lF¸òoèã‚]J‹ LÑÎÈL3Vk»‡Îšü€b @_ä&8Óª_ddA³’vŽák-¹ìo½7œTÑŸ÷$Uf‡ólÝFÙGú:Dåçw©l.0WâfÓ TpÑò¹®p¼§axØ/ éiãŽà¡çV܆ SDõÔ…nÏcÖ¼j©üÍ¡±w`sÆÖVyÞÉÛ*~LrMw¢[ C̵ž×ùø(¬:#xÈ“ët¯ö[\ŽÊûý°í!ÓÓÞ&NÙL—Æg‘^f®ãž·-›ƒ°¸ ²¯«~¹g컄¢ª–¹êFÔi^)©Qf^¤ä¯¥!nڮ߶À´ÈÔûÔÄGòžÜ«^nÀ Á„Ú?ÁìŽ!°¿®Xöž¤éÒUNÐÆ»ê•RßJ;ù4¿‰8§DYÝt?¬"€K£:MÝ\?qîô­Á ¿ë\`­â!à›GÄÖñD¡E°U#-÷… âˆ}îÁO| €7¡DªoYÎX󬕸ì}’|Žƒ>«ãpËÈHýü!Pý`€­Ü6ã­†§'ð2G@á4œn×f1®Çn)Œ„Í<¿œœkwT9·G¨IÉo–áÌUh®^ìB]—ÀYõs"ß/>„ ™šª)äš÷qiàWmž‚ã¿âôEGn1®¥‘¿RÄKIjå»Ìâ#áë®áÈe[Q¾šUeOBz Ÿ©ÂdÁ®F;m¬w–c1ÿâȵá«ÛëóÏ—Ÿ‘þ`=n"C€·Üü×~S!¢Ï;úNѧ˕QÿûŒú¡ë5~¶»±áÙ OLJ†â‡M8S™¤ºþKæó›kÍøÒË"‡»<(I—ëmLbè×#}ÊåÒ+C¢÷·Ì? AI{Ó„pZ à=AŒ»G.Ãt”t­FÀµ p…â= §¿vÂL­a<®òz?•b}F½Ík ´‘jü–As•vȧXcV\h«iGù…8}l+ Y)¢ÃÒò×òˆž&Jʹȳ‡7~:ÑP•¡xgøfM§Ëö¡×"ݘgHñ@? k×…~=:ê×è;Tú|‡%ŠB!ªWâ‹þrv)?vŒÑ2\å"Û™ü…YÓ½•X¢õ#JÓàÙ=¾®^G½>9÷æ}èàN Ø™è¼øùG®{à×x7Û:}bGº|~ÍÛuCwü9æ8âˆi ½9ˆ:=Ï] €ëÚNó˛û*\"„N²O‘%ëä ’2&'`ð9wÄZ¹ö1¾p]Â饓˜Ïs;e°c4§q¯æâÃ&*¦iæ`m‡×yôhYEö>˜®{:Uß±îæ•¥LÞQ8צnC©\Ä<FK›`­fOKæ³@WRÁ2“v0\ϼy¥4üYêoÛ^p€›’Ím;QóÐÚ+>½a4â<<œåç%eO ‚€`ínYí“¢b·;àüúÚõ˜ Ëð‘ÓZ×§|Vÿ;¹f¬m±å‹LCGðf·ð ÒyHÕ\ðûj˜¼v€òÿÖ ãÄXOx~ò—–…¶Šê¯¤—†rËŒ×R³ï;©.->]gÚ Ô>´Wš‰ââà_6<¸÷,•Êàx;vžàw™,jõP§áP[Í«Zóè>i%n\GÚv>aæR¬§Zû­é•,z ˆa®9‚ÊrHEôôë“r†,îNð¤`ú$Gº;½ƒe_×âŒG)jŒR‘¾n-WðtÂéø`ò`é¶ùÙkèí¥åû 8ð)I)r!À"¢«7ƒuh~;”¢P-$?´|ÝP½±¨lC¬r‚XnTÉÀøŽ©!úþG¶9ŠˆÒ·º1`¸%Ò;ñ±ÈÃiWKO·!‡´ÉHˆð9ý˜0TzÝQæ·ÍÇ=ÊK+ÁŸ[KÂÈ*AÑÇBŸ|Êe»•ÑØ…™ÂÑ®üë4v&sRrÎ3g`è§m`iïI3ð-Ää+Õúaâ%['%J_jí~w"©DQ”¯ç˜@sz«$ 3…Ì3ŸØ™ö÷ ÷ ¦¿_Ã>/Ì”²ï nÎÔ$#{œCÑ˵¡ BÆØ^rë`Ôúà€‘_o¬ö,«ê1Âʵ*ðòóì,’„H–uðæ{„ÒC@$£Yÿð§›=—¼sE\/6•gÔȃ•fí ´´„$ªÙÝ ±_÷>uÂÊ[’¢R^Ý÷‘-†F13A»¬­wÞöù ]¡¦©b™_[·Ú“ù€¡5Ì,zê“p¬&åÅÙ±_ 3óC“DûeX0˜òfäj5~!§k™X4GLÃAÁßöùš”q¯‚ˉú”טQ~Óª$áaŒN¸j̺ÆÍoF4LÓù. ô)ÍÜ]H³Óû’ç{‚‰/‡eÜéQ~ÿ0þt¹ŠáKߣ _Lú‰öSãu1|Rº[ºËþ4Wèý5ŽžbsQ/I½ ÔC¥Ö×0ÌИ³ÛTÕlÕù Ž…\º(±ßÀê[lP9k÷Õj´Ú.>¿¯.4(t „‚½¨{ÑÓçµf àwA³Í6¸¹Bèþ Š‹K³&Í ­9´Ëyºe RH ÃÁt›ñçðb³Ý^μb¼-¯ýR•‡×h€qí×u<-iv †#yV‘ÄžH_Ru"PÊñü@Y°Úª·'ž#if7²æï5¨BØxõ”'ÇDò¾Àǘݼû}?ÕQ_F`4+黂{Ô‹êÔP€àwOƒT©ÇO‘}YËêÚTLÀÿêÆµ¤ „éS(<ü"‰o]<ŽÈ«¤U=83G¬ÈWÞÞ!¢’MHSýÙ¾êXý¤®ïRõ×`:ŸÑ€21K´«s¸l?%‘ʈ¸9_‚wÛ­uåÁé=¿å»1ý؈nn¡Íö ­»æ…êeüË•j—!*M­+†öj.ÚJ‚+æ $šqñ.¢]î|æFd,ýz:f_lá·´cŠÇ¥cͱãœÝ·?ÆPU~.Õoy¥ ‘ªÆ u©"}ç,lAöëå¸_ú*˜¿\“ß85ý¼ÓÓ »e¾GBèÄHó5Ŧñ® eØÃ ‡X0\¹Zc†56“Ú¦|÷™(ò`Æ'@qɘA"õpF1•°F%GIì]2ÿ|ý®Ø³â¶tK–žXoM¯4‰Ó~Æpa7Êmì´¡ÛêºbÃÅí‰ seƒQi„ïï íž•jÛÛš+ ¨ÓÍ—% d©lûÛ\Z¼z_ª À+ì— Ù˼؋b¸àX¬/LQSâÝËu=µó¹!‘=u32U¾BnÍž]NÙ€ Íû¯e…\¯ô65R@•×^NGô½oöžŒ·ü‚é'kc5³¯.òãç$/µÆOLš,Hª{Ž-¿,¨¸\¯+¡$oÔËà„ æ{Øúå_¿ïøõê‡d¹@0‡5@@HRñ ?Ï/¥øÎâ^>Xl6õEí=1›¬ÌÖÆ¥|@ ûz“`ÏÞA³å­,’\¥©C¾)Ú/Ífô xΤà™×¦¦‰NW|жhv”@ ¦¤£û¼ Ô¶'¬Ùf„ïcY •šŒ$eWMbÝJߌ8'ˆ˜ càÉ¦Þ m2ñàëƒm䂃ÒÿƒÍùÅ-Q¨`Ó]|¶ªrx )«°‡)SüŒ‹N…À°ižŽ«÷#ÑÝ*ð¹o^±‰6„az”Æ%P¯æ9ë$\’p4.ßët¶Õ#f :—ù )ê—†¥FÏ#A¸FV¾¸΄٢" „kæ[´”¿¦}p®ïâ â°¨Þ(ˆžmS˜,?P"E ŽcÝRô–Ò,‡aœUÜxQ/æ ¤< ©Bpí¸¤Ä£x{d#§¬Rœñ’k_Yv²Œ†UØd#z"÷}Õ÷Q~Î-¨“› 7é¢Â›–²K¤Y‡ƒŸ*}ö±âöán wûþDÉ’~h“Ÿº+JÑX¸¤E¥cЮ:Ý¢7ݬð4+(·u›ÏÒsÿÅED`¸Š`߸Œ§—©!U…Qw¾­¹á‹ó^IÁ°MÕUÄ ›‚>çb!eNîn~ïºYàÉÕö ³-:Úü>|ªM@bøGE;¼"Î%y2ͱ ]»Çoûb±fÌ£¶Î<‚Dý¹™™q¶vR†»Â!ÂKè¶³™mx‹ëÕIF‰…©`GÑ?¬ÌìÆÕ–×2¢ûDs³ZŠ\š™¢×û:À®ÜÖÖ—¶V• Å)”ô VBMÜê[îÊÈP?æ‰ê~uù”w ”ºÏ°øpaܤ‰Pν}=2 $)ÂѨŽ!3íÞá„S†•6ê¸ŸÍ EgÜáïTͱÌ~ìIÃ\È Á\ kÊE§œ€Ò2äƒK‹¬á “µ—SmOSX N¼³P²Ø»\ýª’ËÐ\ÓŠ¯zu||Ø.pUº¿P¬Êý EIZ‘F?:…\é6¥€CØ ù `8B&ktØË±HÒK‹gêÞ{¬A©eÑé‡ÃËÔø¡F»œ8/Ñã­@žï={î;*Èåù`Ž€™n§ÚRˆ´mè¢]J†D‹‡}¤,J%ë ãj3:/ÓœéƒÆ¹a¹Iá.¾(¡in>Ù¹Eå6:,e ]YJóehCNw‡6¶ž Z¹×|D³Ì5S~:‘¬‚Ò þ3Q¼Üdp1»ÛzkIïÊg7ÿ¾ví¡[Rh„ý…ñÏ[ZBr‘XÞŸÆÝ¶Úè`£&hµ°“Æè-õà~0éËÑìG6F%Øzn±à \‡‡Éž4aÆ"gÔúy[6¹xÏÚ­ ¾ cm0ŧoÚëÈšDŸv ÿá’°õeä>ùŽá›ÄzHu)Fd1L¸„ ¢¼g¤Ùà„ ü‘¿Aaà­Qzj41Aë2D>ÇBÛÞ\GJo4i{UD‘i2+JÔîdŠåS¹;ÙŸ£™ÆYlš>\Í.3º¹}ðE­‘ÆuÛ‰-ãËD¡ÈZ7“‰P®7o—)™¿ðS3®ÛÔƒž’¯(ì%-¬µÇ(ßMµ?çzè,ŠÇHeÛ²¾&ëŒ\´¹^AâÁuȸºmms5x©¼…Çý^žÕõ´wÁÁU ùsá´þbÎð+|ñ|â˜Ïy}õ™©õð>~×SÁäz[Œ”ÿ|2¤ã”Ì{÷*‘E.5eþiŸrÍ7 ëóK¶LæoZ“jt³ei¯™Ò'ПÑjZà2¾™Ç7ðhßñ3»í‰$4ßkÈ ¤}ÚSNÐ3âAãŸêVçg¨–ëûlú9u“õëO/QÙ`æûÇ9Ÿ˜[¾Í( |%éÆ@?¾ušƒÚØê€áÍò‚;ÉQϵ\‡iöfgöIÛ4U#æ^ýÝ;°g µklEÕ>…6>-#¿$,Æ¥ðÙøw›@ñé ”UÜc ?Ýq¤PuX €'øØ {‰@bbt”Ÿ@$>àLCýY]:vÒg8¡,†#·šñf¢! Îzt„]:)’J"W¼#[}bÚ‹í‡)ÌLS›{YZÔ0—L£YJ‡ÆÊ¹ˆÊþ ׫âad¾“Ùa:n•¿Ê½ày~§[Åš äækãï'¦Ø: 5÷ä›®Uf“Ë"_º/V5ÕÊéCŠûÌû ºÓ.†Êè-×\•¼,¬Ìwð-)•£ìOc9|oa:½Ýð~x…®úœ%êã©O†Ç„’rbÇ"(ÿ”>–«ll |1¥ŽUØøä¤Þ7ÓÝ¢YdÊNŸÑpîce³gÇò1³j3”C®°‚%Ö(ïÖµ/THCç¢XÃ÷ùBôõ-Dzw‰a ÍœÛ,äP·ŸÄ—íîZ£Þ·  02‹z-°ÖŠPOfTc.'ŽtÃEµn½;jU”͙˲!¶ÜðŽcDŽÍ9Å˱pã½ímˆP!°N½Þ¶,ëG S˜·a³1hA¸ šNèÖî7QH¡Ï3‘gḛ̈ÔõÒ0Uy¾àšàÇs]¨¨Ä<Ðú¡{2DZû_ØIªÐÙíÌœÃA}ìpgBöŽÝ!™ÂÞ*m·ö,?ñf*爌?X0Ö 6@¤ù¦«¿ùVÁ™¾!×yCHsyƒÝ>“JýV}e.*ÞðCp ü›®'Dá%Ï=‰ÿÆu­ÝWBBëˆS5h>¾¡†v¡Ä&öÏùØ0[©ÜÝ9-'mœwøþÔ»„h‘ñ„Ä+†[5†FSÜkê´Ý‹&•&­tÃСœ &w,'_oœZoq¡ f» BwÒyòs³(íYêdËN)‰©_ayÃ˾¹Œ™aMê› ­Aä"YµÆZX,D’~§xBÎÀž¬h켦-)‚¾¥(¶JÓ°L[lˆ 6žÐ†g;S,,DjE\§f¢f™£)ÿG;2·RA$£ñ¥,¹°„EÛÀ’o§*©ékéÇ1âÞ^¨ï’Ë tKú]DVjE&ƒ‚5ˆRm¾Ôøú+¿¡†JªEb’ö*Hr4e’”×-r,YÍÄH©Xë—Ê–jJ›²t|²ð>Úº©ÅL7éÐê3ºß‘*Õ46%w°g¶Ê zÇ'fºfg&Õu¶¬Ù9öÐa¹I1Õÿ|ÒKf»=)¶jÏëa!–âìÞ$¬ôs­;·Ô­Èâ '‡3ù(Áò¦¨Ñn[–ù-¾‰(ç™S@EõS›Ð‚ávùq&@´„¦‹«äÄÊçÛbjDâänkÞÙl´Óý×KŒƒöun6åð¯‰å—V¼«úÑÒ“ÍŽ˜™ËÑl Ô'WÎÞàgÞ/èݧ•¡ç“]ÚquP O%-²Dú=|¢¢*æ^r'JHôÚ?EÓT­…†›=¯úC9¶Y’Ìý¾â7ĘOµ/Ü(œö ¼Gkéž¶ÇDZèÜ–QPï^V ß®1€YolX²ð‰’þ\:e®}2FŸMÃOå]l;@ sáÆ­%tš`ÑãgÛ÷øO×ò`h~~z É{~7ÜŽ¤÷‰óéʉ‰ßu9('N0®Ñ¿K›éqäËc`\5[`¾k7H>²”P`úp^ÇÙvº˜µÌ|ÍgÑHâç²§ ÿ(3xÚüƒÎjwª‚ h—?(KÔýõFÓJ§íÚ¬ZÿµZÿØ €ß×I­¼í:=¨† ó}xY£ùfü£ywÓ„Œ­è¾HâÙxx•6¹ mOÝ i–ÏԲθŠƒj;ÊÅ@tzõÕ|Ëg¼',VØ…iV³ïâ×/MÑñÙÅÊ÷Ãᢲ¯n3ÒaiWÖLž‘ò·cØ)¥ÜÂï 4Þjz¹/S-³O?ïÉ“² ýjúŒÅiv1Cù‘~–/üSîy)ÆXÊšLbÔé¯Ï|Å›¸äÆèzKöô˜ Z}©ÂMK´[×HÆ}–žŠ9–]¡$gëš{ÝíÊèuA;^%W¨UÞ«è©æUIJÃi—ÒÛÑGŠVIÓ?$b ük•}F´ÅŠæ›…’Gêá^“˜mVWœÐÐ5Q_ª²¸ŸØé„çãÕ:ÃÆ¡½K‘ ü¼¡0 (h¨òùŸ¾÷èZÖÚK—ê ˜põã&[qâùØjÒÚ6­ .ƒ„p”>r ýr¡¥Ë†Ãõu»]áxϓРZ…–½ùV]Xá1…8ëèô]7zþÏÔÏŽ¾tòZ(ŠÙî}_û⟢ÛÈdrWk›;¼;\T0 ŸN­ƒ«Éâ—õè‰H¨Á×—„BáËzätã¬ÇÉvÛª°—©û¬î‰ù g!ô`› ‘™xê²ß—‰hê~ϧOè–ÙJÞ—YsVL&ŸZ]¹S>©œøÎyëŽ ¨d‰: Xû±q­úK]+Ê׊ç”`/’>ëá­w*“<‘|ü6Pųr}}Anu*È”ÈDýÌ*CÝOA“¥ì¤,}›.s·2ÉC«fLO€¤•œËŒÏÚomË;F»’ìÂ}{ †…Bc3Gÿ¹u4AãüÝÙ[CÒ£€ʧè•RÚÃôqé%S¬îûʃAÓòÌñ›XÇlsÒªm´¸£¡7Ÿ«Øz¨Éjiém Ý88cIB&¨`L{Cœn¿¯jò¸åd‡7 ‘R3¸K‡îc/Tª;0d(Ï%Îh;"|Þ•º—ïÒÀ¶ûT£*©lXqäŠ8 ÒÿãÆLžGý‹W©Ï›ñ18Ñ’ 0Ž>÷óðKFEåb0»˜ßœ…Šñ6Sˆ¬^l­UAÒÙlq“Ã!bì„Ûãž—u°Ð½¡’Œˆ9·W_D8ã™KlTl@Ñ!Ûñ‰¾; Se¸aÔƒÉgÇl€3êé·}ôý¬Þ·ëà’p­"r%Ã8'{æ“V”g_ùÂÞÚè’ª0Òå»ã†Ôª ÁŸîWxEÊŠÕ?¦K7½ûÀ¶ªDô¡ªvÃ&ÍËìDì#öI•`@Þh‹ùƒ Æ~>òÑZïPt~Úõå^ÜdþDBïÃù)€ÒÅÎé¢Þ°KåU.ž¶¾ 7¦a{€®$ŽZ`3šÐñFFð@ns¤cš6îç© GÄnÜIݲnùJ³Òw{ 1;2˜OöŒYô:¸d;îŸ_âÚ/Žâ!°– òs—Œ²M±£   vÞÞÕÆx=Ë”d»tJ}õ¬K«{qµÉÓ·*ŸMq-ÖÇÌØ‹OÀ3—Ù-#56Xa3MˆÜßÂnõõÏÔ>ƒ÷70ÐÏ„´^ª:MW6YÔƒa¨=¿²d¼½ý|g¨ëcÅ&Ê_~íÐÀÔþ¢ã“?( Îü¸ÍíÉxIr:þ–í‘Z¦qº„Èl¡Bå(²Þ›0ŠTä"ª­ï_È q*:¾î[;,šzìñÒÄèg~>yRlEû›·Šù }^„UêW,(sFI6#‰/ùÎçô¾"±DXà’aÖv^˳­Ç$ ?ö©lÍ{ŽõÀ-Ñ¢%ÞøýäàØá×ÄË8K²¦RžŒ|÷$ ¾ÓæŸE"¸×'B'WSüûŠ?|r|­¶Y|Bƒ¥Ï—=‹ÕÜ A6&ÃÂ:gÃ7 ÿa¼Fa¦ 6‹è¼8-ïFÿXùÚi.ýÉw[ÿ‘–|kˆ€é]¥þܳ¬q:ãji°ª[Ÿ½ü„Nt°<ž^«@ûÝ{ ês8¤\(‡|À¯¯4Î]‹|²Ë M~³=O%¦þh£ p ›ÍÉçL•]PA˜Å÷G*lÛšÉØqþǦ’e¹ŸsS=3GX•éR|Ëúü(N”ÜâÃZ %h&5ð–Ç÷.FÒúáŸÊbªÆJ¨Œ;S–Í?ͳ>À§®:¬ÜÝÓ,el8§±-¸1&Ù=¢ªÆƒ¾TÓua]¯díPÑä:rº±Háâ7I ù>øà ÚFˆŽ|ôåí'9e›Ù£›úþè„Æ½(ˆ,ÄÂïeƒV=°ä75†Žñp2 }Çð,ìÑ"l$…ÁÏ"C¡.¦0l½îõ³`ª ˜zlŸH¬å-L*M¡? yp Û¬Eåè‚e®®—,íWÝ·Ýî…oßú <…6Uä‹?ËfD¶r¨S‚ÙÌܸ@î-ÓzwØït&#SX½¯-ŠIÕ¤-l ¨'x>EÇ:ˆ$£¢×ø ¾vgÝ kI,˦ËùÖ|#ÝÌ4Q°˜ !“gùëˆ8rtG&Ttâãú…fŽ¡<ƒ^¤ð5…Vì­kwtCQkLá] ËSøà’h&å¾B^¡PõI´ U$7ð{A—þн£v(Ž^&¬ÏxOÏ=ÙÆ¸èSfÞŽäD¼†Aø—ˆOY•Ð_wæié©×:ÎØ¡8Ç&ÐC!×$0)ï0б‰ØD¢#+Â[­œÒ0ãå šªjðP‘ÈѬ¢ÐÕLuåãÄŒvoÓŽ âSÈ7•d)ˆå¯F5 ã¨Fû˜Ç,u-îïT 3r¶–& ø¿¿zb 6üèçéqÛJ«\‘qŒu÷zBbþJ“ÆD­Ð%בfÆ$Ž‹úP½rñk®N«¾œÉ¦’DP€‹0 •e”<šwkåÐ2yH.®½YÏwËì*×püL¾ŒdðÅVÞz±fýÍ÷-A/·=7‚ƒX·ýLù$ªšCô¦Rvfš@öLÏ=‘ aÁ×LþYJŠo‰a;®l£!Íë"FŠñ|ë½ÀDÀt• SêùA#·Ïà÷Hyþ²‚Ÿ2kz¸"*¸ß Œhuòíwù¨BS¯ŽÜ¢É)s=½Qn#®Ö¤JøX)È%x bÎØñ ä×ÔÞ«ÖY½2‘ Ãñ2Zíe"ÊWo[òw f$û¼²Î3 °K¼_Éàæ8ˆm"?µ×a£Úßô_ì@ !þrué}èv‹?p_h¨_‚s룯-!"å 'Iñ»µ”’u,pê-ø”ëu7™ú^H—¶9ŒuUÚ:$¯!ŒáT€—öå€X%·îöiáÖåÓÂ÷0™{ð Î~“ú’Æ^·rÍ! Dýê²5³˜âœ(`‰¬ì`!uô¨³V"|(°P[½~ò>¨ãhCsW»‘ȵ{÷îÿ~ÇÍsÏRâ“VÕ¶è}´æ!Ÿàr ¢k-¢õ¹Ô«쳦¸h÷Gÿ›0’VÞŸ¡|0«vî8àÄt±»\«ÐŒR ,—:Eú Âû ü=6j.’>ãÀø`‡orï¤ð¨s™ÛHŸ|±_lA®£†¡OBcó¹m5¬b›wI.‹ºÑ‰§éf~V;ÿ4‚>é2Êí]ÀÖ+r? DuïDØÆö¨ÉÈ]hþƒ!ù.oª‹\êÑ<Ÿjò¸'x¡ñLÎX-AjÑ“ÅÆ9f߀or½—u ¾«§'4ƒ…y§‡Aá”@GA·¥“ý ‹¶±ùÍ‹m(œêÅPн§ËÖÜâU ™C¾ E¦¿ÊYšyÊ œŒ“ìƒøBW @Úž°-1l%N§î”ÉÚ#éª639S¤âteíZ+wQÕbúֆϸּNÀˆ<-%˜ñ~·)ɨÅ0b^ñæqR¥˜¨Ó‚z{ºë{» úB¤¥ªM¸$ýrÓ|Ò‘ôã0àLF*· ŸÄÔ~ ýJÇE÷`Bö ½S’γçu‘¸OµñÍRâ4&C¶b ›ýY4Òÿó¸Õ°…Ã÷F_Eò!ë ç “ú|‚p£—jŸ•]¡¹†.n†@N«sÖþ©„|뎯± Ý`€œ¶ÇÍ·'®(›‚\âÅë¡…ó 2Ž@vAçþD•{ZžÆ±tðSb.[™˜œ(4½'gáÅ5—7iŒ·Õ/g‘.~ÿå'ddžg>Y9è¥_(Ç;½å¡ø+üÝOè¾s¾(îÎF©\à<ÕJÎ-ò-‚§sËÅàf~â-°ÖBÕ¼?x9B]ÈðŠZÀ®Éo3Ø¥5T1µîlŠ_øŠ¸Àþt †òc.£÷úWúëJ¦"W&Ýäs]RÝž8±ü]ýèùjÈ)Âå⨠O¹0œ >OŸùØÁHÛ,ï£K…ë^¶Eç²éëZ$~¢º5¡&¯à÷zZ–Ûè°vë-¸ÉvNŒm‹ÙédÖ£a!fû³×_t]‡€õÜI[|80²4â+Ïe 5ħ­Åý9Mñ&ÁW0\m6»ŠçQ «ômîR&[dÅže¨ut×`ÿ¼ Ï)RYiz9Äï®~â‹lµ ½ÚM¯ÁFÏbf MààX"›ÞZËB®€§Q%öügÁX≤†<¼¼ëâ˜ðξµ–ûl-ÕÊ'îÈ/<}¸{x~v—zLר˜ˆañ)!¦0l±[ss“´š —'W6NnÙ|djlmX*$âYlñLjšÌÕKÁÚú–Ï[’Œõv0ÏR¨!¯¬_ Úd9s j8Î~ôˆHuc¾GõlF/-¶8QFÆFa SÈÌ`6ÅÖè¹5á†þ°ù1R_Ð-½¨mdüeä×7#gþ9-5Bì þ4἟Wµs¸hvê+VH͹E±Qrp4\7¢)ð{ÙAƒ ±þiw;Û7ÊYî©Î·Z\Ø÷È™·Q-£åöCfƒåßëÒ X½ºŸS7<“{¥33ZJ:‡Dîõ"ƒOˆ˜á›¥FNšK^ç™i HðD€·qâT…˜áÒ"¥ îD{RèôfPŠ §¤³áçìeëõv ûFùUÔd¿¨fej}TûsXcè$¯ZÒ¶ÖØˆñxñG)Ì•N:è(ˆLý„¹nÍ7=ž:u~„sr ïIEï&íâÉEêô~zúøõ ŽáÃéç'û2Ü—Ó§¯EŠÊ¶3LQ̬©PæVµš-óÙgy …òR/0»×S[!¹õÉIBÌqq\^ïÜ=økõ ·ÝÈ*4ùÕÖU½I„ëò¢ÄFGEÕúÝLè}•†žÓ/ö÷D´sbchHà:öR6æk° ´…Îu{!&óÞ½ŠÔ hÝ×<£Ü,~5>½A:ndß³m¸ýaêì/å[ žžR>­òÙ”O2ž¼G;IS¶CΙÐ1x#~KTó‘B½ Ç]wîêgp¢<_r·" Êó1z©D7&GGfñ)O-½YKï„JõN^Ö¹ðÎGûoCzVÌCŸ×¯fö[PÍÇÓ’`Ó»T€ë£Âé{LžI¦×§kõ ÅA–‰ÕZšØ§ÞB”ÙSiøw#íµPh–Íj­ùæºdâ\I0¡æÕb_n° —ë‚ÓOo;yvÓ$h:#ñ0„ååv¾Ø3´k^&Ö›·iÙê¡Ë&qÃsò¯Q¡$h·éßwŒ Aô²^g{ø?”¸ßøÿ,ÞX”ç½P¹œPnTíàÌ’ÓÛa „{ ƒQ¨ÓÇ{„*??äŸ= ftC?ì”;ÕOÊ27[°¯jjæ EFsKý–¸±Î+­^ 8òÏ×B¡½œŒ\qÕ˜2æÅÀ™”àg±Àð4[Ë0µöäŠY_õ*B8Ñæ,Ðó`Ãűz–ŕܖöµó…ïò žmòÂõem‚&–=>€Šù°Â=NTû¥3Mº/ÿVW?~w^7Ÿ¥ÝŸ2ÔWÔlê/nƒ"&kxñ .¿¢¤͈”|oiÿ#¤„´FxlݵÂãÙùÃ%m‘„ì¼¢‚Úù%Œ˜¹"“|…aµ ²A·‘ ŸÈ﫦÷Ò3·ô¶¡ˆaâ ›ämàÌM‰†BËQwôõüÞZä“$ÔÉÃÅ1Ö¯”XÑÈîÕfBÙx0@Àý¢X団wxíá/@0„‹®éØDÔí/ÌÆµ%wØ“%©Äs P:¯y ¶r^ü²dDÑF€|*L}˧˜ŽUÊ\ 6#)(ó\`©‘â:Ü XÔc«B?—í‹øåõÿ òúšë/taXÅ{M |ð>¾ !š_’"‘šOˆÞ•²Ï³‰³å^ª‘ŽÑÂçK2ö¡‡ÑküѪÜ'cœiàóÑÜ(`T˜üB°Ÿs<Ìø‡;W§ïxWOª:F ´ý &†û×iIBë+ºL²6¢s¬ÙQ9œ[¡ÛýèuÌÒPIB$-×j„i~Õ„‡e;óAØÁà‚Cñæ«Há3wƒlqÔ›+vÂÁ˜* ê°›qöÀÇà4Øw®¦!|âVÚ“—ËøðóZâØ¦¯gwë$ —Oe`í ƒžö×w\-·ÚSS>$åCSÝ©}à ÇF!ô`!‘õ©z~ƒj‘êr"DQìeŽçx-/>9(ÁJs"å"Œ_†6h¬ÞB±ÖHh‹«¹iÛñ<“Q ,î³@{îÞKNtJ!ÇqF.RuÙ™Aâ¥ËÀ¦&±Fav-¹>ˆ&y€Á_.ïÈ1äTøÐîοv§›½V„·€#Ø"ñêÄJÍFZo\«í4V3TP°=½Š®!ìeûG¤?¯ìÈ‹1aÝÀ.À[ó·*³”µ¬ÒA‰zòºéü €ÁGÍCäcKq¹¶¤Ê™Tuv…C’gØ\ö ÒÕ·ZEy«ÕÍ}`q°p‹˜.ÚC¯uöê·Ó§{gÙ28huœZÅqæiÂ/‰}ºnA.UIŠ Ù^˜+1}‹©?ç¥-Ð%wB ͈»ÌÚé9æAWÇŠ£‰¨5Y]“k®¯ÀhfÅ£V™útén…ƒçëÜL-ghI0Àeãð¨Ÿ`½ÞÌ«E÷¡îµžÃ¯=#Ÿ÷,ËùœZ7iÀæ®6íÌb†ß›xµ‰©ï³(­5Ãâ|¿ðAÔÖ¡µy¥Ÿà¸õ}\–øÿ_˜§×ÞÍ™‡vÊ<¡x¿-ðWœ†`9I9m—Q³SDZì=ñ̸™rÖDê#ê¬ÎrN‘\¯D¡?yÀNªâH‘iÐàóÿ×Î]p7ÿû๾ïV‰;iÈOŠ˜Â W°}¿ k4¯½m»wì®ÍP1–N)^ÜÙ¡™GV=«¨Ãà?”p&;•¾èLˆÈæŠ& Aëø1D„õäa_Fl^¹JwwJ# ªVå.à<½1p 'ø¾ñÓ™Úbw>ÜÿzB q†C3â&C!gÉ,je»]sù¸½nS¢Ru™@°u„ŸW\îz ~Â<•<‘è}Cë¼»æØ¢D¯| 4|Ÿ((}¯©‹;Ž{ÕÑ[æÿiUÑr0å$ízc +JüÃâý7£Éµ¥ý ¯TT•¿8T¿KËgÆzÿjÜ~á’r,Ï×ò«No18©µLÄ œ¾G¤õƒ±0ñ)™Ðv‘L¸yOSµmÔ@Ά$©@¡Lî[Ùª‹Ìâ ÁÆ“³ÎõÊ'mL˜c!–WQAaX“iË$¢/s’Ff~Pœsm™Å¯ñÖÞÅÚAôÜH*Ôd½m=ÿÁzèÝÀºHÉbÓRÞ’3ês!EÙý‘ty˜Ü*ÉR·›¦0MÁ‘‘ž^ä³/°uë霑Í|U¯ºû¸)½:SñóàRwä\\ðM– fiÈЦï³kø‰Ê`tà|¹ÖPÏ*¬^=Û^-âŠÎ¨Å=ôîŠí*Š*Î!h¯òÞÁê 6Á×¥ÖøÔˆ²A¾Í,vÄÔ§LYµ$xž: endstream endobj 2546 0 obj << /Type /ObjStm /N 100 /First 989 /Length 4134 /Filter /FlateDecode >> stream xÚí\[s7²~ׯÀcR§BÜoU[[%[‘-[ö:–’Èvù’F27)óâ8ùõ§ÝCoІäžSÙò1=úŠÆ gŒw^(a¼‹Â—c)Á1D¡Ujm°Hhá¢GŸ"V„\Ú8‘´F‹lìºÛÒÒ®PIh©,´ F í-´Ï)#tT ¸:iìœÐÙ h€Se3`€Öa#  iÚ0¼1x*[‰0¦ÕáÔ‡Ö",räè*Ž®NÖ "Œ™©. ‹ì³µ9!Û $Ñ'‰FHŸ¬¹àT’A[웼úMB&a¶1[Y‰d2¶îSL8g8M9#k9€DöÈId§áj L¡@T .! R… ?«R 2×6š4ˆZ”aÐÐÍ(TJÐÐÍ„ m²}ÌÜ-J×a­Eek¯„# =lF [T¸SÉx8°X﬩ ’AR"bÏ 8FZ™K(оË(²„vs”ïA#&ãmT@jï¶¢òÓÄùD¤"^-cÚ€&…ë `B\£†¾eg3 F LÑ•hŠgZ.z*ÂPS:$0Å`ñjÞ°˜-p5Rp]D3>3pŽuÈEBEEµH¯¢}ftƒ°2X#ªŒ ¸ƒAÅœQ…¨„¤2T°3 h°o²…‡ÓLì÷»§ÃÁdÔ»œö×CqßuÅPUãjðeØÿÒ»«“¡€+ϪáÝ—^õû÷ÿø‡gB>ž…<ß ®{W•¸®Äñtp5¬Æß‹þó`VÝÏê¡ë<ÿã¾òM÷¶:ˆ ctÊ!æí|[‡ÓÑU5&G-u¯ªë^÷Éð«ø  -3fóñAotXKš# ±å4äRÆ3z¦1¶[÷çäJÌy4uª•Yð[Xù†•oRø[jmˬ1‡FV°š3b „œ±DÉFj3Ïôþ?3F*7gŒ€¨J<æ|¹IaúF>9ŒÓåÙ…­9Ÿ„›){ôõÌ©/nçÉ_òHL­Ì “LÊgŒ.S ¬fŠŽ–Ý3E›1°s¦H y(S›jfˆ5Ï;—eÐR¬¯­ñæ5Æós’ià…gMS=·¤e¹”©ðM%Þµhz µhø@ÃXù”<À²íËv”T:Fú"9ê„£€”tçËîÓ JŠ ˜n4´Q ›…d´¤im.u;Íöe¸¿ñe ”‰TÉÙ·›1¹±lˆŒÌjµ¬¥ßð[ .©aV[lLÕ·ó-ÀWÚå"CˆlDRÒ\WˆÓ”F“#ïBÙL‘žÊ‘6A ýbí‚Ö3–TCZ)ýfmé:Þý@ÄZš_# Í%Z Y…6 øØ¸Ž÷”ªñÕ¨w?Žèóëî\99>{zvþ?O_=Ñ êûÝÛ±pÔàIy*ýèS|WkôZ¼>¾ÂgÓ!C˧ÝûçUïöœ¦p ¯ý ñâɤÛï]nû•€áÏ&ÕÝ/ø\ÿ@^p'p&ãSw„·°¿“‡ò‰|*äòX>“'òT¾’¯å¿äùVžËŸå/²+»WÓI%/啼ª®{ý~W^ ûÔww]y-+yÓ“7}y+oGÝ/•ü$?ýqÿ©ÈžüMöåÈÁôî²{·9”ÃA%ïå}5ê ¯åHŽå¸÷UNä¤×¿®äT~‘¿Ë¯òùç÷$–ã0cð@øX~áqÃf1_¼~stvˆb¾Ðf½œ½E9kü»JÞ“œó#åü$ýB¾lHû'÷KüWy!ßÏäÞO@RãßÐ]MïnúÕ×]xY}žvû²úzÕïÞÉysStÔíÜ §#PUCIÿž«©ªYRÐgùyZ'=ù<NªëË~¿º™ÐɜآÍê ‹:÷»ãO¨ÙO£ªbýN~6u,ÿ¬FÃ%Eç6Š~wxqqþ¢(úìt“KAÜ#—21í¢êòL×FmÔõëE~²nÃÏÓŸ_<}ü¼:ÙÄ÷WÜØ¹Ñ®f'š7V7¹!3XbɶaéÙ›Ã×çÄÒ_´ºfÉ„=±|;–|–Þütrzþ¼°”×sdrÍßž”äÚqÔ*`¾øéääùÀÑÛMfçT͑ʻp4‹—!oä§m¸|× ˜w qwpÝ —£îÕoÕ¤Ä+¦)b="¦^÷ªQ5îåõÚæ1öîã[5 ÃjÄ-!—£n¿¼+käRø]·Tâ_ÓÊÔ E&QÀu˜¾ïOÇÇj8¡žDî»±¾k Ï­bøó‹Óóã_Ðö68“9“ {1½\‰´Nž/˜´2Âo.–Èb…ÿ ZÅü¯^þúó3àó 6K µ±;…“Ù Ûxßc}ïaG›;XI‹s<Ý ª´G™Å%$T¨Ìj¦VNH£Ò´¥ìl)kÄ0JÁnGUæ´j ýj<þåc;e_m"¥n•‚œ]¼{û– qà ·h_8|±»!nÞŸ]5ÞÎ4Ô«U2\.p¿Är»µþäðý³“Âò†´3°ë9§9~ é\çzëÝ®ÅB’Ü|Ûn‹Ü>Ö/³Ð?ì˜þ³ÐÖ7d"c%ˆüIw\•?ü.߈]0z]®¼tÜ'¨(~qÚ„ùkïzò ß-Š©=þòÊå dµ2½q)´ŸÀ곕)˜å)ÄÔ˜žÌEÛÏ`ù^× ¾[Æ÷M|¿€oÚã/ߘZÁ-ðm{ü¥»H+ð©ü°tËg ÿû°Ʀn¿¸í__1>¼Ë:羉ÝÜ/mºWðÝ_Ýd í¯î5W¦°b:oŽA¹ý–÷G+X ‚¶9å›2ØB Ë;”å èVAPm± ,%à+X±B6O`‹´œx­L`Å Ý‚ ŒkÚÀËÀR´‚߯Óšœ_ÎãÛ¹SÌœæïÙâÝ“2òËÞõXð«3¤o¡ë7gËÁR¥-g·ÝÒû¶ŽÞéqô.¿Ã˯éÒ›¸Û ÏoèFš(E#Aæ(hiôh»ái!Àç=tÔ,,Íõ†ÏMÞC[š§fiG"Óüβæ×‘uÜANš–)|‡œŽ™ß•fΌ淠M;i¥K²üµå·­]ýú5¿tÍj2ä-[‚$žiâÁ3¿­Mw¾ñŸÔt¤=Év –ŒŸ #견+ëÕ ¬`ËFlƒDaNmÚA\6³ÓC)áè¶,ùœï´ßÄq–w|ÎŽîèå£"m@ò‹Ã±_;æÌ1gžîPÂ1oâ5b,9b1gx3¨Ù„=¼þNAýNeïj/k[‚°ðóUÁw0oÙ7ÁØíAð#eöüÀžØ?ü@ßhØ„ÃGà÷ICäcâÁ™Ã¨Z9£QMÈ `dñDíøé’räµ0¶[ —@Êù‘¿Sù[1ìR/†Fbb6ˆÈ3’ßl’è9,µÄIâÄ!q$HlÉé@øƒ)2-å"SvŒß¢£Ý“Ì_Él]™Òy‘YLZ©šÐíxÑ °bÉQ'õ¯ê•_ù: n(Ž”Zå:oa‰i­g™LÊ´Ë]– 4çwZ³µ5k‚ó1­³Ú*³¸ Ûu¦mMÌ3¿”±õx®†rœ?™šOãëé„]ÌÂð¢_þ U[ã`ª›¦öªU¬6fªþ˜ŽöµiÇ<„:Ñ®&\ý/IwØ4 endstream endobj 2623 0 obj << /Type /ObjStm /N 100 /First 985 /Length 1826 /Filter /FlateDecode >> stream xÚ¥—ͪ$Ç…÷÷)òÄdƉü!0ol$!¼3^|B63#c¿½"ªª§#zâv,fs;ªºëœÈÈ<Ýߥ>[©…F›e¾®ÒÆqc˽Cµ`°­ðZPéó¸Ãep×¢—‰Y¨ó*«Ö)¸,ýpçV6ë[åJK«.Õf­¨´¦ viòW«QT¾Jc®ZÕÒºøS—>[_SK§z¯•6§ªTñX]m«x죥*¢µÊçxË’ÄD+ùÕ¡•¼A“´#¨/yŒÁ/RiMŸXj®ñ”%Œ©QËÙ—V"° ò<äÏ–vIG…Z›Vj©‡Lm¨GŸÄêѹGW½ðÑ•Œg2ô¡Lºê!F˜PˆÇjêñX[=ä ì©4 ×®²QÜ º‰ÔÔCvši«‡,¡ËâFEÕ£î"©‡4ĺ÷R¡ðÔqr­R-ñ§Âkˆd’¼u/!“”©‹d ½Õ©Kµ–V­È‹‡ZÊYбË$;£i%g«KùHïº=Iö1ÕCF×gW™d_P™dßM=d’}oõIŽ:ÕC&9Ž iM¬zÈ$H=d’C—%Õj©‡Lrô¡2É1X=d’c’zè‘_U=d$c-õIŽ=ÕC&9kWYÂlP™ä¤¦2ÉI[=Ärꢥªe²žXÝŠÙõÄÊGÊÔ JÕ¤ÒcK2º9WÕJ<ÖhZ‰Ç–ÅÈÞ;:Žò(«U~ùöÛ—wÿÿ^Ë»þåõãË»?ÿû÷ß>•ö"×^¥:b\ËO/ïþúþ_Ë?HF¬×ÿ|ùî»·žÆ°³}|é…¨ãeœW÷óUÆ|¼Îõ²ç‡ ­ãvÑ 8^Çé¢ðìa… _êú•s¼öSµïki8ï¯p‘£q¨L>×4çy½êé®_úºGý —¦!<7b];Ðx^žîH ¯b¦+šo[ÝæDçÊS™&ßß·MÕžã9=ðW±¯âÚ‚ã—ç*(Ðþá÷O¿¾ÿMåÿòþÃG‘Ÿ’Þ£·¿ý,—ÇÒqyºSýüøûO¿¾êûû|ÿOZϳ¾¯óÒúñÃëËñ»¦— Ý( Qhçå÷¯ÿ3Í= ’¬Ïi{Á°C˜5âaŸ.AP¨0Œ?(¼ñÌ#í Ó«m\›tîá vo—ç~Ó¾°ªw+ZÏVɬ=8“wv§çzt¦iœûÃ"oV·­B4¦[”z®ÐØõ~ü ÁvlûAð¦pœ‘B[Fa¼¡p롆 & É¢|$®)}Þ«ÅÛ†\~onH3Ùiõ¹s]ι…Ù©&;u&‚Ý ¶PÐD©ò‚—B ¿ªIVmO;o´[înÓ­>h׉ºMw|á|ï§A“Ÿ˜‡¥D_¼§ôùiû³Ãµ„ l(Q¨¶%ýG ¼ç‡×~.¸¦ ;\ËŽD½` »D"èÒukøQŒ`}.8—ŒBÃóž3ì^°…‚Ãr"èÞ­áGAÁö\pl/ØCA±ÁáÃh ‘DcÀ ^ ? š¤Œ$)Ã'e„I&)=IJ÷IaRºIJO’Ò}RF˜”n’Ò“¤tŸ”&¥›¤ô$)ì“ÒäüdN’Â>)=L ›¤p’öI i”Ù$…“¤À'…ä°I ’¤À'…äÀ$IRà“‚0)0IA’ø¤ L LR(I ù¤ L ™¤P’òIA˜2I¡$)ä“BaRÈ$…’¤4Ÿ “ÒLRZ’”æ“BaRšIJK’Ò|RZ˜”f’Ò’¤TŸ”&¥™¤Ô$)Õ'¥…I©&)5IJõI©aRªIJM’R}Rj˜”zO öó¤`û¤Ô()ØËŽDðaÉ5d#H‰ [ò­áGA³ä8á!pÂ'à„N„À œH€8' p"NxàDœ0À‰8á!pÂ'à„N„À œH€8' p"NxàDœ0À‰8á!pÂ'à„N„À œH€8' p"NxàDœ0À‰8á!pÂ'à„N„À œH€8' p"NxàDœ0À‰8á!pÂ'à„N„À œH€8' p"NxàDœ0À‰8á!pÂ'à„N„À œH€8' p"NxàDœ0À‰8á!pÂ'à„N„À œH€8' p"NxàDœ0À‰8á!pÂ'à„N„À œ”'yàDœd€“à¤í“'ín‘º¤Pœ´É>O ­å£¤Ðº'…ÖL»l¡à0‚œº¤Ü~„|žšÛ öPðžš+^0J Íi{"è’rkXÿÌL- endstream endobj 2626 0 obj << /Type /ObjStm /N 100 /First 984 /Length 1718 /Filter /FlateDecode >> stream xÚ…™MjdW …ç^ÅÝ@è#éþBhŒB!è !޲üHvU—T-—&e=óêœ+½wÄg̼¤¡1/´Mús®F“­è»XAMX/xìÖ1¬­ïi·¡_`î§Í¾­˜mñyÒ‚UÏ„å´}LYf;Ë”Ea˜´ ‰i³Ú2™¸ZSgj$Ëäi7êÃôõbÄvPsÀi´`˜Zmó€zìiPÓÕƒŽJ‡Uv©7k¥_£½ìÃäç¶Jo‘®dR]É´NãAvóÒ¯ÃV©ü´uo¼†‰Ú4¶˜‡Íïyèù˜9i ‚e:B¡a:C¯yèEØÄ> stream xÚ…YM¯¹ ¼¿_ÑGû`¬H} ,ä,‚ ·`Fàƒlx ??,µØOjif.ÏâH]dQd5gLUèÕ¢‡þÍÆ‚fµE®GÌ8’Ë‘"Îäx¤*X„# Î$9гE:$…7[„C‡£ª8ÓQkÂÂ>ˆÀ§„Sln™ábˆ¶"ŒŠ'¨”bÆÊ6rs@P"œC®Ákr0P!­z’±U>8¤ˆ•q#Æa­¶ª«rp¼j´•Ô7[…ƒ"U‘ƒ3"UI©–9Dª–<Dª–>Æ[™š,pE V别h+IæÃrYgIŒ©Q°,Æ$ðk.cÎðkTc‰8g‰ˆÒ"53Šseó¡-R6•á—íšBRóÁÁVçHŽÄ¸¥d·€Gd+ž…–RiIÌGÊxv$ —Ä’Ø-ÚÊ*A)ce>´–7ˤ®Â2™®V 4jG,“™qbG2£zÄ2™Vtä¤À³Læ\pÎ’˜‹¥Ä’mŸß7[Õ#ƒ4 -£ülEG ¸ $§.´ÄxØ ³²mŸéQ*%óëa—Š]+a!\h±[nȉ­¾‡­â!9¶Ï¬æ‹ñ°U>DZØÅ‹6dsi™k+´Xó‘ª5#z£ 1"z»d»w<›ùМá×Ò®g¤9Š›¶U¶~B«¦üf9*µ¨²ÖAåíÇß~øë×ïÿøbÅ/lþ—·~Æ:œë?þöåŸßÏÎ8?øöå¿§ 4ó—/ÿîqùÓO`©ï€E^æ¶€eL;BðŽš¬lòR®`íøüúí÷ïCÄúÜLíÈø× ì“,žÃ»ç¬O=£×'*¼£’eÌ·dD™©Ä-BøÂR.[@zLõ9`’paÒ°¼L3`Øæ0¾œ)÷€ï€åøˆ²#l»$ããU ½0´Î5è!öì·â5XWûxcawöqÛqЈž#ð¬qËž`y8kÄ>B4‚Ó ÀY2x+jGÈ[„÷.QÕ粘ç’wÙí%EÜK¾ ÑUòéîZep}ï6÷劼«IÕ4 ð „©kðýbøÞ5*õ9 È ¸Pt,/Ó ¶€yŒ/§®ñ€ï€<†ç€ó8ªÛqT‡qTïãè˜gÀm× ã¨ÞÇÑpîšítªÃtª…žÎÓ©|š(ë À2î†N†NÍZ£#ôïCkd~Ð×^ió¸s…x6²·ÊÕÈ´øºæ6.3w˜u2ß]ÇYCdrÁUïƒëåª{ÞŽ…:LªzŸT„¹Ÿ¶“ª¦¡ŸRxç~ÚG‡~ŠòçâJÛ~ŠC?Å{?9‚G¸-Ï84P¤ç<7PÜ6Pˆõ #lCâ¡c8¿ÈÒ\þ~ ^ƒg¦[¹M·‹çyº•ít+Ãt+·évÌ3 mËøH\:Â<Îþòù·/¿ûð‰>”Ïv?>|bXçÈgV„U}/™UΡɬl–œ‚`VuêÕ¯–߯¿}ýîèØüuq+xàœ¥>Y}mFÉÁ-‚UܲøÊ9uʰêâÔ°Ûæâ•‚q(g]ãˆq(õòT`‰["ÝR³è²*,¹ûmèmwu þ8ØÊùâ‡E°œ<A‰×ÉËC"ƒ—sÌ›Ü"ÇØÜx5‚’=]T`e·@0{*¯ë ,î·å|õš?¶½Õ+ƒŸ8?q~ ~ê10ø©ÇÀàW¯=Ä^—ËmèmwãØö—ŽÁþN†¥°®0Œ`Ÿ·ÌB×:`gã¶|Ÿ¯ÎŠÛm÷¸ñïpcï;àW®¸eÞ\2˜¼9!À”Ü7Hû›ÊJÅ‚SéW ]¥SKG‡ÀÅÞâÐâó"ð’¸JÚY@QÉ_ÌTöŒ@O™–:BÅÍMBp™{%@o9º cÄ~‡RNýÊ £ì‡¹‹ 9 ~ØxƒÎ²¿W ³ìoAˆ»,A>ÙßOöW ¤3†åö€‹½ÕaÁy÷aŒ¢·'-z…@0#÷ ÂEÏ,Ô2®ÅTì-î §Ñ‹b½X `чHhdôbBF×jèc\;¸Ø[‚’çò=‡­èRh¨®¹Åè"IŒë@Tì-î ™ÉßrPÌú-A¦’¿ð „‰z!ƒÉß}Á—W+p±·:4J)ùÃF)¹È¨' Ú—J§ åKÞ3н¤K3{‹;cò¤A“g r”j' ¹ËÁ}X$Ùg*H]^Ç`àbouh”2÷„âÙ^Šéß'%~ˆaô@Ôpó:þ{‹;5JÙ%K3ŒNVAÉ«PAIÜ!Âr¥WÄ«‹CàboqˆãýÂjûBÓ¯ äúU1M{!U|ñÚ©ønÂK;€^ÝÈKÅ—ÏfÅwvTcT\Ùª1*®lµÂèÄþ7¾(þýëg¨Æ¢j€Ž4÷ÿÑ.Ç endstream endobj 2725 0 obj << /Producer (pdfTeX-1.40.14) /Creator (TeX) /CreationDate (D:20140312235048+01'00') /ModDate (D:20140312235048+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013) kpathsea version 6.1.1) >> endobj 2660 0 obj << /Type /ObjStm /N 65 /First 642 /Length 3505 /Filter /FlateDecode >> stream xÚ•ZKsÜ6¾ëWà¸&øªR©²eÙqÅz¬e§R»•Åf°âc>$Ù¿~»hg0±“ƒ-°ÑèþèÈIŠ\‹X$E!…T%‘æ©ÈS…ƒL”’¹ÐeŽƒBHYÒ²RÈ4Íp¤„ÌU‚#-dY곤©K”Z‚D©qm ,YB£þ# %P’ør‘Æ)ª/ ‘Jb ‚ø`‹ i‘E :T,ÒRk ))²8FT#Kb¢¥"K ¢e"Ëħr‘•¤C"Ó Í–"É~¥Dž¤4Ò"Ïb:t,òœìÕRäeŽt"r ŸNE!I›ÎD‘h” ¦YA³…€ÍE{u)-Ñ”(´FÛx) Ø«€—ikËXŠ2OŽQ–‰ÆQ*J-i6*V4› •ä4*„Jáà`T •åħ„Ê<-T‘Â^•2ªÄ}.A”R F‰PÚÑR¡ã”F™Ð2Cy\'Ñ ¡SG+…ÎðÌÑ+tž’-t‘$ ¶S—4›H¡!€m×JãÚtèW$ |ãìçŸÏ^^U[3ˆÿþôjWõ¦­m5¼€ƒÎÀ1?ŠŸ^õëikÚQœwí#üµ] Ó $¹é±j6Ý VF|2uS­ºàÒONc×d÷Â^¿¾þãpÁ7¢jWâõÅ€šÒª?Ï^~°[;:`þóì—_ Ÿ__^^\}Ýp"$ûfz\˜H¯í|SmAL`Óš{ƒþiÀÁS¦¼þL‡äçé¶6µÄUÕESÝØœ8yfx?ý=qÁ ï£5OÿÚ¢ƒK¿ýïúêÑ9ämGú޽™h†£ø£ êÛ•­ y;y_‘ižó$¸J`•0¯‚8Yâ9½*0á};@~q‘ “T³ÆBÛU~D¯«ÁÖ`K—‹©û ©`'Z˽ÄïÉ^8Ü€ã 0~€Ý«hoìzr‹ɽ¼¸ý]Í«¹¬v¦ÂdÚ¹|ù<Âp±rž7ΟðË$Îfro¿¹@ûªîÑKS–ýˆG\½A¶üزö÷ev_v«©1ÂíPSaaÀ öD³”F“’)–lÇH—Ý4œõÉùêMô»éÁrÊŽéžZ=“»ÅI>“ê®éz¤…ã$¨ýšÀ˜yF+IZ2k Z´6#ÑÓ#úàé~ë¯ÌŸð9ãõf|êú³Z†CÂéýªÛº®|ªÁSÛ±ÇubA`ÅõÛ·XùüFcÞr1û=séCÔTár¹¤;á\jÑ“Ãé2ÍÚ'žC¿å9v\€>ØvCîä (†fÝç÷–ÝTõCµ6â+ÛP¥fßà©Ã³–Ø<úyÛš†éÞ6èngß7Ój…SÊ)f? Aa 7b=MÙ•ošª+Š ëìØÎõáŠÐÊΧJUf Èà¤pÓÛGÀ Nº¶â*vÓwíäl”Ü~ýûó+ŒýÜo—+j§2NßͶéPúwMõ•<5ˆªSøŽF}4íÊô— ÷`·¿]@Ísúöæ×‹HðÆÞZئg#ên;m12<ÊÛnêkô“Uxà ¯v]?$9^š°@33o¿£ÙþÕN{ÏùÄÅÂïò§‰Šgz¥Gû¹µÏâ56&_½ (³Ç¶d¾møýâudAýD·*°j‘W¹ËýÝÖÝž`s¡ü»`+SÏV­VØ»{«@<å>ô!^ñ)ð•½6b ÐT»¨{4}oWØ6q·~ãÓºb_@Úºï¦vÙ-„L^ùÝ]÷Ìe@rA\õÕÒ¼ƒÍ)ÏÞèf à:ú,6[Šv}·Cj~@…Á¡Ê™Q–Ì´¢'uÓÕøT€Åž/D×m·î 8[ÔîzÆ·†ºÛ}ÅG¿EõÔ] £¥³TÉy|²c½ºöÈWæ~B××A÷0+ö<²•i Æ¢ÒÞ¹°ƒÄGÅÐ ä¶:Ž™íOÉ„Gô?FC[¡eàr¬Ëq„P¦í.ÚÚ½RsÆ4õ¯sÖÍ0¤¢º1x^p?¤ƒP°­T§&V¸¤8œ±C?µ­m×8ð!¬‹C˜em"ˆLŽÔõxVš{Í56ïê 2;š†sQÖ1y¬ˆÎצS[àTp‡øÂ5¡A_ðÊÁ0ÔUc°œ²ÎGÌN:“üÍcô`¾RÉÍ–DPD ó%qg1²tTgÔºä aAZ@ ¹Dšg2˜ë¨ùÖu[|öž}o×Õ[ ½x†FÌF——ÙžÏõ®‚Þá:ÍǬBœÇì.Ü 2’+êÑ «bפi ]?“qðÁ̽WôtÉYè¶µ£/p{1MW±Œ¤ÊmðpÉ)ƒš®{¨°snVx½ÜÛ³…^Œ5qTydë–Ì_ÑŠ.7ÀímªGÃìj/dì:ìÏ’2=aÁ¢=÷)ðcoîWà…5@/½Cß÷Æ|C¿ä"ç{hl²øÎÚß"8xŸ ¹ü­1\ùޱáô“•ñ ¤ õ3ksÃyRóõtcpÜ’k>ä ︌/ E®h›a‰Úøâ¤¹´Ù{xP/Ìz‘!@åK{Î~HÏ¢ƒ«G=ÒUß-\죧ª÷)•_V€wL£Ë2Ð aK ù„­ëW1zùEASmïV™¨‡Â,Ô˺æ[y›<@¹pþ­¹°¡“cHäûGŸ³R2­{À¶+.öϾ„Ûîª.»qP-H÷1gˆð`>,úˆS E½© n ]²ÅÄØÁÞ®ˆÌàÉý@:Z“4NDˆ(õåAŸzÉ~I€ÜÍÜUƒ“ZÊ¥œpš<4pIz+òcoœ7+΄L:ðh¿Û ÛŸ4hkŽP_µ…¿‘sP‚à÷°…(®kZz7 ÷DîA¿N#â|\îºÏIQìɾ£Þ b€Y0‡¨ñîÙØo|Õˆ9ºÛΉö[ÓÎo~AȉԽváÂWX½xŒlûh{×§äÁ¡8^ ÆùŠ¥ùÙuƒe#¸3-ªÈθ3yïÛ|лÃ-eˆ¨  ã÷ý0³ÆWY*èöh¬®(/H~ié>õÑ–\Åé9»/g’¡›q/ˆž-éƒyÞ‘`ö8þrâÞ‡ç >Ä*"9f¸j¸K4ä·àæµâØf=¿ÙpÀ}Ó öÿ¢’  ~@†ü ö÷­„³ ”<`å®É[ †t†’sJÎ`Æ3èã¬=ü\'s ’}B0Ì`Æ3Þœ•‡¥,±… ÅæŒ.gt9£ËyorV÷•"¹:;!—Áå ®à )XeÁ*‹ ;éüo~g}ƒ-lÁûT0”‚¡„—ëƒÖçËë-Ùª’­*Ùª’7²dleñãOHÇo¨gElNÉæ”lŽâcW &¼¾g>õZŒ)Ư¿büŠ÷V1˜ðã¿Û:¾]ÏâµfÔšQkÞBÍÂonî‚|Ô–³lÍ@5Õ Tó®ùk ýìt‡ýeÝ+)}7J¿óƒ”òï”Û“¹®ôo èÇe~ xÀý÷XúaÙ©\÷¦”Œ^2zÉèý{ú5š”ß ˜ì˜Tÿx7$›œ°ÉÉi“—¿Á¶Ðý˜™úéëΈ—çÕX5Ýúìå Ü€E…ì={y=ô’I¹#¹BG?¤£g\r‰%_~ ó£øÿí¨œ' endstream endobj 2726 0 obj << /Type /XRef /Index [0 2727] /Size 2727 /W [1 3 1] /Root 2724 0 R /Info 2725 0 R /ID [<94343848264EF3DBE01AEA65E2B5BD1E> <94343848264EF3DBE01AEA65E2B5BD1E>] /Length 6258 /Filter /FlateDecode >> stream xÚ%›ypiy‡çS‡-Ë–äC¾äK–d]–/É–ÜRË—$[¶eÙ–<’%ËñgAWBH Rl€0!Eá MÈRCè!ÅìHŠ] $\!Y „¦–EaCR Õéççžz¿£¿þ¾ï}ú›C£T*•ŠÓ©TÁ@ÊR©M©tª~ýãf=¯RÝyºd@ÚR饈r   d-•ù¸Zë@=מ.Å-`Ø-ÕðuÞš@ h¶Ôæ~5læÚsD[A«¥ZŠjh;À6KíŠT·ÎˆvvKu?¤†`/Øm©“)ÕíûA‡¥Ü7ªn8Xꪯºƒ  tZjiNu‡ÁÐm©¾]u=Ü|\¤Øz-õê.µö£`ÀRÞ U7Hg‡è8†,õ¦?Rëqpœ§Á°¥)¨uŒ‚qpÆRï\RÃY AÇÒ©l´™Hû7a©?T]”ŠIn~‰H8o©÷þ–ZµZ´¥ü_&Z|ã_ÔpLYê›/Rq\×Àu0k©oUëU0æ,õÝÇUwܲÔO›’AõÕ-€›–úß *ÞEKý¦-e¶éÕ-E³æ’Šw˜øÑšYË#I¿ö{jXËIñ;*Þ+ ÊÒûžYÇóÔpŸº”¥'µÏåŒÙàדQ&÷ªˆÔåtRü3³•Ëõ o65¤”/7šM¿$¹ö®f_ÆârCRÔóQFôr3 å&³µŠ6±„i"l/£rEË[ÌJiuÙ¶/·‚v<銖µ`q‹Ë`—ÙË>¡örÄœLL#ëm6{]²h{ËëÔŠãå}Iñi€DôÌ0 -£w½Ëfïx0çnÐ’gÁuR—À Àâr¯Ù{,ð”ñ¾œŒœ_e.ÇÌ>Ò‘ÌåÑ÷©Þ—›}¾YE”/ŸdöV>†ÍªÝjÅû2ÏBy œ5ûÒÃÉPÍ«uŒ&Å/«È£QNž…l»:Ož…2§YÇË—ÌžÐáQFï²köÓ‡UTz4ˆò;9 XBû!ö@wÃûò¬Ù/ÆuÞ—y ÊØ^¾ æÌÖߢVˆ2ž–ñ¾|+1ó)5Üf½Úû;åË‹–ÞX§Ö"»&›º|,[zûÔºbéÎ'ŸG>™bViêÖ,}zŸZïS§³Ì¾¦(2–žùW³ gékIF¹ýjÕ5€ä…áö3*Öz°4Zz%TÃ&~ÅÒ/žPq3h²ô£;TÜšAØbé¿ÿk5´€VK?öéä–ÿئº`kRüc·í`Ø :À.Ðnéo¨ßNK¯+åé‡T<v'Å喝$ǺU[IÞ,¸D,>dé_þúu‚Ã,f–èè¶ô³©µôAÐk™ôf5 €~Ë4åS–鸩ºãàhR|\Å!p ƒ–éìSÃIp œ#–9ü5œgÁ¨e†> º1¦vÕ2cßNnä¾Yu瀓ÿGÅqà‚Ipœ·ÌÔªZ/€ipÉ2óßUݸf,³ðÕ]×À¬e–Þªº«`Ü×-³¨aÜ·Àmp,€EæÌPÕ ÅUp-óâN °–é§Í¹Ggé¸b™W¾M]¸JT5¦nͲ#Ï©•«€¢ÕF³Ì›_£VŒ­¢rõ¸Ä„RU,®6­¢hw«XWEÖêË<òà¾ÈZÝ‚9M`ŒQÐ¬Š±Õ`«eÞÿ„:·Ýiª¸[Ýe™æÔº›¥^'’“{-óÉz5`vUƒî·L ªbVŒ­"fõe>?¦.ÝŒ§9cgµ \O«‰§µgÕO«WMÄüJ¬:œ¬"k•½¯Ž‚S–ùúEµ"auœád¿Š“Õ 0f™ï?¢~@½êyàZæÇßRVQ´ŠfÕ –ùÅ_©1«hV¶Ì¯óª›¾¢+î€"#k¦Êà"o¶5ŠwÁ}¸ö½ºLÊ5ºTæÂUR–ýÉ_Ð¥b–ûÔ´¢ÈXöçí*fNVp­‚W„«`S›* qrýcºBÄXB¹*–ýÍsj@ÇJØ Z†UÚ,×ø|uÑ[Îv°ÝrÍ_SvVP¯²Órm/U:VЬ‚„•=–kWR*lg;+Á!€k•ý–;üüEE2ñ¾åžýç­iÐ?÷°ê2 r   Ô£ü4Ѱð¢9¼4Zî‹seh›/®Ã-€wiÃm`+ØÆf_#j:¹vXîËk”]`7Øö‚°ìÀAv­ÈPZôaÐŽNË}õšÆëG@/èý  €Ap ±ÔSà2Å€Ï[ÃÃ`œ.8n¹¯¿V÷8ø 1<N”vÀi0&˜îq†§høóà:¸ ¹¾¿Cƒ^—ŸS†•€p\³ ¥•/€à&X‰a?z·†ºnƒ90ÁÀ'‘vÍ^;¹ î1?±l¹§?«QîSGŰF¥‚Œå綨•ìzkEö´r–ûÍKÕŠ\rÈÔt ÁF²Ê콵Ǘ@¾ìd?Àƒ Ùò™ïk<| ð%À°'¼ 0'è`m,:ÀƒA‚ý–ßøœ®E¤€È€í ð%À—_| °$À’€üÝ–ßÞ¦Q.@¤`œä–0Ž‚Ðkù×OhÇ€žé~pHA0 &ÁypL€Ó–Ó9rœúVCÏ´kù?]Uë%p\Sà ¸ ®Zþ½O¨oqÚ¯ƒ`èÁ¾eyÿçêrðJÜ®w2wÀ2`©^(K–ÿt +ôµÈ=pŸVê<¥{…Z±ÂbEuá‘n/9ª«:Òí‘n/ȹGν ç õ’$?þ&]Ù÷ȪGÎ=Þny¤Û#Éiô¶ZþÉq]AÎ=Tñvï¡…Gâ=Òí°üwzÕ™t{‡9÷ï‘x¯i/ÉïS“º‚ì{dÕ#ûIö-ÿ£fµ±úî -¼–úŸÔ@ö=^D<²ï‘_üzIÎõKu|—ë¹À±|üJ5ŒñH·7i…ÂëÕ€y8äáw\²BË3ê2 xúDèqnDèqnDq(Dè¡O„>úDè¡O„>ÂE½s"̉P*â(ˆp(âȈ82"lŠ8-"|‰ð%—›¢Ós"T‰ôµ?Eœ–DX¡OÄù!H„ ‚DèqxD¨áF„ÒDœ ‚DaD„Ñà ˆÈt„éŽð Z$9¨Š/? ǰhžôè‹MW HÄCáK¤ä%væø,÷iYyPu 4€F°lM`h›ÁÐZAØ ¶í`h;Á.°ì{AØöƒà 8:ÁaкA8zAè`Cà8N€“à#à48FÁ8 0&€ &Á9pLi0$Ã-+x¯Ò¶_°Â{Vt\³à*¸®ƒ9p̃›à¸ À"¸Š` ,ƒ»`¬‚{` ýP‰ON®wòýd.LYáKíŠð ăB<ñ ăB<ñ ăB<ñ ăB<ñ ăB<ñ ăB<ñ ăB<I|HâCbD˜¶ÂŸÒLõ·}ª$[!Z„h¢Eˆ!Z„h¢Eˆ!Z„h¢Eˆ!Z„h¢Eˆ!Z„h¢Eˆ¡n„!Z„h¢Eˆ!Z„h¢Eˆ!Z„h¢Ex Eˆ!ÙÉ~HöC²’ýðØg…UK½È*•7´Ñ"D‹-B´Ñ"D‹-B´Ñ"D‹-B´Ñ"D‹-B´Ñ"L†ÏóÅB~Ô@d@ä@@¨  lAØšÁfÐ$Ô>÷wºÑ+|÷ùж‚m`;ØÚÁN° ì{À^Ðöýà8NptnÐŽ€^ÐúÁGÁ8Žƒà$8†Á8 ΀Q0ÎŒƒ à‚Ip\@«ÿˆ–Li0.ƒ+`\×Àu0n€ypÜ·ÁXw@,ep¬€Up¬àÏóy|ðQÀG|ðQÀG|ðQÀG|ðQÀGü- i_F\´Â“ÿ§[&»ñß¡€> ø(ࣀ> ø(ࣀ> ø(ࣀ> ø(ࣀ> ø(ࣀ> ø(ࣀ> ø(ࣀ> ø(ࣀ> ø(ࣀ>9÷ɹOÎ}rî“_Ÿœû‚ø[­ðÃ'´^¤ñÑÂG|ðQÀG|ðQÀ'ûþ¸~¶®0ÂOdh˜ÔÝ0¿IQ3@ ÿ6EÍ 7üEŠš)‚øEŠëc‰¿LQ“D…¢&‰/þ=ŠZ*Òø÷)²ü8yyŽßBäc£Ž}‰q(ÎPd¯bDŠsÙ¿›âEö4F©¸ž"ûãUÜH‘½‘+ÞH‘|Äo¢HŽb4‹7S$o1®Å-ÉeÜ Ú(’ߘã&ÞF‘œÇï ˆ1ÖÅ;)âFŒzñnŠøã_¼—"ÅHW1&Æ(âZŒŽñ!Šøãd|˜"NÆB7Ebíß)Šš®6{„"ÏQ¬Ìœ¡¨µ)—cyÞb;µXOP乌Q*ž¤¨]ÿø–òœ41ÊÇR^Z |,å9‘b”¥¼BùXÊsrÅ(Ky ‡ò±”ç„‹Q>–ò‰…w§¬Î>˜"’òõDi å눲@ʈò@Ê+R)Ÿ#Ò R^—mR>CÔ¤¼îÑ ¤¼mR^j(ïÞ'Ú PÞ]#ÚPÞ½GÔPÞ]%ÚPÞ]!ÚPÞ½KÔPÞ]&ÚPÞ]":PÞ-u”wïu”w‰zÊ» D½åÝÛDýåÝ[DƒåÝ›DCåÝy¢ãåÝD'Ê»sDÃåÝëD§ʻ׈FÊ»W‰Î”wg‰ÆÊ»Wˆ\€òîe¢såÝ¢ åÝi¢KåÝ)"Õ¡¼« €òîE"Ý å]¢©¡¼{žHë@yW·Ô¢QÞ$Ò¡¼«ùi;QÞ ÒÞ£¼«Å(Q(ï:DÊ*Ê»Z¹@ywŒH¾ ¼›lS]_¢|þ+)"”wϥʻ§‰²åÝ¢<@yw˜¨ ¼{Ѝ ¼{’h@y÷Q@y÷8Q3@y÷Ñ€òîQ+òG‰¶)?H´Hù¢v åû‰v)ßG´Hù^¢ åíR¾‡è òÝD@Êw Rþ0‘®òê§á¥ü!"ÍEÊkPM\Ê Ò*¥¼f -‘òûˆ´R^ÓÕfKù½DÊŒ”×Ú”K)¿›è,òÚˆq åw¹@Êk×Î)¿ƒèòÚâK@Êo#šR^ù¸ ¤|Ñ,òJÞ5 å[ˆæ€”W¦ç”ßLt Hyi±¤ü&¢;@ÊË¡% å7ÝR^­)ßH´¤CÄtkR^÷`m5)oDlDMÊkBìZ åûDlq å–P#5”wÊ;¬·F¦k(ﬡE å6§†C5”w–‰®†ò;YÃÎÊ;E"T®¡¼Ã¶×P¾†òÎ"Ê×PÞ!G5”¯¡¼s›åk(ïÐÊ×PÞ¹I„ò5”wÈ~ åk(ïÜ BùÊ;¨RCùÊ;׉P¾†ò^ÕP¾†òÎU"”¯¡¼ƒ„5”¯¡¼s…åk(ï`l åk(ïÌ¡| åô®¡| å)"Õ¡¼£ €òÎE"Ý å¢©¡¼sžHë@yG·Ô¢QÞ™$Ò¡¼£ùi;QÞ™ ÒÞ£¼£Å(Q(ï8DÊ*Ê;Z¹@ygŒH¾ ¼ÃoÔ‹‰ò›øûG}å¾T,¦Ê;|ëRÌ”wFˆòåa¢:€ò?|/òÍqå~„ZäŽE”wN5”wŽ5”wŽm(ïð±Hy~SÜ ¤<¿ü.òkõ¢” jR¾Ÿhò}D{€”ï%êRþÑ~ åù{T‘¿w¥<¿+v)ßE$Hy~oQÔR^ý4¼”?D¤¹Hy ª‰KùDZ¥”× ´%R~‘öOÊkºÚl)Ï÷aEeFÊkmÊ¥”ç7rEþg (åµã@Êï$r”×®R~Ñ åµÅ—€”ßF4 ¤¼òqHù6¢Y 啼k@Ê·ñG¢”W¦ù»(åùíV‘ß ¥¼´XRžß{ùÝzQÊË¡% åù;vñ.ònHùF¢5 åõw”5ÞÓ¿eHyý¶å×}=p|½Ð{]]t-ã­ëW»úû9sY×ïÑ™óº~ƒÆÚÖYï:;´ž±ºÖ/ènlɺ|VQÿnÁޝ“…u2³N¶Öõ+G²º®o>Éþ:F¬cÉ:æ¬ë'¶Þiu;–5Þa«[ø¢.«ûØnEÝV÷Ø?(걺Ï+:bu¿žTÔkõÛU^ú@y è³ä4ÐÇÈË@Ÿ g><^úÜ8ô‘qèÓâ- Š @Ÿï}<\údxèCá*ÐçÁ5€>¥d’ood’%ÖVbm%ÖVbm%ÖVÊ–UªŒ¥À™XÚ8KM€“°Ô 8K[ç_© Ji+àÔ+mx¥vÀYWÚ8æJ{'\©p¸•öεÒAÀ‘Vêœf¥.ÀAVêœa¥^ÀñUêœ\¥AÀ¡UœW¥ã€$—NN©Ò0à€*œM¥QÀ±T: 8‘JãÖø¶|²“ïëKý?fÎÜ endstream endobj startxref 760877 %%EOF geomview-1.9.5/doc/geomview-pt_BR.html/0000755000175000017500000000000012310162311014675 500000000000000geomview-1.9.5/doc/geomview-pt_BR.html/index.html0000644000175000017500000000572712310162311016625 00000000000000

Next: , Previous: (dir), Up: (dir)


Programa interativo de visualização tridimensional.

geomview-1.9.5/doc/geomview-pt_BR.html/Intro.html0000644000175000017500000000623012310162311016577 00000000000000 Intro - Manual do Geomview

Manual do Geomview

Next: , Previous: Top, Up: Top


Introdução ao Geomview

Geomview é um programa interativo para visualizar e controlar objetos geométricos, originalmente escrito pelos membros do estado maior do Geometry Center na Universidade de Minesota (EUA), começando em 1991. O Geomview pode ser usado como um visualizador independente para objetos estáticos ou como um mecanismo de visualização para outros programas que produzem dinamicamente mudanças geométricas. Geomview roda sobre muitos tipos de computadores Unix, incluindo Linux, SGI, Sun, e HP. Geomview também executa com Cygwin. Esse manual descreve Geomview em sua versão 1.9.

Geomview é um software livre, disponível sob os termos da Licença Pública Geral Menor do GNU ; veja Copiando para detalhes.

Geomview e esse manual podem ser encontrados em http://www.geomview.org.

É permitido fazer cópias desse manual.

Se você tiver dúvidas ou comentários sobre o Geomview ou esse manual, considere inscrever-se na lista de correio eletrônico geomview-users, que é um fórum no qual usuários do Geomview comunicam-se para responder outras questões e para compartilhar notícias sobre o que eles estão fazendo com o Geomview. Os autores do Geomview participam dessa lista e algumas vezes enviam respostas a questionamentos existentes. Para assinar a lista, visite a página da lista no sítio http://lists.sourceforge.net/mailman/listinfo/geomview-users. geomview-1.9.5/doc/geomview-pt_BR.html/Distrib.html0000644000175000017500000000652112310162311017107 00000000000000 Distrib - Manual do Geomview

Next: , Previous: Intro, Up: Top


Distribuição

Geomview é um software livre; isso significa que qualquer um é livre para usá-lo e livre para redistribuí-lo sob certas condições. Geomview não é de domínio público; é protegido por direitos autorais e existem restrições sobre sua distribuição, mas essas restrições são montadas de forma a permitir qualquer coisa que um bom cidadão colaborador possa querer fazer. O que não é permitido é para tentar previnir outros de compartilhamento adicional de qualquer versão do Geomview que eles possam pegar de você. As condições precisas podem ser encontradas na Licença Geral Menor do GNU que acompanha o Geomview e também aparece acompanhando essa seção.

Uma forma de acessar uma cópia do Geomview é a partir de alguém que já possua o Geomview. Você não precisa perguntar por nossa permissão para fazer isso, ou informar qualquer coisa; apenas faça a cópia. Se você tiver acesso à internet, você pode pegar a mais recente versão do Geomview em http://www.geomview.org.

Você também pode receber Geomview quando você compra um computador. Fabricantes de computadores estão livres para distribuir cópias sob os mesmos termos que são aplicados a qualquer pessoa. Esses termos requerem que os fabricantes forneçam a você o código completo, incluindo qualquer mudanças que eles tenham feito, e permitam a você que redistribua o Geomview recebido deles nos termos usuais da Licença Pública Geral Menor do GNU. Em outras palavras, o programa deve ser livre para você quando você o receber, não apenas livre para o fabricante. geomview-1.9.5/doc/geomview-pt_BR.html/Copiando.html0000644000175000017500000011537312310162311017251 00000000000000 Copiando - Manual do Geomview

Next: , Previous: Distrib, Up: Top


Copiando

     NOTA: Geomview é distribuído sob a LICENÇA PÚBLICA GERAL
     MENOR.  Para os propósitos dessa licença  nós pensamos em Geomview como se ele
     fosse uma "biblioteca", e dos módulos externos do Geomview como "programas que
     se comunicam com a biblioteca".  Fazemos isso porque queremos especificamente
     permitir que programas proprietários e módulos usem o Geomview.

LICENÇA PÚBLICA GERAL DO GNU

Version 2.1, February 1999
     Licença Pública Geral Menor do GNU
     
     This is an unofficial translation of the GNU Lesser General Public
     License into Portuguese. It was not published by the Free Software Foundation,
     and does not legally state the distribution terms for software that uses the
     GNU LGPL–only the original English text of the GNU LGPL does that. However,
     we hope that this translation will help Portuguese speakers understand the
     GNU LGPL better.
     
     Esta é uma tradução não-oficial da GNU Lesser General Public
     License para o Português. Ela não é publicada pela Free Software Foundation
     e não traz os termos de distribuição legal do software que usa a GNU LGPL – estes termos estão contidos apenas no texto da GNU LGPL original em inglês.
     No entanto, esperamos que esta tradução ajudará no
     melhor entendimento da GNU LGPL em Português.
     
     Versão 2.1, Fevereiro de 1999
     
     Copyright © 1991, 1999 Free Software Foundation, Inc.
     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA [Estados Unidos da América]
     
     É permitido a qualquer pessoa copiar e distribuir cópias
     sem alterações deste documento de licença, sendo vedada, entretanto, sua modificação.
     
     [Esta é a primeira versão da GPL Menor a ser lançada. Ela também constitui
     a sucessora da Licença Pública de Biblioteca do GNU, daí o número 2.1. da versão].
     
     [This is the first released version of the Lesser GPL.  It also counts
      as the successor of the GNU Library Public License, version 2, hence
      the version number 2.1.]

Introdução

As licenças da maioria dos softwares são elaboradas para suprimir sua liberdade de compartilhá-los e modificá-los. As Licenças Públicas do GNU, ao contrário, têm o objetivo de assegurar sua liberdade para compartilhar e modificar softwares livres para garantir que o software seja livre para todos os seus usuários.

A presente Licença Pública Geral Menor se aplica a alguns pacotes de software especialmente designados - normalmente bibliotecas - da Free Software Foundation e de outros autores que decidam utilizá-la. Você pode utilizá-la também, mas recomendamos que antes, você analise cuidadosamente se esta licença, ou a Licença Pública Geral comum, é a melhor estratégia a ser adotada em cada caso específico, tendo como base as explicações abaixo.

Quando falamos de software livre, estamos nos referindo a liberdade de uso e não de gratuidade de preço. Nossas Licenças Públicas Gerais são elaboradas para garantir que você tenha liberdade para distribuir cópias de software livre (cobrando por esse serviço se você assim o desejar); que você receba código-fonte ou o obtenha, se quiser; que você modifique o software e utilize partes dele em novos programas livres; e que você tenha ciência de que pode praticar estes atos.

A fim de proteger seus direitos, é necessário que façamos restrições que proíbam distribuídores de negar estes direitos a você ou de pedir que você que renuncie a eles. Essas restrições se traduzem em determinadas responsabilidades que você deverá assumir, se vier a distribuir cópias da biblioteca ou modificá-la.

Por exemplo, se você distribuir cópias da biblioteca, seja gratuitamente ou mediante um valor, terá de conceder a seus receptores todos os direitos que estamos concedendo a você. Você terá de garantir que eles, também, recebam ou possam obter o código fonte. Se você ligar outro código com a biblioteca, você deve fornecer os arquivos-objeto completos para os receptores, de modo que eles possam ligá-los novamente com a biblioteca após terem feito mudanças na biblioteca e recompilado a mesma. E você terá de exibir a eles esses termos, para que eles conheçam seus direitos.

Protegemos seus direitos através de um método que envolve dois passos: (1) estabelecemos direitos autorais sobre a biblioteca e (2) oferecemos a você esta licença, que dá a você permissão para copiar, distribuir e/ou modificar a biblioteca.

Para proteger cada distribuidor, queremos deixar bem claro que não há nenhuma garantia para a biblioteca livre. Além disso, se a biblioteca for modificada por alguém e passada adiante, os receptores devem saber que o que eles têm não é a versão original, de modo que a reputação do autor original não será afetada por problemas que possam ser introduzidos por outros.

Por fim, as patentes de software representam uma ameaça constante para a existência de qualquer programa livre. Queremos assegurar que uma empresa não possa efetivamente restringir os usuários de um programa livre por ter obtido uma licença restritiva de um titular de direitos de patente. Por isso, insistimos que qualquer licença de patente obtida para alguma versão da biblioteca seja consistente com a plena liberdade de uso, especificada nesta licença.

A maior parte dos softwares do GNU, incluindo algumas bibliotecas, está coberta pela Licença Pública Geral comum do GNU. A presente Licença Pública Geral Menor do GNU se aplica a determinadas bibliotecas designadas, sendo bastante diferente da Licença Pública Geral comum. Usamos esta licença para determinadas bibliotecas, a fim de permitir a ligação dessas bibliotecas a programas não-livres.

Quando um programa é ligado a uma biblioteca, seja estaticamente ou usando uma biblioteca compartilhada, essa combinação das duas é em termos legais uma obra combinada, uma derivação da biblioteca original. Por essa razão, a Licença Pública Geral comum somente permite essa ligação se a combinação como um todo atender a seus critérios de liberdade. A Licença Pública Geral Menor permite critérios mais flexíveis para a ligação de outros códigos à biblioteca.

Chamamos esta licença de Licença Pública Geral "Menor" porque ela faz Menos para proteger a liberdade do usuário do que a Licença Pública Geral comum. Ela também oferece a outros desenvolvedores de software livre uma Menor vantagem na competição com com programas não livres. Essas desvantagens são o motivo pelo qual usamos a Licença Pública Geral comum para muitas bibliotecas. Por outro lado, em determinadas circunstâncias especiais, a licença Menor oferece vantagens.

Por exemplo, em raras ocasiões, pode existir uma necessidade especial de se incentivar a mais ampla utilização possível de uma determinada biblioteca, para que ela se torne um padrão de fato. Para conseguir isso, deve-se permitir que programas não-livres utilizem a biblioteca. Um caso mais freqüente ocorre quando uma biblioteca livre desempenha a mesma função de bibliotecas não-livres amplamente usadas. Nesse caso, existem poucas vantagens em restringir a biblioteca livre somente para software livre, então utilizamos a Licença Pública Geral Menor.

Em outros casos, a permissão para usar uma determinada biblioteca em programas não-livres possibilita que um maior número de pessoas use um amplo leque de softwares livres. Por exemplo, a permissão para usar a Biblioteca C do GNU permite que muito mais pessoas usem todo o sistema operacional do GNU, bem como sua variante, o sistema operacional do GNU/Linux.

Mesmo protegendo a liberdade dos usuários em menor grau, a Licença Pública Geral Menor garante ao usuário de um programa que esteja ligado à Biblioteca a liberdade e os meios para executar o programa, usando uma versão modificada da Biblioteca.

Seguem abaixo os termos e condições exatos para a cópia, distribuição e modificação. Preste muita atenção à diferença entre uma "obra baseada na biblioteca" e uma "obra que usa a biblioteca". O primeiro contém código que é derivado da biblioteca, enquanto o segundo tem de ser combinado à biblioteca para que possa ser executado.

TERMOS E CONDIÇÕES PARA CÓPIA, DISTRIBUIÇÃO E MODIFICAÇÃO

  1. O presente Contrato de Licença se aplica a qualquer biblioteca de software ou a outro programa que contenha um aviso colocado pelo titular dos direitos autorais ou outra parte autorizada, informando que ela pode ser distribuída nos termos desta Licença Pública Geral Menor (também denominada "esta Licença"). Cada licenciado doravante será denominado "você".

    Uma "biblioteca" significa uma coleção de funções de software e/ou dados preparados, de forma a serem convenientemente ligados com programas de aplicação (que usam algumas dessas funções e dados) para formar executáveis.

    O termo "Biblioteca", abaixo, refere-se a qualquer biblioteca de software ou obra que tenha sido distribuída de acordo com esses termos. Uma "obra baseada na Biblioteca" significa tanto a Biblioteca como qualquer obra derivada, nos termos da legislação autoral: isto é, uma obra contendo a Biblioteca ou parte dela, seja sem alterações ou com modificações e/ou traduzida diretamente para outra linguagem. (Doravante, o termo "modificação" inclui, sem reservas, o termo "tradução").

    O "código-fonte" de uma obra significa o formato preferencial da obra para que sejam feitas modificações na mesma. Para uma biblioteca, o código-fonte completo significa todo o código fonte para todos os módulos contidos na mesma, além de quaisquer arquivos de definição de interface associados, além dos scripts utilizados para controlar a compilação e a instalação da biblioteca.

    Outras atividades que não a cópia, distribuição e modificação não são cobertas por esta Licença; elas estão fora de seu escopo. O ato de executar um programa usando a Biblioteca não tem restrições, e o resultado gerado a partir desse programa encontra-se coberto somente se seu conteúdo constituir uma obra baseada na Biblioteca (independente do uso da Biblioteca em uma ferramenta para escrevê-lo). Na verdade, isto dependerá daquilo que a Biblioteca faz e o que o programa que usa a biblioteca faz.

  2. Você pode copiar e distribuir cópias sem alterações do código-fonte completo da Biblioteca ao recebê-lo, em qualquer meio ou mídia, desde que publique, ostensiva e adequadamente, um aviso de direitos autorais (ou copyright) apropriado e uma notificação sobre a exoneração de garantias; mantenha intactas as informações, avisos ou notificações referentes a esta Licença e à ausência de qualquer garantia; e distribua uma cópia desta Licença junto com a Biblioteca.

    Você poderá cobrar um valor pelo ato físico de transferir uma cópia, e você pode oferecer, se quiser, a proteção de uma garantia em troca de um valor.

  3. Você pode modificar sua cópia ou cópias da Biblioteca ou qualquer parte dela, formando, assim, uma obra baseada na Biblioteca, bem como copiar e distribuir essas modificações ou obra, em conformidade com a Cláusula 1 acima, desde que atenda, ainda, a todas as seguintes condições:
    1. A obra modificada tem de ser, por si só, uma biblioteca de software.
    2. Você tem de fazer com que os arquivos modificados contenham avisos, em destaque, de que você modificou os arquivos e a data de qualquer modificação.
    3. Você tem de fazer com que a obra como um todo seja licenciada, sem nenhum custo, a todos os terceiros, de acordo com esta Licença.
    4. Se um dispositivo, na Biblioteca modificada, se referir a uma função ou a uma tabela de dados a ser fornecida por um programa de aplicação que usa esse dispositivo, outro que não um argumento transmitido quando o dispositivo é invocado, nesse caso, você terá de fazer um esforço de boa-fé para assegurar que, no caso de uma aplicação que não forneça essa função ou tabela, o dispositivo ainda assim opere, e irá realizar qualquer parte de sua finalidade que permanecer significativa.

      (Por exemplo, uma função de uma biblioteca para computar raízes quadradas tem uma finalidade que é completamente bem definida independentemente da aplicação. Por essa razão, a letra d, da Cláusula 2, exige que qualquer função ou tabela fornecida pela aplicação, usada por essa função, tem de ser opcional: se a aplicação não fornecê-la, a função de raízes quadradas deverá ainda assim computar raízes quadradas).

    Essas exigências se aplicam à obra modificada como um todo. Se partes identificáveis dessa obra não forem derivadas da Biblioteca e puderem ser consideradas razoavelmente, em si, como obras independentes e separadas, nesse caso, esta Licença e seus termos não se aplicarão a essas partes quando você distribui-las como obras separadas. Todavia, quando você distribuir essas mesmas partes como partes de um todo, que por si seja uma obra baseada na Biblioteca, a distribuição desse todo deverá ser realizada de acordo com esta Licença, cujas respectivas permissões para outros licenciados extendem-se à integralidade deste todo, dessa forma, a toda e qualquer parte, independentemente de quem a escreveu.

    Assim, esta cláusula não tem a intenção de afirmar direitos ou contestar os seus direitos sobre uma obra escrita inteiramente por você; a intenção é, antes, de exercer o direito de controlar a distribuição de obras derivadas ou obras coletivas baseadas na Biblioteca.

    Além disto, a simples agregação de outra obra, que não seja baseada na Biblioteca, à Biblioteca (ou a uma obra baseada na Biblioteca) em um volume de meio ou mídia de armazenamento ou distribuição, não inclui esta outra obra no âmbito desta Licença.

  4. Você poderá optar por aplicar os termos da Licença Pública Geral do GNU ao invés desta Licença, para uma determinada cópia da Biblioteca. Para tanto, você deverá alterar todos os avisos ou notificações que se refiram a esta Licença, para que eles se refiram à Licença Pública Geral comum do GNU, versão 2, ao invés desta Licença. (Se uma versão mais nova do que a versão 2 da Licença Pública Geral comum do GNU tiver sido gerada, então você poderá especificar essa versão, se preferir). Não faça nenhuma outra alteração nesses avisos ou notificações.

    Uma vez que essa alteração tenha sido feita em uma determinada cópia, ela é irreversível para esta cópia, passando a Licença Pública Geral comum do GNU a ser aplicada para todas as cópias e obras derivadas subseqüentes, feitas a partir dessa cópia.

    Essa opção é útil quando você desejar copiar parte do código da Biblioteca em um programa que não seja uma biblioteca.

  5. Você poderá copiar e distribuir a Biblioteca (ou uma parte ou obra derivada dela, de acordo com a Cláusula 2) em código-objeto ou formato executável, sob as Cláusulas 1 e 2 acima, desde que inclua todo o código-fonte correspondente, passível de leitura pela máquina, que deve ser distribuído sob os termos das Cláusulas 1 e 2 acima, em um meio ou mídia costumeiramente utilizado para o intercâmbio de software.

    Se a distribuição do código-objeto for feita pela oferta de acesso para cópia a partir de um local designado, então a permissão de acesso equivalente para copiar o código-fonte a partir do mesmo local atende a exigência de distribuição do código-fonte, mesmo que terceiros não sejam levados a copiar a fonte junto com o código-objeto.

  6. Um programa que não contenha nenhum derivativo de qualquer parte da Biblioteca, mas que seja desenhado para operar com a Biblioteca ao ser compilado ou ligado a ela, é chamado de uma "obra que usa a Biblioteca". Essa obra, isoladamente, não é uma obra derivada da Biblioteca e, portanto, fica de fora do âmbito desta Licença.

    Entretanto, a ligação de uma "obra que usa a Biblioteca" com a Biblioteca constitui um executável que é um derivado da Biblioteca (pois contém partes da Biblioteca), e não uma "obra que usa a Biblioteca". O executável é, assim, coberto por esta Licença. A Cláusula 6 estabelece os termos para a distribuição desses executáveis.

    Quando uma "obra que usa a Biblioteca" usar material de um arquivo de cabeçalho que é parte da Biblioteca, o código-objeto para a obra poderá ser uma obra derivada da Biblioteca, mesmo que o código-fonte não o seja. Para que isto seja verdade, é especialmente importante se a obra pode ser ligada sem a Biblioteca, ou se a obra é, em si mesma, uma biblioteca. O limiar para que isto seja verdade não é definido com precisão pela lei.

    Se um arquivo-objeto usar somente parâmetros numéricos, layouts e accessors da estrutura de dados, bem como pequenas macros e pequenas funções inline (dez linhas ou menos de extensão), então o uso do arquivo-objeto não é restrito, independente de ser ele legalmente uma obra derivada. (Executáveis contendo este código-objeto mais partes da Biblioteca continuam submetidos aos termos da Cláusula 6).

    Do contrário, se a obra for um derivado da Biblioteca, você poderá distribuir o código objeto da obra sob os termos da Cláusula 6. Quaisquer executáveis contendo esta obra também se submetmem à Cláusula 6, estejam ou não diretamente ligados à Biblioteca em si.

  7. Como exceção à Cláusula acima, você também pode combinar ou ligar uma "obra que usa a Biblioteca" à Biblioteca para produzir uma obra contendo partes da Biblioteca e distribuí-la de acordo com os termos de sua escolha, desde que estes termos permitam modificações na obra para uso próprio por parte do cliente e engenharia reversa para depuração dessas modificações.

    Em cada cópia da obra, você terá de colocar um aviso, em destaque, de que a Biblioteca foi usada e que ela e seu uso estão cobertos por esta Licença. Você deverá fornecer uma cópia desta Licença. Se, durante a execução, a obra exibir avisos ou notificações de direitos autorais (ou copyright), você terá de incluir, entre eles, o aviso de direitos autorais (ou copyright) referente à Biblioteca, bem como uma referência direcionando o usuário para a cópia desta Licença. Além disso, você dever tomar ao menos uma das seguintes providências:

    1. Incluir na obra todo o código-fonte da Biblioteca, passível de leitura pela máquina, incluindo quaisquer modificações que foram usadas na obra (as quais devem ser distribuídas conforme as Cláusulas 1 e 2 acima); e, se a obra for um executável ligado à Biblioteca, com toda a "obra que usa a Bilblioteca" passível de leitura pela máquina, como código-objeto e/ou código-fonte, de modo que o usuário possa modificar a biblioteca e, depois, religar para produzir um executável modificado contendo a Biblioteca modificada. (Fica entendido que o usuário que modificar o conteúdo dos arquivos de definições da Biblioteca não necessariamente será capaz de recompilar a aplicação para usar as definições modificadas).
    2. Usar um mecanismo adequado de biblioteca compartilhada para ligar com a Biblioteca. Um mecanismo adequado é aquele que (a) usa, ao tempo da execução, uma cópia da biblioteca já presente no sistema do computador do usuário, e (2) irá operar adequadamente com uma versão modificada da biblioteca, se o usuário instalar uma, desde que a versão modificada seja compatível com a interface da versão com a qual a obra foi feita.
    3. Incluir na obra uma oferta por escrito, válida por pelo menos 3 anos, oferencendo ao mesmo usuário os materiais especificados na letra "a" da Cláusula 6 acima, por um custo não superior ao custo de fazer esta distribuição.
    4. Se a distribuição da obra for feita com a permissão de acesso para copiar, a partir de um local designado, oferecer acesso equivalente para copiar os materiais acima especificados, a partir do mesmo local.
    5. Certificar-se se o usuário já recebeu uma cópia desses materiais ou de que você já enviou uma cópia a esse usuário.

    Para um executável, o formato exigido da "obra que usa a Biblioteca" deve incluir quaisquer dados e programas utilitários necessários para reprodução do executável a partir dele. Todavia, como uma exceção especial, os materiais a serem distribuídos não necessitam incluir algo que seja normalmente distribuído (tanto no formato fonte quanto binário) com os componentes mais importantes (compilador, kernel, e assim por diante) do sistema operacional no qual executável é executado, a menos que esse componente, em si, acompanhe o executável.

    Pode ocorrer que essa exigência contradiga as restrições da licença de outras bibliotecas proprietárias que normalmente não acompanham o sistema operacional. Essa contradição significa que você não pode utilizar ambas e a Biblioteca juntas em um executável distribuído por você.

  8. Você pode colocar dispositivos da biblioteca que sejam uma obra baseada na Biblioteca lado-a-lado em uma única biblioteca junto com outros dispositivos de bibliotecas, desde que uma distribuição separada da obra baseada na Biblioteca e dos outros dispositivos de bibliotecas seja, de outro modo, permitida e desde que você tome uma das seguintes providências:
    1. Incluir na biblioteca combinada uma cópia dessa obra baseada na Biblioteca sem a combinação com quaisquer outros dispositivos de biblioteca. Essa cópia tem de ser distribuída de acordo com as condições das cláusulas acima.
    2. Junto com a biblioteca combinada, fornecer um aviso, em destaque, sobre o fato de que parte dela é uma obra baseada na Biblioteca, e explicando onde encontrar o formato não combinado incluso dessa mesma obra.
  9. Você não poderá copiar, modificar, sublicenciar, ligar, ou distribuir a Biblioteca, exceto conforme expressamente disposto nesta Licença. Qualquer tentativa de, de outro modo, copiar, modificar, sublicenciar, ligar ou distribuir a Biblioteca é inválida, e automaticamente terminará seus direitos sob esta Licença. Todavia, terceiros que tiverem recebido cópias ou direitos de você, de acordo com esta Licença, não terão seus direitos rescindidos, enquanto estes terceiros mantiverem o seu pleno cumprimento.
  10. Você não é obrigado a aceitar esta Licença, uma vez que você não a assinou. Entretanto, nada mais concede a você permissão para modificar ou distribuir a Biblioteca ou suas obras derivadas. Esses atos são proibidos por lei se você não aceitar esta Licença. Portanto, ao modificar ou distribuir a Biblioteca (ou qualquer obra baseada na Biblioteca), você manifesta sua aceitação desta Licença para fazê-lo, bem como de todos os seus termos e condições para cópia, distribuição ou modificação da Biblioteca ou obras nela baseadas.
  11. A cada vez que você redistribuir a Biblioteca (ou qualquer obra nela baseada), o receptor automaticamente recebe uma licença do licenciante original para copiar, distribuir, ligar ou modificar a Biblioteca, sujeito a estes respectivos termos e condições. Você não poderá impor quaisquer restrições adicionais ao exercício, pelos receptores, dos direitos concedidos por este instrumento. Você não tem responsabilidade de promover o cumprimento desta licença por parte de terceiros.
  12. Se, como resultado de uma sentença judicial ou alegação de violação de patente, ou por qualquer outro motivo (não restrito às questões de patentes), forem impostas a você condições (tanto através de mandado judicial, contrato ou qualquer outra forma) que contradigam as condições desta Licença, você não estará desobrigado quanto às condições desta Licença. Se você não puder atuar como distribuidor de modo a satisfazer simultaneamente suas obrigações sob esta Licença e quaisquer outras obrigações pertinentes, então, como conseqüência, você não poderá distribuir a Biblioteca de nenhuma forma. Por exemplo, se uma licença sob uma patente não permite a redistribuição por parte de todos aqueles que tiverem recebido cópias, direta ou indiretamente de você, sem o pagamento de royalties, então, a única forma de cumprir tanto com esta exigência quanto com esta licença será deixar de distribuir, por completo, a Biblioteca.

    Se qualquer parte desta Cláusula for considerada inválida ou não executável, sob qualquer circunstância específica, o restante da cláusula deverá continuar a ser aplicado e a cláusula, como um todo, deverá ser aplicada em outras circunstâncias.

    Esta cláusula não tem a finalidade de induzir você a infringir quaisquer patentes ou direitos de propriedade, nem de contestar a validade de quaisquer reivindicações deste tipo; a única finalidade desta cláusula é proteger a integridade do sistema de distribuição do software livre, o qual é implementado mediante práticas de licenças públicas. Muitas pessoas têm feito generosas contribuições à ampla gama de software distribuído através desse sistema, confiando na aplicação consistente deste sistema; cabe ao autor/doador decidir se deseja distribuir software através de qualquer outro sistema e um licenciado não pode impor esta escolha.

    Esta cláusula visa deixar absolutamente claro o que se acredita ser uma conseqüência do restante desta Licença.

  13. Se a distribuição e/ou uso da Biblioteca for restrito em determinados países, tanto por patentes ou por interfaces protegidas por direito autoral, o titular original dos direitos autorais que colocar a Biblioteca sob esta Licença poderá acrescentar uma limitação geográfica de distribuição explícita excluindo esses países, de modo que a distribuição seja permitida somente nos países ou entre os países que não foram excluídos dessa forma. Nesse caso, esta Licença passa a incorporar a limitação como se esta tivesse sido escrita no corpo desta Licença
  14. A Free Software Foundation [Fundação Software Livre] poderá de tempos em tempos publicar versões revisadas e/ou novasda Licença Pública Geral Menor. Essas novas versões serão semelhantes em espírito à presente versão, podendo, porém, ter diferenças nos detalhes, para tratar de novos problemas ou preocupações.

    Cada versão recebe um número distinto de versão. Se a Biblioteca especificar um número de versão desta Licença, aplicável à Biblioteca ou a "qualquer versão posterior", você terá a opção de seguir os termos e condições tanto daquela versão como de qualquer versão posterior publicada pela Free Software Foundation. Se a Biblioteca não especificar um número de licença da versão, você poderá escolher qualquer versão já publicada pela Free Software Foundation.

  15. Se você desejar incorporar partes da Biblioteca em outros programas livres cujas condições de distribuição sejam incompatíveis com estas, escreva ao autor para solicitar permissão. Para software cujos direitos autorais pertencerem à Free Software Foundation, escreva à Fundação; algumas vezes, fazemos exceções nesse sentido. Nossa decisão será guiada pelos dois objetivos de preservar a condição livre de todos os derivados de nosso software livre e de promover o compartilhamento e reutilização de softwares, de modo geral.

    EXCLUSÃO DE GARANTIA

  16. COMO A BIBLIOTECA É LICENCIADA SEM CUSTO, NÃO HÁ NENHUMA GARANTIA PARA A BIBLIOTECA, NO LIMITE PERMITIDO PELA LEI APLICÁVEL. EXCETO QUANDO DE OUTRA FORMA ESTABELECIDO POR ESCRITO, OS TITULARES DOS DIREITOS AUTORAIS E/OU OUTRAS PARTES FORNECEM A BIBLIOTECA "NO ESTADO EM QUE SE ENCONTRA", SEM NENHUMA GARANTIA DE QUALQUER TIPO, TANTO EXPRESSA COMO IMPLÍCITA, INCLUINDO, DENTRE OUTRAS, AS GARANTIAS IMPLÍCITAS DE COMERCIABILIDADE E ADEQUAÇÃO PARA UMA FINALIDADE ESPECÍFICA. O RISCO INTEGRAL QUANTO À QUALIDADE E DESEMPENHO DA BIBLIOTECA É ASSUMIDO POR VOCÊ. CASO A BIBLIOTECA CONTENHA DEFEITOS, VOCÊ ARCARÁ COM OS CUSTOS DE TODOS OS SERVIÇOS, REPAROS OU CORREÇÕES NECESSÁRIAS.
  17. EM NENHUMA CIRCUNSTÂNCIA, A MENOS QUE EXIGIDO PELA LEI APLICÁVEL OU ACORDADO POR ESCRITO, QUALQUER TITULAR DE DIREITOS AUTORAIS OU QUALQUER OUTRA PARTE QUE POSSA MODIFICAR E/OU REDISTRIBUIR A BIBLIOTECA, CONFORME PERMITIDO ACIMA, SERÁ RESPONSÁVEL PARA COM VOCÊ POR DANOS, INCLUINDO ENTRE OUTROS QUAISQUER DANOS GERAIS, ESPECIAIS, FORTUITOS OU EMERGENTES, ADVINDOS DO USO OU IMPOSSIBILIDADE DE USO DA BIBLIOTECA (INCLUINDO, ENTRE OUTROS, PERDA DE DADOS, DADOS SENDO GERADOS DE FORMA IMPRECISA, PERDAS SOFRIDAS POR VOCÊ OU TERCEIROS OU A IMPOSSIBILIDADE DA BIBLIOTECA DE OPERAR COM QUALQUER OUTRO SOFTWARE), MESMO QUE ESSE TITULAR, OU OUTRA PARTE, TENHA SIDO AVISADO SOBRE A POSSIBILIDADE DESSES DANOS.

FINAL DOS TERMOS E CONDIÇÕES

Como Aplicar Estes Termos para Suas Novas Bibliotecas

Se você desenvolver uma nova biblioteca e quiser que ela seja da maior utilidade possível para o público, nós recomendamos fazer dela um software livre que todos possam redistribuir e modificar. Você pode fazer isto permitindo a redistribuição sob estes termos (ou, alternativamente, sob os termos da Licença Pública Geral comum)

Para fazer isto, anexe as notificações seguintes à biblioteca. É mais seguro anexá-las ao começo de cada arquivo-fonte, de modo a transmitir do modo mais eficiente a exclusão de garantia; e cada arquivo deve ter ao menos a linha de "direitos autorais reservados" e uma indicação de onde a notificação completa se encontra.

     uma linha para informar o nome da biblioteca e uma breve idéia do que ela faz.
     Direitos Autorais Reservados (C) <ano>  nome do autor
     
     Esta biblioteca é software livre; você pode redistribuí-la e/ou
     modificá-la sob os termos da Licença Pública Geral
     Menor do GNU conforme publicada pela Free Software Foundation; tanto a
     versão 2.1 da Licença, ou (a seu critério) qualquer versão posterior.
     
     Esta biblioteca é distribuído na expectativa de que seja útil,
     porém, SEM NENHUMA GARANTIA; nem mesmo a garantia implícita de
     COMERCIABILIDADE OU ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública
     Geral Menor do GNU para mais detalhes.
     
     Você deve ter recebido uma cópia da Licença Pública Geral Menor
     do GNU junto com esta biblioteca; se não, escreva para a Free Software
     Foundation, Inc., no endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.

Inclua também informações sobre como contatar você por correio eletrônico e por meio postal. Você também pode solicitar a seu empregador (se você for um programador) ou a sua instituição acadêmica, se for o caso, para assinar uma "renúncia de direitos autorais" sobre a biblioteca, se necessário. Segue um exemplo; altere os nomes:

     A Yoyodyne Ltda., neste ato, renuncia a todos eventuais direitos autorais sobre a
     biblioteca 'Frob' (uma biblioteca para ajustar fechaduras), escrita por James
     Random Hacker.
     
     <Assinatura de Ty Coon>, 1 de abril de 1990
     Ty Coon, Presidente

Isso é tudo! geomview-1.9.5/doc/geomview-pt_BR.html/Historia.html0000644000175000017500000001152212310162311017266 00000000000000 Historia - Manual do Geomview

Next: , Previous: Copiando, Up: Top


História do Desenvolvimento do Geomview

Geomview foi originalmente escrito no Geometry Center da the University of Minnesota in Minneapolis. O Geometry Center era um centro de pesquisa e educação fundado pela National Science Foundation, com a missão de promover pesquisa e comunicação de assuntos relacionados à matemática. A maioria do trabalho era direcionado ao uso de computadores para ajudar a visualização de conceitos matemáticos.

O projeto que eventualmente levou ao Geomview começou no verão de 1988 com o trabalho de Pat Hanrahan sobre um programa de visualização chamado MinneView. Pouco tempo depois Charlie Gunn começou o desenvolvimento da OOGL (Object Oriented Graphics Language) juntamente com o MinneView. Muitas pessoas comtribuiram para a OOGL e o MinneView, incluindo Stuart Levy, Mark Meuer, Tamara Munzner, Steve Anderson, Mario Lopez, Todd Kaplan.

Em 1991 o staff do Geometry Center começou o trabalho sobre uma nova e melhorada versão da OOGL, e um novo e melhorado programa de visualização, o qual eles chamaram Geomview. Naquele tempo essencialmente o único jogo no comercio para gráficos interativos em três dimensões era Silicon Graphics (SGI), de forma que Geomview foi desenvolvido inicialmente em estações de trabalho SGI, usando a IRIS GL. A primeira versão foi finalizada em Janeiro de 1992. Essa primeira versão tornou-se muito popular entre visitantes do Geometry Center, e através do ftp do Centro (isso ocorreu antes do advento da web) pessoas em outras instituições começaram a usar essa primeira versão também.

Adicionalmente a estações de trabalho SGI o Geometry Center tinha algumas poucas estações NeXT completas, de forma que após Geomview estar sendo executado em máquinas SGIs a equipe desenvolveu uma versão para NeXTStep também. Nessa época ouveram muitos milhares de pessoas usando Geomview ao redor do mundo.

Alguns anos depois a equipe portou Geomview para o X windows e a OpenGL, e eventualmente, com o desaparecimento da NeXT, a versão para NeXT seguiu o mesmo caminho.

Nessa missão de incentivar a comunicação entre pesquisadores e educadores, o Geometry Center desenvolveu um web site, www.geom.umn.edu, mais tarde em 1993. Esse foi um dos primeiros 300 sítios na web que existiram no mundo. Uma parte desse sítio web era certamente devotado ao Geomview, e ajudou a propagar o trabalho durante sua existência.

O Geometry Center fechou suas instalações de "tijolos e cimento" em Agosto de 1998 (NSF cortou suas verbas), mas o sítio web continuou a existir, e o Geomview continuou a ser popular ao redor do mundo. Em Dezembro de 1999 algum membro da equipe original do Geometry Center configurou http://www.geomview.org como casa permanente na web para o Geomview.

Os autores originais do Geomview, bem como vários outros volunários ao redor do mundo, estão ainda ativamente envolvidos na utilização e no desenvolvimento do Geomview.

geomview-1.9.5/doc/geomview-pt_BR.html/Autores.html0000644000175000017500000000406712310162311017134 00000000000000 Autores - Manual do Geomview

Previous: Historia, Up: Historia


Autores

Tamara Munzner, Stuart Levy, e Mark Phillips são os autores originais do Geomview. Celeste Fowler, Charlie Gunn, e Nathaniel Thurston também fazem contribuições sgnificativas. Daniel Krech e Scott Wisdom fizeram o NeXTStep e a adaptação do RenderMan, e Daeron Meyer e Tim Rowley fizeram a adaptação para o X windows. Muitos outros membros do estado maior do Geometry Center, bem como muitas pessoas em muitos lugares, também contribuíram.

Mark Phillips escreveu esse manual, com ajuda substancial de Stuart Levy e Tamara Munzner. Incontáveis usuários do Geomview também foram de grande ajuda por meio da leitura do manual e indicando nossos enganos. geomview-1.9.5/doc/geomview-pt_BR.html/Plantaformas.html0000644000175000017500000000624612310162311020142 00000000000000 Plantaformas - Manual do Geomview

Next: , Previous: Historia, Up: Top


Plantaformas Suportadas

Geomview 1.9 pode – em princípio – compilar e executar sobre quaisquer claramente recentes sistemas operacionais semelhantes ao Unix. Especificamente, Geomview executa sobre Linux e sobre Cygwin (Cygwin emula um ambiente semelhante ao SystemV Unix environment sob o Microsoft Windows). Desafortunadamente Geomview compila com MacOS X (Darwin), mas aparentemente comunicações com Geomview por meio de pipes e sockets causam falha de segmentacão. Sinta-se livre para consertar essa falha! Veja Contribuindo, para detalhes. geomview-1.9.5/doc/geomview-pt_BR.html/Pronuncia.html0000644000175000017500000000413012310162311017437 00000000000000 Pronuncia - Manual do Geomview

Next: , Previous: Plantaformas, Up: Top


Como Pronunciar “Geomview“

A palavra 'Geomview' é uma combinação da primeira sílaba da palavra 'geometry', e da palavra 'view'. Os autores pronunciam Geomview como uma palavra oxítona, isto é, tonicidade na primeira sílaba.

       GE-om-view

Algumas pessoas colocam a tonicidade na segunda sílaba, onde Geomview cai na palavra 'geometry', mas os autores originais, que criaram o nome, preferem a pronúncia com tonicidade na primeira sílaba. geomview-1.9.5/doc/geomview-pt_BR.html/Visao-Geral.html0000644000175000017500000001205212310162311017614 00000000000000 Visao Geral - Manual do Geomview

Next: , Previous: Pronuncia, Up: Top


1 Visão Geral

O principal objetivo do Geomview é mostrar objetos cuja geometria é fornecida, permitindo controle interativo sobre detalhes tais como ponto de visão, velocidade de movimento, aparência de superfícies e linhas, e assim por diante. Geomview pode manusear qualquer número de objetos e permite controle coletivo ou separado sobre eles.

A maneira mais simples de usar Geomview é como um visualizador independente para ver e controlar objetos. Geomview pode mostrar objetos descritos em uma variedade de formatos de arquivo. Geomview é acompanhado com uma larga variedade de objetos como exemplo, e você pode criar seus próprios objetos.

Você pode também usar Geomview para manusear os dados a serem mostrados provenientes de outro programa que está sendo executado simultâneamente. Como o outro programa modifica os dados, a imagem no Geomview reflete as modificações. Programas que geram objetos e utilizam o Geomview para mostrá-los são chamados módulos externos. Módulos externos podem controlar quase todos os aspectos do Geomview. A idéia aqui é que muitos aspectos de visualização e partes da interação de programas geométricos são independentes do conteúdo geométrico e podem ser coletados conjuntamente em uma peça simples de programa que pode ser usada em uma larga variedade de situações. O autor de um módulo externo pode concentrar-se sobre a implementação dos algorítmos desejados e deixar os aspectos de visualização ao Geomview. Geomview é acompanhado por uma coleção de módulos externos a título de exemplo, e esse manual descreve como escrever seu próprio módulo externo.

Geomview é o produto de um esforço no Geometry Center para disponibilizar um software de geometria interativa que é particularmente apropriado para pesquisa matemática e educação. Em particular, Geomview pode mostrar coisas no espaço hiperbólico e no espaço esférico bem como no espaço Euclidiano.

Geomview permite múltiplos objetos e câmeras que são controlados independentemente. As câmeras fornecem controle interativo para movimento, aparências (incluindo iluminação, sombreamento, e materiais), selecionando um objeto, aresta ou nível de vértice, instantâneos em um arquivo de imagem SGI ou no formato Renderman RIB, a adição ou apagamento de objetos é possível através do controle direto do mouse, painéis de controle, e teclas de atalho via teclado.

Geomview suporta os seguintes tipos de dados simples: poliedros com vértices compartilhados (.off), quadriláteros, malhas retangulares, vetores, e ajustes em superfícies de Bezier de grau arbitrário incluindo ajustes racionais. Hierarquías de objetos podem ser construídas com listas de objetos e instâncias de objeto(s) transformado(s) por uma ou mais matrizes 4x4. Porções arbitrárias de modificações de hierarquías podem ser transmitidas por meio da criação de referências nomeadas.

Geomview pode mostrar saídas gráficas tridimensionais provenientes do Mathematica e do Maple. geomview-1.9.5/doc/geomview-pt_BR.html/Tutorial.html0000644000175000017500000003700012310162311017306 00000000000000 Tutorial - Manual do Geomview

Next: , Previous: Visao Geral, Up: Top


2 Tutorial

Esse capítulo conduzirá você através de alguns usos elementares do Geomview. Traba-lhando do começo ao fim desse capítulo de frente a um computador onde você pode tentar acompanhar os exemplos fornecidos aqui você receberá um pouco do que pode ser feito com Geomview.

Para iniciar o Geomview, coloque seu usuário e sua senha no computador e abra uma janela de shell. Uma janela de shell é uma janela na qual você pode digitar comandos Unix; o prompt na janela usualmente termina com um '%'. Na janela de shell (o cursor do mouse deve estar posicionado sobre a janela) digite o seguinte (<Enter> aqui significa pressione a tecla "Enter"):

     geomview tetra dodec <Enter>

Esse comando inicia o Geomview e chama dois objetos exemplo, um tetraedro e um dodecaedro. Após poucos segundos três janelas irão aparecer; see Figure.

figs/initial.png

Figura 2.1: Tela Inicial do Geomview.

O painel à esquerda é o painel de controle principal do Geomview; Esse painel é chamado de painel Main (principal). O painel menor ao centro é o painel Tools (de ferramentas) e serve para selecionar diferentes tipos de movimentos. A janela do lado direito é a janela de câmera e nessa janela você vê um tetraedro grande e um dodecaedro que está parcialmente obscurecido pelo tetraedro.

Geomview tem alguns painéis mas por padrão ele mostra somente esses três. iremos descrever alguns aspectos desses três e alguns dos outros nesse tutorial. Você pode ler mais sobre esses e outros painéis nos capítulos adiante neste manual.

Coloque o cursor do mouse na janela de câmera e pressione e mantenha pressionado o botão esquerdo do mouse. Agora, enquanto mantém pressionado o botão, lentamente mova o mouse com movimentos pequenos. Você verá a figura rotacionar na direção na qual você mover o mouse. Se você liberar o botão do mouse enquanto move o mesmo, a figura continua girando. Para parar o movimento de rotação, mantenha o mouse sobre a figura e pressione rapidamente o botão esquerdo do mesmo.

Geomview utiliza o modelo da esfera de vidro para os movimentos iniciados através do mouse. Isso significa que você está supondo o objeto como estando dentro de uma esfera invisível e o cursor do mouse como sendo uma alça fora da esfera provida de uma ventosa. Quando você mantém pressionado o botão esquerdo do mouse, a ventosa da alça gruda na esfera; quando você libera o botão do mouse, a ventosa da alça libera a esfera. Movendo o mouse enquanto mantém pressionado o botão faz com que a esfera (e conceqüêntemente o objeto) mova-se na mesma direção que o mouse.

Adicionalmente para os dois sólidos que estão atualmente na tela você pode também ver duas molduras de fios em forma de caixa na janela de câmera. Essas são as "caixas associadas" dos dois objetos. Por padrão Geomview coloca uma caixa associada em torno de cada objeto que é mostrada de forma que você tenha uma idéia de o quanto grande o objeto é.

Note que quando você move o mouse em torno do tetraedro e do dodecaedro eles se movem como se fossem uma única figura. Isso ocorre porque por padrão o que você está movendo atualmente é o "World" (objeto mundo). Para mover um dos objetos individualmente em lugar de o objeto mundo como um todo, mova o cursor do mouse para o navegador de alvos (Targets) no painel principal (Main). Clique (qualquer botão) sobre a palavra tetra. Isso faz com que o tetraedro seja o "objeto alvo". Agora mova o cursor de volta à janela de câmera e você poderá rotacionar apenas o tetraedro.

O movimento que você aplicou até agora foi a rotação, porque esse é o modo de modo de movimento selecionado no painel de ferramentas (Tools). Para efetuar o movimento de translação em lugar do movimento de rotação, clique sobre o botão translação (Translate). Agora quando você mover o mouse na janela de câmera enquanto mantém pressionado o botão esquerdo, o tetraedro (que deve ser ainda o objeto alvo de antes) irá ser transladado na direção que você move o mouse. Note que você pode transladar o tetraedro na direção da borda da janela enquanto você mantém pressionado o botão esquerdo do mouse. Se você liberar o botão do mouse enquanto move o mesmo, o tetraedro irá continuar o movimento sozinho. O tetraedro mover-se-á ao contrário do que ocorria antes muito rapidamente de forma que é muito fácil perder o rastro de onde ele se encontra.

Se você acidentalmente perder o tetraedro através de translação para muito longe da janela de visão, você pode pegá-lo de volta através de um clique sobre o botão Centro (Center) no painel de ferramentas (Tools). Isso fará com que o tetraedro retorne para a sua posição inicial.

Clique sobre o botão Centro (Center) para trazer o tetraedro ao centro da janela de câmera, e então coloque-o em uma posição de forma que você possa ver completamente o dodecaedro.

Seu objeto mundo agora tem dois objetos que estão um ao lado do outro. Você pode ver o dodecaedro no meio da janela de câmera e pode ver parte do tetraedro parcialmente fora da janela de câmera. Volte para o navegador de alvos (Targets) no painel principal (Main) e clique sobre o "World" para selecionar o referido objeto mundo novamente. Agora clique sobre o botão "Olhar Para" (Look At) no painel de ferramentas (Tools). Você pode ver o dodecaedro e o tetraedro ajustando-se ao meio da janela (figura see figlookatworld). O botão "Olhar Para" (Look At) posiciona a câmera em uma posição tal que o objeto alvo fique centrado na janela.

figs/fig2.png

Figura 2.2: Olhando para o Objeto Mundo.

Agora coloque o cursor sobre o meio do dodecaedro e dê sobre ele um duplo clique com o botão direito do mouse. Isso significa clicar no mouse para baixo e para cima duas vezes em uma rápida sucessão. Note que o dodecaedro torna-se o objeto alvo; você pode ver isso no navegador de alvos (Targets) do painel principal (Main). Um duplo clique no botão direito do mouse sobre um objeto é outra forma de fazer esse objeto tornar-se o objeto alvo.
figs/ap.png

Figura 2.3: A Painel Aparência.

Vá para o menu Inspect no topo do painel principal (Main) e selecione Aparência (Appearance). Isso faz aparecer o painel "Aparência" (Appearance). Quando ele aparece, se estiver parcialmente obscurecido por outra janela do Geomview você pode movê-lo para um lado arrastando sua moldura com o botão do meio do mouse pressionado.

O painel Aparência (Appearance) permite a você controlar várias coisas sobre a maneira como o Geomview desenha objetos. Note os botões rotulados com [af] Faces e [ae] Edges (arestas). Clique sobre o [ae] Edges uma vez, e note que Geomview agora ressalta/destaca as arestas do dodecaedro. Clique sobre o [ae] Edges novamente e as arestas desaparecem. Clique muitas vezes e assista as arestas indo e voltando. Quando você tiver feito isso o suficiente, deixe as arestas habilitadas e clique sobre o botão [af] Faces. Essa ação alterna entre exibir ou não as faces. Clique sobre o botão novamente para de forma que a exibição das face fique habilitada.

Agora clique sobre o botão [Cf] Faces sob a palavra COLOR. Um painel de escolha de cores aparecerá (see Figure).

figs/color.png

Figura 2.4: Painel de Escolha de Cores.

Note os três botões deslizantes, H, S, e V, controlando a matiz (hue), saturação, e valor (iluminação). Clicando sobre o botão HSV fornece um diferente conjunto de botões deslizantes, um para vermelho (red), outro para verde (green), e outro para azul ( blue). Valores numéricos para ambos os sistemas de cores RGB e HSV podem ser vistos ou editados na parte inferior do painel. A cor inicial do dodecaedro foi especificada no arquivo dodec que você chamou quando iniciamos o Geomview. A cor que você especificou com o painel de cores sobrescreveu as cores antigas. Você pode ajustar a intensidade da cor com o botão deslizante Intensity. Quando você encontrar uma cor que você gosta, clique sobre o botão Done.

Agora coloque o cursor do mouse em algum lugar sobre sobre o fundo cinza da janela de câmera e duplo-clique no botão direito; isso seleciona "World" como objeto alvo. Clique no botão Look At para para olhar para o objeto mundo novamente.

Note que no painel de Aparência (Appearance) as escolhas dos botões se modificavam à medida que o lado esquerdo também mudava com o dodecaedro. Isso ocorre porque o painel Appearance sempre mostra as escolhas para o objeto alvo, que agora é o objeto mundo, o qual ainda tem suas escolhas padrão.

Clique sobre o botão [ab] BBox sob a palavra Draw. A caixa associada desaparece. agora ponha o cursor de volta na janela de câmera. No teclado, digite as teclas a b. Note que a caixa associada aparece novamente. a b é o atalho de teclado para o botão que alterna entre a exibição ou não da caixa associada; a sequência de caracteres "[ab]" aparece sobre o botão para indicar isso. A maioria dos botões do Geomview possuem atalhos de teclado que você pode usar se preferir. Isso será últil quando você estiver familiarizado com o Geomview e não quiser ter de se mover entre uma montanha de painéis.

Agora selecione o tetraedro, use qualquer das duas formas: duplo-clicando o botão direito do mouse sobre o tetraedro, ou selecionando "tetra" no navegador de alvos (Targets). Então clique sobre o botão Delete do menu Edit no painel principal (Main). O tetraedro deve desaparecer. Essa é a forma de você se livrar de um objeto.

Você pode também chamar objetos de dentro do Geomview. Clique sobre o menu File no painel principal (Main) e escolha abrir (Open). O painel de arquivos (Files) irá aparecer. Abaixo do meio desse painel, onde se lê Path List, temos um navegador com três linhas dentro dele; a segunda linha é um diretório com montanhas de exemplos do Geomview. Clique sobre aquela segunda linha; see Figure. Role para baixo na lista de arquivos até você ver tref.off. Clique sobre aquela linha, e então clique sobre o botão OK. Um grande tubo em forma de trevo irá aparecer em sua janela. Clique sobre o botão Hide no painel Files para dispensar o painel.

figs/secondlinelist.png

Figura 2.5: O Painel de Arquivos.

Agora clique sobre o botão Reset no painel de ferramentas (Tools). Isso fará com que todas as figuras retornem ao centro da janela de câmera. Você pode ver um dodecaedro e uma protuberância do trevo (see Figure).

Brinque com a protuberância do trevo e o dodecaedro. Faça experiências com alguns outros botões no painel de ferramentas (Tools). Tente colorir o trevo com o painel de aparência (Appearance).

Para um tutorial sobre criar seus próprios objetos para chamá-los dentro do Geomview, veja doc/oogltour distribuido com Geomview. As coisas naquele arquivo irão ser incorporadas em futuras versões desse manual.

figs/trefdodecinter.png

Figura 2.6: Trevo e Dodecaedro.

geomview-1.9.5/doc/geomview-pt_BR.html/figinitial.html0000644000175000017500000000010612310162311017617 00000000000000 geomview-1.9.5/doc/geomview-pt_BR.html/figlookatworld.html0000644000175000017500000000011212310162311020524 00000000000000 geomview-1.9.5/doc/geomview-pt_BR.html/figappearance.html0000644000175000017500000000011112310162311020261 00000000000000 geomview-1.9.5/doc/geomview-pt_BR.html/figcolorchooser.html0000644000175000017500000000011312310162311020665 00000000000000 geomview-1.9.5/doc/geomview-pt_BR.html/figfilespanel.html0000644000175000017500000000011112310162311020304 00000000000000 geomview-1.9.5/doc/geomview-pt_BR.html/figtrefdodec.html0000644000175000017500000000011012310162311020120 00000000000000 geomview-1.9.5/doc/geomview-pt_BR.html/Interacao.html0000644000175000017500000000575612310162311017425 00000000000000 Interacao - Manual do Geomview

Next: , Previous: Tutorial, Up: Top


3 Interação

Esse capítulo descreve como você interage com Geomview através do mouse e do teclado.

geomview-1.9.5/doc/geomview-pt_BR.html/Iniciando-o-Geomview.html0000644000175000017500000000452712310162311021424 00000000000000 Iniciando o Geomview - Manual do Geomview

3.1 Iniciando o Geomview

A forma usual para iniciar o Geomview é digitar geomview <Enter> em uma janela de shell (<Enter> significa pressionar a tecla "Enter"). Esse procedimento carrega o Geomview na memória do computador em uns poucos segundos; uma ou mais janelas irão aparecer e você pode começar a interagir com o Geomview imediatamente.

É também possível especificar ações para o Geomview executar no momento de iniciar fornecendo argumentos na linha de comando do shell. Veja Opcoes de Linha de Comando. geomview-1.9.5/doc/geomview-pt_BR.html/Opcoes-de-Linha-de-Comando.html0000644000175000017500000002307112310162311022321 00000000000000 Opcoes de Linha de Comando - Manual do Geomview

3.2 Opções de Linha de Comando

Aqui estão as opções de linha de comando que o Geomview permite:

-b r g b
Escolhe a cor de fundo da janela de câmera para valores fornecidos de r g b.
-c arquivo
Interpreta os comandos GCL em arquivo, que pode ser o símbolo especial - para a entrada padrão. Para uma descrição de GCL, veja GCL.
-c comando
Comandos podem também serem fornecidos literalmente, como em
          -c "(ui-panel main off)"

Uma vez que comando inclui parêntesis, que possuem significado especial para o shell, comando deve receber apóstrofo. Multiplas opções -c são permitidas.

-wins n
Faz com que Geomview mostre inicialmente n janelas de câmera.
-wpos largura,altura[@xmin,ymin]
Especifica a localização inicial e o tamanho da primeira janela de câmera. Os valores para largura, altura, xmin, e ymin estão em coordenadas de tela (pixel).
-M[cg][ps[un|in|in6]] PIPENOME|TCPPORT
A opção ‘-M’ aceita modificadores: um sufixo ‘g’ espera dados geométricos (o padrão), enquanto um sufixo ‘c’ espera comandos GCL. Um ‘p’ implica que a conecção pode usar um pipe nomeado (o padrão para tudo exceto para "NeXT"), enquanto ‘s’ implica no uso de um "UNIX-domain socket" (o padrão em "NeXT"). Uma vez que na versão 1.9 do Geomview "Internet domain sockets" são também suportados; use ‘sin’ para fazer o Geomview escutar uma porta IPv4 fornecida por TCPPORT, ou use ‘sin6’ para fazer Geomview escute uma porta IPv6 (também como especificado em TCPPORT). ‘sun’ é um sinônimo para ‘s’, i.e. use o "Unix domain socket" com o nome PIPENOME. Se PIPENOME inicia com uma barra ('/'), então esse nome é assumido ser um caminho absoluto, de outra forma o pipe nomeado ou socket é criado sob o diretório ${TMPDIR}/geomview/.

Escutando fluxo de comando em portas TCP pode ser um risco de segurança, como Geomview por si mesmo não toma nenhum tipo de precaução de segurança, Geomview simplesmente executa todos os comandos alimentados a ele através do socket de rede. Isso também implica entrada e saída para unidades de armazenamento locais devem ser permitidas remotamente.

Exemplos:

-M nome_de_objeto
Mostra (possivelmente mudando dinamicamente) geometria enviada de programas geomstuff ou togeomview. Essa opção "-M" escuta o pipe nomeado /tmp/geomview/nome_de_objeto; você pode conseguir o mesmo efeito com os comandos de shell abaixo:
               mkdir /tmp/geomview
               mknod /tmp/geomview/nome_de_objeto p

(assumindo que o diretório e o pipe nomeado não existam atualmente), então executando o comando GCL:

               (geometry nome_de_objeto  <
               /tmp/geomview/nome_de_objeto)

(veja (geometry ...))

-Mc pipenome
Como ‘-M’ acima, mas espera comandos GCL, em lugar de dados geométricos OOGL, na conecção.
-Mcs nome
Lê comandos a partir do "UNIX-domain socket" nomeado. /tmp/geomview/nome
-Mcsin 40000
Lê comandos a partir da porta IPv4 ‘40000’. Geomview por si mesmo não toma qualquer precaução de segurança, de forma que "-Mcsin 40000" pode ser um risco de segurança.

-noopengl
Desabilita o uso de OpenGL para (possivelmente) conversão acelerada de hardware, mesmo que o binário do Geomview tenha suporte a OpenGL compilado internamente. "-noopengl" também desabilita o suporte a transparência e texturas na janelas de câmera. Instantâneos "RenderMan" ainda terão a transparência correta e suporte a alguma textura limitada.
-nopanels
Inicia sem mostrar nenhum painel, somente a janelas gráficas. Painéis podem ser invocados mais tarde da forma usual com as teclas de atalho Px ou com comando ui-panel. Veja (ui-panel ...).
-noinit
Não lê nenhum arquivo de inicialização. Por padrão, Geomview lê o arquivo .geomview do sistema, seguido daqueles em ${HOME}/.geomview e em ./.geomview.
-e modulo
Inicial um módulo externo; modulo é o nome associado ao módulo chamado, aparecendo no painel principal no navegador de "Applications", como definido pelo comando emodule-define. Veja (emodule-define ...).
-start module args ...
Como -e mas permite a você enviar argumentos para o módulo externo. "–" sinaliza o fim da lista de argumentos; o "–" pode ser omitido se for o último argumento na linha de comando do Geomview.
-run coamando-shell args ...
Como "-start" mas toma o caminho de arquivos do executável do módulo externo em lugar do nome do módulo. Os caminhos de arquivo de todos os diretórios de módulos conhecidos são anexados ao final do caminho de busca do UNIX quando for invocado o comando-shell.
geomview-1.9.5/doc/geomview-pt_BR.html/Interacao-Basica.html0000644000175000017500000002320712310162311020574 00000000000000 Interacao Basica - Manual do Geomview

Next: , Previous: Opcoes de Linha de Comando, Up: Interacao


3.3 Interacao Basica: O Painel Principal

Normalmente quando você invoca Geomview, três janelas aparecem: O painel principal (Main), o painel de ferramentas (Tools), e uma janela de câmera. Geomview tem muitas outras janelas mas muitas coisas podem ser realizadas com essas três de forma que por padrão as outras não aparecem. Essa seção do manual introduz alguns conceitos básicos que são usados nas seções restantes do manual e descreve o painel principal (Main).

figs/main.png

Figura 3.1: O Painel Principal

Geomview pode mostrar um número arbitrário de objetos simultaneamente. O navegador Targets no painel principal (Main) mostra uma lista de todos os objetos dos quais Geomview atualmente abertos. Esse navegador tem uma linha para cada objeto que você tiver chamado, adicionalmente algumas linhas para outros objetos. Um desses outros objetos é chamado World e corresponde a todos os objetos atualmente chamados, tratados como se eles fossem um objeto. A maioria das operações que você pode fazer sobre um objeto, tais como aplicar um movimento ou mudar uma cor, pode também ser feita para o objeto "World".

O navegador de alvos (Targets) também possui uma entrada para cada câmera. Por padrão existe somente uma câmera; é possível adicionar mais delas através da entrada New Camera do painel principal (Main) via menu File. Geomview trata câmeras na maioria das vezes como trata objetos geométricos. Por exemplo, você pode mover câmeras pelas pro-ximidades e adicioná-las e apagá-las como objetos geométricos. Câmeras não são mostradas na tela como um objeto que você vê. Cada câmera tem uma janela de câmera separada que mostra a visão como vista através da lente daquela câmera. (É possível para cada câmera mostrar uma representação geométrica de outras câmeras. Veja Cameras.)

Devido ao fato de Geomview tratar câmeras e objetos geométricos muito similarmente, o termo objeto nessa documentação é usado para referir-se a qualquer dos dois indistintamente. Quando precisamos distinguir entre os dois tipos de objetos, usamos o termo "geom" para denotar um objeto geométrico e a palavra câmera para denotar uma câmera.

O objeto que está selecionado (luminosidade alta) no navegador "Targets" é chamado objeto alvo. Esse é o objeto que recebe quaisquer ações que você faz com o mouse ou com o teclado. Você pode mudar o objeto alvo selecionando uma linha diferente no navegador de alvos (Targets). Outro caminho de modificar o objeto alvo é colocar o cursor do mouse diretamente sobre um geom na janela de câmera e rapidamente dar um duplo clique no botão direito do mouse. Esse processo é chamado selecionar; o objeto selecionado torna-se o novo alvo.

Objetos do Geomview são todos conhecidos por dois nomes, ambos dos quais são mostrados no navegador de alvos (Targets). O primeiro nome lá fornecido, que aparece entre colchêtes ([ ]), é um nome curto atribuido pelo Geomview quando você chama o objeto. Esse nome consiste da letra `g' para geometria e da letra `c' para câmeras, seguindo por um número. O segundo nome é maior e mais descritivo; por padrão esse é o nome do arquivo do qual o objeto foi chamado. Os dois nomes são equivalentes no que diz respeito ao Geomview; em qualquer ponto onde você precisar especificar um nome você pode fornecer qualquer dos dois.

Para controlar um objeto, garanta que aquele objeto que você quer mover seja o objeto alvo, e coloque o cursor do mouse em uma janela de câmera. Movimentos são aplicados pressionando ou o botão esquerdo ou o botão do meio do mouse e movendo o mouse. Existem muitos modos de movimento diferentes, cada modo de movimento aplicando um diferente tipo de movimento. O navegador de modos de movimento (MOTION MODE) no painel principal indica o modo de movimento atual. O padrão é a rotação ("Rotate"). Você pode mudar o modo corrente de movimento selecionando um novo modo de movimento no navegador de modos de movimento (MOTION MODE), ou usando o painel de ferramentas (Tools). Para maiores informações sobre modos de movimento, veja Movimentos do Mouse.

O navegador de módulos (Modules) lista módulos externos do Geomview. Um módulo externo é um programa separado que interage com Geomview para extender suas funciona-lidades. Para informações sobre módulos externos, veja Modulos.

A barra de menu no topo do painel principal oferece menus para operações comuns.

Para criar novas janelas, chame novos objetos, grave os objetos ou outras informações, ou saia do Geomview, veja o menu File.

Para copiar ou apagar objetos, veja o menu Edit.

Você pode chamar qualquer painel a partir do menu Inspect.

O menu Space permite a você escolher se Geomview trabalha no modo Euclidiano, Hiperbolico ou Esférico. O modo Euclideano é usado por padrão. Para detalhes sobre a utilização do modo espaço Hyperbolic e do modo Spherical, veja Geometrias Nao-Euclidianas.

A maioria das ações que você pode fazer através dos painéis do Geomview possuem equivalentes atalhos de teclado de forma que você pode fazer a mesma ação atavés de digitação de uma sequência de teclas no teclado. Isso é útil para usuários avançados que estão familiarizados com as capacidades do Geomview e querem trabalhar rapidamente sem ter montanhas de painéis amontoando-se na tela. Atalhos de teclado são usualmente indicados ente colchêtes ([ ]) próximo ao item correspondente em um painel. Por exemplo, o atalho de teclado para o modo Rotate é 'r'; isso é indicado par "[r]" que aparece antes da palavra "Rotate" no navegador MOTION MODE. Para usar esse atalaho de teclado, apenas pressione a tecla r enquanto o cursor do mouse estiver em qualquer janela do Geomview. Não é necessário pressionar a tecla <Enter> posteriormente.

Alguns atalhos de teclado consistem em mais de uma tecla. Nesses caso apenas digite as teclas uma após a outra, sem pressionar <Enter> posteriormente ou entre as teclas pressionadas. Atalhos de teclado são sensíveis à caixa alta/baixa.

Muitas teclas de atalho podem ser precedidas de um parâmetro numérico. Por exemplo, digitando ae muda o estado do desenho de arestas, enquanto 1ae sempre habilita o desenho de arestas.

O campo keyboard no canto superior esquerdo do painel principal (Main), imediatamente acima da palavra "Targets", ecoa o estado atual das teclas de atalho.

Para uma lista de todas as teclas de atalho, pressione a telca ?. geomview-1.9.5/doc/geomview-pt_BR.html/figmainpanel.html0000644000175000017500000000012012310162311020126 00000000000000 geomview-1.9.5/doc/geomview-pt_BR.html/Chamando.html0000644000175000017500000001544012310162311017221 00000000000000 Chamando - Manual do Geomview

3.4 Disponibilizando Objetos dentro do Geomview

Existem muitos caminhos para chamar um objeto dentro do Geomview.

No painel de arquivos (Files)
Se você clicar no botão Load no painel principal do Geomview (Main), o painel de arquivos (Files) irá aparecer.
figs/myfilelist.png

Figura 3.2: O Painel de Arquivos.

Esse painel permite que você selecione um arquivo a partir de uma variedade de diretórios. O topo do painel é um navegador de arquivos padrão do Motif. Abaixo deste está uma lista de diretórios no caminho de busca padrão do Geomview; clique sobre um desses para navegar entre os arquivos naquele diretório.

Para selecionar um arquivo, duplo-clique sobre o seu nome no navegador no canto superior direito, ou clique sobre o seu nome e pressione a tecla <Enter>, ou ainda digite o nome do arquivo dentro da caixa de texto na parte inferior do navegador e pressione a tecla <Enter>.

Se o arquivo selecionado contiver dados geométricos OOGL, esse arquivo irá ser adicionado ao navegador de alvos (Targets) do Geomview. Se esse arquivo contiver comandos GCL em lugar de conter dados geométricos OOGL, o arquivo será interpretado. Veja GCL.

Quando o apinel de arquivos (Files) aparecer pela primeira vez, o diretório selecionado no navegador de diretórios é o diretório atual — que corresponde ao diretório a partir do qual você chamou o Geomview. O navegador de arquivos mostra todos os arquivos nesse diretório, incluindo os que não são arquivos do Geomview. Se você tentar chamar um arquivo que não contenha um objeto OOGL e também não contenha comandos do Geomview, o Geomview irá mostrar uma mensagem de erro.

O navegador de diretórios também lista um segundo e um terceiro diretórios adicionalmente além do diretório atual. O segundo, que termina em data/geom, é o diretório de exemplos de dados do Geomview. Esse diretório contém uma grande variedade de amostras de objetos. Esse diretório também contém muitos subdiretórios. Em particular, os subdiretórios hyperbolic e o subdiretório spherical possuem amostras de objetos hiperbólicos e esféricos, respectivamente. Entradas no navegador de diretórios são vistas apenas como entradas de arquivos; para visualizar um subdiretório, clique sobre o nome do referido diretório.

O terceiro diretório mostrado no navegador de diretório, que termina em geom, contém muitos subdiretórios com outros arquivos do Geomview dentro deles. Esses arquivos são usados menos frequêntemente que os outros no diretório data/geom.

Você pode mudar a lista de diretórios mostrada no navegador de diretórios do painel de arquivos (Files) usando o comando set-load-path; Veja (set-load-path ...).

A tecla de atalho <:
Se você digitar < em qualquer janela do Geomview, o painel Load irá aparecer. Esse painel é uma pequena versão do painel de arquivos (Files); o painel Load contém um campo de texto no qual você o nome de um arquivo a ser chamado (ou um comando GCL entre parêntesis). Após digitar o nome do arquivo a ser chamado, aperte a tecla <Enter>; Geomview irá chamar o arquivo como se você o tivesse chamado com o botão Add no painel de arquivos (Files). Se, após fazer surgir o pequeno painel Load com <, você decidir que quer usar o grande painel de arquivos (Files) após tudo, pressione o botão File Browser.
figs/load.png

Figura 3.3: O Painel de Chamar Arquivos.


Comandos para chamar objetos geométricos:
Os comandos GCL load, geometry, new-geometry, e read permitem a você chamar um objeto dentro do Geomview; veja GCL. Veja (load ...). Veja (new-geometry ...). Veja (read ...).
geomview-1.9.5/doc/geomview-pt_BR.html/figmyfilelist.html0000644000175000017500000000011112310162311020343 00000000000000 geomview-1.9.5/doc/geomview-pt_BR.html/figloadpanel.html0000644000175000017500000000011012310162311020120 00000000000000 geomview-1.9.5/doc/geomview-pt_BR.html/Movimentos-do-Mouse.html0000644000175000017500000003642712310162311021345 00000000000000 Movimentos do Mouse - Manual do Geomview

Next: , Previous: Chamando, Up: Interacao


3.5 Usando o Mouse para Controlar Objetos

Geomview permite a você controlar objetos com o mouse. Existem seis diferentes modos de movimento do mouse: rotação (Rotate), translação (Translate), vôo da câmera (Cam Fly), zoom da câmera (Cam Zoom), homotetia de um objeto geométrico (Geom Scale), e órbita de câmera (Cam Orbit). O painel de ferramentas tem um botão para cada um desses modos; para trocar os modos, clique sobre o botão correspondente. você pode também selecionar um novo modo através do navegador de modos de movimento (Motion Mode) no painel principal (Main).

Essa seção descreve a interação básica com o mouse. Para detalhes, veja Comandos.

figs/tools.png

Figura 3.4: O Painel de Ferramentas.

Cada um dos modos de movimento usa um paradigma comum para como o movimento é aplicado. Em particular, cada modo de movimento depende do objeto alvo (target) atual e do atual objeto do centro (center). O objeto alvo atual e o atual objeto do centro são explicados nos parágrafos seguintes.

O objeto alvo atual é mostrado no campo Target no painel de ferramentas (Tools). Isso é o mesmo que o objeto selecionado no navegador de alvos (Targets) no painel principal (Main), e você pode mudar o alvo ou selecionando um novo objeto no navegador, digitando uma nova entrada no campo, ou selecionando um objeto na janela de câmera duplo-clicando no botão direito do mouse com o cursor sobre o objeto.

O atual objeto do centro é mostrado no campo Center no painel de ferramentas(Tools). Seu valor padrão é a palavra especial "target", que significa que o objeto do centro é o objeto que estiver designado como objeto alvo. Você pode mudar o objeto atual do centro para qualquer objeto digitando seu nome no campo Center. A orígem do objeto do centro é mantida fixa no modo rotação Rotate e no modo Orbit. Normalmente o objeto do centro é um dos objetos geométricos (geoms) existentes listados no navegador de alvos (Targets), o centro atual das rotações é a orígem daquele sistema de coordenadas daquele objeto. É possível, todavia, selecionar um ponto arbitrário de interesse sobre um objeto como o centro. Para detalhes, veja Ponto de Interesse.

Isso também é possível mudando o botão BBox Center para escolher o centro de movimento como sendo o centro do objeto atual da caixa associada. Uma vez modificado o centro da caixa geométrica ativa associada irá tornar-se o centro do movimento, se você selecionar outro objeto, então o centro do movimento irá tornar-se o centro da caixa associada à aquele objeto. Nenhuma modificação ocorrerá quando uma câmera ou o objeto mundo (World) for selecionado; você tem que digitar a palavra target no campo Center para retornar ao valor padrão.

Você aplica um movimento de mouse pressionando ou o botão esquerdo ou o botão do meio do mouse com o cursor em uma janela de câmera e movendo o mouse. A maioria dos modos de movimento possui inércia (inertia), que significa que se você soltar o botão enquanto move o mouse, o movimento irá continuar. Para imaginar a inércia pode ser útil imaginar o cursor do mouse como sendo uma alça; quando você pressiona um botão do mouse para baixo, o mouse agarra firmemente no objeto alvo e você pode mover esse objeto. Quando você libera o botão do mouse, a alça libera o objeto. Liberando o botão do mouse enquanto move o mesmo funciona como abandonar o objeto — o objeto continua movendo-se independentemente do mouse. Inércia pode ser desligada; veja o menu de movimento (Motion) no painel principal (Main), descrito abaixo.

Geralmente, o botão esquerdo do mouse controla movimento no plano da tela, enquanto o botão médio do mouse controla movimento ao longo ou em torno da direção de avanço.

Pressionando o tecla "shift" enquanto arrasta com o botão esquerdo ou médio do mouse na maioria dos modos de movimento fornece movimentos de baixa velocidade , útil para ajustes finos.

Você pode selecionar qualquer ponto sobre um objeto (não apenas sua orígem) como centro do movimento pressionando a tecla "shift" enquanto clica no botão direito do mouse; isso escolhe o ponto de interesse.

Rotate
No modo rotação (Rotate), pressione o botão esquerdo do mouse para rotacionar o objeto alvo en torno do objeto do centro. A rotação ocorre na direção que você move o mouse. Especificamente, o eixo de rotação passa através da orígem do objeto do centro, é paralelo ao plano de visão da câmera, e é perpendicular à direção do movimento do mouse. Quando o centro for o alvo ("target"), isso significa que o objeto alvo rotaciona em torno de sua própria orígem.

O botã do meio do mouse no modo de movimento tipo rotação (Rotate) rotaciona o objeto alvo em torno de um eixo perpendicular ao plano de visão.

Translate
No modo translação (Translate), mantenha pressionado o botão esquerdo do mouse para transladar o objeto alvo na direção do movimento do mouse. O botão do meio do mouse translada o alvo ao longo de um eixo perpendicular ao plano de visualização.

No espaço Euclideano, o objeto do centro é essencialmente irrelevante para translações. Nos espaços hiperbólicos e esféricos, onde translações possuem um único eixo, esse eixo é escolhido para ir através da orígem do objeto do centro.

Cam Fly
O Vôo de Câmera (Cam Fly) é um simulador de vôo muito simples que permite a você voar em torno da cena. Cam Fly trabalha através do movimento da câmera. Movimente o mouse enquanto mantém pressionado o botão esquerdo do mouse para posicionar a câmera em uma direção diferente. Para mover adiante ou para trás, mantenha pressionado o botã do meio e mova o mouse verticalmente. Os dois movimentos aqui descritos possuem inércia; tipicamente o caminho mais fácil para voar em torno de uma cena é fornecer a câmera um passo adiante pressionando o botã do meio enquanto move-se o mouse para cima, e então usar o botão esquerdo para pilotar.

Cam Fly afeta a janela de câmera onde o mouse está correntemente posicionado; Cam Fly ignora o objeto alvo e o objeto do centro.

Cam Orbit
O modo órbita de Câmera (Cam Orbit) permite a você rotacionar a câmera atual em torno do centro atual. O botão esquerdo do mouse faz essa rotação. O botão do do meio do mouse no modo Cam Orbit atua da mesma forma que no modo Cam Fly: O botão do do meio do mouse move a câmera para adiante e para trás.

Em geral Cam Orbit não move o objeto alvo, embora se a câmera atual for selecionada como o alvo e o centro for também o alvo, Cam Orbit irá apenas pivotar aquela câmera sobre sí mesma como no modo Cam Fly.

Cam Zoom
O modo Zoom de Câmera (Cam Zoom) permite a você modificar o campo atual de visão com o mouse; mantenha pressionado o botão esquerdo do mouse e mova o mouse para modificar o campo de visão. O valor numérico do campo de visão é mostrado no campo FOV (field of view) no painel de câmera (Camera).
Geom Scale
O modo Geom Scale permite a você ampliar ou diminuir um objeto geométrico (geom). Geom Scale atua sobre o objeto alvo se aquele objeto for um geom. Se o alvo for uma câmera, Geom Scale atual sobre o geom que foi o objeto alvo mais recentemente. Movendo o mouse enquanto mantem-se pressionado o botão esquerdo do mouse homotetiza-se o objeto ou ampliando ou reduzindo o mesmo, dependendo da direção do movimento do mouse. o centro da transformação homotética aplicada é o objeto do centro.

Homotetia possui significado somente no espaço Euclideano; tentativas do palicar homotetia são ignoradas em outros espaços.

O modo Geom Scale não possui inércia.

Os botões Stop, Look At, Center, e Reset no painel de ferramentas (Tools) executam ações relacionadas a movimentos mas não modificam o modo atual de movimento (nota do tradutor: de rotação para translação por exemplo).

Stop
O botão Stop faz com que cessem todos os movimentos. O botão Stop afeta todos os objetos em movimento, não apenas o objeto alvo. Sua tecla de atalho é H.

O comando de teclado h, que não corresponde a um botão do painel, cessa o movimento atual para o objeto alvo somente.

Look At
O botão Look At faz com que a câmera atual seja movida para uma posição tal que a referida câmera esteja olhando para o objeto alvo, e de forma que o objeto alvo mais ou menos ajuste-se à janela.

O comando Look At não funciona perfeitamente em espaços não Euclideanos.

Center
O botão Center desfaz transformação do objeto alvo, movendo o objeto alvo de volta à sua posição inicial padrão, que é onde ele estava quando você originalmente o chamou a partir do Geomview.
Reset
O botão Reset cessa todo movimento e faz com que todos os objetos sejam movidos de vota às suas posições iniciais padrão.

O painel de ferramentas (Tools) possui um botão Main, para invocar o painel principal no caso de esse painel ter sido dispensado ou sepultado, e um botão Done para fechar o painel de ferramentas Tools.

O painel principal do menu de movimento (Motion) tem controles especiais que afetam como movimentos do mouse são interpretados; as modificações são também acessíveis através de comandos GCL. See (ui-motion ...).

[ui] Inertia
Normalmente, ao mover objetos tem-se inércia: se o mouse estiver ainda se movendo quando o botão for liberado, o objeto selecionado continua a mover-se. Quando a inércia (Inertia) for desabilitada, objetos cessam seu movimento no momento em que você libera o mouse.
[uc] Constrain Motion
É necessário algumas vezes ter ao alcance da mão o movimento de um objeto em uma direção alinhada com um eixo coordenado: exatamente na horizontal ou na vertical. Selecionando restringir movimento (Constrain Motion) a interpretação de movimentos do mouse é modificada para permitir isso; arrastros de mouse aproximadamente horizontais ou aproximadamente verticais transformam-se em movimentos exatamente horizontais ou exatamente verticais. Note que o movimento é ainda ao longo dos eixos X ou Y da câmera na qual você move o mouse, não necessáriamente no sistema de coordenadas do objeto.
[uo] Own Coordinates
É necessário algumas vezes ter ao alcance da mão o movimento de objetos objetos com relação ao sistema de coordenadas onde o referido objeto foi definido, em lugar de com relação ao sistema de coordenadas da câmera através da qual esse objeto está sendo visto. Enquanto Own Coordinates estiver selecionado, todos os movimentos são interpretados da forma citada nesse item: arrastando o mouse para a direita no modo translação corresponde a mover o objeto em sua própria direção +X, e assim por diante. Pode ser especialmente útil conjuntamente com o botão Restringir Movimento (Constrain Motion).
geomview-1.9.5/doc/geomview-pt_BR.html/figtools.html0000644000175000017500000000011712310162311017330 00000000000000 geomview-1.9.5/doc/geomview-pt_BR.html/Ponto-de-Interesse.html0000644000175000017500000001265712310162311021142 00000000000000 Ponto de Interesse - Manual do Geomview

3.5.1 Selecionando um Ponto de Interesse

É algumas vezes útil especificar um ponto em particular sobre algum objeto em uma janela do Geomview como o ponto de centro para movimentos do mouse. Você pode fazer isso segurando a tecla shift e clicando o botão direito do mouse (i.e. clique no botão direito uma vez enquanto mantém pressionada a tecla shift do teclado) com o cursor sobre o ponto desejado. Esse ponto torna-se então o ponto de interesse. O ponto de interesse deve estar sobre um objeto existente.

Selecionado um ponto de interesse simplifica o exame de uma pequena porção de um grande objeto. Mantendo a tecla shift pressionada e clicando sobre o ponto de interesse com o botão direito do mouse, e selecionando o modo órbita (Orbit). Use o botã do meio do mouse para aproximar, e o esquerdo para orbitar o ponto, examinando a região de diferentes direções.

Quando você tiver selecionado um ponto de interesse, o atual objeto do centro é modificado para um objeto chamado "CENTER", que é um objeto invisível localizado no ponto de interesse. Adicionalmente, movimentos de mouse para a janela na qual você fez a seleção são ajustados de forma que o ponto de interesse acompanhe o mouse.

Você pode mudar o ponto de interesse a qualquer momento selecionando um novo ponto de interesse shift-clicando o botão direito do mouse novamente. Você pode cancelar o ponto de interesse completamente shift-clicando o botão direito do mouse com o cursor no plano de fundo (i.e. não sobre qualquer objeto). Isso modifica o objeto do centro de volta a seu valor padrão, "target".

O objeto que possui o nome de "CENTER", que serve como um objeto do centro para o ponto de interesse, é um tipo especial de geom chamado "alien". Esse "Alien" não aparece no navegador de alvos (Targets). Por padrão esse objeto "Alien" não tem geometria associada e concequêntemente é invisível. Você pode, Todavia, explicitamente fornecer ao Alien alguma geometria usando um comando GCL, fazendo com que o Alien aparece no navegador de alvos. Use o comando geometry para fazer isso: (geometry CENTER geometry), onde geometry é qualquer geometria válida. Por exemplo, (geometry CENTER { < xyz.vect }) faz com que o arquivo xyz.vect, que é um dos arquivos de exemplo padronizados distribuídos com Geomview, seja usado na geometria para CENTER. Veja (geometry ...).

O que acontece internamente quando você seleciona um ponto de interesse é que o centro é ajustado para o objeto chamado CENTER, e aquele objeto é posicionado no ponto de interesse. Adicionalmente, para que movimentos de mouse acompanhem o ponto de interesse, o atual comprimento focal da câmera é escolhido para ser a distância da câmera até o ponto de interesse. Você pode realizar isso via GCL com os seguintes comandos:

     (if (real-id CENTER) nil (new-alien CENTER {}))
     (ui-center CENTER)
     (transform-set CENTER universe universe translate x y z)
     (merge camera cam-id { focus d })

onde (x,y,z) são as coordenadas (universe) do ponto de interesse, e d é a distância daquele ponto à atual câmera, cam-id. O primeiro comando acima cria o "alien" CENTER se esse Alien não existir ainda. geomview-1.9.5/doc/geomview-pt_BR.html/Aparencia.html0000644000175000017500000001004712310162311017370 00000000000000 Aparencia - Manual do Geomview

Next: , Previous: Movimentos do Mouse, Up: Interacao


3.6 Modificando a Forma de Ver as Coisas

Geomview utiliza uma hierarquia de aparências para controlar o caminho através do qual olha-se coisas. Uma aparência (appearance) é uma especificação de informação sobre como alguma coisa pode ser desenhada. Isso pode incluir muitas características como cor, brilho, propriedades do material, etc. Aparências trabalham de uma maneira hierárquica: se uma certa propriedade de aparência, por exemplo cor de face, não for especificada em uma aparência particular de algum objeto, esse bojeto é desenhado usando aquele propriedade de uma hierarquia superior. Se ambas as aparências de hierarquias, a atual e a superior, especificam uma propriedade, a hierarquia atual tem precedência a menos que a hierarquia superior não for escolhida para sobrescrevê-la.

Todo geom no Geomview tem uma apaência associada. Existe também uma aparência associada ao geom do tipo "World", que comporta-se como hierarquia superior a cada aparência individual de qualquer geom. Finalmente, existe uma aparência básica global, que é a hierarquia superior da aparência "World".

A aparência básica especifica valores razoáveis para toda informação de aparência, e por padrão nenhuma outra aparência especifica qualquer coisa, o que significa que as aparências erdam seus valores a a partir da aparência básica. Isso significa que por padrão todos os objetos são desenhados usando a aparência básica.

Se você modificar uma certa propriedade de aparência de um geom, aquela propriedade é usada na construção daquele geom. A aparência de hierarquia superior é usada para quaisquer propriedades que você não explicitamente escolheu.

Geomview possui três painéis que levam você a modificar aparências.

geomview-1.9.5/doc/geomview-pt_BR.html/Painel-de-Aparencia.html0000644000175000017500000002755212310162311021175 00000000000000 Painel de Aparencia - Manual do Geomview

Next: , Previous: Aparencia, Up: Aparencia


3.6.1 The Appearance Panel

O painel de Aparência (Appearance) leva você a modificar as mais comuns propriedades de aparência do objeto alvo.

figs/ap.png

Figura 3.5: O Painel de Aparência.

Se o alvo for um geom individual, então modificaçãoes que você fizer no painel de aparências aplicam-se a aparência daquele objeto geométrico. Se o alvo for o "World", então as modificações no painel de aparências aplicam-se à aparênca do objeto atual e a aparência de todos os outros objetos individuais. (Usuários acham que esse comportamento é mais desejável que ter as modificações somente aplicadas a aparência do "World".) Se o alvo for uma câmera, então as modificações do painel de aparência aplica-se ao geom que ocupou mais recentemente a posição de alvo.

Os cinco botões próximos ao canto superior esquerdo sob a palavra Show (mostrar) controlam que partes do geom alvo são desenhadas.

Faces
Esse botão especifica se faces são desenhadas.
Edges
Esse botão especifica se arestas são desenhadas.
Normals
Esse botão especifica se vetores normais à superfície são desenhados.
BBox
Esse botão especifica se a caixa associada é desenhada.
Vects
Esse botão especifica se objetos VECT são desenhados. VECTs são um tipo de objeto OOGL que representa pontos e segmentos de reta em espaço tridimencional; os VECTs são distintos de arestas ou de outros tipos de objetos, e é desejável algumas vezes ter controle separado sobre se eles são desenhados.

Os quatro botões sob Color rotulados Faces, Arestas (Edges), Normais (Normals), e BBox permitem a você especificar a cor do aspecto correspondente de um geom alvo. Clicando sobre um deles faz com que apareça um painel de escolha de cores.

figs/color.png

Figura 3.6: Painel de Escolha de Cor.

Esse painel oferece dois conjuntos de botões deslizantes: H(ue) S(Saturation) V(alue), ou R(ed) G(reen) B(lue), cada um no intervalo real fechado de 0 a 1. O quadrado mostra a cor atual, que é fornecida numericamente em ambos os sitemas HSV e RGB nas caixas de texto correspondentes.

No sistema de cores HSV, hue H mostra vermelho em 0, verde em .333, azul em .667, e volta ao vermelho em 1.0. Saturação fornece a fração de branco misturada na cor, de 0 para cinza puro a 1 para a cor pura. Valor fornece o brilho, de 0 para preto a 1 para brilho máximo.

Pressionado o botão RGB ou o botão HSV ao centro do topo do painel alterna os botões deslizantes para outro sistema de cores. Você pode ajustar cores ou através dos botões deslizantes, ou através de digitação nas caixas de texto RGB ou HSV.

Clique OK para aceitar as cores que você tiver escolhido, ou Cancel para reter as escolhas anteriores de cor.

O navegador SHADING permite a você especificar o modelo de sombreamento que Geomview utilizará para desenhar o geom alvo.

Constant
Toda face do objeto é desenhada com uma cor constante que não depende da localização da face, nem da câmera, nem também das fontes de luz. Se o objeto não contiver cores por face ou por vértice, a cor difusa de aparência do objeto é usada. Se o objeto contiver cores por face, essas cores serão usadas. Se o objeto contiver cores por vértice, cada face é pintada usando a cor de seu primeiro vértice.
Flat
Cada face do objeto é desenhada com uma cor que depende da localização relaiva da face, da câmera, e das fontes de luz. A cor é constante ao longo da face mas pode mudar conforme muda a face, a câmera, ou o movimento das luzes.
Smooth
Cada face do objeto é desenhada com cores lisamente interpoladas baseadas nos vetores normais em cada vértice. Se o objeto não contiver normais por vértice, "Smooth" tem o mesmo efeito que o modo de sombreamento "Flat". Se o objeto tiver normais por vértice rasoáveis, o efeito é alisamento sobre as arestas e entre as faces.
CSmooth
Cada face do objeto é desenhada com as cores exatamente especificada(s), independente de iluminação, orientação, e propriedades de material. Se o objeto for definido com cores por vértice, as cores serão interpoladas lisamente ao longo da face; de outra forma o efeito é o mesmo que ocorre no estilo de sombreamento "Constant".
VCflat
Uma combinação de CSmooth e sombreamento Flat. Dessa forma o sombreamento é constante em cada face, de acordo com a orientação relativa das fontes de luz, a câmera e a superfície normal da face.

O botão Facing Normals no painel de aparência (Appearance) indica se Geomview pode arranjar aqueles vetores normais ou se não pode sempre conforme a visualização. Se um vetor normal direciona-se afastando-se do visualizador a cor da face correspondente ou vértice correspondente usualmente é mais forte do que é desejado. Geomview pode evitar isso através do uso da normal oposta em cálculos de sombreamento. Esse comportamento é o padrão. Usando Facing Normals podemos fornecer estranha suavidade pesada ou estranhos efeitos de tonalidade de luz, embora, proximo ao horizonte de um objet distantemente liso facetado. Pressione esse botão para usar as normais fornecidas com o objeto.

Os três campos no canto inferior esquerdo do painel de aparência (Appearance) são:

Line Width
A espessura, em pixels, para linhas desenhadas pelo Geomview.
Normal Length
Isso é atualmente um fator de homotetia; quando vetores normais forem desenhados, Geomview desenha-os de forma que tenham um comprimento que é seu comprimento natural vezes esse número.
Patch Dicing
Geomview desenha retalhos de Bezier primeiro convertendo-so em malhas. Esse parâmetro especifica a resolução da malha: se Patch Dicing for n, então uma malha n por n é usada para desenhar cada retalho de Bezier. Se Patch Dicing for 1, a resolução reverte-se para um valor padrão interno.

O botão Revert no painel de aparência (Appearance) desfaz todas as escolhas na aparência do alvo. Isso faz com que o geom alvo herde todas as suas propriedades de aparência de seus pais.

O botão do painel de aparência (Appearance) determina se controles de aparência devem sobrescrever escolhas feitas nos objetos em si mesmos – por exemplos, escolhendo a cor de face irá afetar todas as faces de objetos com faces multicoloridas. De outra forma, controles de aparência somente fornecem escolhas que não forem especificadas nos objetos em si mesmos não especificarem. Por padrão, Override está habilitado. Esse botão aplica-se a todos os objetos, e a todos os painéis relacionados a aparência.

Normalização é um tipo de homotetia; Geomview pode alterar o tamanho de um objeto proporcionalmente de forma que esse objeto se ajuste dentro de uma certa região. O objetivo principal da normalização é permitir a você facilmente visualizar um objeto sem ter que se preocupar com o tamanho do mesmo. Estamos substituindo gradualmente o recurso de normalização do Geomview por recursos mais robustos de posicionamento de câmera. Em geral, o melhor caminho de garantir que você está vendo tudo de um objeto é usar o botão Look At do painel de ferramentas (Tools). A normalização pode ser completamente substituída por esse botão do painel de ferramentas e por outros recursos em uma versão futura do Geomview.

Normalização é uma propriedade que aplica-se a cada geom separadamente. o navegador NORMALIZE GEOMETRY afeta a propriedade de normalização do geom alvo. Se o geom alvo for "World", a normalização afetará todos os geoms.

None
Sem normalização.
Individual
Normaliza o geom atual para ajustar-se dentro de uma esfera unitária.
Sequence
Assemelha-se a "Individual", exceto quando um objeto está mudando. Então, "Individual" com muita precisão ajusta a caixa associada em torno do objeto quando esse objeto modifica-se e normaliza-se adequadamente, enquanto "Sequence" normaliza a união de todas as variantes do objeto e normaliza ade-quadamente.
Keep
Mantem a transformação de normalização inalterada quando o objeto modifica-se. Keep pode ser útil para aplicar a normalização "Individual" ou a normalização "Sequence" à primeira versão de um objeto que se modifica para trazer esse mesmo objeto ao campo de visão.
geomview-1.9.5/doc/geomview-pt_BR.html/figap.html0000644000175000017500000000011412310162311016565 00000000000000 geomview-1.9.5/doc/geomview-pt_BR.html/figcolorchooserpanel.html0000644000175000017500000000013312310162311021707 00000000000000 geomview-1.9.5/doc/geomview-pt_BR.html/Painel-de-Materiais.html0000644000175000017500000001202512310162311021215 00000000000000 Painel de Materiais - Manual do Geomview

3.6.2 O Painel de Materiais

O painel de materiais (Materials) controla as propriedades materiais das surperfícies. O painel de materiais trabalha com o objeto alvo da mesma forma que o painel de aparência (Appearance) faz.

figs/mat.png

Figura 3.7: O Painel de Materiais.

Translucent
Esse botão determina se a capacidade de ser translúcido está habilitada. Geomview suporta três diferentes formas da capacidade de ser translúcido (translucência):
Alpha-blending com BSP-tree depth-sorting
Esse é o nível mais acurado de preferência de visualização imediata, mas consome vastos montantes de tempo de computação e memória. No modo simples de translucência objetos são mostrados corretamente em relação a si mesmos; todavia multiplos objetos translúcidos podem aparecer na ordem inadequada na tela. A noção objeto significa aqui: geometria de nível mais alto como mostrado no navegador de alvo de geometria.
Screen Door Translucency
Se a máquina suporta OpenGL então existe suporte para tipo de translucência por mascaramento de saída (completamente) de pixels transparentes por meio de uma mascara de ponteamento. Essa forma é atualmente muito experimental, e o resultado é de certa forma o ideal, mas funciona e é rápido.
Alphe-blending sem depth-sorting
Esse é a antiga forma de fazer uma translucência rápida e com muitas falhas. Essa é rápida, mas os resultados são completamente incorretos.

Quando a transparência estiver habilitada, um instantâneo RenderMan irá conter a informação alfa, um renderizador obediente pode então gerar figuras de alta qualidade, incluindo a translucência correta.

Alpha
O botão deslizante determina a opacidade/transparência quando a transparência estiver habilitada. 0 (zero) significa totalmente transparente, 1 significa totalmente opaco.
Diffuse Reflectance
Esse botão deslizante controla a reflectância difusa de uma superfície. Isso tem a ver com o quanto a superfície dispersa a luz que reflete.
Shininess
Esse botão deslizante controla o quanto brilhante a superfície é. Esse botão determina o tamanho de destaques especulares sobre a superfície. Valores pequenos fornecem à superfície uma aparência sombria.
Ambient Reflectance
Esse botão deslizante controla o quanto da luz ambiente uma superfície reflete.
Specular Reflectance
Esse botão deslizante controla a reflectância especular de uma superfície. Isso tem a ver com como a superfície reflete diretamente os raios luminosos. Valores maiores fornecem destaques de brilho especular.
Done
Esse botão dispensa o painel de materiais (Materials).
geomview-1.9.5/doc/geomview-pt_BR.html/figmatpanel.html0000644000175000017500000000012212310162311017765 00000000000000 geomview-1.9.5/doc/geomview-pt_BR.html/Painel-de-Iluminacao.html0000644000175000017500000001203112310162311021355 00000000000000 Painel de Iluminacao - Manual do Geomview

Previous: Painel de Materiais, Up: Aparencia


3.6.3 O Painel de Luzes

O painel de luzes (Lights) controla o número, a posição, e a cor das fontes de luz usadas no sombreamento.

figs/light.png

O Painel de Iluminação.

O painel de iluminação (Lighting) é diferente do painel de aparência (Appearance) e dos painéis de material (Material) no sentido de que o painel de iluminação sempre trabalha com a aparência base. Isso ocorre pelo fato de fazer sentido usar o mesmo conjunto de luzes para desenhar todos os objetos na sua cena.

LIGHTS
O navegador de luzes (LIGHTS) mostra a luz atualmente selecionada. Modificações são feitas usando os outros meios de escolha sobre esse painel aplicado a essa luz. Existe sempre pelo menos uma luz, a luz ambiente.
Intensity
Esse botão deslizante controla a intensidade da luz atual.
Color
Esse botão faz surgir um modificador de corres que lhe permite selecionar a cor da luz que atualmente ilumina o objeto.
Add
Esse botão adiciona uma luz.
Delete
Esse botão exclui a luz atual.
Show Lights
Esse botão permite a você ver e modificar a posição das fontes de iluminação em uma janela de câmera. Cada luz é movida ao longo de um cilindro que é suposto para lembrar a você um raio de luz. Quando você clica sobre o botão Show Lights Geomview entra no modo "light edit", durante o qual você pode rotacionar a iluminação atual mantendo pressionado o botão esquerdo do mouse e movendo o mouse. Iluminação colocada dessa forma estão infinitamente distantes, de forma que o que você está modificando é a posição angular. Clique sobre o botão Show Lights novamente para retornar ao modo anterior de movimento e para sair movendo os raios de luz.
Done
Esse botão dispensa o painel de iluminação (Lighting).

Os painéis do Geomview Appearance, Materials, e Lighting são construídos para permitir a você fazer facilmente a maioria das coisas relacionadas a aparência que você pode querer fazer. A hierarquia de aparência que Geomview suporta internamente, todavia, é muito complexa e existem certas operações que você não pode fazer com os painéis. A linguagem de comandos do Geomview (GCL) fornece suporte completo a operações sobre aparência. Em particular, o comando merge-baseap pode ser usado para modificar a aparência de base (a qual, exceto para iluminação, não pode ser modificada através de painéis do Geomview). O comando merge-ap pode ser usado para modificar a aparência de um geom individualmente. Aparências podem também serem especificadas nos arquivos OOGL; para detalhes veja, Aparencias. (merge-baseap ...). (merge-ap ...). geomview-1.9.5/doc/geomview-pt_BR.html/Cameras.html0000644000175000017500000002602312310162311017061 00000000000000 Cameras - Manual do Geomview

Next: , Previous: Aparencia, Up: Interacao


3.7 Cameras

Uma câmera no Geomview é o objeto que corresponde a uma janela de câmera. Por padrão existe somente uma câmera, mas é possível ter tantas quantas você quiser. Você pode controlar certos aspectos do objeto visível atualmente na janela de câmera arrastando em cada janela de câmera via o painel Cameras.

figs/cam.png

Figura 3.8: O Painel de Câmera.

Se o objeto alvo for uma câmera, o painel de câmeras (Cameras) afeta essa câmera. Se o objeto alvo não for uma câmera, o painel de câmeras (Cameras) afeta a câmera atual (current camera). A câmera atual é a câmera da janela que o cursor do mouse está nela, ou estava mais recentemente se o cursor não estiver em uma janela de câmera. Dessa forma, se você usa teclas de atalho para as ações no painel de câmeras (Cameras) enquanto o cursor estiver em uma janela de câmera, as ações aplicam-se a aquela câmera, a menos que você tenha explicitamente selecionado outra câmera.

Para criar novas janelas de câmera, use a tecla de atalho v+, ou veja o menu arquivo (File) no painel principal (Main).

Single-Buffering
Normalmente, janelas do Geomview são armazenadas em áreas de memória duplas (double-buffered): Geomview desenha a figura seguinte em uma janela escondida, então alterna as áreas de memória para fazer essa janela completamente visível em algum momento. Sobre muitos sistemas operacionais, a memória para a área de memória escondida vem da apropriação indevida de metade dos bits de cada pixel de tela, reduzindo a resolução de cor. Quando a opção área de memória simples (single-buffering) for habilitada, as películas de tela de cada cena está sendo desenhada, mas você pode pegar imagens planas com redução de granularidade estremecendo artefatos. Área de memória simples é possível se Geomview for compilado com GL ou com OpenGL, mas não com gráficos desenhados com recursos únicos e exclusivos do X.
Dither
Muitos monitores oferecem menos que 24 bits por pixel (8 bits para cada vermelho, verde, e azul) convencionalmente suficiente para mostrar gradações de cor simplesmente. Quando tenta mostrar uma cor não acuradamente disponível no monitor, Geomview normalmente estremece (dithers), modificando as cores do pixel para algumas vezes mais brilhante, algumas vezes mais escuro que o valor desejado, de forma que a cor disponível sobre uma área é uma melhor aproximação para a cor verdadeira que um pixel simples pode ter. Efetivamente perdas de resolução espacial são para ganhar resolução de cor. Esse compartamento não é sempre desejável, todavia. Desabilitando Dither fornece menor granularidade, mas a precisão de cores é menor, das imagens.
Software Shading
Esse botão controla se Geomview faz cálculos de sombreamento via software. O padrão é permitir que o hardware manuseie esses cálculos, e no espaço Euclideano esse caminho é o melhor sempre porque é o caminho mais rápido. No espaço hiperbólico e também no espaço esférico, todavia, os cálculos de sombreamento que o hardware faz são incorretos. Clique sobre esse botão para habilitar a forma correta mas lenta do cálculo de sombreamento via software.
Background Color
Esse botão faz surgir um modificador de cores que você pode usar para escolher a cor de fundo da janela da câmera.
PROJECTION
Esse navegador permite a você selecionar entre projeção perspectiva ou projeção ortográfica para essa câmera.
Near clip
Essa caixa de texto determina a distância nas coordenadas do objeto mundo do próximo plano de corte a partir do ponto de visão. Deve ser um número positivo.
Far clip
Essa caixa de texto determina a distância nas coordenadas do objeto mundo do plano de corte mais distante a partir do ponto de visão. Deve ser um número positivo e em geral deve ser maior que o valor de Near clip.
FOV
Essa caixa de texto é o campo de visão da câmera, medido em sua menor direção. No modo perspectiva, essa caixa corresponde a um ângulo em graus. No modo ortográfico, essa caixa de texto corresponde ao tamanho linear do campo de visão. Esse número pode ser modificado com o mouse no modo Cam Zoom.
Focal Length
A distância focal pretende pretende sugerir a distância da câmera a um plano imaginário de interesse. Seu valor é usado quando alternamos entre as visualizações ortográfica e perspectiva (e durante visualização stereo), de forma a preservar o tamanho aparente de objetos sendo desonesto quanto à distância focal da câmera. Distância focal também afeta a interpolação de movimentos de translação efetuados usando o mouse. A velocidade do movimento para adiante (nos modos translação, vôo e no modo orbital) é proporcional à distância focal; e objetos desonestos quanto à distância focal da câmera translacionam lateralmente na mesma razão que o cursor do mouse. Finalmente, no modo de projeção N-Dimencional, câmeras são substituídas de volta através da distância focal a partir da projeção tridimensional da orígem do objeto mundo.
Lines Closer
Esse número tem a ver com o caminho pelo qual as linhas são desenhadas. Normalmente a área de armazenamento temporário do algorítmo que controla as coordenadas do eixo z podem confundir-se na hora de desenhar linhas que localizam-se exatamente sobre superfícies (tais como as arestas de um objeto); devido a erros de arredondamento de máquina, algumas vezes as linhas parecem estar em frente à superfície e algumas vezes elas parecem estar por detrás da superfície. O valor Lines Closer é um fator de correção — Geomview modifica sutilmente todas as linhas que o algorítmo da área de armazanamento temporária desenha fechando para a câmera através desse fator. O número deve ser um inteiro pequeno; tente 5 ou 10. O valor zero (0) desabilita esse recurso completamente. Escolhendo valores grandes tornará as linhas visíveis mesmo quando elas devam ser escondidas.
SPACE MODEL
Essa opção determina o modelo usado para desenhar o objeto mundo. É mais útil em espaços hiperbólicos e esféricos. Você provavelmente não necessitará tocar esse navegador se você permanecer no espaço Euclideano. Para mais informação sobre esses modelos, veja Geometrias Nao-Euclidianas.
Virtual
Esse é o modelo padrão e representa a visualização natural de dentro do espaço.
Projective
Corresponde ao modelo projetivo do espaço hiperbólico e do espaço esférico. Geoms movem-se obedecendo as isometrias do espaço, e câmeras movem-se através de movimentos Euclideanos. Por padrão em modelos projetivos, a esfera unitária Euclidiana é desenhada. No espaço hiperbólico essa esfera localiza-se no infinito. No espaço Euclideano o modelo projetivo é o mesmo que o modelo virtual exceto que a esferea é desenhada por padrão.
Conformal
Corresponde ao modelo conformal do espaço hiperbólico e do espaço esférico. Geoms movem-se obedecendo as isometrias do espaco, e câmeras move-se através de movimentos Euclideanos. No espaço Euclidiano, o modelo conformal equivale a inverter tudo na esfera unitária.

Draw Sphere
Essa opção controla se Geomview desenha a esfera unitária ou não. Por padrão a esfera unitária aparece no modelo projetivo e no modelo conformal. No espaço hiperbólico a esfera é colocada no infinito. No espaço esférico corresponde à esfera equatorial.
Done
Esse botão dispensa o painel de Cameras.
geomview-1.9.5/doc/geomview-pt_BR.html/figcamerapanel.html0000644000175000017500000000011112310162311020432 00000000000000 geomview-1.9.5/doc/geomview-pt_BR.html/Gravando.html0000644000175000017500000002277012310162311017254 00000000000000 Gravando - Manual do Geomview

Next: , Previous: Cameras, Up: Interacao


3.8 Gravando Seu Trabalho

O painel Save do Geomview permite a você armazenar objetos do Geomview e outra informação em arquivos que você pode recuperar dentro do Geomview ou a partir de outros programas.

figs/save.png

Figura 3.9: O Painel Gravar.

Para usar o painel Save você seleciona o formato desejado no navegador perto da palavra Save, informe o nome do objeto que você quer gravar no campo de texto perto da palavra for, e informe o nome do local no qual você deseja gravar o arquivo no campo longo de texto perto da palavra in. Você pode ou pressionar <Enter> ou clicar sobre o botão OK. Quando o arquivo tiver sido gravado no local desejado, o painel Save desaparecerá. Caso você queira dispensar o painel Save sem gravar um arquivo, clique no botão Cancel.

Caso você especifique - como nome de arquivo, Geomview mostra o arquivo na saída padrão, i.e. na janela de shell a partir da qual você invocou o Geomview.

Os possíveis formatos são fornecidos abaixo. O tipo de objeto que pode ser escrito com cada formato é fornecido entre parêntesis.

Commands (qualquer objeto)
A opção "Commands" escreve um arquivo de comandos GCL contendo todas as informações sobre o objeto. Chamando o arquivo posteriormente irá restaurar o objeto bem como todas as outras informações sobre o referido objeto, tais como aparência, transformações, etc.
Geometry alone (geom)
A opção "Geometry alone" escreve um arquivo OOGL contendo apenas a geo-metria do objeto.
Geometry [in world] (geom)
A opção "Geometry [in world]" escreve um arquivo OOGL contendo a geometria do objeto, transformado sob a transformação atual do Geomview para esse objeto. Use a opção "Geometry [in world]" caso você tenha movido o objeto de sua posição inicial e queira a nova posição em relação ao objeto mundo.
Geometry [in universe] (geom)
A opção "Geometry [in universe]" grava um arquivo OOGL contendo apenas a geometria do geom, transformado sob transformações sofridas pelo objeto e também sob transformações sofridas pelo objeto mundo.
RMan [->tiff] (camera)
A opção "RMan [->tiff]" escreve um arquivo que quando for renderizado cria uma imagem tiff. Transparência e textura (a mais recente somente até certo ponto) estará disponível.
RMan [->frame] (camera)
A opção "RMan [->frame]" escreve um arquivo RenderMan que quando for rede-rizado faz com que uma imagem apareça em uma janela na tela. Transparência e textura (a mais recente somente até certo ponto) estará disponível.
SGI snapshot (camera)
A opção "SGI snapshot" escreve um arquivo de varredura SGI. Uma campainha toca quando o instantâneo for completado. Somente disponível em sistemas SGI.
PPM GLX-offscreen snapshot (camera)
Renderiza uma cena completa novamente dentro da memória off-screen; GLX fornece os meios para usar um Pixmap como área de renderização. A vantagem de renderizar dentro da memória off-screen em relação a pegar um instantâneo de tela é que a janela de câmera não precisa ser mapeada e também não precisa aparece na hora do intantâneo é realizado. De forma que com o intantâneo off-screen se pode seguramente colocar a janela de câmera no formato de ícone (mas não fechá-la!), ativar a proteção de tela e ir dormir enquanto algum script avança as cenas e grava os instantâneos.
PPM Screen snapshot (camera)
Grava os instantâneos a partir da janela fornecida e grava no formato de imagem PPM. Se você especificar uma sequência de caracteres começando com um barra vertical (|) como nome de arquivo, isso é interpretado com um comando de redirecionamento do shell para o qual os dados do PPM deverão ser canalizados, como em ‘| pnmtotiff > snap.tiff’ ou em ‘| convert -geometry 50% ppm:- snap.gif’.

Instantâneos de tela PPM estão somente disponíveis com GL e open GL, não com gráficos X somente. A janela pode ocupar inteiramente tela. Geomview irá garantir que não haja outras janelas reproduzindo-a enquanto o instantâneo é gravado. É provavelmente melhor usar instantâneos GLX-off-screen, como acima exposto.

PPM software snapshot (camera)
Escreve um instantâneo da janela atualmente visualizada, como uma imagem PPM, apra o arquivo fornecido. O nome do arquivo pode ser um comando do shell Bourne precedido por uma barra vertical (|), da mesma forma que com o instântâneo de tela PPM (PPM screen snapshot). O instantâneo de software, apesar disso, é produzido através do uso de software renderizador interno (relacionado ao renderizador do sistema X-window). Não é importante se a janela está visível ou não, e é independente do GL ou do OpenGL. Também essa opção não suporta alguns recursos, tais como mapeamento de textura.
Postscript snapshot (camera)
Escreve um instantâneo Postscript da visão da câmera. O instantâneo é feito através da decomposição da cena em linhas e polígonos, ordenando por intensidade, e gerando linhas no formato Postscript e polígonos para cada uma. Vantagens desse processo sobre o processo baseado em pixes do instantâneo de imagens: a resolução é muito alta, de forma que arestas parecem na posição correta mesmo em impressoras de alta resolução, ou imagens de resolução comparável são tipicamente muito mais compactas. Desvantagens: ordenação por intensidade fornece bons resultados em algumas cenas, mas pode ser grandemente ruim como no algorítmo de remoção de cenas ocultas em outras cenas. Também, Postscript não oferece sombreamento interpolado linear, somente sombreamento linear simples para cada faceta.
Camera (camera)
Escreve um arquivo OOGL de uma câmera.
Transform [to world] (qualquerobjeto)
Escreve um arquivo de transformação OOGL fornecendo transformação do Geomview para o objeto.
Transform [to universe] (qualquerobjeto)
Escreve um arquivo de transformação OOGL fornecendo uma transformação que é a composição de transformação do Geomview para o objeto e a transformação sofrida pelo objeto mundo.
Window (camera)
Escreve um arquivo de janela OOGL para uma câmera.
Panels
Escreve um arquivo GCL contendo comandos que gravam o estado de todos os painéis do Geomview. Chamando esse arquivo posteriormente irá restaurar as posições de todos os painéis.
geomview-1.9.5/doc/geomview-pt_BR.html/figsavepanel.html0000644000175000017500000000011012310162311020137 00000000000000 geomview-1.9.5/doc/geomview-pt_BR.html/Comandos.html0000644000175000017500000000463712310162311017260 00000000000000 Comandos - Manual do Geomview

Next: , Previous: Gravando, Up: Interacao


3.9 O Painel de Comandos

O painel de comandos (Commands) permite a você digitar comandos GCL. Quando você pressionar <Enter>, Geomview interpreta o comando e imprime qualquer saída resultante ou uma mensagens de erro para a saída padrão. Você pode editar o texto e pressionar <Enter> tantas vezes quantas você quiser, em geral, mesmo que você pressione (<Enter>) com o cursor no painel de comandos ( Commands), Geomview tenta interpretar se aquele texto que você tiver digitado no campo de texto como um comando.

figs/command.png

Figura 3.10: O Painel de Comandos.

geomview-1.9.5/doc/geomview-pt_BR.html/figcommandpanel.html0000644000175000017500000000011312310162311020622 00000000000000 geomview-1.9.5/doc/geomview-pt_BR.html/Atalhos-de-Teclado.html0000644000175000017500000002366112310162311021045 00000000000000 Atalhos de Teclado - Manual do Geomview

Previous: Comandos, Up: Interacao


3.10 Atalhos de Teclado

A maioria das ações que você pode fazer através dos painéis do Geomview possui as equivalentes teclas de atalho de forma que você pode fazer a mesma ação digitando uma sequência de teclas usando o teclado. Isso é útil para usuários avançados que forem familiarizados com as capacidades do Geomview e que queiram trabalhar rapidamente sem ter montes de painéis confundindo a tela. Teclas de atalho comumente são indicadas entre colchêtes ([ ]) próximo ao item correspondente em um painel. Por exemplo, a tecla de atalho para o modo de rotação (Rotate) é 'r'; isso é indicado por "[r]" aparecendo antes da palavra "Rotate" no navegador MOTION MODE. Para utilizar essa tecla de atalho apenas pressione a tecla r enquanto o cursor do mouse estiver sobre qualquer janela do Geomview. Você não precisa pressionar a tecla <Enter> ou teclas de <SPACE>.

Alguns atalhos consistem de mais que uma tecla. Nesses casos apenas digite as teclas indicadas uma após a outra e na ordem indicada, sem <Enter> após cada tecla. Atalhos de teclado são sensíveis à caixa alta/baixa. Você pode cancelar atalhos compostos por várias teclas que você tiver iniciado a digitação digitando qualquer tecla inválida como de atalho, por exemplo a barra de espaço.

Comandos de teclado aplicam-se enquanto o cursor estiver em qualquer janela de câmera e na maioria dos painéis de controle.

Muitas teclas de atalho permitem argumentos numéricos que você digitar como um prefixo a tecla(s) de comando. Por exemplo, a tecla de atalho para Near clip no painel de câmera é v n. Para escolher o próximo plano de corte para ‘0.5’, digite 0.5vn. Comandos que não recebem um prefixo numérico modificam ou mudam para zero o valor atual.

A maioria dos comando permitem um dos seguintes prefixos de seleção. Se nenhum objeto for fornecido o comando aplica-se ao objeto alvo.

g
objeto geométrico mundo ("world")
g#
#'ésimo objeto geométrico ("geom")
g*
Todos os objetos geométricos ("geoms")
c
câmera atual
c#
#'ésima câmera
c*
Todas as câmeras

Por exemplo, g4af significa modifique a face desenhada do objeto g4.

Simplesmente digitando um prefixo de seleção, como g4, não seleciona um objeto ainda; isso somente acontece quando um comando, como ae, segue o prefixo. Para selecionar um objeto como alvo sem fazer nada mais para isso, use o comando p. Então g3p seleciona o objeto g3.

O campo de texto no canto superior esquerdo faz o painel principal (Main) mostrar o estado da tecla de atalho atual.

Para adição de teclas de atalho ao painel de comandos, existe também um atalho para selecionar um objeto alvo: digite o nome curto do objeto seguido por p. Por exemplo, para selecionar o objeto g3, digite g 3 p. Essa forma funciona somente com nomes curtos — aqueles que aparecem entre colchêtes ([ ]) no navegador de alvos (Targets) do painel principal Main.

Abaixo encontra-se um sumário de todas as teclas de atalho.

Desenho
af
Faces
ae
Arestas
an
Normais
ab
Caixas Associadas
aV
Vetores

Sombreamento
0as
Constante
1as
Monótono
2as
Linear
3as
Linear, não iluminado
aT
permite transparência
at
mapeamento de textura

Outro
av
vira as normais pelo avesso: sempre visualizador de face
#aw
Espessura da linha (em pixels)
aC
manuseia polígonos côncavos
#vc
fechador de arestas que não pertencem a faces (tente 5-100)

Cor
Cf
faces
Ce
arestas
Cn
normais
Cb
caixas associadas
CB
fundo

Movimentos
r
rotação
t
translação
z
modificações proporcionais de tamanho (FOV - campo de visão)
f
vôo
o
orbita
s
homotetia
w
recentralizar o alvo
W
recentralizar tudo
h
pare
H
pare tudo
@
selecione o centro do movimento (e.g. g 3 @)
L
Olhe para objeto

Visualizando
0vp
visão Ortográfica
1vp
visão em perspectiva
vd
Habilite outras câmeras de visão
#vv
campo de visão
#vn
próxima distância de corte
#vf
distância de corte afastada
v+
adicione nova câmera
vx
cursor ligado/desligado
vb
face de trás de um polígono separada habilitada/desabilitada
#vl
distância focal
v~
Tonalidade feita via software ligada/desligada

Painéis
Pm
Principal
Pa
Aparência
Pl
Iluminação
Po
Obscuro
Pt
Ferramentas
Pc
Câmeras
PC
Comandos
Pf
arquivos
Ps
Salvar
P-
ler comandos pelo tty
PA
Créditos ("about")

Luzes
ls
mostrar luzes
le
editar luzes

Espaço
me
Euclidiano
mh
Hiperbólico
ms
Esférico

Modelo
mv
Virtual
mp
Projetivo
mc
Conformal

Outro
0N
normalização: nenhuma
1N
normalização: individual
2N all
normalização: todos
ui
movimento: Inércial
uc
movimento: Contração para o eixo
uo
movimento: coordenadas próprias do objeto
<
Pf
carregar arquivo geométrico ou de comandos
dd
apagar objeto alvo
>
Ps
grave o estado atual em um arquivo
TV
mudar para o modo NTSC
p
selecionar como objeto alvo (e.g. g 3 p) Sem preixo, seleciona o objeto sob o cursor do mouse (da mesma forma que duplo-clicando o botão direito do mouse)
geomview-1.9.5/doc/geomview-pt_BR.html/Formatos-dos-Arquivos-da-OOGL.html0000644000175000017500000000513412310162311023012 00000000000000 Formatos dos Arquivos da OOGL - Manual do Geomview

Next: , Previous: Interacao, Up: Top


4 Formatos dos Arquivos da OOGL

Os objetos que você pode carregar dentro do Geomview são chamados objetos OOGL. OOGL significa “Object Oriented Graphics Library” (biblioteca gráfica orientada a objetos); é a biblioteca sobre a qual Geomview é construído.

Existem muitos tipos diferentes de objetos OOGL. Esse capítulo fornece descrições sintáticas de formatos de arquivo para objetos OOGL.

Exemplos da maioria dos tipos de arquivo podem ser encontrados no diretório data/geom do Geomview.

geomview-1.9.5/doc/geomview-pt_BR.html/Convencoes.html0000644000175000017500000000667312310162311017621 00000000000000 Convencoes - Manual do Geomview

4.1 Convenções

geomview-1.9.5/doc/geomview-pt_BR.html/Sintaxe-comum.html0000644000175000017500000000642112310162311020237 00000000000000 Sintaxe comum - Manual do Geomview

Next: , Previous: Convencoes, Up: Convencoes


4.1.1 Sintaxe Comum a Todos os Formatos de Arquivo da OOGL

A maioria dos formatos de arquivo de objeto OOGL são do formato livre ASCII — qualquer quantidade de espaços em branco (caracteres não imprimíveis, tabulações, caractere de nova linha) pode aparecer entre os sinalizadores (números, palavras chave, etc.). Paradas de linha são na maioria das vezes sempre insignificantes, com algumas excessões devidamente ressaltadas. Comentários começam com # e continuam até o fim da linha; esses comentários são permitidos em qualquer lugar onde um caractere de nova linha for permitido também.

Formatos binários são também definidos para muitos objetos; Veja Formato binario, e as descrições individuais do objeto.

Objetos típicos OOGL começam com uma palavra chave designando o tipo de objeto, possivelmente com modificadores indicando a presença de informações de cor, etc. Em alguns formatos a palavra chave é opcional, por questões de compatibilidade com formatos de arquivo definidos em outros lugares. O tipos de objeto é então determinado por suposição sobre o sufixo do arquivo (se houver) ou pelos dados em si mesmos.

Palavras chave são sensíveis à caixa alta/baixa. Algumas palavras chave possuem letras de prefixo adicionais indicando a presença de cor ou outros dados; nesse caso a ordem dos prefixos é importante, e.g. CNMESH é significativo mas NCMESH é inválido. geomview-1.9.5/doc/geomview-pt_BR.html/Nomes-de-arquivos.html0000644000175000017500000000401212310162311021016 00000000000000 Nomes de arquivos - Manual do Geomview

Next: , Previous: Sintaxe comum, Up: Convencoes


4.1.2 Nomes de Arquivo

Quando objetos OOGL são lidos de arquivos localizados em disco, a biblioteca OOGL usa o sufixo do arquivo para supor o tipo de arquivo.

Se o sufixo for desconhecido, ou estiver ausênte (e.g. para um objeto sendo lido a partir da saída de um outro comando diretamente, ou lido diretamente de dentro de um outro objeto OOGL), todos os tipos conhecidos de objeto são tentados por sua vez até que se aceite os dados como válidos. geomview-1.9.5/doc/geomview-pt_BR.html/Vertices.html0000644000175000017500000001001612310162311017265 00000000000000 Vertices - Manual do Geomview

Next: , Previous: Nomes de arquivos, Up: Convencoes


4.1.3 Vértices

Muitos objetos compartilham um estilo comum de representar vértices com opções de superfície normal de vértice e cor. Todos os vértices dentro de um objeto possuem o mesmo formato, especificado pela palavra chave no cabeçalho.

Todos os dados para um vértice estão agrupados juntos (em oposição a e.g. fornecimento de coordenadas para todos os vértices, em seguida cores para todos os vértices, e assim por diante).

A sintaxe é

x y z
(coordenadas do vértice tridimensionais em ponto flutuante) ou
x y z w
(coordenadas do vértice tetradimensionais em ponto flutuante)

opcionalmente seguida por

nx ny nz
(superfície normalizada tridimensional se presente)

opcionalmente seguida por

r g b a
(componente quádrupla em ponto flutuante se presente, cada componente no intervalo 0..1. A componente a (alfa) representa a opacidade: 0 transparente, 1 opaco.)

opcionalmente seguida por

s t
ou
s t u

(duas ou três valores coordenados de textura).

Valores são separados por espaços em branco, e quebras de linha são imateriais.

Letras na palavra chave de cabeçalho do objeto devem aparecer numa ordem específica; isto é a ordem reversa na qual os dados são fornecidos para cada vértice. Então vértices de objeto do tipo ‘CN4OFF’ possuem primeiramente as componentes quadridimensionais de posicionamento no espaço, a seguir as componentes normais tridimensionais, finalmente as componentes quadridimensionais de cor. Você pode modificar a ordem dos dados modificando o cabeçalho de palavra chave; um ‘NCOFF’ é apenas não reconhecido. geomview-1.9.5/doc/geomview-pt_BR.html/ND_002dVertices.html0000644000175000017500000000675312310162311020251 00000000000000 ND-Vertices - Manual do Geomview

4.1.4 Vértices N-dimensionais

Muitos objetos compartilham um estilo comum de representação de vértice com opcionais de superfície normal e cor. Todos os vértices dentro de um objeto possuem o mesmo formato, especificado pela palavra chave do cabeçalho.

Todos os dados para um vértice estão agrupados juntos (em oposição a e.g. fornecendo coordenadas para todos os vértices, a seguir cores para todos os vértices, e assim por diante).

A sintaxe para vértices N-dimensionais (N > 3) é

x[1] x[2] x[3] x[4] ...
(N coordenadas do vértice em ponto flutuante) ou
x[0] x[1] x[2] x[3] x[4] ...
((N+1) coordenadas do vértice em ponto flutuante, se o modificador 4 tiver sido especificado na linha de cabeçalho do objeto)

Note, todavia, que objetos N-dimensionais internamente sempre possuem pontos (N+1)-dimensionais; a primeira componente x[0] – se presente no arquivo do objeto file – é usada como divisor homogêneo. Isso é diferente do caso tridimensional comum onde o modificador 4 gera um objeto quadridimensional onde a componente quadridimensional implicitamente é escolhida para 1.

Componentes de cor usualmente podem ser especificadas da mesma forma que para vértices tridimensionais, Veja Vertices, enquanto especificando componentes de cor em normais não faz sentido. geomview-1.9.5/doc/geomview-pt_BR.html/Direcoes-de-superficies-normais.html0000644000175000017500000000464212310162311023621 00000000000000 Direcoes de superficies normais - Manual do Geomview

4.1.5 Direções de superfícies normais

Geomview utiliza vetores normais para determinar como um objeto é compartilhado. A direção da normal é importante nesse cálculo.

Quando normais forem fornecidos com um objeto, a direção da normal é determinada pelos dados fornecidos.

Quando normais não forem fornecidos com o objeto, Geomview calcula vetores normais automaticamente; nesse caso normais apontam para adiante do lado do qual os vértices aparecem na ordem anti-horária.

Sobre superfícies paramétricas (retalhos de Bezier), o vetor normal no ponto P(u,v) está na direção dP/du multiplicado vetorialmente por dP/dv. geomview-1.9.5/doc/geomview-pt_BR.html/Matrizes-de-transformacao.html0000644000175000017500000000554112310162311022531 00000000000000 Matrizes de transformacao - Manual do Geomview

4.1.6 Matrizes de transformação

Alguns objetos incorporam matrizes quadradas reais de ordem 4 para transformações sobre objetos homogêneos. Essas matrizes atuam através de multiplicação à direita de vetores. Dessa forma, se p for um vetor linha de 4 elementos representando coordenadas homogêneas de um ponto no objeto OOGL, e A for a matrix 4x4, então o ponto resultante da transformação é p' = p A. Essa convenção matricial é comum em computação gráfica; é a matriz transposta daquela muitas vezes usada em matemática, onde pontos são vetores coluna multiplicados à direita pelas matrizes.

Dessa forma para transformações Euclideanas, as componentes para translação aparecem na quarta linha (os últimos quatro elementos) da matriz A. A última coluna da matriz A (quarto, oitavo, décimo segundo e décimo sexto elementos) são tipicamente 0, 0, 0, e 1 respectivamente. geomview-1.9.5/doc/geomview-pt_BR.html/Matrizes-de-transformacao-ND.html0000644000175000017500000000556312310162311023034 00000000000000 Matrizes de transformacao ND - Manual do Geomview

4.1.7 Matrizes de transformação ND

No contexto do espaço N-dimensional (N > 3) alguns objetos incorporam (N+1)x(N+1) matrizes reais para transformações sobre objetos homogêneos. Essas matrizes atuam através de multiplicação à direita de vetores. Dessa forma, se p for um vetor linha de (N+1)-elementos representando coordenadas homogêneas de um ponto no objeto OOGL, e A é a matriz quadrada de ordem (N+1), então o ponto resultante da transformação é p' = p A.

Note que (a excessão de matrizes de transformação 4x4, veja Matrizes de transformacao) a componente homogênea é localizada nos elementos com índice zero, de forma que componentes de transformação para transformações Euclideanas aparecem na zero-ésima linha (primeiros (N+1) elementos). A primeira coluna da matriz A (a coluna com índice zero) é tipicamente 1, 0, ..., 0. geomview-1.9.5/doc/geomview-pt_BR.html/Formato-binario.html0000644000175000017500000000765112310162311020544 00000000000000 Formato binario - Manual do Geomview

4.1.8 Formato binário

Muitos objetos OOGL aceitam formatos o formato de arquivo binário bem como o formato de arquivo ASCII. Esses arquivos começam com a indicação usual (e.g. CQUAD) seguida pela palavra BINARY. Dados binários iniciam-se no byte imediatamente seguinte ao primeiro caractere de nova linha após a palavra BINARY. Espaços em branco e um simples comentário podem atrapalhar, e.g.

     OFF BINARY	# binary-format "OFF" data follows

Dados binários compreendem inteiros de 32 bits e os inteiros em ponto flutuante de 32 bits conforme definido pela IEEE (IEEE Standard for Binary Floating-Point Arithmetic (ANSI/IEEE Std 754-1985 - Institute of Electrical and Electronics Engineers), ambos os formatos seguem à forma de ordenação "big-endian" (i.e., com o byte mais significativo em primeiro lugar). Esse é o formato nativo para tipos de dado int e tipos de dado float em sistemas do tipo Sun-3, Sun-4, e Irises, além de muitos outros sistemas.

Formatos de dados binários assemelham-se aos formatos correspondentes em ASCII, com tipos de dado "int" e tipos de dado "float" nos lugares que você está acostumado a encontrar. Existe algumas excessões todavia, especificamente dos formatos d arquivo QUAD, OFF e COMMENT. Detalhes são fornecidos no arquivo individual das descrições do formato específico. Veja em QUAD, OFF, e em See COMMENT.

Objetos OOGL binários podem ser livremente misturados em fluxos de objetos ASCII:

     LIST
     { = MESH BINARY
     ... dados binários de uma malha aqui ...
     }
     { = QUAD
     	1 0 0   0 0 1   0 1 0  0 1 0
     }

Note que dados ASCII continuam seguindo imediatamente o último byte dos dados binários.

Naturalmente, é impossível incluir comentários dentro de um objeto em formato binário OOGL, todavia comentários podem aparecer no cabeçalho antes do início dos dados binários. geomview-1.9.5/doc/geomview-pt_BR.html/Referencias.html0000644000175000017500000001161712310162311017737 00000000000000 Referencias - Manual do Geomview

Next: , Previous: Formato binario, Up: Convencoes


4.1.9 Referências a Objetos Embutidos e a Objetos Externos

Alguns tipos de objeto OOGL (LIST, INST) permitem referências a outros objetos OOGL, que podem aparecer literalmente no fluxo de dados, serem chamados a partir de arquivos em disco, ou serem comunicados a partir de outro lugar via objetos nomeados. Comandos GCL também aceitam objetos geométricos através desses meios citados.

A sintaxe genérica é

      <oogl-object>  ::=
     	[ "{" ]
     	    [ "define" symbolname ]
     	    [ ["="] object-keyword ...
     		 | "<" filename
     		 | ":" symbolname ]
     	[ "}" ]

onde os itens entre aspas duplas são sequências de caracteres literais (que aparecem sem as aspas), os itens entre colchêtes ([]) são opcionais, e a barra vertical (|) denota alternativas. Chaves, quando estiverem presentes, apenas indicam coincidência; o par mais externo de chaves é geralmente requerido quando o objeto estiver em um contexto maior, e.g. quando for parte de um objeto maior ou incluído em um fluxo de comando do Geomview.

Por exemplo, cada uma das três linhas seguintes:

     	{ define fred   QUAD 1 0 0  0 0 1  0 1 0  1 0 0 }
     
     	{ define fred = QUAD 1 0 0  0 0 1  0 1 0  1 0 0 }
     
     	{ appearance { +edge } LIST { < "file1" } { : fred } }
     
     	VECT 1 2 0   2 0   0 0 0   1 1 2

é um bojeto OOGL válido. O último exemplo é válido somente quando estiver delimitado precisamente e residindo precisamente no seu próprio arquivo em disco.

A construção com ":" permite referência a símbolos, criados com define. Um valor inicial de um símbolo é um objeto nulo. Quando um símbolo for (re)definido, todas as referências a esse símbolo são automaticamente modificadas.

A construção "define NOME" permite definir um simbolo global para um objeto especificado. Se "NOME" referir-se a um objeto que já existia anteriormente, então o antigo objeto é descartado e substituído pela nova definição. Veja (read ...). (hdefine ...).

A construção "<" faz com que um arquivo em disco seja lido. Note que isso não é um mecanismo textual genérico de uso da diretiva de programação "include"; um objeto OOGL completo deve aparecer no arquivo referenciado na construção "<".

Arquivos lidos usando "<" são procurados primeiramente no diretório do arquivo que é refrenciado em "<", se existir; se essa busca falhar, o caminho normal de busca (veja (load-path ...)) é usado. A busca padrão olha primeiro no diretório atual, a seguir nos diretórios de dados do Geomview.

Ressaltando, espaços em branco e caracteres indicadores de final de linha são insignificantes, e comentários de "#" podem aparecer em qualquer lugar. geomview-1.9.5/doc/geomview-pt_BR.html/Aparencias.html0000644000175000017500000003560212310162311017557 00000000000000 Aparencias - Manual do Geomview

Next: , Previous: Referencias, Up: Convencoes


4.1.10 Aparências

Objetos geométricos podem ter informações de aparência associada, especificando tonalidade, brilho, cor, visualização wire-frame vs. shaded-surface, e assim por diante. Aparências são erdadas através de hierarquías de objetos, e.g. anexando uma aparência a uma lista (LIST) significa que a aparência é aplicada a todos os membros de LIST.

Algumas propriedades relacionada a aparência são relegadas a subestruturas tais como "material", "lighting" e "texture". Seja cuidadoso para notar quais propriedade pertencem a qual estrutura. Qualquer objeto geométrico pode ser precedido por uma definição de aparência como no sguinte exemplo:

     {
        appearance { +edge }
        LIST { < "arquivo1" } { QUAD 1 0 0  0 0 1  0 1 0  1 0 0 }
     }

Aparências são também objetos OOGL no seu próprio direito e pode ser fornecido nomes simbólicos e referência a elas. Veja (Referencias) e em Objetos de aparência.

Texture Mapping
Existe uma seção separada com relação a definição de texturas: (Mapeamento de Textura).
Transparency
Objetos de renderização translúcida não são suportados por todos os desenhadores que funcionam no Geomview. O renderizador OpenGL tem suporte limitado para isso: objetos de nível mais alto (i.e. aqueles que aparecem no navegador de objetos do painel principal (veja O Painel Principal) são renderizados corretamente por meio de alpha-blending). Também, os instantâneos do RenderMan irão incluir valores de opacidade.

Aqui está um exemplo de estrutura de aparência incluindo valores para todos atributos. A ordem dos atributos não é importante. Como usual, espaços em branco ssão irrelevates. Atributos Booleanos podem ser precedidos por "+" ou "-" para torná-los habilitados ou desabilitados; "+" é assumido se somente o nome do atributo aparecer. Outros valores esperados de atributo.

Um "*" prefixado a um atributo, e.g. "*+edge" ou "*linewidth 2" ou "material { *diffuse 1 1 .25 }", seleciona a situação atual para sobrescrever ("override") para aquele atributo.

     appearance {
       +face               # (Faz) desenho de faces dos polígonos.  Habili-
                           # tado por padrão.
       -edge               # (Não faz) desenho de arestas de polígonos.
       +vect               # (Faz) desenho de vetores (VECTs).  Habilitado
                           # por padrão.
     
       transparent screendoor
                           # (Habilita) transparência. Habilitação de
                           # transparência.
                           # não (necessariamente) resulta em cores corretas
                           # no Geomview, mas os valores de alfa são usados
                           # em instantâneos RenderMan.
                           # As palavras chave permitidas são ``screendoor''
                           # (mascarando pixels de saída por meio de um
                           # modelo de ponteamento), ``blending'' para
                           # alpha-blending ( harmonização de alfa)
                           # com BSP-tree (árvore BSP) particionando o
                           # espaço e ordenando com precisão
                           # (lento) e ``naive'' para harmonização de
                           # alfa sem mesmo ordenar com precisão, não
                           # para falar sobre particionamento de espaço.
                           # Omitindo a palavra chave o padrão será
                           # harmonização de alfa com árvore
                           # particionando o espaço e ordenando com
                           # precisão.
       -normal             # (Faz) desenho de vetores normais a uma
                           # superfície.
     
       normscale 1         # ... com comprimento 1.0 em coordenadas do
                           # objeto.
     
       +evert              # faz a inversão de normais de polígono onde
                           # necessário de forma que sempre tenha
                           # câmera naquela face
     
       +texturing          # (Habilita) mapeamento de textura
       +linear             # (Habilita) média linear de elementos de textura
                           # mais fechados
     
       +mipmap             # (Habilita) mapeamento mip de textura
       +mipinterp          # (Habilita) mapeamento mip linear
     
       -backcull           # (Não faz) descarte da orientação de faces
                           # no sentido anti-horário
     
       -concave            # (Não faz) presunção e manuseio de polí-
                           # gonos côncavos
     
       -shadelines	      # (Não faz) linhas de tonalidade como se elas esti-
                           # vessem iluminando cilindros
                           # Esses quatro (mipinterp, backcull, concave,
                           # shadelines) são somente efetivos onde o
                           # sistema gráfico suportá-los, a saber em GL e
                           # Open GL.
     
       -keepcolor	      # Normalmente, quando informação de cor N-D posi-
                           # cional está habilitada como
                           # com o comando do geomview (ND-color ...), todas
                           # as cores de objetos são afetadas.  Mas, objetos
                           # com o atributo "+keepcolor" são imunes a infor-
                           # mações de cor N-D.
     
       shading smooth      # ou ``shading constant'' ou ``shading flat'' ou
                           # ou ``shading csmooth'' ou ``shading vcflat''.
                           # smooth = tonalidade de Gouraud, flat = facetado,
                           # csmooth = linearmente interpolado mas não
                           # iluminado, vcflat = tonalidade monótona, mas
                           # cores linearmente interpoladas.
     
       linewidth 1         # linhas, pontos, e arestas são da largura de
                           # 1 pixel.
     
       patchdice 10 10     # subdivide retalhos de Bezier esmiuçadamente em
                           # u e v
     
       material {         # Aqui está uma definição material;
                           # pode também ser lido de um arquivo como em
                           #  ``material < arquivo.mat''
     
           ka  1.0         # coeficiente de reflexão ambiente.
           ambient .3 .5 .3 # cor do ambiente (em componentes de vermelho,
                           # verde, azul). A contribuição ambiente para a to-
                           # nalidade é o produto de ka, a cor do ambiente,
                           # pela cor da luz ambiente.
     
           kd  0.8         # coeficiente de reflexão difusa.
           diffuse .9 1 .4 # cor difusa.
                             # (No modo ``shading constant'' (tonalidade
                             # constante), a superfície
                             # é colorida com a cor difusa.)
     
           ks 1.0          # coeficiente de reflexão especular.
           specular 1 1 1  # cor especular (destacada).
           shininess  25   # expoente especular; grandes valores fornecem
                           # destaques falsos.
     
           backdiffuse .7 .5 0 # cor da face de trás para superfícies com
                           # dois lados. Se definido, esse campo determina
                           # a cor difusa para o lado de trás de uma super-
                           # fície. É implementada através de tonalidade
                           # via software, e por tonalidade via hardware
                           # sob sistemas GL que suportam iluminação de
                           # dois lados, e sob Open GL.
     
           alpha   1.0     # opacidade; 0 = transparente (invisível),
                           # 1 = opaco. Ignorado quando a transparência
                           # estiver desabilitada.
     
           edgecolor   1 1 0  # cor de linha & aresta
     
           normalcolor 0 0 0  # cor para vetores normais a uma superfície
       }
     
       lighting {         # Modelo de iluminação
     
           ambient  .3 .3 .3  # luz ambiente
     
           replacelights   # ``Use somente as seguintes luzes para
                           # iluminar os objetos sob essa
                           # aparência.''
                           # Sem "replacelights" (substituição de luzes),
                           # quaisquer luzes listadas são adicionadas
                           # a esses na cena.
     
                           # Agora uma coleção exemplo de luzes:
           light {
               color  1 .7 .6      # cor da luz
               position  1 0 .5 0  # posição da luz [distant light]
                                   # fornecida em coordenadas homogêneas.
                                   # Com a quarta componente = 0,
                                   # isso significa uma luz vindo da
                                   # direção (1,0,.5).
           }
     
           light {                        # Outra luz.
               color 1 1 1
               position  0 0 .5 1  # luz na posição finita ...
               location camera     # especificada em coordenadas de câmera.
                                   # (Uma vez que a câmera olha adiante -Z,
                                   # esse exemplo coloca a luz
                                   # .5 unidade atrás do olho.)
               # Possível palavra chave de localização ("location"):
               #  global   posição da luz global em coordenadas de objeto mundo
               #             (bem, universo). Esse é o padrão se nenhuma
               #             localização for especificada.
               #  camera   posição da câmera em coordenadas do sistemade
               #             câmera
               #  local    posição local em coordenadas do sistema onde
               #                   a aparência foi definida
           }
       }                   # fim do modelo de iluminação
       texture {
             clamp st               # ou ``s'' ou ``t'' ou ``none''
             file lump.tiff         # arquivo fornecendo imagem de mapa de
                                    # textura
             alphafile mask.pgm.Z   # arquivo fornecendo imagem de máscara
                                    # de transparência
             apply blend            # ou ``modulate'' ou ``decal''
             transform  1 0 0 0     # superfície (s,t,0,1) * tfm -> coor-
                        0 1 0 0     # denadas de textura
                        0 0 1 0
                       .5 0 0 1
     
             background 1 0 0 1     # relevante para ``apply blend''
       }
     }                     # fim de aparência

Existem regras para herança de atributos de aparência quando muitas aparência são impostas em diferentes níveis na hierarquía.

Por exemplo, Geomview instala uma aparência de parada de segurança que fornece valores padrão para a maioria dos parâmetros; seu painel de controle instala outras aparências que fornecem novos valores para uns poucos atributos; a geometria fornecida pelo usuário pode também conter aparências.

A regra geral é que a aparência dos filhos (aquelas fechadas para as primitivas geométricas) vencem. Adicionalmente, controles de aparência com situação atual em sobrescrever ("override") (e.g. *+face ou material { *diffuse 1 1 0 }) vencem sobre as outras que estiverem sem o atributo de sobrescrever.

Os controles de aparência do Geomview usam o recurso de sobrescrever "override" de forma a ser efetivo mesmo se objetos fornecidos pelo usuário contiverem suas próprias escolhas de aparência. Todavia, Se um objeto fornecido pelo usuário contiver um campo de aparência com o recurso de sobrescrever ativado, esse campo de aparência será imune aos controles do Geomview. geomview-1.9.5/doc/geomview-pt_BR.html/Mapeamento-de-Textura.html0000644000175000017500000002156312310162311021620 00000000000000 Mapeamento de Textura - Manual do Geomview

Previous: Aparencias, Up: Convencoes


4.1.11 Mapeamento de Textura

Alguns programas que trabalham sem contato direto com o usuário suportam objetos mapeados em textura, atualmente apenas o OpenGL e a interface RenderMan no momento dessa escrita. Existe também alguns recursos com a interface RMan quando em uso um canal alfa na imagem de textura. Aqueles programas que não trabalham diretamente com o usuário cujo suporte a textura não existe silenciosamente ignoram tentativas de uso de mapeamento de textura. Uma textura é especificada como parte de uma estrutura de aparência (Veja Aparencias). Resumidamente, se fornece uma imagem de textura (Veja também Objetos de imagem), a qual é considerada contida em um quadrado no espaço parametrizado (s,t) no intervalo 0 <= s <= 1, 0 <= t <= 1. Então se fornece uma primitiva geométrica, com cada vértice acompanhado com as coordenadas de textura (s,t). Se a texturização estiver habilitada, a porção apropriada da imagem de textura é colada sobre cada face do objeto texturizado.

Não existe (atualmente) nenhuma provisão para herança de parte de uma estrutura de textura; se a palavra chave texture é mencionada em uma aparência, essa mensão suplanta qualquer outra especificação de textura.

O atributo de aparência texturing controla se texturas são usadas; não existe perda de performace tendo campos "texture { ... }" definidos quando a utilização de texturas está desabilitada.

Os campos de textura disponíveis são:

     clamp   none  -ou-  s  -ou-  t  -ou-  st
       Determina o significado de coordenadas de textura fora do intervalo
       0..1. Com clamp none, o padrão, coordenadas são
       interpretadas modulo 1, então (s,t) = (1.25,0), (.25,0), e (-.75,0)
       referem-se todos ao mesmo ponto no espaço das texturas.  Com
       clamp s ou clamp t ou clamp st, individualmente
       ou ambos de s-coordenadas ou t-coordenadas menor que 0 ou
       maior que 1 são remapeadas para 1 ou para 0, respectivamente.
     
     image { <especificação de imagem> (Objetos de imagem) }
       Especifica a atual imagem de textura. Imagens de textura podem ter
       1, 2, 3 ou 4 canais:
         1 canal:  luminância
         2 canais: luminância e alfa (opcidade:0 transparente, 1 opaco)
         3 canais: dados RGB
         4 canais: dados RGBA
     
       Veja Objetos de imagem, para a definição atual de
       objetos de imagem. O canal usado por alfa é somente interpretado
       como máscara: onde a mácara é zero, pixels são simplesmente
       omitidos. Uma exceção é o caso onde apply
       é igual a modulate e a translucência está habilitada:
       nesse caso o valor de alfa resultante é o resultado da
       multiplicação da cor da superfície pelo valor de alfa do
       canal alfa da textura.
     
     file      nomearquivo
     alphafile nomearquivo
       Isso é considerado obsoleto, e somente mantido por compatibilidade,
       o moderno caminho é usar o novo objeto imagem OOGL. Veja
       Objetos de imagem.  O material documentado aqui pode
       ainda funcionar apesar disso
     
       Especifica arquivos de imagem contendo a textura.
     
       A palavra chave file especifica um arquivo com informações de cor
       ou de brilho; alphafile se presente, especifica uma máscara de
       transparência ("alpha"); onde a máscara for zero, pixels simplesmente
       são omitidos.  Muitos formatos de arquivo de imagem estão
       disponíveis; o tipo de arquivo deve ser indicado pelos últmos poucos
       caracteres do nome do arquivo:
         .ppm ou .ppm.Z ou .ppm.gz  24-bit 3-color imagem no formato PPM
         .pgm ou .pgm.Z ou .pgm.gz  8-bit tons de cinza imagem no formato PGM
         .sgi ou .sgi.Z ou .sgi.gz  8-bit, 24-bit, ou 32-bit imagem SGI
         .tiff                      8-bit ou 24-bit imagem TIFF
         .gif                       imagem GIF
       Para esse recurso trabalhar, alguns programas devem estar disponíveis
       no caminho de busca do Geomview:
         zcat  para arquivo .Z
         gzip  para arquivos .gz
         tifftopnm para arquivos .tiff
         giftoppm para arquivos .gif
     
       Se uma imagem alphafile for fornecida, essa imagem deve ser do mesmo
       tamanho que a imagem file.
     
       Objetos imagem fornecem um caminho mais flexível para especificar dados de
       textura. Veja Objetos de imagem.
     
     apply   modulate  -ou-  blend  -ou-  decal
       Indica como a imagem de textura é aplicada à superfície.
       Aqui a "surface color" (cor da superfície) significa a cor que a
       superfície pode ter   na ausência de mapeamento de textura.
     
       Com modulate, o padrão, a cor de textura (ou iluminação,
       se texturizado por meio de uma imagem de escala de cinza) é multiplicada
       pela cor da superfície.
     
       Com blend, textura harmoniza-se entre cor de fundo (background)
       e a cor da superfície.  O parâmetro file deve especificar uma
       imagem de escala de cinza.  Onde a imagem de textura é 0, a cor da
       superfície permanece inalterada; onde for 1, a superfície é
       colorida na cor dada por background; e cor é interpolada para
       valores imediatos.
     
       Com decal, o parâmetro file deve especificar uma
       imagem de tres cores.  Se um parâmetro alphafile estiver presente,
       seus valores interpolam-se entre a cor da superfície (onde alpha=0)
       e a cor de textura (onde alpha=1).  Iluminação não afeta a
       cor de textura no modo decal; efetivamente a textura é
       tonalidademente constante.
     
     background  R G B A
       Especifica uma cor com 4 componentes, com números R, G, B, e A em
       ponto flutuante normalmente no intervalo 0..1, usados quando
       apply blend for selecionado.
     
     transform matriz-de-transformação
       Espera uma lista de 16 números, ou um dos outros caminhos de
       representar uma transformação (: nomecabeçalho ou
       < nomearquivo). A matriz 4x4 de transformação é
       aplicada a coordenadas de textura, no sentido de um vetor linha de
       4 componentes (s,t,0,1) multiplicado à esquerda pela matriz, para
       produzir novas coordenadas (s',t') às quais atualmente indexam a
       textura.
geomview-1.9.5/doc/geomview-pt_BR.html/Formatos-de-Arquivo-de-Objeto.html0000644000175000017500000000663312310162311023125 00000000000000 Formatos de Arquivo de Objeto - Manual do Geomview

4.2 Formatos de Arquivo de Objeto

geomview-1.9.5/doc/geomview-pt_BR.html/QUAD.html0000644000175000017500000000721212310162311016237 00000000000000 QUAD - Manual do Geomview

4.2.1 QUAD: coleção de quadriláteros

O sufixo convencional para um arquivo QUAD é .quad.

A sintaxe do arquivo é

        [C][N][4]QUAD  -ou-  [C][N][4]POLY		   # Palavra chave
        vértice  vértice  vértice  vértice  # vértices 4-D para algum N
        vértice  vértice  vértice  vértice
        ...

A palavra chave inicial é [C][N][4]QUAD ou [C][N][4]POLY, onde o prefixos opcionais C e N indicam que cada vértice inclui cores e retas normais respectivamente. Isto é, esses arquivos iniciam-se com uma das palavras

QUAD CQUAD NQUAD CNQUAD POLY CPOLY NPOLY CNPOLY

(mas não com NCQUAD ou NCPOLY). QUAD e POLY são sinônimos; ambas as formas são permitidas apenas por compatibilidade com ChapReyes.

Seguindo a palavra chave está um número arbitrário de grupos de quatro vértices, cada grupo descrevendo um quadrilátero. Veja a sintaxe de vértice acima. O objeto termina no caractere de fim de arquivo, ou com uma chave fechada se incorporado dentro de uma referência de objeto (veja acima).

Um formato de arquivo QUAD BINARY é aceito; veja Formato binario. A primeira palavra de dados binários deve ser um inteiro de 32 bits fornecendo o número de quads no objeto; seguindo esse inteiro encontra-se uma série de inteiros em ponto flutuante de 32 bits, arranjados apenas como no formato ASCII. geomview-1.9.5/doc/geomview-pt_BR.html/MESH.html0000644000175000017500000001360012310162311016237 00000000000000 MESH - Manual do Geomview

Next: , Previous: QUAD, Up: Formatos de Arquivo de Objeto


4.2.2 MESH: Malha retangularmente conectada

O sufixo convencional para um arquivo MESH é .mesh.

A sintaxe do arquivo é

     [U][C][N][Z][4][u][v][n]MESH # Palavra chave
     [Ndim]                       # Dimensão do espaço, presente
                                   # somente se nMESH
     Nu Nv                        # dimensões da grade da malha
                                  # Nu*Nv vértices, no formato especificado
                                  # pela palavra chave inicial
     vértice(u=0,v=0)  vértice(1,0)  ... vértice(Nu-1,0)
     vértice(0,1) ...    vértice(Nu-1,1)
     ...
     vértice(0,Nv-1) ... vértice(Nu-1,Nv-1)

A palavra chave é [U][C][N][Z][4][u][v][n]MESH. Os caracteres opcionais prefixados significam:

U
Cada vértice inclue uma textura de 3 parâmetros de espaço de componente. As primeiras duas componentes são parâmetros usuais de textura S e T para quele vértice; o terceiro pode ser especificado como zero.
C
Cada vértice (veja Vertices acima) inclui uma cor de quatro componentes.
N
Cada vértice inclui um vetor normal à superfície.
Z
Dos valores dos 3 eixos coordenados (x , y e z) de vértice somente a componente Z está presente; X e Y são omitidos, e assumidos ambos como sendo iguais às coordenadas de malha (u,v) de forma que X varia de 0 .. (Nu-1), Y varia de 0 .. (Nv-1) onde Nu e Nv são as dimenssões de malha – veja acima.
4
Vértices são quadridimensionais, cada vértice consiste em 4 valores em ponto flutuante. Z e 4 não podem ambos estarem presentes ao mesmo tempo.
u
A malha é ajustada na direção u, de forma que o (0,v)'ésimo vértice está conectado ao (Nu-1,v)'ésimo para todo v.
v
A malha é ajustada na direção v, de forma que o (u,0)'´esimo vértice está conectado ao (u,Nv-1)'ésimo para todo u. Dessa forma uma malha u-ajustada ou v-ajustada é topologicamente um cilindro, enquanto uma malha uv-ajustada é um toro.
n
Especifica uma malha cujos vértices existem em um espaço de dimensão mais alta. A dimensão segue a palavra chave "MESH". Cada vértice então tem Ndim componentes.

Note que a ordem dos caracteres do prefixo é significativa; uma malha colorida, u-ajustada é uma CuMESH não uma uCMESH.

Seguindo o cabeçalho da malha estão os inteiros Nu e Nv, as simensões da malha.

Então segue-se Nu*Nv vértices, cada um desses vértices na forma fornecida através do cabeçalho. Eles aparecem na sequência v-crescente, i.e. se chamarmos cada vértice de (u,v) então os vértices aparecerão na ordem

     (0,0) (1,0) (2,0) (3,0) ...  (Nu-1,0)
     (0,1) (1,1) (2,1) (3,1) ...  (Nu-1,1)
     ...
     (0,Nv-1)		...  (Nu-1,Nv-1)

O formato MESH BINARY é aceito; Veja Formato binario. Os valores de Nu e Nv são inteiros de 32-bit; todos os outros valores são números em ponto flutuante de 32-bit. geomview-1.9.5/doc/geomview-pt_BR.html/BBOX.html0000644000175000017500000000646612310162311016251 00000000000000 BBOX - Manual do Geomview

4.2.3 BBOX: Caixas associada simples

Esse é um objeto-brinquedo muito simples: Toma 2 vértices e desenha um (hiper-) cubo que é a caixa associada dos dois vértices.

Sintaxe:

       BBOX
       x[0] y[0] z[0]
       x[1] y[1] z[1]

ou

       4BBOX
       x[0] y[0] z[0] w[0]
       x[1] y[1] z[1] w[1]

ou

       nBBOX
       Ndim # > 3
       x[0] y[0] z[0] w[0] ...
       x[1] y[1] z[1] w[1] ...

ou

       4nBBOX
       Ndim # > 3
       d[0] x[0] y[0] z[0] w[0] ...
       d[0] x[1] y[1] z[1] w[1] ...

Não existe formato binário BBOX. O modificador 4 tem diferentes significados dependendo da dimensão da caixa associada: 4BBOX significa que as 4 componentes dos vértices constroem uma caixa associada tetradimensional. Usando 4 em conjunção com n4nBBOX NDim – significa que os vértices especificados no arquivo possuem NDim+1 componentes, mas a componente no índice 0 é o divisor homogêneo (em oposição ao caso comum tridimensional onde o divisor homogêneo pode ser w – a terceira – componente). geomview-1.9.5/doc/geomview-pt_BR.html/BBP-and-BEZ.html0000644000175000017500000001547312310162311017276 00000000000000 BBP and BEZ - Manual do Geomview

Next: , Previous: BBOX, Up: Formatos de Arquivo de Objeto


4.2.4 Superfícies de Bezier

O sufixo de arquivo convencional para arquivos de superfície de Bezier é .bbp ou .bez. O arquivo com qualquer dos dois sufixos pode conter qualquer dos dois tipos de parte de superfície de Bezier.

Sintaxe:

       [ST]BBP -ou- [C]BEZ<Nu><Nv><Nd>[_ST]
     			# Nu, Nv são direções nos eixos u e v
     			# graus de polinômios variam 1..6
     			# Nd = dimensão: 3->3-D, 4->4-D (racional)
     			# (O sinal '<' e o sinal '>' não aparecem na entrada.)
     			# Nu,Nv,Nd são cada um dígito decimal simples.
     			# a forma BBP implica Nu=Nv=Nd=3 de forma que BBP = BEZ333.
     
     		# Qualquer número de partes de superfície de Bezier segue o cabeçalho
     			# (Nu+1)*(Nv+1) pontos de controle do pedaço da sperfície de Bezier
     			# cada 3 ou 4 números em ponto flutuante conforme o cabeçalho
       vertex(u=0,v=0)  vertex(1,0) ... vertex(Nu,0)
       vertex(0,1)			   ... vertex(Nu,1)
       ...
       vertex(0,Nv)		   ... vertex(Nu,Nv)
     
     			# coordenadas de textura ST se mencionado no cabeçalho
       S(u=0,v=0)	T(0,0)	S(0,Nv) T(0,Nv)
       S(Nu,0)	T(Nu,0)	S(Nu,Nv) T(Nu,Nv)
     
     			# número em ponto flutuante com 4 componentes no intervalo (0..1) de
     			# cores R G B A para cada canto se mencionado no cabeçalho
       RGBA(0,0)   RGBA(0,Nv)
       RGBA(Nu,0)  RGBA(Nu,Nv)

Esses formatos representam coleções de partes de superfícies de Bezier, de graus maiores que 6, e com vértices 3-D ou 4-D (racionais).

A palavra chave de cabeçalho pode assumir as formas [ST]BBP ou [C]BEZ<Nu><Nv><Nd>[_ST] (os símbolos '<' e '>' não são parte da palara chave.

O prefixo ST sobre BBP, ou o sufixo _ST sobre BEZuvn, indicam que cada pedaço de superfície inclui quatro pares de pontos com coordenadas em ponto flutuante no espaço de textura, um em cada canto do pedaço.

O prefixo C sobre BEZuvn indica um pedaço colorido, incluindo quatro conjuntos de quatro componentes com os números que especificam as cores em ponto flutuante (vermelho, verde, azul, e alfa) no intervalo 0..1, uma cor para cada canto.

Nu e Nv, cada um é um simples dígito no intervalo 1..6, são os graus do polinômio do pedaço nas direções u e v respectivamente.

Nd é o número de componentes no vértice de cada pedaço, e deve ser ou 3 para 3-D ou 4 para coordenadas homogêneas, isto é, pedaços racionais.

Pedaços BBP são pedaços bicúbicos com vértices tridimensionais, de forma que BBP = BEZ333 e STBBP = BEZ333_ST.

Qualquer número de pedaços segue o cabeçalho. Cada pedaço compreende uma série de vértices do pedaço, seguido por coordenadas opcionais de textura (s,t), seguidas por cores opcionais no formato (r,g,b,a).

Cada pedaço tem (Nu+1)*(Nv+1) vértices na ordem v-crescente, de forma que se designarmos um vértice através de seus índices (u, v) de controle de ponto a ordem é

          (0,0) (1,0) (2,0) ...  (Nu,0)
          (0,1) (1,1) (2,1) ...  (Nu,1)
          ...
          (0,Nv)            ...  (Nu,Nv)

com cada vértice contendo ou 3 ou 4 números em ponto flutuantes como especificado pelo cabeçalho.

Se o cabeçalho chama por coordenadas ST, quatro pares de números em ponto flutuante seguem: o espaço de coordenadas de textura para (0,0), (Nu,0), (0,Nv), e os cantos (Nu,Nv) do pedaço, respectivamente.

Se o cabeçalho chama por cores, segue quatro grupos de quatro componentes (vermelho, verde, azul, alfa) d cores em ponto flutuante, um para cada canto do pedaço.

A série de pedaços termina em um caractere de fim de arquivo, ou com uma chave fechada se incorporado em uma referência de objeto. geomview-1.9.5/doc/geomview-pt_BR.html/OFF.html0000644000175000017500000001761512310162311016127 00000000000000 OFF - Manual do Geomview

4.2.5 Arquivos do Tipo OFF

O sufixo convencional para arquivos OFF é .off.

Sintaxe:

     [ST][C][N][4][n]OFF	# Palavra chave do cabeçalho
     [Ndim]		# Dimensão do espaço dos vértices, presente somente se nOFF
     			# estiver também presente
     NVértices  NFaces  NArestas   # NArestas não é usado nem checado
     
     x[0]  y[0]  z[0]	# Vértices, possivelmente com normais,
     			# cores, e/ou coordenadas de textura, nessa ordem,
     			# se os prefixo N, C, ST
     			# estiverem presentes.
     			# Se 4OFF, cada vértice possui 4 componentes,
     			# incluindo uma componente final homogênea.
     			# Se nOFF, cada vértice possui Ndim componentes.
     			# Se 4nOFF, cada vértice possui Ndim+1 componentes.
     ...
     x[NVértices-1]  y[NVértices-1]  z[NVértices-1]
     
         			# Faces
         			# Nv = # vértices na referida face
         			# v[0] ... v[Nv-1]: índices dos vértices
         			#		no intervalo 0..NVértices-1
     Nv  v[0] v[1] ... v[Nv-1]  colorspec
     ...
         			# colorspec colar contínuo v[Nv-1]
         			# até o aparecer um caractere de fim de linha; pode ser de 0 a 4
         			# números
         			# nenhum: padrão
         			# inteiro: índice do mapa de cores
         			# 3 ou 4 inteiros: valores RGB[A] no intervalo 0..255
     			# 3 ou 4 números em ponto flutuante: valores RGB[A] no intervalo 0..1

Arquivos OFF (nome para "object file format" formato de arquivo de objeto) representa coleções de polígonos planos com vértices possivelmente compartilhados, um caminho conveniente para descrever poliedros. Os polígonos podem ser côncavos mas não existe suporte para polígonos contendo buracos.

Um arquivo OFF pode começar com a palavra chave OFF; isso é recomendado mas também é opcional, muitos arquivos existentes precisam dessa palavra chave.

Três inteiros ASCII seguem a palavra chave OFF: NVértices, NFaces, e NArestas. Esses são o número de vértices, faces, e arestas, respectivamente. Atualmente o software não utiliza nem verifica NArestas; ele não precisa ser correto mas deve estar presente.

As coordenadas do vértice seguem: dimensão * Nvértices valores em ponto flutuante. Esses valores em ponto flutuante estão implicitamente numerados de 0 a NVértices-1. A dimensão é ou 3 (o padrão) ou 4 (especificado pelo caractere chave 4 diretamente antes da palavra chave OFF).

Seguindo esses acima citados estão as descrições das faces, tipicamente escritos com uma linha por face. Cada linha tem a forma

     N  Vert1 Vert2 ... VertN  [cor]

Aqui N é o número de vértices sobre a considerada face, e Vert1 a VertN são índices dentro da lista de vértices (no intervalo 0..NVértices-1).

O modificador opcional cor no final da linha acima pode tomar várias formas. Caracteres de fim de linha são significativos nesse ponto: a descrição cor inicia-se após VertN e termina com o caractere de fim de linha (ou próximo caractere cerquilha # representativo de comentário). Uma cor pode ser:

ausência de caractere
a cor padrão
um inteiro
índice dentro "do" mapa de cores; veja abaixo
três ou quatro inteiros
valores de RGB e possivelmente alfa no intervalo 0..255
três ou quatro números em ponto flutuante
valores RGB e possivelmente alfa no intervalo 0..1

Para o caso de um inteiro, o mapa de cores é lido diretamente do arquivo cmap.fmap em sua forma atual no diretório data do Geomview. Algum melhor mecanismo para fornecer um mapa de cor será fornecido provavelmente algum dia.

O significado de "cor padrão" varia. Se nenhuma face do objeto tem uma cor, tudo recebe como herança a cor material padrão do ambiente. Se alguma mas não todas as faces possuem cores, o padrão é cinza (R,G,B,A=.666).

Um formato [ST][C][N][n]OFF BINARY é aceito; veja Formato binario. Esse formato assemelha-se ao formato ASCII em quase tudo que você poderia esperar, com inteiros de 32-bit para todos os contadores e índices de vértice e números em ponto flutuante de 32-bit para posições de vértice (e coordenadas de textura ou cores de vértice ou retas normais se algum dos formatos COFF/NOFF/CNOFF/STCNOFF/etc. estiver presente).

Exceção: cada um dos índices de face do vértice são seguidos por um inteiro indicando quantas componentes de cor o acompanham. Componentes de cor de face devem ser números em ponto flutuante, não valores inteiros. Dessa forma uma face triangular pouco colorida pode ser representada como

     int int int int int
     3   17   5   9   0

enquanto a mesma face colorida com vermelho pode ser

     int int int int int float float float float
      3  17   5   9   4   1.0   0.0   0.0   1.0
geomview-1.9.5/doc/geomview-pt_BR.html/VECT.html0000644000175000017500000001327112310162311016250 00000000000000 VECT - Manual do Geomview

Next: , Previous: OFF, Up: Formatos de Arquivo de Objeto


4.2.6 Arquivos do Tipo VECT

O sufixo convencional para arquivos VECT é .vect.

Sintaxe:

     [4]VECT
     NLinhaspoligonais  NVértices  NCores
     
     Nv[0] ... Nv[NLinhaspoligonais-1]     # número de vértices
                                                # em cada linha poligonal
     
     Nc[0] ... Nc[NLinhaspoligonais-1]     # número de cores fornecido
                                                # em cada linha poligonal
     
     Vert[0] ... Vert[NVertices-1]  # Todos os vértices
                                                # (3*NVertices números em
                                                # ponto flutuante)
     
     Color[0] ... Color[NCores-1]  # Todas as cores
                                                # (4*NCores números em ponto
                                                # flutuante, RGBA)

Objetos do tipo VECT representam listas de linhas poligonais (sequência de caracteres que representam segmentos de reta, possivelmente fechados). Uma linha poligonal degenerada pode ser usada para representar um ponto.

Um arquivo VECT inicia-se com a palavra chave VECT ou com 4VECT e três inteiros: NLinhas, NVértices, e NCores. Aqui NLinhas é o n´umero de linhas poligonais no arquivo, NVértices o número total de vertices vértices, e NCores o número de cores como explanado abaixo.

A seguir vem NLinhas que são inteiros de 16-bit

Nv[0] Nv[1] Nv[2] ... Nv[NLinhas-1]

fornecendo o número de vértices em cada linha poligonal. Um número negativo indica uma linha poligonal fechada; 1 denota ponto composto por um pixel simples. O somatório (dos valores absolutos) de Nv[i] deve ser igual a NVértices.

A seguir vem NLinhas que são formadas por inteiros de 16-bit Nc[i]: o número de cores em cada linha poligonal. Normalmente um dos três valores abaixo:

0
Nenhuma cor é especificada para esta linha poligonal. Seu desenho na mesma cor que a linha poligonal anterior.
1
Uma cor simples é especificada. A linha poligonal completa é desenhada nessa cor.
abs(Nv[i])
Cada vértice tem uma cor. Ou cada segmento é desenhado na correspondente cor, ou as cores são linearmente interpoladas ao longo dos segmentos de reta, dependendo da implementação.

A seguir vem NVértices grupos de 3 ou 4 números em ponto flutuante: as coordenadas de todos os vértices. Se a palavra chave for 4VECT então existirão 4 valores por vértice. O primeiro grupo abs(Nv[0]) forma a primeira linha poligonal, o grupo seguinte abs(Nv[1]) forma a segunda e assim por diante.

Finalmente NCores grupos de 4 números em ponto flutuante fornecendo valores de vermelho, verde, azul e alfa (opacidade). O primeiro grupo Nc[0] aplica-se à primeira linha poligonal, e assim por diante.

Um formato VECT BINARY é aceito; veja Formato binario. O formato binário segue exatamente o formato ASCII, com inteiros de 32-bit Big-Endian onde aparecem os números inteiros comuns, e com inteiros de 16-bit Big-Endian onde aparecem inteiros de 16-bit; números em ponto flutuante de 32-bit Big-Endian onde aparecem os valores reais. NOTA REALMENTE GRANDE: Os contadores de vértice Nv[i] e os contadores de cor Nc[i] são inteiros de 16-bit Big-Endian. geomview-1.9.5/doc/geomview-pt_BR.html/SKEL.html0000644000175000017500000001226012310162311016242 00000000000000 SKEL - Manual do Geomview

Next: , Previous: VECT, Up: Formatos de Arquivo de Objeto


4.2.7 Arquivos do Tipo SKEL

Arquivos do Tipo SKEL representam coleções de pontos e linhas poligonais, com vértices compartilhados. O sufixo convencional para arquivos SKEL é .skel.

Sintaxe:

     [C][4][n]SKEL
     [NDim]                    # Dimensão dos vértices, presente somente
     				    # se nSKEL também estiver presente
     NVértices  NLinhaspoligonais
     
     x[0]  y[0]  z[0]  # Vértices
     				    # se 4SKEL, cada vértice terá 4 componentes
     				    # se nSKEL, each vértice terá NDim componentes
                                         # se C[4][n]SKEL coordenadas de
                                         # vértice são seguidas por uma
                                         # especificação de cor RGBA
     ...
     x[NVértices-1]  y[NVértices-1]  z[NVértices-1]
     
                             # linhas poligonais
                             # Nv = vértices sobre essa linha poligonal
                             # (1 = ponto)
                             # v[0] ... v[Nv-1]: índices de vértice
                             #               no intervalo 0..NVértices-1
     Nv  v[0] v[1] ... v[Nv-1]  [colorspec]
     ...
                             # colorspec continua adiante de v[Nv-1]
                             # atém encontrar um fim de linha; pode ser
                             # vazia, ou 3 ou 4 números.
                             # vazia: cor padrão
     			# 3 ou 4 números em ponto flutuante: valores RGB[A] no intervalo 0..1

A sintaxe é semelhante à sintaxe dos arquivos OFF, com uma tabela de vértices seguidos de uma sequência de descrições de linhas poligonais, cada descrição referindo-se a vértices através de índices na tabela. Cada linha poligonal tem uma cor opcional.

Para objetos nSKEL, cada vértice tem NDim componentes. Para objetos 4nSKEL, cada vértice tem NDim+1 componentes; a componente final é o divisor homogêneo.

Um formato [4][n]SKEL BINARY é aceito; veja Formato binario. Esse formato assemelha-se ao formato ASCII na maioria das formas que você pode esperar, com inteiros de 32-bit para todos os contadores e índices de vértice e números em ponto flutuante de 32-bit para posições de vértice.

Exceção: cada índice do vértice de linhas poligonais é seguido de um inteiro indicando quantas componentes de cor o acompanham. Componentes de cor de linhas poligonais devem ser inteiros em ponto flutuante, não valores inteiros. Dessa forma uma pouco colorida linha poligonal com 3 vértices pode ser representada como

     int int int int int
     3   17   5   9   0

enquanto a mesma linha poligonal colorida em vermelho pode ser

     int int int int int float float float float
      3  17   5   9   4   1.0   0.0   0.0   1.0
geomview-1.9.5/doc/geomview-pt_BR.html/SPHERE.html0000644000175000017500000001117312310162311016474 00000000000000 SPHERE - Manual do Geomview

Next: , Previous: SKEL, Up: Formatos de Arquivo de Objeto


4.2.8 SPHERE Files

O sufixo convencional para arquivos SPHERE é .sph.

     [ST][E|H|S]SPHERE # Palavra chave
     # coordenadas de textura geradas automaticamente, somente permitido
     # com objetos STSPHERE [SINUSOIDAL|CYLINDRICAL|RECTANGULAR|
     # STEREOGRAPHIC|ONEFACE]
     # os próximos quatro campos são requeridos
     Radius
     Xcenter Ycenter Zcenter

A palavra chave é [ST][E|H|S]SPHERE. Os caracteres prefixados opcionais significam:

ST
A esfera é desenhada com coordenadas de textura geradas automaticamente. Veja abaixo.
E
Assume-se que a esfera encontra-se dentro do espaço Euclidiano.
H
Assume-se que a esfera encontra-se dentro de um espaço Hiperbólico. Veja Geometrias Nao-Euclidianas.
S
Assume-se que a esfera encontra-se dentro de um espaço esférico. Veja Geometrias Nao-Euclidianas.

Objetos do tipo esfera são desenhados usando malhas que são retangulares em um sistema de coordenadas polares, com o plano equatorial paralelo ao plano x,y. Sua suavidade superficial, e o tempo gasto para desenhá-la, depende da escolha dos cortes quadrados, 10x10 por padrão. Para Geomview, o painel de aparência, o comando de teclado <N>ad, ou um atributo de aparência dice nu nv escolhe isso.

Coordenadas de textura são geradas para objetos STSPHERE; a palavra chave seguindo a palavra chave inicial STSPHERE define o caminho para fazer isso. A palavra chave que segue a papavra chave inicial segue as convenções do script perl mktxmesh que acompanha o diretório Orrery na árvore de diretórios instalados que acompanha o Geomview.

SINUSOIDAL
projeção sinusoidal de área equivalente
CYLINDRICAL
projeção cilídrica: s é a longitude, t é a latitude
RECTANGULAR
projeção retangular: s é a longitude, t é sin(latitude) (i.e. a coordenada z no sistema de coordenadas da esfera)
STEREOGRAPHIC
projeção estereográfica a partir do pólo sul (z=-1)
ONEFACE
visão ortográfica extendida do hemisfério +y sobre ambos, espelhando
geomview-1.9.5/doc/geomview-pt_BR.html/INST.html0000644000175000017500000002443612310162311016271 00000000000000 INST - Manual do Geomview

Next: , Previous: SPHERE, Up: Formatos de Arquivo de Objeto


4.2.9 Arquivos do Tipo INST

O sufixo convencional para um arquivo INST é .inst.

Não existe formato INST BINARY.

Um INST aplica uma transformação 4x4 (ou (N+1)x(N+1) no contexto de ND-viewing) a outro objeto OOGL. Um arquivo do tipo INST inicia-se com INST seguido de as seções mostradas adiante que podem vir em qualquer ordem:

     geom oogl-object

especifica o objeto OOGL a ser instanciado. Veja Referencias, para a sintaxe de um oogl-object. palavra chave unit é um sinônimo para geom.

     transform   ["{"] transformação 4x4 ["}"]

especifica uma matriz de transformação simples. Ou a matriz pode aparecer literalmente como 16 números, ou a matriz pode aparecer como uma referência a um objeto "transform", i.e.

         "<" arquivo-contendo-matriz-4x4

ou

         ":" símbolo-representando-transformação-de-objeto

Outra forma de especificar a transformação é

     transforms
         objeto-oogl

O objeto-oogl deve ser um objeto TLIST (lista de transformações), ou uma LIST cujos membros dessa lista são objetos TLIST mais recentes. Com efeito, a palavra chave transforms toma uma coleção de matrizes 4x4 e replica o objeto geom, fazendo uma cópia para cada matriz 4x4.

Se nem a palavra chave transform nem a palavra chave transforms aparecerem, ne-nhuma transformação é aplicada (atualmente a identidade é aplicada). Você pode usar isso para, e.g., empacotar uma aparência em torno de um objeto externo fornecido, através de uma LIST de membros simples pode-se fazer isso mais eficientemente.

Veja Matrizes de transformacao, para o formato de matriz.

A cópia de um objeto geométrico simples por meio de um objeto TLIST (veja ‘transforms’ acima) pode ser útil para transformar coordenadas de textura através de outra lista de transformações; essa lista pode ser especificada por

     txtransforms
         objeto-TLIST

O número de transoformações de textura deve coincidir com o número de transformações geométricas. O objeto SPHERE (Veja Sphere Objects) utiliza essa técnica para gerar um esfera completamente texturizada fora de alguma fração de uma esfera (usualmente um octante).

Uma transformação (N+1)-dimensional pode ser especificada por

     ntransform ["{"] N+1 N+1 (N+1)x(N+1) floats ["}"]

A linha acima fornece uma matriz de transformação N+1-dimensional. Ou a matriz pode aparecer literalmente como (N+1)x(N+1) números, ou pode existir uma referência a um objeto ‘ntransform’, i.e.

         "<" arquivo-contendo-matriz-(N+1)x(N+1)

ou

         ":" símbolo-representando-objeto-ntransform

Veja Matrizes de transformacao ND, para o formato de matriz.

Mais dois campos INST são aceitos: location e origin.

Note que location bem como origin são ignorados se esse objeto INST realiza uma ntransform. Também, se a visualização ND está ativada (comando ND-axes, veja GCL) então objetos INST com origin diferente de local não irão ser desenhados, embora o material location possa trabalhar (ou não).

     location [global ou camera ou ndc ou screen ou local]

Normalmente um INST especifica uma posição relativa a seu objeto pai; o campo location permite colocar um objeto em qualquer lugar.

  • location global anexa o objeto ao ambiente do sistema de coordenadas global (também conhecido como "universe") – o mesmo dos objetos mundo do Geomview, das geometrias alienígenas, e câmeras são colocados.
  • location camera coloca o pai do objeto como sendo uma câmera. (Dessa forma se houverem multiplas visualizações, essas visualizações podem aparecer em uma diferente posição espacial em cada visualização.) O centro de visão da camera está em volta da parte negativa do seu eixo z; X positivo está à direita e adiante, Y positivo está acima e adiante. Normalmente as unidades do espaço da câmera são as mesmas das coordenadas globais. Quando uma câmera é colocada de volta à sua posição inicial, a orígem global está localizada em (0,0,-3.0).
  • location ndc coloca os parentes do objeto no cubo unitário normalizado no qual a projeção da câmera (perspectiva ou ortográfica) mapeia o objeto mundo visível. X, Y, e Z estão no intervalo de -1 a +1, com Z = -1 estando mais próximo e Z = +1 adiante do plano de corte, e X e Y nas direções à direita e adiante e acima e adiante respectivamente. Dessa forma alguma coisa como
              INST  transform  1 0 0 0  0 1 0 0  0 0 1 0  -.9 -.9 -.999 1
                    location ndc
                    geom < label.vect
    

    cola label.vect dentro do canto infeiror esquerdo de cada janela, e em frente de tudo mais que estiver próximo, assumindo o conteúdo label.vect como localizado no quadrante positivo do plano XY. É tentado usar -1 em lugar de como a componente Z da posição, mas o -1 pode colocar o objeto apenas nas proximidades em lugar de muito perto do plano de corte e tornar o objeto (parcialmente) invisível, devido a algum erro de cálculo com números em ponto flutuante.

  • location screen coloca o objeto objeto em coordenadas de tela. O intervalo de Z é ainda de -1 a +1 como para coordenadas ndc; X e Y são medidos em pixels, e a posição de (0,0) localiza-se no canto inferior esquerdo da janela, avançado para a direita e adiante e para cima e adiante.

location local é o padrão; o objeto está posicionado relativametne a seus genitores.

     origin [global ou camera ou ndc ou screen ou local] x y z

O campo origin reposiciona o conteúdo da INST de forma que o local da orígem seja o ponto especificado do sistema de coordenadas fornecido. A menos que location seja especificado, essa opção não muda a orientação, somente a escolha da orígem. Ambas as opções location e origin podem ser usadas juntas.

Então por exemplo

     { INST
       location screen
       origin ndc 0 0 -.99
       geom { < xyz.vect }
       transform { 100 0 0 0  0 100 0 0  0 0 -.009 0   0 0 0 1 }
     }

coloca a orígem de xyz.vect no centro da janela, apenas transformando o plano de corte mais próximo. O comprimento da unidade das arestas X e Y são ajustados proporcionalmente para ter o comprimento de apenas 100 unidades de tela – pixels – , independentemente do tamanho da janela.

geomview-1.9.5/doc/geomview-pt_BR.html/Exemplos-INST.html0000644000175000017500000000502112310162311020050 00000000000000 Exemplos INST - Manual do Geomview

Previous: INST, Up: INST


4.2.9.1 Exemplos INST

Aqui estão alguns exemplos de arquivos INST

     INST
          unit < xyz.vect
          transform {
             1 0 0 0
             0 1 0 0
             0 0 1 0
             1 3 0 1
          }
     { appearance { +edge  material { edgecolor 1 1 0 } }
         INST geom < mysurface.quad }
     {INST transform {: T} geom {<dodec.off}}
     { INST
          transforms
              { LIST
          	{ < some-matrices.prj }
          	{ < others.prj }
          	{ TLIST <still more of them> }
     
              }
          geom
              { # material copiado a partir de todas as matrizes acima
          	...
              }
     }

O exemplo adiante assemelham-se ao exemplo de origin na seção acima, mas fazem com que as arestas X e Y sejam 1/4 do tamanho da janela (1/4, não 1/2, uma vez que o intervalo das coordenadas ndc de X e Y estejam de -1 a +1).

     { INST
       location ndc
       geom { < xyz.vect }
       transform { .5 0 0 0  0 .5 0 0  0 0 -.009 0   0 0 -.99 1 }
     }
geomview-1.9.5/doc/geomview-pt_BR.html/LIST.html0000644000175000017500000000524512310162311016264 00000000000000 LIST - Manual do Geomview

Next: , Previous: INST, Up: Formatos de Arquivo de Objeto


4.2.10 Arquivos do Tipo LIST

O sufixo convencional para um arquivo LIST é .list.

Uma lista de objetos OOGL

Sintaxe:

     LIST
         oogl-object
         oogl-object
         ...

Note que não existe separação explícita entre os objetos oogl, de forma que eles podem ser colocados entre chaves ({ }) por questões de clareza. Da mesma forma não existe um marcador explícito para o final da lista; a menos que o arquivo apareça sozinho em um arquivo de disco, a construção completa pode também ser empacotada entre chaves, como em:

        { LIST { QUAD ... } { < xyz.quad } }

Uma LIST vazia, i.e. { LIST }, é válida, e é o caminho mais fácil para criar um objeto vazio. Por exemplo, para remover uma definição de símbolo você pode escrever

        { define algumsímbolo  { LIST } }
geomview-1.9.5/doc/geomview-pt_BR.html/TLIST.html0000644000175000017500000001066312310162311016410 00000000000000 TLIST - Manual do Geomview

Next: , Previous: LIST, Up: Formatos de Arquivo de Objeto


4.2.11 Arquivos do Tipo TLIST

O sufixo convencional para um arquivo TLIST é .grp ("grupo") ou .prj (matrizes "projetivas").

Coleções de matrizes 4x4, usadas na seção transforms de/e objeto INST.

Sintaxe:

     TLIST			# palavra chave
     <matriz 4x4 (16 números em ponto flutuante)>
     ...				# qualquer número de matrizes 4x4
     transform {             # referência a um objeto de transformação
     <objeto de transformação (pode ser um manipulador)>
     }
     tlist {                 # TLIST aninhada
     <objeto TLIST OOGL (pode ser um manipulador)>
     }

Objetos TLIST são usados somente dentro de cláusulas transforms de um objeto INST. Objetos TLIST fazem com que os objetos geom INSTs sejam instanciados uma vez sob cada uma das transformações na TLIST. O efeito é como aquele de um LIST de INSTs cada uma com uma transformação simples, e todas as transformações referindo-se ao mesmo objeto, mas é mais eficiente.

TLISTs podem ser aninhadas: efetivamente isto significa que todas as transformações em cada objeto TLIST aninhado são multiplicadas (à esquerda) através das transformações no objeto TLIST mais externo.

Esteja informado de que uma TLIST é um tipo de geom, distinto de um objeto transform. Alguns contextos esperam um geom, alguns contextos esperam um transform. Por exemplo em

     INST transform { : meuT } geom { ... }

meuT deve ser um objeto transform, que pode ter sido criado com a GCL

     (read transform { define meuT 1 0 0 1 ... })

enquanto em

       INST transforms { : meusTs } geom { ... }
       ou
       INST transforms { LIST {: meusTs} {< more.prj} } geom { ... }

meusTs deve ser um objeto geom, definido e.g. com

       (read geometry { define meusTs { TLIST 1 0 0 1 ... } })

O formato TLIST BINARY é aceito. Dados binários iniciam-se com um inteiro de 32-bit fornecendo o números de transformações, seguido por aquele número de matrizes 4x4 no formato em número de ponto flutuante de 32-bit. A ordenação dos elementos da matriz é a mesma do formato ASCII. geomview-1.9.5/doc/geomview-pt_BR.html/GROUP.html0000644000175000017500000000420312310162311016376 00000000000000 GROUP - Manual do Geomview

Next: , Previous: TLIST, Up: Formatos de Arquivo de Objeto


4.2.12 Arquivos do Tipo GROUP

Esse formato é obsoleto, mas ainda é aceito. It combined the functions of INST and TLIST, taking a series of transformations and a single Geom (unit) objeto, and replicating the objeto under each transformation.

     GROUP ... < matrices > ... unit { oogl-object }

is still accepted and effectively translated into

     INST
     	transforms { TLIST ... <matrices> ... }
     	unit { oogl-object }
geomview-1.9.5/doc/geomview-pt_BR.html/DISCGRP.html0000644000175000017500000000346012310162311016601 00000000000000 DISCGRP - Manual do Geomview

Next: , Previous: GROUP, Up: Formatos de Arquivo de Objeto


4.2.13 Arquivos do Tipo DISCGRP

Esse formato é para grupos discretos, tais como aparecem na teoria dos coletores (manifolds) ou em modelos de simetria. Esse formato tem sua própria página de manual. Veja discgrp(5). geomview-1.9.5/doc/geomview-pt_BR.html/COMMENT.html0000644000175000017500000000717212310162311016614 00000000000000 COMMENT - Manual do Geomview

4.2.14 Objetos do Tipo COMMENT

O objeto COMMENT é um mecanismo para codificar dados arbitrários dentro de um objeto OOGL. O objeto COMMENT pode ser usado para manter trilhas de dados ou para passagem de dados de retorno e passar dados adiante entre módulos externos.

Sintaxe:

     COMMENT                 # palavra chave
     
     nome tipo   # nome individual e especificador de tipo
     { ... }             # dados arbitrários

Os dados, que devem ser contidos dentro de chaves, podem incluir qualquer coisa exceto chaves não balanceadas (aberta mas sem o fechamento correspondente ou fechada mas sem a abertura correspondente). O campo tipo pode ser usado para identificar dados de interesse de um programa em particular apesar de nomear convenções.

Objetos COMMENT são intendidos como estando associados com outros objetos apesar da inclusão em um objeto LIST. (Veja LIST.) A sintaxe da cerquilha "#" OOGL de comentário não é suficiente para troca de dados uma vez que esses comentários são removidos quando um objeto OOGL é lido dentro do Geomview. O objeto COMMENT é preservado quando chamado dentro do Geomview e é mantido intacto na saída.

Aqui está um exemplo associando uma localização na internet a uma peça de geometria:

     { LIST
      { < Tetrahedron}
      {COMMENT GCHomepage HREF { http://www.geomview.org/ }}
     }

Um formato de COMMENT binário é aceito. Esse formato binário de comentário não é consistente com outros formatos binários OOGL. Veja Formato binario. O nome e o tipo são seguidos por

     N Byte1 Byte2 ... ByteN

Em lugar de dados contidos dentro de chaves. geomview-1.9.5/doc/geomview-pt_BR.html/Objetos-nao_002dgeometricos.html0000644000175000017500000000537612310162311022664 00000000000000 Objetos nao-geometricos - Manual do Geomview

4.3 Objetos nao-geometricos

A sintaxe desses objetos é fornecida na forma usada em Referencias, onde itens "entre aspas duplas" devem aparecer literalmente mas sem aspas duplas, itens entre colchêtes ([ ]) são opcionais, e a barra vertical "|" separa escolhas alternativas.

geomview-1.9.5/doc/geomview-pt_BR.html/Objetos-de-aparencia.html0000644000175000017500000000416212310162311021422 00000000000000 Objetos de aparencia - Manual do Geomview

4.3.1 Objetos de aparencia

Aparências são objetos OOGL com características próprias, que simplesmente significam que é possível fornecer a eles nomes simbólicos (Veja Referencias). Existem outras seções manuseado detalhes de aparência. Veja Aparencias. geomview-1.9.5/doc/geomview-pt_BR.html/image-objects.html0000644000175000017500000004351612310162311020225 00000000000000 image objects - Manual do Geomview

4.3.2 Objetos de imagem

Objetos de imagem são usados para especificar dados de pixmap ou para texturas (Veja Mapeamento de Textura), ou para imagens de fundo de câmeras (Veja Objetos de camera).

Ao mesmo tempo em que imagens são escritas elas são também comprimidas de 1 a 4 canais, um canal fornece um número simples no intervalo que vai de 0 a maxval para cada ponto de imagem (pixel); e maxval é colocado em 255. A interpretação dos dados de imagem dependente do número de canais é como segue:

#Canais No. do Canal Interpretação
1 1 escala de cinza ou dados de luminância
2 1 escala de cinza ou dados de luminância
2 canal alfa (0: transparente, maxval: opaco)
3 1 canal vermelho
2 canal verde
3 canal azul
4 1 canal vermelho
2 canal verde
3 canal azul
4 canal alfa (0: transparente, maxval: opaco)

Dados de imagem podem ser especificados inline (embutidos dentro do fluxo de dados atual) ou via referências de arquivos; em ambos os casos os dados são lidos e interpretados ao mesmo tempo que o objeto de imagem é passado. Essa forma é diferente da antiga (e desatualizada) forma de especificação de textura de imagem, onde os dados de imagem em uma mídia podem eventualmente serem re-lidos pelo Geomview.

A sintaxe geral de objetos de imagem é como segue:

     <image> ::=
       [ "{" ]             (abertura de chave, geralmente precisam informar
                            o fim do objeto de forma clara.)
       [ "image" ]          (palavra chave opcional; desnecessária se o tipo
                            é determinado pelo contexto, o que
                            usualmente acontece.)
       [ "define" <nome> ]
                            (define uma imagem chamada <nome>, escolhendo
                            seus valores a partir do material adiante)
       |
           "<" <nomedearquivo>   (significando: leia a imagem de contida
                            em nomedearquivo)
       |
           ":" <nome>       (significando: use a variável nome,
                            definida em algum lugar; se a variável não
                            for definida em algum lugar a imagem
                            é tida como vazia)
       |
                            (material atual de definição de imagem; dados
                            da imagem obrigatóriamente vêm por ultimo,
                            após a definição da largura e da altura
                            e do número de canais)
     
           "width"          (largura da imagem, detectado automaticamente
                            a partir dos dados da imagem se possível)
     
           "height"         (altura da imagem, detectado automaticamente
                            a partir dos dados da imagem se possível)
     
           "channels"       (número de canais, detectado automaticamente
                            a partir dos dados da imagem e a partir das
                            especificações data descrita
                            adiante, se possível)
     
           "maxval"         (não suportado, obrigatoriamente deve ser 255 se
                            especificado)
     
           "data MASCDEST [FILTER] [{] < NOMEDOARQUIVO [}]"
           "data MASCDEST [FILTER] TAMAN_IMAGEM [{][\n]DADOS_LIT_IMAGEM[}]"
                            (dados de imagem ou externos ou embutidos,
                            veja abaixo para uma descrição detalhada do
                            significado de MASCDEST e FILTER. Uma imagem
                            pode -e tem, em geral- multiplas seções de
                            dados.)
     
       [ "}" ]             (fechamento correspondente da chave)

Detalhes relativos à especificação dos dados de uma imagem:

MASCDEST
Esse é um campo-bit descrevendo onde os dados da imagem especificada devem ser colocados no pixmap de destino. O campo-bit é especificado por meio de um inteiro em um dos formatos conhecidos (decimal, octal, hexadecimal). Os canais dos dados fonte são sempre enumerados consecutivamente. Se, e.g. ‘NOMEDOARQUIVO’ ou ‘DADOS_LIT_IMAGEM’ especificam um imagem (provavelmente RGB ...) de três canais e ‘MASCDEST’ for igual a 0xD (i.e. o primeiro bit é 0), então o terceiro canal do pixmap fonte pode ser substituído no quarto canal do objeto imagem de destino (o canal alfa), o segundo canal pode determinar o valor de destino ‘azul’ e o primeiro canal da fonte determina o valor de destino correspondente ao ‘vermelho’.

O número de canais dos dados fontes sempre tem que coincidir com o número de bits especificado como ‘MASCDEST’. Exceção: se o pixmap fonte possui somente um canal, então o número de canais dos dados fonte pode ser usado para preencher qualquer número de canais de destino; todos os canais especificados em ‘MASCDEST’ são preenchidos com os dados do canal simples do pixmap fonte.

Geomview conhece as seguintes constantes simbólicas, que podem ser usadas em lugar de especificar o campo-bit ‘MASCDEST’ numericamente:

LUMINANCE
o mesmo que ‘1’, ‘0x1’, ‘\01
LUMINANCE_ALPHA
o mesmo que ‘3’, ‘0x3’, ‘\03
RGB
o mesmo que ‘7’, ‘0x7’, ‘\07
RGBA
o mesmo que ‘15’, ‘0xf’, ‘\017
ALPHA
dependendo do contexto: o número absoluto de canais deve obrigatoriamente ser conhecido; i.e. ‘data ALPHA ...’ deve obrigatoriamente ser colocado antes de alguma coisa de forma a determinar o número de canais da imagem, e.g.
               ...
               data RGB ...
               data ALPHA
               ...

é válido, mas

               <nenhumoutrocanalouespecificaçãodedadosdeimagem>
               data ALPHA ...
               <todo o resto ...>

não é válido, porque Geomview não tem meios de determinar o canal de destino a partir do contexto.

AUTO
Dados de imagem no formato PGM é interpretado como canal simples em escala de cinza, dados RGB PNM como dados de imagem RGB. AUTO não pode trabalhar com dados de imagem no formato ‘raw’.

FILTER
A especificação ‘FILTER’ é opcional. se for omitida, então Geomview tenta determinar o tipode imagem usando o sufixo de ‘NOMEDOARQUIVO’. Se ão houver sufixo ou o sufixo for desconhecido, ou para dados embutidos de imagem, Geomview está apto a auto-detectar o formato do arquivo de imagem SGI (por razões históricas ...) e formatos de imagem NetPBM (por razões práticas). A auto-detecção de formatos NetPBM incluem o novo formato de imagem PAM que permite (em meio a um monte de outras coisas) armazenar um canal alfa juntamente com os dados de luminânica ou de RGB. Da mesma forma, a saída final de qualquer dos filtros especificados devem ou ser no formato de arquivo de imagem SGI, ou especificar uma imagem PAM, PNM ou PGM. Se o formato de arquivo de imagem não puder ser determinado por ou pelo sufixo do nome de arquivo ou pela especificação de filtro ou pela auto-detecção de dados SGI ou NetPBM, então Geomview assume que os dados sejam "raw". Veja abaixo.

Os filtros de descompressão podem ser deduzidos ou de um dos formatos de imagem conhecidos ou de um especificador de filtro explícito, e.g. o seguinte é válido:

          data LUMINANCE raw.gzip { < arquivoemtonsdecinzagzipado }

A linha acima deve ser equivalente a

          data LUMINANCE raw { < arquivoemtonsdecinza },

fornece dados descomprimidos realizados através de dados de canal simples, com o primeiro pixel correspondendo ao canto inferior esquerdo (devido ao formato ‘raw’ de imagem, veja abaixo).

Geomview tem conhecimento interno dos seguintes filtros/sufixos:

Descompressão de Dados
z
gz
gzip
os dados são direcionados por ‘gzip -dc
bz2
bzip2
os dados são direcionados por ‘bzip2 -dc

Formatos de Imagem
tiff
tif
Formato de imagem TIFF. Somente suportado se o executável tifftopnm puder ser executado no caminho de execução atual.
png
Formato de imagem PNG. Somente suportado se o executável pngtopnm puder ser executado no caminho de execução atual.
jpg
jpeg
Formato de imagem JPEG. Somente suportado se o executável jpegtopnm puder ser executado no caminho de execução atual.
gif
Formato de imagem GIF image file format. Somente suportado se o executável giftoppm puder ser executado no caminho de execução atual.
raw
Dados de imagem em Raw; o número de canais deve coincidir com o número de bits informado em ‘MASCDEST’. Pixels são especificados com 1 byte por canal. Os pixels são organizados em linhas como em ‘liminance[-alpha]’ ou em amostras ‘RGB[A]’. O pixel mais à esquerda é o primeiro pixel em cada linha de dados, a linha de dados mais acima deve vir primeiramente (isso é apenas o mesmo que a convenção de NetPBM, os sistemas de coordenadas de imagem têm sua orígem no canto superior esquerdo, da forma usual).

Filtros Explicitamente Especificados
Se nenhum dos sufixos especificados acima coincidirem, então o sufixo/filtro é interpretado como um filtro de programa externo; o programa do filtro externo deve ler de STDIN (da entrada padrão) e escrever para STDOUT (a saída padrão). A saída deve ou ser no formato de imagem SGI, ou no formatos de image PNM ou PGM. De outra forma os dados de saída são interpretados como dados de imagem no formato raw (veja acima).

Alguma coisa como o seguinte pode trabalhar, garantindo que o programa ${HOME}/bin/bububfilter exista, seja executável e faça alguma coísa útil:

               ...
               data RGB "${HOME}/bin/bububfilter.bzip2" 7
               { # dados binários seguem
               bububub
               }
               ...

Note que – previamente fornecendo os dados para ‘bububfilter’ – Geomview irá tentar descompactar o material com ‘bzip2 -dc’.

Omitindo dados de imagem: Normalmente, o número de canais de imagem é determinado automaticamente a partir das especificações dos dados de imagem; se a especificação de imagem carrega um número explícito de canais via palavra chave channels que excede o número de canais encontrado nas especificações de dados, ou se a união de todas as especificações ‘MASCDEST’ possuem buracos, então omitindo luminância e canais RGB são initializados para 0, e um canal alfa omitido é inicializado para maxval, i.e. omitindo os dados do canal alfa para uma imagem RGBA é apenas o mesmo que definir uma imagem RGB. geomview-1.9.5/doc/geomview-pt_BR.html/transform-objects.html0000644000175000017500000001216312310162311021150 00000000000000 transform objects - Manual do Geomview

4.3.3 Objetos de Transformação

Onde uma matriz simples 4x4 é esperada – como no campo de transform INST, a transformação da câmera camtoworld e os comandos do Geomview xform* – use um objeto de transformação.

Note que uma transformação é diferente de uma TLIST, que é um tipo de geometria. TLISTs podem conter uma ou mais transformações 4x4; objetos "transform" devem ter exa-tamente uma.

Por que temos ambos ("transform" e TLIST)? Em muitos lugares – e.g. posicionamento de câmeras – é somente significativo ter uma transofrmação simples. Usando um tipo separado de objeto reforça isso.

A sintaxe para um objeto de transformação "transform" é

     <transform> ::=
       [ "{" ]             (Abertura de chave, geralmente necessário para
                            tornar o fim do objeto claramente explicitado.)
     
        [ "transform" ]    (palavra chave opcional; desnecessária se o tipo
                            for determinado pelo contexto, o que comumente
                            ocorre.)
        [ "define" <nome> ]
                           (define uma transformação chamada <nome>,
                           escolhendo seus valores do material adiante)
     
           <dezesseis números em ponto flutuante>
                           (interpretado como uma transformação homogênea 4x4
     		       fornecida linha por linha, intencionalmente aplicada a um
                            vetor linha multiplicado à ESQUERDA, de forma que
                            e.g. translações euclidianas apareçam na linha
                            inferior)
        |
           "<" <nomedearquivo>  (significando: leia a transformação a partir
                            daquele arquivo)
        |
           ":" <nome>      (significando: use a variável <nome>,
                             definida em algum lugar; se não definido o valor
                             inicial é a transformação identidade)
     
      [ "}" ]              (fechamento de chave correspondente)

O conjunto pode ser colocado entre { chaves }. As chaves não são essenciais se exatamente um dos itens acima estiver presente, então e.g. um array 4x4 de números em ponto flutuante independente não precisa necessariamente ter chaves.

Alguns exemplos, em contextos onde eles podem ser usados:

     # Exemplo 1: Um comando GCL para definir uma transformação
     # chamada "fred"
     
     (read transform { transform  define fred
              1 0 0 0
              0 1 0 0
              0 0 1 0
             -3 0 1 1
         }
     )
     # Exemplo 2:  Um objeto câmera usando a transformação
     # "fred" para posicionamento de câmera
     # Fornecida a definição acima, isso coloca a câmera em
     # (-3, 0, 1), olhando na direção -Z.
     
     { camera
             halfyfield 1
             aspect 1.33
             camtoworld { : fred }
     }
geomview-1.9.5/doc/geomview-pt_BR.html/ntransform-objects.html0000644000175000017500000001532512310162311021331 00000000000000 ntransform objects - Manual do Geomview

4.3.4 Objetos ND-Transform

Onde – no contexto de visualização NDimensional – uma matriz simples (N+1)x(N+1) é esperada – como no campo INST ntransform, ou a ND-xform* (veja comandos GCL) – use um objeto ntransform.

ntransform são matrizes de transformação NLinhas x NColunas onde usualmente NLinhas = N+1 no contexto de objetos N-dimensionais e visualização. A componente homogênea de uma ntransform situa-se na coluna zero (em oposição a objetos transform comuns onde a componente homogênea situa-se na coluna três). Objetos ntransform trabalham sobre pontos de qualquer dimensão: se um ponto é para ser transformado através de um objeto ntransform e a dimensão do ponto não coincide com o número de linhas do objeto ntransform, então ou o ponto está implicitamente preenchido com zeros para coincidir com NLinhas ou a matriz está implicitamente preenchida com unidades abaixo de sua diagonal principal (e zeros em todas as outras posições) de forma que a matriz irá trabalhar como a matriz identidade sobre as dimensões excedentes do ponto de entrada.

A sintaxe para um objeto ntransform é

     <ntransform> ::=
       [ "{" ]             (abertura de chave, geralmente necessária para
                            tornar o fim do objeto claramente explicitado.)
     
        [ "ntransform" ]    (palavra chave opcional; desnecessária se o tipo
                            for determinado pelo contexto, o que
                            comumente ocorre.)
     
        [ "define" <nome> ]
                            (define uma transformação chamada <nome>,
                            escolhendo seus valores do material adiante)
     
          NLinhas NColunas
                            (número de linhas e colunas da matriz,
                            tipicamente N+1 N+1, mas qualquer dimensão
                            é possível)
          <NLinhas x NColunas números em ponto flutuante>
                            (interpretados como uma transformação homogênea
                            NLinhas x NColunas fornecida linha por linha,
                            pretensamente a ser aplicada a um vetor linha
                            multiplicado à ESQUERDA, de forma que e.g.
                            translações Euclideanas aparecem na linha mais
                            acima -- em oposição a objetos de
                            transformação comuns onde as
                            translações aparecem na linha mais inferior)
        |
           "<" <nomedearquivo>  (significando: leia a transformação daquele
                            arquivo)
        |
           ":" <nome>      (significando: use a variável <nome>,
                           definida em algum lugar; se não for definida o
                           valor inicial é a transformação identidade)
     
      [ "}" ]             (correspondente fechamento de chave)

O conjunto deve ser delimitado entre { chaves }. Chaves não são necessariamente essenciais, de forma que e.g. dois inteiros – NLinhas NColunas – seguidos por um array composto de NLinhas x NColunas números em ponto flutuante independentes pode mas não precisa ter chaves.

Alguns exemplos, em contextos onde eles possivelmente podem ser usados:

     # Exemplo 1: Um comando GCL para definir uma transformação 6x6 chamada
     # "fred", uma mera translação por meio do vetor -3 0 1 1 0. Essa
     # transformação é significativa para um espaço pentadimensional, com uma componente
     # homogênea um índice zero.
     
     (read ntransform { ntransform  define fred
              6 6
              1 -3 0 1 1 0
              0  1 0 0 0 0
              0  0 1 0 0 0
              0  0 0 1 0 0
              0  0 0 0 1 0
              0  0 0 0 0 1
         }
     )
     # Exemplo 2: Escolhe o ND-xform de um objeto -- um geométrico ou um grupo de
     # cameras. Fornecendo a definição acima, o ND-xform escolhido coloca o objeto em (-3 0 1 1
     # 0) no espaço pentadimensional.
     
     (ND-xform-set focus : fred)
     
     # ou
     
     (ND-xform-set g1 : fred)
geomview-1.9.5/doc/geomview-pt_BR.html/Objeto-camera.html0000644000175000017500000002072412310162311020160 00000000000000 Objeto camera - Manual do Geomview

4.3.5 câmera

Um objeto câmera especifica as seguintes propriedades de uma câmera:

posição e orientação
especificada por ou uma transformação camera para o objeto mundo ou uma transformação de objeto mundo para a câmera; essa transformação não inclui a projeção, de forma que essa transformação é tipicamente apenas uma composição de translação e rotação. Especificado como um objeto transform, tipicamente uma matriz 4x4.
"focus" - distância focal
Ao invés de sugerir uma distância típica da câmera ao objeto de interesse; usada para o posicionamento padrão da câmera (a câmera é colocada em (X,Y,Z) = (0,0,focus) quando resetada) e para ajustar o campo de visão quando alternando entre os modos de visualização ortográfico e perspectivo.
razão de aspecto da janela
A verdadeira razão de aspecto no sentido <Xsize>/<Ysize>. Essa razão de aspecto normalmente pode concordar com a razão de aspecto da janela de camera. Geomview normalmente ajusta a razão de aspecto de suas câmeras para coincidir com suas janelas associadas.
distância de plano de corte próximo e distante
Note que ambas as distâncias devem ser estritamente maiores que zero. Razões de distância <distante>/<próximo> muito grandes fazem com que a área de armazenamento temporário do eixo Z comporte-se de forma péssima; parte de um objeto pode ser visível mesmo se estiver em algum lugar mais distante que outro.
campo de visão
Especificado em uma das duas formas a seguir.
fov
é o campo de visão – em graus se perpectivo, ou distância linear se ortográfico – na menor direção.
halfyfield
é metade do campo projetado no eixo Y, em coordenadas do objeto mundo (não angulo!), em unidades de distância a partir da câmera. Para uma câmera em perpectiva, halfyfield é relacionado ao campo angular:
halfyfield = tan( Y_axis_angular_field / 2 )

enquanto para uma câmera em visão ortográfica temos simplesmente:

halfyfield = Y_axis_linear_field / 2

Essa definição singular de visualização é (a) maneira fácil de fazer cálculos que a envolvam e (b) é bem definida em ambas as formas de visualização ortográfica e perspectiva.

cor de fundo
Argumentavelmente (de forma discutível) não é uma propriedade de uma câmera, mas da cena (do cenário). Todavia, como não existe o objeto "cordefundo" no OOGL, e a cor de fundo pode não ser uma propriedade do equipamento de desenho, essa propriedade pode ser especificada aqui. No momento em que esse manual está sendo escrito, todavia, a interface gráfica de usuário (GUI) sempre sobrescreve a cor de fundo com suas próprias escolhas.
imagem de fundo
Pelas mesmas razões mostradas acima,somente a referida GUI não sobrescreve essa opção. A imagem é centralizada em "Normalized-Device-Coordinates"/NDC (0,0,-1); a imagem não é redimensonada, apenas dese-nhada por trás de tudo mais como é. Veja Objetos de imagem.

A sintaxe para uma câmera é:

     <nomecamera> ::=
     
        [ "camera" ]                 (palavra chave opcional)
         [ "{" ]                    (abertura de chave, geralmente requerida)
             [ "define" <nome> ]
     
             "<" <nomearquivo>
           |
             ":" <nome>
           |
                                     (ou qualquer número dos seguintes,
                                      em qualquer ordem...)
     
             "perspective"  {"0" | "1"}            (padrão 1)
                                             (de outra forma "ortographic")
     
             "stereo"       {"0" | "1"}            (padrão 0)
                                             (de outra forma mono)
     
             "worldtocam" <transformação>        (veja a sintaxe de transfor-
                                             mação acima)
     
             "camtoworld" <transformação>
                                     (nenhum ponto na especificação de ambos
                                      camtoworld e worldtocam; se é
                                      restingido para ser o inverso de                                                the other)
     
             "halfyfield" <meio-campo-linear-Y-em-unidade-de-distância>
                                     (o padrão é tan 40/2 graus)
                                     Nota de tradução:40 é o valor padrão
                                     do campo de visão (fov).
     
             "fov"           (campo de visão angular se "perspective",
                              campo de visão linear em caso contrário.
                              Medido em qualquer direção é menor,
                              dando a razão aspecto.  Quando a razão de
                              aspecto muda -- e.g. quando uma janela é
                              reajustada -- "fov" é preservado.)
     
             "frameaspect" <razão-de-aspecto>    (X/Y) (padrão 1.333)
     
             "near"  <distância-de-corte-próxima>        (padrão 0.1)
     
             "far"   <distância-de-corte-afastada>     (padrão 10.0)
     
             "focus" <distância-focal>                 (padrão 3.0)
     
             "bgcolor" <cor RGB(A) em ponto flutuanter>
                                                     (padrão 1/3 1/3 1/3 1)
     
             "bgimage" { <especificação de imagem> }
                                             (padrão nenhuma imagem de fundo)
     
     
          [ "}" ]                       (correspondente fechamento de chave)
geomview-1.9.5/doc/geomview-pt_BR.html/window-objects.html0000644000175000017500000000656712310162311020457 00000000000000 window objects - Manual do Geomview

4.3.6 Janela

Um objeto janela especifica tamanho, posição, e outras informações relacionadas ao sistema de janelas sobre uma janela de forma que essas informações sejam independentes do dispositivo.

A sintaxe de um objeto janela é:

     nomejanela ::=
     
     	[ "window" ]			(palavra chave opcional)
     	  [ "{" ]			(abertura de chave, requerida na maioria das vezes)
     
     	    			(qualquer dos seguintes, em qualquer ordem)
     
     		"size"  <tamanhox> <tamanhoy>
     				(tamanho da janela)
     
     		"position"  <xmin> <xmax> <ymin> <ymax>
     				(posição & tamanho)
     
     
     		"noborder"
     				(especifica se a janela pode
     				 ter ou não uma borda)
     
     		"pixelaspect"  <aspecto>
     			    (especifica a razão de aspecto real visualizada
     			     de um pixel nessa janela no sentido
     			     tamanhox/tamanhoy, normalmente 1.0.
     			     Para hardware stereo o qual corta o
     			     display verticalmente por um fator de 2,
     			     ``pixelaspect 0.5'' pode funcionar.
     			     O valor é usado no cálculo da
     			     projeção de uma câmera associada a
     			     essa janela.)
     
     	  [ "}" ]			(correspondente fechamento de chave)

Objetos janela são usados em janelas do Geomview e em comandos do painel de interação/interface com o usuário (ui-panel) para escolher propriedades padronizadas para futuras janelas ou mudar as mesmas propriedades padronizadas de uma janela existente. Veeja (window ...). Veja também (ui-panel ...). geomview-1.9.5/doc/geomview-pt_BR.html/Customizacao.html0000644000175000017500000001174312310162311020152 00000000000000 Customizacao - Manual do Geomview

Next: , Previous: Formatos dos Arquivos da OOGL, Up: Top


5 Customização: arquivos .geomview

Quando Geomview é inciado, ele chama e executa comando em um arquivo de inicialização dependente do sistema operacional chamado .geomview. Esse arquivo está no subdiretório data do diretório de distribuição do Geomview e contém comandos GCL para configurar Geomview de uma forma comum para todos os usuários no sistema.

A seguir, Geomview procura o arquivo ~/.geomview (~ corresponde a seu diretório base). Você pode usar esse arquivo para configurar seu próprio comportamento padrão do Geomview de forma que ele se ajuste às suas preferências.

Após a leitura de ~/.geomview, Geomview procura por um arquivo chamado .geomview no diretório atual. Se tal arquivo existir Geomview lê esse arquivo, a menos que esse arquivo seja o mesmo que ~/.geomview (o que pode ser o caso se você estiver executando o Geomview a partir de seu diretório base). Você pode usar o .geomview do diretório atual para criar uma personalização no Geomview específica para um certo projeto.

Você pode usar arquivos .geomview para controlar todos os tipos de coisa no Geomview. Eles podem conter quaisquer declarações GCL válidas. Especialmente útil é o comando ui-panel que controla a localização inicial dos painéis do Geomview. Para um exemplo veja o arquivo dependente do sistema .geomview mencionado acima. Veja GCL. Veja (ui-panel ...).

Uma boa idéia colocar juntos todos os comandos que você coloca em um arquivo .geomview em uma declaração progn com o objetivo de fazer com que Geomview execute todos de uma só vez. Caso você não faça isso Geomview possivelmente pode executar esses comando sequêncialmente sobre os primeiros poucos ciclos de atualização após a incialização.

Para modificar, e.g. a política de focalização da janela de câmera de forma que ela selecione a política de focalização do gerenciador de janela (em lugar de ser ativada quando o cursor do mouse cruza a janela), você pode colocar o seguinte no seu arquivo ~/.geomview:

     (progn
       (ui-cam-focus focus-change)
       ... # other stuff
     )

Você pode colocar qualquer comando GCL válido nos seus arquivos .geomview, Veja GCL. Veja (progn ...). Veja (ui-cam-focus ...). geomview-1.9.5/doc/geomview-pt_BR.html/Modulos.html0000644000175000017500000000655212310162311017135 00000000000000 Modulos - Manual do Geomview

Next: , Previous: Customizacao, Up: Top


6 Módulos Externos

Um módulo externo é um programa que interage com Geomview. Um módulo comunica-se com Geomview através de GCL e pode controlar qualquer aspecto do Geomview que você possa controlar através da interface de usuário do Geomview.

Em muitos casos um módulo externo é um programa especializado que imprementa algum algorítmo matemático que cria um objeto geométrico que modifica aparência à medida que o algorítmo progride. O módulo informa ao Geomview da nova aparência do objeto a cada passo, de forma que o objeto aparenta evoluir com o tempo na janela do Geomview. Dessa modo Geomview serve como um ferramenta de exibição para o módulo.

Um módulo externo pode ser interativo. Esse módulo pode responder a eventos de mouse e a eventos de teclado que ocorram em uma janela do Geomview, dessa forma extendendo a capacidade do Geomview propriamente dito.

geomview-1.9.5/doc/geomview-pt_BR.html/Interface.html0000644000175000017500000000771512310162311017415 00000000000000 Interface - Manual do Geomview

Next: , Previous: Modulos, Up: Modulos


6.1 Como Módulos Externos Interagem com o Geomview

Módulos externos aparecem no navegador de Módulos (Modules) no painel principal (Main) do Geomview. Para executar um módulo, clique no botão esquerdo do mouse sobre a entrada do módulo no navegador. Enquanto o módulo estiver sendo executado, uma linha adicional para aquele módulo irá aparecer no navegador. Essa linha inicia-se com um número entre colchêtes, que indica o número de instância do módulo. (Para alguns módulos faz sentido ter mais de uma instância do módulo sendo executado ao mesmo tempo.) Você pode encerrar um módulo externo através de um clique sobre sua entrada vermelha de instância.

Por padrão quando Geomview inicia, mostra todos os módulos que tiverem sido insta-lados no seu sistema.

Para instruções sobre intalação de algum módulo no seu sistema de forma que esse módulo apareça no navegador de módulos (Modules) toda vez que Geomview estiver sendo executado por alguém no seu sistema, veja Module Installation.

Quando Geomview chama um módulo externo, cria pipes conectados às saídas e às entradas padrão do modulo. (Pipes são como arquivos exceto que eles são usados para comunicação entre programas em lugar de armazenar coisas em um disco.) Geomview interpreta qualquer coisa que o modulo escreve em sua saída padrão como um comando GCL. Da mesma forma, Se um módulo externo requisita qualquer dado do Geomview, Geomview escreve aquele dado para a entrada padrão do módulo. Dessa forma tudo que um módulo tem de fazer com o objetivo de comunicar-se com Geomview é escrever comandos para sua saída padrão e (opcionalmente) receber dados de sua entrada padrão. Note que isso significa que o módulo não pode usar a entrada padrão e a saída padrão para comunicar-se com o usuário. Se um módulo precisar comunicar-se com o usuário isso pode ser feito ou através de um painel de controle nele próprio ou em caso contrário através de respostas a certos eventos que esse módulo encontrar como saída vinda do Geomview. geomview-1.9.5/doc/geomview-pt_BR.html/Example1.html0000644000175000017500000002627112310162311017167 00000000000000 Example1 - Manual do Geomview

Next: , Previous: Interface, Up: Modulos


6.2 Exemplo 1: Módulo Externo Simples

Essa seção fornece um módulo externo extremamente simples que mostra uma malha oscilando. Para experimentar esse exemplo, faça uma cópia do arquivo example1.c (esse arquivo é distribuído com Geomview no subdiretio doc) em seu diretório e compile example1.c com o comando

     cc -o example1 example1.c -lm

A seguir coloque a linha

     (emodule-define "Example 1" "./example1")

em um arquivo chamado .geomview no seu diretório atual. A seguir chame o Geomview; É importante que você compile o programa exemplo, crie o arquivo .geomview e chame o Geomview a partir do mesmo diretório. Você pode ver "Example 1" no navegador de módulos (Modules) do painel principal (Main) do Geomview; clique sobre essa entrada no navegador para iniciar o módulo. Uma superfície deve aparecer na sua janela de câmera e deve estar oscilando. Você pode parar o módulo clicando sobre a linha "[1] Example 1" no navegador de módulos (Modules).

     
     /*
      * example1.c: oscillating mesh
      *
      * This example module is distributed with the Geomview manual.
      * If you are not reading this in the manual, see the "External
      * Modules" chapter of the manual for more details.
      *
      * This module creates an oscillating mesh.
      */
     
     #include <math.h>
     #include <stdio.h>
     
     /* F is the function that we plot
      */
     float F(x,y,t)
          float x,y,t;
     {
       float r = sqrt(x*x+y*y);
       return(sin(r + t)*sqrt(r));
     }
     
     main(argc, argv)
          char **argv;
     {
       int xdim, ydim;
       float xmin, xmax, ymin, ymax, dx, dy, t, dt;
     
       xmin = ymin = -5;             /* Set x and y            */
       xmax = ymax = 5;              /*    plot ranges         */
       xdim = ydim = 24;             /* Set x and y resolution */
       dt = 0.1;                     /* Time increment is 0.1  */
     
       /* Geomview setup.  We begin by sending the command
        *            (geometry example { : foo})
        * to Geomview.  This tells Geomview to create a geom called
        * "example" which is an instance of the handle "foo".
        */
       printf("(geometry example { : foo })\n");
       fflush(stdout);
     
       /* Loop until killed.
        */
       for (t=0; ; t+=dt) {
         UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t);
       }
     }
     
     /* UpdateMesh sends one mesh iteration to Geomview.  This consists of
      * a command of the form
      *    (read geometry { define foo
      *       MESH
      *       ...
      *    })
      * where ... is the actual data of the mesh.  This command tells
      * Geomview to make the value of the handle "foo" be the specified
      * mesh.
      */
     UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t)
          float xmin, xmax, ymin, ymax, t;
          int xdim, ydim;
     {
       int i,j;
       float x,y, dx,dy;
     
       dx = (xmax-xmin)/(xdim-1);
       dy = (ymax-ymin)/(ydim-1);
     
       printf("(read geometry { define foo \n");
       printf("MESH\n");
       printf("%1d %1d\n", xdim, ydim);
       for (j=0, y = ymin; j<ydim; ++j, y += dy) {
         for (i=0, x = xmin; i<xdim; ++i, x += dx) {
           printf("%f %f %f\t", x, y, F(x,y,t));
         }
         printf("\n");
       }
       printf("})\n");
       fflush(stdout);
     }
     

O módulo inicia-se definindo uma função F(x,y,t) que especifica uma superfície va-riando com o tempo. O propósito do módulo é animar essa superfície com o passar do tempo.

O programa principal começa definindo algumas variáveis que especificam os parâmetros com os quais a função é para ser mostrada.

O próximo pedaço de código no programa principal envia a seguinte linha para a saída padrão

     (geometry example { : foo })

Isso diz ao Geomview para criar um geom chamado example que é uma instância do manipulador foo. Manipuladores são uma parte do formato de arquivo OOGL que permite a você nomear uma peça do objeto geométrico cujo valor pode ser especificado em seu lugar (e nesse caso atualizado muitas vezes); para maiores informações sobre manipuladores, veja Formatos dos Arquivos da OOGL. Nesse caso, example é o título através do qual o usuário irá ver o objeto no navegador de objeto do Geomview, e foo é o nome interno do manipulador para o qual o objeto aponta.

Nós então fazemos fflush(stdout) para garantir que Geomview receba esse comando imediatamente. Em geral, uma vez que pipes podem ser colocados em uma área de memória temporária de armazenamento, um módulo externo deve fazer isso sempre que esse módulo externo tenha que garantir que Geomview tenha atualmente recebido tudo que tenha sido mostrado na saída.

A última coisa no programa principal é um ciclo infinito que circula através de chamadas ao procedimento UpdateMesh com incremento dos valores de t. UpdateMesh envia ao Geomview um comando da forma

     (read geometry { define foo
     MESH
     24 24
     ...
     })

onde ... é uma longa lista de números. Esse comando diz ao Geomview fazer os valores do manipulador foo ser a malha especificada. Tão breve quanto Geomview receba esse comando, o geom sendo mostrado muda para refletir o novo objeto geométrico.

A malha é fornecida no formato de uma OOGL MESH. Esse formato começa com a palavra chave MESH. A seguir temos dois números que fornecem as dimensões x e y da malha; nesse caso elas são ambas 24. Essa linha é seguida por 24 linhas, cada linha contendo 24 trios de números. Cada um desses trios representa um ponto sobre superfície. Então finalmente existe uma linha com "})" nesse formato que termina o "{" que iniciou a declaração define e o "(" que iniciou o comando. Para mais detalhes sobre o formato de dados MESH, veja MESH.

Esse módulo pode ser escrito sem o uso de manipuladores escrevendo comandos da forma

     (geometry example {
     MESH
     24 24
     ...
     })

Nesse primeiro tempo Geomview recebe um comando e dessa forma pode criar um geom chamado example com os dados fornecidos da MESH. Subsequentemente comandos (geometry example ...) podem fazer com que Geomview substitua a geometria do geom example com os novos dados da MESH. Se realizado dessa forma pode não ser necessário enviar o comando inicial (geometry example { : foo }) como dito acima. A técnica do manipulador é útil, todavia, porque essa técnica pode ser usada em situações mais gerais onde um manipulador representa somente parte de um complexo geom, permitindo a um módulo externo substituir somente aquela parte sem ter que retransmitir o geom completo. Para mais informações sobre manipuladores, veja GCL. Veja Referencias. Veja (hdefine ...). Veja (read ...).

O módulo entra em ciclos através de chamadas a UpdateMesh que fornece como saída comandos da forma acima um após o outro tão rápido quanto possível. O ciclo continua indefinidamente; o módulo irá terminar quando o usuário fizer isso clicando sobre sua linha de instância no navegador de módulos (Modules), ou em caso contrário quando Geomview for encerrado.

Algumas vezes quando você encerra o módulo clicando sobre sua entrada de instância no navegador de módulos (Modules), Geomview irá encerrá-lo enquanto o módulo está no meio de um comando ao Geomview. Geomview irá então receber somente uma peça de um comando e irá mostrar uma crítica mas inofensiva mensagem de erro sobre isso. uando um módulo tiver um painel de interface com o usuário o usuário pode usar um botão "Quit" para fornecer uma forma mais elegante para o usuário encerrar o módulo. Veja o exemplo seguinte.

Você pode usar esse módulo em uma janela de shell sem o Geomview para ver os comando que o módulo mostra como saída. Você irá ter que encerrá-lo com ctrl-C para que ele pare. geomview-1.9.5/doc/geomview-pt_BR.html/Example2.html0000644000175000017500000003006612310162311017165 00000000000000 Example2 - Manual do Geomview

Next: , Previous: Example1, Up: Modulos


6.3 Exemplo 2: Módulo Externo Simples Usando o Painel de Controle FORMS

Nota de tradução: Este exemplo é muito antigo e não compila nas máquinas atuais. Até o momento de digitação destas linhas de tradução ele não tinha sido atualizado permanecendo portanto inoperante.

Essa seção fornece uma nova versão do módulo acima — uma versão que inclue uma interface de usuário para controlar a velocidade da oscilação. Usamos a biblioteca FORMS criada por Mark Overmars para o painel de controle. A biblioteca FORMS é uma coleção de ferramentas para interface de usuário de domínio público para IRISes.

Para experimentar esse exemplo, faça uma cópia do arquivo example2.c (distribuído com Geomview no subdiretório doc) no seu diretório e compile-o com o comando

     cc -I/u/gcg/ngrap/include -o example2 example2.c \
       -L/u/gcg/ngrap/lib/sgi -lforms -lfm_s -lgl_s -lm

Você pode substituir a sequência de caracteres /u/gcg/ngrap acima com o nome do caminho do diretório de distribuição do Geomview em seu sistema. (A biblioteca forms é distribuída com Geomview e as opções -I e -L acima dizem ao compilador onde encontrá-las.)

Então coloque a linha

     (emodule-define "Example 2" "./example2")

em um arquivo chamado .geomview no diretório e chame Geomview do mesmo diretório. Clique sobre a entrada "Example 2" no navegador de módulos (Modules) para chamar o módulo. Um pequeno painel de controle deverá aparecer. Você pode então controlar a velocidade da oscilação da malha movendo o botão deslizante.

     
     /*
      * example2.c: oscillating mesh with FORMS control panel
      *
      * This example module is distributed with the Geomview manual.
      * If you are not reading this in the manual, see the "External
      * Modules" chapter of the manual for an explanation.
      *
      * This module creates an oscillating mesh and has a FORMS control
      * panel that lets you change the speed of the oscillation with a
      * slider.
      */
     
     #include <math.h>
     #include <stdio.h>
     #include <sys/time.h>           /* for struct timeval below */
     
     #include "forms.h"              /* for FORMS library */
     
     FL_FORM *OurForm;
     FL_OBJECT *VelocitySlider;
     float dt;
     
     /* F is the function that we plot
      */
     float F(x,y,t)
          float x,y,t;
     {
       float r = sqrt(x*x+y*y);
       return(sin(r + t)*sqrt(r));
     }
     
     /* SetVelocity is the slider callback procedure; FORMS calls this
      * when the user moves the slider bar.
      */
     void SetVelocity(FL_OBJECT *obj, long val)
     {
       dt = fl_get_slider_value(VelocitySlider);
     }
     
     /* Quit is the "Quit" botão callback procedure; FORMS calls this
      * when the user cliques the "Quit" botão.
      */
     void Quit(FL_OBJECT *obj, long val)
     {
       exit(0);
     }
     
     /* create_form_OurForm() creates the FORMS panel by calling a bunch of
      * procedures in the FORMS library.  This code was generated
      * automatically by the FORMS designer program; normally this code
      * would be in a separate file which you would not edit by hand.  For
      * simplicity of this example, however, we include this code here.
      */
     create_form_OurForm()
     {
       FL_OBJECT *obj;
       FL_FORM *form;
       OurForm = form = fl_bgn_form(FL_NO_BOX,380.0,120.0);
       obj = fl_add_box(FL_UP_BOX,0.0,0.0,380.0,120.0,"");
       VelocitySlider = obj = fl_add_valslider(FL_HOR_SLIDER,20.0,30.0,
                                               340.0,40.0,"Velocity");
         fl_set_object_lsize(obj,FL_LARGE_FONT);
         fl_set_object_align(obj,FL_ALIGN_TOP);
         fl_set_call_back(obj,SetVelocity,0);
       obj = fl_add_button(FL_NORMAL_BUTTON,290.0,75.0,70.0,35.0,"Quit");
         fl_set_object_lsize(obj,FL_LARGE_FONT);
         fl_set_call_back(obj,Quit,0);
       fl_end_form();
     }
     
     main(argc, argv)
          char **argv;
     {
       int xdim, ydim;
       float xmin, xmax, ymin, ymax, dx, dy, t;
       int fdmask;
       static struct timeval timeout = {0, 200000};
     
       xmin = ymin = -5;             /* Set x and y            */
       xmax = ymax = 5;              /*    plot ranges         */
       xdim = ydim = 24;             /* Set x and y resolution */
       dt = 0.1;                     /* Time increment is 0.1  */
     
       /* Forms panel setup.
        */
       foreground();
       create_form_OurForm();
       fl_set_slider_bounds(VelocitySlider, 0.0, 1.0);
       fl_set_slider_value(VelocitySlider, dt);
       fl_show_form(OurForm, FL_PLACE_SIZE, TRUE, "Example 2");
     
     
       /* Geomview setup.
        */
       printf("(geometry example { : foo })\n");
       fflush(stdout);
     
       /* Loop until killed.
        */
       for (t=0; ; t+=dt) {
         fdmask = (1 << fileno(stdin)) | (1 << qgetfd());
         select(qgetfd()+1, &fdmask, NULL, NULL, &timeout);
         fl_check_forms();
         UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t);
       }
     }
     
     /* UpdateMesh sends one mesh iteration to Geomview
      */
     UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t)
          float xmin, xmax, ymin, ymax, t;
          int xdim, ydim;
     {
       int i,j;
       float x,y, dx,dy;
     
       dx = (xmax-xmin)/(xdim-1);
       dy = (ymax-ymin)/(ydim-1);
     
       printf("(read geometry { define foo \n");
       printf("MESH\n");
       printf("%1d %1d\n", xdim, ydim);
       for (j=0, y = ymin; j<ydim; ++j, y += dy) {
         for (i=0, x = xmin; i<xdim; ++i, x += dx) {
           printf("%f %f %f\t", x, y, F(x,y,t));
         }
         printf("\n");
       }
       printf("})\n");
       fflush(stdout);
     }
     

O Código inicia-se pela inclusão de alguns arquivos de cabeçalho necassários para o evento cíclico e para a biblioteca FORMS. O código então declara variáveis globais para manter um ponteiro para o objeto FORMS do tipo botão deslizante e a velocidade dt. Essas duas variáveis são do tipo global porque elas são necessárias no procedimento de retorno do botão deslizante chamado SetVelocity, que faz todas as chamadas a cada vez que o usuário move a barra do botão deslizante. SetVelocity atualiza o valor da variável dt com o novo valor do botão deslizante.

Quit é o procedimento de chamada de retorno para o botão Quit; esse botão fornece um caminho elegante para o usuário encerrar o programa.

O procedimento create_panel chama um conjunto de procedimentos da biblioteca FORMS para ajustar o painel de controle com o botão deslizante e o botão simples. Para mais informação sobre o uso de FORMS para criar painéis de interface veja a documentação de FORMS. Em particular, FORMS vem com um desenhista de painel gráfico que conduz você a desenhar seus painéis de forma interativa e a gerar códigos como o código em create_panel.

Esse programa principal exemplo é similar ao exemplo anterior, mas inclui codificação extra para lidar com ajustes e gerenciamento o painel FORMS.

Para ajustar o painel chamamos o procedimento GL foreground para fazer com que o processo execute em primeiro plano. Por padrão programas GL executam em segundo plano, e por várias razões módulos externos que usam FORMS (que é baseado em GL) precisa executar em primeiro plano. Chamamos então create_panel para criar o painel e fl_set_slider_value para ajustar o valor inicial do botão deslizante. A chamada a fl_show_form faz com que o painel apareça na tela.

As primeiras três linhas do ciclo principal, iniciam-se com

     fdmask = (1 << fileno(stdin)) | (1 << qgetfd());

monitora e conduz os eventos no painel. A chamada a select impõe uma espera a cada passagem pelo ciclo principal. Essa chamada retorna ou após uma espera de 1/5 de segundo ou quando o evento GL seguinte ocorrer, ou quando dados aparecerem na entrada padrão, o que acontecer primeiro. A variável timeout especifica a quantidade de tempo a esperar nessa chamada; o primeiro número (0 nesse exemplo) fornece o número de segundos, e o segundo número (200000 nesse exemplo) fornece o número de microsegundos. Finalmente, fl_check_forms() procura e executa quaisquer eventos FORMS que tenham ocorridos; nesse caso isso significa uma chamada a SetVelocity se o usuário iver movido o botão deslizante ou uma chamada a Quit se o usuário tiver clicado no botão Quit.

O propósito da espera no ciclo é para prevenir que o programa use excessivamente o tempo da CPU executando seu ciclo pincipal quando não hoverem eventos a serem processados. Isso não é tão crucial nesse exemplo, e de fato pode tornar a animação mais lenta até certo ponto, mas em geral com módulos extrnos que possuirem eventos cíclicos essa espera é importante para do something like this because otherwise the module will needlessly take que os ciplos da CPU sigam adiante para outros programamas que estejam sendo executados (tais como Geomview!) mesmo quando estes não estiverem fazendo nada.

A última linha do ciclo principal ensse exemplo, a chamada a UpdateMesh, é a mesma que no exemplo anterior. geomview-1.9.5/doc/geomview-pt_BR.html/XForms.html0000644000175000017500000000465612310162311016734 00000000000000 XForms - Manual do Geomview

Next: , Previous: Example2, Up: Modulos


6.4 A Biblioteca XForms

XForms é uma interface de usuário ou conjunto de ferramentas muito fácil de encontrar e relativamente simples para X11. Muitos módulos externos do Geomview, incluindo os exemplos nesse manual, usam XForms para criar e gerenciar painéis de controle. XForms está disponível no sítio http://www.nongnu.org/xforms/. XForms é free-ware. Se você quiser pode usar qualquer outro conjunto de ferramentas como interface ao invés de XForms em um módulo externo. Escolhemos FORMS pelo fato de omesmo ser livre e relativamente simples.

Existe um pacote completo baseado na ferramenta autoconf ‘gvemod-xforms-example’ disponível no sítio do Geomview Sourceforge.NET. geomview-1.9.5/doc/geomview-pt_BR.html/Example3.html0000644000175000017500000006370612310162311017175 00000000000000 Example3 - Manual do Geomview

Next: , Previous: XForms, Up: Modulos


6.5 Exemplo 3: Módulo Externo com Comunicação Bi-Direcional

Os dois módulos exemplo anteriores simplesmente enviam comandos ao Geomview sem receber nada de volta do Geomview. Esta seção descreve um módulo que se comuica em ambas as direções. Existe dois tipos de comunicação que podem ir do Geomview para um módulo externo. Esse exemplo mostra comunicação sem sincronismo — o módulo precisa estar apto a responder a qualquer momento a expressões que o Geomview possa emitir as quais informam ao módulo de alguma modificação de estado dentro do Geomview.

(O outro tipo de comunicação é com sincronismo, onde um módulo envia uma requisição ao Geomview sobre alguma peça de informação e espera por uma resposta venha de volta antes de fazer qualquer coisa a mais. O principal comando GCL para requisitar informação desse tipo é (write ...). Esse módulo exemplo não faz nada com comunicação sincronizada.)

Na comnicação sem sincronismo, Geomview envia expressões que são essencialmente ecos de comandos GCL. O módulo externo envia ao Geomview um comando expressando interesse em um certo comando, e então toda vez que Geomview executar o referido comando, o módulo recebe uma cópia dele. O envio de informação ocorre independentemente de que envia o comando ao Geomview; a requisição pode ser resultado do usuário fazendo alguma coisa com o painel do Geomview, ou pode vir de outro módulo ou de um arquivo que o Geomview leu. É dessa forma que um módulo descobre informações e age sobre coisas que ocorrem no Geomview.

Esse exemplo usa a biblioteca em lisp da OOGL para analisar e agir sobre as expressões que Geomview escreve para a entrada padrão do módulo. Essa biblioteca faz atualmente parte do Geomview propriamente dito — escrevemos a biblioteca no processo de implementação da GCL. Essa biblioteca lisp da OOGL também é conveniente para ser usada em módulos externos que devem entender um subconjunto da GCL — especificamente, aqueles comandos que o módulo tem interesse expresso.

Esse exemplo mostra como um módulo pode receber eventos de seleção de usuário, i.e. quando o usuário clicar com o botão direito do mouse com o cursor sobre um geom em uma janela de câmera do Geomview. Quando isso ocorrer Geomview gera uma chamada interna a um procedimento chamado pick; o argumento para o procedimento fornece informação sobre a seleção, tal como o objeto que foi selecionado, as coordenadas co ponto selecionado, etc. Se um módulo externo tiver expressado interesse em chamadas ao procdimento pick, então sempre que o procedimento pick for chamado Geomview irá ecoar a chamada à entrada padrão do módulo que manifestou o interesse. O módulo que recebe o echo pode então fazer o que desejar caom a informação do procedimento pick.

Esse módulo é o mesmo que o módulo Nose que vem com o Geomview. Seu propósito é ilustrar processos de seleção. Qualquer coisa que você selecionar sobre um geom por meio de um clique do botão direito do mouse sobre esse geom, o módulo desenha uma pequena caixa na localização onde você tiver clicado. De forma geral a caixa é amarela. Caso você selecione um vértice, a caixa é da cor magenta. Se você selecionar um ponto sobre uma aresta de um objeto, o módulo irá também ressaltar a aresta desenhando caixas da cor ciano em suas extremidades e desenhar uma linha amarela ao lonfo da aresta.

Note que para esse módulo fazer alguma coisa você deve ter um geom carregado no Geomview e você deve cicar com o botão direito do mouse com o cursor sobre uma parte do geom.

     
     /*
      * example3.c: external module with bi-directional communication
      *
      * This example module is distributed with the Geomview manual.
      * If you are not reading this in the manual, see the "External
      * Modules" chapter of the manual for an explanation.
      *
      * This module is the same as the "Nose" program that is distributed
      * with Geomview.  It illustrates how a module can find out about
      * and respond to user pick events in Geomview.  It draws a little box
      * at the point where a pick occurrs.  The box is yellow if it is not
      * at a vertex, and magenta if it is on a vertex.  If it is on an edge,
      * the program also marks the edge.
      *
      * To compile:
      *
      *   cc -I/u/gcg/ngrap/include -g -o example3 example3.c \
      *      -L/u/gcg/ngrap/lib/sgi -loogl -lm
      *
      * You should replace "/u/gcg/ngrap" above with the pathname of the
      * Geomview distribution directory on your system.
      */
     
     #include <stdio.h>
     #include "lisp.h"               /* We use the OOGL lisp library */
     #include "pickfunc.h"           /* for PICKFUNC below */
     #include "3d.h"                 /* for 3d geometry library */
     
     /* boxstring gives the OOGL data to define the little box that
      * we draw at the pick point.  NOTE:  It is very important to
      * have a newline at the end of the OFF objeto in this string.
      */
     char boxstring[] = "\
     INST\n\
     transform\n\
     .04 0 0 0\n\
     0 .04 0 0\n\
     0 0 .04 0\n\
     0 0 0 1\n\
     geom\n\
     OFF\n\
     8 6 12\n\
     \n\
     -.5 -.5 -.5     # 0   \n\
     .5 -.5 -.5      # 1   \n\
     .5  .5 -.5      # 2   \n\
     -.5  .5 -.5     # 3   \n\
     -.5 -.5  .5     # 4   \n\
     .5 -.5  .5      # 5   \n\
     .5  .5  .5      # 6   \n\
     -.5  .5  .5     # 7   \n\
     \n\
     4 0 1 2 3\n\
     4 4 5 6 7\n\
     4 2 3 7 6\n\
     4 0 1 5 4\n\
     4 0 4 7 3\n\
     4 1 2 6 5\n";
     
     progn()
     {
       printf("(progn\n");
     }
     
     endprogn()
     {
       printf(")\n");
       fflush(stdout);
     }
     
     Initialize()
     {
       extern LObject *Lpick();  /* This is defined by PICKFUNC below but must */
       			    /* be used in the following LDefun() call */
       LInit();
       LDefun("pick", Lpick, NULL);
     
       progn(); {
         /* Define handle "littlebox" for use later
          */
         printf("(read geometry { define littlebox { %s }})\n", boxstring);
     
         /* Express interest in pick events; see Geomview manual for explanation.
          */
         printf("(interest (pick world * * * * nil nil nil nil nil))\n");
     
         /* Define "pick" objeto, initially the empty list (= null objeto).
          * We replace this later upon receiving a pick event.
          */
         printf("(geometry \"pick\" { LIST } )\n");
     
         /* Make the "pick" objeto be non-pickable.
          */
         printf("(pickable \"pick\" no)\n");
     
         /* Turn off normalization, so that our pick objeto will appear in the
          * right place.
          */
         printf("(normalization \"pick\" none)\n");
     
         /* Don't draw the pick objeto's bounding box.
          */
         printf("(bbox-draw \"pick\" off)\n");
     
       } endprogn();
     }
     
     /* The following is a macro call that defines a procedure called
      * Lpick().  The reason for doing this in a macro is that that macro
      * encapsulates a lot of necessary stuff that would be the same for
      * this procedure in any program.  If you write a Geomview module that
      * wants to know about user pick events you can just copy this macro
      * call and change the body to suit your needs; the body is the last
      * argument to the macro and is delimited by curly braces.
      *
      * The first argument to the macro is the name of the procedure to
      * be defined, "Lpick".
      *
      * The next two arguments are numbers which specify the sizes that
      * certain arrays inside the body of the procedure should have.
      * These arrays are used for storing the face and path information
      * of the picked objeto.  In this module we don't care about this
      * information so we declare them to have length 1, the minimum
      * allowed.
      *
      * The last argument is a block of code to be executed when the module
      * receives a pick event.  In this body you can refer to certain local
      * variables that hold information about the pick.  For details see
      * Example 3 in the Extenal Modules chapter of the Geomview manual.
      */
     PICKFUNC(Lpick, 1, 1,
     {
       handle_pick(pn>0, &point, vn>0, &vertex, en>0, edge);
     },
     /* version for picking Nd-objects (not documented here) */)
     
     handle_pick(picked, p, vert, v, edge, e)
          int picked;                /* was something actually picked?     */
          int vert;                  /* was the pick near a vertex?        */
          int edge;                  /* was the pick near an edge?         */
          HPoint3 *p;                /* coords of pick point               */
          HPoint3 *v;                /* coords of picked vértice            */
          HPoint3 e[2];              /* coords of endpoints of picked edge */
     {
       Normalize(&e[0]);             /* Normalize makes 4th coord 1.0 */
       Normalize(&e[1]);
       Normalize(p);
       progn(); {
         if (!picked) {
           printf("(geometry \"pick\" { LIST } )\n");
         } else {
           /*
            * Put the box in place, and color it magenta if it's on a vértice,
            * yellow if not.
            */
           printf("(xform-set pick { 1 0 0 0  0 1 0 0  0 0 1 0  %g %g %g 1 })\n",
                  p->x, p->y, p->z);
           printf("(geometry \"pick\"\n");
           if (vert) printf("{ appearance { material { diffuse 1 0 1 } }\n");
           else printf("{ appearance { material { diffuse 1 1 0 } }\n");
           printf("  { LIST { :littlebox }\n");
     
           /*
            * If it's on an edge and not a vertex, mark the edge
            * with cyan boxes at the endpoins and a black line
            * along the edge.
            */
           if (edge && !vert) {
             e[0].x -= p->x; e[0].y -= p->y; e[0].z -= p->z;
             e[1].x -= p->x; e[1].y -= p->y; e[1].z -= p->z;
             printf("{ appearance { material { diffuse 0 1 1 } }\n\
       LIST\n\
        { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\
        { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\
        { VECT\n\
               1 2 1\n\
               2\n\
               1\n\
               %f %f %f\n\
               %f %f %f\n\
               1 1 0 1\n\
        }\n\
       }\n",
                    e[0].x, e[0].y, e[0].z,
                    e[1].x, e[1].y, e[1].z,
                    e[0].x, e[0].y, e[0].z,
                    e[1].x, e[1].y, e[1].z);
           }
           printf("    }\n  }\n)\n");
         }
     
       } endprogn();
     
     }
     
     Normalize(HPoint3 *p)
     {
       if (p->w != 0) {
         p->x /= p->w;
         p->y /= p->w;
         p->z /= p->w;
         p->w = 1;
       }
     }
     
     main()
     {
       Lake *lake;
       LObject *lit, *val;
       extern char *getenv();
     
       Initialize();
     
       lake = LakeDefine(stdin, stdout, NULL);
       while (!feof(stdin)) {
     
         /* Parse next lisp expression from stdin.
          */
         lit = LSexpr(lake);
     
         /* Evaluate that expression; this is where Lpick() gets called.
          */
         val = LEval(lit);
     
         /* Free the two expressions from above.
          */
         LFree(lit);
         LFree(val);
       }
     }
     

The code begins by defining procedures progn() and endprogn() which begin and end a Geomview progn group. The purpose do Geomview progn command is to group commands together and cause Geomview to execute them all at once, without refreshing any graphics windows until the end. It is a good idea to group blocks of commands that a module sends to Geomview like this so that the user sees their cumulative effect all at once.

Procedure Initialize() does various things needed at program startup time. It initializes the lisp library by calling LInit(). Any program that uses the lisp library should call this once before calling any other lisp library functions. It then calls LDefun to tell the library about our pick procedure, which is defined further down with a call to the PICKFUNC macro. Then it sends a bunch of setup commands to Geomview, grouped in a progn block. This includes defining a handle called littlebox that stores the geometry da little box. Next it sends the command

     (interest (pick world * * * * nil nil nil nil nil))

which tells Geomview to notify us when a pick event happens.

The syntax of this interest statement merece some explanation. In general interest takes one argument which is a (parenthesized) expression representing a Geomview function call. It especifica a type of call that the module is interested in knowing about. The arguments can be any particular argument values, ou the special symbols * or nil. For example, the first argument in the pick expression above is world. This means that the module is interested in calls to pick where the first argument, which especifica the coordinate system, is world. A * is like a wild-card; it means that the module is interested in calls where the corresponding argument has any value. The word nil is like *, except that the argument's value is not reported to the module. This is useful for cutting down on the amount of data that must be transmitted in cases where there are arguments that the module doesn't care about.

The second, third, fourth, and fifth arguments to the pick command give the name, pick point coordenadas, coordenadas do vértice, and edge coordenadas of a pick event. We specify these by *'s above. The remaining five arguments to the pick command give other information about the pick event that we do not care about in this module, so we specify these with nil's. For the details dos arguments to pick, See GCL.

The geometry statement defines a geom called pick that is initially an empty list, specified as { LIST } ; this is the best way of specifying a null geom. The module will replace this with something useful by sending Geomview another geometry command when the user picks something. Next we arrange for the pick objeto to be non-pickable, and turn normalization off for it so that Geomview will display it in the size and location where we put it, rather than resizing and relocating it to fit into the unit cube.

The next function in the file, Lpick, is defined with a strange looking call to a macro called PICKFUNC, defined in the header file pickfunc.h. This is the function for handling pick events. The reason we provide a macro for this is that that macro encapsulates a lot of necessary stuff that would be the same for the pick-handling function in any program. If you write a Geomview module that wants to know about user pick events you can just copy this macro call and change it to suit yours needs.

In general the syntax for PICKFUNC is

     PICKFUNC(name, block, NDblock)

where name is the name do procedure to be defined, in this case Lpick. The next argument, block, is a block of code to be executed when a pick event occurs. If block contains a return statement, then the returned value must be a pointer to a Lisp-objeto, that is of type LObject *. The last argument has the same functionality as the block argument, but is only invoked when picking objetos in a higher dimensional world.

PICKFUNC declares certain local variables in the body do procedure. When the module receives a (pick ...) statement from Geomview, the procedure assigns values to these variables based on the information in the pick call (variables corresponding to nil's in the (interest (pick ...)) are not given values).

There is also a second variant da PICKFUNC macro with a slightly different syntax:

     DEFPICKFUNC(helpstr, coordsys, id,
       point, pn, vertex, vn, edge, en, face, fn, ppath, ppn,
       vi, ei, ein, fi,
       body, NDbody)

DEFPICKFUNC can be used as well as PICKFUNC, there is no functional differene with the exception that the name da C-function is tied to Lpick when using DEFPICKFUNC and that the (help pick) GCL-command (see (help ...)) would respond with echoing helpstr.

The table below lists all variables defined in PICKFUNC In the context of ND-viewing float variants dos arguments apply: the body execution block sees the HPoint3 variables, and the NDbody block sees only flat one-dimensional arrays of float-type.

In the ND-viewing context the co-ordinates passed to the pick function are still the 3-dimensional co-ordinates da câmera view-port where the pick occurred, but padded with zeroes on transformed back to the co-ordinate system specified by the second argument do pick command.

char *coordsys;
A string specifying the coordinate system in which coordenadas are given. In this example, this will always be world because do interest call above.
char *id;
A string specifying the name do picked geom.
HPoint3 point; int pn;
float *point; int pn;
point is an HPoint3 structure giving the coordenadas of the picked point. HPoint3 is a homogeneous point coordinate representation equivalent to an array of 4 floats. pn tells how many coordenadas have been written into this array; it will always be either 0, 4 ou greater than 4. If it is greater than 4, then the NDbody instruction block is invoked and in this case point is a flat array of pn many floats. A value of zero means no point was picked, i.e. the user clicado the botão direito do mouse while the cursor was not pointing at a geom. In this case the ordinary block 3d instruction block is executed.
HPoint3 vertex; int vn;
float *vertex; int vn;
vertex is an HPoint3 structure giving the coordenadas of the vértice selecionado, if the pick point was near a vértice. vn tells how many coordenadas have been written into this array; it will always be either 0 ou greater equal 4. A value of zero means the pick point was not near a vértice. In the context of ND-viewing vertex will be an array of vn floats and vn will be equal to pn.
HPoint3 edge[2]; int en;
float *edge; int en;
edge is an array of two HPoint3 structures giving the coordenadas do endpoints da picked edge, if the pick point was near an edge. en tells how many coordenadas have been written into this array; it will always be 0 ou greater equal 8. A value of zero means the pick point was not near an edge. In the context of ND-viewing edge will be a flat one-dimensional array of en many floats: the first pn floats define the first vértice, and the second pn many floats define the second vértice; en will be two times pn.

In this example module, the remaining variables will never be given values because their values in the interest statement were specified as nil.

HPoint3 face[]; int fn;
float *face; int fn;
face is a variable length array of fn HPoint3's. face gives the coordenadas dos vértices da picked face. fn tells how many coordenadas have been written into this array; it will always be either 0 ou a multiple of pn. A value of zero means the pick point was not near a face. In the context of ND-viewing face is a flat one-dimensional array of fn many floats of which each vértice occupies pn many componentes.
int ppath[]; int ppn;
ppath is an array of maxpathlen int's. ppath gives the path through the OOGL heirarchy to the picked primitive. pn tells how many integers have been written into this array; it will be at most maxpathlen. A path of {3,1,2}, for example, means that the picked primitive is "subobjeto number 2 of subobjeto number 1 of objeto 3 in the world".
int vi;
vi gives the index do vértice selecionado in the picked primitive, if the pick point was near a vértice.
int ei[2]; int ein
The ei array gives the indices dos endpoints da picked edge, if the pick point was near a vértice. ein tells how many integers were written into this array. It will always be either 0 ou 2; a value of 0 means the pick point was not near an edge.
int fi;
fi gives the index da picked face in the picked primitive, if the pick point was near a face.

The handle_pick procedure actually does the work of dealing with the pick event. It begins by normalizing the homogeneous coordenadas passed in as arguments so that we can assume the fourth coordinate is 1. It then sends GCL commands to define the pick objeto to be whatever is appropriate for the kind of pick recieved. Veja Formatos dos Arquivos da OOGL, and veja GCL, for an explanation do format dos data in these commands.

The main program, at the bottom do file, first calls Initialize(). Next, the call to LakeDefine defines the Lake that the lisp library will use. A Lake is a structure that the lisp library uses internally as a type of communiation vehicle. (It is like a unix stream but more general, hence the name.) This call to LakeDefine defines a Lake structure for doing I/O with stdin and stdout. The third argument to LakeDefine should be NULL for external modules (it is used by Geomview). Finally, the program enters its main loop which parses and evaluates expressions from standard input. geomview-1.9.5/doc/geomview-pt_BR.html/Example4.html0000644000175000017500000001764412310162311017176 00000000000000 Example4 - Manual do Geomview

Next: , Previous: Example3, Up: Modulos


6.6 Example 4: Simple Tcl/Tk Module Demonstrating Picking

It's not necessary to write a Geomview module in C. The only requirement of an external module is that it send GCL commands to its standard output and expect responses (if any) on its standard input. An external module can be written in C, perl, tcl/tk, ou pretty much anything.

As an example, assuming you have Tcl/Tk version 4.0 ou later, here's an external module with a simple GUI which demonstrates interaction with geomview. This manual doesn't discuss the Tcl/Tk language; see the good book on the subjeto by its originator John Ousterhout, published by Addison-Wesley, titled Tcl and the Tk Toolkit.

The ‘#!’ on the script's first line causes the system to interpret the script using the Tcl/Tk ‘wish’ program; you might have to change its first line if that's in some location other than /usr/local/bin/wish4.0. Or, you could define it as a module using

       (emodule-define  "Pick Demo"  "wish pickdemo.tcl")

in which case ‘wish’ could be anywhere on the UNIX search path.

     #! /usr/local/bin/wish4.0
     
     # We use "fileevent" below to have "readsomething" be called whenever
     # data is available from standard input, i.e. when geomview has sent us
     # something.  It promises to include a trailing newline, so we can use
     # "gets" to read the geomview response, then parse its nested parentheses
     # into tcl-friendly {} braces.
     
     proc readsomething {} {
       if {[gets stdin line] < 0} {
             puts stderr "EOF on input, exiting..."
             exit
       }
       regsub -all {\(} $line "\{" line
       regsub -all {\)} $line "\}" line
       # Strip outermost set of braces
       set stuff [lindex $line 0]
       # Invoke handler for whichever command we got.  Could add others here,
       # if we asked geomview for other kinds of data as well.
       switch [lindex $stuff 0] {
             pick     {handlepick $stuff}
             rawevent {handlekey $stuff}
       }
     }
     
     # Fields of a "pick" response, from geomview manual:
     #     (pick COORDSYS GEOMID G V E F P VI EI FI)
     #          The pick command is executed internally in response to pick
     #          events (right mouse double clique).
     #
     #          COORDSYS = coordinate system in which coordenadas of the following
     #              arguments are specified.   This can be:
     #               world: world coord sys
     #               self:  coord sys of the picked geom (GEOMID)
     #               primitive: coord sys of the actual primitive within
     #                   the picked geom where the pick occurred.
     #          GEOMID = id of picked geom
     #          G = picked point (actual intersection of pick ray with objeto)
     #          V = picked vertex, if any
     #          E = picked edge, if any
     #          F = picked face
     #          P = path to picked primitive [0 ou more]
     #          VI = index of picked vértice in primitive
     #          EI = list of indices of endpoints of picked edge, if any
     #          FI = index of picked face
     
     # Report when user picked something.
     #
     proc handlepick {pick} {
       global nameof selvert seledge order
       set obj [lindex $pick 2]
       set xyzw [lindex $pick 3]
       set fv [lindex $pick 6]
       set vi [lindex $pick 8]
       set ei [lindex $pick 9]
       set fi [lindex $pick 10]
     
       # Report result, converting 4-component homogeneous point into 3-space point.
       set w [lindex $xyzw 3]
       set x [expr [lindex $xyzw 0]/$w]
       set y [expr [lindex $xyzw 1]/$w]
       set z [expr [lindex $xyzw 2]/$w]
       set s "$x $y $z "
       if {$vi >= 0} {
             set s "$s  vertex #$vi"
       }
       if {$ei != {}} {
             set s "$s  edge [lindex $ei 0]-[lindex $ei 1]"
       }
       if {$fi != -1} {
             set s "$s  face #$fi ([expr [llength $fv]/3]-gon)"
       }
       msg $s
     }
     
     
     # Having asked for notification of these raw events, we report when
     # the user pressed these keys in the geomview graphics windows.
     
     proc handlekey {event} {
       global lastincr
       switch [lindex $event 1] {
         32 {msg "Pressed space bar"}
          8 {msg "Pressed backspace key"}
       }
     }
     
     
     #
     # Display a message on the control panel, and on the terminal where geomview
     # was started.  We use ``puts stderr ...'' rather than simply ``puts ...'',
     # since Geomview interprets anything we send to standard output
     # as a GCL command!
     #
     proc msg {str} {
       global msgtext
       puts stderr $str
       set msgtext $str
       update
     }
     
     # Load objeto from file
     proc loadobject {fname} {
       if {$fname != ""} {
             puts "(geometry thing < $fname)"
             # Be sure to flush output to ensure geomview receives this now!
             flush stdout
       }
     }
     
     
     # Build simple "user interface"
     
     # The message area could be a simple label rather than an entry box,
     # but we want to be able to use X selection to copy text from it.
     # The default mouse bindings do that automatically.
     
     entry .msg -textvariable msgtext -width 45
     pack .msg
     
     frame .f
     
       label .f.l -text "File to load:"
       pack .f.l -side left
     
       entry .f.ent -textvariable fname
       pack .f.ent -side left -expand true -fill x
       bind .f.ent <Return> { loadobject $fname }
     
     pack .f
     
     
     # End UI definition.
     
     
     # Call "readsomething" when data arrives from geomview.
     
     fileevent stdin readable {readsomething}
     
     # Geomview initialization
     
     puts {
             (interest (pick primitive))
             (interest (rawevent 32))	# Be notified when user presses space
             (interest (rawevent 8))		# ou backspace keys.
             (geometry thing < hdodec.off)
             (normalization world none)
     }
     # Flush to ensure geomview receives this.
     flush stdout
     
     wm title . {Sample external module}
     
     msg "Click right mouse in graphics window"
geomview-1.9.5/doc/geomview-pt_BR.html/Module-Installation.html0000644000175000017500000000444012310162311021371 00000000000000 Module Installation - Manual do Geomview

Previous: Example4, Up: Modulos


6.7 Module Installation

Essa seção diz como instalar um módulo externo de forma que você possa invocá-lo dentro do Geomview. Existem duas maneiras de instalar um módulo: você pode installar um módulo privado de forma que o módulo esteja disponível somente para você mesmo sempre que executar o Geomview, ou você pode instalar um módulo de sistema de forma que o módulo esteja disponível para todos os usuários do seu sistema sempre que eles executarem o Geomview.

geomview-1.9.5/doc/geomview-pt_BR.html/Private-Module-Installation.html0000644000175000017500000000663612310162311023012 00000000000000 Private Module Installation - Manual do Geomview

6.7.1 Private Module Installation

O comando emodule-define providencia que um módulo apareça no navegador de módulos (Modules) do Geomview. O comando recebe dois arumentos que são sequências de caractere; o primeiro é o nome que irá aparecer no navegador de módulos (Modules). O segundo é o comando de shell para executar o módulo; esse nome de shell pode incluir argumentos (veja (emodule-define ...)). Geomview executa esse comando em um subshell quando você dá um clique sobre a entrada do módulo no navegador. Por exemplo

     (emodule-define "Foo" "/u/home/modules/foo -x")

adiciona uma linha rotulada "Foo" ao navegador de módulos (Modules) o qual faz com que o comando "/u/home/modules/foo -x" seja executado quando selecionado.

Você pode colocar comandos emodule-define no seu arquivo ~/.geomview para providenciar que certos módulos estejam disponíveis sempre que você execute Geomview; veja Customizacao. você pode também executar comandos emodule-define a partir do painel de comandos (Commands) para adicionar um módulo a uma cópia do Geomview que já esteja sendo executada.

Existem muitos outros comandos GCL para controlar as entradas no navegador de módulos (Modules); para detalhes, veja GCL. geomview-1.9.5/doc/geomview-pt_BR.html/System-Module-Installation.html0000644000175000017500000000707112310162311022656 00000000000000 System Module Installation - Manual do Geomview

6.7.2 System Module Installation

Para instalar um módulo de forma que esse módulo esteja disponível para todos os usuários do Geomview faça o seguinte

1.
Crie um arquivo chamado .geomview-módulo módulo é o nome do módulo. Esse arquivo deve conter uma linha simples que é um comando emodule-define para aquele módulo:
          (emodule-define "Novo Módulo" "novomodulo")

O primeiro argumento, "Novo Módulo" acima, é a sequência de caracteres que irá aparecer no navegador de módulo (Modules). A segunda sequência de caracteres, "novomodulo" acima, é o comando de Bourne shell para invocar o módulo. Esse comando de shell pode incluir argumentos, e você pode assumir que o módulo encontra-se localizado em $PATH que representa os locais de busca do shell.

2.
Coloque uma cópia do .geomview-módulo e o executável do módulo propriamente dito no diretório /usr/local/libexec/geomview.

Após esses passos, o novo módulo deve aparecer, em ordem alfabética, no navegador de módulos (Modules) do Geomview do painel principal (Main) da próxima vez que o Geomview for inicializado. A razão desse trabalho é que quando Geomview for invocado processará todos os arquivos .geomview-* em seu diretório de módulos. Geomview também lembra o caminho desse diretório e coloca aquele caminho em $PATH do shell no qual Geomview invoca tal módulo. geomview-1.9.5/doc/geomview-pt_BR.html/GCL.html0000644000175000017500000001416012310162311016112 00000000000000 GCL - Manual do Geomview

Next: , Previous: Modulos, Up: Top


7 GCL: a Linguagem de Comandos do Geomview

GCL tem a sintaxe do lisp – i.e. uma expressão da forma (f a b ...) significa informar os vallores de a, b, ... para a função f. GCL é muito limitado e GCL não é de forma alguma uma implementação de lisp. GCL é simplesmente uma linguagem para expressar comandos que são executados na ordem fornecida, ao contrário de uma linguagem de programação. GCL não suporta variável ou definição de função.

GCL é a linguagem que Geomview entende para arquivos que chama bem como para comunicação com outros programas. Para executar um comando GCL interativamente, você pode trazer o painel de comandos (Commands) que trás sua digitação em um comando; Geomview executa o comando quando você pressiona a tecla <Enter>. A saída de tais comandos é mostrada na saída padrão. Alternativamente, você pode invocar Geomview com geomview -c - que faz com que o Geomview leia comandos GCL a partir da entrada padrão.

Funções GCL retornam um valor, e você pode concaenar chamadas de função de forma que outras funções usem esse valor retornado. Por exemplo

     (f (g a b))

avalia (g a b) e então avalia (f x) onde x é o resultado retornado por (g a b). Geomview mantém esses valores de retorno internamente normalmente não fornece saída alguma com os resultados guardados. Para mostrar um valor de retorno esse valor de retorno deve ser fornecido à função echo. Por exemplo a função geomview-version retorna uma sequência de caracteres representado a versão do Geomview que está sendo executada, e

     (echo (geomview-version))

mostra essa sequência de caracteres.

Muitas função simplesmente retornam t ( de "true" - verdadeiro) caso tenham sido executadas como esperado ou nil ( nenhum ) em caso de falha; esse é o caso se a documentação para a função não fornece o retorno esperado. Esses são os símbolos do lisp para verdadeiro e falso, respectivamente. (Eles correspondem às variáveis definidas em C Lt e Lnil que você verá se olhar no código fonte do Geomview ou em algum dos módulos externos.)

Nas descrições ds comandos acima muitas refer6encias são feitas a formatos "OOGL" formats. OOGL é a linguagem de descrição dos dados que Geomview utiliza para descrever objetos geométricos, câmeras, aparências, e outos objetos básicos. Para detalhes dos formatos OOGL, veja Formatos dos Arquivos da OOGL. (Ou equivalentemente, veja a página de manual oogl(5), distributed with Geomview in the file /share/man/man5/oogl.5gv.

Os comandos GCL e tipos de argumentos são listados abaixo. A maioria da documentação nessa seção do manual está disponível dentro do Geomview via comandos ? e ??. O comando (? comando) faz com que Geomview mostre na tela um sumário de uma linha da sintaxe de comando, e (?? comando) mostra na tela uma explanação de o que comando faz. Você pode incluir o caractere coringa * no comando para mostrar informações para um frupo de comandos coincidindo com um modelo. Por exemplo, (?? *emodule*) irá mostrar todas as informações sobre todos os comandos contendo a sequência de caracteres emodule. (? *) irá mostrar um lista curta de todos os comandos.

geomview-1.9.5/doc/geomview-pt_BR.html/Argument-Conventions.html0000644000175000017500000001327612310162311021601 00000000000000 Argument Conventions - Manual do Geomview

Next: , Previous: GCL, Up: GCL


7.1 Conventions Used In Describing Argument Types

Os seguintes símbolos são usados para descrever tipos de argumentos na documentação para funções GCL.

aparência
é uma especificação de aparência OOGL.
cam-id
é uma identificação que refre-se a uma câmera.
câmera
é uma especificação de câmera do OOGL.
geom-id
é uma identificação que se refere a um objeto geométrico.
geometry
é uma especificação de objeto geométrico do OOGL.
id
é uma sequência de caracteres que nomeia um objeto geométrico ou câmera. Como aqueles que você cria, os valores permitidos são:
World, world, worldgeom, g0
a coleção de todos os objetos geométricos
target
objeto alvo selecionado (câmera ou objeto geométrico)
center
objeto central do movimento selecionado
targetcam
a última câmera alvo selecionada
targetgeom
o último objeto geométrico alvo selecionado
focus
câmera onde o cursor está (ou mais recentemente esteve)
allgeoms
todos os objetos geométricos
allcams
todas as câmeras
default, defaultcam, prototype
câmeras futuras que herdarão as escolhas padronizadas

As seguintes ids são usadas para nomear sistemas de coordenadas, e.g. em comandos pick e write:

World, world, worldgeom, g0
o objeto mundo, dentro do qual todos os objetos geométricos vivem.
universe
o universo, no qual o no qual o objeto mundo, as luzes e as câmeras vivem. Transformações world2cam das câmeras podem melhor serem chamadas universe2cam, etc.
self
"esse objeto do Geomview". Transforma de um objeto para si mesmo é a identidade; escrevendo seu objeto geométrico fornece o bojeto em si mesmo sem executar nenhuma transformação; pontos selecionados aparecem nas coordenadas do objeto.
primitive
(para objetos selecionados (pick) somente) Pontos selecionados aparecem no sistema de coordenadas da primitiva de menor nível do OOGL.

Um nome também é uma identificação aceitável. Fornecimento de nomes é feito único pela anexação de números se necessário (i.e. foo<2>). Todo objeto geométrico é também chamado g[n] e toda câmera é também chamada c[n] (g0 é sempre o objeto geométrico mundo - worldgeom): esse nome é usado como um prefixo a comandos de teclado e pode também ser usado como uma identificação GCL. Números são usados após um objeto ser deletado. Ambos os nomes são mostrados no navegador de Objeto.

declaração
representa uma chamada de função. Chamadas a funções possuem a forma (func arg1 arg2 ... ), onde func é o nome da funçào e arg1, arg2, ... são os argumentos.
transformação
é uma matriz de transformação OOGL 4x4.
ntransform
é uma matriz de transformação OOGL (N+1)x(N+1).
janela
é uma especificação de janela do OOGL.
geomview-1.9.5/doc/geomview-pt_BR.html/GCL-Reference.html0000644000175000017500000005137612310162311020020 00000000000000 GCL Reference - Manual do Geomview

Previous: Argument Conventions, Up: GCL


7.2 GCL Reference Guide

Nota do tradutor: os termos “expressão lambda" e “expressão S" são específicos da linguagem de programação Lisp. geomview-1.9.5/doc/geomview-pt_BR.html/shell_002dshortcut.html0000644000175000017500000000336712310162311021144 00000000000000 shell-shortcut - Manual do Geomview

Next: , Previous: GCL Reference, Up: GCL Reference


7.2.1 !

!
é um sinônimo de shell. Veja shell.
geomview-1.9.5/doc/geomview-pt_BR.html/lt.html0000644000175000017500000000337012310162311016125 00000000000000 lt - Manual do Geomview

Next: , Previous: shell-shortcut, Up: GCL Reference


7.2.2 <

(< EXPR1 EXPR2)
Retorna t se EXPR1 for menor que EXPR2. EXPR1 e EXPR2 devem ser ou ambas inteiras ou número em ponto flutuante, ou ambas sequências de caractere.
geomview-1.9.5/doc/geomview-pt_BR.html/eq.html0000644000175000017500000000323012310162311016106 00000000000000 eq - Manual do Geomview

Next: , Previous: lt, Up: GCL Reference


7.2.3 =

(= EXPR1 EXPR2)
Retorna t se EXPR1 for igual a EXPR2. EXPR1 e EXPR2 devem ser ou ambas inteiras ou número em ponto flutuante, ou ambas sequências de caractere.
geomview-1.9.5/doc/geomview-pt_BR.html/gt.html0000644000175000017500000000324612310162311016122 00000000000000 gt - Manual do Geomview

Next: , Previous: eq, Up: GCL Reference


7.2.4 >

(> EXPR1 EXPR2)
Retorna t se EXPR1 for maior que EXPR2. EXPR1 e EXPR2 devem ser ou ambas inteiras ou número em ponto flutuante, ou ambas sequências de caractere.
geomview-1.9.5/doc/geomview-pt_BR.html/mul.html0000644000175000017500000000311212310162311016275 00000000000000 mul - Manual do Geomview

Next: , Previous: gt, Up: GCL Reference


7.2.5 *

(* EXPR1 EXPR2)
Multiplica EXPR1 por EXPR2 e retorna o resultado.
geomview-1.9.5/doc/geomview-pt_BR.html/div.html0000644000175000017500000000311412310162311016264 00000000000000 div - Manual do Geomview

Next: , Previous: mul, Up: GCL Reference


7.2.6 /

(/ EXPR1 EXPR2)
Divide EXPR1 por EXPR2 e retorna o resultado.
geomview-1.9.5/doc/geomview-pt_BR.html/add.html0000644000175000017500000000311412310162311016232 00000000000000 add - Manual do Geomview

Next: , Previous: div, Up: GCL Reference


7.2.7 +

(+ EXPR1 EXPR2)
Adiciona EXPR1 a EXPR2 e retorna o resultado.
geomview-1.9.5/doc/geomview-pt_BR.html/sub.html0000644000175000017500000000323012310162311016272 00000000000000 sub - Manual do Geomview

Next: , Previous: add, Up: GCL Reference


7.2.8 -

(- EXPR1 EXPR2)
Subtrai EXPR2 da EXPR1 e retorna o resultado.
geomview-1.9.5/doc/geomview-pt_BR.html/help_002dshortcut.html0000644000175000017500000000406012310162311020754 00000000000000 help-shortcut - Manual do Geomview

Next: , Previous: sub, Up: GCL Reference


7.2.9 ?

(? [comando])
Fornece sumário de uso em uma linha para comando. Comando pode incluir *s como caracteres coringa; veja também (?? ...). Ajuda de comando em uma linha; lista nomes somente se multiplos comandos coincidirem. ? é um sinônimo para (help ...)
geomview-1.9.5/doc/geomview-pt_BR.html/morehelp_002dshortcut.html0000644000175000017500000000401312310162311021635 00000000000000 morehelp-shortcut - Manual do Geomview

7.2.10 ??

(?? comando)
comando pode incluir coringas *. Mostra mais informação que (? comando). ?? é um sinônimo para morehelp.
geomview-1.9.5/doc/geomview-pt_BR.html/emodule_002drun_002dshortcut.html0000644000175000017500000000347712310162311022743 00000000000000 emodule-run-shortcut - Manual do Geomview

Next: , Previous: morehelp-shortcut, Up: GCL Reference


7.2.11 |

|
| ém um sinônimo para emodule-run.
geomview-1.9.5/doc/geomview-pt_BR.html/all.html0000644000175000017500000000443012310162311016254 00000000000000 all - Manual do Geomview

Next: , Previous: emodule-run-shortcut, Up: GCL Reference


7.2.12 all

(all geometry)
retorna uma lista de nomes de todos os objetos geometry. Use e.g. ‘(echo (all geometry))’ para mostrar tal lista.
(all camera)
retorna uma lista de nomes de todas as câmeras.
(all emodule defined)
retorna uma lista de todos os módulos externos definidos.
(all emodule running)
retorna uma lista de todos módulos externos em execução.
geomview-1.9.5/doc/geomview-pt_BR.html/and.html0000644000175000017500000000335312310162311016251 00000000000000 and - Manual do Geomview

Next: , Previous: all, Up: GCL Reference


7.2.13 and

(and EXPR1 EXPR2)
Avalia EXPR1 e EXPR2 e retorna t se ambas retornarem não-nil, de outra forma retorna nil.
geomview-1.9.5/doc/geomview-pt_BR.html/ap_002doverride.html0000644000175000017500000000343712310162311020377 00000000000000 ap-override - Manual do Geomview

Next: , Previous: and, Up: GCL Reference


7.2.14 ap-override

(ap-override [on|off])
Seleciona se controles de aparência devem sobrescrever ajustres dos próprios objetos. Habilitado por padrão. Sem argumentos, retorna o ajuste atual.
geomview-1.9.5/doc/geomview-pt_BR.html/backcolor.html0000644000175000017500000000342412310162311017445 00000000000000 backcolor - Manual do Geomview

Next: , Previous: ap-override, Up: GCL Reference


7.2.15 backcolor

(backcolor CAM-ID R G B)
Ajusta a cor de fundo da CAM-ID; R G B são números entre 0 e 1.
geomview-1.9.5/doc/geomview-pt_BR.html/background_002dimage.html0000644000175000017500000000435312310162311021357 00000000000000 background-image - Manual do Geomview

Next: , Previous: backcolor, Up: GCL Reference


7.2.16 background-image

(background-image CAM-ID [NOMEDOARQUIVO])
Use a imagem fornecida como fundo da câmera CAM-ID (a qual deve ser uma câmera real, não pode ser ou default ou allcams). A imagem é centralizada na área da janela. Trabalha somente com gráficos GL e OpenGL. Use "" como nome de arquivo para remover o fundo. Sem argumentos, retorna o nome da imagem que é usada atualmente como fundo da janela, ou "". Qualquer tipo de arquivo aceitável como textura é permitido, e.g. .ppm.gz, .sgi, etc.
geomview-1.9.5/doc/geomview-pt_BR.html/bbox_002dcolor.html0000644000175000017500000000347312310162311020230 00000000000000 bbox-color - Manual do Geomview

Next: , Previous: background-image, Up: GCL Reference


7.2.17 bbox-color

(bbox-color GEOM-ID R G B)
Ajusta a cor da caixa associada do GEOM-ID; R G B são números entre 0 e 1.
geomview-1.9.5/doc/geomview-pt_BR.html/bbox_002ddraw.html0000644000175000017500000000344712310162311020050 00000000000000 bbox-draw - Manual do Geomview

Next: , Previous: bbox-color, Up: GCL Reference


7.2.18 bbox-draw

(bbox-draw GEOM-ID [yes|no])
Diz se a caixa associada do GEOM-ID deve ser desenhada; a escolha padrão é yes se o segundo argumento for omitido.
geomview-1.9.5/doc/geomview-pt_BR.html/camera.html0000644000175000017500000000413212310162311016733 00000000000000 camera - Manual do Geomview

Next: , Previous: bbox-draw, Up: GCL Reference


7.2.19 camera

(camera CAM-ID [CAMERA])
Especifica dados para CAM-ID; CAMERA é uma sequência de caracteres fornecendo uma especificação de câmera OOGL. Se nenhuma CAM-ID de câmera existir, essa CAM-ID é criada; nesse caso, o segundo argumento é opcional,e se omitido, uma câmera padrão é usada. See (new-camera ...).
geomview-1.9.5/doc/geomview-pt_BR.html/camera_002ddraw.html0000644000175000017500000000341412310162311020340 00000000000000 camera-draw - Manual do Geomview

Next: , Previous: camera, Up: GCL Reference


7.2.20 camera-draw

(camera-draw CAM-ID [yes|no])
Diz se câmeras devem ou não serem desenhadas em CAM-ID; yes se omitido.
geomview-1.9.5/doc/geomview-pt_BR.html/camera_002dprop.html0000644000175000017500000000441712310162311020367 00000000000000 camera-prop - Manual do Geomview

Next: , Previous: camera-draw, Up: GCL Reference


7.2.21 camera-prop

(camera-prop { geometry object } [projective])
Especifica o objeto a ser mostrado quando desenhando outras câmeras. Por padrão, esse objeto é desenhado com sua orígem na camera, e com a câmera olhando adiante do eixo -Z do objeto. Com a palavra chave projective, a projeção da visão da câmera é também aplicada ao objeto; isso coloca o Z=-1 e o Z=+1 do objeto perto e distante dos planos de corte, com a área de visão -1<={X,Y}<=+1. Exemplo: (camera-prop { < cube } projective)
geomview-1.9.5/doc/geomview-pt_BR.html/camera_002dreset.html0000644000175000017500000000330112310162311020520 00000000000000 camera-reset - Manual do Geomview

Next: , Previous: camera-prop, Up: GCL Reference


7.2.22 camera-reset

(camera-reset CAM-ID)
Ajusta CAM-ID para seu valor padrão.
geomview-1.9.5/doc/geomview-pt_BR.html/car.html0000644000175000017500000000315712310162311016256 00000000000000 car - Manual do Geomview

Next: , Previous: camera-reset, Up: GCL Reference


7.2.23 car

(car LISTA)
retorna o primeiro elemento de LISTA.
geomview-1.9.5/doc/geomview-pt_BR.html/cdr.html0000644000175000017500000000311612310162311016254 00000000000000 cdr - Manual do Geomview

Next: , Previous: car, Up: GCL Reference


7.2.24 cdr

(cdr LISTA)
retorna a lista obtida removendo o primeiro elemento de LISTA.
geomview-1.9.5/doc/geomview-pt_BR.html/clock.html0000644000175000017500000000343312310162311016601 00000000000000 clock - Manual do Geomview

Next: , Previous: cdr, Up: GCL Reference


7.2.25 clock

(clock)
Retorna a hora atual, em segundos, como mostrado por esse relógio do fluxo. See (set-clock ...). See (sleep-until ...).
geomview-1.9.5/doc/geomview-pt_BR.html/command.html0000644000175000017500000000336512310162311017130 00000000000000 command - Manual do Geomview

Next: , Previous: clock, Up: GCL Reference


7.2.26 command

(command ARQUIVOENTRADA [ARQUIVOSAIDA])
Lê comandos de ARQUIVOENTRADA; envia respostas correspondentes (e.g. qualquer coisa escrita para nome de arquivo -) para ARQUIVOSAIDA, stdout por padrão.
geomview-1.9.5/doc/geomview-pt_BR.html/cons.html0000644000175000017500000000327512310162311016454 00000000000000 cons - Manual do Geomview

Next: , Previous: command, Up: GCL Reference


7.2.27 cons

(cons EXPR LISTA)
Retorna a lista obtida adicionando EXPR como primeiro elemento da LISTA. Note que o segundo argumento tem de ser uma lista.
geomview-1.9.5/doc/geomview-pt_BR.html/copy.html0000644000175000017500000000346112310162311016461 00000000000000 copy - Manual do Geomview

Next: , Previous: cons, Up: GCL Reference


7.2.28 copy

(copy [ID] [nome])
Copia um objeto ou câmera. Se ID não for especificado, esse ID é assumido como sendo targetgeom. If nome não for especificado, esse nome é assumido como sendo o mesmo nome de ID.
geomview-1.9.5/doc/geomview-pt_BR.html/cursor_002dstill.html0000644000175000017500000000357212310162311020624 00000000000000 cursor-still - Manual do Geomview

Next: , Previous: copy, Up: GCL Reference


7.2.29 cursor-still

(cursor-still [INT])
Ajusta o número de microssegundos para os quais o cursor não deve mover-se para registrar como fixo. Se INT não for especificado, o valor irá ser ajustado para o valor padrão.
geomview-1.9.5/doc/geomview-pt_BR.html/cursor_002dtwitch.html0000644000175000017500000000356612310162311021002 00000000000000 cursor-twitch - Manual do Geomview

Next: , Previous: cursor-still, Up: GCL Reference


7.2.30 cursor-twitch

(cursor-twitch [INT])
Ajusta a distância na qual o cursos não deve mover-se (em x ou y) para registrar como fixo. Se INT não for especificado, o valor irá ser ajustado para o valor padrão.
geomview-1.9.5/doc/geomview-pt_BR.html/defun.html0000644000175000017500000000625612310162311016615 00000000000000 defun - Manual do Geomview

Next: , Previous: cursor-twitch, Up: GCL Reference


7.2.31 defun

(defun NOME (ARG1 ...) [DOCSTRING] EXPR1 ...)
Define uma chamada expressão lambda, isto é: define NOME para avaliar para a expressão lambda (lambda (ARG1 ...) (EXPR1 ...)) quando chamada como uma função. Também, instala DOCSTRING como resposta para os comandos (help NOME) e (morehelp NOME). Note que DOCSTRING não precisa conter a sinopse do comando, essa sinopse é gerada automaticamente. EXPR1 não pode ser uma sequência de caracteres se DOCSTRING for omitida; EXPR1 deve ser interpretada como a sequência de caracteres documento. O valor de retorno da (defun ...) é o nome da função. Funções podem ser recursivas e podem modificar a si mesmas. é posível redefinir funções internas, nesse caso a definição antiga está ainda disponível so o nome -builtin-OLDNAME-. Valores de argumento podem ser alterados por setq; a nova associação é descartada após avaliação de surroundingdefun-body. As palavras especiais &optional e &rest possuem o mesmo significado que a expressão lambda anonymous, veja nas referência adiante. See (lambda ...). See (setq ...). See (let ...).
geomview-1.9.5/doc/geomview-pt_BR.html/delete.html0000644000175000017500000000312212310162311016743 00000000000000 delete - Manual do Geomview

Next: , Previous: defun, Up: GCL Reference


7.2.32 delete

(delete ID)
Apaga objeto ou câmera especificado em ID.
geomview-1.9.5/doc/geomview-pt_BR.html/dice.html0000644000175000017500000000352112310162311016410 00000000000000 dice - Manual do Geomview

Next: , Previous: delete, Up: GCL Reference


7.2.33 dice

(dice GEOM-ID N)
Divide qualquer ajustes Bezier dentro de GEOM-ID em malhas de medida NxN; o padrão para N é 10. Veja também o atributo de aparência patchdice, o qual torna esse comando obsoleto.
geomview-1.9.5/doc/geomview-pt_BR.html/dimension.html0000644000175000017500000000364412310162311017477 00000000000000 dimension - Manual do Geomview

Next: , Previous: dice, Up: GCL Reference


7.2.34 dimension

(dimension [N])
Ajusta ou lê a dimensão do espaço para visão N-dimensional. (Uma vez que cálculos forem concluídos usando coordenadas homogêneas, isso significa que matrizes são (N+1)x(N+1).) Sem argumentos, retorna a dimensão atual, ou 0 se a visualização N-dimensional não puder ser habilitada.
geomview-1.9.5/doc/geomview-pt_BR.html/dither.html0000644000175000017500000000321012310162311016756 00000000000000 dither - Manual do Geomview

Next: , Previous: dimension, Up: GCL Reference


7.2.35 dither

(dither CAM-ID {on|off|toggle})
Alterna entre estremecimento ligado e desligado em CAM-ID.
geomview-1.9.5/doc/geomview-pt_BR.html/draw.html0000644000175000017500000000335712310162311016450 00000000000000 draw - Manual do Geomview

Next: , Previous: dither, Up: GCL Reference


7.2.36 draw

(draw CAM-ID)
Desenha a visão em CAM-ID, se a visão precisar ser redesenhada. See (redraw ...).
geomview-1.9.5/doc/geomview-pt_BR.html/dump_002dhandles.html0000644000175000017500000000342412310162311020537 00000000000000 dump-handles - Manual do Geomview

Next: , Previous: draw, Up: GCL Reference


7.2.37 dump-handles

(dump-handles)
Descarrega a lista dos manipuladores ativos atualmente para a saída padrão. Essa função é pensada para uso em depuração interna somente.
geomview-1.9.5/doc/geomview-pt_BR.html/echo.html0000644000175000017500000000405612310162311016426 00000000000000 echo - Manual do Geomview

Next: , Previous: dump-handles, Up: GCL Reference


7.2.38 echo

(echo ...)
Escreve os dados fornecidos para o arquivo especial -. Sequências de caracteres são escritas literalmente; expressões em lisp são avaliadas e seus valores escritos. Se recebido de um programa externo, echo envia para a entrada do programa. De outra forma escreve para a própria saída padrão do Geomview (tipicamente o terminal).
geomview-1.9.5/doc/geomview-pt_BR.html/emodule_002dclear.html0000644000175000017500000000337612310162311020702 00000000000000 emodule-clear - Manual do Geomview

Next: , Previous: echo, Up: GCL Reference


7.2.39 emodule-clear

(emodule-clear)
Limpa o navegador de aplicação do Geomview (módulo externo).
geomview-1.9.5/doc/geomview-pt_BR.html/emodule_002ddefine.html0000644000175000017500000000417712310162311021046 00000000000000 emodule-define - Manual do Geomview

Next: , Previous: emodule-clear, Up: GCL Reference


7.2.40 emodule-define

(emodule-define NOME COMANDO-SHELL ...)
Define um módulo externo chamado NOME, o qual então aparece no navegador de módulos externos. A sequência de caracteres COMANDO-SHELL é um comando shell UNIX que chama o módulo. Veja (emodule-run ...) para discurssão sobre módulos externos.
geomview-1.9.5/doc/geomview-pt_BR.html/emodule_002ddefined.html0000644000175000017500000000411612310162311021203 00000000000000 emodule-defined - Manual do Geomview

7.2.41 emodule-defined

(emodule-defined nomemodulo)
Se o nome do módulo externo for conhecido, retorna o nome do programa chamado quando nomemodulo está executando como sequência de caracteres entre aspas duplas; de outra forma retorna nil. (echo (emodule-defined nome)) mostra na tela a sequência de caracteres.
geomview-1.9.5/doc/geomview-pt_BR.html/emodule_002disrunning.html0000644000175000017500000000411312310162311021616 00000000000000 emodule-isrunning - Manual do Geomview

Next: , Previous: emodule-defined, Up: GCL Reference


7.2.42 emodule-isrunning

(emodule-isrunning NOME)
Retorna Lt se o módulo externo NOME estiver rodando, ou Lnil se o módulo externo não estiver rodando. NOME é pesquisado nos nomes como eles aparecem no navegador de módulos e nos comandos de shell usados para executar o módulo externo (não incluindo os argumentos).
geomview-1.9.5/doc/geomview-pt_BR.html/emodule_002dpath.html0000644000175000017500000000412612310162311020542 00000000000000 emodule-path - Manual do Geomview

Next: , Previous: emodule-isrunning, Up: GCL Reference


7.2.43 emodule-path

(emodule-path)
Retorna o caminho de busca atual para módulos externos. Nota: para ver agora o valor retornado por essa função você deve envolver emodule-path em uma chamada ao comando shell echo: (echo (emodule-path)). See (set-emodule-path ...).
geomview-1.9.5/doc/geomview-pt_BR.html/emodule_002drun.html0000644000175000017500000000637612310162311020423 00000000000000 emodule-run - Manual do Geomview

Next: , Previous: emodule-path, Up: GCL Reference


7.2.44 emodule-run

(emodule-run COMANDO-SHELL ARGS...)
Executa o COMANDO-SHELL fornecido (uma sequência de caracteres contendo um comando shell UNIX) como um módulo externo. A saída padrão do módulo é interpretado como comandos do geomview; respostas (escrita para nomearquivo -) são enviadas para a entrada padrão do módulo. O comando shell é interpretado por /bin/sh, de forma que redirecionamento de E/S pode ser usada: um programa que pergunta ao usuário por entradas a partir do terminal poderá vir a ser executado com:
            (emodule-run  seuprograma  <&2)

Caso já não tenha sido ajustada, a variável de ambiente $MACHTYPE é ajustada para o nome do tipo da máquina. Conecções de entrada e saída para o geomview são liberadas automaticamente quando o comando shell encerra. Clicando sobre um prorama que está sendo executado na entrada do navegador de módulos envia o sinal SIGHUP ao programa. Para que esse recurso funcione, programas devem evitar executar em segundo plano; os programas usando as bibliotecas FORMS ou GL devem chamar a função foreground() antes da primeira chamada a FORMS ou winopen(). See (emodule-define ...). See (emodule-start ...).

geomview-1.9.5/doc/geomview-pt_BR.html/emodule_002dsort.html0000644000175000017500000000346312310162311020600 00000000000000 emodule-sort - Manual do Geomview

Next: , Previous: emodule-run, Up: GCL Reference


7.2.45 emodule-sort

(emodule-sort)
Ordena os módulos alfabéticamente no navegador de aplicação.
geomview-1.9.5/doc/geomview-pt_BR.html/emodule_002dstart.html0000644000175000017500000000361712310162311020747 00000000000000 emodule-start - Manual do Geomview

Next: , Previous: emodule-sort, Up: GCL Reference


7.2.46 emodule-start

(emodule-start NOME)
Inicia o módulo externo NOME, definido por emodule-define. Equivalente a clicar na entrada correspondente no navegador de módulos.
geomview-1.9.5/doc/geomview-pt_BR.html/emodule_002dtransmit.html0000644000175000017500000000406712310162311021453 00000000000000 emodule-transmit - Manual do Geomview

Next: , Previous: emodule-start, Up: GCL Reference


7.2.47 emodule-transmit

(emodule-transmit NOME LISTA)
Coloca LISTA na entrada padrão do módulo externo NOME. NOME é pesquisado nos nomes dos módulos na forma em que esses nomes aparecem no navegador de Módulos Externos e a seguir nos comandos shell usados para executar os módulos externos. Não faz nada se o módulo NOME nõ estiver sendo executado.
geomview-1.9.5/doc/geomview-pt_BR.html/escale.html0000644000175000017500000000327512310162311016746 00000000000000 escale - Manual do Geomview

Next: , Previous: emodule-transmit, Up: GCL Reference


7.2.48 escale

(escale GEOM-ID FACTOR)
O mesmo que scale mas multiplicado por exp(scale). Obsoleto.
geomview-1.9.5/doc/geomview-pt_BR.html/eval.html0000644000175000017500000000426112310162311016435 00000000000000 eval - Manual do Geomview

Next: , Previous: escale, Up: GCL Reference


7.2.49 eval

(eval EXPR)
Avalia uma expressão lisp. Se EXPR é uma expressão-S não avaliada como retornado pelo comando (apóstrofo ...) então o efeito irá ser ser como se tivesse chamado a expressão sem apóstrofo diretamente. A eval também torna possível avaliar expressões-S construídas via car, cdr e cons. See (car ...). See (cdr ...). See (cons ...).
geomview-1.9.5/doc/geomview-pt_BR.html/event_002dkeys.html0000644000175000017500000000334312310162311020250 00000000000000 event-keys - Manual do Geomview

Next: , Previous: eval, Up: GCL Reference


7.2.50 event-keys

(event-keys {on|off})
Alterna entre eventos de teclado on ou off para habilitar/desabilitar teclas de atalho.
geomview-1.9.5/doc/geomview-pt_BR.html/event_002dmode.html0000644000175000017500000000527212310162311020224 00000000000000 event-mode - Manual do Geomview

Next: , Previous: event-keys, Up: GCL Reference


7.2.51 event-mode

(event-mode SEQ_CARAC_MODOS)
Ajusta o modo de um evento do mouse (movimento); SEQ_CARAC_MODOS deve ser um entre as seguintes sequências de caractere:
  1. "[r] Rotate"
  2. "[t] Translate"
  3. "[z] Cam Zoom"
  4. "[s] Geom Scale"
  5. "[f] Cam Fly"
  6. "[o] Cam Orbit"
  7. "[le] Edit Lights"

Início de nota do tradutor:

Alguns termos não são de significado tão óbvio.

  1. "[r] Rotate" Rotação
  2. "[t] Translate" Translação
  3. "[z] Cam Zoom" Aproximação ou afastamento de câmera
  4. "[s] Geom Scale" Homotetia
  5. "[f] Cam Fly" Voo de câmera
  6. "[o] Cam Orbit" Órbita de câmera
  7. "[le] Edit Lights" Editar luzes

Fim de nota do tradutor.

geomview-1.9.5/doc/geomview-pt_BR.html/event_002dpick.html0000644000175000017500000000326512310162311020226 00000000000000 event-pick - Manual do Geomview

Next: , Previous: event-mode, Up: GCL Reference


7.2.52 event-pick

(event-pick {on|off})
Alterna entre selecionar on ou off.
geomview-1.9.5/doc/geomview-pt_BR.html/evert.html0000644000175000017500000000354712310162311016641 00000000000000 evert - Manual do Geomview

Next: , Previous: event-pick, Up: GCL Reference


7.2.53 evert

(evert GEOM-ID [yes|no])
Ajusta o estado normal de eversão (nota do tradutor: ver do outro lado de alguma superfície sobre a direção do vetor normal à mesma superfície) de GEOM-ID. Se o segundo argumento for omitido, inverte o estado de eversão.
geomview-1.9.5/doc/geomview-pt_BR.html/exit.html0000644000175000017500000000305612310162311016460 00000000000000 exit - Manual do Geomview

Next: , Previous: evert, Up: GCL Reference


7.2.54 exit

(exit)
Encerra o geomview.
geomview-1.9.5/doc/geomview-pt_BR.html/ezoom.html0000644000175000017500000000314712310162311016641 00000000000000 ezoom - Manual do Geomview

Next: , Previous: exit, Up: GCL Reference


7.2.55 ezoom

(ezoom GEOM-ID FATOR)
O mesmo que zoom mas multiplica por exp(zoom). Obsoleto.
geomview-1.9.5/doc/geomview-pt_BR.html/freeze.html0000644000175000017500000000351312310162311016765 00000000000000 freeze - Manual do Geomview

Next: , Previous: ezoom, Up: GCL Reference


7.2.56 freeze

(freeze CAM-ID)
Congela CAM-ID; desenho nessa janela de camera é desligado até que a imagem dessa câmera seja redesenhada com (redraw CAM-ID), após o redesenho da imagem da câmera alterações na imagem voltam a ser permitidas.
geomview-1.9.5/doc/geomview-pt_BR.html/geometry.html0000644000175000017500000000406612310162311017344 00000000000000 geometry - Manual do Geomview

Next: , Previous: freeze, Up: GCL Reference


7.2.57 geometry

(geometry GEOM-ID [GEOMETRIA])
Especifica a geometria para GEOM-ID. GEOMETRIA é uma sequência de caracteres fornecendo a especificação de um objeto geométrico OOGL. Se nenhum objeto chamado GEOM-ID existir, esse objeto inesistente será criado; nesse caso o argumento GEOMETRIA é opcional, e se omitido, o novo objeto chamado GEOM-ID é retornado sendo um objeto geométrico vazio.
geomview-1.9.5/doc/geomview-pt_BR.html/geomview_002dversion.html0000644000175000017500000000341312310162311021461 00000000000000 geomview-version - Manual do Geomview

Next: , Previous: geometry, Up: GCL Reference


7.2.58 geomview-version

(geomview-version)
Retorna uma sequência de caracteres representado a versão do geomview que está executando.
geomview-1.9.5/doc/geomview-pt_BR.html/hdefine.html0000644000175000017500000000502712310162311017111 00000000000000 hdefine - Manual do Geomview

Next: , Previous: geomview-version, Up: GCL Reference


7.2.59 hdefine

(hdefine geometria|camera|janela|aparência|imagem|transformação|ntransform nome valor)
Ajusta o valor de um manipulador de tipo fornecido.
            (hdefine  <tipo>  <nome>  <valor>)

is generally equivalent to

            (read <tipo>  { define <nome> <valor> })

exeto que a atribuição é desfeita ao final da execução de hdefine, (possivelmente não em todos os lugares se dentro de uma declaração condicional), enquanto oe read ... define realiza a atribuição tão rapidamente quanto o texto é lido. See Referencias. See (read ...). See (hdelete ...).

geomview-1.9.5/doc/geomview-pt_BR.html/hdelete.html0000644000175000017500000000551712310162311017125 00000000000000 hdelete - Manual do Geomview

Next: , Previous: hdefine, Up: GCL Reference


7.2.60 hdelete

(hdelete [geometria|camera|janela|aparência|imagem|transform|ntransform] nome)
Apaga o manipulador fornecido. Note que o manipulador não irá atualmente ser apagado no caso de existir ainda outros objetos fazendo referência ao manipulador, mas uma vez que os objetos que fazem referência ao maipulador apagado forem fechados, o manipulador irá também ser automaticamente mandado embora. O objeto que faz referência ao manipulador (se existir algum) irá somente ser deletado se não existirem outras referências para esse objeto.

Se o opcional primeiro argumento for omitido, então o primeiro manipulador que coincidir com nome irá ser apagado, independentemente do tipo de objeto ao qual esse manipulador estiver anexado. Não é um erro chamar essa função com um manipulador inexistente, mas é uma erro chamar essa função com o nome de um manipulador não global, i.e. um que não tenha sido criado por (hdefine ...) ou (read ... { define ...}). See Referencias. See (read ...). See (hdefine ...).

geomview-1.9.5/doc/geomview-pt_BR.html/help.html0000644000175000017500000000342312310162311016435 00000000000000 help - Manual do Geomview

Next: , Previous: hdelete, Up: GCL Reference


7.2.61 help

(help [comando])
O comando pode incluir *s como caracteres coringa; veja também (?? ...) Ajuda de comando em uma linha; lista nomes somente se multiplos comandos coincidirem.
geomview-1.9.5/doc/geomview-pt_BR.html/hmodel.html0000644000175000017500000000341412310162311016755 00000000000000 hmodel - Manual do Geomview

Next: , Previous: help, Up: GCL Reference


7.2.62 hmodel

(hmodel CAMID {virtual|projective|conformal})
Ajusta o modelo usado para mostrar o objeto geométrico nessa câmera. See (space ...).
geomview-1.9.5/doc/geomview-pt_BR.html/hsphere_002ddraw.html0000644000175000017500000000360612310162311020551 00000000000000 hsphere-draw - Manual do Geomview

Next: , Previous: hmodel, Up: GCL Reference


7.2.63 hsphere-draw

(hsphere-draw CAMID [yes|no])
Informa se é para desenhar ou não a esfera unitária: a esfera no infinito no espaço hiperbólico, e uma esfera de referência nos espaços Euclidiano esférico. Se o segundo argumento for omitido, yes é assumido.
geomview-1.9.5/doc/geomview-pt_BR.html/if.html0000644000175000017500000000360412310162311016104 00000000000000 if - Manual do Geomview

Next: , Previous: hsphere-draw, Up: GCL Reference


7.2.64 if

(if TEST EXPR1 [EXPR2])
Avalia TEST; se TEST retornar um valor não-nil (nota do tradutor:não nulo), retorna o valor de EXPR1. Se TEST retornar nil, retorna o value de EXPR2 se EXPR2 estiver presente, de outra forma retorna nil.
geomview-1.9.5/doc/geomview-pt_BR.html/inhibit_002dwarning.html0000644000175000017500000000370612310162311021252 00000000000000 inhibit-warning - Manual do Geomview

Next: , Previous: if, Up: GCL Reference


7.2.65 inhibit-warning

(inhibit-warning STRING)
Inibe alertas de inibição do geomview de mostrar uma mensagem de alerta determinada por STRING. Atualmente não existe mensgenns de alerta na qual o comando inhibit-warning seja aplicado, de forma que esse comando é pouco útil.
geomview-1.9.5/doc/geomview-pt_BR.html/input_002dtranslator.html0000644000175000017500000000463412310162311021510 00000000000000 input-translator - Manual do Geomview

Next: , Previous: inhibit-warning, Up: GCL Reference


7.2.66 input-translator

(input-translator "#prefix_string" "comando-shell")
Define um programa externo de tradução para tipos especiais de entrada. Quando perguntado se é para lê um arquivo especial que começa com a sequência de caracteres especificada, geomview chama comando-shell com entrada padrão obtida a partir do arquivo especificado. É esperado que comando-shell emita dados geométricos na linguagem OOGL para sua saída padrão. Nessa implementação, somente prefixos iniciando com # são reconhecidos. Muito útil em situações como
            (input-translator "#VRML" "vrml2oogl")
geomview-1.9.5/doc/geomview-pt_BR.html/interest.html0000644000175000017500000000662712310162311017353 00000000000000 interest - Manual do Geomview

Next: , Previous: input-translator, Up: GCL Reference


7.2.67 interest

(interest (COMANDO [args]))
Permite a você expressar interesse em um comando. Quando geomview vier a executar o comando de interesse futuramente o comando de interesse será ecoado para o sistema de comunicação do qual o comando interest for originário. COMANDO pode ser qualquer comando. Args especifica restrições sobre os valores dos argumentos; se args estiver presente no comando interest, geomview irá somente ecoar chamadas para o comando no qual os argumentos coincidirem com aquele fornecido no comando interest. Dois valores especiais de argumento podem aparecer na lista de argumentos. * que coincide com qualquer valor. nil que coincide com qualquer valor mas suprime o retorno daquele valor; seus valores são reportados como nil.

O propósito do comando interest é permitir a módulos externos encontrar coisas acontecendo dentro do geomview. Por exemplo, um módulo interessado em saber quando um geom chamado foo é apagado pode usar o comando interest da seguinte forma (interest (delete foo)) e iria receber a sequência de caracteres (delete foo) quando foo fosse apagado.

Destacando um caso especial do uso do comando interest. Para a maioria dos módulos interessados em selecionar eventos o comando (interest (pick world)) é suficiente. O comando (interest (pick world)) faz com que geomview envie uma sequência de caracteres da forma (pick world ...) toda vez que um evento de seleção (duplo clique botão direito do mounse). Veja o comando (pick ...) para detalhes.

geomview-1.9.5/doc/geomview-pt_BR.html/lambda.html0000644000175000017500000000567612310162311016741 00000000000000 lambda - Manual do Geomview

Next: , Previous: interest, Up: GCL Reference


7.2.68 lambda

(lambda (ARG1 ...) EXPR1 ... EXPRN)
Uma expressão lambda é como uma função. Para “chamar” uma expressão lambda, a expressão lambda tem de ser chamada como uma função: ((lambda (arg) (+ 1 arg)) 2). Nesse exemplo, o valor completo da expressão deve ser 3. Em geral, o valor da chamada irá ser o valor de EXPRN. A primeira lista serve para definir os parâmetros formais. A expressão lambda propriamente dita é apenas uma lista, iniciando-se com a palavra chava lambda, seguida por muitas listas entre aspas duplas. See (defun ...). See (setq ...). See (let ...). Note que a lista argumento pode conter as palavras chaves especiais
&optional
fornecimento de valores aos identificadores seguintes é opcional, seus valores padrão irão ser nil
&rest
todos os argumentos excedentes irão ser coletados em uma lista, e essa lista irá ser atribuída ao argumento seginte, da seguinte forma:
               ((lambda (&rest rest) (echo rest)) a b c d)

A saída irá ser (a b c d).

geomview-1.9.5/doc/geomview-pt_BR.html/let.html0000644000175000017500000000524212310162311016272 00000000000000 let - Manual do Geomview

Next: , Previous: lambda, Up: GCL Reference


7.2.69 let

(let ARGUMENTS EXPR1 ... EXPRN)
Gera uma expressão lambda a partir de EXRP1 ... EXPRN, com a associação de argumento descrita por ARGUMENTS. ARGUMENTS corresponde a uma lista de símbolos (associada a nil por padrão) ou a listas da forma (ARG VALUE) onde ARG é um símbolo e não avaliado e VALUE é uma expressão-S que é primeiramente avaliada, a seguir seu valor é associa a ARG. A expressão completa avalia para o valor de EXPRN, a última expressão no corpo da declaração. A lista de argumento deve ester presente, mas pode ser vazia; no último caso a declaração (let () ...) é equivalente a um (progn ...). See (lambda ...). See (defun ...). See (setq ...).
geomview-1.9.5/doc/geomview-pt_BR.html/lines_002dcloser.html0000644000175000017500000000453212310162311020556 00000000000000 lines-closer - Manual do Geomview

Next: , Previous: let, Up: GCL Reference


7.2.70 lines-closer

(lines-closer CAM-ID DIST)
Desenha linhas (incluindo arestas) próximo à câmera do polígonos a uma distância DIST / 10^5 do intervalo contido na área de armazenamento temporário de memória que controla as coordenadas do eixo Z. DIST = 3.0 por padrão. Se DIST for muito pequena, uma linha aproxumada sobre uma superfície pode ser pontilhada ou invisível, dependendo do ponto de vista. Se DIST for muito grande, linhas podem aparecer em frente das superfícies que elas atualmente aproximam por trás. Bons valores para DIST variam com a cena, ponto de visão, e distâncias entre planos de corte próximo e distante. Esse recurso é um remendo, mas pode ser de grande ajuda.
geomview-1.9.5/doc/geomview-pt_BR.html/load.html0000644000175000017500000000441512310162311016426 00000000000000 load - Manual do Geomview

Next: , Previous: lines-closer, Up: GCL Reference


7.2.71 load

(load filename [command|geometry|camera])
Chama o arquivo fornecido dentro do geomview. O segundo argumento opcional especifica o tipo de dado que o referido arquivo chamado contém, o qual pode ser ou command (comandos do geomview), geometry (dados geométrico no formato OOGL), ou camera (definição de câmera no formato OOGL). se omitido, é tentado deduzir o tipo de conteúdo do arquivo. Carregando dados geométricos cria um novo objeto visível; carregando uma câmera abre uma nova janela; chamado um arquivo contendo comando executa o referido comando.
geomview-1.9.5/doc/geomview-pt_BR.html/load_002dpath.html0000644000175000017500000000366612310162311020037 00000000000000 load-path - Manual do Geomview

Next: , Previous: load, Up: GCL Reference


7.2.72 load-path

(load-path)
Retorna o atual caminho de busca para arquivos contendo comandos, objetos geométricos, etc. Nota: para ver o atual valor retornado por essa função você deve empacotar esse comando em uma chamada a echo: (echo (load-path)). See (set-load-path ...).
geomview-1.9.5/doc/geomview-pt_BR.html/look.html0000644000175000017500000000473312310162311016456 00000000000000 look - Manual do Geomview

Next: , Previous: load-path, Up: GCL Reference


7.2.73 look

(look [objetoID] [cameraID])
Rotaciona a referida câmera - cameraID - de forma que aponte em direção ao centro da caixa associada ao referido objeto - objetoID (ou a origem nos espaços hiperbolico ou esférico). No espaço Eucidiano, move a câmera para além ou para trás até que o objeto apareça tão grande quanto possível enquanto sendo inteiramente visível. Equivalente a
          progn (
          	(look-toward [objetoID] [cameraID] {center | origin})
          	[(look-encompass [objetoID] [cameraID])]
          )

Se objetoID não for especificado, esse objeto á assumido como sendo o objeto mundo. Se cameraID não for especificado, essa câmera é assumido como sendo a targetcam.

geomview-1.9.5/doc/geomview-pt_BR.html/look_002dencompass.html0000644000175000017500000000433312310162311021110 00000000000000 look-encompass - Manual do Geomview

Next: , Previous: look, Up: GCL Reference


7.2.74 look-encompass

(look-encompass [objetoID] [cameraID])
Move cameraID para trás ou para adiante até que seu campo de visão alcance objetoID. Essa rotina trabalha somente no espaço Euclidiano. Se objetoID não for especificado, esse objeto á assumido como sendo o objeto mundo. Se cameraID não for especificado, essa câmera é assumido como sendo a targetcam. See (look-encompass-size ...).
geomview-1.9.5/doc/geomview-pt_BR.html/look_002dencompass_002dsize.html0000644000175000017500000000463312310162311022533 00000000000000 look-encompass-size - Manual do Geomview

Next: , Previous: look-encompass, Up: GCL Reference


7.2.75 look-encompass-size

(look-encompass-size [ver-fração razão-corte margem-proxima margem-distante])
Ajusta/retorna parâmetros usados por (look-encompass). ver-fração é a porção da janela de câmera preenchida pelo objeto, razão-corte é a razão máxima permitida entre os planos de corte próximo e afastado. O plano de corte próximo é 1/magem-proxima vezes mais perto que a aresta mais próxima do objeto, e o plano de corte distante é margem-distante vezes mais adiante. Retorna a lista dos valores atuais. Valores padronizados: .75 100 0.1 4.0
geomview-1.9.5/doc/geomview-pt_BR.html/look_002drecenter.html0000644000175000017500000000451512310162311020731 00000000000000 look-recenter - Manual do Geomview

Next: , Previous: look-encompass-size, Up: GCL Reference


7.2.76 look-recenter

(look-recenter [objetoID] [cameraID])
Translada e rotaciona a câmera de forma que essa câmera esteja olhando na direção-z (no sistema de coordenadas de objetoID) no centro da caixa associada a objetoID (ou a origem do sistema de coordenadas no espaço não Euclidiano). No espaço Euclidiano, a câmera é também movida para tão perto quanto possível do objeto de forma a permitir que o objeto seja inteiramente visível. Também garante que o eixos y do objetoID e de cameraID sejam paralelos.
geomview-1.9.5/doc/geomview-pt_BR.html/look_002dtoward.html0000644000175000017500000000431412310162311020417 00000000000000 look-toward - Manual do Geomview

Next: , Previous: look-recenter, Up: GCL Reference


7.2.77 look-toward

(look-toward [objetoID] [cameraID] [origin | center])
Rotaciona a câmera especificada de forma a apontar para adiante da orígem do sistema de coordenadas do objeto, ou do centro da caixa associada ao objeto (no espaço não Euclidiano, a orígem irá ser usada automaticamente). O objetoID padrão é o objeto mundo, a câmera padrão é targetcam, a localização padrão é para a qual é apontada a câmera é adiante do centro da caixa associada a objetoID.
geomview-1.9.5/doc/geomview-pt_BR.html/merge.html0000644000175000017500000000373212310162311016607 00000000000000 merge - Manual do Geomview

Next: , Previous: look-toward, Up: GCL Reference


7.2.78 merge

(merge {window|camera} CAM-ID { WINDOW ou CAMERA ... })
Modifica a janela ou a câmera fornecido, mudando apenas a propriedade especificada no último argumento. E.g.
          	(merge camera Camera { far 20 })

ajusta o plano de corte afastado para 20 permanecendo os outros atributos inalterados.

geomview-1.9.5/doc/geomview-pt_BR.html/merge_002dap.html0000644000175000017500000000364012310162311017653 00000000000000 merge-ap - Manual do Geomview

Next: , Previous: merge, Up: GCL Reference


7.2.79 merge-ap

(merge-ap GEOM-ID APARÊNCIA)
Mescla em algumas características de aparência para GEOM-ID. Parâmetros de aparência incluem cor de linha e de superfície, estilo de sombreamento, espeçura de linha, e iluminação.
geomview-1.9.5/doc/geomview-pt_BR.html/merge_002dbase_002dap.html0000644000175000017500000000355312310162311021236 00000000000000 merge-base-ap - Manual do Geomview

Next: , Previous: merge-ap, Up: GCL Reference


7.2.80 merge-base-ap

(merge-base-ap APARÊNCIA)
merge-base-ap é um sinônimo para merge-baseap.
geomview-1.9.5/doc/geomview-pt_BR.html/merge_002dbaseap.html0000644000175000017500000000370412310162311020507 00000000000000 merge-baseap - Manual do Geomview

Next: , Previous: merge-base-ap, Up: GCL Reference


7.2.81 merge-baseap

(merge-baseap APARÊNCIA)
Mescla em algumas características de aparência para a base padão de aparência (aplicada a todo geom antes de sua própria aparência). Iluminação está tipicamente incluída na base de aparência.
geomview-1.9.5/doc/geomview-pt_BR.html/mod.html0000644000175000017500000000325512310162311016267 00000000000000 mod - Manual do Geomview

Next: , Previous: merge-baseap, Up: GCL Reference


7.2.82 mod

(mod EXPR1 EXPR2)
Divide EXPR1 por EXPR2 e retorna o resto.
geomview-1.9.5/doc/geomview-pt_BR.html/morehelp.html0000644000175000017500000000340512310162311017320 00000000000000 morehelp - Manual do Geomview

Next: , Previous: mod, Up: GCL Reference


7.2.83 morehelp

(morehelp comando)
comando pode incluir coringas *. Mostra na tela mais informação que (help command).
geomview-1.9.5/doc/geomview-pt_BR.html/name_002dobject.html0000644000175000017500000000373412310162311020346 00000000000000 name-object - Manual do Geomview

Next: , Previous: morehelp, Up: GCL Reference


7.2.84 name-object

(name-object ID NOME)
Atribui um novo NOME (uma sequência de caracteres) a ID. Um número é adicionado no final se NOME já estiver sendo usado (por exemplo, foo -> foo<2>). O novo nome, possivelmente com número anexado no final, pode ser usado como id de objeto posteriormente.
geomview-1.9.5/doc/geomview-pt_BR.html/ND_002daxes.html0000644000175000017500000000645312310162311017422 00000000000000 ND-axes - Manual do Geomview

Next: , Previous: name-object, Up: GCL Reference


7.2.85 ND-axes

(ND-axes CAMID [NOMEGRUPO [Xindex Yindex Zindex [Windex]]])
No nosso modelo para visualização N-Dimensional (habilitado por (dimension)), objetos no espaço N-dimensional são visualizados por N-dimensional grupos de câmera. Cada janela real de câmera pertence a algum grupo de câmeras, e mostra & manipula um subspaço projetado eixo-alinhado 3-D do espaço N-dimensional visto pelo seu grupo. Movendo uma câmera em um grupo afeta todos os outros membros do grupo.

O comando ND-axes configura tudo isso. O comando ND-axes especifica uma associação de câmera a um grupo, e o ajuste dos eixos do espaço N-dimensional os quais tornam-se os eixos X, Y, e Z da câmera. Eixos são especificados por seus índices, de 1 a N para um espaço N-dimensional. O grupo NOMEGRUPO é implicitamente criado se não for previamente conhecido.

Em princípio é possível mapear a componente homogênea de uma conformação de 4 pontos para algum outro índice; isso poderia ser realizado especificando 0 para um dos Xindex, Yindex ou Zindex e fornecendo a Windex algum valor positivo. Isso provavelmente não é útil pelo fato de Geomview não suportar geometria não-Euclidianas para dimensões mais altas.

Para ler uma configuração de câmeras, use (echo (ND-axes CAMID)). O valor de retorno é uma vetor fixo de 4 inteiros, o último dos quais deve ser 0.

geomview-1.9.5/doc/geomview-pt_BR.html/ND_002dcolor.html0000644000175000017500000000615212310162311017574 00000000000000 ND-color - Manual do Geomview

Next: , Previous: ND-axes, Up: GCL Reference


7.2.86 ND-color

(ND-color CAMID
[ (( [ID] (x1 x2 ... xN) v r g b a v r g b a ... ) ((x1 ... xN) v r g b a v r g b a ...) ...)] ) Especifica uma função, aplicada a cada vértice N-dimencional, o qual determina as cores dos objetos N-dimensionais como mostrado na câmera CAMID. Cada função de cor é definida por um vetor (no sistema de coordenadas do objeto geométrico ID) [x1 ... xN] e por uma sequência de quíntuplas valor (v)/cor(r g b a), ordenados por ordem crescente de v. O produto interno v = P.[x] é linearmente interpolado nessa tabela para fornecer uma cor. Se ID for omitido, o vetor (xi) é assumido em coordenadas de universo. O comando ND-color especifica uma lista de tais funções; cada vértice é colorido por seu somatório (então e.g. intensidade verde pode indicar projeção ao longo de um eixoenquanto vermelho indica outro eixo. Uma lista vazia, como em (ND-color CAMID ()), suprime o colorido. Sem segundo argumento, (ND-color CAMID) retorna a lista de cor-função de coloração. Mesmo quando coloração está habilitada, objetos acompanhados com o atributo de aparência keepcolor são mostrados em suas cores naturais.
geomview-1.9.5/doc/geomview-pt_BR.html/ND_002dxform.html0000644000175000017500000000422412310162311017607 00000000000000 ND-xform - Manual do Geomview

Next: , Previous: ND-color, Up: GCL Reference


7.2.87 ND-xform

(ND-xform OBJID [ntransform { idim odim ... }])
Concatena a fornecida transformação-ND com a atual transformação-ND do objeto (aplica a transformação-ND para objeto ID, como oposiçaõ a simplesmente ajustar sua transformação-ND). Note que ND-transforms possuem suas coordenadas homogêneas iniciando-se no índice 0, enquanto transformações 3D possuem seu início no índice 3.
geomview-1.9.5/doc/geomview-pt_BR.html/ND_002dxform_002dget.html0000644000175000017500000000421512310162311021034 00000000000000 ND-xform-get - Manual do Geomview

Next: , Previous: ND-xform, Up: GCL Reference


7.2.88 ND-xform-get

(ND-xform-get ID [from-ID])
Retorna a transformação N-D do objeto fornecido no sistema de coordenadas do from-ID (o padrão é universe), no sentido <ponto-em-ID-coords> * Transform = <ponto-em-from-ID-coords>. Note que ND-transforms possuem suas coordenadas homogêneas iniciando-se no índice 0, enquanto transformações 3D possuem seu início no índice 3.
geomview-1.9.5/doc/geomview-pt_BR.html/ND_002dxform_002dset.html0000644000175000017500000000441712310162311021054 00000000000000 ND-xform-set - Manual do Geomview

Next: , Previous: ND-xform-get, Up: GCL Reference


7.2.89 ND-xform-set

(ND-xform-set OBJID [ntransform { idim odim ... }])
Ajusta a transformação N-D do objeto fornecido. Na dimensão N, a transformação é uma matriz (N+1)x(N+1), de forma que naquele caso idim e odim são esperados serem ambos iguais a (N+1). Note que todas as câmeras em um camera-grupo possuem a mesma transformação N-D. Note que ND-transforms possuem suas coordenadas homogêneas iniciando-se no índice 0, enquanto transformações 3D possuem seu início no índice 3.
geomview-1.9.5/doc/geomview-pt_BR.html/new_002dalien.html0000644000175000017500000000503412310162311020034 00000000000000 new-alien - Manual do Geomview

Next: , Previous: ND-xform-set, Up: GCL Reference


7.2.90 new-alien

(new-alien name [GEOMETRIA])
Cria um novo alien (objeto geométrico fora de "objeto mundo") com o nome fornecido (uma sequência de caracteres). GEOMETRIA é uma sequência de caracteres fornecendo um especificação de objeto geométrico OOGL. Se GEOMETRIA for omitido, o novo alien é fornecido como sendo um objeto geométrico vazio. Se um objeto como o nome fornecido já existir, ao novo alien é dado um novo nome. Os feixes luminosos que são usados para mover em volta das luzes são um exemplo de aliens. Eles são desenhados mas não controláveis pelo caminho normal que os objetos comuns são: eles não aparecem no navegador de objetos e o usuário não pode movê-lo com o modo de movimento normal.
geomview-1.9.5/doc/geomview-pt_BR.html/new_002dcamera.html0000644000175000017500000000373112310162311020176 00000000000000 new-camera - Manual do Geomview

Next: , Previous: new-alien, Up: GCL Reference


7.2.91 new-camera

(new-camera name [CAMERA])
Cria uma nova câmera com o nome fornecido (uma sequência de caracteres). Se uma câmera com o nome fornecido já existir, ao novo objeto é fornecido um nome único. Se CAMERA for omitido uma câmera padrão é usada.
geomview-1.9.5/doc/geomview-pt_BR.html/new_002dcenter.html0000644000175000017500000000414312310162311020224 00000000000000 new-center - Manual do Geomview

Next: , Previous: new-camera, Up: GCL Reference


7.2.92 new-center

(new-center [id])
Cessa o movimento de id, a seguir ajusta a transformação de id para a identidade. O id padrão é target. Também, se o id for uma câmera, chama (look-recenter World id). A função principal da chamada a (look-recenter) é colocar a câmera de forma que esteja apontando paralelamente ao eixo z na direção do centro do objeto mundo.
geomview-1.9.5/doc/geomview-pt_BR.html/new_002dgeometry.html0000644000175000017500000000421012310162311020572 00000000000000 new-geometry - Manual do Geomview

Next: , Previous: new-center, Up: GCL Reference


7.2.93 new-geometry

(new-geometry name [GEOMETRY])
Cria um novo geom com o nome fornecido (uma sequência de caracteres). GEOMETRY é uma sequência de caracteres fornecendo a especificação de um objeto geométrico OOGL. Se GEOMETRY for omitido, o novo objeto é fornecido como sendo um objeto geométrico vazio. Se um objeto com o nome fornecido já existir, ao novo objeto é fornecido um nome único.
geomview-1.9.5/doc/geomview-pt_BR.html/new_002dreset.html0000644000175000017500000000332712310162311020071 00000000000000 new-reset - Manual do Geomview

Next: , Previous: new-geometry, Up: GCL Reference


7.2.94 new-reset

(new-reset)
Equivalente a (progn (new-center ALLGEOMS)(new-center ALLCAMS)).
geomview-1.9.5/doc/geomview-pt_BR.html/NeXT.html0000644000175000017500000000345612310162311016331 00000000000000 NeXT - Manual do Geomview

Next: , Previous: new-reset, Up: GCL Reference


7.2.95 NeXT

(NeXT)
Retorna t se executando sobre um NeXT, nil se não estiver rodando sobre um NeXT. Uma relíquia de do ano da estação de trabalho NeXT.
geomview-1.9.5/doc/geomview-pt_BR.html/normalization.html0000644000175000017500000000576712310162311020410 00000000000000 normalization - Manual do Geomview

Next: , Previous: NeXT, Up: GCL Reference


7.2.96 normalization

(normalization GEOM-ID {each|none|all|keep})
Ajusta a situação atual da normalização de GEOM-ID.
none
suprime toda normalização.
each
normaliza a caixa associada ao objeto para ajustar-se dentro da esfera unitária, com o centro de sua caixa associada transladado para a orígem. A caixa é alterada proprocionalmente de forma que sua diagonal maior, sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), seja 2.
all
assemelha-se a each, exceto quando um objeto está mudando (e.g. quando seu objeto geométrico está sendo modificado por um programa externo). Então, each precisamente ajusta a caixa associada em torno do objeto quando esse objeto muda e faz as normalizações de acordo com as mudanças, enquanto all normaliza a união de todas as variantes do objeto e normaliza conforme essa união.
keep
mantém a transformação de normalização atual intocada quando o objeto muda. Essa intocabilidade pode ser útil para aplicar a normalização each ou all à primeira versão de um ojeto que está mudando de forma a trazer esse objeto para o campo de visão, a seguir alternar para keep.
geomview-1.9.5/doc/geomview-pt_BR.html/not.html0000644000175000017500000000345212310162311016307 00000000000000 not - Manual do Geomview

Next: , Previous: normalization, Up: GCL Reference


7.2.97 not

(not EXPR)
Avalia EXPR; se EXPR retornar um valor não-nil, o valor de retorno do comando é nil, se EXPR retornar nil, o valor de retorno do comando é t.
geomview-1.9.5/doc/geomview-pt_BR.html/or.html0000644000175000017500000000346312310162311016131 00000000000000 or - Manual do Geomview

Next: , Previous: not, Up: GCL Reference


7.2.98 or

(or EXPR1 EXPR2)
Avalia EXPR1; se EXPR1 retorna não-nil, o valor de retorno do comando é o valor de EXPR1, se EXPR1 retornar nil, a EXPR2 é avaliada e o valor de EXPR2 é retornado.
geomview-1.9.5/doc/geomview-pt_BR.html/pick.html0000644000175000017500000000722012310162311016432 00000000000000 pick - Manual do Geomview

Next: , Previous: or, Up: GCL Reference


7.2.99 pick

(pick COORDSYS GEOMID G V E F P VI EI FI)
O comando pick é executado internamente em resposta a eventos de seleção (clique duplo no botão direito do mouse).
COORDSYS
= sistema de coordenadas no qual as coordenadas dos seguintes argumentos são especificados. Esse sistema de coordenadas pode ser:
world
sistema de coordenadas do objeto mundo
self
sistema de coordenadas do geom (GEOMID) selecionado
primitive
sistema de coordenadas do primitivo atual dentro do geom selecionado onde a seleção ocorreu.

GEOMID
= id do geom selecionado
G
= ponto selecionado (intersecção atual do raio selecionado com o objeto)
V
= vértice selecionado, se houver algum
E
= aresta selecionada, se houver alguma
F
= face selecionada
P
= camainho para o primitivo selecionado [0 ou mais]
VI
= índice do vértice selecionado no primitivo
EI
= lista de índices de extremidades da aresta selecionada, se houver alguma
FI
= índice da face selecionada

Módulos externos podem receber informações de eventos de seleção por meio do registro do interesse em chamadas a pick por meio do comando interest.

No contexto de visualizações de várias dimensões as coordenadas são atualmente pontos de várias dimensões. Eles correspondem a pontos tridimencionais da seleção relativa ao subespaço definido pela janela de visualização da câmera onde a seleção ocorreu. As coordenadas são então preenchidas com zeros e transformadas de volta para o sistema de coordenadas definido por COORDSYS.

geomview-1.9.5/doc/geomview-pt_BR.html/pick_002dinvisible.html0000644000175000017500000000355012310162311021066 00000000000000 pick-invisible - Manual do Geomview

Next: , Previous: pick, Up: GCL Reference


7.2.100 pick-invisible

(pick-invisible [yes|no])
Escolhe se seleções devem ser sensíveis a objetos cuja aparência faz com que fiquem invisíveis; o padrão é yes. Sem argumentos, retorna a situação/valor atual.
geomview-1.9.5/doc/geomview-pt_BR.html/pickable.html0000644000175000017500000000344012310162311017256 00000000000000 pickable - Manual do Geomview

Next: , Previous: pick-invisible, Up: GCL Reference


7.2.101 pickable

(pickable GEOM-ID {yes|no})
Informa se GEOM-ID está incluído ou não no conjunto de objetos que podem ser retornados a partir do comando pick.
geomview-1.9.5/doc/geomview-pt_BR.html/position.html0000644000175000017500000000332012310162311017345 00000000000000 position - Manual do Geomview

Next: , Previous: pickable, Up: GCL Reference


7.2.102 position

(position objetoID outroID)
Ajusta a transformação de objetoID para aquele de outroID.
geomview-1.9.5/doc/geomview-pt_BR.html/position_002dat.html0000644000175000017500000000366312310162311020431 00000000000000 position-at - Manual do Geomview

Next: , Previous: position, Up: GCL Reference


7.2.103 position-at

(position-at objetoID outroID [center | origin])
Faz a translação de objetoID para o centro da caixa associada ou para a orígem do sistema de coordenadas de outroID (translação paralela). O padrão é center.
geomview-1.9.5/doc/geomview-pt_BR.html/position_002dtoward.html0000644000175000017500000000400312310162311021312 00000000000000 position-toward - Manual do Geomview

Next: , Previous: position-at, Up: GCL Reference


7.2.104 position-toward

(position-toward objetoID outroID [center | origin])
Rotaciona objetoID de forma que o centro da caixa associada ou a orígem do sistema de coordenadas do outroID localize-se sobre a parte positiva do eixo z do primeiro objeto. O padrão é o centro da caixa associada.
geomview-1.9.5/doc/geomview-pt_BR.html/process_002devents.html0000644000175000017500000000433112310162311021134 00000000000000 process-events - Manual do Geomview

Next: , Previous: position-toward, Up: GCL Reference


7.2.105 process-events

(process-events)
Devolve o controle ao laço do evento do Geomview, então continua avaliando o comando do script atual. Se o fluxo atual de entrada tiver sido colocado para cochilar por um dos comandos (sleep-...), então o controle permanece no laço principal até que a “cochilada” do fluxo de entrada atual tenha terminado. See (sleep-until ...). See (sleep-for ...).
geomview-1.9.5/doc/geomview-pt_BR.html/progn.html0000644000175000017500000000347312310162311016637 00000000000000 progn - Manual do Geomview

Next: , Previous: process-events, Up: GCL Reference


7.2.106 progn

(progn DECLARAÇÃO [ ... ])
evaluates each DECLARAÇÃO in order and retorna o value do last one. Use progn to group a collection of commands together, forcing them to be treated as a single command.
geomview-1.9.5/doc/geomview-pt_BR.html/quit.html0000644000175000017500000000315712310162311016473 00000000000000 quit - Manual do Geomview

Next: , Previous: progn, Up: GCL Reference


7.2.107 quit

(quit)
quit is a synonym for exit.
geomview-1.9.5/doc/geomview-pt_BR.html/quote.html0000644000175000017500000000345012310162311016642 00000000000000 quote - Manual do Geomview

Next: , Previous: quit, Up: GCL Reference


7.2.108 quote

(quote EXPR)
retorna uma expressão simbólica em lisp EXPR sem avaliá-la. Note, todavia, que quote analisa EXPR como se ela pudesse ser avaliada. See (eval ...).
geomview-1.9.5/doc/geomview-pt_BR.html/rawevent.html0000644000175000017500000000353512310162311017344 00000000000000 rawevent - Manual do Geomview

Next: , Previous: quote, Up: GCL Reference


7.2.109 rawevent

(rawevent dev val x y t)
Coloca o evento de linha especificado em uma fila de eventos. Os argumento especificam diretamente os membros da estrutura do evento usada internamente pelo geomview. Esse é o manipulador de evento de mais baixo nível e não foi pensado para uso geral.
geomview-1.9.5/doc/geomview-pt_BR.html/rawpick.html0000644000175000017500000000333212310162311017144 00000000000000 rawpick - Manual do Geomview

Next: , Previous: rawevent, Up: GCL Reference


7.2.110 rawpick

(rawpick CAMID X Y)
Process a pick event in camera CAMID at location (X,Y) given in integer pixel coordenadas. This is a low-level procedure not intended for external use.
geomview-1.9.5/doc/geomview-pt_BR.html/read.html0000644000175000017500000000446112310162311016423 00000000000000 read - Manual do Geomview

Next: , Previous: rawpick, Up: GCL Reference


7.2.111 read

(read {geometry|camera|aparência|image|ntransform|transform|command} {GEOMETRY ou CAMERA ou ...})
Lê e interpreta o texto em ... como contendo o tipo de dado fornecido. Útil para definir objetos usando a sintaxe de referência OOGL, e.g.
          (geometry  thing { INST  transform : T    geom : fred })
          (read  geometry  { define fred
             QUAD
             1 0 0  0 1 0  0 0 1  1 0 0
          })
          (read  transform { define T <myfile})

See Referencias. See (hdefine ...). See (hdelete ...).

geomview-1.9.5/doc/geomview-pt_BR.html/real_002did.html0000644000175000017500000000377312310162311017502 00000000000000 real-id - Manual do Geomview

Next: , Previous: read, Up: GCL Reference


7.2.112 real-id

(real-id ID)
Retorna uma sequência de caracteres canonicamente identificando o ID fornecido, ou nil se o objeto não existe. Exemplos: (if (real-id fred) (delete fred)) apaga fred se esse arquivo existir mas retorna sem erro se esse arquivo não existir, e (if (= (real-id targetgeom) (real-id World)) () (delete targetgeom)) apaga targetgeom se esse arquivo for diferente do World.
geomview-1.9.5/doc/geomview-pt_BR.html/redraw.html0000644000175000017500000000341012310162311016765 00000000000000 redraw - Manual do Geomview

Next: , Previous: real-id, Up: GCL Reference


7.2.113 redraw

(redraw CAM-ID)
Declara que o visual em CAM-ID deve ser redesenhado na próxima passagem através do ciclo principal ou da próxima vez que draw for chamada.
geomview-1.9.5/doc/geomview-pt_BR.html/regtable.html0000644000175000017500000000330212310162311017266 00000000000000 regtable - Manual do Geomview

Next: , Previous: redraw, Up: GCL Reference


7.2.114 regtable

(regtable)
shows the registry table
geomview-1.9.5/doc/geomview-pt_BR.html/rehash_002demodule_002dpath.html0000644000175000017500000000461412310162311022464 00000000000000 rehash-emodule-path - Manual do Geomview

Next: , Previous: regtable, Up: GCL Reference


7.2.115 rehash-emodule-path

(rehash-emodule-path)
Reconstrói o navegador de (módulo externo) aplicação através da leitura de todos os arquivos .geomview-* em todos os diretórios retornados pelo comando emodule-path. Primariamente pensado para uso interno; quaisquer aplicações definidas por comandos (emodule-define ...) fora dos arquivos .geomview-* sobre o comando emodule-path irão ser perdidos. Não ordena as entradas no navegador. See (emodule-sort). See (emodule-define ...).
geomview-1.9.5/doc/geomview-pt_BR.html/replace_002dgeometry.html0000644000175000017500000000360212310162311021420 00000000000000 replace-geometry - Manual do Geomview

Next: , Previous: rehash-emodule-path, Up: GCL Reference


7.2.116 replace-geometry

(replace-geometry GEOM-ID PART-SPECIFICATION GEOMETRY)
Substitui uma parte do geométrico for GEOM-ID.
geomview-1.9.5/doc/geomview-pt_BR.html/rib_002ddisplay.html0000644000175000017500000000466312310162311020403 00000000000000 rib-display - Manual do Geomview

Next: , Previous: replace-geometry, Up: GCL Reference


7.2.117 rib-display

(rib-display [frame|tiff] FILEPREFIX)
Ajusta o display Renderman para framebuffer (janela que surge na tela) ou para um arquivo de disco no formato TIFF. FILEPREFIX é usado para construir nomes da forma prefixNNNN.suffix. (i.e. foo0000.rib) O número é incrementado a cada chamada a rib-snapshot e retorna a 0000 quando rib-display é chamado. Arquivos TIFF são fornecidos com o mesmo prefixo e número que o arquivo RIB correspondente (i.e. foo0004.rib gera foo0004.tiff). O padrão FILEPREFIX é geom e o formato padrão é TIFF. (Note que geomview apenas gera um arquivo RIB, o qual deve ser processado.)
geomview-1.9.5/doc/geomview-pt_BR.html/rib_002dsnapshot.html0000644000175000017500000000372112310162311020567 00000000000000 rib-snapshot - Manual do Geomview

Next: , Previous: rib-display, Up: GCL Reference


7.2.118 rib-snapshot

(rib-snapshot CAM-ID [nomearquivo])
Escreve um instantâneo Renderman (no formato RIB) de CAM-ID gavando em <nomearquivo>. Se não for especificado um nomearquivo, veja (rib-display ... para uma explanação do nomearquivo usado.
geomview-1.9.5/doc/geomview-pt_BR.html/scale.html0000644000175000017500000000472012310162311016575 00000000000000 scale - Manual do Geomview

Next: , Previous: rib-snapshot, Up: GCL Reference


7.2.119 scale

(scale GEOM-ID FATOR [FATORY FATORZ])
Ajusta proporcionalmente GEOM-ID, multiplicando seu tamanho por FATOR. Os fatores devem ser números positivos. Se FATORY e FATORZ estiverem presentes e forem não nulos, o objeto é ajustado proporcionalmente por FATOR na direção x, por FATORY na direção y, e por FATORZ na direção z. Se somente FATOR estiver presente, o objeto é justado proporcionalmente por FACTOR nas três direções x, y, e z. Ajustes proporcionais somente fazem sentido realmente no espaço de Euclides. Ajustes proporcionais usando o mouse nos outros espaço não é permitido; o comando scale pode ser emitido em outros espaços mas deve ser usado com cuidado pelo fato de poder fazer com que dados extendam-se para além dos limites do espaço.
geomview-1.9.5/doc/geomview-pt_BR.html/scene.html0000644000175000017500000000322412310162311016601 00000000000000 scene - Manual do Geomview

Next: , Previous: scale, Up: GCL Reference


7.2.120 scene

(scene CAM-ID [GEOMETRY])
Make CAM-ID look at GEOMETRY instead of at the universe.
geomview-1.9.5/doc/geomview-pt_BR.html/set_002dclock.html0000644000175000017500000000377012310162311020046 00000000000000 set-clock - Manual do Geomview

Next: , Previous: scene, Up: GCL Reference


7.2.121 set-clock

(set-clock TIME)
Ajusta o relógio para esse fluxo de comando para ler TIME (em segundos) a partir do momento que o comando é recebido. See (sleep-until ...). See (clock ...).
geomview-1.9.5/doc/geomview-pt_BR.html/set_002dconformal_002drefine.html0000644000175000017500000000461012310162311022643 00000000000000 set-conformal-refine - Manual do Geomview

Next: , Previous: set-clock, Up: GCL Reference


7.2.122 set-conformal-refine

(set-conformal-refine CMX [N [SHOWEDGES]])
Ajusta os parâmetros para o algorítmos de refinamento usado no desenho no modelo conformacional. CMX é o cosseno do maior ângulo e arestas podem entortar antes de serem refinadas. Seus valores devem estar entre -1 e 1; o padrão é 0.95; deminuindo seu valor irá fazer causar menos refinamento. N é o númeo máximo de iterações de refinamento; o padrão é 6. SHOWEDGES, que pode ser no ou yes, determina se arestas interiores no refinamento são desenhadas.
geomview-1.9.5/doc/geomview-pt_BR.html/set_002demodule_002dpath.html0000644000175000017500000000501312310162311021777 00000000000000 set-emodule-path - Manual do Geomview

7.2.123 set-emodule-path

(set-emodule-path (PATH1 ... PATHN))
Ajusta o caminho de busca por módulos externos. Os PATHi devem ser nomes de caminho de diretórios contendo, para cada módulo, o arquivo executável do módulo e um arquivo .geomview-<modulename> que contém um comando (emodule-define ...) para aquele módulo. Esse comando implicitamente chama (rehash-emodule-path) para reconstruir o navegador de aplicações a partir do novo caminho ajustado. O nome especial de diretório + é substituído pelo caminho atual, então e.g. (set-emodule-path (meudir +)) anexa meudir no início do caminho.
geomview-1.9.5/doc/geomview-pt_BR.html/set_002dload_002dpath.html0000644000175000017500000000427412310162311021274 00000000000000 set-load-path - Manual do Geomview

7.2.124 set-load-path

(set-load-path (PATH1 ... PATHN))
Ajusta o caminho de busca para comando, objeto geométrico, arquivos, etc. Os PATHi são sequências de caracteres fornecendo os nomesmde caminho de diretórios a serem buscados. O nome especial de diretórios + é substituído pelo caminho atual, então e.g. (set-load-path (meudir +)) anexa meudir no início do caminho.
geomview-1.9.5/doc/geomview-pt_BR.html/set_002dmotionscale.html0000644000175000017500000000440112310162311021260 00000000000000 set-motionscale - Manual do Geomview

Next: , Previous: set-load-path, Up: GCL Reference


7.2.125 set-motionscale

(set-motionscale X)
Ajusta o fator de proporcionalidade do movimento para X (o valor padrão é 0.5). Esses comandos ajustam proporcionalmente seu movimento por uma quantidade que depende da distância do quadro ao centro e do tamanho do quadro. Especificamente, ele ajusta de forma proporcional dist + scaleof(frame) * motionscale onde dist é a ditância a partir do centro ao quadro e motionscale é o fator de ajuste proporcional do movimento ajustado por essa função. Scaleof(frame) mede o tamanho do objeto frame.
geomview-1.9.5/doc/geomview-pt_BR.html/setenv.html0000644000175000017500000000355512310162311017017 00000000000000 setenv - Manual do Geomview

Next: , Previous: set-motionscale, Up: GCL Reference


7.2.126 setenv

(setenv nome string)
ajusta a variável de ambiente nome para o valor string; o nome é visível para o geomview (como em nomes de caminho contendo $nome) e para processos cria-se, e.g. módulos externos.
geomview-1.9.5/doc/geomview-pt_BR.html/setq.html0000644000175000017500000000512512310162311016462 00000000000000 setq - Manual do Geomview

Next: , Previous: setenv, Up: GCL Reference


7.2.127 setq

(setq SYM EXPR)
Bind the symbold SYM to the value of EXPR. SYM must be an unqualified symbol, i.e. not aspas duplas, and literal: (setq "foo" bar) will not work. Likewise (setq (bar STUFF) foo) will also not work, even if (bar ...) would evaluate to an unqualified symbol: varible names must be literals. Note that calling (setq SYM ...) will alter the value of SYM within the current name-space: if SYM, e.g., is bound as local variable by a lambda, let ou defun expression, then (setq SYM ...) will change the value of the local variable, the global binding will remain unchanged. It is NOT possible to un-bind a symbol. However, subsequent (setq SYM ...) invocations will re-bind SYM to another value and free the lisp-object previously bound to SYM. See (lambda ...). See (defun ...). See (let ...).
geomview-1.9.5/doc/geomview-pt_BR.html/sgi.html0000644000175000017500000000321112310162311016262 00000000000000 sgi - Manual do Geomview

Next: , Previous: setq, Up: GCL Reference


7.2.128 sgi

(sgi)
Returns t if running on an sgi machine, nil if not. A relict from the old work-station years.
geomview-1.9.5/doc/geomview-pt_BR.html/shell.html0000644000175000017500000000343712310162311016621 00000000000000 shell - Manual do Geomview

Next: , Previous: sgi, Up: GCL Reference


7.2.129 shell

(shell SHELL-COMMAND)
Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview waits for it to complete and will be unresponsive until it does. A synonym is !.
geomview-1.9.5/doc/geomview-pt_BR.html/sleep_002dfor.html0000644000175000017500000000353612310162311020056 00000000000000 sleep-for - Manual do Geomview

Next: , Previous: shell, Up: GCL Reference


7.2.130 sleep-for

(sleep-for TIME)
Suspend reading commands from this stream for TIME seconds. Commands already read will still be executed; sleep-for inside progn won't delay execution do rest do progn's contents.
geomview-1.9.5/doc/geomview-pt_BR.html/sleep_002duntil.html0000644000175000017500000000415612310162311020422 00000000000000 sleep-until - Manual do Geomview

Next: , Previous: sleep-for, Up: GCL Reference


7.2.131 sleep-until

(sleep-until TIME)
Suspend reading commands from this stream until TIME (in seconds). Commands already read will still be executed; sleep-until inside progn won't delay execution do rest do progn's contents. Time is measured according to this stream's clock, as set by set-clock; if never set, the first sleep-until sets it to 0 (so initially (sleep-until TIME) is the same as (sleep-for TIME)). Returns the number of seconds until TIME.
geomview-1.9.5/doc/geomview-pt_BR.html/snapshot.html0000644000175000017500000000627712310162311017356 00000000000000 snapshot - Manual do Geomview

Next: , Previous: sleep-until, Up: GCL Reference


7.2.132 snapshot

(snapshot CAM-ID NOMEDOARQUIVO [FORMAT [XSIZE [YSIZE]]])
Save a snapshot of CAM-ID in the NOMEDOARQUIVO (a sequência de caracteres). The FORMAT argumento is optional; it may be "ppmscreen" (the default), "ps", "ppm", "sgi" (on SGI machines), "ppmosmesa" (if built with libOSMesa) ou "ppmosglx". A "ppmscreen" snapshot is created by reading the image directly from the given janela; the janela is popped above other janelas and redrawn first, then its contents are written as a PPM format image. A "ppmosmesa" snapshot is drawn by Mesa's software renderer into a memory buffer in RAM. A "ppmosglx" snapshot is rendered into a GLX Pixmap buffer, which is also off-screen but may ou may not reside in video RAM. Rendering may ou may not be accelerated. The problem with on-screen snapshots is that the janela must be mapped and not obscured by other janelas. So on-screen snapshots will not work in the background, ou when a screen safer is active. With "ps", dumps a Postscript picture representing the view from that janela; hidden-surface removal might be incorrect. With "ppm", dumps a PPM-format image produced by geomview's internal software renderer; this may be of arbitrary size. If the NOMEDOARQUIVO argumento begins with "|", it's interpreted as a /bin/sh command to which the PPM ou PS data should be piped. Optional XSIZE and YSIZE values are relevant only for "ppm" formats, and render to a janela of that size (or scaled to that size, with aspect fixed, if only XSIZE is given)
geomview-1.9.5/doc/geomview-pt_BR.html/soft_002dshader.html0000644000175000017500000000331112310162311020370 00000000000000 soft-shader - Manual do Geomview

Next: , Previous: snapshot, Up: GCL Reference


7.2.133 soft-shader

(soft-shader CAM-ID {on|off|toggle})
Select se to use software ou hardware shading in that camera.
geomview-1.9.5/doc/geomview-pt_BR.html/space.html0000644000175000017500000000326712310162311016606 00000000000000 space - Manual do Geomview

Next: , Previous: soft-shader, Up: GCL Reference


7.2.134 space

(space {euclidean|hyperbolic|spherical})
Set the space associated with the world.
geomview-1.9.5/doc/geomview-pt_BR.html/stereowin.html0000644000175000017500000000466512310162311017535 00000000000000 stereowin - Manual do Geomview

Next: , Previous: space, Up: GCL Reference


7.2.135 stereowin

(stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize])
Configure CAM-ID as a stereo janela. no: entire janela is a single pane, stereo disabled
horizontal: split left/right: left is stereo eye#0, right is #1.
vertical: split top/bottom: bottom is eye#0, top is #1.
colored: panes overlap, red is stereo eye#0, cyan is #1.

A gap of gapsize pixels is left between subjanelas; se omitido, subjanelas are adjacent. If both layout and gapsize are omitido, e.g. (stereowin CAM-ID), returns current settings as a (stereowin ...) command list. This command doesn't set stereo projection; use merge camera or camera to set the stereyes transforms, and merge window or window to set the pixel aspect ratio & janela position if needed.

geomview-1.9.5/doc/geomview-pt_BR.html/time_002dinterests.html0000644000175000017500000000466012310162311021135 00000000000000 time-interests - Manual do Geomview

Next: , Previous: stereowin, Up: GCL Reference


7.2.136 time-interests

(time-interests deltatime initial prefix [suffix])
Indicates that all interest-related messages, when separated by at least deltatime seconds of real time, should be preceded by the sequência de caracteres prefix and followed by suffix; the first message is preceded by initial. All three are printf format strings, whose argumento is the current clock time (in seconds) on that stream. A deltatime of zero timestamps every message. Typical usage:
(time-interests .1 (set-clock %g) (sleep-until %g)) or
(time-interests .1 (set-clock %g) "(sleep-until %g) (progn (set-clock %g)" ")") or
(time-interests .1 "(set-clock %g)" "(if (> 0 (sleep-until %g)) (" "))".
geomview-1.9.5/doc/geomview-pt_BR.html/transform.html0000644000175000017500000000663412310162311017527 00000000000000 transform - Manual do Geomview

Next: , Previous: time-interests, Up: GCL Reference


7.2.137 transform

(transform objetoID centerID frameID [rotate|translate|translate-scaled|scale] x y z [bbox-center|origin] [dt [smooth]])
Apply a motion (rotation, translation, scaling) to object objetoID; that is, construct and concatenate a transformation matrix with objetoID's transform The 3 IDs involved are the object that moves, the center of motion, and the frame of reference in which to apply the motion. The center is easiest understood for rotations: if centerID is the same as objetoID then it will spin around its own axes; otherwise the moving object will orbit the center object. There is the special keyword bbox-center which may be used for centerID. As a result the motion will be relative to the center of the bounding box of objetoID. Normally frameID, in whose coordinate system the (mouse) motions are interpreted, is focus, the current camera. Translations can be scaled proportional to the distance between the target and the center. Support for spherical and hyperbolic as well as Euclidean space is built-in: use the space command to change spaces. With type rotate x, y, and z are floats specifying angles in RADIANS. For types translate and translate-scaled x, y, and z are floats specifying distances in the coordinate system of the center object.

The optional dt field allows a simple form of animation; if present, the objeto moves by just that amount during approximately dt seconds, then stops. If present and followed by the smooth keyword, the movimento is animated with a 3t^2-2t^3 function, so as to start and stop smoothly. If absent, the movimento is applied immediately.

geomview-1.9.5/doc/geomview-pt_BR.html/transform_002dincr.html0000644000175000017500000000453412310162311021125 00000000000000 transform-incr - Manual do Geomview

Next: , Previous: transform, Up: GCL Reference


7.2.138 transform-incr

(transform-incr objetoID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center] [dt [smooth]])
Apply continuing movimento: construct a matriz de transformação and concatenate it with the current transform of objetoID every refresh (sets objetoID's incremental transform). Same syntax as transform. If optional dt argumento is present, the objeto is moved at each time step such that its average movimento equals one instance do movimento per dt seconds. E.g. (transform-incr World World World rotate 6.28318 0 0 10.0) rotates the World about its X axis at 1 turn (2pi radians) per 10 seconds.
geomview-1.9.5/doc/geomview-pt_BR.html/transform_002dset.html0000644000175000017500000000356712310162311020772 00000000000000 transform-set - Manual do Geomview

Next: , Previous: transform-incr, Up: GCL Reference


7.2.139 transform-set

(transform-set objetoID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center])
Set objetoID's transform to the constructed transform. Same syntax as transform.
geomview-1.9.5/doc/geomview-pt_BR.html/truncate.html0000644000175000017500000000334412310162311017334 00000000000000 truncate - Manual do Geomview

Next: , Previous: transform-set, Up: GCL Reference


7.2.140 truncate

(truncate EXPR)
Rounds EXPR towards zero.
geomview-1.9.5/doc/geomview-pt_BR.html/ui_002dcam_002dfocus.html0000644000175000017500000000530712310162311021120 00000000000000 ui-cam-focus - Manual do Geomview

Next: , Previous: truncate, Up: GCL Reference


7.2.141 ui-cam-focus

(ui-cam-focus [focus-change|mouse-cross])
Set the focus policy for the janelas de câmera. The default is mouse-cross: a câmera is made the active câmera (for interactive mouse events) when o cursor do mouse crosses the janela. Because this means it can become complicated to activate a specific câmera (in the context of multiple janelas de câmera) there is also the option to only change the câmera focus when the janela-manager decides to give it the focus for input events. So, after specifying focus-change it depends on the focus-change configuration of your janela-manager when a câmera becomes the active câmera for mouse-interaction. To change this behaviour permanently you could, e.g., place the following line in your ${HOME}/.geomview file (Veja Customizacao):
          (progn
            (ui-cam-focus focus-change)
            ... # other stuff
          )
geomview-1.9.5/doc/geomview-pt_BR.html/ui_002dcenter.html0000644000175000017500000000353012310162311020047 00000000000000 ui-center - Manual do Geomview

Next: , Previous: ui-cam-focus, Up: GCL Reference


7.2.142 ui-center

(ui-center ID)
Set the center for user interface (i.e. mouse) controlled movimentos to objeto ID.
geomview-1.9.5/doc/geomview-pt_BR.html/ui_002dcenter_002dorigin.html0000644000175000017500000000466712310162311022020 00000000000000 ui-center-origin - Manual do Geomview

Next: , Previous: ui-center, Up: GCL Reference


7.2.143 ui-center-origin

(ui-center-origin [origin|bbox-center])
Set the origin do coordinate system do CENTER objeto for user interface (i.e. mouse) controlled movimentos. The keyword origin means to use the origin do coordinate system do currently selected objeto, while bbox-center means to use the center da bounding box do current objeto. The keyword bbox-center makes no sense if the objeto geométrico is non-Euclidean. Using either bbox-center ou origin does not make a difference if the objeto do centro is not a geometry, e.g. if it is a camera. Same holds if the World is the currently selected objeto.
geomview-1.9.5/doc/geomview-pt_BR.html/ui_002demotion_002dprogram.html0000644000175000017500000000375512310162311022367 00000000000000 ui-emotion-program - Manual do Geomview

Next: , Previous: ui-center-origin, Up: GCL Reference


7.2.144 ui-emotion-program

(ui-emotion-program PROGRAM)
This é uma obsolete command. Use its new eqivalent emodule-define instead.
geomview-1.9.5/doc/geomview-pt_BR.html/ui_002demotion_002drun.html0000644000175000017500000000366012310162311021517 00000000000000 ui-emotion-run - Manual do Geomview

Next: , Previous: ui-emotion-program, Up: GCL Reference


7.2.145 ui-emotion-run

(ui-emotion-run EMODULE)
This é uma obsolete command. Use its new eqivalent emodule_start instead.
geomview-1.9.5/doc/geomview-pt_BR.html/ui_002dfreeze.html0000644000175000017500000000351012310162311020045 00000000000000 ui-freeze - Manual do Geomview

Next: , Previous: ui-emotion-run, Up: GCL Reference


7.2.146 ui-freeze

(ui-freeze {on|off})
Toggle updating user interface panels. Off by default.
geomview-1.9.5/doc/geomview-pt_BR.html/ui_002dhtml_002dbrowser.html0000644000175000017500000000430712310162311021667 00000000000000 ui-html-browser - Manual do Geomview

Next: , Previous: ui-freeze, Up: GCL Reference


7.2.147 ui-html-browser

(ui-html-browser BROWSER)
Use BROWSER for viewing the HTML-version do manual when the ‘Manual (HTML)’ menu item is selected in the ‘Help’-menu. If the (ui-html-browser ...) command was never executed, then the default is to use the browser stored in the WEBBROWSER environment variable. If the environment variable is unset then the default is compile-time dependent.
geomview-1.9.5/doc/geomview-pt_BR.html/ui_002dmotion.html0000644000175000017500000000654512310162311020105 00000000000000 ui-motion - Manual do Geomview

Next: , Previous: ui-html-browser, Up: GCL Reference


7.2.148 ui-motion

(ui-motion {inertia|constrain|own-coordinates} {on|off})
Enable ou disable certain properties of mouse-controlled movimento. The purpose of this command is to give access to the respective toggles of the Main panel's Motion menu through GCL commands. See Movimentos do Mouse.
inertia
Normally, moving objetos have inertia: if o mouse is still moving when the botão is released, the selected objeto continues to move. When inertia is off, objetos cease to move as soon as you release the mouse.
constrain
It's sometimes handy to move an objeto in a direction aligned with a coordinate axis: exactly horizontally ou vertically. Calling (ui-motion constrain on) changes the interpretation of mouse movimentos to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical movimento. Note that the movimento is still along the X ou Y axes of the câmera in which you move o mouse, not necessarily the objeto's own coordinate system.
own-coordinates
It's sometimes handy to move objetos with respect to the coordinate system where they were defined, rather than with respect to some camera's view. When (ui-motion own-coordinates on) has been called, all movimentos are interpreted that way: dragging o mouse rightward in translate mode moves the objeto in its own +X direction, and so on. May be especially useful in conjunction with the (ui-motion constrain on) command.
geomview-1.9.5/doc/geomview-pt_BR.html/ui_002dpanel.html0000644000175000017500000000522512310162311017671 00000000000000 ui-panel - Manual do Geomview

Next: , Previous: ui-motion, Up: GCL Reference


7.2.149 ui-panel

(ui-panel PANELNAME {on|off} [WINDOW])
Do ou don't display the given user-interface panel. Case is ignored in panel names. Current PANELNAMEs are:
geomview
main panel
tools
movimento controls
appearance
controles de aparência
cameras
câmera controls
lighting
lighting controls
obscure
obscure controls (doesn't seem to exist any more)
materials
material properties controls
command
command entry box
credits
geomview credits
By default, the geomview and tools panels appear when geomview starts. If the optional Window is supplied, a position clause (e.g. (ui-panel obscure on { position xmin xmax ymin ymax }) sets the panel's default position. (Only xmin and ymin values are actually used.) A present but empty Window, e.g. (ui-panel obscure on {)} causes interactive positioning.
geomview-1.9.5/doc/geomview-pt_BR.html/ui_002dpdf_002dviewer.html0000644000175000017500000000427512310162311021316 00000000000000 ui-pdf-viewer - Manual do Geomview

Next: , Previous: ui-panel, Up: GCL Reference


7.2.150 ui-pdf-viewer

(ui-pdf-viewer VIEWER)
Use the executable VIEWER for viewing the PDF-version do manual when the ‘Manual (PDF)’ menu-item is selected in the ‘Help’-menu. If the (ui-pdf-viewer ...) command was never executed, then the default is to use the browser stored in the PDFVIEWER environment variable. If the environment variable is unset then the default is compile-time dependent.
geomview-1.9.5/doc/geomview-pt_BR.html/ui_002dtarget.html0000644000175000017500000000410712310162311020056 00000000000000 ui-target - Manual do Geomview

Next: , Previous: ui-pdf-viewer, Up: GCL Reference


7.2.151 ui-target

(ui-target ID [yes|no])
Set the target of user actions (the selected line do objeto alvo browser) to ID. The segundo argumento especifica se to make ID the current objeto regardless of its type. If no, then ID becomes the current objeto of its type (geom ou camera). The default is yes. This command may result in a change of modos de movimento based on target choice.
geomview-1.9.5/doc/geomview-pt_BR.html/uninterest.html0000644000175000017500000000345512310162311017712 00000000000000 uninterest - Manual do Geomview

Next: , Previous: ui-target, Up: GCL Reference


7.2.152 uninterest

(uninterest (COMMAND [args]))
Undoes the effect of an interest command. (COMMAND [args]) must be identical to those used in the interest command.
geomview-1.9.5/doc/geomview-pt_BR.html/update.html0000644000175000017500000000343512310162311016772 00000000000000 update - Manual do Geomview

Next: , Previous: uninterest, Up: GCL Reference


7.2.153 update

(update [timestep_in_seconds])
Apply each incremental movimento once. Uses timestep if it's present and nonzero; otherwise movimentos are proportional to elapsed real time.
geomview-1.9.5/doc/geomview-pt_BR.html/update_002ddraw.html0000644000175000017500000000350412310162311020372 00000000000000 update-draw - Manual do Geomview

Next: , Previous: update, Up: GCL Reference


7.2.154 update-draw

(update-draw CAM-ID [timestep_in_seconds])
Apply each incremental movimento once and then draw CAM-ID. Applies timestep seconds' worth of movimento, ou uses elapsed real time if timestep is absent ou zero.
geomview-1.9.5/doc/geomview-pt_BR.html/while.html0000644000175000017500000000330012310162311016607 00000000000000 while - Manual do Geomview

Next: , Previous: update-draw, Up: GCL Reference


7.2.155 while

(while TEST BODY)
Iterate: evaluate TEST, if non nil, evaluate BODY.
geomview-1.9.5/doc/geomview-pt_BR.html/window.html0000644000175000017500000000362112310162311017014 00000000000000 window - Manual do Geomview

Next: , Previous: while, Up: GCL Reference


7.2.156 window

(window CAM-ID WINDOW)
Specify attributes for the janela of CAM-ID, e.g. its size ou initial position, in the OOGL Window syntax. The special CAM-ID default especifica properties of future janelas (created by camera ou new-camera).
geomview-1.9.5/doc/geomview-pt_BR.html/winenter.html0000644000175000017500000000331612310162311017341 00000000000000 winenter - Manual do Geomview

Next: , Previous: window, Up: GCL Reference


7.2.157 winenter

(winenter CAM-ID)
Tell geomview that o cursor do mouse is in the janela of CAM-ID. This function is for development purposes and is not intended for general use.
geomview-1.9.5/doc/geomview-pt_BR.html/write.html0000644000175000017500000000522512310162311016641 00000000000000 write - Manual do Geomview

Next: , Previous: winenter, Up: GCL Reference


7.2.158 write

(write {command|geometry|camera|transform|ntransform|window|bbox} NOMEDOARQUIVO [ID|(ID ...)] [self|world|universe|outroID])
write description of ID in given format to NOMEDOARQUIVO. Last parameter chooses coordinate system for geometry & transform: self: just the objeto, no transformação ou aparência (objeto geométrico only) world: the objeto as positioned within the World. universe: objeto's position in universal coordenadas; includes Worldtransform other ID: the objeto transformed to o sistema de coordenadas de outroID.

A filename of - is a special case: data are written to the stream from which the 'write' command was read. For external modules, the data are sent to the module's standard input. For commands not read from an external program, - means geomview's standard output (see (command ...)).

The ID can either be a single id ou a parenthesized list of ids, like g0 ou (g2 g1 dodec.off).

geomview-1.9.5/doc/geomview-pt_BR.html/write_002dcomments.html0000644000175000017500000000571412310162311021137 00000000000000 write-comments - Manual do Geomview

Next: , Previous: write, Up: GCL Reference


7.2.159 write-comments

(write-comments NOMEDOARQUIVO GEOMID PICKPATH)
write OOGL COMMENT objetos in the GEOMID hierarchy at the level do pick path to NOMEDOARQUIVO. Specifically, COMMENTS at level (a b c ... f g) will match pick paths da form (a b c ... f *) where * includes any value of g, and also any values of possible further indices h,i,j, etc. The pick path (returned in the pick command) is a list of integer counters specifying a subpart of a hierarchical OOGL objeto. Descent into a complex objeto (LISTA ou INST) adds a new integer to the path. Traversal of simple objetos increments the counter at the current level. Individual COMMENTS are enclosed by curly braces, and the entire sequência de caracteres of zero, one, ou more COMMENTS (written in the order in which they are encountered during hierarchy traversal) is enclosed by parentheses.

Note that arbitrary data can only be passed through the OOGL libraries as full-fledged OOGL COMMENT objetos, which can be attached to other objetos OOGL via the LISTA type as described above. Ordinary comments in OOGL files (i.e. everything after '#' on a line) are ignored at when the file is loaded and cannot be returned.

geomview-1.9.5/doc/geomview-pt_BR.html/write_002dhandle.html0000644000175000017500000000360412310162311020541 00000000000000 write-handle - Manual do Geomview

Next: , Previous: write-comments, Up: GCL Reference


7.2.160 write-handle

(write-handle PREFIX NOMEDOARQUIVO HANDLE)
Writes the objeto underlying the given handle to NOMEDOARQUIVO. This function is intended for internal debugging use only.
geomview-1.9.5/doc/geomview-pt_BR.html/write_002dsexpr.html0000644000175000017500000000343612310162311020452 00000000000000 write-sexpr - Manual do Geomview

Next: , Previous: write-handle, Up: GCL Reference


7.2.161 write-sexpr

(write-sexpr NOMEDOARQUIVO LISPOBJECT)
Writes the given LISPOBJECT to NOMEDOARQUIVO. This function is intended for internal debugging use only.
geomview-1.9.5/doc/geomview-pt_BR.html/xform.html0000644000175000017500000000335312310162311016642 00000000000000 xform - Manual do Geomview

Next: , Previous: write-sexpr, Up: GCL Reference


7.2.162 xform

(xform ID TRANSFORM)
Concatenate TRANSFORM with the current transform do objeto (apply TRANSFORM to objeto ID).
geomview-1.9.5/doc/geomview-pt_BR.html/xform_002dincr.html0000644000175000017500000000345312310162311020244 00000000000000 xform-incr - Manual do Geomview

Next: , Previous: xform, Up: GCL Reference


7.2.163 xform-incr

(xform-incr ID TRANSFORM)
Apply continual movimento: concatenate TRANSFORM with the current transform do objeto every refresh (set objeto ID's incremental transform to TRANSFORM).
geomview-1.9.5/doc/geomview-pt_BR.html/xform_002dset.html0000644000175000017500000000335312310162311020103 00000000000000 xform-set - Manual do Geomview

Next: , Previous: xform-incr, Up: GCL Reference


7.2.164 xform-set

(xform-set ID TRANSFORM)
Overwrite the current objeto transform with TRANSFORM (set objeto ID's transform to TRANSFORM).
geomview-1.9.5/doc/geomview-pt_BR.html/zoom.html0000644000175000017500000000316512310162311016474 00000000000000 zoom - Manual do Geomview

Previous: xform-set, Up: GCL Reference


7.2.165 zoom

(zoom CAM-ID FACTOR)
Zoom CAM-ID, multiplying its field of view by FACTOR. FACTOR should be a positive number.
geomview-1.9.5/doc/geomview-pt_BR.html/Geometrias-Nao_002dEuclidianas.html0000644000175000017500000001032712310162311023207 00000000000000 Geometrias Nao-Euclidianas - Manual do Geomview

Next: , Previous: GCL, Up: Top


8 Geometrias Não-Euclidianas

Geomview supports hyperbolic and spherical objeto geométrico as well as Euclidean objeto geométrico. The three botões at the bottom do Main panel are for setting the current objeto geométrico type.

In each das three geometries, three models are supported: Virtual, Projective, and Conformal. You can change the current model with the Model browser on the Camera panel. Each Geomview câmera has its own model setting.

The default model is all three spaces is Virtual. This corresponds to the câmera being in the same space as, and moving under the same set of transformations as, the objeto geométrico itself.

In Euclidean space Virtual is the most useful model. The other models were implemented for hyperbolic and spherical spaces and just happen to work in Eucldiean space as well: Projective is the same as Virtual but by default displays the unit sphere, and Conformal displays everything inverted in the unit sphere.

In hyperbolic space, the Projective model setting gives a view do projective ball model of hyperbolic 3-space imbedded in Euclidean space. The câmera is initially outside the unit ball. In this model, the câmera moves by Euclidean movimentos and objeto geométrico moves by hyperbolic movimentos. Conformal model is similar but shows the conformal ball model instead.

In spherical space, the Projective model gives a view of half da 3-sphere imbedded in Euclidean 3-space. Spherical movimentos give rise to projective transformations in the Projective model, and to Moebius transformations in the Conformal model. In both of these models the câmera moves by Euclidean movimentos.

In Projective and Conformal models, the unit sphere is drawn by default. You can turn it off and on at will using the Draw Sphere botão in the Camera panel. In the Conformal model, polígonos and edges are subdivided as necessary to make them look curved. The parameters which determine this subdivision can be set with the set-conformal-refine GCL command. See (set-conformal-refine ...).

There are several sample hyperbolic space objetos in the data/geom/hyperbolic subdirectory do Geomview directory. Likewise, the subdirectory data/geom/spherical contains several sample spherical space objetos. geomview-1.9.5/doc/geomview-pt_BR.html/Mathematica.html0000644000175000017500000000654012310162311017725 00000000000000 Mathematica - Manual do Geomview

Next: , Previous: Geometrias Nao-Euclidianas, Up: Top


9 Gráficos Matemáticos no Geomview ou no RenderMan

Geomview comes with some Mathematica packages that let you use use Geomview to display Mathematica graphics. Mathematica is a commercial mathematical software system available from Wolfram Research, Inc.

There are two ways to do this.

  1. Use Mathematica to write a graphics objeto to a file in OOGL format or in RIB format.
  2. Use Geomview as the default display for all 3D graphics output in Mathematica.
You can also use these packages to save Mathematica graphics in RenderMan (RIB) format.

Since the format of Mathematica graphics objetos is different from the OOGL formats, both of these methods involve translating Mathematica graphics to OOGL format. Geomview is distributed with a Mathematica package which does this translation. Before doing either dos above you must install this package.

geomview-1.9.5/doc/geomview-pt_BR.html/OOGL_002em.html0000644000175000017500000000761612310162311017160 00000000000000 OOGL.m - Manual do Geomview

Next: , Previous: Mathematica, Up: Mathematica


9.1 Using Mathematica to generate OOGL files

The package OOGL.m allows Mathematica to write graphics objetos in OOGL format. To use it, give the command << OOGL.m to Mathematica to load the package. The WriteOOGL[file,graphics] command writes an OOGL description do 3D graphics objeto graphics to the file named file.

This package also provides the Geomview command which sends a 3D graphics objeto to Geomview. The first time you use this command it starts up a copy of Geomview. Later calls send the graphics to the same Geomview. There are two ways to use the Geomview command.

Geomview[graphics]
Sends the 3D graphics objeto graphics to Geomview as a geom named Mathematica. Subsequent usage of Geomview[graphics] replaces the Mathematica objeto in Geomview with the new graphics.
Geomview[name,graphics]
Sends the 3D graphics objeto graphics to Geomview as a geom named name. You can use multiple calls of this form with different names to cause Geomview to display several Mathematica objetos at once and allow independent control over them.
     % math
     Mathematica 2.0 for SGI Iris
     Copyright 1988-91 Wolfram Research, Inc.
      -- GL graphics initialized --
     
     In[1] := <<OOGL.m
     
     In[2] := Plot3D[Sin[x + Sin[y]], {x,-2,2},{y,-2,2}]
     
     Out[2] := -Graphics3D-

This displays graphics in the usual Mathematica way here.

     In[3] := WriteOOGL["math.oogl", %2]
     
     Out[3] := -Graphics3D-

This displays nothing new but writes the file math.oogl. You can now load that file into Geomview on any computer. Alternately, you can use the Geomview command to start up a copy of Geomview from within Mathematica.

     In[5] := Geomview[%2]
     
     Out[5] := -Graphics3D-
geomview-1.9.5/doc/geomview-pt_BR.html/Geomview_002em.html0000644000175000017500000001154412310162311020175 00000000000000 Geomview.m - Manual do Geomview

Next: , Previous: OOGL.m, Up: Mathematica


9.2 Using Geomview as Mathematica's Default 3D Display

The package Geomview.m arranges for Geomview to be the default display program for 3D graphics in Mathematica. To load it, give the command << Geomview.m to Mathematica. Thereafter, whenever you display 3D graphics with Plot3D or Show, Mathematica will send the graphics to Geomview.

Loading Geomview.m implicitly loads OOGL.m as well, so you can use the Geomview and WriteOOGL as described above after loading Geomview.m. You do not have to separately load OOGL.m.

     % math
     Mathematica 2.0 for SGI Iris
     Copyright 1988-91 Wolfram Research, Inc.
      -- GL graphics initialized --
     
     In[1] := <<Geomview.m
     
     In[2] := Plot3D[x^2 + y^2, {x, -2, 2}, {y, -2, 2}]
     
     Out[2] := -SurfaceGraphics-

This invokes geomivew and loads the graphics objeto into it.

     In[3] := Plot3D[{x*y + 6, RGBColor[0,x,y]}, {x,0,1}, {y,0,1}]
     
     Out[3] := -SurfaceGraphics-

This replaces the previous objeto do Geomview by the new objeto.

     In[4] := Geomview[{%2,%3}]
     
     Out[4] := {-SurfaceGraphics-, -SurfaceGraphics-}

This displays both objetos at once. You also can have more than one Mathematica objeto at a time on display in Geomview, and have separate control over them, by using the Geomview command with a name, See OOGL.m.

     In[5] := Graphics3D[ {RGBColor[1,0,0], Line[{ {2,2,2},{1,1,1} }] }]
     
     Out[5] := -Graphics3D-
     
     In[6] := Geomview["myline", %5]

This addes the Line specified in In[5] to the existing Geomview display. It can be controlled independently do "Mathematica" objeto, which is currently the list of two plots.

     In[7] := <<GL.m

If you're on an SGI, loading GL.m returns Mathematica to its usual 3D graphics display. The following plot will appear in a normal static Mathematica janela.

     In[8] := ParametricPlot3D[{Sin[x],Sin[y],Sin[x]*Cos[y]}, {x,0,Pi},{y,0,Pi}]
     
     Out[8] := -Graphics3D-

We can return to Geomview graphics at any time by reloading Geomview.m.

     In[9] := <<Geomview.m
     
     In[10] := Show[%8]
     
     Out[10] := -Graphics3D-
     
     In[11] := ParametricPlot3D[
     	   {(2*(Cos[u] + u*Sin[u])*Sin[v])/(1 + u^2*Sin[v]^2),
     	   (2*(Sin[u] - u*Cos[u])*Sin[v])/(1 + u^2*Sin[v]^2),
     	   Log[Tan[v/2]] + (2*Cos[v])/(1 + u^2*Sin[v]^2)},
     	  {u,-4,4},{v,.01,Pi-.01}]
     
     Out[11] := -Graphics3D-

This last plot is Kuen's surface, a surface of constant negative curvature. Parametrization from Alfred Gray's Modern Differential Geometry of Curves and Surfaces textbook. geomview-1.9.5/doc/geomview-pt_BR.html/RenderMan.html0000644000175000017500000001210412310162311017354 00000000000000 RenderMan - Manual do Geomview

Next: , Previous: Geomview.m, Up: Mathematica


9.3 Using Mathematica to generate RenderMan files

In addition to the WriteOOGL and Geomview commands described above, the package OOGL.m also defines the command WriteRIB which writes a 3D graphics objeto to a RenderMan RIB file: WriteRIB[file, graphics] writes graphics to file file. RenderMan is a commercial rendering system available from Pixar, Inc., which can produce extremely high quality images.

     In[1] := <<OOGL.m
     
     In[2] := <<Graphics/Polyhedra.m
     
     In[3] := Graphics3D[Cube[]]
     
     Out[3] := -Graphics3D-
     
     In[4] := WriteRIB["cube.rib", %3]
     
     Out[4] := -Graphics3D-

This generates the file math.rib. This is a ready-to-render RIB file da given objeto geométrico, using a default câmera position, lighting, and the “plastic” shader. In a shell janela, type render cube.rib to generate the image file mma.tiff. Of course, you need to have RenderMan installed for this to work. A shortcut to render from inside Mathematica is WriteRIB["!render", foo].

WriteRIb works by first converting the Mathematica graphics objeto to OOGL format using WriteOOGL and then calls an external program oogl2rib to convert OOGL to RIB format. The oogl2rib program takes several options which you can specify in a sequência de caracteres as an optional terceiro argumento to WriteRIb. The default option sequência de caracteres is " -n mma.tiff ", which indicates that the RIB file should generate a rendered TIFF file named mma.tiff. A particularly useful option is -g, which tells oogl2rib to convert only the objeto geométrico into a RIB fragment. You can insert that fragment into a full RIB file of your own making with câmera positions and shaders of your choice, to harness the full power of RenderMan.

The full usage of oogl2rib is:

     oogl2rib [-n name] [-B r,g,b] [-w width] [-h height] [-fgb] [infile] [outfile]

By default it reads from stdin and writes to stdout. Either infile ou outfile may be -, which means use stdin/stdout. The options are:

-n name
Use name for the name do rendered TIFF file (default "geom.tiff") ou framebuffer janela (default "geom.rib").
-B r,g,b
Use background color (r,g,b). Each component ranges from 0 to 1. Default: none.
-w width -h height
Rendered frame will be width by height pixels.
-f
RIB file renders to on-screen framebuffer instead of TIFF file.
-g
Output only the objeto geométrico in RIB format.
-b
Output only a Quick Renderman clip objeto. Ignores -nBwhf.
geomview-1.9.5/doc/geomview-pt_BR.html/Remote-Display.html0000644000175000017500000000437212310162311020347 00000000000000 Remote Display - Manual do Geomview

Next: , Previous: RenderMan, Up: Mathematica


9.4 Using Geomview and Mathematica on Different Computers

It is possible to use Geomview to display graphics generated by Mathematica running on a different computer. If you want to use Mathematica on a computer that is not networked with your Geomview computer, you can write out chunk files in Mathematica which you transfer to the Geomview computer and then translate to OOGL format for displaying in Geomview.

geomview-1.9.5/doc/geomview-pt_BR.html/Networked-Geomview.html0000644000175000017500000000735712310162311021241 00000000000000 Networked Geomview - Manual do Geomview

Next: , Previous: Remote Display, Up: Remote Display


9.4.1 Using a Networked Geomview Host

The Geomview command looks at the DISPLAY or REMOTEHOST environment variables to try to determine if you are logged in from another computer. If either of these indicates that you are, Geomview will attempt to run Geomview on that computer. In order for this to work, your network must be configured such that the Mathematica computer can successfully rsh to the Geomview computer without giving a password.

You can also explicitly set the DisplayHost option to the Geomview command to a sequência de caracteres which is the desired hostname, for exemplo:

     In[1] := << OOGL.m
     
     In[2] := Plot3D[Sin[x + Sin[y]], {x,-2,2},{y,-2,2}]
     
     Out[2] := -Graphics3D-
     
     In[3] := Geomview[%3, DisplayHost->"riemann"]

This displays the graphics %3 on the remote host named riemann.

Geomview recognizes the sequência de caracteres "local" as a value for $DisplayHost; it forces the graphics to be displayed on the local machine.

In addition to knowing the name da machine you want to run Geomview on, Geomview needs to know the type of that machine (the setting da CPU variable that corresponds to the machine; see Source Code Installation). By default, Geomview assumes that it is the same kind of computer as the one you are running Mathematica on. The MachType option lets you explicitly specify the type do DisplayHost computer; it should be one das sequências de caracteres "sgi" or "next" ou "x11".

You can use SetOptions to change the default DisplayHost and MachType. For exemplo,

     In[4] := SetOptions[Geomview, DisplayHost->"riemann", MachType->"sgi"]

arranges for Geomview to run Geomview on an SGI workstation named riemann. geomview-1.9.5/doc/geomview-pt_BR.html/Chunks.html0000644000175000017500000000666412310162311016752 00000000000000 Chunks - Manual do Geomview

9.4.2 Transporting Mathematica Files to Geomview by Hand

The auxilliary function WriteChunk is for those who can only use Mathematica on a computer that Geomview isn't installed on. WriteChunk[file, graphics] generates a file named file which contains the graphics objeto graphics in the format accepted by math2oogl.

You can transfer that file to a computer that has Geomview installed on it and then use the programs math2oogl, oogl2rib, and geomview directly from the shell. These programs are distributed in the bin/<CPU> subdirectory do Geomview directory, and may have been installed so that they are on your path.

     In[1]:= <<OOGL.m
     
     In[2]:= Plot3D[ Sin[x + Sin[y]], {x,-2,2}, {y,-2,2} ]
     
     Out[2]= -SurfaceGraphics-
     
     In[3]:= WriteChunk["mychunk",%2]

This writes the file mychunk which contains a description do graphics objeto. You can then transfer this file to a system with Geomview and type

     math2oogl < mychunk > mma.oogl

to convert it to the OOGL file mma.oogl which you can then view using Geomview. This is the equivalent do WriteOOGL command.

For a result equivalent to the Geomview ou Show commands, type

     math2oogl -togeomview Mathematica geomview < mychunk

The WriteRIb command can be emulated from the shell as

     math2oogl < mychunk | oogl2rib -n mma.tiff

geomview-1.9.5/doc/geomview-pt_BR.html/Package-Details.html0000644000175000017500000000631212310162311020423 00000000000000 Package Details - Manual do Geomview

9.5 Details of the Mathematica->Geomview Package

The OOGL.m package uses the external program math2oogl to convert Graphics3D objetos to OOGL format, because a compiled external program is able to do this conversion many times faster than Mathematica.

The converter will sometimes handle colored SurfaceGraphics objetos correctly that Mathematica does not handle correctly, which means that Geomview[objeto] sometimes works where Show[objeto] will give errors.

The converter supports the Polygon, Line, and Point graphics primitives, RGBColor Graphics3D directives, and SurfaceGraphics objetos with ou without RGBColor directives, and lists of any combination of these. It silently ignores all other directives.

The Mathematica to RenderMan conversion is actually a two-step process: Mathematica->OOGL (math2oogl), and OOGL->RenderMan (oogl2rib).

In the WriteOOGL and WriteRIb commands, filename can either be a sequência de caracteres containing a filename, an OutputStream objeto, or a sequência de caracteres starting with a ! to send the output to a command. Objeto can be a Graphics3D objeto, a SurfaceGraphics objeto, ou a list of these.

The packages work best with Mathematica 2.0 ou better. With version 1.2, the Geomview display is always on the local host. geomview-1.9.5/doc/geomview-pt_BR.html/Package-Installation.html0000644000175000017500000001551412310162311021503 00000000000000 Package Installation - Manual do Geomview

Previous: Package Details, Up: Mathematica


9.6 Installing the Mathematica Packages

BUG: This section is out of date. Geomview follows the GNU-installation habits, data goes to PREFIX/share/geomview/, user executables to PREFIX/bin/, private executables to PREFIX/libexec/geomview/, libraries to PREFIX/lib/ where PREFIX denotes the installation prefiex specified for the TOPSRCDIR/configure script. Please have a look at the files TOPSRCDIR/INSTALL and TOPSRCDIR/INSTALL.Geomview for installation instructions.

The installed Mathematica data-files can be found in PREFIX/share/geomview/Mathematica/.

If Geomview is properly installed on your system according to the instructions in See Instalacao, then the Mathematica-to-Geomview packages should work as described here; there should be no need for additional installation procedures. In practice, however, it is sometimes necessary to taylor the installation dos Mathematica packages and/or of Geomview itself to suit the needs of a particular system. This section contains details about how the installation works; if the Mathematica-to-Geomview connection does not seem to work for you after following the Geomview installation procedure, consult this section to see what might need to be fixed.

In this section, the phrase Geomview installation refers any of the procedures in See Instalacao. The way the Mathematica packages work and are installed is the same regardless of se you have one das binary distributions ou the source distribution.

  1. The relevant mathematica files are OOGL.m, Geomview.m, and BezierPlot.m; Mathematica must be able to find these files. They are distributed in the PREFIX/share/geomview/Mathematica subdirectory das binary distributions, and in the TOPSRCDIR/src/bin/geomutil/math2oogl subdirectory da source distribution. These files need to be in a directory that is on Mathematica's search path. You can look at the value of the $Path variable in a Mathematica session on your system to see a list dos directories on Mathematica's search path.

    The Geomview installation procedure puts copies dos Mathematica packages into a directory that you specify (MMAPACKAGEDIR). This should ensure that Mathematica can find them. Alternately, you could arrange to append the pathname dos Mathmematica package subdirectory da Geomview distribution to the $Path variable each time you run Mathematica.

  2. The package OOGL.m needs to be able to invoke the programs geomview, math2oogl, and oogl2rib. The Geomview installation procedure installs these programs into a directory that you specify for executables (BINDIR). Ideally, this directory should be on your shell's $PATH. More specifically, it should be on the $PATH do shell in which Mathematica runs; the directory /usr/local/bin is usually a good choice. You can see the list of directories on this path by giving the command !echo $path in Mathematica.

    If for some reason you can't arrange for geomview, math2oogl, and oogl2rib to be in a directory on the shell's $PATH, you can modify OOGL.m to cause it to look for them using absolute pathnames. To do this, change the definitions das variables $GeomviewPath and $GeomRoot, which are defined near the top do file. Change $GeomviewPath to the absolute pathname do geomview shell script on your system. Change $GeomRoot to the absolute pathname do $GEOMROOT directory on your system. If you do this, you should also make sure there are copies of geomview, math2oogl, and oogl2rib in the $GEOMROOT/bin/<CPU>.

  3. The geomview shell script, which OOGL.m uses to invoke Geomview, needs to be able to find the geomview executable file ( called gvx). The Geomview installation procedure should have been taken care of this, but if your Mathematica session doesn't seem to be able to invoke Geomview, it's worth double-checking that the settings in the geomview script are correct.
geomview-1.9.5/doc/geomview-pt_BR.html/Instalacao.html0000644000175000017500000000570612310162311017571 00000000000000 Instalacao - Manual do Geomview

Next: , Previous: Mathematica, Up: Top


10 Instalação

BUG: This section is out of date. Geomview follows the GNU-installation habits, data goes to PREFIX/share/geomview/, user executables to PREFIX/bin/, private executables to PREFIX/libexec/geomview/, libraries to PREFIX/lib/ where PREFIX denotes the installation prefiex specified for the TOPSRCDIR/configure script. Please have a look at the files TOPSRCDIR/INSTALL and TOPSRCDIR/INSTALL.Geomview for installation instructions.

What you do to install Geomview depends on which kind of computer you have and on se you have the source distribution or the binary distribution.

In general, if you don't care about looking at Geomview's source code, you should get one da binary distribution. The binary installation is much easier and quicker than compiling and installing the source code.

geomview-1.9.5/doc/geomview-pt_BR.html/Unix-Binary-Installation.html0000644000175000017500000001324712310162311022316 00000000000000 Unix Binary Installation - Manual do Geomview

10.1 Instalando os Binários Unix

BUG: This section is out of date. Geomview follows the GNU-installation habits, data goes to PREFIX/share/geomview/, user executables to PREFIX/bin/, private executables to PREFIX/libexec/geomview/, libraries to PREFIX/lib/ where PREFIX denotes the installation prefiex specified for the TOPSRCDIR/configure script. Please have a look at the files TOPSRCDIR/INSTALL and TOPSRCDIR/INSTALL.Geomview for installation instructions.

If you have just obtained a copy da binary distribution for a Unix system (Linux, SGI, Solaris, HP, etc), you should be able to run Geomview and make use of most of its features immediately after unpacking it by cd'ing to the directory that it is in and typing geomview.

In order to fully install Geomview so that you can run it from any directory and use all of its features, follow the steps in this section. In particular, you must go through this installation procedure in order to use Geomview to display Mathematica graphics.

Geomview is distributed in a directory that contains various files and subdirectories that Geomview needs at run-time, such as data files and external modules. It also contains other things distributed with Geomview, such as documentation and (in the soure-code distribution) source-code. We refer to the root directory of this tree as the $GEOMROOT directory. This is the directory called Geomview that is created when you unpack the distribution file.

To install Geomview on your system, arrange for the $GEOMROOT directory to be in a permanent place. Then, in a shell janela, cd to that directory and type install. This runs a shell script which does the installation after asking you several questions about where you want to install the various componentes of Geomview.

After running the install script you should now be able to run Geomview from any directory on your system. (You may need to give the rehash command in any shells on your computer that were started up before you did the installation.)

The install script puts copies dos files in $GEOMROOT/bin/<CPU> and $GEOMROOT/man into the directories you specified for executables and man pages, respectively. Once you have done the installation you can cut down one the disk space required by Geomview by removing some files from these directories, since copies have been installed elsewhere. You should first test that your installed Geomview works properly because once you remove these files from their distribution directories you will not be able to do the installation again.

In particular, the files you can remove are

$GEOMROOT/bin/<MACHTYPE>:
(where <MACHTYPE> is the type of system you are on, e.g. linux, sgi, hpux, etc). Remove all files from here except gvx, which is the geomview executable file. DO NOT REMOVE gvx. It is not installed elsewhere.
$GEOMROOT/man:
You can remove all the files in this directory.
geomview-1.9.5/doc/geomview-pt_BR.html/Unix-Binary-Detail.html0000644000175000017500000001161412310162311021053 00000000000000 Unix Binary Detail - Manual do Geomview

10.1.1 Detalhes da Instalação dos Binários Unix

BUG: This section is out of date. Geomview follows the GNU-installation habits, data goes to PREFIX/share/geomview/, user executables to PREFIX/bin/, private executables to PREFIX/libexec/geomview/, libraries to PREFIX/lib/ where PREFIX denotes the installation prefiex specified for the TOPSRCDIR/configure script. Please have a look at the files TOPSRCDIR/INSTALL and TOPSRCDIR/INSTALL.Geomview for installation instructions.

The install script should be self-explanatory; just run it and answer the questions. This section gives some details for system administrators and other users who may want to know more about the installation.

The installation is actually done by make; the install script queries the user for the settings dos following make variables and then invokes make install.

GEOMROOT:
the absolute pathname do Geomview root directory. The geomview shell script, which is what users invoke to run Geomview, uses this to set various environment variables that Geomview needs. It is very important that this be an absolute pathname — i.e. it should start with a '/'.
BINDIR:
a directory where executable files are installed. The geomview shell script goes here, as well as various other auxiliary programs that can be used in conjunction with geomview. This should be a directory that is on users' $path. These auxiliary programs are distributed in the $GEOMROOT/bin/<MACHTYPE> directory; if you specify this directory for BINDIR, they are left in that directory.
MANDIR:
a directory where Unix manual pages are installed. These are distributed in the $GEOMROOT/man subdirectory; if you specify this directory for MANDIR, they are left in that directory.
MMAPACKAGEDIR:
a directory where Mathematica packages are installed. This should be a directory that Mathematica searches for packages that it loads; you can see what directories your Mathematica searches by looking at the value da $Path variable in a Mathematica session. The installation process will install some packages there which allow you to use Geomview to display Mathematica graphics. These packages are distributed in the $GEOMROOT/mathematica subdirectory; if you specify this directory for MMAPACKAGEDIR, ou if you specify the empty sequência de caracteres for MMAPACKAGEDIR, the packages are left in that directory. For more details about the way these Mathematica packages connect to Geomview, see Package Installation.
geomview-1.9.5/doc/geomview-pt_BR.html/Source-Code-Installation.html0000644000175000017500000001475512310162311022266 00000000000000 Source Code Installation - Manual do Geomview

10.2 Compilando e Instalando a Partir do Código Fonte.

BUG: This section is out of date. Geomview follows the GNU-installation habits, data goes to PREFIX/share/geomview/, user executables to PREFIX/bin/, private executables to PREFIX/libexec/geomview/, libraries to PREFIX/lib/ where PREFIX denotes the installation prefiex specified for the TOPSRCDIR/configure script. Please have a look at the files TOPSRCDIR/INSTALL and TOPSRCDIR/INSTALL.Geomview for installation instructions.

The main reason to get the source code distribution is to look at and/or work with the source code. If you are only concered with using Geomview it is better to get the binary distribution. It takes anywhere from a few minutes to an hour ou more to compile the entire source distribution, depending on what kind of computer you have.

Let $GEOMROOT denote the full pathname do Geomview source code directory; this is the directory called Geomview that is created when you unpack the distribution. This directory contains the Geomview source code as well as various other files and subdirectories that Geomview needs when it runs.

Before doing any compilation you should edit the file $GEOMROOT/makefiles/mk.site.default. This file defines some make variables which specify your local configuration. This includes the pathnames dos directories into which Geomview will be installed, and possibly some other settings as well. There are comments in the file telling you what to do. This file is included by every Makefile in the source tree, so the settings you specify here are used throughout the source.

If you will be compiling for multiple systems, you can do them all in the same directory tree. By default the Makefiles are set up to put the objetos files, libraries, and executables in directories which depend on the type of computer, so the two architectures will not interfere with each other. The Makefiles use a variable called CPU to determine the type of machine. Before doing any compilation you must arrange for this variable to have a value. There are two ways you can do this.

  1. If you will always be compiling Geomview on the same type of computer edit the file $GEOMROOT/makefiles/Makedefs.global to set the CPU variable to one dos values linux, FreeBSD, sgi, hpux, hpux-gcc, solaris, sun4os4 (for Suns with SunOS 4, not Solaris), rs6000, or alpha. If you're using a type of system not in this list, make up a new value for CPU, and write a mk.<CPU> file for it patterned after the other mk.* in the makefiles subdirectory.
  2. If you will be compiling on more than one type of computer you can set a shell environment variable named CPU to one dos values above and the Makefiles will inherit the value from the environment.

Note that many dos Makefiles refer to a variable called MACHTYPE; this variable tells which type of graphics system to compile Geomview for. The mk.<CPU> files set this variable for you; in most cases its value is x11, which especifica that Geomview should be compiled for X janelas.

Once you have configured your source tree by editing the files as described above and setting the CPU variable, you can compile and install Geomview by typing make install in the $GEOMROOT directory. You can also type make all, ou equivalently just make, to compile without installing, and then type make install later to install.

You can use these same make comands in any subdirectory in the tree to recompile and/or install a part of Geomview ou a module.

If you want to modify the complier flags used during compilation, edit the file $GEOMROOT/makefiles/Makedefs.global; the COPTS variable especifica the flags passed to the C compiler (cc). geomview-1.9.5/doc/geomview-pt_BR.html/Suporte.html0000644000175000017500000000522212310162311017145 00000000000000 Suporte - Manual do Geomview

Next: , Previous: Instalacao, Up: Top


Recebendo Suporte Técnico para o Geomview

There are several ways to get support for Geomview.

  1. Visit the Geomview web site, http://www.geomview.org. It contains the latest documentation, news about development, and FAQ (Frequently Asked Questions) list.
  2. Send email to the geomview-users@lists.sourceforge.net mailing list. This is a mailing list for discussing any issues related to using Geomview. To join the list, send an empty note with 'subscribe' in the subjeto line to geomview-users-request@lists.sourceforge.net, ou visit the list web page at http://lists.sourceforge.net/mailman/listinfo/geomview-users.
  3. Contract with Geometry Technologies for support. Geometry Technologies is a contract support and programming company that emerged from the Geometry Center, where Geomview was written. For more information visit the Geometry Technologies web site at http://www.geomtech.com.
geomview-1.9.5/doc/geomview-pt_BR.html/Contribuindo.html0000644000175000017500000000616512310162311020152 00000000000000 Contribuindo - Manual do Geomview

Next: , Previous: Suporte, Up: Top


Contribuindo para o Desenvolvimento do Geomview

If you are interested in contributing to the development of Geomview, there are several things you can do:

  1. Volunteer programming work.

    If you are a programmer and make an improvement to Geomview, contact the other geomview authors by sending a note to the geomview-users mailing list (see http://lists.sourceforge.net/mailman/listinfo/geomview-users).

  2. Contract with Geometry Technologies.

    Geometry Technologies, Inc. is a consulting firm that provides contract technical support and custom programming services in the area of 3D graphics. This includes a wide range of services related to 3D graphics, included but not limited to applications involving Geomview. To the extent that resources allow, Geometry Technologies supports the developement of Geomview; in particular it hosts the http://www.geomview.org web site, and its staff make ongoing improvements to Geomview itself. If you are in a position to pay for technical support ou custom programming work, contracting with Geometry Technologies indirectly supports Geomview. You can also contract with with Geometry Technologies to have particular features that you want added to Geomview, ou to port Geomview to a new platform. For more information see Geometry Technologies web site at http://www.geomtech.com.

Thank you. geomview-1.9.5/doc/geomview-pt_BR.html/Indice-de-Funcoes.html0000644000175000017500000013202312310162311020665 00000000000000 Indice de Funcoes - Manual do Geomview

Next: , Previous: Contribuindo, Up: Top


Índice das Funções

Table of Contents

geomview-1.9.5/doc/geomview-pt_BR.html/Lista-de-Figuras.html0000644000175000017500000000550512310162311020550 00000000000000 Lista de Figuras - Manual do Geomview

Previous: Indice de Funcoes, Up: Top


Lista de Figuras

geomview-1.9.5/doc/README.gvplot0000644000175000017500000002112512310110175013220 00000000000000 gvplot, writeoogl -- Maple 3-D graphics in Geomview Contents: Installation Outline (out of date) Maple's Library Directory Configurable Settings in gvplot Remote Display ******************************************************************************* NOTE: the installation instructions are out of date. Please have a look at `savegvplot.mws'; load that file with xmaple and try to guess what to do from the contents of that file. Nevertheless it may be helpful to read through _this_ file; it contains more information than just installation instructions. ******************************************************************************* This Maple package supports displaying Maple 3-D graphic objects (produced for example by Maple's plot3d function) in Geomview, and saving Maple graphics objects as Geomview-readable OOGL files. Maple 2-D graphics aren't supported. This distribution (in src/bin/geomutil/maple2oogl in the Geomview source distribution) includes Maple source files. You'll want to run Maple to produce library (.m) files from the source files, and possibly to install them in the Maple library directory to be accessible via readlib(gvplot). This process is handled by the "make install" command described here. Documentation for the package itself is available within Maple after installation; for example, type readlib(gvplot); ?gvplot To install this package: * Edit gvplot.mapleV3 or gvplot.mapleV4 (according to your version of Maple), possibly changing the settings of default_gvcommand and default_gvdirectories; see "Configurable Settings" and "Remote Display", below. * Determine the directory into which new Maple library (.m) files should be placed; see "Maple's Library Directory". This will be the setting of MAPLE_LIB. A typical value might be /usr/local/maple/lib. * If geomview, togeomview, and remotegv aren't already on the search path of everyone who'll want to use the program, determine which directory they are (or will be) placed in, e.g. /usr/local/bin. This will be the setting of BINDIR. * If you have the source distribution, edit makefiles/mk.site.default (relative to the top of the geomview distribution) and set MAPLE_LIB and BINDIR to the appropriate values. * Make sure "maple" is on your search path. * Run make install or, if you didn't set MAPLE_LIB and BINDIR in mk.site.default, give those values explicitly on the "make" command line: make install MAPLE_LIB=maple_library_directory BINDIR=binary_directory Maple V4 users: since the Geometry Center doesn't have Maple V4, we haven't been able to test that "make install" correctly determines the version of Maple if you have release 4. If you have trouble, try invoking the MapleV4 installation directly with make install_v4 MAPLE_LIB=maple_lib_dir BINDIR=binary_dir MAPLE'S LIBRARY DIRECTORY For convenient invocation, it's best to put the compiled Maple code for this package -- the file gvplot.m -- in some directory known to Maple. Users can then invoke it by typing readlib(gvplot); Since Maple V.2, Maple keeps a list of library directory names in the global variable "libname". Its default value is typically the single directory `/usr/local/maple/lib`; you can check its actual value by running Maple and typing libname; You can configure Maple to add other directories (e.g. for locally- installed rather than Maple-supplied packages) to the libname list for all users. Briefly, you create a "src" subdirectory of the default library directory (e.g. /usr/local/maple/lib/src) and create a file there named "init" containing something like libname := libname, `/usr/local/maple/otherstuff`: You could then place library files in /usr/local/maple/otherstuff, and/or set MAPLE_LIB = /usr/local/maple/otherstuff in makefiles/mk.site.default. Configurable Settings in gvplot Two values in the "gvplot" script are configurable: default_gvcommand, the UNIX command used to invoke geomview. It's normally "geomview", but might specify some geomview options, or might be "remotegv" if you'll want to run maple on one system and display via geomview on another. default_gvdirectories, the directory(ies) (in addition to those in the normal UNIX search path) to find the programs "togeomview" and "geomview". There's no default; this is correct if these programs are installed on everyone's search path, e.g. in /usr/local/bin. This value is automatically configured as part of the "make install" process and probably won't need to be messed with. It can be set to a colon-separated list of directories. It can be useful to invoke something other than simply "geomview" to display Maple graphics; for example, one might start geomview with options to position its window, or with a special startup script. To adjust this, change the setting of "gvcommand" near line 45, as in default_gvcommand := `geomview -nopanels -wpos 640x480@0,0`; To regenerate the library (.m) file after such changes, start a fresh Maple session, read the source file, and save the library file: read(`gvplot`); save(`/usr/local/maple/lib/gvplot.m`); REMOTE DISPLAY It's possible to run Maple on one system and display Geomview graphics on another. This can sometimes be done by using the X "DISPLAY" environment variable, so that Maple and Geomview run on one machine but Geomview's windows appear elsewhere. But for fastest graphics, it's better if you can run Geomview on the computer where the display is. To have the gvplot package invoke Geomview on another machine, make it invoke "remotegv" rather than "geomview". You can make "remotegv" the default for all gvplot users by editing the gvplot source and changing the setting of "default_gvcommand" near line 45. Or, a user can adjust the setting of "gvcommand" within each session, saying e.g. readlib(gvplot); gvcommand := `remotegv -h slevy@gauss`; remotegv attempts to guess which machine to invoke geomview on by examining the DISPLAY environment variable. If DISPLAY isn't set or if geomview should run on a different machine, use the -h host option. The script also assumes that geomview should display on the machine where it is invoked, so for that copy of geomview, it sets DISPLAY to ":0". If the display should appear elsewhere (on an X terminal, say), use the -display option. Remotegv uses "rsh" (remote shell) to pass data to the other computer, so the remote computer must allow this -- either with an entry in /etc/hosts.equiv, or in a .rhosts file in the user's home directory on the machine where geomview will run. The account name on the other machine is assumed to be the same as on this machine; if different, use the -l username or -h username@othermachine options. In case permissions are not set up correctly, the symptom is liable to be a "Permission denied." message followed by the immediate termination of the Maple process -- so if you're using it for the first time, check it out before doing much else in your Maple session! Sorry, but MapleV3 is just not very good at connecting to other programs. Note that togeomview and geomview MUST BE IN THE USER'S DEFAULT SEARCH PATH on the remote machine. To use this script within Maple, you'd say: readlib(gvplot); then gvcommand := `remotegv`; or e.g. gvcommand := `remotegv -h othermachine -display myxterm:0`; or, if the account on the other machine is different from yours, gvcommand := `remotegv -l otheraccount`; or gvcommand := `remotegv -h otheraccount@othermachine`; Following any remotegv options, you can add the command to be invoked as geomview, possibly including options, as in: gvcommand := `remotegv -l person /u/person/bin/geomview -wpos 300x200`; Once gvcommand is properly set, you can use gvplot() as usual. Normally, error messages reporting problems on the other machine (for example, being unable to run geomview) are suppressed; this is unfortunately necessary, or you'd never get another Maple prompt until quitting from geomview. There's a test mode to aid in tracing problems; use it as in gvcommand := `remotegv -test -h othermachine`; i.e. add "-test" to whatever other options you'd give to remotegv. Summary of remotegv options: -l user or -l user@host -h host or -h user@host -display host:number (set display on remote end) -test also accepts togeomview's options (-g, -M[c][g][p][s]). Invokes rsh to specified machine, invokes togeomview there by default. By default, we assume DISPLAY points to the machine where we'd like to be; -h {host-portion-of-DISPLAY} -display :0 Incorporates settings from "$RGVOPTS" environment variable. geomview-1.9.5/doc/oogltour0000644000175000017500000004532212310110176012631 00000000000000Tutorial: The OOGL Geom File Formats (and Geomview along the way) OOGL stands for Object Oriented Graphics Library. An OOGL object is called a Geom. There is a text file format for each kind of Geom. You can load a text file into any program that uses OOGL. Geomview is an interactive 3D object viewer built on top of OOGL. (Geomview runs on Silicon Graphics, NextStep, and X-Windows platforms.) There are Geomview notes in brackets interspersed throughout this guide telling you what to do in Geomview to see what we're talking about. Later notes assume you both know how to do and have done what previous notes told you about. All of the files referred to in this document are in the directory of sample OOGL files that comes with Geomview. The OOGL File Formats section of the Geomview manual is a complete reference for the syntax of file formats. This tutorial is an attempt to lead you more gently into the world of OOGL. ---------------------------------------------------------------------- ---------------------------------------------------------------------- QUAD We start with a very simple object: a square. Specifically, the unit square in the xy plane at z=0. ---------------------------------------------------------------------- "square.quad": QUAD -1 -1 0 1 -1 0 1 1 0 -1 1 0 ---------------------------------------------------------------------- The header "QUAD" identifies the file type. (You can also use the header "POLY" for this type for historical reasons.) A QUAD file is a list of 4*n vertices where n is the number of quadrilaterals. This file only contains one quadrilateral. You can also use this format to specify triangles: just use a degenerate quadrilateral where two of the four vertices are identical. The vertices in this file are simple: just the x,y, and z coordinates of the point. [GEOMVIEW: Type "geomview square.quad" from a shell window on a Silicon Graphics Iris. Spin the square around with the left mouse after geomview loads it. Feel free to play with geomview a while if the fancy strikes you during this tutorial. ] The next file has more complex vertices that include a color with a point. ---------------------------------------------------------------------- "csquare.quad": CQUAD -1 -1 0 1 0 0 1 1 -1 0 0 1 0 1 1 1 0 0 1 0 1 -1 1 0 1 0 0 1 ---------------------------------------------------------------------- It's got the same points as the previous square, but with two red and two green corners. The header is now "CQUAD" to indicate that its vertices contain color information as well as point information. Colors are specified by (r,g,b,a) 4-tuples of floating point numbers between 0 and 1. Any color that can be displayed on a computer screen can be encoded by some combination of red, green and blue. The fourth component, alpha, represents opacity: 0 is transparent and 1 is opaque. The X, NextStep, and some SGI platforms ignore alpha information entirely, but a Renderman snapshot will use the alpha information if transparency is enabled. Some SGI platforms use the alpha information, but the picture is guaranteed to be incorrect. [geomview: Delete the current object by hitting the Delete button. To load csquare.quad, hit the Load Button and type "csquare.quad" (hit RETURN when you're done typing) into the popup box that appears. (If you're browsing and are not sure about file names, you can use the File Browser Button to look around in a directory.) You're probably wondering why it's all one color. The default shading mode is flat shading, where each polygon or polygonal face is the same color. The other two shading modes, constant and smooth, will both display multicolored faces where the colors smoothly interpolated between vertices. Constant shading ignores all lighting information, while smooth shading interpolates lighting as well as coloring between the vertices. To change shading mode, first open up the Appearance panel by clicking on the Appearance line in the More Panels browser. Now switch from mode to mode by clicking on different lines in the Shading browser. ] Time to move on to bigger and better things. "dodec.quad": QUAD 0 0 0.794654 0 0.491123 0.794654 0.356822 0.491123 0.794654 0.467086 0.151765 0.794654 0 0 0.794654 -0.467086 0.151765 0.794654 -0.356822 0.491123 0.794654 4.89153e-09 0.491123 0.794654 0 0 0.794654 -0.288675 -0.397327 0.794654 -0.57735 -0.187593 0.794654 -0.467086 0.151766 0.794654 0 0 0.794654 0.288675 -0.397327 0.794654 4.36694e-09 -0.607062 0.794654 -0.288675 -0.397327 0.794654 0 0 0.794654 0.467086 0.151766 0.794654 0.57735 -0.187592 0.794654 0.288675 -0.397327 0.794654 0 0.710761 0.35538 0 0.491123 0.794654 -0.356822 0.491123 0.794654 -0.467086 0.642889 0.491123 . . . < 55 lines of numbers deleted> Now we've got a more interesting object: a dodecahedron. Since dodecahedra have 5-sided faces, each of its 12 faces is actually made out of 5 quadrilaterals for a total of 20 quadrilaterals in this Quad object. [geomview: Delete the square and load "dodec.quad". Since the 5 quadilaterals on each face all fit together perfectly, the fact that there are indeed many of them on each face is only apparent when the edges are drawn. To turn on edge drawing, hit the Edges button on the Appearance panel. ] OFF There is a much more efficient way of representing a dodecahedron. "dodec.off": OFF 20 12 30 1.214124 0.000000 1.589309 0.375185 1.154701 1.589309 -0.982247 0.713644 1.589309 -0.982247 -0.713644 1.589309 0.375185 -1.154701 1.589309 1.964494 0.000000 0.375185 0.607062 1.868345 0.375185 -1.589309 1.154701 0.375185 -1.589309 -1.154701 0.375185 0.607062 -1.868345 0.375185 1.589309 1.154701 -0.375185 -0.607062 1.868345 -0.375185 -1.964494 0.000000 -0.375185 -0.607062 -1.868345 -0.375185 1.589309 -1.154701 -0.375185 0.982247 0.713644 -1.589309 -0.375185 1.154701 -1.589309 -1.214124 0.000000 -1.589309 -0.375185 -1.154701 -1.589309 0.982247 -0.713644 -1.589309 5 0 1 2 3 4 5 0 5 10 6 1 5 1 6 11 7 2 5 2 7 12 8 3 5 3 8 13 9 4 5 4 9 14 5 0 5 15 10 5 14 19 5 16 11 6 10 15 5 17 12 7 11 16 5 18 13 8 12 17 5 19 14 9 13 18 5 19 18 17 16 15 The "OFF" header tells us it's a polylist file. The second line in the file tells us that there are 20 vertices, 12 faces, and 30 edges. (The OOGL libraries presently don't use the edges value, so you can just use 0 if you don't happen know the number of edges.) The next 20 lines give a list of vertices. The last 12 lines specify the faces: the first number is the number of vertices in that face. Since our polyhedron happens to be regular, all faces have the same number of vertices (in this case, 5). The rest of the numbers on the line are indices into the above list of vertices. Besides being far more compact, the Polylist file format embeds connectivity information in the Geom. OOGL has no way of knowing whether any two quadrilaterals in a Quad object are connected. But with a Polylist, OOGL can interpolate normals across connected faces. The normals of an object are used to calculate shading information. Interpolated normals make an object look smooth instead of faceted. This is often desirable if you are trying to approximate a curved surface by breaking it up into small pieces. [geomview: Go ahead and load "dodec.off" without deleting the other one. Now you've got two Geoms in your world. Most actions apply to the currently picked object. When you start up geomview, the currently picked object is the whole world. You can independently control any object in the world by picking it as the target of your actions. Double-clicking the right mouse button when the mouse is over an object picks it: double-clicking the right mouse over empty space picks the whole world. You can also pick objects by clicking on the appropriate line in the Object browser. The two dodecahedra are probably superimposed. Pick one of them as your target, click on the "Translate" line in the motion browser, and move the picked object away from the center of the world with the left mouse. (To return to "Rotate" mode, click the appropriate line in the motion browser.) Now pick the whole world again and draw the normals by hitting the "Normals" button on the Appearance panel. Switch between Flat and Smooth Shading modes (by clicking in the Shading browser) and notice that the Polylist changes but the Quad doesn't. Sometimes using the mouse to click on browser lines and buttons is cumbersome. The bracketed characters shown on the control panels are keyboard shortcuts that duplicate the effect of using the mouse to click on that line or button. For instance, "an" (the "a" stands for "appearance") toggles drawing normals and "t" switches the motion to translation. In a further shortcut, you can use the prefix of an object ("g" or "c" followed by a number, as shown in brackets in the Object browser) before most commands to simultaneously pick an object and do some action to it. For instance, "g0r" lets you immediately rotate the world. ] Let's compare two ways of coloring a Polylist. facecube.off: # off file with per face color OFF 8 6 12 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 -1.0 -1.0 -1.0 1.0 1.0 -1.0 1.0 -1.0 -1.0 -1.0 1.0 -1.0 -1.0 -1.0 4 0 2 3 1 .05 .8 .1 .75 4 4 5 7 6 .2 .05 .8 .75 4 0 4 6 2 .9 .9 .02 .75 4 1 3 7 5 .0 .7 .4 .75 4 0 1 5 4 .1 .4 .7 .75 4 2 6 7 3 .7 .7 0 .75 vertcube.off: # off file with per vertex colors COFF 8 6 12 1.0 1.0 1.0 .05 .8 .1 .75 1.0 1.0 -1.0 .2 .05 .8 .75 1.0 -1.0 1.0 .9 .9 .02 .75 1.0 -1.0 -1.0 .0 .7 .4 .75 -1.0 1.0 1.0 .1 .4 .7 .75 -1.0 1.0 -1.0 .7 .7 0 .75 -1.0 -1.0 1.0 0. 0. 0. .75 -1.0 -1.0 -1.0 1. 1. 1. .75 4 0 2 3 1 4 4 5 7 6 4 0 4 6 2 4 1 3 7 5 4 0 1 5 4 4 2 6 7 3 Everything following a "#" is a comment for humans to read and is ignored by OOGL. The header for a plain Polylist file is optional, but if you have anything besides points in a vertex you do need a proper header. The object is the unit cube, which has 8 vertices, 6 faces, and 12 edges. The first has per-face coloring and the second has per-vertex coloring. A subtle point: the header for vertcube.off is "COFF" as you would expect but the header for facecube.off is just "OFF" because the header refers only to the structure of the vertices, not the entire file. [geomview: Delete everything by picking the world and hitting the Delete Object button. Now load "facecube.off" and "vertcube.off". Translate one of them away from the center so that you can see what you're doing. Switch both Polylists between Constant, Flat, and Smooth Shading modes. Shading is done according to light sources that you have control over. To play with the lights, open the Light panel by clicking on the Light line in the Inspect pull-down menu. When you hit the Show Lights button, you will see light beams that you can drag around to move the lights. You can also add, delete, change the intensity of, and change the color of lights. ] MESH The vertices of a Mesh file are connected in a rectangular grid. tent.mesh: CMESH 3 3 0 0 0 1 0 0 1 1 0 1 0 1 0 1 2 0 0 0 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 2 1 0 0 0 1 1 0 2 0 1 0 0 1 1 2 1 0 1 0 1 2 2 0 0 0 1 1 The "CMESH" header tells us that this is a Mesh file and each vertex contains both point and color information. The second line means that both the u and v dimensions of the mesh are 3, so there will be 3*3 = 9 vertices. Each vertex that's not on an outer edge is connected to its 4 surrounding neighbots by an edge. In "tent.mesh", only the point (1,1,1) is an inside point. The 9 vertices, when named (u,v), are specified in v-major order, just like an array in C: (0,0)---(1,0)---(2,0) | | | (0,1)---(1,1)---(2,1) | | | (0,2}---(1,2)---(2,2) [geomview: Delete everything and load "tent.mesh". Go into Smooth Shading mode to see each vertex with its own color so that it's obvious how the points in the file correspond with the image in the viewer. ] If you want the mesh to be closed along either (or both) of the u or v edges, insert either a "u" or "v" in the header just before the "MESH". "wraptent.mesh" CuMESH 3 3 0 0 0 1 0 0 1 1 0 1 0 1 0 1 2 0 0 0 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 2 1 0 0 0 1 1 0 2 0 1 0 0 1 1 2 1 0 1 0 1 2 2 0 0 0 1 1 [geomview: Load "wraptent.mesh" and compare the two Meshes, translating them apart from each other as necessary. ] There's an extremely efficient way to describe a mesh when the x and y coordinates match the u and v coordinates of every point. "ztent.mesh": ZMESH 3 3 0 1 0 0 1 0 0 1 0 "ztent.mesh" is exactly the same shape as "tent.mesh", although its vertices don't have any colors. The header "ZMESH" means that only the z-coordinate of each point is specified and the x and y coordinates of each point are set equal to its (u,v) position in the grid. [geomview: Load "ztent.mesh" to verify that it's really the same shape as "tent.mesh" ] VECT A Vect is a collection of polylines, which are lines with 1 or more vertices. Here's a file specifying an "X" and the x-axis in red, a "Y" and the y-axis in green, and a "Z" and the z-axis in blue. "xyz.vect": VECT 8 19 3 2 2 2 2 2 3 2 4 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 -.05 .05 1 .05 .25 1 .05 .05 1 -.05 .25 0 0 0 0 1 0 -.05 1 .25 0 1 .15 .05 1 .25 0 1 .15 0 1 .05 0 0 0 0 0 1 -.05 .25 1 .05 .25 1 -.05 .05 1 .05 .05 1 1 0 0 1 0 1 0 1 0 .6 1 1 The header is always "VECT": no letters can be tacked on the front. The second line means that there are 8 polylines, which have a total of 19 vertices and 3 colors. There is no indexing into a list of vertices like a polylist: every single vertex must be specified separately. The third line lists the number of vertices in each polyline. In "xyz.vect", the only polylines with more than 2 vertices are the upper part of the "Y", which has 3, and the "Z", which has 4. The fourth line lists the number of colors in each polyline. When a polyline has no colors it inherits the previously set color. Next come the 19 vertices: only points are allowed. Finally, the 3 colors are given on the last three lines. [geomview: Delete everything, load and look at "xyz.vect". Do the same thing for all the remaining examples. ] BEZ For those who already understand how to create parametric surface patches, the syntax of Bezier surface patches is described in the OOGL man page. The art of constructing parametric surfaces is not easily explained: thus, it is beyond the scope of this tutorial to discuss them. Lists and Insts are complex Geoms that can be used to create a hierarchical tree of objects. LIST A List is just a collection of other Geoms. "ref.list": LIST < xyz.vect < dodec.quad { = QUAD -1 -1 0 1 -1 0 1 1 0 -1 1 0} The header is always exactly "LIST". The first two subgeoms refer to other files, using the syntax " < filename ". We have omitted the optional surrounding braces. The third is a literal, or in-line, object. Although this particular syntax would still work if we left off the surrounding braces and equal sign, very similar syntax would not so we follow the "when in doubt, use braces" rule. [geomview: Geomview looks for filenames in the current directory, the pathname in the GEOMDATA environment variable, and the same directory as the file that it's currently reading. ] INST An Inst is one or more 4x4 transforms applied to another Geom. These matrices can represent all of the 3D transformations such as rotation, translation, scaling, shearing and perspective. We use 4x4 matrices instead of 3x3 matrices so that we can use homogenous coordinates and concatenate all transformations without treating translations as special cases that require adding instead of multiplying. 4x4 matrices can also be used for such operations such as 4D rotation or projective hyperbolic transformations. A linear algebra or computer graphics textbook is a good place to start if you are unfamiliar with these ideas. "ref.inst": INST geom { < ref.list } transforms { = TLIST 1 0 0 0 0 1 0 0 0 0 1 0 2 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 2 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 2 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } The header is always exactly "INST". The value following the "geom" keyword is a filename reference to "ref.list", which is the List we saw above. It could also be an in-line Geom or a handle. We surround the value with braces to avoid ambiguity. The value of the "transforms" keyword is an in-line TList. It could also be a filename reference or a handle. (See the OOGL File Formats section of the Geomview manual for specifics.) A TList is actually a full-fledged Geom, but we don't ever load a file like "foo.tlist" into the viewer because TLists are just a collection of transforms with no associated subgeom, so there's nothing to see. A transform is exactly 16 numbers. The first three are a translations: 2 units in the x, y and z directions, respectively. The last is just the identity. The length of the TList is the number of instantiations of the unit: in this case, 4. If we could not use instantiation, we would have had to compute 4 entirely new Geoms, since the actual points in space of an object are different if you move it. Since the unit of an Inst can be another Inst, you can build up a complex hierarchy. For instance, to build a solar system you only need to generate one sphere. All the planets can be scaled and translated instantiations of that single Geom. "warp.inst": INST transform { 1 0 0 0 0 9 0 0 0 0 3 0 0 0 0 1 } geom { < dodec.off } This Inst has a single transform instead of a list of them. Thus we use the keyword "transform" instead of "transforms". A transform is not a Geom, so there is no header before the 16 numbers. We could also have a handle here. (Handles are documented in the OOGL File Formats section of the Geomview manual.) Finally, we have "dodec.off" as our unit. The order of the geom and the transform/transforms is irrelevant. Postscripts: OOGL: This tutorial doesn't document binary files or object appearances. See the OOGL File Formats section of the Geomview manual for details. White space in OOGL files is mostly for the benefit of human readers. "ZMESH 3 3 0 1 0 0 1 0 0 1 0" is a legal OOGL file. The only exception is that there cannot be a line break between the last vertex index for an OFF face and the next 4 color floats. Geomview: When a Geom is loaded, it is automatically normalized to fit inside a unit cube centered around the origin. The default camera viewpoint is at {0,0,-3} looking toward the origin. To see the unaltered size and position of an object, pick the None line in the Normalize browser in the Inspect/Appearence pull-down menu. In general it doesn't matter what the coordinate range of an object is as long as the entire file is consistent: {0,1}, {-1,1}, {0,100}, {-1000,-500}, {17,36} are all valid ranges. geomview-1.9.5/doc/oogltour-pt_BR0000644000175000017500000005161712310110176013641 00000000000000Tradução usando a versão 1.4 do cvs em inglês. Tutorial: Os Formatos Geométricos de Arquivo OOGL (e do Geomview consequêntemente) OOGL é a abreviatura de Object Oriented Graphics Library (Biblioteca Gráfica Orientada a Objetos. Um objeto OOGL é chamado um Geom. Existe um formato de arquivo texto para cada tipo de Geom. Você pode chamar um arquivo texto em qualquer progama que usa o formato OOGL. Geomview é um visualizador interativo de objetos tridimensionais construído sobre o topo do OOGL. (Geomview executa sobre as palntaformas Silicon Graphics, NextStep, e X-Windows.) Existem notas do Geomview entre colchêtes ao longo deste guia dizendo a você o que fazer no Geomview para ver do que estamos falando. Posteriormente notas assumem que você tenha ambos know how para fazer e tenha realizado o que as notas anteriores disseram para você fazer. Todos os arquivos referenciados nesse documento estão no diretório de exemplos de arquivos OOGL que acompanham o Geomview. A seção Os formatos de arquivo OOGL do manual do Geomview é uma referência completa para a sintaxe dos formatos de arquivo. Esse tutorial é uma tentativa de levar você mais gentilmente ao mundo dos formatos de arquivos OOGL. ---------------------------------------------------------------------- ---------------------------------------------------------------------- QUAD Iniciamos um um objeto muito simples: um quadrado. Especificamente, o quadrado unitário no plano xy em z=0. ---------------------------------------------------------------------- "square.quad": QUAD -1 -1 0 1 -1 0 1 1 0 -1 1 0 ---------------------------------------------------------------------- O cabeçalho "QUAD" identifica o tipo de arquivo. (Você pode tambémusar o cabeçalho "POLY" para este tipo por razZões históricas.) Um arquivo QUAD é uma lista de 4*n vertices onde n é o número de quadriláteros. Esse arquivo contém somente um quadrilátero. Você também pode usar esse formato para especificar triângulos: apenas use um quadrilátero degenerado onde dois dos quatro vértices são identicos. Os vértices nesse arquivo são simples: apenas as coordenadas x,y, e z do ponto. [GEOMVIEW: Digite "geomview square.quad" de uma janela de shell sobre um Silicon Graphics Iris. Gire o quadrado em torno de si mesmo com o botão esquerdo do mouse após geomview Tê-lo carregado. Sinta-se livre para brincar com geomview por um tempo se a imaginação atingir você durante esse tutorial. ] O arquivo seguinte tem vértices mais complexos por incluirem uma cor com as coordenadas do ponto. ---------------------------------------------------------------------- "csquare.quad": CQUAD -1 -1 0 1 0 0 1 1 -1 0 0 1 0 1 1 1 0 0 1 0 1 -1 1 0 1 0 0 1 ---------------------------------------------------------------------- Esses foram os mesmos pontos do quadrado anterior, mas com dois cantos vermelhos e dois cantos verdes. O cabeçalho é agora "CQUAD" para indicar que seus vértices possuem informações de cores além das informações de ponto. Cores são especificadas pelas quádruplas (r,g,b,a) de números em ponto flutuante entre 0 e 1. Qualquer cor que pode ser mostrada na tela de um computador pode ser codificada por alguma combinação de vermelho (r), verde (g) e azul (b). A quarta componente, alfa, representa a opacidade: 0 é transparente e 1 é opaco. As plantaformas X-Window, NextStep, e some SGI ignoram a informação alfa inteiramente, mas um instantâneo Renderman irá usar a informação alfa se a transparência estiver habilitada. Algumas plantaformas SGI utilizam a informação alfa, mas a figura é garantidamente incorreta. [geomview: Apague o objeto atual pressionando o botão Delete. Para chamar csquare.quad, pressione File/Open/segunda linha do navegador de diretórios e localize o "csquare.quad" na lista dos arquivos (pressione o botão OK quando tiver terminado) dentro da caixa que aparece. Você está provavelmente surpreso porque esse quadrado está todo com uma cor somente. O modo de tonalidade de cor padrão é o tipo plano, onde cada polígono ou face poligonal é da mesma cor. Os outros dois modos de tonalidade de cor, constante e liso, irão ambos mostrar faces multicoloridas onde as cores são lisamente interpoladas entre os vértices. Tonalidade de cor constante ignora todas as informações de iluminação, enquanto tonalidade de cor lisa interpola iluminação e também coloração entre os vértices. Para mudar o modo de sombreamento, primeiro chame o painel de aparência clicando sobre a linha Aparência no navegador principal de painéis. Agora alterne de modo em modo clicando em diferentes linhas no navegador de @emph{Shading}. ] É hora de ir na direção de coisas maiores e melhores. "dodec.quad": QUAD 0 0 0.794654 0 0.491123 0.794654 0.356822 0.491123 0.794654 0.467086 0.151765 0.794654 0 0 0.794654 -0.467086 0.151765 0.794654 -0.356822 0.491123 0.794654 4.89153e-09 0.491123 0.794654 0 0 0.794654 -0.288675 -0.397327 0.794654 -0.57735 -0.187593 0.794654 -0.467086 0.151766 0.794654 0 0 0.794654 0.288675 -0.397327 0.794654 4.36694e-09 -0.607062 0.794654 -0.288675 -0.397327 0.794654 0 0 0.794654 0.467086 0.151766 0.794654 0.57735 -0.187592 0.794654 0.288675 -0.397327 0.794654 0 0.710761 0.35538 0 0.491123 0.794654 -0.356822 0.491123 0.794654 -0.467086 0.642889 0.491123 . . . < 55 lines of numbers deleted> Agora pegamos um objeto mais interessante: um dodecaedro. Uma vez que dodecaedro tem faces de 5 lados, cada uma de suas 12 faces é atualmente feita de 5 quadriláteros de um total de 20 quadriláteros nesse objeto do tipo Quad. [geomview: Apague o quadrado e chame o arquivo "dodec.quad". Uma vez que os 5 quadriláteros que formam cada face todos se ajustam perfeitamente uns aos outros, o fato de que existe realmente muitos deles em cada face é somente aparente quando as bordas são desenhadas. Para habilitar o desenho das bordas, aperte o botão "Edges" no painel de aparência. ] OFF Existe uma maneira muito mais eficiente de representar um dodecaedro. "dodec.off": OFF 20 12 30 1.214124 0.000000 1.589309 0.375185 1.154701 1.589309 -0.982247 0.713644 1.589309 -0.982247 -0.713644 1.589309 0.375185 -1.154701 1.589309 1.964494 0.000000 0.375185 0.607062 1.868345 0.375185 -1.589309 1.154701 0.375185 -1.589309 -1.154701 0.375185 0.607062 -1.868345 0.375185 1.589309 1.154701 -0.375185 -0.607062 1.868345 -0.375185 -1.964494 0.000000 -0.375185 -0.607062 -1.868345 -0.375185 1.589309 -1.154701 -0.375185 0.982247 0.713644 -1.589309 -0.375185 1.154701 -1.589309 -1.214124 0.000000 -1.589309 -0.375185 -1.154701 -1.589309 0.982247 -0.713644 -1.589309 5 0 1 2 3 4 5 0 5 10 6 1 5 1 6 11 7 2 5 2 7 12 8 3 5 3 8 13 9 4 5 4 9 14 5 0 5 15 10 5 14 19 5 16 11 6 10 15 5 17 12 7 11 16 5 18 13 8 12 17 5 19 14 9 13 18 5 19 18 17 16 15 O cabeçalho "OFF" nos diz que o arquivo dodec.off é um arquivo do tipo "polylist". A segunda linha no arquivo nos diz que existem 20 vértices, 12 faces, e 30 arestas. (As bibliotecas OOGL atualmente não utilizam os valores de arestas, de forma que você pode apenas usar 0 se acontecer de não saber o número de arestas.) As próximas 20 seguintes linhas fornecem uma lista de vértices. TAs últimas 12 linhas especificam as faces: o primeiro numero é o número de vértices naquela face. Uma vez que nosso poliedro é regular, todas as faces possuem o mesmo número de vértices (nesse caso, 5). Os números restantes na linha são indices dentro da lista de vértices acima. Juntamente com o fato de loge mais compacto, o formato de arquivo do tipo "Polylist" incorpora informação de conectividade no Geom (Objeto OOGL). OOGL não tem formas de conhecer se quaisquer dois quadriláteros em um bojeto Quad estão conectados. Mas com uma "Polylist", OOGL pode interpolar retas normais ao longo das faces conectadas. As retas normais de um objeto são usadas para calcular a informação de tonalidade de cor. Interpolated normals make an object look smooth instead of faceted. Isso é muitas vezes desejável se você estiver tentando aproximar uma superfície curva por meio da quebra da mesma em peças pequenas. [geomview: Vá adiante e chame "dodec.off" sem deletar o oddec.quad. Agora você tem dois Geoms no seu mundo. A maioria das ações aplicam-se aos objetos atualmente selecionados. Quando você inicia o geomview, os objetos atualmente selecionados é o mundo todo. Você pode independentemente controlar qualquer objeto no mundo selecionando esse objeto como alvo e suas ações. Duplo clicando o botão direito do mouse quando o mouse está sobre um objeto faz com que ele seja selecionado: duplo clicando o botão direito do mouse sobre o espaço vazio seleciona o mundo completo. Você pode também selecionar objetos clicando sobre a linha apropriada no navegador de objetos. Os dois dodecaedros estão provavelmente sobrepostos. Selecione um deles como seu alvo, clique sobre a linha "Translate" no navegador de movimentos, e mova o objeto selecionado afastando-se do centro do mundo com o botão esquerdo do mouse. (Para retornar ao modo "Rotate", clique na linha apropriada no navegador de movimento.) Agora selecione o mundo completo novamente e desenhe as normais pressionando o botão "Normals" no painel de aparência. Alterne entre os modos de sombreamento "Flat" e "Smooth" (clicando no navegador de tonalidades) e note que a "Polylist" modifica-se mas o "Quad" não se modifica. Algumas vezes usando o mouse para clicar no navegador de linhas e botões é incômodo. Os caracteres colchêtes mostram nos painéis de controle os atalhos de teclado que reproduzem o efeito de usar o mouse para clicar sobre aquela linha ou butão. Por exemplo, "an" (o "a" representa "appearance") muda o desenho de normais e "t" uda o movimento para translação. Como tecla de atalho adicional, você pode usar o prefixo de um objeto ("g" ou "c" seguido de um número, como mostrado nos parêtesis no navegador de objetos) antes da maioria dos comandos para simultâneamente selecionar um objeto e fazer alguma ação para esse objeto. Pr exemplo, "g0r" permite a você imediatamente rotacionar o mundo. ] Vamos comparar duas formas de se colorir uma "Polylist". facecube.off: # off file with per face cor OFF 8 6 12 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 -1.0 -1.0 -1.0 1.0 1.0 -1.0 1.0 -1.0 -1.0 -1.0 1.0 -1.0 -1.0 -1.0 4 0 2 3 1 .05 .8 .1 .75 4 4 5 7 6 .2 .05 .8 .75 4 0 4 6 2 .9 .9 .02 .75 4 1 3 7 5 .0 .7 .4 .75 4 0 1 5 4 .1 .4 .7 .75 4 2 6 7 3 .7 .7 0 .75 vertcube.off: # off file with per vertex cores COFF 8 6 12 1.0 1.0 1.0 .05 .8 .1 .75 1.0 1.0 -1.0 .2 .05 .8 .75 1.0 -1.0 1.0 .9 .9 .02 .75 1.0 -1.0 -1.0 .0 .7 .4 .75 -1.0 1.0 1.0 .1 .4 .7 .75 -1.0 1.0 -1.0 .7 .7 0 .75 -1.0 -1.0 1.0 0. 0. 0. .75 -1.0 -1.0 -1.0 1. 1. 1. .75 4 0 2 3 1 4 4 5 7 6 4 0 4 6 2 4 1 3 7 5 4 0 1 5 4 4 2 6 7 3 Tudo seguindo o caractere "#" é um comentário para humanos ler e é ignorado por OOGL. O cabeçalho para uma "Polylist" plana é opcional, mas se você tiver qualquer coisa ao lado de pontos em um vértice você precisará fazer um cabeçalho apropriado. O objeto é um cubo unitário, qu tem 8 vértices, 6 faces, e 12 arestas. O primeiro coloração por face e o segundo tem coloração pro vértice. Um ponto sutil: o cabeçalho para vertcube.off é "COFF" como você pode esperar mas o cabeçalho para facecube.off é apenas "OFF" por que o cabeçalho refere-se somente àestrutura dos vértices, não ao arquvo como um todo. [geomview: Apague tudo selecionando o mundo como alvo e clicando o botão delete. Agora chae "facecube.off" e "vertcube.off". Translacione um deles para adiante de centro de forma que você possa ver o que você está fazendo. Alterne ambas as "Polylists" entre os modos de tonalidade "Constant", "Flat", e "Smooth". Tonalidade é realizada conforme a fonte de luz que você controla. Para brincar com luzes, abra o painel "Light" clicando na linha "Light" no navegador de "Inspect". Quando você pressionar o botão "Show Lights", você irá ver raios luminosos que você pode arrastar ao redor para mover as luzes. Você também pode adicionar "add", apagar "delete", modificar a intensidade da, e modificar a cor das luzes. ] MESH Os vértices de um arquivo de Malha(Mesh) são conectados em uma grade retangular. tent.mesh: CMESH 3 3 0 0 0 1 0 0 1 1 0 1 0 1 0 1 2 0 0 0 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 2 1 0 0 0 1 1 0 2 0 1 0 0 1 1 2 1 0 1 0 1 2 2 0 0 0 1 1 O cabeçalho "CMESH" nos diz que esse é um arquivo de Malha e cada vértice contém ambos ponto e informação de cor. A segunda linha significa que ambas as dimensões u e v da malha são 3, então existirão 3*3 = 9 vértices. Cada vértice que não está sobre uma aresta externa está conectado a seus 4 vizinhos por uma aresta. Em "tent.mesh", somente o ponto (1,1,1) é um ponto interno. Os 9 vértices, quando chamados (u,v), são especificados na ordem crescente de v, apenas como um array em C: (0,0)---(1,0)---(2,0) | | | (0,1)---(1,1)---(2,1) | | | (0,2}---(1,2)---(2,2) [geomview: Apague tudo e chame "tent.mesh". Entre no modo de tonalidade "Smooth" (Inspect/Appearence/Shading) para ver cada vértice com sua própia cor de forma que seja óbvio como os pontos no arquivo correspondem com a imagem no visualizador. ] Se você desejar a malha seja fechada ao longo das ou (ou ambas) arestas u ou v, insira ou um "u" ou um "v" no cabeçalho apenas antes de "MESH". "wraptent.mesh" CuMESH 3 3 0 0 0 1 0 0 1 1 0 1 0 1 0 1 2 0 0 0 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 2 1 0 0 0 1 1 0 2 0 1 0 0 1 1 2 1 0 1 0 1 2 2 0 0 0 1 1 [geomview: Chame "wraptent.mesh" e compare as duas malhas, transladando-as separadamente se necessário. ] Existe uma forma extremamente eficiente de descrever uma malha quando as coordenadas x e y coincidem com as coordenadas u e v de todo ponto. "ztent.mesh": ZMESH 3 3 0 1 0 0 1 0 0 1 0 "ztent.mesh" é exatamente a mesma aparência que "tent.mesh", embora seus vértices não tenham quaisquer cores. O cabeçalho "ZMESH" significa que somente as coordenadas do eixo z de cada ponto é especificada e as coordenadas x e y de cada ponto são escolhidas para serem iguais à sua posição (u,v) na grade. [geomview: Chame "ztent.mesh" para verificar que esse arquivo realmente tem a mesma aparência que "tent.mesh" ] VECT Um vetor é uma coleção de "polylines", que são linhas com um ou mais vértices. Aqui está um arquivo especificando um "X" e o eixo x em vermelho, um "Y" e o eixo y em verde, e um "Z" e o eixo z em azul. "xyz.vect": VECT 8 19 3 2 2 2 2 2 3 2 4 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 -.05 .05 1 .05 .25 1 .05 .05 1 -.05 .25 0 0 0 0 1 0 -.05 1 .25 0 1 .15 .05 1 .25 0 1 .15 0 1 .05 0 0 0 0 0 1 -.05 .25 1 .05 .25 1 -.05 .05 1 .05 .05 1 1 0 0 1 0 1 0 1 0 .6 1 1 O cabeçalho é sempre "VECT": nenhuma letra pode ser pregada na frente. A segunda linha significa que existem 8 "polylines", que possuem um total de 19 vértices e 3 cores. Não existe indexação dentro de uma lista de vértices como uma "polylist": todo vértice simples deve ser especificado separadamente. A terceira linha lista o número de vértices em cada "polyline". Em "xyz.vect", somente "polylines" com mais que 2 vértices são a parte superior do "Y", que tem 3, e o "Z", que tem 4. A quarta linha lista o número de cores em cada "polyline". Quando uma "polyline" não possui cores essa "polyline"herda a cor previamente escolhida. A seguir vem os 19 vértices: somente pontos são permitidos. Finalmente, as 3 cores são fornecidas nas últimas três linhas. [geomview: Apague tudo, chame e olhe "xyz.vect". Faça a mesma coisa para todos os exemplos restantes. ] BEZ Para aqueles que já entenderam como criar ajustes em superfície paramétrica, a sintaxe do ajuste da superfície de Bezier é descrito página de manual da OOGL. A arte de construir superfícies paramétricas não é facilmente explicável: dessa forma, superfícies paramétricas estão dentro da abrangência deste tutorial discutí-las. "Lists" e "Insts" são Geoms complexos que podem ser usados para criar uma árvore hierárquica de objetos. LIST Uma "List" é apenas uma coleção de outros Geoms. "ref.list": LIST < xyz.vect < dodec.quad { = QUAD -1 -1 0 1 -1 0 1 1 0 -1 1 0} O cabeçalho é sempre exatamente "LIST". Os primeiros dois subgeoms referem-se a outros arquivos, usando a sintaxe " < nomearquivo ". Omitimos as chaves opcionais. O terceiro é um objeto literal, ou in-line. Embora essa sintaxe em particular possa ainda trabalhar se esquecermos as chaves e o sinal de igual, sintaxe muito similar não pode então seguimos a regra "quando tiver dúvida, use as chaves". [geomview: Geomview procura por nomes de arquivos no diretório atual, o camino de nomes na variável de ambiente GEOMDATA, e no mesmo diretório que o arquivo que está atualmente sendo lido pelo geomview. ] INST Um "Inst"é uma ou mais transformações 4x4 aplicada a outro Geom. Essas matrizes podem representar todas as transformações em 3D tais como rotação, translação, homotetia, redução e perspectiva. Usamos matrizes 4x4 em lugar de matrizes 3x3 de forma que podemos usar coordenadas homogêneas e concatenar todas as transformações sem tratar translações como casos especiais que requerem adições em lugar de multiplicações. Matrizes 4x4 podem também serem usadas para operações tais como rotações em 4D ou transformações projetivas hiperbólicas. Um livro texto de álgebra linear ou um livro texto de computação gráfica são bons lugares para iniciar seus estudos se você não está familiarizado com essas idéias. "ref.inst": INST geom { < ref.list } transforms { = TLIST 1 0 0 0 0 1 0 0 0 0 1 0 2 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 2 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 2 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } O cabeçalho é sempre exatamente "INST". O valor seguindo a palavra chave "geom" é uma referência de nome de arquivo "ref.list", que é a "List" que mostramos acima. Isso também pode ser um Geom in-line ou um manipulador. Cercamos o valor com chaves para evitar ambiguidade. O valor da palavra chave "transforms" é uma "TList" in-line. Isso também pode ser uma referência a um nome de arquivo ou um manpulador. (Veja a seção Os Formatos de Arquivo do OOGL do manual do Geomview para especificidades.) Uma "TList" é atualmente um Geom completametne fugidio, mas nós não temos mesmo que chamar um arquivo como "foo.tlist" dentro do visualizador porque "TLists" são apenas uma coleção de transformações sem subgeom associado, de forma que não há nada para ver. Uma transformação é exatamente 16 números. Os primeiros três são translações: 2 unidade nas direções x, y e z, respectivamente. O último é apenas a identidade. O comprimeto da "TList" é o número de instanciações da unidade: nesse caso, 4. Se não pudermos usar instanciação, teremos que calcular 4 Geoms inteiramente novos, uma vez que os atuais pontos no espaço de um objeto são diferentes se você movê-lo. Uma vez que a unidade de um "Inst" pode ser outro "Inst", você pode construir uma hierarquía complexa. Por exemplo, para construi um sistema solar você só precisa gerar uma esfera. Tdos os planetes pode ser instanciações de homotetias e translações da que simples Geom. "warp.inst": INST transform { 1 0 0 0 0 9 0 0 0 0 3 0 0 0 0 1 } geom { < dodec.off } Esse "Inst" tem uma transformação simples em lugar de uma lista deles. Dessa forma usamos a palavra chave "transform" em lugar da palavra chave "transforms". Um "transform" não é um Geom, de forma que não existe cabeçalho antes dos 16. Podemos também ter um manipulador aqui. (Manipuladores estão documentados na seção Formatos de Arquivo do OOGL do manual do Geomview.) Finalmente, temos "dodec.off" como nossa unidade. A ordem do geom e das "transform/transforms" é irrelevante. Postscripts: OOGL: Esse tutorial não documenta arquivos binários ou aparências de objetos. Veja a seção Formatos de Arquivo do OOGL do manual do Geomview para detalhes. Espaços em branco em arquivos OOGL ocorrem para facilitar a vida dos leitores humanos. "ZMESH 3 3 0 1 0 0 1 0 0 1 0" é um arquivo OOGL válido. A única excessão é que não pode haver um fim de linha entre o último índice de vértice para uma face tipo "OFF" e os 4 números em ponto flutuante representativos de cor. Geomview: Quando um Geom é chamado, ele automaticamente normalizado ajustar dentro de um cubo unitário centrado em torno da origem. O ponto de visualização padrào da câmera é em {0,0,-3} olhando na direção da oríge. Para ver a posição e o tamanho inalterado de um objeto, seleciona a linah "None" no navegador "Normalization" Em "Inspect/Appearence". Em geral não importa o que o intervalo de coordenadas é enquanto o arquivo inteiro for consistente: {0,1}, {-1,1}, {0,100}, {-1000,-500}, {17,36} são todos intervalos válidos. geomview-1.9.5/doc/example1.c0000644000175000017500000000373612310110175012716 00000000000000/* * example1.c: oscillating mesh * * This example module is distributed with the geomview manual. * If you are not reading this in the manual, see the "External * Modules" chapter of the manual for more details. * * This module creates an oscillating mesh. */ #include #include /* F is the function that we plot */ float F(x,y,t) float x,y,t; { float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); } main(argc, argv) char **argv; { int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t, dt; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Geomview setup. We begin by sending the command * (geometry example { : foo}) * to geomview. This tells geomview to create a geom called * "example" which is an instance of the handle "foo". */ printf("(geometry example { : foo })\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) { UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); } } /* UpdateMesh sends one mesh iteration to geomview. This consists of * a command of the form * (read geometry { define foo * MESH * ... * }) * where ... is the actual data of the mesh. This command tells * geomview to make the value of the handle "foo" be the specified * mesh. */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; { int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry { define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include #include /* for struct timeval below */ #include "forms.h" /* for FORMS library */ FL_FORM *OurForm; FL_OBJECT *VelocitySlider; float dt; /* F is the function that we plot */ float F(x,y,t) float x,y,t; { float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); } /* SetVelocity is the slider callback procedure; FORMS calls this * when the user moves the slider bar. */ void SetVelocity(FL_OBJECT *obj, long val) { dt = fl_get_slider_value(VelocitySlider); } /* Quit is the "Quit" button callback procedure; FORMS calls this * when the user clicks the "Quit" button. */ void Quit(FL_OBJECT *obj, long val) { exit(0); } /* create_form_OurForm() creates the FORMS panel by calling a bunch of * procedures in the FORMS library. This code was generated * automatically by the FORMS designer program; normally this code * would be in a separate file which you would not edit by hand. For * simplicity of this example, however, we include this code here. */ create_form_OurForm() { FL_OBJECT *obj; FL_FORM *form; OurForm = form = fl_bgn_form(FL_NO_BOX,380.0,120.0); obj = fl_add_box(FL_UP_BOX,0.0,0.0,380.0,120.0,""); VelocitySlider = obj = fl_add_valslider(FL_HOR_SLIDER,20.0,30.0, 340.0,40.0,"Velocity"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_object_align(obj,FL_ALIGN_TOP); fl_set_call_back(obj,SetVelocity,0); obj = fl_add_button(FL_NORMAL_BUTTON,290.0,75.0,70.0,35.0,"Quit"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_call_back(obj,Quit,0); fl_end_form(); } main(argc, argv) char **argv; { int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t; int fdmask; static struct timeval timeout = {0, 200000}; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Forms panel setup. */ foreground(); create_form_OurForm(); fl_set_slider_bounds(VelocitySlider, 0.0, 1.0); fl_set_slider_value(VelocitySlider, dt); fl_show_form(OurForm, FL_PLACE_SIZE, TRUE, "Example 2"); /* Geomview setup. */ printf("(geometry example { : foo })\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) { fdmask = (1 << fileno(stdin)) | (1 << qgetfd()); select(qgetfd()+1, &fdmask, NULL, NULL, &timeout); fl_check_forms(); UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); } } /* UpdateMesh sends one mesh iteration to geomview */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; { int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry { define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include "lisp.h" /* We use the OOGL lisp library */ #include "pickfunc.h" /* for PICKFUNC below */ #include "3d.h" /* for 3d geometry library */ /* boxstring gives the OOGL data to define the little box that * we draw at the pick point. NOTE: It is very important to * have a newline at the end of the OFF object in this string. */ char boxstring[] = "\ INST\n\ transform\n\ .04 0 0 0\n\ 0 .04 0 0\n\ 0 0 .04 0\n\ 0 0 0 1\n\ geom\n\ OFF\n\ 8 6 12\n\ \n\ -.5 -.5 -.5 # 0 \n\ .5 -.5 -.5 # 1 \n\ .5 .5 -.5 # 2 \n\ -.5 .5 -.5 # 3 \n\ -.5 -.5 .5 # 4 \n\ .5 -.5 .5 # 5 \n\ .5 .5 .5 # 6 \n\ -.5 .5 .5 # 7 \n\ \n\ 4 0 1 2 3\n\ 4 4 5 6 7\n\ 4 2 3 7 6\n\ 4 0 1 5 4\n\ 4 0 4 7 3\n\ 4 1 2 6 5\n"; progn() { printf("(progn\n"); } endprogn() { printf(")\n"); fflush(stdout); } Initialize() { extern LObject *Lpick(); /* This is defined by PICKFUNC below but must */ /* be used in the following LDefun() call */ LInit(); LDefun("pick", Lpick, NULL); progn(); { /* Define handle "littlebox" for use later */ printf("(read geometry { define littlebox { %s }})\n", boxstring); /* Express interest in pick events; see geomview manual for explanation. */ printf("(interest (pick world * * * * nil nil nil nil nil))\n"); /* Define "pick" object, initially the empty list (= null object). * We replace this later upon receiving a pick event. */ printf("(geometry \"pick\" { LIST } )\n"); /* Make the "pick" object be non-pickable. */ printf("(pickable \"pick\" no)\n"); /* Turn off normalization, so that our pick object will appear in the * right place. */ printf("(normalization \"pick\" none)\n"); /* Don't draw the pick object's bounding box. */ printf("(bbox-draw \"pick\" off)\n"); } endprogn(); } /* The following is a macro call that defines a procedure called * Lpick(). The reason for doing this in a macro is that that macro * encapsulates a lot of necessary stuff that would be the same for * this procedure in any program. If you write a geomview module that * wants to know about user pick events you can just copy this macro * call and change the body to suit your needs; the body is the last * argument to the macro and is delimited by curly braces. * * The first argument to the macro is the name of the procedure to * be defined, "Lpick". * * The next two arguments are numbers which specify the sizes that * certain arrays inside the body of the procedure should have. * These arrays are used for storing the face and path information * of the picked object. In this module we don't care about this * information so we declare them to have length 1, the minimum * allowed. * * The last argument is a block of code to be executed when the module * receives a pick event. In this body you can refer to certain local * variables that hold information about the pick. For details see * Example 3 in the Extenal Modules chapter of the geomview manual. */ PICKFUNC(Lpick, { handle_pick(pn>0, &point, vn>0, &vertex, en>0, edge); }, /* ND-stuff */) handle_pick(picked, p, vert, v, edge, e) int picked; /* was something actually picked? */ int vert; /* was the pick near a vertex? */ int edge; /* was the pick near an edge? */ HPoint3 *p; /* coords of pick point */ HPoint3 *v; /* coords of picked vertex */ HPoint3 e[2]; /* coords of endpoints of picked edge */ { Normalize(&e[0]); /* Normalize makes 4th coord 1.0 */ Normalize(&e[1]); Normalize(p); progn(); { if (!picked) { printf("(geometry \"pick\" { LIST } )\n"); } else { /* * Put the box in place, and color it magenta if it's on a vertex, * yellow if not. */ printf("(xform-set pick { 1 0 0 0 0 1 0 0 0 0 1 0 %g %g %g 1 })\n", p->x, p->y, p->z); printf("(geometry \"pick\"\n"); if (vert) printf("{ appearance { material { diffuse 1 0 1 } }\n"); else printf("{ appearance { material { diffuse 1 1 0 } }\n"); printf(" { LIST { :littlebox }\n"); /* * If it's on an edge and not a vertex, mark the edge * with cyan boxes at the endpoins and a yellow line * along the edge. */ if (edge && !vert) { e[0].x -= p->x; e[0].y -= p->y; e[0].z -= p->z; e[1].x -= p->x; e[1].y -= p->y; e[1].z -= p->z; printf("{ appearance { material { diffuse 0 1 1 } }\n\ LIST\n\ { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\ { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\ { VECT\n\ 1 2 1\n\ 2\n\ 1\n\ %f %f %f\n\ %f %f %f\n\ 1 1 0 1\n\ }\n\ }\n", e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z, e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z); } printf(" }\n }\n)\n"); } } endprogn(); } Normalize(HPoint3 *p) { if (p->w != 0) { p->x /= p->w; p->y /= p->w; p->z /= p->w; p->w = 1; } } main() { Lake *lake; LObject *lit, *val; extern char *getenv(); Initialize(); lake = LakeDefine(stdin, stdout, NULL); while (!feof(stdin)) { /* Parse next lisp expression from stdin. */ lit = LSexpr(lake); /* Evaluate that expression; this is where Lpick() gets called. */ val = LEval(lit); /* Free the two expressions from above. */ LFree(lit); LFree(val); } } geomview-1.9.5/doc/example4.tcl0000644000175000017500000000703612310110175013256 00000000000000#! /usr/local/bin/wish4.0 proc readsomething {} { if {[gets stdin line] < 0} { puts stderr "EOF on input, exiting..." exit } # Translate geomview's lisp-style ()'s into tcl-friendly {} braces. regsub -all {\(} $line "\{" line regsub -all {\)} $line "\}" line # Strip outermost set of braces set stuff [lindex $line 0] # invoke handler for whichever command we got switch [lindex $stuff 0] { pick {handlepick $stuff} rawevent {handlekey $stuff} } } # Having asked for notification of these raw events, we report when # the user pressed these keys in the geomview graphics windows. proc handlekey {event} { global lastincr switch [lindex $event 1] { 32 {msg "Pressed space bar"} 8 {msg "Pressed backspace key"} # Backspace: decrement it. } } # Fields of a "pick" response, from geomview manual: # (pick COORDSYS GEOMID G V E F P VI EI FI) # The pick command is executed internally in response to pick # events (right mouse double click). # # COORDSYS = coordinate system in which coordinates of the following # arguments are specified. This can be: # world: world coord sys # self: coord sys of the picked geom (GEOMID) # primitive: coord sys of the actual primitive within # the picked geom where the pick occurred. # GEOMID = id of picked geom # G = picked point (actual intersection of pick ray with object) # V = picked vertex, if any # E = picked edge, if any # F = picked face # P = path to picked primitive [0 or more] # VI = index of picked vertex in primitive # EI = list of indices of endpoints of picked edge, if any # FI = index of picked face # User picked something. # proc handlepick {pick} { global nameof selvert seledge order set obj [lindex $pick 2] set xyzw [lindex $pick 3] set fv [lindex $pick 6] set vi [lindex $pick 8] set ei [lindex $pick 9] set fi [lindex $pick 10] # Report result. set w [lindex $xyzw 3] set x [expr [lindex $xyzw 0]/$w] set y [expr [lindex $xyzw 1]/$w] set z [expr [lindex $xyzw 2]/$w] set s "$x $y $z " if {$vi >= 0} { set s "$s vertex #$vi" } if {$ei != {}} { set s "$s edge [lindex $ei 0]-[lindex $ei 1]" } if {$fi != -1} { set s "$s face #$fi ([expr [llength $fv]/4]-gon)" } msg $s } proc loadobject {fname} { if {$fname != ""} { puts "(geometry thing < $fname)" # Be sure to flush output to ensure geomview receives this now! flush stdout } } # # Display a message on the control panel # proc msg {str} { global msgtext puts stderr $str set msgtext $str update } # Build "user interface" # This doesn't need to be an entry box, but we want to be able to # use X selection to copy text from it. entry .msg -textvariable msgtext -width 30 pack .msg -fill x -expand true frame .f label .f.l -text "File to load:" pack .f.l -side left entry .f.ent -textvariable fname pack .f.ent -side left -expand true -fill x pack .f bind .f.ent { loadobject $fname } # End UI definition. # Call "readsomething" when data arrives from geomview. fileevent stdin readable {readsomething} # Geomview initialization puts { (interest (pick primitive)) (interest (rawevent 32)) (interest (rawevent 8)) (geometry thing < hdodec.off) (normalization world none) } flush stdout wm title . {Sample external module} msg "Click right mouse in graphics window" geomview-1.9.5/doc/OOGL.m.txt0000644000175000017500000004164012310110175012566 00000000000000 NOTE: This file is autogenerated from the Geomview manual. For references to things not in this file, see the manual. The manual is distributed in the "doc" subdirectory. Mathematica Graphics in Geomview or RenderMan ********************************************* Geomview comes with some Mathematica packages that let you use use Geomview to display Mathematica graphics. Mathematica is a commercial mathematical software system available from Wolfram Research, Inc. There are two ways to do this. 1. Use Mathematica to write a graphics object to a file in OOGL format or in RIB format. 2. Use Geomview as the default display for all 3D graphics output in Mathematica. You can also use these packages to save Mathematica graphics in RenderMan (RIB) format. Since the format of Mathematica graphics objects is different from the OOGL formats, both of these methods involve translating Mathematica graphics to OOGL format. Geomview is distributed with a Mathematica package which does this translation. Before doing either of the above you must install this package. Using Mathematica to generate OOGL files ======================================== The package `OOGL.m' allows Mathematica to write graphics objects in OOGL format. To use it, give the command `<< OOGL.m' to Mathematica to load the package. The `WriteOOGL[FILE,GRAPHICS]' command writes an OOGL description of the 3D graphics object GRAPHICS to the file named FILE. This package also provides the `Geomview' command which sends a 3D graphics object to Geomview. The first time you use this command it starts up a copy of Geomview. Later calls send the graphics to the same Geomview. There are two ways to use the `Geomview' command. `Geomview[GRAPHICS]' Sends the 3D graphics object GRAPHICS to Geomview as a geom named `Mathematica'. Subsequent usage of `Geomview[GRAPHICS]' replaces the `Mathematica' object in Geomview with the new GRAPHICS. ``Geomview[NAME,GRAPHICS]'' Sends the 3D graphics object GRAPHICS to Geomview as a geom named NAME. You can use multiple calls of this form with different names to cause Geomview to display several Mathematica objects at once and allow independent control over them. % math Mathematica 2.0 for SGI Iris Copyright 1988-91 Wolfram Research, Inc. -- GL graphics initialized -- In[1] := <"riemann"] This displays the graphics `%3' on the remote host named `riemann'. `Geomview' recognizes the string `"local"' as a value for `$DisplayHost'; it forces the graphics to be displayed on the local machine. In addition to knowing the name of the machine you want to run Geomview on, the `Geomview' needs to know the type of that machine (SGI or NeXT). By default, `Geomview' assumes that it is the same kind of computer as the one you are running Mathematica on. The `MachType' option lets you explicitly specify the type of the `DisplayHost' computer; it should be one of the strings `"sgi"' or `"next"'. You can use `SetOptions' to change the default `DisplayHost' and `MachType'. For example, In[4] := SetOptions[Geomview, DisplayHost->"riemann", MachType->"sgi"] arranges for `Geomview' to run Geomview on an SGI workstation named `riemann'. Transporting Mathematica Files to Geomview by Hand -------------------------------------------------- The auxilliary function `WriteChunk' is for those who can only use Mathematica on a non-Unix machine (Mac, PC) or a Unix machine that is not on a network with an SGI or NeXT. `WriteChunk[FILE, GRAPHICS]' generates a file named FILE which contains the graphics object GRAPHICS in the format accepted by `math2oogl'. You can transfer that file to a computer that has Geomview installed on it and then use the programs `math2oogl', `oogl2rib', and `geomview' directly from the shell. These programs are distributed in the `bin/sgi' (on SGIs) or `bin/next' (on NeXTs) subdirectory of the Geomview directory, and may have been installed so that they are on your `path'. In[1]:= < mma.oogl to convert it to the OOGL file `mma.oogl' which you can then view using Geomview. This is the equivalent of the `WriteOOGL' command. For a result equivalent to the `Geomview' or `Show' commands, type math2oogl -togeomview Mathematica geomview < mychunk The `WriteRIB' command can be emulated from the shell as math2oogl < mychunk | oogl2rib -n mma.tiff Details of the Mathematica->Geomview Package ============================================ The `OOGL.m' package uses the external program `math2oogl' to convert `Graphics3D' objects to OOGL format, because a compiled external program is able to do this conversion many times faster than Mathematica. The converter will sometimes handle colored SurfaceGraphics objects correctly that Mathematica does not handle correctly, which means that Geomview[object] sometimes works where Show[object] will give errors. The converter supports the `Polygon', `Line', and `Point' graphics primitives, `RGBColor Graphics3D' directives, and `SurfaceGraphics' objects with or without `RGBColor' directives, and lists of any combination of these. It silently ignores all other directives. The Mathematica to RenderMan conversion is actually a two-step process: Mathematica->OOGL (math2oogl), and OOGL->RenderMan (oogl2rib). The math2oogl program has only been tested on SGIs and NeXTs, but could theoretically compile on any machine. The oogl2rib program depends on the OOGL (Object Oriented Graphics Language) libraries, which now only exist on SGI and NeXT machines. In the `WriteOOGL' and `WriteRIB' commands, filename can either be a string containing a filename, an `OutputStream' object, or a string starting with a `!' to send the output to a command. Object can be a `Graphics3D' object, a `SurfaceGraphics' object, or a list of these. The packages work best with Mathematica 2.0 or better. With version 1.2, the Geomview display is always on the local host. Installing the Mathematica Packages =================================== If Geomview is properly installed on your system according to the instructions in *Note Installation::, then the Mathematica-to-Geomview packages should work as described here; there should be no need for additional installation procedures. In practice, however, it is sometimes necessary to taylor the installation of the Mathematica packages and/or of Geomview itself to suit the needs of a particular system. This section contains details about how the installation works; if the Mathematica-to-Geomview connection does not seem to work for you after following the Geomview installation procedure, consult this section to see what might need to be fixed. In this section, the phrase *Geomview installation* refers any of the procedures in *Note Installation::. The way the Mathematica packages work and are installed is the same regardless of whether you have one of the binary distributions or the source distribution. 1. The relevant mathematica files are `OOGL.m', `Geomview.m', and `BezierPlot.m'; Mathematica must be able to find these files. They are distributed in the `$GEOMROOT/mathematica' subdirectory of the binary distributions, and in the `$GEOMROOT/src/bin/geomutil/math2oogl' subdirectory of the source distribution. These files need to be in a directory that is on Mathematica's search path. You can look at the value of the `$Path' variable in a Mathematica session on your system to see a list of the directories on Mathematica's search path. The Geomview installation procedure puts copies of the Mathematica packages into a directory that you specify (`MMAPACKAGEDIR'). This should ensure that Mathematica can find them. Alternately, you could arrange to append the pathname of the Mathmematica package subdirectory of the Geomview distribution to the `$Path' variable each time you run Mathematica. 2. The package `OOGL.m' needs to be able to invoke the programs `geomview', `math2oogl', and `oogl2rib'. The Geomview installation procedure installs these programs into a directory that you specify for executables (`BINDIR'). Ideally, this directory should be on your shell's `$path'. More specifically, it should be on the `$path' of the shell in which Mathematica runs; the directory `/usr/local/bin' is usually a good choice. You can see the list of directories on this path by giving the command `!echo $path' in Mathematica. If for some reason you can't arrange for `geomview', `math2oogl', and `oogl2rib' to be in a directory on the shell's `$path', you can modify `OOGL.m' to cause it to look for them using absolute pathnames. To do this, change the definitions of the variables `$GeomviewPath' and `$GeomRoot', which are defined near the top of the file. Change `$GeomviewPath' to the absolute pathname of the `geomview' shell script on your system. Change `$GeomRoot' to the absolute pathname of the `$GEOMROOT' directory on your system. If you do this, you should also make sure there are copies of `geomview', `math2oogl', and `oogl2rib' in the `$GEOMROOT/bin/sgi' (on an SGI) or `$GEOMROOT/bin/next' (on a NeXT) directory. 3. The `geomview' shell script, which `OOGL.m' uses to invoke Geomview, needs to be able to find the geomview executable file (which is called `gvx' on the SGI and `Geomview.app/Geomview' on the NeXT). The Geomview installation procedure should have been taken care of this, but if your Mathematica session doesn't seem to be able to invoke Geomview, it's worth double-checking that the settings in the `geomview' script are correct. geomview-1.9.5/doc/motion.tex0000644000175000017500000000647012310110176013064 00000000000000\magnification=\magstep2 \centerline{Mathematical Formulas for Geomview's Motion Model} \centerline{Mark Phillips \& Nathaniel Thurston} \smallskip \centerline{Originally written sometime around late 1992} \centerline{Updated in March 2001} \bigskip The model that Geomview uses for object motions involves 3 objects for each motion: a {\it moving} object, a {\it center} object, and a {\it frame} object. As the name suggests, the {\it moving} object is the one that actually moves. The motion happens in an imaginary coordinate system obtained by (parallel) translating the coordinate system of the {\it frame} object to the origin of the {\it center} object coordinate system. To compute and apply a motion, we think of it as happening in this imaginary coordinate system (e.g. a ``rotation of 10 degrees around the X axis''). But we want to apply it to the {\it moving} object, which we have in its own coordinate system. This note explains how to do this. First, some notation. Think of a Geomview world as a copy of ${\bf R}^3$ with many different coordinate system representations. If $S$ is a coordinate system and $x \in {\bf R}^3$ is a point, we write $[x]_S$ to denote the coordinates of $x$ in $S$. Also, if $V: {\bf R}^3 \rightarrow {\bf R}^3$ is a projective transformation of ${\bf R}^3$, write $[V]_S$ to denote the ($4 \times 4$) matrix that represents $V$ in $S$. Let \smallskip \halign{\indent\indent#&#&#\hfil\cr $m$ & = & coord sys of moving object\cr $c$ & = & coord sys of center object\cr $f$ & = & coord sys of frame object\cr $f'$ & = & $f$ translated to origin of $c$\cr $U$ & = & universal coord sys\cr } \smallskip With this notation we can now precisely state the problem: If $V$ is a transformation, express $[V]_m$ in terms of $[V]_{f'}$. (We know $[V]_{f'}$ and need to compute $[V]_m$.) To do the computation we will need several change-of-coordinate matrices. If $S$ is a coordinate system, let $T_S$ be the matrix which changes $S$ coordinates into $U$ (universal) coordinates. So: \smallskip \halign{\indent\indent#&#&#&#\cr $[x]_U$ &= & $[x]_m$ & $\cdot \quad T_m$\cr $[x]_U$ &= & $[x]_c$ & $\cdot \quad T_c$\cr $[x]_U$ &= & $[x]_f$ & $\cdot \quad T_f$\cr $[x]_U$ &= & $[x]_{f'}$ & $\cdot \quad T_{f'}$\cr } \smallskip \noindent $T_m$, $T_c$, and $T_f$ can easily be computed from the position of $m$, $c$, and $f$ in the world heirarchy. $T_{f'}$ can be computed as follows. Let $p$ be the origin of $c$; so $[p]_c = [0, 0, 0, 1]$. The coordinates of $p$ in $f$ are \smallskip \halign{\indent\indent#&#&#&#\hfil\cr $[p]_f$ &= & $[p]_c $ & $\cdot T_c \cdot T_{f}^{-1}$\cr &= & $[0, 0, 0, 1] $ & $\cdot T_c \cdot T_{f}^{-1}$\cr } \smallskip \noindent If $P$ is the translation that takes the origin of $f$ to $p$, then $[P]_f$ is the matrix whose bottom row is $[p]_f$. Then $T_{f'} = [P]_f \cdot T_f$. (Another way to think of this is that $[P]_f$ is the matrix which changes $f'$ coordinates into $f$ coordinates.) $[V]_m$ can now be computed in terms of $[V]_{f'}$ as follows: \smallskip \halign{\indent\indent#&#&#&#&#&#&#\hfill\cr $[V]_m$ & = & $T_m \cdot$ & $T_{f'}^{-1}$ & $\cdot [V]_{f'}$ & $\cdot T_{f'}$ & $\cdot T_m^{-1}$\cr $[V]_m$ & = & $T_m \cdot$ & $T_f^{-1} \cdot {[P]_f}^{-1}$ & $\cdot [V]_{f'}$ & $\cdot [P]_f \cdot T_f$ & $\cdot T_m^{-1}$\cr } \end geomview-1.9.5/doc/geomview.5gv0000644000175000017500000014440012310110176013276 00000000000000 Geomview(5gv) Geomview(5gv) NAME Geomview - Geomview command language NOTE The material in this manual page also appears in the Geomview manual. DESCRIPTION gcl: the Geomview Command Language ********************************** Gcl has the syntax of lisp -- i.e. an expression of the form (f a b ...) means pass the values of a, b, ... to the function f. Gcl is very limited and is by no means an implementation of lisp. It is simply a language for expressing commands to be executed in the order given, rather than a programming language. It does not support variable or function definition. Gcl is the language that Geomview understands for files that it loads as well as for communication with other programs. To execute a gcl command interactively, you can bring up the *Commands* panel which lets you type in a command; Geomview executes the command when you hit the return key. Output from such commands is printed to standard output. Alternately, you can invoke Geomview as `geomview -c -' which causes it to read gcl commands from standard input. Gcl functions return a value, and you can nest function calls in ways which use this returned value. For example (f (g a b)) evaluates `(g a b)' and then evaluates `(f x)' where `x' is the result returned by `(g a b)'. Geomview maintains these return values internally but does not normally print them out. To print out a return value pass it to the `echo' function. For example the `geomview-version' function returns a string representing the version of Geomview that is running, and (echo (geomview-version)) prints out this string. Many functions simply return `t' for success or `nil' for failure; this is the case if the documentation for the function does not indicate otherwise. These are the lisp symbols for true and false, respectively. (They correspond to the C variables `Lt' and `Lnil' which you are likely to see if you look at the source code for Geomview or some of the external modules.) In the descriptions of the commands below several references are made to "OOGL" formats. OOGL is the data description language that Geomview uses for describing geometry, cameras, appearances, and other basic objects. For details of the OOGL formats, *Note OOGL File Formats::. (Or equivalently, see the oogl(5) manual page, distributed with Geomview in the file man/cat5/oogl.5. The gcl commands and argument types are listed below. Most Geometry Center Thu Dec 12 02:41:23 CST 1996 1 Geomview(5) Geomview(5) of the documentation in this section of the manual is available within Geomview via the `?' and `??' commands. The command `(? COMMAND)' causes Geomview to print out a one-line summary of the syntax of COMMAND, and `(?? COMMAND)' prints out an explanation of what COMMAND does. You can include the wild-card character `*' in COMMAND to print information for a group of commands matching a pattern. For example, `(?? *emodule*)' will print all information about all commands containing the string `emodule'. `(? *)' will print a short list of all commands. Conventions Used In Describing Argument Types ============================================= The following symbols are used to describe argument types in the documentation for gcl functions. `APPEARANCE' is an OOGL appearance specification. `CAM-ID' is an ID that refers to a camera. `CAMERA' is an OOGL camera specification. `GEOM-ID' is an ID that refers to a geometry. `GEOMETRY' is an OOGL geometry specification. `ID' is a string which names a geometry or camera. Besides those you create, valid ones are: ``World, world, worldgeom, g0'' the collection of all geom's `target' selected target object (cam or geom) `center' selected center-of-motion object `targetcam' last selected target camera `targetgeom' last selected target geom `focus' camera where cursor is (or most recently was) Geometry Center Thu Dec 12 02:41:23 CST 1996 2 Geomview(5) Geomview(5) `allgeoms' all geom objects `allcams' all cameras ``default, defaultcam, prototype'' future cameras inherit default's settings The following IDs are used to name coordinate systems, e.g. in `pick' and `write' commands: ``World, world, worldgeom, g0'' the world, within which all other geoms live. `universe ' the universe, in which the World, lights and cameras live. Cameras' world2cam transforms might better be called universe2cam, etc. `self' "this Geomview object". Transform from an object to `self' is the identity; writing its geometry gives the object itself with no enclosing transform; picked points appear in the object's coordinates. `primitive' (for `pick' only) Picked points appear in the coordinate system of the lowest-level OOGL primitive. A name is also an acceptable id. Given names are made unique by appending numbers if necessary (i.e. `foo<2>'). Every geom is also named g[n] and every camera is also named c[n] (`g0' is always the worldgeom): this name is used as a prefix to keyboard commands and can also be used as a gcl id. Numbers are reused after an object is deleted. Both names are shown in the Object browser. `STATEMENT' represents a function call. Function calls have the form `(func arg1 arg2 ... )', where `func' is the name of the function and `arg1', `arg2', ... are the arguments. `TRANSFORM' is an OOGL 4x4 transformation matrix. `WINDOW' is an OOGL winddow specification. Gcl Reference Guide =================== Geometry Center Thu Dec 12 02:41:23 CST 1996 3 Geomview(5) Geomview(5) `! is a synonym for `shell'' `(< EXPR1 EXPR2)' Returns t if EXPR1 is less than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings. `(= EXPR1 EXPR2)' Returns t if EXPR1 is equal to EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings. `(> EXPR1 EXPR2)' Returns t if EXPR1 is greater than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings. `(? [command])' Gives one-line usage summary for `command'. Command may include `*'s as wildcards; see also `??' One-line command help; lists names only if multiple commands match. ? is a synonym for `help' `(?? command) `command' may include `*' wildcards' Prints more info than `(? command)'. ?? is a synonym for `morehelp'. `| is a synonym for `emodule-run'.' `(all geometry) returns a list of names of all geometry objects.' Use e.g. `(echo (all geometry))' to print such a list. `(all camera) returns a list of names of all cameras.' `(all emodule defined) returns a list of all defined external modules.' `(all emodule running) returns a list of all running external modules.' `(ap-override [on|off])' Selects whether appearance controls should override objects' own settings. On by default. With no arguments, returns current setting. `(backcolor CAM-ID R G B)' Set the background color of CAM-ID; R G B are numbers between 0 and 1. `(background-image CAM-ID [FILENAME])' Use the given image as the background of camera CAM-ID (which must be a real camera, not `default' or `allcams'). Centers the image on the window area. Works only with GL and OpenGL graphics. Use "" for filename to remove background. With no filename argument, returns name of that window's current background image, or "". Any file type acceptable as a texture is allowed, e.g. .ppm.gz, .sgi, etc. `(bbox-color GEOM-ID R G B)' Set the bounding-box color of GEOM-ID; R G B are numbers between 0 and 1. `(bbox-draw GEOM-ID [yes|no])' Say whether GEOM-ID's bounding-box should be drawn; `yes' if omitted. Geometry Center Thu Dec 12 02:41:23 CST 1996 4 Geomview(5) Geomview(5) `(camera CAM-ID [CAMERA])' Specify data for CAM-ID; CAMERA is a string giving an OOGL camera specification. If no camera CAM-ID exists, it is created; in this case, the second argument is optional, and if omitted, a default camera is used. See also: new-camera. `(camera-draw CAM-ID [yes|no])' Say whether or not cameras should be drawn in CAM-ID; `yes' if omitted. `(camera-prop { geometry object } [projective])' Specify the object to be shown when drawing other cameras. By default, this object is drawn with its origin at the camera, and with the camera looking toward the object's -Z axis. With the `projective' keyword, the camera's viewing projection is also applied to the object; this places the object's Z=-1 and Z=+1 at near and far clipping planes, with the viewing area -1<={X,Y}<=+1. Example: (camera-prop { < cube } projective) `(camera-reset CAM-ID)' Reset CAM-ID to its default value. `(car LIST)' returns the first element of LIST. `(cdr LIST)' returns the list obtained by removing the first element of LIST. `(clock)' Returns the current time, in seconds, as shown by this stream's clock. See also set-clock and sleep-until. `(command INFILE [OUTFILE])' Read commands from INFILE; send corresponding responses (e.g. anything written to filename `-') to OUTFILE, stdout by default. `(copy [ID] [name])' Copies an object or camera. If ID is not specified, it is assumed to be targetgeom. If name is not specified, it is assumed to be the same as the name of ID. `(cursor-still [INT])' Sets the number of microseconds for which the cursor must not move to register as holding still. If INT is not specified, the value will be reset to the default. `(cursor-twitch [INT])' Sets the distance which the cursor must not move (in x or y) to register as holding still. If INT is not specified, the value will be reset to the default. `(delete ID)' Delete object or camera ID. Geometry Center Thu Dec 12 02:41:23 CST 1996 5 Geomview(5) Geomview(5) `(dice GEOM-ID N)' Dice any Bezier patches within GEOM-ID into NxN meshes; default 10. See also the appearance attribute `dice', which makes this command obsolete. `(dimension [N])' Sets or reads the space dimension for N-dimensional viewing. (Since calculations are done using homogeneous coordinates, this means matrices are (N+1)x(N+1).) With no arguments, returns the current dimension, or 0 if N-dimensional viewing has not been enabled. `(dither CAM-ID {on|off|toggle})' Turn dithering on or off in that camera. `(draw CAM-ID)' Draw the view in CAM-ID, if it needs redrawing. See also `redraw'. `(echo ...)' Write the given data to the special file `-'. Strings are written literally; lisp expressions are evaluated and their values written. If received from an external program, `echo' sends to the program's input. Otherwise writes to geomview's own standard output (typically the terminal). `(emodule-clear)' Clears the geomview application (external module) browser. `(emodule-define NAME SHELL-COMMAND ...)' Define an external module called NAME, which then appears in the external-module browser. The SHELL-COMMAND string is a UNIX shell command which invokes the module. See emodule-run for discussion of external modules. `(emodule-defined `modulename')' If the given external-module name is known, returns the name of the program invoked when it's run as a quoted string; otherwise returns nil. `(echo (emodule-defined `name'))' prints the string. `(emodule-isrunning NAME)' Returns Lt if the emodule NAME is running, or Lnil if it is not running. NAME is searched for in the names as they appear in the browser and in the shell commands used to execute the external modules (not including arguments). `(emodule-path)' Returns the current search path for external modules. Note: to actually see the value returned by this function you should wrap it in a call to echo: (echo (emodule-path)). See also set-emodule-path. `(emodule-run SHELL-COMMAND ARGS...)' Runs the given SHELL-COMMAND (a string containing a UNIX shell command) as an external module. The module's standard output Geometry Center Thu Dec 12 02:41:23 CST 1996 6 Geomview(5) Geomview(5) is taken as geomview commands; responses (written to filename `-') are sent to the module's standard input. The shell command is interpreted by /bin/sh, so e.g. I/O redirection may be used; a program which prompts the user for input from the terminal could be run with: (emodule-run yourprogram <&2) If not already set, the environment variable $MACHTYPE is set to the name of the machine type. Input and output connections to geomview are dropped when the shell command terminates. Clicking on a running program's module-browser entry sends the signal SIGHUP to the program. For this to work, programs should avoid running in the background; those using FORMS or GL should call foreground() before the first FORMS or winopen() call. See also emodule-define, emodule-start. `(emodule-sort)' Sorts the modules in the application browser alphabetically. `(emodule-start NAME)' Starts the external module NAME, defined by emodule-define. Equivalent to clicking on the corresponding module-browser entry. `(emodule-transmit NAME LIST)' Places LIST into external module NAME's standard input. NAME is searched for in the names of the modules as they appear in the External Modules browser and then in the shell commands used to execute the external modules. Does nothing if modname is not running. `(escale GEOM-ID FACTOR)' Same as scale but multiplies by exp(scale). Obsolete. `(event-keys {on|off})' Turn keyboard events on or off to enable/disable keyboard shortcuts. `(event-mode MODESTRING)' Set the mouse event (motion) mode; MODESTRING should be one of the following strings: 1. "[r] Rotate" 2. "[t] Translate" 3. "[z] Cam Zoom" 4. "[s] Geom Scale" 5. "[f] Cam Fly" 6. "[o] Cam Orbit" 7. "[le] Edit Lights" `(event-pick {on|off})' Turn picking on or off. `(evert GEOM-ID [yes|no])' Set the normal eversion state of GEOM-ID. If the second argument is omitted, toggle the eversion state. `(exit)' Terminates geomview. `(ezoom GEOM-ID FACTOR)' Same as zoom but multiplies by exp(zoom). Obsolete. `(freeze CAM-ID)' Geometry Center Thu Dec 12 02:41:23 CST 1996 7 Geomview(5) Geomview(5) Freeze CAM-ID; drawing in this camera's window is turned off until it is explicitly redrawn with `(redraw CAM-ID)', after which time drawing resumes as normal. `(geometry GEOM-ID [GEOMETRY])' Specify the geometry for GEOM-ID. GEOMETRY is a string giving an OOGL geometry specification. If no object called GEOM-ID exists, it is created; in this case the GEOMETRY argument is optional, and if omitted, the new object GEOM-ID is given an empty geometry. `(geomview-version)' Returns a string representing the version of geomview that is running. `(hdefine `geometry'|`camera'|`transform'|`window' name value)' Sets the value of a handle of a given type. (hdefine ) is generally equivalent to (read { define }) except that the assignment is done when hdefine is executed, (possibly not at all if inside a conditional statement), while the `read ... define' performs assignment as soon as the text is read. `(help [command])' Command may include `*'s as wildcards; see also `??' One-line command help; lists names only if multiple commands match. `(hmodel CAMID {virtual|projective|conformal})' Set the model used to display geometry in this camera; see also `space'. `(hsphere-draw CAMID [yes|no])' Say whether to draw a unit sphere: the sphere at infinity in hyperbolic space, and a reference sphere in Euclidean and spherical spaces. If the second argument is omitted, `yes' is assumed. `(if TEST EXPR1 [EXPR2])' Evaluates TEST; if TEST returns a non-nil value, returns the value of EXPR1. If TEST returns nil, returns the value of EXPR2 if EXPR2 is present, otherwise returns nil. `(inhibit-warning STRING)' Inhibit warning inhbits geomview from displaying a particular warning message determined by STRING. At present there are no warning messages that this applies to, so this command is rather useless. `(input-translator "#prefix_string" "Bourne-shell-command")' Defines an external translation program for special input types. When asked to read a file which begins with the specified string, geomview invokes that program with standard input coming from the given file. Geometry Center Thu Dec 12 02:41:23 CST 1996 8 Geomview(5) Geomview(5) The program is expected to emit OOGL geometric data to its standard output. In this implementation, only prefixes beginning with # are recognized. Useful as in (input-translator "#VRML" "vrml2oogl") `(interest (COMMAND [args]))' Allows you to express interest in a command. When geomview executes that command in the future it will echo it to the communication pool from which the interest command came. COMMAND can be any command. Args specify restrictions on the values of the arguments; if args are present in the interest command, geomview will only echo calls to the command in which the arguments match those given in the interest command. Two special argument values may appear in the argument list. `*' matches any value. `nil' matches any value but supresses the reporting of that value; its value is reported as `nil'. The purpose of the interest command is to allow external modules to find out about things happening inside geomview. For example, a module interested in knowing when a geom called `foo' is deleted could say `(interest (delete foo))' and would receive the string `(delete foo)' when foo is deleted. Picking is a special case of this. For most modules interested in pick events the command `(interest (pick world))' is sufficient. This causes geomview to send a string of the form `(pick world ...)' every time a pick event (right mouse double click). See the `pick' command for details. `(lines-closer CAM-ID DIST)' Draw lines (including edges) closer to the camera than polygons by DIST / 10^5 of the Z-buffer range. DIST = 3.0 by default. If DIST is too small, a line lying on a surface may be dotted or invisible, depending on the viewpoint. If DIST is too large, lines may appear in front of surfaces that they actually lie behind. Good values for DIST vary with the scene, viewpoint, and distance between near and far clipping planes. This feature is a kludge, but can be helpful. `(load filename [command|geometry|camera])' Loads the given file into geomview. The optional second argument specifies the type of data it contains, which may be `command' (geomview commands), `geometry' (OOGL geometric data), or `camera' (OOGL camera definition). If omitted, attempts to guess about the file's contents. Loading geometric data creates a new visible object; loading a camera opens a new window; loading a command file executes those commands. `(load-path)' Returns the current search path for command, geometry, etc. files. Note: to actually see the value returned by this function you should wrap it in a call to echo: (echo (load-path)). Geometry Center Thu Dec 12 02:41:23 CST 1996 9 Geomview(5) Geomview(5) See also set-load-path. `(look [objectID] [cameraID])' Rotates the named camera to point toward the center of the bounding box of the named object (or the origin in hyperbolic or spherical space). In Euclidean space, moves the camera forward or backward until the object appears as large as possible while still being entirely visible. Equivalent to progn ( (look-toward [objectID] [cameraID] {center | origin}) [(look-encompass [objectID] [cameraID])] ) If objectID is not specified, it is assumed to be World. If cameraID is not specified, it is assumed to be targetcam. `(look-encompass [objectID] [cameraID])' Moves cameraID backwards or forwards until its field of view surrounds objectID. This routine works only in Euclidean space. If objectID is not specified, it is assumed to be the world. If cameraID is not specified, it is assumed to be the targetcam. See also (look-encompass-size). `(look-encompass-size [view-fraction clip-ratio near-margin far-margin])' Sets/returns parameters used by (look-encompass). view-fraction is the portion of the camera window filled by the object, clip-ratio is the max allowed ratio of near-to-far clipping planes. The near clipping plane is 1/near-margin times closer than the near edge of the object, and the far clipping plane is far-margin times further away. Returns the list of current values. Defaults: .75 100 0.1 4.0 `(look-recenter [objectID] [cameraID])' Translates and rotates the camera so that it is looking in the -z direction (in objectID's coordinate system) at the center of objectID's bounding box (or the origin of the coordinate system in non-Eudlidean space). In Euclidean space, the camera is also moved as close as possible to the object while allowing the entire object to be visible. Also makes sure that the y-axes of objectID and cameraID are parallel. `(look-toward [objectID] [cameraID] [origin | center])' Rotates the named camera to point toward the origin of the object's coordinate system, or the center of the object's bounding box (in non-Euclidean space, the origin will be used automatically). Default objectID is the world, default camera is targetcam, default location to point towards is the center of the bounding box. `(merge {window|camera} CAM-ID { WINDOW or CAMERA ... } )' Modify the given window or camera, changing just those properties specified in the last argument. E.g. (merge camera `Camera' { far 20 }) sets Camera's far clipping plane to 20 while leaving Geometry Center Thu Dec 12 02:41:23 CST 1996 10 Geomview(5) Geomview(5) other attributes untouched. `(merge-ap GEOM-ID APPEARANCE)' Merge in some appearance characteristics to GEOM-ID. Appearance parameters include surface and line color, shading style, line width, and lighting. `merge-base-ap is a synonym for merge-baseap.' `(merge-baseap APPEARANCE)' Merge in some appearance characteristics to the base default appearance (applied to every geom before its own apperance). Lighting is typically included in the base appearance. `(morehelp command)' `command' may include `*' wildcards. Prints more info than `(help command)'. `(name-object ID NAME)' Assign a new NAME (a string) to ID. A number is appended if that name is in use (for example, `foo' -> `foo<2>'). The new name, possibly with number appended, may be used as object's id thereafter. `(ND-axes CAMID [CLUSTERNAME [Xindex Yindex Zindex]])' In our model for N-D viewing (enabled by (dimension)), objects in N-space are viewed by N-dimensional *camera clusters*. Each real camera window belongs to some cluster, and shows & manipulates a 3-D axis-aligned projected subspace of the N-space seen by its cluster. Moving one camera in a cluster affects its siblings. The ND-axes command configures all this. It specifies a camera's cluster membership, and the set of N-space axes which become the 3-D camera's X, Y, and Z axes. Axes are specified by their indices, from 0 to N-1 for an N-dimensional space. Cluster CLUSTERNAME is implicitly created if not previously known. To read a camera's configuration, use `(echo (ND-axes CAMID))'. `(ND-color CAMID' [ (( [ID] (x0 x1 x2 ... xn) v r g b a v r g b a ... ) ((x0 ... xn) v r g b a v r g b a ...) ...)] ) Specifies a function, applied to each N-D vertex, which determines the colors of N-dimensional objects as shown in camera CAMID. Each coloring function is defined by a vector (in ID's coordinate system) [x0 x1 ... xn] and by a sequence of value (v)/color(r g b a) tuples, ordered by increasing v. The inner product v = P.[x] is linearly interpolated in this table to give a color. If ID is omitted, the (xi) vector is assumed in universe coordinates. The ND-color command specifies a list of such functions; each vertex is colored by their sum (so e.g. green intensity could indicate projection along one axis while red indicated another. An empty list, as in (ND-color CAMID ()), suppresses coloring. With no second argument, (ND-color CAMID) returns that camera's Geometry Center Thu Dec 12 02:41:23 CST 1996 11 Geomview(5) Geomview(5) color-function list. Even when coloring is enabled, objects tagged with the `keepcolor' appearance attribute are shown in their natural colors. `(ND-xform OBJID [ntransform { idim odim ... }])' Sets or returns the N-D transform of the given object. In dimension N, this is an (N+1)x(N+1) matrix. Note that all cameras in a camera-cluster have the same N-D transform. `(ND-xform-get ID [from-ID])' Returns the N-D transform of the given object in the coordinate system of from-ID (default `universe'), in the sense * Transform = `(new-alien name [GEOMETRY])' Create a new alien (geom not in the world) with the given name (a string). GEOMETRY is a string giving an OOGL geometry specification. If GEOMETRY is omitted, the new alien is given an empty geometry. If an object with that name already exists, the new alien is given a unique name. The light beams that are used to move around the lights are an example of aliens. They're drawn but are not controllable the way ordinary objects are: they don't appear in the object browser and the user can't move them with the normal motion modes. `(new-camera name [CAMERA])' Create a new camera with the given name (a string). If a camera with that name already exists, the new object is given a unique name. If CAMERA is omitted a default camera is used. `(new-center [id])' Stop id, then set id's transform to the identity. Default id is target. Also, if the id is a camera, calls (look-recenter World id). The main function of the call to (look-recenter) is to place the camera so that it is pointing parallel to the z axis toward the center of the world. `(new-geometry name [GEOMETRY])' Create a new geom with the given name (a string). GEOMETRY is a string giving an OOGL geometry specification. If GEOMETRY is omitted, the new object is given an empty geometry. If an object with that name already exists, the new object is given a unique name. `(new-reset)' Equivalent to (progn (new-center ALLGEOMS)(new-center ALLCAMS)) `(NeXT)' Returns t if running on a NeXT, nil if not Geometry Center Thu Dec 12 02:41:23 CST 1996 12 Geomview(5) Geomview(5) `(normalization GEOM-ID {each|none|all|keep})' Set the normalization status of GEOM-ID. `none' suppresses all normalization. `each' normalizes the object's bounding box to fit into the unit sphere, with the center of its bounding box translated to the origin. The box is scaled such that its long diagonal, sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), is 2. `all' resembles `each', except when an object is changing (e.g. when its geometry is being changed by an external program). Then, `each' tightly fits the bounding box around the object whenever it changes and normalizes accordingly, while `all' normalizes the union of all variants of the object and normalizes accordingly. `keep' leaves the current normalization transform unchanged when the object changes. It may be useful to apply `each' or `all' normalization apply to the first version of a changing object to bring it in view, then switch to `keep'. `(pick COORDSYS GEOMID G V E F P VI EI FI)' The pick command is executed internally in response to pick events (right mouse double click). COORDSYS = coordinate system in which coordinates of the following arguments are specified. This can be: world: world coord sys self: coord sys of the picked geom (GEOMID) primitive: coord sys of the actual primitive within the picked geom where the pick occurred. GEOMID = id of picked geom G = picked point (actual intersection of pick ray with object) V = picked vertex, if any E = picked edge, if any F = picked face P = path to picked primitive [0 or more] VI = index of picked vertex in primitive EI = list of indices of endpoints of picked edge, if any FI = index of picked face External modules can find out about pick events by registering interest in calls to `pick' via the `interest' command. `(pick-invisible [yes|no])' Selects whether picks should be sensitive to objects whose appearance makes them invisible; default yes. With no arguments, returns current status. `(pickable GEOM-ID {yes|no})' Say whether or not GEOM-ID is included in the pool of objects that could be returned from the pick command. Geometry Center Thu Dec 12 02:41:23 CST 1996 13 Geomview(5) Geomview(5) `(position objectID otherID)' Set the transform of objectID to that of otherID. `(position-at objectID otherID [center | origin])' Translate objectID to the center of the bounding box or the origin of the coordinate system of otherID (parallel translation). Default is center. `(position-toward objectID otherID [center | origin])' Rotate objectID so that the center of the bounding box or the origin of the coordinate system of the otherID lies on the positive z-axis of the first object. Default is the center of the bounding box. `(progn STATEMENT [ ... ])' evaluates each STATEMENT in order and returns the value of the last one. Use progn to group a collection of commands together, forcing them to be treated as a single command. `quit is a synonym for `exit'' `(quote EXPR)' returns the symbolic lisp expression EXPR without evaluating it. `(rawevent dev val x y t)' Enter the specified raw event into the event queue. The arguments directly specify the members of the event structure used internally by geomview. This is the lowest level event handler and is not intended for general use. `(rawpick CAMID X Y)' Process a pick event in camera CAMID at location (X,Y) given in integer pixel coordinates. This is a low-level procedure not intended for external use. `(read {geometry|camera|transform|command} {GEOMETRY or CAMERA or ...})' Read and interpret the text in ... as containing the given type of data. Useful for defining objects using OOGL reference syntax, e.g. (geometry thing { INST transform : T geom : fred }) (read geometry { define fred QUAD 1 0 0 0 1 0 0 0 1 1 0 0 }) (read transform { define T . If no filename specified, see `rib-display' for explanation of the filename used. `(scale GEOM-ID FACTOR [FACTORY FACTORZ])' Scale GEOM-ID, multiplying its size by FACTOR. The factors should be positive numbers. If FACTORY and FACTORZ are present and non-zero, the object is scaled by FACTOR in x, by FACTORY in y, and by FACTORZ in z. If only FACTOR is present, the object is scaled by FACTOR in x, y, and z. Scaling only really makes sense in Euclidean space. Mouse-driven scaling in other spaces is not allowed; the scale command may be issued in other spaces but should be used with caution because it may cause the data to extend beyond the limits of the space. `(scene CAM-ID [GEOMETRY])' Make CAM-ID look at GEOMETRY instead of at the universe. `(set-clock TIME)' Adjusts the clock for this command stream to read TIME (in seconds) as of the moment the command is received. See also sleep-until, clock. `(set-conformal-refine CMX [N [SHOWEDGES]])' Sets the parameters for the refinement algorithm used in drawing in the conformal model. CMX is the cosine of the maximum angle an edge can bend before it is refined. Its value should be between Geometry Center Thu Dec 12 02:41:23 CST 1996 15 Geomview(5) Geomview(5) -1 and 1; the default is 0.95; decreasing its value will cause less refinement. N is the maximum number of iterations of refining; the default is 6. SHOWEDGES, which should be `no' or `yes', determines whether interior edges in the refinement are drawn. `(set-emodule-path (PATH1 ... PATHN))' Sets the search path for external modules. The PATHi should be pathnames of directories containing, for each module, the module's executable file and a .geomview- file which contains an (emodule-define ...) command for that module. This command implicitly calls (rehash-emodule-path) to rebuild the application brower from the new path setting. The special directory name `+' is replaced by the existing path, so e.g. (set-emodule-path (mydir +)) prepends mydir to the path. `(set-load-path (PATH1 ... PATHN))' Sets search path for command, geometry, etc. files. The PATHi are strings giving the pathnames of directories to be searched. The special directory name `+' is replaced by the existing path, so e.g. (set-load-path (mydir +)) prepends mydir to the path. `(set-motionscale X)' Set the motion scale factor to X (default value 0.5). These commands scale their motion by an amount which depends on the distance from the frame to the center and on the size of the frame. Specifically, they scale by dist + scaleof(frame) * motionscale where dist is the distance from the center to the frame and motionscale is the motion scale factor set by this function. Scaleof(frame) measures the size of the frame object. `(setenv name string) sets the environment variable `name' to the value' STRING; the name is visible to geomview (as in pathnames containing `$name') and to processes it creates, e.g. external modules. `(sgi)' Returns t if running on an sgi machine, nil if not `(shell SHELL-COMMAND)' Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview waits for it to complete and will be unresponsive until it does. A synonym is `!'. `(sleep-for TIME)' Suspend reading commands from this stream for TIME seconds. Commands already read will still be executed; `sleep-for' inside `progn' won't delay execution of the rest of the progn's contents. `(sleep-until TIME)' Suspend reading commands from this stream until TIME (in seconds). Commands already read will still be executed; `sleep-until' inside `progn' won't delay execution of the rest of the progn's contents. Geometry Center Thu Dec 12 02:41:23 CST 1996 16 Geomview(5) Geomview(5) Time is measured according to this stream's clock, as set by `set-clock'; if never set, the first sleep-until sets it to 0 (so initially (sleep-until TIME) is the same as (sleep-for TIME)). Returns the number of seconds until TIME. `(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])' Save a snapshot of CAM-ID in the FILENAME (a string). The FORMAT argument is optional; it may be `ppmscreen', `sgi', `ps', or `ppm'. A `ppmscreen' snapshot is created by reading the image directly from the given window; the window is popped above other windows and redrawn first, then its contents are written as a PPM format image. With `ps', dumps a Postscript picture representing the view from that window; hidden-surface removal might be incorrect. With `ppm', dumps a PPM-format image produced by geomview's internal software renderer; this may be of arbitrary size. If the FILENAME argument begins with the vertical bar `|', it's interpreted as a /bin/sh command to which the PPM or PS data should be piped. Optional XSIZE and YSIZE values are relevant only for `ppm' format, and render to a window of that size (or scaled to that size, with aspect fixed, if only XSIZE is given) `(soft-shader CAM-ID {on|off|toggle})' Select whether to use software or hardware shading in that camera. `(space {euclidean|hyperbolic|spherical})' Set the space associated with the world. `(stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize])' Configure CAM-ID as a stereo window. no: entire window is a single pane, stereo disabled horizontal: split left/right: left is stereo eye#0, right is #1. vertical: split top/bottom: bottom is eye#0, top is #1. colored: panes overlap, red is stereo eye#0, cyan is #1. A gap of `gapsize' pixels is left between subwindows; if omitted, subwindows are adjacent. If both layout and gapsize are omitted, e.g. (stereowin CAM-ID), returns current settings as a `(stereowin ...)' command list. This command doesn't set stereo projection; use `merge camera' or `camera' to set the stereyes transforms, and `merge window' or `window' to set the pixel aspect ratio & window position if needed. `(time-interests deltatime initial prefix [suffix])' Indicates that all interest-related messages, when separated by at least `deltatime' seconds of real time, should be preceded by the string `prefix' and followed by `suffix'; the first message is preceded by `initial'. All three are printf format strings, whose argument is the current clock time (in seconds) on that stream. A `deltatime' of zero timestamps every message. Typical usage: (time-interests .1 `(set-clock %g)' `(sleep-until %g)') or (time-interests .1 `(set-clock %g)' "(sleep-until %g) (progn (set-clock %g)" ")") or (time-interests .1 "(set-clock %g)" "(if (> 0 (sleep-until %g)) (" "))". Geometry Center Thu Dec 12 02:41:23 CST 1996 17 Geomview(5) Geomview(5) `(transform objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [dt] [`smooth'])' Apply a motion (rotation, translation, scaling) to object `objectID'; that is, construct and concatenate a transformation matrix with objectID's transform The 3 IDs involved are the object that moves, the center of motion, and the frame of reference in which to apply the motion. The center is easiest understood for rotations: if centerID is the same as objectID then it will spin around its own axes; otherwise the moving object will orbit the center object. Normally frameID, in whose coordinate system the (mouse) motions are interpreted, is `focus', the current camera. Translations can be scaled proportional to the distance between the target and the center. Support for spherical and hyperbolic as well as Euclidean space is built-in: use the `space' command to change spaces. With type `rotate' x, y, and z are floats specifying angles in RADIANS. For types `translate' and `translate-scaled' x, y, and z are floats specifying distances in the coordinate system of the center object. The optional `dt' field allows a simple form of animation; if present, the object moves by just that amount during approximately `dt' seconds, then stops. If present and followed by the `smooth' keyword, the motion is animated with a 3t^2-2t^3 function, so as to start and stop smoothly. If absent, the motion is applied immediately. `(transform-incr objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [dt])' Apply continuing motion: construct a transformation matrix and concatenate it with the current transform of objectID every refresh (sets objectID's incremental transform). Same syntax as transform. If optional `dt' argument is present, the object is moved at each time step such that its average motion equals one instance of the motion per `dt' seconds. E.g. (transform-incr World World World rotate 6.28318 0 0 10.0) rotates the World about its X axis at 1 turn (2pi radians) per 10 seconds. `(transform-set objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z)' Set objectID's transform to the constructed transform. Same syntax as transform. `(ui-center ID)' Set the center for user interface (i.e. mouse) controlled motions to object ID. `ui-emotion-program is an obsolete command.' Use its new eqivalent `emodule-define' instead. `ui-emotion-run is an obsolete command.' Use its new eqivalent `emodule_start' instead. `(ui-freeze [on|off])' Toggle updating user interface panels. Off by default. `(ui-panel PANELNAME {on|off} [ WINDOW ] )' Do or don't display the given user-interface panel. Geometry Center Thu Dec 12 02:41:23 CST 1996 18 Geomview(5) Geomview(5) Case is ignored in panel names. Current PANELNAMEs are: geomview main panel tools motion controls appearance appearance controls cameras camera controls lighting lighting controls obscure obscure controls materials material properties controls command command entry box credits geomview credits By default, the `geomview' and `tools' panels appear when geomview starts. If the optional Window is supplied, a `position' clause (e.g. (ui-panel obscure on { position xmin xmax ymin ymax }) sets the panel's default position. (Only xmin and ymin values are actually used.) A present but empty Window, e.g. `(ui-panel obscure on {})' causes interactive positioning. `(ui-target ID [yes|no])' Set the target of user actions (the selected line of the target object browser) to ID. The second argument specifies whether to make ID the current object regardless of its type. If `no', then ID becomes the current object of its type (geom or camera). The default is `yes'. This command may result in a change of motion modes based on target choice. `(uninterest (COMMAND [args]))' Undoes the effect of an `interest' command. (COMMAND [args]) must be identical to those used in the `interest' command. `(update [timestep_in_seconds])' Apply each incremental motion once. Uses timestep if it's present and nonzero; otherwise motions are proportional to elapsed real time. `(update-draw CAM-ID [timestep_in_seconds])' Apply each incremental motion once and then draw CAM-ID. Applies `timestep' seconds' worth of motion, or uses elapsed real time if `timestep' is absent or zero. `(window CAM-ID WINDOW)' Specify attributes for the window of CAM-ID, e.g. its size or initial position, in the OOGL Window syntax. The special CAM-ID `default' specifies properties of future windows (created by `camera' or `new-camera'). `(winenter CAM-ID)' Tell geomview that the mouse cursor is in the window of CAM-ID. This function is for development purposes and is not intended for general use. `(write {command,geometry,camera,transform,window} FILENAME [ID|(ID ...)] [self|world|universe|otherID])' write description of ID in given format to FILENAME. Last parameter chooses coordinate system for geometry & transform: Geometry Center Thu Dec 12 02:41:23 CST 1996 19 Geomview(5) Geomview(5) self: just the object, no transformation or appearance (geometry only) world: the object as positioned within the World. universe: object's position in universal coordinates; includes Worldtransform other ID: the object transformed to otherID's coordinate system. A filename of `-' is a special case: data are written to the stream from which the 'write' command was read. For external modules, the data are sent to the module's standard input. For commands not read from an external program, `-' means geomview's standard output. (See also the `command' command.) The ID can either be a single id or a parenthesized list of ids, like `g0' or `(g2 g1 dodec.off)'. `(write-comments FILENAME GEOMID PICKPATH)' write OOGL COMMENT objects in the GEOMID hierarchy at the level of the pick path to FILENAME. Specifically, COMMENTS at level (a b c ... f g) will match pick paths of the form (a b c ... f *) where * includes any value of g, and also any values of possible further indices h,i,j, etc. The pick path (returned in the `pick' command) is a list of integer counters specifying a subpart of a hierarchical OOGL object. Descent into a complex object (LIST or INST) adds a new integer to the path. Traversal of simple objects increments the counter at the current level. Individual COMMENTS are enclosed by curly braces, and the entire string of zero, one, or more COMMENTS (written in the order in which they are encountered during hierarchy traversal) is enclosed by parentheses. Note that arbitrary data can only be passed through the OOGL libraries as full-fledged OOGL COMMENT objects, which can be attached to other OOGL objects via the LIST type as described above. Ordinary comments in OOGL files (i.e. everything after '#' on a line) are ignored at when the file is loaded and cannot be returned. `(write-sexpr FILENAME LISPOBJECT)' Writes the given LISPOBJECT to FILENAME. This function is intended for internal debugging use only. `(xform ID TRANSFORM)' Concatenate TRANSFORM with the current transform of the object (apply TRANSFORM to object ID). `(xform-incr ID TRANSFORM)' Apply continual motion: concatenate TRANSFORM with the current transform of the object every refresh (set object ID's incremental transform to TRANSFORM). `(xform-set ID TRANSFORM)' Overwrite the current object transform with TRANSFORM (set Geometry Center Thu Dec 12 02:41:23 CST 1996 20 Geomview(5) Geomview(5) object ID's transform to TRANSFORM). `(zoom CAM-ID FACTOR)' Zoom CAM-ID, multiplying its field of view by FACTOR. FACTOR should be a positive number. Info file: geomview, -*-Text-*- produced by texinfo-format-buffer from file: geomview.tex Geometry Center Thu Dec 12 02:41:23 CST 1996 21 geomview-1.9.5/doc/lisp.3gv0000644000175000017500000004663612310110176012435 00000000000000 lisp(3gv) lisp(3gv) NAME geomview lisp interpreter NOTE This document describes the geomview 1.3 lisp interpreter. This version is incompatible with previous versions in several ways. Since the previous one was used mostly just by Geometry Center staff, I am not going to write a docu- ment detailing the changes. The geomview lisp interpreter is not very well documented in general because I am strongly considering phasing it out and replacing it with a real lisp interpreter in a future version of geomview. If you have any questions about the current version or how to convert programs from an older version please contact me directly [ mbp@geomtech.com ]. SYNOPSIS #include "lisp.h" void LInit(); Lake * LakeDefine(FILE *streamin, FILE *streamout, void *river); void LakeFree(Lake *lake); LObject * LNew(LType *type, LCell *cell); LObject * LRefIncr(LObject *obj); void LRefDecr(LObject *obj); void LWrite(FILE *fp, LObject *obj); void LFree(LObject *obj); LObject * LCopy(LObject *obj); LObject * LSexpr(Lake *lake); LObject * LEval(LObject *obj); LObject * LEvalSexpr(Lake *lake); LList * LListNew(); LList * LListAppend(LList *list, LObject *obj); void LListFree(LList *list); LList * LListCopy(LList *list); LObject * LListEntry(LList *list, int n); int LListLength(LList *list); int LParseArgs(char *name, Lake *lake, LList *args, ...); int LDefun(char *name, LObjectFunc func, char *help); void LListWrite(FILE *fp, LList *list); LInterest * LInterestList(char *funcname); LObject * LEvalFunc(char *name, ...); int LArgClassValid(LType *type); void LHelpDef(char *key, char *message); LDEFINE(name, ltype, doc) LDECLARE((name, LBEGIN, ..., LEND)); Geometry Center Oct 22 1992 1 lisp(3) lisp(3) DESCRIPTION Geomview contains a minimal lisp interpreter for parsing and evaluating commands. This lisp interpreter is part of the "-loogutil" library and thus any program which links with this library may use the interpreter. This provides a simple but powerful way to build up a command language. This manual page assumes that you are familiar with the syntax of lisp. The first part describes the basics of using the interpreter. Some gory details that don't con- cern most users then follow. The main steps in using the lisp interpreter are 1. call Linit() to initialize the interpreter 2. make calls to LDefun(), one for each lisp function you want the interpreter to know about 3. define the "i/o lake" 4. parse input with calls to LSexpr() and evaluate the resulting lisp objects with LEval() (or use LEvalSexpr() to combine both steps). For example the following code defines a single function "f" and executes commands from standard input: #include "lisp.h" Lake *lake; LObject *obj, *val; LInit(); LDefun("f", f, NULL); lake = LakeDefine(stdin, stdout, NULL); while (!feof(stdin)) { obj = LSexpr(lake); val = LEval(obj); LFree(obj); LFree(val); } The second argument to LDefun() is a function pointer; LDefun() sets up a correspondence between the string "f" and the function f, which is assumed to have been previ- ously declared. The section FUNCTION DEFINITIONS below gives the expected call syntax and behavior of such func- tions. (The third argument to LDefun() is a pointer to a string which documents the function and may be NULL if you don't care about documentation.) LakeDefine() defines an i/o lake; this is a generalization of the notion of an i/o stream. Most programs don't need to use the generaliza- tion, though, and can simply pass FILE pointers as LakeDe- fine()'s first two arguments and NULL as the third one. The section LAKES below gives the details for those who are interested. LSexpr() [which stands for Lisp Symbolic EXPRession] parses a single lisp expression from the lake, returning a lisp object which represents that expression. Geometry Center Oct 22 1992 2 lisp(3) lisp(3) The lisp object is returned as an LObject pointer, which points to an opaque structure containing a representation of the expression. LEval() then evaluates the object; it is during the call to LEval() that the action of the expression takes place. Note that the last two lines of code in this example could have been replaced by the sin- gle line LEval(LSexpr(lake)) or, more efficiently, by LEv- alSexpr(lake). FUNCTION DEFINITIONS The functions defined by calls to LDefun() are expected to have a certain call syntax; LEval() calls them when it encounters a call to the lisp function named with the cor- responding string. The macro LDEFINE is provided for declaring them. For example: LDEFINE(f, LSTRING, "(f a b) returns a string representing the0um of the integer a with the floating point number b.") { int a; float b; char buf[20], *s; LDECLARE(("f", LBEGIN, LINT, &a, LFLOAT, &b, LEND)); sprintf(buf,"%f",a+b); s = strdup(buf); return LNew(LSTRING, &s); } The important things about this function are: 1. It is declared with the LDEFINE macro, the general syntax of which is LDEFINE(name, type, helpstr). name should be a valid C identifer and will be used to construct the actual name of the C function by prepending an 'L' and the name of the help string by prepending an 'H'. type should be a lisp object type identifier (see below) and determines the type of object that the function returns. helpstr is a documentation string. 2. The use of the LDECLARE macro. More about this below. 3. It returns an LObject *. All lisp functions must actually return a value. If you don't care what value they return you can return one of the pre-defined values Lnil or Lt (and specify LVOID as the type in the LDEFINE header). This particular example is a function which takes two arguments, an int and a float, and returns a string object representing their sum. A lisp call to this function might look like "(f 1 3.4)". Geometry Center Oct 22 1992 3 lisp(3) lisp(3) The LDECLARE macro, defined in lisp.h, sets up the corre- spondence between variables in the C code and arguments in the lisp call to the function. Note that the arguments to LDECLARE are delimited by *two* pairs of parentheses (this is because C does not allow macros with a variable number of arguments; LDECLARE thus actually takes one argument which is a parenthesized list of an arbitrary number of items). The general usage of LDECLARE is LDECLARE(( name, LBEGIN, , ..., LEND )); where name is the name of the function (as specified to LDefun()). is an argument specification, which in general consists of a lisp type identifier followed by an address. The identifier indicates the data type of the argument. The builtin type identifiers are LINT (inte- ger), LFLOAT (float), LSTRING (string), LLOBJECT (lisp object), and LLIST (lisp list). Applications may define additional types whose identifiers may also be used here; see the section CUSTOM LISP TYPES below for details. There may be any number of 's; the last must be followed by the special keyword LEND. STOP HERE Most users of the lisp interpreter can stop reading this man page here. What follows is only used in advanced sit- uations. EVALUATION OF FUNCTION ARGUMENTS Normally the lisp interpreter evaluates function arguments before passing them to the function; to prevent this eval- uation from happening you can insert the special token LHOLD in an LDECLARE argument specification before the type keyword. For example LHOLD, LLIST, &list, specifies an unevalutated list argument. This feature is really useful only for LLIST, LLOBJECT, and array types (see below) since the other types evalutate to themselves. ARRAYS In general an in the LDECLARE call consists of a keyword followed by the address of a scalar data type. Since it is relatively common to use a lisp list to repre- sent an array of values, however, the special keyword LARRAY is provided for dealing with them. It has a different syntax: it should be followed by a lisp type Geometry Center Oct 22 1992 4 lisp(3) lisp(3) identifier which specifies the type of the elements of the array and then by two addresses --- the address of an array and the address of an integer count. Upon entry to LDECLARE the count specifies how many elements may be written into the array. LDECLARE then modifies this num- ber to indicate the number of entries actually parsed. For example: LDEFINE(myfunc, ...) { float f[2]; int fn = 2; LDECLARE(("myfunc", LEBGIN LHOLD, LARRAY, f, &fn, LEND)); /* at this point the value of fn has been modified to be the number of entries actually appearing in the list argument; and this number of values have been written into the array f. */ ... } defines a function "myfunc" which takes a list of up to 2 floats as its only argument. Valid calls to "myfunc" would be "(myfunc ())", "(myfunc (7))", and "(myfunc (7 8))". Note the use of LHOLD; this is necessary because otherwise the lisp system would attempt to evaluate the list as a function call before passing it off to myfunc. OPTIONAL ARGUMENTS Normally the lisp interpreter will generate (to stderr) a reasonable error message if a function is called with fewer arguments than were specified in LDECLARE. Some functions, however, may have some arguments that are optional. You can define a function which takes optional arguments by putting the keyword LOPTIONAL after the last required argument in the LDECLARE call. Any arguments specified in the list after that are considered optional; the interpreter doesn't complain if they are not supplied. Note that all optional arguments must come after all required arguments. Normally excess arguments also elicit an error message. The LREST keyword allows control over this situation. If LREST is followed by a pointer to an LList * variable, then trailing arguments are parsed, evaluated (unless LHOLD was used), and the list of them is stored in the given variable. (Note that the value is an LList, not an LObject of type LLIST -- if there are no excess arguments, the value is NULL, not an empty LLIST.) If LREST is fol- lowed by a NULL pointer, excess arguments are silently Geometry Center Oct 22 1992 5 lisp(3) lisp(3) ignored. LREST might be useful when a function's argument types are not known. It's not necessary to specify LEND after LREST. LISP OBJECTS The basic data type of the lisp interpreter is the lisp object; it is represented by an LObject pointer, which points to an opaque data structure. The functions for manipulating lisp objects (i.e. the object's methods) are: LNew(): creates a new lisp object of the given type with the given value. The "type" argument is one of the values LSTRING or LLIST, or a type pointer defining a custom object type (see CUSTOM OBJECT TYPES below). LRefIncr(): increments the reference count of a lisp object. The lisp interpreter uses the convention that when a procedure returns a lisp object, the caller owns the object and thus has responsibility for freeing it. LRefIncr() can be used to increment the reference count of an existing object about to be returned. New objects created by LNew() have their reference count initialized to 1 and hence do not need to be LRefIncr()'ed. LRefDecr(): decrements the reference count of a lisp object. This should probably not be called by application programs; it is used internally. LWrite(): writes a formatted string representation of a lisp object to a stream. LFree(): free the space assoicated with a lisp object LCopy(): construct a copy of a lisp object CUSTOM OBJECT TYPES In addition to the predefined lisp object types you may define your own custom types. This is done by construct- ing a structure containing various function pointers for manipulating objects of your new type. The address of this structure is then the type identifier for this type and may be used in LDECLARE 's and in LNew() calls. (The type names LINT, LSTRING and the other builtin types are actually pointers to predefined struc- tures.) The structure is of type LType as defined in lisp.h: struct LType { /* name of type */ char *name; /* size of corresponding C type */ int size; Geometry Center Oct 22 1992 6 lisp(3) lisp(3) /* extract cell value from obj */ int (*fromobj)(/* LObject *obj, void *x */); /* create a new LObject of this type */ LObject *(*toobj)(/* void *x */); /* free a cell of this type */ void (*free)(/* void *x */); /* write a cell value to a stream */ void (*write)(/* FILE *fp, void *x */); /* test equality of two cells of this type */ int (*match)(/* void *a, void *b */); /* pull a cell value from a va_list */ void (*pull)(/* va_list *a_list, void *x */); /* parse an object of this type */ LObject *(*parse)(/* Lake *lake */); /* magic number; always set to LTypeMagic */ int magic; }; The void * pointers in the above point to objects of the type you are defining. For examples of how to define new types see the code in lisp.c that defines the string and list types. See also the file TYPES.DOC in the lisp source code directory for further details. LISTS The LList pointer is used to refer to objects of type LLIST, which implement a linked list. The operations on these objects are LListNew(), LListLength(), LListEntry(), LListAppend(), LListCopy(), and LListFree(). These are mostly used internally by the lisp system but are avail- able for outside use. Maybe I'll write more documentation for them later if it seems necessary. LAKES The Lake structure is a generalization of an input stream. It contains three members: an input FILE pointer ("streamin"), an output FILE pointer ("streamout"), and an arbitrary pointer ("river"). The input FILE pointer is required; the lisp interpreter assumes that every lake has a valid input file pointer. The output FILE pointer is required if you do any operations that result in the intepreter producing any output. The third pointer may point to whatever you want. The lisp interpreter itself does not directly refer to this pointer. It may be used by the parser that you supply when defining a new lisp Geometry Center Oct 22 1992 7 lisp(3) lisp(3) object type. The term "Lake" is supposed to connote something more gen- eral than a stream; it also seemed particularly appropri- ate since this interpreter was written in the City of Lakes. HIDDEN LAKE ARGUMENTS AND OTHER WET THINGS This section is X rated. Don't read it unless you are really serious. The lisp interpreter works by first parsing (LSexpr()) an expression then evaluating it (LEval()). The LDECLARE macro is a mechanism which allows both the syntax (for parsing) and the semantics (for evaluation) of an expres- sion to be specified in the same convenient place --- at the top of the C function which implements the function. The call syntax of all such C functions is LObject *func(Lake *lake, LList *args) When parsing a call to the corresponding lisp function, LSexpr() calls func with that lake pointer, and with args pointing to the head of the list in the parse tree corre- sponding to this function call. LDECLARE parses the argu- ments in the call (by reading them from the lake) and appends them to this list. (Note: the head of this list is the function itself, so the first argument becomes entry #2 in the list.) When evaluating the function call, LEval() calls func with lake=NULL and with args pointing to the call's argument list. (In this case the first entry of the list is the first argument.) LDECLARE then converts the arguments in the list into the appropriate C data types, writing their values into the addresses in the s. One side-effect of using lake=NULL as the signal to evalu- ate rather than to parse is that the value of the lake pointer is not available at evaluation time. Some func- tions, however, may want to do something with the lake they were parsed from. For example, the "write" function in geomview writes data to the output stream associated with its input stream. (In geomview these streams are all stored in a general "Pool" structure which is retained as the "river" member of the lake.) The special token LLAKE may be used to cause the lake pointer to be saved in the args list at parse time and written into a variable at evaluation time. It is used exactly like the other Geometry Center Oct 22 1992 8 lisp(3) lisp(3) (scalar) argument keywords: LObject *func(Lake *lake, LList *args) Lake *mylake; LDECLARE(("myfunc", LBEGIN LARG_LAKE, &mylake, ... LARG_END)); At evaluation time LDECLARE will set mylake to have the value that lake had at parse time. This looks just like a specification for an argument to the lisp function but it is not --- it is just a way to tell LDECLARE to remember the lake pointer between parse- and evaluation-time. BUGS The documentation is incomplete. AUTHOR The lisp interpreter was written mostly by Mark Phillips with lots of input and moral support from Stuart Levy and Tamara Munzner. Geometry Center Oct 22 1992 9 geomview-1.9.5/doc/oogl.5gv0000644000175000017500000015503612310110176012423 00000000000000 OOGL(5gv) OOGL(5gv) NAME OOGL - File formats for OOGL geometric objects NOTE The material in this manual page also appears in the Geomview manual. DESCRIPTION OOGL File Formats ***************** The objects that you can load into Geomview are called OOGL objects. OOGL stands for "Object Oriented Graphics Library"; it is the library upon which Geomview is built. There are many different kinds of OOGL objects. This chapter gives syntactic descriptions of file formats for OOGL objects. Examples of most file types live in Geomview's `data/geom' directory. Conventions =========== Syntax Common to All OOGL File Formats -------------------------------------- Most OOGL object file formats are free-format ASCII --- any amount of white space (blanks, tabs, newlines) may appear between tokens (numbers, key words, etc.). Line breaks are almost always insignificant, with a couple of exceptions as noted. Comments begin with # and continue to the end of the line; they're allowed anywhere a newline is. Binary formats are also defined for several objects; *Note Binary format::, and the individual object descriptions. Typical OOGL objects begin with a key word designating object type, possibly with modifiers indicating presence of color information etc. In some formats the key word is optional, for compatibility with file formats defined elsewhere. Object type is then determined by guessing from the file suffix (if any) or from the data itself. Key words are case sensitive. Some have optional prefix letters indicating presence of color or other data; in this case the order of prefixes is significant, e.g. `CNMESH' is meaningful but `NCMESH' is invalid. File Names ---------- When OOGL objects are read from disk files, the OOGL library uses the file suffix to guess at the file type. If the suffix is unrecognized, or if no suffix is available (e.g. for an Geometry Center Thu Dec 12 02:36:08 CST 1996 1 OOGL(5) OOGL(5) object being read from a pipe, or embedded in another OOGL object), all known types of objects are tried in turn until one accepts the data as valid. Vertices -------- Several objects share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an object have the same format, specified by the header key word. All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on). The syntax is `X Y Z' (3-D floating-point vertex coordinates) or `X Y Z W' (4-D floating-point vertex coordinates) optionally followed by `NX NY NZ' (normalized 3-D surface-normal if present) optionally followed by `R G B A' (4-component floating-point color if present, each component in range 0..1. The A (alpha) component represents opacity: 0 transparent, 1 opaque.) optionally followed by `S T' `or' `S T U' (two or three texture-coordinate values). Values are separated by white space, and line breaks are immaterial. Letters in the object's header key word must appear in a specific order; that's the reverse of the order in which the data is given for each vertex. So a `CN4OFF' object's vertices contain first the 4-component space position, then the 3-component normal, finally the 4-component color. You can't change the data order by changing the header key word; an `NCOFF' is just not recognized. Surface normal directions ------------------------- Geometry Center Thu Dec 12 02:36:08 CST 1996 2 OOGL(5) OOGL(5) Geomview uses normal vectors to determine how an object is shaded. The direction of the normal is significant in this calculation. When normals are supplied with an object, the direction of the normal is determined by the data given. When normals are not supplied with the object, Geomview computes normal vectors automatically; in this case normals point toward the side from which the vertices appear in counterclockwise order. On parametric surfaces (Bezier patches), the normal at point P(u,v) is in the direction dP/du cross dP/dv. Transformation matrices ----------------------- Some objects incorporate 4x4 real matrices for homogeneous object transformations. These matrices act by multiplication on the right of vectors. Thus, if p is a 4-element row vector representing homogeneous coordinates of a point in the OOGL object, and A is the 4x4 matrix, then the transformed point is p' = p A. This matrix convention is common in computer graphics; it's the transpose of that often used in mathematics, where points are column vectors multiplied on the right of matrices. Thus for Euclidean transformations, the translation components appear in the fourth row (last four elements) of A. A's last column (4th, 8th, 12th and 16th elements) are typically 0, 0, 0, and 1 respectively. Binary format ------------- Many OOGL objects accept binary as well as ASCII file formats. These files begin with the usual ASCII token (e.g. `CQUAD') followed by the word `BINARY'. Binary data begins at the byte following the first newline after `BINARY'. White space and a single comment may intervene, e.g. OFF BINARY # binary-format "OFF" data follows Binary data comprise 32-bit integers and 32-bit IEEE-format floats, both in big-endian format (i.e., with most significant byte first). This is the native format for 'int's and 'float's on Sun-3's, Sun-4's, and Irises, among others. Binary data formats resemble the corresponding ASCII formats, with ints and floats in just the places you'd expect. There are some exceptions though, specifically in the `QUAD', `OFF' and `COMMENT' file formats. Details are given in the individual file format descriptions. *Note QUAD::, *Note OFF::, and *Note COMMENT::. Binary OOGL objects may be freely mixed in ASCII object streams: Geometry Center Thu Dec 12 02:36:08 CST 1996 3 OOGL(5) OOGL(5) LIST { = MESH BINARY ... binary data for mesh here ... } { = QUAD 1 0 0 0 0 1 0 1 0 0 1 0 } Note that ASCII data resumes immediately following the last byte of binary data. Naturally, it's impossible to embed comments inside a binary-format OOGL object, though comments may appear in the header before the beginning of binary data. Embedded objects and external-object references ----------------------------------------------- Some object types (`LIST', `INST') allow references to other OOGL objects, which may appear literally in the data stream, be loaded from named disk files, or be communicated from elsewhere via named objects. Gcl commands also accept geometry in these forms. The general syntax is ::= [ "{" ] [ "define" `symbolname' ] [ "appearance" `appearance' ] [ ["="] `object-keyword' ... | "<" `filename' | ":" `symbolname' ] [ "}" ] where "quoted" items are literal strings (which appear without the quotes), [bracketed] items are optional, and | denotes alternatives. Curly braces, when present, must match; the outermost set of curly braces is generally required when the object is in a larger context, e.g. when it is part of a larger object or embedded in a Geomview command stream. For example, each of the following three lines: { define fred QUAD 1 0 0 0 0 1 0 1 0 1 0 0 } { appearance { +edge } LIST { < "file1" } { : fred } } VECT 1 2 0 2 0 0 0 0 1 1 2 is a valid OOGL object. The last example is only valid when it is delimited unambiguously by residing in its own disk file. The "<" construct causes a disk file to be read. Note that this isn't a general textual "include" mechanism; a complete OOGL object must appear in the referenced file. Geometry Center Thu Dec 12 02:36:08 CST 1996 4 OOGL(5) OOGL(5) Files read using "<" are sought first in the directory of the file which referred to them, if any; failing that, the normal search path (set by Geomview's `load-path' command) is used. The default search looks first in the current directory, then in the Geomview data directories. The ":" construct allows references to symbols, created with `define'. A symbol's initial value is a null object. When a symbol is (re)defined, all references to it are automatically changed; this is a crucial part of the support for interprocess communication. Some future version of the documentation should explain this better... Again, white space and line breaks are insignificant, and "#" comments may appear anywhere. Appearances ----------- Geometric objects can have associated "appearance" information, specifying shading, lighting, color, wireframe vs. shaded-surface display, and so on. Appearances are inherited through object hierarchies, e.g. attaching an appearance to a `LIST' means that the appearance is applied to all the `LIST''s members. Some appearance-related properties are relegated to "material" and "lighting" substructures. Take care to note which properties belong to which structure. Here's an example appearance structure including values for all attributes. Order of attributes is unimportant. As usual, white space is irrelevant. Boolean attributes may be preceded by "+" or "-" to turn them on or off; "+" is assumed if only the attribute name appears. Other attributes expect values. A "*" prefix on any attribute, e.g. "*+edge" or "*linewidth 2" or "material { *diffuse 1 1 .25 }", selects "override" status for that attribute. appearance { +face # (Do) draw faces of polygons. On by default. -edge # (Don't) draw edges of polygons +vect # (Do) draw VECTs. On by default. -transparent # (Disable) transparency. enabling transparency # does NOT result in a correct Geomview picture, # but alpha values are used in RenderMan snapshots. -normal # (Do) draw surface-normal vectors normscale 1 # ... with length 1.0 in object coordinates +evert # do evert polygon normals where needed so as # to always face the camera -texturing # (Disable) texture mapping -backcull # (Don't) discard clockwise-oriented faces Geometry Center Thu Dec 12 02:36:08 CST 1996 5 OOGL(5) OOGL(5) -concave # (Don't) expect and handle concave polygons -shadelines # (Don't) shade lines as if they were lighted cylinders # These four are only effective where the graphics system # supports them, namely on GL and Open GL. -keepcolor # Normally, when N-D positional coloring is enabled as # with geomview's (ND-color ...) command, all # objects' colors are affected. But, objects with the # "+keepcolor" attribute are immune to N-D coloring. shading smooth # or "shading constant" or "shading flat" or # or "shading csmooth". # smooth = Gouraud shading, flat = faceted, # csmooth = smoothly interpolated but unlighted. linewidth 1 # lines, points, and edges are 1 pixel wide. patchdice 10 10 # subdivide Bezier patches this finely in u and v material { # Here's a material definition; # it could also be read from a file as in # "material < file.mat" ka 1.0 # ambient reflection coefficient. ambient .3 .5 .3 # ambient color (red, green, blue components) # The ambient contribution to the shading is # the product of ka, the ambient color, # and the color of the ambient light. kd 0.8 # diffuse-reflection coefficient. diffuse .9 1 .4 # diffuse color. # (In "shading constant" mode, the surface # is colored with the diffuse color.) ks 1.0 # specular reflection coefficient. specular 1 1 1 # specular (highlight) color. shininess 25 # specular exponent; larger values give # sharper highlights. backdiffuse .7 .5 0 # back-face color for two-sided surfaces # If defined, this field determines the diffuse # color for the back side of a surface. # It's implemented by the software shader, and # by hardware shading on GL systems which support # two-sided lighting, and under Open GL. alpha 1.0 # opacity; 0 = transparent (invisible), 1 = opaque. # Ignored when transparency is disabled. edgecolor 1 1 0 # line & edge color normalcolor 0 0 0 # color for surface-normal vectors } Geometry Center Thu Dec 12 02:36:08 CST 1996 6 OOGL(5) OOGL(5) lighting { # Lighting model ambient .3 .3 .3 # ambient light replacelights # "Use only the following lights to # illuminate the objects under this # appearance." # Without "replacelights", any lights listed # are added to those already in the scene. # Now a collection of sample lights: light { color 1 .7 .6 # light color position 1 0 .5 0 # light position [distant light] # given in homogeneous coordinates. # With fourth component = 0, # this means a light coming from # direction (1,0,.5). } light { # Another light. color 1 1 1 position 0 0 .5 1 # light at finite position ... location camera # specified in camera coordinates. # (Since the camera looks toward -Z, # this example places the light # .5 unit behind the eye.) # Possible "location" keywords: # global light position is in world (well, universe) coordinates # This is the default if no location specified. # camera position is in the camera's coordinate system # local position is in the coordinate system where # the appearance was defined } } # end lighting model texture { clamp st # or "s" or "t" or "none" file lump.tiff # file supplying texture-map image alphafile mask.pgm.Z # file supplying transparency-mask image apply blend # or "modulate" or "decal" transform 1 0 0 0 # surface (s,t,0,1) * tfm -> texture coords 0 1 0 0 0 0 1 0 .5 0 0 1 background 1 0 0 1 # relevant for "apply blend" } } # end appearance There are rules for inheritance of appearance attributes when several are imposed at different levels in the hierarchy. For example, Geomview installs a backstop appearance which provides Geometry Center Thu Dec 12 02:36:08 CST 1996 7 OOGL(5) OOGL(5) default values for most parameters; its control panels install other appearances which supply new values for a few attributes; user-supplied geometry may also contain appearances. The general rule is that the child's appearance (the one closest to the geometric primitives) wins. Further, appearance controls with "override" status (e.g. *+face or material { *diffuse 1 1 0 }) win over those without it. Geomview's appearance controls use the "override" feature so as to be effective even if user-supplied objects contain their own appearance settings. However, if a user-supplied object contains an appearance field with override status set, that property will be immune to Geomview's controls. Texture Mapping --------------- Some platforms support texture-mapped objects. (On those which don't, attempts to use texture mapping are silently ignored.) A texture is specified as part of an appearance structure, as in *Note Appearances::. Briefly, one provides a texture image, which is considered to lie in a square in `(s,t)' parameter space in the range 0 <= s <= 1, 0 <= t <= 1. Then one provides a geometric primitive, with each vertex tagged with `(s,t)' texture coordinates. If texturing is enabled, the appropriate portion of the texture image is pasted onto each face of the textured object. There is (currently) no provision for inheritance of part of a texture structure; if the `texture' keyword is mentioned in an appearance, it supplants any other texture specification. The appearance attribute `texturing' controls whether textures are used; there's no performance penalty for having texture { ... } fields defined when texturing is off. The available fields are: clamp none -or- s -or- t -or- st Determines the meaning of texture coordinates outside the range 0..1. With `clamp none', the default, coordinates are interpreted modulo 1, so (s,t) = (1.25,0), (.25,0), and (-.75,0) all refer to the same point in texture space. With `s' or `t' or `st', either or both of s- or t-coordinates less than 0 or greater than 1 are clamped to 1 or 0, respectively. file filename alphafile filename Specifies image file(s) containing the texture. The `file' file's image specifies color or lightness information; the `alphafile' if present, specifies a transparency ("alpha") mask; where the mask is zero, pixels are simply not drawn. Several image file formats are available; the file type must be Geometry Center Thu Dec 12 02:36:08 CST 1996 8 OOGL(5) OOGL(5) indicated by the last few characters of the file name: .ppm or .ppm.Z or .ppm.gz 24-bit 3-color image in PPM format .pgm or .pgm.Z or .pgm.gz 8-bit grayscale image in PGM format .sgi or .sgi.Z or .sgi.gz 8-bit, 24-bit, or 32-bit SGI image .tiff 8-bit or 24-bit TIFF image .gif GIF image (Though 4-channel TIFF images are possible, and could represent both color and transparency information in one image, that's not supported in geomview at present.) For this feature to work, some programs must be available in geomview's search path: zcat for .Z files gzip for .gz files tifftopnm for .tiff files giftoppm for .gif files If an `alphafile' image is supplied, it must be the same size as the `file' image. apply modulate -or- blend -or- decal Indicates how the texture image is applied to the surface. Here the "surface color" means the color that surface would have in the absence of texture mapping. With `modulate', the default, the texture color (or lightness, if textured by a gray-scale image) is multiplied by the surface color. With `blend', texture blends between the `background' color and the surface color. The `file' parameter must specify a gray-scale image. Where the texture image is 0, the surface color is unaffected; where it's 1, the surface is painted in the color given by `background'; and color is interpolated for intermediate values. With `decal', the `file' parameter must specify a 3-color image. If an `alphafile' parameter is present, its value interpolates between the surface color (where alpha=0) and the texture color (where alpha=1). Lighting does not affect the texture color in `decal' mode; effectively the texture is constant-shaded. background R G B A Specifies a 4-component color, with R, G, B, and A floating-point numbers normally in the range 0..1, used when `apply blend' is selected. transform `transformation-matrix' Expects a list of 16 numbers, or one of the other ways of representing a transformation (`: handlename' or `< filename'). The 4x4 transformation matrix is applied to texture coordinates, in the sense of a 4-component row vector (s,t,0,1) multiplied on the left of the matrix, to produce new coordinates (s',t') which actually index the texture. Geometry Center Thu Dec 12 02:36:08 CST 1996 9 OOGL(5) OOGL(5) Object File Formats =================== QUAD: collection of quadrilaterals ---------------------------------- The conventional suffix for a `QUAD' file is `.quad'. The file syntax is [C][N][4]QUAD -or- [C][N][4]POLY # Key word VERTEX VERTEX VERTEX VERTEX # 4*N vertices for some N VERTEX VERTEX VERTEX VERTEX ... The leading key word is `[C][N][4]QUAD' or `[C][N][4]POLY', where the optional `C' and `N' prefixes indicate that each vertex includes colors and normals respectively. That is, these files begin with one of the words `QUAD' `CQUAD' `NQUAD' `CNQUAD' `POLY' `CPOLY' `NPOLY' `CNPOLY' (but not `NCQUAD' or `NCPOLY'). `QUAD' and `POLY' are synonymous; both forms are allowed just for compatibility with ChapReyes. Following the key word is an arbitrary number of groups of four vertices, each group describing a quadrilateral. See the Vertex syntax above. The object ends at end-of-file, or with a closebrace if incorporated into an object reference (see above). A `QUAD BINARY' file format is accepted; *Note Binary format::. The first word of binary data must be a 32-bit integer giving the number of quads in the object; following that is a series of 32-bit floats, arranged just as in the ASCII format. MESH: rectangularly-connected mesh ---------------------------------- The conventional suffix for a `MESH' file is `.mesh'. The file syntax is [U][C][N][Z][4][u][v][n]MESH # Key word [NDIM] # Space dimension, present only if nMESH NU NV # Mesh grid dimensions # NU*NV vertices, in format specified # by initial key word VERTEX(u=0,v=0) VERTEX(1,0) ... VERTEX(NU-1,0) VERTEX(0,1) ... VERTEX(NU-1,1) ... VERTEX(0,NV-1) ... VERTEX(NU-1,NV-1) Geometry Center Thu Dec 12 02:36:08 CST 1996 10 OOGL(5) OOGL(5) The key word is `[U][C][N][Z][4][u][v][n]MESH'. The optional prefix characters mean: `U' Each vertex includes a 3-component texture space parameter. The first two components are the usual `S' and `T' texture parameters for that vertex; the third should be specified as zero. `C' Each vertex (see Vertices above) includes a 4-component color. `N' Each vertex includes a surface normal vector. `Z' Of the 3 vertex position values, only the Z component is present; X and Y are omitted, and assumed to equal the mesh (u,v) coordinate so X ranges from 0 .. (Nu-1), Y from 0 .. (Nv-1) where Nu and Nv are the mesh dimensions -- see below. `4' Vertices are 4D, each consists of 4 floating values. `Z' and `4' cannot both be present. `u' The mesh is wrapped in the u-direction, so the (0,v)'th vertex is connected to the (NU-1,v)'th for all v. `v' The mesh is wrapped in the v-direction, so the (u,0)'th vertex is connected to the (u,NV-1)'th for all u. Thus a u-wrapped or v-wrapped mesh is topologically a cylinder, while a uv-wrapped mesh is a torus. `n' Specifies a mesh whose vertices live in a higher dimensional space. The dimension follows the "MESH" keyword. Each vertex then has NDIM components. Note that the order of prefix characters is significant; a colored, u-wrapped mesh is a `CuMESH' not a `uCMESH'. Following the mesh header are integers NU and NV, the dimensions of the mesh. Then follow NU*NV vertices, each in the form given by the header. They appear in v-major order, i.e. if we name each vertex by (u,v) then the vertices appear in the order (0,0) (1,0) (2,0) (3,0) ... (NU-1,0) (0,1) (1,1) (2,1) (3,1) ... (NU-1,1) ... (0,Nv-1) ... (NU-1,NV-1) A `MESH BINARY' format is accepted; *Note Binary format::. The values of NU and NV are 32-bit integers; all other values are 32-bit floats. Bezier Surfaces --------------- Geometry Center Thu Dec 12 02:36:08 CST 1996 11 OOGL(5) OOGL(5) The conventional file suffixes for Bezier surface files are `.bbp' or `.bez'. A file with either suffix may contain either type of patch. Syntax: [ST]BBP -or- [C]BEZ[_ST] # NU, NV are u- and v-direction # polynomial degrees in range 1..6 # ND = dimension: 3->3-D, 4->4-D (rational) # (The '<' and '>' do not appear in the input.) # NU,NV,ND are each a single decimal digit. # BBP form implies NU=NV=ND=3 so BBP = BEZ333. # Any number of patches follow the header # (NU+1)*(NV+1) patch control points # each 3 or 4 floats according to header VERTEX(u=0,v=0) VERTEX(1,0) ... VERTEX(NU,0) VERTEX(0,1) ... VERTEX(NU,1) ... VERTEX(0,NV) ... VERTEX(NU,NV) # ST texture coordinates if mentioned in header `S'(u=0,v=0) `T'(0,0) `S'(0,NV) `T'(0,NV) `S'(NU,0) `T'(NU,0) `S'(NU,NV) `T'(NU,NV) # 4-component float (0..1) R G B A colors # for each patch corner if mentioned in header `RGBA'(0,0) `RGBA'(0,NV) `RGBA'(NU,0) `RGBA'(NU,NV) These formats represent collections of Bezier surface patches, of degrees up to 6, and with 3-D or 4-D (rational) vertices. The header keyword has the forms `[ST]BBP' or `[C]BEZ[_ST]' (the '<' and '>' are not part of the keyword. The `ST' prefix on `BBP', or `_ST' suffix on `BEZuvn', indicates that each patch includes four pairs of floating-point texture-space coordinates, one for each corner of the patch. The `C' prefix on `BEZuvn' indicates a colored patch, including four sets of four-component floating-point colors (red, green, blue, and alpha) in the range 0..1, one color for each corner. NU and NV, each a single digit in the range 1..6, are the patch's polynomial degree in the u and v direction respectively. ND is the number of components in each patch vertex, and must be either `3' for 3-D or `4' for homogeneous coordinates, that is, rational patches. Geometry Center Thu Dec 12 02:36:08 CST 1996 12 OOGL(5) OOGL(5) `BBP' patches are bicubic patches with 3-D vertices, so `BBP' = `BEZ333' and `STBBP' = `BEZ333_ST'. Any number of patches follow the header. Each patch comprises a series of patch vertices, followed by optional (s,t) texture coordinates, followed by optional (r,g,b,a) colors. Each patch has (NU+1)*(NV+1) vertices in v-major order, so that if we designate a vertex by its control point indices (u,v) the order is (0,0) (1,0) (2,0) ... (NU,0) (0,1) (1,1) (2,1) ... (NU,1) ... (0,NV) ... (NU,NV) with each vertex containing either 3 or 4 floating-point numbers as specified by the header. If the header calls for ST coordinates, four pairs of floating-point numbers follow: the texture-space coordinates for the (0,0), (NU,0), (0,NV), and (NU,NV) corners of the patch, respectively. If the header calls for colors, four four-component (red, green, blue, alpha) floating-point colors follow, one for each patch corner. The series of patches ends at end-of-file, or with a closebrace if incorporated in an object reference. Info file: geomview, -*-Text-*- produced by texinfo-format-buffer from file: geomview.tex OFF Files --------- The conventional suffix for `OFF' files is `.off'. Syntax: [ST][C][N][4][n]OFF # Header keyword [NDIM] # Space dimension of vertices, present only if nOFF NVERTICES NFACES NEDGES # NEdges not used or checked X[0] Y[0] Z[0] # Vertices, possibly with normals, # colors, and/or texture coordinates, in that order, # if the prefixes `N', `C', `ST' # are present. # If 4OFF, each vertex has 4 components, # including a final homogeneous component. # If nOFF, each vertex has NDIM components. # If 4nOFF, each vertex has NDIM+1 components. ... X[NVERTICES-1] Y[NVERTICES-1] Z[NVERTICES-1] Geometry Center Thu Dec 12 02:36:08 CST 1996 13 OOGL(5) OOGL(5) # Faces # NV = # vertices on this face # V[0] ... V[NV-1]: vertex indices # in range 0..NVERTICES-1 NV V[0] V[1] ... V[NV-1] COLORSPEC ... # COLORSPEC continues past V[NV-1] # to end-of-line; may be 0 to 4 numbers # nothing: default # integer: colormap index # 3 or 4 integers: RGB[A] values 0..255 # 3 or 4 floats: RGB[A] values 0..1 `OFF' files (name for "object file format") represent collections of planar polygons with possibly shared vertices, a convenient way to describe polyhedra. The polygons may be concave but there's no provision for polygons containing holes. An `OFF' file may begin with the keyword `OFF'; it's recommended but optional, as many existing files lack this keyword. Three ASCII integers follow: NVERTICES, NFACES, and NEDGES. Thse are the number of vertices, faces, and edges, respectively. Current software does not use nor check NEDGES; it needn't be correct but must be present. The vertex coordinates follow: dimension * NVERTICES floating-point values. They're implicitly numbered 0 through NVERTICES-1. dimension is either 3 (default) or 4 (specified by the key character `4' directly before `OFF' in the keyword). Following these are the face descriptions, typically written with one line per face. Each has the form N VERT1 VERT2 ... VERTN [COLOR] Here N is the number of vertices on this face, and VERT1 through VERTN are indices into the list of vertices (in the range 0..NVERTICES-1). The optional COLOR may take several forms. Line breaks are significant here: the COLOR description begins after VERTN and ends with the end of the line (or the next # comment). A COLOR may be: nothing the default color one integer index into "the" colormap; see below three or four integers RGB and possibly alpha values in the range 0..255 three or four floating-point numbers RGB and possibly alpha values in the range 0..1 For the one-integer case, the colormap is currently read from the file `cmap.fmap' in Geomview's `data' directory. Some better Geometry Center Thu Dec 12 02:36:08 CST 1996 14 OOGL(5) OOGL(5) mechanism for supplying a colormap is likely someday. The meaning of "default color" varies. If no face of the object has a color, all inherit the environment's default material color. If some but not all faces have colors, the default is gray (R,G,B,A=.666). A `[ST][C][N][n]OFF BINARY' format is accepted; *Note Binary format::. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions (and texture coordinates or vertex colors or normals if `COFF'/`NOFF'/`CNOFF'/`STCNOFF'/etc. format). Exception: each face's vertex indices are followed by an integer indicating how many color components accompany it. Face color components must be floats, not integer values. Thus a colorless triangular face might be represented as int int int int int 3 17 5 9 0 while the same face colored red might be int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0 VECT Files ---------- The conventional suffix for `VECT' files is `.vect'. Syntax: [4]VECT NPOLYLINES NVERTICES NCOLORS NV[0] ... NV[NPOLYLINES-1] # number of vertices # in each polyline NC[0] ... NC[NPOLYLINES-1] # number of colors supplied # in each polyline VERT[0] ... VERT[NVERTICES-1] # All the vertices # (3*NVertices floats) COLOR[0] ... COLOR[NCOLORS-1] # All the colors # (4*NColors floats, RGBA) `VECT' objects represent lists of polylines (strings of connected line segments, possibly closed). A degenerate polyline can be used to represent a point. A `VECT' file begins with the key word `VECT' or `4VECT' Geometry Center Thu Dec 12 02:36:08 CST 1996 15 OOGL(5) OOGL(5) and three integers: NLINES, NVERTICES, and NCOLORS. Here NLINES is the number of polylines in the file, NVERTICES the total number of vertices, and NCOLORS the number of colors as explained below. Next come NLINES integers NV[0] NV[1] NV[2] ... NV[NLINES-1] giving the number of vertices in each polyline. A negative number indicates a closed polyline; 1 denotes a single-pixel point. The sum (of absolute values) of the NV[I] must equal NVERTICES. Next come NLINES more integers Nc[i]: the number of colors in each polyline. Normally one of three values: 0 No color is specified for this polyline. It's drawn in the same color as the previous polyline. 1 A single color is specified. The entire polyline is drawn in that color. abs(NV[I]) Each vertex has a color. Either each segment is drawn in the corresponding color, or the colors are smoothly interpolated along the line segments, depending on the implementation. The sum of the NC[I] must equal NCOLORS. Next come NVERTICES groups of 3 or 4 floating-point numbers: the coordinates of all the vertices. If the keyword is 4VECT then there are 4 values per vertex. The first abs(NV[0]) of them form the first polyline, the next abs(NV[1]) form the second and so on. Finally NCOLORS groups of 4 floating-point numbers give red, green, blue and alpha (opacity) values. The first NC[0] of them apply to the first polyline, and so on. A VECT BINARY format is accepted; *Note Binary format::. The binary format exactly follows the ASCII format, with 32-bit ints where integers appear, and 32-bit floats where real values appear. SKEL Files ---------- `SKEL' files represent collections of points and polylines, with shared vertices. The conventional suffix for `SKEL' files is `.skel'. Syntax: Geometry Center Thu Dec 12 02:36:08 CST 1996 16 OOGL(5) OOGL(5) [4][n]SKEL [NDIM] # Vertex dimension, present only if nSKEL NVERTICES NPOLYLINES X[0] Y[0] Z[0] # Vertices # (if nSKEL, each vertex has NDim components) ... X[NVERTICES-1] Y[NVERTICES-1] Z[NVERTICES-1] # Polylines # NV = # vertices on this polyline (1 = point) # V[0] ... V[NV-1]: vertex indices # in range 0..NVERTICES-1 NV V[0] V[1] ... V[NV-1] [COLORSPEC] ... # COLORSPEC continues past V[NV-1] # to end-of-line; may be nothing, or 3 or 4 numbers. # nothing: default color # 3 or 4 floats: RGB[A] values 0..1 The syntax resembles that of `OFF' files, with a table of vertices followed by a sequence of polyline descriptions, each referring to vertices by index in the table. Each polyline has an optional color. For `nSKEL' objects, each vertex has NDIM components. For `4nSKEL' objects, each vertex has NDIM+1 components; the final component is the homogeneous divisor. No `BINARY' format is implemented as yet for `SKEL' objects. SPHERE Files ------------ The conventional suffix for `SPHERE' files is `.sph'. SPHERE RADIUS XCENTER YCENTER ZCENTER Sphere objects are drawn using rational Bezier patches, which are diced into meshes; their smoothness, and the time taken to draw them, depends on the setting of the dicing level, 10x10 by default. From Geomview, the Appearance panel, the `ad' keyboard command, or a `dice nu nv' Appearance attribute sets this. INST Files ---------- The conventional suffix for a `INST' file is `.inst'. There is no INST BINARY format. An `INST' applies a 4x4 transformation to another OOGL object. It Geometry Center Thu Dec 12 02:36:08 CST 1996 17 OOGL(5) OOGL(5) begins with `INST' followed by these sections which may appear in any order: geom OOGL-OBJECT specifies the OOGL object to be instantiated. *Note References::, for the syntax of an OOGL-OBJECT. The keyword `unit' is a synonym for `geom'. transform ["{"] `4x4 transform' ["}"] specifies a single transformation matrix. Either the matrix may appear literally as 16 numbers, or there may be a reference to a "transform" object, i.e. "<" file-containing-4x4-matrix or ":" symbol-representing-transform-object> Another way to specify the transformation is transforms OOGL-OBJECT The OOGL-OBJECT must be a `TLIST' object (list of transformations) object, or a `LIST' whose members are ultimately `TLIST' objects. In effect, the `transforms' keyword takes a collection of 4x4 matrices and replicates the `geom' object, making one copy for each 4x4 matrix. If no `transform' nor `transforms' keyword appears, no transformation is applied (actually the identity is applied). You could use this for, e.g., wrapping an appearance around an externally-supplied object, though a single-membered LIST would do this more efficiently. *Note Transformation matrices::, for the matrix format. Two more INST fields are accepted: `location' and `origin'. location [global or camera or ndc or screen or local] Normally an INST specifies a position relative to its parent object; the `location' field allows putting an object elsewhere. * `location global' attaches the object to the global (a.k.a. universe) coordinate system -- the same as that in which geomview's World objects, alien geometry, and cameras are placed. * `location camera' places the object relative to the camera. (Thus if there are multiple views, it may appear in a different spatial position in each view.) The center of the camera's view is along its negative Z axis; positive X is rightward, positive Y upward. Normally the units of camera space are the same as global coordinates. When a camera is reset, the global origin is at (0,0,-3.0). * `location ndc' places the object relative to the normalized unit cube into which the camera's projection (perspective or orthographic) maps the visible world. X, Y, and Z are each in the range from -1 to +1, with Z = -1 the near and Z = +1 the far clipping plane, and X and Y increasing rightward and upward respectively. Thus something like INST transform 1 0 0 0 0 1 0 0 0 0 1 0 -.9 -.9 -.999 1 location ndc geom < label.vect pastes `label.vect' onto the lower left corner of each window, Geometry Center Thu Dec 12 02:36:08 CST 1996 18 OOGL(5) OOGL(5) and in front of nearly everything else, assuming `label.vect''s contents lie in the positive quadrant of the X-Y plane. It's tempting to use -1 rather than -.999 as the Z component of the position, but that may put the object just nearer than the near clipping plane and make it (partially) invisible, due to floating-point error. * `location screen' places the object in screen coordinates. The range of Z is still -1 through +1 as for ndc coordinates; X and Y are measured in pixels, and range from (0,0) at the *lower left* corner of the window, increasing rightward and upward. `location local' is the default; the object is positioned relative to its parent. origin [global or camera or ndc or screen or local] x y z The `origin' field translates the contents of the INST to place the origin at the specified point of the given coordinate system. Unlike `location', it doesn't change the orientation, only the choice of origin. Both `location' and `origin' can be used together. So for example { INST location screen origin ndc 0 0 -.99 geom { < xyz.vect } transform { 100 0 0 0 0 100 0 0 0 0 -.009 0 0 0 0 1 } } places xyz.vect's origin in the center of the window, just beyond the near clipping plane. The unit-length X and Y edges are scaled to be just 100 screen units -- pixels -- long, regardless of the size of the window. INST Examples ............. Here are some examples of `INST' files INST unit < xyz.vect transform { 1 0 0 0 0 1 0 0 0 0 1 0 1 3 0 1 } { appearance { +edge material { edgecolor 1 1 0 } } INST geom < mysurface.quad } {INST transform {: T} geom { } } geom { # stuff replicated by all the above matrices ... } } This one resembles the `origin' example in the section above, but makes the X and Y edges be 1/4 the size of the window (1/4, not 1/2, since the range of ndc X and Y coordinates is -1 to +1). { INST location ndc geom { < xyz.vect } transform { .5 0 0 0 0 .5 0 0 0 0 -.009 0 0 0 -.99 1 } } LIST Files ---------- The conventional suffix for a `LIST' file is `.list'. A list of OOGL objects Syntax: LIST OOGL-OBJECT OOGL-OBJECT ... Note that there's no explicit separation between the oogl-objects, so they should be enclosed in curly braces ({ }) for sanity. Likewise there's no explicit marker for the end of the list; unless appearing alone in a disk file, the whole construct should also be wrapped in braces, as in: { LIST { QUAD ... } { < xyz.quad } } A `LIST' with no elements, i.e. `{ LIST }', is valid, and is the easiest way to create an empty object. For example, to remove a symbol's definition you might write { define somesymbol { LIST } } TLIST Files ----------- Geometry Center Thu Dec 12 02:36:08 CST 1996 20 OOGL(5) OOGL(5) The conventional suffix for a `TLIST' file is `.grp' ("group") or or `.prj' ("projective" matrices). Collection of 4x4 matrices, used in the `transforms' section of and `INST' object. Syntax: TLIST # key word <4x4 matrix (16 floats)> ... # Any number of 4x4 matrices `TLIST's are used only within the `transforms' clause of an `INST' object. They cause the `INST's `geom' object to be instantiated once under each of the transforms in the `TLIST'. The effect is like that of a `LIST' of `INST's each with a single transform, and all referring to the same object, but is more efficient. Be aware that a `TLIST' is a kind of geometry object, distinct from a `transform' object. Some contexts expect one type of object, some the other. For example in INST transform { : MYT } geom { ... } MYT must be a transform object, which might have been created with the gcl (read transform { define myT 1 0 0 1 ... }) while in INST transforms { : MYTS } geom { ... } or INST transforms { LIST {: MYTS} {< more.prj} } geom { ... } MYTS must be a geometry object, defined e.g. with (read geometry { define MYTS { TLIST 1 0 0 1 ... } }) A `TLIST BINARY' format is accepted. Binary data begins with a 32-bit integer giving the number of transformations, followed by that number of 4x4 matrices in 32-bit floating-point format. The order of matrix elements is the same as in the ASCII format. GROUP Files ----------- This format is obsolete, but is still accepted. It combined the functions of `INST' and `TLIST', taking a series of transformations and a single Geom (`unit') object, and replicating the object under each transformation. GROUP ... < matrices > ... unit { OOGL-OBJECT } is still accepted and effectively translated into INST transforms { TLIST ... ... } Geometry Center Thu Dec 12 02:36:08 CST 1996 21 OOGL(5) OOGL(5) unit { OOGL-OBJECT } DISCGRP Files ------------- This format is for discrete groups, such as appear in the theory of manifolds or in symmetry patterns. This format has its own man page. See discgrp(5). COMMENT Objects --------------- The COMMENT object is a mechanism for encoding arbitrary data within an OOGL object. It can be used to keep track of data or pass data back and forth between external modules. Syntax: COMMENT # key word NAME TYPE # individual name and type specifier { ... } # arbitrary data The data, which must be enclosed by curly braces, can include anything except unbalanced curly braces. The TYPE field can be used to identify data of interest to a particular program through naming conventions. `COMMENT' objects are intended to be associated with other objects through inclusion in a `LIST' object. (*Note LIST::.) The "#" OOGL comment syntax does not suffice for data exchange since these comments are stripped when an OOGL object is read in to Geomview. The `COMMENT' object is preserved when loaded into Geomview and is written out intact. Here is an example associating a WorldWide Web URL with a piece of geometry: { LIST { < Tetrahedron} {COMMENT GCHomepage HREF { http://www.geomview.org }} } A binary `COMMENT' format is accepted. Its format is not consistent with the other OOGL binary formats. *Note Binary format::. The `name' and `type' are followed by N BYTE1 BYTE2 ... BYTEN instead of data enclosed in curly braces. Geometry Center Thu Dec 12 02:36:08 CST 1996 22 OOGL(5) OOGL(5) Non-geometric objects ===================== The syntax of these objects is given in the form used in *Note References::, where "quoted" items should appear literally but without quotes, square bracketed ([ ]) items are optional, and | separates alternative choices. Transform Objects ----------------- Where a single 4x4 matrix is expected -- as in the `INST' `transform' field, the camera's `camtoworld' transform and the Geomview `xform*' commands -- use a transform object. Note that a transform is distinct from a `TLIST', which is a type of geometry. `TLIST's can contain one or more 4x4 transformations; "transform" objects must have exactly one. Why have both? In many places -- e.g. camera positioning -- it's only meaningful to have a single transform. Using a separate object type enforces this. Syntax for a transform object is ::= [ "{" ] (curly brace, generally needed to make the end of the object unambiguous.) [ "transform" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines a transform named , setting its value from the stuff which follows) (interpreted as a 4x4 homogeneous transform given row by row, intended to apply to a row vector multiplied on its LEFT, so that e.g. Euclidean translations appear in the bottom row) | "<" (meaning: read transform from that file) | ":" (meaning: use variable , defined elsewhere; if undefined the initial value is the identity transform) [ "}" ] (matching curly brace) The whole should be enclosed in { braces }. Braces are not essential if exactly one of the above items is present, so e.g. a 4x4 array of floats standing alone may but needn't have braces. Geometry Center Thu Dec 12 02:36:08 CST 1996 23 OOGL(5) OOGL(5) Some examples, in contexts where they might be used: # Example 1: A gcl command to define a transform # called "fred" (read transform { transform define fred 1 0 0 0 0 1 0 0 0 0 1 0 -3 0 1 1 } ) # Example 2: A camera object using transform # "fred" for camera positioning # Given the definition above, this puts the camera at # (-3, 0, 1), looking toward -Z. { camera halfyfield 1 aspect 1.33 camtoworld { : fred } } cameras ------- A camera object specifies the following properties of a camera: position and orientation specified by either a camera-to-world or world-to-camera transformation; this transformation does not include the projection, so it's typically just a combination of translation and rotation. Specified as a transform object, typically a 4x4 matrix. "focus" distance Intended to suggest a typical distance from the camera to the object of interest; used for default camera positioning (the camera is placed at (X,Y,Z) = (0,0,focus) when reset) and for adjusting field-of-view when switching between perspective and orthographic views. window aspect ratio True aspect ratio in the sense /. This normally should agree with the aspect ratio of the camera's window. Geomview normally adjusts the aspect ratio of its cameras to match their associated windows. near and far clipping plane distances Note that both must be strictly greater than zero. Very large / distance ratios cause Z-buffering to behave badly; part of an object may be visible even if somewhat more distant than another. field of view Specified in either of two forms. `fov ' is the field of view -- in degrees if perspective, or linear Geometry Center Thu Dec 12 02:36:08 CST 1996 24 OOGL(5) OOGL(5) distance if orthographic -- in the *shorter* direction. `halfyfield ' is half the projected Y-axis field, in world coordinates (not angle!), at unit distance from the camera. For a perspective camera, halfyfield is related to angular field: halfyfield = tan( Y_axis_angular_field / 2 ) while for an orthographic one it's simply: halfyfield = Y_axis_linear_field / 2 This odd-seeming definition is (a) easy to calculate with and (b) well-defined in both orthographic and perspective views. The syntax for a camera is: ::= [ "camera" ] (optional keyword) [ "{" ] (opening brace, generally required) [ "define" ] "<" | ":" | (or any number of the following, in any order...) "perspective" {"0" | "1"} (default 1) (otherwise orthographic) "stereo" {"0" | "1"} (default 0) (otherwise mono) "worldtocam" (see transform syntax above) "camtoworld" (no point in specifying both camtoworld and worldtocam; one is constrained to be the inverse of the other) "halfyfield" (default tan 40/2 degrees) "fov" (angular field-of-view if perspective, linear field-of-view otherwise. Measured in whichever direction is smaller, given the aspect ratio. When aspect ratio changes -- e.g. when a window is reshaped -- Geometry Center Thu Dec 12 02:36:08 CST 1996 25 OOGL(5) OOGL(5) "fov" is preserved.) "frameaspect" (X/Y) (default 1.333) "near" (default 0.1) "far" (default 10.0) "focus" (default 3.0) [ "}" ] (matching closebrace) window ------ A window object specifies size, position, and other window-system related information about a window in a device-independent way. The syntax for a window object is: window ::= [ "window" ] (optional keyword) [ "{" ] (curly brace, often required) (any of the following, in any order) "size" (size of the window) "position" (position & size) "noborder" (specifies the window should have no window border) "pixelaspect" (specifies the true visual aspect ratio of a pixel in this window in the sense xsize/ysize, normally 1.0. For stereo hardware which stretches the display vertically by a factor of 2, "pixelaspect 0.5" might do. The value is used when computing the projection of a camera associated with this window.) [ "}" ] (matching closebrace) Geometry Center Thu Dec 12 02:36:08 CST 1996 26 OOGL(5) OOGL(5) Window objects are used in the Geomview `window' and `ui-panel' commands to set default properties for future windows or to change those of an existing window. Geometry Center Thu Dec 12 02:36:08 CST 1996 27 geomview-1.9.5/doc/geomview0000644000175000017500000001537212310147167012615 00000000000000This is ../../doc/geomview, produced by makeinfo version 4.13 from ../../doc/geomview.texi. INFO-DIR-SECTION Graphics Applications START-INFO-DIR-ENTRY * Geomview: (geomview). The interactive 3D viewing program. END-INFO-DIR-ENTRY  Indirect: geomview-1: 241 geomview-2: 299715  Tag Table: (Indirect) Node: Top241 Node: Intro1649 Node: Distrib2997 Node: Copying4452 Node: History32893 Node: Authors35658 Node: Platforms36332 Node: Pronunciation36888 Node: Overview37411 Node: Tutorial40106 Ref: figinitial40946 Ref: figlookatworld44872 Ref: figappearance45290 Ref: figcolorchooser46293 Ref: figfilespanel48844 Ref: figtrefdodec49466 Node: Interaction49506 Node: Starting Geomview50286 Node: Command Line Options50859 Node: Basic Interaction55521 Ref: figmainpanel56083 Node: Loading61397 Ref: figmyfilelist61742 Ref: figloadpanel64511 Node: Mouse Motions64814 Ref: figtools65441 Node: Point of Interest74358 Node: Appearance77352 Node: Appearance Panel79130 Ref: figap79383 Ref: figcolorchooserpanel80842 Node: Materials Panel86760 Ref: figmatpanel87067 Node: Lighting Panel89343 Node: Cameras91864 Ref: figcamerapanel92242 Node: Saving98496 Ref: figsavepanel98766 Node: Commands104101 Ref: figcommandpanel104660 Node: Keyboard Shortcuts104730 Node: OOGL File Formats110200 Node: Conventions110893 Node: Common syntax111675 Node: File names112882 Node: Vertices113348 Node: ND-Vertices114808 Node: Surface normal directions116065 Node: Transformation matrices116803 Node: ND Transformation matrices117712 Node: Binary format118609 Node: References120128 Node: Appearances122645 Node: Texture Mapping132543 Node: Object File Formats138210 Node: QUAD139284 Node: MESH140656 Node: BBOX143308 Node: BBP and BEZ144454 Node: OFF147998 Node: VECT152371 Node: SKEL155183 Node: SPHERE157615 Node: INST159472 Node: INST Examples165297 Node: LIST166372 Node: TLIST167204 Node: GROUP169221 Node: DISCGRP169777 Node: COMMENT170065 Node: Non-geometric objects171516 Node: appearance objects172211 Node: image objects172605 Node: transform objects182933 Node: ntransform objects185593 Node: camera objects189326 Node: window objects194117 Node: Customization195968 Node: Modules198055 Node: Interface199430 Node: Example1201331 Node: Example2208781 Node: XForms217314 Node: Example3218015 Node: Example4239406 Node: Module Installation245655 Node: Private Module Installation246254 Node: System Module Installation247514 Node: GCL248892 Node: Argument Conventions252005 Node: GCL Reference254751 Node: shell-shortcut264817 Node: lt264979 Node: eq265223 Node: gt265454 Node: mul265690 Node: div265855 Node: add266017 Node: sub266177 Node: help-shortcut266354 Node: morehelp-shortcut266745 Node: emodule-run-shortcut267032 Node: all267202 Node: and267672 Node: ap-override267902 Node: backcolor268206 Node: background-image268451 Node: bbox-color269077 Node: bbox-draw269328 Node: camera269596 Node: camera-draw270017 Node: camera-prop270264 Node: camera-reset270918 Node: car271115 Node: cdr271275 Node: clock271458 Node: command271739 Node: cons272018 Node: copy272268 Node: cursor-still272575 Node: cursor-twitch272912 Node: defun273247 Node: delete274474 Node: dice274631 Node: dimension274944 Node: dither275369 Node: draw275563 Node: dump-handles275780 Node: echo276046 Node: emodule-clear276492 Node: emodule-define276714 Node: emodule-defined277176 Node: emodule-isrunning277578 Node: emodule-path278014 Node: emodule-run278425 Node: emodule-sort279651 Node: emodule-start279877 Node: emodule-transmit280187 Node: escale280664 Node: eval280871 Node: event-keys281368 Node: event-mode281598 Node: event-pick282053 Node: evert282234 Node: exit282488 Node: ezoom282628 Node: freeze282819 Node: geometry283126 Node: geomview-version283569 Node: hdefine283817 Node: hdelete284521 Node: help285587 Node: hmodel285870 Node: hsphere-draw286128 Node: if286493 Node: inhibit-warning286820 Node: input-translator287212 Node: interest287880 Node: lambda289354 Node: let290502 Node: lines-closer291350 Node: load292021 Node: load-path292635 Node: look293017 Node: look-encompass293778 Node: look-encompass-size294300 Node: look-recenter294984 Node: look-toward295628 Node: merge296173 Node: merge-ap296607 Node: merge-base-ap296928 Node: merge-baseap297178 Node: mod297533 Node: morehelp297720 Node: name-object297962 Node: ND-axes298337 Node: ND-color299715 Node: ND-xform300951 Node: ND-xform-get301428 Node: ND-xform-set301910 Node: new-alien302478 Node: new-camera303220 Node: new-center303579 Node: new-geometry304045 Node: new-reset304503 Node: NeXT304715 Node: normalization304940 Node: not306168 Node: or306403 Node: pick306660 Node: pick-invisible308230 Node: pickable308561 Node: position308840 Node: position-at309053 Node: position-toward309406 Node: process-events309838 Node: progn310392 Node: quit310729 Node: quote310894 Node: rawevent311197 Node: rawpick311590 Node: read311898 Node: real-id312582 Node: redraw313077 Node: regtable313345 Node: rehash-emodule-path313522 Node: replace-geometry314162 Node: rib-display314431 Node: rib-snapshot315194 Node: scale315557 Node: scene316310 Node: set-clock316514 Node: set-conformal-refine316863 Node: set-emodule-path317566 Node: set-load-path318302 Node: set-motionscale318768 Node: setenv319414 Node: setq319753 Node: sgi320776 Node: shell320995 Node: sleep-for321291 Node: sleep-until321645 Node: snapshot322269 Node: soft-shader323976 Node: space324218 Node: stereowin324427 Node: time-interests325368 Node: transform326261 Node: transform-incr328129 Node: transform-set328948 Node: truncate329299 Node: ui-cam-focus329482 Node: ui-center330558 Node: ui-center-origin330805 Node: ui-emotion-program331625 Node: ui-emotion-run331936 Node: ui-freeze332226 Node: ui-html-browser332450 Node: ui-motion333007 Node: ui-panel334812 Node: ui-pdf-viewer335909 Node: ui-target336465 Node: uninterest337011 Node: update337326 Node: update-draw337635 Node: while337987 Node: window338182 Node: winenter338592 Node: write338890 Node: write-comments339989 Node: write-handle341368 Node: write-sexpr341682 Node: xform341963 Node: xform-incr342212 Node: xform-set342539 Node: zoom342798 Node: Non-Euclidean Geometry343019 Node: Mathematica345440 Node: OOGL.m346937 Node: Geomview.m348849 Node: RenderMan351592 Node: Remote Display354223 Node: Networked Geomview354960 Node: Chunks356824 Node: Package Details358328 Node: Package Installation359776 Node: Installation364153 Node: Unix Binary Installation365303 Node: Unix Binary Detail368569 Node: Source Code Installation371440 Node: Support375501 Node: Contributing376661 Node: Function Index378236 Node: List of Figures391014  End Tag Table geomview-1.9.5/doc/geomview-10000644000175000017500000111130312310147167012743 00000000000000This is ../../doc/geomview, produced by makeinfo version 4.13 from ../../doc/geomview.texi. INFO-DIR-SECTION Graphics Applications START-INFO-DIR-ENTRY * Geomview: (geomview). The interactive 3D viewing program. END-INFO-DIR-ENTRY  File: geomview, Node: Top, Next: Intro, Prev: (dir), Up: (dir) Geomview, the interactive 3D viewing program. * Menu: * Intro:: Introduction to Geomview. * Distrib:: How to get the latest Geomview distribution. * Copying:: The GNU Lesser Public License. * History:: History of Geomview's Development. * Platforms:: Supported Platforms. * Pronunciation:: How to Pronounce ``Geomview''. * Overview:: Overview of Geomview. * Tutorial:: Introductory Tutorial. * Interaction:: Interacting with Geomview. * OOGL File Formats:: Formats for Geometry Input. * Customization:: Modifying the behavior of Geomview. * Modules:: Programs that use Geomview for graphics display. * GCL:: GCL: the Geomview Command Language. * Non-Euclidean Geometry:: Non-Euclidean Geometry. * Mathematica:: Mathematica Graphics in Geomview or RenderMan. * Installation:: Installing Geomview on your computer. * Support:: Getting Technical Support for Geomview. * Contributing:: How to contribute to Geomview. * Function Index:: A node for each GCL function. * List of Figures:: List of Figures.  File: geomview, Node: Intro, Next: Distrib, Prev: Top, Up: Top Introduction to Geomview ************************ Geomview is an interactive program for viewing and manipulating geometric objects, originally written by staff members of the Geometry Center at the University of Minnesota, starting in 1991. It can be used as a stand-alone viewer for static objects or as a display engine for other programs which produce dynamically changing geometry. It runs on many kinds of Unix computers, including Linux, SGI, Sun, and HP. It also runs with Cygwin. This manual describes Geomview version 1.9. Geomview is free software, available under the terms of the GNU Lesser Public License; *note Copying:: for details. Geomview and this manual are available for download from `http://www.geomview.org'. Permission is granted to make copies of this manual. If you have questions or comments about Geomview or this manual, consider joining in the `geomview-users' mailing list, which is a forum in which users of Geomview communicate to answer each others' questions and to share news about what they are doing with Geomview. The Geomview authors participate in this list and sometimes post answers to questions there. To join the list, visit the list web page at `http://lists.sourceforge.net/mailman/listinfo/geomview-users'.  File: geomview, Node: Distrib, Next: Copying, Prev: Intro, Up: Top Distribution ************ Geomview is "free software"; this means that everyone is free to use it and free to redistribute it on certain conditions. Geomview is not in the public domain; it is copyrighted and there are restrictions on its distribution, but these restrictions are designed to permit everything that a good cooperating citizen would want to do. What is not allowed is to try to prevent others from further sharing any version of Geomview that they might get from you. The precise conditions are found in the GNU Lesser Public License that comes with Geomview and also appears following this section. One way to get a copy of Geomview is from someone else who has it. You need not ask for our permission to do so, or tell any one else; just copy it. If you have access to the Internet, you can get the latest distribution version of Geomview at `http://www.geomview.org'. You may also receive Geomview when you buy a computer. Computer manufacturers are free to distribute copies on the same terms that apply to everyone else. These terms require them to give you the full sources, including whatever changes they may have made, and to permit you to redistribute the Geomview received from them under the usual terms of the General Public License. In other words, the program must be free for you when you get it, not just free for the manufacturer.  File: geomview, Node: Copying, Next: History, Prev: Distrib, Up: Top Copying ******* NOTE: Geomview is distributed under the GNU LESSER GENERAL PUBLIC LICENSE. For the purposes of this license we think of Geomview as if it were a "library", and of Geomview external modules as "programs that link with the library". We do this because we specifically want to allow proprietary programs and modules to use Geomview. GNU LESSER PUBLIC LICENSE ************************* Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble ======== The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software-to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages-typically libraries-of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION =============================================================== 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a. The modified work must itself be a software library. b. You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c. You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d. If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. ^L Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a. Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b. Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c. Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d. If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e. Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a. Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b. Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs ============================================= If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. ONE LINE TO GIVE THE LIBRARY'S NAME AND A BRIEF IDEA OF WHAT IT DOES. Copyright (C) NAME OF AUTHOR This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it!  File: geomview, Node: History, Next: Platforms, Prev: Copying, Up: Top History of Geomview's Development ********************************* Geomview was originally written at the Geometry Center at the University of Minnesota in Minneapolis. The Geometry Center was a research and education center funded by the National Science Foundation, with a mission to promote research and communication of mathematics. Much of the work there involved the use of computers to help visualize mathematical concepts. The project that eventually led to Geomview began in the summer of 1988 with the work of Pat Hanrahan on a viewing program called MinneView. Shortly thereafter Charlie Gunn begin developing OOGL (Object Oriented Graphics Language) in conjunction with MinneView. Many people contributed to OOGL and MinneView, including Stuart Levy, Mark Meuer, Tamara Munzner, Steve Anderson, Mario Lopez, Todd Kaplan. In 1991 the staff of the Geometry Center began work on a new improved version of OOGL, and a new and improved viewing program, which they called Geomview. At that time essentially the only game in town for interactive 3D graphics was Silicon Graphics (SGI), so Geomview was developed initially on SGI workstations, using IRIS GL. The first version was finished in January of 1992. It immediately became very popular among visitors to the Geometry Center, and through the Center's ftp archive (this was before the web) people at other institutions began using it too. In addition to SGI workstations the Geometry Center had quite a few NeXT stations, so soon after Geomview was running on SGIs the staff developed a version for NeXTStep as well. By this time there were several thousand people using it around the world. A few years later the staff ported Geomview to X windows and OpenGL, and eventually, with the demise of NeXT, the NeXT version fell by the wayside. In its mission to foster communication among researchers and educators, the Geometry Center developed a web site, www.geom.umn.edu, in late 1993. It was one of the first 300 web sites in existence. A part of the web site was of course devoted to Geomview, and helped to spread the word about its existence. The Geometry Center closed its "brick and mortar" facilities in August of 1998 (NSF cut its funding), but the web site continued to exist, and Geomview continued to be very popular around the world. In December of 1999 some of the former Geometry Center staff set up `http://www.geomview.org' as a permanent home on the web for Geomview. Geomview's original authors, as well as a number of other volunteers around the world, are still actively involved in using and developing Geomview. * Menu: * Authors:: Authors.  File: geomview, Node: Authors, Prev: History, Up: History Authors ======= Tamara Munzner, Stuart Levy, and Mark Phillips are the original authors of Geomview. Celeste Fowler, Charlie Gunn, and Nathaniel Thurston also made significant contributions. Daniel Krech and Scott Wisdom did the NeXTStep and RenderMan port, and Daeron Meyer and Tim Rowley did the port to X windows. Many other Geometry Center staff members, as well as several people elsewhere, also contributed. Mark Phillips wrote this manual, with substantial help from Stuart Levy and Tamara Munzner. Countless Geomview users have also been of great help by reading it and pointing out mistakes.  File: geomview, Node: Platforms, Next: Pronunciation, Prev: History, Up: Top Supported Platforms ******************* Geomview 1.9 should - in principle - compile and run on any fairly recent Unix-like operating system. Specifically, it runs on Linux and on Cygwin (Cygwin emulates a SystemV Unix-like environment under Microsoft Windows). Unluckily Geomview compiles with MacOS X (Darwin), but seemingly communicating with Geomview by means of pipes and sockets cause segmentation faults. Feel free to fix that! *Note Contributing::, for details.  File: geomview, Node: Pronunciation, Next: Overview, Prev: Platforms, Up: Top How to Pronounce "Geomview" *************************** The word 'Geomview' is a combination of the first syllable of the word 'geometry', and the word 'view'. The authors pronounce it with the accent on the first syllable GE-om-view Some people put the accent on the second syllable, where it falls in the word 'geometry', but the original authors, who invented the name, prefer the accent-on-first-syllable pronunciation.  File: geomview, Node: Overview, Next: Tutorial, Prev: Pronunciation, Up: Top 1 Overview ********** Geomview's main purpose is to display objects whose geometry is given, allowing interactive control over details such as point of view, speed of movement, appearance of surfaces and lines, and so on. Geomview can handle any number of objects and allows both separate and collective control over them. The simplest way to use Geomview is as a stand-alone viewer to see and manipulate objects. It can display objects described in a variety of file formats. It comes with a wide variety of example objects, and you can create your own objects. You can also use Geomview to handle the display of data coming from another program that is running simultaneously. As the other program changes the data, the Geomview image reflects the changes. Programs that generate objects and use Geomview to display them are called _external modules_. External modules can control almost all aspects of Geomview. The idea here is that many aspects of the display and interaction parts of geometry software are independent of the geometric content and can be collected together in a single piece of software that can be used in a wide variety of situations. The author of the external module can then concentrate on implementing the desired algorithms and leave the display aspects to Geomview. Geomview comes with a collection of sample external modules, and this manual describes how to write your own. Geomview is the product of an effort at the Geometry Center to provide interactive geometry software that is particularly appropriate for mathematics research and education. In particular, Geomview can display things in hyperbolic and spherical space as well as Euclidean space. Geomview allows multiple independently controllable objects and cameras. It provides interactive control for motion, appearances (including lighting, shading, and materials), picking on an object, edge or vertex level, snapshots in SGI image file or Renderman RIB format, and adding or deleting objects is provided through direct mouse manipulation, control panels, and keyboard shortcuts. Geomview supports the following simple data types: polyhedra with shared vertices (.off), quadrilaterals, rectangular meshes, vectors, and Bezier surface patches of arbitrary degree including rational patches. Object hierarchies can be constructed with lists of objects and instances of object(s) transformed by one or many 4x4 matrices. Arbitrary portions of changing hierarchies may be transmitted by creating named references. Geomview can display 3-D graphics output from Mathematica and Maple.  File: geomview, Node: Tutorial, Next: Interaction, Prev: Overview, Up: Top 2 Tutorial ********** This chapter leads you through some of the basics of using Geomview. Work through this chapter in front of a computer where you can try out the examples given here to get a feel for what you can do with Geomview. To start Geomview, login to the computer and get a shell window. A shell window is a window in which you can type Unix commands; the prompt in the window usually ends with a '%'. In the shell window (the mouse cursor must be in the window) type the following (`' here means hit the "Enter" key): geomview tetra dodec This command starts up Geomview and loads two example objects, a tetrahedron and a dodecahedron. After a few seconds three windows should appear; *note Figure: figinitial. Figure 2.1: Initial Geomview display. The panel on the left is Geomview's main control panel; it's called the _Main_ panel. The skinny panel in the middle is the _Tools_ panel and is for selecting different kinds of motions. The window on the right is the camera window and in it you see a large tetrahedron and a dodecahedron which is partially obscured by the tetrahedron. Geomview has lots of panels but by default it displays only these three. We'll describe some aspects of these and a couple of the others in this tutorial. You can read more about these and other panels in the later chapters of this manual. Put the mouse cursor in the camera window and press down and hold the left mouse button. Now, while holding down the button, slowly move the mouse around. You should see the picture rotate in the direction you move the mouse. If you lift up on the mouse button while moving the mouse, the picture continues rotating. To stop it, hold the mouse very still and click down and up on the left mouse button. Geomview uses the _glass sphere_ model for mouse-based motion. This means you are supposed to think of the object as being inside an invisible sphere and the mouse cursor is a gripper outside the sphere. When you hold down the left mouse button, the gripper grabs the sphere; when you let go of the button, the gripper releases the sphere. Moving the mouse while holding the button down causes the sphere (and hence the object) to move in the same direction as the mouse. In addition to the two solids you should also see two wire-frame boxes in the camera window. These are the "bounding boxes" of the two objects. By default Geomview puts a bounding box around each object that it displays so that you have an idea of how large it is. Notice that as you move the mouse around the tetrahedron and dodecahedron move as a unit. That is because by default what you are actually moving is the "World". To move an individual object instead of the whole world, move the mouse cursor to the _Targets_ browser in the _Main_ panel. Click (any button) on the word _tetra_. This makes the tetrahedron be the "target object". Now move the cursor back to the camera window and you can rotate just the tetrahedron. The motion that you have been applying up to now has been rotation, because that is the motion mode that is selected in the _Tools_ panel. To translate instead, click on the _Translate_ button. Now when you move the mouse in the camera window while holding down the left button, the tetrahedron (which should still be the target object from before) will translate in the direction you move the mouse. Notice that you can translate it beyond the edge of the window as long as you keep holding the left mouse button down. If you lift up on the mouse button while moving the mouse, the tetrahedron will keep going. It moves rather rapidly so it is very easy to lose track of where it is. If you accidentally lose the tetrahedron by translating it too far out of the view of the window, you can get it back by clicking on the _Center_ button in the _Tools_ panel. This causes it to come back to its initial position. Click on the _Center_ button to bring the tetrahedron home, and then translate it off to one side so that you can completely see the dodecahedron. Your world now has two objects in it that are beside each other. You should see the dodecahedron in the middle of the window and maybe part of the tetrahedron off to one side. Go back to the _Targets_ browser in the _Main_ panel and click on "World" to select the whole world again. Now click on the _Look At_ button in the _Tools_ panel. You should see the dodecahedron and the tetrahedron in the middle of the window next to each other (*note Figure: figlookatworld.). The _Look At_ button positions the camera in such a way that the target object is centered in the window. Figure 2.2: Looking at the world. Now put the cursor over the middle of the dodecahedron and double-click the right mouse button. This means click it down-and-up two times in rapid succession. Notice that the dodecahedron becomes the target object; you can see this in the _Targets_ browser in the _Main_ panel. Double-clicking the right mouse button on an object is another way to make it the target object. [image src="figs/ap.png"] Figure 2.3: The Appearance Panel. Go to the _Inspect_ menu at the top of the _Main_ panel and select _Appearance_. This brings up the _Appearance_ panel. When it appears, if it partially obscures another Geomview window you can move it off to one side by dragging its frame with the middle mouse button down. The _Appearance_ panel lets you control various things about the way Geomview draws objects. Note the buttons labeled _[af] Faces_ and _[ae] Edges_. Click on the _[ae] Edges_ one, and notice that Geomview is now drawing the edges of the dodecahedron. Click on it again and the edges go away. Click several times and watch the edges come and go. When you've had enough of this, leave the edges on and click the _[af] Faces_ button. This toggles the faces on and off. Click the button again to turn them back on. Now click on the _[Cf] Faces_ button under the word _COLOR_. A color chooser panel should appear (*note Figure: figcolorchooser.). Figure 2.4: Color Chooser Panel. Note the three sliders, _H_, _S_, and _V_, controlling the color's hue, saturation, and value (lightness). Clicking the _HSV_ button gives a different set of sliders, one each for red, green, and blue. Numerical values for both RGB and HSV color systems can be seen or edited at the bottom of the panel. The dodecahedron's previous colors were specified in the file `dodec' that you loaded when we started Geomview. The color that you specify with the color panel overrides the old colors. You can adjust the intensity of the color with the _Intensity_ slider. When you find a color that you like, click the _Done_ button. Now put the cursor somewhere over the gray background and double-click the right mouse button; this picks "World" as the target object. Click the _Look At_ button to look at the world again. Notice that in the _Appearance_ panel the settings of the buttons have changed from the way you left them with the dodecahedron. That's because the _Appearance_ panel always displays the settings for the target object, which is now the world, which still has its default settings. Click on the _[ab] BBox_ button under the word _Draw_. The bounding boxes go away. Now put the cursor back in the camera window. At the keyboard, type the keys `a 'b. Notice that the bounding boxes come back. `a 'b is the keyboard shortcut for the bounding box toggle button; the string "[ab]" appears on the button to indicate this. Most of Geomview's buttons have keyboard shortcuts that you can use instead if you want. This is useful once you are familiar with Geomview and don't want to have to move around among lots of panels. Now select the tetrahedron, either by double-clicking the right mouse button on it, or by selecting "tetra" in the _Targets_ browser. Then click on the _Delete_ button in the _Main_ panel. The tetrahedron should disappear. This is how you get rid of an object. You can also load objects from within Geomview. Click on the _File_ menu in the _Main_ panel and choose _Open_. The _Files_ panel will appear. Below the middle of this panel is a browser with three lines in it; the second line is a directory with lots of Geomview example files in it. Click on that second line; *note Figure: figfilespanel. Scroll down in the list of files until you see `tref.off'. Click on that line, and then click on the _OK_ button. A large trefoil-shaped tube will appear in your window. Click the _Hide_ button in the _Files_ panel to dismiss the panel. Figure 2.5: The Files Panel. Now click on the _Reset_ button in the _Tools_ panel. This causes everything to return to its home position. You should see a dodecahedron and a trefoil knot (*note Figure: figtrefdodec.). Play around with the trefoil knot and the dodecahedron. Experiment with some of the other buttons in the _Tools_ panel. Try coloring the trefoil knot with the _Appearance_ panel. For a tutorial on how to create your own objects to load into Geomview, see file `doc/oogltour' distributed with Geomview. The things in that file will be incorporated into a future version of this manual. Figure 2.6: Trefoil and Dodecahedron.  File: geomview, Node: Interaction, Next: OOGL File Formats, Prev: Tutorial, Up: Top 3 Interaction ************* This chapter describes how you interact with Geomview through the mouse and keyboard. * Menu: * Starting Geomview:: Starting Geomview. * Command Line Options:: Command Line Options. * Basic Interaction:: Basic Interaction: The Main Panel. * Loading:: Loading Objects Into Geomview. * Mouse Motions:: Using the Mouse to Manipulate Objects. * Appearance:: Changing the Way Things Look. * Cameras:: Cameras. * Saving:: Saving your work. * Commands:: The Commands Panel. * Keyboard Shortcuts:: Keyboard Shortcuts.  File: geomview, Node: Starting Geomview, Next: Command Line Options, Prev: Interaction, Up: Interaction 3.1 Starting Geomview ===================== The usual way to start Geomview is to type `geomview ' in a shell window ( means hit the "Enter" key). It may take Geomview a few seconds to start up; one or more windows will appear and you can begin interacting with Geomview immediately. It is also possible to specify actions for Geomview to perform at startup time by giving arguments in the shell command line. *Note Command Line Options::.  File: geomview, Node: Command Line Options, Next: Basic Interaction, Prev: Starting Geomview, Up: Interaction 3.2 Command Line Options ======================== Here are the command line options that Geomview allows: `-b R G b' Set the window background color to the given R G b values. `-c FILE' Interpret the GCL commands in FILE, which may be the special symbol `-' for standard input. For a description of GCL, *Note GCL::. `-c COMMAND' Commands may also be supplied literally, as in -c "(ui-panel main off)" Since COMMAND includes parentheses, which have special meaning to the shell, COMMAND must be quoted. Multiple -C options are allowed. `-wins NWINS' Causes Geomview to initially display NWINS camera windows. `-wpos WIDTH,HEIGHT[@XMIN,YMIN]' Specifies the initial location and size of the first camera window. The values for WIDTH, HEIGHT, XMIN, and YMIN are in screen (pixel) coordinates. `-M[cg][ps[un|in|in6]] PIPENAME|TCPPORT' The `-M' option accepts modifiers: a `g' suffix expects geometry data (the default), while a `c' suffix expects GCL commands. A `p' implies the connection should use a named pipe (the default on everything except on the NeXT), while `s' implies using a UNIX-domain socket (the default on the NeXT). Since version 1.9 of Geomview Internet domain sockets are also supported; use `sin' to make Geomview listen on the IPv4 port given by TCPPORT, or use `sin6' to make Geomview listen on an IPv6 port (also as specified by TCPPORT). `sun' is a synonym for `s', i.e. use the Unix domain socket with the name PIPENAME. If PIPENAME starts with a slash ('/'), then it is assumed to be an absolute pathname, otherwise the named pipe or socket is created below `${TMPDIR}/geomview/'. Listening to command streams on TCP ports can be a security risk, as Geomview itself does not take any security precautions, it simply executes all commands fed to it through the network socket. This also implies that disk-io can be initiated remotely. Examples: `-M OBJECTNAME' Display (possibly dynamically changing) geometry sent from the programs `geomstuff' or `togeomview'. This actually listens to the named pipe `/tmp/geomview/objectname'; you can achieve the same effect with the shell commands: mkdir /tmp/geomview mknod /tmp/geomview/objectname p (assuming the directory and named pipe don't already exist), then executing the GCL command: (geometry objectname < /tmp/geomview/objectname) (*note `(geometry ...)': geometry.) `-Mc PIPENAME' Like `-M' above, but expects GCL commands, rather than OOGL geometry data, on the connection. `-Mcs fred' Read commands from the UNIX-domain socket named. `/tmp/geomview/fred' `-Mcsin 40000' Read commands from the IPv4 port `40000'. Geomview itself does not take any security precautions, so this can be a security risk. `-noopengl' Disable the use of OpenGL for (possibly) hardware accelerated rendering, even if the Geomview binary has support for OpenGL compiled in. This also disables the support for transparency and textures in the camera windows. RenderMan snapshots still will have correct transparency and some limited texture support. `-nopanels' Start up displaying no panels, only graphics windows. Panels may be invoked later as usual with the `Px' keyboard shortcuts or with the `ui-panel' command. *Note `(ui-panel ...)': ui-panel. `-noinit' Read no initialization files. By default, geomview reads the system-wide `.geomview' file, followed by those in `${HOME}/.geomview' and `./.geomview'. `-e MODULE' Start an external module; MODULE is the name associated with the module, appearing in the main panel's Applications browser, as defined by the `emodule-define' command. *Note `(emodule-define ...)': emodule-define. `-start MODULE ARGS ...' Like -e but allows you to pass arguments to the external module. "-" signals the end of the argument list; the "-" may be omitted if it would be the last argument on the Geomview command line. `-run SHELL-COMMAND ARGS ...' Like -start but takes the pathname of executable of the external module instead of the module's name. The pathnames of all known module directories are appended to the UNIX search path when invoking SHELL-COMMAND.  File: geomview, Node: Basic Interaction, Next: Loading, Prev: Command Line Options, Up: Interaction 3.3 Basic Interaction: The Main Panel ===================================== Normally when you invoke Geomview, three windows appear: the _Main_ panel, the _Tools_ panel, and one camera window. Geomview has many other windows but most things can be done with these three and so by default the others do not appear. This section of the manual introduces some basic concepts that are used throughout the rest of the manual and describes the _Main_ panel. Figure 3.1: The Main Panel Geomview can display an arbitrary number of objects simultaneously. The _Targets_ browser in the _Main_ panel displays a list of all the objects that Geomview currently knows about. This browser has a line for each object that you have loaded, plus some lines for other objects. One of the other objects is called `World' and corresponds to the all the currently loaded objects, treated as if they were one object. Most of the operations that you can do to one object, such as applying a motion or changing a color, can also be done to the "World" object. The _Targets_ browser also has an entry for each camera. By default there is only one camera; it is possible to add more of them via the _New Camera_ entry of the _Main_ panel's _File_ menu. Geomview treats cameras in much the same way as it does geometric objects. For example, you can move cameras around and add them and delete them just as with geometric objects. Cameras do not usually show up in the display as an object that you see. Each camera has a separate camera window which displays the view as seen by that camera. (It is possible for each camera to display a geometric representation of other cameras. *Note Cameras::.) Because Geomview treats cameras and geometric objects very similarly, the term "object" in this documentation is used to refer to either one. When we need to distinguish between the two kinds of objects, we use the term "geom" to denote a geometric object and the word "camera" to denote a camera. The object which is selected (highlighted) in the _Targets_ browser is called the "target" object. This is the object that receives any actions that you do with the mouse or keyboard. You can change the target object by selecting a different line in the _Targets_ browser. Another way to change the target object is to put the mouse cursor directly over a geometry in a camera window and rapidly double-click the right mouse button. This process is called "picking"; the picked object becomes the new target. Geomview objects are all known by two names, both of which are shown in the _Targets_ browser. The first name given there, which appears in square brackets ([ ]), is a short name assigned by Geomview when you load the object. It consists of the letter `g' for geometries and `c' for cameras, followed by a number. The second name is a longer more descriptive name; by default this is the name of the file that the object was loaded from. The two names are equivalent as far as Geomview is concerned; at any point where you need to specify a name you can give either one. To manipulate an object, make sure you that the object you want to move is the target object, and put the mouse cursor in a camera window. Motions are applied by holding down either the left or middle mouse button and moving the mouse. There are several different motion "modes", each for applying a different kind of motion. The _MOTION MODE_ browser in the _Main_ panel indicates the current motion mode. The default is "Rotate". You can change the current motion mode by selecting a new one in the _MOTION MODE_ browser, or by using the _Tools_ panel. For more information about motion modes, *Note Mouse Motions::. The _Modules_ browser lists Geomview external modules. An external module is a separate program that interacts with Geomview to extend its functionality. For information on external modules, *Note Modules::. The menu bar at the top of the main panel offers menus for common operations. To create new windows, load new objects, save objects or other information, or quit from geomview, see the _File_ menu. To copy or delete objects, see the _Edit_ menu. You can invoke any panel from the _Inspect_ menu. The _Space_ menu lets you choose whether geomview operates in Euclidean, Hyperbolic, or Spherical mode. Euclidean mode is selected by default. For details about using _Hyperbolic_ and _Spherical_ spaces, *Note Non-Euclidean Geometry::. Most actions that you can do through Geomview's panels have equivalent keyboard shortcuts so that you can do the same action by typing a sequence of keys on the keyboard. This is useful for advanced users who are familiar with Geomview's capabilities and want to work quickly without having to have lots of panels cluttering up the screen. Keyboard shortcuts are usually indicated in square brackets ([ ]) near the corresponding item in a panel. For example, the keyboard shortcut for _Rotate_ mode is 'r'; this is indicated by "[r]" appearing before the word "Rotate" in the _MOTION MODE_ browser. To use this keyboard shortcut, just hit the `r' key while the mouse cursor is in any Geomview window. Do not hit the `' key afterwards. Some keyboard shortcuts consist of more than one key. In these cases just type the keys one after the other, with no `' afterwards. Keyboard shortcuts are case sensitive. Many keyboard shortcuts can be preceded by a numeric parameter. For example, typing `ae' toggles the state of drawing edges, while `1ae' always enables edge drawing. The _keyboard_ field in the upper left corner of the _Main_ panel echos the current state of keyboard shortcuts. For a list of all keyboard shortcuts, press the _`?'_ key.  File: geomview, Node: Loading, Next: Mouse Motions, Prev: Basic Interaction, Up: Interaction 3.4 Loading Objects Into Geomview ================================= There are several ways to load an object into Geomview. the _Files_ panel If you click the _Load_ button in Geomview's _Main_ panel, the _Files_ panel will appear. Figure 3.2: The Files Panel. This panel lets you select a file from a variety of directories. The top of the panel is a standard Motif file browser. Below this is a list of directories on Geomview's standard search path; click on one of these to browse files in that directory. To select a file, double-click on its name in the browser at upper right, or click on its name and press the key, or type the file's name into the text box at the bottom of the browser and press . If the selected file contains OOGL geometric data, it will be added to the geomview _Targets_ browser. If it contains GCL commands instead, the file will be interpreted. *Note GCL::. When the _Files_ panel first appears, the directory selected in the directory browser is the current directory -- the one from which you invoked Geomview. The file browser shows _all_ the files in this directory, including ones that are not Geomview files. If you try to load a file that doesn't contain either an OOGL object or Geomview commands, Geomview will print out an error message. The directory browser also lists a second and third directory in addition to the current directory. The second one, which ends in `data/geom', is the Geomview example data directory. This contains a wide variety of sample objects. It also contains several subdirectories. In particular, the `hyperbolic' and `spherical' subdirectories have sample hyperbolic and spherical objects, respectively. Directory entries in the browser look just like file entries; to view a subdirectory, click on it. The third directory shown in the directory browser, which ends in `geom', contains several subdirectories with other Geomview files in them. These are used less frequently than the ones in the `data/geom' directory. You can change the list of directories shown the _Files_ panel's directory browser by using the `set-load-path' command; *note `(set-load-path ...)': set-load-path. the `<' keyboard shortcut: If you type `<' in any Geomview window, the _Load_ panel will appear. This is a small version of the _Files_ panel; it contains a text field in which you can enter the name of a file to load (or a GCL command surrounded by parentheses). After typing the name of the file to load, type `'; Geomview will load the file as if you had loaded it with the _Add_ button in the _Files_ panel. If, after bringing up the small load panel with `<', you decide you want to use the larger _Files_ panel after all, press the _File Browser_ button. Figure 3.3: The Load Panel. geometry loading commands: The `load', `geometry', `new-geometry', and `read' GCL commands allow you to load an object into Geomview; *Note GCL::. *Note `(load ...)': load. *Note `(new-geometry ...)': new-geometry. *Note `(read ...)': read.  File: geomview, Node: Mouse Motions, Next: Appearance, Prev: Loading, Up: Interaction 3.5 Using the Mouse to Manipulate Objects ========================================= Geomview lets you manipulate objects with the mouse. There are six different mouse motion modes: _Rotate_, _Translate_, _Cam Fly_, _Cam Zoom_, _Geom Scale_, and _Cam Orbit_. The tools panel has a button for each of these modes; to switch modes, click on the corresponding button. You can also select these through the _Motion Mode_ browser on the _Main_ panel. This section describes basic mouse interaction. For details, *note Commands::. Figure 3.4: The Tools Panel. Each of the motion modes uses a common paradigm for how the motion is applied. In particular, each depends on the current _target_ object and the current _center_ object. These are explained in the following paragraphs. The current target object is shown in the _Target_ field in the _Tools_ panel. This is the same as the selected object in the _Targets_ browser in the _Main_ panel, and you can change it by either selecting a new object in the browser, by typing a new entry in the field, or by picking an object in a camera window by double-clicking the right mouse button with the cursor over the object. The current center object is shown in the _Center_ field in the _Tools_ panel. Its default value is the special word "target", which means that the center object is whatever the target object is. You can change the center to any object by typing it in the _Center_ field. The origin of the center object is held fixed in _Rotate_ and _Orbit_ modes. Normally the center object is one of the existing geoms listed in the _Targets_ browser, and the actual center of rotations is the origin of that object's coordinate system. It is possible, however, to select an arbitrary point of interest on an object as the center. For details, *note Point of Interest::. It is also possible to toggle the button _BBox Center_ to set the center of motion to the center of the current object's bounding box. Once toggled, the active geometry's bounding box center will become the center of motion. If you select another object, then the center of motion will become the center of that object's bounding box. Nothing changes when a camera or the _World_ is selected; you have to type in the word `target' in the _Center_ field to reset to the default. You apply a mouse motion by holding down either the left or middle mouse button with the cursor in a camera window and moving the mouse. Most of the modes have _inertia_, which means that if you let go of the button while moving the mouse, the motion will continue. It may be helpful to imagine the mouse cursor as being a gripper; when you hold a mouse button down, it grips the target object and you can move it. When you let go of the mouse button, the gripper releases the object. Letting go of the mouse button while moving the mouse is like throwing the object -- the object continues moving independent of the mouse. Inertia can be turned off; see the _Main_ panel's _Motion_ menu, described below. Generally, the left mouse button controls motion in the screen plane, while the middle mouse controls motion along or around the forward direction. Pressing the shift key while dragging with left or middle mouse buttons in most motion modes gives slow-speed motions, useful for fine adjustment. You can pick any point on an object (not just its origin) as the center of motion by holding down the shift key while clicking the right mouse button; this chooses a point of interest. _Rotate_ In _Rotate_ mode, hold the left mouse button down to rotate the target object about the center object. Rotation proceeds in the direction that you move the mouse. Specifically, the axis of rotation passes through the origin of the center object, is parallel to the camera view plane, and is perpendicular to the direction of motion of the mouse. When the center is "target", this means that the target object rotates about its own origin. The middle mouse button in _Rotate_ mode rotates the target object about an axis perpendicular to the view plane. _Translate_ In _Translate_ mode, hold the left mouse button down to translate the target object in the direction of mouse motion. The middle mouse button translates the target along an axis perpendicular to the view plane. In Euclidean space, the center object is essentially irrelevant for translations. In hyperbolic and spherical spaces, where translations have a unique axis, this axis is chosen to go through the origin of the center object. _Cam Fly_ _Cam Fly_ is a crude flight simulator that lets you fly around the scene. It works by moving the camera. Move the mouse while holding the left mouse button down to point the camera in a different direction. To move forward or backward, hold down the middle button and move the mouse vertically. Both of these motions have inertia; typically the easiest way to fly around a scene is to give the camera a slight forward push by letting go of the middle button while moving the mouse upward, and then using the left button to steer. _Cam Fly_ affects the camera window that the mouse is in; it ignores the target object and the center object. _Cam Orbit_ _Cam Orbit_ mode lets you rotate the current camera around the current center. The left mouse button does this rotation. The middle mouse button in _Cam Orbit_ mode acts as in _Cam Fly_ mode: it moves the camera forward or backward. In general _Cam Orbit_ does not move the target object, although if the current camera is selected as the target and the center is also the target, it will pivot that camera about itself just as in _Cam Fly_ mode. _Cam Zoom_ _Cam Zoom_ mode lets you change the current camera's field of view with the mouse; hold the left mouse button down and move the mouse to change it. The numeric value of the field of view is shown in the _FOV_ field in the _Camera_ panel. _Geom Scale_ _Geom Scale_ mode lets you enlarge or shrink a geom. It operates on the target object if that object is a geom. If the target is a camera, _Geom Scale_ operates on the geom that was most recently the target object. Moving the mouse while holding down the left mouse button scales the object either up or down, depending on the direction of mouse motion. The center of the applied scaling transformation is the center object. Scaling is meaningful only in Euclidean space; attempts to scale are ignored in other spaces. _Geom Scale_ mode does not have inertia. The _Stop_, _Look At_, _Center_, and _Reset_ buttons on the _Tools_ panel perform actions related to motions but do not change the current motion mode. _Stop_ The _Stop_ button causes all motions to stop. It affects all moving objects, not just the target object. Its keyboard shortcut is `H'. The keyboard command `h', which does not correspond to a panel button, stops the current motion for the target object only. _Look At_ The _Look At_ button causes the current camera to be moved to a position such that it is looking at the target object, and such that the target object more or less fills the window. The Look At command is unreliable in non-Euclidean spaces. _Center_ The _Center_ button undoes the target object's transformation, moving it back to its home position, which is where it was when you originally loaded it into Geomview. _Reset_ The _Reset_ button stops all motion and causes all objects to move back to their home positions. The _Tools_ panel also sports a _Main_ button, to invoke the main panel in case it was dismissed or buried, and a _Done_ button to close the _Tools_ panel. The _Main_ panel's _Motion_ menu has special controls affecting how mouse motions are interpreted; the toggles are also accessible through a GCL command. *Note `(ui-motion ...)': ui-motion. _[ui] Inertia_ Normally, moving objects have inertia: if the mouse is still moving when the button is released, the selected object continues to move. When _Inertia_ is off, objects cease to move as soon as you release the mouse. _[uc] Constrain Motion_ It's sometimes handy to move an object in a direction aligned with a coordinate axis: exactly horizontally or vertically. Selecting _Constrain Motion_ changes the interpretation of mouse motions to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical motion. Note that the motion is still along the X or Y axes of the camera in which you move the mouse, not necessarily the object's own coordinate system. _[uo] Own Coordinates_ It's sometimes handy to move objects with respect to the coordinate system where they were defined, rather than with respect to some camera's view. While _Own Coordinates_ is selected, all motions are interpreted that way: dragging the mouse rightward in translate mode moves the object in its own +X direction, and so on. May be especially useful in conjunction with the _Constrain Motion_ button. * Menu: * Point of Interest:: Point of Interest.  File: geomview, Node: Point of Interest, Prev: Mouse Motions, Up: Mouse Motions 3.5.1 Selecting a Point of Interest ----------------------------------- It is sometimes useful to specify a particular point on some object in a geomview window as the center point for mouse motions. You can do this by shift-clicking the right mouse button (i.e. click it once while holding down the shift key on the keyboard) with the cursor over the desired point. This point then becomes the _point of interest_. The point of interest must be on an existing object. Selecting a point of interest simplifies examining a small portion of a larger object. Shift-right-click on an interesting point, and select _Orbit_ mode. Use the middle mouse button to approach, and the left mouse to orbit the point, examining the region from different directions. When you have selected a point of interest, the current center object changes to an object named "CENTER", which is an invisible object located at the point of interest. In addition, mouse motions for the window in which you made the selection are adjusted so that the point of interest follows the mouse. You can change the point of interest at any time by selecting a new one by shift-clicking the right mouse button again. You can cancel the point of interest altogether by shift-clicking the right mouse button with the cursor on the background (i.e. not on any object). This changes the center object back to its default value, "target". The object named "CENTER", which serves as the center object for the point of interest, is a special kind of geom called an "alien". It does not appear in the _Targets_ browser. By default it has no geometry associated with it and hence is invisible. You can, however, explicitly give it some geometry using a GCL command, causing it to appear. Use the `geometry' command for this: `(geometry CENTER GEOMETRY)', where GEOMETRY is any valid geometry. For example, `(geometry CENTER { < xyz.vect })' causes the file `xyz.vect', which is one of the standard example files distributed with geomview, to be used at the geometry for CENTER. *Note `(geometry ...)': geometry. What happens internally when you select a point of interest is that the center is set to the object called CENTER, and that object is positioned at the point of interest. In addition, in order for mouse motions to track the point of interest, the current camera's focal length is set to be the distance from the camera to the point of interest. You can accomplish this via GCL with the following commands: (if (real-id CENTER) nil (new-alien CENTER {})) (ui-center CENTER) (transform-set CENTER universe universe translate X Y Z) (merge camera CAM-ID { focus D }) where `(X,Y,Z)' are the (universe) coordinates of the point of interest, and D is the distance from that point to the current camera, CAM-ID. The first command above creates the "alien" CENTER if it does not yet exist.  File: geomview, Node: Appearance, Next: Cameras, Prev: Mouse Motions, Up: Interaction 3.6 Changing the Way Things Look ================================ Geomview uses a hierarchy of appearances to control the way things look. An "appearance" is a specification of information about how something should be drawn. This can include many things such things as color, lighting, material properties, and more. Appearances work in a hierarchal manner: if a certain appearance property, for example face color, is not specified in a particular object's appearance, that object is drawn using that property from the parent appearance. If both the parent and the child appearance specify a property, the child's setting takes precedence unless the parent appearance is set to override. Every geom in Geomview has an appearance associated with it. There is also an appearance associated with the "World" geom, which serves as the parent of each individual geom's appearance. Finally, there is a global "base" appearance, which is the parent of the World appearance. The base appearance specifies reasonable values for all appearance information, and by default none of the other appearances specify anything, which means they inherit their values from the base appearance. This means that by default all objects are drawn using the base appearance. If you change a certain appearance property for a geom, that property is used in drawing that geom. The parent appearance is used for any properties that you do not explicitly set. Geomview has three panels which let you modify appearances. * Menu: * Appearance Panel:: Color etc. * Materials Panel:: Surface Material properties. * Lighting Panel:: Lighting Parameters.  File: geomview, Node: Appearance Panel, Next: Materials Panel, Prev: Appearance, Up: Appearance 3.6.1 The Appearance Panel -------------------------- The _Appearance_ panel lets you change most common appearance properties of the target object. [image src="figs/ap.png"] Figure 3.5: The Appearance Panel. If the target is an individual geom, then changes you make in the appearance panel apply to that geometry's appearance. If the target is the World, then appearance panel changes apply to the World appearance _and_ to all individual geom appearances. (Users have found that this is more desirable than having the changes only apply to the World appearance.) If the target is a camera, then appearance panel changes apply to the geom that was most recently the target. The five buttons near the upper left corner under the word _Show_ control what parts of the target geom are drawn. _Faces_ This button specifies whether faces are drawn. _Edges_ This button specifies whether edges are drawn. _BBox_ This button specifies whether the bounding box is drawn. _Vects_ This button specifies whether VECT objects are drawn. VECTs are a type of OOGL object that represent points and line segments in 3-space; they are distinct from edges of other kinds of objects, and it is sometimes desirable to have separate control over whether they are drawn. _Normals_ This button specifies whether surface normal vectors are drawn. The four buttons under _Color_ labeled _Faces_, _Edges_, _Normals_, and _BBox_ let you specify the color of the corresponding aspect of the target geom. Clicking on one of them brings up a color chooser panel. Figure 3.6: Color Chooser Panel. This panel offers two sets of sliders: H(ue) S(aturation) V(alue), or R(ed) G(reen) B(lue), each in the range 0 through 1. The square shows the current color, which is given numerically in both HSV and RGB systems in the corresponding text boxes. In the HSV color system, hue H runs from red at 0, green at .333, blue at .667, and back to red at 1.0. Saturation gives the fraction of white mixed into the color, from 0 for pure gray to 1 for pure color. Value gives the brightness, from 0 for black to 1 for full brightness. Pressing the _RGB_ or _HSV_ button at top center switches the sliders to the other color system. You can adjust colors either via the sliders, or by typing in either the RGB or HSV text boxes. Click _OK_ to accept the color that you have chosen, or _Cancel_ to retain the previous color setting. The _SHADING_ browser lets you specify the shading model that Geomview uses to paint the target geom. `Constant' Every face of the object is drawn with a constant color which does not depend on the location of the face, the camera, or the light sources. If the object does not contain per-face or per-vertex colors, the diffuse color of the object's appearance is used. If the object contains per-face colors, they are used. If the object contains per-vertex colors, each face is painted using the color of its first vertex. `Flat' Each face of the object is drawn with a color that depends on the relative location of the face, the camera, and the light sources. The color is constant across the face but may change as the face, camera, or lights move. `Smooth' Each face of the object is drawn with smoothly interpolated colors based on the normal vectors at each vertex. If the object does not contain per-vertex normals, this has the same effect as flat shading. If the object has reasonable per-vertex normals, the effect is to smooth over the edges between the faces. `CSmooth' Each face of the object is drawn with exactly the specified color(s), independent of lighting, orientation, and material properties. If the object is defined with per-vertex colors, the colors are interpolated smoothly across the face; otherwise the effect is the same as in Constant shading style. `VCflat' A combination of `CSmooth' and `Flat' shading. So the shading is constant on each face, depending on the relative orientation of the light sources, the camera and the surface normal of the face. The _Facing Normals_ button on the _Appearance_ panel indicates whether or not Geomview should arrange that normal vectors always face the viewer. If a normal vector points away from the viewer the color of the corresponding face or vertex usually is darker than is desired. Geomview can avoid this by using the opposite normal in shading calculations. This is the default. Using _Facing Normals_ can give strange flickering dark or light shading effects, though, near the horizon of a fairly smooth facetted object. Press this button to use the normals given with the object. The three text fields in the lower left corner of the _Appearance_ panel are: _Line Width_ The width, in pixels, for lines drawn by Geomview. _Normal Length_ This is actually a scale factor; when normal vectors are drawn, Geomview draws them to have a length that is their natural length times this number. _Patch Dicing_ Geomview draws Bezier patches by first converting them to meshes. This parameter specifies the resolution of the mesh: if _Patch Dicing_ is N, then an N by N mesh is used to draw each Bezier patch. if _Patch Dicing_ is 1, the resolution reverts to a built-in default value. The _Revert_ button on the _Appearance_ panel undoes all settings in the target appearance. This causes the target geom to inherit all its appearance properties from its parent. The _Appearance_ panel's _Override_ button determines whether appearance controls should override settings in the objects themselves - for example, setting the face color will affect all faces of objects with multi-colored facets. Otherwise, appearance controls only provide settings which the objects themselves do not specify. By default, _Override_ is enabled. This button applies to all objects, and to all appearance-related panels. Normalization is a kind of scaling; Geomview can scale an object so that it fits within a certain region. The main point of normalization is to allow you to easily view all of an object without having to worry about how big it is. We are gradually replacing Geomview's normalization feature with more robust camera positioning features. In general, the best way to make sure you are seeing all of an object is to use the _Look At_ button on the _Tools_ panel. Normalization may be completely replaced by this and other features in a future version of Geomview. Normalization is a property that applies to each geom separately. The _NORMALIZE GEOMETRY_ browser affects the normalization property of target geom. If the target geom is "World", it affects all geoms. _None_ Do no normalization. _Individual_ Normalize this geom to fit within a unit sphere. _Sequence_ This resembles "Individual", except when an object is changing. Then, "Individual" tightly fits the bounding box around the object whenever it changes and normalizes accordingly, while "Sequence" normalizes the union of all variants of the object and normalizes accordingly. _Keep_ This leaves the current normalization transform unchanged when the object changes. It may be useful to apply "Individual" or "Sequence" normalization to the first version of a changing object to bring it in view, then switch to "Keep".  File: geomview, Node: Materials Panel, Next: Lighting Panel, Prev: Appearance Panel, Up: Appearance 3.6.2 The Materials Panel ------------------------- The _Materials_ panel controls material properties of surfaces. It works with the target object in the same way that the _Appearance_ panel does. Figure 3.7: The Materials Panel. _Translucent_ This button determines whether translucency is enabled. Geomview supports three different flavours of translucency: _Alpha-blending with BSP-tree depth-sorting_ This is the most accurate flavour for online viewing, but consumes vast amounts of computation time and memory. In this mode single translucent objects are displayed correctly with respect to themselves; however multiple translucent objects may appear in the wrong order on the screen. The notion _object_ means here: top-level geometries as displayed in the geometry target browser. _Screen Door Translucency_ If the machine support OpenGL then there is support for kind-of translucency by masking out (completely) transparent pixels by means of a stipple mask. This is currently very experimental, and the result is somewhat ugly, but fast. _Alphe-blending without depth-sorting_ This is the old naive way of doing quick and dirty translucency. It is fast, but the results are completely incorrect. When transparency is enabled, a RenderMan snapshot will contain the alpha information, a RenderMan compliant renderer can then generate high-quality pictures, including correct translucency. _Alpha_ This slider determines the opacity/transparency when transparency is enabled. 0 means totally transparent, 1 means totally opaque. _Diffuse Reflectance_ This slider controls the diffuse reflectance of a surface. This has to do with how much the surface scatters light that it reflects. _Shininess_ This slider controls how shiny a surface is. This determines the size of specular highlights on the surface. Lower values give the surface a duller appearance. _Ambient Reflectance_ This slider controls how much of the ambient light a surface reflects. _Specular Reflectance_ This slider controls the specular reflectance of a surface. This has to do with how directly the surface reflects light rays. Higher values give brighter specular highlights. _Done_ This button dismisses the _Materials_ panel.  File: geomview, Node: Lighting Panel, Prev: Materials Panel, Up: Appearance 3.6.3 The Lighting Panel ------------------------ The _Lights_ panel controls the number, position, and color of the light sources used in shading. [image src="figs/light.png"] The Lighting Panel. The _Lighting_ panel is different from the _Appearance_ and _Material_ panels in that it always works with the base appearance. This is because it usually makes sense to use the same set of lights for drawing all objects in your scene. _LIGHTS_ The _LIGHTS_ browser shows the currently selected light. Changes made using the other widgets on this panel apply to this light. There is always at least one light, the ambient light. _Intensity_ This slider controls the intensity of the current light. _Color_ This button brings up a color chooser which lets you select the color of the current light. _Add_ This button adds a light. _Delete_ This button deletes the current light. _Show Lights_ This button lets you see and change the positions of the light sources in a camera window. Each light is drawn as long cylinder which is supposed to remind you of a light beam. When you click on the _Show Lights_ button Geomview goes into "light edit" mode, during which you can rotate current light by holding down the left mouse button and moving the mouse. Lights placed in this way are infinitely distant, so what you are changing is the angular position. Click on the _Show Lights_ button again to return to the previous motion mode and to quit drawing the light beams. _Done_ This button dismisses the _Lighting_ panel. Geomview's _Appearance_, _Materials_, and _Lighting_ panels are constructed to allow you to easily do most of the appearance related things that you might want to do. The appearance hierarchy that Geomview supports internally, however, is very complex and there are certain operations that you cannot do with the panels. The Geomview command language (GCL) provides complete support for appearance operations. In particular, the `merge-baseap' command can be used to change the base appearance (which, except for lighting, cannot be changed by Geomview's panels). The `merge-ap' command can be used to change an individual geom's appearance. Appearances can also be specified in OOGL files; for details, *note Appearances::. *Note `(merge-baseap ...)': merge-baseap. *Note `(merge-ap ...)': merge-ap.  File: geomview, Node: Cameras, Next: Saving, Prev: Appearance, Up: Interaction 3.7 Cameras =========== A camera in Geomview is the object that corresponds to a camera window. By default there is only one camera, but it is possible to have as many as you want. You can control certain aspects of the way the world is drawn in each camera window via the _Cameras_ panel. Figure 3.8: The Cameras Panel. If the target object is a camera, the _Cameras_ panel affects that camera. If the target object is not a camera, the _Cameras_ panel affects the "current camera". The current camera is the camera of the window that the mouse cursor is in, or was in most recently if the cursor is not in a camera window. Thus, if you use the keyboard shortcuts for the actions in the _Cameras_ panel while the cursor is in a camera window, the actions apply to that camera, unless you have explicitly selected another camera. To create new camera windows, use the `v+' keyboard shortcut, or see the _File_ menu on the _Main_ panel. _Single-Buffering_ Normally, geomview windows are _double-buffered_: geomview draws the next picture into a hidden window, then switches buffers to make it visible all at once. On many systems, the memory for the hidden buffer comes from stealing half the bits in each screen pixel, reducing the color resolution. When single-buffering is enabled, the window flickers as each scene is being drawn, but you may get smoother images with reduced grainy dithering artifacts. Single-buffering is possible if Geomview is compiled with GL or OpenGL, but not with plain-X graphics. _Dither_ Many displays offer less than the 24 bits per pixel (8 bits each of red, green, and blue) conventionally needed to show smooth gradations of color. When trying to show a color not accurately available on the display, Geomview normally _dithers_, choosing pixel colors sometimes brighter, sometimes darker than the desired value, so that the average color over an area is a better approximation to the true color than a single pixel could be. Effectively this loses spatial resolution to gain color resolution. This isn't always desirable, though. Turning _Dither_ off gives less grainy, but less accurately colored, images. _Software Shading_ This button controls whether Geomview does shading calculations in software. The default is to let the hardware handle them, and in Euclidean space this is almost certainly best because it is faster. In hyperbolic and spherical space, however, the shading calculations that the hardware does are incorrect. Click this button to turn on correct but slower software shading. _Background Color_ This button brings up a color chooser which you can use to set the background color of the camera's window. _PROJECTION_ This browser lets you pick between perspective and orthogonal projection for this camera. _Near clip_ This determines the distance in world coordinates of the near clipping plane from the eye point. It must be a positive number. _Far clip_ This determines the distance in world coordinates of the far clipping plane from the eye point. It must be a positive number and in general should be larger than the _Near clip_ value. _FOV_ This is the camera's field of view, measured in its shorter direction. In perspective mode, it is an angle in degrees. In orthographic mode, it is the linear size of the field of view. This number can be modified with the mouse in _Cam Zoom_ mode. _Focal Length_ The focal length is intended to suggest the distance from the camera to an imaginary plane of interest. Its value is used when switching between orthographic and perspective views (and during stereo viewing), so as to preserve apparent size of objects lying at the focal distance from the camera. Focal length also affects interpretation of mouse-based translational motions. Speed of forward motion (in translate, fly and orbit modes) is proportional to focal length; and objects lying at the focal distance from the camera translate laterally at the same rate as the mouse cursor. Finally, in N-D projection mode, cameras are displaced back by the focal distance from the 3-D projection of the world origin. _Lines Closer_ This number has to do with the way lines are drawn. Normally Geomview's z-buffering algorithm can get confused when drawing lines that lie exactly on surfaces (such as the edges of an object); due to machine round-off error, sometimes the lines appear to be in front of the surface and sometimes they appear behind it. The _Lines Closer_ value is a fudge factor -- Geomview nudges all the lines that it draws closer to the camera by this amount. The number should be a small integer; try 5 or 10. 0 turns this feature off completely. Choosing too large a value will make lines visible even though they should be hidden. _SPACE MODEL_ This determines the model used to draw the world. It is most useful in hyperbolic and spherical spaces. You probably don't need to touch this browser if you stay in Euclidean space. For more information about these models, *note Non-Euclidean Geometry::. _Virtual_ This is the default model and represents the natural view from inside the space. _Projective_ The projective model of hyperbolic and spherical space. Geoms move under isometries of the space, and cameras move by Euclidean motions. By default in the projective model, the Euclidean unit sphere is drawn. In hyperbolic space this is the sphere at infinity. In Euclidean space the projective model is the same as the virtual model except that the sphere is drawn by default. _Conformal_ The conformal model of hyperbolic and spherical space. Geoms move under isometries of the space, and cameras move by Euclidean motions. In Euclidean space, the conformal model amounts to inverting everything in the unit sphere. _Draw Sphere_ This controls whether Geomview draws the unit sphere. By default the unit sphere appears in the projective and conformal models. In hyperbolic space this is the sphere at infinity. In spherical space it is the equatorial sphere. _Done_ This button dismisses the _Cameras_ panel.  File: geomview, Node: Saving, Next: Commands, Prev: Cameras, Up: Interaction 3.8 Saving your work ==================== Geomview's _Save_ panel lets you store Geomview objects and other information in files that you can read back into Geomview or other programs. Figure 3.9: The Save Panel. To use the _Save_ panel you select the desired format in the browser next to the word _Save_, enter the name of the object you want to save in the text field next to the word _for_, and enter the name of the file you wish to save to in the long text field next to the word _in_. You can then either hit `' or click on the _OK_ button. When the file has been written, the _Save_ panel disappears. If you want to dismiss the _Save_ panel without writing a file, click the _Cancel_ button. If you specify `-' as the file name, Geomview will write the file to standard output, i.e. in the shell window from which you invoked Geomview. The possible formats are given below. The kind of object that can be written with each format is given in parentheses. _Commands (any object)_ This write a file of GCL commands containing all information about the object. Loading this file later will restore the object as well as all other information about it, such as appearance, transformations, etc. _Geometry alone (geom)_ This writes an OOGL file containing just the geometry of the object. _Geometry [in world] (geom)_ This writes an OOGL file containing just the geometry of the object, transformed under Geomview's current transformation for this object. Use this if you have moved the object from its initial position and want to save the new position relative to the world. _Geometry [in universe] (geom)_ This writes an OOGL file containing just the geometry of the geom, transformed under both the object's transformation and the world's transformation. _RMan [->tiff] (camera)_ Writes a RenderMan file which when rendered creates a tiff image. Transparency and texturing (the latter only to some extent) will be available. _RMan [->frame] (camera)_ Writes a RenderMan file which when rendered causes an image to appear in a window on the screen. Transparency and texturing (the latter only to some extent) will be available. _SGI snapshot (camera)_ Write an SGI raster file. A bell rings when the snapshot is complete. Only available on SGI systems. _PPM GLX-offscreen snapshot (camera)_ Render the complete scene anew into off-screen memory; GLX provides the means to use a Pixmap as rendering area. The advantage of rendering into _off_-screen memory over taking screen snapshot is that the camera windows need not be mapped and even raised at the time the snapshot is taken. So with off-screen snapshot one can safely iconify the camera window (but do not close it!), activate the screen-saver and go to bed while some script advances the scenes and takes snapshots. _PPM Screen snapshot (camera)_ Take a snapshot of the given window and save it as a PPM image. If you specify a string beginning with a vertical bar (`|') as the file name, it's interpreted as a Bourne shell command to which the PPM data should be piped, as in `| pnmtotiff > snap.tiff' or `| convert -geometry 50% ppm:- snap.gif'. PPM screen snapshots are only available with GL and Open GL, not plain X graphics. The window should be entirely on the screen. Geomview will ensure that no other windows cover it while the snapshot is taken. It is probably a better idea to use GLX-_off-screen_ snapshots, as explained above. _PPM software snapshot (camera)_ Writes a snapshot of that window's current view, as a PPM image, to the given file. The file name may be a Bourne shell command preceded by a vertical bar (`|'), as with the PPM screen snapshot. The software snapshot, though, is produced by using a built-in software renderer (related to the X-windows renderer). It doesn't matter whether the window is visible or not, and doesn't depend on GL or OpenGL. It also doesn't support some features, such as texture mapping. _Postscript snapshot (camera)_ Writes a Postscript snapshot of the camera's view. It's made by breaking up the scene into lines and polygons, sorting by depth, and generating Postscript lines and polygons for each one. Advantages over pixel-based snapshot images: resolution is very high, so edges look sharp even on high-resolution printers, or comparable-resolution images are typically much more compact. Disadvantages: depth-sorting gives good results on some scenes, but can be wildly wrong as a hidden-surface removal algorithm for other scenes. Also, Postscript doesn't offer smoothly interpolated shading, only flat shading for each facet. _Camera (camera)_ Writes an OOGL file of a camera. _Transform [to world] (any object)_ Writes an OOGL transform file giving Geomview's transform for the object. _Transform [to universe] (any object)_ Writes an OOGL transform file giving a transform which is the composition of Geomview's transform for the object and the transform for the world. _Window (camera)_ Writes an OOGL window file for a camera. _Panels_ Writes a GCL file containing commands which record the state of all the Geomview panels. Loading this file later will restore the positions of all the panels.  File: geomview, Node: Commands, Next: Keyboard Shortcuts, Prev: Saving, Up: Interaction 3.9 The Commands Panel ====================== The _Commands_ panel lets you type in a GCL command. When you hit `', Geomview interprets the command and prints any resulting output or error messages on standard output. You can edit the text and hit `' as many times as you like, in general, whenever you hit `' with the cursor in the _Commands_ panel, Geomview tries to interpret whatever text you have typed in the text field as a command. [image src="figs/command.png"] Figure 3.10: The Commands Panel.  File: geomview, Node: Keyboard Shortcuts, Prev: Commands, Up: Interaction 3.10 Keyboard Shortcuts ======================= Most actions that you can do through Geomview's panels have equivalent keyboard shortcuts so that you can do the same action by typing a sequence of keys on the keyboard. This is useful for advanced users who are familiar with Geomview's capabilities and want to work quickly without having to have lots of panels cluttering up the screen. Keyboard shortcuts usually are indicated in square brackets ([ ]) near the corresponding item in a panel. For example, the keyboard shortcut for _Rotate_ mode is 'r'; this is indicated by "[r]" appearing before the word "Rotate" in the _MOTION MODE_ browser. To use this keyboard shortcut just hit the `r' key while the mouse cursor is in any Geomview window. You don't need to press the `' or `' keys. Some keyboard shortcuts consist of more than one key. In these cases just type the keys one after the other, with no `' afterwards. Keyboard shortcuts are case sensitive. You can cancel a multi-key keyboard shortcut that you have started by typing any invalid key, for example the space bar. Keyboard commands apply while the cursor is in any camera window and most control panels. Many keyboard shortcuts allow numeric arguments which you type as a prefix to the command key(s). For example, the shortcut for _Near clip_ in the camera panel is `v n'. To set the near clip plane to `0.5', type `0.5vn'. Commands that don't take a numeric prefix toggle or reset the current value. Most commands allow one of the following selection prefixes. If none is provided the command applies to the target object. `g' world geom `g#' #'th geom `g*' All geoms `c' current camera `c#' #'th camera `c*' All cameras For example, `g4af' means toggle the face drawing of object _g4_. Simply typing a selection prefix, like `g4', doesn't yet select an object; that only happens when a command, like `ae', follows the prefix. To select an object as the target without doing anything else to it, use the `p' command. So `g3p' selects object g3. The text field in the upper left corner of the _Main_ panel shows the state of the current keyboard shortcut. In addition to the keyboard shortcuts for the panel commands, there is also a shortcut for picking a target object: type the short name of the object followed by `p'. For example, to select object _g3_, type `g 3 p'. This only works with the short names -- the ones that appear in square brackets ([ ]) in the _Targets_ browser of the _Main_ panel. Below is a summary of all keyboard shortcuts. Draw `af' Faces `ae' Edges `an' Normals `ab' Bounding Boxes `aV' Vectors Shading `0as' Constant `1as' Flat `2as' Smooth `3as' Smooth, non-lighted `aT' allow transparency `at' texture mapping Other `av' eVert normals: always face viewer `#aw' Line Width (pixels) `aC' handle concave polygons `#vc' edges Closer than faces (try 5-100) Color `Cf' faces `Ce' edges `Cn' normals `Cb' bounding boxes `CB' background Motions `r' rotate `t' translate `z' zoom FOV `f' fly `o' orbit `s' scale `w' recenter target `W' recenter all `h' halt `H' halt all `@' select center of motion (e.g. `g 3 @') `L' Look At object Viewing `0vp' Orthographic view `1vp' Perspective view `vd' Draw other views' cameras `#vv' field of View `#vn' near clip distance `#vf' far clip distance `v+' add new camera `vx' cursor on/off `vb' backfacing poly cull on/off `#vl' focal length `v~' Software shading on/off Panels `Pm' Main `Pa' Appearance `Pl' Lighting `Po' Obscure `Pt' Tools `Pc' Cameras `PC' Commands `Pf' Files `Ps' Save `P-' read commands from tty `PA' Credits ("about") Lights `ls' show lights `le' edit lights Space `me' Euclidean `mh' Hyperbolic `ms' Spherical Model `mv' Virtual `mp' Projective `mc' Conformal Other `0N' normalization: none `1N' normalization: each `2N all' normalization: all `ui' motion: Inertia `uc' motion: Constrain to axis `uo' motion: object's Own coordinates `<' `Pf' load geometry/command file `dd' delete target object `>' `Ps' save state to file `TV' NTSC mode toggle `p' pick as target object (e.g. `g 3 p') With no prefix, selects the object under the mouse cursor (like double-clicking the right mouse)  File: geomview, Node: OOGL File Formats, Next: Customization, Prev: Interaction, Up: Top 4 OOGL File Formats ******************* The objects that you can load into Geomview are called OOGL objects. OOGL stands for "Object Oriented Graphics Library"; it is the library upon which Geomview is built. There are many different kinds of OOGL objects. This chapter gives syntactic descriptions of file formats for OOGL objects. Examples of most file types live in Geomview's `data/geom' directory. * Menu: * Conventions:: Conventions and general remarks. * Object File Formats:: Object File Formats. * Non-geometric objects:: Non-geometric objects.  File: geomview, Node: Conventions, Next: Object File Formats, Prev: OOGL File Formats, Up: OOGL File Formats 4.1 Conventions =============== * Menu: * Common syntax:: Syntax Common to All OOGL File Formats. * File names:: File Names. * Vertices:: Vertices. * ND-Vertices:: N-dimensional Vertices. * Surface normal directions:: Surface normal directions. * Transformation matrices:: Transformation matrices. * ND Transformation matrices:: N-dimensional transformation matrices. * Binary format:: Binary format. * References:: Embedded objects and external-object references. * Appearances:: Appearances. * Texture Mapping:: Texture mapping.  File: geomview, Node: Common syntax, Next: File names, Prev: Conventions, Up: Conventions 4.1.1 Syntax Common to All OOGL File Formats -------------------------------------------- Most OOGL object file formats are free-format ASCII -- any amount of white space (blanks, tabs, newlines) may appear between tokens (numbers, key words, etc.). Line breaks are almost always insignificant, with a couple of exceptions as noted. Comments begin with # and continue to the end of the line; they're allowed anywhere a newline is. Binary formats are also defined for several objects; *Note Binary format::, and the individual object descriptions. Typical OOGL objects begin with a key word designating object type, possibly with modifiers indicating presence of color information etc. In some formats the key word is optional, for compatibility with file formats defined elsewhere. Object type is then determined by guessing from the file suffix (if any) or from the data itself. Key words are case sensitive. Some have optional prefix letters indicating presence of color or other data; in this case the order of prefixes is significant, e.g. `CNMESH' is meaningful but `NCMESH' is invalid.  File: geomview, Node: File names, Next: Vertices, Prev: Common syntax, Up: Conventions 4.1.2 File Names ---------------- When OOGL objects are read from disk files, the OOGL library uses the file suffix to guess at the file type. If the suffix is unrecognized, or if no suffix is available (e.g. for an object being read from a pipe, or embedded in another OOGL object), all known types of objects are tried in turn until one accepts the data as valid.  File: geomview, Node: Vertices, Next: ND-Vertices, Prev: File names, Up: Conventions 4.1.3 Vertices -------------- Several objects share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an object have the same format, specified by the header key word. All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on). The syntax is `X Y Z' (3-D floating-point vertex coordinates) or `X Y Z W' (4-D floating-point vertex coordinates) optionally followed by `NX NY NZ' (normalized 3-D surface-normal if present) optionally followed by `R G b A' (4-component floating-point color if present, each component in range 0..1. The A (alpha) component represents opacity: 0 transparent, 1 opaque.) optionally followed by `S T' `or' `S T U' (two or three texture-coordinate values). Values are separated by white space, and line breaks are immaterial. Letters in the object's header key word must appear in a specific order; that's the reverse of the order in which the data is given for each vertex. So a `CN4OFF' object's vertices contain first the 4-component space position, then the 3-component normal, finally the 4-component color. You can't change the data order by changing the header key word; an `NCOFF' is just not recognized.  File: geomview, Node: ND-Vertices, Next: Surface normal directions, Prev: Vertices, Up: Conventions 4.1.4 N-dimensional Vertices ---------------------------- Several objects share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an object have the same format, specified by the header key word. All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on). The syntax for N-dimensional vertices (N > 3) is `X[1] X[2] X[3] X[4] ...' (N floating-point vertex coordinates) or `X[0] X[1] X[2] X[3] X[4] ...' ((N+1) floating-point vertex coordinates, if the `4' modifier has been specified in the object's header line) Note, however, that N-dimensional objects internally always have (N+1)-dimensional points; the first component X[0] - if present in the object file - is used as homogeneous divisor. This is different from the ordinary 3D case where the `4' modifier generates a 4D object where the homogeneous component implicitly is set to 1. Color components usually can be specified like for 3D vertices, *note Vertices::, while specifying normals does not make sense.  File: geomview, Node: Surface normal directions, Next: Transformation matrices, Prev: ND-Vertices, Up: Conventions 4.1.5 Surface normal directions ------------------------------- Geomview uses normal vectors to determine how an object is shaded. The direction of the normal is significant in this calculation. When normals are supplied with an object, the direction of the normal is determined by the data given. When normals are not supplied with the object, Geomview computes normal vectors automatically; in this case normals point toward the side from which the vertices appear in counterclockwise order. On parametric surfaces (Bezier patches), the normal at point P(u,v) is in the direction dP/du cross dP/dv.  File: geomview, Node: Transformation matrices, Next: ND Transformation matrices, Prev: Surface normal directions, Up: Conventions 4.1.6 Transformation matrices ----------------------------- Some objects incorporate 4x4 real matrices for homogeneous object transformations. These matrices act by multiplication on the right of vectors. Thus, if p is a 4-element row vector representing homogeneous coordinates of a point in the OOGL object, and A is the 4x4 matrix, then the transformed point is p' = p A. This matrix convention is common in computer graphics; it's the transpose of that often used in mathematics, where points are column vectors multiplied on the right of matrices. Thus for Euclidean transformations, the translation components appear in the fourth row (last four elements) of A. A's last column (4th, 8th, 12th and 16th elements) are typically 0, 0, 0, and 1 respectively.  File: geomview, Node: ND Transformation matrices, Next: Binary format, Prev: Transformation matrices, Up: Conventions 4.1.7 ND Transformation matrices -------------------------------- In the context of N-dimensional space (N > 3) some objects incorporate (N+1)x(N+1) real matrices for homogeneous object transformations. These matrices act by multiplication on the right of vectors. Thus, if p is an (N+1)-element row vector representing homogeneous coordinates of a point in the OOGL object, and A (N+1)x(N+1) is the matrix, then the transformed point is p' = p A. Note that (unlike for the 4x4 transformation matrices, *note Transformation matrices::) the homogeneous component is located at index zero, so the translation components for Euclidean transformations appear in the zero-th row (first (N+1) elements). A's first column (at column index zero) is typically 1, 0, ..., 0.  File: geomview, Node: Binary format, Next: References, Prev: ND Transformation matrices, Up: Conventions 4.1.8 Binary format ------------------- Many OOGL objects accept binary as well as ASCII file formats. These files begin with the usual ASCII token (e.g. `CQUAD') followed by the word `BINARY'. Binary data begins at the byte following the first newline after `BINARY'. White space and a single comment may intervene, e.g. OFF BINARY # binary-format "OFF" data follows Binary data comprise 32-bit integers and 32-bit IEEE-format floats, both in big-endian format (i.e., with most significant byte first). This is the native format for 'int's and 'float's on Sun-3's, Sun-4's, and Irises, among others. Binary data formats resemble the corresponding ASCII formats, with ints and floats in just the places you'd expect. There are some exceptions though, specifically in the `QUAD', `OFF' and `COMMENT' file formats. Details are given in the individual file format descriptions. *Note QUAD::, *Note OFF::, and *Note COMMENT::. Binary OOGL objects may be freely mixed in ASCII object streams: LIST { = MESH BINARY ... binary data for mesh here ... } { = QUAD 1 0 0 0 0 1 0 1 0 0 1 0 } Note that ASCII data resumes immediately following the last byte of binary data. Naturally, it's impossible to embed comments inside a binary-format OOGL object, though comments may appear in the header before the beginning of binary data.  File: geomview, Node: References, Next: Appearances, Prev: Binary format, Up: Conventions 4.1.9 Embedded objects and external-object references ----------------------------------------------------- Some object types (`LIST', `INST') allow references to other OOGL objects, which may appear literally in the data stream, be loaded from named disk files, or be communicated from elsewhere via named objects. GCL commands also accept geometry in these forms. The general syntax is ::= [ "{" ] [ "define" `symbolname' ] [ ["="] `object-keyword' ... | "<" `filename' | ":" `symbolname' ] [ "}" ] where "quoted" items are literal strings (which appear without the quotes), [bracketed] items are optional, and | denotes alternatives. Curly braces, when present, must match; the outermost set of curly braces is generally required when the object is in a larger context, e.g. when it is part of a larger object or embedded in a Geomview command stream. For example, each of the following three lines: { define fred QUAD 1 0 0 0 0 1 0 1 0 1 0 0 } { define fred = QUAD 1 0 0 0 0 1 0 1 0 1 0 0 } { appearance { +edge } LIST { < "file1" } { : fred } } VECT 1 2 0 2 0 0 0 0 1 1 2 is a valid OOGL object. The last example is only valid when it is delimited unambiguously by residing in its own disk file. The ":" construct allows references to symbols, created with `define'. A symbol's initial value is a null object. When a symbol is (re)defined, all references to it are automatically changed. The "`define' NAME" construct allows to define a global symbol for the given object. If "NAME" already references an object, then the old object is discarded and replaced by the new definition. *Note `(read ...)': read. *Note `(hdefine ...)': hdefine. The "<" construct causes a disk file to be read. Note that this isn't a general textual "include" mechanism; a complete OOGL object must appear in the referenced file. Files read using "<" are sought first in the directory of the file which referred to them, if any; failing that, the normal search path (*note `(load-path ...)': load-path.) is used. The default search looks first in the current directory, then in the Geomview data directories. Again, white space and line breaks are insignificant, and "#" comments may appear anywhere.  File: geomview, Node: Appearances, Next: Texture Mapping, Prev: References, Up: Conventions 4.1.10 Appearances ------------------ Geometric objects can have associated "appearance" information, specifying shading, lighting, color, wire-frame vs. shaded-surface display, and so on. Appearances are inherited through object hierarchies, e.g. attaching an appearance to a `LIST' means that the appearance is applied to all the `LIST''s members. Some appearance-related properties are relegated to "material", "lighting" and "texture" substructures. Take care to note which properties belong to which structure. Any geometric object can be preceded by an appearance definition like in the following example: { appearance { +edge } LIST { < "file1" } { QUAD 1 0 0 0 0 1 0 1 0 1 0 0 } } Appearances are also OOGL objects in their own right and can be given symbolic names and referenced by them (*note References::). *Note Appearance objects: appearance objects. Texture Mapping There is a separate section concerning the definition of textures (*note Texture Mapping::). Transparency Rendering translucent objects is not supported by all drawing back ends. The OpenGL renderer has limited support for it: top-level objects (i.e. those which appear in the object browser of the main panel (*note The Main Panel: Basic Interaction.) are rendered correctly by means of alpha-blending). Also, the RenderMan snapshots will include opacity values. Here's an example appearance structure including values for all attributes. Order of attributes is unimportant. As usual, white space is irrelevant. Boolean attributes may be preceded by "+" or "-" to turn them on or off; "+" is assumed if only the attribute name appears. Other attributes expect values. A "*" prefix on any attribute, e.g. "*+edge" or "*linewidth 2" or "material { *diffuse 1 1 .25 }", selects "override" status for that attribute. appearance { +face # (Do) draw faces of polygons. On by default. -edge # (Don't) draw edges of polygons +vect # (Do) draw VECTs. On by default. transparent screendoor # (Enable) transparency. Enabling transparency # does not (necessarily) result in a correct Geomview # pictures, but alpha values are used in RenderMan # snapshots. # The allowed keywords are ``screendoor'' (masking out # out pixels by means of a stipple pattern), # ``blending'' for alpha-blending with BSP-tree # space paritioning and depth-sorting (slow) and # ``naive'' for alpha-blending without even # depth-sorting, not to talk about space # partioning. Omitting the keyword will default to # alpha-blending with BSP-tree space-partioning # and depth-sorting. -normal # (Do) draw surface-normal vectors normscale 1 # ... with length 1.0 in object coordinates +evert # do evert polygon normals where needed so as # to always face the camera +texturing # (Enable) texture mapping +linear # (Enable) linear average of closest texture elements +mipmap # (Enable) texture mip-mapping +mipinterp # (Enable) linear mip-mapping -backcull # (Don't) discard clockwise-oriented faces -concave # (Don't) expect and handle concave polygons -shadelines # (Don't) shade lines as if they were lighted cylinders # These four are only effective where the graphics system # supports them, namely on GL and Open GL. -keepcolor # Normally, when N-D positional coloring is enabled as # with geomview's (ND-color ...) command, all # objects' colors are affected. But, objects with the # "+keepcolor" attribute are immune to N-D coloring. shading smooth # or ``shading constant'' or ``shading flat'' or # or ``shading csmooth'' or ``shading vcflat''. # smooth = Gouraud shading, flat = faceted, # csmooth = smoothly interpolated but unlighted, # vcflat = flat shading, but smoothly interpolated colors. linewidth 1 # lines, points, and edges are 1 pixel wide. patchdice 10 10 # subdivide Bezier patches this finely in u and v material { # Here's a material definition; # it could also be read from a file as in # ``material < file.mat'' ka 1.0 # ambient reflection coefficient. ambient .3 .5 .3 # ambient color (red, green, blue components) # The ambient contribution to the shading is # the product of ka, the ambient color, # and the color of the ambient light. kd 0.8 # diffuse-reflection coefficient. diffuse .9 1 .4 # diffuse color. # (In ``shading constant'' mode, the surface # is colored with the diffuse color.) ks 1.0 # specular reflection coefficient. specular 1 1 1 # specular (highlight) color. shininess 25 # specular exponent; larger values give # sharper highlights. backdiffuse .7 .5 0 # back-face color for two-sided surfaces # If defined, this field determines the diffuse # color for the back side of a surface. # It's implemented by the software shader, and # by hardware shading on GL systems which support # two-sided lighting, and under Open GL. alpha 1.0 # opacity; 0 = transparent (invisible), 1 = opaque. # Ignored when transparency is disabled. edgecolor 1 1 0 # line & edge color normalcolor 0 0 0 # color for surface-normal vectors } lighting { # Lighting model ambient .3 .3 .3 # ambient light replacelights # ``Use only the following lights to # illuminate the objects under this # appearance.'' # Without "replacelights", any lights listed # are added to those already in the scene. # Now a collection of sample lights: light { color 1 .7 .6 # light color position 1 0 .5 0 # light position [distant light] # given in homogeneous coordinates. # With fourth component = 0, # this means a light coming from # direction (1,0,.5). } light { # Another light. color 1 1 1 position 0 0 .5 1 # light at finite position ... location camera # specified in camera coordinates. # (Since the camera looks toward -Z, # this example places the light # .5 unit behind the eye.) # Possible "location" keywords: # global light position is in world (well, universe) coordinates # This is the default if no location specified. # camera position is in the camera's coordinate system # local position is in the coordinate system where # the appearance was defined } } # end lighting model texture { clamp st # or ``s'' or ``t'' or ``none'' file lump.tiff # file supplying texture-map image alphafile mask.pgm.Z # file supplying transparency-mask image apply blend # or ``modulate'' or ``decal'' transform 1 0 0 0 # surface (s,t,0,1) * tfm -> texture coords 0 1 0 0 0 0 1 0 .5 0 0 1 background 1 0 0 1 # relevant for ``apply blend'' } } # end appearance There are rules for inheritance of appearance attributes when several are imposed at different levels in the hierarchy. For example, Geomview installs a backstop appearance which provides default values for most parameters; its control panels install other appearances which supply new values for a few attributes; user-supplied geometry may also contain appearances. The general rule is that the child's appearance (the one closest to the geometric primitives) wins. Further, appearance controls with "override" status (e.g. `*+face or material { *diffuse 1 1 0 }') win over those without it. Geomview's appearance controls use the "override" feature so as to be effective even if user-supplied objects contain their own appearance settings. However, if a user-supplied object contains an appearance field with override status set, that property will be immune to Geomview's controls.  File: geomview, Node: Texture Mapping, Prev: Appearances, Up: Conventions 4.1.11 Texture Mapping ---------------------- Some rendering back-ends support texture-mapped objects, actually only the OpenGL and the RenderMan interface at the time of this writing. There are also some issues with the RMan interface when using an alpha-channel in the texture image. Those rendering back-ends which don't support texturing silently ignore attempts to use texture mapping. A texture is specified as part of an appearance structure (*note Appearances::). Briefly, one provides a texture image (*note Image objects: image.), which is considered to lie in a square in `(s,t)' parameter space in the range 0 <= s <= 1, 0 <= t <= 1. Then one provides a geometric primitive, with each vertex tagged with `(s,t)' texture coordinates. If texturing is enabled, the appropriate portion of the texture image is pasted onto each face of the textured object. There is (currently) no provision for inheritance of part of a texture structure; if the `texture' keyword is mentioned in an appearance, it supplants any other texture specification. The appearance attribute `texturing' controls whether textures are used; there's no performance penalty for having texture { ... } fields defined when texturing is off. The available fields are: clamp none -or- s -or- t -or- st Determines the meaning of texture coordinates outside the range 0..1. With `clamp none', the default, coordinates are interpreted modulo 1, so (s,t) = (1.25,0), (.25,0), and (-.75,0) all refer to the same point in texture space. With `s' or `t' or `st', either or both of s- or t-coordinates less than 0 or greater than 1 are clamped to 1 or 0, respectively. image { (*note Image objects: image.) } Specify the actual texture image. Images can have 1, 2, 3 or 4 channels: 1 channel: luminance 2 channels: luminance and alpha 3 channels: RGB data 4 channels: RGBA data *Note Image objects: image, for the actual definition of image objects. The alpha-channel is only interpreted as mask: where the mask is zero, pixels are simply not drawn. An exception is the case where _apply_ is equal to _modulate_ and translucency is enabled: in this case the resulting alpha value is the result of the multiplication of the surface color with the alpha value of the texture's alpha channel. file filename alphafile filename _This is considered obsolete, and only kept for compatibility, the modern way is to use the new OOGL image object. *Note Image objects: image. The stuff documented here should still work, though_ Specifies image file(s) containing the texture. The _file_ keyword specifies a file with color or lightness information; _alphafile_ if present, specifies a transparency ("alpha") mask; where the mask is zero, pixels are simply not drawn. Several image file formats are available; the file type must be indicated by the last few characters of the file name: .ppm or .ppm.Z or .ppm.gz 24-bit 3-color image in PPM format .pgm or .pgm.Z or .pgm.gz 8-bit grayscale image in PGM format .sgi or .sgi.Z or .sgi.gz 8-bit, 24-bit, or 32-bit SGI image .tiff 8-bit or 24-bit TIFF image .gif GIF image For this feature to work, some programs must be available in geomview's search path: zcat for .Z files gzip for .gz files tifftopnm for .tiff files giftoppm for .gif files If an `alphafile' image is supplied, it must be the same size as the `file' image. _Image objects provide a more flexible way to specify texture data. *Note Image objects: image._ apply modulate -or- blend -or- decal Indicates how the texture image is applied to the surface. Here the "surface color" means the color the surface would have in the absence of texture mapping. With `modulate', the default, the texture color (or lightness, if textured by a gray-scale image) is multiplied by the surface color. With `blend', texture blends between the `background' color and the surface color. The `file' parameter must specify a gray-scale image. Where the texture image is 0, the surface color is unaffected; where it's 1, the surface is painted in the color given by `background'; and color is interpolated for intermediate values. With `decal', the `file' parameter must specify a 3-color image. If an `alphafile' parameter is present, its value interpolates between the surface color (where alpha=0) and the texture color (where alpha=1). Lighting does not affect the texture color in `decal' mode; effectively the texture is constant-shaded. background R G B A Specifies a 4-component color, with R, G, B, and A floating-point numbers normally in the range 0..1, used when `apply blend' is selected. transform `transformation-matrix' Expects a list of 16 numbers, or one of the other ways of representing a transformation (`: handlename' or `< filename'). The 4x4 transformation matrix is applied to texture coordinates, in the sense of a 4-component row vector (s,t,0,1) multiplied on the left of the matrix, to produce new coordinates (s',t') which actually index the texture.  File: geomview, Node: Object File Formats, Next: Non-geometric objects, Prev: Conventions, Up: OOGL File Formats 4.2 Object File Formats ======================= * Menu: * QUAD:: List of quadrilaterals. * MESH:: Rectangularly-connected mesh. * BBOX:: Simple bounding-boxes. * BBP and BEZ:: List of Bezier surface patches. * OFF:: Polyhedra: polygons with shared vertices. * VECT:: List of points and lines. * SKEL:: List of points and lines, with shared vertices. * SPHERE:: Sphere * INST:: Transformed Instance of another object. * LIST:: List of other objects. * TLIST:: Collection of 4x4 transformation matrices. * GROUP:: Obsolete format for collections of objects. * DISCGRP:: Discrete Group objects. * COMMENT:: Comment object, for caching information.  File: geomview, Node: QUAD, Next: MESH, Prev: Object File Formats, Up: Object File Formats 4.2.1 QUAD: collection of quadrilaterals ---------------------------------------- The conventional suffix for a `QUAD' file is `.quad'. The file syntax is [C][N][4]QUAD -or- [C][N][4]POLY # Key word VERTEX VERTEX VERTEX VERTEX # 4*N vertices for some N VERTEX VERTEX VERTEX VERTEX ... The leading key word is `[C][N][4]QUAD' or `[C][N][4]POLY', where the optional `C' and `N' prefixes indicate that each vertex includes colors and normals respectively. That is, these files begin with one of the words `QUAD' `CQUAD' `NQUAD' `CNQUAD' `POLY' `CPOLY' `NPOLY' `CNPOLY' (but not `NCQUAD' or `NCPOLY'). `QUAD' and `POLY' are synonymous; both forms are allowed just for compatibility with ChapReyes. Following the key word is an arbitrary number of groups of four vertices, each group describing a quadrilateral. See the Vertex syntax above. The object ends at end-of-file, or with a close-brace if incorporated into an object reference (see above). A `QUAD BINARY' file format is accepted; *Note Binary format::. The first word of binary data must be a 32-bit integer giving the number of quads in the object; following that is a series of 32-bit floats, arranged just as in the ASCII format.  File: geomview, Node: MESH, Next: BBOX, Prev: QUAD, Up: Object File Formats 4.2.2 MESH: rectangularly-connected mesh ---------------------------------------- The conventional suffix for a `MESH' file is `.mesh'. The file syntax is [U][C][N][Z][4][u][v][n]MESH # Key word [NDIM] # Space dimension, present only if nMESH NU NV # Mesh grid dimensions # NU*NV vertices, in format specified # by initial key word VERTEX(u=0,v=0) VERTEX(1,0) ... VERTEX(NU-1,0) VERTEX(0,1) ... VERTEX(NU-1,1) ... VERTEX(0,NV-1) ... VERTEX(NU-1,NV-1) The key word is `[U][C][N][Z][4][u][v][n]MESH'. The optional prefix characters mean: `U' Each vertex includes a 3-component texture space parameter. The first two components are the usual `S' and `T' texture parameters for that vertex; the third should be specified as zero. `C' Each vertex (see Vertices above) includes a 4-component color. `N' Each vertex includes a surface normal vector. `Z' Of the 3 vertex position values, only the Z component is present; X and Y are omitted, and assumed to equal the mesh (u,v) coordinate so X ranges from 0 .. (Nu-1), Y from 0 .. (Nv-1) where Nu and Nv are the mesh dimensions - see below. `4' Vertices are 4D, each consists of 4 floating values. `Z' and `4' cannot both be present. `u' The mesh is wrapped in the u-direction, so the (0,v)'th vertex is connected to the (NU-1,v)'th for all v. `v' The mesh is wrapped in the v-direction, so the (u,0)'th vertex is connected to the (u,NV-1)'th for all u. Thus a u-wrapped or v-wrapped mesh is topologically a cylinder, while a uv-wrapped mesh is a torus. `n' Specifies a mesh whose vertices live in a higher dimensional space. The dimension follows the "MESH" keyword. Each vertex then has NDIM components. Note that the order of prefix characters is significant; a colored, u-wrapped mesh is a `CuMESH' not a `uCMESH'. Following the mesh header are integers NU and NV, the dimensions of the mesh. Then follow NU*NV vertices, each in the form given by the header. They appear in v-major order, i.e. if we name each vertex by (u,v) then the vertices appear in the order (0,0) (1,0) (2,0) (3,0) ... (NU-1,0) (0,1) (1,1) (2,1) (3,1) ... (NU-1,1) ... (0,Nv-1) ... (NU-1,NV-1) A `MESH BINARY' format is accepted; *Note Binary format::. The values of NU and NV are 32-bit integers; all other values are 32-bit floats.  File: geomview, Node: BBOX, Next: BBP and BEZ, Prev: MESH, Up: Object File Formats 4.2.3 BBOX: simple bounding boxes --------------------------------- This is a very simple toy-object: it takes 2 vertices and draws a (hyper-) cube which is the bounding box of the two vertices. Syntax: BBOX X[0] Y[0] Z[0] X[1] Y[1] Z[1] or 4BBOX X[0] Y[0] Z[0] W[0] X[1] Y[1] Z[1] W[1] or nBBOX NDIM # > 3 X[0] Y[0] Z[0] W[0] ... X[1] Y[1] Z[1] W[1] ... or 4nBBOX NDIM # > 3 D[0] X[0] Y[0] Z[0] W[0] ... D[0] X[1] Y[1] Z[1] W[1] ... There is no BBOX binary format. The `4' modifyer has different meanings depending on the dimension of the bounding box: `4BBOX' means that the 4 components of the vertices make up a 4-dimensional bounding-box. Using `4' in conjunction with `n' - `4nBBOX NDIM' - means that the vertices specified in the file have NDIM+1 components, but the component at index 0 is the homogeneous divisor (in contrast to the ordinary 3d case where the homogeneous divisor would be the `w' - the third - component).  File: geomview, Node: BBP and BEZ, Next: OFF, Prev: BBOX, Up: Object File Formats 4.2.4 Bezier Surfaces --------------------- The conventional file suffixes for Bezier surface files are `.bbp' or `.bez'. A file with either suffix may contain either type of patch. Syntax: [ST]BBP -or- [C]BEZ[_ST] # NU, NV are u- and v-direction # polynomial degrees in range 1..6 # ND = dimension: 3->3-D, 4->4-D (rational) # (The '<' and '>' do not appear in the input.) # NU,NV,ND are each a single decimal digit. # BBP form implies NU=NV=ND=3 so BBP = BEZ333. # Any number of patches follow the header # (NU+1)*(NV+1) patch control points # each 3 or 4 floats according to header VERTEX(u=0,v=0) VERTEX(1,0) ... VERTEX(NU,0) VERTEX(0,1) ... VERTEX(NU,1) ... VERTEX(0,NV) ... VERTEX(NU,NV) # ST texture coordinates if mentioned in header `S'(u=0,v=0) `T'(0,0) `S'(0,NV) `T'(0,NV) `S'(NU,0) `T'(NU,0) `S'(NU,NV) `T'(NU,NV) # 4-component float (0..1) R G B A colors # for each patch corner if mentioned in header `RGBA'(0,0) `RGBA'(0,NV) `RGBA'(NU,0) `RGBA'(NU,NV) These formats represent collections of Bezier surface patches, of degrees up to 6, and with 3-D or 4-D (rational) vertices. The header keyword has the forms `[ST]BBP' or `[C]BEZ[_ST]' (the '<' and '>' are not part of the keyword. The `ST' prefix on `BBP', or `_ST' suffix on `BEZuvn', indicates that each patch includes four pairs of floating-point texture-space coordinates, one for each corner of the patch. The `C' prefix on `BEZuvn' indicates a colored patch, including four sets of four-component floating-point colors (red, green, blue, and alpha) in the range 0..1, one color for each corner. NU and NV, each a single digit in the range 1..6, are the patch's polynomial degree in the u and v direction respectively. ND is the number of components in each patch vertex, and must be either `3' for 3-D or `4' for homogeneous coordinates, that is, rational patches. `BBP' patches are bicubic patches with 3-D vertices, so `BBP' = `BEZ333' and `STBBP' = `BEZ333_ST'. Any number of patches follow the header. Each patch comprises a series of patch vertices, followed by optional (s,t) texture coordinates, followed by optional (r,g,b,a) colors. Each patch has (NU+1)*(NV+1) vertices in v-major order, so that if we designate a vertex by its control point indices (u,v) the order is (0,0) (1,0) (2,0) ... (NU,0) (0,1) (1,1) (2,1) ... (NU,1) ... (0,NV) ... (NU,NV) with each vertex containing either 3 or 4 floating-point numbers as specified by the header. If the header calls for ST coordinates, four pairs of floating-point numbers follow: the texture-space coordinates for the (0,0), (NU,0), (0,NV), and (NU,NV) corners of the patch, respectively. If the header calls for colors, four four-component (red, green, blue, alpha) floating-point colors follow, one for each patch corner. The series of patches ends at end-of-file, or with a closebrace if incorporated in an object reference.  File: geomview, Node: OFF, Next: VECT, Prev: BBP and BEZ, Up: Object File Formats 4.2.5 OFF Files --------------- The conventional suffix for `OFF' files is `.off'. Syntax: [ST][C][N][4][n]OFF # Header keyword [NDIM] # Space dimension of vertices, present only if nOFF NVERTICES NFACES NEDGES # NEdges not used or checked X[0] Y[0] Z[0] # Vertices, possibly with normals, # colors, and/or texture coordinates, in that order, # if the prefixes `N', `C', `ST' # are present. # If 4OFF, each vertex has 4 components, # including a final homogeneous component. # If nOFF, each vertex has NDIM components. # If 4nOFF, each vertex has NDIM+1 components. ... X[NVERTICES-1] Y[NVERTICES-1] Z[NVERTICES-1] # Faces # NV = # vertices on this face # V[0] ... V[NV-1]: vertex indices # in range 0..NVERTICES-1 NV V[0] V[1] ... V[NV-1] COLORSPEC ... # COLORSPEC continues past V[NV-1] # to end-of-line; may be 0 to 4 numbers # nothing: default # integer: colormap index # 3 or 4 integers: RGB[A] values 0..255 # 3 or 4 floats: RGB[A] values 0..1 `OFF' files (name for "object file format") represent collections of planar polygons with possibly shared vertices, a convenient way to describe polyhedra. The polygons may be concave but there's no provision for polygons containing holes. An `OFF' file may begin with the keyword `OFF'; it's recommended but optional, as many existing files lack this keyword. Three ASCII integers follow: NVERTICES, NFACES, and NEDGES. These are the number of vertices, faces, and edges, respectively. Current software does not use nor check NEDGES; it needn't be correct but must be present. The vertex coordinates follow: dimension * NVERTICES floating-point values. They're implicitly numbered 0 through NVERTICES-1. dimension is either 3 (default) or 4 (specified by the key character `4' directly before `OFF' in the keyword). Following these are the face descriptions, typically written with one line per face. Each has the form N VERT1 VERT2 ... VERTN [COLOR] Here N is the number of vertices on this face, and VERT1 through VERTN are indices into the list of vertices (in the range 0..NVERTICES-1). The optional COLOR may take several forms. Line breaks are significant here: the COLOR description begins after VERTN and ends with the end of the line (or the next # comment). A COLOR may be: nothing the default color one integer index into "the" colormap; see below three or four integers RGB and possibly alpha values in the range 0..255 three or four floating-point numbers RGB and possibly alpha values in the range 0..1 For the one-integer case, the colormap is currently read from the file `cmap.fmap' in Geomview's `data' directory. Some better mechanism for supplying a colormap is likely someday. The meaning of "default color" varies. If no face of the object has a color, all inherit the environment's default material color. If some but not all faces have colors, the default is gray (R,G,B,A=.666). A `[ST][C][N][n]OFF BINARY' format is accepted; *Note Binary format::. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions (and texture coordinates or vertex colors or normals if `COFF'/`NOFF'/`CNOFF'/`STCNOFF'/etc. format). Exception: each face's vertex indices are followed by an integer indicating how many color components accompany it. Face color components must be floats, not integer values. Thus a colorless triangular face might be represented as int int int int int 3 17 5 9 0 while the same face colored red might be int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0  File: geomview, Node: VECT, Next: SKEL, Prev: OFF, Up: Object File Formats 4.2.6 VECT Files ---------------- The conventional suffix for `VECT' files is `.vect'. Syntax: [4]VECT NPOLYLINES NVERTICES NCOLORS NV[0] ... NV[NPOLYLINES-1] # number of vertices # in each polyline NC[0] ... NC[NPOLYLINES-1] # number of colors supplied # in each polyline VERT[0] ... VERT[NVERTICES-1] # All the vertices # (3*NVertices floats) COLOR[0] ... COLOR[NCOLORS-1] # All the colors # (4*NColors floats, RGBA) `VECT' objects represent lists of polylines (strings of connected line segments, possibly closed). A degenerate polyline can be used to represent a point. A `VECT' file begins with the key word `VECT' or `4VECT' and three integers: NLINES, NVERTICES, and NCOLORS. Here NLINES is the number of polylines in the file, NVERTICES the total number of vertices, and NCOLORS the number of colors as explained below. Next come NLINES 16-bit integers NV[0] NV[1] NV[2] ... NV[NLINES-1] giving the number of vertices in each polyline. A negative number indicates a closed polyline; 1 denotes a single-pixel point. The sum (of absolute values) of the NV[I] must equal NVERTICES. Next come NLINES more 16-bit integers NC[I]: the number of colors in each polyline. Normally one of three values: 0 No color is specified for this polyline. It's drawn in the same color as the previous polyline. 1 A single color is specified. The entire polyline is drawn in that color. abs(NV[I]) Each vertex has a color. Either each segment is drawn in the corresponding color, or the colors are smoothly interpolated along the line segments, depending on the implementation. Next come NVERTICES groups of 3 or 4 floating-point numbers: the coordinates of all the vertices. If the keyword is 4VECT then there are 4 values per vertex. The first abs(NV[0]) of them form the first polyline, the next abs(NV[1]) form the second and so on. Finally NCOLORS groups of 4 floating-point numbers give red, green, blue and alpha (opacity) values. The first NC[0] of them apply to the first polyline, and so on. A VECT BINARY format is accepted; *note Binary format::. The binary format exactly follows the ASCII format, with 32-bit Big-Endian integers where ordinary integer numbers appear, and with 16-bit Big-Endian integers where 16-bit integers appear; 32-bit Big-Endian floats where real values appear. BIG FAT NOTE: The vertex counts NV[I] and the color counts NC[I] are 16-bit Big-Endian integers.  File: geomview, Node: SKEL, Next: SPHERE, Prev: VECT, Up: Object File Formats 4.2.7 SKEL Files ---------------- `SKEL' files represent collections of points and polylines, with shared vertices. The conventional suffix for `SKEL' files is `.skel'. Syntax: [C][4][n]SKEL [NDIM] # Vertex dimension, present only if nSKEL NVERTICES NPOLYLINES X[0] Y[0] Z[0] # Vertices # if 4SKEL, each vertex has 4 components # if nSKEL, each vertex has NDim components # if C[4][n]SKEL vertex coordinates are # followed by an RGBA color specification ... X[NVERTICES-1] Y[NVERTICES-1] Z[NVERTICES-1] # Polylines # NV = vertices on this polyline (1 = point) # V[0] ... V[NV-1]: vertex indices # in range 0..NVERTICES-1 NV V[0] V[1] ... V[NV-1] [COLORSPEC] ... # COLORSPEC continues past V[NV-1] # to end-of-line; may be nothing, or 3 or 4 numbers. # nothing: default color # 3 or 4 floats: RGB[A] values 0..1 The syntax resembles that of `OFF' files, with a table of vertices followed by a sequence of polyline descriptions, each referring to vertices by index in the table. Each polyline has an optional color. For `nSKEL' objects, each vertex has NDIM components. For `4nSKEL' objects, each vertex has NDIM+1 components; the final component is the homogeneous divisor. A [4][N]SKEL BINARY format is accepted; *Note Binary format::. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions. Exception: each polyline's vertex indices are followed by an integer indicating how many color components accompany it. Polyline color components must be floats, not integer values. Thus a colorless polyline with 3 vertices might be represented as int int int int int 3 17 5 9 0 while the same polyline colored red might be int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0  File: geomview, Node: SPHERE, Next: INST, Prev: SKEL, Up: Object File Formats 4.2.8 SPHERE Files ------------------ The conventional suffix for `SPHERE' files is `.sph'. [ST][E|H|S]SPHERE # Keyword # auto-generated texture co-ordinates, only allowed with _ST_SPHERE objects [SINUSOIDAL|CYLINDRICAL|RECTANGULAR|STEREOGRAPHIC|ONEFACE] # next four fields are required RADIUS XCENTER YCENTER ZCENTER The key word is `[ST][E|H|S]SPHERE'. The optional prefix characters mean: `ST' The sphere carries automatically generated texture co-ordinates. See below. `E' The sphere lives in Euclidean space. `H' The sphere lives in Hyperbolic space. *Note Non-Euclidean Geometry::. `S' The sphere lives in spherical space. *Note Non-Euclidean Geometry::. Sphere objects are drawn using meshes which are rectangular in a polar co-ordinate system, with the equatorial plane parallel to the `x,y'-plane. Their smoothness, and the time taken to draw them, depends on the setting of the dicing level, 10x10 by default. From Geomview, the Appearance panel, the `ad' keyboard command, or a `dice nu nv' Appearance attribute sets this. Texture co-ordinates are generated for `STSPHERE' objects; the keyword following the initial `STSPHERE' keyword defines the way this is done. It follows the conventions of the `mktxmesh' Perl-script which comes with the _Orrery_. SINUSOIDAL sinusoidal equal-area projection CYLINDRICAL cylindrical proj: S is the longitude, T is the latitude RECTANGULAR rectangular proj: S is the longitude, T is `sin(latitude)' (i.e. `z' co-ordinate in the sphere's co-ordinate system) STEREOGRAPHIC stereographic projection from the south (`z=-1') pole ONEFACE stretch orthographic view of `+y' hemisphere over both, mirroring  File: geomview, Node: INST, Next: LIST, Prev: SPHERE, Up: Object File Formats 4.2.9 INST Files ---------------- The conventional suffix for a `INST' file is `.inst'. There is no INST BINARY format. An `INST' applies a 4x4 (or (N+1)x(N+1) in the context of ND-viewing) transformation to another OOGL object. It begins with `INST' followed by these sections which may appear in any order: geom OOGL-OBJECT specifies the OOGL object to be instantiated. *Note References::, for the syntax of an OOGL-OBJECT. The keyword `unit' is a synonym for `geom'. transform ["{"] `4x4 transform' ["}"] specifies a single transformation matrix. Either the matrix may appear literally as 16 numbers, or there may be a reference to a "transform" object, i.e. "<" file-containing-4x4-matrix or ":" symbol-representing-transform-object Another way to specify the transformation is transforms OOGL-OBJECT The OOGL-OBJECT must be a `TLIST' object (list of transformations) object, or a `LIST' whose members are ultimately `TLIST' objects. In effect, the `transforms' keyword takes a collection of 4x4 matrices and replicates the `geom' object, making one copy for each 4x4 matrix. If no `transform' nor `transforms' keyword appears, no transformation is applied (actually the identity is applied). You could use this for, e.g., wrapping an appearance around an externally-supplied object, though a single-membered LIST would do this more efficiently. *Note Transformation matrices::, for the matrix format. When replicating a single geometry by means of a `TLIST' object (see `transforms' above) it may be useful to transform texture co-ordinates by another list of transformations; that list can be specified by txtransforms TLIST-OBJECT The number of texture transformations must match the number of geometry transformations. The `SPHERE' object (*note Sphere Objects: SPHERE.) uses this technique to generate an entire textured sphere out of some fraction of a sphere (usually one octant). A single (N+1)-dimensional transformation can be specified by ntransform ["{"] N+1 N+1 `(N+1)x(N+1) floats' ["}"] This gives a single N+1-dimensional transformation matrix. Either the matrix may appear literally as (N+1)x(N+1) numbers, or there may be a reference to an `ntransform' object, i.e. "<" file-containing-(N+1)x(N+1)-matrix or ":" symbol-representing-ntransform-object *Note ND Transformation matrices::, for the matrix format. Two more INST fields are accepted: `location' and `origin'. Note that `location' as well as `origin' are ignored if this `INST' object carries an `ntransform'. Also, if ND-viewing is active (`ND-axes' command, *note GCL::) then `INST' objects with `origin' unequal to `local' will not be drawn, though the `location' stuff may work (or not). location [global or camera or ndc or screen or local] Normally an INST specifies a position relative to its parent object; the `location' field allows putting an object elsewhere. * `location global' attaches the object to the global (a.k.a. universe) coordinate system - the same as that in which geomview's World objects, alien geometry, and cameras are placed. * `location camera' places the object relative to the camera. (Thus if there are multiple views, it may appear in a different spatial position in each view.) The center of the camera's view is along its negative Z axis; positive X is rightward, positive Y upward. Normally the units of camera space are the same as global coordinates. When a camera is reset, the global origin is at (0,0,-3.0). * `location ndc' places the object relative to the normalized unit cube into which the camera's projection (perspective or orthographic) maps the visible world. X, Y, and Z are each in the range from -1 to +1, with Z = -1 the near and Z = +1 the far clipping plane, and X and Y increasing rightward and upward respectively. Thus something like INST transform 1 0 0 0 0 1 0 0 0 0 1 0 -.9 -.9 -.999 1 location ndc geom < label.vect pastes `label.vect' onto the lower left corner of each window, and in front of nearly everything else, assuming `label.vect''s contents lie in the positive quadrant of the X-Y plane. It's tempting to use -1 rather than -.999 as the Z component of the position, but that may put the object just nearer than the near clipping plane and make it (partially) invisible, due to floating-point error. * `location screen' places the object in screen coordinates. The range of Z is still -1 through +1 as for ndc coordinates; X and Y are measured in pixels, and range from (0,0) at the _lower left_ corner of the window, increasing rightward and upward. `location local' is the default; the object is positioned relative to its parent. origin [global or camera or ndc or screen or local] x y z The `origin' field translates the contents of the INST to place the origin at the specified point of the given coordinate system. Unlike `location', it doesn't change the orientation, only the choice of origin. Both `location' and `origin' can be used together. So for example { INST location screen origin ndc 0 0 -.99 geom { < xyz.vect } transform { 100 0 0 0 0 100 0 0 0 0 -.009 0 0 0 0 1 } } places xyz.vect's origin in the center of the window, just beyond the near clipping plane. The unit-length X and Y edges are scaled to be just 100 screen units - pixels - long, regardless of the size of the window. * Menu: * INST Examples:: Some example of `INST' Files.  File: geomview, Node: INST Examples, Prev: INST, Up: INST 4.2.9.1 INST Examples ..................... Here are some examples of `INST' files INST unit < xyz.vect transform { 1 0 0 0 0 1 0 0 0 0 1 0 1 3 0 1 } { appearance { +edge material { edgecolor 1 1 0 } } INST geom < mysurface.quad } {INST transform {: T} geom { } } geom { # stuff replicated by all the above matrices ... } } This one resembles the `origin' example in the section above, but makes the X and Y edges be 1/4 the size of the window (1/4, not 1/2, since the range of ndc X and Y coordinates is -1 to +1). { INST location ndc geom { < xyz.vect } transform { .5 0 0 0 0 .5 0 0 0 0 -.009 0 0 0 -.99 1 } }  File: geomview, Node: LIST, Next: TLIST, Prev: INST, Up: Object File Formats 4.2.10 LIST Files ----------------- The conventional suffix for a `LIST' file is `.list'. A list of OOGL objects Syntax: LIST OOGL-OBJECT OOGL-OBJECT ... Note that there's no explicit separation between the oogl-objects, so they should be enclosed in curly braces ({ }) for sanity. Likewise there's no explicit marker for the end of the list; unless appearing alone in a disk file, the whole construct should also be wrapped in braces, as in: { LIST { QUAD ... } { < xyz.quad } } A `LIST' with no elements, i.e. `{ LIST }', is valid, and is the easiest way to create an empty object. For example, to remove a symbol's definition you might write { define somesymbol { LIST } }  File: geomview, Node: TLIST, Next: GROUP, Prev: LIST, Up: Object File Formats 4.2.11 TLIST Files ------------------ The conventional suffix for a `TLIST' file is `.grp' ("group") or `.prj' ("projective" matrices). Collection of 4x4 matrices, used in the `transforms' section of and `INST' object. Syntax: TLIST # key word <4x4 matrix (16 floats)> ... # any number of 4x4 matrices transform { # reference to a transform object } tlist { # nested TLIST } `TLIST's are used only within the `transforms' clause of an `INST' object. They cause the `INST's `geom' object to be instantiated once under each of the transforms in the `TLIST'. The effect is like that of a `LIST' of `INST's each with a single transform, and all referring to the same object, but is more efficient. `TLIST's can be nested: effectively this means that all transformations in each nested `TLIST' object are multiplied (from the left) by the transformations in the outer `TLIST' object. Be aware that a `TLIST' is a kind of geometry object, distinct from a `transform' object. Some contexts expect one type of object, some the other. For example in INST transform { : MYT } geom { ... } MYT must be a transform object, which might have been created with the GCL (read transform { define myT 1 0 0 1 ... }) while in INST transforms { : MYTS } geom { ... } or INST transforms { LIST {: MYTS} {< more.prj} } geom { ... } MYTS must be a geometry object, defined e.g. with (read geometry { define MYTS { TLIST 1 0 0 1 ... } }) A `TLIST BINARY' format is accepted. Binary data begins with a 32-bit integer giving the number of transformations, followed by that number of 4x4 matrices in 32-bit floating-point format. The order of matrix elements is the same as in the ASCII format.  File: geomview, Node: GROUP, Next: DISCGRP, Prev: TLIST, Up: Object File Formats 4.2.12 GROUP Files ------------------ This format is obsolete, but is still accepted. It combined the functions of `INST' and `TLIST', taking a series of transformations and a single Geom (`unit') object, and replicating the object under each transformation. GROUP ... < matrices > ... unit { OOGL-OBJECT } is still accepted and effectively translated into INST transforms { TLIST ... ... } unit { OOGL-OBJECT }  File: geomview, Node: DISCGRP, Next: COMMENT, Prev: GROUP, Up: Object File Formats 4.2.13 DISCGRP Files -------------------- This format is for discrete groups, such as appear in the theory of manifolds or in symmetry patterns. This format has its own man page. See discgrp(5).  File: geomview, Node: COMMENT, Prev: DISCGRP, Up: Object File Formats 4.2.14 COMMENT Objects ---------------------- The COMMENT object is a mechanism for encoding arbitrary data within an OOGL object. It can be used to keep track of data or pass data back and forth between external modules. Syntax: COMMENT # key word NAME TYPE # individual name and type specifier { ... } # arbitrary data The data, which must be enclosed by curly braces, can include anything except unbalanced curly braces. The TYPE field can be used to identify data of interest to a particular program through naming conventions. `COMMENT' objects are intended to be associated with other objects through inclusion in a `LIST' object. (*Note LIST::.) The "#" OOGL comment syntax does not suffice for data exchange since these comments are stripped when an OOGL object is read in to Geomview. The `COMMENT' object is preserved when loaded into Geomview and is written out intact. Here is an example associating a WorldWide Web URL with a piece of geometry: { LIST { < Tetrahedron} {COMMENT GCHomepage HREF { http://www.geomview.org/ }} } A binary `COMMENT' format is accepted. Its format is not consistent with the other OOGL binary formats. *Note Binary format::. The `name' and `type' are followed by N BYTE1 BYTE2 ... BYTEN instead of data enclosed in curly braces.  File: geomview, Node: Non-geometric objects, Prev: Object File Formats, Up: OOGL File Formats 4.3 Non-geometric objects ========================= The syntax of these objects is given in the form used in *Note References::, where "quoted" items should appear literally but without quotes, square bracketed ([ ]) items are optional, and | separates alternative choices. * Menu: * appearance objects:: Appearance objects. * image objects:: Image objects. * transform objects:: Transformation matrices. * ntransform objects:: N-dimensional transformation matrices. * camera objects:: Cameras. * window objects:: Windows.  File: geomview, Node: appearance objects, Next: image objects, Prev: Non-geometric objects, Up: Non-geometric objects 4.3.1 Appearance Objects ------------------------ Appearances are OOGL objects of their own right, which simply means that it is possible to give them symbolic names (*note References::). There are other sections dealing with appearance details. *Note Appearances::.  File: geomview, Node: image objects, Next: transform objects, Prev: appearance objects, Up: Non-geometric objects 4.3.2 Image Objects ------------------- Image objects are used to specify pixmap data for either textures (*note Texture Mapping::), or for background images of cameras (*note Camera objects: camera.). At the time of this writing images are comprised of 1 to 4 channels, a channel provides a single number in the range from 0 to `maxval' for each pixel; and `maxval' is tied to 255. The interpretation of the image data depending on the number of channels is like follows: #Channels Channel No. Interpretation -------------------------------------------------------------------------- 1 1 greyscale or luminance data 2 1 greyscale or luminance data ` ' 2 alpha channel (0: transparent, `maxval': opaque) 3 1 red channel `' 2 green channel `' 3 blue channel 4 1 red channel `' 2 green channel `' 3 blue channel `' 4 alpha channel (0: transparent, `maxval': opaque) Image data can be specified inline (embedded into the current data stream) or via file references; in both cases the data is read in and interpreted at the time the image object is parsed. _This is different from the old (and deprecated) texture image specification, where the the image data on-disk would eventually be re-read by Geomview_. The general syntax of image objects is like follows: ::= [ "{" ] (curly brace, generally needed to make the end of the object unambiguous.) [ "image" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines an image named , setting its value from the stuff which follows) | "<" (meaning: read image from that file) | ":" (meaning: use variable NAME, defined elsewhere; if undefined the image carries no data) | (actual stuff defining the image; image data must come last, after defining the width and height and number of channels) "width" (width of the image, auto-detected from image data if possible) "height" (height of the image, auto-detected from image data if possible) "channels" (number of channels, auto-detected from image data and `data' specifications, if possible) "maxval" (unsupported, must be `255' if specified) "data DESTMASK [FILTER] [{] < FILENAME [}]" "data DESTMASK [FILTER] DATASIZE [{][\n]LITERAL_IMAGE_DATA[}]" (either external or embedded image data, see below for a detailed description of the meaning of _MASK_ and _FILTER_. An image can (and has, in general) multiple data sections.) [ "}" ] (matching curly brace) Details concerning the image data specification: `DESTMASK' This is a bit-field describing where the specified image data should be placed in the destination pixmap. The bit-field is specified by an integer in one of the known formats (decimal, octal, hexadecimal). The channels of the source data are always enumbered consecutively. If, e.g. `FILENAME' or `LITERAL_IMAGE_DATA' specify a three-channel (probably RGB ...) image and `DESTMASK' equals `0xD' (i.e. bit 1 is 0), then the 3rd channel of the source pixmap would be placed in the 4th channel of the destination image object (the alpha channel), the 2nd source channel would determine the `blue' destination value and the 1st source channel the `red' destination value. The number of channels of the source data always has to match the number of bits set in `DESTMASK'. Exception: if the source pixmap has only one channel, then it can be used to fill any number of destination channels; all channels specified in `DESTMASK' are filled with the data of the single channel source pixmap. Geomview knows the following symbolic constants, which can be used instead of specifying the `DESTMASK' bit-field numerically: `LUMINANCE' same as `1', `0x1', `\01' `LUMINANCE_ALPHA' same as `3', `0x3', `\03' `RGB' same as `7', `0x7', `\07' `RGBA' same as `15', `0xf', `\017' `ALPHA' depends on the context: the absolute number of channels must be known; i.e. `data ALPHA ...' must be prepended by something determining the number of channels of the image, e.g. ... data RGB ... data ALPHA ... is valid, but data ALPHA ... is not valid, because Geomview has not means to determine the destination channel from the context. `AUTO' PGM image data is interpreted as single grey-scale channel, RGB PNM data as RGB image data. `AUTO' cannot work with `raw' image data. `FILTER' The `FILTER' specification is optional. If it is missing, then Geomview tries to determine the image type from the `FILENAME' suffix. If there is no suffix or the suffix is unknown, or for embedded image data, Geomview is able to auto-detectc SGI image file formats (for historical reasons ...) and NetPBM image formats (for practical reasons). The auto-detection of NetPBM formats includes the new "PAM" image format which allows (among other things) to store an alpha channel together with the luminance or RGB data. Likewise, the final output of any of the specified filters must either be in SGI image file format, or specify a PAM, PNM or PGM image. If the image file format cannot be determined by either the filenmae suffix or the filter specification or by auto-deteciong of SGI or NetPBM data, then Geomview assume that it is raw-data. See below. The decompression filters may be prepended to either one of the know image formats or an explicitly specified filter, e.g. the following is valid: data LUMINANCE raw.gzip { < gzippedgreymapfile } The above should be equivalent to data LUMINANCE raw { < greymapfile }, provided that the decompressed data carries single channel data, with the first pixel corresponding to the lower-left corner (because of the `raw' image format, see below). Geomview has builtin knowledge for the following filters/suffixes: Data Decompression `z' `gz' `gzip' data is piped through `gzip -dc' `bz2' `bzip2' data is piped through `bzip2 -dc' Image Formats `tiff' `tif' `TIFF' image file format. Only supported if the `tifftopnm' executable can be fond in the current excution path. `png' `PNG' image file format. Only supported if the `pngtopnm' executable can be fond in the current excution path. `jpg' `jpeg' `JPEG' image file format. Only supported if the `jpegtopnm' executable can be fond in the current excution path. `gif' `GIF' image file format. Only supported if the `giftoppm' executable can be fond in the current excution path. `raw' Raw image data; the number of channels must match the number of bits set in `DESTMASK'. Pixels are specified with 1 byte per channel. The pixels are organized in rows as `liminance[-alpha]' or `RGB[A]' samples. The left-most pixel is the first pixel in each data-row, the top-most image row must come first (this is just the same as the NetPBM convention, the image co-ordinate systems has its origin in the left/top corner, as usual). Explicitly Specified Filters If none of the suffixes specified above should match, then the suffix/filter is interpreted as an external filter program; the filter program must read from `STDIN' and write to `STDOUT'. The output must either be in SGI image format, or in PNM or PGM format. Otherwise the output data is interpreted as raw image data (see above). Something like the following should work, provided that the program `${HOME}/bin/bububfilter' exists, is executable and does something useful: ... data RGB "${HOME}/bin/bububfilter.bzip2" 7 { # binary data follows bububub } ... Note that - prior to feeding the data to the `bububfilter' - Geomview will try to decompress the stuff with `bzip2 -dc'. Missing image data: Normally, the number of image channels is determined automatically from the image `data' specifications; if the image specification carries an explicit number of channels via the `channels' keyword which exceeds the number of channels found in the image `data' specifications, or if the union of all `DESTMASK' specfications has holes, then missing luminance and RGB channels are initialized to 0, and a missing alpha-channel is initialized to `maxval', i.e. omitting the alpha channel data for an RGBA image is just the same as defining an RGB image.  File: geomview, Node: transform objects, Next: ntransform objects, Prev: image objects, Up: Non-geometric objects 4.3.3 Transform Objects ----------------------- Where a single 4x4 matrix is expected - as in the `INST' `transform' field, the camera's `camtoworld' transform and the Geomview `xform*' commands - use a transform object. Note that a transform is distinct from a `TLIST', which is a type of geometry. `TLIST's can contain one or more 4x4 transformations; "transform" objects must have exactly one. Why have both? In many places - e.g. camera positioning - it's only meaningful to have a single transform. Using a separate object type enforces this. Syntax for a transform object is ::= [ "{" ] (curly brace, generally needed to make the end of the object unambiguous.) [ "transform" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines a transform named , setting its value from the stuff which follows) (interpreted as a 4x4 homogeneous transform given row by row, intended to apply to a row vector multiplied on its LEFT, so that e.g. Euclidean translations appear in the bottom row) | "<" (meaning: read transform from that file) | ":" (meaning: use variable , defined elsewhere; if undefined the initial value is the identity transform) [ "}" ] (matching curly brace) The whole should be enclosed in { braces }. Braces are not essential if exactly one of the above items is present, so e.g. a 4x4 array of floats standing alone may but needn't have braces. Some examples, in contexts where they might be used: # Example 1: A GCL command to define a transform # called "fred" (read transform { transform define fred 1 0 0 0 0 1 0 0 0 0 1 0 -3 0 1 1 } ) # Example 2: A camera object using transform # "fred" for camera positioning # Given the definition above, this puts the camera at # (-3, 0, 1), looking toward -Z. { camera halfyfield 1 aspect 1.33 camtoworld { : fred } }  File: geomview, Node: ntransform objects, Next: camera objects, Prev: transform objects, Up: Non-geometric objects 4.3.4 ND-Transform Objects -------------------------- Where - in the context of ND-viewing - a single (N+1)x(N+1) matrix is expected - as in the `INST' `ntransform' field, or the `ND-xform*' (*note GCL::) commands - use an `ntransform' object. `ntransform' are NROWS x NCOLS transformation matrix where usually NROWS = N+1 in the context of N-dimensional objects and viewing. The homogeneous component of an `ntransform' sits at column zero (in contrast to ordinary `transform' objects where it is located at column three). `ntransform' objects operate on points of any dimension: if a point is to be transformed by an `ntransform' object and the dimension of the point does not match the number of rows of the `ntransform' object, then either the point is implicitly padded with zeros to match NROWS or the matrix is implicitly padded with ones down its diagonal (and zeros everywhere else) such that it will operate as identity on the excess dimensions of the input point. Syntax for an `ntransform' object is ::= [ "{" ] (curly brace, generally needed to make the end of the object unambiguous.) [ "ntransform" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines a transform named , setting its value from the stuff which follows) NROWS NCOLS (number of rows and columns of the matrix, typically N+1 N+1, but any dimensions are possible) (interpreted as a NROWS x NCOLS homogeneous transform given row by row, intended to apply to a row vector multiplied on its LEFT, so that e.g. Euclidean translations appear in the top row -- in contrast to the ordinary transform objects where the translations appear in the bottom row) | "<" (meaning: read transform from that file) | ":" (meaning: use variable , defined elsewhere; if undefined the initial value is the identity transform) [ "}" ] (matching curly brace) The whole should be enclosed in { braces }. Braces are not necessarily essential, so e.g. two integers - NROWS NCOLS - followed by a NROWS x NCOLS array of floats standing alone may but needn't have braces. Some examples, in contexts where they might be used: # Example 1: A GCL command to define a `6x6' transform called # "fred", a mere translation by the vector `-3 0 1 1 0'. This # transform is meant for a five dimensional space, with an homogeneous # component a index zero. (read ntransform { ntransform define fred 6 6 1 -3 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 } ) # Example 2: Set the ND-xform of an object -- a geometry or a camera # cluster. Given the definition above, this puts the object at (-3 0 1 1 # 0) in the five dimensional space. (ND-xform-set focus : fred) # or (ND-xform-set g1 : fred)  File: geomview, Node: camera objects, Next: window objects, Prev: ntransform objects, Up: Non-geometric objects 4.3.5 cameras ------------- A camera object specifies the following properties of a camera: position and orientation specified by either a camera-to-world or world-to-camera transformation; this transformation does not include the projection, so it's typically just a combination of translation and rotation. Specified as a transform object, typically a 4x4 matrix. "focus" distance Intended to suggest a typical distance from the camera to the object of interest; used for default camera positioning (the camera is placed at (X,Y,Z) = (0,0,focus) when reset) and for adjusting field-of-view when switching between perspective and orthographic views. window aspect ratio True aspect ratio in the sense /. This normally should agree with the aspect ratio of the camera's window. Geomview normally adjusts the aspect ratio of its cameras to match their associated windows. near and far clipping plane distances Note that both must be strictly greater than zero. Very large / distance ratios cause Z-buffering to behave badly; part of an object may be visible even if somewhat more distant than another. field of view Specified in either of two forms. `fov' is the field of view - in degrees if perspective, or linear distance if orthographic - in the _shorter_ direction. `halfyfield' is half the projected Y-axis field, in world coordinates (not angle!), at unit distance from the camera. For a perspective camera, halfyfield is related to angular field: halfyfield = tan( Y_axis_angular_field / 2 ) while for an orthographic one it's simply: halfyfield = Y_axis_linear_field / 2 This odd-seeming definition is (a) easy to calculate with and (b) well-defined in both orthographic and perspective views. background color Arguably not a property of a camera, but of the scene. Nevertheless, as there is no "background" OOGL object, and the background color should not be a property of the drawing device, it can be specified here. At the time of this writing, however, the GUI always overrides the background color with its own settings. background image Same reasoning as above, only that the GUI does not override this setting. The image is centered at NDC co-ordinates `(0,0,-1)'; it is not resized, just painted behind everything else as is. *Note Image objects: image. The syntax for a camera is: ::= [ "camera" ] (optional keyword) [ "{" ] (opening brace, generally required) [ "define" ] "<" | ":" | (or any number of the following, in any order...) "perspective" {"0" | "1"} (default 1) (otherwise orthographic) "stereo" {"0" | "1"} (default 0) (otherwise mono) "worldtocam" (see transform syntax above) "camtoworld" (no point in specifying both camtoworld and worldtocam; one is constrained to be the inverse of the other) "halfyfield" (default tan 40/2 degrees) "fov" (angular field-of-view if perspective, linear field-of-view otherwise. Measured in whichever direction is smaller, given the aspect ratio. When aspect ratio changes -- e.g. when a window is reshaped -- "fov" is preserved.) "frameaspect" (X/Y) (default 1.333) "near" (default 0.1) "far" (default 10.0) "focus" (default 3.0) "bgcolor" (default 1/3 1/3 1/3 1) "bgimage" { } (default no background image) [ "}" ] (matching closebrace)  File: geomview, Node: window objects, Prev: camera objects, Up: Non-geometric objects 4.3.6 window ------------ A window object specifies size, position, and other window-system related information about a window in a device-independent way. The syntax for a window object is: window ::= [ "window" ] (optional keyword) [ "{" ] (curly brace, often required) (any of the following, in any order) "size" (size of the window) "position" (position & size) "noborder" (specifies the window should have no window border) "pixelaspect" (specifies the true visual aspect ratio of a pixel in this window in the sense xsize/ysize, normally 1.0. For stereo hardware which stretches the display vertically by a factor of 2, ``pixelaspect 0.5'' might do. The value is used when computing the projection of a camera associated with this window.) [ "}" ] (matching closebrace) Window objects are used in the Geomview `window' and `ui-panel' commands to set default properties for future windows or to change those of an existing window. *Note `(window ...)': window. *Note `(ui-panel ...)': ui-panel.  File: geomview, Node: Customization, Next: Modules, Prev: OOGL File Formats, Up: Top 5 Customization: `.geomview' files ********************************** When Geomview is started, it loads and executes commands in a system-wide startup file named `.geomview'. This file is in the `data' subdirectory of the Geomview distribution directory and contains GCL commands to configure Geomview in a way common to all users on the system. Next, Geomview looks for the file `~/.geomview' (`~' stands for your home directory). You can use this to configure your own default Geomview behavior to suit your tastes. After reading `~/.geomview', Geomview looks for a file named `.geomview' in the current directory. If such a file exists Geomview reads it, unless it is the same as `~/.geomview' (which would be the case if you are running Geomview from your home directory). You can use the current directory's `.geomview' to create a Geomview customization specific to a certain project. You can use `.geomview' files to control all kinds of things about Geomview. They can contain any valid GCL statements. Especially useful is the `ui-panel' command which controls the initial placement of Geomview's panels. For an example see the system-wide `.geomview' file mentioned above. *Note GCL::. *Note `(ui-panel ...)': ui-panel. It is a good idea to enclose all the commands you put in a `.geomview' file in a `progn' statement in order to cause Geomview to execute them all at once. Otherwise Geomview might execute them sequentially over the first few refresh cycles after starting up. To change, e.g. the focus policy of the camera window such that they pick up the focus policy of the window manager (instead of being activated when the mouse cursor crosses the window), you could put the following in your `~/.geomview' file: (progn (ui-cam-focus focus-change) ... # other stuff ) You can put any valid `GCL' command into your `.geomview' files,*note GCL::. *Note `(progn ...)': progn. *Note `(ui-cam-focus ...)': ui-cam-focus.  File: geomview, Node: Modules, Next: GCL, Prev: Customization, Up: Top 6 External Modules ****************** An external module is a program that interacts with Geomview. A module communicates with Geomview through GCL and can control any apsect of Geomview that you can control through Geomview's user interface. In many cases an external module is a specialized program that implements some mathematical algorithm that creates a geometric object that changes shape as the algorithm progresses. The module informs Geomview of the new object shape at each step, so the object appears to evolve with time in the Geomview window. In this way Geomview serves as a _display engine_ for the module. An external module may be interactive. It can respond to mouse and keyboard events that take place in a Geomview window, thus extending the capability of Geomview itself. * Menu: * Interface:: How External Modules Interface with Geomview. * Example1:: Simple External Module. * Example2:: Simple External Module with FORMS Control Panel. * XForms:: The XForms library. * Example3:: External Module with Bi-Directional Communication. * Example4:: Simple Tcl/Tk Module Demonstrating Picking. * Module Installation:: Module Installation.  File: geomview, Node: Interface, Next: Example1, Prev: Modules, Up: Modules 6.1 How External Modules Interface with Geomview ================================================ External modules appear in the _Modules_ browser in Geomview's _Main_ panel. To run a module, click the left mouse button on the module's entry in the browser. While the module is running, an additional line for that module will appear in the browser. This line begins with a number in brackets, which indicates the _instace_ number of the module. (For some modules it makes sense to have more than one instance of the module running at the same time.) You can kill an external module by clicking on its instance entry. By default when Geomview starts, it displays all the modules that have been installed on your system. For instructions on installing a module on your system so that it will appear in the _Modules_ browser every time Geomview is run by anyone on your system, *Note Module Installation::. When Geomview invokes an external module, it creates pipes connected to the module's standard input and output. (Pipes are like files except they are used for communication between programs rather than for storing things on a disk.) Geomview interprets anything that the module writes to its standard output as a GCL command. Likewise, if the external module requests any data from Geomview, Geomview writes that data to the module's standard input. Thus all a module has to do in order to communicate with Geomview is write commands to standard output and (optionally) receive data on standard input. Note that this means that the module cannot use standard input and output for communicating with the user. If a module needs to communicate with the user it can do so either through a control panel of its own or else by responding to certain events that it finds out about from Geomview.  File: geomview, Node: Example1, Next: Example2, Prev: Interface, Up: Modules 6.2 Example 1: Simple External Module ===================================== This section gives a very simple external module which displays an oscillating mesh. To try out this example, make a copy of the file `example1.c' (it is distributed with Geomview in the `doc' subdirectory) in your directory and compile it with the command cc -o example1 example1.c -lm Then put the line (emodule-define "Example 1" "./example1") in a file called `.geomview' in your current directory. Then invoke Geomview; it is important that you compile the example program, create the `.geomview' file, and invoke Geomview all in the same directory. You should see "Example 1" in the _Modules_ browser of Geomview's _Main_ panel; click on this entry in the browser to start the module. A surface should appear in your camera window and should begin oscillating. You can stop the module by clicking on the "[1] Example 1" line in the _Modules_ browser. /* * example1.c: oscillating mesh * * This example module is distributed with the Geomview manual. * If you are not reading this in the manual, see the "External * Modules" chapter of the manual for more details. * * This module creates an oscillating mesh. */ #include #include /* F is the function that we plot */ float F(x,y,t) float x,y,t; { float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); } main(argc, argv) char **argv; { int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t, dt; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Geomview setup. We begin by sending the command * (geometry example { : foo}) * to Geomview. This tells Geomview to create a geom called * "example" which is an instance of the handle "foo". */ printf("(geometry example { : foo })\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) { UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); } } /* UpdateMesh sends one mesh iteration to Geomview. This consists of * a command of the form * (read geometry { define foo * MESH * ... * }) * where ... is the actual data of the mesh. This command tells * Geomview to make the value of the handle "foo" be the specified * mesh. */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; { int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry { define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include #include /* for struct timeval below */ #include "forms.h" /* for FORMS library */ FL_FORM *OurForm; FL_OBJECT *VelocitySlider; float dt; /* F is the function that we plot */ float F(x,y,t) float x,y,t; { float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); } /* SetVelocity is the slider callback procedure; FORMS calls this * when the user moves the slider bar. */ void SetVelocity(FL_OBJECT *obj, long val) { dt = fl_get_slider_value(VelocitySlider); } /* Quit is the "Quit" button callback procedure; FORMS calls this * when the user clicks the "Quit" button. */ void Quit(FL_OBJECT *obj, long val) { exit(0); } /* create_form_OurForm() creates the FORMS panel by calling a bunch of * procedures in the FORMS library. This code was generated * automatically by the FORMS designer program; normally this code * would be in a separate file which you would not edit by hand. For * simplicity of this example, however, we include this code here. */ create_form_OurForm() { FL_OBJECT *obj; FL_FORM *form; OurForm = form = fl_bgn_form(FL_NO_BOX,380.0,120.0); obj = fl_add_box(FL_UP_BOX,0.0,0.0,380.0,120.0,""); VelocitySlider = obj = fl_add_valslider(FL_HOR_SLIDER,20.0,30.0, 340.0,40.0,"Velocity"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_object_align(obj,FL_ALIGN_TOP); fl_set_call_back(obj,SetVelocity,0); obj = fl_add_button(FL_NORMAL_BUTTON,290.0,75.0,70.0,35.0,"Quit"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_call_back(obj,Quit,0); fl_end_form(); } main(argc, argv) char **argv; { int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t; int fdmask; static struct timeval timeout = {0, 200000}; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Forms panel setup. */ foreground(); create_form_OurForm(); fl_set_slider_bounds(VelocitySlider, 0.0, 1.0); fl_set_slider_value(VelocitySlider, dt); fl_show_form(OurForm, FL_PLACE_SIZE, TRUE, "Example 2"); /* Geomview setup. */ printf("(geometry example { : foo })\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) { fdmask = (1 << fileno(stdin)) | (1 << qgetfd()); select(qgetfd()+1, &fdmask, NULL, NULL, &timeout); fl_check_forms(); UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); } } /* UpdateMesh sends one mesh iteration to Geomview */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; { int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry { define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include "lisp.h" /* We use the OOGL lisp library */ #include "pickfunc.h" /* for PICKFUNC below */ #include "3d.h" /* for 3d geometry library */ /* boxstring gives the OOGL data to define the little box that * we draw at the pick point. NOTE: It is very important to * have a newline at the end of the OFF object in this string. */ char boxstring[] = "\ INST\n\ transform\n\ .04 0 0 0\n\ 0 .04 0 0\n\ 0 0 .04 0\n\ 0 0 0 1\n\ geom\n\ OFF\n\ 8 6 12\n\ \n\ -.5 -.5 -.5 # 0 \n\ .5 -.5 -.5 # 1 \n\ .5 .5 -.5 # 2 \n\ -.5 .5 -.5 # 3 \n\ -.5 -.5 .5 # 4 \n\ .5 -.5 .5 # 5 \n\ .5 .5 .5 # 6 \n\ -.5 .5 .5 # 7 \n\ \n\ 4 0 1 2 3\n\ 4 4 5 6 7\n\ 4 2 3 7 6\n\ 4 0 1 5 4\n\ 4 0 4 7 3\n\ 4 1 2 6 5\n"; progn() { printf("(progn\n"); } endprogn() { printf(")\n"); fflush(stdout); } Initialize() { extern LObject *Lpick(); /* This is defined by PICKFUNC below but must */ /* be used in the following LDefun() call */ LInit(); LDefun("pick", Lpick, NULL); progn(); { /* Define handle "littlebox" for use later */ printf("(read geometry { define littlebox { %s }})\n", boxstring); /* Express interest in pick events; see Geomview manual for explanation. */ printf("(interest (pick world * * * * nil nil nil nil nil))\n"); /* Define "pick" object, initially the empty list (= null object). * We replace this later upon receiving a pick event. */ printf("(geometry \"pick\" { LIST } )\n"); /* Make the "pick" object be non-pickable. */ printf("(pickable \"pick\" no)\n"); /* Turn off normalization, so that our pick object will appear in the * right place. */ printf("(normalization \"pick\" none)\n"); /* Don't draw the pick object's bounding box. */ printf("(bbox-draw \"pick\" off)\n"); } endprogn(); } /* The following is a macro call that defines a procedure called * Lpick(). The reason for doing this in a macro is that that macro * encapsulates a lot of necessary stuff that would be the same for * this procedure in any program. If you write a Geomview module that * wants to know about user pick events you can just copy this macro * call and change the body to suit your needs; the body is the last * argument to the macro and is delimited by curly braces. * * The first argument to the macro is the name of the procedure to * be defined, "Lpick". * * The next two arguments are numbers which specify the sizes that * certain arrays inside the body of the procedure should have. * These arrays are used for storing the face and path information * of the picked object. In this module we don't care about this * information so we declare them to have length 1, the minimum * allowed. * * The last argument is a block of code to be executed when the module * receives a pick event. In this body you can refer to certain local * variables that hold information about the pick. For details see * Example 3 in the Extenal Modules chapter of the Geomview manual. */ PICKFUNC(Lpick, 1, 1, { handle_pick(pn>0, &point, vn>0, &vertex, en>0, edge); }, /* version for picking Nd-objects (not documented here) */) handle_pick(picked, p, vert, v, edge, e) int picked; /* was something actually picked? */ int vert; /* was the pick near a vertex? */ int edge; /* was the pick near an edge? */ HPoint3 *p; /* coords of pick point */ HPoint3 *v; /* coords of picked vertex */ HPoint3 e[2]; /* coords of endpoints of picked edge */ { Normalize(&e[0]); /* Normalize makes 4th coord 1.0 */ Normalize(&e[1]); Normalize(p); progn(); { if (!picked) { printf("(geometry \"pick\" { LIST } )\n"); } else { /* * Put the box in place, and color it magenta if it's on a vertex, * yellow if not. */ printf("(xform-set pick { 1 0 0 0 0 1 0 0 0 0 1 0 %g %g %g 1 })\n", p->x, p->y, p->z); printf("(geometry \"pick\"\n"); if (vert) printf("{ appearance { material { diffuse 1 0 1 } }\n"); else printf("{ appearance { material { diffuse 1 1 0 } }\n"); printf(" { LIST { :littlebox }\n"); /* * If it's on an edge and not a vertex, mark the edge * with cyan boxes at the endpoins and a black line * along the edge. */ if (edge && !vert) { e[0].x -= p->x; e[0].y -= p->y; e[0].z -= p->z; e[1].x -= p->x; e[1].y -= p->y; e[1].z -= p->z; printf("{ appearance { material { diffuse 0 1 1 } }\n\ LIST\n\ { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\ { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\ { VECT\n\ 1 2 1\n\ 2\n\ 1\n\ %f %f %f\n\ %f %f %f\n\ 1 1 0 1\n\ }\n\ }\n", e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z, e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z); } printf(" }\n }\n)\n"); } } endprogn(); } Normalize(HPoint3 *p) { if (p->w != 0) { p->x /= p->w; p->y /= p->w; p->z /= p->w; p->w = 1; } } main() { Lake *lake; LObject *lit, *val; extern char *getenv(); Initialize(); lake = LakeDefine(stdin, stdout, NULL); while (!feof(stdin)) { /* Parse next lisp expression from stdin. */ lit = LSexpr(lake); /* Evaluate that expression; this is where Lpick() gets called. */ val = LEval(lit); /* Free the two expressions from above. */ LFree(lit); LFree(val); } } The code begins by defining procedures `progn()' and `endprogn()' which begin and end a Geomview `progn' group. The purpose of the Geomview `progn' command is to group commands together and cause Geomview to execute them all at once, without refreshing any graphics windows until the end. It is a good idea to group blocks of commands that a module sends to Geomview like this so that the user sees their cumulative effect all at once. Procedure `Initialize()' does various things needed at program startup time. It initializes the lisp library by calling `LInit()'. Any program that uses the lisp library should call this once before calling any other lisp library functions. It then calls `LDefun' to tell the library about our `pick' procedure, which is defined further down with a call to the `PICKFUNC' macro. Then it sends a bunch of setup commands to Geomview, grouped in a `progn' block. This includes defining a handle called `littlebox' that stores the geometry of the little box. Next it sends the command (interest (pick world * * * * nil nil nil nil nil)) which tells Geomview to notify us when a pick event happens. The syntax of this `interest' statement merits some explanation. In general `interest' takes one argument which is a (parenthesized) expression representing a Geomview function call. It specifies a type of call that the module is interested in knowing about. The arguments can be any particular argument values, or the special symbols `*' or `nil'. For example, the first argument in the `pick' expression above is `world'. This means that the module is interested in calls to `pick' where the first argument, which specifies the coordinate system, is `world'. A `*' is like a wild-card; it means that the module is interested in calls where the corresponding argument has any value. The word `nil' is like `*', except that the argument's value is not reported to the module. This is useful for cutting down on the amount of data that must be transmitted in cases where there are arguments that the module doesn't care about. The second, third, fourth, and fifth arguments to the `pick' command give the name, pick point coordinates, vertex coordinates, and edge coordinates of a pick event. We specify these by `*''s above. The remaining five arguments to the `pick' command give other information about the pick event that we do not care about in this module, so we specify these with `nil''s. For the details of the arguments to `pick', *Note GCL::. The `geometry' statement defines a geom called `pick' that is initially an empty list, specified as ` { LIST } '; this is the best way of specifying a null geom. The module will replace this with something useful by sending Geomview another `geometry' command when the user picks something. Next we arrange for the `pick' object to be non-pickable, and turn normalization off for it so that Geomview will display it in the size and location where we put it, rather than resizing and relocating it to fit into the unit cube. The next function in the file, `Lpick', is defined with a strange looking call to a macro called `PICKFUNC', defined in the header file `pickfunc.h'. This is the function for handling pick events. The reason we provide a macro for this is that that macro encapsulates a lot of necessary stuff that would be the same for the pick-handling function in any program. If you write a Geomview module that wants to know about user pick events you can just copy this macro call and change it to suit yours needs. In general the syntax for `PICKFUNC' is PICKFUNC(NAME, BLOCK, NDBLOCK) where NAME is the name of the procedure to be defined, in this case `Lpick'. The next argument, BLOCK, is a block of code to be executed when a pick event occurs. If BLOCK contains a return statement, then the returned value must be a pointer to a Lisp-object, that is of type `LObject *'. The last argument has the same functionality as the BLOCK argument, but is only invoked when picking objects in a higher dimensional world. `PICKFUNC' declares certain local variables in the body of the procedure. When the module receives a `(pick ...)' statement from Geomview, the procedure assigns values to these variables based on the information in the `pick' call (variables corresponding to `nil''s in the `(interest (pick ...))' are not given values). There is also a second variant of the `PICKFUNC' macro with a slightly different syntax: DEFPICKFUNC(HELPSTR, COORDSYS, ID, POINT, PN, VERTEX, VN, EDGE, EN, FACE, FN, PPATH, PPN, VI, EI, EIN, FI, BODY, NDBODY) `DEFPICKFUNC' can be used as well as `PICKFUNC', there is no functional difference with the exception that the name of the C-function is tied to `Lpick' when using `DEFPICKFUNC' and that the `(help pick)' GCL-command (*note `(help ...)': help.) would respond with echoing HELPSTR. The table below lists all variables defined in `PICKFUNC' In the context of ND-viewing `float' variants of the arguments apply: the BODY execution block sees the `HPoint3' variables, and the NDBODY block sees only flat one-dimensional arrays of `float'-type. In the ND-viewing context the co-ordinates passed to the pick function are still the 3-dimensional co-ordinates of the camera view-port where the pick occurred, but padded with zeroes on transformed back to the co-ordinate system specified by the second argument of the `pick' command. `char *coordsys;' A string specifying the coordinate system in which coordinates are given. In this example, this will always be `world' because of the `interest' call above. `char *id;' A string specifying the name of the picked geom. `HPoint3 point; int pn;' `float *point; int pn;' `point' is an `HPoint3' structure giving the coordinates of the picked point. `HPoint3' is a homogeneous point coordinate representation equivalent to an array of 4 floats. `pn' tells how many coordinates have been written into this array; it will always be either `0', `4' or greater than `4'. If it is greater than `4', then the NDBODY instruction block is invoked and in this case `point' is a flat array of `pn' many `float's. A value of zero means no point was picked, i.e. the user clicked the right mouse button while the cursor was not pointing at a geom. In this case the ordinary BLOCK 3d instruction block is executed. `HPoint3 vertex; int vn;' `float *vertex; int vn;' `vertex' is an `HPoint3' structure giving the coordinates of the picked vertex, if the pick point was near a vertex. `vn' tells how many coordinates have been written into this array; it will always be either `0' or greater equal `4'. A value of zero means the pick point was not near a vertex. In the context of ND-viewing `vertex' will be an array of `vn' `float's and `vn' will be equal to `pn'. `HPoint3 edge[2]; int en;' `float *edge; int en;' `edge' is an array of two `HPoint3' structures giving the coordinates of the endpoints of the picked edge, if the pick point was near an edge. `en' tells how many coordinates have been written into this array; it will always be `0' or greater equal `8'. A value of zero means the pick point was not near an edge. In the context of ND-viewing `edge' will be a flat one-dimensional array of `en' many `float's: the first `pn' `float's define the first vertex, and the second `pn' many `float's define the second vertex; `en' will be two times `pn'. In this example module, the remaining variables will never be given values because their values in the `interest' statement were specified as `nil'. `HPoint3 face[]; int fn;' `float *face; int fn;' `face' is a variable length array of FN `HPoint3''s. `face' gives the coordinates of the vertices of the picked face. `fn' tells how many coordinates have been written into this array; it will always be either `0' or a multiple of `pn'. A value of zero means the pick point was not near a face. In the context of ND-viewing `face' is a flat one-dimensional array of `fn' many floats of which each vertex occupies `pn' many components. `int ppath[]; int ppn;' `ppath' is an array of MAXPATHLEN `int''s. `ppath' gives the path through the OOGL heirarchy to the picked primitive. `pn' tells how many integers have been written into this array; it will be at most MAXPATHLEN. A path of {3,1,2}, for example, means that the picked primitive is "subobject number 2 of subobject number 1 of object 3 in the world". `int vi;' `vi' gives the index of the picked vertex in the picked primitive, if the pick point was near a vertex. `int ei[2]; int ein' The `ei' array gives the indices of the endpoints of the picked edge, if the pick point was near a vertex. `ein' tells how many integers were written into this array. It will always be either 0 or 2; a value of 0 means the pick point was not near an edge. `int fi;' `fi' gives the index of the picked face in the picked primitive, if the pick point was near a face. The `handle_pick' procedure actually does the work of dealing with the pick event. It begins by normalizing the homogeneous coordinates passed in as arguments so that we can assume the fourth coordinate is 1. It then sends GCL commands to define the `pick' object to be whatever is appropriate for the kind of pick recieved. See *note OOGL File Formats::, and *note GCL::, for an explanation of the format of the data in these commands. The main program, at the bottom of the file, first calls `Initialize()'. Next, the call to `LakeDefine' defines the `Lake' that the lisp library will use. A `Lake' is a structure that the lisp library uses internally as a type of communiation vehicle. (It is like a unix stream but more general, hence the name.) This call to `LakeDefine' defines a `Lake' structure for doing I/O with `stdin' and `stdout'. The third argument to `LakeDefine' should be `NULL' for external modules (it is used by Geomview). Finally, the program enters its main loop which parses and evaluates expressions from standard input.  File: geomview, Node: Example4, Next: Module Installation, Prev: Example3, Up: Modules 6.6 Example 4: Simple Tcl/Tk Module Demonstrating Picking ========================================================= It's not necessary to write a Geomview module in C. The only requirement of an external module is that it send GCL commands to its standard output and expect responses (if any) on its standard input. An external module can be written in C, perl, tcl/tk, or pretty much anything. As an example, assuming you have Tcl/Tk version 4.0 or later, here's an external module with a simple GUI which demonstrates interaction with geomview. This manual doesn't discuss the Tcl/Tk language; see the good book on the subject by its originator John Ousterhout, published by Addison-Wesley, titled _Tcl and the Tk Toolkit_. The `#!' on the script's first line causes the system to interpret the script using the Tcl/Tk `wish' program; you might have to change its first line if that's in some location other than /usr/local/bin/wish4.0. Or, you could define it as a module using (emodule-define "Pick Demo" "wish pickdemo.tcl") in which case `wish' could be anywhere on the UNIX search path. #! /usr/local/bin/wish4.0 # We use "fileevent" below to have "readsomething" be called whenever # data is available from standard input, i.e. when geomview has sent us # something. It promises to include a trailing newline, so we can use # "gets" to read the geomview response, then parse its nested parentheses # into tcl-friendly {} braces. proc readsomething {} { if {[gets stdin line] < 0} { puts stderr "EOF on input, exiting..." exit } regsub -all {\(} $line "\{" line regsub -all {\)} $line "\}" line # Strip outermost set of braces set stuff [lindex $line 0] # Invoke handler for whichever command we got. Could add others here, # if we asked geomview for other kinds of data as well. switch [lindex $stuff 0] { pick {handlepick $stuff} rawevent {handlekey $stuff} } } # Fields of a "pick" response, from geomview manual: # (pick COORDSYS GEOMID G V E F P VI EI FI) # The pick command is executed internally in response to pick # events (right mouse double click). # # COORDSYS = coordinate system in which coordinates of the following # arguments are specified. This can be: # world: world coord sys # self: coord sys of the picked geom (GEOMID) # primitive: coord sys of the actual primitive within # the picked geom where the pick occurred. # GEOMID = id of picked geom # G = picked point (actual intersection of pick ray with object) # V = picked vertex, if any # E = picked edge, if any # F = picked face # P = path to picked primitive [0 or more] # VI = index of picked vertex in primitive # EI = list of indices of endpoints of picked edge, if any # FI = index of picked face # Report when user picked something. # proc handlepick {pick} { global nameof selvert seledge order set obj [lindex $pick 2] set xyzw [lindex $pick 3] set fv [lindex $pick 6] set vi [lindex $pick 8] set ei [lindex $pick 9] set fi [lindex $pick 10] # Report result, converting 4-component homogeneous point into 3-space point. set w [lindex $xyzw 3] set x [expr [lindex $xyzw 0]/$w] set y [expr [lindex $xyzw 1]/$w] set z [expr [lindex $xyzw 2]/$w] set s "$x $y $z " if {$vi >= 0} { set s "$s vertex #$vi" } if {$ei != {}} { set s "$s edge [lindex $ei 0]-[lindex $ei 1]" } if {$fi != -1} { set s "$s face #$fi ([expr [llength $fv]/3]-gon)" } msg $s } # Having asked for notification of these raw events, we report when # the user pressed these keys in the geomview graphics windows. proc handlekey {event} { global lastincr switch [lindex $event 1] { 32 {msg "Pressed space bar"} 8 {msg "Pressed backspace key"} } } # # Display a message on the control panel, and on the terminal where geomview # was started. We use ``puts stderr ...'' rather than simply ``puts ...'', # since Geomview interprets anything we send to standard output # as a GCL command! # proc msg {str} { global msgtext puts stderr $str set msgtext $str update } # Load object from file proc loadobject {fname} { if {$fname != ""} { puts "(geometry thing < $fname)" # Be sure to flush output to ensure geomview receives this now! flush stdout } } # Build simple "user interface" # The message area could be a simple label rather than an entry box, # but we want to be able to use X selection to copy text from it. # The default mouse bindings do that automatically. entry .msg -textvariable msgtext -width 45 pack .msg frame .f label .f.l -text "File to load:" pack .f.l -side left entry .f.ent -textvariable fname pack .f.ent -side left -expand true -fill x bind .f.ent { loadobject $fname } pack .f # End UI definition. # Call "readsomething" when data arrives from geomview. fileevent stdin readable {readsomething} # Geomview initialization puts { (interest (pick primitive)) (interest (rawevent 32)) # Be notified when user presses space (interest (rawevent 8)) # or backspace keys. (geometry thing < hdodec.off) (normalization world none) } # Flush to ensure geomview receives this. flush stdout wm title . {Sample external module} msg "Click right mouse in graphics window"  File: geomview, Node: Module Installation, Prev: Example4, Up: Modules 6.7 Module Installation ======================= This section tells how to install an external module so you can invoke it within Geomview. There are two ways to install a module: you can install a _private_ module so that the module is available to you whenever you run Geomview, or you can install a _system_ module so that the module is available to all users on your system whenever they run Geomview. * Menu: * Private Module Installation:: Per-user modules. * System Module Installation:: System-wide modules.  File: geomview, Node: Private Module Installation, Next: System Module Installation, Prev: Module Installation, Up: Module Installation 6.7.1 Private Module Installation --------------------------------- The `emodule-define' command arranges for a module to appear in Geomview's _Modules_ browser. The command takes two string arguments; the first is the name that will appear in the _Modules_ browser. The second is the shell command for running the module; it may include arguments (*note `(emodule-define ...)': emodule-define.). Geomview executes this command in a subshell when you click on the module's entry in the browser. For example (emodule-define "Foo" "/u/home/modules/foo -x") adds a line labeled "Foo" to the _Modules_ browser which causes the command "/u/home/modules/foo -x" to be executed when selected. You may put `emodule-define' commands in your `~/.geomview' file to arrange for certain modules to be available every time you run Geomview; *Note Customization::. You can also execute `emodule-define' commands from the _Commands_ panel to add a module to an already running copy of Geomview. There are several other GCL commands for controlling the entries in the _Modules_ browser; for details, *Note GCL::.  File: geomview, Node: System Module Installation, Prev: Private Module Installation, Up: Module Installation 6.7.2 System Module Installation -------------------------------- To install a module so that it is available to all Geomview users do the following 1. Create a file called `.geomview-MODULE' where `MODULE' is the name of the module. This file should contain a single line which is an `emodule-define' command for that module: (emodule-define "New Module" "newmodule") The first argument, `"New Module"' above, is the string that will appear in the _Modules_ browser. The second string, `"newmodule"' above, is the Bourne shell command for invoking the module. It may include arguments, and you may assume that the module is on the $PATH searched by the shell. 2. Put a copy of the `.geomview-MODULE' and the module executable itself in `/usr/local/libexec/geomview' directory. After these steps, the new module should appear, in alphabetical position, in the _Modules_ browser of Geomview's _Main_ panel next time Geomview is run. The reason this works is that when Geomview is invoked it processes all the `.geomview-*' files in its `modules' directory. It also remembers the pathname of this directory and prepends that path to the $PATH of the shell in which it invokes such a module.  File: geomview, Node: GCL, Next: Non-Euclidean Geometry, Prev: Modules, Up: Top 7 GCL: the Geomview Command Language ************************************ GCL has the syntax of lisp - i.e. an expression of the form (f a b ...) means pass the values of a, b, ... to the function f. GCL is very limited and is by no means an implementation of lisp. It is simply a language for expressing commands to be executed in the order given, rather than a programming language. It does not support variable or function definition. GCL is the language that Geomview understands for files that it loads as well as for communication with other programs. To execute a GCL command interactively, you can bring up the _Commands_ panel which lets you type in a command; Geomview executes the command when you hit the key. Output from such commands is printed to standard output. Alternately, you can invoke Geomview as `geomview -c -' which causes it to read GCL commands from standard input. GCL functions return a value, and you can nest function calls in ways which use this returned value. For example (f (g a b)) evaluates `(g a b)' and then evaluates `(f x)' where `x' is the result returned by `(g a b)'. Geomview maintains these return values internally but does not normally print them out. To print out a return value pass it to the `echo' function. For example the `geomview-version' function returns a string representing the version of Geomview that is running, and (echo (geomview-version)) prints out this string. Many functions simply return `t' for success or `nil' for failure; this is the case if the documentation for the function does not indicate otherwise. These are the lisp symbols for true and false, respectively. (They correspond to the C variables `Lt' and `Lnil' which you are likely to see if you look at the source code for Geomview or some of the external modules.) In the descriptions of the commands below several references are made to "OOGL" formats. OOGL is the data description language that Geomview uses for describing geometry, cameras, appearances, and other basic objects. For details of the OOGL formats, *Note OOGL File Formats::. (Or equivalently, see the oogl(5) manual page, distributed with Geomview in the file /share/man/man5/oogl.5gv. The GCL commands and argument types are listed below. Most of the documentation in this section of the manual is available within Geomview via the `?' and `??' commands. The command `(? COMMAND)' causes Geomview to print out a one-line summary of the syntax of COMMAND, and `(?? COMMAND)' prints out an explanation of what COMMAND does. You can include the wild-card character `*' in COMMAND to print information for a group of commands matching a pattern. For example, `(?? *emodule*)' will print all information about all commands containing the string `emodule'. `(? *)' will print a short list of all commands. * Menu: * Argument Conventions:: Conventions used in describing argument types. * GCL Reference:: Documentation for each GCL command.  File: geomview, Node: Argument Conventions, Next: GCL Reference, Prev: GCL, Up: GCL 7.1 Conventions Used In Describing Argument Types ================================================= The following symbols are used to describe argument types in the documentation for GCL functions. `APPEARANCE' is an OOGL appearance specification. `CAM-ID' is an ID that refers to a camera. `CAMERA' is an OOGL camera specification. `GEOM-ID' is an ID that refers to a geometry. `GEOMETRY' is an OOGL geometry specification. `ID' is a string which names a geometry or camera. Besides those you create, valid ones are: ``World, world, worldgeom, g0'' the collection of all geom's `target' selected target object (cam or geom) `center' selected center-of-motion object `targetcam' last selected target camera `targetgeom' last selected target geom `focus' camera where cursor is (or most recently was) `allgeoms' all geom objects `allcams' all cameras ``default, defaultcam, prototype'' future cameras inherit default's settings The following IDs are used to name coordinate systems, e.g. in `pick' and `write' commands: ``World, world, worldgeom, g0'' the world, within which all other geoms live. `universe' the universe, in which the World, lights and cameras live. Cameras' world2cam transforms might better be called universe2cam, etc. `self' "this Geomview object". Transform from an object to `self' is the identity; writing its geometry gives the object itself with no enclosing transform; picked points appear in the object's coordinates. `primitive' (for `pick' only) Picked points appear in the coordinate system of the lowest-level OOGL primitive. A name is also an acceptable id. Given names are made unique by appending numbers if necessary (i.e. `foo<2>'). Every geom is also named g[n] and every camera is also named c[n] (`g0' is always the worldgeom): this name is used as a prefix to keyboard commands and can also be used as a GCL id. Numbers are reused after an object is deleted. Both names are shown in the Object browser. `STATEMENT' represents a function call. Function calls have the form `(func arg1 arg2 ... )', where `func' is the name of the function and `arg1', `arg2', ... are the arguments. `TRANSFORM' is an OOGL 4x4 transformation matrix. `NTRANSFORM' is an OOGL (N+1)x(N+1) transformation matrix. `WINDOW' is an OOGL window specification.  File: geomview, Node: GCL Reference, Prev: Argument Conventions, Up: GCL 7.2 GCL Reference Guide ======================= * Menu: * shell-shortcut:: `(! SHELLCOMMAND)' * lt:: `(< EXPR1 EXPR2)' * eq:: `(= EXPR1 EXPR2)' * gt:: `(> EXPR1 EXPR2)' * mul:: `(* EXPR1 EXPR2)' * div:: `(/ EXPR1 EXPR2)' * add:: `(+ EXPR1 EXPR2)' * sub:: `(- EXPR1 EXOR2)' * help-shortcut:: `(? COMMAND)' * morehelp-shortcut:: `(?? COMMAND)' * emodule-run-shortcut:: `(| NAME)' * all:: `(all geometry|camera|emodule)' * and:: `(and EXPR1 EXPR2)' * ap-override:: `(ap-override [on|off])' * backcolor:: `(backcolor CAM-ID R G B)' * background-image:: `(background-image CAM-ID [FILENAME])' * bbox-color:: `(bbox-color GEOM-ID R G B)' * bbox-draw:: `(bbox-draw GEOM-ID [yes|no])' * camera:: `(camera CAM-ID [CAMERA])' * camera-draw:: `(camera-draw CAM-ID [yes|no])' * camera-prop:: `(camera-prop { geometry object } [projective])' * camera-reset:: `(camera-reset CAM-ID)' * car:: `(car LIST)' * cdr:: `(cdr LIST)' * clock:: `(clock)' * command:: `(command INFILE [OUTFILE])' * cons:: `(cons EXPR LIST)' * copy:: `(copy [ID] [name])' * cursor-still:: `(cursor-still [INT])' * cursor-twitch:: `(cursor-twitch [INT])' * defun:: `(defun NAME ARGS [DOC] BODY)' * delete:: `(delete ID)' * dice:: `(dice GEOM-ID N)' * dimension:: `(dimension [N])' * dither:: `(dither CAM-ID {on|off|toggle})' * draw:: `(draw CAM-ID)' * dump-handles:: `(dump-handles)' * echo:: `(echo ...)' * emodule-clear:: `(emodule-clear)' * emodule-define:: `(emodule-define NAME SHELL-COMMAND ...)' * emodule-defined:: `(emodule-defined `modulename')' * emodule-isrunning:: `(emodule-isrunning NAME)' * emodule-path:: `(emodule-path)' * emodule-run:: `(| NAME)' * emodule-sort:: `(emodule-sort)' * emodule-start:: `(emodule-start NAME)' * emodule-transmit:: `(emodule-transmit NAME LIST)' * escale:: `(escale GEOM-ID FACTOR)' * eval:: `(eval EXPR)' * event-keys:: `(event-keys {on|off})' * event-mode:: `(event-mode MODESTRING)' * event-pick:: `(event-pick {on|off})' * evert:: `(evert GEOM-ID [yes|no])' * exit:: `(exit)' * ezoom:: `(ezoom GEOM-ID FACTOR)' * freeze:: `(freeze CAM-ID)' * geometry:: `(geometry GEOM-ID [GEOMETRY])' * geomview-version:: `(geomview-version)' * hdefine:: `(hdefine geometry|camera|... NAME VALUE)' * hdelete:: `(hdelete [geometry|camera|...] name)' * help:: `(? COMMAND)' * hmodel:: `(hmodel CAMID {virtual|projective|conformal})' * hsphere-draw:: `(hsphere-draw CAMID [yes|no])' * if:: `(if TEST EXPR1 [EXPR2])' * inhibit-warning:: `(inhibit-warning STRING)' * input-translator:: `(input-translator "#pfx" "sh-command")' * interest:: `(interest (COMMAND [args]))' * lambda:: `(lambda ARGS BODY)' * let:: `(let (ARGS) BODY)' * lines-closer:: `(lines-closer CAM-ID DIST)' * load:: `(load filename [command|geometry|camera])' * load-path:: `(load-path)' * look:: `(look [objectID] [camID])' * look-encompass:: `(look-encompass [objID] [camID])' * look-encompass-size:: `(look-encompass-size [view clip near far])' * look-recenter:: `(look-recenter [objID] [camID])' * look-toward:: `(look-toward [objID] [camID] [origin|center])' * merge:: `(merge {window|camera} CAM-ID { WIN or CAM ... })' * merge-ap:: `(merge-ap GEOM-ID APPEARANCE)' * merge-base-ap:: `(merge-base-ap APPEARANCE)' * merge-baseap:: `(merge-baseap APPEARANCE)' * mod:: `(mod NUMERATOR DENOMINATOR)' * morehelp:: `(?? COMMAND)' * name-object:: `(name-object ID NAME)' * ND-axes:: `(ND-axes CAMID [CLUSTER [Xidx Yidx Zidx [Widx]]])' * ND-color:: `(ND-color CAMID ...' * ND-xform:: `(ND-xform OBJID [ntransform { ... }])' * ND-xform-get:: `(ND-xform-get ID [from-ID])' * ND-xform-set:: `(ND-xform-set OBJID [ntransform { ... }])' * new-alien:: `(new-alien name [GEOMETRY])' * new-camera:: `(new-camera name [CAMERA])' * new-center:: `(new-center [id])' * new-geometry:: `(new-geometry name [GEOMETRY])' * new-reset:: `(new-reset)' * NeXT:: `(NeXT)' * normalization:: `(normalization GEOM-ID {each|none|all|keep})' * not:: `(not EXPR)' * or:: `(or EXPR1 EXPR2)' * pick:: `(pick COORDSYS GEOMID G V E F P VI EI FI)' * pick-invisible:: `(pick-invisible [yes|no])' * pickable:: `(pickable GEOM-ID {yes|no})' * position:: `(position objectID otherID)' * position-at:: `(position-at objectID otherID [center | origin])' * position-toward:: `(position-toward objID othID [center|origin])' * process-events:: `(process-events)' * progn:: `(progn STATEMENT [ ... ])' * quit:: `(quit)' * quote:: `(quote EXPR)' * rawevent:: `(rawevent dev val x y t)' * rawpick:: `(rawpick CAMID X Y)' * read:: `(read geometry|camera|... {GEOM or CAM or ...})' * real-id:: `(real-id ID)' * redraw:: `(redraw CAM-ID)' * regtable:: `(regtable)' * rehash-emodule-path:: `(rehash-emodule-path)' * replace-geometry:: `(replace-geometry GEOM-ID PART GEOMETRY)' * rib-display:: `(rib-display [frame|tiff] FILEPREFIX)' * rib-snapshot:: `(rib-snapshot CAM-ID [filename])' * scale:: `(scale GEOM-ID FACTOR [FACTORY FACTORZ])' * scene:: `(scene CAM-ID [GEOMETRY])' * set-clock:: `(set-clock TIME)' * set-conformal-refine:: `(set-conformal-refine CMX [N [EDGES]])' * set-emodule-path:: `(set-emodule-path (PATH1 ... PATHN))' * set-load-path:: `(set-load-path (PATH1 ... PATHN))' * set-motionscale:: `(set-motionscale X)' * setenv:: `(setenv name string)' * setq:: `(setq SYM EXPR)' * sgi:: `(sgi)' * shell:: `(! SHELLCOMMAND)' * sleep-for:: `(sleep-for TIME)' * sleep-until:: `(sleep-until TIME)' * snapshot:: `(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])' * soft-shader:: `(soft-shader CAM-ID {on|off|toggle})' * space:: `(space {euclidean|hyperbolic|spherical})' * stereowin:: `(stereowin CAM-ID [no|horizontal|...] [gap])' * time-interests:: `(time-interests delta initial prefix [suffix])' * transform:: `(transform objectID centerID frameID [rotate|...] ...)' * transform-incr:: `(transform-incr objectID centerID frameID ...)' * transform-set:: `(transform-set objectID centerID frameID ...)' * truncate:: `(truncate NUMBER)' * ui-cam-focus:: `(ui-cam-focus {focus-change|mouse-cross})' * ui-center:: `(ui-center ID)' * ui-center-origin:: `(ui-center-origin {origin|bbox-center})' * ui-emotion-program:: `(ui-emotion-program PROGRAM)' * ui-emotion-run:: `(ui-emotion-run EMODULE)' * ui-freeze:: `(ui-freeze {on|off})' * ui-html-browser:: `(ui-html-browser BROWSER)' * ui-motion:: `(ui-motion {inertia|...} {on|off})' * ui-panel:: `(ui-panel PANELNAME {on|off} [WINDOW])' * ui-pdf-viewer:: `(ui-pdf-viewer VIEWER)' * ui-target:: `(ui-target ID [yes|no])' * uninterest:: `(uninterest (COMMAND [args]))' * update:: `(update [timestep_in_seconds])' * update-draw:: `(update-draw CAM-ID [timestep_in_seconds])' * while:: `(while TEST BODY)' * window:: `(window CAM-ID WINDOW)' * winenter:: `(winenter CAM-ID)' * write:: `(write command|geometry|... FILENAME ...)' * write-comments:: `(write-comments FILENAME GEOMID PICKPATH)' * write-handle:: `(write-handle PREFIX FILENAME HANDLE)' * write-sexpr:: `(write-sexpr FILENAME LISPOBJECT)' * xform:: `(xform ID TRANSFORM)' * xform-incr:: `(xform-incr ID TRANSFORM)' * xform-set:: `(xform-set ID TRANSFORM)' * zoom:: `(zoom CAM-ID FACTOR)'  File: geomview, Node: shell-shortcut, Next: lt, Prev: GCL Reference, Up: GCL Reference 7.2.1 ! ------- `!' is a synonym for `shell'. *Note shell::.  File: geomview, Node: lt, Next: eq, Prev: shell-shortcut, Up: GCL Reference 7.2.2 < ------- `(< EXPR1 EXPR2)' Returns t if EXPR1 is less than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.  File: geomview, Node: eq, Next: gt, Prev: lt, Up: GCL Reference 7.2.3 = ------- `(= EXPR1 EXPR2)' Returns t if EXPR1 is equal to EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.  File: geomview, Node: gt, Next: mul, Prev: eq, Up: GCL Reference 7.2.4 > ------- `(> EXPR1 EXPR2)' Returns t if EXPR1 is greater than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.  File: geomview, Node: mul, Next: div, Prev: gt, Up: GCL Reference 7.2.5 * ------- `(* EXPR1 EXPR2)' Multiplies EXPR1 and EXPR2 and returns the result.  File: geomview, Node: div, Next: add, Prev: mul, Up: GCL Reference 7.2.6 / ------- `(/ EXPR1 EXPR2)' Divides EXPR1 by EXPR2 and returns the result.  File: geomview, Node: add, Next: sub, Prev: div, Up: GCL Reference 7.2.7 + ------- `(+ EXPR1 EXPR2)' Adds EXPR1 and EXPR2 and returns the result.  File: geomview, Node: sub, Next: help-shortcut, Prev: add, Up: GCL Reference 7.2.8 - ------- `(- EXPR1 EXPR2)' Substracts EXPR2 from EXPR1 and returns the result.  File: geomview, Node: help-shortcut, Next: morehelp-shortcut, Prev: sub, Up: GCL Reference 7.2.9 ? ------- `(? [command])' Gives one-line usage summary for `command'. Command may include `*'s as wildcards; see also *note `(?? ...)': morehelp. One-line command help; lists names only if multiple commands match. `?' is a synonym for *note `(help ...)': help.  File: geomview, Node: morehelp-shortcut, Next: emodule-run-shortcut, Prev: help-shortcut, Up: GCL Reference 7.2.10 ?? --------- `(?? command)' `command' may include `*' wildcards. Prints more info than `(? command)'. `??' is a synonym for *note `morehelp': morehelp.  File: geomview, Node: emodule-run-shortcut, Next: all, Prev: morehelp-shortcut, Up: GCL Reference 7.2.11 | -------- `|' `|' is a synonym for `emodule-run'.  File: geomview, Node: all, Next: and, Prev: emodule-run-shortcut, Up: GCL Reference 7.2.12 all ---------- `(all geometry)' returns a list of names of all geometry objects. Use e.g. `(echo (all geometry))' to print such a list. `(all camera)' returns a list of names of all cameras. `(all emodule defined)' returns a list of all defined external modules. `(all emodule running)' returns a list of all running external modules.  File: geomview, Node: and, Next: ap-override, Prev: all, Up: GCL Reference 7.2.13 and ---------- `(and EXPR1 EXPR2)' Evaluate `EXPR1' and `EXPR2' and return `t' if both return non-`nil', otherwise return `nil'.  File: geomview, Node: ap-override, Next: backcolor, Prev: and, Up: GCL Reference 7.2.14 ap-override ------------------ `(ap-override [on|off])' Selects whether appearance controls should override objects' own settings. On by default. With no arguments, returns current setting.  File: geomview, Node: backcolor, Next: background-image, Prev: ap-override, Up: GCL Reference 7.2.15 backcolor ---------------- `(backcolor CAM-ID R G B)' Set the background color of CAM-ID; R G B are numbers between 0 and 1.  File: geomview, Node: background-image, Next: bbox-color, Prev: backcolor, Up: GCL Reference 7.2.16 background-image ----------------------- `(background-image CAM-ID [FILENAME])' Use the given image as the background of camera CAM-ID (which must be a real camera, not `default' or `allcams'). Centers the image on the window area. Works only with GL and OpenGL graphics. Use "" for filename to remove background. With no filename argument, returns name of that window's current background image, or "". Any file type acceptable as a texture is allowed, e.g. .ppm.gz, .sgi, etc.  File: geomview, Node: bbox-color, Next: bbox-draw, Prev: background-image, Up: GCL Reference 7.2.17 bbox-color ----------------- `(bbox-color GEOM-ID R G B)' Set the bounding-box color of GEOM-ID; R G B are numbers between 0 and 1.  File: geomview, Node: bbox-draw, Next: camera, Prev: bbox-color, Up: GCL Reference 7.2.18 bbox-draw ---------------- `(bbox-draw GEOM-ID [yes|no])' Say whether GEOM-ID's bounding-box should be drawn; defaults to `yes' if second argument is omitted.  File: geomview, Node: camera, Next: camera-draw, Prev: bbox-draw, Up: GCL Reference 7.2.19 camera ------------- `(camera CAM-ID [CAMERA])' Specify data for CAM-ID; CAMERA is a string giving an OOGL camera specification. If no camera CAM-ID exists, it is created; in this case, the second argument is optional, and if omitted, a default camera is used. *Note `(new-camera ...)': new-camera.  File: geomview, Node: camera-draw, Next: camera-prop, Prev: camera, Up: GCL Reference 7.2.20 camera-draw ------------------ `(camera-draw CAM-ID [yes|no])' Say whether or not cameras should be drawn in CAM-ID; `yes' if omitted.  File: geomview, Node: camera-prop, Next: camera-reset, Prev: camera-draw, Up: GCL Reference 7.2.21 camera-prop ------------------ `(camera-prop { geometry object } [projective])' Specify the object to be shown when drawing other cameras. By default, this object is drawn with its origin at the camera, and with the camera looking toward the object's -Z axis. With the `projective' keyword, the camera's viewing projection is also applied to the object; this places the object's Z=-1 and Z=+1 at near and far clipping planes, with the viewing area -1<={X,Y}<=+1. Example: (camera-prop { < cube } projective)  File: geomview, Node: camera-reset, Next: car, Prev: camera-prop, Up: GCL Reference 7.2.22 camera-reset ------------------- `(camera-reset CAM-ID)' Reset CAM-ID to its default value.  File: geomview, Node: car, Next: cdr, Prev: camera-reset, Up: GCL Reference 7.2.23 car ---------- `(car LIST)' returns the first element of LIST.  File: geomview, Node: cdr, Next: clock, Prev: car, Up: GCL Reference 7.2.24 cdr ---------- `(cdr LIST)' returns the list obtained by removing the first element of LIST.  File: geomview, Node: clock, Next: command, Prev: cdr, Up: GCL Reference 7.2.25 clock ------------ `(clock)' Returns the current time, in seconds, as shown by this stream's clock. *Note `(set-clock ...)': set-clock. *Note `(sleep-until ...)': sleep-until.  File: geomview, Node: command, Next: cons, Prev: clock, Up: GCL Reference 7.2.26 command -------------- `(command INFILE [OUTFILE])' Read commands from INFILE; send corresponding responses (e.g. anything written to filename `-') to OUTFILE, stdout by default.  File: geomview, Node: cons, Next: copy, Prev: command, Up: GCL Reference 7.2.27 cons ----------- `(cons EXPR LIST)' Returns the list obtained by adding EXPR as first element of LIST. Note that the second argument has to be a list.  File: geomview, Node: copy, Next: cursor-still, Prev: cons, Up: GCL Reference 7.2.28 copy ----------- `(copy [ID] [name])' Copies an object or camera. If ID is not specified, it is assumed to be targetgeom. If name is not specified, it is assumed to be the same as the name of ID.  File: geomview, Node: cursor-still, Next: cursor-twitch, Prev: copy, Up: GCL Reference 7.2.29 cursor-still ------------------- `(cursor-still [INT])' Sets the number of microseconds for which the cursor must not move to register as holding still. If INT is not specified, the value will be reset to the default.  File: geomview, Node: cursor-twitch, Next: defun, Prev: cursor-still, Up: GCL Reference 7.2.30 cursor-twitch -------------------- `(cursor-twitch [INT])' Sets the distance which the cursor must not move (in x or y) to register as holding still. If INT is not specified, the value will be reset to the default.  File: geomview, Node: defun, Next: delete, Prev: cursor-twitch, Up: GCL Reference 7.2.31 defun ------------ `(defun NAME (ARG1 ...) [DOCSTRING] EXPR1 ...)' Define a named lambda-expression, that is: define NAME to evaluate to the lambda-expression `(lambda (ARG1 ...) (EXPR1 ...))' when called as a function. Also, install DOCSTRING as response to the commands `(help NAME)' and `(morehelp NAME)'. Note that DOCSTRING need not contain the command-synopsis, it is generated automatically. EXPR1 cannot be a string if `DOCSTRING' is omitted; it would be interpreted as the doc-string. The return value of `(defun ...)' is the function name. Functions can be recursive and self-modifying. It is possible to redefine builtin-functions, in this case the old definition is still available under the name `-builtin-OLDNAME-'. Argument values may be altered by `setq'; the new binding is discarded after evaluation of the surrounding `defun'-body. The special keywords `&optional' and `&rest' have the same meaning as for anonymous lambda-expression, see there. *Note `(lambda ...)': lambda. *Note `(setq ...)': setq. *Note `(let ...)': let.  File: geomview, Node: delete, Next: dice, Prev: defun, Up: GCL Reference 7.2.32 delete ------------- `(delete ID)' Delete object or camera ID.  File: geomview, Node: dice, Next: dimension, Prev: delete, Up: GCL Reference 7.2.33 dice ----------- `(dice GEOM-ID N)' Dice any Bezier patches within GEOM-ID into NxN meshes; default 10. See also the appearance attribute *note `patchdice': Appearances, which makes this command obsolete.  File: geomview, Node: dimension, Next: dither, Prev: dice, Up: GCL Reference 7.2.34 dimension ---------------- `(dimension [N])' Sets or reads the space dimension for N-dimensional viewing. (Since calculations are done using homogeneous coordinates, this means matrices are (N+1)x(N+1).) With no arguments, returns the current dimension, or 0 if N-dimensional viewing has not been enabled.  File: geomview, Node: dither, Next: draw, Prev: dimension, Up: GCL Reference 7.2.35 dither ------------- `(dither CAM-ID {on|off|toggle})' Turn dithering on or off in that camera.  File: geomview, Node: draw, Next: dump-handles, Prev: dither, Up: GCL Reference 7.2.36 draw ----------- `(draw CAM-ID)' Draw the view in CAM-ID, if it needs redrawing. *Note `(redraw ...)': redraw.  File: geomview, Node: dump-handles, Next: echo, Prev: draw, Up: GCL Reference 7.2.37 dump-handles ------------------- `(dump-handles)' Dump the list of currently active handles to stdout. This function is intended for internal debugging use only.  File: geomview, Node: echo, Next: emodule-clear, Prev: dump-handles, Up: GCL Reference 7.2.38 echo ----------- `(echo ...)' Write the given data to the special file `-'. Strings are written literally; lisp expressions are evaluated and their values written. If received from an external program, `echo' sends to the program's input. Otherwise writes to geomview's own standard output (typically the terminal).  File: geomview, Node: emodule-clear, Next: emodule-define, Prev: echo, Up: GCL Reference 7.2.39 emodule-clear -------------------- `(emodule-clear)' Clears the geomview application (external module) browser.  File: geomview, Node: emodule-define, Next: emodule-defined, Prev: emodule-clear, Up: GCL Reference 7.2.40 emodule-define --------------------- `(emodule-define NAME SHELL-COMMAND ...)' Define an external module called NAME, which then appears in the external-module browser. The SHELL-COMMAND string is a UNIX shell command which invokes the module. See *note `(emodule-run ...)': emodule-run. for discussion of external modules.  File: geomview, Node: emodule-defined, Next: emodule-isrunning, Prev: emodule-define, Up: GCL Reference 7.2.41 emodule-defined ---------------------- `(emodule-defined `modulename')' If the given external-module name is known, returns the name of the program invoked when it's run as a quoted string; otherwise returns nil. `(echo (emodule-defined `name'))' prints the string.  File: geomview, Node: emodule-isrunning, Next: emodule-path, Prev: emodule-defined, Up: GCL Reference 7.2.42 emodule-isrunning ------------------------ `(emodule-isrunning NAME)' Returns Lt if the emodule NAME is running, or Lnil if it is not running. NAME is searched for in the names as they appear in the browser and in the shell commands used to execute the external modules (not including arguments).  File: geomview, Node: emodule-path, Next: emodule-run, Prev: emodule-isrunning, Up: GCL Reference 7.2.43 emodule-path ------------------- `(emodule-path)' Returns the current search path for external modules. Note: to actually see the value returned by this function you should wrap it in a call to echo: `(echo (emodule-path))'. *Note `(set-emodule-path ...)': set-emodule-path.  File: geomview, Node: emodule-run, Next: emodule-sort, Prev: emodule-path, Up: GCL Reference 7.2.44 emodule-run ------------------ `(emodule-run SHELL-COMMAND ARGS...)' Runs the given SHELL-COMMAND (a string containing a UNIX shell command) as an external module. The module's standard output is taken as geomview commands; responses (written to filename `-') are sent to the module's standard input. The shell command is interpreted by /bin/sh, so e.g. I/O redirection may be used; a program which prompts the user for input from the terminal could be run with: (emodule-run yourprogram <&2) If not already set, the environment variable $MACHTYPE is set to the name of the machine type. Input and output connections to geomview are dropped when the shell command terminates. Clicking on a running program's module-browser entry sends the signal SIGHUP to the program. For this to work, programs should avoid running in the background; those using FORMS or GL should call foreground() before the first FORMS or winopen() call. *Note `(emodule-define ...)': emodule-define. *Note `(emodule-start ...)': emodule-start.  File: geomview, Node: emodule-sort, Next: emodule-start, Prev: emodule-run, Up: GCL Reference 7.2.45 emodule-sort ------------------- `(emodule-sort)' Sorts the modules in the application browser alphabetically.  File: geomview, Node: emodule-start, Next: emodule-transmit, Prev: emodule-sort, Up: GCL Reference 7.2.46 emodule-start -------------------- `(emodule-start NAME)' Starts the external module NAME, defined by emodule-define. Equivalent to clicking on the corresponding module-browser entry.  File: geomview, Node: emodule-transmit, Next: escale, Prev: emodule-start, Up: GCL Reference 7.2.47 emodule-transmit ----------------------- `(emodule-transmit NAME LIST)' Places LIST into external module NAME's standard input. NAME is searched for in the names of the modules as they appear in the External Modules browser and then in the shell commands used to execute the external modules. Does nothing if the module NAME is not running.  File: geomview, Node: escale, Next: eval, Prev: emodule-transmit, Up: GCL Reference 7.2.48 escale ------------- `(escale GEOM-ID FACTOR)' Same as scale but multiplies by exp(scale). Obsolete.  File: geomview, Node: eval, Next: event-keys, Prev: escale, Up: GCL Reference 7.2.49 eval ----------- `(eval EXPR)' Evaluate a lisp expression. If EXPR is an unevaluated S-expression as returned by the `(quote ...)' command then the effect will be as if calling the un-quoted expression directly. It is also possible to evaluate S-expression constructed via `car', `cdr' and `cons'. *Note `(car ...)': car. *Note `(cdr ...)': cdr. *Note `(cons ...)': cons.  File: geomview, Node: event-keys, Next: event-mode, Prev: eval, Up: GCL Reference 7.2.50 event-keys ----------------- `(event-keys {on|off})' Turn keyboard events on or off to enable/disable keyboard shortcuts.  File: geomview, Node: event-mode, Next: event-pick, Prev: event-keys, Up: GCL Reference 7.2.51 event-mode ----------------- `(event-mode MODESTRING)' Set the mouse event (motion) mode; MODESTRING should be one of the following strings: 1. `"[r] Rotate"' 2. `"[t] Translate"' 3. `"[z] Cam Zoom"' 4. `"[s] Geom Scale"' 5. `"[f] Cam Fly"' 6. `"[o] Cam Orbit"' 7. `"[le] Edit Lights"'  File: geomview, Node: event-pick, Next: evert, Prev: event-mode, Up: GCL Reference 7.2.52 event-pick ----------------- `(event-pick {on|off})' Turn picking on or off.  File: geomview, Node: evert, Next: exit, Prev: event-pick, Up: GCL Reference 7.2.53 evert ------------ `(evert GEOM-ID [yes|no])' Set the normal eversion state of GEOM-ID. If the second argument is omitted, toggle the eversion state.  File: geomview, Node: exit, Next: ezoom, Prev: evert, Up: GCL Reference 7.2.54 exit ----------- `(exit)' Terminates geomview.  File: geomview, Node: ezoom, Next: freeze, Prev: exit, Up: GCL Reference 7.2.55 ezoom ------------ `(ezoom GEOM-ID FACTOR)' Same as zoom but multiplies by exp(zoom). Obsolete.  File: geomview, Node: freeze, Next: geometry, Prev: ezoom, Up: GCL Reference 7.2.56 freeze ------------- `(freeze CAM-ID)' Freeze CAM-ID; drawing in this camera's window is turned off until it is explicitly redrawn with `(redraw CAM-ID)', after which time drawing resumes as normal.  File: geomview, Node: geometry, Next: geomview-version, Prev: freeze, Up: GCL Reference 7.2.57 geometry --------------- `(geometry GEOM-ID [GEOMETRY])' Specify the geometry for GEOM-ID. GEOMETRY is a string giving an OOGL geometry specification. If no object called GEOM-ID exists, it is created; in this case the GEOMETRY argument is optional, and if omitted, the new object GEOM-ID is given an empty geometry.  File: geomview, Node: geomview-version, Next: hdefine, Prev: geometry, Up: GCL Reference 7.2.58 geomview-version ----------------------- `(geomview-version)' Returns a string representing the version of geomview that is running.  File: geomview, Node: hdefine, Next: hdelete, Prev: geomview-version, Up: GCL Reference 7.2.59 hdefine -------------- `(hdefine `geometry'|`camera'|`window'|`appearance'|`image'|`transform'|`ntransform' name value)' Sets the value of a handle of a given type. (hdefine ) is generally equivalent to (read { define }) except that the assignment is done when hdefine is executed, (possibly not at all if inside a conditional statement), while the `read ... define' performs assignment as soon as the text is read. *Note References::. *Note `(read ...)': read. *Note `(hdelete ...)': hdelete.  File: geomview, Node: hdelete, Next: help, Prev: hdefine, Up: GCL Reference 7.2.60 hdelete -------------- `(hdelete [`geometry'|`camera'|`window'|`appearance'|`image'|`transform'|`ntransform'] name)' Deletes the given handle. Note that the handle will not actually be deleted in case there are still other objects referring to the handle, but once those objects are gone, the handle will also automatically go away. The object the handle referes to (if any) will only be deleted if there are no other references to that object. If the optional first argument is omitted, then the first handle matching NAME will be deleted, regardless of the type of the object it is attached to. It is not an error to call this function with a non-existent handle, but it is an error to call this funcion with the name of a non-global handle, i.e. one that was not created by `(hdefine ...)' or `(read ... { define ...})'. *Note References::. *Note `(read ...)': read. *Note `(hdefine ...)': hdefine.  File: geomview, Node: help, Next: hmodel, Prev: hdelete, Up: GCL Reference 7.2.61 help ----------- `(help [command])' Command may include `*'s as wildcards; see also *note `(?? ...)': help. One-line command help; lists names only if multiple commands match.  File: geomview, Node: hmodel, Next: hsphere-draw, Prev: help, Up: GCL Reference 7.2.62 hmodel ------------- `(hmodel CAMID {virtual|projective|conformal})' Set the model used to display geometry in this camera. *Note `(space ...)': space.  File: geomview, Node: hsphere-draw, Next: if, Prev: hmodel, Up: GCL Reference 7.2.63 hsphere-draw ------------------- `(hsphere-draw CAMID [yes|no])' Say whether to draw a unit sphere: the sphere at infinity in hyperbolic space, and a reference sphere in Euclidean and spherical spaces. If the second argument is omitted, `yes' is assumed.  File: geomview, Node: if, Next: inhibit-warning, Prev: hsphere-draw, Up: GCL Reference 7.2.64 if --------- `(if TEST EXPR1 [EXPR2])' Evaluates TEST; if TEST returns a non-nil value, returns the value of EXPR1. If TEST returns nil, returns the value of EXPR2 if EXPR2 is present, otherwise returns nil.  File: geomview, Node: inhibit-warning, Next: input-translator, Prev: if, Up: GCL Reference 7.2.65 inhibit-warning ---------------------- `(inhibit-warning STRING)' Inhibit warning inhbits geomview from displaying a particular warning message determined by STRING. At present there are no warning messages that this applies to, so this command is rather useless.  File: geomview, Node: input-translator, Next: interest, Prev: inhibit-warning, Up: GCL Reference 7.2.66 input-translator ----------------------- `(input-translator "#prefix_string" "Bourne-shell-command")' Defines an external translation program for special input types. When asked to read a file which begins with the specified string, geomview invokes that program with standard input coming from the given file. The program is expected to emit OOGL geometric data to its standard output. In this implementation, only prefixes beginning with # are recognized. Useful as in (input-translator "#VRML" "vrml2oogl")  File: geomview, Node: interest, Next: lambda, Prev: input-translator, Up: GCL Reference 7.2.67 interest --------------- `(interest (COMMAND [args]))' Allows you to express interest in a command. When geomview executes that command in the future it will echo it to the communication pool from which the interest command came. COMMAND can be any command. Args specify restrictions on the values of the arguments; if args are present in the interest command, geomview will only echo calls to the command in which the arguments match those given in the interest command. Two special argument values may appear in the argument list. `*' matches any value. `nil' matches any value but supresses the reporting of that value; its value is reported as `nil'. The purpose of the interest command is to allow external modules to find out about things happening inside geomview. For example, a module interested in knowing when a geom called `foo' is deleted could say `(interest (delete foo))' and would receive the string `(delete foo)' when foo is deleted. Picking is a special case of this. For most modules interested in pick events the command `(interest (pick world))' is sufficient. This causes geomview to send a string of the form `(pick world ...)' every time a pick event (right mouse double click). See the *note `(pick ...)': pick. command for details.  File: geomview, Node: lambda, Next: let, Prev: interest, Up: GCL Reference 7.2.68 lambda ------------- `(lambda (ARG1 ...) EXPR1 ... EXPRN)' A lambda expression is like a function. To "call" a lambda expression, it has to be evoked like a function: `((lambda (arg) (+ 1 arg)) 2)'. In this example, the value of the entire expression would be 3. In general, the value of the call will be the value of EXPRN. The first list serves to define formal parameters. The lambda expression itself is just a list, starting with the key-word lambda, followed by several quoted lists. *Note `(defun ...)': defun. *Note `(setq ...)': setq. *Note `(let ...)': let. Note the argument list may contain the special keywords `&optional' giving values to the following identifiers is optional, their default value will be `nil' `&rest' all excess arguments will be collected in a list, and that list will be assigned to the following argument, like so: ((lambda (&rest rest) (echo rest)) a b c d) The output would be `(a b c d)'.  File: geomview, Node: let, Next: lines-closer, Prev: lambda, Up: GCL Reference 7.2.69 let ---------- `(let ARGUMENTS EXPR1 ... EXPRN)' Generate a lambda expression from EXRP1 ... EXPRN, with the argument bindings described by ARGUMENTS. ARGUMENTS is a list of symbols (bound to `nil' by default) or lists of the form `(ARG VALUE)' where ARG is a symbol and not evaluated and VALUE is an S-expression which is first evaluated, then its value is bound to ARG. The entire expression evaluates to the value of EXPRN, the last expression in the body of the statement. The argument list must be present, but can be empty; in the latter case the `(let () ...)' statement is equivalent to a `(progn ...)'. *Note `(lambda ...)': lambda. *Note `(defun ...)': defun. *Note `(setq ...)': setq.  File: geomview, Node: lines-closer, Next: load, Prev: let, Up: GCL Reference 7.2.70 lines-closer ------------------- `(lines-closer CAM-ID DIST)' Draw lines (including edges) closer to the camera than polygons by DIST / 10^5 of the Z-buffer range. DIST = 3.0 by default. If DIST is too small, a line lying on a surface may be dotted or invisible, depending on the viewpoint. If DIST is too large, lines may appear in front of surfaces that they actually lie behind. Good values for DIST vary with the scene, viewpoint, and distance between near and far clipping planes. This feature is a kludge, but can be helpful.  File: geomview, Node: load, Next: load-path, Prev: lines-closer, Up: GCL Reference 7.2.71 load ----------- `(load filename [command|geometry|camera])' Loads the given file into geomview. The optional second argument specifies the type of data it contains, which may be `command' (geomview commands), `geometry' (OOGL geometric data), or `camera' (OOGL camera definition). If omitted, attempts to guess about the file's contents. Loading geometric data creates a new visible object; loading a camera opens a new window; loading a command file executes those commands.  File: geomview, Node: load-path, Next: look, Prev: load, Up: GCL Reference 7.2.72 load-path ---------------- `(load-path)' Returns the current search path for command, geometry, files, etc. Note: to actually see the value returned by this function you should wrap it in a call to echo: `(echo (load-path))'. *Note `(set-load-path ...)': set-load-path.  File: geomview, Node: look, Next: look-encompass, Prev: load-path, Up: GCL Reference 7.2.73 look ----------- `(look [objectID] [cameraID])' Rotates the named camera to point toward the center of the bounding box of the named object (or the origin in hyperbolic or spherical space). In Euclidean space, moves the camera forward or backward until the object appears as large as possible while still being entirely visible. Equivalent to progn ( (look-toward [objectID] [cameraID] {center | origin}) [(look-encompass [objectID] [cameraID])] ) If objectID is not specified, it is assumed to be World. If cameraID is not specified, it is assumed to be targetcam.  File: geomview, Node: look-encompass, Next: look-encompass-size, Prev: look, Up: GCL Reference 7.2.74 look-encompass --------------------- `(look-encompass [objectID] [cameraID])' Moves cameraID backwards or forwards until its field of view surrounds objectID. This routine works only in Euclidean space. If objectID is not specified, it is assumed to be the world. If cameraID is not specified, it is assumed to be the targetcam. *Note `(look-encompass-size ...)': look-encompass-size.  File: geomview, Node: look-encompass-size, Next: look-recenter, Prev: look-encompass, Up: GCL Reference 7.2.75 look-encompass-size -------------------------- `(look-encompass-size [view-fraction clip-ratio near-margin far-margin])' Sets/returns parameters used by (look-encompass). view-fraction is the portion of the camera window filled by the object, clip-ratio is the max allowed ratio of near-to-far clipping planes. The near clipping plane is 1/near-margin times closer than the near edge of the object, and the far clipping plane is far-margin times further away. Returns the list of current values. Defaults: .75 100 0.1 4.0  File: geomview, Node: look-recenter, Next: look-toward, Prev: look-encompass-size, Up: GCL Reference 7.2.76 look-recenter -------------------- `(look-recenter [objectID] [cameraID])' Translates and rotates the camera so that it is looking in the -z direction (in objectID's coordinate system) at the center of objectID's bounding box (or the origin of the coordinate system in non-Eudlidean space). In Euclidean space, the camera is also moved as close as possible to the object while allowing the entire object to be visible. Also makes sure that the y-axes of objectID and cameraID are parallel.  File: geomview, Node: look-toward, Next: merge, Prev: look-recenter, Up: GCL Reference 7.2.77 look-toward ------------------ `(look-toward [objectID] [cameraID] [origin | center])' Rotates the named camera to point toward the origin of the object's coordinate system, or the center of the object's bounding box (in non-Euclidean space, the origin will be used automatically). Default objectID is the world, default camera is targetcam, default location to point towards is the center of the bounding box.  File: geomview, Node: merge, Next: merge-ap, Prev: look-toward, Up: GCL Reference 7.2.78 merge ------------ `(merge {window|camera} CAM-ID { WINDOW or CAMERA ... })' Modify the given window or camera, changing just those properties specified in the last argument. E.g. (merge camera `Camera' { far 20 }) sets Camera's far clipping plane to 20 while leaving other attributes untouched.  File: geomview, Node: merge-ap, Next: merge-base-ap, Prev: merge, Up: GCL Reference 7.2.79 merge-ap --------------- `(merge-ap GEOM-ID APPEARANCE)' Merge in some appearance characteristics to GEOM-ID. Appearance parameters include surface and line color, shading style, line width, and lighting.  File: geomview, Node: merge-base-ap, Next: merge-baseap, Prev: merge-ap, Up: GCL Reference 7.2.80 merge-base-ap -------------------- `(merge-base-ap APPEARANCE)' `merge-base-ap' is a synonym for *note `merge-baseap': merge-baseap.  File: geomview, Node: merge-baseap, Next: mod, Prev: merge-base-ap, Up: GCL Reference 7.2.81 merge-baseap ------------------- `(merge-baseap APPEARANCE)' Merge in some appearance characteristics to the base default appearance (applied to every geom before its own apperance). Lighting is typically included in the base appearance.  File: geomview, Node: mod, Next: morehelp, Prev: merge-baseap, Up: GCL Reference 7.2.82 mod ---------- `(mod EXPR1 EXPR2)' Divides EXPR1 by EXPR2 and returns the remainder.  File: geomview, Node: morehelp, Next: name-object, Prev: mod, Up: GCL Reference 7.2.83 morehelp --------------- `(morehelp command)' `command' may include `*' wildcards. Prints more info than *note `(help command)': help.  File: geomview, Node: name-object, Next: ND-axes, Prev: morehelp, Up: GCL Reference 7.2.84 name-object ------------------ `(name-object ID NAME)' Assign a new NAME (a string) to ID. A number is appended if that name is in use (for example, `foo' -> `foo<2>'). The new name, possibly with number appended, may be used as object's id thereafter.  File: geomview, Node: ND-axes, Next: ND-color, Prev: name-object, Up: GCL Reference 7.2.85 ND-axes -------------- `(ND-axes CAMID [CLUSTERNAME [Xindex Yindex Zindex [Windex]]])' In our model for N-D viewing (enabled by (dimension)), objects in N-space are viewed by N-dimensional _camera clusters_. Each real camera window belongs to some cluster, and shows & manipulates a 3-D axis-aligned projected subspace of the N-space seen by its cluster. Moving one camera in a cluster affects its siblings. The ND-axes command configures all this. It specifies a camera's cluster membership, and the set of N-space axes which become the 3-D camera's X, Y, and Z axes. Axes are specified by their indices, from 1 to N for an N-dimensional space. Cluster CLUSTERNAME is implicitly created if not previously known. In principle it is possible to map the homogeneous component of a conformal 4 point to some other index; this would be done by specifying 0 for one of `Xindex', `Yindex' or `Zindex' and giving `Windex' some positive value. This is probably not useful because Geomview does not support non-Euclidean geometries for in higher dimensions. To read a camera's configuration, use `(echo (ND-axes CAMID))'. The return value is an array of 4 integers, the last one should 0. geomview-1.9.5/doc/geomview-20000644000175000017500000026460212310147167012756 00000000000000This is ../../doc/geomview, produced by makeinfo version 4.13 from ../../doc/geomview.texi. INFO-DIR-SECTION Graphics Applications START-INFO-DIR-ENTRY * Geomview: (geomview). The interactive 3D viewing program. END-INFO-DIR-ENTRY  File: geomview, Node: ND-color, Next: ND-xform, Prev: ND-axes, Up: GCL Reference 7.2.86 ND-color --------------- `(ND-color CAMID' [ (( [ID] (x1 x2 ... xN) v r g b a v r g b a ... ) ((x1 ... xN) v r g b a v r g b a ...) ...)] ) Specifies a function, applied to each N-D vertex, which determines the colors of N-dimensional objects as shown in camera CAMID. Each coloring function is defined by a vector (in ID's coordinate system) [x1 ... xN] and by a sequence of value (v)/color(r g b a) tuples, ordered by increasing v. The inner product v = P.[x] is linearly interpolated in this table to give a color. If ID is omitted, the (xi) vector is assumed in universe coordinates. The ND-color command specifies a list of such functions; each vertex is colored by their sum (so e.g. green intensity could indicate projection along one axis while red indicated another. An empty list, as in (ND-color CAMID ()), suppresses coloring. With no second argument, (ND-color CAMID) returns that camera's color-function list. Even when coloring is enabled, objects tagged with the `keepcolor' appearance attribute are shown in their natural colors.  File: geomview, Node: ND-xform, Next: ND-xform-get, Prev: ND-color, Up: GCL Reference 7.2.87 ND-xform --------------- `(ND-xform OBJID [ntransform { idim odim ... }])' Concatenate the given ND-transform with the current ND-transform of the object (apply the ND-transform to object ID, as opposed to simply setting its ND-transform). Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.  File: geomview, Node: ND-xform-get, Next: ND-xform-set, Prev: ND-xform, Up: GCL Reference 7.2.88 ND-xform-get ------------------- `(ND-xform-get ID [from-ID])' Returns the N-D transform of the given object in the coordinate system of from-ID (default `universe'), in the sense * Transform = . Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.  File: geomview, Node: ND-xform-set, Next: new-alien, Prev: ND-xform-get, Up: GCL Reference 7.2.89 ND-xform-set ------------------- `(ND-xform-set OBJID [ntransform { idim odim ... }])' Sets the N-D transform of the given object. In dimension N, this is an (N+1)x(N+1) matrix, so in that case idim and odim are expected to be both equal to (N+1). Note that all cameras in a camera-cluster have the same N-D transform. Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.  File: geomview, Node: new-alien, Next: new-camera, Prev: ND-xform-set, Up: GCL Reference 7.2.90 new-alien ---------------- `(new-alien name [GEOMETRY])' Create a new alien (geom not in the world) with the given name (a string). GEOMETRY is a string giving an OOGL geometry specification. If GEOMETRY is omitted, the new alien is given an empty geometry. If an object with that name already exists, the new alien is given a unique name. The light beams that are used to move around the lights are an example of aliens. They're drawn but are not controllable the way ordinary objects are: they don't appear in the object browser and the user can't move them with the normal motion modes.  File: geomview, Node: new-camera, Next: new-center, Prev: new-alien, Up: GCL Reference 7.2.91 new-camera ----------------- `(new-camera name [CAMERA])' Create a new camera with the given name (a string). If a camera with that name already exists, the new object is given a unique name. If CAMERA is omitted a default camera is used.  File: geomview, Node: new-center, Next: new-geometry, Prev: new-camera, Up: GCL Reference 7.2.92 new-center ----------------- `(new-center [id])' Stop id, then set id's transform to the identity. Default id is target. Also, if the id is a camera, calls (look-recenter World id). The main function of the call to (look-recenter) is to place the camera so that it is pointing parallel to the z axis toward the center of the world.  File: geomview, Node: new-geometry, Next: new-reset, Prev: new-center, Up: GCL Reference 7.2.93 new-geometry ------------------- `(new-geometry name [GEOMETRY])' Create a new geom with the given name (a string). GEOMETRY is a string giving an OOGL geometry specification. If GEOMETRY is omitted, the new object is given an empty geometry. If an object with that name already exists, the new object is given a unique name.  File: geomview, Node: new-reset, Next: NeXT, Prev: new-geometry, Up: GCL Reference 7.2.94 new-reset ---------------- `(new-reset)' Equivalent to `(progn (new-center ALLGEOMS)(new-center ALLCAMS))'.  File: geomview, Node: NeXT, Next: normalization, Prev: new-reset, Up: GCL Reference 7.2.95 NeXT ----------- `(NeXT)' Returns `t' if running on a NeXT, `nil' if not. A relict from ancient work-station year.  File: geomview, Node: normalization, Next: not, Prev: NeXT, Up: GCL Reference 7.2.96 normalization -------------------- `(normalization GEOM-ID {each|none|all|keep})' Set the normalization status of GEOM-ID. `none' suppresses all normalization. `each' normalizes the object's bounding box to fit into the unit sphere, with the center of its bounding box translated to the origin. The box is scaled such that its long diagonal, sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), is 2. `all' resembles `each', except when an object is changing (e.g. when its geometry is being changed by an external program). Then, `each' tightly fits the bounding box around the object whenever it changes and normalizes accordingly, while `all' normalizes the union of all variants of the object and normalizes accordingly. `keep' leaves the current normalization transform unchanged when the object changes. It may be useful to apply `each' or `all' normalization apply to the first version of a changing object to bring it in view, then switch to `keep'.  File: geomview, Node: not, Next: or, Prev: normalization, Up: GCL Reference 7.2.97 not ---------- `(not EXPR)' Evaluates `EXPR'; if `EXPR' returns a non-`nil' value, returns nil, if `EXPR' returns `nil', return `t'.  File: geomview, Node: or, Next: pick, Prev: not, Up: GCL Reference 7.2.98 or --------- `(or EXPR1 EXPR2)' Evaluates `EXPR1'; if `EXPR1' returns non-`nil', return its value, if `EXPR1' returns `nil', evaluate `EXPR2' and return its value.  File: geomview, Node: pick, Next: pick-invisible, Prev: or, Up: GCL Reference 7.2.99 pick ----------- `(pick COORDSYS GEOMID G V E F P VI EI FI)' The pick command is executed internally in response to pick events (right mouse double click). COORDSYS = coordinate system in which coordinates of the following arguments are specified. This can be: `world' world coord sys `self' coord sys of the picked geom (GEOMID) `primitive' coord sys of the actual primitive within the picked geom where the pick occurred. GEOMID = id of picked geom G = picked point (actual intersection of pick ray with object) V = picked vertex, if any E = picked edge, if any F = picked face P = path to picked primitive [0 or more] VI = index of picked vertex in primitive EI = list of indices of endpoints of picked edge, if any FI = index of picked face External modules can find out about pick events by registering interest in calls to `pick' via the `interest' command. In the ND-viewing context the co-ordinates are actually ND-points. They correspond to the 3D points of the pick relative to the sub-space defined by the viewport of the camera where the pick occurred. The co-ordinates are then padded with zeroes and transformed back to the co-ordinate system defined by COORDSYS.  File: geomview, Node: pick-invisible, Next: pickable, Prev: pick, Up: GCL Reference 7.2.100 pick-invisible ---------------------- `(pick-invisible [yes|no])' Selects whether picks should be sensitive to objects whose appearance makes them invisible; default yes. With no arguments, returns current status.  File: geomview, Node: pickable, Next: position, Prev: pick-invisible, Up: GCL Reference 7.2.101 pickable ---------------- `(pickable GEOM-ID {yes|no})' Say whether or not GEOM-ID is included in the pool of objects that could be returned from the pick command.  File: geomview, Node: position, Next: position-at, Prev: pickable, Up: GCL Reference 7.2.102 position ---------------- `(position objectID otherID)' Set the transform of objectID to that of otherID.  File: geomview, Node: position-at, Next: position-toward, Prev: position, Up: GCL Reference 7.2.103 position-at ------------------- `(position-at objectID otherID [center | origin])' Translate objectID to the center of the bounding box or the origin of the coordinate system of otherID (parallel translation). Default is center.  File: geomview, Node: position-toward, Next: process-events, Prev: position-at, Up: GCL Reference 7.2.104 position-toward ----------------------- `(position-toward objectID otherID [center | origin])' Rotate objectID so that the center of the bounding box or the origin of the coordinate system of the otherID lies on the positive z-axis of the first object. Default is the center of the bounding box.  File: geomview, Node: process-events, Next: progn, Prev: position-toward, Up: GCL Reference 7.2.105 process-events ---------------------- `(process-events)' Pass control back to the event loop of Geomview, then continue evaluating the current command-script. If the current input stream has been put to sleep by one of the `(sleep-...)' commands, then the control remains by the main-loop until the current input streams "sleep" is over. *Note `(sleep-until ...)': sleep-until. *Note `(sleep-for ...)': sleep-for.  File: geomview, Node: progn, Next: quit, Prev: process-events, Up: GCL Reference 7.2.106 progn ------------- `(progn STATEMENT [ ... ])' evaluates each STATEMENT in order and returns the value of the last one. Use progn to group a collection of commands together, forcing them to be treated as a single command.  File: geomview, Node: quit, Next: quote, Prev: progn, Up: GCL Reference 7.2.107 quit ------------ `(quit)' `quit' is a synonym for *note `exit': exit.  File: geomview, Node: quote, Next: rawevent, Prev: quit, Up: GCL Reference 7.2.108 quote ------------- `(quote EXPR)' returns the symbolic lisp expression EXPR without evaluating it. Note, however, that `quote' parses EXPR as if it should be evaluated. *Note `(eval ...)': eval.  File: geomview, Node: rawevent, Next: rawpick, Prev: quote, Up: GCL Reference 7.2.109 rawevent ---------------- `(rawevent dev val x y t)' Enter the specified raw event into the event queue. The arguments directly specify the members of the event structure used internally by geomview. This is the lowest level event handler and is not intended for general use.  File: geomview, Node: rawpick, Next: read, Prev: rawevent, Up: GCL Reference 7.2.110 rawpick --------------- `(rawpick CAMID X Y)' Process a pick event in camera CAMID at location (X,Y) given in integer pixel coordinates. This is a low-level procedure not intended for external use.  File: geomview, Node: read, Next: real-id, Prev: rawpick, Up: GCL Reference 7.2.111 read ------------ `(read {geometry|camera|appearance|image|ntransform|transform|command} {GEOMETRY or CAMERA or ...})' Read and interpret the text in ... as containing the given type of data. Useful for defining objects using OOGL reference syntax, e.g. (geometry thing { INST transform : T geom : fred }) (read geometry { define fred QUAD 1 0 0 0 1 0 0 0 1 1 0 0 }) (read transform { define T . If no filename specified, see *note `(rib-display ...': rib-display. for an explanation of the filename used.  File: geomview, Node: scale, Next: scene, Prev: rib-snapshot, Up: GCL Reference 7.2.119 scale ------------- `(scale GEOM-ID FACTOR [FACTORY FACTORZ])' Scale GEOM-ID, multiplying its size by FACTOR. The factors should be positive numbers. If FACTORY and FACTORZ are present and non-zero, the object is scaled by FACTOR in x, by FACTORY in y, and by FACTORZ in z. If only FACTOR is present, the object is scaled by FACTOR in x, y, and z. Scaling only really makes sense in Euclidean space. Mouse-driven scaling in other spaces is not allowed; the scale command may be issued in other spaces but should be used with caution because it may cause the data to extend beyond the limits of the space.  File: geomview, Node: scene, Next: set-clock, Prev: scale, Up: GCL Reference 7.2.120 scene ------------- `(scene CAM-ID [GEOMETRY])' Make CAM-ID look at GEOMETRY instead of at the universe.  File: geomview, Node: set-clock, Next: set-conformal-refine, Prev: scene, Up: GCL Reference 7.2.121 set-clock ----------------- `(set-clock TIME)' Adjusts the clock for this command stream to read TIME (in seconds) as of the moment the command is received. *Note `(sleep-until ...)': sleep-until. *Note `(clock ...)': clock.  File: geomview, Node: set-conformal-refine, Next: set-emodule-path, Prev: set-clock, Up: GCL Reference 7.2.122 set-conformal-refine ---------------------------- `(set-conformal-refine CMX [N [SHOWEDGES]])' Sets the parameters for the refinement algorithm used in drawing in the conformal model. CMX is the cosine of the maximum angle an edge can bend before it is refined. Its value should be between -1 and 1; the default is 0.95; decreasing its value will cause less refinement. N is the maximum number of iterations of refining; the default is 6. SHOWEDGES, which should be `no' or `yes', determines whether interior edges in the refinement are drawn.  File: geomview, Node: set-emodule-path, Next: set-load-path, Prev: set-conformal-refine, Up: GCL Reference 7.2.123 set-emodule-path ------------------------ `(set-emodule-path (PATH1 ... PATHN))' Sets the search path for external modules. The PATHi should be pathnames of directories containing, for each module, the module's executable file and a .geomview- file which contains an (emodule-define ...) command for that module. This command implicitly calls (rehash-emodule-path) to rebuild the application browser from the new path setting. The special directory name `+' is replaced by the existing path, so e.g. (set-emodule-path (mydir +)) prepends mydir to the path.  File: geomview, Node: set-load-path, Next: set-motionscale, Prev: set-emodule-path, Up: GCL Reference 7.2.124 set-load-path --------------------- `(set-load-path (PATH1 ... PATHN))' Sets search path for command, geometry, files, etc. The PATHi are strings giving the pathnames of directories to be searched. The special directory name `+' is replaced by the existing path, so e.g. (set-load-path (mydir +)) prepends mydir to the path.  File: geomview, Node: set-motionscale, Next: setenv, Prev: set-load-path, Up: GCL Reference 7.2.125 set-motionscale ----------------------- `(set-motionscale X)' Set the motion scale factor to X (default value 0.5). These commands scale their motion by an amount which depends on the distance from the frame to the center and on the size of the frame. Specifically, they scale by dist + scaleof(frame) * motionscale where dist is the distance from the center to the frame and motionscale is the motion scale factor set by this function. Scaleof(frame) measures the size of the frame object.  File: geomview, Node: setenv, Next: setq, Prev: set-motionscale, Up: GCL Reference 7.2.126 setenv -------------- `(setenv name string)' sets the environment variable `name' to the value STRING; the name is visible to geomview (as in pathnames containing `$name') and to processes it creates, e.g. external modules.  File: geomview, Node: setq, Next: sgi, Prev: setenv, Up: GCL Reference 7.2.127 setq ------------ `(setq SYM EXPR)' Bind the symbol SYM to the value of EXPR. SYM must be an unqualified symbol, i.e. not quoted, and literal: `(setq "foo" bar)' will not work. Likewise `(setq (bar STUFF) foo)' will also not work, even if `(bar ...)' would evaluate to an unqualified symbol: varible names must be literals. Note that calling `(setq SYM ...)' will alter the value of SYM within the current name-space: if SYM, e.g., is bound as local variable by a lambda, let or defun expression, then `(setq SYM ...)' will change the value of the local variable, the global binding will remain unchanged. It is NOT possible to un-bind a symbol. However, subsequent `(setq SYM ...)' invocations will re-bind SYM to another value and free the lisp-object previously bound to SYM. *Note `(lambda ...)': lambda. *Note `(defun ...)': defun. *Note `(let ...)': let.  File: geomview, Node: sgi, Next: shell, Prev: setq, Up: GCL Reference 7.2.128 sgi ----------- `(sgi)' Returns `t' if running on an sgi machine, `nil' if not. A relict from the old work-station years.  File: geomview, Node: shell, Next: sleep-for, Prev: sgi, Up: GCL Reference 7.2.129 shell ------------- `(shell SHELL-COMMAND)' Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview waits for it to complete and will be unresponsive until it does. A synonym is `!'.  File: geomview, Node: sleep-for, Next: sleep-until, Prev: shell, Up: GCL Reference 7.2.130 sleep-for ----------------- `(sleep-for TIME)' Suspend reading commands from this stream for TIME seconds. Commands already read will still be executed; `sleep-for' inside `progn' won't delay execution of the rest of the progn's contents.  File: geomview, Node: sleep-until, Next: snapshot, Prev: sleep-for, Up: GCL Reference 7.2.131 sleep-until ------------------- `(sleep-until TIME)' Suspend reading commands from this stream until TIME (in seconds). Commands already read will still be executed; `sleep-until' inside `progn' won't delay execution of the rest of the progn's contents. Time is measured according to this stream's clock, as set by `set-clock'; if never set, the first sleep-until sets it to 0 (so initially (sleep-until TIME) is the same as (sleep-for TIME)). Returns the number of seconds until TIME.  File: geomview, Node: snapshot, Next: soft-shader, Prev: sleep-until, Up: GCL Reference 7.2.132 snapshot ---------------- `(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])' Save a snapshot of CAM-ID in the FILENAME (a string). The FORMAT argument is optional; it may be "ppmscreen" (the default), "ps", "ppm", "sgi" (on SGI machines), "ppmosmesa" (if built with libOSMesa) or "ppmosglx". A "ppmscreen" snapshot is created by reading the image directly from the given window; the window is popped above other windows and redrawn first, then its contents are written as a PPM format image. A "ppmosmesa" snapshot is drawn by Mesa's software renderer into a memory buffer in RAM. A "ppmosglx" snapshot is rendered into a GLX Pixmap buffer, which is also off-screen but may or may not reside in video RAM. Rendering may or may not be accelerated. The problem with on-screen snapshots is that the window must be mapped and not obscured by other windows. So on-screen snapshots will not work in the background, or when a screen saver is active. With "ps", dumps a Postscript picture representing the view from that window; hidden-surface removal might be incorrect. With "ppm", dumps a PPM-format image produced by geomview's internal software renderer; this may be of arbitrary size. If the FILENAME argument begins with "|", it's interpreted as a `/bin/sh' command to which the PPM or PS data should be piped. Optional XSIZE and YSIZE values are relevant only for "ppm" formats, and render to a window of that size (or scaled to that size, with aspect fixed, if only XSIZE is given)  File: geomview, Node: soft-shader, Next: space, Prev: snapshot, Up: GCL Reference 7.2.133 soft-shader ------------------- `(soft-shader CAM-ID {on|off|toggle})' Select whether to use software or hardware shading in that camera.  File: geomview, Node: space, Next: stereowin, Prev: soft-shader, Up: GCL Reference 7.2.134 space ------------- `(space {euclidean|hyperbolic|spherical})' Set the space associated with the world.  File: geomview, Node: stereowin, Next: time-interests, Prev: space, Up: GCL Reference 7.2.135 stereowin ----------------- `(stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize])' Configure CAM-ID as a stereo window. no: entire window is a single pane, stereo disabled horizontal: split left/right: left is stereo eye#0, right is #1. vertical: split top/bottom: bottom is eye#0, top is #1. colored: panes overlap, red is stereo eye#0, cyan is #1. A gap of `gapsize' pixels is left between subwindows; if omitted, subwindows are adjacent. If both layout and gapsize are omitted, e.g. (stereowin CAM-ID), returns current settings as a `(stereowin ...)' command list. This command doesn't set stereo projection; use `merge camera' or `camera' to set the stereyes transforms, and `merge window' or `window' to set the pixel aspect ratio & window position if needed.  File: geomview, Node: time-interests, Next: transform, Prev: stereowin, Up: GCL Reference 7.2.136 time-interests ---------------------- `(time-interests deltatime initial prefix [suffix])' Indicates that all interest-related messages, when separated by at least `deltatime' seconds of real time, should be preceded by the string `prefix' and followed by `suffix'; the first message is preceded by `initial'. All three are printf format strings, whose argument is the current clock time (in seconds) on that stream. A `deltatime' of zero timestamps every message. Typical usage: (time-interests .1 `(set-clock %g)' `(sleep-until %g)') or (time-interests .1 `(set-clock %g)' "(sleep-until %g) (progn (set-clock %g)" ")") or (time-interests .1 "(set-clock %g)" "(if (> 0 (sleep-until %g)) (" "))".  File: geomview, Node: transform, Next: transform-incr, Prev: time-interests, Up: GCL Reference 7.2.137 transform ----------------- `(transform objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [dt [`smooth']])' Apply a motion (rotation, translation, scaling) to object `objectID'; that is, construct and concatenate a transformation matrix with objectID's transform The 3 IDs involved are the object that moves, the center of motion, and the frame of reference in which to apply the motion. The center is easiest understood for rotations: if centerID is the same as objectID then it will spin around its own axes; otherwise the moving object will orbit the center object. There is the special keyword `bbox-center' which may be used for `centerID'. As a result the motion will be relative to the center of the bounding box of `objectID'. Normally frameID, in whose coordinate system the (mouse) motions are interpreted, is `focus', the current camera. Translations can be scaled proportional to the distance between the target and the center. Support for spherical and hyperbolic as well as Euclidean space is built-in: use the `space' command to change spaces. With type `rotate' x, y, and z are floats specifying angles in RADIANS. For types `translate' and `translate-scaled' x, y, and z are floats specifying distances in the coordinate system of the center object. The optional `dt' field allows a simple form of animation; if present, the object moves by just that amount during approximately `dt' seconds, then stops. If present and followed by the `smooth' keyword, the motion is animated with a 3t^2-2t^3 function, so as to start and stop smoothly. If absent, the motion is applied immediately.  File: geomview, Node: transform-incr, Next: transform-set, Prev: transform, Up: GCL Reference 7.2.138 transform-incr ---------------------- `(transform-incr objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center] [dt [smooth]])' Apply continuing motion: construct a transformation matrix and concatenate it with the current transform of objectID every refresh (sets objectID's incremental transform). Same syntax as transform. If optional `dt' argument is present, the object is moved at each time step such that its average motion equals one instance of the motion per `dt' seconds. E.g. (transform-incr World World World rotate 6.28318 0 0 10.0) rotates the World about its X axis at 1 turn (2pi radians) per 10 seconds.  File: geomview, Node: transform-set, Next: truncate, Prev: transform-incr, Up: GCL Reference 7.2.139 transform-set --------------------- `(transform-set objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center])' Set objectID's transform to the constructed transform. Same syntax as transform.  File: geomview, Node: truncate, Next: ui-cam-focus, Prev: transform-set, Up: GCL Reference 7.2.140 truncate ---------------- `(truncate EXPR)' Rounds EXPR towards zero.  File: geomview, Node: ui-cam-focus, Next: ui-center, Prev: truncate, Up: GCL Reference 7.2.141 ui-cam-focus -------------------- `(ui-cam-focus [focus-change|mouse-cross])' Set the focus policy for the camera windows. The default is `mouse-cross': a camera is made the active camera (for interactive mouse events) when the mouse cursor crosses the window. Because this means it can become complicated to activate a specific camera (in the context of multiple camera windows) there is also the option to only change the camera focus when the window-manager decides to give it the focus for input events. So, after specifying `focus-change' it depends on the focus-change configuration of your window-manager when a camera becomes the active camera for mouse-interaction. To change this behaviour permanently you could, e.g., place the following line in your `${HOME}/.geomview' file (*note Customization::): (progn (ui-cam-focus focus-change) ... # other stuff )  File: geomview, Node: ui-center, Next: ui-center-origin, Prev: ui-cam-focus, Up: GCL Reference 7.2.142 ui-center ----------------- `(ui-center ID)' Set the center for user interface (i.e. mouse) controlled motions to object ID.  File: geomview, Node: ui-center-origin, Next: ui-emotion-program, Prev: ui-center, Up: GCL Reference 7.2.143 ui-center-origin ------------------------ `(ui-center-origin [origin|bbox-center])' Set the origin of the coordinate system of the `CENTER' object for user interface (i.e. mouse) controlled motions. The keyword `origin' means to use the origin of the coordinate system of the currently selected object, while `bbox-center' means to use the center of the bounding box of the current object. The keyword `bbox-center' makes no sense if the geometry is non-Euclidean. Using either `bbox-center' or `origin' does not make a difference if the center object is not a _geometry_, e.g. if it is a camera. Same holds if the World is the currently selected object.  File: geomview, Node: ui-emotion-program, Next: ui-emotion-run, Prev: ui-center-origin, Up: GCL Reference 7.2.144 ui-emotion-program -------------------------- `(ui-emotion-program PROGRAM)' This is an obsolete command. Use its new eqivalent *note `emodule-define': emodule-define. instead.  File: geomview, Node: ui-emotion-run, Next: ui-freeze, Prev: ui-emotion-program, Up: GCL Reference 7.2.145 ui-emotion-run ---------------------- `(ui-emotion-run EMODULE)' This is an obsolete command. Use its new eqivalent *note `emodule_start': emodule-start. instead.  File: geomview, Node: ui-freeze, Next: ui-html-browser, Prev: ui-emotion-run, Up: GCL Reference 7.2.146 ui-freeze ----------------- `(ui-freeze {on|off})' Toggle updating user interface panels. Off by default.  File: geomview, Node: ui-html-browser, Next: ui-motion, Prev: ui-freeze, Up: GCL Reference 7.2.147 ui-html-browser ----------------------- `(ui-html-browser BROWSER)' Use BROWSER for viewing the HTML-version of the manual when the `Manual (HTML)' menu item is selected in the `Help'-menu. If the `(ui-html-browser ...)' command was never executed, then the default is to use the browser stored in the `WEBBROWSER' environment variable. If the environment variable is unset then the default is compile-time dependent.  File: geomview, Node: ui-motion, Next: ui-panel, Prev: ui-html-browser, Up: GCL Reference 7.2.148 ui-motion ----------------- `(ui-motion {inertia|constrain|own-coordinates} {on|off})' Enable or disable certain properties of mouse-controlled motion. The purpose of this command is to give access to the respective toggles of the _Main_ panel's _Motion_ menu through GCL commands. *Note Mouse Motions::. `inertia' Normally, moving objects have inertia: if the mouse is still moving when the button is released, the selected object continues to move. When `inertia' is off, objects cease to move as soon as you release the mouse. `constrain' It's sometimes handy to move an object in a direction aligned with a coordinate axis: exactly horizontally or vertically. Calling `(ui-motion constrain on)' changes the interpretation of mouse motions to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical motion. Note that the motion is still along the X or Y axes of the camera in which you move the mouse, not necessarily the object's own coordinate system. `own-coordinates' It's sometimes handy to move objects with respect to the coordinate system where they were defined, rather than with respect to some camera's view. When `(ui-motion own-coordinates on)' has been called, all motions are interpreted that way: dragging the mouse rightward in translate mode moves the object in its own +X direction, and so on. May be especially useful in conjunction with the `(ui-motion constrain on)' command.  File: geomview, Node: ui-panel, Next: ui-pdf-viewer, Prev: ui-motion, Up: GCL Reference 7.2.149 ui-panel ---------------- `(ui-panel PANELNAME {on|off} [WINDOW])' Do or don't display the given user-interface panel. Case is ignored in panel names. Current PANELNAMES are: geomview main panel tools motion controls appearance appearance controls cameras camera controls lighting lighting controls obscure obscure controls (doesn't seem to exist any more) materials material properties controls command command entry box credits geomview credits By default, the `geomview' and `tools' panels appear when geomview starts. If the optional Window is supplied, a `position' clause (e.g. (ui-panel obscure on { position xmin xmax ymin ymax }) sets the panel's default position. (Only xmin and ymin values are actually used.) A present but empty Window, e.g. `(ui-panel obscure on {')} causes interactive positioning.  File: geomview, Node: ui-pdf-viewer, Next: ui-target, Prev: ui-panel, Up: GCL Reference 7.2.150 ui-pdf-viewer --------------------- `(ui-pdf-viewer VIEWER)' Use the executable VIEWER for viewing the PDF-version of the manual when the `Manual (PDF)' menu-item is selected in the `Help'-menu. If the `(ui-pdf-viewer ...)' command was never executed, then the default is to use the browser stored in the `PDFVIEWER' environment variable. If the environment variable is unset then the default is compile-time dependent.  File: geomview, Node: ui-target, Next: uninterest, Prev: ui-pdf-viewer, Up: GCL Reference 7.2.151 ui-target ----------------- `(ui-target ID [yes|no])' Set the target of user actions (the selected line of the target object browser) to ID. The second argument specifies whether to make ID the current object regardless of its type. If `no', then ID becomes the current object of its type (geom or camera). The default is `yes'. This command may result in a change of motion modes based on target choice.  File: geomview, Node: uninterest, Next: update, Prev: ui-target, Up: GCL Reference 7.2.152 uninterest ------------------ `(uninterest (COMMAND [args]))' Undoes the effect of an `interest' command. (COMMAND [args]) must be identical to those used in the *note `interest': interest. command.  File: geomview, Node: update, Next: update-draw, Prev: uninterest, Up: GCL Reference 7.2.153 update -------------- `(update [timestep_in_seconds])' Apply each incremental motion once. Uses timestep if it's present and nonzero; otherwise motions are proportional to elapsed real time.  File: geomview, Node: update-draw, Next: while, Prev: update, Up: GCL Reference 7.2.154 update-draw ------------------- `(update-draw CAM-ID [timestep_in_seconds])' Apply each incremental motion once and then draw CAM-ID. Applies `timestep' seconds' worth of motion, or uses elapsed real time if `timestep' is absent or zero.  File: geomview, Node: while, Next: window, Prev: update-draw, Up: GCL Reference 7.2.155 while ------------- `(while TEST BODY)' Iterate: _evaluate TEST, if non nil, evaluate BODY_.  File: geomview, Node: window, Next: winenter, Prev: while, Up: GCL Reference 7.2.156 window -------------- `(window CAM-ID WINDOW)' Specify attributes for the window of CAM-ID, e.g. its size or initial position, in the OOGL Window syntax. The special CAM-ID `default' specifies properties of future windows (created by *note `camera': camera. or *note `new-camera': new-camera.).  File: geomview, Node: winenter, Next: write, Prev: window, Up: GCL Reference 7.2.157 winenter ---------------- `(winenter CAM-ID)' Tell geomview that the mouse cursor is in the window of CAM-ID. This function is for development purposes and is not intended for general use.  File: geomview, Node: write, Next: write-comments, Prev: winenter, Up: GCL Reference 7.2.158 write ------------- `(write {command|geometry|camera|transform|ntransform|window|bbox} FILENAME [ID|(ID ...)] [self|world|universe|otherID])' write description of ID in given format to FILENAME. Last parameter chooses coordinate system for geometry & transform: self: just the object, no transformation or appearance (geometry only) world: the object as positioned within the World. universe: object's position in universal coordinates; includes Worldtransform other ID: the object transformed to otherID's coordinate system. A filename of `-' is a special case: data are written to the stream from which the 'write' command was read. For external modules, the data are sent to the module's standard input. For commands not read from an external program, `-' means geomview's standard output (*note `(command ...)': command.). The ID can either be a single id or a parenthesized list of ids, like `g0' or `(g2 g1 dodec.off)'.  File: geomview, Node: write-comments, Next: write-handle, Prev: write, Up: GCL Reference 7.2.159 write-comments ---------------------- `(write-comments FILENAME GEOMID PICKPATH)' write OOGL COMMENT objects in the GEOMID hierarchy at the level of the pick path to FILENAME. Specifically, COMMENTS at level (a b c ... f g) will match pick paths of the form (a b c ... f *) where * includes any value of g, and also any values of possible further indices h,i,j, etc. The pick path (returned in the `pick' command) is a list of integer counters specifying a subpart of a hierarchical OOGL object. Descent into a complex object (LIST or INST) adds a new integer to the path. Traversal of simple objects increments the counter at the current level. Individual COMMENTS are enclosed by curly braces, and the entire string of zero, one, or more COMMENTS (written in the order in which they are encountered during hierarchy traversal) is enclosed by parentheses. Note that arbitrary data can only be passed through the OOGL libraries as full-fledged OOGL COMMENT objects, which can be attached to other OOGL objects via the LIST type as described above. Ordinary comments in OOGL files (i.e. everything after '#' on a line) are ignored at when the file is loaded and cannot be returned.  File: geomview, Node: write-handle, Next: write-sexpr, Prev: write-comments, Up: GCL Reference 7.2.160 write-handle -------------------- `(write-handle PREFIX FILENAME HANDLE)' Writes the object underlying the given handle to FILENAME. This function is intended for internal debugging use only.  File: geomview, Node: write-sexpr, Next: xform, Prev: write-handle, Up: GCL Reference 7.2.161 write-sexpr ------------------- `(write-sexpr FILENAME LISPOBJECT)' Writes the given LISPOBJECT to FILENAME. This function is intended for internal debugging use only.  File: geomview, Node: xform, Next: xform-incr, Prev: write-sexpr, Up: GCL Reference 7.2.162 xform ------------- `(xform ID TRANSFORM)' Concatenate TRANSFORM with the current transform of the object (apply TRANSFORM to object ID).  File: geomview, Node: xform-incr, Next: xform-set, Prev: xform, Up: GCL Reference 7.2.163 xform-incr ------------------ `(xform-incr ID TRANSFORM)' Apply continual motion: concatenate TRANSFORM with the current transform of the object every refresh (set object ID's incremental transform to TRANSFORM).  File: geomview, Node: xform-set, Next: zoom, Prev: xform-incr, Up: GCL Reference 7.2.164 xform-set ----------------- `(xform-set ID TRANSFORM)' Overwrite the current object transform with TRANSFORM (set object ID's transform to TRANSFORM).  File: geomview, Node: zoom, Prev: xform-set, Up: GCL Reference 7.2.165 zoom ------------ `(zoom CAM-ID FACTOR)' Zoom CAM-ID, multiplying its field of view by FACTOR. FACTOR should be a positive number.  File: geomview, Node: Non-Euclidean Geometry, Next: Mathematica, Prev: GCL, Up: Top 8 Non-Euclidean Geometry ************************ Geomview supports hyperbolic and spherical geometry as well as Euclidean geometry. The three buttons at the bottom of the _Main_ panel are for setting the current geometry type. In each of the three geometries, three models are supported: _Virtual_, _Projective_, and _Conformal_. You can change the current model with the _Model_ browser on the _Camera_ panel. Each Geomview camera has its own model setting. The default model is all three spaces is _Virtual_. This corresponds to the camera being in the same space as, and moving under the same set of transformations as, the geometry itself. In Euclidean space _Virtual_ is the most useful model. The other models were implemented for hyperbolic and spherical spaces and just happen to work in Eucldiean space as well: _Projective_ is the same as _Virtual_ but by default displays the unit sphere, and _Conformal_ displays everything inverted in the unit sphere. In hyperbolic space, the _Projective_ model setting gives a view of the projective ball model of hyperbolic 3-space imbedded in Euclidean space. The camera is initially outside the unit ball. In this model, the camera moves by Euclidean motions and geometry moves by hyperbolic motions. _Conformal_ model is similar but shows the conformal ball model instead. In spherical space, the _Projective_ model gives a view of half of the 3-sphere imbedded in Euclidean 3-space. Spherical motions give rise to projective transformations in the _Projective_ model, and to Moebius transformations in the _Conformal_ model. In both of these models the camera moves by Euclidean motions. In _Projective_ and _Conformal_ models, the unit sphere is drawn by default. You can turn it off and on at will using the _Draw Sphere_ button in the _Camera_ panel. In the _Conformal_ model, polygons and edges are subdivided as necessary to make them look curved. The parameters which determine this subdivision can be set with the `set-conformal-refine' GCL command. *Note `(set-conformal-refine ...)': set-conformal-refine. There are several sample hyperbolic space objects in the `data/geom/hyperbolic' subdirectory of the Geomview directory. Likewise, the subdirectory `data/geom/spherical' contains several sample spherical space objects.  File: geomview, Node: Mathematica, Next: Installation, Prev: Non-Euclidean Geometry, Up: Top 9 Mathematica Graphics in Geomview or RenderMan *********************************************** Geomview comes with some Mathematica packages that let you use use Geomview to display Mathematica graphics. Mathematica is a commercial mathematical software system available from Wolfram Research, Inc. There are two ways to do this. 1. Use Mathematica to write a graphics object to a file in OOGL format or in RIB format. 2. Use Geomview as the default display for all 3D graphics output in Mathematica. You can also use these packages to save Mathematica graphics in RenderMan (RIB) format. Since the format of Mathematica graphics objects is different from the OOGL formats, both of these methods involve translating Mathematica graphics to OOGL format. Geomview is distributed with a Mathematica package which does this translation. Before doing either of the above you must install this package. * Menu: * OOGL.m:: Generating OOGL files in Mathematica. * Geomview.m:: Geomview as Mathematica's Default 3D Display. * RenderMan:: Generating RenderMan files in Mathematica. * Remote Display:: Using Geomview and Mathematica on different computers. * Package Details:: Some details about the packages. * Package Installation:: Installing the Mathematica->Geomview package.  File: geomview, Node: OOGL.m, Next: Geomview.m, Prev: Mathematica, Up: Mathematica 9.1 Using Mathematica to generate OOGL files ============================================ The package `OOGL.m' allows Mathematica to write graphics objects in OOGL format. To use it, give the command `<< OOGL.m' to Mathematica to load the package. The `WriteOOGL[FILE,GRAPHICS]' command writes an OOGL description of the 3D graphics object GRAPHICS to the file named FILE. This package also provides the `Geomview' command which sends a 3D graphics object to Geomview. The first time you use this command it starts up a copy of Geomview. Later calls send the graphics to the same Geomview. There are two ways to use the `Geomview' command. `Geomview[GRAPHICS]' Sends the 3D graphics object GRAPHICS to Geomview as a geom named `Mathematica'. Subsequent usage of `Geomview[GRAPHICS]' replaces the `Mathematica' object in Geomview with the new GRAPHICS. ``Geomview[NAME,GRAPHICS]'' Sends the 3D graphics object GRAPHICS to Geomview as a geom named NAME. You can use multiple calls of this form with different names to cause Geomview to display several Mathematica objects at once and allow independent control over them. % math Mathematica 2.0 for SGI Iris Copyright 1988-91 Wolfram Research, Inc. -- GL graphics initialized -- In[1] := <"riemann"] This displays the graphics `%3' on the remote host named `riemann'. `Geomview' recognizes the string `"local"' as a value for `$DisplayHost'; it forces the graphics to be displayed on the local machine. In addition to knowing the name of the machine you want to run Geomview on, `Geomview' needs to know the type of that machine (the setting of the CPU variable that corresponds to the machine; *note Source Code Installation::). By default, `Geomview' assumes that it is the same kind of computer as the one you are running Mathematica on. The `MachType' option lets you explicitly specify the type of the `DisplayHost' computer; it should be one of the strings `"sgi"' or `"next"' or `"x11"'. You can use `SetOptions' to change the default `DisplayHost' and `MachType'. For example, In[4] := SetOptions[Geomview, DisplayHost->"riemann", MachType->"sgi"] arranges for `Geomview' to run Geomview on an SGI workstation named `riemann'.  File: geomview, Node: Chunks, Prev: Networked Geomview, Up: Remote Display 9.4.2 Transporting Mathematica Files to Geomview by Hand -------------------------------------------------------- The auxilliary function `WriteChunk' is for those who can only use Mathematica on a computer that Geomview isn't installed on. `WriteChunk[FILE, GRAPHICS]' generates a file named FILE which contains the graphics object GRAPHICS in the format accepted by `math2oogl'. You can transfer that file to a computer that has Geomview installed on it and then use the programs `math2oogl', `oogl2ri'b, and `geomview' directly from the shell. These programs are distributed in the `bin/' subdirectory of the Geomview directory, and may have been installed so that they are on your `path'. In[1]:= < mma.oogl to convert it to the OOGL file `mma.oogl' which you can then view using Geomview. This is the equivalent of the `WriteOOGL' command. For a result equivalent to the `Geomview' or `Show' commands, type math2oogl -togeomview Mathematica geomview < mychunk The `WriteRI'b command can be emulated from the shell as math2oogl < mychunk | oogl2rib -n mma.tiff  File: geomview, Node: Package Details, Next: Package Installation, Prev: Remote Display, Up: Mathematica 9.5 Details of the Mathematica->Geomview Package ================================================ The `OOGL.m' package uses the external program `math2oogl' to convert `Graphics3D' objects to OOGL format, because a compiled external program is able to do this conversion many times faster than Mathematica. The converter will sometimes handle colored SurfaceGraphics objects correctly that Mathematica does not handle correctly, which means that Geomview[object] sometimes works where Show[object] will give errors. The converter supports the `Polygon', `Line', and `Point' graphics primitives, `RGBColor Graphics3D' directives, and `SurfaceGraphics' objects with or without `RGBColor' directives, and lists of any combination of these. It silently ignores all other directives. The Mathematica to RenderMan conversion is actually a two-step process: Mathematica->OOGL (math2oogl), and OOGL->RenderMan (oogl2rib). In the `WriteOOGL' and `WriteRIB' commands, filename can either be a string containing a filename, an `OutputStream' object, or a string starting with a `!' to send the output to a command. Object can be a `Graphics3D' object, a `SurfaceGraphics' object, or a list of these. The packages work best with Mathematica 2.0 or better. With version 1.2, the Geomview display is always on the local host.  File: geomview, Node: Package Installation, Prev: Package Details, Up: Mathematica 9.6 Installing the Mathematica Packages ======================================= BUG: This section is out of date. `Geomview' follows the GNU-installation habits, data goes to `PREFIX/share/geomview/', user executables to `PREFIX/bin/', private executables to `PREFIX/libexec/geomview/', libraries to `PREFIX/lib/' where `PREFIX' denotes the installation prefiex specified for the `TOPSRCDIR/configure' script. Please have a look at the files `TOPSRCDIR/INSTALL' and `TOPSRCDIR/INSTALL.Geomview' for installation instructions. The installed Mathematica data-files can be found in `PREFIX/share/geomview/Mathematica/'. If Geomview is properly installed on your system according to the instructions in *Note Installation::, then the Mathematica-to-Geomview packages should work as described here; there should be no need for additional installation procedures. In practice, however, it is sometimes necessary to taylor the installation of the Mathematica packages and/or of Geomview itself to suit the needs of a particular system. This section contains details about how the installation works; if the Mathematica-to-Geomview connection does not seem to work for you after following the Geomview installation procedure, consult this section to see what might need to be fixed. In this section, the phrase _Geomview installation_ refers any of the procedures in *Note Installation::. The way the Mathematica packages work and are installed is the same regardless of whether you have one of the binary distributions or the source distribution. 1. The relevant mathematica files are `OOGL.m', `Geomview.m', and `BezierPlot.m'; Mathematica must be able to find these files. They are distributed in the `PREFIX/share/geomview/Mathematica' subdirectory of the binary distributions, and in the `TOPSRCDIR/src/bin/geomutil/math2oogl' subdirectory of the source distribution. These files need to be in a directory that is on Mathematica's search path. You can look at the value of the `$Path' variable in a Mathematica session on your system to see a list of the directories on Mathematica's search path. The Geomview installation procedure puts copies of the Mathematica packages into a directory that you specify (`MMAPACKAGEDIR'). This should ensure that Mathematica can find them. Alternately, you could arrange to append the pathname of the Mathmematica package subdirectory of the Geomview distribution to the `$Path' variable each time you run Mathematica. 2. The package `OOGL.m' needs to be able to invoke the programs `geomview', `math2oogl', and `oogl2rib'. The Geomview installation procedure installs these programs into a directory that you specify for executables (`BINDIR'). Ideally, this directory should be on your shell's `$PATH'. More specifically, it should be on the `$PATH' of the shell in which Mathematica runs; the directory `/usr/local/bin' is usually a good choice. You can see the list of directories on this path by giving the command `!echo $path' in Mathematica. If for some reason you can't arrange for `geomview', `math2oogl', and `oogl2rib' to be in a directory on the shell's `$path', you can modify `OOGL.m' to cause it to look for them using absolute pathnames. To do this, change the definitions of the variables `$GeomviewPath' and `$GeomRoot', which are defined near the top of the file. Change `$GeomviewPath' to the absolute pathname of the `geomview' shell script on your system. Change `$GeomRoot' to the absolute pathname of the `$GEOMROOT' directory on your system. If you do this, you should also make sure there are copies of `geomview', `math2oogl', and `oogl2ri'b in the `$GEOMROOT/bin/'. 3. The `geomview' shell script, which `OOGL.m' uses to invoke Geomview, needs to be able to find the geomview executable file ( called `gvx'). The Geomview installation procedure should have been taken care of this, but if your Mathematica session doesn't seem to be able to invoke Geomview, it's worth double-checking that the settings in the `geomview' script are correct.  File: geomview, Node: Installation, Next: Support, Prev: Mathematica, Up: Top 10 Installation *************** BUG: This section is out of date. `Geomview' follows the GNU-installation habits, data goes to `PREFIX/share/geomview/', user executables to `PREFIX/bin/', private executables to `PREFIX/libexec/geomview/', libraries to `PREFIX/lib/' where `PREFIX' denotes the installation prefiex specified for the `TOPSRCDIR/configure' script. Please have a look at the files `TOPSRCDIR/INSTALL' and `TOPSRCDIR/INSTALL.Geomview' for installation instructions. What you do to install Geomview depends on which kind of computer you have and on whether you have the source distribution or the binary distribution. In general, if you don't care about looking at Geomview's source code, you should get one of the binary distribution. The binary installation is much easier and quicker than compiling and installing the source code. * Menu: * Unix Binary Installation:: Installing the Unix Binary Distribution * Source Code Installation:: Compiling and Installing the Source Code Distribution.  File: geomview, Node: Unix Binary Installation, Next: Source Code Installation, Prev: Installation, Up: Installation 10.1 Installing the Unix Binary Distribution ============================================ BUG: This section is out of date. `Geomview' follows the GNU-installation habits, data goes to `PREFIX/share/geomview/', user executables to `PREFIX/bin/', private executables to `PREFIX/libexec/geomview/', libraries to `PREFIX/lib/' where `PREFIX' denotes the installation prefiex specified for the `TOPSRCDIR/configure' script. Please have a look at the files `TOPSRCDIR/INSTALL' and `TOPSRCDIR/INSTALL.Geomview' for installation instructions. If you have just obtained a copy of the binary distribution for a Unix system (Linux, SGI, Solaris, HP, etc), you should be able to run Geomview and make use of most of its features immediately after unpacking it by `cd''ing to the directory that it is in and typing `geomview'. In order to fully install Geomview so that you can run it from any directory and use all of its features, follow the steps in this section. In particular, you must go through this installation procedure in order to use Geomview to display Mathematica graphics. Geomview is distributed in a directory that contains various files and subdirectories that Geomview needs at run-time, such as data files and external modules. It also contains other things distributed with Geomview, such as documentation and (in the soure-code distribution) source-code. We refer to the root directory of this tree as the `$GEOMROOT' directory. This is the directory called `Geomview' that is created when you unpack the distribution file. To install Geomview on your system, arrange for the `$GEOMROOT' directory to be in a permanent place. Then, in a shell window, `cd' to that directory and type `install'. This runs a shell script which does the installation after asking you several questions about where you want to install the various components of Geomview. After running the `install' script you should now be able to run Geomview from any directory on your system. (You may need to give the `rehash' command in any shells on your computer that were started up before you did the installation.) The `install' script puts copies of the files in `$GEOMROOT/bin/' and `$GEOMROOT/man' into the directories you specified for executables and man pages, respectively. Once you have done the installation you can cut down one the disk space required by Geomview by removing some files from these directories, since copies have been installed elsewhere. You should first test that your installed Geomview works properly because once you remove these files from their distribution directories you will not be able to do the installation again. In particular, the files you can remove are `$GEOMROOT/bin/': (where `' is the type of system you are on, e.g. `linux', `sgi', `hpux', etc). Remove all files from here except `gvx', which is the geomview executable file. DO NOT REMOVE `gvx'. It is not installed elsewhere. `$GEOMROOT/man': You can remove all the files in this directory. * Menu: * Unix Binary Detail::  File: geomview, Node: Unix Binary Detail, Prev: Unix Binary Installation, Up: Unix Binary Installation 10.1.1 Details of the Unix Binary Installation ---------------------------------------------- BUG: This section is out of date. `Geomview' follows the GNU-installation habits, data goes to `PREFIX/share/geomview/', user executables to `PREFIX/bin/', private executables to `PREFIX/libexec/geomview/', libraries to `PREFIX/lib/' where `PREFIX' denotes the installation prefiex specified for the `TOPSRCDIR/configure' script. Please have a look at the files `TOPSRCDIR/INSTALL' and `TOPSRCDIR/INSTALL.Geomview' for installation instructions. The `install' script should be self-explanatory; just run it and answer the questions. This section gives some details for system administrators and other users who may want to know more about the installation. The installation is actually done by `make'; the `install' script queries the user for the settings of the following `make' variables and then invokes `make install'. `GEOMROOT': the absolute pathname of the Geomview root directory. The `geomview' shell script, which is what users invoke to run Geomview, uses this to set various environment variables that Geomview needs. It is very important that this be an _absolute_ pathname -- i.e. it should start with a '/'. `BINDIR': a directory where executable files are installed. The `geomview' shell script goes here, as well as various other auxiliary programs that can be used in conjunction with `geomview'. This should be a directory that is on users' `$path'. These auxiliary programs are distributed in the `$GEOMROOT/bin/' directory; if you specify this directory for `BINDIR', they are left in that directory. `MANDIR': a directory where Unix manual pages are installed. These are distributed in the `$GEOMROOT/man' subdirectory; if you specify this directory for `MANDIR', they are left in that directory. `MMAPACKAGEDIR': a directory where Mathematica packages are installed. This should be a directory that Mathematica searches for packages that it loads; you can see what directories your Mathematica searches by looking at the value of the `$Path' variable in a Mathematica session. The installation process will install some packages there which allow you to use Geomview to display Mathematica graphics. These packages are distributed in the `$GEOMROOT/mathematica' subdirectory; if you specify this directory for `MMAPACKAGEDIR', or if you specify the empty string for `MMAPACKAGEDIR', the packages are left in that directory. For more details about the way these Mathematica packages connect to Geomview, *note Package Installation::.  File: geomview, Node: Source Code Installation, Prev: Unix Binary Installation, Up: Installation 10.2 Compiling and Installing the Source Code Distribution ========================================================== BUG: This section is out of date. `Geomview' follows the GNU-installation habits, data goes to `PREFIX/share/geomview/', user executables to `PREFIX/bin/', private executables to `PREFIX/libexec/geomview/', libraries to `PREFIX/lib/' where `PREFIX' denotes the installation prefiex specified for the `TOPSRCDIR/configure' script. Please have a look at the files `TOPSRCDIR/INSTALL' and `TOPSRCDIR/INSTALL.Geomview' for installation instructions. The main reason to get the source code distribution is to look at and/or work with the source code. If you are only concered with _using_ Geomview it is better to get the binary distribution. It takes anywhere from a few minutes to an hour or more to compile the entire source distribution, depending on what kind of computer you have. Let `$GEOMROOT' denote the full pathname of the Geomview source code directory; this is the directory called `Geomview' that is created when you unpack the distribution. This directory contains the Geomview source code as well as various other files and subdirectories that Geomview needs when it runs. Before doing any compilation you should edit the file `$GEOMROOT/makefiles/mk.site.default'. This file defines some `make' variables which specify your local configuration. This includes the pathnames of the directories into which Geomview will be installed, and possibly some other settings as well. There are comments in the file telling you what to do. This file is included by every Makefile in the source tree, so the settings you specify here are used throughout the source. If you will be compiling for multiple systems, you can do them all in the same directory tree. By default the Makefiles are set up to put the objects files, libraries, and executables in directories which depend on the type of computer, so the two architectures will not interfere with each other. The Makefiles use a variable called `CPU' to determine the type of machine. Before doing any compilation you must arrange for this variable to have a value. There are two ways you can do this. 1. If you will always be compiling Geomview on the same type of computer edit the file `$GEOMROOT/makefiles/Makedefs.global' to set the `CPU' variable to one of the values `linux', `FreeBSD', `sgi', `hpux', `hpux-gcc', `solaris', `sun4os4' (for Suns with SunOS 4, not Solaris), `rs6000', or `alpha'. If you're using a type of system not in this list, make up a new value for CPU, and write a `mk.' file for it patterned after the other `mk.*' in the `makefiles' subdirectory. 2. If you will be compiling on more than one type of computer you can set a shell environment variable named `CPU' to one of the values above and the Makefiles will inherit the value from the environment. Note that many of the Makefiles refer to a variable called `MACHTYPE'; this variable tells which type of graphics system to compile Geomview for. The `mk.' files set this variable for you; in most cases its value is `x11', which specifies that Geomview should be compiled for X windows. Once you have configured your source tree by editing the files as described above and setting the `CPU' variable, you can compile and install Geomview by typing `make install' in the `$GEOMROOT' directory. You can also type `make all', or equivalently just `make', to compile without installing, and then type `make install' later to install. You can use these same `make' comands in any subdirectory in the tree to recompile and/or install a part of Geomview or a module. If you want to modify the complier flags used during compilation, edit the file `$GEOMROOT/makefiles/Makedefs.global'; the `COPTS' variable specifies the flags passed to the C compiler (cc).  File: geomview, Node: Support, Next: Contributing, Prev: Installation, Up: Top Getting Technical Support for Geomview ************************************** There are several ways to get support for Geomview. 1. Visit the Geomview web site, `http://www.geomview.org'. It contains the latest documentation, news about development, and FAQ (Frequently Asked Questions) list. 2. Send email to the geomview-users@lists.sourceforge.net mailing list. This is a mailing list for discussing any issues related to using Geomview. To join the list, send an empty note with 'subscribe' in the subject line to geomview-users-request@lists.sourceforge.net (mailto:geomview-users-request@lists.sourceforge.net), or visit the list web page at `http://lists.sourceforge.net/mailman/listinfo/geomview-users'. 3. Contract with Geometry Technologies for support. Geometry Technologies is a contract support and programming company that emerged from the Geometry Center, where Geomview was written. For more information visit the Geometry Technologies web site at `http://www.geomtech.com'.  File: geomview, Node: Contributing, Next: Function Index, Prev: Support, Up: Top Contributing to Geomview's Development ************************************** If you are interested in contributing to the development of Geomview, there are several things you can do: 1. *Volunteer programming work*. If you are a programmer and make an improvement to Geomview, contact the other geomview authors by sending a note to the `geomview-users' mailing list (see `http://lists.sourceforge.net/mailman/listinfo/geomview-users'). 2. *Contract with Geometry Technologies*. Geometry Technologies, Inc. is a consulting firm that provides contract technical support and custom programming services in the area of 3D graphics. This includes a wide range of services related to 3D graphics, included but not limited to applications involving Geomview. To the extent that resources allow, Geometry Technologies supports the developement of Geomview; in particular it hosts the `http://www.geomview.org' web site, and its staff make ongoing improvements to Geomview itself. If you are in a position to pay for technical support or custom programming work, contracting with Geometry Technologies indirectly supports Geomview. You can also contract with with Geometry Technologies to have particular features that you want added to Geomview, or to port Geomview to a new platform. For more information see Geometry Technologies web site at `http://www.geomtech.com'. Thank you.  File: geomview, Node: Function Index, Next: List of Figures, Prev: Contributing, Up: Top Function Index ************** [index] * Menu: * !, shell <1>: shell. (line 6) * !, shell: shell-shortcut. (line 6) * *: mul. (line 6) * +: add. (line 6) * -: sub. (line 6) * /: div. (line 6) * <: lt. (line 6) * =: eq. (line 6) * >: gt. (line 6) * ?: help-shortcut. (line 6) * ??: morehelp-shortcut. (line 6) * all: all. (line 6) * all camera: all. (line 8) * all emodule defined: all. (line 11) * all emodule running: all. (line 14) * all geometry: all. (line 6) * and: and. (line 6) * ap-override: ap-override. (line 6) * backcolor: backcolor. (line 6) * background-image: background-image. (line 6) * bbox-color: bbox-color. (line 6) * bbox-draw: bbox-draw. (line 6) * camera: camera. (line 6) * camera-draw: camera-draw. (line 6) * camera-prop: camera-prop. (line 6) * camera-reset: camera-reset. (line 6) * car: car. (line 6) * cdr: cdr. (line 6) * clock: clock. (line 6) * command: command. (line 6) * cons: cons. (line 6) * copy: copy. (line 6) * cursor-still: cursor-still. (line 6) * cursor-twitch: cursor-twitch. (line 6) * defun: defun. (line 6) * delete: delete. (line 6) * dice: dice. (line 6) * dimension: dimension. (line 6) * dither: dither. (line 6) * draw: draw. (line 6) * dump-handles: dump-handles. (line 6) * echo: echo. (line 6) * emodule-clear: emodule-clear. (line 6) * emodule-define: emodule-define. (line 6) * emodule-defined: emodule-defined. (line 6) * emodule-isrunning: emodule-isrunning. (line 6) * emodule-path: emodule-path. (line 6) * emodule-run, | <1>: emodule-run. (line 6) * emodule-run, |: emodule-run-shortcut. (line 6) * emodule-sort: emodule-sort. (line 6) * emodule-start: emodule-start. (line 6) * emodule-transmit: emodule-transmit. (line 6) * escale: escale. (line 6) * eval: eval. (line 6) * event-keys: event-keys. (line 6) * event-mode: event-mode. (line 6) * event-pick: event-pick. (line 6) * evert: evert. (line 6) * exit: exit. (line 6) * ezoom: ezoom. (line 6) * freeze: freeze. (line 6) * geometry: geometry. (line 6) * geomview-version: geomview-version. (line 6) * hdefine: hdefine. (line 6) * hdelete: hdelete. (line 6) * help: help. (line 6) * hmodel: hmodel. (line 6) * hsphere-draw: hsphere-draw. (line 6) * if: if. (line 6) * inhibit-warning: inhibit-warning. (line 6) * input-translator: input-translator. (line 6) * interest: interest. (line 6) * lambda: lambda. (line 6) * let: let. (line 6) * lines-closer: lines-closer. (line 6) * load: load. (line 6) * load-path: load-path. (line 6) * look: look. (line 6) * look-encompass: look-encompass. (line 6) * look-encompass-size: look-encompass-size. (line 6) * look-recenter: look-recenter. (line 6) * look-toward: look-toward. (line 6) * merge: merge. (line 6) * merge-ap: merge-ap. (line 6) * merge-base-ap: merge-base-ap. (line 6) * merge-baseap: merge-baseap. (line 6) * mod: mod. (line 6) * morehelp: morehelp. (line 6) * name-object: name-object. (line 6) * ND-axes: ND-axes. (line 6) * ND-color: ND-color. (line 6) * ND-xform: ND-xform. (line 6) * ND-xform-get: ND-xform-get. (line 6) * ND-xform-set: ND-xform-set. (line 6) * new-alien: new-alien. (line 6) * new-camera: new-camera. (line 6) * new-center: new-center. (line 6) * new-geometry: new-geometry. (line 6) * new-reset: new-reset. (line 6) * NeXT: NeXT. (line 6) * normalization: normalization. (line 6) * not: not. (line 6) * or: or. (line 6) * pick: pick. (line 6) * pick-invisible: pick-invisible. (line 6) * pickable: pickable. (line 6) * position: position. (line 6) * position-at: position-at. (line 6) * position-toward: position-toward. (line 6) * process-events: process-events. (line 6) * progn: progn. (line 6) * quit: quit. (line 6) * quote: quote. (line 6) * rawevent: rawevent. (line 6) * rawpick: rawpick. (line 6) * read: read. (line 6) * real-id: real-id. (line 6) * redraw: redraw. (line 6) * regtable: regtable. (line 6) * rehash-emodule-path: rehash-emodule-path. (line 6) * replace-geometry: replace-geometry. (line 6) * rib-display: rib-display. (line 6) * rib-snapshot: rib-snapshot. (line 6) * scale: scale. (line 6) * scene: scene. (line 6) * set-clock: set-clock. (line 6) * set-conformal-refine: set-conformal-refine. (line 6) * set-emodule-path: set-emodule-path. (line 6) * set-load-path: set-load-path. (line 6) * set-motionscale: set-motionscale. (line 6) * setenv: setenv. (line 6) * setq: setq. (line 6) * sgi: sgi. (line 6) * shell, ! <1>: shell. (line 6) * shell, !: shell-shortcut. (line 6) * sleep-for: sleep-for. (line 6) * sleep-until: sleep-until. (line 6) * snapshot: snapshot. (line 6) * soft-shader: soft-shader. (line 6) * space: space. (line 6) * stereowin: stereowin. (line 6) * time-interests: time-interests. (line 6) * transform: transform. (line 6) * transform-incr: transform-incr. (line 6) * transform-set: transform-set. (line 6) * truncate: truncate. (line 6) * ui-cam-focus: ui-cam-focus. (line 6) * ui-center: ui-center. (line 6) * ui-center-origin: ui-center-origin. (line 6) * ui-emotion-program: ui-emotion-program. (line 6) * ui-emotion-run: ui-emotion-run. (line 6) * ui-freeze: ui-freeze. (line 6) * ui-html-browser: ui-html-browser. (line 6) * ui-motion: ui-motion. (line 6) * ui-panel: ui-panel. (line 6) * ui-pdf-viewer: ui-pdf-viewer. (line 6) * ui-target: ui-target. (line 6) * uninterest: uninterest. (line 6) * update: update. (line 6) * update-draw: update-draw. (line 6) * while: while. (line 6) * window: window. (line 6) * winenter: winenter. (line 6) * write: write. (line 6) * write-comments: write-comments. (line 6) * write-handle: write-handle. (line 6) * write-sexpr: write-sexpr. (line 6) * xform: xform. (line 6) * xform-incr: xform-incr. (line 6) * xform-set: xform-set. (line 6) * zoom: zoom. (line 6) * |, emodule-run <1>: emodule-run. (line 6) * |, emodule-run: emodule-run-shortcut. (line 6)  File: geomview, Node: List of Figures, Prev: Function Index, Up: Top List of Figures *************** * Menu: * Figure 2.1: Initial Geomview ...: figinitial. * Figure 2.2: Looking at the world.: figlookatworld. * Figure 2.3: The Appearance Panel.: figappearance. * Figure 2.4: Color Chooser Panel.: figcolorchooser. * Figure 2.5: The Files Panel.: figfilespanel. * Figure 2.6: Trefoil and ...: figtrefdodec. * Figure 3.1: The Main Panel: figmainpanel. * Figure 3.2: The Files Panel.: figmyfilelist. * Figure 3.3: The Load Panel.: figloadpanel. * Figure 3.4: The Tools Panel.: figtools. * Figure 3.5: The Appearance Panel.: figap. * Figure 3.6: Color Chooser Panel.: figcolorchooserpanel. * Figure 3.7: The Materials Panel.: figmatpanel. * Figure 3.8: The Cameras Panel.: figcamerapanel. * Figure 3.9: The Save Panel.: figsavepanel. * Figure 3.10: The Commands Panel.: figcommandpanel. geomview-1.9.5/doc/geomview-pt_BR0000644000175000017500000001561112310147167013615 00000000000000This is ../../doc/geomview-pt_BR, produced by makeinfo version 4.13 from ../../doc/geomview-pt_BR.texi. INFO-DIR-SECTION Graphics Applications START-INFO-DIR-ENTRY * Geomview: (geomview-pt_BR). Programa interativo de visualizac,a~o tridimensional. END-INFO-DIR-ENTRY  Indirect: geomview-pt_BR-1: 279 geomview-pt_BR-2: 294475  Tag Table: (Indirect) Node: Top279 Node: Intro1871 Node: Distrib3401 Node: Copiando5104 Node: Historia38588 Node: Autores41757 Node: Plantaformas42517 Node: Pronuncia43190 Node: Visao Geral43768 Node: Tutorial46944 Ref: figinitial47925 Ref: figlookatworld52729 Ref: figappearance53233 Ref: figcolorchooser54472 Ref: figfilespanel57510 Ref: figtrefdodec58220 Node: Interacao58254 Node: Iniciando o Geomview59094 Node: Opcoes de Linha de Comando59778 Node: Interacao Basica65072 Ref: figmainpanel65716 Node: Chamando71889 Ref: figmyfilelist72327 Ref: figloadpanel75770 Node: Movimentos do Mouse76130 Ref: figtools76985 Node: Ponto de Interesse87860 Node: Aparencia91277 Node: Painel de Aparencia93397 Ref: figap93685 Ref: figcolorchooserpanel95389 Node: Painel de Materiais102175 Ref: figmatpanel102559 Node: Painel de Iluminacao105272 Node: Cameras108227 Ref: figcamerapanel108661 Node: Gravando116486 Ref: figsavepanel116813 Node: Comandos123349 Ref: figcommandpanel124009 Node: Atalhos de Teclado124081 Node: Formatos dos Arquivos da OOGL130506 Node: Convencoes131364 Node: Sintaxe comum132282 Node: Nomes de arquivos133894 Node: Vertices134484 Node: ND-Vertices136273 Node: Direcoes de superficies normais137776 Node: Matrizes de transformacao138602 Node: Matrizes de transformacao ND139699 Node: Formato binario140749 Node: Referencias142825 Node: Aparencias145760 Node: Mapeamento de Textura157905 Node: Formatos de Arquivo de Objeto164414 Node: QUAD165589 Node: MESH167155 Node: BBOX170321 Node: BBP and BEZ171520 Node: OFF175374 Node: VECT180309 Node: SKEL183723 Node: SPHERE186655 Node: INST188892 Node: Exemplos INST195652 Node: LIST196780 Node: TLIST197743 Node: GROUP200003 Node: DISCGRP200582 Node: COMMENT200943 Node: Objetos nao-geometricos202744 Node: Objetos de aparencia203524 Node: image objects203969 Node: transform objects215945 Node: ntransform objects219031 Node: Objeto camera223326 Node: window objects229258 Node: Customizacao230918 Node: Modulos233436 Node: Interface234950 Node: Example1237187 Node: Example2245340 Node: XForms254712 Node: Example3255560 Node: Example4277417 Node: Module Installation283661 Node: Private Module Installation284407 Node: System Module Installation285897 Node: GCL287518 Node: Argument Conventions291119 Node: GCL Reference294475 Node: shell-shortcut304770 Node: lt304945 Node: eq305234 Node: gt305509 Node: mul305787 Node: div305957 Node: add306124 Node: sub306291 Node: help-shortcut306468 Node: morehelp-shortcut306917 Node: emodule-run-shortcut307226 Node: all307407 Node: and307924 Node: ap-override308167 Node: backcolor308494 Node: background-image308735 Node: bbox-color309424 Node: bbox-draw309684 Node: camera309976 Node: camera-draw310461 Node: camera-prop310718 Node: camera-reset311401 Node: car311607 Node: cdr311777 Node: clock311965 Node: command312258 Node: cons312592 Node: copy312858 Node: cursor-still313197 Node: cursor-twitch313559 Node: defun313916 Node: delete315289 Node: dice315468 Node: dimension315826 Node: dither316289 Node: draw316507 Node: dump-handles316748 Node: echo317057 Node: emodule-clear317568 Node: emodule-define317801 Node: emodule-defined318300 Node: emodule-isrunning318793 Node: emodule-path319286 Node: emodule-run319743 Node: emodule-sort321206 Node: emodule-start321442 Node: emodule-transmit321770 Node: escale322289 Node: eval322509 Node: event-keys323049 Node: event-mode323304 Node: event-pick324251 Node: evert324450 Node: exit324844 Node: ezoom324989 Node: freeze325190 Node: geometry325567 Node: geomview-version326124 Node: hdefine326401 Node: hdelete327188 Node: help328458 Node: hmodel328783 Node: hsphere-draw329063 Node: if329469 Node: inhibit-warning329844 Node: input-translator330276 Node: interest331064 Node: lambda332869 Node: let334138 Node: lines-closer335038 Node: load335917 Node: load-path336659 Node: look337097 Node: look-encompass337974 Node: look-encompass-size338567 Node: look-recenter339329 Node: look-toward340033 Node: merge340675 Node: merge-ap341122 Node: merge-base-ap341488 Node: merge-baseap341748 Node: mod342141 Node: morehelp342326 Node: name-object342589 Node: ND-axes343041 Node: ND-color344659 Node: ND-xform346041 Node: ND-xform-get346596 Node: ND-xform-set347138 Node: new-alien347801 Node: new-camera348711 Node: new-center349120 Node: new-geometry349653 Node: new-reset350217 Node: NeXT350435 Node: normalization350723 Node: not352194 Node: or352492 Node: pick352812 Node: pick-invisible354769 Node: pickable355127 Node: position355421 Node: position-at355651 Node: position-toward356030 Node: process-events356484 Node: progn357082 Node: quit357425 Node: quote357596 Node: rawevent357907 Node: rawpick358338 Node: read358652 Node: real-id359350 Node: redraw359897 Node: regtable360198 Node: rehash-emodule-path360381 Node: replace-geometry361101 Node: rib-display361380 Node: rib-snapshot362203 Node: scale362621 Node: scene363579 Node: set-clock363789 Node: set-conformal-refine364154 Node: set-emodule-path364891 Node: set-load-path365696 Node: set-motionscale366249 Node: setenv366984 Node: setq367338 Node: sgi368374 Node: shell368599 Node: sleep-for368901 Node: sleep-until369253 Node: snapshot369876 Node: soft-shader371624 Node: space371867 Node: stereowin372082 Node: time-interests373029 Node: transform373931 Node: transform-incr375832 Node: transform-set376667 Node: truncate377024 Node: ui-cam-focus377213 Node: ui-center378314 Node: ui-center-origin378570 Node: ui-emotion-program379388 Node: ui-emotion-run379706 Node: ui-freeze380003 Node: ui-html-browser380233 Node: ui-motion380792 Node: ui-panel382619 Node: ui-pdf-viewer383730 Node: ui-target384287 Node: uninterest384837 Node: update385158 Node: update-draw385479 Node: while385842 Node: window386043 Node: winenter386460 Node: write386765 Node: write-comments387903 Node: write-handle389315 Node: write-sexpr389645 Node: xform389942 Node: xform-incr390193 Node: xform-set390525 Node: zoom390790 Node: Geometrias Nao-Euclidianas391017 Node: Mathematica393509 Node: OOGL.m395021 Node: Geomview.m396935 Node: RenderMan399655 Node: Remote Display402356 Node: Networked Geomview403099 Node: Chunks405009 Node: Package Details406507 Node: Package Installation407997 Node: Instalacao412321 Node: Unix Binary Installation413451 Node: Unix Binary Detail416691 Node: Source Code Installation419582 Node: Suporte423627 Node: Contribuindo424799 Node: Indice de Funcoes426401 Node: Lista de Figuras439203  End Tag Table geomview-1.9.5/doc/geomview-pt_BR-10000644000175000017500000107711312310147167013761 00000000000000This is ../../doc/geomview-pt_BR, produced by makeinfo version 4.13 from ../../doc/geomview-pt_BR.texi. INFO-DIR-SECTION Graphics Applications START-INFO-DIR-ENTRY * Geomview: (geomview-pt_BR). Programa interativo de visualizac,a~o tridimensional. END-INFO-DIR-ENTRY  File: geomview-pt_BR, Node: Top, Next: Intro, Prev: (dir), Up: (dir) Programa interativo de visualizac,a~o tridimensional. * Menu: * Intro:: Introduc,a~o ao Geomview. * Distrib:: Como acessar a versa~o mais recente do Geomview. * Copiando:: A Licenc,a Pu'blica Geral Menor do GNU. * Historia:: Histo'ria do Desenvolvimento do Geomview. * Plantaformas:: Plantaformas Suportadas. * Pronuncia:: Como Pronunciar ``Geomview''. * Visao Geral:: Visa~o Geral do Geomview. * Tutorial:: Tutorial Introduto'rio. * Interacao:: Interagindo com Geomview. * Formatos dos Arquivos da OOGL:: Formatos para Inserc,a~o de Dados Geome'tricos. * Customizacao:: Modificando o comportamento do Geomview. * Modulos:: Programas que usam Geomview para exibic,a~o de imagens. * GCL:: GCL: a Linguagem de Comandos do Geomview. * Geometrias Nao-Euclidianas:: Geometrias Na~o Euclideanas. * Mathematica:: Gra'ficos do Mathematica no Geomview ou no RenderMan. * Instalacao:: Instalando o Geomview no seu computador. * Suporte:: Acessando o Suporte Te'cnico para o Geomview. * Contribuindo:: Como contribuir com o Geomview. * Indice de Funcoes:: Acesso ra'pido a cada func,a~o da GCL. * Lista de Figuras:: Lista de Figuras.  File: geomview-pt_BR, Node: Intro, Next: Distrib, Prev: Top, Up: Top Introduc,a~o ao Geomview ************************ Geomview e' um programa interativo para visualizar e controlar objetos geome'tricos, originalmente escrito pelos membros do estado maior do Geometry Center na Universidade de Minesota (EUA), comec,ando em 1991. O Geomview pode ser usado como um visualizador independente para objetos esta'ticos ou como um mecanismo de visualizac,a~o para outros programas que produzem dinamicamente mudanc,as geome'tricas. Geomview roda sobre muitos tipos de computadores Unix, incluindo Linux, SGI, Sun, e HP. Geomview tambe'm executa com Cygwin. Esse manual descreve Geomview em sua versa~o 1.9. Geomview e' um "software" livre, disponi'vel sob os termos da Licenc,a Pu'blica Geral Menor do GNU ; veja *note Copiando:: para detalhes. Geomview e esse manual podem ser encontrados em `http://www.geomview.org'. E' permitido fazer co'pias desse manual. Se voce^ tiver du'vidas ou comenta'rios sobre o Geomview ou esse manual, considere inscrever-se na lista de correio eletro^nico `geomview-users', que e' um fo'rum no qual usua'rios do Geomview comunicam-se para responder outras questo~es e para compartilhar noti'cias sobre o que eles esta~o fazendo com o Geomview. Os autores do Geomview participam dessa lista e algumas vezes enviam respostas a questionamentos existentes. Para assinar a lista, visite a pa'gina da lista no si'tio `http://lists.sourceforge.net/mailman/listinfo/geomview-users'.  File: geomview-pt_BR, Node: Distrib, Next: Copiando, Prev: Intro, Up: Top Distribuic,a~o ************** Geomview e' um "software" livre; isso significa que qualquer um e' livre para usa'-lo e livre para redistribui'-lo sob certas condic,o~es. Geomview na~o e' de domi'nio pu'blico; e' protegido por direitos autorais e existem restric,o~es sobre sua distribuic,a~o, mas essas restric,o~es sa~o montadas de forma a permitir qualquer coisa que um bom cidada~o colaborador possa querer fazer. O que na~o e' permitido e' para tentar previnir outros de compartilhamento adicional de qualquer versa~o do Geomview que eles possam pegar de voce^. As condic,o~es precisas podem ser encontradas na Licenc,a Geral Menor do GNU que acompanha o Geomview e tambe'm aparece acompanhando essa sec,a~o. Uma forma de acessar uma co'pia do Geomview e' a partir de algue'm que ja' possua o Geomview. Voce^ na~o precisa perguntar por nossa permissa~o para fazer isso, ou informar qualquer coisa; apenas fac,a a co'pia. Se voce^ tiver acesso a` internet, voce^ pode pegar a mais recente versa~o do Geomview em `http://www.geomview.org'. Voce^ tambe'm pode receber Geomview quando voce^ compra um computador. Fabricantes de computadores esta~o livres para distribuir co'pias sob os mesmos termos que sa~o aplicados a qualquer pessoa. Esses termos requerem que os fabricantes fornec,am a voce^ o co'digo completo, incluindo qualquer mudanc,as que eles tenham feito, e permitam a voce^ que redistribua o Geomview recebido deles nos termos usuais da Licenc,a Pu'blica Geral Menor do GNU. Em outras palavras, o programa deve ser livre para voce^ quando voce^ o receber, na~o apenas livre para o fabricante.  File: geomview-pt_BR, Node: Copiando, Next: Historia, Prev: Distrib, Up: Top Copiando ******** NOTA: Geomview e' distribui'do sob a LICENC,A PU'BLICA GERAL MENOR. Para os propo'sitos dessa licenc,a no's pensamos em Geomview como se ele fosse uma "biblioteca", e dos mo'dulos externos do Geomview como "programas que se comunicam com a biblioteca". Fazemos isso porque queremos especificamente permitir que programas proprieta'rios e mo'dulos usem o Geomview. LICENC,A PU'BLICA GERAL DO GNU ****************************** Version 2.1, February 1999 Licenc,a Pu'blica Geral Menor do GNU This is an unofficial translation of the GNU Lesser General Public License into Portuguese. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GNU LGPL-only the original English text of the GNU LGPL does that. However, we hope that this translation will help Portuguese speakers understand the GNU LGPL better. Esta e' uma traduc,a~o na~o-oficial da GNU Lesser General Public License para o Portugue^s. Ela na~o e' publicada pela Free Software Foundation e na~o traz os termos de distribuic,a~o legal do software que usa a GNU LGPL - estes termos esta~o contidos apenas no texto da GNU LGPL original em ingle^s. No entanto, esperamos que esta traduc,a~o ajudara' no melhor entendimento da GNU LGPL em Portugue^s. Versa~o 2.1, Fevereiro de 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA [Estados Unidos da Ame'rica] E' permitido a qualquer pessoa copiar e distribuir co'pias sem alterac,o~es deste documento de licenc,a, sendo vedada, entretanto, sua modificac,a~o. [Esta e' a primeira versa~o da GPL Menor a ser lanc,ada. Ela tambe'm constitui a sucessora da Licenc,a Pu'blica de Biblioteca do GNU, dai' o nu'mero 2.1. da versa~o]. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Introduc,a~o ============ As licenc,as da maioria dos softwares sa~o elaboradas para suprimir sua liberdade de compartilha'-los e modifica'-los. As Licenc,as Pu'blicas do GNU, ao contra'rio, te^m o objetivo de assegurar sua liberdade para compartilhar e modificar softwares livres para garantir que o software seja livre para todos os seus usua'rios. A presente Licenc,a Pu'blica Geral Menor se aplica a alguns pacotes de software especialmente designados - normalmente bibliotecas - da Free Software Foundation e de outros autores que decidam utiliza'-la. Voce^ pode utiliza'-la tambe'm, mas recomendamos que antes, voce^ analise cuidadosamente se esta licenc,a, ou a Licenc,a Pu'blica Geral comum, e' a melhor estrate'gia a ser adotada em cada caso especi'fico, tendo como base as explicac,o~es abaixo. Quando falamos de software livre, estamos nos referindo a liberdade de uso e na~o de gratuidade de prec,o. Nossas Licenc,as Pu'blicas Gerais sa~o elaboradas para garantir que voce^ tenha liberdade para distribuir co'pias de software livre (cobrando por esse servic,o se voce^ assim o desejar); que voce^ receba co'digo-fonte ou o obtenha, se quiser; que voce^ modifique o software e utilize partes dele em novos programas livres; e que voce^ tenha cie^ncia de que pode praticar estes atos. A fim de proteger seus direitos, e' necessa'rio que fac,amos restric,o~es que proi'bam distribui'dores de negar estes direitos a voce^ ou de pedir que voce^ que renuncie a eles. Essas restric,o~es se traduzem em determinadas responsabilidades que voce^ devera' assumir, se vier a distribuir co'pias da biblioteca ou modifica'-la. Por exemplo, se voce^ distribuir co'pias da biblioteca, seja gratuitamente ou mediante um valor, tera' de conceder a seus receptores todos os direitos que estamos concedendo a voce^. Voce^ tera' de garantir que eles, tambe'm, recebam ou possam obter o co'digo fonte. Se voce^ ligar outro co'digo com a biblioteca, voce^ deve fornecer os arquivos-objeto completos para os receptores, de modo que eles possam liga'-los novamente com a biblioteca apo's terem feito mudanc,as na biblioteca e recompilado a mesma. E voce^ tera' de exibir a eles esses termos, para que eles conhec,am seus direitos. Protegemos seus direitos atrave's de um me'todo que envolve dois passos: (1) estabelecemos direitos autorais sobre a biblioteca e (2) oferecemos a voce^ esta licenc,a, que da' a voce^ permissa~o para copiar, distribuir e/ou modificar a biblioteca. Para proteger cada distribuidor, queremos deixar bem claro que na~o ha' nenhuma garantia para a biblioteca livre. Ale'm disso, se a biblioteca for modificada por algue'm e passada adiante, os receptores devem saber que o que eles te^m na~o e' a versa~o original, de modo que a reputac,a~o do autor original na~o sera' afetada por problemas que possam ser introduzidos por outros. Por fim, as patentes de software representam uma ameac,a constante para a existe^ncia de qualquer programa livre. Queremos assegurar que uma empresa na~o possa efetivamente restringir os usua'rios de um programa livre por ter obtido uma licenc,a restritiva de um titular de direitos de patente. Por isso, insistimos que qualquer licenc,a de patente obtida para alguma versa~o da biblioteca seja consistente com a plena liberdade de uso, especificada nesta licenc,a. A maior parte dos softwares do GNU, incluindo algumas bibliotecas, esta' coberta pela Licenc,a Pu'blica Geral comum do GNU. A presente Licenc,a Pu'blica Geral Menor do GNU se aplica a determinadas bibliotecas designadas, sendo bastante diferente da Licenc,a Pu'blica Geral comum. Usamos esta licenc,a para determinadas bibliotecas, a fim de permitir a ligac,a~o dessas bibliotecas a programas na~o-livres. Quando um programa e' ligado a uma biblioteca, seja estaticamente ou usando uma biblioteca compartilhada, essa combinac,a~o das duas e' em termos legais uma obra combinada, uma derivac,a~o da biblioteca original. Por essa raza~o, a Licenc,a Pu'blica Geral comum somente permite essa ligac,a~o se a combinac,a~o como um todo atender a seus crite'rios de liberdade. A Licenc,a Pu'blica Geral Menor permite crite'rios mais flexi'veis para a ligac,a~o de outros co'digos a` biblioteca. Chamamos esta licenc,a de Licenc,a Pu'blica Geral "Menor" porque ela faz Menos para proteger a liberdade do usua'rio do que a Licenc,a Pu'blica Geral comum. Ela tambe'm oferece a outros desenvolvedores de software livre uma Menor vantagem na competic,a~o com com programas na~o livres. Essas desvantagens sa~o o motivo pelo qual usamos a Licenc,a Pu'blica Geral comum para muitas bibliotecas. Por outro lado, em determinadas circunsta^ncias especiais, a licenc,a Menor oferece vantagens. Por exemplo, em raras ocasio~es, pode existir uma necessidade especial de se incentivar a mais ampla utilizac,a~o possi'vel de uma determinada biblioteca, para que ela se torne um padra~o de fato. Para conseguir isso, deve-se permitir que programas na~o-livres utilizem a biblioteca. Um caso mais frequ"ente ocorre quando uma biblioteca livre desempenha a mesma func,a~o de bibliotecas na~o-livres amplamente usadas. Nesse caso, existem poucas vantagens em restringir a biblioteca livre somente para software livre, enta~o utilizamos a Licenc,a Pu'blica Geral Menor. Em outros casos, a permissa~o para usar uma determinada biblioteca em programas na~o-livres possibilita que um maior nu'mero de pessoas use um amplo leque de softwares livres. Por exemplo, a permissa~o para usar a Biblioteca C do GNU permite que muito mais pessoas usem todo o sistema operacional do GNU, bem como sua variante, o sistema operacional do GNU/Linux. Mesmo protegendo a liberdade dos usua'rios em menor grau, a Licenc,a Pu'blica Geral Menor garante ao usua'rio de um programa que esteja ligado a` Biblioteca a liberdade e os meios para executar o programa, usando uma versa~o modificada da Biblioteca. Seguem abaixo os termos e condic,o~es exatos para a co'pia, distribuic,a~o e modificac,a~o. Preste muita atenc,a~o a` diferenc,a entre uma "obra baseada na biblioteca" e uma "obra que usa a biblioteca". O primeiro conte'm co'digo que e' derivado da biblioteca, enquanto o segundo tem de ser combinado a` biblioteca para que possa ser executado. TERMOS E CONDIC,O~ES PARA CO'PIA, DISTRIBUIC,A~O E MODIFICAC,A~O ================================================================ 0. O presente Contrato de Licenc,a se aplica a qualquer biblioteca de software ou a outro programa que contenha um aviso colocado pelo titular dos direitos autorais ou outra parte autorizada, informando que ela pode ser distribui'da nos termos desta Licenc,a Pu'blica Geral Menor (tambe'm denominada "esta Licenc,a"). Cada licenciado doravante sera' denominado "voce^". Uma "biblioteca" significa uma colec,a~o de func,o~es de software e/ou dados preparados, de forma a serem convenientemente ligados com programas de aplicac,a~o (que usam algumas dessas func,o~es e dados) para formar executa'veis. O termo "Biblioteca", abaixo, refere-se a qualquer biblioteca de software ou obra que tenha sido distribui'da de acordo com esses termos. Uma "obra baseada na Biblioteca" significa tanto a Biblioteca como qualquer obra derivada, nos termos da legislac,a~o autoral: isto e', uma obra contendo a Biblioteca ou parte dela, seja sem alterac,o~es ou com modificac,o~es e/ou traduzida diretamente para outra linguagem. (Doravante, o termo "modificac,a~o" inclui, sem reservas, o termo "traduc,a~o"). O "co'digo-fonte" de uma obra significa o formato preferencial da obra para que sejam feitas modificac,o~es na mesma. Para uma biblioteca, o co'digo-fonte completo significa todo o co'digo fonte para todos os mo'dulos contidos na mesma, ale'm de quaisquer arquivos de definic,a~o de interface associados, ale'm dos scripts utilizados para controlar a compilac,a~o e a instalac,a~o da biblioteca. Outras atividades que na~o a co'pia, distribuic,a~o e modificac,a~o na~o sa~o cobertas por esta Licenc,a; elas esta~o fora de seu escopo. O ato de executar um programa usando a Biblioteca na~o tem restric,o~es, e o resultado gerado a partir desse programa encontra-se coberto somente se seu conteu'do constituir uma obra baseada na Biblioteca (independente do uso da Biblioteca em uma ferramenta para escreve^-lo). Na verdade, isto dependera' daquilo que a Biblioteca faz e o que o programa que usa a biblioteca faz. 1. Voce^ pode copiar e distribuir co'pias sem alterac,o~es do co'digo-fonte completo da Biblioteca ao recebe^-lo, em qualquer meio ou mi'dia, desde que publique, ostensiva e adequadamente, um aviso de direitos autorais (ou copyright) apropriado e uma notificac,a~o sobre a exonerac,a~o de garantias; mantenha intactas as informac,o~es, avisos ou notificac,o~es referentes a esta Licenc,a e a` ause^ncia de qualquer garantia; e distribua uma co'pia desta Licenc,a junto com a Biblioteca. Voce^ podera' cobrar um valor pelo ato fi'sico de transferir uma co'pia, e voce^ pode oferecer, se quiser, a protec,a~o de uma garantia em troca de um valor. 2. Voce^ pode modificar sua co'pia ou co'pias da Biblioteca ou qualquer parte dela, formando, assim, uma obra baseada na Biblioteca, bem como copiar e distribuir essas modificac,o~es ou obra, em conformidade com a Cla'usula 1 acima, desde que atenda, ainda, a todas as seguintes condic,o~es: a. A obra modificada tem de ser, por si so', uma biblioteca de software. b. Voce^ tem de fazer com que os arquivos modificados contenham avisos, em destaque, de que voce^ modificou os arquivos e a data de qualquer modificac,a~o. c. Voce^ tem de fazer com que a obra como um todo seja licenciada, sem nenhum custo, a todos os terceiros, de acordo com esta Licenc,a. d. Se um dispositivo, na Biblioteca modificada, se referir a uma func,a~o ou a uma tabela de dados a ser fornecida por um programa de aplicac,a~o que usa esse dispositivo, outro que na~o um argumento transmitido quando o dispositivo e' invocado, nesse caso, voce^ tera' de fazer um esforc,o de boa-fe' para assegurar que, no caso de uma aplicac,a~o que na~o fornec,a essa func,a~o ou tabela, o dispositivo ainda assim opere, e ira' realizar qualquer parte de sua finalidade que permanecer significativa. (Por exemplo, uma func,a~o de uma biblioteca para computar rai'zes quadradas tem uma finalidade que e' completamente bem definida independentemente da aplicac,a~o. Por essa raza~o, a letra d, da Cla'usula 2, exige que qualquer func,a~o ou tabela fornecida pela aplicac,a~o, usada por essa func,a~o, tem de ser opcional: se a aplicac,a~o na~o fornece^-la, a func,a~o de rai'zes quadradas devera' ainda assim computar rai'zes quadradas). Essas exige^ncias se aplicam a` obra modificada como um todo. Se partes identifica'veis dessa obra na~o forem derivadas da Biblioteca e puderem ser consideradas razoavelmente, em si, como obras independentes e separadas, nesse caso, esta Licenc,a e seus termos na~o se aplicara~o a essas partes quando voce^ distribui-las como obras separadas. Todavia, quando voce^ distribuir essas mesmas partes como partes de um todo, que por si seja uma obra baseada na Biblioteca, a distribuic,a~o desse todo devera' ser realizada de acordo com esta Licenc,a, cujas respectivas permisso~es para outros licenciados extendem-se a` integralidade deste todo, dessa forma, a toda e qualquer parte, independentemente de quem a escreveu. Assim, esta cla'usula na~o tem a intenc,a~o de afirmar direitos ou contestar os seus direitos sobre uma obra escrita inteiramente por voce^; a intenc,a~o e', antes, de exercer o direito de controlar a distribuic,a~o de obras derivadas ou obras coletivas baseadas na Biblioteca. Ale'm disto, a simples agregac,a~o de outra obra, que na~o seja baseada na Biblioteca, a` Biblioteca (ou a uma obra baseada na Biblioteca) em um volume de meio ou mi'dia de armazenamento ou distribuic,a~o, na~o inclui esta outra obra no a^mbito desta Licenc,a. 3. Voce^ podera' optar por aplicar os termos da Licenc,a Pu'blica Geral do GNU ao inve's desta Licenc,a, para uma determinada co'pia da Biblioteca. Para tanto, voce^ devera' alterar todos os avisos ou notificac,o~es que se refiram a esta Licenc,a, para que eles se refiram a` Licenc,a Pu'blica Geral comum do GNU, versa~o 2, ao inve's desta Licenc,a. (Se uma versa~o mais nova do que a versa~o 2 da Licenc,a Pu'blica Geral comum do GNU tiver sido gerada, enta~o voce^ podera' especificar essa versa~o, se preferir). Na~o fac,a nenhuma outra alterac,a~o nesses avisos ou notificac,o~es. Uma vez que essa alterac,a~o tenha sido feita em uma determinada co'pia, ela e' irreversi'vel para esta co'pia, passando a Licenc,a Pu'blica Geral comum do GNU a ser aplicada para todas as co'pias e obras derivadas subsequ"entes, feitas a partir dessa co'pia. Essa opc,a~o e' u'til quando voce^ desejar copiar parte do co'digo da Biblioteca em um programa que na~o seja uma biblioteca. 4. Voce^ podera' copiar e distribuir a Biblioteca (ou uma parte ou obra derivada dela, de acordo com a Cla'usula 2) em co'digo-objeto ou formato executa'vel, sob as Cla'usulas 1 e 2 acima, desde que inclua todo o co'digo-fonte correspondente, passi'vel de leitura pela ma'quina, que deve ser distribui'do sob os termos das Cla'usulas 1 e 2 acima, em um meio ou mi'dia costumeiramente utilizado para o interca^mbio de software. Se a distribuic,a~o do co'digo-objeto for feita pela oferta de acesso para co'pia a partir de um local designado, enta~o a permissa~o de acesso equivalente para copiar o co'digo-fonte a partir do mesmo local atende a exige^ncia de distribuic,a~o do co'digo-fonte, mesmo que terceiros na~o sejam levados a copiar a fonte junto com o co'digo-objeto. 5. Um programa que na~o contenha nenhum derivativo de qualquer parte da Biblioteca, mas que seja desenhado para operar com a Biblioteca ao ser compilado ou ligado a ela, e' chamado de uma "obra que usa a Biblioteca". Essa obra, isoladamente, na~o e' uma obra derivada da Biblioteca e, portanto, fica de fora do a^mbito desta Licenc,a. Entretanto, a ligac,a~o de uma "obra que usa a Biblioteca" com a Biblioteca constitui um executa'vel que e' um derivado da Biblioteca (pois conte'm partes da Biblioteca), e na~o uma "obra que usa a Biblioteca". O executa'vel e', assim, coberto por esta Licenc,a. A Cla'usula 6 estabelece os termos para a distribuic,a~o desses executa'veis. Quando uma "obra que usa a Biblioteca" usar material de um arquivo de cabec,alho que e' parte da Biblioteca, o co'digo-objeto para a obra podera' ser uma obra derivada da Biblioteca, mesmo que o co'digo-fonte na~o o seja. Para que isto seja verdade, e' especialmente importante se a obra pode ser ligada sem a Biblioteca, ou se a obra e', em si mesma, uma biblioteca. O limiar para que isto seja verdade na~o e' definido com precisa~o pela lei. Se um arquivo-objeto usar somente para^metros nume'ricos, layouts e accessors da estrutura de dados, bem como pequenas macros e pequenas func,o~es inline (dez linhas ou menos de extensa~o), enta~o o uso do arquivo-objeto na~o e' restrito, independente de ser ele legalmente uma obra derivada. (Executa'veis contendo este co'digo-objeto mais partes da Biblioteca continuam submetidos aos termos da Cla'usula 6). Do contra'rio, se a obra for um derivado da Biblioteca, voce^ podera' distribuir o co'digo objeto da obra sob os termos da Cla'usula 6. Quaisquer executa'veis contendo esta obra tambe'm se submetmem a` Cla'usula 6, estejam ou na~o diretamente ligados a` Biblioteca em si. 6. Como excec,a~o a` Cla'usula acima, voce^ tambe'm pode combinar ou ligar uma "obra que usa a Biblioteca" a` Biblioteca para produzir uma obra contendo partes da Biblioteca e distribui'-la de acordo com os termos de sua escolha, desde que estes termos permitam modificac,o~es na obra para uso pro'prio por parte do cliente e engenharia reversa para depurac,a~o dessas modificac,o~es. Em cada co'pia da obra, voce^ tera' de colocar um aviso, em destaque, de que a Biblioteca foi usada e que ela e seu uso esta~o cobertos por esta Licenc,a. Voce^ devera' fornecer uma co'pia desta Licenc,a. Se, durante a execuc,a~o, a obra exibir avisos ou notificac,o~es de direitos autorais (ou copyright), voce^ tera' de incluir, entre eles, o aviso de direitos autorais (ou copyright) referente a` Biblioteca, bem como uma refere^ncia direcionando o usua'rio para a co'pia desta Licenc,a. Ale'm disso, voce^ dever tomar ao menos uma das seguintes provide^ncias: a. Incluir na obra todo o co'digo-fonte da Biblioteca, passi'vel de leitura pela ma'quina, incluindo quaisquer modificac,o~es que foram usadas na obra (as quais devem ser distribui'das conforme as Cla'usulas 1 e 2 acima); e, se a obra for um executa'vel ligado a` Biblioteca, com toda a "obra que usa a Bilblioteca" passi'vel de leitura pela ma'quina, como co'digo-objeto e/ou co'digo-fonte, de modo que o usua'rio possa modificar a biblioteca e, depois, religar para produzir um executa'vel modificado contendo a Biblioteca modificada. (Fica entendido que o usua'rio que modificar o conteu'do dos arquivos de definic,o~es da Biblioteca na~o necessariamente sera' capaz de recompilar a aplicac,a~o para usar as definic,o~es modificadas). b. Usar um mecanismo adequado de biblioteca compartilhada para ligar com a Biblioteca. Um mecanismo adequado e' aquele que (a) usa, ao tempo da execuc,a~o, uma co'pia da biblioteca ja' presente no sistema do computador do usua'rio, e (2) ira' operar adequadamente com uma versa~o modificada da biblioteca, se o usua'rio instalar uma, desde que a versa~o modificada seja compati'vel com a interface da versa~o com a qual a obra foi feita. c. Incluir na obra uma oferta por escrito, va'lida por pelo menos 3 anos, oferencendo ao mesmo usua'rio os materiais especificados na letra "a" da Cla'usula 6 acima, por um custo na~o superior ao custo de fazer esta distribuic,a~o. d. Se a distribuic,a~o da obra for feita com a permissa~o de acesso para copiar, a partir de um local designado, oferecer acesso equivalente para copiar os materiais acima especificados, a partir do mesmo local. e. Certificar-se se o usua'rio ja' recebeu uma co'pia desses materiais ou de que voce^ ja' enviou uma co'pia a esse usua'rio. Para um executa'vel, o formato exigido da "obra que usa a Biblioteca" deve incluir quaisquer dados e programas utilita'rios necessa'rios para reproduc,a~o do executa'vel a partir dele. Todavia, como uma excec,a~o especial, os materiais a serem distribui'dos na~o necessitam incluir algo que seja normalmente distribui'do (tanto no formato fonte quanto bina'rio) com os componentes mais importantes (compilador, kernel, e assim por diante) do sistema operacional no qual executa'vel e' executado, a menos que esse componente, em si, acompanhe o executa'vel. Pode ocorrer que essa exige^ncia contradiga as restric,o~es da licenc,a de outras bibliotecas proprieta'rias que normalmente na~o acompanham o sistema operacional. Essa contradic,a~o significa que voce^ na~o pode utilizar ambas e a Biblioteca juntas em um executa'vel distribui'do por voce^. 7. Voce^ pode colocar dispositivos da biblioteca que sejam uma obra baseada na Biblioteca lado-a-lado em uma u'nica biblioteca junto com outros dispositivos de bibliotecas, desde que uma distribuic,a~o separada da obra baseada na Biblioteca e dos outros dispositivos de bibliotecas seja, de outro modo, permitida e desde que voce^ tome uma das seguintes provide^ncias: a. Incluir na biblioteca combinada uma co'pia dessa obra baseada na Biblioteca sem a combinac,a~o com quaisquer outros dispositivos de biblioteca. Essa co'pia tem de ser distribui'da de acordo com as condic,o~es das cla'usulas acima. b. Junto com a biblioteca combinada, fornecer um aviso, em destaque, sobre o fato de que parte dela e' uma obra baseada na Biblioteca, e explicando onde encontrar o formato na~o combinado incluso dessa mesma obra. 8. Voce^ na~o podera' copiar, modificar, sublicenciar, ligar, ou distribuir a Biblioteca, exceto conforme expressamente disposto nesta Licenc,a. Qualquer tentativa de, de outro modo, copiar, modificar, sublicenciar, ligar ou distribuir a Biblioteca e' inva'lida, e automaticamente terminara' seus direitos sob esta Licenc,a. Todavia, terceiros que tiverem recebido co'pias ou direitos de voce^, de acordo com esta Licenc,a, na~o tera~o seus direitos rescindidos, enquanto estes terceiros mantiverem o seu pleno cumprimento. 9. Voce^ na~o e' obrigado a aceitar esta Licenc,a, uma vez que voce^ na~o a assinou. Entretanto, nada mais concede a voce^ permissa~o para modificar ou distribuir a Biblioteca ou suas obras derivadas. Esses atos sa~o proibidos por lei se voce^ na~o aceitar esta Licenc,a. Portanto, ao modificar ou distribuir a Biblioteca (ou qualquer obra baseada na Biblioteca), voce^ manifesta sua aceitac,a~o desta Licenc,a para faze^-lo, bem como de todos os seus termos e condic,o~es para co'pia, distribuic,a~o ou modificac,a~o da Biblioteca ou obras nela baseadas. 10. A cada vez que voce^ redistribuir a Biblioteca (ou qualquer obra nela baseada), o receptor automaticamente recebe uma licenc,a do licenciante original para copiar, distribuir, ligar ou modificar a Biblioteca, sujeito a estes respectivos termos e condic,o~es. Voce^ na~o podera' impor quaisquer restric,o~es adicionais ao exerci'cio, pelos receptores, dos direitos concedidos por este instrumento. Voce^ na~o tem responsabilidade de promover o cumprimento desta licenc,a por parte de terceiros. 11. Se, como resultado de uma sentenc,a judicial ou alegac,a~o de violac,a~o de patente, ou por qualquer outro motivo (na~o restrito a`s questo~es de patentes), forem impostas a voce^ condic,o~es (tanto atrave's de mandado judicial, contrato ou qualquer outra forma) que contradigam as condic,o~es desta Licenc,a, voce^ na~o estara' desobrigado quanto a`s condic,o~es desta Licenc,a. Se voce^ na~o puder atuar como distribuidor de modo a satisfazer simultaneamente suas obrigac,o~es sob esta Licenc,a e quaisquer outras obrigac,o~es pertinentes, enta~o, como consequ"e^ncia, voce^ na~o podera' distribuir a Biblioteca de nenhuma forma. Por exemplo, se uma licenc,a sob uma patente na~o permite a redistribuic,a~o por parte de todos aqueles que tiverem recebido co'pias, direta ou indiretamente de voce^, sem o pagamento de royalties, enta~o, a u'nica forma de cumprir tanto com esta exige^ncia quanto com esta licenc,a sera' deixar de distribuir, por completo, a Biblioteca. Se qualquer parte desta Cla'usula for considerada inva'lida ou na~o executa'vel, sob qualquer circunsta^ncia especi'fica, o restante da cla'usula devera' continuar a ser aplicado e a cla'usula, como um todo, devera' ser aplicada em outras circunsta^ncias. Esta cla'usula na~o tem a finalidade de induzir voce^ a infringir quaisquer patentes ou direitos de propriedade, nem de contestar a validade de quaisquer reivindicac,o~es deste tipo; a u'nica finalidade desta cla'usula e' proteger a integridade do sistema de distribuic,a~o do software livre, o qual e' implementado mediante pra'ticas de licenc,as pu'blicas. Muitas pessoas te^m feito generosas contribuic,o~es a` ampla gama de software distribui'do atrave's desse sistema, confiando na aplicac,a~o consistente deste sistema; cabe ao autor/doador decidir se deseja distribuir software atrave's de qualquer outro sistema e um licenciado na~o pode impor esta escolha. Esta cla'usula visa deixar absolutamente claro o que se acredita ser uma consequ"e^ncia do restante desta Licenc,a. 12. Se a distribuic,a~o e/ou uso da Biblioteca for restrito em determinados pai'ses, tanto por patentes ou por interfaces protegidas por direito autoral, o titular original dos direitos autorais que colocar a Biblioteca sob esta Licenc,a podera' acrescentar uma limitac,a~o geogra'fica de distribuic,a~o expli'cita excluindo esses pai'ses, de modo que a distribuic,a~o seja permitida somente nos pai'ses ou entre os pai'ses que na~o foram exclui'dos dessa forma. Nesse caso, esta Licenc,a passa a incorporar a limitac,a~o como se esta tivesse sido escrita no corpo desta Licenc,a 13. A Free Software Foundation [Fundac,a~o Software Livre] podera' de tempos em tempos publicar verso~es revisadas e/ou novasda Licenc,a Pu'blica Geral Menor. Essas novas verso~es sera~o semelhantes em espi'rito a` presente versa~o, podendo, pore'm, ter diferenc,as nos detalhes, para tratar de novos problemas ou preocupac,o~es. Cada versa~o recebe um nu'mero distinto de versa~o. Se a Biblioteca especificar um nu'mero de versa~o desta Licenc,a, aplica'vel a` Biblioteca ou a "qualquer versa~o posterior", voce^ tera' a opc,a~o de seguir os termos e condic,o~es tanto daquela versa~o como de qualquer versa~o posterior publicada pela Free Software Foundation. Se a Biblioteca na~o especificar um nu'mero de licenc,a da versa~o, voce^ podera' escolher qualquer versa~o ja' publicada pela Free Software Foundation. 14. Se voce^ desejar incorporar partes da Biblioteca em outros programas livres cujas condic,o~es de distribuic,a~o sejam incompati'veis com estas, escreva ao autor para solicitar permissa~o. Para software cujos direitos autorais pertencerem a` Free Software Foundation, escreva a` Fundac,a~o; algumas vezes, fazemos excec,o~es nesse sentido. Nossa decisa~o sera' guiada pelos dois objetivos de preservar a condic,a~o livre de todos os derivados de nosso software livre e de promover o compartilhamento e reutilizac,a~o de softwares, de modo geral. _ EXCLUSA~O DE GARANTIA_ 15. COMO A BIBLIOTECA E' LICENCIADA SEM CUSTO, NA~O HA' NENHUMA GARANTIA PARA A BIBLIOTECA, NO LIMITE PERMITIDO PELA LEI APLICA'VEL. EXCETO QUANDO DE OUTRA FORMA ESTABELECIDO POR ESCRITO, OS TITULARES DOS DIREITOS AUTORAIS E/OU OUTRAS PARTES FORNECEM A BIBLIOTECA "NO ESTADO EM QUE SE ENCONTRA", SEM NENHUMA GARANTIA DE QUALQUER TIPO, TANTO EXPRESSA COMO IMPLI'CITA, INCLUINDO, DENTRE OUTRAS, AS GARANTIAS IMPLI'CITAS DE COMERCIABILIDADE E ADEQUAC,A~O PARA UMA FINALIDADE ESPECI'FICA. O RISCO INTEGRAL QUANTO A` QUALIDADE E DESEMPENHO DA BIBLIOTECA E' ASSUMIDO POR VOCE^. CASO A BIBLIOTECA CONTENHA DEFEITOS, VOCE^ ARCARA' COM OS CUSTOS DE TODOS OS SERVIC,OS, REPAROS OU CORREC,O~ES NECESSA'RIAS. 16. EM NENHUMA CIRCUNSTA^NCIA, A MENOS QUE EXIGIDO PELA LEI APLICA'VEL OU ACORDADO POR ESCRITO, QUALQUER TITULAR DE DIREITOS AUTORAIS OU QUALQUER OUTRA PARTE QUE POSSA MODIFICAR E/OU REDISTRIBUIR A BIBLIOTECA, CONFORME PERMITIDO ACIMA, SERA' RESPONSA'VEL PARA COM VOCE^ POR DANOS, INCLUINDO ENTRE OUTROS QUAISQUER DANOS GERAIS, ESPECIAIS, FORTUITOS OU EMERGENTES, ADVINDOS DO USO OU IMPOSSIBILIDADE DE USO DA BIBLIOTECA (INCLUINDO, ENTRE OUTROS, PERDA DE DADOS, DADOS SENDO GERADOS DE FORMA IMPRECISA, PERDAS SOFRIDAS POR VOCE^ OU TERCEIROS OU A IMPOSSIBILIDADE DA BIBLIOTECA DE OPERAR COM QUALQUER OUTRO SOFTWARE), MESMO QUE ESSE TITULAR, OU OUTRA PARTE, TENHA SIDO AVISADO SOBRE A POSSIBILIDADE DESSES DANOS. FINAL DOS TERMOS E CONDIC,O~ES ============================== Como Aplicar Estes Termos para Suas Novas Bibliotecas ===================================================== Se voce^ desenvolver uma nova biblioteca e quiser que ela seja da maior utilidade possi'vel para o pu'blico, no's recomendamos fazer dela um software livre que todos possam redistribuir e modificar. Voce^ pode fazer isto permitindo a redistribuic,a~o sob estes termos (ou, alternativamente, sob os termos da Licenc,a Pu'blica Geral comum) Para fazer isto, anexe as notificac,o~es seguintes a` biblioteca. E' mais seguro anexa'-las ao comec,o de cada arquivo-fonte, de modo a transmitir do modo mais eficiente a exclusa~o de garantia; e cada arquivo deve ter ao menos a linha de "direitos autorais reservados" e uma indicac,a~o de onde a notificac,a~o completa se encontra. UMA LINHA PARA INFORMAR O NOME DA BIBLIOTECA E UMA BREVE IDE'IA DO QUE ELA FAZ. Direitos Autorais Reservados (C) NOME DO AUTOR Esta biblioteca e' software livre; voce^ pode redistribui'-la e/ou modifica'-la sob os termos da Licenc,a Pu'blica Geral Menor do GNU conforme publicada pela Free Software Foundation; tanto a versa~o 2.1 da Licenc,a, ou (a seu crite'rio) qualquer versa~o posterior. Esta biblioteca e' distribui'do na expectativa de que seja u'til, pore'm, SEM NENHUMA GARANTIA; nem mesmo a garantia impli'cita de COMERCIABILIDADE OU ADEQUAC,A~O A UMA FINALIDADE ESPECI'FICA. Consulte a Licenc,a Pu'blica Geral Menor do GNU para mais detalhes. Voce^ deve ter recebido uma co'pia da Licenc,a Pu'blica Geral Menor do GNU junto com esta biblioteca; se na~o, escreva para a Free Software Foundation, Inc., no enderec,o 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. Inclua tambe'm informac,o~es sobre como contatar voce^ por correio eletro^nico e por meio postal. Voce^ tambe'm pode solicitar a seu empregador (se voce^ for um programador) ou a sua instituic,a~o acade^mica, se for o caso, para assinar uma "renu'ncia de direitos autorais" sobre a biblioteca, se necessa'rio. Segue um exemplo; altere os nomes: A Yoyodyne Ltda., neste ato, renuncia a todos eventuais direitos autorais sobre a biblioteca 'Frob' (uma biblioteca para ajustar fechaduras), escrita por James Random Hacker. , 1 de abril de 1990 Ty Coon, Presidente Isso e' tudo!  File: geomview-pt_BR, Node: Historia, Next: Plantaformas, Prev: Copiando, Up: Top Histo'ria do Desenvolvimento do Geomview **************************************** Geomview foi originalmente escrito no Geometry Center da the University of Minnesota in Minneapolis. O Geometry Center era um centro de pesquisa e educac,a~o fundado pela National Science Foundation, com a missa~o de promover pesquisa e comunicac,a~o de assuntos relacionados a` matema'tica. A maioria do trabalho era direcionado ao uso de computadores para ajudar a visualizac,a~o de conceitos matema'ticos. O projeto que eventualmente levou ao Geomview comec,ou no vera~o de 1988 com o trabalho de Pat Hanrahan sobre um programa de visualizac,a~o chamado MinneView. Pouco tempo depois Charlie Gunn comec,ou o desenvolvimento da OOGL (Object Oriented Graphics Language) juntamente com o MinneView. Muitas pessoas comtribuiram para a OOGL e o MinneView, incluindo Stuart Levy, Mark Meuer, Tamara Munzner, Steve Anderson, Mario Lopez, Todd Kaplan. Em 1991 o staff do Geometry Center comec,ou o trabalho sobre uma nova e melhorada versa~o da OOGL, e um novo e melhorado programa de visualizac,a~o, o qual eles chamaram Geomview. Naquele tempo essencialmente o u'nico jogo no comercio para gra'ficos interativos em tre^s dimenso~es era Silicon Graphics (SGI), de forma que Geomview foi desenvolvido inicialmente em estac,o~es de trabalho SGI, usando a IRIS GL. A primeira versa~o foi finalizada em Janeiro de 1992. Essa primeira versa~o tornou-se muito popular entre visitantes do Geometry Center, e atrave's do ftp do Centro (isso ocorreu antes do advento da web) pessoas em outras instituic,o~es comec,aram a usar essa primeira versa~o tambe'm. Adicionalmente a estac,o~es de trabalho SGI o Geometry Center tinha algumas poucas estac,o~es NeXT completas, de forma que apo's Geomview estar sendo executado em ma'quinas SGIs a equipe desenvolveu uma versa~o para NeXTStep tambe'm. Nessa e'poca ouveram muitos milhares de pessoas usando Geomview ao redor do mundo. Alguns anos depois a equipe portou Geomview para o X windows e a OpenGL, e eventualmente, com o desaparecimento da NeXT, a versa~o para NeXT seguiu o mesmo caminho. Nessa missa~o de incentivar a comunicac,a~o entre pesquisadores e educadores, o Geometry Center desenvolveu um web site, www.geom.umn.edu, mais tarde em 1993. Esse foi um dos primeiros 300 si'tios na web que existiram no mundo. Uma parte desse si'tio web era certamente devotado ao Geomview, e ajudou a propagar o trabalho durante sua existe^ncia. O Geometry Center fechou suas instalac,o~es de "tijolos e cimento" em Agosto de 1998 (NSF cortou suas verbas), mas o si'tio web continuou a existir, e o Geomview continuou a ser popular ao redor do mundo. Em Dezembro de 1999 algum membro da equipe original do Geometry Center configurou `http://www.geomview.org' como casa permanente na web para o Geomview. Os autores originais do Geomview, bem como va'rios outros voluna'rios ao redor do mundo, esta~o ainda ativamente envolvidos na utilizac,a~o e no desenvolvimento do Geomview. * Menu: * Autores:: Autores.  File: geomview-pt_BR, Node: Autores, Prev: Historia, Up: Historia Autores ======= Tamara Munzner, Stuart Levy, e Mark Phillips sa~o os autores originais do Geomview. Celeste Fowler, Charlie Gunn, e Nathaniel Thurston tambe'm fazem contribuic,o~es sgnificativas. Daniel Krech e Scott Wisdom fizeram o NeXTStep e a adaptac,a~o do RenderMan, e Daeron Meyer e Tim Rowley fizeram a adaptac,a~o para o X windows. Muitos outros membros do estado maior do Geometry Center, bem como muitas pessoas em muitos lugares, tambe'm contribui'ram. Mark Phillips escreveu esse manual, com ajuda substancial de Stuart Levy e Tamara Munzner. Inconta'veis usua'rios do Geomview tambe'm foram de grande ajuda por meio da leitura do manual e indicando nossos enganos.  File: geomview-pt_BR, Node: Plantaformas, Next: Pronuncia, Prev: Historia, Up: Top Plantaformas Suportadas *********************** Geomview 1.9 pode - em princi'pio - compilar e executar sobre quaisquer claramente recentes sistemas operacionais semelhantes ao Unix. Especificamente, Geomview executa sobre Linux e sobre Cygwin (Cygwin emula um ambiente semelhante ao SystemV Unix environment sob o Microsoft Windows). Desafortunadamente Geomview compila com MacOS X (Darwin), mas aparentemente comunicac,o~es com Geomview por meio de pipes e sockets causam falha de segmentaca~o. Sinta-se livre para consertar essa falha! Veja *note Contribuindo::, para detalhes.  File: geomview-pt_BR, Node: Pronuncia, Next: Visao Geral, Prev: Plantaformas, Up: Top Como Pronunciar "Geomview" ************************** A palavra 'Geomview' e' uma combinac,a~o da primeira si'laba da palavra 'geometry', e da palavra 'view'. Os autores pronunciam Geomview como uma palavra oxi'tona, isto e', tonicidade na primeira si'laba. GE-om-view Algumas pessoas colocam a tonicidade na segunda si'laba, onde Geomview cai na palavra 'geometry', mas os autores originais, que criaram o nome, preferem a pronu'ncia com tonicidade na primeira si'laba.  File: geomview-pt_BR, Node: Visao Geral, Next: Tutorial, Prev: Pronuncia, Up: Top 1 Visa~o Geral ************** O principal objetivo do Geomview e' mostrar objetos cuja geometria e' fornecida, permitindo controle interativo sobre detalhes tais como ponto de visa~o, velocidade de movimento, apare^ncia de superfi'cies e linhas, e assim por diante. Geomview pode manusear qualquer nu'mero de objetos e permite controle coletivo ou separado sobre eles. A maneira mais simples de usar Geomview e' como um visualizador independente para ver e controlar objetos. Geomview pode mostrar objetos descritos em uma variedade de formatos de arquivo. Geomview e' acompanhado com uma larga variedade de objetos como exemplo, e voce^ pode criar seus pro'prios objetos. Voce^ pode tambe'm usar Geomview para manusear os dados a serem mostrados provenientes de outro programa que esta' sendo executado simulta^neamente. Como o outro programa modifica os dados, a imagem no Geomview reflete as modificac,o~es. Programas que geram objetos e utilizam o Geomview para mostra'-los sa~o chamados _mo'dulos externos_. Mo'dulos externos podem controlar quase todos os aspectos do Geomview. A ide'ia aqui e' que muitos aspectos de visualizac,a~o e partes da interac,a~o de programas geome'tricos sa~o independentes do conteu'do geome'trico e podem ser coletados conjuntamente em uma pec,a simples de programa que pode ser usada em uma larga variedade de situac,o~es. O autor de um mo'dulo externo pode concentrar-se sobre a implementac,a~o dos algori'tmos desejados e deixar os aspectos de visualizac,a~o ao Geomview. Geomview e' acompanhado por uma colec,a~o de mo'dulos externos a ti'tulo de exemplo, e esse manual descreve como escrever seu pro'prio _mo'dulo externo_. Geomview e' o produto de um esforc,o no "Geometry Center" para disponibilizar um "software" de geometria interativa que e' particularmente apropriado para pesquisa matema'tica e educac,a~o. Em particular, Geomview pode mostrar coisas no espac,o hiperbo'lico e no espac,o esfe'rico bem como no espac,o Euclidiano. Geomview permite mu'ltiplos objetos e ca^meras que sa~o controlados independentemente. As ca^meras fornecem controle interativo para movimento, apare^ncias (incluindo iluminac,a~o, sombreamento, e materiais), selecionando um objeto, aresta ou ni'vel de ve'rtice, instanta^neos em um arquivo de imagem SGI ou no formato Renderman RIB, a adic,a~o ou apagamento de objetos e' possi'vel atrave's do controle direto do mouse, paine'is de controle, e teclas de atalho via teclado. Geomview suporta os seguintes tipos de dados simples: poliedros com ve'rtices compartilhados (.off), quadrila'teros, malhas retangulares, vetores, e ajustes em superfi'cies de Bezier de grau arbitra'rio incluindo ajustes racionais. Hierarqui'as de objetos podem ser construi'das com listas de objetos e insta^ncias de objeto(s) transformado(s) por uma ou mais matrizes 4x4. Porc,o~es arbitra'rias de modificac,o~es de hierarqui'as podem ser transmitidas por meio da criac,a~o de refere^ncias nomeadas. Geomview pode mostrar sai'das gra'ficas tridimensionais provenientes do Mathematica e do Maple.  File: geomview-pt_BR, Node: Tutorial, Next: Interacao, Prev: Visao Geral, Up: Top 2 Tutorial ********** Esse capi'tulo conduzira' voce^ atrave's de alguns usos elementares do Geomview. Traba-lhando do comec,o ao fim desse capi'tulo de frente a um computador onde voce^ pode tentar acompanhar os exemplos fornecidos aqui voce^ recebera' um pouco do que pode ser feito com Geomview. Para iniciar o Geomview, coloque seu usua'rio e sua senha no computador e abra uma janela de shell. Uma janela de shell e' uma janela na qual voce^ pode digitar comandos Unix; o prompt na janela usualmente termina com um '%'. Na janela de shell (o cursor do mouse deve estar posicionado sobre a janela) digite o seguinte (`' aqui significa pressione a tecla "Enter"): geomview tetra dodec Esse comando inicia o Geomview e chama dois objetos exemplo, um tetraedro e um dodecaedro. Apo's poucos segundos tre^s janelas ira~o aparecer; *note Figure: figinitial. Figura 2.1: Tela Inicial do Geomview. O painel a` esquerda e' o painel de controle principal do Geomview; Esse painel e' chamado de painel _Main_ (principal). O painel menor ao centro e' o painel _Tools_ (de ferramentas) e serve para selecionar diferentes tipos de movimentos. A janela do lado direito e' a janela de ca^mera e nessa janela voce^ ve^ um tetraedro grande e um dodecaedro que esta' parcialmente obscurecido pelo tetraedro. Geomview tem alguns paine'is mas por padra~o ele mostra somente esses tre^s. iremos descrever alguns aspectos desses tre^s e alguns dos outros nesse tutorial. Voce^ pode ler mais sobre esses e outros paine'is nos capi'tulos adiante neste manual. Coloque o cursor do mouse na janela de ca^mera e pressione e mantenha pressionado o bota~o esquerdo do mouse. Agora, enquanto mante'm pressionado o bota~o, lentamente mova o mouse com movimentos pequenos. Voce^ vera' a figura rotacionar na direc,a~o na qual voce^ mover o mouse. Se voce^ liberar o bota~o do mouse enquanto move o mesmo, a figura continua girando. Para parar o movimento de rotac,a~o, mantenha o mouse sobre a figura e pressione rapidamente o bota~o esquerdo do mesmo. Geomview utiliza o modelo da _esfera de vidro_ para os movimentos iniciados atrave's do mouse. Isso significa que voce^ esta' supondo o objeto como estando dentro de uma esfera invisi'vel e o cursor do mouse como sendo uma alc,a fora da esfera provida de uma ventosa. Quando voce^ mante'm pressionado o bota~o esquerdo do mouse, a ventosa da alc,a gruda na esfera; quando voce^ libera o bota~o do mouse, a ventosa da alc,a libera a esfera. Movendo o mouse enquanto mante'm pressionado o bota~o faz com que a esfera (e concequ"e^ntemente o objeto) mova-se na mesma direc,a~o que o mouse. Adicionalmente para os dois so'lidos que esta~o atualmente na tela voce^ pode tambe'm ver duas molduras de fios em forma de caixa na janela de ca^mera. Essas sa~o as "caixas associadas" dos dois objetos. Por padra~o Geomview coloca uma caixa associada em torno de cada objeto que e' mostrada de forma que voce^ tenha uma ide'ia de o quanto grande o objeto e'. Note que quando voce^ move o mouse em torno do tetraedro e do dodecaedro eles se movem como se fossem uma u'nica figura. Isso ocorre porque por padra~o o que voce^ esta' movendo atualmente e' o "World" (objeto mundo). Para mover um dos objetos individualmente em lugar de o objeto mundo como um todo, mova o cursor do mouse para o navegador de alvos (_Targets_) no painel principal (_Main_). Clique (qualquer bota~o) sobre a palavra _tetra_. Isso faz com que o tetraedro seja o "objeto alvo". Agora mova o cursor de volta a` janela de ca^mera e voce^ podera' rotacionar apenas o tetraedro. O movimento que voce^ aplicou ate' agora foi a rotac,a~o, porque esse e' o modo de modo de movimento selecionado no painel de ferramentas (_Tools_). Para efetuar o movimento de translac,a~o em lugar do movimento de rotac,a~o, clique sobre o bota~o translac,a~o (_Translate_). Agora quando voce^ mover o mouse na janela de ca^mera enquanto mante'm pressionado o bota~o esquerdo, o tetraedro (que deve ser ainda o objeto alvo de antes) ira' ser transladado na direc,a~o que voce^ move o mouse. Note que voce^ pode transladar o tetraedro na direc,a~o da borda da janela enquanto voce^ mante'm pressionado o bota~o esquerdo do mouse. Se voce^ liberar o bota~o do mouse enquanto move o mesmo, o tetraedro ira' continuar o movimento sozinho. O tetraedro mover-se-a' ao contra'rio do que ocorria antes muito rapidamente de forma que e' muito fa'cil perder o rastro de onde ele se encontra. Se voce^ acidentalmente perder o tetraedro atrave's de translac,a~o para muito longe da janela de visa~o, voce^ pode pega'-lo de volta atrave's de um clique sobre o bota~o Centro (_Center_) no painel de ferramentas (_Tools_). Isso fara' com que o tetraedro retorne para a sua posic,a~o inicial. Clique sobre o bota~o Centro (_Center_) para trazer o tetraedro ao centro da janela de ca^mera, e enta~o coloque-o em uma posic,a~o de forma que voce^ possa ver completamente o dodecaedro. Seu objeto mundo agora tem dois objetos que esta~o um ao lado do outro. Voce^ pode ver o dodecaedro no meio da janela de ca^mera e pode ver parte do tetraedro parcialmente fora da janela de ca^mera. Volte para o navegador de alvos (_Targets_) no painel principal (_Main_) e clique sobre o "World" para selecionar o referido objeto mundo novamente. Agora clique sobre o bota~o "Olhar Para" (_Look At_) no painel de ferramentas (_Tools_). Voce^ pode ver o dodecaedro e o tetraedro ajustando-se ao meio da janela (figura *note figlookatworld::). O bota~o "Olhar Para" (_Look At_) posiciona a ca^mera em uma posic,a~o tal que o objeto alvo fique centrado na janela. Figura 2.2: Olhando para o Objeto Mundo. Agora coloque o cursor sobre o meio do dodecaedro e de^ sobre ele um duplo clique com o bota~o direito do mouse. Isso significa clicar no mouse para baixo e para cima duas vezes em uma ra'pida sucessa~o. Note que o dodecaedro torna-se o objeto alvo; voce^ pode ver isso no navegador de alvos (_Targets_) do painel principal (_Main_). Um duplo clique no bota~o direito do mouse sobre um objeto e' outra forma de fazer esse objeto tornar-se o objeto alvo. [image src="figs/ap.png"] Figura 2.3: A Painel Apare^ncia. Va' para o menu _Inspect_ no topo do painel principal (_Main_) e selecione Apare^ncia (_Appearance_). Isso faz aparecer o painel "Apare^ncia" (_Appearance_). Quando ele aparece, se estiver parcialmente obscurecido por outra janela do Geomview voce^ pode move^-lo para um lado arrastando sua moldura com o bota~o do meio do mouse pressionado. O painel Apare^ncia (_Appearance_) permite a voce^ controlar va'rias coisas sobre a maneira como o Geomview desenha objetos. Note os boto~es rotulados com _[af] Faces_ e _[ae] Edges_ (arestas). Clique sobre o _[ae] Edges_ uma vez, e note que Geomview agora ressalta/destaca as arestas do dodecaedro. Clique sobre o _[ae] Edges_ novamente e as arestas desaparecem. Clique muitas vezes e assista as arestas indo e voltando. Quando voce^ tiver feito isso o suficiente, deixe as arestas habilitadas e clique sobre o bota~o _[af] Faces_. Essa ac,a~o alterna entre exibir ou na~o as faces. Clique sobre o bota~o novamente para de forma que a exibic,a~o das face fique habilitada. Agora clique sobre o bota~o _[Cf] Faces_ sob a palavra _COLOR_. Um painel de escolha de cores aparecera' (*note Figure: figcolorchooser.). Figura 2.4: Painel de Escolha de Cores. Note os tre^s boto~es deslizantes, _H_, _S_, e _V_, controlando a matiz (_hue_), saturac,a~o, e valor (iluminac,a~o). Clicando sobre o bota~o _HSV_ fornece um diferente conjunto de boto~es deslizantes, um para vermelho (_red_), outro para verde (_green_), e outro para azul (_ blue_). Valores nume'ricos para ambos os sistemas de cores RGB e HSV podem ser vistos ou editados na parte inferior do painel. A cor inicial do dodecaedro foi especificada no arquivo `dodec' que voce^ chamou quando iniciamos o Geomview. A cor que voce^ especificou com o painel de cores sobrescreveu as cores antigas. Voce^ pode ajustar a intensidade da cor com o bota~o deslizante _Intensity_. Quando voce^ encontrar uma cor que voce^ gosta, clique sobre o bota~o _Done_. Agora coloque o cursor do mouse em algum lugar sobre sobre o fundo cinza da janela de ca^mera e duplo-clique no bota~o direito; isso seleciona "World" como objeto alvo. Clique no bota~o _Look At_ para para olhar para o objeto mundo novamente. Note que no painel de Apare^ncia (_Appearance_) as escolhas dos boto~es se modificavam a` medida que o lado esquerdo tambe'm mudava com o dodecaedro. Isso ocorre porque o painel _Appearance_ sempre mostra as escolhas para o objeto alvo, que agora e' o objeto mundo, o qual ainda tem suas escolhas padra~o. Clique sobre o bota~o _[ab] BBox_ sob a palavra _Draw_. A caixa associada desaparece. agora ponha o cursor de volta na janela de ca^mera. No teclado, digite as teclas `a 'b. Note que a caixa associada aparece novamente. `a 'b e' o atalho de teclado para o bota~o que alterna entre a exibic,a~o ou na~o da caixa associada; a seque^ncia de caracteres "[ab]" aparece sobre o bota~o para indicar isso. A maioria dos boto~es do Geomview possuem atalhos de teclado que voce^ pode usar se preferir. Isso sera' u'ltil quando voce^ estiver familiarizado com o Geomview e na~o quiser ter de se mover entre uma montanha de paine'is. Agora selecione o tetraedro, use qualquer das duas formas: duplo-clicando o bota~o direito do mouse sobre o tetraedro, ou selecionando "tetra" no navegador de alvos (_Targets_). Enta~o clique sobre o bota~o _Delete_ do menu _Edit_ no painel principal (_Main_). O tetraedro deve desaparecer. Essa e' a forma de voce^ se livrar de um objeto. Voce^ pode tambe'm chamar objetos de dentro do Geomview. Clique sobre o menu _File_ no painel principal (_Main_) e escolha abrir (_Open_). O painel de arquivos (_Files_) ira' aparecer. Abaixo do meio desse painel, onde se le^ _Path List_, temos um navegador com tre^s linhas dentro dele; a segunda linha e' um direto'rio com montanhas de exemplos do Geomview. Clique sobre aquela segunda linha; *note Figure: figfilespanel. Role para baixo na lista de arquivos ate' voce^ ver `tref.off'. Clique sobre aquela linha, e enta~o clique sobre o bota~o _OK_. Um grande tubo em forma de trevo ira' aparecer em sua janela. Clique sobre o bota~o _Hide_ no painel _Files_ para dispensar o painel. Figura 2.5: O Painel de Arquivos. Agora clique sobre o bota~o _Reset_ no painel de ferramentas (_Tools_). Isso fara' com que todas as figuras retornem ao centro da janela de ca^mera. Voce^ pode ver um dodecaedro e uma protubera^ncia do trevo (*note Figure: figtrefdodec.). Brinque com a protubera^ncia do trevo e o dodecaedro. Fac,a experie^ncias com alguns outros boto~es no painel de ferramentas (_Tools_). Tente colorir o trevo com o painel de apare^ncia (_Appearance_). Para um tutorial sobre criar seus pro'prios objetos para chama'-los dentro do Geomview, veja `doc/oogltour' distribuido com Geomview. As coisas naquele arquivo ira~o ser incorporadas em futuras verso~es desse manual. Figura 2.6: Trevo e Dodecaedro.  File: geomview-pt_BR, Node: Interacao, Next: Formatos dos Arquivos da OOGL, Prev: Tutorial, Up: Top 3 Interac,a~o ************* Esse capi'tulo descreve como voce^ interage com Geomview atrave's do mouse e do teclado. * Menu: * Iniciando o Geomview:: Iniciando o Geomview. * Opcoes de Linha de Comando:: Opc,o~es de Linha de Comando. * Interacao Basica:: Interac,o~es Ba'sicas: O Painel Principal. * Chamando:: Chamando Objetos Dentro do Geomview. * Movimentos do Mouse:: Usando o Mouse para Controlar Objetos. * Aparencia:: Modificando a Forma de Ver as Coisas. * Cameras:: Ca^meras. * Gravando:: Gravando seu Trabalho. * Comandos:: O Painel de Comandos. * Atalhos de Teclado:: Atalhos de Teclado.  File: geomview-pt_BR, Node: Iniciando o Geomview, Next: Opcoes de Linha de Comando, Prev: Interacao, Up: Interacao 3.1 Iniciando o Geomview ======================== A forma usual para iniciar o Geomview e' digitar `geomview ' em uma janela de shell ( significa pressionar a tecla "Enter"). Esse procedimento carrega o Geomview na memo'ria do computador em uns poucos segundos; uma ou mais janelas ira~o aparecer e voce^ pode comec,ar a interagir com o Geomview imediatamente. E' tambe'm possi'vel especificar ac,o~es para o Geomview executar no momento de iniciar fornecendo argumentos na linha de comando do shell. Veja *note Opcoes de Linha de Comando::.  File: geomview-pt_BR, Node: Opcoes de Linha de Comando, Next: Interacao Basica, Prev: Iniciando o Geomview, Up: Interacao 3.2 Opc,o~es de Linha de Comando ================================ Aqui esta~o as opc,o~es de linha de comando que o Geomview permite: `-b R G b' Escolhe a cor de fundo da janela de ca^mera para valores fornecidos de R G b. `-c ARQUIVO' Interpreta os comandos GCL em ARQUIVO, que pode ser o si'mbolo especial `-' para a entrada padra~o. Para uma descric,a~o de GCL, veja *note GCL::. `-c COMANDO' Comandos podem tambe'm serem fornecidos literalmente, como em -c "(ui-panel main off)" Uma vez que COMANDO inclui pare^ntesis, que possuem significado especial para o shell, COMANDO deve receber apo'strofo. Multiplas opc,o~es -C sa~o permitidas. `-wins N' Faz com que Geomview mostre inicialmente N janelas de ca^mera. `-wpos LARGURA,ALTURA[@XMIN,YMIN]' Especifica a localizac,a~o inicial e o tamanho da primeira janela de ca^mera. Os valores para LARGURA, ALTURA, XMIN, e YMIN esta~o em coordenadas de tela (pixel). `-M[cg][ps[un|in|in6]] PIPENOME|TCPPORT' A opc,a~o `-M' aceita modificadores: um sufixo `g' espera dados geome'tricos (o padra~o), enquanto um sufixo `c' espera comandos GCL. Um `p' implica que a conecc,a~o pode usar um pipe nomeado (o padra~o para tudo exceto para "NeXT"), enquanto `s' implica no uso de um "UNIX-domain socket" (o padra~o em "NeXT"). Uma vez que na versa~o 1.9 do Geomview "Internet domain sockets" sa~o tambe'm suportados; use `sin' para fazer o Geomview escutar uma porta IPv4 fornecida por TCPPORT, ou use `sin6' para fazer Geomview escute uma porta IPv6 (tambe'm como especificado em TCPPORT). `sun' e' um sino^nimo para `s', i.e. use o "Unix domain socket" com o nome PIPENOME. Se PIPENOME inicia com uma barra ('/'), enta~o esse nome e' assumido ser um caminho absoluto, de outra forma o pipe nomeado ou socket e' criado sob o direto'rio `${TMPDIR}/geomview/'. Escutando fluxo de comando em portas TCP pode ser um risco de seguranc,a, como Geomview por si mesmo na~o toma nenhum tipo de precauc,a~o de seguranc,a, Geomview simplesmente executa todos os comandos alimentados a ele atrave's do socket de rede. Isso tambe'm implica entrada e sai'da para unidades de armazenamento locais devem ser permitidas remotamente. Exemplos: `-M NOME_DE_OBJETO' Mostra (possivelmente mudando dinamicamente) geometria enviada de programas `geomstuff' ou `togeomview'. Essa opc,a~o "-M" escuta o pipe nomeado `/tmp/geomview/nome_de_objeto'; voce^ pode conseguir o mesmo efeito com os comandos de shell abaixo: mkdir /tmp/geomview mknod /tmp/geomview/nome_de_objeto p (assumindo que o direto'rio e o pipe nomeado na~o existam atualmente), enta~o executando o comando GCL: (geometry nome_de_objeto < /tmp/geomview/nome_de_objeto) (veja *note `(geometry ...)': geometry.) `-Mc PIPENOME' Como `-M' acima, mas espera comandos GCL, em lugar de dados geome'tricos OOGL, na conecc,a~o. `-Mcs nome' Le^ comandos a partir do "UNIX-domain socket" nomeado. `/tmp/geomview/nome' `-Mcsin 40000' Le^ comandos a partir da porta IPv4 `40000'. Geomview por si mesmo na~o toma qualquer precauc,a~o de seguranc,a, de forma que "-Mcsin 40000" pode ser um risco de seguranc,a. `-noopengl' Desabilita o uso de OpenGL para (possivelmente) conversa~o acelerada de hardware, mesmo que o bina'rio do Geomview tenha suporte a OpenGL compilado internamente. "-noopengl" tambe'm desabilita o suporte a transpare^ncia e texturas na janelas de ca^mera. Instanta^neos "RenderMan" ainda tera~o a transpare^ncia correta e suporte a alguma textura limitada. `-nopanels' Inicia sem mostrar nenhum painel, somente a janelas gra'ficas. Paine'is podem ser invocados mais tarde da forma usual com as teclas de atalho `Px' ou com comando `ui-panel'. Veja *note `(ui-panel ...)': ui-panel. `-noinit' Na~o le^ nenhum arquivo de inicializac,a~o. Por padra~o, Geomview le^ o arquivo `.geomview' do sistema, seguido daqueles em `${HOME}/.geomview' e em `./.geomview'. `-e MODULO' Inicial um mo'dulo externo; MODULO e' o nome associado ao mo'dulo chamado, aparecendo no painel principal no navegador de "Applications", como definido pelo comando `emodule-define'. Veja *note `(emodule-define ...)': emodule-define. `-start MODULE ARGS ...' Como -e mas permite a voce^ enviar argumentos para o mo'dulo externo. "-" sinaliza o fim da lista de argumentos; o "-" pode ser omitido se for o u'ltimo argumento na linha de comando do Geomview. `-run COAMANDO-SHELL ARGS ...' Como "-start" mas toma o caminho de arquivos do executa'vel do mo'dulo externo em lugar do nome do mo'dulo. Os caminhos de arquivo de todos os direto'rios de mo'dulos conhecidos sa~o anexados ao final do caminho de busca do UNIX quando for invocado o COMANDO-SHELL.  File: geomview-pt_BR, Node: Interacao Basica, Next: Chamando, Prev: Opcoes de Linha de Comando, Up: Interacao 3.3 Interacao Basica: O Painel Principal ======================================== Normalmente quando voce^ invoca Geomview, tre^s janelas aparecem: O painel principal (_Main_), o painel de ferramentas (_Tools_), e uma janela de ca^mera. Geomview tem muitas outras janelas mas muitas coisas podem ser realizadas com essas tre^s de forma que por padra~o as outras na~o aparecem. Essa sec,a~o do manual introduz alguns conceitos ba'sicos que sa~o usados nas sec,o~es restantes do manual e descreve o painel principal (_Main_). Figura 3.1: O Painel Principal Geomview pode mostrar um nu'mero arbitra'rio de objetos simultaneamente. O navegador _Targets_ no painel principal (_Main_) mostra uma lista de todos os objetos dos quais Geomview atualmente abertos. Esse navegador tem uma linha para cada objeto que voce^ tiver chamado, adicionalmente algumas linhas para outros objetos. Um desses outros objetos e' chamado `World' e corresponde a todos os objetos atualmente chamados, tratados como se eles fossem um objeto. A maioria das operac,o~es que voce^ pode fazer sobre um objeto, tais como aplicar um movimento ou mudar uma cor, pode tambe'm ser feita para o objeto "World". O navegador de alvos (_Targets_) tambe'm possui uma entrada para cada ca^mera. Por padra~o existe somente uma ca^mera; e' possi'vel adicionar mais delas atrave's da entrada _New Camera_ do painel principal (_Main_) via menu _File_. Geomview trata ca^meras na maioria das vezes como trata objetos geome'tricos. Por exemplo, voce^ pode mover ca^meras pelas pro-ximidades e adiciona'-las e apaga'-las como objetos geome'tricos. Ca^meras na~o sa~o mostradas na tela como um objeto que voce^ ve^. Cada ca^mera tem uma janela de ca^mera separada que mostra a visa~o como vista atrave's da lente daquela ca^mera. (E' possi'vel para cada ca^mera mostrar uma representac,a~o geome'trica de outras ca^meras. Veja *note Cameras::.) Devido ao fato de Geomview tratar ca^meras e objetos geome'tricos muito similarmente, o termo "objeto" nessa documentac,a~o e' usado para referir-se a qualquer dos dois indistintamente. Quando precisamos distinguir entre os dois tipos de objetos, usamos o termo ""geom"" para denotar um objeto geome'trico e a palavra "ca^mera" para denotar uma ca^mera. O objeto que esta' selecionado (luminosidade alta) no navegador "_Targets_" e' chamado objeto alvo. Esse e' o objeto que recebe quaisquer ac,o~es que voce^ faz com o mouse ou com o teclado. Voce^ pode mudar o objeto alvo selecionando uma linha diferente no navegador de alvos (_Targets_). Outro caminho de modificar o objeto alvo e' colocar o cursor do mouse diretamente sobre um geom na janela de ca^mera e rapidamente dar um duplo clique no bota~o direito do mouse. Esse processo e' chamado "selecionar"; o objeto selecionado torna-se o novo alvo. Objetos do Geomview sa~o todos conhecidos por dois nomes, ambos dos quais sa~o mostrados no navegador de alvos (_Targets_). O primeiro nome la' fornecido, que aparece entre colche^tes ([ ]), e' um nome curto atribuido pelo Geomview quando voce^ chama o objeto. Esse nome consiste da letra `g' para geometria e da letra `c' para ca^meras, seguindo por um nu'mero. O segundo nome e' maior e mais descritivo; por padra~o esse e' o nome do arquivo do qual o objeto foi chamado. Os dois nomes sa~o equivalentes no que diz respeito ao Geomview; em qualquer ponto onde voce^ precisar especificar um nome voce^ pode fornecer qualquer dos dois. Para controlar um objeto, garanta que aquele objeto que voce^ quer mover seja o objeto alvo, e coloque o cursor do mouse em uma janela de ca^mera. Movimentos sa~o aplicados pressionando ou o bota~o esquerdo ou o bota~o do meio do mouse e movendo o mouse. Existem muitos modos de movimento diferentes, cada modo de movimento aplicando um diferente tipo de movimento. O navegador de modos de movimento (_MOTION MODE_) no painel principal indica o modo de movimento atual. O padra~o e' a rotac,a~o ("Rotate"). Voce^ pode mudar o modo corrente de movimento selecionando um novo modo de movimento no navegador de modos de movimento (_MOTION MODE_), ou usando o painel de ferramentas (_Tools_). Para maiores informac,o~es sobre modos de movimento, veja *note Movimentos do Mouse::. O navegador de mo'dulos (_Modules_) lista mo'dulos externos do Geomview. Um mo'dulo externo e' um programa separado que interage com Geomview para extender suas funciona-lidades. Para informac,o~es sobre mo'dulos externos, veja *note Modulos::. A barra de menu no topo do painel principal oferece menus para operac,o~es comuns. Para criar novas janelas, chame novos objetos, grave os objetos ou outras informac,o~es, ou saia do Geomview, veja o menu _File_. Para copiar ou apagar objetos, veja o menu _Edit_. Voce^ pode chamar qualquer painel a partir do menu _Inspect_. O menu _Space_ permite a voce^ escolher se Geomview trabalha no modo Euclidiano, Hiperbolico ou Esfe'rico. O modo Euclideano e' usado por padra~o. Para detalhes sobre a utilizac,a~o do modo espac,o _Hyperbolic_ e do modo _Spherical_, veja *note Geometrias Nao-Euclidianas::. A maioria das ac,o~es que voce^ pode fazer atrave's dos paine'is do Geomview possuem equivalentes atalhos de teclado de forma que voce^ pode fazer a mesma ac,a~o atave's de digitac,a~o de uma seque^ncia de teclas no teclado. Isso e' u'til para usua'rios avanc,ados que esta~o familiarizados com as capacidades do Geomview e querem trabalhar rapidamente sem ter montanhas de paine'is amontoando-se na tela. Atalhos de teclado sa~o usualmente indicados ente colche^tes ([ ]) pro'ximo ao item correspondente em um painel. Por exemplo, o atalho de teclado para o modo _Rotate_ e' 'r'; isso e' indicado par "[r]" que aparece antes da palavra "Rotate" no navegador _MOTION MODE_. Para usar esse atalaho de teclado, apenas pressione a tecla `r' enquanto o cursor do mouse estiver em qualquer janela do Geomview. Na~o e' necessa'rio pressionar a tecla `' posteriormente. Alguns atalhos de teclado consistem em mais de uma tecla. Nesses caso apenas digite as teclas uma apo's a outra, sem pressionar `' posteriormente ou entre as teclas pressionadas. Atalhos de teclado sa~o sensi'veis a` caixa alta/baixa. Muitas teclas de atalho podem ser precedidas de um para^metro nume'rico. Por exemplo, digitando `ae' muda o estado do desenho de arestas, enquanto `1ae' sempre habilita o desenho de arestas. O campo _keyboard_ no canto superior esquerdo do painel principal (_Main_), imediatamente acima da palavra "Targets", ecoa o estado atual das teclas de atalho. Para uma lista de todas as teclas de atalho, pressione a telca _`?'_.  File: geomview-pt_BR, Node: Chamando, Next: Movimentos do Mouse, Prev: Interacao Basica, Up: Interacao 3.4 Disponibilizando Objetos dentro do Geomview =============================================== Existem muitos caminhos para chamar um objeto dentro do Geomview. No painel de arquivos (_Files_) Se voce^ clicar no bota~o _Load_ no painel principal do Geomview (_Main_), o painel de arquivos (_Files_) ira' aparecer. Figura 3.2: O Painel de Arquivos. Esse painel permite que voce^ selecione um arquivo a partir de uma variedade de direto'rios. O topo do painel e' um navegador de arquivos padra~o do Motif. Abaixo deste esta' uma lista de direto'rios no caminho de busca padra~o do Geomview; clique sobre um desses para navegar entre os arquivos naquele direto'rio. Para selecionar um arquivo, duplo-clique sobre o seu nome no navegador no canto superior direito, ou clique sobre o seu nome e pressione a tecla , ou ainda digite o nome do arquivo dentro da caixa de texto na parte inferior do navegador e pressione a tecla . Se o arquivo selecionado contiver dados geome'tricos OOGL, esse arquivo ira' ser adicionado ao navegador de alvos (_Targets_) do Geomview. Se esse arquivo contiver comandos GCL em lugar de conter dados geome'tricos OOGL, o arquivo sera' interpretado. Veja *note GCL::. Quando o apinel de arquivos (_Files_) aparecer pela primeira vez, o direto'rio selecionado no navegador de direto'rios e' o direto'rio atual -- que corresponde ao direto'rio a partir do qual voce^ chamou o Geomview. O navegador de arquivos mostra _todos_ os arquivos nesse direto'rio, incluindo os que na~o sa~o arquivos do Geomview. Se voce^ tentar chamar um arquivo que na~o contenha um objeto OOGL e tambe'm na~o contenha comandos do Geomview, o Geomview ira' mostrar uma mensagem de erro. O navegador de direto'rios tambe'm lista um segundo e um terceiro direto'rios adicionalmente ale'm do direto'rio atual. O segundo, que termina em `data/geom', e' o direto'rio de exemplos de dados do Geomview. Esse direto'rio conte'm uma grande variedade de amostras de objetos. Esse direto'rio tambe'm conte'm muitos subdireto'rios. Em particular, os subdireto'rios `hyperbolic' e o subdireto'rio `spherical' possuem amostras de objetos hiperbo'licos e esfe'ricos, respectivamente. Entradas no navegador de direto'rios sa~o vistas apenas como entradas de arquivos; para visualizar um subdireto'rio, clique sobre o nome do referido direto'rio. O terceiro direto'rio mostrado no navegador de direto'rio, que termina em `geom', conte'm muitos subdireto'rios com outros arquivos do Geomview dentro deles. Esses arquivos sa~o usados menos freque^ntemente que os outros no direto'rio `data/geom'. Voce^ pode mudar a lista de direto'rios mostrada no navegador de direto'rios do painel de arquivos (_Files_) usando o comando `set-load-path'; Veja *note `(set-load-path ...)': set-load-path. A tecla de atalho `<': Se voce^ digitar `<' em qualquer janela do Geomview, o painel _Load_ ira' aparecer. Esse painel e' uma pequena versa~o do painel de arquivos (_Files_); o painel _Load_ conte'm um campo de texto no qual voce^ o nome de um arquivo a ser chamado (ou um comando GCL entre pare^ntesis). Apo's digitar o nome do arquivo a ser chamado, aperte a tecla `'; Geomview ira' chamar o arquivo como se voce^ o tivesse chamado com o bota~o _Add_ no painel de arquivos (_Files_). Se, apo's fazer surgir o pequeno painel _Load_ com `<', voce^ decidir que quer usar o grande painel de arquivos (_Files_) apo's tudo, pressione o bota~o _File Browser_. Figura 3.3: O Painel de Chamar Arquivos. Comandos para chamar objetos geome'tricos: Os comandos GCL `load', `geometry', `new-geometry', e `read' permitem a voce^ chamar um objeto dentro do Geomview; veja *note GCL::. Veja *note `(load ...)': load. Veja *note `(new-geometry ...)': new-geometry. Veja *note `(read ...)': read.  File: geomview-pt_BR, Node: Movimentos do Mouse, Next: Aparencia, Prev: Chamando, Up: Interacao 3.5 Usando o Mouse para Controlar Objetos ========================================= Geomview permite a voce^ controlar objetos com o mouse. Existem seis diferentes modos de movimento do mouse: rotac,a~o (_Rotate_), translac,a~o (_Translate_), vo^o da ca^mera (_Cam Fly_), zoom da ca^mera (_Cam Zoom_), homotetia de um objeto geome'trico (_Geom Scale_), e o'rbita de ca^mera (_Cam Orbit_). O painel de ferramentas tem um bota~o para cada um desses modos; para trocar os modos, clique sobre o bota~o correspondente. voce^ pode tambe'm selecionar um novo modo atrave's do navegador de modos de movimento (_Motion Mode_) no painel principal (_Main_). Essa sec,a~o descreve a interac,a~o ba'sica com o mouse. Para detalhes, veja *note Comandos::. Figura 3.4: O Painel de Ferramentas. Cada um dos modos de movimento usa um paradigma comum para como o movimento e' aplicado. Em particular, cada modo de movimento depende do objeto alvo (_target_) atual e do atual objeto do centro (_center_). O objeto alvo atual e o atual objeto do centro sa~o explicados nos para'grafos seguintes. O objeto alvo atual e' mostrado no campo _Target_ no painel de ferramentas (_Tools_). Isso e' o mesmo que o objeto selecionado no navegador de alvos (_Targets_) no painel principal (_Main_), e voce^ pode mudar o alvo ou selecionando um novo objeto no navegador, digitando uma nova entrada no campo, ou selecionando um objeto na janela de ca^mera duplo-clicando no bota~o direito do mouse com o cursor sobre o objeto. O atual objeto do centro e' mostrado no campo _Center_ no painel de ferramentas(_Tools_). Seu valor padra~o e' a palavra especial "target", que significa que o objeto do centro e' o objeto que estiver designado como objeto alvo. Voce^ pode mudar o objeto atual do centro para qualquer objeto digitando seu nome no campo _Center_. A ori'gem do objeto do centro e' mantida fixa no modo rotac,a~o _Rotate_ e no modo _Orbit_. Normalmente o objeto do centro e' um dos objetos geome'tricos (geoms) existentes listados no navegador de alvos (_Targets_), o centro atual das rotac,o~es e' a ori'gem daquele sistema de coordenadas daquele objeto. E' possi'vel, todavia, selecionar um ponto arbitra'rio de interesse sobre um objeto como o centro. Para detalhes, veja *note Ponto de Interesse::. Isso tambe'm e' possi'vel mudando o bota~o _BBox Center_ para escolher o centro de movimento como sendo o centro do objeto atual da caixa associada. Uma vez modificado o centro da caixa geome'trica ativa associada ira' tornar-se o centro do movimento, se voce^ selecionar outro objeto, enta~o o centro do movimento ira' tornar-se o centro da caixa associada a` aquele objeto. Nenhuma modificac,a~o ocorrera' quando uma ca^mera ou o objeto mundo (_World_) for selecionado; voce^ tem que digitar a palavra `target' no campo _Center_ para retornar ao valor padra~o. Voce^ aplica um movimento de mouse pressionando ou o bota~o esquerdo ou o bota~o do meio do mouse com o cursor em uma janela de ca^mera e movendo o mouse. A maioria dos modos de movimento possui ine'rcia (_inertia_), que significa que se voce^ soltar o bota~o enquanto move o mouse, o movimento ira' continuar. Para imaginar a ine'rcia pode ser u'til imaginar o cursor do mouse como sendo uma alc,a; quando voce^ pressiona um bota~o do mouse para baixo, o mouse agarra firmemente no objeto alvo e voce^ pode mover esse objeto. Quando voce^ libera o bota~o do mouse, a alc,a libera o objeto. Liberando o bota~o do mouse enquanto move o mesmo funciona como abandonar o objeto -- o objeto continua movendo-se independentemente do mouse. Ine'rcia pode ser desligada; veja o menu de movimento (_Motion_) no painel principal (_Main_), descrito abaixo. Geralmente, o bota~o esquerdo do mouse controla movimento no plano da tela, enquanto o bota~o me'dio do mouse controla movimento ao longo ou em torno da direc,a~o de avanc,o. Pressionando o tecla "shift" enquanto arrasta com o bota~o esquerdo ou me'dio do mouse na maioria dos modos de movimento fornece movimentos de baixa velocidade , u'til para ajustes finos. Voce^ pode selecionar qualquer ponto sobre um objeto (na~o apenas sua ori'gem) como centro do movimento pressionando a tecla "shift" enquanto clica no bota~o direito do mouse; isso escolhe o ponto de interesse. _Rotate_ No modo rotac,a~o (_Rotate_), pressione o bota~o esquerdo do mouse para rotacionar o objeto alvo en torno do objeto do centro. A rotac,a~o ocorre na direc,a~o que voce^ move o mouse. Especificamente, o eixo de rotac,a~o passa atrave's da ori'gem do objeto do centro, e' paralelo ao plano de visa~o da ca^mera, e e' perpendicular a` direc,a~o do movimento do mouse. Quando o centro for o alvo ("target"), isso significa que o objeto alvo rotaciona em torno de sua pro'pria ori'gem. O bota~ do meio do mouse no modo de movimento tipo rotac,a~o (_Rotate_) rotaciona o objeto alvo em torno de um eixo perpendicular ao plano de visa~o. _Translate_ No modo translac,a~o (_Translate_), mantenha pressionado o bota~o esquerdo do mouse para transladar o objeto alvo na direc,a~o do movimento do mouse. O bota~o do meio do mouse translada o alvo ao longo de um eixo perpendicular ao plano de visualizac,a~o. No espac,o Euclideano, o objeto do centro e' essencialmente irrelevante para translac,o~es. Nos espac,os hiperbo'licos e esfe'ricos, onde translac,o~es possuem um u'nico eixo, esse eixo e' escolhido para ir atrave's da ori'gem do objeto do centro. _Cam Fly_ O Vo^o de Ca^mera (_Cam Fly_) e' um simulador de vo^o muito simples que permite a voce^ voar em torno da cena. _Cam Fly_ trabalha atrave's do movimento da ca^mera. Movimente o mouse enquanto mante'm pressionado o bota~o esquerdo do mouse para posicionar a ca^mera em uma direc,a~o diferente. Para mover adiante ou para tra's, mantenha pressionado o bota~ do meio e mova o mouse verticalmente. Os dois movimentos aqui descritos possuem ine'rcia; tipicamente o caminho mais fa'cil para voar em torno de uma cena e' fornecer a ca^mera um passo adiante pressionando o bota~ do meio enquanto move-se o mouse para cima, e enta~o usar o bota~o esquerdo para pilotar. _Cam Fly_ afeta a janela de ca^mera onde o mouse esta' correntemente posicionado; _Cam Fly_ ignora o objeto alvo e o objeto do centro. _Cam Orbit_ O modo o'rbita de Ca^mera (_Cam Orbit_) permite a voce^ rotacionar a ca^mera atual em torno do centro atual. O bota~o esquerdo do mouse faz essa rotac,a~o. O bota~o do do meio do mouse no modo _Cam Orbit_ atua da mesma forma que no modo _Cam Fly_: O bota~o do do meio do mouse move a ca^mera para adiante e para tra's. Em geral _Cam Orbit_ na~o move o objeto alvo, embora se a ca^mera atual for selecionada como o alvo e o centro for tambe'm o alvo, _Cam Orbit_ ira' apenas pivotar aquela ca^mera sobre si' mesma como no modo _Cam Fly_. _Cam Zoom_ O modo Zoom de Ca^mera (_Cam Zoom_) permite a voce^ modificar o campo atual de visa~o com o mouse; mantenha pressionado o bota~o esquerdo do mouse e mova o mouse para modificar o campo de visa~o. O valor nume'rico do campo de visa~o e' mostrado no campo _FOV_ (field of view) no painel de ca^mera (_Camera_). _Geom Scale_ O modo _Geom Scale_ permite a voce^ ampliar ou diminuir um objeto geome'trico (geom). _Geom Scale_ atua sobre o objeto alvo se aquele objeto for um geom. Se o alvo for uma ca^mera, _Geom Scale_ atual sobre o geom que foi o objeto alvo mais recentemente. Movendo o mouse enquanto mantem-se pressionado o bota~o esquerdo do mouse homotetiza-se o objeto ou ampliando ou reduzindo o mesmo, dependendo da direc,a~o do movimento do mouse. o centro da transformac,a~o homote'tica aplicada e' o objeto do centro. Homotetia possui significado somente no espac,o Euclideano; tentativas do palicar homotetia sa~o ignoradas em outros espac,os. O modo _Geom Scale_ na~o possui ine'rcia. Os boto~es _Stop_, _Look At_, _Center_, e _Reset_ no painel de ferramentas (_Tools_) executam ac,o~es relacionadas a movimentos mas na~o modificam o modo atual de movimento (nota do tradutor: de rotac,a~o para translac,a~o por exemplo). _Stop_ O bota~o _Stop_ faz com que cessem todos os movimentos. O bota~o _Stop_ afeta todos os objetos em movimento, na~o apenas o objeto alvo. Sua tecla de atalho e' `H'. O comando de teclado `h', que na~o corresponde a um bota~o do painel, cessa o movimento atual para o objeto alvo somente. _Look At_ O bota~o _Look At_ faz com que a ca^mera atual seja movida para uma posic,a~o tal que a referida ca^mera esteja olhando para o objeto alvo, e de forma que o objeto alvo mais ou menos ajuste-se a` janela. O comando _Look At_ na~o funciona perfeitamente em espac,os na~o Euclideanos. _Center_ O bota~o _Center_ desfaz transformac,a~o do objeto alvo, movendo o objeto alvo de volta a` sua posic,a~o inicial padra~o, que e' onde ele estava quando voce^ originalmente o chamou a partir do Geomview. _Reset_ O bota~o _Reset_ cessa todo movimento e faz com que todos os objetos sejam movidos de vota a`s suas posic,o~es iniciais padra~o. O painel de ferramentas (_Tools_) possui um bota~o _Main_, para invocar o painel principal no caso de esse painel ter sido dispensado ou sepultado, e um bota~o _Done_ para fechar o painel de ferramentas _Tools_. O painel principal do menu de movimento (_Motion_) tem controles especiais que afetam como movimentos do mouse sa~o interpretados; as modificac,o~es sa~o tambe'm acessi'veis atrave's de comandos GCL. *Note `(ui-motion ...)': ui-motion. _[ui] Inertia_ Normalmente, ao mover objetos tem-se ine'rcia: se o mouse estiver ainda se movendo quando o bota~o for liberado, o objeto selecionado continua a mover-se. Quando a ine'rcia (_Inertia_) for desabilitada, objetos cessam seu movimento no momento em que voce^ libera o mouse. _[uc] Constrain Motion_ E' necessa'rio algumas vezes ter ao alcance da ma~o o movimento de um objeto em uma direc,a~o alinhada com um eixo coordenado: exatamente na horizontal ou na vertical. Selecionando restringir movimento (_Constrain Motion_) a interpretac,a~o de movimentos do mouse e' modificada para permitir isso; arrastros de mouse aproximadamente horizontais ou aproximadamente verticais transformam-se em movimentos exatamente horizontais ou exatamente verticais. Note que o movimento e' ainda ao longo dos eixos X ou Y da ca^mera na qual voce^ move o mouse, na~o necessa'riamente no sistema de coordenadas do objeto. _[uo] Own Coordinates_ E' necessa'rio algumas vezes ter ao alcance da ma~o o movimento de objetos objetos com relac,a~o ao sistema de coordenadas onde o referido objeto foi definido, em lugar de com relac,a~o ao sistema de coordenadas da ca^mera atrave's da qual esse objeto esta' sendo visto. Enquanto _Own Coordinates_ estiver selecionado, todos os movimentos sa~o interpretados da forma citada nesse item: arrastando o mouse para a direita no modo translac,a~o corresponde a mover o objeto em sua pro'pria direc,a~o +X, e assim por diante. Pode ser especialmente u'til conjuntamente com o bota~o Restringir Movimento (_Constrain Motion_). * Menu: * Ponto de Interesse:: Pontos de Interesse.  File: geomview-pt_BR, Node: Ponto de Interesse, Prev: Movimentos do Mouse, Up: Movimentos do Mouse 3.5.1 Selecionando um Ponto de Interesse ---------------------------------------- E' algumas vezes u'til especificar um ponto em particular sobre algum objeto em uma janela do Geomview como o ponto de centro para movimentos do mouse. Voce^ pode fazer isso segurando a tecla shift e clicando o bota~o direito do mouse (i.e. clique no bota~o direito uma vez enquanto mante'm pressionada a tecla shift do teclado) com o cursor sobre o ponto desejado. Esse ponto torna-se enta~o o _ponto de interesse_. O ponto de interesse deve estar sobre um objeto existente. Selecionado um ponto de interesse simplifica o exame de uma pequena porc,a~o de um grande objeto. Mantendo a tecla shift pressionada e clicando sobre o ponto de interesse com o bota~o direito do mouse, e selecionando o modo o'rbita (_Orbit_). Use o bota~ do meio do mouse para aproximar, e o esquerdo para orbitar o ponto, examinando a regia~o de diferentes direc,o~es. Quando voce^ tiver selecionado um ponto de interesse, o atual objeto do centro e' modificado para um objeto chamado "CENTER", que e' um objeto invisi'vel localizado no ponto de interesse. Adicionalmente, movimentos de mouse para a janela na qual voce^ fez a selec,a~o sa~o ajustados de forma que o ponto de interesse acompanhe o mouse. Voce^ pode mudar o ponto de interesse a qualquer momento selecionando um novo ponto de interesse shift-clicando o bota~o direito do mouse novamente. Voce^ pode cancelar o ponto de interesse completamente shift-clicando o bota~o direito do mouse com o cursor no plano de fundo (i.e. na~o sobre qualquer objeto). Isso modifica o objeto do centro de volta a seu valor padra~o, "target". O objeto que possui o nome de "CENTER", que serve como um objeto do centro para o ponto de interesse, e' um tipo especial de geom chamado "alien". Esse "Alien" na~o aparece no navegador de alvos (_Targets_). Por padra~o esse objeto "Alien" na~o tem geometria associada e conceque^ntemente e' invisi'vel. Voce^ pode, Todavia, explicitamente fornecer ao Alien alguma geometria usando um comando GCL, fazendo com que o Alien aparece no navegador de alvos. Use o comando `geometry' para fazer isso: `(geometry CENTER GEOMETRY)', onde GEOMETRY e' qualquer geometria va'lida. Por exemplo, `(geometry CENTER { < xyz.vect })' faz com que o arquivo `xyz.vect', que e' um dos arquivos de exemplo padronizados distribui'dos com Geomview, seja usado na geometria para CENTER. Veja *note `(geometry ...)': geometry. O que acontece internamente quando voce^ seleciona um ponto de interesse e' que o centro e' ajustado para o objeto chamado CENTER, e aquele objeto e' posicionado no ponto de interesse. Adicionalmente, para que movimentos de mouse acompanhem o ponto de interesse, o atual comprimento focal da ca^mera e' escolhido para ser a dista^ncia da ca^mera ate' o ponto de interesse. Voce^ pode realizar isso via GCL com os seguintes comandos: (if (real-id CENTER) nil (new-alien CENTER {})) (ui-center CENTER) (transform-set CENTER universe universe translate X Y Z) (merge camera CAM-ID { focus D }) onde `(X,Y,Z)' sa~o as coordenadas (universe) do ponto de interesse, e D e' a dista^ncia daquele ponto a` atual ca^mera, CAM-ID. O primeiro comando acima cria o "alien" CENTER se esse Alien na~o existir ainda.  File: geomview-pt_BR, Node: Aparencia, Next: Cameras, Prev: Movimentos do Mouse, Up: Interacao 3.6 Modificando a Forma de Ver as Coisas ======================================== Geomview utiliza uma hierarquia de apare^ncias para controlar o caminho atrave's do qual olha-se coisas. Uma apare^ncia ("appearance") e' uma especificac,a~o de informac,a~o sobre como alguma coisa pode ser desenhada. Isso pode incluir muitas caracteri'sticas como cor, brilho, propriedades do material, etc. Apare^ncias trabalham de uma maneira hiera'rquica: se uma certa propriedade de apare^ncia, por exemplo cor de face, na~o for especificada em uma apare^ncia particular de algum objeto, esse bojeto e' desenhado usando aquele propriedade de uma hierarquia superior. Se ambas as apare^ncias de hierarquias, a atual e a superior, especificam uma propriedade, a hierarquia atual tem precede^ncia a menos que a hierarquia superior na~o for escolhida para sobrescreve^-la. Todo geom no Geomview tem uma apae^ncia associada. Existe tambe'm uma apare^ncia associada ao geom do tipo "World", que comporta-se como hierarquia superior a cada apare^ncia individual de qualquer geom. Finalmente, existe uma apare^ncia ba'sica global, que e' a hierarquia superior da apare^ncia "World". A apare^ncia ba'sica especifica valores razoa'veis para toda informac,a~o de apare^ncia, e por padra~o nenhuma outra apare^ncia especifica qualquer coisa, o que significa que as apare^ncias erdam seus valores a a partir da apare^ncia ba'sica. Isso significa que por padra~o todos os objetos sa~o desenhados usando a apare^ncia ba'sica. Se voce^ modificar uma certa propriedade de apare^ncia de um geom, aquela propriedade e' usada na construc,a~o daquele geom. A apare^ncia de hierarquia superior e' usada para quaisquer propriedades que voce^ na~o explicitamente escolheu. Geomview possui tre^s paine'is que levam voce^ a modificar apare^ncias. * Menu: * Painel de Aparencia:: Cor etc. * Painel de Materiais:: Propriedades do Material da Superfi'cie. * Painel de Iluminacao:: Para^metros de Iluminac,a~o.  File: geomview-pt_BR, Node: Painel de Aparencia, Next: Painel de Materiais, Prev: Aparencia, Up: Aparencia 3.6.1 The Appearance Panel -------------------------- O painel de Apare^ncia (_Appearance_) leva voce^ a modificar as mais comuns propriedades de apare^ncia do objeto alvo. [image src="figs/ap.png"] Figura 3.5: O Painel de Apare^ncia. Se o alvo for um geom individual, enta~o modificac,a~oes que voce^ fizer no painel de apare^ncias aplicam-se a apare^ncia daquele objeto geome'trico. Se o alvo for o "World", enta~o as modificac,o~es no painel de apare^ncias aplicam-se a` apare^nca do objeto atual _e_ a apare^ncia de todos os outros objetos individuais. (Usua'rios acham que esse comportamento e' mais deseja'vel que ter as modificac,o~es somente aplicadas a apare^ncia do "World".) Se o alvo for uma ca^mera, enta~o as modificac,o~es do painel de apare^ncia aplica-se ao geom que ocupou mais recentemente a posic,a~o de alvo. Os cinco boto~es pro'ximos ao canto superior esquerdo sob a palavra _Show_ (mostrar) controlam que partes do geom alvo sa~o desenhadas. _Faces_ Esse bota~o especifica se faces sa~o desenhadas. _Edges_ Esse bota~o especifica se arestas sa~o desenhadas. _Normals_ Esse bota~o especifica se vetores normais a` superfi'cie sa~o desenhados. _BBox_ Esse bota~o especifica se a caixa associada e' desenhada. _Vects_ Esse bota~o especifica se objetos VECT sa~o desenhados. VECTs sa~o um tipo de objeto OOGL que representa pontos e segmentos de reta em espac,o tridimencional; os VECTs sa~o distintos de arestas ou de outros tipos de objetos, e e' deseja'vel algumas vezes ter controle separado sobre se eles sa~o desenhados. Os quatro boto~es sob _Color_ rotulados _Faces_, Arestas (_Edges_), Normais (_Normals_), e _BBox_ permitem a voce^ especificar a cor do aspecto correspondente de um geom alvo. Clicando sobre um deles faz com que aparec,a um painel de escolha de cores. Figura 3.6: Painel de Escolha de Cor. Esse painel oferece dois conjuntos de boto~es deslizantes: H(ue) S(Saturation) V(alue), ou R(ed) G(reen) B(lue), cada um no intervalo real fechado de 0 a 1. O quadrado mostra a cor atual, que e' fornecida numericamente em ambos os sitemas HSV e RGB nas caixas de texto correspondentes. No sistema de cores HSV, hue H mostra vermelho em 0, verde em .333, azul em .667, e volta ao vermelho em 1.0. Saturac,a~o fornece a frac,a~o de branco misturada na cor, de 0 para cinza puro a 1 para a cor pura. Valor fornece o brilho, de 0 para preto a 1 para brilho ma'ximo. Pressionado o bota~o _RGB_ ou o bota~o _HSV_ ao centro do topo do painel alterna os boto~es deslizantes para outro sistema de cores. Voce^ pode ajustar cores ou atrave's dos boto~es deslizantes, ou atrave's de digitac,a~o nas caixas de texto RGB ou HSV. Clique _OK_ para aceitar as cores que voce^ tiver escolhido, ou _Cancel_ para reter as escolhas anteriores de cor. O navegador _SHADING_ permite a voce^ especificar o modelo de sombreamento que Geomview utilizara' para desenhar o geom alvo. `Constant' Toda face do objeto e' desenhada com uma cor constante que na~o depende da localizac,a~o da face, nem da ca^mera, nem tambe'm das fontes de luz. Se o objeto na~o contiver cores por face ou por ve'rtice, a cor difusa de apare^ncia do objeto e' usada. Se o objeto contiver cores por face, essas cores sera~o usadas. Se o objeto contiver cores por ve'rtice, cada face e' pintada usando a cor de seu primeiro ve'rtice. `Flat' Cada face do objeto e' desenhada com uma cor que depende da localizac,a~o relaiva da face, da ca^mera, e das fontes de luz. A cor e' constante ao longo da face mas pode mudar conforme muda a face, a ca^mera, ou o movimento das luzes. `Smooth' Cada face do objeto e' desenhada com cores lisamente interpoladas baseadas nos vetores normais em cada ve'rtice. Se o objeto na~o contiver normais por ve'rtice, "Smooth" tem o mesmo efeito que o modo de sombreamento "Flat". Se o objeto tiver normais por ve'rtice rasoa'veis, o efeito e' alisamento sobre as arestas e entre as faces. `CSmooth' Cada face do objeto e' desenhada com as cores exatamente especificada(s), independente de iluminac,a~o, orientac,a~o, e propriedades de material. Se o objeto for definido com cores por ve'rtice, as cores sera~o interpoladas lisamente ao longo da face; de outra forma o efeito e' o mesmo que ocorre no estilo de sombreamento "Constant". `VCflat' Uma combinac,a~o de `CSmooth' e sombreamento `Flat'. Dessa forma o sombreamento e' constante em cada face, de acordo com a orientac,a~o relativa das fontes de luz, a ca^mera e a superfi'cie normal da face. O bota~o _Facing Normals_ no painel de apare^ncia (_Appearance_) indica se Geomview pode arranjar aqueles vetores normais ou se na~o pode sempre conforme a visualizac,a~o. Se um vetor normal direciona-se afastando-se do visualizador a cor da face correspondente ou ve'rtice correspondente usualmente e' mais forte do que e' desejado. Geomview pode evitar isso atrave's do uso da normal oposta em ca'lculos de sombreamento. Esse comportamento e' o padra~o. Usando _Facing Normals_ podemos fornecer estranha suavidade pesada ou estranhos efeitos de tonalidade de luz, embora, proximo ao horizonte de um objet distantemente liso facetado. Pressione esse bota~o para usar as normais fornecidas com o objeto. Os tre^s campos no canto inferior esquerdo do painel de apare^ncia (_Appearance_) sa~o: _Line Width_ A espessura, em pixels, para linhas desenhadas pelo Geomview. _Normal Length_ Isso e' atualmente um fator de homotetia; quando vetores normais forem desenhados, Geomview desenha-os de forma que tenham um comprimento que e' seu comprimento natural vezes esse nu'mero. _Patch Dicing_ Geomview desenha retalhos de Bezier primeiro convertendo-so em malhas. Esse para^metro especifica a resoluc,a~o da malha: se _Patch Dicing_ for N, enta~o uma malha N por N e' usada para desenhar cada retalho de Bezier. Se _Patch Dicing_ for 1, a resoluc,a~o reverte-se para um valor padra~o interno. O bota~o _Revert_ no painel de apare^ncia (_Appearance_) desfaz todas as escolhas na apare^ncia do alvo. Isso faz com que o geom alvo herde todas as suas propriedades de apare^ncia de seus pais. O bota~o do painel de apare^ncia (_Appearance_) determina se controles de apare^ncia devem sobrescrever escolhas feitas nos objetos em si mesmos - por exemplos, escolhendo a cor de face ira' afetar todas as faces de objetos com faces multicoloridas. De outra forma, controles de apare^ncia somente fornecem escolhas que na~o forem especificadas nos objetos em si mesmos na~o especificarem. Por padra~o, _Override_ esta' habilitado. Esse bota~o aplica-se a todos os objetos, e a todos os paine'is relacionados a apare^ncia. Normalizac,a~o e' um tipo de homotetia; Geomview pode alterar o tamanho de um objeto proporcionalmente de forma que esse objeto se ajuste dentro de uma certa regia~o. O objetivo principal da normalizac,a~o e' permitir a voce^ facilmente visualizar um objeto sem ter que se preocupar com o tamanho do mesmo. Estamos substituindo gradualmente o recurso de normalizac,a~o do Geomview por recursos mais robustos de posicionamento de ca^mera. Em geral, o melhor caminho de garantir que voce^ esta' vendo tudo de um objeto e' usar o bota~o _Look At_ do painel de ferramentas (_Tools_). A normalizac,a~o pode ser completamente substitui'da por esse bota~o do painel de ferramentas e por outros recursos em uma versa~o futura do Geomview. Normalizac,a~o e' uma propriedade que aplica-se a cada geom separadamente. o navegador _NORMALIZE GEOMETRY_ afeta a propriedade de normalizac,a~o do geom alvo. Se o geom alvo for "World", a normalizac,a~o afetara' todos os geoms. _None_ Sem normalizac,a~o. _Individual_ Normaliza o geom atual para ajustar-se dentro de uma esfera unita'ria. _Sequence_ Assemelha-se a "Individual", exceto quando um objeto esta' mudando. Enta~o, "Individual" com muita precisa~o ajusta a caixa associada em torno do objeto quando esse objeto modifica-se e normaliza-se adequadamente, enquanto "Sequence" normaliza a unia~o de todas as variantes do objeto e normaliza ade-quadamente. _Keep_ Mantem a transformac,a~o de normalizac,a~o inalterada quando o objeto modifica-se. _Keep_ pode ser u'til para aplicar a normalizac,a~o "Individual" ou a normalizac,a~o "Sequence" a` primeira versa~o de um objeto que se modifica para trazer esse mesmo objeto ao campo de visa~o.  File: geomview-pt_BR, Node: Painel de Materiais, Next: Painel de Iluminacao, Prev: Painel de Aparencia, Up: Aparencia 3.6.2 O Painel de Materiais --------------------------- O painel de materiais (_Materials_) controla as propriedades materiais das surperfi'cies. O painel de materiais trabalha com o objeto alvo da mesma forma que o painel de apare^ncia (_Appearance_) faz. Figura 3.7: O Painel de Materiais. _Translucent_ Esse bota~o determina se a capacidade de ser translu'cido esta' habilitada. Geomview suporta tre^s diferentes formas da capacidade de ser translu'cido (transluce^ncia): _Alpha-blending com BSP-tree depth-sorting_ Esse e' o ni'vel mais acurado de prefere^ncia de visualizac,a~o imediata, mas consome vastos montantes de tempo de computac,a~o e memo'ria. No modo simples de transluce^ncia objetos sa~o mostrados corretamente em relac,a~o a si mesmos; todavia multiplos objetos translu'cidos podem aparecer na ordem inadequada na tela. A noc,a~o _objeto_ significa aqui: geometria de ni'vel mais alto como mostrado no navegador de alvo de geometria. _Screen Door Translucency_ Se a ma'quina suporta OpenGL enta~o existe suporte para tipo de transluce^ncia por mascaramento de sai'da (completamente) de pixels transparentes por meio de uma mascara de ponteamento. Essa forma e' atualmente muito experimental, e o resultado e' de certa forma o ideal, mas funciona e e' ra'pido. _Alphe-blending sem depth-sorting_ Esse e' a antiga forma de fazer uma transluce^ncia ra'pida e com muitas falhas. Essa e' ra'pida, mas os resultados sa~o completamente incorretos. Quando a transpare^ncia estiver habilitada, um instanta^neo RenderMan ira' conter a informac,a~o alfa, um renderizador obediente pode enta~o gerar figuras de alta qualidade, incluindo a transluce^ncia correta. _Alpha_ O bota~o deslizante determina a opacidade/transpare^ncia quando a transpare^ncia estiver habilitada. 0 (zero) significa totalmente transparente, 1 significa totalmente opaco. _Diffuse Reflectance_ Esse bota~o deslizante controla a reflecta^ncia difusa de uma superfi'cie. Isso tem a ver com o quanto a superfi'cie dispersa a luz que reflete. _Shininess_ Esse bota~o deslizante controla o quanto brilhante a superfi'cie e'. Esse bota~o determina o tamanho de destaques especulares sobre a superfi'cie. Valores pequenos fornecem a` superfi'cie uma apare^ncia sombria. _Ambient Reflectance_ Esse bota~o deslizante controla o quanto da luz ambiente uma superfi'cie reflete. _Specular Reflectance_ Esse bota~o deslizante controla a reflecta^ncia especular de uma superfi'cie. Isso tem a ver com como a superfi'cie reflete diretamente os raios luminosos. Valores maiores fornecem destaques de brilho especular. _Done_ Esse bota~o dispensa o painel de materiais (_Materials_).  File: geomview-pt_BR, Node: Painel de Iluminacao, Prev: Painel de Materiais, Up: Aparencia 3.6.3 O Painel de Luzes ----------------------- O painel de luzes (_Lights_) controla o nu'mero, a posic,a~o, e a cor das fontes de luz usadas no sombreamento. [image src="figs/light.png"] O Painel de Iluminac,a~o. O painel de iluminac,a~o (_Lighting_) e' diferente do painel de apare^ncia (_Appearance_) e dos paine'is de material (_Material_) no sentido de que o painel de iluminac,a~o sempre trabalha com a apare^ncia base. Isso ocorre pelo fato de fazer sentido usar o mesmo conjunto de luzes para desenhar todos os objetos na sua cena. _LIGHTS_ O navegador de luzes (_LIGHTS_) mostra a luz atualmente selecionada. Modificac,o~es sa~o feitas usando os outros meios de escolha sobre esse painel aplicado a essa luz. Existe sempre pelo menos uma luz, a luz ambiente. _Intensity_ Esse bota~o deslizante controla a intensidade da luz atual. _Color_ Esse bota~o faz surgir um modificador de corres que lhe permite selecionar a cor da luz que atualmente ilumina o objeto. _Add_ Esse bota~o adiciona uma luz. _Delete_ Esse bota~o exclui a luz atual. _Show Lights_ Esse bota~o permite a voce^ ver e modificar a posic,a~o das fontes de iluminac,a~o em uma janela de ca^mera. Cada luz e' movida ao longo de um cilindro que e' suposto para lembrar a voce^ um raio de luz. Quando voce^ clica sobre o bota~o _Show Lights_ Geomview entra no modo "light edit", durante o qual voce^ pode rotacionar a iluminac,a~o atual mantendo pressionado o bota~o esquerdo do mouse e movendo o mouse. Iluminac,a~o colocada dessa forma esta~o infinitamente distantes, de forma que o que voce^ esta' modificando e' a posic,a~o angular. Clique sobre o bota~o _Show Lights_ novamente para retornar ao modo anterior de movimento e para sair movendo os raios de luz. _Done_ Esse bota~o dispensa o painel de iluminac,a~o (_Lighting_). Os paine'is do Geomview _Appearance_, _Materials_, e _Lighting_ sa~o construi'dos para permitir a voce^ fazer facilmente a maioria das coisas relacionadas a apare^ncia que voce^ pode querer fazer. A hierarquia de apare^ncia que Geomview suporta internamente, todavia, e' muito complexa e existem certas operac,o~es que voce^ na~o pode fazer com os paine'is. A linguagem de comandos do Geomview (GCL) fornece suporte completo a operac,o~es sobre apare^ncia. Em particular, o comando `merge-baseap' pode ser usado para modificar a apare^ncia de base (a qual, exceto para iluminac,a~o, na~o pode ser modificada atrave's de paine'is do Geomview). O comando `merge-ap' pode ser usado para modificar a apare^ncia de um geom individualmente. Apare^ncias podem tambe'm serem especificadas nos arquivos OOGL; para detalhes veja, *note Aparencias::. *note `(merge-baseap ...)': merge-baseap. *note `(merge-ap ...)': merge-ap.  File: geomview-pt_BR, Node: Cameras, Next: Gravando, Prev: Aparencia, Up: Interacao 3.7 Cameras =========== Uma ca^mera no Geomview e' o objeto que corresponde a uma janela de ca^mera. Por padra~o existe somente uma ca^mera, mas e' possi'vel ter tantas quantas voce^ quiser. Voce^ pode controlar certos aspectos do objeto visi'vel atualmente na janela de ca^mera arrastando em cada janela de ca^mera via o painel _Cameras_. Figura 3.8: O Painel de Ca^mera. Se o objeto alvo for uma ca^mera, o painel de ca^meras (_Cameras_) afeta essa ca^mera. Se o objeto alvo na~o for uma ca^mera, o painel de ca^meras (_Cameras_) afeta a ca^mera atual ("current camera"). A ca^mera atual e' a ca^mera da janela que o cursor do mouse esta' nela, ou estava mais recentemente se o cursor na~o estiver em uma janela de ca^mera. Dessa forma, se voce^ usa teclas de atalho para as ac,o~es no painel de ca^meras (_Cameras_) enquanto o cursor estiver em uma janela de ca^mera, as ac,o~es aplicam-se a aquela ca^mera, a menos que voce^ tenha explicitamente selecionado outra ca^mera. Para criar novas janelas de ca^mera, use a tecla de atalho `v+', ou veja o menu arquivo (_File_) no painel principal (_Main_). _Single-Buffering_ Normalmente, janelas do Geomview sa~o armazenadas em a'reas de memo'ria duplas (_double-buffered_): Geomview desenha a figura seguinte em uma janela escondida, enta~o alterna as a'reas de memo'ria para fazer essa janela completamente visi'vel em algum momento. Sobre muitos sistemas operacionais, a memo'ria para a a'rea de memo'ria escondida vem da apropriac,a~o indevida de metade dos bits de cada pixel de tela, reduzindo a resoluc,a~o de cor. Quando a opc,a~o a'rea de memo'ria simples (single-buffering) for habilitada, as peli'culas de tela de cada cena esta' sendo desenhada, mas voce^ pode pegar imagens planas com reduc,a~o de granularidade estremecendo artefatos. A'rea de memo'ria simples e' possi'vel se Geomview for compilado com GL ou com OpenGL, mas na~o com gra'ficos desenhados com recursos u'nicos e exclusivos do X. _Dither_ Muitos monitores oferecem menos que 24 bits por pixel (8 bits para cada vermelho, verde, e azul) convencionalmente suficiente para mostrar gradac,o~es de cor simplesmente. Quando tenta mostrar uma cor na~o acuradamente disponi'vel no monitor, Geomview normalmente estremece (_dithers_), modificando as cores do pixel para algumas vezes mais brilhante, algumas vezes mais escuro que o valor desejado, de forma que a cor disponi'vel sobre uma a'rea e' uma melhor aproximac,a~o para a cor verdadeira que um pixel simples pode ter. Efetivamente perdas de resoluc,a~o espacial sa~o para ganhar resoluc,a~o de cor. Esse compartamento na~o e' sempre deseja'vel, todavia. Desabilitando _Dither_ fornece menor granularidade, mas a precisa~o de cores e' menor, das imagens. _Software Shading_ Esse bota~o controla se Geomview faz ca'lculos de sombreamento via software. O padra~o e' permitir que o hardware manuseie esses ca'lculos, e no espac,o Euclideano esse caminho e' o melhor sempre porque e' o caminho mais ra'pido. No espac,o hiperbo'lico e tambe'm no espac,o esfe'rico, todavia, os ca'lculos de sombreamento que o hardware faz sa~o incorretos. Clique sobre esse bota~o para habilitar a forma correta mas lenta do ca'lculo de sombreamento via software. _Background Color_ Esse bota~o faz surgir um modificador de cores que voce^ pode usar para escolher a cor de fundo da janela da ca^mera. _PROJECTION_ Esse navegador permite a voce^ selecionar entre projec,a~o perspectiva ou projec,a~o ortogra'fica para essa ca^mera. _Near clip_ Essa caixa de texto determina a dista^ncia nas coordenadas do objeto mundo do pro'ximo plano de corte a partir do ponto de visa~o. Deve ser um nu'mero positivo. _Far clip_ Essa caixa de texto determina a dista^ncia nas coordenadas do objeto mundo do plano de corte mais distante a partir do ponto de visa~o. Deve ser um nu'mero positivo e em geral deve ser maior que o valor de _Near clip_. _FOV_ Essa caixa de texto e' o campo de visa~o da ca^mera, medido em sua menor direc,a~o. No modo perspectiva, essa caixa corresponde a um a^ngulo em graus. No modo ortogra'fico, essa caixa de texto corresponde ao tamanho linear do campo de visa~o. Esse nu'mero pode ser modificado com o mouse no modo _Cam Zoom_. _Focal Length_ A dista^ncia focal pretende pretende sugerir a dista^ncia da ca^mera a um plano imagina'rio de interesse. Seu valor e' usado quando alternamos entre as visualizac,o~es ortogra'fica e perspectiva (e durante visualizac,a~o stereo), de forma a preservar o tamanho aparente de objetos sendo desonesto quanto a` dista^ncia focal da ca^mera. Dista^ncia focal tambe'm afeta a interpolac,a~o de movimentos de translac,a~o efetuados usando o mouse. A velocidade do movimento para adiante (nos modos translac,a~o, vo^o e no modo orbital) e' proporcional a` dista^ncia focal; e objetos desonestos quanto a` dista^ncia focal da ca^mera translacionam lateralmente na mesma raza~o que o cursor do mouse. Finalmente, no modo de projec,a~o N-Dimencional, ca^meras sa~o substitui'das de volta atrave's da dista^ncia focal a partir da projec,a~o tridimensional da ori'gem do objeto mundo. _Lines Closer_ Esse nu'mero tem a ver com o caminho pelo qual as linhas sa~o desenhadas. Normalmente a a'rea de armazenamento tempora'rio do algori'tmo que controla as coordenadas do eixo z podem confundir-se na hora de desenhar linhas que localizam-se exatamente sobre superfi'cies (tais como as arestas de um objeto); devido a erros de arredondamento de ma'quina, algumas vezes as linhas parecem estar em frente a` superfi'cie e algumas vezes elas parecem estar por detra's da superfi'cie. O valor _Lines Closer_ e' um fator de correc,a~o -- Geomview modifica sutilmente todas as linhas que o algori'tmo da a'rea de armazanamento tempora'ria desenha fechando para a ca^mera atrave's desse fator. O nu'mero deve ser um inteiro pequeno; tente 5 ou 10. O valor zero (0) desabilita esse recurso completamente. Escolhendo valores grandes tornara' as linhas visi'veis mesmo quando elas devam ser escondidas. _SPACE MODEL_ Essa opc,a~o determina o modelo usado para desenhar o objeto mundo. E' mais u'til em espac,os hiperbo'licos e esfe'ricos. Voce^ provavelmente na~o necessitara' tocar esse navegador se voce^ permanecer no espac,o Euclideano. Para mais informac,a~o sobre esses modelos, veja *note Geometrias Nao-Euclidianas::. _Virtual_ Esse e' o modelo padra~o e representa a visualizac,a~o natural de dentro do espac,o. _Projective_ Corresponde ao modelo projetivo do espac,o hiperbo'lico e do espac,o esfe'rico. Geoms movem-se obedecendo as isometrias do espac,o, e ca^meras movem-se atrave's de movimentos Euclideanos. Por padra~o em modelos projetivos, a esfera unita'ria Euclidiana e' desenhada. No espac,o hiperbo'lico essa esfera localiza-se no infinito. No espac,o Euclideano o modelo projetivo e' o mesmo que o modelo virtual exceto que a esferea e' desenhada por padra~o. _Conformal_ Corresponde ao modelo conformal do espac,o hiperbo'lico e do espac,o esfe'rico. Geoms movem-se obedecendo as isometrias do espaco, e ca^meras move-se atrave's de movimentos Euclideanos. No espac,o Euclidiano, o modelo conformal equivale a inverter tudo na esfera unita'ria. _Draw Sphere_ Essa opc,a~o controla se Geomview desenha a esfera unita'ria ou na~o. Por padra~o a esfera unita'ria aparece no modelo projetivo e no modelo conformal. No espac,o hiperbo'lico a esfera e' colocada no infinito. No espac,o esfe'rico corresponde a` esfera equatorial. _Done_ Esse bota~o dispensa o painel de _Cameras_.  File: geomview-pt_BR, Node: Gravando, Next: Comandos, Prev: Cameras, Up: Interacao 3.8 Gravando Seu Trabalho ========================= O painel _Save_ do Geomview permite a voce^ armazenar objetos do Geomview e outra informac,a~o em arquivos que voce^ pode recuperar dentro do Geomview ou a partir de outros programas. Figura 3.9: O Painel Gravar. Para usar o painel _Save_ voce^ seleciona o formato desejado no navegador perto da palavra _Save_, informe o nome do objeto que voce^ quer gravar no campo de texto perto da palavra _for_, e informe o nome do local no qual voce^ deseja gravar o arquivo no campo longo de texto perto da palavra _in_. Voce^ pode ou pressionar `' ou clicar sobre o bota~o _OK_. Quando o arquivo tiver sido gravado no local desejado, o painel _Save_ desaparecera'. Caso voce^ queira dispensar o painel _Save_ sem gravar um arquivo, clique no bota~o _Cancel_. Caso voce^ especifique `-' como nome de arquivo, Geomview mostra o arquivo na sai'da padra~o, i.e. na janela de shell a partir da qual voce^ invocou o Geomview. Os possi'veis formatos sa~o fornecidos abaixo. O tipo de objeto que pode ser escrito com cada formato e' fornecido entre pare^ntesis. _Commands (qualquer objeto)_ A opc,a~o "Commands" escreve um arquivo de comandos GCL contendo todas as informac,o~es sobre o objeto. Chamando o arquivo posteriormente ira' restaurar o objeto bem como todas as outras informac,o~es sobre o referido objeto, tais como apare^ncia, transformac,o~es, etc. _Geometry alone (geom)_ A opc,a~o "Geometry alone" escreve um arquivo OOGL contendo apenas a geo-metria do objeto. _Geometry [in world] (geom)_ A opc,a~o "Geometry [in world]" escreve um arquivo OOGL contendo a geometria do objeto, transformado sob a transformac,a~o atual do Geomview para esse objeto. Use a opc,a~o "Geometry [in world]" caso voce^ tenha movido o objeto de sua posic,a~o inicial e queira a nova posic,a~o em relac,a~o ao objeto mundo. _Geometry [in universe] (geom)_ A opc,a~o "Geometry [in universe]" grava um arquivo OOGL contendo apenas a geometria do geom, transformado sob transformac,o~es sofridas pelo objeto e tambe'm sob transformac,o~es sofridas pelo objeto mundo. _RMan [->tiff] (camera)_ A opc,a~o "RMan [->tiff]" escreve um arquivo que quando for renderizado cria uma imagem tiff. Transpare^ncia e textura (a mais recente somente ate' certo ponto) estara' disponi'vel. _RMan [->frame] (camera)_ A opc,a~o "RMan [->frame]" escreve um arquivo RenderMan que quando for rede-rizado faz com que uma imagem aparec,a em uma janela na tela. Transpare^ncia e textura (a mais recente somente ate' certo ponto) estara' disponi'vel. _SGI snapshot (camera)_ A opc,a~o "SGI snapshot" escreve um arquivo de varredura SGI. Uma campainha toca quando o instanta^neo for completado. Somente disponi'vel em sistemas SGI. _PPM GLX-offscreen snapshot (camera)_ Renderiza uma cena completa novamente dentro da memo'ria off-screen; GLX fornece os meios para usar um Pixmap como a'rea de renderizac,a~o. A vantagem de renderizar dentro da memo'ria _off_-screen em relac,a~o a pegar um instanta^neo de tela e' que a janela de ca^mera na~o precisa ser mapeada e tambe'm na~o precisa aparece na hora do intanta^neo e' realizado. De forma que com o intanta^neo off-screen se pode seguramente colocar a janela de ca^mera no formato de i'cone (mas na~o fecha'-la!), ativar a protec,a~o de tela e ir dormir enquanto algum script avanc,a as cenas e grava os instanta^neos. _PPM Screen snapshot (camera)_ Grava os instanta^neos a partir da janela fornecida e grava no formato de imagem PPM. Se voce^ especificar uma seque^ncia de caracteres comec,ando com um barra vertical (`|') como nome de arquivo, isso e' interpretado com um comando de redirecionamento do shell para o qual os dados do PPM devera~o ser canalizados, como em `| pnmtotiff > snap.tiff' ou em `| convert -geometry 50% ppm:- snap.gif'. Instanta^neos de tela PPM esta~o somente disponi'veis com GL e open GL, na~o com gra'ficos X somente. A janela pode ocupar inteiramente tela. Geomview ira' garantir que na~o haja outras janelas reproduzindo-a enquanto o instanta^neo e' gravado. E' provavelmente melhor usar instanta^neos GLX-_off-screen_, como acima exposto. _PPM software snapshot (camera)_ Escreve um instanta^neo da janela atualmente visualizada, como uma imagem PPM, apra o arquivo fornecido. O nome do arquivo pode ser um comando do shell Bourne precedido por uma barra vertical (`|'), da mesma forma que com o insta^nta^neo de tela PPM (PPM screen snapshot). O instanta^neo de software, apesar disso, e' produzido atrave's do uso de software renderizador interno (relacionado ao renderizador do sistema X-window). Na~o e' importante se a janela esta' visi'vel ou na~o, e e' independente do GL ou do OpenGL. Tambe'm essa opc,a~o na~o suporta alguns recursos, tais como mapeamento de textura. _Postscript snapshot (camera)_ Escreve um instanta^neo Postscript da visa~o da ca^mera. O instanta^neo e' feito atrave's da decomposic,a~o da cena em linhas e poli'gonos, ordenando por intensidade, e gerando linhas no formato Postscript e poli'gonos para cada uma. Vantagens desse processo sobre o processo baseado em pixes do instanta^neo de imagens: a resoluc,a~o e' muito alta, de forma que arestas parecem na posic,a~o correta mesmo em impressoras de alta resoluc,a~o, ou imagens de resoluc,a~o compara'vel sa~o tipicamente muito mais compactas. Desvantagens: ordenac,a~o por intensidade fornece bons resultados em algumas cenas, mas pode ser grandemente ruim como no algori'tmo de remoc,a~o de cenas ocultas em outras cenas. Tambe'm, Postscript na~o oferece sombreamento interpolado linear, somente sombreamento linear simples para cada faceta. _Camera (camera)_ Escreve um arquivo OOGL de uma ca^mera. _Transform [to world] (qualquerobjeto)_ Escreve um arquivo de transformac,a~o OOGL fornecendo transformac,a~o do Geomview para o objeto. _Transform [to universe] (qualquerobjeto)_ Escreve um arquivo de transformac,a~o OOGL fornecendo uma transformac,a~o que e' a composic,a~o de transformac,a~o do Geomview para o objeto e a transformac,a~o sofrida pelo objeto mundo. _Window (camera)_ Escreve um arquivo de janela OOGL para uma ca^mera. _Panels_ Escreve um arquivo GCL contendo comandos que gravam o estado de todos os paine'is do Geomview. Chamando esse arquivo posteriormente ira' restaurar as posic,o~es de todos os paine'is.  File: geomview-pt_BR, Node: Comandos, Next: Atalhos de Teclado, Prev: Gravando, Up: Interacao 3.9 O Painel de Comandos ======================== O painel de comandos (_Commands_) permite a voce^ digitar comandos GCL. Quando voce^ pressionar `', Geomview interpreta o comando e imprime qualquer sai'da resultante ou uma mensagens de erro para a sai'da padra~o. Voce^ pode editar o texto e pressionar `' tantas vezes quantas voce^ quiser, em geral, mesmo que voce^ pressione (`') com o cursor no painel de comandos ( _Commands_), Geomview tenta interpretar se aquele texto que voce^ tiver digitado no campo de texto como um comando. [image src="figs/command.png"] Figura 3.10: O Painel de Comandos.  File: geomview-pt_BR, Node: Atalhos de Teclado, Prev: Comandos, Up: Interacao 3.10 Atalhos de Teclado ======================= A maioria das ac,o~es que voce^ pode fazer atrave's dos paine'is do Geomview possui as equivalentes teclas de atalho de forma que voce^ pode fazer a mesma ac,a~o digitando uma seque^ncia de teclas usando o teclado. Isso e' u'til para usua'rios avanc,ados que forem familiarizados com as capacidades do Geomview e que queiram trabalhar rapidamente sem ter montes de paine'is confundindo a tela. Teclas de atalho comumente sa~o indicadas entre colche^tes ([ ]) pro'ximo ao item correspondente em um painel. Por exemplo, a tecla de atalho para o modo de rotac,a~o (_Rotate_) e' 'r'; isso e' indicado por "[r]" aparecendo antes da palavra "Rotate" no navegador _MOTION MODE_. Para utilizar essa tecla de atalho apenas pressione a tecla `r' enquanto o cursor do mouse estiver sobre qualquer janela do Geomview. Voce^ na~o precisa pressionar a tecla `' ou teclas de `'. Alguns atalhos consistem de mais que uma tecla. Nesses casos apenas digite as teclas indicadas uma apo's a outra e na ordem indicada, sem `' apo's cada tecla. Atalhos de teclado sa~o sensi'veis a` caixa alta/baixa. Voce^ pode cancelar atalhos compostos por va'rias teclas que voce^ tiver iniciado a digitac,a~o digitando qualquer tecla inva'lida como de atalho, por exemplo a barra de espac,o. Comandos de teclado aplicam-se enquanto o cursor estiver em qualquer janela de ca^mera e na maioria dos paine'is de controle. Muitas teclas de atalho permitem argumentos nume'ricos que voce^ digitar como um prefixo a tecla(s) de comando. Por exemplo, a tecla de atalho para _Near clip_ no painel de ca^mera e' `v n'. Para escolher o pro'ximo plano de corte para `0.5', digite `0.5vn'. Comandos que na~o recebem um prefixo nume'rico modificam ou mudam para zero o valor atual. A maioria dos comando permitem um dos seguintes prefixos de selec,a~o. Se nenhum objeto for fornecido o comando aplica-se ao objeto alvo. `g' objeto geome'trico mundo ("world") `g#' #'e'simo objeto geome'trico ("geom") `g*' Todos os objetos geome'tricos ("geoms") `c' ca^mera atual `c#' #'e'sima ca^mera `c*' Todas as ca^meras Por exemplo, `g4af' significa modifique a face desenhada do objeto _g4_. Simplesmente digitando um prefixo de selec,a~o, como `g4', na~o seleciona um objeto ainda; isso somente acontece quando um comando, como `ae', segue o prefixo. Para selecionar um objeto como alvo sem fazer nada mais para isso, use o comando `p'. Enta~o `g3p' seleciona o objeto g3. O campo de texto no canto superior esquerdo faz o painel principal (_Main_) mostrar o estado da tecla de atalho atual. Para adic,a~o de teclas de atalho ao painel de comandos, existe tambe'm um atalho para selecionar um objeto alvo: digite o nome curto do objeto seguido por `p'. Por exemplo, para selecionar o objeto _g3_, digite `g 3 p'. Essa forma funciona somente com nomes curtos -- aqueles que aparecem entre colche^tes ([ ]) no navegador de alvos (_Targets_) do painel principal _Main_. Abaixo encontra-se um suma'rio de todas as teclas de atalho. Desenho `af' Faces `ae' Arestas `an' Normais `ab' Caixas Associadas `aV' Vetores Sombreamento `0as' Constante `1as' Mono'tono `2as' Linear `3as' Linear, na~o iluminado `aT' permite transpare^ncia `at' mapeamento de textura Outro `av' vira as normais pelo avesso: sempre visualizador de face `#aw' Espessura da linha (em pixels) `aC' manuseia poli'gonos co^ncavos `#vc' fechador de arestas que na~o pertencem a faces (tente 5-100) Cor `Cf' faces `Ce' arestas `Cn' normais `Cb' caixas associadas `CB' fundo Movimentos `r' rotac,a~o `t' translac,a~o `z' modificac,o~es proporcionais de tamanho (FOV - campo de visa~o) `f' vo^o `o' orbita `s' homotetia `w' recentralizar o alvo `W' recentralizar tudo `h' pare `H' pare tudo `@' selecione o centro do movimento (e.g. `g 3 @') `L' Olhe para objeto Visualizando `0vp' visa~o Ortogra'fica `1vp' visa~o em perspectiva `vd' Habilite outras ca^meras de visa~o `#vv' campo de visa~o `#vn' pro'xima dista^ncia de corte `#vf' dista^ncia de corte afastada `v+' adicione nova ca^mera `vx' cursor ligado/desligado `vb' face de tra's de um poli'gono separada habilitada/desabilitada `#vl' dista^ncia focal `v~' Tonalidade feita via software ligada/desligada Paine'is `Pm' Principal `Pa' Apare^ncia `Pl' Iluminac,a~o `Po' Obscuro `Pt' Ferramentas `Pc' Ca^meras `PC' Comandos `Pf' arquivos `Ps' Salvar `P-' ler comandos pelo tty `PA' Cre'ditos ("about") Luzes `ls' mostrar luzes `le' editar luzes Espac,o `me' Euclidiano `mh' Hiperbo'lico `ms' Esfe'rico Modelo `mv' Virtual `mp' Projetivo `mc' Conformal Outro `0N' normalizac,a~o: nenhuma `1N' normalizac,a~o: individual `2N all' normalizac,a~o: todos `ui' movimento: Ine'rcial `uc' movimento: Contrac,a~o para o eixo `uo' movimento: coordenadas pro'prias do objeto `<' `Pf' carregar arquivo geome'trico ou de comandos `dd' apagar objeto alvo `>' `Ps' grave o estado atual em um arquivo `TV' mudar para o modo NTSC `p' selecionar como objeto alvo (e.g. `g 3 p') Sem preixo, seleciona o objeto sob o cursor do mouse (da mesma forma que duplo-clicando o bota~o direito do mouse)  File: geomview-pt_BR, Node: Formatos dos Arquivos da OOGL, Next: Customizacao, Prev: Interacao, Up: Top 4 Formatos dos Arquivos da OOGL ******************************* Os objetos que voce^ pode carregar dentro do Geomview sa~o chamados objetos OOGL. OOGL significa "Object Oriented Graphics Library" (biblioteca gra'fica orientada a objetos); e' a biblioteca sobre a qual Geomview e' construi'do. Existem muitos tipos diferentes de objetos OOGL. Esse capi'tulo fornece descric,o~es sinta'ticas de formatos de arquivo para objetos OOGL. Exemplos da maioria dos tipos de arquivo podem ser encontrados no direto'rio `data/geom' do Geomview. * Menu: * Convencoes:: Conventions and general remarks. * Formatos de Arquivo de Objeto:: Formatos de Arquivo de Objeto. * Objetos nao-geometricos:: Non-geometric objetos.  File: geomview-pt_BR, Node: Convencoes, Next: Formatos de Arquivo de Objeto, Prev: Formatos dos Arquivos da OOGL, Up: Formatos dos Arquivos da OOGL 4.1 Convenc,o~es ================ * Menu: * Sintaxe comum:: Sintaxe Comum a Todos os formatos de arquivo da OOGL. * Nomes de arquivos:: Nomes de Arquivo. * Vertices:: Ve'rtices. * ND-Vertices:: Ve'rtices N-dimensionais. * Direcoes de superficies normais:: Direc,a~o de superfi'cies normais. * Matrizes de transformacao:: Matrizes de transformac,a~o. * Matrizes de transformacao ND:: Matrizes de transformac,a~o N-dimensional. * Formato binario:: Formato bina'rio. * Referencias:: Objetos embargados e refere^ncias externa a objeto. * Aparencias:: Apare^ncias. * Mapeamento de Textura:: Mapeamento de textura.  File: geomview-pt_BR, Node: Sintaxe comum, Next: Nomes de arquivos, Prev: Convencoes, Up: Convencoes 4.1.1 Sintaxe Comum a Todos os Formatos de Arquivo da OOGL ---------------------------------------------------------- A maioria dos formatos de arquivo de objeto OOGL sa~o do formato livre ASCII -- qualquer quantidade de espac,os em branco (caracteres na~o imprimi'veis, tabulac,o~es, caractere de nova linha) pode aparecer entre os sinalizadores (nu'meros, palavras chave, etc.). Paradas de linha sa~o na maioria das vezes sempre insignificantes, com algumas excesso~es devidamente ressaltadas. Comenta'rios comec,am com # e continuam ate' o fim da linha; esses comenta'rios sa~o permitidos em qualquer lugar onde um caractere de nova linha for permitido tambe'm. Formatos bina'rios sa~o tambe'm definidos para muitos objetos; Veja *note Formato binario::, e as descric,o~es individuais do objeto. Objetos ti'picos OOGL comec,am com uma palavra chave designando o tipo de objeto, possivelmente com modificadores indicando a presenc,a de informac,o~es de cor, etc. Em alguns formatos a palavra chave e' opcional, por questo~es de compatibilidade com formatos de arquivo definidos em outros lugares. O tipos de objeto e' enta~o determinado por suposic,a~o sobre o sufixo do arquivo (se houver) ou pelos dados em si mesmos. Palavras chave sa~o sensi'veis a` caixa alta/baixa. Algumas palavras chave possuem letras de prefixo adicionais indicando a presenc,a de cor ou outros dados; nesse caso a ordem dos prefixos e' importante, e.g. `CNMESH' e' significativo mas `NCMESH' e' inva'lido.  File: geomview-pt_BR, Node: Nomes de arquivos, Next: Vertices, Prev: Sintaxe comum, Up: Convencoes 4.1.2 Nomes de Arquivo ---------------------- Quando objetos OOGL sa~o lidos de arquivos localizados em disco, a biblioteca OOGL usa o sufixo do arquivo para supor o tipo de arquivo. Se o sufixo for desconhecido, ou estiver ause^nte (e.g. para um objeto sendo lido a partir da sai'da de um outro comando diretamente, ou lido diretamente de dentro de um outro objeto OOGL), todos os tipos conhecidos de objeto sa~o tentados por sua vez ate' que se aceite os dados como va'lidos.  File: geomview-pt_BR, Node: Vertices, Next: ND-Vertices, Prev: Nomes de arquivos, Up: Convencoes 4.1.3 Ve'rtices --------------- Muitos objetos compartilham um estilo comum de representar ve'rtices com opc,o~es de superfi'cie normal de ve'rtice e cor. Todos os ve'rtices dentro de um objeto possuem o mesmo formato, especificado pela palavra chave no cabec,alho. Todos os dados para um ve'rtice esta~o agrupados juntos (em oposic,a~o a e.g. fornecimento de coordenadas para todos os ve'rtices, em seguida cores para todos os ve'rtices, e assim por diante). A sintaxe e' `X Y Z' (coordenadas do ve'rtice tridimensionais em ponto flutuante) ou `X Y Z W' (coordenadas do ve'rtice tetradimensionais em ponto flutuante) opcionalmente seguida por `NX NY NZ' (superfi'cie normalizada tridimensional se presente) opcionalmente seguida por `R G b A' (componente qua'drupla em ponto flutuante se presente, cada componente no intervalo 0..1. A componente A (alfa) representa a opacidade: 0 transparente, 1 opaco.) opcionalmente seguida por `S T' `ou' `S T U' (duas ou tre^s valores coordenados de textura). Valores sa~o separados por espac,os em branco, e quebras de linha sa~o imateriais. Letras na palavra chave de cabec,alho do objeto devem aparecer numa ordem especi'fica; isto e' a ordem reversa na qual os dados sa~o fornecidos para cada ve'rtice. Enta~o ve'rtices de objeto do tipo `CN4OFF' possuem primeiramente as componentes quadridimensionais de posicionamento no espac,o, a seguir as componentes normais tridimensionais, finalmente as componentes quadridimensionais de cor. Voce^ pode modificar a ordem dos dados modificando o cabec,alho de palavra chave; um `NCOFF' e' apenas na~o reconhecido.  File: geomview-pt_BR, Node: ND-Vertices, Next: Direcoes de superficies normais, Prev: Vertices, Up: Convencoes 4.1.4 Ve'rtices N-dimensionais ------------------------------ Muitos objetos compartilham um estilo comum de representac,a~o de ve'rtice com opcionais de superfi'cie normal e cor. Todos os ve'rtices dentro de um objeto possuem o mesmo formato, especificado pela palavra chave do cabec,alho. Todos os dados para um ve'rtice esta~o agrupados juntos (em oposic,a~o a e.g. fornecendo coordenadas para todos os ve'rtices, a seguir cores para todos os ve'rtices, e assim por diante). A sintaxe para ve'rtices N-dimensionais (N > 3) e' `X[1] X[2] X[3] X[4] ...' (N coordenadas do ve'rtice em ponto flutuante) ou `X[0] X[1] X[2] X[3] X[4] ...' ((N+1) coordenadas do ve'rtice em ponto flutuante, se o modificador `4' tiver sido especificado na linha de cabec,alho do objeto) Note, todavia, que objetos N-dimensionais internamente sempre possuem pontos (N+1)-dimensionais; a primeira componente X[0] - se presente no arquivo do objeto file - e' usada como divisor homoge^neo. Isso e' diferente do caso tridimensional comum onde o modificador `4' gera um objeto quadridimensional onde a componente quadridimensional implicitamente e' escolhida para 1. Componentes de cor usualmente podem ser especificadas da mesma forma que para ve'rtices tridimensionais, Veja *note Vertices::, enquanto especificando componentes de cor em normais na~o faz sentido.  File: geomview-pt_BR, Node: Direcoes de superficies normais, Next: Matrizes de transformacao, Prev: ND-Vertices, Up: Convencoes 4.1.5 Direc,o~es de superfi'cies normais ---------------------------------------- Geomview utiliza vetores normais para determinar como um objeto e' compartilhado. A direc,a~o da normal e' importante nesse ca'lculo. Quando normais forem fornecidos com um objeto, a direc,a~o da normal e' determinada pelos dados fornecidos. Quando normais na~o forem fornecidos com o objeto, Geomview calcula vetores normais automaticamente; nesse caso normais apontam para adiante do lado do qual os ve'rtices aparecem na ordem anti-hora'ria. Sobre superfi'cies parame'tricas (retalhos de Bezier), o vetor normal no ponto P(u,v) esta' na direc,a~o dP/du multiplicado vetorialmente por dP/dv.  File: geomview-pt_BR, Node: Matrizes de transformacao, Next: Matrizes de transformacao ND, Prev: Direcoes de superficies normais, Up: Convencoes 4.1.6 Matrizes de transformac,a~o --------------------------------- Alguns objetos incorporam matrizes quadradas reais de ordem 4 para transformac,o~es sobre objetos homoge^neos. Essas matrizes atuam atrave's de multiplicac,a~o a` direita de vetores. Dessa forma, se p for um vetor linha de 4 elementos representando coordenadas homoge^neas de um ponto no objeto OOGL, e A for a matrix 4x4, enta~o o ponto resultante da transformac,a~o e' p' = p A. Essa convenc,a~o matricial e' comum em computac,a~o gra'fica; e' a matriz transposta daquela muitas vezes usada em matema'tica, onde pontos sa~o vetores coluna multiplicados a` direita pelas matrizes. Dessa forma para transformac,o~es Euclideanas, as componentes para translac,a~o aparecem na quarta linha (os u'ltimos quatro elementos) da matriz A. A u'ltima coluna da matriz A (quarto, oitavo, de'cimo segundo e de'cimo sexto elementos) sa~o tipicamente 0, 0, 0, e 1 respectivamente.  File: geomview-pt_BR, Node: Matrizes de transformacao ND, Next: Formato binario, Prev: Matrizes de transformacao, Up: Convencoes 4.1.7 Matrizes de transformac,a~o ND ------------------------------------ No contexto do espac,o N-dimensional (N > 3) alguns objetos incorporam (N+1)x(N+1) matrizes reais para transformac,o~es sobre objetos homoge^neos. Essas matrizes atuam atrave's de multiplicac,a~o a` direita de vetores. Dessa forma, se p for um vetor linha de (N+1)-elementos representando coordenadas homoge^neas de um ponto no objeto OOGL, e A e' a matriz quadrada de ordem (N+1), enta~o o ponto resultante da transformac,a~o e' p' = p A. Note que (a excessa~o de matrizes de transformac,a~o 4x4, veja *note Matrizes de transformacao::) a componente homoge^nea e' localizada nos elementos com i'ndice zero, de forma que componentes de transformac,a~o para transformac,o~es Euclideanas aparecem na zero-e'sima linha (primeiros (N+1) elementos). A primeira coluna da matriz A (a coluna com i'ndice zero) e' tipicamente 1, 0, ..., 0.  File: geomview-pt_BR, Node: Formato binario, Next: Referencias, Prev: Matrizes de transformacao ND, Up: Convencoes 4.1.8 Formato bina'rio ---------------------- Muitos objetos OOGL aceitam formatos o formato de arquivo bina'rio bem como o formato de arquivo ASCII. Esses arquivos comec,am com a indicac,a~o usual (e.g. `CQUAD') seguida pela palavra `BINARY'. Dados bina'rios iniciam-se no byte imediatamente seguinte ao primeiro caractere de nova linha apo's a palavra `BINARY'. Espac,os em branco e um simples comenta'rio podem atrapalhar, e.g. OFF BINARY # binary-format "OFF" data follows Dados bina'rios compreendem inteiros de 32 bits e os inteiros em ponto flutuante de 32 bits conforme definido pela IEEE (IEEE Standard for Binary Floating-Point Arithmetic (ANSI/IEEE Std 754-1985 - Institute of Electrical and Electronics Engineers), ambos os formatos seguem a` forma de ordenac,a~o "big-endian" (i.e., com o byte mais significativo em primeiro lugar). Esse e' o formato nativo para tipos de dado int e tipos de dado float em sistemas do tipo Sun-3, Sun-4, e Irises, ale'm de muitos outros sistemas. Formatos de dados bina'rios assemelham-se aos formatos correspondentes em ASCII, com tipos de dado "int" e tipos de dado "float" nos lugares que voce^ esta' acostumado a encontrar. Existe algumas excesso~es todavia, especificamente dos formatos d arquivo `QUAD', `OFF' e `COMMENT'. Detalhes sa~o fornecidos no arquivo individual das descric,o~es do formato especi'fico. Veja em *note QUAD::, *note OFF::, e em *Note COMMENT::. Objetos OOGL bina'rios podem ser livremente misturados em fluxos de objetos ASCII: LIST { = MESH BINARY ... dados bina'rios de uma malha aqui ... } { = QUAD 1 0 0 0 0 1 0 1 0 0 1 0 } Note que dados ASCII continuam seguindo imediatamente o u'ltimo byte dos dados bina'rios. Naturalmente, e' impossi'vel incluir comenta'rios dentro de um objeto em formato bina'rio OOGL, todavia comenta'rios podem aparecer no cabec,alho antes do ini'cio dos dados bina'rios.  File: geomview-pt_BR, Node: Referencias, Next: Aparencias, Prev: Formato binario, Up: Convencoes 4.1.9 Refere^ncias a Objetos Embutidos e a Objetos Externos ----------------------------------------------------------- Alguns tipos de objeto OOGL (`LIST', `INST') permitem refere^ncias a outros objetos OOGL, que podem aparecer literalmente no fluxo de dados, serem chamados a partir de arquivos em disco, ou serem comunicados a partir de outro lugar via objetos nomeados. Comandos GCL tambe'm aceitam objetos geome'tricos atrave's desses meios citados. A sintaxe gene'rica e' ::= [ "{" ] [ "define" `symbolname' ] [ ["="] `object-keyword' ... | "<" `filename' | ":" `symbolname' ] [ "}" ] onde os itens entre aspas duplas sa~o seque^ncias de caracteres literais (que aparecem sem as aspas), os itens entre colche^tes ([]) sa~o opcionais, e a barra vertical (|) denota alternativas. Chaves, quando estiverem presentes, apenas indicam coincide^ncia; o par mais externo de chaves e' geralmente requerido quando o objeto estiver em um contexto maior, e.g. quando for parte de um objeto maior ou inclui'do em um fluxo de comando do Geomview. Por exemplo, cada uma das tre^s linhas seguintes: { define fred QUAD 1 0 0 0 0 1 0 1 0 1 0 0 } { define fred = QUAD 1 0 0 0 0 1 0 1 0 1 0 0 } { appearance { +edge } LIST { < "file1" } { : fred } } VECT 1 2 0 2 0 0 0 0 1 1 2 e' um bojeto OOGL va'lido. O u'ltimo exemplo e' va'lido somente quando estiver delimitado precisamente e residindo precisamente no seu pro'prio arquivo em disco. A construc,a~o com ":" permite refere^ncia a si'mbolos, criados com `define'. Um valor inicial de um si'mbolo e' um objeto nulo. Quando um si'mbolo for (re)definido, todas as refere^ncias a esse si'mbolo sa~o automaticamente modificadas. A construc,a~o "`define' NOME" permite definir um simbolo global para um objeto especificado. Se "NOME" referir-se a um objeto que ja' existia anteriormente, enta~o o antigo objeto e' descartado e substitui'do pela nova definic,a~o. Veja *note `(read ...)': read. *note `(hdefine ...)': hdefine. A construc,a~o "<" faz com que um arquivo em disco seja lido. Note que isso na~o e' um mecanismo textual gene'rico de uso da diretiva de programac,a~o "include"; um objeto OOGL completo deve aparecer no arquivo referenciado na construc,a~o "<". Arquivos lidos usando "<" sa~o procurados primeiramente no direto'rio do arquivo que e' refrenciado em "<", se existir; se essa busca falhar, o caminho normal de busca (veja *note `(load-path ...)': load-path.) e' usado. A busca padra~o olha primeiro no direto'rio atual, a seguir nos direto'rios de dados do Geomview. Ressaltando, espac,os em branco e caracteres indicadores de final de linha sa~o insignificantes, e comenta'rios de "#" podem aparecer em qualquer lugar.  File: geomview-pt_BR, Node: Aparencias, Next: Mapeamento de Textura, Prev: Referencias, Up: Convencoes 4.1.10 Apare^ncias ------------------ Objetos geome'tricos podem ter informac,o~es de apare^ncia associada, especificando tonalidade, brilho, cor, visualizac,a~o wire-frame vs. shaded-surface, e assim por diante. Apare^ncias sa~o erdadas atrave's de hierarqui'as de objetos, e.g. anexando uma apare^ncia a uma lista (`LIST') significa que a apare^ncia e' aplicada a todos os membros de `LIST'. Algumas propriedades relacionada a apare^ncia sa~o relegadas a subestruturas tais como "material", "lighting" e "texture". Seja cuidadoso para notar quais propriedade pertencem a qual estrutura. Qualquer objeto geome'trico pode ser precedido por uma definic,a~o de apare^ncia como no sguinte exemplo: { appearance { +edge } LIST { < "arquivo1" } { QUAD 1 0 0 0 0 1 0 1 0 1 0 0 } } Apare^ncias sa~o tambe'm objetos OOGL no seu pro'prio direito e pode ser fornecido nomes simbo'licos e refere^ncia a elas. Veja (*note Referencias::) e em *note Objetos de apare^ncia: Objetos de aparencia. Texture Mapping Existe uma sec,a~o separada com relac,a~o a definic,a~o de texturas: (*note Mapeamento de Textura::). Transparency Objetos de renderizac,a~o translu'cida na~o sa~o suportados por todos os desenhadores que funcionam no Geomview. O renderizador OpenGL tem suporte limitado para isso: objetos de ni'vel mais alto (i.e. aqueles que aparecem no navegador de objetos do painel principal (veja *note O Painel Principal: Interacao Basica.) sa~o renderizados corretamente por meio de alpha-blending). Tambe'm, os instanta^neos do RenderMan ira~o incluir valores de opacidade. Aqui esta' um exemplo de estrutura de apare^ncia incluindo valores para todos atributos. A ordem dos atributos na~o e' importante. Como usual, espac,os em branco ssa~o irrelevates. Atributos Booleanos podem ser precedidos por "+" ou "-" para torna'-los habilitados ou desabilitados; "+" e' assumido se somente o nome do atributo aparecer. Outros valores esperados de atributo. Um "*" prefixado a um atributo, e.g. "*+edge" ou "*linewidth 2" ou "material { *diffuse 1 1 .25 }", seleciona a situac,a~o atual para sobrescrever ("override") para aquele atributo. appearance { +face # (Faz) desenho de faces dos poli'gonos. Habili- # tado por padra~o. -edge # (Na~o faz) desenho de arestas de poli'gonos. +vect # (Faz) desenho de vetores (VECTs). Habilitado # por padra~o. transparent screendoor # (Habilita) transpare^ncia. Habilitac,a~o de # transpare^ncia. # na~o (necessariamente) resulta em cores corretas # no Geomview, mas os valores de alfa sa~o usados # em instanta^neos RenderMan. # As palavras chave permitidas sa~o ``screendoor'' # (mascarando pixels de sai'da por meio de um # modelo de ponteamento), ``blending'' para # alpha-blending ( harmonizac,a~o de alfa) # com BSP-tree (a'rvore BSP) particionando o # espac,o e ordenando com precisa~o # (lento) e ``naive'' para harmonizac,a~o de # alfa sem mesmo ordenar com precisa~o, na~o # para falar sobre particionamento de espac,o. # Omitindo a palavra chave o padra~o sera' # harmonizac,a~o de alfa com a'rvore # particionando o espac,o e ordenando com # precisa~o. -normal # (Faz) desenho de vetores normais a uma # superfi'cie. normscale 1 # ... com comprimento 1.0 em coordenadas do # objeto. +evert # faz a inversa~o de normais de poli'gono onde # necessa'rio de forma que sempre tenha # ca^mera naquela face +texturing # (Habilita) mapeamento de textura +linear # (Habilita) me'dia linear de elementos de textura # mais fechados +mipmap # (Habilita) mapeamento mip de textura +mipinterp # (Habilita) mapeamento mip linear -backcull # (Na~o faz) descarte da orientac,a~o de faces # no sentido anti-hora'rio -concave # (Na~o faz) presunc,a~o e manuseio de poli'- # gonos co^ncavos -shadelines # (Na~o faz) linhas de tonalidade como se elas esti- # vessem iluminando cilindros # Esses quatro (mipinterp, backcull, concave, # shadelines) sa~o somente efetivos onde o # sistema gra'fico suporta'-los, a saber em GL e # Open GL. -keepcolor # Normalmente, quando informac,a~o de cor N-D posi- # cional esta' habilitada como # com o comando do geomview (ND-color ...), todas # as cores de objetos sa~o afetadas. Mas, objetos # com o atributo "+keepcolor" sa~o imunes a infor- # mac,o~es de cor N-D. shading smooth # ou ``shading constant'' ou ``shading flat'' ou # ou ``shading csmooth'' ou ``shading vcflat''. # smooth = tonalidade de Gouraud, flat = facetado, # csmooth = linearmente interpolado mas na~o # iluminado, vcflat = tonalidade mono'tona, mas # cores linearmente interpoladas. linewidth 1 # linhas, pontos, e arestas sa~o da largura de # 1 pixel. patchdice 10 10 # subdivide retalhos de Bezier esmiuc,adamente em # u e v material { # Aqui esta' uma definic,a~o material; # pode tambe'm ser lido de um arquivo como em # ``material < arquivo.mat'' ka 1.0 # coeficiente de reflexa~o ambiente. ambient .3 .5 .3 # cor do ambiente (em componentes de vermelho, # verde, azul). A contribuic,a~o ambiente para a to- # nalidade e' o produto de ka, a cor do ambiente, # pela cor da luz ambiente. kd 0.8 # coeficiente de reflexa~o difusa. diffuse .9 1 .4 # cor difusa. # (No modo ``shading constant'' (tonalidade # constante), a superfi'cie # e' colorida com a cor difusa.) ks 1.0 # coeficiente de reflexa~o especular. specular 1 1 1 # cor especular (destacada). shininess 25 # expoente especular; grandes valores fornecem # destaques falsos. backdiffuse .7 .5 0 # cor da face de tra's para superfi'cies com # dois lados. Se definido, esse campo determina # a cor difusa para o lado de tra's de uma super- # fi'cie. E' implementada atrave's de tonalidade # via software, e por tonalidade via hardware # sob sistemas GL que suportam iluminac,a~o de # dois lados, e sob Open GL. alpha 1.0 # opacidade; 0 = transparente (invisi'vel), # 1 = opaco. Ignorado quando a transpare^ncia # estiver desabilitada. edgecolor 1 1 0 # cor de linha & aresta normalcolor 0 0 0 # cor para vetores normais a uma superfi'cie } lighting { # Modelo de iluminac,a~o ambient .3 .3 .3 # luz ambiente replacelights # ``Use somente as seguintes luzes para # iluminar os objetos sob essa # apare^ncia.'' # Sem "replacelights" (substituic,a~o de luzes), # quaisquer luzes listadas sa~o adicionadas # a esses na cena. # Agora uma colec,a~o exemplo de luzes: light { color 1 .7 .6 # cor da luz position 1 0 .5 0 # posic,a~o da luz [distant light] # fornecida em coordenadas homoge^neas. # Com a quarta componente = 0, # isso significa uma luz vindo da # direc,a~o (1,0,.5). } light { # Outra luz. color 1 1 1 position 0 0 .5 1 # luz na posic,a~o finita ... location camera # especificada em coordenadas de ca^mera. # (Uma vez que a ca^mera olha adiante -Z, # esse exemplo coloca a luz # .5 unidade atra's do olho.) # Possi'vel palavra chave de localizac,a~o ("location"): # global posic,a~o da luz global em coordenadas de objeto mundo # (bem, universo). Esse e' o padra~o se nenhuma # localizac,a~o for especificada. # camera posic,a~o da ca^mera em coordenadas do sistemade # ca^mera # local posic,a~o local em coordenadas do sistema onde # a apare^ncia foi definida } } # fim do modelo de iluminac,a~o texture { clamp st # ou ``s'' ou ``t'' ou ``none'' file lump.tiff # arquivo fornecendo imagem de mapa de # textura alphafile mask.pgm.Z # arquivo fornecendo imagem de ma'scara # de transpare^ncia apply blend # ou ``modulate'' ou ``decal'' transform 1 0 0 0 # superfi'cie (s,t,0,1) * tfm -> coor- 0 1 0 0 # denadas de textura 0 0 1 0 .5 0 0 1 background 1 0 0 1 # relevante para ``apply blend'' } } # fim de apare^ncia Existem regras para heranc,a de atributos de apare^ncia quando muitas apare^ncia sa~o impostas em diferentes ni'veis na hierarqui'a. Por exemplo, Geomview instala uma apare^ncia de parada de seguranc,a que fornece valores padra~o para a maioria dos para^metros; seu painel de controle instala outras apare^ncias que fornecem novos valores para uns poucos atributos; a geometria fornecida pelo usua'rio pode tambe'm conter apare^ncias. A regra geral e' que a apare^ncia dos filhos (aquelas fechadas para as primitivas geome'tricas) vencem. Adicionalmente, controles de apare^ncia com situac,a~o atual em sobrescrever ("override") (e.g. `*+face ou material { *diffuse 1 1 0 }') vencem sobre as outras que estiverem sem o atributo de sobrescrever. Os controles de apare^ncia do Geomview usam o recurso de sobrescrever "override" de forma a ser efetivo mesmo se objetos fornecidos pelo usua'rio contiverem suas pro'prias escolhas de apare^ncia. Todavia, Se um objeto fornecido pelo usua'rio contiver um campo de apare^ncia com o recurso de sobrescrever ativado, esse campo de apare^ncia sera' imune aos controles do Geomview.  File: geomview-pt_BR, Node: Mapeamento de Textura, Prev: Aparencias, Up: Convencoes 4.1.11 Mapeamento de Textura ---------------------------- Alguns programas que trabalham sem contato direto com o usua'rio suportam objetos mapeados em textura, atualmente apenas o OpenGL e a interface RenderMan no momento dessa escrita. Existe tambe'm alguns recursos com a interface RMan quando em uso um canal alfa na imagem de textura. Aqueles programas que na~o trabalham diretamente com o usua'rio cujo suporte a textura na~o existe silenciosamente ignoram tentativas de uso de mapeamento de textura. Uma textura e' especificada como parte de uma estrutura de apare^ncia (Veja *note Aparencias::). Resumidamente, se fornece uma imagem de textura (Veja tambe'm *note Objetos de imagem: image.), a qual e' considerada contida em um quadrado no espac,o parametrizado `(s,t)' no intervalo 0 <= s <= 1, 0 <= t <= 1. Enta~o se fornece uma primitiva geome'trica, com cada ve'rtice acompanhado com as coordenadas de textura `(s,t)'. Se a texturizac,a~o estiver habilitada, a porc,a~o apropriada da imagem de textura e' colada sobre cada face do objeto texturizado. Na~o existe (atualmente) nenhuma provisa~o para heranc,a de parte de uma estrutura de textura; se a palavra chave `texture' e' mencionada em uma apare^ncia, essa mensa~o suplanta qualquer outra especificac,a~o de textura. O atributo de apare^ncia `texturing' controla se texturas sa~o usadas; na~o existe perda de performace tendo campos "texture { ... }" definidos quando a utilizac,a~o de texturas esta' desabilitada. Os campos de textura disponi'veis sa~o: clamp none -ou- s -ou- t -ou- st Determina o significado de coordenadas de textura fora do intervalo 0..1. Com `clamp none', o padra~o, coordenadas sa~o interpretadas modulo 1, enta~o (s,t) = (1.25,0), (.25,0), e (-.75,0) referem-se todos ao mesmo ponto no espac,o das texturas. Com `clamp s' ou `clamp t' ou `clamp st', individualmente ou ambos de s-coordenadas ou t-coordenadas menor que 0 ou maior que 1 sa~o remapeadas para 1 ou para 0, respectivamente. image { (*note Objetos de imagem: image.) } Especifica a atual imagem de textura. Imagens de textura podem ter 1, 2, 3 ou 4 canais: 1 canal: lumina^ncia 2 canais: lumina^ncia e alfa (opcidade:0 transparente, 1 opaco) 3 canais: dados RGB 4 canais: dados RGBA Veja *note Objetos de imagem: image, para a definic,a~o atual de objetos de imagem. O canal usado por alfa e' somente interpretado como ma'scara: onde a ma'cara e' zero, pixels sa~o simplesmente omitidos. Uma excec,a~o e' o caso onde _apply_ e' igual a _modulate_ e a transluce^ncia esta' habilitada: nesse caso o valor de alfa resultante e' o resultado da multiplicac,a~o da cor da superfi'cie pelo valor de alfa do canal alfa da textura. file nomearquivo alphafile nomearquivo _Isso e' considerado obsoleto, e somente mantido por compatibilidade, o moderno caminho e' usar o novo objeto imagem OOGL. Veja *note Objetos de imagem: image. O material documentado aqui pode ainda funcionar apesar disso_ Especifica arquivos de imagem contendo a textura. A palavra chave _file_ especifica um arquivo com informac,o~es de cor ou de brilho; _alphafile_ se presente, especifica uma ma'scara de transpare^ncia ("alpha"); onde a ma'scara for zero, pixels simplesmente sa~o omitidos. Muitos formatos de arquivo de imagem esta~o disponi'veis; o tipo de arquivo deve ser indicado pelos u'ltmos poucos caracteres do nome do arquivo: .ppm ou .ppm.Z ou .ppm.gz 24-bit 3-color imagem no formato PPM .pgm ou .pgm.Z ou .pgm.gz 8-bit tons de cinza imagem no formato PGM .sgi ou .sgi.Z ou .sgi.gz 8-bit, 24-bit, ou 32-bit imagem SGI .tiff 8-bit ou 24-bit imagem TIFF .gif imagem GIF Para esse recurso trabalhar, alguns programas devem estar disponi'veis no caminho de busca do Geomview: zcat para arquivo .Z gzip para arquivos .gz tifftopnm para arquivos .tiff giftoppm para arquivos .gif Se uma imagem `alphafile' for fornecida, essa imagem deve ser do mesmo tamanho que a imagem `file'. _Objetos imagem fornecem um caminho mais flexi'vel para especificar dados de textura. Veja *note Objetos de imagem: image._ apply modulate -ou- blend -ou- decal Indica como a imagem de textura e' aplicada a` superfi'cie. Aqui a "surface color" (cor da superfi'cie) significa a cor que a superfi'cie pode ter na ause^ncia de mapeamento de textura. Com `modulate', o padra~o, a cor de textura (ou iluminac,a~o, se texturizado por meio de uma imagem de escala de cinza) e' multiplicada pela cor da superfi'cie. Com `blend', textura harmoniza-se entre cor de fundo (`background') e a cor da superfi'cie. O para^metro `file' deve especificar uma imagem de escala de cinza. Onde a imagem de textura e' 0, a cor da superfi'cie permanece inalterada; onde for 1, a superfi'cie e' colorida na cor dada por `background'; e cor e' interpolada para valores imediatos. Com `decal', o para^metro `file' deve especificar uma imagem de tres cores. Se um para^metro `alphafile' estiver presente, seus valores interpolam-se entre a cor da superfi'cie (onde alpha=0) e a cor de textura (onde alpha=1). Iluminac,a~o na~o afeta a cor de textura no modo `decal'; efetivamente a textura e' tonalidademente constante. background R G B A Especifica uma cor com 4 componentes, com nu'meros R, G, B, e A em ponto flutuante normalmente no intervalo 0..1, usados quando `apply blend' for selecionado. transform `matriz-de-transformac,a~o' Espera uma lista de 16 nu'meros, ou um dos outros caminhos de representar uma transformac,a~o (`: nomecabec,alho' ou `< nomearquivo'). A matriz 4x4 de transformac,a~o e' aplicada a coordenadas de textura, no sentido de um vetor linha de 4 componentes (s,t,0,1) multiplicado a` esquerda pela matriz, para produzir novas coordenadas (s',t') a`s quais atualmente indexam a textura.  File: geomview-pt_BR, Node: Formatos de Arquivo de Objeto, Next: Objetos nao-geometricos, Prev: Convencoes, Up: Formatos dos Arquivos da OOGL 4.2 Formatos de Arquivo de Objeto ================================= * Menu: * QUAD:: Lista de quadrila'teros. * MESH:: Grade retangular associada. * BBOX:: Caixa associada simples. * BBP and BEZ:: Lista retalhos de superfi'cies de belzier. * OFF:: Poliedros: poli'gonos com ve'rtices compartilhados. * VECT:: Lista de pontos e linhas. * SKEL:: Lista de pontos e linhas, com ve'rtices compartilhados. * SPHERE:: Esfera * INST:: Insa^ncia transformada de outro objeto. * LIST:: Lista de outros objetos. * TLIST:: Colec,a~o de matrizes de transformac,a~o 4x4. * GROUP:: Formato obsoleto para colec,a~o de objetos. * DISCGRP:: Grupo deiscreto de objetos. * COMMENT:: Objeto comenta'rio, para informac,o~es na~o exibidas.  File: geomview-pt_BR, Node: QUAD, Next: MESH, Prev: Formatos de Arquivo de Objeto, Up: Formatos de Arquivo de Objeto 4.2.1 QUAD: colec,a~o de quadrila'teros --------------------------------------- O sufixo convencional para um arquivo `QUAD' e' `.quad'. A sintaxe do arquivo e' [C][N][4]QUAD -ou- [C][N][4]POLY # Palavra chave VE'RTICE VE'RTICE VE'RTICE VE'RTICE # ve'rtices 4-D para algum N VE'RTICE VE'RTICE VE'RTICE VE'RTICE ... A palavra chave inicial e' `[C][N][4]QUAD' ou `[C][N][4]POLY', onde o prefixos opcionais `C' e `N' indicam que cada ve'rtice inclui cores e retas normais respectivamente. Isto e', esses arquivos iniciam-se com uma das palavras `QUAD' `CQUAD' `NQUAD' `CNQUAD' `POLY' `CPOLY' `NPOLY' `CNPOLY' (mas na~o com `NCQUAD' ou `NCPOLY'). `QUAD' e `POLY' sa~o sino^nimos; ambas as formas sa~o permitidas apenas por compatibilidade com ChapReyes. Seguindo a palavra chave esta' um nu'mero arbitra'rio de grupos de quatro ve'rtices, cada grupo descrevendo um quadrila'tero. Veja a sintaxe de ve'rtice acima. O objeto termina no caractere de fim de arquivo, ou com uma chave fechada se incorporado dentro de uma refere^ncia de objeto (veja acima). Um formato de arquivo `QUAD BINARY' e' aceito; veja *note Formato binario::. A primeira palavra de dados bina'rios deve ser um inteiro de 32 bits fornecendo o nu'mero de quads no objeto; seguindo esse inteiro encontra-se uma se'rie de inteiros em ponto flutuante de 32 bits, arranjados apenas como no formato ASCII.  File: geomview-pt_BR, Node: MESH, Next: BBOX, Prev: QUAD, Up: Formatos de Arquivo de Objeto 4.2.2 MESH: Malha retangularmente conectada ------------------------------------------- O sufixo convencional para um arquivo `MESH' e' `.mesh'. A sintaxe do arquivo e' [U][C][N][Z][4][u][v][n]MESH # Palavra chave [NDIM] # Dimensa~o do espac,o, presente # somente se nMESH NU NV # dimenso~es da grade da malha # NU*NV ve'rtices, no formato especificado # pela palavra chave inicial VE'RTICE(u=0,v=0) VE'RTICE(1,0) ... VE'RTICE(NU-1,0) VE'RTICE(0,1) ... VE'RTICE(NU-1,1) ... VE'RTICE(0,NV-1) ... VE'RTICE(NU-1,NV-1) A palavra chave e' `[U][C][N][Z][4][u][v][n]MESH'. Os caracteres opcionais prefixados significam: `U' Cada ve'rtice inclue uma textura de 3 para^metros de espac,o de componente. As primeiras duas componentes sa~o para^metros usuais de textura `S' e `T' para quele ve'rtice; o terceiro pode ser especificado como zero. `C' Cada ve'rtice (veja Vertices acima) inclui uma cor de quatro componentes. `N' Cada ve'rtice inclui um vetor normal a` superfi'cie. `Z' Dos valores dos 3 eixos coordenados (x , y e z) de ve'rtice somente a componente Z esta' presente; X e Y sa~o omitidos, e assumidos ambos como sendo iguais a`s coordenadas de malha (u,v) de forma que X varia de 0 .. (Nu-1), Y varia de 0 .. (Nv-1) onde Nu e Nv sa~o as dimensso~es de malha - veja acima. `4' Ve'rtices sa~o quadridimensionais, cada ve'rtice consiste em 4 valores em ponto flutuante. `Z' e `4' na~o podem ambos estarem presentes ao mesmo tempo. `u' A malha e' ajustada na direc,a~o u, de forma que o (0,v)'e'simo ve'rtice esta' conectado ao (NU-1,v)'e'simo para todo v. `v' A malha e' ajustada na direc,a~o v, de forma que o (u,0)'´esimo ve'rtice esta' conectado ao (u,NV-1)'e'simo para todo u. Dessa forma uma malha u-ajustada ou v-ajustada e' topologicamente um cilindro, enquanto uma malha uv-ajustada e' um toro. `n' Especifica uma malha cujos ve'rtices existem em um espac,o de dimensa~o mais alta. A dimensa~o segue a palavra chave "MESH". Cada ve'rtice enta~o tem NDIM componentes. Note que a ordem dos caracteres do prefixo e' significativa; uma malha colorida, u-ajustada e' uma `CuMESH' na~o uma `uCMESH'. Seguindo o cabec,alho da malha esta~o os inteiros NU e NV, as simenso~es da malha. Enta~o segue-se NU*NV ve'rtices, cada um desses ve'rtices na forma fornecida atrave's do cabec,alho. Eles aparecem na seque^ncia v-crescente, i.e. se chamarmos cada ve'rtice de (u,v) enta~o os ve'rtices aparecera~o na ordem (0,0) (1,0) (2,0) (3,0) ... (NU-1,0) (0,1) (1,1) (2,1) (3,1) ... (NU-1,1) ... (0,Nv-1) ... (NU-1,NV-1) O formato `MESH BINARY' e' aceito; Veja *note Formato binario::. Os valores de NU e NV sa~o inteiros de 32-bit; todos os outros valores sa~o nu'meros em ponto flutuante de 32-bit.  File: geomview-pt_BR, Node: BBOX, Next: BBP and BEZ, Prev: MESH, Up: Formatos de Arquivo de Objeto 4.2.3 BBOX: Caixas associada simples ------------------------------------ Esse e' um objeto-brinquedo muito simples: Toma 2 ve'rtices e desenha um (hiper-) cubo que e' a caixa associada dos dois ve'rtices. Sintaxe: BBOX X[0] Y[0] Z[0] X[1] Y[1] Z[1] ou 4BBOX X[0] Y[0] Z[0] W[0] X[1] Y[1] Z[1] W[1] ou nBBOX NDIM # > 3 X[0] Y[0] Z[0] W[0] ... X[1] Y[1] Z[1] W[1] ... ou 4nBBOX NDIM # > 3 D[0] X[0] Y[0] Z[0] W[0] ... D[0] X[1] Y[1] Z[1] W[1] ... Na~o existe formato bina'rio BBOX. O modificador `4' tem diferentes significados dependendo da dimensa~o da caixa associada: `4BBOX' significa que as 4 componentes dos ve'rtices constroem uma caixa associada tetradimensional. Usando `4' em conjunc,a~o com `n' - `4nBBOX NDIM' - significa que os ve'rtices especificados no arquivo possuem NDIM+1 componentes, mas a componente no i'ndice 0 e' o divisor homoge^neo (em oposic,a~o ao caso comum tridimensional onde o divisor homoge^neo pode ser `w' - a terceira - componente).  File: geomview-pt_BR, Node: BBP and BEZ, Next: OFF, Prev: BBOX, Up: Formatos de Arquivo de Objeto 4.2.4 Superfi'cies de Bezier ---------------------------- O sufixo de arquivo convencional para arquivos de superfi'cie de Bezier e' `.bbp' ou `.bez'. O arquivo com qualquer dos dois sufixos pode conter qualquer dos dois tipos de parte de superfi'cie de Bezier. Sintaxe: [ST]BBP -ou- [C]BEZ[_ST] # NU, NV sa~o direc,o~es nos eixos u e v # graus de polino^mios variam 1..6 # ND = dimensa~o: 3->3-D, 4->4-D (racional) # (O sinal '<' e o sinal '>' na~o aparecem na entrada.) # NU,NV,ND sa~o cada um di'gito decimal simples. # a forma BBP implica NU=NV=ND=3 de forma que BBP = BEZ333. # Qualquer nu'mero de partes de superfi'cie de Bezier segue o cabec,alho # (NU+1)*(NV+1) pontos de controle do pedac,o da sperfi'cie de Bezier # cada 3 ou 4 nu'meros em ponto flutuante conforme o cabec,alho VERTEX(u=0,v=0) VERTEX(1,0) ... VERTEX(NU,0) VERTEX(0,1) ... VERTEX(NU,1) ... VERTEX(0,NV) ... VERTEX(NU,NV) # coordenadas de textura ST se mencionado no cabec,alho `S'(u=0,v=0) `T'(0,0) `S'(0,NV) `T'(0,NV) `S'(NU,0) `T'(NU,0) `S'(NU,NV) `T'(NU,NV) # nu'mero em ponto flutuante com 4 componentes no intervalo (0..1) de # cores R G B A para cada canto se mencionado no cabec,alho `RGBA'(0,0) `RGBA'(0,NV) `RGBA'(NU,0) `RGBA'(NU,NV) Esses formatos representam colec,o~es de partes de superfi'cies de Bezier, de graus maiores que 6, e com ve'rtices 3-D ou 4-D (racionais). A palavra chave de cabec,alho pode assumir as formas `[ST]BBP' ou `[C]BEZ[_ST]' (os si'mbolos '<' e '>' na~o sa~o parte da palara chave. O prefixo `ST' sobre `BBP', ou o sufixo `_ST' sobre `BEZuvn', indicam que cada pedac,o de superfi'cie inclui quatro pares de pontos com coordenadas em ponto flutuante no espac,o de textura, um em cada canto do pedac,o. O prefixo `C' sobre `BEZuvn' indica um pedac,o colorido, incluindo quatro conjuntos de quatro componentes com os nu'meros que especificam as cores em ponto flutuante (vermelho, verde, azul, e alfa) no intervalo 0..1, uma cor para cada canto. NU e NV, cada um e' um simples di'gito no intervalo 1..6, sa~o os graus do polino^mio do pedac,o nas direc,o~es u e v respectivamente. ND e' o nu'mero de componentes no ve'rtice de cada pedac,o, e deve ser ou `3' para 3-D ou `4' para coordenadas homoge^neas, isto e', pedac,os racionais. Pedac,os `BBP' sa~o pedac,os bicu'bicos com ve'rtices tridimensionais, de forma que `BBP' = `BEZ333' e `STBBP' = `BEZ333_ST'. Qualquer nu'mero de pedac,os segue o cabec,alho. Cada pedac,o compreende uma se'rie de ve'rtices do pedac,o, seguido por coordenadas opcionais de textura (s,t), seguidas por cores opcionais no formato (r,g,b,a). Cada pedac,o tem (NU+1)*(NV+1) ve'rtices na ordem v-crescente, de forma que se designarmos um ve'rtice atrave's de seus i'ndices (u, v) de controle de ponto a ordem e' (0,0) (1,0) (2,0) ... (NU,0) (0,1) (1,1) (2,1) ... (NU,1) ... (0,NV) ... (NU,NV) com cada ve'rtice contendo ou 3 ou 4 nu'meros em ponto flutuantes como especificado pelo cabec,alho. Se o cabec,alho chama por coordenadas ST, quatro pares de nu'meros em ponto flutuante seguem: o espac,o de coordenadas de textura para (0,0), (NU,0), (0,NV), e os cantos (NU,NV) do pedac,o, respectivamente. Se o cabec,alho chama por cores, segue quatro grupos de quatro componentes (vermelho, verde, azul, alfa) d cores em ponto flutuante, um para cada canto do pedac,o. A se'rie de pedac,os termina em um caractere de fim de arquivo, ou com uma chave fechada se incorporado em uma refere^ncia de objeto.  File: geomview-pt_BR, Node: OFF, Next: VECT, Prev: BBP and BEZ, Up: Formatos de Arquivo de Objeto 4.2.5 Arquivos do Tipo OFF -------------------------- O sufixo convencional para arquivos `OFF' e' `.off'. Sintaxe: [ST][C][N][4][n]OFF # Palavra chave do cabec,alho [NDIM] # Dimensa~o do espac,o dos ve'rtices, presente somente se nOFF # estiver tambe'm presente NVE'RTICES NFACES NARESTAS # NArestas na~o e' usado nem checado X[0] Y[0] Z[0] # Ve'rtices, possivelmente com normais, # cores, e/ou coordenadas de textura, nessa ordem, # se os prefixo `N', `C', `ST' # estiverem presentes. # Se 4OFF, cada ve'rtice possui 4 componentes, # incluindo uma componente final homoge^nea. # Se nOFF, cada ve'rtice possui NDIM componentes. # Se 4nOFF, cada ve'rtice possui NDIM+1 componentes. ... X[NVE'RTICES-1] Y[NVE'RTICES-1] Z[NVE'RTICES-1] # Faces # NV = # ve'rtices na referida face # V[0] ... V[NV-1]: i'ndices dos ve'rtices # no intervalo 0..NVE'RTICES-1 NV V[0] V[1] ... V[NV-1] COLORSPEC ... # COLORSPEC colar conti'nuo V[NV-1] # ate' o aparecer um caractere de fim de linha; pode ser de 0 a 4 # nu'meros # nenhum: padra~o # inteiro: i'ndice do mapa de cores # 3 ou 4 inteiros: valores RGB[A] no intervalo 0..255 # 3 ou 4 nu'meros em ponto flutuante: valores RGB[A] no intervalo 0..1 Arquivos `OFF' (nome para "object file format" formato de arquivo de objeto) representa colec,o~es de poli'gonos planos com ve'rtices possivelmente compartilhados, um caminho conveniente para descrever poliedros. Os poli'gonos podem ser co^ncavos mas na~o existe suporte para poli'gonos contendo buracos. Um arquivo `OFF' pode comec,ar com a palavra chave `OFF'; isso e' recomendado mas tambe'm e' opcional, muitos arquivos existentes precisam dessa palavra chave. Tre^s inteiros ASCII seguem a palavra chave `OFF': NVE'RTICES, NFACES, e NARESTAS. Esses sa~o o nu'mero de ve'rtices, faces, e arestas, respectivamente. Atualmente o software na~o utiliza nem verifica NARESTAS; ele na~o precisa ser correto mas deve estar presente. As coordenadas do ve'rtice seguem: dimensa~o * NVE'RTICES valores em ponto flutuante. Esses valores em ponto flutuante esta~o implicitamente numerados de 0 a NVE'RTICES-1. A dimensa~o e' ou 3 (o padra~o) ou 4 (especificado pelo caractere chave `4' diretamente antes da palavra chave `OFF'). Seguindo esses acima citados esta~o as descric,o~es das faces, tipicamente escritos com uma linha por face. Cada linha tem a forma N VERT1 VERT2 ... VERTN [COR] Aqui N e' o nu'mero de ve'rtices sobre a considerada face, e VERT1 a VERTN sa~o i'ndices dentro da lista de ve'rtices (no intervalo 0..NVE'RTICES-1). O modificador opcional COR no final da linha acima pode tomar va'rias formas. Caracteres de fim de linha sa~o significativos nesse ponto: a descric,a~o COR inicia-se apo's VERTN e termina com o caractere de fim de linha (ou pro'ximo caractere cerquilha # representativo de comenta'rio). Uma COR pode ser: ause^ncia de caractere a cor padra~o um inteiro i'ndice dentro "do" mapa de cores; veja abaixo tre^s ou quatro inteiros valores de RGB e possivelmente alfa no intervalo 0..255 tre^s ou quatro nu'meros em ponto flutuante valores RGB e possivelmente alfa no intervalo 0..1 Para o caso de um inteiro, o mapa de cores e' lido diretamente do arquivo `cmap.fmap' em sua forma atual no direto'rio `data' do Geomview. Algum melhor mecanismo para fornecer um mapa de cor sera' fornecido provavelmente algum dia. O significado de "cor padra~o" varia. Se nenhuma face do objeto tem uma cor, tudo recebe como heranc,a a cor material padra~o do ambiente. Se alguma mas na~o todas as faces possuem cores, o padra~o e' cinza (R,G,B,A=.666). Um formato `[ST][C][N][n]OFF BINARY' e' aceito; veja *note Formato binario::. Esse formato assemelha-se ao formato ASCII em quase tudo que voce^ poderia esperar, com inteiros de 32-bit para todos os contadores e i'ndices de ve'rtice e nu'meros em ponto flutuante de 32-bit para posic,o~es de ve'rtice (e coordenadas de textura ou cores de ve'rtice ou retas normais se algum dos formatos `COFF'/`NOFF'/`CNOFF'/`STCNOFF'/etc. estiver presente). Excec,a~o: cada um dos i'ndices de face do ve'rtice sa~o seguidos por um inteiro indicando quantas componentes de cor o acompanham. Componentes de cor de face devem ser nu'meros em ponto flutuante, na~o valores inteiros. Dessa forma uma face triangular pouco colorida pode ser representada como int int int int int 3 17 5 9 0 enquanto a mesma face colorida com vermelho pode ser int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0  File: geomview-pt_BR, Node: VECT, Next: SKEL, Prev: OFF, Up: Formatos de Arquivo de Objeto 4.2.6 Arquivos do Tipo VECT --------------------------- O sufixo convencional para arquivos `VECT' e' `.vect'. Sintaxe: [4]VECT NLINHASPOLIGONAIS NVE'RTICES NCORES NV[0] ... NV[NLINHASPOLIGONAIS-1] # nu'mero de ve'rtices # em cada linha poligonal NC[0] ... NC[NLINHASPOLIGONAIS-1] # nu'mero de cores fornecido # em cada linha poligonal VERT[0] ... VERT[NVERTICES-1] # Todos os ve'rtices # (3*NVertices nu'meros em # ponto flutuante) COLOR[0] ... COLOR[NCORES-1] # Todas as cores # (4*NCores nu'meros em ponto # flutuante, RGBA) Objetos do tipo `VECT' representam listas de linhas poligonais (seque^ncia de caracteres que representam segmentos de reta, possivelmente fechados). Uma linha poligonal degenerada pode ser usada para representar um ponto. Um arquivo `VECT' inicia-se com a palavra chave `VECT' ou com `4VECT' e tre^s inteiros: NLINHAS, NVE'RTICES, e NCORES. Aqui NLINHAS e' o n´umero de linhas poligonais no arquivo, NVE'RTICES o nu'mero total de vertices ve'rtices, e NCORES o nu'mero de cores como explanado abaixo. A seguir vem NLINHAS que sa~o inteiros de 16-bit NV[0] NV[1] NV[2] ... NV[NLINHAS-1] fornecendo o nu'mero de ve'rtices em cada linha poligonal. Um nu'mero negativo indica uma linha poligonal fechada; 1 denota ponto composto por um pixel simples. O somato'rio (dos valores absolutos) de NV[I] deve ser igual a NVE'RTICES. A seguir vem NLINHAS que sa~o formadas por inteiros de 16-bit NC[I]: o nu'mero de cores em cada linha poligonal. Normalmente um dos tre^s valores abaixo: 0 Nenhuma cor e' especificada para esta linha poligonal. Seu desenho na mesma cor que a linha poligonal anterior. 1 Uma cor simples e' especificada. A linha poligonal completa e' desenhada nessa cor. abs(NV[I]) Cada ve'rtice tem uma cor. Ou cada segmento e' desenhado na correspondente cor, ou as cores sa~o linearmente interpoladas ao longo dos segmentos de reta, dependendo da implementac,a~o. A seguir vem NVE'RTICES grupos de 3 ou 4 nu'meros em ponto flutuante: as coordenadas de todos os ve'rtices. Se a palavra chave for 4VECT enta~o existira~o 4 valores por ve'rtice. O primeiro grupo abs(NV[0]) forma a primeira linha poligonal, o grupo seguinte abs(NV[1]) forma a segunda e assim por diante. Finalmente NCORES grupos de 4 nu'meros em ponto flutuante fornecendo valores de vermelho, verde, azul e alfa (opacidade). O primeiro grupo NC[0] aplica-se a` primeira linha poligonal, e assim por diante. Um formato VECT BINARY e' aceito; veja *note Formato binario::. O formato bina'rio segue exatamente o formato ASCII, com inteiros de 32-bit Big-Endian onde aparecem os nu'meros inteiros comuns, e com inteiros de 16-bit Big-Endian onde aparecem inteiros de 16-bit; nu'meros em ponto flutuante de 32-bit Big-Endian onde aparecem os valores reais. NOTA REALMENTE GRANDE: Os contadores de ve'rtice NV[I] e os contadores de cor NC[I] sa~o inteiros de 16-bit Big-Endian.  File: geomview-pt_BR, Node: SKEL, Next: SPHERE, Prev: VECT, Up: Formatos de Arquivo de Objeto 4.2.7 Arquivos do Tipo SKEL --------------------------- Arquivos do Tipo `SKEL' representam colec,o~es de pontos e linhas poligonais, com ve'rtices compartilhados. O sufixo convencional para arquivos `SKEL' e' `.skel'. Sintaxe: [C][4][n]SKEL [NDIM] # Dimensa~o dos ve'rtices, presente somente # se nSKEL tambe'm estiver presente NVE'RTICES NLINHASPOLIGONAIS X[0] Y[0] Z[0] # Ve'rtices # se 4SKEL, cada ve'rtice tera' 4 componentes # se nSKEL, each ve'rtice tera' NDim componentes # se C[4][n]SKEL coordenadas de # ve'rtice sa~o seguidas por uma # especificac,a~o de cor RGBA ... X[NVE'RTICES-1] Y[NVE'RTICES-1] Z[NVE'RTICES-1] # linhas poligonais # NV = ve'rtices sobre essa linha poligonal # (1 = ponto) # V[0] ... V[NV-1]: i'ndices de ve'rtice # no intervalo 0..NVE'RTICES-1 NV V[0] V[1] ... V[NV-1] [COLORSPEC] ... # COLORSPEC continua adiante de V[NV-1] # ate'm encontrar um fim de linha; pode ser # vazia, ou 3 ou 4 nu'meros. # vazia: cor padra~o # 3 ou 4 nu'meros em ponto flutuante: valores RGB[A] no intervalo 0..1 A sintaxe e' semelhante a` sintaxe dos arquivos `OFF', com uma tabela de ve'rtices seguidos de uma seque^ncia de descric,o~es de linhas poligonais, cada descric,a~o referindo-se a ve'rtices atrave's de i'ndices na tabela. Cada linha poligonal tem uma cor opcional. Para objetos `nSKEL', cada ve'rtice tem NDIM componentes. Para objetos `4nSKEL', cada ve'rtice tem NDIM+1 componentes; a componente final e' o divisor homoge^neo. Um formato [4][N]SKEL BINARY e' aceito; veja *note Formato binario::. Esse formato assemelha-se ao formato ASCII na maioria das formas que voce^ pode esperar, com inteiros de 32-bit para todos os contadores e i'ndices de ve'rtice e nu'meros em ponto flutuante de 32-bit para posic,o~es de ve'rtice. Excec,a~o: cada i'ndice do ve'rtice de linhas poligonais e' seguido de um inteiro indicando quantas componentes de cor o acompanham. Componentes de cor de linhas poligonais devem ser inteiros em ponto flutuante, na~o valores inteiros. Dessa forma uma pouco colorida linha poligonal com 3 ve'rtices pode ser representada como int int int int int 3 17 5 9 0 enquanto a mesma linha poligonal colorida em vermelho pode ser int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0  File: geomview-pt_BR, Node: SPHERE, Next: INST, Prev: SKEL, Up: Formatos de Arquivo de Objeto 4.2.8 SPHERE Files ------------------ O sufixo convencional para arquivos `SPHERE' e' `.sph'. [ST][E|H|S]SPHERE # Palavra chave # coordenadas de textura geradas automaticamente, somente permitido # com objetos _ST_SPHERE [SINUSOIDAL|CYLINDRICAL|RECTANGULAR| # STEREOGRAPHIC|ONEFACE] # os pro'ximos quatro campos sa~o requeridos RADIUS XCENTER YCENTER ZCENTER A palavra chave e' `[ST][E|H|S]SPHERE'. Os caracteres prefixados opcionais significam: `ST' A esfera e' desenhada com coordenadas de textura geradas automaticamente. Veja abaixo. `E' Assume-se que a esfera encontra-se dentro do espac,o Euclidiano. `H' Assume-se que a esfera encontra-se dentro de um espac,o Hiperbo'lico. Veja *note Geometrias Nao-Euclidianas::. `S' Assume-se que a esfera encontra-se dentro de um espac,o esfe'rico. Veja *note Geometrias Nao-Euclidianas::. Objetos do tipo esfera sa~o desenhados usando malhas que sa~o retangulares em um sistema de coordenadas polares, com o plano equatorial paralelo ao plano `x,y'. Sua suavidade superficial, e o tempo gasto para desenha'-la, depende da escolha dos cortes quadrados, 10x10 por padra~o. Para Geomview, o painel de apare^ncia, o comando de teclado `ad', ou um atributo de apare^ncia `dice nu nv' escolhe isso. Coordenadas de textura sa~o geradas para objetos `STSPHERE'; a palavra chave seguindo a palavra chave inicial `STSPHERE' define o caminho para fazer isso. A palavra chave que segue a papavra chave inicial segue as convenc,o~es do script perl `mktxmesh' que acompanha o direto'rio _Orrery_ na a'rvore de direto'rios instalados que acompanha o Geomview. SINUSOIDAL projec,a~o sinusoidal de a'rea equivalente CYLINDRICAL projec,a~o cili'drica: S e' a longitude, T e' a latitude RECTANGULAR projec,a~o retangular: S e' a longitude, T e' `sin(latitude)' (i.e. a coordenada `z' no sistema de coordenadas da esfera) STEREOGRAPHIC projec,a~o estereogra'fica a partir do po'lo sul (`z=-1') ONEFACE visa~o ortogra'fica extendida do hemisfe'rio `+y' sobre ambos, espelhando  File: geomview-pt_BR, Node: INST, Next: LIST, Prev: SPHERE, Up: Formatos de Arquivo de Objeto 4.2.9 Arquivos do Tipo INST --------------------------- O sufixo convencional para um arquivo `INST' e' `.inst'. Na~o existe formato INST BINARY. Um `INST' aplica uma transformac,a~o 4x4 (ou (N+1)x(N+1) no contexto de ND-viewing) a outro objeto OOGL. Um arquivo do tipo `INST' inicia-se com `INST' seguido de as sec,o~es mostradas adiante que podem vir em qualquer ordem: geom OOGL-OBJECT especifica o objeto OOGL a ser instanciado. Veja *note Referencias::, para a sintaxe de um OOGL-OBJECT. palavra chave `unit' e' um sino^nimo para `geom'. transform ["{"] `transformac,a~o 4x4' ["}"] especifica uma matriz de transformac,a~o simples. Ou a matriz pode aparecer literalmente como 16 nu'meros, ou a matriz pode aparecer como uma refere^ncia a um objeto "transform", i.e. "<" arquivo-contendo-matriz-4x4 ou ":" si'mbolo-representando-transformac,a~o-de-objeto Outra forma de especificar a transformac,a~o e' transforms OBJETO-OOGL O OBJETO-OOGL deve ser um objeto `TLIST' (lista de transformac,o~es), ou uma `LIST' cujos membros dessa lista sa~o objetos `TLIST' mais recentes. Com efeito, a palavra chave `transforms' toma uma colec,a~o de matrizes 4x4 e replica o objeto `geom', fazendo uma co'pia para cada matriz 4x4. Se nem a palavra chave `transform' nem a palavra chave `transforms' aparecerem, ne-nhuma transformac,a~o e' aplicada (atualmente a identidade e' aplicada). Voce^ pode usar isso para, e.g., empacotar uma apare^ncia em torno de um objeto externo fornecido, atrave's de uma LIST de membros simples pode-se fazer isso mais eficientemente. Veja *note Matrizes de transformacao::, para o formato de matriz. A co'pia de um objeto geome'trico simples por meio de um objeto `TLIST' (veja `transforms' acima) pode ser u'til para transformar coordenadas de textura atrave's de outra lista de transformac,o~es; essa lista pode ser especificada por txtransforms OBJETO-TLIST O nu'mero de transoformac,o~es de textura deve coincidir com o nu'mero de transformac,o~es geome'tricas. O objeto `SPHERE' (Veja *note Sphere Objects: SPHERE.) utiliza essa te'cnica para gerar um esfera completamente texturizada fora de alguma frac,a~o de uma esfera (usualmente um octante). Uma transformac,a~o (N+1)-dimensional pode ser especificada por ntransform ["{"] N+1 N+1 `(N+1)x(N+1) floats' ["}"] A linha acima fornece uma matriz de transformac,a~o N+1-dimensional. Ou a matriz pode aparecer literalmente como (N+1)x(N+1) nu'meros, ou pode existir uma refere^ncia a um objeto `ntransform', i.e. "<" arquivo-contendo-matriz-(N+1)x(N+1) ou ":" si'mbolo-representando-objeto-ntransform Veja *note Matrizes de transformacao ND::, para o formato de matriz. Mais dois campos INST sa~o aceitos: `location' e `origin'. Note que `location' bem como `origin' sa~o ignorados se esse objeto `INST' realiza uma `ntransform'. Tambe'm, se a visualizac,a~o ND esta' ativada (comando `ND-axes', veja *note GCL::) enta~o objetos `INST' com `origin' diferente de `local' na~o ira~o ser desenhados, embora o material `location' possa trabalhar (ou na~o). location [global ou camera ou ndc ou screen ou local] Normalmente um INST especifica uma posic,a~o relativa a seu objeto pai; o campo `location' permite colocar um objeto em qualquer lugar. * `location global' anexa o objeto ao ambiente do sistema de coordenadas global (tambe'm conhecido como "universe") - o mesmo dos objetos mundo do Geomview, das geometrias alieni'genas, e ca^meras sa~o colocados. * `location camera' coloca o pai do objeto como sendo uma ca^mera. (Dessa forma se houverem multiplas visualizac,o~es, essas visualizac,o~es podem aparecer em uma diferente posic,a~o espacial em cada visualizac,a~o.) O centro de visa~o da camera esta' em volta da parte negativa do seu eixo z; X positivo esta' a` direita e adiante, Y positivo esta' acima e adiante. Normalmente as unidades do espac,o da ca^mera sa~o as mesmas das coordenadas globais. Quando uma ca^mera e' colocada de volta a` sua posic,a~o inicial, a ori'gem global esta' localizada em (0,0,-3.0). * `location ndc' coloca os parentes do objeto no cubo unita'rio normalizado no qual a projec,a~o da ca^mera (perspectiva ou ortogra'fica) mapeia o objeto mundo visi'vel. X, Y, e Z esta~o no intervalo de -1 a +1, com Z = -1 estando mais pro'ximo e Z = +1 adiante do plano de corte, e X e Y nas direc,o~es a` direita e adiante e acima e adiante respectivamente. Dessa forma alguma coisa como INST transform 1 0 0 0 0 1 0 0 0 0 1 0 -.9 -.9 -.999 1 location ndc geom < label.vect cola `label.vect' dentro do canto infeiror esquerdo de cada janela, e em frente de tudo mais que estiver pro'ximo, assumindo o conteu'do `label.vect' como localizado no quadrante positivo do plano XY. E' tentado usar -1 em lugar de como a componente Z da posic,a~o, mas o -1 pode colocar o objeto apenas nas proximidades em lugar de muito perto do plano de corte e tornar o objeto (parcialmente) invisi'vel, devido a algum erro de ca'lculo com nu'meros em ponto flutuante. * `location screen' coloca o objeto objeto em coordenadas de tela. O intervalo de Z e' ainda de -1 a +1 como para coordenadas ndc; X e Y sa~o medidos em pixels, e a posic,a~o de (0,0) localiza-se no canto _inferior esquerdo_ da janela, avanc,ado para a direita e adiante e para cima e adiante. `location local' e' o padra~o; o objeto esta' posicionado relativametne a seus genitores. origin [global ou camera ou ndc ou screen ou local] x y z O campo `origin' reposiciona o conteu'do da INST de forma que o local da ori'gem seja o ponto especificado do sistema de coordenadas fornecido. A menos que `location' seja especificado, essa opc,a~o na~o muda a orientac,a~o, somente a escolha da ori'gem. Ambas as opc,o~es `location' e `origin' podem ser usadas juntas. Enta~o por exemplo { INST location screen origin ndc 0 0 -.99 geom { < xyz.vect } transform { 100 0 0 0 0 100 0 0 0 0 -.009 0 0 0 0 1 } } coloca a ori'gem de xyz.vect no centro da janela, apenas transformando o plano de corte mais pro'ximo. O comprimento da unidade das arestas X e Y sa~o ajustados proporcionalmente para ter o comprimento de apenas 100 unidades de tela - pixels - , independentemente do tamanho da janela. * Menu: * Exemplos INST:: alguns exemplos de arquivos do tipo `INST'.  File: geomview-pt_BR, Node: Exemplos INST, Prev: INST, Up: INST 4.2.9.1 Exemplos INST ..................... Aqui esta~o alguns exemplos de arquivos `INST' INST unit < xyz.vect transform { 1 0 0 0 0 1 0 0 0 0 1 0 1 3 0 1 } { appearance { +edge material { edgecolor 1 1 0 } } INST geom < mysurface.quad } {INST transform {: T} geom { } } geom { # material copiado a partir de todas as matrizes acima ... } } O exemplo adiante assemelham-se ao exemplo de `origin' na sec,a~o acima, mas fazem com que as arestas X e Y sejam 1/4 do tamanho da janela (1/4, na~o 1/2, uma vez que o intervalo das coordenadas ndc de X e Y estejam de -1 a +1). { INST location ndc geom { < xyz.vect } transform { .5 0 0 0 0 .5 0 0 0 0 -.009 0 0 0 -.99 1 } }  File: geomview-pt_BR, Node: LIST, Next: TLIST, Prev: INST, Up: Formatos de Arquivo de Objeto 4.2.10 Arquivos do Tipo LIST ---------------------------- O sufixo convencional para um arquivo `LIST' e' `.list'. Uma lista de objetos OOGL Sintaxe: LIST OOGL-OBJECT OOGL-OBJECT ... Note que na~o existe separac,a~o expli'cita entre os objetos oogl, de forma que eles podem ser colocados entre chaves ({ }) por questo~es de clareza. Da mesma forma na~o existe um marcador expli'cito para o final da lista; a menos que o arquivo aparec,a sozinho em um arquivo de disco, a construc,a~o completa pode tambe'm ser empacotada entre chaves, como em: { LIST { QUAD ... } { < xyz.quad } } Uma `LIST' vazia, i.e. `{ LIST }', e' va'lida, e e' o caminho mais fa'cil para criar um objeto vazio. Por exemplo, para remover uma definic,a~o de si'mbolo voce^ pode escrever { define algumsi'mbolo { LIST } }  File: geomview-pt_BR, Node: TLIST, Next: GROUP, Prev: LIST, Up: Formatos de Arquivo de Objeto 4.2.11 Arquivos do Tipo TLIST ----------------------------- O sufixo convencional para um arquivo `TLIST' e' `.grp' ("grupo") ou `.prj' (matrizes "projetivas"). Colec,o~es de matrizes 4x4, usadas na sec,a~o `transforms' de/e objeto `INST'. Sintaxe: TLIST # palavra chave ... # qualquer nu'mero de matrizes 4x4 transform { # refere^ncia a um objeto de transformac,a~o } tlist { # TLIST aninhada } Objetos `TLIST' sa~o usados somente dentro de cla'usulas `transforms' de um objeto `INST'. Objetos `TLIST' fazem com que os objetos `geom' `INST's sejam instanciados uma vez sob cada uma das transformac,o~es na `TLIST'. O efeito e' como aquele de um `LIST' de `INST's cada uma com uma transformac,a~o simples, e todas as transformac,o~es referindo-se ao mesmo objeto, mas e' mais eficiente. `TLIST's podem ser aninhadas: efetivamente isto significa que todas as transformac,o~es em cada objeto `TLIST' aninhado sa~o multiplicadas (a` esquerda) atrave's das transformac,o~es no objeto `TLIST' mais externo. Esteja informado de que uma `TLIST' e' um tipo de geom, distinto de um objeto `transform'. Alguns contextos esperam um geom, alguns contextos esperam um `transform'. Por exemplo em INST transform { : MEUT } geom { ... } MEUT deve ser um objeto transform, que pode ter sido criado com a GCL (read transform { define meuT 1 0 0 1 ... }) enquanto em INST transforms { : MEUSTS } geom { ... } ou INST transforms { LIST {: MEUSTS} {< more.prj} } geom { ... } MEUSTS deve ser um objeto geom, definido e.g. com (read geometry { define MEUSTS { TLIST 1 0 0 1 ... } }) O formato `TLIST BINARY' e' aceito. Dados bina'rios iniciam-se com um inteiro de 32-bit fornecendo o nu'meros de transformac,o~es, seguido por aquele nu'mero de matrizes 4x4 no formato em nu'mero de ponto flutuante de 32-bit. A ordenac,a~o dos elementos da matriz e' a mesma do formato ASCII.  File: geomview-pt_BR, Node: GROUP, Next: DISCGRP, Prev: TLIST, Up: Formatos de Arquivo de Objeto 4.2.12 Arquivos do Tipo GROUP ----------------------------- Esse formato e' obsoleto, mas ainda e' aceito. It combined the functions of `INST' and `TLIST', taking a series of transformations and a single Geom (`unit') objeto, and replicating the objeto under each transformation. GROUP ... < matrices > ... unit { OOGL-OBJECT } is still accepted and effectively translated into INST transforms { TLIST ... ... } unit { OOGL-OBJECT }  File: geomview-pt_BR, Node: DISCGRP, Next: COMMENT, Prev: GROUP, Up: Formatos de Arquivo de Objeto 4.2.13 Arquivos do Tipo DISCGRP ------------------------------- Esse formato e' para grupos discretos, tais como aparecem na teoria dos coletores (manifolds) ou em modelos de simetria. Esse formato tem sua pro'pria pa'gina de manual. Veja discgrp(5).  File: geomview-pt_BR, Node: COMMENT, Prev: DISCGRP, Up: Formatos de Arquivo de Objeto 4.2.14 Objetos do Tipo COMMENT ------------------------------ O objeto COMMENT e' um mecanismo para codificar dados arbitra'rios dentro de um objeto OOGL. O objeto COMMENT pode ser usado para manter trilhas de dados ou para passagem de dados de retorno e passar dados adiante entre mo'dulos externos. Sintaxe: COMMENT # palavra chave NOME TIPO # nome individual e especificador de tipo { ... } # dados arbitra'rios Os dados, que devem ser contidos dentro de chaves, podem incluir qualquer coisa exceto chaves na~o balanceadas (aberta mas sem o fechamento correspondente ou fechada mas sem a abertura correspondente). O campo TIPO pode ser usado para identificar dados de interesse de um programa em particular apesar de nomear convenc,o~es. Objetos `COMMENT' sa~o intendidos como estando associados com outros objetos apesar da inclusa~o em um objeto `LIST'. (Veja *note LIST::.) A sintaxe da cerquilha "#" OOGL de comenta'rio na~o e' suficiente para troca de dados uma vez que esses comenta'rios sa~o removidos quando um objeto OOGL e' lido dentro do Geomview. O objeto `COMMENT' e' preservado quando chamado dentro do Geomview e e' mantido intacto na sai'da. Aqui esta' um exemplo associando uma localizac,a~o na internet a uma pec,a de geometria: { LIST { < Tetrahedron} {COMMENT GCHomepage HREF { http://www.geomview.org/ }} } Um formato de `COMMENT' bina'rio e' aceito. Esse formato bina'rio de comenta'rio na~o e' consistente com outros formatos bina'rios OOGL. Veja *note Formato binario::. O `nome' e o `tipo' sa~o seguidos por N BYTE1 BYTE2 ... BYTEN Em lugar de dados contidos dentro de chaves.  File: geomview-pt_BR, Node: Objetos nao-geometricos, Prev: Formatos de Arquivo de Objeto, Up: Formatos dos Arquivos da OOGL 4.3 Objetos nao-geometricos =========================== A sintaxe desses objetos e' fornecida na forma usada em *note Referencias::, onde itens "entre aspas duplas" devem aparecer literalmente mas sem aspas duplas, itens entre colche^tes ([ ]) sa~o opcionais, e a barra vertical "|" separa escolhas alternativas. * Menu: * Objetos de aparencia:: Objetos de apare^ncia. * image objects:: Objetos de imagem. * transform objects:: Matrizes de transformac,a~o. * ntransform objects:: Matrizes de Transformac,a~o N-dimensional. * Objeto camera:: Ca^meras. * window objects:: Janelas.  File: geomview-pt_BR, Node: Objetos de aparencia, Next: image objects, Prev: Objetos nao-geometricos, Up: Objetos nao-geometricos 4.3.1 Objetos de aparencia -------------------------- Apare^ncias sa~o objetos OOGL com caracteri'sticas pro'prias, que simplesmente significam que e' possi'vel fornecer a eles nomes simbo'licos (Veja *note Referencias::). Existem outras sec,o~es manuseado detalhes de apare^ncia. Veja *note Aparencias::.  File: geomview-pt_BR, Node: image objects, Next: transform objects, Prev: Objetos de aparencia, Up: Objetos nao-geometricos 4.3.2 Objetos de imagem ----------------------- Objetos de imagem sa~o usados para especificar dados de pixmap ou para texturas (Veja *note Mapeamento de Textura::), ou para imagens de fundo de ca^meras (Veja *note Objetos de camera: camera.). Ao mesmo tempo em que imagens sa~o escritas elas sa~o tambe'm comprimidas de 1 a 4 canais, um canal fornece um nu'mero simples no intervalo que vai de 0 a `maxval' para cada ponto de imagem (pixel); e `maxval' e' colocado em 255. A interpretac,a~o dos dados de imagem dependente do nu'mero de canais e' como segue: #Canais No. do Canal Interpretac,a~o -------------------------------------------------------------------------- 1 1 escala de cinza ou dados de lumina^ncia 2 1 escala de cinza ou dados de lumina^ncia ` ' 2 canal alfa (0: transparente, `maxval': opaco) 3 1 canal vermelho `' 2 canal verde `' 3 canal azul 4 1 canal vermelho `' 2 canal verde `' 3 canal azul `' 4 canal alfa (0: transparente, `maxval': opaco) Dados de imagem podem ser especificados inline (embutidos dentro do fluxo de dados atual) ou via refere^ncias de arquivos; em ambos os casos os dados sa~o lidos e interpretados ao mesmo tempo que o objeto de imagem e' passado. _Essa forma e' diferente da antiga (e desatualizada) forma de especificac,a~o de textura de imagem, onde os dados de imagem em uma mi'dia podem eventualmente serem re-lidos pelo Geomview_. A sintaxe geral de objetos de imagem e' como segue: ::= [ "{" ] (abertura de chave, geralmente precisam informar o fim do objeto de forma clara.) [ "image" ] (palavra chave opcional; desnecessa'ria se o tipo e' determinado pelo contexto, o que usualmente acontece.) [ "define" ] (define uma imagem chamada , escolhendo seus valores a partir do material adiante) | "<" (significando: leia a imagem de contida em nomedearquivo) | ":" (significando: use a varia'vel NOME, definida em algum lugar; se a varia'vel na~o for definida em algum lugar a imagem e' tida como vazia) | (material atual de definic,a~o de imagem; dados da imagem obrigato'riamente ve^m por ultimo, apo's a definic,a~o da largura e da altura e do nu'mero de canais) "width" (largura da imagem, detectado automaticamente a partir dos dados da imagem se possi'vel) "height" (altura da imagem, detectado automaticamente a partir dos dados da imagem se possi'vel) "channels" (nu'mero de canais, detectado automaticamente a partir dos dados da imagem e a partir das especificac,o~es `data' descrita adiante, se possi'vel) "maxval" (na~o suportado, obrigatoriamente deve ser `255' se especificado) "data MASCDEST [FILTER] [{] < NOMEDOARQUIVO [}]" "data MASCDEST [FILTER] TAMAN_IMAGEM [{][\n]DADOS_LIT_IMAGEM[}]" (dados de imagem ou externos ou embutidos, veja abaixo para uma descric,a~o detalhada do significado de _MASCDEST_ e _FILTER_. Uma imagem pode -e tem, em geral- multiplas sec,o~es de dados.) [ "}" ] (fechamento correspondente da chave) Detalhes relativos a` especificac,a~o dos dados de uma imagem: `MASCDEST' Esse e' um campo-bit descrevendo onde os dados da imagem especificada devem ser colocados no pixmap de destino. O campo-bit e' especificado por meio de um inteiro em um dos formatos conhecidos (decimal, octal, hexadecimal). Os canais dos dados fonte sa~o sempre enumerados consecutivamente. Se, e.g. `NOMEDOARQUIVO' ou `DADOS_LIT_IMAGEM' especificam um imagem (provavelmente RGB ...) de tre^s canais e `MASCDEST' for igual a `0xD' (i.e. o primeiro bit e' 0), enta~o o terceiro canal do pixmap fonte pode ser substitui'do no quarto canal do objeto imagem de destino (o canal alfa), o segundo canal pode determinar o valor de destino `azul' e o primeiro canal da fonte determina o valor de destino correspondente ao `vermelho'. O nu'mero de canais dos dados fontes sempre tem que coincidir com o nu'mero de bits especificado como `MASCDEST'. Excec,a~o: se o pixmap fonte possui somente um canal, enta~o o nu'mero de canais dos dados fonte pode ser usado para preencher qualquer nu'mero de canais de destino; todos os canais especificados em `MASCDEST' sa~o preenchidos com os dados do canal simples do pixmap fonte. Geomview conhece as seguintes constantes simbo'licas, que podem ser usadas em lugar de especificar o campo-bit `MASCDEST' numericamente: `LUMINANCE' o mesmo que `1', `0x1', `\01' `LUMINANCE_ALPHA' o mesmo que `3', `0x3', `\03' `RGB' o mesmo que `7', `0x7', `\07' `RGBA' o mesmo que `15', `0xf', `\017' `ALPHA' dependendo do contexto: o nu'mero absoluto de canais deve obrigatoriamente ser conhecido; i.e. `data ALPHA ...' deve obrigatoriamente ser colocado antes de alguma coisa de forma a determinar o nu'mero de canais da imagem, e.g. ... data RGB ... data ALPHA ... e' va'lido, mas data ALPHA ... na~o e' va'lido, porque Geomview na~o tem meios de determinar o canal de destino a partir do contexto. `AUTO' Dados de imagem no formato PGM e' interpretado como canal simples em escala de cinza, dados RGB PNM como dados de imagem RGB. `AUTO' na~o pode trabalhar com dados de imagem no formato `raw'. `FILTER' A especificac,a~o `FILTER' e' opcional. se for omitida, enta~o Geomview tenta determinar o tipode imagem usando o sufixo de `NOMEDOARQUIVO'. Se a~o houver sufixo ou o sufixo for desconhecido, ou para dados embutidos de imagem, Geomview esta' apto a auto-detectar o formato do arquivo de imagem SGI (por razo~es histo'ricas ...) e formatos de imagem NetPBM (por razo~es pra'ticas). A auto-detecc,a~o de formatos NetPBM incluem o novo formato de imagem "PAM" que permite (em meio a um monte de outras coisas) armazenar um canal alfa juntamente com os dados de lumina^nica ou de RGB. Da mesma forma, a sai'da final de qualquer dos filtros especificados devem ou ser no formato de arquivo de imagem SGI, ou especificar uma imagem PAM, PNM ou PGM. Se o formato de arquivo de imagem na~o puder ser determinado por ou pelo sufixo do nome de arquivo ou pela especificac,a~o de filtro ou pela auto-detecc,a~o de dados SGI ou NetPBM, enta~o Geomview assume que os dados sejam "raw". Veja abaixo. Os filtros de descompressa~o podem ser deduzidos ou de um dos formatos de imagem conhecidos ou de um especificador de filtro expli'cito, e.g. o seguinte e' va'lido: data LUMINANCE raw.gzip { < arquivoemtonsdecinzagzipado } A linha acima deve ser equivalente a data LUMINANCE raw { < arquivoemtonsdecinza }, fornece dados descomprimidos realizados atrave's de dados de canal simples, com o primeiro pixel correspondendo ao canto inferior esquerdo (devido ao formato `raw' de imagem, veja abaixo). Geomview tem conhecimento interno dos seguintes filtros/sufixos: Descompressa~o de Dados `z' `gz' `gzip' os dados sa~o direcionados por `gzip -dc' `bz2' `bzip2' os dados sa~o direcionados por `bzip2 -dc' Formatos de Imagem `tiff' `tif' Formato de imagem `TIFF'. Somente suportado se o executa'vel `tifftopnm' puder ser executado no caminho de execuc,a~o atual. `png' Formato de imagem `PNG'. Somente suportado se o executa'vel `pngtopnm' puder ser executado no caminho de execuc,a~o atual. `jpg' `jpeg' Formato de imagem `JPEG'. Somente suportado se o executa'vel `jpegtopnm' puder ser executado no caminho de execuc,a~o atual. `gif' Formato de imagem `GIF' image file format. Somente suportado se o executa'vel `giftoppm' puder ser executado no caminho de execuc,a~o atual. `raw' Dados de imagem em Raw; o nu'mero de canais deve coincidir com o nu'mero de bits informado em `MASCDEST'. Pixels sa~o especificados com 1 byte por canal. Os pixels sa~o organizados em linhas como em `liminance[-alpha]' ou em amostras `RGB[A]'. O pixel mais a` esquerda e' o primeiro pixel em cada linha de dados, a linha de dados mais acima deve vir primeiramente (isso e' apenas o mesmo que a convenc,a~o de NetPBM, os sistemas de coordenadas de imagem te^m sua ori'gem no canto superior esquerdo, da forma usual). Filtros Explicitamente Especificados Se nenhum dos sufixos especificados acima coincidirem, enta~o o sufixo/filtro e' interpretado como um filtro de programa externo; o programa do filtro externo deve ler de `STDIN' (da entrada padra~o) e escrever para `STDOUT' (a sai'da padra~o). A sai'da deve ou ser no formato de imagem SGI, ou no formatos de image PNM ou PGM. De outra forma os dados de sai'da sa~o interpretados como dados de imagem no formato raw (veja acima). Alguma coisa como o seguinte pode trabalhar, garantindo que o programa `${HOME}/bin/bububfilter' exista, seja executa'vel e fac,a alguma coi'sa u'til: ... data RGB "${HOME}/bin/bububfilter.bzip2" 7 { # dados bina'rios seguem bububub } ... Note que - previamente fornecendo os dados para `bububfilter' - Geomview ira' tentar descompactar o material com `bzip2 -dc'. Omitindo dados de imagem: Normalmente, o nu'mero de canais de imagem e' determinado automaticamente a partir das especificac,o~es dos `dados' de imagem; se a especificac,a~o de imagem carrega um nu'mero expli'cito de canais via palavra chave `channels' que excede o nu'mero de canais encontrado nas especificac,o~es de `dados', ou se a unia~o de todas as especificac,o~es `MASCDEST' possuem buracos, enta~o omitindo lumina^ncia e canais RGB sa~o initializados para 0, e um canal alfa omitido e' inicializado para `maxval', i.e. omitindo os dados do canal alfa para uma imagem RGBA e' apenas o mesmo que definir uma imagem RGB.  File: geomview-pt_BR, Node: transform objects, Next: ntransform objects, Prev: image objects, Up: Objetos nao-geometricos 4.3.3 Objetos de Transformac,a~o -------------------------------- Onde uma matriz simples 4x4 e' esperada - como no campo de `transform' `INST', a transformac,a~o da ca^mera `camtoworld' e os comandos do Geomview `xform*' - use um objeto de transformac,a~o. Note que uma transformac,a~o e' diferente de uma `TLIST', que e' um tipo de geometria. `TLIST's podem conter uma ou mais transformac,o~es 4x4; objetos "transform" devem ter exa-tamente uma. Por que temos ambos ("transform" e TLIST)? Em muitos lugares - e.g. posicionamento de ca^meras - e' somente significativo ter uma transofrmac,a~o simples. Usando um tipo separado de objeto reforc,a isso. A sintaxe para um objeto de transformac,a~o "transform" e' ::= [ "{" ] (Abertura de chave, geralmente necessa'rio para tornar o fim do objeto claramente explicitado.) [ "transform" ] (palavra chave opcional; desnecessa'ria se o tipo for determinado pelo contexto, o que comumente ocorre.) [ "define" ] (define uma transformac,a~o chamada , escolhendo seus valores do material adiante) (interpretado como uma transformac,a~o homoge^nea 4x4 fornecida linha por linha, intencionalmente aplicada a um vetor linha multiplicado a` ESQUERDA, de forma que e.g. translac,o~es euclidianas aparec,am na linha inferior) | "<" (significando: leia a transformac,a~o a partir daquele arquivo) | ":" (significando: use a varia'vel , definida em algum lugar; se na~o definido o valor inicial e' a transformac,a~o identidade) [ "}" ] (fechamento de chave correspondente) O conjunto pode ser colocado entre { chaves }. As chaves na~o sa~o essenciais se exatamente um dos itens acima estiver presente, enta~o e.g. um array 4x4 de nu'meros em ponto flutuante independente na~o precisa necessariamente ter chaves. Alguns exemplos, em contextos onde eles podem ser usados: # Exemplo 1: Um comando GCL para definir uma transformac,a~o # chamada "fred" (read transform { transform define fred 1 0 0 0 0 1 0 0 0 0 1 0 -3 0 1 1 } ) # Exemplo 2: Um objeto ca^mera usando a transformac,a~o # "fred" para posicionamento de ca^mera # Fornecida a definic,a~o acima, isso coloca a ca^mera em # (-3, 0, 1), olhando na direc,a~o -Z. { camera halfyfield 1 aspect 1.33 camtoworld { : fred } }  File: geomview-pt_BR, Node: ntransform objects, Next: Objeto camera, Prev: transform objects, Up: Objetos nao-geometricos 4.3.4 Objetos ND-Transform -------------------------- Onde - no contexto de visualizac,a~o NDimensional - uma matriz simples (N+1)x(N+1) e' esperada - como no campo `INST' `ntransform', ou a `ND-xform*' (veja comandos *note GCL::) - use um objeto `ntransform'. `ntransform' sa~o matrizes de transformac,a~o NLINHAS x NCOLUNAS onde usualmente NLINHAS = N+1 no contexto de objetos N-dimensionais e visualizac,a~o. A componente homoge^nea de uma `ntransform' situa-se na coluna zero (em oposic,a~o a objetos `transform' comuns onde a componente homoge^nea situa-se na coluna tre^s). Objetos `ntransform' trabalham sobre pontos de qualquer dimensa~o: se um ponto e' para ser transformado atrave's de um objeto `ntransform' e a dimensa~o do ponto na~o coincide com o nu'mero de linhas do objeto `ntransform', enta~o ou o ponto esta' implicitamente preenchido com zeros para coincidir com NLINHAS ou a matriz esta' implicitamente preenchida com unidades abaixo de sua diagonal principal (e zeros em todas as outras posic,o~es) de forma que a matriz ira' trabalhar como a matriz identidade sobre as dimenso~es excedentes do ponto de entrada. A sintaxe para um objeto `ntransform' e' ::= [ "{" ] (abertura de chave, geralmente necessa'ria para tornar o fim do objeto claramente explicitado.) [ "ntransform" ] (palavra chave opcional; desnecessa'ria se o tipo for determinado pelo contexto, o que comumente ocorre.) [ "define" ] (define uma transformac,a~o chamada , escolhendo seus valores do material adiante) NLINHAS NCOLUNAS (nu'mero de linhas e colunas da matriz, tipicamente N+1 N+1, mas qualquer dimensa~o e' possi'vel) (interpretados como uma transformac,a~o homoge^nea NLINHAS x NCOLUNAS fornecida linha por linha, pretensamente a ser aplicada a um vetor linha multiplicado a` ESQUERDA, de forma que e.g. translac,o~es Euclideanas aparecem na linha mais acima -- em oposic,a~o a objetos de transformac,a~o comuns onde as translac,o~es aparecem na linha mais inferior) | "<" (significando: leia a transformac,a~o daquele arquivo) | ":" (significando: use a varia'vel , definida em algum lugar; se na~o for definida o valor inicial e' a transformac,a~o identidade) [ "}" ] (correspondente fechamento de chave) O conjunto deve ser delimitado entre { chaves }. Chaves na~o sa~o necessariamente essenciais, de forma que e.g. dois inteiros - NLINHAS NCOLUNAS - seguidos por um array composto de NLINHAS x NCOLUNAS nu'meros em ponto flutuante independentes pode mas na~o precisa ter chaves. Alguns exemplos, em contextos onde eles possivelmente podem ser usados: # Exemplo 1: Um comando GCL para definir uma transformac,a~o `6x6' chamada # "fred", uma mera translac,a~o por meio do vetor `-3 0 1 1 0'. Essa # transformac,a~o e' significativa para um espac,o pentadimensional, com uma componente # homoge^nea um i'ndice zero. (read ntransform { ntransform define fred 6 6 1 -3 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 } ) # Exemplo 2: Escolhe o ND-xform de um objeto -- um geome'trico ou um grupo de # cameras. Fornecendo a definic,a~o acima, o ND-xform escolhido coloca o objeto em (-3 0 1 1 # 0) no espac,o pentadimensional. (ND-xform-set focus : fred) # ou (ND-xform-set g1 : fred)  File: geomview-pt_BR, Node: Objeto camera, Next: window objects, Prev: ntransform objects, Up: Objetos nao-geometricos 4.3.5 ca^mera ------------- Um objeto ca^mera especifica as seguintes propriedades de uma ca^mera: posic,a~o e orientac,a~o especificada por ou uma transformac,a~o camera para o objeto mundo ou uma transformac,a~o de objeto mundo para a ca^mera; essa transformac,a~o na~o inclui a projec,a~o, de forma que essa transformac,a~o e' tipicamente apenas uma composic,a~o de translac,a~o e rotac,a~o. Especificado como um objeto transform, tipicamente uma matriz 4x4. "focus" - dista^ncia focal Ao inve's de sugerir uma dista^ncia ti'pica da ca^mera ao objeto de interesse; usada para o posicionamento padra~o da ca^mera (a ca^mera e' colocada em (X,Y,Z) = (0,0,focus) quando resetada) e para ajustar o campo de visa~o quando alternando entre os modos de visualizac,a~o ortogra'fico e perspectivo. raza~o de aspecto da janela A verdadeira raza~o de aspecto no sentido /. Essa raza~o de aspecto normalmente pode concordar com a raza~o de aspecto da janela de camera. Geomview normalmente ajusta a raza~o de aspecto de suas ca^meras para coincidir com suas janelas associadas. dista^ncia de plano de corte pro'ximo e distante Note que ambas as dista^ncias devem ser estritamente maiores que zero. Razo~es de dista^ncia / muito grandes fazem com que a a'rea de armazenamento tempora'rio do eixo Z comporte-se de forma pe'ssima; parte de um objeto pode ser visi'vel mesmo se estiver em algum lugar mais distante que outro. campo de visa~o Especificado em uma das duas formas a seguir. `fov' e' o campo de visa~o - em graus se perpectivo, ou dista^ncia linear se ortogra'fico - na _menor_ direc,a~o. `halfyfield' e' metade do campo projetado no eixo Y, em coordenadas do objeto mundo (na~o angulo!), em unidades de dista^ncia a partir da ca^mera. Para uma ca^mera em perpectiva, halfyfield e' relacionado ao campo angular: halfyfield = tan( Y_axis_angular_field / 2 ) enquanto para uma ca^mera em visa~o ortogra'fica temos simplesmente: halfyfield = Y_axis_linear_field / 2 Essa definic,a~o singular de visualizac,a~o e' (a) maneira fa'cil de fazer ca'lculos que a envolvam e (b) e' bem definida em ambas as formas de visualizac,a~o ortogra'fica e perspectiva. cor de fundo Argumentavelmente (de forma discuti'vel) na~o e' uma propriedade de uma ca^mera, mas da cena (do cena'rio). Todavia, como na~o existe o objeto "cordefundo" no OOGL, e a cor de fundo pode na~o ser uma propriedade do equipamento de desenho, essa propriedade pode ser especificada aqui. No momento em que esse manual esta' sendo escrito, todavia, a interface gra'fica de usua'rio (GUI) sempre sobrescreve a cor de fundo com suas pro'prias escolhas. imagem de fundo Pelas mesmas razo~es mostradas acima,somente a referida GUI na~o sobrescreve essa opc,a~o. A imagem e' centralizada em "Normalized-Device-Coordinates"/NDC `(0,0,-1)'; a imagem na~o e' redimensonada, apenas dese-nhada por tra's de tudo mais como e'. Veja *note Objetos de imagem: image. A sintaxe para uma ca^mera e': ::= [ "camera" ] (palavra chave opcional) [ "{" ] (abertura de chave, geralmente requerida) [ "define" ] "<" | ":" | (ou qualquer nu'mero dos seguintes, em qualquer ordem...) "perspective" {"0" | "1"} (padra~o 1) (de outra forma "ortographic") "stereo" {"0" | "1"} (padra~o 0) (de outra forma mono) "worldtocam" (veja a sintaxe de transfor- mac,a~o acima) "camtoworld" (nenhum ponto na especificac,a~o de ambos camtoworld e worldtocam; se e' restingido para ser o inverso de the other) "halfyfield" (o padra~o e' tan 40/2 graus) Nota de traduc,a~o:40 e' o valor padra~o do campo de visa~o (fov). "fov" (campo de visa~o angular se "perspective", campo de visa~o linear em caso contra'rio. Medido em qualquer direc,a~o e' menor, dando a raza~o aspecto. Quando a raza~o de aspecto muda -- e.g. quando uma janela e' reajustada -- "fov" e' preservado.) "frameaspect" (X/Y) (padra~o 1.333) "near" (padra~o 0.1) "far" (padra~o 10.0) "focus" (padra~o 3.0) "bgcolor" (padra~o 1/3 1/3 1/3 1) "bgimage" { } (padra~o nenhuma imagem de fundo) [ "}" ] (correspondente fechamento de chave)  File: geomview-pt_BR, Node: window objects, Prev: Objeto camera, Up: Objetos nao-geometricos 4.3.6 Janela ------------ Um objeto janela especifica tamanho, posic,a~o, e outras informac,o~es relacionadas ao sistema de janelas sobre uma janela de forma que essas informac,o~es sejam independentes do dispositivo. A sintaxe de um objeto janela e': nomejanela ::= [ "window" ] (palavra chave opcional) [ "{" ] (abertura de chave, requerida na maioria das vezes) (qualquer dos seguintes, em qualquer ordem) "size" (tamanho da janela) "position" (posic,a~o & tamanho) "noborder" (especifica se a janela pode ter ou na~o uma borda) "pixelaspect" (especifica a raza~o de aspecto real visualizada de um pixel nessa janela no sentido tamanhox/tamanhoy, normalmente 1.0. Para hardware stereo o qual corta o display verticalmente por um fator de 2, ``pixelaspect 0.5'' pode funcionar. O valor e' usado no ca'lculo da projec,a~o de uma ca^mera associada a essa janela.) [ "}" ] (correspondente fechamento de chave) Objetos janela sa~o usados em `janelas' do Geomview e em comandos do painel de interac,a~o/interface com o usua'rio (`ui-panel') para escolher propriedades padronizadas para futuras janelas ou mudar as mesmas propriedades padronizadas de uma janela existente. Veeja *note `(window ...)': window. Veja tambe'm *note `(ui-panel ...)': ui-panel.  File: geomview-pt_BR, Node: Customizacao, Next: Modulos, Prev: Formatos dos Arquivos da OOGL, Up: Top 5 Customizac,a~o: arquivos `.geomview' ************************************** Quando Geomview e' inciado, ele chama e executa comando em um arquivo de inicializac,a~o dependente do sistema operacional chamado `.geomview'. Esse arquivo esta' no subdireto'rio `data' do direto'rio de distribuic,a~o do Geomview e conte'm comandos GCL para configurar Geomview de uma forma comum para todos os usua'rios no sistema. A seguir, Geomview procura o arquivo `~/.geomview' (`~' corresponde a seu direto'rio base). Voce^ pode usar esse arquivo para configurar seu pro'prio comportamento padra~o do Geomview de forma que ele se ajuste a`s suas prefere^ncias. Apo's a leitura de `~/.geomview', Geomview procura por um arquivo chamado `.geomview' no direto'rio atual. Se tal arquivo existir Geomview le^ esse arquivo, a menos que esse arquivo seja o mesmo que `~/.geomview' (o que pode ser o caso se voce^ estiver executando o Geomview a partir de seu direto'rio base). Voce^ pode usar o `.geomview' do direto'rio atual para criar uma personalizac,a~o no Geomview especi'fica para um certo projeto. Voce^ pode usar arquivos `.geomview' para controlar todos os tipos de coisa no Geomview. Eles podem conter quaisquer declarac,o~es GCL va'lidas. Especialmente u'til e' o comando `ui-panel' que controla a localizac,a~o inicial dos paine'is do Geomview. Para um exemplo veja o arquivo dependente do sistema `.geomview' mencionado acima. Veja *note GCL::. Veja *note `(ui-panel ...)': ui-panel. Uma boa ide'ia colocar juntos todos os comandos que voce^ coloca em um arquivo `.geomview' em uma declarac,a~o `progn' com o objetivo de fazer com que Geomview execute todos de uma so' vez. Caso voce^ na~o fac,a isso Geomview possivelmente pode executar esses comando seque^ncialmente sobre os primeiros poucos ciclos de atualizac,a~o apo's a incializac,a~o. Para modificar, e.g. a poli'tica de focalizac,a~o da janela de ca^mera de forma que ela selecione a poli'tica de focalizac,a~o do gerenciador de janela (em lugar de ser ativada quando o cursor do mouse cruza a janela), voce^ pode colocar o seguinte no seu arquivo `~/.geomview': (progn (ui-cam-focus focus-change) ... # other stuff ) Voce^ pode colocar qualquer comando `GCL' va'lido nos seus arquivos `.geomview', Veja *note GCL::. Veja *note `(progn ...)': progn. Veja *note `(ui-cam-focus ...)': ui-cam-focus.  File: geomview-pt_BR, Node: Modulos, Next: GCL, Prev: Customizacao, Up: Top 6 Mo'dulos Externos ******************* Um mo'dulo externo e' um programa que interage com Geomview. Um mo'dulo comunica-se com Geomview atrave's de GCL e pode controlar qualquer aspecto do Geomview que voce^ possa controlar atrave's da interface de usua'rio do Geomview. Em muitos casos um mo'dulo externo e' um programa especializado que imprementa algum algori'tmo matema'tico que cria um objeto geome'trico que modifica apare^ncia a` medida que o algori'tmo progride. O mo'dulo informa ao Geomview da nova apare^ncia do objeto a cada passo, de forma que o objeto aparenta evoluir com o tempo na janela do Geomview. Dessa modo Geomview serve como um _ferramenta de exibic,a~o_ para o mo'dulo. Um mo'dulo externo pode ser interativo. Esse mo'dulo pode responder a eventos de mouse e a eventos de teclado que ocorram em uma janela do Geomview, dessa forma extendendo a capacidade do Geomview propriamente dito. * Menu: * Interface:: Como Mo'dulos Externos Interagem com Geomview. * Example1:: Mo'dulo Externo Simples. * Example2:: Mo'dulo Externo Simples com Painel de Controle FORMS. * XForms:: A Biblioteca XForms. * Example3:: Mo'dulo Externo com Comunicac,a~o Bi-Direcional. * Example4:: Mo'dulo Simples em Tcl/Tk Demonstrando Selecionar. * Module Installation:: Instalac,a~o de Mo'dulo.  File: geomview-pt_BR, Node: Interface, Next: Example1, Prev: Modulos, Up: Modulos 6.1 Como Mo'dulos Externos Interagem com o Geomview =================================================== Mo'dulos externos aparecem no navegador de Mo'dulos (_Modules_) no painel principal (_Main_) do Geomview. Para executar um mo'dulo, clique no bota~o esquerdo do mouse sobre a entrada do mo'dulo no navegador. Enquanto o mo'dulo estiver sendo executado, uma linha adicional para aquele mo'dulo ira' aparecer no navegador. Essa linha inicia-se com um nu'mero entre colche^tes, que indica o nu'mero de _insta^ncia_ do mo'dulo. (Para alguns mo'dulos faz sentido ter mais de uma insta^ncia do mo'dulo sendo executado ao mesmo tempo.) Voce^ pode encerrar um mo'dulo externo atrave's de um clique sobre sua entrada vermelha de insta^ncia. Por padra~o quando Geomview inicia, mostra todos os mo'dulos que tiverem sido insta-lados no seu sistema. Para instruc,o~es sobre intalac,a~o de algum mo'dulo no seu sistema de forma que esse mo'dulo aparec,a no navegador de mo'dulos (_Modules_) toda vez que Geomview estiver sendo executado por algue'm no seu sistema, veja *note Module Installation::. Quando Geomview chama um mo'dulo externo, cria pipes conectados a`s sai'das e a`s entradas padra~o do modulo. (Pipes sa~o como arquivos exceto que eles sa~o usados para comunicac,a~o entre programas em lugar de armazenar coisas em um disco.) Geomview interpreta qualquer coisa que o modulo escreve em sua sai'da padra~o como um comando GCL. Da mesma forma, Se um mo'dulo externo requisita qualquer dado do Geomview, Geomview escreve aquele dado para a entrada padra~o do mo'dulo. Dessa forma tudo que um mo'dulo tem de fazer com o objetivo de comunicar-se com Geomview e' escrever comandos para sua sai'da padra~o e (opcionalmente) receber dados de sua entrada padra~o. Note que isso significa que o mo'dulo na~o pode usar a entrada padra~o e a sai'da padra~o para comunicar-se com o usua'rio. Se um mo'dulo precisar comunicar-se com o usua'rio isso pode ser feito ou atrave's de um painel de controle nele pro'prio ou em caso contra'rio atrave's de respostas a certos eventos que esse mo'dulo encontrar como sai'da vinda do Geomview.  File: geomview-pt_BR, Node: Example1, Next: Example2, Prev: Interface, Up: Modulos 6.2 Exemplo 1: Mo'dulo Externo Simples ====================================== Essa sec,a~o fornece um mo'dulo externo extremamente simples que mostra uma malha oscilando. Para experimentar esse exemplo, fac,a uma co'pia do arquivo `example1.c' (esse arquivo e' distribui'do com Geomview no subdiretio `doc') em seu direto'rio e compile `example1.c' com o comando cc -o example1 example1.c -lm A seguir coloque a linha (emodule-define "Example 1" "./example1") em um arquivo chamado `.geomview' no seu direto'rio atual. A seguir chame o Geomview; E' importante que voce^ compile o programa exemplo, crie o arquivo `.geomview' e chame o Geomview a partir do mesmo direto'rio. Voce^ pode ver "Example 1" no navegador de mo'dulos (_Modules_) do painel principal (_Main_) do Geomview; clique sobre essa entrada no navegador para iniciar o mo'dulo. Uma superfi'cie deve aparecer na sua janela de ca^mera e deve estar oscilando. Voce^ pode parar o mo'dulo clicando sobre a linha "[1] Example 1" no navegador de mo'dulos (_Modules_). /* * example1.c: oscillating mesh * * This example module is distributed with the Geomview manual. * If you are not reading this in the manual, see the "External * Modules" chapter of the manual for more details. * * This module creates an oscillating mesh. */ #include #include /* F is the function that we plot */ float F(x,y,t) float x,y,t; { float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); } main(argc, argv) char **argv; { int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t, dt; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Geomview setup. We begin by sending the command * (geometry example { : foo}) * to Geomview. This tells Geomview to create a geom called * "example" which is an instance of the handle "foo". */ printf("(geometry example { : foo })\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) { UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); } } /* UpdateMesh sends one mesh iteration to Geomview. This consists of * a command of the form * (read geometry { define foo * MESH * ... * }) * where ... is the actual data of the mesh. This command tells * Geomview to make the value of the handle "foo" be the specified * mesh. */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; { int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry { define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include #include /* for struct timeval below */ #include "forms.h" /* for FORMS library */ FL_FORM *OurForm; FL_OBJECT *VelocitySlider; float dt; /* F is the function that we plot */ float F(x,y,t) float x,y,t; { float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); } /* SetVelocity is the slider callback procedure; FORMS calls this * when the user moves the slider bar. */ void SetVelocity(FL_OBJECT *obj, long val) { dt = fl_get_slider_value(VelocitySlider); } /* Quit is the "Quit" bota~o callback procedure; FORMS calls this * when the user cliques the "Quit" bota~o. */ void Quit(FL_OBJECT *obj, long val) { exit(0); } /* create_form_OurForm() creates the FORMS panel by calling a bunch of * procedures in the FORMS library. This code was generated * automatically by the FORMS designer program; normally this code * would be in a separate file which you would not edit by hand. For * simplicity of this example, however, we include this code here. */ create_form_OurForm() { FL_OBJECT *obj; FL_FORM *form; OurForm = form = fl_bgn_form(FL_NO_BOX,380.0,120.0); obj = fl_add_box(FL_UP_BOX,0.0,0.0,380.0,120.0,""); VelocitySlider = obj = fl_add_valslider(FL_HOR_SLIDER,20.0,30.0, 340.0,40.0,"Velocity"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_object_align(obj,FL_ALIGN_TOP); fl_set_call_back(obj,SetVelocity,0); obj = fl_add_button(FL_NORMAL_BUTTON,290.0,75.0,70.0,35.0,"Quit"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_call_back(obj,Quit,0); fl_end_form(); } main(argc, argv) char **argv; { int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t; int fdmask; static struct timeval timeout = {0, 200000}; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Forms panel setup. */ foreground(); create_form_OurForm(); fl_set_slider_bounds(VelocitySlider, 0.0, 1.0); fl_set_slider_value(VelocitySlider, dt); fl_show_form(OurForm, FL_PLACE_SIZE, TRUE, "Example 2"); /* Geomview setup. */ printf("(geometry example { : foo })\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) { fdmask = (1 << fileno(stdin)) | (1 << qgetfd()); select(qgetfd()+1, &fdmask, NULL, NULL, &timeout); fl_check_forms(); UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); } } /* UpdateMesh sends one mesh iteration to Geomview */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; { int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry { define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include "lisp.h" /* We use the OOGL lisp library */ #include "pickfunc.h" /* for PICKFUNC below */ #include "3d.h" /* for 3d geometry library */ /* boxstring gives the OOGL data to define the little box that * we draw at the pick point. NOTE: It is very important to * have a newline at the end of the OFF objeto in this string. */ char boxstring[] = "\ INST\n\ transform\n\ .04 0 0 0\n\ 0 .04 0 0\n\ 0 0 .04 0\n\ 0 0 0 1\n\ geom\n\ OFF\n\ 8 6 12\n\ \n\ -.5 -.5 -.5 # 0 \n\ .5 -.5 -.5 # 1 \n\ .5 .5 -.5 # 2 \n\ -.5 .5 -.5 # 3 \n\ -.5 -.5 .5 # 4 \n\ .5 -.5 .5 # 5 \n\ .5 .5 .5 # 6 \n\ -.5 .5 .5 # 7 \n\ \n\ 4 0 1 2 3\n\ 4 4 5 6 7\n\ 4 2 3 7 6\n\ 4 0 1 5 4\n\ 4 0 4 7 3\n\ 4 1 2 6 5\n"; progn() { printf("(progn\n"); } endprogn() { printf(")\n"); fflush(stdout); } Initialize() { extern LObject *Lpick(); /* This is defined by PICKFUNC below but must */ /* be used in the following LDefun() call */ LInit(); LDefun("pick", Lpick, NULL); progn(); { /* Define handle "littlebox" for use later */ printf("(read geometry { define littlebox { %s }})\n", boxstring); /* Express interest in pick events; see Geomview manual for explanation. */ printf("(interest (pick world * * * * nil nil nil nil nil))\n"); /* Define "pick" objeto, initially the empty list (= null objeto). * We replace this later upon receiving a pick event. */ printf("(geometry \"pick\" { LIST } )\n"); /* Make the "pick" objeto be non-pickable. */ printf("(pickable \"pick\" no)\n"); /* Turn off normalization, so that our pick objeto will appear in the * right place. */ printf("(normalization \"pick\" none)\n"); /* Don't draw the pick objeto's bounding box. */ printf("(bbox-draw \"pick\" off)\n"); } endprogn(); } /* The following is a macro call that defines a procedure called * Lpick(). The reason for doing this in a macro is that that macro * encapsulates a lot of necessary stuff that would be the same for * this procedure in any program. If you write a Geomview module that * wants to know about user pick events you can just copy this macro * call and change the body to suit your needs; the body is the last * argument to the macro and is delimited by curly braces. * * The first argument to the macro is the name of the procedure to * be defined, "Lpick". * * The next two arguments are numbers which specify the sizes that * certain arrays inside the body of the procedure should have. * These arrays are used for storing the face and path information * of the picked objeto. In this module we don't care about this * information so we declare them to have length 1, the minimum * allowed. * * The last argument is a block of code to be executed when the module * receives a pick event. In this body you can refer to certain local * variables that hold information about the pick. For details see * Example 3 in the Extenal Modules chapter of the Geomview manual. */ PICKFUNC(Lpick, 1, 1, { handle_pick(pn>0, &point, vn>0, &vertex, en>0, edge); }, /* version for picking Nd-objects (not documented here) */) handle_pick(picked, p, vert, v, edge, e) int picked; /* was something actually picked? */ int vert; /* was the pick near a vertex? */ int edge; /* was the pick near an edge? */ HPoint3 *p; /* coords of pick point */ HPoint3 *v; /* coords of picked ve'rtice */ HPoint3 e[2]; /* coords of endpoints of picked edge */ { Normalize(&e[0]); /* Normalize makes 4th coord 1.0 */ Normalize(&e[1]); Normalize(p); progn(); { if (!picked) { printf("(geometry \"pick\" { LIST } )\n"); } else { /* * Put the box in place, and color it magenta if it's on a ve'rtice, * yellow if not. */ printf("(xform-set pick { 1 0 0 0 0 1 0 0 0 0 1 0 %g %g %g 1 })\n", p->x, p->y, p->z); printf("(geometry \"pick\"\n"); if (vert) printf("{ appearance { material { diffuse 1 0 1 } }\n"); else printf("{ appearance { material { diffuse 1 1 0 } }\n"); printf(" { LIST { :littlebox }\n"); /* * If it's on an edge and not a vertex, mark the edge * with cyan boxes at the endpoins and a black line * along the edge. */ if (edge && !vert) { e[0].x -= p->x; e[0].y -= p->y; e[0].z -= p->z; e[1].x -= p->x; e[1].y -= p->y; e[1].z -= p->z; printf("{ appearance { material { diffuse 0 1 1 } }\n\ LIST\n\ { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\ { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\ { VECT\n\ 1 2 1\n\ 2\n\ 1\n\ %f %f %f\n\ %f %f %f\n\ 1 1 0 1\n\ }\n\ }\n", e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z, e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z); } printf(" }\n }\n)\n"); } } endprogn(); } Normalize(HPoint3 *p) { if (p->w != 0) { p->x /= p->w; p->y /= p->w; p->z /= p->w; p->w = 1; } } main() { Lake *lake; LObject *lit, *val; extern char *getenv(); Initialize(); lake = LakeDefine(stdin, stdout, NULL); while (!feof(stdin)) { /* Parse next lisp expression from stdin. */ lit = LSexpr(lake); /* Evaluate that expression; this is where Lpick() gets called. */ val = LEval(lit); /* Free the two expressions from above. */ LFree(lit); LFree(val); } } The code begins by defining procedures `progn()' and `endprogn()' which begin and end a Geomview `progn' group. The purpose do Geomview `progn' command is to group commands together and cause Geomview to execute them all at once, without refreshing any graphics windows until the end. It is a good idea to group blocks of commands that a module sends to Geomview like this so that the user sees their cumulative effect all at once. Procedure `Initialize()' does various things needed at program startup time. It initializes the lisp library by calling `LInit()'. Any program that uses the lisp library should call this once before calling any other lisp library functions. It then calls `LDefun' to tell the library about our `pick' procedure, which is defined further down with a call to the `PICKFUNC' macro. Then it sends a bunch of setup commands to Geomview, grouped in a `progn' block. This includes defining a handle called `littlebox' that stores the geometry da little box. Next it sends the command (interest (pick world * * * * nil nil nil nil nil)) which tells Geomview to notify us when a pick event happens. The syntax of this `interest' statement merece some explanation. In general `interest' takes one argument which is a (parenthesized) expression representing a Geomview function call. It especifica a type of call that the module is interested in knowing about. The arguments can be any particular argument values, ou the special symbols `*' or `nil'. For example, the first argument in the `pick' expression above is `world'. This means that the module is interested in calls to `pick' where the first argument, which especifica the coordinate system, is `world'. A `*' is like a wild-card; it means that the module is interested in calls where the corresponding argument has any value. The word `nil' is like `*', except that the argument's value is not reported to the module. This is useful for cutting down on the amount of data that must be transmitted in cases where there are arguments that the module doesn't care about. The second, third, fourth, and fifth arguments to the `pick' command give the name, pick point coordenadas, coordenadas do ve'rtice, and edge coordenadas of a pick event. We specify these by `*''s above. The remaining five arguments to the `pick' command give other information about the pick event that we do not care about in this module, so we specify these with `nil''s. For the details dos arguments to `pick', *Note GCL::. The `geometry' statement defines a geom called `pick' that is initially an empty list, specified as ` { LIST } '; this is the best way of specifying a null geom. The module will replace this with something useful by sending Geomview another `geometry' command when the user picks something. Next we arrange for the `pick' objeto to be non-pickable, and turn normalization off for it so that Geomview will display it in the size and location where we put it, rather than resizing and relocating it to fit into the unit cube. The next function in the file, `Lpick', is defined with a strange looking call to a macro called `PICKFUNC', defined in the header file `pickfunc.h'. This is the function for handling pick events. The reason we provide a macro for this is that that macro encapsulates a lot of necessary stuff that would be the same for the pick-handling function in any program. If you write a Geomview module that wants to know about user pick events you can just copy this macro call and change it to suit yours needs. In general the syntax for `PICKFUNC' is PICKFUNC(NAME, BLOCK, NDBLOCK) where NAME is the name do procedure to be defined, in this case `Lpick'. The next argument, BLOCK, is a block of code to be executed when a pick event occurs. If BLOCK contains a return statement, then the returned value must be a pointer to a Lisp-objeto, that is of type `LObject *'. The last argument has the same functionality as the BLOCK argument, but is only invoked when picking objetos in a higher dimensional world. `PICKFUNC' declares certain local variables in the body do procedure. When the module receives a `(pick ...)' statement from Geomview, the procedure assigns values to these variables based on the information in the `pick' call (variables corresponding to `nil''s in the `(interest (pick ...))' are not given values). There is also a second variant da `PICKFUNC' macro with a slightly different syntax: DEFPICKFUNC(HELPSTR, COORDSYS, ID, POINT, PN, VERTEX, VN, EDGE, EN, FACE, FN, PPATH, PPN, VI, EI, EIN, FI, BODY, NDBODY) `DEFPICKFUNC' can be used as well as `PICKFUNC', there is no functional differene with the exception that the name da C-function is tied to `Lpick' when using `DEFPICKFUNC' and that the `(help pick)' GCL-command (*note `(help ...)': help.) would respond with echoing HELPSTR. The table below lists all variables defined in `PICKFUNC' In the context of ND-viewing `float' variants dos arguments apply: the BODY execution block sees the `HPoint3' variables, and the NDBODY block sees only flat one-dimensional arrays of `float'-type. In the ND-viewing context the co-ordinates passed to the pick function are still the 3-dimensional co-ordinates da ca^mera view-port where the pick occurred, but padded with zeroes on transformed back to the co-ordinate system specified by the second argument do `pick' command. `char *coordsys;' A string specifying the coordinate system in which coordenadas are given. In this example, this will always be `world' because do `interest' call above. `char *id;' A string specifying the name do picked geom. `HPoint3 point; int pn;' `float *point; int pn;' `point' is an `HPoint3' structure giving the coordenadas of the picked point. `HPoint3' is a homogeneous point coordinate representation equivalent to an array of 4 floats. `pn' tells how many coordenadas have been written into this array; it will always be either `0', `4' ou greater than `4'. If it is greater than `4', then the NDBODY instruction block is invoked and in this case `point' is a flat array of `pn' many `float's. A value of zero means no point was picked, i.e. the user clicado the bota~o direito do mouse while the cursor was not pointing at a geom. In this case the ordinary BLOCK 3d instruction block is executed. `HPoint3 vertex; int vn;' `float *vertex; int vn;' `vertex' is an `HPoint3' structure giving the coordenadas of the ve'rtice selecionado, if the pick point was near a ve'rtice. `vn' tells how many coordenadas have been written into this array; it will always be either `0' ou greater equal `4'. A value of zero means the pick point was not near a ve'rtice. In the context of ND-viewing `vertex' will be an array of `vn' `float's and `vn' will be equal to `pn'. `HPoint3 edge[2]; int en;' `float *edge; int en;' `edge' is an array of two `HPoint3' structures giving the coordenadas do endpoints da picked edge, if the pick point was near an edge. `en' tells how many coordenadas have been written into this array; it will always be `0' ou greater equal `8'. A value of zero means the pick point was not near an edge. In the context of ND-viewing `edge' will be a flat one-dimensional array of `en' many `float's: the first `pn' `float's define the first ve'rtice, and the second `pn' many `float's define the second ve'rtice; `en' will be two times `pn'. In this example module, the remaining variables will never be given values because their values in the `interest' statement were specified as `nil'. `HPoint3 face[]; int fn;' `float *face; int fn;' `face' is a variable length array of FN `HPoint3''s. `face' gives the coordenadas dos ve'rtices da picked face. `fn' tells how many coordenadas have been written into this array; it will always be either `0' ou a multiple of `pn'. A value of zero means the pick point was not near a face. In the context of ND-viewing `face' is a flat one-dimensional array of `fn' many floats of which each ve'rtice occupies `pn' many componentes. `int ppath[]; int ppn;' `ppath' is an array of MAXPATHLEN `int''s. `ppath' gives the path through the OOGL heirarchy to the picked primitive. `pn' tells how many integers have been written into this array; it will be at most MAXPATHLEN. A path of {3,1,2}, for example, means that the picked primitive is "subobjeto number 2 of subobjeto number 1 of objeto 3 in the world". `int vi;' `vi' gives the index do ve'rtice selecionado in the picked primitive, if the pick point was near a ve'rtice. `int ei[2]; int ein' The `ei' array gives the indices dos endpoints da picked edge, if the pick point was near a ve'rtice. `ein' tells how many integers were written into this array. It will always be either 0 ou 2; a value of 0 means the pick point was not near an edge. `int fi;' `fi' gives the index da picked face in the picked primitive, if the pick point was near a face. The `handle_pick' procedure actually does the work of dealing with the pick event. It begins by normalizing the homogeneous coordenadas passed in as arguments so that we can assume the fourth coordinate is 1. It then sends GCL commands to define the `pick' objeto to be whatever is appropriate for the kind of pick recieved. Veja *note Formatos dos Arquivos da OOGL::, and veja *note GCL::, for an explanation do format dos data in these commands. The main program, at the bottom do file, first calls `Initialize()'. Next, the call to `LakeDefine' defines the `Lake' that the lisp library will use. A `Lake' is a structure that the lisp library uses internally as a type of communiation vehicle. (It is like a unix stream but more general, hence the name.) This call to `LakeDefine' defines a `Lake' structure for doing I/O with `stdin' and `stdout'. The third argument to `LakeDefine' should be `NULL' for external modules (it is used by Geomview). Finally, the program enters its main loop which parses and evaluates expressions from standard input.  File: geomview-pt_BR, Node: Example4, Next: Module Installation, Prev: Example3, Up: Modulos 6.6 Example 4: Simple Tcl/Tk Module Demonstrating Picking ========================================================= It's not necessary to write a Geomview module in C. The only requirement of an external module is that it send GCL commands to its standard output and expect responses (if any) on its standard input. An external module can be written in C, perl, tcl/tk, ou pretty much anything. As an example, assuming you have Tcl/Tk version 4.0 ou later, here's an external module with a simple GUI which demonstrates interaction with geomview. This manual doesn't discuss the Tcl/Tk language; see the good book on the subjeto by its originator John Ousterhout, published by Addison-Wesley, titled _Tcl and the Tk Toolkit_. The `#!' on the script's first line causes the system to interpret the script using the Tcl/Tk `wish' program; you might have to change its first line if that's in some location other than /usr/local/bin/wish4.0. Or, you could define it as a module using (emodule-define "Pick Demo" "wish pickdemo.tcl") in which case `wish' could be anywhere on the UNIX search path. #! /usr/local/bin/wish4.0 # We use "fileevent" below to have "readsomething" be called whenever # data is available from standard input, i.e. when geomview has sent us # something. It promises to include a trailing newline, so we can use # "gets" to read the geomview response, then parse its nested parentheses # into tcl-friendly {} braces. proc readsomething {} { if {[gets stdin line] < 0} { puts stderr "EOF on input, exiting..." exit } regsub -all {\(} $line "\{" line regsub -all {\)} $line "\}" line # Strip outermost set of braces set stuff [lindex $line 0] # Invoke handler for whichever command we got. Could add others here, # if we asked geomview for other kinds of data as well. switch [lindex $stuff 0] { pick {handlepick $stuff} rawevent {handlekey $stuff} } } # Fields of a "pick" response, from geomview manual: # (pick COORDSYS GEOMID G V E F P VI EI FI) # The pick command is executed internally in response to pick # events (right mouse double clique). # # COORDSYS = coordinate system in which coordenadas of the following # arguments are specified. This can be: # world: world coord sys # self: coord sys of the picked geom (GEOMID) # primitive: coord sys of the actual primitive within # the picked geom where the pick occurred. # GEOMID = id of picked geom # G = picked point (actual intersection of pick ray with objeto) # V = picked vertex, if any # E = picked edge, if any # F = picked face # P = path to picked primitive [0 ou more] # VI = index of picked ve'rtice in primitive # EI = list of indices of endpoints of picked edge, if any # FI = index of picked face # Report when user picked something. # proc handlepick {pick} { global nameof selvert seledge order set obj [lindex $pick 2] set xyzw [lindex $pick 3] set fv [lindex $pick 6] set vi [lindex $pick 8] set ei [lindex $pick 9] set fi [lindex $pick 10] # Report result, converting 4-component homogeneous point into 3-space point. set w [lindex $xyzw 3] set x [expr [lindex $xyzw 0]/$w] set y [expr [lindex $xyzw 1]/$w] set z [expr [lindex $xyzw 2]/$w] set s "$x $y $z " if {$vi >= 0} { set s "$s vertex #$vi" } if {$ei != {}} { set s "$s edge [lindex $ei 0]-[lindex $ei 1]" } if {$fi != -1} { set s "$s face #$fi ([expr [llength $fv]/3]-gon)" } msg $s } # Having asked for notification of these raw events, we report when # the user pressed these keys in the geomview graphics windows. proc handlekey {event} { global lastincr switch [lindex $event 1] { 32 {msg "Pressed space bar"} 8 {msg "Pressed backspace key"} } } # # Display a message on the control panel, and on the terminal where geomview # was started. We use ``puts stderr ...'' rather than simply ``puts ...'', # since Geomview interprets anything we send to standard output # as a GCL command! # proc msg {str} { global msgtext puts stderr $str set msgtext $str update } # Load objeto from file proc loadobject {fname} { if {$fname != ""} { puts "(geometry thing < $fname)" # Be sure to flush output to ensure geomview receives this now! flush stdout } } # Build simple "user interface" # The message area could be a simple label rather than an entry box, # but we want to be able to use X selection to copy text from it. # The default mouse bindings do that automatically. entry .msg -textvariable msgtext -width 45 pack .msg frame .f label .f.l -text "File to load:" pack .f.l -side left entry .f.ent -textvariable fname pack .f.ent -side left -expand true -fill x bind .f.ent { loadobject $fname } pack .f # End UI definition. # Call "readsomething" when data arrives from geomview. fileevent stdin readable {readsomething} # Geomview initialization puts { (interest (pick primitive)) (interest (rawevent 32)) # Be notified when user presses space (interest (rawevent 8)) # ou backspace keys. (geometry thing < hdodec.off) (normalization world none) } # Flush to ensure geomview receives this. flush stdout wm title . {Sample external module} msg "Click right mouse in graphics window"  File: geomview-pt_BR, Node: Module Installation, Prev: Example4, Up: Modulos 6.7 Module Installation ======================= Essa sec,a~o diz como instalar um mo'dulo externo de forma que voce^ possa invoca'-lo dentro do Geomview. Existem duas maneiras de instalar um mo'dulo: voce^ pode installar um mo'dulo _privado_ de forma que o mo'dulo esteja disponi'vel somente para voce^ mesmo sempre que executar o Geomview, ou voce^ pode instalar um mo'dulo de _sistema_ de forma que o mo'dulo esteja disponi'vel para todos os usua'rios do seu sistema sempre que eles executarem o Geomview. * Menu: * Private Module Installation:: Mo'dulos para um U'nico Usua'rio. * System Module Installation:: Mo'dulos para Todos os Usua'rio do Sistema.  File: geomview-pt_BR, Node: Private Module Installation, Next: System Module Installation, Prev: Module Installation, Up: Module Installation 6.7.1 Private Module Installation --------------------------------- O comando `emodule-define' providencia que um mo'dulo aparec,a no navegador de mo'dulos (_Modules_) do Geomview. O comando recebe dois arumentos que sa~o seque^ncias de caractere; o primeiro e' o nome que ira' aparecer no navegador de mo'dulos (_Modules_). O segundo e' o comando de shell para executar o mo'dulo; esse nome de shell pode incluir argumentos (veja *note `(emodule-define ...)': emodule-define.). Geomview executa esse comando em um subshell quando voce^ da' um clique sobre a entrada do mo'dulo no navegador. Por exemplo (emodule-define "Foo" "/u/home/modules/foo -x") adiciona uma linha rotulada "Foo" ao navegador de mo'dulos (_Modules_) o qual faz com que o comando "/u/home/modules/foo -x" seja executado quando selecionado. Voce^ pode colocar comandos `emodule-define' no seu arquivo `~/.geomview' para providenciar que certos mo'dulos estejam disponi'veis sempre que voce^ execute Geomview; veja *note Customizacao::. voce^ pode tambe'm executar comandos `emodule-define' a partir do painel de comandos (_Commands_) para adicionar um mo'dulo a uma co'pia do Geomview que ja' esteja sendo executada. Existem muitos outros comandos GCL para controlar as entradas no navegador de mo'dulos (_Modules_); para detalhes, veja *note GCL::.  File: geomview-pt_BR, Node: System Module Installation, Prev: Private Module Installation, Up: Module Installation 6.7.2 System Module Installation -------------------------------- Para instalar um mo'dulo de forma que esse mo'dulo esteja disponi'vel para todos os usua'rios do Geomview fac,a o seguinte 1. Crie um arquivo chamado `.geomview-MO'DULO' `MO'DULO' e' o nome do mo'dulo. Esse arquivo deve conter uma linha simples que e' um comando `emodule-define' para aquele mo'dulo: (emodule-define "Novo Mo'dulo" "novomodulo") O primeiro argumento, `"Novo Mo'dulo"' acima, e' a seque^ncia de caracteres que ira' aparecer no navegador de mo'dulo (_Modules_). A segunda seque^ncia de caracteres, `"novomodulo"' acima, e' o comando de Bourne shell para invocar o mo'dulo. Esse comando de shell pode incluir argumentos, e voce^ pode assumir que o mo'dulo encontra-se localizado em $PATH que representa os locais de busca do shell. 2. Coloque uma co'pia do `.geomview-MO'DULO' e o executa'vel do mo'dulo propriamente dito no direto'rio `/usr/local/libexec/geomview'. Apo's esses passos, o novo mo'dulo deve aparecer, em ordem alfabe'tica, no navegador de mo'dulos (_Modules_) do Geomview do painel principal (_Main_) da pro'xima vez que o Geomview for inicializado. A raza~o desse trabalho e' que quando Geomview for invocado processara' todos os arquivos `.geomview-*' em seu direto'rio de `mo'dulos'. Geomview tambe'm lembra o caminho desse direto'rio e coloca aquele caminho em $PATH do shell no qual Geomview invoca tal mo'dulo.  File: geomview-pt_BR, Node: GCL, Next: Geometrias Nao-Euclidianas, Prev: Modulos, Up: Top 7 GCL: a Linguagem de Comandos do Geomview ****************************************** GCL tem a sintaxe do lisp - i.e. uma expressa~o da forma (f a b ...) significa informar os vallores de a, b, ... para a func,a~o f. GCL e' muito limitado e GCL na~o e' de forma alguma uma implementac,a~o de lisp. GCL e' simplesmente uma linguagem para expressar comandos que sa~o executados na ordem fornecida, ao contra'rio de uma linguagem de programac,a~o. GCL na~o suporta varia'vel ou definic,a~o de func,a~o. GCL e' a linguagem que Geomview entende para arquivos que chama bem como para comunicac,a~o com outros programas. Para executar um comando GCL interativamente, voce^ pode trazer o painel de comandos (_Commands_) que tra's sua digitac,a~o em um comando; Geomview executa o comando quando voce^ pressiona a tecla . A sai'da de tais comandos e' mostrada na sai'da padra~o. Alternativamente, voce^ pode invocar Geomview com `geomview -c -' que faz com que o Geomview leia comandos GCL a partir da entrada padra~o. Func,o~es GCL retornam um valor, e voce^ pode concaenar chamadas de func,a~o de forma que outras func,o~es usem esse valor retornado. Por exemplo (f (g a b)) avalia `(g a b)' e enta~o avalia `(f x)' onde `x' e' o resultado retornado por `(g a b)'. Geomview mante'm esses valores de retorno internamente normalmente na~o fornece sai'da alguma com os resultados guardados. Para mostrar um valor de retorno esse valor de retorno deve ser fornecido a` func,a~o `echo'. Por exemplo a func,a~o `geomview-version' retorna uma seque^ncia de caracteres representado a versa~o do Geomview que esta' sendo executada, e (echo (geomview-version)) mostra essa seque^ncia de caracteres. Muitas func,a~o simplesmente retornam `t' ( de "true" - verdadeiro) caso tenham sido executadas como esperado ou `nil' ( nenhum ) em caso de falha; esse e' o caso se a documentac,a~o para a func,a~o na~o fornece o retorno esperado. Esses sa~o os si'mbolos do lisp para verdadeiro e falso, respectivamente. (Eles correspondem a`s varia'veis definidas em C `Lt' e `Lnil' que voce^ vera' se olhar no co'digo fonte do Geomview ou em algum dos mo'dulos externos.) Nas descric,o~es ds comandos acima muitas refer6encias sa~o feitas a formatos "OOGL" formats. OOGL e' a linguagem de descric,a~o dos dados que Geomview utiliza para descrever objetos geome'tricos, ca^meras, apare^ncias, e outos objetos ba'sicos. Para detalhes dos formatos OOGL, veja *note Formatos dos Arquivos da OOGL::. (Ou equivalentemente, veja a pa'gina de manual oogl(5), distributed with Geomview in the file /share/man/man5/oogl.5gv. Os comandos GCL e tipos de argumentos sa~o listados abaixo. A maioria da documentac,a~o nessa sec,a~o do manual esta' disponi'vel dentro do Geomview via comandos `?' e `??'. O comando `(? COMANDO)' faz com que Geomview mostre na tela um suma'rio de uma linha da sintaxe de COMANDO, e `(?? COMANDO)' mostra na tela uma explanac,a~o de o que COMANDO faz. Voce^ pode incluir o caractere coringa `*' no COMANDO para mostrar informac,o~es para um frupo de comandos coincidindo com um modelo. Por exemplo, `(?? *emodule*)' ira' mostrar todas as informac,o~es sobre todos os comandos contendo a seque^ncia de caracteres `emodule'. `(? *)' ira' mostrar um lista curta de todos os comandos. * Menu: * Argument Conventions:: Convenc,o~es usadas ao se descrever tipos de argumentos. * GCL Reference:: Documentac,a~o para cada comandoo GCL.  File: geomview-pt_BR, Node: Argument Conventions, Next: GCL Reference, Prev: GCL, Up: GCL 7.1 Conventions Used In Describing Argument Types ================================================= Os seguintes si'mbolos sa~o usados para descrever tipos de argumentos na documentac,a~o para func,o~es GCL. `APARE^NCIA' e' uma especificac,a~o de apare^ncia OOGL. `CAM-ID' e' uma IDentificac,a~o que refre-se a uma ca^mera. `CA^MERA' e' uma especificac,a~o de ca^mera do OOGL. `GEOM-ID' e' uma IDentificac,a~o que se refere a um objeto geome'trico. `GEOMETRY' e' uma especificac,a~o de objeto geome'trico do OOGL. `ID' e' uma seque^ncia de caracteres que nomeia um objeto geome'trico ou ca^mera. Como aqueles que voce^ cria, os valores permitidos sa~o: ``World, world, worldgeom, g0'' a colec,a~o de todos os objetos geome'tricos `target' objeto alvo selecionado (ca^mera ou objeto geome'trico) `center' objeto central do movimento selecionado `targetcam' a u'ltima ca^mera alvo selecionada `targetgeom' o u'ltimo objeto geome'trico alvo selecionado `focus' ca^mera onde o cursor esta' (ou mais recentemente esteve) `allgeoms' todos os objetos geome'tricos `allcams' todas as ca^meras ``default, defaultcam, prototype'' ca^meras futuras que herdara~o as escolhas padronizadas As seguintes IDs sa~o usadas para nomear sistemas de coordenadas, e.g. em comandos `pick' e `write': ``World, world, worldgeom, g0'' o objeto mundo, dentro do qual todos os objetos geome'tricos vivem. `universe' o universo, no qual o no qual o objeto mundo, as luzes e as ca^meras vivem. Transformac,o~es world2cam das ca^meras podem melhor serem chamadas universe2cam, etc. `self' "esse objeto do Geomview". Transforma de um objeto para `si mesmo' e' a identidade; escrevendo seu objeto geome'trico fornece o bojeto em si mesmo sem executar nenhuma transformac,a~o; pontos selecionados aparecem nas coordenadas do objeto. `primitive' (para objetos selecionados (`pick') somente) Pontos selecionados aparecem no sistema de coordenadas da primitiva de menor ni'vel do OOGL. Um nome tambe'm e' uma `id'entificac,a~o aceita'vel. Fornecimento de nomes e' feito u'nico pela anexac,a~o de nu'meros se necessa'rio (i.e. `foo<2>'). Todo objeto geome'trico e' tambe'm chamado g[n] e toda ca^mera e' tambe'm chamada c[n] (`g0' e' sempre o objeto geome'trico mundo - worldgeom): esse nome e' usado como um prefixo a comandos de teclado e pode tambe'm ser usado como uma identificac,a~o GCL. Nu'meros sa~o usados apo's um objeto ser deletado. Ambos os nomes sa~o mostrados no navegador de Objeto. `DECLARAC,A~O' representa uma chamada de func,a~o. Chamadas a func,o~es possuem a forma `(func arg1 arg2 ... )', onde `func' e' o nome da func,a`o e `arg1', `arg2', ... sa~o os argumentos. `TRANSFORMAC,A~O' e' uma matriz de transformac,a~o OOGL 4x4. `NTRANSFORM' e' uma matriz de transformac,a~o OOGL (N+1)x(N+1). `JANELA' e' uma especificac,a~o de janela do OOGL. geomview-1.9.5/doc/geomview-pt_BR-20000644000175000017500000043515112310147167013761 00000000000000This is ../../doc/geomview-pt_BR, produced by makeinfo version 4.13 from ../../doc/geomview-pt_BR.texi. INFO-DIR-SECTION Graphics Applications START-INFO-DIR-ENTRY * Geomview: (geomview-pt_BR). Programa interativo de visualizac,a~o tridimensional. END-INFO-DIR-ENTRY  File: geomview-pt_BR, Node: GCL Reference, Prev: Argument Conventions, Up: GCL 7.2 GCL Reference Guide ======================= * Menu: * shell-shortcut:: `(! COMANDOSHELL)' * lt:: `(< EXPR1 EXPR2)' * eq:: `(= EXPR1 EXPR2)' * gt:: `(> EXPR1 EXPR2)' * mul:: `(* EXPR1 EXPR2)' * div:: `(/ EXPR1 EXPR2)' * add:: `(+ EXPR1 EXPR2)' * sub:: `(- EXPR1 EXOR2)' * help-shortcut:: `(? COMANDO)' * morehelp-shortcut:: `(?? COMANDO)' * emodule-run-shortcut:: `(| NOME)' * all:: `(all objetogeome'trico|ca^mera|emodule)' * and:: `(and EXPR1 EXPR2)' * ap-override:: `(ap-override [on|off])' * backcolor:: `(backcolor CAM-ID R G B)' * background-image:: `(background-image CAM-ID [NOMEDOARQUIVO])' * bbox-color:: `(bbox-color GEOM-ID R G B)' * bbox-draw:: `(bbox-draw GEOM-ID [yes|no])' * camera:: `(camera CAM-ID [CAMERA])' * camera-draw:: `(camera-draw CAM-ID [yes|no])' * camera-prop:: `(camera-prop { geometry object } [projective])' * camera-reset:: `(camera-reset CAM-ID)' * car:: `(car LISTA)' * cdr:: `(cdr LISTA)' * clock:: `(clock)' * command:: `(command ARQENTRADA [ARQSAIDA])' * cons:: `(cons EXPR LISTA)' * copy:: `(copy [ID] [nome])' * cursor-still:: `(cursor-still [INT])' * cursor-twitch:: `(cursor-twitch [INT])' * defun:: `(defun NOME ARGS [DOC] CORPO)' * delete:: `(delete ID)' * dice:: `(dice GEOM-ID N)' * dimension:: `(dimension [N])' * dither:: `(dither CAM-ID {on|off|toggle})' * draw:: `(draw CAM-ID)' * dump-handles:: `(dump-handles)' * echo:: `(echo ...)' * emodule-clear:: `(emodule-clear)' * emodule-define:: `(emodule-define NOME COMANDOSHELL ...)' * emodule-defined:: `(emodule-defined `NOMEMÓDULO')' * emodule-isrunning:: `(emodule-isrunning NOME)' * emodule-path:: `(emodule-path)' * emodule-run:: `(| NOME)' * emodule-sort:: `(emodule-sort)' * emodule-start:: `(emodule-start NOME)' * emodule-transmit:: `(emodule-transmit NOME LISTA)' * escale:: `(escale GEOM-ID FATOR)' * eval:: `(eval EXPR)' * event-keys:: `(event-keys {on|off})' * event-mode:: `(event-mode MODESTRING)' * event-pick:: `(event-pick {on|off})' * evert:: `(evert GEOM-ID [yes|no])' * exit:: `(exit)' * ezoom:: `(ezoom GEOM-ID FATOR)' * freeze:: `(freeze CAM-ID)' * geometry:: `(geometry GEOM-ID [OBJETOGEOME'TRICO])' * geomview-version:: `(geomview-version)' * hdefine:: `(hdefine geometry|camera|... NOME VALOR)' * hdelete:: `(hdelete [geometry|camera|...] nome)' * help:: `(? COMANDO)' * hmodel:: `(hmodel CAMID {virtual|projective|conformal})' * hsphere-draw:: `(hsphere-draw CAMID [yes|no])' * if:: `(if TEST EXPR1 [EXPR2])' * inhibit-warning:: `(inhibit-warning STRING)' * input-translator:: `(input-translator "#pfx" "comando-shell")' * interest:: `(interest (COMANDO [args]))' * lambda:: `(lambda ARGS CORPO)' * let:: `(let (ARGS) CORPO)' * lines-closer:: `(lines-closer CAM-ID DIST)' * load:: `(load nomearquivo [command|geometry|camera])' * load-path:: `(load-path)' * look:: `(look [objetoID] [camID])' * look-encompass:: `(look-encompass [objID] [camID])' * look-encompass-size:: `(look-encompass-size [view clip near far])' * look-recenter:: `(look-recenter [objID] [camID])' * look-toward:: `(look-toward [objID] [camID] [origin|center])' * merge:: `(merge {janela|camera} CAM-ID { WIN or CAM ... })' * merge-ap:: `(merge-ap GEOM-ID APARE^NCIA)' * merge-base-ap:: `(merge-base-ap APAARE^NCIA)' * merge-baseap:: `(merge-baseap APARE^NCIA)' * mod:: `(mod NUMERADOR DENOMINADOR)' * morehelp:: `(?? COMANDO)' * name-object:: `(name-object ID NOME)' * ND-axes:: `(ND-axes CAMID [CLUSTER [Xidx Yidx Zidx [Widx]]])' * ND-color:: `(ND-color CAMID ...' * ND-xform:: `(ND-xform OBJID [ntransform { ... }])' * ND-xform-get:: `(ND-xform-get ID [from-ID])' * ND-xform-set:: `(ND-xform-set OBJID [ntransform { ... }])' * new-alien:: `(new-alien nome [GEOMETRY])' * new-camera:: `(new-camera nome [CAMERA])' * new-center:: `(new-center [id])' * new-geometry:: `(new-geometry nome [GEOMETRY])' * new-reset:: `(new-reset)' * NeXT:: `(NeXT)' * normalization:: `(normalization GEOM-ID {each|none|all|keep})' * not:: `(not EXPR)' * or:: `(or EXPR1 EXPR2)' * pick:: `(pick COORDSYS GEOMID G V E F P VI EI FI)' * pick-invisible:: `(pick-invisible [yes|no])' * pickable:: `(pickable GEOM-ID {yes|no})' * position:: `(position objetoID otherID)' * position-at:: `(position-at objetoID otherID [center | origin])' * position-toward:: `(position-toward objID othID [center|origin])' * process-events:: `(process-events)' * progn:: `(progn DECLARAC,A~O [ ... ])' * quit:: `(quit)' * quote:: `(quote EXPR)' * rawevent:: `(rawevent dev val x y t)' * rawpick:: `(rawpick CAMID X Y)' * read:: `(read geometry|camera|... {GEOM ou CAM ou ...})' * real-id:: `(real-id ID)' * redraw:: `(redraw CAM-ID)' * regtable:: `(regtable)' * rehash-emodule-path:: `(rehash-emodule-path)' * replace-geometry:: `(replace-geometry GEOM-ID PART GEOMETRY)' * rib-display:: `(rib-display [frame|tiff] PREFIXOARQUIVO)' * rib-snapshot:: `(rib-snapshot CAM-ID [nomearquivo])' * scale:: `(scale GEOM-ID FATOR [FATORY FATORZ])' * scene:: `(scene CAM-ID [GEOMETRY])' * set-clock:: `(set-clock TEMPO)' * set-conformal-refine:: `(set-conformal-refine CMX [N [ARESTAS]])' * set-emodule-path:: `(set-emodule-path (PATH1 ... PATHN))' * set-load-path:: `(set-load-path (PATH1 ... PATHN))' * set-motionscale:: `(set-motionscale X)' * setenv:: `(setenv nome string)' * setq:: `(setq SYM EXPR)' * sgi:: `(sgi)' * shell:: `(! COMANDOSHELL)' * sleep-for:: `(sleep-for TEMPO)' * sleep-until:: `(sleep-until TEMPO)' * snapshot:: `(snapshot CAM-ID NOMEDOARQUIVO [FORMATO [TAMANHOX [TAMANHOY]]])' * soft-shader:: `(soft-shader CAM-ID {on|off|toggle})' * space:: `(space {euclidean|hyperbolic|spherical})' * stereowin:: `(stereowin CAM-ID [no|horizontal|...] [gap])' * time-interests:: `(time-interests delta initial prefix [suffix])' * transform:: `(transform objetoID centerID frameID [rotate|...] ...)' * transform-incr:: `(transform-incr objetoID centerID frameID ...)' * transform-set:: `(transform-set objetoID centerID frameID ...)' * truncate:: `(truncate NU'MERO)' * ui-cam-focus:: `(ui-cam-focus {focus-change|mouse-cross})' * ui-center:: `(ui-center ID)' * ui-center-origin:: `(ui-center-origin {origin|bbox-center})' * ui-emotion-program:: `(ui-emotion-program PROGRAMA)' * ui-emotion-run:: `(ui-emotion-run EMODULE)' * ui-freeze:: `(ui-freeze {on|off})' * ui-html-browser:: `(ui-html-browser NAVEGADOR)' * ui-motion:: `(ui-motion {inertia|...} {on|off})' * ui-panel:: `(ui-panel NOMEPAINEL {on|off} [JANELA])' * ui-pdf-viewer:: `(ui-pdf-viewer VISUALIZADOR)' * ui-target:: `(ui-target ID [yes|no])' * uninterest:: `(uninterest (COMANDO [args]))' * update:: `(update [timestep_in_seconds])' * update-draw:: `(update-draw CAM-ID [timestep_in_seconds])' * while:: `(while TESTE CORPO)' * window:: `(janela CAM-ID JANELA)' * winenter:: `(winenter CAM-ID)' * write:: `(write command|geometry|... NOMEDOARQUIVO ...)' * write-comments:: `(write-comments NOMEDOARQUIVO GEOMID PICKPATH)' * write-handle:: `(write-handle PREFIX NOMEDOARQUIVO CABEC,ALHO)' * write-sexpr:: `(write-sexpr NOMEDOARQUIVO OBJETOLISP)' * xform:: `(xform ID TRANSFORM)' * xform-incr:: `(xform-incr ID TRANSFORM)' * xform-set:: `(xform-set ID TRANSFORM)' * zoom:: `(zoom CAM-ID FATOR)' Nota do tradutor: os termos "expressa~o lambda" e "expressa~o S" sa~o especi'ficos da linguagem de programac,a~o Lisp.  File: geomview-pt_BR, Node: shell-shortcut, Next: lt, Prev: GCL Reference, Up: GCL Reference 7.2.1 ! ------- `!' e' um sino^nimo de `shell'. Veja *note shell::.  File: geomview-pt_BR, Node: lt, Next: eq, Prev: shell-shortcut, Up: GCL Reference 7.2.2 < ------- `(< EXPR1 EXPR2)' Retorna t se EXPR1 for menor que EXPR2. EXPR1 e EXPR2 devem ser ou ambas inteiras ou nu'mero em ponto flutuante, ou ambas seque^ncias de caractere.  File: geomview-pt_BR, Node: eq, Next: gt, Prev: lt, Up: GCL Reference 7.2.3 = ------- `(= EXPR1 EXPR2)' Retorna t se EXPR1 for igual a EXPR2. EXPR1 e EXPR2 devem ser ou ambas inteiras ou nu'mero em ponto flutuante, ou ambas seque^ncias de caractere.  File: geomview-pt_BR, Node: gt, Next: mul, Prev: eq, Up: GCL Reference 7.2.4 > ------- `(> EXPR1 EXPR2)' Retorna t se EXPR1 for maior que EXPR2. EXPR1 e EXPR2 devem ser ou ambas inteiras ou nu'mero em ponto flutuante, ou ambas seque^ncias de caractere.  File: geomview-pt_BR, Node: mul, Next: div, Prev: gt, Up: GCL Reference 7.2.5 * ------- `(* EXPR1 EXPR2)' Multiplica EXPR1 por EXPR2 e retorna o resultado.  File: geomview-pt_BR, Node: div, Next: add, Prev: mul, Up: GCL Reference 7.2.6 / ------- `(/ EXPR1 EXPR2)' Divide EXPR1 por EXPR2 e retorna o resultado.  File: geomview-pt_BR, Node: add, Next: sub, Prev: div, Up: GCL Reference 7.2.7 + ------- `(+ EXPR1 EXPR2)' Adiciona EXPR1 a EXPR2 e retorna o resultado.  File: geomview-pt_BR, Node: sub, Next: help-shortcut, Prev: add, Up: GCL Reference 7.2.8 - ------- `(- EXPR1 EXPR2)' Subtrai EXPR2 da EXPR1 e retorna o resultado.  File: geomview-pt_BR, Node: help-shortcut, Next: morehelp-shortcut, Prev: sub, Up: GCL Reference 7.2.9 ? ------- `(? [comando])' Fornece suma'rio de uso em uma linha para `comando'. Comando pode incluir `*'s como caracteres coringa; veja tambe'm *note `(?? ...)': morehelp. Ajuda de comando em uma linha; lista nomes somente se multiplos comandos coincidirem. `?' e' um sino^nimo para *note `(help ...)': help.  File: geomview-pt_BR, Node: morehelp-shortcut, Next: emodule-run-shortcut, Prev: help-shortcut, Up: GCL Reference 7.2.10 ?? --------- `(?? comando)' `comando' pode incluir coringas `*'. Mostra mais informac,a~o que `(? comando)'. `??' e' um sino^nimo para *note `morehelp': morehelp.  File: geomview-pt_BR, Node: emodule-run-shortcut, Next: all, Prev: morehelp-shortcut, Up: GCL Reference 7.2.11 | -------- `|' `|' e'm um sino^nimo para `emodule-run'.  File: geomview-pt_BR, Node: all, Next: and, Prev: emodule-run-shortcut, Up: GCL Reference 7.2.12 all ---------- `(all geometry)' retorna uma lista de nomes de todos os objetos geometry. Use e.g. `(echo (all geometry))' para mostrar tal lista. `(all camera)' retorna uma lista de nomes de todas as ca^meras. `(all emodule defined)' retorna uma lista de todos os mo'dulos externos definidos. `(all emodule running)' retorna uma lista de todos mo'dulos externos em execuc,a~o.  File: geomview-pt_BR, Node: and, Next: ap-override, Prev: all, Up: GCL Reference 7.2.13 and ---------- `(and EXPR1 EXPR2)' Avalia `EXPR1' e `EXPR2' e retorna `t' se ambas retornarem na~o-`nil', de outra forma retorna `nil'.  File: geomview-pt_BR, Node: ap-override, Next: backcolor, Prev: and, Up: GCL Reference 7.2.14 ap-override ------------------ `(ap-override [on|off])' Seleciona se controles de apare^ncia devem sobrescrever ajustres dos pro'prios objetos. Habilitado por padra~o. Sem argumentos, retorna o ajuste atual.  File: geomview-pt_BR, Node: backcolor, Next: background-image, Prev: ap-override, Up: GCL Reference 7.2.15 backcolor ---------------- `(backcolor CAM-ID R G B)' Ajusta a cor de fundo da CAM-ID; R G B sa~o nu'meros entre 0 e 1.  File: geomview-pt_BR, Node: background-image, Next: bbox-color, Prev: backcolor, Up: GCL Reference 7.2.16 background-image ----------------------- `(background-image CAM-ID [NOMEDOARQUIVO])' Use a imagem fornecida como fundo da ca^mera CAM-ID (a qual deve ser uma ca^mera real, na~o pode ser ou `default' ou `allcams'). A imagem e' centralizada na a'rea da janela. Trabalha somente com gra'ficos GL e OpenGL. Use "" como nome de arquivo para remover o fundo. Sem argumentos, retorna o nome da imagem que e' usada atualmente como fundo da janela, ou "". Qualquer tipo de arquivo aceita'vel como textura e' permitido, e.g. .ppm.gz, .sgi, etc.  File: geomview-pt_BR, Node: bbox-color, Next: bbox-draw, Prev: background-image, Up: GCL Reference 7.2.17 bbox-color ----------------- `(bbox-color GEOM-ID R G B)' Ajusta a cor da caixa associada do GEOM-ID; R G B sa~o nu'meros entre 0 e 1.  File: geomview-pt_BR, Node: bbox-draw, Next: camera, Prev: bbox-color, Up: GCL Reference 7.2.18 bbox-draw ---------------- `(bbox-draw GEOM-ID [yes|no])' Diz se a caixa associada do GEOM-ID deve ser desenhada; a escolha padra~o e' `yes' se o segundo argumento for omitido.  File: geomview-pt_BR, Node: camera, Next: camera-draw, Prev: bbox-draw, Up: GCL Reference 7.2.19 camera ------------- `(camera CAM-ID [CAMERA])' Especifica dados para CAM-ID; CAMERA e' uma seque^ncia de caracteres fornecendo uma especificac,a~o de ca^mera OOGL. Se nenhuma CAM-ID de ca^mera existir, essa CAM-ID e' criada; nesse caso, o segundo argumento e' opcional,e se omitido, uma ca^mera padra~o e' usada. *Note `(new-camera ...)': new-camera.  File: geomview-pt_BR, Node: camera-draw, Next: camera-prop, Prev: camera, Up: GCL Reference 7.2.20 camera-draw ------------------ `(camera-draw CAM-ID [yes|no])' Diz se ca^meras devem ou na~o serem desenhadas em CAM-ID; `yes' se omitido.  File: geomview-pt_BR, Node: camera-prop, Next: camera-reset, Prev: camera-draw, Up: GCL Reference 7.2.21 camera-prop ------------------ `(camera-prop { geometry object } [projective])' Especifica o objeto a ser mostrado quando desenhando outras ca^meras. Por padra~o, esse objeto e' desenhado com sua ori'gem na camera, e com a ca^mera olhando adiante do eixo -Z do objeto. Com a palavra chave `projective', a projec,a~o da visa~o da ca^mera e' tambe'm aplicada ao objeto; isso coloca o Z=-1 e o Z=+1 do objeto perto e distante dos planos de corte, com a a'rea de visa~o -1<={X,Y}<=+1. Exemplo: (camera-prop { < cube } projective)  File: geomview-pt_BR, Node: camera-reset, Next: car, Prev: camera-prop, Up: GCL Reference 7.2.22 camera-reset ------------------- `(camera-reset CAM-ID)' Ajusta CAM-ID para seu valor padra~o.  File: geomview-pt_BR, Node: car, Next: cdr, Prev: camera-reset, Up: GCL Reference 7.2.23 car ---------- `(car LISTA)' retorna o primeiro elemento de LISTA.  File: geomview-pt_BR, Node: cdr, Next: clock, Prev: car, Up: GCL Reference 7.2.24 cdr ---------- `(cdr LISTA)' retorna a lista obtida removendo o primeiro elemento de LISTA.  File: geomview-pt_BR, Node: clock, Next: command, Prev: cdr, Up: GCL Reference 7.2.25 clock ------------ `(clock)' Retorna a hora atual, em segundos, como mostrado por esse relo'gio do fluxo. *Note `(set-clock ...)': set-clock. *Note `(sleep-until ...)': sleep-until.  File: geomview-pt_BR, Node: command, Next: cons, Prev: clock, Up: GCL Reference 7.2.26 command -------------- `(command ARQUIVOENTRADA [ARQUIVOSAIDA])' Le^ comandos de ARQUIVOENTRADA; envia respostas correspondentes (e.g. qualquer coisa escrita para nome de arquivo `-') para ARQUIVOSAIDA, stdout por padra~o.  File: geomview-pt_BR, Node: cons, Next: copy, Prev: command, Up: GCL Reference 7.2.27 cons ----------- `(cons EXPR LISTA)' Retorna a lista obtida adicionando EXPR como primeiro elemento da LISTA. Note que o segundo argumento tem de ser uma lista.  File: geomview-pt_BR, Node: copy, Next: cursor-still, Prev: cons, Up: GCL Reference 7.2.28 copy ----------- `(copy [ID] [nome])' Copia um objeto ou ca^mera. Se ID na~o for especificado, esse ID e' assumido como sendo targetgeom. If nome na~o for especificado, esse nome e' assumido como sendo o mesmo nome de ID.  File: geomview-pt_BR, Node: cursor-still, Next: cursor-twitch, Prev: copy, Up: GCL Reference 7.2.29 cursor-still ------------------- `(cursor-still [INT])' Ajusta o nu'mero de microssegundos para os quais o cursor na~o deve mover-se para registrar como fixo. Se INT na~o for especificado, o valor ira' ser ajustado para o valor padra~o.  File: geomview-pt_BR, Node: cursor-twitch, Next: defun, Prev: cursor-still, Up: GCL Reference 7.2.30 cursor-twitch -------------------- `(cursor-twitch [INT])' Ajusta a dista^ncia na qual o cursos na~o deve mover-se (em x ou y) para registrar como fixo. Se INT na~o for especificado, o valor ira' ser ajustado para o valor padra~o.  File: geomview-pt_BR, Node: defun, Next: delete, Prev: cursor-twitch, Up: GCL Reference 7.2.31 defun ------------ `(defun NOME (ARG1 ...) [DOCSTRING] EXPR1 ...)' Define uma chamada expressa~o lambda, isto e': define NOME para avaliar para a expressa~o lambda `(lambda (ARG1 ...) (EXPR1 ...))' quando chamada como uma func,a~o. Tambe'm, instala DOCSTRING como resposta para os comandos `(help NOME)' e `(morehelp NOME)'. Note que DOCSTRING na~o precisa conter a sinopse do comando, essa sinopse e' gerada automaticamente. EXPR1 na~o pode ser uma seque^ncia de caracteres se `DOCSTRING' for omitida; EXPR1 deve ser interpretada como a seque^ncia de caracteres documento. O valor de retorno da `(defun ...)' e' o nome da func,a~o. Func,o~es podem ser recursivas e podem modificar a si mesmas. e' posi'vel redefinir func,o~es internas, nesse caso a definic,a~o antiga esta' ainda disponi'vel so o nome `-builtin-OLDNAME-'. Valores de argumento podem ser alterados por `setq'; a nova associac,a~o e' descartada apo's avaliac,a~o de surrounding`defun'-body. As palavras especiais `&optional' e `&rest' possuem o mesmo significado que a expressa~o lambda anonymous, veja nas refere^ncia adiante. *Note `(lambda ...)': lambda. *Note `(setq ...)': setq. *Note `(let ...)': let.  File: geomview-pt_BR, Node: delete, Next: dice, Prev: defun, Up: GCL Reference 7.2.32 delete ------------- `(delete ID)' Apaga objeto ou ca^mera especificado em ID.  File: geomview-pt_BR, Node: dice, Next: dimension, Prev: delete, Up: GCL Reference 7.2.33 dice ----------- `(dice GEOM-ID N)' Divide qualquer ajustes Bezier dentro de GEOM-ID em malhas de medida NxN; o padra~o para N e' 10. Veja tambe'm o atributo de apare^ncia *note `patchdice': Aparencias, o qual torna esse comando obsoleto.  File: geomview-pt_BR, Node: dimension, Next: dither, Prev: dice, Up: GCL Reference 7.2.34 dimension ---------------- `(dimension [N])' Ajusta ou le^ a dimensa~o do espac,o para visa~o N-dimensional. (Uma vez que ca'lculos forem conclui'dos usando coordenadas homoge^neas, isso significa que matrizes sa~o (N+1)x(N+1).) Sem argumentos, retorna a dimensa~o atual, ou 0 se a visualizac,a~o N-dimensional na~o puder ser habilitada.  File: geomview-pt_BR, Node: dither, Next: draw, Prev: dimension, Up: GCL Reference 7.2.35 dither ------------- `(dither CAM-ID {on|off|toggle})' Alterna entre estremecimento ligado e desligado em CAM-ID.  File: geomview-pt_BR, Node: draw, Next: dump-handles, Prev: dither, Up: GCL Reference 7.2.36 draw ----------- `(draw CAM-ID)' Desenha a visa~o em CAM-ID, se a visa~o precisar ser redesenhada. *Note `(redraw ...)': redraw.  File: geomview-pt_BR, Node: dump-handles, Next: echo, Prev: draw, Up: GCL Reference 7.2.37 dump-handles ------------------- `(dump-handles)' Descarrega a lista dos manipuladores ativos atualmente para a sai'da padra~o. Essa func,a~o e' pensada para uso em depurac,a~o interna somente.  File: geomview-pt_BR, Node: echo, Next: emodule-clear, Prev: dump-handles, Up: GCL Reference 7.2.38 echo ----------- `(echo ...)' Escreve os dados fornecidos para o arquivo especial `-'. Seque^ncias de caracteres sa~o escritas literalmente; expresso~es em lisp sa~o avaliadas e seus valores escritos. Se recebido de um programa externo, `echo' envia para a entrada do programa. De outra forma escreve para a pro'pria sai'da padra~o do Geomview (tipicamente o terminal).  File: geomview-pt_BR, Node: emodule-clear, Next: emodule-define, Prev: echo, Up: GCL Reference 7.2.39 emodule-clear -------------------- `(emodule-clear)' Limpa o navegador de aplicac,a~o do Geomview (mo'dulo externo).  File: geomview-pt_BR, Node: emodule-define, Next: emodule-defined, Prev: emodule-clear, Up: GCL Reference 7.2.40 emodule-define --------------------- `(emodule-define NOME COMANDO-SHELL ...)' Define um mo'dulo externo chamado NOME, o qual enta~o aparece no navegador de mo'dulos externos. A seque^ncia de caracteres COMANDO-SHELL e' um comando shell UNIX que chama o mo'dulo. Veja *note `(emodule-run ...)': emodule-run. para discurssa~o sobre mo'dulos externos.  File: geomview-pt_BR, Node: emodule-defined, Next: emodule-isrunning, Prev: emodule-define, Up: GCL Reference 7.2.41 emodule-defined ---------------------- `(emodule-defined `nomemodulo')' Se o nome do mo'dulo externo for conhecido, retorna o nome do programa chamado quando nomemodulo esta' executando como seque^ncia de caracteres entre aspas duplas; de outra forma retorna nil. `(echo (emodule-defined `nome'))' mostra na tela a seque^ncia de caracteres.  File: geomview-pt_BR, Node: emodule-isrunning, Next: emodule-path, Prev: emodule-defined, Up: GCL Reference 7.2.42 emodule-isrunning ------------------------ `(emodule-isrunning NOME)' Retorna Lt se o mo'dulo externo NOME estiver rodando, ou Lnil se o mo'dulo externo na~o estiver rodando. NOME e' pesquisado nos nomes como eles aparecem no navegador de mo'dulos e nos comandos de shell usados para executar o mo'dulo externo (na~o incluindo os argumentos).  File: geomview-pt_BR, Node: emodule-path, Next: emodule-run, Prev: emodule-isrunning, Up: GCL Reference 7.2.43 emodule-path ------------------- `(emodule-path)' Retorna o caminho de busca atual para mo'dulos externos. Nota: para ver agora o valor retornado por essa func,a~o voce^ deve envolver emodule-path em uma chamada ao comando shell echo: `(echo (emodule-path))'. *Note `(set-emodule-path ...)': set-emodule-path.  File: geomview-pt_BR, Node: emodule-run, Next: emodule-sort, Prev: emodule-path, Up: GCL Reference 7.2.44 emodule-run ------------------ `(emodule-run COMANDO-SHELL ARGS...)' Executa o COMANDO-SHELL fornecido (uma seque^ncia de caracteres contendo um comando shell UNIX) como um mo'dulo externo. A sai'da padra~o do mo'dulo e' interpretado como comandos do geomview; respostas (escrita para nomearquivo `-') sa~o enviadas para a entrada padra~o do mo'dulo. O comando shell e' interpretado por /bin/sh, de forma que redirecionamento de E/S pode ser usada: um programa que pergunta ao usua'rio por entradas a partir do terminal podera' vir a ser executado com: (emodule-run seuprograma <&2) Caso ja' na~o tenha sido ajustada, a varia'vel de ambiente $MACHTYPE e' ajustada para o nome do tipo da ma'quina. Conecc,o~es de entrada e sai'da para o geomview sa~o liberadas automaticamente quando o comando shell encerra. Clicando sobre um prorama que esta' sendo executado na entrada do navegador de mo'dulos envia o sinal SIGHUP ao programa. Para que esse recurso funcione, programas devem evitar executar em segundo plano; os programas usando as bibliotecas FORMS ou GL devem chamar a func,a~o foreground() antes da primeira chamada a FORMS ou winopen(). *Note `(emodule-define ...)': emodule-define. *Note `(emodule-start ...)': emodule-start.  File: geomview-pt_BR, Node: emodule-sort, Next: emodule-start, Prev: emodule-run, Up: GCL Reference 7.2.45 emodule-sort ------------------- `(emodule-sort)' Ordena os mo'dulos alfabe'ticamente no navegador de aplicac,a~o.  File: geomview-pt_BR, Node: emodule-start, Next: emodule-transmit, Prev: emodule-sort, Up: GCL Reference 7.2.46 emodule-start -------------------- `(emodule-start NOME)' Inicia o mo'dulo externo NOME, definido por emodule-define. Equivalente a clicar na entrada correspondente no navegador de mo'dulos.  File: geomview-pt_BR, Node: emodule-transmit, Next: escale, Prev: emodule-start, Up: GCL Reference 7.2.47 emodule-transmit ----------------------- `(emodule-transmit NOME LISTA)' Coloca LISTA na entrada padra~o do mo'dulo externo NOME. NOME e' pesquisado nos nomes dos mo'dulos na forma em que esses nomes aparecem no navegador de Mo'dulos Externos e a seguir nos comandos shell usados para executar os mo'dulos externos. Na~o faz nada se o mo'dulo NOME no~ estiver sendo executado.  File: geomview-pt_BR, Node: escale, Next: eval, Prev: emodule-transmit, Up: GCL Reference 7.2.48 escale ------------- `(escale GEOM-ID FACTOR)' O mesmo que scale mas multiplicado por exp(scale). Obsoleto.  File: geomview-pt_BR, Node: eval, Next: event-keys, Prev: escale, Up: GCL Reference 7.2.49 eval ----------- `(eval EXPR)' Avalia uma expressa~o lisp. Se EXPR e' uma expressa~o-S na~o avaliada como retornado pelo comando `(apo'strofo ...)' enta~o o efeito ira' ser ser como se tivesse chamado a expressa~o sem apo'strofo diretamente. A eval tambe'm torna possi'vel avaliar expresso~es-S construi'das via `car', `cdr' e `cons'. *Note `(car ...)': car. *Note `(cdr ...)': cdr. *Note `(cons ...)': cons.  File: geomview-pt_BR, Node: event-keys, Next: event-mode, Prev: eval, Up: GCL Reference 7.2.50 event-keys ----------------- `(event-keys {on|off})' Alterna entre eventos de teclado on ou off para habilitar/desabilitar teclas de atalho.  File: geomview-pt_BR, Node: event-mode, Next: event-pick, Prev: event-keys, Up: GCL Reference 7.2.51 event-mode ----------------- `(event-mode SEQ_CARAC_MODOS)' Ajusta o modo de um evento do mouse (movimento); SEQ_CARAC_MODOS deve ser um entre as seguintes seque^ncias de caractere: 1. `"[r] Rotate"' 2. `"[t] Translate"' 3. `"[z] Cam Zoom"' 4. `"[s] Geom Scale"' 5. `"[f] Cam Fly"' 6. `"[o] Cam Orbit"' 7. `"[le] Edit Lights"' Ini'cio de nota do tradutor: Alguns termos na~o sa~o de significado ta~o o'bvio. 1. `"[r] Rotate"' Rotac,a~o 2. `"[t] Translate"' Translac,a~o 3. `"[z] Cam Zoom"' Aproximac,a~o ou afastamento de ca^mera 4. `"[s] Geom Scale"' Homotetia 5. `"[f] Cam Fly"' Voo de ca^mera 6. `"[o] Cam Orbit"' Órbita de ca^mera 7. `"[le] Edit Lights"' Editar luzes Fim de nota do tradutor.  File: geomview-pt_BR, Node: event-pick, Next: evert, Prev: event-mode, Up: GCL Reference 7.2.52 event-pick ----------------- `(event-pick {on|off})' Alterna entre selecionar on ou off.  File: geomview-pt_BR, Node: evert, Next: exit, Prev: event-pick, Up: GCL Reference 7.2.53 evert ------------ `(evert GEOM-ID [yes|no])' Ajusta o estado normal de eversa~o (nota do tradutor: ver do outro lado de alguma superfi'cie sobre a direc,a~o do vetor normal a` mesma superfi'cie) de GEOM-ID. Se o segundo argumento for omitido, inverte o estado de eversa~o.  File: geomview-pt_BR, Node: exit, Next: ezoom, Prev: evert, Up: GCL Reference 7.2.54 exit ----------- `(exit)' Encerra o geomview.  File: geomview-pt_BR, Node: ezoom, Next: freeze, Prev: exit, Up: GCL Reference 7.2.55 ezoom ------------ `(ezoom GEOM-ID FATOR)' O mesmo que zoom mas multiplica por exp(zoom). Obsoleto.  File: geomview-pt_BR, Node: freeze, Next: geometry, Prev: ezoom, Up: GCL Reference 7.2.56 freeze ------------- `(freeze CAM-ID)' Congela CAM-ID; desenho nessa janela de camera e' desligado ate' que a imagem dessa ca^mera seja redesenhada com `(redraw CAM-ID)', apo's o redesenho da imagem da ca^mera alterac,o~es na imagem voltam a ser permitidas.  File: geomview-pt_BR, Node: geometry, Next: geomview-version, Prev: freeze, Up: GCL Reference 7.2.57 geometry --------------- `(geometry GEOM-ID [GEOMETRIA])' Especifica a geometria para GEOM-ID. GEOMETRIA e' uma seque^ncia de caracteres fornecendo a especificac,a~o de um objeto geome'trico OOGL. Se nenhum objeto chamado GEOM-ID existir, esse objeto inesistente sera' criado; nesse caso o argumento GEOMETRIA e' opcional, e se omitido, o novo objeto chamado GEOM-ID e' retornado sendo um objeto geome'trico vazio.  File: geomview-pt_BR, Node: geomview-version, Next: hdefine, Prev: geometry, Up: GCL Reference 7.2.58 geomview-version ----------------------- `(geomview-version)' Retorna uma seque^ncia de caracteres representado a versa~o do geomview que esta' executando.  File: geomview-pt_BR, Node: hdefine, Next: hdelete, Prev: geomview-version, Up: GCL Reference 7.2.59 hdefine -------------- `(hdefine `geometria'|`camera'|`janela'|`apare^ncia'|`imagem'|`transformac,a~o'|`ntransform' nome valor)' Ajusta o valor de um manipulador de tipo fornecido. (hdefine ) is generally equivalent to (read { define }) exeto que a atribuic,a~o e' desfeita ao final da execuc,a~o de hdefine, (possivelmente na~o em todos os lugares se dentro de uma declarac,a~o condicional), enquanto oe `read ... define' realiza a atribuic,a~o ta~o rapidamente quanto o texto e' lido. *Note Referencias::. *Note `(read ...)': read. *Note `(hdelete ...)': hdelete.  File: geomview-pt_BR, Node: hdelete, Next: help, Prev: hdefine, Up: GCL Reference 7.2.60 hdelete -------------- `(hdelete [`geometria'|`camera'|`janela'|`apare^ncia'|`imagem'|`transform'|`ntransform'] nome)' Apaga o manipulador fornecido. Note que o manipulador na~o ira' atualmente ser apagado no caso de existir ainda outros objetos fazendo refere^ncia ao manipulador, mas uma vez que os objetos que fazem refere^ncia ao maipulador apagado forem fechados, o manipulador ira' tambe'm ser automaticamente mandado embora. O objeto que faz refere^ncia ao manipulador (se existir algum) ira' somente ser deletado se na~o existirem outras refere^ncias para esse objeto. Se o opcional primeiro argumento for omitido, enta~o o primeiro manipulador que coincidir com NOME ira' ser apagado, independentemente do tipo de objeto ao qual esse manipulador estiver anexado. Na~o e' um erro chamar essa func,a~o com um manipulador inexistente, mas e' uma erro chamar essa func,a~o com o nome de um manipulador na~o global, i.e. um que na~o tenha sido criado por `(hdefine ...)' ou `(read ... { define ...})'. *Note Referencias::. *Note `(read ...)': read. *Note `(hdefine ...)': hdefine.  File: geomview-pt_BR, Node: help, Next: hmodel, Prev: hdelete, Up: GCL Reference 7.2.61 help ----------- `(help [comando])' O comando pode incluir `*'s como caracteres coringa; veja tambe'm *note `(?? ...)': help. Ajuda de comando em uma linha; lista nomes somente se multiplos comandos coincidirem.  File: geomview-pt_BR, Node: hmodel, Next: hsphere-draw, Prev: help, Up: GCL Reference 7.2.62 hmodel ------------- `(hmodel CAMID {virtual|projective|conformal})' Ajusta o modelo usado para mostrar o objeto geome'trico nessa ca^mera. *Note `(space ...)': space.  File: geomview-pt_BR, Node: hsphere-draw, Next: if, Prev: hmodel, Up: GCL Reference 7.2.63 hsphere-draw ------------------- `(hsphere-draw CAMID [yes|no])' Informa se e' para desenhar ou na~o a esfera unita'ria: a esfera no infinito no espac,o hiperbo'lico, e uma esfera de refere^ncia nos espac,os Euclidiano esfe'rico. Se o segundo argumento for omitido, `yes' e' assumido.  File: geomview-pt_BR, Node: if, Next: inhibit-warning, Prev: hsphere-draw, Up: GCL Reference 7.2.64 if --------- `(if TEST EXPR1 [EXPR2])' Avalia TEST; se TEST retornar um valor na~o-nil (nota do tradutor:na~o nulo), retorna o valor de EXPR1. Se TEST retornar nil, retorna o value de EXPR2 se EXPR2 estiver presente, de outra forma retorna nil.  File: geomview-pt_BR, Node: inhibit-warning, Next: input-translator, Prev: if, Up: GCL Reference 7.2.65 inhibit-warning ---------------------- `(inhibit-warning STRING)' Inibe alertas de inibic,a~o do geomview de mostrar uma mensagem de alerta determinada por STRING. Atualmente na~o existe mensgenns de alerta na qual o comando inhibit-warning seja aplicado, de forma que esse comando e' pouco u'til.  File: geomview-pt_BR, Node: input-translator, Next: interest, Prev: inhibit-warning, Up: GCL Reference 7.2.66 input-translator ----------------------- `(input-translator "#prefix_string" "comando-shell")' Define um programa externo de traduc,a~o para tipos especiais de entrada. Quando perguntado se e' para le^ um arquivo especial que comec,a com a seque^ncia de caracteres especificada, geomview chama comando-shell com entrada padra~o obtida a partir do arquivo especificado. E' esperado que comando-shell emita dados geome'tricos na linguagem OOGL para sua sai'da padra~o. Nessa implementac,a~o, somente prefixos iniciando com # sa~o reconhecidos. Muito u'til em situac,o~es como (input-translator "#VRML" "vrml2oogl")  File: geomview-pt_BR, Node: interest, Next: lambda, Prev: input-translator, Up: GCL Reference 7.2.67 interest --------------- `(interest (COMANDO [args]))' Permite a voce^ expressar interesse em um comando. Quando geomview vier a executar o comando de interesse futuramente o comando de interesse sera' ecoado para o sistema de comunicac,a~o do qual o comando interest for origina'rio. COMANDO pode ser qualquer comando. Args especifica restric,o~es sobre os valores dos argumentos; se args estiver presente no comando interest, geomview ira' somente ecoar chamadas para o comando no qual os argumentos coincidirem com aquele fornecido no comando interest. Dois valores especiais de argumento podem aparecer na lista de argumentos. `*' que coincide com qualquer valor. `nil' que coincide com qualquer valor mas suprime o retorno daquele valor; seus valores sa~o reportados como `nil'. O propo'sito do comando interest e' permitir a mo'dulos externos encontrar coisas acontecendo dentro do geomview. Por exemplo, um mo'dulo interessado em saber quando um geom chamado `foo' e' apagado pode usar o comando interest da seguinte forma `(interest (delete foo))' e iria receber a seque^ncia de caracteres `(delete foo)' quando foo fosse apagado. Destacando um caso especial do uso do comando interest. Para a maioria dos mo'dulos interessados em selecionar eventos o comando `(interest (pick world))' e' suficiente. O comando `(interest (pick world))' faz com que geomview envie uma seque^ncia de caracteres da forma `(pick world ...)' toda vez que um evento de selec,a~o (duplo clique bota~o direito do mounse). Veja o comando *note `(pick ...)': pick. para detalhes.  File: geomview-pt_BR, Node: lambda, Next: let, Prev: interest, Up: GCL Reference 7.2.68 lambda ------------- `(lambda (ARG1 ...) EXPR1 ... EXPRN)' Uma expressa~o lambda e' como uma func,a~o. Para "chamar" uma expressa~o lambda, a expressa~o lambda tem de ser chamada como uma func,a~o: `((lambda (arg) (+ 1 arg)) 2)'. Nesse exemplo, o valor completo da expressa~o deve ser 3. Em geral, o valor da chamada ira' ser o valor de EXPRN. A primeira lista serve para definir os para^metros formais. A expressa~o lambda propriamente dita e' apenas uma lista, iniciando-se com a palavra chava lambda, seguida por muitas listas entre aspas duplas. *Note `(defun ...)': defun. *Note `(setq ...)': setq. *Note `(let ...)': let. Note que a lista argumento pode conter as palavras chaves especiais `&optional' fornecimento de valores aos identificadores seguintes e' opcional, seus valores padra~o ira~o ser `nil' `&rest' todos os argumentos excedentes ira~o ser coletados em uma lista, e essa lista ira' ser atribui'da ao argumento seginte, da seguinte forma: ((lambda (&rest rest) (echo rest)) a b c d) A sai'da ira' ser `(a b c d)'.  File: geomview-pt_BR, Node: let, Next: lines-closer, Prev: lambda, Up: GCL Reference 7.2.69 let ---------- `(let ARGUMENTS EXPR1 ... EXPRN)' Gera uma expressa~o lambda a partir de EXRP1 ... EXPRN, com a associac,a~o de argumento descrita por ARGUMENTS. ARGUMENTS corresponde a uma lista de si'mbolos (associada a `nil' por padra~o) ou a listas da forma `(ARG VALUE)' onde ARG e' um si'mbolo e na~o avaliado e VALUE e' uma expressa~o-S que e' primeiramente avaliada, a seguir seu valor e' associa a ARG. A expressa~o completa avalia para o valor de EXPRN, a u'ltima expressa~o no corpo da declarac,a~o. A lista de argumento deve ester presente, mas pode ser vazia; no u'ltimo caso a declarac,a~o `(let () ...)' e' equivalente a um `(progn ...)'. *Note `(lambda ...)': lambda. *Note `(defun ...)': defun. *Note `(setq ...)': setq.  File: geomview-pt_BR, Node: lines-closer, Next: load, Prev: let, Up: GCL Reference 7.2.70 lines-closer ------------------- `(lines-closer CAM-ID DIST)' Desenha linhas (incluindo arestas) pro'ximo a` ca^mera do poli'gonos a uma dista^ncia DIST / 10^5 do intervalo contido na a'rea de armazenamento tempora'rio de memo'ria que controla as coordenadas do eixo Z. DIST = 3.0 por padra~o. Se DIST for muito pequena, uma linha aproxumada sobre uma superfi'cie pode ser pontilhada ou invisi'vel, dependendo do ponto de vista. Se DIST for muito grande, linhas podem aparecer em frente das superfi'cies que elas atualmente aproximam por tra's. Bons valores para DIST variam com a cena, ponto de visa~o, e dista^ncias entre planos de corte pro'ximo e distante. Esse recurso e' um remendo, mas pode ser de grande ajuda.  File: geomview-pt_BR, Node: load, Next: load-path, Prev: lines-closer, Up: GCL Reference 7.2.71 load ----------- `(load filename [command|geometry|camera])' Chama o arquivo fornecido dentro do geomview. O segundo argumento opcional especifica o tipo de dado que o referido arquivo chamado conte'm, o qual pode ser ou `command' (comandos do geomview), `geometry' (dados geome'trico no formato OOGL), ou `camera' (definic,a~o de ca^mera no formato OOGL). se omitido, e' tentado deduzir o tipo de conteu'do do arquivo. Carregando dados geome'tricos cria um novo objeto visi'vel; carregando uma ca^mera abre uma nova janela; chamado um arquivo contendo comando executa o referido comando.  File: geomview-pt_BR, Node: load-path, Next: look, Prev: load, Up: GCL Reference 7.2.72 load-path ---------------- `(load-path)' Retorna o atual caminho de busca para arquivos contendo comandos, objetos geome'tricos, etc. Nota: para ver o atual valor retornado por essa func,a~o voce^ deve empacotar esse comando em uma chamada a echo: `(echo (load-path))'. *Note `(set-load-path ...)': set-load-path.  File: geomview-pt_BR, Node: look, Next: look-encompass, Prev: load-path, Up: GCL Reference 7.2.73 look ----------- `(look [objetoID] [cameraID])' Rotaciona a referida ca^mera - cameraID - de forma que aponte em direc,a~o ao centro da caixa associada ao referido objeto - objetoID (ou a origem nos espac,os hiperbolico ou esfe'rico). No espac,o Eucidiano, move a ca^mera para ale'm ou para tra's ate' que o objeto aparec,a ta~o grande quanto possi'vel enquanto sendo inteiramente visi'vel. Equivalente a progn ( (look-toward [objetoID] [cameraID] {center | origin}) [(look-encompass [objetoID] [cameraID])] ) Se objetoID na~o for especificado, esse objeto a' assumido como sendo o objeto mundo. Se cameraID na~o for especificado, essa ca^mera e' assumido como sendo a targetcam.  File: geomview-pt_BR, Node: look-encompass, Next: look-encompass-size, Prev: look, Up: GCL Reference 7.2.74 look-encompass --------------------- `(look-encompass [objetoID] [cameraID])' Move cameraID para tra's ou para adiante ate' que seu campo de visa~o alcance objetoID. Essa rotina trabalha somente no espac,o Euclidiano. Se objetoID na~o for especificado, esse objeto a' assumido como sendo o objeto mundo. Se cameraID na~o for especificado, essa ca^mera e' assumido como sendo a targetcam. *Note `(look-encompass-size ...)': look-encompass-size.  File: geomview-pt_BR, Node: look-encompass-size, Next: look-recenter, Prev: look-encompass, Up: GCL Reference 7.2.75 look-encompass-size -------------------------- `(look-encompass-size [ver-frac,a~o raza~o-corte margem-proxima margem-distante])' Ajusta/retorna para^metros usados por (look-encompass). ver-frac,a~o e' a porc,a~o da janela de ca^mera preenchida pelo objeto, raza~o-corte e' a raza~o ma'xima permitida entre os planos de corte pro'ximo e afastado. O plano de corte pro'ximo e' 1/magem-proxima vezes mais perto que a aresta mais pro'xima do objeto, e o plano de corte distante e' margem-distante vezes mais adiante. Retorna a lista dos valores atuais. Valores padronizados: .75 100 0.1 4.0  File: geomview-pt_BR, Node: look-recenter, Next: look-toward, Prev: look-encompass-size, Up: GCL Reference 7.2.76 look-recenter -------------------- `(look-recenter [objetoID] [cameraID])' Translada e rotaciona a ca^mera de forma que essa ca^mera esteja olhando na direc,a~o-z (no sistema de coordenadas de objetoID) no centro da caixa associada a objetoID (ou a origem do sistema de coordenadas no espac,o na~o Euclidiano). No espac,o Euclidiano, a ca^mera e' tambe'm movida para ta~o perto quanto possi'vel do objeto de forma a permitir que o objeto seja inteiramente visi'vel. Tambe'm garante que o eixos y do objetoID e de cameraID sejam paralelos.  File: geomview-pt_BR, Node: look-toward, Next: merge, Prev: look-recenter, Up: GCL Reference 7.2.77 look-toward ------------------ `(look-toward [objetoID] [cameraID] [origin | center])' Rotaciona a ca^mera especificada de forma a apontar para adiante da ori'gem do sistema de coordenadas do objeto, ou do centro da caixa associada ao objeto (no espac,o na~o Euclidiano, a ori'gem ira' ser usada automaticamente). O objetoID padra~o e' o objeto mundo, a ca^mera padra~o e' targetcam, a localizac,a~o padra~o e' para a qual e' apontada a ca^mera e' adiante do centro da caixa associada a objetoID.  File: geomview-pt_BR, Node: merge, Next: merge-ap, Prev: look-toward, Up: GCL Reference 7.2.78 merge ------------ `(merge {window|camera} CAM-ID { WINDOW ou CAMERA ... })' Modifica a janela ou a ca^mera fornecido, mudando apenas a propriedade especificada no u'ltimo argumento. E.g. (merge camera `Camera' { far 20 }) ajusta o plano de corte afastado para 20 permanecendo os outros atributos inalterados.  File: geomview-pt_BR, Node: merge-ap, Next: merge-base-ap, Prev: merge, Up: GCL Reference 7.2.79 merge-ap --------------- `(merge-ap GEOM-ID APARE^NCIA)' Mescla em algumas caracteri'sticas de apare^ncia para GEOM-ID. Para^metros de apare^ncia incluem cor de linha e de superfi'cie, estilo de sombreamento, espec,ura de linha, e iluminac,a~o.  File: geomview-pt_BR, Node: merge-base-ap, Next: merge-baseap, Prev: merge-ap, Up: GCL Reference 7.2.80 merge-base-ap -------------------- `(merge-base-ap APARE^NCIA)' `merge-base-ap' e' um sino^nimo para *note `merge-baseap': merge-baseap.  File: geomview-pt_BR, Node: merge-baseap, Next: mod, Prev: merge-base-ap, Up: GCL Reference 7.2.81 merge-baseap ------------------- `(merge-baseap APARE^NCIA)' Mescla em algumas caracteri'sticas de apare^ncia para a base pada~o de apare^ncia (aplicada a todo geom antes de sua pro'pria apare^ncia). Iluminac,a~o esta' tipicamente inclui'da na base de apare^ncia.  File: geomview-pt_BR, Node: mod, Next: morehelp, Prev: merge-baseap, Up: GCL Reference 7.2.82 mod ---------- `(mod EXPR1 EXPR2)' Divide EXPR1 por EXPR2 e retorna o resto.  File: geomview-pt_BR, Node: morehelp, Next: name-object, Prev: mod, Up: GCL Reference 7.2.83 morehelp --------------- `(morehelp comando)' `comando' pode incluir coringas `*'. Mostra na tela mais informac,a~o que *note `(help command)': help.  File: geomview-pt_BR, Node: name-object, Next: ND-axes, Prev: morehelp, Up: GCL Reference 7.2.84 name-object ------------------ `(name-object ID NOME)' Atribui um novo NOME (uma seque^ncia de caracteres) a ID. Um nu'mero e' adicionado no final se NOME ja' estiver sendo usado (por exemplo, `foo' -> `foo<2>'). O novo nome, possivelmente com nu'mero anexado no final, pode ser usado como id de objeto posteriormente.  File: geomview-pt_BR, Node: ND-axes, Next: ND-color, Prev: name-object, Up: GCL Reference 7.2.85 ND-axes -------------- `(ND-axes CAMID [NOMEGRUPO [Xindex Yindex Zindex [Windex]]])' No nosso modelo para visualizac,a~o N-Dimensional (habilitado por (dimension)), objetos no espac,o N-dimensional sa~o visualizados por N-dimensional _grupos de ca^mera_. Cada janela real de ca^mera pertence a algum grupo de ca^meras, e mostra & manipula um subspac,o projetado eixo-alinhado 3-D do espac,o N-dimensional visto pelo seu grupo. Movendo uma ca^mera em um grupo afeta todos os outros membros do grupo. O comando ND-axes configura tudo isso. O comando ND-axes especifica uma associac,a~o de ca^mera a um grupo, e o ajuste dos eixos do espac,o N-dimensional os quais tornam-se os eixos X, Y, e Z da ca^mera. Eixos sa~o especificados por seus i'ndices, de 1 a N para um espac,o N-dimensional. O grupo NOMEGRUPO e' implicitamente criado se na~o for previamente conhecido. Em princi'pio e' possi'vel mapear a componente homoge^nea de uma conformac,a~o de 4 pontos para algum outro i'ndice; isso poderia ser realizado especificando 0 para um dos `Xindex', `Yindex' ou `Zindex' e fornecendo a `Windex' algum valor positivo. Isso provavelmente na~o e' u'til pelo fato de Geomview na~o suportar geometria na~o-Euclidianas para dimenso~es mais altas. Para ler uma configurac,a~o de ca^meras, use `(echo (ND-axes CAMID))'. O valor de retorno e' uma vetor fixo de 4 inteiros, o u'ltimo dos quais deve ser 0.  File: geomview-pt_BR, Node: ND-color, Next: ND-xform, Prev: ND-axes, Up: GCL Reference 7.2.86 ND-color --------------- `(ND-color CAMID' [ (( [ID] (x1 x2 ... xN) v r g b a v r g b a ... ) ((x1 ... xN) v r g b a v r g b a ...) ...)] ) Especifica uma func,a~o, aplicada a cada ve'rtice N-dimencional, o qual determina as cores dos objetos N-dimensionais como mostrado na ca^mera CAMID. Cada func,a~o de cor e' definida por um vetor (no sistema de coordenadas do objeto geome'trico ID) [x1 ... xN] e por uma seque^ncia de qui'ntuplas valor (v)/cor(r g b a), ordenados por ordem crescente de v. O produto interno v = P.[x] e' linearmente interpolado nessa tabela para fornecer uma cor. Se ID for omitido, o vetor (xi) e' assumido em coordenadas de universo. O comando ND-color especifica uma lista de tais func,o~es; cada ve'rtice e' colorido por seu somato'rio (enta~o e.g. intensidade verde pode indicar projec,a~o ao longo de um eixoenquanto vermelho indica outro eixo. Uma lista vazia, como em (ND-color CAMID ()), suprime o colorido. Sem segundo argumento, (ND-color CAMID) retorna a lista de cor-func,a~o de colorac,a~o. Mesmo quando colorac,a~o esta' habilitada, objetos acompanhados com o atributo de apare^ncia `keepcolor' sa~o mostrados em suas cores naturais.  File: geomview-pt_BR, Node: ND-xform, Next: ND-xform-get, Prev: ND-color, Up: GCL Reference 7.2.87 ND-xform --------------- `(ND-xform OBJID [ntransform { idim odim ... }])' Concatena a fornecida transformac,a~o-ND com a atual transformac,a~o-ND do objeto (aplica a transformac,a~o-ND para objeto ID, como oposic,ao~ a simplesmente ajustar sua transformac,a~o-ND). Note que ND-transforms possuem suas coordenadas homoge^neas iniciando-se no i'ndice 0, enquanto transformac,o~es 3D possuem seu ini'cio no i'ndice 3.  File: geomview-pt_BR, Node: ND-xform-get, Next: ND-xform-set, Prev: ND-xform, Up: GCL Reference 7.2.88 ND-xform-get ------------------- `(ND-xform-get ID [from-ID])' Retorna a transformac,a~o N-D do objeto fornecido no sistema de coordenadas do from-ID (o padra~o e' `universe'), no sentido * Transform = . Note que ND-transforms possuem suas coordenadas homoge^neas iniciando-se no i'ndice 0, enquanto transformac,o~es 3D possuem seu ini'cio no i'ndice 3.  File: geomview-pt_BR, Node: ND-xform-set, Next: new-alien, Prev: ND-xform-get, Up: GCL Reference 7.2.89 ND-xform-set ------------------- `(ND-xform-set OBJID [ntransform { idim odim ... }])' Ajusta a transformac,a~o N-D do objeto fornecido. Na dimensa~o N, a transformac,a~o e' uma matriz (N+1)x(N+1), de forma que naquele caso idim e odim sa~o esperados serem ambos iguais a (N+1). Note que todas as ca^meras em um camera-grupo possuem a mesma transformac,a~o N-D. Note que ND-transforms possuem suas coordenadas homoge^neas iniciando-se no i'ndice 0, enquanto transformac,o~es 3D possuem seu ini'cio no i'ndice 3.  File: geomview-pt_BR, Node: new-alien, Next: new-camera, Prev: ND-xform-set, Up: GCL Reference 7.2.90 new-alien ---------------- `(new-alien name [GEOMETRIA])' Cria um novo alien (objeto geome'trico fora de "objeto mundo") com o nome fornecido (uma seque^ncia de caracteres). GEOMETRIA e' uma seque^ncia de caracteres fornecendo um especificac,a~o de objeto geome'trico OOGL. Se GEOMETRIA for omitido, o novo alien e' fornecido como sendo um objeto geome'trico vazio. Se um objeto como o nome fornecido ja' existir, ao novo alien e' dado um novo nome. Os feixes luminosos que sa~o usados para mover em volta das luzes sa~o um exemplo de aliens. Eles sa~o desenhados mas na~o controla'veis pelo caminho normal que os objetos comuns sa~o: eles na~o aparecem no navegador de objetos e o usua'rio na~o pode move^-lo com o modo de movimento normal.  File: geomview-pt_BR, Node: new-camera, Next: new-center, Prev: new-alien, Up: GCL Reference 7.2.91 new-camera ----------------- `(new-camera name [CAMERA])' Cria uma nova ca^mera com o nome fornecido (uma seque^ncia de caracteres). Se uma ca^mera com o nome fornecido ja' existir, ao novo objeto e' fornecido um nome u'nico. Se CAMERA for omitido uma ca^mera padra~o e' usada.  File: geomview-pt_BR, Node: new-center, Next: new-geometry, Prev: new-camera, Up: GCL Reference 7.2.92 new-center ----------------- `(new-center [id])' Cessa o movimento de id, a seguir ajusta a transformac,a~o de id para a identidade. O id padra~o e' target. Tambe'm, se o id for uma ca^mera, chama (look-recenter World id). A func,a~o principal da chamada a (look-recenter) e' colocar a ca^mera de forma que esteja apontando paralelamente ao eixo z na direc,a~o do centro do objeto mundo.  File: geomview-pt_BR, Node: new-geometry, Next: new-reset, Prev: new-center, Up: GCL Reference 7.2.93 new-geometry ------------------- `(new-geometry name [GEOMETRY])' Cria um novo geom com o nome fornecido (uma seque^ncia de caracteres). GEOMETRY e' uma seque^ncia de caracteres fornecendo a especificac,a~o de um objeto geome'trico OOGL. Se GEOMETRY for omitido, o novo objeto e' fornecido como sendo um objeto geome'trico vazio. Se um objeto com o nome fornecido ja' existir, ao novo objeto e' fornecido um nome u'nico.  File: geomview-pt_BR, Node: new-reset, Next: NeXT, Prev: new-geometry, Up: GCL Reference 7.2.94 new-reset ---------------- `(new-reset)' Equivalente a `(progn (new-center ALLGEOMS)(new-center ALLCAMS))'.  File: geomview-pt_BR, Node: NeXT, Next: normalization, Prev: new-reset, Up: GCL Reference 7.2.95 NeXT ----------- `(NeXT)' Retorna `t' se executando sobre um NeXT, `nil' se na~o estiver rodando sobre um NeXT. Uma reli'quia de do ano da estac,a~o de trabalho NeXT.  File: geomview-pt_BR, Node: normalization, Next: not, Prev: NeXT, Up: GCL Reference 7.2.96 normalization -------------------- `(normalization GEOM-ID {each|none|all|keep})' Ajusta a situac,a~o atual da normalizac,a~o de GEOM-ID. `none' suprime toda normalizac,a~o. `each' normaliza a caixa associada ao objeto para ajustar-se dentro da esfera unita'ria, com o centro de sua caixa associada transladado para a ori'gem. A caixa e' alterada proprocionalmente de forma que sua diagonal maior, sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), seja 2. `all' assemelha-se a `each', exceto quando um objeto esta' mudando (e.g. quando seu objeto geome'trico esta' sendo modificado por um programa externo). Enta~o, `each' precisamente ajusta a caixa associada em torno do objeto quando esse objeto muda e faz as normalizac,o~es de acordo com as mudanc,as, enquanto `all' normaliza a unia~o de todas as variantes do objeto e normaliza conforme essa unia~o. `keep' mante'm a transformac,a~o de normalizac,a~o atual intocada quando o objeto muda. Essa intocabilidade pode ser u'til para aplicar a normalizac,a~o `each' ou `all' a` primeira versa~o de um ojeto que esta' mudando de forma a trazer esse objeto para o campo de visa~o, a seguir alternar para `keep'.  File: geomview-pt_BR, Node: not, Next: or, Prev: normalization, Up: GCL Reference 7.2.97 not ---------- `(not EXPR)' Avalia `EXPR'; se `EXPR' retornar um valor na~o-`nil', o valor de retorno do comando e' nil, se `EXPR' retornar `nil', o valor de retorno do comando e' `t'.  File: geomview-pt_BR, Node: or, Next: pick, Prev: not, Up: GCL Reference 7.2.98 or --------- `(or EXPR1 EXPR2)' Avalia `EXPR1'; se `EXPR1' retorna na~o-`nil', o valor de retorno do comando e' o valor de `EXPR1', se `EXPR1' retornar `nil', a `EXPR2' e' avaliada e o valor de `EXPR2' e' retornado.  File: geomview-pt_BR, Node: pick, Next: pick-invisible, Prev: or, Up: GCL Reference 7.2.99 pick ----------- `(pick COORDSYS GEOMID G V E F P VI EI FI)' O comando pick e' executado internamente em resposta a eventos de selec,a~o (clique duplo no bota~o direito do mouse). COORDSYS = sistema de coordenadas no qual as coordenadas dos seguintes argumentos sa~o especificados. Esse sistema de coordenadas pode ser: `world' sistema de coordenadas do objeto mundo `self' sistema de coordenadas do geom (GEOMID) selecionado `primitive' sistema de coordenadas do primitivo atual dentro do geom selecionado onde a selec,a~o ocorreu. GEOMID = id do geom selecionado G = ponto selecionado (intersecc,a~o atual do raio selecionado com o objeto) V = ve'rtice selecionado, se houver algum E = aresta selecionada, se houver alguma F = face selecionada P = camainho para o primitivo selecionado [0 ou mais] VI = i'ndice do ve'rtice selecionado no primitivo EI = lista de i'ndices de extremidades da aresta selecionada, se houver alguma FI = i'ndice da face selecionada Mo'dulos externos podem receber informac,o~es de eventos de selec,a~o por meio do registro do interesse em chamadas a `pick' por meio do comando `interest'. No contexto de visualizac,o~es de va'rias dimenso~es as coordenadas sa~o atualmente pontos de va'rias dimenso~es. Eles correspondem a pontos tridimencionais da selec,a~o relativa ao subespac,o definido pela janela de visualizac,a~o da ca^mera onde a selec,a~o ocorreu. As coordenadas sa~o enta~o preenchidas com zeros e transformadas de volta para o sistema de coordenadas definido por COORDSYS.  File: geomview-pt_BR, Node: pick-invisible, Next: pickable, Prev: pick, Up: GCL Reference 7.2.100 pick-invisible ---------------------- `(pick-invisible [yes|no])' Escolhe se selec,o~es devem ser sensi'veis a objetos cuja apare^ncia faz com que fiquem invisi'veis; o padra~o e' yes. Sem argumentos, retorna a situac,a~o/valor atual.  File: geomview-pt_BR, Node: pickable, Next: position, Prev: pick-invisible, Up: GCL Reference 7.2.101 pickable ---------------- `(pickable GEOM-ID {yes|no})' Informa se GEOM-ID esta' inclui'do ou na~o no conjunto de objetos que podem ser retornados a partir do comando pick.  File: geomview-pt_BR, Node: position, Next: position-at, Prev: pickable, Up: GCL Reference 7.2.102 position ---------------- `(position objetoID outroID)' Ajusta a transformac,a~o de objetoID para aquele de outroID.  File: geomview-pt_BR, Node: position-at, Next: position-toward, Prev: position, Up: GCL Reference 7.2.103 position-at ------------------- `(position-at objetoID outroID [center | origin])' Faz a translac,a~o de objetoID para o centro da caixa associada ou para a ori'gem do sistema de coordenadas de outroID (translac,a~o paralela). O padra~o e' center.  File: geomview-pt_BR, Node: position-toward, Next: process-events, Prev: position-at, Up: GCL Reference 7.2.104 position-toward ----------------------- `(position-toward objetoID outroID [center | origin])' Rotaciona objetoID de forma que o centro da caixa associada ou a ori'gem do sistema de coordenadas do outroID localize-se sobre a parte positiva do eixo z do primeiro objeto. O padra~o e' o centro da caixa associada.  File: geomview-pt_BR, Node: process-events, Next: progn, Prev: position-toward, Up: GCL Reference 7.2.105 process-events ---------------------- `(process-events)' Devolve o controle ao lac,o do evento do Geomview, enta~o continua avaliando o comando do script atual. Se o fluxo atual de entrada tiver sido colocado para cochilar por um dos comandos `(sleep-...)', enta~o o controle permanece no lac,o principal ate' que a "cochilada" do fluxo de entrada atual tenha terminado. *Note `(sleep-until ...)': sleep-until. *Note `(sleep-for ...)': sleep-for.  File: geomview-pt_BR, Node: progn, Next: quit, Prev: process-events, Up: GCL Reference 7.2.106 progn ------------- `(progn DECLARAC,A~O [ ... ])' evaluates each DECLARAC,A~O in order and retorna o value do last one. Use progn to group a collection of commands together, forcing them to be treated as a single command.  File: geomview-pt_BR, Node: quit, Next: quote, Prev: progn, Up: GCL Reference 7.2.107 quit ------------ `(quit)' `quit' is a synonym for *note `exit': exit.  File: geomview-pt_BR, Node: quote, Next: rawevent, Prev: quit, Up: GCL Reference 7.2.108 quote ------------- `(quote EXPR)' retorna uma expressa~o simbo'lica em lisp EXPR sem avalia'-la. Note, todavia, que `quote' analisa EXPR como se ela pudesse ser avaliada. *Note `(eval ...)': eval.  File: geomview-pt_BR, Node: rawevent, Next: rawpick, Prev: quote, Up: GCL Reference 7.2.109 rawevent ---------------- `(rawevent dev val x y t)' Coloca o evento de linha especificado em uma fila de eventos. Os argumento especificam diretamente os membros da estrutura do evento usada internamente pelo geomview. Esse e' o manipulador de evento de mais baixo ni'vel e na~o foi pensado para uso geral.  File: geomview-pt_BR, Node: rawpick, Next: read, Prev: rawevent, Up: GCL Reference 7.2.110 rawpick --------------- `(rawpick CAMID X Y)' Process a pick event in camera CAMID at location (X,Y) given in integer pixel coordenadas. This is a low-level procedure not intended for external use.  File: geomview-pt_BR, Node: read, Next: real-id, Prev: rawpick, Up: GCL Reference 7.2.111 read ------------ `(read {geometry|camera|apare^ncia|image|ntransform|transform|command} {GEOMETRY ou CAMERA ou ...})' Le^ e interpreta o texto em ... como contendo o tipo de dado fornecido. U'til para definir objetos usando a sintaxe de refere^ncia OOGL, e.g. (geometry thing { INST transform : T geom : fred }) (read geometry { define fred QUAD 1 0 0 0 1 0 0 0 1 1 0 0 }) (read transform { define T . Se na~o for especificado um nomearquivo, veja *note `(rib-display ...': rib-display. para uma explanac,a~o do nomearquivo usado.  File: geomview-pt_BR, Node: scale, Next: scene, Prev: rib-snapshot, Up: GCL Reference 7.2.119 scale ------------- `(scale GEOM-ID FATOR [FATORY FATORZ])' Ajusta proporcionalmente GEOM-ID, multiplicando seu tamanho por FATOR. Os fatores devem ser nu'meros positivos. Se FATORY e FATORZ estiverem presentes e forem na~o nulos, o objeto e' ajustado proporcionalmente por FATOR na direc,a~o x, por FATORY na direc,a~o y, e por FATORZ na direc,a~o z. Se somente FATOR estiver presente, o objeto e' justado proporcionalmente por FACTOR nas tre^s direc,o~es x, y, e z. Ajustes proporcionais somente fazem sentido realmente no espac,o de Euclides. Ajustes proporcionais usando o mouse nos outros espac,o na~o e' permitido; o comando scale pode ser emitido em outros espac,os mas deve ser usado com cuidado pelo fato de poder fazer com que dados extendam-se para ale'm dos limites do espac,o.  File: geomview-pt_BR, Node: scene, Next: set-clock, Prev: scale, Up: GCL Reference 7.2.120 scene ------------- `(scene CAM-ID [GEOMETRY])' Make CAM-ID look at GEOMETRY instead of at the universe.  File: geomview-pt_BR, Node: set-clock, Next: set-conformal-refine, Prev: scene, Up: GCL Reference 7.2.121 set-clock ----------------- `(set-clock TIME)' Ajusta o relo'gio para esse fluxo de comando para ler TIME (em segundos) a partir do momento que o comando e' recebido. *Note `(sleep-until ...)': sleep-until. *Note `(clock ...)': clock.  File: geomview-pt_BR, Node: set-conformal-refine, Next: set-emodule-path, Prev: set-clock, Up: GCL Reference 7.2.122 set-conformal-refine ---------------------------- `(set-conformal-refine CMX [N [SHOWEDGES]])' Ajusta os para^metros para o algori'tmos de refinamento usado no desenho no modelo conformacional. CMX e' o cosseno do maior a^ngulo e arestas podem entortar antes de serem refinadas. Seus valores devem estar entre -1 e 1; o padra~o e' 0.95; deminuindo seu valor ira' fazer causar menos refinamento. N e' o nu'meo ma'ximo de iterac,o~es de refinamento; o padra~o e' 6. SHOWEDGES, que pode ser `no' ou `yes', determina se arestas interiores no refinamento sa~o desenhadas.  File: geomview-pt_BR, Node: set-emodule-path, Next: set-load-path, Prev: set-conformal-refine, Up: GCL Reference 7.2.123 set-emodule-path ------------------------ `(set-emodule-path (PATH1 ... PATHN))' Ajusta o caminho de busca por mo'dulos externos. Os PATHi devem ser nomes de caminho de direto'rios contendo, para cada mo'dulo, o arquivo executa'vel do mo'dulo e um arquivo .geomview- que conte'm um comando (emodule-define ...) para aquele mo'dulo. Esse comando implicitamente chama (rehash-emodule-path) para reconstruir o navegador de aplicac,o~es a partir do novo caminho ajustado. O nome especial de direto'rio `+' e' substitui'do pelo caminho atual, enta~o e.g. (set-emodule-path (meudir +)) anexa meudir no ini'cio do caminho.  File: geomview-pt_BR, Node: set-load-path, Next: set-motionscale, Prev: set-emodule-path, Up: GCL Reference 7.2.124 set-load-path --------------------- `(set-load-path (PATH1 ... PATHN))' Ajusta o caminho de busca para comando, objeto geome'trico, arquivos, etc. Os PATHi sa~o seque^ncias de caracteres fornecendo os nomesmde caminho de direto'rios a serem buscados. O nome especial de direto'rios `+' e' substitui'do pelo caminho atual, enta~o e.g. (set-load-path (meudir +)) anexa meudir no ini'cio do caminho.  File: geomview-pt_BR, Node: set-motionscale, Next: setenv, Prev: set-load-path, Up: GCL Reference 7.2.125 set-motionscale ----------------------- `(set-motionscale X)' Ajusta o fator de proporcionalidade do movimento para X (o valor padra~o e' 0.5). Esses comandos ajustam proporcionalmente seu movimento por uma quantidade que depende da dista^ncia do quadro ao centro e do tamanho do quadro. Especificamente, ele ajusta de forma proporcional dist + scaleof(frame) * motionscale onde dist e' a dita^ncia a partir do centro ao quadro e motionscale e' o fator de ajuste proporcional do movimento ajustado por essa func,a~o. Scaleof(frame) mede o tamanho do objeto frame.  File: geomview-pt_BR, Node: setenv, Next: setq, Prev: set-motionscale, Up: GCL Reference 7.2.126 setenv -------------- `(setenv nome string)' ajusta a varia'vel de ambiente `nome' para o valor STRING; o nome e' visi'vel para o geomview (como em nomes de caminho contendo `$nome') e para processos cria-se, e.g. mo'dulos externos.  File: geomview-pt_BR, Node: setq, Next: sgi, Prev: setenv, Up: GCL Reference 7.2.127 setq ------------ `(setq SYM EXPR)' Bind the symbold SYM to the value of EXPR. SYM must be an unqualified symbol, i.e. not aspas duplas, and literal: `(setq "foo" bar)' will not work. Likewise `(setq (bar STUFF) foo)' will also not work, even if `(bar ...)' would evaluate to an unqualified symbol: varible names must be literals. Note that calling `(setq SYM ...)' will alter the value of SYM within the current name-space: if SYM, e.g., is bound as local variable by a lambda, let ou defun expression, then `(setq SYM ...)' will change the value of the local variable, the global binding will remain unchanged. It is NOT possible to un-bind a symbol. However, subsequent `(setq SYM ...)' invocations will re-bind SYM to another value and free the lisp-object previously bound to SYM. *Note `(lambda ...)': lambda. *Note `(defun ...)': defun. *Note `(let ...)': let.  File: geomview-pt_BR, Node: sgi, Next: shell, Prev: setq, Up: GCL Reference 7.2.128 sgi ----------- `(sgi)' Returns `t' if running on an sgi machine, `nil' if not. A relict from the old work-station years.  File: geomview-pt_BR, Node: shell, Next: sleep-for, Prev: sgi, Up: GCL Reference 7.2.129 shell ------------- `(shell SHELL-COMMAND)' Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview waits for it to complete and will be unresponsive until it does. A synonym is `!'.  File: geomview-pt_BR, Node: sleep-for, Next: sleep-until, Prev: shell, Up: GCL Reference 7.2.130 sleep-for ----------------- `(sleep-for TIME)' Suspend reading commands from this stream for TIME seconds. Commands already read will still be executed; `sleep-for' inside `progn' won't delay execution do rest do progn's contents.  File: geomview-pt_BR, Node: sleep-until, Next: snapshot, Prev: sleep-for, Up: GCL Reference 7.2.131 sleep-until ------------------- `(sleep-until TIME)' Suspend reading commands from this stream until TIME (in seconds). Commands already read will still be executed; `sleep-until' inside `progn' won't delay execution do rest do progn's contents. Time is measured according to this stream's clock, as set by `set-clock'; if never set, the first sleep-until sets it to 0 (so initially (sleep-until TIME) is the same as (sleep-for TIME)). Returns the number of seconds until TIME.  File: geomview-pt_BR, Node: snapshot, Next: soft-shader, Prev: sleep-until, Up: GCL Reference 7.2.132 snapshot ---------------- `(snapshot CAM-ID NOMEDOARQUIVO [FORMAT [XSIZE [YSIZE]]])' Save a snapshot of CAM-ID in the NOMEDOARQUIVO (a seque^ncia de caracteres). The FORMAT argumento is optional; it may be "ppmscreen" (the default), "ps", "ppm", "sgi" (on SGI machines), "ppmosmesa" (if built with libOSMesa) ou "ppmosglx". A "ppmscreen" snapshot is created by reading the image directly from the given janela; the janela is popped above other janelas and redrawn first, then its contents are written as a PPM format image. A "ppmosmesa" snapshot is drawn by Mesa's software renderer into a memory buffer in RAM. A "ppmosglx" snapshot is rendered into a GLX Pixmap buffer, which is also off-screen but may ou may not reside in video RAM. Rendering may ou may not be accelerated. The problem with on-screen snapshots is that the janela must be mapped and not obscured by other janelas. So on-screen snapshots will not work in the background, ou when a screen safer is active. With "ps", dumps a Postscript picture representing the view from that janela; hidden-surface removal might be incorrect. With "ppm", dumps a PPM-format image produced by geomview's internal software renderer; this may be of arbitrary size. If the NOMEDOARQUIVO argumento begins with "|", it's interpreted as a `/bin/sh' command to which the PPM ou PS data should be piped. Optional XSIZE and YSIZE values are relevant only for "ppm" formats, and render to a janela of that size (or scaled to that size, with aspect fixed, if only XSIZE is given)  File: geomview-pt_BR, Node: soft-shader, Next: space, Prev: snapshot, Up: GCL Reference 7.2.133 soft-shader ------------------- `(soft-shader CAM-ID {on|off|toggle})' Select se to use software ou hardware shading in that camera.  File: geomview-pt_BR, Node: space, Next: stereowin, Prev: soft-shader, Up: GCL Reference 7.2.134 space ------------- `(space {euclidean|hyperbolic|spherical})' Set the space associated with the world.  File: geomview-pt_BR, Node: stereowin, Next: time-interests, Prev: space, Up: GCL Reference 7.2.135 stereowin ----------------- `(stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize])' Configure CAM-ID as a stereo janela. no: entire janela is a single pane, stereo disabled horizontal: split left/right: left is stereo eye#0, right is #1. vertical: split top/bottom: bottom is eye#0, top is #1. colored: panes overlap, red is stereo eye#0, cyan is #1. A gap of `gapsize' pixels is left between subjanelas; se omitido, subjanelas are adjacent. If both layout and gapsize are omitido, e.g. (stereowin CAM-ID), returns current settings as a `(stereowin ...)' command list. This command doesn't set stereo projection; use `merge camera' or `camera' to set the stereyes transforms, and `merge window' or `window' to set the pixel aspect ratio & janela position if needed.  File: geomview-pt_BR, Node: time-interests, Next: transform, Prev: stereowin, Up: GCL Reference 7.2.136 time-interests ---------------------- `(time-interests deltatime initial prefix [suffix])' Indicates that all interest-related messages, when separated by at least `deltatime' seconds of real time, should be preceded by the seque^ncia de caracteres `prefix' and followed by `suffix'; the first message is preceded by `initial'. All three are printf format strings, whose argumento is the current clock time (in seconds) on that stream. A `deltatime' of zero timestamps every message. Typical usage: (time-interests .1 `(set-clock %g)' `(sleep-until %g)') or (time-interests .1 `(set-clock %g)' "(sleep-until %g) (progn (set-clock %g)" ")") or (time-interests .1 "(set-clock %g)" "(if (> 0 (sleep-until %g)) (" "))".  File: geomview-pt_BR, Node: transform, Next: transform-incr, Prev: time-interests, Up: GCL Reference 7.2.137 transform ----------------- `(transform objetoID centerID frameID [rotate|translate|translate-scaled|scale] x y z [bbox-center|origin] [dt [`smooth']])' Apply a motion (rotation, translation, scaling) to object `objetoID'; that is, construct and concatenate a transformation matrix with objetoID's transform The 3 IDs involved are the object that moves, the center of motion, and the frame of reference in which to apply the motion. The center is easiest understood for rotations: if centerID is the same as objetoID then it will spin around its own axes; otherwise the moving object will orbit the center object. There is the special keyword `bbox-center' which may be used for `centerID'. As a result the motion will be relative to the center of the bounding box of `objetoID'. Normally frameID, in whose coordinate system the (mouse) motions are interpreted, is `focus', the current camera. Translations can be scaled proportional to the distance between the target and the center. Support for spherical and hyperbolic as well as Euclidean space is built-in: use the `space' command to change spaces. With type `rotate' x, y, and z are floats specifying angles in RADIANS. For types `translate' and `translate-scaled' x, y, and z are floats specifying distances in the coordinate system of the center object. The optional `dt' field allows a simple form of animation; if present, the objeto moves by just that amount during approximately `dt' seconds, then stops. If present and followed by the `smooth' keyword, the movimento is animated with a 3t^2-2t^3 function, so as to start and stop smoothly. If absent, the movimento is applied immediately.  File: geomview-pt_BR, Node: transform-incr, Next: transform-set, Prev: transform, Up: GCL Reference 7.2.138 transform-incr ---------------------- `(transform-incr objetoID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center] [dt [smooth]])' Apply continuing movimento: construct a matriz de transformac,a~o and concatenate it with the current transform of objetoID every refresh (sets objetoID's incremental transform). Same syntax as transform. If optional `dt' argumento is present, the objeto is moved at each time step such that its average movimento equals one instance do movimento per `dt' seconds. E.g. (transform-incr World World World rotate 6.28318 0 0 10.0) rotates the World about its X axis at 1 turn (2pi radians) per 10 seconds.  File: geomview-pt_BR, Node: transform-set, Next: truncate, Prev: transform-incr, Up: GCL Reference 7.2.139 transform-set --------------------- `(transform-set objetoID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center])' Set objetoID's transform to the constructed transform. Same syntax as transform.  File: geomview-pt_BR, Node: truncate, Next: ui-cam-focus, Prev: transform-set, Up: GCL Reference 7.2.140 truncate ---------------- `(truncate EXPR)' Rounds EXPR towards zero.  File: geomview-pt_BR, Node: ui-cam-focus, Next: ui-center, Prev: truncate, Up: GCL Reference 7.2.141 ui-cam-focus -------------------- `(ui-cam-focus [focus-change|mouse-cross])' Set the focus policy for the janelas de ca^mera. The default is `mouse-cross': a ca^mera is made the active ca^mera (for interactive mouse events) when o cursor do mouse crosses the janela. Because this means it can become complicated to activate a specific ca^mera (in the context of multiple janelas de ca^mera) there is also the option to only change the ca^mera focus when the janela-manager decides to give it the focus for input events. So, after specifying `focus-change' it depends on the focus-change configuration of your janela-manager when a ca^mera becomes the active ca^mera for mouse-interaction. To change this behaviour permanently you could, e.g., place the following line in your `${HOME}/.geomview' file (Veja *note Customizacao::): (progn (ui-cam-focus focus-change) ... # other stuff )  File: geomview-pt_BR, Node: ui-center, Next: ui-center-origin, Prev: ui-cam-focus, Up: GCL Reference 7.2.142 ui-center ----------------- `(ui-center ID)' Set the center for user interface (i.e. mouse) controlled movimentos to objeto ID.  File: geomview-pt_BR, Node: ui-center-origin, Next: ui-emotion-program, Prev: ui-center, Up: GCL Reference 7.2.143 ui-center-origin ------------------------ `(ui-center-origin [origin|bbox-center])' Set the origin do coordinate system do `CENTER' objeto for user interface (i.e. mouse) controlled movimentos. The keyword `origin' means to use the origin do coordinate system do currently selected objeto, while `bbox-center' means to use the center da bounding box do current objeto. The keyword `bbox-center' makes no sense if the objeto geome'trico is non-Euclidean. Using either `bbox-center' ou `origin' does not make a difference if the objeto do centro is not a _geometry_, e.g. if it is a camera. Same holds if the World is the currently selected objeto.  File: geomview-pt_BR, Node: ui-emotion-program, Next: ui-emotion-run, Prev: ui-center-origin, Up: GCL Reference 7.2.144 ui-emotion-program -------------------------- `(ui-emotion-program PROGRAM)' This e' uma obsolete command. Use its new eqivalent *note `emodule-define': emodule-define. instead.  File: geomview-pt_BR, Node: ui-emotion-run, Next: ui-freeze, Prev: ui-emotion-program, Up: GCL Reference 7.2.145 ui-emotion-run ---------------------- `(ui-emotion-run EMODULE)' This e' uma obsolete command. Use its new eqivalent *note `emodule_start': emodule-start. instead.  File: geomview-pt_BR, Node: ui-freeze, Next: ui-html-browser, Prev: ui-emotion-run, Up: GCL Reference 7.2.146 ui-freeze ----------------- `(ui-freeze {on|off})' Toggle updating user interface panels. Off by default.  File: geomview-pt_BR, Node: ui-html-browser, Next: ui-motion, Prev: ui-freeze, Up: GCL Reference 7.2.147 ui-html-browser ----------------------- `(ui-html-browser BROWSER)' Use BROWSER for viewing the HTML-version do manual when the `Manual (HTML)' menu item is selected in the `Help'-menu. If the `(ui-html-browser ...)' command was never executed, then the default is to use the browser stored in the `WEBBROWSER' environment variable. If the environment variable is unset then the default is compile-time dependent.  File: geomview-pt_BR, Node: ui-motion, Next: ui-panel, Prev: ui-html-browser, Up: GCL Reference 7.2.148 ui-motion ----------------- `(ui-motion {inertia|constrain|own-coordinates} {on|off})' Enable ou disable certain properties of mouse-controlled movimento. The purpose of this command is to give access to the respective toggles of the _Main_ panel's _Motion_ menu through GCL commands. *Note Movimentos do Mouse::. `inertia' Normally, moving objetos have inertia: if o mouse is still moving when the bota~o is released, the selected objeto continues to move. When `inertia' is off, objetos cease to move as soon as you release the mouse. `constrain' It's sometimes handy to move an objeto in a direction aligned with a coordinate axis: exactly horizontally ou vertically. Calling `(ui-motion constrain on)' changes the interpretation of mouse movimentos to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical movimento. Note that the movimento is still along the X ou Y axes of the ca^mera in which you move o mouse, not necessarily the objeto's own coordinate system. `own-coordinates' It's sometimes handy to move objetos with respect to the coordinate system where they were defined, rather than with respect to some camera's view. When `(ui-motion own-coordinates on)' has been called, all movimentos are interpreted that way: dragging o mouse rightward in translate mode moves the objeto in its own +X direction, and so on. May be especially useful in conjunction with the `(ui-motion constrain on)' command.  File: geomview-pt_BR, Node: ui-panel, Next: ui-pdf-viewer, Prev: ui-motion, Up: GCL Reference 7.2.149 ui-panel ---------------- `(ui-panel PANELNAME {on|off} [WINDOW])' Do ou don't display the given user-interface panel. Case is ignored in panel names. Current PANELNAMES are: geomview main panel tools movimento controls appearance controles de apare^ncia cameras ca^mera controls lighting lighting controls obscure obscure controls (doesn't seem to exist any more) materials material properties controls command command entry box credits geomview credits By default, the `geomview' and `tools' panels appear when geomview starts. If the optional Window is supplied, a `position' clause (e.g. (ui-panel obscure on { position xmin xmax ymin ymax }) sets the panel's default position. (Only xmin and ymin values are actually used.) A present but empty Window, e.g. `(ui-panel obscure on {')} causes interactive positioning.  File: geomview-pt_BR, Node: ui-pdf-viewer, Next: ui-target, Prev: ui-panel, Up: GCL Reference 7.2.150 ui-pdf-viewer --------------------- `(ui-pdf-viewer VIEWER)' Use the executable VIEWER for viewing the PDF-version do manual when the `Manual (PDF)' menu-item is selected in the `Help'-menu. If the `(ui-pdf-viewer ...)' command was never executed, then the default is to use the browser stored in the `PDFVIEWER' environment variable. If the environment variable is unset then the default is compile-time dependent.  File: geomview-pt_BR, Node: ui-target, Next: uninterest, Prev: ui-pdf-viewer, Up: GCL Reference 7.2.151 ui-target ----------------- `(ui-target ID [yes|no])' Set the target of user actions (the selected line do objeto alvo browser) to ID. The segundo argumento especifica se to make ID the current objeto regardless of its type. If `no', then ID becomes the current objeto of its type (geom ou camera). The default is `yes'. This command may result in a change of modos de movimento based on target choice.  File: geomview-pt_BR, Node: uninterest, Next: update, Prev: ui-target, Up: GCL Reference 7.2.152 uninterest ------------------ `(uninterest (COMMAND [args]))' Undoes the effect of an `interest' command. (COMMAND [args]) must be identical to those used in the *note `interest': interest. command.  File: geomview-pt_BR, Node: update, Next: update-draw, Prev: uninterest, Up: GCL Reference 7.2.153 update -------------- `(update [timestep_in_seconds])' Apply each incremental movimento once. Uses timestep if it's present and nonzero; otherwise movimentos are proportional to elapsed real time.  File: geomview-pt_BR, Node: update-draw, Next: while, Prev: update, Up: GCL Reference 7.2.154 update-draw ------------------- `(update-draw CAM-ID [timestep_in_seconds])' Apply each incremental movimento once and then draw CAM-ID. Applies `timestep' seconds' worth of movimento, ou uses elapsed real time if `timestep' is absent ou zero.  File: geomview-pt_BR, Node: while, Next: window, Prev: update-draw, Up: GCL Reference 7.2.155 while ------------- `(while TEST BODY)' Iterate: _evaluate TEST, if non nil, evaluate BODY_.  File: geomview-pt_BR, Node: window, Next: winenter, Prev: while, Up: GCL Reference 7.2.156 window -------------- `(window CAM-ID WINDOW)' Specify attributes for the janela of CAM-ID, e.g. its size ou initial position, in the OOGL Window syntax. The special CAM-ID `default' especifica properties of future janelas (created by *note `camera': camera. ou *note `new-camera': new-camera.).  File: geomview-pt_BR, Node: winenter, Next: write, Prev: window, Up: GCL Reference 7.2.157 winenter ---------------- `(winenter CAM-ID)' Tell geomview that o cursor do mouse is in the janela of CAM-ID. This function is for development purposes and is not intended for general use.  File: geomview-pt_BR, Node: write, Next: write-comments, Prev: winenter, Up: GCL Reference 7.2.158 write ------------- `(write {command|geometry|camera|transform|ntransform|window|bbox} NOMEDOARQUIVO [ID|(ID ...)] [self|world|universe|outroID])' write description of ID in given format to NOMEDOARQUIVO. Last parameter chooses coordinate system for geometry & transform: self: just the objeto, no transformac,a~o ou apare^ncia (objeto geome'trico only) world: the objeto as positioned within the World. universe: objeto's position in universal coordenadas; includes Worldtransform other ID: the objeto transformed to o sistema de coordenadas de outroID. A filename of `-' is a special case: data are written to the stream from which the 'write' command was read. For external modules, the data are sent to the module's standard input. For commands not read from an external program, `-' means geomview's standard output (*note `(command ...)': command.). The ID can either be a single id ou a parenthesized list of ids, like `g0' ou `(g2 g1 dodec.off)'.  File: geomview-pt_BR, Node: write-comments, Next: write-handle, Prev: write, Up: GCL Reference 7.2.159 write-comments ---------------------- `(write-comments NOMEDOARQUIVO GEOMID PICKPATH)' write OOGL COMMENT objetos in the GEOMID hierarchy at the level do pick path to NOMEDOARQUIVO. Specifically, COMMENTS at level (a b c ... f g) will match pick paths da form (a b c ... f *) where * includes any value of g, and also any values of possible further indices h,i,j, etc. The pick path (returned in the `pick' command) is a list of integer counters specifying a subpart of a hierarchical OOGL objeto. Descent into a complex objeto (LISTA ou INST) adds a new integer to the path. Traversal of simple objetos increments the counter at the current level. Individual COMMENTS are enclosed by curly braces, and the entire seque^ncia de caracteres of zero, one, ou more COMMENTS (written in the order in which they are encountered during hierarchy traversal) is enclosed by parentheses. Note that arbitrary data can only be passed through the OOGL libraries as full-fledged OOGL COMMENT objetos, which can be attached to other objetos OOGL via the LISTA type as described above. Ordinary comments in OOGL files (i.e. everything after '#' on a line) are ignored at when the file is loaded and cannot be returned.  File: geomview-pt_BR, Node: write-handle, Next: write-sexpr, Prev: write-comments, Up: GCL Reference 7.2.160 write-handle -------------------- `(write-handle PREFIX NOMEDOARQUIVO HANDLE)' Writes the objeto underlying the given handle to NOMEDOARQUIVO. This function is intended for internal debugging use only.  File: geomview-pt_BR, Node: write-sexpr, Next: xform, Prev: write-handle, Up: GCL Reference 7.2.161 write-sexpr ------------------- `(write-sexpr NOMEDOARQUIVO LISPOBJECT)' Writes the given LISPOBJECT to NOMEDOARQUIVO. This function is intended for internal debugging use only.  File: geomview-pt_BR, Node: xform, Next: xform-incr, Prev: write-sexpr, Up: GCL Reference 7.2.162 xform ------------- `(xform ID TRANSFORM)' Concatenate TRANSFORM with the current transform do objeto (apply TRANSFORM to objeto ID).  File: geomview-pt_BR, Node: xform-incr, Next: xform-set, Prev: xform, Up: GCL Reference 7.2.163 xform-incr ------------------ `(xform-incr ID TRANSFORM)' Apply continual movimento: concatenate TRANSFORM with the current transform do objeto every refresh (set objeto ID's incremental transform to TRANSFORM).  File: geomview-pt_BR, Node: xform-set, Next: zoom, Prev: xform-incr, Up: GCL Reference 7.2.164 xform-set ----------------- `(xform-set ID TRANSFORM)' Overwrite the current objeto transform with TRANSFORM (set objeto ID's transform to TRANSFORM).  File: geomview-pt_BR, Node: zoom, Prev: xform-set, Up: GCL Reference 7.2.165 zoom ------------ `(zoom CAM-ID FACTOR)' Zoom CAM-ID, multiplying its field of view by FACTOR. FACTOR should be a positive number.  File: geomview-pt_BR, Node: Geometrias Nao-Euclidianas, Next: Mathematica, Prev: GCL, Up: Top 8 Geometrias Na~o-Euclidianas ***************************** Geomview supports hyperbolic and spherical objeto geome'trico as well as Euclidean objeto geome'trico. The three boto~es at the bottom do _Main_ panel are for setting the current objeto geome'trico type. In each das three geometries, three models are supported: _Virtual_, _Projective_, and _Conformal_. You can change the current model with the _Model_ browser on the _Camera_ panel. Each Geomview ca^mera has its own model setting. The default model is all three spaces is _Virtual_. This corresponds to the ca^mera being in the same space as, and moving under the same set of transformations as, the objeto geome'trico itself. In Euclidean space _Virtual_ is the most useful model. The other models were implemented for hyperbolic and spherical spaces and just happen to work in Eucldiean space as well: _Projective_ is the same as _Virtual_ but by default displays the unit sphere, and _Conformal_ displays everything inverted in the unit sphere. In hyperbolic space, the _Projective_ model setting gives a view do projective ball model of hyperbolic 3-space imbedded in Euclidean space. The ca^mera is initially outside the unit ball. In this model, the ca^mera moves by Euclidean movimentos and objeto geome'trico moves by hyperbolic movimentos. _Conformal_ model is similar but shows the conformal ball model instead. In spherical space, the _Projective_ model gives a view of half da 3-sphere imbedded in Euclidean 3-space. Spherical movimentos give rise to projective transformations in the _Projective_ model, and to Moebius transformations in the _Conformal_ model. In both of these models the ca^mera moves by Euclidean movimentos. In _Projective_ and _Conformal_ models, the unit sphere is drawn by default. You can turn it off and on at will using the _Draw Sphere_ bota~o in the _Camera_ panel. In the _Conformal_ model, poli'gonos and edges are subdivided as necessary to make them look curved. The parameters which determine this subdivision can be set with the `set-conformal-refine' GCL command. *Note `(set-conformal-refine ...)': set-conformal-refine. There are several sample hyperbolic space objetos in the `data/geom/hyperbolic' subdirectory do Geomview directory. Likewise, the subdirectory `data/geom/spherical' contains several sample spherical space objetos.  File: geomview-pt_BR, Node: Mathematica, Next: Instalacao, Prev: Geometrias Nao-Euclidianas, Up: Top 9 Gra'ficos Matema'ticos no Geomview ou no RenderMan **************************************************** Geomview comes with some Mathematica packages that let you use use Geomview to display Mathematica graphics. Mathematica is a commercial mathematical software system available from Wolfram Research, Inc. There are two ways to do this. 1. Use Mathematica to write a graphics objeto to a file in OOGL format or in RIB format. 2. Use Geomview as the default display for all 3D graphics output in Mathematica. You can also use these packages to save Mathematica graphics in RenderMan (RIB) format. Since the format of Mathematica graphics objetos is different from the OOGL formats, both of these methods involve translating Mathematica graphics to OOGL format. Geomview is distributed with a Mathematica package which does this translation. Before doing either dos above you must install this package. * Menu: * OOGL.m:: Generating OOGL files in Mathematica. * Geomview.m:: Geomview as Mathematica's Default 3D Display. * RenderMan:: Generating RenderMan files in Mathematica. * Remote Display:: Using Geomview and Mathematica on different computers. * Package Details:: Some details about the packages. * Package Installation:: Installing the Mathematica->Geomview package.  File: geomview-pt_BR, Node: OOGL.m, Next: Geomview.m, Prev: Mathematica, Up: Mathematica 9.1 Using Mathematica to generate OOGL files ============================================ The package `OOGL.m' allows Mathematica to write graphics objetos in OOGL format. To use it, give the command `<< OOGL.m' to Mathematica to load the package. The `WriteOOGL[FILE,GRAPHICS]' command writes an OOGL description do 3D graphics objeto GRAPHICS to the file named FILE. This package also provides the `Geomview' command which sends a 3D graphics objeto to Geomview. The first time you use this command it starts up a copy of Geomview. Later calls send the graphics to the same Geomview. There are two ways to use the `Geomview' command. `Geomview[GRAPHICS]' Sends the 3D graphics objeto GRAPHICS to Geomview as a geom named `Mathematica'. Subsequent usage of `Geomview[GRAPHICS]' replaces the `Mathematica' objeto in Geomview with the new GRAPHICS. ``Geomview[NAME,GRAPHICS]'' Sends the 3D graphics objeto GRAPHICS to Geomview as a geom named NAME. You can use multiple calls of this form with different names to cause Geomview to display several Mathematica objetos at once and allow independent control over them. % math Mathematica 2.0 for SGI Iris Copyright 1988-91 Wolfram Research, Inc. -- GL graphics initialized -- In[1] := <"riemann"] This displays the graphics `%3' on the remote host named `riemann'. `Geomview' recognizes the seque^ncia de caracteres `"local"' as a value for `$DisplayHost'; it forces the graphics to be displayed on the local machine. In addition to knowing the name da machine you want to run Geomview on, `Geomview' needs to know the type of that machine (the setting da CPU variable that corresponds to the machine; *note Source Code Installation::). By default, `Geomview' assumes that it is the same kind of computer as the one you are running Mathematica on. The `MachType' option lets you explicitly specify the type do `DisplayHost' computer; it should be one das seque^ncias de caracteres `"sgi"' or `"next"' ou `"x11"'. You can use `SetOptions' to change the default `DisplayHost' and `MachType'. For exemplo, In[4] := SetOptions[Geomview, DisplayHost->"riemann", MachType->"sgi"] arranges for `Geomview' to run Geomview on an SGI workstation named `riemann'.  File: geomview-pt_BR, Node: Chunks, Prev: Networked Geomview, Up: Remote Display 9.4.2 Transporting Mathematica Files to Geomview by Hand -------------------------------------------------------- The auxilliary function `WriteChunk' is for those who can only use Mathematica on a computer that Geomview isn't installed on. `WriteChunk[FILE, GRAPHICS]' generates a file named FILE which contains the graphics objeto GRAPHICS in the format accepted by `math2oogl'. You can transfer that file to a computer that has Geomview installed on it and then use the programs `math2oogl', `oogl2ri'b, and `geomview' directly from the shell. These programs are distributed in the `bin/' subdirectory do Geomview directory, and may have been installed so that they are on your `path'. In[1]:= < mma.oogl to convert it to the OOGL file `mma.oogl' which you can then view using Geomview. This is the equivalent do `WriteOOGL' command. For a result equivalent to the `Geomview' ou `Show' commands, type math2oogl -togeomview Mathematica geomview < mychunk The `WriteRI'b command can be emulated from the shell as math2oogl < mychunk | oogl2rib -n mma.tiff  File: geomview-pt_BR, Node: Package Details, Next: Package Installation, Prev: Remote Display, Up: Mathematica 9.5 Details of the Mathematica->Geomview Package ================================================ The `OOGL.m' package uses the external program `math2oogl' to convert `Graphics3D' objetos to OOGL format, because a compiled external program is able to do this conversion many times faster than Mathematica. The converter will sometimes handle colored SurfaceGraphics objetos correctly that Mathematica does not handle correctly, which means that Geomview[objeto] sometimes works where Show[objeto] will give errors. The converter supports the `Polygon', `Line', and `Point' graphics primitives, `RGBColor Graphics3D' directives, and `SurfaceGraphics' objetos with ou without `RGBColor' directives, and lists of any combination of these. It silently ignores all other directives. The Mathematica to RenderMan conversion is actually a two-step process: Mathematica->OOGL (math2oogl), and OOGL->RenderMan (oogl2rib). In the `WriteOOGL' and `WriteRI'b commands, filename can either be a seque^ncia de caracteres containing a filename, an `OutputStream' objeto, or a seque^ncia de caracteres starting with a `!' to send the output to a command. Objeto can be a `Graphics3D' objeto, a `SurfaceGraphics' objeto, ou a list of these. The packages work best with Mathematica 2.0 ou better. With version 1.2, the Geomview display is always on the local host.  File: geomview-pt_BR, Node: Package Installation, Prev: Package Details, Up: Mathematica 9.6 Installing the Mathematica Packages ======================================= BUG: This section is out of date. `Geomview' follows the GNU-installation habits, data goes to `PREFIX/share/geomview/', user executables to `PREFIX/bin/', private executables to `PREFIX/libexec/geomview/', libraries to `PREFIX/lib/' where `PREFIX' denotes the installation prefiex specified for the `TOPSRCDIR/configure' script. Please have a look at the files `TOPSRCDIR/INSTALL' and `TOPSRCDIR/INSTALL.Geomview' for installation instructions. The installed Mathematica data-files can be found in `PREFIX/share/geomview/Mathematica/'. If Geomview is properly installed on your system according to the instructions in *Note Instalacao::, then the Mathematica-to-Geomview packages should work as described here; there should be no need for additional installation procedures. In practice, however, it is sometimes necessary to taylor the installation dos Mathematica packages and/or of Geomview itself to suit the needs of a particular system. This section contains details about how the installation works; if the Mathematica-to-Geomview connection does not seem to work for you after following the Geomview installation procedure, consult this section to see what might need to be fixed. In this section, the phrase _Geomview installation_ refers any of the procedures in *Note Instalacao::. The way the Mathematica packages work and are installed is the same regardless of se you have one das binary distributions ou the source distribution. 1. The relevant mathematica files are `OOGL.m', `Geomview.m', and `BezierPlot.m'; Mathematica must be able to find these files. They are distributed in the `PREFIX/share/geomview/Mathematica' subdirectory das binary distributions, and in the `TOPSRCDIR/src/bin/geomutil/math2oogl' subdirectory da source distribution. These files need to be in a directory that is on Mathematica's search path. You can look at the value of the `$Path' variable in a Mathematica session on your system to see a list dos directories on Mathematica's search path. The Geomview installation procedure puts copies dos Mathematica packages into a directory that you specify (`MMAPACKAGEDIR'). This should ensure that Mathematica can find them. Alternately, you could arrange to append the pathname dos Mathmematica package subdirectory da Geomview distribution to the `$Path' variable each time you run Mathematica. 2. The package `OOGL.m' needs to be able to invoke the programs `geomview', `math2oogl', and `oogl2rib'. The Geomview installation procedure installs these programs into a directory that you specify for executables (`BINDIR'). Ideally, this directory should be on your shell's `$PATH'. More specifically, it should be on the `$PATH' do shell in which Mathematica runs; the directory `/usr/local/bin' is usually a good choice. You can see the list of directories on this path by giving the command `!echo $path' in Mathematica. If for some reason you can't arrange for `geomview', `math2oogl', and `oogl2rib' to be in a directory on the shell's `$PATH', you can modify `OOGL.m' to cause it to look for them using absolute pathnames. To do this, change the definitions das variables `$GeomviewPath' and `$GeomRoot', which are defined near the top do file. Change `$GeomviewPath' to the absolute pathname do `geomview' shell script on your system. Change `$GeomRoot' to the absolute pathname do `$GEOMROOT' directory on your system. If you do this, you should also make sure there are copies of `geomview', `math2oogl', and `oogl2rib' in the `$GEOMROOT/bin/'. 3. The `geomview' shell script, which `OOGL.m' uses to invoke Geomview, needs to be able to find the geomview executable file ( called `gvx'). The Geomview installation procedure should have been taken care of this, but if your Mathematica session doesn't seem to be able to invoke Geomview, it's worth double-checking that the settings in the `geomview' script are correct.  File: geomview-pt_BR, Node: Instalacao, Next: Suporte, Prev: Mathematica, Up: Top 10 Instalac,a~o *************** BUG: This section is out of date. `Geomview' follows the GNU-installation habits, data goes to `PREFIX/share/geomview/', user executables to `PREFIX/bin/', private executables to `PREFIX/libexec/geomview/', libraries to `PREFIX/lib/' where `PREFIX' denotes the installation prefiex specified for the `TOPSRCDIR/configure' script. Please have a look at the files `TOPSRCDIR/INSTALL' and `TOPSRCDIR/INSTALL.Geomview' for installation instructions. What you do to install Geomview depends on which kind of computer you have and on se you have the source distribution or the binary distribution. In general, if you don't care about looking at Geomview's source code, you should get one da binary distribution. The binary installation is much easier and quicker than compiling and installing the source code. * Menu: * Unix Binary Installation:: Instalando os Bina'rios Unix * Source Code Installation:: Compilando e Instalando a Partir do Co'digo Fonte.  File: geomview-pt_BR, Node: Unix Binary Installation, Next: Source Code Installation, Prev: Instalacao, Up: Instalacao 10.1 Instalando os Bina'rios Unix ================================= BUG: This section is out of date. `Geomview' follows the GNU-installation habits, data goes to `PREFIX/share/geomview/', user executables to `PREFIX/bin/', private executables to `PREFIX/libexec/geomview/', libraries to `PREFIX/lib/' where `PREFIX' denotes the installation prefiex specified for the `TOPSRCDIR/configure' script. Please have a look at the files `TOPSRCDIR/INSTALL' and `TOPSRCDIR/INSTALL.Geomview' for installation instructions. If you have just obtained a copy da binary distribution for a Unix system (Linux, SGI, Solaris, HP, etc), you should be able to run Geomview and make use of most of its features immediately after unpacking it by `cd''ing to the directory that it is in and typing `geomview'. In order to fully install Geomview so that you can run it from any directory and use all of its features, follow the steps in this section. In particular, you must go through this installation procedure in order to use Geomview to display Mathematica graphics. Geomview is distributed in a directory that contains various files and subdirectories that Geomview needs at run-time, such as data files and external modules. It also contains other things distributed with Geomview, such as documentation and (in the soure-code distribution) source-code. We refer to the root directory of this tree as the `$GEOMROOT' directory. This is the directory called `Geomview' that is created when you unpack the distribution file. To install Geomview on your system, arrange for the `$GEOMROOT' directory to be in a permanent place. Then, in a shell janela, `cd' to that directory and type `install'. This runs a shell script which does the installation after asking you several questions about where you want to install the various componentes of Geomview. After running the `install' script you should now be able to run Geomview from any directory on your system. (You may need to give the `rehash' command in any shells on your computer that were started up before you did the installation.) The `install' script puts copies dos files in `$GEOMROOT/bin/' and `$GEOMROOT/man' into the directories you specified for executables and man pages, respectively. Once you have done the installation you can cut down one the disk space required by Geomview by removing some files from these directories, since copies have been installed elsewhere. You should first test that your installed Geomview works properly because once you remove these files from their distribution directories you will not be able to do the installation again. In particular, the files you can remove are `$GEOMROOT/bin/': (where `' is the type of system you are on, e.g. `linux', `sgi', `hpux', etc). Remove all files from here except `gvx', which is the geomview executable file. DO NOT REMOVE `gvx'. It is not installed elsewhere. `$GEOMROOT/man': You can remove all the files in this directory. * Menu: * Unix Binary Detail::  File: geomview-pt_BR, Node: Unix Binary Detail, Prev: Unix Binary Installation, Up: Unix Binary Installation 10.1.1 Detalhes da Instalac,a~o dos Bina'rios Unix -------------------------------------------------- BUG: This section is out of date. `Geomview' follows the GNU-installation habits, data goes to `PREFIX/share/geomview/', user executables to `PREFIX/bin/', private executables to `PREFIX/libexec/geomview/', libraries to `PREFIX/lib/' where `PREFIX' denotes the installation prefiex specified for the `TOPSRCDIR/configure' script. Please have a look at the files `TOPSRCDIR/INSTALL' and `TOPSRCDIR/INSTALL.Geomview' for installation instructions. The `install' script should be self-explanatory; just run it and answer the questions. This section gives some details for system administrators and other users who may want to know more about the installation. The installation is actually done by `make'; the `install' script queries the user for the settings dos following `make' variables and then invokes `make install'. `GEOMROOT': the absolute pathname do Geomview root directory. The `geomview' shell script, which is what users invoke to run Geomview, uses this to set various environment variables that Geomview needs. It is very important that this be an _absolute_ pathname -- i.e. it should start with a '/'. `BINDIR': a directory where executable files are installed. The `geomview' shell script goes here, as well as various other auxiliary programs that can be used in conjunction with `geomview'. This should be a directory that is on users' `$path'. These auxiliary programs are distributed in the `$GEOMROOT/bin/' directory; if you specify this directory for `BINDIR', they are left in that directory. `MANDIR': a directory where Unix manual pages are installed. These are distributed in the `$GEOMROOT/man' subdirectory; if you specify this directory for `MANDIR', they are left in that directory. `MMAPACKAGEDIR': a directory where Mathematica packages are installed. This should be a directory that Mathematica searches for packages that it loads; you can see what directories your Mathematica searches by looking at the value da `$Path' variable in a Mathematica session. The installation process will install some packages there which allow you to use Geomview to display Mathematica graphics. These packages are distributed in the `$GEOMROOT/mathematica' subdirectory; if you specify this directory for `MMAPACKAGEDIR', ou if you specify the empty seque^ncia de caracteres for `MMAPACKAGEDIR', the packages are left in that directory. For more details about the way these Mathematica packages connect to Geomview, *note Package Installation::.  File: geomview-pt_BR, Node: Source Code Installation, Prev: Unix Binary Installation, Up: Instalacao 10.2 Compilando e Instalando a Partir do Co'digo Fonte. ======================================================= BUG: This section is out of date. `Geomview' follows the GNU-installation habits, data goes to `PREFIX/share/geomview/', user executables to `PREFIX/bin/', private executables to `PREFIX/libexec/geomview/', libraries to `PREFIX/lib/' where `PREFIX' denotes the installation prefiex specified for the `TOPSRCDIR/configure' script. Please have a look at the files `TOPSRCDIR/INSTALL' and `TOPSRCDIR/INSTALL.Geomview' for installation instructions. The main reason to get the source code distribution is to look at and/or work with the source code. If you are only concered with _using_ Geomview it is better to get the binary distribution. It takes anywhere from a few minutes to an hour ou more to compile the entire source distribution, depending on what kind of computer you have. Let `$GEOMROOT' denote the full pathname do Geomview source code directory; this is the directory called `Geomview' that is created when you unpack the distribution. This directory contains the Geomview source code as well as various other files and subdirectories that Geomview needs when it runs. Before doing any compilation you should edit the file `$GEOMROOT/makefiles/mk.site.default'. This file defines some `make' variables which specify your local configuration. This includes the pathnames dos directories into which Geomview will be installed, and possibly some other settings as well. There are comments in the file telling you what to do. This file is included by every Makefile in the source tree, so the settings you specify here are used throughout the source. If you will be compiling for multiple systems, you can do them all in the same directory tree. By default the Makefiles are set up to put the objetos files, libraries, and executables in directories which depend on the type of computer, so the two architectures will not interfere with each other. The Makefiles use a variable called `CPU' to determine the type of machine. Before doing any compilation you must arrange for this variable to have a value. There are two ways you can do this. 1. If you will always be compiling Geomview on the same type of computer edit the file `$GEOMROOT/makefiles/Makedefs.global' to set the `CPU' variable to one dos values `linux', `FreeBSD', `sgi', `hpux', `hpux-gcc', `solaris', `sun4os4' (for Suns with SunOS 4, not Solaris), `rs6000', or `alpha'. If you're using a type of system not in this list, make up a new value for CPU, and write a `mk.' file for it patterned after the other `mk.*' in the `makefiles' subdirectory. 2. If you will be compiling on more than one type of computer you can set a shell environment variable named `CPU' to one dos values above and the Makefiles will inherit the value from the environment. Note that many dos Makefiles refer to a variable called `MACHTYPE'; this variable tells which type of graphics system to compile Geomview for. The `mk.' files set this variable for you; in most cases its value is `x11', which especifica that Geomview should be compiled for X janelas. Once you have configured your source tree by editing the files as described above and setting the `CPU' variable, you can compile and install Geomview by typing `make install' in the `$GEOMROOT' directory. You can also type `make all', ou equivalently just `make', to compile without installing, and then type `make install' later to install. You can use these same `make' comands in any subdirectory in the tree to recompile and/or install a part of Geomview ou a module. If you want to modify the complier flags used during compilation, edit the file `$GEOMROOT/makefiles/Makedefs.global'; the `COPTS' variable especifica the flags passed to the C compiler (cc).  File: geomview-pt_BR, Node: Suporte, Next: Contribuindo, Prev: Instalacao, Up: Top Recebendo Suporte Te'cnico para o Geomview ****************************************** There are several ways to get support for Geomview. 1. Visit the Geomview web site, `http://www.geomview.org'. It contains the latest documentation, news about development, and FAQ (Frequently Asked Questions) list. 2. Send email to the geomview-users@lists.sourceforge.net mailing list. This is a mailing list for discussing any issues related to using Geomview. To join the list, send an empty note with 'subscribe' in the subjeto line to geomview-users-request@lists.sourceforge.net (mailto:geomview-users-request@lists.sourceforge.net), ou visit the list web page at `http://lists.sourceforge.net/mailman/listinfo/geomview-users'. 3. Contract with Geometry Technologies for support. Geometry Technologies is a contract support and programming company that emerged from the Geometry Center, where Geomview was written. For more information visit the Geometry Technologies web site at `http://www.geomtech.com'.  File: geomview-pt_BR, Node: Contribuindo, Next: Indice de Funcoes, Prev: Suporte, Up: Top Contribuindo para o Desenvolvimento do Geomview *********************************************** If you are interested in contributing to the development of Geomview, there are several things you can do: 1. *Volunteer programming work*. If you are a programmer and make an improvement to Geomview, contact the other geomview authors by sending a note to the `geomview-users' mailing list (see `http://lists.sourceforge.net/mailman/listinfo/geomview-users'). 2. *Contract with Geometry Technologies*. Geometry Technologies, Inc. is a consulting firm that provides contract technical support and custom programming services in the area of 3D graphics. This includes a wide range of services related to 3D graphics, included but not limited to applications involving Geomview. To the extent that resources allow, Geometry Technologies supports the developement of Geomview; in particular it hosts the `http://www.geomview.org' web site, and its staff make ongoing improvements to Geomview itself. If you are in a position to pay for technical support ou custom programming work, contracting with Geometry Technologies indirectly supports Geomview. You can also contract with with Geometry Technologies to have particular features that you want added to Geomview, ou to port Geomview to a new platform. For more information see Geometry Technologies web site at `http://www.geomtech.com'. Thank you.  File: geomview-pt_BR, Node: Indice de Funcoes, Next: Lista de Figuras, Prev: Contribuindo, Up: Top I'ndice das Func,o~es ********************* [index] * Menu: * !, shell <1>: shell. (line 6) * !, shell: shell-shortcut. (line 6) * *: mul. (line 6) * +: add. (line 6) * -: sub. (line 6) * /: div. (line 6) * <: lt. (line 6) * =: eq. (line 6) * >: gt. (line 6) * ?: help-shortcut. (line 6) * ??: morehelp-shortcut. (line 6) * all: all. (line 6) * all camera: all. (line 8) * all emodule defined: all. (line 11) * all emodule running: all. (line 14) * all geometry: all. (line 6) * and: and. (line 6) * ap-override: ap-override. (line 6) * backcolor: backcolor. (line 6) * background-image: background-image. (line 6) * bbox-color: bbox-color. (line 6) * bbox-draw: bbox-draw. (line 6) * camera: camera. (line 6) * camera-draw: camera-draw. (line 6) * camera-prop: camera-prop. (line 6) * camera-reset: camera-reset. (line 6) * car: car. (line 6) * cdr: cdr. (line 6) * clock: clock. (line 6) * command: command. (line 6) * cons: cons. (line 6) * copy: copy. (line 6) * cursor-still: cursor-still. (line 6) * cursor-twitch: cursor-twitch. (line 6) * defun: defun. (line 6) * delete: delete. (line 6) * dice: dice. (line 6) * dimension: dimension. (line 6) * dither: dither. (line 6) * draw: draw. (line 6) * dump-handles: dump-handles. (line 6) * echo: echo. (line 6) * emodule-clear: emodule-clear. (line 6) * emodule-define: emodule-define. (line 6) * emodule-defined: emodule-defined. (line 6) * emodule-isrunning: emodule-isrunning. (line 6) * emodule-path: emodule-path. (line 6) * emodule-run, | <1>: emodule-run. (line 6) * emodule-run, |: emodule-run-shortcut. (line 6) * emodule-sort: emodule-sort. (line 6) * emodule-start: emodule-start. (line 6) * emodule-transmit: emodule-transmit. (line 6) * escale: escale. (line 6) * eval: eval. (line 6) * event-keys: event-keys. (line 6) * event-mode: event-mode. (line 6) * event-pick: event-pick. (line 6) * evert: evert. (line 6) * exit: exit. (line 6) * ezoom: ezoom. (line 6) * freeze: freeze. (line 6) * geometry: geometry. (line 6) * geomview-version: geomview-version. (line 6) * hdefine: hdefine. (line 6) * hdelete: hdelete. (line 6) * help: help. (line 6) * hmodel: hmodel. (line 6) * hsphere-draw: hsphere-draw. (line 6) * if: if. (line 6) * inhibit-warning: inhibit-warning. (line 6) * input-translator: input-translator. (line 6) * interest: interest. (line 6) * lambda: lambda. (line 6) * let: let. (line 6) * lines-closer: lines-closer. (line 6) * load: load. (line 6) * load-path: load-path. (line 6) * look: look. (line 6) * look-encompass: look-encompass. (line 6) * look-encompass-size: look-encompass-size. (line 6) * look-recenter: look-recenter. (line 6) * look-toward: look-toward. (line 6) * merge: merge. (line 6) * merge-ap: merge-ap. (line 6) * merge-base-ap: merge-base-ap. (line 6) * merge-baseap: merge-baseap. (line 6) * mod: mod. (line 6) * morehelp: morehelp. (line 6) * name-object: name-object. (line 6) * ND-axes: ND-axes. (line 6) * ND-color: ND-color. (line 6) * ND-xform: ND-xform. (line 6) * ND-xform-get: ND-xform-get. (line 6) * ND-xform-set: ND-xform-set. (line 6) * new-alien: new-alien. (line 6) * new-camera: new-camera. (line 6) * new-center: new-center. (line 6) * new-geometry: new-geometry. (line 6) * new-reset: new-reset. (line 6) * NeXT: NeXT. (line 6) * normalization: normalization. (line 6) * not: not. (line 6) * or: or. (line 6) * pick: pick. (line 6) * pick-invisible: pick-invisible. (line 6) * pickable: pickable. (line 6) * position: position. (line 6) * position-at: position-at. (line 6) * position-toward: position-toward. (line 6) * process-events: process-events. (line 6) * progn: progn. (line 6) * quit: quit. (line 6) * quote: quote. (line 6) * rawevent: rawevent. (line 6) * rawpick: rawpick. (line 6) * read: read. (line 6) * real-id: real-id. (line 6) * redraw: redraw. (line 6) * regtable: regtable. (line 6) * rehash-emodule-path: rehash-emodule-path. (line 6) * replace-geometry: replace-geometry. (line 6) * rib-display: rib-display. (line 6) * rib-snapshot: rib-snapshot. (line 6) * scale: scale. (line 6) * scene: scene. (line 6) * set-clock: set-clock. (line 6) * set-conformal-refine: set-conformal-refine. (line 6) * set-emodule-path: set-emodule-path. (line 6) * set-load-path: set-load-path. (line 6) * set-motionscale: set-motionscale. (line 6) * setenv: setenv. (line 6) * setq: setq. (line 6) * sgi: sgi. (line 6) * shell, ! <1>: shell. (line 6) * shell, !: shell-shortcut. (line 6) * sleep-for: sleep-for. (line 6) * sleep-until: sleep-until. (line 6) * snapshot: snapshot. (line 6) * soft-shader: soft-shader. (line 6) * space: space. (line 6) * stereowin: stereowin. (line 6) * time-interests: time-interests. (line 6) * transform: transform. (line 6) * transform-incr: transform-incr. (line 6) * transform-set: transform-set. (line 6) * truncate: truncate. (line 6) * ui-cam-focus: ui-cam-focus. (line 6) * ui-center: ui-center. (line 6) * ui-center-origin: ui-center-origin. (line 6) * ui-emotion-program: ui-emotion-program. (line 6) * ui-emotion-run: ui-emotion-run. (line 6) * ui-freeze: ui-freeze. (line 6) * ui-html-browser: ui-html-browser. (line 6) * ui-motion: ui-motion. (line 6) * ui-panel: ui-panel. (line 6) * ui-pdf-viewer: ui-pdf-viewer. (line 6) * ui-target: ui-target. (line 6) * uninterest: uninterest. (line 6) * update: update. (line 6) * update-draw: update-draw. (line 6) * while: while. (line 6) * window: window. (line 6) * winenter: winenter. (line 6) * write: write. (line 6) * write-comments: write-comments. (line 6) * write-handle: write-handle. (line 6) * write-sexpr: write-sexpr. (line 6) * xform: xform. (line 6) * xform-incr: xform-incr. (line 6) * xform-set: xform-set. (line 6) * zoom: zoom. (line 6) * |, emodule-run <1>: emodule-run. (line 6) * |, emodule-run: emodule-run-shortcut. (line 6)  File: geomview-pt_BR, Node: Lista de Figuras, Prev: Indice de Funcoes, Up: Top Lista de Figuras **************** * Menu: * Figura 2.1: Tela Inicial do ...: figinitial. * Figura 2.2: Olhando para o ...: figlookatworld. * Figura 2.3: A Painel Apare^ncia.: figappearance. * Figura 2.4: Painel de Escolha ...: figcolorchooser. * Figura 2.5: O Painel de Arquivos.: figfilespanel. * Figura 2.6: Trevo e Dodecaedro.: figtrefdodec. * Figura 3.1: O Painel Principal: figmainpanel. * Figura 3.2: O Painel de Arquivos.: figmyfilelist. * Figura 3.3: O Painel de Chamar ...: figloadpanel. * Figura 3.4: O Painel de ...: figtools. * Figura 3.5: O Painel de ...: figap. * Figura 3.6: Painel de Escolha ...: figcolorchooserpanel. * Figura 3.7: O Painel de ...: figmatpanel. * Figura 3.8: O Painel de Ca^mera.: figcamerapanel. * Figura 3.9: O Painel Gravar.: figsavepanel. * Figura 3.10: O Painel de ...: figcommandpanel.

Next: , Previous: (dir), Up: (dir)